diff --git a/.didntcomefromthenpmregistry b/.didntcomefromthenpmregistry deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/.github/issue_template.md b/.github/issue_template.md new file mode 100644 index 0000000000..60318f794c --- /dev/null +++ b/.github/issue_template.md @@ -0,0 +1,13 @@ +## System information + - node version: + - npm or yarn version: + - OS/version/architecture: + - Applicable nodegit version: + +``` +node -v +npm -v # (or yarn -v) +node -e "console.log(process.platform)" +node -e "console.log(require('os').release())" +node -e "console.log(process.arch)" +``` diff --git a/.github/workflows/build-openssl-packages.yml b/.github/workflows/build-openssl-packages.yml new file mode 100644 index 0000000000..7b7a5dea3e --- /dev/null +++ b/.github/workflows/build-openssl-packages.yml @@ -0,0 +1,48 @@ +name: Build and Publish OpenSSL Packages + +on: + workflow_dispatch: + +jobs: + build-openssl: + name: Build OpenSSL package for (${{ matrix.os }} ${{ matrix.arch }}) + runs-on: ${{ matrix.os }} + strategy: + matrix: + include: + - os: windows-latest + arch: arm64 + - os: windows-latest + arch: x64 + - os: macos-15 + arch: arm64 + - os: macos-15-intel + arch: x64 + fail-fast: false + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: 22 + + - name: Install dependencies + run: npm install + + - name: Build OpenSSL packages + env: + npm_config_arch: ${{ matrix.arch }} + NODEGIT_OPENSSL_BUILD_PACKAGE: 1 + OPENSSL_MACOS_DEPLOYMENT_TARGET: "11.0" + run: node utils/acquireOpenSSL.mjs + + - name: Push OpenSSL package to S3 + env: + npm_config_arch: ${{ matrix.arch }} + node_pre_gyp_bucket: ${{ secrets.node_pre_gyp_bucket }} + AWS_ACCESS_KEY_ID: ${{ secrets.node_pre_gyp_accessKeyId }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.node_pre_gyp_secretAccessKey }} + run: node utils/uploadOpenSSL.mjs diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml new file mode 100644 index 0000000000..3cd6aae10c --- /dev/null +++ b/.github/workflows/tests.yml @@ -0,0 +1,196 @@ +on: + push: + branches: + - master + - backport/* + tags: + - v*.*.* + pull_request: + +name: Testing + +jobs: + linux-tests: + name: "Linux Tests" + strategy: + matrix: + node: [20, 22, 24] + fail-fast: false + runs-on: ubuntu-22.04 + steps: + - name: Install Dependencies for Ubuntu + run: sudo apt-get update && sudo apt-get install -y software-properties-common git build-essential clang libssl-dev libkrb5-dev libc++-dev wget zlib1g-dev + + - uses: actions/checkout@v4 + + - name: Setup Environment + run: | + set -e + mkdir ~/.ssh_tests + chmod 700 ~/.ssh_tests + printf "%b" "Host *\n\tStrictHostKeyChecking no\n" > ~/.ssh_tests/config + cat test/id_rsa.pub > ~/.ssh_tests/id_rsa.pub + cat test/id_rsa.enc | base64 -d > ~/.ssh_tests/id_rsa + chmod 600 ~/.ssh_tests/id_rsa* + git config --global user.name "John Doe" + git config --global user.email johndoe@example.com + + - uses: actions/setup-python@v5 + with: + python-version: "3.11" + + - name: Use Node.js + uses: actions/setup-node@v4 + with: + node-version: ${{ matrix.node }} + check-latest: true + + - name: Install + run: npm install + + - name: Test + run: | + set -e + eval `ssh-agent -s` + ssh-add ~/.ssh_tests/id_rsa + node utils/retry npm test + + - name: Deploy + if: startsWith(github.ref, 'refs/tags/v') + env: + node_pre_gyp_bucket: ${{ secrets.node_pre_gyp_bucket }} + AWS_ACCESS_KEY_ID: ${{ secrets.node_pre_gyp_accessKeyId }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.node_pre_gyp_secretAccessKey }} + run: | + npm install -g @mapbox/node-pre-gyp aws-sdk + node lifecycleScripts/clean + node-pre-gyp package + node-pre-gyp publish + + macos-tests: + name: "macOS Tests" + strategy: + matrix: + node: [20, 22, 24] + arch: [x64, arm64] + fail-fast: false + runs-on: ${{ matrix.arch == 'x64' && 'macos-15-intel' || 'macos-15' }} + steps: + - uses: actions/checkout@v4 + + - name: Setup Environment + run: | + mkdir ~/.ssh_tests + chmod 700 ~/.ssh_tests + printf "%b" "Host *\n\tStrictHostKeyChecking no\n" > ~/.ssh_tests/config + cat test/id_rsa.pub > ~/.ssh_tests/id_rsa.pub + cat test/id_rsa.enc | base64 -d > ~/.ssh_tests/id_rsa + chmod 600 ~/.ssh_tests/id_rsa* + git config --global user.name "John Doe" + git config --global user.email johndoe@example.com + + - name: Use Node.js + uses: actions/setup-node@v4 + with: + node-version: ${{ matrix.node }} + check-latest: true + + - name: Install + run: npm install + + - name: Test + run: | + set -e + eval `ssh-agent -s` + ssh-add ~/.ssh_tests/id_rsa + node utils/retry npm test + + - name: Deploy + if: startsWith(github.ref, 'refs/tags/v') + env: + node_pre_gyp_bucket: ${{ secrets.node_pre_gyp_bucket }} + AWS_ACCESS_KEY_ID: ${{ secrets.node_pre_gyp_accessKeyId }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.node_pre_gyp_secretAccessKey }} + run: | + npm install -g @mapbox/node-pre-gyp aws-sdk + node lifecycleScripts/clean + node-pre-gyp package + node-pre-gyp publish + + windows-tests: + name: Windows Tests + strategy: + matrix: + node: [20, 22, 24] + arch: [x86, x64, arm64] + exclude: + - node: 24 + arch: x86 + fail-fast: false + runs-on: windows-2022 + steps: + - name: Setup Environment + run: | + git config --file C:\ProgramData\Git\config core.autocrlf input + git config --system core.autocrlf input + git config --global core.autocrlf input + git config --global user.name "John Doe" + git config --global user.email johndoe@example.com + + - uses: actions/checkout@v4 + + - name: Use Node.js + if: matrix.arch == 'x86' + uses: actions/setup-node@v4 + with: + node-version: ${{ matrix.node }} + check-latest: true + architecture: x86 + + - name: Use Node.js + uses: actions/setup-node@v4 + if: matrix.arch != 'x86' + with: + node-version: ${{ matrix.node }} + check-latest: true + + - name: Install + env: + npm_config_arch: ${{ matrix.arch == 'x86' && 'ia32' || matrix.arch }} + run: npm install + + - name: Test + # need arm64 runners or an emulator to run tests + if: matrix.arch != 'arm64' + env: + GIT_SSH: ${{ github.workspace }}\vendor\plink.exe + run: | + $encodedKey = Get-Content -Path test\private.ppk.enc + $finalPath = Join-Path -Path $HOME -ChildPath .ssh_tests\private.ppk + mkdir ~\.ssh_tests + Set-Content -Value $([System.Convert]::FromBase64String($encodedKey)) -Path $finalPath -AsByteStream + powershell -command "Start-Process .\vendor\pageant\pageant_${{ matrix.arch }}.exe $finalPath" + node utils/retry npm test + + # You're probably wondering why this isn't a single `run: |` step, it certainly is for *nix, + # but it's not, because the CI runner for windows doesn't wait for each step as listed here + # and it treats each additional step past the first as an orphaned process. + - name: Deploy (Dependencies) + if: startsWith(github.ref, 'refs/tags/v') + run: npm install -g @mapbox/node-pre-gyp aws-sdk + + - name: Deploy (Clean) + if: startsWith(github.ref, 'refs/tags/v') + run: node lifecycleScripts\clean + + - name: Deploy (Package) + if: startsWith(github.ref, 'refs/tags/v') + run: node-pre-gyp package --target_arch=${{ matrix.arch }} + + - name: Deploy (Publish) + if: startsWith(github.ref, 'refs/tags/v') + env: + node_pre_gyp_bucket: ${{ secrets.node_pre_gyp_bucket }} + AWS_ACCESS_KEY_ID: ${{ secrets.node_pre_gyp_accessKeyId }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.node_pre_gyp_secretAccessKey }} + run: node-pre-gyp publish --target_arch=${{ matrix.arch }} diff --git a/.gitignore b/.gitignore index d9574b64a7..7d1f15f049 100644 --- a/.gitignore +++ b/.gitignore @@ -1,20 +1,14 @@ -/node_modules/ /build/ -/test/coverage/ -/test/repos/ -/test/test/ -/src/ +/coverage/ /include/ /lib/enums.js /lib/nodegit.js -/coverage/ - - -/vendor/Release -/vendor/Debug -/vendor/*.vcxproj -/vendor/*.filters -/vendor/*.sln +/node_modules/ +/src/ +/test/coverage/ +/test/home/ +/test/repos/ +/test/test/ /generate/output /generate/**/*.json @@ -23,7 +17,35 @@ /generate/missing-tests.json /binding.gyp +# Generated vendor files +/vendor/openssl/ +/vendor/libssh2/Makefile +/vendor/libssh2/config.status +/vendor/libssh2/docs/Makefile +/vendor/libssh2/example/.deps/ +/vendor/libssh2/example/Makefile +/vendor/libssh2/example/libssh2_config.h +/vendor/libssh2/example/stamp-h2 +/vendor/libssh2/libssh2.pc +/vendor/libssh2/libtool +/vendor/libssh2/src/.deps/ +/vendor/libssh2/src/Makefile +/vendor/libssh2/src/libssh2_config.h +/vendor/libssh2/src/stamp-h1 +/vendor/libssh2/tests/.deps/ +/vendor/libssh2/tests/Makefile +/vendor/libssh2/tests/ossfuzz/.deps +/vendor/libssh2/tests/ossfuzz/Makefile *.log .DS_STORE .idea +.clangd +.nyc_output/ + +.vscode +jsconfig.json + +test/id_rsa +test/nodegit-test-rsa +test/private.ppk diff --git a/.gitmodules b/.gitmodules index ca6a48f0b5..11538c1e2b 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,6 @@ [submodule "vendor/libgit2"] path = vendor/libgit2 - url = git://github.com/libgit2/libgit2.git + url = https://github.com/nodegit/libgit2.git +[submodule "vendor/http_parser"] + path = vendor/http_parser + url = https://github.com/nodejs/http-parser diff --git a/.jshintrc b/.jshintrc index cbfa16d303..437878c8ce 100644 --- a/.jshintrc +++ b/.jshintrc @@ -1,4 +1,5 @@ { + "esversion": 9, "boss": true, "curly": true, "eqnull": true, @@ -15,10 +16,11 @@ "it": true }, "immed": false, - "maxlen": 80, + "maxlen": 120, "node": true, "predef": [ - "-Promise" + "Promise", + "Set" ], "proto": true, "quotmark": "double", diff --git a/.npmignore b/.npmignore index c424b3e555..046bdf56a9 100644 --- a/.npmignore +++ b/.npmignore @@ -1,12 +1,14 @@ +/.travis/ /build/ -/example/ /examples/ +/generate/ +/guides/ +/lib/ /test/ /vendor/Release/ -/generate/output -/generate/**/*.json -!/generate/input/*.json +!/include +!/src .astylerc .editorconfig @@ -15,10 +17,11 @@ .jshintrc .travis.yml appveyor.yml -.didntcomefromthenpmregistry -*.vcxproj +!binding.gyp + *.filters -*.sln *.log *.md +*.sln +*.vcxproj diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 0bbc3aa9ae..0000000000 --- a/.travis.yml +++ /dev/null @@ -1,72 +0,0 @@ -env: - matrix: - - export NODE_VERSION="0.12" - - export NODE_VERSION="iojs-v2.5.0" -matrix: - fast_finish: true -before_install: - - git clone https://github.com/creationix/nvm.git ./.nvm - - source ./.nvm/nvm.sh - - nvm install $NODE_VERSION - - nvm use $NODE_VERSION - - if [ $TRAVIS_OS_NAME == "linux" ]; then - sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test; - sudo apt-get update; - sudo apt-get install gcc-4.9 g++-4.9 lcov; - sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.9 20; - sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.9 20; - sudo update-alternatives --install /usr/bin/gcov gcov /usr/bin/gcov-4.9 20; - sudo update-alternatives --config gcc; - sudo update-alternatives --config g++; - sudo update-alternatives --config gcov; - wget http://downloads.sourceforge.net/ltp/lcov-1.10.tar.gz; - tar xvfz lcov-1.10.tar.gz; - sudo cp -v lcov-1.10/bin/{lcov,genpng,gendesc,genhtml,geninfo} /usr/bin/; - sudo chmod 777 /usr/bin/lcov /usr/bin/genhtml /usr/bin/geninfo /usr/bin/genpng /usg/bin/gendesc; - rm -rf lcov-1.10.tar.gz lcov-1.10; - sudo mv -v `which gcov-4.8` `which gcov`; - export GYP_DEFINES="coverage=1"; - export JOBS=4; - fi - - BUILD_ONLY=true npm install -# This is a random private key used purely for testing. -before_script: - - echo -e "Host *\n\tStrictHostKeyChecking no\n" >> ~/.ssh/config - - echo -e "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDkTcgXnHuqR0gbwegnr9Zxz4hTkjjV/SpgJNPJz7mo/HKNbx0rqjj1P0yGR053R9GSFFim2ut4NK9DPPUkQdyucw+DoLkYRHJmlJ4BNa9NTCD0sl+eSXO2969kZojCYSOgbmkCJx8mdgTwhzdgE/jhBrsY0hPE6pRTlU+H68/zeNdJUAIJf0LLXOm3hpTKLA19VICltl/j9VvBJpgRHdBylXEyL8HokYpjkQQk1ZXj3m7Nlo8yDdg4VcljOJWC+Xh8kxRMfK5x/VRVsYKCQXN5QlzKeqf7USRDUS/7mFoPUBW+d4kwKtGxRsWuIL2yeqzifZUTOgsh9+ZWAWxWffQZ your_email@example.com" > ~/.ssh/id_rsa.pub - - echo -e "-----BEGIN RSA PRIVATE KEY-----\nMIIEpAIBAAKCAQEA5E3IF5x7qkdIG8HoJ6/Wcc+IU5I41f0qYCTTyc+5qPxyjW8d\nK6o49T9MhkdOd0fRkhRYptrreDSvQzz1JEHcrnMPg6C5GERyZpSeATWvTUwg9LJf\nnklztvevZGaIwmEjoG5pAicfJnYE8Ic3YBP44Qa7GNITxOqUU5VPh+vP83jXSVAC\nCX9Cy1zpt4aUyiwNfVSApbZf4/VbwSaYER3QcpVxMi/B6JGKY5EEJNWV495uzZaP\nMg3YOFXJYziVgvl4fJMUTHyucf1UVbGCgkFzeUJcynqn+1EkQ1Ev+5haD1AVvneJ\nMCrRsUbFriC9snqs4n2VEzoLIffmVgFsVn30GQIDAQABAoIBAQDPQm2sQbti0mN8\nD4Uawl8D40v30n8WhUa7EbPTOmlqKAQ2sfDhex9KRbTLEmEBmImA/Eee8o9iCTIy\n8Fv8Fm6pUHt9G6Pti/XvemwW3Q3QNpSUkHqN0FDkgecQVqVBEb6uHo3mDm4RFINX\neOmkp30BjIK9/blEw1D0sFALLOEUPaDdPMwiXtFgqfrFSgpDET3TvQIwZ2LxxTm0\ncNmP3sCSlZHJNkZI4hBEWaaXR+V5/+C1qblDCo5blAWTcX3UzqrwUUJgFi6VnBuh\n7S9Q6+CEIU+4JRyWQNmY8YgZFaAp6IOr/kyfPxTP1+UEVVgcLn3WDYwfG9og0tmz\nfzlruAgBAoGBAPfz73Pey86tNZEanhJhbX8gVjzy2hvyhT0paHg0q/H6c1VWOtUH\nOwZ3Ns2xAZqJhlDqCHnQYSCZDly042U/theP4N8zo1APb4Yg4qdmXF9QE1+2M03r\nkS6138gU/CSCLf8pCYa6pA/GmsaXxloeJGLvT4fzOZRsVav80/92XHRhAoGBAOu2\nmKh4Gr1EjgN9QNbk9cQTSFDtlBEqO/0pTepvL73UvNp/BAn4iYZFU4WnklFVBSWc\nL84Sc732xU12TAbTTUsa6E7W29pS8u7zVTxlIdQIIU5pzDyU1pNNk2kpxzte5p3Y\nPDtniPFsoYLWoH0LpsKL93t2pLAj+IOkE6f3XBq5AoGAIKaYo5N1FxQr952frx/x\nQUpK0N/R5Ng8v18SiLG26rhmM5iVSrQXC7TrHI7wfR8a9tC6qP/NqnM9NuwC/bQ0\nEEo7/GhaWxKNRwZRkmWiSFLNGk9t1hbtGU+N1lUdFtmloPIQdRNiw0kN3JTj474Q\nYI7O1EItFORnK6yxZfR6HEECgYEA1CT7MGUoa8APsMRCXyaiq15Pb8bjxK8mXquW\nHLEFXuzhLCW1FORDoj0y9s/iuKC0iS0ROX8R/J7k5NrbgikbH8WP36UxKkYNr1IC\nHOFImPTYRSKjVsL+fIUNb1DSp3S6SsYbL7v3XJJQqtlQiDq8U8x1aQFXJ9C4EoLR\nzhKrKsECgYBtU/TSF/TATZY5XtrN9O+HX1Fbz70Ci8XgvioheVI2fezOcXPRzDcC\nOYPaCMNKA5E8gHdg4s0TN7uDvKTJ+KhSg2V7gZ39A28dHrJaRX7Nz4k6t2uEBjX9\na1JidpAIbJ+3w7+hj6L299tVZvS+Y/6Dz/uuEQGXfJg/l/5CCvQPsA==\n-----END RSA PRIVATE KEY-----" > ~/.ssh/id_rsa - - chmod 600 ~/.ssh/id_rsa* - - eval `ssh-agent -s` - - ssh-add ~/.ssh/id_rsa - - git config --global user.name "John Doe" - - git config --global user.email johndoe@example.com -git: - depth: 1 -branches: - only: - - master - - /^v\d+\.\d+\.\d+$/ -os: - - linux - - osx -script: - - if [ $TRAVIS_OS_NAME == "linux" ] && [ $NODE_VERSION == "0.12" ]; then - npm test && npm run cov && npm run coveralls; - else - npm test; - fi -after_success: - - if [ -n "$TRAVIS_TAG" ]; then - npm install -g node-pre-gyp - npm install -g aws-sdk - node-pre-gyp package - node-pre-gyp publish - fi -notifications: - slack: - secure: KglNSqZiid9YudCwkPFDh+sZfW5BwFlM70y67E4peHwwlbbV1sSBPHcs74ZHP/lqgEZ4hMv4N2NI58oYFD5/1a+tKIQP1TkdIMuq4j2LXheuirA2HDcydOVrsC8kRx5XFGKdVRg/uyX2dlRHcOWFhxrS6yc6IxtxYWlRTD2SmEc= - webhooks: - urls: - - https://webhooks.gitter.im/e/cbafdb27ad32ba746a73 - on_success: always # options: [always|never|change] default: always - on_failure: always # options: [always|never|change] default: always - on_start: false # default: false diff --git a/.travis/deploy-docs.sh b/.travis/deploy-docs.sh new file mode 100755 index 0000000000..50ee50b2b9 --- /dev/null +++ b/.travis/deploy-docs.sh @@ -0,0 +1,34 @@ +#!/usr/bin/env bash + + +# delete "nodegit.github.com" folder if it exists +rm -rf "nodegit.github.com" || exit 0; + +# clone "nodegit.github.com" repository +git clone "https://github.com/nodegit/nodegit.github.com.git" + +# change into "nodegit.github.com" folder +cd "nodegit.github.com" + +# install node dependencies +npm install + +# link "nodegit" folder +ln -s ../.. generate/nodegit + +# generate new docs +node generate + +# configure git user information +git config user.name "Travis CI" +git config user.email "noreply@travis-ci.org" + +# commit changes +git add . +git commit -m "Deploy to GitHub Pages + +see https://github.com/nodegit/nodegit.github.com/commit/${TRAVIS_COMMIT}" +git tag "${TRAVIS_COMMIT}" + +# push to the "nodegit.github.com" repository +git push --quiet "https://${GH_TOKEN}@github.com/nodegit/nodegit.github.com.git" master "${TRAVIS_COMMIT}" > /dev/null 2>&1 diff --git a/CHANGELOG.md b/CHANGELOG.md index d359e2d36b..d7c020aac7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,3100 @@ # Change Log -## [0.4.1](https://github.com/nodegit/nodegit/tree/0.4.1) (2015-06-02) +## v0.28.0-alpha.36 [(2025-11-21)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.36) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.35...v0.28.0-alpha.36) + +#### Summary of Changes + - Use openssl unconditionally for linux electron builds + - Fix cross-compiling libssh2 + - Fix Windows SSH keys, tests, documentation + - Add CI tests and Prebuilts for MacOS arm64 + - Bump tar-fsa to fix security vulnerabilities + +#### Merged PRs into NodeGit +- [Bump tar-fs from 3.0.9 to 3.1.1](https://github.com/nodegit/nodegit/pull/2034) +- [Use custom electron for non-static builds on linux and fix cross-compilation](https://github.com/nodegit/nodegit/pull/2033) +- [add macos arm64 tests and prebuilts](https://github.com/nodegit/nodegit/pull/2030) + +## v0.28.0-alpha.35 [(2025-11-14)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.35) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.34...v0.28.0-alpha.35) + +#### Summary of Changes + - Bump libgit2 to 1.9.1 + - Bump OpenSSL to 3.0 + - Move OpenSSL Packaging to Github Actions + - Add arm64 build Support + +#### Merged PRs into NodeGit +- [Bump libgit2 to 1.9.1](https://github.com/nodegit/nodegit/pull/2025) +- [Bump OpenSSL to 3.0, Move OpenSSL package generation to Github Actions](https://github.com/nodegit/nodegit/pull/2026) +- [fix: correct macos arch labels](github.com/nodegit/nodegit/pull/2027) +- [Add Ability to compile for arm64](https://github.com/nodegit/nodegit/pull/2028) + +## v0.28.0-alpha.34 [(2025-07-23)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.34) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.33...v0.28.0-alpha.34) + +#### Summary of Changes + - Empty release to fix downstream issues + +#### Merged PRs into NodeGit +- None + +## v0.28.0-alpha.33 [(2025-06-03)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.33) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.32...v0.28.0-alpha.33) + +#### Summary of Changes + - fix non-standard import assertion + - update tar-fs + +#### Merged PRs into NodeGit +- [Fix Invalid Import Assertion, Bump tar-fs](https://github.com/nodegit/nodegit/pull/2022) + +## v0.28.0-alpha.32 [(2025-05-28)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.32) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.31...v0.28.0-alpha.32) + +#### Summary of Changes + - fix windows build on electron + +#### Merged PRs into NodeGit +- [fix electron dependencies again](https://github.com/nodegit/nodegit/pull/2020) + +## v0.28.0-alpha.31 [(2025-05-27)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.31) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.30...v0.28.0-alpha.31) + +#### Summary of Changes +- bump libgit2 from v1.7.2 to v1.8.4 +- update several npm dependencies for deprecations and vulnerabilities + +#### Merged PRs into NodeGit +- [Dependency/Process Updates](https://github.com/nodegit/nodegit/pull/2019) +- [Bump libgit2 to 1.8.4, CI Updates](https://github.com/nodegit/nodegit/pull/2018) + +## v0.28.0-alpha.30 [(2025-02-13)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.30) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.29...v0.28.0-alpha.30) + +#### Summary of Changes +- Fix windows build + +#### Merged PRs into NodeGit +- [define NOMINMAX on windows](https://github.com/nodegit/nodegit/pull/2016) + +## v0.28.0-alpha.29 [(2025-02-11)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.29) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.28...v0.28.0-alpha.29) + +#### Summary of Changes +- Build on Electron 34+ +- fix use-after-free in Repository::statistics() + +#### Merged PRs into NodeGit +- [Bump @axosoft/nan and add ability to compile for c++20](https://github.com/nodegit/nodegit/pull/2012) +- [Fix Github Action workflow](https://github.com/nodegit/nodegit/pull/2014) + + +## v0.28.0-alpha.28 [(2024-07-01)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.28) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.27...v0.28.0-alpha.28) + +#### Summary of changes +- Build on Electron 31+ + +#### Merged PRs into NodeGit +- [Bump nan again for electron 31](https://github.com/nodegit/nodegit/pull/2000) + +## v0.28.0-alpha.27 [(2024-06-06)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.27) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.26...v0.28.0-alpha.27) + +#### Summary of changes +- Build on Electron 29+ + +#### Merged PRs into NodeGit +- [Fix build failure on electron 29+](https://github.com/nodegit/nodegit/pull/1998) + +## v0.28.0-alpha.26 [(2024-04-19)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.26) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.25...v0.28.0-alpha.26) + +#### Summary of changes +- Fix use-after-free in getRemotes + +#### Merged PRs into NodeGit +- [Fix double-free introduced trying to fix other double-free](https://github.com/nodegit/nodegit/pull/1996) + +## v0.28.0-alpha.25 [(2024-04-15)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.25) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.24...v0.28.0-alpha.25) + +#### Summary of changes +- Fix use-after-free in getReferences + +#### Merged PRs into NodeGit +- [Don't free the given repo on error in getReferences and getRemotes](https://github.com/nodegit/nodegit/pull/1995) + +## v0.28.0-alpha.24 [(2024-02-20)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.24) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.23...v0.28.0-alpha.24) + +#### Summary of changes +- Use Collision Detection SHA1 implementation +- Fix win32 Electron build due to incorrect OpenSSL include path + +#### Merged PRs into NodeGit +- [Use builtin SHA1 for libgit compilation](https://github.com/nodegit/nodegit/pull/1992) +- [Ensure OpenSSL root included in win32 Electron builds](https://github.com/nodegit/nodegit/pull/1991) + +## v0.28.0-alpha.23 [(2024-02-14)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.23) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.22...v0.28.0-alpha.23) + +#### Summary of changes +- Bump libgit2 to 1.7.2 + +#### Merged PRs into NodeGit +- [Bump libgit2 to 1.7.2](https://github.com/nodegit/nodegit/pull/1990) + +## v0.28.0-alpha.22 [(2024-02-05)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.22) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.21...v0.28.0-alpha.22) + +#### Summary of changes +- Compatibility with Electron 28 +- NodeGit now requires Node 16+ + +#### Merged PRs into NodeGit +- [Fix electron 28 build failure](https://github.com/nodegit/nodegit/pull/1988) +- [Bump node-gyp to 10.0.1](https://github.com/nodegit/nodegit/pull/1989) + +## v0.28.0-alpha.21 [(2023-02-10)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.21) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.20...v0.28.0-alpha.21) + +#### Summary of changes +- Update OpenSSL to 1.1.1t +- Update got + other packages with security vulnerabilities +- Fix tag.createWithSignature function definition + +#### Merged PRs into NodeGit +- [Bump OpenSSL to 1.1.1t](https://github.com/nodegit/nodegit/pull/1971) +- [Update got + other locked package versions](https://github.com/nodegit/nodegit/pull/1969) +- [Fix tag createWithSignature function](https://github.com/nodegit/nodegit/pull/1945) + +## v0.28.0-alpha.20 [(2022-11-11)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.20) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.19...v0.28.0-alpha.20) + +#### Summary of changes +- Fix electron build issues + +#### Merged PRs into NodeGit +- [Fix electron build issues](https://github.com/nodegit/nodegit/pull/1955) + +## v0.28.0-alpha.19 [(2022-11-08)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.19) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.18...v0.28.0-alpha.19) + +#### Summary of changes +- OpenSSL bump +- OpenSSL binaries will be automatically downloaded when building for Electron on Windows and macOS +- Crash fix on Electron 18+ due to Nan bug +- Partial stash support + +#### Merged PRs into NodeGit +- [Allow overriding C++ standard](https://github.com/nodegit/nodegit/pull/1953) +- [Bump OpenSSL to 1.1.1s](https://github.com/nodegit/nodegit/pull/1952) +- [Fix intermittent crash on Electron 18+](https://github.com/nodegit/nodegit/pull/1951) +- [type is a call](https://github.com/nodegit/nodegit/pull/1942) +- [Fix leak in agent](https://github.com/nodegit/nodegit/pull/1947) +- [Default to using precompiled OpenSSL for Electron](https://github.com/nodegit/nodegit/pull/1949) +- [Partial stash support](https://github.com/nodegit/nodegit/pull/1948) +- [Switch CI to macOS-11](https://github.com/nodegit/nodegit/pull/1950) +- [Preemptively Patch OpenSSL 1.1.1q](https://github.com/nodegit/nodegit/pull/1928) +- [Add getAllFilepaths function in tree object](https://github.com/nodegit/nodegit/pull/1919) + +## v0.28.0-alpha.18 [(2022-05-27)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.18) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.17...v0.28.0-alpha.18) + +#### Summary of changes +- Allow fetching partial patches from diff +- Fix nanosecond comparison typo + +#### Merged PRs into NodeGit +- [Improve Diff.patches to allow an index array](https://github.com/nodegit/nodegit/pull/1916) +- [Bring in GIT_USE_NSEC fix](https://github.com/nodegit/nodegit/pull/1917) + +## v0.28.0-alpha.17 [(2022-05-24)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.17) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.16...v0.28.0-alpha.17) + +#### Summary of changes +- Enable nanosecond precision for file operations + +#### Merged PRs into NodeGit +- [Enable GIT_USE_NSEC](https://github.com/nodegit/nodegit/pull/1912) + +## v0.28.0-alpha.16 [(2022-05-09)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.16) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.15...v0.28.0-alpha.16) + +#### Summary of changes +- Allow disabling specific filters during checkout + +#### Merged PRs into NodeGit +- [Allow disabling specific filters during checkout](https://github.com/nodegit/nodegit/pull/1911) + +## v0.28.0-alpha.15 [(2022-05-05)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.15) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.14...v0.28.0-alpha.15) + +#### Summary of changes +- Expose `GIT_OPT_GET_OWNER_VALIDATION` and `GIT_OPT_SET_OWNER_VALIDATION` + +#### Merged PRs into NodeGit +- [Expose get/set owner validation opts](https://github.com/nodegit/nodegit/pull/1910) + +## v0.28.0-alpha.14 [(2022-05-02)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.14) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.13...v0.28.0-alpha.14) + +#### Summary of changes +- Allow statically linking OpenSSL on Linux +- Update libgit2 to 1.3.1 + +#### Merged PRs into NodeGit +- [Statically compile OpenSSL on linux for electron](https://github.com/nodegit/nodegit/pull/1905) +- [Upgrade libgit2 to 1.3.1](https://github.com/nodegit/nodegit/pull/1894) + +## v0.28.0-alpha.13 [(2022-03-22)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.13) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.12...v0.28.0-alpha.13) + +#### Summary of changes +- Partially fix issue with building for Electron + +#### Merged PRs into NodeGit +- [Fix electron build](https://github.com/nodegit/nodegit/pull/1901) + +## v0.28.0-alpha.12 [(2022-03-18)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.12) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.11...v0.28.0-alpha.12) + +#### Summary of changes +- Updated CI because of GitHub deprecations +- Added workaround for LFS performance regression + +#### Merged PRs into NodeGit +- [Update windows 2016 CI to 2019](https://github.com/nodegit/nodegit/pull/1897) +- [Skip "can clone with git" test, unauthenticated git protocol is no longer supported in Github](https://github.com/nodegit/nodegit/pull/1899) +- [UNSAFE Temporary workaround for LFS checkout performance regression](https://github.com/nodegit/nodegit/pull/1883) +- [Update Github Actions for node 16](https://github.com/nodegit/nodegit/pull/1896) + +## v0.28.0-alpha.11 [(2022-02-08)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.11) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.10...v0.28.0-alpha.11) + +#### Summary of changes +- Updated libssh2 to add RSA SHA2 256/512 SSH key support + +#### Merged PRs into NodeGit +- [RSA SHA2 256/512 key upgrade support RFC 8332 #536 (#626)](https://github.com/nodegit/nodegit/pull/1888) +- [Fix typos in examples](https://github.com/nodegit/nodegit/pull/1884) +- [Don't build shared OpenSSL libs](https://github.com/nodegit/nodegit/pull/1877) + +## v0.28.0-alpha.10 [(2021-11-11)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.10) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.9...v0.28.0-alpha.10) + +#### Summary of changes +- Reworked CI due to GitHub dropping Ubuntu 16.04 support +- When building for Electron on Windows/macOS and prebuilts are unavailable: NodeGit will attempt to build OpenSSL locally by default. This is due to Conan changing their API/provided OpenSSL binaries. There are options for pointing to an installed OpenSSL location or URL for downloading prebuilt binaries, see [Building from source](http://www.nodegit.org/guides/install/from-source/). +- Updated OpenSSL to 1.1.1l +- Updated libssh2 to 1.10.0 +- Added `Repo.prototype.statistics` method for calculating repository statistics +- More progress towards becoming context-aware + +#### Merged PRs into NodeGit +- [Allow download of prebuilt OpenSSL](https://github.com/nodegit/nodegit/pull/1875) +- [Update libssh2 to 1.10.0](https://github.com/nodegit/nodegit/pull/1874) +- [Statistics with same output as "git-sizer -j"](https://github.com/nodegit/nodegit/pull/1846) +- [Fix memory leak on context shutdown](https://github.com/nodegit/nodegit/pull/1856) +- [Build OpenSSL locally for Electron](https://github.com/nodegit/nodegit/pull/1870) +- [Fix a reference error when compiling with VC2019](https://github.com/nodegit/nodegit/pull/1859) +- [Use containers for Linux CI](https://github.com/nodegit/nodegit/pull/1860) + + +## v0.28.0-alpha.9 [(2021-06-04)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.9) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.8...v0.28.0-alpha.9) + +#### Summary of changes +- Fixes an issue where rebase.init and rebase.open were ignoring callbacks in some situations + +#### Merged PRs into NodeGit +- [Shallow clone rebase options before modifying #1845](https://github.com/nodegit/nodegit/pull/1845) + + +## v0.28.0-alpha.8 [(2021-05-10)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.8) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.7...v0.28.0-alpha.8) + +#### Summary of changes +- Fixes another issue where Kerberos proxy authentication causes network failures + +#### Merged PRs into NodeGit +- [Bump libgit2 to include libgit2#5852 #1844](https://github.com/nodegit/nodegit/pull/1844) + +#### Merged PRs into Libgit2 +- [Fix issues with Proxy Authentication after httpclient refactor #5852](https://github.com/libgit2/libgit2/pull/5852) + + +## v0.28.0-alpha.7 [(2021-04-30)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.7) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.6...v0.28.0-alpha.7) + +#### Summary of changes +- Fixes issue with where proxy authentication fails on linux/osx with assertion error. + +#### Merged PRs into NodeGit +- [Bump Libgit2 to fix proxy auth on linux / osx #1841](https://github.com/nodegit/nodegit/pull/1841) + +#### Merged PRs into Libgit2 +- [https://github.com/libgit2/libgit2/pull/5852](https://github.com/libgit2/libgit2/pull/5852) + + +## v0.28.0-alpha.6 [(2021-04-23)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.6) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.5...v0.28.0-alpha.6) + +#### Summary of changes +- Rewrote options normalization such that it is done in C++. Provided deprecated classes for backwards compatibility. These will be removed in a later version of Nodegit. +- Deprecated construction of these objects, in the future, please pass plain objects with just the fields you wish to override to NodeGit, and the library will take care of the rest. + - NodeGit.ApplyOptions + - NodeGit.BlameOptions + - NodeGit.BlobFilterOptions + - NodeGit.CheckoutOptions + - NodeGit.CherrypickOptions + - NodeGit.CloneOptions + - NodeGit.DescribeFormatOptions + - NodeGit.DiffFindOptions + - NodeGit.FetchOptions + - NodeGit.MergeFileInput + - NodeGit.MergeFileOptions + - NodeGit.MergeOptions + - NodeGit.ProxyOptions + - NodeGit.PushOptions + - NodeGit.RebaseOptions + - NodeGit.RemoteCreatOptions + - NodeGit.RepositoryInitOptions + - NodeGit.RevertOptions + - NodeGit.StashApplyOptions + - NodeGit.StatusOptions + - NodeGit.SubmoduleUpdateOptions +- Ensured the following functions have their optional arguments labeled/working as optional: + - NodeGit.Apply + - NodeGit.Checkout.index + - NodeGit.Cherrypick + - NodeGit.Cherrypick.commit + - NodeGit.Merge + - NodeGit.PatchBlobs + - NodeGit.Rebase.open + - NodeGit.Remote.prototype.connect + - NodeGit.Remote.prototype.download + - NodeGit.Remote.prototype.fetch + - NodeGit.Remote.prototype.prune + - NodeGit.Remote.prototype.push + - NodeGit.Remote.prototype.upload + - NodeGit.Stash.apply + - NodeGit.Stash.pop + - NodeGit.Worktree.isPrunable + - NodeGit.Worktree.prune +- Updated the following functions to be async: + - NodeGit.Apply + - NodeGit.Remote.prototype.prune + - NodeGit.Worktree.isPrunable + - NodeGit.Worktree.prune +- Addressed issue where GitWorktreePruneOptions and GitWorktreeAddOptions were impossible to instantiate, thus making working with worktress possible now. +- Addressed issue where GitIndexTime was not configurable +- Addressed issue where the following functions did not return errors from libgit2: + - NodeGit.Merge.analysis + - NodeGit.Note.commitRemove + +#### Merged PRs into NodeGit +- [Eliminate need for normalize options #1837](https://github.com/nodegit/nodegit/pull/1837) +- [Define optional arguments for Patch.fromBlobs() #1835](https://github.com/nodegit/nodegit/pull/1835) + + +## v0.28.0-alpha.5 [(2021-04-09)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.5) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.4...v0.28.0-alpha.5) + +#### Summary of changes +- Fixes crash in multithreaded checkout in fork of libgit2 + +#### Merged PRs into NodeGit +- [Update multithreaded checkout in libgit2 #1834](https://github.com/nodegit/nodegit/pull/1834) + +#### Merged PRs into Libgit2 +- [Default to GIT_BRANCH_DEFAULT if init.defaultBranch is empty string](https://github.com/libgit2/libgit2/pull/5832) +- [Remove duplicate line, in example code](https://github.com/libgit2/libgit2/pull/5821) + + +## v0.28.0-alpha.4 [(2021-04-07)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.4) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.3...v0.28.0-alpha.4) + +#### Summary of changes +- Introduces harder safeguards on persistent references to prevent garbage collection during async work + +#### Merged PRs into NodeGit +- [Workaround: Prevent objectwrap from being cleaned up during async work #1833](https://github.com/nodegit/nodegit/pull/1833) + + +## v0.28.0-alpha.3 [(2021-04-02)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.3) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.2...v0.28.0-alpha.3) + +#### Summary of changes +- Addresses failure to open repo with empty default branch name + +#### Merged PRs into NodeGit +- [Bring in changes from libgit2 #5832 #1832](https://github.com/nodegit/nodegit/pull/1832) + +#### Cherrypicked PRs into Libgit2 +- [Default to GIT_BRANCH_DEFAULT if init.defaultBranch is empty string #5832](https://github.com/libgit2/libgit2/pull/5832) + + +## v0.28.0-alpha.2 [(2021-03-31)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.2) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.1...v0.28.0-alpha.2) + +#### Summary of changes +- Addresses crash in mwindow from libgit2 +- Bumps libgit2 to bring in bug fixes + +#### Merged PRs into NodeGit +- [Bump Libgit2 to 1.1.0 (on current head of libgit2) #1831](https://github.com/nodegit/nodegit/pull/1831) + +#### Merged PRs into Libgit2 +- [tree: deprecate `git_treebuilder_write_with_buffer`](https://github.com/libgit2/libgit2/pull/5815) +- [winhttp: skip certificate check if unable to send request](https://github.com/libgit2/libgit2/pull/5814) +- [commit-graph: Introduce `git_commit_graph_needs_refresh()`](https://github.com/libgit2/libgit2/pull/5764) +- [commit-graph: Support lookups of entries in a commit-graph](https://github.com/libgit2/libgit2/pull/5763) +- [merge: Check insert_head_ids error in create_virtual_base](https://github.com/libgit2/libgit2/pull/5818) +- [Check git_signature_dup failure](https://github.com/libgit2/libgit2/pull/5817) +- [Fix some typos](https://github.com/libgit2/libgit2/pull/5797) +- [include: fix typos in comments](https://github.com/libgit2/libgit2/pull/5805) +- [Fix documentation formating on repository.h](https://github.com/libgit2/libgit2/pull/5806) +- [index: Check git_vector_dup error in write_entries](https://github.com/libgit2/libgit2/pull/5801) +- [refdb_fs: Check git_sortedcache wlock/rlock errors](https://github.com/libgit2/libgit2/pull/5800) +- [Add new bindings for the R language](https://github.com/libgit2/libgit2/pull/5795) +- [Update .gitignore](https://github.com/libgit2/libgit2/pull/5787) +- [patch: add owner accessor](https://github.com/libgit2/libgit2/pull/5731) +- [commit-graph: Introduce a parser for commit-graph files](https://github.com/libgit2/libgit2/pull/5762) +- [revspec: rename git_revparse_mode_t to git_revspec_t](https://github.com/libgit2/libgit2/pull/5786) +- [mwindow: Fix a bug in the LRU window finding code](https://github.com/libgit2/libgit2/pull/5783) +- [ci: don't use ninja on macOS](https://github.com/libgit2/libgit2/pull/5780) +- [midx: Fix a bug in `git_midx_needs_refresh()`](https://github.com/libgit2/libgit2/pull/5768) +- [clone: set refs/remotes/origin/HEAD when branch is specified](https://github.com/libgit2/libgit2/pull/5775) +- [Use `p_pwrite`/`p_pread` consistently throughout the codebase](https://github.com/libgit2/libgit2/pull/5769) +- [README: instructions for using libgit2 without compiling](https://github.com/libgit2/libgit2/pull/5772) +- [Cope with empty default branch](https://github.com/libgit2/libgit2/pull/5770) +- [github-actions: Also rename the main branch here](https://github.com/libgit2/libgit2/pull/5771) +- [blob: fix name of `GIT_BLOB_FILTER_ATTRIBUTES_FROM_HEAD`](https://github.com/libgit2/libgit2/pull/5760) +- [Add documentation for git_blob_filter_options.version](https://github.com/libgit2/libgit2/pull/5759) +- [Build with NO_MMAP](https://github.com/libgit2/libgit2/pull/5583) +- [zlib: Add support for building with Chromium's zlib implementation](https://github.com/libgit2/libgit2/pull/5748) +- [Handle ipv6 addresses](https://github.com/libgit2/libgit2/pull/5741) +- [Add support for additional SSH hostkey types.](https://github.com/libgit2/libgit2/pull/5750) +- [Fix the `-DENABLE_WERROR=ON` build for gcc 10.2](https://github.com/libgit2/libgit2/pull/5749) +- [repository: use intptr_t's in the config map cache](https://github.com/libgit2/libgit2/pull/5746) +- [Add tests for `git__multiply_int64_overflow`](https://github.com/libgit2/libgit2/pull/5744) +- [Third attempt to fix the 32-bit version of `git__multiply_int64_overf…](https://github.com/libgit2/libgit2/pull/5743) +- [Avoid using `__builtin_mul_overflow` with the clang+32-bit combo](https://github.com/libgit2/libgit2/pull/5742) +- [ci: run codeql](https://github.com/libgit2/libgit2/pull/5709) +- [pack: continue zlib while we can make progress](https://github.com/libgit2/libgit2/pull/5740) +- [Re-enable the RC4 test](https://github.com/libgit2/libgit2/pull/4418) +- [Cache the parsed submodule config when diffing](https://github.com/libgit2/libgit2/pull/5727) +- [Make git__strntol64() ~70%* faster](https://github.com/libgit2/libgit2/pull/5735) +- [winhttp: support optional client cert](https://github.com/libgit2/libgit2/pull/5384) +- [git.git-authors: Replacing his/her with their](https://github.com/libgit2/libgit2/pull/5724) +- [Friendlier getting started in the lack of git_libgit2_init](https://github.com/libgit2/libgit2/pull/5578) +- [Thread-local storage: a generic internal library (with no allocations)](https://github.com/libgit2/libgit2/pull/5720) +- [Thread-free implementation](https://github.com/libgit2/libgit2/pull/5719) +- [Make the pack and mwindow implementations data-race-free](https://github.com/libgit2/libgit2/pull/5593) +- [Make the odb race-free](https://github.com/libgit2/libgit2/pull/5595) +- [Also add the raw hostkey to `git_cert_hostkey`](https://github.com/libgit2/libgit2/pull/5704) +- [Fix the `ENABLE_WERROR=ON` build in Groovy Gorilla (gcc 10.2)](https://github.com/libgit2/libgit2/pull/5715) +- [odb: Add git_odb_options](https://github.com/libgit2/libgit2/pull/5447) +- [Introduce GIT_ASSERT macros](https://github.com/libgit2/libgit2/pull/5327) +- [ci: only report main branch in README status](https://github.com/libgit2/libgit2/pull/5708) +- [ci: run coverity in the nightly builds](https://github.com/libgit2/libgit2/pull/5707) +- [ci: more GitHub Actions](https://github.com/libgit2/libgit2/pull/5706) +- [Add a ThreadSanitizer build](https://github.com/libgit2/libgit2/pull/5597) +- [msvc crtdbg -> win32 leakcheck](https://github.com/libgit2/libgit2/pull/5580) +- [Add missing worktree_dir check and test case](https://github.com/libgit2/libgit2/pull/5692) +- [Fix the `-DTHREADSAFE=OFF` build](https://github.com/libgit2/libgit2/pull/5690) +- [ci: propagate environment variables](https://github.com/libgit2/libgit2/pull/5703) +- [ci: supply a token for self-hosted runners](https://github.com/libgit2/libgit2/pull/5702) +- [ci: supply a token for self-hosted runners](https://github.com/libgit2/libgit2/pull/5701) +- [ci: GitHub Actions for arm64](https://github.com/libgit2/libgit2/pull/5700) +- [ci: stop using deprecated set-env in GitHub Actions](https://github.com/libgit2/libgit2/pull/5697) +- [Deprecate `is_valid_name` functions; replace with `name_is_valid` functions](https://github.com/libgit2/libgit2/pull/5659) +- [Include `${MBEDTLS_INCLUDE_DIR}` when compiling `crypt_mbedtls.c`](https://github.com/libgit2/libgit2/pull/5685) +- [threadstate: rename tlsdata when building w/o threads](https://github.com/libgit2/libgit2/pull/5668) +- [Refactor "global" state](https://github.com/libgit2/libgit2/pull/5546) +- [Make the Windows leak detection more robust](https://github.com/libgit2/libgit2/pull/5661) +- [Define `git___load` when building with `-DTHREADSAFE=OFF`](https://github.com/libgit2/libgit2/pull/5664) +- [ntlm: update ntlm dependency for htonll](https://github.com/libgit2/libgit2/pull/5658) +- [libgit2 v1.1.0](https://github.com/libgit2/libgit2/pull/5660) +- [Update PCRE to 8.44](https://github.com/libgit2/libgit2/pull/5649) +- [clone: update origin's HEAD](https://github.com/libgit2/libgit2/pull/5651) +- [Improve the support of atomics](https://github.com/libgit2/libgit2/pull/5594) +- [Fix error return for invalid extensions.](https://github.com/libgit2/libgit2/pull/5656) +- [Change bare free to allocator free (fixes #5653)](https://github.com/libgit2/libgit2/pull/5654) +- [midx: Introduce a parser for multi-pack-index files](https://github.com/libgit2/libgit2/pull/5401) +- [Fixed typo in comment](https://github.com/libgit2/libgit2/pull/5648) +- [Fix binary diff showing /dev/null](https://github.com/libgit2/libgit2/pull/5494) +- [httpclient: only free challenges for current_server type](https://github.com/libgit2/libgit2/pull/5576) +- [Respect `init.defaultBranch` setting](https://github.com/libgit2/libgit2/pull/5581) +- [patch_parse: handle absence of "index" header for new/deleted cases](https://github.com/libgit2/libgit2/pull/5620) +- [boolean config parsing fails in some cases with mapped values](https://github.com/libgit2/libgit2/pull/5626) +- [Fix config file parsing with multi line values containing quoted parts](https://github.com/libgit2/libgit2/pull/5629) +- [Fix release build warnings](https://github.com/libgit2/libgit2/pull/5636) +- [Fix deprecation links inside of documentation not working](https://github.com/libgit2/libgit2/pull/5631) +- [Fix typo: Make ifndef macroname the same as the define name](https://github.com/libgit2/libgit2/pull/5632) +- [diff stats: fix segfaults with new files](https://github.com/libgit2/libgit2/pull/5619) +- [WinHTTP: Try to use TLS1.3](https://github.com/libgit2/libgit2/pull/5633) +- [Fixed includes for FreeBSD](https://github.com/libgit2/libgit2/pull/5628) +- [Don't fail if a HTTP server announces he supports a protocol upgrade](https://github.com/libgit2/libgit2/pull/5624) +- [Return false instead of segfaulting when checking for default port](https://github.com/libgit2/libgit2/pull/5621) +- [deps: ntlmclient: fix htonll for Haiku](https://github.com/libgit2/libgit2/pull/5612) +- [azure: Remove job generating documentation](https://github.com/libgit2/libgit2/pull/5615) +- [Fix crash in git_describe_commit when opts are NULL.](https://github.com/libgit2/libgit2/pull/5617) +- [Fix `git_mwindow_scan_recently_used` spuriously returning true](https://github.com/libgit2/libgit2/pull/5600) +- [zstream: handle Z_BUF_ERROR appropriately in get_output_chunk](https://github.com/libgit2/libgit2/pull/5599) +- [docs: fix typo](https://github.com/libgit2/libgit2/pull/5610) + + +## v0.28.0-alpha.1 [(2021-03-12)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.1) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.27.0...v0.28.0-alpha.1) + +#### Summary of changes +- *Notice* We planned to fix / address Electron 11 compatibility, but ran into some roadblocks. Fix is coming soon, follow [#114](https://github.com/nodegit/nodegit/issues/1774) for details +- Drops support for Node 10.x.y, < 12.19.x, < 14.10.0 +- Brings in LibGit2 1.0.0 +- NodeGit.Config.prototype.setBool handles truthiness, and NodeGit.Config.prototype.getBool returns true or false +- Fix GC ownership memory issue +- Exposes sidebandProgress callback in GitRemoteCallbacks +- Fixes issue with winhttp and optional client certificates +- Addresses proxy issue with certification validation in Windows +- Fix crash in NodeGit.Repository.prototype.refreshReferences +- Deprecations + - NodeGit.Cred is deprecated in favor of NodeGit.Credential + +#### Merged PRs into NodeGit +- [Include libgit2 winhttp proxy fix #1824](https://github.com/nodegit/nodegit/pull/1824) +- [Return/accept boolean for Config#get/setBool #1827](https://github.com/nodegit/nodegit/pull/1827) +- [First stab at #1800 (async/await in examples) #1802](https://github.com/nodegit/nodegit/pull/1802) +- [returns_info: fix ownedByIndices #1823](https://github.com/nodegit/nodegit/pull/1823) +- [Remove block for sideband_progress in remote_callbacks #1801](https://github.com/nodegit/nodegit/pull/1801) +- [Use key to grab credential type #1828](https://github.com/nodegit/nodegit/pull/1828) +- [Don't strdup nullptr from git_tag_message #1822](https://github.com/nodegit/nodegit/pull/1822) +- [Refactor for context-awareness #1795](https://github.com/nodegit/nodegit/pull/1795) +- [Update longpath enums to match libgit2 #1797](https://github.com/nodegit/nodegit/pull/1797) +- [Bump libgit2 to fork of v1.0.0 #1788](https://github.com/nodegit/nodegit/pull/1788) + +#### Merged PRs into Libgit2 +- [winhttp: skip certificate check if unable to send request #5814](https://github.com/libgit2/libgit2/pull/5814) +- [sanitizer ci: skip negotiate tests](https://github.com/libgit2/libgit2/pull/5596) +- [Add CI support for Memory and UndefinedBehavior Sanitizers](https://github.com/libgit2/libgit2/pull/5569) +- [Access HEAD via the refdb backends](https://github.com/libgit2/libgit2/pull/5563) +- [config_entries: Avoid excessive map operations](https://github.com/libgit2/libgit2/pull/5582) +- [mwindow: set limit on number of open files](https://github.com/libgit2/libgit2/pull/5396) +- [refdb: a set of preliminary refactorings for the reftable backend](https://github.com/libgit2/libgit2/pull/5570) +- [CMake modernization pt2](https://github.com/libgit2/libgit2/pull/5547) +- [Make the tests run cleanly under UndefinedBehaviorSanitizer](https://github.com/libgit2/libgit2/pull/5568) +- [Make the tests pass cleanly with MemorySanitizer](https://github.com/libgit2/libgit2/pull/5567) +- [Enable building git2.rc resource script with GCC](https://github.com/libgit2/libgit2/pull/5561) +- [Make NTLMClient Memory and UndefinedBehavior Sanitizer-clean](https://github.com/libgit2/libgit2/pull/5571) +- [Random fixes for diff-printing](https://github.com/libgit2/libgit2/pull/5559) +- [index: Update the documentation for git_index_add_from_buffer()](https://github.com/libgit2/libgit2/pull/5419) +- [Introduce CI with GitHub Actions](https://github.com/libgit2/libgit2/pull/5550) +- [Random code cleanups and fixes](https://github.com/libgit2/libgit2/pull/5552) +- [examples: log: fix documentation generation](https://github.com/libgit2/libgit2/pull/5553) +- [Missing declarations](https://github.com/libgit2/libgit2/pull/5551) +- [clar: add tap output option](https://github.com/libgit2/libgit2/pull/5541) +- [diff::parse: don't include `diff.h`](https://github.com/libgit2/libgit2/pull/5545) +- [release script: fix typo](https://github.com/libgit2/libgit2/pull/5543) +- [tests: offer exact name matching with a `$` suffix](https://github.com/libgit2/libgit2/pull/5537) +- [httpclient: support googlesource](https://github.com/libgit2/libgit2/pull/5536) +- [git_packbuilder_write: Allow setting path to NULL to use the default path](https://github.com/libgit2/libgit2/pull/5532) +- [mempack: Use threads when building the pack](https://github.com/libgit2/libgit2/pull/5531) +- [clar: use internal functions instead of /bin/cp and /bin/rm](https://github.com/libgit2/libgit2/pull/5528) +- [strarray refactoring](https://github.com/libgit2/libgit2/pull/5535) +- [CMake cleanups](https://github.com/libgit2/libgit2/pull/5481) +- [git_pool_init: allow the function to fail](https://github.com/libgit2/libgit2/pull/5526) +- [diff::workdir: actually test the buffers](https://github.com/libgit2/libgit2/pull/5529) +- [Handle unreadable configuration files](https://github.com/libgit2/libgit2/pull/5527) +- [Make git_index_write() generate valid v4 index](https://github.com/libgit2/libgit2/pull/5533) +- [OpenSSL certificate memory leak](https://github.com/libgit2/libgit2/pull/5522) +- [tests: checkout: fix flaky test due to mtime race](https://github.com/libgit2/libgit2/pull/5515) +- [cmake: Sort source files for reproducible builds](https://github.com/libgit2/libgit2/pull/5523) +- [futils: fix order of declared parameters for `git_futils_fake_symlink`](https://github.com/libgit2/libgit2/pull/5517) +- [Check the version in package.json](https://github.com/libgit2/libgit2/pull/5516) +- [tests: merge: fix printf formatter on 32 bit arches](https://github.com/libgit2/libgit2/pull/5513) +- [Update package.json](https://github.com/libgit2/libgit2/pull/5511) +- [Introduce GIT_ASSERT macros](https://github.com/libgit2/libgit2/pull/5509) +- [README.md: Add instructions for building in MinGW environment](https://github.com/libgit2/libgit2/pull/5512) +- [Fix uninitialized stack memory and NULL ptr dereference in stash_to_index](https://github.com/libgit2/libgit2/pull/5510) +- [Honor GIT_CHECKOUT_DISABLE_PATHSPEC_MATCH for all checkout types ](https://github.com/libgit2/libgit2/pull/5378) +- [docs: add documentation for our coding style](https://github.com/libgit2/libgit2/pull/5482) +- [MSVC: Enable Control Flow Guard (CFG)](https://github.com/libgit2/libgit2/pull/5500) +- [git__hexdump: better mimic `hexdump -C`](https://github.com/libgit2/libgit2/pull/5431) +- [Feature: Allow blame to ignore whitespace change](https://github.com/libgit2/libgit2/pull/5383) +- [deps: ntlmclient: use htobe64 on NetBSD too](https://github.com/libgit2/libgit2/pull/5487) +- [sysdir: remove unused git_sysdir_get_str](https://github.com/libgit2/libgit2/pull/5485) +- [Fix typo causing removal of symbol 'git_worktree_prune_init_options'](https://github.com/libgit2/libgit2/pull/5483) +- [pack: Improve error handling for get_delta_base()](https://github.com/libgit2/libgit2/pull/5425) +- [repo::open: ensure we can open the repository](https://github.com/libgit2/libgit2/pull/5480) +- [examples: additions and fixes](https://github.com/libgit2/libgit2/pull/5421) +- [merge: cache negative cache results for similarity metrics](https://github.com/libgit2/libgit2/pull/5477) +- [Handle repository format v1](https://github.com/libgit2/libgit2/pull/5388) +- [CMake: backend selection streamlining](https://github.com/libgit2/libgit2/pull/5440) +- [refdb_fs: remove unused header file](https://github.com/libgit2/libgit2/pull/5461) +- [patch: correctly handle mode changes for renames](https://github.com/libgit2/libgit2/pull/5466) +- [gitignore: clean up patterns from old times](https://github.com/libgit2/libgit2/pull/5474) +- [README.md: update build matrix to reflect our latest releases](https://github.com/libgit2/libgit2/pull/5478) +- [Release v1.0](https://github.com/libgit2/libgit2/pull/5471) +- [refdb_backend: improve callback documentation](https://github.com/libgit2/libgit2/pull/5464) +- [credentials: provide backcompat for opaque structs](https://github.com/libgit2/libgit2/pull/5465) +- [Fix segfault when calling git_blame_buffer()](https://github.com/libgit2/libgit2/pull/5445) +- [Fix spelling error](https://github.com/libgit2/libgit2/pull/5463) +- [refdb_fs: initialize backend version](https://github.com/libgit2/libgit2/pull/5456) +- [repository: improve commondir docs](https://github.com/libgit2/libgit2/pull/5444) +- [cmake: use install directories provided via GNUInstallDirs](https://github.com/libgit2/libgit2/pull/5455) +- [azure: fix errors due to curl and removal of old VM images](https://github.com/libgit2/libgit2/pull/5451) +- [win32: don't canonicalize relative paths](https://github.com/libgit2/libgit2/pull/5435) +- [CMake booleans](https://github.com/libgit2/libgit2/pull/5422) +- [Set proper pkg-config dependency for pcre2](https://github.com/libgit2/libgit2/pull/5439) +- [httpclient: use a 16kb read buffer for macOS](https://github.com/libgit2/libgit2/pull/5432) +- [ci: provide globalsign certs for bionic](https://github.com/libgit2/libgit2/pull/5437) +- [deps: ntlmclient: fix htonll on big endian FreeBSD](https://github.com/libgit2/libgit2/pull/5426) +- [azure-pipelines: download GlobalSign's certificate manually](https://github.com/libgit2/libgit2/pull/5433) +- [deps: ntlmclient: fix missing htonll symbols on FreeBSD and SunOS](https://github.com/libgit2/libgit2/pull/5417) +- [README: add language binding link to wasm-git](https://github.com/libgit2/libgit2/pull/5420) +- [Fix #5410: fix installing libgit2.pc in wrong location](https://github.com/libgit2/libgit2/pull/5412) +- [Fix typo on GIT_USE_NEC](https://github.com/libgit2/libgit2/pull/5413) +- [tests: diff: verify that we are able to diff with empty subtrees](https://github.com/libgit2/libgit2/pull/5374) +- [README: update our build matrix to reflect current releases](https://github.com/libgit2/libgit2/pull/5408) +- [azure: docker: set up HOME variable to fix Coverity builds](https://github.com/libgit2/libgit2/pull/5409) +- [sha1_lookup: inline its only function into "pack.c"](https://github.com/libgit2/libgit2/pull/5390) +- [Coverity fixes](https://github.com/libgit2/libgit2/pull/5391) +- [Release 0.99](https://github.com/libgit2/libgit2/pull/5291) +- [Release script](https://github.com/libgit2/libgit2/pull/5372) +- [azure: fix ARM32 builds by replacing gosu(1)](https://github.com/libgit2/libgit2/pull/5406) +- [openssl: fix Valgrind issues in nightly builds](https://github.com/libgit2/libgit2/pull/5398) +- [fuzzers: Fix the documentation](https://github.com/libgit2/libgit2/pull/5400) +- [azure: fix misleading messages printed to stderr being](https://github.com/libgit2/libgit2/pull/5392) +- [tests: iterator: fix iterator expecting too few items](https://github.com/libgit2/libgit2/pull/5393) +- [transports: http: fix custom headers not being applied](https://github.com/libgit2/libgit2/pull/5387) +- [azure: fix Coverity pipeline](https://github.com/libgit2/libgit2/pull/5382) +- [azure: tests: re-run flaky proxy tests](https://github.com/libgit2/libgit2/pull/5381) +- [fetchhead: strip credentials from remote URL](https://github.com/libgit2/libgit2/pull/5373) +- [azure-pipelines: properly expand negotiate passwords](https://github.com/libgit2/libgit2/pull/5375) +- [cred: change enum to git_credential_t and GIT_CREDENTIAL_*](https://github.com/libgit2/libgit2/pull/5336) +- [Update link to libgit2 Julia language binding](https://github.com/libgit2/libgit2/pull/5371) +- [Return int from non-free functions](https://github.com/libgit2/libgit2/pull/5365) +- [HTTP: Support Apache-based servers with Negotiate](https://github.com/libgit2/libgit2/pull/5286) +- [internal types: change enums from `type_t` to `_t`](https://github.com/libgit2/libgit2/pull/5364) +- [merge: Return non-const git_repository from accessor method](https://github.com/libgit2/libgit2/pull/5358) +- [Do not return free'd git_repository object on error](https://github.com/libgit2/libgit2/pull/5361) +- [refs: refuse to delete HEAD](https://github.com/libgit2/libgit2/pull/5360) +- [index: replace map macros with inline functions](https://github.com/libgit2/libgit2/pull/5351) +- [Make type mismatch errors consistent](https://github.com/libgit2/libgit2/pull/5359) +- [win32: fix relative symlinks pointing into dirs](https://github.com/libgit2/libgit2/pull/5355) +- [ntlm: prevent (spurious) compiler warnings](https://github.com/libgit2/libgit2/pull/5354) +- [Adds support for multiple SSH auth mechanisms being used sequentially](https://github.com/libgit2/libgit2/pull/5305) +- [netops: handle intact query parameters in service_suffix removal](https://github.com/libgit2/libgit2/pull/5339) +- [Refactor packfile code to use zstream abstraction](https://github.com/libgit2/libgit2/pull/5340) +- [Fix git_submodule_sync with relative url](https://github.com/libgit2/libgit2/pull/5322) +- [http: avoid generating double slashes in url](https://github.com/libgit2/libgit2/pull/5325) +- [Correct typo in name of referenced parameter](https://github.com/libgit2/libgit2/pull/5348) +- [patch_parse: fix undefined behaviour due to arithmetic on NULL pointers](https://github.com/libgit2/libgit2/pull/5338) +- [smart_pkt: fix overflow resulting in OOB read/write of one byte](https://github.com/libgit2/libgit2/pull/5337) +- [branch: clarify documentation around branches](https://github.com/libgit2/libgit2/pull/5300) +- [examples: checkout: implement guess heuristic for remote branches](https://github.com/libgit2/libgit2/pull/5283) +- [Minor doc improvements](https://github.com/libgit2/libgit2/pull/5320) +- [attr: Update definition of binary macro](https://github.com/libgit2/libgit2/pull/5333) +- [Security fixes for master](https://github.com/libgit2/libgit2/pull/5331) +- [release.md: note that we do two security releases](https://github.com/libgit2/libgit2/pull/5318) +- [MSVC: Fix warning C4133 on x64: "function": Incompatible types - from "unsigned long *" to "size_t *"](https://github.com/libgit2/libgit2/pull/5317) +- [ci: only push docs from the libgit2/libgit2 repo](https://github.com/libgit2/libgit2/pull/5316) +- [global: convert to fiber-local storage to fix exit races](https://github.com/libgit2/libgit2/pull/5314) +- [Fix copy&paste in git_cherrypick_commit docstring](https://github.com/libgit2/libgit2/pull/5315) +- [patch_parse: fix out-of-bounds reads caused by integer underflow](https://github.com/libgit2/libgit2/pull/5312) +- [tests: fix compiler warning if tracing is disabled](https://github.com/libgit2/libgit2/pull/5311) +- [tests: config: only test parsing huge file with GITTEST_INVASIVE_SPEED](https://github.com/libgit2/libgit2/pull/5313) +- [diff: complete support for git patchid](https://github.com/libgit2/libgit2/pull/5306) +- [Memory optimizations for config entries](https://github.com/libgit2/libgit2/pull/5243) +- [ssh: include sha256 host key hash when supported](https://github.com/libgit2/libgit2/pull/5307) +- [Various examples shape-ups](https://github.com/libgit2/libgit2/pull/5272) +- [Improve trace support in tests](https://github.com/libgit2/libgit2/pull/5309) +- [Move `git_off_t` to `git_object_size_t`](https://github.com/libgit2/libgit2/pull/5123) +- [Add compat typdef for git_attr_t](https://github.com/libgit2/libgit2/pull/5310) +- [CI Build Updates](https://github.com/libgit2/libgit2/pull/5308) +- [patch_parse: use paths from "---"/"+++" lines for binary patches](https://github.com/libgit2/libgit2/pull/5303) +- [Follow 308 redirect in WinHTTP transport](https://github.com/libgit2/libgit2/pull/5285) +- [fileops: correct error return on p_lstat failures when mkdir](https://github.com/libgit2/libgit2/pull/5302) +- [config_mem: implement support for snapshots](https://github.com/libgit2/libgit2/pull/5299) +- [patch_parse: fix segfault when header path contains whitespace only](https://github.com/libgit2/libgit2/pull/5298) +- [config_file: fix race when creating an iterator](https://github.com/libgit2/libgit2/pull/5282) +- [Fix crash if snapshotting a config_snapshot](https://github.com/libgit2/libgit2/pull/5293) +- [fix a bug introduced in 8a23597b](https://github.com/libgit2/libgit2/pull/5295) +- [reflogs: fix behaviour around reflogs with newlines](https://github.com/libgit2/libgit2/pull/5275) +- [commit: verify objects exist in git_commit_with_signature](https://github.com/libgit2/libgit2/pull/5289) +- [patch_parse: fixes for fuzzing errors](https://github.com/libgit2/libgit2/pull/5276) +- [apply: add GIT_APPLY_CHECK](https://github.com/libgit2/libgit2/pull/5227) +- [refs: unlock unmodified refs on transaction commit](https://github.com/libgit2/libgit2/pull/5264) +- [fuzzers: add a new fuzzer for patch parsing](https://github.com/libgit2/libgit2/pull/5269) +- [patch_parse: handle patches without extended headers](https://github.com/libgit2/libgit2/pull/5273) +- [Provide a wrapper for simple submodule clone steps](https://github.com/libgit2/libgit2/pull/4637) +- [macOS GSS Support](https://github.com/libgit2/libgit2/pull/5238) +- [cmake: correct the link stanza for CoreFoundation](https://github.com/libgit2/libgit2/pull/5265) +- [Fix file locking on POSIX OS](https://github.com/libgit2/libgit2/pull/5257) +- [cmake: update minimum CMake version to v3.5.1](https://github.com/libgit2/libgit2/pull/5260) +- [patch_parse: handle patches with new empty files](https://github.com/libgit2/libgit2/pull/5248) +- [DRY commit parsing](https://github.com/libgit2/libgit2/pull/4445) +- [azure: avoid building and testing in Docker as root](https://github.com/libgit2/libgit2/pull/5239) +- [regexp: implement a new regular expression API](https://github.com/libgit2/libgit2/pull/5226) +- [git_refdb API fixes](https://github.com/libgit2/libgit2/pull/5106) +- [Don't use enum for flags](https://github.com/libgit2/libgit2/pull/5242) +- [valgrind: suppress memory leaks in libssh2_session_handshake](https://github.com/libgit2/libgit2/pull/5240) +- [buffer: fix writes into out-of-memory buffers](https://github.com/libgit2/libgit2/pull/5232) +- [cred: add missing private header in GSSAPI block](https://github.com/libgit2/libgit2/pull/5237) +- [CMake pkg-config modulification](https://github.com/libgit2/libgit2/pull/5206) +- [Update chat resources in README.md](https://github.com/libgit2/libgit2/pull/5229) +- [Circular header splitting](https://github.com/libgit2/libgit2/pull/5223) + +## v0.27.0 [(2020-07-28)](https://github.com/nodegit/nodegit/releases/tag/v0.27.0) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.26.5...v0.27.0) + +#### Summary of changes +- Expose git_remote_rename +- Bump OpenSSL from 1.1.0i -> 1.1.1c in Windows/Mac OS Electron builds +- Replace unmaintained request library with got +- Remove promisify-node and use vanilla promises for all NodeGit promises +- Prebuilds for Node 14, deprecate Node 8 +- Persist RemoteCallbacks and ProxyOptions on the remote if using Remote.prototype.connect. This fixes a segfault when using any routines on a connected remote. + +####Merged PRs into NodeGit +- [Upgrade build environments #1785](https://github.com/nodegit/nodegit/pull/1785) +- [Remote needs to persist the callback/proxyOpts/headers #1784](https://github.com/nodegit/nodegit/pull/1784) +- [Remove promisify-node and remove old callback api remnants](https://github.com/nodegit/nodegit/pull/1772) +- [Replace deprecated package request with got](https://github.com/nodegit/nodegit/pull/1771) +- [Bump OpenSSL prebuilt to 1.1.1c](https://github.com/nodegit/nodegit/pull/1770) +- [Expose git_remote_rename](https://github.com/nodegit/nodegit/pull/1767) +- [Dedupe Remote.prototype.fetch](https://github.com/nodegit/nodegit/pull/1766) + +## v0.27.0-alpha.1 [(2020-03-26)](https://github.com/nodegit/nodegit/releases/tag/v0.27.0-alpha.1) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.26.5...v0.27.0-alpha.1) + +#### Summary of changes +- Expose git_remote_rename +- Bump OpenSSL from 1.1.0i -> 1.1.1c in Windows/Mac OS Electron builds +- Replace unmaintained request library with got +- Remove promisify-node and use vanilla promises for all NodeGit promises + +#### Merged PRs into NodeGit +- [Remove promisify-node and remove old callback api remnants](https://github.com/nodegit/nodegit/pull/1772) +- [Replace deprecated package request with got](https://github.com/nodegit/nodegit/pull/1771) +- [Bump OpenSSL prebuilt to 1.1.1c](https://github.com/nodegit/nodegit/pull/1770) +- [Expose git_remote_rename](https://github.com/nodegit/nodegit/pull/1767) +- [Dedupe Remote.prototype.fetch](https://github.com/nodegit/nodegit/pull/1766) + + +## v0.26.5 [(2020-02-27)](https://github.com/nodegit/nodegit/releases/tag/v0.26.5) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.26.4...v0.26.5) + +#### Summary of changes +- Bring in improvement to client certificate handling on Windows from [winhttp: support optional client cert #5384](https://github.com/libgit2/libgit2/pull/5384) +- `Commit.prototype.parent()` now correctly assigns the repo property on the retrieved commit. This should solve certain bugs when working with a commit retrieved from `parent`. + +#### Merged PRs into NodeGit +- [Bring in Libgit2 #5384 to NodeGit](https://github.com/nodegit/nodegit/pull/1758) +- [Fix behavior of Commit#parent](https://github.com/nodegit/nodegit/pull/1509) +- [Remove DiffList](https://github.com/nodegit/nodegit/pull/1733) +- [Remove unnecessary assignment of Commit#repo](https://github.com/nodegit/nodegit/pull/1508) + +#### Merged PRs into LibGit2 +- [winhttp: support optional client cert #5384](https://github.com/libgit2/libgit2/pull/5384) +- [Support `core.longpaths` on Windows #5347](https://github.com/libgit2/libgit2/pull/5347) +- [Parallelize checkout_create_the_new for perf #4205](https://github.com/libgit2/libgit2/pull/4205) + + +## v0.26.4 [(2020-01-14)](https://github.com/nodegit/nodegit/releases/tag/v0.26.4) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.26.3...v0.26.4) + +#### Summary of changes +- Bumped LibGit2 + - Now can be configured to support longpaths on Windows. Does not respect the config value, but is configured through `NodeGit.Libgit2.opts`. See [#1748](https://github.com/nodegit/nodegit/pull/1748) for details. + - Support for complex SSH auth creds handshakes +- Pulled in patch for Libssh2 that covers an integer overflow, see [Libssh2#402](https://github.com/libssh2/libssh2/pull/402) + +#### Merged PRs into NodeGit +- [Fix some issues from the libgit2 bump](https://github.com/nodegit/nodegit/pull/1751) +- [Add option to support longpaths on Windows](https://github.com/nodegit/nodegit/pull/1748) +- [Bring in libssh2#402](https://github.com/nodegit/nodegit/pull/1749) +- [Wait for copy and remove promises to finish](https://github.com/nodegit/nodegit/pull/1730) + +#### Merged PRs into LibGit2 +- [Support `core.longpaths` on Windows #5347](https://github.com/libgit2/libgit2/pull/5347) +- [Parallelize checkout_create_the_new for perf #4205](https://github.com/libgit2/libgit2/pull/4205) +- [win32: fix relative symlinks pointing into dirs](https://github.com/libgit2/libgit2/pull/5355) +- [ntlm: prevent (spurious) compiler warnings](https://github.com/libgit2/libgit2/pull/5354) +- [Adds support for multiple SSH auth mechanisms being used sequentially](https://github.com/libgit2/libgit2/pull/5305) +- [netops: handle intact query parameters in service_suffix removal](https://github.com/libgit2/libgit2/pull/5339) +- [Refactor packfile code to use zstream abstraction](https://github.com/libgit2/libgit2/pull/5340) +- [Fix git_submodule_sync with relative url](https://github.com/libgit2/libgit2/pull/5322) +- [http: avoid generating double slashes in url](https://github.com/libgit2/libgit2/pull/5325) +- [Correct typo in name of referenced parameter](https://github.com/libgit2/libgit2/pull/5348) +- [patch_parse: fix undefined behaviour due to arithmetic on NULL pointers](https://github.com/libgit2/libgit2/pull/5338) +- [smart_pkt: fix overflow resulting in OOB read/write of one byte](https://github.com/libgit2/libgit2/pull/5337) +- [branch: clarify documentation around branches](https://github.com/libgit2/libgit2/pull/5300) +- [examples: checkout: implement guess heuristic for remote branches](https://github.com/libgit2/libgit2/pull/5283) +- [Minor doc improvements](https://github.com/libgit2/libgit2/pull/5320) +- [attr: Update definition of binary macro](https://github.com/libgit2/libgit2/pull/5333) +- [Security fixes for master](https://github.com/libgit2/libgit2/pull/5331) +- [release.md: note that we do two security releases](https://github.com/libgit2/libgit2/pull/5318) +- [MSVC: Fix warning C4133 on x64: "function": Incompatible types - from "unsigned long *" to "size_t *"](https://github.com/libgit2/libgit2/pull/5317) +- [ci: only push docs from the libgit2/libgit2 repo](https://github.com/libgit2/libgit2/pull/5316) +- [global: convert to fiber-local storage to fix exit races](https://github.com/libgit2/libgit2/pull/5314) +- [Fix copy&paste in git_cherrypick_commit docstring](https://github.com/libgit2/libgit2/pull/5315) +- [patch_parse: fix out-of-bounds reads caused by integer underflow](https://github.com/libgit2/libgit2/pull/5312) +- [tests: fix compiler warning if tracing is disabled](https://github.com/libgit2/libgit2/pull/5311) +- [tests: config: only test parsing huge file with GITTEST_INVASIVE_SPEED](https://github.com/libgit2/libgit2/pull/5313) +- [diff: complete support for git patchid](https://github.com/libgit2/libgit2/pull/5306) +- [Memory optimizations for config entries](https://github.com/libgit2/libgit2/pull/5243) +- [ssh: include sha256 host key hash when supported](https://github.com/libgit2/libgit2/pull/5307) +- [Various examples shape-ups](https://github.com/libgit2/libgit2/pull/5272) +- [Improve trace support in tests](https://github.com/libgit2/libgit2/pull/5309) +- [Move `git_off_t` to `git_object_size_t`](https://github.com/libgit2/libgit2/pull/5123) +- [Add compat typdef for git_attr_t](https://github.com/libgit2/libgit2/pull/5310) +- [CI Build Updates](https://github.com/libgit2/libgit2/pull/5308) +- [patch_parse: use paths from "---"/"+++" lines for binary patches](https://github.com/libgit2/libgit2/pull/5303) +- [Follow 308 redirect in WinHTTP transport](https://github.com/libgit2/libgit2/pull/5285) +- [fileops: correct error return on p_lstat failures when mkdir](https://github.com/libgit2/libgit2/pull/5302) +- [config_mem: implement support for snapshots](https://github.com/libgit2/libgit2/pull/5299) +- [patch_parse: fix segfault when header path contains whitespace only](https://github.com/libgit2/libgit2/pull/5298) +- [config_file: fix race when creating an iterator](https://github.com/libgit2/libgit2/pull/5282) +- [Fix crash if snapshotting a config_snapshot](https://github.com/libgit2/libgit2/pull/5293) +- [fix a bug introduced in 8a23597b](https://github.com/libgit2/libgit2/pull/5295) +- [reflogs: fix behaviour around reflogs with newlines](https://github.com/libgit2/libgit2/pull/5275) +- [commit: verify objects exist in git_commit_with_signature](https://github.com/libgit2/libgit2/pull/5289) +- [patch_parse: fixes for fuzzing errors](https://github.com/libgit2/libgit2/pull/5276) +- [apply: add GIT_APPLY_CHECK](https://github.com/libgit2/libgit2/pull/5227) +- [refs: unlock unmodified refs on transaction commit](https://github.com/libgit2/libgit2/pull/5264) +- [fuzzers: add a new fuzzer for patch parsing](https://github.com/libgit2/libgit2/pull/5269) +- [patch_parse: handle patches without extended headers](https://github.com/libgit2/libgit2/pull/5273) +- [Provide a wrapper for simple submodule clone steps](https://github.com/libgit2/libgit2/pull/4637) +- [macOS GSS Support](https://github.com/libgit2/libgit2/pull/5238) +- [cmake: correct the link stanza for CoreFoundation](https://github.com/libgit2/libgit2/pull/5265) +- [Fix file locking on POSIX OS](https://github.com/libgit2/libgit2/pull/5257) +- [cmake: update minimum CMake version to v3.5.1](https://github.com/libgit2/libgit2/pull/5260) +- [patch_parse: handle patches with new empty files](https://github.com/libgit2/libgit2/pull/5248) +- [DRY commit parsing](https://github.com/libgit2/libgit2/pull/4445) +- [azure: avoid building and testing in Docker as root](https://github.com/libgit2/libgit2/pull/5239) +- [regexp: implement a new regular expression API](https://github.com/libgit2/libgit2/pull/5226) +- [git_refdb API fixes](https://github.com/libgit2/libgit2/pull/5106) +- [Don't use enum for flags](https://github.com/libgit2/libgit2/pull/5242) +- [valgrind: suppress memory leaks in libssh2_session_handshake](https://github.com/libgit2/libgit2/pull/5240) +- [buffer: fix writes into out-of-memory buffers](https://github.com/libgit2/libgit2/pull/5232) +- [cred: add missing private header in GSSAPI block](https://github.com/libgit2/libgit2/pull/5237) +- [CMake pkg-config modulification](https://github.com/libgit2/libgit2/pull/5206) +- [Update chat resources in README.md](https://github.com/libgit2/libgit2/pull/5229) +- [Circular header splitting](https://github.com/libgit2/libgit2/pull/5223) + + +## v0.26.3 [(2019-12-10)](https://github.com/nodegit/nodegit/releases/tag/v0.26.3) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.26.2...v0.26.3) + +#### Summary of changes +- Include LibGit2 security patch: https://github.com/libgit2/libgit2/releases/tag/v0.28.4 + +#### Merged PRs into NodeGit +- [Bring in security patches from libgit2 #1743](https://github.com/nodegit/nodegit/pull/1743) + + +## v0.26.2 [(2019-09-26)](https://github.com/nodegit/nodegit/releases/tag/v0.26.2) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.26.1...v0.26.2) + +#### Summary of changes +- Added options to fetch additional data (gpg signature) from LibGit2 in revWalk.prototype.commitWalk and return plain objects + - _revWalk.prototype.commitWalk(numCommits: number, { returnPlainObjects: boolean })_ + +#### Merged PRs into NodeGit +- [Optionally retrieve more data on commit walk #1728](https://github.com/nodegit/nodegit/pull/1728) + + +## v0.26.1 [(2019-09-16)](https://github.com/nodegit/nodegit/releases/tag/v0.26.1) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.26.0...v0.26.1) + +#### Summary of changes +- Bumped LibGit2 + - Additional git ignore fixes + - Allow credentials callback to return any credential type from list of supported types + - Memory leak and allocation fixes +- updateTips has optional parameters and should convert plain objects into options structs correctly now +- Added Nodegit.Blob.prototype.filter, this should be used instead of NodeGit.Blob.filteredContent as it is not deprecated. + +#### Merged PRs into NodeGit +- [Bump libgit2 to latest fork of master #1723](https://github.com/nodegit/nodegit/pull/1723) +- [updateTips: optional param and normalizeOptions #1722](https://github.com/nodegit/nodegit/pull/1722) + +#### Merged PRs into LibGit2 +- [Parallelize checkout_create_the_new for perf #4205](https://github.com/libgit2/libgit2/pull/4205) +- [azure: build Docker images as part of the pipeline](https://github.com/libgit2/libgit2/pull/5198) +- [smart: use push_glob instead of manual filtering](https://github.com/libgit2/libgit2/pull/5195) +- [ntlm: fix failure to find openssl headers](https://github.com/libgit2/libgit2/pull/5216) +- [cmake: remove extraneous logging](https://github.com/libgit2/libgit2/pull/5222) +- [open:fix memory leak when passing NULL to git_repository_open_ext](https://github.com/libgit2/libgit2/pull/5224) +- [apply: Fix a patch corruption related to EOFNL handling](https://github.com/libgit2/libgit2/pull/5209) +- [ignore: correct handling of nested rules overriding wild card unignore](https://github.com/libgit2/libgit2/pull/5210) +- [Memory allocation fixes for diff generator](https://github.com/libgit2/libgit2/pull/5214) +- [Use an HTTP scheme that supports the given credentials](https://github.com/libgit2/libgit2/pull/5212) +- [apply: git_apply_to_tree fails to apply patches that add new files](https://github.com/libgit2/libgit2/pull/5208) +- [Optionally read `.gitattributes` from HEAD](https://github.com/libgit2/libgit2/pull/5189) +- [config: implement "onbranch" conditional](https://github.com/libgit2/libgit2/pull/5196) +- [Fix include casing for case-sensitive filesystems.](https://github.com/libgit2/libgit2/pull/5213) +- [util: use 64 bit timer on Windows](https://github.com/libgit2/libgit2/pull/5054) +- [Memory allocation audit](https://github.com/libgit2/libgit2/pull/5200) +- [clone: don't decode URL percent encodings](https://github.com/libgit2/libgit2/pull/5187) +- [Security updates from 0.28.3](https://github.com/libgit2/libgit2/pull/5202) + + +## v0.26.0 [(2019-09-09)](https://github.com/nodegit/nodegit/releases/tag/v0.26.0) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.25.1...v0.26.0) + +#### Summary of changes +- Bumped libssh2 to 1.9 for security patch +- Remote.prototype.upload and Remote.prototype.updateTips should be async now + +#### Merged PRs into NodeGit +- [GitRemote upload and updateTips are async #1720](https://github.com/nodegit/nodegit/pull/1720) +- [Update libssh2 to 1.9 #1719](https://github.com/nodegit/nodegit/pull/1719) + + +## v0.25.1 [(2019-08-13)](https://github.com/nodegit/nodegit/releases/tag/v0.25.1) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.25.0...v0.25.1) + +#### Summary of changes +Security patch for LibGit2: +- A carefully constructed commit object with a very large number + of parents may lead to potential out-of-bounds writes or + potential denial of service. + +- The ProgramData configuration file is always read for compatibility + with Git for Windows and Portable Git installations. The ProgramData + location is not necessarily writable only by administrators, so we + now ensure that the configuration file is owned by the administrator + or the current user. + +Additionally: +- Stash should run much faster now. + +#### Merged PRs into LibGit2 +- [Parallelize checkout_create_the_new for perf #4205](https://github.com/libgit2/libgit2/pull/4205) +- [stash: avoid recomputing tree when committing worktree](https://github.com/libgit2/libgit2/pull/5113) +- [Variadic macros](https://github.com/libgit2/libgit2/pull/5121) +- [Add sign capability to git_rebase_commit](https://github.com/libgit2/libgit2/pull/4913) +- [remote: remove unused block of code](https://github.com/libgit2/libgit2/pull/5197) +- [Adjust printf specifiers in examples code](https://github.com/libgit2/libgit2/pull/5146) +- [config: check if we are running in a sandboxed environment](https://github.com/libgit2/libgit2/pull/5191) +- [Fix example checkout to forbid rather than require --](https://github.com/libgit2/libgit2/pull/5184) +- [editorconfig: update to match our coding style](https://github.com/libgit2/libgit2/pull/5183) +- [Compare buffers in diff example](https://github.com/libgit2/libgit2/pull/5125) +- [Include ahead_behind in the test suite](https://github.com/libgit2/libgit2/pull/5135) +- [config: separate file and snapshot backends](https://github.com/libgit2/libgit2/pull/5186) +- [object: deprecate git_object__size for removal](https://github.com/libgit2/libgit2/pull/5192) + + +## v0.25.0 [(2019-08-09)](https://github.com/nodegit/nodegit/releases/tag/v0.25.0) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.24.3...v0.25.0) + +#### Summary of changes +##### BREAKING +- `getRemotes` no longer returns remote names, it now returns remote objects directly. Use `getRemoteNames` to get a list of remote names. +- Converted Buf.prototype.set and Buf.prototype.grow from async to sync +- `Repository.prototype.continueRebase` will now throw on any error except for EAPPLIED on the first call to `Rebase.prototype.next` +- Drops support for Ubuntu 14 after EOL +- Removed access to the `diff_so_far` param in `git_diff_notify_cb` and `git_diff_progress_cb` +- Changed `FilterSource.prototype.repo` to async to prevent segfaults on filters that run during `Submodule.status` +- Changed `NodeGit.Signature.default` to async, because it actually ends up reading the config. +- Fixed bug where templates were not reporting errors for synchronous methods. It's a bit of a wide net, but in general, + it is now possible certain sync methods in NodeGit will begin failing that did not fail before. This is the correct + behavior. + +##### Deprecations +- Support signing commits in `Repository.prototype.mergeBranches`. The last parameter `processMergeMessageCallback` is now deprecated, but will continue to work. Use the options object instead, which will contain the `processMergeMessageCallback`, as well as the `signingCb`. + +##### New +- Support for Node 12 +- Add signing support for commits and annotated tags + - Enforced consistent use of signing callbacks within the application. Any object that implements the signingCallback + pattern for signing commits or tags should use the exact same callback type and with the same meaning. + `type SigningCallback = (content: string) => {| code: number, field?: string, signedData?: string |};` + If the code is `NodeGit.Error.CODE.OK` or 0, the operation will succeed and _at least_ signedData is expected to be filled out. + If the code is a negative number, except for `NodeGit.Error.CODE.PASSTHROUGH`, the signing operation will fail. + If the code is `NodeGit.Error.CODE.PASSTHROUGH`, the operation will continue without signing the object. +- Exposed `AnnotatedCommit` methods: + - `AnnotatedCommit.prototype.ref` +- Exposed `Apply` methods: + - `Apply.apply` applies a diff to the repository + - `Apply.toTree` applies a diff to a tree +- Exposed `Config` methods: + - `Config.prototype.deleteEntry` + - `Config.prototype.deleteMultivar` + - `Config.prototype.getBool` + - `Config.prototype.getInt32` + - `Config.prototype.getInt64` + - `Config.prototype.setMultivar` + - `Config.prototype.snapshot` +- Exposed `ConfigIterator` with methods: + - `ConfigIterator.create` + - `ConfigIterator.createGlob` + - `ConfigIterator.createMultivar` + - `ConfigIterator.prototype.next` +- Exposed `IndexNameEntry`: + - `IndexNameEntry.add` + - `IndexNameEntry.clear` + - `IndexNameEntry.entryCount` + - `IndexNameEntry.getByIndex` + - `IndexNameEntry.prototype.ancestor` + - `IndexNameEntry.prototype.ours` + - `IndexNameEntry.prototype.theirs` +- Exposed `IndexReucEntry`: + - `IndexReucEntry.add` + - `IndexReucEntry.clear` + - `IndexReucEntry.entryCount` + - `IndexReucEntry.find` + - `IndexReucEntry.getByIndex` + - `IndexReucEntry.getByPath` + - `IndexReucEntry.remove` + - `IndexReucEntry.prototype.mode` + - `IndexReucEntry.prototype.oid` + - `IndexReucEntry.prototype.path` +- Exposed `Mailmap`: + - `Mailmap.prototype.addEntry` + - `Mailmap.fromBuffer` + - `Mailmap.fromRepository` + - `Mailmap.create` + - `Mailmap.prototype.resolve` + - `Mailmap.prototype.resolveSignature` +- Exposed `Merge` methods: + - `Merge.analysis` + - `Merge.analysisForRef` +- Exposed `Path.isGitfile` +- Added `RebaseOptions` to `Repository.prototype.rebaseContinue` +- Added `NodeGit.Reference.updateTerminal` +- Exposed `Remote` methods: + - `Remote.createWithOpts` +- Exposed `Tag.createFromBuffer` +- Expose `Tree.prototype.createUpdated(repo, numUpdates, updates)` + +##### Fixed +- Updates lodash dependency to address security notice +- Fixed a prototype problem with cherrypick, merge, and other collections that have a function at their root. call, apply, and bind should now be on NodeGit.Cherrypick. +- Bumped libssh2 to resolve security notice. +- Improve speed and correctness of fileHistoryWalk. The API should not have changed; however, when the end of the walk has been reached, `reachedEndOfHistory` will be specified on the resulting array. +- Fixes openssl prebuilt downloads for electron builds +- Fixes commits retrieved from `Commit.prototype.parent` +- Bump Node-Gyp to 4.0.0 to fix tar security vulnerability +- Optimized a set of routines in NodeGit. These methods as written in Javascript require hundreds or thousands of requests to async workers to retrieve data. We've batched these requests and performed them on a single async worker. There are now native implementations of the following: + - `Repository.prototype.getReferences`: Retrieves all references on async worker. + - `Repository.prototype.getRemotes`: Retrieves all remotes on async worker. + - `Repository.prototype.getSubmodules`: Retrieves all submodules on async worker. + - `Repository.prototype.refreshReferences`: Open sourced function from GitKraken. Grabs a lot of information about references on an async worker. + - `Revwalk.prototype.commitWalk`: Retrieves up to N commits from a revwalk on an async worker. +- When installing on a machine that has yarn and does not have npm, the preinstall script should succeed now +- `ceiling_dirs` is now an optional parameter to `Repository.discover` +- Added support for building on IBM i (PASE) machines +- Fixed leak where struct/option types were leaking libgit2 pointers +- Switched `NodeGit.Oid.fromString`'s internal implementation from `git_oid_fromstr` to `git_oid_fromstrp` +- Fixed builds for Electron 4 +- Updated `Signature.prototype.toString` to optionally include timestamps + +##### LibGit2 Bump +- Fixes gitignore issue with pattern negation +- `Remote.list` now gets the correct list of remotes if remotes are changed by external process +- Always use builtin regex for linux for portability +- Use Iconv on OSX for better internationalization support. +- Removed LibCurl from LibGit2: + - Now with built-in NTLM proxy support + - Now with built-in Negotiate/Kerberos proxy support + - Working with proxy URLs may be different as curl could auto detect scheme for proxies +- Various git config fixes +- Various git ignore fixes +- Various libgit2 performance improvements +- Windows/Linux now use PCRE for regex, OSX uses regcomp_l, this should address collation issues in diffing + +#### Merged PRs into NodeGit +- [Add deprecation warnings for enums that need them. #1711](https://github.com/nodegit/nodegit/pull/1711) +- [https://github.com/nodegit/nodegit/pull/1706](https://github.com/nodegit/nodegit/pull/1706) +- [Reintroduce Odb.prototype.addDiskAlternate #1695](https://github.com/nodegit/nodegit/pull/1695) +- [Fix behaviour of Repository#getReferences #1708](https://github.com/nodegit/nodegit/pull/1708) +- [Bump libgit2 #1705](https://github.com/nodegit/nodegit/pull/1705) +- [Fix Tree#createUpdated #1704](https://github.com/nodegit/nodegit/pull/1704) +- [Fix failing tests on CI #1703](https://github.com/nodegit/nodegit/pull/1703) +- [Audit lodash and fix package-lock.json #1702](https://github.com/nodegit/nodegit/pull/1702) +- [Implement support for Node 12 #1696](https://github.com/nodegit/nodegit/pull/1696) +- [Remove NSEC #1699](https://github.com/nodegit/nodegit/pull/1699) +- [Use builtin regex library for linux for better portability #1693](https://github.com/nodegit/nodegit/pull/1693) +- [Remove pcre-config from binding.gyp #1694](https://github.com/nodegit/nodegit/pull/1694) +- [refresh_references.cc: skip refs that can't be directly resolved #1689](https://github.com/nodegit/nodegit/pull/1689) +- [Bump libgit2 to fork of latest master #1690](https://github.com/nodegit/nodegit/pull/1690) +- [Bump libssh2 to 1.8.2 and fix some npm audit warnings #1678](https://github.com/nodegit/nodegit/pull/1678) +- [Root functions should keep their function prototypes correctly #1681](https://github.com/nodegit/nodegit/pull/1681) +- [refresh_references.cc: bust LibGit2 remote list cache by reading config #1685](https://github.com/nodegit/nodegit/pull/1685) +- [Implement faster file history walk #1676](https://github.com/nodegit/nodegit/pull/1676) +- [EOL for Node 6 and Ubuntu 14.04 #1649](https://github.com/nodegit/nodegit/pull/1649) +- [Ensures that commits from parent(*) has a repository #1658](https://github.com/nodegit/nodegit/pull/1658) +- [Update openssl conan distributions #1663](https://github.com/nodegit/nodegit/pull/1663) +- [Support signing in Repository#mergeBranches #1664](https://github.com/nodegit/nodegit/pull/1664) +- [Dependency upgrade node-gyp upgraded to 4.0.0 #1672](https://github.com/nodegit/nodegit/pull/1672) +- [Add additional getters to streamline information gathering (breaking change) #1671](https://github.com/nodegit/nodegit/pull/1671) +- [Clean up some dangerous memory accesses in callbacks #1642](https://github.com/nodegit/nodegit/pull/1642) +- [Output the item that was deprecated when giving deprecation notice #1643](https://github.com/nodegit/nodegit/pull/1643) +- [Don't fail yarn installs when we can't find npm #1644](https://github.com/nodegit/nodegit/pull/1644) +- [`ceiling_dirs` parameter in `Repository.discover` is optional #1245](https://github.com/nodegit/nodegit/pull/1245) +- [Add missing `shouldAlloc` declarations for git_merge_analysis* functions #1641](https://github.com/nodegit/nodegit/pull/1641) +- [Fix regex state causing subsequent runs of Tag.extractSignature to fail #1630](https://github.com/nodegit/nodegit/pull/1630) +- [Update LibGit2 docs to v0.28.0 #1631](https://github.com/nodegit/nodegit/pull/1631) +- [Add support for building on IBM i (PASE) #1634](https://github.com/nodegit/nodegit/pull/1634) +- [Expose more config methods #1635](https://github.com/nodegit/nodegit/pull/1635) +- [Catch errors and pass them to libgit2 as error codes in rebase signingcb #1636](https://github.com/nodegit/nodegit/pull/1636) +- [Simplify check for IBM i operating system #1637](https://github.com/nodegit/nodegit/pull/1637) +- [Bump LibGit2 to fork of v0.28.1 #1638](https://github.com/nodegit/nodegit/pull/1638) +- [We should clear the persistent cell in structs when they are destroyed #1629](https://github.com/nodegit/nodegit/pull/1629) +- [Fix "errorno" typo #1628](https://github.com/nodegit/nodegit/pull/1628) +- [Bump Libgit2 fork to v0.28.0 #1627](https://github.com/nodegit/nodegit/pull/1627) +- [Fix macOS and Windows Electron 4 builds #1626](https://github.com/nodegit/nodegit/pull/1626) +- [Fix non-existent / dangling refs cause Repository.prototype.createCommitWithSignature to fail #1624](https://github.com/nodegit/nodegit/pull/1624) +- [Handle new gyp information for electron builds #1623](https://github.com/nodegit/nodegit/pull/1623) +- [Use same API for signingCb in all places that can be crypto signed #1621](https://github.com/nodegit/nodegit/pull/1621) +- [Breaking: Repository.prototype.continueRebase enhancements #1619](https://github.com/nodegit/nodegit/pull/1619) +- [adds support for gpg commit signing (fixes #1018) #1448](https://github.com/nodegit/nodegit/pull/1448) +- [Add `updateRef` parameter to Repository#createCommitWithSignature #1610](https://github.com/nodegit/nodegit/pull/1610) +- [Documentation fixes. #1611](https://github.com/nodegit/nodegit/pull/1611) +- [Add Commit#amendWithSignature #1616](https://github.com/nodegit/nodegit/pull/1616) +- [Bump libgit2 to a preview of v0.28 #1615](https://github.com/nodegit/nodegit/pull/1615) +- [Fix issues with Commit#amendWithSignature #1617](https://github.com/nodegit/nodegit/pull/1617) +- [Marked Repository.createBlobFromBuffer as async #1614](https://github.com/nodegit/nodegit/pull/1614) +- [Add functionality for creating Tags with signatures and extracting signatures from Tags #1618](https://github.com/nodegit/nodegit/pull/1618) + +#### Merged PRs into LibGit2 +- [Add sign capability to git_rebase_commit #4913](https://github.com/libgit2/libgit2/pull/4913) +- [Parallelize checkout_create_the_new for perf #4205](https://github.com/libgit2/libgit2/pull/4205) +- [config_file: refresh when creating an iterator](https://github.com/libgit2/libgit2/pull/5181) +- [azure: drop powershell](https://github.com/libgit2/libgit2/pull/5141) +- [fuzzer: use futils instead of fileops](https://github.com/libgit2/libgit2/pull/5180) +- [w32: fix unlinking of directory symlinks](https://github.com/libgit2/libgit2/pull/5151) +- [patch_parse: fix segfault due to line containing static contents](https://github.com/libgit2/libgit2/pull/5179) +- [ignore: fix determining whether a shorter pattern negates another](https://github.com/libgit2/libgit2/pull/5173) +- [patch_parse: handle missing newline indicator in old file](https://github.com/libgit2/libgit2/pull/5159) +- [patch_parse: do not depend on parsed buffer's lifetime](https://github.com/libgit2/libgit2/pull/5158) +- [sha1: fix compilation of WinHTTP backend](https://github.com/libgit2/libgit2/pull/5174) +- [repository: do not initialize HEAD if it's provided by templates](https://github.com/libgit2/libgit2/pull/5176) +- [configuration: cvar -> configmap](https://github.com/libgit2/libgit2/pull/5138) +- [Evict cache items more efficiently](https://github.com/libgit2/libgit2/pull/5172) +- [clar: fix suite count](https://github.com/libgit2/libgit2/pull/5175) +- [Ignore VS2017 specific files and folders](https://github.com/libgit2/libgit2/pull/5163) +- [gitattributes: ignore macros defined in subdirectories](https://github.com/libgit2/libgit2/pull/5156) +- [clar: correctly account for "data" suites when counting](https://github.com/libgit2/libgit2/pull/5168) +- [Allocate memory more efficiently when packing objects](https://github.com/libgit2/libgit2/pull/5170) +- [fileops: fix creation of directory in filesystem root](https://github.com/libgit2/libgit2/pull/5131) +- [win32: fix fuzzers and have CI build them](https://github.com/libgit2/libgit2/pull/5160) +- [Config parser separation](https://github.com/libgit2/libgit2/pull/5134) +- [config_file: implement stat cache to avoid repeated rehashing](https://github.com/libgit2/libgit2/pull/5132) +- [ci: build with ENABLE_WERROR on Windows](https://github.com/libgit2/libgit2/pull/5143) +- [Fix Regression: attr: Correctly load system attr file (on Windows)](https://github.com/libgit2/libgit2/pull/5152) +- [hash: fix missing error return on production builds](https://github.com/libgit2/libgit2/pull/5145) +- [Resolve static check warnings in example code](https://github.com/libgit2/libgit2/pull/5142) +- [Multiple hash algorithms](https://github.com/libgit2/libgit2/pull/4438) +- [More documentation](https://github.com/libgit2/libgit2/pull/5128) +- [Incomplete commondir support](https://github.com/libgit2/libgit2/pull/4967) +- [Remove warnings](https://github.com/libgit2/libgit2/pull/5078) +- [Re-run flaky tests](https://github.com/libgit2/libgit2/pull/5140) +- [errors: use lowercase](https://github.com/libgit2/libgit2/pull/5137) +- [largefile tests: only write 2GB on 32-bit platforms](https://github.com/libgit2/libgit2/pull/5136) +- [Fix broken link in README](https://github.com/libgit2/libgit2/pull/5129) +- [net: remove unused `git_headlist_cb`](https://github.com/libgit2/libgit2/pull/5122) +- [cmake: default NTLM client to off if no HTTPS support](https://github.com/libgit2/libgit2/pull/5124) +- [attr: rename constants and macros for consistency](https://github.com/libgit2/libgit2/pull/5119) +- [Change API instances of `fromnoun` to `from_noun` (with an underscore)](https://github.com/libgit2/libgit2/pull/5117) +- [object: rename git_object__size to git_object_size](https://github.com/libgit2/libgit2/pull/5118) +- [Replace fnmatch with wildmatch](https://github.com/libgit2/libgit2/pull/5110) +- [Documentation fixes](https://github.com/libgit2/libgit2/pull/5111) +- [Removal of `p_fallocate`](https://github.com/libgit2/libgit2/pull/5114) +- [Modularize our TLS & hash detection](https://github.com/libgit2/libgit2/pull/5055) +- [tests: merge::analysis: use test variants to avoid duplicated test suites](https://github.com/libgit2/libgit2/pull/5109) +- [Rename options initialization functions](https://github.com/libgit2/libgit2/pull/5101) +- [deps: ntlmclient: disable implicit fallthrough warnings](https://github.com/libgit2/libgit2/pull/5112) +- [gitignore with escapes](https://github.com/libgit2/libgit2/pull/5097) +- [Handle URLs with a colon after host but no port](https://github.com/libgit2/libgit2/pull/5108) +- [Merge analysis support for bare repos](https://github.com/libgit2/libgit2/pull/5022) +- [Add memleak check docs](https://github.com/libgit2/libgit2/pull/5104) +- [Data-driven tests](https://github.com/libgit2/libgit2/pull/5098) +- [sha1dc: update to fix endianess issues on AIX/HP-UX](https://github.com/libgit2/libgit2/pull/5107) +- [Add NTLM support for HTTP(s) servers and proxies](https://github.com/libgit2/libgit2/pull/5052) +- [Callback type names should be suffixed with `_cb`](https://github.com/libgit2/libgit2/pull/5102) +- [tests: checkout: fix symlink.git being created outside of sandbox](https://github.com/libgit2/libgit2/pull/5099) +- [ignore: handle escaped trailing whitespace](https://github.com/libgit2/libgit2/pull/5095) +- [Ignore: only treat one leading slash as a root identifier](https://github.com/libgit2/libgit2/pull/5074) +- [online tests: use gitlab for auth failures](https://github.com/libgit2/libgit2/pull/5094) +- [Ignore files: don't ignore whitespace](https://github.com/libgit2/libgit2/pull/5076) +- [cache: fix cache eviction using deallocated key](https://github.com/libgit2/libgit2/pull/5088) +- [SECURITY.md: split out security-relevant bits from readme](https://github.com/libgit2/libgit2/pull/5085) +- [Restore NetBSD support](https://github.com/libgit2/libgit2/pull/5086) +- [repository: fix garbage return value](https://github.com/libgit2/libgit2/pull/5084) +- [cmake: disable fallthrough warnings for PCRE](https://github.com/libgit2/libgit2/pull/5083) +- [Configuration parsing: validate section headers with quotes](https://github.com/libgit2/libgit2/pull/5073) +- [Loosen restriction on wildcard "*" refspecs](https://github.com/libgit2/libgit2/pull/5060) +- [Use PCRE for our fallback regex engine when regcomp_l is unavailable](https://github.com/libgit2/libgit2/pull/4935) +- [Remote URL last-chance resolution](https://github.com/libgit2/libgit2/pull/5062) +- [Skip UTF8 BOM in ignore files](https://github.com/libgit2/libgit2/pull/5075) +- [We've already added `ZLIB_LIBRARIES` to `LIBGIT2_LIBS` so don't also add the `z` library](https://github.com/libgit2/libgit2/pull/5080) +- [Define SYMBOLIC_LINK_FLAG_DIRECTORY if required](https://github.com/libgit2/libgit2/pull/5077) +- [Support symlinks for directories in win32](https://github.com/libgit2/libgit2/pull/5065) +- [rebase: orig_head and onto accessors](https://github.com/libgit2/libgit2/pull/5057) +- [cmake: correctly detect if system provides `regcomp`](https://github.com/libgit2/libgit2/pull/5063) +- [Correctly write to missing locked global config](https://github.com/libgit2/libgit2/pull/5023) +- [[RFC] util: introduce GIT_DOWNCAST macro](https://github.com/libgit2/libgit2/pull/4561) +- [examples: implement SSH authentication](https://github.com/libgit2/libgit2/pull/5051) +- [git_repository_init: stop traversing at windows root](https://github.com/libgit2/libgit2/pull/5050) +- [config_file: check result of git_array_alloc](https://github.com/libgit2/libgit2/pull/5053) +- [patch_parse.c: Handle CRLF in parse_header_start](https://github.com/libgit2/libgit2/pull/5027) +- [fix typo](https://github.com/libgit2/libgit2/pull/5045) +- [sha1: don't inline `git_hash_global_init` for win32](https://github.com/libgit2/libgit2/pull/5039) +- [ignore: treat paths with trailing "/" as directories](https://github.com/libgit2/libgit2/pull/5040) +- [Test that largefiles can be read through the tree API](https://github.com/libgit2/libgit2/pull/4874) +- [Tests for symlinked user config](https://github.com/libgit2/libgit2/pull/5034) +- [patch_parse: fix parsing addition/deletion of file with space](https://github.com/libgit2/libgit2/pull/5035) +- [Optimize string comparisons](https://github.com/libgit2/libgit2/pull/5018) +- [Negation of subdir ignore causes other subdirs to be unignored](https://github.com/libgit2/libgit2/pull/5020) +- [xdiff: fix typo](https://github.com/libgit2/libgit2/pull/5024) +- [docs: clarify relation of safe and forced checkout strategy](https://github.com/libgit2/libgit2/pull/5032) +- [Each hash implementation should define `git_hash_global_init`](https://github.com/libgit2/libgit2/pull/5026) +- [[Doc] Update URL to git2-rs](https://github.com/libgit2/libgit2/pull/5012) +- [remote: Rename git_remote_completion_type to _t](https://github.com/libgit2/libgit2/pull/5008) +- [odb: provide a free function for custom backends](https://github.com/libgit2/libgit2/pull/5005) +- [Have git_branch_lookup accept GIT_BRANCH_ALL](https://github.com/libgit2/libgit2/pull/5000) +- [Rename git_transfer_progress to git_indexer_progress](https://github.com/libgit2/libgit2/pull/4997) +- [High-level map APIs](https://github.com/libgit2/libgit2/pull/4901) +- [refdb_fs: fix loose/packed refs lookup racing with repacks](https://github.com/libgit2/libgit2/pull/4984) +- [Allocator restructuring](https://github.com/libgit2/libgit2/pull/4998) +- [cache: fix misnaming of `git_cache_free`](https://github.com/libgit2/libgit2/pull/4992) +- [examples: produce single cgit2 binary](https://github.com/libgit2/libgit2/pull/4956) +- [Remove public 'inttypes.h' header](https://github.com/libgit2/libgit2/pull/4991) +- [Prevent reading out of bounds memory](https://github.com/libgit2/libgit2/pull/4996) +- [Fix a memory leak in odb_otype_fast()](https://github.com/libgit2/libgit2/pull/4987) +- [Make stdalloc__reallocarray call stdalloc__realloc](https://github.com/libgit2/libgit2/pull/4986) +- [Remove `git_time_monotonic`](https://github.com/libgit2/libgit2/pull/4990) +- [Fix a _very_ improbable memory leak in git_odb_new()](https://github.com/libgit2/libgit2/pull/4988) +- [ci: publish documentation on merge](https://github.com/libgit2/libgit2/pull/4989) +- [Enable creation of worktree from bare repo's default branch](https://github.com/libgit2/libgit2/pull/4982) +- [Allow bypassing check for '.keep' file](https://github.com/libgit2/libgit2/pull/4965) +- [Deprecation: export the deprecated functions properly](https://github.com/libgit2/libgit2/pull/4979) +- [ci: skip ssh tests on macOS nightly](https://github.com/libgit2/libgit2/pull/4980) +- [CI build fixups](https://github.com/libgit2/libgit2/pull/4976) +- [v0.28 rc1](https://github.com/libgit2/libgit2/pull/4970) +- [Docs](https://github.com/libgit2/libgit2/pull/4968) +- [Documentation fixes](https://github.com/libgit2/libgit2/pull/4954) +- [ci: add an individual coverity pipeline](https://github.com/libgit2/libgit2/pull/4964) +- [ci: run docurium to create documentation](https://github.com/libgit2/libgit2/pull/4961) +- [ci: return coverity to the nightlies](https://github.com/libgit2/libgit2/pull/4962) +- [Clean up some warnings](https://github.com/libgit2/libgit2/pull/4950) +- [Nightlies: use `latest` docker images](https://github.com/libgit2/libgit2/pull/4869) +- [index: preserve extension parsing errors](https://github.com/libgit2/libgit2/pull/4858) +- [Deprecate functions and constants more gently](https://github.com/libgit2/libgit2/pull/4952) +- [Don't use deprecated constants](https://github.com/libgit2/libgit2/pull/4957) +- [Fix VS warning C4098: 'giterr_set_str' : void function returning a value](https://github.com/libgit2/libgit2/pull/4955) +- [Move `giterr` to `git_error`](https://github.com/libgit2/libgit2/pull/4917) +- [odb: Fix odb foreach to also close on positive error code](https://github.com/libgit2/libgit2/pull/4949) +- [repository: free memory in symlink detection function](https://github.com/libgit2/libgit2/pull/4948) +- [ci: update poxyproxy, run in quiet mode](https://github.com/libgit2/libgit2/pull/4947) +- [Add/multiply with overflow tweaks](https://github.com/libgit2/libgit2/pull/4945) +- [Improve deprecation of old enums](https://github.com/libgit2/libgit2/pull/4944) +- [Move `git_ref_t` to `git_reference_t`](https://github.com/libgit2/libgit2/pull/4939) +- [More `git_obj` to `git_object` updates](https://github.com/libgit2/libgit2/pull/4940) +- [ci: only run invasive tests in nightly](https://github.com/libgit2/libgit2/pull/4943) +- [Always build a cdecl library](https://github.com/libgit2/libgit2/pull/4930) +- [changelog: document changes since 0.27](https://github.com/libgit2/libgit2/pull/4932) +- [Fix a bunch of warnings](https://github.com/libgit2/libgit2/pull/4925) +- [mailmap: prefer ethomson@edwardthomson.com](https://github.com/libgit2/libgit2/pull/4941) +- [Convert tests/resources/push.sh to LF endings](https://github.com/libgit2/libgit2/pull/4937) +- [Get rid of some test files that were accidentally committed](https://github.com/libgit2/libgit2/pull/4936) +- [Fix crash on remote connection when GIT_PROXY_AUTO is set but no proxy is detected](https://github.com/libgit2/libgit2/pull/4934) +- [Make ENABLE_WERROR actually work](https://github.com/libgit2/libgit2/pull/4924) +- [Remove unconditional -Wno-deprecated-declaration on macOS](https://github.com/libgit2/libgit2/pull/4931) +- [Fix warning 'function': incompatible types - from 'git_cvar_value *' to 'int *' (C4133) on VS](https://github.com/libgit2/libgit2/pull/4926) +- [Fix Linux warnings](https://github.com/libgit2/libgit2/pull/4928) +- [Coverity fixes](https://github.com/libgit2/libgit2/pull/4922) +- [Shutdown callback count](https://github.com/libgit2/libgit2/pull/4919) +- [Update CRLF filtering to match modern git](https://github.com/libgit2/libgit2/pull/4904) +- [refdb_fs: refactor error handling in `refdb_reflog_fs__delete`](https://github.com/libgit2/libgit2/pull/4915) +- [Remove empty (sub-)directories when deleting refs](https://github.com/libgit2/libgit2/pull/4833) +- [Support creating annotated commits from annotated tags](https://github.com/libgit2/libgit2/pull/4910) +- [Fix segfault in loose_backend__readstream](https://github.com/libgit2/libgit2/pull/4906) +- [make proxy_stream_close close target stream even on errors](https://github.com/libgit2/libgit2/pull/4905) +- [Index API updates for consistency](https://github.com/libgit2/libgit2/pull/4807) +- [Allow merge analysis against any reference](https://github.com/libgit2/libgit2/pull/4770) +- [revwalk: Allow changing hide_cb](https://github.com/libgit2/libgit2/pull/4888) +- [Unused function warnings](https://github.com/libgit2/libgit2/pull/4895) +- [Add builtin proxy support for the http transport](https://github.com/libgit2/libgit2/pull/4870) +- [config: fix adding files if their parent directory is a file](https://github.com/libgit2/libgit2/pull/4898) +- [Allow certificate and credential callbacks to decline to act](https://github.com/libgit2/libgit2/pull/4879) +- [Fix warning C4133 incompatible types in MSVC](https://github.com/libgit2/libgit2/pull/4896) +- [index: introduce git_index_iterator](https://github.com/libgit2/libgit2/pull/4884) +- [commit: fix out-of-bound reads when parsing truncated author fields](https://github.com/libgit2/libgit2/pull/4894) +- [tests: 🌀 address two null argument instances #4847](https://github.com/libgit2/libgit2/pull/4847) +- [Some OpenSSL issues](https://github.com/libgit2/libgit2/pull/4875) +- [worktree: Expose git_worktree_add_init_options](https://github.com/libgit2/libgit2/pull/4892) +- [transport/http: Include non-default ports in Host header](https://github.com/libgit2/libgit2/pull/4882) +- [Support symlinks on Windows when core.symlinks=true](https://github.com/libgit2/libgit2/pull/4713) +- [strntol: fix out-of-bounds reads when parsing numbers with leading sign](https://github.com/libgit2/libgit2/pull/4886) +- [apply: small fixups in the test suite](https://github.com/libgit2/libgit2/pull/4885) +- [signature: fix out-of-bounds read when parsing timezone offset](https://github.com/libgit2/libgit2/pull/4883) +- [Remote creation API](https://github.com/libgit2/libgit2/pull/4667) +- [Index collision fixes](https://github.com/libgit2/libgit2/pull/4818) +- [Patch (diff) application](https://github.com/libgit2/libgit2/pull/4705) +- [smart transport: only clear url on hard reset (regression)](https://github.com/libgit2/libgit2/pull/4880) +- [Tree parsing fixes](https://github.com/libgit2/libgit2/pull/4871) +- [CI: Fix macOS leak detection](https://github.com/libgit2/libgit2/pull/4860) +- [README: more CI status badges](https://github.com/libgit2/libgit2/pull/4800) +- [ci: Fix some minor issues](https://github.com/libgit2/libgit2/pull/4867) +- [Object parse fixes](https://github.com/libgit2/libgit2/pull/4864) +- [Windows CI: fail build on test failure](https://github.com/libgit2/libgit2/pull/4862) +- [ci: run all the jobs during nightly builds](https://github.com/libgit2/libgit2/pull/4863) +- [strtol removal](https://github.com/libgit2/libgit2/pull/4851) +- [ buf::oom tests: use custom allocator for oom failures](https://github.com/libgit2/libgit2/pull/4854) +- [ci: arm docker builds](https://github.com/libgit2/libgit2/pull/4804) +- [Win32 path canonicalization refactoring](https://github.com/libgit2/libgit2/pull/4852) +- [Check object existence when creating a tree from an index](https://github.com/libgit2/libgit2/pull/4840) +- [Ninja build](https://github.com/libgit2/libgit2/pull/4841) +- [docs: fix transparent/opaque confusion in the conventions file](https://github.com/libgit2/libgit2/pull/4853) +- [Configuration variables can appear on the same line as the section header](https://github.com/libgit2/libgit2/pull/4819) +- [path: export the dotgit-checking functions](https://github.com/libgit2/libgit2/pull/4849) +- [cmake: correct comment from libssh to libssh2](https://github.com/libgit2/libgit2/pull/4850) +- [Object parsing fuzzer](https://github.com/libgit2/libgit2/pull/4845) +- [config: Port config_file_fuzzer to the new in-memory backend.](https://github.com/libgit2/libgit2/pull/4842) +- [Add some more tests for git_futils_rmdir_r and some cleanup](https://github.com/libgit2/libgit2/pull/4828) +- [diff_stats: use git's formatting of renames with common directories](https://github.com/libgit2/libgit2/pull/4830) +- [ignore unsupported http authentication contexts](https://github.com/libgit2/libgit2/pull/4839) +- [submodule: ignore path and url attributes if they look like options](https://github.com/libgit2/libgit2/pull/4837) +- [Smart packet security fixes](https://github.com/libgit2/libgit2/pull/4836) +- [config_file: properly ignore includes without "path" value](https://github.com/libgit2/libgit2/pull/4832) +- [int-conversion](https://github.com/libgit2/libgit2/pull/4831) +- [cmake: enable new quoted argument policy CMP0054](https://github.com/libgit2/libgit2/pull/4829) +- [fix check if blob is uninteresting when inserting tree to packbuilder](https://github.com/libgit2/libgit2/pull/4824) +- [Documentation fixups](https://github.com/libgit2/libgit2/pull/4827) +- [CI: refactoring](https://github.com/libgit2/libgit2/pull/4812) +- [In-memory configuration](https://github.com/libgit2/libgit2/pull/4767) +- [Some warnings](https://github.com/libgit2/libgit2/pull/4784) +- [index: release the snapshot instead of freeing the index](https://github.com/libgit2/libgit2/pull/4803) +- [online::clone: free url and username before resetting](https://github.com/libgit2/libgit2/pull/4816) +- [git_remote_prune to be O(n * logn)](https://github.com/libgit2/libgit2/pull/4794) +- [Rename "VSTS" to "Azure DevOps" and "Azure Pipelines"](https://github.com/libgit2/libgit2/pull/4813) +- [cmake: enable -Wformat and -Wformat-security](https://github.com/libgit2/libgit2/pull/4810) +- [Fix revwalk limiting regression](https://github.com/libgit2/libgit2/pull/4809) +- [path validation: `char` is not signed by default.](https://github.com/libgit2/libgit2/pull/4805) +- [revwalk: refer the sorting modes more to git's options](https://github.com/libgit2/libgit2/pull/4811) +- [Clar XML output redux](https://github.com/libgit2/libgit2/pull/4778) +- [remote: store the connection data in a private struct](https://github.com/libgit2/libgit2/pull/4785) +- [docs: clarify and include licenses of dependencies](https://github.com/libgit2/libgit2/pull/4789) +- [config_file: fix quadratic behaviour when adding config multivars](https://github.com/libgit2/libgit2/pull/4799) +- [config: Fix a leak parsing multi-line config entries](https://github.com/libgit2/libgit2/pull/4792) +- [Prevent heap-buffer-overflow](https://github.com/libgit2/libgit2/pull/4797) +- [ci: remove travis](https://github.com/libgit2/libgit2/pull/4790) +- [Update VSTS YAML files with the latest syntax](https://github.com/libgit2/libgit2/pull/4791) +- [Documentation fixes](https://github.com/libgit2/libgit2/pull/4788) +- [config: convert unbounded recursion into a loop](https://github.com/libgit2/libgit2/pull/4781) +- [Document giterr_last() use only after error. #4772](https://github.com/libgit2/libgit2/pull/4773) +- [util: make the qsort_r check work on macOS](https://github.com/libgit2/libgit2/pull/4765) +- [fuzzer: update for indexer changes](https://github.com/libgit2/libgit2/pull/4782) +- [tree: accept null ids in existing trees when updating](https://github.com/libgit2/libgit2/pull/4727) +- [Pack file verification](https://github.com/libgit2/libgit2/pull/4374) +- [cmake: detect and use libc-provided iconv](https://github.com/libgit2/libgit2/pull/4777) +- [Coverity flavored clang analyzer fixes](https://github.com/libgit2/libgit2/pull/4774) +- [tests: verify adding index conflicts with invalid filemodes fails](https://github.com/libgit2/libgit2/pull/4776) +- [worktree: unlock should return 1 when the worktree isn't locked](https://github.com/libgit2/libgit2/pull/4769) +- [Add a fuzzer for config files](https://github.com/libgit2/libgit2/pull/4752) +- [Fix 'invalid packet line' for ng packets containing errors](https://github.com/libgit2/libgit2/pull/4763) +- [Fix leak in index.c](https://github.com/libgit2/libgit2/pull/4768) +- [threads::diff: use separate git_repository objects](https://github.com/libgit2/libgit2/pull/4754) +- [travis: remove Coverity cron job](https://github.com/libgit2/libgit2/pull/4766) +- [parse: Do not initialize the content in context to NULL](https://github.com/libgit2/libgit2/pull/4749) +- [config_file: Don't crash on options without a section](https://github.com/libgit2/libgit2/pull/4750) +- [ci: Correct the status code check so Coverity doesn't force-fail Travis](https://github.com/libgit2/libgit2/pull/4764) +- [ci: remove appveyor](https://github.com/libgit2/libgit2/pull/4760) +- [diff: fix OOM on AIX when finding similar deltas in empty diff](https://github.com/libgit2/libgit2/pull/4761) +- [travis: do not execute Coverity analysis for all cron jobs](https://github.com/libgit2/libgit2/pull/4755) +- [ci: enable compilation with "-Werror"](https://github.com/libgit2/libgit2/pull/4759) +- [smart_pkt: fix potential OOB-read when processing ng packet](https://github.com/libgit2/libgit2/pull/4758) +- [Fix a double-free in config parsing](https://github.com/libgit2/libgit2/pull/4751) +- [Fuzzers](https://github.com/libgit2/libgit2/pull/4728) +- [ci: run VSTS builds on master and maint branches](https://github.com/libgit2/libgit2/pull/4746) +- [Windows: default credentials / fallback credential handling](https://github.com/libgit2/libgit2/pull/4743) +- [ci: add VSTS build badge to README](https://github.com/libgit2/libgit2/pull/4745) +- [ci: set PKG_CONFIG_PATH for travis](https://github.com/libgit2/libgit2/pull/4744) +- [CI: Refactor and introduce VSTS builds](https://github.com/libgit2/libgit2/pull/4723) +- [revwalk: remove tautologic condition for hiding a commit](https://github.com/libgit2/libgit2/pull/4742) +- [winhttp: retry erroneously failing requests](https://github.com/libgit2/libgit2/pull/4731) +- [Add a configurable limit to the max pack size that will be indexed](https://github.com/libgit2/libgit2/pull/4721) +- [mbedtls: remove unused variable "cacert"](https://github.com/libgit2/libgit2/pull/4739) +- [Squash some leaks](https://github.com/libgit2/libgit2/pull/4732) +- [Add a checkout example](https://github.com/libgit2/libgit2/pull/4692) +- [Assorted Coverity fixes](https://github.com/libgit2/libgit2/pull/4702) +- [Remove GIT_PKT_PACK entirely](https://github.com/libgit2/libgit2/pull/4704) +- [ ignore: improve `git_ignore_path_is_ignored` description Git analogy](https://github.com/libgit2/libgit2/pull/4722) +- [alloc: don't overwrite allocator during init if set](https://github.com/libgit2/libgit2/pull/4724) +- [C90 standard compliance](https://github.com/libgit2/libgit2/pull/4700) +- [Delta OOB access](https://github.com/libgit2/libgit2/pull/4719) +- [Release v0.27.3](https://github.com/libgit2/libgit2/pull/4717) +- [streams: report OpenSSL errors if global init fails](https://github.com/libgit2/libgit2/pull/4710) +- [patch_parse: populate line numbers while parsing diffs](https://github.com/libgit2/libgit2/pull/4687) +- [Fix git_worktree_validate failing on bare repositories](https://github.com/libgit2/libgit2/pull/4686) +- [git_refspec_transform: Handle NULL dst](https://github.com/libgit2/libgit2/pull/4699) +- [Add a "dirty" state to the index when it has unsaved changes](https://github.com/libgit2/libgit2/pull/4536) +- [refspec: rename `git_refspec__free` to `git_refspec__dispose`](https://github.com/libgit2/libgit2/pull/4709) +- [streams: openssl: Handle error in SSL_CTX_new](https://github.com/libgit2/libgit2/pull/4701) +- [refspec: add public parsing api](https://github.com/libgit2/libgit2/pull/4519) +- [Fix interaction between limited flag and sorting over resets](https://github.com/libgit2/libgit2/pull/4688) +- [deps: fix implicit fallthrough warning in http-parser](https://github.com/libgit2/libgit2/pull/4691) +- [Fix assorted leaks found via fuzzing](https://github.com/libgit2/libgit2/pull/4698) +- [Fix type confusion in git_smart__connect](https://github.com/libgit2/libgit2/pull/4695) +- [Verify ref_pkt's are long enough](https://github.com/libgit2/libgit2/pull/4696) +- [Config parser cleanups](https://github.com/libgit2/libgit2/pull/4411) +- [Fix last references to deprecated git_buf_free](https://github.com/libgit2/libgit2/pull/4685) +- [revwalk: avoid walking the entire history when output is unsorted](https://github.com/libgit2/libgit2/pull/4606) +- [Add mailmap support.](https://github.com/libgit2/libgit2/pull/4586) +- [tree: remove unused functions](https://github.com/libgit2/libgit2/pull/4683) +- [Link `mbedTLS` libraries in when `SHA1_BACKEND` == "mbedTLS"](https://github.com/libgit2/libgit2/pull/4678) +- [editorconfig: allow trailing whitespace in markdown](https://github.com/libgit2/libgit2/pull/4676) +- [docs: fix statement about tab width](https://github.com/libgit2/libgit2/pull/4681) +- [diff: fix enum value being out of allowed range](https://github.com/libgit2/libgit2/pull/4680) +- [pack: rename `git_packfile_stream_free`](https://github.com/libgit2/libgit2/pull/4436) +- [Stop leaking the memory](https://github.com/libgit2/libgit2/pull/4677) +- [Bugfix release v0.27.2](https://github.com/libgit2/libgit2/pull/4632) +- [Fix stash save bug with fast path index check](https://github.com/libgit2/libgit2/pull/4668) +- [path: unify `git_path_is_*` APIs](https://github.com/libgit2/libgit2/pull/4662) +- [Fix negative gitignore rules with leading directories ](https://github.com/libgit2/libgit2/pull/4670) +- [Custom memory allocators](https://github.com/libgit2/libgit2/pull/4576) +- [index: Fix alignment issues in write_disk_entry()](https://github.com/libgit2/libgit2/pull/4655) +- [travis: war on leaks](https://github.com/libgit2/libgit2/pull/4558) +- [refdb_fs: fix regression: failure when globbing for non-existant references](https://github.com/libgit2/libgit2/pull/4665) +- [tests: submodule: do not rely on config iteration order](https://github.com/libgit2/libgit2/pull/4673) +- [Detect duplicated submodules for the same path](https://github.com/libgit2/libgit2/pull/4641) +- [Fix docurium missing includes](https://github.com/libgit2/libgit2/pull/4530) +- [github: update issue template](https://github.com/libgit2/libgit2/pull/4627) +- [streams: openssl: add missing check on OPENSSL_LEGACY_API](https://github.com/libgit2/libgit2/pull/4661) +- [mbedtls: don't require mbedtls from our pkgconfig file](https://github.com/libgit2/libgit2/pull/4656) +- [Fixes for CVE 2018-11235](https://github.com/libgit2/libgit2/pull/4660) +- [Backport fixes for CVE 2018-11235](https://github.com/libgit2/libgit2/pull/4659) +- [Added note about Windows junction points to the differences from git document](https://github.com/libgit2/libgit2/pull/4653) +- [cmake: resolve libraries found by pkg-config ](https://github.com/libgit2/libgit2/pull/4642) +- [refdb_fs: enhance performance of globbing](https://github.com/libgit2/libgit2/pull/4629) +- [global: adjust init count under lock](https://github.com/libgit2/libgit2/pull/4645) +- [Fix GCC 8.1 warnings](https://github.com/libgit2/libgit2/pull/4646) +- [Worktrees can be made from bare repositories](https://github.com/libgit2/libgit2/pull/4630) +- [docs: add documentation to state differences from the git cli](https://github.com/libgit2/libgit2/pull/4605) +- [Sanitize the hunk header to ensure it contains UTF-8 valid data](https://github.com/libgit2/libgit2/pull/4542) +- [examples: ls-files: add ls-files to list paths in the index](https://github.com/libgit2/libgit2/pull/4380) +- [OpenSSL legacy API cleanups](https://github.com/libgit2/libgit2/pull/4608) +- [worktree: add functions to get name and path](https://github.com/libgit2/libgit2/pull/4640) +- [Fix deletion of unrelated branch on worktree](https://github.com/libgit2/libgit2/pull/4633) +- [mbedTLS support](https://github.com/libgit2/libgit2/pull/4173) +- [Configuration entry iteration in order](https://github.com/libgit2/libgit2/pull/4525) +- [blame_git: fix coalescing step never being executed](https://github.com/libgit2/libgit2/pull/4580) +- [Fix leaks in master](https://github.com/libgit2/libgit2/pull/4636) +- [Leak fixes for v0.27.1](https://github.com/libgit2/libgit2/pull/4635) +- [worktree: Read worktree specific reflog for HEAD](https://github.com/libgit2/libgit2/pull/4577) +- [fixed stack smashing due to wrong size of struct stat on the stack](https://github.com/libgit2/libgit2/pull/4631) +- [scripts: add backporting script](https://github.com/libgit2/libgit2/pull/4476) +- [worktree: add ability to create worktree with pre-existing branch](https://github.com/libgit2/libgit2/pull/4524) +- [refs: preserve the owning refdb when duping reference](https://github.com/libgit2/libgit2/pull/4618) +- [Submodules-API should report .gitmodules parse errors instead of ignoring them](https://github.com/libgit2/libgit2/pull/4522) +- [Typedef git_pkt_type and clarify recv_pkt return type](https://github.com/libgit2/libgit2/pull/4514) +- [online::clone: validate user:pass in HTTP_PROXY](https://github.com/libgit2/libgit2/pull/4556) +- [ transports: ssh: disconnect session before freeing it ](https://github.com/libgit2/libgit2/pull/4596) +- [revwalk: fix uninteresting revs sometimes not limiting graphwalk](https://github.com/libgit2/libgit2/pull/4622) +- [attr_file: fix handling of directory patterns with trailing spaces](https://github.com/libgit2/libgit2/pull/4614) +- [transports: local: fix assert when fetching into repo with symrefs](https://github.com/libgit2/libgit2/pull/4613) +- [remote/proxy: fix git_transport_certificate_check_db description](https://github.com/libgit2/libgit2/pull/4597) +- [Flag options in describe.h as being optional](https://github.com/libgit2/libgit2/pull/4587) +- [diff: Add missing GIT_DELTA_TYPECHANGE -> 'T' mapping.](https://github.com/libgit2/libgit2/pull/4611) +- [appveyor: fix typo in registry key to disable DHE](https://github.com/libgit2/libgit2/pull/4609) +- [Fix build with LibreSSL 2.7](https://github.com/libgit2/libgit2/pull/4607) +- [appveyor: workaround for intermittent test failures](https://github.com/libgit2/libgit2/pull/4603) +- [sha1dc: update to fix errors with endianess](https://github.com/libgit2/libgit2/pull/4601) +- [submodule: check index for path and prefix before adding submodule](https://github.com/libgit2/libgit2/pull/4378) +- [odb: mempack: fix leaking objects when freeing mempacks](https://github.com/libgit2/libgit2/pull/4602) +- [types: remove unused git_merge_result](https://github.com/libgit2/libgit2/pull/4598) +- [checkout: change default strategy to SAFE](https://github.com/libgit2/libgit2/pull/4531) +- [Add myself to git.git-authors](https://github.com/libgit2/libgit2/pull/4570) + + +## v0.25.0-alpha.16 [(2019-07-23)](https://github.com/nodegit/nodegit/releases/tag/v0.25.0-alpha.16) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.25.0-alpha.15...v0.25.0-alpha.16) + +#### Summary of changes +- Adds support for Node 12 +- Updates lodash dependency to address security notice +- Expose Tree.prototype.createUpdated(repo, numUpdates, updates) +- Bumps libgit2 + - Fixes gitignore issue with pattern negation + - Remote.list now gets the correct list of remotes if remotes are changed by external process + +#### Merged PRs into NodeGit +- [Bump libgit2 #1705](https://github.com/nodegit/nodegit/pull/1705) +- [Fix Tree#createUpdated #1704](https://github.com/nodegit/nodegit/pull/1704) +- [Fix failing tests on CI #1703](https://github.com/nodegit/nodegit/pull/1703) +- [Audit lodash and fix package-lock.json #1702](https://github.com/nodegit/nodegit/pull/1702) +- [Implement support for Node 12 #1696](https://github.com/nodegit/nodegit/pull/1696) + +#### Merged PRs into LibGit2 +- [config_file: refresh when creating an iterator #5181](https://github.com/libgit2/libgit2/pull/5181) +- [azure: drop powershell #5141](https://github.com/libgit2/libgit2/pull/5141) +- [fuzzer: use futils instead of fileops #5180](https://github.com/libgit2/libgit2/pull/5180) +- [w32: fix unlinking of directory symlinks #5151](https://github.com/libgit2/libgit2/pull/5151) +- [patch_parse: fix segfault due to line containing static contents #5179](https://github.com/libgit2/libgit2/pull/5179) +- [ignore: fix determining whether a shorter pattern negates another #5173](https://github.com/libgit2/libgit2/pull/5173) +- [patch_parse: handle missing newline indicator in old file #5159](https://github.com/libgit2/libgit2/pull/5159) +- [patch_parse: do not depend on parsed buffer's lifetime #5158](https://github.com/libgit2/libgit2/pull/5158) +- [sha1: fix compilation of WinHTTP backend #5174](https://github.com/libgit2/libgit2/pull/5174) +- [repository: do not initialize HEAD if it's provided by templates #5176](https://github.com/libgit2/libgit2/pull/5176) +- [configuration: cvar -> configmap #5138](https://github.com/libgit2/libgit2/pull/5138) +- [Evict cache items more efficiently #5172](https://github.com/libgit2/libgit2/pull/5172) +- [clar: fix suite count #5175](https://github.com/libgit2/libgit2/pull/5175) +- [Ignore VS2017 specific files and folders #5163](https://github.com/libgit2/libgit2/pull/5163) +- [gitattributes: ignore macros defined in subdirectories #5156](https://github.com/libgit2/libgit2/pull/5156) +- [clar: correctly account for "data" suites when counting #5168](https://github.com/libgit2/libgit2/pull/5168) +- [Allocate memory more efficiently when packing objects #5170](https://github.com/libgit2/libgit2/pull/5170) +- [fileops: fix creation of directory in filesystem root #5131](https://github.com/libgit2/libgit2/pull/5131) +- [win32: fix fuzzers and have CI build them #5160](https://github.com/libgit2/libgit2/pull/5160) +- [Config parser separation #5134](https://github.com/libgit2/libgit2/pull/5134) +- [config_file: implement stat cache to avoid repeated rehashing #5132](https://github.com/libgit2/libgit2/pull/5132) +- [ci: build with ENABLE_WERROR on Windows #5143](https://github.com/libgit2/libgit2/pull/5143) +- [Fix Regression: attr: Correctly load system attr file (on Windows) #5152](https://github.com/libgit2/libgit2/pull/5152) +- [hash: fix missing error return on production builds #5145](https://github.com/libgit2/libgit2/pull/5145) +- [Resolve static check warnings in example code #5142](https://github.com/libgit2/libgit2/pull/5142) +- [Multiple hash algorithms #4438](https://github.com/libgit2/libgit2/pull/4438) +- [More documentation #5128](https://github.com/libgit2/libgit2/pull/5128) +- [Incomplete commondir support #4967](https://github.com/libgit2/libgit2/pull/4967) +- [Remove warnings #5078](https://github.com/libgit2/libgit2/pull/5078) +- [Re-run flaky tests #5140](https://github.com/libgit2/libgit2/pull/5140) + + +## v0.25.0-alpha.15 [(2019-07-15)](https://github.com/nodegit/nodegit/releases/tag/v0.25.0-alpha.15) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.25.0-alpha.14...v0.25.0-alpha.15) + +#### Summary of changes +- Removed NSEC optimization due to performance regressions in repositories that did not use NSEC optimization cloned via NodeGit. + +#### Merged PRs into NodeGit +- [Remove NSEC #1699](https://github.com/nodegit/nodegit/pull/1699) + + +## v0.25.0-alpha.14 [(2019-07-01)](https://github.com/nodegit/nodegit/releases/tag/v0.25.0-alpha.14) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.25.0-alpha.13...v0.25.0-alpha.14) + +#### Summary of changes +- Always use builtin regex for linux for portability + +#### Merged PRs into NodeGit +- [Use builtin regex library for linux for better portability #1693](https://github.com/nodegit/nodegit/pull/1693) +- [Remove pcre-config from binding.gyp #1694](https://github.com/nodegit/nodegit/pull/1694) + +## v0.25.0-alpha.13 [(2019-06-26)](https://github.com/nodegit/nodegit/releases/tag/v0.25.0-alpha.13) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.25.0-alpha.12...v0.25.0-alpha.13) + +#### Summary of changes +- Turn on GIT_USE_NSEC on all platforms +- Use Iconv on OSX for better internationalization support. +- Bump libgit2 to bring in: + - NTLM proxy support + - Negotiate/Kerberos proxy support + - Various git config fixes + - Various git ignore fixes + - Various libgit2 performance improvements + - Windows/Linux now use PCRE for regex, OSX uses regcomp_l, this should address collation issues in diffing +- Fixed bug with Repository.prototype.refreshReferences dying on corrupted reference. We now ignore corrupted references + +#### Merged PRs into NodeGit +- [refresh_references.cc: skip refs that can't be directly resolved #1689](https://github.com/nodegit/nodegit/pull/1689) +- [Bump libgit2 to fork of latest master #1690](https://github.com/nodegit/nodegit/pull/1690) + +#### Merged PRs into LibGit2 +- [errors: use lowercase](https://github.com/libgit2/libgit2/pull/5137) +- [largefile tests: only write 2GB on 32-bit platforms](https://github.com/libgit2/libgit2/pull/5136) +- [Fix broken link in README](https://github.com/libgit2/libgit2/pull/5129) +- [net: remove unused `git_headlist_cb`](https://github.com/libgit2/libgit2/pull/5122) +- [cmake: default NTLM client to off if no HTTPS support](https://github.com/libgit2/libgit2/pull/5124) +- [attr: rename constants and macros for consistency](https://github.com/libgit2/libgit2/pull/5119) +- [Change API instances of `fromnoun` to `from_noun` (with an underscore)](https://github.com/libgit2/libgit2/pull/5117) +- [object: rename git_object__size to git_object_size](https://github.com/libgit2/libgit2/pull/5118) +- [Replace fnmatch with wildmatch](https://github.com/libgit2/libgit2/pull/5110) +- [Documentation fixes](https://github.com/libgit2/libgit2/pull/5111) +- [Removal of `p_fallocate`](https://github.com/libgit2/libgit2/pull/5114) +- [Modularize our TLS & hash detection](https://github.com/libgit2/libgit2/pull/5055) +- [tests: merge::analysis: use test variants to avoid duplicated test suites](https://github.com/libgit2/libgit2/pull/5109) +- [Rename options initialization functions](https://github.com/libgit2/libgit2/pull/5101) +- [deps: ntlmclient: disable implicit fallthrough warnings](https://github.com/libgit2/libgit2/pull/5112) +- [gitignore with escapes](https://github.com/libgit2/libgit2/pull/5097) +- [Handle URLs with a colon after host but no port](https://github.com/libgit2/libgit2/pull/5108) +- [Merge analysis support for bare repos](https://github.com/libgit2/libgit2/pull/5022) +- [Add memleak check docs](https://github.com/libgit2/libgit2/pull/5104) +- [Data-driven tests](https://github.com/libgit2/libgit2/pull/5098) +- [sha1dc: update to fix endianess issues on AIX/HP-UX](https://github.com/libgit2/libgit2/pull/5107) +- [Add NTLM support for HTTP(s) servers and proxies](https://github.com/libgit2/libgit2/pull/5052) +- [Callback type names should be suffixed with `_cb`](https://github.com/libgit2/libgit2/pull/5102) +- [tests: checkout: fix symlink.git being created outside of sandbox](https://github.com/libgit2/libgit2/pull/5099) +- [ignore: handle escaped trailing whitespace](https://github.com/libgit2/libgit2/pull/5095) +- [Ignore: only treat one leading slash as a root identifier](https://github.com/libgit2/libgit2/pull/5074) +- [online tests: use gitlab for auth failures](https://github.com/libgit2/libgit2/pull/5094) +- [Ignore files: don't ignore whitespace](https://github.com/libgit2/libgit2/pull/5076) +- [cache: fix cache eviction using deallocated key](https://github.com/libgit2/libgit2/pull/5088) +- [SECURITY.md: split out security-relevant bits from readme](https://github.com/libgit2/libgit2/pull/5085) +- [Restore NetBSD support](https://github.com/libgit2/libgit2/pull/5086) +- [repository: fix garbage return value](https://github.com/libgit2/libgit2/pull/5084) +- [cmake: disable fallthrough warnings for PCRE](https://github.com/libgit2/libgit2/pull/5083) +- [Configuration parsing: validate section headers with quotes](https://github.com/libgit2/libgit2/pull/5073) +- [Loosen restriction on wildcard "*" refspecs](https://github.com/libgit2/libgit2/pull/5060) +- [Use PCRE for our fallback regex engine when regcomp_l is unavailable](https://github.com/libgit2/libgit2/pull/4935) +- [Remote URL last-chance resolution](https://github.com/libgit2/libgit2/pull/5062) +- [Skip UTF8 BOM in ignore files](https://github.com/libgit2/libgit2/pull/5075) +- [We've already added `ZLIB_LIBRARIES` to `LIBGIT2_LIBS` so don't also add the `z` library](https://github.com/libgit2/libgit2/pull/5080) +- [Define SYMBOLIC_LINK_FLAG_DIRECTORY if required](https://github.com/libgit2/libgit2/pull/5077) +- [Support symlinks for directories in win32](https://github.com/libgit2/libgit2/pull/5065) +- [rebase: orig_head and onto accessors](https://github.com/libgit2/libgit2/pull/5057) +- [cmake: correctly detect if system provides `regcomp`](https://github.com/libgit2/libgit2/pull/5063) +- [Correctly write to missing locked global config](https://github.com/libgit2/libgit2/pull/5023) +- [[RFC] util: introduce GIT_DOWNCAST macro](https://github.com/libgit2/libgit2/pull/4561) +- [examples: implement SSH authentication](https://github.com/libgit2/libgit2/pull/5051) +- [git_repository_init: stop traversing at windows root](https://github.com/libgit2/libgit2/pull/5050) +- [config_file: check result of git_array_alloc](https://github.com/libgit2/libgit2/pull/5053) +- [patch_parse.c: Handle CRLF in parse_header_start](https://github.com/libgit2/libgit2/pull/5027) +- [fix typo](https://github.com/libgit2/libgit2/pull/5045) +- [sha1: don't inline `git_hash_global_init` for win32](https://github.com/libgit2/libgit2/pull/5039) +- [ignore: treat paths with trailing "/" as directories](https://github.com/libgit2/libgit2/pull/5040) +- [Test that largefiles can be read through the tree API](https://github.com/libgit2/libgit2/pull/4874) +- [Tests for symlinked user config](https://github.com/libgit2/libgit2/pull/5034) +- [patch_parse: fix parsing addition/deletion of file with space](https://github.com/libgit2/libgit2/pull/5035) +- [Optimize string comparisons](https://github.com/libgit2/libgit2/pull/5018) +- [Negation of subdir ignore causes other subdirs to be unignored](https://github.com/libgit2/libgit2/pull/5020) +- [xdiff: fix typo](https://github.com/libgit2/libgit2/pull/5024) +- [docs: clarify relation of safe and forced checkout strategy](https://github.com/libgit2/libgit2/pull/5032) +- [Each hash implementation should define `git_hash_global_init`](https://github.com/libgit2/libgit2/pull/5026) +- [[Doc] Update URL to git2-rs](https://github.com/libgit2/libgit2/pull/5012) +- [remote: Rename git_remote_completion_type to _t](https://github.com/libgit2/libgit2/pull/5008) +- [odb: provide a free function for custom backends](https://github.com/libgit2/libgit2/pull/5005) +- [Have git_branch_lookup accept GIT_BRANCH_ALL](https://github.com/libgit2/libgit2/pull/5000) +- [Rename git_transfer_progress to git_indexer_progress](https://github.com/libgit2/libgit2/pull/4997) +- [High-level map APIs](https://github.com/libgit2/libgit2/pull/4901) +- [refdb_fs: fix loose/packed refs lookup racing with repacks](https://github.com/libgit2/libgit2/pull/4984) +- [Allocator restructuring](https://github.com/libgit2/libgit2/pull/4998) +- [cache: fix misnaming of `git_cache_free`](https://github.com/libgit2/libgit2/pull/4992) +- [examples: produce single cgit2 binary](https://github.com/libgit2/libgit2/pull/4956) +- [Remove public 'inttypes.h' header](https://github.com/libgit2/libgit2/pull/4991) +- [Prevent reading out of bounds memory](https://github.com/libgit2/libgit2/pull/4996) +- [Fix a memory leak in odb_otype_fast()](https://github.com/libgit2/libgit2/pull/4987) +- [Make stdalloc__reallocarray call stdalloc__realloc](https://github.com/libgit2/libgit2/pull/4986) +- [Remove `git_time_monotonic`](https://github.com/libgit2/libgit2/pull/4990) +- [Fix a _very_ improbable memory leak in git_odb_new()](https://github.com/libgit2/libgit2/pull/4988) +- [ci: publish documentation on merge](https://github.com/libgit2/libgit2/pull/4989) +- [Enable creation of worktree from bare repo's default branch](https://github.com/libgit2/libgit2/pull/4982) +- [Allow bypassing check for '.keep' file](https://github.com/libgit2/libgit2/pull/4965) +- [Release v0.28.1](https://github.com/libgit2/libgit2/pull/4983) + + + +## v0.25.0-alpha.12 [(2019-06-03)](https://github.com/nodegit/nodegit/releases/tag/v0.25.0-alpha.12) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.25.0-alpha.11...v0.25.0-alpha.12) + +#### Summary of changes +- Fix bug in Repository.prototype.refreshReferences where new remote references from a new remote added/fetched on a separte repo instance do not show up in the result. +- Fixed a prototype problem with cherrypick, merge, and other collections that have a function at their root. call, apply, and bind should now be on NodeGit.Cherrypick. +- Bumped libssh2 to resolve security notice. + +#### Merged PRs into NodeGit +- [Bump libssh2 to 1.8.2 and fix some npm audit warnings #1678](https://github.com/nodegit/nodegit/pull/1678) +- [Root functions should keep their function prototypes correctly #1681](https://github.com/nodegit/nodegit/pull/1681) +- [refresh_references.cc: bust LibGit2 remote list cache by reading config #1685](https://github.com/nodegit/nodegit/pull/1685) + + +## v0.25.0-alpha.11 [(2019-05-20)](https://github.com/nodegit/nodegit/releases/tag/v0.25.0-alpha.11) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.25.0-alpha.10...v0.25.0-alpha.11) + +#### Summary of changes +- Improve speed and correctness of fileHistoryWalk. The API should not have changed; however, when the end of the walk has been reached, `reachedEndOfHistory` will be specified on the resulting array. + +#### Merged PRs into NodeGit +- [Implement faster file history walk #1676](https://github.com/nodegit/nodegit/pull/1676) + + +## v0.25.0-alpha.10 [(2019-05-03)](https://github.com/nodegit/nodegit/releases/tag/v0.25.0-alpha.10) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.25.0-alpha.9...v0.25.0-alpha.10) + +#### Summary of changes +- Drops support for Ubuntu 14 after EOL +- Fixes openssl prebuilt downloads for electron builds +- Fixes commits retrieved from Commit.prototype.parent +- *DEPRECATION* Support signing commits in Repository.prototype.mergeBranches. The last parameter `processMergeMessageCallback` is now deprecated, but will continue to work. Use the options object instead, which will contain the `processMergeMessageCallback`, as well as the `signingCb`. +- Bump Node-Gyp to 4.0.0 to fix tar security vulnerability +- *BREAKING* `getRemotes` no longer returns remote names, it now returns remote objects directly. Use `getRemoteNames` to get a list of remote names. +- Optimized a set of routines in NodeGit. These methods as written in Javascript require hundreds or thousands of requests to async workers to retrieve data. We've batched these requests and performed them on a single async worker. There are now native implementations of the following: + - Repository.prototype.getReferences: Retrieves all references on async worker. + - Repository.prototype.getRemotes: Retrieves all remotes on async worker. + - Repository.prototype.getSubmodules: Retrieves all submodules on async worker. + - Repository.prototype.refreshReferences: Open sourced function from GitKraken. Grabs a lot of information about references on an async worker. + - Revwalk.prototype.commitWalk: Retrieves up to N commits from a revwalk on an async worker. + +#### Merged PRs into NodeGit +- [EOL for Node 6 and Ubuntu 14.04 #1649](https://github.com/nodegit/nodegit/pull/1649) +- [Ensures that commits from parent(*) has a repository #1658](https://github.com/nodegit/nodegit/pull/1658) +- [Update openssl conan distributions #1663](https://github.com/nodegit/nodegit/pull/1663) +- [Support signing in Repository#mergeBranches #1664](https://github.com/nodegit/nodegit/pull/1664) +- [Dependency upgrade node-gyp upgraded to 4.0.0 #1672](https://github.com/nodegit/nodegit/pull/1672) +- [Add additional getters to streamline information gathering (breaking change) #1671](https://github.com/nodegit/nodegit/pull/1671) + + + +## v0.25.0-alpha.9 [(2019-03-04)](https://github.com/nodegit/nodegit/releases/tag/v0.25.0-alpha.9) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.25.0-alpha.8...v0.25.0-alpha.9) + +#### Summary of changes +- Removed access to the diff_so_far param in git_diff_notify_cb and git_diff_progress_cb +- Changed FilterSource.prototype.repo to async to prevent segfaults on filters that run during Submodule.status +- Clean up deprecation messages to inform users of what was deprecated, not just what users should switch to +- When installing on a machine that has yarn and does not have npm, the preinstall script should succeed now +- ceiling_dirs is now an optional parameter to Repository.discover + +#### Merged PRs into NodeGit +- [Clean up some dangerous memory accesses in callbacks #1642](https://github.com/nodegit/nodegit/pull/1642) +- [Output the item that was deprecated when giving deprecation notice #1643](https://github.com/nodegit/nodegit/pull/1643) +- [Don't fail yarn installs when we can't find npm #1644](https://github.com/nodegit/nodegit/pull/1644) +- [`ceiling_dirs` parameter in `Repository.discover` is optional #1245](https://github.com/nodegit/nodegit/pull/1245) + + +## v0.25.0-alpha.8 [(2019-02-27)](https://github.com/nodegit/nodegit/releases/tag/v0.25.0-alpha.8) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.25.0-alpha.7...v0.25.0-alpha.8) + +#### Summary of changes +- Fixed segfault in NodeGit.Merge.analysis and NodeGit.Merge.analysisForRef + +#### Merged PRs into NodeGit +- [Add missing `shouldAlloc` declarations for git_merge_analysis* functions #1641](https://github.com/nodegit/nodegit/pull/1641) + + +## v0.25.0-alpha.7 [(2019-02-20)](https://github.com/nodegit/nodegit/releases/tag/v0.25.0-alpha.7) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.25.0-alpha.6...v0.25.0-alpha.7) + +#### Summary of changes +- Fixed bug where repeated uses of extractSignature would fail because of the use of regex.prototype.match +- Added support for building on IBM i (PASE) machines +- Fixed bug where signingCb in rebases would not return error codes to LibGit2 if the signingCb threw or rejected +- Exposed AnnotatedCommit methods: + - AnnotatedCommit.prototype.ref +- Exposed Apply methods: + - Apply.apply applies a diff to the repository + - Apply.toTree applies a diff to a tree +- Exposed Config methods: + - Config.prototype.deleteEntry + - Config.prototype.deleteMultivar + - Config.prototype.getBool + - Config.prototype.getInt32 + - Config.prototype.getInt64 + - Config.prototype.setMultivar + - Config.prototype.snapshot +- Exposed ConfigIterator with methods: + - ConfigIterator.create + - ConfigIterator.createGlob + - ConfigIterator.createMultivar + - ConfigIterator.prototype.next +- Exposed Merge methods: + - Merge.analysis + - Merge.analysisForRef +- Expose Remote methods: + - Remote.createWithOpts + +#### Merged PRs into NodeGit +- [Fix regex state causing subsequent runs of Tag.extractSignature to fail #1630](https://github.com/nodegit/nodegit/pull/1630) +- [Update LibGit2 docs to v0.28.0 #1631](https://github.com/nodegit/nodegit/pull/1631) +- [Add support for building on IBM i (PASE) #1634](https://github.com/nodegit/nodegit/pull/1634) +- [Expose more config methods #1635](https://github.com/nodegit/nodegit/pull/1635) +- [Catch errors and pass them to libgit2 as error codes in rebase signingcb #1636](https://github.com/nodegit/nodegit/pull/1636) +- [Simplify check for IBM i operating system #1637](https://github.com/nodegit/nodegit/pull/1637) +- [Bump LibGit2 to fork of v0.28.1 #1638](https://github.com/nodegit/nodegit/pull/1638) + + +## v0.25.0-alpha.6 [(2019-02-14)](https://github.com/nodegit/nodegit/releases/tag/v0.25.0-alpha.6) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.25.0-alpha.5...v0.25.0-alpha.6) + +#### Summary of changes +- Bumped LibGit2 to v0.28.0. +- Fixed problem with continue rebase preventing users from skipping commits +- Fixed leak where struct/option types were leaking libgit2 pointers + +#### Merged PRs into NodeGit +- [We should clear the persistent cell in structs when they are destroyed #1629](https://github.com/nodegit/nodegit/pull/1629) +- [Fix "errorno" typo #1628](https://github.com/nodegit/nodegit/pull/1628) +- [Bump Libgit2 fork to v0.28.0 #1627](https://github.com/nodegit/nodegit/pull/1627) + + +## v0.25.0-alpha.5 [(2019-02-11)](https://github.com/nodegit/nodegit/releases/tag/v0.25.0-alpha.5) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.25.0-alpha.4...v0.25.0-alpha.5) + +#### Summary of changes +- Fixed builds for Electron 4 for real this time + +#### Merged PRs into NodeGit +- [Fix macOS and Windows Electron 4 builds #1626](https://github.com/nodegit/nodegit/pull/1626) + + +## v0.25.0-alpha.4 [(2019-02-08)](https://github.com/nodegit/nodegit/releases/tag/v0.25.0-alpha.4) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.25.0-alpha.3...v0.25.0-alpha.4) + +#### Summary of changes +- Fixed bug where signing the init commit failed due to being unable to update the `HEAD` ref. +- Changed `NodeGit.Signature.default` to async, because it actually ends up reading the config. +- Fixed bug where templates were not reporting errors for synchronous methods. It's a bit of a wide net, but in general, + it is now possible certain sync methods in NodeGit will begin failin that did not fail before. This is the correct + behavior. +- Switched `NodeGit.Oid.fromString`'s internal implementation from `git_oid_fromstr` to `git_oid_fromstrp` +- Fixed builds for Electron 4 +- Added `NodeGit.Reference.updateTerminal` + +#### Merged PRs into NodeGit +- [Fix non-existent / dangling refs cause Repository.prototype.createCommitWithSignature to fail #1624](https://github.com/nodegit/nodegit/pull/1624) +- [Handle new gyp information for electron builds #1623](https://github.com/nodegit/nodegit/pull/1623) + + +## v0.25.0-alpha.3 [(2019-02-05)](https://github.com/nodegit/nodegit/releases/tag/v0.25.0-alpha.3) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.25.0-alpha.2...v0.25.0-alpha.3) + +#### Summary of changes +- Enforced consistent use of signing callbacks within the application. Any object that implements the signingCallback + pattern for signing commits or tags should use the exact same callback type and with the same meaning. + `type SigningCallback = (content: string) => {| code: number, field?: string, signedData?: string |};` + If the code is `NodeGit.Error.CODE.OK` or 0, the operation will succeed and _at least_ signedData is expected to be filled out. + If the code is a negative number, except for `NodeGit.Error.CODE.PASSTHROUGH`, the signing operation will fail. + If the code is `NodeGit.Error.CODE.PASSTHROUGH`, the operation will continue without signing the object. + +#### Merged PRs into NodeGit +- [Use same API for signingCb in all places that can be crypto signed #1621](https://github.com/nodegit/nodegit/pull/1621) + + +## v0.25.0-alpha.2 [(2019-02-01)](https://github.com/nodegit/nodegit/releases/tag/v0.25.0-alpha.2) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.25.0-alpha.1...v0.25.0-alpha.2) + +#### Summary of changes +- Added RebaseOptions to repository.prototype.rebaseContinue + +#### Merged PRs into NodeGit +- [Breaking: Repository.prototype.continueRebase enhancements #1619](https://github.com/nodegit/nodegit/pull/1619) + + +## v0.25.0-alpha.1 [(2019-01-30)](https://github.com/nodegit/nodegit/releases/tag/v0.25.0-alpha.1) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.24.0...v0.25.0-alpha.1) + +#### Summary of changes +- Bump Libgit2 to preview of v0.28.0 +- Add signing support for commits and annotated tags +- Updated Signature.prototype.toString to optionally include timestamps +- [BREAKING] Converted Buf.prototype.set and Buf.prototype.grow from async to sync +- Added complete support for libgit2 types: + - git_index_name_entry + - git_index_reuc_entry + - git_mailmap +- Exposed git_path_is_gitfile +- Exposed git_tag_create_frombuffer + +#### Merged PRs into NodeGit +- [adds support for gpg commit signing (fixes #1018) #1448](https://github.com/nodegit/nodegit/pull/1448) +- [Add `updateRef` parameter to Repository#createCommitWithSignature #1610](https://github.com/nodegit/nodegit/pull/1610) +- [Documentation fixes. #1611](https://github.com/nodegit/nodegit/pull/1611) +- [Add Commit#amendWithSignature #1616](https://github.com/nodegit/nodegit/pull/1616) +- [Bump libgit2 to a preview of v0.28 #1615](https://github.com/nodegit/nodegit/pull/1615) +- [Fix issues with Commit#amendWithSignature #1617](https://github.com/nodegit/nodegit/pull/1617) +- [Marked Repository.createBlobFromBuffer as async #1614](https://github.com/nodegit/nodegit/pull/1614) +- [Add functionality for creating Tags with signatures and extracting signatures from Tags #1618](https://github.com/nodegit/nodegit/pull/1618) + + +## v0.24.0 [(2019-01-16)](https://github.com/nodegit/nodegit/releases/tag/v0.24.0) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.23.0...v0.24.0) + +#### Summary of changes +- Garbage collect most of the library. +- All free functions have been removed. The expectation is that they will be collected by the GC. +- All init options methods have been removed. They were never supposed to be exposed in the first place. +- Added support for performing history walks on directories. +- Fix various bugs that led to segfaults or incorrect behavior. +- Removed ssl and crypto dependency from non-electron builds. + +##### Removed methods +Mostly due to missing support anyway, please report anything you were using as an issue. + - NodeGit.Blob.createFromStreamCommit + - NodeGit.Branch.Iterator.prototype.new + - NodeGit.Config.initBackend + - NodeGit.Config.prototype.snapshot + - NodeGit.Config.prototype.setBool + - NodeGit.Config.prototype.setInt32 + - NodeGit.Config.prototype.setInt64 + - NodeGit.Index.prototype.owner + - NodeGit.Note.iteratorNew + - NodeGit.Note.next + - NodeGit.Odb.prototype.addDiskAlternate + - NodeGit.Repository.prototype.configSnapshot + - NodeGit.Signature.prototype.dup + - NodeGit.Tag.foreach + - NodeGit.Transport.init + - NodeGit.Transport.sshWithPaths + - NodeGit.Transport.unregister + +##### Newly exposed methods: + - NodeGit.Config.prototype.getEntry + - NodeGit.Config.prototype.snapshot + - NodeGit.Config.prototype.refresh + - NodeGit.Config.prototype.setBool + - NodeGit.Config.prototype.setInt32 + - NodeGit.Config.prototype.setInt64 + - NodeGit.Diff.prototype.isSortedIcase + - NodeGit.DiffStats.prototype.deletions + - NodeGit.DiffStats.prototype.filesChanged + - NodeGit.DiffStats.prototype.insertions + - NodeGit.DiffStats.prototype.toBuf + - NodeGit.Odb.hashfile + - NodeGit.Odb.prototype.readPrefix + - NodeGit.OidShorten.prototype.add + - NodeGit.OidShorten.create + - NodeGit.PathspecMatchList.prototype.diffEntry + - NodeGit.PathspecMatchList.prototype.entry + - NodeGit.PathspecMatchList.prototype.entrycount + - NodeGit.PathspecMatchList.prototype.failedEntry + - NodeGit.PathspecMatchList.prototype.failedEntryCount + +##### Newly exposed types + - NodeGit.DescribeFormatOptions + - NodeGit.DiffStats + - NodeGit.OidShorten + - NodeGit.PathspecMatchList + +#### Merged PRs into NodeGit +- [Garbage collection: Free mostly everything automatically #1570](https://github.com/nodegit/nodegit/pull/1570) +- [Fix typo in GitHub issue template #1586](https://github.com/nodegit/nodegit/pull/1586) +- [More suitable example about Signature #1582](https://github.com/nodegit/nodegit/pull/1582) +- [Add support for directories when using `fileHistoryWalk` #1583](https://github.com/nodegit/nodegit/pull/1583) +- [Add a test for Repository's getReferenceCommit #1601](https://github.com/nodegit/nodegit/pull/1601) +- [Check parameters before performing reset #1603](https://github.com/nodegit/nodegit/pull/1603) +- [Remove ssl and crypto dependency on non-electron builds #1600](https://github.com/nodegit/nodegit/pull/1600) +- [Clean up libssh2 configure step #1574](https://github.com/nodegit/nodegit/pull/1574) +- [Fix checkout bug in our fork of libgit2 #1609](https://github.com/nodegit/nodegit/pull/1609) +- [Fix segfault in NodeGit.Revert.revert #1605](https://github.com/nodegit/nodegit/pull/1605) + + +## v0.24.0-alpha.1 [(2018-10-25)](https://github.com/nodegit/nodegit/releases/tag/v0.24.0-alpha.1) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.23.0...v0.24.0-alpha.1) + +#### Summary of changes +- Garbage collect most of the library. +- All free functions have been removed. The expectation is that they will be collected by the GC. +- All init options methods have been removed. They were never supposed to be exposed in the first place. + +##### Removed methods +Mostly due to missing support anyway, please report anything you were using as an issue. + - NodeGit.Blob.createFromStreamCommit + - NodeGit.Branch.Iterator.prototype.new + - NodeGit.Config.initBackend + - NodeGit.Config.prototype.snapshot + - NodeGit.Config.prototype.setBool + - NodeGit.Config.prototype.setInt32 + - NodeGit.Config.prototype.setInt64 + - NodeGit.Index.prototype.owner + - NodeGit.Note.iteratorNew + - NodeGit.Note.next + - NodeGit.Odb.prototype.addDiskAlternate + - NodeGit.Repository.prototype.configSnapshot + - NodeGit.Signature.prototype.dup + - NodeGit.Tag.foreach + - NodeGit.Transport.init + - NodeGit.Transport.sshWithPaths + - NodeGit.Transport.unregister + +##### Newly exposed methods: + - NodeGit.Config.prototype.getEntry + - NodeGit.Config.prototype.snapshot + - NodeGit.Config.prototype.refresh + - NodeGit.Config.prototype.setBool + - NodeGit.Config.prototype.setInt32 + - NodeGit.Config.prototype.setInt64 + - NodeGit.Diff.prototype.isSortedIcase + - NodeGit.DiffStats.prototype.deletions + - NodeGit.DiffStats.prototype.filesChanged + - NodeGit.DiffStats.prototype.insertions + - NodeGit.DiffStats.prototype.toBuf + - NodeGit.Odb.hashfile + - NodeGit.Odb.prototype.readPrefix + - NodeGit.OidShorten.prototype.add + - NodeGit.OidShorten.create + - NodeGit.PathspecMatchList.prototype.diffEntry + - NodeGit.PathspecMatchList.prototype.entry + - NodeGit.PathspecMatchList.prototype.entrycount + - NodeGit.PathspecMatchList.prototype.failedEntry + - NodeGit.PathspecMatchList.prototype.failedEntryCount + +##### Newly exposed types + - NodeGit.DescribeFormatOptions + - NodeGit.DiffStats + - NodeGit.OidShorten + - NodeGit.PathspecMatchList + +#### Merged PRs into NodeGit +- [Garbage collection: Free mostly everything automatically #1570](https://github.com/nodegit/nodegit/pull/1570) + + +## v0.23.0 [(2018-10-22)](https://github.com/nodegit/nodegit/releases/tag/v0.23.0) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.22.2...v0.23.0) + +#### Summary of changes +- Added Node 10 support. +- We no longer compile OpenSSL. Instead, we prefer the OpenSSL shipped with Node. In electron builds, we prefer the system openssl on linux, and we get prebuilt static libs from Conan. +- Cleaned up some compiler warnings +- Our http_parser dependency is now a submodule. +- Updated some dependencies in npm to get rid of security vulnerabilities and warnings. +- Exposed transfer progress callback for pushing. +- Libssh2 is now preconfigured for both Mac OS and Windows + +#### Merged PRs into NodeGit +- [warn about node v10 incompatibility in readme #1534](https://github.com/nodegit/nodegit/pull/1534) +- [Define error codes to fix compiler warnings about unused variables #1486](https://github.com/nodegit/nodegit/pull/1486) +- [Include http_parser via submodule #1551](https://github.com/nodegit/nodegit/pull/1551) +- [Update dependencies to get rid of security vulnerabilities #1547](https://github.com/nodegit/nodegit/pull/1547) +- [add github issue template #1548](https://github.com/nodegit/nodegit/pull/1548) +- [Enable git_push_transfer_progress - Help wanted #1500](https://github.com/nodegit/nodegit/pull/1500) +- [Fixed createBranch API params #1552](https://github.com/nodegit/nodegit/pull/1552) +- [Use curl-config to find curl #1555](https://github.com/nodegit/nodegit/pull/1555) +- [Update readme #1554](https://github.com/nodegit/nodegit/pull/1554) +- [Node 10 support #1545](https://github.com/nodegit/nodegit/pull/1545) +- [Update dependencies #1519](https://github.com/nodegit/nodegit/pull/1519) +- [Run submodule updates in sequence rather than parallel #1558](https://github.com/nodegit/nodegit/pull/1558) +- [Fix Electron builds on win32 #1560](https://github.com/nodegit/nodegit/pull/1560) +- [Use static `libssh2_config.h` on MacOS builds #1569](https://github.com/nodegit/nodegit/pull/1569) + + +## v0.23.0-alpha.2 [(2018-10-19)](https://github.com/nodegit/nodegit/releases/tag/v0.23.0-alpha.2) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.23.0-alpha.1...v0.23.0-alpha.2) + +#### Summary of changes +On Mac OS Mojave, libssh2 configure failed to configure, because libssh2 always tries to configure against system libraries. The configure process uses links to determine that a OpenSSL is present. Since OSX and Windows no longer link against the system lib, we've prebuilt the configure steps for both environments. This should be stable when building NodeGit on Mojave. + +#### Merged PRs into NodeGit +- [Use static `libssh2_config.h` on MacOS builds #1569](https://github.com/nodegit/nodegit/pull/1569) + + +## v0.23.0-alpha.1 [(2018-10-01)](https://github.com/nodegit/nodegit/releases/tag/v0.23.0-alpha.1) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.22.2...v0.23.0-alpha.1) + +#### Summary of changes +- Added Node 10 support. +- We no longer compile OpenSSL. Instead, we prefer the OpenSSL shipped with Node. In electron builds, we prefer the system openssl on linux, and we get prebuilt static libs from Conan. +- Cleaned up some compiler warnings +- Our http_parser dependency is now a submodule. +- Updated some dependencies in npm to get rid of security vulnerabilities and warnings. +- Exposed transfer progress callback for pushing. + +#### Merged PRs into NodeGit +- [warn about node v10 incompatibility in readme #1534](https://github.com/nodegit/nodegit/pull/1534) +- [Define error codes to fix compiler warnings about unused variables #1486](https://github.com/nodegit/nodegit/pull/1486) +- [Include http_parser via submodule #1551](https://github.com/nodegit/nodegit/pull/1551) +- [Update dependencies to get rid of security vulnerabilities #1547](https://github.com/nodegit/nodegit/pull/1547) +- [add github issue template #1548](https://github.com/nodegit/nodegit/pull/1548) +- [Enable git_push_transfer_progress - Help wanted #1500](https://github.com/nodegit/nodegit/pull/1500) +- [Fixed createBranch API params #1552](https://github.com/nodegit/nodegit/pull/1552) +- [Use curl-config to find curl #1555](https://github.com/nodegit/nodegit/pull/1555) +- [Update readme #1554](https://github.com/nodegit/nodegit/pull/1554) +- [Node 10 support #1545](https://github.com/nodegit/nodegit/pull/1545) +- [Update dependencies #1519](https://github.com/nodegit/nodegit/pull/1519) +- [Run submodule updates in sequence rather than parallel #1558](https://github.com/nodegit/nodegit/pull/1558) +- [Fix Electron builds on win32 #1560](https://github.com/nodegit/nodegit/pull/1560) + + +## v0.22.2 [(2018-07-10)](https://github.com/nodegit/nodegit/releases/tag/v0.22.2) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.22.1...v0.22.2) + +#### Summary of changes +- Bumped libgit2 to 0.27.3 to incorporate security patch. Details can be found here https://github.com/libgit2/libgit2/releases/tag/v0.27.3 +- Also includes changes made in 0.27.2. Details can be found here https://github.com/libgit2/libgit2/releases/tag/v0.27.2 +- Ensure optional params are respected as optional in `NodeGit.Merge.trees` + +#### Merged PRs into NodeGit +- [Fix argument handling in Git.Merge.trees #1507](https://github.com/nodegit/nodegit/pull/1507) + +#### Included non-merged libgit2 PRs: + - [Parallelize checkout_create_the_new for ntfs perf gains #4205](https://github.com/libgit2/libgit2/pull/4205) + - [negotiate always fails via libcurl #4126](https://github.com/libgit2/libgit2/pull/4126) + +#### Included merged libgit2 PRs: +- [Bugfix release v0.27.2 #4632](https://github.com/libgit2/libgit2/pull/4632) +- [Release v0.27.3 #4717](https://github.com/libgit2/libgit2/pull/4717) + + +## v0.22.1 [(2018-04-09)](https://github.com/nodegit/nodegit/releases/tag/v0.22.1) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.22.0...v0.22.1) + +#### Summary of changes +Bumped libgit2 to 0.27.1 to address security flaw with submodule name validation (CVE-2018-11235, reported by Etienne Stalmans). +Details can be found here https://github.com/libgit2/libgit2/releases/tag/v0.27.1 + + +## v0.22.0 [(2018-04-09)](https://github.com/nodegit/nodegit/releases/tag/v0.22.0) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.21.2...v0.22.0) + +#### Summary of changes +- Expose [Tag.listMatch](https://libgit2.github.com/libgit2/#v0.26.3/group/tag/git_tag_list_match) +- Expose [Repo.prototype.createCommitBuffer](https://libgit2.github.com/libgit2/#v0.26.3/group/commit/git_commit_create_buffer) +- Bump Libgt2 to 0.27.0. For more information about what was in this release. [Check upstream](https://github.com/libgit2/libgit2/releases/tag/v0.27.0). +- Errors are now properly thrown from + - `Attr.prototype.get` + - `Blob.createFrombuffer` + - `Blob.createFromworkdir` + - `Reference.list` + - `Remote.prototype.getFetchRefspecs` + - `Remote.prototype.getPushRefspecs` + - `Status.file` +- WorkTree is now exposed + - Static methods + - `add` + - `list` + - `lookup` + - `openFromRepository` + - Instance methods + - `isLocked` + - `isPrunable` + - `lock` + - `prune` + - `unlock` + - `validate` +- **BREAKING** Functions that are now async + - `Attr.prototype.getMany` + - `Tag.prototype.target` + - `Treebuilder.prototype.Write` +- **BREAKING** Diffs generated from `Diff.treeToIndex` and `Diff.treeToWorkdirWithIndex` conditionally support `Diff.OPTION.IGNORE_CASE`. Only on repositories where the index is case insensitive will the flag be set on the output diff. The flag itself is ignored when passed to `DiffOptions`. + +#### Merged PRs into NodeGit +- [Add JavaScript Tag.listMatch function for git_tag_list_match #1470](https://github.com/nodegit/nodegit/pull/1470) +- [Expose error code in Status.file #1468](https://github.com/nodegit/nodegit/pull/1468) +- [Travis documentation deploy fixes #1466](https://github.com/nodegit/nodegit/pull/1466) +- [Bump to libgit2 v0.27.0 #1477](https://github.com/nodegit/nodegit/pull/1477) +- [Add repo.createCommitBuffer #1481](https://github.com/nodegit/nodegit/pull/1481) + +#### Included non-merged libgit2 PRs: + - [Parallelize checkout_create_the_new for ntfs perf gains #4205](https://github.com/libgit2/libgit2/pull/4205) + - [negotiate always fails via libcurl #4126](https://github.com/libgit2/libgit2/pull/4126) + + +## v0.21.2 [(2018-03-19)](https://github.com/nodegit/nodegit/releases/tag/v0.21.2) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.21.1...v0.21.2) + +#### Summary of changes +- Drop support for node 7 +- Fixed an issue where fast-forward rebase would throw an error unexepctedly. +- Expose git_commit_extract_signature +- TreeEntry.prototype.path() should always return posix style separators +- Expose git_config_open_ondisk +- Expose git_config_find_global +- Expose git_config_find_system +- Expose git_config_find_xdg +- Expose git_config_get_path + +#### Merged PRs into NodeGit + - [Fix typo in CHANGELOG.md #1455](https://github.com/nodegit/nodegit/pull/1455) + - [Add two tests for Tag #1452](https://github.com/nodegit/nodegit/pull/1452) + - [Handle fast-forward merges properly in repository.performRebase #1457](https://github.com/nodegit/nodegit/pull/1457) + - [Enable git_commit_extract_signature #1458](https://github.com/nodegit/nodegit/pull/1458) + - [removes 'only' from test #1460](https://github.com/nodegit/nodegit/pull/1460) + - [Deploy documentation and make extended tests visible #1447](https://github.com/nodegit/nodegit/pull/1447) + - [resolves #1433 TreeEntry#path should return posix path #1434](https://github.com/nodegit/nodegit/pull/1434) + - [Exposed git_config_open_ondisk #1459](https://github.com/nodegit/nodegit/pull/1459) + - [Expose git_config functions #1463](https://github.com/nodegit/nodegit/pull/1463) + + +## v0.21.1 [(2018-03-05)](https://github.com/nodegit/nodegit/releases/tag/v0.21.1) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.21.0...v0.21.1) + +#### Summary of changes +- Fixed an issue where having html escape characters in the path portion of an ssh url always fails when performing remote actions. + +#### Included non-merged libgit2 PRs: +- [Unescape special characters in SSH repo paths #4557](https://github.com/libgit2/libgit2/pull/4557) + +## v0.21.0 [(2018-02-26)](https://github.com/nodegit/nodegit/releases/tag/v0.21.0) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.20.3...v0.21.0) + +#### Summary of changes to NodeGit: + - [Generate default options for Revert.revert to prevent an exception #1404](https://github.com/nodegit/nodegit/pull/1404) + - [fix issue with re-require()'ing native modules #1354](https://github.com/nodegit/nodegit/pull/1354) + - [Expose JavaScript function name in a rejected promise #1393](https://github.com/nodegit/nodegit/pull/1393) + - [Fix compiling with clang #1344](https://github.com/nodegit/nodegit/pull/1344) + - [Fix typos #1415](https://github.com/nodegit/nodegit/pull/1415) + - [build: add NetBSD support to opensslconf.h #1374](https://github.com/nodegit/nodegit/pull/1374) + - [Fix example by forcing backslashes with path.posix #1346](https://github.com/nodegit/nodegit/pull/1346) + - [Expose the Node.js GC when running `mocha `scripts #1258](https://github.com/nodegit/nodegit/pull/1258) + - [Exposed filter_list; Fixed discard lines to use filters #1414](https://github.com/nodegit/nodegit/pull/1414) + - [Add tests for AnnotatedCommit #1325](https://github.com/nodegit/nodegit/pull/1325) + - [Adding docs for NodeGit #1350](https://github.com/nodegit/nodegit/pull/1350) + - [Fix details-for-tree-entry.js to access fields instead of calling a function #1326](https://github.com/nodegit/nodegit/pull/1326) + - [Add JavaScript version of `git_tag_peel()` #1269](https://github.com/nodegit/nodegit/pull/1269) + - [Fixed documentation error #1417](https://github.com/nodegit/nodegit/pull/1417) + - [Annotate Blame.file as async #1421](https://github.com/nodegit/nodegit/pull/1421) + - [Add two missing tests to Commit #1422](https://github.com/nodegit/nodegit/pull/1422) + - [CI: Update Node.js versions + some deps #1444](https://github.com/nodegit/nodegit/pull/1444) + - [Expose fetch_options.custom_headers #1430](https://github.com/nodegit/nodegit/pull/1430) + +## v0.20.3 [(2017-10-18)](https://github.com/nodegit/nodegit/releases/tag/v0.20.3) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.20.2...v0.20.3) + +#### Summary of changes outside of libgit2 bump: + - [Bumped libgit to libgit-next head #1387](https://github.com/nodegit/nodegit/pull/1387) + - [Added a better normalizeOptions pattern for the submodule update routine #1388](https://github.com/nodegit/nodegit/pull/1388) + - [Updated input docs to allow for git_push_update_reference_cb to generate #1386](https://github.com/nodegit/nodegit/pull/1386) + - [Updated descriptors for git_index_find and git_index_find_prefix #1391](https://github.com/nodegit/nodegit/pull/1391) + +#### Included merged libgit2 PRs: + - [Fix template dir empty string #4273](https://github.com/libgit2/libgit2/pull/4273) + - [travis: upgrade container to Ubuntu 14.04 #4211](https://github.com/libgit2/libgit2/pull/4211) + - [merge: perform exact rename detection in linear time #4202](https://github.com/libgit2/libgit2/pull/4202) + - [merge: fix potential free of uninitialized memory #4277](https://github.com/libgit2/libgit2/pull/4277) + - [cmake: Permit disabling external http-parser #4278](https://github.com/libgit2/libgit2/pull/4278) + - [Out of tree builds #4235](https://github.com/libgit2/libgit2/pull/4235) + - [Convert port with htons() in p_getaddrinfo() #4280](https://github.com/libgit2/libgit2/pull/4280) + - [tests: config: fix missing declaration causing error #4291](https://github.com/libgit2/libgit2/pull/4291) + - [git_reset_*: pass parameters as const pointers #4287](https://github.com/libgit2/libgit2/pull/4287) + - [signature: don't leave a dangling pointer to the strings on parse failure #4306](https://github.com/libgit2/libgit2/pull/4306) + - [Patch ID calculation #4272](https://github.com/libgit2/libgit2/pull/4272) + - [Configuration file fixes with includes #4250](https://github.com/libgit2/libgit2/pull/4250) + - [win32: provide fast-path for retrying filesystem operations #4311](https://github.com/libgit2/libgit2/pull/4311) + - [Build with patched libcurl #4317](https://github.com/libgit2/libgit2/pull/4317) + - [tsort: remove idempotent conditional assignment #4314](https://github.com/libgit2/libgit2/pull/4314) + - [tests: rebase::submodule: verify initialization method calls #4320](https://github.com/libgit2/libgit2/pull/4320) + - [Remove unused 'sys/remote.h' header #4323](https://github.com/libgit2/libgit2/pull/4323) + - [patch_generate: represent buffers as void pointers #4304](https://github.com/libgit2/libgit2/pull/4304) + - [sha1_position: convert do-while to while #4326](https://github.com/libgit2/libgit2/pull/4326) + - [sha1_lookup: drop sha1_entry_pos function #4327](https://github.com/libgit2/libgit2/pull/4327) + - [oid: use memcmp in git_oid__hashcmp #4328](https://github.com/libgit2/libgit2/pull/4328) + - [Docs: Fix inline comments for git_diff_hunk #4330](https://github.com/libgit2/libgit2/pull/4330) + - [Split up CMakeLists.txt build instructions #4282](https://github.com/libgit2/libgit2/pull/4282) + - [-Werror builds for Travis #4279](https://github.com/libgit2/libgit2/pull/4279) + - [Submodules with bare repo #4305](https://github.com/libgit2/libgit2/pull/4305) + - [Fix negative ignore rules with patterns #4296](https://github.com/libgit2/libgit2/pull/4296) + - [README: Mention Guile-Git bindings. #4342](https://github.com/libgit2/libgit2/pull/4342) + - [features.h: allow building without CMake-generated feature header #4346](https://github.com/libgit2/libgit2/pull/4346) + - [Clear the remote_ref_name buffer in git_push_update_tips() #4344](https://github.com/libgit2/libgit2/pull/4344) + - [Fix AppVeyor build failures due to CRTDBG linking issue #4347](https://github.com/libgit2/libgit2/pull/4347) + - [diff: cleanup hash ctx in `git_diff_patchid` #4348](https://github.com/libgit2/libgit2/pull/4348) + - [Reproducible builds #4334](https://github.com/libgit2/libgit2/pull/4334) + - [Static linking for bundled deps #4339](https://github.com/libgit2/libgit2/pull/4339) + - [Use SOCK_CLOEXEC when creating sockets #4364](https://github.com/libgit2/libgit2/pull/4364) + - [Document that a commit is not a descendant of itself #4362](https://github.com/libgit2/libgit2/pull/4362) + - [refs: do not use peeled OID if peeling to a tag #4367](https://github.com/libgit2/libgit2/pull/4367) + - [remote: add typedef to normalize push_update_reference callback #4363](https://github.com/libgit2/libgit2/pull/4363) + - [travis: add custom apt sources #4321](https://github.com/libgit2/libgit2/pull/4321) + - [Fix Issue #4047 Check return codes and free objects #4370](https://github.com/libgit2/libgit2/pull/4370) + - [Plug some leaks in curl's proxy handling #4359](https://github.com/libgit2/libgit2/pull/4359) + - [Checkout typechange-only deltas #4369](https://github.com/libgit2/libgit2/pull/4369) + - [tests: checkout::tree: verify status entrycount changes on chmod #4371](https://github.com/libgit2/libgit2/pull/4371) + - [transports: smart: fix memory leak when skipping symbolic refs #4368](https://github.com/libgit2/libgit2/pull/4368) + - [cmake: fix linking in Xcode with object libraries only #4372](https://github.com/libgit2/libgit2/pull/4372) + - [cmake: use static dependencies when building static libgit2 #4356](https://github.com/libgit2/libgit2/pull/4356) + +#### Included non-merged libgit2 PRs: + - [Parallelize checkout_create_the_new for ntfs perf gains #4205](https://github.com/libgit2/libgit2/pull/4205) + - [negotiate always fails via libcurl #4126](https://github.com/libgit2/libgit2/pull/4126) + + + +## v0.20.2 [(2017-09-13)](https://github.com/nodegit/nodegit/releases/tag/v0.20.2) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.20.0...v0.20.2) + +#### Summary of changes outside of libgit2 bump: + - [Fixed an issue where large buffer allocations in filters (> 256MB) causes a segfault #1368](https://github.com/nodegit/nodegit/pull/1368) + - [Fix git_tree_entry double free #1332](https://github.com/nodegit/nodegit/pull/1332) + +## v0.20.0 [(2017-08-16)](https://github.com/nodegit/nodegit/releases/tag/v0.20.0) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.19.0...v0.20.0) + +#### Summary of changes outside of libgit2 bump: + - [BREAKING: Added blob methods and converted to async #1327](https://github.com/nodegit/nodegit/pull/1327) + - [BREAKING: Convert sync methods to async methods #1348](https://github.com/nodegit/nodegit/pull/1348) + - [Exposed libgit2 git_branch_remote_name method #1340](https://github.com/nodegit/nodegit/pull/1340) + - [Adding git_filter support in nodegit #1331](https://github.com/nodegit/nodegit/pull/1331) + - [Add CI build config for node stable version #1337](https://github.com/nodegit/nodegit/pull/1337) + - [removed node v4 tests #1330](https://github.com/nodegit/nodegit/pull/1330) + +#### Included merged libgit2 PRs: + - [Include fixups #4288](https://github.com/libgit2/libgit2/pull/4288) + - [Docs: Fix inline comments for git_diff_hunk #4330](https://github.com/libgit2/libgit2/pull/4330) + - [oid: use memcmp in git_oid__hashcmp #4328](https://github.com/libgit2/libgit2/pull/4328) + - [sha1_lookup: drop sha1_entry_pos function #4327](https://github.com/libgit2/libgit2/pull/4327) + - [sha1_position: convert do-while to while #4326](https://github.com/libgit2/libgit2/pull/4326) + - [patch_generate: represent buffers as void pointers #4304](https://github.com/libgit2/libgit2/pull/4304) + - [Remove unused 'sys/remote.h' header #4323](https://github.com/libgit2/libgit2/pull/4323) + - [tests: rebase::submodule: verify initialization method calls #4320](https://github.com/libgit2/libgit2/pull/4320) + - [tests: rewrite rebase-submodule .gitmodule file #4275](https://github.com/libgit2/libgit2/pull/4275) + - [tsort: remove idempotent conditional assignment #4314](https://github.com/libgit2/libgit2/pull/4314) + - [Build with patched libcurl #4317](https://github.com/libgit2/libgit2/pull/4317) + - [win32: provide fast-path for retrying filesystem operations #4311](https://github.com/libgit2/libgit2/pull/4311) + - [Configuration file fixes with includes #4250](https://github.com/libgit2/libgit2/pull/4250) + - [Patch ID calculation #4272](https://github.com/libgit2/libgit2/pull/4272) + - [signature: don't leave a dangling pointer to the strings on parse failure #4306](https://github.com/libgit2/libgit2/pull/4306) + - [git_reset_*: pass parameters as const pointers #4287](https://github.com/libgit2/libgit2/pull/4287) + - [tests: config: fix missing declaration causing error #4291](https://github.com/libgit2/libgit2/pull/4291) + - [Convert port with htons() in p_getaddrinfo() #4280](https://github.com/libgit2/libgit2/pull/4280) + - [Out of tree builds #4235](https://github.com/libgit2/libgit2/pull/4235) + - [cmake: Permit disabling external http-parser #4278](https://github.com/libgit2/libgit2/pull/4278) + - [merge: fix potential free of uninitialized memory #4277](https://github.com/libgit2/libgit2/pull/4277) + - [merge: perform exact rename detection in linear time #4202](https://github.com/libgit2/libgit2/pull/4202) + - [travis: upgrade container to Ubuntu 14.04 #4211](https://github.com/libgit2/libgit2/pull/4211) + - [Fix template dir empty string #4273](https://github.com/libgit2/libgit2/pull/4273) + - [adding GIT_FILTER_VERSION to GIT_FILTER_INIT as part of convention #4267](https://github.com/libgit2/libgit2/pull/4267) + - [travis: replace use of deprecated homebrew/dupes tap #4268](https://github.com/libgit2/libgit2/pull/4268) + - [Test improvements #4269](https://github.com/libgit2/libgit2/pull/4269) + - [Read prefix tests #4265](https://github.com/libgit2/libgit2/pull/4265) + - [Allow creation of a configuration object in an in-memory repository #4263](https://github.com/libgit2/libgit2/pull/4263) + - [travis: install openssl explicitly #4266](https://github.com/libgit2/libgit2/pull/4266) + - [smart_protocol: fix parsing of server ACK responses #4261](https://github.com/libgit2/libgit2/pull/4261) + - [odb_read_prefix: reset error in backends loop #4264](https://github.com/libgit2/libgit2/pull/4264) + - [Update version number to 0.26 #4262](https://github.com/libgit2/libgit2/pull/4262) + - [CHANGELOG: add various changes introduced since v0.25 #4254](https://github.com/libgit2/libgit2/pull/4254) + - [Ensure packfiles with different contents have different names #4088](https://github.com/libgit2/libgit2/pull/4088) + - [Update to forced checkout and untracked files #4260](https://github.com/libgit2/libgit2/pull/4260) + - [settings: rename `GIT_OPT_ENABLE_SYNCHRONOUS_OBJECT_CREATION` #4259](https://github.com/libgit2/libgit2/pull/4259) + - [Buffer growing cleanups #4255](https://github.com/libgit2/libgit2/pull/4255) + - [Coverity fixes #4253](https://github.com/libgit2/libgit2/pull/4253) + - [SHA1DC update #4258](https://github.com/libgit2/libgit2/pull/4258) + - [Fix path computations for compressed index entries #4236](https://github.com/libgit2/libgit2/pull/4236) + - [(Temporarily) disable UNC tests #4256](https://github.com/libgit2/libgit2/pull/4256) + - [fix build with libressl #4251](https://github.com/libgit2/libgit2/pull/4251) + - [Fix issue with directory glob ignore in subdirectories #4239](https://github.com/libgit2/libgit2/pull/4239) + - [Submodule working directory #4243](https://github.com/libgit2/libgit2/pull/4243) + - [Introduce home directory expansion function for config files, attribute files #4179](https://github.com/libgit2/libgit2/pull/4179) + - [Fix proxy auto detect not utilizing callbacks #4097](https://github.com/libgit2/libgit2/pull/4097) + - [git_repository_set_head: use tag name in reflog #4174](https://github.com/libgit2/libgit2/pull/4174) + - [revparse: support open-ended ranges #4231](https://github.com/libgit2/libgit2/pull/4231) + - [Fix GCC warnings #4240](https://github.com/libgit2/libgit2/pull/4240) + - [Update README: VS -> VSTS #4238](https://github.com/libgit2/libgit2/pull/4238) + - [tests: repo: fix repo discovery tests on overlayfs #4232](https://github.com/libgit2/libgit2/pull/4232) + - [libssh2 shutdown #4229](https://github.com/libgit2/libgit2/pull/4229) + - [WIP: squash some memleaks #4226](https://github.com/libgit2/libgit2/pull/4226) + - [Verify object hashes #4197](https://github.com/libgit2/libgit2/pull/4197) + - [transport: provide a getter for the proxy options #4206](https://github.com/libgit2/libgit2/pull/4206) + - [Debian HTTPS feature test failure #4216](https://github.com/libgit2/libgit2/pull/4216) + - [Do not free config when creating remote #4224](https://github.com/libgit2/libgit2/pull/4224) + - [socket_stream: continue to next addrinfo on socket creation failure #4219](https://github.com/libgit2/libgit2/pull/4219) + - [Honor read-only flag when writing to config backends #4217](https://github.com/libgit2/libgit2/pull/4217) + - [diff_parse: free object instead of its pointer #4215](https://github.com/libgit2/libgit2/pull/4215) + +#### Included non-merged libgit2 PRs: + + - [Parallelize checkout_create_the_new for ntfs perf gains #4205](https://github.com/libgit2/libgit2/pull/4205) + - [negotiate always fails via libcurl #4126](https://github.com/libgit2/libgit2/pull/4126) + + +## v0.19.0 [(2017-04-20)](https://github.com/nodegit/nodegit/releases/tag/v0.19.0) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.18.0...v0.19.0) + +#### Summary of changes outside of libgit2 bump: + - You can now convert tree entries in blobs [PR #1272](https://github.com/nodegit/nodegit/pull/1272) + +#### Included merged libgit2 PRs: + + - [fileops: fix leaking fd in `mmap_ro_file` #4201](https://github.com/libgit2/libgit2/pull/4201) + - [README: document our relation to changes in upstream #4198](https://github.com/libgit2/libgit2/pull/4198) + - [filter: only close filter if it's been initialized correctly #4196](https://github.com/libgit2/libgit2/pull/4196) + - [Fix building against OpenSSL v1.1 #4195](https://github.com/libgit2/libgit2/pull/4195) + - [pkgconfig: fix handling of prefixes containing whitespaces #4193](https://github.com/libgit2/libgit2/pull/4193) + - [Refactor some of the win32 POSIX emulation #4192](https://github.com/libgit2/libgit2/pull/4192) + - [Correct non-existent file references in `odb.h` #4188](https://github.com/libgit2/libgit2/pull/4188) + - [Coverity #4183](https://github.com/libgit2/libgit2/pull/4183) + - [git_treebuilder_write_with_buffer refactorings #4182](https://github.com/libgit2/libgit2/pull/4182) + - [Fix memory leaks #4180](https://github.com/libgit2/libgit2/pull/4180) + - [sha1dc: perf improvements from upstream #4178](https://github.com/libgit2/libgit2/pull/4178) + - [inet_pton: don't assume addr families don't exist #4176](https://github.com/libgit2/libgit2/pull/4176) + - [git_futils: don't O_EXCL and O_TRUNC #4175](https://github.com/libgit2/libgit2/pull/4175) + - [Fix the documentation for git_cred_acquire_cb #4172](https://github.com/libgit2/libgit2/pull/4172) + - [Fix typo in remote.h API #4171](https://github.com/libgit2/libgit2/pull/4171) + - [Fix resolving absolute symlinks (on at least Win32) #4169](https://github.com/libgit2/libgit2/pull/4169) + - [Coverity fixes #4167](https://github.com/libgit2/libgit2/pull/4167) + - [Remove `map_free` macros #4166](https://github.com/libgit2/libgit2/pull/4166) + - [Worktree fixes #4163](https://github.com/libgit2/libgit2/pull/4163) + - [merge_driver: fix const-correctness for source getters #4162](https://github.com/libgit2/libgit2/pull/4162) + - [submodule: catch when submodule is not staged on update #4161](https://github.com/libgit2/libgit2/pull/4161) + - [Diff fixes #4160](https://github.com/libgit2/libgit2/pull/4160) + - [Skip uninteresting commits in revwalk timesort iterator #4157](https://github.com/libgit2/libgit2/pull/4157) + - [git_futils_readbuffer: don't compute sha-1 #4156](https://github.com/libgit2/libgit2/pull/4156) + - [Support namespaced references again #4154](https://github.com/libgit2/libgit2/pull/4154) + - [rebase: ignore untracked files in submodules #4151](https://github.com/libgit2/libgit2/pull/4151) + - [git_commit_create: freshen tree objects in commit #4150](https://github.com/libgit2/libgit2/pull/4150) + - [cmake: only enable supported compiler warning flags #4148](https://github.com/libgit2/libgit2/pull/4148) + - [winhttp: disambiguate error messages when sending requests #4146](https://github.com/libgit2/libgit2/pull/4146) + - [tests: refs::create: fix memory leak #4145](https://github.com/libgit2/libgit2/pull/4145) + - [Fix: make reflog include \"(merge)\" for merge commits #4143](https://github.com/libgit2/libgit2/pull/4143) + - [Fix minor typos in CONVENTIONS.md #4142](https://github.com/libgit2/libgit2/pull/4142) + - [Fix inet_pton tests triggering an assert in Haiku #4141](https://github.com/libgit2/libgit2/pull/4141) + - [README: Mention how to run tests #4139](https://github.com/libgit2/libgit2/pull/4139) + - [tests: Add create__symbolic_with_arbitrary_content #4138](https://github.com/libgit2/libgit2/pull/4138) + - [appveyor: don't rewrite the system mingw #4137](https://github.com/libgit2/libgit2/pull/4137) + - [Introduce (optional) SHA1 collision attack detection #4136](https://github.com/libgit2/libgit2/pull/4136) + - [Provide error on gcc < 4.1 when THREADSAFE #4135](https://github.com/libgit2/libgit2/pull/4135) + - [fix regression from #4092 #4133](https://github.com/libgit2/libgit2/pull/4133) + - [Attrcache cleanups #4131](https://github.com/libgit2/libgit2/pull/4131) + - [Improve clar messages #4130](https://github.com/libgit2/libgit2/pull/4130) + - [Minor comment fix #4127](https://github.com/libgit2/libgit2/pull/4127) + - [refdb: catch additional per-worktree refs #4124](https://github.com/libgit2/libgit2/pull/4124) + - [Signature cleanups #4122](https://github.com/libgit2/libgit2/pull/4122) + - [Changes to provide option to turn off/on ofs_delta #4115](https://github.com/libgit2/libgit2/pull/4115) + - [khash cleanups #4092](https://github.com/libgit2/libgit2/pull/4092) + - [fsync all the things #4030](https://github.com/libgit2/libgit2/pull/4030) + - [Worktree implementation #3436](https://github.com/libgit2/libgit2/pull/3436) + +#### Included non-merged libgit2 PRs: + + - [Parallelize checkout_create_the_new for ntfs perf gains #4205](https://github.com/libgit2/libgit2/pull/4205) + - [negotiate always fails via libcurl #4126](https://github.com/libgit2/libgit2/pull/4126) + - [Fix proxy auto detect not utilizing callbacks #4097](https://github.com/libgit2/libgit2/pull/4097) + +## v0.18.0 [(2017-02-28)](https://github.com/nodegit/nodegit/releases/tag/v0.18.0) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.17.0...v0.18.0) + +### API Changes + + - All callbacks that go to libgit2 now have an optional `waitForResult` flag that can be `true`/`false`. Defaults to false. When true it will not stop libgit2 from continuing on before the JS code is fully executed and resolved (in cases of a Promise). This is useful for progress callbacks (like fetching) where the bubbling up of the progress to JS doesn't really need the C/C++ code to wait for the JS code to fully handle the event before continuing. This can have serious performance implications for many callbacks that can be fired quite frequently. + - `given_opts` in `Revert.revert` are now optional + - `checkout_opts` in `Reset.fromAnnotated` and `Reset.reset` are now optional + - `Reset.fromAnnotated` is now async + - `message` on `Stash.save` is now optional + - Added `processMergeMessageCallback` on `Repository#mergeBranches` to allow for custom merge messages + - Add `beforeFinishFn` to `Repository#rebaseBranches` and `Repository#continueRebase`. This is called before the invocation of `finish()`. If the callback returns a promise, `finish()` will be called when the promise resolves. The `beforeFinishFn` will be called with an object that has on it: + - `ontoName` The name of the branch that we rebased onto + - `ontoSha` The sha that we rebased onto + - `originalHeadName` The name of the branch that we rebased + - `originalHeadSha` The sha of the branch that was rebased + - `rewitten` which is an array of sha pairs that contain which contain what the commit sha was before the rebase and what the commit sha is after the rebase + +### Summary of Changes from bumping libgit2 to 43275f5 + +[PR #1123](https://github.com/nodegit/nodegit/pull/1223) bumped libgit2 which brought in many changes and bug fixes. + +#### Included merged libgit2 PRs: + + - [Use a shared buffer in calls of git_treebuilder_write to avoid heap contention #3892](https://github.com/libgit2/libgit2/pull/3892) + - [WinHTTP: set proper error messages when SSL fails #4050](https://github.com/libgit2/libgit2/pull/4050) + - [Clang analyzer run #4051](https://github.com/libgit2/libgit2/pull/4051) + - [Extend packfile in increments of page_size. #4053](https://github.com/libgit2/libgit2/pull/4053) + - [Fix general example memory leaks #4078](https://github.com/libgit2/libgit2/pull/4078) + - [WIP: some coverity & compiler warning fixes #4086](https://github.com/libgit2/libgit2/pull/4086) + - [Fix a few recent warnings #4087](https://github.com/libgit2/libgit2/pull/4087) + - [Fix uninitialized variable warning #4095](https://github.com/libgit2/libgit2/pull/4095) + - [Update docs for git_oid_fromstrn and p #4096](https://github.com/libgit2/libgit2/pull/4096) + - [Fix digest credentials for proxy in windows #4104](https://github.com/libgit2/libgit2/pull/4104) + - [Vector reverse overflow #4105](https://github.com/libgit2/libgit2/pull/4105) + - [Flag given_opts in git_revert as optional #4108](https://github.com/libgit2/libgit2/pull/4108) + - [Flag checkout_opts in git_reset as optional #4109](https://github.com/libgit2/libgit2/pull/4109) + - [dirname with DOS prefixes #4111](https://github.com/libgit2/libgit2/pull/4111) + - [Add support for lowercase proxy environment variables #4112](https://github.com/libgit2/libgit2/pull/4112) + - [Flag options in git_stash_apply and git_stash_pop as being optional #4117](https://github.com/libgit2/libgit2/pull/4117) + - [rename detection: don't try to detect submodule renames #4119](https://github.com/libgit2/libgit2/pull/4119) + - [tests: fix permissions on testrepo.git index file #4121](https://github.com/libgit2/libgit2/pull/4121) + +#### Included non-merged libgit2 PRs: + + - [negotiate always fails via libcurl #4126](https://github.com/libgit2/libgit2/pull/4126) + - [Fix proxy auto detect not utilizing callbacks #4097](https://github.com/libgit2/libgit2/pull/4097) + +### Summary of Changes to NodeGit outside of libgit2 bump + + - Don't overwrite C++ files for things that haven't changed [PR #1091](https://github.com/nodegit/nodegit/pull/1091) + - Add the option to "fire and forget" callbacks so libgit2 doesn't wait for JS to finish before proceeding [PR #1208](https://github.com/nodegit/nodegit/pull/1208) + - Send back the error code from libgit2 when a call fails [PR #1209](https://github.com/nodegit/nodegit/pull/1209) + - Initialize pointers to null [PR #1210](https://github.com/nodegit/nodegit/pull/1210) + - Replace Gitter with Slack [PR #1212](https://github.com/nodegit/nodegit/pull/1212) + - Make `given_opts` in `Revert.revert` optional [PR #1213](https://github.com/nodegit/nodegit/pull/1213) + - Make `Reset.fromAnnotated` async and `checkout_opts` optional [PR #1214](https://github.com/nodegit/nodegit/pull/1214) + - Make `message` on `Stash.save` optional [PR #1215](https://github.com/nodegit/nodegit/pull/1215) + - Add `Remote.ls` to NodeGit [PR #1218](https://github.com/nodegit/nodegit/pull/1218) + - Add `processMergeMessageCallback` to `Repository#mergeBranches` to allow for custom merge messages [PR #1219](https://github.com/nodegit/nodegit/pull/1219) + - Bump libgit2 to 43275f5 [PR #1223](https://github.com/nodegit/nodegit/pull/1223) from srajko/bump-libgit + - Provide rebase details on finish [PR #1224](https://github.com/nodegit/nodegit/pull/1224) + - Use wider int to calculate throttle window [PR #1232](https://github.com/nodegit/nodegit/pull/1232) + - Update comment to reflect the correct path for generated code output [PR #1236](https://github.com/nodegit/nodegit/pull/1236) + - Remove nwjs example from the docs [PR #1238](https://github.com/nodegit/nodegit/pull/1238) + - Remove `sudo` requirement from linux 32-bit builds [PR #1241](https://github.com/nodegit/nodegit/pull/1241) + +## v0.17.0 [(2017-01-06)](https://github.com/nodegit/nodegit/releases/tag/v0.17.0) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.16.0...v0.17.0) + +### Targeted Platform Changes + +In this release we had added support for Node v7 and latest Electron. We have removed support for Node v0.12 and v5. + +We are also deprecating nw.js support since it is currently broken, no one in the current team uses it and we would not be able to currently support nw.js in an effective manner with a good user experience. + +### Now building against shared libcurl lib + +For proxy support we now use libcurl for HTTP/HTTPS transport which should have no noticeable change in NodeGit remote operations but if changes are noticed this is worth mentioning as a potential source. + +### Memory leak fixes and stability increases + +Many PR's were made to fix memory leaks as they were found so memory usage should go down in this version for long running scripts. Additionally, when performing operations with callbacks (transfer progress, credentials, etc...) there was a small chance for a segfault when NodeGit would schedule the callback to go into JavaScript. This is now fixed. + +### Fixes to the build + +Many users, especially on windows, were experiencing errors during the build. The build still isn't perfect but a lot of the bugs were fixed. + +### Bump libgit2 to 0bf0526 + +The majority of changes to NodeGit v17 were in libgit2. The API breaking changes that are known are: + +- `RevWalk` is returning different results [libgit2 PR #3921](https://github.com/libgit2/libgit2/pull/3921) +- Changes in error messages returned [libgit2 PR #4049](https://github.com/libgit2/libgit2/pull/4049) + +Summary of changes that were brought in: + +https://github.com/nodegit/nodegit/pull/1187#issuecomment-277760323 + +### Changes to NodeGit outside of libgit2 bump + +- Define GIT_SSH_MEMORY_CREDENTIALS for libgit2 [PR #949](https://github.com/nodegit/nodegit/pull/949) +- Add "Path" to ssh variable names in tests for clarity [PR #1135](https://github.com/nodegit/nodegit/pull/1135) +- Fix revwalk memory leaks [PR #1137](https://github.com/nodegit/nodegit/pull/1137) +- Fix tree entry leaks [PR #1138](https://github.com/nodegit/nodegit/pull/1138) +- Fix typo in postinstall script [PR #1141](https://github.com/nodegit/nodegit/pull/1141) +- Fix windows exception handling in build [PR #1143](https://github.com/nodegit/nodegit/pull/1143) +- Fix CI failures on node 0.12 [PR #1144](https://github.com/nodegit/nodegit/pull/1144) +- Fix postinstall script crash when install location has spaces in its path [PR #1148](https://github.com/nodegit/nodegit/pull/1148) +- Update 0.13 changelog [PR #1151](https://github.com/nodegit/nodegit/pull/1151) +- Minor documentation fix in Checkout.index [PR #1164](https://github.com/nodegit/nodegit/pull/1164) +- FreeBSD also uses struct timespec st_mtim [PR #1165](https://github.com/nodegit/nodegit/pull/1165) +- README.md needs to show where to get Slack invitation [PR #1170](https://github.com/nodegit/nodegit/pull/1170) +- Add @async tag to `Tree#getEntry` [PR #1178](https://github.com/nodegit/nodegit/pull/1178) +- Fix incorrect anchor link in TESTING.md [PR #1179](https://github.com/nodegit/nodegit/pull/1179) +- Added tests for Tag [PR #1180](https://github.com/nodegit/nodegit/pull/1180) +- Added tests for Branch [PR #1181](https://github.com/nodegit/nodegit/pull/1181) +- Escape the spaces in dir for shell command [PR #1186](https://github.com/nodegit/nodegit/pull/1186) +- Bump libgit to 0bf0526 [PR #1187](https://github.com/nodegit/nodegit/pull/1187) +- Checkout's tree* functions do not support Oid as a parameter [PR #1190](https://github.com/nodegit/nodegit/pull/1190) +- Build against shared library for libcurl [PR #1195](https://github.com/nodegit/nodegit/pull/1195) +- Move libuv calls to correct thread [PR #1197](https://github.com/nodegit/nodegit/pull/1197) +- Update `Repository#createBranch` docs [PR #1198](https://github.com/nodegit/nodegit/pull/1198) +- Remove Node v0.12 and v5 [PR #1199](https://github.com/nodegit/nodegit/pull/1199) +- Specify acceptable types for `lookup` and `dwim` in Reference [PR #1203](https://github.com/nodegit/nodegit/pull/1203) +- Build for Node 7.4.0 [PR #1204](https://github.com/nodegit/nodegit/pull/1204) +- Write the index to a repository directly in merge-cleanly.js examples [PR #1205](https://github.com/nodegit/nodegit/pull/1205) + +## v0.16.0 [(2016-09-15)](https://github.com/nodegit/nodegit/releases/tag/v0.16.0) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.15.1...v0.16.0) + +- Bump libssh2 to 1.7.0 [PR #1071](https://github.com/nodegit/nodegit/pull1071) +- Js cleanup [PR #1074](https://github.com/nodegit/nodegit/pull1074) +- Expose merge options and diff flags [PR #1076](https://github.com/nodegit/nodegit/pull1076) +- Fix Tree#entryByName function and add test [PR #1079](https://github.com/nodegit/nodegit/pull1079) +- Add isSubmodule() method [PR #1080](https://github.com/nodegit/nodegit/pull1080) +- Fix two typos in the documentation for Commit#parents [PR #1081](https://github.com/nodegit/nodegit/pull1081) +- Memory management: duplicate time [PR #1090](https://github.com/nodegit/nodegit/pull1090) +- Preempt nan to fix deprecated calls to Get/SetHiddenValue [PR #1106](https://github.com/nodegit/nodegit/pull1106) +- Try re-enabling node >6.2 [PR #1107](https://github.com/nodegit/nodegit/pull1107) +- Bump openssl to 1.0.2h (same as node 6.3.1) [PR #1108](https://github.com/nodegit/nodegit/pull1108) +- Don't run postbuild when we detect electron install [PR #1111](https://github.com/nodegit/nodegit/pull1111) +- Added instructions for CircleCI users [PR #1113](https://github.com/nodegit/nodegit/pull1113) +- Fix up electron and nw.js docs [PR #1114](https://github.com/nodegit/nodegit/pull1114) +- Patch libssh2 to work with vs2015 [PR #1125](https://github.com/nodegit/nodegit/pull1125) +- Fix CI [PR #1126](https://github.com/nodegit/nodegit/pull1126) + + +## v0.15.1 [(2016-06-20)](https://github.com/nodegit/nodegit/releases/tag/v0.15.1) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.15.0...v0.15.1) + +- Fix postinstall breaking build if it fails. + +## v0.14.1 [(2016-06-20)](https://github.com/nodegit/nodegit/releases/tag/v0.14.1) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.14.0...v0.14.1) + +- Fix postinstall breaking build if it fails. + +## v0.15.0 [(2016-06-20)](https://github.com/nodegit/nodegit/releases/tag/v0.15.0) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.14.0...v0.15.0) + +- Update to libgit2 @ 37dba1a [PR #1041](https://github.com/nodegit/nodegit/pull/1041) + +This updates NodeGit to use the latest `HEAD` version of libgit2. The plan for staying on the official tagged releases of libgit2 is that they will get a maintenance branch and not-breaking API fixes will be backported to them. The first branch of this sort is `maint/0.14`. Going forward new releases of NodeGit will follow closely to the `master` branch of libgit2. + +Summary of changes that were brought in: + +https://github.com/libgit2/libgit2/commit/37dba1a739b5ee6c45dc9f3c0bd1f7f7a18f13f7 +------- + +### Changes or improvements + +* `NodeGit.FetchOptions`, and `NodeGit.PushOptions` now have a `proxyOpts` field that accepts a `NodeGit.ProxyOptions` object that allows NodeGit to use a proxy for all remote communication + +* `NodeGit.MergeOptions` has a `defaultDriver` field that lets the caller change the driver used to when both sides of a merge have changed + +### API additions + +* `Commit.createWithSignature` allows the caller to create a signed commit. There are no tests for this currently so it's labelled experimental. + +* `Blob`, `Commit`, `Tag`, and `Tree` all have a new prototype `dup` method on them to make a low-level copy of the libgit2 object if needed. + +* `Odb#expandIds` is exposed which takes in a list of short ids and expands them in-place to the full id of the object in the database + +## v0.14.0 [(2016-06-20)](https://github.com/nodegit/nodegit/releases/tag/v0.14.0) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.13.2...v0.14.0) + +- Improve lifecycle scripts and install process [PR #1055](https://github.com/nodegit/nodegit/pull/1055) +- Fix example code [PR #1058](https://github.com/nodegit/nodegit/pull/1058) + +## v0.13.2 [(2016-06-09)](https://github.com/nodegit/nodegit/releases/tag/v0.13.2) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.13.1...v0.13.2) + +- Stop `RevWalk#walk` from swallowing errors in the callback [PR #1047](https://github.com/nodegit/nodegit/pull/1047) +- Stop swallowing errors in the install script [PR #1048](https://github.com/nodegit/nodegit/pull/1048) +- Fix initializing submodules when installing from npm [PR #1050](https://github.com/nodegit/nodegit/pull/1050) + +## v0.13.1 [(2016-06-03)](https://github.com/nodegit/nodegit/releases/tag/v0.13.1) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.13.0...v0.13.1) + +## Added + +- `Repository#discardLines` is now a thing [PR #1021](https://github.com/nodegit/nodegit/pull/1021) + +## Modified + +- Async methods now use a custom threadpool to prevent thread-locking the event loop [PR #1019](https://github.com/nodegit/nodegit/pull/1019) + +## Bug fixes + +- Fix building NodeGit from NPM [PR #1026](https://github.com/nodegit/nodegit/pull/1026) +- Plug a memory leak in `RevWalk.fastWalk` [PR #1030](https://github.com/nodegit/nodegit/pull/1030) +- Plug a memory leak with `Oid` [PR #1033](https://github.com/nodegit/nodegit/pull/1033) +- Fixed some underlying libgit2 objects getting freed incorrectly [PR #1036](https://github.com/nodegit/nodegit/pull/1036) + +## v0.13.0 [(2016-05-04)](https://github.com/nodegit/nodegit/releases/tag/v0.13.0) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.12.2...v0.13.0) + +## Summary + +This is a big update! Lots of work was done to bring NodeGit up to the latest stable libgit2 version (v0.24.1), to use babel in the library, to make it more stable, remove memory leaks, squash bugs and in general just improve the library for all. Make sure to see all of the API changes below (there are a lot). + +## Node support + +We have added Node 6 as a supported platform! Going forward we aim to have 1:1 support for versions of Node that are either current or LTS. That means that v0.12 will not be supported soon so if you're on that please upgrade to at least Node v4. Also Node v5 will *NOT* be LTS so when Node stops supporting that in the coming months we will as well. You can read more about the current Node upgrade plan [here](https://nodejs.org/en/blog/release/v6.0.0/). + +## API Changes +------- + +### Modified + +- `Index#add`, `Index#addByPath`, `Index#clear`, `Index#conflictAdd`, `Index#conflictCleanup`, `Index#conflictGet`, `Index#conflictRemove`, `Index.open`, `Index#read`, `Index#readTree`, `Index#remove`, `Index#removeByPath`, `Index#removeDirectory`, `Index#read`, `Index#write`, `Index#writeTree`, and `Index#writeTreeTo` are all now asynchronous functions [PR #971](https://github.com/nodegit/nodegit/pull/971) +- Made `ancestoryEntry`, `outEntry` and `theirEntry` optional parameters on `Index#conflictAdd` [PR #997](https://github.com/nodegit/nodegit/pull/997) +- `Repository#refreshIndex` will return an Index object back that has the latest data loaded off of disk [PR #986](https://github.com/nodegit/nodegit/pull/986) +- `Commit.create` is now asynchronous [PR #1022](https://github.com/nodegit/nodegit/pull/1022) +- `Remote.create` is now asynchronous [PR #990](https://github.com/nodegit/nodegit/pull/990) + +### Added + +- `Diff#merge` will combine a diff into itself [PR #1000](https://github.com/nodegit/nodegit/pull/1000) +- `ReflogEntry#committer`, `ReflogEntry#idNew`, `ReflogEntry#idOld`, and `ReflogEntry#message` have been added +[PR #1013](https://github.com/nodegit/nodegit/pull/1013) + +### Removed + +- `Repository#openIndex` [PR #989](https://github.com/nodegit/nodegit/pull/989), use `Repository#index` or `Repository#refreshIndex` instead +- `Reflog#entryCommitter`, `Reflog#entryIdNew`, `Reflog#entryIdOld`, and `Reflog#entryMessage` have been moved to be under `ReflogEntry` +[PR #1013](https://github.com/nodegit/nodegit/pull/1013) + +### Bug fixes + +- `Branch.name` works now [PR #991](https://github.com/nodegit/nodegit/pull/991) +- Fixed a crash with callbacks from libgit2 [PR #944](https://github.com/nodegit/nodegit/pull/944) +- Fixed a crash in `Tree#entryByName` [PR #998](https://github.com/nodegit/nodegit/pull/998) +- More memory leaks have been plugged [PR #1005](https://github.com/nodegit/nodegit/pull/1005), [PR #1006](https://github.com/nodegit/nodegit/pull/1006), [PR #1014](https://github.com/nodegit/nodegit/pull/1014), and [PR #1015](https://github.com/nodegit/nodegit/pull/1015) +- `Commit#getDiffWithOptions` now actually passes the options correctly [PR #1008](https://github.com/nodegit/nodegit/pull/1008) + +## Upgraded to libgit2 v0.24.1 [PR #1010](https://github.com/nodegit/nodegit/pull/1010) +------- + +### Changes or improvements + +- Custom merge drivers can now be registered, which allows callers to + configure callbacks to honor `merge=driver` configuration in + `.gitattributes`. + +- Custom filters can now be registered with wildcard attributes, for + example `filter=*`. Consumers should examine the attributes parameter + of the `check` function for details. + +- Symlinks are now followed when locking a file, which can be + necessary when multiple worktrees share a base repository. + +- You can now set your own user-agent to be sent for HTTP requests by + using the `Libgit2.OPT.SET_USER_AGENT` with `Libgit2.opts()`. + +- You can set custom HTTP header fields to be sent along with requests + by passing them in the fetch and push options. + +- Tree objects are now assumed to be sorted. If a tree is not + correctly formed, it will give bad results. This is the git approach + and cuts a significant amount of time when reading the trees. + +- Filter registration is now protected against concurrent + registration. + +- Filenames which are not valid on Windows in an index no longer cause + to fail to parse it on that OS. + +- Rebases can now be performed purely in-memory, without touching the + repository's workdir. + +- When adding objects to the index, or when creating new tree or commit + objects, the inputs are validated to ensure that the dependent objects + exist and are of the correct type. This object validation can be + disabled with the `Libgit2.OPT.ENABLE_STRICT_OBJECT_CREATION` option. + +- The WinHTTP transport's handling of bad credentials now behaves like + the others, asking for credentials again. + +### API additions + +- `Blob.createFromStream()` and + `Blob.createFromStreamCommit` allow you to create a blob by + writing into a stream. Useful when you do not know the final size or + want to copy the contents from another stream. + +- `Config#lock` has been added, which allow for + transactional/atomic complex updates to the configuration, removing + the opportunity for concurrent operations and not committing any + changes until the unlock. + +- `DiffOptions` added a new callback `progress_cb` to report on the + progress of the diff as files are being compared. The documentation of + the existing callback `notify_cb` was updated to reflect that it only + gets called when new deltas are added to the diff. + +- `FetchOptions` and `PushOptions` have gained a `customHeaders` + field to set the extra HTTP header fields to send. + +- `Commit#headerField` allows you to look up a specific header + field in a commit. + +### Breaking API changes + +- `MergeOptions` now provides a `defaultDriver` that can be used + to provide the name of a merge driver to be used to handle files changed + during a merge. + +- The `Merge.TREE_FLAG` is now `Merge.FLAG`. Subsequently, + `treeFlags` field of the `MergeOptions` structure is now named `flags`. + +- The `Merge.FILE_FLAGS` enum is now `Merge.FILE_FLAG` for + consistency with other enum type names. + +- `Cert` descendent types now have a proper `parent` member + +- It is the responsibility of the refdb backend to decide what to do + with the reflog on ref deletion. The file-based backend must delete + it, a database-backed one may wish to archive it. + +- `Index#add` and `Index#conflictAdd` will now use the case + as provided by the caller on case insensitive systems. Previous + versions would keep the case as it existed in the index. This does + not affect the higher-level `Index#addByPath` or + `Index#addFromBuffer` functions. + +- The `Config.LEVEL` enum has gained a higher-priority value + `PROGRAMDATA` which represent a rough Windows equivalent + to the system level configuration. + +- `RebaseOptions` now has a `mergeOptions` field. + +- The index no longer performs locking itself. This is not something + users of the library should have been relying on as it's not part of + the concurrency guarantees. + +- `Remote#connect()` now takes a `customHeaders` argument to set + the extra HTTP header fields to send. + +- `Tree.entryFilemode`, `Tree.entryFilemodeRaw`, `Tree.entryId`, `Tree.entryName`, + `Tree.entryToObject`, and `Tree.entryType` have all been moved to the `TreeEntry` prototype. + Additionally, the `TreeEntry` fields have been removed in lieu of the corresponding functions to return + the data. + +## v0.12.2 [(2016-04-07)](https://github.com/nodegit/nodegit/releases/tag/v0.12.2) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.12.1...v0.12.2) + +## Added + +- We now provide 32-bit binaries for linux [PR #980](https://github.com/nodegit/nodegit/pull/980) + +## Bug fixes + +- Added memory clean up for references [PR #977](https://github.com/nodegit/nodegit/pull/977) and remotes [PR #981](https://github.com/nodegit/nodegit/pull/981) + +## v0.12.1 [(2016-03-30)](https://github.com/nodegit/nodegit/releases/tag/v0.12.1) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.12.0...v0.12.1) + +## Bug fixes + +- Fixed post install script dying on windows [PR #978](https://github.com/nodegit/nodegit/pull/978) + +## v0.12.0 [(2016-03-28)](https://github.com/nodegit/nodegit/releases/tag/v0.12.0) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.11.9...v0.12.0) + +## API changes +- `Ignore` + - Made `Ignore.pathIsIgnored` async [PR #970](https://github.com/nodegit/nodegit/pull/970) + +## Bug fixes + +- Added an error message when trying to install NodeGit without a required version of libstdc++ [PR #972](https://github.com/nodegit/nodegit/pull/972) +- Fix a crash when grabbing content out of a buffer that has unicode [PR #966](https://github.com/nodegit/nodegit/pull/966) +- Added some plumbing for better memory management [PR #958](https://github.com/nodegit/nodegit/pull/958) +- Fix `checkoutOptions` in `Stash#apply` [PR #956](https://github.com/nodegit/nodegit/pull/956) +- Fixed install when there is a space in the username on windows [PR #951](https://github.com/nodegit/nodegit/pull/951) +- Bump to nan@2.2.0 [PR #952](https://github.com/nodegit/nodegit/pull/952) + +## v0.11.9 [(2016-03-09)](https://github.com/nodegit/nodegit/releases/tag/v0.11.9) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.11.8...v0.11.9) + +- Fixed crash when calculating diff via `ConvenientPatch` [PR #945](https://github.com/nodegit/nodegit/pull/945) + +## v0.11.8 [(2016-03-07)](https://github.com/nodegit/nodegit/releases/tag/v0.11.8) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.11.7...v0.11.8) + +- Removed callback throttling due to segmentation faults. Will be implemented later. [PR #943](https://github.com/nodegit/nodegit/pull/943) + +## v0.11.7 [(2016-03-07)](https://github.com/nodegit/nodegit/releases/tag/v0.11.7) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.11.6...v0.11.7) + +- Added `Repository#mergeheadForeach` [PR #937](https://github.com/nodegit/nodegit/pull/937) +- Improved speed of all callbacks dramatically [PR #932](https://github.com/nodegit/nodegit/pull/932) +- Fixed `Merge.merge` docs to show it takes in an `AnnotatedCommit` and not a `Commit` [PR #935](https://github.com/nodegit/nodegit/pull/935) +- Fixed unicode in `Diff.blobToBuffer` getting corrupted [PR #935](https://github.com/nodegit/nodegit/pull/935) +- Fixed fetching/pulling to bitbucket in versions > v5.6 of node [PR #942](https://github.com/nodegit/nodegit/pull/942) + +## v0.11.6 [(2016-03-01)](https://github.com/nodegit/nodegit/releases/tag/v0.11.6) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.11.5...v0.11.6) + +- Added `Repository#checkoutRef` [PR #891](https://github.com/nodegit/nodegit/pull/891) +- `Repository#createCommitOnHead` no longer dies if the repo is empty [PR #927](https://github.com/nodegit/nodegit/pull/927) +- Fixed memory leak in `Patch#convenientFromDiff` [PR #930](https://github.com/nodegit/nodegit/pull/930) +- Generated files now have a header comment indicating that they are generated [PR #924](https://github.com/nodegit/nodegit/pull/924) +- Fixed http parsing errors in Node 5.6 [PR #931](https://github.com/nodegit/nodegit/pull/931) +- Fixed `Tree#walk` not returning the correct entries on `end` [PR #929](https://github.com/nodegit/nodegit/pull/929) + +## v0.11.5 [(2016-02-25)](https://github.com/nodegit/nodegit/releases/tag/v0.11.5) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.11.4...v0.11.5) + +- Fixed crash when calculating a diff [PR #922](https://github.com/nodegit/nodegit/pull/922) +- Fixed an issue with return values getting randomly corrupted [PR #923](https://github.com/nodegit/nodegit/pull/923)) + +## v0.11.4 [(2016-02-24)](https://github.com/nodegit/nodegit/releases/tag/v0.11.4) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.11.3...v0.11.4) + +- Fixed callback out values in callbacks from C++. This affects any NodeGit call that is passed a callback as an option [PR #921](https://github.com/nodegit/nodegit/pull/921) +- Fixed an issue with building the debug version of NodeGit on windows [PR #918](https://github.com/nodegit/nodegit/pull/918) + +## v0.11.3 [(2016-02-22)](https://github.com/nodegit/nodegit/releases/tag/v0.11.3) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.11.2...v0.11.3) + +- Fixed an issue where initializing NodeGit would sometimes seg fault. Also fixed an error when fetching concurrently [PR #912](https://github.com/nodegit/nodegit/pull/912) + +## v0.11.2 [(2016-02-18)](https://github.com/nodegit/nodegit/releases/tag/v0.11.2) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.11.1...v0.11.2) + +- Fixed an issue where when staging lines if the index is locked NodeGit just nuked it [PR #906](https://github.com/nodegit/nodegit/pull/906) +- Fixed diff calculation when staging lines/hunks [PR #906](https://github.com/nodegit/nodegit/pull/906) +- Fixed seg-fault in linux that happens when getting the diff of very small files [PR #908](https://github.com/nodegit/nodegit/pull/908) +- Fixed `RevWalk#fastWalk` dying when an error happens in libgit2 [PR #909](https://github.com/nodegit/nodegit/pull/909) + +## v0.11.1 [(2016-02-09)](https://github.com/nodegit/nodegit/releases/tag/v0.11.1) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.11.0...v0.11.1) + +- Numerous fixes and perf boosts to file history [PR #900](https://github.com/nodegit/nodegit/pull/900)[PR #896](https://github.com/nodegit/nodegit/pull/896) +- Several doc fixes [PR #899](https://github.com/nodegit/nodegit/pull/899)[PR #897](https://github.com/nodegit/nodegit/pull/897) + +## v0.11.0 [(2016-02-04)](https://github.com/nodegit/nodegit/releases/tag/v0.11.0) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.10.0...v0.11.0) + +- Change `Revert.commit` and `Revert.revert` to by async. [PR #887](https://github.com/nodegit/nodegit/pull/887) +- Added `RevWalk#fileHistoryWalk` for a faster way to retrieve history for a specific file. [PR #889](https://github.com/nodegit/nodegit/pull/889) + +## v0.10.0 [(2016-02-01)](https://github.com/nodegit/nodegit/releases/tag/v0.10.0) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.9.0...v0.10.0) + +- Clean mutexes are part of GC. No longer leaves processes running after the script ends [PR #880](https://github.com/nodegit/nodegit/pull/880) +- Increased the performance of `ConvenientPatch` by an order of magnitude [PR #883](https://github.com/nodegit/nodegit/pull/883) + +# API changes +- `ConvenientPatch` + - `ConvenientPatch` does not have a `patch` or a `delta` property associated with it, if you were using the `delta`, please just use prototype methods `oldFile`, `newFile`, and `Status`, which are stripped directly from the `delta`. + - `ConvenientPatch#hunks` returns a promise with an array of `ConvenientHunks`. +- `ConvenientHunk` + - `ConvenientHunk` does not have an exposed diffHunk associated with it, but does have the same members as diffHunk: + - `size()` : number of lines in the hunk + - `oldStart()` : old starting position + - `oldLines()` : number of lines in old file + - `newStart()` : new starting position + - `newLines()` : number of lines in new file + - `headerLen()` : length of header + - `header()` : returns the header of the hunk + - `lines()` : returns a promise containing `DiffLines`, not `ConvenientLines`. +- `DiffLine` +- `DiffLine` now contains the members `rawContent()` and `content()`. + - `rawContent()` contains the unformatted content of the line. This is no longer a string from the line to the end of the file. + - `content()` contains the utf8 formatted content of the line. + +## v0.9.0 [(2016-01-21)](https://github.com/nodegit/nodegit/releases/tag/v0.9.0) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.8.0...v0.9.0) + +- Thread safe fix to stop crashing on releasing mutexes [PR #876](https://github.com/nodegit/nodegit/pull/876) +- `Submodule#setIgnore`, `Submodule#setUpdate`, and `Submodule#setUrl` are now all async. `Submodule#status` and `Submodule#location` are now available [PR #867](https://github.com/nodegit/nodegit/pull/867) and [PR #870](https://github.com/nodegit/nodegit/pull/870) +- `Remote#defaultBranch` is now available [PR #872](https://github.com/nodegit/nodegit/pull/872) +- `Repository#mergeBranches` now takes in a `MergeOptions` parameter [PR #873](https://github.com/nodegit/nodegit/pull/873) +- Remove a NodeGit specific hack to make `Index#addAll` faster since that is fixed in libgit2 [PR #875](https://github.com/nodegit/nodegit/pull/875)) + +## v0.8.0 [(2016-01-15)](https://github.com/nodegit/nodegit/releases/tag/v0.8.0) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.7.0...0.8.0) + +- Thread safe locking has been added and currently is defaulted to off. Use `NodeGit.enableThreadSafety()` to turn on +- NodeGit no longer requires a specific Promise object from the `nodegit-promise` library to be passed in. You can now use whatever you want! +- `Repository#stageFilemode` now can accept an array of strings for files to update +- `Submodule#addToIndex`, `Submodule#addFinalize`, `Submodule#init`, `Submodule#open`, `Submodule#sync`, and `Submodule#update` are now all async methodss + +## v0.7.0 [(2016-01-08)](https://github.com/nodegit/nodegit/releases/tag/v0.7.0) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.6.3...0.7.0) + +- Bumped openssl to 1.0.2e to fix issues with prebuilts on linux platforms +- Fixed a bug with GIT_ITER_OVER breaking rebase and other iterative methods +- Make GraphDescendentOf asynchronous +- Fixed line length of utf8 stringss + +## v0.6.3 [(2015-12-16)](https://github.com/nodegit/nodegit/releases/tag/v0.6.3) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.6.2...0.6.3) + + - Fixed a bug where manually building for vanilla node would fail without explicitly + setting the target + +## v0.6.2 [(2015-12-16)](https://github.com/nodegit/nodegit/releases/tag/v0.6.2) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.6.1...0.6.2) + + - Fixed a bug where manually building on windows would fail (if unable to download a prebuilt binary) + +## v0.6.1 [(2015-12-14)](https://github.com/nodegit/nodegit/releases/tag/v0.6.1) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.6.0...0.6.1) + + - Fixed Treebuilder.create to have an optional source + - Added Repository.getSubmoduleNames + - Added Submodule.Foreach + +## v0.6.0 [(2015-12-08)](https://github.com/nodegit/nodegit/releases/tag/v0.6.0) + + - Added file mode staging + - Added a fast rev walk to do the rev walk in C++ and bubble the result up to JS + - Updated to latest libgit2 + - Updated to latest openssl + - Updated to latest nodegit-promise + - Removed c++11 dependency + - Fixed weirdness in lifecycle scripts + - Added downloading prebuilt binaries for electron + +## v0.4.1 [(2015-06-02)](https://github.com/nodegit/nodegit/tree/0.4.1) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.4.0...0.4.1) @@ -64,7 +3158,7 @@ - stop cleaning on post-install [\#562](https://github.com/nodegit/nodegit/pull/562) ([maxkorp](https://github.com/maxkorp)) -## [v0.4.0](https://github.com/nodegit/nodegit/tree/v0.4.0) (2015-05-07) +## v0.4.0 [(2015-05-07)](https://github.com/nodegit/nodegit/tree/v0.4.0) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.3.3...v0.4.0) @@ -192,7 +3286,7 @@ - Add automatically generated change log file. [\#465](https://github.com/nodegit/nodegit/pull/465) ([skywinder](https://github.com/skywinder)) -## [v0.3.3](https://github.com/nodegit/nodegit/tree/v0.3.3) (2015-03-16) +## v0.3.3 [(2015-03-16)](https://github.com/nodegit/nodegit/tree/v0.3.3) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.3.2...v0.3.3) @@ -200,7 +3294,7 @@ - Download all dev dependencies before build [\#491](https://github.com/nodegit/nodegit/pull/491) ([johnhaley81](https://github.com/johnhaley81)) -## [v0.3.2](https://github.com/nodegit/nodegit/tree/v0.3.2) (2015-03-16) +## v0.3.2 [(2015-03-16)](https://github.com/nodegit/nodegit/tree/v0.3.2) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.3.1...v0.3.2) @@ -212,7 +3306,7 @@ - Confirm builder exists before building [\#490](https://github.com/nodegit/nodegit/pull/490) ([johnhaley81](https://github.com/johnhaley81)) -## [v0.3.1](https://github.com/nodegit/nodegit/tree/v0.3.1) (2015-03-14) +## v0.3.1 [(2015-03-14)](https://github.com/nodegit/nodegit/tree/v0.3.1) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.3.0...v0.3.1) @@ -220,7 +3314,7 @@ - Revert node-pre-gyp to install not build [\#486](https://github.com/nodegit/nodegit/pull/486) ([tbranyen](https://github.com/tbranyen)) -## [v0.3.0](https://github.com/nodegit/nodegit/tree/v0.3.0) (2015-03-13) +## v0.3.0 [(2015-03-13)](https://github.com/nodegit/nodegit/tree/v0.3.0) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.2.7...v0.3.0) @@ -430,11 +3524,11 @@ - Enable transfer progress [\#325](https://github.com/nodegit/nodegit/pull/325) ([tbranyen](https://github.com/tbranyen)) -## [v0.2.7](https://github.com/nodegit/nodegit/tree/v0.2.7) (2015-01-21) +## v0.2.7 [(2015-01-21)](https://github.com/nodegit/nodegit/tree/v0.2.7) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.2.6...v0.2.7) -## [v0.2.6](https://github.com/nodegit/nodegit/tree/v0.2.6) (2015-01-20) +## v0.2.6 [(2015-01-20)](https://github.com/nodegit/nodegit/tree/v0.2.6) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.2.5...v0.2.6) @@ -442,7 +3536,7 @@ - \[WIP\] Added in some diff functions from libgit2 [\#348](https://github.com/nodegit/nodegit/pull/348) ([johnhaley81](https://github.com/johnhaley81)) -## [v0.2.5](https://github.com/nodegit/nodegit/tree/v0.2.5) (2015-01-20) +## v0.2.5 [(2015-01-20)](https://github.com/nodegit/nodegit/tree/v0.2.5) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.2.4...v0.2.5) @@ -508,7 +3602,7 @@ - moving some deps to devdeps [\#320](https://github.com/nodegit/nodegit/pull/320) ([maxkorp](https://github.com/maxkorp)) -## [v0.2.4](https://github.com/nodegit/nodegit/tree/v0.2.4) (2014-12-05) +## v0.2.4 [(2014-12-05)](https://github.com/nodegit/nodegit/tree/v0.2.4) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.2.3...v0.2.4) @@ -560,11 +3654,11 @@ - Styling [\#295](https://github.com/nodegit/nodegit/pull/295) ([maxkorp](https://github.com/maxkorp)) -## [v0.2.3](https://github.com/nodegit/nodegit/tree/v0.2.3) (2014-11-25) +## v0.2.3 [(2014-11-25)](https://github.com/nodegit/nodegit/tree/v0.2.3) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.2.2...v0.2.3) -## [v0.2.2](https://github.com/nodegit/nodegit/tree/v0.2.2) (2014-11-25) +## v0.2.2 [(2014-11-25)](https://github.com/nodegit/nodegit/tree/v0.2.2) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.2.1...v0.2.2) @@ -572,7 +3666,7 @@ - Moved some dependencies around to help the generate not fail [\#294](https://github.com/nodegit/nodegit/pull/294) ([johnhaley81](https://github.com/johnhaley81)) -## [v0.2.1](https://github.com/nodegit/nodegit/tree/v0.2.1) (2014-11-25) +## v0.2.1 [(2014-11-25)](https://github.com/nodegit/nodegit/tree/v0.2.1) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.2.0...v0.2.1) @@ -580,7 +3674,7 @@ - Rewrite installer [\#293](https://github.com/nodegit/nodegit/pull/293) ([johnhaley81](https://github.com/johnhaley81)) -## [v0.2.0](https://github.com/nodegit/nodegit/tree/v0.2.0) (2014-11-25) +## v0.2.0 [(2014-11-25)](https://github.com/nodegit/nodegit/tree/v0.2.0) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.1.4...v0.2.0) @@ -772,7 +3866,7 @@ - Better installation flow for developing. [\#180](https://github.com/nodegit/nodegit/pull/180) ([tbranyen](https://github.com/tbranyen)) -## [v0.1.4](https://github.com/nodegit/nodegit/tree/v0.1.4) (2014-06-13) +## v0.1.4 [(2014-06-13)](https://github.com/nodegit/nodegit/tree/v0.1.4) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.1.3...v0.1.4) @@ -794,7 +3888,7 @@ - Fixed: "ReferenceError: error is not defined" [\#169](https://github.com/nodegit/nodegit/pull/169) ([danyshaanan](https://github.com/danyshaanan)) -## [v0.1.3](https://github.com/nodegit/nodegit/tree/v0.1.3) (2014-05-02) +## v0.1.3 [(2014-05-02)](https://github.com/nodegit/nodegit/tree/v0.1.3) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.1.2...v0.1.3) @@ -802,7 +3896,7 @@ - Fix erroneous OS detection for installation in OS X. [\#156](https://github.com/nodegit/nodegit/pull/156) ([tbranyen](https://github.com/tbranyen)) -## [v0.1.2](https://github.com/nodegit/nodegit/tree/v0.1.2) (2014-05-02) +## v0.1.2 [(2014-05-02)](https://github.com/nodegit/nodegit/tree/v0.1.2) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.1.1...v0.1.2) @@ -840,7 +3934,7 @@ - WIP New installer. [\#140](https://github.com/nodegit/nodegit/pull/140) ([tbranyen](https://github.com/tbranyen)) -## [v0.1.1](https://github.com/nodegit/nodegit/tree/v0.1.1) (2014-03-23) +## v0.1.1 [(2014-03-23)](https://github.com/nodegit/nodegit/tree/v0.1.1) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.1.0...v0.1.1) @@ -918,7 +4012,7 @@ - Add system dependencies for OSX install [\#82](https://github.com/nodegit/nodegit/pull/82) ([philschatz](https://github.com/philschatz)) -## [v0.1.0](https://github.com/nodegit/nodegit/tree/v0.1.0) (2013-09-07) +## v0.1.0 [(2013-09-07)](https://github.com/nodegit/nodegit/tree/v0.1.0) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.0.79...v0.1.0) @@ -952,7 +4046,7 @@ - Updated LICENSE to MIT [\#75](https://github.com/nodegit/nodegit/pull/75) ([tbranyen](https://github.com/tbranyen)) -## [v0.0.79](https://github.com/nodegit/nodegit/tree/v0.0.79) (2013-04-05) +## v0.0.79 [(2013-04-05)](https://github.com/nodegit/nodegit/tree/v0.0.79) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.0.778...v0.0.79) @@ -962,7 +4056,7 @@ - Python error on installing nodegit 0.0.77 [\#59](https://github.com/nodegit/nodegit/issues/59) -## [v0.0.778](https://github.com/nodegit/nodegit/tree/v0.0.778) (2013-03-26) +## v0.0.778 [(2013-03-26)](https://github.com/nodegit/nodegit/tree/v0.0.778) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.0.77...v0.0.778) @@ -970,15 +4064,15 @@ - See issue \#59 [\#60](https://github.com/nodegit/nodegit/pull/60) ([dctr](https://github.com/dctr)) -## [v0.0.77](https://github.com/nodegit/nodegit/tree/v0.0.77) (2013-03-24) +## v0.0.77 [(2013-03-24)](https://github.com/nodegit/nodegit/tree/v0.0.77) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.0.76...v0.0.77) -## [v0.0.76](https://github.com/nodegit/nodegit/tree/v0.0.76) (2013-03-24) +## v0.0.76 [(2013-03-24)](https://github.com/nodegit/nodegit/tree/v0.0.76) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.0.75...v0.0.76) -## [v0.0.75](https://github.com/nodegit/nodegit/tree/v0.0.75) (2013-03-24) +## v0.0.75 [(2013-03-24)](https://github.com/nodegit/nodegit/tree/v0.0.75) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.0.74...v0.0.75) @@ -1008,11 +4102,11 @@ - Comment all code methods [\#1](https://github.com/nodegit/nodegit/issues/1) -## [v0.0.74](https://github.com/nodegit/nodegit/tree/v0.0.74) (2013-03-21) +## v0.0.74 [(2013-03-21)](https://github.com/nodegit/nodegit/tree/v0.0.74) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.0.73...v0.0.74) -## [v0.0.73](https://github.com/nodegit/nodegit/tree/v0.0.73) (2013-03-21) +## v0.0.73 [(2013-03-21)](https://github.com/nodegit/nodegit/tree/v0.0.73) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.0.72...v0.0.73) @@ -1026,11 +4120,11 @@ - Tree each method is synchronous [\#15](https://github.com/nodegit/nodegit/issues/15) -## [v0.0.72](https://github.com/nodegit/nodegit/tree/v0.0.72) (2013-03-06) +## v0.0.72 [(2013-03-06)](https://github.com/nodegit/nodegit/tree/v0.0.72) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.0.71...v0.0.72) -## [v0.0.71](https://github.com/nodegit/nodegit/tree/v0.0.71) (2013-03-06) +## v0.0.71 [(2013-03-06)](https://github.com/nodegit/nodegit/tree/v0.0.71) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.0.6...v0.0.71) @@ -1058,7 +4152,7 @@ - Refactor [\#37](https://github.com/nodegit/nodegit/pull/37) ([mmalecki](https://github.com/mmalecki)) -## [v0.0.6](https://github.com/nodegit/nodegit/tree/v0.0.6) (2011-12-19) +## v0.0.6 [(2011-12-19)](https://github.com/nodegit/nodegit/tree/v0.0.6) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.0.4...v0.0.6) @@ -1072,7 +4166,7 @@ - Node 0.6x fixes [\#34](https://github.com/nodegit/nodegit/pull/34) ([moneal](https://github.com/moneal)) -## [v0.0.4](https://github.com/nodegit/nodegit/tree/v0.0.4) (2011-05-14) +## v0.0.4 [(2011-05-14)](https://github.com/nodegit/nodegit/tree/v0.0.4) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.0.3...v0.0.4) @@ -1084,7 +4178,7 @@ - Branch history each method is asynchronous [\#11](https://github.com/nodegit/nodegit/issues/11) -## [v0.0.3](https://github.com/nodegit/nodegit/tree/v0.0.3) (2011-04-13) +## v0.0.3 [(2011-04-13)](https://github.com/nodegit/nodegit/tree/v0.0.3) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.0.2...v0.0.3) @@ -1094,12 +4188,8 @@ - Windows link issue [\#12](https://github.com/nodegit/nodegit/issues/12) -## [v0.0.2](https://github.com/nodegit/nodegit/tree/v0.0.2) (2011-03-14) +## v0.0.2 [(2011-03-14)](https://github.com/nodegit/nodegit/tree/v0.0.2) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.0.1...v0.0.2) -## [v0.0.1](https://github.com/nodegit/nodegit/tree/v0.0.1) (2011-03-10) - - - -\* *This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)* \ No newline at end of file +## v0.0.1 [(2011-03-10)](https://github.com/nodegit/nodegit/tree/v0.0.1) \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 52a55d1485..337971a438 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -5,8 +5,9 @@ Contribution Guidelines We try to be available pretty often to help when problems come up. We like to split incoming questions into two categories: potential bugs/features, and questions. If you want a feature added, or think you've found a bug -in the code (or in the examples), search the [issue tracker](https://github.com/nodegit/nodegit/issues) and if you dont -find anything, file a new issue. If you just have questions, instead of using issues, contact us in our [Gitter room](https://gitter.im/nodegit/nodegit). +in the code (or in the examples), search the [issue tracker](https://github.com/nodegit/nodegit/issues) and if you don't +find anything, file a new issue. If you just have questions, instead of using issues, [sign up](http://slack.libgit2.org/) +to libgit2's Slack instance and then contact us in the [#nodegit channel](https://libgit2.slack.com/messages/nodegit/). ## How to Help ## @@ -21,7 +22,7 @@ These are all good easy ways to start getting involved with the project. You can and see if you can help with any existing issues. Please comment with your intention and any questions before getting started; duplicating work or doing something that would be rejected always sucks. -Additionally, [the documentation](http://www.nodegit.org) needs some love. Get in touch with one of us on Gitter if +Additionally, [the documentation](http://www.nodegit.org) needs some love. Get in touch with one of us on Slack if you'd like to lend a hand with that. -For anything else, Gitter is probably the best way to get in touch as well. Happy coding, merge you soon! +For anything else, Slack is probably the best way to get in touch as well. Happy coding, merge you soon! diff --git a/FAQ.md b/FAQ.md new file mode 100644 index 0000000000..6d136b8206 --- /dev/null +++ b/FAQ.md @@ -0,0 +1,13 @@ +NodeGit FAQ +----------- + +Feel free to add common problems with their solutions here, or just anything that wasn't clear at first. + +#### Error: callback returned unsupported credentials type #### + +As seen in nodegit/#959 -- some golang hackers have started to use the following stanza in .gitconfig to allow `go get` to work with private repos: +``` +[url "git@github.com:"] + insteadOf = https://github.com/ +``` +But if you do this, code can call `NodeGit.Clone.clone(url: 'https://foo')` and have the `authentication` callback be asked for **SSH** credentials instead of HTTPS ones, which might not be what your application expected. diff --git a/README.md b/README.md index 41dcd1e2d4..72442d791d 100644 --- a/README.md +++ b/README.md @@ -1,50 +1,24 @@ -NodeGit -------- +# NodeGit > Node bindings to the [libgit2](http://libgit2.github.com/) project. - - - - - - - - - - - - - - - - - - -
LinuxOS XWindowsCoverageDependencies
- - - - - Coverage Status - - -
- -**Stable: 0.4.1** +[![Actions Status](https://github.com/nodegit/nodegit/workflows/Testing/badge.svg)](https://github.com/nodegit/nodegit/actions) + +**Stable (libgit2@v0.28.3): 0.28.3** ## Have a problem? Come chat with us! ## -[![Gitter](http://www.nodegit.org/img/gitterbadge.svg)](https://gitter.im/nodegit/nodegit) +Visit [slack.libgit2.org](http://slack.libgit2.org/) to sign up, then join us in #nodegit. ## Maintained by ## -Tim Branyen [@tbranyen](http://twitter.com/tbranyen), -John Haley [@johnhaley81](http://twitter.com/johnhaley81), -Max Korp [@maxkorp](http://twitter.com/MaximilianoKorp), and -Steve Smith [@orderedlist](https://twitter.com/orderedlist) with help from tons of +Tyler Ang-Wanek [@twwanek](http://twitter.com/twwanek) with help from tons of [awesome contributors](https://github.com/nodegit/nodegit/contributors)! ### Alumni Maintainers ### +Tim Branyen [@tbranyen](http://twitter.com/tbranyen), +John Haley [@johnhaley81](http://twitter.com/johnhaley81), +Max Korp [@maxkorp](http://twitter.com/MaximilianoKorp), +Steve Smith [@orderedlist](https://twitter.com/orderedlist), Michael Robinson [@codeofinterest](http://twitter.com/codeofinterest), and Nick Kallen [@nk](http://twitter.com/nk) @@ -61,20 +35,70 @@ dependencies. npm install nodegit ``` -**Note: NodeGit will only work on io.js Windows with [the iojs binary instead of node](https://github.com/rvagg/pangyp/issues/4).** +If you receive errors about libstdc++, which are commonly experienced when +building on Travis-CI, you can fix this by upgrading to the latest +libstdc++-4.9. + +In Ubuntu: + +``` sh +sudo add-apt-repository ppa:ubuntu-toolchain-r/test +sudo apt-get update +sudo apt-get install libstdc++-4.9-dev +``` + +In Travis: + +``` yaml +addons: + apt: + sources: + - ubuntu-toolchain-r-test + packages: + - libstdc++-4.9-dev +``` -If you encounter problems while installing, you should try the [Building from -source](http://www.nodegit.org/guides/install/from-source/) instructions. +In CircleCI: + +``` yaml + dependencies: + pre: + - sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test + - sudo apt-get update + - sudo apt-get install -y libstdc++-4.9-dev +``` + +If you receive errors about *lifecycleScripts* preinstall/install you probably miss *libssl-dev* +In Ubuntu: +``` +sudo apt-get install libssl-dev +``` + +You will need the following libraries installed on your linux machine: + - libpcre + - libpcreposix + - libkrb5 + - libk5crypto + - libcom_err + +When building locally, you will also need development packages for kerberos and pcre, so both of these utilities must be present on your machine: + - pcre-config + - krb5-config + + +If you are still encountering problems while installing, you should try the +[Building from source](http://www.nodegit.org/guides/install/from-source/) +instructions. ## API examples. ## ### Cloning a repository and reading a file: ### ``` javascript -var clone = require("./").Clone.clone; +var Git = require("nodegit"); -// Clone a given repository into a specific folder. -clone("https://github.com/nodegit/nodegit", "tmp", null) +// Clone a given repository into the `./tmp` folder. +Git.Clone("https://github.com/nodegit/nodegit", "./tmp") // Look up this known commit. .then(function(repo) { // Use a known commit sha from this repository. @@ -94,8 +118,8 @@ clone("https://github.com/nodegit/nodegit", "tmp", null) }) // Display information about the blob. .then(function(blob) { - // Show the name, sha, and filesize in bytes. - console.log(blob.entry.name() + blob.entry.sha() + blob.size() + "b"); + // Show the path, sha, and filesize in bytes. + console.log(blob.entry.path() + blob.entry.sha() + blob.rawsize() + "b"); // Show a spacer. console.log(Array(72).join("=") + "\n\n"); @@ -110,10 +134,10 @@ clone("https://github.com/nodegit/nodegit", "tmp", null) ### Emulating git log: ### ``` javascript -var open = require("nodegit").Repository.open; +var Git = require("nodegit"); // Open the repository directory. -open("tmp") +Git.Repository.open("tmp") // Open the master branch. .then(function(repo) { return repo.getMasterCommit(); @@ -163,41 +187,3 @@ You will need to build locally before running the tests. See above. ``` bash npm test ``` - -## Migrating from old versions. ## - -The bump from 0.1.4 to 0.2.0 was a big one. Many things changed, see here: -https://github.com/nodegit/nodegit/compare/v0.1.4...v0.2.0 - -This update is wholly and entirely a breaking one, and older versions won't be -maintained. For the purpose of migration, perhaps the biggest point to make -is that async methods can now use promises, rather than just taking callbacks. -Additionally, lots of method and property names have changed. - -## nw.js (Node-Webkit) ## - -### Native compilation for nw.js ### -A common issue is with NodeGit not functioning properly inside of -[nw.js](http://github.com/nwjs/nw.js) applications. Because NodeGit -is a native module, it has to be rebuilt for node-webkit using -[nw-gyp](http://github.com/rogerwang/nw-gyp). By default, NodeGit will look -in the root package's package.json for an `engines` property, and within look -for a `nw.js` property (or a `node-webkit` if the prior isn't found) that holds -a specific version of nw.js. The value of this property is what will get passed -as the `--target` argument to `nw-gyp configure`. - -### Version incompatibility ### -Prior to version 0.2.6, NodeGit used [nan](http://github.com/rvagg/nan) v1.4.3. -As of 0.2.6, NodeGit uses nan v1.5.1 to provide support for io.js. Unfortunately, -this breaks some nw.js compatibility. With nw.js 0.12+, the name was changed to -nw.js from node-webkit. The alpha currently still breaks with NodeGit due to the -nan update, but should be fixed in the final v0.12.0 release. Ă…pplications using -previous versions of node webkit have 2 options: -1) Use an older version (v0.2.4 or earlier) of NodeGit -2) Use [npm shrinkwrap](https://docs.npmjs.com/cli/shrinkwrap) to force NodeGit to -use nan v1.4.3. Since the binary always recompiles when being used with nw.js, you -shouldn't have to do anything else to make sure it works. As of NodeGit v0.2.6, -the change to nan v1.4.3 doesn't cause any problems. - -Currently, support for nw.js is limited, although we intend to support it better -in the future. diff --git a/TESTING.md b/TESTING.md index 16623aa149..c149c6b5b2 100644 --- a/TESTING.md +++ b/TESTING.md @@ -11,6 +11,9 @@ Currently there are a number of fields and functions in NodeGit that have no tes npm run generateMissingTests ``` +>You should have run already `npm install .` or it will complain about +> missing `nodegit-promise` or suchlike + This will make the file `generate/output/missing-tests.json` which will contain info for tests or files that are currently missing. From this file you can find fields and functions that don't have any tests yet and pick one to work on. @@ -32,13 +35,14 @@ In the `missing-tests.json` file you'll see it formatted like so: In the file each `{className}` corresponds to a file found at `test/tests/{classname}`. Each entry in either `fields` or `functions` is a missing test for the respective field/function. -In the file that your test is going in you can just append it to the file inside of the `describe` function block. +In the file that your test is going in you can just append it to the file inside the `describe` function block. It can be helpful to reference the [libgit2 API docs](https://libgit2.github.com/libgit2/#v0.21.4) to know what the field or function is doing inside of libgit2 and referencing the [NodeGit API docs](http://www.nodegit.org/) can also help. Looking at examples inside of `/examples` can show you how we wrap the libgit2 library and how you can call into it from JavaScript. The idea is to test the basic functionality of the field/function and to confirm that it's returning or setting the value(s) correctly. Bugs inside of libgit2 will have to either have a work-around or be ignored. -If a specific field or function is further wrapped via a file inside of `/lib` then as long as that wrapper is called and tested. +If a specific field or function is further wrapped via a file inside +of `/lib` then as long as that wrapper is called and tested it is OK. You can mark something to be ignored inside of the `/generate/missing-tests-ignore.json` file. @@ -48,7 +52,7 @@ After you write your test make sure to run `npm run generateMissingTests` again ### The test passes ### -Excellent!! Make sure that the test is working correctly and testing what you're expecting it to test and then move onto the [next section](https://github.com/nodegit/nodegit/tree/master/test#making-a-pull-request). +Excellent!! Make sure that the test is working correctly and testing what you're expecting it to test and then move onto the [next section](#making-a-pull-request). ### The test fails ### diff --git a/appveyor.yml b/appveyor.yml deleted file mode 100644 index 17a3dcb38c..0000000000 --- a/appveyor.yml +++ /dev/null @@ -1,60 +0,0 @@ -# appveyor file -# http://www.appveyor.com/docs/appveyor-yml - -# Try out "interactive-mode" -os: Windows Server 2012 R2 - -# build version format -version: "{build}" - -# Set a known clone folder -clone_folder: c:\projects\nodegit - -# fix lineendings in Windows -init: - - git config --global core.autocrlf input - - git config --global user.name "John Doe" - - git config --global user.email johndoe@example.com - -# what combinations to test -environment: - JOBS: 4 - BUILD_ONLY: true - GIT_SSH: c:\projects\nodegit\vendor\plink.exe - GYP_MSVS_VERSION: 2013 - matrix: - # Node.js - - nodejs_version: "0.12" - # io.js - - nodejs_version: "2" - -matrix: - fast_finish: true - allow_failures: - - nodejs_version: "0.10" - - nodejs_version: "2" - -# Get the latest stable version of Node 0.STABLE.latest -install: - - ps: Install-Product node $env:nodejs_version - - ps: Start-Process c:\projects\nodegit\vendor\pageant.exe c:\projects\nodegit\vendor\private.ppk - - cmd: npm install -g node-gyp - - npm install - -test_script: - - node --version - - npm --version - - cmd: npm test - -on_success: - - IF %APPVEYOR_REPO_TAG%==true npm install -g node-pre-gyp - - IF %APPVEYOR_REPO_TAG%==true npm install -g aws-sdk - - IF %APPVEYOR_REPO_TAG%==true node-pre-gyp package - - IF %APPVEYOR_REPO_TAG%==true node-pre-gyp publish - -build: off - -branches: - only: - - master - - v0.3 diff --git a/examples/README.md b/examples/README.md new file mode 100644 index 0000000000..1b1fc2b328 --- /dev/null +++ b/examples/README.md @@ -0,0 +1,4 @@ +## /examples + + List of examples of using NodeGit to implement common git core operations. + diff --git a/examples/add-and-commit.js b/examples/add-and-commit.js index 6366f3ba33..42215257b8 100644 --- a/examples/add-and-commit.js +++ b/examples/add-and-commit.js @@ -1,15 +1,9 @@ -var nodegit = require("../"); -var path = require("path"); -var promisify = require("promisify-node"); -var fse = promisify(require("fs-extra")); -var fileName = "newfile.txt"; -var fileContent = "hello world"; -var directoryName = "salad/toast/strangerinastrangeland/theresnowaythisexists"; -// ensureDir is an alias to mkdirp, which has the callback with a weird name -// and in the 3rd position of 4 (the 4th being used for recursion). We have to -// force promisify it, because promisify-node won't detect it on its -// own and assumes sync -fse.ensureDir = promisify(fse.ensureDir); +const nodegit = require("../"); +const path = require("path"); +const fs = require("fs"); +const fileName = "newfile.txt"; +const fileContent = "hello world"; +const directoryName = "salad/toast/strangerinastrangeland/theresnowaythisexists"; /** * This example creates a certain file `newfile.txt`, adds it to the git @@ -17,60 +11,38 @@ fse.ensureDir = promisify(fse.ensureDir); * followed by a `git commit` **/ -var repo; -var index; -var oid; -nodegit.Repository.open(path.resolve(__dirname, "../.git")) -.then(function(repoResult) { - repo = repoResult; - return fse.ensureDir(path.join(repo.workdir(), directoryName)); -}).then(function(){ - return fse.writeFile(path.join(repo.workdir(), fileName), fileContent); -}) -.then(function() { - return fse.writeFile( +(async () => { + const repo = await nodegit.Repository.open(path.resolve(__dirname, "../.git")); + + await fs.promises.mkdir(path.join(repo.workdir(), directoryName), { + recursive: true, + }); + + await fs.promises.writeFile(path.join(repo.workdir(), fileName), fileContent); + await fs.promises.writeFile( path.join(repo.workdir(), directoryName, fileName), fileContent ); -}) -.then(function() { - return repo.openIndex(); -}) -.then(function(indexResult) { - index = indexResult; - return index.read(1); -}) -.then(function() { + + const index = await repo.refreshIndex(); + // this file is in the root of the directory and doesn't need a full path - return index.addByPath(fileName); -}) -.then(function() { + await index.addByPath(fileName); // this file is in a subdirectory and can use a relative path - return index.addByPath(path.join(directoryName, fileName)); -}) -.then(function() { + await index.addByPath(path.posix.join(directoryName, fileName)); // this will write both files to the index - return index.write(); -}) -.then(function() { - return index.writeTree(); -}) -.then(function(oidResult) { - oid = oidResult; - return nodegit.Reference.nameToId(repo, "HEAD"); -}) -.then(function(head) { - return repo.getCommit(head); -}) -.then(function(parent) { - var author = nodegit.Signature.create("Scott Chacon", - "schacon@gmail.com", 123456789, 60); - var committer = nodegit.Signature.create("Scott A Chacon", - "scott@github.com", 987654321, 90); + await index.write(); + + const oid = await index.writeTree(); + + const parent = await repo.getHeadCommit(); + const author = nodegit.Signature.now("Scott Chacon", + "schacon@gmail.com"); + const committer = nodegit.Signature.now("Scott A Chacon", + "scott@github.com"); + + const commitId = await repo.createCommit("HEAD", author, committer, "message", oid, [parent]); - return repo.createCommit("HEAD", author, committer, "message", oid, [parent]); -}) -.done(function(commitId) { console.log("New Commit: ", commitId); -}); +})(); diff --git a/examples/checkout-remote-branch.js b/examples/checkout-remote-branch.js new file mode 100644 index 0000000000..4ebf9050be --- /dev/null +++ b/examples/checkout-remote-branch.js @@ -0,0 +1,26 @@ +var nodegit = require("../"); +var path = require("path"); + +var remoteBranchName = "REMOTE-BRANCH-NAME"; + +nodegit.Repository.open(path.resolve(__dirname, "../.git")) + .then(function(repo) { + + return repo.getHeadCommit() + .then(function (targetCommit) { + return repo.createBranch(remoteBranchName, targetCommit, false); + }) + .then(function (reference) { + return repo.checkoutBranch(reference, {}); + }) + .then(function () { + return repo.getReferenceCommit( + "refs/remotes/origin/" + remoteBranchName); + }) + .then(function (commit) { + nodegit.Reset.reset(repo, commit, 3, {}); + }); + + }).done(function() { + console.log("All done!"); +}); diff --git a/examples/clone.js b/examples/clone.js index b01ab99ab5..459713d942 100644 --- a/examples/clone.js +++ b/examples/clone.js @@ -1,6 +1,5 @@ var nodegit = require("../"); -var promisify = require("promisify-node"); -var fse = promisify(require("fs-extra")); +var fse = require("fs-extra"); var path = "/tmp/nodegit-clone-demo"; fse.remove(path).then(function() { @@ -10,11 +9,13 @@ fse.remove(path).then(function() { "https://github.com/nodegit/nodegit.git", path, { - remoteCallbacks: { - certificateCheck: function() { - // github will fail cert check on some OSX machines - // this overrides that check - return 1; + fetchOpts: { + callbacks: { + certificateCheck: function() { + // github will fail cert check on some OSX machines + // this overrides that check + return 0; + } } } }) @@ -29,7 +30,7 @@ fse.remove(path).then(function() { return entry.getBlob(); }) .done(function(blob) { - console.log(entry.filename(), entry.sha(), blob.rawsize() + "b"); + console.log(entry.name(), entry.sha(), blob.rawsize() + "b"); console.log("========================================================\n\n"); var firstTenLines = blob.toString().split("\n").slice(0, 10).join("\n"); console.log(firstTenLines); diff --git a/examples/cloneFromGithubWith2Factor.js b/examples/cloneFromGithubWith2Factor.js index 20cda9a464..62e0df8073 100644 --- a/examples/cloneFromGithubWith2Factor.js +++ b/examples/cloneFromGithubWith2Factor.js @@ -1,6 +1,5 @@ var nodegit = require("../"); -var promisify = require("promisify-node"); -var fse = promisify(require("fs-extra")); +var fse = require("fs-extra"); var path = "/tmp/nodegit-github-2factor-demo"; var token = "{Your GitHub user token}"; @@ -11,24 +10,18 @@ var repoName = "{The name of the repo}"; // over https, it can't be done with actual 2 factor. // https://github.com/blog/1270-easier-builds-and-deployments-using-git-over-https-and-oauth -// The token has to be included in the URL if the repo is private. -// Otherwise, github just wont respond, so a normal credential callback -// wont work. -var repoUrl = "https://" + token + - ":-oauth-basic@github.com/" + - repoOwner + "/" + - repoName + ".git"; - // If the repo is public, you can use a callback instead var repoUrl = "https://github.com/" + repoOwner + "/" + repoName + ".git"; var opts = { - remoteCallbacks: { - credentials: function() { - return nodegit.Cred.userpassPlaintextNew (token, "x-oauth-basic"); - }, - certificateCheck: function() { - return 1; + fetchOpts: { + callbacks: { + credentials: function() { + return nodegit.Cred.userpassPlaintextNew(token, "x-oauth-basic"); + }, + certificateCheck: function() { + return 0; + } } } }; diff --git a/examples/create-branch.js b/examples/create-branch.js index 28ab6bea53..7374de053e 100644 --- a/examples/create-branch.js +++ b/examples/create-branch.js @@ -9,9 +9,7 @@ nodegit.Repository.open(path.resolve(__dirname, "../.git")) return repo.createBranch( "new-branch", commit, - 0, - repo.defaultSignature(), - "Created new-branch on HEAD"); + 0); }); }).done(function() { console.log("All done!"); diff --git a/examples/create-new-repo.js b/examples/create-new-repo.js index 640bdc33a1..1df93fbbc8 100644 --- a/examples/create-new-repo.js +++ b/examples/create-new-repo.js @@ -1,50 +1,32 @@ -var nodegit = require("../"); -var path = require("path"); -var promisify = require("promisify-node"); -var fse = promisify(require("fs-extra")); -var fileName = "newfile.txt"; -var fileContent = "hello world"; -var repoDir = "../../newRepo"; +const nodegit = require("../"); +const path = require("path"); +const fs = require("fs"); +const fileName = "newfile.txt"; +const fileContent = "hello world"; +const repoDir = "../newRepo"; -fse.ensureDir = promisify(fse.ensureDir); -var repository; -var index; +(async () => { + await fs.promises.mkdir(path.resolve(__dirname, repoDir), { + recursive: true, + }); + const repo = await nodegit.Repository.init(path.resolve(__dirname, repoDir), 0); + await fs.promises.writeFile(path.join(repo.workdir(), fileName), fileContent); + const index = await repo.refreshIndex(); + await index.addByPath(fileName); + await index.write(); + + const oid = await index.writeTree(); + + const author = nodegit.Signature.now("Scott Chacon", + "schacon@gmail.com"); + const committer = nodegit.Signature.now("Scott A Chacon", + "scott@github.com"); -fse.ensureDir(path.resolve(__dirname, repoDir)) -.then(function() { - return nodegit.Repository.init(path.resolve(__dirname, repoDir), 0); -}) -.then(function(repo) { - repository = repo; - return fse.writeFile(path.join(repository.workdir(), fileName), fileContent); -}) -.then(function(){ - return repository.openIndex(); -}) -.then(function(idx) { - index = idx; - return index.read(1); -}) -.then(function() { - return index.addByPath(fileName); -}) -.then(function() { - return index.write(); -}) -.then(function() { - return index.writeTree(); -}) -.then(function(oid) { - var author = nodegit.Signature.create("Scott Chacon", - "schacon@gmail.com", 123456789, 60); - var committer = nodegit.Signature.create("Scott A Chacon", - "scott@github.com", 987654321, 90); - - // Since we're creating an inital commit, it has no parents. Note that unlike + // Since we're creating an initial commit, it has no parents. Note that unlike // normal we don't get the head either, because there isn't one yet. - return repository.createCommit("HEAD", author, committer, "message", oid, []); -}) -.done(function(commitId) { + const commitId = await repo.createCommit("HEAD", author, committer, "message", oid, []); console.log("New Commit: ", commitId); -}); +})(); + + diff --git a/examples/details-for-tree-entry.js b/examples/details-for-tree-entry.js index 4055383898..13dcd4e210 100644 --- a/examples/details-for-tree-entry.js +++ b/examples/details-for-tree-entry.js @@ -1,29 +1,26 @@ -var nodegit = require("../"); -var path = require("path"); +const nodegit = require("../"); +const path = require("path"); /** * This shows how to get details from a tree entry or a blob **/ -nodegit.Repository.open(path.resolve(__dirname, "../.git")) - .then(function(repo) { - return repo.getTree("e1b0c7ea57bfc5e30ec279402a98168a27838ac9") - .then(function(tree) { - var treeEntry = tree.entryByIndex(0); +(async () => { + const repo = await nodegit.Repository.open(path.resolve(__dirname, "../.git")); + const tree = await repo.getTree("e1b0c7ea57bfc5e30ec279402a98168a27838ac9"); + const treeEntry = tree.entryByIndex(0); + + // Tree entry doesn't have any data associated with the actual entry + // To get that we need to get the index entry that this points to + const index = await repo.refreshIndex(); + const indexEntry = index.getByPath(treeEntry.path()); - // Tree entry doesn't have any data associated with the actual entry - // To get that we need to get the index entry that this points to - return repo.openIndex().then(function(index) { - var indexEntry = index.getByPath(treeEntry.path()); + // With the index entry we can now view the details for the tree entry + console.log("Entry path: " + indexEntry.path); + console.log("Entry time in seconds: " + indexEntry.mtime.seconds()); + console.log("Entry oid: " + indexEntry.id.toString()); + console.log("Entry size: " + indexEntry.fileSize); + + console.log("Done!"); +})(); - // With the index entry we can now view the details for the tree entry - console.log("Entry path: " + indexEntry.path()); - console.log("Entry time in seconds: " + indexEntry.mtime().seconds()); - console.log("Entry oid: " + indexEntry.id().toString()); - console.log("Entry size: " + indexEntry.fileSize()); - }); - }); - }) - .done(function() { - console.log("Done!"); - }); diff --git a/examples/diff-commits.js b/examples/diff-commits.js index f68d0fcfb1..b3d6d75107 100644 --- a/examples/diff-commits.js +++ b/examples/diff-commits.js @@ -1,41 +1,41 @@ -var nodegit = require("../"); -var path = require("path"); +const nodegit = require("../"); +const path = require("path"); // This code examines the diffs between a particular commit and all of its // parents. Since this commit is not a merge, it only has one parent. This is // similar to doing `git show`. -nodegit.Repository.open(path.resolve(__dirname, "../.git")) -.then(function(repo) { - return repo.getCommit("59b20b8d5c6ff8d09518454d4dd8b7b30f095ab5"); -}) -.then(function(commit) { +(async () => { + const repo = await nodegit.Repository.open(path.resolve(__dirname, "../.git")) + const commit = await repo.getCommit("59b20b8d5c6ff8d09518454d4dd8b7b30f095ab5"); console.log("commit " + commit.sha()); - console.log("Author:", commit.author().name() + - " <" + commit.author().email() + ">"); + console.log( + "Author:", commit.author().name() + + " <" + commit.author().email() + ">" + ); console.log("Date:", commit.date()); console.log("\n " + commit.message()); - return commit.getDiff(); -}) -.done(function(diffList) { - diffList.forEach(function(diff) { - diff.patches().then(function(patches) { - patches.forEach(function(patch) { - patch.hunks().then(function(hunks) { - hunks.forEach(function(hunk) { - hunk.lines().then(function(lines) { - console.log("diff", patch.oldFile().path(), - patch.newFile().path()); - console.log(hunk.header().trim()); - lines.forEach(function(line) { - console.log(String.fromCharCode(line.origin()) + - line.content().trim()); - }); - }); - }); - }); - }); - }); - }); -}); + const diffList = await commit.getDiff(); + for (const diff of diffList) { + const patches = await diff.patches(); + for (const patch of patches) { + const hunks = await patch.hunks(); + for (const hunk of hunks) { + const lines = await hunk.lines(); + console.log( + "diff", + patch.oldFile().path(), + patch.newFile().path() + ); + console.log(hunk.header().trim()); + for (const line of lines) { + console.log( + String.fromCharCode(line.origin()) + + line.content().trim() + ); + } + } + } + } +})(); diff --git a/examples/fetch.js b/examples/fetch.js index fce801ee07..ffde30ee15 100644 --- a/examples/fetch.js +++ b/examples/fetch.js @@ -4,8 +4,10 @@ var path = require("path"); nodegit.Repository.open(path.resolve(__dirname, "../.git")) .then(function(repo) { return repo.fetch("origin", { - credentials: function(url, userName) { - return nodegit.Cred.sshKeyFromAgent(userName); + callbacks: { + credentials: function(url, userName) { + return nodegit.Cred.sshKeyFromAgent(userName); + } } }); }).done(function() { diff --git a/examples/general.js b/examples/general.js index 31251a55f5..b06c4d7954 100644 --- a/examples/general.js +++ b/examples/general.js @@ -1,13 +1,10 @@ -var nodegit = require("../"); -var path = require("path"); -var Promise = require("nodegit-promise"); -var oid; -var odb; -var repo; +const nodegit = require("../"); +const path = require("path"); + // **nodegit** is a javascript library for node.js that wraps libgit2, a // pure C implementation of the Git core. It provides an asynchronous -// interface around any functions that do I/O, and a sychronous interface +// interface around any functions that do I/O, and a synchronous interface // around the rest. // // This file is an example of using that API in a real, JS file. @@ -20,348 +17,301 @@ var repo; // Nearly, all git operations in the context of a repository. // To open a repository, -nodegit.Repository.open(path.resolve(__dirname, "../.git")) - .then(function(repoResult) { - repo = repoResult; - console.log("Opened repository."); - - // ### SHA-1 Value Conversions - - // Objects in git (commits, blobs, etc.) are referred to by their SHA value - // **nodegit** uses a simple wrapper around hash values called an `Oid`. - // The oid validates that the SHA is well-formed. - - oid = nodegit.Oid.fromString("c27d9c35e3715539d941254f2ce57042b978c49c"); - - // Most functions in in **nodegit** that take an oid will also take a - // string, so for example, you can look up a commit by a string SHA or - // an Oid, but but any functions that create new SHAs will always return - // an Oid. - - // If you have a oid, you can easily get the hex value of the SHA again. - console.log("Sha hex string:", oid.toString()); - - // ### Working with the Object Database - - // **libgit2** provides [direct access][odb] to the object database. The - // object database is where the actual objects are stored in Git. For - // working with raw objects, we'll need to get this structure from the - // repository. - return repo.odb(); - }) - - .then(function(odbResult) { - odb = odbResult; - - // We can read raw objects directly from the object database if we have - // the oid (SHA) of the object. This allows us to access objects without - // knowing thier type and inspect the raw bytes unparsed. - - return odb.read(oid); - }) - - .then(function(object) { - // A raw object only has three properties - the type (commit, blob, tree - // or tag), the size of the raw data and the raw, unparsed data itself. - // For a commit or tag, that raw data is human readable plain ASCII - // text. For a blob it is just file contents, so it could be text or - // binary data. For a tree it is a special binary format, so it's unlikely - // to be hugely helpful as a raw object. - var data = object.data(); - var type = object.type(); - var size = object.size(); - - console.log("Object size and type:", size, type); - console.log("Raw data: ", data.toString().substring(100), "..."); - - }) - - .then(function() { - // You can also write raw object data to Git. This is pretty cool because - // it gives you direct access to the key/value properties of Git. Here - // we'll write a new blob object that just contains a simple string. - // Notice that we have to specify the object type. - return odb.write("test data", "test data".length, nodegit.Object.TYPE.BLOB); - }) - - .then(function(oid) { - // Now that we've written the object, we can check out what SHA1 was - // generated when the object was written to our database. - console.log("Written Object: ", oid.toString()); - }) - - .then(function() { - // ### Object Parsing - - // libgit2 has methods to parse every object type in Git so you don't have - // to work directly with the raw data. This is much faster and simpler - // than trying to deal with the raw data yourself. - - // #### Commit Parsing - - // [Parsing commit objects][pco] is simple and gives you access to all the - // data in the commit - the author (name, email, datetime), committer - // (same), tree, message, encoding and parent(s). - - oid = nodegit.Oid.fromString("698c74e817243efe441a5d1f3cbaf3998282ca86"); - - // Many methods in **nodegit** are asynchronous, because they do file - // or network I/O. By convention, all asynchronous methods are named - // imperatively, like `getCommit`, `open`, `read`, `write`, etc., whereas - // synchronous methods are named nominatively, like `type`, `size`, `name`. - - return repo.getCommit(oid); - }) - - .then(function(commit) { - // Each of the properties of the commit object are accessible via methods, - // including commonly needed variations, such as `git_commit_time` which - // returns the author time and `git_commit_message` which gives you the - // commit message. - console.log("Commit:", commit.message(), - commit.author().name(), commit.date()); - - // Commits can have zero or more parents. The first (root) commit will - // have no parents, most commits will have one (i.e. the commit it was - // based on) and merge commits will have two or more. Commits can - // technically have any number, though it's rare to have more than two. - return commit.getParents(); - }) - - .then(function(parents) { - parents.forEach(function(parent) { - console.log("Parent:", parent.toString()); - }); - }) - - .then(function() { - // #### Writing Commits - - // nodegit provides a couple of methods to create commit objects easily as - // well. - var author = nodegit.Signature.create("Scott Chacon", - "schacon@gmail.com", 123456789, 60); - var committer = nodegit.Signature.create("Scott A Chacon", - "scott@github.com", 987654321, 90); - - // Commit objects need a tree to point to and optionally one or more - // parents. Here we're creating oid objects to create the commit with, - // but you can also use existing ones: - var treeId = nodegit.Oid.fromString( - "4170d10f19600b9cb086504e8e05fe7d863358a2"); - var parentId = nodegit.Oid.fromString( - "eebd0ead15d62eaf0ba276da53af43bbc3ce43ab"); - - return repo.getTree(treeId).then(function(tree) { - return repo.getCommit(parentId).then(function(parent) { - // Here we actually create the commit object with a single call with all - // the values we need to create the commit. The SHA key is written to - // the `commit_id` variable here. - return repo.createCommit( - null /* do not update the HEAD */, - author, - committer, - "example commit", - tree, - [parent]); - }).then(function(oid) { - console.log("New Commit:", oid.toString()); - }); - }); - }) - - .then(function() { - // #### Tag Parsing - - // You can parse and create tags with the [tag management API][tm], which - // functions very similarly to the commit lookup, parsing and creation - // methods, since the objects themselves are very similar. - - oid = nodegit.Oid.fromString("dcc4aa9fcdaced037434cb149ed3b6eab4d0709d"); - return repo.getTag(oid); - }) - - .then(function(tag) { - // Now that we have the tag object, we can extract the information it - // generally contains: the target (usually a commit object), the type of - // the target object (usually "commit"), the name ("v1.0"), the tagger (a - // git_signature - name, email, timestamp), and the tag message. - console.log(tag.name(), tag.targetType(), tag.message()); - - return tag.target(); - }) - - .then(function (target) { - console.log("Target is commit:", target.isCommit()); - }) - - .then(function() { - // #### Tree Parsing - - // A Tree is how Git represents the state of the filesystem - // at a given revision. In general, a tree corresponds to a directory, - // and files in that directory are either files (blobs) or directories. - - // [Tree parsing][tp] is a bit different than the other objects, in that - // we have a subtype which is the tree entry. This is not an actual - // object type in Git, but a useful structure for parsing and traversing - // tree entries. - - oid = nodegit.Oid.fromString("e1b0c7ea57bfc5e30ec279402a98168a27838ac9"); - return repo.getTree(oid); - }) - - .then(function(tree) { - console.log("Tree Size:", tree.entryCount()); - - function dfs(tree) { - var promises = []; - - tree.entries().forEach(function(entry) { - if (entry.isDirectory()) { - promises.push(entry.getTree().then(dfs)); - } else if (entry.isFile()) { - console.log("Tree Entry:", entry.filename()); - } - }); - - return Promise.all(promises); +(async () => { + const repo = await nodegit.Repository.open(path.resolve(__dirname, "../.git")); + console.log("Opened repository."); + + // ### SHA-1 Value Conversions + + // Objects in git (commits, blobs, etc.) are referred to by their SHA value + // **nodegit** uses a simple wrapper around hash values called an `Oid`. + // The oid validates that the SHA is well-formed. + + let oid = nodegit.Oid.fromString("c27d9c35e3715539d941254f2ce57042b978c49c"); + + // Most functions in in **nodegit** that take an oid will also take a + // string, so for example, you can look up a commit by a string SHA or + // an Oid, but any functions that create new SHAs will always return + // an Oid. + + // If you have a oid, you can easily get the hex value of the SHA again. + console.log("Sha hex string:", oid.toString()); + + // ### Working with the Object Database + + // **libgit2** provides [direct access][odb] to the object database. The + // object database is where the actual objects are stored in Git. For + // working with raw objects, we'll need to get this structure from the + // repository. + const odb = await repo.odb(); + + // We can read raw objects directly from the object database if we have + // the oid (SHA) of the object. This allows us to access objects without + // knowing their type and inspect the raw bytes unparsed. + + const object = await odb.read(oid); + + // A raw object only has three properties - the type (commit, blob, tree + // or tag), the size of the raw data and the raw, unparsed data itself. + // For a commit or tag, that raw data is human readable plain ASCII + // text. For a blob it is just file contents, so it could be text or + // binary data. For a tree it is a special binary format, so it's unlikely + // to be hugely helpful as a raw object. + const data = object.data(); + const type = object.type(); + const size = object.size(); + + console.log("Object size and type:", size, type); + console.log("Raw data: ", data.toString().substring(100), "..."); + + // You can also write raw object data to Git. This is pretty cool because + // it gives you direct access to the key/value properties of Git. Here + // we'll write a new blob object that just contains a simple string. + // Notice that we have to specify the object type. + oid = await odb.write("test data", "test data".length, nodegit.Object.TYPE.BLOB); + + // Now that we've written the object, we can check out what SHA1 was + // generated when the object was written to our database. + console.log("Written Object: ", oid.toString()); + + // ### Object Parsing + + // libgit2 has methods to parse every object type in Git so you don't have + // to work directly with the raw data. This is much faster and simpler + // than trying to deal with the raw data yourself. + + // #### Commit Parsing + + // [Parsing commit objects][pco] is simple and gives you access to all the + // data in the commit - the author (name, email, datetime), committer + // (same), tree, message, encoding and parent(s). + + oid = nodegit.Oid.fromString("698c74e817243efe441a5d1f3cbaf3998282ca86"); + + // Many methods in **nodegit** are asynchronous, because they do file + // or network I/O. By convention, all asynchronous methods are named + // imperatively, like `getCommit`, `open`, `read`, `write`, etc., whereas + // synchronous methods are named nominatively, like `type`, `size`, `name`. + + const commit = await repo.getCommit(oid); + + // Each of the properties of the commit object are accessible via methods, + // including commonly needed variations, such as `git_commit_time` which + // returns the author time and `git_commit_message` which gives you the + // commit message. + console.log( + "Commit:", commit.message(), + commit.author().name(), commit.date() + ); + + // Commits can have zero or more parents. The first (root) commit will + // have no parents, most commits will have one (i.e. the commit it was + // based on) and merge commits will have two or more. Commits can + // technically have any number, though it's rare to have more than two. + const parents = await commit.getParents(); + for (const parent of parents) { + console.log("Parent:", parent.toString()); + } + + // #### Writing Commits + + // nodegit provides a couple of methods to create commit objects easily as + // well. + const author = nodegit.Signature.now("Scott Chacon", + "schacon@gmail.com"); + const committer = nodegit.Signature.now("Scott A Chacon", + "scott@github.com"); + + // Commit objects need a tree to point to and optionally one or more + // parents. Here we're creating oid objects to create the commit with, + // but you can also use existing ones: + const treeId = nodegit.Oid.fromString( + "4170d10f19600b9cb086504e8e05fe7d863358a2"); + const parentId = nodegit.Oid.fromString( + "eebd0ead15d62eaf0ba276da53af43bbc3ce43ab"); + + let tree = await repo.getTree(treeId); + const parent = await repo.getCommit(parentId); + // Here we actually create the commit object with a single call with all + // the values we need to create the commit. The SHA key is written to + // the `commit_id` variable here. + oid = await repo.createCommit( + null /* do not update the HEAD */, + author, + committer, + "example commit", + tree, + [parent] + ); + console.log("New Commit:", oid.toString()); + + // #### Tag Parsing + + // You can parse and create tags with the [tag management API][tm], which + // functions very similarly to the commit lookup, parsing and creation + // methods, since the objects themselves are very similar. + + oid = nodegit.Oid.fromString("dcc4aa9fcdaced037434cb149ed3b6eab4d0709d"); + const tag = await repo.getTag(oid); + + // Now that we have the tag object, we can extract the information it + // generally contains: the target (usually a commit object), the type of + // the target object (usually "commit"), the name ("v1.0"), the tagger (a + // git_signature - name, email, timestamp), and the tag message. + console.log(tag.name(), tag.targetType(), tag.message()); + + const target = await tag.target(); + console.log("Target is commit:", target.isCommit()); + + // #### Tree Parsing + + // A Tree is how Git represents the state of the filesystem + // at a given revision. In general, a tree corresponds to a directory, + // and files in that directory are either files (blobs) or directories. + + // [Tree parsing][tp] is a bit different than the other objects, in that + // we have a subtype which is the tree entry. This is not an actual + // object type in Git, but a useful structure for parsing and traversing + // tree entries. + + oid = nodegit.Oid.fromString("e1b0c7ea57bfc5e30ec279402a98168a27838ac9"); + tree = await repo.getTree(oid); + + console.log("Tree Size:", tree.entryCount()); + + /** + * @param {nodegit.Tree} tree + */ + function dfs(tree) { + const promises = []; + + for (const entry of tree.entries()) { + if (entry.isDirectory()) { + promises.push(entry.getTree().then(dfs)); + } else if (entry.isFile()) { + console.log("Tree Entry:", entry.name()); + } } - return dfs(tree).then(function() { - // You can also access tree entries by path if you know the path of the - // entry you're looking for. - return tree.getEntry("example/general.js").then(function(entry) { - // Entries which are files have blobs associated with them: - entry.getBlob(function(error, blob) { - console.log("Blob size:", blob.size()); - }); - }); - }); - }) - - .then(function() { - // #### Blob Parsing - - // The last object type is the simplest and requires the least parsing - // help. Blobs are just file contents and can contain anything, there is - // no structure to it. The main advantage to using the [simple blob - // api][ba] is that when you're creating blobs you don't have to calculate - // the size of the content. There is also a helper for reading a file - // from disk and writing it to the db and getting the oid back so you - // don't have to do all those steps yourself. - - oid = nodegit.Oid.fromString("991c06b7b1ec6f939488427e4b41a4fa3e1edd5f"); - return repo.getBlob(oid); - }) - - .then(function(blob) { - // You can access a node.js Buffer with the raw contents - // of the blob directly. Note that this buffer may not - // contain ASCII data for certain blobs (e.g. binary files). - var buffer = blob.content(); - - // If you know that the blob is UTF-8, however, - console.log("Blob contents:", blob.toString().slice(0, 38)); - console.log("Buffer:", buffer.toString().substring(100), "..."); - }) - - .then(function() { - // ### Revwalking - - // The libgit2 [revision walking api][rw] provides methods to traverse the - // directed graph created by the parent pointers of the commit objects. - // Since all commits point back to the commit that came directly before - // them, you can walk this parentage as a graph and find all the commits - // that were ancestors of (reachable from) a given starting point. This - // can allow you to create `git log` type functionality. - - oid = nodegit.Oid.fromString("698c74e817243efe441a5d1f3cbaf3998282ca86"); - - // To use the revwalker, create a new walker, tell it how you want to sort - // the output and then push one or more starting points onto the walker. - // If you want to emulate the output of `git log` you would push the SHA - // of the commit that HEAD points to into the walker and then start - // traversing them. You can also "hide" commits that you want to stop at - // or not see any of their ancestors. So if you want to emulate `git log - // branch1..branch2`, you would push the oid of `branch2` and hide the oid - // of `branch1`. - var revWalk = repo.createRevWalk(); - - revWalk.sorting(nodegit.Revwalk.SORT.TOPOLOGICAL, - nodegit.Revwalk.SORT.REVERSE); - - revWalk.push(oid); - - // Now that we have the starting point pushed onto the walker, we start - // asking for ancestors. It will return them in the sorting order we asked - // for as commit oids. We can then lookup and parse the commited pointed - // at by the returned OID; note that this operation is specially fast - // since the raw contents of the commit object will be cached in memory - - function walk() { - return revWalk.next().then(function(oid) { - if (!oid) { - return; - } - - return repo.getCommit(oid).then(function(commit) { - console.log("Commit:", commit.toString()); - return walk(); - }); - }); + return Promise.all(promises); + } + + await dfs(tree); + + // You can also access tree entries by path if you know the path of the + // entry you're looking for. + const entry = await tree.getEntry("example/general.js"); + // Entries which are files have blobs associated with them: + let blob = await entry.getBlob(); + console.log("Blob size:", blob.rawsize()); + + // #### Blob Parsing + + // The last object type is the simplest and requires the least parsing + // help. Blobs are just file contents and can contain anything, there is + // no structure to it. The main advantage to using the [simple blob + // api][ba] is that when you're creating blobs you don't have to calculate + // the size of the content. There is also a helper for reading a file + // from disk and writing it to the db and getting the oid back so you + // don't have to do all those steps yourself. + + oid = nodegit.Oid.fromString("991c06b7b1ec6f939488427e4b41a4fa3e1edd5f"); + blob = await repo.getBlob(oid); + // You can access a node.js Buffer with the raw contents + // of the blob directly. Note that this buffer may not + // contain ASCII data for certain blobs (e.g. binary files). + const buffer = blob.content(); + + // If you know that the blob is UTF-8, however, + console.log("Blob contents:", blob.toString().slice(0, 38)); + console.log("Buffer:", buffer.toString().substring(100), "..."); + + // ### Revwalking + + // The libgit2 [revision walking api][rw] provides methods to traverse the + // directed graph created by the parent pointers of the commit objects. + // Since all commits point back to the commit that came directly before + // them, you can walk this parentage as a graph and find all the commits + // that were ancestors of (reachable from) a given starting point. This + // can allow you to create `git log` type functionality. + + oid = nodegit.Oid.fromString("698c74e817243efe441a5d1f3cbaf3998282ca86"); + + // To use the revwalker, create a new walker, tell it how you want to sort + // the output and then push one or more starting points onto the walker. + // If you want to emulate the output of `git log` you would push the SHA + // of the commit that HEAD points to into the walker and then start + // traversing them. You can also "hide" commits that you want to stop at + // or not see any of their ancestors. So if you want to emulate `git log + // branch1..branch2`, you would push the oid of `branch2` and hide the oid + // of `branch1`. + const revWalk = repo.createRevWalk(); + + revWalk.sorting( + nodegit.Revwalk.SORT.TOPOLOGICAL, + nodegit.Revwalk.SORT.REVERSE + ); + + revWalk.push(oid); + + // Now that we have the starting point pushed onto the walker, we start + // asking for ancestors. It will return them in the sorting order we asked + // for as commit oids. We can then lookup and parse the commits pointed + // at by the returned OID; note that this operation is specially fast + // since the raw contents of the commit object will be cached in memory. + + async function walk() { + let oid; + try { + oid = await revWalk.next(); + } catch(error) { + if (error.errno !== nodegit.Error.CODE.ITEROVER) { + throw error; + } else { + return; + } } + const commit = await repo.getCommit(oid); + console.log("Commit:", commit.toString()); return walk(); - }) - - .then(function() { - // ### Index File Manipulation - - // The [index file API][gi] allows you to read, traverse, update and write - // the Git index file (sometimes thought of as the staging area). - return repo.openIndex(); - }) - - .then(function(index) { - // For each entry in the index, you can get a bunch of information - // including the SHA (oid), path and mode which map to the tree objects - // that are written out. It also has filesystem properties to help - // determine what to inspect for changes (ctime, mtime, dev, ino, uid, - // gid, file_size and flags) All these properties are exported publicly in - // the `IndexEntry` class - - index.entries().forEach(function(entry) { - console.log("Index Entry:", entry.path(), entry.mtime().seconds()); - }); - }) - - .then(function() { - // ### References - - // The [reference API][ref] allows you to list, resolve, create and update - // references such as branches, tags and remote references (everything in - // the .git/refs directory). - - return repo.getReferenceNames(nodegit.Reference.TYPE.LISTALL); - }) - - .then(function(referenceNames) { - var promises = []; - - referenceNames.forEach(function(referenceName) { - promises.push(repo.getReference(referenceName).then(function(reference) { - if (reference.isConcrete()) { - console.log("Reference:", referenceName, reference.target()); - } else if (reference.isSymbolic()) { - console.log("Reference:", referenceName, reference.symbolicTarget()); - } - })); - }); + } - return Promise.all(promises); - }) + await walk(); + + // ### Index File Manipulation + + // The [index file API][gi] allows you to read, traverse, update and write + // the Git index file (sometimes thought of as the staging area). + const index = await repo.refreshIndex(); + + // For each entry in the index, you can get a bunch of information + // including the SHA (oid), path and mode which map to the tree objects + // that are written out. It also has filesystem properties to help + // determine what to inspect for changes (ctime, mtime, dev, ino, uid, + // gid, file_size and flags) All these properties are exported publicly in + // the `IndexEntry` class + + for (const entry of index.entries()) { + console.log("Index Entry:", entry.path, entry.mtime.seconds()); + } + + // ### References + + // The [reference API][ref] allows you to list, resolve, create and update + // references such as branches, tags and remote references (everything in + // the .git/refs directory). + + const referenceNames = await repo.getReferenceNames(nodegit.Reference.TYPE.ALL); + + for (const referenceName of referenceNames) { + const reference = await repo.getReference(referenceName); + if (reference.isConcrete()) { + console.log("Reference:", referenceName, reference.target()); + } else if (reference.isSymbolic()) { + console.log("Reference:", referenceName, reference.symbolicTarget()); + } + } - .done(function() { - console.log("Done!"); - }); + console.log("Done!"); +})(); diff --git a/examples/index-add-and-remove.js b/examples/index-add-and-remove.js index 47eddd7683..74354ed5dc 100644 --- a/examples/index-add-and-remove.js +++ b/examples/index-add-and-remove.js @@ -1,12 +1,10 @@ var nodegit = require("../"); var path = require("path"); -var Promise = require("nodegit-promise"); -var promisify = require("promisify-node"); -var fse = promisify(require("fs-extra")); +var fse = require("fs-extra"); nodegit.Repository.open(path.resolve(__dirname, "../.git")) .then(function(repo) { - return repo.openIndex() + return repo.refreshIndex() .then(function(index) { var fileContent = { newFile1: "this has some content", diff --git a/examples/merge-cleanly.js b/examples/merge-cleanly.js index 096714e8e3..e277477bf8 100644 --- a/examples/merge-cleanly.js +++ b/examples/merge-cleanly.js @@ -1,8 +1,6 @@ var nodegit = require("../"); var path = require("path"); -var promisify = require("promisify-node"); -var fse = promisify(require("fs-extra")); -fse.ensureDir = promisify(fse.ensureDir); +var fse = require("fs-extra"); var ourFileName = "ourNewFile.txt"; var ourFileContent = "I like Toll Roads. I have an EZ-Pass!"; @@ -20,10 +18,10 @@ var theirCommit; var ourBranch; var theirBranch; -var ourSignature = nodegit.Signature.create("Ron Paul", - "RonPaul@TollRoadsRBest.info", 123456789, 60); -var theirSignature = nodegit.Signature.create("Greg Abbott", - "Gregggg@IllTollYourFace.us", 123456789, 60); +var ourSignature = nodegit.Signature.now("Ron Paul", + "RonPaul@TollRoadsRBest.info"); +var theirSignature = nodegit.Signature.now("Greg Abbott", + "Gregggg@IllTollYourFace.us"); // Create a new repository in a clean directory, and add our first file fse.remove(path.resolve(__dirname, repoDir)) @@ -43,14 +41,16 @@ fse.remove(path.resolve(__dirname, repoDir)) // Load up the repository index and make our initial commit to HEAD .then(function() { - return repository.openIndex(); + return repository.refreshIndex(); }) .then(function(index) { - index.read(1); - index.addByPath(ourFileName); - index.write(); - - return index.writeTree(); + return index.addByPath(ourFileName) + .then(function() { + return index.write(); + }) + .then(function() { + return index.writeTree(); + }); }) .then(function(oid) { return repository.createCommit("HEAD", ourSignature, @@ -79,14 +79,16 @@ fse.remove(path.resolve(__dirname, repoDir)) ); }) .then(function() { - return repository.openIndex(); + return repository.refreshIndex(); }) .then(function(index) { - index.read(1); - index.addByPath(theirFileName); - index.write(); - - return index.writeTree(); + return index.addByPath(theirFileName) + .then(function() { + return index.write(); + }) + .then(function() { + return index.writeTree(); + }); }) .then(function(oid) { // You don"t have to change head to make a commit to a different branch. @@ -112,7 +114,6 @@ fse.remove(path.resolve(__dirname, repoDir)) // the repository instead of just writing it. .then(function(index) { if (!index.hasConflicts()) { - index.write(); return index.writeTreeTo(repository); } }) diff --git a/examples/merge-with-conflicts.js b/examples/merge-with-conflicts.js index b296112b5c..55fb87d3b8 100644 --- a/examples/merge-with-conflicts.js +++ b/examples/merge-with-conflicts.js @@ -1,8 +1,6 @@ var nodegit = require("../"); var path = require("path"); -var promisify = require("promisify-node"); -var fse = promisify(require("fs-extra")); -fse.ensureDir = promisify(fse.ensureDir); +var fse = require("fs-extra"); var repoDir = "../../newRepo"; var fileName = "newFile.txt"; @@ -12,12 +10,12 @@ var ourFileContent = "Big Bobs are best, IMHO.\n"; var theirFileContent = "Nobody expects the small Bobquisition!\n"; var finalFileContent = "Big Bobs are beautiful and the small are unexpected!\n"; -var baseSignature = nodegit.Signature.create("Peaceful Bob", - "justchill@bob.net", 123456789, 60); -var ourSignature = nodegit.Signature.create("Big Bob", - "impressive@bob.net", 123456789, 60); -var theirSignature = nodegit.Signature.create("Small Bob", - "underestimated@bob.net", 123456789, 60); +var baseSignature = nodegit.Signature.now("Peaceful Bob", + "justchill@bob.net"); +var ourSignature = nodegit.Signature.now("Big Bob", + "impressive@bob.net"); +var theirSignature = nodegit.Signature.now("Small Bob", + "underestimated@bob.net"); var ourBranchName = "ours"; var theirBranchName = "theirs"; @@ -49,14 +47,16 @@ fse.remove(path.resolve(__dirname, repoDir)) // Load up the repository index and make our initial commit to HEAD .then(function() { - return repository.openIndex(); + return repository.refreshIndex(); }) .then(function(index) { - index.read(1); - index.addByPath(fileName); - index.write(); - - return index.writeTree(); + return index.addByPath(fileName) + .then(function() { + return index.write(); + }) + .then(function() { + return index.writeTree(); + }); }) .then(function(oid) { return repository.createCommit("HEAD", baseSignature, @@ -94,13 +94,15 @@ fse.remove(path.resolve(__dirname, repoDir)) ); }) .then(function() { - return repository.openIndex() + return repository.refreshIndex() .then(function(index) { - index.read(1); - index.addByPath(fileName); - index.write(); - - return index.writeTree(); + return index.addByPath(fileName) + .then(function() { + return index.write(); + }) + .then(function() { + return index.writeTree(); + }); }); }) .then(function(oid) { @@ -122,12 +124,15 @@ fse.remove(path.resolve(__dirname, repoDir)) ); }) .then(function() { - return repository.openIndex().then(function(index) { - index.read(1); - index.addByPath(fileName); - index.write(); - - return index.writeTree(); + return repository.refreshIndex() + .then(function(index) { + return index.addByPath(fileName) + .then(function() { + return index.write(); + }) + .then(function() { + return index.writeTree(); + }); }); }) .then(function(oid) { @@ -170,16 +175,18 @@ fse.remove(path.resolve(__dirname, repoDir)) } }) -// we need to get a new index as the other one isnt backed to -// the repository in the usual fashion, and just behaves weirdly +// we need to get a new index as the other one is not backed to +// the repository in the usual fashion, and just behaves weirdly. .then(function() { - return repository.openIndex().then(function(index) { - - index.read(1); - index.addByPath(fileName); - index.write(); - - return index.writeTree(); + return repository.refreshIndex() + .then(function(index) { + return index.addByPath(fileName) + .then(function() { + return index.write(); + }) + .then(function() { + return index.writeTree(); + }); }); }) .then(function(oid) { diff --git a/examples/pull.js b/examples/pull.js index 0ef5b133be..fe2d83411a 100644 --- a/examples/pull.js +++ b/examples/pull.js @@ -11,11 +11,13 @@ nodegit.Repository.open(path.resolve(__dirname, repoDir)) repository = repo; return repository.fetchAll({ - credentials: function(url, userName) { - return nodegit.Cred.sshKeyFromAgent(userName); - }, - certificateCheck: function() { - return 1; + callbacks: { + credentials: function(url, userName) { + return nodegit.Cred.sshKeyFromAgent(userName); + }, + certificateCheck: function() { + return 0; + } } }); }) diff --git a/examples/push.js b/examples/push.js index 1c9b2ee2ae..5c19b70349 100644 --- a/examples/push.js +++ b/examples/push.js @@ -1,8 +1,6 @@ var nodegit = require("../"); var path = require("path"); -var promisify = require("promisify-node"); -var fse = promisify(require("fs-extra")); -fse.ensureDir = promisify(fse.ensureDir); +var fse = require("fs-extra"); var fileName = "newFile.txt"; var fileContent = "hello world"; @@ -12,8 +10,8 @@ var repoDir = "../../newRepo"; var repository; var remote; -var signature = nodegit.Signature.create("Foo bar", - "foo@bar.com", 123456789, 60); +var signature = nodegit.Signature.now("Foo bar", + "foo@bar.com"); // Create a new repository in a clean directory, and add our first file fse.remove(path.resolve(__dirname, repoDir)) @@ -30,14 +28,16 @@ fse.remove(path.resolve(__dirname, repoDir)) // Load up the repository index and make our initial commit to HEAD .then(function() { - return repository.openIndex(); + return repository.refreshIndex(); }) .then(function(index) { - index.read(1); - index.addByPath(fileName); - index.write(); - - return index.writeTree(); + return index.addByPath(fileName) + .then(function() { + return index.write(); + }) + .then(function() { + return index.writeTree(); + }); }) .then(function(oid) { return repository.createCommit("HEAD", signature, signature, @@ -51,18 +51,17 @@ fse.remove(path.resolve(__dirname, repoDir)) .then(function(remoteResult) { remote = remoteResult; - remote.setCallbacks({ - credentials: function(url, userName) { - return nodegit.Cred.sshKeyFromAgent(userName); - } - }); - // Create the push object for this remote return remote.push( ["refs/heads/master:refs/heads/master"], - null, - repository.defaultSignature(), - "Push to master"); + { + callbacks: { + credentials: function(url, userName) { + return nodegit.Cred.sshKeyFromAgent(userName); + } + } + } + ); }); }).done(function() { console.log("Done!"); diff --git a/examples/read-file.js b/examples/read-file.js index 4203a5cf4e..9da5ed1758 100644 --- a/examples/read-file.js +++ b/examples/read-file.js @@ -1,25 +1,19 @@ -var nodegit = require("../"), - path = require("path"); +const nodegit = require("../"); +const path = require("path"); // This example opens a certain file, `README.md`, at a particular commit, // and prints the first 10 lines as well as some metadata. -var _entry; -nodegit.Repository.open(path.resolve(__dirname, "../.git")) - .then(function(repo) { - return repo.getCommit("59b20b8d5c6ff8d09518454d4dd8b7b30f095ab5"); - }) - .then(function(commit) { - return commit.getEntry("README.md"); - }) - .then(function(entry) { - _entry = entry; - return _entry.getBlob(); - }) - .then(function(blob) { - console.log(_entry.filename(), _entry.sha(), blob.rawsize() + "b"); - console.log("========================================================\n\n"); - var firstTenLines = blob.toString().split("\n").slice(0, 10).join("\n"); - console.log(firstTenLines); - console.log("..."); - }) - .done(); + +(async () => { + const repo = await nodegit.Repository.open(path.resolve(__dirname, "../.git")); + const commit = await repo.getCommit("59b20b8d5c6ff8d09518454d4dd8b7b30f095ab5"); + const entry = await commit.getEntry("README.md"); + const blob = await entry.getBlob(); + + console.log(entry.name(), entry.sha(), blob.rawsize() + "b"); + console.log("========================================================\n\n"); + const firstTenLines = blob.toString().split("\n").slice(0, 10).join("\n"); + console.log(firstTenLines); + console.log("..."); +})(); + diff --git a/examples/remove-and-commit.js b/examples/remove-and-commit.js index fd6ddc6b80..4ba8c777a5 100644 --- a/examples/remove-and-commit.js +++ b/examples/remove-and-commit.js @@ -17,15 +17,16 @@ var _oid; nodegit.Repository.open(path.resolve(__dirname, "../.git")) .then(function(repo) { _repository = repo; - return repo.openIndex(); + return repo.refreshIndex(); }) .then(function(index){ _index = index; - return _index.read(); }) .then(function() { //remove the file from the index... - _index.removeByPath(fileName); + return _index.removeByPath(fileName); + }) + .then(function() { return _index.write(); }) .then(function() { @@ -39,10 +40,10 @@ nodegit.Repository.open(path.resolve(__dirname, "../.git")) return _repository.getCommit(head); }) .then(function(parent) { - var author = nodegit.Signature.create("Scott Chacon", - "schacon@gmail.com", 123456789, 60); - var committer = nodegit.Signature.create("Scott A Chacon", - "scott@github.com", 987654321, 90); + var author = nodegit.Signature.now("Scott Chacon", + "schacon@gmail.com"); + var committer = nodegit.Signature.now("Scott A Chacon", + "scott@github.com"); return _repository.createCommit("HEAD", author, committer, "message", _oid, [parent]); diff --git a/examples/walk-history-for-file.js b/examples/walk-history-for-file.js index b1c331ab16..f094154555 100644 --- a/examples/walk-history-for-file.js +++ b/examples/walk-history-for-file.js @@ -1,55 +1,62 @@ var nodegit = require("../"), - path = require("path"); + path = require("path"), + historyFile = "generate/input/descriptor.json", + walker, + historyCommits = [], + commit, + repo; // This code walks the history of the master branch and prints results // that look very similar to calling `git log` from the command line +function compileHistory(resultingArrayOfCommits) { + var lastSha; + if (historyCommits.length > 0) { + lastSha = historyCommits[historyCommits.length - 1].commit.sha(); + if ( + resultingArrayOfCommits.length == 1 && + resultingArrayOfCommits[0].commit.sha() == lastSha + ) { + return; + } + } + + resultingArrayOfCommits.forEach(function(entry) { + historyCommits.push(entry); + }); + + lastSha = historyCommits[historyCommits.length - 1].commit.sha(); + + walker = repo.createRevWalk(); + walker.push(lastSha); + walker.sorting(nodegit.Revwalk.SORT.TIME); + + return walker.fileHistoryWalk(historyFile, 500) + .then(compileHistory); +} + nodegit.Repository.open(path.resolve(__dirname, "../.git")) - .then(function(repo) { + .then(function(r) { + repo = r; return repo.getMasterCommit(); }) .then(function(firstCommitOnMaster){ // History returns an event. - var history = firstCommitOnMaster.history(nodegit.Revwalk.SORT.Time); - var commits = []; - - // History emits "commit" event for each commit in the branch's history - history.on("commit", function(commit) { - return commit.getDiff() - .then(function(diffList) { - var addCommit = diffList.reduce(function(prevVal, diff) { - var result = - prevVal || - diff.patches().reduce(function(prevValDiff, patch) { - - var result = - prevValDiff || - !!~patch.oldFile().path().indexOf("descriptor.json") || - !!~patch.newFile().path().indexOf("descriptor.json"); - - return result; - }, false); - - return result; - }, false); - - if (addCommit) { - commits.push(commit); - } - }); - }); + walker = repo.createRevWalk(); + walker.push(firstCommitOnMaster.sha()); + walker.sorting(nodegit.Revwalk.SORT.Time); - history.on("end", function() { - commits.forEach(function(commit) { - console.log("commit " + commit.sha()); - console.log("Author:", commit.author().name() + - " <" + commit.author().email() + ">"); - console.log("Date:", commit.date()); - console.log("\n " + commit.message()); - }); + return walker.fileHistoryWalk(historyFile, 500); + }) + .then(compileHistory) + .then(function() { + historyCommits.forEach(function(entry) { + commit = entry.commit; + console.log("commit " + commit.sha()); + console.log("Author:", commit.author().name() + + " <" + commit.author().email() + ">"); + console.log("Date:", commit.date()); + console.log("\n " + commit.message()); }); - - // Don't forget to call `start()`! - history.start(); }) .done(); diff --git a/examples/walk-history.js b/examples/walk-history.js index 2e41ce2da6..7bdab9fb96 100644 --- a/examples/walk-history.js +++ b/examples/walk-history.js @@ -10,7 +10,7 @@ nodegit.Repository.open(path.resolve(__dirname, "../.git")) }) .then(function(firstCommitOnMaster){ // History returns an event. - var history = firstCommitOnMaster.history(nodegit.Revwalk.SORT.Time); + var history = firstCommitOnMaster.history(nodegit.Revwalk.SORT.TIME); // History emits "commit" event for each commit in the branch's history history.on("commit", function(commit) { diff --git a/generate/README.md b/generate/README.md new file mode 100644 index 0000000000..3ee5446d60 --- /dev/null +++ b/generate/README.md @@ -0,0 +1,21 @@ +## /generate + +The scripts and templates in this dir help generate the source code and tests for NodeGit. The major components of generate are: + + 1. Input + 2. Scripts + 3. Templates + +### Input + + All the **configuration** required for the parser to generate the source code and tests. For more details, check the Input directory. + +### Scripts + + The scripts that generate the final configuration (*snapshot of the library*) `idefs.json`, `missing-tests.json`. These configurations are then used to generate `src` for the library. + +### Templates + + All the Combyne templates are placed here. The filters, partials, templates all help NodeGit generate the source code. + + > For more information on Combyne: [tbranyen/combyne](https://github.com/tbranyen/combyne) diff --git a/generate/index.js b/generate/index.js index e499835f4b..753897d5b7 100644 --- a/generate/index.js +++ b/generate/index.js @@ -1,20 +1,50 @@ -var Promise = require('nodegit-promise'); var generateJson = require("./scripts/generateJson"); var generateNativeCode = require("./scripts/generateNativeCode"); var generateMissingTests = require("./scripts/generateMissingTests"); +var submoduleStatus = require("../lifecycleScripts/submodules/getStatus"); module.exports = function generate() { - return new Promise(function(resolve, reject) { + console.log("[nodegit] Generating native code"); + + function tryGenerate(numRetries = 3) { + // There appears to be a race condition in the generate code somewhere + // Until we fix that, we should try to generate a few times before try { generateJson(); generateNativeCode(); generateMissingTests(); - resolve(); - } - catch(e) { - reject(e); + } catch (error) { + if (numRetries > 0) { + console.log("[nodegit] WARNING - Failed to generate native code, trying again"); + tryGenerate(numRetries - 1); + } else { + throw error; + } } - }); + } + + return submoduleStatus() + .then(function(statuses) { + var dirtySubmodules = statuses + .filter(function(status) { + return status.onNewCommit + || status.needsInitialization + || status.workDirDirty; + }); + + if (dirtySubmodules.length) { + console.warn("[nodegit] WARNING - Some submodules are out-of-sync"); + dirtySubmodules.forEach(function(submodule) { + console.warn("[nodegit]\t" + submodule.name); + }); + } + }) + .then(tryGenerate) + .catch(function(e) { + console.error("[nodegit] ERROR - Could not generate native code"); + console.error(e); + throw e; + }); } if (require.main === module) { diff --git a/generate/input/README.md b/generate/input/README.md new file mode 100644 index 0000000000..f0d7573eed --- /dev/null +++ b/generate/input/README.md @@ -0,0 +1,15 @@ +## /generate/input + This folder contains the main config files to generate NodeGit's JavaScript functions. + + #### callbacks.json + Add all meta data about the callbacks from libgit2 that need to be implemented in NodeGit. + + #### descriptor.json + Customize the generated code using this configuration file. Enter the function's signature, arguments and their metadata and which functions can be skipped in this file. If you are using a manual template, remove all of its references from this file. + + #### libgit2-docs.json + These are provided by the libgit2 team. It includes all the metadata about the API provided by the libgit2 library. To grab the latest version of this file, download https://libgit2.org/libgit2/HEAD.json. + + #### libgit2-supplement.json + Use this confiuration file to group and override parts of the generated code. NodeGit tries its best to generate the right classes and structs, if it is not quite right, then use this config file to group/remove the functions. + > If you're using manual templates, update the `cFile` reference to point to the manual template. diff --git a/generate/input/callbacks.json b/generate/input/callbacks.json index 4d2c77c8e4..aa08429954 100644 --- a/generate/input/callbacks.json +++ b/generate/input/callbacks.json @@ -1,13 +1,28 @@ { - "git_attr_foreach_cb": { + "git_apply_delta_cb": { "args": [ { - "name": "name", - "cType": "const char *" + "name": "delta", + "cType": "const git_diff_delta *" }, { - "name": "value", - "cType": "const char *" + "name": "payload", + "cType": "void *" + } + ], + "return": { + "type": "int", + "noResults": 1, + "success": 0, + "error": -1, + "cancel": -1 + } + }, + "git_apply_hunk_cb": { + "args": [ + { + "name": "hunk", + "cType": "const git_diff_hunk *" }, { "name": "payload", @@ -18,14 +33,19 @@ "type": "int", "noResults": 1, "success": 0, - "error": -1 + "error": -1, + "cancel": -1 } }, - "git_blob_chunk_cb": { + "git_attr_foreach_cb": { "args": [ { - "name": "entry", - "cType": "const git_config_entry *" + "name": "name", + "cType": "const char *" + }, + { + "name": "value", + "cType": "const char *" }, { "name": "payload", @@ -36,7 +56,8 @@ "type": "int", "noResults": 1, "success": 0, - "error": -1 + "error": -1, + "cancel": -1 } }, "git_checkout_notify_cb": { @@ -70,7 +91,8 @@ "type": "int", "noResults": 1, "success": 0, - "error": -1 + "error": -1, + "cancel": 0 } }, "git_checkout_progress_cb": { @@ -93,10 +115,8 @@ } ], "return": { - "type": "int", - "noResults": 1, - "success": 0, - "error": -1 + "type": "void", + "throttle": 100 } }, "git_checkout_perfdata_cb": { @@ -110,11 +130,57 @@ "cType": "void *" } ], + "return": { + "type": "void", + "throttle": 100 + } + }, + "git_commit_create_cb": { + "args": [ + { + "name": "out", + "cType": "git_oid *", + "isReturn": true + }, + { + "name": "author", + "cType": "const git_signature *" + }, + { + "name": "committer", + "cType": "const git_signature *" + }, + { + "name": "message_encoding", + "cType": "const char *" + }, + { + "name": "message", + "cType": "const char *" + }, + { + "name": "tree", + "cType": "const git_tree *" + }, + { + "name": "parent_count", + "cType": "size_t" + }, + { + "name": "parents", + "cType": "const git_oid * []" + }, + { + "name": "payload", + "cType": "void *" + } + ], "return": { "type": "int", - "noResults": 1, + "noResults": -30, "success": 0, - "error": -1 + "error": -1, + "cancel": -1 } }, "git_config_foreach_cb": { @@ -132,14 +198,15 @@ "type": "int", "noResults": 1, "success": 0, - "error": -1 + "error": -1, + "cancel": -1 } }, - "git_cred_acquire_cb": { + "git_credential_acquire_cb": { "args": [ { - "name": "cred", - "cType": "git_cred **", + "name": "credential", + "cType": "git_credential **", "isReturn": true }, { @@ -163,7 +230,8 @@ "type": "int", "noResults": 1, "success": 0, - "error": -1 + "error": -1, + "cancel": -1 } }, "git_diff_binary_cb": { @@ -185,7 +253,8 @@ "type": "int", "noResults": 0, "success": 0, - "error": -1 + "error": -1, + "cancel": -1 } }, "git_diff_file_cb": { @@ -207,7 +276,8 @@ "type": "int", "noResults": 1, "success": 0, - "error": -1 + "error": -1, + "cancel": -1 } }, "git_diff_hunk_cb": { @@ -229,7 +299,8 @@ "type": "int", "noResults": 1, "success": 0, - "error": -1 + "error": -1, + "cancel": -1 } }, "git_diff_line_cb": { @@ -255,14 +326,16 @@ "type": "int", "noResults": 1, "success": 0, - "error": -1 + "error": -1, + "cancel": -1 } }, "git_diff_notify_cb": { "args": [ { "name": "diff_so_far", - "cType": "const git_diff *" + "cType": "const git_diff *", + "ignore": true }, { "name": "delta_to_add", @@ -281,7 +354,135 @@ "type": "int", "noResults": 1, "success": 0, - "error": -1 + "error": -1, + "cancel": -1 + } + }, + "git_diff_progress_cb": { + "args": [ + { + "name": "diff_so_far", + "cType": "const git_diff *", + "ignore": true + }, + { + "name": "old_path", + "cType": "const char *" + }, + { + "name": "new_path", + "cType": "const char *" + }, + { + "name": "payload", + "cType": "void *" + } + ], + "return": { + "type": "int", + "noResults": 1, + "success": 0, + "error": -1, + "cancel": -1 + } + }, + "git_filter_apply_fn": { + "args": [ + { + "name": "self", + "cType": "git_filter *" + }, + { + "name": "payload", + "cType": "void **" + }, + { + "name": "to", + "cType": "git_buf *" + }, + { + "name": "from", + "cType": "const git_buf *" + }, + { + "name": "src", + "cType": "const git_filter_source *" + } + ], + "return": { + "type": "int", + "noResults": -30, + "success": 0, + "error": -1, + "cancel": -1 + } + }, + "git_filter_check_fn": { + "args": [ + { + "name": "self", + "cType": "git_filter *" + }, + { + "name": "payload", + "cType": "void **" + }, + { + "name": "src", + "cType": "const git_filter_source *" + }, + { + "name": "attr_values", + "cType": "const char **" + } + ], + "return": { + "type": "int", + "noResults": -30, + "success": 0, + "error": -1, + "cancel": -1 + } + }, + "git_filter_cleanup_fn": { + "args": [ + { + "name": "self", + "cType": "git_filter *" + }, + { + "name": "payload", + "cType": "void *" + } + ], + "return": { + "type": "void" + } + }, + "git_filter_init_fn": { + "args": [ + { + "name": "self", + "cType": "git_filter *" + } + ], + "return": { + "type": "int", + "noResults": 0, + "success": 0, + "error": -1, + "cancel": -1 + } + }, + "git_filter_shutdown_fn": { + "args": [ + { + "name": "self", + "cType": "git_filter *" + } + ], + "return": { + "type": "void" } }, "git_index_matched_path_cb": { @@ -303,7 +504,28 @@ "type": "int", "noResults": 1, "success": 0, - "error": -1 + "error": -1, + "cancel": -1 + } + }, + "git_indexer_progress_cb": { + "args": [ + { + "name": "stats", + "cType": "const git_indexer_progress *" + }, + { + "name": "payload", + "cType": "void *" + } + ], + "return": { + "type": "int", + "noResults": 0, + "success": 0, + "error": -1, + "cancel": -1, + "throttle": 100 } }, "git_note_foreach_cb": { @@ -325,7 +547,8 @@ "type": "int", "noResults": 0, "success": 0, - "error": -1 + "error": -1, + "cancel": -1 } }, "git_odb_foreach_cb": { @@ -338,7 +561,14 @@ "name": "payload", "cType": "void *" } - ] + ], + "return": { + "type": "int", + "noResults": 0, + "success": 0, + "error": -1, + "cancel": -1 + } }, "git_packbuilder_foreach_cb": { "args": [ @@ -359,14 +589,38 @@ "type": "int", "noResults": 1, "success": 0, - "error": -1 + "error": -1, + "cancel": -1 + } + }, + "git_push_update_reference_cb": { + "args": [ + { + "name": "refname", + "cType": "const char *" + }, + { + "name": "status", + "cType": "const char *" + }, + { + "name": "data", + "cType": "void *" + } + ], + "return": { + "type": "int", + "noResults": 1, + "success": 0, + "error": -1, + "cancel": -1 } }, "git_remote_create_cb": { "args": [ { "name": "out", - "cType": "git_repository **", + "cType": "git_remote **", "isReturn": true }, { @@ -390,7 +644,29 @@ "type": "int", "noResults": 0, "success": 0, - "error": 1 + "error": -1, + "cancel": -1 + } + }, + "git_remote_ready_cb": { + "args": [ + { + "name": "remote", + "cType": "git_remote *" + }, + { + "name": "direction", + "cType": "int" + }, + { + "name": "payload", + "cType": "void *" + } + ], + "return": { + "type": "int", + "success": 0, + "error": -1 } }, "git_repository_create_cb": { @@ -417,7 +693,8 @@ "type": "int", "noResults": 0, "success": 0, - "error": 1 + "error": 1, + "cancel": -1 } }, "git_reference_foreach_cb": { @@ -435,7 +712,8 @@ "type": "int", "noResults": 1, "success": 0, - "error": -1 + "error": -1, + "cancel": -1 } }, "git_reference_foreach_name_cb": { @@ -453,7 +731,8 @@ "type": "int", "noResults": 1, "success": 0, - "error": -1 + "error": -1, + "cancel": -1 } }, "git_repository_fetchhead_foreach_cb": { @@ -483,7 +762,8 @@ "type": "int", "noResults": 0, "success": 0, - "error": 1 + "error": -1, + "cancel": -1 } }, "git_repository_mergehead_foreach_cb": { @@ -501,7 +781,8 @@ "type": "int", "noResults": 0, "success": 0, - "error": 1 + "error": -1, + "cancel": -1 } }, "git_revwalk_hide_cb": { @@ -519,30 +800,8 @@ "type": "int", "noResults": 1, "success": 0, - "error": -1 - } - }, - "git_smart_subtransport_cb": { - "args": [ - { - "name": "out", - "cType": "git_smart_subtransport **", - "isReturn": true - }, - { - "name": "owner", - "cType": "git_transport*" - }, - { - "name": "param", - "cType": "void *" - } - ], - "return": { - "type": "int", - "noResults": 0, - "success": 0, - "error": -1 + "error": -1, + "cancel": -1 } }, "git_stash_apply_progress_cb": { @@ -560,7 +819,9 @@ "type": "int", "noResults":0, "success": 0, - "error": -1 + "error": -1, + "cancel": -1, + "throttle": 100 } }, "git_stash_cb": { @@ -586,7 +847,8 @@ "type": "int", "noResults":0, "success": 0, - "error": -1 + "error": -1, + "cancel": -1 } }, "git_status_cb": { @@ -608,7 +870,31 @@ "type": "int", "noResults": 0, "success": 0, - "error": -1 + "error": -1, + "cancel": -1 + } + }, + "git_submodule_cb": { + "args": [ + { + "name": "sm", + "cType": "git_submodule *" + }, + { + "name": "name", + "cType": "const char *" + }, + { + "name": "payload", + "cType": "void *" + } + ], + "return": { + "type": "int", + "noResults": 0, + "success": 0, + "error": -1, + "cancel": -1 } }, "git_tag_foreach_cb": { @@ -630,25 +916,36 @@ "type": "int", "noResults": 1, "success": 0, - "error": -1 + "error": -1, + "cancel": -1 } }, - "git_transfer_progress_cb": { + "git_push_transfer_progress_cb": { "args": [ { - "name": "stats", - "cType": "const git_transfer_progress *" + "name": "current", + "type": "unsigned int" + }, + { + "name": "total", + "type": "unsigned int" + }, + { + "name": "bytes", + "type": "size_t" }, { "name": "payload", - "cType": "void *" + "type": "void *" } ], "return": { "type": "int", "noResults": 0, "success": 0, - "error": -1 + "error": -1, + "cancel": -1, + "throttle": 100 } }, "git_transport_cb": { @@ -671,7 +968,8 @@ "type": "int", "noResults": 1, "success": 0, - "error": -1 + "error": -1, + "cancel": -1 } }, "git_transport_certificate_check_cb": { @@ -697,7 +995,8 @@ "type": "int", "noResults": 1, "success": 0, - "error": -1 + "error": -1, + "cancel": -1 } }, "git_transport_message_cb": { @@ -719,7 +1018,8 @@ "type": "int", "noResults": 1, "success": 0, - "error": -1 + "error": -1, + "cancel": -1 } }, "git_treebuilder_filter_cb": { @@ -737,7 +1037,8 @@ "type": "int", "noResults": 1, "success": 0, - "error": -1 + "error": -1, + "cancel": 0 } }, "git_treewalk_cb": { @@ -759,7 +1060,35 @@ "type": "int", "noResults": 1, "success": 0, - "error": -1 + "error": -1, + "cancel": -1 + } + }, + "git_url_resolve_cb": { + "args": [ + { + "name": "url_resolved", + "cType": "git_buf *" + }, + { + "name": "url", + "cType": "const char *" + }, + { + "name": "direction", + "cType": "int" + }, + { + "name": "payload", + "cType": "void *" + } + ], + "return": { + "type": "int", + "noResults": -30, + "success": 0, + "error": -1, + "cancel": -30 } } } diff --git a/generate/input/descriptor.json b/generate/input/descriptor.json index f9008e6ee7..99837534db 100644 --- a/generate/input/descriptor.json +++ b/generate/input/descriptor.json @@ -4,6 +4,19 @@ "JsName": "STATES", "isMask": false }, + "blob_filter_flag": { + "values": { + "GIT_BLOB_FILTER_CHECK_FOR_BINARY": { + "JsName": "CHECK_FOR_BINARY" + }, + "GIT_BLOB_FILTER_NO_SYSTEM_ATTRIBUTES": { + "JsName": "NO_SYSTEM_ATTRIBUTES" + }, + "GIT_BLOB_FILTER_ATTTRIBUTES_FROM_HEAD": { + "JsName": "ATTTRIBUTES_FROM_HEAD" + } + } + }, "branch": { "JsName": "BRANCH", "isMask": false @@ -20,6 +33,10 @@ } } }, + "credential": { + "JsName": "TYPE", + "owner": "Credential" + }, "describe_strategy": { "ignore": true }, @@ -48,12 +65,20 @@ "repository_init_flag": { "removeString": "INIT_" }, - "otype": { + "object": { "JsName": "TYPE", "owner": "Object", "removeString": "OBJ_" }, - "ref": { + "oid": { + "JsName": "TYPE", + "owner": "Oid" + }, + "proxy": { + "JsName": "PROXY", + "isMask": false + }, + "reference": { "owner": "Reference", "JsName": "TYPE" }, @@ -61,25 +86,95 @@ "JsName": "TYPE", "isMask": false }, + "revspec": { + "JsName": "TYPE", + "isMask": false + }, "sort": { "owner": "Revwalk" }, "status": { "JsName": "STATUS", "isMask": false + }, + "stream": { + "ignore": true } }, "types": { - "annotated": { + "allocator": { + "ignore": true + }, + "annotated_commit": { + "selfFreeing": true, "functions": { "git_annotated_commit_free": { "ignore": true + }, + "git_annotated_commit_id": { + "return": { + "ownedByThis": true + } + }, + "git_annotated_commit_from_ref": { + "args": { + "out": { + "ownedBy": ["repo"] + } + } + }, + "git_annotated_commit_from_fetchhead": { + "args": { + "out": { + "ownedBy": ["repo"] + } + } + }, + "git_annotated_commit_lookup": { + "args": { + "out": { + "ownedBy": ["repo"] + } + } + }, + "git_annotated_commit_from_revspec": { + "args": { + "out": { + "ownedBy": ["repo"] + } + } + } + } + }, + "apply_options": { + "hasConstructor": true + }, + "apply": { + "functions": { + "git_apply": { + "args": { + "options": { + "isOptional": true + } + }, + "isAsync": true, + "return": { + "isErrorCode": true + } + }, + "git_apply_options_init": { + "ignore": true } } }, "attr": { "functions": { + "git_attr_cache_flush": { + "return": { + "isErrorCode": true + } + }, "git_attr_foreach": { "ignore": true }, @@ -89,20 +184,66 @@ "value_out": { "isReturn": true } + }, + "return": { + "isErrorCode": true } }, "git_attr_get_many": { + "isAsync": true, "args": { "values_out": { "isReturn": true, "jsClassName": "Array" } + }, + "return": { + "isErrorCode": true } } } }, "blame": { - "cType": "git_blame" + "selfFreeing": true, + "cType": "git_blame", + "functions": { + "git_blame_buffer": { + "args": { + "out": { + "ownedBy": ["reference"] + } + } + }, + "git_blame_file": { + "args": { + "out": { + "ownedBy": ["repo"] + }, + "options": { + "isOptional": true + } + } + }, + "git_blame_free": { + "ignore": true + }, + "git_blame_get_hunk_byindex": { + "return": { + "ownedByThis": true + } + }, + "git_blame_get_hunk_byline": { + "return": { + "ownedByThis": true + } + }, + "git_blame_init_options": { + "ignore": true + }, + "git_blame_options_init": { + "ignore": true + } + } }, "blame_hunk": { "fields": { @@ -112,9 +253,14 @@ } }, "blob": { + "selfFreeing": true, + "ownerFn": { + "name": "git_blob_owner", + "singletonCppClassName": "GitRepository" + }, "functions": { - "git_blob_create_frombuffer": { - "isAsync": false, + "git_blob_create_from_buffer": { + "isAsync": true, "args": { "id": { "isReturn": true @@ -123,16 +269,114 @@ "cppClassName": "Buffer", "jsClassName": "Buffer" } + }, + "return": { + "isErrorCode": true + } + }, + "git_blob_create_from_workdir": { + "isAsync": true, + "args": { + "id": { + "isReturn": true + } + }, + "return": { + "isErrorCode": true + } + }, + "git_blob_create_fromworkdir": { + "ignore": true + }, + "git_blob_create_from_disk": { + "isAsync": true, + "args": { + "id": { + "isReturn": true + } + }, + "return": { + "isErrorCode": true + } + }, + "git_blob_create_from_stream": { + "ignore": true + }, + "git_blob_create_from_stream_commit": { + "ignore": true + }, + "git_blob_filter": { + "isAsync": true, + "isPrototypeMethod": true, + "args": { + "out": { + "isReturn": true, + "cppClassName": "GitBuf", + "jsClassName": "Buffer", + "shouldAlloc": true + }, + "blob": { + "cppClassName": "GitBlob", + "jsClassName": "Blob", + "isSelf": true + }, + "as_path": { + "cppClassName": "String", + "jsClassName": "String", + "cType": "const char *" + }, + "opts": { + "isOptional": true + } + }, + "return": { + "isErrorCode": true } }, - "git_blob_create_fromchunks": { + "git_blob_filter_options_init": { "ignore": true }, "git_blob_filtered_content": { + "isAsync": true, + "isPrototypeMethod": false, + "args": { + "out": { + "isReturn": true, + "cppClassName": "GitBuf", + "jsClassName": "Buffer", + "shouldAlloc": true + }, + "blob": { + "cppClassName": "GitBlob", + "jsClassName": "Blob", + "isSelf": false + }, + "as_path": { + "cppClassName": "String", + "jsClassName": "String", + "cType": "const char *" + }, + "check_for_binary_data": { + "cppClassName": "Number", + "jsClassName": "Number", + "cType": "int" + } + }, + "return": { + "isErrorCode": true + } + }, + "git_blob_free": { "ignore": true }, + "git_blob_id": { + "return": { + "ownedByThis": true + } + }, "git_blob_rawcontent": { "return": { + "ownedByThis": true, "cppClassName": "Wrapper", "jsClassName": "Buffer" } @@ -143,11 +387,11 @@ "node_buffer.h" ] }, + "blob_filter_options": { + "hasConstructor": true + }, "branch": { "functions": { - "git_branch_iterator_free": { - "ignore": true - }, "git_branch_create": { "args": { "force": { @@ -162,6 +406,7 @@ } }, "git_branch_create_from_annotated": { + "isAsync": true, "args": { "ref_out": { "isReturn": true @@ -172,37 +417,75 @@ "force": { "isOptional": true } + }, + "return": { + "isErrorCode": true } }, + "git_branch_iterator_free": { + "ignore": true + }, + "git_branch_iterator_new": { + "ignore": true + }, "git_branch_next": { "ignore": true }, + "git_branch_remote_name": { + "cppFunctionName": "RemoteName", + "jsFunctionName": "remoteName", + "isAsync": true, + "args": { + "out": { + "isReturn": true, + "cppClassName": "GitBuf", + "jsClassName": "Buffer", + "cType": "git_buf *", + "shouldAlloc": true + } + }, + "return": { + "isErrorCode": true + } + }, "git_branch_set_upstream": { - "isAsync": false, + "isAsync": true, "args": { - "upstream_name": { + "branch_name": { "isOptional": true } + }, + "return" : { + "isReturn": true, + "isErrorCode": true } }, "git_branch_upstream": { - "isAsync": false, + "isAsync": true, "return" : { + "isReturn": true, "isErrorCode": true } } - } + }, + "dependencies": [ + "../include/buf.h" + ] }, "buf": { + "freeFunctionName": "git_buf_dispose", "functions": { + "git_buf_free": { + "ignore": true + }, "git_buf_grow": { "cppFunctionName": "Grow", "jsFunctionName": "grow", "args": { "buffer": { - "isReturn": true, - "isSelf": false, - "shouldAlloc": true + "isReturn": false, + "isSelf": true, + "shouldAlloc": false } }, "return": { @@ -210,16 +493,16 @@ "jsClassName": "Number", "isErrorCode": true }, - "isAsync": true + "isAsync": false }, "git_buf_set": { "cppFunctionName": "Set", "jsFunctionName": "set", "args": { "buffer": { - "isReturn": true, - "isSelf": false, - "shouldAlloc": true + "isReturn": false, + "isSelf": true, + "shouldAlloc": false }, "data": { "cppClassName": "Buffer", @@ -231,13 +514,16 @@ "jsClassName": "Number", "isErrorCode": true }, - "isAsync": true + "isAsync": false } }, "dependencies": [ "../include/git_buf_converter.h" ] }, + "cert": { + "needsForwardDeclaration": false + }, "cert_hostkey": { "fields": { "hash_md5": { @@ -247,6 +533,10 @@ "hash_sha1": { "cppClassName": "String", "size": 20 + }, + "hash_sha256": { + "cppClassName": "String", + "size": 32 } } }, @@ -277,6 +567,9 @@ }, "git_checkout_index": { "args": { + "index": { + "isOptional": true + }, "opts": { "isOptional": true } @@ -286,6 +579,12 @@ "isErrorCode": true } }, + "git_checkout_init_options": { + "ignore": true + }, + "git_checkout_options_init": { + "ignore": true + }, "git_checkout_tree": { "args": { "treeish": { @@ -305,10 +604,28 @@ "cherrypick": { "functions": { "git_cherrypick": { + "args": { + "cherrypick_options": { + "isOptional": true + } + }, "isAsync": true, "return": { "isErrorCode": true } + }, + "git_cherrypick_commit": { + "args": { + "merge_options": { + "isOptional": true + } + } + }, + "git_cherrypick_init_options": { + "ignore": true + }, + "git_cherrypick_options_init": { + "ignore": true } } }, @@ -320,6 +637,12 @@ "isOptional": true } } + }, + "git_clone_init_options": { + "ignore": true + }, + "git_clone_options_init": { + "ignore": true } } }, @@ -340,8 +663,14 @@ } }, "commit": { + "selfFreeing": true, + "ownerFn": { + "name": "git_commit_owner", + "singletonCppClassName": "GitRepository" + }, "functions": { "git_commit_amend": { + "isAsync": true, "args": { "author": { "isOptional": true @@ -364,6 +693,19 @@ "update_ref": { "isOptional": true } + }, + "return": { + "isErrorCode": true + } + }, + "git_commit_author": { + "return": { + "ownedByThis": true + } + }, + "git_commit_committer": { + "return": { + "ownedByThis": true } }, "git_commit_create": { @@ -383,17 +725,92 @@ "update_ref": { "isOptional": true } - } - }, + }, + "isAsync": true, + "return": { + "isErrorCode": true + } + }, + "git_commit_create_buffer": { + "args": { + "out": { + "isReturn": true, + "cppClassName": "GitBuf", + "jsClassName": "Buffer", + "shouldAlloc": true + }, + "message_encoding": { + "isOptional": true + }, + "parents": { + "cType": "const git_commit **", + "cppClassName": "Array", + "jsClassName": "Array", + "arrayElementCppClassName": "GitCommit" + } + }, + "isAsync": true, + "return": { + "isErrorCode": true + } + }, "git_commit_create_from_callback": { "ignore": true }, "git_commit_create_from_ids": { "ignore": true + }, + "git_commit_create_from_v": { + "ignore": true + }, + "git_commit_extract_signature": { + "isAsync": true + }, + "git_commit_free": { + "ignore": true + }, + "git_commit_id": { + "return": { + "ownedByThis": true + } + }, + "git_commit_parent_id": { + "return": { + "ownedByThis": true + } + }, + "git_commit_tree_id": { + "return": { + "ownedByThis": true + } + }, + "git_commit_header_field": { + "isAsync": true, + "args": { + "out": { + "isReturn": true, + "isSelf": false, + "shouldAlloc": true + } + }, + "return": { + "isErrorCode": true + } + } + } + }, + "commitarray": { + "fields": { + "commits": { + "ignore": true + }, + "count": { + "ignore": true } } }, "config": { + "selfFreeing": true, "functions": { "git_config_add_backend": { "ignore": true @@ -405,22 +822,66 @@ "ignore": true }, "git_config_delete_entry": { - "ignore": true + "return": { + "isErrorCode": true + } }, "git_config_delete_multivar": { - "ignore": true + "return": { + "isErrorCode": true + } }, "git_config_entry_free": { "ignore": true }, "git_config_find_global": { - "ignore": true + "isAsync": true, + "args": { + "out": { + "isReturn": true, + "shouldAlloc": true + } + }, + "return": { + "isErrorCode": true + } + }, + "git_config_find_programdata": { + "isAsync": true, + "return": { + "isErrorCode": true + }, + "args": { + "out": { + "isReturn": true, + "isSelf": false, + "shouldAlloc": true + } + } }, "git_config_find_system": { - "ignore": true + "isAsync": true, + "args": { + "out": { + "isReturn": true, + "shouldAlloc": true + } + }, + "return": { + "isErrorCode": true + } }, "git_config_find_xdg": { - "ignore": true + "isAsync": true, + "args": { + "out": { + "isReturn": true, + "shouldAlloc": true + } + }, + "return": { + "isErrorCode": true + } }, "git_config_foreach": { "ignore": true @@ -432,16 +893,44 @@ "ignore": true }, "git_config_get_bool": { - "ignore": true + "args": { + "out": { + "shouldAlloc": true + } + }, + "return": { + "isErrorCode": true + } }, "git_config_get_entry": { - "ignore": true + "args": { + "out": { + "isReturn": true, + "ownedByThis": true + } + } }, "git_config_get_int32": { - "ignore": true + "args": { + "out": { + "cType": "int32_t *", + "shouldAlloc": true + } + }, + "return": { + "isErrorCode": true + } }, "git_config_get_int64": { - "ignore": true + "args": { + "out": { + "cType": "int64_t *", + "shouldAlloc": true + } + }, + "return": { + "isErrorCode": true + } }, "git_config_get_mapped": { "ignore": true @@ -454,37 +943,49 @@ }, "git_config_get_string_buf": { "isAsync": true, + "args": { + "out": { + "isReturn": true, + "shouldAlloc": true + } + }, "return": { "isErrorCode": true } }, "git_config_get_path": { - "ignore": true - }, - "git_config_iterator_free": { - "ignore": true - }, - "git_config_iterator_glob_new": { - "ignore": true - }, - "git_config_iterator_new": { - "ignore": true + "isAsync": true, + "args": { + "out": { + "isReturn": true, + "shouldAlloc": true + } + }, + "return": { + "isErrorCode": true + } }, "git_config_init_backend": { "ignore": true }, - "git_config_lookup_map_value": { - "ignore": true + "git_config_lock": { + "isAsync": true, + "args": { + "tx": { + "isReturn": true, + "ownedByThis": true + } + }, + "return": { + "isErrorCode": true + } }, - "git_config_multivar_iterator_new": { + "git_config_lookup_map_value": { "ignore": true }, "git_config_new": { "ignore": true }, - "git_config_next": { - "ignore": true - }, "git_config_open_default": { "isAsync": true, "return": { @@ -498,7 +999,15 @@ "ignore": true }, "git_config_open_ondisk": { - "ignore": true + "isAsync": true, + "return": { + "isErrorCode": true + }, + "args": { + "out": { + "isReturn": true + } + } }, "git_config_parse_bool": { "ignore": true @@ -512,20 +1021,45 @@ "git_config_parse_path": { "ignore": true }, - "git_config_refresh": { - "ignore": true - }, "git_config_set_bool": { - "ignore": true + "isAsync": true, + "return": { + "isErrorCode": true + } }, "git_config_set_int32": { - "ignore": true + "isAsync": true, + "return": { + "isErrorCode": true + } + }, + "git_config_set_int64": { + "isAsync": true, + "return": { + "isErrorCode": true + } + }, + "git_config_set_multivar": { + "isAsync": true, + "return": { + "isErrorCode": true + } }, "git_config_set_string": { "isAsync": true, "return": { "isErrorCode": true } + }, + "git_config_snapshot": { + "args": { + "out": { + "ownedByThis": true + } + }, + "return": { + "isErrorCode": true + } } }, "dependencies": [ @@ -535,64 +1069,146 @@ "config_backend": { "ignore": true }, - "config_iterator": { - "ignore": true + "config_entry": { + "selfFreeing": true }, - "cred": { - "cType": "git_cred", - "functions": { - "git_cred_default_new": { - "isAsync": false - }, - "git_cred_ssh_custom_new": { + "config_iterator": { + "needsForwardDeclaration": false, + "selfFreeing": true, + "fields": { + "backend": { "ignore": true }, - "git_cred_ssh_interactive_new": { + "flags": { "ignore": true }, - "git_cred_ssh_key_from_agent": { - "isAsync": false - }, - "git_cred_ssh_key_new": { - "isAsync": false - }, - "git_cred_userpass": { + "free": { "ignore": true }, - "git_cred_userpass_plaintext_new": { - "isAsync": false - } - } - }, - "cred_ssh_custom": { - "ignore": true - }, - "cred_ssh_interactive": { - "ignore": true - }, - "cred_ssh_key": { - "ignore": true - }, - "cred_username": { - "fields": { - "username": { - "cppClassName": "String", - "cType": "char *" + "next": { + "ignore": true } - } - }, - "cred_userpass_payload": { - "cDependencies": [ - "git2/cred_helpers.h" - ] + }, + "functions": { + "git_config_iterator_free": { + "ignore": true + }, + "git_config_iterator_new": { + "args": { + "out": { + "ownedBy": ["cfg"] + } + }, + "return": { + "isErrorCode": true + } + }, + "git_config_iterator_glob_new": { + "jsFunctionName": "createGlob", + "args": { + "out": { + "ownedBy": ["cfg"] + } + }, + "return": { + "isErrorCode": true + } + }, + "git_config_multivar_iterator_new": { + "jsFunctionName": "createMultivar", + "args": { + "out": { + "ownedBy": ["cfg"] + } + }, + "return": { + "isErrorCode": true + } + }, + "git_config_next": { + "jsFunctionName": "next", + "args": { + "entry": { + "ownedByThis": true + } + }, + "return": { + "isErrorCode": true + } + } + } + }, + "config_backend_memory_options": { + "selfFreeing": true, + "cDependencies": [ + "git2/sys/config.h" + ] + }, + "credential": { + "needsForwardDeclaration": false, + "selfFreeing": true, + "cType": "git_credential", + "fields": { + "free": { + "ignore": true + } + }, + "functions": { + "git_credential_default_new": { + "isAsync": false + }, + "git_credential_free": { + "ignore": true + }, + "git_credential_ssh_custom_new": { + "ignore": true + }, + "git_credential_ssh_interactive_new": { + "ignore": true + }, + "git_credential_ssh_key_from_agent": { + "isAsync": false + }, + "git_credential_ssh_key_new": { + "isAsync": false + }, + "git_credential_userpass": { + "ignore": true + }, + "git_credential_userpass_plaintext_new": { + "isAsync": false + } + } + }, + "credential_default": { + "ignore": true + }, + "credential_ssh_custom": { + "ignore": true + }, + "credential_ssh_interactive": { + "ignore": true + }, + "credential_ssh_key": { + "ignore": true + }, + "credential_username": { + "ignore": true + }, + "credential_userpass_payload": { + "ignore": true }, - "cred_userpass_plaintext": { + "credential_userpass_plaintext": { "ignore": true }, "describe": { "ignore": true }, + "describe_format_options": { + "hasConstructor": true + }, "diff": { + "selfFreeing": true, "cDependencies": [ "git2/sys/diff.h" ], @@ -647,6 +1263,9 @@ "git_diff_find_init_options": { "ignore": true }, + "git_diff_find_options_init": { + "ignore": true + }, "git_diff_find_similar": { "args": { "diff": { @@ -672,14 +1291,54 @@ "git_diff_format_email_init_options": { "ignore": true }, + "git_diff_format_email_options_init": { + "ignore": true + }, "git_diff_free": { "ignore": true }, + "git_diff_get_perfdata": { + "isAsync": false, + "args": { + "out": { + "isReturn": true, + "shouldAlloc": true + }, + "diff": { + "isSelf": true + } + }, + "return": { + "isErrorCode": true + } + }, "git_diff_get_stats": { - "ignore": true + "isAsync": true, + "args": { + "out": { + "isReturn": true, + "ownedByThis": true + }, + "diff": { + "isSelf": true + } + }, + "return": { + "isErrorCode": true + } + }, + "git_diff_index_to_index": { + "args": { + "diff": { + "ownedBy": ["repo"] + } + } }, "git_diff_index_to_workdir": { "args": { + "diff": { + "ownedBy": ["repo"] + }, "index": { "isOptional": true }, @@ -691,44 +1350,62 @@ "git_diff_init_options": { "ignore": true }, - "git_diff_is_sorted_icase": { - "ignore": true - }, "git_diff_merge": { - "ignore": true + "isAsync": true, + "args": { + "from": { + "ownedByThis": true + }, + "onto": { + "isSelf": true + } + }, + "return": { + "isErrorCode": true + } }, "git_diff_num_deltas_of_type": { "ignore": true }, - "git_diff_print": { - "ignore": true - }, - "git_diff_print_callback__to_buf": { - "ignore": true - }, - "git_diff_print_callback__to_file_handle": { + "git_diff_options_init": { "ignore": true }, - "git_diff_stats_deletions": { + "git_diff_patchid_init_options": { "ignore": true }, - "git_diff_stats_files_changed": { + "git_diff_patchid_options_init": { "ignore": true }, - "git_diff_stats_free": { + "git_diff_print": { "ignore": true }, - "git_diff_stats_insertions": { + "git_diff_print_callback__to_buf": { "ignore": true }, - "git_diff_stats_to_buf": { + "git_diff_print_callback__to_file_handle": { "ignore": true }, "git_diff_status_char": { "ignore": true }, + "git_diff_to_buf": { + "isAsync": true, + "return": { + "isErrorCode": true + }, + "args": { + "out": { + "isReturn": true, + "isSelf": false, + "shouldAlloc": true + } + } + }, "git_diff_tree_to_index": { "args": { + "diff": { + "ownedBy": ["repo"] + }, "old_tree": { "isOptional": true }, @@ -742,6 +1419,9 @@ }, "git_diff_tree_to_tree": { "args": { + "diff": { + "ownedBy": ["repo"] + }, "old_tree": { "isOptional": true }, @@ -755,6 +1435,9 @@ }, "git_diff_tree_to_workdir": { "args": { + "diff": { + "ownedBy": ["repo"] + }, "old_tree": { "isOptional": true }, @@ -765,6 +1448,9 @@ }, "git_diff_tree_to_workdir_with_index": { "args": { + "diff": { + "ownedBy": ["repo"] + }, "old_tree": { "isOptional": true }, @@ -787,6 +1473,7 @@ "ignore": true }, "diff_perfdata": { + "selfFreeing": true, "cDependencies": [ "git2/sys/diff.h" ] @@ -794,6 +1481,44 @@ "diff_similarity_metric": { "ignore": true }, + "diff_stats": { + "selfFreeing": true, + "functions": { + "git_diff_stats_deletions": { + "args": { + "stats": { + "isSelf": true + } + } + }, + "git_diff_stats_files_changed": { + "args": { + "stats": { + "isSelf": true + } + } + }, + "git_diff_stats_free": { + "ignore": true + }, + "git_diff_stats_insertions": { + "args": { + "stats": { + "isSelf": true + } + } + }, + "git_diff_stats_to_buf": { + "cppFunctionName": "DiffStatsToBuf", + "isAsync": true, + "args": { + "stats": { + "isSelf": true + } + } + } + } + }, "error_code": { "values": { "GIT_ERROR": { @@ -801,70 +1526,154 @@ } } }, - "filter": { + "email": { + "cDependencies": [ + "git2/sys/email.h" + ] + }, + "email_create_options": { + "hasConstructor": true + }, + "fetch": { "functions": { - "git_filter_list_apply_to_blob": { - "ignore": true - }, - "git_filter_list_apply_to_data": { - "ignore": true - }, - "git_filter_list_apply_to_file": { + "git_fetch_init_options": { "ignore": true }, - "git_filter_list_free": { + "git_fetch_options_init": { "ignore": true - }, - "git_filter_list_load": { + } + } + }, + "fetch_options": { + "dependencies": [ + "../include/str_array_converter.h" + ] + }, + "filter": { + "selfFreeing": false, + "hasConstructor": true, + "cDependencies": [ + "git2/sys/filter.h" + ], + "fields": { + "cleanup": { "ignore": true }, - "git_filter_list_push": { + "stream": { "ignore": true - }, + } + } + }, + "filter_source": { + "functions": { "git_filter_source_filemode": { - "ignore": true + "isPrototypeMethod": true, + "args": { + "src": { + "isSelf": true + } + } }, "git_filter_source_flags": { - "ignore": true + "isPrototypeMethod": true, + "args": { + "src": { + "isSelf": true + } + } }, "git_filter_source_id": { - "ignore": true + "isPrototypeMethod": true, + "args": { + "src": { + "isSelf": true + } + }, + "return": { + "ownedByThis": true + } }, "git_filter_source_mode": { - "ignore": true - }, - "git_filter_source_options": { - "ignore": true + "isPrototypeMethod": true, + "args": { + "src": { + "isSelf": true + } + } }, "git_filter_source_path": { - "ignore": true + "isPrototypeMethod": true, + "args": { + "src": { + "isSelf": true + } + } }, "git_filter_source_repo": { - "ignore": true + "isPrototypeMethod": true, + "args": { + "src": { + "isSelf": true + } + } } }, - "fields": { - "initialize": { - "ignore": true + "cDependencies": [ + "git2/sys/filter.h" + ] + }, + "filter_list": { + "selfFreeing": true, + "functions": { + "git_filter_list_apply_to_blob": { + "isPrototypeMethod": true, + "args": { + "filters": { + "isSelf": true + }, + "out": { + "shouldAlloc": true + } + } }, - "shutdown": { - "ignore": true + "git_filter_list_apply_to_data": { + "isPrototypeMethod": true, + "args": { + "filters": { + "isSelf": true + }, + "out": { + "shouldAlloc": true + } + } + }, + "git_filter_list_apply_to_file": { + "isPrototypeMethod": true, + "args": { + "filters": { + "isSelf": true + }, + "out": { + "shouldAlloc": true + } + } }, - "check": { + "git_filter_list_free": { "ignore": true }, - "apply": { + "git_filter_list_new": { "ignore": true }, - "cleanup": { + "git_filter_list_push": { "ignore": true } }, - "cDependencies": [ - "git2/sys/filter.h" + "dependencies": [ + "../include/git_buf_converter.h", + "../include/filter_registry.h" ] }, - "filter_source": { + "giterr": { "ignore": true }, "graph": { @@ -884,10 +1693,49 @@ "return": { "isErrorCode": true } + }, + "git_graph_descendant_of": { + "isAsync": true, + "return": { + "isResultOrError": true + } + }, + "git_graph_reachable_from_any": { + "args": { + "descendant_array": { + "cType": "git_oid *", + "cppClassName": "Array", + "jsClassName": "Array", + "arrayElementCppClassName": "GitOid" + } + }, + "isAsync": true, + "return": { + "isResultOrError": true + } } } }, "hashsig": { + "selfFreeing": true, + "freeFunctionName": "git_hashsig_free", + "functions": { + "git_hashsig_create": { + "isAsync": true, + "return": { + "isErrorCode": true + } + }, + "git_hashsig_create_fromfile": { + "isAsync": true, + "return": { + "isErrorCode": true + } + }, + "git_hashsig_free": { + "ignore": true + } + }, "cDependencies": [ "git2/sys/hashsig.h" ] @@ -897,14 +1745,36 @@ "git_ignore_path_is_ignored": { "args": { "ignored": { + "shouldAlloc": true, "isReturn": true } + }, + "isAsync": true, + "return": { + "isErrorCode": true } } } }, + "imaxdiv": { + "ignore": true + }, + "imaxdiv_t": { + "ignore": true + }, "index": { + "selfFreeing": true, + "ownerFn": { + "name": "git_index_owner", + "singletonCppClassName": "GitRepository" + }, "functions": { + "git_index_add": { + "isAsync": true, + "return": { + "isErrorCode": true + } + }, "git_index_add_all": { "args": { "pathspec": { @@ -922,22 +1792,71 @@ "isErrorCode": true } }, + "git_index_add_bypath": { + "isAsync": true, + "return": { + "isErrorCode": true + } + }, "git_index_add_frombuffer": { "ignore": true }, - "git_index_conflict_get": { + "git_index_add_from_buffer": { + "ignore": true + }, + "git_index_checksum": { + "return": { + "ownedByThis": true + } + }, + "git_index_clear": { + "isAsync": true, + "return": { + "isErrorCode": true + } + }, + "git_index_conflict_add": { + "isAsync": true, + "args": { + "index": { + "isSelf": true + }, + "ancestor_entry": { + "isOptional": true + }, + "our_entry": { + "isOptional": true + }, + "their_entry": { + "isOptional": true + } + }, + "return": { + "isErrorCode": true + } + }, + "git_index_conflict_cleanup": { "isAsync": true, + "return": { + "isErrorCode": true + } + }, + "git_index_conflict_get": { "args": { "ancestor_out": { - "isReturn": true + "isReturn": true, + "ownedBy": ["index"] }, "our_out": { - "isReturn": true + "isReturn": true, + "ownedBy": ["index"] }, "their_out": { - "isReturn": true + "isReturn": true, + "ownedBy": ["index"] } }, + "isAsync": true, "return": { "isErrorCode": true } @@ -951,11 +1870,38 @@ "git_index_conflict_next": { "ignore": true }, + "git_index_conflict_remove": { + "isAsync": true, + "return": { + "isErrorCode": true + } + }, "git_index_entrycount": { "jsFunctionName": "entryCount" }, "git_index_find": { - "ignore": true + "isAsync": true, + "args": { + "at_pos": { + "isReturn": true, + "shouldAlloc": true + } + }, + "return": { + "isErrorCode": true + } + }, + "git_index_find_prefix": { + "isAsync": true, + "args": { + "at_pos": { + "isReturn": true, + "shouldAlloc": true + } + }, + "return": { + "isErrorCode": true + } }, "git_index_free": { "ignore": true @@ -970,11 +1916,37 @@ "git_index_new": { "ignore": true }, + "git_index_open": { + "isAsync": true, + "return": { + "selfOwned": true, + "isErrorCode": true + } + }, + "git_index_owner": { + "ignore": true + }, "git_index_read": { "args": { "force": { "isOptional": true } + }, + "isAsync": true, + "return": { + "isErrorCode": true + } + }, + "git_index_read_tree": { + "isAsync": true, + "return": { + "isErrorCode": true + } + }, + "git_index_remove": { + "isAsync": true, + "return": { + "isErrorCode": true } }, "git_index_remove_all": { @@ -994,6 +1966,18 @@ "isErrorCode": true } }, + "git_index_remove_bypath": { + "isAsync": true, + "return": { + "isErrorCode": true + } + }, + "git_index_remove_directory": { + "isAsync": true, + "return": { + "isErrorCode": true + } + }, "git_index_update_all": { "args": { "pathspec": { @@ -1016,57 +2000,366 @@ "force": { "isOptional": true } - } + }, + "isAsync": true, + "return": { + "isErrorCode": true + } + }, + "git_index_write_tree": { + "isAsync": true, + "return": { + "isErrorCode": true + } + }, + "git_index_write_tree_to": { + "isAsync": true, + "return": { + "isErrorCode": true + } } }, "dependencies": [ "../include/str_array_converter.h" ] }, - "index_entry": { - "hasConstructor": true, - "ignoreInit": true - }, - "indexer": { - "cType": "git_indexer", + "index_conflict_iterator": { + "selfFreeing": true, + "freeFunctionName": "git_index_conflict_iterator_free", "functions": { - "git_indexer_append": { + "git_index_conflict_iterator_free": { "ignore": true }, - "git_indexer_new": { - "ignore": true + "git_index_conflict_iterator_new": { + "args": { + "iterator_out": { + "ownedBy": ["index"] + } + } + }, + "git_index_conflict_next": { + "isAsync": false, + "jsFunctionName": "next", + "cppFunctionName": "Next", + "args": { + "ancestor_out": { + "isReturn": true, + "ownedByThis": true + }, + "our_out": { + "isReturn": true, + "ownedByThis": true + }, + "their_out": { + "isReturn": true, + "ownedByThis": true + } + } } } }, - "mempack": { + "index_entry": { + "isReturnable": true, + "hasConstructor": true, + "ignoreInit": true + }, + "index_iterator": { + "selfFreeing": true, + "freeFunctionName": "git_index_iterator_free", "functions": { - "git_mempack_new": { + "git_index_iterator_free": { "ignore": true }, - "git_mempack_reset": { - "ignore": true - } - } - }, - "merge": { - "functions": { - "git_merge": { + "git_index_iterator_new": { "args": { - "their_heads": { - "cType": "const git_annotated_commit **", - "cppClassName": "Array", - "jsClassName": "Array", - "arrayElementCppClassName": "GitAnnotatedCommit" + "iterator_out": { + "ownedBy": ["index"] } } }, - "git_merge_analysis": { - "ignore": true - }, - "git_merge_base_many": { - "ignore": true - }, - "git_merge_bases_many": { + "git_index_iterator_next": { + "isAsync": false, + "args": { + "out": { + "ownedByThis": true + } + } + } + } + }, + "index_name_entry": { + "functions": { + "git_index_name_add": { + "cppFunctionName": "Add", + "jsFunctionName": "add", + "isAsync": true, + "return": { + "isErrorCode": true + } + }, + "git_index_name_clear": { + "cppFunctionName": "Clear", + "jsFunctionName": "clear", + "isAsync": true, + "return": { + "isErrorCode": true + } + }, + "git_index_name_entrycount": { + "cppFunctionName": "Entrycount", + "jsFunctionName": "entryCount" + }, + "git_index_name_get_byindex": { + "cppFunctionName": "GetByIndex", + "jsFunctionName": "getByIndex", + "isPrototypeMethod": false + } + }, + "cDependencies": [ + "git2/sys/index.h" + ] + }, + "index_reuc_entry": { + "fields": { + "mode": { + "cType": "uint32_t [3]" + } + }, + "functions": { + "git_index_reuc_add": { + "cppFunctionName": "Add", + "jsFunctionName": "add", + "isAsync": true, + "return": { + "isErrorCode": true + } + }, + "git_index_reuc_clear": { + "cppFunctionName": "Clear", + "jsFunctionName": "clear", + "isAsync": true, + "isPrototypeMethod": false, + "return": { + "isErrorCode": true + } + }, + "git_index_reuc_entrycount": { + "cppFunctionName": "Entrycount", + "jsFunctionName": "entryCount" + }, + "git_index_reuc_find": { + "args": { + "at_pos": { + "isReturn": true, + "shouldAlloc": true + } + }, + "cppFunctionName": "Find", + "jsFunctionName": "find", + "isAsync": true, + "return": { + "isErrorCode": true + } + }, + "git_index_reuc_get_byindex": { + "cppFunctionName": "GetByIndex", + "jsFunctionName": "getByIndex", + "isPrototypeMethod": false + }, + "git_index_reuc_get_bypath": { + "cppFunctionName": "GetByPath", + "jsFunctionName": "getByPath", + "isPrototypeMethod": false + }, + "git_index_reuc_remove": { + "cppFunctionName": "Remove", + "jsFunctionName": "remove", + "isAsync": true, + "isPrototypeMethod": false, + "return": { + "isErrorCode": true + } + } + }, + "cDependencies": [ + "git2/sys/index.h" + ] + }, + "index_time": { + "isReturnable": true, + "hasConstructor": true, + "ignoreInit": true + }, + "indexer": { + "ignore": true + }, + "indexer_options": { + "ignore": true + }, + "LIBSSH2_SESSION": { + "ignore": true + }, + "LIBSSH2_USERAUTH_KBDINT_PROMPT": { + "ignore": true + }, + "LIBSSH2_USERAUTH_KBDINT_RESPONSE": { + "ignore": true + }, + "_LIBSSH2_SESSION": { + "ignore": true + }, + "_LIBSSH2_USERAUTH_KBDINT_PROMPT": { + "ignore": true + }, + "_LIBSSH2_USERAUTH_KBDINT_RESPONSE": { + "ignore": true + }, + "mailmap": { + "selfFreeing": true, + "freeFunctionName": "git_mailmap_free", + "functions": { + "git_mailmap_add_entry": { + "isAsync": true, + "return": { + "isErrorCode": true + } + }, + "git_mailmap_free": { + "ignore": true + }, + "git_mailmap_from_buffer": { + "return": { + "isErrorCode": true + } + }, + "git_mailmap_from_repository": { + "args": { + "out": { + "ownedBy": ["repo"] + } + }, + "return": { + "isErrorCode": true + } + }, + "git_mailmap_resolve": { + "args": { + "real_name": { + "isReturn": true + }, + "real_email": { + "isReturn": true + } + }, + "isAsync": true, + "return": { + "isErrorCode": true + } + }, + "git_mailmap_resolve_signature": { + "return": { + "isErrorCode": true + } + } + } + }, + "mempack": { + "ignore": true + }, + "merge": { + "functions": { + "git_merge": { + "isAsync": true, + "args": { + "repo": { + "cppClassName": "GitRepository", + "cType": "git_repository *", + "jsClassName": "Repo" + }, + "their_heads": { + "cType": "const git_annotated_commit **", + "cppClassName": "Array", + "jsClassName": "Array", + "arrayElementCppClassName": "GitAnnotatedCommit" + }, + "their_heads_len": { + "cType": "size_t", + "cppClassName": "Number", + "jsClassName": "Number" + }, + "merge_opts": { + "isOptional": true, + "cType": "git_merge_options *", + "cppClassName": "GitMergeOptions" + }, + "checkout_opts": { + "isOptional": true, + "cType": "git_checkout_options *", + "cppClassName": "GitCheckoutOptions" + } + }, + "return": { + "isErrorCode": true + } + }, + "git_merge_analysis": { + "isAsync": true, + "args": { + "analysis_out": { + "isReturn": true, + "shouldAlloc": true + }, + "preference_out": { + "isReturn": true, + "shouldAlloc": true + }, + "their_heads": { + "cType": "const git_annotated_commit **", + "cppClassName": "Array", + "jsClassName": "Array", + "arrayElementCppClassName": "GitAnnotatedCommit" + }, + "their_heads_len": { + "cType": "size_t", + "cppClassName": "Number", + "jsClassName": "Number" + } + }, + "return": { + "isErrorCode": true + } + }, + "git_merge_analysis_for_ref": { + "isAsync": true, + "args": { + "analysis_out": { + "isReturn": true, + "shouldAlloc": true + }, + "preference_out": { + "isReturn": true, + "shouldAlloc": true + }, + "their_heads": { + "cType": "const git_annotated_commit **", + "cppClassName": "Array", + "jsClassName": "Array", + "arrayElementCppClassName": "GitAnnotatedCommit" + }, + "their_heads_len": { + "cType": "size_t", + "cppClassName": "Number", + "jsClassName": "Number" + } + }, + "return": { + "isErrorCode": true + } + }, + "git_merge_base_many": { + "ignore": true + }, + "git_merge_bases_many": { "ignore": true }, "git_merge_base_octopus": { @@ -1085,25 +2378,92 @@ "git_merge_file_from_index": { "ignore": true }, + "git_merge_file_input_init": { + "ignore": true + }, + "git_merge_file_init_input": { + "ignore": true + }, "git_merge_file_init_options": { "ignore": true }, - "git_merge_file_result_free": { + "git_merge_file_options_init": { + "ignore": true + }, + "git_merge_init_options": { + "ignore": true + }, + "git_merge_options_init": { "ignore": true + }, + "git_merge_trees": { + "args": { + "ancestor_tree": { + "isOptional": true + }, + "opts": { + "isOptional": true + } + } } } }, + "merge_driver": { + "ignore": true + }, + "merge_driver_source": { + "ignore": true + }, + "merge_file_result": { + "ignore": true + }, + "merge_result": { + "ignore": true + }, "message": { - "functions": { - "git_message_prettify": { - "ignore": true - } - } + "ignore": true + }, + "message_trailer": { + "ignore": true + }, + "message_trailer_array": { + "ignore": true }, "note": { + "selfFreeing": true, "functions": { - "git_note_iterator_free": { - "ignore": true + "git_note_author": { + "return": { + "ownedByThis": true + } + }, + "git_note_commit_create": { + "args": { + "notes_commit_out": { + "isReturn": true, + "shouldAlloc": true + }, + "notes_blob_out": { + "isReturn": true, + "shouldAlloc": true + } + } + }, + "git_note_commit_remove": { + "isAsync": true, + "args": { + "notes_commit_out": { + "isReturn": true + } + }, + "return": { + "isErrorCode": true + } + }, + "git_note_comitter": { + "return": { + "ownedByThis": true + } }, "git_note_create": { "args": { @@ -1112,13 +2472,30 @@ } } }, - "git_note_remove": { + "git_note_foreach": { "isAsync": true, "return": { "isErrorCode": true } }, - "git_note_foreach": { + "git_note_free": { + "ignore": true + }, + "git_note_id": { + "return": { + "ownedByThis": true + } + }, + "git_note_iterator_free": { + "ignore": true + }, + "git_note_iterator_new": { + "ignore": true + }, + "git_note_next": { + "ignore": true + }, + "git_note_remove": { "isAsync": true, "return": { "isErrorCode": true @@ -1127,7 +2504,20 @@ } }, "object": { + "selfFreeing": true, + "ownerFn": { + "name": "git_object_owner", + "singletonCppClassName": "GitRepository" + }, "functions": { + "git_object_free": { + "ignore": true + }, + "git_object_id": { + "return": { + "ownedByThis": true + } + }, "git_object_short_id": { "args": { "out": { @@ -1138,6 +2528,7 @@ } }, "odb": { + "selfFreeing": true, "functions": { "git_odb_add_alternate": { "ignore": true @@ -1145,24 +2536,44 @@ "git_odb_add_backend": { "ignore": true }, - "git_odb_backend_loose": { - "ignore": true - }, - "git_odb_backend_one_pack": { - "ignore": true - }, - "git_odb_backend_pack": { - "ignore": true + "git_odb_add_disk_alternate": { + "isAsync": true, + "return": { + "isErrorCode": true + } }, "git_odb_exists": { - "ignore": true + "ignore": true, + "isAsync": true, + "args": { + "db": { + "isSelf": true + } + } }, "git_odb_exists_prefix": { + "isAsync": true, + "args": { + "db": { + "isSelf": true + }, + "out": { + "isReturn": true + } + }, + "return": { + "isErrorCode": true + } + }, + "git_odb_expand_ids": { "ignore": true }, "git_odb_foreach": { "ignore": true }, + "git_odb_free": { + "ignore": true + }, "git_odb_get_backend": { "ignore": true }, @@ -1170,7 +2581,15 @@ "ignore": true }, "git_odb_hashfile": { - "ignore": true + "isAsync": true, + "args": { + "out": { + "isReturn": true + } + }, + "return": { + "isErrorCode": true + } }, "git_odb_init_backend": { "ignore": true @@ -1187,27 +2606,29 @@ "git_odb_open_wstream": { "ignore": true }, + "git_odb_read": { + "isAsync": true, + "cppFunctionName": "OdbRead", + "args": { + "obj": { + "isReturn": true, + "ownedByThis": true + } + } + }, "git_odb_read_header": { "ignore": true }, "git_odb_read_prefix": { - "ignore": true + "args": { + "out": { + "ownedByThis": true + } + } }, "git_odb_refresh": { "ignore": true }, - "git_odb_stream_finalize_write": { - "ignore": true - }, - "git_odb_stream_free": { - "ignore": true - }, - "git_odb_stream_read": { - "ignore": true - }, - "git_odb_stream_write": { - "ignore": true - }, "git_odb_write": { "args": { "data": { @@ -1232,13 +2653,29 @@ }, "ignore": true }, + "odb_expand_id": { + "ignore": true + }, "odb_object": { + "selfFreeing": true, "functions": { "git_odb_object_data": { "return": { + "ownedByThis": true, "cppClassName": "Wrapper", "jsClassName": "Buffer" } + }, + "git_odb_object_dup": { + "ignore": true + }, + "git_odb_object_free": { + "ignore": true + }, + "git_odb_object_id": { + "return": { + "ownedByThis": true + } } }, "dependencies": [ @@ -1253,13 +2690,23 @@ "ignore": true }, "oid": { + "selfFreeing": true, + "cpyFunction": "git_oid_cpy", + "freeFunctionName": "free", "shouldAlloc": true, "functions": { "git_oid_cpy": { + "isAsync": false, "args": { + "src": { + "shouldAlloc": false + }, "out": { "isReturn": true } + }, + "return": { + "isErrorCode": true } }, "git_oid_fmt": { @@ -1269,13 +2716,25 @@ "ignore": true }, "git_oid_fromstr": { - "isAsync": false + "ignore": true }, "git_oid_fromstrn": { "ignore": true }, "git_oid_fromstrp": { - "ignore": true + "isAsync": false, + "jsFunctionName": "fromString", + "args": { + "out": { + "isReturn": true + }, + "str": { + "shouldAlloc": false + } + }, + "return": { + "isErrorCode": true + } }, "git_oid_nfmt": { "ignore": true @@ -1283,15 +2742,6 @@ "git_oid_pathfmt": { "ignore": true }, - "git_oid_shorten_add": { - "ignore": true - }, - "git_oid_shorten_free": { - "ignore": true - }, - "git_oid_shorten_new": { - "ignore": true - }, "git_oid_tostr": { "ignore": true } @@ -1302,16 +2752,73 @@ } } }, + "oid_shorten": { + "selfFreeing": true, + "functions": { + "git_oid_shorten_new": { + "isPrototypeMethod": false + }, + "git_oid_shorten_add": { + "args": { + "os": { + "isSelf": true + } + } + }, + "git_oid_shorten_free": { + "ignore": true + } + } + }, + "oidarray": { + "selfFreeing": true, + "functions": { + "git_oidarray_free": { + "ignore": true + } + } + }, "openssl": { - "cDependencies": [ - "git2/sys/openssl.h" - ] + "ignore": true }, "packbuilder": { + "selfFreeing": true, "functions": { "git_packbuilder_foreach": { "ignore": true }, + "git_packbuilder_free": { + "ignore": true + }, + "git_packbuilder_hash": { + "return": { + "ownedByThis": true + } + }, + "git_packbuilder_insert": { + "isAsync": true, + "return": { + "isErrorCode": true + } + }, + "git_packbuilder_insert_commit": { + "isAsync": true, + "return": { + "isErrorCode": true + } + }, + "git_packbuilder_insert_recur": { + "isAsync": true, + "return": { + "isErrorCode": true + } + }, + "git_packbuilder_insert_walk": { + "isAsync": true, + "return": { + "isErrorCode": true + } + }, "git_packbuilder_new": { "isAsync": false }, @@ -1320,27 +2827,72 @@ }, "git_packbuilder_write": { "ignore": true + }, + "git_packbuilder_write_buf": { + "ignore": true } } }, "patch": { + "selfFreeing": true, + "dependencies": [ + "../include/convenient_patch.h" + ], + "ownerFn": { + "name": "git_patch_owner", + "singletonCppClassName": "GitRepository" + }, "functions": { "git_patch_free": { "ignore": true }, + "git_patch_from_blobs": { + "isAsync": true, + "args": { + "out": { + "isReturn": true + }, + "old_blob": { + "isOptional": true + }, + "old_as_path": { + "isOptional": true + }, + "new_blob": { + "isOptional": true + }, + "new_as_path": { + "isOptional": true + }, + "opts": { + "isOptional": true + } + } + }, + "git_patch_from_blob_and_buffer": { + "ignore": true + }, "git_patch_from_buffers": { "ignore": true }, "git_patch_from_diff": { "isAsync": true, + "args": { + "out": { + "ownedBy": ["diff"] + } + } + }, + "git_patch_get_delta": { "return": { - "isErrorCode": true + "ownedByThis": true } }, "git_patch_get_hunk": { "args": { "out": { - "returnName": "hunk" + "returnName": "hunk", + "ownedByThis": true }, "lines_in_hunk": { "shouldAlloc": true, @@ -1355,12 +2907,30 @@ }, "git_patch_get_line_in_hunk": { "isAsync": true, + "args": { + "out": { + "ownedByThis": true + } + }, "return": { "isErrorCode": true } }, "git_patch_line_stats": { - "ignore": true + "args": { + "total_context": { + "isReturn": true + }, + "total_additions": { + "isReturn": true + }, + "total_deletions": { + "isReturn": true + } + }, + "return": { + "isErrorCode": true + } }, "git_patch_print": { "ignore": true @@ -1370,38 +2940,119 @@ } } }, + "path": { + "cDependencies": [ + "git2/sys/path.h" + ] + }, "pathspec": { + "selfFreeing": true, + "dependencies": [ + "../include/str_array_converter.h" + ], "functions": { - "git_pathspec_match_list_free": { + "git_pathspec_free": { "ignore": true }, + "git_pathspec_match_diff": { + "isAsync": true, + "args": { + "out": { + "ownedBy": ["diff"], + "ownedByThis": true + } + } + }, + "git_pathspec_match_index": { + "isAsync": true, + "args": { + "out": { + "ownedBy": ["index"], + "ownedByThis": true + } + } + }, "git_pathspec_new": { "isAsync": false + }, + "git_pathspec_match_tree": { + "isAsync": true, + "args": { + "out": { + "ownedBy": ["tree"], + "ownedByThis": true + } + } + }, + "git_pathspec_match_workdir": { + "isAsync": true, + "args": { + "out": { + "ownedBy": ["repo"], + "ownedByThis": true + } + } } } }, - "push": { - "cType": "git_push", + "pathspec_match_list": { + "selfFreeing": true, "functions": { - "git_push_finish": { - "isAsync": true, + "git_pathspec_match_list_diff_entry": { "return": { - "isErrorCode": true + "ownedByThis": true } }, - "git_push_set_callbacks": { + "git_pathspec_match_list_free": { + "ignore": true + } + } + }, + "proxy": { + "functions": { + "git_proxy_init_options": { "ignore": true }, - "git_push_status_foreach": { + "git_proxy_options_init": { "ignore": true } } }, + "push": { + "ignore": true + }, + "push_options": { + "dependencies": [ + "../include/str_array_converter.h" + ] + }, "rebase": { + "hasConstructor": false, + "selfFreeing": true, "functions": { + "git_rebase_abort": { + "isAsync": true, + "args": { + "rebase": { + "cType": "git_rebase *", + "cppClassName": "GitRebase", + "jsClassName": "Rebase", + "isOptional": false, + "isSelf": true, + "isReturn": false + } + }, + "return": { + "isErrorCode": true + } + }, "git_rebase_commit": { + "isAsync": true, "args": { "id": { + "cType": "git_oid *", + "cppClassName": "GitOid", + "jsClassName": "Oid", "isReturn": true, "shouldAlloc": true }, @@ -1414,6 +3065,9 @@ "message": { "isOptional": true } + }, + "return": { + "isErrorCode": true } }, "git_rebase_finish": { @@ -1428,6 +3082,10 @@ }, "git_rebase_init": { "args": { + "out": { + "isSelf": true, + "ownedBy": ["repo"] + }, "upstream": { "isOptional": true }, @@ -1438,17 +3096,120 @@ "isOptional": true }, "opts": { + "preserveOnThis": true, "isOptional": true } } + }, + "git_rebase_init_options": { + "ignore": true + }, + "git_rebase_inmemory_index": { + "args": { + "out": { + "ownedByThis": true + } + } + }, + "git_rebase_next": { + "isAsync": true, + "args": { + "operation": { + "isReturn": true, + "ownedByThis": true + } + }, + "return": { + "isErrorCode": true + } + }, + "git_rebase_open": { + "args": { + "out": { + "isSelf": true, + "ownedBy": ["repo"] + }, + "opts": { + "isOptional": true, + "preserveOnThis": true + } + } + }, + "git_rebase_operation_byindex": { + "return": { + "ownedByThis": true + } + }, + "git_rebase_operation_current": { + "return": { + "ownedByThis": true + } + }, + "git_rebase_options_init": { + "ignore": true + } + } + }, + "rebase_options": { + "fields": { + "signing_cb": { + "ignore": true + }, + "commit_create_cb": { + "args": [ + { + "name": "out", + "cType": "git_oid *" + }, + { + "name": "author", + "cType": "const git_signature *" + }, + { + "name": "committer", + "cType": "const git_signature *" + }, + { + "name": "message_encoding", + "cType": "const char *" + }, + { + "name": "message", + "cType": "const char *" + }, + { + "name": "tree", + "cType": "const git_tree *" + }, + { + "name": "parent_count", + "cType": "size_t" + }, + { + "name": "parents", + "cType": "const git_oid **", + "cppClassName": "Array", + "jsClassName": "Array", + "arrayElementCppClassName": "GitOid", + "arrayLengthArgumentName": "parent_count" + }, + { + "name": "payload", + "cType": "void *" + } + ] } } }, "refdb": { + "selfFreeing": true, "functions": { "git_refdb_backend_fs": { "ignore": true }, + "git_refdb_free": { + "ignore": true + }, "git_refdb_init_backend": { "ignore": true }, @@ -1457,6 +3218,13 @@ }, "git_refdb_new": { "ignore": true + }, + "git_refdb_open": { + "args": { + "out": { + "ownedBy": ["repo"] + } + } } } }, @@ -1465,6 +3233,11 @@ }, "reference": { "cppClassName": "GitRefs", + "selfFreeing": true, + "ownerFn": { + "name": "git_reference_owner", + "singletonCppClassName": "GitRepository" + }, "functions": { "git_reference__alloc": { "ignore": true @@ -1504,7 +3277,10 @@ "key": "strings" } }, - "isAsync": true + "isAsync": true, + "return": { + "isErrorCode": true + } }, "git_reference_next": { "ignore": true @@ -1518,6 +3294,16 @@ "isOptional": true } } + }, + "git_reference_target": { + "return": { + "ownedByThis": true + } + }, + "git_reference_target_peel": { + "return": { + "ownedByThis": true + } } } }, @@ -1528,13 +3314,71 @@ "needsForwardDeclaration": false, "ignore": true }, + "reflog": { + "selfFreeing": true, + "functions": { + "git_reflog_entry_byindex": { + "return": { + "ownedByThis": true + } + }, + "git_reflog_free": { + "ignore": true + }, + "git_reflog_read": { + "args": { + "out": { + "ownedBy": ["repo"] + } + } + }, + "git_reflog_write": { + "isAsync": true, + "isSelf": true, + "return": { + "isErrorCode": true + } + } + } + }, + "reflog_entry": { + "functions": { + "git_reflog_entry_committer": { + "return": { + "ownedByThis": true + } + }, + "git_reflog_entry_id_new": { + "return": { + "ownedByThis": true + } + }, + "git_reflog_entry_id_old": { + "return": { + "ownedByThis": true + } + } + } + }, "refspec": { + "selfFreeing": true, "cType": "git_refspec", "functions": { - "git_refspec_rtransform": { + "git_refspec_free": { "ignore": true }, - "git_refspec_string": { + "git_refspec_parse": { + "isAsync": true, + "args": { + "refspec": { + "isReturn": true + } + }, + "return": { + "isErrorCode": true + } + }, + "git_refspec_rtransform": { "ignore": true }, "git_refspec_transform": { @@ -1543,24 +3387,82 @@ } }, "remote": { + "dependencies": [ + "../include/str_array_converter.h", + "../include/remote_head.h" + ], "cType": "git_remote", + "selfFreeing": true, + "ownerFn": { + "name": "git_remote_owner", + "singletonCppClassName": "GitRepository" + }, "functions": { "git_remote_create": { - "isAsync": false + "isAsync": true, + "return": { + "isErrorCode": true + } + }, + "git_remote_create_detached": { + "isAsync": true, + "args": { + "out": { + "selfOwned": true + } + } + }, + "git_remote_create_init_options": { + "ignore": true + }, + "git_remote_create_options_init": { + "ignore": true + }, + "git_remote_create_with_opts": { + "args": { + "opts": { + "isOptional": true + } + } }, "git_remote_connect": { "isAsync": true, + "args": { + "callbacks": { + "isOptional": true, + "preserveOnThis": true + }, + "proxy_opts": { + "isOptional": true, + "preserveOnThis": true + }, + "custom_headers": { + "isOptional": true + } + }, "return": { "isErrorCode": true } }, - "git_remote_disconnect": { + "git_remote_connect_ext": { "isAsync": true }, + "git_remote_connect_options_init": { + "ignore": true + }, + "git_remote_disconnect": { + "isAsync": true, + "return": { + "isErrorCode": true + } + }, "git_remote_download": { "args": { "refspecs": { "isOptional": true + }, + "opts": { + "isOptional": true } }, "isAsync": true, @@ -1569,7 +3471,20 @@ } }, "git_remote_default_branch": { - "ignore": true + "isAsync": true, + "args": { + "out": { + "isReturn": true, + "shouldAlloc": true, + "isSelf": false + }, + "remote": { + "isSelf": true + } + }, + "return": { + "isErrorCode": true + } }, "git_remote_delete": { "isAsync": true, @@ -1579,6 +3494,9 @@ }, "git_remote_fetch": { "args": { + "opts": { + "isOptional": true + }, "reflog_message": { "isOptional": true }, @@ -1591,6 +3509,9 @@ "isErrorCode": true } }, + "git_remote_free": { + "ignore": true + }, "git_remote_get_fetch_refspecs": { "args": { "array": { @@ -1602,7 +3523,10 @@ "key": "strings" } }, - "isAsync": true + "isAsync": true, + "return": { + "isErrorCode": true + } }, "git_remote_get_push_refspecs": { "args": { @@ -1615,7 +3539,19 @@ "key": "strings" } }, - "isAsync": true + "isAsync": true, + "return": { + "isErrorCode": true + } + }, + "git_remote_get_refspec": { + "return": { + "selfFreeing": false, + "ownedByThis": true + } + }, + "git_remote_init_callbacks": { + "ignore": true }, "git_remote_list": { "args": { @@ -1633,7 +3569,31 @@ "ignore": true }, "git_remote_rename": { - "ignore": true + "isAsync": true, + "args": { + "problems": { + "isReturn": true, + "shouldAlloc": true, + "cppClassName": "Array", + "jsClassName": "Array", + "size": "count", + "key": "strings" + } + }, + "return": { + "isErrorCode": true + } + }, + "git_remote_prune": { + "args": { + "callbacks": { + "isOptional": true + } + }, + "isAsync": true, + "return": { + "isErrorCode": true + } }, "git_remote_push": { "isAsync": true, @@ -1641,6 +3601,9 @@ "isErrorCode": true }, "args": { + "refspecs": { + "isOptional": true + }, "opts": { "isOptional": true } @@ -1654,9 +3617,41 @@ }, "git_remote_set_push_refspecs": { "ignore": true + }, + "git_remote_stats": { + "return": { + "ownedByThis": true + } + }, + "git_remote_update_tips": { + "isAsync": true, + "args": { + "reflog_message": { + "isOptional": true + } + }, + "return": { + "isErrorCode": true + } + }, + "git_remote_upload": { + "args": { + "refspecs": { + "isOptional": true + } + }, + "isAsync": true, + "return": { + "isErrorCode": true + } } } }, + "remote_connect_options": { + "dependencies": [ + "../include/str_array_converter.h" + ] + }, "remote_callbacks": { "fields": { "completion": { @@ -1668,14 +3663,8 @@ "push_negotiation": { "ignore": true }, - "push_transfer_progress": { - "ignore": true - }, - "push_update_reference": { - "ignore": true - }, "sideband_progress": { - "ignore": true + "ignore": false }, "update_tips": { "ignore": true @@ -1683,36 +3672,104 @@ } }, "remote_head": { - "ignore": true + "dependencies": [ + "../include/functions/free.h" + ], + "freeFunctionName": "git_remote_head_free", + "selfFreeing": true }, "repository": { + "hasConstructor": false, + "selfFreeing": true, + "isSingleton": true, + "dependencies": [ + "git2/sys/repository.h", + "../include/commit.h", + "../include/submodule.h", + "../include/remote.h" + ], "functions": { "git_repository__cleanup": { - "ignore": true + "isAsync": true, + "return": { + "isErrorCode": true + } }, - "git_repository_discover": { + "git_repository_commit_parents": { "isAsync": true, + "args": { + "commits": { + "shouldAlloc": true, + "selfFreeing": true, + "isReturn": true, + "cppClassName": "Array", + "jsClassName": "Array", + "arrayElementCppClassName": "GitCommit", + "size": "count", + "key": "commits" + } + }, "return": { "isErrorCode": true } }, - "git_repository_init_init_options": { + "git_repository_config": { + "args": { + "out": { + "ownedByThis": true + } + } + }, + "git_repository_config_snapshot": { "ignore": true }, + "git_repository_discover": { + "isAsync": true, + "return": { + "isErrorCode": true + }, + "args": { + "ceiling_dirs": { + "isOptional": true + }, + "out": { + "isReturn": true, + "isSelf": false, + "shouldAlloc": true + } + } + }, "git_repository_fetchhead_foreach": { "isAsync": true, "return": { "isErrorCode": true } }, + "git_repository_free": { + "ignore": true + }, "git_repository_hashfile": { "ignore": true }, "git_repository_ident": { + "args": { + "name": { + "isReturn": true + }, + "email": { + "isReturn": true + } + }, + "isAsync": false + }, + "git_repository_init_options_init": { "ignore": true }, "git_repository_mergehead_foreach": { - "ignore": true + "isAsync": true, + "return": { + "isErrorCode": true + } }, "git_repository_message": { "ignore": true @@ -1720,6 +3777,34 @@ "git_repository_new": { "ignore": true }, + "git_repository_odb": { + "isAsync": true, + "args": { + "odb": { + "ownedByThis": true + }, + "repo": { + "isSelf": true + } + }, + "return": { + "isErrorCode": true + } + }, + "git_repository_refdb": { + "isAsync": true, + "args": { + "out": { + "ownedByThis": true + }, + "repo": { + "isSelf": true + } + }, + "return": { + "isErrorCode": true + } + }, "git_repository_reinit_filesystem": { "ignore": true }, @@ -1735,21 +3820,63 @@ "isErrorCode": true } }, - "git_repository_set_index": { - "ignore": true - }, + "git_repository_set_index": { + "args": { + "index": { + "isOptional": true + } + }, + "return": { + "isErrorCode": true + } + }, "git_repository_set_odb": { "ignore": true }, "git_repository_set_refdb": { "ignore": true + }, + "git_repository_statistics": { + "isAsync": true + }, + "git_repository_submodule_cache_all": { + "return": { + "isErrorCode": true + } + }, + "git_repository_submodule_cache_clear": { + "return": { + "isErrorCode": true + } } } }, "revert": { "functions": { + "git_revert": { + "isAsync": true, + "args": { + "given_opts": { + "isOptional": true + } + }, + "return": { + "isErrorCode": true + } + }, + "git_revert_commit": { + "isAsync": true, + "args": { + "merge_options": { + "isOptional": true + } + } + }, "git_revert_init_options": { "ignore": true + }, + "git_revert_options_init": { + "ignore": true } } }, @@ -1761,8 +3888,12 @@ } }, "reset": { + "dependencies": [ + "../include/str_array_converter.h" + ], "functions": { "git_reset": { + "isCollectionRoot": true, "args": { "checkout_opts": { "isOptional": true @@ -1789,13 +3920,30 @@ "return": { "isErrorCode": true } + }, + "git_reset_from_annotated": { + "args": { + "checkout_opts": { + "isOptional": true + } + }, + "isAsync": true, + "return": { + "isErrorCode": true + } } } }, - "revspec": { - "ignore": true - }, "revwalk": { + "selfFreeing": true, + "ownerFn": { + "name": "git_revwalk_repository", + "singletonCppClassName": "GitRepository" + }, + "dependencies": [ + "../include/commit.h", + "../include/functions/copy.h" + ], "functions": { "git_revwalk_add_hide_cb": { "ignore": true @@ -1807,18 +3955,36 @@ "isAsync": false } } - }, "signature": { + "selfFreeing": true, + "dupFunction": "git_signature_dup", "functions": { "git_signature_default": { - "isAsync": false + "isAsync": true, + "return": { + "isErrorCode": true + } + }, + "git_signature_dup": { + "ignore": true + }, + "git_signature_free": { + "ignore": true }, "git_signature_new": { "isAsync": false }, "git_signature_now": { - "isAsync": false + "isAsync": false, + "args": { + "sig_out": { + "isReturn": true + } + }, + "return": { + "isErrorCode": true + } } } }, @@ -1835,17 +4001,37 @@ } } }, + "smart_subtransport": { + "ignore": true + }, "smart_subtransport_definition": { "ignore": true }, + "smart_subtransport_stream": { + "ignore": true + }, "stash": { "functions": { "git_stash_apply": { + "args": { + "options": { + "isOptional": true + } + }, "isAsync": true, "return": { "isErrorCode": true } }, + "git_stash_apply_init_options": { + "ignore": true + }, + "git_stash_apply_options_init": { + "ignore": true + }, + "git_stash_save_options_init": { + "ignore": true + }, "git_stash_drop": { "isAsync": true, "return": { @@ -1859,12 +4045,22 @@ } }, "git_stash_pop": { + "args": { + "options": { + "isOptional": true + } + }, "isAsync": true, "return": { "isErrorCode": true } }, "git_stash_save": { + "args": { + "message": { + "isOptional": true + } + }, "isAsync": true, "return": { "isErrorCode": true @@ -1872,22 +4068,35 @@ } } }, + "stash_save_options": { + "dependencies": [ + "../include/str_array_converter.h" + ] + }, + "stdalloc": { + "ignore": true + }, "status": { "cDependencies": [ "git2/sys/diff.h" ], "functions": { "git_status_byindex": { - "isAsync": false + "isAsync": false, + "return": { + "ownedBy": ["statuslist"] + } }, "git_status_file": { + "isAsync": true, "args": { "status_flags": { - "isReturn": true - }, - "return": { - "isErrorCode": true + "isReturn": true, + "shouldAlloc": true } + }, + "return": { + "isErrorCode": true } }, "git_status_foreach": { @@ -1904,14 +4113,39 @@ }, "git_status_init_options": { "ignore": true + }, + "git_status_options_init": { + "ignore": true } } }, "status_list": { + "selfFreeing": true, "functions": { + "git_status_list_free": { + "ignore": true + }, + "git_status_list_get_perfdata": { + "isAsync": false, + "args": { + "out": { + "isReturn": true, + "shouldAlloc": true + }, + "status": { + "isSelf": true + } + }, + "return": { + "isErrorCode": true + } + }, "git_status_list_new": { "isAsync": true, "args": { + "out": { + "ownedBy": ["repo"] + }, "opts": { "isOptional": true } @@ -1923,6 +4157,16 @@ } }, "strarray": { + "selfFreeing": true, + "freeFunctionName": "git_strarray_dispose", + "functions": { + "git_strarray_dispose": { + "ignore": true + }, + "git_strarray_free": { + "ignore": true + } + }, "dependencies": [ "../include/str_array_converter.h" ] @@ -1933,23 +4177,184 @@ "git2/sys/stream.h" ] }, + "stream_registration": { + "ignore": true + }, "submodule": { + "hasConstructor": false, + "selfFreeing": true, + "ownerFn": { + "name": "git_submodule_owner", + "singletonCppClassName": "GitRepository" + }, "functions": { + "git_submodule_add_to_index": { + "isAsync": true, + "return": { + "isErrorCode": true + } + }, + "git_submodule_add_finalize": { + "isAsync": true, + "return": { + "isErrorCode": true + } + }, + "git_submodule_head_id": { + "return": { + "ownedByThis": true + } + }, + "git_submodule_init": { + "isAsync": true, + "return": { + "isErrorCode": true + } + }, "git_submodule_foreach": { + "isAsync": true, + "args": { + "callback": { + "type": "git_submodule_cb", + "cType": "git_submodule_cb", + "cppClassName": "git_submodule_cb" + } + }, + "return": { + "isErrorCode": true, + "type": "int" + } + }, + "git_submodule_free": { "ignore": true }, + "git_submodule_index_id": { + "return": { + "ownedByThis": true + } + }, + "git_submodule_wd_id": { + "return": { + "ownedByThis": true + } + }, "git_submodule_location": { - "ignore": true + "isAsync": true, + "args": { + "location_status": { + "shouldAlloc": true, + "isReturn": true + }, + "submodule": { + "isSelf": true + } + }, + "return": { + "isErrorCode": true + } + }, + "git_submodule_open": { + "isAsync": true, + "args": { + "repo": { + "isReturn": true + }, + "submodule": { + "isSelf": true + } + }, + "return": { + "isErrorCode": true + } + }, + "git_submodule_resolve_url": { + "isAsync": true, + "args": { + "out": { + "isReturn": true, + "shouldAlloc": true, + "isSelf": false + } + }, + "return": { + "isErrorCode": true + } + }, + "git_submodule_update": { + "isAsync": true, + "args": { + "options": { + "isOptional": true + } + }, + "return": { + "isErrorCode": true + } + }, + "git_submodule_set_ignore": { + "isAsync": true, + "return": { + "isErrorCode": true + } + }, + "git_submodule_set_update": { + "isAsync": true, + "return": { + "isErrorCode": true + } + }, + "git_submodule_set_url": { + "isAsync": true, + "return": { + "isErrorCode": true + } }, "git_submodule_status": { + "isAsync": true, + "args": { + "status": { + "isReturn": true, + "shouldAlloc": true + } + }, + "return": { + "isErrorCode": true + } + }, + "git_submodule_sync": { + "isAsync": true, + "return": { + "isErrorCode": true + } + }, + "git_submodule_update_init_options": { + "ignore": true + }, + "git_submodule_update_options_init": { "ignore": true } } }, "tag": { - "functions": { - "git_tag_foreach": { - "ignore": true + "dependencies": [ + "../include/str_array_converter.h" + ], + "selfFreeing": true, + "ownerFn": { + "name": "git_tag_owner", + "singletonCppClassName": "GitRepository" + }, + "functions": { + "git_tag_annotation_create": { + "args": { + "oid": { + "isReturn": true + } + }, + "return": { + "isErrorCode": true + }, + "isAsync": true }, "git_tag_create": { "args": { @@ -1962,10 +4367,7 @@ }, "isAsync": true }, - "git_tag_create_frombuffer": { - "ignore": true - }, - "git_tag_create_lightweight": { + "git_tag_create_from_buffer": { "args": { "oid": { "isReturn": true @@ -1976,7 +4378,7 @@ }, "isAsync": true }, - "git_tag_annotation_create": { + "git_tag_create_lightweight": { "args": { "oid": { "isReturn": true @@ -1987,6 +4389,17 @@ }, "isAsync": true }, + "git_tag_foreach": { + "ignore": true + }, + "git_tag_free": { + "ignore": true + }, + "git_tag_id": { + "return": { + "ownedByThis": true + } + }, "git_tag_list": { "args": { "tag_names": { @@ -1998,13 +4411,46 @@ "key": "strings" } }, - "isAsync": true + "isAsync": true, + "return": { + "isErrorCode": true + } + }, + "git_tag_list_match": { + "args": { + "tag_names": { + "isReturn": true, + "shouldAlloc": true, + "cppClassName": "Array", + "jsClassName": "Array", + "size": "count", + "key": "strings" + } + }, + "isAsync": true, + "return": { + "isErrorCode": true + } + }, + "git_tag_tagger": { + "return": { + "ownedByThis": true + } }, "git_tag_target": { + "isAsync": true, "args": { "target_out": { "isReturn": true } + }, + "return": { + "isErrorCode": true + } + }, + "git_tag_target_id": { + "return": { + "ownedByThis": true } }, "git_tag_delete": { @@ -2012,6 +4458,25 @@ "isErrorCode": true }, "isAsync": true + }, + "git_tag_peel": { + "args": { + "tag_target_out": { + "isReturn": true + } + }, + "isAsync": true, + "return": { + "isErrorCode": true + } + } + } + }, + "time": { + "dupFunction": "git_time_dup", + "functions": { + "git_time_sign": { + "ignore": true } } }, @@ -2022,13 +4487,75 @@ } } }, + "transaction": { + "selfFreeing": true, + "functions": { + "git_transaction_free": { + "ignore": true + }, + "git_transaction_new": { + "args": { + "out": { + "ownedBy": ["repo"] + } + } + } + } + }, + "transfer_progress": { + "dupFunction": "git_transfer_progress_dup" + }, "transport": { "cType": "git_transport", "needsForwardDeclaration": false, + "fields": { + "cancel": { + "ignore": true + }, + "close": { + "ignore": true + }, + "connect": { + "ignore": true + }, + "download_pack": { + "ignore": true + }, + "free": { + "ignore": true + }, + "is_connected": { + "ignore": true + }, + "ls": { + "ignore": true + }, + "negotiate_fetch": { + "ignore": true + }, + "push": { + "ignore": true + }, + "read_flags": { + "ignore": true + }, + "set_callbacks": { + "ignore": true + }, + "set_custom_headers": { + "ignore": true + }, + "version": { + "ignore": true + } + }, "functions": { "git_transport_dummy": { "ignore": true }, + "git_transport_init": { + "ignore": true + }, "git_transport_local": { "ignore": true }, @@ -2040,6 +4567,12 @@ }, "git_transport_smart": { "ignore": true + }, + "git_transport_ssh_with_paths": { + "ignore": true + }, + "git_transport_unregister": { + "ignore": true } }, "cDependencies": [ @@ -2047,38 +4580,238 @@ ] }, "tree": { + "selfFreeing": true, + "ownerFn": { + "name": "git_tree_owner", + "singletonCppClassName": "GitRepository" + }, "functions": { - "git_tree_entry_free": { - "ignore": true + "git_tree_create_updated": { + "args": { + "updates": { + "cType": "git_tree_update *", + "cppClassName": "Array", + "jsClassName": "Array", + "arrayElementCppClassName": "GitTreeUpdate" + } + } + }, + "git_tree_entry_byid": { + "return": { + "ownedByThis": true + } }, "git_tree_entry_byindex": { - "jsFunctionName": "_entryByIndex" + "jsFunctionName": "_entryByIndex", + "return": { + "ownedByThis": true + } + }, + "git_tree_entry_byname": { + "jsFunctionName": "_entryByName", + "return": { + "ownedByThis": true + } + }, + "git_tree_entry_bypath": { + "isAsync": true, + "args": { + "out": { + "ownedByThis": true + }, + "root": { + "isSelf": true + } + }, + "return": { + "isErrorCode": true + } }, "git_tree_entrycount": { "jsFunctionName": "entryCount" }, + "git_tree_free": { + "ignore": true + }, + "git_tree_id": { + "return": { + "ownedByThis": true + } + }, "git_tree_walk": { "ignore": true } } }, "treebuilder": { + "selfFreeing": true, "functions": { + "git_treebuilder_clear": { + "return": { + "isErrorCode": true + } + }, "git_treebuilder_filter": { "ignore": true }, + "git_treebuilder_free": { + "ignore": true + }, + "git_treebuilder_get": { + "return": { + "ownedByThis": true + } + }, + "git_treebuilder_insert": { + "isAsync": false, + "args": { + "out": { + "selfFreeing": false, + "ownedByThis": true + } + } + }, "git_treebuilder_write": { + "isAsync": true, "args": { "id": { "isReturn": true } + }, + "return": { + "isErrorCode": true + } + }, + "git_treebuilder_write_with_buffer": { + "ignore": true + }, + "git_treebuilder_new": { + "args": { + "out": { + "ownedBy": ["repo"] + }, + "source": { + "isOptional": true + } + } + } + } + }, + "tree_entry": { + "selfFreeing": true, + "dupFunction": "git_tree_entry_dup", + "freeFunctionName": "git_tree_entry_free", + "functions": { + "git_tree_entry_dup": { + "ignore": true + }, + "git_tree_entry_free": { + "ignore": true + }, + "git_tree_entry_id": { + "return": { + "ownedByThis": true } + }, + "git_tree_entry_to_object": { + "args": { + "object_out": { + "isReturn": true + } + }, + "return": { + "isErrorCode": true + }, + "isAsync": true } } }, + "win32": { + "ignore": true + }, + "worktree": { + "selfFreeing": true, + "cType": "git_worktree", + "freeFunctionName": "git_worktree_free", + "functions": { + "git_worktree_add": { + "args": { + "out": { + "ownedBy": ["repo"] + } + } + }, + "git_worktree_add_init_options": { + "ignore": true + }, + "git_worktree_add_options_init": { + "ignore": true + }, + "git_worktree_free": { + "ignore": true + }, + "git_worktree_is_prunable": { + "args": { + "opts": { + "isOptional": true + } + }, + "isAsync": true + }, + "git_worktree_lookup": { + "args": { + "out": { + "ownedBy": ["repo"] + } + } + }, + "git_worktree_open_from_repository": { + "args": { + "out": { + "ownedBy": ["repo"] + } + } + }, + "git_worktree_prune_init_options": { + "ignore": true + }, + "git_worktree_prune_options_init": { + "ignore": true + }, + "git_worktree_prune": { + "args": { + "opts": { + "isOptional": true + } + }, + "isAsync": true, + "return": { + "isErrorCode": true + } + } + }, + "dependencies": [ + "../include/git_buf_converter.h" + ] + }, + "tree_update": { + "hasConstructor": true, + "ignoreInit": true + }, "writestream": { "cType": "git_writestream", - "needsForwardDeclaration": false + "needsForwardDeclaration": false, + "fields": { + "close": { + "ignore": true + }, + "free": { + "ignore": true + }, + "write": { + "ignore": true + } + } } } } diff --git a/generate/input/libgit2-docs.json b/generate/input/libgit2-docs.json new file mode 100644 index 0000000000..e1969402e7 --- /dev/null +++ b/generate/input/libgit2-docs.json @@ -0,0 +1,37933 @@ +{ + "files": [ + { + "file": "git2/annotated_commit.h", + "functions": [ + "git_annotated_commit_from_ref", + "git_annotated_commit_from_fetchhead", + "git_annotated_commit_lookup", + "git_annotated_commit_from_revspec", + "git_annotated_commit_id", + "git_annotated_commit_ref", + "git_annotated_commit_free" + ], + "meta": {}, + "lines": 128 + }, + { + "file": "git2/apply.h", + "functions": [ + "git_apply_delta_cb", + "git_apply_hunk_cb", + "git_apply_options_init", + "git_apply_to_tree", + "git_apply" + ], + "meta": {}, + "lines": 182 + }, + { + "file": "git2/attr.h", + "functions": [ + "git_attr_value", + "git_attr_get", + "git_attr_get_ext", + "git_attr_get_many", + "git_attr_get_many_ext", + "git_attr_foreach_cb", + "git_attr_foreach", + "git_attr_foreach_ext", + "git_attr_cache_flush", + "git_attr_add_macro" + ], + "meta": {}, + "lines": 378 + }, + { + "file": "git2/blame.h", + "functions": [ + "git_blame_options_init", + "git_blame_linecount", + "git_blame_hunkcount", + "git_blame_hunk_byindex", + "git_blame_hunk_byline", + "git_blame_line_byindex", + "git_blame_get_hunk_count", + "git_blame_get_hunk_byindex", + "git_blame_get_hunk_byline", + "git_blame_buffer", + "git_blame_free" + ], + "meta": {}, + "lines": 385 + }, + { + "file": "git2/blob.h", + "functions": [ + "git_blob_lookup", + "git_blob_lookup_prefix", + "git_blob_free", + "git_blob_id", + "git_blob_owner", + "git_blob_rawcontent", + "git_blob_rawsize", + "git_blob_filter_options_init", + "git_blob_filter", + "git_blob_create_from_workdir", + "git_blob_create_from_disk", + "git_blob_create_from_stream", + "git_blob_create_from_stream_commit", + "git_blob_create_from_buffer", + "git_blob_is_binary", + "git_blob_data_is_binary", + "git_blob_dup" + ], + "meta": {}, + "lines": 350 + }, + { + "file": "git2/branch.h", + "functions": [ + "git_branch_create", + "git_branch_create_from_annotated", + "git_branch_delete", + "git_branch_iterator_new", + "git_branch_next", + "git_branch_iterator_free", + "git_branch_move", + "git_branch_lookup", + "git_branch_name", + "git_branch_upstream", + "git_branch_set_upstream", + "git_branch_upstream_name", + "git_branch_is_head", + "git_branch_is_checked_out", + "git_branch_remote_name", + "git_branch_upstream_remote", + "git_branch_upstream_merge", + "git_branch_name_is_valid" + ], + "meta": {}, + "lines": 339 + }, + { + "file": "git2/buffer.h", + "functions": ["git_buf_dispose"], + "meta": {}, + "lines": 71 + }, + { + "file": "git2/cert.h", + "functions": ["git_transport_certificate_check_cb"], + "meta": {}, + "lines": 168 + }, + { + "file": "git2/checkout.h", + "functions": [ + "git_checkout_notify_cb", + "git_checkout_progress_cb", + "git_checkout_perfdata_cb", + "git_checkout_options_init", + "git_checkout_head", + "git_checkout_index", + "git_checkout_tree" + ], + "meta": {}, + "lines": 463 + }, + { + "file": "git2/cherrypick.h", + "functions": [ + "git_cherrypick_options_init", + "git_cherrypick_commit", + "git_cherrypick" + ], + "meta": {}, + "lines": 94 + }, + { + "file": "git2/clone.h", + "functions": [ + "git_remote_create_cb", + "git_repository_create_cb", + "git_clone_options_init", + "git_clone" + ], + "meta": {}, + "lines": 220 + }, + { + "file": "git2/commit.h", + "functions": [ + "git_commit_lookup", + "git_commit_lookup_prefix", + "git_commit_free", + "git_commit_id", + "git_commit_owner", + "git_commit_message_encoding", + "git_commit_message", + "git_commit_message_raw", + "git_commit_summary", + "git_commit_body", + "git_commit_time", + "git_commit_time_offset", + "git_commit_committer", + "git_commit_author", + "git_commit_committer_with_mailmap", + "git_commit_author_with_mailmap", + "git_commit_raw_header", + "git_commit_tree", + "git_commit_tree_id", + "git_commit_parentcount", + "git_commit_parent", + "git_commit_parent_id", + "git_commit_nth_gen_ancestor", + "git_commit_header_field", + "git_commit_extract_signature", + "git_commit_create", + "git_commit_create_v", + "git_commit_create_from_stage", + "git_commit_amend", + "git_commit_create_buffer", + "git_commit_create_with_signature", + "git_commit_dup", + "git_commit_create_cb", + "git_commitarray_dispose" + ], + "meta": {}, + "lines": 670 + }, + { + "file": "git2/common.h", + "functions": [ + "git_libgit2_version", + "git_libgit2_prerelease", + "git_libgit2_features", + "git_libgit2_feature_backend", + "git_libgit2_opts" + ], + "meta": {}, + "lines": 569 + }, + { + "file": "git2/config.h", + "functions": [ + "git_config_entry_free", + "git_config_foreach_cb", + "git_config_find_global", + "git_config_find_xdg", + "git_config_find_system", + "git_config_find_programdata", + "git_config_open_default", + "git_config_new", + "git_config_add_file_ondisk", + "git_config_open_ondisk", + "git_config_open_level", + "git_config_open_global", + "git_config_set_writeorder", + "git_config_snapshot", + "git_config_free", + "git_config_get_entry", + "git_config_get_int32", + "git_config_get_int64", + "git_config_get_bool", + "git_config_get_path", + "git_config_get_string", + "git_config_get_string_buf", + "git_config_get_multivar_foreach", + "git_config_multivar_iterator_new", + "git_config_next", + "git_config_iterator_free", + "git_config_set_int32", + "git_config_set_int64", + "git_config_set_bool", + "git_config_set_string", + "git_config_set_multivar", + "git_config_delete_entry", + "git_config_delete_multivar", + "git_config_foreach", + "git_config_iterator_new", + "git_config_iterator_glob_new", + "git_config_foreach_match", + "git_config_get_mapped", + "git_config_lookup_map_value", + "git_config_parse_bool", + "git_config_parse_int32", + "git_config_parse_int64", + "git_config_parse_path", + "git_config_backend_foreach_match", + "git_config_lock" + ], + "meta": {}, + "lines": 847 + }, + { + "file": "git2/credential.h", + "functions": [ + "git_credential_acquire_cb", + "git_credential_free", + "git_credential_has_username", + "git_credential_get_username", + "git_credential_userpass_plaintext_new", + "git_credential_default_new", + "git_credential_username_new", + "git_credential_ssh_key_new", + "git_credential_ssh_key_memory_new", + "git_credential_ssh_interactive_cb", + "git_credential_ssh_interactive_new", + "git_credential_ssh_key_from_agent", + "git_credential_sign_cb", + "git_credential_ssh_custom_new" + ], + "meta": {}, + "lines": 338 + }, + { + "file": "git2/credential_helpers.h", + "functions": ["git_credential_userpass"], + "meta": {}, + "lines": 49 + }, + { + "file": "git2/deprecated.h", + "functions": [ + "git_blob_filtered_content", + "git_filter_list_stream_data", + "git_filter_list_apply_to_data", + "git_treebuilder_write_with_buffer", + "git_buf_grow", + "git_buf_set", + "git_buf_is_binary", + "git_buf_contains_nul", + "git_buf_free", + "git_commit_signing_cb", + "git_diff_format_email", + "git_diff_commit_as_email", + "git_diff_format_email_options_init", + "giterr_last", + "giterr_clear", + "giterr_set_str", + "giterr_set_oom", + "git_object__size", + "git_remote_is_valid_name", + "git_reference_is_valid_name", + "git_oidarray_free", + "git_headlist_cb", + "git_strarray_copy", + "git_strarray_free", + "git_blame_init_options" + ], + "meta": {}, + "lines": 1035 + }, + { + "file": "git2/describe.h", + "functions": [ + "git_describe_options_init", + "git_describe_format_options_init", + "git_describe_commit", + "git_describe_workdir", + "git_describe_format", + "git_describe_result_free" + ], + "meta": {}, + "lines": 201 + }, + { + "file": "git2/diff.h", + "functions": [ + "git_diff_notify_cb", + "git_diff_progress_cb", + "git_diff_options_init", + "git_diff_file_cb", + "git_diff_binary_cb", + "git_diff_hunk_cb", + "git_diff_line_cb", + "git_diff_find_options_init", + "git_diff_free", + "git_diff_tree_to_tree", + "git_diff_tree_to_index", + "git_diff_index_to_workdir", + "git_diff_tree_to_workdir", + "git_diff_tree_to_workdir_with_index", + "git_diff_index_to_index", + "git_diff_merge", + "git_diff_find_similar", + "git_diff_num_deltas", + "git_diff_num_deltas_of_type", + "git_diff_get_delta", + "git_diff_is_sorted_icase", + "git_diff_foreach", + "git_diff_status_char", + "git_diff_print", + "git_diff_to_buf", + "git_diff_blobs", + "git_diff_blob_to_buffer", + "git_diff_buffers", + "git_diff_from_buffer", + "git_diff_get_stats", + "git_diff_stats_files_changed", + "git_diff_stats_insertions", + "git_diff_stats_deletions", + "git_diff_stats_to_buf", + "git_diff_stats_free", + "git_diff_patchid_options_init", + "git_diff_patchid" + ], + "meta": {}, + "lines": 1502 + }, + { + "file": "git2/email.h", + "functions": ["git_email_create_from_commit"], + "meta": {}, + "lines": 102 + }, + { + "file": "git2/errors.h", + "functions": ["git_error_last"], + "meta": {}, + "lines": 149 + }, + { + "file": "git2/filter.h", + "functions": [ + "git_filter_list_load", + "git_filter_list_load_ext", + "git_filter_list_contains", + "git_filter_list_apply_to_buffer", + "git_filter_list_apply_to_file", + "git_filter_list_apply_to_blob", + "git_filter_list_stream_buffer", + "git_filter_list_stream_file", + "git_filter_list_stream_blob", + "git_filter_list_free" + ], + "meta": {}, + "lines": 278 + }, + { + "file": "git2/global.h", + "functions": ["git_libgit2_init", "git_libgit2_shutdown"], + "meta": {}, + "lines": 45 + }, + { + "file": "git2/graph.h", + "functions": [ + "git_graph_ahead_behind", + "git_graph_descendant_of", + "git_graph_reachable_from_any" + ], + "meta": {}, + "lines": 73 + }, + { + "file": "git2/ignore.h", + "functions": [ + "git_ignore_add_rule", + "git_ignore_clear_internal_rules", + "git_ignore_path_is_ignored" + ], + "meta": {}, + "lines": 83 + }, + { + "file": "git2/index.h", + "functions": [ + "git_index_matched_path_cb", + "git_index_open", + "git_index_new", + "git_index_free", + "git_index_owner", + "git_index_caps", + "git_index_set_caps", + "git_index_version", + "git_index_set_version", + "git_index_read", + "git_index_write", + "git_index_path", + "git_index_checksum", + "git_index_read_tree", + "git_index_write_tree", + "git_index_write_tree_to", + "git_index_entrycount", + "git_index_clear", + "git_index_get_byindex", + "git_index_get_bypath", + "git_index_remove", + "git_index_remove_directory", + "git_index_add", + "git_index_entry_stage", + "git_index_entry_is_conflict", + "git_index_iterator_new", + "git_index_iterator_next", + "git_index_iterator_free", + "git_index_add_bypath", + "git_index_add_from_buffer", + "git_index_remove_bypath", + "git_index_add_all", + "git_index_remove_all", + "git_index_update_all", + "git_index_find", + "git_index_find_prefix", + "git_index_conflict_add", + "git_index_conflict_get", + "git_index_conflict_remove", + "git_index_conflict_cleanup", + "git_index_has_conflicts", + "git_index_conflict_iterator_new", + "git_index_conflict_next", + "git_index_conflict_iterator_free" + ], + "meta": {}, + "lines": 928 + }, + { + "file": "git2/indexer.h", + "functions": [ + "git_indexer_progress_cb", + "git_indexer_options_init", + "git_indexer_new", + "git_indexer_append", + "git_indexer_commit", + "git_indexer_hash", + "git_indexer_name", + "git_indexer_free" + ], + "meta": {}, + "lines": 207 + }, + { + "file": "git2/mailmap.h", + "functions": [ + "git_mailmap_new", + "git_mailmap_free", + "git_mailmap_add_entry", + "git_mailmap_from_buffer", + "git_mailmap_from_repository", + "git_mailmap_resolve", + "git_mailmap_resolve_signature" + ], + "meta": {}, + "lines": 116 + }, + { + "file": "git2/merge.h", + "functions": [ + "git_merge_file_input_init", + "git_merge_file_options_init", + "git_merge_options_init", + "git_merge_analysis", + "git_merge_analysis_for_ref", + "git_merge_base", + "git_merge_bases", + "git_merge_base_many", + "git_merge_bases_many", + "git_merge_base_octopus", + "git_merge_file", + "git_merge_file_from_index", + "git_merge_file_result_free", + "git_merge_trees", + "git_merge_commits", + "git_merge" + ], + "meta": {}, + "lines": 666 + }, + { + "file": "git2/message.h", + "functions": [ + "git_message_prettify", + "git_message_trailers", + "git_message_trailer_array_free" + ], + "meta": {}, + "lines": 81 + }, + { "file": "git2/net.h", "functions": [], "meta": {}, "lines": 51 }, + { + "file": "git2/notes.h", + "functions": [ + "git_note_foreach_cb", + "git_note_iterator_free", + "git_note_next" + ], + "meta": {}, + "lines": 91 + }, + { + "file": "git2/object.h", + "functions": [ + "git_object_lookup", + "git_object_lookup_prefix", + "git_object_lookup_bypath", + "git_object_id", + "git_object_short_id", + "git_object_type", + "git_object_owner", + "git_object_free", + "git_object_type2string", + "git_object_string2type", + "git_object_typeisloose", + "git_object_peel", + "git_object_dup", + "git_object_rawcontent_is_valid" + ], + "meta": {}, + "lines": 274 + }, + { + "file": "git2/odb.h", + "functions": [ + "git_odb_foreach_cb", + "git_odb_new", + "git_odb_open", + "git_odb_add_disk_alternate", + "git_odb_free", + "git_odb_read", + "git_odb_read_prefix", + "git_odb_read_header", + "git_odb_exists", + "git_odb_exists_ext", + "git_odb_exists_prefix", + "git_odb_expand_ids", + "git_odb_refresh", + "git_odb_foreach", + "git_odb_write", + "git_odb_open_wstream", + "git_odb_stream_write", + "git_odb_stream_finalize_write", + "git_odb_stream_read", + "git_odb_stream_free", + "git_odb_open_rstream", + "git_odb_write_pack", + "git_odb_write_multi_pack_index", + "git_odb_hash", + "git_odb_hashfile", + "git_odb_object_dup", + "git_odb_object_free", + "git_odb_object_id", + "git_odb_object_data", + "git_odb_object_size", + "git_odb_object_type", + "git_odb_add_backend", + "git_odb_add_alternate", + "git_odb_num_backends", + "git_odb_get_backend", + "git_odb_set_commit_graph" + ], + "meta": {}, + "lines": 691 + }, + { + "file": "git2/odb_backend.h", + "functions": [ + "git_odb_backend_pack", + "git_odb_backend_one_pack", + "git_odb_backend_loose" + ], + "meta": {}, + "lines": 246 + }, + { + "file": "git2/oid.h", + "functions": [ + "git_oid_fromstr", + "git_oid_fromstrp", + "git_oid_fromstrn", + "git_oid_fromraw", + "git_oid_fmt", + "git_oid_nfmt", + "git_oid_pathfmt", + "git_oid_tostr_s", + "git_oid_tostr", + "git_oid_cpy", + "git_oid_cmp", + "git_oid_equal", + "git_oid_ncmp", + "git_oid_streq", + "git_oid_strcmp", + "git_oid_is_zero", + "git_oid_shorten_new", + "git_oid_shorten_add", + "git_oid_shorten_free" + ], + "meta": {}, + "lines": 366 + }, + { + "file": "git2/oidarray.h", + "functions": ["git_oidarray_dispose"], + "meta": {}, + "lines": 38 + }, + { + "file": "git2/pack.h", + "functions": [ + "git_packbuilder_new", + "git_packbuilder_set_threads", + "git_packbuilder_insert", + "git_packbuilder_insert_tree", + "git_packbuilder_insert_commit", + "git_packbuilder_insert_walk", + "git_packbuilder_insert_recur", + "git_packbuilder_write_buf", + "git_packbuilder_write", + "git_packbuilder_hash", + "git_packbuilder_name", + "git_packbuilder_foreach_cb", + "git_packbuilder_foreach", + "git_packbuilder_object_count", + "git_packbuilder_written", + "git_packbuilder_progress", + "git_packbuilder_set_callbacks", + "git_packbuilder_free" + ], + "meta": {}, + "lines": 274 + }, + { + "file": "git2/patch.h", + "functions": [ + "git_patch_owner", + "git_patch_from_diff", + "git_patch_from_blobs", + "git_patch_from_blob_and_buffer", + "git_patch_from_buffers", + "git_patch_free", + "git_patch_get_delta", + "git_patch_num_hunks", + "git_patch_line_stats", + "git_patch_get_hunk", + "git_patch_num_lines_in_hunk", + "git_patch_get_line_in_hunk", + "git_patch_size", + "git_patch_print", + "git_patch_to_buf" + ], + "meta": {}, + "lines": 284 + }, + { + "file": "git2/pathspec.h", + "functions": [ + "git_pathspec_new", + "git_pathspec_free", + "git_pathspec_matches_path", + "git_pathspec_match_workdir", + "git_pathspec_match_index", + "git_pathspec_match_tree", + "git_pathspec_match_diff", + "git_pathspec_match_list_free", + "git_pathspec_match_list_entrycount", + "git_pathspec_match_list_entry", + "git_pathspec_match_list_diff_entry", + "git_pathspec_match_list_failed_entrycount", + "git_pathspec_match_list_failed_entry" + ], + "meta": {}, + "lines": 284 + }, + { + "file": "git2/proxy.h", + "functions": ["git_proxy_options_init"], + "meta": {}, + "lines": 103 + }, + { + "file": "git2/rebase.h", + "functions": [ + "git_rebase_options_init", + "git_rebase_init", + "git_rebase_open", + "git_rebase_orig_head_name", + "git_rebase_orig_head_id", + "git_rebase_onto_name", + "git_rebase_onto_id", + "git_rebase_operation_entrycount", + "git_rebase_operation_current", + "git_rebase_operation_byindex", + "git_rebase_next", + "git_rebase_inmemory_index", + "git_rebase_commit", + "git_rebase_abort", + "git_rebase_finish", + "git_rebase_free" + ], + "meta": {}, + "lines": 397 + }, + { + "file": "git2/refdb.h", + "functions": [ + "git_refdb_new", + "git_refdb_open", + "git_refdb_compress", + "git_refdb_free" + ], + "meta": {}, + "lines": 66 + }, + { + "file": "git2/reflog.h", + "functions": [ + "git_reflog_read", + "git_reflog_write", + "git_reflog_append", + "git_reflog_rename", + "git_reflog_delete", + "git_reflog_entrycount", + "git_reflog_entry_byindex", + "git_reflog_drop", + "git_reflog_entry_id_old", + "git_reflog_entry_id_new", + "git_reflog_entry_committer", + "git_reflog_entry_message", + "git_reflog_free" + ], + "meta": {}, + "lines": 166 + }, + { + "file": "git2/refs.h", + "functions": [ + "git_reference_lookup", + "git_reference_name_to_id", + "git_reference_dwim", + "git_reference_symbolic_create_matching", + "git_reference_symbolic_create", + "git_reference_create", + "git_reference_create_matching", + "git_reference_target", + "git_reference_target_peel", + "git_reference_symbolic_target", + "git_reference_type", + "git_reference_name", + "git_reference_resolve", + "git_reference_owner", + "git_reference_symbolic_set_target", + "git_reference_set_target", + "git_reference_rename", + "git_reference_delete", + "git_reference_remove", + "git_reference_list", + "git_reference_foreach_cb", + "git_reference_foreach_name_cb", + "git_reference_foreach", + "git_reference_foreach_name", + "git_reference_dup", + "git_reference_free", + "git_reference_cmp", + "git_reference_iterator_new", + "git_reference_iterator_glob_new", + "git_reference_next", + "git_reference_next_name", + "git_reference_iterator_free", + "git_reference_foreach_glob", + "git_reference_has_log", + "git_reference_ensure_log", + "git_reference_is_branch", + "git_reference_is_remote", + "git_reference_is_tag", + "git_reference_is_note", + "git_reference_normalize_name", + "git_reference_peel", + "git_reference_name_is_valid", + "git_reference_shorthand" + ], + "meta": {}, + "lines": 769 + }, + { + "file": "git2/refspec.h", + "functions": [ + "git_refspec_parse", + "git_refspec_free", + "git_refspec_src", + "git_refspec_dst", + "git_refspec_string", + "git_refspec_force", + "git_refspec_direction", + "git_refspec_src_matches_negative", + "git_refspec_src_matches", + "git_refspec_dst_matches", + "git_refspec_transform", + "git_refspec_rtransform" + ], + "meta": {}, + "lines": 126 + }, + { + "file": "git2/remote.h", + "functions": [ + "git_remote_create", + "git_remote_create_options_init", + "git_remote_create_with_opts", + "git_remote_create_with_fetchspec", + "git_remote_create_anonymous", + "git_remote_create_detached", + "git_remote_lookup", + "git_remote_dup", + "git_remote_owner", + "git_remote_name", + "git_remote_url", + "git_remote_pushurl", + "git_remote_set_url", + "git_remote_set_pushurl", + "git_remote_set_instance_url", + "git_remote_set_instance_pushurl", + "git_remote_add_fetch", + "git_remote_get_fetch_refspecs", + "git_remote_add_push", + "git_remote_get_push_refspecs", + "git_remote_refspec_count", + "git_remote_get_refspec", + "git_remote_ls", + "git_remote_connected", + "git_remote_stop", + "git_remote_disconnect", + "git_remote_free", + "git_remote_list", + "git_push_transfer_progress_cb", + "git_push_negotiation", + "git_push_update_reference_cb", + "git_url_resolve_cb", + "git_remote_ready_cb", + "git_remote_init_callbacks", + "git_fetch_options_init", + "git_push_options_init", + "git_remote_connect_options_init", + "git_remote_connect", + "git_remote_connect_ext", + "git_remote_download", + "git_remote_upload", + "git_remote_update_tips", + "git_remote_fetch", + "git_remote_prune", + "git_remote_push", + "git_remote_stats", + "git_remote_autotag", + "git_remote_set_autotag", + "git_remote_prune_refs", + "git_remote_rename", + "git_remote_name_is_valid", + "git_remote_delete", + "git_remote_default_branch" + ], + "meta": {}, + "lines": 1244 + }, + { + "file": "git2/repository.h", + "functions": [ + "git_repository_open", + "git_repository_open_from_worktree", + "git_repository_wrap_odb", + "git_repository_discover", + "git_repository_open_ext", + "git_repository_open_bare", + "git_repository_free", + "git_repository_init", + "git_repository_init_options_init", + "git_repository_init_ext", + "git_repository_head", + "git_repository_head_for_worktree", + "git_repository_head_detached", + "git_repository_head_detached_for_worktree", + "git_repository_head_unborn", + "git_repository_is_empty", + "git_repository_item_path", + "git_repository_path", + "git_repository_workdir", + "git_repository_commondir", + "git_repository_set_workdir", + "git_repository_is_bare", + "git_repository_is_worktree", + "git_repository_config", + "git_repository_config_snapshot", + "git_repository_odb", + "git_repository_refdb", + "git_repository_index", + "git_repository_message", + "git_repository_message_remove", + "git_repository_state_cleanup", + "git_repository_fetchhead_foreach_cb", + "git_repository_fetchhead_foreach", + "git_repository_mergehead_foreach_cb", + "git_repository_mergehead_foreach", + "git_repository_hashfile", + "git_repository_set_head", + "git_repository_set_head_detached", + "git_repository_set_head_detached_from_annotated", + "git_repository_detach_head", + "git_repository_state", + "git_repository_set_namespace", + "git_repository_get_namespace", + "git_repository_is_shallow", + "git_repository_ident", + "git_repository_set_ident", + "git_repository_oid_type", + "git_repository_commit_parents" + ], + "meta": {}, + "lines": 1014 + }, + { + "file": "git2/reset.h", + "functions": [ + "git_reset", + "git_reset_from_annotated", + "git_reset_default" + ], + "meta": {}, + "lines": 119 + }, + { + "file": "git2/revert.h", + "functions": [ + "git_revert_options_init", + "git_revert_commit", + "git_revert" + ], + "meta": {}, + "lines": 91 + }, + { + "file": "git2/revparse.h", + "functions": ["git_revparse_single", "git_revparse_ext", "git_revparse"], + "meta": {}, + "lines": 108 + }, + { + "file": "git2/revwalk.h", + "functions": [ + "git_revwalk_new", + "git_revwalk_reset", + "git_revwalk_push", + "git_revwalk_push_glob", + "git_revwalk_push_head", + "git_revwalk_hide", + "git_revwalk_hide_glob", + "git_revwalk_hide_head", + "git_revwalk_push_ref", + "git_revwalk_hide_ref", + "git_revwalk_next", + "git_revwalk_sorting", + "git_revwalk_push_range", + "git_revwalk_simplify_first_parent", + "git_revwalk_free", + "git_revwalk_repository", + "git_revwalk_hide_cb", + "git_revwalk_add_hide_cb" + ], + "meta": {}, + "lines": 298 + }, + { + "file": "git2/signature.h", + "functions": [ + "git_signature_new", + "git_signature_now", + "git_signature_default_from_env", + "git_signature_default", + "git_signature_from_buffer", + "git_signature_dup", + "git_signature_free" + ], + "meta": {}, + "lines": 143 + }, + { + "file": "git2/stash.h", + "functions": [ + "git_stash_save", + "git_stash_save_options_init", + "git_stash_save_with_opts", + "git_stash_apply_progress_cb", + "git_stash_apply_options_init", + "git_stash_apply", + "git_stash_cb", + "git_stash_foreach", + "git_stash_drop", + "git_stash_pop" + ], + "meta": {}, + "lines": 323 + }, + { + "file": "git2/status.h", + "functions": [ + "git_status_cb", + "git_status_options_init", + "git_status_foreach", + "git_status_foreach_ext", + "git_status_file", + "git_status_list_new", + "git_status_list_entrycount", + "git_status_byindex", + "git_status_list_free", + "git_status_should_ignore" + ], + "meta": {}, + "lines": 451 + }, + { + "file": "git2/strarray.h", + "functions": ["git_strarray_dispose"], + "meta": {}, + "lines": 37 + }, + { + "file": "git2/submodule.h", + "functions": [ + "git_submodule_cb", + "git_submodule_update_options_init", + "git_submodule_update", + "git_submodule_lookup", + "git_submodule_dup", + "git_submodule_free", + "git_submodule_foreach", + "git_submodule_add_setup", + "git_submodule_clone", + "git_submodule_add_finalize", + "git_submodule_add_to_index", + "git_submodule_owner", + "git_submodule_name", + "git_submodule_path", + "git_submodule_url", + "git_submodule_resolve_url", + "git_submodule_branch", + "git_submodule_set_branch", + "git_submodule_set_url", + "git_submodule_index_id", + "git_submodule_head_id", + "git_submodule_wd_id", + "git_submodule_ignore", + "git_submodule_set_ignore", + "git_submodule_update_strategy", + "git_submodule_set_update", + "git_submodule_fetch_recurse_submodules", + "git_submodule_set_fetch_recurse_submodules", + "git_submodule_init", + "git_submodule_repo_init", + "git_submodule_sync", + "git_submodule_open", + "git_submodule_reload", + "git_submodule_status", + "git_submodule_location" + ], + "meta": {}, + "lines": 674 + }, + { + "file": "git2/sys/commit_graph.h", + "functions": [], + "meta": {}, + "lines": 99 + }, + { "file": "git2/sys/config.h", "functions": [], "meta": {}, "lines": 162 }, + { "file": "git2/sys/filter.h", "functions": [], "meta": {}, "lines": 109 }, + { "file": "git2/sys/hashsig.h", "functions": [], "meta": {}, "lines": 55 }, + { "file": "git2/sys/merge.h", "functions": [], "meta": {}, "lines": 49 }, + { "file": "git2/sys/path.h", "functions": [], "meta": {}, "lines": 51 }, + { "file": "git2/sys/stream.h", "functions": [], "meta": {}, "lines": 105 }, + { + "file": "git2/sys/transport.h", + "functions": [], + "meta": {}, + "lines": 328 + }, + { + "file": "git2/tag.h", + "functions": [ + "git_tag_lookup", + "git_tag_lookup_prefix", + "git_tag_free", + "git_tag_id", + "git_tag_owner", + "git_tag_target", + "git_tag_target_id", + "git_tag_target_type", + "git_tag_name", + "git_tag_tagger", + "git_tag_message", + "git_tag_create", + "git_tag_annotation_create", + "git_tag_create_from_buffer", + "git_tag_create_lightweight", + "git_tag_delete", + "git_tag_list", + "git_tag_list_match", + "git_tag_foreach_cb", + "git_tag_foreach", + "git_tag_peel", + "git_tag_dup", + "git_tag_name_is_valid" + ], + "meta": {}, + "lines": 380 + }, + { + "file": "git2/trace.h", + "functions": ["git_trace_cb", "git_trace_set"], + "meta": {}, + "lines": 68 + }, + { + "file": "git2/transaction.h", + "functions": [ + "git_transaction_new", + "git_transaction_lock_ref", + "git_transaction_set_target", + "git_transaction_set_symbolic_target", + "git_transaction_set_reflog", + "git_transaction_remove", + "git_transaction_commit", + "git_transaction_free" + ], + "meta": {}, + "lines": 117 + }, + { + "file": "git2/transport.h", + "functions": ["git_transport_message_cb", "git_transport_cb"], + "meta": {}, + "lines": 45 + }, + { + "file": "git2/tree.h", + "functions": [ + "git_tree_lookup", + "git_tree_lookup_prefix", + "git_tree_free", + "git_tree_id", + "git_tree_owner", + "git_tree_entrycount", + "git_tree_entry_byname", + "git_tree_entry_byindex", + "git_tree_entry_byid", + "git_tree_entry_bypath", + "git_tree_entry_dup", + "git_tree_entry_free", + "git_tree_entry_name", + "git_tree_entry_id", + "git_tree_entry_type", + "git_tree_entry_filemode", + "git_tree_entry_filemode_raw", + "git_tree_entry_cmp", + "git_tree_entry_to_object", + "git_treebuilder_new", + "git_treebuilder_clear", + "git_treebuilder_entrycount", + "git_treebuilder_free", + "git_treebuilder_get", + "git_treebuilder_insert", + "git_treebuilder_remove", + "git_treebuilder_filter_cb", + "git_treebuilder_filter", + "git_treebuilder_write", + "git_treewalk_cb", + "git_tree_walk", + "git_tree_dup", + "git_tree_create_updated" + ], + "meta": {}, + "lines": 481 + }, + { "file": "git2/types.h", "functions": [], "meta": {}, "lines": 382 }, + { + "file": "git2/worktree.h", + "functions": [ + "git_worktree_list", + "git_worktree_lookup", + "git_worktree_open_from_repository", + "git_worktree_free", + "git_worktree_validate", + "git_worktree_add_options_init", + "git_worktree_add", + "git_worktree_lock", + "git_worktree_unlock", + "git_worktree_is_locked", + "git_worktree_name", + "git_worktree_path", + "git_worktree_prune_options_init", + "git_worktree_is_prunable", + "git_worktree_prune" + ], + "meta": {}, + "lines": 273 + } + ], + "functions": { + "git_annotated_commit_from_ref": { + "type": "function", + "file": "git2/annotated_commit.h", + "line": 40, + "lineto": 43, + "args": [ + { + "name": "out", + "type": "git_annotated_commit **", + "comment": "pointer to store the git_annotated_commit result in" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "repository that contains the given reference" + }, + { + "name": "ref", + "type": "const git_reference *", + "comment": "reference to use to lookup the git_annotated_commit" + } + ], + "argline": "git_annotated_commit **out, git_repository *repo, const git_reference *ref", + "sig": "git_annotated_commit **::git_repository *::const git_reference *", + "return": { "type": "int", "comment": " 0 on success or error code" }, + "description": "

Creates a git_annotated_commit from the given reference.\n The resulting git_annotated_commit must be freed with\n git_annotated_commit_free.

\n", + "comments": "", + "group": "annotated", + "examples": { + "checkout.c": [ + "ex/v1.9.1/checkout.html#git_annotated_commit_from_ref-1" + ] + } + }, + "git_annotated_commit_from_fetchhead": { + "type": "function", + "file": "git2/annotated_commit.h", + "line": 57, + "lineto": 62, + "args": [ + { + "name": "out", + "type": "git_annotated_commit **", + "comment": "pointer to store the git_annotated_commit result in" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "repository that contains the given commit" + }, + { + "name": "branch_name", + "type": "const char *", + "comment": "name of the (remote) branch" + }, + { + "name": "remote_url", + "type": "const char *", + "comment": "url of the remote" + }, + { + "name": "id", + "type": "const git_oid *", + "comment": "the commit object id of the remote branch" + } + ], + "argline": "git_annotated_commit **out, git_repository *repo, const char *branch_name, const char *remote_url, const git_oid *id", + "sig": "git_annotated_commit **::git_repository *::const char *::const char *::const git_oid *", + "return": { "type": "int", "comment": " 0 on success or error code" }, + "description": "

Creates a git_annotated_commit from the given fetch head data.\n The resulting git_annotated_commit must be freed with\n git_annotated_commit_free.

\n", + "comments": "", + "group": "annotated" + }, + "git_annotated_commit_lookup": { + "type": "function", + "file": "git2/annotated_commit.h", + "line": 82, + "lineto": 85, + "args": [ + { + "name": "out", + "type": "git_annotated_commit **", + "comment": "pointer to store the git_annotated_commit result in" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "repository that contains the given commit" + }, + { + "name": "id", + "type": "const git_oid *", + "comment": "the commit object id to lookup" + } + ], + "argline": "git_annotated_commit **out, git_repository *repo, const git_oid *id", + "sig": "git_annotated_commit **::git_repository *::const git_oid *", + "return": { "type": "int", "comment": " 0 on success or error code" }, + "description": "

Creates a git_annotated_commit from the given commit id.\n The resulting git_annotated_commit must be freed with\n git_annotated_commit_free.

\n", + "comments": "

An annotated commit contains information about how it was looked up, which may be useful for functions like merge or rebase to provide context to the operation. For example, conflict files will include the name of the source or target branches being merged. It is therefore preferable to use the most specific function (eg git_annotated_commit_from_ref) instead of this one when that data is known.

\n", + "group": "annotated" + }, + "git_annotated_commit_from_revspec": { + "type": "function", + "file": "git2/annotated_commit.h", + "line": 99, + "lineto": 102, + "args": [ + { + "name": "out", + "type": "git_annotated_commit **", + "comment": "pointer to store the git_annotated_commit result in" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "repository that contains the given commit" + }, + { + "name": "revspec", + "type": "const char *", + "comment": "the extended sha syntax string to use to lookup the commit" + } + ], + "argline": "git_annotated_commit **out, git_repository *repo, const char *revspec", + "sig": "git_annotated_commit **::git_repository *::const char *", + "return": { "type": "int", "comment": " 0 on success or error code" }, + "description": "

Creates a git_annotated_commit from a revision string.

\n", + "comments": "

See man gitrevisions, or http://git-scm.com/docs/git-rev-parse.html#_specifying_revisions for information on the syntax accepted.

\n", + "group": "annotated" + }, + "git_annotated_commit_id": { + "type": "function", + "file": "git2/annotated_commit.h", + "line": 110, + "lineto": 111, + "args": [ + { + "name": "commit", + "type": "const git_annotated_commit *", + "comment": "the given annotated commit" + } + ], + "argline": "const git_annotated_commit *commit", + "sig": "const git_annotated_commit *", + "return": { "type": "const git_oid *", "comment": " commit id" }, + "description": "

Gets the commit ID that the given git_annotated_commit refers to.

\n", + "comments": "", + "group": "annotated", + "examples": { + "checkout.c": ["ex/v1.9.1/checkout.html#git_annotated_commit_id-2"], + "merge.c": [ + "ex/v1.9.1/merge.html#git_annotated_commit_id-1", + "ex/v1.9.1/merge.html#git_annotated_commit_id-2", + "ex/v1.9.1/merge.html#git_annotated_commit_id-3" + ] + } + }, + "git_annotated_commit_ref": { + "type": "function", + "file": "git2/annotated_commit.h", + "line": 119, + "lineto": 120, + "args": [ + { + "name": "commit", + "type": "const git_annotated_commit *", + "comment": "the given annotated commit" + } + ], + "argline": "const git_annotated_commit *commit", + "sig": "const git_annotated_commit *", + "return": { "type": "const char *", "comment": " ref name." }, + "description": "

Get the refname that the given git_annotated_commit refers to.

\n", + "comments": "", + "group": "annotated", + "examples": { + "checkout.c": [ + "ex/v1.9.1/checkout.html#git_annotated_commit_ref-3", + "ex/v1.9.1/checkout.html#git_annotated_commit_ref-4", + "ex/v1.9.1/checkout.html#git_annotated_commit_ref-5" + ] + } + }, + "git_annotated_commit_free": { + "type": "function", + "file": "git2/annotated_commit.h", + "line": 127, + "lineto": 128, + "args": [ + { + "name": "commit", + "type": "git_annotated_commit *", + "comment": "annotated commit to free" + } + ], + "argline": "git_annotated_commit *commit", + "sig": "git_annotated_commit *", + "return": { "type": "void", "comment": null }, + "description": "

Frees a git_annotated_commit.

\n", + "comments": "", + "group": "annotated", + "examples": { + "checkout.c": ["ex/v1.9.1/checkout.html#git_annotated_commit_free-6"] + } + }, + "git_apply_options_init": { + "type": "function", + "file": "git2/apply.h", + "line": 127, + "lineto": 127, + "args": [ + { + "name": "opts", + "type": "git_apply_options *", + "comment": "The `git_apply_options` struct to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "The struct version; pass `GIT_APPLY_OPTIONS_VERSION`" + } + ], + "argline": "git_apply_options *opts, unsigned int version", + "sig": "git_apply_options *::unsigned int", + "return": { "type": "int", "comment": " 0 on success or -1 on failure." }, + "description": "

Initialize git_apply_options structure

\n", + "comments": "

Initialize a git_apply_options with default values. Equivalent to creating an instance with GIT_APPLY_OPTIONS_INIT.

\n", + "group": "apply" + }, + "git_apply_to_tree": { + "type": "function", + "file": "git2/apply.h", + "line": 140, + "lineto": 145, + "args": [ + { + "name": "out", + "type": "git_index **", + "comment": "the postimage of the application" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository to apply" + }, + { + "name": "preimage", + "type": "git_tree *", + "comment": "the tree to apply the diff to" + }, + { + "name": "diff", + "type": "git_diff *", + "comment": "the diff to apply" + }, + { + "name": "options", + "type": "const git_apply_options *", + "comment": "the options for the apply (or null for defaults)" + } + ], + "argline": "git_index **out, git_repository *repo, git_tree *preimage, git_diff *diff, const git_apply_options *options", + "sig": "git_index **::git_repository *::git_tree *::git_diff *::const git_apply_options *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Apply a git_diff to a git_tree, and return the resulting image\n as an index.

\n", + "comments": "", + "group": "apply" + }, + "git_apply": { + "type": "function", + "file": "git2/apply.h", + "line": 178, + "lineto": 182, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository to apply to" + }, + { + "name": "diff", + "type": "git_diff *", + "comment": "the diff to apply" + }, + { + "name": "location", + "type": "git_apply_location_t", + "comment": "the location to apply (workdir, index or both)" + }, + { + "name": "options", + "type": "const git_apply_options *", + "comment": "the options for the apply (or null for defaults)" + } + ], + "argline": "git_repository *repo, git_diff *diff, git_apply_location_t location, const git_apply_options *options", + "sig": "git_repository *::git_diff *::git_apply_location_t::const git_apply_options *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Apply a git_diff to the given repository, making changes directly\n in the working directory, the index, or both.

\n", + "comments": "", + "group": "apply" + }, + "git_attr_value": { + "type": "function", + "file": "git2/attr.h", + "line": 106, + "lineto": 106, + "args": [ + { "name": "attr", "type": "const char *", "comment": "The attribute" } + ], + "argline": "const char *attr", + "sig": "const char *", + "return": { + "type": "git_attr_value_t", + "comment": " the value type for the attribute" + }, + "description": "

Return the value type for a given attribute.

\n", + "comments": "

This can be either TRUE, FALSE, UNSPECIFIED (if the attribute was not set at all), or VALUE, if the attribute was set to an actual string.

\n\n

If the attribute has a VALUE string, it can be accessed normally as a NULL-terminated C string.

\n", + "group": "attr" + }, + "git_attr_get": { + "type": "function", + "file": "git2/attr.h", + "line": 195, + "lineto": 200, + "args": [ + { + "name": "value_out", + "type": "const char **", + "comment": "Output of the value of the attribute. Use the GIT_ATTR_...\n macros to test for TRUE, FALSE, UNSPECIFIED, etc. or just\n use the string value for attributes set to a value. You\n should NOT modify or free this value." + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "The repository containing the path." + }, + { + "name": "flags", + "type": "uint32_t", + "comment": "A combination of GIT_ATTR_CHECK... flags." + }, + { + "name": "path", + "type": "const char *", + "comment": "The path to check for attributes. Relative paths are\n interpreted relative to the repo root. The file does\n not have to exist, but if it does not, then it will be\n treated as a plain file (not a directory)." + }, + { + "name": "name", + "type": "const char *", + "comment": "The name of the attribute to look up." + } + ], + "argline": "const char **value_out, git_repository *repo, uint32_t flags, const char *path, const char *name", + "sig": "const char **::git_repository *::uint32_t::const char *::const char *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Look up the value of one git attribute for path.

\n", + "comments": "", + "group": "attr" + }, + "git_attr_get_ext": { + "type": "function", + "file": "git2/attr.h", + "line": 218, + "lineto": 223, + "args": [ + { + "name": "value_out", + "type": "const char **", + "comment": "Output of the value of the attribute. Use the GIT_ATTR_...\n macros to test for TRUE, FALSE, UNSPECIFIED, etc. or just\n use the string value for attributes set to a value. You\n should NOT modify or free this value." + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "The repository containing the path." + }, + { + "name": "opts", + "type": "git_attr_options *", + "comment": "The `git_attr_options` to use when querying these attributes." + }, + { + "name": "path", + "type": "const char *", + "comment": "The path to check for attributes. Relative paths are\n interpreted relative to the repo root. The file does\n not have to exist, but if it does not, then it will be\n treated as a plain file (not a directory)." + }, + { + "name": "name", + "type": "const char *", + "comment": "The name of the attribute to look up." + } + ], + "argline": "const char **value_out, git_repository *repo, git_attr_options *opts, const char *path, const char *name", + "sig": "const char **::git_repository *::git_attr_options *::const char *::const char *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Look up the value of one git attribute for path with extended options.

\n", + "comments": "", + "group": "attr" + }, + "git_attr_get_many": { + "type": "function", + "file": "git2/attr.h", + "line": 255, + "lineto": 261, + "args": [ + { + "name": "values_out", + "type": "const char **", + "comment": "An array of num_attr entries that will have string\n pointers written into it for the values of the attributes.\n You should not modify or free the values that are written\n into this array (although of course, you should free the\n array itself if you allocated it)." + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "The repository containing the path." + }, + { + "name": "flags", + "type": "uint32_t", + "comment": "A combination of GIT_ATTR_CHECK... flags." + }, + { + "name": "path", + "type": "const char *", + "comment": "The path inside the repo to check attributes. This\n does not have to exist, but if it does not, then\n it will be treated as a plain file (i.e. not a directory)." + }, + { + "name": "num_attr", + "type": "size_t", + "comment": "The number of attributes being looked up" + }, + { + "name": "names", + "type": "const char **", + "comment": "An array of num_attr strings containing attribute names." + } + ], + "argline": "const char **values_out, git_repository *repo, uint32_t flags, const char *path, size_t num_attr, const char **names", + "sig": "const char **::git_repository *::uint32_t::const char *::size_t::const char **", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Look up a list of git attributes for path.

\n", + "comments": "

Use this if you have a known list of attributes that you want to look up in a single call. This is somewhat more efficient than calling git_attr_get() multiple times.

\n\n

For example, you might write:

\n\n
 const char *attrs[] = { "crlf", "diff", "foo" };     const char **values[3];     git_attr_get_many(values, repo, 0, "my/fun/file.c", 3, attrs);\n
\n\n

Then you could loop through the 3 values to get the settings for the three attributes you asked about.

\n", + "group": "attr" + }, + "git_attr_get_many_ext": { + "type": "function", + "file": "git2/attr.h", + "line": 280, + "lineto": 286, + "args": [ + { + "name": "values_out", + "type": "const char **", + "comment": "An array of num_attr entries that will have string\n pointers written into it for the values of the attributes.\n You should not modify or free the values that are written\n into this array (although of course, you should free the\n array itself if you allocated it)." + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "The repository containing the path." + }, + { + "name": "opts", + "type": "git_attr_options *", + "comment": "The `git_attr_options` to use when querying these attributes." + }, + { + "name": "path", + "type": "const char *", + "comment": "The path inside the repo to check attributes. This\n does not have to exist, but if it does not, then\n it will be treated as a plain file (i.e. not a directory)." + }, + { + "name": "num_attr", + "type": "size_t", + "comment": "The number of attributes being looked up" + }, + { + "name": "names", + "type": "const char **", + "comment": "An array of num_attr strings containing attribute names." + } + ], + "argline": "const char **values_out, git_repository *repo, git_attr_options *opts, const char *path, size_t num_attr, const char **names", + "sig": "const char **::git_repository *::git_attr_options *::const char *::size_t::const char **", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Look up a list of git attributes for path with extended options.

\n", + "comments": "", + "group": "attr" + }, + "git_attr_foreach": { + "type": "function", + "file": "git2/attr.h", + "line": 319, + "lineto": 324, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "The repository containing the path." + }, + { + "name": "flags", + "type": "uint32_t", + "comment": "A combination of GIT_ATTR_CHECK... flags." + }, + { + "name": "path", + "type": "const char *", + "comment": "Path inside the repo to check attributes. This does not have\n to exist, but if it does not, then it will be treated as a\n plain file (i.e. not a directory)." + }, + { + "name": "callback", + "type": "git_attr_foreach_cb", + "comment": "Function to invoke on each attribute name and value.\n See git_attr_foreach_cb." + }, + { + "name": "payload", + "type": "void *", + "comment": "Passed on as extra parameter to callback function." + } + ], + "argline": "git_repository *repo, uint32_t flags, const char *path, git_attr_foreach_cb callback, void *payload", + "sig": "git_repository *::uint32_t::const char *::git_attr_foreach_cb::void *", + "return": { + "type": "int", + "comment": " 0 on success, non-zero callback return value, or error code" + }, + "description": "

Loop over all the git attributes for a path.

\n", + "comments": "", + "group": "attr" + }, + "git_attr_foreach_ext": { + "type": "function", + "file": "git2/attr.h", + "line": 339, + "lineto": 344, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "The repository containing the path." + }, + { + "name": "opts", + "type": "git_attr_options *", + "comment": "The `git_attr_options` to use when querying these attributes." + }, + { + "name": "path", + "type": "const char *", + "comment": "Path inside the repo to check attributes. This does not have\n to exist, but if it does not, then it will be treated as a\n plain file (i.e. not a directory)." + }, + { + "name": "callback", + "type": "git_attr_foreach_cb", + "comment": "Function to invoke on each attribute name and value.\n See git_attr_foreach_cb." + }, + { + "name": "payload", + "type": "void *", + "comment": "Passed on as extra parameter to callback function." + } + ], + "argline": "git_repository *repo, git_attr_options *opts, const char *path, git_attr_foreach_cb callback, void *payload", + "sig": "git_repository *::git_attr_options *::const char *::git_attr_foreach_cb::void *", + "return": { + "type": "int", + "comment": " 0 on success, non-zero callback return value, or error code" + }, + "description": "

Loop over all the git attributes for a path with extended options.

\n", + "comments": "", + "group": "attr" + }, + "git_attr_cache_flush": { + "type": "function", + "file": "git2/attr.h", + "line": 357, + "lineto": 358, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "The repository containing the gitattributes cache" + } + ], + "argline": "git_repository *repo", + "sig": "git_repository *", + "return": { "type": "int", "comment": " 0 on success, or an error code" }, + "description": "

Flush the gitattributes cache.

\n", + "comments": "

Call this if you have reason to believe that the attributes files on disk no longer match the cached contents of memory. This will cause the attributes files to be reloaded the next time that an attribute access function is called.

\n", + "group": "attr" + }, + "git_attr_add_macro": { + "type": "function", + "file": "git2/attr.h", + "line": 375, + "lineto": 378, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "The repository to add the macro in." + }, + { + "name": "name", + "type": "const char *", + "comment": "The name of the macro." + }, + { + "name": "values", + "type": "const char *", + "comment": "The value for the macro." + } + ], + "argline": "git_repository *repo, const char *name, const char *values", + "sig": "git_repository *::const char *::const char *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Add a macro definition.

\n", + "comments": "

Macros will automatically be loaded from the top level .gitattributes file of the repository (plus the built-in "binary" macro). This function allows you to add others. For example, to add the default macro, you would call:

\n\n
 git_attr_add_macro(repo, "binary", "-diff -crlf");\n
\n", + "group": "attr" + }, + "git_blame_options_init": { + "type": "function", + "file": "git2/blame.h", + "line": 146, + "lineto": 148, + "args": [ + { + "name": "opts", + "type": "git_blame_options *", + "comment": "The `git_blame_options` struct to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "The struct version; pass `GIT_BLAME_OPTIONS_VERSION`." + } + ], + "argline": "git_blame_options *opts, unsigned int version", + "sig": "git_blame_options *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initialize git_blame_options structure

\n", + "comments": "

Initializes a git_blame_options with default values. Equivalent to creating an instance with GIT_BLAME_OPTIONS_INIT.

\n", + "group": "blame" + }, + "git_blame_linecount": { + "type": "function", + "file": "git2/blame.h", + "line": 244, + "lineto": 244, + "args": [ + { + "name": "blame", + "type": "git_blame *", + "comment": "The blame structure to query." + } + ], + "argline": "git_blame *blame", + "sig": "git_blame *", + "return": { "type": "size_t", "comment": " The number of line." }, + "description": "

Gets the number of lines that exist in the blame structure.

\n", + "comments": "", + "group": "blame" + }, + "git_blame_hunkcount": { + "type": "function", + "file": "git2/blame.h", + "line": 252, + "lineto": 252, + "args": [ + { + "name": "blame", + "type": "git_blame *", + "comment": "The blame structure to query." + } + ], + "argline": "git_blame *blame", + "sig": "git_blame *", + "return": { "type": "size_t", "comment": " The number of hunks." }, + "description": "

Gets the number of hunks that exist in the blame structure.

\n", + "comments": "", + "group": "blame" + }, + "git_blame_hunk_byindex": { + "type": "function", + "file": "git2/blame.h", + "line": 261, + "lineto": 263, + "args": [ + { + "name": "blame", + "type": "git_blame *", + "comment": "the blame structure to query" + }, + { + "name": "index", + "type": "size_t", + "comment": "index of the hunk to retrieve" + } + ], + "argline": "git_blame *blame, size_t index", + "sig": "git_blame *::size_t", + "return": { + "type": "const git_blame_hunk *", + "comment": " the hunk at the given index, or NULL on error" + }, + "description": "

Gets the blame hunk at the given index.

\n", + "comments": "", + "group": "blame" + }, + "git_blame_hunk_byline": { + "type": "function", + "file": "git2/blame.h", + "line": 273, + "lineto": 275, + "args": [ + { + "name": "blame", + "type": "git_blame *", + "comment": "the blame structure to query" + }, + { + "name": "lineno", + "type": "size_t", + "comment": "the (1-based) line number to find a hunk for" + } + ], + "argline": "git_blame *blame, size_t lineno", + "sig": "git_blame *::size_t", + "return": { + "type": "const git_blame_hunk *", + "comment": " the hunk that contains the given line, or NULL on error" + }, + "description": "

Gets the hunk that relates to the given line number in the newest\n commit.

\n", + "comments": "", + "group": "blame", + "examples": { + "blame.c": ["ex/v1.9.1/blame.html#git_blame_hunk_byline-1"] + } + }, + "git_blame_line_byindex": { + "type": "function", + "file": "git2/blame.h", + "line": 284, + "lineto": 286, + "args": [ + { + "name": "blame", + "type": "git_blame *", + "comment": "the blame structure to query" + }, + { + "name": "idx", + "type": "size_t", + "comment": "the (1-based) line number" + } + ], + "argline": "git_blame *blame, size_t idx", + "sig": "git_blame *::size_t", + "return": { + "type": "const git_blame_line *", + "comment": " the blamed line, or NULL on error" + }, + "description": "

Gets the information about the line in the blame.

\n", + "comments": "", + "group": "blame" + }, + "git_blame_get_hunk_count": { + "type": "function", + "file": "git2/blame.h", + "line": 296, + "lineto": 296, + "args": [ + { + "name": "blame", + "type": "git_blame *", + "comment": "The blame structure to query." + } + ], + "argline": "git_blame *blame", + "sig": "git_blame *", + "return": { "type": "uint32_t", "comment": " The number of hunks." }, + "description": "

Gets the number of hunks that exist in the blame structure.

\n", + "comments": "", + "group": "blame" + }, + "git_blame_get_hunk_byindex": { + "type": "function", + "file": "git2/blame.h", + "line": 305, + "lineto": 307, + "args": [ + { + "name": "blame", + "type": "git_blame *", + "comment": "the blame structure to query" + }, + { + "name": "index", + "type": "uint32_t", + "comment": "index of the hunk to retrieve" + } + ], + "argline": "git_blame *blame, uint32_t index", + "sig": "git_blame *::uint32_t", + "return": { + "type": "const git_blame_hunk *", + "comment": " the hunk at the given index, or NULL on error" + }, + "description": "

Gets the blame hunk at the given index.

\n", + "comments": "", + "group": "blame" + }, + "git_blame_get_hunk_byline": { + "type": "function", + "file": "git2/blame.h", + "line": 316, + "lineto": 318, + "args": [ + { + "name": "blame", + "type": "git_blame *", + "comment": "the blame structure to query" + }, + { + "name": "lineno", + "type": "size_t", + "comment": "the (1-based) line number to find a hunk for" + } + ], + "argline": "git_blame *blame, size_t lineno", + "sig": "git_blame *::size_t", + "return": { + "type": "const git_blame_hunk *", + "comment": " the hunk that contains the given line, or NULL on error" + }, + "description": "

Gets the hunk that relates to the given line number in the newest commit.

\n", + "comments": "", + "group": "blame" + }, + "git_blame_buffer": { + "type": "function", + "file": "git2/blame.h", + "line": 374, + "lineto": 378, + "args": [ + { + "name": "out", + "type": "git_blame **", + "comment": "pointer that will receive the resulting blame data" + }, + { + "name": "base", + "type": "git_blame *", + "comment": "cached blame from the history of the file (usually the output\n from git_blame_file)" + }, + { + "name": "buffer", + "type": "const char *", + "comment": "the (possibly) modified contents of the file" + }, + { + "name": "buffer_len", + "type": "size_t", + "comment": "number of valid bytes in the buffer" + } + ], + "argline": "git_blame **out, git_blame *base, const char *buffer, size_t buffer_len", + "sig": "git_blame **::git_blame *::const char *::size_t", + "return": { + "type": "int", + "comment": " 0 on success, or an error code. (use git_error_last for information\n about the error)" + }, + "description": "

Get blame data for a file that has been modified in memory. The blame\n parameter is a pre-calculated blame for the in-odb history of the file.\n This means that once a file blame is completed (which can be expensive),\n updating the buffer blame is very fast.

\n", + "comments": "

Lines that differ between the buffer and the committed version are marked as having a zero OID for their final_commit_id.

\n", + "group": "blame" + }, + "git_blame_free": { + "type": "function", + "file": "git2/blame.h", + "line": 385, + "lineto": 385, + "args": [ + { + "name": "blame", + "type": "git_blame *", + "comment": "the blame structure to free" + } + ], + "argline": "git_blame *blame", + "sig": "git_blame *", + "return": { "type": "void", "comment": null }, + "description": "

Free memory allocated by git_blame_file or git_blame_buffer.

\n", + "comments": "", + "group": "blame", + "examples": { "blame.c": ["ex/v1.9.1/blame.html#git_blame_free-2"] } + }, + "git_blob_lookup": { + "type": "function", + "file": "git2/blob.h", + "line": 37, + "lineto": 40, + "args": [ + { + "name": "blob", + "type": "git_blob **", + "comment": "pointer to the looked up blob" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repo to use when locating the blob." + }, + { + "name": "id", + "type": "const git_oid *", + "comment": "identity of the blob to locate." + } + ], + "argline": "git_blob **blob, git_repository *repo, const git_oid *id", + "sig": "git_blob **::git_repository *::const git_oid *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Lookup a blob object from a repository.

\n", + "comments": "", + "group": "blob", + "examples": { + "blame.c": ["ex/v1.9.1/blame.html#git_blob_lookup-3"], + "general.c": ["ex/v1.9.1/general.html#git_blob_lookup-1"] + } + }, + "git_blob_lookup_prefix": { + "type": "function", + "file": "git2/blob.h", + "line": 54, + "lineto": 54, + "args": [ + { + "name": "blob", + "type": "git_blob **", + "comment": "pointer to the looked up blob" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repo to use when locating the blob." + }, + { + "name": "id", + "type": "const git_oid *", + "comment": "identity of the blob to locate." + }, + { + "name": "len", + "type": "size_t", + "comment": "the length of the short identifier" + } + ], + "argline": "git_blob **blob, git_repository *repo, const git_oid *id, size_t len", + "sig": "git_blob **::git_repository *::const git_oid *::size_t", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Lookup a blob object from a repository,\n given a prefix of its identifier (short id).

\n", + "comments": "", + "group": "blob" + }, + "git_blob_free": { + "type": "function", + "file": "git2/blob.h", + "line": 67, + "lineto": 67, + "args": [ + { "name": "blob", "type": "git_blob *", "comment": "the blob to close" } + ], + "argline": "git_blob *blob", + "sig": "git_blob *", + "return": { "type": "void", "comment": null }, + "description": "

Close an open blob

\n", + "comments": "

This is a wrapper around git_object_free()

\n\n

IMPORTANT: It is necessary to call this method when you stop using a blob. Failure to do so will cause a memory leak.

\n", + "group": "blob", + "examples": { + "blame.c": ["ex/v1.9.1/blame.html#git_blob_free-4"], + "general.c": ["ex/v1.9.1/general.html#git_blob_free-2"] + } + }, + "git_blob_id": { + "type": "function", + "file": "git2/blob.h", + "line": 75, + "lineto": 75, + "args": [ + { + "name": "blob", + "type": "const git_blob *", + "comment": "a previously loaded blob." + } + ], + "argline": "const git_blob *blob", + "sig": "const git_blob *", + "return": { + "type": "const git_oid *", + "comment": " SHA1 hash for this blob." + }, + "description": "

Get the id of a blob.

\n", + "comments": "", + "group": "blob" + }, + "git_blob_owner": { + "type": "function", + "file": "git2/blob.h", + "line": 83, + "lineto": 83, + "args": [ + { + "name": "blob", + "type": "const git_blob *", + "comment": "A previously loaded blob." + } + ], + "argline": "const git_blob *blob", + "sig": "const git_blob *", + "return": { + "type": "git_repository *", + "comment": " Repository that contains this blob." + }, + "description": "

Get the repository that contains the blob.

\n", + "comments": "", + "group": "blob" + }, + "git_blob_rawcontent": { + "type": "function", + "file": "git2/blob.h", + "line": 96, + "lineto": 96, + "args": [ + { + "name": "blob", + "type": "const git_blob *", + "comment": "pointer to the blob" + } + ], + "argline": "const git_blob *blob", + "sig": "const git_blob *", + "return": { + "type": "const void *", + "comment": " \n\n `unsigned char *` the pointer, or NULL on error" + }, + "description": "

Get a read-only buffer with the raw content of a blob.

\n", + "comments": "

A pointer to the raw content of a blob is returned; this pointer is owned internally by the object and shall not be free'd. The pointer may be invalidated at a later time.

\n", + "group": "blob", + "examples": { + "blame.c": ["ex/v1.9.1/blame.html#git_blob_rawcontent-5"], + "cat-file.c": ["ex/v1.9.1/cat-file.html#git_blob_rawcontent-1"], + "general.c": ["ex/v1.9.1/general.html#git_blob_rawcontent-3"] + } + }, + "git_blob_rawsize": { + "type": "function", + "file": "git2/blob.h", + "line": 104, + "lineto": 104, + "args": [ + { + "name": "blob", + "type": "const git_blob *", + "comment": "pointer to the blob" + } + ], + "argline": "const git_blob *blob", + "sig": "const git_blob *", + "return": { "type": "git_object_size_t", "comment": " size in bytes" }, + "description": "

Get the size in bytes of the contents of a blob

\n", + "comments": "", + "group": "blob", + "examples": { + "blame.c": ["ex/v1.9.1/blame.html#git_blob_rawsize-6"], + "cat-file.c": ["ex/v1.9.1/cat-file.html#git_blob_rawsize-2"], + "general.c": [ + "ex/v1.9.1/general.html#git_blob_rawsize-4", + "ex/v1.9.1/general.html#git_blob_rawsize-5" + ] + } + }, + "git_blob_filter_options_init": { + "type": "function", + "file": "git2/blob.h", + "line": 201, + "lineto": 203, + "args": [ + { + "name": "opts", + "type": "git_blob_filter_options *", + "comment": "The `git_blob_filter_options` struct to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "The struct version; pass GIT_BLOB_FILTER_OPTIONS_VERSION" + } + ], + "argline": "git_blob_filter_options *opts, unsigned int version", + "sig": "git_blob_filter_options *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initialize git_blob_filter_options structure

\n", + "comments": "

Initializes a git_blob_filter_options with default values. Equivalent to creating an instance with GIT_BLOB_FILTER_OPTIONS_INIT.

\n", + "group": "blob" + }, + "git_blob_filter": { + "type": "function", + "file": "git2/blob.h", + "line": 227, + "lineto": 231, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": "The git_buf to be filled in" + }, + { + "name": "blob", + "type": "git_blob *", + "comment": "Pointer to the blob" + }, + { + "name": "as_path", + "type": "const char *", + "comment": "Path used for file attribute lookups, etc." + }, + { + "name": "opts", + "type": "git_blob_filter_options *", + "comment": "Options to use for filtering the blob" + } + ], + "argline": "git_buf *out, git_blob *blob, const char *as_path, git_blob_filter_options *opts", + "sig": "git_buf *::git_blob *::const char *::git_blob_filter_options *", + "return": { + "type": "int", + "comment": " \n\n[enum] git_error_code 0 on success or an error code" + }, + "description": "

Get a buffer with the filtered content of a blob.

\n", + "comments": "

This applies filters as if the blob was being checked out to the working directory under the specified filename. This may apply CRLF filtering or other types of changes depending on the file attributes set for the blob and the content detected in it.

\n\n

The output is written into a git_buf which the caller must dispose when done (via git_buf_dispose).

\n\n

If no filters need to be applied, then the out buffer will just be populated with a pointer to the raw content of the blob. In that case, be careful to not free the blob until done with the buffer or copy it into memory you own.

\n", + "group": "blob" + }, + "git_blob_create_from_workdir": { + "type": "function", + "file": "git2/blob.h", + "line": 244, + "lineto": 244, + "args": [ + { + "name": "id", + "type": "git_oid *", + "comment": "return the id of the written blob" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "repository where the blob will be written.\n\tthis repository cannot be bare" + }, + { + "name": "relative_path", + "type": "const char *", + "comment": "file from which the blob will be created,\n\trelative to the repository's working dir" + } + ], + "argline": "git_oid *id, git_repository *repo, const char *relative_path", + "sig": "git_oid *::git_repository *::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Read a file from the working folder of a repository and write it\n to the object database.

\n", + "comments": "", + "group": "blob" + }, + "git_blob_create_from_disk": { + "type": "function", + "file": "git2/blob.h", + "line": 257, + "lineto": 260, + "args": [ + { + "name": "id", + "type": "git_oid *", + "comment": "return the id of the written blob" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "repository where the blob will be written.\n\tthis repository can be bare or not" + }, + { + "name": "path", + "type": "const char *", + "comment": "file from which the blob will be created" + } + ], + "argline": "git_oid *id, git_repository *repo, const char *path", + "sig": "git_oid *::git_repository *::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Read a file from the filesystem (not necessarily inside the\n working folder of the repository) and write it to the object\n database.

\n", + "comments": "", + "group": "blob" + }, + "git_blob_create_from_stream": { + "type": "function", + "file": "git2/blob.h", + "line": 287, + "lineto": 290, + "args": [ + { + "name": "out", + "type": "git_writestream **", + "comment": "the stream into which to write" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository where the blob will be written.\n This repository can be bare or not." + }, + { + "name": "hintpath", + "type": "const char *", + "comment": "If not NULL, will be used to select data filters\n to apply onto the content of the blob to be created." + } + ], + "argline": "git_writestream **out, git_repository *repo, const char *hintpath", + "sig": "git_writestream **::git_repository *::const char *", + "return": { "type": "int", "comment": " 0 or error code" }, + "description": "

Create a stream to write a new blob into the object database.

\n", + "comments": "

This function may need to buffer the data on disk and will in general not be the right choice if you know the size of the data to write. If you have data in memory, use git_blob_create_from_buffer(). If you do not, but know the size of the contents (and don't want/need to perform filtering), use git_odb_open_wstream().

\n\n

Don't close this stream yourself but pass it to git_blob_create_from_stream_commit() to commit the write to the object db and get the object id.

\n\n

If the hintpath parameter is filled, it will be used to determine what git filters should be applied to the object before it is written to the object database.

\n", + "group": "blob" + }, + "git_blob_create_from_stream_commit": { + "type": "function", + "file": "git2/blob.h", + "line": 301, + "lineto": 303, + "args": [ + { + "name": "out", + "type": "git_oid *", + "comment": "the id of the new blob" + }, + { + "name": "stream", + "type": "git_writestream *", + "comment": "the stream to close" + } + ], + "argline": "git_oid *out, git_writestream *stream", + "sig": "git_oid *::git_writestream *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Close the stream and finalize writing the blob to the object database.

\n", + "comments": "

The stream will be closed and freed.

\n", + "group": "blob" + }, + "git_blob_create_from_buffer": { + "type": "function", + "file": "git2/blob.h", + "line": 314, + "lineto": 315, + "args": [ + { + "name": "id", + "type": "git_oid *", + "comment": "return the id of the written blob" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "repository where the blob will be written" + }, + { + "name": "buffer", + "type": "const void *", + "comment": "data to be written into the blob" + }, + { "name": "len", "type": "size_t", "comment": "length of the data" } + ], + "argline": "git_oid *id, git_repository *repo, const void *buffer, size_t len", + "sig": "git_oid *::git_repository *::const void *::size_t", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Write an in-memory buffer to the object database as a blob.

\n", + "comments": "", + "group": "blob" + }, + "git_blob_is_binary": { + "type": "function", + "file": "git2/blob.h", + "line": 328, + "lineto": 328, + "args": [ + { + "name": "blob", + "type": "const git_blob *", + "comment": "The blob which content should be analyzed" + } + ], + "argline": "const git_blob *blob", + "sig": "const git_blob *", + "return": { + "type": "int", + "comment": " \n\n bool 1 if the content of the blob is detected\n as binary; 0 otherwise." + }, + "description": "

Determine if the blob content is most likely binary or not.

\n", + "comments": "

The heuristic used to guess if a file is binary is taken from core git: Searching for NUL bytes and looking for a reasonable ratio of printable to non-printable characters among the first 8000 bytes.

\n", + "group": "blob" + }, + "git_blob_data_is_binary": { + "type": "function", + "file": "git2/blob.h", + "line": 340, + "lineto": 340, + "args": [ + { + "name": "data", + "type": "const char *", + "comment": "The blob data which content should be analyzed" + }, + { "name": "len", "type": "size_t", "comment": "The length of the data" } + ], + "argline": "const char *data, size_t len", + "sig": "const char *::size_t", + "return": { + "type": "int", + "comment": " 1 if the content of the blob is detected\n as binary; 0 otherwise." + }, + "description": "

Determine if the given content is most certainly binary or not;\n this is the same mechanism used by git_blob_is_binary but only\n looking at raw data.

\n", + "comments": "", + "group": "blob" + }, + "git_blob_dup": { + "type": "function", + "file": "git2/blob.h", + "line": 350, + "lineto": 350, + "args": [ + { + "name": "out", + "type": "git_blob **", + "comment": "Pointer to store the copy of the object" + }, + { + "name": "source", + "type": "git_blob *", + "comment": "Original object to copy" + } + ], + "argline": "git_blob **out, git_blob *source", + "sig": "git_blob **::git_blob *", + "return": { "type": "int", "comment": " 0." }, + "description": "

Create an in-memory copy of a blob. The copy must be explicitly\n free'd or it will leak.

\n", + "comments": "", + "group": "blob" + }, + "git_branch_create": { + "type": "function", + "file": "git2/branch.h", + "line": 53, + "lineto": 58, + "args": [ + { + "name": "out", + "type": "git_reference **", + "comment": "Pointer where to store the underlying reference." + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository to create the branch in." + }, + { + "name": "branch_name", + "type": "const char *", + "comment": "Name for the branch; this name is\n validated for consistency. It should also not conflict with\n an already existing branch name." + }, + { + "name": "target", + "type": "const git_commit *", + "comment": "Commit to which this branch should point. This object\n must belong to the given `repo`." + }, + { + "name": "force", + "type": "int", + "comment": "Overwrite existing branch." + } + ], + "argline": "git_reference **out, git_repository *repo, const char *branch_name, const git_commit *target, int force", + "sig": "git_reference **::git_repository *::const char *::const git_commit *::int", + "return": { + "type": "int", + "comment": " 0, GIT_EINVALIDSPEC or an error code.\n A proper reference is written in the refs/heads namespace\n pointing to the provided target commit." + }, + "description": "

Create a new branch pointing at a target commit

\n", + "comments": "

A new direct reference will be created pointing to this target commit. If force is true and a reference already exists with the given name, it'll be replaced.

\n\n

The returned reference must be freed by the user.

\n\n

The branch name will be checked for validity. See git_tag_create() for rules about valid names.

\n", + "group": "branch" + }, + "git_branch_create_from_annotated": { + "type": "function", + "file": "git2/branch.h", + "line": 77, + "lineto": 82, + "args": [ + { + "name": "ref_out", + "type": "git_reference **", + "comment": "Pointer where to store the underlying reference." + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository to create the branch in." + }, + { + "name": "branch_name", + "type": "const char *", + "comment": "Name for the branch; this name is\n validated for consistency. It should also not conflict with\n an already existing branch name." + }, + { + "name": "target", + "type": "const git_annotated_commit *", + "comment": "Annotated commit to which this branch should point. This\n object must belong to the given `repo`." + }, + { + "name": "force", + "type": "int", + "comment": "Overwrite existing branch." + } + ], + "argline": "git_reference **ref_out, git_repository *repo, const char *branch_name, const git_annotated_commit *target, int force", + "sig": "git_reference **::git_repository *::const char *::const git_annotated_commit *::int", + "return": { + "type": "int", + "comment": " 0, GIT_EINVALIDSPEC or an error code." + }, + "description": "

Create a new branch pointing at a target commit

\n", + "comments": "

This behaves like git_branch_create() but takes an annotated commit, which lets you specify which extended sha syntax string was specified by a user, allowing for more exact reflog messages.

\n", + "group": "branch", + "examples": { + "checkout.c": [ + "ex/v1.9.1/checkout.html#git_branch_create_from_annotated-7" + ] + } + }, + "git_branch_delete": { + "type": "function", + "file": "git2/branch.h", + "line": 94, + "lineto": 94, + "args": [ + { + "name": "branch", + "type": "git_reference *", + "comment": "A valid reference representing a branch" + } + ], + "argline": "git_reference *branch", + "sig": "git_reference *", + "return": { + "type": "int", + "comment": " 0 on success, or an error code." + }, + "description": "

Delete an existing branch reference.

\n", + "comments": "

Note that if the deletion succeeds, the reference object will not be valid anymore, and should be freed immediately by the user using git_reference_free().

\n", + "group": "branch" + }, + "git_branch_iterator_new": { + "type": "function", + "file": "git2/branch.h", + "line": 110, + "lineto": 113, + "args": [ + { + "name": "out", + "type": "git_branch_iterator **", + "comment": "the iterator" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository where to find the branches." + }, + { + "name": "list_flags", + "type": "git_branch_t", + "comment": "Filtering flags for the branch\n listing. Valid values are GIT_BRANCH_LOCAL, GIT_BRANCH_REMOTE\n or GIT_BRANCH_ALL." + } + ], + "argline": "git_branch_iterator **out, git_repository *repo, git_branch_t list_flags", + "sig": "git_branch_iterator **::git_repository *::git_branch_t", + "return": { "type": "int", "comment": " 0 on success or an error code" }, + "description": "

Create an iterator which loops over the requested branches.

\n", + "comments": "", + "group": "branch" + }, + "git_branch_next": { + "type": "function", + "file": "git2/branch.h", + "line": 123, + "lineto": 123, + "args": [ + { + "name": "out", + "type": "git_reference **", + "comment": "the reference" + }, + { + "name": "out_type", + "type": "git_branch_t *", + "comment": "the type of branch (local or remote-tracking)" + }, + { + "name": "iter", + "type": "git_branch_iterator *", + "comment": "the branch iterator" + } + ], + "argline": "git_reference **out, git_branch_t *out_type, git_branch_iterator *iter", + "sig": "git_reference **::git_branch_t *::git_branch_iterator *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_ITEROVER if there are no more branches or an error code." + }, + "description": "

Retrieve the next branch from the iterator

\n", + "comments": "", + "group": "branch" + }, + "git_branch_iterator_free": { + "type": "function", + "file": "git2/branch.h", + "line": 130, + "lineto": 130, + "args": [ + { + "name": "iter", + "type": "git_branch_iterator *", + "comment": "the iterator to free" + } + ], + "argline": "git_branch_iterator *iter", + "sig": "git_branch_iterator *", + "return": { "type": "void", "comment": null }, + "description": "

Free a branch iterator

\n", + "comments": "", + "group": "branch" + }, + "git_branch_move": { + "type": "function", + "file": "git2/branch.h", + "line": 153, + "lineto": 157, + "args": [ + { + "name": "out", + "type": "git_reference **", + "comment": "New reference object for the updated name." + }, + { + "name": "branch", + "type": "git_reference *", + "comment": "Current underlying reference of the branch." + }, + { + "name": "new_branch_name", + "type": "const char *", + "comment": "Target name of the branch once the move\n is performed; this name is validated for consistency." + }, + { + "name": "force", + "type": "int", + "comment": "Overwrite existing branch." + } + ], + "argline": "git_reference **out, git_reference *branch, const char *new_branch_name, int force", + "sig": "git_reference **::git_reference *::const char *::int", + "return": { + "type": "int", + "comment": " 0 on success, GIT_EINVALIDSPEC or an error code." + }, + "description": "

Move/rename an existing local branch reference.

\n", + "comments": "

The new branch name will be checked for validity. See git_tag_create() for rules about valid names.

\n\n

Note that if the move succeeds, the old reference object will not be valid anymore, and should be freed immediately by the user using git_reference_free().

\n", + "group": "branch" + }, + "git_branch_lookup": { + "type": "function", + "file": "git2/branch.h", + "line": 177, + "lineto": 181, + "args": [ + { + "name": "out", + "type": "git_reference **", + "comment": "pointer to the looked-up branch reference" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository to look up the branch" + }, + { + "name": "branch_name", + "type": "const char *", + "comment": "Name of the branch to be looked-up;\n this name is validated for consistency." + }, + { + "name": "branch_type", + "type": "git_branch_t", + "comment": "Type of the considered branch. This should\n be valued with either GIT_BRANCH_LOCAL or GIT_BRANCH_REMOTE." + } + ], + "argline": "git_reference **out, git_repository *repo, const char *branch_name, git_branch_t branch_type", + "sig": "git_reference **::git_repository *::const char *::git_branch_t", + "return": { + "type": "int", + "comment": " 0 on success; GIT_ENOTFOUND when no matching branch\n exists, GIT_EINVALIDSPEC, otherwise an error code." + }, + "description": "

Lookup a branch by its name in a repository.

\n", + "comments": "

The generated reference must be freed by the user. The branch name will be checked for validity.

\n", + "group": "branch" + }, + "git_branch_name": { + "type": "function", + "file": "git2/branch.h", + "line": 198, + "lineto": 200, + "args": [ + { + "name": "out", + "type": "const char **", + "comment": "Pointer to the abbreviated reference name.\n Owned by ref, do not free." + }, + { + "name": "ref", + "type": "const git_reference *", + "comment": "A reference object, ideally pointing to a branch" + } + ], + "argline": "const char **out, const git_reference *ref", + "sig": "const char **::const git_reference *", + "return": { + "type": "int", + "comment": " 0 on success; GIT_EINVALID if the reference isn't either a local or\n remote branch, otherwise an error code." + }, + "description": "

Get the branch name

\n", + "comments": "

Given a reference object, this will check that it really is a branch (ie. it lives under "refs/heads/" or "refs/remotes/"), and return the branch part of it.

\n", + "group": "branch", + "examples": { "merge.c": ["ex/v1.9.1/merge.html#git_branch_name-4"] } + }, + "git_branch_upstream": { + "type": "function", + "file": "git2/branch.h", + "line": 216, + "lineto": 218, + "args": [ + { + "name": "out", + "type": "git_reference **", + "comment": "Pointer where to store the retrieved reference." + }, + { + "name": "branch", + "type": "const git_reference *", + "comment": "Current underlying reference of the branch." + } + ], + "argline": "git_reference **out, const git_reference *branch", + "sig": "git_reference **::const git_reference *", + "return": { + "type": "int", + "comment": " 0 on success; GIT_ENOTFOUND when no remote tracking\n reference exists, otherwise an error code." + }, + "description": "

Get the upstream of a branch

\n", + "comments": "

Given a reference, this will return a new reference object corresponding to its remote tracking branch. The reference must be a local branch.

\n", + "group": "branch" + }, + "git_branch_set_upstream": { + "type": "function", + "file": "git2/branch.h", + "line": 235, + "lineto": 237, + "args": [ + { + "name": "branch", + "type": "git_reference *", + "comment": "the branch to configure" + }, + { + "name": "branch_name", + "type": "const char *", + "comment": "remote-tracking or local branch to set as upstream." + } + ], + "argline": "git_reference *branch, const char *branch_name", + "sig": "git_reference *::const char *", + "return": { + "type": "int", + "comment": " \n\n git_error_t 0 on success; GIT_ENOTFOUND if there's no branch named `branch_name`\n or an error code" + }, + "description": "

Set a branch's upstream branch

\n", + "comments": "

This will update the configuration to set the branch named branch_name as the upstream of branch. Pass a NULL name to unset the upstream information.

\n", + "group": "branch" + }, + "git_branch_upstream_name": { + "type": "function", + "file": "git2/branch.h", + "line": 253, + "lineto": 256, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": "the buffer into which the name will be written." + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository where the branches live." + }, + { + "name": "refname", + "type": "const char *", + "comment": "reference name of the local branch." + } + ], + "argline": "git_buf *out, git_repository *repo, const char *refname", + "sig": "git_buf *::git_repository *::const char *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_ENOTFOUND when no remote tracking reference exists,\n or an error code." + }, + "description": "

Get the upstream name of a branch

\n", + "comments": "

Given a local branch, this will return its remote-tracking branch information, as a full reference name, ie. "feature/nice" would become "refs/remote/origin/feature/nice", depending on that branch's configuration.

\n", + "group": "branch" + }, + "git_branch_is_head": { + "type": "function", + "file": "git2/branch.h", + "line": 266, + "lineto": 267, + "args": [ + { + "name": "branch", + "type": "const git_reference *", + "comment": "A reference to a local branch." + } + ], + "argline": "const git_reference *branch", + "sig": "const git_reference *", + "return": { + "type": "int", + "comment": " 1 if HEAD points at the branch, 0 if it isn't, or a negative value\n \t\t as an error code." + }, + "description": "

Determine if HEAD points to the given branch

\n", + "comments": "", + "group": "branch" + }, + "git_branch_is_checked_out": { + "type": "function", + "file": "git2/branch.h", + "line": 279, + "lineto": 280, + "args": [ + { + "name": "branch", + "type": "const git_reference *", + "comment": "A reference to a local branch." + } + ], + "argline": "const git_reference *branch", + "sig": "const git_reference *", + "return": { + "type": "int", + "comment": " 1 if branch is checked out, 0 if it isn't, an error code otherwise." + }, + "description": "

Determine if any HEAD points to the current branch

\n", + "comments": "

This will iterate over all known linked repositories (usually in the form of worktrees) and report whether any HEAD is pointing at the current branch.

\n", + "group": "branch" + }, + "git_branch_remote_name": { + "type": "function", + "file": "git2/branch.h", + "line": 298, + "lineto": 301, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": "The buffer into which the name will be written." + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "The repository where the branch lives." + }, + { + "name": "refname", + "type": "const char *", + "comment": "complete name of the remote tracking branch." + } + ], + "argline": "git_buf *out, git_repository *repo, const char *refname", + "sig": "git_buf *::git_repository *::const char *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_ENOTFOUND when no matching remote was found,\n GIT_EAMBIGUOUS when the branch maps to several remotes,\n otherwise an error code." + }, + "description": "

Find the remote name of a remote-tracking branch

\n", + "comments": "

This will return the name of the remote whose fetch refspec is matching the given branch. E.g. given a branch "refs/remotes/test/master", it will extract the "test" part. If refspecs from multiple remotes match, the function will return GIT_EAMBIGUOUS.

\n", + "group": "branch" + }, + "git_branch_upstream_remote": { + "type": "function", + "file": "git2/branch.h", + "line": 314, + "lineto": 314, + "args": [ + { + "name": "buf", + "type": "git_buf *", + "comment": "the buffer into which to write the name" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository in which to look" + }, + { + "name": "refname", + "type": "const char *", + "comment": "the full name of the branch" + } + ], + "argline": "git_buf *buf, git_repository *repo, const char *refname", + "sig": "git_buf *::git_repository *::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Retrieve the upstream remote of a local branch

\n", + "comments": "

This will return the currently configured "branch.*.remote" for a given branch. This branch must be local.

\n", + "group": "branch" + }, + "git_branch_upstream_merge": { + "type": "function", + "file": "git2/branch.h", + "line": 327, + "lineto": 327, + "args": [ + { + "name": "buf", + "type": "git_buf *", + "comment": "the buffer into which to write the name" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository in which to look" + }, + { + "name": "refname", + "type": "const char *", + "comment": "the full name of the branch" + } + ], + "argline": "git_buf *buf, git_repository *repo, const char *refname", + "sig": "git_buf *::git_repository *::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Retrieve the upstream merge of a local branch

\n", + "comments": "

This will return the currently configured "branch.*.merge" for a given branch. This branch must be local.

\n", + "group": "branch" + }, + "git_branch_name_is_valid": { + "type": "function", + "file": "git2/branch.h", + "line": 339, + "lineto": 339, + "args": [ + { + "name": "valid", + "type": "int *", + "comment": "output pointer to set with validity of given branch name" + }, + { + "name": "name", + "type": "const char *", + "comment": "a branch name to test" + } + ], + "argline": "int *valid, const char *name", + "sig": "int *::const char *", + "return": { "type": "int", "comment": " 0 on success or an error code" }, + "description": "

Determine whether a branch name is valid, meaning that (when prefixed\n with refs/heads/) that it is a valid reference name, and that any\n additional branch name restrictions are imposed (eg, it cannot start\n with a -).

\n", + "comments": "", + "group": "branch" + }, + "git_buf_dispose": { + "type": "function", + "file": "git2/buffer.h", + "line": 71, + "lineto": 71, + "args": [ + { + "name": "buffer", + "type": "git_buf *", + "comment": "The buffer to deallocate" + } + ], + "argline": "git_buf *buffer", + "sig": "git_buf *", + "return": { "type": "void", "comment": null }, + "description": "

Free the memory referred to by the git_buf.

\n", + "comments": "

Note that this does not free the git_buf itself, just the memory pointed to by buffer->ptr.

\n", + "group": "buf", + "examples": { + "diff.c": [ + "ex/v1.9.1/diff.html#git_buf_dispose-1", + "ex/v1.9.1/diff.html#git_buf_dispose-2" + ], + "tag.c": ["ex/v1.9.1/tag.html#git_buf_dispose-1"] + } + }, + "git_checkout_options_init": { + "type": "function", + "file": "git2/checkout.h", + "line": 410, + "lineto": 412, + "args": [ + { + "name": "opts", + "type": "git_checkout_options *", + "comment": "The `git_checkout_options` struct to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "The struct version; pass `GIT_CHECKOUT_OPTIONS_VERSION`." + } + ], + "argline": "git_checkout_options *opts, unsigned int version", + "sig": "git_checkout_options *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initialize git_checkout_options structure

\n", + "comments": "

Initializes a git_checkout_options with default values. Equivalent to creating an instance with GIT_CHECKOUT_OPTIONS_INIT.

\n", + "group": "checkout" + }, + "git_checkout_head": { + "type": "function", + "file": "git2/checkout.h", + "line": 431, + "lineto": 433, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "repository to check out (must be non-bare)" + }, + { + "name": "opts", + "type": "const git_checkout_options *", + "comment": "specifies checkout options (may be NULL)" + } + ], + "argline": "git_repository *repo, const git_checkout_options *opts", + "sig": "git_repository *::const git_checkout_options *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_EUNBORNBRANCH if HEAD points to a non\n existing branch, non-zero value returned by `notify_cb`, or\n other error code \n<\n 0 (use git_error_last for error details)" + }, + "description": "

Updates files in the index and the working tree to match the content of\n the commit pointed at by HEAD.

\n", + "comments": "

Note that this is not the correct mechanism used to switch branches; do not change your HEAD and then call this method, that would leave you with checkout conflicts since your working directory would then appear to be dirty. Instead, checkout the target of the branch and then update HEAD using git_repository_set_head to point to the branch you checked out.

\n", + "group": "checkout" + }, + "git_checkout_index": { + "type": "function", + "file": "git2/checkout.h", + "line": 444, + "lineto": 447, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "repository into which to check out (must be non-bare)" + }, + { + "name": "index", + "type": "git_index *", + "comment": "index to be checked out (or NULL to use repository index)" + }, + { + "name": "opts", + "type": "const git_checkout_options *", + "comment": "specifies checkout options (may be NULL)" + } + ], + "argline": "git_repository *repo, git_index *index, const git_checkout_options *opts", + "sig": "git_repository *::git_index *::const git_checkout_options *", + "return": { + "type": "int", + "comment": " 0 on success, non-zero return value from `notify_cb`, or error\n code \n<\n 0 (use git_error_last for error details)" + }, + "description": "

Updates files in the working tree to match the content of the index.

\n", + "comments": "", + "group": "checkout" + }, + "git_checkout_tree": { + "type": "function", + "file": "git2/checkout.h", + "line": 460, + "lineto": 463, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "repository to check out (must be non-bare)" + }, + { + "name": "treeish", + "type": "const git_object *", + "comment": "a commit, tag or tree which content will be used to update\n the working directory (or NULL to use HEAD)" + }, + { + "name": "opts", + "type": "const git_checkout_options *", + "comment": "specifies checkout options (may be NULL)" + } + ], + "argline": "git_repository *repo, const git_object *treeish, const git_checkout_options *opts", + "sig": "git_repository *::const git_object *::const git_checkout_options *", + "return": { + "type": "int", + "comment": " 0 on success, non-zero return value from `notify_cb`, or error\n code \n<\n 0 (use git_error_last for error details)" + }, + "description": "

Updates files in the index and working tree to match the content of the\n tree pointed at by the treeish.

\n", + "comments": "", + "group": "checkout", + "examples": { + "checkout.c": ["ex/v1.9.1/checkout.html#git_checkout_tree-8"], + "merge.c": ["ex/v1.9.1/merge.html#git_checkout_tree-5"] + } + }, + "git_cherrypick_options_init": { + "type": "function", + "file": "git2/cherrypick.h", + "line": 57, + "lineto": 59, + "args": [ + { + "name": "opts", + "type": "git_cherrypick_options *", + "comment": "The `git_cherrypick_options` struct to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "The struct version; pass `GIT_CHERRYPICK_OPTIONS_VERSION`." + } + ], + "argline": "git_cherrypick_options *opts, unsigned int version", + "sig": "git_cherrypick_options *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initialize git_cherrypick_options structure

\n", + "comments": "

Initializes a git_cherrypick_options with default values. Equivalent to creating an instance with GIT_CHERRYPICK_OPTIONS_INIT.

\n", + "group": "cherrypick" + }, + "git_cherrypick_commit": { + "type": "function", + "file": "git2/cherrypick.h", + "line": 75, + "lineto": 81, + "args": [ + { + "name": "out", + "type": "git_index **", + "comment": "pointer to store the index result in" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository that contains the given commits" + }, + { + "name": "cherrypick_commit", + "type": "git_commit *", + "comment": "the commit to cherry-pick" + }, + { + "name": "our_commit", + "type": "git_commit *", + "comment": "the commit to cherry-pick against (eg, HEAD)" + }, + { + "name": "mainline", + "type": "unsigned int", + "comment": "the parent of the `cherrypick_commit`, if it is a merge" + }, + { + "name": "merge_options", + "type": "const git_merge_options *", + "comment": "the merge options (or null for defaults)" + } + ], + "argline": "git_index **out, git_repository *repo, git_commit *cherrypick_commit, git_commit *our_commit, unsigned int mainline, const git_merge_options *merge_options", + "sig": "git_index **::git_repository *::git_commit *::git_commit *::unsigned int::const git_merge_options *", + "return": { + "type": "int", + "comment": " zero on success, -1 on failure." + }, + "description": "

Cherry-picks the given commit against the given "our" commit, producing an\n index that reflects the result of the cherry-pick.

\n", + "comments": "

The returned index must be freed explicitly with git_index_free.

\n", + "group": "cherrypick" + }, + "git_cherrypick": { + "type": "function", + "file": "git2/cherrypick.h", + "line": 91, + "lineto": 94, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository to cherry-pick" + }, + { + "name": "commit", + "type": "git_commit *", + "comment": "the commit to cherry-pick" + }, + { + "name": "cherrypick_options", + "type": "const git_cherrypick_options *", + "comment": "the cherry-pick options (or null for defaults)" + } + ], + "argline": "git_repository *repo, git_commit *commit, const git_cherrypick_options *cherrypick_options", + "sig": "git_repository *::git_commit *::const git_cherrypick_options *", + "return": { + "type": "int", + "comment": " zero on success, -1 on failure." + }, + "description": "

Cherry-pick the given commit, producing changes in the index and working directory.

\n", + "comments": "", + "group": "cherrypick" + }, + "git_clone_options_init": { + "type": "function", + "file": "git2/clone.h", + "line": 192, + "lineto": 194, + "args": [ + { + "name": "opts", + "type": "git_clone_options *", + "comment": "The `git_clone_options` struct to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "The struct version; pass `GIT_CLONE_OPTIONS_VERSION`." + } + ], + "argline": "git_clone_options *opts, unsigned int version", + "sig": "git_clone_options *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initialize git_clone_options structure

\n", + "comments": "

Initializes a git_clone_options with default values. Equivalent to creating an instance with GIT_CLONE_OPTIONS_INIT.

\n", + "group": "clone" + }, + "git_clone": { + "type": "function", + "file": "git2/clone.h", + "line": 216, + "lineto": 220, + "args": [ + { + "name": "out", + "type": "git_repository **", + "comment": "pointer that will receive the resulting repository object" + }, + { + "name": "url", + "type": "const char *", + "comment": "the remote repository to clone" + }, + { + "name": "local_path", + "type": "const char *", + "comment": "local directory to clone to" + }, + { + "name": "options", + "type": "const git_clone_options *", + "comment": "configuration options for the clone. If NULL, the\n function works as though GIT_OPTIONS_INIT were passed." + } + ], + "argline": "git_repository **out, const char *url, const char *local_path, const git_clone_options *options", + "sig": "git_repository **::const char *::const char *::const git_clone_options *", + "return": { + "type": "int", + "comment": " 0 on success, any non-zero return value from a callback\n function, or a negative value to indicate an error (use\n `git_error_last` for a detailed error message)" + }, + "description": "

Clone a remote repository.

\n", + "comments": "

By default this creates its repository and initial remote to match git's defaults. You can use the options in the callback to customize how these are created.

\n\n

Note that the libgit2 library must be initialized using git_libgit2_init before any APIs can be called, including this one.

\n", + "group": "clone" + }, + "git_commit_lookup": { + "type": "function", + "file": "git2/commit.h", + "line": 40, + "lineto": 41, + "args": [ + { + "name": "commit", + "type": "git_commit **", + "comment": "pointer to the looked up commit" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repo to use when locating the commit." + }, + { + "name": "id", + "type": "const git_oid *", + "comment": "identity of the commit to locate. If the object is\n\t\tan annotated tag it will be peeled back to the commit." + } + ], + "argline": "git_commit **commit, git_repository *repo, const git_oid *id", + "sig": "git_commit **::git_repository *::const git_oid *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Lookup a commit object from a repository.

\n", + "comments": "

The returned object should be released with git_commit_free when no longer needed.

\n", + "group": "commit", + "examples": { + "checkout.c": ["ex/v1.9.1/checkout.html#git_commit_lookup-9"], + "general.c": [ + "ex/v1.9.1/general.html#git_commit_lookup-6", + "ex/v1.9.1/general.html#git_commit_lookup-7", + "ex/v1.9.1/general.html#git_commit_lookup-8" + ], + "log.c": ["ex/v1.9.1/log.html#git_commit_lookup-1"], + "merge.c": ["ex/v1.9.1/merge.html#git_commit_lookup-6"] + } + }, + "git_commit_lookup_prefix": { + "type": "function", + "file": "git2/commit.h", + "line": 59, + "lineto": 60, + "args": [ + { + "name": "commit", + "type": "git_commit **", + "comment": "pointer to the looked up commit" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repo to use when locating the commit." + }, + { + "name": "id", + "type": "const git_oid *", + "comment": "identity of the commit to locate. If the object is\n\t\tan annotated tag it will be peeled back to the commit." + }, + { + "name": "len", + "type": "size_t", + "comment": "the length of the short identifier" + } + ], + "argline": "git_commit **commit, git_repository *repo, const git_oid *id, size_t len", + "sig": "git_commit **::git_repository *::const git_oid *::size_t", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Lookup a commit object from a repository, given a prefix of its\n identifier (short id).

\n", + "comments": "

The returned object should be released with git_commit_free when no longer needed.

\n", + "group": "commit" + }, + "git_commit_free": { + "type": "function", + "file": "git2/commit.h", + "line": 74, + "lineto": 74, + "args": [ + { + "name": "commit", + "type": "git_commit *", + "comment": "the commit to close" + } + ], + "argline": "git_commit *commit", + "sig": "git_commit *", + "return": { "type": "void", "comment": null }, + "description": "

Close an open commit

\n", + "comments": "

This is a wrapper around git_object_free()

\n\n

IMPORTANT: It is necessary to call this method when you stop using a commit. Failure to do so will cause a memory leak.

\n", + "group": "commit", + "examples": { + "checkout.c": ["ex/v1.9.1/checkout.html#git_commit_free-10"], + "general.c": [ + "ex/v1.9.1/general.html#git_commit_free-9", + "ex/v1.9.1/general.html#git_commit_free-10", + "ex/v1.9.1/general.html#git_commit_free-11", + "ex/v1.9.1/general.html#git_commit_free-12", + "ex/v1.9.1/general.html#git_commit_free-13" + ], + "log.c": [ + "ex/v1.9.1/log.html#git_commit_free-2", + "ex/v1.9.1/log.html#git_commit_free-3", + "ex/v1.9.1/log.html#git_commit_free-4", + "ex/v1.9.1/log.html#git_commit_free-5" + ] + } + }, + "git_commit_id": { + "type": "function", + "file": "git2/commit.h", + "line": 82, + "lineto": 82, + "args": [ + { + "name": "commit", + "type": "const git_commit *", + "comment": "a previously loaded commit." + } + ], + "argline": "const git_commit *commit", + "sig": "const git_commit *", + "return": { + "type": "const git_oid *", + "comment": " object identity for the commit." + }, + "description": "

Get the id of a commit.

\n", + "comments": "", + "group": "commit", + "examples": { + "general.c": ["ex/v1.9.1/general.html#git_commit_id-14"], + "log.c": ["ex/v1.9.1/log.html#git_commit_id-6"] + } + }, + "git_commit_owner": { + "type": "function", + "file": "git2/commit.h", + "line": 90, + "lineto": 90, + "args": [ + { + "name": "commit", + "type": "const git_commit *", + "comment": "A previously loaded commit." + } + ], + "argline": "const git_commit *commit", + "sig": "const git_commit *", + "return": { + "type": "git_repository *", + "comment": " Repository that contains this commit." + }, + "description": "

Get the repository that contains the commit.

\n", + "comments": "", + "group": "commit", + "examples": { + "log.c": [ + "ex/v1.9.1/log.html#git_commit_owner-7", + "ex/v1.9.1/log.html#git_commit_owner-8" + ] + } + }, + "git_commit_message_encoding": { + "type": "function", + "file": "git2/commit.h", + "line": 102, + "lineto": 102, + "args": [ + { + "name": "commit", + "type": "const git_commit *", + "comment": "a previously loaded commit." + } + ], + "argline": "const git_commit *commit", + "sig": "const git_commit *", + "return": { "type": "const char *", "comment": " NULL, or the encoding" }, + "description": "

Get the encoding for the message of a commit,\n as a string representing a standard encoding name.

\n", + "comments": "

The encoding may be NULL if the encoding header in the commit is missing; in that case UTF-8 is assumed.

\n", + "group": "commit" + }, + "git_commit_message": { + "type": "function", + "file": "git2/commit.h", + "line": 113, + "lineto": 113, + "args": [ + { + "name": "commit", + "type": "const git_commit *", + "comment": "a previously loaded commit." + } + ], + "argline": "const git_commit *commit", + "sig": "const git_commit *", + "return": { + "type": "const char *", + "comment": " the message of a commit" + }, + "description": "

Get the full message of a commit.

\n", + "comments": "

The returned message will be slightly prettified by removing any potential leading newlines.

\n", + "group": "commit", + "examples": { + "cat-file.c": [ + "ex/v1.9.1/cat-file.html#git_commit_message-3", + "ex/v1.9.1/cat-file.html#git_commit_message-4" + ], + "general.c": [ + "ex/v1.9.1/general.html#git_commit_message-15", + "ex/v1.9.1/general.html#git_commit_message-16", + "ex/v1.9.1/general.html#git_commit_message-17" + ], + "log.c": [ + "ex/v1.9.1/log.html#git_commit_message-9", + "ex/v1.9.1/log.html#git_commit_message-10", + "ex/v1.9.1/log.html#git_commit_message-11" + ], + "tag.c": ["ex/v1.9.1/tag.html#git_commit_message-2"] + } + }, + "git_commit_message_raw": { + "type": "function", + "file": "git2/commit.h", + "line": 121, + "lineto": 121, + "args": [ + { + "name": "commit", + "type": "const git_commit *", + "comment": "a previously loaded commit." + } + ], + "argline": "const git_commit *commit", + "sig": "const git_commit *", + "return": { + "type": "const char *", + "comment": " the raw message of a commit" + }, + "description": "

Get the full raw message of a commit.

\n", + "comments": "", + "group": "commit" + }, + "git_commit_summary": { + "type": "function", + "file": "git2/commit.h", + "line": 132, + "lineto": 132, + "args": [ + { + "name": "commit", + "type": "git_commit *", + "comment": "a previously loaded commit." + } + ], + "argline": "git_commit *commit", + "sig": "git_commit *", + "return": { + "type": "const char *", + "comment": " the summary of a commit or NULL on error" + }, + "description": "

Get the short "summary" of the git commit message.

\n", + "comments": "

The returned message is the summary of the commit, comprising the first paragraph of the message with whitespace trimmed and squashed.

\n", + "group": "commit" + }, + "git_commit_body": { + "type": "function", + "file": "git2/commit.h", + "line": 145, + "lineto": 145, + "args": [ + { + "name": "commit", + "type": "git_commit *", + "comment": "a previously loaded commit." + } + ], + "argline": "git_commit *commit", + "sig": "git_commit *", + "return": { + "type": "const char *", + "comment": " the body of a commit or NULL when no the message only\n consists of a summary" + }, + "description": "

Get the long "body" of the git commit message.

\n", + "comments": "

The returned message is the body of the commit, comprising everything but the first paragraph of the message. Leading and trailing whitespaces are trimmed.

\n", + "group": "commit" + }, + "git_commit_time": { + "type": "function", + "file": "git2/commit.h", + "line": 153, + "lineto": 153, + "args": [ + { + "name": "commit", + "type": "const git_commit *", + "comment": "a previously loaded commit." + } + ], + "argline": "const git_commit *commit", + "sig": "const git_commit *", + "return": { "type": "git_time_t", "comment": " the time of a commit" }, + "description": "

Get the commit time (i.e. committer time) of a commit.

\n", + "comments": "", + "group": "commit", + "examples": { + "general.c": [ + "ex/v1.9.1/general.html#git_commit_time-18", + "ex/v1.9.1/general.html#git_commit_time-19" + ] + } + }, + "git_commit_time_offset": { + "type": "function", + "file": "git2/commit.h", + "line": 161, + "lineto": 161, + "args": [ + { + "name": "commit", + "type": "const git_commit *", + "comment": "a previously loaded commit." + } + ], + "argline": "const git_commit *commit", + "sig": "const git_commit *", + "return": { + "type": "int", + "comment": " positive or negative timezone offset, in minutes from UTC" + }, + "description": "

Get the commit timezone offset (i.e. committer's preferred timezone) of a commit.

\n", + "comments": "", + "group": "commit" + }, + "git_commit_committer": { + "type": "function", + "file": "git2/commit.h", + "line": 169, + "lineto": 169, + "args": [ + { + "name": "commit", + "type": "const git_commit *", + "comment": "a previously loaded commit." + } + ], + "argline": "const git_commit *commit", + "sig": "const git_commit *", + "return": { + "type": "const git_signature *", + "comment": " the committer of a commit" + }, + "description": "

Get the committer of a commit.

\n", + "comments": "", + "group": "commit", + "examples": { + "cat-file.c": ["ex/v1.9.1/cat-file.html#git_commit_committer-5"], + "general.c": ["ex/v1.9.1/general.html#git_commit_committer-20"], + "log.c": ["ex/v1.9.1/log.html#git_commit_committer-12"] + } + }, + "git_commit_author": { + "type": "function", + "file": "git2/commit.h", + "line": 177, + "lineto": 177, + "args": [ + { + "name": "commit", + "type": "const git_commit *", + "comment": "a previously loaded commit." + } + ], + "argline": "const git_commit *commit", + "sig": "const git_commit *", + "return": { + "type": "const git_signature *", + "comment": " the author of a commit" + }, + "description": "

Get the author of a commit.

\n", + "comments": "", + "group": "commit", + "examples": { + "cat-file.c": ["ex/v1.9.1/cat-file.html#git_commit_author-6"], + "general.c": [ + "ex/v1.9.1/general.html#git_commit_author-21", + "ex/v1.9.1/general.html#git_commit_author-22" + ], + "log.c": [ + "ex/v1.9.1/log.html#git_commit_author-13", + "ex/v1.9.1/log.html#git_commit_author-14" + ] + } + }, + "git_commit_committer_with_mailmap": { + "type": "function", + "file": "git2/commit.h", + "line": 190, + "lineto": 191, + "args": [ + { + "name": "out", + "type": "git_signature **", + "comment": "a pointer to store the resolved signature." + }, + { + "name": "commit", + "type": "const git_commit *", + "comment": "a previously loaded commit." + }, + { + "name": "mailmap", + "type": "const git_mailmap *", + "comment": "the mailmap to resolve with. (may be NULL)" + } + ], + "argline": "git_signature **out, const git_commit *commit, const git_mailmap *mailmap", + "sig": "git_signature **::const git_commit *::const git_mailmap *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Get the committer of a commit, using the mailmap to map names and email\n addresses to canonical real names and email addresses.

\n", + "comments": "

Call git_signature_free to free the signature.

\n", + "group": "commit" + }, + "git_commit_author_with_mailmap": { + "type": "function", + "file": "git2/commit.h", + "line": 204, + "lineto": 205, + "args": [ + { + "name": "out", + "type": "git_signature **", + "comment": "a pointer to store the resolved signature." + }, + { + "name": "commit", + "type": "const git_commit *", + "comment": "a previously loaded commit." + }, + { + "name": "mailmap", + "type": "const git_mailmap *", + "comment": "the mailmap to resolve with. (may be NULL)" + } + ], + "argline": "git_signature **out, const git_commit *commit, const git_mailmap *mailmap", + "sig": "git_signature **::const git_commit *::const git_mailmap *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Get the author of a commit, using the mailmap to map names and email\n addresses to canonical real names and email addresses.

\n", + "comments": "

Call git_signature_free to free the signature.

\n", + "group": "commit" + }, + "git_commit_raw_header": { + "type": "function", + "file": "git2/commit.h", + "line": 213, + "lineto": 213, + "args": [ + { + "name": "commit", + "type": "const git_commit *", + "comment": "a previously loaded commit" + } + ], + "argline": "const git_commit *commit", + "sig": "const git_commit *", + "return": { + "type": "const char *", + "comment": " the header text of the commit" + }, + "description": "

Get the full raw text of the commit header.

\n", + "comments": "", + "group": "commit" + }, + "git_commit_tree": { + "type": "function", + "file": "git2/commit.h", + "line": 222, + "lineto": 222, + "args": [ + { + "name": "tree_out", + "type": "git_tree **", + "comment": "pointer where to store the tree object" + }, + { + "name": "commit", + "type": "const git_commit *", + "comment": "a previously loaded commit." + } + ], + "argline": "git_tree **tree_out, const git_commit *commit", + "sig": "git_tree **::const git_commit *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Get the tree pointed to by a commit.

\n", + "comments": "", + "group": "commit", + "examples": { + "log.c": [ + "ex/v1.9.1/log.html#git_commit_tree-15", + "ex/v1.9.1/log.html#git_commit_tree-16", + "ex/v1.9.1/log.html#git_commit_tree-17", + "ex/v1.9.1/log.html#git_commit_tree-18", + "ex/v1.9.1/log.html#git_commit_tree-19" + ] + } + }, + "git_commit_tree_id": { + "type": "function", + "file": "git2/commit.h", + "line": 232, + "lineto": 232, + "args": [ + { + "name": "commit", + "type": "const git_commit *", + "comment": "a previously loaded commit." + } + ], + "argline": "const git_commit *commit", + "sig": "const git_commit *", + "return": { + "type": "const git_oid *", + "comment": " the id of tree pointed to by commit." + }, + "description": "

Get the id of the tree pointed to by a commit. This differs from\n git_commit_tree in that no attempts are made to fetch an object\n from the ODB.

\n", + "comments": "", + "group": "commit", + "examples": { + "cat-file.c": ["ex/v1.9.1/cat-file.html#git_commit_tree_id-7"] + } + }, + "git_commit_parentcount": { + "type": "function", + "file": "git2/commit.h", + "line": 240, + "lineto": 240, + "args": [ + { + "name": "commit", + "type": "const git_commit *", + "comment": "a previously loaded commit." + } + ], + "argline": "const git_commit *commit", + "sig": "const git_commit *", + "return": { + "type": "unsigned int", + "comment": " integer of count of parents" + }, + "description": "

Get the number of parents of this commit

\n", + "comments": "", + "group": "commit", + "examples": { + "cat-file.c": ["ex/v1.9.1/cat-file.html#git_commit_parentcount-8"], + "general.c": ["ex/v1.9.1/general.html#git_commit_parentcount-23"], + "log.c": [ + "ex/v1.9.1/log.html#git_commit_parentcount-20", + "ex/v1.9.1/log.html#git_commit_parentcount-21" + ] + } + }, + "git_commit_parent": { + "type": "function", + "file": "git2/commit.h", + "line": 250, + "lineto": 253, + "args": [ + { + "name": "out", + "type": "git_commit **", + "comment": "Pointer where to store the parent commit" + }, + { + "name": "commit", + "type": "const git_commit *", + "comment": "a previously loaded commit." + }, + { + "name": "n", + "type": "unsigned int", + "comment": "the position of the parent (from 0 to `parentcount`)" + } + ], + "argline": "git_commit **out, const git_commit *commit, unsigned int n", + "sig": "git_commit **::const git_commit *::unsigned int", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Get the specified parent of the commit.

\n", + "comments": "", + "group": "commit", + "examples": { + "general.c": ["ex/v1.9.1/general.html#git_commit_parent-24"], + "log.c": [ + "ex/v1.9.1/log.html#git_commit_parent-22", + "ex/v1.9.1/log.html#git_commit_parent-23" + ] + } + }, + "git_commit_parent_id": { + "type": "function", + "file": "git2/commit.h", + "line": 264, + "lineto": 266, + "args": [ + { + "name": "commit", + "type": "const git_commit *", + "comment": "a previously loaded commit." + }, + { + "name": "n", + "type": "unsigned int", + "comment": "the position of the parent (from 0 to `parentcount`)" + } + ], + "argline": "const git_commit *commit, unsigned int n", + "sig": "const git_commit *::unsigned int", + "return": { + "type": "const git_oid *", + "comment": " the id of the parent, NULL on error." + }, + "description": "

Get the oid of a specified parent for a commit. This is different from\n git_commit_parent, which will attempt to load the parent commit from\n the ODB.

\n", + "comments": "", + "group": "commit", + "examples": { + "cat-file.c": ["ex/v1.9.1/cat-file.html#git_commit_parent_id-9"], + "log.c": ["ex/v1.9.1/log.html#git_commit_parent_id-24"] + } + }, + "git_commit_nth_gen_ancestor": { + "type": "function", + "file": "git2/commit.h", + "line": 282, + "lineto": 285, + "args": [ + { + "name": "ancestor", + "type": "git_commit **", + "comment": "Pointer where to store the ancestor commit" + }, + { + "name": "commit", + "type": "const git_commit *", + "comment": "a previously loaded commit." + }, + { + "name": "n", + "type": "unsigned int", + "comment": "the requested generation" + } + ], + "argline": "git_commit **ancestor, const git_commit *commit, unsigned int n", + "sig": "git_commit **::const git_commit *::unsigned int", + "return": { + "type": "int", + "comment": " 0 on success; GIT_ENOTFOUND if no matching ancestor exists\n or an error code" + }, + "description": "

Get the commit object that is the \n<n

\n\n
\n

th generation ancestor\n of the named commit object, following only the first parents.\n The returned commit has to be freed by the caller.

\n
\n", + "comments": "

Passing 0 as the generation number returns another instance of the base commit itself.

\n", + "group": "commit" + }, + "git_commit_header_field": { + "type": "function", + "file": "git2/commit.h", + "line": 297, + "lineto": 297, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": "the buffer to fill; existing content will be\n overwritten" + }, + { + "name": "commit", + "type": "const git_commit *", + "comment": "the commit to look in" + }, + { + "name": "field", + "type": "const char *", + "comment": "the header field to return" + } + ], + "argline": "git_buf *out, const git_commit *commit, const char *field", + "sig": "git_buf *::const git_commit *::const char *", + "return": { + "type": "int", + "comment": " 0 on succeess, GIT_ENOTFOUND if the field does not exist,\n or an error code" + }, + "description": "

Get an arbitrary header field

\n", + "comments": "", + "group": "commit" + }, + "git_commit_extract_signature": { + "type": "function", + "file": "git2/commit.h", + "line": 317, + "lineto": 317, + "args": [ + { + "name": "signature", + "type": "git_buf *", + "comment": "the signature block; existing content will be\n overwritten" + }, + { + "name": "signed_data", + "type": "git_buf *", + "comment": "signed data; this is the commit contents minus the signature block;\n existing content will be overwritten" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository in which the commit exists" + }, + { + "name": "commit_id", + "type": "git_oid *", + "comment": "the commit from which to extract the data" + }, + { + "name": "field", + "type": "const char *", + "comment": "the name of the header field containing the signature\n block; pass `NULL` to extract the default 'gpgsig'" + } + ], + "argline": "git_buf *signature, git_buf *signed_data, git_repository *repo, git_oid *commit_id, const char *field", + "sig": "git_buf *::git_buf *::git_repository *::git_oid *::const char *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_ENOTFOUND if the id is not for a commit\n or the commit does not have a signature." + }, + "description": "

Extract the signature from a commit

\n", + "comments": "

If the id is not for a commit, the error class will be GIT_ERROR_INVALID. If the commit does not have a signature, the error class will be GIT_ERROR_OBJECT.

\n", + "group": "commit" + }, + "git_commit_create": { + "type": "function", + "file": "git2/commit.h", + "line": 363, + "lineto": 373, + "args": [ + { + "name": "id", + "type": "git_oid *", + "comment": "Pointer in which to store the OID of the newly created commit" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository where to store the commit" + }, + { + "name": "update_ref", + "type": "const char *", + "comment": "If not NULL, name of the reference that\n\twill be updated to point to this commit. If the reference\n\tis not direct, it will be resolved to a direct reference.\n\tUse \"HEAD\" to update the HEAD of the current branch and\n\tmake it point to this commit. If the reference doesn't\n\texist yet, it will be created. If it does exist, the first\n\tparent must be the tip of this branch." + }, + { + "name": "author", + "type": "const git_signature *", + "comment": "Signature with author and author time of commit" + }, + { + "name": "committer", + "type": "const git_signature *", + "comment": "Signature with committer and * commit time of commit" + }, + { + "name": "message_encoding", + "type": "const char *", + "comment": "The encoding for the message in the\n commit, represented with a standard encoding name.\n E.g. \"UTF-8\". If NULL, no encoding header is written and\n UTF-8 is assumed." + }, + { + "name": "message", + "type": "const char *", + "comment": "Full message for this commit" + }, + { + "name": "tree", + "type": "const git_tree *", + "comment": "An instance of a `git_tree` object that will\n be used as the tree for the commit. This tree object must\n also be owned by the given `repo`." + }, + { + "name": "parent_count", + "type": "size_t", + "comment": "Number of parents for this commit" + }, + { + "name": "parents", + "type": "const git_commit *[]", + "comment": "Array of `parent_count` pointers to `git_commit`\n objects that will be used as the parents for this commit. This\n array may be NULL if `parent_count` is 0 (root commit). All the\n given commits must be owned by the `repo`." + } + ], + "argline": "git_oid *id, git_repository *repo, const char *update_ref, const git_signature *author, const git_signature *committer, const char *message_encoding, const char *message, const git_tree *tree, size_t parent_count, const git_commit *[] parents", + "sig": "git_oid *::git_repository *::const char *::const git_signature *::const git_signature *::const char *::const char *::const git_tree *::size_t::const git_commit *[]", + "return": { + "type": "int", + "comment": " 0 or an error code\n\tThe created commit will be written to the Object Database and\n\tthe given reference will be updated to point to it" + }, + "description": "

Create new commit in the repository from a list of git_object pointers

\n", + "comments": "

The message will not be cleaned up automatically. You can do that with the git_message_prettify() function.

\n", + "group": "commit", + "examples": { "merge.c": ["ex/v1.9.1/merge.html#git_commit_create-7"] } + }, + "git_commit_create_v": { + "type": "function", + "file": "git2/commit.h", + "line": 420, + "lineto": 430, + "args": [ + { + "name": "id", + "type": "git_oid *", + "comment": "Pointer in which to store the OID of the newly created commit" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository where to store the commit" + }, + { + "name": "update_ref", + "type": "const char *", + "comment": "If not NULL, name of the reference that\n\twill be updated to point to this commit. If the reference\n\tis not direct, it will be resolved to a direct reference.\n\tUse \"HEAD\" to update the HEAD of the current branch and\n\tmake it point to this commit. If the reference doesn't\n\texist yet, it will be created. If it does exist, the first\n\tparent must be the tip of this branch." + }, + { + "name": "author", + "type": "const git_signature *", + "comment": "Signature with author and author time of commit" + }, + { + "name": "committer", + "type": "const git_signature *", + "comment": "Signature with committer and * commit time of commit" + }, + { + "name": "message_encoding", + "type": "const char *", + "comment": "The encoding for the message in the\n commit, represented with a standard encoding name.\n E.g. \"UTF-8\". If NULL, no encoding header is written and\n UTF-8 is assumed." + }, + { + "name": "message", + "type": "const char *", + "comment": "Full message for this commit" + }, + { + "name": "tree", + "type": "const git_tree *", + "comment": "An instance of a `git_tree` object that will\n be used as the tree for the commit. This tree object must\n also be owned by the given `repo`." + }, + { + "name": "parent_count", + "type": "size_t", + "comment": "Number of parents for this commit" + } + ], + "argline": "git_oid *id, git_repository *repo, const char *update_ref, const git_signature *author, const git_signature *committer, const char *message_encoding, const char *message, const git_tree *tree, size_t parent_count", + "sig": "git_oid *::git_repository *::const char *::const git_signature *::const git_signature *::const char *::const char *::const git_tree *::size_t", + "return": { + "type": "int", + "comment": " 0 or an error code\n\tThe created commit will be written to the Object Database and\n\tthe given reference will be updated to point to it" + }, + "description": "

Create new commit in the repository using a variable argument list.

\n", + "comments": "

The message will not be cleaned up automatically. You can do that with the git_message_prettify() function.

\n\n

The parents for the commit are specified as a variable list of pointers to const git_commit *. Note that this is a convenience method which may not be safe to export for certain languages or compilers

\n\n

All other parameters remain the same as git_commit_create().

\n", + "group": "commit", + "examples": { + "commit.c": ["ex/v1.9.1/commit.html#git_commit_create_v-1"], + "general.c": ["ex/v1.9.1/general.html#git_commit_create_v-25"], + "init.c": ["ex/v1.9.1/init.html#git_commit_create_v-1"] + } + }, + "git_commit_create_from_stage": { + "type": "function", + "file": "git2/commit.h", + "line": 472, + "lineto": 476, + "args": [ + { + "name": "id", + "type": "git_oid *", + "comment": "pointer to store the new commit's object id" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "repository to commit changes in" + }, + { + "name": "message", + "type": "const char *", + "comment": "the commit message" + }, + { + "name": "opts", + "type": "const git_commit_create_options *", + "comment": "options for creating the commit" + } + ], + "argline": "git_oid *id, git_repository *repo, const char *message, const git_commit_create_options *opts", + "sig": "git_oid *::git_repository *::const char *::const git_commit_create_options *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_EUNCHANGED if there were no changes to commit, or an error code" + }, + "description": "

Commits the staged changes in the repository; this is a near analog to\n git commit -m message.

\n", + "comments": "

By default, empty commits are not allowed.

\n", + "group": "commit" + }, + "git_commit_amend": { + "type": "function", + "file": "git2/commit.h", + "line": 528, + "lineto": 536, + "args": [ + { + "name": "id", + "type": "git_oid *", + "comment": "Pointer in which to store the OID of the newly created commit" + }, + { + "name": "commit_to_amend", + "type": "const git_commit *", + "comment": "The commit to amend" + }, + { + "name": "update_ref", + "type": "const char *", + "comment": "If not NULL, name of the reference that\n\twill be updated to point to this commit. If the reference\n\tis not direct, it will be resolved to a direct reference.\n\tUse \"HEAD\" to update the HEAD of the current branch and\n\tmake it point to this commit. If the reference doesn't\n\texist yet, it will be created. If it does exist, the first\n\tparent must be the tip of this branch." + }, + { + "name": "author", + "type": "const git_signature *", + "comment": "Signature with author and author time of commit" + }, + { + "name": "committer", + "type": "const git_signature *", + "comment": "Signature with committer and * commit time of commit" + }, + { + "name": "message_encoding", + "type": "const char *", + "comment": "The encoding for the message in the\n commit, represented with a standard encoding name.\n E.g. \"UTF-8\". If NULL, no encoding header is written and\n UTF-8 is assumed." + }, + { + "name": "message", + "type": "const char *", + "comment": "Full message for this commit" + }, + { + "name": "tree", + "type": "const git_tree *", + "comment": "An instance of a `git_tree` object that will\n be used as the tree for the commit. This tree object must\n also be owned by the given `repo`." + } + ], + "argline": "git_oid *id, const git_commit *commit_to_amend, const char *update_ref, const git_signature *author, const git_signature *committer, const char *message_encoding, const char *message, const git_tree *tree", + "sig": "git_oid *::const git_commit *::const char *::const git_signature *::const git_signature *::const char *::const char *::const git_tree *", + "return": { + "type": "int", + "comment": " 0 or an error code\n\tThe created commit will be written to the Object Database and\n\tthe given reference will be updated to point to it" + }, + "description": "

Amend an existing commit by replacing only non-NULL values.

\n", + "comments": "

This creates a new commit that is exactly the same as the old commit, except that any non-NULL values will be updated. The new commit has the same parents as the old commit.

\n\n

The update_ref value works as in the regular git_commit_create(), updating the ref to point to the newly rewritten commit. If you want to amend a commit that is not currently the tip of the branch and then rewrite the following commits to reach a ref, pass this as NULL and update the rest of the commit chain and ref separately.

\n\n

Unlike git_commit_create(), the author, committer, message, message_encoding, and tree parameters can be NULL in which case this will use the values from the original commit_to_amend.

\n\n

All parameters have the same meanings as in git_commit_create().

\n", + "group": "commit" + }, + "git_commit_create_buffer": { + "type": "function", + "file": "git2/commit.h", + "line": 573, + "lineto": 582, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": "the buffer into which to write the commit object content" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository where the referenced tree and parents live" + }, + { + "name": "author", + "type": "const git_signature *", + "comment": "Signature with author and author time of commit" + }, + { + "name": "committer", + "type": "const git_signature *", + "comment": "Signature with committer and * commit time of commit" + }, + { + "name": "message_encoding", + "type": "const char *", + "comment": "The encoding for the message in the\n commit, represented with a standard encoding name.\n E.g. \"UTF-8\". If NULL, no encoding header is written and\n UTF-8 is assumed." + }, + { + "name": "message", + "type": "const char *", + "comment": "Full message for this commit" + }, + { + "name": "tree", + "type": "const git_tree *", + "comment": "An instance of a `git_tree` object that will\n be used as the tree for the commit. This tree object must\n also be owned by the given `repo`." + }, + { + "name": "parent_count", + "type": "size_t", + "comment": "Number of parents for this commit" + }, + { + "name": "parents", + "type": "const git_commit *[]", + "comment": "Array of `parent_count` pointers to `git_commit`\n objects that will be used as the parents for this commit. This\n array may be NULL if `parent_count` is 0 (root commit). All the\n given commits must be owned by the `repo`." + } + ], + "argline": "git_buf *out, git_repository *repo, const git_signature *author, const git_signature *committer, const char *message_encoding, const char *message, const git_tree *tree, size_t parent_count, const git_commit *[] parents", + "sig": "git_buf *::git_repository *::const git_signature *::const git_signature *::const char *::const char *::const git_tree *::size_t::const git_commit *[]", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Create a commit and write it into a buffer

\n", + "comments": "

Create a commit as with git_commit_create() but instead of writing it to the objectdb, write the contents of the object into a buffer.

\n", + "group": "commit" + }, + "git_commit_create_with_signature": { + "type": "function", + "file": "git2/commit.h", + "line": 600, + "lineto": 605, + "args": [ + { + "name": "out", + "type": "git_oid *", + "comment": "the resulting commit id" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository to create the commit in." + }, + { + "name": "commit_content", + "type": "const char *", + "comment": "the content of the unsigned commit object" + }, + { + "name": "signature", + "type": "const char *", + "comment": "the signature to add to the commit. Leave `NULL`\n to create a commit without adding a signature field." + }, + { + "name": "signature_field", + "type": "const char *", + "comment": "which header field should contain this\n signature. Leave `NULL` for the default of \"gpgsig\"" + } + ], + "argline": "git_oid *out, git_repository *repo, const char *commit_content, const char *signature, const char *signature_field", + "sig": "git_oid *::git_repository *::const char *::const char *::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Create a commit object from the given buffer and signature

\n", + "comments": "

Given the unsigned commit object's contents, its signature and the header field in which to store the signature, attach the signature to the commit and write it into the given repository.

\n", + "group": "commit" + }, + "git_commit_dup": { + "type": "function", + "file": "git2/commit.h", + "line": 615, + "lineto": 615, + "args": [ + { + "name": "out", + "type": "git_commit **", + "comment": "Pointer to store the copy of the commit" + }, + { + "name": "source", + "type": "git_commit *", + "comment": "Original commit to copy" + } + ], + "argline": "git_commit **out, git_commit *source", + "sig": "git_commit **::git_commit *", + "return": { "type": "int", "comment": " 0" }, + "description": "

Create an in-memory copy of a commit. The copy must be explicitly\n free'd or it will leak.

\n", + "comments": "", + "group": "commit" + }, + "git_commitarray_dispose": { + "type": "function", + "file": "git2/commit.h", + "line": 670, + "lineto": 670, + "args": [ + { + "name": "array", + "type": "git_commitarray *", + "comment": "The git_commitarray that contains commits to free" + } + ], + "argline": "git_commitarray *array", + "sig": "git_commitarray *", + "return": { "type": "void", "comment": null }, + "description": "

Free the commits contained in a commit array. This method should\n be called on git_commitarray objects that were provided by the\n library. Not doing so will result in a memory leak.

\n", + "comments": "

This does not free the git_commitarray itself, since the library will never allocate that object directly itself.

\n", + "group": "commitarray" + }, + "git_libgit2_version": { + "type": "function", + "file": "git2/common.h", + "line": 119, + "lineto": 119, + "args": [ + { + "name": "major", + "type": "int *", + "comment": "Store the major version number" + }, + { + "name": "minor", + "type": "int *", + "comment": "Store the minor version number" + }, + { + "name": "rev", + "type": "int *", + "comment": "Store the revision (patch) number" + } + ], + "argline": "int *major, int *minor, int *rev", + "sig": "int *::int *::int *", + "return": { + "type": "int", + "comment": " 0 on success or an error code on failure" + }, + "description": "

Return the version of the libgit2 library\n being currently used.

\n", + "comments": "", + "group": "libgit2" + }, + "git_libgit2_prerelease": { + "type": "function", + "file": "git2/common.h", + "line": 130, + "lineto": 130, + "args": [], + "argline": "", + "sig": "", + "return": { + "type": "const char *", + "comment": " the name of the prerelease state or NULL" + }, + "description": "

Return the prerelease state of the libgit2 library currently being\n used. For nightly builds during active development, this will be\n "alpha". Releases may have a "beta" or release candidate ("rc1",\n "rc2", etc) prerelease. For a final release, this function returns\n NULL.

\n", + "comments": "", + "group": "libgit2" + }, + "git_libgit2_features": { + "type": "function", + "file": "git2/common.h", + "line": 184, + "lineto": 184, + "args": [], + "argline": "", + "sig": "", + "return": { + "type": "int", + "comment": " A combination of GIT_FEATURE_* values." + }, + "description": "

Query compile time options for libgit2.

\n", + "comments": "", + "group": "libgit2" + }, + "git_libgit2_feature_backend": { + "type": "function", + "file": "git2/common.h", + "line": 205, + "lineto": 206, + "args": [ + { + "name": "feature", + "type": "git_feature_t", + "comment": "the feature to query details for" + } + ], + "argline": "git_feature_t feature", + "sig": "git_feature_t", + "return": { + "type": "const char *", + "comment": " the provider details, or NULL if the feature is not supported" + }, + "description": "

Query the backend details for the compile-time feature in libgit2.

\n", + "comments": "

This will return the "backend" for the feature, which is useful for things like HTTPS or SSH support, that can have multiple backends that could be compiled in.

\n\n

For example, when libgit2 is compiled with dynamic OpenSSL support, the feature backend will be openssl-dynamic. The feature backend names reflect the compilation options specified to the build system (though in all lower case). The backend may be "builtin" for features that are provided by libgit2 itself.

\n\n

If the feature is not supported by the library, this API returns NULL.

\n", + "group": "libgit2" + }, + "git_libgit2_opts": { + "type": "function", + "file": "git2/common.h", + "line": 569, + "lineto": 569, + "args": [{ "name": "option", "type": "int", "comment": "Option key" }], + "argline": "int option", + "sig": "int", + "return": { + "type": "int", + "comment": " 0 on success, \n<\n0 on failure" + }, + "description": "

Set or query a library global option

\n", + "comments": "

Available options:

\n\n
* opts(GIT_OPT_GET_MWINDOW_SIZE, size_t *):\n\n    > Get the maximum mmap window size\n\n* opts(GIT_OPT_SET_MWINDOW_SIZE, size_t):\n\n    > Set the maximum mmap window size\n\n* opts(GIT_OPT_GET_MWINDOW_MAPPED_LIMIT, size_t *):\n\n    > Get the maximum memory that will be mapped in total by the library\n\n* opts(GIT_OPT_SET_MWINDOW_MAPPED_LIMIT, size_t):\n\n    > Set the maximum amount of memory that can be mapped at any time       > by the library\n\n* opts(GIT_OPT_GET_MWINDOW_FILE_LIMIT, size_t *):\n\n    > Get the maximum number of files that will be mapped at any time by the        > library\n\n* opts(GIT_OPT_SET_MWINDOW_FILE_LIMIT, size_t):\n\n    > Set the maximum number of files that can be mapped at any time        > by the library. The default (0) is unlimited.\n\n* opts(GIT_OPT_GET_SEARCH_PATH, int level, git_buf *buf)\n\n    > Get the search path for a given level of config data.  "level" must       > be one of `GIT_CONFIG_LEVEL_SYSTEM`, `GIT_CONFIG_LEVEL_GLOBAL`,       > `GIT_CONFIG_LEVEL_XDG`, or `GIT_CONFIG_LEVEL_PROGRAMDATA`.        > The search path is written to the `out` buffer.\n\n* opts(GIT_OPT_SET_SEARCH_PATH, int level, const char *path)\n\n    > Set the search path for a level of config data.  The search path      > applied to shared attributes and ignore files, too.       >       > - `path` lists directories delimited by GIT_PATH_LIST_SEPARATOR.      >   Pass NULL to reset to the default (generally based on environment       >   variables).  Use magic path `$PATH` to include the old value        >   of the path (if you want to prepend or append, for instance).       >       > - `level` must be `GIT_CONFIG_LEVEL_SYSTEM`,      >   `GIT_CONFIG_LEVEL_GLOBAL`, `GIT_CONFIG_LEVEL_XDG`, or       >   `GIT_CONFIG_LEVEL_PROGRAMDATA`.\n\n* opts(GIT_OPT_SET_CACHE_OBJECT_LIMIT, git_object_t type, size_t size)\n\n    > Set the maximum data size for the given type of object to be      > considered eligible for caching in memory.  Setting to value to       > zero means that that type of object will not be cached.       > Defaults to 0 for GIT_OBJECT_BLOB (i.e. won't cache blobs) and 4k     > for GIT_OBJECT_COMMIT, GIT_OBJECT_TREE, and GIT_OBJECT_TAG.\n\n* opts(GIT_OPT_SET_CACHE_MAX_SIZE, ssize_t max_storage_bytes)\n\n    > Set the maximum total data size that will be cached in memory     > across all repositories before libgit2 starts evicting objects        > from the cache.  This is a soft limit, in that the library might      > briefly exceed it, but will start aggressively evicting objects       > from cache when that happens.  The default cache size is 256MB.\n\n* opts(GIT_OPT_ENABLE_CACHING, int enabled)\n\n    > Enable or disable caching completely.     >       > Because caches are repository-specific, disabling the cache       > cannot immediately clear all cached objects, but each cache will      > be cleared on the next attempt to update anything in it.\n\n* opts(GIT_OPT_GET_CACHED_MEMORY, ssize_t *current, ssize_t *allowed)\n\n    > Get the current bytes in cache and the maximum that would be      > allowed in the cache.\n\n* opts(GIT_OPT_GET_TEMPLATE_PATH, git_buf *out)\n\n    > Get the default template path.        > The path is written to the `out` buffer.\n\n* opts(GIT_OPT_SET_TEMPLATE_PATH, const char *path)\n\n    > Set the default template path.        >       > - `path` directory of template.\n\n* opts(GIT_OPT_SET_SSL_CERT_LOCATIONS, const char *file, const char *path)\n\n    > Set the SSL certificate-authority locations.      >       > - `file` is the location of a file containing several     >   certificates concatenated together.     > - `path` is the location of a directory holding several       >   certificates, one per file.     >       > Calling `GIT_OPT_ADD_SSL_X509_CERT` may override the      > data in `path`.       >       > Either parameter may be `NULL`, but not both.\n
\n\n\n\n

opts(GIT_OPT_SET_ODB_PACKED_PRIORITY, int priority) > Override the default priority of the packed ODB backend which > is added when default backends are assigned to a repository

\n\n

opts(GIT_OPT_SET_ODB_LOOSE_PRIORITY, int priority) > Override the default priority of the loose ODB backend which > is added when default backends are assigned to a repository

\n\n

opts(GIT_OPT_GET_EXTENSIONS, git_strarray *out) > Returns the list of git extensions that are supported. This > is the list of built-in extensions supported by libgit2 and > custom extensions that have been added with > GIT_OPT_SET_EXTENSIONS. Extensions that have been negated > will not be returned. The returned list should be released > with git_strarray_dispose.

\n\n

opts(GIT_OPT_SET_EXTENSIONS, const char **extensions, size_t len) > Set that the given git extensions are supported by the caller. > Extensions supported by libgit2 may be negated by prefixing > them with a !. For example: setting extensions to > { "!noop", "newext" } indicates that the caller does not want > to support repositories with the noop extension but does want > to support repositories with the newext extension.

\n\n

opts(GIT_OPT_GET_OWNER_VALIDATION, int *enabled) > Gets the owner validation setting for repository > directories.

\n\n

opts(GIT_OPT_SET_OWNER_VALIDATION, int enabled) > Set that repository directories should be owned by the current > user. The default is to validate ownership.

\n\n

opts(GIT_OPT_GET_HOMEDIR, git_buf *out) > Gets the current user's home directory, as it will be used > for file lookups. The path is written to the out buffer.

\n\n

opts(GIT_OPT_SET_HOMEDIR, const char *path) > Sets the directory used as the current user's home directory, > for file lookups. > > - path directory of home directory.

\n\n

opts(GIT_OPT_GET_SERVER_CONNECT_TIMEOUT, int *timeout) > Gets the timeout (in milliseconds) to attempt connections to > a remote server.

\n\n

opts(GIT_OPT_SET_SERVER_CONNECT_TIMEOUT, int timeout) > Sets the timeout (in milliseconds) to attempt connections to > a remote server. Set to 0 to use the system default. Note that > this may not be able to be configured longer than the system > default, typically 75 seconds.

\n\n

opts(GIT_OPT_GET_SERVER_TIMEOUT, int *timeout) > Gets the timeout (in milliseconds) for reading from and writing > to a remote server.

\n\n

opts(GIT_OPT_SET_SERVER_TIMEOUT, int timeout) > Sets the timeout (in milliseconds) for reading from and writing > to a remote server. Set to 0 to use the system default.

\n", + "group": "libgit2" + }, + "git_config_entry_free": { + "type": "function", + "file": "git2/config.h", + "line": 131, + "lineto": 131, + "args": [ + { + "name": "entry", + "type": "git_config_entry *", + "comment": "The entry to free." + } + ], + "argline": "git_config_entry *entry", + "sig": "git_config_entry *", + "return": { "type": "void", "comment": null }, + "description": "

Free a config entry.

\n", + "comments": "", + "group": "config", + "examples": { + "config.c": [ + "ex/v1.9.1/config.html#git_config_entry_free-1", + "ex/v1.9.1/config.html#git_config_entry_free-2" + ] + } + }, + "git_config_find_global": { + "type": "function", + "file": "git2/config.h", + "line": 183, + "lineto": 183, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": "Pointer to a user-allocated git_buf in which to store the path" + } + ], + "argline": "git_buf *out", + "sig": "git_buf *", + "return": { + "type": "int", + "comment": " 0 if a global configuration file has been found. Its path will be stored in `out`." + }, + "description": "

Locate the path to the global configuration file

\n", + "comments": "

The user or global configuration file is usually located in $HOME/.gitconfig.

\n\n

This method will try to guess the full path to that file, if the file exists. The returned path may be used on any git_config call to load the global configuration file.

\n\n

This method will not guess the path to the xdg compatible config file (.config/git/config).

\n", + "group": "config" + }, + "git_config_find_xdg": { + "type": "function", + "file": "git2/config.h", + "line": 200, + "lineto": 200, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": "Pointer to a user-allocated git_buf in which to store the path" + } + ], + "argline": "git_buf *out", + "sig": "git_buf *", + "return": { + "type": "int", + "comment": " 0 if a xdg compatible configuration file has been\n\tfound. Its path will be stored in `out`." + }, + "description": "

Locate the path to the global xdg compatible configuration file

\n", + "comments": "

The xdg compatible configuration file is usually located in $HOME/.config/git/config.

\n\n

This method will try to guess the full path to that file, if the file exists. The returned path may be used on any git_config call to load the xdg compatible configuration file.

\n", + "group": "config" + }, + "git_config_find_system": { + "type": "function", + "file": "git2/config.h", + "line": 212, + "lineto": 212, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": "Pointer to a user-allocated git_buf in which to store the path" + } + ], + "argline": "git_buf *out", + "sig": "git_buf *", + "return": { + "type": "int", + "comment": " 0 if a system configuration file has been\n\tfound. Its path will be stored in `out`." + }, + "description": "

Locate the path to the system configuration file

\n", + "comments": "

If /etc/gitconfig doesn't exist, it will look for %PROGRAMFILES%.

\n", + "group": "config" + }, + "git_config_find_programdata": { + "type": "function", + "file": "git2/config.h", + "line": 223, + "lineto": 223, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": "Pointer to a user-allocated git_buf in which to store the path" + } + ], + "argline": "git_buf *out", + "sig": "git_buf *", + "return": { + "type": "int", + "comment": " 0 if a ProgramData configuration file has been\n\tfound. Its path will be stored in `out`." + }, + "description": "

Locate the path to the configuration file in ProgramData

\n", + "comments": "

Look for the file in %PROGRAMDATA% used by portable git.

\n", + "group": "config" + }, + "git_config_open_default": { + "type": "function", + "file": "git2/config.h", + "line": 235, + "lineto": 235, + "args": [ + { + "name": "out", + "type": "git_config **", + "comment": "Pointer to store the config instance" + } + ], + "argline": "git_config **out", + "sig": "git_config **", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Open the global, XDG and system configuration files

\n", + "comments": "

Utility wrapper that finds the global, XDG and system configuration files and opens them into a single prioritized config object that can be used when accessing default config data outside a repository.

\n", + "group": "config" + }, + "git_config_new": { + "type": "function", + "file": "git2/config.h", + "line": 246, + "lineto": 246, + "args": [ + { + "name": "out", + "type": "git_config **", + "comment": "pointer to the new configuration" + } + ], + "argline": "git_config **out", + "sig": "git_config **", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Allocate a new configuration object

\n", + "comments": "

This object is empty, so you have to add a file to it before you can do anything with it.

\n", + "group": "config" + }, + "git_config_add_file_ondisk": { + "type": "function", + "file": "git2/config.h", + "line": 275, + "lineto": 280, + "args": [ + { + "name": "cfg", + "type": "git_config *", + "comment": "the configuration to add the file to" + }, + { + "name": "path", + "type": "const char *", + "comment": "path to the configuration file to add" + }, + { + "name": "level", + "type": "git_config_level_t", + "comment": "the priority level of the backend" + }, + { + "name": "repo", + "type": "const git_repository *", + "comment": "optional repository to allow parsing of\n conditional includes" + }, + { + "name": "force", + "type": "int", + "comment": "replace config file at the given priority level" + } + ], + "argline": "git_config *cfg, const char *path, git_config_level_t level, const git_repository *repo, int force", + "sig": "git_config *::const char *::git_config_level_t::const git_repository *::int", + "return": { + "type": "int", + "comment": " 0 on success, GIT_EEXISTS when adding more than one file\n for a given priority level (and force_replace set to 0),\n GIT_ENOTFOUND when the file doesn't exist or error code" + }, + "description": "

Add an on-disk config file instance to an existing config

\n", + "comments": "

The on-disk file pointed at by path will be opened and parsed; it's expected to be a native Git config file following the default Git config syntax (see man git-config).

\n\n

If the file does not exist, the file will still be added and it will be created the first time we write to it.

\n\n

Note that the configuration object will free the file automatically.

\n\n

Further queries on this config object will access each of the config file instances in order (instances with a higher priority level will be accessed first).

\n", + "group": "config" + }, + "git_config_open_ondisk": { + "type": "function", + "file": "git2/config.h", + "line": 294, + "lineto": 294, + "args": [ + { + "name": "out", + "type": "git_config **", + "comment": "The configuration instance to create" + }, + { + "name": "path", + "type": "const char *", + "comment": "Path to the on-disk file to open" + } + ], + "argline": "git_config **out, const char *path", + "sig": "git_config **::const char *", + "return": { "type": "int", "comment": " 0 on success, or an error code" }, + "description": "

Create a new config instance containing a single on-disk file

\n", + "comments": "

This method is a simple utility wrapper for the following sequence of calls: - git_config_new - git_config_add_file_ondisk

\n", + "group": "config", + "examples": { + "general.c": ["ex/v1.9.1/general.html#git_config_open_ondisk-26"] + } + }, + "git_config_open_level": { + "type": "function", + "file": "git2/config.h", + "line": 312, + "lineto": 315, + "args": [ + { + "name": "out", + "type": "git_config **", + "comment": "The configuration instance to create" + }, + { + "name": "parent", + "type": "const git_config *", + "comment": "Multi-level config to search for the given level" + }, + { + "name": "level", + "type": "git_config_level_t", + "comment": "Configuration level to search for" + } + ], + "argline": "git_config **out, const git_config *parent, git_config_level_t level", + "sig": "git_config **::const git_config *::git_config_level_t", + "return": { + "type": "int", + "comment": " 0, GIT_ENOTFOUND if the passed level cannot be found in the\n multi-level parent config, or an error code" + }, + "description": "

Build a single-level focused config object from a multi-level one.

\n", + "comments": "

The returned config object can be used to perform get/set/delete operations on a single specific level.

\n\n

Getting several times the same level from the same parent multi-level config will return different config instances, but containing the same config_file instance.

\n", + "group": "config" + }, + "git_config_open_global": { + "type": "function", + "file": "git2/config.h", + "line": 330, + "lineto": 330, + "args": [ + { + "name": "out", + "type": "git_config **", + "comment": "pointer in which to store the config object" + }, + { + "name": "config", + "type": "git_config *", + "comment": "the config object in which to look" + } + ], + "argline": "git_config **out, git_config *config", + "sig": "git_config **::git_config *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Open the global/XDG configuration file according to git's rules

\n", + "comments": "

Git allows you to store your global configuration at $HOME/.gitconfig or $XDG_CONFIG_HOME/git/config. For backwards compatibility, the XDG file shouldn't be used unless the use has created it explicitly. With this function you'll open the correct one to write to.

\n", + "group": "config" + }, + "git_config_set_writeorder": { + "type": "function", + "file": "git2/config.h", + "line": 343, + "lineto": 346, + "args": [ + { + "name": "cfg", + "type": "git_config *", + "comment": "the configuration to change write order of" + }, + { + "name": "levels", + "type": "git_config_level_t *", + "comment": "the ordering of levels for writing" + }, + { + "name": "len", + "type": "size_t", + "comment": "the length of the levels array" + } + ], + "argline": "git_config *cfg, git_config_level_t *levels, size_t len", + "sig": "git_config *::git_config_level_t *::size_t", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Set the write order for configuration backends. By default, the\n write ordering does not match the read ordering; for example, the\n worktree configuration is a high-priority for reading, but is not\n written to unless explicitly chosen.

\n", + "comments": "", + "group": "config" + }, + "git_config_snapshot": { + "type": "function", + "file": "git2/config.h", + "line": 362, + "lineto": 362, + "args": [ + { + "name": "out", + "type": "git_config **", + "comment": "pointer in which to store the snapshot config object" + }, + { + "name": "config", + "type": "git_config *", + "comment": "configuration to snapshot" + } + ], + "argline": "git_config **out, git_config *config", + "sig": "git_config **::git_config *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Create a snapshot of the configuration

\n", + "comments": "

Create a snapshot of the current state of a configuration, which allows you to look into a consistent view of the configuration for looking up complex values (e.g. a remote, submodule).

\n\n

The string returned when querying such a config object is valid until it is freed.

\n", + "group": "config" + }, + "git_config_free": { + "type": "function", + "file": "git2/config.h", + "line": 369, + "lineto": 369, + "args": [ + { + "name": "cfg", + "type": "git_config *", + "comment": "the configuration to free" + } + ], + "argline": "git_config *cfg", + "sig": "git_config *", + "return": { "type": "void", "comment": null }, + "description": "

Free the configuration and its associated memory and files

\n", + "comments": "", + "group": "config", + "examples": { + "config.c": ["ex/v1.9.1/config.html#git_config_free-3"], + "general.c": [ + "ex/v1.9.1/general.html#git_config_free-27", + "ex/v1.9.1/general.html#git_config_free-28" + ] + } + }, + "git_config_get_entry": { + "type": "function", + "file": "git2/config.h", + "line": 381, + "lineto": 384, + "args": [ + { + "name": "out", + "type": "git_config_entry **", + "comment": "pointer to the variable git_config_entry" + }, + { + "name": "cfg", + "type": "const git_config *", + "comment": "where to look for the variable" + }, + { + "name": "name", + "type": "const char *", + "comment": "the variable's name" + } + ], + "argline": "git_config_entry **out, const git_config *cfg, const char *name", + "sig": "git_config_entry **::const git_config *::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Get the git_config_entry of a config variable.

\n", + "comments": "

Free the git_config_entry after use with git_config_entry_free().

\n", + "group": "config", + "examples": { + "config.c": ["ex/v1.9.1/config.html#git_config_get_entry-4"] + } + }, + "git_config_get_int32": { + "type": "function", + "file": "git2/config.h", + "line": 398, + "lineto": 398, + "args": [ + { + "name": "out", + "type": "int32_t *", + "comment": "pointer to the variable where the value should be stored" + }, + { + "name": "cfg", + "type": "const git_config *", + "comment": "where to look for the variable" + }, + { + "name": "name", + "type": "const char *", + "comment": "the variable's name" + } + ], + "argline": "int32_t *out, const git_config *cfg, const char *name", + "sig": "int32_t *::const git_config *::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Get the value of an integer config variable.

\n", + "comments": "

All config files will be looked into, in the order of their defined level. A higher level means a higher priority. The first occurrence of the variable will be returned here.

\n", + "group": "config", + "examples": { + "general.c": [ + "ex/v1.9.1/general.html#git_config_get_int32-29", + "ex/v1.9.1/general.html#git_config_get_int32-30" + ] + } + }, + "git_config_get_int64": { + "type": "function", + "file": "git2/config.h", + "line": 412, + "lineto": 412, + "args": [ + { + "name": "out", + "type": "int64_t *", + "comment": "pointer to the variable where the value should be stored" + }, + { + "name": "cfg", + "type": "const git_config *", + "comment": "where to look for the variable" + }, + { + "name": "name", + "type": "const char *", + "comment": "the variable's name" + } + ], + "argline": "int64_t *out, const git_config *cfg, const char *name", + "sig": "int64_t *::const git_config *::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Get the value of a long integer config variable.

\n", + "comments": "

All config files will be looked into, in the order of their defined level. A higher level means a higher priority. The first occurrence of the variable will be returned here.

\n", + "group": "config" + }, + "git_config_get_bool": { + "type": "function", + "file": "git2/config.h", + "line": 429, + "lineto": 429, + "args": [ + { + "name": "out", + "type": "int *", + "comment": "pointer to the variable where the value should be stored" + }, + { + "name": "cfg", + "type": "const git_config *", + "comment": "where to look for the variable" + }, + { + "name": "name", + "type": "const char *", + "comment": "the variable's name" + } + ], + "argline": "int *out, const git_config *cfg, const char *name", + "sig": "int *::const git_config *::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Get the value of a boolean config variable.

\n", + "comments": "

This function uses the usual C convention of 0 being false and anything else true.

\n\n

All config files will be looked into, in the order of their defined level. A higher level means a higher priority. The first occurrence of the variable will be returned here.

\n", + "group": "config" + }, + "git_config_get_path": { + "type": "function", + "file": "git2/config.h", + "line": 447, + "lineto": 447, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": "the buffer in which to store the result" + }, + { + "name": "cfg", + "type": "const git_config *", + "comment": "where to look for the variable" + }, + { + "name": "name", + "type": "const char *", + "comment": "the variable's name" + } + ], + "argline": "git_buf *out, const git_config *cfg, const char *name", + "sig": "git_buf *::const git_config *::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Get the value of a path config variable.

\n", + "comments": "

A leading '~' will be expanded to the global search path (which defaults to the user's home directory but can be overridden via git_libgit2_opts().

\n\n

All config files will be looked into, in the order of their defined level. A higher level means a higher priority. The first occurrence of the variable will be returned here.

\n", + "group": "config" + }, + "git_config_get_string": { + "type": "function", + "file": "git2/config.h", + "line": 465, + "lineto": 465, + "args": [ + { + "name": "out", + "type": "const char **", + "comment": "pointer to the string" + }, + { + "name": "cfg", + "type": "const git_config *", + "comment": "where to look for the variable" + }, + { + "name": "name", + "type": "const char *", + "comment": "the variable's name" + } + ], + "argline": "const char **out, const git_config *cfg, const char *name", + "sig": "const char **::const git_config *::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Get the value of a string config variable.

\n", + "comments": "

This function can only be used on snapshot config objects. The string is owned by the config and should not be freed by the user. The pointer will be valid until the config is freed.

\n\n

All config files will be looked into, in the order of their defined level. A higher level means a higher priority. The first occurrence of the variable will be returned here.

\n", + "group": "config", + "examples": { + "general.c": [ + "ex/v1.9.1/general.html#git_config_get_string-31", + "ex/v1.9.1/general.html#git_config_get_string-32" + ] + } + }, + "git_config_get_string_buf": { + "type": "function", + "file": "git2/config.h", + "line": 481, + "lineto": 481, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": "buffer in which to store the string" + }, + { + "name": "cfg", + "type": "const git_config *", + "comment": "where to look for the variable" + }, + { + "name": "name", + "type": "const char *", + "comment": "the variable's name" + } + ], + "argline": "git_buf *out, const git_config *cfg, const char *name", + "sig": "git_buf *::const git_config *::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Get the value of a string config variable.

\n", + "comments": "

The value of the config will be copied into the buffer.

\n\n

All config files will be looked into, in the order of their defined level. A higher level means a higher priority. The first occurrence of the variable will be returned here.

\n", + "group": "config" + }, + "git_config_get_multivar_foreach": { + "type": "function", + "file": "git2/config.h", + "line": 500, + "lineto": 500, + "args": [ + { + "name": "cfg", + "type": "const git_config *", + "comment": "where to look for the variable" + }, + { + "name": "name", + "type": "const char *", + "comment": "the variable's name" + }, + { + "name": "regexp", + "type": "const char *", + "comment": "regular expression to filter which variables we're\n interested in. Use NULL to indicate all" + }, + { + "name": "callback", + "type": "git_config_foreach_cb", + "comment": "the function to be called on each value of the variable" + }, + { + "name": "payload", + "type": "void *", + "comment": "opaque pointer to pass to the callback" + } + ], + "argline": "const git_config *cfg, const char *name, const char *regexp, git_config_foreach_cb callback, void *payload", + "sig": "const git_config *::const char *::const char *::git_config_foreach_cb::void *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Get each value of a multivar in a foreach callback

\n", + "comments": "

The callback will be called on each variable found

\n\n

The regular expression is applied case-sensitively on the normalized form of the variable name: the section and variable parts are lower-cased. The subsection is left unchanged.

\n", + "group": "config" + }, + "git_config_multivar_iterator_new": { + "type": "function", + "file": "git2/config.h", + "line": 516, + "lineto": 516, + "args": [ + { + "name": "out", + "type": "git_config_iterator **", + "comment": "pointer to store the iterator" + }, + { + "name": "cfg", + "type": "const git_config *", + "comment": "where to look for the variable" + }, + { + "name": "name", + "type": "const char *", + "comment": "the variable's name" + }, + { + "name": "regexp", + "type": "const char *", + "comment": "regular expression to filter which variables we're\n interested in. Use NULL to indicate all" + } + ], + "argline": "git_config_iterator **out, const git_config *cfg, const char *name, const char *regexp", + "sig": "git_config_iterator **::const git_config *::const char *::const char *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Get each value of a multivar

\n", + "comments": "

The regular expression is applied case-sensitively on the normalized form of the variable name: the section and variable parts are lower-cased. The subsection is left unchanged.

\n", + "group": "config" + }, + "git_config_next": { + "type": "function", + "file": "git2/config.h", + "line": 528, + "lineto": 528, + "args": [ + { + "name": "entry", + "type": "git_config_entry **", + "comment": "pointer to store the entry" + }, + { + "name": "iter", + "type": "git_config_iterator *", + "comment": "the iterator" + } + ], + "argline": "git_config_entry **entry, git_config_iterator *iter", + "sig": "git_config_entry **::git_config_iterator *", + "return": { + "type": "int", + "comment": " 0 or an error code. GIT_ITEROVER if the iteration has completed" + }, + "description": "

Return the current entry and advance the iterator

\n", + "comments": "

The pointers returned by this function are valid until the next call to git_config_next or until the iterator is freed.

\n", + "group": "config" + }, + "git_config_iterator_free": { + "type": "function", + "file": "git2/config.h", + "line": 535, + "lineto": 535, + "args": [ + { + "name": "iter", + "type": "git_config_iterator *", + "comment": "the iterator to free" + } + ], + "argline": "git_config_iterator *iter", + "sig": "git_config_iterator *", + "return": { "type": "void", "comment": null }, + "description": "

Free a config iterator

\n", + "comments": "", + "group": "config" + }, + "git_config_set_int32": { + "type": "function", + "file": "git2/config.h", + "line": 546, + "lineto": 546, + "args": [ + { + "name": "cfg", + "type": "git_config *", + "comment": "where to look for the variable" + }, + { + "name": "name", + "type": "const char *", + "comment": "the variable's name" + }, + { + "name": "value", + "type": "int32_t", + "comment": "Integer value for the variable" + } + ], + "argline": "git_config *cfg, const char *name, int32_t value", + "sig": "git_config *::const char *::int32_t", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Set the value of an integer config variable in the config file\n with the highest level (usually the local one).

\n", + "comments": "", + "group": "config" + }, + "git_config_set_int64": { + "type": "function", + "file": "git2/config.h", + "line": 557, + "lineto": 557, + "args": [ + { + "name": "cfg", + "type": "git_config *", + "comment": "where to look for the variable" + }, + { + "name": "name", + "type": "const char *", + "comment": "the variable's name" + }, + { + "name": "value", + "type": "int64_t", + "comment": "Long integer value for the variable" + } + ], + "argline": "git_config *cfg, const char *name, int64_t value", + "sig": "git_config *::const char *::int64_t", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Set the value of a long integer config variable in the config file\n with the highest level (usually the local one).

\n", + "comments": "", + "group": "config" + }, + "git_config_set_bool": { + "type": "function", + "file": "git2/config.h", + "line": 568, + "lineto": 568, + "args": [ + { + "name": "cfg", + "type": "git_config *", + "comment": "where to look for the variable" + }, + { + "name": "name", + "type": "const char *", + "comment": "the variable's name" + }, + { "name": "value", "type": "int", "comment": "the value to store" } + ], + "argline": "git_config *cfg, const char *name, int value", + "sig": "git_config *::const char *::int", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Set the value of a boolean config variable in the config file\n with the highest level (usually the local one).

\n", + "comments": "", + "group": "config" + }, + "git_config_set_string": { + "type": "function", + "file": "git2/config.h", + "line": 582, + "lineto": 582, + "args": [ + { + "name": "cfg", + "type": "git_config *", + "comment": "where to look for the variable" + }, + { + "name": "name", + "type": "const char *", + "comment": "the variable's name" + }, + { + "name": "value", + "type": "const char *", + "comment": "the string to store." + } + ], + "argline": "git_config *cfg, const char *name, const char *value", + "sig": "git_config *::const char *::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Set the value of a string config variable in the config file\n with the highest level (usually the local one).

\n", + "comments": "

A copy of the string is made and the user is free to use it afterwards.

\n", + "group": "config", + "examples": { + "config.c": ["ex/v1.9.1/config.html#git_config_set_string-5"] + } + }, + "git_config_set_multivar": { + "type": "function", + "file": "git2/config.h", + "line": 595, + "lineto": 595, + "args": [ + { + "name": "cfg", + "type": "git_config *", + "comment": "where to look for the variable" + }, + { + "name": "name", + "type": "const char *", + "comment": "the variable's name" + }, + { + "name": "regexp", + "type": "const char *", + "comment": "a regular expression to indicate which values to replace" + }, + { "name": "value", "type": "const char *", "comment": "the new value." } + ], + "argline": "git_config *cfg, const char *name, const char *regexp, const char *value", + "sig": "git_config *::const char *::const char *::const char *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Set a multivar in the local config file.

\n", + "comments": "

The regular expression is applied case-sensitively on the value.

\n", + "group": "config" + }, + "git_config_delete_entry": { + "type": "function", + "file": "git2/config.h", + "line": 605, + "lineto": 605, + "args": [ + { + "name": "cfg", + "type": "git_config *", + "comment": "the configuration" + }, + { + "name": "name", + "type": "const char *", + "comment": "the variable to delete" + } + ], + "argline": "git_config *cfg, const char *name", + "sig": "git_config *::const char *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Delete a config variable from the config file\n with the highest level (usually the local one).

\n", + "comments": "", + "group": "config" + }, + "git_config_delete_multivar": { + "type": "function", + "file": "git2/config.h", + "line": 618, + "lineto": 618, + "args": [ + { + "name": "cfg", + "type": "git_config *", + "comment": "where to look for the variables" + }, + { + "name": "name", + "type": "const char *", + "comment": "the variable's name" + }, + { + "name": "regexp", + "type": "const char *", + "comment": "a regular expression to indicate which values to delete" + } + ], + "argline": "git_config *cfg, const char *name, const char *regexp", + "sig": "git_config *::const char *::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Deletes one or several entries from a multivar in the local config file.

\n", + "comments": "

The regular expression is applied case-sensitively on the value.

\n", + "group": "config" + }, + "git_config_foreach": { + "type": "function", + "file": "git2/config.h", + "line": 636, + "lineto": 639, + "args": [ + { + "name": "cfg", + "type": "const git_config *", + "comment": "where to get the variables from" + }, + { + "name": "callback", + "type": "git_config_foreach_cb", + "comment": "the function to call on each variable" + }, + { + "name": "payload", + "type": "void *", + "comment": "the data to pass to the callback" + } + ], + "argline": "const git_config *cfg, git_config_foreach_cb callback, void *payload", + "sig": "const git_config *::git_config_foreach_cb::void *", + "return": { + "type": "int", + "comment": " 0 on success, non-zero callback return value, or error code" + }, + "description": "

Perform an operation on each config variable.

\n", + "comments": "

The callback receives the normalized name and value of each variable in the config backend, and the data pointer passed to this function. If the callback returns a non-zero value, the function stops iterating and returns that value to the caller.

\n\n

The pointers passed to the callback are only valid as long as the iteration is ongoing.

\n", + "group": "config" + }, + "git_config_iterator_new": { + "type": "function", + "file": "git2/config.h", + "line": 651, + "lineto": 651, + "args": [ + { + "name": "out", + "type": "git_config_iterator **", + "comment": "pointer to store the iterator" + }, + { + "name": "cfg", + "type": "const git_config *", + "comment": "where to get the variables from" + } + ], + "argline": "git_config_iterator **out, const git_config *cfg", + "sig": "git_config_iterator **::const git_config *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Iterate over all the config variables

\n", + "comments": "

Use git_config_next to advance the iteration and git_config_iterator_free when done.

\n", + "group": "config" + }, + "git_config_iterator_glob_new": { + "type": "function", + "file": "git2/config.h", + "line": 668, + "lineto": 668, + "args": [ + { + "name": "out", + "type": "git_config_iterator **", + "comment": "pointer to store the iterator" + }, + { + "name": "cfg", + "type": "const git_config *", + "comment": "where to ge the variables from" + }, + { + "name": "regexp", + "type": "const char *", + "comment": "regular expression to match the names" + } + ], + "argline": "git_config_iterator **out, const git_config *cfg, const char *regexp", + "sig": "git_config_iterator **::const git_config *::const char *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Iterate over all the config variables whose name matches a pattern

\n", + "comments": "

Use git_config_next to advance the iteration and git_config_iterator_free when done.

\n\n

The regular expression is applied case-sensitively on the normalized form of the variable name: the section and variable parts are lower-cased. The subsection is left unchanged.

\n", + "group": "config" + }, + "git_config_foreach_match": { + "type": "function", + "file": "git2/config.h", + "line": 690, + "lineto": 694, + "args": [ + { + "name": "cfg", + "type": "const git_config *", + "comment": "where to get the variables from" + }, + { + "name": "regexp", + "type": "const char *", + "comment": "regular expression to match against config names" + }, + { + "name": "callback", + "type": "git_config_foreach_cb", + "comment": "the function to call on each variable" + }, + { + "name": "payload", + "type": "void *", + "comment": "the data to pass to the callback" + } + ], + "argline": "const git_config *cfg, const char *regexp, git_config_foreach_cb callback, void *payload", + "sig": "const git_config *::const char *::git_config_foreach_cb::void *", + "return": { + "type": "int", + "comment": " 0 or the return value of the callback which didn't return 0" + }, + "description": "

Perform an operation on each config variable matching a regular expression.

\n", + "comments": "

This behaves like git_config_foreach with an additional filter of a regular expression that filters which config keys are passed to the callback.

\n\n

The regular expression is applied case-sensitively on the normalized form of the variable name: the section and variable parts are lower-cased. The subsection is left unchanged.

\n\n

The regular expression is applied case-sensitively on the normalized form of the variable name: the case-insensitive parts are lower-case.

\n", + "group": "config" + }, + "git_config_get_mapped": { + "type": "function", + "file": "git2/config.h", + "line": 730, + "lineto": 735, + "args": [ + { + "name": "out", + "type": "int *", + "comment": "place to store the result of the mapping" + }, + { + "name": "cfg", + "type": "const git_config *", + "comment": "config file to get the variables from" + }, + { + "name": "name", + "type": "const char *", + "comment": "name of the config variable to lookup" + }, + { + "name": "maps", + "type": "const git_configmap *", + "comment": "array of `git_configmap` objects specifying the possible mappings" + }, + { + "name": "map_n", + "type": "size_t", + "comment": "number of mapping objects in `maps`" + } + ], + "argline": "int *out, const git_config *cfg, const char *name, const git_configmap *maps, size_t map_n", + "sig": "int *::const git_config *::const char *::const git_configmap *::size_t", + "return": { + "type": "int", + "comment": " 0 on success, error code otherwise" + }, + "description": "

Query the value of a config variable and return it mapped to\n an integer constant.

\n", + "comments": "

This is a helper method to easily map different possible values to a variable to integer constants that easily identify them.

\n\n

A mapping array looks as follows:

\n\n
git_configmap autocrlf_mapping[] = {        {GIT_CVAR_FALSE, NULL, GIT_AUTO_CRLF_FALSE},        {GIT_CVAR_TRUE, NULL, GIT_AUTO_CRLF_TRUE},      {GIT_CVAR_STRING, "input", GIT_AUTO_CRLF_INPUT},        {GIT_CVAR_STRING, "default", GIT_AUTO_CRLF_DEFAULT}};\n
\n\n

On any "false" value for the variable (e.g. "false", "FALSE", "no"), the mapping will store GIT_AUTO_CRLF_FALSE in the out parameter.

\n\n

The same thing applies for any "true" value such as "true", "yes" or "1", storing the GIT_AUTO_CRLF_TRUE variable.

\n\n

Otherwise, if the value matches the string "input" (with case insensitive comparison), the given constant will be stored in out, and likewise for "default".

\n\n

If not a single match can be made to store in out, an error code will be returned.

\n", + "group": "config" + }, + "git_config_lookup_map_value": { + "type": "function", + "file": "git2/config.h", + "line": 746, + "lineto": 750, + "args": [ + { + "name": "out", + "type": "int *", + "comment": "place to store the result of the parsing" + }, + { + "name": "maps", + "type": "const git_configmap *", + "comment": "array of `git_configmap` objects specifying the possible mappings" + }, + { + "name": "map_n", + "type": "size_t", + "comment": "number of mapping objects in `maps`" + }, + { "name": "value", "type": "const char *", "comment": "value to parse" } + ], + "argline": "int *out, const git_configmap *maps, size_t map_n, const char *value", + "sig": "int *::const git_configmap *::size_t::const char *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Maps a string value to an integer constant

\n", + "comments": "", + "group": "config" + }, + "git_config_parse_bool": { + "type": "function", + "file": "git2/config.h", + "line": 763, + "lineto": 763, + "args": [ + { + "name": "out", + "type": "int *", + "comment": "place to store the result of the parsing" + }, + { "name": "value", "type": "const char *", "comment": "value to parse" } + ], + "argline": "int *out, const char *value", + "sig": "int *::const char *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Parse a string value as a bool.

\n", + "comments": "

Valid values for true are: 'true', 'yes', 'on', 1 or any number different from 0 Valid values for false are: 'false', 'no', 'off', 0

\n", + "group": "config" + }, + "git_config_parse_int32": { + "type": "function", + "file": "git2/config.h", + "line": 776, + "lineto": 776, + "args": [ + { + "name": "out", + "type": "int32_t *", + "comment": "place to store the result of the parsing" + }, + { "name": "value", "type": "const char *", "comment": "value to parse" } + ], + "argline": "int32_t *out, const char *value", + "sig": "int32_t *::const char *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Parse a string value as an int32.

\n", + "comments": "

An optional value suffix of 'k', 'm', or 'g' will cause the value to be multiplied by 1024, 1048576, or 1073741824 prior to output.

\n", + "group": "config" + }, + "git_config_parse_int64": { + "type": "function", + "file": "git2/config.h", + "line": 789, + "lineto": 789, + "args": [ + { + "name": "out", + "type": "int64_t *", + "comment": "place to store the result of the parsing" + }, + { "name": "value", "type": "const char *", "comment": "value to parse" } + ], + "argline": "int64_t *out, const char *value", + "sig": "int64_t *::const char *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Parse a string value as an int64.

\n", + "comments": "

An optional value suffix of 'k', 'm', or 'g' will cause the value to be multiplied by 1024, 1048576, or 1073741824 prior to output.

\n", + "group": "config" + }, + "git_config_parse_path": { + "type": "function", + "file": "git2/config.h", + "line": 805, + "lineto": 805, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": "placae to store the result of parsing" + }, + { + "name": "value", + "type": "const char *", + "comment": "the path to evaluate" + } + ], + "argline": "git_buf *out, const char *value", + "sig": "git_buf *::const char *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Parse a string value as a path.

\n", + "comments": "

A leading '~' will be expanded to the global search path (which defaults to the user's home directory but can be overridden via git_libgit2_opts().

\n\n

If the value does not begin with a tilde, the input will be returned.

\n", + "group": "config" + }, + "git_config_backend_foreach_match": { + "type": "function", + "file": "git2/config.h", + "line": 824, + "lineto": 828, + "args": [ + { + "name": "backend", + "type": "git_config_backend *", + "comment": "where to get the variables from" + }, + { + "name": "regexp", + "type": "const char *", + "comment": "regular expression to match against config names (can be NULL)" + }, + { + "name": "callback", + "type": "git_config_foreach_cb", + "comment": "the function to call on each variable" + }, + { + "name": "payload", + "type": "void *", + "comment": "the data to pass to the callback" + } + ], + "argline": "git_config_backend *backend, const char *regexp, git_config_foreach_cb callback, void *payload", + "sig": "git_config_backend *::const char *::git_config_foreach_cb::void *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Perform an operation on each config variable in a given config backend,\n matching a regular expression.

\n", + "comments": "

This behaves like git_config_foreach_match except that only config entries from the given backend entry are enumerated.

\n\n

The regular expression is applied case-sensitively on the normalized form of the variable name: the section and variable parts are lower-cased. The subsection is left unchanged.

\n", + "group": "config" + }, + "git_config_lock": { + "type": "function", + "file": "git2/config.h", + "line": 847, + "lineto": 847, + "args": [ + { + "name": "tx", + "type": "git_transaction **", + "comment": "the resulting transaction, use this to commit or undo the\n changes" + }, + { + "name": "cfg", + "type": "git_config *", + "comment": "the configuration in which to lock" + } + ], + "argline": "git_transaction **tx, git_config *cfg", + "sig": "git_transaction **::git_config *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Lock the backend with the highest priority

\n", + "comments": "

Locking disallows anybody else from writing to that backend. Any updates made after locking will not be visible to a reader until the file is unlocked.

\n\n

You can apply the changes by calling git_transaction_commit() before freeing the transaction. Either of these actions will unlock the config.

\n", + "group": "config" + }, + "git_credential_free": { + "type": "function", + "file": "git2/credential.h", + "line": 149, + "lineto": 149, + "args": [ + { + "name": "cred", + "type": "git_credential *", + "comment": "the object to free" + } + ], + "argline": "git_credential *cred", + "sig": "git_credential *", + "return": { "type": "void", "comment": null }, + "description": "

Free a credential.

\n", + "comments": "

This is only necessary if you own the object; that is, if you are a transport.

\n", + "group": "credential" + }, + "git_credential_has_username": { + "type": "function", + "file": "git2/credential.h", + "line": 157, + "lineto": 157, + "args": [ + { + "name": "cred", + "type": "git_credential *", + "comment": "object to check" + } + ], + "argline": "git_credential *cred", + "sig": "git_credential *", + "return": { + "type": "int", + "comment": " 1 if the credential object has non-NULL username, 0 otherwise" + }, + "description": "

Check whether a credential object contains username information.

\n", + "comments": "", + "group": "credential" + }, + "git_credential_get_username": { + "type": "function", + "file": "git2/credential.h", + "line": 165, + "lineto": 165, + "args": [ + { + "name": "cred", + "type": "git_credential *", + "comment": "object to check" + } + ], + "argline": "git_credential *cred", + "sig": "git_credential *", + "return": { + "type": "const char *", + "comment": " the credential username, or NULL if not applicable" + }, + "description": "

Return the username associated with a credential object.

\n", + "comments": "", + "group": "credential" + }, + "git_credential_userpass_plaintext_new": { + "type": "function", + "file": "git2/credential.h", + "line": 176, + "lineto": 179, + "args": [ + { + "name": "out", + "type": "git_credential **", + "comment": "The newly created credential object." + }, + { + "name": "username", + "type": "const char *", + "comment": "The username of the credential." + }, + { + "name": "password", + "type": "const char *", + "comment": "The password of the credential." + } + ], + "argline": "git_credential **out, const char *username, const char *password", + "sig": "git_credential **::const char *::const char *", + "return": { + "type": "int", + "comment": " 0 for success or an error code for failure" + }, + "description": "

Create a new plain-text username and password credential object.\n The supplied credential parameter will be internally duplicated.

\n", + "comments": "", + "group": "credential" + }, + "git_credential_default_new": { + "type": "function", + "file": "git2/credential.h", + "line": 188, + "lineto": 188, + "args": [ + { + "name": "out", + "type": "git_credential **", + "comment": "The newly created credential object." + } + ], + "argline": "git_credential **out", + "sig": "git_credential **", + "return": { + "type": "int", + "comment": " 0 for success or an error code for failure" + }, + "description": "

Create a "default" credential usable for Negotiate mechanisms like NTLM\n or Kerberos authentication.

\n", + "comments": "", + "group": "credential" + }, + "git_credential_username_new": { + "type": "function", + "file": "git2/credential.h", + "line": 200, + "lineto": 200, + "args": [ + { + "name": "out", + "type": "git_credential **", + "comment": "The newly created credential object." + }, + { + "name": "username", + "type": "const char *", + "comment": "The username to authenticate with" + } + ], + "argline": "git_credential **out, const char *username", + "sig": "git_credential **::const char *", + "return": { + "type": "int", + "comment": " 0 for success or an error code for failure" + }, + "description": "

Create a credential to specify a username.

\n", + "comments": "

This is used with ssh authentication to query for the username if none is specified in the url.

\n", + "group": "credential" + }, + "git_credential_ssh_key_new": { + "type": "function", + "file": "git2/credential.h", + "line": 213, + "lineto": 218, + "args": [ + { + "name": "out", + "type": "git_credential **", + "comment": "The newly created credential object." + }, + { + "name": "username", + "type": "const char *", + "comment": "username to use to authenticate" + }, + { + "name": "publickey", + "type": "const char *", + "comment": "The path to the public key of the credential." + }, + { + "name": "privatekey", + "type": "const char *", + "comment": "The path to the private key of the credential." + }, + { + "name": "passphrase", + "type": "const char *", + "comment": "The passphrase of the credential." + } + ], + "argline": "git_credential **out, const char *username, const char *publickey, const char *privatekey, const char *passphrase", + "sig": "git_credential **::const char *::const char *::const char *::const char *", + "return": { + "type": "int", + "comment": " 0 for success or an error code for failure" + }, + "description": "

Create a new passphrase-protected ssh key credential object.\n The supplied credential parameter will be internally duplicated.

\n", + "comments": "", + "group": "credential" + }, + "git_credential_ssh_key_memory_new": { + "type": "function", + "file": "git2/credential.h", + "line": 230, + "lineto": 235, + "args": [ + { + "name": "out", + "type": "git_credential **", + "comment": "The newly created credential object." + }, + { + "name": "username", + "type": "const char *", + "comment": "username to use to authenticate." + }, + { + "name": "publickey", + "type": "const char *", + "comment": "The public key of the credential." + }, + { + "name": "privatekey", + "type": "const char *", + "comment": "The private key of the credential." + }, + { + "name": "passphrase", + "type": "const char *", + "comment": "The passphrase of the credential." + } + ], + "argline": "git_credential **out, const char *username, const char *publickey, const char *privatekey, const char *passphrase", + "sig": "git_credential **::const char *::const char *::const char *::const char *", + "return": { + "type": "int", + "comment": " 0 for success or an error code for failure" + }, + "description": "

Create a new ssh key credential object reading the keys from memory.

\n", + "comments": "", + "group": "credential" + }, + "git_credential_ssh_interactive_new": { + "type": "function", + "file": "git2/credential.h", + "line": 278, + "lineto": 282, + "args": [ + { + "name": "out", + "type": "git_credential **", + "comment": "The newly created credential object." + }, + { + "name": "username", + "type": "const char *", + "comment": "Username to use to authenticate." + }, + { + "name": "prompt_callback", + "type": "git_credential_ssh_interactive_cb", + "comment": "The callback method used for prompts." + }, + { + "name": "payload", + "type": "void *", + "comment": "Additional data to pass to the callback." + } + ], + "argline": "git_credential **out, const char *username, git_credential_ssh_interactive_cb prompt_callback, void *payload", + "sig": "git_credential **::const char *::git_credential_ssh_interactive_cb::void *", + "return": { + "type": "int", + "comment": " 0 for success or an error code for failure." + }, + "description": "

Create a new ssh keyboard-interactive based credential object.\n The supplied credential parameter will be internally duplicated.

\n", + "comments": "", + "group": "credential" + }, + "git_credential_ssh_key_from_agent": { + "type": "function", + "file": "git2/credential.h", + "line": 292, + "lineto": 294, + "args": [ + { + "name": "out", + "type": "git_credential **", + "comment": "The newly created credential object." + }, + { + "name": "username", + "type": "const char *", + "comment": "username to use to authenticate" + } + ], + "argline": "git_credential **out, const char *username", + "sig": "git_credential **::const char *", + "return": { + "type": "int", + "comment": " 0 for success or an error code for failure" + }, + "description": "

Create a new ssh key credential object used for querying an ssh-agent.\n The supplied credential parameter will be internally duplicated.

\n", + "comments": "", + "group": "credential" + }, + "git_credential_ssh_custom_new": { + "type": "function", + "file": "git2/credential.h", + "line": 332, + "lineto": 338, + "args": [ + { + "name": "out", + "type": "git_credential **", + "comment": "The newly created credential object." + }, + { + "name": "username", + "type": "const char *", + "comment": "username to use to authenticate" + }, + { + "name": "publickey", + "type": "const char *", + "comment": "The bytes of the public key." + }, + { + "name": "publickey_len", + "type": "size_t", + "comment": "The length of the public key in bytes." + }, + { + "name": "sign_callback", + "type": "git_credential_sign_cb", + "comment": "The callback method to sign the data during the challenge." + }, + { + "name": "payload", + "type": "void *", + "comment": "Additional data to pass to the callback." + } + ], + "argline": "git_credential **out, const char *username, const char *publickey, size_t publickey_len, git_credential_sign_cb sign_callback, void *payload", + "sig": "git_credential **::const char *::const char *::size_t::git_credential_sign_cb::void *", + "return": { + "type": "int", + "comment": " 0 for success or an error code for failure" + }, + "description": "

Create an ssh key credential with a custom signing function.

\n", + "comments": "

This lets you use your own function to sign the challenge.

\n\n

This function and its credential type is provided for completeness and wraps libssh2_userauth_publickey(), which is undocumented.

\n\n

The supplied credential parameter will be internally duplicated.

\n", + "group": "credential" + }, + "git_credential_userpass": { + "type": "function", + "file": "git2/credential_helpers.h", + "line": 44, + "lineto": 49, + "args": [ + { + "name": "out", + "type": "git_credential **", + "comment": "The newly created credential object." + }, + { + "name": "url", + "type": "const char *", + "comment": "The resource for which we are demanding a credential." + }, + { + "name": "user_from_url", + "type": "const char *", + "comment": "The username that was embedded in a \"user\n@\nhost\"\n remote url, or NULL if not included." + }, + { + "name": "allowed_types", + "type": "unsigned int", + "comment": "A bitmask stating which credential types are OK to return." + }, + { + "name": "payload", + "type": "void *", + "comment": "The payload provided when specifying this callback. (This is\n interpreted as a `git_credential_userpass_payload*`.)" + } + ], + "argline": "git_credential **out, const char *url, const char *user_from_url, unsigned int allowed_types, void *payload", + "sig": "git_credential **::const char *::const char *::unsigned int::void *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Stock callback usable as a git_credential_acquire_cb. This calls\n git_cred_userpass_plaintext_new unless the protocol has not specified\n GIT_CREDENTIAL_USERPASS_PLAINTEXT as an allowed type.

\n", + "comments": "", + "group": "credential" + }, + "git_blob_filtered_content": { + "type": "function", + "file": "git2/deprecated.h", + "line": 124, + "lineto": 128, + "args": [ + { "name": "out", "type": "git_buf *", "comment": null }, + { "name": "blob", "type": "git_blob *", "comment": null }, + { "name": "as_path", "type": "const char *", "comment": null }, + { "name": "check_for_binary_data", "type": "int", "comment": null } + ], + "argline": "git_buf *out, git_blob *blob, const char *as_path, int check_for_binary_data", + "sig": "git_buf *::git_blob *::const char *::int", + "return": { "type": "int", "comment": null }, + "description": "

Deprecated in favor of git_blob_filter.

\n", + "comments": "", + "group": "blob" + }, + "git_filter_list_stream_data": { + "type": "function", + "file": "git2/deprecated.h", + "line": 148, + "lineto": 151, + "args": [ + { "name": "filters", "type": "git_filter_list *", "comment": null }, + { "name": "data", "type": "git_buf *", "comment": null }, + { "name": "target", "type": "git_writestream *", "comment": null } + ], + "argline": "git_filter_list *filters, git_buf *data, git_writestream *target", + "sig": "git_filter_list *::git_buf *::git_writestream *", + "return": { "type": "int", "comment": null }, + "description": "

Deprecated in favor of git_filter_list_stream_buffer.

\n", + "comments": "", + "group": "filter" + }, + "git_filter_list_apply_to_data": { + "type": "function", + "file": "git2/deprecated.h", + "line": 158, + "lineto": 161, + "args": [ + { "name": "out", "type": "git_buf *", "comment": null }, + { "name": "filters", "type": "git_filter_list *", "comment": null }, + { "name": "in", "type": "git_buf *", "comment": null } + ], + "argline": "git_buf *out, git_filter_list *filters, git_buf *in", + "sig": "git_buf *::git_filter_list *::git_buf *", + "return": { "type": "int", "comment": null }, + "description": "

Deprecated in favor of git_filter_list_apply_to_buffer.

\n", + "comments": "", + "group": "filter" + }, + "git_treebuilder_write_with_buffer": { + "type": "function", + "file": "git2/deprecated.h", + "line": 187, + "lineto": 188, + "args": [ + { "name": "oid", "type": "git_oid *", "comment": null }, + { "name": "bld", "type": "git_treebuilder *", "comment": null }, + { "name": "tree", "type": "git_buf *", "comment": null } + ], + "argline": "git_oid *oid, git_treebuilder *bld, git_buf *tree", + "sig": "git_oid *::git_treebuilder *::git_buf *", + "return": { "type": "int", "comment": null }, + "description": "

Write the contents of the tree builder as a tree object.\n This is an alias of git_treebuilder_write and is preserved\n for backward compatibility.

\n", + "comments": "

This function is deprecated, but there is no plan to remove this function at this time.

\n", + "group": "treebuilder" + }, + "git_buf_grow": { + "type": "function", + "file": "git2/deprecated.h", + "line": 229, + "lineto": 229, + "args": [ + { + "name": "buffer", + "type": "git_buf *", + "comment": "The buffer to be resized; may or may not be allocated yet" + }, + { + "name": "target_size", + "type": "size_t", + "comment": "The desired available size" + } + ], + "argline": "git_buf *buffer, size_t target_size", + "sig": "git_buf *::size_t", + "return": { + "type": "int", + "comment": " 0 on success, -1 on allocation failure" + }, + "description": "

Resize the buffer allocation to make more space.

\n", + "comments": "

This will attempt to grow the buffer to accommodate the target size.

\n\n

If the buffer refers to memory that was not allocated by libgit2 (i.e. the asize field is zero), then ptr will be replaced with a newly allocated block of data. Be careful so that memory allocated by the caller is not lost. As a special variant, if you pass target_size as 0 and the memory is not allocated by libgit2, this will allocate a new buffer of size size and copy the external data into it.

\n\n

Currently, this will never shrink a buffer, only expand it.

\n\n

If the allocation fails, this will return an error and the buffer will be marked as invalid for future operations, invaliding the contents.

\n", + "group": "buf" + }, + "git_buf_set": { + "type": "function", + "file": "git2/deprecated.h", + "line": 239, + "lineto": 240, + "args": [ + { + "name": "buffer", + "type": "git_buf *", + "comment": "The buffer to set" + }, + { + "name": "data", + "type": "const void *", + "comment": "The data to copy into the buffer" + }, + { + "name": "datalen", + "type": "size_t", + "comment": "The length of the data to copy into the buffer" + } + ], + "argline": "git_buf *buffer, const void *data, size_t datalen", + "sig": "git_buf *::const void *::size_t", + "return": { + "type": "int", + "comment": " 0 on success, -1 on allocation failure" + }, + "description": "

Set buffer to a copy of some raw data.

\n", + "comments": "", + "group": "buf" + }, + "git_buf_is_binary": { + "type": "function", + "file": "git2/deprecated.h", + "line": 248, + "lineto": 248, + "args": [ + { + "name": "buf", + "type": "const git_buf *", + "comment": "Buffer to check" + } + ], + "argline": "const git_buf *buf", + "sig": "const git_buf *", + "return": { + "type": "int", + "comment": " 1 if buffer looks like non-text data" + }, + "description": "

Check quickly if buffer looks like it contains binary data

\n", + "comments": "", + "group": "buf" + }, + "git_buf_contains_nul": { + "type": "function", + "file": "git2/deprecated.h", + "line": 256, + "lineto": 256, + "args": [ + { + "name": "buf", + "type": "const git_buf *", + "comment": "Buffer to check" + } + ], + "argline": "const git_buf *buf", + "sig": "const git_buf *", + "return": { + "type": "int", + "comment": " 1 if buffer contains a NUL byte" + }, + "description": "

Check quickly if buffer contains a NUL byte

\n", + "comments": "", + "group": "buf" + }, + "git_buf_free": { + "type": "function", + "file": "git2/deprecated.h", + "line": 268, + "lineto": 268, + "args": [{ "name": "buffer", "type": "git_buf *", "comment": null }], + "argline": "git_buf *buffer", + "sig": "git_buf *", + "return": { "type": "void", "comment": null }, + "description": "

Free the memory referred to by the git_buf. This is an alias of\n git_buf_dispose and is preserved for backward compatibility.

\n", + "comments": "

This function is deprecated, but there is no plan to remove this function at this time.

\n", + "group": "buf" + }, + "git_diff_format_email": { + "type": "function", + "file": "git2/deprecated.h", + "line": 374, + "lineto": 377, + "args": [ + { "name": "out", "type": "git_buf *", "comment": null }, + { "name": "diff", "type": "git_diff *", "comment": null }, + { + "name": "opts", + "type": "const git_diff_format_email_options *", + "comment": null + } + ], + "argline": "git_buf *out, git_diff *diff, const git_diff_format_email_options *opts", + "sig": "git_buf *::git_diff *::const git_diff_format_email_options *", + "return": { "type": "int", "comment": null }, + "description": "

Create an e-mail ready patch from a diff.

\n", + "comments": "", + "group": "diff" + }, + "git_diff_commit_as_email": { + "type": "function", + "file": "git2/deprecated.h", + "line": 385, + "lineto": 392, + "args": [ + { "name": "out", "type": "git_buf *", "comment": null }, + { "name": "repo", "type": "git_repository *", "comment": null }, + { "name": "commit", "type": "git_commit *", "comment": null }, + { "name": "patch_no", "type": "size_t", "comment": null }, + { "name": "total_patches", "type": "size_t", "comment": null }, + { "name": "flags", "type": "uint32_t", "comment": null }, + { + "name": "diff_opts", + "type": "const git_diff_options *", + "comment": null + } + ], + "argline": "git_buf *out, git_repository *repo, git_commit *commit, size_t patch_no, size_t total_patches, uint32_t flags, const git_diff_options *diff_opts", + "sig": "git_buf *::git_repository *::git_commit *::size_t::size_t::uint32_t::const git_diff_options *", + "return": { "type": "int", "comment": null }, + "description": "

Create an e-mail ready patch for a commit.

\n", + "comments": "", + "group": "diff" + }, + "git_diff_format_email_options_init": { + "type": "function", + "file": "git2/deprecated.h", + "line": 404, + "lineto": 406, + "args": [ + { + "name": "opts", + "type": "git_diff_format_email_options *", + "comment": "The `git_blame_options` struct to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "The struct version; pass `GIT_DIFF_FORMAT_EMAIL_OPTIONS_VERSION`." + } + ], + "argline": "git_diff_format_email_options *opts, unsigned int version", + "sig": "git_diff_format_email_options *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initialize git_diff_format_email_options structure

\n", + "comments": "

Initializes a git_diff_format_email_options with default values. Equivalent to creating an instance with GIT_DIFF_FORMAT_EMAIL_OPTIONS_INIT.

\n", + "group": "diff" + }, + "giterr_last": { + "type": "function", + "file": "git2/deprecated.h", + "line": 503, + "lineto": 503, + "args": [], + "argline": "", + "sig": "", + "return": { "type": "const git_error *", "comment": null }, + "description": "

Return the last git_error object that was generated for the\n current thread. This is an alias of git_error_last and is\n preserved for backward compatibility.

\n", + "comments": "

This function is deprecated, but there is no plan to remove this function at this time.

\n", + "group": "giterr" + }, + "giterr_clear": { + "type": "function", + "file": "git2/deprecated.h", + "line": 515, + "lineto": 515, + "args": [], + "argline": "", + "sig": "", + "return": { "type": "void", "comment": null }, + "description": "

Clear the last error. This is an alias of git_error_last and is\n preserved for backward compatibility.

\n", + "comments": "

This function is deprecated, but there is no plan to remove this function at this time.

\n", + "group": "giterr" + }, + "giterr_set_str": { + "type": "function", + "file": "git2/deprecated.h", + "line": 527, + "lineto": 527, + "args": [ + { "name": "error_class", "type": "int", "comment": null }, + { "name": "string", "type": "const char *", "comment": null } + ], + "argline": "int error_class, const char *string", + "sig": "int::const char *", + "return": { "type": "void", "comment": null }, + "description": "

Sets the error message to the given string. This is an alias of\n git_error_set_str and is preserved for backward compatibility.

\n", + "comments": "

This function is deprecated, but there is no plan to remove this function at this time.

\n", + "group": "giterr" + }, + "giterr_set_oom": { + "type": "function", + "file": "git2/deprecated.h", + "line": 539, + "lineto": 539, + "args": [], + "argline": "", + "sig": "", + "return": { "type": "void", "comment": null }, + "description": "

Indicates that an out-of-memory situation occurred. This is an alias\n of git_error_set_oom and is preserved for backward compatibility.

\n", + "comments": "

This function is deprecated, but there is no plan to remove this function at this time.

\n", + "group": "giterr" + }, + "git_object__size": { + "type": "function", + "file": "git2/deprecated.h", + "line": 666, + "lineto": 666, + "args": [ + { + "name": "type", + "type": "git_object_t", + "comment": "object type to get its size" + } + ], + "argline": "git_object_t type", + "sig": "git_object_t", + "return": { "type": "size_t", "comment": " size in bytes of the object" }, + "description": "

Get the size in bytes for the structure which\n acts as an in-memory representation of any given\n object type.

\n", + "comments": "

For all the core types, this would the equivalent of calling sizeof(git_commit) if the core types were not opaque on the external API.

\n", + "group": "object" + }, + "git_remote_is_valid_name": { + "type": "function", + "file": "git2/deprecated.h", + "line": 687, + "lineto": 687, + "args": [ + { + "name": "remote_name", + "type": "const char *", + "comment": "name to be checked." + } + ], + "argline": "const char *remote_name", + "sig": "const char *", + "return": { + "type": "int", + "comment": " 1 if the reference name is acceptable; 0 if it isn't" + }, + "description": "

Ensure the remote name is well-formed.

\n", + "comments": "", + "group": "remote" + }, + "git_reference_is_valid_name": { + "type": "function", + "file": "git2/deprecated.h", + "line": 741, + "lineto": 741, + "args": [ + { + "name": "refname", + "type": "const char *", + "comment": "name to be checked." + } + ], + "argline": "const char *refname", + "sig": "const char *", + "return": { + "type": "int", + "comment": " 1 if the reference name is acceptable; 0 if it isn't" + }, + "description": "

Ensure the reference name is well-formed.

\n", + "comments": "

Valid reference names must follow one of two patterns:

\n\n
    \n
  1. Top-level names must contain only capital letters and underscores, and must begin and end with a letter. (e.g. "HEAD", "ORIG_HEAD"). 2. Names prefixed with "refs/" can be almost anything. You must avoid the characters '~', '^', ':', '\\', '?', '[', and '*', and the sequences ".." and "@{" which have special meaning to revparse.
  2. \n
\n", + "group": "reference" + }, + "git_oidarray_free": { + "type": "function", + "file": "git2/deprecated.h", + "line": 922, + "lineto": 922, + "args": [{ "name": "array", "type": "git_oidarray *", "comment": null }], + "argline": "git_oidarray *array", + "sig": "git_oidarray *", + "return": { "type": "void", "comment": null }, + "description": "

Free the memory referred to by the git_oidarray. This is an alias of\n git_oidarray_dispose and is preserved for backward compatibility.

\n", + "comments": "

This function is deprecated, but there is no plan to remove this function at this time.

\n", + "group": "oidarray" + }, + "git_strarray_copy": { + "type": "function", + "file": "git2/deprecated.h", + "line": 991, + "lineto": 991, + "args": [ + { "name": "tgt", "type": "git_strarray *", "comment": "target" }, + { "name": "src", "type": "const git_strarray *", "comment": "source" } + ], + "argline": "git_strarray *tgt, const git_strarray *src", + "sig": "git_strarray *::const git_strarray *", + "return": { + "type": "int", + "comment": " 0 on success, \n<\n 0 on allocation failure" + }, + "description": "

Copy a string array object from source to target.

\n", + "comments": "

This function is deprecated, but there is no plan to remove this function at this time.

\n", + "group": "strarray" + }, + "git_strarray_free": { + "type": "function", + "file": "git2/deprecated.h", + "line": 1003, + "lineto": 1003, + "args": [{ "name": "array", "type": "git_strarray *", "comment": null }], + "argline": "git_strarray *array", + "sig": "git_strarray *", + "return": { "type": "void", "comment": null }, + "description": "

Free the memory referred to by the git_strarray. This is an alias of\n git_strarray_dispose and is preserved for backward compatibility.

\n", + "comments": "

This function is deprecated, but there is no plan to remove this function at this time.

\n", + "group": "strarray" + }, + "git_blame_init_options": { + "type": "function", + "file": "git2/deprecated.h", + "line": 1035, + "lineto": 1035, + "args": [ + { "name": "opts", "type": "git_blame_options *", "comment": null }, + { "name": "version", "type": "unsigned int", "comment": null } + ], + "argline": "git_blame_options *opts, unsigned int version", + "sig": "git_blame_options *::unsigned int", + "return": { "type": "int", "comment": null }, + "description": "", + "comments": "

These functions are retained for backward compatibility. The newer versions of these functions should be preferred in all new code.

\n\n

There is no plan to remove these backward compatibility functions at this time.

\n\n

@{

\n", + "group": "blame" + }, + "git_describe_options_init": { + "type": "function", + "file": "git2/describe.h", + "line": 91, + "lineto": 91, + "args": [ + { + "name": "opts", + "type": "git_describe_options *", + "comment": "The `git_describe_options` struct to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "The struct version; pass `GIT_DESCRIBE_OPTIONS_VERSION`." + } + ], + "argline": "git_describe_options *opts, unsigned int version", + "sig": "git_describe_options *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initialize git_describe_options structure

\n", + "comments": "

Initializes a git_describe_options with default values. Equivalent to creating an instance with GIT_DESCRIBE_OPTIONS_INIT.

\n", + "group": "describe", + "examples": { + "describe.c": ["ex/v1.9.1/describe.html#git_describe_options_init-1"] + } + }, + "git_describe_format_options_init": { + "type": "function", + "file": "git2/describe.h", + "line": 141, + "lineto": 141, + "args": [ + { + "name": "opts", + "type": "git_describe_format_options *", + "comment": "The `git_describe_format_options` struct to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "The struct version; pass `GIT_DESCRIBE_FORMAT_OPTIONS_VERSION`." + } + ], + "argline": "git_describe_format_options *opts, unsigned int version", + "sig": "git_describe_format_options *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initialize git_describe_format_options structure

\n", + "comments": "

Initializes a git_describe_format_options with default values. Equivalent to creating an instance with GIT_DESCRIBE_FORMAT_OPTIONS_INIT.

\n", + "group": "describe", + "examples": { + "describe.c": [ + "ex/v1.9.1/describe.html#git_describe_format_options_init-2" + ] + } + }, + "git_describe_commit": { + "type": "function", + "file": "git2/describe.h", + "line": 159, + "lineto": 162, + "args": [ + { + "name": "result", + "type": "git_describe_result **", + "comment": "pointer to store the result. You must free this once\n you're done with it." + }, + { + "name": "committish", + "type": "git_object *", + "comment": "a committish to describe" + }, + { + "name": "opts", + "type": "git_describe_options *", + "comment": "the lookup options (or NULL for defaults)" + } + ], + "argline": "git_describe_result **result, git_object *committish, git_describe_options *opts", + "sig": "git_describe_result **::git_object *::git_describe_options *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Describe a commit

\n", + "comments": "

Perform the describe operation on the given committish object.

\n", + "group": "describe", + "examples": { + "describe.c": ["ex/v1.9.1/describe.html#git_describe_commit-3"] + } + }, + "git_describe_workdir": { + "type": "function", + "file": "git2/describe.h", + "line": 177, + "lineto": 180, + "args": [ + { + "name": "out", + "type": "git_describe_result **", + "comment": "pointer to store the result. You must free this once\n you're done with it." + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository in which to perform the describe" + }, + { + "name": "opts", + "type": "git_describe_options *", + "comment": "the lookup options (or NULL for defaults)" + } + ], + "argline": "git_describe_result **out, git_repository *repo, git_describe_options *opts", + "sig": "git_describe_result **::git_repository *::git_describe_options *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Describe a commit

\n", + "comments": "

Perform the describe operation on the current commit and the worktree. After performing describe on HEAD, a status is run and the description is considered to be dirty if there are.

\n", + "group": "describe", + "examples": { + "describe.c": ["ex/v1.9.1/describe.html#git_describe_workdir-4"] + } + }, + "git_describe_format": { + "type": "function", + "file": "git2/describe.h", + "line": 191, + "lineto": 194, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": "The buffer to store the result" + }, + { + "name": "result", + "type": "const git_describe_result *", + "comment": "the result from `git_describe_commit()` or\n `git_describe_workdir()`." + }, + { + "name": "opts", + "type": "const git_describe_format_options *", + "comment": "the formatting options (or NULL for defaults)" + } + ], + "argline": "git_buf *out, const git_describe_result *result, const git_describe_format_options *opts", + "sig": "git_buf *::const git_describe_result *::const git_describe_format_options *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Print the describe result to a buffer

\n", + "comments": "", + "group": "describe", + "examples": { + "describe.c": ["ex/v1.9.1/describe.html#git_describe_format-5"] + } + }, + "git_describe_result_free": { + "type": "function", + "file": "git2/describe.h", + "line": 201, + "lineto": 201, + "args": [ + { + "name": "result", + "type": "git_describe_result *", + "comment": "The result to free." + } + ], + "argline": "git_describe_result *result", + "sig": "git_describe_result *", + "return": { "type": "void", "comment": null }, + "description": "

Free the describe result.

\n", + "comments": "", + "group": "describe" + }, + "git_diff_options_init": { + "type": "function", + "file": "git2/diff.h", + "line": 492, + "lineto": 494, + "args": [ + { + "name": "opts", + "type": "git_diff_options *", + "comment": "The `git_diff_options` struct to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "The struct version; pass `GIT_DIFF_OPTIONS_VERSION`." + } + ], + "argline": "git_diff_options *opts, unsigned int version", + "sig": "git_diff_options *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initialize git_diff_options structure

\n", + "comments": "

Initializes a git_diff_options with default values. Equivalent to creating an instance with GIT_DIFF_OPTIONS_INIT.

\n", + "group": "diff" + }, + "git_diff_find_options_init": { + "type": "function", + "file": "git2/diff.h", + "line": 846, + "lineto": 848, + "args": [ + { + "name": "opts", + "type": "git_diff_find_options *", + "comment": "The `git_diff_find_options` struct to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "The struct version; pass `GIT_DIFF_FIND_OPTIONS_VERSION`." + } + ], + "argline": "git_diff_find_options *opts, unsigned int version", + "sig": "git_diff_find_options *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initialize git_diff_find_options structure

\n", + "comments": "

Initializes a git_diff_find_options with default values. Equivalent to creating an instance with GIT_DIFF_FIND_OPTIONS_INIT.

\n", + "group": "diff" + }, + "git_diff_free": { + "type": "function", + "file": "git2/diff.h", + "line": 862, + "lineto": 862, + "args": [ + { + "name": "diff", + "type": "git_diff *", + "comment": "The previously created diff; cannot be used after free." + } + ], + "argline": "git_diff *diff", + "sig": "git_diff *", + "return": { "type": "void", "comment": null }, + "description": "

Deallocate a diff.

\n", + "comments": "", + "group": "diff", + "examples": { + "diff.c": ["ex/v1.9.1/diff.html#git_diff_free-3"], + "log.c": [ + "ex/v1.9.1/log.html#git_diff_free-25", + "ex/v1.9.1/log.html#git_diff_free-26" + ] + } + }, + "git_diff_tree_to_tree": { + "type": "function", + "file": "git2/diff.h", + "line": 881, + "lineto": 886, + "args": [ + { + "name": "diff", + "type": "git_diff **", + "comment": "Output pointer to a git_diff pointer to be allocated." + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "The repository containing the trees." + }, + { + "name": "old_tree", + "type": "git_tree *", + "comment": "A git_tree object to diff from, or NULL for empty tree." + }, + { + "name": "new_tree", + "type": "git_tree *", + "comment": "A git_tree object to diff to, or NULL for empty tree." + }, + { + "name": "opts", + "type": "const git_diff_options *", + "comment": "Structure with options to influence diff or NULL for defaults." + } + ], + "argline": "git_diff **diff, git_repository *repo, git_tree *old_tree, git_tree *new_tree, const git_diff_options *opts", + "sig": "git_diff **::git_repository *::git_tree *::git_tree *::const git_diff_options *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Create a diff with the difference between two tree objects.

\n", + "comments": "

This is equivalent to git diff <old-tree> <new-tree>

\n\n

The first tree will be used for the "old_file" side of the delta and the second tree will be used for the "new_file" side of the delta. You can pass NULL to indicate an empty tree, although it is an error to pass NULL for both the old_tree and new_tree.

\n", + "group": "diff", + "examples": { + "diff.c": ["ex/v1.9.1/diff.html#git_diff_tree_to_tree-4"], + "log.c": [ + "ex/v1.9.1/log.html#git_diff_tree_to_tree-27", + "ex/v1.9.1/log.html#git_diff_tree_to_tree-28" + ] + } + }, + "git_diff_tree_to_index": { + "type": "function", + "file": "git2/diff.h", + "line": 908, + "lineto": 913, + "args": [ + { + "name": "diff", + "type": "git_diff **", + "comment": "Output pointer to a git_diff pointer to be allocated." + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "The repository containing the tree and index." + }, + { + "name": "old_tree", + "type": "git_tree *", + "comment": "A git_tree object to diff from, or NULL for empty tree." + }, + { + "name": "index", + "type": "git_index *", + "comment": "The index to diff with; repo index used if NULL." + }, + { + "name": "opts", + "type": "const git_diff_options *", + "comment": "Structure with options to influence diff or NULL for defaults." + } + ], + "argline": "git_diff **diff, git_repository *repo, git_tree *old_tree, git_index *index, const git_diff_options *opts", + "sig": "git_diff **::git_repository *::git_tree *::git_index *::const git_diff_options *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Create a diff between a tree and repository index.

\n", + "comments": "

This is equivalent to git diff --cached <treeish> or if you pass the HEAD tree, then like git diff --cached.

\n\n

The tree you pass will be used for the "old_file" side of the delta, and the index will be used for the "new_file" side of the delta.

\n\n

If you pass NULL for the index, then the existing index of the repo will be used. In this case, the index will be refreshed from disk (if it has changed) before the diff is generated.

\n", + "group": "diff", + "examples": { "diff.c": ["ex/v1.9.1/diff.html#git_diff_tree_to_index-5"] } + }, + "git_diff_index_to_workdir": { + "type": "function", + "file": "git2/diff.h", + "line": 936, + "lineto": 940, + "args": [ + { + "name": "diff", + "type": "git_diff **", + "comment": "Output pointer to a git_diff pointer to be allocated." + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "The repository." + }, + { + "name": "index", + "type": "git_index *", + "comment": "The index to diff from; repo index used if NULL." + }, + { + "name": "opts", + "type": "const git_diff_options *", + "comment": "Structure with options to influence diff or NULL for defaults." + } + ], + "argline": "git_diff **diff, git_repository *repo, git_index *index, const git_diff_options *opts", + "sig": "git_diff **::git_repository *::git_index *::const git_diff_options *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Create a diff between the repository index and the workdir directory.

\n", + "comments": "

This matches the git diff command. See the note below on git_diff_tree_to_workdir for a discussion of the difference between git diff and git diff HEAD and how to emulate a git diff <treeish> using libgit2.

\n\n

The index will be used for the "old_file" side of the delta, and the working directory will be used for the "new_file" side of the delta.

\n\n

If you pass NULL for the index, then the existing index of the repo will be used. In this case, the index will be refreshed from disk (if it has changed) before the diff is generated.

\n", + "group": "diff", + "examples": { + "diff.c": ["ex/v1.9.1/diff.html#git_diff_index_to_workdir-6"] + } + }, + "git_diff_tree_to_workdir": { + "type": "function", + "file": "git2/diff.h", + "line": 966, + "lineto": 970, + "args": [ + { + "name": "diff", + "type": "git_diff **", + "comment": "A pointer to a git_diff pointer that will be allocated." + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "The repository containing the tree." + }, + { + "name": "old_tree", + "type": "git_tree *", + "comment": "A git_tree object to diff from, or NULL for empty tree." + }, + { + "name": "opts", + "type": "const git_diff_options *", + "comment": "Structure with options to influence diff or NULL for defaults." + } + ], + "argline": "git_diff **diff, git_repository *repo, git_tree *old_tree, const git_diff_options *opts", + "sig": "git_diff **::git_repository *::git_tree *::const git_diff_options *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Create a diff between a tree and the working directory.

\n", + "comments": "

The tree you provide will be used for the "old_file" side of the delta, and the working directory will be used for the "new_file" side.

\n\n

This is not the same as git diff <treeish> or git diff-index <treeish>. Those commands use information from the index, whereas this function strictly returns the differences between the tree and the files in the working directory, regardless of the state of the index. Use git_diff_tree_to_workdir_with_index to emulate those commands.

\n\n

To see difference between this and git_diff_tree_to_workdir_with_index, consider the example of a staged file deletion where the file has then been put back into the working dir and further modified. The tree-to-workdir diff for that file is 'modified', but git diff would show status 'deleted' since there is a staged delete.

\n", + "group": "diff", + "examples": { + "diff.c": ["ex/v1.9.1/diff.html#git_diff_tree_to_workdir-7"] + } + }, + "git_diff_tree_to_workdir_with_index": { + "type": "function", + "file": "git2/diff.h", + "line": 986, + "lineto": 990, + "args": [ + { + "name": "diff", + "type": "git_diff **", + "comment": "A pointer to a git_diff pointer that will be allocated." + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "The repository containing the tree." + }, + { + "name": "old_tree", + "type": "git_tree *", + "comment": "A git_tree object to diff from, or NULL for empty tree." + }, + { + "name": "opts", + "type": "const git_diff_options *", + "comment": "Structure with options to influence diff or NULL for defaults." + } + ], + "argline": "git_diff **diff, git_repository *repo, git_tree *old_tree, const git_diff_options *opts", + "sig": "git_diff **::git_repository *::git_tree *::const git_diff_options *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Create a diff between a tree and the working directory using index data\n to account for staged deletes, tracked files, etc.

\n", + "comments": "

This emulates git diff <tree> by diffing the tree to the index and the index to the working directory and blending the results into a single diff that includes staged deleted, etc.

\n", + "group": "diff", + "examples": { + "diff.c": ["ex/v1.9.1/diff.html#git_diff_tree_to_workdir_with_index-8"] + } + }, + "git_diff_index_to_index": { + "type": "function", + "file": "git2/diff.h", + "line": 1005, + "lineto": 1010, + "args": [ + { + "name": "diff", + "type": "git_diff **", + "comment": "Output pointer to a git_diff pointer to be allocated." + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "The repository containing the indexes." + }, + { + "name": "old_index", + "type": "git_index *", + "comment": "A git_index object to diff from." + }, + { + "name": "new_index", + "type": "git_index *", + "comment": "A git_index object to diff to." + }, + { + "name": "opts", + "type": "const git_diff_options *", + "comment": "Structure with options to influence diff or NULL for defaults." + } + ], + "argline": "git_diff **diff, git_repository *repo, git_index *old_index, git_index *new_index, const git_diff_options *opts", + "sig": "git_diff **::git_repository *::git_index *::git_index *::const git_diff_options *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Create a diff with the difference between two index objects.

\n", + "comments": "

The first index will be used for the "old_file" side of the delta and the second index will be used for the "new_file" side of the delta.

\n", + "group": "diff" + }, + "git_diff_merge": { + "type": "function", + "file": "git2/diff.h", + "line": 1026, + "lineto": 1028, + "args": [ + { + "name": "onto", + "type": "git_diff *", + "comment": "Diff to merge into." + }, + { + "name": "from", + "type": "const git_diff *", + "comment": "Diff to merge." + } + ], + "argline": "git_diff *onto, const git_diff *from", + "sig": "git_diff *::const git_diff *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Merge one diff into another.

\n", + "comments": "

This merges items from the "from" list into the "onto" list. The resulting diff will have all items that appear in either list. If an item appears in both lists, then it will be "merged" to appear as if the old version was from the "onto" list and the new version is from the "from" list (with the exception that if the item has a pending DELETE in the middle, then it will show as deleted).

\n", + "group": "diff" + }, + "git_diff_find_similar": { + "type": "function", + "file": "git2/diff.h", + "line": 1042, + "lineto": 1044, + "args": [ + { + "name": "diff", + "type": "git_diff *", + "comment": "diff to run detection algorithms on" + }, + { + "name": "options", + "type": "const git_diff_find_options *", + "comment": "Control how detection should be run, NULL for defaults" + } + ], + "argline": "git_diff *diff, const git_diff_find_options *options", + "sig": "git_diff *::const git_diff_find_options *", + "return": { "type": "int", "comment": " 0 on success, -1 on failure" }, + "description": "

Transform a diff marking file renames, copies, etc.

\n", + "comments": "

This modifies a diff in place, replacing old entries that look like renames or copies with new entries reflecting those changes. This also will, if requested, break modified files into add/remove pairs if the amount of change is above a threshold.

\n", + "group": "diff", + "examples": { "diff.c": ["ex/v1.9.1/diff.html#git_diff_find_similar-9"] } + }, + "git_diff_num_deltas": { + "type": "function", + "file": "git2/diff.h", + "line": 1062, + "lineto": 1062, + "args": [ + { + "name": "diff", + "type": "const git_diff *", + "comment": "A git_diff generated by one of the above functions" + } + ], + "argline": "const git_diff *diff", + "sig": "const git_diff *", + "return": { + "type": "size_t", + "comment": " Count of number of deltas in the list" + }, + "description": "

Query how many diff records are there in a diff.

\n", + "comments": "", + "group": "diff", + "examples": { "log.c": ["ex/v1.9.1/log.html#git_diff_num_deltas-29"] } + }, + "git_diff_num_deltas_of_type": { + "type": "function", + "file": "git2/diff.h", + "line": 1075, + "lineto": 1076, + "args": [ + { + "name": "diff", + "type": "const git_diff *", + "comment": "A git_diff generated by one of the above functions" + }, + { + "name": "type", + "type": "git_delta_t", + "comment": "A git_delta_t value to filter the count" + } + ], + "argline": "const git_diff *diff, git_delta_t type", + "sig": "const git_diff *::git_delta_t", + "return": { + "type": "size_t", + "comment": " Count of number of deltas matching delta_t type" + }, + "description": "

Query how many diff deltas are there in a diff filtered by type.

\n", + "comments": "

This works just like git_diff_num_deltas() with an extra parameter that is a git_delta_t and returns just the count of how many deltas match that particular type.

\n", + "group": "diff" + }, + "git_diff_get_delta": { + "type": "function", + "file": "git2/diff.h", + "line": 1095, + "lineto": 1096, + "args": [ + { + "name": "diff", + "type": "const git_diff *", + "comment": "Diff list object" + }, + { "name": "idx", "type": "size_t", "comment": "Index into diff list" } + ], + "argline": "const git_diff *diff, size_t idx", + "sig": "const git_diff *::size_t", + "return": { + "type": "const git_diff_delta *", + "comment": " Pointer to git_diff_delta (or NULL if `idx` out of range)" + }, + "description": "

Return the diff delta for an entry in the diff list.

\n", + "comments": "

The git_diff_delta pointer points to internal data and you do not have to release it when you are done with it. It will go away when the * git_diff (or any associated git_patch) goes away.

\n\n

Note that the flags on the delta related to whether it has binary content or not may not be set if there are no attributes set for the file and there has been no reason to load the file data at this point. For now, if you need those flags to be up to date, your only option is to either use git_diff_foreach or create a git_patch.

\n", + "group": "diff" + }, + "git_diff_is_sorted_icase": { + "type": "function", + "file": "git2/diff.h", + "line": 1104, + "lineto": 1104, + "args": [ + { + "name": "diff", + "type": "const git_diff *", + "comment": "diff to check" + } + ], + "argline": "const git_diff *diff", + "sig": "const git_diff *", + "return": { + "type": "int", + "comment": " 0 if case sensitive, 1 if case is ignored" + }, + "description": "

Check if deltas are sorted case sensitively or insensitively.

\n", + "comments": "", + "group": "diff" + }, + "git_diff_foreach": { + "type": "function", + "file": "git2/diff.h", + "line": 1132, + "lineto": 1138, + "args": [ + { + "name": "diff", + "type": "git_diff *", + "comment": "A git_diff generated by one of the above functions." + }, + { + "name": "file_cb", + "type": "git_diff_file_cb", + "comment": "Callback function to make per file in the diff." + }, + { + "name": "binary_cb", + "type": "git_diff_binary_cb", + "comment": "Optional callback to make for binary files." + }, + { + "name": "hunk_cb", + "type": "git_diff_hunk_cb", + "comment": "Optional callback to make per hunk of text diff. This\n callback is called to describe a range of lines in the\n diff. It will not be issued for binary files." + }, + { + "name": "line_cb", + "type": "git_diff_line_cb", + "comment": "Optional callback to make per line of diff text. This\n same callback will be made for context lines, added, and\n removed lines, and even for a deleted trailing newline." + }, + { + "name": "payload", + "type": "void *", + "comment": "Reference pointer that will be passed to your callbacks." + } + ], + "argline": "git_diff *diff, git_diff_file_cb file_cb, git_diff_binary_cb binary_cb, git_diff_hunk_cb hunk_cb, git_diff_line_cb line_cb, void *payload", + "sig": "git_diff *::git_diff_file_cb::git_diff_binary_cb::git_diff_hunk_cb::git_diff_line_cb::void *", + "return": { + "type": "int", + "comment": " 0 on success, non-zero callback return value, or error code" + }, + "description": "

Loop over all deltas in a diff issuing callbacks.

\n", + "comments": "

This will iterate through all of the files described in a diff. You should provide a file callback to learn about each file.

\n\n

The "hunk" and "line" callbacks are optional, and the text diff of the files will only be calculated if they are not NULL. Of course, these callbacks will not be invoked for binary files on the diff or for files whose only changed is a file mode change.

\n\n

Returning a non-zero value from any of the callbacks will terminate the iteration and return the value to the user.

\n", + "group": "diff" + }, + "git_diff_status_char": { + "type": "function", + "file": "git2/diff.h", + "line": 1151, + "lineto": 1151, + "args": [ + { + "name": "status", + "type": "git_delta_t", + "comment": "The git_delta_t value to look up" + } + ], + "argline": "git_delta_t status", + "sig": "git_delta_t", + "return": { + "type": "char", + "comment": " The single character label for that code" + }, + "description": "

Look up the single character abbreviation for a delta status code.

\n", + "comments": "

When you run git diff --name-status it uses single letter codes in the output such as 'A' for added, 'D' for deleted, 'M' for modified, etc. This function converts a git_delta_t value into these letters for your own purposes. GIT_DELTA_UNTRACKED will return a space (i.e. ' ').

\n", + "group": "diff" + }, + "git_diff_print": { + "type": "function", + "file": "git2/diff.h", + "line": 1177, + "lineto": 1181, + "args": [ + { + "name": "diff", + "type": "git_diff *", + "comment": "A git_diff generated by one of the above functions." + }, + { + "name": "format", + "type": "git_diff_format_t", + "comment": "A git_diff_format_t value to pick the text format." + }, + { + "name": "print_cb", + "type": "git_diff_line_cb", + "comment": "Callback to make per line of diff text." + }, + { + "name": "payload", + "type": "void *", + "comment": "Reference pointer that will be passed to your callback." + } + ], + "argline": "git_diff *diff, git_diff_format_t format, git_diff_line_cb print_cb, void *payload", + "sig": "git_diff *::git_diff_format_t::git_diff_line_cb::void *", + "return": { + "type": "int", + "comment": " 0 on success, non-zero callback return value, or error code" + }, + "description": "

Iterate over a diff generating formatted text output.

\n", + "comments": "

Returning a non-zero value from the callbacks will terminate the iteration and return the non-zero value to the caller.

\n", + "group": "diff", + "examples": { + "diff.c": ["ex/v1.9.1/diff.html#git_diff_print-10"], + "log.c": ["ex/v1.9.1/log.html#git_diff_print-30"] + } + }, + "git_diff_to_buf": { + "type": "function", + "file": "git2/diff.h", + "line": 1193, + "lineto": 1196, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": "A pointer to a user-allocated git_buf that will\n contain the diff text" + }, + { + "name": "diff", + "type": "git_diff *", + "comment": "A git_diff generated by one of the above functions." + }, + { + "name": "format", + "type": "git_diff_format_t", + "comment": "A git_diff_format_t value to pick the text format." + } + ], + "argline": "git_buf *out, git_diff *diff, git_diff_format_t format", + "sig": "git_buf *::git_diff *::git_diff_format_t", + "return": { "type": "int", "comment": " 0 on success or error code" }, + "description": "

Produce the complete formatted text output from a diff into a\n buffer.

\n", + "comments": "", + "group": "diff" + }, + "git_diff_blobs": { + "type": "function", + "file": "git2/diff.h", + "line": 1232, + "lineto": 1242, + "args": [ + { + "name": "old_blob", + "type": "const git_blob *", + "comment": "Blob for old side of diff, or NULL for empty blob" + }, + { + "name": "old_as_path", + "type": "const char *", + "comment": "Treat old blob as if it had this filename; can be NULL" + }, + { + "name": "new_blob", + "type": "const git_blob *", + "comment": "Blob for new side of diff, or NULL for empty blob" + }, + { + "name": "new_as_path", + "type": "const char *", + "comment": "Treat new blob as if it had this filename; can be NULL" + }, + { + "name": "options", + "type": "const git_diff_options *", + "comment": "Options for diff, or NULL for default options" + }, + { + "name": "file_cb", + "type": "git_diff_file_cb", + "comment": "Callback for \"file\"; made once if there is a diff; can be NULL" + }, + { + "name": "binary_cb", + "type": "git_diff_binary_cb", + "comment": "Callback for binary files; can be NULL" + }, + { + "name": "hunk_cb", + "type": "git_diff_hunk_cb", + "comment": "Callback for each hunk in diff; can be NULL" + }, + { + "name": "line_cb", + "type": "git_diff_line_cb", + "comment": "Callback for each line in diff; can be NULL" + }, + { + "name": "payload", + "type": "void *", + "comment": "Payload passed to each callback function" + } + ], + "argline": "const git_blob *old_blob, const char *old_as_path, const git_blob *new_blob, const char *new_as_path, const git_diff_options *options, git_diff_file_cb file_cb, git_diff_binary_cb binary_cb, git_diff_hunk_cb hunk_cb, git_diff_line_cb line_cb, void *payload", + "sig": "const git_blob *::const char *::const git_blob *::const char *::const git_diff_options *::git_diff_file_cb::git_diff_binary_cb::git_diff_hunk_cb::git_diff_line_cb::void *", + "return": { + "type": "int", + "comment": " 0 on success, non-zero callback return value, or error code" + }, + "description": "

Directly run a diff on two blobs.

\n", + "comments": "

Compared to a file, a blob lacks some contextual information. As such, the git_diff_file given to the callback will have some fake data; i.e. mode will be 0 and path will be NULL.

\n\n

NULL is allowed for either old_blob or new_blob and will be treated as an empty blob, with the oid set to NULL in the git_diff_file data. Passing NULL for both blobs is a noop; no callbacks will be made at all.

\n\n

We do run a binary content check on the blob content and if either blob looks like binary data, the git_diff_delta binary attribute will be set to 1 and no call to the hunk_cb nor line_cb will be made (unless you pass GIT_DIFF_FORCE_TEXT of course).

\n", + "group": "diff" + }, + "git_diff_blob_to_buffer": { + "type": "function", + "file": "git2/diff.h", + "line": 1269, + "lineto": 1280, + "args": [ + { + "name": "old_blob", + "type": "const git_blob *", + "comment": "Blob for old side of diff, or NULL for empty blob" + }, + { + "name": "old_as_path", + "type": "const char *", + "comment": "Treat old blob as if it had this filename; can be NULL" + }, + { + "name": "buffer", + "type": "const char *", + "comment": "Raw data for new side of diff, or NULL for empty" + }, + { + "name": "buffer_len", + "type": "size_t", + "comment": "Length of raw data for new side of diff" + }, + { + "name": "buffer_as_path", + "type": "const char *", + "comment": "Treat buffer as if it had this filename; can be NULL" + }, + { + "name": "options", + "type": "const git_diff_options *", + "comment": "Options for diff, or NULL for default options" + }, + { + "name": "file_cb", + "type": "git_diff_file_cb", + "comment": "Callback for \"file\"; made once if there is a diff; can be NULL" + }, + { + "name": "binary_cb", + "type": "git_diff_binary_cb", + "comment": "Callback for binary files; can be NULL" + }, + { + "name": "hunk_cb", + "type": "git_diff_hunk_cb", + "comment": "Callback for each hunk in diff; can be NULL" + }, + { + "name": "line_cb", + "type": "git_diff_line_cb", + "comment": "Callback for each line in diff; can be NULL" + }, + { + "name": "payload", + "type": "void *", + "comment": "Payload passed to each callback function" + } + ], + "argline": "const git_blob *old_blob, const char *old_as_path, const char *buffer, size_t buffer_len, const char *buffer_as_path, const git_diff_options *options, git_diff_file_cb file_cb, git_diff_binary_cb binary_cb, git_diff_hunk_cb hunk_cb, git_diff_line_cb line_cb, void *payload", + "sig": "const git_blob *::const char *::const char *::size_t::const char *::const git_diff_options *::git_diff_file_cb::git_diff_binary_cb::git_diff_hunk_cb::git_diff_line_cb::void *", + "return": { + "type": "int", + "comment": " 0 on success, non-zero callback return value, or error code" + }, + "description": "

Directly run a diff between a blob and a buffer.

\n", + "comments": "

As with git_diff_blobs, comparing a blob and buffer lacks some context, so the git_diff_file parameters to the callbacks will be faked a la the rules for git_diff_blobs().

\n\n

Passing NULL for old_blob will be treated as an empty blob (i.e. the file_cb will be invoked with GIT_DELTA_ADDED and the diff will be the entire content of the buffer added). Passing NULL to the buffer will do the reverse, with GIT_DELTA_REMOVED and blob content removed.

\n", + "group": "diff" + }, + "git_diff_buffers": { + "type": "function", + "file": "git2/diff.h", + "line": 1303, + "lineto": 1315, + "args": [ + { + "name": "old_buffer", + "type": "const void *", + "comment": "Raw data for old side of diff, or NULL for empty" + }, + { + "name": "old_len", + "type": "size_t", + "comment": "Length of the raw data for old side of the diff" + }, + { + "name": "old_as_path", + "type": "const char *", + "comment": "Treat old buffer as if it had this filename; can be NULL" + }, + { + "name": "new_buffer", + "type": "const void *", + "comment": "Raw data for new side of diff, or NULL for empty" + }, + { + "name": "new_len", + "type": "size_t", + "comment": "Length of raw data for new side of diff" + }, + { + "name": "new_as_path", + "type": "const char *", + "comment": "Treat buffer as if it had this filename; can be NULL" + }, + { + "name": "options", + "type": "const git_diff_options *", + "comment": "Options for diff, or NULL for default options" + }, + { + "name": "file_cb", + "type": "git_diff_file_cb", + "comment": "Callback for \"file\"; made once if there is a diff; can be NULL" + }, + { + "name": "binary_cb", + "type": "git_diff_binary_cb", + "comment": "Callback for binary files; can be NULL" + }, + { + "name": "hunk_cb", + "type": "git_diff_hunk_cb", + "comment": "Callback for each hunk in diff; can be NULL" + }, + { + "name": "line_cb", + "type": "git_diff_line_cb", + "comment": "Callback for each line in diff; can be NULL" + }, + { + "name": "payload", + "type": "void *", + "comment": "Payload passed to each callback function" + } + ], + "argline": "const void *old_buffer, size_t old_len, const char *old_as_path, const void *new_buffer, size_t new_len, const char *new_as_path, const git_diff_options *options, git_diff_file_cb file_cb, git_diff_binary_cb binary_cb, git_diff_hunk_cb hunk_cb, git_diff_line_cb line_cb, void *payload", + "sig": "const void *::size_t::const char *::const void *::size_t::const char *::const git_diff_options *::git_diff_file_cb::git_diff_binary_cb::git_diff_hunk_cb::git_diff_line_cb::void *", + "return": { + "type": "int", + "comment": " 0 on success, non-zero callback return value, or error code" + }, + "description": "

Directly run a diff between two buffers.

\n", + "comments": "

Even more than with git_diff_blobs, comparing two buffer lacks context, so the git_diff_file parameters to the callbacks will be faked a la the rules for git_diff_blobs().

\n", + "group": "diff" + }, + "git_diff_from_buffer": { + "type": "function", + "file": "git2/diff.h", + "line": 1355, + "lineto": 1362, + "args": [ + { + "name": "out", + "type": "git_diff **", + "comment": "A pointer to a git_diff pointer that will be allocated." + }, + { + "name": "content", + "type": "const char *", + "comment": "The contents of a patch file" + }, + { + "name": "content_len", + "type": "size_t", + "comment": "The length of the patch file contents" + } + ], + "argline": "git_diff **out, const char *content, size_t content_len", + "sig": "git_diff **::const char *::size_t", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Read the contents of a git patch file into a git_diff object.

\n", + "comments": "

The diff object produced is similar to the one that would be produced if you actually produced it computationally by comparing two trees, however there may be subtle differences. For example, a patch file likely contains abbreviated object IDs, so the object IDs in a git_diff_delta produced by this function will also be abbreviated.

\n\n

This function will only read patch files created by a git implementation, it will not read unified diffs produced by the diff program, nor any other types of patch files.

\n", + "group": "diff", + "examples": { + "diff.c": [ + "ex/v1.9.1/diff.html#git_diff_from_buffer-11", + "ex/v1.9.1/diff.html#git_diff_from_buffer-12" + ] + } + }, + "git_diff_get_stats": { + "type": "function", + "file": "git2/diff.h", + "line": 1398, + "lineto": 1400, + "args": [ + { + "name": "out", + "type": "git_diff_stats **", + "comment": "Structure containing the diff statistics." + }, + { + "name": "diff", + "type": "git_diff *", + "comment": "A git_diff generated by one of the above functions." + } + ], + "argline": "git_diff_stats **out, git_diff *diff", + "sig": "git_diff_stats **::git_diff *", + "return": { + "type": "int", + "comment": " 0 on success; non-zero on error" + }, + "description": "

Accumulate diff statistics for all patches.

\n", + "comments": "", + "group": "diff", + "examples": { "diff.c": ["ex/v1.9.1/diff.html#git_diff_get_stats-13"] } + }, + "git_diff_stats_files_changed": { + "type": "function", + "file": "git2/diff.h", + "line": 1408, + "lineto": 1409, + "args": [ + { + "name": "stats", + "type": "const git_diff_stats *", + "comment": "A `git_diff_stats` generated by one of the above functions." + } + ], + "argline": "const git_diff_stats *stats", + "sig": "const git_diff_stats *", + "return": { + "type": "size_t", + "comment": " total number of files changed in the diff" + }, + "description": "

Get the total number of files changed in a diff

\n", + "comments": "", + "group": "diff" + }, + "git_diff_stats_insertions": { + "type": "function", + "file": "git2/diff.h", + "line": 1417, + "lineto": 1418, + "args": [ + { + "name": "stats", + "type": "const git_diff_stats *", + "comment": "A `git_diff_stats` generated by one of the above functions." + } + ], + "argline": "const git_diff_stats *stats", + "sig": "const git_diff_stats *", + "return": { + "type": "size_t", + "comment": " total number of insertions in the diff" + }, + "description": "

Get the total number of insertions in a diff

\n", + "comments": "", + "group": "diff" + }, + "git_diff_stats_deletions": { + "type": "function", + "file": "git2/diff.h", + "line": 1426, + "lineto": 1427, + "args": [ + { + "name": "stats", + "type": "const git_diff_stats *", + "comment": "A `git_diff_stats` generated by one of the above functions." + } + ], + "argline": "const git_diff_stats *stats", + "sig": "const git_diff_stats *", + "return": { + "type": "size_t", + "comment": " total number of deletions in the diff" + }, + "description": "

Get the total number of deletions in a diff

\n", + "comments": "", + "group": "diff" + }, + "git_diff_stats_to_buf": { + "type": "function", + "file": "git2/diff.h", + "line": 1438, + "lineto": 1442, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": "buffer to store the formatted diff statistics in." + }, + { + "name": "stats", + "type": "const git_diff_stats *", + "comment": "A `git_diff_stats` generated by one of the above functions." + }, + { + "name": "format", + "type": "git_diff_stats_format_t", + "comment": "Formatting option." + }, + { + "name": "width", + "type": "size_t", + "comment": "Target width for output (only affects GIT_DIFF_STATS_FULL)" + } + ], + "argline": "git_buf *out, const git_diff_stats *stats, git_diff_stats_format_t format, size_t width", + "sig": "git_buf *::const git_diff_stats *::git_diff_stats_format_t::size_t", + "return": { + "type": "int", + "comment": " 0 on success; non-zero on error" + }, + "description": "

Print diff statistics to a git_buf.

\n", + "comments": "", + "group": "diff", + "examples": { "diff.c": ["ex/v1.9.1/diff.html#git_diff_stats_to_buf-14"] } + }, + "git_diff_stats_free": { + "type": "function", + "file": "git2/diff.h", + "line": 1450, + "lineto": 1450, + "args": [ + { + "name": "stats", + "type": "git_diff_stats *", + "comment": "The previously created statistics object;\n cannot be used after free." + } + ], + "argline": "git_diff_stats *stats", + "sig": "git_diff_stats *", + "return": { "type": "void", "comment": null }, + "description": "

Deallocate a git_diff_stats.

\n", + "comments": "", + "group": "diff", + "examples": { "diff.c": ["ex/v1.9.1/diff.html#git_diff_stats_free-15"] } + }, + "git_diff_patchid_options_init": { + "type": "function", + "file": "git2/diff.h", + "line": 1479, + "lineto": 1481, + "args": [ + { + "name": "opts", + "type": "git_diff_patchid_options *", + "comment": "The `git_diff_patchid_options` struct to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "The struct version; pass `GIT_DIFF_PATCHID_OPTIONS_VERSION`." + } + ], + "argline": "git_diff_patchid_options *opts, unsigned int version", + "sig": "git_diff_patchid_options *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initialize git_diff_patchid_options structure

\n", + "comments": "

Initializes a git_diff_patchid_options with default values. Equivalent to creating an instance with GIT_DIFF_PATCHID_OPTIONS_INIT.

\n", + "group": "diff" + }, + "git_diff_patchid": { + "type": "function", + "file": "git2/diff.h", + "line": 1502, + "lineto": 1502, + "args": [ + { + "name": "out", + "type": "git_oid *", + "comment": "Pointer where the calculated patch ID should be stored" + }, + { + "name": "diff", + "type": "git_diff *", + "comment": "The diff to calculate the ID for" + }, + { + "name": "opts", + "type": "git_diff_patchid_options *", + "comment": "Options for how to calculate the patch ID. This is\n intended for future changes, as currently no options are\n available." + } + ], + "argline": "git_oid *out, git_diff *diff, git_diff_patchid_options *opts", + "sig": "git_oid *::git_diff *::git_diff_patchid_options *", + "return": { + "type": "int", + "comment": " 0 on success, an error code otherwise." + }, + "description": "

Calculate the patch ID for the given patch.

\n", + "comments": "

Calculate a stable patch ID for the given patch by summing the hash of the file diffs, ignoring whitespace and line numbers. This can be used to derive whether two diffs are the same with a high probability.

\n\n

Currently, this function only calculates stable patch IDs, as defined in git-patch-id(1), and should in fact generate the same IDs as the upstream git project does.

\n", + "group": "diff" + }, + "git_email_create_from_commit": { + "type": "function", + "file": "git2/email.h", + "line": 99, + "lineto": 102, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": "buffer to store the e-mail patch in" + }, + { + "name": "commit", + "type": "git_commit *", + "comment": "commit to create a patch for" + }, + { + "name": "opts", + "type": "const git_email_create_options *", + "comment": "email creation options" + } + ], + "argline": "git_buf *out, git_commit *commit, const git_email_create_options *opts", + "sig": "git_buf *::git_commit *::const git_email_create_options *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Create a diff for a commit in mbox format for sending via email.\n The commit must not be a merge commit.

\n", + "comments": "", + "group": "email" + }, + "git_error_last": { + "type": "function", + "file": "git2/errors.h", + "line": 149, + "lineto": 149, + "args": [], + "argline": "", + "sig": "", + "return": { + "type": "const git_error *", + "comment": " A pointer to a `git_error` object that describes the error." + }, + "description": "

Return the last git_error object that was generated for the\n current thread.

\n", + "comments": "

This function will never return NULL.

\n\n

Callers should not rely on this to determine whether an error has occurred. For error checking, callers should examine the return codes of libgit2 functions.

\n\n

This call can only reliably report error messages when an error has occurred. (It may contain stale information if it is called after a different function that succeeds.)

\n\n

The memory for this object is managed by libgit2. It should not be freed.

\n", + "group": "error", + "examples": { + "checkout.c": [ + "ex/v1.9.1/checkout.html#git_error_last-11", + "ex/v1.9.1/checkout.html#git_error_last-12", + "ex/v1.9.1/checkout.html#git_error_last-13", + "ex/v1.9.1/checkout.html#git_error_last-14" + ], + "commit.c": ["ex/v1.9.1/commit.html#git_error_last-2"], + "config.c": [ + "ex/v1.9.1/config.html#git_error_last-6", + "ex/v1.9.1/config.html#git_error_last-7", + "ex/v1.9.1/config.html#git_error_last-8" + ], + "general.c": ["ex/v1.9.1/general.html#git_error_last-33"], + "merge.c": [ + "ex/v1.9.1/merge.html#git_error_last-8", + "ex/v1.9.1/merge.html#git_error_last-9" + ] + } + }, + "git_filter_list_load": { + "type": "function", + "file": "git2/filter.h", + "line": 138, + "lineto": 144, + "args": [ + { + "name": "filters", + "type": "git_filter_list **", + "comment": "Output newly created git_filter_list (or NULL)" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository object that contains `path`" + }, + { + "name": "blob", + "type": "git_blob *", + "comment": "The blob to which the filter will be applied (if known)" + }, + { + "name": "path", + "type": "const char *", + "comment": "Relative path of the file to be filtered" + }, + { + "name": "mode", + "type": "git_filter_mode_t", + "comment": "Filtering direction (WT->ODB or ODB->WT)" + }, + { + "name": "flags", + "type": "uint32_t", + "comment": "Combination of `git_filter_flag_t` flags" + } + ], + "argline": "git_filter_list **filters, git_repository *repo, git_blob *blob, const char *path, git_filter_mode_t mode, uint32_t flags", + "sig": "git_filter_list **::git_repository *::git_blob *::const char *::git_filter_mode_t::uint32_t", + "return": { + "type": "int", + "comment": " 0 on success (which could still return NULL if no filters are\n needed for the requested file), \n<\n0 on error" + }, + "description": "

Load the filter list for a given path.

\n", + "comments": "

This will return 0 (success) but set the output git_filter_list to NULL if no filters are requested for the given file.

\n", + "group": "filter" + }, + "git_filter_list_load_ext": { + "type": "function", + "file": "git2/filter.h", + "line": 161, + "lineto": 167, + "args": [ + { + "name": "filters", + "type": "git_filter_list **", + "comment": "Output newly created git_filter_list (or NULL)" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository object that contains `path`" + }, + { + "name": "blob", + "type": "git_blob *", + "comment": "The blob to which the filter will be applied (if known)" + }, + { + "name": "path", + "type": "const char *", + "comment": "Relative path of the file to be filtered" + }, + { + "name": "mode", + "type": "git_filter_mode_t", + "comment": "Filtering direction (WT->ODB or ODB->WT)" + }, + { + "name": "opts", + "type": "git_filter_options *", + "comment": "The `git_filter_options` to use when loading filters" + } + ], + "argline": "git_filter_list **filters, git_repository *repo, git_blob *blob, const char *path, git_filter_mode_t mode, git_filter_options *opts", + "sig": "git_filter_list **::git_repository *::git_blob *::const char *::git_filter_mode_t::git_filter_options *", + "return": { + "type": "int", + "comment": " 0 on success (which could still return NULL if no filters are\n needed for the requested file), \n<\n0 on error" + }, + "description": "

Load the filter list for a given path.

\n", + "comments": "

This will return 0 (success) but set the output git_filter_list to NULL if no filters are requested for the given file.

\n", + "group": "filter" + }, + "git_filter_list_contains": { + "type": "function", + "file": "git2/filter.h", + "line": 181, + "lineto": 183, + "args": [ + { + "name": "filters", + "type": "git_filter_list *", + "comment": "A loaded git_filter_list (or NULL)" + }, + { + "name": "name", + "type": "const char *", + "comment": "The name of the filter to query" + } + ], + "argline": "git_filter_list *filters, const char *name", + "sig": "git_filter_list *::const char *", + "return": { + "type": "int", + "comment": " 1 if the filter is in the list, 0 otherwise" + }, + "description": "

Query the filter list to see if a given filter (by name) will run.\n The built-in filters "crlf" and "ident" can be queried, otherwise this\n is the name of the filter specified by the filter attribute.

\n", + "comments": "

This will return 0 if the given filter is not in the list, or 1 if the filter will be applied.

\n", + "group": "filter" + }, + "git_filter_list_apply_to_buffer": { + "type": "function", + "file": "git2/filter.h", + "line": 194, + "lineto": 198, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": "Buffer to store the result of the filtering" + }, + { + "name": "filters", + "type": "git_filter_list *", + "comment": "A loaded git_filter_list (or NULL)" + }, + { + "name": "in", + "type": "const char *", + "comment": "Buffer containing the data to filter" + }, + { + "name": "in_len", + "type": "size_t", + "comment": "The length of the input buffer" + } + ], + "argline": "git_buf *out, git_filter_list *filters, const char *in, size_t in_len", + "sig": "git_buf *::git_filter_list *::const char *::size_t", + "return": { + "type": "int", + "comment": " 0 on success, an error code otherwise" + }, + "description": "

Apply filter list to a data buffer.

\n", + "comments": "", + "group": "filter" + }, + "git_filter_list_apply_to_file": { + "type": "function", + "file": "git2/filter.h", + "line": 210, + "lineto": 214, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": "buffer into which to store the filtered file" + }, + { + "name": "filters", + "type": "git_filter_list *", + "comment": "the list of filters to apply" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository in which to perform the filtering" + }, + { + "name": "path", + "type": "const char *", + "comment": "the path of the file to filter, a relative path will be\n taken as relative to the workdir" + } + ], + "argline": "git_buf *out, git_filter_list *filters, git_repository *repo, const char *path", + "sig": "git_buf *::git_filter_list *::git_repository *::const char *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Apply a filter list to the contents of a file on disk

\n", + "comments": "", + "group": "filter" + }, + "git_filter_list_apply_to_blob": { + "type": "function", + "file": "git2/filter.h", + "line": 224, + "lineto": 227, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": "buffer into which to store the filtered file" + }, + { + "name": "filters", + "type": "git_filter_list *", + "comment": "the list of filters to apply" + }, + { + "name": "blob", + "type": "git_blob *", + "comment": "the blob to filter" + } + ], + "argline": "git_buf *out, git_filter_list *filters, git_blob *blob", + "sig": "git_buf *::git_filter_list *::git_blob *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Apply a filter list to the contents of a blob

\n", + "comments": "", + "group": "filter" + }, + "git_filter_list_stream_buffer": { + "type": "function", + "file": "git2/filter.h", + "line": 238, + "lineto": 242, + "args": [ + { + "name": "filters", + "type": "git_filter_list *", + "comment": "the list of filters to apply" + }, + { + "name": "buffer", + "type": "const char *", + "comment": "the buffer to filter" + }, + { + "name": "len", + "type": "size_t", + "comment": "the size of the buffer" + }, + { + "name": "target", + "type": "git_writestream *", + "comment": "the stream into which the data will be written" + } + ], + "argline": "git_filter_list *filters, const char *buffer, size_t len, git_writestream *target", + "sig": "git_filter_list *::const char *::size_t::git_writestream *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Apply a filter list to an arbitrary buffer as a stream

\n", + "comments": "", + "group": "filter" + }, + "git_filter_list_stream_file": { + "type": "function", + "file": "git2/filter.h", + "line": 254, + "lineto": 258, + "args": [ + { + "name": "filters", + "type": "git_filter_list *", + "comment": "the list of filters to apply" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository in which to perform the filtering" + }, + { + "name": "path", + "type": "const char *", + "comment": "the path of the file to filter, a relative path will be\n taken as relative to the workdir" + }, + { + "name": "target", + "type": "git_writestream *", + "comment": "the stream into which the data will be written" + } + ], + "argline": "git_filter_list *filters, git_repository *repo, const char *path, git_writestream *target", + "sig": "git_filter_list *::git_repository *::const char *::git_writestream *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Apply a filter list to a file as a stream

\n", + "comments": "", + "group": "filter" + }, + "git_filter_list_stream_blob": { + "type": "function", + "file": "git2/filter.h", + "line": 268, + "lineto": 271, + "args": [ + { + "name": "filters", + "type": "git_filter_list *", + "comment": "the list of filters to apply" + }, + { + "name": "blob", + "type": "git_blob *", + "comment": "the blob to filter" + }, + { + "name": "target", + "type": "git_writestream *", + "comment": "the stream into which the data will be written" + } + ], + "argline": "git_filter_list *filters, git_blob *blob, git_writestream *target", + "sig": "git_filter_list *::git_blob *::git_writestream *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Apply a filter list to a blob as a stream

\n", + "comments": "", + "group": "filter" + }, + "git_filter_list_free": { + "type": "function", + "file": "git2/filter.h", + "line": 278, + "lineto": 278, + "args": [ + { + "name": "filters", + "type": "git_filter_list *", + "comment": "A git_filter_list created by `git_filter_list_load`" + } + ], + "argline": "git_filter_list *filters", + "sig": "git_filter_list *", + "return": { "type": "void", "comment": null }, + "description": "

Free a git_filter_list

\n", + "comments": "", + "group": "filter" + }, + "git_libgit2_init": { + "type": "function", + "file": "git2/global.h", + "line": 32, + "lineto": 32, + "args": [], + "argline": "", + "sig": "", + "return": { + "type": "int", + "comment": " the number of initializations of the library, or an error code." + }, + "description": "

Init the global state

\n", + "comments": "

This function must be called before any other libgit2 function in order to set up global state and threading.

\n\n

This function may be called multiple times - it will return the number of times the initialization has been called (including this one) that have not subsequently been shutdown.

\n", + "group": "libgit2", + "examples": { + "general.c": ["ex/v1.9.1/general.html#git_libgit2_init-34"] + } + }, + "git_libgit2_shutdown": { + "type": "function", + "file": "git2/global.h", + "line": 45, + "lineto": 45, + "args": [], + "argline": "", + "sig": "", + "return": { + "type": "int", + "comment": " the number of remaining initializations of the library, or an\n error code." + }, + "description": "

Shutdown the global state

\n", + "comments": "

Clean up the global state and threading context after calling it as many times as git_libgit2_init() was called - it will return the number of remainining initializations that have not been shutdown (after this one).

\n", + "group": "libgit2" + }, + "git_graph_ahead_behind": { + "type": "function", + "file": "git2/graph.h", + "line": 38, + "lineto": 38, + "args": [ + { + "name": "ahead", + "type": "size_t *", + "comment": "number of unique from commits in `upstream`" + }, + { + "name": "behind", + "type": "size_t *", + "comment": "number of unique from commits in `local`" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository where the commits exist" + }, + { + "name": "local", + "type": "const git_oid *", + "comment": "the commit for local" + }, + { + "name": "upstream", + "type": "const git_oid *", + "comment": "the commit for upstream" + } + ], + "argline": "size_t *ahead, size_t *behind, git_repository *repo, const git_oid *local, const git_oid *upstream", + "sig": "size_t *::size_t *::git_repository *::const git_oid *::const git_oid *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Count the number of unique commits between two commit objects

\n", + "comments": "

There is no need for branches containing the commits to have any upstream relationship, but it helps to think of one as a branch and the other as its upstream, the ahead and behind values will be what git would report for the branches.

\n", + "group": "graph" + }, + "git_graph_descendant_of": { + "type": "function", + "file": "git2/graph.h", + "line": 53, + "lineto": 56, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository where the commits exist" + }, + { + "name": "commit", + "type": "const git_oid *", + "comment": "a previously loaded commit" + }, + { + "name": "ancestor", + "type": "const git_oid *", + "comment": "a potential ancestor commit" + } + ], + "argline": "git_repository *repo, const git_oid *commit, const git_oid *ancestor", + "sig": "git_repository *::const git_oid *::const git_oid *", + "return": { + "type": "int", + "comment": " 1 if the given commit is a descendant of the potential ancestor,\n 0 if not, error code otherwise." + }, + "description": "

Determine if a commit is the descendant of another commit.

\n", + "comments": "

Note that a commit is not considered a descendant of itself, in contrast to git merge-base --is-ancestor.

\n", + "group": "graph" + }, + "git_graph_reachable_from_any": { + "type": "function", + "file": "git2/graph.h", + "line": 69, + "lineto": 73, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository where the commits exist" + }, + { + "name": "commit", + "type": "const git_oid *", + "comment": "a previously loaded commit" + }, + { + "name": "descendant_array", + "type": "const git_oid []", + "comment": "oids of the commits" + }, + { + "name": "length", + "type": "size_t", + "comment": "the number of commits in the provided `descendant_array`" + } + ], + "argline": "git_repository *repo, const git_oid *commit, const git_oid [] descendant_array, size_t length", + "sig": "git_repository *::const git_oid *::const git_oid []::size_t", + "return": { + "type": "int", + "comment": " 1 if the given commit is an ancestor of any of the given potential\n descendants, 0 if not, error code otherwise." + }, + "description": "

Determine if a commit is reachable from any of a list of commits by\n following parent edges.

\n", + "comments": "", + "group": "graph" + }, + "git_ignore_add_rule": { + "type": "function", + "file": "git2/ignore.h", + "line": 46, + "lineto": 48, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "The repository to add ignore rules to." + }, + { + "name": "rules", + "type": "const char *", + "comment": "Text of rules, the contents to add on a .gitignore file.\n It is okay to have multiple rules in the text; if so,\n each rule should be terminated with a newline." + } + ], + "argline": "git_repository *repo, const char *rules", + "sig": "git_repository *::const char *", + "return": { "type": "int", "comment": " 0 on success" }, + "description": "

Add ignore rules for a repository.

\n", + "comments": "

Excludesfile rules (i.e. .gitignore rules) are generally read from .gitignore files in the repository tree or from a shared system file only if a "core.excludesfile" config value is set. The library also keeps a set of per-repository internal ignores that can be configured in-memory and will not persist. This function allows you to add to that internal rules list.

\n\n

Example usage:

\n\n
 error = git_ignore_add_rule(myrepo, "*.c/ with space");\n
\n\n

This would add three rules to the ignores.

\n", + "group": "ignore" + }, + "git_ignore_clear_internal_rules": { + "type": "function", + "file": "git2/ignore.h", + "line": 61, + "lineto": 62, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "The repository to remove ignore rules from." + } + ], + "argline": "git_repository *repo", + "sig": "git_repository *", + "return": { "type": "int", "comment": " 0 on success" }, + "description": "

Clear ignore rules that were explicitly added.

\n", + "comments": "

Resets to the default internal ignore rules. This will not turn off rules in .gitignore files that actually exist in the filesystem.

\n\n

The default internal ignores ignore ".", ".." and ".git" entries.

\n", + "group": "ignore" + }, + "git_ignore_path_is_ignored": { + "type": "function", + "file": "git2/ignore.h", + "line": 80, + "lineto": 83, + "args": [ + { + "name": "ignored", + "type": "int *", + "comment": "boolean returning 0 if the file is not ignored, 1 if it is" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "a repository object" + }, + { + "name": "path", + "type": "const char *", + "comment": "the file to check ignores for, relative to the repo's workdir." + } + ], + "argline": "int *ignored, git_repository *repo, const char *path", + "sig": "int *::git_repository *::const char *", + "return": { + "type": "int", + "comment": " 0 if ignore rules could be processed for the file (regardless\n of whether it exists or not), or an error \n<\n 0 if they could not." + }, + "description": "

Test if the ignore rules apply to a given path.

\n", + "comments": "

This function checks the ignore rules to see if they would apply to the given file. This indicates if the file would be ignored regardless of whether the file is already in the index or committed to the repository.

\n\n

One way to think of this is if you were to do "git check-ignore --no-index" on the given file, would it be shown or not?

\n", + "group": "ignore" + }, + "git_index_open": { + "type": "function", + "file": "git2/index.h", + "line": 278, + "lineto": 278, + "args": [ + { + "name": "index_out", + "type": "git_index **", + "comment": "the pointer for the new index" + }, + { + "name": "index_path", + "type": "const char *", + "comment": "the path to the index file in disk" + } + ], + "argline": "git_index **index_out, const char *index_path", + "sig": "git_index **::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Create a new bare Git index object as a memory representation\n of the Git index file in 'index_path', without a repository\n to back it.

\n", + "comments": "

Since there is no ODB or working directory behind this index, any Index methods which rely on these (e.g. index_add_bypath) will fail with the GIT_ERROR error code.

\n\n

If you need to access the index of an actual repository, use the git_repository_index wrapper.

\n\n

The index must be freed once it's no longer in use.

\n", + "group": "index" + }, + "git_index_new": { + "type": "function", + "file": "git2/index.h", + "line": 291, + "lineto": 291, + "args": [ + { + "name": "index_out", + "type": "git_index **", + "comment": "the pointer for the new index" + } + ], + "argline": "git_index **index_out", + "sig": "git_index **", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Create an in-memory index object.

\n", + "comments": "

This index object cannot be read/written to the filesystem, but may be used to perform in-memory index operations.

\n\n

The index must be freed once it's no longer in use.

\n", + "group": "index" + }, + "git_index_free": { + "type": "function", + "file": "git2/index.h", + "line": 300, + "lineto": 300, + "args": [ + { + "name": "index", + "type": "git_index *", + "comment": "an existing index object" + } + ], + "argline": "git_index *index", + "sig": "git_index *", + "return": { "type": "void", "comment": null }, + "description": "

Free an existing index object.

\n", + "comments": "", + "group": "index", + "examples": { + "add.c": ["ex/v1.9.1/add.html#git_index_free-1"], + "commit.c": ["ex/v1.9.1/commit.html#git_index_free-3"], + "general.c": ["ex/v1.9.1/general.html#git_index_free-35"], + "init.c": ["ex/v1.9.1/init.html#git_index_free-2"], + "ls-files.c": ["ex/v1.9.1/ls-files.html#git_index_free-1"] + } + }, + "git_index_owner": { + "type": "function", + "file": "git2/index.h", + "line": 308, + "lineto": 308, + "args": [ + { "name": "index", "type": "const git_index *", "comment": "The index" } + ], + "argline": "const git_index *index", + "sig": "const git_index *", + "return": { + "type": "git_repository *", + "comment": " A pointer to the repository" + }, + "description": "

Get the repository this index relates to

\n", + "comments": "", + "group": "index" + }, + "git_index_caps": { + "type": "function", + "file": "git2/index.h", + "line": 316, + "lineto": 316, + "args": [ + { + "name": "index", + "type": "const git_index *", + "comment": "An existing index object" + } + ], + "argline": "const git_index *index", + "sig": "const git_index *", + "return": { + "type": "int", + "comment": " A combination of GIT_INDEX_CAPABILITY values" + }, + "description": "

Read index capabilities flags.

\n", + "comments": "", + "group": "index" + }, + "git_index_set_caps": { + "type": "function", + "file": "git2/index.h", + "line": 329, + "lineto": 329, + "args": [ + { + "name": "index", + "type": "git_index *", + "comment": "An existing index object" + }, + { + "name": "caps", + "type": "int", + "comment": "A combination of GIT_INDEX_CAPABILITY values" + } + ], + "argline": "git_index *index, int caps", + "sig": "git_index *::int", + "return": { "type": "int", "comment": " 0 on success, -1 on failure" }, + "description": "

Set index capabilities flags.

\n", + "comments": "

If you pass GIT_INDEX_CAPABILITY_FROM_OWNER for the caps, then capabilities will be read from the config of the owner object, looking at core.ignorecase, core.filemode, core.symlinks.

\n", + "group": "index" + }, + "git_index_version": { + "type": "function", + "file": "git2/index.h", + "line": 341, + "lineto": 341, + "args": [ + { + "name": "index", + "type": "git_index *", + "comment": "An existing index object" + } + ], + "argline": "git_index *index", + "sig": "git_index *", + "return": { "type": "unsigned int", "comment": " the index version" }, + "description": "

Get index on-disk version.

\n", + "comments": "

Valid return values are 2, 3, or 4. If 3 is returned, an index with version 2 may be written instead, if the extension data in version 3 is not necessary.

\n", + "group": "index" + }, + "git_index_set_version": { + "type": "function", + "file": "git2/index.h", + "line": 354, + "lineto": 354, + "args": [ + { + "name": "index", + "type": "git_index *", + "comment": "An existing index object" + }, + { + "name": "version", + "type": "unsigned int", + "comment": "The new version number" + } + ], + "argline": "git_index *index, unsigned int version", + "sig": "git_index *::unsigned int", + "return": { "type": "int", "comment": " 0 on success, -1 on failure" }, + "description": "

Set index on-disk version.

\n", + "comments": "

Valid values are 2, 3, or 4. If 2 is given, git_index_write may write an index with version 3 instead, if necessary to accurately represent the index.

\n", + "group": "index" + }, + "git_index_read": { + "type": "function", + "file": "git2/index.h", + "line": 373, + "lineto": 373, + "args": [ + { + "name": "index", + "type": "git_index *", + "comment": "an existing index object" + }, + { + "name": "force", + "type": "int", + "comment": "if true, always reload, vs. only read if file has changed" + } + ], + "argline": "git_index *index, int force", + "sig": "git_index *::int", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Update the contents of an existing index object in memory by reading\n from the hard disk.

\n", + "comments": "

If force is true, this performs a "hard" read that discards in-memory changes and always reloads the on-disk index data. If there is no on-disk version, the index will be cleared.

\n\n

If force is false, this does a "soft" read that reloads the index data from disk only if it has changed since the last time it was loaded. Purely in-memory index data will be untouched. Be aware: if there are changes on disk, unwritten in-memory changes are discarded.

\n", + "group": "index" + }, + "git_index_write": { + "type": "function", + "file": "git2/index.h", + "line": 382, + "lineto": 382, + "args": [ + { + "name": "index", + "type": "git_index *", + "comment": "an existing index object" + } + ], + "argline": "git_index *index", + "sig": "git_index *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Write an existing index object from memory back to disk\n using an atomic file lock.

\n", + "comments": "", + "group": "index", + "examples": { + "add.c": ["ex/v1.9.1/add.html#git_index_write-2"], + "commit.c": ["ex/v1.9.1/commit.html#git_index_write-4"] + } + }, + "git_index_path": { + "type": "function", + "file": "git2/index.h", + "line": 390, + "lineto": 390, + "args": [ + { + "name": "index", + "type": "const git_index *", + "comment": "an existing index object" + } + ], + "argline": "const git_index *index", + "sig": "const git_index *", + "return": { + "type": "const char *", + "comment": " path to index file or NULL for in-memory index" + }, + "description": "

Get the full path to the index file on disk.

\n", + "comments": "", + "group": "index" + }, + "git_index_checksum": { + "type": "function", + "file": "git2/index.h", + "line": 404, + "lineto": 404, + "args": [ + { + "name": "index", + "type": "git_index *", + "comment": "an existing index object" + } + ], + "argline": "git_index *index", + "sig": "git_index *", + "return": { + "type": "const git_oid *", + "comment": " a pointer to the checksum of the index" + }, + "description": "

Get the checksum of the index

\n", + "comments": "

This checksum is the SHA-1 hash over the index file (except the last 20 bytes which are the checksum itself). In cases where the index does not exist on-disk, it will be zeroed out.

\n", + "group": "index" + }, + "git_index_read_tree": { + "type": "function", + "file": "git2/index.h", + "line": 416, + "lineto": 416, + "args": [ + { + "name": "index", + "type": "git_index *", + "comment": "an existing index object" + }, + { + "name": "tree", + "type": "const git_tree *", + "comment": "tree to read" + } + ], + "argline": "git_index *index, const git_tree *tree", + "sig": "git_index *::const git_tree *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Read a tree into the index file with stats

\n", + "comments": "

The current index contents will be replaced by the specified tree.

\n", + "group": "index" + }, + "git_index_write_tree": { + "type": "function", + "file": "git2/index.h", + "line": 437, + "lineto": 437, + "args": [ + { + "name": "out", + "type": "git_oid *", + "comment": "Pointer where to store the OID of the written tree" + }, + { "name": "index", "type": "git_index *", "comment": "Index to write" } + ], + "argline": "git_oid *out, git_index *index", + "sig": "git_oid *::git_index *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_EUNMERGED when the index is not clean\n or an error code" + }, + "description": "

Write the index as a tree

\n", + "comments": "

This method will scan the index and write a representation of its current state back to disk; it recursively creates tree objects for each of the subtrees stored in the index, but only returns the OID of the root tree. This is the OID that can be used e.g. to create a commit.

\n\n

The index instance cannot be bare, and needs to be associated to an existing repository.

\n\n

The index must not contain any file in conflict.

\n", + "group": "index", + "examples": { + "commit.c": ["ex/v1.9.1/commit.html#git_index_write_tree-5"], + "init.c": ["ex/v1.9.1/init.html#git_index_write_tree-3"], + "merge.c": ["ex/v1.9.1/merge.html#git_index_write_tree-10"] + } + }, + "git_index_write_tree_to": { + "type": "function", + "file": "git2/index.h", + "line": 454, + "lineto": 454, + "args": [ + { + "name": "out", + "type": "git_oid *", + "comment": "Pointer where to store OID of the written tree" + }, + { "name": "index", "type": "git_index *", "comment": "Index to write" }, + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository where to write the tree" + } + ], + "argline": "git_oid *out, git_index *index, git_repository *repo", + "sig": "git_oid *::git_index *::git_repository *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_EUNMERGED when the index is not clean\n or an error code" + }, + "description": "

Write the index as a tree to the given repository

\n", + "comments": "

This method will do the same as git_index_write_tree, but letting the user choose the repository where the tree will be written.

\n\n

The index must not contain any file in conflict.

\n", + "group": "index" + }, + "git_index_entrycount": { + "type": "function", + "file": "git2/index.h", + "line": 473, + "lineto": 473, + "args": [ + { + "name": "index", + "type": "const git_index *", + "comment": "an existing index object" + } + ], + "argline": "const git_index *index", + "sig": "const git_index *", + "return": { + "type": "size_t", + "comment": " integer of count of current entries" + }, + "description": "

Get the count of entries currently in the index

\n", + "comments": "", + "group": "index", + "examples": { + "general.c": ["ex/v1.9.1/general.html#git_index_entrycount-36"], + "ls-files.c": ["ex/v1.9.1/ls-files.html#git_index_entrycount-2"] + } + }, + "git_index_clear": { + "type": "function", + "file": "git2/index.h", + "line": 484, + "lineto": 484, + "args": [ + { + "name": "index", + "type": "git_index *", + "comment": "an existing index object" + } + ], + "argline": "git_index *index", + "sig": "git_index *", + "return": { + "type": "int", + "comment": " 0 on success, error code \n<\n 0 on failure" + }, + "description": "

Clear the contents (all the entries) of an index object.

\n", + "comments": "

This clears the index object in memory; changes must be explicitly written to disk for them to take effect persistently.

\n", + "group": "index" + }, + "git_index_get_byindex": { + "type": "function", + "file": "git2/index.h", + "line": 497, + "lineto": 498, + "args": [ + { + "name": "index", + "type": "git_index *", + "comment": "an existing index object" + }, + { + "name": "n", + "type": "size_t", + "comment": "the position of the entry" + } + ], + "argline": "git_index *index, size_t n", + "sig": "git_index *::size_t", + "return": { + "type": "const git_index_entry *", + "comment": " a pointer to the entry; NULL if out of bounds" + }, + "description": "

Get a pointer to one of the entries in the index

\n", + "comments": "

The entry is not modifiable and should not be freed. Because the git_index_entry struct is a publicly defined struct, you should be able to make your own permanent copy of the data if necessary.

\n", + "group": "index", + "examples": { + "general.c": ["ex/v1.9.1/general.html#git_index_get_byindex-37"], + "ls-files.c": ["ex/v1.9.1/ls-files.html#git_index_get_byindex-3"] + } + }, + "git_index_get_bypath": { + "type": "function", + "file": "git2/index.h", + "line": 512, + "lineto": 513, + "args": [ + { + "name": "index", + "type": "git_index *", + "comment": "an existing index object" + }, + { "name": "path", "type": "const char *", "comment": "path to search" }, + { "name": "stage", "type": "int", "comment": "stage to search" } + ], + "argline": "git_index *index, const char *path, int stage", + "sig": "git_index *::const char *::int", + "return": { + "type": "const git_index_entry *", + "comment": " a pointer to the entry; NULL if it was not found" + }, + "description": "

Get a pointer to one of the entries in the index

\n", + "comments": "

The entry is not modifiable and should not be freed. Because the git_index_entry struct is a publicly defined struct, you should be able to make your own permanent copy of the data if necessary.

\n", + "group": "index", + "examples": { + "ls-files.c": ["ex/v1.9.1/ls-files.html#git_index_get_bypath-4"] + } + }, + "git_index_remove": { + "type": "function", + "file": "git2/index.h", + "line": 523, + "lineto": 523, + "args": [ + { + "name": "index", + "type": "git_index *", + "comment": "an existing index object" + }, + { "name": "path", "type": "const char *", "comment": "path to search" }, + { "name": "stage", "type": "int", "comment": "stage to search" } + ], + "argline": "git_index *index, const char *path, int stage", + "sig": "git_index *::const char *::int", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Remove an entry from the index

\n", + "comments": "", + "group": "index" + }, + "git_index_remove_directory": { + "type": "function", + "file": "git2/index.h", + "line": 533, + "lineto": 534, + "args": [ + { + "name": "index", + "type": "git_index *", + "comment": "an existing index object" + }, + { + "name": "dir", + "type": "const char *", + "comment": "container directory path" + }, + { "name": "stage", "type": "int", "comment": "stage to search" } + ], + "argline": "git_index *index, const char *dir, int stage", + "sig": "git_index *::const char *::int", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Remove all entries from the index under a given directory

\n", + "comments": "", + "group": "index" + }, + "git_index_add": { + "type": "function", + "file": "git2/index.h", + "line": 550, + "lineto": 550, + "args": [ + { + "name": "index", + "type": "git_index *", + "comment": "an existing index object" + }, + { + "name": "source_entry", + "type": "const git_index_entry *", + "comment": "new entry object" + } + ], + "argline": "git_index *index, const git_index_entry *source_entry", + "sig": "git_index *::const git_index_entry *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Add or update an index entry from an in-memory struct

\n", + "comments": "

If a previous index entry exists that has the same path and stage as the given 'source_entry', it will be replaced. Otherwise, the 'source_entry' will be added.

\n\n

A full copy (including the 'path' string) of the given 'source_entry' will be inserted on the index.

\n", + "group": "index" + }, + "git_index_entry_stage": { + "type": "function", + "file": "git2/index.h", + "line": 562, + "lineto": 562, + "args": [ + { + "name": "entry", + "type": "const git_index_entry *", + "comment": "The entry" + } + ], + "argline": "const git_index_entry *entry", + "sig": "const git_index_entry *", + "return": { "type": "int", "comment": " the stage number" }, + "description": "

Return the stage number from a git index entry

\n", + "comments": "

This entry is calculated from the entry's flag attribute like this:

\n\n
(entry->flags & GIT_INDEX_ENTRY_STAGEMASK) >> GIT_INDEX_ENTRY_STAGESHIFT\n
\n", + "group": "index" + }, + "git_index_entry_is_conflict": { + "type": "function", + "file": "git2/index.h", + "line": 571, + "lineto": 571, + "args": [ + { + "name": "entry", + "type": "const git_index_entry *", + "comment": "The entry" + } + ], + "argline": "const git_index_entry *entry", + "sig": "const git_index_entry *", + "return": { + "type": "int", + "comment": " 1 if the entry is a conflict entry, 0 otherwise" + }, + "description": "

Return whether the given index entry is a conflict (has a high stage\n entry). This is simply shorthand for git_index_entry_stage > 0.

\n", + "comments": "", + "group": "index" + }, + "git_index_iterator_new": { + "type": "function", + "file": "git2/index.h", + "line": 592, + "lineto": 594, + "args": [ + { + "name": "iterator_out", + "type": "git_index_iterator **", + "comment": "The newly created iterator" + }, + { + "name": "index", + "type": "git_index *", + "comment": "The index to iterate" + } + ], + "argline": "git_index_iterator **iterator_out, git_index *index", + "sig": "git_index_iterator **::git_index *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Create an iterator that will return every entry contained in the\n index at the time of creation. Entries are returned in order,\n sorted by path. This iterator is backed by a snapshot that allows\n callers to modify the index while iterating without affecting the\n iterator.

\n", + "comments": "", + "group": "index" + }, + "git_index_iterator_next": { + "type": "function", + "file": "git2/index.h", + "line": 603, + "lineto": 605, + "args": [ + { + "name": "out", + "type": "const git_index_entry **", + "comment": "Pointer to store the index entry in" + }, + { + "name": "iterator", + "type": "git_index_iterator *", + "comment": "The iterator" + } + ], + "argline": "const git_index_entry **out, git_index_iterator *iterator", + "sig": "const git_index_entry **::git_index_iterator *", + "return": { + "type": "int", + "comment": " 0, GIT_ITEROVER on iteration completion or an error code" + }, + "description": "

Return the next index entry in-order from the iterator.

\n", + "comments": "", + "group": "index" + }, + "git_index_iterator_free": { + "type": "function", + "file": "git2/index.h", + "line": 612, + "lineto": 612, + "args": [ + { + "name": "iterator", + "type": "git_index_iterator *", + "comment": "The iterator to free" + } + ], + "argline": "git_index_iterator *iterator", + "sig": "git_index_iterator *", + "return": { "type": "void", "comment": null }, + "description": "

Free the index iterator

\n", + "comments": "", + "group": "index" + }, + "git_index_add_bypath": { + "type": "function", + "file": "git2/index.h", + "line": 643, + "lineto": 643, + "args": [ + { + "name": "index", + "type": "git_index *", + "comment": "an existing index object" + }, + { "name": "path", "type": "const char *", "comment": "filename to add" } + ], + "argline": "git_index *index, const char *path", + "sig": "git_index *::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Add or update an index entry from a file on disk

\n", + "comments": "

The file path must be relative to the repository's working folder and must be readable.

\n\n

This method will fail in bare index instances.

\n\n

This forces the file to be added to the index, not looking at gitignore rules. Those rules can be evaluated through the git_status APIs (in status.h) before calling this.

\n\n

If this file currently is the result of a merge conflict, this file will no longer be marked as conflicting. The data about the conflict will be moved to the "resolve undo" (REUC) section.

\n", + "group": "index" + }, + "git_index_add_from_buffer": { + "type": "function", + "file": "git2/index.h", + "line": 671, + "lineto": 674, + "args": [ + { + "name": "index", + "type": "git_index *", + "comment": "an existing index object" + }, + { + "name": "entry", + "type": "const git_index_entry *", + "comment": "filename to add" + }, + { + "name": "buffer", + "type": "const void *", + "comment": "data to be written into the blob" + }, + { "name": "len", "type": "size_t", "comment": "length of the data" } + ], + "argline": "git_index *index, const git_index_entry *entry, const void *buffer, size_t len", + "sig": "git_index *::const git_index_entry *::const void *::size_t", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Add or update an index entry from a buffer in memory

\n", + "comments": "

This method will create a blob in the repository that owns the index and then add the index entry to the index. The path of the entry represents the position of the blob relative to the repository's root folder.

\n\n

If a previous index entry exists that has the same path as the given 'entry', it will be replaced. Otherwise, the 'entry' will be added.

\n\n

This forces the file to be added to the index, not looking at gitignore rules. Those rules can be evaluated through the git_status APIs (in status.h) before calling this.

\n\n

If this file currently is the result of a merge conflict, this file will no longer be marked as conflicting. The data about the conflict will be moved to the "resolve undo" (REUC) section.

\n", + "group": "index" + }, + "git_index_remove_bypath": { + "type": "function", + "file": "git2/index.h", + "line": 690, + "lineto": 690, + "args": [ + { + "name": "index", + "type": "git_index *", + "comment": "an existing index object" + }, + { + "name": "path", + "type": "const char *", + "comment": "filename to remove" + } + ], + "argline": "git_index *index, const char *path", + "sig": "git_index *::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Remove an index entry corresponding to a file on disk

\n", + "comments": "

The file path must be relative to the repository's working folder. It may exist.

\n\n

If this file currently is the result of a merge conflict, this file will no longer be marked as conflicting. The data about the conflict will be moved to the "resolve undo" (REUC) section.

\n", + "group": "index" + }, + "git_index_add_all": { + "type": "function", + "file": "git2/index.h", + "line": 738, + "lineto": 743, + "args": [ + { + "name": "index", + "type": "git_index *", + "comment": "an existing index object" + }, + { + "name": "pathspec", + "type": "const git_strarray *", + "comment": "array of path patterns" + }, + { + "name": "flags", + "type": "unsigned int", + "comment": "combination of git_index_add_option_t flags" + }, + { + "name": "callback", + "type": "git_index_matched_path_cb", + "comment": "notification callback for each added/updated path (also\n gets index of matching pathspec entry); can be NULL;\n return 0 to add, >0 to skip, \n<\n0 to abort scan." + }, + { + "name": "payload", + "type": "void *", + "comment": "payload passed through to callback function" + } + ], + "argline": "git_index *index, const git_strarray *pathspec, unsigned int flags, git_index_matched_path_cb callback, void *payload", + "sig": "git_index *::const git_strarray *::unsigned int::git_index_matched_path_cb::void *", + "return": { + "type": "int", + "comment": " 0 on success, negative callback return value, or error code" + }, + "description": "

Add or update index entries matching files in the working directory.

\n", + "comments": "

This method will fail in bare index instances.

\n\n

The pathspec is a list of file names or shell glob patterns that will be matched against files in the repository's working directory. Each file that matches will be added to the index (either updating an existing entry or adding a new entry). You can disable glob expansion and force exact matching with the GIT_INDEX_ADD_DISABLE_PATHSPEC_MATCH flag.

\n\n

Files that are ignored will be skipped (unlike git_index_add_bypath). If a file is already tracked in the index, then it will be updated even if it is ignored. Pass the GIT_INDEX_ADD_FORCE flag to skip the checking of ignore rules.

\n\n

To emulate git add -A and generate an error if the pathspec contains the exact path of an ignored file (when not using FORCE), add the GIT_INDEX_ADD_CHECK_PATHSPEC flag. This checks that each entry in the pathspec that is an exact match to a filename on disk is either not ignored or already in the index. If this check fails, the function will return GIT_EINVALIDSPEC.

\n\n

To emulate git add -A with the "dry-run" option, just use a callback function that always returns a positive value. See below for details.

\n\n

If any files are currently the result of a merge conflict, those files will no longer be marked as conflicting. The data about the conflicts will be moved to the "resolve undo" (REUC) section.

\n\n

If you provide a callback function, it will be invoked on each matching item in the working directory immediately before it is added to / updated in the index. Returning zero will add the item to the index, greater than zero will skip the item, and less than zero will abort the scan and return that value to the caller.

\n", + "group": "index", + "examples": { "add.c": ["ex/v1.9.1/add.html#git_index_add_all-3"] } + }, + "git_index_remove_all": { + "type": "function", + "file": "git2/index.h", + "line": 760, + "lineto": 764, + "args": [ + { + "name": "index", + "type": "git_index *", + "comment": "An existing index object" + }, + { + "name": "pathspec", + "type": "const git_strarray *", + "comment": "array of path patterns" + }, + { + "name": "callback", + "type": "git_index_matched_path_cb", + "comment": "notification callback for each removed path (also\n gets index of matching pathspec entry); can be NULL;\n return 0 to add, >0 to skip, \n<\n0 to abort scan." + }, + { + "name": "payload", + "type": "void *", + "comment": "payload passed through to callback function" + } + ], + "argline": "git_index *index, const git_strarray *pathspec, git_index_matched_path_cb callback, void *payload", + "sig": "git_index *::const git_strarray *::git_index_matched_path_cb::void *", + "return": { + "type": "int", + "comment": " 0 on success, negative callback return value, or error code" + }, + "description": "

Remove all matching index entries.

\n", + "comments": "

If you provide a callback function, it will be invoked on each matching item in the index immediately before it is removed. Return 0 to remove the item, > 0 to skip the item, and < 0 to abort the scan.

\n", + "group": "index" + }, + "git_index_update_all": { + "type": "function", + "file": "git2/index.h", + "line": 789, + "lineto": 793, + "args": [ + { + "name": "index", + "type": "git_index *", + "comment": "An existing index object" + }, + { + "name": "pathspec", + "type": "const git_strarray *", + "comment": "array of path patterns" + }, + { + "name": "callback", + "type": "git_index_matched_path_cb", + "comment": "notification callback for each updated path (also\n gets index of matching pathspec entry); can be NULL;\n return 0 to add, >0 to skip, \n<\n0 to abort scan." + }, + { + "name": "payload", + "type": "void *", + "comment": "payload passed through to callback function" + } + ], + "argline": "git_index *index, const git_strarray *pathspec, git_index_matched_path_cb callback, void *payload", + "sig": "git_index *::const git_strarray *::git_index_matched_path_cb::void *", + "return": { + "type": "int", + "comment": " 0 on success, negative callback return value, or error code" + }, + "description": "

Update all index entries to match the working directory

\n", + "comments": "

This method will fail in bare index instances.

\n\n

This scans the existing index entries and synchronizes them with the working directory, deleting them if the corresponding working directory file no longer exists otherwise updating the information (including adding the latest version of file to the ODB if needed).

\n\n

If you provide a callback function, it will be invoked on each matching item in the index immediately before it is updated (either refreshed or removed depending on working directory state). Return 0 to proceed with updating the item, > 0 to skip the item, and < 0 to abort the scan.

\n", + "group": "index", + "examples": { "add.c": ["ex/v1.9.1/add.html#git_index_update_all-4"] } + }, + "git_index_find": { + "type": "function", + "file": "git2/index.h", + "line": 804, + "lineto": 804, + "args": [ + { + "name": "at_pos", + "type": "size_t *", + "comment": "the address to which the position of the index entry is written (optional)" + }, + { + "name": "index", + "type": "git_index *", + "comment": "an existing index object" + }, + { "name": "path", "type": "const char *", "comment": "path to search" } + ], + "argline": "size_t *at_pos, git_index *index, const char *path", + "sig": "size_t *::git_index *::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Find the first position of any entries which point to given\n path in the Git index.

\n", + "comments": "", + "group": "index" + }, + "git_index_find_prefix": { + "type": "function", + "file": "git2/index.h", + "line": 815, + "lineto": 815, + "args": [ + { + "name": "at_pos", + "type": "size_t *", + "comment": "the address to which the position of the index entry is written (optional)" + }, + { + "name": "index", + "type": "git_index *", + "comment": "an existing index object" + }, + { + "name": "prefix", + "type": "const char *", + "comment": "the prefix to search for" + } + ], + "argline": "size_t *at_pos, git_index *index, const char *prefix", + "sig": "size_t *::git_index *::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Find the first position of any entries matching a prefix. To find the first position\n of a path inside a given folder, suffix the prefix with a '/'.

\n", + "comments": "", + "group": "index" + }, + "git_index_conflict_add": { + "type": "function", + "file": "git2/index.h", + "line": 840, + "lineto": 844, + "args": [ + { + "name": "index", + "type": "git_index *", + "comment": "an existing index object" + }, + { + "name": "ancestor_entry", + "type": "const git_index_entry *", + "comment": "the entry data for the ancestor of the conflict" + }, + { + "name": "our_entry", + "type": "const git_index_entry *", + "comment": "the entry data for our side of the merge conflict" + }, + { + "name": "their_entry", + "type": "const git_index_entry *", + "comment": "the entry data for their side of the merge conflict" + } + ], + "argline": "git_index *index, const git_index_entry *ancestor_entry, const git_index_entry *our_entry, const git_index_entry *their_entry", + "sig": "git_index *::const git_index_entry *::const git_index_entry *::const git_index_entry *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Add or update index entries to represent a conflict. Any staged\n entries that exist at the given paths will be removed.

\n", + "comments": "

The entries are the entries from the tree included in the merge. Any entry may be null to indicate that that file was not present in the trees during the merge. For example, ancestor_entry may be NULL to indicate that a file was added in both branches and must be resolved.

\n", + "group": "index" + }, + "git_index_conflict_get": { + "type": "function", + "file": "git2/index.h", + "line": 860, + "lineto": 865, + "args": [ + { + "name": "ancestor_out", + "type": "const git_index_entry **", + "comment": "Pointer to store the ancestor entry" + }, + { + "name": "our_out", + "type": "const git_index_entry **", + "comment": "Pointer to store the our entry" + }, + { + "name": "their_out", + "type": "const git_index_entry **", + "comment": "Pointer to store the their entry" + }, + { + "name": "index", + "type": "git_index *", + "comment": "an existing index object" + }, + { "name": "path", "type": "const char *", "comment": "path to search" } + ], + "argline": "const git_index_entry **ancestor_out, const git_index_entry **our_out, const git_index_entry **their_out, git_index *index, const char *path", + "sig": "const git_index_entry **::const git_index_entry **::const git_index_entry **::git_index *::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Get the index entries that represent a conflict of a single file.

\n", + "comments": "

The entries are not modifiable and should not be freed. Because the git_index_entry struct is a publicly defined struct, you should be able to make your own permanent copy of the data if necessary.

\n", + "group": "index" + }, + "git_index_conflict_remove": { + "type": "function", + "file": "git2/index.h", + "line": 874, + "lineto": 874, + "args": [ + { + "name": "index", + "type": "git_index *", + "comment": "an existing index object" + }, + { + "name": "path", + "type": "const char *", + "comment": "path to remove conflicts for" + } + ], + "argline": "git_index *index, const char *path", + "sig": "git_index *::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Removes the index entries that represent a conflict of a single file.

\n", + "comments": "", + "group": "index" + }, + "git_index_conflict_cleanup": { + "type": "function", + "file": "git2/index.h", + "line": 882, + "lineto": 882, + "args": [ + { + "name": "index", + "type": "git_index *", + "comment": "an existing index object" + } + ], + "argline": "git_index *index", + "sig": "git_index *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Remove all conflicts in the index (entries with a stage greater than 0).

\n", + "comments": "", + "group": "index" + }, + "git_index_has_conflicts": { + "type": "function", + "file": "git2/index.h", + "line": 890, + "lineto": 890, + "args": [ + { + "name": "index", + "type": "const git_index *", + "comment": "An existing index object." + } + ], + "argline": "const git_index *index", + "sig": "const git_index *", + "return": { + "type": "int", + "comment": " 1 if at least one conflict is found, 0 otherwise." + }, + "description": "

Determine if the index contains entries representing file conflicts.

\n", + "comments": "", + "group": "index", + "examples": { + "merge.c": ["ex/v1.9.1/merge.html#git_index_has_conflicts-11"] + } + }, + "git_index_conflict_iterator_new": { + "type": "function", + "file": "git2/index.h", + "line": 901, + "lineto": 903, + "args": [ + { + "name": "iterator_out", + "type": "git_index_conflict_iterator **", + "comment": "The newly created conflict iterator" + }, + { + "name": "index", + "type": "git_index *", + "comment": "The index to scan" + } + ], + "argline": "git_index_conflict_iterator **iterator_out, git_index *index", + "sig": "git_index_conflict_iterator **::git_index *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Create an iterator for the conflicts in the index.

\n", + "comments": "

The index must not be modified while iterating; the results are undefined.

\n", + "group": "index", + "examples": { + "merge.c": ["ex/v1.9.1/merge.html#git_index_conflict_iterator_new-12"] + } + }, + "git_index_conflict_next": { + "type": "function", + "file": "git2/index.h", + "line": 916, + "lineto": 920, + "args": [ + { + "name": "ancestor_out", + "type": "const git_index_entry **", + "comment": "Pointer to store the ancestor side of the conflict" + }, + { + "name": "our_out", + "type": "const git_index_entry **", + "comment": "Pointer to store our side of the conflict" + }, + { + "name": "their_out", + "type": "const git_index_entry **", + "comment": "Pointer to store their side of the conflict" + }, + { + "name": "iterator", + "type": "git_index_conflict_iterator *", + "comment": "The conflict iterator." + } + ], + "argline": "const git_index_entry **ancestor_out, const git_index_entry **our_out, const git_index_entry **their_out, git_index_conflict_iterator *iterator", + "sig": "const git_index_entry **::const git_index_entry **::const git_index_entry **::git_index_conflict_iterator *", + "return": { + "type": "int", + "comment": " 0 (no error), GIT_ITEROVER (iteration is done) or an error code\n (negative value)" + }, + "description": "

Returns the current conflict (ancestor, ours and theirs entry) and\n advance the iterator internally to the next value.

\n", + "comments": "", + "group": "index", + "examples": { + "merge.c": ["ex/v1.9.1/merge.html#git_index_conflict_next-13"] + } + }, + "git_index_conflict_iterator_free": { + "type": "function", + "file": "git2/index.h", + "line": 927, + "lineto": 928, + "args": [ + { + "name": "iterator", + "type": "git_index_conflict_iterator *", + "comment": "pointer to the iterator" + } + ], + "argline": "git_index_conflict_iterator *iterator", + "sig": "git_index_conflict_iterator *", + "return": { "type": "void", "comment": null }, + "description": "

Frees a git_index_conflict_iterator.

\n", + "comments": "", + "group": "index", + "examples": { + "merge.c": ["ex/v1.9.1/merge.html#git_index_conflict_iterator_free-14"] + } + }, + "git_indexer_options_init": { + "type": "function", + "file": "git2/indexer.h", + "line": 116, + "lineto": 118, + "args": [ + { + "name": "opts", + "type": "git_indexer_options *", + "comment": "the `git_indexer_options` struct to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "Version of struct; pass `GIT_INDEXER_OPTIONS_VERSION`" + } + ], + "argline": "git_indexer_options *opts, unsigned int version", + "sig": "git_indexer_options *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initializes a git_indexer_options with default values. Equivalent to\n creating an instance with GIT_INDEXER_OPTIONS_INIT.

\n", + "comments": "", + "group": "indexer" + }, + "git_indexer_new": { + "type": "function", + "file": "git2/indexer.h", + "line": 147, + "lineto": 152, + "args": [ + { + "name": "out", + "type": "git_indexer **", + "comment": "where to store the indexer instance" + }, + { + "name": "path", + "type": "const char *", + "comment": "to the directory where the packfile should be stored" + }, + { + "name": "mode", + "type": "unsigned int", + "comment": "permissions to use creating packfile or 0 for defaults" + }, + { + "name": "odb", + "type": "git_odb *", + "comment": "object database from which to read base objects when\n fixing thin packs. Pass NULL if no thin pack is expected (an error\n will be returned if there are bases missing)" + }, + { + "name": "opts", + "type": "git_indexer_options *", + "comment": "Optional structure containing additional options. See\n `git_indexer_options` above." + } + ], + "argline": "git_indexer **out, const char *path, unsigned int mode, git_odb *odb, git_indexer_options *opts", + "sig": "git_indexer **::const char *::unsigned int::git_odb *::git_indexer_options *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Create a new indexer instance

\n", + "comments": "", + "group": "indexer" + }, + "git_indexer_append": { + "type": "function", + "file": "git2/indexer.h", + "line": 164, + "lineto": 164, + "args": [ + { "name": "idx", "type": "git_indexer *", "comment": "the indexer" }, + { + "name": "data", + "type": "const void *", + "comment": "the data to add" + }, + { + "name": "size", + "type": "size_t", + "comment": "the size of the data in bytes" + }, + { + "name": "stats", + "type": "git_indexer_progress *", + "comment": "stat storage" + } + ], + "argline": "git_indexer *idx, const void *data, size_t size, git_indexer_progress *stats", + "sig": "git_indexer *::const void *::size_t::git_indexer_progress *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Add data to the indexer

\n", + "comments": "", + "group": "indexer" + }, + "git_indexer_commit": { + "type": "function", + "file": "git2/indexer.h", + "line": 175, + "lineto": 175, + "args": [ + { "name": "idx", "type": "git_indexer *", "comment": "the indexer" }, + { + "name": "stats", + "type": "git_indexer_progress *", + "comment": "Stat storage." + } + ], + "argline": "git_indexer *idx, git_indexer_progress *stats", + "sig": "git_indexer *::git_indexer_progress *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Finalize the pack and index

\n", + "comments": "

Resolve any pending deltas and write out the index file

\n", + "group": "indexer" + }, + "git_indexer_hash": { + "type": "function", + "file": "git2/indexer.h", + "line": 188, + "lineto": 188, + "args": [ + { + "name": "idx", + "type": "const git_indexer *", + "comment": "the indexer instance" + } + ], + "argline": "const git_indexer *idx", + "sig": "const git_indexer *", + "return": { + "type": "const git_oid *", + "comment": " the packfile's hash" + }, + "description": "

Get the packfile's hash

\n", + "comments": "

A packfile's name is derived from the sorted hashing of all object names. This is only correct after the index has been finalized.

\n", + "group": "indexer" + }, + "git_indexer_name": { + "type": "function", + "file": "git2/indexer.h", + "line": 200, + "lineto": 200, + "args": [ + { + "name": "idx", + "type": "const git_indexer *", + "comment": "the indexer instance" + } + ], + "argline": "const git_indexer *idx", + "sig": "const git_indexer *", + "return": { + "type": "const char *", + "comment": " a NUL terminated string for the packfile name" + }, + "description": "

Get the unique name for the resulting packfile.

\n", + "comments": "

The packfile's name is derived from the packfile's content. This is only correct after the index has been finalized.

\n", + "group": "indexer" + }, + "git_indexer_free": { + "type": "function", + "file": "git2/indexer.h", + "line": 207, + "lineto": 207, + "args": [ + { + "name": "idx", + "type": "git_indexer *", + "comment": "the indexer to free" + } + ], + "argline": "git_indexer *idx", + "sig": "git_indexer *", + "return": { "type": "void", "comment": null }, + "description": "

Free the indexer and its resources

\n", + "comments": "", + "group": "indexer" + }, + "git_mailmap_new": { + "type": "function", + "file": "git2/mailmap.h", + "line": 37, + "lineto": 37, + "args": [ + { + "name": "out", + "type": "git_mailmap **", + "comment": "pointer to store the new mailmap" + } + ], + "argline": "git_mailmap **out", + "sig": "git_mailmap **", + "return": { "type": "int", "comment": " 0 on success, or an error code" }, + "description": "

Allocate a new mailmap object.

\n", + "comments": "

This object is empty, so you'll have to add a mailmap file before you can do anything with it. The mailmap must be freed with 'git_mailmap_free'.

\n", + "group": "mailmap" + }, + "git_mailmap_free": { + "type": "function", + "file": "git2/mailmap.h", + "line": 44, + "lineto": 44, + "args": [ + { + "name": "mm", + "type": "git_mailmap *", + "comment": "the mailmap to free" + } + ], + "argline": "git_mailmap *mm", + "sig": "git_mailmap *", + "return": { "type": "void", "comment": null }, + "description": "

Free the mailmap and its associated memory.

\n", + "comments": "", + "group": "mailmap" + }, + "git_mailmap_add_entry": { + "type": "function", + "file": "git2/mailmap.h", + "line": 57, + "lineto": 59, + "args": [ + { + "name": "mm", + "type": "git_mailmap *", + "comment": "mailmap to add the entry to" + }, + { + "name": "real_name", + "type": "const char *", + "comment": "the real name to use, or NULL" + }, + { + "name": "real_email", + "type": "const char *", + "comment": "the real email to use, or NULL" + }, + { + "name": "replace_name", + "type": "const char *", + "comment": "the name to replace, or NULL" + }, + { + "name": "replace_email", + "type": "const char *", + "comment": "the email to replace" + } + ], + "argline": "git_mailmap *mm, const char *real_name, const char *real_email, const char *replace_name, const char *replace_email", + "sig": "git_mailmap *::const char *::const char *::const char *::const char *", + "return": { "type": "int", "comment": " 0 on success, or an error code" }, + "description": "

Add a single entry to the given mailmap object. If the entry already exists,\n it will be replaced with the new entry.

\n", + "comments": "", + "group": "mailmap" + }, + "git_mailmap_from_buffer": { + "type": "function", + "file": "git2/mailmap.h", + "line": 69, + "lineto": 70, + "args": [ + { + "name": "out", + "type": "git_mailmap **", + "comment": "pointer to store the new mailmap" + }, + { + "name": "buf", + "type": "const char *", + "comment": "buffer to parse the mailmap from" + }, + { + "name": "len", + "type": "size_t", + "comment": "the length of the input buffer" + } + ], + "argline": "git_mailmap **out, const char *buf, size_t len", + "sig": "git_mailmap **::const char *::size_t", + "return": { "type": "int", "comment": " 0 on success, or an error code" }, + "description": "

Create a new mailmap instance containing a single mailmap file

\n", + "comments": "", + "group": "mailmap" + }, + "git_mailmap_from_repository": { + "type": "function", + "file": "git2/mailmap.h", + "line": 86, + "lineto": 87, + "args": [ + { + "name": "out", + "type": "git_mailmap **", + "comment": "pointer to store the new mailmap" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "repository to load mailmap information from" + } + ], + "argline": "git_mailmap **out, git_repository *repo", + "sig": "git_mailmap **::git_repository *", + "return": { "type": "int", "comment": " 0 on success, or an error code" }, + "description": "

Create a new mailmap instance from a repository, loading mailmap files based\n on the repository's configuration.

\n", + "comments": "

Mailmaps are loaded in the following order: 1. '.mailmap' in the root of the repository's working directory, if present. 2. The blob object identified by the 'mailmap.blob' config entry, if set. [NOTE: 'mailmap.blob' defaults to 'HEAD:.mailmap' in bare repositories] 3. The path in the 'mailmap.file' config entry, if set.

\n", + "group": "mailmap" + }, + "git_mailmap_resolve": { + "type": "function", + "file": "git2/mailmap.h", + "line": 101, + "lineto": 103, + "args": [ + { + "name": "real_name", + "type": "const char **", + "comment": "pointer to store the real name" + }, + { + "name": "real_email", + "type": "const char **", + "comment": "pointer to store the real email" + }, + { + "name": "mm", + "type": "const git_mailmap *", + "comment": "the mailmap to perform a lookup with (may be NULL)" + }, + { + "name": "name", + "type": "const char *", + "comment": "the name to look up" + }, + { + "name": "email", + "type": "const char *", + "comment": "the email to look up" + } + ], + "argline": "const char **real_name, const char **real_email, const git_mailmap *mm, const char *name, const char *email", + "sig": "const char **::const char **::const git_mailmap *::const char *::const char *", + "return": { "type": "int", "comment": " 0 on success, or an error code" }, + "description": "

Resolve a name and email to the corresponding real name and email.

\n", + "comments": "

The lifetime of the strings are tied to mm, name, and email parameters.

\n", + "group": "mailmap" + }, + "git_mailmap_resolve_signature": { + "type": "function", + "file": "git2/mailmap.h", + "line": 115, + "lineto": 116, + "args": [ + { + "name": "out", + "type": "git_signature **", + "comment": "new signature" + }, + { + "name": "mm", + "type": "const git_mailmap *", + "comment": "mailmap to resolve with" + }, + { + "name": "sig", + "type": "const git_signature *", + "comment": "signature to resolve" + } + ], + "argline": "git_signature **out, const git_mailmap *mm, const git_signature *sig", + "sig": "git_signature **::const git_mailmap *::const git_signature *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Resolve a signature to use real names and emails with a mailmap.

\n", + "comments": "

Call git_signature_free() to free the data.

\n", + "group": "mailmap" + }, + "git_merge_file_input_init": { + "type": "function", + "file": "git2/merge.h", + "line": 66, + "lineto": 68, + "args": [ + { + "name": "opts", + "type": "git_merge_file_input *", + "comment": "the `git_merge_file_input` instance to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "the version of the struct; you should pass\n `GIT_MERGE_FILE_INPUT_VERSION` here." + } + ], + "argline": "git_merge_file_input *opts, unsigned int version", + "sig": "git_merge_file_input *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initializes a git_merge_file_input with default values. Equivalent to\n creating an instance with GIT_MERGE_FILE_INPUT_INIT.

\n", + "comments": "", + "group": "merge" + }, + "git_merge_file_options_init": { + "type": "function", + "file": "git2/merge.h", + "line": 243, + "lineto": 243, + "args": [ + { + "name": "opts", + "type": "git_merge_file_options *", + "comment": "The `git_merge_file_options` struct to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "The struct version; pass `GIT_MERGE_FILE_OPTIONS_VERSION`." + } + ], + "argline": "git_merge_file_options *opts, unsigned int version", + "sig": "git_merge_file_options *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initialize git_merge_file_options structure

\n", + "comments": "

Initializes a git_merge_file_options with default values. Equivalent to creating an instance with GIT_MERGE_FILE_OPTIONS_INIT.

\n", + "group": "merge" + }, + "git_merge_options_init": { + "type": "function", + "file": "git2/merge.h", + "line": 342, + "lineto": 342, + "args": [ + { + "name": "opts", + "type": "git_merge_options *", + "comment": "The `git_merge_options` struct to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "The struct version; pass `GIT_MERGE_OPTIONS_VERSION`." + } + ], + "argline": "git_merge_options *opts, unsigned int version", + "sig": "git_merge_options *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initialize git_merge_options structure

\n", + "comments": "

Initializes a git_merge_options with default values. Equivalent to creating an instance with GIT_MERGE_OPTIONS_INIT.

\n", + "group": "merge" + }, + "git_merge_analysis": { + "type": "function", + "file": "git2/merge.h", + "line": 412, + "lineto": 417, + "args": [ + { + "name": "analysis_out", + "type": "git_merge_analysis_t *", + "comment": "analysis enumeration that the result is written into" + }, + { + "name": "preference_out", + "type": "git_merge_preference_t *", + "comment": "One of the `git_merge_preference_t` flag." + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository to merge" + }, + { + "name": "their_heads", + "type": "const git_annotated_commit **", + "comment": "the heads to merge into" + }, + { + "name": "their_heads_len", + "type": "size_t", + "comment": "the number of heads to merge" + } + ], + "argline": "git_merge_analysis_t *analysis_out, git_merge_preference_t *preference_out, git_repository *repo, const git_annotated_commit **their_heads, size_t their_heads_len", + "sig": "git_merge_analysis_t *::git_merge_preference_t *::git_repository *::const git_annotated_commit **::size_t", + "return": { "type": "int", "comment": " 0 on success or error code" }, + "description": "

Analyzes the given branch(es) and determines the opportunities for\n merging them into the HEAD of the repository.

\n", + "comments": "", + "group": "merge", + "examples": { "merge.c": ["ex/v1.9.1/merge.html#git_merge_analysis-15"] } + }, + "git_merge_analysis_for_ref": { + "type": "function", + "file": "git2/merge.h", + "line": 431, + "lineto": 437, + "args": [ + { + "name": "analysis_out", + "type": "git_merge_analysis_t *", + "comment": "analysis enumeration that the result is written into" + }, + { + "name": "preference_out", + "type": "git_merge_preference_t *", + "comment": "One of the `git_merge_preference_t` flag." + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository to merge" + }, + { + "name": "our_ref", + "type": "git_reference *", + "comment": "the reference to perform the analysis from" + }, + { + "name": "their_heads", + "type": "const git_annotated_commit **", + "comment": "the heads to merge into" + }, + { + "name": "their_heads_len", + "type": "size_t", + "comment": "the number of heads to merge" + } + ], + "argline": "git_merge_analysis_t *analysis_out, git_merge_preference_t *preference_out, git_repository *repo, git_reference *our_ref, const git_annotated_commit **their_heads, size_t their_heads_len", + "sig": "git_merge_analysis_t *::git_merge_preference_t *::git_repository *::git_reference *::const git_annotated_commit **::size_t", + "return": { "type": "int", "comment": " 0 on success or error code" }, + "description": "

Analyzes the given branch(es) and determines the opportunities for\n merging them into a reference.

\n", + "comments": "", + "group": "merge" + }, + "git_merge_base": { + "type": "function", + "file": "git2/merge.h", + "line": 448, + "lineto": 452, + "args": [ + { + "name": "out", + "type": "git_oid *", + "comment": "the OID of a merge base between 'one' and 'two'" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository where the commits exist" + }, + { + "name": "one", + "type": "const git_oid *", + "comment": "one of the commits" + }, + { + "name": "two", + "type": "const git_oid *", + "comment": "the other commit" + } + ], + "argline": "git_oid *out, git_repository *repo, const git_oid *one, const git_oid *two", + "sig": "git_oid *::git_repository *::const git_oid *::const git_oid *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_ENOTFOUND if not found or error code" + }, + "description": "

Find a merge base between two commits

\n", + "comments": "", + "group": "merge", + "examples": { + "log.c": ["ex/v1.9.1/log.html#git_merge_base-31"], + "rev-parse.c": ["ex/v1.9.1/rev-parse.html#git_merge_base-1"] + } + }, + "git_merge_bases": { + "type": "function", + "file": "git2/merge.h", + "line": 463, + "lineto": 467, + "args": [ + { + "name": "out", + "type": "git_oidarray *", + "comment": "array in which to store the resulting ids" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository where the commits exist" + }, + { + "name": "one", + "type": "const git_oid *", + "comment": "one of the commits" + }, + { + "name": "two", + "type": "const git_oid *", + "comment": "the other commit" + } + ], + "argline": "git_oidarray *out, git_repository *repo, const git_oid *one, const git_oid *two", + "sig": "git_oidarray *::git_repository *::const git_oid *::const git_oid *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_ENOTFOUND if not found or error code" + }, + "description": "

Find merge bases between two commits

\n", + "comments": "", + "group": "merge" + }, + "git_merge_base_many": { + "type": "function", + "file": "git2/merge.h", + "line": 478, + "lineto": 482, + "args": [ + { + "name": "out", + "type": "git_oid *", + "comment": "the OID of a merge base considering all the commits" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository where the commits exist" + }, + { + "name": "length", + "type": "size_t", + "comment": "The number of commits in the provided `input_array`" + }, + { + "name": "input_array", + "type": "const git_oid []", + "comment": "oids of the commits" + } + ], + "argline": "git_oid *out, git_repository *repo, size_t length, const git_oid [] input_array", + "sig": "git_oid *::git_repository *::size_t::const git_oid []", + "return": { + "type": "int", + "comment": " Zero on success; GIT_ENOTFOUND or -1 on failure." + }, + "description": "

Find a merge base given a list of commits

\n", + "comments": "", + "group": "merge" + }, + "git_merge_bases_many": { + "type": "function", + "file": "git2/merge.h", + "line": 524, + "lineto": 528, + "args": [ + { + "name": "out", + "type": "git_oidarray *", + "comment": "array in which to store the resulting ids" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository where the commits exist" + }, + { + "name": "length", + "type": "size_t", + "comment": "The number of commits in the provided `input_array`" + }, + { + "name": "input_array", + "type": "const git_oid []", + "comment": "oids of the commits" + } + ], + "argline": "git_oidarray *out, git_repository *repo, size_t length, const git_oid [] input_array", + "sig": "git_oidarray *::git_repository *::size_t::const git_oid []", + "return": { + "type": "int", + "comment": " Zero on success; GIT_ENOTFOUND or -1 on failure." + }, + "description": "

Find all merge bases given a list of commits

\n", + "comments": "

This behaves similar to git merge-base.

\n\n

Given three commits a, b, and c, merge_base_many will compute a hypothetical commit m, which is a merge between b and c.

\n\n

For example, with the following topology: text o---o---o---o---C / / o---o---o---B / / ---2---1---o---o---o---A

\n\n

the result of merge_base_many given a, b, and c is 1. This is because the equivalent topology with the imaginary merge commit m between b and c is: text o---o---o---o---o / \\ / o---o---o---o---M / / ---2---1---o---o---o---A

\n\n

and the result of merge_base_many given a and m is 1.

\n\n

If you're looking to recieve the common ancestor between all the given commits, use merge_base_octopus.

\n", + "group": "merge" + }, + "git_merge_base_octopus": { + "type": "function", + "file": "git2/merge.h", + "line": 539, + "lineto": 543, + "args": [ + { + "name": "out", + "type": "git_oid *", + "comment": "the OID of a merge base considering all the commits" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository where the commits exist" + }, + { + "name": "length", + "type": "size_t", + "comment": "The number of commits in the provided `input_array`" + }, + { + "name": "input_array", + "type": "const git_oid []", + "comment": "oids of the commits" + } + ], + "argline": "git_oid *out, git_repository *repo, size_t length, const git_oid [] input_array", + "sig": "git_oid *::git_repository *::size_t::const git_oid []", + "return": { + "type": "int", + "comment": " Zero on success; GIT_ENOTFOUND or -1 on failure." + }, + "description": "

Find a merge base in preparation for an octopus merge

\n", + "comments": "", + "group": "merge" + }, + "git_merge_file": { + "type": "function", + "file": "git2/merge.h", + "line": 561, + "lineto": 566, + "args": [ + { + "name": "out", + "type": "git_merge_file_result *", + "comment": "The git_merge_file_result to be filled in" + }, + { + "name": "ancestor", + "type": "const git_merge_file_input *", + "comment": "The contents of the ancestor file" + }, + { + "name": "ours", + "type": "const git_merge_file_input *", + "comment": "The contents of the file in \"our\" side" + }, + { + "name": "theirs", + "type": "const git_merge_file_input *", + "comment": "The contents of the file in \"their\" side" + }, + { + "name": "opts", + "type": "const git_merge_file_options *", + "comment": "The merge file options or `NULL` for defaults" + } + ], + "argline": "git_merge_file_result *out, const git_merge_file_input *ancestor, const git_merge_file_input *ours, const git_merge_file_input *theirs, const git_merge_file_options *opts", + "sig": "git_merge_file_result *::const git_merge_file_input *::const git_merge_file_input *::const git_merge_file_input *::const git_merge_file_options *", + "return": { "type": "int", "comment": " 0 on success or error code" }, + "description": "

Merge two files as they exist in the in-memory data structures, using\n the given common ancestor as the baseline, producing a\n git_merge_file_result that reflects the merge result. The\n git_merge_file_result must be freed with git_merge_file_result_free.

\n", + "comments": "

Note that this function does not reference a repository and any configuration must be passed as git_merge_file_options.

\n", + "group": "merge" + }, + "git_merge_file_from_index": { + "type": "function", + "file": "git2/merge.h", + "line": 582, + "lineto": 588, + "args": [ + { + "name": "out", + "type": "git_merge_file_result *", + "comment": "The git_merge_file_result to be filled in" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "The repository" + }, + { + "name": "ancestor", + "type": "const git_index_entry *", + "comment": "The index entry for the ancestor file (stage level 1)" + }, + { + "name": "ours", + "type": "const git_index_entry *", + "comment": "The index entry for our file (stage level 2)" + }, + { + "name": "theirs", + "type": "const git_index_entry *", + "comment": "The index entry for their file (stage level 3)" + }, + { + "name": "opts", + "type": "const git_merge_file_options *", + "comment": "The merge file options or NULL" + } + ], + "argline": "git_merge_file_result *out, git_repository *repo, const git_index_entry *ancestor, const git_index_entry *ours, const git_index_entry *theirs, const git_merge_file_options *opts", + "sig": "git_merge_file_result *::git_repository *::const git_index_entry *::const git_index_entry *::const git_index_entry *::const git_merge_file_options *", + "return": { "type": "int", "comment": " 0 on success or error code" }, + "description": "

Merge two files as they exist in the index, using the given common\n ancestor as the baseline, producing a git_merge_file_result that\n reflects the merge result. The git_merge_file_result must be freed with\n git_merge_file_result_free.

\n", + "comments": "", + "group": "merge" + }, + "git_merge_file_result_free": { + "type": "function", + "file": "git2/merge.h", + "line": 595, + "lineto": 595, + "args": [ + { + "name": "result", + "type": "git_merge_file_result *", + "comment": "The result to free or `NULL`" + } + ], + "argline": "git_merge_file_result *result", + "sig": "git_merge_file_result *", + "return": { "type": "void", "comment": null }, + "description": "

Frees a git_merge_file_result.

\n", + "comments": "", + "group": "merge" + }, + "git_merge_trees": { + "type": "function", + "file": "git2/merge.h", + "line": 613, + "lineto": 619, + "args": [ + { + "name": "out", + "type": "git_index **", + "comment": "pointer to store the index result in" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "repository that contains the given trees" + }, + { + "name": "ancestor_tree", + "type": "const git_tree *", + "comment": "the common ancestor between the trees (or null if none)" + }, + { + "name": "our_tree", + "type": "const git_tree *", + "comment": "the tree that reflects the destination tree" + }, + { + "name": "their_tree", + "type": "const git_tree *", + "comment": "the tree to merge in to `our_tree`" + }, + { + "name": "opts", + "type": "const git_merge_options *", + "comment": "the merge tree options (or null for defaults)" + } + ], + "argline": "git_index **out, git_repository *repo, const git_tree *ancestor_tree, const git_tree *our_tree, const git_tree *their_tree, const git_merge_options *opts", + "sig": "git_index **::git_repository *::const git_tree *::const git_tree *::const git_tree *::const git_merge_options *", + "return": { "type": "int", "comment": " 0 on success or error code" }, + "description": "

Merge two trees, producing a git_index that reflects the result of\n the merge. The index may be written as-is to the working directory\n or checked out. If the index is to be converted to a tree, the caller\n should resolve any conflicts that arose as part of the merge.

\n", + "comments": "

The returned index must be freed explicitly with git_index_free.

\n", + "group": "merge" + }, + "git_merge_commits": { + "type": "function", + "file": "git2/merge.h", + "line": 636, + "lineto": 641, + "args": [ + { + "name": "out", + "type": "git_index **", + "comment": "pointer to store the index result in" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "repository that contains the given trees" + }, + { + "name": "our_commit", + "type": "const git_commit *", + "comment": "the commit that reflects the destination tree" + }, + { + "name": "their_commit", + "type": "const git_commit *", + "comment": "the commit to merge in to `our_commit`" + }, + { + "name": "opts", + "type": "const git_merge_options *", + "comment": "the merge tree options (or null for defaults)" + } + ], + "argline": "git_index **out, git_repository *repo, const git_commit *our_commit, const git_commit *their_commit, const git_merge_options *opts", + "sig": "git_index **::git_repository *::const git_commit *::const git_commit *::const git_merge_options *", + "return": { "type": "int", "comment": " 0 on success or error code" }, + "description": "

Merge two commits, producing a git_index that reflects the result of\n the merge. The index may be written as-is to the working directory\n or checked out. If the index is to be converted to a tree, the caller\n should resolve any conflicts that arose as part of the merge.

\n", + "comments": "

The returned index must be freed explicitly with git_index_free.

\n", + "group": "merge" + }, + "git_merge": { + "type": "function", + "file": "git2/merge.h", + "line": 661, + "lineto": 666, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository to merge" + }, + { + "name": "their_heads", + "type": "const git_annotated_commit **", + "comment": "the heads to merge into" + }, + { + "name": "their_heads_len", + "type": "size_t", + "comment": "the number of heads to merge" + }, + { + "name": "merge_opts", + "type": "const git_merge_options *", + "comment": "merge options" + }, + { + "name": "checkout_opts", + "type": "const git_checkout_options *", + "comment": "checkout options" + } + ], + "argline": "git_repository *repo, const git_annotated_commit **their_heads, size_t their_heads_len, const git_merge_options *merge_opts, const git_checkout_options *checkout_opts", + "sig": "git_repository *::const git_annotated_commit **::size_t::const git_merge_options *::const git_checkout_options *", + "return": { "type": "int", "comment": " 0 on success or error code" }, + "description": "

Merges the given commit(s) into HEAD, writing the results into the working\n directory. Any changes are staged for commit and any conflicts are written\n to the index. Callers should inspect the repository's index after this\n completes, resolve any conflicts and prepare a commit.

\n", + "comments": "

For compatibility with git, the repository is put into a merging state. Once the commit is done (or if the user wishes to abort), you should clear this state by calling git_repository_state_cleanup().

\n", + "group": "merge", + "examples": { "merge.c": ["ex/v1.9.1/merge.html#git_merge-16"] } + }, + "git_message_prettify": { + "type": "function", + "file": "git2/message.h", + "line": 38, + "lineto": 38, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": "The user-allocated git_buf which will be filled with the\n cleaned up message." + }, + { + "name": "message", + "type": "const char *", + "comment": "The message to be prettified." + }, + { + "name": "strip_comments", + "type": "int", + "comment": "Non-zero to remove comment lines, 0 to leave them in." + }, + { + "name": "comment_char", + "type": "char", + "comment": "Comment character. Lines starting with this character\n are considered to be comments and removed if `strip_comments` is non-zero." + } + ], + "argline": "git_buf *out, const char *message, int strip_comments, char comment_char", + "sig": "git_buf *::const char *::int::char", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Clean up excess whitespace and make sure there is a trailing newline in the message.

\n", + "comments": "

Optionally, it can remove lines which start with the comment character.

\n", + "group": "message" + }, + "git_message_trailers": { + "type": "function", + "file": "git2/message.h", + "line": 73, + "lineto": 73, + "args": [ + { + "name": "arr", + "type": "git_message_trailer_array *", + "comment": "A pre-allocated git_message_trailer_array struct to be filled in\n with any trailers found during parsing." + }, + { + "name": "message", + "type": "const char *", + "comment": "The message to be parsed" + } + ], + "argline": "git_message_trailer_array *arr, const char *message", + "sig": "git_message_trailer_array *::const char *", + "return": { + "type": "int", + "comment": " 0 on success, or non-zero on error." + }, + "description": "

Parse trailers out of a message, filling the array pointed to by +arr+.

\n", + "comments": "

Trailers are key/value pairs in the last paragraph of a message, not including any patches or conflicts that may be present.

\n", + "group": "message" + }, + "git_message_trailer_array_free": { + "type": "function", + "file": "git2/message.h", + "line": 81, + "lineto": 81, + "args": [ + { + "name": "arr", + "type": "git_message_trailer_array *", + "comment": "The trailer to free." + } + ], + "argline": "git_message_trailer_array *arr", + "sig": "git_message_trailer_array *", + "return": { "type": "void", "comment": null }, + "description": "

Clean's up any allocated memory in the git_message_trailer_array filled by\n a call to git_message_trailers.

\n", + "comments": "", + "group": "message" + }, + "git_note_iterator_free": { + "type": "function", + "file": "git2/notes.h", + "line": 75, + "lineto": 75, + "args": [ + { + "name": "it", + "type": "git_note_iterator *", + "comment": "pointer to the iterator" + } + ], + "argline": "git_note_iterator *it", + "sig": "git_note_iterator *", + "return": { "type": "void", "comment": null }, + "description": "

Frees an git_note_iterator

\n", + "comments": "", + "group": "note" + }, + "git_note_next": { + "type": "function", + "file": "git2/notes.h", + "line": 88, + "lineto": 91, + "args": [ + { + "name": "note_id", + "type": "git_oid *", + "comment": "id of blob containing the message" + }, + { + "name": "annotated_id", + "type": "git_oid *", + "comment": "id of the git object being annotated" + }, + { + "name": "it", + "type": "git_note_iterator *", + "comment": "pointer to the iterator" + } + ], + "argline": "git_oid *note_id, git_oid *annotated_id, git_note_iterator *it", + "sig": "git_oid *::git_oid *::git_note_iterator *", + "return": { + "type": "int", + "comment": " 0 (no error), GIT_ITEROVER (iteration is done) or an error code\n (negative value)" + }, + "description": "

Return the current item (note_id and annotated_id) and advance the iterator\n internally to the next value

\n", + "comments": "", + "group": "note" + }, + "git_object_lookup": { + "type": "function", + "file": "git2/object.h", + "line": 45, + "lineto": 49, + "args": [ + { + "name": "object", + "type": "git_object **", + "comment": "pointer to the looked-up object" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository to look up the object" + }, + { + "name": "id", + "type": "const git_oid *", + "comment": "the unique identifier for the object" + }, + { + "name": "type", + "type": "git_object_t", + "comment": "the type of the object" + } + ], + "argline": "git_object **object, git_repository *repo, const git_oid *id, git_object_t type", + "sig": "git_object **::git_repository *::const git_oid *::git_object_t", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Lookup a reference to one of the objects in a repository.

\n", + "comments": "

The generated reference is owned by the repository and should be closed with the git_object_free method instead of free'd manually.

\n\n

The 'type' parameter must match the type of the object in the odb; the method will fail otherwise. The special value 'GIT_OBJECT_ANY' may be passed to let the method guess the object's type.

\n", + "group": "object", + "examples": { + "log.c": ["ex/v1.9.1/log.html#git_object_lookup-32"], + "merge.c": ["ex/v1.9.1/merge.html#git_object_lookup-17"] + } + }, + "git_object_lookup_prefix": { + "type": "function", + "file": "git2/object.h", + "line": 78, + "lineto": 83, + "args": [ + { + "name": "object_out", + "type": "git_object **", + "comment": "pointer where to store the looked-up object" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository to look up the object" + }, + { + "name": "id", + "type": "const git_oid *", + "comment": "a short identifier for the object" + }, + { + "name": "len", + "type": "size_t", + "comment": "the length of the short identifier" + }, + { + "name": "type", + "type": "git_object_t", + "comment": "the type of the object" + } + ], + "argline": "git_object **object_out, git_repository *repo, const git_oid *id, size_t len, git_object_t type", + "sig": "git_object **::git_repository *::const git_oid *::size_t::git_object_t", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Lookup a reference to one of the objects in a repository,\n given a prefix of its identifier (short id).

\n", + "comments": "

The object obtained will be so that its identifier matches the first 'len' hexadecimal characters (packets of 4 bits) of the given id. len must be at least GIT_OID_MINPREFIXLEN, and long enough to identify a unique object matching the prefix; otherwise the method will fail.

\n\n

The generated reference is owned by the repository and should be closed with the git_object_free method instead of free'd manually.

\n\n

The type parameter must match the type of the object in the odb; the method will fail otherwise. The special value GIT_OBJECT_ANY may be passed to let the method guess the object's type.

\n", + "group": "object" + }, + "git_object_lookup_bypath": { + "type": "function", + "file": "git2/object.h", + "line": 96, + "lineto": 100, + "args": [ + { + "name": "out", + "type": "git_object **", + "comment": "buffer that receives a pointer to the object (which must be freed\n by the caller)" + }, + { + "name": "treeish", + "type": "const git_object *", + "comment": "root object that can be peeled to a tree" + }, + { + "name": "path", + "type": "const char *", + "comment": "relative path from the root object to the desired object" + }, + { + "name": "type", + "type": "git_object_t", + "comment": "type of object desired" + } + ], + "argline": "git_object **out, const git_object *treeish, const char *path, git_object_t type", + "sig": "git_object **::const git_object *::const char *::git_object_t", + "return": { "type": "int", "comment": " 0 on success, or an error code" }, + "description": "

Lookup an object that represents a tree entry.

\n", + "comments": "", + "group": "object" + }, + "git_object_id": { + "type": "function", + "file": "git2/object.h", + "line": 108, + "lineto": 108, + "args": [ + { + "name": "obj", + "type": "const git_object *", + "comment": "the repository object" + } + ], + "argline": "const git_object *obj", + "sig": "const git_object *", + "return": { "type": "const git_oid *", "comment": " the SHA1 id" }, + "description": "

Get the id (SHA1) of a repository object

\n", + "comments": "", + "group": "object", + "examples": { + "blame.c": [ + "ex/v1.9.1/blame.html#git_object_id-7", + "ex/v1.9.1/blame.html#git_object_id-8", + "ex/v1.9.1/blame.html#git_object_id-9", + "ex/v1.9.1/blame.html#git_object_id-10" + ], + "cat-file.c": [ + "ex/v1.9.1/cat-file.html#git_object_id-10", + "ex/v1.9.1/cat-file.html#git_object_id-11" + ], + "log.c": [ + "ex/v1.9.1/log.html#git_object_id-33", + "ex/v1.9.1/log.html#git_object_id-34", + "ex/v1.9.1/log.html#git_object_id-35", + "ex/v1.9.1/log.html#git_object_id-36" + ], + "rev-parse.c": [ + "ex/v1.9.1/rev-parse.html#git_object_id-2", + "ex/v1.9.1/rev-parse.html#git_object_id-3", + "ex/v1.9.1/rev-parse.html#git_object_id-4", + "ex/v1.9.1/rev-parse.html#git_object_id-5", + "ex/v1.9.1/rev-parse.html#git_object_id-6" + ] + } + }, + "git_object_short_id": { + "type": "function", + "file": "git2/object.h", + "line": 122, + "lineto": 122, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": "Buffer to write string into" + }, + { + "name": "obj", + "type": "const git_object *", + "comment": "The object to get an ID for" + } + ], + "argline": "git_buf *out, const git_object *obj", + "sig": "git_buf *::const git_object *", + "return": { "type": "int", "comment": " 0 on success, \n<\n0 for error" }, + "description": "

Get a short abbreviated OID string for the object

\n", + "comments": "

This starts at the "core.abbrev" length (default 7 characters) and iteratively extends to a longer string if that length is ambiguous. The result will be unambiguous (at least until new objects are added to the repository).

\n", + "group": "object", + "examples": { "tag.c": ["ex/v1.9.1/tag.html#git_object_short_id-3"] } + }, + "git_object_type": { + "type": "function", + "file": "git2/object.h", + "line": 130, + "lineto": 130, + "args": [ + { + "name": "obj", + "type": "const git_object *", + "comment": "the repository object" + } + ], + "argline": "const git_object *obj", + "sig": "const git_object *", + "return": { "type": "git_object_t", "comment": " the object's type" }, + "description": "

Get the object type of an object

\n", + "comments": "", + "group": "object", + "examples": { + "cat-file.c": [ + "ex/v1.9.1/cat-file.html#git_object_type-12", + "ex/v1.9.1/cat-file.html#git_object_type-13", + "ex/v1.9.1/cat-file.html#git_object_type-14" + ], + "tag.c": ["ex/v1.9.1/tag.html#git_object_type-4"] + } + }, + "git_object_owner": { + "type": "function", + "file": "git2/object.h", + "line": 144, + "lineto": 144, + "args": [ + { "name": "obj", "type": "const git_object *", "comment": "the object" } + ], + "argline": "const git_object *obj", + "sig": "const git_object *", + "return": { + "type": "git_repository *", + "comment": " the repository who owns this object" + }, + "description": "

Get the repository that owns this object

\n", + "comments": "

Freeing or calling git_repository_close on the returned pointer will invalidate the actual object.

\n\n

Any other operation may be run on the repository without affecting the object.

\n", + "group": "object" + }, + "git_object_free": { + "type": "function", + "file": "git2/object.h", + "line": 161, + "lineto": 161, + "args": [ + { + "name": "object", + "type": "git_object *", + "comment": "the object to close" + } + ], + "argline": "git_object *object", + "sig": "git_object *", + "return": { "type": "void", "comment": null }, + "description": "

Close an open object

\n", + "comments": "

This method instructs the library to close an existing object; note that git_objects are owned and cached by the repository so the object may or may not be freed after this library call, depending on how aggressive is the caching mechanism used by the repository.

\n\n

IMPORTANT: It is necessary to call this method when you stop using an object. Failure to do so will cause a memory leak.

\n", + "group": "object", + "examples": { + "blame.c": [ + "ex/v1.9.1/blame.html#git_object_free-11", + "ex/v1.9.1/blame.html#git_object_free-12", + "ex/v1.9.1/blame.html#git_object_free-13", + "ex/v1.9.1/blame.html#git_object_free-14" + ], + "cat-file.c": ["ex/v1.9.1/cat-file.html#git_object_free-15"], + "commit.c": ["ex/v1.9.1/commit.html#git_object_free-6"], + "general.c": ["ex/v1.9.1/general.html#git_object_free-38"], + "log.c": ["ex/v1.9.1/log.html#git_object_free-37"], + "merge.c": ["ex/v1.9.1/merge.html#git_object_free-18"], + "rev-parse.c": [ + "ex/v1.9.1/rev-parse.html#git_object_free-7", + "ex/v1.9.1/rev-parse.html#git_object_free-8", + "ex/v1.9.1/rev-parse.html#git_object_free-9" + ], + "tag.c": [ + "ex/v1.9.1/tag.html#git_object_free-5", + "ex/v1.9.1/tag.html#git_object_free-6", + "ex/v1.9.1/tag.html#git_object_free-7", + "ex/v1.9.1/tag.html#git_object_free-8" + ] + } + }, + "git_object_type2string": { + "type": "function", + "file": "git2/object.h", + "line": 172, + "lineto": 172, + "args": [ + { + "name": "type", + "type": "git_object_t", + "comment": "object type to convert." + } + ], + "argline": "git_object_t type", + "sig": "git_object_t", + "return": { + "type": "const char *", + "comment": " the corresponding string representation." + }, + "description": "

Convert an object type to its string representation.

\n", + "comments": "

The result is a pointer to a string in static memory and should not be free()'ed.

\n", + "group": "object", + "examples": { + "cat-file.c": [ + "ex/v1.9.1/cat-file.html#git_object_type2string-16", + "ex/v1.9.1/cat-file.html#git_object_type2string-17", + "ex/v1.9.1/cat-file.html#git_object_type2string-18", + "ex/v1.9.1/cat-file.html#git_object_type2string-19" + ], + "general.c": [ + "ex/v1.9.1/general.html#git_object_type2string-39", + "ex/v1.9.1/general.html#git_object_type2string-40" + ] + } + }, + "git_object_string2type": { + "type": "function", + "file": "git2/object.h", + "line": 180, + "lineto": 180, + "args": [ + { + "name": "str", + "type": "const char *", + "comment": "the string to convert." + } + ], + "argline": "const char *str", + "sig": "const char *", + "return": { + "type": "git_object_t", + "comment": " the corresponding git_object_t." + }, + "description": "

Convert a string object type representation to it's git_object_t.

\n", + "comments": "", + "group": "object" + }, + "git_object_typeisloose": { + "type": "function", + "file": "git2/object.h", + "line": 189, + "lineto": 189, + "args": [ + { + "name": "type", + "type": "git_object_t", + "comment": "object type to test." + } + ], + "argline": "git_object_t type", + "sig": "git_object_t", + "return": { + "type": "int", + "comment": " true if the type represents a valid loose object type,\n false otherwise." + }, + "description": "

Determine if the given git_object_t is a valid loose object type.

\n", + "comments": "", + "group": "object" + }, + "git_object_peel": { + "type": "function", + "file": "git2/object.h", + "line": 214, + "lineto": 217, + "args": [ + { + "name": "peeled", + "type": "git_object **", + "comment": "Pointer to the peeled git_object" + }, + { + "name": "object", + "type": "const git_object *", + "comment": "The object to be processed" + }, + { + "name": "target_type", + "type": "git_object_t", + "comment": "The type of the requested object (a GIT_OBJECT_ value)" + } + ], + "argline": "git_object **peeled, const git_object *object, git_object_t target_type", + "sig": "git_object **::const git_object *::git_object_t", + "return": { + "type": "int", + "comment": " 0 on success, GIT_EINVALIDSPEC, GIT_EPEEL, or an error code" + }, + "description": "

Recursively peel an object until an object of the specified type is met.

\n", + "comments": "

If the query cannot be satisfied due to the object model, GIT_EINVALIDSPEC will be returned (e.g. trying to peel a blob to a tree).

\n\n

If you pass GIT_OBJECT_ANY as the target type, then the object will be peeled until the type changes. A tag will be peeled until the referenced object is no longer a tag, and a commit will be peeled to a tree. Any other object type will return GIT_EINVALIDSPEC.

\n\n

If peeling a tag we discover an object which cannot be peeled to the target type due to the object model, GIT_EPEEL will be returned.

\n\n

You must free the returned object.

\n", + "group": "object" + }, + "git_object_dup": { + "type": "function", + "file": "git2/object.h", + "line": 227, + "lineto": 227, + "args": [ + { + "name": "dest", + "type": "git_object **", + "comment": "Pointer to store the copy of the object" + }, + { + "name": "source", + "type": "git_object *", + "comment": "Original object to copy" + } + ], + "argline": "git_object **dest, git_object *source", + "sig": "git_object **::git_object *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Create an in-memory copy of a Git object. The copy must be\n explicitly free'd or it will leak.

\n", + "comments": "", + "group": "object" + }, + "git_object_rawcontent_is_valid": { + "type": "function", + "file": "git2/object.h", + "line": 270, + "lineto": 274, + "args": [ + { + "name": "valid", + "type": "int *", + "comment": "Output pointer to set with validity of the object content" + }, + { + "name": "buf", + "type": "const char *", + "comment": "The contents to validate" + }, + { + "name": "len", + "type": "size_t", + "comment": "The length of the buffer" + }, + { + "name": "object_type", + "type": "git_object_t", + "comment": "The type of the object in the buffer" + } + ], + "argline": "int *valid, const char *buf, size_t len, git_object_t object_type", + "sig": "int *::const char *::size_t::git_object_t", + "return": { "type": "int", "comment": " 0 on success or an error code" }, + "description": "

Analyzes a buffer of raw object content and determines its validity.\n Tree, commit, and tag objects will be parsed and ensured that they\n are valid, parseable content. (Blobs are always valid by definition.)\n An error message will be set with an informative message if the object\n is not valid.

\n", + "comments": "", + "group": "object" + }, + "git_odb_new": { + "type": "function", + "file": "git2/odb.h", + "line": 102, + "lineto": 102, + "args": [ + { + "name": "odb", + "type": "git_odb **", + "comment": "location to store the database pointer, if opened." + } + ], + "argline": "git_odb **odb", + "sig": "git_odb **", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Create a new object database with no backends.

\n", + "comments": "

Before the ODB can be used for read/writing, a custom database backend must be manually added using git_odb_add_backend()

\n", + "group": "odb" + }, + "git_odb_open": { + "type": "function", + "file": "git2/odb.h", + "line": 120, + "lineto": 120, + "args": [ + { + "name": "odb_out", + "type": "git_odb **", + "comment": "location to store the database pointer, if opened.\n\t\t\tSet to NULL if the open failed." + }, + { + "name": "objects_dir", + "type": "const char *", + "comment": "path of the backends' \"objects\" directory." + } + ], + "argline": "git_odb **odb_out, const char *objects_dir", + "sig": "git_odb **::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Create a new object database and automatically add\n the two default backends:

\n", + "comments": "
- git_odb_backend_loose: read and write loose object files      from disk, assuming `objects_dir` as the Objects folder\n\n- git_odb_backend_pack: read objects from packfiles,        assuming `objects_dir` as the Objects folder which      contains a 'pack/' folder with the corresponding data\n
\n", + "group": "odb" + }, + "git_odb_add_disk_alternate": { + "type": "function", + "file": "git2/odb.h", + "line": 138, + "lineto": 138, + "args": [ + { + "name": "odb", + "type": "git_odb *", + "comment": "database to add the backend to" + }, + { + "name": "path", + "type": "const char *", + "comment": "path to the objects folder for the alternate" + } + ], + "argline": "git_odb *odb, const char *path", + "sig": "git_odb *::const char *", + "return": { + "type": "int", + "comment": " 0 on success, error code otherwise" + }, + "description": "

Add an on-disk alternate to an existing Object DB.

\n", + "comments": "

Note that the added path must point to an objects, not to a full repository, to use it as an alternate store.

\n\n

Alternate backends are always checked for objects after all the main backends have been exhausted.

\n\n

Writing is disabled on alternate backends.

\n", + "group": "odb" + }, + "git_odb_free": { + "type": "function", + "file": "git2/odb.h", + "line": 145, + "lineto": 145, + "args": [ + { + "name": "db", + "type": "git_odb *", + "comment": "database pointer to close. If NULL no action is taken." + } + ], + "argline": "git_odb *db", + "sig": "git_odb *", + "return": { "type": "void", "comment": null }, + "description": "

Close an open object database.

\n", + "comments": "", + "group": "odb", + "examples": { + "cat-file.c": ["ex/v1.9.1/cat-file.html#git_odb_free-20"], + "general.c": ["ex/v1.9.1/general.html#git_odb_free-41"] + } + }, + "git_odb_read": { + "type": "function", + "file": "git2/odb.h", + "line": 163, + "lineto": 163, + "args": [ + { + "name": "obj", + "type": "git_odb_object **", + "comment": "pointer where to store the read object" + }, + { + "name": "db", + "type": "git_odb *", + "comment": "database to search for the object in." + }, + { + "name": "id", + "type": "const git_oid *", + "comment": "identity of the object to read." + } + ], + "argline": "git_odb_object **obj, git_odb *db, const git_oid *id", + "sig": "git_odb_object **::git_odb *::const git_oid *", + "return": { + "type": "int", + "comment": " 0 if the object was read, GIT_ENOTFOUND if the object is\n not in the database." + }, + "description": "

Read an object from the database.

\n", + "comments": "

This method queries all available ODB backends trying to read the given OID.

\n\n

The returned object is reference counted and internally cached, so it should be closed by the user once it's no longer in use.

\n", + "group": "odb", + "examples": { + "cat-file.c": ["ex/v1.9.1/cat-file.html#git_odb_read-21"], + "general.c": ["ex/v1.9.1/general.html#git_odb_read-42"] + } + }, + "git_odb_read_prefix": { + "type": "function", + "file": "git2/odb.h", + "line": 191, + "lineto": 191, + "args": [ + { + "name": "obj", + "type": "git_odb_object **", + "comment": "pointer where to store the read object" + }, + { + "name": "db", + "type": "git_odb *", + "comment": "database to search for the object in." + }, + { + "name": "short_id", + "type": "const git_oid *", + "comment": "a prefix of the id of the object to read." + }, + { + "name": "len", + "type": "size_t", + "comment": "the length of the prefix" + } + ], + "argline": "git_odb_object **obj, git_odb *db, const git_oid *short_id, size_t len", + "sig": "git_odb_object **::git_odb *::const git_oid *::size_t", + "return": { + "type": "int", + "comment": " 0 if the object was read, GIT_ENOTFOUND if the object is not in the\n database. GIT_EAMBIGUOUS if the prefix is ambiguous\n (several objects match the prefix)" + }, + "description": "

Read an object from the database, given a prefix\n of its identifier.

\n", + "comments": "

This method queries all available ODB backends trying to match the 'len' first hexadecimal characters of the 'short_id'. The remaining (GIT_OID_SHA1_HEXSIZE-len)*4 bits of 'short_id' must be 0s. 'len' must be at least GIT_OID_MINPREFIXLEN, and the prefix must be long enough to identify a unique object in all the backends; the method will fail otherwise.

\n\n

The returned object is reference counted and internally cached, so it should be closed by the user once it's no longer in use.

\n", + "group": "odb" + }, + "git_odb_read_header": { + "type": "function", + "file": "git2/odb.h", + "line": 210, + "lineto": 210, + "args": [ + { + "name": "len_out", + "type": "size_t *", + "comment": "pointer where to store the length" + }, + { + "name": "type_out", + "type": "git_object_t *", + "comment": "pointer where to store the type" + }, + { + "name": "db", + "type": "git_odb *", + "comment": "database to search for the object in." + }, + { + "name": "id", + "type": "const git_oid *", + "comment": "identity of the object to read." + } + ], + "argline": "size_t *len_out, git_object_t *type_out, git_odb *db, const git_oid *id", + "sig": "size_t *::git_object_t *::git_odb *::const git_oid *", + "return": { + "type": "int", + "comment": " 0 if the object was read, GIT_ENOTFOUND if the object is not\n in the database." + }, + "description": "

Read the header of an object from the database, without\n reading its full contents.

\n", + "comments": "

The header includes the length and the type of an object.

\n\n

Note that most backends do not support reading only the header of an object, so the whole object will be read and then the header will be returned.

\n", + "group": "odb" + }, + "git_odb_exists": { + "type": "function", + "file": "git2/odb.h", + "line": 219, + "lineto": 219, + "args": [ + { + "name": "db", + "type": "git_odb *", + "comment": "database to be searched for the given object." + }, + { + "name": "id", + "type": "const git_oid *", + "comment": "the object to search for." + } + ], + "argline": "git_odb *db, const git_oid *id", + "sig": "git_odb *::const git_oid *", + "return": { + "type": "int", + "comment": " 1 if the object was found, 0 otherwise" + }, + "description": "

Determine if the given object can be found in the object database.

\n", + "comments": "", + "group": "odb" + }, + "git_odb_exists_ext": { + "type": "function", + "file": "git2/odb.h", + "line": 230, + "lineto": 230, + "args": [ + { + "name": "db", + "type": "git_odb *", + "comment": "database to be searched for the given object." + }, + { + "name": "id", + "type": "const git_oid *", + "comment": "the object to search for." + }, + { + "name": "flags", + "type": "unsigned int", + "comment": "flags affecting the lookup (see `git_odb_lookup_flags_t`)" + } + ], + "argline": "git_odb *db, const git_oid *id, unsigned int flags", + "sig": "git_odb *::const git_oid *::unsigned int", + "return": { + "type": "int", + "comment": " 1 if the object was found, 0 otherwise" + }, + "description": "

Determine if the given object can be found in the object database, with\n extended options.

\n", + "comments": "", + "group": "odb" + }, + "git_odb_exists_prefix": { + "type": "function", + "file": "git2/odb.h", + "line": 243, + "lineto": 244, + "args": [ + { + "name": "out", + "type": "git_oid *", + "comment": "The full OID of the found object if just one is found." + }, + { + "name": "db", + "type": "git_odb *", + "comment": "The database to be searched for the given object." + }, + { + "name": "short_id", + "type": "const git_oid *", + "comment": "A prefix of the id of the object to read." + }, + { + "name": "len", + "type": "size_t", + "comment": "The length of the prefix." + } + ], + "argline": "git_oid *out, git_odb *db, const git_oid *short_id, size_t len", + "sig": "git_oid *::git_odb *::const git_oid *::size_t", + "return": { + "type": "int", + "comment": " 0 if found, GIT_ENOTFOUND if not found, GIT_EAMBIGUOUS if multiple\n matches were found, other value \n<\n 0 if there was a read error." + }, + "description": "

Determine if an object can be found in the object database by an\n abbreviated object ID.

\n", + "comments": "", + "group": "odb" + }, + "git_odb_expand_ids": { + "type": "function", + "file": "git2/odb.h", + "line": 286, + "lineto": 289, + "args": [ + { + "name": "db", + "type": "git_odb *", + "comment": "The database to be searched for the given objects." + }, + { + "name": "ids", + "type": "git_odb_expand_id *", + "comment": "An array of short object IDs to search for" + }, + { + "name": "count", + "type": "size_t", + "comment": "The length of the `ids` array" + } + ], + "argline": "git_odb *db, git_odb_expand_id *ids, size_t count", + "sig": "git_odb *::git_odb_expand_id *::size_t", + "return": { + "type": "int", + "comment": " 0 on success or an error code on failure" + }, + "description": "

Determine if one or more objects can be found in the object database\n by their abbreviated object ID and type.

\n", + "comments": "

The given array will be updated in place: for each abbreviated ID that is unique in the database, and of the given type (if specified), the full object ID, object ID length (GIT_OID_SHA1_HEXSIZE) and type will be written back to the array. For IDs that are not found (or are ambiguous), the array entry will be zeroed.

\n\n

Note that since this function operates on multiple objects, the underlying database will not be asked to be reloaded if an object is not found (which is unlike other object database operations.)

\n", + "group": "odb" + }, + "git_odb_refresh": { + "type": "function", + "file": "git2/odb.h", + "line": 309, + "lineto": 309, + "args": [ + { "name": "db", "type": "git_odb *", "comment": "database to refresh" } + ], + "argline": "git_odb *db", + "sig": "git_odb *", + "return": { + "type": "int", + "comment": " 0 on success, error code otherwise" + }, + "description": "

Refresh the object database to load newly added files.

\n", + "comments": "

If the object databases have changed on disk while the library is running, this function will force a reload of the underlying indexes.

\n\n

Use this function when you're confident that an external application has tampered with the ODB.

\n\n

NOTE that it is not necessary to call this function at all. The library will automatically attempt to refresh the ODB when a lookup fails, to see if the looked up object exists on disk but hasn't been loaded yet.

\n", + "group": "odb" + }, + "git_odb_foreach": { + "type": "function", + "file": "git2/odb.h", + "line": 324, + "lineto": 327, + "args": [ + { "name": "db", "type": "git_odb *", "comment": "database to use" }, + { + "name": "cb", + "type": "git_odb_foreach_cb", + "comment": "the callback to call for each object" + }, + { + "name": "payload", + "type": "void *", + "comment": "data to pass to the callback" + } + ], + "argline": "git_odb *db, git_odb_foreach_cb cb, void *payload", + "sig": "git_odb *::git_odb_foreach_cb::void *", + "return": { + "type": "int", + "comment": " 0 on success, non-zero callback return value, or error code" + }, + "description": "

List all objects available in the database

\n", + "comments": "

The callback will be called for each object available in the database. Note that the objects are likely to be returned in the index order, which would make accessing the objects in that order inefficient. Return a non-zero value from the callback to stop looping.

\n", + "group": "odb" + }, + "git_odb_write": { + "type": "function", + "file": "git2/odb.h", + "line": 347, + "lineto": 347, + "args": [ + { + "name": "out", + "type": "git_oid *", + "comment": "pointer to store the OID result of the write" + }, + { + "name": "odb", + "type": "git_odb *", + "comment": "object database where to store the object" + }, + { + "name": "data", + "type": "const void *", + "comment": "`const unsigned char *` buffer with the data to store" + }, + { "name": "len", "type": "size_t", "comment": "size of the buffer" }, + { + "name": "type", + "type": "git_object_t", + "comment": "type of the data to store" + } + ], + "argline": "git_oid *out, git_odb *odb, const void *data, size_t len, git_object_t type", + "sig": "git_oid *::git_odb *::const void *::size_t::git_object_t", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Write an object directly into the ODB

\n", + "comments": "

This method writes a full object straight into the ODB. For most cases, it is preferred to write objects through a write stream, which is both faster and less memory intensive, specially for big objects.

\n\n

This method is provided for compatibility with custom backends which are not able to support streaming writes

\n", + "group": "odb", + "examples": { "general.c": ["ex/v1.9.1/general.html#git_odb_write-43"] } + }, + "git_odb_open_wstream": { + "type": "function", + "file": "git2/odb.h", + "line": 370, + "lineto": 370, + "args": [ + { + "name": "out", + "type": "git_odb_stream **", + "comment": "pointer where to store the stream" + }, + { + "name": "db", + "type": "git_odb *", + "comment": "object database where the stream will write" + }, + { + "name": "size", + "type": "git_object_size_t", + "comment": "final size of the object that will be written" + }, + { + "name": "type", + "type": "git_object_t", + "comment": "type of the object that will be written" + } + ], + "argline": "git_odb_stream **out, git_odb *db, git_object_size_t size, git_object_t type", + "sig": "git_odb_stream **::git_odb *::git_object_size_t::git_object_t", + "return": { + "type": "int", + "comment": " 0 if the stream was created; error code otherwise" + }, + "description": "

Open a stream to write an object into the ODB

\n", + "comments": "

The type and final length of the object must be specified when opening the stream.

\n\n

The returned stream will be of type GIT_STREAM_WRONLY, and it won't be effective until git_odb_stream_finalize_write is called and returns without an error

\n\n

The stream must always be freed when done with git_odb_stream_free or will leak memory.

\n", + "group": "odb" + }, + "git_odb_stream_write": { + "type": "function", + "file": "git2/odb.h", + "line": 383, + "lineto": 383, + "args": [ + { + "name": "stream", + "type": "git_odb_stream *", + "comment": "the stream" + }, + { + "name": "buffer", + "type": "const char *", + "comment": "the data to write" + }, + { "name": "len", "type": "size_t", "comment": "the buffer's length" } + ], + "argline": "git_odb_stream *stream, const char *buffer, size_t len", + "sig": "git_odb_stream *::const char *::size_t", + "return": { + "type": "int", + "comment": " 0 if the write succeeded, error code otherwise" + }, + "description": "

Write to an odb stream

\n", + "comments": "

This method will fail if the total number of received bytes exceeds the size declared with git_odb_open_wstream()

\n", + "group": "odb" + }, + "git_odb_stream_finalize_write": { + "type": "function", + "file": "git2/odb.h", + "line": 398, + "lineto": 398, + "args": [ + { + "name": "out", + "type": "git_oid *", + "comment": "pointer to store the resulting object's id" + }, + { + "name": "stream", + "type": "git_odb_stream *", + "comment": "the stream" + } + ], + "argline": "git_oid *out, git_odb_stream *stream", + "sig": "git_oid *::git_odb_stream *", + "return": { + "type": "int", + "comment": " 0 on success, an error code otherwise" + }, + "description": "

Finish writing to an odb stream

\n", + "comments": "

The object will take its final name and will be available to the odb.

\n\n

This method will fail if the total number of received bytes differs from the size declared with git_odb_open_wstream()

\n", + "group": "odb" + }, + "git_odb_stream_read": { + "type": "function", + "file": "git2/odb.h", + "line": 410, + "lineto": 410, + "args": [ + { + "name": "stream", + "type": "git_odb_stream *", + "comment": "the stream" + }, + { + "name": "buffer", + "type": "char *", + "comment": "a user-allocated buffer to store the data in." + }, + { "name": "len", "type": "size_t", "comment": "the buffer's length" } + ], + "argline": "git_odb_stream *stream, char *buffer, size_t len", + "sig": "git_odb_stream *::char *::size_t", + "return": { + "type": "int", + "comment": " the number of bytes read if succeeded, error code otherwise" + }, + "description": "

Read from an odb stream

\n", + "comments": "

Most backends don't implement streaming reads

\n", + "group": "odb" + }, + "git_odb_stream_free": { + "type": "function", + "file": "git2/odb.h", + "line": 417, + "lineto": 417, + "args": [ + { + "name": "stream", + "type": "git_odb_stream *", + "comment": "the stream to free" + } + ], + "argline": "git_odb_stream *stream", + "sig": "git_odb_stream *", + "return": { "type": "void", "comment": null }, + "description": "

Free an odb stream

\n", + "comments": "", + "group": "odb" + }, + "git_odb_open_rstream": { + "type": "function", + "file": "git2/odb.h", + "line": 445, + "lineto": 450, + "args": [ + { + "name": "out", + "type": "git_odb_stream **", + "comment": "pointer where to store the stream" + }, + { + "name": "len", + "type": "size_t *", + "comment": "pointer where to store the length of the object" + }, + { + "name": "type", + "type": "git_object_t *", + "comment": "pointer where to store the type of the object" + }, + { + "name": "db", + "type": "git_odb *", + "comment": "object database where the stream will read from" + }, + { + "name": "oid", + "type": "const git_oid *", + "comment": "oid of the object the stream will read from" + } + ], + "argline": "git_odb_stream **out, size_t *len, git_object_t *type, git_odb *db, const git_oid *oid", + "sig": "git_odb_stream **::size_t *::git_object_t *::git_odb *::const git_oid *", + "return": { + "type": "int", + "comment": " 0 if the stream was created, error code otherwise" + }, + "description": "

Open a stream to read an object from the ODB

\n", + "comments": "

Note that most backends do not support streaming reads because they store their objects as compressed/delta'ed blobs.

\n\n

It's recommended to use git_odb_read instead, which is assured to work on all backends.

\n\n

The returned stream will be of type GIT_STREAM_RDONLY and will have the following methods:

\n\n
    - stream->read: read `n` bytes from the stream      - stream->free: free the stream\n
\n\n

The stream must always be free'd or will leak memory.

\n", + "group": "odb" + }, + "git_odb_write_pack": { + "type": "function", + "file": "git2/odb.h", + "line": 471, + "lineto": 475, + "args": [ + { + "name": "out", + "type": "git_odb_writepack **", + "comment": "pointer to the writepack functions" + }, + { + "name": "db", + "type": "git_odb *", + "comment": "object database where the stream will read from" + }, + { + "name": "progress_cb", + "type": "git_indexer_progress_cb", + "comment": "function to call with progress information.\n Be aware that this is called inline with network and indexing operations,\n so performance may be affected." + }, + { + "name": "progress_payload", + "type": "void *", + "comment": "payload for the progress callback" + } + ], + "argline": "git_odb_writepack **out, git_odb *db, git_indexer_progress_cb progress_cb, void *progress_payload", + "sig": "git_odb_writepack **::git_odb *::git_indexer_progress_cb::void *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Open a stream for writing a pack file to the ODB.

\n", + "comments": "

If the ODB layer understands pack files, then the given packfile will likely be streamed directly to disk (and a corresponding index created). If the ODB layer does not understand pack files, the objects will be stored in whatever format the ODB layer uses.

\n", + "group": "odb" + }, + "git_odb_write_multi_pack_index": { + "type": "function", + "file": "git2/odb.h", + "line": 489, + "lineto": 490, + "args": [ + { + "name": "db", + "type": "git_odb *", + "comment": "object database where the `multi-pack-index` file will be written." + } + ], + "argline": "git_odb *db", + "sig": "git_odb *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Write a multi-pack-index file from all the .pack files in the ODB.

\n", + "comments": "

If the ODB layer understands pack files, then this will create a file called multi-pack-index next to the .pack and .idx files, which will contain an index of all objects stored in .pack files. This will allow for O(log n) lookup for n objects (regardless of how many packfiles there exist).

\n", + "group": "odb" + }, + "git_odb_hash": { + "type": "function", + "file": "git2/odb.h", + "line": 539, + "lineto": 539, + "args": [ + { + "name": "oid", + "type": "git_oid *", + "comment": "the resulting object-ID." + }, + { "name": "data", "type": "const void *", "comment": "data to hash" }, + { "name": "len", "type": "size_t", "comment": "size of the data" }, + { + "name": "object_type", + "type": "git_object_t", + "comment": "of the data to hash" + } + ], + "argline": "git_oid *oid, const void *data, size_t len, git_object_t object_type", + "sig": "git_oid *::const void *::size_t::git_object_t", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Determine the object-ID (sha1 or sha256 hash) of a data buffer

\n", + "comments": "

The resulting OID will be the identifier for the data buffer as if the data buffer it were to written to the ODB.

\n", + "group": "odb" + }, + "git_odb_hashfile": { + "type": "function", + "file": "git2/odb.h", + "line": 554, + "lineto": 554, + "args": [ + { + "name": "oid", + "type": "git_oid *", + "comment": "oid structure the result is written into." + }, + { + "name": "path", + "type": "const char *", + "comment": "file to read and determine object id for" + }, + { + "name": "object_type", + "type": "git_object_t", + "comment": "of the data to hash" + } + ], + "argline": "git_oid *oid, const char *path, git_object_t object_type", + "sig": "git_oid *::const char *::git_object_t", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Read a file from disk and fill a git_oid with the object id\n that the file would have if it were written to the Object\n Database as an object of the given type (w/o applying filters).\n Similar functionality to git.git's git hash-object without\n the -w flag, however, with the --no-filters flag.\n If you need filters, see git_repository_hashfile.

\n", + "comments": "", + "group": "odb" + }, + "git_odb_object_dup": { + "type": "function", + "file": "git2/odb.h", + "line": 570, + "lineto": 570, + "args": [ + { + "name": "dest", + "type": "git_odb_object **", + "comment": "pointer where to store the copy" + }, + { + "name": "source", + "type": "git_odb_object *", + "comment": "object to copy" + } + ], + "argline": "git_odb_object **dest, git_odb_object *source", + "sig": "git_odb_object **::git_odb_object *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Create a copy of an odb_object

\n", + "comments": "

The returned copy must be manually freed with git_odb_object_free. Note that because of an implementation detail, the returned copy will be the same pointer as source: the object is internally refcounted, so the copy still needs to be freed twice.

\n", + "group": "odb" + }, + "git_odb_object_free": { + "type": "function", + "file": "git2/odb.h", + "line": 580, + "lineto": 580, + "args": [ + { + "name": "object", + "type": "git_odb_object *", + "comment": "object to close" + } + ], + "argline": "git_odb_object *object", + "sig": "git_odb_object *", + "return": { "type": "void", "comment": null }, + "description": "

Close an ODB object

\n", + "comments": "

This method must always be called once a git_odb_object is no longer needed, otherwise memory will leak.

\n", + "group": "odb", + "examples": { + "cat-file.c": ["ex/v1.9.1/cat-file.html#git_odb_object_free-22"], + "general.c": ["ex/v1.9.1/general.html#git_odb_object_free-44"] + } + }, + "git_odb_object_id": { + "type": "function", + "file": "git2/odb.h", + "line": 590, + "lineto": 590, + "args": [ + { + "name": "object", + "type": "git_odb_object *", + "comment": "the object" + } + ], + "argline": "git_odb_object *object", + "sig": "git_odb_object *", + "return": { + "type": "const git_oid *", + "comment": " a pointer to the OID" + }, + "description": "

Return the OID of an ODB object

\n", + "comments": "

This is the OID from which the object was read from

\n", + "group": "odb" + }, + "git_odb_object_data": { + "type": "function", + "file": "git2/odb.h", + "line": 603, + "lineto": 603, + "args": [ + { + "name": "object", + "type": "git_odb_object *", + "comment": "the object" + } + ], + "argline": "git_odb_object *object", + "sig": "git_odb_object *", + "return": { + "type": "const void *", + "comment": " \n\n `const unsigned char *` a pointer to the data" + }, + "description": "

Return the data of an ODB object

\n", + "comments": "

This is the uncompressed, raw data as read from the ODB, without the leading header.

\n\n

This pointer is owned by the object and shall not be free'd.

\n", + "group": "odb", + "examples": { + "general.c": ["ex/v1.9.1/general.html#git_odb_object_data-45"] + } + }, + "git_odb_object_size": { + "type": "function", + "file": "git2/odb.h", + "line": 614, + "lineto": 614, + "args": [ + { + "name": "object", + "type": "git_odb_object *", + "comment": "the object" + } + ], + "argline": "git_odb_object *object", + "sig": "git_odb_object *", + "return": { "type": "size_t", "comment": " the size" }, + "description": "

Return the size of an ODB object

\n", + "comments": "

This is the real size of the data buffer, not the actual size of the object.

\n", + "group": "odb", + "examples": { + "cat-file.c": ["ex/v1.9.1/cat-file.html#git_odb_object_size-23"], + "general.c": ["ex/v1.9.1/general.html#git_odb_object_size-46"] + } + }, + "git_odb_object_type": { + "type": "function", + "file": "git2/odb.h", + "line": 622, + "lineto": 622, + "args": [ + { + "name": "object", + "type": "git_odb_object *", + "comment": "the object" + } + ], + "argline": "git_odb_object *object", + "sig": "git_odb_object *", + "return": { "type": "git_object_t", "comment": " the type" }, + "description": "

Return the type of an ODB object

\n", + "comments": "", + "group": "odb", + "examples": { + "general.c": ["ex/v1.9.1/general.html#git_odb_object_type-47"] + } + }, + "git_odb_add_backend": { + "type": "function", + "file": "git2/odb.h", + "line": 637, + "lineto": 637, + "args": [ + { + "name": "odb", + "type": "git_odb *", + "comment": "database to add the backend to" + }, + { + "name": "backend", + "type": "git_odb_backend *", + "comment": "pointer to a git_odb_backend instance" + }, + { + "name": "priority", + "type": "int", + "comment": "Value for ordering the backends queue" + } + ], + "argline": "git_odb *odb, git_odb_backend *backend, int priority", + "sig": "git_odb *::git_odb_backend *::int", + "return": { + "type": "int", + "comment": " 0 on success, error code otherwise" + }, + "description": "

Add a custom backend to an existing Object DB

\n", + "comments": "

The backends are checked in relative ordering, based on the value of the priority parameter.

\n\n

Read for more information.

\n", + "group": "odb" + }, + "git_odb_add_alternate": { + "type": "function", + "file": "git2/odb.h", + "line": 658, + "lineto": 658, + "args": [ + { + "name": "odb", + "type": "git_odb *", + "comment": "database to add the backend to" + }, + { + "name": "backend", + "type": "git_odb_backend *", + "comment": "pointer to a git_odb_backend instance" + }, + { + "name": "priority", + "type": "int", + "comment": "Value for ordering the backends queue" + } + ], + "argline": "git_odb *odb, git_odb_backend *backend, int priority", + "sig": "git_odb *::git_odb_backend *::int", + "return": { + "type": "int", + "comment": " 0 on success, error code otherwise" + }, + "description": "

Add a custom backend to an existing Object DB; this\n backend will work as an alternate.

\n", + "comments": "

Alternate backends are always checked for objects after all the main backends have been exhausted.

\n\n

The backends are checked in relative ordering, based on the value of the priority parameter.

\n\n

Writing is disabled on alternate backends.

\n\n

Read for more information.

\n", + "group": "odb" + }, + "git_odb_num_backends": { + "type": "function", + "file": "git2/odb.h", + "line": 666, + "lineto": 666, + "args": [ + { "name": "odb", "type": "git_odb *", "comment": "object database" } + ], + "argline": "git_odb *odb", + "sig": "git_odb *", + "return": { + "type": "size_t", + "comment": " number of backends in the ODB" + }, + "description": "

Get the number of ODB backend objects

\n", + "comments": "", + "group": "odb" + }, + "git_odb_get_backend": { + "type": "function", + "file": "git2/odb.h", + "line": 676, + "lineto": 676, + "args": [ + { + "name": "out", + "type": "git_odb_backend **", + "comment": "output pointer to ODB backend at pos" + }, + { "name": "odb", "type": "git_odb *", "comment": "object database" }, + { + "name": "pos", + "type": "size_t", + "comment": "index into object database backend list" + } + ], + "argline": "git_odb_backend **out, git_odb *odb, size_t pos", + "sig": "git_odb_backend **::git_odb *::size_t", + "return": { + "type": "int", + "comment": " 0 on success, GIT_ENOTFOUND if pos is invalid, other errors \n<\n 0" + }, + "description": "

Lookup an ODB backend object by index

\n", + "comments": "", + "group": "odb" + }, + "git_odb_set_commit_graph": { + "type": "function", + "file": "git2/odb.h", + "line": 691, + "lineto": 691, + "args": [ + { "name": "odb", "type": "git_odb *", "comment": "object database" }, + { + "name": "cgraph", + "type": "git_commit_graph *", + "comment": "the git commit-graph" + } + ], + "argline": "git_odb *odb, git_commit_graph *cgraph", + "sig": "git_odb *::git_commit_graph *", + "return": { + "type": "int", + "comment": " 0 on success; error code otherwise" + }, + "description": "

Set the git commit-graph for the ODB.

\n", + "comments": "

After a successful call, the ownership of the cgraph parameter will be transferred to libgit2, and the caller should not free it.

\n\n

The commit-graph can also be unset by explicitly passing NULL as the cgraph parameter.

\n", + "group": "odb" + }, + "git_odb_backend_pack": { + "type": "function", + "file": "git2/odb_backend.h", + "line": 142, + "lineto": 144, + "args": [ + { + "name": "out", + "type": "git_odb_backend **", + "comment": "location to store the odb backend pointer" + }, + { + "name": "objects_dir", + "type": "const char *", + "comment": "the Git repository's objects directory" + } + ], + "argline": "git_odb_backend **out, const char *objects_dir", + "sig": "git_odb_backend **::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Create a backend for a directory containing packfiles.

\n", + "comments": "", + "group": "odb" + }, + "git_odb_backend_one_pack": { + "type": "function", + "file": "git2/odb_backend.h", + "line": 156, + "lineto": 158, + "args": [ + { + "name": "out", + "type": "git_odb_backend **", + "comment": "location to store the odb backend pointer" + }, + { + "name": "index_file", + "type": "const char *", + "comment": "path to the packfile's .idx file" + } + ], + "argline": "git_odb_backend **out, const char *index_file", + "sig": "git_odb_backend **::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Create a backend out of a single packfile

\n", + "comments": "

This can be useful for inspecting the contents of a single packfile.

\n", + "group": "odb" + }, + "git_odb_backend_loose": { + "type": "function", + "file": "git2/odb_backend.h", + "line": 171, + "lineto": 177, + "args": [ + { + "name": "out", + "type": "git_odb_backend **", + "comment": "location to store the odb backend pointer" + }, + { + "name": "objects_dir", + "type": "const char *", + "comment": "the Git repository's objects directory" + }, + { + "name": "compression_level", + "type": "int", + "comment": "zlib compression level (0-9), or -1 for the default" + }, + { + "name": "do_fsync", + "type": "int", + "comment": "if non-zero, perform an fsync on write" + }, + { + "name": "dir_mode", + "type": "unsigned int", + "comment": "permission to use when creating directories, or 0 for default" + }, + { + "name": "file_mode", + "type": "unsigned int", + "comment": "permission to use when creating directories, or 0 for default" + } + ], + "argline": "git_odb_backend **out, const char *objects_dir, int compression_level, int do_fsync, unsigned int dir_mode, unsigned int file_mode", + "sig": "git_odb_backend **::const char *::int::int::unsigned int::unsigned int", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Create a backend for loose objects

\n", + "comments": "", + "group": "odb" + }, + "git_oid_fromstr": { + "type": "function", + "file": "git2/oid.h", + "line": 137, + "lineto": 137, + "args": [ + { + "name": "out", + "type": "git_oid *", + "comment": "oid structure the result is written into." + }, + { + "name": "str", + "type": "const char *", + "comment": "input hex string; must be pointing at the start of\n\t\tthe hex sequence and have at least the number of bytes\n\t\tneeded for an oid encoded in hex (40 bytes for sha1,\n\t\t256 bytes for sha256)." + } + ], + "argline": "git_oid *out, const char *str", + "sig": "git_oid *::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Parse a hex formatted object id into a git_oid.

\n", + "comments": "

The appropriate number of bytes for the given object ID type will be read from the string - 40 bytes for SHA1, 64 bytes for SHA256. The given string need not be NUL terminated.

\n", + "group": "oid", + "examples": { + "general.c": [ + "ex/v1.9.1/general.html#git_oid_fromstr-48", + "ex/v1.9.1/general.html#git_oid_fromstr-49", + "ex/v1.9.1/general.html#git_oid_fromstr-50", + "ex/v1.9.1/general.html#git_oid_fromstr-51", + "ex/v1.9.1/general.html#git_oid_fromstr-52", + "ex/v1.9.1/general.html#git_oid_fromstr-53", + "ex/v1.9.1/general.html#git_oid_fromstr-54", + "ex/v1.9.1/general.html#git_oid_fromstr-55", + "ex/v1.9.1/general.html#git_oid_fromstr-56", + "ex/v1.9.1/general.html#git_oid_fromstr-57", + "ex/v1.9.1/general.html#git_oid_fromstr-58", + "ex/v1.9.1/general.html#git_oid_fromstr-59", + "ex/v1.9.1/general.html#git_oid_fromstr-60", + "ex/v1.9.1/general.html#git_oid_fromstr-61", + "ex/v1.9.1/general.html#git_oid_fromstr-62", + "ex/v1.9.1/general.html#git_oid_fromstr-63" + ] + } + }, + "git_oid_fromstrp": { + "type": "function", + "file": "git2/oid.h", + "line": 146, + "lineto": 146, + "args": [ + { + "name": "out", + "type": "git_oid *", + "comment": "oid structure the result is written into." + }, + { + "name": "str", + "type": "const char *", + "comment": "input hex string; must be null-terminated." + } + ], + "argline": "git_oid *out, const char *str", + "sig": "git_oid *::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Parse a hex formatted NUL-terminated string into a git_oid.

\n", + "comments": "", + "group": "oid" + }, + "git_oid_fromstrn": { + "type": "function", + "file": "git2/oid.h", + "line": 159, + "lineto": 159, + "args": [ + { + "name": "out", + "type": "git_oid *", + "comment": "oid structure the result is written into." + }, + { + "name": "str", + "type": "const char *", + "comment": "input hex string of at least size `length`" + }, + { + "name": "length", + "type": "size_t", + "comment": "length of the input string" + } + ], + "argline": "git_oid *out, const char *str, size_t length", + "sig": "git_oid *::const char *::size_t", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Parse N characters of a hex formatted object id into a git_oid.

\n", + "comments": "

If N is odd, the last byte's high nibble will be read in and the low nibble set to zero.

\n", + "group": "oid" + }, + "git_oid_fromraw": { + "type": "function", + "file": "git2/oid.h", + "line": 168, + "lineto": 168, + "args": [ + { + "name": "out", + "type": "git_oid *", + "comment": "oid structure the result is written into." + }, + { + "name": "raw", + "type": "const unsigned char *", + "comment": "the raw input bytes to be copied." + } + ], + "argline": "git_oid *out, const unsigned char *raw", + "sig": "git_oid *::const unsigned char *", + "return": { "type": "int", "comment": " 0 on success or error code" }, + "description": "

Copy an already raw oid into a git_oid structure.

\n", + "comments": "", + "group": "oid" + }, + "git_oid_fmt": { + "type": "function", + "file": "git2/oid.h", + "line": 184, + "lineto": 184, + "args": [ + { + "name": "out", + "type": "char *", + "comment": "output hex string; must be pointing at the start of\n\t\tthe hex sequence and have at least the number of bytes\n\t\tneeded for an oid encoded in hex (40 bytes for SHA1,\n\t\t64 bytes for SHA256). Only the oid digits are written;\n\t\ta '\n\\\n0' terminator must be added by the caller if it is\n\t\trequired." + }, + { + "name": "id", + "type": "const git_oid *", + "comment": "oid structure to format." + } + ], + "argline": "char *out, const git_oid *id", + "sig": "char *::const git_oid *", + "return": { "type": "int", "comment": " 0 on success or error code" }, + "description": "

Format a git_oid into a hex string.

\n", + "comments": "", + "group": "oid", + "examples": { + "fetch.c": [ + "ex/v1.9.1/fetch.html#git_oid_fmt-1", + "ex/v1.9.1/fetch.html#git_oid_fmt-2" + ], + "general.c": [ + "ex/v1.9.1/general.html#git_oid_fmt-64", + "ex/v1.9.1/general.html#git_oid_fmt-65", + "ex/v1.9.1/general.html#git_oid_fmt-66", + "ex/v1.9.1/general.html#git_oid_fmt-67", + "ex/v1.9.1/general.html#git_oid_fmt-68" + ], + "ls-remote.c": ["ex/v1.9.1/ls-remote.html#git_oid_fmt-1"] + } + }, + "git_oid_nfmt": { + "type": "function", + "file": "git2/oid.h", + "line": 196, + "lineto": 196, + "args": [ + { + "name": "out", + "type": "char *", + "comment": "output hex string; you say how many bytes to write.\n\t\tIf the number of bytes is > GIT_OID_SHA1_HEXSIZE, extra bytes\n\t\twill be zeroed; if not, a '\n\\\n0' terminator is NOT added." + }, + { + "name": "n", + "type": "size_t", + "comment": "number of characters to write into out string" + }, + { + "name": "id", + "type": "const git_oid *", + "comment": "oid structure to format." + } + ], + "argline": "char *out, size_t n, const git_oid *id", + "sig": "char *::size_t::const git_oid *", + "return": { "type": "int", "comment": " 0 on success or error code" }, + "description": "

Format a git_oid into a partial hex string.

\n", + "comments": "", + "group": "oid" + }, + "git_oid_pathfmt": { + "type": "function", + "file": "git2/oid.h", + "line": 213, + "lineto": 213, + "args": [ + { + "name": "out", + "type": "char *", + "comment": "output hex string; must be pointing at the start of\n\t\tthe hex sequence and have at least the number of bytes\n\t\tneeded for an oid encoded in hex (41 bytes for SHA1,\n\t\t65 bytes for SHA256). Only the oid digits are written;\n\t\ta '\n\\\n0' terminator must be added by the caller if it\n\t\tis required." + }, + { + "name": "id", + "type": "const git_oid *", + "comment": "oid structure to format." + } + ], + "argline": "char *out, const git_oid *id", + "sig": "char *::const git_oid *", + "return": { + "type": "int", + "comment": " 0 on success, non-zero callback return value, or error code" + }, + "description": "

Format a git_oid into a loose-object path string.

\n", + "comments": "

The resulting string is "aa/...", where "aa" is the first two hex digits of the oid and "..." is the remaining 38 digits.

\n", + "group": "oid" + }, + "git_oid_tostr_s": { + "type": "function", + "file": "git2/oid.h", + "line": 226, + "lineto": 226, + "args": [ + { + "name": "oid", + "type": "const git_oid *", + "comment": "The oid structure to format" + } + ], + "argline": "const git_oid *oid", + "sig": "const git_oid *", + "return": { + "type": "char *", + "comment": " the c-string or NULL on failure" + }, + "description": "

Format a git_oid into a statically allocated c-string.

\n", + "comments": "

The c-string is owned by the library and should not be freed by the user. If libgit2 is built with thread support, the string will be stored in TLS (i.e. one buffer per thread) to allow for concurrent calls of the function.

\n", + "group": "oid", + "examples": { + "merge.c": [ + "ex/v1.9.1/merge.html#git_oid_tostr_s-19", + "ex/v1.9.1/merge.html#git_oid_tostr_s-20" + ] + } + }, + "git_oid_tostr": { + "type": "function", + "file": "git2/oid.h", + "line": 247, + "lineto": 247, + "args": [ + { + "name": "out", + "type": "char *", + "comment": "the buffer into which the oid string is output." + }, + { + "name": "n", + "type": "size_t", + "comment": "the size of the out buffer." + }, + { + "name": "id", + "type": "const git_oid *", + "comment": "the oid structure to format." + } + ], + "argline": "char *out, size_t n, const git_oid *id", + "sig": "char *::size_t::const git_oid *", + "return": { + "type": "char *", + "comment": " the out buffer pointer, assuming no input parameter\n\t\t\terrors, otherwise a pointer to an empty string." + }, + "description": "

Format a git_oid into a buffer as a hex format c-string.

\n", + "comments": "

If the buffer is smaller than the size of a hex-formatted oid string plus an additional byte (GIT_OID_SHA_HEXSIZE + 1 for SHA1 or GIT_OID_SHA256_HEXSIZE + 1 for SHA256), then the resulting oid c-string will be truncated to n-1 characters (but will still be NUL-byte terminated).

\n\n

If there are any input parameter errors (out == NULL, n == 0, oid == NULL), then a pointer to an empty string is returned, so that the return value can always be printed.

\n", + "group": "oid", + "examples": { + "blame.c": [ + "ex/v1.9.1/blame.html#git_oid_tostr-15", + "ex/v1.9.1/blame.html#git_oid_tostr-16" + ], + "cat-file.c": [ + "ex/v1.9.1/cat-file.html#git_oid_tostr-24", + "ex/v1.9.1/cat-file.html#git_oid_tostr-25", + "ex/v1.9.1/cat-file.html#git_oid_tostr-26", + "ex/v1.9.1/cat-file.html#git_oid_tostr-27", + "ex/v1.9.1/cat-file.html#git_oid_tostr-28" + ], + "log.c": [ + "ex/v1.9.1/log.html#git_oid_tostr-38", + "ex/v1.9.1/log.html#git_oid_tostr-39" + ], + "rev-parse.c": [ + "ex/v1.9.1/rev-parse.html#git_oid_tostr-10", + "ex/v1.9.1/rev-parse.html#git_oid_tostr-11", + "ex/v1.9.1/rev-parse.html#git_oid_tostr-12", + "ex/v1.9.1/rev-parse.html#git_oid_tostr-13" + ] + } + }, + "git_oid_cpy": { + "type": "function", + "file": "git2/oid.h", + "line": 256, + "lineto": 256, + "args": [ + { + "name": "out", + "type": "git_oid *", + "comment": "oid structure the result is written into." + }, + { + "name": "src", + "type": "const git_oid *", + "comment": "oid structure to copy from." + } + ], + "argline": "git_oid *out, const git_oid *src", + "sig": "git_oid *::const git_oid *", + "return": { "type": "int", "comment": " 0 on success or error code" }, + "description": "

Copy an oid from one structure to another.

\n", + "comments": "", + "group": "oid", + "examples": { + "blame.c": [ + "ex/v1.9.1/blame.html#git_oid_cpy-17", + "ex/v1.9.1/blame.html#git_oid_cpy-18", + "ex/v1.9.1/blame.html#git_oid_cpy-19" + ] + } + }, + "git_oid_cmp": { + "type": "function", + "file": "git2/oid.h", + "line": 265, + "lineto": 265, + "args": [ + { + "name": "a", + "type": "const git_oid *", + "comment": "first oid structure." + }, + { + "name": "b", + "type": "const git_oid *", + "comment": "second oid structure." + } + ], + "argline": "const git_oid *a, const git_oid *b", + "sig": "const git_oid *::const git_oid *", + "return": { + "type": "int", + "comment": " \n<\n0, 0, >0 if a \n<\n b, a == b, a > b." + }, + "description": "

Compare two oid structures.

\n", + "comments": "", + "group": "oid" + }, + "git_oid_equal": { + "type": "function", + "file": "git2/oid.h", + "line": 274, + "lineto": 274, + "args": [ + { + "name": "a", + "type": "const git_oid *", + "comment": "first oid structure." + }, + { + "name": "b", + "type": "const git_oid *", + "comment": "second oid structure." + } + ], + "argline": "const git_oid *a, const git_oid *b", + "sig": "const git_oid *::const git_oid *", + "return": { "type": "int", "comment": " true if equal, false otherwise" }, + "description": "

Compare two oid structures for equality

\n", + "comments": "", + "group": "oid" + }, + "git_oid_ncmp": { + "type": "function", + "file": "git2/oid.h", + "line": 285, + "lineto": 285, + "args": [ + { + "name": "a", + "type": "const git_oid *", + "comment": "first oid structure." + }, + { + "name": "b", + "type": "const git_oid *", + "comment": "second oid structure." + }, + { + "name": "len", + "type": "size_t", + "comment": "the number of hex chars to compare" + } + ], + "argline": "const git_oid *a, const git_oid *b, size_t len", + "sig": "const git_oid *::const git_oid *::size_t", + "return": { "type": "int", "comment": " 0 in case of a match" }, + "description": "

Compare the first 'len' hexadecimal characters (packets of 4 bits)\n of two oid structures.

\n", + "comments": "", + "group": "oid" + }, + "git_oid_streq": { + "type": "function", + "file": "git2/oid.h", + "line": 294, + "lineto": 294, + "args": [ + { + "name": "id", + "type": "const git_oid *", + "comment": "oid structure." + }, + { + "name": "str", + "type": "const char *", + "comment": "input hex string of an object id." + } + ], + "argline": "const git_oid *id, const char *str", + "sig": "const git_oid *::const char *", + "return": { + "type": "int", + "comment": " 0 in case of a match, -1 otherwise." + }, + "description": "

Check if an oid equals an hex formatted object id.

\n", + "comments": "", + "group": "oid" + }, + "git_oid_strcmp": { + "type": "function", + "file": "git2/oid.h", + "line": 304, + "lineto": 304, + "args": [ + { + "name": "id", + "type": "const git_oid *", + "comment": "oid structure." + }, + { + "name": "str", + "type": "const char *", + "comment": "input hex string of an object id." + } + ], + "argline": "const git_oid *id, const char *str", + "sig": "const git_oid *::const char *", + "return": { + "type": "int", + "comment": " -1 if str is not valid, \n<\n0 if id sorts before str,\n 0 if id matches str, >0 if id sorts after str." + }, + "description": "

Compare an oid to an hex formatted object id.

\n", + "comments": "", + "group": "oid" + }, + "git_oid_is_zero": { + "type": "function", + "file": "git2/oid.h", + "line": 312, + "lineto": 312, + "args": [ + { + "name": "id", + "type": "const git_oid *", + "comment": "the object ID to check" + } + ], + "argline": "const git_oid *id", + "sig": "const git_oid *", + "return": { "type": "int", "comment": " 1 if all zeros, 0 otherwise." }, + "description": "

Check is an oid is all zeros.

\n", + "comments": "", + "group": "oid", + "examples": { + "blame.c": ["ex/v1.9.1/blame.html#git_oid_is_zero-20"], + "fetch.c": ["ex/v1.9.1/fetch.html#git_oid_is_zero-3"] + } + }, + "git_oid_shorten_new": { + "type": "function", + "file": "git2/oid.h", + "line": 333, + "lineto": 333, + "args": [ + { + "name": "min_length", + "type": "size_t", + "comment": "The minimal length for all identifiers,\n\t\twhich will be used even if shorter OIDs would still\n\t\tbe unique." + } + ], + "argline": "size_t min_length", + "sig": "size_t", + "return": { + "type": "git_oid_shorten *", + "comment": " a `git_oid_shorten` instance, NULL if OOM" + }, + "description": "

Create a new OID shortener.

\n", + "comments": "

The OID shortener is used to process a list of OIDs in text form and return the shortest length that would uniquely identify all of them.

\n\n

E.g. look at the result of git log --abbrev.

\n", + "group": "oid" + }, + "git_oid_shorten_add": { + "type": "function", + "file": "git2/oid.h", + "line": 359, + "lineto": 359, + "args": [ + { + "name": "os", + "type": "git_oid_shorten *", + "comment": "a `git_oid_shorten` instance" + }, + { + "name": "text_id", + "type": "const char *", + "comment": "an OID in text form" + } + ], + "argline": "git_oid_shorten *os, const char *text_id", + "sig": "git_oid_shorten *::const char *", + "return": { + "type": "int", + "comment": " the minimal length to uniquely identify all OIDs\n\t\tadded so far to the set; or an error code (\n<\n0) if an\n\t\terror occurs." + }, + "description": "

Add a new OID to set of shortened OIDs and calculate\n the minimal length to uniquely identify all the OIDs in\n the set.

\n", + "comments": "

The OID is expected to be a 40-char hexadecimal string. The OID is owned by the user and will not be modified or freed.

\n\n

For performance reasons, there is a hard-limit of how many OIDs can be added to a single set (around ~32000, assuming a mostly randomized distribution), which should be enough for any kind of program, and keeps the algorithm fast and memory-efficient.

\n\n

Attempting to add more than those OIDs will result in a GIT_ERROR_INVALID error

\n", + "group": "oid" + }, + "git_oid_shorten_free": { + "type": "function", + "file": "git2/oid.h", + "line": 366, + "lineto": 366, + "args": [ + { + "name": "os", + "type": "git_oid_shorten *", + "comment": "a `git_oid_shorten` instance" + } + ], + "argline": "git_oid_shorten *os", + "sig": "git_oid_shorten *", + "return": { "type": "void", "comment": null }, + "description": "

Free an OID shortener instance

\n", + "comments": "", + "group": "oid" + }, + "git_oidarray_dispose": { + "type": "function", + "file": "git2/oidarray.h", + "line": 38, + "lineto": 38, + "args": [ + { + "name": "array", + "type": "git_oidarray *", + "comment": "git_oidarray from which to free oid data" + } + ], + "argline": "git_oidarray *array", + "sig": "git_oidarray *", + "return": { "type": "void", "comment": null }, + "description": "

Free the object IDs contained in an oid_array. This method should\n be called on git_oidarray objects that were provided by the\n library. Not doing so will result in a memory leak.

\n", + "comments": "

This does not free the git_oidarray itself, since the library will never allocate that object directly itself.

\n", + "group": "oidarray" + }, + "git_packbuilder_new": { + "type": "function", + "file": "git2/pack.h", + "line": 65, + "lineto": 65, + "args": [ + { + "name": "out", + "type": "git_packbuilder **", + "comment": "The new packbuilder object" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "The repository" + } + ], + "argline": "git_packbuilder **out, git_repository *repo", + "sig": "git_packbuilder **::git_repository *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Initialize a new packbuilder

\n", + "comments": "", + "group": "packbuilder" + }, + "git_packbuilder_set_threads": { + "type": "function", + "file": "git2/pack.h", + "line": 78, + "lineto": 78, + "args": [ + { + "name": "pb", + "type": "git_packbuilder *", + "comment": "The packbuilder" + }, + { + "name": "n", + "type": "unsigned int", + "comment": "Number of threads to spawn" + } + ], + "argline": "git_packbuilder *pb, unsigned int n", + "sig": "git_packbuilder *::unsigned int", + "return": { + "type": "unsigned int", + "comment": " number of actual threads to be used" + }, + "description": "

Set number of threads to spawn

\n", + "comments": "

By default, libgit2 won't spawn any threads at all; when set to 0, libgit2 will autodetect the number of CPUs.

\n", + "group": "packbuilder" + }, + "git_packbuilder_insert": { + "type": "function", + "file": "git2/pack.h", + "line": 92, + "lineto": 92, + "args": [ + { + "name": "pb", + "type": "git_packbuilder *", + "comment": "The packbuilder" + }, + { + "name": "id", + "type": "const git_oid *", + "comment": "The oid of the commit" + }, + { + "name": "name", + "type": "const char *", + "comment": "The name; might be NULL" + } + ], + "argline": "git_packbuilder *pb, const git_oid *id, const char *name", + "sig": "git_packbuilder *::const git_oid *::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Insert a single object

\n", + "comments": "

For an optimal pack it's mandatory to insert objects in recency order, commits followed by trees and blobs.

\n", + "group": "packbuilder" + }, + "git_packbuilder_insert_tree": { + "type": "function", + "file": "git2/pack.h", + "line": 104, + "lineto": 104, + "args": [ + { + "name": "pb", + "type": "git_packbuilder *", + "comment": "The packbuilder" + }, + { + "name": "id", + "type": "const git_oid *", + "comment": "The oid of the root tree" + } + ], + "argline": "git_packbuilder *pb, const git_oid *id", + "sig": "git_packbuilder *::const git_oid *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Insert a root tree object

\n", + "comments": "

This will add the tree as well as all referenced trees and blobs.

\n", + "group": "packbuilder" + }, + "git_packbuilder_insert_commit": { + "type": "function", + "file": "git2/pack.h", + "line": 116, + "lineto": 116, + "args": [ + { + "name": "pb", + "type": "git_packbuilder *", + "comment": "The packbuilder" + }, + { + "name": "id", + "type": "const git_oid *", + "comment": "The oid of the commit" + } + ], + "argline": "git_packbuilder *pb, const git_oid *id", + "sig": "git_packbuilder *::const git_oid *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Insert a commit object

\n", + "comments": "

This will add a commit as well as the completed referenced tree.

\n", + "group": "packbuilder" + }, + "git_packbuilder_insert_walk": { + "type": "function", + "file": "git2/pack.h", + "line": 129, + "lineto": 129, + "args": [ + { + "name": "pb", + "type": "git_packbuilder *", + "comment": "the packbuilder" + }, + { + "name": "walk", + "type": "git_revwalk *", + "comment": "the revwalk to use to fill the packbuilder" + } + ], + "argline": "git_packbuilder *pb, git_revwalk *walk", + "sig": "git_packbuilder *::git_revwalk *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Insert objects as given by the walk

\n", + "comments": "

Those commits and all objects they reference will be inserted into the packbuilder.

\n", + "group": "packbuilder" + }, + "git_packbuilder_insert_recur": { + "type": "function", + "file": "git2/pack.h", + "line": 141, + "lineto": 141, + "args": [ + { + "name": "pb", + "type": "git_packbuilder *", + "comment": "the packbuilder" + }, + { + "name": "id", + "type": "const git_oid *", + "comment": "the id of the root object to insert" + }, + { + "name": "name", + "type": "const char *", + "comment": "optional name for the object" + } + ], + "argline": "git_packbuilder *pb, const git_oid *id, const char *name", + "sig": "git_packbuilder *::const git_oid *::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Recursively insert an object and its referenced objects

\n", + "comments": "

Insert the object as well as any object it references.

\n", + "group": "packbuilder" + }, + "git_packbuilder_write_buf": { + "type": "function", + "file": "git2/pack.h", + "line": 153, + "lineto": 153, + "args": [ + { + "name": "buf", + "type": "git_buf *", + "comment": "Buffer where to write the packfile" + }, + { + "name": "pb", + "type": "git_packbuilder *", + "comment": "The packbuilder" + } + ], + "argline": "git_buf *buf, git_packbuilder *pb", + "sig": "git_buf *::git_packbuilder *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Write the contents of the packfile to an in-memory buffer

\n", + "comments": "

The contents of the buffer will become a valid packfile, even though there will be no attached index

\n", + "group": "packbuilder" + }, + "git_packbuilder_write": { + "type": "function", + "file": "git2/pack.h", + "line": 166, + "lineto": 171, + "args": [ + { + "name": "pb", + "type": "git_packbuilder *", + "comment": "The packbuilder" + }, + { + "name": "path", + "type": "const char *", + "comment": "Path to the directory where the packfile and index should be stored, or NULL for default location" + }, + { + "name": "mode", + "type": "unsigned int", + "comment": "permissions to use creating a packfile or 0 for defaults" + }, + { + "name": "progress_cb", + "type": "git_indexer_progress_cb", + "comment": "function to call with progress information from the indexer (optional)" + }, + { + "name": "progress_cb_payload", + "type": "void *", + "comment": "payload for the progress callback (optional)" + } + ], + "argline": "git_packbuilder *pb, const char *path, unsigned int mode, git_indexer_progress_cb progress_cb, void *progress_cb_payload", + "sig": "git_packbuilder *::const char *::unsigned int::git_indexer_progress_cb::void *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Write the new pack and corresponding index file to path.

\n", + "comments": "", + "group": "packbuilder" + }, + "git_packbuilder_hash": { + "type": "function", + "file": "git2/pack.h", + "line": 184, + "lineto": 184, + "args": [ + { + "name": "pb", + "type": "git_packbuilder *", + "comment": "The packbuilder object" + } + ], + "argline": "git_packbuilder *pb", + "sig": "git_packbuilder *", + "return": { "type": "const git_oid *", "comment": " 0 or an error code" }, + "description": "

Get the packfile's hash

\n", + "comments": "

A packfile's name is derived from the sorted hashing of all object names. This is only correct after the packfile has been written.

\n", + "group": "packbuilder" + }, + "git_packbuilder_name": { + "type": "function", + "file": "git2/pack.h", + "line": 196, + "lineto": 196, + "args": [ + { + "name": "pb", + "type": "git_packbuilder *", + "comment": "the packbuilder instance" + } + ], + "argline": "git_packbuilder *pb", + "sig": "git_packbuilder *", + "return": { + "type": "const char *", + "comment": " a NUL terminated string for the packfile name" + }, + "description": "

Get the unique name for the resulting packfile.

\n", + "comments": "

The packfile's name is derived from the packfile's content. This is only correct after the packfile has been written.

\n", + "group": "packbuilder" + }, + "git_packbuilder_foreach": { + "type": "function", + "file": "git2/pack.h", + "line": 218, + "lineto": 218, + "args": [ + { + "name": "pb", + "type": "git_packbuilder *", + "comment": "the packbuilder" + }, + { + "name": "cb", + "type": "git_packbuilder_foreach_cb", + "comment": "the callback to call with each packed object's buffer" + }, + { + "name": "payload", + "type": "void *", + "comment": "the callback's data" + } + ], + "argline": "git_packbuilder *pb, git_packbuilder_foreach_cb cb, void *payload", + "sig": "git_packbuilder *::git_packbuilder_foreach_cb::void *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Create the new pack and pass each object to the callback

\n", + "comments": "", + "group": "packbuilder" + }, + "git_packbuilder_object_count": { + "type": "function", + "file": "git2/pack.h", + "line": 226, + "lineto": 226, + "args": [ + { + "name": "pb", + "type": "git_packbuilder *", + "comment": "the packbuilder" + } + ], + "argline": "git_packbuilder *pb", + "sig": "git_packbuilder *", + "return": { + "type": "size_t", + "comment": " the number of objects in the packfile" + }, + "description": "

Get the total number of objects the packbuilder will write out

\n", + "comments": "", + "group": "packbuilder" + }, + "git_packbuilder_written": { + "type": "function", + "file": "git2/pack.h", + "line": 234, + "lineto": 234, + "args": [ + { + "name": "pb", + "type": "git_packbuilder *", + "comment": "the packbuilder" + } + ], + "argline": "git_packbuilder *pb", + "sig": "git_packbuilder *", + "return": { + "type": "size_t", + "comment": " the number of objects which have already been written" + }, + "description": "

Get the number of objects the packbuilder has already written out

\n", + "comments": "", + "group": "packbuilder" + }, + "git_packbuilder_set_callbacks": { + "type": "function", + "file": "git2/pack.h", + "line": 264, + "lineto": 267, + "args": [ + { + "name": "pb", + "type": "git_packbuilder *", + "comment": "The packbuilder object" + }, + { + "name": "progress_cb", + "type": "git_packbuilder_progress", + "comment": "Function to call with progress information during\n pack building. Be aware that this is called inline with pack building\n operations, so performance may be affected.\n When progress_cb returns an error, the pack building process will be\n aborted and the error will be returned from the invoked function.\n `pb` must then be freed." + }, + { + "name": "progress_cb_payload", + "type": "void *", + "comment": "Payload for progress callback." + } + ], + "argline": "git_packbuilder *pb, git_packbuilder_progress progress_cb, void *progress_cb_payload", + "sig": "git_packbuilder *::git_packbuilder_progress::void *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Set the callbacks for a packbuilder

\n", + "comments": "", + "group": "packbuilder" + }, + "git_packbuilder_free": { + "type": "function", + "file": "git2/pack.h", + "line": 274, + "lineto": 274, + "args": [ + { + "name": "pb", + "type": "git_packbuilder *", + "comment": "The packbuilder" + } + ], + "argline": "git_packbuilder *pb", + "sig": "git_packbuilder *", + "return": { "type": "void", "comment": null }, + "description": "

Free the packbuilder and all associated data

\n", + "comments": "", + "group": "packbuilder" + }, + "git_patch_owner": { + "type": "function", + "file": "git2/patch.h", + "line": 37, + "lineto": 37, + "args": [ + { "name": "patch", "type": "const git_patch *", "comment": "the patch" } + ], + "argline": "const git_patch *patch", + "sig": "const git_patch *", + "return": { + "type": "git_repository *", + "comment": " a pointer to the repository" + }, + "description": "

Get the repository associated with this patch. May be NULL.

\n", + "comments": "", + "group": "patch" + }, + "git_patch_from_diff": { + "type": "function", + "file": "git2/patch.h", + "line": 59, + "lineto": 60, + "args": [ + { + "name": "out", + "type": "git_patch **", + "comment": "Output parameter for the delta patch object" + }, + { "name": "diff", "type": "git_diff *", "comment": "Diff list object" }, + { "name": "idx", "type": "size_t", "comment": "Index into diff list" } + ], + "argline": "git_patch **out, git_diff *diff, size_t idx", + "sig": "git_patch **::git_diff *::size_t", + "return": { + "type": "int", + "comment": " 0 on success, other value \n<\n 0 on error" + }, + "description": "

Return a patch for an entry in the diff list.

\n", + "comments": "

The git_patch is a newly created object contains the text diffs for the delta. You have to call git_patch_free() when you are done with it. You can use the patch object to loop over all the hunks and lines in the diff of the one delta.

\n\n

For an unchanged file or a binary file, no git_patch will be created, the output will be set to NULL, and the binary flag will be set true in the git_diff_delta structure.

\n\n

It is okay to pass NULL for either of the output parameters; if you pass NULL for the git_patch, then the text diff will not be calculated.

\n", + "group": "patch" + }, + "git_patch_from_blobs": { + "type": "function", + "file": "git2/patch.h", + "line": 78, + "lineto": 84, + "args": [ + { + "name": "out", + "type": "git_patch **", + "comment": "The generated patch; NULL on error" + }, + { + "name": "old_blob", + "type": "const git_blob *", + "comment": "Blob for old side of diff, or NULL for empty blob" + }, + { + "name": "old_as_path", + "type": "const char *", + "comment": "Treat old blob as if it had this filename; can be NULL" + }, + { + "name": "new_blob", + "type": "const git_blob *", + "comment": "Blob for new side of diff, or NULL for empty blob" + }, + { + "name": "new_as_path", + "type": "const char *", + "comment": "Treat new blob as if it had this filename; can be NULL" + }, + { + "name": "opts", + "type": "const git_diff_options *", + "comment": "Options for diff, or NULL for default options" + } + ], + "argline": "git_patch **out, const git_blob *old_blob, const char *old_as_path, const git_blob *new_blob, const char *new_as_path, const git_diff_options *opts", + "sig": "git_patch **::const git_blob *::const char *::const git_blob *::const char *::const git_diff_options *", + "return": { + "type": "int", + "comment": " 0 on success or error code \n<\n 0" + }, + "description": "

Directly generate a patch from the difference between two blobs.

\n", + "comments": "

This is just like git_diff_blobs() except it generates a patch object for the difference instead of directly making callbacks. You can use the standard git_patch accessor functions to read the patch data, and you must call git_patch_free() on the patch when done.

\n", + "group": "patch" + }, + "git_patch_from_blob_and_buffer": { + "type": "function", + "file": "git2/patch.h", + "line": 103, + "lineto": 110, + "args": [ + { + "name": "out", + "type": "git_patch **", + "comment": "The generated patch; NULL on error" + }, + { + "name": "old_blob", + "type": "const git_blob *", + "comment": "Blob for old side of diff, or NULL for empty blob" + }, + { + "name": "old_as_path", + "type": "const char *", + "comment": "Treat old blob as if it had this filename; can be NULL" + }, + { + "name": "buffer", + "type": "const void *", + "comment": "Raw data for new side of diff, or NULL for empty" + }, + { + "name": "buffer_len", + "type": "size_t", + "comment": "Length of raw data for new side of diff" + }, + { + "name": "buffer_as_path", + "type": "const char *", + "comment": "Treat buffer as if it had this filename; can be NULL" + }, + { + "name": "opts", + "type": "const git_diff_options *", + "comment": "Options for diff, or NULL for default options" + } + ], + "argline": "git_patch **out, const git_blob *old_blob, const char *old_as_path, const void *buffer, size_t buffer_len, const char *buffer_as_path, const git_diff_options *opts", + "sig": "git_patch **::const git_blob *::const char *::const void *::size_t::const char *::const git_diff_options *", + "return": { + "type": "int", + "comment": " 0 on success or error code \n<\n 0" + }, + "description": "

Directly generate a patch from the difference between a blob and a buffer.

\n", + "comments": "

This is just like git_diff_blob_to_buffer() except it generates a patch object for the difference instead of directly making callbacks. You can use the standard git_patch accessor functions to read the patch data, and you must call git_patch_free() on the patch when done.

\n", + "group": "patch" + }, + "git_patch_from_buffers": { + "type": "function", + "file": "git2/patch.h", + "line": 130, + "lineto": 138, + "args": [ + { + "name": "out", + "type": "git_patch **", + "comment": "The generated patch; NULL on error" + }, + { + "name": "old_buffer", + "type": "const void *", + "comment": "Raw data for old side of diff, or NULL for empty" + }, + { + "name": "old_len", + "type": "size_t", + "comment": "Length of the raw data for old side of the diff" + }, + { + "name": "old_as_path", + "type": "const char *", + "comment": "Treat old buffer as if it had this filename; can be NULL" + }, + { + "name": "new_buffer", + "type": "const void *", + "comment": "Raw data for new side of diff, or NULL for empty" + }, + { + "name": "new_len", + "type": "size_t", + "comment": "Length of raw data for new side of diff" + }, + { + "name": "new_as_path", + "type": "const char *", + "comment": "Treat buffer as if it had this filename; can be NULL" + }, + { + "name": "opts", + "type": "const git_diff_options *", + "comment": "Options for diff, or NULL for default options" + } + ], + "argline": "git_patch **out, const void *old_buffer, size_t old_len, const char *old_as_path, const void *new_buffer, size_t new_len, const char *new_as_path, const git_diff_options *opts", + "sig": "git_patch **::const void *::size_t::const char *::const void *::size_t::const char *::const git_diff_options *", + "return": { + "type": "int", + "comment": " 0 on success or error code \n<\n 0" + }, + "description": "

Directly generate a patch from the difference between two buffers.

\n", + "comments": "

This is just like git_diff_buffers() except it generates a patch object for the difference instead of directly making callbacks. You can use the standard git_patch accessor functions to read the patch data, and you must call git_patch_free() on the patch when done.

\n", + "group": "patch", + "examples": { + "diff.c": ["ex/v1.9.1/diff.html#git_patch_from_buffers-16"] + } + }, + "git_patch_free": { + "type": "function", + "file": "git2/patch.h", + "line": 145, + "lineto": 145, + "args": [ + { + "name": "patch", + "type": "git_patch *", + "comment": "The patch to free." + } + ], + "argline": "git_patch *patch", + "sig": "git_patch *", + "return": { "type": "void", "comment": null }, + "description": "

Free a git_patch object.

\n", + "comments": "", + "group": "patch", + "examples": { "diff.c": ["ex/v1.9.1/diff.html#git_patch_free-17"] } + }, + "git_patch_get_delta": { + "type": "function", + "file": "git2/patch.h", + "line": 154, + "lineto": 154, + "args": [ + { + "name": "patch", + "type": "const git_patch *", + "comment": "The patch in which to get the delta." + } + ], + "argline": "const git_patch *patch", + "sig": "const git_patch *", + "return": { + "type": "const git_diff_delta *", + "comment": " The delta associated with the patch." + }, + "description": "

Get the delta associated with a patch. This delta points to internal\n data and you do not have to release it when you are done with it.

\n", + "comments": "", + "group": "patch" + }, + "git_patch_num_hunks": { + "type": "function", + "file": "git2/patch.h", + "line": 162, + "lineto": 162, + "args": [ + { + "name": "patch", + "type": "const git_patch *", + "comment": "The patch in which to get the number of hunks." + } + ], + "argline": "const git_patch *patch", + "sig": "const git_patch *", + "return": { + "type": "size_t", + "comment": " The number of hunks of the patch." + }, + "description": "

Get the number of hunks in a patch

\n", + "comments": "", + "group": "patch" + }, + "git_patch_line_stats": { + "type": "function", + "file": "git2/patch.h", + "line": 180, + "lineto": 184, + "args": [ + { + "name": "total_context", + "type": "size_t *", + "comment": "Count of context lines in output, can be NULL." + }, + { + "name": "total_additions", + "type": "size_t *", + "comment": "Count of addition lines in output, can be NULL." + }, + { + "name": "total_deletions", + "type": "size_t *", + "comment": "Count of deletion lines in output, can be NULL." + }, + { + "name": "patch", + "type": "const git_patch *", + "comment": "The git_patch object" + } + ], + "argline": "size_t *total_context, size_t *total_additions, size_t *total_deletions, const git_patch *patch", + "sig": "size_t *::size_t *::size_t *::const git_patch *", + "return": { "type": "int", "comment": " 0 on success, \n<\n0 on error" }, + "description": "

Get line counts of each type in a patch.

\n", + "comments": "

This helps imitate a diff --numstat type of output. For that purpose, you only need the total_additions and total_deletions values, but we include the total_context line count in case you want the total number of lines of diff output that will be generated.

\n\n

All outputs are optional. Pass NULL if you don't need a particular count.

\n", + "group": "patch" + }, + "git_patch_get_hunk": { + "type": "function", + "file": "git2/patch.h", + "line": 199, + "lineto": 203, + "args": [ + { + "name": "out", + "type": "const git_diff_hunk **", + "comment": "Output pointer to git_diff_hunk of hunk" + }, + { + "name": "lines_in_hunk", + "type": "size_t *", + "comment": "Output count of total lines in this hunk" + }, + { + "name": "patch", + "type": "git_patch *", + "comment": "Input pointer to patch object" + }, + { + "name": "hunk_idx", + "type": "size_t", + "comment": "Input index of hunk to get information about" + } + ], + "argline": "const git_diff_hunk **out, size_t *lines_in_hunk, git_patch *patch, size_t hunk_idx", + "sig": "const git_diff_hunk **::size_t *::git_patch *::size_t", + "return": { + "type": "int", + "comment": " 0 on success, GIT_ENOTFOUND if hunk_idx out of range, \n<\n0 on error" + }, + "description": "

Get the information about a hunk in a patch

\n", + "comments": "

Given a patch and a hunk index into the patch, this returns detailed information about that hunk. Any of the output pointers can be passed as NULL if you don't care about that particular piece of information.

\n", + "group": "patch" + }, + "git_patch_num_lines_in_hunk": { + "type": "function", + "file": "git2/patch.h", + "line": 212, + "lineto": 214, + "args": [ + { + "name": "patch", + "type": "const git_patch *", + "comment": "The git_patch object" + }, + { "name": "hunk_idx", "type": "size_t", "comment": "Index of the hunk" } + ], + "argline": "const git_patch *patch, size_t hunk_idx", + "sig": "const git_patch *::size_t", + "return": { + "type": "int", + "comment": " Number of lines in hunk or GIT_ENOTFOUND if invalid hunk index" + }, + "description": "

Get the number of lines in a hunk.

\n", + "comments": "", + "group": "patch" + }, + "git_patch_get_line_in_hunk": { + "type": "function", + "file": "git2/patch.h", + "line": 230, + "lineto": 234, + "args": [ + { + "name": "out", + "type": "const git_diff_line **", + "comment": "The git_diff_line data for this line" + }, + { + "name": "patch", + "type": "git_patch *", + "comment": "The patch to look in" + }, + { + "name": "hunk_idx", + "type": "size_t", + "comment": "The index of the hunk" + }, + { + "name": "line_of_hunk", + "type": "size_t", + "comment": "The index of the line in the hunk" + } + ], + "argline": "const git_diff_line **out, git_patch *patch, size_t hunk_idx, size_t line_of_hunk", + "sig": "const git_diff_line **::git_patch *::size_t::size_t", + "return": { + "type": "int", + "comment": " 0 on success, \n<\n0 on failure" + }, + "description": "

Get data about a line in a hunk of a patch.

\n", + "comments": "

Given a patch, a hunk index, and a line index in the hunk, this will return a lot of details about that line. If you pass a hunk index larger than the number of hunks or a line index larger than the number of lines in the hunk, this will return -1.

\n", + "group": "patch" + }, + "git_patch_size": { + "type": "function", + "file": "git2/patch.h", + "line": 252, + "lineto": 256, + "args": [ + { + "name": "patch", + "type": "git_patch *", + "comment": "A git_patch representing changes to one file" + }, + { + "name": "include_context", + "type": "int", + "comment": "Include context lines in size if non-zero" + }, + { + "name": "include_hunk_headers", + "type": "int", + "comment": "Include hunk header lines if non-zero" + }, + { + "name": "include_file_headers", + "type": "int", + "comment": "Include file header lines if non-zero" + } + ], + "argline": "git_patch *patch, int include_context, int include_hunk_headers, int include_file_headers", + "sig": "git_patch *::int::int::int", + "return": { "type": "size_t", "comment": " The number of bytes of data" }, + "description": "

Look up size of patch diff data in bytes

\n", + "comments": "

This returns the raw size of the patch data. This only includes the actual data from the lines of the diff, not the file or hunk headers.

\n\n

If you pass include_context as true (non-zero), this will be the size of all of the diff output; if you pass it as false (zero), this will only include the actual changed lines (as if context_lines was 0).

\n", + "group": "patch" + }, + "git_patch_print": { + "type": "function", + "file": "git2/patch.h", + "line": 270, + "lineto": 273, + "args": [ + { + "name": "patch", + "type": "git_patch *", + "comment": "A git_patch representing changes to one file" + }, + { + "name": "print_cb", + "type": "git_diff_line_cb", + "comment": "Callback function to output lines of the patch. Will be\n called for file headers, hunk headers, and diff lines." + }, + { + "name": "payload", + "type": "void *", + "comment": "Reference pointer that will be passed to your callbacks." + } + ], + "argline": "git_patch *patch, git_diff_line_cb print_cb, void *payload", + "sig": "git_patch *::git_diff_line_cb::void *", + "return": { + "type": "int", + "comment": " 0 on success, non-zero callback return value, or error code" + }, + "description": "

Serialize the patch to text via callback.

\n", + "comments": "

Returning a non-zero value from the callback will terminate the iteration and return that value to the caller.

\n", + "group": "patch" + }, + "git_patch_to_buf": { + "type": "function", + "file": "git2/patch.h", + "line": 282, + "lineto": 284, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": "The git_buf to be filled in" + }, + { + "name": "patch", + "type": "git_patch *", + "comment": "A git_patch representing changes to one file" + } + ], + "argline": "git_buf *out, git_patch *patch", + "sig": "git_buf *::git_patch *", + "return": { + "type": "int", + "comment": " 0 on success, \n<\n0 on failure." + }, + "description": "

Get the content of a patch as a single diff text.

\n", + "comments": "", + "group": "patch", + "examples": { "diff.c": ["ex/v1.9.1/diff.html#git_patch_to_buf-18"] } + }, + "git_pathspec_new": { + "type": "function", + "file": "git2/pathspec.h", + "line": 89, + "lineto": 90, + "args": [ + { + "name": "out", + "type": "git_pathspec **", + "comment": "Output of the compiled pathspec" + }, + { + "name": "pathspec", + "type": "const git_strarray *", + "comment": "A git_strarray of the paths to match" + } + ], + "argline": "git_pathspec **out, const git_strarray *pathspec", + "sig": "git_pathspec **::const git_strarray *", + "return": { + "type": "int", + "comment": " 0 on success, \n<\n0 on failure" + }, + "description": "

Compile a pathspec

\n", + "comments": "", + "group": "pathspec", + "examples": { "log.c": ["ex/v1.9.1/log.html#git_pathspec_new-40"] } + }, + "git_pathspec_free": { + "type": "function", + "file": "git2/pathspec.h", + "line": 97, + "lineto": 97, + "args": [ + { + "name": "ps", + "type": "git_pathspec *", + "comment": "The compiled pathspec" + } + ], + "argline": "git_pathspec *ps", + "sig": "git_pathspec *", + "return": { "type": "void", "comment": null }, + "description": "

Free a pathspec

\n", + "comments": "", + "group": "pathspec", + "examples": { "log.c": ["ex/v1.9.1/log.html#git_pathspec_free-41"] } + }, + "git_pathspec_matches_path": { + "type": "function", + "file": "git2/pathspec.h", + "line": 112, + "lineto": 113, + "args": [ + { + "name": "ps", + "type": "const git_pathspec *", + "comment": "The compiled pathspec" + }, + { + "name": "flags", + "type": "uint32_t", + "comment": "Combination of git_pathspec_flag_t options to control match" + }, + { + "name": "path", + "type": "const char *", + "comment": "The pathname to attempt to match" + } + ], + "argline": "const git_pathspec *ps, uint32_t flags, const char *path", + "sig": "const git_pathspec *::uint32_t::const char *", + "return": { + "type": "int", + "comment": " 1 is path matches spec, 0 if it does not" + }, + "description": "

Try to match a path against a pathspec

\n", + "comments": "

Unlike most of the other pathspec matching functions, this will not fall back on the native case-sensitivity for your platform. You must explicitly pass flags to control case sensitivity or else this will fall back on being case sensitive.

\n", + "group": "pathspec" + }, + "git_pathspec_match_workdir": { + "type": "function", + "file": "git2/pathspec.h", + "line": 137, + "lineto": 141, + "args": [ + { + "name": "out", + "type": "git_pathspec_match_list **", + "comment": "Output list of matches; pass NULL to just get return value" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "The repository in which to match; bare repo is an error" + }, + { + "name": "flags", + "type": "uint32_t", + "comment": "Combination of git_pathspec_flag_t options to control match" + }, + { + "name": "ps", + "type": "git_pathspec *", + "comment": "Pathspec to be matched" + } + ], + "argline": "git_pathspec_match_list **out, git_repository *repo, uint32_t flags, git_pathspec *ps", + "sig": "git_pathspec_match_list **::git_repository *::uint32_t::git_pathspec *", + "return": { + "type": "int", + "comment": " 0 on success, -1 on error, GIT_ENOTFOUND if no matches and\n the GIT_PATHSPEC_NO_MATCH_ERROR flag was given" + }, + "description": "

Match a pathspec against the working directory of a repository.

\n", + "comments": "

This matches the pathspec against the current files in the working directory of the repository. It is an error to invoke this on a bare repo. This handles git ignores (i.e. ignored files will not be considered to match the pathspec unless the file is tracked in the index).

\n\n

If out is not NULL, this returns a git_patchspec_match_list. That contains the list of all matched filenames (unless you pass the GIT_PATHSPEC_FAILURES_ONLY flag) and may also contain the list of pathspecs with no match (if you used the GIT_PATHSPEC_FIND_FAILURES flag). You must call git_pathspec_match_list_free() on this object.

\n", + "group": "pathspec" + }, + "git_pathspec_match_index": { + "type": "function", + "file": "git2/pathspec.h", + "line": 166, + "lineto": 170, + "args": [ + { + "name": "out", + "type": "git_pathspec_match_list **", + "comment": "Output list of matches; pass NULL to just get return value" + }, + { + "name": "index", + "type": "git_index *", + "comment": "The index to match against" + }, + { + "name": "flags", + "type": "uint32_t", + "comment": "Combination of git_pathspec_flag_t options to control match" + }, + { + "name": "ps", + "type": "git_pathspec *", + "comment": "Pathspec to be matched" + } + ], + "argline": "git_pathspec_match_list **out, git_index *index, uint32_t flags, git_pathspec *ps", + "sig": "git_pathspec_match_list **::git_index *::uint32_t::git_pathspec *", + "return": { + "type": "int", + "comment": " 0 on success, -1 on error, GIT_ENOTFOUND if no matches and\n the GIT_PATHSPEC_NO_MATCH_ERROR flag is used" + }, + "description": "

Match a pathspec against entries in an index.

\n", + "comments": "

This matches the pathspec against the files in the repository index.

\n\n

NOTE: At the moment, the case sensitivity of this match is controlled by the current case-sensitivity of the index object itself and the USE_CASE and IGNORE_CASE flags will have no effect. This behavior will be corrected in a future release.

\n\n

If out is not NULL, this returns a git_patchspec_match_list. That contains the list of all matched filenames (unless you pass the GIT_PATHSPEC_FAILURES_ONLY flag) and may also contain the list of pathspecs with no match (if you used the GIT_PATHSPEC_FIND_FAILURES flag). You must call git_pathspec_match_list_free() on this object.

\n", + "group": "pathspec" + }, + "git_pathspec_match_tree": { + "type": "function", + "file": "git2/pathspec.h", + "line": 190, + "lineto": 194, + "args": [ + { + "name": "out", + "type": "git_pathspec_match_list **", + "comment": "Output list of matches; pass NULL to just get return value" + }, + { + "name": "tree", + "type": "git_tree *", + "comment": "The root-level tree to match against" + }, + { + "name": "flags", + "type": "uint32_t", + "comment": "Combination of git_pathspec_flag_t options to control match" + }, + { + "name": "ps", + "type": "git_pathspec *", + "comment": "Pathspec to be matched" + } + ], + "argline": "git_pathspec_match_list **out, git_tree *tree, uint32_t flags, git_pathspec *ps", + "sig": "git_pathspec_match_list **::git_tree *::uint32_t::git_pathspec *", + "return": { + "type": "int", + "comment": " 0 on success, -1 on error, GIT_ENOTFOUND if no matches and\n the GIT_PATHSPEC_NO_MATCH_ERROR flag is used" + }, + "description": "

Match a pathspec against files in a tree.

\n", + "comments": "

This matches the pathspec against the files in the given tree.

\n\n

If out is not NULL, this returns a git_patchspec_match_list. That contains the list of all matched filenames (unless you pass the GIT_PATHSPEC_FAILURES_ONLY flag) and may also contain the list of pathspecs with no match (if you used the GIT_PATHSPEC_FIND_FAILURES flag). You must call git_pathspec_match_list_free() on this object.

\n", + "group": "pathspec", + "examples": { "log.c": ["ex/v1.9.1/log.html#git_pathspec_match_tree-42"] } + }, + "git_pathspec_match_diff": { + "type": "function", + "file": "git2/pathspec.h", + "line": 214, + "lineto": 218, + "args": [ + { + "name": "out", + "type": "git_pathspec_match_list **", + "comment": "Output list of matches; pass NULL to just get return value" + }, + { + "name": "diff", + "type": "git_diff *", + "comment": "A generated diff list" + }, + { + "name": "flags", + "type": "uint32_t", + "comment": "Combination of git_pathspec_flag_t options to control match" + }, + { + "name": "ps", + "type": "git_pathspec *", + "comment": "Pathspec to be matched" + } + ], + "argline": "git_pathspec_match_list **out, git_diff *diff, uint32_t flags, git_pathspec *ps", + "sig": "git_pathspec_match_list **::git_diff *::uint32_t::git_pathspec *", + "return": { + "type": "int", + "comment": " 0 on success, -1 on error, GIT_ENOTFOUND if no matches and\n the GIT_PATHSPEC_NO_MATCH_ERROR flag is used" + }, + "description": "

Match a pathspec against files in a diff list.

\n", + "comments": "

This matches the pathspec against the files in the given diff list.

\n\n

If out is not NULL, this returns a git_patchspec_match_list. That contains the list of all matched filenames (unless you pass the GIT_PATHSPEC_FAILURES_ONLY flag) and may also contain the list of pathspecs with no match (if you used the GIT_PATHSPEC_FIND_FAILURES flag). You must call git_pathspec_match_list_free() on this object.

\n", + "group": "pathspec" + }, + "git_pathspec_match_list_free": { + "type": "function", + "file": "git2/pathspec.h", + "line": 225, + "lineto": 225, + "args": [ + { + "name": "m", + "type": "git_pathspec_match_list *", + "comment": "The git_pathspec_match_list to be freed" + } + ], + "argline": "git_pathspec_match_list *m", + "sig": "git_pathspec_match_list *", + "return": { "type": "void", "comment": null }, + "description": "

Free memory associates with a git_pathspec_match_list

\n", + "comments": "", + "group": "pathspec" + }, + "git_pathspec_match_list_entrycount": { + "type": "function", + "file": "git2/pathspec.h", + "line": 233, + "lineto": 234, + "args": [ + { + "name": "m", + "type": "const git_pathspec_match_list *", + "comment": "The git_pathspec_match_list object" + } + ], + "argline": "const git_pathspec_match_list *m", + "sig": "const git_pathspec_match_list *", + "return": { + "type": "size_t", + "comment": " Number of items in match list" + }, + "description": "

Get the number of items in a match list.

\n", + "comments": "", + "group": "pathspec" + }, + "git_pathspec_match_list_entry": { + "type": "function", + "file": "git2/pathspec.h", + "line": 246, + "lineto": 247, + "args": [ + { + "name": "m", + "type": "const git_pathspec_match_list *", + "comment": "The git_pathspec_match_list object" + }, + { + "name": "pos", + "type": "size_t", + "comment": "The index into the list" + } + ], + "argline": "const git_pathspec_match_list *m, size_t pos", + "sig": "const git_pathspec_match_list *::size_t", + "return": { + "type": "const char *", + "comment": " The filename of the match" + }, + "description": "

Get a matching filename by position.

\n", + "comments": "

This routine cannot be used if the match list was generated by git_pathspec_match_diff. If so, it will always return NULL.

\n", + "group": "pathspec" + }, + "git_pathspec_match_list_diff_entry": { + "type": "function", + "file": "git2/pathspec.h", + "line": 259, + "lineto": 260, + "args": [ + { + "name": "m", + "type": "const git_pathspec_match_list *", + "comment": "The git_pathspec_match_list object" + }, + { + "name": "pos", + "type": "size_t", + "comment": "The index into the list" + } + ], + "argline": "const git_pathspec_match_list *m, size_t pos", + "sig": "const git_pathspec_match_list *::size_t", + "return": { + "type": "const git_diff_delta *", + "comment": " The filename of the match" + }, + "description": "

Get a matching diff delta by position.

\n", + "comments": "

This routine can only be used if the match list was generated by git_pathspec_match_diff. Otherwise it will always return NULL.

\n", + "group": "pathspec" + }, + "git_pathspec_match_list_failed_entrycount": { + "type": "function", + "file": "git2/pathspec.h", + "line": 271, + "lineto": 272, + "args": [ + { + "name": "m", + "type": "const git_pathspec_match_list *", + "comment": "The git_pathspec_match_list object" + } + ], + "argline": "const git_pathspec_match_list *m", + "sig": "const git_pathspec_match_list *", + "return": { + "type": "size_t", + "comment": " Number of items in original pathspec that had no matches" + }, + "description": "

Get the number of pathspec items that did not match.

\n", + "comments": "

This will be zero unless you passed GIT_PATHSPEC_FIND_FAILURES when generating the git_pathspec_match_list.

\n", + "group": "pathspec" + }, + "git_pathspec_match_list_failed_entry": { + "type": "function", + "file": "git2/pathspec.h", + "line": 283, + "lineto": 284, + "args": [ + { + "name": "m", + "type": "const git_pathspec_match_list *", + "comment": "The git_pathspec_match_list object" + }, + { + "name": "pos", + "type": "size_t", + "comment": "The index into the failed items" + } + ], + "argline": "const git_pathspec_match_list *m, size_t pos", + "sig": "const git_pathspec_match_list *::size_t", + "return": { + "type": "const char *", + "comment": " The pathspec pattern that didn't match anything" + }, + "description": "

Get an original pathspec string that had no matches.

\n", + "comments": "

This will be return NULL for positions out of range.

\n", + "group": "pathspec" + }, + "git_proxy_options_init": { + "type": "function", + "file": "git2/proxy.h", + "line": 103, + "lineto": 103, + "args": [ + { + "name": "opts", + "type": "git_proxy_options *", + "comment": "The `git_proxy_options` struct to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "The struct version; pass `GIT_PROXY_OPTIONS_VERSION`." + } + ], + "argline": "git_proxy_options *opts, unsigned int version", + "sig": "git_proxy_options *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initialize git_proxy_options structure

\n", + "comments": "

Initializes a git_proxy_options with default values. Equivalent to creating an instance with GIT_PROXY_OPTIONS_INIT.

\n", + "group": "proxy" + }, + "git_rebase_options_init": { + "type": "function", + "file": "git2/rebase.h", + "line": 201, + "lineto": 203, + "args": [ + { + "name": "opts", + "type": "git_rebase_options *", + "comment": "The `git_rebase_options` struct to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "The struct version; pass `GIT_REBASE_OPTIONS_VERSION`." + } + ], + "argline": "git_rebase_options *opts, unsigned int version", + "sig": "git_rebase_options *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initialize git_rebase_options structure

\n", + "comments": "

Initializes a git_rebase_options with default values. Equivalent to creating an instance with GIT_REBASE_OPTIONS_INIT.

\n", + "group": "rebase" + }, + "git_rebase_init": { + "type": "function", + "file": "git2/rebase.h", + "line": 222, + "lineto": 228, + "args": [ + { + "name": "out", + "type": "git_rebase **", + "comment": "Pointer to store the rebase object" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "The repository to perform the rebase" + }, + { + "name": "branch", + "type": "const git_annotated_commit *", + "comment": "The terminal commit to rebase, or NULL to rebase the\n current branch" + }, + { + "name": "upstream", + "type": "const git_annotated_commit *", + "comment": "The commit to begin rebasing from, or NULL to rebase all\n reachable commits" + }, + { + "name": "onto", + "type": "const git_annotated_commit *", + "comment": "The branch to rebase onto, or NULL to rebase onto the given\n upstream" + }, + { + "name": "opts", + "type": "const git_rebase_options *", + "comment": "Options to specify how rebase is performed, or NULL" + } + ], + "argline": "git_rebase **out, git_repository *repo, const git_annotated_commit *branch, const git_annotated_commit *upstream, const git_annotated_commit *onto, const git_rebase_options *opts", + "sig": "git_rebase **::git_repository *::const git_annotated_commit *::const git_annotated_commit *::const git_annotated_commit *::const git_rebase_options *", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initializes a rebase operation to rebase the changes in branch\n relative to upstream onto another branch. To begin the rebase\n process, call git_rebase_next. When you have finished with this\n object, call git_rebase_free.

\n", + "comments": "", + "group": "rebase" + }, + "git_rebase_open": { + "type": "function", + "file": "git2/rebase.h", + "line": 239, + "lineto": 242, + "args": [ + { + "name": "out", + "type": "git_rebase **", + "comment": "Pointer to store the rebase object" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "The repository that has a rebase in-progress" + }, + { + "name": "opts", + "type": "const git_rebase_options *", + "comment": "Options to specify how rebase is performed" + } + ], + "argline": "git_rebase **out, git_repository *repo, const git_rebase_options *opts", + "sig": "git_rebase **::git_repository *::const git_rebase_options *", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Opens an existing rebase that was previously started by either an\n invocation of git_rebase_init or by another client.

\n", + "comments": "", + "group": "rebase" + }, + "git_rebase_orig_head_name": { + "type": "function", + "file": "git2/rebase.h", + "line": 250, + "lineto": 250, + "args": [ + { + "name": "rebase", + "type": "git_rebase *", + "comment": "The in-progress rebase." + } + ], + "argline": "git_rebase *rebase", + "sig": "git_rebase *", + "return": { + "type": "const char *", + "comment": " The original `HEAD` ref name" + }, + "description": "

Gets the original HEAD ref name for merge rebases.

\n", + "comments": "", + "group": "rebase" + }, + "git_rebase_orig_head_id": { + "type": "function", + "file": "git2/rebase.h", + "line": 258, + "lineto": 258, + "args": [ + { + "name": "rebase", + "type": "git_rebase *", + "comment": "The in-progress rebase." + } + ], + "argline": "git_rebase *rebase", + "sig": "git_rebase *", + "return": { + "type": "const git_oid *", + "comment": " The original `HEAD` id" + }, + "description": "

Gets the original HEAD id for merge rebases.

\n", + "comments": "", + "group": "rebase" + }, + "git_rebase_onto_name": { + "type": "function", + "file": "git2/rebase.h", + "line": 266, + "lineto": 266, + "args": [ + { + "name": "rebase", + "type": "git_rebase *", + "comment": "The in-progress rebase." + } + ], + "argline": "git_rebase *rebase", + "sig": "git_rebase *", + "return": { "type": "const char *", "comment": " The `onto` ref name" }, + "description": "

Gets the onto ref name for merge rebases.

\n", + "comments": "", + "group": "rebase" + }, + "git_rebase_onto_id": { + "type": "function", + "file": "git2/rebase.h", + "line": 274, + "lineto": 274, + "args": [ + { + "name": "rebase", + "type": "git_rebase *", + "comment": "The in-progress rebase." + } + ], + "argline": "git_rebase *rebase", + "sig": "git_rebase *", + "return": { "type": "const git_oid *", "comment": " The `onto` id" }, + "description": "

Gets the onto id for merge rebases.

\n", + "comments": "", + "group": "rebase" + }, + "git_rebase_operation_entrycount": { + "type": "function", + "file": "git2/rebase.h", + "line": 282, + "lineto": 282, + "args": [ + { + "name": "rebase", + "type": "git_rebase *", + "comment": "The in-progress rebase" + } + ], + "argline": "git_rebase *rebase", + "sig": "git_rebase *", + "return": { + "type": "size_t", + "comment": " The number of rebase operations in total" + }, + "description": "

Gets the count of rebase operations that are to be applied.

\n", + "comments": "", + "group": "rebase" + }, + "git_rebase_operation_current": { + "type": "function", + "file": "git2/rebase.h", + "line": 293, + "lineto": 293, + "args": [ + { + "name": "rebase", + "type": "git_rebase *", + "comment": "The in-progress rebase" + } + ], + "argline": "git_rebase *rebase", + "sig": "git_rebase *", + "return": { + "type": "size_t", + "comment": " The index of the rebase operation currently being applied." + }, + "description": "

Gets the index of the rebase operation that is currently being applied.\n If the first operation has not yet been applied (because you have\n called init but not yet next) then this returns\n GIT_REBASE_NO_OPERATION.

\n", + "comments": "", + "group": "rebase" + }, + "git_rebase_operation_byindex": { + "type": "function", + "file": "git2/rebase.h", + "line": 302, + "lineto": 304, + "args": [ + { + "name": "rebase", + "type": "git_rebase *", + "comment": "The in-progress rebase" + }, + { + "name": "idx", + "type": "size_t", + "comment": "The index of the rebase operation to retrieve" + } + ], + "argline": "git_rebase *rebase, size_t idx", + "sig": "git_rebase *::size_t", + "return": { + "type": "git_rebase_operation *", + "comment": " The rebase operation or NULL if `idx` was out of bounds" + }, + "description": "

Gets the rebase operation specified by the given index.

\n", + "comments": "", + "group": "rebase" + }, + "git_rebase_next": { + "type": "function", + "file": "git2/rebase.h", + "line": 317, + "lineto": 319, + "args": [ + { + "name": "operation", + "type": "git_rebase_operation **", + "comment": "Pointer to store the rebase operation that is to be performed next" + }, + { + "name": "rebase", + "type": "git_rebase *", + "comment": "The rebase in progress" + } + ], + "argline": "git_rebase_operation **operation, git_rebase *rebase", + "sig": "git_rebase_operation **::git_rebase *", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Performs the next rebase operation and returns the information about it.\n If the operation is one that applies a patch (which is any operation except\n GIT_REBASE_OPERATION_EXEC) then the patch will be applied and the index and\n working directory will be updated with the changes. If there are conflicts,\n you will need to address those before committing the changes.

\n", + "comments": "", + "group": "rebase" + }, + "git_rebase_inmemory_index": { + "type": "function", + "file": "git2/rebase.h", + "line": 336, + "lineto": 338, + "args": [ + { + "name": "index", + "type": "git_index **", + "comment": "The result index of the last operation." + }, + { + "name": "rebase", + "type": "git_rebase *", + "comment": "The in-progress rebase." + } + ], + "argline": "git_index **index, git_rebase *rebase", + "sig": "git_index **::git_rebase *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Gets the index produced by the last operation, which is the result\n of git_rebase_next and which will be committed by the next\n invocation of git_rebase_commit. This is useful for resolving\n conflicts in an in-memory rebase before committing them. You must\n call git_index_free when you are finished with this.

\n", + "comments": "

This is only applicable for in-memory rebases; for rebases within a working directory, the changes were applied to the repository's index.

\n", + "group": "rebase" + }, + "git_rebase_commit": { + "type": "function", + "file": "git2/rebase.h", + "line": 362, + "lineto": 368, + "args": [ + { + "name": "id", + "type": "git_oid *", + "comment": "Pointer in which to store the OID of the newly created commit" + }, + { + "name": "rebase", + "type": "git_rebase *", + "comment": "The rebase that is in-progress" + }, + { + "name": "author", + "type": "const git_signature *", + "comment": "The author of the updated commit, or NULL to keep the\n author from the original commit" + }, + { + "name": "committer", + "type": "const git_signature *", + "comment": "The committer of the rebase" + }, + { + "name": "message_encoding", + "type": "const char *", + "comment": "The encoding for the message in the commit,\n represented with a standard encoding name. If message is NULL,\n this should also be NULL, and the encoding from the original\n commit will be maintained. If message is specified, this may be\n NULL to indicate that \"UTF-8\" is to be used." + }, + { + "name": "message", + "type": "const char *", + "comment": "The message for this commit, or NULL to use the message\n from the original commit." + } + ], + "argline": "git_oid *id, git_rebase *rebase, const git_signature *author, const git_signature *committer, const char *message_encoding, const char *message", + "sig": "git_oid *::git_rebase *::const git_signature *::const git_signature *::const char *::const char *", + "return": { + "type": "int", + "comment": " Zero on success, GIT_EUNMERGED if there are unmerged changes in\n the index, GIT_EAPPLIED if the current commit has already\n been applied to the upstream and there is nothing to commit,\n -1 on failure." + }, + "description": "

Commits the current patch. You must have resolved any conflicts that\n were introduced during the patch application from the git_rebase_next\n invocation.

\n", + "comments": "", + "group": "rebase" + }, + "git_rebase_abort": { + "type": "function", + "file": "git2/rebase.h", + "line": 378, + "lineto": 378, + "args": [ + { + "name": "rebase", + "type": "git_rebase *", + "comment": "The rebase that is in-progress" + } + ], + "argline": "git_rebase *rebase", + "sig": "git_rebase *", + "return": { + "type": "int", + "comment": " Zero on success; GIT_ENOTFOUND if a rebase is not in progress,\n -1 on other errors." + }, + "description": "

Aborts a rebase that is currently in progress, resetting the repository\n and working directory to their state before rebase began.

\n", + "comments": "", + "group": "rebase" + }, + "git_rebase_finish": { + "type": "function", + "file": "git2/rebase.h", + "line": 388, + "lineto": 390, + "args": [ + { + "name": "rebase", + "type": "git_rebase *", + "comment": "The rebase that is in-progress" + }, + { + "name": "signature", + "type": "const git_signature *", + "comment": "The identity that is finishing the rebase (optional)" + } + ], + "argline": "git_rebase *rebase, const git_signature *signature", + "sig": "git_rebase *::const git_signature *", + "return": { "type": "int", "comment": " Zero on success; -1 on error" }, + "description": "

Finishes a rebase that is currently in progress once all patches have\n been applied.

\n", + "comments": "", + "group": "rebase" + }, + "git_rebase_free": { + "type": "function", + "file": "git2/rebase.h", + "line": 397, + "lineto": 397, + "args": [ + { + "name": "rebase", + "type": "git_rebase *", + "comment": "The rebase object" + } + ], + "argline": "git_rebase *rebase", + "sig": "git_rebase *", + "return": { "type": "void", "comment": null }, + "description": "

Frees the git_rebase object.

\n", + "comments": "", + "group": "rebase" + }, + "git_refdb_new": { + "type": "function", + "file": "git2/refdb.h", + "line": 35, + "lineto": 35, + "args": [ + { + "name": "out", + "type": "git_refdb **", + "comment": "location to store the database pointer, if opened.\n\t\t\tSet to NULL if the open failed." + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository" + } + ], + "argline": "git_refdb **out, git_repository *repo", + "sig": "git_refdb **::git_repository *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Create a new reference database with no backends.

\n", + "comments": "

Before the Ref DB can be used for read/writing, a custom database backend must be manually set using git_refdb_set_backend()

\n", + "group": "refdb" + }, + "git_refdb_open": { + "type": "function", + "file": "git2/refdb.h", + "line": 49, + "lineto": 49, + "args": [ + { + "name": "out", + "type": "git_refdb **", + "comment": "location to store the database pointer, if opened.\n\t\t\tSet to NULL if the open failed." + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository" + } + ], + "argline": "git_refdb **out, git_repository *repo", + "sig": "git_refdb **::git_repository *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Create a new reference database and automatically add\n the default backends:

\n", + "comments": "\n", + "group": "refdb" + }, + "git_refdb_compress": { + "type": "function", + "file": "git2/refdb.h", + "line": 59, + "lineto": 59, + "args": [ + { + "name": "refdb", + "type": "git_refdb *", + "comment": "The reference database to optimize." + } + ], + "argline": "git_refdb *refdb", + "sig": "git_refdb *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Suggests that the given refdb compress or optimize its references.\n This mechanism is implementation specific. For on-disk reference\n databases, for example, this may pack all loose references.

\n", + "comments": "", + "group": "refdb" + }, + "git_refdb_free": { + "type": "function", + "file": "git2/refdb.h", + "line": 66, + "lineto": 66, + "args": [ + { + "name": "refdb", + "type": "git_refdb *", + "comment": "reference database pointer or NULL" + } + ], + "argline": "git_refdb *refdb", + "sig": "git_refdb *", + "return": { "type": "void", "comment": null }, + "description": "

Close an open reference database.

\n", + "comments": "", + "group": "refdb" + }, + "git_reflog_read": { + "type": "function", + "file": "git2/reflog.h", + "line": 38, + "lineto": 38, + "args": [ + { + "name": "out", + "type": "git_reflog **", + "comment": "pointer to reflog" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository" + }, + { + "name": "name", + "type": "const char *", + "comment": "reference to look up" + } + ], + "argline": "git_reflog **out, git_repository *repo, const char *name", + "sig": "git_reflog **::git_repository *::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Read the reflog for the given reference

\n", + "comments": "

If there is no reflog file for the given reference yet, an empty reflog object will be returned.

\n\n

The reflog must be freed manually by using git_reflog_free().

\n", + "group": "reflog" + }, + "git_reflog_write": { + "type": "function", + "file": "git2/reflog.h", + "line": 47, + "lineto": 47, + "args": [ + { + "name": "reflog", + "type": "git_reflog *", + "comment": "an existing reflog object" + } + ], + "argline": "git_reflog *reflog", + "sig": "git_reflog *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Write an existing in-memory reflog object back to disk\n using an atomic file lock.

\n", + "comments": "", + "group": "reflog" + }, + "git_reflog_append": { + "type": "function", + "file": "git2/reflog.h", + "line": 60, + "lineto": 60, + "args": [ + { + "name": "reflog", + "type": "git_reflog *", + "comment": "an existing reflog object" + }, + { + "name": "id", + "type": "const git_oid *", + "comment": "the OID the reference is now pointing to" + }, + { + "name": "committer", + "type": "const git_signature *", + "comment": "the signature of the committer" + }, + { + "name": "msg", + "type": "const char *", + "comment": "the reflog message" + } + ], + "argline": "git_reflog *reflog, const git_oid *id, const git_signature *committer, const char *msg", + "sig": "git_reflog *::const git_oid *::const git_signature *::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Add a new entry to the in-memory reflog.

\n", + "comments": "

msg is optional and can be NULL.

\n", + "group": "reflog" + }, + "git_reflog_rename": { + "type": "function", + "file": "git2/reflog.h", + "line": 75, + "lineto": 75, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository" + }, + { + "name": "old_name", + "type": "const char *", + "comment": "the old name of the reference" + }, + { + "name": "name", + "type": "const char *", + "comment": "the new name of the reference" + } + ], + "argline": "git_repository *repo, const char *old_name, const char *name", + "sig": "git_repository *::const char *::const char *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_EINVALIDSPEC or an error code" + }, + "description": "

Rename a reflog

\n", + "comments": "

The reflog to be renamed is expected to already exist

\n\n

The new name will be checked for validity. See git_reference_create_symbolic() for rules about valid names.

\n", + "group": "reflog" + }, + "git_reflog_delete": { + "type": "function", + "file": "git2/reflog.h", + "line": 84, + "lineto": 84, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository" + }, + { + "name": "name", + "type": "const char *", + "comment": "the reflog to delete" + } + ], + "argline": "git_repository *repo, const char *name", + "sig": "git_repository *::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Delete the reflog for the given reference

\n", + "comments": "", + "group": "reflog" + }, + "git_reflog_entrycount": { + "type": "function", + "file": "git2/reflog.h", + "line": 92, + "lineto": 92, + "args": [ + { + "name": "reflog", + "type": "git_reflog *", + "comment": "the previously loaded reflog" + } + ], + "argline": "git_reflog *reflog", + "sig": "git_reflog *", + "return": { "type": "size_t", "comment": " the number of log entries" }, + "description": "

Get the number of log entries in a reflog

\n", + "comments": "", + "group": "reflog" + }, + "git_reflog_entry_byindex": { + "type": "function", + "file": "git2/reflog.h", + "line": 105, + "lineto": 105, + "args": [ + { + "name": "reflog", + "type": "const git_reflog *", + "comment": "a previously loaded reflog" + }, + { + "name": "idx", + "type": "size_t", + "comment": "the position of the entry to lookup. Should be greater than or\n equal to 0 (zero) and less than `git_reflog_entrycount()`." + } + ], + "argline": "const git_reflog *reflog, size_t idx", + "sig": "const git_reflog *::size_t", + "return": { + "type": "const git_reflog_entry *", + "comment": " the entry; NULL if not found" + }, + "description": "

Lookup an entry by its index

\n", + "comments": "

Requesting the reflog entry with an index of 0 (zero) will return the most recently created entry.

\n", + "group": "reflog" + }, + "git_reflog_drop": { + "type": "function", + "file": "git2/reflog.h", + "line": 124, + "lineto": 127, + "args": [ + { + "name": "reflog", + "type": "git_reflog *", + "comment": "a previously loaded reflog." + }, + { + "name": "idx", + "type": "size_t", + "comment": "the position of the entry to remove. Should be greater than or\n equal to 0 (zero) and less than `git_reflog_entrycount()`." + }, + { + "name": "rewrite_previous_entry", + "type": "int", + "comment": "1 to rewrite the history; 0 otherwise." + } + ], + "argline": "git_reflog *reflog, size_t idx, int rewrite_previous_entry", + "sig": "git_reflog *::size_t::int", + "return": { + "type": "int", + "comment": " 0 on success, GIT_ENOTFOUND if the entry doesn't exist\n or an error code." + }, + "description": "

Remove an entry from the reflog by its index

\n", + "comments": "

To ensure there's no gap in the log history, set rewrite_previous_entry param value to 1. When deleting entry n, member old_oid of entry n-1 (if any) will be updated with the value of member new_oid of entry n+1.

\n", + "group": "reflog" + }, + "git_reflog_entry_id_old": { + "type": "function", + "file": "git2/reflog.h", + "line": 135, + "lineto": 135, + "args": [ + { + "name": "entry", + "type": "const git_reflog_entry *", + "comment": "a reflog entry" + } + ], + "argline": "const git_reflog_entry *entry", + "sig": "const git_reflog_entry *", + "return": { "type": "const git_oid *", "comment": " the old oid" }, + "description": "

Get the old oid

\n", + "comments": "", + "group": "reflog" + }, + "git_reflog_entry_id_new": { + "type": "function", + "file": "git2/reflog.h", + "line": 143, + "lineto": 143, + "args": [ + { + "name": "entry", + "type": "const git_reflog_entry *", + "comment": "a reflog entry" + } + ], + "argline": "const git_reflog_entry *entry", + "sig": "const git_reflog_entry *", + "return": { + "type": "const git_oid *", + "comment": " the new oid at this time" + }, + "description": "

Get the new oid

\n", + "comments": "", + "group": "reflog" + }, + "git_reflog_entry_committer": { + "type": "function", + "file": "git2/reflog.h", + "line": 151, + "lineto": 151, + "args": [ + { + "name": "entry", + "type": "const git_reflog_entry *", + "comment": "a reflog entry" + } + ], + "argline": "const git_reflog_entry *entry", + "sig": "const git_reflog_entry *", + "return": { + "type": "const git_signature *", + "comment": " the committer" + }, + "description": "

Get the committer of this entry

\n", + "comments": "", + "group": "reflog" + }, + "git_reflog_entry_message": { + "type": "function", + "file": "git2/reflog.h", + "line": 159, + "lineto": 159, + "args": [ + { + "name": "entry", + "type": "const git_reflog_entry *", + "comment": "a reflog entry" + } + ], + "argline": "const git_reflog_entry *entry", + "sig": "const git_reflog_entry *", + "return": { "type": "const char *", "comment": " the log msg" }, + "description": "

Get the log message

\n", + "comments": "", + "group": "reflog" + }, + "git_reflog_free": { + "type": "function", + "file": "git2/reflog.h", + "line": 166, + "lineto": 166, + "args": [ + { + "name": "reflog", + "type": "git_reflog *", + "comment": "reflog to free" + } + ], + "argline": "git_reflog *reflog", + "sig": "git_reflog *", + "return": { "type": "void", "comment": null }, + "description": "

Free the reflog

\n", + "comments": "", + "group": "reflog" + }, + "git_reference_lookup": { + "type": "function", + "file": "git2/refs.h", + "line": 37, + "lineto": 37, + "args": [ + { + "name": "out", + "type": "git_reference **", + "comment": "pointer to the looked-up reference" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository to look up the reference" + }, + { + "name": "name", + "type": "const char *", + "comment": "the long name for the reference (e.g. HEAD, refs/heads/master, refs/tags/v0.1.0, ...)" + } + ], + "argline": "git_reference **out, git_repository *repo, const char *name", + "sig": "git_reference **::git_repository *::const char *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_ENOTFOUND, GIT_EINVALIDSPEC or an error code." + }, + "description": "

Lookup a reference by name in a repository.

\n", + "comments": "

The returned reference must be freed by the user.

\n\n

The name will be checked for validity. See git_reference_symbolic_create() for rules about valid names.

\n", + "group": "reference", + "examples": { + "checkout.c": [ + "ex/v1.9.1/checkout.html#git_reference_lookup-15", + "ex/v1.9.1/checkout.html#git_reference_lookup-16" + ], + "general.c": ["ex/v1.9.1/general.html#git_reference_lookup-69"], + "merge.c": ["ex/v1.9.1/merge.html#git_reference_lookup-21"] + } + }, + "git_reference_name_to_id": { + "type": "function", + "file": "git2/refs.h", + "line": 54, + "lineto": 55, + "args": [ + { + "name": "out", + "type": "git_oid *", + "comment": "Pointer to oid to be filled in" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "The repository in which to look up the reference" + }, + { + "name": "name", + "type": "const char *", + "comment": "The long name for the reference (e.g. HEAD, refs/heads/master, refs/tags/v0.1.0, ...)" + } + ], + "argline": "git_oid *out, git_repository *repo, const char *name", + "sig": "git_oid *::git_repository *::const char *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_ENOTFOUND, GIT_EINVALIDSPEC or an error code." + }, + "description": "

Lookup a reference by name and resolve immediately to OID.

\n", + "comments": "

This function provides a quick way to resolve a reference name straight through to the object id that it refers to. This avoids having to allocate or free any git_reference objects for simple situations.

\n\n

The name will be checked for validity. See git_reference_symbolic_create() for rules about valid names.

\n", + "group": "reference" + }, + "git_reference_dwim": { + "type": "function", + "file": "git2/refs.h", + "line": 68, + "lineto": 68, + "args": [ + { + "name": "out", + "type": "git_reference **", + "comment": "pointer in which to store the reference" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository in which to look" + }, + { + "name": "shorthand", + "type": "const char *", + "comment": "the short name for the reference" + } + ], + "argline": "git_reference **out, git_repository *repo, const char *shorthand", + "sig": "git_reference **::git_repository *::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Lookup a reference by DWIMing its short name

\n", + "comments": "

Apply the git precedence rules to the given shorthand to determine which reference the user is referring to.

\n", + "group": "reference", + "examples": { "merge.c": ["ex/v1.9.1/merge.html#git_reference_dwim-22"] } + }, + "git_reference_symbolic_create_matching": { + "type": "function", + "file": "git2/refs.h", + "line": 112, + "lineto": 112, + "args": [ + { + "name": "out", + "type": "git_reference **", + "comment": "Pointer to the newly created reference" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository where that reference will live" + }, + { + "name": "name", + "type": "const char *", + "comment": "The name of the reference" + }, + { + "name": "target", + "type": "const char *", + "comment": "The target of the reference" + }, + { + "name": "force", + "type": "int", + "comment": "Overwrite existing references" + }, + { + "name": "current_value", + "type": "const char *", + "comment": "The expected value of the reference when updating" + }, + { + "name": "log_message", + "type": "const char *", + "comment": "The one line long message to be appended to the reflog" + } + ], + "argline": "git_reference **out, git_repository *repo, const char *name, const char *target, int force, const char *current_value, const char *log_message", + "sig": "git_reference **::git_repository *::const char *::const char *::int::const char *::const char *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_EEXISTS, GIT_EINVALIDSPEC, GIT_EMODIFIED or an error code" + }, + "description": "

Conditionally create a new symbolic reference.

\n", + "comments": "

A symbolic reference is a reference name that refers to another reference name. If the other name moves, the symbolic name will move, too. As a simple example, the "HEAD" reference might refer to "refs/heads/master" while on the "master" branch of a repository.

\n\n

The symbolic reference will be created in the repository and written to the disk. The generated reference object must be freed by the user.

\n\n

Valid reference names must follow one of two patterns:

\n\n
    \n
  1. Top-level names must contain only capital letters and underscores, and must begin and end with a letter. (e.g. "HEAD", "ORIG_HEAD"). 2. Names prefixed with "refs/" can be almost anything. You must avoid the characters '~', '^', ':', '\\', '?', '[', and '*', and the sequences ".." and "@{" which have special meaning to revparse.
  2. \n
\n\n

This function will return an error if a reference already exists with the given name unless force is true, in which case it will be overwritten.

\n\n

The message for the reflog will be ignored if the reference does not belong in the standard set (HEAD, branches and remote-tracking branches) and it does not have a reflog.

\n\n

It will return GIT_EMODIFIED if the reference's value at the time of updating does not match the one passed through current_value (i.e. if the ref has changed since the user read it).

\n\n

If current_value is all zeros, this function will return GIT_EMODIFIED if the ref already exists.

\n", + "group": "reference" + }, + "git_reference_symbolic_create": { + "type": "function", + "file": "git2/refs.h", + "line": 148, + "lineto": 148, + "args": [ + { + "name": "out", + "type": "git_reference **", + "comment": "Pointer to the newly created reference" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository where that reference will live" + }, + { + "name": "name", + "type": "const char *", + "comment": "The name of the reference" + }, + { + "name": "target", + "type": "const char *", + "comment": "The target of the reference" + }, + { + "name": "force", + "type": "int", + "comment": "Overwrite existing references" + }, + { + "name": "log_message", + "type": "const char *", + "comment": "The one line long message to be appended to the reflog" + } + ], + "argline": "git_reference **out, git_repository *repo, const char *name, const char *target, int force, const char *log_message", + "sig": "git_reference **::git_repository *::const char *::const char *::int::const char *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_EEXISTS, GIT_EINVALIDSPEC or an error code" + }, + "description": "

Create a new symbolic reference.

\n", + "comments": "

A symbolic reference is a reference name that refers to another reference name. If the other name moves, the symbolic name will move, too. As a simple example, the "HEAD" reference might refer to "refs/heads/master" while on the "master" branch of a repository.

\n\n

The symbolic reference will be created in the repository and written to the disk. The generated reference object must be freed by the user.

\n\n

Valid reference names must follow one of two patterns:

\n\n
    \n
  1. Top-level names must contain only capital letters and underscores, and must begin and end with a letter. (e.g. "HEAD", "ORIG_HEAD"). 2. Names prefixed with "refs/" can be almost anything. You must avoid the characters '~', '^', ':', '\\', '?', '[', and '*', and the sequences ".." and "@{" which have special meaning to revparse.
  2. \n
\n\n

This function will return an error if a reference already exists with the given name unless force is true, in which case it will be overwritten.

\n\n

The message for the reflog will be ignored if the reference does not belong in the standard set (HEAD, branches and remote-tracking branches) and it does not have a reflog.

\n", + "group": "reference" + }, + "git_reference_create": { + "type": "function", + "file": "git2/refs.h", + "line": 185, + "lineto": 185, + "args": [ + { + "name": "out", + "type": "git_reference **", + "comment": "Pointer to the newly created reference" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository where that reference will live" + }, + { + "name": "name", + "type": "const char *", + "comment": "The name of the reference" + }, + { + "name": "id", + "type": "const git_oid *", + "comment": "The object id pointed to by the reference." + }, + { + "name": "force", + "type": "int", + "comment": "Overwrite existing references" + }, + { + "name": "log_message", + "type": "const char *", + "comment": "The one line long message to be appended to the reflog" + } + ], + "argline": "git_reference **out, git_repository *repo, const char *name, const git_oid *id, int force, const char *log_message", + "sig": "git_reference **::git_repository *::const char *::const git_oid *::int::const char *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_EEXISTS, GIT_EINVALIDSPEC or an error code" + }, + "description": "

Create a new direct reference.

\n", + "comments": "

A direct reference (also called an object id reference) refers directly to a specific object id (a.k.a. OID or SHA) in the repository. The id permanently refers to the object (although the reference itself can be moved). For example, in libgit2 the direct ref "refs/tags/v0.17.0" refers to OID 5b9fac39d8a76b9139667c26a63e6b3f204b3977.

\n\n

The direct reference will be created in the repository and written to the disk. The generated reference object must be freed by the user.

\n\n

Valid reference names must follow one of two patterns:

\n\n
    \n
  1. Top-level names must contain only capital letters and underscores, and must begin and end with a letter. (e.g. "HEAD", "ORIG_HEAD"). 2. Names prefixed with "refs/" can be almost anything. You must avoid the characters '~', '^', ':', '\\', '?', '[', and '*', and the sequences ".." and "@{" which have special meaning to revparse.
  2. \n
\n\n

This function will return an error if a reference already exists with the given name unless force is true, in which case it will be overwritten.

\n\n

The message for the reflog will be ignored if the reference does not belong in the standard set (HEAD, branches and remote-tracking branches) and it does not have a reflog.

\n", + "group": "reference", + "examples": { + "merge.c": ["ex/v1.9.1/merge.html#git_reference_create-23"] + } + }, + "git_reference_create_matching": { + "type": "function", + "file": "git2/refs.h", + "line": 228, + "lineto": 228, + "args": [ + { + "name": "out", + "type": "git_reference **", + "comment": "Pointer to the newly created reference" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository where that reference will live" + }, + { + "name": "name", + "type": "const char *", + "comment": "The name of the reference" + }, + { + "name": "id", + "type": "const git_oid *", + "comment": "The object id pointed to by the reference." + }, + { + "name": "force", + "type": "int", + "comment": "Overwrite existing references" + }, + { + "name": "current_id", + "type": "const git_oid *", + "comment": "The expected value of the reference at the time of update" + }, + { + "name": "log_message", + "type": "const char *", + "comment": "The one line long message to be appended to the reflog" + } + ], + "argline": "git_reference **out, git_repository *repo, const char *name, const git_oid *id, int force, const git_oid *current_id, const char *log_message", + "sig": "git_reference **::git_repository *::const char *::const git_oid *::int::const git_oid *::const char *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_EMODIFIED if the value of the reference\n has changed, GIT_EEXISTS, GIT_EINVALIDSPEC or an error code" + }, + "description": "

Conditionally create new direct reference

\n", + "comments": "

A direct reference (also called an object id reference) refers directly to a specific object id (a.k.a. OID or SHA) in the repository. The id permanently refers to the object (although the reference itself can be moved). For example, in libgit2 the direct ref "refs/tags/v0.17.0" refers to OID 5b9fac39d8a76b9139667c26a63e6b3f204b3977.

\n\n

The direct reference will be created in the repository and written to the disk. The generated reference object must be freed by the user.

\n\n

Valid reference names must follow one of two patterns:

\n\n
    \n
  1. Top-level names must contain only capital letters and underscores, and must begin and end with a letter. (e.g. "HEAD", "ORIG_HEAD"). 2. Names prefixed with "refs/" can be almost anything. You must avoid the characters '~', '^', ':', '\\', '?', '[', and '*', and the sequences ".." and "@{" which have special meaning to revparse.
  2. \n
\n\n

This function will return an error if a reference already exists with the given name unless force is true, in which case it will be overwritten.

\n\n

The message for the reflog will be ignored if the reference does not belong in the standard set (HEAD, branches and remote-tracking branches) and it does not have a reflog.

\n\n

It will return GIT_EMODIFIED if the reference's value at the time of updating does not match the one passed through current_id (i.e. if the ref has changed since the user read it).

\n", + "group": "reference" + }, + "git_reference_target": { + "type": "function", + "file": "git2/refs.h", + "line": 243, + "lineto": 243, + "args": [ + { + "name": "ref", + "type": "const git_reference *", + "comment": "The reference" + } + ], + "argline": "const git_reference *ref", + "sig": "const git_reference *", + "return": { + "type": "const git_oid *", + "comment": " a pointer to the oid if available, NULL otherwise" + }, + "description": "

Get the OID pointed to by a direct reference.

\n", + "comments": "

Only available if the reference is direct (i.e. an object id reference, not a symbolic one).

\n\n

To find the OID of a symbolic ref, call git_reference_resolve() and then this function (or maybe use git_reference_name_to_id() to directly resolve a reference name all the way through to an OID).

\n", + "group": "reference", + "examples": { + "general.c": ["ex/v1.9.1/general.html#git_reference_target-70"] + } + }, + "git_reference_target_peel": { + "type": "function", + "file": "git2/refs.h", + "line": 254, + "lineto": 254, + "args": [ + { + "name": "ref", + "type": "const git_reference *", + "comment": "The reference" + } + ], + "argline": "const git_reference *ref", + "sig": "const git_reference *", + "return": { + "type": "const git_oid *", + "comment": " a pointer to the oid if available, NULL otherwise" + }, + "description": "

Return the peeled OID target of this reference.

\n", + "comments": "

This peeled OID only applies to direct references that point to a hard Tag object: it is the result of peeling such Tag.

\n", + "group": "reference" + }, + "git_reference_symbolic_target": { + "type": "function", + "file": "git2/refs.h", + "line": 264, + "lineto": 264, + "args": [ + { + "name": "ref", + "type": "const git_reference *", + "comment": "The reference" + } + ], + "argline": "const git_reference *ref", + "sig": "const git_reference *", + "return": { + "type": "const char *", + "comment": " a pointer to the name if available, NULL otherwise" + }, + "description": "

Get full name to the reference pointed to by a symbolic reference.

\n", + "comments": "

Only available if the reference is symbolic.

\n", + "group": "reference", + "examples": { + "general.c": [ + "ex/v1.9.1/general.html#git_reference_symbolic_target-71" + ], + "merge.c": ["ex/v1.9.1/merge.html#git_reference_symbolic_target-24"] + } + }, + "git_reference_type": { + "type": "function", + "file": "git2/refs.h", + "line": 274, + "lineto": 274, + "args": [ + { + "name": "ref", + "type": "const git_reference *", + "comment": "The reference" + } + ], + "argline": "const git_reference *ref", + "sig": "const git_reference *", + "return": { "type": "git_reference_t", "comment": " the type" }, + "description": "

Get the type of a reference.

\n", + "comments": "

Either direct (GIT_REFERENCE_DIRECT) or symbolic (GIT_REFERENCE_SYMBOLIC)

\n", + "group": "reference", + "examples": { + "general.c": ["ex/v1.9.1/general.html#git_reference_type-72"] + } + }, + "git_reference_name": { + "type": "function", + "file": "git2/refs.h", + "line": 284, + "lineto": 284, + "args": [ + { + "name": "ref", + "type": "const git_reference *", + "comment": "The reference" + } + ], + "argline": "const git_reference *ref", + "sig": "const git_reference *", + "return": { + "type": "const char *", + "comment": " the full name for the ref" + }, + "description": "

Get the full name of a reference.

\n", + "comments": "

See git_reference_symbolic_create() for rules about valid names.

\n", + "group": "reference", + "examples": { + "checkout.c": ["ex/v1.9.1/checkout.html#git_reference_name-17"], + "merge.c": ["ex/v1.9.1/merge.html#git_reference_name-25"] + } + }, + "git_reference_resolve": { + "type": "function", + "file": "git2/refs.h", + "line": 302, + "lineto": 302, + "args": [ + { + "name": "out", + "type": "git_reference **", + "comment": "Pointer to the peeled reference" + }, + { + "name": "ref", + "type": "const git_reference *", + "comment": "The reference" + } + ], + "argline": "git_reference **out, const git_reference *ref", + "sig": "git_reference **::const git_reference *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Resolve a symbolic reference to a direct reference.

\n", + "comments": "

This method iteratively peels a symbolic reference until it resolves to a direct reference to an OID.

\n\n

The peeled reference is returned in the resolved_ref argument, and must be freed manually once it's no longer needed.

\n\n

If a direct reference is passed as an argument, a copy of that reference is returned. This copy must be manually freed too.

\n", + "group": "reference" + }, + "git_reference_owner": { + "type": "function", + "file": "git2/refs.h", + "line": 310, + "lineto": 310, + "args": [ + { + "name": "ref", + "type": "const git_reference *", + "comment": "The reference" + } + ], + "argline": "const git_reference *ref", + "sig": "const git_reference *", + "return": { + "type": "git_repository *", + "comment": " a pointer to the repo" + }, + "description": "

Get the repository where a reference resides.

\n", + "comments": "", + "group": "reference" + }, + "git_reference_symbolic_set_target": { + "type": "function", + "file": "git2/refs.h", + "line": 332, + "lineto": 336, + "args": [ + { + "name": "out", + "type": "git_reference **", + "comment": "Pointer to the newly created reference" + }, + { + "name": "ref", + "type": "git_reference *", + "comment": "The reference" + }, + { + "name": "target", + "type": "const char *", + "comment": "The new target for the reference" + }, + { + "name": "log_message", + "type": "const char *", + "comment": "The one line long message to be appended to the reflog" + } + ], + "argline": "git_reference **out, git_reference *ref, const char *target, const char *log_message", + "sig": "git_reference **::git_reference *::const char *::const char *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_EINVALIDSPEC or an error code" + }, + "description": "

Create a new reference with the same name as the given reference but a\n different symbolic target. The reference must be a symbolic reference,\n otherwise this will fail.

\n", + "comments": "

The new reference will be written to disk, overwriting the given reference.

\n\n

The target name will be checked for validity. See git_reference_symbolic_create() for rules about valid names.

\n\n

The message for the reflog will be ignored if the reference does not belong in the standard set (HEAD, branches and remote-tracking branches) and it does not have a reflog.

\n", + "group": "reference" + }, + "git_reference_set_target": { + "type": "function", + "file": "git2/refs.h", + "line": 352, + "lineto": 356, + "args": [ + { + "name": "out", + "type": "git_reference **", + "comment": "Pointer to the newly created reference" + }, + { + "name": "ref", + "type": "git_reference *", + "comment": "The reference" + }, + { + "name": "id", + "type": "const git_oid *", + "comment": "The new target OID for the reference" + }, + { + "name": "log_message", + "type": "const char *", + "comment": "The one line long message to be appended to the reflog" + } + ], + "argline": "git_reference **out, git_reference *ref, const git_oid *id, const char *log_message", + "sig": "git_reference **::git_reference *::const git_oid *::const char *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_EMODIFIED if the value of the reference\n has changed since it was read, or an error code" + }, + "description": "

Conditionally create a new reference with the same name as the given reference but a\n different OID target. The reference must be a direct reference, otherwise\n this will fail.

\n", + "comments": "

The new reference will be written to disk, overwriting the given reference.

\n", + "group": "reference", + "examples": { + "merge.c": ["ex/v1.9.1/merge.html#git_reference_set_target-26"] + } + }, + "git_reference_rename": { + "type": "function", + "file": "git2/refs.h", + "line": 382, + "lineto": 387, + "args": [ + { + "name": "new_ref", + "type": "git_reference **", + "comment": "The new reference" + }, + { + "name": "ref", + "type": "git_reference *", + "comment": "The reference to rename" + }, + { + "name": "new_name", + "type": "const char *", + "comment": "The new name for the reference" + }, + { + "name": "force", + "type": "int", + "comment": "Overwrite an existing reference" + }, + { + "name": "log_message", + "type": "const char *", + "comment": "The one line long message to be appended to the reflog" + } + ], + "argline": "git_reference **new_ref, git_reference *ref, const char *new_name, int force, const char *log_message", + "sig": "git_reference **::git_reference *::const char *::int::const char *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_EINVALIDSPEC, GIT_EEXISTS or an error code" + }, + "description": "

Rename an existing reference.

\n", + "comments": "

This method works for both direct and symbolic references.

\n\n

The new name will be checked for validity. See git_reference_symbolic_create() for rules about valid names.

\n\n

If the force flag is not enabled, and there's already a reference with the given name, the renaming will fail.

\n\n

IMPORTANT: The user needs to write a proper reflog entry if the reflog is enabled for the repository. We only rename the reflog if it exists.

\n", + "group": "reference" + }, + "git_reference_delete": { + "type": "function", + "file": "git2/refs.h", + "line": 402, + "lineto": 402, + "args": [ + { + "name": "ref", + "type": "git_reference *", + "comment": "The reference to remove" + } + ], + "argline": "git_reference *ref", + "sig": "git_reference *", + "return": { + "type": "int", + "comment": " 0, GIT_EMODIFIED or an error code" + }, + "description": "

Delete an existing reference.

\n", + "comments": "

This method works for both direct and symbolic references. The reference will be immediately removed on disk but the memory will not be freed. Callers must call git_reference_free.

\n\n

This function will return an error if the reference has changed from the time it was looked up.

\n", + "group": "reference" + }, + "git_reference_remove": { + "type": "function", + "file": "git2/refs.h", + "line": 414, + "lineto": 414, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "The repository to remove the reference from" + }, + { + "name": "name", + "type": "const char *", + "comment": "The reference to remove" + } + ], + "argline": "git_repository *repo, const char *name", + "sig": "git_repository *::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Delete an existing reference by name

\n", + "comments": "

This method removes the named reference from the repository without looking at its old value.

\n", + "group": "reference" + }, + "git_reference_list": { + "type": "function", + "file": "git2/refs.h", + "line": 428, + "lineto": 428, + "args": [ + { + "name": "array", + "type": "git_strarray *", + "comment": "Pointer to a git_strarray structure where\n\t\tthe reference names will be stored" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository where to find the refs" + } + ], + "argline": "git_strarray *array, git_repository *repo", + "sig": "git_strarray *::git_repository *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Fill a list with all the references that can be found in a repository.

\n", + "comments": "

The string array will be filled with the names of all references; these values are owned by the user and should be free'd manually when no longer needed, using git_strarray_free().

\n", + "group": "reference", + "examples": { + "general.c": ["ex/v1.9.1/general.html#git_reference_list-73"] + } + }, + "git_reference_foreach": { + "type": "function", + "file": "git2/refs.h", + "line": 468, + "lineto": 471, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository where to find the refs" + }, + { + "name": "callback", + "type": "git_reference_foreach_cb", + "comment": "Function which will be called for every listed ref" + }, + { + "name": "payload", + "type": "void *", + "comment": "Additional data to pass to the callback" + } + ], + "argline": "git_repository *repo, git_reference_foreach_cb callback, void *payload", + "sig": "git_repository *::git_reference_foreach_cb::void *", + "return": { + "type": "int", + "comment": " 0 on success, non-zero callback return value, or error code" + }, + "description": "

Perform a callback on each reference in the repository.

\n", + "comments": "

The callback function will be called for each reference in the repository, receiving the reference object and the payload value passed to this method. Returning a non-zero value from the callback will terminate the iteration.

\n\n

Note that the callback function is responsible to call git_reference_free on each reference passed to it.

\n", + "group": "reference" + }, + "git_reference_foreach_name": { + "type": "function", + "file": "git2/refs.h", + "line": 486, + "lineto": 489, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository where to find the refs" + }, + { + "name": "callback", + "type": "git_reference_foreach_name_cb", + "comment": "Function which will be called for every listed ref name" + }, + { + "name": "payload", + "type": "void *", + "comment": "Additional data to pass to the callback" + } + ], + "argline": "git_repository *repo, git_reference_foreach_name_cb callback, void *payload", + "sig": "git_repository *::git_reference_foreach_name_cb::void *", + "return": { + "type": "int", + "comment": " 0 on success, non-zero callback return value, or error code" + }, + "description": "

Perform a callback on the fully-qualified name of each reference.

\n", + "comments": "

The callback function will be called for each reference in the repository, receiving the name of the reference and the payload value passed to this method. Returning a non-zero value from the callback will terminate the iteration.

\n", + "group": "reference" + }, + "git_reference_dup": { + "type": "function", + "file": "git2/refs.h", + "line": 500, + "lineto": 500, + "args": [ + { + "name": "dest", + "type": "git_reference **", + "comment": "pointer where to store the copy" + }, + { + "name": "source", + "type": "git_reference *", + "comment": "object to copy" + } + ], + "argline": "git_reference **dest, git_reference *source", + "sig": "git_reference **::git_reference *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Create a copy of an existing reference.

\n", + "comments": "

Call git_reference_free to free the data.

\n", + "group": "reference" + }, + "git_reference_free": { + "type": "function", + "file": "git2/refs.h", + "line": 507, + "lineto": 507, + "args": [ + { "name": "ref", "type": "git_reference *", "comment": "git_reference" } + ], + "argline": "git_reference *ref", + "sig": "git_reference *", + "return": { "type": "void", "comment": null }, + "description": "

Free the given reference.

\n", + "comments": "", + "group": "reference", + "examples": { + "checkout.c": [ + "ex/v1.9.1/checkout.html#git_reference_free-18", + "ex/v1.9.1/checkout.html#git_reference_free-19", + "ex/v1.9.1/checkout.html#git_reference_free-20" + ], + "commit.c": ["ex/v1.9.1/commit.html#git_reference_free-7"], + "general.c": ["ex/v1.9.1/general.html#git_reference_free-74"], + "merge.c": [ + "ex/v1.9.1/merge.html#git_reference_free-27", + "ex/v1.9.1/merge.html#git_reference_free-28", + "ex/v1.9.1/merge.html#git_reference_free-29" + ], + "status.c": ["ex/v1.9.1/status.html#git_reference_free-1"] + } + }, + "git_reference_cmp": { + "type": "function", + "file": "git2/refs.h", + "line": 516, + "lineto": 518, + "args": [ + { + "name": "ref1", + "type": "const git_reference *", + "comment": "The first git_reference" + }, + { + "name": "ref2", + "type": "const git_reference *", + "comment": "The second git_reference" + } + ], + "argline": "const git_reference *ref1, const git_reference *ref2", + "sig": "const git_reference *::const git_reference *", + "return": { + "type": "int", + "comment": " 0 if the same, else a stable but meaningless ordering." + }, + "description": "

Compare two references.

\n", + "comments": "", + "group": "reference" + }, + "git_reference_iterator_new": { + "type": "function", + "file": "git2/refs.h", + "line": 527, + "lineto": 529, + "args": [ + { + "name": "out", + "type": "git_reference_iterator **", + "comment": "pointer in which to store the iterator" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository" + } + ], + "argline": "git_reference_iterator **out, git_repository *repo", + "sig": "git_reference_iterator **::git_repository *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Create an iterator for the repo's references

\n", + "comments": "", + "group": "reference" + }, + "git_reference_iterator_glob_new": { + "type": "function", + "file": "git2/refs.h", + "line": 540, + "lineto": 543, + "args": [ + { + "name": "out", + "type": "git_reference_iterator **", + "comment": "pointer in which to store the iterator" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository" + }, + { + "name": "glob", + "type": "const char *", + "comment": "the glob to match against the reference names" + } + ], + "argline": "git_reference_iterator **out, git_repository *repo, const char *glob", + "sig": "git_reference_iterator **::git_repository *::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Create an iterator for the repo's references that match the\n specified glob

\n", + "comments": "", + "group": "reference" + }, + "git_reference_next": { + "type": "function", + "file": "git2/refs.h", + "line": 552, + "lineto": 552, + "args": [ + { + "name": "out", + "type": "git_reference **", + "comment": "pointer in which to store the reference" + }, + { + "name": "iter", + "type": "git_reference_iterator *", + "comment": "the iterator" + } + ], + "argline": "git_reference **out, git_reference_iterator *iter", + "sig": "git_reference **::git_reference_iterator *", + "return": { + "type": "int", + "comment": " 0, GIT_ITEROVER if there are no more; or an error code" + }, + "description": "

Get the next reference

\n", + "comments": "", + "group": "reference" + }, + "git_reference_next_name": { + "type": "function", + "file": "git2/refs.h", + "line": 565, + "lineto": 565, + "args": [ + { + "name": "out", + "type": "const char **", + "comment": "pointer in which to store the string" + }, + { + "name": "iter", + "type": "git_reference_iterator *", + "comment": "the iterator" + } + ], + "argline": "const char **out, git_reference_iterator *iter", + "sig": "const char **::git_reference_iterator *", + "return": { + "type": "int", + "comment": " 0, GIT_ITEROVER if there are no more; or an error code" + }, + "description": "

Get the next reference's name

\n", + "comments": "

This function is provided for convenience in case only the names are interesting as it avoids the allocation of the git_reference object which git_reference_next() needs.

\n", + "group": "reference" + }, + "git_reference_iterator_free": { + "type": "function", + "file": "git2/refs.h", + "line": 572, + "lineto": 572, + "args": [ + { + "name": "iter", + "type": "git_reference_iterator *", + "comment": "the iterator to free" + } + ], + "argline": "git_reference_iterator *iter", + "sig": "git_reference_iterator *", + "return": { "type": "void", "comment": null }, + "description": "

Free the iterator and its associated resources

\n", + "comments": "", + "group": "reference" + }, + "git_reference_foreach_glob": { + "type": "function", + "file": "git2/refs.h", + "line": 592, + "lineto": 596, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository where to find the refs" + }, + { + "name": "glob", + "type": "const char *", + "comment": "Pattern to match (fnmatch-style) against reference name." + }, + { + "name": "callback", + "type": "git_reference_foreach_name_cb", + "comment": "Function which will be called for every listed ref" + }, + { + "name": "payload", + "type": "void *", + "comment": "Additional data to pass to the callback" + } + ], + "argline": "git_repository *repo, const char *glob, git_reference_foreach_name_cb callback, void *payload", + "sig": "git_repository *::const char *::git_reference_foreach_name_cb::void *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_EUSER on non-zero callback, or error code" + }, + "description": "

Perform a callback on each reference in the repository whose name\n matches the given pattern.

\n", + "comments": "

This function acts like git_reference_foreach() with an additional pattern match being applied to the reference name before issuing the callback function. See that function for more information.

\n\n

The pattern is matched using fnmatch or "glob" style where a '*' matches any sequence of letters, a '?' matches any letter, and square brackets can be used to define character ranges (such as "[0-9]" for digits).

\n", + "group": "reference" + }, + "git_reference_has_log": { + "type": "function", + "file": "git2/refs.h", + "line": 606, + "lineto": 606, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository" + }, + { + "name": "refname", + "type": "const char *", + "comment": "the reference's name" + } + ], + "argline": "git_repository *repo, const char *refname", + "sig": "git_repository *::const char *", + "return": { + "type": "int", + "comment": " 0 when no reflog can be found, 1 when it exists;\n otherwise an error code." + }, + "description": "

Check if a reflog exists for the specified reference.

\n", + "comments": "", + "group": "reference" + }, + "git_reference_ensure_log": { + "type": "function", + "file": "git2/refs.h", + "line": 618, + "lineto": 618, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository" + }, + { + "name": "refname", + "type": "const char *", + "comment": "the reference's name" + } + ], + "argline": "git_repository *repo, const char *refname", + "sig": "git_repository *::const char *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Ensure there is a reflog for a particular reference.

\n", + "comments": "

Make sure that successive updates to the reference will append to its log.

\n", + "group": "reference" + }, + "git_reference_is_branch": { + "type": "function", + "file": "git2/refs.h", + "line": 628, + "lineto": 628, + "args": [ + { + "name": "ref", + "type": "const git_reference *", + "comment": "A git reference" + } + ], + "argline": "const git_reference *ref", + "sig": "const git_reference *", + "return": { + "type": "int", + "comment": " 1 when the reference lives in the refs/heads\n namespace; 0 otherwise." + }, + "description": "

Check if a reference is a local branch.

\n", + "comments": "", + "group": "reference" + }, + "git_reference_is_remote": { + "type": "function", + "file": "git2/refs.h", + "line": 638, + "lineto": 638, + "args": [ + { + "name": "ref", + "type": "const git_reference *", + "comment": "A git reference" + } + ], + "argline": "const git_reference *ref", + "sig": "const git_reference *", + "return": { + "type": "int", + "comment": " 1 when the reference lives in the refs/remotes\n namespace; 0 otherwise." + }, + "description": "

Check if a reference is a remote tracking branch

\n", + "comments": "", + "group": "reference", + "examples": { + "checkout.c": ["ex/v1.9.1/checkout.html#git_reference_is_remote-21"] + } + }, + "git_reference_is_tag": { + "type": "function", + "file": "git2/refs.h", + "line": 648, + "lineto": 648, + "args": [ + { + "name": "ref", + "type": "const git_reference *", + "comment": "A git reference" + } + ], + "argline": "const git_reference *ref", + "sig": "const git_reference *", + "return": { + "type": "int", + "comment": " 1 when the reference lives in the refs/tags\n namespace; 0 otherwise." + }, + "description": "

Check if a reference is a tag

\n", + "comments": "", + "group": "reference" + }, + "git_reference_is_note": { + "type": "function", + "file": "git2/refs.h", + "line": 658, + "lineto": 658, + "args": [ + { + "name": "ref", + "type": "const git_reference *", + "comment": "A git reference" + } + ], + "argline": "const git_reference *ref", + "sig": "const git_reference *", + "return": { + "type": "int", + "comment": " 1 when the reference lives in the refs/notes\n namespace; 0 otherwise." + }, + "description": "

Check if a reference is a note

\n", + "comments": "", + "group": "reference" + }, + "git_reference_normalize_name": { + "type": "function", + "file": "git2/refs.h", + "line": 714, + "lineto": 718, + "args": [ + { + "name": "buffer_out", + "type": "char *", + "comment": "User allocated buffer to store normalized name" + }, + { + "name": "buffer_size", + "type": "size_t", + "comment": "Size of buffer_out" + }, + { + "name": "name", + "type": "const char *", + "comment": "Reference name to be checked." + }, + { + "name": "flags", + "type": "unsigned int", + "comment": "Flags to constrain name validation rules - see the\n GIT_REFERENCE_FORMAT constants above." + } + ], + "argline": "char *buffer_out, size_t buffer_size, const char *name, unsigned int flags", + "sig": "char *::size_t::const char *::unsigned int", + "return": { + "type": "int", + "comment": " 0 on success, GIT_EBUFS if buffer is too small, GIT_EINVALIDSPEC\n or an error code." + }, + "description": "

Normalize reference name and check validity.

\n", + "comments": "

This will normalize the reference name by removing any leading slash '/' characters and collapsing runs of adjacent slashes between name components into a single slash.

\n\n

Once normalized, if the reference name is valid, it will be returned in the user allocated buffer.

\n\n

See git_reference_symbolic_create() for rules about valid names.

\n", + "group": "reference" + }, + "git_reference_peel": { + "type": "function", + "file": "git2/refs.h", + "line": 735, + "lineto": 738, + "args": [ + { + "name": "out", + "type": "git_object **", + "comment": "Pointer to the peeled git_object" + }, + { + "name": "ref", + "type": "const git_reference *", + "comment": "The reference to be processed" + }, + { + "name": "type", + "type": "git_object_t", + "comment": "The type of the requested object (GIT_OBJECT_COMMIT,\n GIT_OBJECT_TAG, GIT_OBJECT_TREE, GIT_OBJECT_BLOB or GIT_OBJECT_ANY)." + } + ], + "argline": "git_object **out, const git_reference *ref, git_object_t type", + "sig": "git_object **::const git_reference *::git_object_t", + "return": { + "type": "int", + "comment": " 0 on success, GIT_EAMBIGUOUS, GIT_ENOTFOUND or an error code" + }, + "description": "

Recursively peel reference until object of the specified type is found.

\n", + "comments": "

The retrieved peeled object is owned by the repository and should be closed with the git_object_free method.

\n\n

If you pass GIT_OBJECT_ANY as the target type, then the object will be peeled until a non-tag object is met.

\n", + "group": "reference", + "examples": { "merge.c": ["ex/v1.9.1/merge.html#git_reference_peel-30"] } + }, + "git_reference_name_is_valid": { + "type": "function", + "file": "git2/refs.h", + "line": 755, + "lineto": 755, + "args": [ + { + "name": "valid", + "type": "int *", + "comment": "output pointer to set with validity of given reference name" + }, + { + "name": "refname", + "type": "const char *", + "comment": "name to be checked." + } + ], + "argline": "int *valid, const char *refname", + "sig": "int *::const char *", + "return": { "type": "int", "comment": " 0 on success or an error code" }, + "description": "

Ensure the reference name is well-formed.

\n", + "comments": "

Valid reference names must follow one of two patterns:

\n\n
    \n
  1. Top-level names must contain only capital letters and underscores, and must begin and end with a letter. (e.g. "HEAD", "ORIG_HEAD"). 2. Names prefixed with "refs/" can be almost anything. You must avoid the characters '~', '^', ':', '\\', '?', '[', and '*', and the sequences ".." and "@{" which have special meaning to revparse.
  2. \n
\n", + "group": "reference" + }, + "git_reference_shorthand": { + "type": "function", + "file": "git2/refs.h", + "line": 769, + "lineto": 769, + "args": [ + { + "name": "ref", + "type": "const git_reference *", + "comment": "a reference" + } + ], + "argline": "const git_reference *ref", + "sig": "const git_reference *", + "return": { + "type": "const char *", + "comment": " the human-readable version of the name" + }, + "description": "

Get the reference's short name

\n", + "comments": "

This will transform the reference name into a name "human-readable" version. If no shortname is appropriate, it will return the full name.

\n\n

The memory is owned by the reference and must not be freed.

\n", + "group": "reference", + "examples": { + "status.c": ["ex/v1.9.1/status.html#git_reference_shorthand-2"] + } + }, + "git_refspec_parse": { + "type": "function", + "file": "git2/refspec.h", + "line": 32, + "lineto": 32, + "args": [ + { + "name": "refspec", + "type": "git_refspec **", + "comment": "a pointer to hold the refspec handle" + }, + { + "name": "input", + "type": "const char *", + "comment": "the refspec string" + }, + { + "name": "is_fetch", + "type": "int", + "comment": "is this a refspec for a fetch" + } + ], + "argline": "git_refspec **refspec, const char *input, int is_fetch", + "sig": "git_refspec **::const char *::int", + "return": { + "type": "int", + "comment": " 0 if the refspec string could be parsed, -1 otherwise" + }, + "description": "

Parse a given refspec string

\n", + "comments": "", + "group": "refspec" + }, + "git_refspec_free": { + "type": "function", + "file": "git2/refspec.h", + "line": 39, + "lineto": 39, + "args": [ + { + "name": "refspec", + "type": "git_refspec *", + "comment": "the refspec object" + } + ], + "argline": "git_refspec *refspec", + "sig": "git_refspec *", + "return": { "type": "void", "comment": null }, + "description": "

Free a refspec object which has been created by git_refspec_parse

\n", + "comments": "", + "group": "refspec" + }, + "git_refspec_src": { + "type": "function", + "file": "git2/refspec.h", + "line": 47, + "lineto": 47, + "args": [ + { + "name": "refspec", + "type": "const git_refspec *", + "comment": "the refspec" + } + ], + "argline": "const git_refspec *refspec", + "sig": "const git_refspec *", + "return": { + "type": "const char *", + "comment": " the refspec's source specifier" + }, + "description": "

Get the source specifier

\n", + "comments": "", + "group": "refspec" + }, + "git_refspec_dst": { + "type": "function", + "file": "git2/refspec.h", + "line": 55, + "lineto": 55, + "args": [ + { + "name": "refspec", + "type": "const git_refspec *", + "comment": "the refspec" + } + ], + "argline": "const git_refspec *refspec", + "sig": "const git_refspec *", + "return": { + "type": "const char *", + "comment": " the refspec's destination specifier" + }, + "description": "

Get the destination specifier

\n", + "comments": "", + "group": "refspec" + }, + "git_refspec_string": { + "type": "function", + "file": "git2/refspec.h", + "line": 63, + "lineto": 63, + "args": [ + { + "name": "refspec", + "type": "const git_refspec *", + "comment": "the refspec" + } + ], + "argline": "const git_refspec *refspec", + "sig": "const git_refspec *", + "return": { + "type": "const char *", + "comment": " the refspec's original string" + }, + "description": "

Get the refspec's string

\n", + "comments": "", + "group": "refspec" + }, + "git_refspec_force": { + "type": "function", + "file": "git2/refspec.h", + "line": 71, + "lineto": 71, + "args": [ + { + "name": "refspec", + "type": "const git_refspec *", + "comment": "the refspec" + } + ], + "argline": "const git_refspec *refspec", + "sig": "const git_refspec *", + "return": { + "type": "int", + "comment": " 1 if force update has been set, 0 otherwise" + }, + "description": "

Get the force update setting

\n", + "comments": "", + "group": "refspec" + }, + "git_refspec_direction": { + "type": "function", + "file": "git2/refspec.h", + "line": 79, + "lineto": 79, + "args": [ + { "name": "spec", "type": "const git_refspec *", "comment": "refspec" } + ], + "argline": "const git_refspec *spec", + "sig": "const git_refspec *", + "return": { + "type": "git_direction", + "comment": " GIT_DIRECTION_FETCH or GIT_DIRECTION_PUSH" + }, + "description": "

Get the refspec's direction.

\n", + "comments": "", + "group": "refspec" + }, + "git_refspec_src_matches_negative": { + "type": "function", + "file": "git2/refspec.h", + "line": 88, + "lineto": 88, + "args": [ + { + "name": "refspec", + "type": "const git_refspec *", + "comment": "the refspec" + }, + { + "name": "refname", + "type": "const char *", + "comment": "the name of the reference to check" + } + ], + "argline": "const git_refspec *refspec, const char *refname", + "sig": "const git_refspec *::const char *", + "return": { + "type": "int", + "comment": " 1 if the refspec matches, 0 otherwise" + }, + "description": "

Check if a refspec's source descriptor matches a negative reference

\n", + "comments": "", + "group": "refspec" + }, + "git_refspec_src_matches": { + "type": "function", + "file": "git2/refspec.h", + "line": 97, + "lineto": 97, + "args": [ + { + "name": "refspec", + "type": "const git_refspec *", + "comment": "the refspec" + }, + { + "name": "refname", + "type": "const char *", + "comment": "the name of the reference to check" + } + ], + "argline": "const git_refspec *refspec, const char *refname", + "sig": "const git_refspec *::const char *", + "return": { + "type": "int", + "comment": " 1 if the refspec matches, 0 otherwise" + }, + "description": "

Check if a refspec's source descriptor matches a reference

\n", + "comments": "", + "group": "refspec" + }, + "git_refspec_dst_matches": { + "type": "function", + "file": "git2/refspec.h", + "line": 106, + "lineto": 106, + "args": [ + { + "name": "refspec", + "type": "const git_refspec *", + "comment": "the refspec" + }, + { + "name": "refname", + "type": "const char *", + "comment": "the name of the reference to check" + } + ], + "argline": "const git_refspec *refspec, const char *refname", + "sig": "const git_refspec *::const char *", + "return": { + "type": "int", + "comment": " 1 if the refspec matches, 0 otherwise" + }, + "description": "

Check if a refspec's destination descriptor matches a reference

\n", + "comments": "", + "group": "refspec" + }, + "git_refspec_transform": { + "type": "function", + "file": "git2/refspec.h", + "line": 116, + "lineto": 116, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": "where to store the target name" + }, + { + "name": "spec", + "type": "const git_refspec *", + "comment": "the refspec" + }, + { + "name": "name", + "type": "const char *", + "comment": "the name of the reference to transform" + } + ], + "argline": "git_buf *out, const git_refspec *spec, const char *name", + "sig": "git_buf *::const git_refspec *::const char *", + "return": { "type": "int", "comment": " 0, GIT_EBUFS or another error" }, + "description": "

Transform a reference to its target following the refspec's rules

\n", + "comments": "", + "group": "refspec" + }, + "git_refspec_rtransform": { + "type": "function", + "file": "git2/refspec.h", + "line": 126, + "lineto": 126, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": "where to store the source reference name" + }, + { + "name": "spec", + "type": "const git_refspec *", + "comment": "the refspec" + }, + { + "name": "name", + "type": "const char *", + "comment": "the name of the reference to transform" + } + ], + "argline": "git_buf *out, const git_refspec *spec, const char *name", + "sig": "git_buf *::const git_refspec *::const char *", + "return": { "type": "int", "comment": " 0, GIT_EBUFS or another error" }, + "description": "

Transform a target reference to its source reference following the refspec's rules

\n", + "comments": "", + "group": "refspec", + "examples": { + "fetch.c": ["ex/v1.9.1/fetch.html#git_refspec_rtransform-4"] + } + }, + "git_remote_create": { + "type": "function", + "file": "git2/remote.h", + "line": 38, + "lineto": 42, + "args": [ + { + "name": "out", + "type": "git_remote **", + "comment": "the resulting remote" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository in which to create the remote" + }, + { + "name": "name", + "type": "const char *", + "comment": "the remote's name" + }, + { "name": "url", "type": "const char *", "comment": "the remote's url" } + ], + "argline": "git_remote **out, git_repository *repo, const char *name, const char *url", + "sig": "git_remote **::git_repository *::const char *::const char *", + "return": { + "type": "int", + "comment": " 0, GIT_EINVALIDSPEC, GIT_EEXISTS or an error code" + }, + "description": "

Add a remote with the default fetch refspec to the repository's configuration.

\n", + "comments": "", + "group": "remote", + "examples": { "remote.c": ["ex/v1.9.1/remote.html#git_remote_create-1"] } + }, + "git_remote_create_options_init": { + "type": "function", + "file": "git2/remote.h", + "line": 135, + "lineto": 137, + "args": [ + { + "name": "opts", + "type": "git_remote_create_options *", + "comment": "The `git_remote_create_options` struct to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "The struct version; pass `GIT_REMOTE_CREATE_OPTIONS_VERSION`." + } + ], + "argline": "git_remote_create_options *opts, unsigned int version", + "sig": "git_remote_create_options *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initialize git_remote_create_options structure

\n", + "comments": "

Initializes a git_remote_create_options with default values. Equivalent to creating an instance with GIT_REMOTE_CREATE_OPTIONS_INIT.

\n", + "group": "remote" + }, + "git_remote_create_with_opts": { + "type": "function", + "file": "git2/remote.h", + "line": 151, + "lineto": 154, + "args": [ + { + "name": "out", + "type": "git_remote **", + "comment": "the resulting remote" + }, + { + "name": "url", + "type": "const char *", + "comment": "the remote's url" + }, + { + "name": "opts", + "type": "const git_remote_create_options *", + "comment": "the remote creation options" + } + ], + "argline": "git_remote **out, const char *url, const git_remote_create_options *opts", + "sig": "git_remote **::const char *::const git_remote_create_options *", + "return": { + "type": "int", + "comment": " 0, GIT_EINVALIDSPEC, GIT_EEXISTS or an error code" + }, + "description": "

Create a remote, with options.

\n", + "comments": "

This function allows more fine-grained control over the remote creation.

\n\n

Passing NULL as the opts argument will result in a detached remote.

\n", + "group": "remote" + }, + "git_remote_create_with_fetchspec": { + "type": "function", + "file": "git2/remote.h", + "line": 167, + "lineto": 172, + "args": [ + { + "name": "out", + "type": "git_remote **", + "comment": "the resulting remote" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository in which to create the remote" + }, + { + "name": "name", + "type": "const char *", + "comment": "the remote's name" + }, + { + "name": "url", + "type": "const char *", + "comment": "the remote's url" + }, + { + "name": "fetch", + "type": "const char *", + "comment": "the remote fetch value" + } + ], + "argline": "git_remote **out, git_repository *repo, const char *name, const char *url, const char *fetch", + "sig": "git_remote **::git_repository *::const char *::const char *::const char *", + "return": { + "type": "int", + "comment": " 0, GIT_EINVALIDSPEC, GIT_EEXISTS or an error code" + }, + "description": "

Add a remote with the provided fetch refspec (or default if NULL) to the repository's\n configuration.

\n", + "comments": "", + "group": "remote" + }, + "git_remote_create_anonymous": { + "type": "function", + "file": "git2/remote.h", + "line": 185, + "lineto": 188, + "args": [ + { + "name": "out", + "type": "git_remote **", + "comment": "pointer to the new remote objects" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the associated repository" + }, + { + "name": "url", + "type": "const char *", + "comment": "the remote repository's URL" + } + ], + "argline": "git_remote **out, git_repository *repo, const char *url", + "sig": "git_remote **::git_repository *::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Create an anonymous remote

\n", + "comments": "

Create a remote with the given url in-memory. You can use this when you have a URL instead of a remote's name.

\n", + "group": "remote", + "examples": { + "fetch.c": ["ex/v1.9.1/fetch.html#git_remote_create_anonymous-5"], + "ls-remote.c": [ + "ex/v1.9.1/ls-remote.html#git_remote_create_anonymous-2" + ] + } + }, + "git_remote_create_detached": { + "type": "function", + "file": "git2/remote.h", + "line": 204, + "lineto": 206, + "args": [ + { + "name": "out", + "type": "git_remote **", + "comment": "pointer to the new remote objects" + }, + { + "name": "url", + "type": "const char *", + "comment": "the remote repository's URL" + } + ], + "argline": "git_remote **out, const char *url", + "sig": "git_remote **::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Create a remote without a connected local repo

\n", + "comments": "

Create a remote with the given url in-memory. You can use this when you have a URL instead of a remote's name.

\n\n

Contrasted with git_remote_create_anonymous, a detached remote will not consider any repo configuration values (such as insteadof url substitutions).

\n", + "group": "remote" + }, + "git_remote_lookup": { + "type": "function", + "file": "git2/remote.h", + "line": 219, + "lineto": 219, + "args": [ + { + "name": "out", + "type": "git_remote **", + "comment": "pointer to the new remote object" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the associated repository" + }, + { + "name": "name", + "type": "const char *", + "comment": "the remote's name" + } + ], + "argline": "git_remote **out, git_repository *repo, const char *name", + "sig": "git_remote **::git_repository *::const char *", + "return": { + "type": "int", + "comment": " 0, GIT_ENOTFOUND, GIT_EINVALIDSPEC or an error code" + }, + "description": "

Get the information for a particular remote

\n", + "comments": "

The name will be checked for validity. See git_tag_create() for rules about valid names.

\n", + "group": "remote", + "examples": { + "fetch.c": ["ex/v1.9.1/fetch.html#git_remote_lookup-6"], + "ls-remote.c": ["ex/v1.9.1/ls-remote.html#git_remote_lookup-3"], + "push.c": ["ex/v1.9.1/push.html#git_remote_lookup-1"], + "remote.c": ["ex/v1.9.1/remote.html#git_remote_lookup-2"] + } + }, + "git_remote_dup": { + "type": "function", + "file": "git2/remote.h", + "line": 231, + "lineto": 231, + "args": [ + { + "name": "dest", + "type": "git_remote **", + "comment": "pointer where to store the copy" + }, + { + "name": "source", + "type": "git_remote *", + "comment": "object to copy" + } + ], + "argline": "git_remote **dest, git_remote *source", + "sig": "git_remote **::git_remote *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Create a copy of an existing remote. All internal strings are also\n duplicated. Callbacks are not duplicated.

\n", + "comments": "

Call git_remote_free to free the data.

\n", + "group": "remote" + }, + "git_remote_owner": { + "type": "function", + "file": "git2/remote.h", + "line": 239, + "lineto": 239, + "args": [ + { + "name": "remote", + "type": "const git_remote *", + "comment": "the remote" + } + ], + "argline": "const git_remote *remote", + "sig": "const git_remote *", + "return": { + "type": "git_repository *", + "comment": " a pointer to the repository" + }, + "description": "

Get the remote's repository

\n", + "comments": "", + "group": "remote" + }, + "git_remote_name": { + "type": "function", + "file": "git2/remote.h", + "line": 247, + "lineto": 247, + "args": [ + { + "name": "remote", + "type": "const git_remote *", + "comment": "the remote" + } + ], + "argline": "const git_remote *remote", + "sig": "const git_remote *", + "return": { + "type": "const char *", + "comment": " a pointer to the name or NULL for in-memory remotes" + }, + "description": "

Get the remote's name

\n", + "comments": "", + "group": "remote" + }, + "git_remote_url": { + "type": "function", + "file": "git2/remote.h", + "line": 259, + "lineto": 259, + "args": [ + { + "name": "remote", + "type": "const git_remote *", + "comment": "the remote" + } + ], + "argline": "const git_remote *remote", + "sig": "const git_remote *", + "return": { "type": "const char *", "comment": " a pointer to the url" }, + "description": "

Get the remote's url

\n", + "comments": "

If url.*.insteadOf has been configured for this URL, it will return the modified URL. This function does not consider if a push url has been configured for this remote (use git_remote_pushurl if needed).

\n", + "group": "remote", + "examples": { "remote.c": ["ex/v1.9.1/remote.html#git_remote_url-3"] } + }, + "git_remote_pushurl": { + "type": "function", + "file": "git2/remote.h", + "line": 271, + "lineto": 271, + "args": [ + { + "name": "remote", + "type": "const git_remote *", + "comment": "the remote" + } + ], + "argline": "const git_remote *remote", + "sig": "const git_remote *", + "return": { + "type": "const char *", + "comment": " a pointer to the url or NULL if no special url for pushing is set" + }, + "description": "

Get the remote's url for pushing.

\n", + "comments": "

If url.*.pushInsteadOf has been configured for this URL, it will return the modified URL. If git_remote_set_instance_pushurl has been called for this remote, then that URL will be returned.

\n", + "group": "remote", + "examples": { "remote.c": ["ex/v1.9.1/remote.html#git_remote_pushurl-4"] } + }, + "git_remote_set_url": { + "type": "function", + "file": "git2/remote.h", + "line": 284, + "lineto": 284, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository in which to perform the change" + }, + { + "name": "remote", + "type": "const char *", + "comment": "the remote's name" + }, + { "name": "url", "type": "const char *", "comment": "the url to set" } + ], + "argline": "git_repository *repo, const char *remote, const char *url", + "sig": "git_repository *::const char *::const char *", + "return": { "type": "int", "comment": " 0 or an error value" }, + "description": "

Set the remote's url in the configuration

\n", + "comments": "

Remote objects already in memory will not be affected. This assumes the common case of a single-url remote and will otherwise return an error.

\n", + "group": "remote", + "examples": { "remote.c": ["ex/v1.9.1/remote.html#git_remote_set_url-5"] } + }, + "git_remote_set_pushurl": { + "type": "function", + "file": "git2/remote.h", + "line": 298, + "lineto": 298, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository in which to perform the change" + }, + { + "name": "remote", + "type": "const char *", + "comment": "the remote's name" + }, + { "name": "url", "type": "const char *", "comment": "the url to set" } + ], + "argline": "git_repository *repo, const char *remote, const char *url", + "sig": "git_repository *::const char *::const char *", + "return": { "type": "int", "comment": " 0, or an error code" }, + "description": "

Set the remote's url for pushing in the configuration.

\n", + "comments": "

Remote objects already in memory will not be affected. This assumes the common case of a single-url remote and will otherwise return an error.

\n", + "group": "remote", + "examples": { + "remote.c": ["ex/v1.9.1/remote.html#git_remote_set_pushurl-6"] + } + }, + "git_remote_set_instance_url": { + "type": "function", + "file": "git2/remote.h", + "line": 308, + "lineto": 308, + "args": [ + { + "name": "remote", + "type": "git_remote *", + "comment": "the remote's name" + }, + { "name": "url", "type": "const char *", "comment": "the url to set" } + ], + "argline": "git_remote *remote, const char *url", + "sig": "git_remote *::const char *", + "return": { "type": "int", "comment": " 0 or an error value" }, + "description": "

Set the url for this particular url instance. The URL in the\n configuration will be ignored, and will not be changed.

\n", + "comments": "", + "group": "remote" + }, + "git_remote_set_instance_pushurl": { + "type": "function", + "file": "git2/remote.h", + "line": 318, + "lineto": 318, + "args": [ + { + "name": "remote", + "type": "git_remote *", + "comment": "the remote's name" + }, + { "name": "url", "type": "const char *", "comment": "the url to set" } + ], + "argline": "git_remote *remote, const char *url", + "sig": "git_remote *::const char *", + "return": { "type": "int", "comment": " 0 or an error value" }, + "description": "

Set the push url for this particular url instance. The URL in the\n configuration will be ignored, and will not be changed.

\n", + "comments": "", + "group": "remote" + }, + "git_remote_add_fetch": { + "type": "function", + "file": "git2/remote.h", + "line": 331, + "lineto": 331, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository in which to change the configuration" + }, + { + "name": "remote", + "type": "const char *", + "comment": "the name of the remote to change" + }, + { + "name": "refspec", + "type": "const char *", + "comment": "the new fetch refspec" + } + ], + "argline": "git_repository *repo, const char *remote, const char *refspec", + "sig": "git_repository *::const char *::const char *", + "return": { + "type": "int", + "comment": " 0, GIT_EINVALIDSPEC if refspec is invalid or an error value" + }, + "description": "

Add a fetch refspec to the remote's configuration

\n", + "comments": "

Add the given refspec to the fetch list in the configuration. No loaded remote instances will be affected.

\n", + "group": "remote" + }, + "git_remote_get_fetch_refspecs": { + "type": "function", + "file": "git2/remote.h", + "line": 343, + "lineto": 343, + "args": [ + { + "name": "array", + "type": "git_strarray *", + "comment": "pointer to the array in which to store the strings" + }, + { + "name": "remote", + "type": "const git_remote *", + "comment": "the remote to query" + } + ], + "argline": "git_strarray *array, const git_remote *remote", + "sig": "git_strarray *::const git_remote *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Get the remote's list of fetch refspecs

\n", + "comments": "

The memory is owned by the user and should be freed with git_strarray_free.

\n", + "group": "remote" + }, + "git_remote_add_push": { + "type": "function", + "file": "git2/remote.h", + "line": 356, + "lineto": 356, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository in which to change the configuration" + }, + { + "name": "remote", + "type": "const char *", + "comment": "the name of the remote to change" + }, + { + "name": "refspec", + "type": "const char *", + "comment": "the new push refspec" + } + ], + "argline": "git_repository *repo, const char *remote, const char *refspec", + "sig": "git_repository *::const char *::const char *", + "return": { + "type": "int", + "comment": " 0, GIT_EINVALIDSPEC if refspec is invalid or an error value" + }, + "description": "

Add a push refspec to the remote's configuration

\n", + "comments": "

Add the given refspec to the push list in the configuration. No loaded remote instances will be affected.

\n", + "group": "remote" + }, + "git_remote_get_push_refspecs": { + "type": "function", + "file": "git2/remote.h", + "line": 368, + "lineto": 368, + "args": [ + { + "name": "array", + "type": "git_strarray *", + "comment": "pointer to the array in which to store the strings" + }, + { + "name": "remote", + "type": "const git_remote *", + "comment": "the remote to query" + } + ], + "argline": "git_strarray *array, const git_remote *remote", + "sig": "git_strarray *::const git_remote *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Get the remote's list of push refspecs

\n", + "comments": "

The memory is owned by the user and should be freed with git_strarray_free.

\n", + "group": "remote" + }, + "git_remote_refspec_count": { + "type": "function", + "file": "git2/remote.h", + "line": 376, + "lineto": 376, + "args": [ + { + "name": "remote", + "type": "const git_remote *", + "comment": "the remote" + } + ], + "argline": "const git_remote *remote", + "sig": "const git_remote *", + "return": { + "type": "size_t", + "comment": " the amount of refspecs configured in this remote" + }, + "description": "

Get the number of refspecs for a remote

\n", + "comments": "", + "group": "remote" + }, + "git_remote_get_refspec": { + "type": "function", + "file": "git2/remote.h", + "line": 385, + "lineto": 385, + "args": [ + { + "name": "remote", + "type": "const git_remote *", + "comment": "the remote to query" + }, + { "name": "n", "type": "size_t", "comment": "the refspec to get" } + ], + "argline": "const git_remote *remote, size_t n", + "sig": "const git_remote *::size_t", + "return": { + "type": "const git_refspec *", + "comment": " the nth refspec" + }, + "description": "

Get a refspec from the remote

\n", + "comments": "", + "group": "remote" + }, + "git_remote_ls": { + "type": "function", + "file": "git2/remote.h", + "line": 407, + "lineto": 407, + "args": [ + { + "name": "out", + "type": "const git_remote_head ***", + "comment": "pointer to the array" + }, + { + "name": "size", + "type": "size_t *", + "comment": "the number of remote heads" + }, + { "name": "remote", "type": "git_remote *", "comment": "the remote" } + ], + "argline": "const git_remote_head ***out, size_t *size, git_remote *remote", + "sig": "const git_remote_head ***::size_t *::git_remote *", + "return": { "type": "int", "comment": " 0 on success, or an error code" }, + "description": "

Get the remote repository's reference advertisement list

\n", + "comments": "

Get the list of references with which the server responds to a new connection.

\n\n

The remote (or more exactly its transport) must have connected to the remote repository. This list is available as soon as the connection to the remote is initiated and it remains available after disconnecting.

\n\n

The memory belongs to the remote. The pointer will be valid as long as a new connection is not initiated, but it is recommended that you make a copy in order to make use of the data.

\n", + "group": "remote", + "examples": { + "ls-remote.c": ["ex/v1.9.1/ls-remote.html#git_remote_ls-4"] + } + }, + "git_remote_connected": { + "type": "function", + "file": "git2/remote.h", + "line": 418, + "lineto": 418, + "args": [ + { + "name": "remote", + "type": "const git_remote *", + "comment": "the remote" + } + ], + "argline": "const git_remote *remote", + "sig": "const git_remote *", + "return": { + "type": "int", + "comment": " 1 if it's connected, 0 otherwise." + }, + "description": "

Check whether the remote is connected

\n", + "comments": "

Check whether the remote's underlying transport is connected to the remote host.

\n", + "group": "remote" + }, + "git_remote_stop": { + "type": "function", + "file": "git2/remote.h", + "line": 429, + "lineto": 429, + "args": [ + { "name": "remote", "type": "git_remote *", "comment": "the remote" } + ], + "argline": "git_remote *remote", + "sig": "git_remote *", + "return": { "type": "int", "comment": " 0 on success, or an error code" }, + "description": "

Cancel the operation

\n", + "comments": "

At certain points in its operation, the network code checks whether the operation has been cancelled and if so stops the operation.

\n", + "group": "remote" + }, + "git_remote_disconnect": { + "type": "function", + "file": "git2/remote.h", + "line": 439, + "lineto": 439, + "args": [ + { + "name": "remote", + "type": "git_remote *", + "comment": "the remote to disconnect from" + } + ], + "argline": "git_remote *remote", + "sig": "git_remote *", + "return": { "type": "int", "comment": " 0 on success, or an error code" }, + "description": "

Disconnect from the remote

\n", + "comments": "

Close the connection to the remote.

\n", + "group": "remote" + }, + "git_remote_free": { + "type": "function", + "file": "git2/remote.h", + "line": 449, + "lineto": 449, + "args": [ + { + "name": "remote", + "type": "git_remote *", + "comment": "the remote to free" + } + ], + "argline": "git_remote *remote", + "sig": "git_remote *", + "return": { "type": "void", "comment": null }, + "description": "

Free the memory associated with a remote

\n", + "comments": "

This also disconnects from the remote, if the connection has not been closed yet (using git_remote_disconnect).

\n", + "group": "remote", + "examples": { + "fetch.c": [ + "ex/v1.9.1/fetch.html#git_remote_free-7", + "ex/v1.9.1/fetch.html#git_remote_free-8" + ], + "ls-remote.c": ["ex/v1.9.1/ls-remote.html#git_remote_free-5"], + "remote.c": ["ex/v1.9.1/remote.html#git_remote_free-7"] + } + }, + "git_remote_list": { + "type": "function", + "file": "git2/remote.h", + "line": 460, + "lineto": 460, + "args": [ + { + "name": "out", + "type": "git_strarray *", + "comment": "a string array which receives the names of the remotes" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository to query" + } + ], + "argline": "git_strarray *out, git_repository *repo", + "sig": "git_strarray *::git_repository *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Get a list of the configured remotes for a repo

\n", + "comments": "

The string array must be freed by the user.

\n", + "group": "remote", + "examples": { + "checkout.c": ["ex/v1.9.1/checkout.html#git_remote_list-22"], + "remote.c": ["ex/v1.9.1/remote.html#git_remote_list-8"] + } + }, + "git_remote_init_callbacks": { + "type": "function", + "file": "git2/remote.h", + "line": 714, + "lineto": 716, + "args": [ + { + "name": "opts", + "type": "git_remote_callbacks *", + "comment": "the `git_remote_callbacks` struct to initialize" + }, + { + "name": "version", + "type": "unsigned int", + "comment": "Version of struct; pass `GIT_REMOTE_CALLBACKS_VERSION`" + } + ], + "argline": "git_remote_callbacks *opts, unsigned int version", + "sig": "git_remote_callbacks *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initializes a git_remote_callbacks with default values. Equivalent to\n creating an instance with GIT_REMOTE_CALLBACKS_INIT.

\n", + "comments": "", + "group": "remote", + "examples": { + "push.c": ["ex/v1.9.1/push.html#git_remote_init_callbacks-2"] + } + }, + "git_fetch_options_init": { + "type": "function", + "file": "git2/remote.h", + "line": 852, + "lineto": 854, + "args": [ + { + "name": "opts", + "type": "git_fetch_options *", + "comment": "The `git_fetch_options` struct to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "The struct version; pass `GIT_FETCH_OPTIONS_VERSION`." + } + ], + "argline": "git_fetch_options *opts, unsigned int version", + "sig": "git_fetch_options *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initialize git_fetch_options structure

\n", + "comments": "

Initializes a git_fetch_options with default values. Equivalent to creating an instance with GIT_FETCH_OPTIONS_INIT.

\n", + "group": "fetch" + }, + "git_push_options_init": { + "type": "function", + "file": "git2/remote.h", + "line": 917, + "lineto": 919, + "args": [ + { + "name": "opts", + "type": "git_push_options *", + "comment": "The `git_push_options` struct to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "The struct version; pass `GIT_PUSH_OPTIONS_VERSION`." + } + ], + "argline": "git_push_options *opts, unsigned int version", + "sig": "git_push_options *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initialize git_push_options structure

\n", + "comments": "

Initializes a git_push_options with default values. Equivalent to creating an instance with GIT_PUSH_OPTIONS_INIT.

\n", + "group": "push", + "examples": { "push.c": ["ex/v1.9.1/push.html#git_push_options_init-3"] } + }, + "git_remote_connect_options_init": { + "type": "function", + "file": "git2/remote.h", + "line": 968, + "lineto": 970, + "args": [ + { + "name": "opts", + "type": "git_remote_connect_options *", + "comment": "The `git_remote_connect_options` struct to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "The struct version; pass `GIT_REMOTE_CONNECT_OPTIONS_VERSION`." + } + ], + "argline": "git_remote_connect_options *opts, unsigned int version", + "sig": "git_remote_connect_options *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initialize git_remote_connect_options structure.

\n", + "comments": "

Initializes a git_remote_connect_options with default values. Equivalent to creating an instance with GIT_REMOTE_CONNECT_OPTIONS_INIT.

\n", + "group": "remote" + }, + "git_remote_connect": { + "type": "function", + "file": "git2/remote.h", + "line": 987, + "lineto": 992, + "args": [ + { + "name": "remote", + "type": "git_remote *", + "comment": "the remote to connect to" + }, + { + "name": "direction", + "type": "git_direction", + "comment": "GIT_DIRECTION_FETCH if you want to fetch or\n GIT_DIRECTION_PUSH if you want to push" + }, + { + "name": "callbacks", + "type": "const git_remote_callbacks *", + "comment": "the callbacks to use for this connection" + }, + { + "name": "proxy_opts", + "type": "const git_proxy_options *", + "comment": "proxy settings" + }, + { + "name": "custom_headers", + "type": "const git_strarray *", + "comment": "extra HTTP headers to use in this connection" + } + ], + "argline": "git_remote *remote, git_direction direction, const git_remote_callbacks *callbacks, const git_proxy_options *proxy_opts, const git_strarray *custom_headers", + "sig": "git_remote *::git_direction::const git_remote_callbacks *::const git_proxy_options *::const git_strarray *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Open a connection to a remote.

\n", + "comments": "

The transport is selected based on the URL; the direction argument is due to a limitation of the git protocol which starts up a specific binary which can only do the one or the other.

\n", + "group": "remote", + "examples": { + "ls-remote.c": ["ex/v1.9.1/ls-remote.html#git_remote_connect-6"] + } + }, + "git_remote_connect_ext": { + "type": "function", + "file": "git2/remote.h", + "line": 1012, + "lineto": 1015, + "args": [ + { + "name": "remote", + "type": "git_remote *", + "comment": "the remote to connect to" + }, + { + "name": "direction", + "type": "git_direction", + "comment": "GIT_DIRECTION_FETCH if you want to fetch or\n GIT_DIRECTION_PUSH if you want to push" + }, + { + "name": "opts", + "type": "const git_remote_connect_options *", + "comment": "the remote connection options" + } + ], + "argline": "git_remote *remote, git_direction direction, const git_remote_connect_options *opts", + "sig": "git_remote *::git_direction::const git_remote_connect_options *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Open a connection to a remote with extended options.

\n", + "comments": "

The transport is selected based on the URL; the direction argument is due to a limitation of the git protocol which starts up a specific binary which can only do the one or the other.

\n\n

The given options structure will form the defaults for connection options and callback setup. Callers may override these defaults by specifying git_fetch_options or git_push_options in subsequent calls.

\n", + "group": "remote" + }, + "git_remote_download": { + "type": "function", + "file": "git2/remote.h", + "line": 1037, + "lineto": 1040, + "args": [ + { "name": "remote", "type": "git_remote *", "comment": "the remote" }, + { + "name": "refspecs", + "type": "const git_strarray *", + "comment": "the refspecs to use for this negotiation and\n download. Use NULL or an empty array to use the base refspecs" + }, + { + "name": "opts", + "type": "const git_fetch_options *", + "comment": "the options to use for this fetch or NULL" + } + ], + "argline": "git_remote *remote, const git_strarray *refspecs, const git_fetch_options *opts", + "sig": "git_remote *::const git_strarray *::const git_fetch_options *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Download and index the packfile.

\n", + "comments": "

Connect to the remote if it hasn't been done yet, negotiate with the remote git which objects are missing, download and index the packfile.

\n\n

The .idx file will be created and both it and the packfile with be renamed to their final name.

\n\n

If options are specified and this remote is already connected then the existing remote connection options will be discarded and the remote will now use the new options.

\n", + "group": "remote" + }, + "git_remote_upload": { + "type": "function", + "file": "git2/remote.h", + "line": 1059, + "lineto": 1062, + "args": [ + { "name": "remote", "type": "git_remote *", "comment": "the remote" }, + { + "name": "refspecs", + "type": "const git_strarray *", + "comment": "the refspecs to use for this negotiation and\n upload. Use NULL or an empty array to use the base refspecs" + }, + { + "name": "opts", + "type": "const git_push_options *", + "comment": "the options to use for this push" + } + ], + "argline": "git_remote *remote, const git_strarray *refspecs, const git_push_options *opts", + "sig": "git_remote *::const git_strarray *::const git_push_options *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Create a packfile and send it to the server

\n", + "comments": "

Connect to the remote if it hasn't been done yet, negotiate with the remote git which objects are missing, create a packfile with the missing objects and send it.

\n\n

If options are specified and this remote is already connected then the existing remote connection options will be discarded and the remote will now use the new options.

\n", + "group": "remote" + }, + "git_remote_update_tips": { + "type": "function", + "file": "git2/remote.h", + "line": 1081, + "lineto": 1086, + "args": [ + { + "name": "remote", + "type": "git_remote *", + "comment": "the remote to update" + }, + { + "name": "callbacks", + "type": "const git_remote_callbacks *", + "comment": "pointer to the callback structure to use or NULL" + }, + { + "name": "update_flags", + "type": "unsigned int", + "comment": "the git_remote_update_flags for these tips." + }, + { + "name": "download_tags", + "type": "git_remote_autotag_option_t", + "comment": "what the behaviour for downloading tags is for this fetch. This is\n ignored for push. This must be the same value passed to `git_remote_download()`." + }, + { + "name": "reflog_message", + "type": "const char *", + "comment": "The message to insert into the reflogs. If\n NULL and fetching, the default is \"fetch \n\", where \n is\n the name of the remote (or its url, for in-memory remotes). This\n parameter is ignored when pushing." + } + ], + "argline": "git_remote *remote, const git_remote_callbacks *callbacks, unsigned int update_flags, git_remote_autotag_option_t download_tags, const char *reflog_message", + "sig": "git_remote *::const git_remote_callbacks *::unsigned int::git_remote_autotag_option_t::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Update the tips to the new state.

\n", + "comments": "

If callbacks are not specified then the callbacks specified to git_remote_connect will be used (if it was called).

\n", + "group": "remote" + }, + "git_remote_fetch": { + "type": "function", + "file": "git2/remote.h", + "line": 1106, + "lineto": 1110, + "args": [ + { + "name": "remote", + "type": "git_remote *", + "comment": "the remote to fetch from" + }, + { + "name": "refspecs", + "type": "const git_strarray *", + "comment": "the refspecs to use for this fetch. Pass NULL or an\n empty array to use the base refspecs." + }, + { + "name": "opts", + "type": "const git_fetch_options *", + "comment": "options to use for this fetch or NULL" + }, + { + "name": "reflog_message", + "type": "const char *", + "comment": "The message to insert into the reflogs. If NULL, the\n\t\t\t\t\t\t\t\t default is \"fetch\"" + } + ], + "argline": "git_remote *remote, const git_strarray *refspecs, const git_fetch_options *opts, const char *reflog_message", + "sig": "git_remote *::const git_strarray *::const git_fetch_options *::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Download new data and update tips.

\n", + "comments": "

Convenience function to connect to a remote, download the data, disconnect and update the remote-tracking branches.

\n\n

If options are specified and this remote is already connected then the existing remote connection options will be discarded and the remote will now use the new options.

\n", + "group": "remote", + "examples": { "fetch.c": ["ex/v1.9.1/fetch.html#git_remote_fetch-9"] } + }, + "git_remote_prune": { + "type": "function", + "file": "git2/remote.h", + "line": 1122, + "lineto": 1124, + "args": [ + { + "name": "remote", + "type": "git_remote *", + "comment": "the remote to prune" + }, + { + "name": "callbacks", + "type": "const git_remote_callbacks *", + "comment": "callbacks to use for this prune" + } + ], + "argline": "git_remote *remote, const git_remote_callbacks *callbacks", + "sig": "git_remote *::const git_remote_callbacks *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Prune tracking refs that are no longer present on remote.

\n", + "comments": "

If callbacks are not specified then the callbacks specified to git_remote_connect will be used (if it was called).

\n", + "group": "remote" + }, + "git_remote_push": { + "type": "function", + "file": "git2/remote.h", + "line": 1139, + "lineto": 1142, + "args": [ + { + "name": "remote", + "type": "git_remote *", + "comment": "the remote to push to" + }, + { + "name": "refspecs", + "type": "const git_strarray *", + "comment": "the refspecs to use for pushing. If NULL or an empty\n array, the configured refspecs will be used" + }, + { + "name": "opts", + "type": "const git_push_options *", + "comment": "options to use for this push" + } + ], + "argline": "git_remote *remote, const git_strarray *refspecs, const git_push_options *opts", + "sig": "git_remote *::const git_strarray *::const git_push_options *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Perform a push.

\n", + "comments": "

If options are specified and this remote is already connected then the existing remote connection options will be discarded and the remote will now use the new options.

\n", + "group": "remote", + "examples": { "push.c": ["ex/v1.9.1/push.html#git_remote_push-4"] } + }, + "git_remote_stats": { + "type": "function", + "file": "git2/remote.h", + "line": 1150, + "lineto": 1150, + "args": [ + { + "name": "remote", + "type": "git_remote *", + "comment": "the remote to get statistics for" + } + ], + "argline": "git_remote *remote", + "sig": "git_remote *", + "return": { + "type": "const git_indexer_progress *", + "comment": " the git_indexer_progress for the remote" + }, + "description": "

Get the statistics structure that is filled in by the fetch operation.

\n", + "comments": "", + "group": "remote", + "examples": { "fetch.c": ["ex/v1.9.1/fetch.html#git_remote_stats-10"] } + }, + "git_remote_autotag": { + "type": "function", + "file": "git2/remote.h", + "line": 1158, + "lineto": 1158, + "args": [ + { + "name": "remote", + "type": "const git_remote *", + "comment": "the remote to query" + } + ], + "argline": "const git_remote *remote", + "sig": "const git_remote *", + "return": { + "type": "git_remote_autotag_option_t", + "comment": " the auto-follow setting" + }, + "description": "

Retrieve the tag auto-follow setting

\n", + "comments": "", + "group": "remote" + }, + "git_remote_set_autotag": { + "type": "function", + "file": "git2/remote.h", + "line": 1171, + "lineto": 1171, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository in which to make the change" + }, + { + "name": "remote", + "type": "const char *", + "comment": "the name of the remote" + }, + { + "name": "value", + "type": "git_remote_autotag_option_t", + "comment": "the new value to take." + } + ], + "argline": "git_repository *repo, const char *remote, git_remote_autotag_option_t value", + "sig": "git_repository *::const char *::git_remote_autotag_option_t", + "return": { "type": "int", "comment": " 0, or an error code." }, + "description": "

Set the remote's tag following setting.

\n", + "comments": "

The change will be made in the configuration. No loaded remotes will be affected.

\n", + "group": "remote" + }, + "git_remote_prune_refs": { + "type": "function", + "file": "git2/remote.h", + "line": 1179, + "lineto": 1179, + "args": [ + { + "name": "remote", + "type": "const git_remote *", + "comment": "the remote to query" + } + ], + "argline": "const git_remote *remote", + "sig": "const git_remote *", + "return": { "type": "int", "comment": " the ref-prune setting" }, + "description": "

Retrieve the ref-prune setting

\n", + "comments": "", + "group": "remote" + }, + "git_remote_rename": { + "type": "function", + "file": "git2/remote.h", + "line": 1201, + "lineto": 1205, + "args": [ + { + "name": "problems", + "type": "git_strarray *", + "comment": "non-default refspecs cannot be renamed and will be\n stored here for further processing by the caller. Always free this\n strarray on successful return." + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository in which to rename" + }, + { + "name": "name", + "type": "const char *", + "comment": "the current name of the remote" + }, + { + "name": "new_name", + "type": "const char *", + "comment": "the new name the remote should bear" + } + ], + "argline": "git_strarray *problems, git_repository *repo, const char *name, const char *new_name", + "sig": "git_strarray *::git_repository *::const char *::const char *", + "return": { + "type": "int", + "comment": " 0, GIT_EINVALIDSPEC, GIT_EEXISTS or an error code" + }, + "description": "

Give the remote a new name

\n", + "comments": "

All remote-tracking branches and configuration settings for the remote are updated.

\n\n

The new name will be checked for validity. See git_tag_create() for rules about valid names.

\n\n

No loaded instances of a the remote with the old name will change their name or their list of refspecs.

\n", + "group": "remote", + "examples": { "remote.c": ["ex/v1.9.1/remote.html#git_remote_rename-9"] } + }, + "git_remote_name_is_valid": { + "type": "function", + "file": "git2/remote.h", + "line": 1214, + "lineto": 1214, + "args": [ + { + "name": "valid", + "type": "int *", + "comment": "output pointer to set with validity of given remote name" + }, + { + "name": "remote_name", + "type": "const char *", + "comment": "name to be checked." + } + ], + "argline": "int *valid, const char *remote_name", + "sig": "int *::const char *", + "return": { "type": "int", "comment": " 0 on success or an error code" }, + "description": "

Ensure the remote name is well-formed.

\n", + "comments": "", + "group": "remote" + }, + "git_remote_delete": { + "type": "function", + "file": "git2/remote.h", + "line": 1226, + "lineto": 1226, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository in which to act" + }, + { + "name": "name", + "type": "const char *", + "comment": "the name of the remote to delete" + } + ], + "argline": "git_repository *repo, const char *name", + "sig": "git_repository *::const char *", + "return": { + "type": "int", + "comment": " 0 on success, or an error code." + }, + "description": "

Delete an existing persisted remote.

\n", + "comments": "

All remote-tracking branches and configuration settings for the remote will be removed.

\n", + "group": "remote", + "examples": { "remote.c": ["ex/v1.9.1/remote.html#git_remote_delete-10"] } + }, + "git_remote_default_branch": { + "type": "function", + "file": "git2/remote.h", + "line": 1244, + "lineto": 1244, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": "the buffer in which to store the reference name" + }, + { "name": "remote", "type": "git_remote *", "comment": "the remote" } + ], + "argline": "git_buf *out, git_remote *remote", + "sig": "git_buf *::git_remote *", + "return": { + "type": "int", + "comment": " 0, GIT_ENOTFOUND if the remote does not have any references\n or none of them point to HEAD's commit, or an error message." + }, + "description": "

Retrieve the name of the remote's default branch

\n", + "comments": "

The default branch of a repository is the branch which HEAD points to. If the remote does not support reporting this information directly, it performs the guess as git does; that is, if there are multiple branches which point to the same commit, the first one is chosen. If the master branch is a candidate, it wins.

\n\n

This function must only be called after connecting.

\n", + "group": "remote" + }, + "git_repository_open": { + "type": "function", + "file": "git2/repository.h", + "line": 43, + "lineto": 43, + "args": [ + { + "name": "out", + "type": "git_repository **", + "comment": "pointer to the repo which will be opened" + }, + { + "name": "path", + "type": "const char *", + "comment": "the path to the repository" + } + ], + "argline": "git_repository **out, const char *path", + "sig": "git_repository **::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Open a git repository.

\n", + "comments": "

The 'path' argument must point to either a git repository folder, or an existing work dir.

\n\n

The method will automatically detect if 'path' is a normal or bare repository or fail is 'path' is neither.

\n\n

Note that the libgit2 library must be initialized using git_libgit2_init before any APIs can be called, including this one.

\n", + "group": "repository", + "examples": { + "general.c": ["ex/v1.9.1/general.html#git_repository_open-75"] + } + }, + "git_repository_open_from_worktree": { + "type": "function", + "file": "git2/repository.h", + "line": 54, + "lineto": 54, + "args": [ + { + "name": "out", + "type": "git_repository **", + "comment": "Output pointer containing opened repository" + }, + { + "name": "wt", + "type": "git_worktree *", + "comment": "Working tree to open" + } + ], + "argline": "git_repository **out, git_worktree *wt", + "sig": "git_repository **::git_worktree *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Open working tree as a repository

\n", + "comments": "

Open the working directory of the working tree as a normal repository that can then be worked on.

\n", + "group": "repository" + }, + "git_repository_wrap_odb": { + "type": "function", + "file": "git2/repository.h", + "line": 67, + "lineto": 69, + "args": [ + { + "name": "out", + "type": "git_repository **", + "comment": "pointer to the repo" + }, + { + "name": "odb", + "type": "git_odb *", + "comment": "the object database to wrap" + } + ], + "argline": "git_repository **out, git_odb *odb", + "sig": "git_repository **::git_odb *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Create a "fake" repository to wrap an object database

\n", + "comments": "

Create a repository object to wrap an object database to be used with the API when all you have is an object database. This doesn't have any paths associated with it, so use with care.

\n", + "group": "repository" + }, + "git_repository_discover": { + "type": "function", + "file": "git2/repository.h", + "line": 101, + "lineto": 105, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": "A pointer to a user-allocated git_buf which will contain\n the found path." + }, + { + "name": "start_path", + "type": "const char *", + "comment": "The base path where the lookup starts." + }, + { + "name": "across_fs", + "type": "int", + "comment": "If true, then the lookup will not stop when a\n filesystem device change is detected while exploring parent directories." + }, + { + "name": "ceiling_dirs", + "type": "const char *", + "comment": "A GIT_PATH_LIST_SEPARATOR separated list of\n absolute symbolic link free paths. The lookup will stop when any\n of this paths is reached. Note that the lookup always performs on\n start_path no matter start_path appears in ceiling_dirs ceiling_dirs\n might be NULL (which is equivalent to an empty string)" + } + ], + "argline": "git_buf *out, const char *start_path, int across_fs, const char *ceiling_dirs", + "sig": "git_buf *::const char *::int::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Look for a git repository and copy its path in the given buffer.\n The lookup start from base_path and walk across parent directories\n if nothing has been found. The lookup ends when the first repository\n is found, or when reaching a directory referenced in ceiling_dirs\n or when the filesystem changes (in case across_fs is true).

\n", + "comments": "

The method will automatically detect if the repository is bare (if there is a repository).

\n\n

Note that the libgit2 library must be initialized using git_libgit2_init before any APIs can be called, including this one.

\n", + "group": "repository" + }, + "git_repository_open_ext": { + "type": "function", + "file": "git2/repository.h", + "line": 181, + "lineto": 185, + "args": [ + { + "name": "out", + "type": "git_repository **", + "comment": "Pointer to the repo which will be opened. This can\n actually be NULL if you only want to use the error code to\n see if a repo at this path could be opened." + }, + { + "name": "path", + "type": "const char *", + "comment": "Path to open as git repository. If the flags\n permit \"searching\", then this can be a path to a subdirectory\n inside the working directory of the repository. May be NULL if\n flags is GIT_REPOSITORY_OPEN_FROM_ENV." + }, + { + "name": "flags", + "type": "unsigned int", + "comment": "A combination of the GIT_REPOSITORY_OPEN flags above." + }, + { + "name": "ceiling_dirs", + "type": "const char *", + "comment": "A GIT_PATH_LIST_SEPARATOR delimited list of path\n prefixes at which the search for a containing repository should\n terminate." + } + ], + "argline": "git_repository **out, const char *path, unsigned int flags, const char *ceiling_dirs", + "sig": "git_repository **::const char *::unsigned int::const char *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_ENOTFOUND if no repository could be found,\n or -1 if there was a repository but open failed for some reason\n (such as repo corruption or system errors)." + }, + "description": "

Find and open a repository with extended controls.

\n", + "comments": "

Note that the libgit2 library must be initialized using git_libgit2_init before any APIs can be called, including this one.

\n", + "group": "repository", + "examples": { "log.c": ["ex/v1.9.1/log.html#git_repository_open_ext-43"] } + }, + "git_repository_open_bare": { + "type": "function", + "file": "git2/repository.h", + "line": 202, + "lineto": 202, + "args": [ + { + "name": "out", + "type": "git_repository **", + "comment": "Pointer to the repo which will be opened." + }, + { + "name": "bare_path", + "type": "const char *", + "comment": "Direct path to the bare repository" + } + ], + "argline": "git_repository **out, const char *bare_path", + "sig": "git_repository **::const char *", + "return": { "type": "int", "comment": " 0 on success, or an error code" }, + "description": "

Open a bare repository on the serverside.

\n", + "comments": "

This is a fast open for bare repositories that will come in handy if you're e.g. hosting git repositories and need to access them efficiently

\n\n

Note that the libgit2 library must be initialized using git_libgit2_init before any APIs can be called, including this one.

\n", + "group": "repository" + }, + "git_repository_free": { + "type": "function", + "file": "git2/repository.h", + "line": 215, + "lineto": 215, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "repository handle to close. If NULL nothing occurs." + } + ], + "argline": "git_repository *repo", + "sig": "git_repository *", + "return": { "type": "void", "comment": null }, + "description": "

Free a previously allocated repository

\n", + "comments": "

Note that after a repository is free'd, all the objects it has spawned will still exist until they are manually closed by the user with git_object_free, but accessing any of the attributes of an object without a backing repository will result in undefined behavior

\n", + "group": "repository", + "examples": { + "general.c": ["ex/v1.9.1/general.html#git_repository_free-76"], + "init.c": ["ex/v1.9.1/init.html#git_repository_free-4"] + } + }, + "git_repository_init": { + "type": "function", + "file": "git2/repository.h", + "line": 236, + "lineto": 239, + "args": [ + { + "name": "out", + "type": "git_repository **", + "comment": "pointer to the repo which will be created or reinitialized" + }, + { + "name": "path", + "type": "const char *", + "comment": "the path to the repository" + }, + { + "name": "is_bare", + "type": "unsigned int", + "comment": "if true, a Git repository without a working directory is\n\t\tcreated at the pointed path. If false, provided path will be\n\t\tconsidered as the working directory into which the .git directory\n\t\twill be created." + } + ], + "argline": "git_repository **out, const char *path, unsigned int is_bare", + "sig": "git_repository **::const char *::unsigned int", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Creates a new Git repository in the given folder.

\n", + "comments": "

TODO: - Reinit the repository

\n\n

Note that the libgit2 library must be initialized using git_libgit2_init before any APIs can be called, including this one.

\n", + "group": "repository", + "examples": { "init.c": ["ex/v1.9.1/init.html#git_repository_init-5"] } + }, + "git_repository_init_options_init": { + "type": "function", + "file": "git2/repository.h", + "line": 405, + "lineto": 407, + "args": [ + { + "name": "opts", + "type": "git_repository_init_options *", + "comment": "The `git_repository_init_options` struct to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "The struct version; pass `GIT_REPOSITORY_INIT_OPTIONS_VERSION`." + } + ], + "argline": "git_repository_init_options *opts, unsigned int version", + "sig": "git_repository_init_options *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initialize git_repository_init_options structure

\n", + "comments": "

Initializes a git_repository_init_options with default values. Equivalent to creating an instance with GIT_REPOSITORY_INIT_OPTIONS_INIT.

\n", + "group": "repository" + }, + "git_repository_init_ext": { + "type": "function", + "file": "git2/repository.h", + "line": 426, + "lineto": 429, + "args": [ + { + "name": "out", + "type": "git_repository **", + "comment": "Pointer to the repo which will be created or reinitialized." + }, + { + "name": "repo_path", + "type": "const char *", + "comment": "The path to the repository." + }, + { + "name": "opts", + "type": "git_repository_init_options *", + "comment": "Pointer to git_repository_init_options struct." + } + ], + "argline": "git_repository **out, const char *repo_path, git_repository_init_options *opts", + "sig": "git_repository **::const char *::git_repository_init_options *", + "return": { "type": "int", "comment": " 0 or an error code on failure." }, + "description": "

Create a new Git repository in the given folder with extended controls.

\n", + "comments": "

This will initialize a new git repository (creating the repo_path if requested by flags) and working directory as needed. It will auto-detect the case sensitivity of the file system and if the file system supports file mode bits correctly.

\n\n

Note that the libgit2 library must be initialized using git_libgit2_init before any APIs can be called, including this one.

\n", + "group": "repository", + "examples": { + "init.c": ["ex/v1.9.1/init.html#git_repository_init_ext-6"] + } + }, + "git_repository_head": { + "type": "function", + "file": "git2/repository.h", + "line": 444, + "lineto": 444, + "args": [ + { + "name": "out", + "type": "git_reference **", + "comment": "pointer to the reference which will be retrieved" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "a repository object" + } + ], + "argline": "git_reference **out, git_repository *repo", + "sig": "git_reference **::git_repository *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_EUNBORNBRANCH when HEAD points to a non existing\n branch, GIT_ENOTFOUND when HEAD is missing; an error code otherwise" + }, + "description": "

Retrieve and resolve the reference pointed at by HEAD.

\n", + "comments": "

The returned git_reference will be owned by caller and git_reference_free() must be called when done with it to release the allocated memory and prevent a leak.

\n", + "group": "repository", + "examples": { + "merge.c": [ + "ex/v1.9.1/merge.html#git_repository_head-31", + "ex/v1.9.1/merge.html#git_repository_head-32" + ], + "status.c": ["ex/v1.9.1/status.html#git_repository_head-3"] + } + }, + "git_repository_head_for_worktree": { + "type": "function", + "file": "git2/repository.h", + "line": 454, + "lineto": 455, + "args": [ + { + "name": "out", + "type": "git_reference **", + "comment": "pointer to the reference which will be retrieved" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "a repository object" + }, + { + "name": "name", + "type": "const char *", + "comment": "name of the worktree to retrieve HEAD for" + } + ], + "argline": "git_reference **out, git_repository *repo, const char *name", + "sig": "git_reference **::git_repository *::const char *", + "return": { + "type": "int", + "comment": " 0 when successful, error-code otherwise" + }, + "description": "

Retrieve the referenced HEAD for the worktree

\n", + "comments": "", + "group": "repository" + }, + "git_repository_head_detached": { + "type": "function", + "file": "git2/repository.h", + "line": 467, + "lineto": 467, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "Repo to test" + } + ], + "argline": "git_repository *repo", + "sig": "git_repository *", + "return": { + "type": "int", + "comment": " 1 if HEAD is detached, 0 if it's not; error code if there\n was an error." + }, + "description": "

Check if a repository's HEAD is detached

\n", + "comments": "

A repository's HEAD is detached when it points directly to a commit instead of a branch.

\n", + "group": "repository" + }, + "git_repository_head_detached_for_worktree": { + "type": "function", + "file": "git2/repository.h", + "line": 480, + "lineto": 481, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "a repository object" + }, + { + "name": "name", + "type": "const char *", + "comment": "name of the worktree to retrieve HEAD for" + } + ], + "argline": "git_repository *repo, const char *name", + "sig": "git_repository *::const char *", + "return": { + "type": "int", + "comment": " 1 if HEAD is detached, 0 if its not; error code if\n there was an error" + }, + "description": "

Check if a worktree's HEAD is detached

\n", + "comments": "

A worktree's HEAD is detached when it points directly to a commit instead of a branch.

\n", + "group": "repository" + }, + "git_repository_head_unborn": { + "type": "function", + "file": "git2/repository.h", + "line": 493, + "lineto": 493, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "Repo to test" + } + ], + "argline": "git_repository *repo", + "sig": "git_repository *", + "return": { + "type": "int", + "comment": " 1 if the current branch is unborn, 0 if it's not; error\n code if there was an error" + }, + "description": "

Check if the current branch is unborn

\n", + "comments": "

An unborn branch is one named from HEAD but which doesn't exist in the refs namespace, because it doesn't have any commit to point to.

\n", + "group": "repository" + }, + "git_repository_is_empty": { + "type": "function", + "file": "git2/repository.h", + "line": 507, + "lineto": 507, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "Repo to test" + } + ], + "argline": "git_repository *repo", + "sig": "git_repository *", + "return": { + "type": "int", + "comment": " 1 if the repository is empty, 0 if it isn't, error code\n if the repository is corrupted" + }, + "description": "

Check if a repository is empty

\n", + "comments": "

An empty repository has just been initialized and contains no references apart from HEAD, which must be pointing to the unborn master branch, or the branch specified for the repository in the init.defaultBranch configuration variable.

\n", + "group": "repository" + }, + "git_repository_item_path": { + "type": "function", + "file": "git2/repository.h", + "line": 545, + "lineto": 545, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": "Buffer to store the path at" + }, + { + "name": "repo", + "type": "const git_repository *", + "comment": "Repository to get path for" + }, + { + "name": "item", + "type": "git_repository_item_t", + "comment": "The repository item for which to retrieve the path" + } + ], + "argline": "git_buf *out, const git_repository *repo, git_repository_item_t item", + "sig": "git_buf *::const git_repository *::git_repository_item_t", + "return": { + "type": "int", + "comment": " 0, GIT_ENOTFOUND if the path cannot exist or an error code" + }, + "description": "

Get the location of a specific repository file or directory

\n", + "comments": "

This function will retrieve the path of a specific repository item. It will thereby honor things like the repository's common directory, gitdir, etc. In case a file path cannot exist for a given item (e.g. the working directory of a bare repository), GIT_ENOTFOUND is returned.

\n", + "group": "repository" + }, + "git_repository_path": { + "type": "function", + "file": "git2/repository.h", + "line": 556, + "lineto": 556, + "args": [ + { + "name": "repo", + "type": "const git_repository *", + "comment": "A repository object" + } + ], + "argline": "const git_repository *repo", + "sig": "const git_repository *", + "return": { + "type": "const char *", + "comment": " the path to the repository" + }, + "description": "

Get the path of this repository

\n", + "comments": "

This is the path of the .git folder for normal repositories, or of the repository itself for bare repositories.

\n", + "group": "repository", + "examples": { + "init.c": ["ex/v1.9.1/init.html#git_repository_path-7"], + "status.c": ["ex/v1.9.1/status.html#git_repository_path-4"] + } + }, + "git_repository_workdir": { + "type": "function", + "file": "git2/repository.h", + "line": 567, + "lineto": 567, + "args": [ + { + "name": "repo", + "type": "const git_repository *", + "comment": "A repository object" + } + ], + "argline": "const git_repository *repo", + "sig": "const git_repository *", + "return": { + "type": "const char *", + "comment": " the path to the working dir, if it exists" + }, + "description": "

Get the path of the working directory for this repository

\n", + "comments": "

If the repository is bare, this function will always return NULL.

\n", + "group": "repository", + "examples": { "init.c": ["ex/v1.9.1/init.html#git_repository_workdir-8"] } + }, + "git_repository_commondir": { + "type": "function", + "file": "git2/repository.h", + "line": 579, + "lineto": 579, + "args": [ + { + "name": "repo", + "type": "const git_repository *", + "comment": "A repository object" + } + ], + "argline": "const git_repository *repo", + "sig": "const git_repository *", + "return": { + "type": "const char *", + "comment": " the path to the common dir" + }, + "description": "

Get the path of the shared common directory for this repository.

\n", + "comments": "

If the repository is bare, it is the root directory for the repository. If the repository is a worktree, it is the parent repo's gitdir. Otherwise, it is the gitdir.

\n", + "group": "repository" + }, + "git_repository_set_workdir": { + "type": "function", + "file": "git2/repository.h", + "line": 598, + "lineto": 599, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "A repository object" + }, + { + "name": "workdir", + "type": "const char *", + "comment": "The path to a working directory" + }, + { + "name": "update_gitlink", + "type": "int", + "comment": "Create/update gitlink in workdir and set config\n \"core.worktree\" (if workdir is not the parent of the .git directory)" + } + ], + "argline": "git_repository *repo, const char *workdir, int update_gitlink", + "sig": "git_repository *::const char *::int", + "return": { "type": "int", "comment": " 0, or an error code" }, + "description": "

Set the path to the working directory for this repository

\n", + "comments": "

The working directory doesn't need to be the same one that contains the .git folder for this repository.

\n\n

If this repository is bare, setting its working directory will turn it into a normal repository, capable of performing all the common workdir operations (checkout, status, index manipulation, etc).

\n", + "group": "repository" + }, + "git_repository_is_bare": { + "type": "function", + "file": "git2/repository.h", + "line": 607, + "lineto": 607, + "args": [ + { + "name": "repo", + "type": "const git_repository *", + "comment": "Repo to test" + } + ], + "argline": "const git_repository *repo", + "sig": "const git_repository *", + "return": { + "type": "int", + "comment": " 1 if the repository is bare, 0 otherwise." + }, + "description": "

Check if a repository is bare

\n", + "comments": "", + "group": "repository", + "examples": { + "status.c": ["ex/v1.9.1/status.html#git_repository_is_bare-5"] + } + }, + "git_repository_is_worktree": { + "type": "function", + "file": "git2/repository.h", + "line": 615, + "lineto": 615, + "args": [ + { + "name": "repo", + "type": "const git_repository *", + "comment": "Repo to test" + } + ], + "argline": "const git_repository *repo", + "sig": "const git_repository *", + "return": { + "type": "int", + "comment": " 1 if the repository is a linked work tree, 0 otherwise." + }, + "description": "

Check if a repository is a linked work tree

\n", + "comments": "", + "group": "repository" + }, + "git_repository_config": { + "type": "function", + "file": "git2/repository.h", + "line": 631, + "lineto": 631, + "args": [ + { + "name": "out", + "type": "git_config **", + "comment": "Pointer to store the loaded configuration" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "A repository object" + } + ], + "argline": "git_config **out, git_repository *repo", + "sig": "git_config **::git_repository *", + "return": { "type": "int", "comment": " 0, or an error code" }, + "description": "

Get the configuration file for this repository.

\n", + "comments": "

If a configuration file has not been set, the default config set for the repository will be returned, including global and system configurations (if they are available).

\n\n

The configuration file must be freed once it's no longer being used by the user.

\n", + "group": "repository", + "examples": { + "config.c": ["ex/v1.9.1/config.html#git_repository_config-9"] + } + }, + "git_repository_config_snapshot": { + "type": "function", + "file": "git2/repository.h", + "line": 647, + "lineto": 647, + "args": [ + { + "name": "out", + "type": "git_config **", + "comment": "Pointer to store the loaded configuration" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository" + } + ], + "argline": "git_config **out, git_repository *repo", + "sig": "git_config **::git_repository *", + "return": { "type": "int", "comment": " 0, or an error code" }, + "description": "

Get a snapshot of the repository's configuration

\n", + "comments": "

Convenience function to take a snapshot from the repository's configuration. The contents of this snapshot will not change, even if the underlying config files are modified.

\n\n

The configuration file must be freed once it's no longer being used by the user.

\n", + "group": "repository", + "examples": { + "general.c": [ + "ex/v1.9.1/general.html#git_repository_config_snapshot-77", + "ex/v1.9.1/general.html#git_repository_config_snapshot-78" + ] + } + }, + "git_repository_odb": { + "type": "function", + "file": "git2/repository.h", + "line": 663, + "lineto": 663, + "args": [ + { + "name": "out", + "type": "git_odb **", + "comment": "Pointer to store the loaded ODB" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "A repository object" + } + ], + "argline": "git_odb **out, git_repository *repo", + "sig": "git_odb **::git_repository *", + "return": { "type": "int", "comment": " 0, or an error code" }, + "description": "

Get the Object Database for this repository.

\n", + "comments": "

If a custom ODB has not been set, the default database for the repository will be returned (the one located in .git/objects).

\n\n

The ODB must be freed once it's no longer being used by the user.

\n", + "group": "repository", + "examples": { + "cat-file.c": ["ex/v1.9.1/cat-file.html#git_repository_odb-29"], + "general.c": ["ex/v1.9.1/general.html#git_repository_odb-79"] + } + }, + "git_repository_refdb": { + "type": "function", + "file": "git2/repository.h", + "line": 679, + "lineto": 679, + "args": [ + { + "name": "out", + "type": "git_refdb **", + "comment": "Pointer to store the loaded refdb" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "A repository object" + } + ], + "argline": "git_refdb **out, git_repository *repo", + "sig": "git_refdb **::git_repository *", + "return": { "type": "int", "comment": " 0, or an error code" }, + "description": "

Get the Reference Database Backend for this repository.

\n", + "comments": "

If a custom refsdb has not been set, the default database for the repository will be returned (the one that manipulates loose and packed references in the .git directory).

\n\n

The refdb must be freed once it's no longer being used by the user.

\n", + "group": "repository" + }, + "git_repository_index": { + "type": "function", + "file": "git2/repository.h", + "line": 695, + "lineto": 695, + "args": [ + { + "name": "out", + "type": "git_index **", + "comment": "Pointer to store the loaded index" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "A repository object" + } + ], + "argline": "git_index **out, git_repository *repo", + "sig": "git_index **::git_repository *", + "return": { "type": "int", "comment": " 0, or an error code" }, + "description": "

Get the Index file for this repository.

\n", + "comments": "

If a custom index has not been set, the default index for the repository will be returned (the one located in .git/index).

\n\n

The index must be freed once it's no longer being used by the user.

\n", + "group": "repository", + "examples": { + "add.c": ["ex/v1.9.1/add.html#git_repository_index-5"], + "commit.c": ["ex/v1.9.1/commit.html#git_repository_index-8"], + "general.c": ["ex/v1.9.1/general.html#git_repository_index-80"], + "init.c": ["ex/v1.9.1/init.html#git_repository_index-9"], + "ls-files.c": ["ex/v1.9.1/ls-files.html#git_repository_index-5"], + "merge.c": ["ex/v1.9.1/merge.html#git_repository_index-33"] + } + }, + "git_repository_message": { + "type": "function", + "file": "git2/repository.h", + "line": 713, + "lineto": 713, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": "git_buf to write data into" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository to read prepared message from" + } + ], + "argline": "git_buf *out, git_repository *repo", + "sig": "git_buf *::git_repository *", + "return": { + "type": "int", + "comment": " 0, GIT_ENOTFOUND if no message exists or an error code" + }, + "description": "

Retrieve git's prepared message

\n", + "comments": "

Operations such as git revert/cherry-pick/merge with the -n option stop just short of creating a commit with the changes and save their prepared message in .git/MERGE_MSG so the next git-commit execution can present it to the user for them to amend if they wish.

\n\n

Use this function to get the contents of this file. Don't forget to remove the file after you create the commit.

\n", + "group": "repository" + }, + "git_repository_message_remove": { + "type": "function", + "file": "git2/repository.h", + "line": 723, + "lineto": 723, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository to remove prepared message from." + } + ], + "argline": "git_repository *repo", + "sig": "git_repository *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Remove git's prepared message.

\n", + "comments": "

Remove the message that git_repository_message retrieves.

\n", + "group": "repository" + }, + "git_repository_state_cleanup": { + "type": "function", + "file": "git2/repository.h", + "line": 732, + "lineto": 732, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "A repository object" + } + ], + "argline": "git_repository *repo", + "sig": "git_repository *", + "return": { "type": "int", "comment": " 0 on success, or error" }, + "description": "

Remove all the metadata associated with an ongoing command like merge,\n revert, cherry-pick, etc. For example: MERGE_HEAD, MERGE_MSG, etc.

\n", + "comments": "", + "group": "repository", + "examples": { + "merge.c": ["ex/v1.9.1/merge.html#git_repository_state_cleanup-34"] + } + }, + "git_repository_fetchhead_foreach": { + "type": "function", + "file": "git2/repository.h", + "line": 763, + "lineto": 766, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "A repository object" + }, + { + "name": "callback", + "type": "git_repository_fetchhead_foreach_cb", + "comment": "Callback function" + }, + { + "name": "payload", + "type": "void *", + "comment": "Pointer to callback data (optional)" + } + ], + "argline": "git_repository *repo, git_repository_fetchhead_foreach_cb callback, void *payload", + "sig": "git_repository *::git_repository_fetchhead_foreach_cb::void *", + "return": { + "type": "int", + "comment": " 0 on success, non-zero callback return value, GIT_ENOTFOUND if\n there is no FETCH_HEAD file, or other error code." + }, + "description": "

Invoke 'callback' for each entry in the given FETCH_HEAD file.

\n", + "comments": "

Return a non-zero value from the callback to stop the loop.

\n", + "group": "repository" + }, + "git_repository_mergehead_foreach": { + "type": "function", + "file": "git2/repository.h", + "line": 792, + "lineto": 795, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "A repository object" + }, + { + "name": "callback", + "type": "git_repository_mergehead_foreach_cb", + "comment": "Callback function" + }, + { + "name": "payload", + "type": "void *", + "comment": "Pointer to callback data (optional)" + } + ], + "argline": "git_repository *repo, git_repository_mergehead_foreach_cb callback, void *payload", + "sig": "git_repository *::git_repository_mergehead_foreach_cb::void *", + "return": { + "type": "int", + "comment": " 0 on success, non-zero callback return value, GIT_ENOTFOUND if\n there is no MERGE_HEAD file, or other error code." + }, + "description": "

If a merge is in progress, invoke 'callback' for each commit ID in the\n MERGE_HEAD file.

\n", + "comments": "

Return a non-zero value from the callback to stop the loop.

\n", + "group": "repository" + }, + "git_repository_hashfile": { + "type": "function", + "file": "git2/repository.h", + "line": 822, + "lineto": 827, + "args": [ + { + "name": "out", + "type": "git_oid *", + "comment": "Output value of calculated SHA" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository pointer" + }, + { + "name": "path", + "type": "const char *", + "comment": "Path to file on disk whose contents should be hashed. This\n may be an absolute path or a relative path, in which case it\n will be treated as a path within the working directory." + }, + { + "name": "type", + "type": "git_object_t", + "comment": "The object type to hash as (e.g. GIT_OBJECT_BLOB)" + }, + { + "name": "as_path", + "type": "const char *", + "comment": "The path to use to look up filtering rules. If this is\n an empty string then no filters will be applied when\n calculating the hash. If this is `NULL` and the `path`\n parameter is a file within the repository's working\n directory, then the `path` will be used." + } + ], + "argline": "git_oid *out, git_repository *repo, const char *path, git_object_t type, const char *as_path", + "sig": "git_oid *::git_repository *::const char *::git_object_t::const char *", + "return": { "type": "int", "comment": " 0 on success, or an error code" }, + "description": "

Calculate hash of file using repository filtering rules.

\n", + "comments": "

If you simply want to calculate the hash of a file on disk with no filters, you can just use the git_odb_hashfile() API. However, if you want to hash a file in the repository and you want to apply filtering rules (e.g. crlf filters) before generating the SHA, then use this function.

\n\n

Note: if the repository has core.safecrlf set to fail and the filtering triggers that failure, then this function will return an error and not calculate the hash of the file.

\n", + "group": "repository" + }, + "git_repository_set_head": { + "type": "function", + "file": "git2/repository.h", + "line": 847, + "lineto": 849, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository pointer" + }, + { + "name": "refname", + "type": "const char *", + "comment": "Canonical name of the reference the HEAD should point at" + } + ], + "argline": "git_repository *repo, const char *refname", + "sig": "git_repository *::const char *", + "return": { "type": "int", "comment": " 0 on success, or an error code" }, + "description": "

Make the repository HEAD point to the specified reference.

\n", + "comments": "

If the provided reference points to a Tree or a Blob, the HEAD is unaltered and -1 is returned.

\n\n

If the provided reference points to a branch, the HEAD will point to that branch, staying attached, or become attached if it isn't yet. If the branch doesn't exist yet, no error will be return. The HEAD will then be attached to an unborn branch.

\n\n

Otherwise, the HEAD will be detached and will directly point to the Commit.

\n", + "group": "repository", + "examples": { + "checkout.c": ["ex/v1.9.1/checkout.html#git_repository_set_head-23"] + } + }, + "git_repository_set_head_detached": { + "type": "function", + "file": "git2/repository.h", + "line": 867, + "lineto": 869, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository pointer" + }, + { + "name": "committish", + "type": "const git_oid *", + "comment": "Object id of the Commit the HEAD should point to" + } + ], + "argline": "git_repository *repo, const git_oid *committish", + "sig": "git_repository *::const git_oid *", + "return": { "type": "int", "comment": " 0 on success, or an error code" }, + "description": "

Make the repository HEAD directly point to the Commit.

\n", + "comments": "

If the provided committish cannot be found in the repository, the HEAD is unaltered and GIT_ENOTFOUND is returned.

\n\n

If the provided committish cannot be peeled into a commit, the HEAD is unaltered and -1 is returned.

\n\n

Otherwise, the HEAD will eventually be detached and will directly point to the peeled Commit.

\n", + "group": "repository" + }, + "git_repository_set_head_detached_from_annotated": { + "type": "function", + "file": "git2/repository.h", + "line": 885, + "lineto": 887, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository pointer" + }, + { + "name": "committish", + "type": "const git_annotated_commit *", + "comment": "annotated commit to point HEAD to" + } + ], + "argline": "git_repository *repo, const git_annotated_commit *committish", + "sig": "git_repository *::const git_annotated_commit *", + "return": { "type": "int", "comment": " 0 on success, or an error code" }, + "description": "

Make the repository HEAD directly point to the Commit.

\n", + "comments": "

This behaves like git_repository_set_head_detached() but takes an annotated commit, which lets you specify which extended sha syntax string was specified by a user, allowing for more exact reflog messages.

\n\n

See the documentation for git_repository_set_head_detached().

\n", + "group": "repository", + "examples": { + "checkout.c": [ + "ex/v1.9.1/checkout.html#git_repository_set_head_detached_from_annotated-24" + ] + } + }, + "git_repository_detach_head": { + "type": "function", + "file": "git2/repository.h", + "line": 906, + "lineto": 907, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository pointer" + } + ], + "argline": "git_repository *repo", + "sig": "git_repository *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_EUNBORNBRANCH when HEAD points to a non existing\n branch or an error code" + }, + "description": "

Detach the HEAD.

\n", + "comments": "

If the HEAD is already detached and points to a Commit, 0 is returned.

\n\n

If the HEAD is already detached and points to a Tag, the HEAD is updated into making it point to the peeled Commit, and 0 is returned.

\n\n

If the HEAD is already detached and points to a non committish, the HEAD is unaltered, and -1 is returned.

\n\n

Otherwise, the HEAD will be detached and point to the peeled Commit.

\n", + "group": "repository" + }, + "git_repository_state": { + "type": "function", + "file": "git2/repository.h", + "line": 937, + "lineto": 937, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository pointer" + } + ], + "argline": "git_repository *repo", + "sig": "git_repository *", + "return": { "type": "int", "comment": " The state of the repository" }, + "description": "

Determines the status of a git repository - ie, whether an operation\n (merge, cherry-pick, etc) is in progress.

\n", + "comments": "", + "group": "repository", + "examples": { + "checkout.c": ["ex/v1.9.1/checkout.html#git_repository_state-25"], + "merge.c": ["ex/v1.9.1/merge.html#git_repository_state-35"] + } + }, + "git_repository_set_namespace": { + "type": "function", + "file": "git2/repository.h", + "line": 951, + "lineto": 951, + "args": [ + { "name": "repo", "type": "git_repository *", "comment": "The repo" }, + { + "name": "nmspace", + "type": "const char *", + "comment": "The namespace. This should not include the refs\n\tfolder, e.g. to namespace all references under `refs/namespaces/foo/`,\n\tuse `foo` as the namespace." + } + ], + "argline": "git_repository *repo, const char *nmspace", + "sig": "git_repository *::const char *", + "return": { "type": "int", "comment": " 0 on success, -1 on error" }, + "description": "

Sets the active namespace for this Git Repository

\n", + "comments": "

This namespace affects all reference operations for the repo. See man gitnamespaces

\n", + "group": "repository" + }, + "git_repository_get_namespace": { + "type": "function", + "file": "git2/repository.h", + "line": 959, + "lineto": 959, + "args": [ + { "name": "repo", "type": "git_repository *", "comment": "The repo" } + ], + "argline": "git_repository *repo", + "sig": "git_repository *", + "return": { + "type": "const char *", + "comment": " the active namespace, or NULL if there isn't one" + }, + "description": "

Get the currently active namespace for this repository

\n", + "comments": "", + "group": "repository" + }, + "git_repository_is_shallow": { + "type": "function", + "file": "git2/repository.h", + "line": 968, + "lineto": 968, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "The repository" + } + ], + "argline": "git_repository *repo", + "sig": "git_repository *", + "return": { "type": "int", "comment": " 1 if shallow, zero if not" }, + "description": "

Determine if the repository was a shallow clone

\n", + "comments": "", + "group": "repository" + }, + "git_repository_ident": { + "type": "function", + "file": "git2/repository.h", + "line": 981, + "lineto": 981, + "args": [ + { + "name": "name", + "type": "const char **", + "comment": "where to store the pointer to the name" + }, + { + "name": "email", + "type": "const char **", + "comment": "where to store the pointer to the email" + }, + { + "name": "repo", + "type": "const git_repository *", + "comment": "the repository" + } + ], + "argline": "const char **name, const char **email, const git_repository *repo", + "sig": "const char **::const char **::const git_repository *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Retrieve the configured identity to use for reflogs

\n", + "comments": "

The memory is owned by the repository and must not be freed by the user.

\n", + "group": "repository" + }, + "git_repository_set_ident": { + "type": "function", + "file": "git2/repository.h", + "line": 995, + "lineto": 995, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository to configure" + }, + { + "name": "name", + "type": "const char *", + "comment": "the name to use for the reflog entries" + }, + { + "name": "email", + "type": "const char *", + "comment": "the email to use for the reflog entries" + } + ], + "argline": "git_repository *repo, const char *name, const char *email", + "sig": "git_repository *::const char *::const char *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Set the identity to be used for writing reflogs

\n", + "comments": "

If both are set, this name and email will be used to write to the reflog. Pass NULL to unset. When unset, the identity will be taken from the repository's configuration.

\n", + "group": "repository" + }, + "git_repository_oid_type": { + "type": "function", + "file": "git2/repository.h", + "line": 1003, + "lineto": 1003, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository" + } + ], + "argline": "git_repository *repo", + "sig": "git_repository *", + "return": { "type": "git_oid_t", "comment": " the object id type" }, + "description": "

Gets the object type used by this repository.

\n", + "comments": "", + "group": "repository" + }, + "git_repository_commit_parents": { + "type": "function", + "file": "git2/repository.h", + "line": 1014, + "lineto": 1014, + "args": [ + { + "name": "commits", + "type": "git_commitarray *", + "comment": "a `git_commitarray` that will contain the commit parents" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository" + } + ], + "argline": "git_commitarray *commits, git_repository *repo", + "sig": "git_commitarray *::git_repository *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Gets the parents of the next commit, given the current repository state.\n Generally, this is the HEAD commit, except when performing a merge, in\n which case it is two or more commits.

\n", + "comments": "", + "group": "repository" + }, + "git_reset": { + "type": "function", + "file": "git2/reset.h", + "line": 62, + "lineto": 66, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository where to perform the reset operation." + }, + { + "name": "target", + "type": "const git_object *", + "comment": "Committish to which the Head should be moved to. This object\n must belong to the given `repo` and can either be a git_commit or a\n git_tag. When a git_tag is being passed, it should be dereferenceable\n to a git_commit which oid will be used as the target of the branch." + }, + { + "name": "reset_type", + "type": "git_reset_t", + "comment": "Kind of reset operation to perform." + }, + { + "name": "checkout_opts", + "type": "const git_checkout_options *", + "comment": "Optional checkout options to be used for a HARD reset.\n The checkout_strategy field will be overridden (based on reset_type).\n This parameter can be used to propagate notify and progress callbacks." + } + ], + "argline": "git_repository *repo, const git_object *target, git_reset_t reset_type, const git_checkout_options *checkout_opts", + "sig": "git_repository *::const git_object *::git_reset_t::const git_checkout_options *", + "return": { "type": "int", "comment": " 0 on success or an error code" }, + "description": "

Sets the current head to the specified commit oid and optionally\n resets the index and working tree to match.

\n", + "comments": "

SOFT reset means the Head will be moved to the commit.

\n\n

MIXED reset will trigger a SOFT reset, plus the index will be replaced with the content of the commit tree.

\n\n

HARD reset will trigger a MIXED reset and the working directory will be replaced with the content of the index. (Untracked and ignored files will be left alone, however.)

\n\n

TODO: Implement remaining kinds of resets.

\n", + "group": "reset" + }, + "git_reset_from_annotated": { + "type": "function", + "file": "git2/reset.h", + "line": 92, + "lineto": 96, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository where to perform the reset operation." + }, + { + "name": "target", + "type": "const git_annotated_commit *", + "comment": "Annotated commit to which the Head should be moved to.\n This object must belong to the given `repo`, it will be dereferenced\n to a git_commit which oid will be used as the target of the branch." + }, + { + "name": "reset_type", + "type": "git_reset_t", + "comment": "Kind of reset operation to perform." + }, + { + "name": "checkout_opts", + "type": "const git_checkout_options *", + "comment": "Optional checkout options to be used for a HARD reset.\n The checkout_strategy field will be overridden (based on reset_type).\n This parameter can be used to propagate notify and progress callbacks." + } + ], + "argline": "git_repository *repo, const git_annotated_commit *target, git_reset_t reset_type, const git_checkout_options *checkout_opts", + "sig": "git_repository *::const git_annotated_commit *::git_reset_t::const git_checkout_options *", + "return": { "type": "int", "comment": " 0 on success or an error code" }, + "description": "

Sets the current head to the specified commit oid and optionally\n resets the index and working tree to match.

\n", + "comments": "

This behaves like git_reset() but takes an annotated commit, which lets you specify which extended sha syntax string was specified by a user, allowing for more exact reflog messages.

\n\n

See the documentation for git_reset().

\n", + "group": "reset" + }, + "git_reset_default": { + "type": "function", + "file": "git2/reset.h", + "line": 116, + "lineto": 119, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository where to perform the reset operation." + }, + { + "name": "target", + "type": "const git_object *", + "comment": "The committish which content will be used to reset the content\n of the index." + }, + { + "name": "pathspecs", + "type": "const git_strarray *", + "comment": "List of pathspecs to operate on." + } + ], + "argline": "git_repository *repo, const git_object *target, const git_strarray *pathspecs", + "sig": "git_repository *::const git_object *::const git_strarray *", + "return": { + "type": "int", + "comment": " 0 on success or an error code \n<\n 0" + }, + "description": "

Updates some entries in the index from the target commit tree.

\n", + "comments": "

The scope of the updated entries is determined by the paths being passed in the pathspec parameters.

\n\n

Passing a NULL target will result in removing entries in the index matching the provided pathspecs.

\n", + "group": "reset" + }, + "git_revert_options_init": { + "type": "function", + "file": "git2/revert.h", + "line": 54, + "lineto": 56, + "args": [ + { + "name": "opts", + "type": "git_revert_options *", + "comment": "The `git_revert_options` struct to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "The struct version; pass `GIT_REVERT_OPTIONS_VERSION`." + } + ], + "argline": "git_revert_options *opts, unsigned int version", + "sig": "git_revert_options *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initialize git_revert_options structure

\n", + "comments": "

Initializes a git_revert_options with default values. Equivalent to creating an instance with GIT_REVERT_OPTIONS_INIT.

\n", + "group": "revert" + }, + "git_revert_commit": { + "type": "function", + "file": "git2/revert.h", + "line": 72, + "lineto": 78, + "args": [ + { + "name": "out", + "type": "git_index **", + "comment": "pointer to store the index result in" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository that contains the given commits" + }, + { + "name": "revert_commit", + "type": "git_commit *", + "comment": "the commit to revert" + }, + { + "name": "our_commit", + "type": "git_commit *", + "comment": "the commit to revert against (eg, HEAD)" + }, + { + "name": "mainline", + "type": "unsigned int", + "comment": "the parent of the revert commit, if it is a merge" + }, + { + "name": "merge_options", + "type": "const git_merge_options *", + "comment": "the merge options (or null for defaults)" + } + ], + "argline": "git_index **out, git_repository *repo, git_commit *revert_commit, git_commit *our_commit, unsigned int mainline, const git_merge_options *merge_options", + "sig": "git_index **::git_repository *::git_commit *::git_commit *::unsigned int::const git_merge_options *", + "return": { + "type": "int", + "comment": " zero on success, -1 on failure." + }, + "description": "

Reverts the given commit against the given "our" commit, producing an\n index that reflects the result of the revert.

\n", + "comments": "

The returned index must be freed explicitly with git_index_free.

\n", + "group": "revert" + }, + "git_revert": { + "type": "function", + "file": "git2/revert.h", + "line": 88, + "lineto": 91, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository to revert" + }, + { + "name": "commit", + "type": "git_commit *", + "comment": "the commit to revert" + }, + { + "name": "given_opts", + "type": "const git_revert_options *", + "comment": "the revert options (or null for defaults)" + } + ], + "argline": "git_repository *repo, git_commit *commit, const git_revert_options *given_opts", + "sig": "git_repository *::git_commit *::const git_revert_options *", + "return": { + "type": "int", + "comment": " zero on success, -1 on failure." + }, + "description": "

Reverts the given commit, producing changes in the index and working directory.

\n", + "comments": "", + "group": "revert" + }, + "git_revparse_single": { + "type": "function", + "file": "git2/revparse.h", + "line": 37, + "lineto": 38, + "args": [ + { + "name": "out", + "type": "git_object **", + "comment": "pointer to output object" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository to search in" + }, + { + "name": "spec", + "type": "const char *", + "comment": "the textual specification for an object" + } + ], + "argline": "git_object **out, git_repository *repo, const char *spec", + "sig": "git_object **::git_repository *::const char *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_ENOTFOUND, GIT_EAMBIGUOUS, GIT_EINVALIDSPEC or an error code" + }, + "description": "

Find a single object, as specified by a revision string.

\n", + "comments": "

See man gitrevisions, or http://git-scm.com/docs/git-rev-parse.html#_specifying_revisions for information on the syntax accepted.

\n\n

The returned object should be released with git_object_free when no longer needed.

\n", + "group": "revparse", + "examples": { + "blame.c": ["ex/v1.9.1/blame.html#git_revparse_single-21"], + "cat-file.c": ["ex/v1.9.1/cat-file.html#git_revparse_single-30"], + "describe.c": ["ex/v1.9.1/describe.html#git_revparse_single-6"], + "log.c": ["ex/v1.9.1/log.html#git_revparse_single-44"], + "tag.c": [ + "ex/v1.9.1/tag.html#git_revparse_single-9", + "ex/v1.9.1/tag.html#git_revparse_single-10", + "ex/v1.9.1/tag.html#git_revparse_single-11", + "ex/v1.9.1/tag.html#git_revparse_single-12" + ] + } + }, + "git_revparse_ext": { + "type": "function", + "file": "git2/revparse.h", + "line": 61, + "lineto": 65, + "args": [ + { + "name": "object_out", + "type": "git_object **", + "comment": "pointer to output object" + }, + { + "name": "reference_out", + "type": "git_reference **", + "comment": "pointer to output reference or NULL" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository to search in" + }, + { + "name": "spec", + "type": "const char *", + "comment": "the textual specification for an object" + } + ], + "argline": "git_object **object_out, git_reference **reference_out, git_repository *repo, const char *spec", + "sig": "git_object **::git_reference **::git_repository *::const char *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_ENOTFOUND, GIT_EAMBIGUOUS, GIT_EINVALIDSPEC\n or an error code" + }, + "description": "

Find a single object and intermediate reference by a revision string.

\n", + "comments": "

See man gitrevisions, or http://git-scm.com/docs/git-rev-parse.html#_specifying_revisions for information on the syntax accepted.

\n\n

In some cases (@{<-n>} or <branchname>@{upstream}), the expression may point to an intermediate reference. When such expressions are being passed in, reference_out will be valued as well.

\n\n

The returned object should be released with git_object_free and the returned reference with git_reference_free when no longer needed.

\n", + "group": "revparse", + "examples": { "commit.c": ["ex/v1.9.1/commit.html#git_revparse_ext-9"] } + }, + "git_revparse": { + "type": "function", + "file": "git2/revparse.h", + "line": 105, + "lineto": 108, + "args": [ + { + "name": "revspec", + "type": "git_revspec *", + "comment": "Pointer to an user-allocated git_revspec struct where\n\t the result of the rev-parse will be stored" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository to search in" + }, + { + "name": "spec", + "type": "const char *", + "comment": "the rev-parse spec to parse" + } + ], + "argline": "git_revspec *revspec, git_repository *repo, const char *spec", + "sig": "git_revspec *::git_repository *::const char *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_INVALIDSPEC, GIT_ENOTFOUND, GIT_EAMBIGUOUS or an error code" + }, + "description": "

Parse a revision string for from, to, and intent.

\n", + "comments": "

See man gitrevisions or http://git-scm.com/docs/git-rev-parse.html#_specifying_revisions for information on the syntax accepted.

\n", + "group": "revparse", + "examples": { + "blame.c": ["ex/v1.9.1/blame.html#git_revparse-22"], + "log.c": ["ex/v1.9.1/log.html#git_revparse-45"], + "rev-parse.c": [ + "ex/v1.9.1/rev-parse.html#git_revparse-14", + "ex/v1.9.1/rev-parse.html#git_revparse-15" + ] + } + }, + "git_revwalk_new": { + "type": "function", + "file": "git2/revwalk.h", + "line": 73, + "lineto": 73, + "args": [ + { + "name": "out", + "type": "git_revwalk **", + "comment": "pointer to the new revision walker" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repo to walk through" + } + ], + "argline": "git_revwalk **out, git_repository *repo", + "sig": "git_revwalk **::git_repository *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Allocate a new revision walker to iterate through a repo.

\n", + "comments": "

This revision walker uses a custom memory pool and an internal commit cache, so it is relatively expensive to allocate.

\n\n

For maximum performance, this revision walker should be reused for different walks.

\n\n

This revision walker is not thread safe: it may only be used to walk a repository on a single thread; however, it is possible to have several revision walkers in several different threads walking the same repository.

\n", + "group": "revwalk", + "examples": { + "general.c": ["ex/v1.9.1/general.html#git_revwalk_new-81"], + "log.c": [ + "ex/v1.9.1/log.html#git_revwalk_new-46", + "ex/v1.9.1/log.html#git_revwalk_new-47" + ] + } + }, + "git_revwalk_reset": { + "type": "function", + "file": "git2/revwalk.h", + "line": 89, + "lineto": 89, + "args": [ + { + "name": "walker", + "type": "git_revwalk *", + "comment": "handle to reset." + } + ], + "argline": "git_revwalk *walker", + "sig": "git_revwalk *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Reset the revision walker for reuse.

\n", + "comments": "

This will clear all the pushed and hidden commits, and leave the walker in a blank state (just like at creation) ready to receive new commit pushes and start a new walk.

\n\n

The revision walk is automatically reset when a walk is over.

\n", + "group": "revwalk" + }, + "git_revwalk_push": { + "type": "function", + "file": "git2/revwalk.h", + "line": 108, + "lineto": 108, + "args": [ + { + "name": "walk", + "type": "git_revwalk *", + "comment": "the walker being used for the traversal." + }, + { + "name": "id", + "type": "const git_oid *", + "comment": "the oid of the commit to start from." + } + ], + "argline": "git_revwalk *walk, const git_oid *id", + "sig": "git_revwalk *::const git_oid *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Add a new root for the traversal

\n", + "comments": "

The pushed commit will be marked as one of the roots from which to start the walk. This commit may not be walked if it or a child is hidden.

\n\n

At least one commit must be pushed onto the walker before a walk can be started.

\n\n

The given id must belong to a committish on the walked repository.

\n", + "group": "revwalk", + "examples": { + "general.c": ["ex/v1.9.1/general.html#git_revwalk_push-82"], + "log.c": ["ex/v1.9.1/log.html#git_revwalk_push-48"] + } + }, + "git_revwalk_push_glob": { + "type": "function", + "file": "git2/revwalk.h", + "line": 126, + "lineto": 126, + "args": [ + { + "name": "walk", + "type": "git_revwalk *", + "comment": "the walker being used for the traversal" + }, + { + "name": "glob", + "type": "const char *", + "comment": "the glob pattern references should match" + } + ], + "argline": "git_revwalk *walk, const char *glob", + "sig": "git_revwalk *::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Push matching references

\n", + "comments": "

The OIDs pointed to by the references that match the given glob pattern will be pushed to the revision walker.

\n\n

A leading 'refs/' is implied if not present as well as a trailing '/*' if the glob lacks '?', '*' or '['.

\n\n

Any references matching this glob which do not point to a committish will be ignored.

\n", + "group": "revwalk" + }, + "git_revwalk_push_head": { + "type": "function", + "file": "git2/revwalk.h", + "line": 134, + "lineto": 134, + "args": [ + { + "name": "walk", + "type": "git_revwalk *", + "comment": "the walker being used for the traversal" + } + ], + "argline": "git_revwalk *walk", + "sig": "git_revwalk *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Push the repository's HEAD

\n", + "comments": "", + "group": "revwalk", + "examples": { "log.c": ["ex/v1.9.1/log.html#git_revwalk_push_head-49"] } + }, + "git_revwalk_hide": { + "type": "function", + "file": "git2/revwalk.h", + "line": 149, + "lineto": 149, + "args": [ + { + "name": "walk", + "type": "git_revwalk *", + "comment": "the walker being used for the traversal." + }, + { + "name": "commit_id", + "type": "const git_oid *", + "comment": "the oid of commit that will be ignored during the traversal" + } + ], + "argline": "git_revwalk *walk, const git_oid *commit_id", + "sig": "git_revwalk *::const git_oid *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Mark a commit (and its ancestors) uninteresting for the output.

\n", + "comments": "

The given id must belong to a committish on the walked repository.

\n\n

The resolved commit and all its parents will be hidden from the output on the revision walk.

\n", + "group": "revwalk", + "examples": { "log.c": ["ex/v1.9.1/log.html#git_revwalk_hide-50"] } + }, + "git_revwalk_hide_glob": { + "type": "function", + "file": "git2/revwalk.h", + "line": 168, + "lineto": 168, + "args": [ + { + "name": "walk", + "type": "git_revwalk *", + "comment": "the walker being used for the traversal" + }, + { + "name": "glob", + "type": "const char *", + "comment": "the glob pattern references should match" + } + ], + "argline": "git_revwalk *walk, const char *glob", + "sig": "git_revwalk *::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Hide matching references.

\n", + "comments": "

The OIDs pointed to by the references that match the given glob pattern and their ancestors will be hidden from the output on the revision walk.

\n\n

A leading 'refs/' is implied if not present as well as a trailing '/*' if the glob lacks '?', '*' or '['.

\n\n

Any references matching this glob which do not point to a committish will be ignored.

\n", + "group": "revwalk" + }, + "git_revwalk_hide_head": { + "type": "function", + "file": "git2/revwalk.h", + "line": 176, + "lineto": 176, + "args": [ + { + "name": "walk", + "type": "git_revwalk *", + "comment": "the walker being used for the traversal" + } + ], + "argline": "git_revwalk *walk", + "sig": "git_revwalk *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Hide the repository's HEAD

\n", + "comments": "", + "group": "revwalk" + }, + "git_revwalk_push_ref": { + "type": "function", + "file": "git2/revwalk.h", + "line": 187, + "lineto": 187, + "args": [ + { + "name": "walk", + "type": "git_revwalk *", + "comment": "the walker being used for the traversal" + }, + { + "name": "refname", + "type": "const char *", + "comment": "the reference to push" + } + ], + "argline": "git_revwalk *walk, const char *refname", + "sig": "git_revwalk *::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Push the OID pointed to by a reference

\n", + "comments": "

The reference must point to a committish.

\n", + "group": "revwalk" + }, + "git_revwalk_hide_ref": { + "type": "function", + "file": "git2/revwalk.h", + "line": 198, + "lineto": 198, + "args": [ + { + "name": "walk", + "type": "git_revwalk *", + "comment": "the walker being used for the traversal" + }, + { + "name": "refname", + "type": "const char *", + "comment": "the reference to hide" + } + ], + "argline": "git_revwalk *walk, const char *refname", + "sig": "git_revwalk *::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Hide the OID pointed to by a reference

\n", + "comments": "

The reference must point to a committish.

\n", + "group": "revwalk" + }, + "git_revwalk_next": { + "type": "function", + "file": "git2/revwalk.h", + "line": 218, + "lineto": 218, + "args": [ + { + "name": "out", + "type": "git_oid *", + "comment": "Pointer where to store the oid of the next commit" + }, + { + "name": "walk", + "type": "git_revwalk *", + "comment": "the walker to pop the commit from." + } + ], + "argline": "git_oid *out, git_revwalk *walk", + "sig": "git_oid *::git_revwalk *", + "return": { + "type": "int", + "comment": " 0 if the next commit was found;\n\tGIT_ITEROVER if there are no commits left to iterate" + }, + "description": "

Get the next commit from the revision walk.

\n", + "comments": "

The initial call to this method is not blocking when iterating through a repo with a time-sorting mode.

\n\n

Iterating with Topological or inverted modes makes the initial call blocking to preprocess the commit list, but this block should be mostly unnoticeable on most repositories (topological preprocessing times at 0.3s on the git.git repo).

\n\n

The revision walker is reset when the walk is over.

\n", + "group": "revwalk", + "examples": { + "general.c": ["ex/v1.9.1/general.html#git_revwalk_next-83"], + "log.c": ["ex/v1.9.1/log.html#git_revwalk_next-51"] + } + }, + "git_revwalk_sorting": { + "type": "function", + "file": "git2/revwalk.h", + "line": 230, + "lineto": 230, + "args": [ + { + "name": "walk", + "type": "git_revwalk *", + "comment": "the walker being used for the traversal." + }, + { + "name": "sort_mode", + "type": "unsigned int", + "comment": "combination of GIT_SORT_XXX flags" + } + ], + "argline": "git_revwalk *walk, unsigned int sort_mode", + "sig": "git_revwalk *::unsigned int", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Change the sorting mode when iterating through the\n repository's contents.

\n", + "comments": "

Changing the sorting mode resets the walker.

\n", + "group": "revwalk", + "examples": { + "general.c": ["ex/v1.9.1/general.html#git_revwalk_sorting-84"], + "log.c": [ + "ex/v1.9.1/log.html#git_revwalk_sorting-52", + "ex/v1.9.1/log.html#git_revwalk_sorting-53" + ] + } + }, + "git_revwalk_push_range": { + "type": "function", + "file": "git2/revwalk.h", + "line": 245, + "lineto": 245, + "args": [ + { + "name": "walk", + "type": "git_revwalk *", + "comment": "the walker being used for the traversal" + }, + { "name": "range", "type": "const char *", "comment": "the range" } + ], + "argline": "git_revwalk *walk, const char *range", + "sig": "git_revwalk *::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Push and hide the respective endpoints of the given range.

\n", + "comments": "

The range should be of the form .. where each is in the form accepted by 'git_revparse_single'. The left-hand commit will be hidden and the right-hand commit pushed.

\n", + "group": "revwalk" + }, + "git_revwalk_simplify_first_parent": { + "type": "function", + "file": "git2/revwalk.h", + "line": 255, + "lineto": 255, + "args": [ + { + "name": "walk", + "type": "git_revwalk *", + "comment": "The revision walker." + } + ], + "argline": "git_revwalk *walk", + "sig": "git_revwalk *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Simplify the history by first-parent

\n", + "comments": "

No parents other than the first for each commit will be enqueued.

\n", + "group": "revwalk" + }, + "git_revwalk_free": { + "type": "function", + "file": "git2/revwalk.h", + "line": 263, + "lineto": 263, + "args": [ + { + "name": "walk", + "type": "git_revwalk *", + "comment": "traversal handle to close. If NULL nothing occurs." + } + ], + "argline": "git_revwalk *walk", + "sig": "git_revwalk *", + "return": { "type": "void", "comment": null }, + "description": "

Free a revision walker previously allocated.

\n", + "comments": "", + "group": "revwalk", + "examples": { + "general.c": ["ex/v1.9.1/general.html#git_revwalk_free-85"], + "log.c": ["ex/v1.9.1/log.html#git_revwalk_free-54"] + } + }, + "git_revwalk_repository": { + "type": "function", + "file": "git2/revwalk.h", + "line": 272, + "lineto": 272, + "args": [ + { + "name": "walk", + "type": "git_revwalk *", + "comment": "the revision walker" + } + ], + "argline": "git_revwalk *walk", + "sig": "git_revwalk *", + "return": { + "type": "git_repository *", + "comment": " the repository being walked" + }, + "description": "

Return the repository on which this walker\n is operating.

\n", + "comments": "", + "group": "revwalk" + }, + "git_revwalk_add_hide_cb": { + "type": "function", + "file": "git2/revwalk.h", + "line": 295, + "lineto": 298, + "args": [ + { + "name": "walk", + "type": "git_revwalk *", + "comment": "the revision walker" + }, + { + "name": "hide_cb", + "type": "git_revwalk_hide_cb", + "comment": "callback function to hide a commit and its parents" + }, + { + "name": "payload", + "type": "void *", + "comment": "data payload to be passed to callback function" + } + ], + "argline": "git_revwalk *walk, git_revwalk_hide_cb hide_cb, void *payload", + "sig": "git_revwalk *::git_revwalk_hide_cb::void *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Adds, changes or removes a callback function to hide a commit and its parents

\n", + "comments": "", + "group": "revwalk" + }, + "git_signature_new": { + "type": "function", + "file": "git2/signature.h", + "line": 41, + "lineto": 41, + "args": [ + { + "name": "out", + "type": "git_signature **", + "comment": "new signature, in case of error NULL" + }, + { + "name": "name", + "type": "const char *", + "comment": "name of the person" + }, + { + "name": "email", + "type": "const char *", + "comment": "email of the person" + }, + { + "name": "time", + "type": "git_time_t", + "comment": "time (in seconds from epoch) when the action happened" + }, + { + "name": "offset", + "type": "int", + "comment": "timezone offset (in minutes) for the time" + } + ], + "argline": "git_signature **out, const char *name, const char *email, git_time_t time, int offset", + "sig": "git_signature **::const char *::const char *::git_time_t::int", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Create a new action signature.

\n", + "comments": "

Call git_signature_free() to free the data.

\n\n

Note: angle brackets ('<' and '>') characters are not allowed to be used in either the name or the email parameter.

\n", + "group": "signature", + "examples": { + "general.c": [ + "ex/v1.9.1/general.html#git_signature_new-86", + "ex/v1.9.1/general.html#git_signature_new-87" + ] + } + }, + "git_signature_now": { + "type": "function", + "file": "git2/signature.h", + "line": 53, + "lineto": 53, + "args": [ + { + "name": "out", + "type": "git_signature **", + "comment": "new signature, in case of error NULL" + }, + { + "name": "name", + "type": "const char *", + "comment": "name of the person" + }, + { + "name": "email", + "type": "const char *", + "comment": "email of the person" + } + ], + "argline": "git_signature **out, const char *name, const char *email", + "sig": "git_signature **::const char *::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Create a new action signature with a timestamp of 'now'.

\n", + "comments": "

Call git_signature_free() to free the data.

\n", + "group": "signature", + "examples": { "merge.c": ["ex/v1.9.1/merge.html#git_signature_now-36"] } + }, + "git_signature_default_from_env": { + "type": "function", + "file": "git2/signature.h", + "line": 86, + "lineto": 89, + "args": [ + { + "name": "author_out", + "type": "git_signature **", + "comment": "pointer to set the author signature, or NULL" + }, + { + "name": "committer_out", + "type": "git_signature **", + "comment": "pointer to set the committer signature, or NULL" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "repository pointer" + } + ], + "argline": "git_signature **author_out, git_signature **committer_out, git_repository *repo", + "sig": "git_signature **::git_signature **::git_repository *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_ENOTFOUND if config is missing, or error code" + }, + "description": "

Create a new author and/or committer signatures with default\n information based on the configuration and environment variables.

\n", + "comments": "

If author_out is set, it will be populated with the author information. The GIT_AUTHOR_NAME and GIT_AUTHOR_EMAIL environment variables will be honored, and user.name and user.email configuration options will be honored if the environment variables are unset. For timestamps, GIT_AUTHOR_DATE will be used, otherwise the current time will be used.

\n\n

If committer_out is set, it will be populated with the committer information. The GIT_COMMITTER_NAME and GIT_COMMITTER_EMAIL environment variables will be honored, and user.name and user.email configuration options will be honored if the environment variables are unset. For timestamps, GIT_COMMITTER_DATE will be used, otherwise the current time will be used.

\n\n

If neither GIT_AUTHOR_DATE nor GIT_COMMITTER_DATE are set, both timestamps will be set to the same time.

\n\n

It will return GIT_ENOTFOUND if either the user.name or user.email are not set and there is no fallback from an environment variable. One of author_out or committer_out must be set.

\n", + "group": "signature", + "examples": { + "commit.c": ["ex/v1.9.1/commit.html#git_signature_default_from_env-10"], + "init.c": ["ex/v1.9.1/init.html#git_signature_default_from_env-10"], + "tag.c": ["ex/v1.9.1/tag.html#git_signature_default_from_env-13"] + } + }, + "git_signature_default": { + "type": "function", + "file": "git2/signature.h", + "line": 107, + "lineto": 107, + "args": [ + { + "name": "out", + "type": "git_signature **", + "comment": "new signature" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "repository pointer" + } + ], + "argline": "git_signature **out, git_repository *repo", + "sig": "git_signature **::git_repository *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_ENOTFOUND if config is missing, or error code" + }, + "description": "

Create a new action signature with default user and now timestamp.

\n", + "comments": "

This looks up the user.name and user.email from the configuration and uses the current time as the timestamp, and creates a new signature based on that information. It will return GIT_ENOTFOUND if either the user.name or user.email are not set.

\n\n

Note that these do not examine environment variables, only the configuration files. Use git_signature_default_from_env to consider the environment variables.

\n", + "group": "signature" + }, + "git_signature_from_buffer": { + "type": "function", + "file": "git2/signature.h", + "line": 120, + "lineto": 120, + "args": [ + { + "name": "out", + "type": "git_signature **", + "comment": "new signature" + }, + { "name": "buf", "type": "const char *", "comment": "signature string" } + ], + "argline": "git_signature **out, const char *buf", + "sig": "git_signature **::const char *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_EINVALID if the signature is not parseable, or an error code" + }, + "description": "

Create a new signature by parsing the given buffer, which is\n expected to be in the format "Real Name \n<email

\n\n
\n

timestamp tzoffset",\n where timestamp is the number of seconds since the Unix epoch and\n tzoffset is the timezone offset in hhmm format (note the lack\n of a colon separator).

\n
\n", + "comments": "", + "group": "signature" + }, + "git_signature_dup": { + "type": "function", + "file": "git2/signature.h", + "line": 132, + "lineto": 132, + "args": [ + { + "name": "dest", + "type": "git_signature **", + "comment": "pointer where to store the copy" + }, + { + "name": "sig", + "type": "const git_signature *", + "comment": "signature to duplicate" + } + ], + "argline": "git_signature **dest, const git_signature *sig", + "sig": "git_signature **::const git_signature *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Create a copy of an existing signature. All internal strings are also\n duplicated.

\n", + "comments": "

Call git_signature_free() to free the data.

\n", + "group": "signature" + }, + "git_signature_free": { + "type": "function", + "file": "git2/signature.h", + "line": 143, + "lineto": 143, + "args": [ + { + "name": "sig", + "type": "git_signature *", + "comment": "signature to free" + } + ], + "argline": "git_signature *sig", + "sig": "git_signature *", + "return": { "type": "void", "comment": null }, + "description": "

Free an existing signature.

\n", + "comments": "

Because the signature is not an opaque structure, it is legal to free it manually, but be sure to free the "name" and "email" strings in addition to the structure itself.

\n", + "group": "signature", + "examples": { + "commit.c": [ + "ex/v1.9.1/commit.html#git_signature_free-11", + "ex/v1.9.1/commit.html#git_signature_free-12" + ], + "general.c": [ + "ex/v1.9.1/general.html#git_signature_free-88", + "ex/v1.9.1/general.html#git_signature_free-89" + ], + "init.c": [ + "ex/v1.9.1/init.html#git_signature_free-11", + "ex/v1.9.1/init.html#git_signature_free-12" + ], + "tag.c": ["ex/v1.9.1/tag.html#git_signature_free-14"] + } + }, + "git_stash_save": { + "type": "function", + "file": "git2/stash.h", + "line": 72, + "lineto": 77, + "args": [ + { + "name": "out", + "type": "git_oid *", + "comment": "Object id of the commit containing the stashed state.\n This commit is also the target of the direct reference refs/stash." + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "The owning repository." + }, + { + "name": "stasher", + "type": "const git_signature *", + "comment": "The identity of the person performing the stashing." + }, + { + "name": "message", + "type": "const char *", + "comment": "Optional description along with the stashed state." + }, + { + "name": "flags", + "type": "uint32_t", + "comment": "Flags to control the stashing process. (see GIT_STASH_* above)" + } + ], + "argline": "git_oid *out, git_repository *repo, const git_signature *stasher, const char *message, uint32_t flags", + "sig": "git_oid *::git_repository *::const git_signature *::const char *::uint32_t", + "return": { + "type": "int", + "comment": " 0 on success, GIT_ENOTFOUND where there's nothing to stash,\n or error code." + }, + "description": "

Save the local modifications to a new stash.

\n", + "comments": "", + "group": "stash" + }, + "git_stash_save_options_init": { + "type": "function", + "file": "git2/stash.h", + "line": 118, + "lineto": 119, + "args": [ + { + "name": "opts", + "type": "git_stash_save_options *", + "comment": "The `git_stash_save_options` struct to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "The struct version; pass `GIT_STASH_SAVE_OPTIONS_VERSION`." + } + ], + "argline": "git_stash_save_options *opts, unsigned int version", + "sig": "git_stash_save_options *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initialize git_stash_save_options structure

\n", + "comments": "

Initializes a git_stash_save_options with default values. Equivalent to creating an instance with GIT_STASH_SAVE_OPTIONS_INIT.

\n", + "group": "stash" + }, + "git_stash_save_with_opts": { + "type": "function", + "file": "git2/stash.h", + "line": 131, + "lineto": 134, + "args": [ + { + "name": "out", + "type": "git_oid *", + "comment": "Object id of the commit containing the stashed state.\n This commit is also the target of the direct reference refs/stash." + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "The owning repository." + }, + { + "name": "opts", + "type": "const git_stash_save_options *", + "comment": "The stash options." + } + ], + "argline": "git_oid *out, git_repository *repo, const git_stash_save_options *opts", + "sig": "git_oid *::git_repository *::const git_stash_save_options *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_ENOTFOUND where there's nothing to stash,\n or error code." + }, + "description": "

Save the local modifications to a new stash, with options.

\n", + "comments": "", + "group": "stash" + }, + "git_stash_apply_options_init": { + "type": "function", + "file": "git2/stash.h", + "line": 225, + "lineto": 226, + "args": [ + { + "name": "opts", + "type": "git_stash_apply_options *", + "comment": "The `git_stash_apply_options` struct to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "The struct version; pass `GIT_STASH_APPLY_OPTIONS_VERSION`." + } + ], + "argline": "git_stash_apply_options *opts, unsigned int version", + "sig": "git_stash_apply_options *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initialize git_stash_apply_options structure

\n", + "comments": "

Initializes a git_stash_apply_options with default values. Equivalent to creating an instance with GIT_STASH_APPLY_OPTIONS_INIT.

\n", + "group": "stash" + }, + "git_stash_apply": { + "type": "function", + "file": "git2/stash.h", + "line": 252, + "lineto": 255, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "The owning repository." + }, + { + "name": "index", + "type": "size_t", + "comment": "The position within the stash list. 0 points to the\n most recent stashed state." + }, + { + "name": "options", + "type": "const git_stash_apply_options *", + "comment": "Optional options to control how stashes are applied." + } + ], + "argline": "git_repository *repo, size_t index, const git_stash_apply_options *options", + "sig": "git_repository *::size_t::const git_stash_apply_options *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_ENOTFOUND if there's no stashed state for the\n given index, GIT_EMERGECONFLICT if changes exist in the working\n directory, or an error code" + }, + "description": "

Apply a single stashed state from the stash list.

\n", + "comments": "

If local changes in the working directory conflict with changes in the stash then GIT_EMERGECONFLICT will be returned. In this case, the index will always remain unmodified and all files in the working directory will remain unmodified. However, if you are restoring untracked files or ignored files and there is a conflict when applying the modified files, then those files will remain in the working directory.

\n\n

If passing the GIT_STASH_APPLY_REINSTATE_INDEX flag and there would be conflicts when reinstating the index, the function will return GIT_EMERGECONFLICT and both the working directory and index will be left unmodified.

\n", + "group": "stash" + }, + "git_stash_foreach": { + "type": "function", + "file": "git2/stash.h", + "line": 288, + "lineto": 291, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository where to find the stash." + }, + { + "name": "callback", + "type": "git_stash_cb", + "comment": "Callback to invoke per found stashed state. The most\n recent stash state will be enumerated first." + }, + { + "name": "payload", + "type": "void *", + "comment": "Extra parameter to callback function." + } + ], + "argline": "git_repository *repo, git_stash_cb callback, void *payload", + "sig": "git_repository *::git_stash_cb::void *", + "return": { + "type": "int", + "comment": " 0 on success, non-zero callback return value, or error code." + }, + "description": "

Loop over all the stashed states and issue a callback for each one.

\n", + "comments": "

If the callback returns a non-zero value, this will stop looping.

\n", + "group": "stash" + }, + "git_stash_drop": { + "type": "function", + "file": "git2/stash.h", + "line": 304, + "lineto": 306, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "The owning repository." + }, + { + "name": "index", + "type": "size_t", + "comment": "The position within the stash list. 0 points to the\n most recent stashed state." + } + ], + "argline": "git_repository *repo, size_t index", + "sig": "git_repository *::size_t", + "return": { + "type": "int", + "comment": " 0 on success, GIT_ENOTFOUND if there's no stashed state for the given\n index, or error code." + }, + "description": "

Remove a single stashed state from the stash list.

\n", + "comments": "", + "group": "stash" + }, + "git_stash_pop": { + "type": "function", + "file": "git2/stash.h", + "line": 320, + "lineto": 323, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "The owning repository." + }, + { + "name": "index", + "type": "size_t", + "comment": "The position within the stash list. 0 points to the\n most recent stashed state." + }, + { + "name": "options", + "type": "const git_stash_apply_options *", + "comment": "Optional options to control how stashes are applied." + } + ], + "argline": "git_repository *repo, size_t index, const git_stash_apply_options *options", + "sig": "git_repository *::size_t::const git_stash_apply_options *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_ENOTFOUND if there's no stashed state for the given\n index, or error code. (see git_stash_apply() above for details)" + }, + "description": "

Apply a single stashed state from the stash list and remove it from the list\n if successful.

\n", + "comments": "", + "group": "stash" + }, + "git_status_options_init": { + "type": "function", + "file": "git2/status.h", + "line": 280, + "lineto": 282, + "args": [ + { + "name": "opts", + "type": "git_status_options *", + "comment": "The `git_status_options` struct to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "The struct version; pass `GIT_STATUS_OPTIONS_VERSION`." + } + ], + "argline": "git_status_options *opts, unsigned int version", + "sig": "git_status_options *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initialize git_status_options structure

\n", + "comments": "

Initializes a git_status_options with default values. Equivalent to creating an instance with GIT_STATUS_OPTIONS_INIT.

\n", + "group": "status" + }, + "git_status_foreach": { + "type": "function", + "file": "git2/status.h", + "line": 320, + "lineto": 323, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "A repository object" + }, + { + "name": "callback", + "type": "git_status_cb", + "comment": "The function to call on each file" + }, + { + "name": "payload", + "type": "void *", + "comment": "Pointer to pass through to callback function" + } + ], + "argline": "git_repository *repo, git_status_cb callback, void *payload", + "sig": "git_repository *::git_status_cb::void *", + "return": { + "type": "int", + "comment": " 0 on success, non-zero callback return value, or error code" + }, + "description": "

Gather file statuses and run a callback for each one.

\n", + "comments": "

The callback is passed the path of the file, the status (a combination of the git_status_t values above) and the payload data pointer passed into this function.

\n\n

If the callback returns a non-zero value, this function will stop looping and return that value to caller.

\n", + "group": "status", + "examples": { "status.c": ["ex/v1.9.1/status.html#git_status_foreach-6"] } + }, + "git_status_foreach_ext": { + "type": "function", + "file": "git2/status.h", + "line": 344, + "lineto": 348, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository object" + }, + { + "name": "opts", + "type": "const git_status_options *", + "comment": "Status options structure" + }, + { + "name": "callback", + "type": "git_status_cb", + "comment": "The function to call on each file" + }, + { + "name": "payload", + "type": "void *", + "comment": "Pointer to pass through to callback function" + } + ], + "argline": "git_repository *repo, const git_status_options *opts, git_status_cb callback, void *payload", + "sig": "git_repository *::const git_status_options *::git_status_cb::void *", + "return": { + "type": "int", + "comment": " 0 on success, non-zero callback return value, or error code" + }, + "description": "

Gather file status information and run callbacks as requested.

\n", + "comments": "

This is an extended version of the git_status_foreach() API that allows for more granular control over which paths will be processed and in what order. See the git_status_options structure for details about the additional controls that this makes available.

\n\n

Note that if a pathspec is given in the git_status_options to filter the status, then the results from rename detection (if you enable it) may not be accurate. To do rename detection properly, this must be called with no pathspec so that all files can be considered.

\n", + "group": "status", + "examples": { + "status.c": ["ex/v1.9.1/status.html#git_status_foreach_ext-7"] + } + }, + "git_status_file": { + "type": "function", + "file": "git2/status.h", + "line": 376, + "lineto": 379, + "args": [ + { + "name": "status_flags", + "type": "unsigned int *", + "comment": "Output combination of git_status_t values for file" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "A repository object" + }, + { + "name": "path", + "type": "const char *", + "comment": "The exact path to retrieve status for relative to the\n repository working directory" + } + ], + "argline": "unsigned int *status_flags, git_repository *repo, const char *path", + "sig": "unsigned int *::git_repository *::const char *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_ENOTFOUND if the file is not found in the HEAD,\n index, and work tree, GIT_EAMBIGUOUS if `path` matches multiple files\n or if it refers to a folder, and -1 on other errors." + }, + "description": "

Get file status for a single file.

\n", + "comments": "

This tries to get status for the filename that you give. If no files match that name (in either the HEAD, index, or working directory), this returns GIT_ENOTFOUND.

\n\n

If the name matches multiple files (for example, if the path names a directory or if running on a case- insensitive filesystem and yet the HEAD has two entries that both match the path), then this returns GIT_EAMBIGUOUS because it cannot give correct results.

\n\n

This does not do any sort of rename detection. Renames require a set of targets and because of the path filtering, there is not enough information to check renames correctly. To check file status with rename detection, there is no choice but to do a full git_status_list_new and scan through looking for the path that you are interested in.

\n", + "group": "status", + "examples": { "add.c": ["ex/v1.9.1/add.html#git_status_file-6"] } + }, + "git_status_list_new": { + "type": "function", + "file": "git2/status.h", + "line": 394, + "lineto": 397, + "args": [ + { + "name": "out", + "type": "git_status_list **", + "comment": "Pointer to store the status results in" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository object" + }, + { + "name": "opts", + "type": "const git_status_options *", + "comment": "Status options structure" + } + ], + "argline": "git_status_list **out, git_repository *repo, const git_status_options *opts", + "sig": "git_status_list **::git_repository *::const git_status_options *", + "return": { "type": "int", "comment": " 0 on success or error code" }, + "description": "

Gather file status information and populate the git_status_list.

\n", + "comments": "

Note that if a pathspec is given in the git_status_options to filter the status, then the results from rename detection (if you enable it) may not be accurate. To do rename detection properly, this must be called with no pathspec so that all files can be considered.

\n", + "group": "status", + "examples": { + "status.c": [ + "ex/v1.9.1/status.html#git_status_list_new-8", + "ex/v1.9.1/status.html#git_status_list_new-9" + ] + } + }, + "git_status_list_entrycount": { + "type": "function", + "file": "git2/status.h", + "line": 408, + "lineto": 409, + "args": [ + { + "name": "statuslist", + "type": "git_status_list *", + "comment": "Existing status list object" + } + ], + "argline": "git_status_list *statuslist", + "sig": "git_status_list *", + "return": { + "type": "size_t", + "comment": " the number of status entries" + }, + "description": "

Gets the count of status entries in this list.

\n", + "comments": "

If there are no changes in status (at least according the options given when the status list was created), this can return 0.

\n", + "group": "status", + "examples": { + "status.c": [ + "ex/v1.9.1/status.html#git_status_list_entrycount-10", + "ex/v1.9.1/status.html#git_status_list_entrycount-11" + ] + } + }, + "git_status_byindex": { + "type": "function", + "file": "git2/status.h", + "line": 420, + "lineto": 422, + "args": [ + { + "name": "statuslist", + "type": "git_status_list *", + "comment": "Existing status list object" + }, + { "name": "idx", "type": "size_t", "comment": "Position of the entry" } + ], + "argline": "git_status_list *statuslist, size_t idx", + "sig": "git_status_list *::size_t", + "return": { + "type": "const git_status_entry *", + "comment": " Pointer to the entry; NULL if out of bounds" + }, + "description": "

Get a pointer to one of the entries in the status list.

\n", + "comments": "

The entry is not modifiable and should not be freed.

\n", + "group": "status", + "examples": { + "status.c": [ + "ex/v1.9.1/status.html#git_status_byindex-12", + "ex/v1.9.1/status.html#git_status_byindex-13", + "ex/v1.9.1/status.html#git_status_byindex-14", + "ex/v1.9.1/status.html#git_status_byindex-15", + "ex/v1.9.1/status.html#git_status_byindex-16", + "ex/v1.9.1/status.html#git_status_byindex-17" + ] + } + }, + "git_status_list_free": { + "type": "function", + "file": "git2/status.h", + "line": 429, + "lineto": 430, + "args": [ + { + "name": "statuslist", + "type": "git_status_list *", + "comment": "Existing status list object" + } + ], + "argline": "git_status_list *statuslist", + "sig": "git_status_list *", + "return": { "type": "void", "comment": null }, + "description": "

Free an existing status list

\n", + "comments": "", + "group": "status", + "examples": { + "status.c": ["ex/v1.9.1/status.html#git_status_list_free-18"] + } + }, + "git_status_should_ignore": { + "type": "function", + "file": "git2/status.h", + "line": 448, + "lineto": 451, + "args": [ + { + "name": "ignored", + "type": "int *", + "comment": "Boolean returning 0 if the file is not ignored, 1 if it is" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "A repository object" + }, + { + "name": "path", + "type": "const char *", + "comment": "The file to check ignores for, rooted at the repo's workdir." + } + ], + "argline": "int *ignored, git_repository *repo, const char *path", + "sig": "int *::git_repository *::const char *", + "return": { + "type": "int", + "comment": " 0 if ignore rules could be processed for the file (regardless\n of whether it exists or not), or an error \n<\n 0 if they could not." + }, + "description": "

Test if the ignore rules apply to a given file.

\n", + "comments": "

This function checks the ignore rules to see if they would apply to the given file. This indicates if the file would be ignored regardless of whether the file is already in the index or committed to the repository.

\n\n

One way to think of this is if you were to do "git add ." on the directory containing the file, would it be added or not?

\n", + "group": "status" + }, + "git_strarray_dispose": { + "type": "function", + "file": "git2/strarray.h", + "line": 37, + "lineto": 37, + "args": [ + { + "name": "array", + "type": "git_strarray *", + "comment": "The git_strarray that contains strings to free" + } + ], + "argline": "git_strarray *array", + "sig": "git_strarray *", + "return": { "type": "void", "comment": null }, + "description": "

Free the strings contained in a string array. This method should\n be called on git_strarray objects that were provided by the\n library. Not doing so, will result in a memory leak.

\n", + "comments": "

This does not free the git_strarray itself, since the library will never allocate that object directly itself.

\n", + "group": "strarray", + "examples": { + "checkout.c": ["ex/v1.9.1/checkout.html#git_strarray_dispose-26"], + "general.c": ["ex/v1.9.1/general.html#git_strarray_dispose-90"], + "remote.c": [ + "ex/v1.9.1/remote.html#git_strarray_dispose-11", + "ex/v1.9.1/remote.html#git_strarray_dispose-12" + ], + "tag.c": ["ex/v1.9.1/tag.html#git_strarray_dispose-15"] + } + }, + "git_submodule_update_options_init": { + "type": "function", + "file": "git2/submodule.h", + "line": 180, + "lineto": 181, + "args": [ + { + "name": "opts", + "type": "git_submodule_update_options *", + "comment": "The `git_submodule_update_options` struct to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "The struct version; pass `GIT_SUBMODULE_UPDATE_OPTIONS_VERSION`." + } + ], + "argline": "git_submodule_update_options *opts, unsigned int version", + "sig": "git_submodule_update_options *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initialize git_submodule_update_options structure

\n", + "comments": "

Initializes a git_submodule_update_options with default values. Equivalent to creating an instance with GIT_SUBMODULE_UPDATE_OPTIONS_INIT.

\n", + "group": "submodule" + }, + "git_submodule_update": { + "type": "function", + "file": "git2/submodule.h", + "line": 201, + "lineto": 201, + "args": [ + { + "name": "submodule", + "type": "git_submodule *", + "comment": "Submodule object" + }, + { + "name": "init", + "type": "int", + "comment": "If the submodule is not initialized, setting this flag to true\n will initialize the submodule before updating. Otherwise, this will\n return an error if attempting to update an uninitialized repository.\n but setting this to true forces them to be updated." + }, + { + "name": "options", + "type": "git_submodule_update_options *", + "comment": "configuration options for the update. If NULL, the\n function works as though GIT_SUBMODULE_UPDATE_OPTIONS_INIT was passed." + } + ], + "argline": "git_submodule *submodule, int init, git_submodule_update_options *options", + "sig": "git_submodule *::int::git_submodule_update_options *", + "return": { + "type": "int", + "comment": " 0 on success, any non-zero return value from a callback\n function, or a negative value to indicate an error (use\n `git_error_last` for a detailed error message)." + }, + "description": "

Update a submodule. This will clone a missing submodule and\n checkout the subrepository to the commit specified in the index of\n the containing repository. If the submodule repository doesn't contain\n the target commit (e.g. because fetchRecurseSubmodules isn't set), then\n the submodule is fetched using the fetch options supplied in options.

\n", + "comments": "", + "group": "submodule" + }, + "git_submodule_lookup": { + "type": "function", + "file": "git2/submodule.h", + "line": 230, + "lineto": 233, + "args": [ + { + "name": "out", + "type": "git_submodule **", + "comment": "Output ptr to submodule; pass NULL to just get return code" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "The parent repository" + }, + { + "name": "name", + "type": "const char *", + "comment": "The name of or path to the submodule; trailing slashes okay" + } + ], + "argline": "git_submodule **out, git_repository *repo, const char *name", + "sig": "git_submodule **::git_repository *::const char *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_ENOTFOUND if submodule does not exist,\n GIT_EEXISTS if a repository is found in working directory only,\n -1 on other errors." + }, + "description": "

Lookup submodule information by name or path.

\n", + "comments": "

Given either the submodule name or path (they are usually the same), this returns a structure describing the submodule.

\n\n

There are two expected error scenarios:

\n\n\n\n

You must call git_submodule_free when done with the submodule.

\n", + "group": "submodule" + }, + "git_submodule_dup": { + "type": "function", + "file": "git2/submodule.h", + "line": 243, + "lineto": 243, + "args": [ + { + "name": "out", + "type": "git_submodule **", + "comment": "Pointer to store the copy of the submodule." + }, + { + "name": "source", + "type": "git_submodule *", + "comment": "Original submodule to copy." + } + ], + "argline": "git_submodule **out, git_submodule *source", + "sig": "git_submodule **::git_submodule *", + "return": { "type": "int", "comment": " 0" }, + "description": "

Create an in-memory copy of a submodule. The copy must be explicitly\n free'd or it will leak.

\n", + "comments": "", + "group": "submodule" + }, + "git_submodule_free": { + "type": "function", + "file": "git2/submodule.h", + "line": 250, + "lineto": 250, + "args": [ + { + "name": "submodule", + "type": "git_submodule *", + "comment": "Submodule object" + } + ], + "argline": "git_submodule *submodule", + "sig": "git_submodule *", + "return": { "type": "void", "comment": null }, + "description": "

Release a submodule

\n", + "comments": "", + "group": "submodule" + }, + "git_submodule_foreach": { + "type": "function", + "file": "git2/submodule.h", + "line": 270, + "lineto": 273, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "The repository" + }, + { + "name": "callback", + "type": "git_submodule_cb", + "comment": "Function to be called with the name of each submodule.\n Return a non-zero value to terminate the iteration." + }, + { + "name": "payload", + "type": "void *", + "comment": "Extra data to pass to callback" + } + ], + "argline": "git_repository *repo, git_submodule_cb callback, void *payload", + "sig": "git_repository *::git_submodule_cb::void *", + "return": { + "type": "int", + "comment": " 0 on success, -1 on error, or non-zero return value of callback" + }, + "description": "

Iterate over all tracked submodules of a repository.

\n", + "comments": "

See the note on git_submodule above. This iterates over the tracked submodules as described therein.

\n\n

If you are concerned about items in the working directory that look like submodules but are not tracked, the diff API will generate a diff record for workdir items that look like submodules but are not tracked, showing them as added in the workdir. Also, the status API will treat the entire subdirectory of a contained git repo as a single GIT_STATUS_WT_NEW item.

\n", + "group": "submodule", + "examples": { + "status.c": ["ex/v1.9.1/status.html#git_submodule_foreach-19"] + } + }, + "git_submodule_add_setup": { + "type": "function", + "file": "git2/submodule.h", + "line": 301, + "lineto": 306, + "args": [ + { + "name": "out", + "type": "git_submodule **", + "comment": "The newly created submodule ready to open for clone" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "The repository in which you want to create the submodule" + }, + { + "name": "url", + "type": "const char *", + "comment": "URL for the submodule's remote" + }, + { + "name": "path", + "type": "const char *", + "comment": "Path at which the submodule should be created" + }, + { + "name": "use_gitlink", + "type": "int", + "comment": "Should workdir contain a gitlink to the repo in\n .git/modules vs. repo directly in workdir." + } + ], + "argline": "git_submodule **out, git_repository *repo, const char *url, const char *path, int use_gitlink", + "sig": "git_submodule **::git_repository *::const char *::const char *::int", + "return": { + "type": "int", + "comment": " 0 on success, GIT_EEXISTS if submodule already exists,\n -1 on other errors." + }, + "description": "

Set up a new git submodule for checkout.

\n", + "comments": "

This does "git submodule add" up to the fetch and checkout of the submodule contents. It preps a new submodule, creates an entry in .gitmodules and creates an empty initialized repository either at the given path in the working directory or in .git/modules with a gitlink from the working directory to the new repo.

\n\n

To fully emulate "git submodule add" call this function, then open the submodule repo and perform the clone step as needed (if you don't need anything custom see git_submodule_add_clone()). Lastly, call git_submodule_add_finalize() to wrap up adding the new submodule and .gitmodules to the index to be ready to commit.

\n\n

You must call git_submodule_free on the submodule object when done.

\n", + "group": "submodule" + }, + "git_submodule_clone": { + "type": "function", + "file": "git2/submodule.h", + "line": 319, + "lineto": 322, + "args": [ + { + "name": "out", + "type": "git_repository **", + "comment": "The newly created repository object. Optional." + }, + { + "name": "submodule", + "type": "git_submodule *", + "comment": "The submodule currently waiting for its clone." + }, + { + "name": "opts", + "type": "const git_submodule_update_options *", + "comment": "The options to use." + } + ], + "argline": "git_repository **out, git_submodule *submodule, const git_submodule_update_options *opts", + "sig": "git_repository **::git_submodule *::const git_submodule_update_options *", + "return": { + "type": "int", + "comment": " 0 on success, -1 on other errors (see git_clone)." + }, + "description": "

Perform the clone step for a newly created submodule.

\n", + "comments": "

This performs the necessary git_clone to setup a newly-created submodule.

\n", + "group": "submodule" + }, + "git_submodule_add_finalize": { + "type": "function", + "file": "git2/submodule.h", + "line": 335, + "lineto": 335, + "args": [ + { + "name": "submodule", + "type": "git_submodule *", + "comment": "The submodule to finish adding." + } + ], + "argline": "git_submodule *submodule", + "sig": "git_submodule *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Resolve the setup of a new git submodule.

\n", + "comments": "

This should be called on a submodule once you have called add setup and done the clone of the submodule. This adds the .gitmodules file and the newly cloned submodule to the index to be ready to be committed (but doesn't actually do the commit).

\n", + "group": "submodule" + }, + "git_submodule_add_to_index": { + "type": "function", + "file": "git2/submodule.h", + "line": 347, + "lineto": 349, + "args": [ + { + "name": "submodule", + "type": "git_submodule *", + "comment": "The submodule to add to the index" + }, + { + "name": "write_index", + "type": "int", + "comment": "Boolean if this should immediately write the index\n file. If you pass this as false, you will have to get the\n git_index and explicitly call `git_index_write()` on it to\n save the change." + } + ], + "argline": "git_submodule *submodule, int write_index", + "sig": "git_submodule *::int", + "return": { + "type": "int", + "comment": " 0 on success, \n<\n0 on failure" + }, + "description": "

Add current submodule HEAD commit to index of superproject.

\n", + "comments": "", + "group": "submodule" + }, + "git_submodule_owner": { + "type": "function", + "file": "git2/submodule.h", + "line": 362, + "lineto": 362, + "args": [ + { + "name": "submodule", + "type": "git_submodule *", + "comment": "Pointer to submodule object" + } + ], + "argline": "git_submodule *submodule", + "sig": "git_submodule *", + "return": { + "type": "git_repository *", + "comment": " Pointer to `git_repository`" + }, + "description": "

Get the containing repository for a submodule.

\n", + "comments": "

This returns a pointer to the repository that contains the submodule. This is a just a reference to the repository that was passed to the original git_submodule_lookup() call, so if that repository has been freed, then this may be a dangling reference.

\n", + "group": "submodule" + }, + "git_submodule_name": { + "type": "function", + "file": "git2/submodule.h", + "line": 370, + "lineto": 370, + "args": [ + { + "name": "submodule", + "type": "git_submodule *", + "comment": "Pointer to submodule object" + } + ], + "argline": "git_submodule *submodule", + "sig": "git_submodule *", + "return": { + "type": "const char *", + "comment": " Pointer to the submodule name" + }, + "description": "

Get the name of submodule.

\n", + "comments": "", + "group": "submodule", + "examples": { + "status.c": ["ex/v1.9.1/status.html#git_submodule_name-20"] + } + }, + "git_submodule_path": { + "type": "function", + "file": "git2/submodule.h", + "line": 381, + "lineto": 381, + "args": [ + { + "name": "submodule", + "type": "git_submodule *", + "comment": "Pointer to submodule object" + } + ], + "argline": "git_submodule *submodule", + "sig": "git_submodule *", + "return": { + "type": "const char *", + "comment": " Pointer to the submodule path" + }, + "description": "

Get the path to the submodule.

\n", + "comments": "

The path is almost always the same as the submodule name, but the two are actually not required to match.

\n", + "group": "submodule", + "examples": { + "status.c": ["ex/v1.9.1/status.html#git_submodule_path-21"] + } + }, + "git_submodule_url": { + "type": "function", + "file": "git2/submodule.h", + "line": 389, + "lineto": 389, + "args": [ + { + "name": "submodule", + "type": "git_submodule *", + "comment": "Pointer to submodule object" + } + ], + "argline": "git_submodule *submodule", + "sig": "git_submodule *", + "return": { + "type": "const char *", + "comment": " Pointer to the submodule url" + }, + "description": "

Get the URL for the submodule.

\n", + "comments": "", + "group": "submodule" + }, + "git_submodule_resolve_url": { + "type": "function", + "file": "git2/submodule.h", + "line": 399, + "lineto": 399, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": "buffer to store the absolute submodule url in" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "Pointer to repository object" + }, + { "name": "url", "type": "const char *", "comment": "Relative url" } + ], + "argline": "git_buf *out, git_repository *repo, const char *url", + "sig": "git_buf *::git_repository *::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Resolve a submodule url relative to the given repository.

\n", + "comments": "", + "group": "submodule" + }, + "git_submodule_branch": { + "type": "function", + "file": "git2/submodule.h", + "line": 407, + "lineto": 407, + "args": [ + { + "name": "submodule", + "type": "git_submodule *", + "comment": "Pointer to submodule object" + } + ], + "argline": "git_submodule *submodule", + "sig": "git_submodule *", + "return": { + "type": "const char *", + "comment": " Pointer to the submodule branch" + }, + "description": "

Get the branch for the submodule.

\n", + "comments": "", + "group": "submodule" + }, + "git_submodule_set_branch": { + "type": "function", + "file": "git2/submodule.h", + "line": 420, + "lineto": 420, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository to affect" + }, + { + "name": "name", + "type": "const char *", + "comment": "the name of the submodule to configure" + }, + { + "name": "branch", + "type": "const char *", + "comment": "Branch that should be used for the submodule" + } + ], + "argline": "git_repository *repo, const char *name, const char *branch", + "sig": "git_repository *::const char *::const char *", + "return": { + "type": "int", + "comment": " 0 on success, \n<\n0 on failure" + }, + "description": "

Set the branch for the submodule in the configuration

\n", + "comments": "

After calling this, you may wish to call git_submodule_sync() to write the changes to the checked out submodule repository.

\n", + "group": "submodule" + }, + "git_submodule_set_url": { + "type": "function", + "file": "git2/submodule.h", + "line": 434, + "lineto": 434, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository to affect" + }, + { + "name": "name", + "type": "const char *", + "comment": "the name of the submodule to configure" + }, + { + "name": "url", + "type": "const char *", + "comment": "URL that should be used for the submodule" + } + ], + "argline": "git_repository *repo, const char *name, const char *url", + "sig": "git_repository *::const char *::const char *", + "return": { + "type": "int", + "comment": " 0 on success, \n<\n0 on failure" + }, + "description": "

Set the URL for the submodule in the configuration

\n", + "comments": "

After calling this, you may wish to call git_submodule_sync() to write the changes to the checked out submodule repository.

\n", + "group": "submodule" + }, + "git_submodule_index_id": { + "type": "function", + "file": "git2/submodule.h", + "line": 442, + "lineto": 442, + "args": [ + { + "name": "submodule", + "type": "git_submodule *", + "comment": "Pointer to submodule object" + } + ], + "argline": "git_submodule *submodule", + "sig": "git_submodule *", + "return": { + "type": "const git_oid *", + "comment": " Pointer to git_oid or NULL if submodule is not in index." + }, + "description": "

Get the OID for the submodule in the index.

\n", + "comments": "", + "group": "submodule" + }, + "git_submodule_head_id": { + "type": "function", + "file": "git2/submodule.h", + "line": 450, + "lineto": 450, + "args": [ + { + "name": "submodule", + "type": "git_submodule *", + "comment": "Pointer to submodule object" + } + ], + "argline": "git_submodule *submodule", + "sig": "git_submodule *", + "return": { + "type": "const git_oid *", + "comment": " Pointer to git_oid or NULL if submodule is not in the HEAD." + }, + "description": "

Get the OID for the submodule in the current HEAD tree.

\n", + "comments": "", + "group": "submodule" + }, + "git_submodule_wd_id": { + "type": "function", + "file": "git2/submodule.h", + "line": 463, + "lineto": 463, + "args": [ + { + "name": "submodule", + "type": "git_submodule *", + "comment": "Pointer to submodule object" + } + ], + "argline": "git_submodule *submodule", + "sig": "git_submodule *", + "return": { + "type": "const git_oid *", + "comment": " Pointer to git_oid or NULL if submodule is not checked out." + }, + "description": "

Get the OID for the submodule in the current working directory.

\n", + "comments": "

This returns the OID that corresponds to looking up 'HEAD' in the checked out submodule. If there are pending changes in the index or anything else, this won't notice that. You should call git_submodule_status() for a more complete picture about the state of the working directory.

\n", + "group": "submodule" + }, + "git_submodule_ignore": { + "type": "function", + "file": "git2/submodule.h", + "line": 488, + "lineto": 489, + "args": [ + { + "name": "submodule", + "type": "git_submodule *", + "comment": "The submodule to check" + } + ], + "argline": "git_submodule *submodule", + "sig": "git_submodule *", + "return": { + "type": "git_submodule_ignore_t", + "comment": " The current git_submodule_ignore_t valyue what will be used for\n this submodule." + }, + "description": "

Get the ignore rule that will be used for the submodule.

\n", + "comments": "

These values control the behavior of git_submodule_status() for this submodule. There are four ignore values:

\n\n\n", + "group": "submodule" + }, + "git_submodule_set_ignore": { + "type": "function", + "file": "git2/submodule.h", + "line": 501, + "lineto": 504, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository to affect" + }, + { + "name": "name", + "type": "const char *", + "comment": "the name of the submdule" + }, + { + "name": "ignore", + "type": "git_submodule_ignore_t", + "comment": "The new value for the ignore rule" + } + ], + "argline": "git_repository *repo, const char *name, git_submodule_ignore_t ignore", + "sig": "git_repository *::const char *::git_submodule_ignore_t", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Set the ignore rule for the submodule in the configuration

\n", + "comments": "

This does not affect any currently-loaded instances.

\n", + "group": "submodule" + }, + "git_submodule_update_strategy": { + "type": "function", + "file": "git2/submodule.h", + "line": 516, + "lineto": 517, + "args": [ + { + "name": "submodule", + "type": "git_submodule *", + "comment": "The submodule to check" + } + ], + "argline": "git_submodule *submodule", + "sig": "git_submodule *", + "return": { + "type": "git_submodule_update_t", + "comment": " The current git_submodule_update_t value that will be used\n for this submodule." + }, + "description": "

Get the update rule that will be used for the submodule.

\n", + "comments": "

This value controls the behavior of the git submodule update command. There are four useful values documented with git_submodule_update_t.

\n", + "group": "submodule" + }, + "git_submodule_set_update": { + "type": "function", + "file": "git2/submodule.h", + "line": 529, + "lineto": 532, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository to affect" + }, + { + "name": "name", + "type": "const char *", + "comment": "the name of the submodule to configure" + }, + { + "name": "update", + "type": "git_submodule_update_t", + "comment": "The new value to use" + } + ], + "argline": "git_repository *repo, const char *name, git_submodule_update_t update", + "sig": "git_repository *::const char *::git_submodule_update_t", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Set the update rule for the submodule in the configuration

\n", + "comments": "

This setting won't affect any existing instances.

\n", + "group": "submodule" + }, + "git_submodule_fetch_recurse_submodules": { + "type": "function", + "file": "git2/submodule.h", + "line": 546, + "lineto": 547, + "args": [ + { + "name": "submodule", + "type": "git_submodule *", + "comment": "the submodule to examine" + } + ], + "argline": "git_submodule *submodule", + "sig": "git_submodule *", + "return": { + "type": "git_submodule_recurse_t", + "comment": " the submodule recursion configuration" + }, + "description": "

Read the fetchRecurseSubmodules rule for a submodule.

\n", + "comments": "

This accesses the submodule..fetchRecurseSubmodules value for the submodule that controls fetching behavior for the submodule.

\n\n

Note that at this time, libgit2 does not honor this setting and the fetch functionality current ignores submodules.

\n", + "group": "submodule" + }, + "git_submodule_set_fetch_recurse_submodules": { + "type": "function", + "file": "git2/submodule.h", + "line": 559, + "lineto": 562, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository to affect" + }, + { + "name": "name", + "type": "const char *", + "comment": "the submodule to configure" + }, + { + "name": "fetch_recurse_submodules", + "type": "git_submodule_recurse_t", + "comment": "the submodule recursion configuration" + } + ], + "argline": "git_repository *repo, const char *name, git_submodule_recurse_t fetch_recurse_submodules", + "sig": "git_repository *::const char *::git_submodule_recurse_t", + "return": { + "type": "int", + "comment": " old value for fetchRecurseSubmodules" + }, + "description": "

Set the fetchRecurseSubmodules rule for a submodule in the configuration

\n", + "comments": "

This setting won't affect any existing instances.

\n", + "group": "submodule" + }, + "git_submodule_init": { + "type": "function", + "file": "git2/submodule.h", + "line": 577, + "lineto": 577, + "args": [ + { + "name": "submodule", + "type": "git_submodule *", + "comment": "The submodule to write into the superproject config" + }, + { + "name": "overwrite", + "type": "int", + "comment": "By default, existing entries will not be overwritten,\n but setting this to true forces them to be updated." + } + ], + "argline": "git_submodule *submodule, int overwrite", + "sig": "git_submodule *::int", + "return": { + "type": "int", + "comment": " 0 on success, \n<\n0 on failure." + }, + "description": "

Copy submodule info into ".git/config" file.

\n", + "comments": "

Just like "git submodule init", this copies information about the submodule into ".git/config". You can use the accessor functions above to alter the in-memory git_submodule object and control what is written to the config, overriding what is in .gitmodules.

\n", + "group": "submodule" + }, + "git_submodule_repo_init": { + "type": "function", + "file": "git2/submodule.h", + "line": 592, + "lineto": 595, + "args": [ + { + "name": "out", + "type": "git_repository **", + "comment": "Output pointer to the created git repository." + }, + { + "name": "sm", + "type": "const git_submodule *", + "comment": "The submodule to create a new subrepository from." + }, + { + "name": "use_gitlink", + "type": "int", + "comment": "Should the workdir contain a gitlink to\n the repo in .git/modules vs. repo directly in workdir." + } + ], + "argline": "git_repository **out, const git_submodule *sm, int use_gitlink", + "sig": "git_repository **::const git_submodule *::int", + "return": { + "type": "int", + "comment": " 0 on success, \n<\n0 on failure." + }, + "description": "

Set up the subrepository for a submodule in preparation for clone.

\n", + "comments": "

This function can be called to init and set up a submodule repository from a submodule in preparation to clone it from its remote.

\n", + "group": "submodule" + }, + "git_submodule_sync": { + "type": "function", + "file": "git2/submodule.h", + "line": 608, + "lineto": 608, + "args": [ + { + "name": "submodule", + "type": "git_submodule *", + "comment": "The submodule to copy." + } + ], + "argline": "git_submodule *submodule", + "sig": "git_submodule *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Copy submodule remote info into submodule repo.

\n", + "comments": "

This copies the information about the submodules URL into the checked out submodule config, acting like "git submodule sync". This is useful if you have altered the URL for the submodule (or it has been altered by a fetch of upstream changes) and you need to update your local repo.

\n", + "group": "submodule" + }, + "git_submodule_open": { + "type": "function", + "file": "git2/submodule.h", + "line": 622, + "lineto": 624, + "args": [ + { + "name": "repo", + "type": "git_repository **", + "comment": "Pointer to the submodule repo which was opened" + }, + { + "name": "submodule", + "type": "git_submodule *", + "comment": "Submodule to be opened" + } + ], + "argline": "git_repository **repo, git_submodule *submodule", + "sig": "git_repository **::git_submodule *", + "return": { + "type": "int", + "comment": " 0 on success, \n<\n0 if submodule repo could not be opened." + }, + "description": "

Open the repository for a submodule.

\n", + "comments": "

This is a newly opened repository object. The caller is responsible for calling git_repository_free() on it when done. Multiple calls to this function will return distinct git_repository objects. This will only work if the submodule is checked out into the working directory.

\n", + "group": "submodule" + }, + "git_submodule_reload": { + "type": "function", + "file": "git2/submodule.h", + "line": 636, + "lineto": 636, + "args": [ + { + "name": "submodule", + "type": "git_submodule *", + "comment": "The submodule to reload" + }, + { + "name": "force", + "type": "int", + "comment": "Force reload even if the data doesn't seem out of date" + } + ], + "argline": "git_submodule *submodule, int force", + "sig": "git_submodule *::int", + "return": { "type": "int", "comment": " 0 on success, \n<\n0 on error" }, + "description": "

Reread submodule info from config, index, and HEAD.

\n", + "comments": "

Call this to reread cached submodule information for this submodule if you have reason to believe that it has changed.

\n", + "group": "submodule" + }, + "git_submodule_status": { + "type": "function", + "file": "git2/submodule.h", + "line": 652, + "lineto": 656, + "args": [ + { + "name": "status", + "type": "unsigned int *", + "comment": "Combination of `GIT_SUBMODULE_STATUS` flags" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository in which to look" + }, + { + "name": "name", + "type": "const char *", + "comment": "name of the submodule" + }, + { + "name": "ignore", + "type": "git_submodule_ignore_t", + "comment": "the ignore rules to follow" + } + ], + "argline": "unsigned int *status, git_repository *repo, const char *name, git_submodule_ignore_t ignore", + "sig": "unsigned int *::git_repository *::const char *::git_submodule_ignore_t", + "return": { "type": "int", "comment": " 0 on success, \n<\n0 on error" }, + "description": "

Get the status for a submodule.

\n", + "comments": "

This looks at a submodule and tries to determine the status. It will return a combination of the GIT_SUBMODULE_STATUS values above. How deeply it examines the working directory to do this will depend on the git_submodule_ignore_t value for the submodule.

\n", + "group": "submodule", + "examples": { + "status.c": ["ex/v1.9.1/status.html#git_submodule_status-22"] + } + }, + "git_submodule_location": { + "type": "function", + "file": "git2/submodule.h", + "line": 672, + "lineto": 674, + "args": [ + { + "name": "location_status", + "type": "unsigned int *", + "comment": "Combination of first four `GIT_SUBMODULE_STATUS` flags" + }, + { + "name": "submodule", + "type": "git_submodule *", + "comment": "Submodule for which to get status" + } + ], + "argline": "unsigned int *location_status, git_submodule *submodule", + "sig": "unsigned int *::git_submodule *", + "return": { "type": "int", "comment": " 0 on success, \n<\n0 on error" }, + "description": "

Get the locations of submodule information.

\n", + "comments": "

This is a bit like a very lightweight version of git_submodule_status. It just returns a made of the first four submodule status values (i.e. the ones like GIT_SUBMODULE_STATUS_IN_HEAD, etc) that tell you where the submodule data comes from (i.e. the HEAD commit, gitmodules file, etc.). This can be useful if you want to know if the submodule is present in the working directory at this point in time, etc.

\n", + "group": "submodule" + }, + "git_tag_lookup": { + "type": "function", + "file": "git2/tag.h", + "line": 33, + "lineto": 34, + "args": [ + { + "name": "out", + "type": "git_tag **", + "comment": "pointer to the looked up tag" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repo to use when locating the tag." + }, + { + "name": "id", + "type": "const git_oid *", + "comment": "identity of the tag to locate." + } + ], + "argline": "git_tag **out, git_repository *repo, const git_oid *id", + "sig": "git_tag **::git_repository *::const git_oid *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Lookup a tag object from the repository.

\n", + "comments": "", + "group": "tag", + "examples": { "general.c": ["ex/v1.9.1/general.html#git_tag_lookup-91"] } + }, + "git_tag_lookup_prefix": { + "type": "function", + "file": "git2/tag.h", + "line": 48, + "lineto": 49, + "args": [ + { + "name": "out", + "type": "git_tag **", + "comment": "pointer to the looked up tag" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repo to use when locating the tag." + }, + { + "name": "id", + "type": "const git_oid *", + "comment": "identity of the tag to locate." + }, + { + "name": "len", + "type": "size_t", + "comment": "the length of the short identifier" + } + ], + "argline": "git_tag **out, git_repository *repo, const git_oid *id, size_t len", + "sig": "git_tag **::git_repository *::const git_oid *::size_t", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Lookup a tag object from the repository,\n given a prefix of its identifier (short id).

\n", + "comments": "", + "group": "tag" + }, + "git_tag_free": { + "type": "function", + "file": "git2/tag.h", + "line": 61, + "lineto": 61, + "args": [ + { "name": "tag", "type": "git_tag *", "comment": "the tag to close" } + ], + "argline": "git_tag *tag", + "sig": "git_tag *", + "return": { "type": "void", "comment": null }, + "description": "

Close an open tag

\n", + "comments": "

You can no longer use the git_tag pointer after this call.

\n\n

IMPORTANT: You MUST call this method when you are through with a tag to release memory. Failure to do so will cause a memory leak.

\n", + "group": "tag", + "examples": { "general.c": ["ex/v1.9.1/general.html#git_tag_free-92"] } + }, + "git_tag_id": { + "type": "function", + "file": "git2/tag.h", + "line": 69, + "lineto": 69, + "args": [ + { + "name": "tag", + "type": "const git_tag *", + "comment": "a previously loaded tag." + } + ], + "argline": "const git_tag *tag", + "sig": "const git_tag *", + "return": { + "type": "const git_oid *", + "comment": " object identity for the tag." + }, + "description": "

Get the id of a tag.

\n", + "comments": "", + "group": "tag" + }, + "git_tag_owner": { + "type": "function", + "file": "git2/tag.h", + "line": 77, + "lineto": 77, + "args": [ + { + "name": "tag", + "type": "const git_tag *", + "comment": "A previously loaded tag." + } + ], + "argline": "const git_tag *tag", + "sig": "const git_tag *", + "return": { + "type": "git_repository *", + "comment": " Repository that contains this tag." + }, + "description": "

Get the repository that contains the tag.

\n", + "comments": "", + "group": "tag" + }, + "git_tag_target": { + "type": "function", + "file": "git2/tag.h", + "line": 89, + "lineto": 89, + "args": [ + { + "name": "target_out", + "type": "git_object **", + "comment": "pointer where to store the target" + }, + { + "name": "tag", + "type": "const git_tag *", + "comment": "a previously loaded tag." + } + ], + "argline": "git_object **target_out, const git_tag *tag", + "sig": "git_object **::const git_tag *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Get the tagged object of a tag

\n", + "comments": "

This method performs a repository lookup for the given object and returns it

\n", + "group": "tag", + "examples": { "general.c": ["ex/v1.9.1/general.html#git_tag_target-93"] } + }, + "git_tag_target_id": { + "type": "function", + "file": "git2/tag.h", + "line": 97, + "lineto": 97, + "args": [ + { + "name": "tag", + "type": "const git_tag *", + "comment": "a previously loaded tag." + } + ], + "argline": "const git_tag *tag", + "sig": "const git_tag *", + "return": { "type": "const git_oid *", "comment": " pointer to the OID" }, + "description": "

Get the OID of the tagged object of a tag

\n", + "comments": "", + "group": "tag", + "examples": { + "cat-file.c": ["ex/v1.9.1/cat-file.html#git_tag_target_id-31"] + } + }, + "git_tag_target_type": { + "type": "function", + "file": "git2/tag.h", + "line": 105, + "lineto": 105, + "args": [ + { + "name": "tag", + "type": "const git_tag *", + "comment": "a previously loaded tag." + } + ], + "argline": "const git_tag *tag", + "sig": "const git_tag *", + "return": { + "type": "git_object_t", + "comment": " type of the tagged object" + }, + "description": "

Get the type of a tag's tagged object

\n", + "comments": "", + "group": "tag", + "examples": { + "cat-file.c": ["ex/v1.9.1/cat-file.html#git_tag_target_type-32"], + "general.c": ["ex/v1.9.1/general.html#git_tag_target_type-94"] + } + }, + "git_tag_name": { + "type": "function", + "file": "git2/tag.h", + "line": 113, + "lineto": 113, + "args": [ + { + "name": "tag", + "type": "const git_tag *", + "comment": "a previously loaded tag." + } + ], + "argline": "const git_tag *tag", + "sig": "const git_tag *", + "return": { "type": "const char *", "comment": " name of the tag" }, + "description": "

Get the name of a tag

\n", + "comments": "", + "group": "tag", + "examples": { + "cat-file.c": ["ex/v1.9.1/cat-file.html#git_tag_name-33"], + "general.c": ["ex/v1.9.1/general.html#git_tag_name-95"], + "tag.c": ["ex/v1.9.1/tag.html#git_tag_name-16"] + } + }, + "git_tag_tagger": { + "type": "function", + "file": "git2/tag.h", + "line": 121, + "lineto": 121, + "args": [ + { + "name": "tag", + "type": "const git_tag *", + "comment": "a previously loaded tag." + } + ], + "argline": "const git_tag *tag", + "sig": "const git_tag *", + "return": { + "type": "const git_signature *", + "comment": " reference to the tag's author or NULL when unspecified" + }, + "description": "

Get the tagger (author) of a tag

\n", + "comments": "", + "group": "tag", + "examples": { + "cat-file.c": ["ex/v1.9.1/cat-file.html#git_tag_tagger-34"] + } + }, + "git_tag_message": { + "type": "function", + "file": "git2/tag.h", + "line": 129, + "lineto": 129, + "args": [ + { + "name": "tag", + "type": "const git_tag *", + "comment": "a previously loaded tag." + } + ], + "argline": "const git_tag *tag", + "sig": "const git_tag *", + "return": { + "type": "const char *", + "comment": " message of the tag or NULL when unspecified" + }, + "description": "

Get the message of a tag

\n", + "comments": "", + "group": "tag", + "examples": { + "cat-file.c": [ + "ex/v1.9.1/cat-file.html#git_tag_message-35", + "ex/v1.9.1/cat-file.html#git_tag_message-36" + ], + "general.c": ["ex/v1.9.1/general.html#git_tag_message-96"], + "tag.c": ["ex/v1.9.1/tag.html#git_tag_message-17"] + } + }, + "git_tag_create": { + "type": "function", + "file": "git2/tag.h", + "line": 171, + "lineto": 178, + "args": [ + { + "name": "oid", + "type": "git_oid *", + "comment": "Pointer where to store the OID of the\n newly created tag. If the tag already exists, this parameter\n will be the oid of the existing tag, and the function will\n return a GIT_EEXISTS error code." + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository where to store the tag" + }, + { + "name": "tag_name", + "type": "const char *", + "comment": "Name for the tag; this name is validated\n for consistency. It should also not conflict with an\n already existing tag name" + }, + { + "name": "target", + "type": "const git_object *", + "comment": "Object to which this tag points. This object\n must belong to the given `repo`." + }, + { + "name": "tagger", + "type": "const git_signature *", + "comment": "Signature of the tagger for this tag, and\n of the tagging time" + }, + { + "name": "message", + "type": "const char *", + "comment": "Full message for this tag" + }, + { + "name": "force", + "type": "int", + "comment": "Overwrite existing references" + } + ], + "argline": "git_oid *oid, git_repository *repo, const char *tag_name, const git_object *target, const git_signature *tagger, const char *message, int force", + "sig": "git_oid *::git_repository *::const char *::const git_object *::const git_signature *::const char *::int", + "return": { + "type": "int", + "comment": " 0 on success, GIT_EINVALIDSPEC or an error code\n\tA tag object is written to the ODB, and a proper reference\n\tis written in the /refs/tags folder, pointing to it" + }, + "description": "

Create a new tag in the repository from an object

\n", + "comments": "

A new reference will also be created pointing to this tag object. If force is true and a reference already exists with the given name, it'll be replaced.

\n\n

The message will not be cleaned up. This can be achieved through git_message_prettify().

\n\n

The tag name will be checked for validity. You must avoid the characters '~', '^', ':', '\\', '?', '[', and '*', and the sequences ".." and "@{" which have special meaning to revparse.

\n", + "group": "tag", + "examples": { "tag.c": ["ex/v1.9.1/tag.html#git_tag_create-18"] } + }, + "git_tag_annotation_create": { + "type": "function", + "file": "git2/tag.h", + "line": 203, + "lineto": 209, + "args": [ + { + "name": "oid", + "type": "git_oid *", + "comment": "Pointer where to store the OID of the\n newly created tag" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository where to store the tag" + }, + { + "name": "tag_name", + "type": "const char *", + "comment": "Name for the tag" + }, + { + "name": "target", + "type": "const git_object *", + "comment": "Object to which this tag points. This object\n must belong to the given `repo`." + }, + { + "name": "tagger", + "type": "const git_signature *", + "comment": "Signature of the tagger for this tag, and\n of the tagging time" + }, + { + "name": "message", + "type": "const char *", + "comment": "Full message for this tag" + } + ], + "argline": "git_oid *oid, git_repository *repo, const char *tag_name, const git_object *target, const git_signature *tagger, const char *message", + "sig": "git_oid *::git_repository *::const char *::const git_object *::const git_signature *::const char *", + "return": { "type": "int", "comment": " 0 on success or an error code" }, + "description": "

Create a new tag in the object database pointing to a git_object

\n", + "comments": "

The message will not be cleaned up. This can be achieved through git_message_prettify().

\n", + "group": "tag" + }, + "git_tag_create_from_buffer": { + "type": "function", + "file": "git2/tag.h", + "line": 220, + "lineto": 224, + "args": [ + { + "name": "oid", + "type": "git_oid *", + "comment": "Pointer where to store the OID of the newly created tag" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository where to store the tag" + }, + { "name": "buffer", "type": "const char *", "comment": "Raw tag data" }, + { "name": "force", "type": "int", "comment": "Overwrite existing tags" } + ], + "argline": "git_oid *oid, git_repository *repo, const char *buffer, int force", + "sig": "git_oid *::git_repository *::const char *::int", + "return": { + "type": "int", + "comment": " 0 on success; error code otherwise" + }, + "description": "

Create a new tag in the repository from a buffer

\n", + "comments": "", + "group": "tag" + }, + "git_tag_create_lightweight": { + "type": "function", + "file": "git2/tag.h", + "line": 256, + "lineto": 261, + "args": [ + { + "name": "oid", + "type": "git_oid *", + "comment": "Pointer where to store the OID of the provided\n target object. If the tag already exists, this parameter\n will be filled with the oid of the existing pointed object\n and the function will return a GIT_EEXISTS error code." + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository where to store the lightweight tag" + }, + { + "name": "tag_name", + "type": "const char *", + "comment": "Name for the tag; this name is validated\n for consistency. It should also not conflict with an\n already existing tag name" + }, + { + "name": "target", + "type": "const git_object *", + "comment": "Object to which this tag points. This object\n must belong to the given `repo`." + }, + { + "name": "force", + "type": "int", + "comment": "Overwrite existing references" + } + ], + "argline": "git_oid *oid, git_repository *repo, const char *tag_name, const git_object *target, int force", + "sig": "git_oid *::git_repository *::const char *::const git_object *::int", + "return": { + "type": "int", + "comment": " 0 on success, GIT_EINVALIDSPEC or an error code\n\tA proper reference is written in the /refs/tags folder,\n pointing to the provided target object" + }, + "description": "

Create a new lightweight tag pointing at a target object

\n", + "comments": "

A new direct reference will be created pointing to this target object. If force is true and a reference already exists with the given name, it'll be replaced.

\n\n

The tag name will be checked for validity. See git_tag_create() for rules about valid names.

\n", + "group": "tag", + "examples": { + "tag.c": ["ex/v1.9.1/tag.html#git_tag_create_lightweight-19"] + } + }, + "git_tag_delete": { + "type": "function", + "file": "git2/tag.h", + "line": 276, + "lineto": 278, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository where lives the tag" + }, + { + "name": "tag_name", + "type": "const char *", + "comment": "Name of the tag to be deleted;\n this name is validated for consistency." + } + ], + "argline": "git_repository *repo, const char *tag_name", + "sig": "git_repository *::const char *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_EINVALIDSPEC or an error code" + }, + "description": "

Delete an existing tag reference.

\n", + "comments": "

The tag name will be checked for validity. See git_tag_create() for rules about valid names.

\n", + "group": "tag", + "examples": { "tag.c": ["ex/v1.9.1/tag.html#git_tag_delete-20"] } + }, + "git_tag_list": { + "type": "function", + "file": "git2/tag.h", + "line": 293, + "lineto": 295, + "args": [ + { + "name": "tag_names", + "type": "git_strarray *", + "comment": "Pointer to a git_strarray structure where\n\t\tthe tag names will be stored" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository where to find the tags" + } + ], + "argline": "git_strarray *tag_names, git_repository *repo", + "sig": "git_strarray *::git_repository *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Fill a list with all the tags in the Repository

\n", + "comments": "

The string array will be filled with the names of the matching tags; these values are owned by the user and should be free'd manually when no longer needed, using git_strarray_free.

\n", + "group": "tag" + }, + "git_tag_list_match": { + "type": "function", + "file": "git2/tag.h", + "line": 315, + "lineto": 318, + "args": [ + { + "name": "tag_names", + "type": "git_strarray *", + "comment": "Pointer to a git_strarray structure where\n\t\tthe tag names will be stored" + }, + { + "name": "pattern", + "type": "const char *", + "comment": "Standard fnmatch pattern" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository where to find the tags" + } + ], + "argline": "git_strarray *tag_names, const char *pattern, git_repository *repo", + "sig": "git_strarray *::const char *::git_repository *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Fill a list with all the tags in the Repository\n which name match a defined pattern

\n", + "comments": "

If an empty pattern is provided, all the tags will be returned.

\n\n

The string array will be filled with the names of the matching tags; these values are owned by the user and should be free'd manually when no longer needed, using git_strarray_free.

\n", + "group": "tag", + "examples": { "tag.c": ["ex/v1.9.1/tag.html#git_tag_list_match-21"] } + }, + "git_tag_foreach": { + "type": "function", + "file": "git2/tag.h", + "line": 340, + "lineto": 343, + "args": [ + { "name": "repo", "type": "git_repository *", "comment": "Repository" }, + { + "name": "callback", + "type": "git_tag_foreach_cb", + "comment": "Callback function" + }, + { + "name": "payload", + "type": "void *", + "comment": "Pointer to callback data (optional)" + } + ], + "argline": "git_repository *repo, git_tag_foreach_cb callback, void *payload", + "sig": "git_repository *::git_tag_foreach_cb::void *", + "return": { "type": "int", "comment": " 0 on success or an error code" }, + "description": "

Call callback `cb' for each tag in the repository

\n", + "comments": "", + "group": "tag" + }, + "git_tag_peel": { + "type": "function", + "file": "git2/tag.h", + "line": 356, + "lineto": 358, + "args": [ + { + "name": "tag_target_out", + "type": "git_object **", + "comment": "Pointer to the peeled git_object" + }, + { + "name": "tag", + "type": "const git_tag *", + "comment": "The tag to be processed" + } + ], + "argline": "git_object **tag_target_out, const git_tag *tag", + "sig": "git_object **::const git_tag *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Recursively peel a tag until a non tag git_object is found

\n", + "comments": "

The retrieved tag_target object is owned by the repository and should be closed with the git_object_free method.

\n", + "group": "tag" + }, + "git_tag_dup": { + "type": "function", + "file": "git2/tag.h", + "line": 368, + "lineto": 368, + "args": [ + { + "name": "out", + "type": "git_tag **", + "comment": "Pointer to store the copy of the tag" + }, + { + "name": "source", + "type": "git_tag *", + "comment": "Original tag to copy" + } + ], + "argline": "git_tag **out, git_tag *source", + "sig": "git_tag **::git_tag *", + "return": { "type": "int", "comment": " 0" }, + "description": "

Create an in-memory copy of a tag. The copy must be explicitly\n free'd or it will leak.

\n", + "comments": "", + "group": "tag" + }, + "git_tag_name_is_valid": { + "type": "function", + "file": "git2/tag.h", + "line": 380, + "lineto": 380, + "args": [ + { + "name": "valid", + "type": "int *", + "comment": "output pointer to set with validity of given tag name" + }, + { + "name": "name", + "type": "const char *", + "comment": "a tag name to test" + } + ], + "argline": "int *valid, const char *name", + "sig": "int *::const char *", + "return": { "type": "int", "comment": " 0 on success or an error code" }, + "description": "

Determine whether a tag name is valid, meaning that (when prefixed\n with refs/tags/) that it is a valid reference name, and that any\n additional tag name restrictions are imposed (eg, it cannot start\n with a -).

\n", + "comments": "", + "group": "tag" + }, + "git_trace_set": { + "type": "function", + "file": "git2/trace.h", + "line": 68, + "lineto": 68, + "args": [ + { + "name": "level", + "type": "git_trace_level_t", + "comment": "Level to set tracing to" + }, + { + "name": "cb", + "type": "git_trace_cb", + "comment": "Function to call with trace data" + } + ], + "argline": "git_trace_level_t level, git_trace_cb cb", + "sig": "git_trace_level_t::git_trace_cb", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Sets the system tracing configuration to the specified level with the\n specified callback. When system events occur at a level equal to, or\n lower than, the given level they will be reported to the given callback.

\n", + "comments": "", + "group": "trace" + }, + "git_transaction_new": { + "type": "function", + "file": "git2/transaction.h", + "line": 32, + "lineto": 32, + "args": [ + { + "name": "out", + "type": "git_transaction **", + "comment": "the resulting transaction" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository in which to lock" + } + ], + "argline": "git_transaction **out, git_repository *repo", + "sig": "git_transaction **::git_repository *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Create a new transaction object

\n", + "comments": "

This does not lock anything, but sets up the transaction object to know from which repository to lock.

\n", + "group": "transaction" + }, + "git_transaction_lock_ref": { + "type": "function", + "file": "git2/transaction.h", + "line": 44, + "lineto": 44, + "args": [ + { + "name": "tx", + "type": "git_transaction *", + "comment": "the transaction" + }, + { + "name": "refname", + "type": "const char *", + "comment": "the reference to lock" + } + ], + "argline": "git_transaction *tx, const char *refname", + "sig": "git_transaction *::const char *", + "return": { "type": "int", "comment": " 0 or an error message" }, + "description": "

Lock a reference

\n", + "comments": "

Lock the specified reference. This is the first step to updating a reference.

\n", + "group": "transaction" + }, + "git_transaction_set_target": { + "type": "function", + "file": "git2/transaction.h", + "line": 59, + "lineto": 59, + "args": [ + { + "name": "tx", + "type": "git_transaction *", + "comment": "the transaction" + }, + { + "name": "refname", + "type": "const char *", + "comment": "reference to update" + }, + { + "name": "target", + "type": "const git_oid *", + "comment": "target to set the reference to" + }, + { + "name": "sig", + "type": "const git_signature *", + "comment": "signature to use in the reflog; pass NULL to read the identity from the config" + }, + { + "name": "msg", + "type": "const char *", + "comment": "message to use in the reflog" + } + ], + "argline": "git_transaction *tx, const char *refname, const git_oid *target, const git_signature *sig, const char *msg", + "sig": "git_transaction *::const char *::const git_oid *::const git_signature *::const char *", + "return": { + "type": "int", + "comment": " 0, GIT_ENOTFOUND if the reference is not among the locked ones, or an error code" + }, + "description": "

Set the target of a reference

\n", + "comments": "

Set the target of the specified reference. This reference must be locked.

\n", + "group": "transaction" + }, + "git_transaction_set_symbolic_target": { + "type": "function", + "file": "git2/transaction.h", + "line": 74, + "lineto": 74, + "args": [ + { + "name": "tx", + "type": "git_transaction *", + "comment": "the transaction" + }, + { + "name": "refname", + "type": "const char *", + "comment": "reference to update" + }, + { + "name": "target", + "type": "const char *", + "comment": "target to set the reference to" + }, + { + "name": "sig", + "type": "const git_signature *", + "comment": "signature to use in the reflog; pass NULL to read the identity from the config" + }, + { + "name": "msg", + "type": "const char *", + "comment": "message to use in the reflog" + } + ], + "argline": "git_transaction *tx, const char *refname, const char *target, const git_signature *sig, const char *msg", + "sig": "git_transaction *::const char *::const char *::const git_signature *::const char *", + "return": { + "type": "int", + "comment": " 0, GIT_ENOTFOUND if the reference is not among the locked ones, or an error code" + }, + "description": "

Set the target of a reference

\n", + "comments": "

Set the target of the specified reference. This reference must be locked.

\n", + "group": "transaction" + }, + "git_transaction_set_reflog": { + "type": "function", + "file": "git2/transaction.h", + "line": 87, + "lineto": 87, + "args": [ + { + "name": "tx", + "type": "git_transaction *", + "comment": "the transaction" + }, + { + "name": "refname", + "type": "const char *", + "comment": "the reference whose reflog to set" + }, + { + "name": "reflog", + "type": "const git_reflog *", + "comment": "the reflog as it should be written out" + } + ], + "argline": "git_transaction *tx, const char *refname, const git_reflog *reflog", + "sig": "git_transaction *::const char *::const git_reflog *", + "return": { + "type": "int", + "comment": " 0, GIT_ENOTFOUND if the reference is not among the locked ones, or an error code" + }, + "description": "

Set the reflog of a reference

\n", + "comments": "

Set the specified reference's reflog. If this is combined with setting the target, that update won't be written to the reflog.

\n", + "group": "transaction" + }, + "git_transaction_remove": { + "type": "function", + "file": "git2/transaction.h", + "line": 96, + "lineto": 96, + "args": [ + { + "name": "tx", + "type": "git_transaction *", + "comment": "the transaction" + }, + { + "name": "refname", + "type": "const char *", + "comment": "the reference to remove" + } + ], + "argline": "git_transaction *tx, const char *refname", + "sig": "git_transaction *::const char *", + "return": { + "type": "int", + "comment": " 0, GIT_ENOTFOUND if the reference is not among the locked ones, or an error code" + }, + "description": "

Remove a reference

\n", + "comments": "", + "group": "transaction" + }, + "git_transaction_commit": { + "type": "function", + "file": "git2/transaction.h", + "line": 107, + "lineto": 107, + "args": [ + { + "name": "tx", + "type": "git_transaction *", + "comment": "the transaction" + } + ], + "argline": "git_transaction *tx", + "sig": "git_transaction *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Commit the changes from the transaction

\n", + "comments": "

Perform the changes that have been queued. The updates will be made one by one, and the first failure will stop the processing.

\n", + "group": "transaction" + }, + "git_transaction_free": { + "type": "function", + "file": "git2/transaction.h", + "line": 117, + "lineto": 117, + "args": [ + { + "name": "tx", + "type": "git_transaction *", + "comment": "the transaction" + } + ], + "argline": "git_transaction *tx", + "sig": "git_transaction *", + "return": { "type": "void", "comment": null }, + "description": "

Free the resources allocated by this transaction

\n", + "comments": "

If any references remain locked, they will be unlocked without any changes made to them.

\n", + "group": "transaction" + }, + "git_tree_lookup": { + "type": "function", + "file": "git2/tree.h", + "line": 32, + "lineto": 33, + "args": [ + { + "name": "out", + "type": "git_tree **", + "comment": "Pointer to the looked up tree" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "The repo to use when locating the tree." + }, + { + "name": "id", + "type": "const git_oid *", + "comment": "Identity of the tree to locate." + } + ], + "argline": "git_tree **out, git_repository *repo, const git_oid *id", + "sig": "git_tree **::git_repository *::const git_oid *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Lookup a tree object from the repository.

\n", + "comments": "", + "group": "tree", + "examples": { + "commit.c": ["ex/v1.9.1/commit.html#git_tree_lookup-13"], + "general.c": [ + "ex/v1.9.1/general.html#git_tree_lookup-97", + "ex/v1.9.1/general.html#git_tree_lookup-98" + ], + "init.c": ["ex/v1.9.1/init.html#git_tree_lookup-13"], + "merge.c": ["ex/v1.9.1/merge.html#git_tree_lookup-37"] + } + }, + "git_tree_lookup_prefix": { + "type": "function", + "file": "git2/tree.h", + "line": 47, + "lineto": 51, + "args": [ + { + "name": "out", + "type": "git_tree **", + "comment": "pointer to the looked up tree" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repo to use when locating the tree." + }, + { + "name": "id", + "type": "const git_oid *", + "comment": "identity of the tree to locate." + }, + { + "name": "len", + "type": "size_t", + "comment": "the length of the short identifier" + } + ], + "argline": "git_tree **out, git_repository *repo, const git_oid *id, size_t len", + "sig": "git_tree **::git_repository *::const git_oid *::size_t", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Lookup a tree object from the repository,\n given a prefix of its identifier (short id).

\n", + "comments": "", + "group": "tree" + }, + "git_tree_free": { + "type": "function", + "file": "git2/tree.h", + "line": 63, + "lineto": 63, + "args": [ + { "name": "tree", "type": "git_tree *", "comment": "The tree to close" } + ], + "argline": "git_tree *tree", + "sig": "git_tree *", + "return": { "type": "void", "comment": null }, + "description": "

Close an open tree

\n", + "comments": "

You can no longer use the git_tree pointer after this call.

\n\n

IMPORTANT: You MUST call this method when you stop using a tree to release memory. Failure to do so will cause a memory leak.

\n", + "group": "tree", + "examples": { + "commit.c": ["ex/v1.9.1/commit.html#git_tree_free-14"], + "diff.c": [ + "ex/v1.9.1/diff.html#git_tree_free-19", + "ex/v1.9.1/diff.html#git_tree_free-20" + ], + "general.c": [ + "ex/v1.9.1/general.html#git_tree_free-99", + "ex/v1.9.1/general.html#git_tree_free-100" + ], + "init.c": ["ex/v1.9.1/init.html#git_tree_free-14"], + "log.c": [ + "ex/v1.9.1/log.html#git_tree_free-55", + "ex/v1.9.1/log.html#git_tree_free-56", + "ex/v1.9.1/log.html#git_tree_free-57", + "ex/v1.9.1/log.html#git_tree_free-58", + "ex/v1.9.1/log.html#git_tree_free-59" + ] + } + }, + "git_tree_id": { + "type": "function", + "file": "git2/tree.h", + "line": 71, + "lineto": 71, + "args": [ + { + "name": "tree", + "type": "const git_tree *", + "comment": "a previously loaded tree." + } + ], + "argline": "const git_tree *tree", + "sig": "const git_tree *", + "return": { + "type": "const git_oid *", + "comment": " object identity for the tree." + }, + "description": "

Get the id of a tree.

\n", + "comments": "", + "group": "tree" + }, + "git_tree_owner": { + "type": "function", + "file": "git2/tree.h", + "line": 79, + "lineto": 79, + "args": [ + { + "name": "tree", + "type": "const git_tree *", + "comment": "A previously loaded tree." + } + ], + "argline": "const git_tree *tree", + "sig": "const git_tree *", + "return": { + "type": "git_repository *", + "comment": " Repository that contains this tree." + }, + "description": "

Get the repository that contains the tree.

\n", + "comments": "", + "group": "tree" + }, + "git_tree_entrycount": { + "type": "function", + "file": "git2/tree.h", + "line": 87, + "lineto": 87, + "args": [ + { + "name": "tree", + "type": "const git_tree *", + "comment": "a previously loaded tree." + } + ], + "argline": "const git_tree *tree", + "sig": "const git_tree *", + "return": { + "type": "size_t", + "comment": " the number of entries in the tree" + }, + "description": "

Get the number of entries listed in a tree

\n", + "comments": "", + "group": "tree", + "examples": { + "cat-file.c": ["ex/v1.9.1/cat-file.html#git_tree_entrycount-37"], + "general.c": ["ex/v1.9.1/general.html#git_tree_entrycount-101"] + } + }, + "git_tree_entry_byname": { + "type": "function", + "file": "git2/tree.h", + "line": 99, + "lineto": 100, + "args": [ + { + "name": "tree", + "type": "const git_tree *", + "comment": "a previously loaded tree." + }, + { + "name": "filename", + "type": "const char *", + "comment": "the filename of the desired entry" + } + ], + "argline": "const git_tree *tree, const char *filename", + "sig": "const git_tree *::const char *", + "return": { + "type": "const git_tree_entry *", + "comment": " the tree entry; NULL if not found" + }, + "description": "

Lookup a tree entry by its filename

\n", + "comments": "

This returns a git_tree_entry that is owned by the git_tree. You don't have to free it, but you must not use it after the git_tree is released.

\n", + "group": "tree", + "examples": { + "general.c": ["ex/v1.9.1/general.html#git_tree_entry_byname-102"] + } + }, + "git_tree_entry_byindex": { + "type": "function", + "file": "git2/tree.h", + "line": 112, + "lineto": 113, + "args": [ + { + "name": "tree", + "type": "const git_tree *", + "comment": "a previously loaded tree." + }, + { + "name": "idx", + "type": "size_t", + "comment": "the position in the entry list" + } + ], + "argline": "const git_tree *tree, size_t idx", + "sig": "const git_tree *::size_t", + "return": { + "type": "const git_tree_entry *", + "comment": " the tree entry; NULL if not found" + }, + "description": "

Lookup a tree entry by its position in the tree

\n", + "comments": "

This returns a git_tree_entry that is owned by the git_tree. You don't have to free it, but you must not use it after the git_tree is released.

\n", + "group": "tree", + "examples": { + "cat-file.c": ["ex/v1.9.1/cat-file.html#git_tree_entry_byindex-38"], + "general.c": ["ex/v1.9.1/general.html#git_tree_entry_byindex-103"] + } + }, + "git_tree_entry_byid": { + "type": "function", + "file": "git2/tree.h", + "line": 127, + "lineto": 128, + "args": [ + { + "name": "tree", + "type": "const git_tree *", + "comment": "a previously loaded tree." + }, + { + "name": "id", + "type": "const git_oid *", + "comment": "the sha being looked for" + } + ], + "argline": "const git_tree *tree, const git_oid *id", + "sig": "const git_tree *::const git_oid *", + "return": { + "type": "const git_tree_entry *", + "comment": " the tree entry; NULL if not found" + }, + "description": "

Lookup a tree entry by SHA value.

\n", + "comments": "

This returns a git_tree_entry that is owned by the git_tree. You don't have to free it, but you must not use it after the git_tree is released.

\n\n

Warning: this must examine every entry in the tree, so it is not fast.

\n", + "group": "tree" + }, + "git_tree_entry_bypath": { + "type": "function", + "file": "git2/tree.h", + "line": 142, + "lineto": 145, + "args": [ + { + "name": "out", + "type": "git_tree_entry **", + "comment": "Pointer where to store the tree entry" + }, + { + "name": "root", + "type": "const git_tree *", + "comment": "Previously loaded tree which is the root of the relative path" + }, + { + "name": "path", + "type": "const char *", + "comment": "Path to the contained entry" + } + ], + "argline": "git_tree_entry **out, const git_tree *root, const char *path", + "sig": "git_tree_entry **::const git_tree *::const char *", + "return": { + "type": "int", + "comment": " 0 on success; GIT_ENOTFOUND if the path does not exist" + }, + "description": "

Retrieve a tree entry contained in a tree or in any of its subtrees,\n given its relative path.

\n", + "comments": "

Unlike the other lookup functions, the returned tree entry is owned by the user and must be freed explicitly with git_tree_entry_free().

\n", + "group": "tree" + }, + "git_tree_entry_dup": { + "type": "function", + "file": "git2/tree.h", + "line": 157, + "lineto": 157, + "args": [ + { + "name": "dest", + "type": "git_tree_entry **", + "comment": "pointer where to store the copy" + }, + { + "name": "source", + "type": "const git_tree_entry *", + "comment": "tree entry to duplicate" + } + ], + "argline": "git_tree_entry **dest, const git_tree_entry *source", + "sig": "git_tree_entry **::const git_tree_entry *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Duplicate a tree entry

\n", + "comments": "

Create a copy of a tree entry. The returned copy is owned by the user, and must be freed explicitly with git_tree_entry_free().

\n", + "group": "tree" + }, + "git_tree_entry_free": { + "type": "function", + "file": "git2/tree.h", + "line": 168, + "lineto": 168, + "args": [ + { + "name": "entry", + "type": "git_tree_entry *", + "comment": "The entry to free" + } + ], + "argline": "git_tree_entry *entry", + "sig": "git_tree_entry *", + "return": { "type": "void", "comment": null }, + "description": "

Free a user-owned tree entry

\n", + "comments": "

IMPORTANT: This function is only needed for tree entries owned by the user, such as the ones returned by git_tree_entry_dup() or git_tree_entry_bypath().

\n", + "group": "tree" + }, + "git_tree_entry_name": { + "type": "function", + "file": "git2/tree.h", + "line": 176, + "lineto": 176, + "args": [ + { + "name": "entry", + "type": "const git_tree_entry *", + "comment": "a tree entry" + } + ], + "argline": "const git_tree_entry *entry", + "sig": "const git_tree_entry *", + "return": { "type": "const char *", "comment": " the name of the file" }, + "description": "

Get the filename of a tree entry

\n", + "comments": "", + "group": "tree", + "examples": { + "cat-file.c": ["ex/v1.9.1/cat-file.html#git_tree_entry_name-39"], + "general.c": [ + "ex/v1.9.1/general.html#git_tree_entry_name-104", + "ex/v1.9.1/general.html#git_tree_entry_name-105" + ] + } + }, + "git_tree_entry_id": { + "type": "function", + "file": "git2/tree.h", + "line": 184, + "lineto": 184, + "args": [ + { + "name": "entry", + "type": "const git_tree_entry *", + "comment": "a tree entry" + } + ], + "argline": "const git_tree_entry *entry", + "sig": "const git_tree_entry *", + "return": { + "type": "const git_oid *", + "comment": " the oid of the object" + }, + "description": "

Get the id of the object pointed by the entry

\n", + "comments": "", + "group": "tree", + "examples": { + "cat-file.c": ["ex/v1.9.1/cat-file.html#git_tree_entry_id-40"] + } + }, + "git_tree_entry_type": { + "type": "function", + "file": "git2/tree.h", + "line": 192, + "lineto": 192, + "args": [ + { + "name": "entry", + "type": "const git_tree_entry *", + "comment": "a tree entry" + } + ], + "argline": "const git_tree_entry *entry", + "sig": "const git_tree_entry *", + "return": { + "type": "git_object_t", + "comment": " the type of the pointed object" + }, + "description": "

Get the type of the object pointed by the entry

\n", + "comments": "", + "group": "tree", + "examples": { + "cat-file.c": ["ex/v1.9.1/cat-file.html#git_tree_entry_type-41"] + } + }, + "git_tree_entry_filemode": { + "type": "function", + "file": "git2/tree.h", + "line": 200, + "lineto": 200, + "args": [ + { + "name": "entry", + "type": "const git_tree_entry *", + "comment": "a tree entry" + } + ], + "argline": "const git_tree_entry *entry", + "sig": "const git_tree_entry *", + "return": { + "type": "git_filemode_t", + "comment": " filemode as an integer" + }, + "description": "

Get the UNIX file attributes of a tree entry

\n", + "comments": "", + "group": "tree", + "examples": { + "cat-file.c": ["ex/v1.9.1/cat-file.html#git_tree_entry_filemode-42"] + } + }, + "git_tree_entry_filemode_raw": { + "type": "function", + "file": "git2/tree.h", + "line": 212, + "lineto": 212, + "args": [ + { + "name": "entry", + "type": "const git_tree_entry *", + "comment": "a tree entry" + } + ], + "argline": "const git_tree_entry *entry", + "sig": "const git_tree_entry *", + "return": { + "type": "git_filemode_t", + "comment": " filemode as an integer" + }, + "description": "

Get the raw UNIX file attributes of a tree entry

\n", + "comments": "

This function does not perform any normalization and is only useful if you need to be able to recreate the original tree object.

\n", + "group": "tree" + }, + "git_tree_entry_cmp": { + "type": "function", + "file": "git2/tree.h", + "line": 220, + "lineto": 220, + "args": [ + { + "name": "e1", + "type": "const git_tree_entry *", + "comment": "first tree entry" + }, + { + "name": "e2", + "type": "const git_tree_entry *", + "comment": "second tree entry" + } + ], + "argline": "const git_tree_entry *e1, const git_tree_entry *e2", + "sig": "const git_tree_entry *::const git_tree_entry *", + "return": { + "type": "int", + "comment": " \n<\n0 if e1 is before e2, 0 if e1 == e2, >0 if e1 is after e2" + }, + "description": "

Compare two tree entries

\n", + "comments": "", + "group": "tree" + }, + "git_tree_entry_to_object": { + "type": "function", + "file": "git2/tree.h", + "line": 232, + "lineto": 235, + "args": [ + { + "name": "object_out", + "type": "git_object **", + "comment": "pointer to the converted object" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "repository where to lookup the pointed object" + }, + { + "name": "entry", + "type": "const git_tree_entry *", + "comment": "a tree entry" + } + ], + "argline": "git_object **object_out, git_repository *repo, const git_tree_entry *entry", + "sig": "git_object **::git_repository *::const git_tree_entry *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Convert a tree entry to the git_object it points to.

\n", + "comments": "

You must call git_object_free() on the object when you are done with it.

\n", + "group": "tree", + "examples": { + "general.c": ["ex/v1.9.1/general.html#git_tree_entry_to_object-106"] + } + }, + "git_treebuilder_new": { + "type": "function", + "file": "git2/tree.h", + "line": 254, + "lineto": 255, + "args": [ + { + "name": "out", + "type": "git_treebuilder **", + "comment": "Pointer where to store the tree builder" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository in which to store the object" + }, + { + "name": "source", + "type": "const git_tree *", + "comment": "Source tree to initialize the builder (optional)" + } + ], + "argline": "git_treebuilder **out, git_repository *repo, const git_tree *source", + "sig": "git_treebuilder **::git_repository *::const git_tree *", + "return": { + "type": "int", + "comment": " 0 on success; error code otherwise" + }, + "description": "

Create a new tree builder.

\n", + "comments": "

The tree builder can be used to create or modify trees in memory and write them as tree objects to the database.

\n\n

If the source parameter is not NULL, the tree builder will be initialized with the entries of the given tree.

\n\n

If the source parameter is NULL, the tree builder will start with no entries and will have to be filled manually.

\n", + "group": "treebuilder" + }, + "git_treebuilder_clear": { + "type": "function", + "file": "git2/tree.h", + "line": 263, + "lineto": 263, + "args": [ + { + "name": "bld", + "type": "git_treebuilder *", + "comment": "Builder to clear" + } + ], + "argline": "git_treebuilder *bld", + "sig": "git_treebuilder *", + "return": { + "type": "int", + "comment": " 0 on success; error code otherwise" + }, + "description": "

Clear all the entries in the builder

\n", + "comments": "", + "group": "treebuilder" + }, + "git_treebuilder_entrycount": { + "type": "function", + "file": "git2/tree.h", + "line": 271, + "lineto": 271, + "args": [ + { + "name": "bld", + "type": "git_treebuilder *", + "comment": "a previously loaded treebuilder." + } + ], + "argline": "git_treebuilder *bld", + "sig": "git_treebuilder *", + "return": { + "type": "size_t", + "comment": " the number of entries in the treebuilder" + }, + "description": "

Get the number of entries listed in a treebuilder

\n", + "comments": "", + "group": "treebuilder" + }, + "git_treebuilder_free": { + "type": "function", + "file": "git2/tree.h", + "line": 282, + "lineto": 282, + "args": [ + { + "name": "bld", + "type": "git_treebuilder *", + "comment": "Builder to free" + } + ], + "argline": "git_treebuilder *bld", + "sig": "git_treebuilder *", + "return": { "type": "void", "comment": null }, + "description": "

Free a tree builder

\n", + "comments": "

This will clear all the entries and free to builder. Failing to free the builder after you're done using it will result in a memory leak

\n", + "group": "treebuilder" + }, + "git_treebuilder_get": { + "type": "function", + "file": "git2/tree.h", + "line": 294, + "lineto": 295, + "args": [ + { + "name": "bld", + "type": "git_treebuilder *", + "comment": "Tree builder" + }, + { + "name": "filename", + "type": "const char *", + "comment": "Name of the entry" + } + ], + "argline": "git_treebuilder *bld, const char *filename", + "sig": "git_treebuilder *::const char *", + "return": { + "type": "const git_tree_entry *", + "comment": " pointer to the entry; NULL if not found" + }, + "description": "

Get an entry from the builder from its filename

\n", + "comments": "

The returned entry is owned by the builder and should not be freed manually.

\n", + "group": "treebuilder" + }, + "git_treebuilder_insert": { + "type": "function", + "file": "git2/tree.h", + "line": 325, + "lineto": 330, + "args": [ + { + "name": "out", + "type": "const git_tree_entry **", + "comment": "Pointer to store the entry (optional)" + }, + { + "name": "bld", + "type": "git_treebuilder *", + "comment": "Tree builder" + }, + { + "name": "filename", + "type": "const char *", + "comment": "Filename of the entry" + }, + { + "name": "id", + "type": "const git_oid *", + "comment": "SHA1 oid of the entry" + }, + { + "name": "filemode", + "type": "git_filemode_t", + "comment": "Folder attributes of the entry. This parameter must\n\t\t\tbe valued with one of the following entries: 0040000, 0100644,\n\t\t\t0100755, 0120000 or 0160000." + } + ], + "argline": "const git_tree_entry **out, git_treebuilder *bld, const char *filename, const git_oid *id, git_filemode_t filemode", + "sig": "const git_tree_entry **::git_treebuilder *::const char *::const git_oid *::git_filemode_t", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Add or update an entry to the builder

\n", + "comments": "

Insert a new entry for filename in the builder with the given attributes.

\n\n

If an entry named filename already exists, its attributes will be updated with the given ones.

\n\n

The optional pointer out can be used to retrieve a pointer to the newly created/updated entry. Pass NULL if you do not need it. The pointer may not be valid past the next operation in this builder. Duplicate the entry if you want to keep it.

\n\n

By default the entry that you are inserting will be checked for validity; that it exists in the object database and is of the correct type. If you do not want this behavior, set the GIT_OPT_ENABLE_STRICT_OBJECT_CREATION library option to false.

\n", + "group": "treebuilder" + }, + "git_treebuilder_remove": { + "type": "function", + "file": "git2/tree.h", + "line": 339, + "lineto": 340, + "args": [ + { + "name": "bld", + "type": "git_treebuilder *", + "comment": "Tree builder" + }, + { + "name": "filename", + "type": "const char *", + "comment": "Filename of the entry to remove" + } + ], + "argline": "git_treebuilder *bld, const char *filename", + "sig": "git_treebuilder *::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Remove an entry from the builder by its filename

\n", + "comments": "", + "group": "treebuilder" + }, + "git_treebuilder_filter": { + "type": "function", + "file": "git2/tree.h", + "line": 368, + "lineto": 371, + "args": [ + { + "name": "bld", + "type": "git_treebuilder *", + "comment": "Tree builder" + }, + { + "name": "filter", + "type": "git_treebuilder_filter_cb", + "comment": "Callback to filter entries" + }, + { + "name": "payload", + "type": "void *", + "comment": "Extra data to pass to filter callback" + } + ], + "argline": "git_treebuilder *bld, git_treebuilder_filter_cb filter, void *payload", + "sig": "git_treebuilder *::git_treebuilder_filter_cb::void *", + "return": { + "type": "int", + "comment": " 0 on success, non-zero callback return value, or error code" + }, + "description": "

Selectively remove entries in the tree

\n", + "comments": "

The filter callback will be called for each entry in the tree with a pointer to the entry and the provided payload; if the callback returns non-zero, the entry will be filtered (removed from the builder).

\n", + "group": "treebuilder" + }, + "git_treebuilder_write": { + "type": "function", + "file": "git2/tree.h", + "line": 383, + "lineto": 384, + "args": [ + { + "name": "id", + "type": "git_oid *", + "comment": "Pointer to store the OID of the newly written tree" + }, + { + "name": "bld", + "type": "git_treebuilder *", + "comment": "Tree builder to write" + } + ], + "argline": "git_oid *id, git_treebuilder *bld", + "sig": "git_oid *::git_treebuilder *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Write the contents of the tree builder as a tree object

\n", + "comments": "

The tree builder will be written to the given repo, and its identifying SHA1 hash will be stored in the id pointer.

\n", + "group": "treebuilder" + }, + "git_tree_walk": { + "type": "function", + "file": "git2/tree.h", + "line": 420, + "lineto": 424, + "args": [ + { + "name": "tree", + "type": "const git_tree *", + "comment": "The tree to walk" + }, + { + "name": "mode", + "type": "git_treewalk_mode", + "comment": "Traversal mode (pre or post-order)" + }, + { + "name": "callback", + "type": "git_treewalk_cb", + "comment": "Function to call on each tree entry" + }, + { + "name": "payload", + "type": "void *", + "comment": "Opaque pointer to be passed on each callback" + } + ], + "argline": "const git_tree *tree, git_treewalk_mode mode, git_treewalk_cb callback, void *payload", + "sig": "const git_tree *::git_treewalk_mode::git_treewalk_cb::void *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Traverse the entries in a tree and its subtrees in post or pre order.

\n", + "comments": "

The entries will be traversed in the specified order, children subtrees will be automatically loaded as required, and the callback will be called once per entry with the current (relative) root for the entry and the entry data itself.

\n\n

If the callback returns a positive value, the passed entry will be skipped on the traversal (in pre mode). A negative value stops the walk.

\n", + "group": "tree" + }, + "git_tree_dup": { + "type": "function", + "file": "git2/tree.h", + "line": 434, + "lineto": 434, + "args": [ + { + "name": "out", + "type": "git_tree **", + "comment": "Pointer to store the copy of the tree" + }, + { + "name": "source", + "type": "git_tree *", + "comment": "Original tree to copy" + } + ], + "argline": "git_tree **out, git_tree *source", + "sig": "git_tree **::git_tree *", + "return": { "type": "int", "comment": " 0" }, + "description": "

Create an in-memory copy of a tree. The copy must be explicitly\n free'd or it will leak.

\n", + "comments": "", + "group": "tree" + }, + "git_tree_create_updated": { + "type": "function", + "file": "git2/tree.h", + "line": 481, + "lineto": 481, + "args": [ + { "name": "out", "type": "git_oid *", "comment": "id of the new tree" }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository in which to create the tree, must be the\n same as for `baseline`" + }, + { + "name": "baseline", + "type": "git_tree *", + "comment": "the tree to base these changes on" + }, + { + "name": "nupdates", + "type": "size_t", + "comment": "the number of elements in the update list" + }, + { + "name": "updates", + "type": "const git_tree_update *", + "comment": "the list of updates to perform" + } + ], + "argline": "git_oid *out, git_repository *repo, git_tree *baseline, size_t nupdates, const git_tree_update *updates", + "sig": "git_oid *::git_repository *::git_tree *::size_t::const git_tree_update *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Create a tree based on another one with the specified modifications

\n", + "comments": "

Given the baseline perform the changes described in the list of updates and create a new tree.

\n\n

This function is optimized for common file/directory addition, removal and replacement in trees. It is much more efficient than reading the tree into a git_index and modifying that, but in exchange it is not as flexible.

\n\n

Deleting and adding the same entry is undefined behaviour, changing a tree to a blob or viceversa is not supported.

\n", + "group": "tree" + }, + "git_worktree_list": { + "type": "function", + "file": "git2/worktree.h", + "line": 35, + "lineto": 35, + "args": [ + { + "name": "out", + "type": "git_strarray *", + "comment": "pointer to the array of working tree names" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repo to use when listing working trees" + } + ], + "argline": "git_strarray *out, git_repository *repo", + "sig": "git_strarray *::git_repository *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

List names of linked working trees

\n", + "comments": "

The returned list should be released with git_strarray_free when no longer needed.

\n", + "group": "worktree" + }, + "git_worktree_lookup": { + "type": "function", + "file": "git2/worktree.h", + "line": 45, + "lineto": 45, + "args": [ + { + "name": "out", + "type": "git_worktree **", + "comment": "Output pointer to looked up worktree or `NULL`" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "The repository containing worktrees" + }, + { + "name": "name", + "type": "const char *", + "comment": "Name of the working tree to look up" + } + ], + "argline": "git_worktree **out, git_repository *repo, const char *name", + "sig": "git_worktree **::git_repository *::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Lookup a working tree by its name for a given repository

\n", + "comments": "", + "group": "worktree" + }, + "git_worktree_open_from_repository": { + "type": "function", + "file": "git2/worktree.h", + "line": 58, + "lineto": 58, + "args": [ + { + "name": "out", + "type": "git_worktree **", + "comment": "Out-pointer for the newly allocated worktree" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository to look up worktree for" + } + ], + "argline": "git_worktree **out, git_repository *repo", + "sig": "git_worktree **::git_repository *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Open a worktree of a given repository

\n", + "comments": "

If a repository is not the main tree but a worktree, this function will look up the worktree inside the parent repository and create a new git_worktree structure.

\n", + "group": "worktree" + }, + "git_worktree_free": { + "type": "function", + "file": "git2/worktree.h", + "line": 65, + "lineto": 65, + "args": [ + { + "name": "wt", + "type": "git_worktree *", + "comment": "worktree handle to close. If NULL nothing occurs." + } + ], + "argline": "git_worktree *wt", + "sig": "git_worktree *", + "return": { "type": "void", "comment": null }, + "description": "

Free a previously allocated worktree

\n", + "comments": "", + "group": "worktree" + }, + "git_worktree_validate": { + "type": "function", + "file": "git2/worktree.h", + "line": 77, + "lineto": 77, + "args": [ + { + "name": "wt", + "type": "const git_worktree *", + "comment": "Worktree to check" + } + ], + "argline": "const git_worktree *wt", + "sig": "const git_worktree *", + "return": { + "type": "int", + "comment": " 0 when worktree is valid, error-code otherwise" + }, + "description": "

Check if worktree is valid

\n", + "comments": "

A valid worktree requires both the git data structures inside the linked parent repository and the linked working copy to be present.

\n", + "group": "worktree" + }, + "git_worktree_add_options_init": { + "type": "function", + "file": "git2/worktree.h", + "line": 116, + "lineto": 117, + "args": [ + { + "name": "opts", + "type": "git_worktree_add_options *", + "comment": "The `git_worktree_add_options` struct to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "The struct version; pass `GIT_WORKTREE_ADD_OPTIONS_VERSION`." + } + ], + "argline": "git_worktree_add_options *opts, unsigned int version", + "sig": "git_worktree_add_options *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initialize git_worktree_add_options structure

\n", + "comments": "

Initializes a git_worktree_add_options with default values. Equivalent to creating an instance with GIT_WORKTREE_ADD_OPTIONS_INIT.

\n", + "group": "worktree" + }, + "git_worktree_add": { + "type": "function", + "file": "git2/worktree.h", + "line": 133, + "lineto": 135, + "args": [ + { + "name": "out", + "type": "git_worktree **", + "comment": "Output pointer containing new working tree" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository to create working tree for" + }, + { + "name": "name", + "type": "const char *", + "comment": "Name of the working tree" + }, + { + "name": "path", + "type": "const char *", + "comment": "Path to create working tree at" + }, + { + "name": "opts", + "type": "const git_worktree_add_options *", + "comment": "Options to modify default behavior. May be NULL" + } + ], + "argline": "git_worktree **out, git_repository *repo, const char *name, const char *path, const git_worktree_add_options *opts", + "sig": "git_worktree **::git_repository *::const char *::const char *::const git_worktree_add_options *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Add a new working tree

\n", + "comments": "

Add a new working tree for the repository, that is create the required data structures inside the repository and check out the current HEAD at path

\n", + "group": "worktree" + }, + "git_worktree_lock": { + "type": "function", + "file": "git2/worktree.h", + "line": 147, + "lineto": 147, + "args": [ + { + "name": "wt", + "type": "git_worktree *", + "comment": "Worktree to lock" + }, + { + "name": "reason", + "type": "const char *", + "comment": "Reason why the working tree is being locked" + } + ], + "argline": "git_worktree *wt, const char *reason", + "sig": "git_worktree *::const char *", + "return": { + "type": "int", + "comment": " 0 on success, non-zero otherwise" + }, + "description": "

Lock worktree if not already locked

\n", + "comments": "

Lock a worktree, optionally specifying a reason why the linked working tree is being locked.

\n", + "group": "worktree" + }, + "git_worktree_unlock": { + "type": "function", + "file": "git2/worktree.h", + "line": 156, + "lineto": 156, + "args": [ + { + "name": "wt", + "type": "git_worktree *", + "comment": "Worktree to unlock" + } + ], + "argline": "git_worktree *wt", + "sig": "git_worktree *", + "return": { + "type": "int", + "comment": " 0 on success, 1 if worktree was not locked, error-code\n otherwise" + }, + "description": "

Unlock a locked worktree

\n", + "comments": "", + "group": "worktree" + }, + "git_worktree_is_locked": { + "type": "function", + "file": "git2/worktree.h", + "line": 170, + "lineto": 170, + "args": [ + { + "name": "reason", + "type": "git_buf *", + "comment": "Buffer to store reason in. If NULL no reason is stored." + }, + { + "name": "wt", + "type": "const git_worktree *", + "comment": "Worktree to check" + } + ], + "argline": "git_buf *reason, const git_worktree *wt", + "sig": "git_buf *::const git_worktree *", + "return": { + "type": "int", + "comment": " 0 when the working tree not locked, a value greater\n than zero if it is locked, less than zero if there was an\n error" + }, + "description": "

Check if worktree is locked

\n", + "comments": "

A worktree may be locked if the linked working tree is stored on a portable device which is not available.

\n", + "group": "worktree" + }, + "git_worktree_name": { + "type": "function", + "file": "git2/worktree.h", + "line": 179, + "lineto": 179, + "args": [ + { + "name": "wt", + "type": "const git_worktree *", + "comment": "Worktree to get the name for" + } + ], + "argline": "const git_worktree *wt", + "sig": "const git_worktree *", + "return": { + "type": "const char *", + "comment": " The worktree's name. The pointer returned is valid for the\n lifetime of the git_worktree" + }, + "description": "

Retrieve the name of the worktree

\n", + "comments": "", + "group": "worktree" + }, + "git_worktree_path": { + "type": "function", + "file": "git2/worktree.h", + "line": 188, + "lineto": 188, + "args": [ + { + "name": "wt", + "type": "const git_worktree *", + "comment": "Worktree to get the path for" + } + ], + "argline": "const git_worktree *wt", + "sig": "const git_worktree *", + "return": { + "type": "const char *", + "comment": " The worktree's filesystem path. The pointer returned\n is valid for the lifetime of the git_worktree." + }, + "description": "

Retrieve the filesystem path for the worktree

\n", + "comments": "", + "group": "worktree" + }, + "git_worktree_prune_options_init": { + "type": "function", + "file": "git2/worktree.h", + "line": 233, + "lineto": 235, + "args": [ + { + "name": "opts", + "type": "git_worktree_prune_options *", + "comment": "The `git_worktree_prune_options` struct to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "The struct version; pass `GIT_WORKTREE_PRUNE_OPTIONS_VERSION`." + } + ], + "argline": "git_worktree_prune_options *opts, unsigned int version", + "sig": "git_worktree_prune_options *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initialize git_worktree_prune_options structure

\n", + "comments": "

Initializes a git_worktree_prune_options with default values. Equivalent to creating an instance with GIT_WORKTREE_PRUNE_OPTIONS_INIT.

\n", + "group": "worktree" + }, + "git_worktree_is_prunable": { + "type": "function", + "file": "git2/worktree.h", + "line": 257, + "lineto": 258, + "args": [ + { + "name": "wt", + "type": "git_worktree *", + "comment": "Worktree to check." + }, + { + "name": "opts", + "type": "git_worktree_prune_options *", + "comment": "The prunable options." + } + ], + "argline": "git_worktree *wt, git_worktree_prune_options *opts", + "sig": "git_worktree *::git_worktree_prune_options *", + "return": { + "type": "int", + "comment": " 1 if the worktree is prunable, 0 otherwise, or an error code." + }, + "description": "

Is the worktree prunable with the given options?

\n", + "comments": "

A worktree is not prunable in the following scenarios:

\n\n\n\n

If the worktree is not valid and not locked or if the above flags have been passed in, this function will return a positive value. If the worktree is not prunable, an error message will be set (visible in giterr_last) with details about why.

\n", + "group": "worktree" + }, + "git_worktree_prune": { + "type": "function", + "file": "git2/worktree.h", + "line": 272, + "lineto": 273, + "args": [ + { + "name": "wt", + "type": "git_worktree *", + "comment": "Worktree to prune" + }, + { + "name": "opts", + "type": "git_worktree_prune_options *", + "comment": "Specifies which checks to override. See\n `git_worktree_is_prunable`. May be NULL" + } + ], + "argline": "git_worktree *wt, git_worktree_prune_options *opts", + "sig": "git_worktree *::git_worktree_prune_options *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Prune working tree

\n", + "comments": "

Prune the working tree, that is remove the git data structures on disk. The repository will only be pruned of git_worktree_is_prunable succeeds.

\n", + "group": "worktree" + } + }, + "callbacks": { + "git_apply_delta_cb": { + "type": "callback", + "file": "git2/apply.h", + "line": 41, + "lineto": 43, + "args": [ + { + "name": "delta", + "type": "const git_diff_delta *", + "comment": "The delta to be applied" + }, + { + "name": "payload", + "type": "void *", + "comment": "User-specified payload" + } + ], + "argline": "const git_diff_delta *delta, void *payload", + "sig": "const git_diff_delta *::void *", + "return": { + "type": "int", + "comment": " 0 if the delta is applied, \n<\n 0 if the apply process will be aborted\n\tor > 0 if the delta will not be applied." + }, + "description": "

When applying a patch, callback that will be made per delta (file).

\n", + "comments": "

When the callback: - returns < 0, the apply process will be aborted. - returns > 0, the delta will not be applied, but the apply process continues - returns 0, the delta is applied, and the apply process continues.

\n" + }, + "git_apply_hunk_cb": { + "type": "callback", + "file": "git2/apply.h", + "line": 59, + "lineto": 61, + "args": [ + { + "name": "hunk", + "type": "const git_diff_hunk *", + "comment": "The hunk to be applied" + }, + { + "name": "payload", + "type": "void *", + "comment": "User-specified payload" + } + ], + "argline": "const git_diff_hunk *hunk, void *payload", + "sig": "const git_diff_hunk *::void *", + "return": { + "type": "int", + "comment": " 0 if the hunk is applied, \n<\n 0 if the apply process will be aborted\n\tor > 0 if the hunk will not be applied." + }, + "description": "

When applying a patch, callback that will be made per hunk.

\n", + "comments": "

When the callback: - returns < 0, the apply process will be aborted. - returns > 0, the hunk will not be applied, but the apply process continues - returns 0, the hunk is applied, and the apply process continues.

\n" + }, + "git_attr_foreach_cb": { + "type": "callback", + "file": "git2/attr.h", + "line": 304, + "lineto": 304, + "args": [ + { + "name": "name", + "type": "const char *", + "comment": "The attribute name." + }, + { + "name": "value", + "type": "const char *", + "comment": "The attribute value. May be NULL if the attribute is explicitly\n set to UNSPECIFIED using the '!' sign." + }, + { + "name": "payload", + "type": "void *", + "comment": "A user-specified pointer." + } + ], + "argline": "const char *name, const char *value, void *payload", + "sig": "const char *::const char *::void *", + "return": { + "type": "int", + "comment": " 0 to continue looping, non-zero to stop. This value will be returned\n from git_attr_foreach." + }, + "description": "

The callback used with git_attr_foreach.

\n", + "comments": "

This callback will be invoked only once per attribute name, even if there are multiple rules for a given file. The highest priority rule will be used.

\n" + }, + "git_transport_certificate_check_cb": { + "type": "callback", + "file": "git2/cert.h", + "line": 72, + "lineto": 72, + "args": [ + { + "name": "cert", + "type": "git_cert *", + "comment": "The host certificate" + }, + { + "name": "valid", + "type": "int", + "comment": "Whether the libgit2 checks (OpenSSL or WinHTTP) think\n this certificate is valid" + }, + { + "name": "host", + "type": "const char *", + "comment": "Hostname of the host libgit2 connected to" + }, + { + "name": "payload", + "type": "void *", + "comment": "Payload provided by the caller" + } + ], + "argline": "git_cert *cert, int valid, const char *host, void *payload", + "sig": "git_cert *::int::const char *::void *", + "return": { + "type": "int", + "comment": " 0 to proceed with the connection, \n<\n 0 to fail the connection\n or > 0 to indicate that the callback refused to act and that\n the existing validity determination should be honored" + }, + "description": "

Callback for the user's custom certificate checks.

\n", + "comments": "" + }, + "git_checkout_notify_cb": { + "type": "callback", + "file": "git2/checkout.h", + "line": 275, + "lineto": 281, + "args": [ + { + "name": "why", + "type": "git_checkout_notify_t", + "comment": "the notification reason" + }, + { + "name": "path", + "type": "const char *", + "comment": "the path to the file being checked out" + }, + { + "name": "baseline", + "type": "const git_diff_file *", + "comment": "the baseline's diff file information" + }, + { + "name": "target", + "type": "const git_diff_file *", + "comment": "the checkout target diff file information" + }, + { + "name": "workdir", + "type": "const git_diff_file *", + "comment": "the working directory diff file information" + }, + { + "name": "payload", + "type": "void *", + "comment": "the user-supplied callback payload" + } + ], + "argline": "git_checkout_notify_t why, const char *path, const git_diff_file *baseline, const git_diff_file *target, const git_diff_file *workdir, void *payload", + "sig": "git_checkout_notify_t::const char *::const git_diff_file *::const git_diff_file *::const git_diff_file *::void *", + "return": { "type": "int", "comment": " 0 on success, or an error code" }, + "description": "

Checkout notification callback function.

\n", + "comments": "" + }, + "git_checkout_progress_cb": { + "type": "callback", + "file": "git2/checkout.h", + "line": 291, + "lineto": 295, + "args": [ + { + "name": "path", + "type": "const char *", + "comment": "the path to the file being checked out" + }, + { + "name": "completed_steps", + "type": "size_t", + "comment": "number of checkout steps completed" + }, + { + "name": "total_steps", + "type": "size_t", + "comment": "number of total steps in the checkout process" + }, + { + "name": "payload", + "type": "void *", + "comment": "the user-supplied callback payload" + } + ], + "argline": "const char *path, size_t completed_steps, size_t total_steps, void *payload", + "sig": "const char *::size_t::size_t::void *", + "return": { "type": "void", "comment": null }, + "description": "

Checkout progress notification function.

\n", + "comments": "" + }, + "git_checkout_perfdata_cb": { + "type": "callback", + "file": "git2/checkout.h", + "line": 303, + "lineto": 305, + "args": [ + { + "name": "perfdata", + "type": "const git_checkout_perfdata *", + "comment": "the performance data for the checkout" + }, + { + "name": "payload", + "type": "void *", + "comment": "the user-supplied callback payload" + } + ], + "argline": "const git_checkout_perfdata *perfdata, void *payload", + "sig": "const git_checkout_perfdata *::void *", + "return": { "type": "void", "comment": null }, + "description": "

Checkout performance data reporting function.

\n", + "comments": "" + }, + "git_remote_create_cb": { + "type": "callback", + "file": "git2/clone.h", + "line": 73, + "lineto": 78, + "args": [ + { + "name": "out", + "type": "git_remote **", + "comment": "the resulting remote" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository in which to create the remote" + }, + { + "name": "name", + "type": "const char *", + "comment": "the remote's name" + }, + { + "name": "url", + "type": "const char *", + "comment": "the remote's url" + }, + { "name": "payload", "type": "void *", "comment": "an opaque payload" } + ], + "argline": "git_remote **out, git_repository *repo, const char *name, const char *url, void *payload", + "sig": "git_remote **::git_repository *::const char *::const char *::void *", + "return": { + "type": "int", + "comment": " 0, GIT_EINVALIDSPEC, GIT_EEXISTS or an error code" + }, + "description": "

The signature of a function matching git_remote_create, with an additional\n void* as a callback payload.

\n", + "comments": "

Callers of git_clone may provide a function matching this signature to override the remote creation and customization process during a clone operation.

\n" + }, + "git_repository_create_cb": { + "type": "callback", + "file": "git2/clone.h", + "line": 94, + "lineto": 98, + "args": [ + { + "name": "out", + "type": "git_repository **", + "comment": "the resulting repository" + }, + { + "name": "path", + "type": "const char *", + "comment": "path in which to create the repository" + }, + { + "name": "bare", + "type": "int", + "comment": "whether the repository is bare. This is the value from the clone options" + }, + { + "name": "payload", + "type": "void *", + "comment": "payload specified by the options" + } + ], + "argline": "git_repository **out, const char *path, int bare, void *payload", + "sig": "git_repository **::const char *::int::void *", + "return": { + "type": "int", + "comment": " 0, or a negative value to indicate error" + }, + "description": "

The signature of a function matching git_repository_init, with an\n additional void * as callback payload.

\n", + "comments": "

Callers of git_clone my provide a function matching this signature to override the repository creation and customization process during a clone operation.

\n" + }, + "git_commit_create_cb": { + "type": "callback", + "file": "git2/commit.h", + "line": 643, + "lineto": 652, + "args": [ + { + "name": "out", + "type": "git_oid *", + "comment": "pointer that this callback will populate with the object\n id of the commit that is created" + }, + { + "name": "author", + "type": "const git_signature *", + "comment": "the author name and time of the commit" + }, + { + "name": "committer", + "type": "const git_signature *", + "comment": "the committer name and time of the commit" + }, + { + "name": "message_encoding", + "type": "const char *", + "comment": "the encoding of the given message, or NULL\n to assume UTF8" + }, + { + "name": "message", + "type": "const char *", + "comment": "the commit message" + }, + { + "name": "tree", + "type": "const git_tree *", + "comment": "the tree to be committed" + }, + { + "name": "parent_count", + "type": "size_t", + "comment": "the number of parents for this commit" + }, + { + "name": "parents", + "type": "const git_commit *[]", + "comment": "the commit parents" + }, + { + "name": "payload", + "type": "void *", + "comment": "the payload pointer in the rebase options" + } + ], + "argline": "git_oid *out, const git_signature *author, const git_signature *committer, const char *message_encoding, const char *message, const git_tree *tree, size_t parent_count, const git_commit *[] parents, void *payload", + "sig": "git_oid *::const git_signature *::const git_signature *::const char *::const char *::const git_tree *::size_t::const git_commit *[]::void *", + "return": { + "type": "int", + "comment": " 0 if this callback has created the commit and populated the out\n parameter, GIT_PASSTHROUGH if the callback has not created a\n commit and wants the calling function to create the commit as\n if no callback had been specified, any other value to stop\n and return a failure" + }, + "description": "

Commit creation callback: used when a function is going to create\n commits (for example, in git_rebase_commit) to allow callers to\n override the commit creation behavior. For example, users may\n wish to sign commits by providing this information to\n git_commit_create_buffer, signing that buffer, then calling\n git_commit_create_with_signature. The resultant commit id\n should be set in the out object id parameter.

\n", + "comments": "" + }, + "git_config_foreach_cb": { + "type": "callback", + "file": "git2/config.h", + "line": 140, + "lineto": 140, + "args": [ + { + "name": "entry", + "type": "const git_config_entry *", + "comment": "the entry currently being enumerated" + }, + { + "name": "payload", + "type": "void *", + "comment": "a user-specified pointer" + } + ], + "argline": "const git_config_entry *entry, void *payload", + "sig": "const git_config_entry *::void *", + "return": { + "type": "int", + "comment": " non-zero to terminate the iteration." + }, + "description": "

A config enumeration callback.

\n", + "comments": "" + }, + "git_credential_acquire_cb": { + "type": "callback", + "file": "git2/credential.h", + "line": 134, + "lineto": 139, + "args": [ + { + "name": "out", + "type": "git_credential **", + "comment": "The newly created credential object." + }, + { + "name": "url", + "type": "const char *", + "comment": "The resource for which we are demanding a credential." + }, + { + "name": "username_from_url", + "type": "const char *", + "comment": "The username that was embedded in a \"user\n@\nhost\"\n remote url, or NULL if not included." + }, + { + "name": "allowed_types", + "type": "unsigned int", + "comment": "A bitmask stating which credential types are OK to return." + }, + { + "name": "payload", + "type": "void *", + "comment": "The payload provided when specifying this callback." + } + ], + "argline": "git_credential **out, const char *url, const char *username_from_url, unsigned int allowed_types, void *payload", + "sig": "git_credential **::const char *::const char *::unsigned int::void *", + "return": { + "type": "int", + "comment": " 0 for success, \n<\n 0 to indicate an error, > 0 to indicate\n no credential was acquired" + }, + "description": "

Credential acquisition callback.

\n", + "comments": "

This callback is usually involved any time another system might need authentication. As such, you are expected to provide a valid git_credential object back, depending on allowed_types (a git_credential_t bitmask).

\n\n

Note that most authentication details are your responsibility - this callback will be called until the authentication succeeds, or you report an error. As such, it's easy to get in a loop if you fail to stop providing the same incorrect credentials.

\n" + }, + "git_credential_ssh_interactive_cb": { + "type": "callback", + "file": "git2/credential.h", + "line": 259, + "lineto": 265, + "args": [ + { "name": "name", "type": "const char *", "comment": "the name" }, + { + "name": "name_len", + "type": "int", + "comment": "the length of the name" + }, + { + "name": "instruction", + "type": "const char *", + "comment": "the authentication instruction" + }, + { + "name": "instruction_len", + "type": "int", + "comment": "the length of the instruction" + }, + { + "name": "num_prompts", + "type": "int", + "comment": "the number of prompts" + }, + { + "name": "prompts", + "type": "const LIBSSH2_USERAUTH_KBDINT_PROMPT *", + "comment": "the prompts" + }, + { + "name": "responses", + "type": "LIBSSH2_USERAUTH_KBDINT_RESPONSE *", + "comment": "the responses" + }, + { "name": "abstract", "type": "void **", "comment": "the abstract" } + ], + "argline": "const char *name, int name_len, const char *instruction, int instruction_len, int num_prompts, const LIBSSH2_USERAUTH_KBDINT_PROMPT *prompts, LIBSSH2_USERAUTH_KBDINT_RESPONSE *responses, void **abstract", + "sig": "const char *::int::const char *::int::int::const LIBSSH2_USERAUTH_KBDINT_PROMPT *::LIBSSH2_USERAUTH_KBDINT_RESPONSE *::void **", + "return": { "type": "void", "comment": null }, + "description": "

Callback for interactive SSH credentials.

\n", + "comments": "" + }, + "git_credential_sign_cb": { + "type": "callback", + "file": "git2/credential.h", + "line": 308, + "lineto": 312, + "args": [ + { + "name": "session", + "type": "LIBSSH2_SESSION *", + "comment": "the libssh2 session" + }, + { + "name": "sig", + "type": "unsigned char **", + "comment": "the signature" + }, + { + "name": "sig_len", + "type": "size_t *", + "comment": "the length of the signature" + }, + { + "name": "data", + "type": "const unsigned char *", + "comment": "the data" + }, + { + "name": "data_len", + "type": "size_t", + "comment": "the length of the data" + }, + { "name": "abstract", "type": "void **", "comment": "the abstract" } + ], + "argline": "LIBSSH2_SESSION *session, unsigned char **sig, size_t *sig_len, const unsigned char *data, size_t data_len, void **abstract", + "sig": "LIBSSH2_SESSION *::unsigned char **::size_t *::const unsigned char *::size_t::void **", + "return": { + "type": "int", + "comment": " 0 for success, \n<\n 0 to indicate an error, > 0 to indicate\n no credential was acquired" + }, + "description": "

Callback for credential signing.

\n", + "comments": "" + }, + "git_commit_signing_cb": { + "type": "callback", + "file": "git2/deprecated.h", + "line": 285, + "lineto": 289, + "args": [ + { "name": "signature", "type": "git_buf *", "comment": null }, + { "name": "signature_field", "type": "git_buf *", "comment": null }, + { "name": "commit_content", "type": "const char *", "comment": null }, + { "name": "payload", "type": "void *", "comment": null } + ], + "argline": "git_buf *signature, git_buf *signature_field, const char *commit_content, void *payload", + "sig": "git_buf *::git_buf *::const char *::void *", + "return": { "type": "int", "comment": null }, + "description": "

Provide a commit signature during commit creation.

\n", + "comments": "

Callers should instead define a git_commit_create_cb that generates a commit buffer using git_commit_create_buffer, sign that buffer and call git_commit_create_with_signature.

\n" + }, + "git_headlist_cb": { + "type": "callback", + "file": "git2/deprecated.h", + "line": 967, + "lineto": 967, + "args": [ + { "name": "rhead", "type": "git_remote_head *", "comment": null }, + { "name": "payload", "type": "void *", "comment": null } + ], + "argline": "git_remote_head *rhead, void *payload", + "sig": "git_remote_head *::void *", + "return": { "type": "int", "comment": null }, + "description": "

Callback for listing the remote heads

\n", + "comments": "" + }, + "git_diff_notify_cb": { + "type": "callback", + "file": "git2/diff.h", + "line": 352, + "lineto": 356, + "args": [ + { + "name": "diff_so_far", + "type": "const git_diff *", + "comment": "the diff structure as it currently exists" + }, + { + "name": "delta_to_add", + "type": "const git_diff_delta *", + "comment": "the delta that is to be added" + }, + { + "name": "matched_pathspec", + "type": "const char *", + "comment": "the pathspec" + }, + { + "name": "payload", + "type": "void *", + "comment": "the user-specified callback payload" + } + ], + "argline": "const git_diff *diff_so_far, const git_diff_delta *delta_to_add, const char *matched_pathspec, void *payload", + "sig": "const git_diff *::const git_diff_delta *::const char *::void *", + "return": { + "type": "int", + "comment": " 0 on success, 1 to skip this delta, or an error code" + }, + "description": "

Diff notification callback function.

\n", + "comments": "

The callback will be called for each file, just before the git_diff_delta gets inserted into the diff.

\n\n

When the callback: - returns < 0, the diff process will be aborted. - returns > 0, the delta will not be inserted into the diff, but the diff process continues. - returns 0, the delta is inserted into the diff, and the diff process continues.

\n" + }, + "git_diff_progress_cb": { + "type": "callback", + "file": "git2/diff.h", + "line": 369, + "lineto": 373, + "args": [ + { + "name": "diff_so_far", + "type": "const git_diff *", + "comment": "The diff being generated." + }, + { + "name": "old_path", + "type": "const char *", + "comment": "The path to the old file or NULL." + }, + { + "name": "new_path", + "type": "const char *", + "comment": "The path to the new file or NULL." + }, + { + "name": "payload", + "type": "void *", + "comment": "the user-specified callback payload" + } + ], + "argline": "const git_diff *diff_so_far, const char *old_path, const char *new_path, void *payload", + "sig": "const git_diff *::const char *::const char *::void *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Diff progress callback.

\n", + "comments": "

Called before each file comparison.

\n" + }, + "git_diff_file_cb": { + "type": "callback", + "file": "git2/diff.h", + "line": 504, + "lineto": 507, + "args": [ + { + "name": "delta", + "type": "const git_diff_delta *", + "comment": "A pointer to the delta data for the file" + }, + { + "name": "progress", + "type": "float", + "comment": "Goes from 0 to 1 over the diff" + }, + { + "name": "payload", + "type": "void *", + "comment": "User-specified pointer from foreach function" + } + ], + "argline": "const git_diff_delta *delta, float progress, void *payload", + "sig": "const git_diff_delta *::float::void *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

When iterating over a diff, callback that will be made per file.

\n", + "comments": "" + }, + "git_diff_binary_cb": { + "type": "callback", + "file": "git2/diff.h", + "line": 576, + "lineto": 579, + "args": [ + { + "name": "delta", + "type": "const git_diff_delta *", + "comment": "the delta" + }, + { + "name": "binary", + "type": "const git_diff_binary *", + "comment": "the binary content" + }, + { + "name": "payload", + "type": "void *", + "comment": "the user-specified callback payload" + } + ], + "argline": "const git_diff_delta *delta, const git_diff_binary *binary, void *payload", + "sig": "const git_diff_delta *::const git_diff_binary *::void *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

When iterating over a diff, callback that will be made for\n binary content within the diff.

\n", + "comments": "" + }, + "git_diff_hunk_cb": { + "type": "callback", + "file": "git2/diff.h", + "line": 607, + "lineto": 610, + "args": [ + { + "name": "delta", + "type": "const git_diff_delta *", + "comment": "the delta" + }, + { + "name": "hunk", + "type": "const git_diff_hunk *", + "comment": "the hunk" + }, + { + "name": "payload", + "type": "void *", + "comment": "the user-specified callback payload" + } + ], + "argline": "const git_diff_delta *delta, const git_diff_hunk *hunk, void *payload", + "sig": "const git_diff_delta *::const git_diff_hunk *::void *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

When iterating over a diff, callback that will be made per hunk.

\n", + "comments": "" + }, + "git_diff_line_cb": { + "type": "callback", + "file": "git2/diff.h", + "line": 674, + "lineto": 678, + "args": [ + { + "name": "delta", + "type": "const git_diff_delta *", + "comment": "the delta that contains the line" + }, + { + "name": "hunk", + "type": "const git_diff_hunk *", + "comment": "the hunk that contains the line" + }, + { + "name": "line", + "type": "const git_diff_line *", + "comment": "the line in the diff" + }, + { + "name": "payload", + "type": "void *", + "comment": "the user-specified callback payload" + } + ], + "argline": "const git_diff_delta *delta, const git_diff_hunk *hunk, const git_diff_line *line, void *payload", + "sig": "const git_diff_delta *::const git_diff_hunk *::const git_diff_line *::void *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

When iterating over a diff, callback that will be made per text diff\n line. In this context, the provided range will be NULL.

\n", + "comments": "

When printing a diff, callback that will be made to output each line of text. This uses some extra GIT_DIFF_LINE_... constants for output of lines of file and hunk headers.

\n" + }, + "git_index_matched_path_cb": { + "type": "callback", + "file": "git2/index.h", + "line": 158, + "lineto": 159, + "args": [ + { "name": "path", "type": "const char *", "comment": "the path" }, + { + "name": "matched_pathspec", + "type": "const char *", + "comment": "the given pathspec" + }, + { + "name": "payload", + "type": "void *", + "comment": "the user-specified payload" + } + ], + "argline": "const char *path, const char *matched_pathspec, void *payload", + "sig": "const char *::const char *::void *", + "return": { + "type": "int", + "comment": " 0 to continue with the index operation, positive number to skip this file for the index operation, negative number on failure" + }, + "description": "

Callback for APIs that add/remove/update files matching pathspec

\n", + "comments": "" + }, + "git_indexer_progress_cb": { + "type": "callback", + "file": "git2/indexer.h", + "line": 68, + "lineto": 68, + "args": [ + { + "name": "stats", + "type": "const git_indexer_progress *", + "comment": "Structure containing information about the state of the transfer" + }, + { + "name": "payload", + "type": "void *", + "comment": "Payload provided by caller" + } + ], + "argline": "const git_indexer_progress *stats, void *payload", + "sig": "const git_indexer_progress *::void *", + "return": { "type": "int", "comment": " 0 on success or an error code" }, + "description": "

Type for progress callbacks during indexing. Return a value less\n than zero to cancel the indexing or download.

\n", + "comments": "" + }, + "git_note_foreach_cb": { + "type": "callback", + "file": "git2/notes.h", + "line": 29, + "lineto": 32, + "args": [ + { + "name": "blob_id", + "type": "const git_oid *", + "comment": "object id of the blob containing the message" + }, + { + "name": "annotated_object_id", + "type": "const git_oid *", + "comment": "the id of the object being annotated" + }, + { + "name": "payload", + "type": "void *", + "comment": "user-specified data to the foreach function" + } + ], + "argline": "const git_oid *blob_id, const git_oid *annotated_object_id, void *payload", + "sig": "const git_oid *::const git_oid *::void *", + "return": { + "type": "int", + "comment": " 0 on success, or a negative number on failure" + }, + "description": "

Callback for git_note_foreach.

\n", + "comments": "" + }, + "git_odb_foreach_cb": { + "type": "callback", + "file": "git2/odb.h", + "line": 43, + "lineto": 43, + "args": [ + { + "name": "id", + "type": "const git_oid *", + "comment": "an id of an object in the object database" + }, + { + "name": "payload", + "type": "void *", + "comment": "the payload from the initial call to git_odb_foreach" + } + ], + "argline": "const git_oid *id, void *payload", + "sig": "const git_oid *::void *", + "return": { "type": "int", "comment": " 0 on success, or an error code" }, + "description": "

Function type for callbacks from git_odb_foreach.

\n", + "comments": "" + }, + "git_packbuilder_foreach_cb": { + "type": "callback", + "file": "git2/pack.h", + "line": 208, + "lineto": 208, + "args": [ + { + "name": "buf", + "type": "void *", + "comment": "A pointer to the object's data" + }, + { + "name": "size", + "type": "size_t", + "comment": "The size of the underlying object" + }, + { + "name": "payload", + "type": "void *", + "comment": "Payload passed to git_packbuilder_foreach" + } + ], + "argline": "void *buf, size_t size, void *payload", + "sig": "void *::size_t::void *", + "return": { + "type": "int", + "comment": " non-zero to terminate the iteration" + }, + "description": "

Callback used to iterate over packed objects

\n", + "comments": "" + }, + "git_packbuilder_progress": { + "type": "callback", + "file": "git2/pack.h", + "line": 245, + "lineto": 249, + "args": [ + { + "name": "stage", + "type": "int", + "comment": "the stage of the packbuilder" + }, + { + "name": "current", + "type": "uint32_t", + "comment": "the current object" + }, + { + "name": "total", + "type": "uint32_t", + "comment": "the total number of objects" + }, + { + "name": "payload", + "type": "void *", + "comment": "the callback payload" + } + ], + "argline": "int stage, uint32_t current, uint32_t total, void *payload", + "sig": "int::uint32_t::uint32_t::void *", + "return": { "type": "int", "comment": " 0 on success or an error code" }, + "description": "

Packbuilder progress notification function.

\n", + "comments": "" + }, + "git_reference_foreach_cb": { + "type": "callback", + "file": "git2/refs.h", + "line": 439, + "lineto": 439, + "args": [ + { + "name": "reference", + "type": "git_reference *", + "comment": "The reference object" + }, + { + "name": "payload", + "type": "void *", + "comment": "Payload passed to git_reference_foreach" + } + ], + "argline": "git_reference *reference, void *payload", + "sig": "git_reference *::void *", + "return": { + "type": "int", + "comment": " non-zero to terminate the iteration" + }, + "description": "

Callback used to iterate over references

\n", + "comments": "" + }, + "git_reference_foreach_name_cb": { + "type": "callback", + "file": "git2/refs.h", + "line": 450, + "lineto": 450, + "args": [ + { + "name": "name", + "type": "const char *", + "comment": "The reference name" + }, + { + "name": "payload", + "type": "void *", + "comment": "Payload passed to git_reference_foreach_name" + } + ], + "argline": "const char *name, void *payload", + "sig": "const char *::void *", + "return": { + "type": "int", + "comment": " non-zero to terminate the iteration" + }, + "description": "

Callback used to iterate over reference names

\n", + "comments": "" + }, + "git_push_transfer_progress_cb": { + "type": "callback", + "file": "git2/remote.h", + "line": 481, + "lineto": 485, + "args": [ + { + "name": "current", + "type": "unsigned int", + "comment": "The number of objects pushed so far" + }, + { + "name": "total", + "type": "unsigned int", + "comment": "The total number of objects to push" + }, + { + "name": "bytes", + "type": "size_t", + "comment": "The number of bytes pushed" + }, + { + "name": "payload", + "type": "void *", + "comment": "The user-specified payload callback" + } + ], + "argline": "unsigned int current, unsigned int total, size_t bytes, void *payload", + "sig": "unsigned int::unsigned int::size_t::void *", + "return": { + "type": "int", + "comment": " 0 or an error code to stop the transfer" + }, + "description": "

Push network progress notification callback.

\n", + "comments": "" + }, + "git_push_negotiation": { + "type": "callback", + "file": "git2/remote.h", + "line": 518, + "lineto": 521, + "args": [ + { + "name": "updates", + "type": "const git_push_update **", + "comment": "an array containing the updates which will be sent\n as commands to the destination." + }, + { + "name": "len", + "type": "size_t", + "comment": "number of elements in `updates`" + }, + { + "name": "payload", + "type": "void *", + "comment": "Payload provided by the caller" + } + ], + "argline": "const git_push_update **updates, size_t len, void *payload", + "sig": "const git_push_update **::size_t::void *", + "return": { + "type": "int", + "comment": " 0 or an error code to stop the push" + }, + "description": "

Callback used to inform of upcoming updates.

\n", + "comments": "" + }, + "git_push_update_reference_cb": { + "type": "callback", + "file": "git2/remote.h", + "line": 535, + "lineto": 535, + "args": [ + { + "name": "refname", + "type": "const char *", + "comment": "refname specifying to the remote ref" + }, + { + "name": "status", + "type": "const char *", + "comment": "status message sent from the remote" + }, + { + "name": "data", + "type": "void *", + "comment": "data provided by the caller" + } + ], + "argline": "const char *refname, const char *status, void *data", + "sig": "const char *::const char *::void *", + "return": { + "type": "int", + "comment": " 0 on success, otherwise an error" + }, + "description": "

Callback used to inform of the update status from the remote.

\n", + "comments": "

Called for each updated reference on push. If status is not NULL, the update was rejected by the remote server and status contains the reason given.

\n" + }, + "git_url_resolve_cb": { + "type": "callback", + "file": "git2/remote.h", + "line": 551, + "lineto": 551, + "args": [ + { + "name": "url_resolved", + "type": "git_buf *", + "comment": "The buffer to write the resolved URL to" + }, + { + "name": "url", + "type": "const char *", + "comment": "The URL to resolve" + }, + { + "name": "direction", + "type": "int", + "comment": "GIT_DIRECTION_FETCH or GIT_DIRECTION_PUSH" + }, + { + "name": "payload", + "type": "void *", + "comment": "Payload provided by the caller" + } + ], + "argline": "git_buf *url_resolved, const char *url, int direction, void *payload", + "sig": "git_buf *::const char *::int::void *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_PASSTHROUGH or an error\n " + }, + "description": "

Callback to resolve URLs before connecting to remote

\n", + "comments": "

If you return GIT_PASSTHROUGH, you don't need to write anything to url_resolved.

\n" + }, + "git_remote_ready_cb": { + "type": "callback", + "file": "git2/remote.h", + "line": 564, + "lineto": 564, + "args": [ + { + "name": "remote", + "type": "git_remote *", + "comment": "The remote to be connected" + }, + { + "name": "direction", + "type": "int", + "comment": "GIT_DIRECTION_FETCH or GIT_DIRECTION_PUSH" + }, + { + "name": "payload", + "type": "void *", + "comment": "Payload provided by the caller" + } + ], + "argline": "git_remote *remote, int direction, void *payload", + "sig": "git_remote *::int::void *", + "return": { "type": "int", "comment": " 0 on success, or an error" }, + "description": "

Callback invoked immediately before we attempt to connect to the\n given url. Callers may change the URL before the connection by\n calling git_remote_set_instance_url in the callback.

\n", + "comments": "" + }, + "git_repository_fetchhead_foreach_cb": { + "type": "callback", + "file": "git2/repository.h", + "line": 746, + "lineto": 750, + "args": [ + { + "name": "ref_name", + "type": "const char *", + "comment": "The reference name" + }, + { + "name": "remote_url", + "type": "const char *", + "comment": "The remote URL" + }, + { + "name": "oid", + "type": "const git_oid *", + "comment": "The reference target OID" + }, + { + "name": "is_merge", + "type": "unsigned int", + "comment": "Was the reference the result of a merge" + }, + { + "name": "payload", + "type": "void *", + "comment": "Payload passed to git_repository_fetchhead_foreach" + } + ], + "argline": "const char *ref_name, const char *remote_url, const git_oid *oid, unsigned int is_merge, void *payload", + "sig": "const char *::const char *::const git_oid *::unsigned int::void *", + "return": { + "type": "int", + "comment": " non-zero to terminate the iteration" + }, + "description": "

Callback used to iterate over each FETCH_HEAD entry

\n", + "comments": "" + }, + "git_repository_mergehead_foreach_cb": { + "type": "callback", + "file": "git2/repository.h", + "line": 777, + "lineto": 778, + "args": [ + { + "name": "oid", + "type": "const git_oid *", + "comment": "The merge OID" + }, + { + "name": "payload", + "type": "void *", + "comment": "Payload passed to git_repository_mergehead_foreach" + } + ], + "argline": "const git_oid *oid, void *payload", + "sig": "const git_oid *::void *", + "return": { + "type": "int", + "comment": " non-zero to terminate the iteration" + }, + "description": "

Callback used to iterate over each MERGE_HEAD entry

\n", + "comments": "" + }, + "git_revwalk_hide_cb": { + "type": "callback", + "file": "git2/revwalk.h", + "line": 283, + "lineto": 285, + "args": [ + { + "name": "commit_id", + "type": "const git_oid *", + "comment": "oid of Commit" + }, + { + "name": "payload", + "type": "void *", + "comment": "User-specified pointer to data to be passed as data payload" + } + ], + "argline": "const git_oid *commit_id, void *payload", + "sig": "const git_oid *::void *", + "return": { + "type": "int", + "comment": " non-zero to hide the commmit and it parent." + }, + "description": "

This is a callback function that user can provide to hide a\n commit and its parents. If the callback function returns non-zero value,\n then this commit and its parents will be hidden.

\n", + "comments": "" + }, + "git_stash_apply_progress_cb": { + "type": "callback", + "file": "git2/stash.h", + "line": 181, + "lineto": 183, + "args": [ + { + "name": "progress", + "type": "git_stash_apply_progress_t", + "comment": "the progress information" + }, + { + "name": "payload", + "type": "void *", + "comment": "the user-specified payload to the apply function" + } + ], + "argline": "git_stash_apply_progress_t progress, void *payload", + "sig": "git_stash_apply_progress_t::void *", + "return": { "type": "int", "comment": " 0 on success, -1 on error" }, + "description": "

Stash application progress notification function.\n Return 0 to continue processing, or a negative value to\n abort the stash application.

\n", + "comments": "" + }, + "git_stash_cb": { + "type": "callback", + "file": "git2/stash.h", + "line": 268, + "lineto": 272, + "args": [ + { + "name": "index", + "type": "size_t", + "comment": "The position within the stash list. 0 points to the\n most recent stashed state." + }, + { + "name": "message", + "type": "const char *", + "comment": "The stash message." + }, + { + "name": "stash_id", + "type": "const git_oid *", + "comment": "The commit oid of the stashed state." + }, + { + "name": "payload", + "type": "void *", + "comment": "Extra parameter to callback function." + } + ], + "argline": "size_t index, const char *message, const git_oid *stash_id, void *payload", + "sig": "size_t::const char *::const git_oid *::void *", + "return": { + "type": "int", + "comment": " 0 to continue iterating or non-zero to stop." + }, + "description": "

This is a callback function you can provide to iterate over all the\n stashed states that will be invoked per entry.

\n", + "comments": "" + }, + "git_status_cb": { + "type": "callback", + "file": "git2/status.h", + "line": 62, + "lineto": 63, + "args": [ + { + "name": "path", + "type": "const char *", + "comment": "is the path to the file" + }, + { + "name": "status_flags", + "type": "unsigned int", + "comment": "the `git_status_t` values for file's status" + }, + { + "name": "payload", + "type": "void *", + "comment": "the user-specified payload to the foreach function" + } + ], + "argline": "const char *path, unsigned int status_flags, void *payload", + "sig": "const char *::unsigned int::void *", + "return": { + "type": "int", + "comment": " 0 on success, or a negative number on failure" + }, + "description": "

Function pointer to receive status on individual files

\n", + "comments": "" + }, + "git_submodule_cb": { + "type": "callback", + "file": "git2/submodule.h", + "line": 125, + "lineto": 126, + "args": [ + { + "name": "sm", + "type": "git_submodule *", + "comment": "git_submodule currently being visited" + }, + { + "name": "name", + "type": "const char *", + "comment": "name of the submodule" + }, + { + "name": "payload", + "type": "void *", + "comment": "value you passed to the foreach function as payload" + } + ], + "argline": "git_submodule *sm, const char *name, void *payload", + "sig": "git_submodule *::const char *::void *", + "return": { "type": "int", "comment": " 0 on success or error code" }, + "description": "

Function pointer to receive each submodule

\n", + "comments": "" + }, + "git_tag_foreach_cb": { + "type": "callback", + "file": "git2/tag.h", + "line": 330, + "lineto": 330, + "args": [ + { "name": "name", "type": "const char *", "comment": "The tag name" }, + { "name": "oid", "type": "git_oid *", "comment": "The tag's OID" }, + { + "name": "payload", + "type": "void *", + "comment": "Payload passed to git_tag_foreach" + } + ], + "argline": "const char *name, git_oid *oid, void *payload", + "sig": "const char *::git_oid *::void *", + "return": { + "type": "int", + "comment": " non-zero to terminate the iteration" + }, + "description": "

Callback used to iterate over tag names

\n", + "comments": "" + }, + "git_trace_cb": { + "type": "callback", + "file": "git2/trace.h", + "line": 55, + "lineto": 57, + "args": [ + { + "name": "level", + "type": "git_trace_level_t", + "comment": "the trace level" + }, + { + "name": "msg", + "type": "const char *", + "comment": "the trace message" + } + ], + "argline": "git_trace_level_t level, const char *msg", + "sig": "git_trace_level_t::const char *", + "return": { "type": "void", "comment": null }, + "description": "

An instance for a tracing function

\n", + "comments": "" + }, + "git_transport_message_cb": { + "type": "callback", + "file": "git2/transport.h", + "line": 35, + "lineto": 35, + "args": [ + { + "name": "str", + "type": "const char *", + "comment": "The message from the transport" + }, + { + "name": "len", + "type": "int", + "comment": "The length of the message" + }, + { + "name": "payload", + "type": "void *", + "comment": "Payload provided by the caller" + } + ], + "argline": "const char *str, int len, void *payload", + "sig": "const char *::int::void *", + "return": { "type": "int", "comment": " 0 on success or an error code" }, + "description": "

Callback for messages received by the transport.

\n", + "comments": "

Return a negative value to cancel the network operation.

\n" + }, + "git_transport_cb": { + "type": "callback", + "file": "git2/transport.h", + "line": 45, + "lineto": 45, + "args": [ + { + "name": "out", + "type": "git_transport **", + "comment": "the transport generate" + }, + { + "name": "owner", + "type": "git_remote *", + "comment": "the owner for the transport" + }, + { + "name": "param", + "type": "void *", + "comment": "the param to the transport creation" + } + ], + "argline": "git_transport **out, git_remote *owner, void *param", + "sig": "git_transport **::git_remote *::void *", + "return": { "type": "int", "comment": " 0 on success or an error code" }, + "description": "

Signature of a function which creates a transport.

\n", + "comments": "" + }, + "git_treebuilder_filter_cb": { + "type": "callback", + "file": "git2/tree.h", + "line": 353, + "lineto": 354, + "args": [ + { + "name": "entry", + "type": "const git_tree_entry *", + "comment": "the tree entry for the callback to examine" + }, + { + "name": "payload", + "type": "void *", + "comment": "the payload from the caller" + } + ], + "argline": "const git_tree_entry *entry, void *payload", + "sig": "const git_tree_entry *::void *", + "return": { + "type": "int", + "comment": " 0 to do nothing, non-zero to remove the entry" + }, + "description": "

Callback for git_treebuilder_filter

\n", + "comments": "

The return value is treated as a boolean, with zero indicating that the entry should be left alone and any non-zero value meaning that the entry should be removed from the treebuilder list (i.e. filtered out).

\n" + }, + "git_treewalk_cb": { + "type": "callback", + "file": "git2/tree.h", + "line": 394, + "lineto": 395, + "args": [ + { + "name": "root", + "type": "const char *", + "comment": "the current (relative) root to the entry" + }, + { + "name": "entry", + "type": "const git_tree_entry *", + "comment": "the tree entry" + }, + { + "name": "payload", + "type": "void *", + "comment": "the caller-provided callback payload" + } + ], + "argline": "const char *root, const git_tree_entry *entry, void *payload", + "sig": "const char *::const git_tree_entry *::void *", + "return": { + "type": "int", + "comment": " a positive value to skip the entry, a negative value to stop the walk" + }, + "description": "

Callback for the tree traversal method.

\n", + "comments": "" + } + }, + "globals": {}, + "types": [ + [ + "git_annotated_commit", + { + "decl": "git_annotated_commit", + "type": "struct", + "value": "git_annotated_commit", + "file": "git2/types.h", + "line": 214, + "lineto": 214, + "tdef": "typedef", + "description": " Annotated commits are commits with additional metadata about how the\n commit was resolved, which can be used for maintaining the user's\n \"intent\" through commands like merge and rebase.", + "comments": "

For example, if a user wants to conceptually "merge HEAD", then the commit portion of an annotated commit will point to the HEAD commit, but the annotation will denote the ref HEAD. This allows git to perform the internal bookkeeping so that the system knows both the content of what is being merged but also how the content was looked up so that it can be recorded in the reflog appropriately.

\n", + "used": { + "returns": [], + "needs": [ + "git_annotated_commit_free", + "git_annotated_commit_from_fetchhead", + "git_annotated_commit_from_ref", + "git_annotated_commit_from_revspec", + "git_annotated_commit_id", + "git_annotated_commit_lookup", + "git_annotated_commit_ref", + "git_branch_create_from_annotated", + "git_merge", + "git_merge_analysis", + "git_merge_analysis_for_ref", + "git_rebase_init", + "git_repository_set_head_detached_from_annotated", + "git_reset_from_annotated" + ] + } + } + ], + [ + "git_apply_flags_t", + { + "decl": ["GIT_APPLY_CHECK"], + "type": "enum", + "file": "git2/apply.h", + "line": 72, + "lineto": 78, + "block": "GIT_APPLY_CHECK", + "tdef": "typedef", + "description": " Flags controlling the behavior of `git_apply`.", + "comments": "

When the callback: - returns < 0, the apply process will be aborted. - returns > 0, the hunk will not be applied, but the apply process continues - returns 0, the hunk is applied, and the apply process continues.

\n", + "fields": [ + { + "type": "int", + "name": "GIT_APPLY_CHECK", + "comments": "

Don't actually make changes, just test that the patch applies.\n This is the equivalent of git apply --check.

\n", + "value": 1 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_apply_location_t", + { + "decl": [ + "GIT_APPLY_LOCATION_WORKDIR", + "GIT_APPLY_LOCATION_INDEX", + "GIT_APPLY_LOCATION_BOTH" + ], + "type": "enum", + "file": "git2/apply.h", + "line": 148, + "lineto": 166, + "block": "GIT_APPLY_LOCATION_WORKDIR\nGIT_APPLY_LOCATION_INDEX\nGIT_APPLY_LOCATION_BOTH", + "tdef": "typedef", + "description": " Possible application locations for git_apply ", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_APPLY_LOCATION_WORKDIR", + "comments": "

Apply the patch to the workdir, leaving the index untouched.\n This is the equivalent of git apply with no location argument.

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_APPLY_LOCATION_INDEX", + "comments": "

Apply the patch to the index, leaving the working directory\n untouched. This is the equivalent of git apply --cached.

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_APPLY_LOCATION_BOTH", + "comments": "

Apply the patch to both the working directory and the index.\n This is the equivalent of git apply --index.

\n", + "value": 2 + } + ], + "used": { "returns": [], "needs": ["git_apply"] } + } + ], + [ + "git_apply_options", + { + "decl": [ + "unsigned int version", + "git_apply_delta_cb delta_cb", + "git_apply_hunk_cb hunk_cb", + "void * payload", + "unsigned int flags" + ], + "type": "struct", + "value": "git_apply_options", + "file": "git2/apply.h", + "line": 95, + "lineto": 109, + "block": "unsigned int version\ngit_apply_delta_cb delta_cb\ngit_apply_hunk_cb hunk_cb\nvoid * payload\nunsigned int flags", + "tdef": "typedef", + "description": " Apply options structure.", + "comments": "

When the callback: - returns < 0, the apply process will be aborted. - returns > 0, the hunk will not be applied, but the apply process continues - returns 0, the hunk is applied, and the apply process continues.

\n\n

Initialize with GIT_APPLY_OPTIONS_INIT. Alternatively, you can use git_apply_options_init.

\n", + "fields": [ + { + "type": "unsigned int", + "name": "version", + "comments": " The version " + }, + { + "type": "git_apply_delta_cb", + "name": "delta_cb", + "comments": " When applying a patch, callback that will be made per delta (file). " + }, + { + "type": "git_apply_hunk_cb", + "name": "hunk_cb", + "comments": " When applying a patch, callback that will be made per hunk. " + }, + { + "type": "void *", + "name": "payload", + "comments": " Payload passed to both `delta_cb` \n&\n `hunk_cb`. " + }, + { + "type": "unsigned int", + "name": "flags", + "comments": " Bitmask of `git_apply_flags_t` " + } + ], + "used": { + "returns": [], + "needs": ["git_apply", "git_apply_options_init", "git_apply_to_tree"] + } + } + ], + [ + "git_attr_options", + { + "decl": [ + "unsigned int version", + "unsigned int flags", + "git_oid * commit_id", + "git_oid attr_commit_id" + ], + "type": "struct", + "value": "git_attr_options", + "file": "git2/attr.h", + "line": 154, + "lineto": 171, + "block": "unsigned int version\nunsigned int flags\ngit_oid * commit_id\ngit_oid attr_commit_id", + "tdef": "typedef", + "description": " An options structure for querying attributes.", + "comments": "", + "fields": [ + { "type": "unsigned int", "name": "version", "comments": "" }, + { + "type": "unsigned int", + "name": "flags", + "comments": " A combination of GIT_ATTR_CHECK flags " + }, + { "type": "git_oid *", "name": "commit_id", "comments": "" }, + { + "type": "git_oid", + "name": "attr_commit_id", + "comments": " The commit to load attributes from, when\n `GIT_ATTR_CHECK_INCLUDE_COMMIT` is specified." + } + ], + "used": { + "returns": [], + "needs": [ + "git_attr_foreach_ext", + "git_attr_get_ext", + "git_attr_get_many_ext" + ] + } + } + ], + [ + "git_attr_value_t", + { + "decl": [ + "GIT_ATTR_VALUE_UNSPECIFIED", + "GIT_ATTR_VALUE_TRUE", + "GIT_ATTR_VALUE_FALSE", + "GIT_ATTR_VALUE_STRING" + ], + "type": "enum", + "file": "git2/attr.h", + "line": 86, + "lineto": 91, + "block": "GIT_ATTR_VALUE_UNSPECIFIED\nGIT_ATTR_VALUE_TRUE\nGIT_ATTR_VALUE_FALSE\nGIT_ATTR_VALUE_STRING", + "tdef": "typedef", + "description": " Possible states for an attribute", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_ATTR_VALUE_UNSPECIFIED", + "comments": "

The attribute has been left unspecified

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_ATTR_VALUE_TRUE", + "comments": "

The attribute has been set

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_ATTR_VALUE_FALSE", + "comments": "

The attribute has been unset

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_ATTR_VALUE_STRING", + "comments": "

This attribute has a value

\n", + "value": 3 + } + ], + "used": { "returns": ["git_attr_value"], "needs": [] } + } + ], + [ + "git_blame", + { + "decl": "git_blame", + "type": "struct", + "value": "git_blame", + "file": "git2/blame.h", + "line": 236, + "lineto": 236, + "tdef": "typedef", + "description": " Opaque structure to hold blame results ", + "comments": "", + "used": { + "returns": [ + "git_blame_get_hunk_byindex", + "git_blame_get_hunk_byline", + "git_blame_hunk_byindex", + "git_blame_hunk_byline", + "git_blame_line_byindex" + ], + "needs": [ + "git_blame_buffer", + "git_blame_free", + "git_blame_get_hunk_byindex", + "git_blame_get_hunk_byline", + "git_blame_get_hunk_count", + "git_blame_hunk_byindex", + "git_blame_hunk_byline", + "git_blame_hunkcount", + "git_blame_init_options", + "git_blame_line_byindex", + "git_blame_linecount", + "git_blame_options_init" + ] + } + } + ], + [ + "git_blame_flag_t", + { + "decl": [ + "GIT_BLAME_NORMAL", + "GIT_BLAME_TRACK_COPIES_SAME_FILE", + "GIT_BLAME_TRACK_COPIES_SAME_COMMIT_MOVES", + "GIT_BLAME_TRACK_COPIES_SAME_COMMIT_COPIES", + "GIT_BLAME_TRACK_COPIES_ANY_COMMIT_COPIES", + "GIT_BLAME_FIRST_PARENT", + "GIT_BLAME_USE_MAILMAP", + "GIT_BLAME_IGNORE_WHITESPACE" + ], + "type": "enum", + "file": "git2/blame.h", + "line": 31, + "lineto": 82, + "block": "GIT_BLAME_NORMAL\nGIT_BLAME_TRACK_COPIES_SAME_FILE\nGIT_BLAME_TRACK_COPIES_SAME_COMMIT_MOVES\nGIT_BLAME_TRACK_COPIES_SAME_COMMIT_COPIES\nGIT_BLAME_TRACK_COPIES_ANY_COMMIT_COPIES\nGIT_BLAME_FIRST_PARENT\nGIT_BLAME_USE_MAILMAP\nGIT_BLAME_IGNORE_WHITESPACE", + "tdef": "typedef", + "description": " Flags for indicating option behavior for git_blame APIs.", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_BLAME_NORMAL", + "comments": "

Normal blame, the default

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_BLAME_TRACK_COPIES_SAME_FILE", + "comments": "

Track lines that have moved within a file (like git blame -M).

\n\n

This is not yet implemented and reserved for future use.

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_BLAME_TRACK_COPIES_SAME_COMMIT_MOVES", + "comments": "

Track lines that have moved across files in the same commit\n (like git blame -C).

\n\n

This is not yet implemented and reserved for future use.

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_BLAME_TRACK_COPIES_SAME_COMMIT_COPIES", + "comments": "

Track lines that have been copied from another file that exists\n in the same commit (like git blame -CC). Implies SAME_FILE.

\n\n

This is not yet implemented and reserved for future use.

\n", + "value": 4 + }, + { + "type": "int", + "name": "GIT_BLAME_TRACK_COPIES_ANY_COMMIT_COPIES", + "comments": "

Track lines that have been copied from another file that exists in\n any commit (like git blame -CCC). Implies SAME_COMMIT_COPIES.

\n\n

This is not yet implemented and reserved for future use.

\n", + "value": 8 + }, + { + "type": "int", + "name": "GIT_BLAME_FIRST_PARENT", + "comments": "

Restrict the search of commits to those reachable following only\n the first parents.

\n", + "value": 16 + }, + { + "type": "int", + "name": "GIT_BLAME_USE_MAILMAP", + "comments": "

Use mailmap file to map author and committer names and email\n addresses to canonical real names and email addresses. The\n mailmap will be read from the working directory, or HEAD in a\n bare repository.

\n", + "value": 32 + }, + { + "type": "int", + "name": "GIT_BLAME_IGNORE_WHITESPACE", + "comments": "

Ignore whitespace differences

\n", + "value": 64 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_blame_line", + { + "decl": ["const char * ptr", "size_t len"], + "type": "struct", + "value": "git_blame_line", + "file": "git2/blame.h", + "line": 230, + "lineto": 233, + "block": "const char * ptr\nsize_t len", + "tdef": "typedef", + "description": " Structure that represents a line in a blamed file.", + "comments": "", + "fields": [ + { "type": "const char *", "name": "ptr", "comments": "" }, + { "type": "size_t", "name": "len", "comments": "" } + ], + "used": { "returns": ["git_blame_line_byindex"], "needs": [] } + } + ], + [ + "git_blame_options", + { + "decl": [ + "unsigned int version", + "unsigned int flags", + "uint16_t min_match_characters", + "git_oid newest_commit", + "git_oid oldest_commit", + "size_t min_line", + "size_t max_line" + ], + "type": "struct", + "value": "git_blame_options", + "file": "git2/blame.h", + "line": 91, + "lineto": 128, + "block": "unsigned int version\nunsigned int flags\nuint16_t min_match_characters\ngit_oid newest_commit\ngit_oid oldest_commit\nsize_t min_line\nsize_t max_line", + "tdef": "typedef", + "description": " Blame options structure", + "comments": "

Initialize with GIT_BLAME_OPTIONS_INIT. Alternatively, you can use git_blame_options_init.

\n", + "fields": [ + { "type": "unsigned int", "name": "version", "comments": "" }, + { + "type": "unsigned int", + "name": "flags", + "comments": " A combination of `git_blame_flag_t` " + }, + { + "type": "uint16_t", + "name": "min_match_characters", + "comments": " The lower bound on the number of alphanumeric characters that\n must be detected as moving/copying within a file for it to\n associate those lines with the parent commit. The default value\n is 20.\n\n This value only takes effect if any of the `GIT_BLAME_TRACK_COPIES_*`\n flags are specified." + }, + { + "type": "git_oid", + "name": "newest_commit", + "comments": " The id of the newest commit to consider. The default is HEAD. " + }, + { + "type": "git_oid", + "name": "oldest_commit", + "comments": " The id of the oldest commit to consider.\n The default is the first commit encountered with a NULL parent." + }, + { + "type": "size_t", + "name": "min_line", + "comments": " The first line in the file to blame.\n The default is 1 (line numbers start with 1)." + }, + { + "type": "size_t", + "name": "max_line", + "comments": " The last line in the file to blame.\n The default is the last line of the file." + } + ], + "used": { + "returns": [], + "needs": ["git_blame_init_options", "git_blame_options_init"] + } + } + ], + [ + "git_blob", + { + "decl": "git_blob", + "type": "struct", + "value": "git_blob", + "file": "git2/types.h", + "line": 138, + "lineto": 138, + "tdef": "typedef", + "description": " In-memory representation of a blob object. ", + "comments": "", + "used": { + "returns": [], + "needs": [ + "git_blob_dup", + "git_blob_filter", + "git_blob_filter_options_init", + "git_blob_filtered_content", + "git_blob_free", + "git_blob_id", + "git_blob_is_binary", + "git_blob_lookup", + "git_blob_lookup_prefix", + "git_blob_owner", + "git_blob_rawcontent", + "git_blob_rawsize", + "git_diff_blob_to_buffer", + "git_diff_blobs", + "git_filter_list_apply_to_blob", + "git_filter_list_load", + "git_filter_list_load_ext", + "git_filter_list_stream_blob", + "git_patch_from_blob_and_buffer", + "git_patch_from_blobs" + ] + } + } + ], + [ + "git_blob_filter_flag_t", + { + "decl": [ + "GIT_BLOB_FILTER_CHECK_FOR_BINARY", + "GIT_BLOB_FILTER_NO_SYSTEM_ATTRIBUTES", + "GIT_BLOB_FILTER_ATTRIBUTES_FROM_HEAD", + "GIT_BLOB_FILTER_ATTRIBUTES_FROM_COMMIT" + ], + "type": "enum", + "file": "git2/blob.h", + "line": 111, + "lineto": 132, + "block": "GIT_BLOB_FILTER_CHECK_FOR_BINARY\nGIT_BLOB_FILTER_NO_SYSTEM_ATTRIBUTES\nGIT_BLOB_FILTER_ATTRIBUTES_FROM_HEAD\nGIT_BLOB_FILTER_ATTRIBUTES_FROM_COMMIT", + "tdef": "typedef", + "description": " Flags to control the functionality of `git_blob_filter`.", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_BLOB_FILTER_CHECK_FOR_BINARY", + "comments": "

When set, filters will not be applied to binary files.

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_BLOB_FILTER_NO_SYSTEM_ATTRIBUTES", + "comments": "

When set, filters will not load configuration from the\n system-wide gitattributes in /etc (or system equivalent).

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_BLOB_FILTER_ATTRIBUTES_FROM_HEAD", + "comments": "

When set, filters will be loaded from a .gitattributes file\n in the HEAD commit.

\n", + "value": 4 + }, + { + "type": "int", + "name": "GIT_BLOB_FILTER_ATTRIBUTES_FROM_COMMIT", + "comments": "

When set, filters will be loaded from a .gitattributes file\n in the specified commit.

\n", + "value": 8 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_blob_filter_options", + { + "decl": [ + "int version", + "uint32_t flags", + "git_oid * commit_id", + "git_oid attr_commit_id" + ], + "type": "struct", + "value": "git_blob_filter_options", + "file": "git2/blob.h", + "line": 144, + "lineto": 176, + "block": "int version\nuint32_t flags\ngit_oid * commit_id\ngit_oid attr_commit_id", + "tdef": "typedef", + "description": " The options used when applying filter options to a file.", + "comments": "

Initialize with GIT_BLOB_FILTER_OPTIONS_INIT. Alternatively, you can use git_blob_filter_options_init.

\n\n

[version] GIT_BLOB_FILTER_OPTIONS_VERSION [init_macro] GIT_BLOB_FILTER_OPTIONS_INIT [init_function] git_blob_filter_options_init

\n", + "fields": [ + { + "type": "int", + "name": "version", + "comments": " Version number of the options structure. " + }, + { + "type": "uint32_t", + "name": "flags", + "comments": " Flags to control the filtering process, see `git_blob_filter_flag_t` above.\n\n \n\n[flags] git_blob_filter_flag_t" + }, + { + "type": "git_oid *", + "name": "commit_id", + "comments": " This value is unused and reserved for API compatibility.\n\n " + }, + { + "type": "git_oid", + "name": "attr_commit_id", + "comments": " The commit to load attributes from, when\n `GIT_BLOB_FILTER_ATTRIBUTES_FROM_COMMIT` is specified." + } + ], + "used": { + "returns": [], + "needs": ["git_blob_filter", "git_blob_filter_options_init"] + } + } + ], + [ + "git_branch_iterator", + { + "decl": "git_branch_iterator", + "type": "struct", + "value": "git_branch_iterator", + "file": "git2/branch.h", + "line": 97, + "lineto": 97, + "tdef": "typedef", + "description": " Iterator type for branches ", + "comments": "", + "used": { + "returns": [], + "needs": [ + "git_branch_iterator_free", + "git_branch_iterator_new", + "git_branch_next" + ] + } + } + ], + [ + "git_branch_t", + { + "decl": ["GIT_BRANCH_LOCAL", "GIT_BRANCH_REMOTE", "GIT_BRANCH_ALL"], + "type": "enum", + "file": "git2/types.h", + "line": 231, + "lineto": 235, + "block": "GIT_BRANCH_LOCAL\nGIT_BRANCH_REMOTE\nGIT_BRANCH_ALL", + "tdef": "typedef", + "description": " Basic type of any Git branch. ", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_BRANCH_LOCAL", + "comments": "", + "value": 1 + }, + { + "type": "int", + "name": "GIT_BRANCH_REMOTE", + "comments": "", + "value": 2 + }, + { + "type": "int", + "name": "GIT_BRANCH_ALL", + "comments": "", + "value": 3 + } + ], + "used": { + "returns": [], + "needs": [ + "git_branch_iterator_new", + "git_branch_lookup", + "git_branch_next" + ] + } + } + ], + [ + "git_buf", + { + "decl": ["char * ptr", "size_t reserved", "size_t size"], + "type": "struct", + "value": "git_buf", + "file": "git2/buffer.h", + "line": 36, + "lineto": 55, + "block": "char * ptr\nsize_t reserved\nsize_t size", + "tdef": "typedef", + "description": " A data buffer for exporting data from libgit2", + "comments": "

Sometimes libgit2 wants to return an allocated data buffer to the caller and have the caller take responsibility for freeing that memory. To make ownership clear in these cases, libgit2 uses git_buf to return this data. Callers should use git_buf_dispose() to release the memory when they are done.

\n\n

A git_buf contains a pointer to a NUL-terminated C string, and the length of the string (not including the NUL terminator).

\n", + "fields": [ + { + "type": "char *", + "name": "ptr", + "comments": " The buffer contents. `ptr` points to the start of the buffer\n being returned. The buffer's length (in bytes) is specified\n by the `size` member of the structure, and contains a NUL\n terminator at position `(size + 1)`." + }, + { + "type": "size_t", + "name": "reserved", + "comments": " This field is reserved and unused." + }, + { + "type": "size_t", + "name": "size", + "comments": " The length (in bytes) of the buffer pointed to by `ptr`,\n not including a NUL terminator." + } + ], + "used": { + "returns": [], + "needs": [ + "git_blob_filter", + "git_blob_filtered_content", + "git_branch_remote_name", + "git_branch_upstream_merge", + "git_branch_upstream_name", + "git_branch_upstream_remote", + "git_buf_contains_nul", + "git_buf_dispose", + "git_buf_free", + "git_buf_grow", + "git_buf_is_binary", + "git_buf_set", + "git_commit_create_buffer", + "git_commit_extract_signature", + "git_commit_header_field", + "git_commit_signing_cb", + "git_config_find_global", + "git_config_find_programdata", + "git_config_find_system", + "git_config_find_xdg", + "git_config_get_path", + "git_config_get_string_buf", + "git_config_parse_path", + "git_describe_format", + "git_diff_commit_as_email", + "git_diff_format_email", + "git_diff_stats_to_buf", + "git_diff_to_buf", + "git_email_create_from_commit", + "git_filter_list_apply_to_blob", + "git_filter_list_apply_to_buffer", + "git_filter_list_apply_to_data", + "git_filter_list_apply_to_file", + "git_filter_list_stream_data", + "git_message_prettify", + "git_object_short_id", + "git_packbuilder_write_buf", + "git_patch_to_buf", + "git_refspec_rtransform", + "git_refspec_transform", + "git_remote_default_branch", + "git_repository_discover", + "git_repository_item_path", + "git_repository_message", + "git_submodule_resolve_url", + "git_treebuilder_write_with_buffer", + "git_url_resolve_cb", + "git_worktree_is_locked" + ] + } + } + ], + [ + "git_cert", + { + "decl": "git_cert", + "type": "struct", + "value": "git_cert", + "file": "git2/types.h", + "line": 278, + "lineto": 278, + "block": "git_cert_t cert_type", + "tdef": "typedef", + "description": " Parent type for `git_cert_hostkey` and `git_cert_x509`.", + "comments": "", + "fields": [ + { + "type": "git_cert_t", + "name": "cert_type", + "comments": " Type of certificate. A `GIT_CERT_` value." + } + ], + "used": { + "returns": [], + "needs": ["git_transport_certificate_check_cb"] + } + } + ], + [ + "git_cert_hostkey", + { + "decl": [ + "git_cert parent", + "git_cert_ssh_t type", + "unsigned char [16] hash_md5", + "unsigned char [20] hash_sha1", + "unsigned char [32] hash_sha256", + "git_cert_ssh_raw_type_t raw_type", + "const char * hostkey", + "size_t hostkey_len" + ], + "type": "struct", + "value": "git_cert_hostkey", + "file": "git2/cert.h", + "line": 108, + "lineto": 151, + "block": "git_cert parent\ngit_cert_ssh_t type\nunsigned char [16] hash_md5\nunsigned char [20] hash_sha1\nunsigned char [32] hash_sha256\ngit_cert_ssh_raw_type_t raw_type\nconst char * hostkey\nsize_t hostkey_len", + "tdef": "typedef", + "description": " Hostkey information taken from libssh2", + "comments": "", + "fields": [ + { + "type": "git_cert", + "name": "parent", + "comments": " The parent cert " + }, + { + "type": "git_cert_ssh_t", + "name": "type", + "comments": " A bitmask containing the available fields." + }, + { + "type": "unsigned char [16]", + "name": "hash_md5", + "comments": " Hostkey hash. If `type` has `GIT_CERT_SSH_MD5` set, this will\n have the MD5 hash of the hostkey." + }, + { + "type": "unsigned char [20]", + "name": "hash_sha1", + "comments": " Hostkey hash. If `type` has `GIT_CERT_SSH_SHA1` set, this will\n have the SHA-1 hash of the hostkey." + }, + { + "type": "unsigned char [32]", + "name": "hash_sha256", + "comments": " Hostkey hash. If `type` has `GIT_CERT_SSH_SHA256` set, this will\n have the SHA-256 hash of the hostkey." + }, + { + "type": "git_cert_ssh_raw_type_t", + "name": "raw_type", + "comments": " Raw hostkey type. If `type` has `GIT_CERT_SSH_RAW` set, this will\n have the type of the raw hostkey." + }, + { + "type": "const char *", + "name": "hostkey", + "comments": " Pointer to the raw hostkey. If `type` has `GIT_CERT_SSH_RAW` set,\n this will have the raw contents of the hostkey." + }, + { + "type": "size_t", + "name": "hostkey_len", + "comments": " Raw hostkey length. If `type` has `GIT_CERT_SSH_RAW` set, this will\n have the length of the raw contents of the hostkey." + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_cert_ssh_t", + { + "decl": [ + "GIT_CERT_SSH_MD5", + "GIT_CERT_SSH_SHA1", + "GIT_CERT_SSH_SHA256", + "GIT_CERT_SSH_RAW" + ], + "type": "enum", + "file": "git2/cert.h", + "line": 77, + "lineto": 86, + "block": "GIT_CERT_SSH_MD5\nGIT_CERT_SSH_SHA1\nGIT_CERT_SSH_SHA256\nGIT_CERT_SSH_RAW", + "tdef": "typedef", + "description": " Type of SSH host fingerprint", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_CERT_SSH_MD5", + "comments": "

MD5 is available

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_CERT_SSH_SHA1", + "comments": "

SHA-1 is available

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_CERT_SSH_SHA256", + "comments": "

SHA-256 is available

\n", + "value": 4 + }, + { + "type": "int", + "name": "GIT_CERT_SSH_RAW", + "comments": "

Raw hostkey is available

\n", + "value": 8 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_cert_t", + { + "decl": [ + "GIT_CERT_NONE", + "GIT_CERT_X509", + "GIT_CERT_HOSTKEY_LIBSSH2", + "GIT_CERT_STRARRAY" + ], + "type": "enum", + "file": "git2/cert.h", + "line": 25, + "lineto": 48, + "block": "GIT_CERT_NONE\nGIT_CERT_X509\nGIT_CERT_HOSTKEY_LIBSSH2\nGIT_CERT_STRARRAY\nGIT_CERT_NONE\nGIT_CERT_X509\nGIT_CERT_HOSTKEY_LIBSSH2\nGIT_CERT_STRARRAY", + "tdef": "typedef", + "description": " Type of host certificate structure that is passed to the check callback", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_CERT_NONE", + "comments": "

No information about the certificate is available. This may\n happen when using curl.

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_CERT_X509", + "comments": "

The data argument to the callback will be a pointer to\n the DER-encoded data.

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_CERT_HOSTKEY_LIBSSH2", + "comments": "

The data argument to the callback will be a pointer to a\n git_cert_hostkey structure.

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_CERT_STRARRAY", + "comments": "

The data argument to the callback will be a pointer to a\n git_strarray with name:content strings containing\n information about the certificate. This is used when using\n curl.

\n", + "value": 3 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_cert_x509", + { + "decl": ["git_cert parent", "void * data", "size_t len"], + "type": "struct", + "value": "git_cert_x509", + "file": "git2/cert.h", + "line": 156, + "lineto": 168, + "block": "git_cert parent\nvoid * data\nsize_t len", + "tdef": "typedef", + "description": " X.509 certificate information", + "comments": "", + "fields": [ + { + "type": "git_cert", + "name": "parent", + "comments": " The parent cert " + }, + { + "type": "void *", + "name": "data", + "comments": " Pointer to the X.509 certificate data" + }, + { + "type": "size_t", + "name": "len", + "comments": " Length of the memory block pointed to by `data`." + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_checkout_notify_t", + { + "decl": [ + "GIT_CHECKOUT_NOTIFY_NONE", + "GIT_CHECKOUT_NOTIFY_CONFLICT", + "GIT_CHECKOUT_NOTIFY_DIRTY", + "GIT_CHECKOUT_NOTIFY_UPDATED", + "GIT_CHECKOUT_NOTIFY_UNTRACKED", + "GIT_CHECKOUT_NOTIFY_IGNORED", + "GIT_CHECKOUT_NOTIFY_ALL" + ], + "type": "enum", + "file": "git2/checkout.h", + "line": 224, + "lineto": 255, + "block": "GIT_CHECKOUT_NOTIFY_NONE\nGIT_CHECKOUT_NOTIFY_CONFLICT\nGIT_CHECKOUT_NOTIFY_DIRTY\nGIT_CHECKOUT_NOTIFY_UPDATED\nGIT_CHECKOUT_NOTIFY_UNTRACKED\nGIT_CHECKOUT_NOTIFY_IGNORED\nGIT_CHECKOUT_NOTIFY_ALL", + "tdef": "typedef", + "description": " Checkout notification flags", + "comments": "

Checkout will invoke an options notification callback (notify_cb) for certain cases - you pick which ones via notify_flags:

\n\n

Returning a non-zero value from this callback will cancel the checkout. The non-zero return value will be propagated back and returned by the git_checkout_... call.

\n\n

Notification callbacks are made prior to modifying any files on disk, so canceling on any notification will still happen prior to any files being modified.

\n", + "fields": [ + { + "type": "int", + "name": "GIT_CHECKOUT_NOTIFY_NONE", + "comments": "", + "value": 0 + }, + { + "type": "int", + "name": "GIT_CHECKOUT_NOTIFY_CONFLICT", + "comments": "

Invokes checkout on conflicting paths.

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_CHECKOUT_NOTIFY_DIRTY", + "comments": "

Notifies about "dirty" files, i.e. those that do not need an update\n but no longer match the baseline. Core git displays these files when\n checkout runs, but won't stop the checkout.

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_CHECKOUT_NOTIFY_UPDATED", + "comments": "

Sends notification for any file changed.

\n", + "value": 4 + }, + { + "type": "int", + "name": "GIT_CHECKOUT_NOTIFY_UNTRACKED", + "comments": "

Notifies about untracked files.

\n", + "value": 8 + }, + { + "type": "int", + "name": "GIT_CHECKOUT_NOTIFY_IGNORED", + "comments": "

Notifies about ignored files.

\n", + "value": 16 + }, + { + "type": "int", + "name": "GIT_CHECKOUT_NOTIFY_ALL", + "comments": "

Notifies about ignored files.

\n", + "value": 65535 + } + ], + "used": { "returns": [], "needs": ["git_checkout_notify_cb"] } + } + ], + [ + "git_checkout_options", + { + "decl": [ + "unsigned int version", + "unsigned int checkout_strategy", + "int disable_filters", + "unsigned int dir_mode", + "unsigned int file_mode", + "int file_open_flags", + "unsigned int notify_flags", + "git_checkout_notify_cb notify_cb", + "void * notify_payload", + "git_checkout_progress_cb progress_cb", + "void * progress_payload", + "git_strarray paths", + "git_tree * baseline", + "git_index * baseline_index", + "const char * target_directory", + "const char * ancestor_label", + "const char * our_label", + "const char * their_label", + "git_checkout_perfdata_cb perfdata_cb", + "void * perfdata_payload" + ], + "type": "struct", + "value": "git_checkout_options", + "file": "git2/checkout.h", + "line": 317, + "lineto": 391, + "block": "unsigned int version\nunsigned int checkout_strategy\nint disable_filters\nunsigned int dir_mode\nunsigned int file_mode\nint file_open_flags\nunsigned int notify_flags\ngit_checkout_notify_cb notify_cb\nvoid * notify_payload\ngit_checkout_progress_cb progress_cb\nvoid * progress_payload\ngit_strarray paths\ngit_tree * baseline\ngit_index * baseline_index\nconst char * target_directory\nconst char * ancestor_label\nconst char * our_label\nconst char * their_label\ngit_checkout_perfdata_cb perfdata_cb\nvoid * perfdata_payload", + "tdef": "typedef", + "description": " Checkout options structure", + "comments": "

Initialize with GIT_CHECKOUT_OPTIONS_INIT. Alternatively, you can use git_checkout_options_init.

\n\n

[version] GIT_CHECKOUT_OPTIONS_VERSION [init_macro] GIT_CHECKOUT_OPTIONS_INIT [init_function] git_checkout_options_init

\n", + "fields": [ + { + "type": "unsigned int", + "name": "version", + "comments": " The version " + }, + { + "type": "unsigned int", + "name": "checkout_strategy", + "comments": " default will be a safe checkout " + }, + { + "type": "int", + "name": "disable_filters", + "comments": " don't apply filters like CRLF conversion " + }, + { + "type": "unsigned int", + "name": "dir_mode", + "comments": " default is 0755 " + }, + { + "type": "unsigned int", + "name": "file_mode", + "comments": " default is 0644 or 0755 as dictated by blob " + }, + { + "type": "int", + "name": "file_open_flags", + "comments": " default is O_CREAT | O_TRUNC | O_WRONLY " + }, + { + "type": "unsigned int", + "name": "notify_flags", + "comments": " Checkout notification flags specify what operations the notify\n callback is invoked for.\n\n \n\n[flags] git_checkout_notify_t" + }, + { + "type": "git_checkout_notify_cb", + "name": "notify_cb", + "comments": " Optional callback to get notifications on specific file states.\n " + }, + { + "type": "void *", + "name": "notify_payload", + "comments": " Payload passed to notify_cb " + }, + { + "type": "git_checkout_progress_cb", + "name": "progress_cb", + "comments": " Optional callback to notify the consumer of checkout progress. " + }, + { + "type": "void *", + "name": "progress_payload", + "comments": " Payload passed to progress_cb " + }, + { + "type": "git_strarray", + "name": "paths", + "comments": " A list of wildmatch patterns or paths.\n\n By default, all paths are processed. If you pass an array of wildmatch\n patterns, those will be used to filter which paths should be taken into\n account.\n\n Use GIT_CHECKOUT_DISABLE_PATHSPEC_MATCH to treat as a simple list." + }, + { + "type": "git_tree *", + "name": "baseline", + "comments": " The expected content of the working directory; defaults to HEAD.\n\n If the working directory does not match this baseline information,\n that will produce a checkout conflict." + }, + { + "type": "git_index *", + "name": "baseline_index", + "comments": " Like `baseline` above, though expressed as an index. This\n option overrides `baseline`." + }, + { + "type": "const char *", + "name": "target_directory", + "comments": " alternative checkout path to workdir " + }, + { + "type": "const char *", + "name": "ancestor_label", + "comments": " the name of the common ancestor side of conflicts " + }, + { + "type": "const char *", + "name": "our_label", + "comments": " the name of the \"our\" side of conflicts " + }, + { + "type": "const char *", + "name": "their_label", + "comments": " the name of the \"their\" side of conflicts " + }, + { + "type": "git_checkout_perfdata_cb", + "name": "perfdata_cb", + "comments": " Optional callback to notify the consumer of performance data. " + }, + { + "type": "void *", + "name": "perfdata_payload", + "comments": " Payload passed to perfdata_cb " + } + ], + "used": { + "returns": [], + "needs": [ + "git_checkout_head", + "git_checkout_index", + "git_checkout_options_init", + "git_checkout_tree", + "git_merge", + "git_reset", + "git_reset_from_annotated" + ] + } + } + ], + [ + "git_checkout_perfdata", + { + "decl": [ + "size_t mkdir_calls", + "size_t stat_calls", + "size_t chmod_calls" + ], + "type": "struct", + "value": "git_checkout_perfdata", + "file": "git2/checkout.h", + "line": 258, + "lineto": 262, + "block": "size_t mkdir_calls\nsize_t stat_calls\nsize_t chmod_calls", + "tdef": "typedef", + "description": " Checkout performance-reporting structure ", + "comments": "", + "fields": [ + { "type": "size_t", "name": "mkdir_calls", "comments": "" }, + { "type": "size_t", "name": "stat_calls", "comments": "" }, + { "type": "size_t", "name": "chmod_calls", "comments": "" } + ], + "used": { "returns": [], "needs": ["git_checkout_perfdata_cb"] } + } + ], + [ + "git_checkout_strategy_t", + { + "decl": [ + "GIT_CHECKOUT_SAFE", + "GIT_CHECKOUT_FORCE", + "GIT_CHECKOUT_RECREATE_MISSING", + "GIT_CHECKOUT_ALLOW_CONFLICTS", + "GIT_CHECKOUT_REMOVE_UNTRACKED", + "GIT_CHECKOUT_REMOVE_IGNORED", + "GIT_CHECKOUT_UPDATE_ONLY", + "GIT_CHECKOUT_DONT_UPDATE_INDEX", + "GIT_CHECKOUT_NO_REFRESH", + "GIT_CHECKOUT_SKIP_UNMERGED", + "GIT_CHECKOUT_USE_OURS", + "GIT_CHECKOUT_USE_THEIRS", + "GIT_CHECKOUT_DISABLE_PATHSPEC_MATCH", + "GIT_CHECKOUT_SKIP_LOCKED_DIRECTORIES", + "GIT_CHECKOUT_DONT_OVERWRITE_IGNORED", + "GIT_CHECKOUT_CONFLICT_STYLE_MERGE", + "GIT_CHECKOUT_CONFLICT_STYLE_DIFF3", + "GIT_CHECKOUT_DONT_REMOVE_EXISTING", + "GIT_CHECKOUT_DONT_WRITE_INDEX", + "GIT_CHECKOUT_DRY_RUN", + "GIT_CHECKOUT_CONFLICT_STYLE_ZDIFF3", + "GIT_CHECKOUT_NONE", + "GIT_CHECKOUT_UPDATE_SUBMODULES", + "GIT_CHECKOUT_UPDATE_SUBMODULES_IF_CHANGED" + ], + "type": "enum", + "file": "git2/checkout.h", + "line": 113, + "lineto": 206, + "block": "GIT_CHECKOUT_SAFE\nGIT_CHECKOUT_FORCE\nGIT_CHECKOUT_RECREATE_MISSING\nGIT_CHECKOUT_ALLOW_CONFLICTS\nGIT_CHECKOUT_REMOVE_UNTRACKED\nGIT_CHECKOUT_REMOVE_IGNORED\nGIT_CHECKOUT_UPDATE_ONLY\nGIT_CHECKOUT_DONT_UPDATE_INDEX\nGIT_CHECKOUT_NO_REFRESH\nGIT_CHECKOUT_SKIP_UNMERGED\nGIT_CHECKOUT_USE_OURS\nGIT_CHECKOUT_USE_THEIRS\nGIT_CHECKOUT_DISABLE_PATHSPEC_MATCH\nGIT_CHECKOUT_SKIP_LOCKED_DIRECTORIES\nGIT_CHECKOUT_DONT_OVERWRITE_IGNORED\nGIT_CHECKOUT_CONFLICT_STYLE_MERGE\nGIT_CHECKOUT_CONFLICT_STYLE_DIFF3\nGIT_CHECKOUT_DONT_REMOVE_EXISTING\nGIT_CHECKOUT_DONT_WRITE_INDEX\nGIT_CHECKOUT_DRY_RUN\nGIT_CHECKOUT_CONFLICT_STYLE_ZDIFF3\nGIT_CHECKOUT_NONE\nGIT_CHECKOUT_UPDATE_SUBMODULES\nGIT_CHECKOUT_UPDATE_SUBMODULES_IF_CHANGED", + "tdef": "typedef", + "description": " Checkout behavior flags", + "comments": "

In libgit2, checkout is used to update the working directory and index to match a target tree. Unlike git checkout, it does not move the HEAD commit for you - use git_repository_set_head or the like to do that.

\n\n

Checkout looks at (up to) four things: the "target" tree you want to check out, the "baseline" tree of what was checked out previously, the working directory for actual files, and the index for staged changes.

\n\n

You give checkout one of two strategies for update:

\n\n\n\n

To emulate git checkout, use GIT_CHECKOUT_SAFE with a checkout notification callback (see below) that displays information about dirty files. The default behavior will cancel checkout on conflicts.

\n\n

To emulate git checkout-index, use GIT_CHECKOUT_SAFE with a notification callback that cancels the operation if a dirty-but-existing file is found in the working directory. This core git command isn't quite "force" but is sensitive about some types of changes.

\n\n

To emulate git checkout -f, use GIT_CHECKOUT_FORCE.

\n\n

There are some additional flags to modify the behavior of checkout:

\n\n\n", + "fields": [ + { + "type": "int", + "name": "GIT_CHECKOUT_SAFE", + "comments": "

Allow safe updates that cannot overwrite uncommitted data.\n If the uncommitted changes don't conflict with the checked\n out files, the checkout will still proceed, leaving the\n changes intact.

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_CHECKOUT_FORCE", + "comments": "

Allow all updates to force working directory to look like\n the index, potentially losing data in the process.

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_CHECKOUT_RECREATE_MISSING", + "comments": "

Allow checkout to recreate missing files

\n", + "value": 4 + }, + { + "type": "int", + "name": "GIT_CHECKOUT_ALLOW_CONFLICTS", + "comments": "

Allow checkout to make safe updates even if conflicts are found

\n", + "value": 16 + }, + { + "type": "int", + "name": "GIT_CHECKOUT_REMOVE_UNTRACKED", + "comments": "

Remove untracked files not in index (that are not ignored)

\n", + "value": 32 + }, + { + "type": "int", + "name": "GIT_CHECKOUT_REMOVE_IGNORED", + "comments": "

Remove ignored files not in index

\n", + "value": 64 + }, + { + "type": "int", + "name": "GIT_CHECKOUT_UPDATE_ONLY", + "comments": "

Only update existing files, don't create new ones

\n", + "value": 128 + }, + { + "type": "int", + "name": "GIT_CHECKOUT_DONT_UPDATE_INDEX", + "comments": "

Normally checkout updates index entries as it goes; this stops that.\n Implies GIT_CHECKOUT_DONT_WRITE_INDEX.

\n", + "value": 256 + }, + { + "type": "int", + "name": "GIT_CHECKOUT_NO_REFRESH", + "comments": "

Don't refresh index/config/etc before doing checkout

\n", + "value": 512 + }, + { + "type": "int", + "name": "GIT_CHECKOUT_SKIP_UNMERGED", + "comments": "

Allow checkout to skip unmerged files

\n", + "value": 1024 + }, + { + "type": "int", + "name": "GIT_CHECKOUT_USE_OURS", + "comments": "

For unmerged files, checkout stage 2 from index

\n", + "value": 2048 + }, + { + "type": "int", + "name": "GIT_CHECKOUT_USE_THEIRS", + "comments": "

For unmerged files, checkout stage 3 from index

\n", + "value": 4096 + }, + { + "type": "int", + "name": "GIT_CHECKOUT_DISABLE_PATHSPEC_MATCH", + "comments": "

Treat pathspec as simple list of exact match file paths

\n", + "value": 8192 + }, + { + "type": "int", + "name": "GIT_CHECKOUT_SKIP_LOCKED_DIRECTORIES", + "comments": "

Ignore directories in use, they will be left empty

\n", + "value": 262144 + }, + { + "type": "int", + "name": "GIT_CHECKOUT_DONT_OVERWRITE_IGNORED", + "comments": "

Don't overwrite ignored files that exist in the checkout target

\n", + "value": 524288 + }, + { + "type": "int", + "name": "GIT_CHECKOUT_CONFLICT_STYLE_MERGE", + "comments": "

Write normal merge files for conflicts

\n", + "value": 1048576 + }, + { + "type": "int", + "name": "GIT_CHECKOUT_CONFLICT_STYLE_DIFF3", + "comments": "

Include common ancestor data in diff3 format files for conflicts

\n", + "value": 2097152 + }, + { + "type": "int", + "name": "GIT_CHECKOUT_DONT_REMOVE_EXISTING", + "comments": "

Don't overwrite existing files or folders

\n", + "value": 4194304 + }, + { + "type": "int", + "name": "GIT_CHECKOUT_DONT_WRITE_INDEX", + "comments": "

Normally checkout writes the index upon completion; this prevents that.

\n", + "value": 8388608 + }, + { + "type": "int", + "name": "GIT_CHECKOUT_DRY_RUN", + "comments": "

Perform a "dry run", reporting what would be done but\n without actually making changes in the working directory\n or the index.

\n", + "value": 16777216 + }, + { + "type": "int", + "name": "GIT_CHECKOUT_CONFLICT_STYLE_ZDIFF3", + "comments": "

Include common ancestor data in zdiff3 format for conflicts

\n", + "value": 33554432 + }, + { + "type": "int", + "name": "GIT_CHECKOUT_NONE", + "comments": "

Do not do a checkout and do not fire callbacks; this is primarily\n useful only for internal functions that will perform the\n checkout themselves but need to pass checkout options into\n another function, for example, git_clone.

\n", + "value": 1073741824 + }, + { + "type": "int", + "name": "GIT_CHECKOUT_UPDATE_SUBMODULES", + "comments": "

Recursively checkout submodules with same options (NOT IMPLEMENTED)

\n", + "value": 65536 + }, + { + "type": "int", + "name": "GIT_CHECKOUT_UPDATE_SUBMODULES_IF_CHANGED", + "comments": "

Recursively checkout submodules if HEAD moved in super repo (NOT IMPLEMENTED)

\n", + "value": 131072 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_cherrypick_options", + { + "decl": [ + "unsigned int version", + "unsigned int mainline", + "git_merge_options merge_opts", + "git_checkout_options checkout_opts" + ], + "type": "struct", + "value": "git_cherrypick_options", + "file": "git2/cherrypick.h", + "line": 29, + "lineto": 37, + "block": "unsigned int version\nunsigned int mainline\ngit_merge_options merge_opts\ngit_checkout_options checkout_opts", + "tdef": "typedef", + "description": " Cherry-pick options", + "comments": "", + "fields": [ + { "type": "unsigned int", "name": "version", "comments": "" }, + { + "type": "unsigned int", + "name": "mainline", + "comments": " For merge commits, the \"mainline\" is treated as the parent. " + }, + { + "type": "git_merge_options", + "name": "merge_opts", + "comments": " Options for the merging " + }, + { + "type": "git_checkout_options", + "name": "checkout_opts", + "comments": " Options for the checkout " + } + ], + "used": { + "returns": [], + "needs": ["git_cherrypick", "git_cherrypick_options_init"] + } + } + ], + [ + "git_clone_local_t", + { + "decl": [ + "GIT_CLONE_LOCAL_AUTO", + "GIT_CLONE_LOCAL", + "GIT_CLONE_NO_LOCAL", + "GIT_CLONE_LOCAL_NO_LINKS" + ], + "type": "enum", + "file": "git2/clone.h", + "line": 37, + "lineto": 57, + "block": "GIT_CLONE_LOCAL_AUTO\nGIT_CLONE_LOCAL\nGIT_CLONE_NO_LOCAL\nGIT_CLONE_LOCAL_NO_LINKS", + "tdef": "typedef", + "description": " Options for bypassing the git-aware transport on clone. Bypassing\n it means that instead of a fetch, libgit2 will copy the object\n database directory instead of figuring out what it needs, which is\n faster. If possible, it will hardlink the files to save space.", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_CLONE_LOCAL_AUTO", + "comments": "

Auto-detect (default), libgit2 will bypass the git-aware\n transport for local paths, but use a normal fetch for\n file:// urls.

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_CLONE_LOCAL", + "comments": "

Bypass the git-aware transport even for a file:// url.

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_CLONE_NO_LOCAL", + "comments": "

Do no bypass the git-aware transport

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_CLONE_LOCAL_NO_LINKS", + "comments": "

Bypass the git-aware transport, but do not try to use\n hardlinks.

\n", + "value": 3 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_clone_options", + { + "decl": [ + "unsigned int version", + "git_checkout_options checkout_opts", + "git_fetch_options fetch_opts", + "int bare", + "git_clone_local_t local", + "const char * checkout_branch", + "git_repository_create_cb repository_cb", + "void * repository_cb_payload", + "git_remote_create_cb remote_cb", + "void * remote_cb_payload" + ], + "type": "struct", + "value": "git_clone_options", + "file": "git2/clone.h", + "line": 110, + "lineto": 171, + "block": "unsigned int version\ngit_checkout_options checkout_opts\ngit_fetch_options fetch_opts\nint bare\ngit_clone_local_t local\nconst char * checkout_branch\ngit_repository_create_cb repository_cb\nvoid * repository_cb_payload\ngit_remote_create_cb remote_cb\nvoid * remote_cb_payload", + "tdef": "typedef", + "description": " Clone options structure", + "comments": "

Initialize with GIT_CLONE_OPTIONS_INIT. Alternatively, you can use git_clone_options_init.

\n\n

[version] GIT_CLONE_OPTIONS_VERSION [init_macro] GIT_CLONE_OPTIONS_INIT [init_function] git_clone_options_init

\n", + "fields": [ + { "type": "unsigned int", "name": "version", "comments": "" }, + { + "type": "git_checkout_options", + "name": "checkout_opts", + "comments": " These options are passed to the checkout step. To disable\n checkout, set the `checkout_strategy` to `GIT_CHECKOUT_NONE`\n or `GIT_CHECKOUT_DRY_RUN`." + }, + { + "type": "git_fetch_options", + "name": "fetch_opts", + "comments": " Options which control the fetch, including callbacks.\n\n The callbacks are used for reporting fetch progress, and for acquiring\n credentials in the event they are needed." + }, + { + "type": "int", + "name": "bare", + "comments": " Set to zero (false) to create a standard repo, or non-zero\n for a bare repo" + }, + { + "type": "git_clone_local_t", + "name": "local", + "comments": " Whether to use a fetch or copy the object database." + }, + { + "type": "const char *", + "name": "checkout_branch", + "comments": " The name of the branch to checkout. NULL means use the\n remote's default branch." + }, + { + "type": "git_repository_create_cb", + "name": "repository_cb", + "comments": " A callback used to create the new repository into which to\n clone. If NULL, the 'bare' field will be used to determine\n whether to create a bare repository." + }, + { + "type": "void *", + "name": "repository_cb_payload", + "comments": " An opaque payload to pass to the git_repository creation callback.\n This parameter is ignored unless repository_cb is non-NULL." + }, + { + "type": "git_remote_create_cb", + "name": "remote_cb", + "comments": " A callback used to create the git_remote, prior to its being\n used to perform the clone operation. See the documentation for\n git_remote_create_cb for details. This parameter may be NULL,\n indicating that git_clone should provide default behavior." + }, + { + "type": "void *", + "name": "remote_cb_payload", + "comments": " An opaque payload to pass to the git_remote creation callback.\n This parameter is ignored unless remote_cb is non-NULL." + } + ], + "used": { + "returns": [], + "needs": ["git_clone", "git_clone_options_init"] + } + } + ], + [ + "git_commit", + { + "decl": "git_commit", + "type": "struct", + "value": "git_commit", + "file": "git2/types.h", + "line": 141, + "lineto": 141, + "tdef": "typedef", + "description": " Parsed representation of a commit object. ", + "comments": "", + "used": { + "returns": [], + "needs": [ + "git_branch_create", + "git_cherrypick", + "git_cherrypick_commit", + "git_commit_amend", + "git_commit_author", + "git_commit_author_with_mailmap", + "git_commit_body", + "git_commit_committer", + "git_commit_committer_with_mailmap", + "git_commit_create", + "git_commit_create_buffer", + "git_commit_create_cb", + "git_commit_create_from_stage", + "git_commit_dup", + "git_commit_free", + "git_commit_header_field", + "git_commit_id", + "git_commit_lookup", + "git_commit_lookup_prefix", + "git_commit_message", + "git_commit_message_encoding", + "git_commit_message_raw", + "git_commit_nth_gen_ancestor", + "git_commit_owner", + "git_commit_parent", + "git_commit_parent_id", + "git_commit_parentcount", + "git_commit_raw_header", + "git_commit_summary", + "git_commit_time", + "git_commit_time_offset", + "git_commit_tree", + "git_commit_tree_id", + "git_commitarray_dispose", + "git_diff_commit_as_email", + "git_email_create_from_commit", + "git_merge_commits", + "git_odb_set_commit_graph", + "git_repository_commit_parents", + "git_revert", + "git_revert_commit" + ] + } + } + ], + [ + "git_commit_graph", + { + "decl": "git_commit_graph", + "type": "struct", + "value": "git_commit_graph", + "file": "git2/types.h", + "line": 114, + "lineto": 114, + "tdef": "typedef", + "description": " A git commit-graph ", + "comments": "", + "used": { "returns": [], "needs": ["git_odb_set_commit_graph"] } + } + ], + [ + "git_commit_graph_split_strategy_t", + { + "decl": ["GIT_COMMIT_GRAPH_SPLIT_STRATEGY_SINGLE_FILE"], + "type": "enum", + "file": "git2/sys/commit_graph.h", + "line": 93, + "lineto": 99, + "block": "GIT_COMMIT_GRAPH_SPLIT_STRATEGY_SINGLE_FILE", + "tdef": "typedef", + "description": " The strategy to use when adding a new set of commits to a pre-existing\n commit-graph chain.", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_COMMIT_GRAPH_SPLIT_STRATEGY_SINGLE_FILE", + "comments": "

Do not split commit-graph files. The other split strategy-related option\n fields are ignored.

\n", + "value": 0 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_commit_graph_writer", + { + "decl": "git_commit_graph_writer", + "type": "struct", + "value": "git_commit_graph_writer", + "file": "git2/types.h", + "line": 117, + "lineto": 117, + "tdef": "typedef", + "description": " a writer for commit-graph files. ", + "comments": "", + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_commitarray", + { + "decl": ["git_commit *const * commits", "size_t count"], + "type": "struct", + "value": "git_commitarray", + "file": "git2/commit.h", + "line": 655, + "lineto": 658, + "block": "git_commit *const * commits\nsize_t count", + "tdef": "typedef", + "description": " An array of commits returned from the library ", + "comments": "", + "fields": [ + { "type": "git_commit *const *", "name": "commits", "comments": "" }, + { "type": "size_t", "name": "count", "comments": "" } + ], + "used": { + "returns": [], + "needs": ["git_commitarray_dispose", "git_repository_commit_parents"] + } + } + ], + [ + "git_config", + { + "decl": "git_config", + "type": "struct", + "value": "git_config", + "file": "git2/types.h", + "line": 162, + "lineto": 162, + "tdef": "typedef", + "description": " Memory representation of a set of config files ", + "comments": "", + "used": { + "returns": [], + "needs": [ + "git_config_add_file_ondisk", + "git_config_backend_foreach_match", + "git_config_delete_entry", + "git_config_delete_multivar", + "git_config_entry_free", + "git_config_foreach", + "git_config_foreach_cb", + "git_config_foreach_match", + "git_config_free", + "git_config_get_bool", + "git_config_get_entry", + "git_config_get_int32", + "git_config_get_int64", + "git_config_get_mapped", + "git_config_get_multivar_foreach", + "git_config_get_path", + "git_config_get_string", + "git_config_get_string_buf", + "git_config_iterator_free", + "git_config_iterator_glob_new", + "git_config_iterator_new", + "git_config_lock", + "git_config_lookup_map_value", + "git_config_multivar_iterator_new", + "git_config_new", + "git_config_next", + "git_config_open_default", + "git_config_open_global", + "git_config_open_level", + "git_config_open_ondisk", + "git_config_set_bool", + "git_config_set_int32", + "git_config_set_int64", + "git_config_set_multivar", + "git_config_set_string", + "git_config_set_writeorder", + "git_config_snapshot", + "git_repository_config", + "git_repository_config_snapshot" + ] + } + } + ], + [ + "git_config_backend", + { + "decl": "git_config_backend", + "type": "struct", + "value": "git_config_backend", + "file": "git2/types.h", + "line": 165, + "lineto": 165, + "tdef": "typedef", + "description": " Interface to access a configuration file ", + "comments": "", + "used": { "returns": [], "needs": ["git_config_backend_foreach_match"] } + } + ], + [ + "git_config_backend_memory_options", + { + "decl": [ + "unsigned int version", + "const char * backend_type", + "const char * origin_path" + ], + "type": "struct", + "value": "git_config_backend_memory_options", + "file": "git2/sys/config.h", + "line": 148, + "lineto": 162, + "block": "unsigned int version\nconst char * backend_type\nconst char * origin_path", + "tdef": "typedef", + "description": " Options for in-memory configuration backends. ", + "comments": "", + "fields": [ + { "type": "unsigned int", "name": "version", "comments": "" }, + { + "type": "const char *", + "name": "backend_type", + "comments": " The type of this backend (eg, \"command line\"). If this is\n NULL, then this will be \"in-memory\"." + }, + { + "type": "const char *", + "name": "origin_path", + "comments": " The path to the origin; if this is NULL then it will be\n left unset in the resulting configuration entries." + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_config_entry", + { + "decl": [ + "const char * name", + "const char * value", + "const char * backend_type", + "const char * origin_path", + "unsigned int include_depth", + "git_config_level_t level" + ], + "type": "struct", + "value": "git_config_entry", + "file": "git2/config.h", + "line": 103, + "lineto": 124, + "block": "const char * name\nconst char * value\nconst char * backend_type\nconst char * origin_path\nunsigned int include_depth\ngit_config_level_t level", + "tdef": "typedef", + "description": " An entry in a configuration file", + "comments": "", + "fields": [ + { + "type": "const char *", + "name": "name", + "comments": " Name of the configuration entry (normalized). " + }, + { + "type": "const char *", + "name": "value", + "comments": " Literal (string) value of the entry. " + }, + { + "type": "const char *", + "name": "backend_type", + "comments": " The type of backend that this entry exists in (eg, \"file\"). " + }, + { + "type": "const char *", + "name": "origin_path", + "comments": " The path to the origin of this entry. For config files, this is\n the path to the file." + }, + { + "type": "unsigned int", + "name": "include_depth", + "comments": " Depth of includes where this variable was found. " + }, + { + "type": "git_config_level_t", + "name": "level", + "comments": " Configuration level for the file this was found in. " + } + ], + "used": { + "returns": [], + "needs": [ + "git_config_entry_free", + "git_config_foreach_cb", + "git_config_get_entry", + "git_config_next" + ] + } + } + ], + [ + "git_config_iterator", + { + "decl": "git_config_iterator", + "type": "struct", + "value": "git_config_iterator", + "file": "git2/config.h", + "line": 145, + "lineto": 145, + "tdef": "typedef", + "description": " An opaque structure for a configuration iterator.", + "comments": "", + "used": { + "returns": [], + "needs": [ + "git_config_iterator_free", + "git_config_iterator_glob_new", + "git_config_iterator_new", + "git_config_multivar_iterator_new", + "git_config_next" + ] + } + } + ], + [ + "git_config_level_t", + { + "decl": [ + "GIT_CONFIG_LEVEL_PROGRAMDATA", + "GIT_CONFIG_LEVEL_SYSTEM", + "GIT_CONFIG_LEVEL_XDG", + "GIT_CONFIG_LEVEL_GLOBAL", + "GIT_CONFIG_LEVEL_LOCAL", + "GIT_CONFIG_LEVEL_WORKTREE", + "GIT_CONFIG_LEVEL_APP", + "GIT_CONFIG_HIGHEST_LEVEL" + ], + "type": "enum", + "file": "git2/config.h", + "line": 49, + "lineto": 98, + "block": "GIT_CONFIG_LEVEL_PROGRAMDATA\nGIT_CONFIG_LEVEL_SYSTEM\nGIT_CONFIG_LEVEL_XDG\nGIT_CONFIG_LEVEL_GLOBAL\nGIT_CONFIG_LEVEL_LOCAL\nGIT_CONFIG_LEVEL_WORKTREE\nGIT_CONFIG_LEVEL_APP\nGIT_CONFIG_HIGHEST_LEVEL", + "tdef": "typedef", + "description": " Priority level of a config file.", + "comments": "

These priority levels correspond to the natural escalation logic (from higher to lower) when reading or searching for config entries in git.git. Meaning that for the same key, the configuration in the local configuration is preferred over the configuration in the system configuration file.

\n\n

Callers can add their own custom configuration, beginning at the GIT_CONFIG_LEVEL_APP level.

\n\n

Writes, by default, occur in the highest priority level backend that is writable. This ordering can be overridden with git_config_set_writeorder.

\n\n

git_config_open_default() and git_repository_config() honor those priority levels as well.

\n", + "fields": [ + { + "type": "int", + "name": "GIT_CONFIG_LEVEL_PROGRAMDATA", + "comments": "

System-wide on Windows, for compatibility with "Portable Git".

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_CONFIG_LEVEL_SYSTEM", + "comments": "

System-wide configuration file; /etc/gitconfig on Linux.

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_CONFIG_LEVEL_XDG", + "comments": "

XDG compatible configuration file; typically\n ~/.config/git/config.

\n", + "value": 3 + }, + { + "type": "int", + "name": "GIT_CONFIG_LEVEL_GLOBAL", + "comments": "

Global configuration file is the user-specific configuration;\n typically ~/.gitconfig.

\n", + "value": 4 + }, + { + "type": "int", + "name": "GIT_CONFIG_LEVEL_LOCAL", + "comments": "

Local configuration, the repository-specific configuration file;\n typically $GIT_DIR/config.

\n", + "value": 5 + }, + { + "type": "int", + "name": "GIT_CONFIG_LEVEL_WORKTREE", + "comments": "

Worktree-specific configuration; typically\n $GIT_DIR/config.worktree.

\n", + "value": 6 + }, + { + "type": "int", + "name": "GIT_CONFIG_LEVEL_APP", + "comments": "

Application-specific configuration file. Callers into libgit2\n can add their own configuration beginning at this level.

\n", + "value": 7 + }, + { + "type": "int", + "name": "GIT_CONFIG_HIGHEST_LEVEL", + "comments": "

Not a configuration level; callers can use this value when\n querying configuration levels to specify that they want to\n have data from the highest-level currently configuration.\n This can be used to indicate that callers want the most\n specific config file available that actually is loaded.

\n", + "value": -1 + } + ], + "used": { + "returns": [], + "needs": [ + "git_config_add_file_ondisk", + "git_config_open_level", + "git_config_set_writeorder" + ] + } + } + ], + [ + "git_configmap", + { + "decl": [ + "git_configmap_t type", + "const char * str_match", + "int map_value" + ], + "type": "struct", + "value": "git_configmap", + "file": "git2/config.h", + "line": 160, + "lineto": 164, + "block": "git_configmap_t type\nconst char * str_match\nint map_value", + "tdef": "typedef", + "description": " Mapping from config variables to values.", + "comments": "", + "fields": [ + { "type": "git_configmap_t", "name": "type", "comments": "" }, + { "type": "const char *", "name": "str_match", "comments": "" }, + { "type": "int", "name": "map_value", "comments": "" } + ], + "used": { + "returns": [], + "needs": ["git_config_get_mapped", "git_config_lookup_map_value"] + } + } + ], + [ + "git_configmap_t", + { + "decl": [ + "GIT_CONFIGMAP_FALSE", + "GIT_CONFIGMAP_TRUE", + "GIT_CONFIGMAP_INT32", + "GIT_CONFIGMAP_STRING" + ], + "type": "enum", + "file": "git2/config.h", + "line": 150, + "lineto": 155, + "block": "GIT_CONFIGMAP_FALSE\nGIT_CONFIGMAP_TRUE\nGIT_CONFIGMAP_INT32\nGIT_CONFIGMAP_STRING", + "tdef": "typedef", + "description": " Config var type", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_CONFIGMAP_FALSE", + "comments": "", + "value": 0 + }, + { + "type": "int", + "name": "GIT_CONFIGMAP_TRUE", + "comments": "", + "value": 1 + }, + { + "type": "int", + "name": "GIT_CONFIGMAP_INT32", + "comments": "", + "value": 2 + }, + { + "type": "int", + "name": "GIT_CONFIGMAP_STRING", + "comments": "", + "value": 3 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_credential", + { + "decl": "git_credential", + "type": "struct", + "value": "git_credential", + "file": "git2/credential.h", + "line": 87, + "lineto": 87, + "tdef": "typedef", + "description": " The base structure for all credential types", + "comments": "", + "used": { + "returns": [], + "needs": [ + "git_credential_acquire_cb", + "git_credential_default_new", + "git_credential_free", + "git_credential_get_username", + "git_credential_has_username", + "git_credential_ssh_custom_new", + "git_credential_ssh_interactive_new", + "git_credential_ssh_key_from_agent", + "git_credential_ssh_key_memory_new", + "git_credential_ssh_key_new", + "git_credential_username_new", + "git_credential_userpass", + "git_credential_userpass_plaintext_new" + ] + } + } + ], + [ + "git_credential_default", + { + "decl": "git_credential_default", + "type": "struct", + "value": "git_credential_default", + "file": "git2/credential.h", + "line": 95, + "lineto": 95, + "tdef": "typedef", + "description": " A key for NTLM/Kerberos \"default\" credentials ", + "comments": "", + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_credential_ssh_custom", + { + "decl": "git_credential_ssh_custom", + "type": "struct", + "value": "git_credential_ssh_custom", + "file": "git2/credential.h", + "line": 110, + "lineto": 110, + "tdef": "typedef", + "description": " A key with a custom signature function", + "comments": "", + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_credential_ssh_interactive", + { + "decl": "git_credential_ssh_interactive", + "type": "struct", + "value": "git_credential_ssh_interactive", + "file": "git2/credential.h", + "line": 105, + "lineto": 105, + "tdef": "typedef", + "description": " Keyboard-interactive based ssh authentication", + "comments": "", + "used": { + "returns": [], + "needs": ["git_credential_ssh_interactive_new"] + } + } + ], + [ + "git_credential_ssh_key", + { + "decl": "git_credential_ssh_key", + "type": "struct", + "value": "git_credential_ssh_key", + "file": "git2/credential.h", + "line": 100, + "lineto": 100, + "tdef": "typedef", + "description": " A ssh key from disk", + "comments": "", + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_credential_t", + { + "decl": [ + "GIT_CREDENTIAL_USERPASS_PLAINTEXT", + "GIT_CREDENTIAL_SSH_KEY", + "GIT_CREDENTIAL_SSH_CUSTOM", + "GIT_CREDENTIAL_DEFAULT", + "GIT_CREDENTIAL_SSH_INTERACTIVE", + "GIT_CREDENTIAL_USERNAME", + "GIT_CREDENTIAL_SSH_MEMORY" + ], + "type": "enum", + "file": "git2/credential.h", + "line": 30, + "lineto": 82, + "block": "GIT_CREDENTIAL_USERPASS_PLAINTEXT\nGIT_CREDENTIAL_SSH_KEY\nGIT_CREDENTIAL_SSH_CUSTOM\nGIT_CREDENTIAL_DEFAULT\nGIT_CREDENTIAL_SSH_INTERACTIVE\nGIT_CREDENTIAL_USERNAME\nGIT_CREDENTIAL_SSH_MEMORY", + "tdef": "typedef", + "description": " Supported credential types", + "comments": "

This represents the various types of authentication methods supported by the library.

\n", + "fields": [ + { + "type": "int", + "name": "GIT_CREDENTIAL_USERPASS_PLAINTEXT", + "comments": "

A vanilla user/password request

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_CREDENTIAL_SSH_KEY", + "comments": "

An SSH key-based authentication request

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_CREDENTIAL_SSH_CUSTOM", + "comments": "

An SSH key-based authentication request, with a custom signature

\n", + "value": 4 + }, + { + "type": "int", + "name": "GIT_CREDENTIAL_DEFAULT", + "comments": "

An NTLM/Negotiate-based authentication request.

\n", + "value": 8 + }, + { + "type": "int", + "name": "GIT_CREDENTIAL_SSH_INTERACTIVE", + "comments": "

An SSH interactive authentication request

\n", + "value": 16 + }, + { + "type": "int", + "name": "GIT_CREDENTIAL_USERNAME", + "comments": "

Username-only authentication request

\n\n

Used as a pre-authentication step if the underlying transport\n (eg. SSH, with no username in its URL) does not know which username\n to use.

\n", + "value": 32 + }, + { + "type": "int", + "name": "GIT_CREDENTIAL_SSH_MEMORY", + "comments": "

An SSH key-based authentication request

\n\n

Allows credentials to be read from memory instead of files.\n Note that because of differences in crypto backend support, it might\n not be functional.

\n", + "value": 64 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_credential_username", + { + "decl": "git_credential_username", + "type": "struct", + "value": "git_credential_username", + "file": "git2/credential.h", + "line": 92, + "lineto": 92, + "tdef": "typedef", + "description": " Username-only credential information ", + "comments": "", + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_credential_userpass_payload", + { + "decl": ["const char * username", "const char * password"], + "type": "struct", + "value": "git_credential_userpass_payload", + "file": "git2/credential_helpers.h", + "line": 24, + "lineto": 27, + "block": "const char * username\nconst char * password", + "tdef": "typedef", + "description": " Payload for git_credential_userpass_plaintext.", + "comments": "", + "fields": [ + { "type": "const char *", "name": "username", "comments": "" }, + { "type": "const char *", "name": "password", "comments": "" } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_delta_t", + { + "decl": [ + "GIT_DELTA_UNMODIFIED", + "GIT_DELTA_ADDED", + "GIT_DELTA_DELETED", + "GIT_DELTA_MODIFIED", + "GIT_DELTA_RENAMED", + "GIT_DELTA_COPIED", + "GIT_DELTA_IGNORED", + "GIT_DELTA_UNTRACKED", + "GIT_DELTA_TYPECHANGE", + "GIT_DELTA_UNREADABLE", + "GIT_DELTA_CONFLICTED" + ], + "type": "enum", + "file": "git2/diff.h", + "line": 224, + "lineto": 236, + "block": "GIT_DELTA_UNMODIFIED\nGIT_DELTA_ADDED\nGIT_DELTA_DELETED\nGIT_DELTA_MODIFIED\nGIT_DELTA_RENAMED\nGIT_DELTA_COPIED\nGIT_DELTA_IGNORED\nGIT_DELTA_UNTRACKED\nGIT_DELTA_TYPECHANGE\nGIT_DELTA_UNREADABLE\nGIT_DELTA_CONFLICTED", + "tdef": "typedef", + "description": " What type of change is described by a git_diff_delta?", + "comments": "

GIT_DELTA_RENAMED and GIT_DELTA_COPIED will only show up if you run git_diff_find_similar() on the diff object.

\n\n

GIT_DELTA_TYPECHANGE only shows up given GIT_DIFF_INCLUDE_TYPECHANGE in the option flags (otherwise type changes will be split into ADDED / DELETED pairs).

\n", + "fields": [ + { + "type": "int", + "name": "GIT_DELTA_UNMODIFIED", + "comments": "

no changes

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_DELTA_ADDED", + "comments": "

entry does not exist in old version

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_DELTA_DELETED", + "comments": "

entry does not exist in new version

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_DELTA_MODIFIED", + "comments": "

entry content changed between old and new

\n", + "value": 3 + }, + { + "type": "int", + "name": "GIT_DELTA_RENAMED", + "comments": "

entry was renamed between old and new

\n", + "value": 4 + }, + { + "type": "int", + "name": "GIT_DELTA_COPIED", + "comments": "

entry was copied from another old entry

\n", + "value": 5 + }, + { + "type": "int", + "name": "GIT_DELTA_IGNORED", + "comments": "

entry is ignored item in workdir

\n", + "value": 6 + }, + { + "type": "int", + "name": "GIT_DELTA_UNTRACKED", + "comments": "

entry is untracked item in workdir

\n", + "value": 7 + }, + { + "type": "int", + "name": "GIT_DELTA_TYPECHANGE", + "comments": "

type of entry changed between old and new

\n", + "value": 8 + }, + { + "type": "int", + "name": "GIT_DELTA_UNREADABLE", + "comments": "

entry is unreadable

\n", + "value": 9 + }, + { + "type": "int", + "name": "GIT_DELTA_CONFLICTED", + "comments": "

entry in the index is conflicted

\n", + "value": 10 + } + ], + "used": { + "returns": [], + "needs": ["git_diff_num_deltas_of_type", "git_diff_status_char"] + } + } + ], + [ + "git_describe_format_options", + { + "decl": [ + "unsigned int version", + "unsigned int abbreviated_size", + "int always_use_long_format", + "const char * dirty_suffix" + ], + "type": "struct", + "value": "git_describe_format_options", + "file": "git2/describe.h", + "line": 100, + "lineto": 120, + "block": "unsigned int version\nunsigned int abbreviated_size\nint always_use_long_format\nconst char * dirty_suffix", + "tdef": "typedef", + "description": " Describe format options structure", + "comments": "

Initialize with GIT_DESCRIBE_FORMAT_OPTIONS_INIT. Alternatively, you can use git_describe_format_options_init.

\n", + "fields": [ + { "type": "unsigned int", "name": "version", "comments": "" }, + { + "type": "unsigned int", + "name": "abbreviated_size", + "comments": " Size of the abbreviated commit id to use. This value is the\n lower bound for the length of the abbreviated string. The\n default is 7." + }, + { + "type": "int", + "name": "always_use_long_format", + "comments": " Set to use the long format even when a shorter name could be used." + }, + { + "type": "const char *", + "name": "dirty_suffix", + "comments": " If the workdir is dirty and this is set, this string will\n be appended to the description string." + } + ], + "used": { + "returns": [], + "needs": ["git_describe_format", "git_describe_format_options_init"] + } + } + ], + [ + "git_describe_options", + { + "decl": [ + "unsigned int version", + "unsigned int max_candidates_tags", + "unsigned int describe_strategy", + "const char * pattern", + "int only_follow_first_parent", + "int show_commit_oid_as_fallback" + ], + "type": "struct", + "value": "git_describe_options", + "file": "git2/describe.h", + "line": 47, + "lineto": 65, + "block": "unsigned int version\nunsigned int max_candidates_tags\nunsigned int describe_strategy\nconst char * pattern\nint only_follow_first_parent\nint show_commit_oid_as_fallback", + "tdef": "typedef", + "description": " Describe options structure", + "comments": "

Initialize with GIT_DESCRIBE_OPTIONS_INIT. Alternatively, you can use git_describe_options_init.

\n", + "fields": [ + { "type": "unsigned int", "name": "version", "comments": "" }, + { + "type": "unsigned int", + "name": "max_candidates_tags", + "comments": " default: 10 " + }, + { + "type": "unsigned int", + "name": "describe_strategy", + "comments": " default: GIT_DESCRIBE_DEFAULT " + }, + { "type": "const char *", "name": "pattern", "comments": "" }, + { + "type": "int", + "name": "only_follow_first_parent", + "comments": " When calculating the distance from the matching tag or\n reference, only walk down the first-parent ancestry." + }, + { + "type": "int", + "name": "show_commit_oid_as_fallback", + "comments": " If no matching tag or reference is found, the describe\n operation would normally fail. If this option is set, it\n will instead fall back to showing the full id of the\n commit." + } + ], + "used": { + "returns": [], + "needs": [ + "git_describe_commit", + "git_describe_options_init", + "git_describe_workdir" + ] + } + } + ], + [ + "git_describe_result", + { + "decl": "git_describe_result", + "type": "struct", + "value": "git_describe_result", + "file": "git2/describe.h", + "line": 146, + "lineto": 146, + "tdef": "typedef", + "description": " A struct that stores the result of a describe operation.", + "comments": "", + "used": { + "returns": [], + "needs": [ + "git_describe_commit", + "git_describe_format", + "git_describe_result_free", + "git_describe_workdir" + ] + } + } + ], + [ + "git_describe_strategy_t", + { + "decl": [ + "GIT_DESCRIBE_DEFAULT", + "GIT_DESCRIBE_TAGS", + "GIT_DESCRIBE_ALL" + ], + "type": "enum", + "file": "git2/describe.h", + "line": 34, + "lineto": 38, + "block": "GIT_DESCRIBE_DEFAULT\nGIT_DESCRIBE_TAGS\nGIT_DESCRIBE_ALL", + "tdef": "typedef", + "description": " Reference lookup strategy", + "comments": "

These behave like the --tags and --all options to git-describe, namely they say to look for any reference in either refs/tags/ or refs/ respectively.

\n", + "fields": [ + { + "type": "int", + "name": "GIT_DESCRIBE_DEFAULT", + "comments": "", + "value": 0 + }, + { + "type": "int", + "name": "GIT_DESCRIBE_TAGS", + "comments": "", + "value": 1 + }, + { + "type": "int", + "name": "GIT_DESCRIBE_ALL", + "comments": "", + "value": 2 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_diff", + { + "decl": "git_diff", + "type": "struct", + "value": "git_diff", + "file": "git2/diff.h", + "line": 196, + "lineto": 196, + "tdef": "typedef", + "description": " The diff object that contains all individual file deltas.", + "comments": "

A diff represents the cumulative list of differences between two snapshots of a repository (possibly filtered by a set of file name patterns).

\n\n

Calculating diffs is generally done in two phases: building a list of diffs then traversing it. This makes is easier to share logic across the various types of diffs (tree vs tree, workdir vs index, etc.), and also allows you to insert optional diff post-processing phases, such as rename detection, in between the steps. When you are done with a diff object, it must be freed.

\n\n

This is an opaque structure which will be allocated by one of the diff generator functions below (such as git_diff_tree_to_tree). You are responsible for releasing the object memory when done, using the git_diff_free() function.

\n", + "used": { + "returns": [ + "git_diff_get_delta", + "git_patch_get_delta", + "git_pathspec_match_list_diff_entry" + ], + "needs": [ + "git_apply", + "git_apply_delta_cb", + "git_apply_hunk_cb", + "git_apply_to_tree", + "git_checkout_notify_cb", + "git_diff_binary_cb", + "git_diff_blob_to_buffer", + "git_diff_blobs", + "git_diff_buffers", + "git_diff_commit_as_email", + "git_diff_file_cb", + "git_diff_find_options_init", + "git_diff_find_similar", + "git_diff_foreach", + "git_diff_format_email", + "git_diff_format_email_options_init", + "git_diff_free", + "git_diff_from_buffer", + "git_diff_get_delta", + "git_diff_get_stats", + "git_diff_hunk_cb", + "git_diff_index_to_index", + "git_diff_index_to_workdir", + "git_diff_is_sorted_icase", + "git_diff_line_cb", + "git_diff_merge", + "git_diff_notify_cb", + "git_diff_num_deltas", + "git_diff_num_deltas_of_type", + "git_diff_options_init", + "git_diff_patchid", + "git_diff_patchid_options_init", + "git_diff_print", + "git_diff_progress_cb", + "git_diff_stats_deletions", + "git_diff_stats_files_changed", + "git_diff_stats_free", + "git_diff_stats_insertions", + "git_diff_stats_to_buf", + "git_diff_to_buf", + "git_diff_tree_to_index", + "git_diff_tree_to_tree", + "git_diff_tree_to_workdir", + "git_diff_tree_to_workdir_with_index", + "git_patch_from_blob_and_buffer", + "git_patch_from_blobs", + "git_patch_from_buffers", + "git_patch_from_diff", + "git_patch_get_hunk", + "git_patch_get_line_in_hunk", + "git_patch_print", + "git_pathspec_match_diff" + ] + } + } + ], + [ + "git_diff_binary", + { + "decl": [ + "unsigned int contains_data", + "git_diff_binary_file old_file", + "git_diff_binary_file new_file" + ], + "type": "struct", + "value": "git_diff_binary", + "file": "git2/diff.h", + "line": 553, + "lineto": 565, + "block": "unsigned int contains_data\ngit_diff_binary_file old_file\ngit_diff_binary_file new_file", + "tdef": "typedef", + "description": " Structure describing the binary contents of a diff.", + "comments": "

A binary file / delta is a file (or pair) for which no text diffs should be generated. A diff can contain delta entries that are binary, but no diff content will be output for those files. There is a base heuristic for binary detection and you can further tune the behavior with git attributes or diff flags and option settings.

\n", + "fields": [ + { + "type": "unsigned int", + "name": "contains_data", + "comments": " Whether there is data in this binary structure or not.\n\n If this is `1`, then this was produced and included binary content.\n If this is `0` then this was generated knowing only that a binary\n file changed but without providing the data, probably from a patch\n that said `Binary files a/file.txt and b/file.txt differ`." + }, + { + "type": "git_diff_binary_file", + "name": "old_file", + "comments": " The contents of the old file. " + }, + { + "type": "git_diff_binary_file", + "name": "new_file", + "comments": " The contents of the new file. " + } + ], + "used": { + "returns": [], + "needs": [ + "git_diff_binary_cb", + "git_diff_blob_to_buffer", + "git_diff_blobs", + "git_diff_buffers", + "git_diff_foreach" + ] + } + } + ], + [ + "git_diff_binary_file", + { + "decl": [ + "git_diff_binary_t type", + "const char * data", + "size_t datalen", + "size_t inflatedlen" + ], + "type": "struct", + "value": "git_diff_binary_file", + "file": "git2/diff.h", + "line": 530, + "lineto": 542, + "block": "git_diff_binary_t type\nconst char * data\nsize_t datalen\nsize_t inflatedlen", + "tdef": "typedef", + "description": " The contents of one of the files in a binary diff. ", + "comments": "", + "fields": [ + { + "type": "git_diff_binary_t", + "name": "type", + "comments": " The type of binary data for this file. " + }, + { + "type": "const char *", + "name": "data", + "comments": " The binary data, deflated. " + }, + { + "type": "size_t", + "name": "datalen", + "comments": " The length of the binary data. " + }, + { + "type": "size_t", + "name": "inflatedlen", + "comments": " The length of the binary data after inflation. " + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_diff_binary_t", + { + "decl": [ + "GIT_DIFF_BINARY_NONE", + "GIT_DIFF_BINARY_LITERAL", + "GIT_DIFF_BINARY_DELTA" + ], + "type": "enum", + "file": "git2/diff.h", + "line": 518, + "lineto": 527, + "block": "GIT_DIFF_BINARY_NONE\nGIT_DIFF_BINARY_LITERAL\nGIT_DIFF_BINARY_DELTA", + "tdef": "typedef", + "description": " When producing a binary diff, the binary data returned will be\n either the deflated full (\"literal\") contents of the file, or\n the deflated binary delta between the two sides (whichever is\n smaller).", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_DIFF_BINARY_NONE", + "comments": "

There is no binary delta.

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_DIFF_BINARY_LITERAL", + "comments": "

The binary data is the literal contents of the file.

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_DIFF_BINARY_DELTA", + "comments": "

The binary data is the delta from one side to the other.

\n", + "value": 2 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_diff_delta", + { + "decl": [ + "git_delta_t status", + "uint32_t flags", + "uint16_t similarity", + "uint16_t nfiles", + "git_diff_file old_file", + "git_diff_file new_file" + ], + "type": "struct", + "value": "git_diff_delta", + "file": "git2/diff.h", + "line": 324, + "lineto": 331, + "block": "git_delta_t status\nuint32_t flags\nuint16_t similarity\nuint16_t nfiles\ngit_diff_file old_file\ngit_diff_file new_file", + "tdef": "typedef", + "description": " Description of changes to one entry.", + "comments": "

A delta is a file pair with an old and new revision. The old version may be absent if the file was just created and the new version may be absent if the file was deleted. A diff is mostly just a list of deltas.

\n\n

When iterating over a diff, this will be passed to most callbacks and you can use the contents to understand exactly what has changed.

\n\n

The old_file represents the "from" side of the diff and the new_file represents to "to" side of the diff. What those means depend on the function that was used to generate the diff and will be documented below. You can also use the GIT_DIFF_REVERSE flag to flip it around.

\n\n

Although the two sides of the delta are named "old_file" and "new_file", they actually may correspond to entries that represent a file, a symbolic link, a submodule commit id, or even a tree (if you are tracking type changes or ignored/untracked directories).

\n\n

Under some circumstances, in the name of efficiency, not all fields will be filled in, but we generally try to fill in as much as possible. One example is that the "flags" field may not have either the BINARY or the NOT_BINARY flag set to avoid examining file contents if you do not pass in hunk and/or line callbacks to the diff foreach iteration function. It will just use the git attributes for those files.

\n\n

The similarity score is zero unless you call git_diff_find_similar() which does a similarity analysis of files in the diff. Use that function to do rename and copy detection, and to split heavily modified files in add/delete pairs. After that call, deltas with a status of GIT_DELTA_RENAMED or GIT_DELTA_COPIED will have a similarity score between 0 and 100 indicating how similar the old and new sides are.

\n\n

If you ask git_diff_find_similar to find heavily modified files to break, but to not actually break the records, then GIT_DELTA_MODIFIED records may have a non-zero similarity score if the self-similarity is below the split threshold. To display this value like core Git, invert the score (a la printf("M%03d", 100 - delta->similarity)).

\n", + "fields": [ + { "type": "git_delta_t", "name": "status", "comments": "" }, + { + "type": "uint32_t", + "name": "flags", + "comments": " git_diff_flag_t values " + }, + { + "type": "uint16_t", + "name": "similarity", + "comments": " for RENAMED and COPIED, value 0-100 " + }, + { + "type": "uint16_t", + "name": "nfiles", + "comments": " number of files in this delta " + }, + { "type": "git_diff_file", "name": "old_file", "comments": "" }, + { "type": "git_diff_file", "name": "new_file", "comments": "" } + ], + "used": { + "returns": [ + "git_diff_get_delta", + "git_patch_get_delta", + "git_pathspec_match_list_diff_entry" + ], + "needs": [ + "git_apply_delta_cb", + "git_diff_binary_cb", + "git_diff_file_cb", + "git_diff_hunk_cb", + "git_diff_line_cb", + "git_diff_notify_cb" + ] + } + } + ], + [ + "git_diff_file", + { + "decl": [ + "git_oid id", + "const char * path", + "git_object_size_t size", + "uint32_t flags", + "uint16_t mode", + "uint16_t id_abbrev" + ], + "type": "struct", + "value": "git_diff_file", + "file": "git2/diff.h", + "line": 245, + "lineto": 282, + "block": "git_oid id\nconst char * path\ngit_object_size_t size\nuint32_t flags\nuint16_t mode\nuint16_t id_abbrev", + "tdef": "typedef", + "description": " Description of one side of a delta.", + "comments": "

Although this is called a "file", it could represent a file, a symbolic link, a submodule commit id, or even a tree (although that only if you are tracking type changes or ignored/untracked directories).

\n", + "fields": [ + { + "type": "git_oid", + "name": "id", + "comments": " The `git_oid` of the item. If the entry represents an\n absent side of a diff (e.g. the `old_file` of a `GIT_DELTA_ADDED` delta),\n then the oid will be zeroes." + }, + { + "type": "const char *", + "name": "path", + "comments": " The NUL-terminated path to the entry relative to the working\n directory of the repository." + }, + { + "type": "git_object_size_t", + "name": "size", + "comments": " The size of the entry in bytes." + }, + { + "type": "uint32_t", + "name": "flags", + "comments": " A combination of the `git_diff_flag_t` types" + }, + { + "type": "uint16_t", + "name": "mode", + "comments": " Roughly, the stat() `st_mode` value for the item. This will\n be restricted to one of the `git_filemode_t` values." + }, + { + "type": "uint16_t", + "name": "id_abbrev", + "comments": " Represents the known length of the `id` field, when\n converted to a hex string. It is generally `GIT_OID_SHA1_HEXSIZE`, unless this\n delta was created from reading a patch file, in which case it may be\n abbreviated to something reasonable, like 7 characters." + } + ], + "used": { + "returns": [], + "needs": [ + "git_checkout_notify_cb", + "git_diff_blob_to_buffer", + "git_diff_blobs", + "git_diff_buffers", + "git_diff_foreach" + ] + } + } + ], + [ + "git_diff_find_options", + { + "decl": [ + "unsigned int version", + "uint32_t flags", + "uint16_t rename_threshold", + "uint16_t rename_from_rewrite_threshold", + "uint16_t copy_threshold", + "uint16_t break_rewrite_threshold", + "size_t rename_limit", + "git_diff_similarity_metric * metric" + ], + "type": "struct", + "value": "git_diff_find_options", + "file": "git2/diff.h", + "line": 774, + "lineto": 828, + "block": "unsigned int version\nuint32_t flags\nuint16_t rename_threshold\nuint16_t rename_from_rewrite_threshold\nuint16_t copy_threshold\nuint16_t break_rewrite_threshold\nsize_t rename_limit\ngit_diff_similarity_metric * metric", + "tdef": "typedef", + "description": " Control behavior of rename and copy detection", + "comments": "

These options mostly mimic parameters that can be passed to git-diff.

\n", + "fields": [ + { "type": "unsigned int", "name": "version", "comments": "" }, + { + "type": "uint32_t", + "name": "flags", + "comments": " Combination of git_diff_find_t values (default GIT_DIFF_FIND_BY_CONFIG).\n NOTE: if you don't explicitly set this, `diff.renames` could be set\n to false, resulting in `git_diff_find_similar` doing nothing." + }, + { + "type": "uint16_t", + "name": "rename_threshold", + "comments": " Threshold above which similar files will be considered renames.\n This is equivalent to the -M option. Defaults to 50." + }, + { + "type": "uint16_t", + "name": "rename_from_rewrite_threshold", + "comments": " Threshold below which similar files will be eligible to be a rename source.\n This is equivalent to the first part of the -B option. Defaults to 50." + }, + { + "type": "uint16_t", + "name": "copy_threshold", + "comments": " Threshold above which similar files will be considered copies.\n This is equivalent to the -C option. Defaults to 50." + }, + { + "type": "uint16_t", + "name": "break_rewrite_threshold", + "comments": " Threshold below which similar files will be split into a delete/add pair.\n This is equivalent to the last part of the -B option. Defaults to 60." + }, + { + "type": "size_t", + "name": "rename_limit", + "comments": " Maximum number of matches to consider for a particular file.\n\n This is a little different from the `-l` option from Git because we\n will still process up to this many matches before abandoning the search.\n Defaults to 1000." + }, + { + "type": "git_diff_similarity_metric *", + "name": "metric", + "comments": " The `metric` option allows you to plug in a custom similarity metric.\n\n Set it to NULL to use the default internal metric.\n\n The default metric is based on sampling hashes of ranges of data in\n the file, which is a pretty good similarity approximation that should\n work fairly well for both text and binary data while still being\n pretty fast with a fixed memory overhead." + } + ], + "used": { + "returns": [], + "needs": ["git_diff_find_options_init", "git_diff_find_similar"] + } + } + ], + [ + "git_diff_find_t", + { + "decl": [ + "GIT_DIFF_FIND_BY_CONFIG", + "GIT_DIFF_FIND_RENAMES", + "GIT_DIFF_FIND_RENAMES_FROM_REWRITES", + "GIT_DIFF_FIND_COPIES", + "GIT_DIFF_FIND_COPIES_FROM_UNMODIFIED", + "GIT_DIFF_FIND_REWRITES", + "GIT_DIFF_BREAK_REWRITES", + "GIT_DIFF_FIND_AND_BREAK_REWRITES", + "GIT_DIFF_FIND_FOR_UNTRACKED", + "GIT_DIFF_FIND_ALL", + "GIT_DIFF_FIND_IGNORE_LEADING_WHITESPACE", + "GIT_DIFF_FIND_IGNORE_WHITESPACE", + "GIT_DIFF_FIND_DONT_IGNORE_WHITESPACE", + "GIT_DIFF_FIND_EXACT_MATCH_ONLY", + "GIT_DIFF_BREAK_REWRITES_FOR_RENAMES_ONLY", + "GIT_DIFF_FIND_REMOVE_UNMODIFIED" + ], + "type": "enum", + "file": "git2/diff.h", + "line": 683, + "lineto": 752, + "block": "GIT_DIFF_FIND_BY_CONFIG\nGIT_DIFF_FIND_RENAMES\nGIT_DIFF_FIND_RENAMES_FROM_REWRITES\nGIT_DIFF_FIND_COPIES\nGIT_DIFF_FIND_COPIES_FROM_UNMODIFIED\nGIT_DIFF_FIND_REWRITES\nGIT_DIFF_BREAK_REWRITES\nGIT_DIFF_FIND_AND_BREAK_REWRITES\nGIT_DIFF_FIND_FOR_UNTRACKED\nGIT_DIFF_FIND_ALL\nGIT_DIFF_FIND_IGNORE_LEADING_WHITESPACE\nGIT_DIFF_FIND_IGNORE_WHITESPACE\nGIT_DIFF_FIND_DONT_IGNORE_WHITESPACE\nGIT_DIFF_FIND_EXACT_MATCH_ONLY\nGIT_DIFF_BREAK_REWRITES_FOR_RENAMES_ONLY\nGIT_DIFF_FIND_REMOVE_UNMODIFIED", + "tdef": "typedef", + "description": " Flags to control the behavior of diff rename/copy detection.", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_DIFF_FIND_BY_CONFIG", + "comments": "

Obey diff.renames. Overridden by any other GIT_DIFF_FIND_... flag.

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_DIFF_FIND_RENAMES", + "comments": "

Look for renames? (--find-renames)

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_DIFF_FIND_RENAMES_FROM_REWRITES", + "comments": "

Consider old side of MODIFIED for renames? (--break-rewrites=N)

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_DIFF_FIND_COPIES", + "comments": "

Look for copies? (a la --find-copies).

\n", + "value": 4 + }, + { + "type": "int", + "name": "GIT_DIFF_FIND_COPIES_FROM_UNMODIFIED", + "comments": "

Consider UNMODIFIED as copy sources? (--find-copies-harder).

\n\n

For this to work correctly, use GIT_DIFF_INCLUDE_UNMODIFIED when\n the initial git_diff is being generated.

\n", + "value": 8 + }, + { + "type": "int", + "name": "GIT_DIFF_FIND_REWRITES", + "comments": "

Mark significant rewrites for split (--break-rewrites=/M)

\n", + "value": 16 + }, + { + "type": "int", + "name": "GIT_DIFF_BREAK_REWRITES", + "comments": "

Actually split large rewrites into delete/add pairs

\n", + "value": 32 + }, + { + "type": "int", + "name": "GIT_DIFF_FIND_AND_BREAK_REWRITES", + "comments": "

Mark rewrites for split and break into delete/add pairs

\n", + "value": 48 + }, + { + "type": "int", + "name": "GIT_DIFF_FIND_FOR_UNTRACKED", + "comments": "

Find renames/copies for UNTRACKED items in working directory.

\n\n

For this to work correctly, use GIT_DIFF_INCLUDE_UNTRACKED when the\n initial git_diff is being generated (and obviously the diff must\n be against the working directory for this to make sense).

\n", + "value": 64 + }, + { + "type": "int", + "name": "GIT_DIFF_FIND_ALL", + "comments": "

Turn on all finding features.

\n", + "value": 255 + }, + { + "type": "int", + "name": "GIT_DIFF_FIND_IGNORE_LEADING_WHITESPACE", + "comments": "

Measure similarity ignoring leading whitespace (default)

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_DIFF_FIND_IGNORE_WHITESPACE", + "comments": "

Measure similarity ignoring all whitespace

\n", + "value": 4096 + }, + { + "type": "int", + "name": "GIT_DIFF_FIND_DONT_IGNORE_WHITESPACE", + "comments": "

Measure similarity including all data

\n", + "value": 8192 + }, + { + "type": "int", + "name": "GIT_DIFF_FIND_EXACT_MATCH_ONLY", + "comments": "

Measure similarity only by comparing SHAs (fast and cheap)

\n", + "value": 16384 + }, + { + "type": "int", + "name": "GIT_DIFF_BREAK_REWRITES_FOR_RENAMES_ONLY", + "comments": "

Do not break rewrites unless they contribute to a rename.

\n\n

Normally, GIT_DIFF_FIND_AND_BREAK_REWRITES will measure the self-\n similarity of modified files and split the ones that have changed a\n lot into a DELETE / ADD pair. Then the sides of that pair will be\n considered candidates for rename and copy detection.

\n\n

If you add this flag in and the split pair is not used for an\n actual rename or copy, then the modified record will be restored to\n a regular MODIFIED record instead of being split.

\n", + "value": 32768 + }, + { + "type": "int", + "name": "GIT_DIFF_FIND_REMOVE_UNMODIFIED", + "comments": "

Remove any UNMODIFIED deltas after find_similar is done.

\n\n

Using GIT_DIFF_FIND_COPIES_FROM_UNMODIFIED to emulate the\n --find-copies-harder behavior requires building a diff with the\n GIT_DIFF_INCLUDE_UNMODIFIED flag. If you do not want UNMODIFIED\n records in the final result, pass this flag to have them removed.

\n", + "value": 65536 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_diff_flag_t", + { + "decl": [ + "GIT_DIFF_FLAG_BINARY", + "GIT_DIFF_FLAG_NOT_BINARY", + "GIT_DIFF_FLAG_VALID_ID", + "GIT_DIFF_FLAG_EXISTS", + "GIT_DIFF_FLAG_VALID_SIZE" + ], + "type": "enum", + "file": "git2/diff.h", + "line": 206, + "lineto": 212, + "block": "GIT_DIFF_FLAG_BINARY\nGIT_DIFF_FLAG_NOT_BINARY\nGIT_DIFF_FLAG_VALID_ID\nGIT_DIFF_FLAG_EXISTS\nGIT_DIFF_FLAG_VALID_SIZE", + "tdef": "typedef", + "description": " Flags for the delta object and the file objects on each side.", + "comments": "

These flags are used for both the flags value of the git_diff_delta and the flags for the git_diff_file objects representing the old and new sides of the delta. Values outside of this public range should be considered reserved for internal or future use.

\n", + "fields": [ + { + "type": "int", + "name": "GIT_DIFF_FLAG_BINARY", + "comments": "

file(s) treated as binary data

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_DIFF_FLAG_NOT_BINARY", + "comments": "

file(s) treated as text data

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_DIFF_FLAG_VALID_ID", + "comments": "

id value is known correct

\n", + "value": 4 + }, + { + "type": "int", + "name": "GIT_DIFF_FLAG_EXISTS", + "comments": "

file exists at this side of the delta

\n", + "value": 8 + }, + { + "type": "int", + "name": "GIT_DIFF_FLAG_VALID_SIZE", + "comments": "

file size value is known correct

\n", + "value": 16 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_diff_format_email_flags_t", + { + "decl": [ + "GIT_DIFF_FORMAT_EMAIL_NONE", + "GIT_DIFF_FORMAT_EMAIL_EXCLUDE_SUBJECT_PATCH_MARKER" + ], + "type": "enum", + "file": "git2/deprecated.h", + "line": 325, + "lineto": 331, + "block": "GIT_DIFF_FORMAT_EMAIL_NONE\nGIT_DIFF_FORMAT_EMAIL_EXCLUDE_SUBJECT_PATCH_MARKER", + "tdef": "typedef", + "description": " Formatting options for diff e-mail generation", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_DIFF_FORMAT_EMAIL_NONE", + "comments": "

Normal patch, the default

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_DIFF_FORMAT_EMAIL_EXCLUDE_SUBJECT_PATCH_MARKER", + "comments": "

Don't insert "[PATCH]" in the subject header

\n", + "value": 1 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_diff_format_email_options", + { + "decl": [ + "unsigned int version", + "uint32_t flags", + "size_t patch_no", + "size_t total_patches", + "const git_oid * id", + "const char * summary", + "const char * body", + "const git_signature * author" + ], + "type": "struct", + "value": "git_diff_format_email_options", + "file": "git2/deprecated.h", + "line": 338, + "lineto": 361, + "block": "unsigned int version\nuint32_t flags\nsize_t patch_no\nsize_t total_patches\nconst git_oid * id\nconst char * summary\nconst char * body\nconst git_signature * author", + "tdef": "typedef", + "description": " Options for controlling the formatting of the generated e-mail.", + "comments": "", + "fields": [ + { "type": "unsigned int", "name": "version", "comments": "" }, + { + "type": "uint32_t", + "name": "flags", + "comments": " see `git_diff_format_email_flags_t` above " + }, + { + "type": "size_t", + "name": "patch_no", + "comments": " This patch number " + }, + { + "type": "size_t", + "name": "total_patches", + "comments": " Total number of patches in this series " + }, + { + "type": "const git_oid *", + "name": "id", + "comments": " id to use for the commit " + }, + { + "type": "const char *", + "name": "summary", + "comments": " Summary of the change " + }, + { + "type": "const char *", + "name": "body", + "comments": " Commit message's body " + }, + { + "type": "const git_signature *", + "name": "author", + "comments": " Author of the change " + } + ], + "used": { + "returns": [], + "needs": [ + "git_diff_format_email", + "git_diff_format_email_options_init" + ] + } + } + ], + [ + "git_diff_format_t", + { + "decl": [ + "GIT_DIFF_FORMAT_PATCH", + "GIT_DIFF_FORMAT_PATCH_HEADER", + "GIT_DIFF_FORMAT_RAW", + "GIT_DIFF_FORMAT_NAME_ONLY", + "GIT_DIFF_FORMAT_NAME_STATUS", + "GIT_DIFF_FORMAT_PATCH_ID" + ], + "type": "enum", + "file": "git2/diff.h", + "line": 1156, + "lineto": 1163, + "block": "GIT_DIFF_FORMAT_PATCH\nGIT_DIFF_FORMAT_PATCH_HEADER\nGIT_DIFF_FORMAT_RAW\nGIT_DIFF_FORMAT_NAME_ONLY\nGIT_DIFF_FORMAT_NAME_STATUS\nGIT_DIFF_FORMAT_PATCH_ID", + "tdef": "typedef", + "description": " Possible output formats for diff data", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_DIFF_FORMAT_PATCH", + "comments": "

full git diff

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_DIFF_FORMAT_PATCH_HEADER", + "comments": "

just the file headers of patch

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_DIFF_FORMAT_RAW", + "comments": "

like git diff --raw

\n", + "value": 3 + }, + { + "type": "int", + "name": "GIT_DIFF_FORMAT_NAME_ONLY", + "comments": "

like git diff --name-only

\n", + "value": 4 + }, + { + "type": "int", + "name": "GIT_DIFF_FORMAT_NAME_STATUS", + "comments": "

like git diff --name-status

\n", + "value": 5 + }, + { + "type": "int", + "name": "GIT_DIFF_FORMAT_PATCH_ID", + "comments": "

git diff as used by git patch-id

\n", + "value": 6 + } + ], + "used": { + "returns": [], + "needs": ["git_diff_print", "git_diff_to_buf"] + } + } + ], + [ + "git_diff_hunk", + { + "decl": [ + "int old_start", + "int old_lines", + "int new_start", + "int new_lines", + "size_t header_len", + "char [128] header" + ], + "type": "struct", + "value": "git_diff_hunk", + "file": "git2/diff.h", + "line": 590, + "lineto": 597, + "block": "int old_start\nint old_lines\nint new_start\nint new_lines\nsize_t header_len\nchar [128] header", + "tdef": "typedef", + "description": " Structure describing a hunk of a diff.", + "comments": "

A hunk is a span of modified lines in a delta along with some stable surrounding context. You can configure the amount of context and other properties of how hunks are generated. Each hunk also comes with a header that described where it starts and ends in both the old and new versions in the delta.

\n", + "fields": [ + { + "type": "int", + "name": "old_start", + "comments": " Starting line number in old_file " + }, + { + "type": "int", + "name": "old_lines", + "comments": " Number of lines in old_file " + }, + { + "type": "int", + "name": "new_start", + "comments": " Starting line number in new_file " + }, + { + "type": "int", + "name": "new_lines", + "comments": " Number of lines in new_file " + }, + { + "type": "size_t", + "name": "header_len", + "comments": " Number of bytes in header text " + }, + { + "type": "char [128]", + "name": "header", + "comments": " Header text, NUL-byte terminated " + } + ], + "used": { + "returns": [], + "needs": [ + "git_apply_hunk_cb", + "git_diff_blob_to_buffer", + "git_diff_blobs", + "git_diff_buffers", + "git_diff_foreach", + "git_diff_hunk_cb", + "git_diff_line_cb", + "git_patch_get_hunk" + ] + } + } + ], + [ + "git_diff_line", + { + "decl": [ + "char origin", + "int old_lineno", + "int new_lineno", + "int num_lines", + "size_t content_len", + "git_off_t content_offset", + "const char * content" + ], + "type": "struct", + "value": "git_diff_line", + "file": "git2/diff.h", + "line": 650, + "lineto": 658, + "block": "char origin\nint old_lineno\nint new_lineno\nint num_lines\nsize_t content_len\ngit_off_t content_offset\nconst char * content", + "tdef": "typedef", + "description": " Structure describing a line (or data span) of a diff.", + "comments": "

A line is a range of characters inside a hunk. It could be a context line (i.e. in both old and new versions), an added line (i.e. only in the new version), or a removed line (i.e. only in the old version). Unfortunately, we don't know anything about the encoding of data in the file being diffed, so we cannot tell you much about the line content. Line data will not be NUL-byte terminated, however, because it will be just a span of bytes inside the larger file.

\n", + "fields": [ + { + "type": "char", + "name": "origin", + "comments": " A git_diff_line_t value " + }, + { + "type": "int", + "name": "old_lineno", + "comments": " Line number in old file or -1 for added line " + }, + { + "type": "int", + "name": "new_lineno", + "comments": " Line number in new file or -1 for deleted line " + }, + { + "type": "int", + "name": "num_lines", + "comments": " Number of newline characters in content " + }, + { + "type": "size_t", + "name": "content_len", + "comments": " Number of bytes of data " + }, + { + "type": "git_off_t", + "name": "content_offset", + "comments": " Offset in the original file to the content " + }, + { + "type": "const char *", + "name": "content", + "comments": " Pointer to diff text, not NUL-byte terminated " + } + ], + "used": { + "returns": [], + "needs": [ + "git_diff_blob_to_buffer", + "git_diff_blobs", + "git_diff_buffers", + "git_diff_foreach", + "git_diff_line_cb", + "git_diff_print", + "git_patch_get_line_in_hunk", + "git_patch_print" + ] + } + } + ], + [ + "git_diff_line_t", + { + "decl": [ + "GIT_DIFF_LINE_CONTEXT", + "GIT_DIFF_LINE_ADDITION", + "GIT_DIFF_LINE_DELETION", + "GIT_DIFF_LINE_CONTEXT_EOFNL", + "GIT_DIFF_LINE_ADD_EOFNL", + "GIT_DIFF_LINE_DEL_EOFNL", + "GIT_DIFF_LINE_FILE_HDR", + "GIT_DIFF_LINE_HUNK_HDR", + "GIT_DIFF_LINE_BINARY" + ], + "type": "enum", + "file": "git2/diff.h", + "line": 621, + "lineto": 637, + "block": "GIT_DIFF_LINE_CONTEXT\nGIT_DIFF_LINE_ADDITION\nGIT_DIFF_LINE_DELETION\nGIT_DIFF_LINE_CONTEXT_EOFNL\nGIT_DIFF_LINE_ADD_EOFNL\nGIT_DIFF_LINE_DEL_EOFNL\nGIT_DIFF_LINE_FILE_HDR\nGIT_DIFF_LINE_HUNK_HDR\nGIT_DIFF_LINE_BINARY", + "tdef": "typedef", + "description": " Line origin constants.", + "comments": "

These values describe where a line came from and will be passed to the git_diff_line_cb when iterating over a diff. There are some special origin constants at the end that are used for the text output callbacks to demarcate lines that are actually part of the file or hunk headers.

\n", + "fields": [ + { + "type": "int", + "name": "GIT_DIFF_LINE_CONTEXT", + "comments": "", + "value": 32 + }, + { + "type": "int", + "name": "GIT_DIFF_LINE_ADDITION", + "comments": "", + "value": 43 + }, + { + "type": "int", + "name": "GIT_DIFF_LINE_DELETION", + "comments": "", + "value": 45 + }, + { + "type": "int", + "name": "GIT_DIFF_LINE_CONTEXT_EOFNL", + "comments": "

Both files have no LF at end

\n", + "value": 61 + }, + { + "type": "int", + "name": "GIT_DIFF_LINE_ADD_EOFNL", + "comments": "

Old has no LF at end, new does

\n", + "value": 62 + }, + { + "type": "int", + "name": "GIT_DIFF_LINE_DEL_EOFNL", + "comments": "

Old has LF at end, new does not

\n", + "value": 60 + }, + { + "type": "int", + "name": "GIT_DIFF_LINE_FILE_HDR", + "comments": "", + "value": 70 + }, + { + "type": "int", + "name": "GIT_DIFF_LINE_HUNK_HDR", + "comments": "", + "value": 72 + }, + { + "type": "int", + "name": "GIT_DIFF_LINE_BINARY", + "comments": "

For "Binary files x and y differ"

\n", + "value": 66 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_diff_option_t", + { + "decl": [ + "GIT_DIFF_NORMAL", + "GIT_DIFF_REVERSE", + "GIT_DIFF_INCLUDE_IGNORED", + "GIT_DIFF_RECURSE_IGNORED_DIRS", + "GIT_DIFF_INCLUDE_UNTRACKED", + "GIT_DIFF_RECURSE_UNTRACKED_DIRS", + "GIT_DIFF_INCLUDE_UNMODIFIED", + "GIT_DIFF_INCLUDE_TYPECHANGE", + "GIT_DIFF_INCLUDE_TYPECHANGE_TREES", + "GIT_DIFF_IGNORE_FILEMODE", + "GIT_DIFF_IGNORE_SUBMODULES", + "GIT_DIFF_IGNORE_CASE", + "GIT_DIFF_INCLUDE_CASECHANGE", + "GIT_DIFF_DISABLE_PATHSPEC_MATCH", + "GIT_DIFF_SKIP_BINARY_CHECK", + "GIT_DIFF_ENABLE_FAST_UNTRACKED_DIRS", + "GIT_DIFF_UPDATE_INDEX", + "GIT_DIFF_INCLUDE_UNREADABLE", + "GIT_DIFF_INCLUDE_UNREADABLE_AS_UNTRACKED", + "GIT_DIFF_INDENT_HEURISTIC", + "GIT_DIFF_IGNORE_BLANK_LINES", + "GIT_DIFF_FORCE_TEXT", + "GIT_DIFF_FORCE_BINARY", + "GIT_DIFF_IGNORE_WHITESPACE", + "GIT_DIFF_IGNORE_WHITESPACE_CHANGE", + "GIT_DIFF_IGNORE_WHITESPACE_EOL", + "GIT_DIFF_SHOW_UNTRACKED_CONTENT", + "GIT_DIFF_SHOW_UNMODIFIED", + "GIT_DIFF_PATIENCE", + "GIT_DIFF_MINIMAL", + "GIT_DIFF_SHOW_BINARY" + ], + "type": "enum", + "file": "git2/diff.h", + "line": 28, + "lineto": 174, + "block": "GIT_DIFF_NORMAL\nGIT_DIFF_REVERSE\nGIT_DIFF_INCLUDE_IGNORED\nGIT_DIFF_RECURSE_IGNORED_DIRS\nGIT_DIFF_INCLUDE_UNTRACKED\nGIT_DIFF_RECURSE_UNTRACKED_DIRS\nGIT_DIFF_INCLUDE_UNMODIFIED\nGIT_DIFF_INCLUDE_TYPECHANGE\nGIT_DIFF_INCLUDE_TYPECHANGE_TREES\nGIT_DIFF_IGNORE_FILEMODE\nGIT_DIFF_IGNORE_SUBMODULES\nGIT_DIFF_IGNORE_CASE\nGIT_DIFF_INCLUDE_CASECHANGE\nGIT_DIFF_DISABLE_PATHSPEC_MATCH\nGIT_DIFF_SKIP_BINARY_CHECK\nGIT_DIFF_ENABLE_FAST_UNTRACKED_DIRS\nGIT_DIFF_UPDATE_INDEX\nGIT_DIFF_INCLUDE_UNREADABLE\nGIT_DIFF_INCLUDE_UNREADABLE_AS_UNTRACKED\nGIT_DIFF_INDENT_HEURISTIC\nGIT_DIFF_IGNORE_BLANK_LINES\nGIT_DIFF_FORCE_TEXT\nGIT_DIFF_FORCE_BINARY\nGIT_DIFF_IGNORE_WHITESPACE\nGIT_DIFF_IGNORE_WHITESPACE_CHANGE\nGIT_DIFF_IGNORE_WHITESPACE_EOL\nGIT_DIFF_SHOW_UNTRACKED_CONTENT\nGIT_DIFF_SHOW_UNMODIFIED\nGIT_DIFF_PATIENCE\nGIT_DIFF_MINIMAL\nGIT_DIFF_SHOW_BINARY", + "tdef": "typedef", + "description": " Flags for diff options. A combination of these flags can be passed\n in via the `flags` value in the `git_diff_options`.", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_DIFF_NORMAL", + "comments": "

Normal diff, the default

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_DIFF_REVERSE", + "comments": "

Reverse the sides of the diff

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_DIFF_INCLUDE_IGNORED", + "comments": "

Include ignored files in the diff

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_DIFF_RECURSE_IGNORED_DIRS", + "comments": "

Even with GIT_DIFF_INCLUDE_IGNORED, an entire ignored directory\n will be marked with only a single entry in the diff; this flag\n adds all files under the directory as IGNORED entries, too.

\n", + "value": 4 + }, + { + "type": "int", + "name": "GIT_DIFF_INCLUDE_UNTRACKED", + "comments": "

Include untracked files in the diff

\n", + "value": 8 + }, + { + "type": "int", + "name": "GIT_DIFF_RECURSE_UNTRACKED_DIRS", + "comments": "

Even with GIT_DIFF_INCLUDE_UNTRACKED, an entire untracked\n directory will be marked with only a single entry in the diff\n (a la what core Git does in git status); this flag adds all\n files under untracked directories as UNTRACKED entries, too.

\n", + "value": 16 + }, + { + "type": "int", + "name": "GIT_DIFF_INCLUDE_UNMODIFIED", + "comments": "

Include unmodified files in the diff

\n", + "value": 32 + }, + { + "type": "int", + "name": "GIT_DIFF_INCLUDE_TYPECHANGE", + "comments": "

Normally, a type change between files will be converted into a\n DELETED record for the old and an ADDED record for the new; this\n options enabled the generation of TYPECHANGE delta records.

\n", + "value": 64 + }, + { + "type": "int", + "name": "GIT_DIFF_INCLUDE_TYPECHANGE_TREES", + "comments": "

Even with GIT_DIFF_INCLUDE_TYPECHANGE, blob->tree changes still\n generally show as a DELETED blob. This flag tries to correctly\n label blob->tree transitions as TYPECHANGE records with new_file's\n mode set to tree. Note: the tree SHA will not be available.

\n", + "value": 128 + }, + { + "type": "int", + "name": "GIT_DIFF_IGNORE_FILEMODE", + "comments": "

Ignore file mode changes

\n", + "value": 256 + }, + { + "type": "int", + "name": "GIT_DIFF_IGNORE_SUBMODULES", + "comments": "

Treat all submodules as unmodified

\n", + "value": 512 + }, + { + "type": "int", + "name": "GIT_DIFF_IGNORE_CASE", + "comments": "

Use case insensitive filename comparisons

\n", + "value": 1024 + }, + { + "type": "int", + "name": "GIT_DIFF_INCLUDE_CASECHANGE", + "comments": "

May be combined with GIT_DIFF_IGNORE_CASE to specify that a file\n that has changed case will be returned as an add/delete pair.

\n", + "value": 2048 + }, + { + "type": "int", + "name": "GIT_DIFF_DISABLE_PATHSPEC_MATCH", + "comments": "

If the pathspec is set in the diff options, this flags indicates\n that the paths will be treated as literal paths instead of\n fnmatch patterns. Each path in the list must either be a full\n path to a file or a directory. (A trailing slash indicates that\n the path will only match a directory). If a directory is\n specified, all children will be included.

\n", + "value": 4096 + }, + { + "type": "int", + "name": "GIT_DIFF_SKIP_BINARY_CHECK", + "comments": "

Disable updating of the binary flag in delta records. This is\n useful when iterating over a diff if you don't need hunk and data\n callbacks and want to avoid having to load file completely.

\n", + "value": 8192 + }, + { + "type": "int", + "name": "GIT_DIFF_ENABLE_FAST_UNTRACKED_DIRS", + "comments": "

When diff finds an untracked directory, to match the behavior of\n core Git, it scans the contents for IGNORED and UNTRACKED files.\n If all contents are IGNORED, then the directory is IGNORED; if\n any contents are not IGNORED, then the directory is UNTRACKED.\n This is extra work that may not matter in many cases. This flag\n turns off that scan and immediately labels an untracked directory\n as UNTRACKED (changing the behavior to not match core Git).

\n", + "value": 16384 + }, + { + "type": "int", + "name": "GIT_DIFF_UPDATE_INDEX", + "comments": "

When diff finds a file in the working directory with stat\n information different from the index, but the OID ends up being the\n same, write the correct stat information into the index. Note:\n without this flag, diff will always leave the index untouched.

\n", + "value": 32768 + }, + { + "type": "int", + "name": "GIT_DIFF_INCLUDE_UNREADABLE", + "comments": "

Include unreadable files in the diff

\n", + "value": 65536 + }, + { + "type": "int", + "name": "GIT_DIFF_INCLUDE_UNREADABLE_AS_UNTRACKED", + "comments": "

Include unreadable files in the diff

\n", + "value": 131072 + }, + { + "type": "int", + "name": "GIT_DIFF_INDENT_HEURISTIC", + "comments": "

Use a heuristic that takes indentation and whitespace into account\n which generally can produce better diffs when dealing with ambiguous\n diff hunks.

\n", + "value": 262144 + }, + { + "type": "int", + "name": "GIT_DIFF_IGNORE_BLANK_LINES", + "comments": "

Ignore blank lines

\n", + "value": 524288 + }, + { + "type": "int", + "name": "GIT_DIFF_FORCE_TEXT", + "comments": "

Treat all files as text, disabling binary attributes \n&\n detection

\n", + "value": 1048576 + }, + { + "type": "int", + "name": "GIT_DIFF_FORCE_BINARY", + "comments": "

Treat all files as binary, disabling text diffs

\n", + "value": 2097152 + }, + { + "type": "int", + "name": "GIT_DIFF_IGNORE_WHITESPACE", + "comments": "

Ignore all whitespace

\n", + "value": 4194304 + }, + { + "type": "int", + "name": "GIT_DIFF_IGNORE_WHITESPACE_CHANGE", + "comments": "

Ignore changes in amount of whitespace

\n", + "value": 8388608 + }, + { + "type": "int", + "name": "GIT_DIFF_IGNORE_WHITESPACE_EOL", + "comments": "

Ignore whitespace at end of line

\n", + "value": 16777216 + }, + { + "type": "int", + "name": "GIT_DIFF_SHOW_UNTRACKED_CONTENT", + "comments": "

When generating patch text, include the content of untracked\n files. This automatically turns on GIT_DIFF_INCLUDE_UNTRACKED but\n it does not turn on GIT_DIFF_RECURSE_UNTRACKED_DIRS. Add that\n flag if you want the content of every single UNTRACKED file.

\n", + "value": 33554432 + }, + { + "type": "int", + "name": "GIT_DIFF_SHOW_UNMODIFIED", + "comments": "

When generating output, include the names of unmodified files if\n they are included in the git_diff. Normally these are skipped in\n the formats that list files (e.g. name-only, name-status, raw).\n Even with this, these will not be included in patch format.

\n", + "value": 67108864 + }, + { + "type": "int", + "name": "GIT_DIFF_PATIENCE", + "comments": "

Use the "patience diff" algorithm

\n", + "value": 268435456 + }, + { + "type": "int", + "name": "GIT_DIFF_MINIMAL", + "comments": "

Take extra time to find minimal diff

\n", + "value": 536870912 + }, + { + "type": "int", + "name": "GIT_DIFF_SHOW_BINARY", + "comments": "

Include the necessary deflate / delta information so that git-apply\n can apply given diff information to binary files.

\n", + "value": 1073741824 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_diff_options", + { + "decl": [ + "unsigned int version", + "uint32_t flags", + "git_submodule_ignore_t ignore_submodules", + "git_strarray pathspec", + "git_diff_notify_cb notify_cb", + "git_diff_progress_cb progress_cb", + "void * payload", + "uint32_t context_lines", + "uint32_t interhunk_lines", + "git_oid_t oid_type", + "uint16_t id_abbrev", + "git_off_t max_size", + "const char * old_prefix", + "const char * new_prefix" + ], + "type": "struct", + "value": "git_diff_options", + "file": "git2/diff.h", + "line": 383, + "lineto": 471, + "block": "unsigned int version\nuint32_t flags\ngit_submodule_ignore_t ignore_submodules\ngit_strarray pathspec\ngit_diff_notify_cb notify_cb\ngit_diff_progress_cb progress_cb\nvoid * payload\nuint32_t context_lines\nuint32_t interhunk_lines\ngit_oid_t oid_type\nuint16_t id_abbrev\ngit_off_t max_size\nconst char * old_prefix\nconst char * new_prefix", + "tdef": "typedef", + "description": " Structure describing options about how the diff should be executed.", + "comments": "

Setting all values of the structure to zero will yield the default values. Similarly, passing NULL for the options structure will give the defaults. The default values are marked below.

\n", + "fields": [ + { + "type": "unsigned int", + "name": "version", + "comments": " version for the struct " + }, + { + "type": "uint32_t", + "name": "flags", + "comments": " A combination of `git_diff_option_t` values above.\n Defaults to GIT_DIFF_NORMAL" + }, + { + "type": "git_submodule_ignore_t", + "name": "ignore_submodules", + "comments": " Overrides the submodule ignore setting for all submodules in the diff. " + }, + { + "type": "git_strarray", + "name": "pathspec", + "comments": " An array of paths / fnmatch patterns to constrain diff.\n All paths are included by default." + }, + { + "type": "git_diff_notify_cb", + "name": "notify_cb", + "comments": " An optional callback function, notifying the consumer of changes to\n the diff as new deltas are added." + }, + { + "type": "git_diff_progress_cb", + "name": "progress_cb", + "comments": " An optional callback function, notifying the consumer of which files\n are being examined as the diff is generated." + }, + { + "type": "void *", + "name": "payload", + "comments": " The payload to pass to the callback functions. " + }, + { + "type": "uint32_t", + "name": "context_lines", + "comments": " The number of unchanged lines that define the boundary of a hunk\n (and to display before and after). Defaults to 3." + }, + { + "type": "uint32_t", + "name": "interhunk_lines", + "comments": " The maximum number of unchanged lines between hunk boundaries before\n the hunks will be merged into one. Defaults to 0." + }, + { + "type": "git_oid_t", + "name": "oid_type", + "comments": " The object ID type to emit in diffs; this is used by functions\n that operate without a repository - namely `git_diff_buffers`,\n or `git_diff_blobs` and `git_diff_blob_to_buffer` when one blob\n is `NULL`.\n\n This may be omitted (set to `0`). If a repository is available,\n the object ID format of the repository will be used. If no\n repository is available then the default is `GIT_OID_SHA`.\n\n If this is specified and a repository is available, then the\n specified `oid_type` must match the repository's object ID\n format." + }, + { + "type": "uint16_t", + "name": "id_abbrev", + "comments": " The abbreviation length to use when formatting object ids.\n Defaults to the value of 'core.abbrev' from the config, or 7 if unset." + }, + { + "type": "git_off_t", + "name": "max_size", + "comments": " A size (in bytes) above which a blob will be marked as binary\n automatically; pass a negative value to disable.\n Defaults to 512MB." + }, + { + "type": "const char *", + "name": "old_prefix", + "comments": " The virtual \"directory\" prefix for old file names in hunk headers.\n Default is \"a\"." + }, + { + "type": "const char *", + "name": "new_prefix", + "comments": " The virtual \"directory\" prefix for new file names in hunk headers.\n Defaults to \"b\"." + } + ], + "used": { + "returns": [], + "needs": [ + "git_diff_blob_to_buffer", + "git_diff_blobs", + "git_diff_buffers", + "git_diff_commit_as_email", + "git_diff_index_to_index", + "git_diff_index_to_workdir", + "git_diff_options_init", + "git_diff_tree_to_index", + "git_diff_tree_to_tree", + "git_diff_tree_to_workdir", + "git_diff_tree_to_workdir_with_index", + "git_patch_from_blob_and_buffer", + "git_patch_from_blobs", + "git_patch_from_buffers" + ] + } + } + ], + [ + "git_diff_parse_options", + { + "decl": ["unsigned int version", "git_oid_t oid_type"], + "type": "struct", + "value": "git_diff_parse_options", + "file": "git2/diff.h", + "line": 1322, + "lineto": 1325, + "block": "unsigned int version\ngit_oid_t oid_type", + "tdef": "typedef", + "description": " Options for parsing a diff / patch file.", + "comments": "", + "fields": [ + { "type": "unsigned int", "name": "version", "comments": "" }, + { "type": "git_oid_t", "name": "oid_type", "comments": "" } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_diff_patchid_options", + { + "decl": ["unsigned int version"], + "type": "struct", + "value": "git_diff_patchid_options", + "file": "git2/diff.h", + "line": 1459, + "lineto": 1461, + "block": "unsigned int version", + "tdef": "typedef", + "description": " Patch ID options structure", + "comments": "

Initialize with GIT_PATCHID_OPTIONS_INIT. Alternatively, you can use git_diff_patchid_options_init.

\n", + "fields": [ + { "type": "unsigned int", "name": "version", "comments": "" } + ], + "used": { + "returns": [], + "needs": ["git_diff_patchid", "git_diff_patchid_options_init"] + } + } + ], + [ + "git_diff_similarity_metric", + { + "decl": [ + "int (*)(void **, const git_diff_file *, const char *, void *) file_signature", + "int (*)(void **, const git_diff_file *, const char *, size_t, void *) buffer_signature", + "void (*)(void *, void *) free_signature", + "int (*)(int *, void *, void *, void *) similarity", + "void * payload" + ], + "type": "struct", + "value": "git_diff_similarity_metric", + "file": "git2/diff.h", + "line": 757, + "lineto": 767, + "block": "int (*)(void **, const git_diff_file *, const char *, void *) file_signature\nint (*)(void **, const git_diff_file *, const char *, size_t, void *) buffer_signature\nvoid (*)(void *, void *) free_signature\nint (*)(int *, void *, void *, void *) similarity\nvoid * payload", + "tdef": "typedef", + "description": " Pluggable similarity metric", + "comments": "", + "fields": [ + { + "type": "int (*)(void **, const git_diff_file *, const char *, void *)", + "name": "file_signature", + "comments": "" + }, + { + "type": "int (*)(void **, const git_diff_file *, const char *, size_t, void *)", + "name": "buffer_signature", + "comments": "" + }, + { + "type": "void (*)(void *, void *)", + "name": "free_signature", + "comments": "" + }, + { + "type": "int (*)(int *, void *, void *, void *)", + "name": "similarity", + "comments": "" + }, + { "type": "void *", "name": "payload", "comments": "" } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_diff_stats", + { + "decl": "git_diff_stats", + "type": "struct", + "value": "git_diff_stats", + "file": "git2/diff.h", + "line": 1369, + "lineto": 1369, + "tdef": "typedef", + "description": " This is an opaque structure which is allocated by `git_diff_get_stats`.\n You are responsible for releasing the object memory when done, using the\n `git_diff_stats_free()` function.", + "comments": "", + "used": { + "returns": [], + "needs": [ + "git_diff_get_stats", + "git_diff_stats_deletions", + "git_diff_stats_files_changed", + "git_diff_stats_free", + "git_diff_stats_insertions", + "git_diff_stats_to_buf" + ] + } + } + ], + [ + "git_diff_stats_format_t", + { + "decl": [ + "GIT_DIFF_STATS_NONE", + "GIT_DIFF_STATS_FULL", + "GIT_DIFF_STATS_SHORT", + "GIT_DIFF_STATS_NUMBER", + "GIT_DIFF_STATS_INCLUDE_SUMMARY" + ], + "type": "enum", + "file": "git2/diff.h", + "line": 1374, + "lineto": 1389, + "block": "GIT_DIFF_STATS_NONE\nGIT_DIFF_STATS_FULL\nGIT_DIFF_STATS_SHORT\nGIT_DIFF_STATS_NUMBER\nGIT_DIFF_STATS_INCLUDE_SUMMARY", + "tdef": "typedef", + "description": " Formatting options for diff stats", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_DIFF_STATS_NONE", + "comments": "

No stats

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_DIFF_STATS_FULL", + "comments": "

Full statistics, equivalent of --stat

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_DIFF_STATS_SHORT", + "comments": "

Short statistics, equivalent of --shortstat

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_DIFF_STATS_NUMBER", + "comments": "

Number statistics, equivalent of --numstat

\n", + "value": 4 + }, + { + "type": "int", + "name": "GIT_DIFF_STATS_INCLUDE_SUMMARY", + "comments": "

Extended header information such as creations, renames and mode changes, equivalent of --summary

\n", + "value": 8 + } + ], + "used": { "returns": [], "needs": ["git_diff_stats_to_buf"] } + } + ], + [ + "git_direction", + { + "decl": ["GIT_DIRECTION_FETCH", "GIT_DIRECTION_PUSH"], + "type": "enum", + "file": "git2/net.h", + "line": 32, + "lineto": 35, + "block": "GIT_DIRECTION_FETCH\nGIT_DIRECTION_PUSH", + "tdef": "typedef", + "description": " Direction of the connection.", + "comments": "

We need this because we need to know whether we should call git-upload-pack or git-receive-pack on the remote end when get_refs gets called.

\n", + "fields": [ + { + "type": "int", + "name": "GIT_DIRECTION_FETCH", + "comments": "", + "value": 0 + }, + { + "type": "int", + "name": "GIT_DIRECTION_PUSH", + "comments": "", + "value": 1 + } + ], + "used": { + "returns": ["git_refspec_direction"], + "needs": ["git_remote_connect", "git_remote_connect_ext"] + } + } + ], + [ + "git_email_create_flags_t", + { + "decl": [ + "GIT_EMAIL_CREATE_DEFAULT", + "GIT_EMAIL_CREATE_OMIT_NUMBERS", + "GIT_EMAIL_CREATE_ALWAYS_NUMBER", + "GIT_EMAIL_CREATE_NO_RENAMES" + ], + "type": "enum", + "file": "git2/email.h", + "line": 24, + "lineto": 39, + "block": "GIT_EMAIL_CREATE_DEFAULT\nGIT_EMAIL_CREATE_OMIT_NUMBERS\nGIT_EMAIL_CREATE_ALWAYS_NUMBER\nGIT_EMAIL_CREATE_NO_RENAMES", + "tdef": "typedef", + "description": " Formatting options for diff e-mail generation", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_EMAIL_CREATE_DEFAULT", + "comments": "

Normal patch, the default

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_EMAIL_CREATE_OMIT_NUMBERS", + "comments": "

Do not include patch numbers in the subject prefix.

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_EMAIL_CREATE_ALWAYS_NUMBER", + "comments": "

Include numbers in the subject prefix even when the\n patch is for a single commit (1/1).

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_EMAIL_CREATE_NO_RENAMES", + "comments": "

Do not perform rename or similarity detection.

\n", + "value": 4 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_email_create_options", + { + "decl": [ + "unsigned int version", + "uint32_t flags", + "git_diff_options diff_opts", + "git_diff_find_options diff_find_opts", + "const char * subject_prefix", + "size_t start_number", + "size_t reroll_number" + ], + "type": "struct", + "value": "git_email_create_options", + "file": "git2/email.h", + "line": 44, + "lineto": 72, + "block": "unsigned int version\nuint32_t flags\ngit_diff_options diff_opts\ngit_diff_find_options diff_find_opts\nconst char * subject_prefix\nsize_t start_number\nsize_t reroll_number", + "tdef": "typedef", + "description": " Options for controlling the formatting of the generated e-mail.", + "comments": "", + "fields": [ + { "type": "unsigned int", "name": "version", "comments": "" }, + { + "type": "uint32_t", + "name": "flags", + "comments": " see `git_email_create_flags_t` above " + }, + { + "type": "git_diff_options", + "name": "diff_opts", + "comments": " Options to use when creating diffs " + }, + { + "type": "git_diff_find_options", + "name": "diff_find_opts", + "comments": " Options for finding similarities within diffs " + }, + { + "type": "const char *", + "name": "subject_prefix", + "comments": " The subject prefix, by default \"PATCH\". If set to an empty\n string (\"\") then only the patch numbers will be shown in the\n prefix. If the subject_prefix is empty and patch numbers\n are not being shown, the prefix will be omitted entirely." + }, + { + "type": "size_t", + "name": "start_number", + "comments": " The starting patch number; this cannot be 0. By default,\n this is 1." + }, + { + "type": "size_t", + "name": "reroll_number", + "comments": " The \"re-roll\" number. By default, there is no re-roll. " + } + ], + "used": { "returns": [], "needs": ["git_email_create_from_commit"] } + } + ], + [ + "git_error", + { + "decl": ["char * message", "int klass"], + "type": "struct", + "value": "git_error", + "file": "git2/errors.h", + "line": 125, + "lineto": 128, + "block": "char * message\nint klass", + "tdef": "typedef", + "description": " Structure to store extra details of the last error that occurred.", + "comments": "

This is kept on a per-thread basis if GIT_THREADS was defined when the library was build, otherwise one is kept globally for the library

\n", + "fields": [ + { + "type": "char *", + "name": "message", + "comments": " The error message for the last error. " + }, + { + "type": "int", + "name": "klass", + "comments": " The category of the last error. \n\n git_error_t " + } + ], + "used": { "returns": ["git_error_last", "giterr_last"], "needs": [] } + } + ], + [ + "git_error_code", + { + "decl": [ + "GIT_OK", + "GIT_ERROR", + "GIT_ENOTFOUND", + "GIT_EEXISTS", + "GIT_EAMBIGUOUS", + "GIT_EBUFS", + "GIT_EUSER", + "GIT_EBAREREPO", + "GIT_EUNBORNBRANCH", + "GIT_EUNMERGED", + "GIT_ENONFASTFORWARD", + "GIT_EINVALIDSPEC", + "GIT_ECONFLICT", + "GIT_ELOCKED", + "GIT_EMODIFIED", + "GIT_EAUTH", + "GIT_ECERTIFICATE", + "GIT_EAPPLIED", + "GIT_EPEEL", + "GIT_EEOF", + "GIT_EINVALID", + "GIT_EUNCOMMITTED", + "GIT_EDIRECTORY", + "GIT_EMERGECONFLICT", + "GIT_PASSTHROUGH", + "GIT_ITEROVER", + "GIT_RETRY", + "GIT_EMISMATCH", + "GIT_EINDEXDIRTY", + "GIT_EAPPLYFAIL", + "GIT_EOWNER", + "GIT_TIMEOUT", + "GIT_EUNCHANGED", + "GIT_ENOTSUPPORTED", + "GIT_EREADONLY" + ], + "type": "enum", + "file": "git2/errors.h", + "line": 21, + "lineto": 73, + "block": "GIT_OK\nGIT_ERROR\nGIT_ENOTFOUND\nGIT_EEXISTS\nGIT_EAMBIGUOUS\nGIT_EBUFS\nGIT_EUSER\nGIT_EBAREREPO\nGIT_EUNBORNBRANCH\nGIT_EUNMERGED\nGIT_ENONFASTFORWARD\nGIT_EINVALIDSPEC\nGIT_ECONFLICT\nGIT_ELOCKED\nGIT_EMODIFIED\nGIT_EAUTH\nGIT_ECERTIFICATE\nGIT_EAPPLIED\nGIT_EPEEL\nGIT_EEOF\nGIT_EINVALID\nGIT_EUNCOMMITTED\nGIT_EDIRECTORY\nGIT_EMERGECONFLICT\nGIT_PASSTHROUGH\nGIT_ITEROVER\nGIT_RETRY\nGIT_EMISMATCH\nGIT_EINDEXDIRTY\nGIT_EAPPLYFAIL\nGIT_EOWNER\nGIT_TIMEOUT\nGIT_EUNCHANGED\nGIT_ENOTSUPPORTED\nGIT_EREADONLY", + "tdef": "typedef", + "description": " Generic return codes ", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_OK", + "comments": "

No error occurred; the call was successful.

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_ERROR", + "comments": "

An error occurred; call git_error_last for more information.

\n", + "value": -1 + }, + { + "type": "int", + "name": "GIT_ENOTFOUND", + "comments": "

Requested object could not be found.

\n", + "value": -3 + }, + { + "type": "int", + "name": "GIT_EEXISTS", + "comments": "

Object exists preventing operation.

\n", + "value": -4 + }, + { + "type": "int", + "name": "GIT_EAMBIGUOUS", + "comments": "

More than one object matches.

\n", + "value": -5 + }, + { + "type": "int", + "name": "GIT_EBUFS", + "comments": "

Output buffer too short to hold data.

\n", + "value": -6 + }, + { + "type": "int", + "name": "GIT_EUSER", + "comments": "

GIT_EUSER is a special error that is never generated by libgit2\n code. You can return it from a callback (e.g to stop an iteration)\n to know that it was generated by the callback and not by libgit2.

\n", + "value": -7 + }, + { + "type": "int", + "name": "GIT_EBAREREPO", + "comments": "

Operation not allowed on bare repository.

\n", + "value": -8 + }, + { + "type": "int", + "name": "GIT_EUNBORNBRANCH", + "comments": "

HEAD refers to branch with no commits.

\n", + "value": -9 + }, + { + "type": "int", + "name": "GIT_EUNMERGED", + "comments": "

Merge in progress prevented operation

\n", + "value": -10 + }, + { + "type": "int", + "name": "GIT_ENONFASTFORWARD", + "comments": "

Reference was not fast-forwardable

\n", + "value": -11 + }, + { + "type": "int", + "name": "GIT_EINVALIDSPEC", + "comments": "

Name/ref spec was not in a valid format

\n", + "value": -12 + }, + { + "type": "int", + "name": "GIT_ECONFLICT", + "comments": "

Checkout conflicts prevented operation

\n", + "value": -13 + }, + { + "type": "int", + "name": "GIT_ELOCKED", + "comments": "

Lock file prevented operation

\n", + "value": -14 + }, + { + "type": "int", + "name": "GIT_EMODIFIED", + "comments": "

Reference value does not match expected

\n", + "value": -15 + }, + { + "type": "int", + "name": "GIT_EAUTH", + "comments": "

Authentication error

\n", + "value": -16 + }, + { + "type": "int", + "name": "GIT_ECERTIFICATE", + "comments": "

Server certificate is invalid

\n", + "value": -17 + }, + { + "type": "int", + "name": "GIT_EAPPLIED", + "comments": "

Patch/merge has already been applied

\n", + "value": -18 + }, + { + "type": "int", + "name": "GIT_EPEEL", + "comments": "

The requested peel operation is not possible

\n", + "value": -19 + }, + { + "type": "int", + "name": "GIT_EEOF", + "comments": "

Unexpected EOF

\n", + "value": -20 + }, + { + "type": "int", + "name": "GIT_EINVALID", + "comments": "

Invalid operation or input

\n", + "value": -21 + }, + { + "type": "int", + "name": "GIT_EUNCOMMITTED", + "comments": "

Uncommitted changes in index prevented operation

\n", + "value": -22 + }, + { + "type": "int", + "name": "GIT_EDIRECTORY", + "comments": "

The operation is not valid for a directory

\n", + "value": -23 + }, + { + "type": "int", + "name": "GIT_EMERGECONFLICT", + "comments": "

A merge conflict exists and cannot continue

\n", + "value": -24 + }, + { + "type": "int", + "name": "GIT_PASSTHROUGH", + "comments": "

A user-configured callback refused to act

\n", + "value": -30 + }, + { + "type": "int", + "name": "GIT_ITEROVER", + "comments": "

Signals end of iteration with iterator

\n", + "value": -31 + }, + { + "type": "int", + "name": "GIT_RETRY", + "comments": "

Internal only

\n", + "value": -32 + }, + { + "type": "int", + "name": "GIT_EMISMATCH", + "comments": "

Hashsum mismatch in object

\n", + "value": -33 + }, + { + "type": "int", + "name": "GIT_EINDEXDIRTY", + "comments": "

Unsaved changes in the index would be overwritten

\n", + "value": -34 + }, + { + "type": "int", + "name": "GIT_EAPPLYFAIL", + "comments": "

Patch application failed

\n", + "value": -35 + }, + { + "type": "int", + "name": "GIT_EOWNER", + "comments": "

The object is not owned by the current user

\n", + "value": -36 + }, + { + "type": "int", + "name": "GIT_TIMEOUT", + "comments": "

The operation timed out

\n", + "value": -37 + }, + { + "type": "int", + "name": "GIT_EUNCHANGED", + "comments": "

There were no changes

\n", + "value": -38 + }, + { + "type": "int", + "name": "GIT_ENOTSUPPORTED", + "comments": "

An option is not supported

\n", + "value": -39 + }, + { + "type": "int", + "name": "GIT_EREADONLY", + "comments": "

The subject is read-only

\n", + "value": -40 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_error_t", + { + "decl": [ + "GIT_ERROR_NONE", + "GIT_ERROR_NOMEMORY", + "GIT_ERROR_OS", + "GIT_ERROR_INVALID", + "GIT_ERROR_REFERENCE", + "GIT_ERROR_ZLIB", + "GIT_ERROR_REPOSITORY", + "GIT_ERROR_CONFIG", + "GIT_ERROR_REGEX", + "GIT_ERROR_ODB", + "GIT_ERROR_INDEX", + "GIT_ERROR_OBJECT", + "GIT_ERROR_NET", + "GIT_ERROR_TAG", + "GIT_ERROR_TREE", + "GIT_ERROR_INDEXER", + "GIT_ERROR_SSL", + "GIT_ERROR_SUBMODULE", + "GIT_ERROR_THREAD", + "GIT_ERROR_STASH", + "GIT_ERROR_CHECKOUT", + "GIT_ERROR_FETCHHEAD", + "GIT_ERROR_MERGE", + "GIT_ERROR_SSH", + "GIT_ERROR_FILTER", + "GIT_ERROR_REVERT", + "GIT_ERROR_CALLBACK", + "GIT_ERROR_CHERRYPICK", + "GIT_ERROR_DESCRIBE", + "GIT_ERROR_REBASE", + "GIT_ERROR_FILESYSTEM", + "GIT_ERROR_PATCH", + "GIT_ERROR_WORKTREE", + "GIT_ERROR_SHA", + "GIT_ERROR_HTTP", + "GIT_ERROR_INTERNAL", + "GIT_ERROR_GRAFTS" + ], + "type": "enum", + "file": "git2/errors.h", + "line": 79, + "lineto": 117, + "block": "GIT_ERROR_NONE\nGIT_ERROR_NOMEMORY\nGIT_ERROR_OS\nGIT_ERROR_INVALID\nGIT_ERROR_REFERENCE\nGIT_ERROR_ZLIB\nGIT_ERROR_REPOSITORY\nGIT_ERROR_CONFIG\nGIT_ERROR_REGEX\nGIT_ERROR_ODB\nGIT_ERROR_INDEX\nGIT_ERROR_OBJECT\nGIT_ERROR_NET\nGIT_ERROR_TAG\nGIT_ERROR_TREE\nGIT_ERROR_INDEXER\nGIT_ERROR_SSL\nGIT_ERROR_SUBMODULE\nGIT_ERROR_THREAD\nGIT_ERROR_STASH\nGIT_ERROR_CHECKOUT\nGIT_ERROR_FETCHHEAD\nGIT_ERROR_MERGE\nGIT_ERROR_SSH\nGIT_ERROR_FILTER\nGIT_ERROR_REVERT\nGIT_ERROR_CALLBACK\nGIT_ERROR_CHERRYPICK\nGIT_ERROR_DESCRIBE\nGIT_ERROR_REBASE\nGIT_ERROR_FILESYSTEM\nGIT_ERROR_PATCH\nGIT_ERROR_WORKTREE\nGIT_ERROR_SHA\nGIT_ERROR_HTTP\nGIT_ERROR_INTERNAL\nGIT_ERROR_GRAFTS", + "tdef": "typedef", + "description": " Error classes are the category of error. They reflect the area of the\n code where an error occurred.", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_ERROR_NONE", + "comments": "", + "value": 0 + }, + { + "type": "int", + "name": "GIT_ERROR_NOMEMORY", + "comments": "", + "value": 1 + }, + { "type": "int", "name": "GIT_ERROR_OS", "comments": "", "value": 2 }, + { + "type": "int", + "name": "GIT_ERROR_INVALID", + "comments": "", + "value": 3 + }, + { + "type": "int", + "name": "GIT_ERROR_REFERENCE", + "comments": "", + "value": 4 + }, + { + "type": "int", + "name": "GIT_ERROR_ZLIB", + "comments": "", + "value": 5 + }, + { + "type": "int", + "name": "GIT_ERROR_REPOSITORY", + "comments": "", + "value": 6 + }, + { + "type": "int", + "name": "GIT_ERROR_CONFIG", + "comments": "", + "value": 7 + }, + { + "type": "int", + "name": "GIT_ERROR_REGEX", + "comments": "", + "value": 8 + }, + { + "type": "int", + "name": "GIT_ERROR_ODB", + "comments": "", + "value": 9 + }, + { + "type": "int", + "name": "GIT_ERROR_INDEX", + "comments": "", + "value": 10 + }, + { + "type": "int", + "name": "GIT_ERROR_OBJECT", + "comments": "", + "value": 11 + }, + { + "type": "int", + "name": "GIT_ERROR_NET", + "comments": "", + "value": 12 + }, + { + "type": "int", + "name": "GIT_ERROR_TAG", + "comments": "", + "value": 13 + }, + { + "type": "int", + "name": "GIT_ERROR_TREE", + "comments": "", + "value": 14 + }, + { + "type": "int", + "name": "GIT_ERROR_INDEXER", + "comments": "", + "value": 15 + }, + { + "type": "int", + "name": "GIT_ERROR_SSL", + "comments": "", + "value": 16 + }, + { + "type": "int", + "name": "GIT_ERROR_SUBMODULE", + "comments": "", + "value": 17 + }, + { + "type": "int", + "name": "GIT_ERROR_THREAD", + "comments": "", + "value": 18 + }, + { + "type": "int", + "name": "GIT_ERROR_STASH", + "comments": "", + "value": 19 + }, + { + "type": "int", + "name": "GIT_ERROR_CHECKOUT", + "comments": "", + "value": 20 + }, + { + "type": "int", + "name": "GIT_ERROR_FETCHHEAD", + "comments": "", + "value": 21 + }, + { + "type": "int", + "name": "GIT_ERROR_MERGE", + "comments": "", + "value": 22 + }, + { + "type": "int", + "name": "GIT_ERROR_SSH", + "comments": "", + "value": 23 + }, + { + "type": "int", + "name": "GIT_ERROR_FILTER", + "comments": "", + "value": 24 + }, + { + "type": "int", + "name": "GIT_ERROR_REVERT", + "comments": "", + "value": 25 + }, + { + "type": "int", + "name": "GIT_ERROR_CALLBACK", + "comments": "", + "value": 26 + }, + { + "type": "int", + "name": "GIT_ERROR_CHERRYPICK", + "comments": "", + "value": 27 + }, + { + "type": "int", + "name": "GIT_ERROR_DESCRIBE", + "comments": "", + "value": 28 + }, + { + "type": "int", + "name": "GIT_ERROR_REBASE", + "comments": "", + "value": 29 + }, + { + "type": "int", + "name": "GIT_ERROR_FILESYSTEM", + "comments": "", + "value": 30 + }, + { + "type": "int", + "name": "GIT_ERROR_PATCH", + "comments": "", + "value": 31 + }, + { + "type": "int", + "name": "GIT_ERROR_WORKTREE", + "comments": "", + "value": 32 + }, + { + "type": "int", + "name": "GIT_ERROR_SHA", + "comments": "", + "value": 33 + }, + { + "type": "int", + "name": "GIT_ERROR_HTTP", + "comments": "", + "value": 34 + }, + { + "type": "int", + "name": "GIT_ERROR_INTERNAL", + "comments": "", + "value": 35 + }, + { + "type": "int", + "name": "GIT_ERROR_GRAFTS", + "comments": "", + "value": 36 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_feature_t", + { + "decl": [ + "GIT_FEATURE_THREADS", + "GIT_FEATURE_HTTPS", + "GIT_FEATURE_SSH", + "GIT_FEATURE_NSEC", + "GIT_FEATURE_HTTP_PARSER", + "GIT_FEATURE_REGEX", + "GIT_FEATURE_I18N", + "GIT_FEATURE_AUTH_NTLM", + "GIT_FEATURE_AUTH_NEGOTIATE", + "GIT_FEATURE_COMPRESSION", + "GIT_FEATURE_SHA1", + "GIT_FEATURE_SHA256" + ], + "type": "enum", + "file": "git2/common.h", + "line": 138, + "lineto": 177, + "block": "GIT_FEATURE_THREADS\nGIT_FEATURE_HTTPS\nGIT_FEATURE_SSH\nGIT_FEATURE_NSEC\nGIT_FEATURE_HTTP_PARSER\nGIT_FEATURE_REGEX\nGIT_FEATURE_I18N\nGIT_FEATURE_AUTH_NTLM\nGIT_FEATURE_AUTH_NEGOTIATE\nGIT_FEATURE_COMPRESSION\nGIT_FEATURE_SHA1\nGIT_FEATURE_SHA256", + "tdef": "typedef", + "description": " Configurable features of libgit2; either optional settings (like\n threading), or features that can be enabled by one of a number of\n different backend \"providers\" (like HTTPS, which can be provided by\n OpenSSL, mbedTLS, or system libraries).", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_FEATURE_THREADS", + "comments": "

libgit2 is thread-aware and can be used from multiple threads\n (as described in the documentation).

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_FEATURE_HTTPS", + "comments": "

HTTPS remotes

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_FEATURE_SSH", + "comments": "

SSH remotes

\n", + "value": 4 + }, + { + "type": "int", + "name": "GIT_FEATURE_NSEC", + "comments": "

Sub-second resolution in index timestamps

\n", + "value": 8 + }, + { + "type": "int", + "name": "GIT_FEATURE_HTTP_PARSER", + "comments": "

HTTP parsing; always available

\n", + "value": 16 + }, + { + "type": "int", + "name": "GIT_FEATURE_REGEX", + "comments": "

Regular expression support; always available

\n", + "value": 32 + }, + { + "type": "int", + "name": "GIT_FEATURE_I18N", + "comments": "

Internationalization support for filename translation

\n", + "value": 64 + }, + { + "type": "int", + "name": "GIT_FEATURE_AUTH_NTLM", + "comments": "

NTLM support over HTTPS

\n", + "value": 128 + }, + { + "type": "int", + "name": "GIT_FEATURE_AUTH_NEGOTIATE", + "comments": "

Kerberos (SPNEGO) authentication support over HTTPS

\n", + "value": 256 + }, + { + "type": "int", + "name": "GIT_FEATURE_COMPRESSION", + "comments": "

zlib support; always available

\n", + "value": 512 + }, + { + "type": "int", + "name": "GIT_FEATURE_SHA1", + "comments": "

SHA1 object support; always available

\n", + "value": 1024 + }, + { + "type": "int", + "name": "GIT_FEATURE_SHA256", + "comments": "

SHA256 object support

\n", + "value": 2048 + } + ], + "used": { "returns": [], "needs": ["git_libgit2_feature_backend"] } + } + ], + [ + "git_fetch_depth_t", + { + "decl": ["GIT_FETCH_DEPTH_FULL", "GIT_FETCH_DEPTH_UNSHALLOW"], + "type": "enum", + "file": "git2/remote.h", + "line": 760, + "lineto": 766, + "block": "GIT_FETCH_DEPTH_FULL\nGIT_FETCH_DEPTH_UNSHALLOW", + "tdef": "typedef", + "description": " Constants for fetch depth (shallowness of fetch). ", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_FETCH_DEPTH_FULL", + "comments": "

The fetch is "full" (not shallow). This is the default.

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_FETCH_DEPTH_UNSHALLOW", + "comments": "

The fetch should "unshallow" and fetch missing data.

\n", + "value": 2147483647 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_fetch_options", + { + "decl": [ + "int version", + "git_remote_callbacks callbacks", + "git_fetch_prune_t prune", + "unsigned int update_fetchhead", + "git_remote_autotag_option_t download_tags", + "git_proxy_options proxy_opts", + "int depth", + "git_remote_redirect_t follow_redirects", + "git_strarray custom_headers" + ], + "type": "struct", + "value": "git_fetch_options", + "file": "git2/remote.h", + "line": 776, + "lineto": 828, + "block": "int version\ngit_remote_callbacks callbacks\ngit_fetch_prune_t prune\nunsigned int update_fetchhead\ngit_remote_autotag_option_t download_tags\ngit_proxy_options proxy_opts\nint depth\ngit_remote_redirect_t follow_redirects\ngit_strarray custom_headers", + "tdef": "typedef", + "description": " Fetch options structure.", + "comments": "

Zero out for defaults. Initialize with GIT_FETCH_OPTIONS_INIT macro to correctly set the version field. E.g.

\n\n
    git_fetch_options opts = GIT_FETCH_OPTIONS_INIT;\n
\n", + "fields": [ + { "type": "int", "name": "version", "comments": "" }, + { + "type": "git_remote_callbacks", + "name": "callbacks", + "comments": " Callbacks to use for this fetch operation" + }, + { + "type": "git_fetch_prune_t", + "name": "prune", + "comments": " Whether to perform a prune after the fetch" + }, + { + "type": "unsigned int", + "name": "update_fetchhead", + "comments": " How to handle reference updates; see `git_remote_update_flags`." + }, + { + "type": "git_remote_autotag_option_t", + "name": "download_tags", + "comments": " Determines how to behave regarding tags on the remote, such\n as auto-downloading tags for objects we're downloading or\n downloading all of them.\n\n The default is to auto-follow tags." + }, + { + "type": "git_proxy_options", + "name": "proxy_opts", + "comments": " Proxy options to use, by default no proxy is used." + }, + { + "type": "int", + "name": "depth", + "comments": " Depth of the fetch to perform, or `GIT_FETCH_DEPTH_FULL`\n (or `0`) for full history, or `GIT_FETCH_DEPTH_UNSHALLOW`\n to \"unshallow\" a shallow repository.\n\n The default is full (`GIT_FETCH_DEPTH_FULL` or `0`)." + }, + { + "type": "git_remote_redirect_t", + "name": "follow_redirects", + "comments": " Whether to allow off-site redirects. If this is not\n specified, the `http.followRedirects` configuration setting\n will be consulted." + }, + { + "type": "git_strarray", + "name": "custom_headers", + "comments": " Extra headers for this fetch operation" + } + ], + "used": { + "returns": [], + "needs": [ + "git_fetch_options_init", + "git_remote_download", + "git_remote_fetch" + ] + } + } + ], + [ + "git_fetch_prune_t", + { + "decl": [ + "GIT_FETCH_PRUNE_UNSPECIFIED", + "GIT_FETCH_PRUNE", + "GIT_FETCH_NO_PRUNE" + ], + "type": "enum", + "file": "git2/remote.h", + "line": 719, + "lineto": 732, + "block": "GIT_FETCH_PRUNE_UNSPECIFIED\nGIT_FETCH_PRUNE\nGIT_FETCH_NO_PRUNE", + "tdef": "typedef", + "description": " Acceptable prune settings when fetching ", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_FETCH_PRUNE_UNSPECIFIED", + "comments": "

Use the setting from the configuration

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_FETCH_PRUNE", + "comments": "

Force pruning on

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_FETCH_NO_PRUNE", + "comments": "

Force pruning off

\n", + "value": 2 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_filemode_t", + { + "decl": [ + "GIT_FILEMODE_UNREADABLE", + "GIT_FILEMODE_TREE", + "GIT_FILEMODE_BLOB", + "GIT_FILEMODE_BLOB_EXECUTABLE", + "GIT_FILEMODE_LINK", + "GIT_FILEMODE_COMMIT" + ], + "type": "enum", + "file": "git2/types.h", + "line": 238, + "lineto": 245, + "block": "GIT_FILEMODE_UNREADABLE\nGIT_FILEMODE_TREE\nGIT_FILEMODE_BLOB\nGIT_FILEMODE_BLOB_EXECUTABLE\nGIT_FILEMODE_LINK\nGIT_FILEMODE_COMMIT", + "tdef": "typedef", + "description": " Valid modes for index and tree entries. ", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_FILEMODE_UNREADABLE", + "comments": "", + "value": 0 + }, + { + "type": "int", + "name": "GIT_FILEMODE_TREE", + "comments": "", + "value": 16384 + }, + { + "type": "int", + "name": "GIT_FILEMODE_BLOB", + "comments": "", + "value": 33188 + }, + { + "type": "int", + "name": "GIT_FILEMODE_BLOB_EXECUTABLE", + "comments": "", + "value": 33261 + }, + { + "type": "int", + "name": "GIT_FILEMODE_LINK", + "comments": "", + "value": 40960 + }, + { + "type": "int", + "name": "GIT_FILEMODE_COMMIT", + "comments": "", + "value": 57344 + } + ], + "used": { + "returns": ["git_tree_entry_filemode", "git_tree_entry_filemode_raw"], + "needs": ["git_treebuilder_insert"] + } + } + ], + [ + "git_filter", + { + "decl": "git_filter", + "type": "struct", + "value": "git_filter", + "file": "git2/filter.h", + "line": 109, + "lineto": 109, + "tdef": "typedef", + "description": " A filter that can transform file data", + "comments": "

This represents a filter that can be used to transform or even replace file data. Libgit2 includes one built in filter and it is possible to write your own (see git2/sys/filter.h for information on that).

\n\n

The two builtin filters are:

\n\n\n", + "used": { + "returns": [], + "needs": [ + "git_filter_list_apply_to_blob", + "git_filter_list_apply_to_buffer", + "git_filter_list_apply_to_data", + "git_filter_list_apply_to_file", + "git_filter_list_contains", + "git_filter_list_free", + "git_filter_list_load", + "git_filter_list_load_ext", + "git_filter_list_stream_blob", + "git_filter_list_stream_buffer", + "git_filter_list_stream_data", + "git_filter_list_stream_file" + ] + } + } + ], + [ + "git_filter_flag_t", + { + "decl": [ + "GIT_FILTER_DEFAULT", + "GIT_FILTER_ALLOW_UNSAFE", + "GIT_FILTER_NO_SYSTEM_ATTRIBUTES", + "GIT_FILTER_ATTRIBUTES_FROM_HEAD", + "GIT_FILTER_ATTRIBUTES_FROM_COMMIT" + ], + "type": "enum", + "file": "git2/filter.h", + "line": 47, + "lineto": 64, + "block": "GIT_FILTER_DEFAULT\nGIT_FILTER_ALLOW_UNSAFE\nGIT_FILTER_NO_SYSTEM_ATTRIBUTES\nGIT_FILTER_ATTRIBUTES_FROM_HEAD\nGIT_FILTER_ATTRIBUTES_FROM_COMMIT", + "tdef": "typedef", + "description": " Filter option flags.", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_FILTER_DEFAULT", + "comments": "", + "value": 0 + }, + { + "type": "int", + "name": "GIT_FILTER_ALLOW_UNSAFE", + "comments": "

Don't error for safecrlf violations, allow them to continue.

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_FILTER_NO_SYSTEM_ATTRIBUTES", + "comments": "

Don't load /etc/gitattributes (or the system equivalent)

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_FILTER_ATTRIBUTES_FROM_HEAD", + "comments": "

Load attributes from .gitattributes in the root of HEAD

\n", + "value": 4 + }, + { + "type": "int", + "name": "GIT_FILTER_ATTRIBUTES_FROM_COMMIT", + "comments": "

Load attributes from .gitattributes in a given commit.\n This can only be specified in a git_filter_options.

\n", + "value": 8 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_filter_list", + { + "decl": "git_filter_list", + "type": "struct", + "value": "git_filter_list", + "file": "git2/filter.h", + "line": 121, + "lineto": 121, + "tdef": "typedef", + "description": " List of filters to be applied", + "comments": "

This represents a list of filters to be applied to a file / blob. You can build the list with one call, apply it with another, and dispose it with a third. In typical usage, there are not many occasions where a git_filter_list is needed directly since the library will generally handle conversions for you, but it can be convenient to be able to build and apply the list sometimes.

\n", + "used": { + "returns": [], + "needs": [ + "git_filter_list_apply_to_blob", + "git_filter_list_apply_to_buffer", + "git_filter_list_apply_to_data", + "git_filter_list_apply_to_file", + "git_filter_list_contains", + "git_filter_list_free", + "git_filter_list_load", + "git_filter_list_load_ext", + "git_filter_list_stream_blob", + "git_filter_list_stream_buffer", + "git_filter_list_stream_data", + "git_filter_list_stream_file" + ] + } + } + ], + [ + "git_filter_mode_t", + { + "decl": [ + "GIT_FILTER_TO_WORKTREE", + "GIT_FILTER_SMUDGE", + "GIT_FILTER_TO_ODB", + "GIT_FILTER_CLEAN" + ], + "type": "enum", + "file": "git2/filter.h", + "line": 37, + "lineto": 42, + "block": "GIT_FILTER_TO_WORKTREE\nGIT_FILTER_SMUDGE\nGIT_FILTER_TO_ODB\nGIT_FILTER_CLEAN", + "tdef": "typedef", + "description": " Filters are applied in one of two directions: smudging - which is\n exporting a file from the Git object database to the working directory,\n and cleaning - which is importing a file from the working directory to\n the Git object database. These values control which direction of\n change is being applied.", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_FILTER_TO_WORKTREE", + "comments": "", + "value": 0 + }, + { + "type": "int", + "name": "GIT_FILTER_SMUDGE", + "comments": "", + "value": 0 + }, + { + "type": "int", + "name": "GIT_FILTER_TO_ODB", + "comments": "", + "value": 1 + }, + { + "type": "int", + "name": "GIT_FILTER_CLEAN", + "comments": "", + "value": 1 + } + ], + "used": { + "returns": [], + "needs": ["git_filter_list_load", "git_filter_list_load_ext"] + } + } + ], + [ + "git_filter_options", + { + "decl": [ + "unsigned int version", + "uint32_t flags", + "git_oid * commit_id", + "git_oid attr_commit_id" + ], + "type": "struct", + "value": "git_filter_options", + "file": "git2/filter.h", + "line": 69, + "lineto": 86, + "block": "unsigned int version\nuint32_t flags\ngit_oid * commit_id\ngit_oid attr_commit_id", + "tdef": "typedef", + "description": " Filtering options", + "comments": "", + "fields": [ + { "type": "unsigned int", "name": "version", "comments": "" }, + { + "type": "uint32_t", + "name": "flags", + "comments": " See `git_filter_flag_t` above " + }, + { "type": "git_oid *", "name": "commit_id", "comments": "" }, + { + "type": "git_oid", + "name": "attr_commit_id", + "comments": " The commit to load attributes from, when\n `GIT_FILTER_ATTRIBUTES_FROM_COMMIT` is specified." + } + ], + "used": { "returns": [], "needs": ["git_filter_list_load_ext"] } + } + ], + [ + "git_filter_source", + { + "decl": "git_filter_source", + "type": "struct", + "value": "git_filter_source", + "file": "git2/sys/filter.h", + "line": 109, + "lineto": 109, + "tdef": "typedef", + "description": " A filter source represents a file/blob to be processed", + "comments": "", + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_hashsig_option_t", + { + "decl": [ + "GIT_HASHSIG_NORMAL", + "GIT_HASHSIG_IGNORE_WHITESPACE", + "GIT_HASHSIG_SMART_WHITESPACE", + "GIT_HASHSIG_ALLOW_SMALL_FILES" + ], + "type": "enum", + "file": "git2/sys/hashsig.h", + "line": 35, + "lineto": 55, + "block": "GIT_HASHSIG_NORMAL\nGIT_HASHSIG_IGNORE_WHITESPACE\nGIT_HASHSIG_SMART_WHITESPACE\nGIT_HASHSIG_ALLOW_SMALL_FILES", + "tdef": "typedef", + "description": " Options for hashsig computation", + "comments": "

The options GIT_HASHSIG_NORMAL, GIT_HASHSIG_IGNORE_WHITESPACE, GIT_HASHSIG_SMART_WHITESPACE are exclusive and should not be combined.

\n", + "fields": [ + { + "type": "int", + "name": "GIT_HASHSIG_NORMAL", + "comments": "

Use all data

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_HASHSIG_IGNORE_WHITESPACE", + "comments": "

Ignore whitespace

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_HASHSIG_SMART_WHITESPACE", + "comments": "

Ignore

\n\n

and all space after

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_HASHSIG_ALLOW_SMALL_FILES", + "comments": "

Allow hashing of small files

\n", + "value": 4 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_index", + { + "decl": "git_index", + "type": "struct", + "value": "git_index", + "file": "git2/types.h", + "line": 153, + "lineto": 153, + "tdef": "typedef", + "description": " Memory representation of an index file. ", + "comments": "", + "used": { + "returns": [ + "git_index_get_byindex", + "git_index_get_bypath", + "git_remote_stats" + ], + "needs": [ + "git_apply_to_tree", + "git_checkout_index", + "git_cherrypick_commit", + "git_diff_index_to_index", + "git_diff_index_to_workdir", + "git_diff_tree_to_index", + "git_index_add", + "git_index_add_all", + "git_index_add_bypath", + "git_index_add_from_buffer", + "git_index_caps", + "git_index_checksum", + "git_index_clear", + "git_index_conflict_add", + "git_index_conflict_cleanup", + "git_index_conflict_get", + "git_index_conflict_iterator_free", + "git_index_conflict_iterator_new", + "git_index_conflict_next", + "git_index_conflict_remove", + "git_index_entry_is_conflict", + "git_index_entry_stage", + "git_index_entrycount", + "git_index_find", + "git_index_find_prefix", + "git_index_free", + "git_index_get_byindex", + "git_index_get_bypath", + "git_index_has_conflicts", + "git_index_iterator_free", + "git_index_iterator_new", + "git_index_iterator_next", + "git_index_new", + "git_index_open", + "git_index_owner", + "git_index_path", + "git_index_read", + "git_index_read_tree", + "git_index_remove", + "git_index_remove_all", + "git_index_remove_bypath", + "git_index_remove_directory", + "git_index_set_caps", + "git_index_set_version", + "git_index_update_all", + "git_index_version", + "git_index_write", + "git_index_write_tree", + "git_index_write_tree_to", + "git_indexer_append", + "git_indexer_commit", + "git_indexer_free", + "git_indexer_hash", + "git_indexer_name", + "git_indexer_new", + "git_indexer_options_init", + "git_indexer_progress_cb", + "git_merge_commits", + "git_merge_file_from_index", + "git_merge_trees", + "git_odb_write_pack", + "git_packbuilder_write", + "git_pathspec_match_index", + "git_rebase_inmemory_index", + "git_repository_index", + "git_revert_commit" + ] + } + } + ], + [ + "git_index_add_option_t", + { + "decl": [ + "GIT_INDEX_ADD_DEFAULT", + "GIT_INDEX_ADD_FORCE", + "GIT_INDEX_ADD_DISABLE_PATHSPEC_MATCH", + "GIT_INDEX_ADD_CHECK_PATHSPEC" + ], + "type": "enum", + "file": "git2/index.h", + "line": 162, + "lineto": 167, + "block": "GIT_INDEX_ADD_DEFAULT\nGIT_INDEX_ADD_FORCE\nGIT_INDEX_ADD_DISABLE_PATHSPEC_MATCH\nGIT_INDEX_ADD_CHECK_PATHSPEC", + "tdef": "typedef", + "description": " Flags for APIs that add files matching pathspec ", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_INDEX_ADD_DEFAULT", + "comments": "", + "value": 0 + }, + { + "type": "int", + "name": "GIT_INDEX_ADD_FORCE", + "comments": "", + "value": 1 + }, + { + "type": "int", + "name": "GIT_INDEX_ADD_DISABLE_PATHSPEC_MATCH", + "comments": "", + "value": 2 + }, + { + "type": "int", + "name": "GIT_INDEX_ADD_CHECK_PATHSPEC", + "comments": "", + "value": 4 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_index_capability_t", + { + "decl": [ + "GIT_INDEX_CAPABILITY_IGNORE_CASE", + "GIT_INDEX_CAPABILITY_NO_FILEMODE", + "GIT_INDEX_CAPABILITY_NO_SYMLINKS", + "GIT_INDEX_CAPABILITY_FROM_OWNER" + ], + "type": "enum", + "file": "git2/index.h", + "line": 142, + "lineto": 147, + "block": "GIT_INDEX_CAPABILITY_IGNORE_CASE\nGIT_INDEX_CAPABILITY_NO_FILEMODE\nGIT_INDEX_CAPABILITY_NO_SYMLINKS\nGIT_INDEX_CAPABILITY_FROM_OWNER", + "tdef": "typedef", + "description": " Capabilities of system that affect index actions. ", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_INDEX_CAPABILITY_IGNORE_CASE", + "comments": "", + "value": 1 + }, + { + "type": "int", + "name": "GIT_INDEX_CAPABILITY_NO_FILEMODE", + "comments": "", + "value": 2 + }, + { + "type": "int", + "name": "GIT_INDEX_CAPABILITY_NO_SYMLINKS", + "comments": "", + "value": 4 + }, + { + "type": "int", + "name": "GIT_INDEX_CAPABILITY_FROM_OWNER", + "comments": "", + "value": -1 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_index_conflict_iterator", + { + "decl": "git_index_conflict_iterator", + "type": "struct", + "value": "git_index_conflict_iterator", + "file": "git2/types.h", + "line": 159, + "lineto": 159, + "tdef": "typedef", + "description": " An iterator for conflicts in the index. ", + "comments": "", + "used": { + "returns": [], + "needs": [ + "git_index_conflict_iterator_free", + "git_index_conflict_iterator_new", + "git_index_conflict_next" + ] + } + } + ], + [ + "git_index_entry", + { + "decl": [ + "git_index_time ctime", + "git_index_time mtime", + "uint32_t dev", + "uint32_t ino", + "uint32_t mode", + "uint32_t uid", + "uint32_t gid", + "uint32_t file_size", + "git_oid id", + "uint16_t flags", + "uint16_t flags_extended", + "const char * path" + ], + "type": "struct", + "value": "git_index_entry", + "file": "git2/index.h", + "line": 58, + "lineto": 75, + "block": "git_index_time ctime\ngit_index_time mtime\nuint32_t dev\nuint32_t ino\nuint32_t mode\nuint32_t uid\nuint32_t gid\nuint32_t file_size\ngit_oid id\nuint16_t flags\nuint16_t flags_extended\nconst char * path", + "tdef": "typedef", + "description": " In-memory representation of a file entry in the index.", + "comments": "

This is a public structure that represents a file entry in the index. The meaning of the fields corresponds to core Git's documentation (in "Documentation/technical/index-format.txt").

\n\n

The flags field consists of a number of bit fields which can be accessed via the first set of GIT_INDEX_ENTRY_... bitmasks below. These flags are all read from and persisted to disk.

\n\n

The flags_extended field also has a number of bit fields which can be accessed via the later GIT_INDEX_ENTRY_... bitmasks below. Some of these flags are read from and written to disk, but some are set aside for in-memory only reference.

\n\n

Note that the time and size fields are truncated to 32 bits. This is enough to detect changes, which is enough for the index to function as a cache, but it should not be taken as an authoritative source for that data.

\n", + "fields": [ + { "type": "git_index_time", "name": "ctime", "comments": "" }, + { "type": "git_index_time", "name": "mtime", "comments": "" }, + { "type": "uint32_t", "name": "dev", "comments": "" }, + { "type": "uint32_t", "name": "ino", "comments": "" }, + { "type": "uint32_t", "name": "mode", "comments": "" }, + { "type": "uint32_t", "name": "uid", "comments": "" }, + { "type": "uint32_t", "name": "gid", "comments": "" }, + { "type": "uint32_t", "name": "file_size", "comments": "" }, + { "type": "git_oid", "name": "id", "comments": "" }, + { "type": "uint16_t", "name": "flags", "comments": "" }, + { "type": "uint16_t", "name": "flags_extended", "comments": "" }, + { "type": "const char *", "name": "path", "comments": "" } + ], + "used": { + "returns": ["git_index_get_byindex", "git_index_get_bypath"], + "needs": [ + "git_index_add", + "git_index_add_from_buffer", + "git_index_conflict_add", + "git_index_conflict_get", + "git_index_conflict_next", + "git_index_entry_is_conflict", + "git_index_entry_stage", + "git_index_iterator_next", + "git_merge_file_from_index" + ] + } + } + ], + [ + "git_index_entry_extended_flag_t", + { + "decl": [ + "GIT_INDEX_ENTRY_INTENT_TO_ADD", + "GIT_INDEX_ENTRY_SKIP_WORKTREE", + "GIT_INDEX_ENTRY_EXTENDED_FLAGS", + "GIT_INDEX_ENTRY_UPTODATE" + ], + "type": "enum", + "file": "git2/index.h", + "line": 132, + "lineto": 139, + "block": "GIT_INDEX_ENTRY_INTENT_TO_ADD\nGIT_INDEX_ENTRY_SKIP_WORKTREE\nGIT_INDEX_ENTRY_EXTENDED_FLAGS\nGIT_INDEX_ENTRY_UPTODATE", + "tdef": "typedef", + "description": " Bitmasks for on-disk fields of `git_index_entry`'s `flags_extended`", + "comments": "

In memory, the flags_extended fields are divided into two parts: the fields that are read from and written to disk, and other fields that in-memory only and used by libgit2. Only the flags in GIT_INDEX_ENTRY_EXTENDED_FLAGS will get saved on-disk.

\n\n

Thee first three bitmasks match the three fields in the git_index_entry flags_extended value that belong on disk. You can use them to interpret the data in the flags_extended.

\n\n

The rest of the bitmasks match the other fields in the git_index_entry flags_extended value that are only used in-memory by libgit2. You can use them to interpret the data in the flags_extended.

\n", + "fields": [ + { + "type": "int", + "name": "GIT_INDEX_ENTRY_INTENT_TO_ADD", + "comments": "", + "value": 8192 + }, + { + "type": "int", + "name": "GIT_INDEX_ENTRY_SKIP_WORKTREE", + "comments": "", + "value": 16384 + }, + { + "type": "int", + "name": "GIT_INDEX_ENTRY_EXTENDED_FLAGS", + "comments": "", + "value": 24576 + }, + { + "type": "int", + "name": "GIT_INDEX_ENTRY_UPTODATE", + "comments": "", + "value": 4 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_index_entry_flag_t", + { + "decl": ["GIT_INDEX_ENTRY_EXTENDED", "GIT_INDEX_ENTRY_VALID"], + "type": "enum", + "file": "git2/index.h", + "line": 95, + "lineto": 98, + "block": "GIT_INDEX_ENTRY_EXTENDED\nGIT_INDEX_ENTRY_VALID", + "tdef": "typedef", + "description": " Flags for index entries", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_INDEX_ENTRY_EXTENDED", + "comments": "", + "value": 16384 + }, + { + "type": "int", + "name": "GIT_INDEX_ENTRY_VALID", + "comments": "", + "value": 32768 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_index_iterator", + { + "decl": "git_index_iterator", + "type": "struct", + "value": "git_index_iterator", + "file": "git2/types.h", + "line": 156, + "lineto": 156, + "tdef": "typedef", + "description": " An iterator for entries in the index. ", + "comments": "", + "used": { + "returns": [], + "needs": [ + "git_index_iterator_free", + "git_index_iterator_new", + "git_index_iterator_next" + ] + } + } + ], + [ + "git_index_stage_t", + { + "decl": [ + "GIT_INDEX_STAGE_ANY", + "GIT_INDEX_STAGE_NORMAL", + "GIT_INDEX_STAGE_ANCESTOR", + "GIT_INDEX_STAGE_OURS", + "GIT_INDEX_STAGE_THEIRS" + ], + "type": "enum", + "file": "git2/index.h", + "line": 170, + "lineto": 190, + "block": "GIT_INDEX_STAGE_ANY\nGIT_INDEX_STAGE_NORMAL\nGIT_INDEX_STAGE_ANCESTOR\nGIT_INDEX_STAGE_OURS\nGIT_INDEX_STAGE_THEIRS", + "tdef": "typedef", + "description": " Git index stage states ", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_INDEX_STAGE_ANY", + "comments": "

Match any index stage.

\n\n

Some index APIs take a stage to match; pass this value to match\n any entry matching the path regardless of stage.

\n", + "value": -1 + }, + { + "type": "int", + "name": "GIT_INDEX_STAGE_NORMAL", + "comments": "

A normal staged file in the index.

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_INDEX_STAGE_ANCESTOR", + "comments": "

The ancestor side of a conflict.

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_INDEX_STAGE_OURS", + "comments": "

The "ours" side of a conflict.

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_INDEX_STAGE_THEIRS", + "comments": "

The "theirs" side of a conflict.

\n", + "value": 3 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_index_time", + { + "decl": ["int32_t seconds", "uint32_t nanoseconds"], + "type": "struct", + "value": "git_index_time", + "file": "git2/index.h", + "line": 31, + "lineto": 35, + "block": "int32_t seconds\nuint32_t nanoseconds", + "tdef": "typedef", + "description": " Time structure used in a git index entry ", + "comments": "", + "fields": [ + { "type": "int32_t", "name": "seconds", "comments": "" }, + { "type": "uint32_t", "name": "nanoseconds", "comments": "" } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_indexer", + { + "decl": "git_indexer", + "type": "struct", + "value": "git_indexer", + "file": "git2/indexer.h", + "line": 27, + "lineto": 27, + "tdef": "typedef", + "description": " A git indexer object ", + "comments": "", + "used": { + "returns": ["git_remote_stats"], + "needs": [ + "git_indexer_append", + "git_indexer_commit", + "git_indexer_free", + "git_indexer_hash", + "git_indexer_name", + "git_indexer_new", + "git_indexer_options_init", + "git_indexer_progress_cb", + "git_odb_write_pack", + "git_packbuilder_write" + ] + } + } + ], + [ + "git_indexer_options", + { + "decl": [ + "unsigned int version", + "git_indexer_progress_cb progress_cb", + "void * progress_cb_payload", + "unsigned char verify" + ], + "type": "struct", + "value": "git_indexer_options", + "file": "git2/indexer.h", + "line": 73, + "lineto": 100, + "block": "unsigned int version\ngit_indexer_progress_cb progress_cb\nvoid * progress_cb_payload\nunsigned char verify", + "tdef": "typedef", + "description": " Options for indexer configuration", + "comments": "", + "fields": [ + { "type": "unsigned int", "name": "version", "comments": "" }, + { + "type": "git_indexer_progress_cb", + "name": "progress_cb", + "comments": " progress_cb function to call with progress information " + }, + { + "type": "void *", + "name": "progress_cb_payload", + "comments": " progress_cb_payload payload for the progress callback " + }, + { + "type": "unsigned char", + "name": "verify", + "comments": " Do connectivity checks for the received pack " + } + ], + "used": { + "returns": [], + "needs": ["git_indexer_new", "git_indexer_options_init"] + } + } + ], + [ + "git_indexer_progress", + { + "decl": [ + "unsigned int total_objects", + "unsigned int indexed_objects", + "unsigned int received_objects", + "unsigned int local_objects", + "unsigned int total_deltas", + "unsigned int indexed_deltas", + "size_t received_bytes" + ], + "type": "struct", + "value": "git_indexer_progress", + "file": "git2/indexer.h", + "line": 34, + "lineto": 58, + "block": "unsigned int total_objects\nunsigned int indexed_objects\nunsigned int received_objects\nunsigned int local_objects\nunsigned int total_deltas\nunsigned int indexed_deltas\nsize_t received_bytes", + "tdef": "typedef", + "description": " This structure is used to provide callers information about the\n progress of indexing a packfile, either directly or part of a\n fetch or clone that downloads a packfile.", + "comments": "", + "fields": [ + { + "type": "unsigned int", + "name": "total_objects", + "comments": " number of objects in the packfile being indexed " + }, + { + "type": "unsigned int", + "name": "indexed_objects", + "comments": " received objects that have been hashed " + }, + { + "type": "unsigned int", + "name": "received_objects", + "comments": " received_objects: objects which have been downloaded " + }, + { + "type": "unsigned int", + "name": "local_objects", + "comments": " locally-available objects that have been injected in order\n to fix a thin pack" + }, + { + "type": "unsigned int", + "name": "total_deltas", + "comments": " number of deltas in the packfile being indexed " + }, + { + "type": "unsigned int", + "name": "indexed_deltas", + "comments": " received deltas that have been indexed " + }, + { + "type": "size_t", + "name": "received_bytes", + "comments": " size of the packfile received up to now " + } + ], + "used": { + "returns": ["git_remote_stats"], + "needs": [ + "git_indexer_append", + "git_indexer_commit", + "git_indexer_progress_cb", + "git_odb_write_pack", + "git_packbuilder_write" + ] + } + } + ], + [ + "git_libgit2_opt_t", + { + "decl": [ + "GIT_OPT_GET_MWINDOW_SIZE", + "GIT_OPT_SET_MWINDOW_SIZE", + "GIT_OPT_GET_MWINDOW_MAPPED_LIMIT", + "GIT_OPT_SET_MWINDOW_MAPPED_LIMIT", + "GIT_OPT_GET_SEARCH_PATH", + "GIT_OPT_SET_SEARCH_PATH", + "GIT_OPT_SET_CACHE_OBJECT_LIMIT", + "GIT_OPT_SET_CACHE_MAX_SIZE", + "GIT_OPT_ENABLE_CACHING", + "GIT_OPT_GET_CACHED_MEMORY", + "GIT_OPT_GET_TEMPLATE_PATH", + "GIT_OPT_SET_TEMPLATE_PATH", + "GIT_OPT_SET_SSL_CERT_LOCATIONS", + "GIT_OPT_SET_USER_AGENT", + "GIT_OPT_ENABLE_STRICT_OBJECT_CREATION", + "GIT_OPT_ENABLE_STRICT_SYMBOLIC_REF_CREATION", + "GIT_OPT_SET_SSL_CIPHERS", + "GIT_OPT_GET_USER_AGENT", + "GIT_OPT_ENABLE_OFS_DELTA", + "GIT_OPT_ENABLE_FSYNC_GITDIR", + "GIT_OPT_GET_WINDOWS_SHAREMODE", + "GIT_OPT_SET_WINDOWS_SHAREMODE", + "GIT_OPT_ENABLE_STRICT_HASH_VERIFICATION", + "GIT_OPT_SET_ALLOCATOR", + "GIT_OPT_ENABLE_UNSAVED_INDEX_SAFETY", + "GIT_OPT_GET_PACK_MAX_OBJECTS", + "GIT_OPT_SET_PACK_MAX_OBJECTS", + "GIT_OPT_DISABLE_PACK_KEEP_FILE_CHECKS", + "GIT_OPT_ENABLE_HTTP_EXPECT_CONTINUE", + "GIT_OPT_GET_MWINDOW_FILE_LIMIT", + "GIT_OPT_SET_MWINDOW_FILE_LIMIT", + "GIT_OPT_SET_ODB_PACKED_PRIORITY", + "GIT_OPT_SET_ODB_LOOSE_PRIORITY", + "GIT_OPT_GET_EXTENSIONS", + "GIT_OPT_SET_EXTENSIONS", + "GIT_OPT_GET_OWNER_VALIDATION", + "GIT_OPT_SET_OWNER_VALIDATION", + "GIT_OPT_GET_HOMEDIR", + "GIT_OPT_SET_HOMEDIR", + "GIT_OPT_SET_SERVER_CONNECT_TIMEOUT", + "GIT_OPT_GET_SERVER_CONNECT_TIMEOUT", + "GIT_OPT_SET_SERVER_TIMEOUT", + "GIT_OPT_GET_SERVER_TIMEOUT", + "GIT_OPT_SET_USER_AGENT_PRODUCT", + "GIT_OPT_GET_USER_AGENT_PRODUCT", + "GIT_OPT_ADD_SSL_X509_CERT" + ], + "type": "enum", + "file": "git2/common.h", + "line": 214, + "lineto": 261, + "block": "GIT_OPT_GET_MWINDOW_SIZE\nGIT_OPT_SET_MWINDOW_SIZE\nGIT_OPT_GET_MWINDOW_MAPPED_LIMIT\nGIT_OPT_SET_MWINDOW_MAPPED_LIMIT\nGIT_OPT_GET_SEARCH_PATH\nGIT_OPT_SET_SEARCH_PATH\nGIT_OPT_SET_CACHE_OBJECT_LIMIT\nGIT_OPT_SET_CACHE_MAX_SIZE\nGIT_OPT_ENABLE_CACHING\nGIT_OPT_GET_CACHED_MEMORY\nGIT_OPT_GET_TEMPLATE_PATH\nGIT_OPT_SET_TEMPLATE_PATH\nGIT_OPT_SET_SSL_CERT_LOCATIONS\nGIT_OPT_SET_USER_AGENT\nGIT_OPT_ENABLE_STRICT_OBJECT_CREATION\nGIT_OPT_ENABLE_STRICT_SYMBOLIC_REF_CREATION\nGIT_OPT_SET_SSL_CIPHERS\nGIT_OPT_GET_USER_AGENT\nGIT_OPT_ENABLE_OFS_DELTA\nGIT_OPT_ENABLE_FSYNC_GITDIR\nGIT_OPT_GET_WINDOWS_SHAREMODE\nGIT_OPT_SET_WINDOWS_SHAREMODE\nGIT_OPT_ENABLE_STRICT_HASH_VERIFICATION\nGIT_OPT_SET_ALLOCATOR\nGIT_OPT_ENABLE_UNSAVED_INDEX_SAFETY\nGIT_OPT_GET_PACK_MAX_OBJECTS\nGIT_OPT_SET_PACK_MAX_OBJECTS\nGIT_OPT_DISABLE_PACK_KEEP_FILE_CHECKS\nGIT_OPT_ENABLE_HTTP_EXPECT_CONTINUE\nGIT_OPT_GET_MWINDOW_FILE_LIMIT\nGIT_OPT_SET_MWINDOW_FILE_LIMIT\nGIT_OPT_SET_ODB_PACKED_PRIORITY\nGIT_OPT_SET_ODB_LOOSE_PRIORITY\nGIT_OPT_GET_EXTENSIONS\nGIT_OPT_SET_EXTENSIONS\nGIT_OPT_GET_OWNER_VALIDATION\nGIT_OPT_SET_OWNER_VALIDATION\nGIT_OPT_GET_HOMEDIR\nGIT_OPT_SET_HOMEDIR\nGIT_OPT_SET_SERVER_CONNECT_TIMEOUT\nGIT_OPT_GET_SERVER_CONNECT_TIMEOUT\nGIT_OPT_SET_SERVER_TIMEOUT\nGIT_OPT_GET_SERVER_TIMEOUT\nGIT_OPT_SET_USER_AGENT_PRODUCT\nGIT_OPT_GET_USER_AGENT_PRODUCT\nGIT_OPT_ADD_SSL_X509_CERT", + "tdef": "typedef", + "description": " Global library options", + "comments": "

These are used to select which global option to set or get and are used in git_libgit2_opts().

\n", + "fields": [ + { + "type": "int", + "name": "GIT_OPT_GET_MWINDOW_SIZE", + "comments": "", + "value": 0 + }, + { + "type": "int", + "name": "GIT_OPT_SET_MWINDOW_SIZE", + "comments": "", + "value": 1 + }, + { + "type": "int", + "name": "GIT_OPT_GET_MWINDOW_MAPPED_LIMIT", + "comments": "", + "value": 2 + }, + { + "type": "int", + "name": "GIT_OPT_SET_MWINDOW_MAPPED_LIMIT", + "comments": "", + "value": 3 + }, + { + "type": "int", + "name": "GIT_OPT_GET_SEARCH_PATH", + "comments": "", + "value": 4 + }, + { + "type": "int", + "name": "GIT_OPT_SET_SEARCH_PATH", + "comments": "", + "value": 5 + }, + { + "type": "int", + "name": "GIT_OPT_SET_CACHE_OBJECT_LIMIT", + "comments": "", + "value": 6 + }, + { + "type": "int", + "name": "GIT_OPT_SET_CACHE_MAX_SIZE", + "comments": "", + "value": 7 + }, + { + "type": "int", + "name": "GIT_OPT_ENABLE_CACHING", + "comments": "", + "value": 8 + }, + { + "type": "int", + "name": "GIT_OPT_GET_CACHED_MEMORY", + "comments": "", + "value": 9 + }, + { + "type": "int", + "name": "GIT_OPT_GET_TEMPLATE_PATH", + "comments": "", + "value": 10 + }, + { + "type": "int", + "name": "GIT_OPT_SET_TEMPLATE_PATH", + "comments": "", + "value": 11 + }, + { + "type": "int", + "name": "GIT_OPT_SET_SSL_CERT_LOCATIONS", + "comments": "", + "value": 12 + }, + { + "type": "int", + "name": "GIT_OPT_SET_USER_AGENT", + "comments": "", + "value": 13 + }, + { + "type": "int", + "name": "GIT_OPT_ENABLE_STRICT_OBJECT_CREATION", + "comments": "", + "value": 14 + }, + { + "type": "int", + "name": "GIT_OPT_ENABLE_STRICT_SYMBOLIC_REF_CREATION", + "comments": "", + "value": 15 + }, + { + "type": "int", + "name": "GIT_OPT_SET_SSL_CIPHERS", + "comments": "", + "value": 16 + }, + { + "type": "int", + "name": "GIT_OPT_GET_USER_AGENT", + "comments": "", + "value": 17 + }, + { + "type": "int", + "name": "GIT_OPT_ENABLE_OFS_DELTA", + "comments": "", + "value": 18 + }, + { + "type": "int", + "name": "GIT_OPT_ENABLE_FSYNC_GITDIR", + "comments": "", + "value": 19 + }, + { + "type": "int", + "name": "GIT_OPT_GET_WINDOWS_SHAREMODE", + "comments": "", + "value": 20 + }, + { + "type": "int", + "name": "GIT_OPT_SET_WINDOWS_SHAREMODE", + "comments": "", + "value": 21 + }, + { + "type": "int", + "name": "GIT_OPT_ENABLE_STRICT_HASH_VERIFICATION", + "comments": "", + "value": 22 + }, + { + "type": "int", + "name": "GIT_OPT_SET_ALLOCATOR", + "comments": "", + "value": 23 + }, + { + "type": "int", + "name": "GIT_OPT_ENABLE_UNSAVED_INDEX_SAFETY", + "comments": "", + "value": 24 + }, + { + "type": "int", + "name": "GIT_OPT_GET_PACK_MAX_OBJECTS", + "comments": "", + "value": 25 + }, + { + "type": "int", + "name": "GIT_OPT_SET_PACK_MAX_OBJECTS", + "comments": "", + "value": 26 + }, + { + "type": "int", + "name": "GIT_OPT_DISABLE_PACK_KEEP_FILE_CHECKS", + "comments": "", + "value": 27 + }, + { + "type": "int", + "name": "GIT_OPT_ENABLE_HTTP_EXPECT_CONTINUE", + "comments": "", + "value": 28 + }, + { + "type": "int", + "name": "GIT_OPT_GET_MWINDOW_FILE_LIMIT", + "comments": "", + "value": 29 + }, + { + "type": "int", + "name": "GIT_OPT_SET_MWINDOW_FILE_LIMIT", + "comments": "", + "value": 30 + }, + { + "type": "int", + "name": "GIT_OPT_SET_ODB_PACKED_PRIORITY", + "comments": "", + "value": 31 + }, + { + "type": "int", + "name": "GIT_OPT_SET_ODB_LOOSE_PRIORITY", + "comments": "", + "value": 32 + }, + { + "type": "int", + "name": "GIT_OPT_GET_EXTENSIONS", + "comments": "", + "value": 33 + }, + { + "type": "int", + "name": "GIT_OPT_SET_EXTENSIONS", + "comments": "", + "value": 34 + }, + { + "type": "int", + "name": "GIT_OPT_GET_OWNER_VALIDATION", + "comments": "", + "value": 35 + }, + { + "type": "int", + "name": "GIT_OPT_SET_OWNER_VALIDATION", + "comments": "", + "value": 36 + }, + { + "type": "int", + "name": "GIT_OPT_GET_HOMEDIR", + "comments": "", + "value": 37 + }, + { + "type": "int", + "name": "GIT_OPT_SET_HOMEDIR", + "comments": "", + "value": 38 + }, + { + "type": "int", + "name": "GIT_OPT_SET_SERVER_CONNECT_TIMEOUT", + "comments": "", + "value": 39 + }, + { + "type": "int", + "name": "GIT_OPT_GET_SERVER_CONNECT_TIMEOUT", + "comments": "", + "value": 40 + }, + { + "type": "int", + "name": "GIT_OPT_SET_SERVER_TIMEOUT", + "comments": "", + "value": 41 + }, + { + "type": "int", + "name": "GIT_OPT_GET_SERVER_TIMEOUT", + "comments": "", + "value": 42 + }, + { + "type": "int", + "name": "GIT_OPT_SET_USER_AGENT_PRODUCT", + "comments": "", + "value": 43 + }, + { + "type": "int", + "name": "GIT_OPT_GET_USER_AGENT_PRODUCT", + "comments": "", + "value": 44 + }, + { + "type": "int", + "name": "GIT_OPT_ADD_SSL_X509_CERT", + "comments": "", + "value": 45 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_mailmap", + { + "decl": "git_mailmap", + "type": "struct", + "value": "git_mailmap", + "file": "git2/types.h", + "line": 382, + "lineto": 382, + "tdef": "typedef", + "description": " Representation of .mailmap file state. ", + "comments": "", + "used": { + "returns": [], + "needs": [ + "git_commit_author_with_mailmap", + "git_commit_committer_with_mailmap", + "git_mailmap_add_entry", + "git_mailmap_free", + "git_mailmap_from_buffer", + "git_mailmap_from_repository", + "git_mailmap_new", + "git_mailmap_resolve", + "git_mailmap_resolve_signature" + ] + } + } + ], + [ + "git_merge_analysis_t", + { + "decl": [ + "GIT_MERGE_ANALYSIS_NONE", + "GIT_MERGE_ANALYSIS_NORMAL", + "GIT_MERGE_ANALYSIS_UP_TO_DATE", + "GIT_MERGE_ANALYSIS_FASTFORWARD", + "GIT_MERGE_ANALYSIS_UNBORN" + ], + "type": "enum", + "file": "git2/merge.h", + "line": 347, + "lineto": 376, + "block": "GIT_MERGE_ANALYSIS_NONE\nGIT_MERGE_ANALYSIS_NORMAL\nGIT_MERGE_ANALYSIS_UP_TO_DATE\nGIT_MERGE_ANALYSIS_FASTFORWARD\nGIT_MERGE_ANALYSIS_UNBORN", + "tdef": "typedef", + "description": " The results of `git_merge_analysis` indicate the merge opportunities.", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_MERGE_ANALYSIS_NONE", + "comments": "

No merge is possible. (Unused.)

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_MERGE_ANALYSIS_NORMAL", + "comments": "

A "normal" merge; both HEAD and the given merge input have diverged\n from their common ancestor. The divergent commits must be merged.

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_MERGE_ANALYSIS_UP_TO_DATE", + "comments": "

All given merge inputs are reachable from HEAD, meaning the\n repository is up-to-date and no merge needs to be performed.

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_MERGE_ANALYSIS_FASTFORWARD", + "comments": "

The given merge input is a fast-forward from HEAD and no merge\n needs to be performed. Instead, the client can check out the\n given merge input.

\n", + "value": 4 + }, + { + "type": "int", + "name": "GIT_MERGE_ANALYSIS_UNBORN", + "comments": "

The HEAD of the current repository is "unborn" and does not point to\n a valid commit. No merge can be performed, but the caller may wish\n to simply set HEAD to the target commit(s).

\n", + "value": 8 + } + ], + "used": { + "returns": [], + "needs": ["git_merge_analysis", "git_merge_analysis_for_ref"] + } + } + ], + [ + "git_merge_driver_source", + { + "decl": "git_merge_driver_source", + "type": "struct", + "value": "git_merge_driver_source", + "file": "git2/sys/merge.h", + "line": 49, + "lineto": 49, + "tdef": "typedef", + "description": " A merge driver source represents the file to be merged", + "comments": "", + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_merge_file_favor_t", + { + "decl": [ + "GIT_MERGE_FILE_FAVOR_NORMAL", + "GIT_MERGE_FILE_FAVOR_OURS", + "GIT_MERGE_FILE_FAVOR_THEIRS", + "GIT_MERGE_FILE_FAVOR_UNION" + ], + "type": "enum", + "file": "git2/merge.h", + "line": 115, + "lineto": 145, + "block": "GIT_MERGE_FILE_FAVOR_NORMAL\nGIT_MERGE_FILE_FAVOR_OURS\nGIT_MERGE_FILE_FAVOR_THEIRS\nGIT_MERGE_FILE_FAVOR_UNION", + "tdef": "typedef", + "description": " Merge file favor options for `git_merge_options` instruct the file-level\n merging functionality how to deal with conflicting regions of the files.", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_MERGE_FILE_FAVOR_NORMAL", + "comments": "

When a region of a file is changed in both branches, a conflict\n will be recorded in the index so that git_checkout can produce\n a merge file with conflict markers in the working directory.\n This is the default.

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_MERGE_FILE_FAVOR_OURS", + "comments": "

When a region of a file is changed in both branches, the file\n created in the index will contain the "ours" side of any conflicting\n region. The index will not record a conflict.

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_MERGE_FILE_FAVOR_THEIRS", + "comments": "

When a region of a file is changed in both branches, the file\n created in the index will contain the "theirs" side of any conflicting\n region. The index will not record a conflict.

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_MERGE_FILE_FAVOR_UNION", + "comments": "

When a region of a file is changed in both branches, the file\n created in the index will contain each unique line from each side,\n which has the result of combining both files. The index will not\n record a conflict.

\n", + "value": 3 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_merge_file_flag_t", + { + "decl": [ + "GIT_MERGE_FILE_DEFAULT", + "GIT_MERGE_FILE_STYLE_MERGE", + "GIT_MERGE_FILE_STYLE_DIFF3", + "GIT_MERGE_FILE_SIMPLIFY_ALNUM", + "GIT_MERGE_FILE_IGNORE_WHITESPACE", + "GIT_MERGE_FILE_IGNORE_WHITESPACE_CHANGE", + "GIT_MERGE_FILE_IGNORE_WHITESPACE_EOL", + "GIT_MERGE_FILE_DIFF_PATIENCE", + "GIT_MERGE_FILE_DIFF_MINIMAL", + "GIT_MERGE_FILE_STYLE_ZDIFF3", + "GIT_MERGE_FILE_ACCEPT_CONFLICTS" + ], + "type": "enum", + "file": "git2/merge.h", + "line": 150, + "lineto": 187, + "block": "GIT_MERGE_FILE_DEFAULT\nGIT_MERGE_FILE_STYLE_MERGE\nGIT_MERGE_FILE_STYLE_DIFF3\nGIT_MERGE_FILE_SIMPLIFY_ALNUM\nGIT_MERGE_FILE_IGNORE_WHITESPACE\nGIT_MERGE_FILE_IGNORE_WHITESPACE_CHANGE\nGIT_MERGE_FILE_IGNORE_WHITESPACE_EOL\nGIT_MERGE_FILE_DIFF_PATIENCE\nGIT_MERGE_FILE_DIFF_MINIMAL\nGIT_MERGE_FILE_STYLE_ZDIFF3\nGIT_MERGE_FILE_ACCEPT_CONFLICTS", + "tdef": "typedef", + "description": " File merging flags", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_MERGE_FILE_DEFAULT", + "comments": "

Defaults

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_MERGE_FILE_STYLE_MERGE", + "comments": "

Create standard conflicted merge files

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_MERGE_FILE_STYLE_DIFF3", + "comments": "

Create diff3-style files

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_MERGE_FILE_SIMPLIFY_ALNUM", + "comments": "

Condense non-alphanumeric regions for simplified diff file

\n", + "value": 4 + }, + { + "type": "int", + "name": "GIT_MERGE_FILE_IGNORE_WHITESPACE", + "comments": "

Ignore all whitespace

\n", + "value": 8 + }, + { + "type": "int", + "name": "GIT_MERGE_FILE_IGNORE_WHITESPACE_CHANGE", + "comments": "

Ignore changes in amount of whitespace

\n", + "value": 16 + }, + { + "type": "int", + "name": "GIT_MERGE_FILE_IGNORE_WHITESPACE_EOL", + "comments": "

Ignore whitespace at end of line

\n", + "value": 32 + }, + { + "type": "int", + "name": "GIT_MERGE_FILE_DIFF_PATIENCE", + "comments": "

Use the "patience diff" algorithm

\n", + "value": 64 + }, + { + "type": "int", + "name": "GIT_MERGE_FILE_DIFF_MINIMAL", + "comments": "

Take extra time to find minimal diff

\n", + "value": 128 + }, + { + "type": "int", + "name": "GIT_MERGE_FILE_STYLE_ZDIFF3", + "comments": "

Create zdiff3 ("zealous diff3")-style files

\n", + "value": 256 + }, + { + "type": "int", + "name": "GIT_MERGE_FILE_ACCEPT_CONFLICTS", + "comments": "

Do not produce file conflicts when common regions have\n changed; keep the conflict markers in the file and accept\n that as the merge result.

\n", + "value": 512 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_merge_file_input", + { + "decl": [ + "unsigned int version", + "const char * ptr", + "size_t size", + "const char * path", + "unsigned int mode" + ], + "type": "struct", + "value": "git_merge_file_input", + "file": "git2/merge.h", + "line": 35, + "lineto": 49, + "block": "unsigned int version\nconst char * ptr\nsize_t size\nconst char * path\nunsigned int mode", + "tdef": "typedef", + "description": " The file inputs to `git_merge_file`. Callers should populate the\n `git_merge_file_input` structure with descriptions of the files in\n each side of the conflict for use in producing the merge file.", + "comments": "", + "fields": [ + { "type": "unsigned int", "name": "version", "comments": "" }, + { + "type": "const char *", + "name": "ptr", + "comments": " Pointer to the contents of the file. " + }, + { + "type": "size_t", + "name": "size", + "comments": " Size of the contents pointed to in `ptr`. " + }, + { + "type": "const char *", + "name": "path", + "comments": " File name of the conflicted file, or `NULL` to not merge the path. " + }, + { + "type": "unsigned int", + "name": "mode", + "comments": " File mode of the conflicted file, or `0` to not merge the mode. " + } + ], + "used": { + "returns": [], + "needs": ["git_merge_file", "git_merge_file_input_init"] + } + } + ], + [ + "git_merge_file_options", + { + "decl": [ + "unsigned int version", + "const char * ancestor_label", + "const char * our_label", + "const char * their_label", + "git_merge_file_favor_t favor", + "uint32_t flags", + "unsigned short marker_size" + ], + "type": "struct", + "value": "git_merge_file_options", + "file": "git2/merge.h", + "line": 195, + "lineto": 225, + "block": "unsigned int version\nconst char * ancestor_label\nconst char * our_label\nconst char * their_label\ngit_merge_file_favor_t favor\nuint32_t flags\nunsigned short marker_size", + "tdef": "typedef", + "description": " Options for merging a file", + "comments": "", + "fields": [ + { "type": "unsigned int", "name": "version", "comments": "" }, + { + "type": "const char *", + "name": "ancestor_label", + "comments": " Label for the ancestor file side of the conflict which will be prepended\n to labels in diff3-format merge files." + }, + { + "type": "const char *", + "name": "our_label", + "comments": " Label for our file side of the conflict which will be prepended\n to labels in merge files." + }, + { + "type": "const char *", + "name": "their_label", + "comments": " Label for their file side of the conflict which will be prepended\n to labels in merge files." + }, + { + "type": "git_merge_file_favor_t", + "name": "favor", + "comments": " The file to favor in region conflicts. " + }, + { + "type": "uint32_t", + "name": "flags", + "comments": " see `git_merge_file_flag_t` above " + }, + { + "type": "unsigned short", + "name": "marker_size", + "comments": " The size of conflict markers (eg, \"\n<\n<\n<\n<\n<\n<\n<\n\"). Default is\n GIT_MERGE_CONFLICT_MARKER_SIZE. " + } + ], + "used": { + "returns": [], + "needs": [ + "git_merge_file", + "git_merge_file_from_index", + "git_merge_file_options_init" + ] + } + } + ], + [ + "git_merge_file_result", + { + "decl": [ + "unsigned int automergeable", + "const char * path", + "unsigned int mode", + "const char * ptr", + "size_t len" + ], + "type": "struct", + "value": "git_merge_file_result", + "file": "git2/merge.h", + "line": 248, + "lineto": 269, + "block": "unsigned int automergeable\nconst char * path\nunsigned int mode\nconst char * ptr\nsize_t len", + "tdef": "typedef", + "description": " Information about file-level merging", + "comments": "", + "fields": [ + { + "type": "unsigned int", + "name": "automergeable", + "comments": " True if the output was automerged, false if the output contains\n conflict markers." + }, + { + "type": "const char *", + "name": "path", + "comments": " The path that the resultant merge file should use, or NULL if a\n filename conflict would occur." + }, + { + "type": "unsigned int", + "name": "mode", + "comments": " The mode that the resultant merge file should use. " + }, + { + "type": "const char *", + "name": "ptr", + "comments": " The contents of the merge. " + }, + { + "type": "size_t", + "name": "len", + "comments": " The length of the merge contents. " + } + ], + "used": { + "returns": [], + "needs": [ + "git_merge_file", + "git_merge_file_from_index", + "git_merge_file_result_free" + ] + } + } + ], + [ + "git_merge_flag_t", + { + "decl": [ + "GIT_MERGE_FIND_RENAMES", + "GIT_MERGE_FAIL_ON_CONFLICT", + "GIT_MERGE_SKIP_REUC", + "GIT_MERGE_NO_RECURSIVE", + "GIT_MERGE_VIRTUAL_BASE" + ], + "type": "enum", + "file": "git2/merge.h", + "line": 74, + "lineto": 109, + "block": "GIT_MERGE_FIND_RENAMES\nGIT_MERGE_FAIL_ON_CONFLICT\nGIT_MERGE_SKIP_REUC\nGIT_MERGE_NO_RECURSIVE\nGIT_MERGE_VIRTUAL_BASE", + "tdef": "typedef", + "description": " Flags for `git_merge` options. A combination of these flags can be\n passed in via the `flags` value in the `git_merge_options`.", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_MERGE_FIND_RENAMES", + "comments": "

Detect renames that occur between the common ancestor and the "ours"\n side or the common ancestor and the "theirs" side. This will enable\n the ability to merge between a modified and renamed file.

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_MERGE_FAIL_ON_CONFLICT", + "comments": "

If a conflict occurs, exit immediately instead of attempting to\n continue resolving conflicts. The merge operation will fail with\n GIT_EMERGECONFLICT and no index will be returned.

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_MERGE_SKIP_REUC", + "comments": "

Do not write the REUC extension on the generated index

\n", + "value": 4 + }, + { + "type": "int", + "name": "GIT_MERGE_NO_RECURSIVE", + "comments": "

If the commits being merged have multiple merge bases, do not build\n a recursive merge base (by merging the multiple merge bases),\n instead simply use the first base. This flag provides a similar\n merge base to git-merge-resolve.

\n", + "value": 8 + }, + { + "type": "int", + "name": "GIT_MERGE_VIRTUAL_BASE", + "comments": "

Treat this merge as if it is to produce the virtual base\n of a recursive merge. This will ensure that there are\n no conflicts, any conflicting regions will keep conflict\n markers in the merge result.

\n", + "value": 16 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_merge_options", + { + "decl": [ + "unsigned int version", + "uint32_t flags", + "unsigned int rename_threshold", + "unsigned int target_limit", + "git_diff_similarity_metric * metric", + "unsigned int recursion_limit", + "const char * default_driver", + "git_merge_file_favor_t file_favor", + "uint32_t file_flags" + ], + "type": "struct", + "value": "git_merge_options", + "file": "git2/merge.h", + "line": 274, + "lineto": 323, + "block": "unsigned int version\nuint32_t flags\nunsigned int rename_threshold\nunsigned int target_limit\ngit_diff_similarity_metric * metric\nunsigned int recursion_limit\nconst char * default_driver\ngit_merge_file_favor_t file_favor\nuint32_t file_flags", + "tdef": "typedef", + "description": " Merging options", + "comments": "", + "fields": [ + { "type": "unsigned int", "name": "version", "comments": "" }, + { + "type": "uint32_t", + "name": "flags", + "comments": " See `git_merge_flag_t` above " + }, + { + "type": "unsigned int", + "name": "rename_threshold", + "comments": " Similarity to consider a file renamed (default 50). If\n `GIT_MERGE_FIND_RENAMES` is enabled, added files will be compared\n with deleted files to determine their similarity. Files that are\n more similar than the rename threshold (percentage-wise) will be\n treated as a rename." + }, + { + "type": "unsigned int", + "name": "target_limit", + "comments": " Maximum similarity sources to examine for renames (default 200).\n If the number of rename candidates (add / delete pairs) is greater\n than this value, inexact rename detection is aborted.\n\n This setting overrides the `merge.renameLimit` configuration value." + }, + { + "type": "git_diff_similarity_metric *", + "name": "metric", + "comments": " Pluggable similarity metric; pass NULL to use internal metric " + }, + { + "type": "unsigned int", + "name": "recursion_limit", + "comments": " Maximum number of times to merge common ancestors to build a\n virtual merge base when faced with criss-cross merges. When this\n limit is reached, the next ancestor will simply be used instead of\n attempting to merge it. The default is unlimited." + }, + { + "type": "const char *", + "name": "default_driver", + "comments": " Default merge driver to be used when both sides of a merge have\n changed. The default is the `text` driver." + }, + { + "type": "git_merge_file_favor_t", + "name": "file_favor", + "comments": " Flags for handling conflicting content, to be used with the standard\n (`text`) merge driver." + }, + { + "type": "uint32_t", + "name": "file_flags", + "comments": " see `git_merge_file_flag_t` above " + } + ], + "used": { + "returns": [], + "needs": [ + "git_cherrypick_commit", + "git_merge", + "git_merge_commits", + "git_merge_options_init", + "git_merge_trees", + "git_revert_commit" + ] + } + } + ], + [ + "git_merge_preference_t", + { + "decl": [ + "GIT_MERGE_PREFERENCE_NONE", + "GIT_MERGE_PREFERENCE_NO_FASTFORWARD", + "GIT_MERGE_PREFERENCE_FASTFORWARD_ONLY" + ], + "type": "enum", + "file": "git2/merge.h", + "line": 381, + "lineto": 399, + "block": "GIT_MERGE_PREFERENCE_NONE\nGIT_MERGE_PREFERENCE_NO_FASTFORWARD\nGIT_MERGE_PREFERENCE_FASTFORWARD_ONLY", + "tdef": "typedef", + "description": " The user's stated preference for merges.", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_MERGE_PREFERENCE_NONE", + "comments": "

No configuration was found that suggests a preferred behavior for\n merge.

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_MERGE_PREFERENCE_NO_FASTFORWARD", + "comments": "

There is a merge.ff=false configuration setting, suggesting that\n the user does not want to allow a fast-forward merge.

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_MERGE_PREFERENCE_FASTFORWARD_ONLY", + "comments": "

There is a merge.ff=only configuration setting, suggesting that\n the user only wants fast-forward merges.

\n", + "value": 2 + } + ], + "used": { + "returns": [], + "needs": ["git_merge_analysis", "git_merge_analysis_for_ref"] + } + } + ], + [ + "git_message_trailer", + { + "decl": ["const char * key", "const char * value"], + "type": "struct", + "value": "git_message_trailer", + "file": "git2/message.h", + "line": 43, + "lineto": 46, + "block": "const char * key\nconst char * value", + "tdef": "typedef", + "description": " Represents a single git message trailer.", + "comments": "", + "fields": [ + { "type": "const char *", "name": "key", "comments": "" }, + { "type": "const char *", "name": "value", "comments": "" } + ], + "used": { + "returns": [], + "needs": ["git_message_trailer_array_free", "git_message_trailers"] + } + } + ], + [ + "git_message_trailer_array", + { + "decl": [ + "git_message_trailer * trailers", + "size_t count", + "char * _trailer_block" + ], + "type": "struct", + "value": "git_message_trailer_array", + "file": "git2/message.h", + "line": 54, + "lineto": 60, + "block": "git_message_trailer * trailers\nsize_t count\nchar * _trailer_block", + "tdef": "typedef", + "description": " Represents an array of git message trailers.", + "comments": "

Struct members under the private comment are private, subject to change and should not be used by callers.

\n", + "fields": [ + { + "type": "git_message_trailer *", + "name": "trailers", + "comments": "" + }, + { "type": "size_t", "name": "count", "comments": "" }, + { "type": "char *", "name": "_trailer_block", "comments": "" } + ], + "used": { + "returns": [], + "needs": ["git_message_trailer_array_free", "git_message_trailers"] + } + } + ], + [ + "git_midx_writer", + { + "decl": "git_midx_writer", + "type": "struct", + "value": "git_midx_writer", + "file": "git2/types.h", + "line": 105, + "lineto": 105, + "tdef": "typedef", + "description": " a writer for multi-pack-index files. ", + "comments": "", + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_note", + { + "decl": "git_note", + "type": "struct", + "value": "git_note", + "file": "git2/types.h", + "line": 174, + "lineto": 174, + "tdef": "typedef", + "description": " Representation of a git note ", + "comments": "", + "used": { + "returns": [], + "needs": ["git_note_iterator_free", "git_note_next"] + } + } + ], + [ + "git_note_iterator", + { + "decl": "git_note_iterator", + "type": "struct", + "value": "git_note_iterator", + "file": "git2/notes.h", + "line": 37, + "lineto": 37, + "tdef": "typedef", + "description": " note iterator", + "comments": "", + "used": { + "returns": [], + "needs": ["git_note_iterator_free", "git_note_next"] + } + } + ], + [ + "git_object", + { + "decl": "git_object", + "type": "struct", + "value": "git_object", + "file": "git2/types.h", + "line": 129, + "lineto": 129, + "tdef": "typedef", + "description": " Representation of a generic object in a repository ", + "comments": "", + "used": { + "returns": [ + "git_blob_rawsize", + "git_object_string2type", + "git_object_type", + "git_odb_object_type", + "git_tag_target_type", + "git_tree_entry_type" + ], + "needs": [ + "git_checkout_tree", + "git_describe_commit", + "git_object__size", + "git_object_dup", + "git_object_free", + "git_object_id", + "git_object_lookup", + "git_object_lookup_bypath", + "git_object_lookup_prefix", + "git_object_owner", + "git_object_peel", + "git_object_rawcontent_is_valid", + "git_object_short_id", + "git_object_type", + "git_object_type2string", + "git_object_typeisloose", + "git_odb_hash", + "git_odb_hashfile", + "git_odb_open_rstream", + "git_odb_open_wstream", + "git_odb_read_header", + "git_odb_write", + "git_reference_peel", + "git_repository_hashfile", + "git_reset", + "git_reset_default", + "git_revparse_ext", + "git_revparse_single", + "git_tag_annotation_create", + "git_tag_create", + "git_tag_create_lightweight", + "git_tag_peel", + "git_tag_target", + "git_tree_entry_to_object" + ] + } + } + ], + [ + "git_object_t", + { + "decl": [ + "GIT_OBJECT_ANY", + "GIT_OBJECT_INVALID", + "GIT_OBJECT_COMMIT", + "GIT_OBJECT_TREE", + "GIT_OBJECT_BLOB", + "GIT_OBJECT_TAG", + "GIT_OBJECT_OFS_DELTA", + "GIT_OBJECT_REF_DELTA" + ], + "type": "enum", + "file": "git2/types.h", + "line": 73, + "lineto": 82, + "block": "GIT_OBJECT_ANY\nGIT_OBJECT_INVALID\nGIT_OBJECT_COMMIT\nGIT_OBJECT_TREE\nGIT_OBJECT_BLOB\nGIT_OBJECT_TAG\nGIT_OBJECT_OFS_DELTA\nGIT_OBJECT_REF_DELTA", + "tdef": "typedef", + "description": " Basic type (loose or packed) of any Git object. ", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_OBJECT_ANY", + "comments": "

Object can be any of the following

\n", + "value": -2 + }, + { + "type": "int", + "name": "GIT_OBJECT_INVALID", + "comments": "

Object is invalid.

\n", + "value": -1 + }, + { + "type": "int", + "name": "GIT_OBJECT_COMMIT", + "comments": "

A commit object.

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_OBJECT_TREE", + "comments": "

A tree (directory listing) object.

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_OBJECT_BLOB", + "comments": "

A file revision object.

\n", + "value": 3 + }, + { + "type": "int", + "name": "GIT_OBJECT_TAG", + "comments": "

An annotated tag object.

\n", + "value": 4 + }, + { + "type": "int", + "name": "GIT_OBJECT_OFS_DELTA", + "comments": "

A delta, base is given by an offset.

\n", + "value": 6 + }, + { + "type": "int", + "name": "GIT_OBJECT_REF_DELTA", + "comments": "

A delta, base is given by object id.

\n", + "value": 7 + } + ], + "used": { + "returns": [ + "git_object_string2type", + "git_object_type", + "git_odb_object_type", + "git_tag_target_type", + "git_tree_entry_type" + ], + "needs": [ + "git_object__size", + "git_object_lookup", + "git_object_lookup_bypath", + "git_object_lookup_prefix", + "git_object_peel", + "git_object_rawcontent_is_valid", + "git_object_type2string", + "git_object_typeisloose", + "git_odb_hash", + "git_odb_hashfile", + "git_odb_open_rstream", + "git_odb_open_wstream", + "git_odb_read_header", + "git_odb_write", + "git_reference_peel", + "git_repository_hashfile" + ] + } + } + ], + [ + "git_odb", + { + "decl": "git_odb", + "type": "struct", + "value": "git_odb", + "file": "git2/types.h", + "line": 88, + "lineto": 88, + "tdef": "typedef", + "description": " An object database stores the objects (commit, trees, blobs, tags,\n etc) for a repository.", + "comments": "", + "used": { + "returns": [], + "needs": [ + "git_indexer_new", + "git_odb_add_alternate", + "git_odb_add_backend", + "git_odb_add_disk_alternate", + "git_odb_backend_loose", + "git_odb_backend_one_pack", + "git_odb_backend_pack", + "git_odb_exists", + "git_odb_exists_ext", + "git_odb_exists_prefix", + "git_odb_expand_ids", + "git_odb_foreach", + "git_odb_free", + "git_odb_get_backend", + "git_odb_new", + "git_odb_num_backends", + "git_odb_object_data", + "git_odb_object_dup", + "git_odb_object_free", + "git_odb_object_id", + "git_odb_object_size", + "git_odb_object_type", + "git_odb_open", + "git_odb_open_rstream", + "git_odb_open_wstream", + "git_odb_read", + "git_odb_read_header", + "git_odb_read_prefix", + "git_odb_refresh", + "git_odb_set_commit_graph", + "git_odb_stream_finalize_write", + "git_odb_stream_free", + "git_odb_stream_read", + "git_odb_stream_write", + "git_odb_write", + "git_odb_write_multi_pack_index", + "git_odb_write_pack", + "git_repository_odb", + "git_repository_wrap_odb" + ] + } + } + ], + [ + "git_odb_backend", + { + "decl": "git_odb_backend", + "type": "struct", + "value": "git_odb_backend", + "file": "git2/types.h", + "line": 91, + "lineto": 91, + "tdef": "typedef", + "description": " A custom backend in an ODB ", + "comments": "", + "used": { + "returns": [], + "needs": [ + "git_odb_add_alternate", + "git_odb_add_backend", + "git_odb_backend_loose", + "git_odb_backend_one_pack", + "git_odb_backend_pack", + "git_odb_get_backend" + ] + } + } + ], + [ + "git_odb_backend_loose_options", + { + "decl": [ + "unsigned int version", + "uint32_t flags", + "int compression_level", + "unsigned int dir_mode", + "unsigned int file_mode", + "git_oid_t oid_type" + ], + "type": "struct", + "value": "git_odb_backend_loose_options", + "file": "git2/odb_backend.h", + "line": 49, + "lineto": 75, + "block": "unsigned int version\nuint32_t flags\nint compression_level\nunsigned int dir_mode\nunsigned int file_mode\ngit_oid_t oid_type", + "tdef": "typedef", + "description": " Options for configuring a loose object backend. ", + "comments": "", + "fields": [ + { + "type": "unsigned int", + "name": "version", + "comments": " version for the struct " + }, + { + "type": "uint32_t", + "name": "flags", + "comments": " A combination of the `git_odb_backend_loose_flag_t` types. " + }, + { + "type": "int", + "name": "compression_level", + "comments": " zlib compression level to use (0-9), where 1 is the fastest\n at the expense of larger files, and 9 produces the best\n compression at the expense of speed. 0 indicates that no\n compression should be performed. -1 is the default (currently\n optimizing for speed)." + }, + { + "type": "unsigned int", + "name": "dir_mode", + "comments": " Permissions to use creating a directory or 0 for defaults " + }, + { + "type": "unsigned int", + "name": "file_mode", + "comments": " Permissions to use creating a file or 0 for defaults " + }, + { + "type": "git_oid_t", + "name": "oid_type", + "comments": " Type of object IDs to use for this object database, or\n 0 for default (currently SHA1)." + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_odb_backend_pack_options", + { + "decl": ["unsigned int version", "git_oid_t oid_type"], + "type": "struct", + "value": "git_odb_backend_pack_options", + "file": "git2/odb_backend.h", + "line": 24, + "lineto": 32, + "block": "unsigned int version\ngit_oid_t oid_type", + "tdef": "typedef", + "description": " Options for configuring a packfile object backend. ", + "comments": "", + "fields": [ + { + "type": "unsigned int", + "name": "version", + "comments": " version for the struct " + }, + { + "type": "git_oid_t", + "name": "oid_type", + "comments": " Type of object IDs to use for this object database, or\n 0 for default (currently SHA1)." + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_odb_expand_id", + { + "decl": ["git_oid id", "unsigned short length", "git_object_t type"], + "type": "struct", + "value": "git_odb_expand_id", + "file": "git2/odb.h", + "line": 250, + "lineto": 265, + "block": "git_oid id\nunsigned short length\ngit_object_t type", + "tdef": "typedef", + "description": " The information about object IDs to query in `git_odb_expand_ids`,\n which will be populated upon return.", + "comments": "", + "fields": [ + { + "type": "git_oid", + "name": "id", + "comments": " The object ID to expand " + }, + { + "type": "unsigned short", + "name": "length", + "comments": " The length of the object ID (in nibbles, or packets of 4 bits; the\n number of hex characters)" + }, + { + "type": "git_object_t", + "name": "type", + "comments": " The (optional) type of the object to search for; leave as `0` or set\n to `GIT_OBJECT_ANY` to query for any object matching the ID." + } + ], + "used": { "returns": [], "needs": ["git_odb_expand_ids"] } + } + ], + [ + "git_odb_lookup_flags_t", + { + "decl": ["GIT_ODB_LOOKUP_NO_REFRESH"], + "type": "enum", + "file": "git2/odb.h", + "line": 26, + "lineto": 34, + "block": "GIT_ODB_LOOKUP_NO_REFRESH", + "tdef": "typedef", + "description": " Flags controlling the behavior of ODB lookup operations ", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_ODB_LOOKUP_NO_REFRESH", + "comments": "

Don't call git_odb_refresh if the lookup fails. Useful when doing\n a batch of lookup operations for objects that may legitimately not\n exist. When using this flag, you may wish to manually call\n git_odb_refresh before processing a batch of objects.

\n", + "value": 1 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_odb_object", + { + "decl": "git_odb_object", + "type": "struct", + "value": "git_odb_object", + "file": "git2/types.h", + "line": 96, + "lineto": 96, + "tdef": "typedef", + "description": " A \"raw\" object read from the object database.", + "comments": "", + "used": { + "returns": [], + "needs": [ + "git_odb_object_data", + "git_odb_object_dup", + "git_odb_object_free", + "git_odb_object_id", + "git_odb_object_size", + "git_odb_object_type", + "git_odb_read", + "git_odb_read_prefix" + ] + } + } + ], + [ + "git_odb_options", + { + "decl": ["unsigned int version", "git_oid_t oid_type"], + "type": "struct", + "value": "git_odb_options", + "file": "git2/odb.h", + "line": 46, + "lineto": 54, + "block": "unsigned int version\ngit_oid_t oid_type", + "tdef": "typedef", + "description": " Options for configuring a loose object backend. ", + "comments": "", + "fields": [ + { + "type": "unsigned int", + "name": "version", + "comments": " version for the struct " + }, + { + "type": "git_oid_t", + "name": "oid_type", + "comments": " Type of object IDs to use for this object database, or\n 0 for default (currently SHA1)." + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_odb_stream", + { + "decl": "git_odb_stream", + "type": "struct", + "value": "git_odb_stream", + "file": "git2/types.h", + "line": 99, + "lineto": 99, + "block": "git_odb_backend * backend\nunsigned int mode\nvoid * hash_ctx\ngit_object_size_t declared_size\ngit_object_size_t received_bytes\nint (*)(git_odb_stream *, char *, size_t) read\nint (*)(git_odb_stream *, const char *, size_t) write\nint (*)(git_odb_stream *, const git_oid *) finalize_write\nvoid (*)(git_odb_stream *) free", + "tdef": "typedef", + "description": " A stream to read/write from the ODB ", + "comments": "", + "fields": [ + { "type": "git_odb_backend *", "name": "backend", "comments": "" }, + { "type": "unsigned int", "name": "mode", "comments": "" }, + { "type": "void *", "name": "hash_ctx", "comments": "" }, + { + "type": "git_object_size_t", + "name": "declared_size", + "comments": "" + }, + { + "type": "git_object_size_t", + "name": "received_bytes", + "comments": "" + }, + { + "type": "int (*)(git_odb_stream *, char *, size_t)", + "name": "read", + "comments": "" + }, + { + "type": "int (*)(git_odb_stream *, const char *, size_t)", + "name": "write", + "comments": "" + }, + { + "type": "int (*)(git_odb_stream *, const git_oid *)", + "name": "finalize_write", + "comments": "" + }, + { + "type": "void (*)(git_odb_stream *)", + "name": "free", + "comments": "" + } + ], + "used": { + "returns": [], + "needs": [ + "git_odb_open_rstream", + "git_odb_open_wstream", + "git_odb_stream_finalize_write", + "git_odb_stream_free", + "git_odb_stream_read", + "git_odb_stream_write" + ] + } + } + ], + [ + "git_odb_stream_t", + { + "decl": ["GIT_STREAM_RDONLY", "GIT_STREAM_WRONLY", "GIT_STREAM_RW"], + "type": "enum", + "file": "git2/odb_backend.h", + "line": 182, + "lineto": 186, + "block": "GIT_STREAM_RDONLY\nGIT_STREAM_WRONLY\nGIT_STREAM_RW", + "tdef": "typedef", + "description": " Streaming mode ", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_STREAM_RDONLY", + "comments": "", + "value": 2 + }, + { + "type": "int", + "name": "GIT_STREAM_WRONLY", + "comments": "", + "value": 4 + }, + { "type": "int", "name": "GIT_STREAM_RW", "comments": "", "value": 6 } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_odb_writepack", + { + "decl": "git_odb_writepack", + "type": "struct", + "value": "git_odb_writepack", + "file": "git2/types.h", + "line": 102, + "lineto": 102, + "block": "git_odb_backend * backend\nint (*)(git_odb_writepack *, const void *, size_t, git_indexer_progress *) append\nint (*)(git_odb_writepack *, git_indexer_progress *) commit\nvoid (*)(git_odb_writepack *) free", + "tdef": "typedef", + "description": " A stream to write a packfile to the ODB ", + "comments": "", + "fields": [ + { "type": "git_odb_backend *", "name": "backend", "comments": "" }, + { + "type": "int (*)(git_odb_writepack *, const void *, size_t, git_indexer_progress *)", + "name": "append", + "comments": "" + }, + { + "type": "int (*)(git_odb_writepack *, git_indexer_progress *)", + "name": "commit", + "comments": "" + }, + { + "type": "void (*)(git_odb_writepack *)", + "name": "free", + "comments": "" + } + ], + "used": { "returns": [], "needs": ["git_odb_write_pack"] } + } + ], + [ + "git_oid", + { + "decl": ["unsigned char [20] id"], + "type": "struct", + "value": "git_oid", + "file": "git2/oid.h", + "line": 103, + "lineto": 112, + "block": "unsigned char [20] id", + "tdef": "typedef", + "description": " Unique identity of any object (commit, tree, blob, tag). ", + "comments": "", + "fields": [ + { + "type": "unsigned char [20]", + "name": "id", + "comments": " raw binary formatted id " + } + ], + "used": { + "returns": [ + "git_annotated_commit_id", + "git_blob_id", + "git_commit_id", + "git_commit_parent_id", + "git_commit_tree_id", + "git_index_checksum", + "git_indexer_hash", + "git_object_id", + "git_odb_object_id", + "git_oid_shorten_new", + "git_packbuilder_hash", + "git_rebase_onto_id", + "git_rebase_orig_head_id", + "git_reference_target", + "git_reference_target_peel", + "git_reflog_entry_id_new", + "git_reflog_entry_id_old", + "git_repository_oid_type", + "git_submodule_head_id", + "git_submodule_index_id", + "git_submodule_wd_id", + "git_tag_id", + "git_tag_target_id", + "git_tree_entry_id", + "git_tree_id" + ], + "needs": [ + "git_annotated_commit_from_fetchhead", + "git_annotated_commit_lookup", + "git_blob_create_from_buffer", + "git_blob_create_from_disk", + "git_blob_create_from_stream_commit", + "git_blob_create_from_workdir", + "git_blob_lookup", + "git_blob_lookup_prefix", + "git_commit_amend", + "git_commit_create", + "git_commit_create_cb", + "git_commit_create_from_stage", + "git_commit_create_v", + "git_commit_create_with_signature", + "git_commit_extract_signature", + "git_commit_lookup", + "git_commit_lookup_prefix", + "git_diff_patchid", + "git_graph_ahead_behind", + "git_graph_descendant_of", + "git_graph_reachable_from_any", + "git_index_write_tree", + "git_index_write_tree_to", + "git_merge_base", + "git_merge_base_many", + "git_merge_base_octopus", + "git_merge_bases", + "git_merge_bases_many", + "git_note_foreach_cb", + "git_note_next", + "git_object_lookup", + "git_object_lookup_prefix", + "git_odb_exists", + "git_odb_exists_ext", + "git_odb_exists_prefix", + "git_odb_foreach_cb", + "git_odb_hash", + "git_odb_hashfile", + "git_odb_open_rstream", + "git_odb_read", + "git_odb_read_header", + "git_odb_read_prefix", + "git_odb_stream_finalize_write", + "git_odb_write", + "git_oid_cmp", + "git_oid_cpy", + "git_oid_equal", + "git_oid_fmt", + "git_oid_fromraw", + "git_oid_fromstr", + "git_oid_fromstrn", + "git_oid_fromstrp", + "git_oid_is_zero", + "git_oid_ncmp", + "git_oid_nfmt", + "git_oid_pathfmt", + "git_oid_shorten_add", + "git_oid_shorten_free", + "git_oid_strcmp", + "git_oid_streq", + "git_oid_tostr", + "git_oid_tostr_s", + "git_oidarray_dispose", + "git_oidarray_free", + "git_packbuilder_insert", + "git_packbuilder_insert_commit", + "git_packbuilder_insert_recur", + "git_packbuilder_insert_tree", + "git_rebase_commit", + "git_reference_create", + "git_reference_create_matching", + "git_reference_name_to_id", + "git_reference_set_target", + "git_reflog_append", + "git_repository_fetchhead_foreach_cb", + "git_repository_hashfile", + "git_repository_mergehead_foreach_cb", + "git_repository_set_head_detached", + "git_revwalk_hide", + "git_revwalk_hide_cb", + "git_revwalk_next", + "git_revwalk_push", + "git_stash_cb", + "git_stash_save", + "git_stash_save_with_opts", + "git_tag_annotation_create", + "git_tag_create", + "git_tag_create_from_buffer", + "git_tag_create_lightweight", + "git_tag_foreach_cb", + "git_tag_lookup", + "git_tag_lookup_prefix", + "git_transaction_set_target", + "git_tree_create_updated", + "git_tree_entry_byid", + "git_tree_lookup", + "git_tree_lookup_prefix", + "git_treebuilder_insert", + "git_treebuilder_write", + "git_treebuilder_write_with_buffer" + ] + } + } + ], + [ + "git_oid_shorten", + { + "decl": "git_oid_shorten", + "type": "struct", + "value": "git_oid_shorten", + "file": "git2/oid.h", + "line": 317, + "lineto": 317, + "tdef": "typedef", + "description": " OID Shortener object", + "comments": "", + "used": { + "returns": ["git_oid_shorten_new"], + "needs": ["git_oid_shorten_add", "git_oid_shorten_free"] + } + } + ], + [ + "git_oid_t", + { + "decl": ["GIT_OID_SHA1"], + "type": "enum", + "file": "git2/oid.h", + "line": 23, + "lineto": 32, + "block": "GIT_OID_SHA1", + "tdef": "typedef", + "description": " The type of object id. ", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_OID_SHA1", + "comments": "

SHA1

\n", + "value": 1 + } + ], + "used": { "returns": ["git_repository_oid_type"], "needs": [] } + } + ], + [ + "git_oidarray", + { + "decl": ["git_oid * ids", "size_t count"], + "type": "struct", + "value": "git_oidarray", + "file": "git2/oidarray.h", + "line": 23, + "lineto": 26, + "block": "git_oid * ids\nsize_t count", + "tdef": "typedef", + "description": " Array of object ids ", + "comments": "", + "fields": [ + { "type": "git_oid *", "name": "ids", "comments": "" }, + { "type": "size_t", "name": "count", "comments": "" } + ], + "used": { + "returns": [], + "needs": [ + "git_merge_bases", + "git_merge_bases_many", + "git_oidarray_dispose", + "git_oidarray_free" + ] + } + } + ], + [ + "git_packbuilder", + { + "decl": "git_packbuilder", + "type": "struct", + "value": "git_packbuilder", + "file": "git2/types.h", + "line": 177, + "lineto": 177, + "tdef": "typedef", + "description": " Representation of a git packbuilder ", + "comments": "", + "used": { + "returns": [], + "needs": [ + "git_packbuilder_foreach", + "git_packbuilder_free", + "git_packbuilder_hash", + "git_packbuilder_insert", + "git_packbuilder_insert_commit", + "git_packbuilder_insert_recur", + "git_packbuilder_insert_tree", + "git_packbuilder_insert_walk", + "git_packbuilder_name", + "git_packbuilder_new", + "git_packbuilder_object_count", + "git_packbuilder_set_callbacks", + "git_packbuilder_set_threads", + "git_packbuilder_write", + "git_packbuilder_write_buf", + "git_packbuilder_written" + ] + } + } + ], + [ + "git_packbuilder_stage_t", + { + "decl": [ + "GIT_PACKBUILDER_ADDING_OBJECTS", + "GIT_PACKBUILDER_DELTAFICATION" + ], + "type": "enum", + "file": "git2/pack.h", + "line": 52, + "lineto": 55, + "block": "GIT_PACKBUILDER_ADDING_OBJECTS\nGIT_PACKBUILDER_DELTAFICATION", + "tdef": "typedef", + "description": " Stages that are reported by the packbuilder progress callback.", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_PACKBUILDER_ADDING_OBJECTS", + "comments": "", + "value": 0 + }, + { + "type": "int", + "name": "GIT_PACKBUILDER_DELTAFICATION", + "comments": "", + "value": 1 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_patch", + { + "decl": "git_patch", + "type": "struct", + "value": "git_patch", + "file": "git2/patch.h", + "line": 29, + "lineto": 29, + "tdef": "typedef", + "description": " The diff patch is used to store all the text diffs for a delta.", + "comments": "

You can easily loop over the content of patches and get information about them.

\n", + "used": { + "returns": [], + "needs": [ + "git_patch_free", + "git_patch_from_blob_and_buffer", + "git_patch_from_blobs", + "git_patch_from_buffers", + "git_patch_from_diff", + "git_patch_get_delta", + "git_patch_get_hunk", + "git_patch_get_line_in_hunk", + "git_patch_line_stats", + "git_patch_num_hunks", + "git_patch_num_lines_in_hunk", + "git_patch_owner", + "git_patch_print", + "git_patch_size", + "git_patch_to_buf" + ] + } + } + ], + [ + "git_path_fs", + { + "decl": ["GIT_PATH_FS_GENERIC", "GIT_PATH_FS_NTFS", "GIT_PATH_FS_HFS"], + "type": "enum", + "file": "git2/sys/path.h", + "line": 44, + "lineto": 51, + "block": "GIT_PATH_FS_GENERIC\nGIT_PATH_FS_NTFS\nGIT_PATH_FS_HFS", + "tdef": "typedef", + "description": " The kinds of checks to perform according to which filesystem we are trying to\n protect.", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_PATH_FS_GENERIC", + "comments": "

Do both NTFS- and HFS-specific checks

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_PATH_FS_NTFS", + "comments": "

Do NTFS-specific checks only

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_PATH_FS_HFS", + "comments": "

Do HFS-specific checks only

\n", + "value": 2 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_pathspec", + { + "decl": "git_pathspec", + "type": "struct", + "value": "git_pathspec", + "file": "git2/pathspec.h", + "line": 27, + "lineto": 27, + "tdef": "typedef", + "description": " Compiled pathspec", + "comments": "", + "used": { + "returns": [], + "needs": [ + "git_pathspec_free", + "git_pathspec_match_diff", + "git_pathspec_match_index", + "git_pathspec_match_list_diff_entry", + "git_pathspec_match_list_entry", + "git_pathspec_match_list_entrycount", + "git_pathspec_match_list_failed_entry", + "git_pathspec_match_list_failed_entrycount", + "git_pathspec_match_list_free", + "git_pathspec_match_tree", + "git_pathspec_match_workdir", + "git_pathspec_matches_path", + "git_pathspec_new" + ] + } + } + ], + [ + "git_pathspec_flag_t", + { + "decl": [ + "GIT_PATHSPEC_DEFAULT", + "GIT_PATHSPEC_IGNORE_CASE", + "GIT_PATHSPEC_USE_CASE", + "GIT_PATHSPEC_NO_GLOB", + "GIT_PATHSPEC_NO_MATCH_ERROR", + "GIT_PATHSPEC_FIND_FAILURES", + "GIT_PATHSPEC_FAILURES_ONLY" + ], + "type": "enum", + "file": "git2/pathspec.h", + "line": 37, + "lineto": 80, + "block": "GIT_PATHSPEC_DEFAULT\nGIT_PATHSPEC_IGNORE_CASE\nGIT_PATHSPEC_USE_CASE\nGIT_PATHSPEC_NO_GLOB\nGIT_PATHSPEC_NO_MATCH_ERROR\nGIT_PATHSPEC_FIND_FAILURES\nGIT_PATHSPEC_FAILURES_ONLY", + "tdef": "typedef", + "description": " Options controlling how pathspec match should be executed", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_PATHSPEC_DEFAULT", + "comments": "", + "value": 0 + }, + { + "type": "int", + "name": "GIT_PATHSPEC_IGNORE_CASE", + "comments": "

GIT_PATHSPEC_IGNORE_CASE forces match to ignore case; otherwise\n match will use native case sensitivity of platform filesystem

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_PATHSPEC_USE_CASE", + "comments": "

GIT_PATHSPEC_USE_CASE forces case sensitive match; otherwise\n match will use native case sensitivity of platform filesystem

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_PATHSPEC_NO_GLOB", + "comments": "

GIT_PATHSPEC_NO_GLOB disables glob patterns and just uses simple\n string comparison for matching

\n", + "value": 4 + }, + { + "type": "int", + "name": "GIT_PATHSPEC_NO_MATCH_ERROR", + "comments": "

GIT_PATHSPEC_NO_MATCH_ERROR means the match functions return error\n code GIT_ENOTFOUND if no matches are found; otherwise no matches is\n still success (return 0) but git_pathspec_match_list_entrycount\n will indicate 0 matches.

\n", + "value": 8 + }, + { + "type": "int", + "name": "GIT_PATHSPEC_FIND_FAILURES", + "comments": "

GIT_PATHSPEC_FIND_FAILURES means that the git_pathspec_match_list\n should track which patterns matched which files so that at the end of\n the match we can identify patterns that did not match any files.

\n", + "value": 16 + }, + { + "type": "int", + "name": "GIT_PATHSPEC_FAILURES_ONLY", + "comments": "

GIT_PATHSPEC_FAILURES_ONLY means that the git_pathspec_match_list\n does not need to keep the actual matching filenames. Use this to\n just test if there were any matches at all or in combination with\n GIT_PATHSPEC_FIND_FAILURES to validate a pathspec.

\n", + "value": 32 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_pathspec_match_list", + { + "decl": "git_pathspec_match_list", + "type": "struct", + "value": "git_pathspec_match_list", + "file": "git2/pathspec.h", + "line": 32, + "lineto": 32, + "tdef": "typedef", + "description": " List of filenames matching a pathspec", + "comments": "", + "used": { + "returns": [], + "needs": [ + "git_pathspec_match_diff", + "git_pathspec_match_index", + "git_pathspec_match_list_diff_entry", + "git_pathspec_match_list_entry", + "git_pathspec_match_list_entrycount", + "git_pathspec_match_list_failed_entry", + "git_pathspec_match_list_failed_entrycount", + "git_pathspec_match_list_free", + "git_pathspec_match_tree", + "git_pathspec_match_workdir" + ] + } + } + ], + [ + "git_proxy_options", + { + "decl": [ + "unsigned int version", + "git_proxy_t type", + "const char * url", + "git_credential_acquire_cb credentials", + "git_transport_certificate_check_cb certificate_check", + "void * payload" + ], + "type": "struct", + "value": "git_proxy_options", + "file": "git2/proxy.h", + "line": 50, + "lineto": 85, + "block": "unsigned int version\ngit_proxy_t type\nconst char * url\ngit_credential_acquire_cb credentials\ngit_transport_certificate_check_cb certificate_check\nvoid * payload", + "tdef": "typedef", + "description": " Options for connecting through a proxy", + "comments": "

Note that not all types may be supported, depending on the platform and compilation options.

\n", + "fields": [ + { "type": "unsigned int", "name": "version", "comments": "" }, + { + "type": "git_proxy_t", + "name": "type", + "comments": " The type of proxy to use, by URL, auto-detect." + }, + { + "type": "const char *", + "name": "url", + "comments": " The URL of the proxy." + }, + { + "type": "git_credential_acquire_cb", + "name": "credentials", + "comments": " This will be called if the remote host requires\n authentication in order to connect to it.\n\n Returning GIT_PASSTHROUGH will make libgit2 behave as\n though this field isn't set." + }, + { + "type": "git_transport_certificate_check_cb", + "name": "certificate_check", + "comments": " If cert verification fails, this will be called to let the\n user make the final decision of whether to allow the\n connection to proceed. Returns 0 to allow the connection\n or a negative value to indicate an error." + }, + { + "type": "void *", + "name": "payload", + "comments": " Payload to be provided to the credentials and certificate\n check callbacks." + } + ], + "used": { + "returns": [], + "needs": ["git_proxy_options_init", "git_remote_connect"] + } + } + ], + [ + "git_proxy_t", + { + "decl": ["GIT_PROXY_NONE", "GIT_PROXY_AUTO", "GIT_PROXY_SPECIFIED"], + "type": "enum", + "file": "git2/proxy.h", + "line": 26, + "lineto": 42, + "block": "GIT_PROXY_NONE\nGIT_PROXY_AUTO\nGIT_PROXY_SPECIFIED", + "tdef": "typedef", + "description": " The type of proxy to use.", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_PROXY_NONE", + "comments": "

Do not attempt to connect through a proxy

\n\n

If built against libcurl, it itself may attempt to connect\n to a proxy if the environment variables specify it.

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_PROXY_AUTO", + "comments": "

Try to auto-detect the proxy from the git configuration.

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_PROXY_SPECIFIED", + "comments": "

Connect via the URL given in the options

\n", + "value": 2 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_push", + { + "decl": "git_push", + "type": "struct", + "value": "git_push", + "file": "git2/types.h", + "line": 269, + "lineto": 269, + "tdef": "typedef", + "description": " Preparation for a push operation. Can be used to configure what to\n push and the level of parallelism of the packfile builder.", + "comments": "", + "used": { + "returns": [], + "needs": [ + "git_push_negotiation", + "git_push_options_init", + "git_remote_push", + "git_remote_upload" + ] + } + } + ], + [ + "git_push_options", + { + "decl": [ + "unsigned int version", + "unsigned int pb_parallelism", + "git_remote_callbacks callbacks", + "git_proxy_options proxy_opts", + "git_remote_redirect_t follow_redirects", + "git_strarray custom_headers", + "git_strarray remote_push_options" + ], + "type": "struct", + "value": "git_push_options", + "file": "git2/remote.h", + "line": 860, + "lineto": 899, + "block": "unsigned int version\nunsigned int pb_parallelism\ngit_remote_callbacks callbacks\ngit_proxy_options proxy_opts\ngit_remote_redirect_t follow_redirects\ngit_strarray custom_headers\ngit_strarray remote_push_options", + "tdef": "typedef", + "description": " Controls the behavior of a git_push object.", + "comments": "", + "fields": [ + { "type": "unsigned int", "name": "version", "comments": "" }, + { + "type": "unsigned int", + "name": "pb_parallelism", + "comments": " If the transport being used to push to the remote requires the creation\n of a pack file, this controls the number of worker threads used by\n the packbuilder when creating that pack file to be sent to the remote.\n\n If set to 0, the packbuilder will auto-detect the number of threads\n to create. The default value is 1." + }, + { + "type": "git_remote_callbacks", + "name": "callbacks", + "comments": " Callbacks to use for this push operation" + }, + { + "type": "git_proxy_options", + "name": "proxy_opts", + "comments": " Proxy options to use, by default no proxy is used." + }, + { + "type": "git_remote_redirect_t", + "name": "follow_redirects", + "comments": " Whether to allow off-site redirects. If this is not\n specified, the `http.followRedirects` configuration setting\n will be consulted." + }, + { + "type": "git_strarray", + "name": "custom_headers", + "comments": " Extra headers for this push operation" + }, + { + "type": "git_strarray", + "name": "remote_push_options", + "comments": " \"Push options\" to deliver to the remote." + } + ], + "used": { + "returns": [], + "needs": [ + "git_push_options_init", + "git_remote_push", + "git_remote_upload" + ] + } + } + ], + [ + "git_push_update", + { + "decl": [ + "char * src_refname", + "char * dst_refname", + "git_oid src", + "git_oid dst" + ], + "type": "struct", + "value": "git_push_update", + "file": "git2/remote.h", + "line": 490, + "lineto": 507, + "block": "char * src_refname\nchar * dst_refname\ngit_oid src\ngit_oid dst", + "tdef": "typedef", + "description": " Represents an update which will be performed on the remote during push", + "comments": "", + "fields": [ + { + "type": "char *", + "name": "src_refname", + "comments": " The source name of the reference" + }, + { + "type": "char *", + "name": "dst_refname", + "comments": " The name of the reference to update on the server" + }, + { + "type": "git_oid", + "name": "src", + "comments": " The current target of the reference" + }, + { + "type": "git_oid", + "name": "dst", + "comments": " The new target for the reference" + } + ], + "used": { "returns": [], "needs": ["git_push_negotiation"] } + } + ], + [ + "git_rebase", + { + "decl": "git_rebase", + "type": "struct", + "value": "git_rebase", + "file": "git2/types.h", + "line": 220, + "lineto": 220, + "tdef": "typedef", + "description": " Representation of a rebase ", + "comments": "", + "used": { + "returns": ["git_rebase_operation_byindex"], + "needs": [ + "git_rebase_abort", + "git_rebase_commit", + "git_rebase_finish", + "git_rebase_free", + "git_rebase_init", + "git_rebase_inmemory_index", + "git_rebase_next", + "git_rebase_onto_id", + "git_rebase_onto_name", + "git_rebase_open", + "git_rebase_operation_byindex", + "git_rebase_operation_current", + "git_rebase_operation_entrycount", + "git_rebase_options_init", + "git_rebase_orig_head_id", + "git_rebase_orig_head_name" + ] + } + } + ], + [ + "git_rebase_operation", + { + "decl": [ + "git_rebase_operation_t type", + "const git_oid id", + "const char * exec" + ], + "type": "struct", + "value": "git_rebase_operation", + "file": "git2/rebase.h", + "line": 174, + "lineto": 189, + "block": "git_rebase_operation_t type\nconst git_oid id\nconst char * exec", + "tdef": "typedef", + "description": " A rebase operation", + "comments": "

Describes a single instruction/operation to be performed during the rebase.

\n", + "fields": [ + { + "type": "git_rebase_operation_t", + "name": "type", + "comments": " The type of rebase operation. " + }, + { + "type": "const git_oid", + "name": "id", + "comments": " The commit ID being cherry-picked. This will be populated for\n all operations except those of type `GIT_REBASE_OPERATION_EXEC`." + }, + { + "type": "const char *", + "name": "exec", + "comments": " The executable the user has requested be run. This will only\n be populated for operations of type `GIT_REBASE_OPERATION_EXEC`." + } + ], + "used": { + "returns": ["git_rebase_operation_byindex"], + "needs": ["git_rebase_next"] + } + } + ], + [ + "git_rebase_operation_t", + { + "decl": [ + "GIT_REBASE_OPERATION_PICK", + "GIT_REBASE_OPERATION_REWORD", + "GIT_REBASE_OPERATION_EDIT", + "GIT_REBASE_OPERATION_SQUASH", + "GIT_REBASE_OPERATION_FIXUP", + "GIT_REBASE_OPERATION_EXEC" + ], + "type": "enum", + "file": "git2/rebase.h", + "line": 119, + "lineto": 155, + "block": "GIT_REBASE_OPERATION_PICK\nGIT_REBASE_OPERATION_REWORD\nGIT_REBASE_OPERATION_EDIT\nGIT_REBASE_OPERATION_SQUASH\nGIT_REBASE_OPERATION_FIXUP\nGIT_REBASE_OPERATION_EXEC", + "tdef": "typedef", + "description": " Type of rebase operation in-progress after calling `git_rebase_next`.", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_REBASE_OPERATION_PICK", + "comments": "

The given commit is to be cherry-picked. The client should commit\n the changes and continue if there are no conflicts.

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_REBASE_OPERATION_REWORD", + "comments": "

The given commit is to be cherry-picked, but the client should prompt\n the user to provide an updated commit message.

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_REBASE_OPERATION_EDIT", + "comments": "

The given commit is to be cherry-picked, but the client should stop\n to allow the user to edit the changes before committing them.

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_REBASE_OPERATION_SQUASH", + "comments": "

The given commit is to be squashed into the previous commit. The\n commit message will be merged with the previous message.

\n", + "value": 3 + }, + { + "type": "int", + "name": "GIT_REBASE_OPERATION_FIXUP", + "comments": "

The given commit is to be squashed into the previous commit. The\n commit message from this commit will be discarded.

\n", + "value": 4 + }, + { + "type": "int", + "name": "GIT_REBASE_OPERATION_EXEC", + "comments": "

No commit will be cherry-picked. The client should run the given\n command and (if successful) continue.

\n", + "value": 5 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_rebase_options", + { + "decl": [ + "unsigned int version", + "int quiet", + "int inmemory", + "const char * rewrite_notes_ref", + "git_merge_options merge_options", + "git_checkout_options checkout_options", + "git_commit_create_cb commit_create_cb", + "int (*)(git_buf *, git_buf *, const char *, void *) signing_cb", + "void * payload" + ], + "type": "struct", + "value": "git_rebase_options", + "file": "git2/rebase.h", + "line": 32, + "lineto": 114, + "block": "unsigned int version\nint quiet\nint inmemory\nconst char * rewrite_notes_ref\ngit_merge_options merge_options\ngit_checkout_options checkout_options\ngit_commit_create_cb commit_create_cb\nint (*)(git_buf *, git_buf *, const char *, void *) signing_cb\nvoid * payload", + "tdef": "typedef", + "description": " Rebase options", + "comments": "

Use to tell the rebase machinery how to operate.

\n", + "fields": [ + { "type": "unsigned int", "name": "version", "comments": "" }, + { + "type": "int", + "name": "quiet", + "comments": " Used by `git_rebase_init`, this will instruct other clients working\n on this rebase that you want a quiet rebase experience, which they\n may choose to provide in an application-specific manner. This has no\n effect upon libgit2 directly, but is provided for interoperability\n between Git tools." + }, + { + "type": "int", + "name": "inmemory", + "comments": " Used by `git_rebase_init`, this will begin an in-memory rebase,\n which will allow callers to step through the rebase operations and\n commit the rebased changes, but will not rewind HEAD or update the\n repository to be in a rebasing state. This will not interfere with\n the working directory (if there is one)." + }, + { + "type": "const char *", + "name": "rewrite_notes_ref", + "comments": " Used by `git_rebase_finish`, this is the name of the notes reference\n used to rewrite notes for rebased commits when finishing the rebase;\n if NULL, the contents of the configuration option `notes.rewriteRef`\n is examined, unless the configuration option `notes.rewrite.rebase`\n is set to false. If `notes.rewriteRef` is also NULL, notes will\n not be rewritten." + }, + { + "type": "git_merge_options", + "name": "merge_options", + "comments": " Options to control how trees are merged during `git_rebase_next`." + }, + { + "type": "git_checkout_options", + "name": "checkout_options", + "comments": " Options to control how files are written during `git_rebase_init`,\n `git_rebase_next` and `git_rebase_abort`. Note that during\n `abort`, these options will add an implied `GIT_CHECKOUT_FORCE`\n to match git semantics." + }, + { + "type": "git_commit_create_cb", + "name": "commit_create_cb", + "comments": " Optional callback that allows users to override commit\n creation in `git_rebase_commit`. If specified, users can\n create their own commit and provide the commit ID, which\n may be useful for signing commits or otherwise customizing\n the commit creation.\n\n If this callback returns `GIT_PASSTHROUGH`, then\n `git_rebase_commit` will continue to create the commit." + }, + { + "type": "int (*)(git_buf *, git_buf *, const char *, void *)", + "name": "signing_cb", + "comments": " If provided, this will be called with the commit content, allowing\n a signature to be added to the rebase commit. Can be skipped with\n GIT_PASSTHROUGH. If GIT_PASSTHROUGH is returned, a commit will be made\n without a signature.\n\n This field is only used when performing git_rebase_commit.\n\n This callback is not invoked if a `git_commit_create_cb` is\n specified.\n\n This callback is deprecated; users should provide a\n creation callback as `commit_create_cb` that produces a\n commit buffer, signs it, and commits it." + }, + { + "type": "void *", + "name": "payload", + "comments": " This will be passed to each of the callbacks in this struct\n as the last parameter." + } + ], + "used": { + "returns": [], + "needs": [ + "git_rebase_init", + "git_rebase_open", + "git_rebase_options_init" + ] + } + } + ], + [ + "git_refdb", + { + "decl": "git_refdb", + "type": "struct", + "value": "git_refdb", + "file": "git2/types.h", + "line": 108, + "lineto": 108, + "tdef": "typedef", + "description": " An open refs database handle. ", + "comments": "", + "used": { + "returns": [], + "needs": [ + "git_refdb_compress", + "git_refdb_free", + "git_refdb_new", + "git_refdb_open", + "git_repository_refdb" + ] + } + } + ], + [ + "git_refdb_backend", + { + "decl": "git_refdb_backend", + "type": "struct", + "value": "git_refdb_backend", + "file": "git2/types.h", + "line": 111, + "lineto": 111, + "tdef": "typedef", + "description": " A custom backend for refs ", + "comments": "", + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_reference", + { + "decl": "git_reference", + "type": "struct", + "value": "git_reference", + "file": "git2/types.h", + "line": 194, + "lineto": 194, + "tdef": "typedef", + "description": " In-memory representation of a reference. ", + "comments": "", + "used": { + "returns": ["git_reference_type"], + "needs": [ + "git_annotated_commit_from_ref", + "git_branch_create", + "git_branch_create_from_annotated", + "git_branch_delete", + "git_branch_is_checked_out", + "git_branch_is_head", + "git_branch_lookup", + "git_branch_move", + "git_branch_name", + "git_branch_next", + "git_branch_set_upstream", + "git_branch_upstream", + "git_merge_analysis_for_ref", + "git_reference_cmp", + "git_reference_create", + "git_reference_create_matching", + "git_reference_delete", + "git_reference_dup", + "git_reference_dwim", + "git_reference_foreach", + "git_reference_foreach_cb", + "git_reference_foreach_glob", + "git_reference_foreach_name", + "git_reference_free", + "git_reference_is_branch", + "git_reference_is_note", + "git_reference_is_remote", + "git_reference_is_tag", + "git_reference_iterator_free", + "git_reference_iterator_glob_new", + "git_reference_iterator_new", + "git_reference_lookup", + "git_reference_name", + "git_reference_next", + "git_reference_next_name", + "git_reference_owner", + "git_reference_peel", + "git_reference_rename", + "git_reference_resolve", + "git_reference_set_target", + "git_reference_shorthand", + "git_reference_symbolic_create", + "git_reference_symbolic_create_matching", + "git_reference_symbolic_set_target", + "git_reference_symbolic_target", + "git_reference_target", + "git_reference_target_peel", + "git_reference_type", + "git_repository_head", + "git_repository_head_for_worktree", + "git_revparse_ext" + ] + } + } + ], + [ + "git_reference_format_t", + { + "decl": [ + "GIT_REFERENCE_FORMAT_NORMAL", + "GIT_REFERENCE_FORMAT_ALLOW_ONELEVEL", + "GIT_REFERENCE_FORMAT_REFSPEC_PATTERN", + "GIT_REFERENCE_FORMAT_REFSPEC_SHORTHAND" + ], + "type": "enum", + "file": "git2/refs.h", + "line": 663, + "lineto": 692, + "block": "GIT_REFERENCE_FORMAT_NORMAL\nGIT_REFERENCE_FORMAT_ALLOW_ONELEVEL\nGIT_REFERENCE_FORMAT_REFSPEC_PATTERN\nGIT_REFERENCE_FORMAT_REFSPEC_SHORTHAND", + "tdef": "typedef", + "description": " Normalization options for reference lookup", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_REFERENCE_FORMAT_NORMAL", + "comments": "

No particular normalization.

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_REFERENCE_FORMAT_ALLOW_ONELEVEL", + "comments": "

Control whether one-level refnames are accepted\n (i.e., refnames that do not contain multiple /-separated\n components). Those are expected to be written only using\n uppercase letters and underscore (FETCH_HEAD, ...)

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_REFERENCE_FORMAT_REFSPEC_PATTERN", + "comments": "

Interpret the provided name as a reference pattern for a\n refspec (as used with remote repositories). If this option\n is enabled, the name is allowed to contain a single * (\n<star

\n\n
\n

)\n in place of a one full pathname component\n (e.g., foo/\n<star\n/bar but not foo/bar\n<star\n).

\n
\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_REFERENCE_FORMAT_REFSPEC_SHORTHAND", + "comments": "

Interpret the name as part of a refspec in shorthand form\n so the ONELEVEL naming rules aren't enforced and 'master'\n becomes a valid name.

\n", + "value": 4 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_reference_iterator", + { + "decl": "git_reference_iterator", + "type": "struct", + "value": "git_reference_iterator", + "file": "git2/types.h", + "line": 197, + "lineto": 197, + "tdef": "typedef", + "description": " Iterator for references ", + "comments": "", + "used": { + "returns": [], + "needs": [ + "git_reference_iterator_free", + "git_reference_iterator_glob_new", + "git_reference_iterator_new", + "git_reference_next", + "git_reference_next_name" + ] + } + } + ], + [ + "git_reference_t", + { + "decl": [ + "GIT_REFERENCE_INVALID", + "GIT_REFERENCE_DIRECT", + "GIT_REFERENCE_SYMBOLIC", + "GIT_REFERENCE_ALL" + ], + "type": "enum", + "file": "git2/types.h", + "line": 223, + "lineto": 228, + "block": "GIT_REFERENCE_INVALID\nGIT_REFERENCE_DIRECT\nGIT_REFERENCE_SYMBOLIC\nGIT_REFERENCE_ALL", + "tdef": "typedef", + "description": " Basic type of any Git reference. ", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_REFERENCE_INVALID", + "comments": "

Invalid reference

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_REFERENCE_DIRECT", + "comments": "

A reference that points at an object id

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_REFERENCE_SYMBOLIC", + "comments": "

A reference that points at another reference

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_REFERENCE_ALL", + "comments": "", + "value": 3 + } + ], + "used": { "returns": ["git_reference_type"], "needs": [] } + } + ], + [ + "git_reflog", + { + "decl": "git_reflog", + "type": "struct", + "value": "git_reflog", + "file": "git2/types.h", + "line": 171, + "lineto": 171, + "tdef": "typedef", + "description": " Representation of a reference log ", + "comments": "", + "used": { + "returns": ["git_reflog_entry_byindex"], + "needs": [ + "git_reflog_append", + "git_reflog_drop", + "git_reflog_entry_byindex", + "git_reflog_entry_committer", + "git_reflog_entry_id_new", + "git_reflog_entry_id_old", + "git_reflog_entry_message", + "git_reflog_entrycount", + "git_reflog_free", + "git_reflog_read", + "git_reflog_write", + "git_transaction_set_reflog" + ] + } + } + ], + [ + "git_reflog_entry", + { + "decl": "git_reflog_entry", + "type": "struct", + "value": "git_reflog_entry", + "file": "git2/types.h", + "line": 168, + "lineto": 168, + "tdef": "typedef", + "description": " Representation of a reference log entry ", + "comments": "", + "used": { + "returns": ["git_reflog_entry_byindex"], + "needs": [ + "git_reflog_entry_committer", + "git_reflog_entry_id_new", + "git_reflog_entry_id_old", + "git_reflog_entry_message" + ] + } + } + ], + [ + "git_refspec", + { + "decl": "git_refspec", + "type": "struct", + "value": "git_refspec", + "file": "git2/types.h", + "line": 251, + "lineto": 251, + "tdef": "typedef", + "description": " A refspec specifies the mapping between remote and local reference\n names when fetch or pushing.", + "comments": "", + "used": { + "returns": ["git_remote_get_refspec"], + "needs": [ + "git_refspec_direction", + "git_refspec_dst", + "git_refspec_dst_matches", + "git_refspec_force", + "git_refspec_free", + "git_refspec_parse", + "git_refspec_rtransform", + "git_refspec_src", + "git_refspec_src_matches", + "git_refspec_src_matches_negative", + "git_refspec_string", + "git_refspec_transform" + ] + } + } + ], + [ + "git_remote", + { + "decl": "git_remote", + "type": "struct", + "value": "git_remote", + "file": "git2/types.h", + "line": 257, + "lineto": 257, + "tdef": "typedef", + "description": " Git's idea of a remote repository. A remote can be anonymous (in\n which case it does not have backing configuration entries).", + "comments": "", + "used": { + "returns": ["git_remote_autotag"], + "needs": [ + "git_headlist_cb", + "git_remote_autotag", + "git_remote_connect", + "git_remote_connect_ext", + "git_remote_connect_options_init", + "git_remote_connected", + "git_remote_create", + "git_remote_create_anonymous", + "git_remote_create_cb", + "git_remote_create_detached", + "git_remote_create_options_init", + "git_remote_create_with_fetchspec", + "git_remote_create_with_opts", + "git_remote_default_branch", + "git_remote_disconnect", + "git_remote_download", + "git_remote_dup", + "git_remote_fetch", + "git_remote_free", + "git_remote_get_fetch_refspecs", + "git_remote_get_push_refspecs", + "git_remote_get_refspec", + "git_remote_init_callbacks", + "git_remote_lookup", + "git_remote_ls", + "git_remote_name", + "git_remote_owner", + "git_remote_prune", + "git_remote_prune_refs", + "git_remote_push", + "git_remote_pushurl", + "git_remote_ready_cb", + "git_remote_refspec_count", + "git_remote_set_autotag", + "git_remote_set_instance_pushurl", + "git_remote_set_instance_url", + "git_remote_stats", + "git_remote_stop", + "git_remote_update_tips", + "git_remote_upload", + "git_remote_url", + "git_transport_cb" + ] + } + } + ], + [ + "git_remote_autotag_option_t", + { + "decl": [ + "GIT_REMOTE_DOWNLOAD_TAGS_UNSPECIFIED", + "GIT_REMOTE_DOWNLOAD_TAGS_AUTO", + "GIT_REMOTE_DOWNLOAD_TAGS_NONE", + "GIT_REMOTE_DOWNLOAD_TAGS_ALL" + ], + "type": "enum", + "file": "git2/remote.h", + "line": 739, + "lineto": 757, + "block": "GIT_REMOTE_DOWNLOAD_TAGS_UNSPECIFIED\nGIT_REMOTE_DOWNLOAD_TAGS_AUTO\nGIT_REMOTE_DOWNLOAD_TAGS_NONE\nGIT_REMOTE_DOWNLOAD_TAGS_ALL", + "tdef": "typedef", + "description": " Automatic tag following option", + "comments": "

Lets us select the --tags option to use.

\n", + "fields": [ + { + "type": "int", + "name": "GIT_REMOTE_DOWNLOAD_TAGS_UNSPECIFIED", + "comments": "

Use the setting from the configuration.

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_REMOTE_DOWNLOAD_TAGS_AUTO", + "comments": "

Ask the server for tags pointing to objects we're already\n downloading.

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_REMOTE_DOWNLOAD_TAGS_NONE", + "comments": "

Don't ask for any tags beyond the refspecs.

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_REMOTE_DOWNLOAD_TAGS_ALL", + "comments": "

Ask for the all the tags.

\n", + "value": 3 + } + ], + "used": { + "returns": ["git_remote_autotag"], + "needs": ["git_remote_set_autotag", "git_remote_update_tips"] + } + } + ], + [ + "git_remote_callbacks", + { + "decl": [ + "unsigned int version", + "git_transport_message_cb sideband_progress", + "int (*)(git_remote_completion_t, void *) completion", + "git_credential_acquire_cb credentials", + "git_transport_certificate_check_cb certificate_check", + "git_indexer_progress_cb transfer_progress", + "int (*)(const char *, const git_oid *, const git_oid *, void *) update_tips", + "git_packbuilder_progress pack_progress", + "git_push_transfer_progress_cb push_transfer_progress", + "git_push_update_reference_cb push_update_reference", + "git_push_negotiation push_negotiation", + "git_transport_cb transport", + "git_remote_ready_cb remote_ready", + "void * payload", + "git_url_resolve_cb resolve_url", + "int (*)(const char *, const git_oid *, const git_oid *, git_refspec *, void *) update_refs" + ], + "type": "struct", + "value": "git_remote_callbacks", + "file": "git2/remote.h", + "line": 572, + "lineto": 698, + "block": "unsigned int version\ngit_transport_message_cb sideband_progress\nint (*)(git_remote_completion_t, void *) completion\ngit_credential_acquire_cb credentials\ngit_transport_certificate_check_cb certificate_check\ngit_indexer_progress_cb transfer_progress\nint (*)(const char *, const git_oid *, const git_oid *, void *) update_tips\ngit_packbuilder_progress pack_progress\ngit_push_transfer_progress_cb push_transfer_progress\ngit_push_update_reference_cb push_update_reference\ngit_push_negotiation push_negotiation\ngit_transport_cb transport\ngit_remote_ready_cb remote_ready\nvoid * payload\ngit_url_resolve_cb resolve_url\nint (*)(const char *, const git_oid *, const git_oid *, git_refspec *, void *) update_refs", + "tdef": null, + "description": " The callback settings structure", + "comments": "

Set the callbacks to be called by the remote when informing the user about the progress of the network operations.

\n", + "fields": [ + { + "type": "unsigned int", + "name": "version", + "comments": " The version " + }, + { + "type": "git_transport_message_cb", + "name": "sideband_progress", + "comments": " Textual progress from the remote. Text send over the\n progress side-band will be passed to this function (this is\n the 'counting objects' output)." + }, + { + "type": "int (*)(git_remote_completion_t, void *)", + "name": "completion", + "comments": "" + }, + { + "type": "git_credential_acquire_cb", + "name": "credentials", + "comments": " This will be called if the remote host requires\n authentication in order to connect to it.\n\n Returning GIT_PASSTHROUGH will make libgit2 behave as\n though this field isn't set." + }, + { + "type": "git_transport_certificate_check_cb", + "name": "certificate_check", + "comments": " If cert verification fails, this will be called to let the\n user make the final decision of whether to allow the\n connection to proceed. Returns 0 to allow the connection\n or a negative value to indicate an error." + }, + { + "type": "git_indexer_progress_cb", + "name": "transfer_progress", + "comments": " During the download of new data, this will be regularly\n called with the current count of progress done by the\n indexer." + }, + { + "type": "int (*)(const char *, const git_oid *, const git_oid *, void *)", + "name": "update_tips", + "comments": "" + }, + { + "type": "git_packbuilder_progress", + "name": "pack_progress", + "comments": " Function to call with progress information during pack\n building. Be aware that this is called inline with pack\n building operations, so performance may be affected." + }, + { + "type": "git_push_transfer_progress_cb", + "name": "push_transfer_progress", + "comments": " Function to call with progress information during the\n upload portion of a push. Be aware that this is called\n inline with pack building operations, so performance may be\n affected." + }, + { + "type": "git_push_update_reference_cb", + "name": "push_update_reference", + "comments": " See documentation of git_push_update_reference_cb" + }, + { + "type": "git_push_negotiation", + "name": "push_negotiation", + "comments": " Called once between the negotiation step and the upload. It\n provides information about what updates will be performed." + }, + { + "type": "git_transport_cb", + "name": "transport", + "comments": " Create the transport to use for this operation. Leave NULL\n to auto-detect." + }, + { + "type": "git_remote_ready_cb", + "name": "remote_ready", + "comments": " Callback when the remote is ready to connect." + }, + { + "type": "void *", + "name": "payload", + "comments": " This will be passed to each of the callbacks in this struct\n as the last parameter." + }, + { + "type": "git_url_resolve_cb", + "name": "resolve_url", + "comments": " Resolve URL before connecting to remote.\n The returned URL will be used to connect to the remote instead.\n\n This callback is deprecated; users should use\n git_remote_ready_cb and configure the instance URL instead." + }, + { + "type": "int (*)(const char *, const git_oid *, const git_oid *, git_refspec *, void *)", + "name": "update_refs", + "comments": "" + } + ], + "used": { + "returns": [], + "needs": [ + "git_remote_connect", + "git_remote_init_callbacks", + "git_remote_prune", + "git_remote_update_tips" + ] + } + } + ], + [ + "git_remote_completion_t", + { + "decl": [ + "GIT_REMOTE_COMPLETION_DOWNLOAD", + "GIT_REMOTE_COMPLETION_INDEXING", + "GIT_REMOTE_COMPLETION_ERROR" + ], + "type": "enum", + "file": "git2/remote.h", + "line": 466, + "lineto": 470, + "block": "GIT_REMOTE_COMPLETION_DOWNLOAD\nGIT_REMOTE_COMPLETION_INDEXING\nGIT_REMOTE_COMPLETION_ERROR\nGIT_REMOTE_COMPLETION_DOWNLOAD\nGIT_REMOTE_COMPLETION_INDEXING\nGIT_REMOTE_COMPLETION_ERROR", + "tdef": "typedef", + "description": " Argument to the completion callback which tells it which operation\n finished.", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_REMOTE_COMPLETION_DOWNLOAD", + "comments": "", + "value": 0 + }, + { + "type": "int", + "name": "GIT_REMOTE_COMPLETION_INDEXING", + "comments": "", + "value": 1 + }, + { + "type": "int", + "name": "GIT_REMOTE_COMPLETION_ERROR", + "comments": "", + "value": 2 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_remote_connect_options", + { + "decl": [ + "unsigned int version", + "git_remote_callbacks callbacks", + "git_proxy_options proxy_opts", + "git_remote_redirect_t follow_redirects", + "git_strarray custom_headers" + ], + "type": "struct", + "value": "git_remote_connect_options", + "file": "git2/remote.h", + "line": 928, + "lineto": 946, + "block": "unsigned int version\ngit_remote_callbacks callbacks\ngit_proxy_options proxy_opts\ngit_remote_redirect_t follow_redirects\ngit_strarray custom_headers", + "tdef": "typedef", + "description": " Remote creation options structure", + "comments": "

Initialize with GIT_REMOTE_CREATE_OPTIONS_INIT. Alternatively, you can use git_remote_create_options_init.

\n", + "fields": [ + { "type": "unsigned int", "name": "version", "comments": "" }, + { + "type": "git_remote_callbacks", + "name": "callbacks", + "comments": " Callbacks to use for this connection " + }, + { + "type": "git_proxy_options", + "name": "proxy_opts", + "comments": " HTTP Proxy settings " + }, + { + "type": "git_remote_redirect_t", + "name": "follow_redirects", + "comments": " Whether to allow off-site redirects. If this is not\n specified, the `http.followRedirects` configuration setting\n will be consulted." + }, + { + "type": "git_strarray", + "name": "custom_headers", + "comments": " Extra HTTP headers to use in this connection " + } + ], + "used": { + "returns": [], + "needs": ["git_remote_connect_ext", "git_remote_connect_options_init"] + } + } + ], + [ + "git_remote_create_flags", + { + "decl": [ + "GIT_REMOTE_CREATE_SKIP_INSTEADOF", + "GIT_REMOTE_CREATE_SKIP_DEFAULT_FETCHSPEC" + ], + "type": "enum", + "file": "git2/remote.h", + "line": 71, + "lineto": 77, + "block": "GIT_REMOTE_CREATE_SKIP_INSTEADOF\nGIT_REMOTE_CREATE_SKIP_DEFAULT_FETCHSPEC", + "tdef": "typedef", + "description": " Remote creation options flags", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_REMOTE_CREATE_SKIP_INSTEADOF", + "comments": "

Ignore the repository apply.insteadOf configuration

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_REMOTE_CREATE_SKIP_DEFAULT_FETCHSPEC", + "comments": "

Don't build a fetchspec from the name if none is set

\n", + "value": 2 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_remote_create_options", + { + "decl": [ + "unsigned int version", + "git_repository * repository", + "const char * name", + "const char * fetchspec", + "unsigned int flags" + ], + "type": "struct", + "value": "git_remote_create_options", + "file": "git2/remote.h", + "line": 97, + "lineto": 117, + "block": "unsigned int version\ngit_repository * repository\nconst char * name\nconst char * fetchspec\nunsigned int flags", + "tdef": "typedef", + "description": " Remote creation options structure", + "comments": "

Initialize with GIT_REMOTE_CREATE_OPTIONS_INIT. Alternatively, you can use git_remote_create_options_init.

\n", + "fields": [ + { "type": "unsigned int", "name": "version", "comments": "" }, + { + "type": "git_repository *", + "name": "repository", + "comments": " The repository that should own the remote.\n Setting this to NULL results in a detached remote." + }, + { + "type": "const char *", + "name": "name", + "comments": " The remote's name.\n Setting this to NULL results in an in-memory/anonymous remote." + }, + { + "type": "const char *", + "name": "fetchspec", + "comments": " The fetchspec the remote should use. " + }, + { + "type": "unsigned int", + "name": "flags", + "comments": " Additional flags for the remote. See git_remote_create_flags. " + } + ], + "used": { + "returns": [], + "needs": [ + "git_remote_create_options_init", + "git_remote_create_with_opts" + ] + } + } + ], + [ + "git_remote_head", + { + "decl": [ + "int local", + "git_oid oid", + "git_oid loid", + "char * name", + "char * symref_target" + ], + "type": "struct", + "value": "git_remote_head", + "file": "git2/net.h", + "line": 41, + "lineto": 51, + "block": "int local\ngit_oid oid\ngit_oid loid\nchar * name\nchar * symref_target", + "tdef": null, + "description": " Description of a reference advertised by a remote server, given out\n on `ls` calls.", + "comments": "", + "fields": [ + { "type": "int", "name": "local", "comments": "" }, + { "type": "git_oid", "name": "oid", "comments": "" }, + { "type": "git_oid", "name": "loid", "comments": "" }, + { "type": "char *", "name": "name", "comments": "" }, + { + "type": "char *", + "name": "symref_target", + "comments": " If the server send a symref mapping for this ref, this will\n point to the target." + } + ], + "used": { "returns": [], "needs": ["git_headlist_cb", "git_remote_ls"] } + } + ], + [ + "git_remote_redirect_t", + { + "decl": [ + "GIT_REMOTE_REDIRECT_NONE", + "GIT_REMOTE_REDIRECT_INITIAL", + "GIT_REMOTE_REDIRECT_ALL" + ], + "type": "enum", + "file": "git2/remote.h", + "line": 49, + "lineto": 66, + "block": "GIT_REMOTE_REDIRECT_NONE\nGIT_REMOTE_REDIRECT_INITIAL\nGIT_REMOTE_REDIRECT_ALL", + "tdef": "typedef", + "description": " Remote redirection settings; whether redirects to another host\n are permitted. By default, git will follow a redirect on the\n initial request (`/info/refs`), but not subsequent requests.", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_REMOTE_REDIRECT_NONE", + "comments": "

Do not follow any off-site redirects at any stage of\n the fetch or push.

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_REMOTE_REDIRECT_INITIAL", + "comments": "

Allow off-site redirects only upon the initial request.\n This is the default.

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_REMOTE_REDIRECT_ALL", + "comments": "

Allow redirects at any stage in the fetch or push.

\n", + "value": 4 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_remote_update_flags", + { + "decl": [ + "GIT_REMOTE_UPDATE_FETCHHEAD", + "GIT_REMOTE_UPDATE_REPORT_UNCHANGED" + ], + "type": "enum", + "file": "git2/remote.h", + "line": 82, + "lineto": 88, + "block": "GIT_REMOTE_UPDATE_FETCHHEAD\nGIT_REMOTE_UPDATE_REPORT_UNCHANGED", + "tdef": "typedef", + "description": " How to handle reference updates.", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_REMOTE_UPDATE_FETCHHEAD", + "comments": "", + "value": 1 + }, + { + "type": "int", + "name": "GIT_REMOTE_UPDATE_REPORT_UNCHANGED", + "comments": "", + "value": 2 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_repository", + { + "decl": "git_repository", + "type": "struct", + "value": "git_repository", + "file": "git2/types.h", + "line": 123, + "lineto": 123, + "tdef": "typedef", + "description": " Representation of an existing git repository,\n including all its object contents", + "comments": "", + "used": { + "returns": [ + "git_blob_owner", + "git_commit_owner", + "git_index_owner", + "git_object_owner", + "git_patch_owner", + "git_reference_owner", + "git_remote_owner", + "git_revwalk_repository", + "git_submodule_owner", + "git_tag_owner", + "git_tree_owner" + ], + "needs": [ + "git_annotated_commit_from_fetchhead", + "git_annotated_commit_from_ref", + "git_annotated_commit_from_revspec", + "git_annotated_commit_lookup", + "git_apply", + "git_apply_to_tree", + "git_attr_add_macro", + "git_attr_cache_flush", + "git_attr_foreach", + "git_attr_foreach_ext", + "git_attr_get", + "git_attr_get_ext", + "git_attr_get_many", + "git_attr_get_many_ext", + "git_blob_create_from_buffer", + "git_blob_create_from_disk", + "git_blob_create_from_stream", + "git_blob_create_from_workdir", + "git_blob_lookup", + "git_blob_lookup_prefix", + "git_branch_create", + "git_branch_create_from_annotated", + "git_branch_iterator_new", + "git_branch_lookup", + "git_branch_remote_name", + "git_branch_upstream_merge", + "git_branch_upstream_name", + "git_branch_upstream_remote", + "git_checkout_head", + "git_checkout_index", + "git_checkout_tree", + "git_cherrypick", + "git_cherrypick_commit", + "git_clone", + "git_commit_create", + "git_commit_create_buffer", + "git_commit_create_from_stage", + "git_commit_create_v", + "git_commit_create_with_signature", + "git_commit_extract_signature", + "git_commit_lookup", + "git_commit_lookup_prefix", + "git_config_add_file_ondisk", + "git_describe_workdir", + "git_diff_commit_as_email", + "git_diff_index_to_index", + "git_diff_index_to_workdir", + "git_diff_tree_to_index", + "git_diff_tree_to_tree", + "git_diff_tree_to_workdir", + "git_diff_tree_to_workdir_with_index", + "git_filter_list_apply_to_file", + "git_filter_list_load", + "git_filter_list_load_ext", + "git_filter_list_stream_file", + "git_graph_ahead_behind", + "git_graph_descendant_of", + "git_graph_reachable_from_any", + "git_ignore_add_rule", + "git_ignore_clear_internal_rules", + "git_ignore_path_is_ignored", + "git_index_write_tree_to", + "git_mailmap_from_repository", + "git_merge", + "git_merge_analysis", + "git_merge_analysis_for_ref", + "git_merge_base", + "git_merge_base_many", + "git_merge_base_octopus", + "git_merge_bases", + "git_merge_bases_many", + "git_merge_commits", + "git_merge_file_from_index", + "git_merge_trees", + "git_object_lookup", + "git_object_lookup_prefix", + "git_packbuilder_new", + "git_pathspec_match_workdir", + "git_rebase_init", + "git_rebase_open", + "git_refdb_new", + "git_refdb_open", + "git_reference_create", + "git_reference_create_matching", + "git_reference_dwim", + "git_reference_ensure_log", + "git_reference_foreach", + "git_reference_foreach_glob", + "git_reference_foreach_name", + "git_reference_has_log", + "git_reference_iterator_glob_new", + "git_reference_iterator_new", + "git_reference_list", + "git_reference_lookup", + "git_reference_name_to_id", + "git_reference_remove", + "git_reference_symbolic_create", + "git_reference_symbolic_create_matching", + "git_reflog_delete", + "git_reflog_read", + "git_reflog_rename", + "git_remote_add_fetch", + "git_remote_add_push", + "git_remote_create", + "git_remote_create_anonymous", + "git_remote_create_cb", + "git_remote_create_with_fetchspec", + "git_remote_delete", + "git_remote_list", + "git_remote_lookup", + "git_remote_rename", + "git_remote_set_autotag", + "git_remote_set_pushurl", + "git_remote_set_url", + "git_repository_commit_parents", + "git_repository_commondir", + "git_repository_config", + "git_repository_config_snapshot", + "git_repository_create_cb", + "git_repository_detach_head", + "git_repository_fetchhead_foreach", + "git_repository_free", + "git_repository_get_namespace", + "git_repository_hashfile", + "git_repository_head", + "git_repository_head_detached", + "git_repository_head_detached_for_worktree", + "git_repository_head_for_worktree", + "git_repository_head_unborn", + "git_repository_ident", + "git_repository_index", + "git_repository_init", + "git_repository_init_ext", + "git_repository_init_options_init", + "git_repository_is_bare", + "git_repository_is_empty", + "git_repository_is_shallow", + "git_repository_is_worktree", + "git_repository_item_path", + "git_repository_mergehead_foreach", + "git_repository_message", + "git_repository_message_remove", + "git_repository_odb", + "git_repository_oid_type", + "git_repository_open", + "git_repository_open_bare", + "git_repository_open_ext", + "git_repository_open_from_worktree", + "git_repository_path", + "git_repository_refdb", + "git_repository_set_head", + "git_repository_set_head_detached", + "git_repository_set_head_detached_from_annotated", + "git_repository_set_ident", + "git_repository_set_namespace", + "git_repository_set_workdir", + "git_repository_state", + "git_repository_state_cleanup", + "git_repository_workdir", + "git_repository_wrap_odb", + "git_reset", + "git_reset_default", + "git_reset_from_annotated", + "git_revert", + "git_revert_commit", + "git_revparse", + "git_revparse_ext", + "git_revparse_single", + "git_revwalk_new", + "git_signature_default", + "git_signature_default_from_env", + "git_stash_apply", + "git_stash_drop", + "git_stash_foreach", + "git_stash_pop", + "git_stash_save", + "git_stash_save_with_opts", + "git_status_file", + "git_status_foreach", + "git_status_foreach_ext", + "git_status_list_new", + "git_status_should_ignore", + "git_submodule_add_setup", + "git_submodule_clone", + "git_submodule_foreach", + "git_submodule_lookup", + "git_submodule_open", + "git_submodule_repo_init", + "git_submodule_resolve_url", + "git_submodule_set_branch", + "git_submodule_set_fetch_recurse_submodules", + "git_submodule_set_ignore", + "git_submodule_set_update", + "git_submodule_set_url", + "git_submodule_status", + "git_tag_annotation_create", + "git_tag_create", + "git_tag_create_from_buffer", + "git_tag_create_lightweight", + "git_tag_delete", + "git_tag_foreach", + "git_tag_list", + "git_tag_list_match", + "git_tag_lookup", + "git_tag_lookup_prefix", + "git_transaction_new", + "git_tree_create_updated", + "git_tree_entry_to_object", + "git_tree_lookup", + "git_tree_lookup_prefix", + "git_treebuilder_new", + "git_worktree_add", + "git_worktree_list", + "git_worktree_lookup", + "git_worktree_open_from_repository" + ] + } + } + ], + [ + "git_repository_init_flag_t", + { + "decl": [ + "GIT_REPOSITORY_INIT_BARE", + "GIT_REPOSITORY_INIT_NO_REINIT", + "GIT_REPOSITORY_INIT_NO_DOTGIT_DIR", + "GIT_REPOSITORY_INIT_MKDIR", + "GIT_REPOSITORY_INIT_MKPATH", + "GIT_REPOSITORY_INIT_EXTERNAL_TEMPLATE", + "GIT_REPOSITORY_INIT_RELATIVE_GITLINK" + ], + "type": "enum", + "file": "git2/repository.h", + "line": 249, + "lineto": 295, + "block": "GIT_REPOSITORY_INIT_BARE\nGIT_REPOSITORY_INIT_NO_REINIT\nGIT_REPOSITORY_INIT_NO_DOTGIT_DIR\nGIT_REPOSITORY_INIT_MKDIR\nGIT_REPOSITORY_INIT_MKPATH\nGIT_REPOSITORY_INIT_EXTERNAL_TEMPLATE\nGIT_REPOSITORY_INIT_RELATIVE_GITLINK", + "tdef": "typedef", + "description": " Option flags for `git_repository_init_ext`.", + "comments": "

These flags configure extra behaviors to git_repository_init_ext. In every case, the default behavior is the zero value (i.e. flag is not set). Just OR the flag values together for the flags parameter when initializing a new repo.

\n", + "fields": [ + { + "type": "int", + "name": "GIT_REPOSITORY_INIT_BARE", + "comments": "

Create a bare repository with no working directory.

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_INIT_NO_REINIT", + "comments": "

Return an GIT_EEXISTS error if the repo_path appears to already be\n an git repository.

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_INIT_NO_DOTGIT_DIR", + "comments": "

Normally a "/.git/" will be appended to the repo path for\n non-bare repos (if it is not already there), but passing this flag\n prevents that behavior.

\n", + "value": 4 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_INIT_MKDIR", + "comments": "

Make the repo_path (and workdir_path) as needed. Init is always willing\n to create the ".git" directory even without this flag. This flag tells\n init to create the trailing component of the repo and workdir paths\n as needed.

\n", + "value": 8 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_INIT_MKPATH", + "comments": "

Recursively make all components of the repo and workdir paths as\n necessary.

\n", + "value": 16 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_INIT_EXTERNAL_TEMPLATE", + "comments": "

libgit2 normally uses internal templates to initialize a new repo.\n This flags enables external templates, looking the "template_path" from\n the options if set, or the init.templatedir global config if not,\n or falling back on "/usr/share/git-core/templates" if it exists.

\n", + "value": 32 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_INIT_RELATIVE_GITLINK", + "comments": "

If an alternate workdir is specified, use relative paths for the gitdir\n and core.worktree.

\n", + "value": 64 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_repository_init_mode_t", + { + "decl": [ + "GIT_REPOSITORY_INIT_SHARED_UMASK", + "GIT_REPOSITORY_INIT_SHARED_GROUP", + "GIT_REPOSITORY_INIT_SHARED_ALL" + ], + "type": "enum", + "file": "git2/repository.h", + "line": 304, + "lineto": 320, + "block": "GIT_REPOSITORY_INIT_SHARED_UMASK\nGIT_REPOSITORY_INIT_SHARED_GROUP\nGIT_REPOSITORY_INIT_SHARED_ALL", + "tdef": "typedef", + "description": " Mode options for `git_repository_init_ext`.", + "comments": "

Set the mode field of the git_repository_init_options structure either to the custom mode that you would like, or to one of the defined modes.

\n", + "fields": [ + { + "type": "int", + "name": "GIT_REPOSITORY_INIT_SHARED_UMASK", + "comments": "

Use permissions configured by umask - the default.

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_INIT_SHARED_GROUP", + "comments": "

Use "--shared=group" behavior, chmod'ing the new repo to be group\n writable and "g+sx" for sticky group assignment.

\n", + "value": 1533 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_INIT_SHARED_ALL", + "comments": "

Use "--shared=all" behavior, adding world readability.

\n", + "value": 1535 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_repository_init_options", + { + "decl": [ + "unsigned int version", + "uint32_t flags", + "uint32_t mode", + "const char * workdir_path", + "const char * description", + "const char * template_path", + "const char * initial_head", + "const char * origin_url" + ], + "type": "struct", + "value": "git_repository_init_options", + "file": "git2/repository.h", + "line": 328, + "lineto": 387, + "block": "unsigned int version\nuint32_t flags\nuint32_t mode\nconst char * workdir_path\nconst char * description\nconst char * template_path\nconst char * initial_head\nconst char * origin_url", + "tdef": "typedef", + "description": " Extended options structure for `git_repository_init_ext`.", + "comments": "

This contains extra options for git_repository_init_ext that enable additional initialization features.

\n", + "fields": [ + { "type": "unsigned int", "name": "version", "comments": "" }, + { + "type": "uint32_t", + "name": "flags", + "comments": " Combination of GIT_REPOSITORY_INIT flags above." + }, + { + "type": "uint32_t", + "name": "mode", + "comments": " Set to one of the standard GIT_REPOSITORY_INIT_SHARED_... constants\n above, or to a custom value that you would like." + }, + { + "type": "const char *", + "name": "workdir_path", + "comments": " The path to the working dir or NULL for default (i.e. repo_path parent\n on non-bare repos). IF THIS IS RELATIVE PATH, IT WILL BE EVALUATED\n RELATIVE TO THE REPO_PATH. If this is not the \"natural\" working\n directory, a .git gitlink file will be created here linking to the\n repo_path." + }, + { + "type": "const char *", + "name": "description", + "comments": " If set, this will be used to initialize the \"description\" file in the\n repository, instead of using the template content." + }, + { + "type": "const char *", + "name": "template_path", + "comments": " When GIT_REPOSITORY_INIT_EXTERNAL_TEMPLATE is set, this contains\n the path to use for the template directory. If this is NULL, the config\n or default directory options will be used instead." + }, + { + "type": "const char *", + "name": "initial_head", + "comments": " The name of the head to point HEAD at. If NULL, then this will be\n treated as \"master\" and the HEAD ref will be set to \"refs/heads/master\".\n If this begins with \"refs/\" it will be used verbatim;\n otherwise \"refs/heads/\" will be prefixed." + }, + { + "type": "const char *", + "name": "origin_url", + "comments": " If this is non-NULL, then after the rest of the repository\n initialization is completed, an \"origin\" remote will be added\n pointing to this URL." + } + ], + "used": { + "returns": [], + "needs": [ + "git_repository_init_ext", + "git_repository_init_options_init" + ] + } + } + ], + [ + "git_repository_item_t", + { + "decl": [ + "GIT_REPOSITORY_ITEM_GITDIR", + "GIT_REPOSITORY_ITEM_WORKDIR", + "GIT_REPOSITORY_ITEM_COMMONDIR", + "GIT_REPOSITORY_ITEM_INDEX", + "GIT_REPOSITORY_ITEM_OBJECTS", + "GIT_REPOSITORY_ITEM_REFS", + "GIT_REPOSITORY_ITEM_PACKED_REFS", + "GIT_REPOSITORY_ITEM_REMOTES", + "GIT_REPOSITORY_ITEM_CONFIG", + "GIT_REPOSITORY_ITEM_INFO", + "GIT_REPOSITORY_ITEM_HOOKS", + "GIT_REPOSITORY_ITEM_LOGS", + "GIT_REPOSITORY_ITEM_MODULES", + "GIT_REPOSITORY_ITEM_WORKTREES", + "GIT_REPOSITORY_ITEM_WORKTREE_CONFIG", + "GIT_REPOSITORY_ITEM__LAST" + ], + "type": "enum", + "file": "git2/repository.h", + "line": 512, + "lineto": 529, + "block": "GIT_REPOSITORY_ITEM_GITDIR\nGIT_REPOSITORY_ITEM_WORKDIR\nGIT_REPOSITORY_ITEM_COMMONDIR\nGIT_REPOSITORY_ITEM_INDEX\nGIT_REPOSITORY_ITEM_OBJECTS\nGIT_REPOSITORY_ITEM_REFS\nGIT_REPOSITORY_ITEM_PACKED_REFS\nGIT_REPOSITORY_ITEM_REMOTES\nGIT_REPOSITORY_ITEM_CONFIG\nGIT_REPOSITORY_ITEM_INFO\nGIT_REPOSITORY_ITEM_HOOKS\nGIT_REPOSITORY_ITEM_LOGS\nGIT_REPOSITORY_ITEM_MODULES\nGIT_REPOSITORY_ITEM_WORKTREES\nGIT_REPOSITORY_ITEM_WORKTREE_CONFIG\nGIT_REPOSITORY_ITEM__LAST", + "tdef": "typedef", + "description": " List of items which belong to the git repository layout", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_REPOSITORY_ITEM_GITDIR", + "comments": "", + "value": 0 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_ITEM_WORKDIR", + "comments": "", + "value": 1 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_ITEM_COMMONDIR", + "comments": "", + "value": 2 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_ITEM_INDEX", + "comments": "", + "value": 3 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_ITEM_OBJECTS", + "comments": "", + "value": 4 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_ITEM_REFS", + "comments": "", + "value": 5 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_ITEM_PACKED_REFS", + "comments": "", + "value": 6 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_ITEM_REMOTES", + "comments": "", + "value": 7 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_ITEM_CONFIG", + "comments": "", + "value": 8 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_ITEM_INFO", + "comments": "", + "value": 9 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_ITEM_HOOKS", + "comments": "", + "value": 10 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_ITEM_LOGS", + "comments": "", + "value": 11 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_ITEM_MODULES", + "comments": "", + "value": 12 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_ITEM_WORKTREES", + "comments": "", + "value": 13 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_ITEM_WORKTREE_CONFIG", + "comments": "", + "value": 14 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_ITEM__LAST", + "comments": "", + "value": 15 + } + ], + "used": { "returns": [], "needs": ["git_repository_item_path"] } + } + ], + [ + "git_repository_open_flag_t", + { + "decl": [ + "GIT_REPOSITORY_OPEN_NO_SEARCH", + "GIT_REPOSITORY_OPEN_CROSS_FS", + "GIT_REPOSITORY_OPEN_BARE", + "GIT_REPOSITORY_OPEN_NO_DOTGIT", + "GIT_REPOSITORY_OPEN_FROM_ENV" + ], + "type": "enum", + "file": "git2/repository.h", + "line": 110, + "lineto": 157, + "block": "GIT_REPOSITORY_OPEN_NO_SEARCH\nGIT_REPOSITORY_OPEN_CROSS_FS\nGIT_REPOSITORY_OPEN_BARE\nGIT_REPOSITORY_OPEN_NO_DOTGIT\nGIT_REPOSITORY_OPEN_FROM_ENV", + "tdef": "typedef", + "description": " Option flags for `git_repository_open_ext`.", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_REPOSITORY_OPEN_NO_SEARCH", + "comments": "

Only open the repository if it can be immediately found in the\n start_path. Do not walk up from the start_path looking at parent\n directories.

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_OPEN_CROSS_FS", + "comments": "

Unless this flag is set, open will not continue searching across\n filesystem boundaries (i.e. when st_dev changes from the stat\n system call). For example, searching in a user's home directory at\n "/home/user/source/" will not return "/.git/" as the found repo if\n "/" is a different filesystem than "/home".

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_OPEN_BARE", + "comments": "

Open repository as a bare repo regardless of core.bare config, and\n defer loading config file for faster setup.\n Unlike git_repository_open_bare, this can follow gitlinks.

\n", + "value": 4 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_OPEN_NO_DOTGIT", + "comments": "

Do not check for a repository by appending /.git to the start_path;\n only open the repository if start_path itself points to the git\n directory.

\n", + "value": 8 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_OPEN_FROM_ENV", + "comments": "

Find and open a git repository, respecting the environment variables\n used by the git command-line tools.\n If set, git_repository_open_ext will ignore the other flags and\n the ceiling_dirs argument, and will allow a NULL path to use\n GIT_DIR or search from the current directory.\n The search for a repository will respect $GIT_CEILING_DIRECTORIES and\n $GIT_DISCOVERY_ACROSS_FILESYSTEM. The opened repository will\n respect $GIT_INDEX_FILE, $GIT_NAMESPACE, $GIT_OBJECT_DIRECTORY, and\n $GIT_ALTERNATE_OBJECT_DIRECTORIES.\n In the future, this flag will also cause git_repository_open_ext\n to respect $GIT_WORK_TREE and $GIT_COMMON_DIR; currently,\n git_repository_open_ext with this flag will error out if either\n $GIT_WORK_TREE or $GIT_COMMON_DIR is set.

\n", + "value": 16 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_repository_state_t", + { + "decl": [ + "GIT_REPOSITORY_STATE_NONE", + "GIT_REPOSITORY_STATE_MERGE", + "GIT_REPOSITORY_STATE_REVERT", + "GIT_REPOSITORY_STATE_REVERT_SEQUENCE", + "GIT_REPOSITORY_STATE_CHERRYPICK", + "GIT_REPOSITORY_STATE_CHERRYPICK_SEQUENCE", + "GIT_REPOSITORY_STATE_BISECT", + "GIT_REPOSITORY_STATE_REBASE", + "GIT_REPOSITORY_STATE_REBASE_INTERACTIVE", + "GIT_REPOSITORY_STATE_REBASE_MERGE", + "GIT_REPOSITORY_STATE_APPLY_MAILBOX", + "GIT_REPOSITORY_STATE_APPLY_MAILBOX_OR_REBASE" + ], + "type": "enum", + "file": "git2/repository.h", + "line": 915, + "lineto": 928, + "block": "GIT_REPOSITORY_STATE_NONE\nGIT_REPOSITORY_STATE_MERGE\nGIT_REPOSITORY_STATE_REVERT\nGIT_REPOSITORY_STATE_REVERT_SEQUENCE\nGIT_REPOSITORY_STATE_CHERRYPICK\nGIT_REPOSITORY_STATE_CHERRYPICK_SEQUENCE\nGIT_REPOSITORY_STATE_BISECT\nGIT_REPOSITORY_STATE_REBASE\nGIT_REPOSITORY_STATE_REBASE_INTERACTIVE\nGIT_REPOSITORY_STATE_REBASE_MERGE\nGIT_REPOSITORY_STATE_APPLY_MAILBOX\nGIT_REPOSITORY_STATE_APPLY_MAILBOX_OR_REBASE", + "tdef": "typedef", + "description": " Repository state", + "comments": "

These values represent possible states for the repository to be in, based on the current operation which is ongoing.

\n", + "fields": [ + { + "type": "int", + "name": "GIT_REPOSITORY_STATE_NONE", + "comments": "", + "value": 0 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_STATE_MERGE", + "comments": "", + "value": 1 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_STATE_REVERT", + "comments": "", + "value": 2 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_STATE_REVERT_SEQUENCE", + "comments": "", + "value": 3 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_STATE_CHERRYPICK", + "comments": "", + "value": 4 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_STATE_CHERRYPICK_SEQUENCE", + "comments": "", + "value": 5 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_STATE_BISECT", + "comments": "", + "value": 6 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_STATE_REBASE", + "comments": "", + "value": 7 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_STATE_REBASE_INTERACTIVE", + "comments": "", + "value": 8 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_STATE_REBASE_MERGE", + "comments": "", + "value": 9 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_STATE_APPLY_MAILBOX", + "comments": "", + "value": 10 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_STATE_APPLY_MAILBOX_OR_REBASE", + "comments": "", + "value": 11 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_reset_t", + { + "decl": ["GIT_RESET_SOFT", "GIT_RESET_MIXED", "GIT_RESET_HARD"], + "type": "enum", + "file": "git2/reset.h", + "line": 26, + "lineto": 30, + "block": "GIT_RESET_SOFT\nGIT_RESET_MIXED\nGIT_RESET_HARD", + "tdef": "typedef", + "description": " Kinds of reset operation", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_RESET_SOFT", + "comments": "

Move the head to the given commit

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_RESET_MIXED", + "comments": "

SOFT plus reset index to the commit

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_RESET_HARD", + "comments": "

MIXED plus changes in working tree discarded

\n", + "value": 3 + } + ], + "used": { + "returns": [], + "needs": ["git_reset", "git_reset_from_annotated"] + } + } + ], + [ + "git_revert_options", + { + "decl": [ + "unsigned int version", + "unsigned int mainline", + "git_merge_options merge_opts", + "git_checkout_options checkout_opts" + ], + "type": "struct", + "value": "git_revert_options", + "file": "git2/revert.h", + "line": 26, + "lineto": 34, + "block": "unsigned int version\nunsigned int mainline\ngit_merge_options merge_opts\ngit_checkout_options checkout_opts", + "tdef": "typedef", + "description": " Options for revert", + "comments": "", + "fields": [ + { "type": "unsigned int", "name": "version", "comments": "" }, + { + "type": "unsigned int", + "name": "mainline", + "comments": " For merge commits, the \"mainline\" is treated as the parent. " + }, + { + "type": "git_merge_options", + "name": "merge_opts", + "comments": " Options for the merging " + }, + { + "type": "git_checkout_options", + "name": "checkout_opts", + "comments": " Options for the checkout " + } + ], + "used": { + "returns": [], + "needs": ["git_revert", "git_revert_options_init"] + } + } + ], + [ + "git_revspec", + { + "decl": ["git_object * from", "git_object * to", "unsigned int flags"], + "type": "struct", + "value": "git_revspec", + "file": "git2/revparse.h", + "line": 83, + "lineto": 90, + "block": "git_object * from\ngit_object * to\nunsigned int flags", + "tdef": "typedef", + "description": " Git Revision Spec: output of a `git_revparse` operation", + "comments": "", + "fields": [ + { + "type": "git_object *", + "name": "from", + "comments": " The left element of the revspec; must be freed by the user " + }, + { + "type": "git_object *", + "name": "to", + "comments": " The right element of the revspec; must be freed by the user " + }, + { + "type": "unsigned int", + "name": "flags", + "comments": " The intent of the revspec (i.e. `git_revspec_mode_t` flags) " + } + ], + "used": { "returns": [], "needs": ["git_revparse"] } + } + ], + [ + "git_revspec_t", + { + "decl": [ + "GIT_REVSPEC_SINGLE", + "GIT_REVSPEC_RANGE", + "GIT_REVSPEC_MERGE_BASE" + ], + "type": "enum", + "file": "git2/revparse.h", + "line": 71, + "lineto": 78, + "block": "GIT_REVSPEC_SINGLE\nGIT_REVSPEC_RANGE\nGIT_REVSPEC_MERGE_BASE", + "tdef": "typedef", + "description": " Revparse flags. These indicate the intended behavior of the spec passed to\n git_revparse.", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_REVSPEC_SINGLE", + "comments": "

The spec targeted a single object.

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_REVSPEC_RANGE", + "comments": "

The spec targeted a range of commits.

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_REVSPEC_MERGE_BASE", + "comments": "

The spec used the '...' operator, which invokes special semantics.

\n", + "value": 4 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_revwalk", + { + "decl": "git_revwalk", + "type": "struct", + "value": "git_revwalk", + "file": "git2/types.h", + "line": 132, + "lineto": 132, + "tdef": "typedef", + "description": " Representation of an in-progress walk through the commits in a repo ", + "comments": "", + "used": { + "returns": [], + "needs": [ + "git_packbuilder_insert_walk", + "git_revwalk_add_hide_cb", + "git_revwalk_free", + "git_revwalk_hide", + "git_revwalk_hide_glob", + "git_revwalk_hide_head", + "git_revwalk_hide_ref", + "git_revwalk_new", + "git_revwalk_next", + "git_revwalk_push", + "git_revwalk_push_glob", + "git_revwalk_push_head", + "git_revwalk_push_range", + "git_revwalk_push_ref", + "git_revwalk_repository", + "git_revwalk_reset", + "git_revwalk_simplify_first_parent", + "git_revwalk_sorting" + ] + } + } + ], + [ + "git_signature", + { + "decl": ["char * name", "char * email", "git_time when"], + "type": "struct", + "value": "git_signature", + "file": "git2/types.h", + "line": 187, + "lineto": 191, + "block": "char * name\nchar * email\ngit_time when", + "tdef": "typedef", + "description": " An action signature (e.g. for committers, taggers, etc) ", + "comments": "", + "fields": [ + { + "type": "char *", + "name": "name", + "comments": " full name of the author " + }, + { + "type": "char *", + "name": "email", + "comments": " email of the author " + }, + { + "type": "git_time", + "name": "when", + "comments": " time when the action happened " + } + ], + "used": { + "returns": [ + "git_commit_author", + "git_commit_committer", + "git_reflog_entry_committer", + "git_tag_tagger" + ], + "needs": [ + "git_commit_amend", + "git_commit_author_with_mailmap", + "git_commit_committer_with_mailmap", + "git_commit_create", + "git_commit_create_buffer", + "git_commit_create_cb", + "git_commit_create_v", + "git_mailmap_resolve_signature", + "git_rebase_commit", + "git_rebase_finish", + "git_reflog_append", + "git_signature_default", + "git_signature_default_from_env", + "git_signature_dup", + "git_signature_free", + "git_signature_from_buffer", + "git_signature_new", + "git_signature_now", + "git_stash_save", + "git_tag_annotation_create", + "git_tag_create", + "git_transaction_set_symbolic_target", + "git_transaction_set_target" + ] + } + } + ], + [ + "git_smart_service_t", + { + "decl": [ + "GIT_SERVICE_UPLOADPACK_LS", + "GIT_SERVICE_UPLOADPACK", + "GIT_SERVICE_RECEIVEPACK_LS", + "GIT_SERVICE_RECEIVEPACK" + ], + "type": "enum", + "file": "git2/sys/transport.h", + "line": 323, + "lineto": 328, + "block": "GIT_SERVICE_UPLOADPACK_LS\nGIT_SERVICE_UPLOADPACK\nGIT_SERVICE_RECEIVEPACK_LS\nGIT_SERVICE_RECEIVEPACK", + "tdef": "typedef", + "description": " Actions that the smart transport can ask a subtransport to perform ", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_SERVICE_UPLOADPACK_LS", + "comments": "", + "value": 1 + }, + { + "type": "int", + "name": "GIT_SERVICE_UPLOADPACK", + "comments": "", + "value": 2 + }, + { + "type": "int", + "name": "GIT_SERVICE_RECEIVEPACK_LS", + "comments": "", + "value": 3 + }, + { + "type": "int", + "name": "GIT_SERVICE_RECEIVEPACK", + "comments": "", + "value": 4 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_sort_t", + { + "decl": [ + "GIT_SORT_NONE", + "GIT_SORT_TOPOLOGICAL", + "GIT_SORT_TIME", + "GIT_SORT_REVERSE" + ], + "type": "enum", + "file": "git2/revwalk.h", + "line": 26, + "lineto": 53, + "block": "GIT_SORT_NONE\nGIT_SORT_TOPOLOGICAL\nGIT_SORT_TIME\nGIT_SORT_REVERSE", + "tdef": "typedef", + "description": " Flags to specify the sorting which a revwalk should perform.", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_SORT_NONE", + "comments": "

Sort the output with the same default method from git: reverse\n chronological order. This is the default sorting for new walkers.

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_SORT_TOPOLOGICAL", + "comments": "

Sort the repository contents in topological order (no parents before\n all of its children are shown); this sorting mode can be combined\n with time sorting to produce git's --date-order`.

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_SORT_TIME", + "comments": "

Sort the repository contents by commit time;\n this sorting mode can be combined with\n topological sorting.

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_SORT_REVERSE", + "comments": "

Iterate through the repository contents in reverse\n order; this sorting mode can be combined with\n any of the above.

\n", + "value": 4 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_stash_apply_flags", + { + "decl": ["GIT_STASH_APPLY_DEFAULT", "GIT_STASH_APPLY_REINSTATE_INDEX"], + "type": "enum", + "file": "git2/stash.h", + "line": 137, + "lineto": 144, + "block": "GIT_STASH_APPLY_DEFAULT\nGIT_STASH_APPLY_REINSTATE_INDEX", + "tdef": "typedef", + "description": " Stash application flags. ", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_STASH_APPLY_DEFAULT", + "comments": "", + "value": 0 + }, + { + "type": "int", + "name": "GIT_STASH_APPLY_REINSTATE_INDEX", + "comments": "", + "value": 1 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_stash_apply_options", + { + "decl": [ + "unsigned int version", + "uint32_t flags", + "git_checkout_options checkout_options", + "git_stash_apply_progress_cb progress_cb", + "void * progress_payload" + ], + "type": "struct", + "value": "git_stash_apply_options", + "file": "git2/stash.h", + "line": 192, + "lineto": 204, + "block": "unsigned int version\nuint32_t flags\ngit_checkout_options checkout_options\ngit_stash_apply_progress_cb progress_cb\nvoid * progress_payload", + "tdef": "typedef", + "description": " Stash application options structure", + "comments": "

Initialize with GIT_STASH_APPLY_OPTIONS_INIT. Alternatively, you can use git_stash_apply_options_init.

\n", + "fields": [ + { "type": "unsigned int", "name": "version", "comments": "" }, + { + "type": "uint32_t", + "name": "flags", + "comments": " See `git_stash_apply_flags`, above. " + }, + { + "type": "git_checkout_options", + "name": "checkout_options", + "comments": " Options to use when writing files to the working directory. " + }, + { + "type": "git_stash_apply_progress_cb", + "name": "progress_cb", + "comments": " Optional callback to notify the consumer of application progress. " + }, + { "type": "void *", "name": "progress_payload", "comments": "" } + ], + "used": { + "returns": [], + "needs": [ + "git_stash_apply", + "git_stash_apply_options_init", + "git_stash_pop" + ] + } + } + ], + [ + "git_stash_apply_progress_t", + { + "decl": [ + "GIT_STASH_APPLY_PROGRESS_NONE", + "GIT_STASH_APPLY_PROGRESS_LOADING_STASH", + "GIT_STASH_APPLY_PROGRESS_ANALYZE_INDEX", + "GIT_STASH_APPLY_PROGRESS_ANALYZE_MODIFIED", + "GIT_STASH_APPLY_PROGRESS_ANALYZE_UNTRACKED", + "GIT_STASH_APPLY_PROGRESS_CHECKOUT_UNTRACKED", + "GIT_STASH_APPLY_PROGRESS_CHECKOUT_MODIFIED", + "GIT_STASH_APPLY_PROGRESS_DONE" + ], + "type": "enum", + "file": "git2/stash.h", + "line": 147, + "lineto": 170, + "block": "GIT_STASH_APPLY_PROGRESS_NONE\nGIT_STASH_APPLY_PROGRESS_LOADING_STASH\nGIT_STASH_APPLY_PROGRESS_ANALYZE_INDEX\nGIT_STASH_APPLY_PROGRESS_ANALYZE_MODIFIED\nGIT_STASH_APPLY_PROGRESS_ANALYZE_UNTRACKED\nGIT_STASH_APPLY_PROGRESS_CHECKOUT_UNTRACKED\nGIT_STASH_APPLY_PROGRESS_CHECKOUT_MODIFIED\nGIT_STASH_APPLY_PROGRESS_DONE", + "tdef": "typedef", + "description": " Stash apply progression states ", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_STASH_APPLY_PROGRESS_NONE", + "comments": "", + "value": 0 + }, + { + "type": "int", + "name": "GIT_STASH_APPLY_PROGRESS_LOADING_STASH", + "comments": "

Loading the stashed data from the object database.

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_STASH_APPLY_PROGRESS_ANALYZE_INDEX", + "comments": "

The stored index is being analyzed.

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_STASH_APPLY_PROGRESS_ANALYZE_MODIFIED", + "comments": "

The modified files are being analyzed.

\n", + "value": 3 + }, + { + "type": "int", + "name": "GIT_STASH_APPLY_PROGRESS_ANALYZE_UNTRACKED", + "comments": "

The untracked and ignored files are being analyzed.

\n", + "value": 4 + }, + { + "type": "int", + "name": "GIT_STASH_APPLY_PROGRESS_CHECKOUT_UNTRACKED", + "comments": "

The untracked files are being written to disk.

\n", + "value": 5 + }, + { + "type": "int", + "name": "GIT_STASH_APPLY_PROGRESS_CHECKOUT_MODIFIED", + "comments": "

The modified files are being written to disk.

\n", + "value": 6 + }, + { + "type": "int", + "name": "GIT_STASH_APPLY_PROGRESS_DONE", + "comments": "

The stash was applied successfully.

\n", + "value": 7 + } + ], + "used": { "returns": [], "needs": ["git_stash_apply_progress_cb"] } + } + ], + [ + "git_stash_flags", + { + "decl": [ + "GIT_STASH_DEFAULT", + "GIT_STASH_KEEP_INDEX", + "GIT_STASH_INCLUDE_UNTRACKED", + "GIT_STASH_INCLUDE_IGNORED", + "GIT_STASH_KEEP_ALL" + ], + "type": "enum", + "file": "git2/stash.h", + "line": 30, + "lineto": 58, + "block": "GIT_STASH_DEFAULT\nGIT_STASH_KEEP_INDEX\nGIT_STASH_INCLUDE_UNTRACKED\nGIT_STASH_INCLUDE_IGNORED\nGIT_STASH_KEEP_ALL", + "tdef": "typedef", + "description": " Stash flags", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_STASH_DEFAULT", + "comments": "

No option, default

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_STASH_KEEP_INDEX", + "comments": "

All changes already added to the index are left intact in\n the working directory

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_STASH_INCLUDE_UNTRACKED", + "comments": "

All untracked files are also stashed and then cleaned up\n from the working directory

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_STASH_INCLUDE_IGNORED", + "comments": "

All ignored files are also stashed and then cleaned up from\n the working directory

\n", + "value": 4 + }, + { + "type": "int", + "name": "GIT_STASH_KEEP_ALL", + "comments": "

All changes in the index and working directory are left intact

\n", + "value": 8 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_stash_save_options", + { + "decl": [ + "unsigned int version", + "uint32_t flags", + "const git_signature * stasher", + "const char * message", + "git_strarray paths" + ], + "type": "struct", + "value": "git_stash_save_options", + "file": "git2/stash.h", + "line": 86, + "lineto": 100, + "block": "unsigned int version\nuint32_t flags\nconst git_signature * stasher\nconst char * message\ngit_strarray paths", + "tdef": "typedef", + "description": " Stash save options structure", + "comments": "

Initialize with GIT_STASH_SAVE_OPTIONS_INIT. Alternatively, you can use git_stash_save_options_init.

\n", + "fields": [ + { "type": "unsigned int", "name": "version", "comments": "" }, + { + "type": "uint32_t", + "name": "flags", + "comments": " Flags to control the stashing process. (see GIT_STASH_* above) " + }, + { + "type": "const git_signature *", + "name": "stasher", + "comments": " The identity of the person performing the stashing. " + }, + { + "type": "const char *", + "name": "message", + "comments": " Optional description along with the stashed state. " + }, + { + "type": "git_strarray", + "name": "paths", + "comments": " Optional paths that control which files are stashed. " + } + ], + "used": { + "returns": [], + "needs": ["git_stash_save_options_init", "git_stash_save_with_opts"] + } + } + ], + [ + "git_status_entry", + { + "decl": [ + "git_status_t status", + "git_diff_delta * head_to_index", + "git_diff_delta * index_to_workdir" + ], + "type": "struct", + "value": "git_status_entry", + "file": "git2/status.h", + "line": 298, + "lineto": 302, + "block": "git_status_t status\ngit_diff_delta * head_to_index\ngit_diff_delta * index_to_workdir", + "tdef": "typedef", + "description": " A status entry, providing the differences between the file as it exists\n in HEAD and the index, and providing the differences between the index\n and the working directory.", + "comments": "

The status value provides the status flags for this file.

\n\n

The head_to_index value provides detailed information about the differences between the file in HEAD and the file in the index.

\n\n

The index_to_workdir value provides detailed information about the differences between the file in the index and the file in the working directory.

\n", + "fields": [ + { "type": "git_status_t", "name": "status", "comments": "" }, + { + "type": "git_diff_delta *", + "name": "head_to_index", + "comments": "" + }, + { + "type": "git_diff_delta *", + "name": "index_to_workdir", + "comments": "" + } + ], + "used": { "returns": ["git_status_byindex"], "needs": [] } + } + ], + [ + "git_status_list", + { + "decl": "git_status_list", + "type": "struct", + "value": "git_status_list", + "file": "git2/types.h", + "line": 217, + "lineto": 217, + "tdef": "typedef", + "description": " Representation of a status collection ", + "comments": "", + "used": { + "returns": [], + "needs": [ + "git_status_byindex", + "git_status_list_entrycount", + "git_status_list_free", + "git_status_list_new" + ] + } + } + ], + [ + "git_status_opt_t", + { + "decl": [ + "GIT_STATUS_OPT_INCLUDE_UNTRACKED", + "GIT_STATUS_OPT_INCLUDE_IGNORED", + "GIT_STATUS_OPT_INCLUDE_UNMODIFIED", + "GIT_STATUS_OPT_EXCLUDE_SUBMODULES", + "GIT_STATUS_OPT_RECURSE_UNTRACKED_DIRS", + "GIT_STATUS_OPT_DISABLE_PATHSPEC_MATCH", + "GIT_STATUS_OPT_RECURSE_IGNORED_DIRS", + "GIT_STATUS_OPT_RENAMES_HEAD_TO_INDEX", + "GIT_STATUS_OPT_RENAMES_INDEX_TO_WORKDIR", + "GIT_STATUS_OPT_SORT_CASE_SENSITIVELY", + "GIT_STATUS_OPT_SORT_CASE_INSENSITIVELY", + "GIT_STATUS_OPT_RENAMES_FROM_REWRITES", + "GIT_STATUS_OPT_NO_REFRESH", + "GIT_STATUS_OPT_UPDATE_INDEX", + "GIT_STATUS_OPT_INCLUDE_UNREADABLE", + "GIT_STATUS_OPT_INCLUDE_UNREADABLE_AS_UNTRACKED" + ], + "type": "enum", + "file": "git2/status.h", + "line": 100, + "lineto": 207, + "block": "GIT_STATUS_OPT_INCLUDE_UNTRACKED\nGIT_STATUS_OPT_INCLUDE_IGNORED\nGIT_STATUS_OPT_INCLUDE_UNMODIFIED\nGIT_STATUS_OPT_EXCLUDE_SUBMODULES\nGIT_STATUS_OPT_RECURSE_UNTRACKED_DIRS\nGIT_STATUS_OPT_DISABLE_PATHSPEC_MATCH\nGIT_STATUS_OPT_RECURSE_IGNORED_DIRS\nGIT_STATUS_OPT_RENAMES_HEAD_TO_INDEX\nGIT_STATUS_OPT_RENAMES_INDEX_TO_WORKDIR\nGIT_STATUS_OPT_SORT_CASE_SENSITIVELY\nGIT_STATUS_OPT_SORT_CASE_INSENSITIVELY\nGIT_STATUS_OPT_RENAMES_FROM_REWRITES\nGIT_STATUS_OPT_NO_REFRESH\nGIT_STATUS_OPT_UPDATE_INDEX\nGIT_STATUS_OPT_INCLUDE_UNREADABLE\nGIT_STATUS_OPT_INCLUDE_UNREADABLE_AS_UNTRACKED", + "tdef": "typedef", + "description": " Flags to control status callbacks", + "comments": "

Calling git_status_foreach() is like calling the extended version with: GIT_STATUS_OPT_INCLUDE_IGNORED, GIT_STATUS_OPT_INCLUDE_UNTRACKED, and GIT_STATUS_OPT_RECURSE_UNTRACKED_DIRS. Those options are bundled together as GIT_STATUS_OPT_DEFAULTS if you want them as a baseline.

\n", + "fields": [ + { + "type": "int", + "name": "GIT_STATUS_OPT_INCLUDE_UNTRACKED", + "comments": "

Says that callbacks should be made on untracked files.\n These will only be made if the workdir files are included in the status\n "show" option.

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_STATUS_OPT_INCLUDE_IGNORED", + "comments": "

Says that ignored files get callbacks.\n Again, these callbacks will only be made if the workdir files are\n included in the status "show" option.

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_STATUS_OPT_INCLUDE_UNMODIFIED", + "comments": "

Indicates that callback should be made even on unmodified files.

\n", + "value": 4 + }, + { + "type": "int", + "name": "GIT_STATUS_OPT_EXCLUDE_SUBMODULES", + "comments": "

Indicates that submodules should be skipped.\n This only applies if there are no pending typechanges to the submodule\n (either from or to another type).

\n", + "value": 8 + }, + { + "type": "int", + "name": "GIT_STATUS_OPT_RECURSE_UNTRACKED_DIRS", + "comments": "

Indicates that all files in untracked directories should be included.\n Normally if an entire directory is new, then just the top-level\n directory is included (with a trailing slash on the entry name).\n This flag says to include all of the individual files in the directory\n instead.

\n", + "value": 16 + }, + { + "type": "int", + "name": "GIT_STATUS_OPT_DISABLE_PATHSPEC_MATCH", + "comments": "

Indicates that the given path should be treated as a literal path,\n and not as a pathspec pattern.

\n", + "value": 32 + }, + { + "type": "int", + "name": "GIT_STATUS_OPT_RECURSE_IGNORED_DIRS", + "comments": "

Indicates that the contents of ignored directories should be included\n in the status. This is like doing git ls-files -o -i --exclude-standard\n with core git.

\n", + "value": 64 + }, + { + "type": "int", + "name": "GIT_STATUS_OPT_RENAMES_HEAD_TO_INDEX", + "comments": "

Indicates that rename detection should be processed between the head and\n the index and enables the GIT_STATUS_INDEX_RENAMED as a possible status\n flag.

\n", + "value": 128 + }, + { + "type": "int", + "name": "GIT_STATUS_OPT_RENAMES_INDEX_TO_WORKDIR", + "comments": "

Indicates that rename detection should be run between the index and the\n working directory and enabled GIT_STATUS_WT_RENAMED as a possible status\n flag.

\n", + "value": 256 + }, + { + "type": "int", + "name": "GIT_STATUS_OPT_SORT_CASE_SENSITIVELY", + "comments": "

Overrides the native case sensitivity for the file system and forces\n the output to be in case-sensitive order.

\n", + "value": 512 + }, + { + "type": "int", + "name": "GIT_STATUS_OPT_SORT_CASE_INSENSITIVELY", + "comments": "

Overrides the native case sensitivity for the file system and forces\n the output to be in case-insensitive order.

\n", + "value": 1024 + }, + { + "type": "int", + "name": "GIT_STATUS_OPT_RENAMES_FROM_REWRITES", + "comments": "

Iindicates that rename detection should include rewritten files.

\n", + "value": 2048 + }, + { + "type": "int", + "name": "GIT_STATUS_OPT_NO_REFRESH", + "comments": "

Bypasses the default status behavior of doing a "soft" index reload\n (i.e. reloading the index data if the file on disk has been modified\n outside libgit2).

\n", + "value": 4096 + }, + { + "type": "int", + "name": "GIT_STATUS_OPT_UPDATE_INDEX", + "comments": "

Tells libgit2 to refresh the stat cache in the index for files that are\n unchanged but have out of date stat einformation in the index.\n It will result in less work being done on subsequent calls to get status.\n This is mutually exclusive with the NO_REFRESH option.

\n", + "value": 8192 + }, + { + "type": "int", + "name": "GIT_STATUS_OPT_INCLUDE_UNREADABLE", + "comments": "

Normally files that cannot be opened or read are ignored as\n these are often transient files; this option will return\n unreadable files as GIT_STATUS_WT_UNREADABLE.

\n", + "value": 16384 + }, + { + "type": "int", + "name": "GIT_STATUS_OPT_INCLUDE_UNREADABLE_AS_UNTRACKED", + "comments": "

Unreadable files will be detected and given the status\n untracked instead of unreadable.

\n", + "value": 32768 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_status_options", + { + "decl": [ + "unsigned int version", + "git_status_show_t show", + "unsigned int flags", + "git_strarray pathspec", + "git_tree * baseline", + "uint16_t rename_threshold" + ], + "type": "struct", + "value": "git_status_options", + "file": "git2/status.h", + "line": 222, + "lineto": 262, + "block": "unsigned int version\ngit_status_show_t show\nunsigned int flags\ngit_strarray pathspec\ngit_tree * baseline\nuint16_t rename_threshold", + "tdef": "typedef", + "description": " Options to control how `git_status_foreach_ext()` will issue callbacks.", + "comments": "

Initialize with GIT_STATUS_OPTIONS_INIT. Alternatively, you can use git_status_options_init.

\n", + "fields": [ + { + "type": "unsigned int", + "name": "version", + "comments": " The struct version; pass `GIT_STATUS_OPTIONS_VERSION`." + }, + { + "type": "git_status_show_t", + "name": "show", + "comments": " The `show` value is one of the `git_status_show_t` constants that\n control which files to scan and in what order. The default is\n `GIT_STATUS_SHOW_INDEX_AND_WORKDIR`." + }, + { + "type": "unsigned int", + "name": "flags", + "comments": " The `flags` value is an OR'ed combination of the\n `git_status_opt_t` values above. The default is\n `GIT_STATUS_OPT_DEFAULTS`, which matches git's default\n behavior." + }, + { + "type": "git_strarray", + "name": "pathspec", + "comments": " The `pathspec` is an array of path patterns to match (using\n fnmatch-style matching), or just an array of paths to match\n exactly if `GIT_STATUS_OPT_DISABLE_PATHSPEC_MATCH` is specified\n in the flags." + }, + { + "type": "git_tree *", + "name": "baseline", + "comments": " The `baseline` is the tree to be used for comparison to the\n working directory and index; defaults to HEAD." + }, + { + "type": "uint16_t", + "name": "rename_threshold", + "comments": " Threshold above which similar files will be considered renames.\n This is equivalent to the -M option. Defaults to 50." + } + ], + "used": { + "returns": [], + "needs": [ + "git_status_foreach_ext", + "git_status_list_new", + "git_status_options_init" + ] + } + } + ], + [ + "git_status_show_t", + { + "decl": [ + "GIT_STATUS_SHOW_INDEX_AND_WORKDIR", + "GIT_STATUS_SHOW_INDEX_ONLY", + "GIT_STATUS_SHOW_WORKDIR_ONLY" + ], + "type": "enum", + "file": "git2/status.h", + "line": 72, + "lineto": 90, + "block": "GIT_STATUS_SHOW_INDEX_AND_WORKDIR\nGIT_STATUS_SHOW_INDEX_ONLY\nGIT_STATUS_SHOW_WORKDIR_ONLY", + "tdef": "typedef", + "description": " Select the files on which to report status.", + "comments": "

With git_status_foreach_ext, this will control which changes get callbacks. With git_status_list_new, these will control which changes are included in the list.

\n", + "fields": [ + { + "type": "int", + "name": "GIT_STATUS_SHOW_INDEX_AND_WORKDIR", + "comments": "

The default. This roughly matches git status --porcelain regarding\n which files are included and in what order.

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_STATUS_SHOW_INDEX_ONLY", + "comments": "

Only gives status based on HEAD to index comparison, not looking at\n working directory changes.

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_STATUS_SHOW_WORKDIR_ONLY", + "comments": "

Only gives status based on index to working directory comparison,\n not comparing the index to the HEAD.

\n", + "value": 2 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_status_t", + { + "decl": [ + "GIT_STATUS_CURRENT", + "GIT_STATUS_INDEX_NEW", + "GIT_STATUS_INDEX_MODIFIED", + "GIT_STATUS_INDEX_DELETED", + "GIT_STATUS_INDEX_RENAMED", + "GIT_STATUS_INDEX_TYPECHANGE", + "GIT_STATUS_WT_NEW", + "GIT_STATUS_WT_MODIFIED", + "GIT_STATUS_WT_DELETED", + "GIT_STATUS_WT_TYPECHANGE", + "GIT_STATUS_WT_RENAMED", + "GIT_STATUS_WT_UNREADABLE", + "GIT_STATUS_IGNORED", + "GIT_STATUS_CONFLICTED" + ], + "type": "enum", + "file": "git2/status.h", + "line": 34, + "lineto": 52, + "block": "GIT_STATUS_CURRENT\nGIT_STATUS_INDEX_NEW\nGIT_STATUS_INDEX_MODIFIED\nGIT_STATUS_INDEX_DELETED\nGIT_STATUS_INDEX_RENAMED\nGIT_STATUS_INDEX_TYPECHANGE\nGIT_STATUS_WT_NEW\nGIT_STATUS_WT_MODIFIED\nGIT_STATUS_WT_DELETED\nGIT_STATUS_WT_TYPECHANGE\nGIT_STATUS_WT_RENAMED\nGIT_STATUS_WT_UNREADABLE\nGIT_STATUS_IGNORED\nGIT_STATUS_CONFLICTED", + "tdef": "typedef", + "description": " Status flags for a single file.", + "comments": "

A combination of these values will be returned to indicate the status of a file. Status compares the working directory, the index, and the current HEAD of the repository. The GIT_STATUS_INDEX set of flags represents the status of file in the index relative to the HEAD, and the GIT_STATUS_WT set of flags represent the status of the file in the working directory relative to the index.

\n", + "fields": [ + { + "type": "int", + "name": "GIT_STATUS_CURRENT", + "comments": "", + "value": 0 + }, + { + "type": "int", + "name": "GIT_STATUS_INDEX_NEW", + "comments": "", + "value": 1 + }, + { + "type": "int", + "name": "GIT_STATUS_INDEX_MODIFIED", + "comments": "", + "value": 2 + }, + { + "type": "int", + "name": "GIT_STATUS_INDEX_DELETED", + "comments": "", + "value": 4 + }, + { + "type": "int", + "name": "GIT_STATUS_INDEX_RENAMED", + "comments": "", + "value": 8 + }, + { + "type": "int", + "name": "GIT_STATUS_INDEX_TYPECHANGE", + "comments": "", + "value": 16 + }, + { + "type": "int", + "name": "GIT_STATUS_WT_NEW", + "comments": "", + "value": 128 + }, + { + "type": "int", + "name": "GIT_STATUS_WT_MODIFIED", + "comments": "", + "value": 256 + }, + { + "type": "int", + "name": "GIT_STATUS_WT_DELETED", + "comments": "", + "value": 512 + }, + { + "type": "int", + "name": "GIT_STATUS_WT_TYPECHANGE", + "comments": "", + "value": 1024 + }, + { + "type": "int", + "name": "GIT_STATUS_WT_RENAMED", + "comments": "", + "value": 2048 + }, + { + "type": "int", + "name": "GIT_STATUS_WT_UNREADABLE", + "comments": "", + "value": 4096 + }, + { + "type": "int", + "name": "GIT_STATUS_IGNORED", + "comments": "", + "value": 16384 + }, + { + "type": "int", + "name": "GIT_STATUS_CONFLICTED", + "comments": "", + "value": 32768 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_strarray", + { + "decl": ["char ** strings", "size_t count"], + "type": "struct", + "value": "git_strarray", + "file": "git2/strarray.h", + "line": 22, + "lineto": 25, + "block": "char ** strings\nsize_t count", + "tdef": "typedef", + "description": " Array of strings ", + "comments": "", + "fields": [ + { "type": "char **", "name": "strings", "comments": "" }, + { "type": "size_t", "name": "count", "comments": "" } + ], + "used": { + "returns": [], + "needs": [ + "git_index_add_all", + "git_index_remove_all", + "git_index_update_all", + "git_pathspec_new", + "git_reference_list", + "git_remote_connect", + "git_remote_download", + "git_remote_fetch", + "git_remote_get_fetch_refspecs", + "git_remote_get_push_refspecs", + "git_remote_list", + "git_remote_push", + "git_remote_rename", + "git_remote_upload", + "git_reset_default", + "git_strarray_copy", + "git_strarray_dispose", + "git_strarray_free", + "git_tag_list", + "git_tag_list_match", + "git_worktree_list" + ] + } + } + ], + [ + "git_stream_t", + { + "decl": ["GIT_STREAM_STANDARD", "GIT_STREAM_TLS"], + "type": "enum", + "file": "git2/sys/stream.h", + "line": 99, + "lineto": 105, + "block": "GIT_STREAM_STANDARD\nGIT_STREAM_TLS", + "tdef": "typedef", + "description": " The type of stream to register.", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_STREAM_STANDARD", + "comments": "

A standard (non-TLS) socket.

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_STREAM_TLS", + "comments": "

A TLS-encrypted socket.

\n", + "value": 2 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_submodule", + { + "decl": "git_submodule", + "type": "struct", + "value": "git_submodule", + "file": "git2/types.h", + "line": 283, + "lineto": 283, + "tdef": "typedef", + "description": " Opaque structure representing a submodule.", + "comments": "", + "used": { + "returns": [ + "git_submodule_fetch_recurse_submodules", + "git_submodule_ignore", + "git_submodule_update_strategy" + ], + "needs": [ + "git_submodule_add_finalize", + "git_submodule_add_setup", + "git_submodule_add_to_index", + "git_submodule_branch", + "git_submodule_cb", + "git_submodule_clone", + "git_submodule_dup", + "git_submodule_fetch_recurse_submodules", + "git_submodule_foreach", + "git_submodule_free", + "git_submodule_head_id", + "git_submodule_ignore", + "git_submodule_index_id", + "git_submodule_init", + "git_submodule_location", + "git_submodule_lookup", + "git_submodule_name", + "git_submodule_open", + "git_submodule_owner", + "git_submodule_path", + "git_submodule_reload", + "git_submodule_repo_init", + "git_submodule_set_fetch_recurse_submodules", + "git_submodule_set_ignore", + "git_submodule_set_update", + "git_submodule_status", + "git_submodule_sync", + "git_submodule_update", + "git_submodule_update_options_init", + "git_submodule_update_strategy", + "git_submodule_url", + "git_submodule_wd_id" + ] + } + } + ], + [ + "git_submodule_ignore_t", + { + "decl": [ + "GIT_SUBMODULE_IGNORE_UNSPECIFIED", + "GIT_SUBMODULE_IGNORE_NONE", + "GIT_SUBMODULE_IGNORE_UNTRACKED", + "GIT_SUBMODULE_IGNORE_DIRTY", + "GIT_SUBMODULE_IGNORE_ALL" + ], + "type": "enum", + "file": "git2/types.h", + "line": 347, + "lineto": 354, + "block": "GIT_SUBMODULE_IGNORE_UNSPECIFIED\nGIT_SUBMODULE_IGNORE_NONE\nGIT_SUBMODULE_IGNORE_UNTRACKED\nGIT_SUBMODULE_IGNORE_DIRTY\nGIT_SUBMODULE_IGNORE_ALL", + "tdef": "typedef", + "description": " Submodule ignore values", + "comments": "

These values represent settings for the submodule.$name.ignore configuration value which says how deeply to look at the working directory when getting submodule status.

\n\n

You can override this value in memory on a per-submodule basis with git_submodule_set_ignore() and can write the changed value to disk with git_submodule_save(). If you have overwritten the value, you can revert to the on disk value by using GIT_SUBMODULE_IGNORE_RESET.

\n\n

The values are:

\n\n\n", + "fields": [ + { + "type": "int", + "name": "GIT_SUBMODULE_IGNORE_UNSPECIFIED", + "comments": "

use the submodule's configuration

\n", + "value": -1 + }, + { + "type": "int", + "name": "GIT_SUBMODULE_IGNORE_NONE", + "comments": "

any change or untracked == dirty

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_SUBMODULE_IGNORE_UNTRACKED", + "comments": "

dirty if tracked files change

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_SUBMODULE_IGNORE_DIRTY", + "comments": "

only dirty if HEAD moved

\n", + "value": 3 + }, + { + "type": "int", + "name": "GIT_SUBMODULE_IGNORE_ALL", + "comments": "

never dirty

\n", + "value": 4 + } + ], + "used": { + "returns": ["git_submodule_ignore"], + "needs": ["git_submodule_set_ignore", "git_submodule_status"] + } + } + ], + [ + "git_submodule_recurse_t", + { + "decl": [ + "GIT_SUBMODULE_RECURSE_NO", + "GIT_SUBMODULE_RECURSE_YES", + "GIT_SUBMODULE_RECURSE_ONDEMAND" + ], + "type": "enum", + "file": "git2/types.h", + "line": 366, + "lineto": 370, + "block": "GIT_SUBMODULE_RECURSE_NO\nGIT_SUBMODULE_RECURSE_YES\nGIT_SUBMODULE_RECURSE_ONDEMAND", + "tdef": "typedef", + "description": " Options for submodule recurse.", + "comments": "

Represent the value of submodule.$name.fetchRecurseSubmodules

\n\n\n", + "fields": [ + { + "type": "int", + "name": "GIT_SUBMODULE_RECURSE_NO", + "comments": "", + "value": 0 + }, + { + "type": "int", + "name": "GIT_SUBMODULE_RECURSE_YES", + "comments": "", + "value": 1 + }, + { + "type": "int", + "name": "GIT_SUBMODULE_RECURSE_ONDEMAND", + "comments": "", + "value": 2 + } + ], + "used": { + "returns": ["git_submodule_fetch_recurse_submodules"], + "needs": ["git_submodule_set_fetch_recurse_submodules"] + } + } + ], + [ + "git_submodule_status_t", + { + "decl": [ + "GIT_SUBMODULE_STATUS_IN_HEAD", + "GIT_SUBMODULE_STATUS_IN_INDEX", + "GIT_SUBMODULE_STATUS_IN_CONFIG", + "GIT_SUBMODULE_STATUS_IN_WD", + "GIT_SUBMODULE_STATUS_INDEX_ADDED", + "GIT_SUBMODULE_STATUS_INDEX_DELETED", + "GIT_SUBMODULE_STATUS_INDEX_MODIFIED", + "GIT_SUBMODULE_STATUS_WD_UNINITIALIZED", + "GIT_SUBMODULE_STATUS_WD_ADDED", + "GIT_SUBMODULE_STATUS_WD_DELETED", + "GIT_SUBMODULE_STATUS_WD_MODIFIED", + "GIT_SUBMODULE_STATUS_WD_INDEX_MODIFIED", + "GIT_SUBMODULE_STATUS_WD_WD_MODIFIED", + "GIT_SUBMODULE_STATUS_WD_UNTRACKED" + ], + "type": "enum", + "file": "git2/submodule.h", + "line": 74, + "lineto": 89, + "block": "GIT_SUBMODULE_STATUS_IN_HEAD\nGIT_SUBMODULE_STATUS_IN_INDEX\nGIT_SUBMODULE_STATUS_IN_CONFIG\nGIT_SUBMODULE_STATUS_IN_WD\nGIT_SUBMODULE_STATUS_INDEX_ADDED\nGIT_SUBMODULE_STATUS_INDEX_DELETED\nGIT_SUBMODULE_STATUS_INDEX_MODIFIED\nGIT_SUBMODULE_STATUS_WD_UNINITIALIZED\nGIT_SUBMODULE_STATUS_WD_ADDED\nGIT_SUBMODULE_STATUS_WD_DELETED\nGIT_SUBMODULE_STATUS_WD_MODIFIED\nGIT_SUBMODULE_STATUS_WD_INDEX_MODIFIED\nGIT_SUBMODULE_STATUS_WD_WD_MODIFIED\nGIT_SUBMODULE_STATUS_WD_UNTRACKED", + "tdef": "typedef", + "description": " Return codes for submodule status.", + "comments": "

A combination of these flags will be returned to describe the status of a submodule. Depending on the "ignore" property of the submodule, some of the flags may never be returned because they indicate changes that are supposed to be ignored.

\n\n

Submodule info is contained in 4 places: the HEAD tree, the index, config files (both .git/config and .gitmodules), and the working directory. Any or all of those places might be missing information about the submodule depending on what state the repo is in. We consider all four places to build the combination of status flags.

\n\n

There are four values that are not really status, but give basic info about what sources of submodule data are available. These will be returned even if ignore is set to "ALL".

\n\n\n\n

The following values will be returned so long as ignore is not "ALL".

\n\n\n\n

The following can only be returned if ignore is "NONE" or "UNTRACKED".

\n\n\n\n

Lastly, the following will only be returned for ignore "NONE".

\n\n\n", + "fields": [ + { + "type": "int", + "name": "GIT_SUBMODULE_STATUS_IN_HEAD", + "comments": "", + "value": 1 + }, + { + "type": "int", + "name": "GIT_SUBMODULE_STATUS_IN_INDEX", + "comments": "", + "value": 2 + }, + { + "type": "int", + "name": "GIT_SUBMODULE_STATUS_IN_CONFIG", + "comments": "", + "value": 4 + }, + { + "type": "int", + "name": "GIT_SUBMODULE_STATUS_IN_WD", + "comments": "", + "value": 8 + }, + { + "type": "int", + "name": "GIT_SUBMODULE_STATUS_INDEX_ADDED", + "comments": "", + "value": 16 + }, + { + "type": "int", + "name": "GIT_SUBMODULE_STATUS_INDEX_DELETED", + "comments": "", + "value": 32 + }, + { + "type": "int", + "name": "GIT_SUBMODULE_STATUS_INDEX_MODIFIED", + "comments": "", + "value": 64 + }, + { + "type": "int", + "name": "GIT_SUBMODULE_STATUS_WD_UNINITIALIZED", + "comments": "", + "value": 128 + }, + { + "type": "int", + "name": "GIT_SUBMODULE_STATUS_WD_ADDED", + "comments": "", + "value": 256 + }, + { + "type": "int", + "name": "GIT_SUBMODULE_STATUS_WD_DELETED", + "comments": "", + "value": 512 + }, + { + "type": "int", + "name": "GIT_SUBMODULE_STATUS_WD_MODIFIED", + "comments": "", + "value": 1024 + }, + { + "type": "int", + "name": "GIT_SUBMODULE_STATUS_WD_INDEX_MODIFIED", + "comments": "", + "value": 2048 + }, + { + "type": "int", + "name": "GIT_SUBMODULE_STATUS_WD_WD_MODIFIED", + "comments": "", + "value": 4096 + }, + { + "type": "int", + "name": "GIT_SUBMODULE_STATUS_WD_UNTRACKED", + "comments": "", + "value": 8192 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_submodule_update_options", + { + "decl": [ + "unsigned int version", + "git_checkout_options checkout_opts", + "git_fetch_options fetch_opts", + "int allow_fetch" + ], + "type": "struct", + "value": "git_submodule_update_options", + "file": "git2/submodule.h", + "line": 135, + "lineto": 158, + "block": "unsigned int version\ngit_checkout_options checkout_opts\ngit_fetch_options fetch_opts\nint allow_fetch", + "tdef": "typedef", + "description": " Submodule update options structure", + "comments": "

Initialize with GIT_SUBMODULE_UPDATE_OPTIONS_INIT. Alternatively, you can use git_submodule_update_options_init.

\n", + "fields": [ + { "type": "unsigned int", "name": "version", "comments": "" }, + { + "type": "git_checkout_options", + "name": "checkout_opts", + "comments": " These options are passed to the checkout step. To disable\n checkout, set the `checkout_strategy` to `GIT_CHECKOUT_NONE`\n or `GIT_CHECKOUT_DRY_RUN`." + }, + { + "type": "git_fetch_options", + "name": "fetch_opts", + "comments": " Options which control the fetch, including callbacks.\n\n The callbacks to use for reporting fetch progress, and for acquiring\n credentials in the event they are needed." + }, + { + "type": "int", + "name": "allow_fetch", + "comments": " Allow fetching from the submodule's default remote if the target\n commit isn't found. Enabled by default." + } + ], + "used": { + "returns": [], + "needs": [ + "git_submodule_clone", + "git_submodule_update", + "git_submodule_update_options_init" + ] + } + } + ], + [ + "git_submodule_update_t", + { + "decl": [ + "GIT_SUBMODULE_UPDATE_CHECKOUT", + "GIT_SUBMODULE_UPDATE_REBASE", + "GIT_SUBMODULE_UPDATE_MERGE", + "GIT_SUBMODULE_UPDATE_NONE", + "GIT_SUBMODULE_UPDATE_DEFAULT" + ], + "type": "enum", + "file": "git2/types.h", + "line": 311, + "lineto": 318, + "block": "GIT_SUBMODULE_UPDATE_CHECKOUT\nGIT_SUBMODULE_UPDATE_REBASE\nGIT_SUBMODULE_UPDATE_MERGE\nGIT_SUBMODULE_UPDATE_NONE\nGIT_SUBMODULE_UPDATE_DEFAULT", + "tdef": "typedef", + "description": " Submodule update values", + "comments": "

These values represent settings for the submodule.$name.update configuration value which says how to handle git submodule update for this submodule. The value is usually set in the ".gitmodules" file and copied to ".git/config" when the submodule is initialized.

\n\n

You can override this setting on a per-submodule basis with git_submodule_set_update() and write the changed value to disk using git_submodule_save(). If you have overwritten the value, you can revert it by passing GIT_SUBMODULE_UPDATE_RESET to the set function.

\n\n

The values are:

\n\n\n", + "fields": [ + { + "type": "int", + "name": "GIT_SUBMODULE_UPDATE_CHECKOUT", + "comments": "", + "value": 1 + }, + { + "type": "int", + "name": "GIT_SUBMODULE_UPDATE_REBASE", + "comments": "", + "value": 2 + }, + { + "type": "int", + "name": "GIT_SUBMODULE_UPDATE_MERGE", + "comments": "", + "value": 3 + }, + { + "type": "int", + "name": "GIT_SUBMODULE_UPDATE_NONE", + "comments": "", + "value": 4 + }, + { + "type": "int", + "name": "GIT_SUBMODULE_UPDATE_DEFAULT", + "comments": "", + "value": 0 + } + ], + "used": { + "returns": ["git_submodule_update_strategy"], + "needs": ["git_submodule_set_update"] + } + } + ], + [ + "git_tag", + { + "decl": "git_tag", + "type": "struct", + "value": "git_tag", + "file": "git2/types.h", + "line": 135, + "lineto": 135, + "tdef": "typedef", + "description": " Parsed representation of a tag object. ", + "comments": "", + "used": { + "returns": [], + "needs": [ + "git_tag_dup", + "git_tag_foreach", + "git_tag_free", + "git_tag_id", + "git_tag_lookup", + "git_tag_lookup_prefix", + "git_tag_message", + "git_tag_name", + "git_tag_owner", + "git_tag_peel", + "git_tag_tagger", + "git_tag_target", + "git_tag_target_id", + "git_tag_target_type" + ] + } + } + ], + [ + "git_time", + { + "decl": ["git_time_t time", "int offset", "char sign"], + "type": "struct", + "value": "git_time", + "file": "git2/types.h", + "line": 180, + "lineto": 184, + "block": "git_time_t time\nint offset\nchar sign", + "tdef": "typedef", + "description": " Time in a signature ", + "comments": "", + "fields": [ + { + "type": "git_time_t", + "name": "time", + "comments": " time in seconds from epoch " + }, + { + "type": "int", + "name": "offset", + "comments": " timezone offset, in minutes " + }, + { + "type": "char", + "name": "sign", + "comments": " indicator for questionable '-0000' offsets in signature " + } + ], + "used": { + "returns": ["git_commit_time"], + "needs": ["git_signature_new"] + } + } + ], + [ + "git_trace_level_t", + { + "decl": [ + "GIT_TRACE_NONE", + "GIT_TRACE_FATAL", + "GIT_TRACE_ERROR", + "GIT_TRACE_WARN", + "GIT_TRACE_INFO", + "GIT_TRACE_DEBUG", + "GIT_TRACE_TRACE" + ], + "type": "enum", + "file": "git2/trace.h", + "line": 26, + "lineto": 47, + "block": "GIT_TRACE_NONE\nGIT_TRACE_FATAL\nGIT_TRACE_ERROR\nGIT_TRACE_WARN\nGIT_TRACE_INFO\nGIT_TRACE_DEBUG\nGIT_TRACE_TRACE", + "tdef": "typedef", + "description": " Available tracing levels. When tracing is set to a particular level,\n callers will be provided tracing at the given level and all lower levels.", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_TRACE_NONE", + "comments": "

No tracing will be performed.

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_TRACE_FATAL", + "comments": "

Severe errors that may impact the program's execution

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_TRACE_ERROR", + "comments": "

Errors that do not impact the program's execution

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_TRACE_WARN", + "comments": "

Warnings that suggest abnormal data

\n", + "value": 3 + }, + { + "type": "int", + "name": "GIT_TRACE_INFO", + "comments": "

Informational messages about program execution

\n", + "value": 4 + }, + { + "type": "int", + "name": "GIT_TRACE_DEBUG", + "comments": "

Detailed data that allows for debugging

\n", + "value": 5 + }, + { + "type": "int", + "name": "GIT_TRACE_TRACE", + "comments": "

Exceptionally detailed debugging data

\n", + "value": 6 + } + ], + "used": { "returns": [], "needs": ["git_trace_cb", "git_trace_set"] } + } + ], + [ + "git_transaction", + { + "decl": "git_transaction", + "type": "struct", + "value": "git_transaction", + "file": "git2/types.h", + "line": 200, + "lineto": 200, + "tdef": "typedef", + "description": " Transactional interface to references ", + "comments": "", + "used": { + "returns": [], + "needs": [ + "git_config_lock", + "git_transaction_commit", + "git_transaction_free", + "git_transaction_lock_ref", + "git_transaction_new", + "git_transaction_remove", + "git_transaction_set_reflog", + "git_transaction_set_symbolic_target", + "git_transaction_set_target" + ] + } + } + ], + [ + "git_transport", + { + "decl": "git_transport", + "type": "struct", + "value": "git_transport", + "file": "git2/types.h", + "line": 263, + "lineto": 263, + "tdef": "typedef", + "description": " Interface which represents a transport to communicate with a\n remote.", + "comments": "", + "used": { "returns": [], "needs": ["git_transport_cb"] } + } + ], + [ + "git_tree", + { + "decl": "git_tree", + "type": "struct", + "value": "git_tree", + "file": "git2/types.h", + "line": 147, + "lineto": 147, + "tdef": "typedef", + "description": " Representation of a tree object. ", + "comments": "", + "used": { + "returns": [ + "git_tree_entry_byid", + "git_tree_entry_byindex", + "git_tree_entry_byname", + "git_treebuilder_get" + ], + "needs": [ + "git_apply_to_tree", + "git_commit_amend", + "git_commit_create", + "git_commit_create_buffer", + "git_commit_create_cb", + "git_commit_create_v", + "git_commit_tree", + "git_diff_tree_to_index", + "git_diff_tree_to_tree", + "git_diff_tree_to_workdir", + "git_diff_tree_to_workdir_with_index", + "git_index_read_tree", + "git_merge_trees", + "git_pathspec_match_tree", + "git_tree_create_updated", + "git_tree_dup", + "git_tree_entry_byid", + "git_tree_entry_byindex", + "git_tree_entry_byname", + "git_tree_entry_bypath", + "git_tree_entry_cmp", + "git_tree_entry_dup", + "git_tree_entry_filemode", + "git_tree_entry_filemode_raw", + "git_tree_entry_free", + "git_tree_entry_id", + "git_tree_entry_name", + "git_tree_entry_to_object", + "git_tree_entry_type", + "git_tree_entrycount", + "git_tree_free", + "git_tree_id", + "git_tree_lookup", + "git_tree_lookup_prefix", + "git_tree_owner", + "git_tree_walk", + "git_treebuilder_clear", + "git_treebuilder_entrycount", + "git_treebuilder_filter", + "git_treebuilder_filter_cb", + "git_treebuilder_free", + "git_treebuilder_get", + "git_treebuilder_insert", + "git_treebuilder_new", + "git_treebuilder_remove", + "git_treebuilder_write", + "git_treebuilder_write_with_buffer", + "git_treewalk_cb" + ] + } + } + ], + [ + "git_tree_entry", + { + "decl": "git_tree_entry", + "type": "struct", + "value": "git_tree_entry", + "file": "git2/types.h", + "line": 144, + "lineto": 144, + "tdef": "typedef", + "description": " Representation of each one of the entries in a tree object. ", + "comments": "", + "used": { + "returns": [ + "git_tree_entry_byid", + "git_tree_entry_byindex", + "git_tree_entry_byname", + "git_treebuilder_get" + ], + "needs": [ + "git_tree_entry_bypath", + "git_tree_entry_cmp", + "git_tree_entry_dup", + "git_tree_entry_filemode", + "git_tree_entry_filemode_raw", + "git_tree_entry_free", + "git_tree_entry_id", + "git_tree_entry_name", + "git_tree_entry_to_object", + "git_tree_entry_type", + "git_treebuilder_filter_cb", + "git_treebuilder_insert", + "git_treewalk_cb" + ] + } + } + ], + [ + "git_tree_update", + { + "decl": [ + "git_tree_update_t action", + "git_oid id", + "git_filemode_t filemode", + "const char * path" + ], + "type": "struct", + "value": "git_tree_update", + "file": "git2/tree.h", + "line": 449, + "lineto": 458, + "block": "git_tree_update_t action\ngit_oid id\ngit_filemode_t filemode\nconst char * path", + "tdef": "typedef", + "description": " An action to perform during the update of a tree", + "comments": "", + "fields": [ + { + "type": "git_tree_update_t", + "name": "action", + "comments": " Update action. If it's an removal, only the path is looked at " + }, + { "type": "git_oid", "name": "id", "comments": " The entry's id " }, + { + "type": "git_filemode_t", + "name": "filemode", + "comments": " The filemode/kind of object " + }, + { + "type": "const char *", + "name": "path", + "comments": " The full path from the root tree " + } + ], + "used": { "returns": [], "needs": ["git_tree_create_updated"] } + } + ], + [ + "git_tree_update_t", + { + "decl": ["GIT_TREE_UPDATE_UPSERT", "GIT_TREE_UPDATE_REMOVE"], + "type": "enum", + "file": "git2/tree.h", + "line": 439, + "lineto": 444, + "block": "GIT_TREE_UPDATE_UPSERT\nGIT_TREE_UPDATE_REMOVE", + "tdef": "typedef", + "description": " The kind of update to perform", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_TREE_UPDATE_UPSERT", + "comments": "

Update or insert an entry at the specified path

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_TREE_UPDATE_REMOVE", + "comments": "

Remove an entry from the specified path

\n", + "value": 1 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_treebuilder", + { + "decl": "git_treebuilder", + "type": "struct", + "value": "git_treebuilder", + "file": "git2/types.h", + "line": 150, + "lineto": 150, + "tdef": "typedef", + "description": " Constructor for in-memory trees ", + "comments": "", + "used": { + "returns": [], + "needs": [ + "git_treebuilder_clear", + "git_treebuilder_entrycount", + "git_treebuilder_filter", + "git_treebuilder_free", + "git_treebuilder_get", + "git_treebuilder_insert", + "git_treebuilder_new", + "git_treebuilder_remove", + "git_treebuilder_write", + "git_treebuilder_write_with_buffer" + ] + } + } + ], + [ + "git_treewalk_mode", + { + "decl": ["GIT_TREEWALK_PRE", "GIT_TREEWALK_POST"], + "type": "enum", + "file": "git2/tree.h", + "line": 398, + "lineto": 401, + "block": "GIT_TREEWALK_PRE\nGIT_TREEWALK_POST", + "tdef": "typedef", + "description": " Tree traversal modes ", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_TREEWALK_PRE", + "comments": "", + "value": 0 + }, + { + "type": "int", + "name": "GIT_TREEWALK_POST", + "comments": "", + "value": 1 + } + ], + "used": { "returns": [], "needs": ["git_tree_walk"] } + } + ], + [ + "git_worktree", + { + "decl": "git_worktree", + "type": "struct", + "value": "git_worktree", + "file": "git2/types.h", + "line": 126, + "lineto": 126, + "tdef": "typedef", + "description": " Representation of a working tree ", + "comments": "", + "used": { + "returns": [], + "needs": [ + "git_repository_open_from_worktree", + "git_worktree_add", + "git_worktree_add_options_init", + "git_worktree_free", + "git_worktree_is_locked", + "git_worktree_is_prunable", + "git_worktree_lock", + "git_worktree_lookup", + "git_worktree_name", + "git_worktree_open_from_repository", + "git_worktree_path", + "git_worktree_prune", + "git_worktree_prune_options_init", + "git_worktree_unlock", + "git_worktree_validate" + ] + } + } + ], + [ + "git_worktree_add_options", + { + "decl": [ + "unsigned int version", + "int lock", + "int checkout_existing", + "git_reference * ref", + "git_checkout_options checkout_options" + ], + "type": "struct", + "value": "git_worktree_add_options", + "file": "git2/worktree.h", + "line": 86, + "lineto": 97, + "block": "unsigned int version\nint lock\nint checkout_existing\ngit_reference * ref\ngit_checkout_options checkout_options", + "tdef": "typedef", + "description": " Worktree add options structure", + "comments": "

Initialize with GIT_WORKTREE_ADD_OPTIONS_INIT. Alternatively, you can use git_worktree_add_options_init.

\n", + "fields": [ + { "type": "unsigned int", "name": "version", "comments": "" }, + { + "type": "int", + "name": "lock", + "comments": " lock newly created worktree " + }, + { + "type": "int", + "name": "checkout_existing", + "comments": " allow checkout of existing branch matching worktree name " + }, + { + "type": "git_reference *", + "name": "ref", + "comments": " reference to use for the new worktree HEAD " + }, + { + "type": "git_checkout_options", + "name": "checkout_options", + "comments": " Options for the checkout." + } + ], + "used": { + "returns": [], + "needs": ["git_worktree_add", "git_worktree_add_options_init"] + } + } + ], + [ + "git_worktree_prune_options", + { + "decl": ["unsigned int version", "uint32_t flags"], + "type": "struct", + "value": "git_worktree_prune_options", + "file": "git2/worktree.h", + "line": 210, + "lineto": 215, + "block": "unsigned int version\nuint32_t flags", + "tdef": "typedef", + "description": " Worktree prune options structure", + "comments": "

Initialize with GIT_WORKTREE_PRUNE_OPTIONS_INIT. Alternatively, you can use git_worktree_prune_options_init.

\n", + "fields": [ + { "type": "unsigned int", "name": "version", "comments": "" }, + { + "type": "uint32_t", + "name": "flags", + "comments": " A combination of `git_worktree_prune_t` " + } + ], + "used": { + "returns": [], + "needs": [ + "git_worktree_is_prunable", + "git_worktree_prune", + "git_worktree_prune_options_init" + ] + } + } + ], + [ + "git_worktree_prune_t", + { + "decl": [ + "GIT_WORKTREE_PRUNE_VALID", + "GIT_WORKTREE_PRUNE_LOCKED", + "GIT_WORKTREE_PRUNE_WORKING_TREE" + ], + "type": "enum", + "file": "git2/worktree.h", + "line": 194, + "lineto": 201, + "block": "GIT_WORKTREE_PRUNE_VALID\nGIT_WORKTREE_PRUNE_LOCKED\nGIT_WORKTREE_PRUNE_WORKING_TREE", + "tdef": "typedef", + "description": " Flags which can be passed to git_worktree_prune to alter its\n behavior.", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_WORKTREE_PRUNE_VALID", + "comments": "", + "value": 1 + }, + { + "type": "int", + "name": "GIT_WORKTREE_PRUNE_LOCKED", + "comments": "", + "value": 2 + }, + { + "type": "int", + "name": "GIT_WORKTREE_PRUNE_WORKING_TREE", + "comments": "", + "value": 4 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_writestream", + { + "decl": [ + "int (*)(git_writestream *, const char *, size_t) write", + "int (*)(git_writestream *) close", + "void (*)(git_writestream *) free" + ], + "type": "struct", + "value": "git_writestream", + "file": "git2/types.h", + "line": 375, + "lineto": 379, + "tdef": null, + "description": " A type to write in a streaming fashion, for example, for filters. ", + "comments": "", + "fields": [ + { + "type": "int (*)(git_writestream *, const char *, size_t)", + "name": "write", + "comments": "" + }, + { + "type": "int (*)(git_writestream *)", + "name": "close", + "comments": "" + }, + { + "type": "void (*)(git_writestream *)", + "name": "free", + "comments": "" + } + ], + "block": "int (*)(git_writestream *, const char *, size_t) write\nint (*)(git_writestream *) close\nvoid (*)(git_writestream *) free", + "used": { + "returns": [], + "needs": [ + "git_blob_create_from_stream", + "git_blob_create_from_stream_commit", + "git_filter_list_stream_blob", + "git_filter_list_stream_buffer", + "git_filter_list_stream_data", + "git_filter_list_stream_file" + ] + } + } + ] + ], + "prefix": "include", + "groups": [ + [ + "annotated", + [ + "git_annotated_commit_free", + "git_annotated_commit_from_fetchhead", + "git_annotated_commit_from_ref", + "git_annotated_commit_from_revspec", + "git_annotated_commit_id", + "git_annotated_commit_lookup", + "git_annotated_commit_ref" + ] + ], + ["apply", ["git_apply", "git_apply_options_init", "git_apply_to_tree"]], + [ + "attr", + [ + "git_attr_add_macro", + "git_attr_cache_flush", + "git_attr_foreach", + "git_attr_foreach_ext", + "git_attr_get", + "git_attr_get_ext", + "git_attr_get_many", + "git_attr_get_many_ext", + "git_attr_value" + ] + ], + [ + "blame", + [ + "git_blame_buffer", + "git_blame_free", + "git_blame_get_hunk_byindex", + "git_blame_get_hunk_byline", + "git_blame_get_hunk_count", + "git_blame_hunk_byindex", + "git_blame_hunk_byline", + "git_blame_hunkcount", + "git_blame_init_options", + "git_blame_line_byindex", + "git_blame_linecount", + "git_blame_options_init" + ] + ], + [ + "blob", + [ + "git_blob_create_from_buffer", + "git_blob_create_from_disk", + "git_blob_create_from_stream", + "git_blob_create_from_stream_commit", + "git_blob_create_from_workdir", + "git_blob_data_is_binary", + "git_blob_dup", + "git_blob_filter", + "git_blob_filter_options_init", + "git_blob_filtered_content", + "git_blob_free", + "git_blob_id", + "git_blob_is_binary", + "git_blob_lookup", + "git_blob_lookup_prefix", + "git_blob_owner", + "git_blob_rawcontent", + "git_blob_rawsize" + ] + ], + [ + "branch", + [ + "git_branch_create", + "git_branch_create_from_annotated", + "git_branch_delete", + "git_branch_is_checked_out", + "git_branch_is_head", + "git_branch_iterator_free", + "git_branch_iterator_new", + "git_branch_lookup", + "git_branch_move", + "git_branch_name", + "git_branch_name_is_valid", + "git_branch_next", + "git_branch_remote_name", + "git_branch_set_upstream", + "git_branch_upstream", + "git_branch_upstream_merge", + "git_branch_upstream_name", + "git_branch_upstream_remote" + ] + ], + [ + "buf", + [ + "git_buf_contains_nul", + "git_buf_dispose", + "git_buf_free", + "git_buf_grow", + "git_buf_is_binary", + "git_buf_set" + ] + ], + [ + "checkout", + [ + "git_checkout_head", + "git_checkout_index", + "git_checkout_options_init", + "git_checkout_tree" + ] + ], + [ + "cherrypick", + ["git_cherrypick", "git_cherrypick_commit", "git_cherrypick_options_init"] + ], + ["clone", ["git_clone", "git_clone_options_init"]], + [ + "commit", + [ + "git_commit_amend", + "git_commit_author", + "git_commit_author_with_mailmap", + "git_commit_body", + "git_commit_committer", + "git_commit_committer_with_mailmap", + "git_commit_create", + "git_commit_create_buffer", + "git_commit_create_from_stage", + "git_commit_create_v", + "git_commit_create_with_signature", + "git_commit_dup", + "git_commit_extract_signature", + "git_commit_free", + "git_commit_header_field", + "git_commit_id", + "git_commit_lookup", + "git_commit_lookup_prefix", + "git_commit_message", + "git_commit_message_encoding", + "git_commit_message_raw", + "git_commit_nth_gen_ancestor", + "git_commit_owner", + "git_commit_parent", + "git_commit_parent_id", + "git_commit_parentcount", + "git_commit_raw_header", + "git_commit_summary", + "git_commit_time", + "git_commit_time_offset", + "git_commit_tree", + "git_commit_tree_id" + ] + ], + ["commitarray", ["git_commitarray_dispose"]], + [ + "config", + [ + "git_config_add_file_ondisk", + "git_config_backend_foreach_match", + "git_config_delete_entry", + "git_config_delete_multivar", + "git_config_entry_free", + "git_config_find_global", + "git_config_find_programdata", + "git_config_find_system", + "git_config_find_xdg", + "git_config_foreach", + "git_config_foreach_match", + "git_config_free", + "git_config_get_bool", + "git_config_get_entry", + "git_config_get_int32", + "git_config_get_int64", + "git_config_get_mapped", + "git_config_get_multivar_foreach", + "git_config_get_path", + "git_config_get_string", + "git_config_get_string_buf", + "git_config_iterator_free", + "git_config_iterator_glob_new", + "git_config_iterator_new", + "git_config_lock", + "git_config_lookup_map_value", + "git_config_multivar_iterator_new", + "git_config_new", + "git_config_next", + "git_config_open_default", + "git_config_open_global", + "git_config_open_level", + "git_config_open_ondisk", + "git_config_parse_bool", + "git_config_parse_int32", + "git_config_parse_int64", + "git_config_parse_path", + "git_config_set_bool", + "git_config_set_int32", + "git_config_set_int64", + "git_config_set_multivar", + "git_config_set_string", + "git_config_set_writeorder", + "git_config_snapshot" + ] + ], + [ + "credential", + [ + "git_credential_default_new", + "git_credential_free", + "git_credential_get_username", + "git_credential_has_username", + "git_credential_ssh_custom_new", + "git_credential_ssh_interactive_new", + "git_credential_ssh_key_from_agent", + "git_credential_ssh_key_memory_new", + "git_credential_ssh_key_new", + "git_credential_username_new", + "git_credential_userpass", + "git_credential_userpass_plaintext_new" + ] + ], + [ + "describe", + [ + "git_describe_commit", + "git_describe_format", + "git_describe_format_options_init", + "git_describe_options_init", + "git_describe_result_free", + "git_describe_workdir" + ] + ], + [ + "diff", + [ + "git_diff_blob_to_buffer", + "git_diff_blobs", + "git_diff_buffers", + "git_diff_commit_as_email", + "git_diff_find_options_init", + "git_diff_find_similar", + "git_diff_foreach", + "git_diff_format_email", + "git_diff_format_email_options_init", + "git_diff_free", + "git_diff_from_buffer", + "git_diff_get_delta", + "git_diff_get_stats", + "git_diff_index_to_index", + "git_diff_index_to_workdir", + "git_diff_is_sorted_icase", + "git_diff_merge", + "git_diff_num_deltas", + "git_diff_num_deltas_of_type", + "git_diff_options_init", + "git_diff_patchid", + "git_diff_patchid_options_init", + "git_diff_print", + "git_diff_stats_deletions", + "git_diff_stats_files_changed", + "git_diff_stats_free", + "git_diff_stats_insertions", + "git_diff_stats_to_buf", + "git_diff_status_char", + "git_diff_to_buf", + "git_diff_tree_to_index", + "git_diff_tree_to_tree", + "git_diff_tree_to_workdir", + "git_diff_tree_to_workdir_with_index" + ] + ], + ["email", ["git_email_create_from_commit"]], + ["error", ["git_error_last"]], + ["fetch", ["git_fetch_options_init"]], + [ + "filter", + [ + "git_filter_list_apply_to_blob", + "git_filter_list_apply_to_buffer", + "git_filter_list_apply_to_data", + "git_filter_list_apply_to_file", + "git_filter_list_contains", + "git_filter_list_free", + "git_filter_list_load", + "git_filter_list_load_ext", + "git_filter_list_stream_blob", + "git_filter_list_stream_buffer", + "git_filter_list_stream_data", + "git_filter_list_stream_file" + ] + ], + [ + "giterr", + ["giterr_clear", "giterr_last", "giterr_set_oom", "giterr_set_str"] + ], + [ + "graph", + [ + "git_graph_ahead_behind", + "git_graph_descendant_of", + "git_graph_reachable_from_any" + ] + ], + [ + "ignore", + [ + "git_ignore_add_rule", + "git_ignore_clear_internal_rules", + "git_ignore_path_is_ignored" + ] + ], + [ + "index", + [ + "git_index_add", + "git_index_add_all", + "git_index_add_bypath", + "git_index_add_from_buffer", + "git_index_caps", + "git_index_checksum", + "git_index_clear", + "git_index_conflict_add", + "git_index_conflict_cleanup", + "git_index_conflict_get", + "git_index_conflict_iterator_free", + "git_index_conflict_iterator_new", + "git_index_conflict_next", + "git_index_conflict_remove", + "git_index_entry_is_conflict", + "git_index_entry_stage", + "git_index_entrycount", + "git_index_find", + "git_index_find_prefix", + "git_index_free", + "git_index_get_byindex", + "git_index_get_bypath", + "git_index_has_conflicts", + "git_index_iterator_free", + "git_index_iterator_new", + "git_index_iterator_next", + "git_index_new", + "git_index_open", + "git_index_owner", + "git_index_path", + "git_index_read", + "git_index_read_tree", + "git_index_remove", + "git_index_remove_all", + "git_index_remove_bypath", + "git_index_remove_directory", + "git_index_set_caps", + "git_index_set_version", + "git_index_update_all", + "git_index_version", + "git_index_write", + "git_index_write_tree", + "git_index_write_tree_to" + ] + ], + [ + "indexer", + [ + "git_indexer_append", + "git_indexer_commit", + "git_indexer_free", + "git_indexer_hash", + "git_indexer_name", + "git_indexer_new", + "git_indexer_options_init" + ] + ], + [ + "libgit2", + [ + "git_libgit2_feature_backend", + "git_libgit2_features", + "git_libgit2_init", + "git_libgit2_opts", + "git_libgit2_prerelease", + "git_libgit2_shutdown", + "git_libgit2_version" + ] + ], + [ + "mailmap", + [ + "git_mailmap_add_entry", + "git_mailmap_free", + "git_mailmap_from_buffer", + "git_mailmap_from_repository", + "git_mailmap_new", + "git_mailmap_resolve", + "git_mailmap_resolve_signature" + ] + ], + [ + "merge", + [ + "git_merge", + "git_merge_analysis", + "git_merge_analysis_for_ref", + "git_merge_base", + "git_merge_base_many", + "git_merge_base_octopus", + "git_merge_bases", + "git_merge_bases_many", + "git_merge_commits", + "git_merge_file", + "git_merge_file_from_index", + "git_merge_file_input_init", + "git_merge_file_options_init", + "git_merge_file_result_free", + "git_merge_options_init", + "git_merge_trees" + ] + ], + [ + "message", + [ + "git_message_prettify", + "git_message_trailer_array_free", + "git_message_trailers" + ] + ], + ["note", ["git_note_iterator_free", "git_note_next"]], + [ + "object", + [ + "git_object__size", + "git_object_dup", + "git_object_free", + "git_object_id", + "git_object_lookup", + "git_object_lookup_bypath", + "git_object_lookup_prefix", + "git_object_owner", + "git_object_peel", + "git_object_rawcontent_is_valid", + "git_object_short_id", + "git_object_string2type", + "git_object_type", + "git_object_type2string", + "git_object_typeisloose" + ] + ], + [ + "odb", + [ + "git_odb_add_alternate", + "git_odb_add_backend", + "git_odb_add_disk_alternate", + "git_odb_backend_loose", + "git_odb_backend_one_pack", + "git_odb_backend_pack", + "git_odb_exists", + "git_odb_exists_ext", + "git_odb_exists_prefix", + "git_odb_expand_ids", + "git_odb_foreach", + "git_odb_free", + "git_odb_get_backend", + "git_odb_hash", + "git_odb_hashfile", + "git_odb_new", + "git_odb_num_backends", + "git_odb_object_data", + "git_odb_object_dup", + "git_odb_object_free", + "git_odb_object_id", + "git_odb_object_size", + "git_odb_object_type", + "git_odb_open", + "git_odb_open_rstream", + "git_odb_open_wstream", + "git_odb_read", + "git_odb_read_header", + "git_odb_read_prefix", + "git_odb_refresh", + "git_odb_set_commit_graph", + "git_odb_stream_finalize_write", + "git_odb_stream_free", + "git_odb_stream_read", + "git_odb_stream_write", + "git_odb_write", + "git_odb_write_multi_pack_index", + "git_odb_write_pack" + ] + ], + [ + "oid", + [ + "git_oid_cmp", + "git_oid_cpy", + "git_oid_equal", + "git_oid_fmt", + "git_oid_fromraw", + "git_oid_fromstr", + "git_oid_fromstrn", + "git_oid_fromstrp", + "git_oid_is_zero", + "git_oid_ncmp", + "git_oid_nfmt", + "git_oid_pathfmt", + "git_oid_shorten_add", + "git_oid_shorten_free", + "git_oid_shorten_new", + "git_oid_strcmp", + "git_oid_streq", + "git_oid_tostr", + "git_oid_tostr_s" + ] + ], + ["oidarray", ["git_oidarray_dispose", "git_oidarray_free"]], + [ + "packbuilder", + [ + "git_packbuilder_foreach", + "git_packbuilder_free", + "git_packbuilder_hash", + "git_packbuilder_insert", + "git_packbuilder_insert_commit", + "git_packbuilder_insert_recur", + "git_packbuilder_insert_tree", + "git_packbuilder_insert_walk", + "git_packbuilder_name", + "git_packbuilder_new", + "git_packbuilder_object_count", + "git_packbuilder_set_callbacks", + "git_packbuilder_set_threads", + "git_packbuilder_write", + "git_packbuilder_write_buf", + "git_packbuilder_written" + ] + ], + [ + "patch", + [ + "git_patch_free", + "git_patch_from_blob_and_buffer", + "git_patch_from_blobs", + "git_patch_from_buffers", + "git_patch_from_diff", + "git_patch_get_delta", + "git_patch_get_hunk", + "git_patch_get_line_in_hunk", + "git_patch_line_stats", + "git_patch_num_hunks", + "git_patch_num_lines_in_hunk", + "git_patch_owner", + "git_patch_print", + "git_patch_size", + "git_patch_to_buf" + ] + ], + [ + "pathspec", + [ + "git_pathspec_free", + "git_pathspec_match_diff", + "git_pathspec_match_index", + "git_pathspec_match_list_diff_entry", + "git_pathspec_match_list_entry", + "git_pathspec_match_list_entrycount", + "git_pathspec_match_list_failed_entry", + "git_pathspec_match_list_failed_entrycount", + "git_pathspec_match_list_free", + "git_pathspec_match_tree", + "git_pathspec_match_workdir", + "git_pathspec_matches_path", + "git_pathspec_new" + ] + ], + ["proxy", ["git_proxy_options_init"]], + ["push", ["git_push_options_init"]], + [ + "rebase", + [ + "git_rebase_abort", + "git_rebase_commit", + "git_rebase_finish", + "git_rebase_free", + "git_rebase_init", + "git_rebase_inmemory_index", + "git_rebase_next", + "git_rebase_onto_id", + "git_rebase_onto_name", + "git_rebase_open", + "git_rebase_operation_byindex", + "git_rebase_operation_current", + "git_rebase_operation_entrycount", + "git_rebase_options_init", + "git_rebase_orig_head_id", + "git_rebase_orig_head_name" + ] + ], + [ + "refdb", + [ + "git_refdb_compress", + "git_refdb_free", + "git_refdb_new", + "git_refdb_open" + ] + ], + [ + "reference", + [ + "git_reference_cmp", + "git_reference_create", + "git_reference_create_matching", + "git_reference_delete", + "git_reference_dup", + "git_reference_dwim", + "git_reference_ensure_log", + "git_reference_foreach", + "git_reference_foreach_glob", + "git_reference_foreach_name", + "git_reference_free", + "git_reference_has_log", + "git_reference_is_branch", + "git_reference_is_note", + "git_reference_is_remote", + "git_reference_is_tag", + "git_reference_is_valid_name", + "git_reference_iterator_free", + "git_reference_iterator_glob_new", + "git_reference_iterator_new", + "git_reference_list", + "git_reference_lookup", + "git_reference_name", + "git_reference_name_is_valid", + "git_reference_name_to_id", + "git_reference_next", + "git_reference_next_name", + "git_reference_normalize_name", + "git_reference_owner", + "git_reference_peel", + "git_reference_remove", + "git_reference_rename", + "git_reference_resolve", + "git_reference_set_target", + "git_reference_shorthand", + "git_reference_symbolic_create", + "git_reference_symbolic_create_matching", + "git_reference_symbolic_set_target", + "git_reference_symbolic_target", + "git_reference_target", + "git_reference_target_peel", + "git_reference_type" + ] + ], + [ + "reflog", + [ + "git_reflog_append", + "git_reflog_delete", + "git_reflog_drop", + "git_reflog_entry_byindex", + "git_reflog_entry_committer", + "git_reflog_entry_id_new", + "git_reflog_entry_id_old", + "git_reflog_entry_message", + "git_reflog_entrycount", + "git_reflog_free", + "git_reflog_read", + "git_reflog_rename", + "git_reflog_write" + ] + ], + [ + "refspec", + [ + "git_refspec_direction", + "git_refspec_dst", + "git_refspec_dst_matches", + "git_refspec_force", + "git_refspec_free", + "git_refspec_parse", + "git_refspec_rtransform", + "git_refspec_src", + "git_refspec_src_matches", + "git_refspec_src_matches_negative", + "git_refspec_string", + "git_refspec_transform" + ] + ], + [ + "remote", + [ + "git_remote_add_fetch", + "git_remote_add_push", + "git_remote_autotag", + "git_remote_connect", + "git_remote_connect_ext", + "git_remote_connect_options_init", + "git_remote_connected", + "git_remote_create", + "git_remote_create_anonymous", + "git_remote_create_detached", + "git_remote_create_options_init", + "git_remote_create_with_fetchspec", + "git_remote_create_with_opts", + "git_remote_default_branch", + "git_remote_delete", + "git_remote_disconnect", + "git_remote_download", + "git_remote_dup", + "git_remote_fetch", + "git_remote_free", + "git_remote_get_fetch_refspecs", + "git_remote_get_push_refspecs", + "git_remote_get_refspec", + "git_remote_init_callbacks", + "git_remote_is_valid_name", + "git_remote_list", + "git_remote_lookup", + "git_remote_ls", + "git_remote_name", + "git_remote_name_is_valid", + "git_remote_owner", + "git_remote_prune", + "git_remote_prune_refs", + "git_remote_push", + "git_remote_pushurl", + "git_remote_refspec_count", + "git_remote_rename", + "git_remote_set_autotag", + "git_remote_set_instance_pushurl", + "git_remote_set_instance_url", + "git_remote_set_pushurl", + "git_remote_set_url", + "git_remote_stats", + "git_remote_stop", + "git_remote_update_tips", + "git_remote_upload", + "git_remote_url" + ] + ], + [ + "repository", + [ + "git_repository_commit_parents", + "git_repository_commondir", + "git_repository_config", + "git_repository_config_snapshot", + "git_repository_detach_head", + "git_repository_discover", + "git_repository_fetchhead_foreach", + "git_repository_free", + "git_repository_get_namespace", + "git_repository_hashfile", + "git_repository_head", + "git_repository_head_detached", + "git_repository_head_detached_for_worktree", + "git_repository_head_for_worktree", + "git_repository_head_unborn", + "git_repository_ident", + "git_repository_index", + "git_repository_init", + "git_repository_init_ext", + "git_repository_init_options_init", + "git_repository_is_bare", + "git_repository_is_empty", + "git_repository_is_shallow", + "git_repository_is_worktree", + "git_repository_item_path", + "git_repository_mergehead_foreach", + "git_repository_message", + "git_repository_message_remove", + "git_repository_odb", + "git_repository_oid_type", + "git_repository_open", + "git_repository_open_bare", + "git_repository_open_ext", + "git_repository_open_from_worktree", + "git_repository_path", + "git_repository_refdb", + "git_repository_set_head", + "git_repository_set_head_detached", + "git_repository_set_head_detached_from_annotated", + "git_repository_set_ident", + "git_repository_set_namespace", + "git_repository_set_workdir", + "git_repository_state", + "git_repository_state_cleanup", + "git_repository_workdir", + "git_repository_wrap_odb" + ] + ], + ["reset", ["git_reset", "git_reset_default", "git_reset_from_annotated"]], + ["revert", ["git_revert", "git_revert_commit", "git_revert_options_init"]], + ["revparse", ["git_revparse", "git_revparse_ext", "git_revparse_single"]], + [ + "revwalk", + [ + "git_revwalk_add_hide_cb", + "git_revwalk_free", + "git_revwalk_hide", + "git_revwalk_hide_glob", + "git_revwalk_hide_head", + "git_revwalk_hide_ref", + "git_revwalk_new", + "git_revwalk_next", + "git_revwalk_push", + "git_revwalk_push_glob", + "git_revwalk_push_head", + "git_revwalk_push_range", + "git_revwalk_push_ref", + "git_revwalk_repository", + "git_revwalk_reset", + "git_revwalk_simplify_first_parent", + "git_revwalk_sorting" + ] + ], + [ + "signature", + [ + "git_signature_default", + "git_signature_default_from_env", + "git_signature_dup", + "git_signature_free", + "git_signature_from_buffer", + "git_signature_new", + "git_signature_now" + ] + ], + [ + "stash", + [ + "git_stash_apply", + "git_stash_apply_options_init", + "git_stash_drop", + "git_stash_foreach", + "git_stash_pop", + "git_stash_save", + "git_stash_save_options_init", + "git_stash_save_with_opts" + ] + ], + [ + "status", + [ + "git_status_byindex", + "git_status_file", + "git_status_foreach", + "git_status_foreach_ext", + "git_status_list_entrycount", + "git_status_list_free", + "git_status_list_new", + "git_status_options_init", + "git_status_should_ignore" + ] + ], + [ + "strarray", + ["git_strarray_copy", "git_strarray_dispose", "git_strarray_free"] + ], + [ + "submodule", + [ + "git_submodule_add_finalize", + "git_submodule_add_setup", + "git_submodule_add_to_index", + "git_submodule_branch", + "git_submodule_clone", + "git_submodule_dup", + "git_submodule_fetch_recurse_submodules", + "git_submodule_foreach", + "git_submodule_free", + "git_submodule_head_id", + "git_submodule_ignore", + "git_submodule_index_id", + "git_submodule_init", + "git_submodule_location", + "git_submodule_lookup", + "git_submodule_name", + "git_submodule_open", + "git_submodule_owner", + "git_submodule_path", + "git_submodule_reload", + "git_submodule_repo_init", + "git_submodule_resolve_url", + "git_submodule_set_branch", + "git_submodule_set_fetch_recurse_submodules", + "git_submodule_set_ignore", + "git_submodule_set_update", + "git_submodule_set_url", + "git_submodule_status", + "git_submodule_sync", + "git_submodule_update", + "git_submodule_update_options_init", + "git_submodule_update_strategy", + "git_submodule_url", + "git_submodule_wd_id" + ] + ], + [ + "tag", + [ + "git_tag_annotation_create", + "git_tag_create", + "git_tag_create_from_buffer", + "git_tag_create_lightweight", + "git_tag_delete", + "git_tag_dup", + "git_tag_foreach", + "git_tag_free", + "git_tag_id", + "git_tag_list", + "git_tag_list_match", + "git_tag_lookup", + "git_tag_lookup_prefix", + "git_tag_message", + "git_tag_name", + "git_tag_name_is_valid", + "git_tag_owner", + "git_tag_peel", + "git_tag_tagger", + "git_tag_target", + "git_tag_target_id", + "git_tag_target_type" + ] + ], + ["trace", ["git_trace_set"]], + [ + "transaction", + [ + "git_transaction_commit", + "git_transaction_free", + "git_transaction_lock_ref", + "git_transaction_new", + "git_transaction_remove", + "git_transaction_set_reflog", + "git_transaction_set_symbolic_target", + "git_transaction_set_target" + ] + ], + [ + "tree", + [ + "git_tree_create_updated", + "git_tree_dup", + "git_tree_entry_byid", + "git_tree_entry_byindex", + "git_tree_entry_byname", + "git_tree_entry_bypath", + "git_tree_entry_cmp", + "git_tree_entry_dup", + "git_tree_entry_filemode", + "git_tree_entry_filemode_raw", + "git_tree_entry_free", + "git_tree_entry_id", + "git_tree_entry_name", + "git_tree_entry_to_object", + "git_tree_entry_type", + "git_tree_entrycount", + "git_tree_free", + "git_tree_id", + "git_tree_lookup", + "git_tree_lookup_prefix", + "git_tree_owner", + "git_tree_walk" + ] + ], + [ + "treebuilder", + [ + "git_treebuilder_clear", + "git_treebuilder_entrycount", + "git_treebuilder_filter", + "git_treebuilder_free", + "git_treebuilder_get", + "git_treebuilder_insert", + "git_treebuilder_new", + "git_treebuilder_remove", + "git_treebuilder_write", + "git_treebuilder_write_with_buffer" + ] + ], + [ + "worktree", + [ + "git_worktree_add", + "git_worktree_add_options_init", + "git_worktree_free", + "git_worktree_is_locked", + "git_worktree_is_prunable", + "git_worktree_list", + "git_worktree_lock", + "git_worktree_lookup", + "git_worktree_name", + "git_worktree_open_from_repository", + "git_worktree_path", + "git_worktree_prune", + "git_worktree_prune_options_init", + "git_worktree_unlock", + "git_worktree_validate" + ] + ] + ], + "examples": [ + ["add.c", "ex/v1.9.1/add.html"], + ["args.c", "ex/v1.9.1/args.html"], + ["blame.c", "ex/v1.9.1/blame.html"], + ["cat-file.c", "ex/v1.9.1/cat-file.html"], + ["checkout.c", "ex/v1.9.1/checkout.html"], + ["clone.c", "ex/v1.9.1/clone.html"], + ["commit.c", "ex/v1.9.1/commit.html"], + ["common.c", "ex/v1.9.1/common.html"], + ["config.c", "ex/v1.9.1/config.html"], + ["describe.c", "ex/v1.9.1/describe.html"], + ["diff.c", "ex/v1.9.1/diff.html"], + ["fetch.c", "ex/v1.9.1/fetch.html"], + ["for-each-ref.c", "ex/v1.9.1/for-each-ref.html"], + ["general.c", "ex/v1.9.1/general.html"], + ["index-pack.c", "ex/v1.9.1/index-pack.html"], + ["init.c", "ex/v1.9.1/init.html"], + ["lg2.c", "ex/v1.9.1/lg2.html"], + ["log.c", "ex/v1.9.1/log.html"], + ["ls-files.c", "ex/v1.9.1/ls-files.html"], + ["ls-remote.c", "ex/v1.9.1/ls-remote.html"], + ["merge.c", "ex/v1.9.1/merge.html"], + ["push.c", "ex/v1.9.1/push.html"], + ["remote.c", "ex/v1.9.1/remote.html"], + ["rev-list.c", "ex/v1.9.1/rev-list.html"], + ["rev-parse.c", "ex/v1.9.1/rev-parse.html"], + ["show-index.c", "ex/v1.9.1/show-index.html"], + ["stash.c", "ex/v1.9.1/stash.html"], + ["status.c", "ex/v1.9.1/status.html"], + ["tag.c", "ex/v1.9.1/tag.html"] + ] +} diff --git a/generate/input/libgit2-supplement.json b/generate/input/libgit2-supplement.json index cc44aee94c..12ee8945b6 100644 --- a/generate/input/libgit2-supplement.json +++ b/generate/input/libgit2-supplement.json @@ -1,7 +1,7 @@ { "types": { - "git_cred_default": { - "decl": "git_cred" + "git_credential_default": { + "decl": "git_credential" }, "git_diff_hunk": { "decl": [ @@ -83,104 +83,1431 @@ "git_note_iterator": { "decl": "git_iterator" }, - "git_tree_entry": { + "git_checkout_options": { + "decl": [ + "unsigned int version", + "unsigned int checkout_strategy", + "int disable_filters", + "unsigned int dir_mode", + "unsigned int file_mode", + "int file_open_flags", + "unsigned int notify_flags", + "git_checkout_notify_cb notify_cb", + "void * notify_payload", + "git_checkout_progress_cb progress_cb", + "void * progress_payload", + "git_strarray paths", + "git_tree * baseline", + "git_index * baseline_index", + "const char * target_directory", + "const char * ancestor_label", + "const char * our_label", + "const char * their_label", + "git_checkout_perfdata_cb perfdata_cb", + "void * perfdata_payload", + "git_strarray disabled_filters" + ], "fields": [ { - "name": "attr", - "type": "uint16_t" + "type": "unsigned int", + "name": "version", + "comments": " The version " }, { - "name": "oid", - "type": "git_oid" + "type": "unsigned int", + "name": "checkout_strategy", + "comments": " default will be a safe checkout " }, { - "name": "filename_len", - "type": "size_t" + "type": "int", + "name": "disable_filters", + "comments": " don't apply filters like CRLF conversion " }, { - "name": "filename", - "structType": "char", - "structName": "filename[1]", - "type": "char *" + "type": "unsigned int", + "name": "dir_mode", + "comments": " default is 0755 " + }, + { + "type": "unsigned int", + "name": "file_mode", + "comments": " default is 0644 or 0755 as dictated by blob " + }, + { + "type": "int", + "name": "file_open_flags", + "comments": " default is O_CREAT | O_TRUNC | O_WRONLY " + }, + { + "type": "unsigned int", + "name": "notify_flags", + "comments": " see `git_checkout_notify_t` above " + }, + { + "type": "git_checkout_notify_cb", + "name": "notify_cb", + "comments": " Optional callback to get notifications on specific file states.\n " + }, + { + "type": "void *", + "name": "notify_payload", + "comments": " Payload passed to notify_cb " + }, + { + "type": "git_checkout_progress_cb", + "name": "progress_cb", + "comments": " Optional callback to notify the consumer of checkout progress. " + }, + { + "type": "void *", + "name": "progress_payload", + "comments": " Payload passed to progress_cb " + }, + { + "type": "git_strarray", + "name": "paths", + "comments": " A list of wildmatch patterns or paths.\n\n By default, all paths are processed. If you pass an array of wildmatch\n patterns, those will be used to filter which paths should be taken into\n account.\n\n Use GIT_CHECKOUT_DISABLE_PATHSPEC_MATCH to treat as a simple list." + }, + { + "type": "git_tree *", + "name": "baseline", + "comments": " The expected content of the working directory; defaults to HEAD.\n\n If the working directory does not match this baseline information,\n that will produce a checkout conflict." + }, + { + "type": "git_index *", + "name": "baseline_index", + "comments": " Like `baseline` above, though expressed as an index. This\n option overrides `baseline`." + }, + { + "type": "const char *", + "name": "target_directory", + "comments": " alternative checkout path to workdir " + }, + { + "type": "const char *", + "name": "ancestor_label", + "comments": " the name of the common ancestor side of conflicts " + }, + { + "type": "const char *", + "name": "our_label", + "comments": " the name of the \"our\" side of conflicts " + }, + { + "type": "const char *", + "name": "their_label", + "comments": " the name of the \"their\" side of conflicts " + }, + { + "type": "git_checkout_perfdata_cb", + "name": "perfdata_cb", + "comments": " Optional callback to notify the consumer of performance data. " + }, + { + "type": "void *", + "name": "perfdata_payload", + "comments": " Payload passed to perfdata_cb " + }, + { + "type": "git_strarray", + "name": "disabled_filters", + "comments": " A list filters to disable during checkout." + } + ] + } + }, + "new": { + "functions": { + "git_libgit2_opts": { + "type": "function", + "isManual": true, + "cFile": "generate/templates/manual/libgit2/opts.cc", + "isAsync": false, + "isPrototypeMethod": false, + "group": "libgit2" + }, + "git_blame_file": { + "type": "function", + "file": "blame.h", + "args": [ + { + "name": "out", + "type": "git_blame **" + }, + { + "name": "repo", + "type": "git_repository *" + }, + { + "name": "path", + "type": "const char *" + }, + { + "name": "options", + "type": "git_blame_options *" + } + ], + "group": "blame", + "return": { + "type": "int", + "isErrorCode": true + } + }, + "git_clone": { + "isManual": true, + "cFile": "generate/templates/manual/clone/clone.cc", + "isAsync": true, + "isPrototypeMethod": false, + "group": "clone" + }, + "git_commit_extract_signature": { + "args": [ + { + "name": "signature", + "type": "git_buf" + }, + { + "name": "signed_data", + "type": "git_buf" + }, + { + "name": "repo", + "type": "git_repository *" + }, + { + "name": "commit_id", + "type": "git_oid *" + }, + { + "name": "field", + "type": "char *" + } + ], + "type": "function", + "isManual": true, + "cFile": "generate/templates/manual/commit/extract_signature.cc", + "isAsync": true, + "isPrototypeMethod": false, + "group": "commit", + "return": { + "type": "int", + "isErrorCode": true + } + }, + "git_email_create_from_diff": { + "file": "sys/email.h", + "type": "function", + "isAsync": true, + "group": "email", + "args": [ + { + "name": "out", + "type": "git_buf *" + }, + { + "name": "diff", + "type": "git_diff *" + }, + { + "name": "patch_idx", + "type": "size_t" + }, + { + "name": "patch_count", + "type": "size_t" + }, + { + "name": "commit_id", + "type": "const git_oid *" + }, + { + "name": "summary", + "type": "const char *" + }, + { + "name": "body", + "type": "const char *" + }, + { + "name": "author", + "type": "const git_signature *" + }, + { + "name": "opts", + "type": "git_email_create_options *" + } + ], + "return": { + "type": "int", + "isErrorCode": true + } + }, + "git_diff_get_perfdata": { + "file": "sys/diff.h", + "args": [ + { + "name": "out", + "type": "git_diff_perfdata *" + }, + { + "name": "diff", + "type": "const git_diff *" + } + ], + "return": { + "type": "int" + }, + "group": "diff" + }, + "git_filter_list_load": { + "isManual": true, + "cFile": "generate/templates/manual/filter_list/load.cc", + "isAsync": true, + "isPrototypeMethod": false, + "group": "filter_list" + }, + "git_filter_source_filemode": { + "type": "function", + "file": "sys/filter.h", + "args": [ + { + "name": "src", + "type": "const git_filter_source *" + } + ], + "return": { + "type": "uint16_t" + }, + "group": "filter_source" + }, + "git_filter_source_flags": { + "type": "function", + "file": "sys/filter.h", + "args": [ + { + "name": "src", + "type": "const git_filter_source *" + } + ], + "return": { + "type": "uint32_t" + }, + "group": "filter_source" + }, + "git_filter_source_id": { + "type": "function", + "file": "sys/filter.h", + "args": [ + { + "name": "src", + "type": "const git_filter_source *" + } + ], + "return": { + "type": "const git_oid *" + }, + "group": "filter_source" + }, + "git_filter_source_mode": { + "type": "function", + "file": "sys/filter.h", + "args": [ + { + "name": "src", + "type": "const git_filter_source *" + } + ], + "return": { + "type": "git_filter_mode_t" + }, + "group": "filter_source" + }, + "git_filter_source_path": { + "type": "function", + "file": "sys/filter.h", + "args": [ + { + "name": "src", + "type": "const git_filter_source *" + } + ], + "return": { + "type": "const char *" + }, + "group": "filter_source" + }, + "git_filter_source_repo": { + "args": [ + { + "name": "out", + "type": "git_repository **" + }, + { + "name": "src", + "type": "const git_filter_source *" + } + ], + "isManual": true, + "cFile": "generate/templates/manual/filter_source/repo.cc", + "isAsync": true, + "isPrototypeMethod": true, + "type": "function", + "group": "filter_source", + "return": { + "type": "int", + "isErrorCode": true + } + }, + "git_hashsig_compare": { + "type": "function", + "file": "sys/hashsig.h", + "args": [ + { + "name": "a", + "type": "const git_hashsig *" + }, + { + "name": "b", + "type": "const git_hashsig *" + } + ], + "return": { + "type": "int" + }, + "group": "hashsig" + }, + "git_hashsig_create": { + "type": "function", + "file": "sys/hashsig.h", + "args": [ + { + "name": "out", + "type": "git_hashsig **" + }, + { + "name": "buf", + "type": "const char *" + }, + { + "name": "buflen", + "type": "size_t" + }, + { + "name": "opts", + "type": "git_hashsig_option_t" + } + ], + "return": { + "type": "int" + }, + "group": "hashsig" + }, + "git_hashsig_create_fromfile": { + "type": "function", + "file": "sys/hashsig.h", + "args": [ + { + "name": "out", + "type": "git_hashsig **" + }, + { + "name": "path", + "type": "const char *" + }, + { + "name": "opts", + "type": "git_hashsig_option_t" + } + ], + "return": { + "type": "int" + }, + "group": "hashsig" + }, + "git_index_name_add": { + "type": "function", + "file": "sys/index.h", + "args": [ + { + "name": "index", + "type": "git_index *" + }, + { + "name": "ancestor", + "type": "const char *" + }, + { + "name": "ours", + "type": "const char *" + }, + { + "name": "theirs", + "type": "const char *" + } + ], + "return": { + "type": "int" + }, + "group": "index_name_entry" + }, + "git_index_name_clear": { + "type": "function", + "file": "sys/index.h", + "args": [ + { + "name": "index", + "type": "git_index *" + } + ], + "return": { + "type": "int" + }, + "group": "index_name_entry" + }, + "git_index_name_entrycount": { + "type": "function", + "file": "sys/index.h", + "args": [ + { + "name": "index", + "type": "git_index *" + } + ], + "return": { + "type": "size_t" + }, + "group": "index_name_entry" + }, + "git_index_name_get_byindex": { + "type": "function", + "file": "sys/index.h", + "args": [ + { + "name": "index", + "type": "git_index *" + }, + { + "name": "n", + "type": "size_t" + } + ], + "return": { + "type": "const git_index_name_entry *" + }, + "group": "index_name_entry" + }, + "git_index_reuc_add": { + "type": "function", + "file": "sys/index.h", + "args": [ + { + "name": "index", + "type": "git_index *" + }, + { + "name": "path", + "type": "const char *" + }, + { + "name": "ancestor_mode", + "type": "int" + }, + { + "name": "ancestor_id", + "type": "const git_oid *" + }, + { + "name": "our_mode", + "type": "int" + }, + { + "name": "our_id", + "type": "const git_oid *" + }, + { + "name": "their_mode", + "type": "int" + }, + { + "name": "their_id", + "type": "const git_oid *" + } + ], + "return": { + "type": "int" + }, + "group": "index_reuc_entry" + }, + "git_index_reuc_clear": { + "type": "function", + "file": "sys/index.h", + "args": [ + { + "name": "index", + "type": "git_index *" + } + ], + "return": { + "type": "int" + }, + "group": "index_reuc_entry" + }, + "git_index_reuc_entrycount": { + "type": "function", + "file": "sys/index.h", + "args": [ + { + "name": "index", + "type": "git_index *" + } + ], + "return": { + "type": "size_t" + }, + "group": "index_reuc_entry" + }, + "git_index_reuc_find": { + "type": "function", + "file": "sys/index.h", + "args": [ + { + "name": "at_pos", + "type": "size_t *" + }, + { + "name": "index", + "type": "git_index *" + }, + { + "name": "path", + "type": "const char *" + } + ], + "return": { + "type": "int" + }, + "group": "index_reuc_entry" + }, + "git_index_reuc_get_byindex": { + "type": "function", + "file": "sys/index.h", + "args": [ + { + "name": "index", + "type": "git_index *" + }, + { + "name": "n", + "type": "size_t" + } + ], + "return": { + "type": "const git_index_reuc_entry *" + }, + "group": "index_reuc_entry" + }, + "git_index_reuc_get_bypath": { + "type": "function", + "file": "sys/index.h", + "args": [ + { + "name": "index", + "type": "git_index *" + }, + { + "name": "path", + "type": "const char *" + } + ], + "return": { + "type": "const git_index_reuc_entry *" + }, + "group": "index_reuc_entry" + }, + "git_index_reuc_remove": { + "type": "function", + "file": "sys/index.h", + "args": [ + { + "name": "index", + "type": "git_index *" + }, + { + "name": "n", + "type": "size_t" + } + ], + "return": { + "type": "int" + }, + "group": "index_reuc_entry" + }, + "git_note_author": { + "type": "function", + "file": "note.h", + "args": [ + { + "name": "note", + "type": "const git_note *" + } + ], + "return": { + "type": "const git_signature *" + }, + "group": "note" + }, + "git_note_commit_create": { + "type": "function", + "file": "note.h", + "args": [ + { + "name": "notes_commit_out", + "type": "git_oid *" + }, + { + "name": "notes_blob_out", + "type": "git_oid *" + }, + { + "name": "repo", + "type": "git_repository *" + }, + { + "name": "parent", + "type": "git_commit *" + }, + { + "name": "author", + "type": "const git_signature *" + }, + { + "name": "committer", + "type": "const git_signature *" + }, + { + "name": "oid", + "type": "const git_oid *" + }, + { + "name": "note", + "type": "const char *" + }, + { + "name": "allow_note_overwrite", + "type": "int" + } + ], + "return": { + "type": "int" + }, + "group": "note" + }, + "git_note_commit_iterator_new": { + "type": "function", + "file": "note.h", + "args": [ + { + "name": "out", + "type": "git_note_iterator **" + }, + { + "name": "notes_commit", + "type": "git_commit *" + } + ], + "return": { + "type": "int" + }, + "group": "note" + }, + "git_note_commit_read": { + "type": "function", + "file": "note.h", + "args": [ + { + "name": "out", + "type": "git_note **" + }, + { + "name": "repo", + "type": "git_repository *" + }, + { + "name": "notes_commit", + "type": "git_commit *" + }, + { + "name": "oid", + "type": "const git_oid *" + } + ], + "return": { + "type": "int" + }, + "group": "note" + }, + "git_note_commit_remove": { + "type": "function", + "file": "note.h", + "args": [ + { + "name": "notes_commit_out", + "type": "git_oid *" + }, + { + "name": "repo", + "type": "git_repository *" + }, + { + "name": "notes_commit", + "type": "git_commit *" + }, + { + "name": "author", + "type": "const git_signature *" + }, + { + "name": "committer", + "type": "const git_signature *" + }, + { + "name": "oid", + "type": "const git_oid *" + } + ], + "return": { + "type": "int" + }, + "group": "note" + }, + "git_note_committer": { + "type": "function", + "file": "note.h", + "args": [ + { + "name": "note", + "type": "const git_note *" + } + ], + "return": { + "type": "const git_signature *" + }, + "group": "note" + }, + "git_note_create": { + "type": "function", + "file": "note.h", + "args": [ + { + "name": "out", + "type": "git_oid *" + }, + { + "name": "repo", + "type": "git_repository *" + }, + { + "name": "notes_ref", + "type": "const char *" + }, + { + "name": "author", + "type": "const git_signature *" + }, + { + "name": "committer", + "type": "const git_signature *" + }, + { + "name": "oid", + "type": "const git_oid *" + }, + { + "name": "note", + "type": "const char *" + }, + { + "name": "force", + "type": "int" + } + ], + "return": { + "type": "int" + }, + "group": "note" + }, + "git_note_default_ref": { + "type": "function", + "file": "note.h", + "args": [ + { + "name": "out", + "type": "git_buf *" + }, + { + "name": "repo", + "type": "git_repository *" + } + ], + "return": { + "type": "int" + }, + "group": "note" + }, + "git_note_foreach": { + "type": "function", + "file": "note.h", + "args": [ + { + "name": "repo", + "type": "git_repository *" + }, + { + "name": "notes_ref", + "type": "const char *" + }, + { + "name": "note_cb", + "type": "git_note_foreach_cb" + }, + { + "name": "payload", + "type": "void *" + } + ], + "return": { + "type": "int" + }, + "group": "note" + }, + "git_note_free": { + "type": "function", + "file": "note.h", + "args": [ + { + "name": "note", + "type": "git_note *" + } + ], + "return": { + "type": "void" + }, + "group": "note" + }, + "git_note_id": { + "type": "function", + "file": "note.h", + "args": [ + { + "name": "note", + "type": "const git_note *" + } + ], + "return": { + "type": "const git_oid *" + }, + "group": "note" + }, + "git_note_iterator_free": { + "type": "function", + "file": "note.h", + "args": [ + { + "name": "it", + "type": "git_note_iterator *" + } + ], + "return": { + "type": "void" + }, + "group": "note" + }, + "git_note_iterator_new": { + "type": "function", + "file": "note.h", + "args": [ + { + "name": "out", + "type": "git_note_iterator **" + }, + { + "name": "repo", + "type": "git_repository *" + }, + { + "name": "notes_ref", + "type": "const char *" + } + ], + "return": { + "type": "int" + }, + "group": "note" + }, + "git_note_message": { + "type": "function", + "file": "note.h", + "args": [ + { + "name": "note", + "type": "const git_note *" + } + ], + "return": { + "type": "const char *" + }, + "group": "note" + }, + "git_note_next": { + "type": "function", + "file": "note.h", + "args": [ + { + "name": "note_id", + "type": "git_oid *" + }, + { + "name": "annotated_id", + "type": "git_oid *" + }, + { + "name": "it", + "type": "git_note_iterator *" + } + ], + "return": { + "type": "int" + }, + "group": "note" + }, + "git_note_read": { + "type": "function", + "file": "note.h", + "args": [ + { + "name": "out", + "type": "git_note **" + }, + { + "name": "repo", + "type": "git_repository *" + }, + { + "name": "notes_ref", + "type": "const char *" + }, + { + "name": "oid", + "type": "const git_oid *" + } + ], + "return": { + "type": "int" + }, + "group": "note" + }, + "git_note_remove": { + "type": "function", + "file": "note.h", + "args": [ + { + "name": "repo", + "type": "git_repository *" + }, + { + "name": "notes_ref", + "type": "const char *" + }, + { + "name": "author", + "type": "const git_signature *" + }, + { + "name": "committer", + "type": "const git_signature *" + }, + { + "name": "oid", + "type": "const git_oid *" + } + ], + "return": { + "type": "int" + }, + "group": "note" + }, + "git_patch_convenient_from_diff": { + "args": [ + { + "name": "diff", + "type": "git_diff *" + }, + { + "name": "indexes", + "type": "std::vector" + }, + { + "name": "out", + "type": "std::vector *" + } + ], + "type": "function", + "isManual": true, + "cFile": "generate/templates/manual/patches/convenient_patches.cc", + "isAsync": true, + "isPrototypeMethod": false, + "group": "patch", + "return": { + "type": "int", + "isErrorCode": true + } + }, + "git_path_is_gitfile": { + "type": "function", + "file": "sys/path.h", + "args": [ + { + "name": "path", + "type": "const char *" + }, + { + "name": "pathlen", + "type": "size_t" + }, + { + "name": "gitfile", + "type": "git_path_gitfile" + }, + { + "name": "fs", + "type": "git_path_fs" + } + ], + "return": { + "type": "int" + }, + "group": "path" + }, + "git_remote_reference_list": { + "args": [ + { + "name": "out", + "type": "std::vector *" + }, + { + "name": "remote", + "type": "git_remote *" + } + ], + "type": "function", + "isManual": true, + "cFile": "generate/templates/manual/remote/ls.cc", + "isAsync": true, + "isPrototypeMethod": true, + "group": "remote", + "return": { + "type": "int", + "isErrorCode": true + } + }, + "git_repository__cleanup": { + "type": "function", + "file": "sys/repository.h", + "args": [ + { + "name": "repo", + "type": "git_repository *" + } + ], + "return": { + "type": "int" + }, + "group": "repository" + }, + "git_repository_get_references": { + "args": [ + { + "name": "out", + "type": "std::vector *" + }, + { + "name": "repo", + "type": "git_repository *" + } + ], + "type": "function", + "isManual": true, + "cFile": "generate/templates/manual/repository/get_references.cc", + "isAsync": true, + "isPrototypeMethod": true, + "group": "repository", + "return": { + "type": "int", + "isErrorCode": true + } + }, + "git_repository_get_submodules": { + "args": [ + { + "name": "out", + "type": "std::vector *" + }, + { + "name": "repo", + "type": "git_repository *" + } + ], + "type": "function", + "isManual": true, + "cFile": "generate/templates/manual/repository/get_submodules.cc", + "isAsync": true, + "isPrototypeMethod": true, + "group": "repository", + "return": { + "type": "int", + "isErrorCode": true + } + }, + "git_repository_get_remotes": { + "args": [ + { + "name": "out", + "type": "std::vector *" + }, + { + "name": "repo", + "type": "git_repository *" + } + ], + "type": "function", + "isManual": true, + "cFile": "generate/templates/manual/repository/get_remotes.cc", + "isAsync": true, + "isPrototypeMethod": true, + "group": "repository", + "return": { + "type": "int", + "isErrorCode": true + } + }, + "git_repository_refresh_references": { + "args": [ + { + "name": "out", + "type": "void *" + }, + { + "name": "repo", + "type": "git_repository *" + } + ], + "type": "function", + "isManual": true, + "cFile": "generate/templates/manual/repository/refresh_references.cc", + "isAsync": true, + "isPrototypeMethod": true, + "group": "repository", + "return": { + "type": "int", + "isErrorCode": true } - ] - } - }, - "new" : { - "functions": { - "git_rebase_next": { + }, + "git_repository_set_index": { "type": "function", - "file": "rebase.h", + "file": "sys/repository.h", + "args": [ + { + "name": "repo", + "type": "git_repository *" + }, + { + "name": "index", + "type": "git_index *" + } + ], + "return": { + "type": "int" + }, + "group": "repository" + }, + "git_repository_statistics": { "args": [ { "name": "out", - "type": "git_rebase_operation **" + "type": "void *" }, { - "name": "rebase", - "type": "git_rebase *" + "name": "repo", + "type": "git_repository *" + } + ], + "type": "function", + "isManual": true, + "cFile": "generate/templates/manual/repository/statistics.cc", + "isAsync": true, + "isPrototypeMethod": true, + "group": "repository", + "return": { + "type": "int", + "isErrorCode": true + } + }, + "git_repository_submodule_cache_all": { + "type": "function", + "file": "sys/repository.h", + "args": [ + { + "name": "repo", + "type": "git_repository *" } ], "return": { "type": "int" }, - "group": "rebase" + "group": "repository" }, - "git_reset": { + "git_repository_submodule_cache_clear": { "type": "function", - "file": "reset.h", + "file": "sys/repository.h", "args": [ { "name": "repo", "type": "git_repository *" + } + ], + "return": { + "type": "int" + }, + "group": "repository" + }, + "git_revwalk_commit_walk": { + "args": [ + { + "name": "max_count", + "type": "int" }, { - "name": "target", - "type": "git_object *" + "name": "out", + "type": "void *" }, { - "name": "reset_type", - "type": "git_reset_t" + "name": "returnPlainObjects", + "type": "bool" }, { - "name": "checkout_opts", - "type": "git_checkout_options *" + "name": "walk", + "type": "git_revwalk *" } ], + "type": "function", + "isManual": true, + "cFile": "generate/templates/manual/revwalk/commit_walk.cc", + "isAsync": true, + "isPrototypeMethod": true, + "group": "revwalk", "return": { - "type": "int" - }, - "group": "reset" + "type": "int", + "isErrorCode": true + } }, - "git_stash_save": { - "type": "function", - "file": "stash.h", + "git_revwalk_fast_walk": { "args": [ { - "name": "out", - "type": "git_oid *" + "name": "max_count", + "type": "int" }, { - "name": "repo", - "type": "git_repository *" + "name": "out", + "type": "std::vector *" }, { - "name": "stasher", - "type": "const git_signature *" - }, + "name": "walk", + "type": "git_revwalk *" + } + ], + "type": "function", + "isManual": true, + "cFile": "generate/templates/manual/revwalk/fast_walk.cc", + "isAsync": true, + "isPrototypeMethod": true, + "group": "revwalk", + "return": { + "type": "int", + "isErrorCode": true + } + }, + "git_revwalk_file_history_walk": { + "args": [ { - "name": "message", + "name": "file_path", "type": "const char *" }, { - "name": "flags", + "name": "max_count", "type": "unsigned int" + }, + { + "name": "out", + "type": "std::vector *" + }, + { + "name": "walk", + "type": "git_revwalk *" + } + ], + "type": "function", + "isManual": true, + "cFile": "generate/templates/manual/revwalk/file_history_walk.cc", + "isAsync": true, + "isPrototypeMethod": true, + "group": "revwalk", + "return": { + "type": "int", + "isErrorCode": true + } + }, + "git_status_list_get_perfdata": { + "file": "sys/diff.h", + "args": [ + { + "name": "out", + "type": "git_diff_perfdata *" + }, + { + "name": "status", + "type": "const git_status_list *" } ], "return": { "type": "int" }, - "group": "stash" + "group": "status_list" + }, + "git_tree_get_all_filepaths": { + "args": [ + { + "name": "tree", + "type": "git_tree *" + }, + { + "name": "repo", + "type": "git_repository *" + }, + { + "name": "out", + "type": "std::vector *" + } + ], + "type": "function", + "isManual": true, + "cFile": "generate/templates/manual/tree/get_all_filepaths.cc", + "isAsync": true, + "isPrototypeMethod": true, + "group": "tree", + "return": { + "type": "int", + "isErrorCode": true + } } }, "groups": [ @@ -192,7 +1519,106 @@ "git_annotated_commit_from_ref", "git_annotated_commit_from_revspec", "git_annotated_commit_id", - "git_annotated_commit_lookup" + "git_annotated_commit_lookup", + "git_annotated_commit_ref" + ] + ], + [ + "config_iterator", + [ + "git_config_iterator_free", + "git_config_iterator_new", + "git_config_iterator_glob_new", + "git_config_multivar_iterator_new", + "git_config_next" + ] + ], + [ + "diff", + [ + "git_diff_get_perfdata" + ] + ], + [ + "diff_stats", + [ + "git_diff_stats_files_changed", + "git_diff_stats_insertions", + "git_diff_stats_deletions", + "git_diff_stats_to_buf", + "git_diff_stats_free" + ] + ], + [ + "filter_list", + [ + "git_filter_list_apply_to_blob", + "git_filter_list_apply_to_data", + "git_filter_list_apply_to_file", + "git_filter_list_free", + "git_filter_list_load" + ] + ], + [ + "filter_source", + [ + "git_filter_source_repo", + "git_filter_source_path", + "git_filter_source_filemode", + "git_filter_source_id", + "git_filter_source_mode", + "git_filter_source_flags" + ] + ], + [ + "hashsig", + [ + "git_hashsig_compare", + "git_hashsig_create", + "git_hashsig_create_fromfile" + ] + ], + [ + "index_conflict_iterator", + [ + "git_index_conflict_iterator_free", + "git_index_conflict_iterator_new", + "git_index_conflict_next" + ] + ], + [ + "index_iterator", + [ + "git_index_iterator_free", + "git_index_iterator_new", + "git_index_iterator_next" + ] + ], + [ + "index_name_entry", + [ + "git_index_name_add", + "git_index_name_clear", + "git_index_name_entrycount", + "git_index_name_get_byindex" + ] + ], + [ + "index_reuc_entry", + [ + "git_index_reuc_add", + "git_index_reuc_clear", + "git_index_reuc_entrycount", + "git_index_reuc_find", + "git_index_reuc_get_byindex", + "git_index_reuc_get_bypath", + "git_index_reuc_remove" + ] + ], + [ + "merge_file_result", + [ + "git_merge_file_result_free" ] ], [ @@ -206,6 +1632,83 @@ "git_odb_object_type" ] ], + [ + "odb_stream", + [ + "git_odb_stream_finalize_write", + "git_odb_stream_free", + "git_odb_stream_read", + "git_odb_stream_write" + ] + ], + [ + "oid_shorten", + [ + "git_oid_shorten_add", + "git_oid_shorten_free", + "git_oid_shorten_new" + ] + ], + [ + "patch", + [ + "git_patch_convenient_from_diff" + ] + ], + [ + "path", + [ + "git_path_is_gitfile" + ] + ], + [ + "pathspec_match_list", + [ + "git_pathspec_match_list_diff_entry", + "git_pathspec_match_list_entry", + "git_pathspec_match_list_entrycount", + "git_pathspec_match_list_failed_entry", + "git_pathspec_match_list_failed_entrycount", + "git_pathspec_match_list_free" + ] + ], + [ + "reflog_entry", + [ + "git_reflog_entry_committer", + "git_reflog_entry_id_new", + "git_reflog_entry_id_old", + "git_reflog_entry_message" + ] + ], + [ + "remote", + [ + "git_remote_reference_list" + ] + ], + [ + "repository", + [ + "git_repository__cleanup", + "git_repository_get_references", + "git_repository_get_submodules", + "git_repository_get_remotes", + "git_repository_refresh_references", + "git_repository_set_index", + "git_repository_statistics", + "git_repository_submodule_cache_all", + "git_repository_submodule_cache_clear" + ] + ], + [ + "revwalk", + [ + "git_revwalk_commit_walk", + "git_revwalk_fast_walk", + "git_revwalk_file_history_walk" + ] + ], [ "status_list", [ @@ -214,53 +1717,167 @@ "git_status_list_get_perfdata", "git_status_list_new" ] + ], + [ + "tree", + [ + "git_tree_get_all_filepaths" + ] + ], + [ + "tree_entry", + [ + "git_tree_entry_filemode", + "git_tree_entry_filemode_raw", + "git_tree_entry_free", + "git_tree_entry_id", + "git_tree_entry_name", + "git_tree_entry_to_object", + "git_tree_entry_type" + ] ] ], "types": [ [ - "git_stash_apply_progress_t", + "git_apply_options", + { + "type": "struct", + "fields": [ + { + "type": "unsigned int", + "name": "version" + }, + { + "type": "git_apply_delta_cb", + "name": "delta_cb" + }, + { + "type": "git_apply_hunk_cb", + "name": "hunk_cb" + }, + { + "type": "void *", + "name": "payload" + } + ], + "used": { + "needs": [ + "git_apply_init_options" + ] + } + } + ], + [ + "git_blame_hunk", + { + "type": "struct", + "fields": [ + { + "name": "lines_in_hunk", + "type": "int" + }, + { + "name": "final_commit_id", + "type": "git_oid" + }, + { + "name": "final_start_line_number", + "type": "size_t" + }, + { + "name": "final_signature", + "type": "git_signature *" + }, + { + "name": "final_committer", + "type": "git_signature *" + }, + { + "name": "orig_commit_id", + "type": "git_oid" + }, + { + "name": "orig_path", + "type": "const char *" + }, + { + "name": "orig_start_line_number", + "type": "size_t" + }, + { + "name": "orig_signature", + "type": "git_signature *" + }, + { + "name": "orig_committer", + "type": "git_signature *" + }, + { + "name": "summary", + "type": "const char *" + }, + { + "name": "boundary", + "type": "char" + } + ] + } + ], + [ + "git_blob_filter_options", + { + "type": "struct", + "fields": [ + { + "name": "version", + "type": "int" + }, + { + "name": "flags", + "type": "uint32_t" + } + ] + } + ], + [ + "git_cert_ssh_raw_type_t", { "type": "enum", "fields": [ { - "type": "int", - "name": "GIT_STASH_APPLY_PROGRESS_NONE", + "type": "uint32_t", + "name": "GIT_CERT_SSH_RAW_TYPE_UNKNOWN", "value": 0 }, - { - "type": "int", - "name": "GIT_STASH_APPLY_PROGRESS_LOADING_STASH", + { + "type": "uint32_t", + "name": "GIT_CERT_SSH_RAW_TYPE_RSA", "value": 1 }, { - "type": "int", - "name": "GIT_STASH_APPLY_PROGRESS_ANALYZE_INDEX", + "type": "uint32_t", + "name": "GIT_CERT_SSH_RAW_TYPE_DSS", "value": 2 }, { - "type": "int", - "name": "GIT_STASH_APPLY_PROGRESS_ANALYZE_MODIFIED", + "type": "uint32_t", + "name": "GIT_CERT_SSH_RAW_TYPE_KEY_ECDSA_256", "value": 3 }, { - "type": "int", - "name": "GIT_STASH_APPLY_PROGRESS_ANALYZE_UNTRACKED", + "type": "uint32_t", + "name": "GIT_CERT_SSH_RAW_TYPE_KEY_ECDSA_384", "value": 4 }, { - "type": "int", - "name": "GIT_STASH_APPLY_PROGRESS_CHECKOUT_UNTRACKED", + "type": "uint32_t", + "name": "GIT_CERT_SSH_RAW_TYPE_KEY_ECDSA_521", "value": 5 }, { - "type": "int", - "name": "GIT_STASH_APPLY_PROGRESS_CHECKOUT_MODIFIED", + "type": "uint32_t", + "name": "GIT_CERT_SSH_RAW_TYPE_KEY_ED25519", "value": 6 - }, - { - "type": "int", - "name": "GIT_STASH_APPLY_PROGRESS_DONE", - "value": 7 } ] } @@ -289,6 +1906,127 @@ ] } ], + [ + "git_commit_create_options", + { + "decl": [ + "unsigned int version", + "unsigned int allow_empty_commit : 1", + "const git_signature *author", + "const git_signature *committer", + "const char *message_encoding" + ], + "fields": [ + { + "name": "version", + "type": "unsigned int" + }, + { + "name": "allow_empty_commit", + "type": "unsigned int" + }, + { + "name": "author", + "type": "const git_signature *" + }, + { + "name": "committer", + "type": "const git_signature *" + }, + { + "name": "message_encoding", + "type": "const char *" + } + ] + } + ], + [ + "git_describe_format_options", + { + "type": "struct", + "fields": [ + { + "type": "unsigned int", + "name": "version" + }, + { + "type": "unsigned int", + "name": "abbreviated_size" + }, + { + "type": "int", + "name": "always_use_long_format" + }, + { + "type": "const char *", + "name": "dirty_suffix" + } + ], + "used": { + "needs": [ + "git_describe_init_format_options" + ] + } + } + ], + [ + "git_describe_options", + { + "type": "struct", + "fields": [ + { + "type": "unsigned int", + "name": "version" + }, + { + "type": "unsigned int", + "name": "max_candidates_tags" + }, + { + "type": "unsigned int", + "name": "describe_strategy" + }, + { + "type": "const char *", + "name": "pattern" + }, + { + "type": "int", + "name": "only_follow_first_parent" + }, + { + "type": "int", + "name": "show_commit_oid_as_fallback" + } + ], + "used": { + "needs": [ + "git_describe_init_options" + ] + } + } + ], + [ + "git_diff_perfdata", + { + "type": "struct", + "fields": [ + { + "type": "unsigned int", + "name": "version", + "ignore": true + }, + { + "type": "size_t", + "name": "stat_calls" + }, + { + "type": "size_t", + "name": "oid_calculations" + } + ] + } + ], [ "git_filter", { @@ -304,58 +2042,208 @@ }, { "type": "git_filter_init_fn", - "name": "initialize", - "ignore": true + "name": "initialize" }, { "type": "git_filter_shutdown_fn", - "name": "shutdown", - "ignore": true + "name": "shutdown" }, { "type": "git_filter_check_fn", - "name": "check", - "ignore": true + "name": "check" }, { "type": "git_filter_apply_fn", - "name": "apply", - "ignore": true + "name": "apply" }, { - "type": "git_filter_stream_fn", - "name": "stream", - "ignore": true + "type": "git_filter_cleanup_fn", + "name": "cleanup" + } + ] + } + ], + [ + "git_fetch_options", + { + "type": "struct", + "fields": [ + { + "name": "version", + "type": "int" }, { - "type": "git_filter_cleanup_fn", - "name": "cleanup", - "ignore": true + "name": "callbacks", + "type": "git_remote_callbacks" + }, + { + "name": "prune", + "type": "git_fetch_prune_t" + }, + { + "name": "proxy_opts", + "type": "git_proxy_options" + }, + { + "name": "update_fetchhead", + "type": "int" + }, + { + "name": "download_tags", + "type": "git_remote_autotag_option_t" + }, + { + "name": "custom_headers", + "type": "git_strarray" + } + ], + "used": { + "needs": [ + "git_fetch_init_options", + "git_remote_init_callbacks" + ] + } + } + ], + [ + "git_fetch_prune_t", + { + "type": "enum", + "fields": [ + { + "type": "int", + "name": "git_fetch_prune_unspecified", + "value": 0 + }, + { + "type": "int", + "name": "git_fetch_prune", + "value": 1 + }, + { + "type": "int", + "name": "git_fetch_no_prune", + "value": 2 + } + ] + } + ], + [ + "git_hashsig", + { + "type": "struct", + "fields": [] + } + ], + [ + "git_index_name_entry", + { + "type": "struct", + "fields": [ + { + "type": "char *", + "name": "ancestor" + }, + { + "type": "char *", + "name": "ours" + }, + { + "type": "char *", + "name": "theirs" } ] } ], [ - "git_status_entry", + "git_index_reuc_entry", { + "type": "struct", "fields": [ { - "type": "git_status_t", - "name": "status" + "type": "uint32_t [3]", + "name": "mode" }, { - "type": "git_diff_delta *", - "name": "head_to_index" + "type": "git_oid [3]", + "name": "oid" }, { - "type": "git_diff_delta *", - "name": "index_to_workdir" + "type": "char *", + "name": "path" } ] } ], [ - "git_diff_perfdata", + "git_off_t", + { + "type": "enum" + } + ], + [ + "git_remote_autotag_option_t", + { + "type": "enum" + } + ], + [ + "git_remote_callbacks", + { + "type": "struct", + "fields": [ + { + "type": "unsigned int", + "name": "version" + }, + { + "type": "git_transport_message_cb", + "name": "sideband_progress" + }, + { + "type": "git_credential_acquire_cb", + "name": "credentials" + }, + { + "type": "git_transport_certificate_check_cb", + "name": "certificate_check" + }, + { + "type": "git_indexer_progress_cb", + "name": "transfer_progress" + }, + { + "type": "git_push_transfer_progress_cb", + "name": "push_transfer_progress", + "isCallback": true + }, + { + "type": "git_transport_cb", + "name": "transport", + "ignore": true + }, + { + "type": "git_push_update_reference_cb", + "name": "push_update_reference" + }, + { + "type": "void *", + "name": "payload" + }, + { + "type": "git_url_resolve_cb", + "name": "resolve_url" + } + ], + "used": { + "needs": [ + "git_remote_init_callbacks" + ] + } + } + ], + [ + "git_remote_create_options", { "type": "struct", "fields": [ @@ -364,123 +2252,135 @@ "name": "version" }, { - "type": "size_t", - "name": "stat_calls" + "type": "git_repository *", + "name": "repository" }, { - "type": "size_t", - "name": "oid_calculations" + "type": "const char *", + "name": "name" + }, + { + "type": "const char *", + "name": "fetchspec" + }, + { + "type": "unsigned int", + "name": "flags" } - ] + ], + "used": { + "needs": [ + "git_remote_create_init_options" + ] + } } ], [ - "git_fetch_options", + "git_remote_head", { - "type": "struct", + "types": "struct", "fields": [ { - "name": "version", - "type": "int" + "type": "int", + "name": "local" }, { - "name": "callbacks", - "type": "git_remote_callbacks" + "type": "git_oid", + "name": "oid" }, { - "name": "prune", - "type": "git_fetch_prune_t" + "type": "git_oid", + "name": "loid" }, { - "name": "update_fetchhead", - "type": "int" + "type": "char *", + "name": "name" }, { - "name": "download_tags", - "type": "git_remote_autotag_option_t" + "type": "char *", + "name": "symref_target" } ], "used": { "needs": [ - "git_fetch_init_options", - "git_remote_init_callbacks" + "git_remote_reference_list" ] } } ], [ - "git_fetch_prune_t", + "git_path_gitfile", { "type": "enum", "fields": [ { "type": "int", - "name": "git_fetch_prune_unspecified", + "name": "GIT_PATH_GITFILE_GITIGNORE", "value": 0 }, { "type": "int", - "name": "git_fetch_prune", + "name": "GIT_PATH_GITFILE_GITMODULES", "value": 1 }, { "type": "int", - "name": "git_fetch_no_prune", - "value": 2 + "name": "GIT_PATH_GITFILE_GITATTRIBUTES", + "value": 1 } ] } ], [ - "git_merge_options", + "git_stash_apply_progress_t", { - "type": "struct", + "type": "enum", "fields": [ { - "type": "unsigned int", - "name": "version" + "type": "int", + "name": "GIT_STASH_APPLY_PROGRESS_NONE", + "value": 0 }, { - "type": "git_merge_tree_flag_t", - "name": "tree_flags" + "type": "int", + "name": "GIT_STASH_APPLY_PROGRESS_LOADING_STASH", + "value": 1 }, { - "type": "unsigned int", - "name": "rename_threshold" + "type": "int", + "name": "GIT_STASH_APPLY_PROGRESS_ANALYZE_INDEX", + "value": 2 }, { - "type": "unsigned int", - "name": "target_limit" + "type": "int", + "name": "GIT_STASH_APPLY_PROGRESS_ANALYZE_MODIFIED", + "value": 3 }, { - "type": "git_diff_similarity_metric *", - "name": "metric", - "ignore": true + "type": "int", + "name": "GIT_STASH_APPLY_PROGRESS_ANALYZE_UNTRACKED", + "value": 4 }, { - "type": "git_merge_file_favor_t", - "name": "file_favor" + "type": "int", + "name": "GIT_STASH_APPLY_PROGRESS_CHECKOUT_UNTRACKED", + "value": 5 }, { - "type": "unsigned int", - "name": "file_flags" + "type": "int", + "name": "GIT_STASH_APPLY_PROGRESS_CHECKOUT_MODIFIED", + "value": 6 + }, + { + "type": "int", + "name": "GIT_STASH_APPLY_PROGRESS_DONE", + "value": 7 } - ], - "used": { - "needs": [ - "git_merge_init_options" - ] - } - } - ], - [ - "git_off_t", - { - "type": "enum" + ] } ], [ - "git_rebase_options", + "git_stash_apply_options", { "type": "struct", "fields": [ @@ -489,34 +2389,32 @@ "name": "version" }, { - "type": "int", - "name": "quiet" - }, - { - "type": "const char *", - "name": "rewrite_notes_ref" + "type": "uint32_t", + "name": "flags" }, { "type": "git_checkout_options", "name": "checkout_options" + }, + { + "type": "git_stash_apply_progress_cb", + "name": "progress_cb" + }, + { + "type": "void *", + "name": "progress_payload" } ], "used": { "needs": [ - "git_rebase_init_options", + "git_stash_apply_init_options", "git_checkout_init_options" ] } } ], [ - "git_remote_autotag_option_t", - { - "type": "enum" - } - ], - [ - "git_remote_callbacks", + "git_status_options", { "type": "struct", "fields": [ @@ -525,44 +2423,27 @@ "name": "version" }, { - "type": "git_transport_message_cb", - "name": "sideband_progress" - }, - { - "type": "git_cred_acquire_cb", - "name": "credentials" - }, - { - "type": "git_transport_certificate_check_cb", - "name": "certificate_check" - }, - { - "type": "git_transfer_progress_cb", - "name": "transfer_progress" + "type": "git_status_show_t", + "name": "show" }, { - "type": "git_transport_cb", - "name": "transport", - "ignore": true + "type": "git_status_opt_t", + "name": "flags" }, { - "type": "void *", - "name": "payload" + "type": "git_strarray", + "name": "pathspec" } ], "used": { "needs": [ - "git_remote_init_callbacks" + "git_status_init_options", + "git_status_foreach_ext", + "git_status_list_new" ] } } ], - [ - "git_time_t", - { - "type": "enum" - } - ], [ "git_trace_level_t", { @@ -570,7 +2451,7 @@ } ], [ - "git_status_options", + "git_worktree_add_options", { "type": "struct", "fields": [ @@ -579,29 +2460,19 @@ "name": "version" }, { - "type": "git_status_show_t", - "name": "show" - }, - { - "type": "git_status_opt_t", - "name": "flags" - }, - { - "type": "git_strarray", - "name": "pathspec" + "type": "int", + "name": "lock" } ], "used": { "needs": [ - "git_status_init_options", - "git_status_foreach_ext", - "git_status_list_new" + "git_worktree_add_options_init" ] } } ], [ - "git_diff_options", + "git_worktree_prune_options", { "type": "struct", "fields": [ @@ -612,90 +2483,36 @@ { "type": "uint32_t", "name": "flags" - }, - { - "type": "git_submodule_ignore_t", - "name": "ignore_submodules" - }, - { - "type": "git_strarray", - "name": "pathspec" - }, - { - "type": "git_diff_notify_cb", - "name": "notify_cb" - }, - { - "type": "void *", - "name": "notify_payload" - }, - { - "type": "uint32_t", - "name": "context_lines" - }, - { - "type": "uint32_t", - "name": "interhunk_lines" - }, - { - "type": "uint16_t", - "name": "id_abbrev" - }, - { - "type": "git_off_t", - "name": "max_size" - }, - { - "type": "const char *", - "name": "old_prefix" - }, - { - "type": "const char *", - "name": "new_prefix" } ], "used": { "needs": [ - "git_diff_init_options", - "git_diff_tree_to_workdir", - "git_diff_tree_to_workdirext", - "git_diff_tree_to_tree" + "git_worktree_prune_options_init" ] } } ], [ - "git_stash_apply_options", + "git_worktree_prune_t", { - "type": "struct", + "type": "enum", "fields": [ { "type": "unsigned int", - "name": "version" - }, - { - "type": "git_stash_apply_flags", - "name": "flags" - }, - { - "type": "git_checkout_options", - "name": "checkout_options" + "name": "git_worktree_prune_valid", + "value": 1 }, { - "type": "git_stash_apply_progress_cb", - "name": "progress_cb" + "type": "unsigned int", + "name": "git_worktree_prune_locked", + "value": 2 }, { - "type": "void *", - "name": "progress_payload" + "type": "unsigned int", + "name": "git_worktree_prune_working_tree", + "value": 4 } - ], - "used": { - "needs": [ - "git_stash_apply_init_options", - "git_checkout_init_options" - ] - } + ] } ] ] @@ -708,21 +2525,60 @@ "git_annotated_commit_from_ref", "git_annotated_commit_from_revspec", "git_annotated_commit_id", - "git_annotated_commit_lookup" + "git_annotated_commit_lookup", + "git_annotated_commit_ref" ] }, - "odb": { + "config": { "functions": [ - "git_odb_object_data", - "git_odb_object_dup", - "git_odb_object_free", - "git_odb_object_id", - "git_odb_object_size", - "git_odb_object_type" + "git_config_iterator_free", + "git_config_iterator_new", + "git_config_iterator_glob_new", + "git_config_multivar_iterator_new", + "git_config_next" + ] + }, + "diff": { + "functions": [ + "git_diff_stats_files_changed", + "git_diff_stats_insertions", + "git_diff_stats_deletions", + "git_diff_stats_to_buf", + "git_diff_stats_free" + ] + }, + "index": { + "functions": [ + "git_index_conflict_iterator_free", + "git_index_conflict_iterator_new", + "git_index_conflict_next", + "git_index_iterator_free", + "git_index_iterator_new", + "git_index_iterator_next", + "git_index_name_add", + "git_index_name_clear", + "git_index_name_entrycount", + "git_index_name_get_byindex", + "git_index_reuc_add", + "git_index_reuc_clear", + "git_index_reuc_entrycount", + "git_index_reuc_find", + "git_index_reuc_get_byindex", + "git_index_reuc_get_bypath", + "git_index_reuc_remove" ] }, "merge": { "functions": [ + "git_merge_driver_lookup", + "git_merge_driver_register", + "git_merge_driver_source_ancestor", + "git_merge_driver_source_file_options", + "git_merge_driver_source_ours", + "git_merge_driver_source_repo", + "git_merge_driver_source_theirs", + "git_merge_driver_unregister", + "git_merge_file_result_free", "git_merge_head_free", "git_merge_head_from_fetchhead", "git_merge_head_from_id", @@ -730,6 +2586,56 @@ "git_merge_head_id" ] }, + "message": { + "functions": [ + "git_message_trailer_array_free" + ] + }, + "odb": { + "functions": [ + "git_odb_backend_loose", + "git_odb_backend_malloc", + "git_odb_backend_one_pack", + "git_odb_backend_pack", + "git_odb_object_data", + "git_odb_object_dup", + "git_odb_object_free", + "git_odb_object_id", + "git_odb_object_size", + "git_odb_object_type", + "git_odb_stream_finalize_write", + "git_odb_stream_free", + "git_odb_stream_read", + "git_odb_stream_write" + ] + }, + "oid": { + "functions": [ + "git_oid_shorten_add", + "git_oid_shorten_free", + "git_oid_shorten_new" + ] + }, + "pathspec": { + "functions": [ + "git_pathspec_match_list_diff_entry", + "git_pathspec_match_list_entry", + "git_pathspec_match_list_entrycount", + "git_pathspec_match_list_failed_entry", + "git_pathspec_match_list_failed_entrycount", + "git_pathspec_match_list_free" + ] + }, + "reflog": { + "functions": [ + "git_reflog_entry__alloc", + "git_reflog_entry__free", + "git_reflog_entry_committer", + "git_reflog_entry_id_new", + "git_reflog_entry_id_old", + "git_reflog_entry_message" + ] + }, "status": { "functions": [ "git_status_list_entrycount", @@ -737,11 +2643,45 @@ "git_status_list_get_perfdata", "git_status_list_new" ] + }, + "tree": { + "functions": [ + "git_tree_entry_dup", + "git_tree_entry_filemode", + "git_tree_entry_filemode_raw", + "git_tree_entry_free", + "git_tree_entry_id", + "git_tree_entry_name", + "git_tree_entry_to_object", + "git_tree_entry_type" + ] } }, "groups": { - "stash": [ - "git_stash_save" + "blame": [ + "git_blame_file" + ], + "email": [ + "git_email_create_from_diff" + ], + "note": [ + "git_note_author", + "git_note_commit_create", + "git_note_commit_iterator_new", + "git_note_commit_read", + "git_note_commit_remove", + "git_note_committer", + "git_note_create", + "git_note_default_ref", + "git_note_foreach", + "git_note_free", + "git_note_id", + "git_note_iterator_free", + "git_note_iterator_new", + "git_note_message", + "git_note_next", + "git_note_read", + "git_note_remove" ] } -} +} \ No newline at end of file diff --git a/generate/input/v0.23.1.json b/generate/input/v0.23.1.json deleted file mode 100644 index d337ecc5ec..0000000000 --- a/generate/input/v0.23.1.json +++ /dev/null @@ -1 +0,0 @@ -{"files":[{"file":"annotated_commit.h","functions":["git_annotated_commit_from_ref","git_annotated_commit_from_fetchhead","git_annotated_commit_lookup","git_annotated_commit_from_revspec","git_annotated_commit_id","git_annotated_commit_free"],"meta":{},"lines":112},{"file":"attr.h","functions":["git_attr_value","git_attr_get","git_attr_get_many","git_attr_foreach","git_attr_cache_flush","git_attr_add_macro"],"meta":{},"lines":240},{"file":"blame.h","functions":["git_blame_init_options","git_blame_get_hunk_count","git_blame_get_hunk_byindex","git_blame_get_hunk_byline","git_blame_file","git_blame_buffer","git_blame_free"],"meta":{},"lines":207},{"file":"blob.h","functions":["git_blob_lookup","git_blob_lookup_prefix","git_blob_free","git_blob_id","git_blob_owner","git_blob_rawcontent","git_blob_rawsize","git_blob_filtered_content","git_blob_create_fromworkdir","git_blob_create_fromdisk","git_blob_create_fromchunks","git_blob_create_frombuffer","git_blob_is_binary"],"meta":{},"lines":217},{"file":"branch.h","functions":["git_branch_create","git_branch_create_from_annotated","git_branch_delete","git_branch_iterator_new","git_branch_next","git_branch_iterator_free","git_branch_move","git_branch_lookup","git_branch_name","git_branch_upstream","git_branch_set_upstream","git_branch_is_head"],"meta":{},"lines":246},{"file":"buffer.h","functions":["git_buf_free","git_buf_grow","git_buf_set","git_buf_is_binary","git_buf_contains_nul"],"meta":{},"lines":122},{"file":"checkout.h","functions":["git_checkout_notify_cb","git_checkout_progress_cb","git_checkout_perfdata_cb","git_checkout_init_options","git_checkout_head","git_checkout_index","git_checkout_tree"],"meta":{},"lines":354},{"file":"cherrypick.h","functions":["git_cherrypick_init_options","git_cherrypick_commit","git_cherrypick"],"meta":{},"lines":84},{"file":"clone.h","functions":["git_remote_create_cb","git_repository_create_cb","git_clone_init_options","git_clone"],"meta":{},"lines":203},{"file":"commit.h","functions":["git_commit_lookup","git_commit_lookup_prefix","git_commit_free","git_commit_id","git_commit_owner","git_commit_message_encoding","git_commit_message","git_commit_message_raw","git_commit_summary","git_commit_time","git_commit_time_offset","git_commit_committer","git_commit_author","git_commit_raw_header","git_commit_tree","git_commit_tree_id","git_commit_parentcount","git_commit_parent","git_commit_parent_id","git_commit_nth_gen_ancestor","git_commit_header_field","git_commit_create","git_commit_create_v","git_commit_amend"],"meta":{},"lines":364},{"file":"common.h","functions":["git_libgit2_version","git_libgit2_features","git_libgit2_opts"],"meta":{},"lines":245},{"file":"config.h","functions":["git_config_entry_free","git_config_find_global","git_config_find_xdg","git_config_find_system","git_config_open_default","git_config_new","git_config_add_file_ondisk","git_config_open_ondisk","git_config_open_level","git_config_open_global","git_config_snapshot","git_config_free","git_config_get_entry","git_config_get_int32","git_config_get_int64","git_config_get_bool","git_config_get_path","git_config_get_string","git_config_get_string_buf","git_config_get_multivar_foreach","git_config_multivar_iterator_new","git_config_next","git_config_iterator_free","git_config_set_int32","git_config_set_int64","git_config_set_bool","git_config_set_string","git_config_set_multivar","git_config_delete_entry","git_config_delete_multivar","git_config_foreach","git_config_iterator_new","git_config_iterator_glob_new","git_config_foreach_match","git_config_get_mapped","git_config_lookup_map_value","git_config_parse_bool","git_config_parse_int32","git_config_parse_int64","git_config_parse_path","git_config_backend_foreach_match"],"meta":{},"lines":689},{"file":"cred_helpers.h","functions":["git_cred_userpass"],"meta":{},"lines":48},{"file":"describe.h","functions":["git_describe_commit","git_describe_workdir","git_describe_format","git_describe_result_free"],"meta":{},"lines":158},{"file":"diff.h","functions":["git_diff_notify_cb","git_diff_init_options","git_diff_file_cb","git_diff_binary_cb","git_diff_hunk_cb","git_diff_line_cb","git_diff_find_init_options","git_diff_free","git_diff_tree_to_tree","git_diff_tree_to_index","git_diff_index_to_workdir","git_diff_tree_to_workdir","git_diff_tree_to_workdir_with_index","git_diff_merge","git_diff_find_similar","git_diff_num_deltas","git_diff_num_deltas_of_type","git_diff_get_delta","git_diff_is_sorted_icase","git_diff_foreach","git_diff_status_char","git_diff_print","git_diff_blobs","git_diff_blob_to_buffer","git_diff_buffers","git_diff_get_stats","git_diff_stats_files_changed","git_diff_stats_insertions","git_diff_stats_deletions","git_diff_stats_to_buf","git_diff_stats_free","git_diff_format_email","git_diff_commit_as_email","git_diff_format_email_init_options"],"meta":{},"lines":1301},{"file":"errors.h","functions":["giterr_last","giterr_clear","giterr_detach","giterr_set_str","giterr_set_oom"],"meta":{},"lines":159},{"file":"filter.h","functions":["git_filter_list_load","git_filter_list_contains","git_filter_list_apply_to_data","git_filter_list_apply_to_file","git_filter_list_apply_to_blob","git_filter_list_stream_data","git_filter_list_stream_file","git_filter_list_stream_blob","git_filter_list_free"],"meta":{},"lines":210},{"file":"global.h","functions":["git_libgit2_init","git_libgit2_shutdown"],"meta":{},"lines":39},{"file":"graph.h","functions":["git_graph_ahead_behind","git_graph_descendant_of"],"meta":{},"lines":51},{"file":"ignore.h","functions":["git_ignore_add_rule","git_ignore_clear_internal_rules","git_ignore_path_is_ignored"],"meta":{},"lines":74},{"file":"index.h","functions":["git_index_matched_path_cb","git_index_open","git_index_new","git_index_free","git_index_owner","git_index_caps","git_index_set_caps","git_index_read","git_index_write","git_index_path","git_index_checksum","git_index_read_tree","git_index_write_tree","git_index_write_tree_to","git_index_entrycount","git_index_clear","git_index_get_byindex","git_index_get_bypath","git_index_remove","git_index_remove_directory","git_index_add","git_index_entry_stage","git_index_entry_is_conflict","git_index_add_bypath","git_index_add_frombuffer","git_index_remove_bypath","git_index_add_all","git_index_remove_all","git_index_update_all","git_index_find","git_index_conflict_add","git_index_conflict_get","git_index_conflict_remove","git_index_conflict_cleanup","git_index_has_conflicts","git_index_conflict_iterator_new","git_index_conflict_next","git_index_conflict_iterator_free"],"meta":{},"lines":755},{"file":"indexer.h","functions":["git_indexer_new","git_indexer_append","git_indexer_commit","git_indexer_hash","git_indexer_free"],"meta":{},"lines":72},{"file":"merge.h","functions":["git_merge_file_init_input","git_merge_file_init_options","git_merge_init_options","git_merge_analysis","git_merge_base","git_merge_bases","git_merge_base_many","git_merge_bases_many","git_merge_base_octopus","git_merge_file","git_merge_file_from_index","git_merge_file_result_free","git_merge_trees","git_merge_commits","git_merge"],"meta":{},"lines":547},{"file":"message.h","functions":["git_message_prettify"],"meta":{},"lines":39},{"file":"net.h","functions":["git_headlist_cb"],"meta":{},"lines":55},{"file":"notes.h","functions":["git_note_foreach_cb","git_note_iterator_new","git_note_iterator_free","git_note_next","git_note_read","git_note_author","git_note_committer","git_note_message","git_note_id","git_note_create","git_note_remove","git_note_free","git_note_foreach"],"meta":{},"lines":213},{"file":"object.h","functions":["git_object_lookup","git_object_lookup_prefix","git_object_lookup_bypath","git_object_id","git_object_short_id","git_object_type","git_object_owner","git_object_free","git_object_type2string","git_object_string2type","git_object_typeisloose","git_object__size","git_object_peel","git_object_dup"],"meta":{},"lines":237},{"file":"odb.h","functions":["git_odb_foreach_cb","git_odb_new","git_odb_open","git_odb_add_disk_alternate","git_odb_free","git_odb_read","git_odb_read_prefix","git_odb_read_header","git_odb_exists","git_odb_exists_prefix","git_odb_refresh","git_odb_foreach","git_odb_write","git_odb_open_wstream","git_odb_stream_write","git_odb_stream_finalize_write","git_odb_stream_read","git_odb_stream_free","git_odb_open_rstream","git_odb_write_pack","git_odb_hash","git_odb_hashfile","git_odb_object_dup","git_odb_object_free","git_odb_object_id","git_odb_object_data","git_odb_object_size","git_odb_object_type","git_odb_add_backend","git_odb_add_alternate","git_odb_num_backends","git_odb_get_backend"],"meta":{},"lines":491},{"file":"odb_backend.h","functions":["git_odb_backend_pack","git_odb_backend_loose","git_odb_backend_one_pack"],"meta":{},"lines":130},{"file":"oid.h","functions":["git_oid_fromstr","git_oid_fromstrp","git_oid_fromstrn","git_oid_fromraw","git_oid_fmt","git_oid_nfmt","git_oid_pathfmt","git_oid_tostr_s","git_oid_tostr","git_oid_cpy","git_oid_cmp","git_oid_equal","git_oid_ncmp","git_oid_streq","git_oid_strcmp","git_oid_iszero","git_oid_shorten_new","git_oid_shorten_add","git_oid_shorten_free"],"meta":{},"lines":265},{"file":"oidarray.h","functions":["git_oidarray_free"],"meta":{},"lines":34},{"file":"pack.h","functions":["git_packbuilder_new","git_packbuilder_set_threads","git_packbuilder_insert","git_packbuilder_insert_tree","git_packbuilder_insert_commit","git_packbuilder_insert_walk","git_packbuilder_insert_recur","git_packbuilder_write","git_packbuilder_hash","git_packbuilder_foreach","git_packbuilder_object_count","git_packbuilder_written","git_packbuilder_progress","git_packbuilder_set_callbacks","git_packbuilder_free"],"meta":{},"lines":236},{"file":"patch.h","functions":["git_patch_from_diff","git_patch_from_blobs","git_patch_from_blob_and_buffer","git_patch_from_buffers","git_patch_free","git_patch_get_delta","git_patch_num_hunks","git_patch_line_stats","git_patch_get_hunk","git_patch_num_lines_in_hunk","git_patch_get_line_in_hunk","git_patch_size","git_patch_print","git_patch_to_buf"],"meta":{},"lines":268},{"file":"pathspec.h","functions":["git_pathspec_new","git_pathspec_free","git_pathspec_matches_path","git_pathspec_match_workdir","git_pathspec_match_index","git_pathspec_match_tree","git_pathspec_match_diff","git_pathspec_match_list_free","git_pathspec_match_list_entrycount","git_pathspec_match_list_entry","git_pathspec_match_list_diff_entry","git_pathspec_match_list_failed_entrycount","git_pathspec_match_list_failed_entry"],"meta":{},"lines":260},{"file":"rebase.h","functions":["git_rebase_init_options","git_rebase_init","git_rebase_open","git_rebase_operation_entrycount","git_rebase_operation_current","git_rebase_operation_byindex","git_rebase_next","git_rebase_commit","git_rebase_abort","git_rebase_finish","git_rebase_free"],"meta":{},"lines":286},{"file":"refdb.h","functions":["git_refdb_new","git_refdb_open","git_refdb_compress","git_refdb_free"],"meta":{},"lines":63},{"file":"reflog.h","functions":["git_reflog_read","git_reflog_write","git_reflog_append","git_reflog_rename","git_reflog_delete","git_reflog_entrycount","git_reflog_entry_byindex","git_reflog_drop","git_reflog_entry_id_old","git_reflog_entry_id_new","git_reflog_entry_committer","git_reflog_entry_message","git_reflog_free"],"meta":{},"lines":166},{"file":"refs.h","functions":["git_reference_lookup","git_reference_name_to_id","git_reference_dwim","git_reference_symbolic_create_matching","git_reference_symbolic_create","git_reference_create","git_reference_create_matching","git_reference_target","git_reference_target_peel","git_reference_symbolic_target","git_reference_type","git_reference_name","git_reference_resolve","git_reference_owner","git_reference_symbolic_set_target","git_reference_set_target","git_reference_rename","git_reference_delete","git_reference_remove","git_reference_list","git_reference_foreach","git_reference_foreach_name","git_reference_free","git_reference_cmp","git_reference_iterator_new","git_reference_iterator_glob_new","git_reference_next","git_reference_next_name","git_reference_iterator_free","git_reference_foreach_glob","git_reference_has_log","git_reference_ensure_log","git_reference_is_branch","git_reference_is_remote","git_reference_is_tag","git_reference_is_note","git_reference_normalize_name","git_reference_peel","git_reference_is_valid_name","git_reference_shorthand"],"meta":{},"lines":730},{"file":"refspec.h","functions":["git_refspec_src","git_refspec_dst","git_refspec_string","git_refspec_force","git_refspec_direction","git_refspec_src_matches","git_refspec_dst_matches","git_refspec_transform","git_refspec_rtransform"],"meta":{},"lines":100},{"file":"remote.h","functions":["git_remote_rename_problem_cb","git_remote_create","git_remote_create_with_fetchspec","git_remote_create_anonymous","git_remote_lookup","git_remote_dup","git_remote_owner","git_remote_name","git_remote_url","git_remote_pushurl","git_remote_set_url","git_remote_set_pushurl","git_remote_add_fetch","git_remote_get_fetch_refspecs","git_remote_add_push","git_remote_get_push_refspecs","git_remote_refspec_count","git_remote_get_refspec","git_remote_connect","git_remote_ls","git_remote_connected","git_remote_stop","git_remote_disconnect","git_remote_free","git_remote_list","git_push_transfer_progress","git_push_negotiation","git_remote_init_callbacks","git_fetch_init_options","git_push_init_options","git_remote_download","git_remote_upload","git_remote_update_tips","git_remote_fetch","git_remote_prune","git_remote_push","git_remote_stats","git_remote_autotag","git_remote_set_autotag","git_remote_prune_refs","git_remote_rename","git_remote_is_valid_name","git_remote_delete","git_remote_default_branch"],"meta":{},"lines":788},{"file":"repository.h","functions":["git_repository_open","git_repository_wrap_odb","git_repository_discover","git_repository_open_ext","git_repository_open_bare","git_repository_free","git_repository_init","git_repository_init_init_options","git_repository_init_ext","git_repository_head","git_repository_head_detached","git_repository_head_unborn","git_repository_is_empty","git_repository_path","git_repository_workdir","git_repository_set_workdir","git_repository_is_bare","git_repository_config","git_repository_config_snapshot","git_repository_odb","git_repository_refdb","git_repository_index","git_repository_message","git_repository_message_remove","git_repository_state_cleanup","git_repository_fetchhead_foreach","git_repository_mergehead_foreach","git_repository_hashfile","git_repository_set_head","git_repository_set_head_detached","git_repository_set_head_detached_from_annotated","git_repository_detach_head","git_repository_state","git_repository_set_namespace","git_repository_get_namespace","git_repository_is_shallow","git_repository_ident","git_repository_set_ident"],"meta":{},"lines":750},{"file":"reset.h","functions":["git_reset","git_reset_from_annotated","git_reset_default"],"meta":{},"lines":107},{"file":"revert.h","functions":["git_revert_init_options","git_revert_commit","git_revert"],"meta":{},"lines":84},{"file":"revparse.h","functions":["git_revparse_single","git_revparse_ext","git_revparse"],"meta":{},"lines":108},{"file":"revwalk.h","functions":["git_revwalk_new","git_revwalk_reset","git_revwalk_push","git_revwalk_push_glob","git_revwalk_push_head","git_revwalk_hide","git_revwalk_hide_glob","git_revwalk_hide_head","git_revwalk_push_ref","git_revwalk_hide_ref","git_revwalk_next","git_revwalk_sorting","git_revwalk_push_range","git_revwalk_simplify_first_parent","git_revwalk_free","git_revwalk_repository","git_revwalk_hide_cb","git_revwalk_add_hide_cb"],"meta":{},"lines":293},{"file":"signature.h","functions":["git_signature_new","git_signature_now","git_signature_default","git_signature_dup","git_signature_free"],"meta":{},"lines":86},{"file":"stash.h","functions":["git_stash_apply_progress_cb","git_stash_apply_init_options","git_stash_apply","git_stash_cb","git_stash_foreach","git_stash_drop","git_stash_pop"],"meta":{},"lines":253},{"file":"status.h","functions":["git_status_cb","git_status_init_options","git_status_foreach","git_status_foreach_ext","git_status_file","git_status_list_new","git_status_list_entrycount","git_status_byindex","git_status_list_free","git_status_should_ignore"],"meta":{},"lines":366},{"file":"strarray.h","functions":["git_strarray_free","git_strarray_copy"],"meta":{},"lines":53},{"file":"submodule.h","functions":["git_submodule_update_init_options","git_submodule_update","git_submodule_lookup","git_submodule_free","git_submodule_foreach","git_submodule_add_setup","git_submodule_add_finalize","git_submodule_add_to_index","git_submodule_owner","git_submodule_name","git_submodule_path","git_submodule_url","git_submodule_resolve_url","git_submodule_branch","git_submodule_set_branch","git_submodule_set_url","git_submodule_index_id","git_submodule_head_id","git_submodule_wd_id","git_submodule_ignore","git_submodule_set_ignore","git_submodule_update_strategy","git_submodule_set_update","git_submodule_fetch_recurse_submodules","git_submodule_set_fetch_recurse_submodules","git_submodule_init","git_submodule_repo_init","git_submodule_sync","git_submodule_open","git_submodule_reload","git_submodule_status","git_submodule_location"],"meta":{},"lines":622},{"file":"sys/commit.h","functions":["git_commit_create_from_ids","git_commit_create_from_callback"],"meta":{},"lines":76},{"file":"sys/config.h","functions":["git_config_init_backend","git_config_add_backend"],"meta":{},"lines":109},{"file":"sys/diff.h","functions":["git_diff_print_callback__to_buf","git_diff_print_callback__to_file_handle","git_diff_get_perfdata","git_status_list_get_perfdata"],"meta":{},"lines":90},{"file":"sys/filter.h","functions":["git_filter_lookup","git_filter_list_new","git_filter_list_push","git_filter_list_length","git_filter_source_repo","git_filter_source_path","git_filter_source_filemode","git_filter_source_id","git_filter_source_mode","git_filter_source_flags","git_filter_init_fn","git_filter_shutdown_fn","git_filter_check_fn","git_filter_apply_fn","git_filter_cleanup_fn","git_filter_register","git_filter_unregister"],"meta":{},"lines":305},{"file":"sys/hashsig.h","functions":["git_hashsig_create","git_hashsig_create_fromfile","git_hashsig_free","git_hashsig_compare"],"meta":{},"lines":102},{"file":"sys/mempack.h","functions":["git_mempack_new","git_mempack_reset"],"meta":{},"lines":81},{"file":"sys/odb_backend.h","functions":["git_odb_init_backend"],"meta":{},"lines":102},{"file":"sys/openssl.h","functions":["git_openssl_set_locking"],"meta":{},"lines":34},{"file":"sys/refdb_backend.h","functions":["git_refdb_init_backend","git_refdb_backend_fs","git_refdb_set_backend"],"meta":{},"lines":213},{"file":"sys/refs.h","functions":["git_reference__alloc","git_reference__alloc_symbolic"],"meta":{},"lines":45},{"file":"sys/repository.h","functions":["git_repository_new","git_repository__cleanup","git_repository_reinit_filesystem","git_repository_set_config","git_repository_set_odb","git_repository_set_refdb","git_repository_set_index","git_repository_set_bare"],"meta":{},"lines":136},{"file":"sys/stream.h","functions":[],"meta":{},"lines":40},{"file":"sys/transport.h","functions":["git_transport_init","git_transport_new","git_transport_ssh_with_paths","git_transport_unregister","git_transport_dummy","git_transport_local","git_transport_smart","git_smart_subtransport_http","git_smart_subtransport_git","git_smart_subtransport_ssh"],"meta":{},"lines":349},{"file":"tag.h","functions":["git_tag_lookup","git_tag_lookup_prefix","git_tag_free","git_tag_id","git_tag_owner","git_tag_target","git_tag_target_id","git_tag_target_type","git_tag_name","git_tag_tagger","git_tag_message","git_tag_create","git_tag_annotation_create","git_tag_create_frombuffer","git_tag_create_lightweight","git_tag_delete","git_tag_list","git_tag_list_match","git_tag_foreach","git_tag_peel"],"meta":{},"lines":348},{"file":"trace.h","functions":["git_trace_callback","git_trace_set"],"meta":{},"lines":63},{"file":"transport.h","functions":["git_transport_cb","git_cred_has_username","git_cred_userpass_plaintext_new","git_cred_ssh_key_new","git_cred_ssh_interactive_new","git_cred_ssh_key_from_agent","git_cred_ssh_custom_new","git_cred_default_new","git_cred_username_new","git_cred_ssh_key_memory_new","git_cred_acquire_cb"],"meta":{},"lines":334},{"file":"tree.h","functions":["git_tree_lookup","git_tree_lookup_prefix","git_tree_free","git_tree_id","git_tree_owner","git_tree_entrycount","git_tree_entry_byname","git_tree_entry_byindex","git_tree_entry_byid","git_tree_entry_bypath","git_tree_entry_dup","git_tree_entry_free","git_tree_entry_name","git_tree_entry_id","git_tree_entry_type","git_tree_entry_filemode","git_tree_entry_filemode_raw","git_tree_entry_cmp","git_tree_entry_to_object","git_treebuilder_new","git_treebuilder_clear","git_treebuilder_entrycount","git_treebuilder_free","git_treebuilder_get","git_treebuilder_insert","git_treebuilder_remove","git_treebuilder_filter_cb","git_treebuilder_filter","git_treebuilder_write","git_treewalk_cb","git_tree_walk"],"meta":{},"lines":410},{"file":"types.h","functions":["git_transfer_progress_cb","git_transport_message_cb","git_transport_certificate_check_cb"],"meta":{},"lines":425}],"functions":{"git_annotated_commit_from_ref":{"type":"function","file":"annotated_commit.h","line":33,"lineto":36,"args":[{"name":"out","type":"git_annotated_commit **","comment":"pointer to store the git_annotated_commit result in"},{"name":"repo","type":"git_repository *","comment":"repository that contains the given reference"},{"name":"ref","type":"const git_reference *","comment":"reference to use to lookup the git_annotated_commit"}],"argline":"git_annotated_commit **out, git_repository *repo, const git_reference *ref","sig":"git_annotated_commit **::git_repository *::const git_reference *","return":{"type":"int","comment":" 0 on success or error code"},"description":"

Creates a git_annotated_commit from the given reference.\n The resulting git_annotated_commit must be freed with\n git_annotated_commit_free.

\n","comments":"","group":"annotated"},"git_annotated_commit_from_fetchhead":{"type":"function","file":"annotated_commit.h","line":50,"lineto":55,"args":[{"name":"out","type":"git_annotated_commit **","comment":"pointer to store the git_annotated_commit result in"},{"name":"repo","type":"git_repository *","comment":"repository that contains the given commit"},{"name":"branch_name","type":"const char *","comment":"name of the (remote) branch"},{"name":"remote_url","type":"const char *","comment":"url of the remote"},{"name":"id","type":"const git_oid *","comment":"the commit object id of the remote branch"}],"argline":"git_annotated_commit **out, git_repository *repo, const char *branch_name, const char *remote_url, const git_oid *id","sig":"git_annotated_commit **::git_repository *::const char *::const char *::const git_oid *","return":{"type":"int","comment":" 0 on success or error code"},"description":"

Creates a git_annotated_commit from the given fetch head data.\n The resulting git_annotated_commit must be freed with\n git_annotated_commit_free.

\n","comments":"","group":"annotated"},"git_annotated_commit_lookup":{"type":"function","file":"annotated_commit.h","line":75,"lineto":78,"args":[{"name":"out","type":"git_annotated_commit **","comment":"pointer to store the git_annotated_commit result in"},{"name":"repo","type":"git_repository *","comment":"repository that contains the given commit"},{"name":"id","type":"const git_oid *","comment":"the commit object id to lookup"}],"argline":"git_annotated_commit **out, git_repository *repo, const git_oid *id","sig":"git_annotated_commit **::git_repository *::const git_oid *","return":{"type":"int","comment":" 0 on success or error code"},"description":"

Creates a git_annotated_commit from the given commit id.\n The resulting git_annotated_commit must be freed with\n git_annotated_commit_free.

\n","comments":"

An annotated commit contains information about how it was\n looked up, which may be useful for functions like merge or\n rebase to provide context to the operation. For example,\n conflict files will include the name of the source or target\n branches being merged. It is therefore preferable to use the\n most specific function (eg git_annotated_commit_from_ref)\n instead of this one when that data is known.

\n","group":"annotated"},"git_annotated_commit_from_revspec":{"type":"function","file":"annotated_commit.h","line":92,"lineto":95,"args":[{"name":"out","type":"git_annotated_commit **","comment":"pointer to store the git_annotated_commit result in"},{"name":"repo","type":"git_repository *","comment":"repository that contains the given commit"},{"name":"revspec","type":"const char *","comment":"the extended sha syntax string to use to lookup the commit"}],"argline":"git_annotated_commit **out, git_repository *repo, const char *revspec","sig":"git_annotated_commit **::git_repository *::const char *","return":{"type":"int","comment":" 0 on success or error code"},"description":"

Creates a git_annotated_comit from a revision string.

\n","comments":"

See man gitrevisions, or\n http://git-scm.com/docs/git-rev-parse.html#_specifying_revisions for\n information on the syntax accepted.

\n","group":"annotated"},"git_annotated_commit_id":{"type":"function","file":"annotated_commit.h","line":103,"lineto":104,"args":[{"name":"commit","type":"const git_annotated_commit *","comment":"the given annotated commit"}],"argline":"const git_annotated_commit *commit","sig":"const git_annotated_commit *","return":{"type":"const git_oid *","comment":" commit id"},"description":"

Gets the commit ID that the given git_annotated_commit refers to.

\n","comments":"","group":"annotated"},"git_annotated_commit_free":{"type":"function","file":"annotated_commit.h","line":111,"lineto":112,"args":[{"name":"commit","type":"git_annotated_commit *","comment":"annotated commit to free"}],"argline":"git_annotated_commit *commit","sig":"git_annotated_commit *","return":{"type":"void","comment":null},"description":"

Frees a git_annotated_commit.

\n","comments":"","group":"annotated"},"git_attr_value":{"type":"function","file":"attr.h","line":102,"lineto":102,"args":[{"name":"attr","type":"const char *","comment":"The attribute"}],"argline":"const char *attr","sig":"const char *","return":{"type":"git_attr_t","comment":" the value type for the attribute"},"description":"

Return the value type for a given attribute.

\n","comments":"

This can be either TRUE, FALSE, UNSPECIFIED (if the attribute\n was not set at all), or VALUE, if the attribute was set to an\n actual string.

\n\n

If the attribute has a VALUE string, it can be accessed normally\n as a NULL-terminated C string.

\n","group":"attr"},"git_attr_get":{"type":"function","file":"attr.h","line":145,"lineto":150,"args":[{"name":"value_out","type":"const char **","comment":"Output of the value of the attribute. Use the GIT_ATTR_...\n macros to test for TRUE, FALSE, UNSPECIFIED, etc. or just\n use the string value for attributes set to a value. You\n should NOT modify or free this value."},{"name":"repo","type":"git_repository *","comment":"The repository containing the path."},{"name":"flags","type":"uint32_t","comment":"A combination of GIT_ATTR_CHECK... flags."},{"name":"path","type":"const char *","comment":"The path to check for attributes. Relative paths are\n interpreted relative to the repo root. The file does\n not have to exist, but if it does not, then it will be\n treated as a plain file (not a directory)."},{"name":"name","type":"const char *","comment":"The name of the attribute to look up."}],"argline":"const char **value_out, git_repository *repo, uint32_t flags, const char *path, const char *name","sig":"const char **::git_repository *::uint32_t::const char *::const char *","return":{"type":"int","comment":null},"description":"

Look up the value of one git attribute for path.

\n","comments":"","group":"attr"},"git_attr_get_many":{"type":"function","file":"attr.h","line":181,"lineto":187,"args":[{"name":"values_out","type":"const char **","comment":"An array of num_attr entries that will have string\n pointers written into it for the values of the attributes.\n You should not modify or free the values that are written\n into this array (although of course, you should free the\n array itself if you allocated it)."},{"name":"repo","type":"git_repository *","comment":"The repository containing the path."},{"name":"flags","type":"uint32_t","comment":"A combination of GIT_ATTR_CHECK... flags."},{"name":"path","type":"const char *","comment":"The path inside the repo to check attributes. This\n does not have to exist, but if it does not, then\n it will be treated as a plain file (i.e. not a directory)."},{"name":"num_attr","type":"size_t","comment":"The number of attributes being looked up"},{"name":"names","type":"const char **","comment":"An array of num_attr strings containing attribute names."}],"argline":"const char **values_out, git_repository *repo, uint32_t flags, const char *path, size_t num_attr, const char **names","sig":"const char **::git_repository *::uint32_t::const char *::size_t::const char **","return":{"type":"int","comment":null},"description":"

Look up a list of git attributes for path.

\n","comments":"

Use this if you have a known list of attributes that you want to\n look up in a single call. This is somewhat more efficient than\n calling git_attr_get() multiple times.

\n\n

For example, you might write:

\n\n
 const char *attrs[] = { "crlf", "diff", "foo" };\n const char **values[3];\n git_attr_get_many(values, repo, 0, "my/fun/file.c", 3, attrs);\n
\n\n

Then you could loop through the 3 values to get the settings for\n the three attributes you asked about.

\n","group":"attr"},"git_attr_foreach":{"type":"function","file":"attr.h","line":209,"lineto":214,"args":[{"name":"repo","type":"git_repository *","comment":"The repository containing the path."},{"name":"flags","type":"uint32_t","comment":"A combination of GIT_ATTR_CHECK... flags."},{"name":"path","type":"const char *","comment":"Path inside the repo to check attributes. This does not have\n to exist, but if it does not, then it will be treated as a\n plain file (i.e. not a directory)."},{"name":"callback","type":"git_attr_foreach_cb","comment":"Function to invoke on each attribute name and value. The\n value may be NULL is the attribute is explicitly set to\n UNSPECIFIED using the '!' sign. Callback will be invoked\n only once per attribute name, even if there are multiple\n rules for a given file. The highest priority rule will be\n used. Return a non-zero value from this to stop looping.\n The value will be returned from `git_attr_foreach`."},{"name":"payload","type":"void *","comment":"Passed on as extra parameter to callback function."}],"argline":"git_repository *repo, uint32_t flags, const char *path, git_attr_foreach_cb callback, void *payload","sig":"git_repository *::uint32_t::const char *::git_attr_foreach_cb::void *","return":{"type":"int","comment":" 0 on success, non-zero callback return value, or error code"},"description":"

Loop over all the git attributes for a path.

\n","comments":"","group":"attr"},"git_attr_cache_flush":{"type":"function","file":"attr.h","line":224,"lineto":225,"args":[{"name":"repo","type":"git_repository *","comment":null}],"argline":"git_repository *repo","sig":"git_repository *","return":{"type":"void","comment":null},"description":"

Flush the gitattributes cache.

\n","comments":"

Call this if you have reason to believe that the attributes files on\n disk no longer match the cached contents of memory. This will cause\n the attributes files to be reloaded the next time that an attribute\n access function is called.

\n","group":"attr"},"git_attr_add_macro":{"type":"function","file":"attr.h","line":237,"lineto":240,"args":[{"name":"repo","type":"git_repository *","comment":null},{"name":"name","type":"const char *","comment":null},{"name":"values","type":"const char *","comment":null}],"argline":"git_repository *repo, const char *name, const char *values","sig":"git_repository *::const char *::const char *","return":{"type":"int","comment":null},"description":"

Add a macro definition.

\n","comments":"

Macros will automatically be loaded from the top level .gitattributes\n file of the repository (plus the build-in "binary" macro). This\n function allows you to add others. For example, to add the default\n macro, you would call:

\n\n
 git_attr_add_macro(repo, "binary", "-diff -crlf");\n
\n","group":"attr"},"git_blame_init_options":{"type":"function","file":"blame.h","line":92,"lineto":94,"args":[{"name":"opts","type":"git_blame_options *","comment":"The `git_blame_options` struct to initialize"},{"name":"version","type":"unsigned int","comment":"Version of struct; pass `GIT_BLAME_OPTIONS_VERSION`"}],"argline":"git_blame_options *opts, unsigned int version","sig":"git_blame_options *::unsigned int","return":{"type":"int","comment":" Zero on success; -1 on failure."},"description":"

Initializes a git_blame_options with default values. Equivalent to\n creating an instance with GIT_BLAME_OPTIONS_INIT.

\n","comments":"","group":"blame"},"git_blame_get_hunk_count":{"type":"function","file":"blame.h","line":137,"lineto":137,"args":[{"name":"blame","type":"git_blame *","comment":null}],"argline":"git_blame *blame","sig":"git_blame *","return":{"type":"uint32_t","comment":null},"description":"

Gets the number of hunks that exist in the blame structure.

\n","comments":"","group":"blame"},"git_blame_get_hunk_byindex":{"type":"function","file":"blame.h","line":146,"lineto":148,"args":[{"name":"blame","type":"git_blame *","comment":"the blame structure to query"},{"name":"index","type":"uint32_t","comment":"index of the hunk to retrieve"}],"argline":"git_blame *blame, uint32_t index","sig":"git_blame *::uint32_t","return":{"type":"const git_blame_hunk *","comment":" the hunk at the given index, or NULL on error"},"description":"

Gets the blame hunk at the given index.

\n","comments":"","group":"blame"},"git_blame_get_hunk_byline":{"type":"function","file":"blame.h","line":157,"lineto":159,"args":[{"name":"blame","type":"git_blame *","comment":"the blame structure to query"},{"name":"lineno","type":"uint32_t","comment":"the (1-based) line number to find a hunk for"}],"argline":"git_blame *blame, uint32_t lineno","sig":"git_blame *::uint32_t","return":{"type":"const git_blame_hunk *","comment":" the hunk that contains the given line, or NULL on error"},"description":"

Gets the hunk that relates to the given line number in the newest commit.

\n","comments":"","group":"blame","examples":{"blame.c":["ex/v0.23.0/blame.html#git_blame_get_hunk_byline-1"]}},"git_blame_file":{"type":"function","file":"blame.h","line":172,"lineto":176,"args":[{"name":"out","type":"git_blame **","comment":"pointer that will receive the blame object"},{"name":"repo","type":"git_repository *","comment":"repository whose history is to be walked"},{"name":"path","type":"const char *","comment":"path to file to consider"},{"name":"options","type":"git_blame_options *","comment":"options for the blame operation. If NULL, this is treated as\n though GIT_BLAME_OPTIONS_INIT were passed."}],"argline":"git_blame **out, git_repository *repo, const char *path, git_blame_options *options","sig":"git_blame **::git_repository *::const char *::git_blame_options *","return":{"type":"int","comment":" 0 on success, or an error code. (use giterr_last for information\n about the error.)"},"description":"

Get the blame for a single file.

\n","comments":"","group":"blame","examples":{"blame.c":["ex/v0.23.0/blame.html#git_blame_file-2"]}},"git_blame_buffer":{"type":"function","file":"blame.h","line":196,"lineto":200,"args":[{"name":"out","type":"git_blame **","comment":"pointer that will receive the resulting blame data"},{"name":"reference","type":"git_blame *","comment":"cached blame from the history of the file (usually the output\n from git_blame_file)"},{"name":"buffer","type":"const char *","comment":"the (possibly) modified contents of the file"},{"name":"buffer_len","type":"size_t","comment":"number of valid bytes in the buffer"}],"argline":"git_blame **out, git_blame *reference, const char *buffer, size_t buffer_len","sig":"git_blame **::git_blame *::const char *::size_t","return":{"type":"int","comment":" 0 on success, or an error code. (use giterr_last for information\n about the error)"},"description":"

Get blame data for a file that has been modified in memory. The reference\n parameter is a pre-calculated blame for the in-odb history of the file. This\n means that once a file blame is completed (which can be expensive), updating\n the buffer blame is very fast.

\n","comments":"

Lines that differ between the buffer and the committed version are marked as\n having a zero OID for their final_commit_id.

\n","group":"blame"},"git_blame_free":{"type":"function","file":"blame.h","line":207,"lineto":207,"args":[{"name":"blame","type":"git_blame *","comment":"the blame structure to free"}],"argline":"git_blame *blame","sig":"git_blame *","return":{"type":"void","comment":null},"description":"

Free memory allocated by git_blame_file or git_blame_buffer.

\n","comments":"","group":"blame","examples":{"blame.c":["ex/v0.23.0/blame.html#git_blame_free-3"]}},"git_blob_lookup":{"type":"function","file":"blob.h","line":33,"lineto":33,"args":[{"name":"blob","type":"git_blob **","comment":"pointer to the looked up blob"},{"name":"repo","type":"git_repository *","comment":"the repo to use when locating the blob."},{"name":"id","type":"const git_oid *","comment":"identity of the blob to locate."}],"argline":"git_blob **blob, git_repository *repo, const git_oid *id","sig":"git_blob **::git_repository *::const git_oid *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Lookup a blob object from a repository.

\n","comments":"","group":"blob","examples":{"blame.c":["ex/v0.23.0/blame.html#git_blob_lookup-4"],"general.c":["ex/v0.23.0/general.html#git_blob_lookup-1"]}},"git_blob_lookup_prefix":{"type":"function","file":"blob.h","line":47,"lineto":47,"args":[{"name":"blob","type":"git_blob **","comment":"pointer to the looked up blob"},{"name":"repo","type":"git_repository *","comment":"the repo to use when locating the blob."},{"name":"id","type":"const git_oid *","comment":"identity of the blob to locate."},{"name":"len","type":"size_t","comment":"the length of the short identifier"}],"argline":"git_blob **blob, git_repository *repo, const git_oid *id, size_t len","sig":"git_blob **::git_repository *::const git_oid *::size_t","return":{"type":"int","comment":" 0 or an error code"},"description":"

Lookup a blob object from a repository,\n given a prefix of its identifier (short id).

\n","comments":"","group":"blob"},"git_blob_free":{"type":"function","file":"blob.h","line":60,"lineto":60,"args":[{"name":"blob","type":"git_blob *","comment":"the blob to close"}],"argline":"git_blob *blob","sig":"git_blob *","return":{"type":"void","comment":null},"description":"

Close an open blob

\n","comments":"

This is a wrapper around git_object_free()

\n\n

IMPORTANT:\n It is necessary to call this method when you stop\n using a blob. Failure to do so will cause a memory leak.

\n","group":"blob","examples":{"blame.c":["ex/v0.23.0/blame.html#git_blob_free-5"]}},"git_blob_id":{"type":"function","file":"blob.h","line":68,"lineto":68,"args":[{"name":"blob","type":"const git_blob *","comment":"a previously loaded blob."}],"argline":"const git_blob *blob","sig":"const git_blob *","return":{"type":"const git_oid *","comment":" SHA1 hash for this blob."},"description":"

Get the id of a blob.

\n","comments":"","group":"blob"},"git_blob_owner":{"type":"function","file":"blob.h","line":76,"lineto":76,"args":[{"name":"blob","type":"const git_blob *","comment":"A previously loaded blob."}],"argline":"const git_blob *blob","sig":"const git_blob *","return":{"type":"git_repository *","comment":" Repository that contains this blob."},"description":"

Get the repository that contains the blob.

\n","comments":"","group":"blob"},"git_blob_rawcontent":{"type":"function","file":"blob.h","line":89,"lineto":89,"args":[{"name":"blob","type":"const git_blob *","comment":"pointer to the blob"}],"argline":"const git_blob *blob","sig":"const git_blob *","return":{"type":"const void *","comment":" the pointer"},"description":"

Get a read-only buffer with the raw content of a blob.

\n","comments":"

A pointer to the raw content of a blob is returned;\n this pointer is owned internally by the object and shall\n not be free'd. The pointer may be invalidated at a later\n time.

\n","group":"blob","examples":{"blame.c":["ex/v0.23.0/blame.html#git_blob_rawcontent-6"],"cat-file.c":["ex/v0.23.0/cat-file.html#git_blob_rawcontent-1"],"general.c":["ex/v0.23.0/general.html#git_blob_rawcontent-2"]}},"git_blob_rawsize":{"type":"function","file":"blob.h","line":97,"lineto":97,"args":[{"name":"blob","type":"const git_blob *","comment":"pointer to the blob"}],"argline":"const git_blob *blob","sig":"const git_blob *","return":{"type":"git_off_t","comment":" size on bytes"},"description":"

Get the size in bytes of the contents of a blob

\n","comments":"","group":"blob","examples":{"blame.c":["ex/v0.23.0/blame.html#git_blob_rawsize-7"],"cat-file.c":["ex/v0.23.0/cat-file.html#git_blob_rawsize-2"],"general.c":["ex/v0.23.0/general.html#git_blob_rawsize-3","ex/v0.23.0/general.html#git_blob_rawsize-4"]}},"git_blob_filtered_content":{"type":"function","file":"blob.h","line":122,"lineto":126,"args":[{"name":"out","type":"git_buf *","comment":"The git_buf to be filled in"},{"name":"blob","type":"git_blob *","comment":"Pointer to the blob"},{"name":"as_path","type":"const char *","comment":"Path used for file attribute lookups, etc."},{"name":"check_for_binary_data","type":"int","comment":"Should this test if blob content contains\n NUL bytes / looks like binary data before applying filters?"}],"argline":"git_buf *out, git_blob *blob, const char *as_path, int check_for_binary_data","sig":"git_buf *::git_blob *::const char *::int","return":{"type":"int","comment":" 0 on success or an error code"},"description":"

Get a buffer with the filtered content of a blob.

\n","comments":"

This applies filters as if the blob was being checked out to the\n working directory under the specified filename. This may apply\n CRLF filtering or other types of changes depending on the file\n attributes set for the blob and the content detected in it.

\n\n

The output is written into a git_buf which the caller must free\n when done (via git_buf_free).

\n\n

If no filters need to be applied, then the out buffer will just\n be populated with a pointer to the raw content of the blob. In\n that case, be careful to not free the blob until done with the\n buffer or copy it into memory you own.

\n","group":"blob"},"git_blob_create_fromworkdir":{"type":"function","file":"blob.h","line":139,"lineto":139,"args":[{"name":"id","type":"git_oid *","comment":"return the id of the written blob"},{"name":"repo","type":"git_repository *","comment":"repository where the blob will be written.\n\tthis repository cannot be bare"},{"name":"relative_path","type":"const char *","comment":"file from which the blob will be created,\n\trelative to the repository's working dir"}],"argline":"git_oid *id, git_repository *repo, const char *relative_path","sig":"git_oid *::git_repository *::const char *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Read a file from the working folder of a repository\n and write it to the Object Database as a loose blob

\n","comments":"","group":"blob"},"git_blob_create_fromdisk":{"type":"function","file":"blob.h","line":151,"lineto":151,"args":[{"name":"id","type":"git_oid *","comment":"return the id of the written blob"},{"name":"repo","type":"git_repository *","comment":"repository where the blob will be written.\n\tthis repository can be bare or not"},{"name":"path","type":"const char *","comment":"file from which the blob will be created"}],"argline":"git_oid *id, git_repository *repo, const char *path","sig":"git_oid *::git_repository *::const char *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Read a file from the filesystem and write its content\n to the Object Database as a loose blob

\n","comments":"","group":"blob"},"git_blob_create_fromchunks":{"type":"function","file":"blob.h","line":187,"lineto":192,"args":[{"name":"id","type":"git_oid *","comment":"Return the id of the written blob"},{"name":"repo","type":"git_repository *","comment":"Repository where the blob will be written.\n This repository can be bare or not."},{"name":"hintpath","type":"const char *","comment":"If not NULL, will be used to select data filters\n to apply onto the content of the blob to be created."},{"name":"callback","type":"git_blob_chunk_cb","comment":null},{"name":"payload","type":"void *","comment":null}],"argline":"git_oid *id, git_repository *repo, const char *hintpath, git_blob_chunk_cb callback, void *payload","sig":"git_oid *::git_repository *::const char *::git_blob_chunk_cb::void *","return":{"type":"int","comment":" 0 or error code (from either libgit2 or callback function)"},"description":"

Write a loose blob to the Object Database from a\n provider of chunks of data.

\n","comments":"

If the hintpath parameter is filled, it will be used to determine\n what git filters should be applied to the object before it is written\n to the object database.

\n\n

The implementation of the callback MUST respect the following rules:

\n\n
    \n
  • content must be filled by the callback. The maximum number of\nbytes that the buffer can accept per call is defined by the\nmax_length parameter. Allocation and freeing of the buffer will\nbe taken care of by libgit2.

  • \n
  • The callback must return the number of bytes that have been\nwritten to the content buffer.

  • \n
  • When there is no more data to stream, callback should return

    \n\n
      \n
    1. This will prevent it from being invoked anymore.
    2. \n
  • \n
  • If an error occurs, the callback should return a negative value.\nThis value will be returned to the caller.

  • \n
\n","group":"blob"},"git_blob_create_frombuffer":{"type":"function","file":"blob.h","line":203,"lineto":204,"args":[{"name":"id","type":"git_oid *","comment":"return the id of the written blob"},{"name":"repo","type":"git_repository *","comment":"repository where to blob will be written"},{"name":"buffer","type":"const void *","comment":"data to be written into the blob"},{"name":"len","type":"size_t","comment":"length of the data"}],"argline":"git_oid *id, git_repository *repo, const void *buffer, size_t len","sig":"git_oid *::git_repository *::const void *::size_t","return":{"type":"int","comment":" 0 or an error code"},"description":"

Write an in-memory buffer to the ODB as a blob

\n","comments":"","group":"blob"},"git_blob_is_binary":{"type":"function","file":"blob.h","line":217,"lineto":217,"args":[{"name":"blob","type":"const git_blob *","comment":"The blob which content should be analyzed"}],"argline":"const git_blob *blob","sig":"const git_blob *","return":{"type":"int","comment":" 1 if the content of the blob is detected\n as binary; 0 otherwise."},"description":"

Determine if the blob content is most certainly binary or not.

\n","comments":"

The heuristic used to guess if a file is binary is taken from core git:\n Searching for NUL bytes and looking for a reasonable ratio of printable\n to non-printable characters among the first 8000 bytes.

\n","group":"blob"},"git_branch_create":{"type":"function","file":"branch.h","line":50,"lineto":55,"args":[{"name":"out","type":"git_reference **","comment":"Pointer where to store the underlying reference."},{"name":"repo","type":"git_repository *","comment":null},{"name":"branch_name","type":"const char *","comment":"Name for the branch; this name is\n validated for consistency. It should also not conflict with\n an already existing branch name."},{"name":"target","type":"const git_commit *","comment":"Commit to which this branch should point. This object\n must belong to the given `repo`."},{"name":"force","type":"int","comment":"Overwrite existing branch."}],"argline":"git_reference **out, git_repository *repo, const char *branch_name, const git_commit *target, int force","sig":"git_reference **::git_repository *::const char *::const git_commit *::int","return":{"type":"int","comment":" 0, GIT_EINVALIDSPEC or an error code.\n A proper reference is written in the refs/heads namespace\n pointing to the provided target commit."},"description":"

Create a new branch pointing at a target commit

\n","comments":"

A new direct reference will be created pointing to\n this target commit. If force is true and a reference\n already exists with the given name, it'll be replaced.

\n\n

The returned reference must be freed by the user.

\n\n

The branch name will be checked for validity.\n See git_tag_create() for rules about valid names.

\n","group":"branch"},"git_branch_create_from_annotated":{"type":"function","file":"branch.h","line":68,"lineto":73,"args":[{"name":"ref_out","type":"git_reference **","comment":null},{"name":"repository","type":"git_repository *","comment":null},{"name":"branch_name","type":"const char *","comment":null},{"name":"commit","type":"const git_annotated_commit *","comment":null},{"name":"force","type":"int","comment":null}],"argline":"git_reference **ref_out, git_repository *repository, const char *branch_name, const git_annotated_commit *commit, int force","sig":"git_reference **::git_repository *::const char *::const git_annotated_commit *::int","return":{"type":"int","comment":null},"description":"

Create a new branch pointing at a target commit

\n","comments":"

This behaves like git_branch_create() but takes an annotated\n commit, which lets you specify which extended sha syntax string was\n specified by a user, allowing for more exact reflog messages.

\n\n

See the documentation for git_branch_create().

\n","group":"branch"},"git_branch_delete":{"type":"function","file":"branch.h","line":85,"lineto":85,"args":[{"name":"branch","type":"git_reference *","comment":"A valid reference representing a branch"}],"argline":"git_reference *branch","sig":"git_reference *","return":{"type":"int","comment":" 0 on success, or an error code."},"description":"

Delete an existing branch reference.

\n","comments":"

If the branch is successfully deleted, the passed reference\n object will be invalidated. The reference must be freed manually\n by the user.

\n","group":"branch"},"git_branch_iterator_new":{"type":"function","file":"branch.h","line":101,"lineto":104,"args":[{"name":"out","type":"git_branch_iterator **","comment":"the iterator"},{"name":"repo","type":"git_repository *","comment":"Repository where to find the branches."},{"name":"list_flags","type":"git_branch_t","comment":"Filtering flags for the branch\n listing. Valid values are GIT_BRANCH_LOCAL, GIT_BRANCH_REMOTE\n or GIT_BRANCH_ALL."}],"argline":"git_branch_iterator **out, git_repository *repo, git_branch_t list_flags","sig":"git_branch_iterator **::git_repository *::git_branch_t","return":{"type":"int","comment":" 0 on success or an error code"},"description":"

Create an iterator which loops over the requested branches.

\n","comments":"","group":"branch"},"git_branch_next":{"type":"function","file":"branch.h","line":114,"lineto":114,"args":[{"name":"out","type":"git_reference **","comment":"the reference"},{"name":"out_type","type":"git_branch_t *","comment":"the type of branch (local or remote-tracking)"},{"name":"iter","type":"git_branch_iterator *","comment":"the branch iterator"}],"argline":"git_reference **out, git_branch_t *out_type, git_branch_iterator *iter","sig":"git_reference **::git_branch_t *::git_branch_iterator *","return":{"type":"int","comment":" 0 on success, GIT_ITEROVER if there are no more branches or an error code."},"description":"

Retrieve the next branch from the iterator

\n","comments":"","group":"branch"},"git_branch_iterator_free":{"type":"function","file":"branch.h","line":121,"lineto":121,"args":[{"name":"iter","type":"git_branch_iterator *","comment":"the iterator to free"}],"argline":"git_branch_iterator *iter","sig":"git_branch_iterator *","return":{"type":"void","comment":null},"description":"

Free a branch iterator

\n","comments":"","group":"branch"},"git_branch_move":{"type":"function","file":"branch.h","line":138,"lineto":142,"args":[{"name":"out","type":"git_reference **","comment":null},{"name":"branch","type":"git_reference *","comment":"Current underlying reference of the branch."},{"name":"new_branch_name","type":"const char *","comment":"Target name of the branch once the move\n is performed; this name is validated for consistency."},{"name":"force","type":"int","comment":"Overwrite existing branch."}],"argline":"git_reference **out, git_reference *branch, const char *new_branch_name, int force","sig":"git_reference **::git_reference *::const char *::int","return":{"type":"int","comment":" 0 on success, GIT_EINVALIDSPEC or an error code."},"description":"

Move/rename an existing local branch reference.

\n","comments":"

The new branch name will be checked for validity.\n See git_tag_create() for rules about valid names.

\n","group":"branch"},"git_branch_lookup":{"type":"function","file":"branch.h","line":165,"lineto":169,"args":[{"name":"out","type":"git_reference **","comment":"pointer to the looked-up branch reference"},{"name":"repo","type":"git_repository *","comment":"the repository to look up the branch"},{"name":"branch_name","type":"const char *","comment":"Name of the branch to be looked-up;\n this name is validated for consistency."},{"name":"branch_type","type":"git_branch_t","comment":"Type of the considered branch. This should\n be valued with either GIT_BRANCH_LOCAL or GIT_BRANCH_REMOTE."}],"argline":"git_reference **out, git_repository *repo, const char *branch_name, git_branch_t branch_type","sig":"git_reference **::git_repository *::const char *::git_branch_t","return":{"type":"int","comment":" 0 on success; GIT_ENOTFOUND when no matching branch\n exists, GIT_EINVALIDSPEC, otherwise an error code."},"description":"

Lookup a branch by its name in a repository.

\n","comments":"

The generated reference must be freed by the user.

\n\n

The branch name will be checked for validity.\n See git_tag_create() for rules about valid names.

\n","group":"branch"},"git_branch_name":{"type":"function","file":"branch.h","line":186,"lineto":188,"args":[{"name":"out","type":"const char **","comment":"where the pointer of branch name is stored;\n this is valid as long as the ref is not freed."},{"name":"ref","type":"const git_reference *","comment":"the reference ideally pointing to a branch"}],"argline":"const char **out, const git_reference *ref","sig":"const char **::const git_reference *","return":{"type":"int","comment":" 0 on success; otherwise an error code (e.g., if the\n ref is no local or remote branch)."},"description":"

Return the name of the given local or remote branch.

\n","comments":"

The name of the branch matches the definition of the name\n for git_branch_lookup. That is, if the returned name is given\n to git_branch_lookup() then the reference is returned that\n was given to this function.

\n","group":"branch"},"git_branch_upstream":{"type":"function","file":"branch.h","line":202,"lineto":204,"args":[{"name":"out","type":"git_reference **","comment":"Pointer where to store the retrieved\n reference."},{"name":"branch","type":"const git_reference *","comment":"Current underlying reference of the branch."}],"argline":"git_reference **out, const git_reference *branch","sig":"git_reference **::const git_reference *","return":{"type":"int","comment":" 0 on success; GIT_ENOTFOUND when no remote tracking\n reference exists, otherwise an error code."},"description":"

Return the reference supporting the remote tracking branch,\n given a local branch reference.

\n","comments":"","group":"branch"},"git_branch_set_upstream":{"type":"function","file":"branch.h","line":216,"lineto":216,"args":[{"name":"branch","type":"git_reference *","comment":"the branch to configure"},{"name":"upstream_name","type":"const char *","comment":"remote-tracking or local branch to set as\n upstream. Pass NULL to unset."}],"argline":"git_reference *branch, const char *upstream_name","sig":"git_reference *::const char *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Set the upstream configuration for a given local branch

\n","comments":"","group":"branch"},"git_branch_is_head":{"type":"function","file":"branch.h","line":245,"lineto":246,"args":[{"name":"branch","type":"const git_reference *","comment":"Current underlying reference of the branch."}],"argline":"const git_reference *branch","sig":"const git_reference *","return":{"type":"int","comment":" 1 if HEAD points at the branch, 0 if it isn't,\n error code otherwise."},"description":"

Determine if the current local branch is pointed at by HEAD.

\n","comments":"","group":"branch"},"git_buf_free":{"type":"function","file":"buffer.h","line":72,"lineto":72,"args":[{"name":"buffer","type":"git_buf *","comment":"The buffer to deallocate"}],"argline":"git_buf *buffer","sig":"git_buf *","return":{"type":"void","comment":null},"description":"

Free the memory referred to by the git_buf.

\n","comments":"

Note that this does not free the git_buf itself, just the memory\n pointed to by buffer->ptr. This will not free the memory if it looks\n like it was not allocated internally, but it will clear the buffer back\n to the empty state.

\n","group":"buf","examples":{"diff.c":["ex/v0.23.0/diff.html#git_buf_free-1"],"remote.c":["ex/v0.23.0/remote.html#git_buf_free-1"],"tag.c":["ex/v0.23.0/tag.html#git_buf_free-1"]}},"git_buf_grow":{"type":"function","file":"buffer.h","line":95,"lineto":95,"args":[{"name":"buffer","type":"git_buf *","comment":"The buffer to be resized; may or may not be allocated yet"},{"name":"target_size","type":"size_t","comment":"The desired available size"}],"argline":"git_buf *buffer, size_t target_size","sig":"git_buf *::size_t","return":{"type":"int","comment":" 0 on success, -1 on allocation failure"},"description":"

Resize the buffer allocation to make more space.

\n","comments":"

This will attempt to grow the buffer to accommodate the target size.

\n\n

If the buffer refers to memory that was not allocated by libgit2 (i.e.\n the asize field is zero), then ptr will be replaced with a newly\n allocated block of data. Be careful so that memory allocated by the\n caller is not lost. As a special variant, if you pass target_size as\n 0 and the memory is not allocated by libgit2, this will allocate a new\n buffer of size size and copy the external data into it.

\n\n

Currently, this will never shrink a buffer, only expand it.

\n\n

If the allocation fails, this will return an error and the buffer will be\n marked as invalid for future operations, invaliding the contents.

\n","group":"buf"},"git_buf_set":{"type":"function","file":"buffer.h","line":105,"lineto":106,"args":[{"name":"buffer","type":"git_buf *","comment":"The buffer to set"},{"name":"data","type":"const void *","comment":"The data to copy into the buffer"},{"name":"datalen","type":"size_t","comment":"The length of the data to copy into the buffer"}],"argline":"git_buf *buffer, const void *data, size_t datalen","sig":"git_buf *::const void *::size_t","return":{"type":"int","comment":" 0 on success, -1 on allocation failure"},"description":"

Set buffer to a copy of some raw data.

\n","comments":"","group":"buf"},"git_buf_is_binary":{"type":"function","file":"buffer.h","line":114,"lineto":114,"args":[{"name":"buf","type":"const git_buf *","comment":"Buffer to check"}],"argline":"const git_buf *buf","sig":"const git_buf *","return":{"type":"int","comment":" 1 if buffer looks like non-text data"},"description":"

Check quickly if buffer looks like it contains binary data

\n","comments":"","group":"buf"},"git_buf_contains_nul":{"type":"function","file":"buffer.h","line":122,"lineto":122,"args":[{"name":"buf","type":"const git_buf *","comment":"Buffer to check"}],"argline":"const git_buf *buf","sig":"const git_buf *","return":{"type":"int","comment":" 1 if buffer contains a NUL byte"},"description":"

Check quickly if buffer contains a NUL byte

\n","comments":"","group":"buf"},"git_checkout_init_options":{"type":"function","file":"checkout.h","line":308,"lineto":310,"args":[{"name":"opts","type":"git_checkout_options *","comment":"the `git_checkout_options` struct to initialize."},{"name":"version","type":"unsigned int","comment":"Version of struct; pass `GIT_CHECKOUT_OPTIONS_VERSION`"}],"argline":"git_checkout_options *opts, unsigned int version","sig":"git_checkout_options *::unsigned int","return":{"type":"int","comment":" Zero on success; -1 on failure."},"description":"

Initializes a git_checkout_options with default values. Equivalent to\n creating an instance with GIT_CHECKOUT_OPTIONS_INIT.

\n","comments":"","group":"checkout"},"git_checkout_head":{"type":"function","file":"checkout.h","line":322,"lineto":324,"args":[{"name":"repo","type":"git_repository *","comment":"repository to check out (must be non-bare)"},{"name":"opts","type":"const git_checkout_options *","comment":"specifies checkout options (may be NULL)"}],"argline":"git_repository *repo, const git_checkout_options *opts","sig":"git_repository *::const git_checkout_options *","return":{"type":"int","comment":" 0 on success, GIT_EUNBORNBRANCH if HEAD points to a non\n existing branch, non-zero value returned by `notify_cb`, or\n other error code \n<\n 0 (use giterr_last for error details)"},"description":"

Updates files in the index and the working tree to match the content of\n the commit pointed at by HEAD.

\n","comments":"","group":"checkout"},"git_checkout_index":{"type":"function","file":"checkout.h","line":335,"lineto":338,"args":[{"name":"repo","type":"git_repository *","comment":"repository into which to check out (must be non-bare)"},{"name":"index","type":"git_index *","comment":"index to be checked out (or NULL to use repository index)"},{"name":"opts","type":"const git_checkout_options *","comment":"specifies checkout options (may be NULL)"}],"argline":"git_repository *repo, git_index *index, const git_checkout_options *opts","sig":"git_repository *::git_index *::const git_checkout_options *","return":{"type":"int","comment":" 0 on success, non-zero return value from `notify_cb`, or error\n code \n<\n 0 (use giterr_last for error details)"},"description":"

Updates files in the working tree to match the content of the index.

\n","comments":"","group":"checkout"},"git_checkout_tree":{"type":"function","file":"checkout.h","line":351,"lineto":354,"args":[{"name":"repo","type":"git_repository *","comment":"repository to check out (must be non-bare)"},{"name":"treeish","type":"const git_object *","comment":"a commit, tag or tree which content will be used to update\n the working directory (or NULL to use HEAD)"},{"name":"opts","type":"const git_checkout_options *","comment":"specifies checkout options (may be NULL)"}],"argline":"git_repository *repo, const git_object *treeish, const git_checkout_options *opts","sig":"git_repository *::const git_object *::const git_checkout_options *","return":{"type":"int","comment":" 0 on success, non-zero return value from `notify_cb`, or error\n code \n<\n 0 (use giterr_last for error details)"},"description":"

Updates files in the index and working tree to match the content of the\n tree pointed at by the treeish.

\n","comments":"","group":"checkout"},"git_cherrypick_init_options":{"type":"function","file":"cherrypick.h","line":47,"lineto":49,"args":[{"name":"opts","type":"git_cherrypick_options *","comment":"the `git_cherrypick_options` struct to initialize"},{"name":"version","type":"unsigned int","comment":"Version of struct; pass `GIT_CHERRYPICK_OPTIONS_VERSION`"}],"argline":"git_cherrypick_options *opts, unsigned int version","sig":"git_cherrypick_options *::unsigned int","return":{"type":"int","comment":" Zero on success; -1 on failure."},"description":"

Initializes a git_cherrypick_options with default values. Equivalent to\n creating an instance with GIT_CHERRYPICK_OPTIONS_INIT.

\n","comments":"","group":"cherrypick"},"git_cherrypick_commit":{"type":"function","file":"cherrypick.h","line":65,"lineto":71,"args":[{"name":"out","type":"git_index **","comment":"pointer to store the index result in"},{"name":"repo","type":"git_repository *","comment":"the repository that contains the given commits"},{"name":"cherrypick_commit","type":"git_commit *","comment":"the commit to cherry-pick"},{"name":"our_commit","type":"git_commit *","comment":"the commit to revert against (eg, HEAD)"},{"name":"mainline","type":"unsigned int","comment":"the parent of the revert commit, if it is a merge"},{"name":"merge_options","type":"const git_merge_options *","comment":"the merge options (or null for defaults)"}],"argline":"git_index **out, git_repository *repo, git_commit *cherrypick_commit, git_commit *our_commit, unsigned int mainline, const git_merge_options *merge_options","sig":"git_index **::git_repository *::git_commit *::git_commit *::unsigned int::const git_merge_options *","return":{"type":"int","comment":" zero on success, -1 on failure."},"description":"

Cherry-picks the given commit against the given "our" commit, producing an\n index that reflects the result of the cherry-pick.

\n","comments":"

The returned index must be freed explicitly with git_index_free.

\n","group":"cherrypick"},"git_cherrypick":{"type":"function","file":"cherrypick.h","line":81,"lineto":84,"args":[{"name":"repo","type":"git_repository *","comment":"the repository to cherry-pick"},{"name":"commit","type":"git_commit *","comment":"the commit to cherry-pick"},{"name":"cherrypick_options","type":"const git_cherrypick_options *","comment":"the cherry-pick options (or null for defaults)"}],"argline":"git_repository *repo, git_commit *commit, const git_cherrypick_options *cherrypick_options","sig":"git_repository *::git_commit *::const git_cherrypick_options *","return":{"type":"int","comment":" zero on success, -1 on failure."},"description":"

Cherry-pick the given commit, producing changes in the index and working directory.

\n","comments":"","group":"cherrypick"},"git_clone_init_options":{"type":"function","file":"clone.h","line":179,"lineto":181,"args":[{"name":"opts","type":"git_clone_options *","comment":"The `git_clone_options` struct to initialize"},{"name":"version","type":"unsigned int","comment":"Version of struct; pass `GIT_CLONE_OPTIONS_VERSION`"}],"argline":"git_clone_options *opts, unsigned int version","sig":"git_clone_options *::unsigned int","return":{"type":"int","comment":" Zero on success; -1 on failure."},"description":"

Initializes a git_clone_options with default values. Equivalent to\n creating an instance with GIT_CLONE_OPTIONS_INIT.

\n","comments":"","group":"clone"},"git_clone":{"type":"function","file":"clone.h","line":199,"lineto":203,"args":[{"name":"out","type":"git_repository **","comment":"pointer that will receive the resulting repository object"},{"name":"url","type":"const char *","comment":"the remote repository to clone"},{"name":"local_path","type":"const char *","comment":"local directory to clone to"},{"name":"options","type":"const git_clone_options *","comment":"configuration options for the clone. If NULL, the\n function works as though GIT_OPTIONS_INIT were passed."}],"argline":"git_repository **out, const char *url, const char *local_path, const git_clone_options *options","sig":"git_repository **::const char *::const char *::const git_clone_options *","return":{"type":"int","comment":" 0 on success, any non-zero return value from a callback\n function, or a negative value to indicate an error (use\n `giterr_last` for a detailed error message)"},"description":"

Clone a remote repository.

\n","comments":"

By default this creates its repository and initial remote to match\n git's defaults. You can use the options in the callback to\n customize how these are created.

\n","group":"clone","examples":{"network/clone.c":["ex/v0.23.0/network/clone.html#git_clone-1"]}},"git_commit_lookup":{"type":"function","file":"commit.h","line":36,"lineto":37,"args":[{"name":"commit","type":"git_commit **","comment":"pointer to the looked up commit"},{"name":"repo","type":"git_repository *","comment":"the repo to use when locating the commit."},{"name":"id","type":"const git_oid *","comment":"identity of the commit to locate. If the object is\n\t\tan annotated tag it will be peeled back to the commit."}],"argline":"git_commit **commit, git_repository *repo, const git_oid *id","sig":"git_commit **::git_repository *::const git_oid *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Lookup a commit object from a repository.

\n","comments":"

The returned object should be released with git_commit_free when no\n longer needed.

\n","group":"commit","examples":{"general.c":["ex/v0.23.0/general.html#git_commit_lookup-5","ex/v0.23.0/general.html#git_commit_lookup-6","ex/v0.23.0/general.html#git_commit_lookup-7"],"log.c":["ex/v0.23.0/log.html#git_commit_lookup-1"]}},"git_commit_lookup_prefix":{"type":"function","file":"commit.h","line":55,"lineto":56,"args":[{"name":"commit","type":"git_commit **","comment":"pointer to the looked up commit"},{"name":"repo","type":"git_repository *","comment":"the repo to use when locating the commit."},{"name":"id","type":"const git_oid *","comment":"identity of the commit to locate. If the object is\n\t\tan annotated tag it will be peeled back to the commit."},{"name":"len","type":"size_t","comment":"the length of the short identifier"}],"argline":"git_commit **commit, git_repository *repo, const git_oid *id, size_t len","sig":"git_commit **::git_repository *::const git_oid *::size_t","return":{"type":"int","comment":" 0 or an error code"},"description":"

Lookup a commit object from a repository, given a prefix of its\n identifier (short id).

\n","comments":"

The returned object should be released with git_commit_free when no\n longer needed.

\n","group":"commit"},"git_commit_free":{"type":"function","file":"commit.h","line":70,"lineto":70,"args":[{"name":"commit","type":"git_commit *","comment":"the commit to close"}],"argline":"git_commit *commit","sig":"git_commit *","return":{"type":"void","comment":null},"description":"

Close an open commit

\n","comments":"

This is a wrapper around git_object_free()

\n\n

IMPORTANT:\n It is necessary to call this method when you stop\n using a commit. Failure to do so will cause a memory leak.

\n","group":"commit","examples":{"general.c":["ex/v0.23.0/general.html#git_commit_free-8","ex/v0.23.0/general.html#git_commit_free-9","ex/v0.23.0/general.html#git_commit_free-10","ex/v0.23.0/general.html#git_commit_free-11"],"log.c":["ex/v0.23.0/log.html#git_commit_free-2","ex/v0.23.0/log.html#git_commit_free-3","ex/v0.23.0/log.html#git_commit_free-4","ex/v0.23.0/log.html#git_commit_free-5"]}},"git_commit_id":{"type":"function","file":"commit.h","line":78,"lineto":78,"args":[{"name":"commit","type":"const git_commit *","comment":"a previously loaded commit."}],"argline":"const git_commit *commit","sig":"const git_commit *","return":{"type":"const git_oid *","comment":" object identity for the commit."},"description":"

Get the id of a commit.

\n","comments":"","group":"commit","examples":{"general.c":["ex/v0.23.0/general.html#git_commit_id-12"],"log.c":["ex/v0.23.0/log.html#git_commit_id-6"]}},"git_commit_owner":{"type":"function","file":"commit.h","line":86,"lineto":86,"args":[{"name":"commit","type":"const git_commit *","comment":"A previously loaded commit."}],"argline":"const git_commit *commit","sig":"const git_commit *","return":{"type":"git_repository *","comment":" Repository that contains this commit."},"description":"

Get the repository that contains the commit.

\n","comments":"","group":"commit","examples":{"log.c":["ex/v0.23.0/log.html#git_commit_owner-7","ex/v0.23.0/log.html#git_commit_owner-8"]}},"git_commit_message_encoding":{"type":"function","file":"commit.h","line":98,"lineto":98,"args":[{"name":"commit","type":"const git_commit *","comment":"a previously loaded commit."}],"argline":"const git_commit *commit","sig":"const git_commit *","return":{"type":"const char *","comment":" NULL, or the encoding"},"description":"

Get the encoding for the message of a commit,\n as a string representing a standard encoding name.

\n","comments":"

The encoding may be NULL if the encoding header\n in the commit is missing; in that case UTF-8 is assumed.

\n","group":"commit"},"git_commit_message":{"type":"function","file":"commit.h","line":109,"lineto":109,"args":[{"name":"commit","type":"const git_commit *","comment":"a previously loaded commit."}],"argline":"const git_commit *commit","sig":"const git_commit *","return":{"type":"const char *","comment":" the message of a commit"},"description":"

Get the full message of a commit.

\n","comments":"

The returned message will be slightly prettified by removing any\n potential leading newlines.

\n","group":"commit","examples":{"cat-file.c":["ex/v0.23.0/cat-file.html#git_commit_message-3","ex/v0.23.0/cat-file.html#git_commit_message-4"],"general.c":["ex/v0.23.0/general.html#git_commit_message-13","ex/v0.23.0/general.html#git_commit_message-14","ex/v0.23.0/general.html#git_commit_message-15"],"log.c":["ex/v0.23.0/log.html#git_commit_message-9","ex/v0.23.0/log.html#git_commit_message-10"],"tag.c":["ex/v0.23.0/tag.html#git_commit_message-2"]}},"git_commit_message_raw":{"type":"function","file":"commit.h","line":117,"lineto":117,"args":[{"name":"commit","type":"const git_commit *","comment":"a previously loaded commit."}],"argline":"const git_commit *commit","sig":"const git_commit *","return":{"type":"const char *","comment":" the raw message of a commit"},"description":"

Get the full raw message of a commit.

\n","comments":"","group":"commit"},"git_commit_summary":{"type":"function","file":"commit.h","line":128,"lineto":128,"args":[{"name":"commit","type":"git_commit *","comment":"a previously loaded commit."}],"argline":"git_commit *commit","sig":"git_commit *","return":{"type":"const char *","comment":" the summary of a commit or NULL on error"},"description":"

Get the short "summary" of the git commit message.

\n","comments":"

The returned message is the summary of the commit, comprising the\n first paragraph of the message with whitespace trimmed and squashed.

\n","group":"commit"},"git_commit_time":{"type":"function","file":"commit.h","line":136,"lineto":136,"args":[{"name":"commit","type":"const git_commit *","comment":"a previously loaded commit."}],"argline":"const git_commit *commit","sig":"const git_commit *","return":{"type":"git_time_t","comment":" the time of a commit"},"description":"

Get the commit time (i.e. committer time) of a commit.

\n","comments":"","group":"commit","examples":{"general.c":["ex/v0.23.0/general.html#git_commit_time-16","ex/v0.23.0/general.html#git_commit_time-17"]}},"git_commit_time_offset":{"type":"function","file":"commit.h","line":144,"lineto":144,"args":[{"name":"commit","type":"const git_commit *","comment":"a previously loaded commit."}],"argline":"const git_commit *commit","sig":"const git_commit *","return":{"type":"int","comment":" positive or negative timezone offset, in minutes from UTC"},"description":"

Get the commit timezone offset (i.e. committer's preferred timezone) of a commit.

\n","comments":"","group":"commit"},"git_commit_committer":{"type":"function","file":"commit.h","line":152,"lineto":152,"args":[{"name":"commit","type":"const git_commit *","comment":"a previously loaded commit."}],"argline":"const git_commit *commit","sig":"const git_commit *","return":{"type":"const git_signature *","comment":" the committer of a commit"},"description":"

Get the committer of a commit.

\n","comments":"","group":"commit","examples":{"cat-file.c":["ex/v0.23.0/cat-file.html#git_commit_committer-5"],"general.c":["ex/v0.23.0/general.html#git_commit_committer-18"],"log.c":["ex/v0.23.0/log.html#git_commit_committer-11"]}},"git_commit_author":{"type":"function","file":"commit.h","line":160,"lineto":160,"args":[{"name":"commit","type":"const git_commit *","comment":"a previously loaded commit."}],"argline":"const git_commit *commit","sig":"const git_commit *","return":{"type":"const git_signature *","comment":" the author of a commit"},"description":"

Get the author of a commit.

\n","comments":"","group":"commit","examples":{"cat-file.c":["ex/v0.23.0/cat-file.html#git_commit_author-6"],"general.c":["ex/v0.23.0/general.html#git_commit_author-19","ex/v0.23.0/general.html#git_commit_author-20"],"log.c":["ex/v0.23.0/log.html#git_commit_author-12","ex/v0.23.0/log.html#git_commit_author-13"]}},"git_commit_raw_header":{"type":"function","file":"commit.h","line":168,"lineto":168,"args":[{"name":"commit","type":"const git_commit *","comment":"a previously loaded commit"}],"argline":"const git_commit *commit","sig":"const git_commit *","return":{"type":"const char *","comment":" the header text of the commit"},"description":"

Get the full raw text of the commit header.

\n","comments":"","group":"commit"},"git_commit_tree":{"type":"function","file":"commit.h","line":177,"lineto":177,"args":[{"name":"tree_out","type":"git_tree **","comment":"pointer where to store the tree object"},{"name":"commit","type":"const git_commit *","comment":"a previously loaded commit."}],"argline":"git_tree **tree_out, const git_commit *commit","sig":"git_tree **::const git_commit *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Get the tree pointed to by a commit.

\n","comments":"","group":"commit","examples":{"log.c":["ex/v0.23.0/log.html#git_commit_tree-14","ex/v0.23.0/log.html#git_commit_tree-15","ex/v0.23.0/log.html#git_commit_tree-16","ex/v0.23.0/log.html#git_commit_tree-17","ex/v0.23.0/log.html#git_commit_tree-18"]}},"git_commit_tree_id":{"type":"function","file":"commit.h","line":187,"lineto":187,"args":[{"name":"commit","type":"const git_commit *","comment":"a previously loaded commit."}],"argline":"const git_commit *commit","sig":"const git_commit *","return":{"type":"const git_oid *","comment":" the id of tree pointed to by commit."},"description":"

Get the id of the tree pointed to by a commit. This differs from\n git_commit_tree in that no attempts are made to fetch an object\n from the ODB.

\n","comments":"","group":"commit","examples":{"cat-file.c":["ex/v0.23.0/cat-file.html#git_commit_tree_id-7"]}},"git_commit_parentcount":{"type":"function","file":"commit.h","line":195,"lineto":195,"args":[{"name":"commit","type":"const git_commit *","comment":"a previously loaded commit."}],"argline":"const git_commit *commit","sig":"const git_commit *","return":{"type":"unsigned int","comment":" integer of count of parents"},"description":"

Get the number of parents of this commit

\n","comments":"","group":"commit","examples":{"cat-file.c":["ex/v0.23.0/cat-file.html#git_commit_parentcount-8"],"general.c":["ex/v0.23.0/general.html#git_commit_parentcount-21"],"log.c":["ex/v0.23.0/log.html#git_commit_parentcount-19","ex/v0.23.0/log.html#git_commit_parentcount-20"]}},"git_commit_parent":{"type":"function","file":"commit.h","line":205,"lineto":208,"args":[{"name":"out","type":"git_commit **","comment":"Pointer where to store the parent commit"},{"name":"commit","type":"const git_commit *","comment":"a previously loaded commit."},{"name":"n","type":"unsigned int","comment":"the position of the parent (from 0 to `parentcount`)"}],"argline":"git_commit **out, const git_commit *commit, unsigned int n","sig":"git_commit **::const git_commit *::unsigned int","return":{"type":"int","comment":" 0 or an error code"},"description":"

Get the specified parent of the commit.

\n","comments":"","group":"commit","examples":{"general.c":["ex/v0.23.0/general.html#git_commit_parent-22"],"log.c":["ex/v0.23.0/log.html#git_commit_parent-21","ex/v0.23.0/log.html#git_commit_parent-22"]}},"git_commit_parent_id":{"type":"function","file":"commit.h","line":219,"lineto":221,"args":[{"name":"commit","type":"const git_commit *","comment":"a previously loaded commit."},{"name":"n","type":"unsigned int","comment":"the position of the parent (from 0 to `parentcount`)"}],"argline":"const git_commit *commit, unsigned int n","sig":"const git_commit *::unsigned int","return":{"type":"const git_oid *","comment":" the id of the parent, NULL on error."},"description":"

Get the oid of a specified parent for a commit. This is different from\n git_commit_parent, which will attempt to load the parent commit from\n the ODB.

\n","comments":"","group":"commit","examples":{"cat-file.c":["ex/v0.23.0/cat-file.html#git_commit_parent_id-9"],"log.c":["ex/v0.23.0/log.html#git_commit_parent_id-23"]}},"git_commit_nth_gen_ancestor":{"type":"function","file":"commit.h","line":237,"lineto":240,"args":[{"name":"ancestor","type":"git_commit **","comment":"Pointer where to store the ancestor commit"},{"name":"commit","type":"const git_commit *","comment":"a previously loaded commit."},{"name":"n","type":"unsigned int","comment":"the requested generation"}],"argline":"git_commit **ancestor, const git_commit *commit, unsigned int n","sig":"git_commit **::const git_commit *::unsigned int","return":{"type":"int","comment":" 0 on success; GIT_ENOTFOUND if no matching ancestor exists\n or an error code"},"description":"

Get the commit object that is the \n<n

\n\n
\n

th generation ancestor\n of the named commit object, following only the first parents.\n The returned commit has to be freed by the caller.

\n
\n","comments":"

Passing 0 as the generation number returns another instance of the\n base commit itself.

\n","group":"commit"},"git_commit_header_field":{"type":"function","file":"commit.h","line":251,"lineto":251,"args":[{"name":"out","type":"git_buf *","comment":"the buffer to fill"},{"name":"commit","type":"const git_commit *","comment":"the commit to look in"},{"name":"field","type":"const char *","comment":"the header field to return"}],"argline":"git_buf *out, const git_commit *commit, const char *field","sig":"git_buf *::const git_commit *::const char *","return":{"type":"int","comment":" 0 on succeess, GIT_ENOTFOUND if the field does not exist,\n or an error code"},"description":"

Get an arbitrary header field

\n","comments":"","group":"commit"},"git_commit_create":{"type":"function","file":"commit.h","line":297,"lineto":307,"args":[{"name":"id","type":"git_oid *","comment":"Pointer in which to store the OID of the newly created commit"},{"name":"repo","type":"git_repository *","comment":"Repository where to store the commit"},{"name":"update_ref","type":"const char *","comment":"If not NULL, name of the reference that\n\twill be updated to point to this commit. If the reference\n\tis not direct, it will be resolved to a direct reference.\n\tUse \"HEAD\" to update the HEAD of the current branch and\n\tmake it point to this commit. If the reference doesn't\n\texist yet, it will be created. If it does exist, the first\n\tparent must be the tip of this branch."},{"name":"author","type":"const git_signature *","comment":"Signature with author and author time of commit"},{"name":"committer","type":"const git_signature *","comment":"Signature with committer and * commit time of commit"},{"name":"message_encoding","type":"const char *","comment":"The encoding for the message in the\n commit, represented with a standard encoding name.\n E.g. \"UTF-8\". If NULL, no encoding header is written and\n UTF-8 is assumed."},{"name":"message","type":"const char *","comment":"Full message for this commit"},{"name":"tree","type":"const git_tree *","comment":"An instance of a `git_tree` object that will\n be used as the tree for the commit. This tree object must\n also be owned by the given `repo`."},{"name":"parent_count","type":"size_t","comment":"Number of parents for this commit"},{"name":"parents","type":"const git_commit *[]","comment":"Array of `parent_count` pointers to `git_commit`\n objects that will be used as the parents for this commit. This\n array may be NULL if `parent_count` is 0 (root commit). All the\n given commits must be owned by the `repo`."}],"argline":"git_oid *id, git_repository *repo, const char *update_ref, const git_signature *author, const git_signature *committer, const char *message_encoding, const char *message, const git_tree *tree, size_t parent_count, const git_commit *[] parents","sig":"git_oid *::git_repository *::const char *::const git_signature *::const git_signature *::const char *::const char *::const git_tree *::size_t::const git_commit *[]","return":{"type":"int","comment":" 0 or an error code\n\tThe created commit will be written to the Object Database and\n\tthe given reference will be updated to point to it"},"description":"

Create new commit in the repository from a list of git_object pointers

\n","comments":"

The message will not be cleaned up automatically. You can do that\n with the git_message_prettify() function.

\n","group":"commit"},"git_commit_create_v":{"type":"function","file":"commit.h","line":323,"lineto":333,"args":[{"name":"id","type":"git_oid *","comment":null},{"name":"repo","type":"git_repository *","comment":null},{"name":"update_ref","type":"const char *","comment":null},{"name":"author","type":"const git_signature *","comment":null},{"name":"committer","type":"const git_signature *","comment":null},{"name":"message_encoding","type":"const char *","comment":null},{"name":"message","type":"const char *","comment":null},{"name":"tree","type":"const git_tree *","comment":null},{"name":"parent_count","type":"size_t","comment":null}],"argline":"git_oid *id, git_repository *repo, const char *update_ref, const git_signature *author, const git_signature *committer, const char *message_encoding, const char *message, const git_tree *tree, size_t parent_count","sig":"git_oid *::git_repository *::const char *::const git_signature *::const git_signature *::const char *::const char *::const git_tree *::size_t","return":{"type":"int","comment":null},"description":"

Create new commit in the repository using a variable argument list.

\n","comments":"

The message will not be cleaned up automatically. You can do that\n with the git_message_prettify() function.

\n\n

The parents for the commit are specified as a variable list of pointers\n to const git_commit *. Note that this is a convenience method which may\n not be safe to export for certain languages or compilers

\n\n

All other parameters remain the same as git_commit_create().

\n","group":"commit","examples":{"general.c":["ex/v0.23.0/general.html#git_commit_create_v-23"],"init.c":["ex/v0.23.0/init.html#git_commit_create_v-1"]}},"git_commit_amend":{"type":"function","file":"commit.h","line":356,"lineto":364,"args":[{"name":"id","type":"git_oid *","comment":null},{"name":"commit_to_amend","type":"const git_commit *","comment":null},{"name":"update_ref","type":"const char *","comment":null},{"name":"author","type":"const git_signature *","comment":null},{"name":"committer","type":"const git_signature *","comment":null},{"name":"message_encoding","type":"const char *","comment":null},{"name":"message","type":"const char *","comment":null},{"name":"tree","type":"const git_tree *","comment":null}],"argline":"git_oid *id, const git_commit *commit_to_amend, const char *update_ref, const git_signature *author, const git_signature *committer, const char *message_encoding, const char *message, const git_tree *tree","sig":"git_oid *::const git_commit *::const char *::const git_signature *::const git_signature *::const char *::const char *::const git_tree *","return":{"type":"int","comment":null},"description":"

Amend an existing commit by replacing only non-NULL values.

\n","comments":"

This creates a new commit that is exactly the same as the old commit,\n except that any non-NULL values will be updated. The new commit has\n the same parents as the old commit.

\n\n

The update_ref value works as in the regular git_commit_create(),\n updating the ref to point to the newly rewritten commit. If you want\n to amend a commit that is not currently the tip of the branch and then\n rewrite the following commits to reach a ref, pass this as NULL and\n update the rest of the commit chain and ref separately.

\n\n

Unlike git_commit_create(), the author, committer, message,\n message_encoding, and tree parameters can be NULL in which case this\n will use the values from the original commit_to_amend.

\n\n

All parameters have the same meanings as in git_commit_create().

\n","group":"commit"},"git_libgit2_version":{"type":"function","file":"common.h","line":94,"lineto":94,"args":[{"name":"major","type":"int *","comment":"Store the major version number"},{"name":"minor","type":"int *","comment":"Store the minor version number"},{"name":"rev","type":"int *","comment":"Store the revision (patch) number"}],"argline":"int *major, int *minor, int *rev","sig":"int *::int *::int *","return":{"type":"void","comment":null},"description":"

Return the version of the libgit2 library\n being currently used.

\n","comments":"","group":"libgit2"},"git_libgit2_features":{"type":"function","file":"common.h","line":124,"lineto":124,"args":[],"argline":"","sig":"","return":{"type":"int","comment":" A combination of GIT_FEATURE_* values."},"description":"

Query compile time options for libgit2.

\n","comments":"
    \n
  • GIT_FEATURE_THREADS\nLibgit2 was compiled with thread support. Note that thread support is\nstill to be seen as a 'work in progress' - basic object lookups are\nbelieved to be threadsafe, but other operations may not be.

  • \n
  • GIT_FEATURE_HTTPS\nLibgit2 supports the https:// protocol. This requires the openssl\nlibrary to be found when compiling libgit2.

  • \n
  • GIT_FEATURE_SSH\nLibgit2 supports the SSH protocol for network operations. This requires\nthe libssh2 library to be found when compiling libgit2

  • \n
\n","group":"libgit2"},"git_libgit2_opts":{"type":"function","file":"common.h","line":245,"lineto":245,"args":[{"name":"option","type":"int","comment":"Option key"}],"argline":"int option","sig":"int","return":{"type":"int","comment":" 0 on success, \n<\n0 on failure"},"description":"

Set or query a library global option

\n","comments":"

Available options:

\n\n
* opts(GIT_OPT_GET_MWINDOW_SIZE, size_t *):\n\n    > Get the maximum mmap window size\n\n* opts(GIT_OPT_SET_MWINDOW_SIZE, size_t):\n\n    > Set the maximum mmap window size\n\n* opts(GIT_OPT_GET_MWINDOW_MAPPED_LIMIT, size_t *):\n\n    > Get the maximum memory that will be mapped in total by the library\n\n* opts(GIT_OPT_SET_MWINDOW_MAPPED_LIMIT, size_t):\n\n    >Set the maximum amount of memory that can be mapped at any time\n    by the library\n\n* opts(GIT_OPT_GET_SEARCH_PATH, int level, git_buf *buf)\n\n    > Get the search path for a given level of config data.  "level" must\n    > be one of `GIT_CONFIG_LEVEL_SYSTEM`, `GIT_CONFIG_LEVEL_GLOBAL`, or\n    > `GIT_CONFIG_LEVEL_XDG`.  The search path is written to the `out`\n    > buffer.\n\n* opts(GIT_OPT_SET_SEARCH_PATH, int level, const char *path)\n\n    > Set the search path for a level of config data.  The search path\n    > applied to shared attributes and ignore files, too.\n    >\n    > - `path` lists directories delimited by GIT_PATH_LIST_SEPARATOR.\n    >   Pass NULL to reset to the default (generally based on environment\n    >   variables).  Use magic path `$PATH` to include the old value\n    >   of the path (if you want to prepend or append, for instance).\n    >\n    > - `level` must be GIT_CONFIG_LEVEL_SYSTEM, GIT_CONFIG_LEVEL_GLOBAL,\n    >   or GIT_CONFIG_LEVEL_XDG.\n\n* opts(GIT_OPT_SET_CACHE_OBJECT_LIMIT, git_otype type, size_t size)\n\n    > Set the maximum data size for the given type of object to be\n    > considered eligible for caching in memory.  Setting to value to\n    > zero means that that type of object will not be cached.\n    > Defaults to 0 for GIT_OBJ_BLOB (i.e. won't cache blobs) and 4k\n    > for GIT_OBJ_COMMIT, GIT_OBJ_TREE, and GIT_OBJ_TAG.\n\n* opts(GIT_OPT_SET_CACHE_MAX_SIZE, ssize_t max_storage_bytes)\n\n    > Set the maximum total data size that will be cached in memory\n    > across all repositories before libgit2 starts evicting objects\n    > from the cache.  This is a soft limit, in that the library might\n    > briefly exceed it, but will start aggressively evicting objects\n    > from cache when that happens.  The default cache size is 256MB.\n\n* opts(GIT_OPT_ENABLE_CACHING, int enabled)\n\n    > Enable or disable caching completely.\n    >\n    > Because caches are repository-specific, disabling the cache\n    > cannot immediately clear all cached objects, but each cache will\n    > be cleared on the next attempt to update anything in it.\n\n* opts(GIT_OPT_GET_CACHED_MEMORY, ssize_t *current, ssize_t *allowed)\n\n    > Get the current bytes in cache and the maximum that would be\n    > allowed in the cache.\n\n* opts(GIT_OPT_GET_TEMPLATE_PATH, git_buf *out)\n\n    > Get the default template path.\n    > The path is written to the `out` buffer.\n\n* opts(GIT_OPT_SET_TEMPLATE_PATH, const char *path)\n\n    > Set the default template path.\n    >\n    > - `path` directory of template.\n\n* opts(GIT_OPT_SET_SSL_CERT_LOCATIONS, const char *file, const char *path)\n\n    > Set the SSL certificate-authority locations.\n    >\n    > - `file` is the location of a file containing several\n    >   certificates concatenated together.\n    > - `path` is the location of a directory holding several\n    >   certificates, one per file.\n    >\n    > Either parameter may be `NULL`, but not both.\n
\n","group":"libgit2"},"git_config_entry_free":{"type":"function","file":"config.h","line":72,"lineto":72,"args":[{"name":"","type":"git_config_entry *","comment":null}],"argline":"git_config_entry *","sig":"git_config_entry *","return":{"type":"void","comment":null},"description":"

Free a config entry

\n","comments":"","group":"config"},"git_config_find_global":{"type":"function","file":"config.h","line":113,"lineto":113,"args":[{"name":"out","type":"git_buf *","comment":"Pointer to a user-allocated git_buf in which to store the path"}],"argline":"git_buf *out","sig":"git_buf *","return":{"type":"int","comment":" 0 if a global configuration file has been found. Its path will be stored in `out`."},"description":"

Locate the path to the global configuration file

\n","comments":"

The user or global configuration file is usually\n located in $HOME/.gitconfig.

\n\n

This method will try to guess the full path to that\n file, if the file exists. The returned path\n may be used on any git_config call to load the\n global configuration file.

\n\n

This method will not guess the path to the xdg compatible\n config file (.config/git/config).

\n","group":"config"},"git_config_find_xdg":{"type":"function","file":"config.h","line":130,"lineto":130,"args":[{"name":"out","type":"git_buf *","comment":"Pointer to a user-allocated git_buf in which to store the path"}],"argline":"git_buf *out","sig":"git_buf *","return":{"type":"int","comment":" 0 if a xdg compatible configuration file has been\n\tfound. Its path will be stored in `out`."},"description":"

Locate the path to the global xdg compatible configuration file

\n","comments":"

The xdg compatible configuration file is usually\n located in $HOME/.config/git/config.

\n\n

This method will try to guess the full path to that\n file, if the file exists. The returned path\n may be used on any git_config call to load the\n xdg compatible configuration file.

\n","group":"config"},"git_config_find_system":{"type":"function","file":"config.h","line":142,"lineto":142,"args":[{"name":"out","type":"git_buf *","comment":"Pointer to a user-allocated git_buf in which to store the path"}],"argline":"git_buf *out","sig":"git_buf *","return":{"type":"int","comment":" 0 if a system configuration file has been\n\tfound. Its path will be stored in `out`."},"description":"

Locate the path to the system configuration file

\n","comments":"

If /etc/gitconfig doesn't exist, it will look for\n %PROGRAMFILES%

\n\n

.

\n","group":"config"},"git_config_open_default":{"type":"function","file":"config.h","line":154,"lineto":154,"args":[{"name":"out","type":"git_config **","comment":"Pointer to store the config instance"}],"argline":"git_config **out","sig":"git_config **","return":{"type":"int","comment":" 0 or an error code"},"description":"

Open the global, XDG and system configuration files

\n","comments":"

Utility wrapper that finds the global, XDG and system configuration files\n and opens them into a single prioritized config object that can be\n used when accessing default config data outside a repository.

\n","group":"config"},"git_config_new":{"type":"function","file":"config.h","line":165,"lineto":165,"args":[{"name":"out","type":"git_config **","comment":"pointer to the new configuration"}],"argline":"git_config **out","sig":"git_config **","return":{"type":"int","comment":" 0 or an error code"},"description":"

Allocate a new configuration object

\n","comments":"

This object is empty, so you have to add a file to it before you\n can do anything with it.

\n","group":"config"},"git_config_add_file_ondisk":{"type":"function","file":"config.h","line":189,"lineto":193,"args":[{"name":"cfg","type":"git_config *","comment":"the configuration to add the file to"},{"name":"path","type":"const char *","comment":"path to the configuration file to add"},{"name":"level","type":"git_config_level_t","comment":"the priority level of the backend"},{"name":"force","type":"int","comment":"replace config file at the given priority level"}],"argline":"git_config *cfg, const char *path, git_config_level_t level, int force","sig":"git_config *::const char *::git_config_level_t::int","return":{"type":"int","comment":" 0 on success, GIT_EEXISTS when adding more than one file\n for a given priority level (and force_replace set to 0),\n GIT_ENOTFOUND when the file doesn't exist or error code"},"description":"

Add an on-disk config file instance to an existing config

\n","comments":"

The on-disk file pointed at by path will be opened and\n parsed; it's expected to be a native Git config file following\n the default Git config syntax (see man git-config).

\n\n

Note that the configuration object will free the file\n automatically.

\n\n

Further queries on this config object will access each\n of the config file instances in order (instances with\n a higher priority level will be accessed first).

\n","group":"config"},"git_config_open_ondisk":{"type":"function","file":"config.h","line":208,"lineto":208,"args":[{"name":"out","type":"git_config **","comment":"The configuration instance to create"},{"name":"path","type":"const char *","comment":"Path to the on-disk file to open"}],"argline":"git_config **out, const char *path","sig":"git_config **::const char *","return":{"type":"int","comment":" 0 on success, GIT_ENOTFOUND when the file doesn't exist\n or an error code"},"description":"

Create a new config instance containing a single on-disk file

\n","comments":"

This method is a simple utility wrapper for the following sequence\n of calls:\n - git_config_new\n - git_config_add_file_ondisk

\n","group":"config","examples":{"general.c":["ex/v0.23.0/general.html#git_config_open_ondisk-24"]}},"git_config_open_level":{"type":"function","file":"config.h","line":226,"lineto":229,"args":[{"name":"out","type":"git_config **","comment":"The configuration instance to create"},{"name":"parent","type":"const git_config *","comment":"Multi-level config to search for the given level"},{"name":"level","type":"git_config_level_t","comment":"Configuration level to search for"}],"argline":"git_config **out, const git_config *parent, git_config_level_t level","sig":"git_config **::const git_config *::git_config_level_t","return":{"type":"int","comment":" 0, GIT_ENOTFOUND if the passed level cannot be found in the\n multi-level parent config, or an error code"},"description":"

Build a single-level focused config object from a multi-level one.

\n","comments":"

The returned config object can be used to perform get/set/delete operations\n on a single specific level.

\n\n

Getting several times the same level from the same parent multi-level config\n will return different config instances, but containing the same config_file\n instance.

\n","group":"config"},"git_config_open_global":{"type":"function","file":"config.h","line":243,"lineto":243,"args":[{"name":"out","type":"git_config **","comment":"pointer in which to store the config object"},{"name":"config","type":"git_config *","comment":"the config object in which to look"}],"argline":"git_config **out, git_config *config","sig":"git_config **::git_config *","return":{"type":"int","comment":null},"description":"

Open the global/XDG configuration file according to git's rules

\n","comments":"

Git allows you to store your global configuration at\n $HOME/.config or $XDG_CONFIG_HOME/git/config. For backwards\n compatability, the XDG file shouldn't be used unless the use has\n created it explicitly. With this function you'll open the correct\n one to write to.

\n","group":"config"},"git_config_snapshot":{"type":"function","file":"config.h","line":259,"lineto":259,"args":[{"name":"out","type":"git_config **","comment":"pointer in which to store the snapshot config object"},{"name":"config","type":"git_config *","comment":"configuration to snapshot"}],"argline":"git_config **out, git_config *config","sig":"git_config **::git_config *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Create a snapshot of the configuration

\n","comments":"

Create a snapshot of the current state of a configuration, which\n allows you to look into a consistent view of the configuration for\n looking up complex values (e.g. a remote, submodule).

\n\n

The string returned when querying such a config object is valid\n until it is freed.

\n","group":"config"},"git_config_free":{"type":"function","file":"config.h","line":266,"lineto":266,"args":[{"name":"cfg","type":"git_config *","comment":"the configuration to free"}],"argline":"git_config *cfg","sig":"git_config *","return":{"type":"void","comment":null},"description":"

Free the configuration and its associated memory and files

\n","comments":"","group":"config"},"git_config_get_entry":{"type":"function","file":"config.h","line":278,"lineto":281,"args":[{"name":"out","type":"git_config_entry **","comment":"pointer to the variable git_config_entry"},{"name":"cfg","type":"const git_config *","comment":"where to look for the variable"},{"name":"name","type":"const char *","comment":"the variable's name"}],"argline":"git_config_entry **out, const git_config *cfg, const char *name","sig":"git_config_entry **::const git_config *::const char *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Get the git_config_entry of a config variable.

\n","comments":"

Free the git_config_entry after use with git_config_entry_free().

\n","group":"config"},"git_config_get_int32":{"type":"function","file":"config.h","line":295,"lineto":295,"args":[{"name":"out","type":"int32_t *","comment":"pointer to the variable where the value should be stored"},{"name":"cfg","type":"const git_config *","comment":"where to look for the variable"},{"name":"name","type":"const char *","comment":"the variable's name"}],"argline":"int32_t *out, const git_config *cfg, const char *name","sig":"int32_t *::const git_config *::const char *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Get the value of an integer config variable.

\n","comments":"

All config files will be looked into, in the order of their\n defined level. A higher level means a higher priority. The\n first occurrence of the variable will be returned here.

\n","group":"config","examples":{"general.c":["ex/v0.23.0/general.html#git_config_get_int32-25"]}},"git_config_get_int64":{"type":"function","file":"config.h","line":309,"lineto":309,"args":[{"name":"out","type":"int64_t *","comment":"pointer to the variable where the value should be stored"},{"name":"cfg","type":"const git_config *","comment":"where to look for the variable"},{"name":"name","type":"const char *","comment":"the variable's name"}],"argline":"int64_t *out, const git_config *cfg, const char *name","sig":"int64_t *::const git_config *::const char *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Get the value of a long integer config variable.

\n","comments":"

All config files will be looked into, in the order of their\n defined level. A higher level means a higher priority. The\n first occurrence of the variable will be returned here.

\n","group":"config"},"git_config_get_bool":{"type":"function","file":"config.h","line":326,"lineto":326,"args":[{"name":"out","type":"int *","comment":"pointer to the variable where the value should be stored"},{"name":"cfg","type":"const git_config *","comment":"where to look for the variable"},{"name":"name","type":"const char *","comment":"the variable's name"}],"argline":"int *out, const git_config *cfg, const char *name","sig":"int *::const git_config *::const char *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Get the value of a boolean config variable.

\n","comments":"

This function uses the usual C convention of 0 being false and\n anything else true.

\n\n

All config files will be looked into, in the order of their\n defined level. A higher level means a higher priority. The\n first occurrence of the variable will be returned here.

\n","group":"config"},"git_config_get_path":{"type":"function","file":"config.h","line":344,"lineto":344,"args":[{"name":"out","type":"git_buf *","comment":"the buffer in which to store the result"},{"name":"cfg","type":"const git_config *","comment":"where to look for the variable"},{"name":"name","type":"const char *","comment":"the variable's name"}],"argline":"git_buf *out, const git_config *cfg, const char *name","sig":"git_buf *::const git_config *::const char *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Get the value of a path config variable.

\n","comments":"

A leading '~' will be expanded to the global search path (which\n defaults to the user's home directory but can be overridden via\n git_libgit2_opts().

\n\n

All config files will be looked into, in the order of their\n defined level. A higher level means a higher priority. The\n first occurrence of the variable will be returned here.

\n","group":"config"},"git_config_get_string":{"type":"function","file":"config.h","line":362,"lineto":362,"args":[{"name":"out","type":"const char **","comment":"pointer to the string"},{"name":"cfg","type":"const git_config *","comment":"where to look for the variable"},{"name":"name","type":"const char *","comment":"the variable's name"}],"argline":"const char **out, const git_config *cfg, const char *name","sig":"const char **::const git_config *::const char *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Get the value of a string config variable.

\n","comments":"

This function can only be used on snapshot config objects. The\n string is owned by the config and should not be freed by the\n user. The pointer will be valid until the config is freed.

\n\n

All config files will be looked into, in the order of their\n defined level. A higher level means a higher priority. The\n first occurrence of the variable will be returned here.

\n","group":"config","examples":{"general.c":["ex/v0.23.0/general.html#git_config_get_string-26"]}},"git_config_get_string_buf":{"type":"function","file":"config.h","line":378,"lineto":378,"args":[{"name":"out","type":"git_buf *","comment":"buffer in which to store the string"},{"name":"cfg","type":"const git_config *","comment":"where to look for the variable"},{"name":"name","type":"const char *","comment":"the variable's name"}],"argline":"git_buf *out, const git_config *cfg, const char *name","sig":"git_buf *::const git_config *::const char *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Get the value of a string config variable.

\n","comments":"

The value of the config will be copied into the buffer.

\n\n

All config files will be looked into, in the order of their\n defined level. A higher level means a higher priority. The\n first occurrence of the variable will be returned here.

\n","group":"config"},"git_config_get_multivar_foreach":{"type":"function","file":"config.h","line":392,"lineto":392,"args":[{"name":"cfg","type":"const git_config *","comment":"where to look for the variable"},{"name":"name","type":"const char *","comment":"the variable's name"},{"name":"regexp","type":"const char *","comment":"regular expression to filter which variables we're\n interested in. Use NULL to indicate all"},{"name":"callback","type":"git_config_foreach_cb","comment":"the function to be called on each value of the variable"},{"name":"payload","type":"void *","comment":"opaque pointer to pass to the callback"}],"argline":"const git_config *cfg, const char *name, const char *regexp, git_config_foreach_cb callback, void *payload","sig":"const git_config *::const char *::const char *::git_config_foreach_cb::void *","return":{"type":"int","comment":null},"description":"

Get each value of a multivar in a foreach callback

\n","comments":"

The callback will be called on each variable found

\n","group":"config"},"git_config_multivar_iterator_new":{"type":"function","file":"config.h","line":403,"lineto":403,"args":[{"name":"out","type":"git_config_iterator **","comment":"pointer to store the iterator"},{"name":"cfg","type":"const git_config *","comment":"where to look for the variable"},{"name":"name","type":"const char *","comment":"the variable's name"},{"name":"regexp","type":"const char *","comment":"regular expression to filter which variables we're\n interested in. Use NULL to indicate all"}],"argline":"git_config_iterator **out, const git_config *cfg, const char *name, const char *regexp","sig":"git_config_iterator **::const git_config *::const char *::const char *","return":{"type":"int","comment":null},"description":"

Get each value of a multivar

\n","comments":"","group":"config"},"git_config_next":{"type":"function","file":"config.h","line":415,"lineto":415,"args":[{"name":"entry","type":"git_config_entry **","comment":"pointer to store the entry"},{"name":"iter","type":"git_config_iterator *","comment":"the iterator"}],"argline":"git_config_entry **entry, git_config_iterator *iter","sig":"git_config_entry **::git_config_iterator *","return":{"type":"int","comment":" 0 or an error code. GIT_ITEROVER if the iteration has completed"},"description":"

Return the current entry and advance the iterator

\n","comments":"

The pointers returned by this function are valid until the iterator\n is freed.

\n","group":"config"},"git_config_iterator_free":{"type":"function","file":"config.h","line":422,"lineto":422,"args":[{"name":"iter","type":"git_config_iterator *","comment":"the iterator to free"}],"argline":"git_config_iterator *iter","sig":"git_config_iterator *","return":{"type":"void","comment":null},"description":"

Free a config iterator

\n","comments":"","group":"config"},"git_config_set_int32":{"type":"function","file":"config.h","line":433,"lineto":433,"args":[{"name":"cfg","type":"git_config *","comment":"where to look for the variable"},{"name":"name","type":"const char *","comment":"the variable's name"},{"name":"value","type":"int32_t","comment":"Integer value for the variable"}],"argline":"git_config *cfg, const char *name, int32_t value","sig":"git_config *::const char *::int32_t","return":{"type":"int","comment":" 0 or an error code"},"description":"

Set the value of an integer config variable in the config file\n with the highest level (usually the local one).

\n","comments":"","group":"config"},"git_config_set_int64":{"type":"function","file":"config.h","line":444,"lineto":444,"args":[{"name":"cfg","type":"git_config *","comment":"where to look for the variable"},{"name":"name","type":"const char *","comment":"the variable's name"},{"name":"value","type":"int64_t","comment":"Long integer value for the variable"}],"argline":"git_config *cfg, const char *name, int64_t value","sig":"git_config *::const char *::int64_t","return":{"type":"int","comment":" 0 or an error code"},"description":"

Set the value of a long integer config variable in the config file\n with the highest level (usually the local one).

\n","comments":"","group":"config"},"git_config_set_bool":{"type":"function","file":"config.h","line":455,"lineto":455,"args":[{"name":"cfg","type":"git_config *","comment":"where to look for the variable"},{"name":"name","type":"const char *","comment":"the variable's name"},{"name":"value","type":"int","comment":"the value to store"}],"argline":"git_config *cfg, const char *name, int value","sig":"git_config *::const char *::int","return":{"type":"int","comment":" 0 or an error code"},"description":"

Set the value of a boolean config variable in the config file\n with the highest level (usually the local one).

\n","comments":"","group":"config"},"git_config_set_string":{"type":"function","file":"config.h","line":469,"lineto":469,"args":[{"name":"cfg","type":"git_config *","comment":"where to look for the variable"},{"name":"name","type":"const char *","comment":"the variable's name"},{"name":"value","type":"const char *","comment":"the string to store."}],"argline":"git_config *cfg, const char *name, const char *value","sig":"git_config *::const char *::const char *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Set the value of a string config variable in the config file\n with the highest level (usually the local one).

\n","comments":"

A copy of the string is made and the user is free to use it\n afterwards.

\n","group":"config"},"git_config_set_multivar":{"type":"function","file":"config.h","line":479,"lineto":479,"args":[{"name":"cfg","type":"git_config *","comment":"where to look for the variable"},{"name":"name","type":"const char *","comment":"the variable's name"},{"name":"regexp","type":"const char *","comment":"a regular expression to indicate which values to replace"},{"name":"value","type":"const char *","comment":"the new value."}],"argline":"git_config *cfg, const char *name, const char *regexp, const char *value","sig":"git_config *::const char *::const char *::const char *","return":{"type":"int","comment":null},"description":"

Set a multivar in the local config file.

\n","comments":"","group":"config"},"git_config_delete_entry":{"type":"function","file":"config.h","line":488,"lineto":488,"args":[{"name":"cfg","type":"git_config *","comment":"the configuration"},{"name":"name","type":"const char *","comment":"the variable to delete"}],"argline":"git_config *cfg, const char *name","sig":"git_config *::const char *","return":{"type":"int","comment":null},"description":"

Delete a config variable from the config file\n with the highest level (usually the local one).

\n","comments":"","group":"config"},"git_config_delete_multivar":{"type":"function","file":"config.h","line":499,"lineto":499,"args":[{"name":"cfg","type":"git_config *","comment":"where to look for the variables"},{"name":"name","type":"const char *","comment":"the variable's name"},{"name":"regexp","type":"const char *","comment":"a regular expression to indicate which values to delete"}],"argline":"git_config *cfg, const char *name, const char *regexp","sig":"git_config *::const char *::const char *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Deletes one or several entries from a multivar in the local config file.

\n","comments":"","group":"config"},"git_config_foreach":{"type":"function","file":"config.h","line":517,"lineto":520,"args":[{"name":"cfg","type":"const git_config *","comment":"where to get the variables from"},{"name":"callback","type":"git_config_foreach_cb","comment":"the function to call on each variable"},{"name":"payload","type":"void *","comment":"the data to pass to the callback"}],"argline":"const git_config *cfg, git_config_foreach_cb callback, void *payload","sig":"const git_config *::git_config_foreach_cb::void *","return":{"type":"int","comment":" 0 on success, non-zero callback return value, or error code"},"description":"

Perform an operation on each config variable.

\n","comments":"

The callback receives the normalized name and value of each variable\n in the config backend, and the data pointer passed to this function.\n If the callback returns a non-zero value, the function stops iterating\n and returns that value to the caller.

\n\n

The pointers passed to the callback are only valid as long as the\n iteration is ongoing.

\n","group":"config"},"git_config_iterator_new":{"type":"function","file":"config.h","line":531,"lineto":531,"args":[{"name":"out","type":"git_config_iterator **","comment":"pointer to store the iterator"},{"name":"cfg","type":"const git_config *","comment":"where to ge the variables from"}],"argline":"git_config_iterator **out, const git_config *cfg","sig":"git_config_iterator **::const git_config *","return":{"type":"int","comment":null},"description":"

Iterate over all the config variables

\n","comments":"

Use git_config_next to advance the iteration and\n git_config_iterator_free when done.

\n","group":"config"},"git_config_iterator_glob_new":{"type":"function","file":"config.h","line":543,"lineto":543,"args":[{"name":"out","type":"git_config_iterator **","comment":"pointer to store the iterator"},{"name":"cfg","type":"const git_config *","comment":"where to ge the variables from"},{"name":"regexp","type":"const char *","comment":"regular expression to match the names"}],"argline":"git_config_iterator **out, const git_config *cfg, const char *regexp","sig":"git_config_iterator **::const git_config *::const char *","return":{"type":"int","comment":null},"description":"

Iterate over all the config variables whose name matches a pattern

\n","comments":"

Use git_config_next to advance the iteration and\n git_config_iterator_free when done.

\n","group":"config"},"git_config_foreach_match":{"type":"function","file":"config.h","line":561,"lineto":565,"args":[{"name":"cfg","type":"const git_config *","comment":"where to get the variables from"},{"name":"regexp","type":"const char *","comment":"regular expression to match against config names"},{"name":"callback","type":"git_config_foreach_cb","comment":"the function to call on each variable"},{"name":"payload","type":"void *","comment":"the data to pass to the callback"}],"argline":"const git_config *cfg, const char *regexp, git_config_foreach_cb callback, void *payload","sig":"const git_config *::const char *::git_config_foreach_cb::void *","return":{"type":"int","comment":" 0 or the return value of the callback which didn't return 0"},"description":"

Perform an operation on each config variable matching a regular expression.

\n","comments":"

This behaviors like git_config_foreach with an additional filter of a\n regular expression that filters which config keys are passed to the\n callback.

\n\n

The pointers passed to the callback are only valid as long as the\n iteration is ongoing.

\n","group":"config"},"git_config_get_mapped":{"type":"function","file":"config.h","line":601,"lineto":606,"args":[{"name":"out","type":"int *","comment":"place to store the result of the mapping"},{"name":"cfg","type":"const git_config *","comment":"config file to get the variables from"},{"name":"name","type":"const char *","comment":"name of the config variable to lookup"},{"name":"maps","type":"const git_cvar_map *","comment":"array of `git_cvar_map` objects specifying the possible mappings"},{"name":"map_n","type":"size_t","comment":"number of mapping objects in `maps`"}],"argline":"int *out, const git_config *cfg, const char *name, const git_cvar_map *maps, size_t map_n","sig":"int *::const git_config *::const char *::const git_cvar_map *::size_t","return":{"type":"int","comment":" 0 on success, error code otherwise"},"description":"

Query the value of a config variable and return it mapped to\n an integer constant.

\n","comments":"

This is a helper method to easily map different possible values\n to a variable to integer constants that easily identify them.

\n\n

A mapping array looks as follows:

\n\n
git_cvar_map autocrlf_mapping[] = {\n    {GIT_CVAR_FALSE, NULL, GIT_AUTO_CRLF_FALSE},\n    {GIT_CVAR_TRUE, NULL, GIT_AUTO_CRLF_TRUE},\n    {GIT_CVAR_STRING, "input", GIT_AUTO_CRLF_INPUT},\n    {GIT_CVAR_STRING, "default", GIT_AUTO_CRLF_DEFAULT}};\n
\n\n

On any "false" value for the variable (e.g. "false", "FALSE", "no"), the\n mapping will store GIT_AUTO_CRLF_FALSE in the out parameter.

\n\n

The same thing applies for any "true" value such as "true", "yes" or "1", storing\n the GIT_AUTO_CRLF_TRUE variable.

\n\n

Otherwise, if the value matches the string "input" (with case insensitive comparison),\n the given constant will be stored in out, and likewise for "default".

\n\n

If not a single match can be made to store in out, an error code will be\n returned.

\n","group":"config"},"git_config_lookup_map_value":{"type":"function","file":"config.h","line":616,"lineto":620,"args":[{"name":"out","type":"int *","comment":"place to store the result of the parsing"},{"name":"maps","type":"const git_cvar_map *","comment":"array of `git_cvar_map` objects specifying the possible mappings"},{"name":"map_n","type":"size_t","comment":"number of mapping objects in `maps`"},{"name":"value","type":"const char *","comment":"value to parse"}],"argline":"int *out, const git_cvar_map *maps, size_t map_n, const char *value","sig":"int *::const git_cvar_map *::size_t::const char *","return":{"type":"int","comment":null},"description":"

Maps a string value to an integer constant

\n","comments":"","group":"config"},"git_config_parse_bool":{"type":"function","file":"config.h","line":632,"lineto":632,"args":[{"name":"out","type":"int *","comment":"place to store the result of the parsing"},{"name":"value","type":"const char *","comment":"value to parse"}],"argline":"int *out, const char *value","sig":"int *::const char *","return":{"type":"int","comment":null},"description":"

Parse a string value as a bool.

\n","comments":"

Valid values for true are: 'true', 'yes', 'on', 1 or any\n number different from 0\n Valid values for false are: 'false', 'no', 'off', 0

\n","group":"config"},"git_config_parse_int32":{"type":"function","file":"config.h","line":644,"lineto":644,"args":[{"name":"out","type":"int32_t *","comment":"place to store the result of the parsing"},{"name":"value","type":"const char *","comment":"value to parse"}],"argline":"int32_t *out, const char *value","sig":"int32_t *::const char *","return":{"type":"int","comment":null},"description":"

Parse a string value as an int32.

\n","comments":"

An optional value suffix of 'k', 'm', or 'g' will\n cause the value to be multiplied by 1024, 1048576,\n or 1073741824 prior to output.

\n","group":"config"},"git_config_parse_int64":{"type":"function","file":"config.h","line":656,"lineto":656,"args":[{"name":"out","type":"int64_t *","comment":"place to store the result of the parsing"},{"name":"value","type":"const char *","comment":"value to parse"}],"argline":"int64_t *out, const char *value","sig":"int64_t *::const char *","return":{"type":"int","comment":null},"description":"

Parse a string value as an int64.

\n","comments":"

An optional value suffix of 'k', 'm', or 'g' will\n cause the value to be multiplied by 1024, 1048576,\n or 1073741824 prior to output.

\n","group":"config"},"git_config_parse_path":{"type":"function","file":"config.h","line":671,"lineto":671,"args":[{"name":"out","type":"git_buf *","comment":"placae to store the result of parsing"},{"name":"value","type":"const char *","comment":"the path to evaluate"}],"argline":"git_buf *out, const char *value","sig":"git_buf *::const char *","return":{"type":"int","comment":null},"description":"

Parse a string value as a path.

\n","comments":"

A leading '~' will be expanded to the global search path (which\n defaults to the user's home directory but can be overridden via\n git_libgit2_opts().

\n\n

If the value does not begin with a tilde, the input will be\n returned.

\n","group":"config"},"git_config_backend_foreach_match":{"type":"function","file":"config.h","line":685,"lineto":689,"args":[{"name":"backend","type":"git_config_backend *","comment":"where to get the variables from"},{"name":"regexp","type":"const char *","comment":"regular expression to match against config names (can be NULL)"},{"name":"callback","type":"git_config_foreach_cb","comment":"the function to call on each variable"},{"name":"payload","type":"void *","comment":"the data to pass to the callback"}],"argline":"git_config_backend *backend, const char *regexp, git_config_foreach_cb callback, void *payload","sig":"git_config_backend *::const char *::git_config_foreach_cb::void *","return":{"type":"int","comment":null},"description":"

Perform an operation on each config variable in given config backend\n matching a regular expression.

\n","comments":"

This behaviors like git_config_foreach_match except instead of all config\n entries it just enumerates through the given backend entry.

\n","group":"config"},"git_cred_userpass":{"type":"function","file":"cred_helpers.h","line":43,"lineto":48,"args":[{"name":"cred","type":"git_cred **","comment":"The newly created credential object."},{"name":"url","type":"const char *","comment":"The resource for which we are demanding a credential."},{"name":"user_from_url","type":"const char *","comment":"The username that was embedded in a \"user"},{"name":"allowed_types","type":"unsigned int","comment":"A bitmask stating which cred types are OK to return."},{"name":"payload","type":"void *","comment":"The payload provided when specifying this callback. (This is\n interpreted as a `git_cred_userpass_payload*`.)"}],"argline":"git_cred **cred, const char *url, const char *user_from_url, unsigned int allowed_types, void *payload","sig":"git_cred **::const char *::const char *::unsigned int::void *","return":{"type":"int","comment":null},"description":"

Stock callback usable as a git_cred_acquire_cb. This calls\n git_cred_userpass_plaintext_new unless the protocol has not specified\n GIT_CREDTYPE_USERPASS_PLAINTEXT as an allowed type.

\n","comments":"","group":"cred"},"git_describe_commit":{"type":"function","file":"describe.h","line":120,"lineto":123,"args":[{"name":"result","type":"git_describe_result **","comment":"pointer to store the result. You must free this once\n you're done with it."},{"name":"committish","type":"git_object *","comment":"a committish to describe"},{"name":"opts","type":"git_describe_options *","comment":"the lookup options"}],"argline":"git_describe_result **result, git_object *committish, git_describe_options *opts","sig":"git_describe_result **::git_object *::git_describe_options *","return":{"type":"int","comment":null},"description":"

Describe a commit

\n","comments":"

Perform the describe operation on the given committish object.

\n","group":"describe","examples":{"describe.c":["ex/v0.23.0/describe.html#git_describe_commit-1"]}},"git_describe_workdir":{"type":"function","file":"describe.h","line":137,"lineto":140,"args":[{"name":"out","type":"git_describe_result **","comment":"pointer to store the result. You must free this once\n you're done with it."},{"name":"repo","type":"git_repository *","comment":"the repository in which to perform the describe"},{"name":"opts","type":"git_describe_options *","comment":"the lookup options"}],"argline":"git_describe_result **out, git_repository *repo, git_describe_options *opts","sig":"git_describe_result **::git_repository *::git_describe_options *","return":{"type":"int","comment":null},"description":"

Describe a commit

\n","comments":"

Perform the describe operation on the current commit and the\n worktree. After peforming describe on HEAD, a status is run and the\n description is considered to be dirty if there are.

\n","group":"describe","examples":{"describe.c":["ex/v0.23.0/describe.html#git_describe_workdir-2"]}},"git_describe_format":{"type":"function","file":"describe.h","line":150,"lineto":153,"args":[{"name":"out","type":"git_buf *","comment":"The buffer to store the result"},{"name":"result","type":"const git_describe_result *","comment":"the result from `git_describe_commit()` or\n `git_describe_workdir()`."},{"name":"opts","type":"const git_describe_format_options *","comment":"the formatting options"}],"argline":"git_buf *out, const git_describe_result *result, const git_describe_format_options *opts","sig":"git_buf *::const git_describe_result *::const git_describe_format_options *","return":{"type":"int","comment":null},"description":"

Print the describe result to a buffer

\n","comments":"","group":"describe","examples":{"describe.c":["ex/v0.23.0/describe.html#git_describe_format-3"]}},"git_describe_result_free":{"type":"function","file":"describe.h","line":158,"lineto":158,"args":[{"name":"result","type":"git_describe_result *","comment":null}],"argline":"git_describe_result *result","sig":"git_describe_result *","return":{"type":"void","comment":null},"description":"

Free the describe result.

\n","comments":"","group":"describe"},"git_diff_init_options":{"type":"function","file":"diff.h","line":412,"lineto":414,"args":[{"name":"opts","type":"git_diff_options *","comment":"The `git_diff_options` struct to initialize"},{"name":"version","type":"unsigned int","comment":"Version of struct; pass `GIT_DIFF_OPTIONS_VERSION`"}],"argline":"git_diff_options *opts, unsigned int version","sig":"git_diff_options *::unsigned int","return":{"type":"int","comment":" Zero on success; -1 on failure."},"description":"

Initializes a git_diff_options with default values. Equivalent to\n creating an instance with GIT_DIFF_OPTIONS_INIT.

\n","comments":"","group":"diff"},"git_diff_find_init_options":{"type":"function","file":"diff.h","line":697,"lineto":699,"args":[{"name":"opts","type":"git_diff_find_options *","comment":"The `git_diff_find_options` struct to initialize"},{"name":"version","type":"unsigned int","comment":"Version of struct; pass `GIT_DIFF_FIND_OPTIONS_VERSION`"}],"argline":"git_diff_find_options *opts, unsigned int version","sig":"git_diff_find_options *::unsigned int","return":{"type":"int","comment":" Zero on success; -1 on failure."},"description":"

Initializes a git_diff_find_options with default values. Equivalent to\n creating an instance with GIT_DIFF_FIND_OPTIONS_INIT.

\n","comments":"","group":"diff"},"git_diff_free":{"type":"function","file":"diff.h","line":713,"lineto":713,"args":[{"name":"diff","type":"git_diff *","comment":"The previously created diff; cannot be used after free."}],"argline":"git_diff *diff","sig":"git_diff *","return":{"type":"void","comment":null},"description":"

Deallocate a diff.

\n","comments":"","group":"diff","examples":{"diff.c":["ex/v0.23.0/diff.html#git_diff_free-2"],"log.c":["ex/v0.23.0/log.html#git_diff_free-24","ex/v0.23.0/log.html#git_diff_free-25"]}},"git_diff_tree_to_tree":{"type":"function","file":"diff.h","line":731,"lineto":736,"args":[{"name":"diff","type":"git_diff **","comment":"Output pointer to a git_diff pointer to be allocated."},{"name":"repo","type":"git_repository *","comment":"The repository containing the trees."},{"name":"old_tree","type":"git_tree *","comment":"A git_tree object to diff from, or NULL for empty tree."},{"name":"new_tree","type":"git_tree *","comment":"A git_tree object to diff to, or NULL for empty tree."},{"name":"opts","type":"const git_diff_options *","comment":"Structure with options to influence diff or NULL for defaults."}],"argline":"git_diff **diff, git_repository *repo, git_tree *old_tree, git_tree *new_tree, const git_diff_options *opts","sig":"git_diff **::git_repository *::git_tree *::git_tree *::const git_diff_options *","return":{"type":"int","comment":null},"description":"

Create a diff with the difference between two tree objects.

\n","comments":"

This is equivalent to git diff \n<old\n-tree> \n<new\n-tree>

\n\n

The first tree will be used for the "old_file" side of the delta and the\n second tree will be used for the "new_file" side of the delta. You can\n pass NULL to indicate an empty tree, although it is an error to pass\n NULL for both the old_tree and new_tree.

\n","group":"diff","examples":{"diff.c":["ex/v0.23.0/diff.html#git_diff_tree_to_tree-3"],"log.c":["ex/v0.23.0/log.html#git_diff_tree_to_tree-26","ex/v0.23.0/log.html#git_diff_tree_to_tree-27"]}},"git_diff_tree_to_index":{"type":"function","file":"diff.h","line":757,"lineto":762,"args":[{"name":"diff","type":"git_diff **","comment":"Output pointer to a git_diff pointer to be allocated."},{"name":"repo","type":"git_repository *","comment":"The repository containing the tree and index."},{"name":"old_tree","type":"git_tree *","comment":"A git_tree object to diff from, or NULL for empty tree."},{"name":"index","type":"git_index *","comment":"The index to diff with; repo index used if NULL."},{"name":"opts","type":"const git_diff_options *","comment":"Structure with options to influence diff or NULL for defaults."}],"argline":"git_diff **diff, git_repository *repo, git_tree *old_tree, git_index *index, const git_diff_options *opts","sig":"git_diff **::git_repository *::git_tree *::git_index *::const git_diff_options *","return":{"type":"int","comment":null},"description":"

Create a diff between a tree and repository index.

\n","comments":"

This is equivalent to `git diff --cached \n<treeish

\n\n
\n

or if you pass\n the HEAD tree, then likegit diff --cached`.

\n
\n\n

The tree you pass will be used for the "old_file" side of the delta, and\n the index will be used for the "new_file" side of the delta.

\n\n

If you pass NULL for the index, then the existing index of the repo\n will be used. In this case, the index will be refreshed from disk\n (if it has changed) before the diff is generated.

\n","group":"diff","examples":{"diff.c":["ex/v0.23.0/diff.html#git_diff_tree_to_index-4"]}},"git_diff_index_to_workdir":{"type":"function","file":"diff.h","line":784,"lineto":788,"args":[{"name":"diff","type":"git_diff **","comment":"Output pointer to a git_diff pointer to be allocated."},{"name":"repo","type":"git_repository *","comment":"The repository."},{"name":"index","type":"git_index *","comment":"The index to diff from; repo index used if NULL."},{"name":"opts","type":"const git_diff_options *","comment":"Structure with options to influence diff or NULL for defaults."}],"argline":"git_diff **diff, git_repository *repo, git_index *index, const git_diff_options *opts","sig":"git_diff **::git_repository *::git_index *::const git_diff_options *","return":{"type":"int","comment":null},"description":"

Create a diff between the repository index and the workdir directory.

\n","comments":"

This matches the git diff command. See the note below on\n git_diff_tree_to_workdir for a discussion of the difference between\n git diff and git diff HEAD and how to emulate a `git diff \n<treeish

\n\n
\n

`\n using libgit2.

\n
\n\n

The index will be used for the "old_file" side of the delta, and the\n working directory will be used for the "new_file" side of the delta.

\n\n

If you pass NULL for the index, then the existing index of the repo\n will be used. In this case, the index will be refreshed from disk\n (if it has changed) before the diff is generated.

\n","group":"diff","examples":{"diff.c":["ex/v0.23.0/diff.html#git_diff_index_to_workdir-5"]}},"git_diff_tree_to_workdir":{"type":"function","file":"diff.h","line":813,"lineto":817,"args":[{"name":"diff","type":"git_diff **","comment":"A pointer to a git_diff pointer that will be allocated."},{"name":"repo","type":"git_repository *","comment":"The repository containing the tree."},{"name":"old_tree","type":"git_tree *","comment":"A git_tree object to diff from, or NULL for empty tree."},{"name":"opts","type":"const git_diff_options *","comment":"Structure with options to influence diff or NULL for defaults."}],"argline":"git_diff **diff, git_repository *repo, git_tree *old_tree, const git_diff_options *opts","sig":"git_diff **::git_repository *::git_tree *::const git_diff_options *","return":{"type":"int","comment":null},"description":"

Create a diff between a tree and the working directory.

\n","comments":"

The tree you provide will be used for the "old_file" side of the delta,\n and the working directory will be used for the "new_file" side.

\n\n

This is not the same as `git diff \n<treeish

\n\n
\n

orgit diff-index

\n
\n\n

<treeish

\n\n
\n

. Those commands use information from the index, whereas this\n function strictly returns the differences between the tree and the files\n in the working directory, regardless of the state of the index. Use\ngit_diff_tree_to_workdir_with_index` to emulate those commands.

\n
\n\n

To see difference between this and git_diff_tree_to_workdir_with_index,\n consider the example of a staged file deletion where the file has then\n been put back into the working dir and further modified. The\n tree-to-workdir diff for that file is 'modified', but git diff would\n show status 'deleted' since there is a staged delete.

\n","group":"diff","examples":{"diff.c":["ex/v0.23.0/diff.html#git_diff_tree_to_workdir-6"]}},"git_diff_tree_to_workdir_with_index":{"type":"function","file":"diff.h","line":832,"lineto":836,"args":[{"name":"diff","type":"git_diff **","comment":"A pointer to a git_diff pointer that will be allocated."},{"name":"repo","type":"git_repository *","comment":"The repository containing the tree."},{"name":"old_tree","type":"git_tree *","comment":"A git_tree object to diff from, or NULL for empty tree."},{"name":"opts","type":"const git_diff_options *","comment":"Structure with options to influence diff or NULL for defaults."}],"argline":"git_diff **diff, git_repository *repo, git_tree *old_tree, const git_diff_options *opts","sig":"git_diff **::git_repository *::git_tree *::const git_diff_options *","return":{"type":"int","comment":null},"description":"

Create a diff between a tree and the working directory using index data\n to account for staged deletes, tracked files, etc.

\n","comments":"

This emulates `git diff \n<tree

\n\n
\n

` by diffing the tree to the index and\n the index to the working directory and blending the results into a\n single diff that includes staged deleted, etc.

\n
\n","group":"diff","examples":{"diff.c":["ex/v0.23.0/diff.html#git_diff_tree_to_workdir_with_index-7"]}},"git_diff_merge":{"type":"function","file":"diff.h","line":851,"lineto":853,"args":[{"name":"onto","type":"git_diff *","comment":"Diff to merge into."},{"name":"from","type":"const git_diff *","comment":"Diff to merge."}],"argline":"git_diff *onto, const git_diff *from","sig":"git_diff *::const git_diff *","return":{"type":"int","comment":null},"description":"

Merge one diff into another.

\n","comments":"

This merges items from the "from" list into the "onto" list. The\n resulting diff will have all items that appear in either list.\n If an item appears in both lists, then it will be "merged" to appear\n as if the old version was from the "onto" list and the new version\n is from the "from" list (with the exception that if the item has a\n pending DELETE in the middle, then it will show as deleted).

\n","group":"diff"},"git_diff_find_similar":{"type":"function","file":"diff.h","line":867,"lineto":869,"args":[{"name":"diff","type":"git_diff *","comment":"diff to run detection algorithms on"},{"name":"options","type":"const git_diff_find_options *","comment":"Control how detection should be run, NULL for defaults"}],"argline":"git_diff *diff, const git_diff_find_options *options","sig":"git_diff *::const git_diff_find_options *","return":{"type":"int","comment":" 0 on success, -1 on failure"},"description":"

Transform a diff marking file renames, copies, etc.

\n","comments":"

This modifies a diff in place, replacing old entries that look\n like renames or copies with new entries reflecting those changes.\n This also will, if requested, break modified files into add/remove\n pairs if the amount of change is above a threshold.

\n","group":"diff","examples":{"diff.c":["ex/v0.23.0/diff.html#git_diff_find_similar-8"]}},"git_diff_num_deltas":{"type":"function","file":"diff.h","line":887,"lineto":887,"args":[{"name":"diff","type":"const git_diff *","comment":"A git_diff generated by one of the above functions"}],"argline":"const git_diff *diff","sig":"const git_diff *","return":{"type":"size_t","comment":" Count of number of deltas in the list"},"description":"

Query how many diff records are there in a diff.

\n","comments":"","group":"diff","examples":{"log.c":["ex/v0.23.0/log.html#git_diff_num_deltas-28"]}},"git_diff_num_deltas_of_type":{"type":"function","file":"diff.h","line":900,"lineto":901,"args":[{"name":"diff","type":"const git_diff *","comment":"A git_diff generated by one of the above functions"},{"name":"type","type":"git_delta_t","comment":"A git_delta_t value to filter the count"}],"argline":"const git_diff *diff, git_delta_t type","sig":"const git_diff *::git_delta_t","return":{"type":"size_t","comment":" Count of number of deltas matching delta_t type"},"description":"

Query how many diff deltas are there in a diff filtered by type.

\n","comments":"

This works just like git_diff_entrycount() with an extra parameter\n that is a git_delta_t and returns just the count of how many deltas\n match that particular type.

\n","group":"diff"},"git_diff_get_delta":{"type":"function","file":"diff.h","line":920,"lineto":921,"args":[{"name":"diff","type":"const git_diff *","comment":"Diff list object"},{"name":"idx","type":"size_t","comment":"Index into diff list"}],"argline":"const git_diff *diff, size_t idx","sig":"const git_diff *::size_t","return":{"type":"const git_diff_delta *","comment":" Pointer to git_diff_delta (or NULL if `idx` out of range)"},"description":"

Return the diff delta for an entry in the diff list.

\n","comments":"

The git_diff_delta pointer points to internal data and you do not\n have to release it when you are done with it. It will go away when\n the * git_diff (or any associated git_patch) goes away.

\n\n

Note that the flags on the delta related to whether it has binary\n content or not may not be set if there are no attributes set for the\n file and there has been no reason to load the file data at this point.\n For now, if you need those flags to be up to date, your only option is\n to either use git_diff_foreach or create a git_patch.

\n","group":"diff"},"git_diff_is_sorted_icase":{"type":"function","file":"diff.h","line":929,"lineto":929,"args":[{"name":"diff","type":"const git_diff *","comment":"diff to check"}],"argline":"const git_diff *diff","sig":"const git_diff *","return":{"type":"int","comment":" 0 if case sensitive, 1 if case is ignored"},"description":"

Check if deltas are sorted case sensitively or insensitively.

\n","comments":"","group":"diff"},"git_diff_foreach":{"type":"function","file":"diff.h","line":957,"lineto":963,"args":[{"name":"diff","type":"git_diff *","comment":"A git_diff generated by one of the above functions."},{"name":"file_cb","type":"git_diff_file_cb","comment":"Callback function to make per file in the diff."},{"name":"binary_cb","type":"git_diff_binary_cb","comment":"Optional callback to make for binary files."},{"name":"hunk_cb","type":"git_diff_hunk_cb","comment":"Optional callback to make per hunk of text diff. This\n callback is called to describe a range of lines in the\n diff. It will not be issued for binary files."},{"name":"line_cb","type":"git_diff_line_cb","comment":"Optional callback to make per line of diff text. This\n same callback will be made for context lines, added, and\n removed lines, and even for a deleted trailing newline."},{"name":"payload","type":"void *","comment":"Reference pointer that will be passed to your callbacks."}],"argline":"git_diff *diff, git_diff_file_cb file_cb, git_diff_binary_cb binary_cb, git_diff_hunk_cb hunk_cb, git_diff_line_cb line_cb, void *payload","sig":"git_diff *::git_diff_file_cb::git_diff_binary_cb::git_diff_hunk_cb::git_diff_line_cb::void *","return":{"type":"int","comment":" 0 on success, non-zero callback return value, or error code"},"description":"

Loop over all deltas in a diff issuing callbacks.

\n","comments":"

This will iterate through all of the files described in a diff. You\n should provide a file callback to learn about each file.

\n\n

The "hunk" and "line" callbacks are optional, and the text diff of the\n files will only be calculated if they are not NULL. Of course, these\n callbacks will not be invoked for binary files on the diff or for\n files whose only changed is a file mode change.

\n\n

Returning a non-zero value from any of the callbacks will terminate\n the iteration and return the value to the user.

\n","group":"diff"},"git_diff_status_char":{"type":"function","file":"diff.h","line":976,"lineto":976,"args":[{"name":"status","type":"git_delta_t","comment":"The git_delta_t value to look up"}],"argline":"git_delta_t status","sig":"git_delta_t","return":{"type":"char","comment":" The single character label for that code"},"description":"

Look up the single character abbreviation for a delta status code.

\n","comments":"

When you run git diff --name-status it uses single letter codes in\n the output such as 'A' for added, 'D' for deleted, 'M' for modified,\n etc. This function converts a git_delta_t value into these letters for\n your own purposes. GIT_DELTA_UNTRACKED will return a space (i.e. ' ').

\n","group":"diff"},"git_diff_print":{"type":"function","file":"diff.h","line":1001,"lineto":1005,"args":[{"name":"diff","type":"git_diff *","comment":"A git_diff generated by one of the above functions."},{"name":"format","type":"git_diff_format_t","comment":"A git_diff_format_t value to pick the text format."},{"name":"print_cb","type":"git_diff_line_cb","comment":"Callback to make per line of diff text."},{"name":"payload","type":"void *","comment":"Reference pointer that will be passed to your callback."}],"argline":"git_diff *diff, git_diff_format_t format, git_diff_line_cb print_cb, void *payload","sig":"git_diff *::git_diff_format_t::git_diff_line_cb::void *","return":{"type":"int","comment":" 0 on success, non-zero callback return value, or error code"},"description":"

Iterate over a diff generating formatted text output.

\n","comments":"

Returning a non-zero value from the callbacks will terminate the\n iteration and return the non-zero value to the caller.

\n","group":"diff","examples":{"diff.c":["ex/v0.23.0/diff.html#git_diff_print-9"],"log.c":["ex/v0.23.0/log.html#git_diff_print-29"]}},"git_diff_blobs":{"type":"function","file":"diff.h","line":1042,"lineto":1052,"args":[{"name":"old_blob","type":"const git_blob *","comment":"Blob for old side of diff, or NULL for empty blob"},{"name":"old_as_path","type":"const char *","comment":"Treat old blob as if it had this filename; can be NULL"},{"name":"new_blob","type":"const git_blob *","comment":"Blob for new side of diff, or NULL for empty blob"},{"name":"new_as_path","type":"const char *","comment":"Treat new blob as if it had this filename; can be NULL"},{"name":"options","type":"const git_diff_options *","comment":"Options for diff, or NULL for default options"},{"name":"file_cb","type":"git_diff_file_cb","comment":"Callback for \"file\"; made once if there is a diff; can be NULL"},{"name":"binary_cb","type":"git_diff_binary_cb","comment":"Callback for binary files; can be NULL"},{"name":"hunk_cb","type":"git_diff_hunk_cb","comment":"Callback for each hunk in diff; can be NULL"},{"name":"line_cb","type":"git_diff_line_cb","comment":"Callback for each line in diff; can be NULL"},{"name":"payload","type":"void *","comment":"Payload passed to each callback function"}],"argline":"const git_blob *old_blob, const char *old_as_path, const git_blob *new_blob, const char *new_as_path, const git_diff_options *options, git_diff_file_cb file_cb, git_diff_binary_cb binary_cb, git_diff_hunk_cb hunk_cb, git_diff_line_cb line_cb, void *payload","sig":"const git_blob *::const char *::const git_blob *::const char *::const git_diff_options *::git_diff_file_cb::git_diff_binary_cb::git_diff_hunk_cb::git_diff_line_cb::void *","return":{"type":"int","comment":" 0 on success, non-zero callback return value, or error code"},"description":"

Directly run a diff on two blobs.

\n","comments":"

Compared to a file, a blob lacks some contextual information. As such,\n the git_diff_file given to the callback will have some fake data; i.e.\n mode will be 0 and path will be NULL.

\n\n

NULL is allowed for either old_blob or new_blob and will be treated\n as an empty blob, with the oid set to NULL in the git_diff_file data.\n Passing NULL for both blobs is a noop; no callbacks will be made at all.

\n\n

We do run a binary content check on the blob content and if either blob\n looks like binary data, the git_diff_delta binary attribute will be set\n to 1 and no call to the hunk_cb nor line_cb will be made (unless you pass\n GIT_DIFF_FORCE_TEXT of course).

\n","group":"diff"},"git_diff_blob_to_buffer":{"type":"function","file":"diff.h","line":1079,"lineto":1090,"args":[{"name":"old_blob","type":"const git_blob *","comment":"Blob for old side of diff, or NULL for empty blob"},{"name":"old_as_path","type":"const char *","comment":"Treat old blob as if it had this filename; can be NULL"},{"name":"buffer","type":"const char *","comment":"Raw data for new side of diff, or NULL for empty"},{"name":"buffer_len","type":"size_t","comment":"Length of raw data for new side of diff"},{"name":"buffer_as_path","type":"const char *","comment":"Treat buffer as if it had this filename; can be NULL"},{"name":"options","type":"const git_diff_options *","comment":"Options for diff, or NULL for default options"},{"name":"file_cb","type":"git_diff_file_cb","comment":"Callback for \"file\"; made once if there is a diff; can be NULL"},{"name":"binary_cb","type":"git_diff_binary_cb","comment":"Callback for binary files; can be NULL"},{"name":"hunk_cb","type":"git_diff_hunk_cb","comment":"Callback for each hunk in diff; can be NULL"},{"name":"line_cb","type":"git_diff_line_cb","comment":"Callback for each line in diff; can be NULL"},{"name":"payload","type":"void *","comment":"Payload passed to each callback function"}],"argline":"const git_blob *old_blob, const char *old_as_path, const char *buffer, size_t buffer_len, const char *buffer_as_path, const git_diff_options *options, git_diff_file_cb file_cb, git_diff_binary_cb binary_cb, git_diff_hunk_cb hunk_cb, git_diff_line_cb line_cb, void *payload","sig":"const git_blob *::const char *::const char *::size_t::const char *::const git_diff_options *::git_diff_file_cb::git_diff_binary_cb::git_diff_hunk_cb::git_diff_line_cb::void *","return":{"type":"int","comment":" 0 on success, non-zero callback return value, or error code"},"description":"

Directly run a diff between a blob and a buffer.

\n","comments":"

As with git_diff_blobs, comparing a blob and buffer lacks some context,\n so the git_diff_file parameters to the callbacks will be faked a la the\n rules for git_diff_blobs().

\n\n

Passing NULL for old_blob will be treated as an empty blob (i.e. the\n file_cb will be invoked with GIT_DELTA_ADDED and the diff will be the\n entire content of the buffer added). Passing NULL to the buffer will do\n the reverse, with GIT_DELTA_REMOVED and blob content removed.

\n","group":"diff"},"git_diff_buffers":{"type":"function","file":"diff.h","line":1113,"lineto":1125,"args":[{"name":"old_buffer","type":"const void *","comment":"Raw data for old side of diff, or NULL for empty"},{"name":"old_len","type":"size_t","comment":"Length of the raw data for old side of the diff"},{"name":"old_as_path","type":"const char *","comment":"Treat old buffer as if it had this filename; can be NULL"},{"name":"new_buffer","type":"const void *","comment":"Raw data for new side of diff, or NULL for empty"},{"name":"new_len","type":"size_t","comment":"Length of raw data for new side of diff"},{"name":"new_as_path","type":"const char *","comment":"Treat buffer as if it had this filename; can be NULL"},{"name":"options","type":"const git_diff_options *","comment":"Options for diff, or NULL for default options"},{"name":"file_cb","type":"git_diff_file_cb","comment":"Callback for \"file\"; made once if there is a diff; can be NULL"},{"name":"binary_cb","type":"git_diff_binary_cb","comment":"Callback for binary files; can be NULL"},{"name":"hunk_cb","type":"git_diff_hunk_cb","comment":"Callback for each hunk in diff; can be NULL"},{"name":"line_cb","type":"git_diff_line_cb","comment":"Callback for each line in diff; can be NULL"},{"name":"payload","type":"void *","comment":"Payload passed to each callback function"}],"argline":"const void *old_buffer, size_t old_len, const char *old_as_path, const void *new_buffer, size_t new_len, const char *new_as_path, const git_diff_options *options, git_diff_file_cb file_cb, git_diff_binary_cb binary_cb, git_diff_hunk_cb hunk_cb, git_diff_line_cb line_cb, void *payload","sig":"const void *::size_t::const char *::const void *::size_t::const char *::const git_diff_options *::git_diff_file_cb::git_diff_binary_cb::git_diff_hunk_cb::git_diff_line_cb::void *","return":{"type":"int","comment":" 0 on success, non-zero callback return value, or error code"},"description":"

Directly run a diff between two buffers.

\n","comments":"

Even more than with git_diff_blobs, comparing two buffer lacks\n context, so the git_diff_file parameters to the callbacks will be\n faked a la the rules for git_diff_blobs().

\n","group":"diff"},"git_diff_get_stats":{"type":"function","file":"diff.h","line":1161,"lineto":1163,"args":[{"name":"out","type":"git_diff_stats **","comment":"Structure containg the diff statistics."},{"name":"diff","type":"git_diff *","comment":"A git_diff generated by one of the above functions."}],"argline":"git_diff_stats **out, git_diff *diff","sig":"git_diff_stats **::git_diff *","return":{"type":"int","comment":" 0 on success; non-zero on error"},"description":"

Accumlate diff statistics for all patches.

\n","comments":"","group":"diff","examples":{"diff.c":["ex/v0.23.0/diff.html#git_diff_get_stats-10"]}},"git_diff_stats_files_changed":{"type":"function","file":"diff.h","line":1171,"lineto":1172,"args":[{"name":"stats","type":"const git_diff_stats *","comment":"A `git_diff_stats` generated by one of the above functions."}],"argline":"const git_diff_stats *stats","sig":"const git_diff_stats *","return":{"type":"size_t","comment":" total number of files changed in the diff"},"description":"

Get the total number of files changed in a diff

\n","comments":"","group":"diff"},"git_diff_stats_insertions":{"type":"function","file":"diff.h","line":1180,"lineto":1181,"args":[{"name":"stats","type":"const git_diff_stats *","comment":"A `git_diff_stats` generated by one of the above functions."}],"argline":"const git_diff_stats *stats","sig":"const git_diff_stats *","return":{"type":"size_t","comment":" total number of insertions in the diff"},"description":"

Get the total number of insertions in a diff

\n","comments":"","group":"diff"},"git_diff_stats_deletions":{"type":"function","file":"diff.h","line":1189,"lineto":1190,"args":[{"name":"stats","type":"const git_diff_stats *","comment":"A `git_diff_stats` generated by one of the above functions."}],"argline":"const git_diff_stats *stats","sig":"const git_diff_stats *","return":{"type":"size_t","comment":" total number of deletions in the diff"},"description":"

Get the total number of deletions in a diff

\n","comments":"","group":"diff"},"git_diff_stats_to_buf":{"type":"function","file":"diff.h","line":1201,"lineto":1205,"args":[{"name":"out","type":"git_buf *","comment":"buffer to store the formatted diff statistics in."},{"name":"stats","type":"const git_diff_stats *","comment":"A `git_diff_stats` generated by one of the above functions."},{"name":"format","type":"git_diff_stats_format_t","comment":"Formatting option."},{"name":"width","type":"size_t","comment":"Target width for output (only affects GIT_DIFF_STATS_FULL)"}],"argline":"git_buf *out, const git_diff_stats *stats, git_diff_stats_format_t format, size_t width","sig":"git_buf *::const git_diff_stats *::git_diff_stats_format_t::size_t","return":{"type":"int","comment":" 0 on success; non-zero on error"},"description":"

Print diff statistics to a git_buf.

\n","comments":"","group":"diff","examples":{"diff.c":["ex/v0.23.0/diff.html#git_diff_stats_to_buf-11"]}},"git_diff_stats_free":{"type":"function","file":"diff.h","line":1213,"lineto":1213,"args":[{"name":"stats","type":"git_diff_stats *","comment":"The previously created statistics object;\n cannot be used after free."}],"argline":"git_diff_stats *stats","sig":"git_diff_stats *","return":{"type":"void","comment":null},"description":"

Deallocate a git_diff_stats.

\n","comments":"","group":"diff","examples":{"diff.c":["ex/v0.23.0/diff.html#git_diff_stats_free-12"]}},"git_diff_format_email":{"type":"function","file":"diff.h","line":1262,"lineto":1265,"args":[{"name":"out","type":"git_buf *","comment":"buffer to store the e-mail patch in"},{"name":"diff","type":"git_diff *","comment":"containing the commit"},{"name":"opts","type":"const git_diff_format_email_options *","comment":"structure with options to influence content and formatting."}],"argline":"git_buf *out, git_diff *diff, const git_diff_format_email_options *opts","sig":"git_buf *::git_diff *::const git_diff_format_email_options *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Create an e-mail ready patch from a diff.

\n","comments":"","group":"diff"},"git_diff_commit_as_email":{"type":"function","file":"diff.h","line":1281,"lineto":1288,"args":[{"name":"out","type":"git_buf *","comment":"buffer to store the e-mail patch in"},{"name":"repo","type":"git_repository *","comment":"containing the commit"},{"name":"commit","type":"git_commit *","comment":"pointer to up commit"},{"name":"patch_no","type":"size_t","comment":"patch number of the commit"},{"name":"total_patches","type":"size_t","comment":"total number of patches in the patch set"},{"name":"flags","type":"git_diff_format_email_flags_t","comment":"determines the formatting of the e-mail"},{"name":"diff_opts","type":"const git_diff_options *","comment":"structure with options to influence diff or NULL for defaults."}],"argline":"git_buf *out, git_repository *repo, git_commit *commit, size_t patch_no, size_t total_patches, git_diff_format_email_flags_t flags, const git_diff_options *diff_opts","sig":"git_buf *::git_repository *::git_commit *::size_t::size_t::git_diff_format_email_flags_t::const git_diff_options *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Create an e-mail ready patch for a commit.

\n","comments":"

Does not support creating patches for merge commits (yet).

\n","group":"diff"},"git_diff_format_email_init_options":{"type":"function","file":"diff.h","line":1299,"lineto":1301,"args":[{"name":"opts","type":"git_diff_format_email_options *","comment":"The `git_diff_format_email_options` struct to initialize"},{"name":"version","type":"unsigned int","comment":"Version of struct; pass `GIT_DIFF_FORMAT_EMAIL_OPTIONS_VERSION`"}],"argline":"git_diff_format_email_options *opts, unsigned int version","sig":"git_diff_format_email_options *::unsigned int","return":{"type":"int","comment":" Zero on success; -1 on failure."},"description":"

Initializes a git_diff_format_email_options with default values.

\n","comments":"

Equivalent to creating an instance with GIT_DIFF_FORMAT_EMAIL_OPTIONS_INIT.

\n","group":"diff"},"giterr_last":{"type":"function","file":"errors.h","line":108,"lineto":108,"args":[],"argline":"","sig":"","return":{"type":"const git_error *","comment":" A git_error object."},"description":"

Return the last git_error object that was generated for the\n current thread or NULL if no error has occurred.

\n","comments":"","group":"giterr","examples":{"general.c":["ex/v0.23.0/general.html#giterr_last-27"],"network/clone.c":["ex/v0.23.0/network/clone.html#giterr_last-2"],"network/git2.c":["ex/v0.23.0/network/git2.html#giterr_last-1","ex/v0.23.0/network/git2.html#giterr_last-2"]}},"giterr_clear":{"type":"function","file":"errors.h","line":113,"lineto":113,"args":[],"argline":"","sig":"","return":{"type":"void","comment":null},"description":"

Clear the last library error that occurred for this thread.

\n","comments":"","group":"giterr"},"giterr_detach":{"type":"function","file":"errors.h","line":125,"lineto":125,"args":[{"name":"cpy","type":"git_error *","comment":null}],"argline":"git_error *cpy","sig":"git_error *","return":{"type":"int","comment":null},"description":"

Get the last error data and clear it.

\n","comments":"

This copies the last error into the given git_error struct\n and returns 0 if the copy was successful, leaving the error\n cleared as if giterr_clear had been called.

\n\n

If there was no existing error in the library, -1 will be returned\n and the contents of cpy will be left unmodified.

\n","group":"giterr"},"giterr_set_str":{"type":"function","file":"errors.h","line":148,"lineto":148,"args":[{"name":"error_class","type":"int","comment":"One of the `git_error_t` enum above describing the\n general subsystem that is responsible for the error."},{"name":"string","type":"const char *","comment":"The formatted error message to keep"}],"argline":"int error_class, const char *string","sig":"int::const char *","return":{"type":"void","comment":null},"description":"

Set the error message string for this thread.

\n","comments":"

This function is public so that custom ODB backends and the like can\n relay an error message through libgit2. Most regular users of libgit2\n will never need to call this function -- actually, calling it in most\n circumstances (for example, calling from within a callback function)\n will just end up having the value overwritten by libgit2 internals.

\n\n

This error message is stored in thread-local storage and only applies\n to the particular thread that this libgit2 call is made from.

\n\n

NOTE: Passing the error_class as GITERR_OS has a special behavior: we\n attempt to append the system default error message for the last OS error\n that occurred and then clear the last error. The specific implementation\n of looking up and clearing this last OS error will vary by platform.

\n","group":"giterr"},"giterr_set_oom":{"type":"function","file":"errors.h","line":159,"lineto":159,"args":[],"argline":"","sig":"","return":{"type":"void","comment":null},"description":"

Set the error message to a special value for memory allocation failure.

\n","comments":"

The normal giterr_set_str() function attempts to strdup() the string\n that is passed in. This is not a good idea when the error in question\n is a memory allocation failure. That circumstance has a special setter\n function that sets the error string to a known and statically allocated\n internal value.

\n","group":"giterr"},"git_filter_list_load":{"type":"function","file":"filter.h","line":90,"lineto":96,"args":[{"name":"filters","type":"git_filter_list **","comment":"Output newly created git_filter_list (or NULL)"},{"name":"repo","type":"git_repository *","comment":"Repository object that contains `path`"},{"name":"blob","type":"git_blob *","comment":"The blob to which the filter will be applied (if known)"},{"name":"path","type":"const char *","comment":"Relative path of the file to be filtered"},{"name":"mode","type":"git_filter_mode_t","comment":"Filtering direction (WT->ODB or ODB->WT)"},{"name":"flags","type":"uint32_t","comment":"Combination of `git_filter_flag_t` flags"}],"argline":"git_filter_list **filters, git_repository *repo, git_blob *blob, const char *path, git_filter_mode_t mode, uint32_t flags","sig":"git_filter_list **::git_repository *::git_blob *::const char *::git_filter_mode_t::uint32_t","return":{"type":"int","comment":" 0 on success (which could still return NULL if no filters are\n needed for the requested file), \n<\n0 on error"},"description":"

Load the filter list for a given path.

\n","comments":"

This will return 0 (success) but set the output git_filter_list to NULL\n if no filters are requested for the given file.

\n","group":"filter"},"git_filter_list_contains":{"type":"function","file":"filter.h","line":110,"lineto":112,"args":[{"name":"filters","type":"git_filter_list *","comment":"A loaded git_filter_list (or NULL)"},{"name":"name","type":"const char *","comment":"The name of the filter to query"}],"argline":"git_filter_list *filters, const char *name","sig":"git_filter_list *::const char *","return":{"type":"int","comment":" 1 if the filter is in the list, 0 otherwise"},"description":"

Query the filter list to see if a given filter (by name) will run.\n The built-in filters "crlf" and "ident" can be queried, otherwise this\n is the name of the filter specified by the filter attribute.

\n","comments":"

This will return 0 if the given filter is not in the list, or 1 if\n the filter will be applied.

\n","group":"filter"},"git_filter_list_apply_to_data":{"type":"function","file":"filter.h","line":134,"lineto":137,"args":[{"name":"out","type":"git_buf *","comment":"Buffer to store the result of the filtering"},{"name":"filters","type":"git_filter_list *","comment":"A loaded git_filter_list (or NULL)"},{"name":"in","type":"git_buf *","comment":"Buffer containing the data to filter"}],"argline":"git_buf *out, git_filter_list *filters, git_buf *in","sig":"git_buf *::git_filter_list *::git_buf *","return":{"type":"int","comment":" 0 on success, an error code otherwise"},"description":"

Apply filter list to a data buffer.

\n","comments":"

See git2/buffer.h for background on git_buf objects.

\n\n

If the in buffer holds data allocated by libgit2 (i.e. in->asize is\n not zero), then it will be overwritten when applying the filters. If\n not, then it will be left untouched.

\n\n

If there are no filters to apply (or filters is NULL), then the out\n buffer will reference the in buffer data (with asize set to zero)\n instead of allocating data. This keeps allocations to a minimum, but\n it means you have to be careful about freeing the in data since out\n may be pointing to it!

\n","group":"filter"},"git_filter_list_apply_to_file":{"type":"function","file":"filter.h","line":148,"lineto":152,"args":[{"name":"out","type":"git_buf *","comment":"buffer into which to store the filtered file"},{"name":"filters","type":"git_filter_list *","comment":"the list of filters to apply"},{"name":"repo","type":"git_repository *","comment":"the repository in which to perform the filtering"},{"name":"path","type":"const char *","comment":"the path of the file to filter, a relative path will be\n taken as relative to the workdir"}],"argline":"git_buf *out, git_filter_list *filters, git_repository *repo, const char *path","sig":"git_buf *::git_filter_list *::git_repository *::const char *","return":{"type":"int","comment":null},"description":"

Apply a filter list to the contents of a file on disk

\n","comments":"","group":"filter"},"git_filter_list_apply_to_blob":{"type":"function","file":"filter.h","line":161,"lineto":164,"args":[{"name":"out","type":"git_buf *","comment":"buffer into which to store the filtered file"},{"name":"filters","type":"git_filter_list *","comment":"the list of filters to apply"},{"name":"blob","type":"git_blob *","comment":"the blob to filter"}],"argline":"git_buf *out, git_filter_list *filters, git_blob *blob","sig":"git_buf *::git_filter_list *::git_blob *","return":{"type":"int","comment":null},"description":"

Apply a filter list to the contents of a blob

\n","comments":"","group":"filter"},"git_filter_list_stream_data":{"type":"function","file":"filter.h","line":173,"lineto":176,"args":[{"name":"filters","type":"git_filter_list *","comment":"the list of filters to apply"},{"name":"data","type":"git_buf *","comment":"the buffer to filter"},{"name":"target","type":"git_writestream *","comment":"the stream into which the data will be written"}],"argline":"git_filter_list *filters, git_buf *data, git_writestream *target","sig":"git_filter_list *::git_buf *::git_writestream *","return":{"type":"int","comment":null},"description":"

Apply a filter list to an arbitrary buffer as a stream

\n","comments":"","group":"filter"},"git_filter_list_stream_file":{"type":"function","file":"filter.h","line":187,"lineto":191,"args":[{"name":"filters","type":"git_filter_list *","comment":"the list of filters to apply"},{"name":"repo","type":"git_repository *","comment":"the repository in which to perform the filtering"},{"name":"path","type":"const char *","comment":"the path of the file to filter, a relative path will be\n taken as relative to the workdir"},{"name":"target","type":"git_writestream *","comment":"the stream into which the data will be written"}],"argline":"git_filter_list *filters, git_repository *repo, const char *path, git_writestream *target","sig":"git_filter_list *::git_repository *::const char *::git_writestream *","return":{"type":"int","comment":null},"description":"

Apply a filter list to a file as a stream

\n","comments":"","group":"filter"},"git_filter_list_stream_blob":{"type":"function","file":"filter.h","line":200,"lineto":203,"args":[{"name":"filters","type":"git_filter_list *","comment":"the list of filters to apply"},{"name":"blob","type":"git_blob *","comment":"the blob to filter"},{"name":"target","type":"git_writestream *","comment":"the stream into which the data will be written"}],"argline":"git_filter_list *filters, git_blob *blob, git_writestream *target","sig":"git_filter_list *::git_blob *::git_writestream *","return":{"type":"int","comment":null},"description":"

Apply a filter list to a blob as a stream

\n","comments":"","group":"filter"},"git_filter_list_free":{"type":"function","file":"filter.h","line":210,"lineto":210,"args":[{"name":"filters","type":"git_filter_list *","comment":"A git_filter_list created by `git_filter_list_load`"}],"argline":"git_filter_list *filters","sig":"git_filter_list *","return":{"type":"void","comment":null},"description":"

Free a git_filter_list

\n","comments":"","group":"filter"},"git_libgit2_init":{"type":"function","file":"global.h","line":26,"lineto":26,"args":[],"argline":"","sig":"","return":{"type":"int","comment":" the number of initializations of the library, or an error code."},"description":"

Init the global state

\n","comments":"

This function must the called before any other libgit2 function in\n order to set up global state and threading.

\n\n

This function may be called multiple times - it will return the number\n of times the initialization has been called (including this one) that have\n not subsequently been shutdown.

\n","group":"libgit2","examples":{"blame.c":["ex/v0.23.0/blame.html#git_libgit2_init-8"],"cat-file.c":["ex/v0.23.0/cat-file.html#git_libgit2_init-10"],"describe.c":["ex/v0.23.0/describe.html#git_libgit2_init-4"],"diff.c":["ex/v0.23.0/diff.html#git_libgit2_init-13"],"general.c":["ex/v0.23.0/general.html#git_libgit2_init-28"],"init.c":["ex/v0.23.0/init.html#git_libgit2_init-2"],"log.c":["ex/v0.23.0/log.html#git_libgit2_init-30"],"network/git2.c":["ex/v0.23.0/network/git2.html#git_libgit2_init-3"],"remote.c":["ex/v0.23.0/remote.html#git_libgit2_init-2"],"rev-parse.c":["ex/v0.23.0/rev-parse.html#git_libgit2_init-1"],"status.c":["ex/v0.23.0/status.html#git_libgit2_init-1"],"tag.c":["ex/v0.23.0/tag.html#git_libgit2_init-3"]}},"git_libgit2_shutdown":{"type":"function","file":"global.h","line":39,"lineto":39,"args":[],"argline":"","sig":"","return":{"type":"int","comment":" the number of remaining initializations of the library, or an\n error code."},"description":"

Shutdown the global state

\n","comments":"

Clean up the global state and threading context after calling it as\n many times as git_libgit2_init() was called - it will return the\n number of remainining initializations that have not been shutdown\n (after this one).

\n","group":"libgit2","examples":{"blame.c":["ex/v0.23.0/blame.html#git_libgit2_shutdown-9"],"cat-file.c":["ex/v0.23.0/cat-file.html#git_libgit2_shutdown-11"],"describe.c":["ex/v0.23.0/describe.html#git_libgit2_shutdown-5"],"diff.c":["ex/v0.23.0/diff.html#git_libgit2_shutdown-14"],"init.c":["ex/v0.23.0/init.html#git_libgit2_shutdown-3"],"log.c":["ex/v0.23.0/log.html#git_libgit2_shutdown-31"],"network/git2.c":["ex/v0.23.0/network/git2.html#git_libgit2_shutdown-4"],"remote.c":["ex/v0.23.0/remote.html#git_libgit2_shutdown-3"],"rev-parse.c":["ex/v0.23.0/rev-parse.html#git_libgit2_shutdown-2"],"status.c":["ex/v0.23.0/status.html#git_libgit2_shutdown-2"],"tag.c":["ex/v0.23.0/tag.html#git_libgit2_shutdown-4"]}},"git_graph_ahead_behind":{"type":"function","file":"graph.h","line":37,"lineto":37,"args":[{"name":"ahead","type":"size_t *","comment":"number of unique from commits in `upstream`"},{"name":"behind","type":"size_t *","comment":"number of unique from commits in `local`"},{"name":"repo","type":"git_repository *","comment":"the repository where the commits exist"},{"name":"local","type":"const git_oid *","comment":"the commit for local"},{"name":"upstream","type":"const git_oid *","comment":"the commit for upstream"}],"argline":"size_t *ahead, size_t *behind, git_repository *repo, const git_oid *local, const git_oid *upstream","sig":"size_t *::size_t *::git_repository *::const git_oid *::const git_oid *","return":{"type":"int","comment":null},"description":"

Count the number of unique commits between two commit objects

\n","comments":"

There is no need for branches containing the commits to have any\n upstream relationship, but it helps to think of one as a branch and\n the other as its upstream, the ahead and behind values will be\n what git would report for the branches.

\n","group":"graph"},"git_graph_descendant_of":{"type":"function","file":"graph.h","line":48,"lineto":51,"args":[{"name":"repo","type":"git_repository *","comment":null},{"name":"commit","type":"const git_oid *","comment":"a previously loaded commit."},{"name":"ancestor","type":"const git_oid *","comment":"a potential ancestor commit."}],"argline":"git_repository *repo, const git_oid *commit, const git_oid *ancestor","sig":"git_repository *::const git_oid *::const git_oid *","return":{"type":"int","comment":" 1 if the given commit is a descendant of the potential ancestor,\n 0 if not, error code otherwise."},"description":"

Determine if a commit is the descendant of another commit.

\n","comments":"","group":"graph"},"git_ignore_add_rule":{"type":"function","file":"ignore.h","line":37,"lineto":39,"args":[{"name":"repo","type":"git_repository *","comment":"The repository to add ignore rules to."},{"name":"rules","type":"const char *","comment":"Text of rules, a la the contents of a .gitignore file.\n It is okay to have multiple rules in the text; if so,\n each rule should be terminated with a newline."}],"argline":"git_repository *repo, const char *rules","sig":"git_repository *::const char *","return":{"type":"int","comment":" 0 on success"},"description":"

Add ignore rules for a repository.

\n","comments":"

Excludesfile rules (i.e. .gitignore rules) are generally read from\n .gitignore files in the repository tree or from a shared system file\n only if a "core.excludesfile" config value is set. The library also\n keeps a set of per-repository internal ignores that can be configured\n in-memory and will not persist. This function allows you to add to\n that internal rules list.

\n\n

Example usage:

\n\n
 error = git_ignore_add_rule(myrepo, "*.c\n
\n\n

/

\n\n

with space

\n\n

");

\n\n

This would add three rules to the ignores.

\n","group":"ignore"},"git_ignore_clear_internal_rules":{"type":"function","file":"ignore.h","line":52,"lineto":53,"args":[{"name":"repo","type":"git_repository *","comment":"The repository to remove ignore rules from."}],"argline":"git_repository *repo","sig":"git_repository *","return":{"type":"int","comment":" 0 on success"},"description":"

Clear ignore rules that were explicitly added.

\n","comments":"

Resets to the default internal ignore rules. This will not turn off\n rules in .gitignore files that actually exist in the filesystem.

\n\n

The default internal ignores ignore ".", ".." and ".git" entries.

\n","group":"ignore"},"git_ignore_path_is_ignored":{"type":"function","file":"ignore.h","line":71,"lineto":74,"args":[{"name":"ignored","type":"int *","comment":"boolean returning 0 if the file is not ignored, 1 if it is"},{"name":"repo","type":"git_repository *","comment":"a repository object"},{"name":"path","type":"const char *","comment":"the file to check ignores for, relative to the repo's workdir."}],"argline":"int *ignored, git_repository *repo, const char *path","sig":"int *::git_repository *::const char *","return":{"type":"int","comment":" 0 if ignore rules could be processed for the file (regardless\n of whether it exists or not), or an error \n<\n 0 if they could not."},"description":"

Test if the ignore rules apply to a given path.

\n","comments":"

This function checks the ignore rules to see if they would apply to the\n given file. This indicates if the file would be ignored regardless of\n whether the file is already in the index or committed to the repository.

\n\n

One way to think of this is if you were to do "git add ." on the\n directory containing the file, would it be added or not?

\n","group":"ignore"},"git_index_open":{"type":"function","file":"index.h","line":189,"lineto":189,"args":[{"name":"out","type":"git_index **","comment":"the pointer for the new index"},{"name":"index_path","type":"const char *","comment":"the path to the index file in disk"}],"argline":"git_index **out, const char *index_path","sig":"git_index **::const char *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Create a new bare Git index object as a memory representation\n of the Git index file in 'index_path', without a repository\n to back it.

\n","comments":"

Since there is no ODB or working directory behind this index,\n any Index methods which rely on these (e.g. index_add_bypath)\n will fail with the GIT_ERROR error code.

\n\n

If you need to access the index of an actual repository,\n use the git_repository_index wrapper.

\n\n

The index must be freed once it's no longer in use.

\n","group":"index"},"git_index_new":{"type":"function","file":"index.h","line":202,"lineto":202,"args":[{"name":"out","type":"git_index **","comment":"the pointer for the new index"}],"argline":"git_index **out","sig":"git_index **","return":{"type":"int","comment":" 0 or an error code"},"description":"

Create an in-memory index object.

\n","comments":"

This index object cannot be read/written to the filesystem,\n but may be used to perform in-memory index operations.

\n\n

The index must be freed once it's no longer in use.

\n","group":"index"},"git_index_free":{"type":"function","file":"index.h","line":209,"lineto":209,"args":[{"name":"index","type":"git_index *","comment":"an existing index object"}],"argline":"git_index *index","sig":"git_index *","return":{"type":"void","comment":null},"description":"

Free an existing index object.

\n","comments":"","group":"index","examples":{"general.c":["ex/v0.23.0/general.html#git_index_free-29"],"init.c":["ex/v0.23.0/init.html#git_index_free-4"]}},"git_index_owner":{"type":"function","file":"index.h","line":217,"lineto":217,"args":[{"name":"index","type":"const git_index *","comment":"The index"}],"argline":"const git_index *index","sig":"const git_index *","return":{"type":"git_repository *","comment":" A pointer to the repository"},"description":"

Get the repository this index relates to

\n","comments":"","group":"index"},"git_index_caps":{"type":"function","file":"index.h","line":225,"lineto":225,"args":[{"name":"index","type":"const git_index *","comment":"An existing index object"}],"argline":"const git_index *index","sig":"const git_index *","return":{"type":"int","comment":" A combination of GIT_INDEXCAP values"},"description":"

Read index capabilities flags.

\n","comments":"","group":"index"},"git_index_set_caps":{"type":"function","file":"index.h","line":238,"lineto":238,"args":[{"name":"index","type":"git_index *","comment":"An existing index object"},{"name":"caps","type":"int","comment":"A combination of GIT_INDEXCAP values"}],"argline":"git_index *index, int caps","sig":"git_index *::int","return":{"type":"int","comment":" 0 on success, -1 on failure"},"description":"

Set index capabilities flags.

\n","comments":"

If you pass GIT_INDEXCAP_FROM_OWNER for the caps, then the\n capabilities will be read from the config of the owner object,\n looking at core.ignorecase, core.filemode, core.symlinks.

\n","group":"index"},"git_index_read":{"type":"function","file":"index.h","line":257,"lineto":257,"args":[{"name":"index","type":"git_index *","comment":"an existing index object"},{"name":"force","type":"int","comment":"if true, always reload, vs. only read if file has changed"}],"argline":"git_index *index, int force","sig":"git_index *::int","return":{"type":"int","comment":" 0 or an error code"},"description":"

Update the contents of an existing index object in memory by reading\n from the hard disk.

\n","comments":"

If force is true, this performs a "hard" read that discards in-memory\n changes and always reloads the on-disk index data. If there is no\n on-disk version, the index will be cleared.

\n\n

If force is false, this does a "soft" read that reloads the index\n data from disk only if it has changed since the last time it was\n loaded. Purely in-memory index data will be untouched. Be aware: if\n there are changes on disk, unwritten in-memory changes are discarded.

\n","group":"index"},"git_index_write":{"type":"function","file":"index.h","line":266,"lineto":266,"args":[{"name":"index","type":"git_index *","comment":"an existing index object"}],"argline":"git_index *index","sig":"git_index *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Write an existing index object from memory back to disk\n using an atomic file lock.

\n","comments":"","group":"index"},"git_index_path":{"type":"function","file":"index.h","line":274,"lineto":274,"args":[{"name":"index","type":"const git_index *","comment":"an existing index object"}],"argline":"const git_index *index","sig":"const git_index *","return":{"type":"const char *","comment":" path to index file or NULL for in-memory index"},"description":"

Get the full path to the index file on disk.

\n","comments":"","group":"index"},"git_index_checksum":{"type":"function","file":"index.h","line":286,"lineto":286,"args":[{"name":"index","type":"git_index *","comment":"an existing index object"}],"argline":"git_index *index","sig":"git_index *","return":{"type":"const git_oid *","comment":" a pointer to the checksum of the index"},"description":"

Get the checksum of the index

\n","comments":"

This checksum is the SHA-1 hash over the index file (except the\n last 20 bytes which are the checksum itself). In cases where the\n index does not exist on-disk, it will be zeroed out.

\n","group":"index"},"git_index_read_tree":{"type":"function","file":"index.h","line":297,"lineto":297,"args":[{"name":"index","type":"git_index *","comment":"an existing index object"},{"name":"tree","type":"const git_tree *","comment":"tree to read"}],"argline":"git_index *index, const git_tree *tree","sig":"git_index *::const git_tree *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Read a tree into the index file with stats

\n","comments":"

The current index contents will be replaced by the specified tree.

\n","group":"index"},"git_index_write_tree":{"type":"function","file":"index.h","line":318,"lineto":318,"args":[{"name":"out","type":"git_oid *","comment":"Pointer where to store the OID of the written tree"},{"name":"index","type":"git_index *","comment":"Index to write"}],"argline":"git_oid *out, git_index *index","sig":"git_oid *::git_index *","return":{"type":"int","comment":" 0 on success, GIT_EUNMERGED when the index is not clean\n or an error code"},"description":"

Write the index as a tree

\n","comments":"

This method will scan the index and write a representation\n of its current state back to disk; it recursively creates\n tree objects for each of the subtrees stored in the index,\n but only returns the OID of the root tree. This is the OID\n that can be used e.g. to create a commit.

\n\n

The index instance cannot be bare, and needs to be associated\n to an existing repository.

\n\n

The index must not contain any file in conflict.

\n","group":"index","examples":{"init.c":["ex/v0.23.0/init.html#git_index_write_tree-5"]}},"git_index_write_tree_to":{"type":"function","file":"index.h","line":335,"lineto":335,"args":[{"name":"out","type":"git_oid *","comment":"Pointer where to store OID of the the written tree"},{"name":"index","type":"git_index *","comment":"Index to write"},{"name":"repo","type":"git_repository *","comment":"Repository where to write the tree"}],"argline":"git_oid *out, git_index *index, git_repository *repo","sig":"git_oid *::git_index *::git_repository *","return":{"type":"int","comment":" 0 on success, GIT_EUNMERGED when the index is not clean\n or an error code"},"description":"

Write the index as a tree to the given repository

\n","comments":"

This method will do the same as git_index_write_tree, but\n letting the user choose the repository where the tree will\n be written.

\n\n

The index must not contain any file in conflict.

\n","group":"index"},"git_index_entrycount":{"type":"function","file":"index.h","line":354,"lineto":354,"args":[{"name":"index","type":"const git_index *","comment":"an existing index object"}],"argline":"const git_index *index","sig":"const git_index *","return":{"type":"size_t","comment":" integer of count of current entries"},"description":"

Get the count of entries currently in the index

\n","comments":"","group":"index","examples":{"general.c":["ex/v0.23.0/general.html#git_index_entrycount-30"]}},"git_index_clear":{"type":"function","file":"index.h","line":365,"lineto":365,"args":[{"name":"index","type":"git_index *","comment":"an existing index object"}],"argline":"git_index *index","sig":"git_index *","return":{"type":"int","comment":" 0 on success, error code \n<\n 0 on failure"},"description":"

Clear the contents (all the entries) of an index object.

\n","comments":"

This clears the index object in memory; changes must be explicitly\n written to disk for them to take effect persistently.

\n","group":"index"},"git_index_get_byindex":{"type":"function","file":"index.h","line":378,"lineto":379,"args":[{"name":"index","type":"git_index *","comment":"an existing index object"},{"name":"n","type":"size_t","comment":"the position of the entry"}],"argline":"git_index *index, size_t n","sig":"git_index *::size_t","return":{"type":"const git_index_entry *","comment":" a pointer to the entry; NULL if out of bounds"},"description":"

Get a pointer to one of the entries in the index

\n","comments":"

The entry is not modifiable and should not be freed. Because the\n git_index_entry struct is a publicly defined struct, you should\n be able to make your own permanent copy of the data if necessary.

\n","group":"index","examples":{"general.c":["ex/v0.23.0/general.html#git_index_get_byindex-31"]}},"git_index_get_bypath":{"type":"function","file":"index.h","line":393,"lineto":394,"args":[{"name":"index","type":"git_index *","comment":"an existing index object"},{"name":"path","type":"const char *","comment":"path to search"},{"name":"stage","type":"int","comment":"stage to search"}],"argline":"git_index *index, const char *path, int stage","sig":"git_index *::const char *::int","return":{"type":"const git_index_entry *","comment":" a pointer to the entry; NULL if it was not found"},"description":"

Get a pointer to one of the entries in the index

\n","comments":"

The entry is not modifiable and should not be freed. Because the\n git_index_entry struct is a publicly defined struct, you should\n be able to make your own permanent copy of the data if necessary.

\n","group":"index"},"git_index_remove":{"type":"function","file":"index.h","line":404,"lineto":404,"args":[{"name":"index","type":"git_index *","comment":"an existing index object"},{"name":"path","type":"const char *","comment":"path to search"},{"name":"stage","type":"int","comment":"stage to search"}],"argline":"git_index *index, const char *path, int stage","sig":"git_index *::const char *::int","return":{"type":"int","comment":" 0 or an error code"},"description":"

Remove an entry from the index

\n","comments":"","group":"index"},"git_index_remove_directory":{"type":"function","file":"index.h","line":414,"lineto":415,"args":[{"name":"index","type":"git_index *","comment":"an existing index object"},{"name":"dir","type":"const char *","comment":"container directory path"},{"name":"stage","type":"int","comment":"stage to search"}],"argline":"git_index *index, const char *dir, int stage","sig":"git_index *::const char *::int","return":{"type":"int","comment":" 0 or an error code"},"description":"

Remove all entries from the index under a given directory

\n","comments":"","group":"index"},"git_index_add":{"type":"function","file":"index.h","line":431,"lineto":431,"args":[{"name":"index","type":"git_index *","comment":"an existing index object"},{"name":"source_entry","type":"const git_index_entry *","comment":"new entry object"}],"argline":"git_index *index, const git_index_entry *source_entry","sig":"git_index *::const git_index_entry *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Add or update an index entry from an in-memory struct

\n","comments":"

If a previous index entry exists that has the same path and stage\n as the given 'source_entry', it will be replaced. Otherwise, the\n 'source_entry' will be added.

\n\n

A full copy (including the 'path' string) of the given\n 'source_entry' will be inserted on the index.

\n","group":"index"},"git_index_entry_stage":{"type":"function","file":"index.h","line":443,"lineto":443,"args":[{"name":"entry","type":"const git_index_entry *","comment":"The entry"}],"argline":"const git_index_entry *entry","sig":"const git_index_entry *","return":{"type":"int","comment":" the stage number"},"description":"

Return the stage number from a git index entry

\n","comments":"

This entry is calculated from the entry's flag attribute like this:

\n\n
(entry->flags \n
\n\n

&\n GIT_IDXENTRY_STAGEMASK) >> GIT_IDXENTRY_STAGESHIFT

\n","group":"index"},"git_index_entry_is_conflict":{"type":"function","file":"index.h","line":452,"lineto":452,"args":[{"name":"entry","type":"const git_index_entry *","comment":"The entry"}],"argline":"const git_index_entry *entry","sig":"const git_index_entry *","return":{"type":"int","comment":" 1 if the entry is a conflict entry, 0 otherwise"},"description":"

Return whether the given index entry is a conflict (has a high stage\n entry). This is simply shorthand for git_index_entry_stage > 0.

\n","comments":"","group":"index"},"git_index_add_bypath":{"type":"function","file":"index.h","line":483,"lineto":483,"args":[{"name":"index","type":"git_index *","comment":"an existing index object"},{"name":"path","type":"const char *","comment":"filename to add"}],"argline":"git_index *index, const char *path","sig":"git_index *::const char *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Add or update an index entry from a file on disk

\n","comments":"

The file path must be relative to the repository's\n working folder and must be readable.

\n\n

This method will fail in bare index instances.

\n\n

This forces the file to be added to the index, not looking\n at gitignore rules. Those rules can be evaluated through\n the git_status APIs (in status.h) before calling this.

\n\n

If this file currently is the result of a merge conflict, this\n file will no longer be marked as conflicting. The data about\n the conflict will be moved to the "resolve undo" (REUC) section.

\n","group":"index"},"git_index_add_frombuffer":{"type":"function","file":"index.h","line":512,"lineto":515,"args":[{"name":"index","type":"git_index *","comment":"an existing index object"},{"name":"entry","type":"const git_index_entry *","comment":"filename to add"},{"name":"buffer","type":"const void *","comment":"data to be written into the blob"},{"name":"len","type":"size_t","comment":"length of the data"}],"argline":"git_index *index, const git_index_entry *entry, const void *buffer, size_t len","sig":"git_index *::const git_index_entry *::const void *::size_t","return":{"type":"int","comment":" 0 or an error code"},"description":"

Add or update an index entry from a buffer in memory

\n","comments":"

This method will create a blob in the repository that owns the\n index and then add the index entry to the index. The path of the\n entry represents the position of the blob relative to the\n repository's root folder.

\n\n

If a previous index entry exists that has the same path as the\n given 'entry', it will be replaced. Otherwise, the 'entry' will be\n added. The id and the file_size of the 'entry' are updated with the\n real value of the blob.

\n\n

This forces the file to be added to the index, not looking\n at gitignore rules. Those rules can be evaluated through\n the git_status APIs (in status.h) before calling this.

\n\n

If this file currently is the result of a merge conflict, this\n file will no longer be marked as conflicting. The data about\n the conflict will be moved to the "resolve undo" (REUC) section.

\n","group":"index"},"git_index_remove_bypath":{"type":"function","file":"index.h","line":531,"lineto":531,"args":[{"name":"index","type":"git_index *","comment":"an existing index object"},{"name":"path","type":"const char *","comment":"filename to remove"}],"argline":"git_index *index, const char *path","sig":"git_index *::const char *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Remove an index entry corresponding to a file on disk

\n","comments":"

The file path must be relative to the repository's\n working folder. It may exist.

\n\n

If this file currently is the result of a merge conflict, this\n file will no longer be marked as conflicting. The data about\n the conflict will be moved to the "resolve undo" (REUC) section.

\n","group":"index"},"git_index_add_all":{"type":"function","file":"index.h","line":578,"lineto":583,"args":[{"name":"index","type":"git_index *","comment":"an existing index object"},{"name":"pathspec","type":"const git_strarray *","comment":"array of path patterns"},{"name":"flags","type":"unsigned int","comment":"combination of git_index_add_option_t flags"},{"name":"callback","type":"git_index_matched_path_cb","comment":"notification callback for each added/updated path (also\n gets index of matching pathspec entry); can be NULL;\n return 0 to add, >0 to skip, \n<\n0 to abort scan."},{"name":"payload","type":"void *","comment":"payload passed through to callback function"}],"argline":"git_index *index, const git_strarray *pathspec, unsigned int flags, git_index_matched_path_cb callback, void *payload","sig":"git_index *::const git_strarray *::unsigned int::git_index_matched_path_cb::void *","return":{"type":"int","comment":" 0 on success, negative callback return value, or error code"},"description":"

Add or update index entries matching files in the working directory.

\n","comments":"

This method will fail in bare index instances.

\n\n

The pathspec is a list of file names or shell glob patterns that will\n matched against files in the repository's working directory. Each file\n that matches will be added to the index (either updating an existing\n entry or adding a new entry). You can disable glob expansion and force\n exact matching with the GIT_INDEX_ADD_DISABLE_PATHSPEC_MATCH flag.

\n\n

Files that are ignored will be skipped (unlike git_index_add_bypath).\n If a file is already tracked in the index, then it will be updated\n even if it is ignored. Pass the GIT_INDEX_ADD_FORCE flag to\n skip the checking of ignore rules.

\n\n

To emulate git add -A and generate an error if the pathspec contains\n the exact path of an ignored file (when not using FORCE), add the\n GIT_INDEX_ADD_CHECK_PATHSPEC flag. This checks that each entry\n in the pathspec that is an exact match to a filename on disk is\n either not ignored or already in the index. If this check fails, the\n function will return GIT_EINVALIDSPEC.

\n\n

To emulate git add -A with the "dry-run" option, just use a callback\n function that always returns a positive value. See below for details.

\n\n

If any files are currently the result of a merge conflict, those files\n will no longer be marked as conflicting. The data about the conflicts\n will be moved to the "resolve undo" (REUC) section.

\n\n

If you provide a callback function, it will be invoked on each matching\n item in the working directory immediately before it is added to /\n updated in the index. Returning zero will add the item to the index,\n greater than zero will skip the item, and less than zero will abort the\n scan and return that value to the caller.

\n","group":"index"},"git_index_remove_all":{"type":"function","file":"index.h","line":600,"lineto":604,"args":[{"name":"index","type":"git_index *","comment":"An existing index object"},{"name":"pathspec","type":"const git_strarray *","comment":"array of path patterns"},{"name":"callback","type":"git_index_matched_path_cb","comment":"notification callback for each removed path (also\n gets index of matching pathspec entry); can be NULL;\n return 0 to add, >0 to skip, \n<\n0 to abort scan."},{"name":"payload","type":"void *","comment":"payload passed through to callback function"}],"argline":"git_index *index, const git_strarray *pathspec, git_index_matched_path_cb callback, void *payload","sig":"git_index *::const git_strarray *::git_index_matched_path_cb::void *","return":{"type":"int","comment":" 0 on success, negative callback return value, or error code"},"description":"

Remove all matching index entries.

\n","comments":"

If you provide a callback function, it will be invoked on each matching\n item in the index immediately before it is removed. Return 0 to\n remove the item, > 0 to skip the item, and \n<\n 0 to abort the scan.

\n","group":"index"},"git_index_update_all":{"type":"function","file":"index.h","line":629,"lineto":633,"args":[{"name":"index","type":"git_index *","comment":"An existing index object"},{"name":"pathspec","type":"const git_strarray *","comment":"array of path patterns"},{"name":"callback","type":"git_index_matched_path_cb","comment":"notification callback for each updated path (also\n gets index of matching pathspec entry); can be NULL;\n return 0 to add, >0 to skip, \n<\n0 to abort scan."},{"name":"payload","type":"void *","comment":"payload passed through to callback function"}],"argline":"git_index *index, const git_strarray *pathspec, git_index_matched_path_cb callback, void *payload","sig":"git_index *::const git_strarray *::git_index_matched_path_cb::void *","return":{"type":"int","comment":" 0 on success, negative callback return value, or error code"},"description":"

Update all index entries to match the working directory

\n","comments":"

This method will fail in bare index instances.

\n\n

This scans the existing index entries and synchronizes them with the\n working directory, deleting them if the corresponding working directory\n file no longer exists otherwise updating the information (including\n adding the latest version of file to the ODB if needed).

\n\n

If you provide a callback function, it will be invoked on each matching\n item in the index immediately before it is updated (either refreshed\n or removed depending on working directory state). Return 0 to proceed\n with updating the item, > 0 to skip the item, and \n<\n 0 to abort the scan.

\n","group":"index"},"git_index_find":{"type":"function","file":"index.h","line":644,"lineto":644,"args":[{"name":"at_pos","type":"size_t *","comment":"the address to which the position of the index entry is written (optional)"},{"name":"index","type":"git_index *","comment":"an existing index object"},{"name":"path","type":"const char *","comment":"path to search"}],"argline":"size_t *at_pos, git_index *index, const char *path","sig":"size_t *::git_index *::const char *","return":{"type":"int","comment":" a zero-based position in the index if found; GIT_ENOTFOUND otherwise"},"description":"

Find the first position of any entries which point to given\n path in the Git index.

\n","comments":"","group":"index"},"git_index_conflict_add":{"type":"function","file":"index.h","line":669,"lineto":673,"args":[{"name":"index","type":"git_index *","comment":"an existing index object"},{"name":"ancestor_entry","type":"const git_index_entry *","comment":"the entry data for the ancestor of the conflict"},{"name":"our_entry","type":"const git_index_entry *","comment":"the entry data for our side of the merge conflict"},{"name":"their_entry","type":"const git_index_entry *","comment":"the entry data for their side of the merge conflict"}],"argline":"git_index *index, const git_index_entry *ancestor_entry, const git_index_entry *our_entry, const git_index_entry *their_entry","sig":"git_index *::const git_index_entry *::const git_index_entry *::const git_index_entry *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Add or update index entries to represent a conflict. Any staged\n entries that exist at the given paths will be removed.

\n","comments":"

The entries are the entries from the tree included in the merge. Any\n entry may be null to indicate that that file was not present in the\n trees during the merge. For example, ancestor_entry may be NULL to\n indicate that a file was added in both branches and must be resolved.

\n","group":"index"},"git_index_conflict_get":{"type":"function","file":"index.h","line":689,"lineto":694,"args":[{"name":"ancestor_out","type":"const git_index_entry **","comment":"Pointer to store the ancestor entry"},{"name":"our_out","type":"const git_index_entry **","comment":"Pointer to store the our entry"},{"name":"their_out","type":"const git_index_entry **","comment":"Pointer to store the their entry"},{"name":"index","type":"git_index *","comment":"an existing index object"},{"name":"path","type":"const char *","comment":"path to search"}],"argline":"const git_index_entry **ancestor_out, const git_index_entry **our_out, const git_index_entry **their_out, git_index *index, const char *path","sig":"const git_index_entry **::const git_index_entry **::const git_index_entry **::git_index *::const char *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Get the index entries that represent a conflict of a single file.

\n","comments":"

The entries are not modifiable and should not be freed. Because the\n git_index_entry struct is a publicly defined struct, you should\n be able to make your own permanent copy of the data if necessary.

\n","group":"index"},"git_index_conflict_remove":{"type":"function","file":"index.h","line":703,"lineto":703,"args":[{"name":"index","type":"git_index *","comment":"an existing index object"},{"name":"path","type":"const char *","comment":"path to remove conflicts for"}],"argline":"git_index *index, const char *path","sig":"git_index *::const char *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Removes the index entries that represent a conflict of a single file.

\n","comments":"","group":"index"},"git_index_conflict_cleanup":{"type":"function","file":"index.h","line":711,"lineto":711,"args":[{"name":"index","type":"git_index *","comment":"an existing index object"}],"argline":"git_index *index","sig":"git_index *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Remove all conflicts in the index (entries with a stage greater than 0).

\n","comments":"","group":"index"},"git_index_has_conflicts":{"type":"function","file":"index.h","line":718,"lineto":718,"args":[{"name":"index","type":"const git_index *","comment":null}],"argline":"const git_index *index","sig":"const git_index *","return":{"type":"int","comment":" 1 if at least one conflict is found, 0 otherwise."},"description":"

Determine if the index contains entries representing file conflicts.

\n","comments":"","group":"index"},"git_index_conflict_iterator_new":{"type":"function","file":"index.h","line":729,"lineto":731,"args":[{"name":"iterator_out","type":"git_index_conflict_iterator **","comment":"The newly created conflict iterator"},{"name":"index","type":"git_index *","comment":"The index to scan"}],"argline":"git_index_conflict_iterator **iterator_out, git_index *index","sig":"git_index_conflict_iterator **::git_index *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Create an iterator for the conflicts in the index.

\n","comments":"

The index must not be modified while iterating; the results are undefined.

\n","group":"index"},"git_index_conflict_next":{"type":"function","file":"index.h","line":743,"lineto":747,"args":[{"name":"ancestor_out","type":"const git_index_entry **","comment":"Pointer to store the ancestor side of the conflict"},{"name":"our_out","type":"const git_index_entry **","comment":"Pointer to store our side of the conflict"},{"name":"their_out","type":"const git_index_entry **","comment":"Pointer to store their side of the conflict"},{"name":"iterator","type":"git_index_conflict_iterator *","comment":null}],"argline":"const git_index_entry **ancestor_out, const git_index_entry **our_out, const git_index_entry **their_out, git_index_conflict_iterator *iterator","sig":"const git_index_entry **::const git_index_entry **::const git_index_entry **::git_index_conflict_iterator *","return":{"type":"int","comment":" 0 (no error), GIT_ITEROVER (iteration is done) or an error code\n (negative value)"},"description":"

Returns the current conflict (ancestor, ours and theirs entry) and\n advance the iterator internally to the next value.

\n","comments":"","group":"index"},"git_index_conflict_iterator_free":{"type":"function","file":"index.h","line":754,"lineto":755,"args":[{"name":"iterator","type":"git_index_conflict_iterator *","comment":"pointer to the iterator"}],"argline":"git_index_conflict_iterator *iterator","sig":"git_index_conflict_iterator *","return":{"type":"void","comment":null},"description":"

Frees a git_index_conflict_iterator.

\n","comments":"","group":"index"},"git_indexer_new":{"type":"function","file":"indexer.h","line":30,"lineto":36,"args":[{"name":"out","type":"git_indexer **","comment":"where to store the indexer instance"},{"name":"path","type":"const char *","comment":"to the directory where the packfile should be stored"},{"name":"mode","type":"unsigned int","comment":"permissions to use creating packfile or 0 for defaults"},{"name":"odb","type":"git_odb *","comment":"object database from which to read base objects when\n fixing thin packs. Pass NULL if no thin pack is expected (an error\n will be returned if there are bases missing)"},{"name":"progress_cb","type":"git_transfer_progress_cb","comment":"function to call with progress information"},{"name":"progress_cb_payload","type":"void *","comment":"payload for the progress callback"}],"argline":"git_indexer **out, const char *path, unsigned int mode, git_odb *odb, git_transfer_progress_cb progress_cb, void *progress_cb_payload","sig":"git_indexer **::const char *::unsigned int::git_odb *::git_transfer_progress_cb::void *","return":{"type":"int","comment":null},"description":"

Create a new indexer instance

\n","comments":"","group":"indexer","examples":{"network/index-pack.c":["ex/v0.23.0/network/index-pack.html#git_indexer_new-1"]}},"git_indexer_append":{"type":"function","file":"indexer.h","line":46,"lineto":46,"args":[{"name":"idx","type":"git_indexer *","comment":"the indexer"},{"name":"data","type":"const void *","comment":"the data to add"},{"name":"size","type":"size_t","comment":"the size of the data in bytes"},{"name":"stats","type":"git_transfer_progress *","comment":"stat storage"}],"argline":"git_indexer *idx, const void *data, size_t size, git_transfer_progress *stats","sig":"git_indexer *::const void *::size_t::git_transfer_progress *","return":{"type":"int","comment":null},"description":"

Add data to the indexer

\n","comments":"","group":"indexer","examples":{"network/index-pack.c":["ex/v0.23.0/network/index-pack.html#git_indexer_append-2"]}},"git_indexer_commit":{"type":"function","file":"indexer.h","line":55,"lineto":55,"args":[{"name":"idx","type":"git_indexer *","comment":"the indexer"},{"name":"stats","type":"git_transfer_progress *","comment":null}],"argline":"git_indexer *idx, git_transfer_progress *stats","sig":"git_indexer *::git_transfer_progress *","return":{"type":"int","comment":null},"description":"

Finalize the pack and index

\n","comments":"

Resolve any pending deltas and write out the index file

\n","group":"indexer","examples":{"network/index-pack.c":["ex/v0.23.0/network/index-pack.html#git_indexer_commit-3"]}},"git_indexer_hash":{"type":"function","file":"indexer.h","line":65,"lineto":65,"args":[{"name":"idx","type":"const git_indexer *","comment":"the indexer instance"}],"argline":"const git_indexer *idx","sig":"const git_indexer *","return":{"type":"const git_oid *","comment":null},"description":"

Get the packfile's hash

\n","comments":"

A packfile's name is derived from the sorted hashing of all object\n names. This is only correct after the index has been finalized.

\n","group":"indexer","examples":{"network/index-pack.c":["ex/v0.23.0/network/index-pack.html#git_indexer_hash-4"]}},"git_indexer_free":{"type":"function","file":"indexer.h","line":72,"lineto":72,"args":[{"name":"idx","type":"git_indexer *","comment":"the indexer to free"}],"argline":"git_indexer *idx","sig":"git_indexer *","return":{"type":"void","comment":null},"description":"

Free the indexer and its resources

\n","comments":"","group":"indexer","examples":{"network/index-pack.c":["ex/v0.23.0/network/index-pack.html#git_indexer_free-5"]}},"git_merge_file_init_input":{"type":"function","file":"merge.h","line":60,"lineto":62,"args":[{"name":"opts","type":"git_merge_file_input *","comment":"the `git_merge_file_input` instance to initialize."},{"name":"version","type":"unsigned int","comment":"the version of the struct; you should pass\n `GIT_MERGE_FILE_INPUT_VERSION` here."}],"argline":"git_merge_file_input *opts, unsigned int version","sig":"git_merge_file_input *::unsigned int","return":{"type":"int","comment":" Zero on success; -1 on failure."},"description":"

Initializes a git_merge_file_input with default values. Equivalent to\n creating an instance with GIT_MERGE_FILE_INPUT_INIT.

\n","comments":"","group":"merge"},"git_merge_file_init_options":{"type":"function","file":"merge.h","line":188,"lineto":190,"args":[{"name":"opts","type":"git_merge_file_options *","comment":"the `git_merge_file_options` instance to initialize."},{"name":"version","type":"unsigned int","comment":"the version of the struct; you should pass\n `GIT_MERGE_FILE_OPTIONS_VERSION` here."}],"argline":"git_merge_file_options *opts, unsigned int version","sig":"git_merge_file_options *::unsigned int","return":{"type":"int","comment":" Zero on success; -1 on failure."},"description":"

Initializes a git_merge_file_options with default values. Equivalent to\n creating an instance with GIT_MERGE_FILE_OPTIONS_INIT.

\n","comments":"","group":"merge"},"git_merge_init_options":{"type":"function","file":"merge.h","line":265,"lineto":267,"args":[{"name":"opts","type":"git_merge_options *","comment":"the `git_merge_options` instance to initialize."},{"name":"version","type":"unsigned int","comment":"the version of the struct; you should pass\n `GIT_MERGE_OPTIONS_VERSION` here."}],"argline":"git_merge_options *opts, unsigned int version","sig":"git_merge_options *::unsigned int","return":{"type":"int","comment":" Zero on success; -1 on failure."},"description":"

Initializes a git_merge_options with default values. Equivalent to\n creating an instance with GIT_MERGE_OPTIONS_INIT.

\n","comments":"","group":"merge"},"git_merge_analysis":{"type":"function","file":"merge.h","line":336,"lineto":341,"args":[{"name":"analysis_out","type":"git_merge_analysis_t *","comment":"analysis enumeration that the result is written into"},{"name":"preference_out","type":"git_merge_preference_t *","comment":null},{"name":"repo","type":"git_repository *","comment":"the repository to merge"},{"name":"their_heads","type":"const git_annotated_commit **","comment":"the heads to merge into"},{"name":"their_heads_len","type":"size_t","comment":"the number of heads to merge"}],"argline":"git_merge_analysis_t *analysis_out, git_merge_preference_t *preference_out, git_repository *repo, const git_annotated_commit **their_heads, size_t their_heads_len","sig":"git_merge_analysis_t *::git_merge_preference_t *::git_repository *::const git_annotated_commit **::size_t","return":{"type":"int","comment":" 0 on success or error code"},"description":"

Analyzes the given branch(es) and determines the opportunities for\n merging them into the HEAD of the repository.

\n","comments":"","group":"merge"},"git_merge_base":{"type":"function","file":"merge.h","line":352,"lineto":356,"args":[{"name":"out","type":"git_oid *","comment":"the OID of a merge base between 'one' and 'two'"},{"name":"repo","type":"git_repository *","comment":"the repository where the commits exist"},{"name":"one","type":"const git_oid *","comment":"one of the commits"},{"name":"two","type":"const git_oid *","comment":"the other commit"}],"argline":"git_oid *out, git_repository *repo, const git_oid *one, const git_oid *two","sig":"git_oid *::git_repository *::const git_oid *::const git_oid *","return":{"type":"int","comment":" 0 on success, GIT_ENOTFOUND if not found or error code"},"description":"

Find a merge base between two commits

\n","comments":"","group":"merge","examples":{"log.c":["ex/v0.23.0/log.html#git_merge_base-32"],"rev-parse.c":["ex/v0.23.0/rev-parse.html#git_merge_base-3"]}},"git_merge_bases":{"type":"function","file":"merge.h","line":367,"lineto":371,"args":[{"name":"out","type":"git_oidarray *","comment":"array in which to store the resulting ids"},{"name":"repo","type":"git_repository *","comment":"the repository where the commits exist"},{"name":"one","type":"const git_oid *","comment":"one of the commits"},{"name":"two","type":"const git_oid *","comment":"the other commit"}],"argline":"git_oidarray *out, git_repository *repo, const git_oid *one, const git_oid *two","sig":"git_oidarray *::git_repository *::const git_oid *::const git_oid *","return":{"type":"int","comment":" 0 on success, GIT_ENOTFOUND if not found or error code"},"description":"

Find merge bases between two commits

\n","comments":"","group":"merge"},"git_merge_base_many":{"type":"function","file":"merge.h","line":382,"lineto":386,"args":[{"name":"out","type":"git_oid *","comment":"the OID of a merge base considering all the commits"},{"name":"repo","type":"git_repository *","comment":"the repository where the commits exist"},{"name":"length","type":"size_t","comment":"The number of commits in the provided `input_array`"},{"name":"input_array","type":"const git_oid []","comment":"oids of the commits"}],"argline":"git_oid *out, git_repository *repo, size_t length, const git_oid [] input_array","sig":"git_oid *::git_repository *::size_t::const git_oid []","return":{"type":"int","comment":" Zero on success; GIT_ENOTFOUND or -1 on failure."},"description":"

Find a merge base given a list of commits

\n","comments":"","group":"merge"},"git_merge_bases_many":{"type":"function","file":"merge.h","line":397,"lineto":401,"args":[{"name":"out","type":"git_oidarray *","comment":"array in which to store the resulting ids"},{"name":"repo","type":"git_repository *","comment":"the repository where the commits exist"},{"name":"length","type":"size_t","comment":"The number of commits in the provided `input_array`"},{"name":"input_array","type":"const git_oid []","comment":"oids of the commits"}],"argline":"git_oidarray *out, git_repository *repo, size_t length, const git_oid [] input_array","sig":"git_oidarray *::git_repository *::size_t::const git_oid []","return":{"type":"int","comment":" Zero on success; GIT_ENOTFOUND or -1 on failure."},"description":"

Find all merge bases given a list of commits

\n","comments":"","group":"merge"},"git_merge_base_octopus":{"type":"function","file":"merge.h","line":412,"lineto":416,"args":[{"name":"out","type":"git_oid *","comment":"the OID of a merge base considering all the commits"},{"name":"repo","type":"git_repository *","comment":"the repository where the commits exist"},{"name":"length","type":"size_t","comment":"The number of commits in the provided `input_array`"},{"name":"input_array","type":"const git_oid []","comment":"oids of the commits"}],"argline":"git_oid *out, git_repository *repo, size_t length, const git_oid [] input_array","sig":"git_oid *::git_repository *::size_t::const git_oid []","return":{"type":"int","comment":" Zero on success; GIT_ENOTFOUND or -1 on failure."},"description":"

Find a merge base in preparation for an octopus merge

\n","comments":"","group":"merge"},"git_merge_file":{"type":"function","file":"merge.h","line":434,"lineto":439,"args":[{"name":"out","type":"git_merge_file_result *","comment":"The git_merge_file_result to be filled in"},{"name":"ancestor","type":"const git_merge_file_input *","comment":"The contents of the ancestor file"},{"name":"ours","type":"const git_merge_file_input *","comment":"The contents of the file in \"our\" side"},{"name":"theirs","type":"const git_merge_file_input *","comment":"The contents of the file in \"their\" side"},{"name":"opts","type":"const git_merge_file_options *","comment":"The merge file options or `NULL` for defaults"}],"argline":"git_merge_file_result *out, const git_merge_file_input *ancestor, const git_merge_file_input *ours, const git_merge_file_input *theirs, const git_merge_file_options *opts","sig":"git_merge_file_result *::const git_merge_file_input *::const git_merge_file_input *::const git_merge_file_input *::const git_merge_file_options *","return":{"type":"int","comment":" 0 on success or error code"},"description":"

Merge two files as they exist in the in-memory data structures, using\n the given common ancestor as the baseline, producing a\n git_merge_file_result that reflects the merge result. The\n git_merge_file_result must be freed with git_merge_file_result_free.

\n","comments":"

Note that this function does not reference a repository and any\n configuration must be passed as git_merge_file_options.

\n","group":"merge"},"git_merge_file_from_index":{"type":"function","file":"merge.h","line":455,"lineto":461,"args":[{"name":"out","type":"git_merge_file_result *","comment":"The git_merge_file_result to be filled in"},{"name":"repo","type":"git_repository *","comment":"The repository"},{"name":"ancestor","type":"const git_index_entry *","comment":"The index entry for the ancestor file (stage level 1)"},{"name":"ours","type":"const git_index_entry *","comment":"The index entry for our file (stage level 2)"},{"name":"theirs","type":"const git_index_entry *","comment":"The index entry for their file (stage level 3)"},{"name":"opts","type":"const git_merge_file_options *","comment":"The merge file options or NULL"}],"argline":"git_merge_file_result *out, git_repository *repo, const git_index_entry *ancestor, const git_index_entry *ours, const git_index_entry *theirs, const git_merge_file_options *opts","sig":"git_merge_file_result *::git_repository *::const git_index_entry *::const git_index_entry *::const git_index_entry *::const git_merge_file_options *","return":{"type":"int","comment":" 0 on success or error code"},"description":"

Merge two files as they exist in the index, using the given common\n ancestor as the baseline, producing a git_merge_file_result that\n reflects the merge result. The git_merge_file_result must be freed with\n git_merge_file_result_free.

\n","comments":"","group":"merge"},"git_merge_file_result_free":{"type":"function","file":"merge.h","line":468,"lineto":468,"args":[{"name":"result","type":"git_merge_file_result *","comment":"The result to free or `NULL`"}],"argline":"git_merge_file_result *result","sig":"git_merge_file_result *","return":{"type":"void","comment":null},"description":"

Frees a git_merge_file_result.

\n","comments":"","group":"merge"},"git_merge_trees":{"type":"function","file":"merge.h","line":486,"lineto":492,"args":[{"name":"out","type":"git_index **","comment":"pointer to store the index result in"},{"name":"repo","type":"git_repository *","comment":"repository that contains the given trees"},{"name":"ancestor_tree","type":"const git_tree *","comment":"the common ancestor between the trees (or null if none)"},{"name":"our_tree","type":"const git_tree *","comment":"the tree that reflects the destination tree"},{"name":"their_tree","type":"const git_tree *","comment":"the tree to merge in to `our_tree`"},{"name":"opts","type":"const git_merge_options *","comment":"the merge tree options (or null for defaults)"}],"argline":"git_index **out, git_repository *repo, const git_tree *ancestor_tree, const git_tree *our_tree, const git_tree *their_tree, const git_merge_options *opts","sig":"git_index **::git_repository *::const git_tree *::const git_tree *::const git_tree *::const git_merge_options *","return":{"type":"int","comment":" 0 on success or error code"},"description":"

Merge two trees, producing a git_index that reflects the result of\n the merge. The index may be written as-is to the working directory\n or checked out. If the index is to be converted to a tree, the caller\n should resolve any conflicts that arose as part of the merge.

\n","comments":"

The returned index must be freed explicitly with git_index_free.

\n","group":"merge"},"git_merge_commits":{"type":"function","file":"merge.h","line":513,"lineto":518,"args":[{"name":"out","type":"git_index **","comment":"pointer to store the index result in"},{"name":"repo","type":"git_repository *","comment":"repository that contains the given trees"},{"name":"our_commit","type":"const git_commit *","comment":"the commit that reflects the destination tree"},{"name":"their_commit","type":"const git_commit *","comment":"the commit to merge in to `our_commit`"},{"name":"opts","type":"const git_merge_options *","comment":"the merge tree options (or null for defaults)"}],"argline":"git_index **out, git_repository *repo, const git_commit *our_commit, const git_commit *their_commit, const git_merge_options *opts","sig":"git_index **::git_repository *::const git_commit *::const git_commit *::const git_merge_options *","return":{"type":"int","comment":" 0 on success or error code"},"description":"

Merge two commits, producing a git_index that reflects the result of\n the merge. The index may be written as-is to the working directory\n or checked out. If the index is to be converted to a tree, the caller\n should resolve any conflicts that arose as part of the merge.

\n","comments":"

The merge performed uses the first common ancestor, unlike the\n git-merge-recursive strategy, which may produce an artificial common\n ancestor tree when there are multiple ancestors.

\n\n

The returned index must be freed explicitly with git_index_free.

\n","group":"merge"},"git_merge":{"type":"function","file":"merge.h","line":542,"lineto":547,"args":[{"name":"repo","type":"git_repository *","comment":"the repository to merge"},{"name":"their_heads","type":"const git_annotated_commit **","comment":"the heads to merge into"},{"name":"their_heads_len","type":"size_t","comment":"the number of heads to merge"},{"name":"merge_opts","type":"const git_merge_options *","comment":"merge options"},{"name":"checkout_opts","type":"const git_checkout_options *","comment":"checkout options"}],"argline":"git_repository *repo, const git_annotated_commit **their_heads, size_t their_heads_len, const git_merge_options *merge_opts, const git_checkout_options *checkout_opts","sig":"git_repository *::const git_annotated_commit **::size_t::const git_merge_options *::const git_checkout_options *","return":{"type":"int","comment":" 0 on success or error code"},"description":"

Merges the given commit(s) into HEAD, writing the results into the working\n directory. Any changes are staged for commit and any conflicts are written\n to the index. Callers should inspect the repository's index after this\n completes, resolve any conflicts and prepare a commit.

\n","comments":"

The merge performed uses the first common ancestor, unlike the\n git-merge-recursive strategy, which may produce an artificial common\n ancestor tree when there are multiple ancestors.

\n\n

For compatibility with git, the repository is put into a merging\n state. Once the commit is done (or if the uses wishes to abort),\n you should clear this state by calling\n git_repository_state_cleanup().

\n","group":"merge"},"git_message_prettify":{"type":"function","file":"message.h","line":39,"lineto":39,"args":[{"name":"out","type":"git_buf *","comment":"The user-allocated git_buf which will be filled with the\n cleaned up message."},{"name":"message","type":"const char *","comment":"The message to be prettified."},{"name":"strip_comments","type":"int","comment":"Non-zero to remove comment lines, 0 to leave them in."},{"name":"comment_char","type":"char","comment":"Comment character. Lines starting with this character\n are considered to be comments and removed if `strip_comments` is non-zero."}],"argline":"git_buf *out, const char *message, int strip_comments, char comment_char","sig":"git_buf *::const char *::int::char","return":{"type":"int","comment":" 0 or an error code."},"description":"

Clean up message from excess whitespace and make sure that the last line\n ends with a '

\n\n

'.

\n","comments":"

Optionally, can remove lines starting with a "#".

\n","group":"message"},"git_note_iterator_new":{"type":"function","file":"notes.h","line":49,"lineto":52,"args":[{"name":"out","type":"git_note_iterator **","comment":"pointer to the iterator"},{"name":"repo","type":"git_repository *","comment":"repository where to look up the note"},{"name":"notes_ref","type":"const char *","comment":"canonical name of the reference to use (optional); defaults to\n \"refs/notes/commits\""}],"argline":"git_note_iterator **out, git_repository *repo, const char *notes_ref","sig":"git_note_iterator **::git_repository *::const char *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Creates a new iterator for notes

\n","comments":"

The iterator must be freed manually by the user.

\n","group":"note"},"git_note_iterator_free":{"type":"function","file":"notes.h","line":59,"lineto":59,"args":[{"name":"it","type":"git_note_iterator *","comment":"pointer to the iterator"}],"argline":"git_note_iterator *it","sig":"git_note_iterator *","return":{"type":"void","comment":null},"description":"

Frees an git_note_iterator

\n","comments":"","group":"note"},"git_note_next":{"type":"function","file":"notes.h","line":72,"lineto":75,"args":[{"name":"note_id","type":"git_oid *","comment":"id of blob containing the message"},{"name":"annotated_id","type":"git_oid *","comment":"id of the git object being annotated"},{"name":"it","type":"git_note_iterator *","comment":"pointer to the iterator"}],"argline":"git_oid *note_id, git_oid *annotated_id, git_note_iterator *it","sig":"git_oid *::git_oid *::git_note_iterator *","return":{"type":"int","comment":" 0 (no error), GIT_ITEROVER (iteration is done) or an error code\n (negative value)"},"description":"

Return the current item (note_id and annotated_id) and advance the iterator\n internally to the next value

\n","comments":"","group":"note"},"git_note_read":{"type":"function","file":"notes.h","line":91,"lineto":95,"args":[{"name":"out","type":"git_note **","comment":"pointer to the read note; NULL in case of error"},{"name":"repo","type":"git_repository *","comment":"repository where to look up the note"},{"name":"notes_ref","type":"const char *","comment":"canonical name of the reference to use (optional); defaults to\n \"refs/notes/commits\""},{"name":"oid","type":"const git_oid *","comment":"OID of the git object to read the note from"}],"argline":"git_note **out, git_repository *repo, const char *notes_ref, const git_oid *oid","sig":"git_note **::git_repository *::const char *::const git_oid *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Read the note for an object

\n","comments":"

The note must be freed manually by the user.

\n","group":"note"},"git_note_author":{"type":"function","file":"notes.h","line":103,"lineto":103,"args":[{"name":"note","type":"const git_note *","comment":"the note"}],"argline":"const git_note *note","sig":"const git_note *","return":{"type":"const git_signature *","comment":" the author"},"description":"

Get the note author

\n","comments":"","group":"note"},"git_note_committer":{"type":"function","file":"notes.h","line":111,"lineto":111,"args":[{"name":"note","type":"const git_note *","comment":"the note"}],"argline":"const git_note *note","sig":"const git_note *","return":{"type":"const git_signature *","comment":" the committer"},"description":"

Get the note committer

\n","comments":"","group":"note"},"git_note_message":{"type":"function","file":"notes.h","line":120,"lineto":120,"args":[{"name":"note","type":"const git_note *","comment":"the note"}],"argline":"const git_note *note","sig":"const git_note *","return":{"type":"const char *","comment":" the note message"},"description":"

Get the note message

\n","comments":"","group":"note"},"git_note_id":{"type":"function","file":"notes.h","line":129,"lineto":129,"args":[{"name":"note","type":"const git_note *","comment":"the note"}],"argline":"const git_note *note","sig":"const git_note *","return":{"type":"const git_oid *","comment":" the note object's id"},"description":"

Get the note object's id

\n","comments":"","group":"note"},"git_note_create":{"type":"function","file":"notes.h","line":146,"lineto":154,"args":[{"name":"out","type":"git_oid *","comment":"pointer to store the OID (optional); NULL in case of error"},{"name":"repo","type":"git_repository *","comment":"repository where to store the note"},{"name":"notes_ref","type":"const char *","comment":"canonical name of the reference to use (optional);\n\t\t\t\t\tdefaults to \"refs/notes/commits\""},{"name":"author","type":"const git_signature *","comment":"signature of the notes commit author"},{"name":"committer","type":"const git_signature *","comment":"signature of the notes commit committer"},{"name":"oid","type":"const git_oid *","comment":"OID of the git object to decorate"},{"name":"note","type":"const char *","comment":"Content of the note to add for object oid"},{"name":"force","type":"int","comment":"Overwrite existing note"}],"argline":"git_oid *out, git_repository *repo, const char *notes_ref, const git_signature *author, const git_signature *committer, const git_oid *oid, const char *note, int force","sig":"git_oid *::git_repository *::const char *::const git_signature *::const git_signature *::const git_oid *::const char *::int","return":{"type":"int","comment":" 0 or an error code"},"description":"

Add a note for an object

\n","comments":"","group":"note"},"git_note_remove":{"type":"function","file":"notes.h","line":169,"lineto":174,"args":[{"name":"repo","type":"git_repository *","comment":"repository where the note lives"},{"name":"notes_ref","type":"const char *","comment":"canonical name of the reference to use (optional);\n\t\t\t\t\tdefaults to \"refs/notes/commits\""},{"name":"author","type":"const git_signature *","comment":"signature of the notes commit author"},{"name":"committer","type":"const git_signature *","comment":"signature of the notes commit committer"},{"name":"oid","type":"const git_oid *","comment":"OID of the git object to remove the note from"}],"argline":"git_repository *repo, const char *notes_ref, const git_signature *author, const git_signature *committer, const git_oid *oid","sig":"git_repository *::const char *::const git_signature *::const git_signature *::const git_oid *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Remove the note for an object

\n","comments":"","group":"note"},"git_note_free":{"type":"function","file":"notes.h","line":181,"lineto":181,"args":[{"name":"note","type":"git_note *","comment":"git_note object"}],"argline":"git_note *note","sig":"git_note *","return":{"type":"void","comment":null},"description":"

Free a git_note object

\n","comments":"","group":"note"},"git_note_foreach":{"type":"function","file":"notes.h","line":209,"lineto":213,"args":[{"name":"repo","type":"git_repository *","comment":"Repository where to find the notes."},{"name":"notes_ref","type":"const char *","comment":"Reference to read from (optional); defaults to\n \"refs/notes/commits\"."},{"name":"note_cb","type":"git_note_foreach_cb","comment":"Callback to invoke per found annotation. Return non-zero\n to stop looping."},{"name":"payload","type":"void *","comment":"Extra parameter to callback function."}],"argline":"git_repository *repo, const char *notes_ref, git_note_foreach_cb note_cb, void *payload","sig":"git_repository *::const char *::git_note_foreach_cb::void *","return":{"type":"int","comment":" 0 on success, non-zero callback return value, or error code"},"description":"

Loop over all the notes within a specified namespace\n and issue a callback for each one.

\n","comments":"","group":"note"},"git_object_lookup":{"type":"function","file":"object.h","line":42,"lineto":46,"args":[{"name":"object","type":"git_object **","comment":"pointer to the looked-up object"},{"name":"repo","type":"git_repository *","comment":"the repository to look up the object"},{"name":"id","type":"const git_oid *","comment":"the unique identifier for the object"},{"name":"type","type":"git_otype","comment":"the type of the object"}],"argline":"git_object **object, git_repository *repo, const git_oid *id, git_otype type","sig":"git_object **::git_repository *::const git_oid *::git_otype","return":{"type":"int","comment":" 0 or an error code"},"description":"

Lookup a reference to one of the objects in a repository.

\n","comments":"

The generated reference is owned by the repository and\n should be closed with the git_object_free method\n instead of free'd manually.

\n\n

The 'type' parameter must match the type of the object\n in the odb; the method will fail otherwise.\n The special value 'GIT_OBJ_ANY' may be passed to let\n the method guess the object's type.

\n","group":"object","examples":{"log.c":["ex/v0.23.0/log.html#git_object_lookup-33"]}},"git_object_lookup_prefix":{"type":"function","file":"object.h","line":75,"lineto":80,"args":[{"name":"object_out","type":"git_object **","comment":"pointer where to store the looked-up object"},{"name":"repo","type":"git_repository *","comment":"the repository to look up the object"},{"name":"id","type":"const git_oid *","comment":"a short identifier for the object"},{"name":"len","type":"size_t","comment":"the length of the short identifier"},{"name":"type","type":"git_otype","comment":"the type of the object"}],"argline":"git_object **object_out, git_repository *repo, const git_oid *id, size_t len, git_otype type","sig":"git_object **::git_repository *::const git_oid *::size_t::git_otype","return":{"type":"int","comment":" 0 or an error code"},"description":"

Lookup a reference to one of the objects in a repository,\n given a prefix of its identifier (short id).

\n","comments":"

The object obtained will be so that its identifier\n matches the first 'len' hexadecimal characters\n (packets of 4 bits) of the given 'id'.\n 'len' must be at least GIT_OID_MINPREFIXLEN, and\n long enough to identify a unique object matching\n the prefix; otherwise the method will fail.

\n\n

The generated reference is owned by the repository and\n should be closed with the git_object_free method\n instead of free'd manually.

\n\n

The 'type' parameter must match the type of the object\n in the odb; the method will fail otherwise.\n The special value 'GIT_OBJ_ANY' may be passed to let\n the method guess the object's type.

\n","group":"object"},"git_object_lookup_bypath":{"type":"function","file":"object.h","line":93,"lineto":97,"args":[{"name":"out","type":"git_object **","comment":"buffer that receives a pointer to the object (which must be freed\n by the caller)"},{"name":"treeish","type":"const git_object *","comment":"root object that can be peeled to a tree"},{"name":"path","type":"const char *","comment":"relative path from the root object to the desired object"},{"name":"type","type":"git_otype","comment":"type of object desired"}],"argline":"git_object **out, const git_object *treeish, const char *path, git_otype type","sig":"git_object **::const git_object *::const char *::git_otype","return":{"type":"int","comment":" 0 on success, or an error code"},"description":"

Lookup an object that represents a tree entry.

\n","comments":"","group":"object"},"git_object_id":{"type":"function","file":"object.h","line":105,"lineto":105,"args":[{"name":"obj","type":"const git_object *","comment":"the repository object"}],"argline":"const git_object *obj","sig":"const git_object *","return":{"type":"const git_oid *","comment":" the SHA1 id"},"description":"

Get the id (SHA1) of a repository object

\n","comments":"","group":"object","examples":{"blame.c":["ex/v0.23.0/blame.html#git_object_id-10","ex/v0.23.0/blame.html#git_object_id-11","ex/v0.23.0/blame.html#git_object_id-12","ex/v0.23.0/blame.html#git_object_id-13"],"cat-file.c":["ex/v0.23.0/cat-file.html#git_object_id-12","ex/v0.23.0/cat-file.html#git_object_id-13"],"log.c":["ex/v0.23.0/log.html#git_object_id-34","ex/v0.23.0/log.html#git_object_id-35","ex/v0.23.0/log.html#git_object_id-36","ex/v0.23.0/log.html#git_object_id-37"],"rev-parse.c":["ex/v0.23.0/rev-parse.html#git_object_id-4","ex/v0.23.0/rev-parse.html#git_object_id-5","ex/v0.23.0/rev-parse.html#git_object_id-6","ex/v0.23.0/rev-parse.html#git_object_id-7","ex/v0.23.0/rev-parse.html#git_object_id-8"]}},"git_object_short_id":{"type":"function","file":"object.h","line":119,"lineto":119,"args":[{"name":"out","type":"git_buf *","comment":"Buffer to write string into"},{"name":"obj","type":"const git_object *","comment":"The object to get an ID for"}],"argline":"git_buf *out, const git_object *obj","sig":"git_buf *::const git_object *","return":{"type":"int","comment":" 0 on success, \n<\n0 for error"},"description":"

Get a short abbreviated OID string for the object

\n","comments":"

This starts at the "core.abbrev" length (default 7 characters) and\n iteratively extends to a longer string if that length is ambiguous.\n The result will be unambiguous (at least until new objects are added to\n the repository).

\n","group":"object","examples":{"tag.c":["ex/v0.23.0/tag.html#git_object_short_id-5"]}},"git_object_type":{"type":"function","file":"object.h","line":127,"lineto":127,"args":[{"name":"obj","type":"const git_object *","comment":"the repository object"}],"argline":"const git_object *obj","sig":"const git_object *","return":{"type":"git_otype","comment":" the object's type"},"description":"

Get the object type of an object

\n","comments":"","group":"object","examples":{"cat-file.c":["ex/v0.23.0/cat-file.html#git_object_type-14","ex/v0.23.0/cat-file.html#git_object_type-15","ex/v0.23.0/cat-file.html#git_object_type-16"],"tag.c":["ex/v0.23.0/tag.html#git_object_type-6"]}},"git_object_owner":{"type":"function","file":"object.h","line":141,"lineto":141,"args":[{"name":"obj","type":"const git_object *","comment":"the object"}],"argline":"const git_object *obj","sig":"const git_object *","return":{"type":"git_repository *","comment":" the repository who owns this object"},"description":"

Get the repository that owns this object

\n","comments":"

Freeing or calling git_repository_close on the\n returned pointer will invalidate the actual object.

\n\n

Any other operation may be run on the repository without\n affecting the object.

\n","group":"object"},"git_object_free":{"type":"function","file":"object.h","line":158,"lineto":158,"args":[{"name":"object","type":"git_object *","comment":"the object to close"}],"argline":"git_object *object","sig":"git_object *","return":{"type":"void","comment":null},"description":"

Close an open object

\n","comments":"

This method instructs the library to close an existing\n object; note that git_objects are owned and cached by the repository\n so the object may or may not be freed after this library call,\n depending on how aggressive is the caching mechanism used\n by the repository.

\n\n

IMPORTANT:\n It is necessary to call this method when you stop using\n an object. Failure to do so will cause a memory leak.

\n","group":"object","examples":{"blame.c":["ex/v0.23.0/blame.html#git_object_free-14","ex/v0.23.0/blame.html#git_object_free-15","ex/v0.23.0/blame.html#git_object_free-16","ex/v0.23.0/blame.html#git_object_free-17"],"cat-file.c":["ex/v0.23.0/cat-file.html#git_object_free-17"],"general.c":["ex/v0.23.0/general.html#git_object_free-32"],"log.c":["ex/v0.23.0/log.html#git_object_free-38"],"rev-parse.c":["ex/v0.23.0/rev-parse.html#git_object_free-9","ex/v0.23.0/rev-parse.html#git_object_free-10","ex/v0.23.0/rev-parse.html#git_object_free-11"],"tag.c":["ex/v0.23.0/tag.html#git_object_free-7","ex/v0.23.0/tag.html#git_object_free-8","ex/v0.23.0/tag.html#git_object_free-9","ex/v0.23.0/tag.html#git_object_free-10"]}},"git_object_type2string":{"type":"function","file":"object.h","line":169,"lineto":169,"args":[{"name":"type","type":"git_otype","comment":"object type to convert."}],"argline":"git_otype type","sig":"git_otype","return":{"type":"const char *","comment":" the corresponding string representation."},"description":"

Convert an object type to its string representation.

\n","comments":"

The result is a pointer to a string in static memory and\n should not be free()'ed.

\n","group":"object","examples":{"cat-file.c":["ex/v0.23.0/cat-file.html#git_object_type2string-18","ex/v0.23.0/cat-file.html#git_object_type2string-19","ex/v0.23.0/cat-file.html#git_object_type2string-20","ex/v0.23.0/cat-file.html#git_object_type2string-21"],"general.c":["ex/v0.23.0/general.html#git_object_type2string-33"]}},"git_object_string2type":{"type":"function","file":"object.h","line":177,"lineto":177,"args":[{"name":"str","type":"const char *","comment":"the string to convert."}],"argline":"const char *str","sig":"const char *","return":{"type":"git_otype","comment":" the corresponding git_otype."},"description":"

Convert a string object type representation to it's git_otype.

\n","comments":"","group":"object"},"git_object_typeisloose":{"type":"function","file":"object.h","line":186,"lineto":186,"args":[{"name":"type","type":"git_otype","comment":"object type to test."}],"argline":"git_otype type","sig":"git_otype","return":{"type":"int","comment":" true if the type represents a valid loose object type,\n false otherwise."},"description":"

Determine if the given git_otype is a valid loose object type.

\n","comments":"","group":"object"},"git_object__size":{"type":"function","file":"object.h","line":200,"lineto":200,"args":[{"name":"type","type":"git_otype","comment":"object type to get its size"}],"argline":"git_otype type","sig":"git_otype","return":{"type":"size_t","comment":" size in bytes of the object"},"description":"

Get the size in bytes for the structure which\n acts as an in-memory representation of any given\n object type.

\n","comments":"

For all the core types, this would the equivalent\n of calling sizeof(git_commit) if the core types\n were not opaque on the external API.

\n","group":"object"},"git_object_peel":{"type":"function","file":"object.h","line":225,"lineto":228,"args":[{"name":"peeled","type":"git_object **","comment":"Pointer to the peeled git_object"},{"name":"object","type":"const git_object *","comment":"The object to be processed"},{"name":"target_type","type":"git_otype","comment":"The type of the requested object (a GIT_OBJ_ value)"}],"argline":"git_object **peeled, const git_object *object, git_otype target_type","sig":"git_object **::const git_object *::git_otype","return":{"type":"int","comment":" 0 on success, GIT_EINVALIDSPEC, GIT_EPEEL, or an error code"},"description":"

Recursively peel an object until an object of the specified type is met.

\n","comments":"

If the query cannot be satisfied due to the object model,\n GIT_EINVALIDSPEC will be returned (e.g. trying to peel a blob to a\n tree).

\n\n

If you pass GIT_OBJ_ANY as the target type, then the object will\n be peeled until the type changes. A tag will be peeled until the\n referenced object is no longer a tag, and a commit will be peeled\n to a tree. Any other object type will return GIT_EINVALIDSPEC.

\n\n

If peeling a tag we discover an object which cannot be peeled to\n the target type due to the object model, GIT_EPEEL will be\n returned.

\n\n

You must free the returned object.

\n","group":"object"},"git_object_dup":{"type":"function","file":"object.h","line":237,"lineto":237,"args":[{"name":"dest","type":"git_object **","comment":"Pointer to store the copy of the object"},{"name":"source","type":"git_object *","comment":"Original object to copy"}],"argline":"git_object **dest, git_object *source","sig":"git_object **::git_object *","return":{"type":"int","comment":null},"description":"

Create an in-memory copy of a Git object. The copy must be\n explicitly free'd or it will leak.

\n","comments":"","group":"object"},"git_odb_new":{"type":"function","file":"odb.h","line":38,"lineto":38,"args":[{"name":"out","type":"git_odb **","comment":"location to store the database pointer, if opened.\n\t\t\tSet to NULL if the open failed."}],"argline":"git_odb **out","sig":"git_odb **","return":{"type":"int","comment":" 0 or an error code"},"description":"

Create a new object database with no backends.

\n","comments":"

Before the ODB can be used for read/writing, a custom database\n backend must be manually added using git_odb_add_backend()

\n","group":"odb"},"git_odb_open":{"type":"function","file":"odb.h","line":56,"lineto":56,"args":[{"name":"out","type":"git_odb **","comment":"location to store the database pointer, if opened.\n\t\t\tSet to NULL if the open failed."},{"name":"objects_dir","type":"const char *","comment":"path of the backends' \"objects\" directory."}],"argline":"git_odb **out, const char *objects_dir","sig":"git_odb **::const char *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Create a new object database and automatically add\n the two default backends:

\n","comments":"
- git_odb_backend_loose: read and write loose object files\n    from disk, assuming `objects_dir` as the Objects folder\n\n- git_odb_backend_pack: read objects from packfiles,\n    assuming `objects_dir` as the Objects folder which\n    contains a 'pack/' folder with the corresponding data\n
\n","group":"odb"},"git_odb_add_disk_alternate":{"type":"function","file":"odb.h","line":73,"lineto":73,"args":[{"name":"odb","type":"git_odb *","comment":"database to add the backend to"},{"name":"path","type":"const char *","comment":"path to the objects folder for the alternate"}],"argline":"git_odb *odb, const char *path","sig":"git_odb *::const char *","return":{"type":"int","comment":" 0 on success; error code otherwise"},"description":"

Add an on-disk alternate to an existing Object DB.

\n","comments":"

Note that the added path must point to an objects, not\n to a full repository, to use it as an alternate store.

\n\n

Alternate backends are always checked for objects after\n all the main backends have been exhausted.

\n\n

Writing is disabled on alternate backends.

\n","group":"odb"},"git_odb_free":{"type":"function","file":"odb.h","line":80,"lineto":80,"args":[{"name":"db","type":"git_odb *","comment":"database pointer to close. If NULL no action is taken."}],"argline":"git_odb *db","sig":"git_odb *","return":{"type":"void","comment":null},"description":"

Close an open object database.

\n","comments":"","group":"odb","examples":{"cat-file.c":["ex/v0.23.0/cat-file.html#git_odb_free-22"]}},"git_odb_read":{"type":"function","file":"odb.h","line":99,"lineto":99,"args":[{"name":"out","type":"git_odb_object **","comment":"pointer where to store the read object"},{"name":"db","type":"git_odb *","comment":"database to search for the object in."},{"name":"id","type":"const git_oid *","comment":"identity of the object to read."}],"argline":"git_odb_object **out, git_odb *db, const git_oid *id","sig":"git_odb_object **::git_odb *::const git_oid *","return":{"type":"int","comment":" - 0 if the object was read;\n - GIT_ENOTFOUND if the object is not in the database."},"description":"

Read an object from the database.

\n","comments":"

This method queries all available ODB backends\n trying to read the given OID.

\n\n

The returned object is reference counted and\n internally cached, so it should be closed\n by the user once it's no longer in use.

\n","group":"odb","examples":{"cat-file.c":["ex/v0.23.0/cat-file.html#git_odb_read-23"],"general.c":["ex/v0.23.0/general.html#git_odb_read-34"]}},"git_odb_read_prefix":{"type":"function","file":"odb.h","line":128,"lineto":128,"args":[{"name":"out","type":"git_odb_object **","comment":"pointer where to store the read object"},{"name":"db","type":"git_odb *","comment":"database to search for the object in."},{"name":"short_id","type":"const git_oid *","comment":"a prefix of the id of the object to read."},{"name":"len","type":"size_t","comment":"the length of the prefix"}],"argline":"git_odb_object **out, git_odb *db, const git_oid *short_id, size_t len","sig":"git_odb_object **::git_odb *::const git_oid *::size_t","return":{"type":"int","comment":" - 0 if the object was read;\n - GIT_ENOTFOUND if the object is not in the database.\n - GIT_EAMBIGUOUS if the prefix is ambiguous (several objects match the prefix)"},"description":"

Read an object from the database, given a prefix\n of its identifier.

\n","comments":"

This method queries all available ODB backends\n trying to match the 'len' first hexadecimal\n characters of the 'short_id'.\n The remaining (GIT_OID_HEXSZ-len)*4 bits of\n 'short_id' must be 0s.\n 'len' must be at least GIT_OID_MINPREFIXLEN,\n and the prefix must be long enough to identify\n a unique object in all the backends; the\n method will fail otherwise.

\n\n

The returned object is reference counted and\n internally cached, so it should be closed\n by the user once it's no longer in use.

\n","group":"odb"},"git_odb_read_header":{"type":"function","file":"odb.h","line":148,"lineto":148,"args":[{"name":"len_out","type":"size_t *","comment":"pointer where to store the length"},{"name":"type_out","type":"git_otype *","comment":"pointer where to store the type"},{"name":"db","type":"git_odb *","comment":"database to search for the object in."},{"name":"id","type":"const git_oid *","comment":"identity of the object to read."}],"argline":"size_t *len_out, git_otype *type_out, git_odb *db, const git_oid *id","sig":"size_t *::git_otype *::git_odb *::const git_oid *","return":{"type":"int","comment":" - 0 if the object was read;\n - GIT_ENOTFOUND if the object is not in the database."},"description":"

Read the header of an object from the database, without\n reading its full contents.

\n","comments":"

The header includes the length and the type of an object.

\n\n

Note that most backends do not support reading only the header\n of an object, so the whole object will be read and then the\n header will be returned.

\n","group":"odb"},"git_odb_exists":{"type":"function","file":"odb.h","line":159,"lineto":159,"args":[{"name":"db","type":"git_odb *","comment":"database to be searched for the given object."},{"name":"id","type":"const git_oid *","comment":"the object to search for."}],"argline":"git_odb *db, const git_oid *id","sig":"git_odb *::const git_oid *","return":{"type":"int","comment":" - 1, if the object was found\n - 0, otherwise"},"description":"

Determine if the given object can be found in the object database.

\n","comments":"","group":"odb"},"git_odb_exists_prefix":{"type":"function","file":"odb.h","line":171,"lineto":172,"args":[{"name":"out","type":"git_oid *","comment":"The full OID of the found object if just one is found."},{"name":"db","type":"git_odb *","comment":"The database to be searched for the given object."},{"name":"short_id","type":"const git_oid *","comment":"A prefix of the id of the object to read."},{"name":"len","type":"size_t","comment":"The length of the prefix."}],"argline":"git_oid *out, git_odb *db, const git_oid *short_id, size_t len","sig":"git_oid *::git_odb *::const git_oid *::size_t","return":{"type":"int","comment":" 0 if found, GIT_ENOTFOUND if not found, GIT_EAMBIGUOUS if multiple\n matches were found, other value \n<\n 0 if there was a read error."},"description":"

Determine if objects can be found in the object database from a short OID.

\n","comments":"","group":"odb"},"git_odb_refresh":{"type":"function","file":"odb.h","line":192,"lineto":192,"args":[{"name":"db","type":"struct git_odb *","comment":"database to refresh"}],"argline":"struct git_odb *db","sig":"struct git_odb *","return":{"type":"int","comment":" 0 on success, error code otherwise"},"description":"

Refresh the object database to load newly added files.

\n","comments":"

If the object databases have changed on disk while the library\n is running, this function will force a reload of the underlying\n indexes.

\n\n

Use this function when you're confident that an external\n application has tampered with the ODB.

\n\n

NOTE that it is not necessary to call this function at all. The\n library will automatically attempt to refresh the ODB\n when a lookup fails, to see if the looked up object exists\n on disk but hasn't been loaded yet.

\n","group":"odb"},"git_odb_foreach":{"type":"function","file":"odb.h","line":207,"lineto":207,"args":[{"name":"db","type":"git_odb *","comment":"database to use"},{"name":"cb","type":"git_odb_foreach_cb","comment":"the callback to call for each object"},{"name":"payload","type":"void *","comment":"data to pass to the callback"}],"argline":"git_odb *db, git_odb_foreach_cb cb, void *payload","sig":"git_odb *::git_odb_foreach_cb::void *","return":{"type":"int","comment":" 0 on success, non-zero callback return value, or error code"},"description":"

List all objects available in the database

\n","comments":"

The callback will be called for each object available in the\n database. Note that the objects are likely to be returned in the index\n order, which would make accessing the objects in that order inefficient.\n Return a non-zero value from the callback to stop looping.

\n","group":"odb"},"git_odb_write":{"type":"function","file":"odb.h","line":227,"lineto":227,"args":[{"name":"out","type":"git_oid *","comment":"pointer to store the OID result of the write"},{"name":"odb","type":"git_odb *","comment":"object database where to store the object"},{"name":"data","type":"const void *","comment":"buffer with the data to store"},{"name":"len","type":"size_t","comment":"size of the buffer"},{"name":"type","type":"git_otype","comment":"type of the data to store"}],"argline":"git_oid *out, git_odb *odb, const void *data, size_t len, git_otype type","sig":"git_oid *::git_odb *::const void *::size_t::git_otype","return":{"type":"int","comment":" 0 or an error code"},"description":"

Write an object directly into the ODB

\n","comments":"

This method writes a full object straight into the ODB.\n For most cases, it is preferred to write objects through a write\n stream, which is both faster and less memory intensive, specially\n for big objects.

\n\n

This method is provided for compatibility with custom backends\n which are not able to support streaming writes

\n","group":"odb","examples":{"general.c":["ex/v0.23.0/general.html#git_odb_write-35"]}},"git_odb_open_wstream":{"type":"function","file":"odb.h","line":250,"lineto":250,"args":[{"name":"out","type":"git_odb_stream **","comment":"pointer where to store the stream"},{"name":"db","type":"git_odb *","comment":"object database where the stream will write"},{"name":"size","type":"git_off_t","comment":"final size of the object that will be written"},{"name":"type","type":"git_otype","comment":"type of the object that will be written"}],"argline":"git_odb_stream **out, git_odb *db, git_off_t size, git_otype type","sig":"git_odb_stream **::git_odb *::git_off_t::git_otype","return":{"type":"int","comment":" 0 if the stream was created; error code otherwise"},"description":"

Open a stream to write an object into the ODB

\n","comments":"

The type and final length of the object must be specified\n when opening the stream.

\n\n

The returned stream will be of type GIT_STREAM_WRONLY, and it\n won't be effective until git_odb_stream_finalize_write is called\n and returns without an error

\n\n

The stream must always be freed when done with git_odb_stream_free or\n will leak memory.

\n","group":"odb"},"git_odb_stream_write":{"type":"function","file":"odb.h","line":263,"lineto":263,"args":[{"name":"stream","type":"git_odb_stream *","comment":"the stream"},{"name":"buffer","type":"const char *","comment":"the data to write"},{"name":"len","type":"size_t","comment":"the buffer's length"}],"argline":"git_odb_stream *stream, const char *buffer, size_t len","sig":"git_odb_stream *::const char *::size_t","return":{"type":"int","comment":" 0 if the write succeeded; error code otherwise"},"description":"

Write to an odb stream

\n","comments":"

This method will fail if the total number of received bytes exceeds the\n size declared with git_odb_open_wstream()

\n","group":"odb"},"git_odb_stream_finalize_write":{"type":"function","file":"odb.h","line":278,"lineto":278,"args":[{"name":"out","type":"git_oid *","comment":"pointer to store the resulting object's id"},{"name":"stream","type":"git_odb_stream *","comment":"the stream"}],"argline":"git_oid *out, git_odb_stream *stream","sig":"git_oid *::git_odb_stream *","return":{"type":"int","comment":" 0 on success; an error code otherwise"},"description":"

Finish writing to an odb stream

\n","comments":"

The object will take its final name and will be available to the\n odb.

\n\n

This method will fail if the total number of received bytes\n differs from the size declared with git_odb_open_wstream()

\n","group":"odb"},"git_odb_stream_read":{"type":"function","file":"odb.h","line":285,"lineto":285,"args":[{"name":"stream","type":"git_odb_stream *","comment":null},{"name":"buffer","type":"char *","comment":null},{"name":"len","type":"size_t","comment":null}],"argline":"git_odb_stream *stream, char *buffer, size_t len","sig":"git_odb_stream *::char *::size_t","return":{"type":"int","comment":null},"description":"

Read from an odb stream

\n","comments":"

Most backends don't implement streaming reads

\n","group":"odb"},"git_odb_stream_free":{"type":"function","file":"odb.h","line":292,"lineto":292,"args":[{"name":"stream","type":"git_odb_stream *","comment":"the stream to free"}],"argline":"git_odb_stream *stream","sig":"git_odb_stream *","return":{"type":"void","comment":null},"description":"

Free an odb stream

\n","comments":"","group":"odb"},"git_odb_open_rstream":{"type":"function","file":"odb.h","line":318,"lineto":318,"args":[{"name":"out","type":"git_odb_stream **","comment":"pointer where to store the stream"},{"name":"db","type":"git_odb *","comment":"object database where the stream will read from"},{"name":"oid","type":"const git_oid *","comment":"oid of the object the stream will read from"}],"argline":"git_odb_stream **out, git_odb *db, const git_oid *oid","sig":"git_odb_stream **::git_odb *::const git_oid *","return":{"type":"int","comment":" 0 if the stream was created; error code otherwise"},"description":"

Open a stream to read an object from the ODB

\n","comments":"

Note that most backends do not support streaming reads\n because they store their objects as compressed/delta'ed blobs.

\n\n

It's recommended to use git_odb_read instead, which is\n assured to work on all backends.

\n\n

The returned stream will be of type GIT_STREAM_RDONLY and\n will have the following methods:

\n\n
    - stream->read: read `n` bytes from the stream\n    - stream->free: free the stream\n
\n\n

The stream must always be free'd or will leak memory.

\n","group":"odb"},"git_odb_write_pack":{"type":"function","file":"odb.h","line":338,"lineto":342,"args":[{"name":"out","type":"git_odb_writepack **","comment":"pointer to the writepack functions"},{"name":"db","type":"git_odb *","comment":"object database where the stream will read from"},{"name":"progress_cb","type":"git_transfer_progress_cb","comment":"function to call with progress information.\n Be aware that this is called inline with network and indexing operations,\n so performance may be affected."},{"name":"progress_payload","type":"void *","comment":"payload for the progress callback"}],"argline":"git_odb_writepack **out, git_odb *db, git_transfer_progress_cb progress_cb, void *progress_payload","sig":"git_odb_writepack **::git_odb *::git_transfer_progress_cb::void *","return":{"type":"int","comment":null},"description":"

Open a stream for writing a pack file to the ODB.

\n","comments":"

If the ODB layer understands pack files, then the given\n packfile will likely be streamed directly to disk (and a\n corresponding index created). If the ODB layer does not\n understand pack files, the objects will be stored in whatever\n format the ODB layer uses.

\n","group":"odb"},"git_odb_hash":{"type":"function","file":"odb.h","line":356,"lineto":356,"args":[{"name":"out","type":"git_oid *","comment":"the resulting object-ID."},{"name":"data","type":"const void *","comment":"data to hash"},{"name":"len","type":"size_t","comment":"size of the data"},{"name":"type","type":"git_otype","comment":"of the data to hash"}],"argline":"git_oid *out, const void *data, size_t len, git_otype type","sig":"git_oid *::const void *::size_t::git_otype","return":{"type":"int","comment":" 0 or an error code"},"description":"

Determine the object-ID (sha1 hash) of a data buffer

\n","comments":"

The resulting SHA-1 OID will be the identifier for the data\n buffer as if the data buffer it were to written to the ODB.

\n","group":"odb"},"git_odb_hashfile":{"type":"function","file":"odb.h","line":371,"lineto":371,"args":[{"name":"out","type":"git_oid *","comment":"oid structure the result is written into."},{"name":"path","type":"const char *","comment":"file to read and determine object id for"},{"name":"type","type":"git_otype","comment":"the type of the object that will be hashed"}],"argline":"git_oid *out, const char *path, git_otype type","sig":"git_oid *::const char *::git_otype","return":{"type":"int","comment":" 0 or an error code"},"description":"

Read a file from disk and fill a git_oid with the object id\n that the file would have if it were written to the Object\n Database as an object of the given type (w/o applying filters).\n Similar functionality to git.git's git hash-object without\n the -w flag, however, with the --no-filters flag.\n If you need filters, see git_repository_hashfile.

\n","comments":"","group":"odb"},"git_odb_object_dup":{"type":"function","file":"odb.h","line":385,"lineto":385,"args":[{"name":"dest","type":"git_odb_object **","comment":"pointer where to store the copy"},{"name":"source","type":"git_odb_object *","comment":"object to copy"}],"argline":"git_odb_object **dest, git_odb_object *source","sig":"git_odb_object **::git_odb_object *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Create a copy of an odb_object

\n","comments":"

The returned copy must be manually freed with git_odb_object_free.\n Note that because of an implementation detail, the returned copy will be\n the same pointer as source: the object is internally refcounted, so the\n copy still needs to be freed twice.

\n","group":"odb"},"git_odb_object_free":{"type":"function","file":"odb.h","line":395,"lineto":395,"args":[{"name":"object","type":"git_odb_object *","comment":"object to close"}],"argline":"git_odb_object *object","sig":"git_odb_object *","return":{"type":"void","comment":null},"description":"

Close an ODB object

\n","comments":"

This method must always be called once a git_odb_object is no\n longer needed, otherwise memory will leak.

\n","group":"odb","examples":{"cat-file.c":["ex/v0.23.0/cat-file.html#git_odb_object_free-24"],"general.c":["ex/v0.23.0/general.html#git_odb_object_free-36"]}},"git_odb_object_id":{"type":"function","file":"odb.h","line":405,"lineto":405,"args":[{"name":"object","type":"git_odb_object *","comment":"the object"}],"argline":"git_odb_object *object","sig":"git_odb_object *","return":{"type":"const git_oid *","comment":" a pointer to the OID"},"description":"

Return the OID of an ODB object

\n","comments":"

This is the OID from which the object was read from

\n","group":"odb"},"git_odb_object_data":{"type":"function","file":"odb.h","line":418,"lineto":418,"args":[{"name":"object","type":"git_odb_object *","comment":"the object"}],"argline":"git_odb_object *object","sig":"git_odb_object *","return":{"type":"const void *","comment":" a pointer to the data"},"description":"

Return the data of an ODB object

\n","comments":"

This is the uncompressed, raw data as read from the ODB,\n without the leading header.

\n\n

This pointer is owned by the object and shall not be free'd.

\n","group":"odb","examples":{"general.c":["ex/v0.23.0/general.html#git_odb_object_data-37"]}},"git_odb_object_size":{"type":"function","file":"odb.h","line":429,"lineto":429,"args":[{"name":"object","type":"git_odb_object *","comment":"the object"}],"argline":"git_odb_object *object","sig":"git_odb_object *","return":{"type":"size_t","comment":" the size"},"description":"

Return the size of an ODB object

\n","comments":"

This is the real size of the data buffer, not the\n actual size of the object.

\n","group":"odb","examples":{"cat-file.c":["ex/v0.23.0/cat-file.html#git_odb_object_size-25"],"general.c":["ex/v0.23.0/general.html#git_odb_object_size-38"]}},"git_odb_object_type":{"type":"function","file":"odb.h","line":437,"lineto":437,"args":[{"name":"object","type":"git_odb_object *","comment":"the object"}],"argline":"git_odb_object *object","sig":"git_odb_object *","return":{"type":"git_otype","comment":" the type"},"description":"

Return the type of an ODB object

\n","comments":"","group":"odb","examples":{"general.c":["ex/v0.23.0/general.html#git_odb_object_type-39"]}},"git_odb_add_backend":{"type":"function","file":"odb.h","line":452,"lineto":452,"args":[{"name":"odb","type":"git_odb *","comment":"database to add the backend to"},{"name":"backend","type":"git_odb_backend *","comment":"pointer to a git_odb_backend instance"},{"name":"priority","type":"int","comment":"Value for ordering the backends queue"}],"argline":"git_odb *odb, git_odb_backend *backend, int priority","sig":"git_odb *::git_odb_backend *::int","return":{"type":"int","comment":" 0 on success; error code otherwise"},"description":"

Add a custom backend to an existing Object DB

\n","comments":"

The backends are checked in relative ordering, based on the\n value of the priority parameter.

\n\n

Read \n for more information.

\n","group":"odb"},"git_odb_add_alternate":{"type":"function","file":"odb.h","line":473,"lineto":473,"args":[{"name":"odb","type":"git_odb *","comment":"database to add the backend to"},{"name":"backend","type":"git_odb_backend *","comment":"pointer to a git_odb_backend instance"},{"name":"priority","type":"int","comment":"Value for ordering the backends queue"}],"argline":"git_odb *odb, git_odb_backend *backend, int priority","sig":"git_odb *::git_odb_backend *::int","return":{"type":"int","comment":" 0 on success; error code otherwise"},"description":"

Add a custom backend to an existing Object DB; this\n backend will work as an alternate.

\n","comments":"

Alternate backends are always checked for objects after\n all the main backends have been exhausted.

\n\n

The backends are checked in relative ordering, based on the\n value of the priority parameter.

\n\n

Writing is disabled on alternate backends.

\n\n

Read \n for more information.

\n","group":"odb"},"git_odb_num_backends":{"type":"function","file":"odb.h","line":481,"lineto":481,"args":[{"name":"odb","type":"git_odb *","comment":"object database"}],"argline":"git_odb *odb","sig":"git_odb *","return":{"type":"size_t","comment":" number of backends in the ODB"},"description":"

Get the number of ODB backend objects

\n","comments":"","group":"odb"},"git_odb_get_backend":{"type":"function","file":"odb.h","line":491,"lineto":491,"args":[{"name":"out","type":"git_odb_backend **","comment":"output pointer to ODB backend at pos"},{"name":"odb","type":"git_odb *","comment":"object database"},{"name":"pos","type":"size_t","comment":"index into object database backend list"}],"argline":"git_odb_backend **out, git_odb *odb, size_t pos","sig":"git_odb_backend **::git_odb *::size_t","return":{"type":"int","comment":" 0 on success; GIT_ENOTFOUND if pos is invalid; other errors \n<\n 0"},"description":"

Lookup an ODB backend object by index

\n","comments":"","group":"odb"},"git_odb_backend_pack":{"type":"function","file":"odb_backend.h","line":34,"lineto":34,"args":[{"name":"out","type":"git_odb_backend **","comment":"location to store the odb backend pointer"},{"name":"objects_dir","type":"const char *","comment":"the Git repository's objects directory"}],"argline":"git_odb_backend **out, const char *objects_dir","sig":"git_odb_backend **::const char *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Create a backend for the packfiles.

\n","comments":"","group":"odb"},"git_odb_backend_loose":{"type":"function","file":"odb_backend.h","line":48,"lineto":54,"args":[{"name":"out","type":"git_odb_backend **","comment":"location to store the odb backend pointer"},{"name":"objects_dir","type":"const char *","comment":"the Git repository's objects directory"},{"name":"compression_level","type":"int","comment":"zlib compression level to use"},{"name":"do_fsync","type":"int","comment":"whether to do an fsync() after writing (currently ignored)"},{"name":"dir_mode","type":"unsigned int","comment":"permissions to use creating a directory or 0 for defaults"},{"name":"file_mode","type":"unsigned int","comment":"permissions to use creating a file or 0 for defaults"}],"argline":"git_odb_backend **out, const char *objects_dir, int compression_level, int do_fsync, unsigned int dir_mode, unsigned int file_mode","sig":"git_odb_backend **::const char *::int::int::unsigned int::unsigned int","return":{"type":"int","comment":" 0 or an error code"},"description":"

Create a backend for loose objects

\n","comments":"","group":"odb"},"git_odb_backend_one_pack":{"type":"function","file":"odb_backend.h","line":67,"lineto":67,"args":[{"name":"out","type":"git_odb_backend **","comment":"location to store the odb backend pointer"},{"name":"index_file","type":"const char *","comment":"path to the packfile's .idx file"}],"argline":"git_odb_backend **out, const char *index_file","sig":"git_odb_backend **::const char *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Create a backend out of a single packfile

\n","comments":"

This can be useful for inspecting the contents of a single\n packfile.

\n","group":"odb"},"git_oid_fromstr":{"type":"function","file":"oid.h","line":47,"lineto":47,"args":[{"name":"out","type":"git_oid *","comment":"oid structure the result is written into."},{"name":"str","type":"const char *","comment":"input hex string; must be pointing at the start of\n\t\tthe hex sequence and have at least the number of bytes\n\t\tneeded for an oid encoded in hex (40 bytes)."}],"argline":"git_oid *out, const char *str","sig":"git_oid *::const char *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Parse a hex formatted object id into a git_oid.

\n","comments":"","group":"oid","examples":{"general.c":["ex/v0.23.0/general.html#git_oid_fromstr-40","ex/v0.23.0/general.html#git_oid_fromstr-41","ex/v0.23.0/general.html#git_oid_fromstr-42","ex/v0.23.0/general.html#git_oid_fromstr-43","ex/v0.23.0/general.html#git_oid_fromstr-44","ex/v0.23.0/general.html#git_oid_fromstr-45","ex/v0.23.0/general.html#git_oid_fromstr-46","ex/v0.23.0/general.html#git_oid_fromstr-47"]}},"git_oid_fromstrp":{"type":"function","file":"oid.h","line":57,"lineto":57,"args":[{"name":"out","type":"git_oid *","comment":"oid structure the result is written into."},{"name":"str","type":"const char *","comment":"input hex string; must be at least 4 characters\n long and null-terminated."}],"argline":"git_oid *out, const char *str","sig":"git_oid *::const char *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Parse a hex formatted null-terminated string into a git_oid.

\n","comments":"","group":"oid"},"git_oid_fromstrn":{"type":"function","file":"oid.h","line":70,"lineto":70,"args":[{"name":"out","type":"git_oid *","comment":"oid structure the result is written into."},{"name":"str","type":"const char *","comment":"input hex string of at least size `length`"},{"name":"length","type":"size_t","comment":"length of the input string"}],"argline":"git_oid *out, const char *str, size_t length","sig":"git_oid *::const char *::size_t","return":{"type":"int","comment":" 0 or an error code"},"description":"

Parse N characters of a hex formatted object id into a git_oid

\n","comments":"

If N is odd, N-1 characters will be parsed instead.\n The remaining space in the git_oid will be set to zero.

\n","group":"oid"},"git_oid_fromraw":{"type":"function","file":"oid.h","line":78,"lineto":78,"args":[{"name":"out","type":"git_oid *","comment":"oid structure the result is written into."},{"name":"raw","type":"const unsigned char *","comment":"the raw input bytes to be copied."}],"argline":"git_oid *out, const unsigned char *raw","sig":"git_oid *::const unsigned char *","return":{"type":"void","comment":null},"description":"

Copy an already raw oid into a git_oid structure.

\n","comments":"","group":"oid"},"git_oid_fmt":{"type":"function","file":"oid.h","line":90,"lineto":90,"args":[{"name":"out","type":"char *","comment":"output hex string; must be pointing at the start of\n\t\tthe hex sequence and have at least the number of bytes\n\t\tneeded for an oid encoded in hex (40 bytes). Only the\n\t\toid digits are written; a '\n\\\n0' terminator must be added\n\t\tby the caller if it is required."},{"name":"id","type":"const git_oid *","comment":"oid structure to format."}],"argline":"char *out, const git_oid *id","sig":"char *::const git_oid *","return":{"type":"void","comment":null},"description":"

Format a git_oid into a hex string.

\n","comments":"","group":"oid","examples":{"general.c":["ex/v0.23.0/general.html#git_oid_fmt-48","ex/v0.23.0/general.html#git_oid_fmt-49","ex/v0.23.0/general.html#git_oid_fmt-50","ex/v0.23.0/general.html#git_oid_fmt-51","ex/v0.23.0/general.html#git_oid_fmt-52"],"network/fetch.c":["ex/v0.23.0/network/fetch.html#git_oid_fmt-1","ex/v0.23.0/network/fetch.html#git_oid_fmt-2"],"network/index-pack.c":["ex/v0.23.0/network/index-pack.html#git_oid_fmt-6"],"network/ls-remote.c":["ex/v0.23.0/network/ls-remote.html#git_oid_fmt-1"]}},"git_oid_nfmt":{"type":"function","file":"oid.h","line":101,"lineto":101,"args":[{"name":"out","type":"char *","comment":"output hex string; you say how many bytes to write.\n\t\tIf the number of bytes is > GIT_OID_HEXSZ, extra bytes\n\t\twill be zeroed; if not, a '\n\\\n0' terminator is NOT added."},{"name":"n","type":"size_t","comment":"number of characters to write into out string"},{"name":"id","type":"const git_oid *","comment":"oid structure to format."}],"argline":"char *out, size_t n, const git_oid *id","sig":"char *::size_t::const git_oid *","return":{"type":"void","comment":null},"description":"

Format a git_oid into a partial hex string.

\n","comments":"","group":"oid"},"git_oid_pathfmt":{"type":"function","file":"oid.h","line":116,"lineto":116,"args":[{"name":"out","type":"char *","comment":"output hex string; must be pointing at the start of\n\t\tthe hex sequence and have at least the number of bytes\n\t\tneeded for an oid encoded in hex (41 bytes). Only the\n\t\toid digits are written; a '\n\\\n0' terminator must be added\n\t\tby the caller if it is required."},{"name":"id","type":"const git_oid *","comment":"oid structure to format."}],"argline":"char *out, const git_oid *id","sig":"char *::const git_oid *","return":{"type":"void","comment":null},"description":"

Format a git_oid into a loose-object path string.

\n","comments":"

The resulting string is "aa/...", where "aa" is the first two\n hex digits of the oid and "..." is the remaining 38 digits.

\n","group":"oid"},"git_oid_tostr_s":{"type":"function","file":"oid.h","line":129,"lineto":129,"args":[{"name":"oid","type":"const git_oid *","comment":"The oid structure to format"}],"argline":"const git_oid *oid","sig":"const git_oid *","return":{"type":"char *","comment":" the c-string"},"description":"

Format a git_oid into a statically allocated c-string.

\n","comments":"

The c-string is owned by the library and should not be freed\n by the user. If libgit2 is built with thread support, the string\n will be stored in TLS (i.e. one buffer per thread) to allow for\n concurrent calls of the function.

\n","group":"oid"},"git_oid_tostr":{"type":"function","file":"oid.h","line":148,"lineto":148,"args":[{"name":"out","type":"char *","comment":"the buffer into which the oid string is output."},{"name":"n","type":"size_t","comment":"the size of the out buffer."},{"name":"id","type":"const git_oid *","comment":"the oid structure to format."}],"argline":"char *out, size_t n, const git_oid *id","sig":"char *::size_t::const git_oid *","return":{"type":"char *","comment":" the out buffer pointer, assuming no input parameter\n\t\t\terrors, otherwise a pointer to an empty string."},"description":"

Format a git_oid into a buffer as a hex format c-string.

\n","comments":"

If the buffer is smaller than GIT_OID_HEXSZ+1, then the resulting\n oid c-string will be truncated to n-1 characters (but will still be\n NUL-byte terminated).

\n\n

If there are any input parameter errors (out == NULL, n == 0, oid ==\n NULL), then a pointer to an empty string is returned, so that the\n return value can always be printed.

\n","group":"oid","examples":{"blame.c":["ex/v0.23.0/blame.html#git_oid_tostr-18","ex/v0.23.0/blame.html#git_oid_tostr-19"],"cat-file.c":["ex/v0.23.0/cat-file.html#git_oid_tostr-26","ex/v0.23.0/cat-file.html#git_oid_tostr-27","ex/v0.23.0/cat-file.html#git_oid_tostr-28","ex/v0.23.0/cat-file.html#git_oid_tostr-29","ex/v0.23.0/cat-file.html#git_oid_tostr-30"],"log.c":["ex/v0.23.0/log.html#git_oid_tostr-39","ex/v0.23.0/log.html#git_oid_tostr-40"],"rev-parse.c":["ex/v0.23.0/rev-parse.html#git_oid_tostr-12","ex/v0.23.0/rev-parse.html#git_oid_tostr-13","ex/v0.23.0/rev-parse.html#git_oid_tostr-14","ex/v0.23.0/rev-parse.html#git_oid_tostr-15"]}},"git_oid_cpy":{"type":"function","file":"oid.h","line":156,"lineto":156,"args":[{"name":"out","type":"git_oid *","comment":"oid structure the result is written into."},{"name":"src","type":"const git_oid *","comment":"oid structure to copy from."}],"argline":"git_oid *out, const git_oid *src","sig":"git_oid *::const git_oid *","return":{"type":"void","comment":null},"description":"

Copy an oid from one structure to another.

\n","comments":"","group":"oid","examples":{"blame.c":["ex/v0.23.0/blame.html#git_oid_cpy-20","ex/v0.23.0/blame.html#git_oid_cpy-21","ex/v0.23.0/blame.html#git_oid_cpy-22"]}},"git_oid_cmp":{"type":"function","file":"oid.h","line":165,"lineto":165,"args":[{"name":"a","type":"const git_oid *","comment":"first oid structure."},{"name":"b","type":"const git_oid *","comment":"second oid structure."}],"argline":"const git_oid *a, const git_oid *b","sig":"const git_oid *::const git_oid *","return":{"type":"int","comment":" \n<\n0, 0, >0 if a \n<\n b, a == b, a > b."},"description":"

Compare two oid structures.

\n","comments":"","group":"oid"},"git_oid_equal":{"type":"function","file":"oid.h","line":174,"lineto":174,"args":[{"name":"a","type":"const git_oid *","comment":"first oid structure."},{"name":"b","type":"const git_oid *","comment":"second oid structure."}],"argline":"const git_oid *a, const git_oid *b","sig":"const git_oid *::const git_oid *","return":{"type":"int","comment":" true if equal, false otherwise"},"description":"

Compare two oid structures for equality

\n","comments":"","group":"oid"},"git_oid_ncmp":{"type":"function","file":"oid.h","line":185,"lineto":185,"args":[{"name":"a","type":"const git_oid *","comment":"first oid structure."},{"name":"b","type":"const git_oid *","comment":"second oid structure."},{"name":"len","type":"size_t","comment":"the number of hex chars to compare"}],"argline":"const git_oid *a, const git_oid *b, size_t len","sig":"const git_oid *::const git_oid *::size_t","return":{"type":"int","comment":" 0 in case of a match"},"description":"

Compare the first 'len' hexadecimal characters (packets of 4 bits)\n of two oid structures.

\n","comments":"","group":"oid"},"git_oid_streq":{"type":"function","file":"oid.h","line":194,"lineto":194,"args":[{"name":"id","type":"const git_oid *","comment":"oid structure."},{"name":"str","type":"const char *","comment":"input hex string of an object id."}],"argline":"const git_oid *id, const char *str","sig":"const git_oid *::const char *","return":{"type":"int","comment":" 0 in case of a match, -1 otherwise."},"description":"

Check if an oid equals an hex formatted object id.

\n","comments":"","group":"oid"},"git_oid_strcmp":{"type":"function","file":"oid.h","line":204,"lineto":204,"args":[{"name":"id","type":"const git_oid *","comment":"oid structure."},{"name":"str","type":"const char *","comment":"input hex string of an object id."}],"argline":"const git_oid *id, const char *str","sig":"const git_oid *::const char *","return":{"type":"int","comment":" -1 if str is not valid, \n<\n0 if id sorts before str,\n 0 if id matches str, >0 if id sorts after str."},"description":"

Compare an oid to an hex formatted object id.

\n","comments":"","group":"oid"},"git_oid_iszero":{"type":"function","file":"oid.h","line":211,"lineto":211,"args":[{"name":"id","type":"const git_oid *","comment":null}],"argline":"const git_oid *id","sig":"const git_oid *","return":{"type":"int","comment":" 1 if all zeros, 0 otherwise."},"description":"

Check is an oid is all zeros.

\n","comments":"","group":"oid","examples":{"blame.c":["ex/v0.23.0/blame.html#git_oid_iszero-23"],"network/fetch.c":["ex/v0.23.0/network/fetch.html#git_oid_iszero-3"]}},"git_oid_shorten_new":{"type":"function","file":"oid.h","line":232,"lineto":232,"args":[{"name":"min_length","type":"size_t","comment":"The minimal length for all identifiers,\n\t\twhich will be used even if shorter OIDs would still\n\t\tbe unique."}],"argline":"size_t min_length","sig":"size_t","return":{"type":"git_oid_shorten *","comment":" a `git_oid_shorten` instance, NULL if OOM"},"description":"

Create a new OID shortener.

\n","comments":"

The OID shortener is used to process a list of OIDs\n in text form and return the shortest length that would\n uniquely identify all of them.

\n\n

E.g. look at the result of git log --abbrev.

\n","group":"oid"},"git_oid_shorten_add":{"type":"function","file":"oid.h","line":258,"lineto":258,"args":[{"name":"os","type":"git_oid_shorten *","comment":"a `git_oid_shorten` instance"},{"name":"text_id","type":"const char *","comment":"an OID in text form"}],"argline":"git_oid_shorten *os, const char *text_id","sig":"git_oid_shorten *::const char *","return":{"type":"int","comment":" the minimal length to uniquely identify all OIDs\n\t\tadded so far to the set; or an error code (\n<\n0) if an\n\t\terror occurs."},"description":"

Add a new OID to set of shortened OIDs and calculate\n the minimal length to uniquely identify all the OIDs in\n the set.

\n","comments":"

The OID is expected to be a 40-char hexadecimal string.\n The OID is owned by the user and will not be modified\n or freed.

\n\n

For performance reasons, there is a hard-limit of how many\n OIDs can be added to a single set (around ~32000, assuming\n a mostly randomized distribution), which should be enough\n for any kind of program, and keeps the algorithm fast and\n memory-efficient.

\n\n

Attempting to add more than those OIDs will result in a\n GITERR_INVALID error

\n","group":"oid"},"git_oid_shorten_free":{"type":"function","file":"oid.h","line":265,"lineto":265,"args":[{"name":"os","type":"git_oid_shorten *","comment":"a `git_oid_shorten` instance"}],"argline":"git_oid_shorten *os","sig":"git_oid_shorten *","return":{"type":"void","comment":null},"description":"

Free an OID shortener instance

\n","comments":"","group":"oid"},"git_oidarray_free":{"type":"function","file":"oidarray.h","line":34,"lineto":34,"args":[{"name":"array","type":"git_oidarray *","comment":"git_oidarray from which to free oid data"}],"argline":"git_oidarray *array","sig":"git_oidarray *","return":{"type":"void","comment":null},"description":"

Free the OID array

\n","comments":"

This method must (and must only) be called on git_oidarray\n objects where the array is allocated by the library. Not doing so,\n will result in a memory leak.

\n\n

This does not free the git_oidarray itself, since the library will\n never allocate that object directly itself (it is more commonly embedded\n inside another struct or created on the stack).

\n","group":"oidarray"},"git_packbuilder_new":{"type":"function","file":"pack.h","line":64,"lineto":64,"args":[{"name":"out","type":"git_packbuilder **","comment":"The new packbuilder object"},{"name":"repo","type":"git_repository *","comment":"The repository"}],"argline":"git_packbuilder **out, git_repository *repo","sig":"git_packbuilder **::git_repository *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Initialize a new packbuilder

\n","comments":"","group":"packbuilder"},"git_packbuilder_set_threads":{"type":"function","file":"pack.h","line":77,"lineto":77,"args":[{"name":"pb","type":"git_packbuilder *","comment":"The packbuilder"},{"name":"n","type":"unsigned int","comment":"Number of threads to spawn"}],"argline":"git_packbuilder *pb, unsigned int n","sig":"git_packbuilder *::unsigned int","return":{"type":"unsigned int","comment":" number of actual threads to be used"},"description":"

Set number of threads to spawn

\n","comments":"

By default, libgit2 won't spawn any threads at all;\n when set to 0, libgit2 will autodetect the number of\n CPUs.

\n","group":"packbuilder"},"git_packbuilder_insert":{"type":"function","file":"pack.h","line":91,"lineto":91,"args":[{"name":"pb","type":"git_packbuilder *","comment":"The packbuilder"},{"name":"id","type":"const git_oid *","comment":"The oid of the commit"},{"name":"name","type":"const char *","comment":"The name; might be NULL"}],"argline":"git_packbuilder *pb, const git_oid *id, const char *name","sig":"git_packbuilder *::const git_oid *::const char *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Insert a single object

\n","comments":"

For an optimal pack it's mandatory to insert objects in recency order,\n commits followed by trees and blobs.

\n","group":"packbuilder"},"git_packbuilder_insert_tree":{"type":"function","file":"pack.h","line":103,"lineto":103,"args":[{"name":"pb","type":"git_packbuilder *","comment":"The packbuilder"},{"name":"id","type":"const git_oid *","comment":"The oid of the root tree"}],"argline":"git_packbuilder *pb, const git_oid *id","sig":"git_packbuilder *::const git_oid *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Insert a root tree object

\n","comments":"

This will add the tree as well as all referenced trees and blobs.

\n","group":"packbuilder"},"git_packbuilder_insert_commit":{"type":"function","file":"pack.h","line":115,"lineto":115,"args":[{"name":"pb","type":"git_packbuilder *","comment":"The packbuilder"},{"name":"id","type":"const git_oid *","comment":"The oid of the commit"}],"argline":"git_packbuilder *pb, const git_oid *id","sig":"git_packbuilder *::const git_oid *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Insert a commit object

\n","comments":"

This will add a commit as well as the completed referenced tree.

\n","group":"packbuilder"},"git_packbuilder_insert_walk":{"type":"function","file":"pack.h","line":128,"lineto":128,"args":[{"name":"pb","type":"git_packbuilder *","comment":"the packbuilder"},{"name":"walk","type":"git_revwalk *","comment":"the revwalk to use to fill the packbuilder"}],"argline":"git_packbuilder *pb, git_revwalk *walk","sig":"git_packbuilder *::git_revwalk *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Insert objects as given by the walk

\n","comments":"

Those commits and all objects they reference will be inserted into\n the packbuilder.

\n","group":"packbuilder"},"git_packbuilder_insert_recur":{"type":"function","file":"pack.h","line":140,"lineto":140,"args":[{"name":"pb","type":"git_packbuilder *","comment":"the packbuilder"},{"name":"id","type":"const git_oid *","comment":"the id of the root object to insert"},{"name":"name","type":"const char *","comment":"optional name for the object"}],"argline":"git_packbuilder *pb, const git_oid *id, const char *name","sig":"git_packbuilder *::const git_oid *::const char *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Recursively insert an object and its referenced objects

\n","comments":"

Insert the object as well as any object it references.

\n","group":"packbuilder"},"git_packbuilder_write":{"type":"function","file":"pack.h","line":164,"lineto":169,"args":[{"name":"pb","type":"git_packbuilder *","comment":"The packbuilder"},{"name":"path","type":"const char *","comment":"to the directory where the packfile and index should be stored"},{"name":"mode","type":"unsigned int","comment":"permissions to use creating a packfile or 0 for defaults"},{"name":"progress_cb","type":"git_transfer_progress_cb","comment":"function to call with progress information from the indexer (optional)"},{"name":"progress_cb_payload","type":"void *","comment":"payload for the progress callback (optional)"}],"argline":"git_packbuilder *pb, const char *path, unsigned int mode, git_transfer_progress_cb progress_cb, void *progress_cb_payload","sig":"git_packbuilder *::const char *::unsigned int::git_transfer_progress_cb::void *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Write the new pack and corresponding index file to path.

\n","comments":"","group":"packbuilder"},"git_packbuilder_hash":{"type":"function","file":"pack.h","line":179,"lineto":179,"args":[{"name":"pb","type":"git_packbuilder *","comment":"The packbuilder object"}],"argline":"git_packbuilder *pb","sig":"git_packbuilder *","return":{"type":"const git_oid *","comment":null},"description":"

Get the packfile's hash

\n","comments":"

A packfile's name is derived from the sorted hashing of all object\n names. This is only correct after the packfile has been written.

\n","group":"packbuilder"},"git_packbuilder_foreach":{"type":"function","file":"pack.h","line":191,"lineto":191,"args":[{"name":"pb","type":"git_packbuilder *","comment":"the packbuilder"},{"name":"cb","type":"git_packbuilder_foreach_cb","comment":"the callback to call with each packed object's buffer"},{"name":"payload","type":"void *","comment":"the callback's data"}],"argline":"git_packbuilder *pb, git_packbuilder_foreach_cb cb, void *payload","sig":"git_packbuilder *::git_packbuilder_foreach_cb::void *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Create the new pack and pass each object to the callback

\n","comments":"","group":"packbuilder"},"git_packbuilder_object_count":{"type":"function","file":"pack.h","line":199,"lineto":199,"args":[{"name":"pb","type":"git_packbuilder *","comment":"the packbuilder"}],"argline":"git_packbuilder *pb","sig":"git_packbuilder *","return":{"type":"uint32_t","comment":" the number of objects in the packfile"},"description":"

Get the total number of objects the packbuilder will write out

\n","comments":"","group":"packbuilder"},"git_packbuilder_written":{"type":"function","file":"pack.h","line":207,"lineto":207,"args":[{"name":"pb","type":"git_packbuilder *","comment":"the packbuilder"}],"argline":"git_packbuilder *pb","sig":"git_packbuilder *","return":{"type":"uint32_t","comment":" the number of objects which have already been written"},"description":"

Get the number of objects the packbuilder has already written out

\n","comments":"","group":"packbuilder"},"git_packbuilder_set_callbacks":{"type":"function","file":"pack.h","line":226,"lineto":229,"args":[{"name":"pb","type":"git_packbuilder *","comment":"The packbuilder object"},{"name":"progress_cb","type":"git_packbuilder_progress","comment":"Function to call with progress information during\n pack building. Be aware that this is called inline with pack building\n operations, so performance may be affected."},{"name":"progress_cb_payload","type":"void *","comment":"Payload for progress callback."}],"argline":"git_packbuilder *pb, git_packbuilder_progress progress_cb, void *progress_cb_payload","sig":"git_packbuilder *::git_packbuilder_progress::void *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Set the callbacks for a packbuilder

\n","comments":"","group":"packbuilder"},"git_packbuilder_free":{"type":"function","file":"pack.h","line":236,"lineto":236,"args":[{"name":"pb","type":"git_packbuilder *","comment":"The packbuilder"}],"argline":"git_packbuilder *pb","sig":"git_packbuilder *","return":{"type":"void","comment":null},"description":"

Free the packbuilder and all associated data

\n","comments":"","group":"packbuilder"},"git_patch_from_diff":{"type":"function","file":"patch.h","line":51,"lineto":52,"args":[{"name":"out","type":"git_patch **","comment":"Output parameter for the delta patch object"},{"name":"diff","type":"git_diff *","comment":"Diff list object"},{"name":"idx","type":"size_t","comment":"Index into diff list"}],"argline":"git_patch **out, git_diff *diff, size_t idx","sig":"git_patch **::git_diff *::size_t","return":{"type":"int","comment":" 0 on success, other value \n<\n 0 on error"},"description":"

Return a patch for an entry in the diff list.

\n","comments":"

The git_patch is a newly created object contains the text diffs\n for the delta. You have to call git_patch_free() when you are\n done with it. You can use the patch object to loop over all the hunks\n and lines in the diff of the one delta.

\n\n

For an unchanged file or a binary file, no git_patch will be\n created, the output will be set to NULL, and the binary flag will be\n set true in the git_diff_delta structure.

\n\n

It is okay to pass NULL for either of the output parameters; if you pass\n NULL for the git_patch, then the text diff will not be calculated.

\n","group":"patch"},"git_patch_from_blobs":{"type":"function","file":"patch.h","line":70,"lineto":76,"args":[{"name":"out","type":"git_patch **","comment":"The generated patch; NULL on error"},{"name":"old_blob","type":"const git_blob *","comment":"Blob for old side of diff, or NULL for empty blob"},{"name":"old_as_path","type":"const char *","comment":"Treat old blob as if it had this filename; can be NULL"},{"name":"new_blob","type":"const git_blob *","comment":"Blob for new side of diff, or NULL for empty blob"},{"name":"new_as_path","type":"const char *","comment":"Treat new blob as if it had this filename; can be NULL"},{"name":"opts","type":"const git_diff_options *","comment":"Options for diff, or NULL for default options"}],"argline":"git_patch **out, const git_blob *old_blob, const char *old_as_path, const git_blob *new_blob, const char *new_as_path, const git_diff_options *opts","sig":"git_patch **::const git_blob *::const char *::const git_blob *::const char *::const git_diff_options *","return":{"type":"int","comment":" 0 on success or error code \n<\n 0"},"description":"

Directly generate a patch from the difference between two blobs.

\n","comments":"

This is just like git_diff_blobs() except it generates a patch object\n for the difference instead of directly making callbacks. You can use the\n standard git_patch accessor functions to read the patch data, and\n you must call git_patch_free() on the patch when done.

\n","group":"patch"},"git_patch_from_blob_and_buffer":{"type":"function","file":"patch.h","line":95,"lineto":102,"args":[{"name":"out","type":"git_patch **","comment":"The generated patch; NULL on error"},{"name":"old_blob","type":"const git_blob *","comment":"Blob for old side of diff, or NULL for empty blob"},{"name":"old_as_path","type":"const char *","comment":"Treat old blob as if it had this filename; can be NULL"},{"name":"buffer","type":"const char *","comment":"Raw data for new side of diff, or NULL for empty"},{"name":"buffer_len","type":"size_t","comment":"Length of raw data for new side of diff"},{"name":"buffer_as_path","type":"const char *","comment":"Treat buffer as if it had this filename; can be NULL"},{"name":"opts","type":"const git_diff_options *","comment":"Options for diff, or NULL for default options"}],"argline":"git_patch **out, const git_blob *old_blob, const char *old_as_path, const char *buffer, size_t buffer_len, const char *buffer_as_path, const git_diff_options *opts","sig":"git_patch **::const git_blob *::const char *::const char *::size_t::const char *::const git_diff_options *","return":{"type":"int","comment":" 0 on success or error code \n<\n 0"},"description":"

Directly generate a patch from the difference between a blob and a buffer.

\n","comments":"

This is just like git_diff_blob_to_buffer() except it generates a patch\n object for the difference instead of directly making callbacks. You can\n use the standard git_patch accessor functions to read the patch\n data, and you must call git_patch_free() on the patch when done.

\n","group":"patch"},"git_patch_from_buffers":{"type":"function","file":"patch.h","line":122,"lineto":130,"args":[{"name":"out","type":"git_patch **","comment":"The generated patch; NULL on error"},{"name":"old_buffer","type":"const void *","comment":"Raw data for old side of diff, or NULL for empty"},{"name":"old_len","type":"size_t","comment":"Length of the raw data for old side of the diff"},{"name":"old_as_path","type":"const char *","comment":"Treat old buffer as if it had this filename; can be NULL"},{"name":"new_buffer","type":"const char *","comment":"Raw data for new side of diff, or NULL for empty"},{"name":"new_len","type":"size_t","comment":"Length of raw data for new side of diff"},{"name":"new_as_path","type":"const char *","comment":"Treat buffer as if it had this filename; can be NULL"},{"name":"opts","type":"const git_diff_options *","comment":"Options for diff, or NULL for default options"}],"argline":"git_patch **out, const void *old_buffer, size_t old_len, const char *old_as_path, const char *new_buffer, size_t new_len, const char *new_as_path, const git_diff_options *opts","sig":"git_patch **::const void *::size_t::const char *::const char *::size_t::const char *::const git_diff_options *","return":{"type":"int","comment":" 0 on success or error code \n<\n 0"},"description":"

Directly generate a patch from the difference between two buffers.

\n","comments":"

This is just like git_diff_buffers() except it generates a patch\n object for the difference instead of directly making callbacks. You can\n use the standard git_patch accessor functions to read the patch\n data, and you must call git_patch_free() on the patch when done.

\n","group":"patch"},"git_patch_free":{"type":"function","file":"patch.h","line":135,"lineto":135,"args":[{"name":"patch","type":"git_patch *","comment":null}],"argline":"git_patch *patch","sig":"git_patch *","return":{"type":"void","comment":null},"description":"

Free a git_patch object.

\n","comments":"","group":"patch"},"git_patch_get_delta":{"type":"function","file":"patch.h","line":141,"lineto":141,"args":[{"name":"patch","type":"const git_patch *","comment":null}],"argline":"const git_patch *patch","sig":"const git_patch *","return":{"type":"const git_diff_delta *","comment":null},"description":"

Get the delta associated with a patch. This delta points to internal\n data and you do not have to release it when you are done with it.

\n","comments":"","group":"patch"},"git_patch_num_hunks":{"type":"function","file":"patch.h","line":146,"lineto":146,"args":[{"name":"patch","type":"const git_patch *","comment":null}],"argline":"const git_patch *patch","sig":"const git_patch *","return":{"type":"size_t","comment":null},"description":"

Get the number of hunks in a patch

\n","comments":"","group":"patch"},"git_patch_line_stats":{"type":"function","file":"patch.h","line":164,"lineto":168,"args":[{"name":"total_context","type":"size_t *","comment":"Count of context lines in output, can be NULL."},{"name":"total_additions","type":"size_t *","comment":"Count of addition lines in output, can be NULL."},{"name":"total_deletions","type":"size_t *","comment":"Count of deletion lines in output, can be NULL."},{"name":"patch","type":"const git_patch *","comment":"The git_patch object"}],"argline":"size_t *total_context, size_t *total_additions, size_t *total_deletions, const git_patch *patch","sig":"size_t *::size_t *::size_t *::const git_patch *","return":{"type":"int","comment":" 0 on success, \n<\n0 on error"},"description":"

Get line counts of each type in a patch.

\n","comments":"

This helps imitate a diff --numstat type of output. For that purpose,\n you only need the total_additions and total_deletions values, but we\n include the total_context line count in case you want the total number\n of lines of diff output that will be generated.

\n\n

All outputs are optional. Pass NULL if you don't need a particular count.

\n","group":"patch"},"git_patch_get_hunk":{"type":"function","file":"patch.h","line":183,"lineto":187,"args":[{"name":"out","type":"const git_diff_hunk **","comment":"Output pointer to git_diff_hunk of hunk"},{"name":"lines_in_hunk","type":"size_t *","comment":"Output count of total lines in this hunk"},{"name":"patch","type":"git_patch *","comment":"Input pointer to patch object"},{"name":"hunk_idx","type":"size_t","comment":"Input index of hunk to get information about"}],"argline":"const git_diff_hunk **out, size_t *lines_in_hunk, git_patch *patch, size_t hunk_idx","sig":"const git_diff_hunk **::size_t *::git_patch *::size_t","return":{"type":"int","comment":" 0 on success, GIT_ENOTFOUND if hunk_idx out of range, \n<\n0 on error"},"description":"

Get the information about a hunk in a patch

\n","comments":"

Given a patch and a hunk index into the patch, this returns detailed\n information about that hunk. Any of the output pointers can be passed\n as NULL if you don't care about that particular piece of information.

\n","group":"patch"},"git_patch_num_lines_in_hunk":{"type":"function","file":"patch.h","line":196,"lineto":198,"args":[{"name":"patch","type":"const git_patch *","comment":"The git_patch object"},{"name":"hunk_idx","type":"size_t","comment":"Index of the hunk"}],"argline":"const git_patch *patch, size_t hunk_idx","sig":"const git_patch *::size_t","return":{"type":"int","comment":" Number of lines in hunk or -1 if invalid hunk index"},"description":"

Get the number of lines in a hunk.

\n","comments":"","group":"patch"},"git_patch_get_line_in_hunk":{"type":"function","file":"patch.h","line":214,"lineto":218,"args":[{"name":"out","type":"const git_diff_line **","comment":"The git_diff_line data for this line"},{"name":"patch","type":"git_patch *","comment":"The patch to look in"},{"name":"hunk_idx","type":"size_t","comment":"The index of the hunk"},{"name":"line_of_hunk","type":"size_t","comment":"The index of the line in the hunk"}],"argline":"const git_diff_line **out, git_patch *patch, size_t hunk_idx, size_t line_of_hunk","sig":"const git_diff_line **::git_patch *::size_t::size_t","return":{"type":"int","comment":" 0 on success, \n<\n0 on failure"},"description":"

Get data about a line in a hunk of a patch.

\n","comments":"

Given a patch, a hunk index, and a line index in the hunk, this\n will return a lot of details about that line. If you pass a hunk\n index larger than the number of hunks or a line index larger than\n the number of lines in the hunk, this will return -1.

\n","group":"patch"},"git_patch_size":{"type":"function","file":"patch.h","line":236,"lineto":240,"args":[{"name":"patch","type":"git_patch *","comment":"A git_patch representing changes to one file"},{"name":"include_context","type":"int","comment":"Include context lines in size if non-zero"},{"name":"include_hunk_headers","type":"int","comment":"Include hunk header lines if non-zero"},{"name":"include_file_headers","type":"int","comment":"Include file header lines if non-zero"}],"argline":"git_patch *patch, int include_context, int include_hunk_headers, int include_file_headers","sig":"git_patch *::int::int::int","return":{"type":"size_t","comment":" The number of bytes of data"},"description":"

Look up size of patch diff data in bytes

\n","comments":"

This returns the raw size of the patch data. This only includes the\n actual data from the lines of the diff, not the file or hunk headers.

\n\n

If you pass include_context as true (non-zero), this will be the size\n of all of the diff output; if you pass it as false (zero), this will\n only include the actual changed lines (as if context_lines was 0).

\n","group":"patch"},"git_patch_print":{"type":"function","file":"patch.h","line":254,"lineto":257,"args":[{"name":"patch","type":"git_patch *","comment":"A git_patch representing changes to one file"},{"name":"print_cb","type":"git_diff_line_cb","comment":"Callback function to output lines of the patch. Will be\n called for file headers, hunk headers, and diff lines."},{"name":"payload","type":"void *","comment":"Reference pointer that will be passed to your callbacks."}],"argline":"git_patch *patch, git_diff_line_cb print_cb, void *payload","sig":"git_patch *::git_diff_line_cb::void *","return":{"type":"int","comment":" 0 on success, non-zero callback return value, or error code"},"description":"

Serialize the patch to text via callback.

\n","comments":"

Returning a non-zero value from the callback will terminate the iteration\n and return that value to the caller.

\n","group":"patch"},"git_patch_to_buf":{"type":"function","file":"patch.h","line":266,"lineto":268,"args":[{"name":"out","type":"git_buf *","comment":"The git_buf to be filled in"},{"name":"patch","type":"git_patch *","comment":"A git_patch representing changes to one file"}],"argline":"git_buf *out, git_patch *patch","sig":"git_buf *::git_patch *","return":{"type":"int","comment":" 0 on success, \n<\n0 on failure."},"description":"

Get the content of a patch as a single diff text.

\n","comments":"","group":"patch"},"git_pathspec_new":{"type":"function","file":"pathspec.h","line":65,"lineto":66,"args":[{"name":"out","type":"git_pathspec **","comment":"Output of the compiled pathspec"},{"name":"pathspec","type":"const git_strarray *","comment":"A git_strarray of the paths to match"}],"argline":"git_pathspec **out, const git_strarray *pathspec","sig":"git_pathspec **::const git_strarray *","return":{"type":"int","comment":" 0 on success, \n<\n0 on failure"},"description":"

Compile a pathspec

\n","comments":"","group":"pathspec","examples":{"log.c":["ex/v0.23.0/log.html#git_pathspec_new-41"]}},"git_pathspec_free":{"type":"function","file":"pathspec.h","line":73,"lineto":73,"args":[{"name":"ps","type":"git_pathspec *","comment":"The compiled pathspec"}],"argline":"git_pathspec *ps","sig":"git_pathspec *","return":{"type":"void","comment":null},"description":"

Free a pathspec

\n","comments":"","group":"pathspec","examples":{"log.c":["ex/v0.23.0/log.html#git_pathspec_free-42"]}},"git_pathspec_matches_path":{"type":"function","file":"pathspec.h","line":88,"lineto":89,"args":[{"name":"ps","type":"const git_pathspec *","comment":"The compiled pathspec"},{"name":"flags","type":"uint32_t","comment":"Combination of git_pathspec_flag_t options to control match"},{"name":"path","type":"const char *","comment":"The pathname to attempt to match"}],"argline":"const git_pathspec *ps, uint32_t flags, const char *path","sig":"const git_pathspec *::uint32_t::const char *","return":{"type":"int","comment":" 1 is path matches spec, 0 if it does not"},"description":"

Try to match a path against a pathspec

\n","comments":"

Unlike most of the other pathspec matching functions, this will not\n fall back on the native case-sensitivity for your platform. You must\n explicitly pass flags to control case sensitivity or else this will\n fall back on being case sensitive.

\n","group":"pathspec"},"git_pathspec_match_workdir":{"type":"function","file":"pathspec.h","line":113,"lineto":117,"args":[{"name":"out","type":"git_pathspec_match_list **","comment":"Output list of matches; pass NULL to just get return value"},{"name":"repo","type":"git_repository *","comment":"The repository in which to match; bare repo is an error"},{"name":"flags","type":"uint32_t","comment":"Combination of git_pathspec_flag_t options to control match"},{"name":"ps","type":"git_pathspec *","comment":"Pathspec to be matched"}],"argline":"git_pathspec_match_list **out, git_repository *repo, uint32_t flags, git_pathspec *ps","sig":"git_pathspec_match_list **::git_repository *::uint32_t::git_pathspec *","return":{"type":"int","comment":" 0 on success, -1 on error, GIT_ENOTFOUND if no matches and\n the GIT_PATHSPEC_NO_MATCH_ERROR flag was given"},"description":"

Match a pathspec against the working directory of a repository.

\n","comments":"

This matches the pathspec against the current files in the working\n directory of the repository. It is an error to invoke this on a bare\n repo. This handles git ignores (i.e. ignored files will not be\n considered to match the pathspec unless the file is tracked in the\n index).

\n\n

If out is not NULL, this returns a git_patchspec_match_list. That\n contains the list of all matched filenames (unless you pass the\n GIT_PATHSPEC_FAILURES_ONLY flag) and may also contain the list of\n pathspecs with no match (if you used the GIT_PATHSPEC_FIND_FAILURES\n flag). You must call git_pathspec_match_list_free() on this object.

\n","group":"pathspec"},"git_pathspec_match_index":{"type":"function","file":"pathspec.h","line":142,"lineto":146,"args":[{"name":"out","type":"git_pathspec_match_list **","comment":"Output list of matches; pass NULL to just get return value"},{"name":"index","type":"git_index *","comment":"The index to match against"},{"name":"flags","type":"uint32_t","comment":"Combination of git_pathspec_flag_t options to control match"},{"name":"ps","type":"git_pathspec *","comment":"Pathspec to be matched"}],"argline":"git_pathspec_match_list **out, git_index *index, uint32_t flags, git_pathspec *ps","sig":"git_pathspec_match_list **::git_index *::uint32_t::git_pathspec *","return":{"type":"int","comment":" 0 on success, -1 on error, GIT_ENOTFOUND if no matches and\n the GIT_PATHSPEC_NO_MATCH_ERROR flag is used"},"description":"

Match a pathspec against entries in an index.

\n","comments":"

This matches the pathspec against the files in the repository index.

\n\n

NOTE: At the moment, the case sensitivity of this match is controlled\n by the current case-sensitivity of the index object itself and the\n USE_CASE and IGNORE_CASE flags will have no effect. This behavior will\n be corrected in a future release.

\n\n

If out is not NULL, this returns a git_patchspec_match_list. That\n contains the list of all matched filenames (unless you pass the\n GIT_PATHSPEC_FAILURES_ONLY flag) and may also contain the list of\n pathspecs with no match (if you used the GIT_PATHSPEC_FIND_FAILURES\n flag). You must call git_pathspec_match_list_free() on this object.

\n","group":"pathspec"},"git_pathspec_match_tree":{"type":"function","file":"pathspec.h","line":166,"lineto":170,"args":[{"name":"out","type":"git_pathspec_match_list **","comment":"Output list of matches; pass NULL to just get return value"},{"name":"tree","type":"git_tree *","comment":"The root-level tree to match against"},{"name":"flags","type":"uint32_t","comment":"Combination of git_pathspec_flag_t options to control match"},{"name":"ps","type":"git_pathspec *","comment":"Pathspec to be matched"}],"argline":"git_pathspec_match_list **out, git_tree *tree, uint32_t flags, git_pathspec *ps","sig":"git_pathspec_match_list **::git_tree *::uint32_t::git_pathspec *","return":{"type":"int","comment":" 0 on success, -1 on error, GIT_ENOTFOUND if no matches and\n the GIT_PATHSPEC_NO_MATCH_ERROR flag is used"},"description":"

Match a pathspec against files in a tree.

\n","comments":"

This matches the pathspec against the files in the given tree.

\n\n

If out is not NULL, this returns a git_patchspec_match_list. That\n contains the list of all matched filenames (unless you pass the\n GIT_PATHSPEC_FAILURES_ONLY flag) and may also contain the list of\n pathspecs with no match (if you used the GIT_PATHSPEC_FIND_FAILURES\n flag). You must call git_pathspec_match_list_free() on this object.

\n","group":"pathspec","examples":{"log.c":["ex/v0.23.0/log.html#git_pathspec_match_tree-43"]}},"git_pathspec_match_diff":{"type":"function","file":"pathspec.h","line":190,"lineto":194,"args":[{"name":"out","type":"git_pathspec_match_list **","comment":"Output list of matches; pass NULL to just get return value"},{"name":"diff","type":"git_diff *","comment":"A generated diff list"},{"name":"flags","type":"uint32_t","comment":"Combination of git_pathspec_flag_t options to control match"},{"name":"ps","type":"git_pathspec *","comment":"Pathspec to be matched"}],"argline":"git_pathspec_match_list **out, git_diff *diff, uint32_t flags, git_pathspec *ps","sig":"git_pathspec_match_list **::git_diff *::uint32_t::git_pathspec *","return":{"type":"int","comment":" 0 on success, -1 on error, GIT_ENOTFOUND if no matches and\n the GIT_PATHSPEC_NO_MATCH_ERROR flag is used"},"description":"

Match a pathspec against files in a diff list.

\n","comments":"

This matches the pathspec against the files in the given diff list.

\n\n

If out is not NULL, this returns a git_patchspec_match_list. That\n contains the list of all matched filenames (unless you pass the\n GIT_PATHSPEC_FAILURES_ONLY flag) and may also contain the list of\n pathspecs with no match (if you used the GIT_PATHSPEC_FIND_FAILURES\n flag). You must call git_pathspec_match_list_free() on this object.

\n","group":"pathspec"},"git_pathspec_match_list_free":{"type":"function","file":"pathspec.h","line":201,"lineto":201,"args":[{"name":"m","type":"git_pathspec_match_list *","comment":"The git_pathspec_match_list to be freed"}],"argline":"git_pathspec_match_list *m","sig":"git_pathspec_match_list *","return":{"type":"void","comment":null},"description":"

Free memory associates with a git_pathspec_match_list

\n","comments":"","group":"pathspec"},"git_pathspec_match_list_entrycount":{"type":"function","file":"pathspec.h","line":209,"lineto":210,"args":[{"name":"m","type":"const git_pathspec_match_list *","comment":"The git_pathspec_match_list object"}],"argline":"const git_pathspec_match_list *m","sig":"const git_pathspec_match_list *","return":{"type":"size_t","comment":" Number of items in match list"},"description":"

Get the number of items in a match list.

\n","comments":"","group":"pathspec"},"git_pathspec_match_list_entry":{"type":"function","file":"pathspec.h","line":222,"lineto":223,"args":[{"name":"m","type":"const git_pathspec_match_list *","comment":"The git_pathspec_match_list object"},{"name":"pos","type":"size_t","comment":"The index into the list"}],"argline":"const git_pathspec_match_list *m, size_t pos","sig":"const git_pathspec_match_list *::size_t","return":{"type":"const char *","comment":" The filename of the match"},"description":"

Get a matching filename by position.

\n","comments":"

This routine cannot be used if the match list was generated by\n git_pathspec_match_diff. If so, it will always return NULL.

\n","group":"pathspec"},"git_pathspec_match_list_diff_entry":{"type":"function","file":"pathspec.h","line":235,"lineto":236,"args":[{"name":"m","type":"const git_pathspec_match_list *","comment":"The git_pathspec_match_list object"},{"name":"pos","type":"size_t","comment":"The index into the list"}],"argline":"const git_pathspec_match_list *m, size_t pos","sig":"const git_pathspec_match_list *::size_t","return":{"type":"const git_diff_delta *","comment":" The filename of the match"},"description":"

Get a matching diff delta by position.

\n","comments":"

This routine can only be used if the match list was generated by\n git_pathspec_match_diff. Otherwise it will always return NULL.

\n","group":"pathspec"},"git_pathspec_match_list_failed_entrycount":{"type":"function","file":"pathspec.h","line":247,"lineto":248,"args":[{"name":"m","type":"const git_pathspec_match_list *","comment":"The git_pathspec_match_list object"}],"argline":"const git_pathspec_match_list *m","sig":"const git_pathspec_match_list *","return":{"type":"size_t","comment":" Number of items in original pathspec that had no matches"},"description":"

Get the number of pathspec items that did not match.

\n","comments":"

This will be zero unless you passed GIT_PATHSPEC_FIND_FAILURES when\n generating the git_pathspec_match_list.

\n","group":"pathspec"},"git_pathspec_match_list_failed_entry":{"type":"function","file":"pathspec.h","line":259,"lineto":260,"args":[{"name":"m","type":"const git_pathspec_match_list *","comment":"The git_pathspec_match_list object"},{"name":"pos","type":"size_t","comment":"The index into the failed items"}],"argline":"const git_pathspec_match_list *m, size_t pos","sig":"const git_pathspec_match_list *::size_t","return":{"type":"const char *","comment":" The pathspec pattern that didn't match anything"},"description":"

Get an original pathspec string that had no matches.

\n","comments":"

This will be return NULL for positions out of range.

\n","group":"pathspec"},"git_rebase_init_options":{"type":"function","file":"rebase.h","line":141,"lineto":143,"args":[{"name":"opts","type":"git_rebase_options *","comment":"the `git_rebase_options` instance to initialize."},{"name":"version","type":"unsigned int","comment":"the version of the struct; you should pass\n `GIT_REBASE_OPTIONS_VERSION` here."}],"argline":"git_rebase_options *opts, unsigned int version","sig":"git_rebase_options *::unsigned int","return":{"type":"int","comment":" Zero on success; -1 on failure."},"description":"

Initializes a git_rebase_options with default values. Equivalent to\n creating an instance with GIT_REBASE_OPTIONS_INIT.

\n","comments":"","group":"rebase"},"git_rebase_init":{"type":"function","file":"rebase.h","line":162,"lineto":168,"args":[{"name":"out","type":"git_rebase **","comment":"Pointer to store the rebase object"},{"name":"repo","type":"git_repository *","comment":"The repository to perform the rebase"},{"name":"branch","type":"const git_annotated_commit *","comment":"The terminal commit to rebase, or NULL to rebase the\n current branch"},{"name":"upstream","type":"const git_annotated_commit *","comment":"The commit to begin rebasing from, or NULL to rebase all\n reachable commits"},{"name":"onto","type":"const git_annotated_commit *","comment":"The branch to rebase onto, or NULL to rebase onto the given\n upstream"},{"name":"opts","type":"const git_rebase_options *","comment":"Options to specify how rebase is performed, or NULL"}],"argline":"git_rebase **out, git_repository *repo, const git_annotated_commit *branch, const git_annotated_commit *upstream, const git_annotated_commit *onto, const git_rebase_options *opts","sig":"git_rebase **::git_repository *::const git_annotated_commit *::const git_annotated_commit *::const git_annotated_commit *::const git_rebase_options *","return":{"type":"int","comment":" Zero on success; -1 on failure."},"description":"

Initializes a rebase operation to rebase the changes in branch\n relative to upstream onto another branch. To begin the rebase\n process, call git_rebase_next. When you have finished with this\n object, call git_rebase_free.

\n","comments":"","group":"rebase"},"git_rebase_open":{"type":"function","file":"rebase.h","line":179,"lineto":182,"args":[{"name":"out","type":"git_rebase **","comment":"Pointer to store the rebase object"},{"name":"repo","type":"git_repository *","comment":"The repository that has a rebase in-progress"},{"name":"opts","type":"const git_rebase_options *","comment":"Options to specify how rebase is performed"}],"argline":"git_rebase **out, git_repository *repo, const git_rebase_options *opts","sig":"git_rebase **::git_repository *::const git_rebase_options *","return":{"type":"int","comment":" Zero on success; -1 on failure."},"description":"

Opens an existing rebase that was previously started by either an\n invocation of git_rebase_init or by another client.

\n","comments":"","group":"rebase"},"git_rebase_operation_entrycount":{"type":"function","file":"rebase.h","line":190,"lineto":190,"args":[{"name":"rebase","type":"git_rebase *","comment":"The in-progress rebase"}],"argline":"git_rebase *rebase","sig":"git_rebase *","return":{"type":"size_t","comment":" The number of rebase operations in total"},"description":"

Gets the count of rebase operations that are to be applied.

\n","comments":"","group":"rebase"},"git_rebase_operation_current":{"type":"function","file":"rebase.h","line":201,"lineto":201,"args":[{"name":"rebase","type":"git_rebase *","comment":"The in-progress rebase"}],"argline":"git_rebase *rebase","sig":"git_rebase *","return":{"type":"size_t","comment":" The index of the rebase operation currently being applied."},"description":"

Gets the index of the rebase operation that is currently being applied.\n If the first operation has not yet been applied (because you have\n called init but not yet next) then this returns\n GIT_REBASE_NO_OPERATION.

\n","comments":"","group":"rebase"},"git_rebase_operation_byindex":{"type":"function","file":"rebase.h","line":210,"lineto":212,"args":[{"name":"rebase","type":"git_rebase *","comment":"The in-progress rebase"},{"name":"idx","type":"size_t","comment":"The index of the rebase operation to retrieve"}],"argline":"git_rebase *rebase, size_t idx","sig":"git_rebase *::size_t","return":{"type":"git_rebase_operation *","comment":" The rebase operation or NULL if `idx` was out of bounds"},"description":"

Gets the rebase operation specified by the given index.

\n","comments":"","group":"rebase"},"git_rebase_next":{"type":"function","file":"rebase.h","line":225,"lineto":227,"args":[{"name":"operation","type":"git_rebase_operation **","comment":"Pointer to store the rebase operation that is to be performed next"},{"name":"rebase","type":"git_rebase *","comment":"The rebase in progress"}],"argline":"git_rebase_operation **operation, git_rebase *rebase","sig":"git_rebase_operation **::git_rebase *","return":{"type":"int","comment":" Zero on success; -1 on failure."},"description":"

Performs the next rebase operation and returns the information about it.\n If the operation is one that applies a patch (which is any operation except\n GIT_REBASE_OPERATION_EXEC) then the patch will be applied and the index and\n working directory will be updated with the changes. If there are conflicts,\n you will need to address those before committing the changes.

\n","comments":"","group":"rebase"},"git_rebase_commit":{"type":"function","file":"rebase.h","line":251,"lineto":257,"args":[{"name":"id","type":"git_oid *","comment":"Pointer in which to store the OID of the newly created commit"},{"name":"rebase","type":"git_rebase *","comment":"The rebase that is in-progress"},{"name":"author","type":"const git_signature *","comment":"The author of the updated commit, or NULL to keep the\n author from the original commit"},{"name":"committer","type":"const git_signature *","comment":"The committer of the rebase"},{"name":"message_encoding","type":"const char *","comment":"The encoding for the message in the commit,\n represented with a standard encoding name. If message is NULL,\n this should also be NULL, and the encoding from the original\n commit will be maintained. If message is specified, this may be\n NULL to indicate that \"UTF-8\" is to be used."},{"name":"message","type":"const char *","comment":"The message for this commit, or NULL to use the message\n from the original commit."}],"argline":"git_oid *id, git_rebase *rebase, const git_signature *author, const git_signature *committer, const char *message_encoding, const char *message","sig":"git_oid *::git_rebase *::const git_signature *::const git_signature *::const char *::const char *","return":{"type":"int","comment":" Zero on success, GIT_EUNMERGED if there are unmerged changes in\n the index, GIT_EAPPLIED if the current commit has already\n been applied to the upstream and there is nothing to commit,\n -1 on failure."},"description":"

Commits the current patch. You must have resolved any conflicts that\n were introduced during the patch application from the git_rebase_next\n invocation.

\n","comments":"","group":"rebase"},"git_rebase_abort":{"type":"function","file":"rebase.h","line":267,"lineto":267,"args":[{"name":"rebase","type":"git_rebase *","comment":"The rebase that is in-progress"}],"argline":"git_rebase *rebase","sig":"git_rebase *","return":{"type":"int","comment":" Zero on success; GIT_ENOTFOUND if a rebase is not in progress,\n -1 on other errors."},"description":"

Aborts a rebase that is currently in progress, resetting the repository\n and working directory to their state before rebase began.

\n","comments":"","group":"rebase"},"git_rebase_finish":{"type":"function","file":"rebase.h","line":277,"lineto":279,"args":[{"name":"rebase","type":"git_rebase *","comment":"The rebase that is in-progress"},{"name":"signature","type":"const git_signature *","comment":"The identity that is finishing the rebase (optional)"}],"argline":"git_rebase *rebase, const git_signature *signature","sig":"git_rebase *::const git_signature *","return":{"type":"int","comment":" Zero on success; -1 on error"},"description":"

Finishes a rebase that is currently in progress once all patches have\n been applied.

\n","comments":"","group":"rebase"},"git_rebase_free":{"type":"function","file":"rebase.h","line":286,"lineto":286,"args":[{"name":"rebase","type":"git_rebase *","comment":"The rebase object"}],"argline":"git_rebase *rebase","sig":"git_rebase *","return":{"type":"void","comment":null},"description":"

Frees the git_rebase object.

\n","comments":"","group":"rebase"},"git_refdb_new":{"type":"function","file":"refdb.h","line":35,"lineto":35,"args":[{"name":"out","type":"git_refdb **","comment":"location to store the database pointer, if opened.\n\t\t\tSet to NULL if the open failed."},{"name":"repo","type":"git_repository *","comment":"the repository"}],"argline":"git_refdb **out, git_repository *repo","sig":"git_refdb **::git_repository *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Create a new reference database with no backends.

\n","comments":"

Before the Ref DB can be used for read/writing, a custom database\n backend must be manually set using git_refdb_set_backend()

\n","group":"refdb"},"git_refdb_open":{"type":"function","file":"refdb.h","line":49,"lineto":49,"args":[{"name":"out","type":"git_refdb **","comment":"location to store the database pointer, if opened.\n\t\t\tSet to NULL if the open failed."},{"name":"repo","type":"git_repository *","comment":"the repository"}],"argline":"git_refdb **out, git_repository *repo","sig":"git_refdb **::git_repository *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Create a new reference database and automatically add\n the default backends:

\n","comments":"
    \n
  • git_refdb_dir: read and write loose and packed refs\n from disk, assuming the repository dir as the folder
  • \n
\n","group":"refdb"},"git_refdb_compress":{"type":"function","file":"refdb.h","line":56,"lineto":56,"args":[{"name":"refdb","type":"git_refdb *","comment":null}],"argline":"git_refdb *refdb","sig":"git_refdb *","return":{"type":"int","comment":null},"description":"

Suggests that the given refdb compress or optimize its references.\n This mechanism is implementation specific. For on-disk reference\n databases, for example, this may pack all loose references.

\n","comments":"","group":"refdb"},"git_refdb_free":{"type":"function","file":"refdb.h","line":63,"lineto":63,"args":[{"name":"refdb","type":"git_refdb *","comment":"reference database pointer or NULL"}],"argline":"git_refdb *refdb","sig":"git_refdb *","return":{"type":"void","comment":null},"description":"

Close an open reference database.

\n","comments":"","group":"refdb"},"git_reflog_read":{"type":"function","file":"reflog.h","line":38,"lineto":38,"args":[{"name":"out","type":"git_reflog **","comment":"pointer to reflog"},{"name":"repo","type":"git_repository *","comment":"the repostiory"},{"name":"name","type":"const char *","comment":"reference to look up"}],"argline":"git_reflog **out, git_repository *repo, const char *name","sig":"git_reflog **::git_repository *::const char *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Read the reflog for the given reference

\n","comments":"

If there is no reflog file for the given\n reference yet, an empty reflog object will\n be returned.

\n\n

The reflog must be freed manually by using\n git_reflog_free().

\n","group":"reflog"},"git_reflog_write":{"type":"function","file":"reflog.h","line":47,"lineto":47,"args":[{"name":"reflog","type":"git_reflog *","comment":"an existing reflog object"}],"argline":"git_reflog *reflog","sig":"git_reflog *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Write an existing in-memory reflog object back to disk\n using an atomic file lock.

\n","comments":"","group":"reflog"},"git_reflog_append":{"type":"function","file":"reflog.h","line":60,"lineto":60,"args":[{"name":"reflog","type":"git_reflog *","comment":"an existing reflog object"},{"name":"id","type":"const git_oid *","comment":"the OID the reference is now pointing to"},{"name":"committer","type":"const git_signature *","comment":"the signature of the committer"},{"name":"msg","type":"const char *","comment":"the reflog message"}],"argline":"git_reflog *reflog, const git_oid *id, const git_signature *committer, const char *msg","sig":"git_reflog *::const git_oid *::const git_signature *::const char *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Add a new entry to the in-memory reflog.

\n","comments":"

msg is optional and can be NULL.

\n","group":"reflog"},"git_reflog_rename":{"type":"function","file":"reflog.h","line":75,"lineto":75,"args":[{"name":"repo","type":"git_repository *","comment":"the repository"},{"name":"old_name","type":"const char *","comment":"the old name of the reference"},{"name":"name","type":"const char *","comment":"the new name of the reference"}],"argline":"git_repository *repo, const char *old_name, const char *name","sig":"git_repository *::const char *::const char *","return":{"type":"int","comment":" 0 on success, GIT_EINVALIDSPEC or an error code"},"description":"

Rename a reflog

\n","comments":"

The reflog to be renamed is expected to already exist

\n\n

The new name will be checked for validity.\n See git_reference_create_symbolic() for rules about valid names.

\n","group":"reflog"},"git_reflog_delete":{"type":"function","file":"reflog.h","line":84,"lineto":84,"args":[{"name":"repo","type":"git_repository *","comment":"the repository"},{"name":"name","type":"const char *","comment":"the reflog to delete"}],"argline":"git_repository *repo, const char *name","sig":"git_repository *::const char *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Delete the reflog for the given reference

\n","comments":"","group":"reflog"},"git_reflog_entrycount":{"type":"function","file":"reflog.h","line":92,"lineto":92,"args":[{"name":"reflog","type":"git_reflog *","comment":"the previously loaded reflog"}],"argline":"git_reflog *reflog","sig":"git_reflog *","return":{"type":"size_t","comment":" the number of log entries"},"description":"

Get the number of log entries in a reflog

\n","comments":"","group":"reflog"},"git_reflog_entry_byindex":{"type":"function","file":"reflog.h","line":105,"lineto":105,"args":[{"name":"reflog","type":"const git_reflog *","comment":"a previously loaded reflog"},{"name":"idx","type":"size_t","comment":"the position of the entry to lookup. Should be greater than or\n equal to 0 (zero) and less than `git_reflog_entrycount()`."}],"argline":"const git_reflog *reflog, size_t idx","sig":"const git_reflog *::size_t","return":{"type":"const git_reflog_entry *","comment":" the entry; NULL if not found"},"description":"

Lookup an entry by its index

\n","comments":"

Requesting the reflog entry with an index of 0 (zero) will\n return the most recently created entry.

\n","group":"reflog"},"git_reflog_drop":{"type":"function","file":"reflog.h","line":124,"lineto":127,"args":[{"name":"reflog","type":"git_reflog *","comment":"a previously loaded reflog."},{"name":"idx","type":"size_t","comment":"the position of the entry to remove. Should be greater than or\n equal to 0 (zero) and less than `git_reflog_entrycount()`."},{"name":"rewrite_previous_entry","type":"int","comment":"1 to rewrite the history; 0 otherwise."}],"argline":"git_reflog *reflog, size_t idx, int rewrite_previous_entry","sig":"git_reflog *::size_t::int","return":{"type":"int","comment":" 0 on success, GIT_ENOTFOUND if the entry doesn't exist\n or an error code."},"description":"

Remove an entry from the reflog by its index

\n","comments":"

To ensure there's no gap in the log history, set rewrite_previous_entry\n param value to 1. When deleting entry n, member old_oid of entry n-1\n (if any) will be updated with the value of member new_oid of entry n+1.

\n","group":"reflog"},"git_reflog_entry_id_old":{"type":"function","file":"reflog.h","line":135,"lineto":135,"args":[{"name":"entry","type":"const git_reflog_entry *","comment":"a reflog entry"}],"argline":"const git_reflog_entry *entry","sig":"const git_reflog_entry *","return":{"type":"const git_oid *","comment":" the old oid"},"description":"

Get the old oid

\n","comments":"","group":"reflog"},"git_reflog_entry_id_new":{"type":"function","file":"reflog.h","line":143,"lineto":143,"args":[{"name":"entry","type":"const git_reflog_entry *","comment":"a reflog entry"}],"argline":"const git_reflog_entry *entry","sig":"const git_reflog_entry *","return":{"type":"const git_oid *","comment":" the new oid at this time"},"description":"

Get the new oid

\n","comments":"","group":"reflog"},"git_reflog_entry_committer":{"type":"function","file":"reflog.h","line":151,"lineto":151,"args":[{"name":"entry","type":"const git_reflog_entry *","comment":"a reflog entry"}],"argline":"const git_reflog_entry *entry","sig":"const git_reflog_entry *","return":{"type":"const git_signature *","comment":" the committer"},"description":"

Get the committer of this entry

\n","comments":"","group":"reflog"},"git_reflog_entry_message":{"type":"function","file":"reflog.h","line":159,"lineto":159,"args":[{"name":"entry","type":"const git_reflog_entry *","comment":"a reflog entry"}],"argline":"const git_reflog_entry *entry","sig":"const git_reflog_entry *","return":{"type":"const char *","comment":" the log msg"},"description":"

Get the log message

\n","comments":"","group":"reflog"},"git_reflog_free":{"type":"function","file":"reflog.h","line":166,"lineto":166,"args":[{"name":"reflog","type":"git_reflog *","comment":"reflog to free"}],"argline":"git_reflog *reflog","sig":"git_reflog *","return":{"type":"void","comment":null},"description":"

Free the reflog

\n","comments":"","group":"reflog"},"git_reference_lookup":{"type":"function","file":"refs.h","line":37,"lineto":37,"args":[{"name":"out","type":"git_reference **","comment":"pointer to the looked-up reference"},{"name":"repo","type":"git_repository *","comment":"the repository to look up the reference"},{"name":"name","type":"const char *","comment":"the long name for the reference (e.g. HEAD, refs/heads/master, refs/tags/v0.1.0, ...)"}],"argline":"git_reference **out, git_repository *repo, const char *name","sig":"git_reference **::git_repository *::const char *","return":{"type":"int","comment":" 0 on success, GIT_ENOTFOUND, GIT_EINVALIDSPEC or an error code."},"description":"

Lookup a reference by name in a repository.

\n","comments":"

The returned reference must be freed by the user.

\n\n

The name will be checked for validity.\n See git_reference_symbolic_create() for rules about valid names.

\n","group":"reference","examples":{"general.c":["ex/v0.23.0/general.html#git_reference_lookup-53"]}},"git_reference_name_to_id":{"type":"function","file":"refs.h","line":54,"lineto":55,"args":[{"name":"out","type":"git_oid *","comment":"Pointer to oid to be filled in"},{"name":"repo","type":"git_repository *","comment":"The repository in which to look up the reference"},{"name":"name","type":"const char *","comment":"The long name for the reference (e.g. HEAD, refs/heads/master, refs/tags/v0.1.0, ...)"}],"argline":"git_oid *out, git_repository *repo, const char *name","sig":"git_oid *::git_repository *::const char *","return":{"type":"int","comment":" 0 on success, GIT_ENOTFOUND, GIT_EINVALIDSPEC or an error code."},"description":"

Lookup a reference by name and resolve immediately to OID.

\n","comments":"

This function provides a quick way to resolve a reference name straight\n through to the object id that it refers to. This avoids having to\n allocate or free any git_reference objects for simple situations.

\n\n

The name will be checked for validity.\n See git_reference_symbolic_create() for rules about valid names.

\n","group":"reference"},"git_reference_dwim":{"type":"function","file":"refs.h","line":68,"lineto":68,"args":[{"name":"out","type":"git_reference **","comment":"pointer in which to store the reference"},{"name":"repo","type":"git_repository *","comment":"the repository in which to look"},{"name":"shorthand","type":"const char *","comment":"the short name for the reference"}],"argline":"git_reference **out, git_repository *repo, const char *shorthand","sig":"git_reference **::git_repository *::const char *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Lookup a reference by DWIMing its short name

\n","comments":"

Apply the git precendence rules to the given shorthand to determine\n which reference the user is referring to.

\n","group":"reference"},"git_reference_symbolic_create_matching":{"type":"function","file":"refs.h","line":109,"lineto":109,"args":[{"name":"out","type":"git_reference **","comment":"Pointer to the newly created reference"},{"name":"repo","type":"git_repository *","comment":"Repository where that reference will live"},{"name":"name","type":"const char *","comment":"The name of the reference"},{"name":"target","type":"const char *","comment":"The target of the reference"},{"name":"force","type":"int","comment":"Overwrite existing references"},{"name":"current_value","type":"const char *","comment":"The expected value of the reference when updating"},{"name":"log_message","type":"const char *","comment":"The one line long message to be appended to the reflog"}],"argline":"git_reference **out, git_repository *repo, const char *name, const char *target, int force, const char *current_value, const char *log_message","sig":"git_reference **::git_repository *::const char *::const char *::int::const char *::const char *","return":{"type":"int","comment":" 0 on success, GIT_EEXISTS, GIT_EINVALIDSPEC, GIT_EMODIFIED or an error code"},"description":"

Conditionally create a new symbolic reference.

\n","comments":"

A symbolic reference is a reference name that refers to another\n reference name. If the other name moves, the symbolic name will move,\n too. As a simple example, the "HEAD" reference might refer to\n "refs/heads/master" while on the "master" branch of a repository.

\n\n

The symbolic reference will be created in the repository and written to\n the disk. The generated reference object must be freed by the user.

\n\n

Valid reference names must follow one of two patterns:

\n\n
    \n
  1. Top-level names must contain only capital letters and underscores,\nand must begin and end with a letter. (e.g. "HEAD", "ORIG_HEAD").
  2. \n
  3. Names prefixed with "refs/" can be almost anything. You must avoid\nthe characters '~', '^', ':', '\n\\\n', '?', '[', and '*', and the\nsequences ".." and "\n@\n{" which have special meaning to revparse.
  4. \n
\n\n

This function will return an error if a reference already exists with the\n given name unless force is true, in which case it will be overwritten.

\n\n

The message for the reflog will be ignored if the reference does\n not belong in the standard set (HEAD, branches and remote-tracking\n branches) and it does not have a reflog.

\n\n

It will return GIT_EMODIFIED if the reference's value at the time\n of updating does not match the one passed through current_value\n (i.e. if the ref has changed since the user read it).

\n","group":"reference"},"git_reference_symbolic_create":{"type":"function","file":"refs.h","line":145,"lineto":145,"args":[{"name":"out","type":"git_reference **","comment":"Pointer to the newly created reference"},{"name":"repo","type":"git_repository *","comment":"Repository where that reference will live"},{"name":"name","type":"const char *","comment":"The name of the reference"},{"name":"target","type":"const char *","comment":"The target of the reference"},{"name":"force","type":"int","comment":"Overwrite existing references"},{"name":"log_message","type":"const char *","comment":"The one line long message to be appended to the reflog"}],"argline":"git_reference **out, git_repository *repo, const char *name, const char *target, int force, const char *log_message","sig":"git_reference **::git_repository *::const char *::const char *::int::const char *","return":{"type":"int","comment":" 0 on success, GIT_EEXISTS, GIT_EINVALIDSPEC or an error code"},"description":"

Create a new symbolic reference.

\n","comments":"

A symbolic reference is a reference name that refers to another\n reference name. If the other name moves, the symbolic name will move,\n too. As a simple example, the "HEAD" reference might refer to\n "refs/heads/master" while on the "master" branch of a repository.

\n\n

The symbolic reference will be created in the repository and written to\n the disk. The generated reference object must be freed by the user.

\n\n

Valid reference names must follow one of two patterns:

\n\n
    \n
  1. Top-level names must contain only capital letters and underscores,\nand must begin and end with a letter. (e.g. "HEAD", "ORIG_HEAD").
  2. \n
  3. Names prefixed with "refs/" can be almost anything. You must avoid\nthe characters '~', '^', ':', '\n\\\n', '?', '[', and '*', and the\nsequences ".." and "\n@\n{" which have special meaning to revparse.
  4. \n
\n\n

This function will return an error if a reference already exists with the\n given name unless force is true, in which case it will be overwritten.

\n\n

The message for the reflog will be ignored if the reference does\n not belong in the standard set (HEAD, branches and remote-tracking\n branches) and it does not have a reflog.

\n","group":"reference"},"git_reference_create":{"type":"function","file":"refs.h","line":182,"lineto":182,"args":[{"name":"out","type":"git_reference **","comment":"Pointer to the newly created reference"},{"name":"repo","type":"git_repository *","comment":"Repository where that reference will live"},{"name":"name","type":"const char *","comment":"The name of the reference"},{"name":"id","type":"const git_oid *","comment":"The object id pointed to by the reference."},{"name":"force","type":"int","comment":"Overwrite existing references"},{"name":"log_message","type":"const char *","comment":"The one line long message to be appended to the reflog"}],"argline":"git_reference **out, git_repository *repo, const char *name, const git_oid *id, int force, const char *log_message","sig":"git_reference **::git_repository *::const char *::const git_oid *::int::const char *","return":{"type":"int","comment":" 0 on success, GIT_EEXISTS, GIT_EINVALIDSPEC or an error code"},"description":"

Create a new direct reference.

\n","comments":"

A direct reference (also called an object id reference) refers directly\n to a specific object id (a.k.a. OID or SHA) in the repository. The id\n permanently refers to the object (although the reference itself can be\n moved). For example, in libgit2 the direct ref "refs/tags/v0.17.0"\n refers to OID 5b9fac39d8a76b9139667c26a63e6b3f204b3977.

\n\n

The direct reference will be created in the repository and written to\n the disk. The generated reference object must be freed by the user.

\n\n

Valid reference names must follow one of two patterns:

\n\n
    \n
  1. Top-level names must contain only capital letters and underscores,\nand must begin and end with a letter. (e.g. "HEAD", "ORIG_HEAD").
  2. \n
  3. Names prefixed with "refs/" can be almost anything. You must avoid\nthe characters '~', '^', ':', '\n\\\n', '?', '[', and '*', and the\nsequences ".." and "\n@\n{" which have special meaning to revparse.
  4. \n
\n\n

This function will return an error if a reference already exists with the\n given name unless force is true, in which case it will be overwritten.

\n\n

The message for the reflog will be ignored if the reference does\n not belong in the standard set (HEAD, branches and remote-tracking\n branches) and and it does not have a reflog.

\n","group":"reference"},"git_reference_create_matching":{"type":"function","file":"refs.h","line":225,"lineto":225,"args":[{"name":"out","type":"git_reference **","comment":"Pointer to the newly created reference"},{"name":"repo","type":"git_repository *","comment":"Repository where that reference will live"},{"name":"name","type":"const char *","comment":"The name of the reference"},{"name":"id","type":"const git_oid *","comment":"The object id pointed to by the reference."},{"name":"force","type":"int","comment":"Overwrite existing references"},{"name":"current_id","type":"const git_oid *","comment":"The expected value of the reference at the time of update"},{"name":"log_message","type":"const char *","comment":"The one line long message to be appended to the reflog"}],"argline":"git_reference **out, git_repository *repo, const char *name, const git_oid *id, int force, const git_oid *current_id, const char *log_message","sig":"git_reference **::git_repository *::const char *::const git_oid *::int::const git_oid *::const char *","return":{"type":"int","comment":" 0 on success, GIT_EMODIFIED if the value of the reference\n has changed, GIT_EEXISTS, GIT_EINVALIDSPEC or an error code"},"description":"

Conditionally create new direct reference

\n","comments":"

A direct reference (also called an object id reference) refers directly\n to a specific object id (a.k.a. OID or SHA) in the repository. The id\n permanently refers to the object (although the reference itself can be\n moved). For example, in libgit2 the direct ref "refs/tags/v0.17.0"\n refers to OID 5b9fac39d8a76b9139667c26a63e6b3f204b3977.

\n\n

The direct reference will be created in the repository and written to\n the disk. The generated reference object must be freed by the user.

\n\n

Valid reference names must follow one of two patterns:

\n\n
    \n
  1. Top-level names must contain only capital letters and underscores,\nand must begin and end with a letter. (e.g. "HEAD", "ORIG_HEAD").
  2. \n
  3. Names prefixed with "refs/" can be almost anything. You must avoid\nthe characters '~', '^', ':', '\n\\\n', '?', '[', and '*', and the\nsequences ".." and "\n@\n{" which have special meaning to revparse.
  4. \n
\n\n

This function will return an error if a reference already exists with the\n given name unless force is true, in which case it will be overwritten.

\n\n

The message for the reflog will be ignored if the reference does\n not belong in the standard set (HEAD, branches and remote-tracking\n branches) and and it does not have a reflog.

\n\n

It will return GIT_EMODIFIED if the reference's value at the time\n of updating does not match the one passed through current_id\n (i.e. if the ref has changed since the user read it).

\n","group":"reference"},"git_reference_target":{"type":"function","file":"refs.h","line":240,"lineto":240,"args":[{"name":"ref","type":"const git_reference *","comment":"The reference"}],"argline":"const git_reference *ref","sig":"const git_reference *","return":{"type":"const git_oid *","comment":" a pointer to the oid if available, NULL otherwise"},"description":"

Get the OID pointed to by a direct reference.

\n","comments":"

Only available if the reference is direct (i.e. an object id reference,\n not a symbolic one).

\n\n

To find the OID of a symbolic ref, call git_reference_resolve() and\n then this function (or maybe use git_reference_name_to_id() to\n directly resolve a reference name all the way through to an OID).

\n","group":"reference","examples":{"general.c":["ex/v0.23.0/general.html#git_reference_target-54"]}},"git_reference_target_peel":{"type":"function","file":"refs.h","line":251,"lineto":251,"args":[{"name":"ref","type":"const git_reference *","comment":"The reference"}],"argline":"const git_reference *ref","sig":"const git_reference *","return":{"type":"const git_oid *","comment":" a pointer to the oid if available, NULL otherwise"},"description":"

Return the peeled OID target of this reference.

\n","comments":"

This peeled OID only applies to direct references that point to\n a hard Tag object: it is the result of peeling such Tag.

\n","group":"reference"},"git_reference_symbolic_target":{"type":"function","file":"refs.h","line":261,"lineto":261,"args":[{"name":"ref","type":"const git_reference *","comment":"The reference"}],"argline":"const git_reference *ref","sig":"const git_reference *","return":{"type":"const char *","comment":" a pointer to the name if available, NULL otherwise"},"description":"

Get full name to the reference pointed to by a symbolic reference.

\n","comments":"

Only available if the reference is symbolic.

\n","group":"reference","examples":{"general.c":["ex/v0.23.0/general.html#git_reference_symbolic_target-55"]}},"git_reference_type":{"type":"function","file":"refs.h","line":271,"lineto":271,"args":[{"name":"ref","type":"const git_reference *","comment":"The reference"}],"argline":"const git_reference *ref","sig":"const git_reference *","return":{"type":"git_ref_t","comment":" the type"},"description":"

Get the type of a reference.

\n","comments":"

Either direct (GIT_REF_OID) or symbolic (GIT_REF_SYMBOLIC)

\n","group":"reference","examples":{"general.c":["ex/v0.23.0/general.html#git_reference_type-56"]}},"git_reference_name":{"type":"function","file":"refs.h","line":281,"lineto":281,"args":[{"name":"ref","type":"const git_reference *","comment":"The reference"}],"argline":"const git_reference *ref","sig":"const git_reference *","return":{"type":"const char *","comment":" the full name for the ref"},"description":"

Get the full name of a reference.

\n","comments":"

See git_reference_symbolic_create() for rules about valid names.

\n","group":"reference"},"git_reference_resolve":{"type":"function","file":"refs.h","line":299,"lineto":299,"args":[{"name":"out","type":"git_reference **","comment":"Pointer to the peeled reference"},{"name":"ref","type":"const git_reference *","comment":"The reference"}],"argline":"git_reference **out, const git_reference *ref","sig":"git_reference **::const git_reference *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Resolve a symbolic reference to a direct reference.

\n","comments":"

This method iteratively peels a symbolic reference until it resolves to\n a direct reference to an OID.

\n\n

The peeled reference is returned in the resolved_ref argument, and\n must be freed manually once it's no longer needed.

\n\n

If a direct reference is passed as an argument, a copy of that\n reference is returned. This copy must be manually freed too.

\n","group":"reference"},"git_reference_owner":{"type":"function","file":"refs.h","line":307,"lineto":307,"args":[{"name":"ref","type":"const git_reference *","comment":"The reference"}],"argline":"const git_reference *ref","sig":"const git_reference *","return":{"type":"git_repository *","comment":" a pointer to the repo"},"description":"

Get the repository where a reference resides.

\n","comments":"","group":"reference"},"git_reference_symbolic_set_target":{"type":"function","file":"refs.h","line":329,"lineto":333,"args":[{"name":"out","type":"git_reference **","comment":"Pointer to the newly created reference"},{"name":"ref","type":"git_reference *","comment":"The reference"},{"name":"target","type":"const char *","comment":"The new target for the reference"},{"name":"log_message","type":"const char *","comment":"The one line long message to be appended to the reflog"}],"argline":"git_reference **out, git_reference *ref, const char *target, const char *log_message","sig":"git_reference **::git_reference *::const char *::const char *","return":{"type":"int","comment":" 0 on success, GIT_EINVALIDSPEC or an error code"},"description":"

Create a new reference with the same name as the given reference but a\n different symbolic target. The reference must be a symbolic reference,\n otherwise this will fail.

\n","comments":"

The new reference will be written to disk, overwriting the given reference.

\n\n

The target name will be checked for validity.\n See git_reference_symbolic_create() for rules about valid names.

\n\n

The message for the reflog will be ignored if the reference does\n not belong in the standard set (HEAD, branches and remote-tracking\n branches) and and it does not have a reflog.

\n","group":"reference"},"git_reference_set_target":{"type":"function","file":"refs.h","line":349,"lineto":353,"args":[{"name":"out","type":"git_reference **","comment":"Pointer to the newly created reference"},{"name":"ref","type":"git_reference *","comment":"The reference"},{"name":"id","type":"const git_oid *","comment":"The new target OID for the reference"},{"name":"log_message","type":"const char *","comment":"The one line long message to be appended to the reflog"}],"argline":"git_reference **out, git_reference *ref, const git_oid *id, const char *log_message","sig":"git_reference **::git_reference *::const git_oid *::const char *","return":{"type":"int","comment":" 0 on success, GIT_EMODIFIED if the value of the reference\n has changed since it was read, or an error code"},"description":"

Conditionally create a new reference with the same name as the given reference but a\n different OID target. The reference must be a direct reference, otherwise\n this will fail.

\n","comments":"

The new reference will be written to disk, overwriting the given reference.

\n","group":"reference"},"git_reference_rename":{"type":"function","file":"refs.h","line":378,"lineto":383,"args":[{"name":"new_ref","type":"git_reference **","comment":null},{"name":"ref","type":"git_reference *","comment":"The reference to rename"},{"name":"new_name","type":"const char *","comment":"The new name for the reference"},{"name":"force","type":"int","comment":"Overwrite an existing reference"},{"name":"log_message","type":"const char *","comment":"The one line long message to be appended to the reflog"}],"argline":"git_reference **new_ref, git_reference *ref, const char *new_name, int force, const char *log_message","sig":"git_reference **::git_reference *::const char *::int::const char *","return":{"type":"int","comment":" 0 on success, GIT_EINVALIDSPEC, GIT_EEXISTS or an error code"},"description":"

Rename an existing reference.

\n","comments":"

This method works for both direct and symbolic references.

\n\n

The new name will be checked for validity.\n See git_reference_symbolic_create() for rules about valid names.

\n\n

If the force flag is not enabled, and there's already\n a reference with the given name, the renaming will fail.

\n\n

IMPORTANT:\n The user needs to write a proper reflog entry if the\n reflog is enabled for the repository. We only rename\n the reflog if it exists.

\n","group":"reference"},"git_reference_delete":{"type":"function","file":"refs.h","line":398,"lineto":398,"args":[{"name":"ref","type":"git_reference *","comment":"The reference to remove"}],"argline":"git_reference *ref","sig":"git_reference *","return":{"type":"int","comment":" 0, GIT_EMODIFIED or an error code"},"description":"

Delete an existing reference.

\n","comments":"

This method works for both direct and symbolic references. The reference\n will be immediately removed on disk but the memory will not be freed.\n Callers must call git_reference_free.

\n\n

This function will return an error if the reference has changed\n from the time it was looked up.

\n","group":"reference"},"git_reference_remove":{"type":"function","file":"refs.h","line":409,"lineto":409,"args":[{"name":"repo","type":"git_repository *","comment":null},{"name":"name","type":"const char *","comment":"The reference to remove"}],"argline":"git_repository *repo, const char *name","sig":"git_repository *::const char *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Delete an existing reference by name

\n","comments":"

This method removes the named reference from the repository without\n looking at its old value.

\n","group":"reference"},"git_reference_list":{"type":"function","file":"refs.h","line":423,"lineto":423,"args":[{"name":"array","type":"git_strarray *","comment":"Pointer to a git_strarray structure where\n\t\tthe reference names will be stored"},{"name":"repo","type":"git_repository *","comment":"Repository where to find the refs"}],"argline":"git_strarray *array, git_repository *repo","sig":"git_strarray *::git_repository *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Fill a list with all the references that can be found in a repository.

\n","comments":"

The string array will be filled with the names of all references; these\n values are owned by the user and should be free'd manually when no\n longer needed, using git_strarray_free().

\n","group":"reference","examples":{"general.c":["ex/v0.23.0/general.html#git_reference_list-57"]}},"git_reference_foreach":{"type":"function","file":"refs.h","line":441,"lineto":444,"args":[{"name":"repo","type":"git_repository *","comment":"Repository where to find the refs"},{"name":"callback","type":"git_reference_foreach_cb","comment":"Function which will be called for every listed ref"},{"name":"payload","type":"void *","comment":"Additional data to pass to the callback"}],"argline":"git_repository *repo, git_reference_foreach_cb callback, void *payload","sig":"git_repository *::git_reference_foreach_cb::void *","return":{"type":"int","comment":" 0 on success, non-zero callback return value, or error code"},"description":"

Perform a callback on each reference in the repository.

\n","comments":"

The callback function will be called for each reference in the\n repository, receiving the reference object and the payload value\n passed to this method. Returning a non-zero value from the callback\n will terminate the iteration.

\n","group":"reference"},"git_reference_foreach_name":{"type":"function","file":"refs.h","line":459,"lineto":462,"args":[{"name":"repo","type":"git_repository *","comment":"Repository where to find the refs"},{"name":"callback","type":"git_reference_foreach_name_cb","comment":"Function which will be called for every listed ref name"},{"name":"payload","type":"void *","comment":"Additional data to pass to the callback"}],"argline":"git_repository *repo, git_reference_foreach_name_cb callback, void *payload","sig":"git_repository *::git_reference_foreach_name_cb::void *","return":{"type":"int","comment":" 0 on success, non-zero callback return value, or error code"},"description":"

Perform a callback on the fully-qualified name of each reference.

\n","comments":"

The callback function will be called for each reference in the\n repository, receiving the name of the reference and the payload value\n passed to this method. Returning a non-zero value from the callback\n will terminate the iteration.

\n","group":"reference"},"git_reference_free":{"type":"function","file":"refs.h","line":469,"lineto":469,"args":[{"name":"ref","type":"git_reference *","comment":"git_reference"}],"argline":"git_reference *ref","sig":"git_reference *","return":{"type":"void","comment":null},"description":"

Free the given reference.

\n","comments":"","group":"reference","examples":{"status.c":["ex/v0.23.0/status.html#git_reference_free-3"]}},"git_reference_cmp":{"type":"function","file":"refs.h","line":478,"lineto":480,"args":[{"name":"ref1","type":"const git_reference *","comment":"The first git_reference"},{"name":"ref2","type":"const git_reference *","comment":"The second git_reference"}],"argline":"const git_reference *ref1, const git_reference *ref2","sig":"const git_reference *::const git_reference *","return":{"type":"int","comment":" 0 if the same, else a stable but meaningless ordering."},"description":"

Compare two references.

\n","comments":"","group":"reference"},"git_reference_iterator_new":{"type":"function","file":"refs.h","line":489,"lineto":491,"args":[{"name":"out","type":"git_reference_iterator **","comment":"pointer in which to store the iterator"},{"name":"repo","type":"git_repository *","comment":"the repository"}],"argline":"git_reference_iterator **out, git_repository *repo","sig":"git_reference_iterator **::git_repository *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Create an iterator for the repo's references

\n","comments":"","group":"reference"},"git_reference_iterator_glob_new":{"type":"function","file":"refs.h","line":502,"lineto":505,"args":[{"name":"out","type":"git_reference_iterator **","comment":"pointer in which to store the iterator"},{"name":"repo","type":"git_repository *","comment":"the repository"},{"name":"glob","type":"const char *","comment":"the glob to match against the reference names"}],"argline":"git_reference_iterator **out, git_repository *repo, const char *glob","sig":"git_reference_iterator **::git_repository *::const char *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Create an iterator for the repo's references that match the\n specified glob

\n","comments":"","group":"reference"},"git_reference_next":{"type":"function","file":"refs.h","line":514,"lineto":514,"args":[{"name":"out","type":"git_reference **","comment":"pointer in which to store the reference"},{"name":"iter","type":"git_reference_iterator *","comment":"the iterator"}],"argline":"git_reference **out, git_reference_iterator *iter","sig":"git_reference **::git_reference_iterator *","return":{"type":"int","comment":" 0, GIT_ITEROVER if there are no more; or an error code"},"description":"

Get the next reference

\n","comments":"","group":"reference"},"git_reference_next_name":{"type":"function","file":"refs.h","line":527,"lineto":527,"args":[{"name":"out","type":"const char **","comment":"pointer in which to store the string"},{"name":"iter","type":"git_reference_iterator *","comment":"the iterator"}],"argline":"const char **out, git_reference_iterator *iter","sig":"const char **::git_reference_iterator *","return":{"type":"int","comment":" 0, GIT_ITEROVER if there are no more; or an error code"},"description":"

Get the next reference's name

\n","comments":"

This function is provided for convenience in case only the names\n are interesting as it avoids the allocation of the git_reference\n object which git_reference_next() needs.

\n","group":"reference"},"git_reference_iterator_free":{"type":"function","file":"refs.h","line":534,"lineto":534,"args":[{"name":"iter","type":"git_reference_iterator *","comment":"the iterator to free"}],"argline":"git_reference_iterator *iter","sig":"git_reference_iterator *","return":{"type":"void","comment":null},"description":"

Free the iterator and its associated resources

\n","comments":"","group":"reference"},"git_reference_foreach_glob":{"type":"function","file":"refs.h","line":554,"lineto":558,"args":[{"name":"repo","type":"git_repository *","comment":"Repository where to find the refs"},{"name":"glob","type":"const char *","comment":"Pattern to match (fnmatch-style) against reference name."},{"name":"callback","type":"git_reference_foreach_name_cb","comment":"Function which will be called for every listed ref"},{"name":"payload","type":"void *","comment":"Additional data to pass to the callback"}],"argline":"git_repository *repo, const char *glob, git_reference_foreach_name_cb callback, void *payload","sig":"git_repository *::const char *::git_reference_foreach_name_cb::void *","return":{"type":"int","comment":" 0 on success, GIT_EUSER on non-zero callback, or error code"},"description":"

Perform a callback on each reference in the repository whose name\n matches the given pattern.

\n","comments":"

This function acts like git_reference_foreach() with an additional\n pattern match being applied to the reference name before issuing the\n callback function. See that function for more information.

\n\n

The pattern is matched using fnmatch or "glob" style where a '*' matches\n any sequence of letters, a '?' matches any letter, and square brackets\n can be used to define character ranges (such as "[0-9]" for digits).

\n","group":"reference"},"git_reference_has_log":{"type":"function","file":"refs.h","line":568,"lineto":568,"args":[{"name":"repo","type":"git_repository *","comment":"the repository"},{"name":"refname","type":"const char *","comment":"the reference's name"}],"argline":"git_repository *repo, const char *refname","sig":"git_repository *::const char *","return":{"type":"int","comment":" 0 when no reflog can be found, 1 when it exists;\n otherwise an error code."},"description":"

Check if a reflog exists for the specified reference.

\n","comments":"","group":"reference"},"git_reference_ensure_log":{"type":"function","file":"refs.h","line":580,"lineto":580,"args":[{"name":"repo","type":"git_repository *","comment":"the repository"},{"name":"refname","type":"const char *","comment":"the reference's name"}],"argline":"git_repository *repo, const char *refname","sig":"git_repository *::const char *","return":{"type":"int","comment":" 0 or an error code."},"description":"

Ensure there is a reflog for a particular reference.

\n","comments":"

Make sure that successive updates to the reference will append to\n its log.

\n","group":"reference"},"git_reference_is_branch":{"type":"function","file":"refs.h","line":590,"lineto":590,"args":[{"name":"ref","type":"const git_reference *","comment":"A git reference"}],"argline":"const git_reference *ref","sig":"const git_reference *","return":{"type":"int","comment":" 1 when the reference lives in the refs/heads\n namespace; 0 otherwise."},"description":"

Check if a reference is a local branch.

\n","comments":"","group":"reference"},"git_reference_is_remote":{"type":"function","file":"refs.h","line":600,"lineto":600,"args":[{"name":"ref","type":"const git_reference *","comment":"A git reference"}],"argline":"const git_reference *ref","sig":"const git_reference *","return":{"type":"int","comment":" 1 when the reference lives in the refs/remotes\n namespace; 0 otherwise."},"description":"

Check if a reference is a remote tracking branch

\n","comments":"","group":"reference"},"git_reference_is_tag":{"type":"function","file":"refs.h","line":610,"lineto":610,"args":[{"name":"ref","type":"const git_reference *","comment":"A git reference"}],"argline":"const git_reference *ref","sig":"const git_reference *","return":{"type":"int","comment":" 1 when the reference lives in the refs/tags\n namespace; 0 otherwise."},"description":"

Check if a reference is a tag

\n","comments":"","group":"reference"},"git_reference_is_note":{"type":"function","file":"refs.h","line":620,"lineto":620,"args":[{"name":"ref","type":"const git_reference *","comment":"A git reference"}],"argline":"const git_reference *ref","sig":"const git_reference *","return":{"type":"int","comment":" 1 when the reference lives in the refs/notes\n namespace; 0 otherwise."},"description":"

Check if a reference is a note

\n","comments":"","group":"reference"},"git_reference_normalize_name":{"type":"function","file":"refs.h","line":676,"lineto":680,"args":[{"name":"buffer_out","type":"char *","comment":"User allocated buffer to store normalized name"},{"name":"buffer_size","type":"size_t","comment":"Size of buffer_out"},{"name":"name","type":"const char *","comment":"Reference name to be checked."},{"name":"flags","type":"unsigned int","comment":"Flags to constrain name validation rules - see the\n GIT_REF_FORMAT constants above."}],"argline":"char *buffer_out, size_t buffer_size, const char *name, unsigned int flags","sig":"char *::size_t::const char *::unsigned int","return":{"type":"int","comment":" 0 on success, GIT_EBUFS if buffer is too small, GIT_EINVALIDSPEC\n or an error code."},"description":"

Normalize reference name and check validity.

\n","comments":"

This will normalize the reference name by removing any leading slash\n '/' characters and collapsing runs of adjacent slashes between name\n components into a single slash.

\n\n

Once normalized, if the reference name is valid, it will be returned in\n the user allocated buffer.

\n\n

See git_reference_symbolic_create() for rules about valid names.

\n","group":"reference"},"git_reference_peel":{"type":"function","file":"refs.h","line":697,"lineto":700,"args":[{"name":"out","type":"git_object **","comment":"Pointer to the peeled git_object"},{"name":"ref","type":"git_reference *","comment":"The reference to be processed"},{"name":"type","type":"git_otype","comment":"The type of the requested object (GIT_OBJ_COMMIT,\n GIT_OBJ_TAG, GIT_OBJ_TREE, GIT_OBJ_BLOB or GIT_OBJ_ANY)."}],"argline":"git_object **out, git_reference *ref, git_otype type","sig":"git_object **::git_reference *::git_otype","return":{"type":"int","comment":" 0 on success, GIT_EAMBIGUOUS, GIT_ENOTFOUND or an error code"},"description":"

Recursively peel reference until object of the specified type is found.

\n","comments":"

The retrieved peeled object is owned by the repository\n and should be closed with the git_object_free method.

\n\n

If you pass GIT_OBJ_ANY as the target type, then the object\n will be peeled until a non-tag object is met.

\n","group":"reference"},"git_reference_is_valid_name":{"type":"function","file":"refs.h","line":716,"lineto":716,"args":[{"name":"refname","type":"const char *","comment":"name to be checked."}],"argline":"const char *refname","sig":"const char *","return":{"type":"int","comment":" 1 if the reference name is acceptable; 0 if it isn't"},"description":"

Ensure the reference name is well-formed.

\n","comments":"

Valid reference names must follow one of two patterns:

\n\n
    \n
  1. Top-level names must contain only capital letters and underscores,\nand must begin and end with a letter. (e.g. "HEAD", "ORIG_HEAD").
  2. \n
  3. Names prefixed with "refs/" can be almost anything. You must avoid\nthe characters '~', '^', ':', '\n\\\n', '?', '[', and '*', and the\nsequences ".." and "\n@\n{" which have special meaning to revparse.
  4. \n
\n","group":"reference"},"git_reference_shorthand":{"type":"function","file":"refs.h","line":730,"lineto":730,"args":[{"name":"ref","type":"const git_reference *","comment":"a reference"}],"argline":"const git_reference *ref","sig":"const git_reference *","return":{"type":"const char *","comment":" the human-readable version of the name"},"description":"

Get the reference's short name

\n","comments":"

This will transform the reference name into a name "human-readable"\n version. If no shortname is appropriate, it will return the full\n name.

\n\n

The memory is owned by the reference and must not be freed.

\n","group":"reference","examples":{"status.c":["ex/v0.23.0/status.html#git_reference_shorthand-4"]}},"git_refspec_src":{"type":"function","file":"refspec.h","line":30,"lineto":30,"args":[{"name":"refspec","type":"const git_refspec *","comment":"the refspec"}],"argline":"const git_refspec *refspec","sig":"const git_refspec *","return":{"type":"const char *","comment":" the refspec's source specifier"},"description":"

Get the source specifier

\n","comments":"","group":"refspec"},"git_refspec_dst":{"type":"function","file":"refspec.h","line":38,"lineto":38,"args":[{"name":"refspec","type":"const git_refspec *","comment":"the refspec"}],"argline":"const git_refspec *refspec","sig":"const git_refspec *","return":{"type":"const char *","comment":" the refspec's destination specifier"},"description":"

Get the destination specifier

\n","comments":"","group":"refspec"},"git_refspec_string":{"type":"function","file":"refspec.h","line":46,"lineto":46,"args":[{"name":"refspec","type":"const git_refspec *","comment":"the refspec"}],"argline":"const git_refspec *refspec","sig":"const git_refspec *","return":{"type":"const char *","comment":null},"description":"

Get the refspec's string

\n","comments":"","group":"refspec"},"git_refspec_force":{"type":"function","file":"refspec.h","line":54,"lineto":54,"args":[{"name":"refspec","type":"const git_refspec *","comment":"the refspec"}],"argline":"const git_refspec *refspec","sig":"const git_refspec *","return":{"type":"int","comment":" 1 if force update has been set, 0 otherwise"},"description":"

Get the force update setting

\n","comments":"","group":"refspec"},"git_refspec_direction":{"type":"function","file":"refspec.h","line":62,"lineto":62,"args":[{"name":"spec","type":"const git_refspec *","comment":"refspec"}],"argline":"const git_refspec *spec","sig":"const git_refspec *","return":{"type":"git_direction","comment":" GIT_DIRECTION_FETCH or GIT_DIRECTION_PUSH"},"description":"

Get the refspec's direction.

\n","comments":"","group":"refspec"},"git_refspec_src_matches":{"type":"function","file":"refspec.h","line":71,"lineto":71,"args":[{"name":"refspec","type":"const git_refspec *","comment":"the refspec"},{"name":"refname","type":"const char *","comment":"the name of the reference to check"}],"argline":"const git_refspec *refspec, const char *refname","sig":"const git_refspec *::const char *","return":{"type":"int","comment":" 1 if the refspec matches, 0 otherwise"},"description":"

Check if a refspec's source descriptor matches a reference

\n","comments":"","group":"refspec"},"git_refspec_dst_matches":{"type":"function","file":"refspec.h","line":80,"lineto":80,"args":[{"name":"refspec","type":"const git_refspec *","comment":"the refspec"},{"name":"refname","type":"const char *","comment":"the name of the reference to check"}],"argline":"const git_refspec *refspec, const char *refname","sig":"const git_refspec *::const char *","return":{"type":"int","comment":" 1 if the refspec matches, 0 otherwise"},"description":"

Check if a refspec's destination descriptor matches a reference

\n","comments":"","group":"refspec"},"git_refspec_transform":{"type":"function","file":"refspec.h","line":90,"lineto":90,"args":[{"name":"out","type":"git_buf *","comment":"where to store the target name"},{"name":"spec","type":"const git_refspec *","comment":"the refspec"},{"name":"name","type":"const char *","comment":"the name of the reference to transform"}],"argline":"git_buf *out, const git_refspec *spec, const char *name","sig":"git_buf *::const git_refspec *::const char *","return":{"type":"int","comment":" 0, GIT_EBUFS or another error"},"description":"

Transform a reference to its target following the refspec's rules

\n","comments":"","group":"refspec"},"git_refspec_rtransform":{"type":"function","file":"refspec.h","line":100,"lineto":100,"args":[{"name":"out","type":"git_buf *","comment":"where to store the source reference name"},{"name":"spec","type":"const git_refspec *","comment":"the refspec"},{"name":"name","type":"const char *","comment":"the name of the reference to transform"}],"argline":"git_buf *out, const git_refspec *spec, const char *name","sig":"git_buf *::const git_refspec *::const char *","return":{"type":"int","comment":" 0, GIT_EBUFS or another error"},"description":"

Transform a target reference to its source reference following the refspec's rules

\n","comments":"","group":"refspec"},"git_remote_create":{"type":"function","file":"remote.h","line":39,"lineto":43,"args":[{"name":"out","type":"git_remote **","comment":"the resulting remote"},{"name":"repo","type":"git_repository *","comment":"the repository in which to create the remote"},{"name":"name","type":"const char *","comment":"the remote's name"},{"name":"url","type":"const char *","comment":"the remote's url"}],"argline":"git_remote **out, git_repository *repo, const char *name, const char *url","sig":"git_remote **::git_repository *::const char *::const char *","return":{"type":"int","comment":" 0, GIT_EINVALIDSPEC, GIT_EEXISTS or an error code"},"description":"

Add a remote with the default fetch refspec to the repository's configuration.

\n","comments":"","group":"remote","examples":{"remote.c":["ex/v0.23.0/remote.html#git_remote_create-4"]}},"git_remote_create_with_fetchspec":{"type":"function","file":"remote.h","line":56,"lineto":61,"args":[{"name":"out","type":"git_remote **","comment":"the resulting remote"},{"name":"repo","type":"git_repository *","comment":"the repository in which to create the remote"},{"name":"name","type":"const char *","comment":"the remote's name"},{"name":"url","type":"const char *","comment":"the remote's url"},{"name":"fetch","type":"const char *","comment":"the remote fetch value"}],"argline":"git_remote **out, git_repository *repo, const char *name, const char *url, const char *fetch","sig":"git_remote **::git_repository *::const char *::const char *::const char *","return":{"type":"int","comment":" 0, GIT_EINVALIDSPEC, GIT_EEXISTS or an error code"},"description":"

Add a remote with the provided fetch refspec (or default if NULL) to the repository's\n configuration.

\n","comments":"","group":"remote"},"git_remote_create_anonymous":{"type":"function","file":"remote.h","line":74,"lineto":77,"args":[{"name":"out","type":"git_remote **","comment":"pointer to the new remote objects"},{"name":"repo","type":"git_repository *","comment":"the associated repository"},{"name":"url","type":"const char *","comment":"the remote repository's URL"}],"argline":"git_remote **out, git_repository *repo, const char *url","sig":"git_remote **::git_repository *::const char *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Create an anonymous remote

\n","comments":"

Create a remote with the given url in-memory. You can use this when\n you have a URL instead of a remote's name.

\n","group":"remote","examples":{"network/fetch.c":["ex/v0.23.0/network/fetch.html#git_remote_create_anonymous-4"],"network/ls-remote.c":["ex/v0.23.0/network/ls-remote.html#git_remote_create_anonymous-2"]}},"git_remote_lookup":{"type":"function","file":"remote.h","line":90,"lineto":90,"args":[{"name":"out","type":"git_remote **","comment":"pointer to the new remote object"},{"name":"repo","type":"git_repository *","comment":"the associated repository"},{"name":"name","type":"const char *","comment":"the remote's name"}],"argline":"git_remote **out, git_repository *repo, const char *name","sig":"git_remote **::git_repository *::const char *","return":{"type":"int","comment":" 0, GIT_ENOTFOUND, GIT_EINVALIDSPEC or an error code"},"description":"

Get the information for a particular remote

\n","comments":"

The name will be checked for validity.\n See git_tag_create() for rules about valid names.

\n","group":"remote","examples":{"network/fetch.c":["ex/v0.23.0/network/fetch.html#git_remote_lookup-5"],"network/ls-remote.c":["ex/v0.23.0/network/ls-remote.html#git_remote_lookup-3"],"remote.c":["ex/v0.23.0/remote.html#git_remote_lookup-5"]}},"git_remote_dup":{"type":"function","file":"remote.h","line":102,"lineto":102,"args":[{"name":"dest","type":"git_remote **","comment":"pointer where to store the copy"},{"name":"source","type":"git_remote *","comment":"object to copy"}],"argline":"git_remote **dest, git_remote *source","sig":"git_remote **::git_remote *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Create a copy of an existing remote. All internal strings are also\n duplicated. Callbacks are not duplicated.

\n","comments":"

Call git_remote_free to free the data.

\n","group":"remote"},"git_remote_owner":{"type":"function","file":"remote.h","line":110,"lineto":110,"args":[{"name":"remote","type":"const git_remote *","comment":"the remote"}],"argline":"const git_remote *remote","sig":"const git_remote *","return":{"type":"git_repository *","comment":" a pointer to the repository"},"description":"

Get the remote's repository

\n","comments":"","group":"remote"},"git_remote_name":{"type":"function","file":"remote.h","line":118,"lineto":118,"args":[{"name":"remote","type":"const git_remote *","comment":"the remote"}],"argline":"const git_remote *remote","sig":"const git_remote *","return":{"type":"const char *","comment":" a pointer to the name or NULL for in-memory remotes"},"description":"

Get the remote's name

\n","comments":"","group":"remote"},"git_remote_url":{"type":"function","file":"remote.h","line":129,"lineto":129,"args":[{"name":"remote","type":"const git_remote *","comment":"the remote"}],"argline":"const git_remote *remote","sig":"const git_remote *","return":{"type":"const char *","comment":" a pointer to the url"},"description":"

Get the remote's url

\n","comments":"

If url.*.insteadOf has been configured for this URL, it will\n return the modified URL.

\n","group":"remote","examples":{"remote.c":["ex/v0.23.0/remote.html#git_remote_url-6"]}},"git_remote_pushurl":{"type":"function","file":"remote.h","line":140,"lineto":140,"args":[{"name":"remote","type":"const git_remote *","comment":"the remote"}],"argline":"const git_remote *remote","sig":"const git_remote *","return":{"type":"const char *","comment":" a pointer to the url or NULL if no special url for pushing is set"},"description":"

Get the remote's url for pushing

\n","comments":"

If url.*.pushInsteadOf has been configured for this URL, it\n will return the modified URL.

\n","group":"remote","examples":{"remote.c":["ex/v0.23.0/remote.html#git_remote_pushurl-7"]}},"git_remote_set_url":{"type":"function","file":"remote.h","line":153,"lineto":153,"args":[{"name":"repo","type":"git_repository *","comment":"the repository in which to perform the change"},{"name":"remote","type":"const char *","comment":"the remote's name"},{"name":"url","type":"const char *","comment":"the url to set"}],"argline":"git_repository *repo, const char *remote, const char *url","sig":"git_repository *::const char *::const char *","return":{"type":"int","comment":" 0 or an error value"},"description":"

Set the remote's url in the configuration

\n","comments":"

Remote objects already in memory will not be affected. This assumes\n the common case of a single-url remote and will otherwise return an error.

\n","group":"remote","examples":{"remote.c":["ex/v0.23.0/remote.html#git_remote_set_url-8"]}},"git_remote_set_pushurl":{"type":"function","file":"remote.h","line":166,"lineto":166,"args":[{"name":"repo","type":"git_repository *","comment":"the repository in which to perform the change"},{"name":"remote","type":"const char *","comment":"the remote's name"},{"name":"url","type":"const char *","comment":"the url to set"}],"argline":"git_repository *repo, const char *remote, const char *url","sig":"git_repository *::const char *::const char *","return":{"type":"int","comment":null},"description":"

Set the remote's url for pushing in the configuration.

\n","comments":"

Remote objects already in memory will not be affected. This assumes\n the common case of a single-url remote and will otherwise return an error.

\n","group":"remote","examples":{"remote.c":["ex/v0.23.0/remote.html#git_remote_set_pushurl-9"]}},"git_remote_add_fetch":{"type":"function","file":"remote.h","line":179,"lineto":179,"args":[{"name":"repo","type":"git_repository *","comment":"the repository in which to change the configuration"},{"name":"remote","type":"const char *","comment":"the name of the remote to change"},{"name":"refspec","type":"const char *","comment":"the new fetch refspec"}],"argline":"git_repository *repo, const char *remote, const char *refspec","sig":"git_repository *::const char *::const char *","return":{"type":"int","comment":" 0, GIT_EINVALIDSPEC if refspec is invalid or an error value"},"description":"

Add a fetch refspec to the remote's configuration

\n","comments":"

Add the given refspec to the fetch list in the configuration. No\n loaded remote instances will be affected.

\n","group":"remote"},"git_remote_get_fetch_refspecs":{"type":"function","file":"remote.h","line":190,"lineto":190,"args":[{"name":"array","type":"git_strarray *","comment":"pointer to the array in which to store the strings"},{"name":"remote","type":"const git_remote *","comment":"the remote to query"}],"argline":"git_strarray *array, const git_remote *remote","sig":"git_strarray *::const git_remote *","return":{"type":"int","comment":null},"description":"

Get the remote's list of fetch refspecs

\n","comments":"

The memory is owned by the user and should be freed with\n git_strarray_free.

\n","group":"remote"},"git_remote_add_push":{"type":"function","file":"remote.h","line":203,"lineto":203,"args":[{"name":"repo","type":"git_repository *","comment":"the repository in which to change the configuration"},{"name":"remote","type":"const char *","comment":"the name of the remote to change"},{"name":"refspec","type":"const char *","comment":"the new push refspec"}],"argline":"git_repository *repo, const char *remote, const char *refspec","sig":"git_repository *::const char *::const char *","return":{"type":"int","comment":" 0, GIT_EINVALIDSPEC if refspec is invalid or an error value"},"description":"

Add a push refspec to the remote's configuration

\n","comments":"

Add the given refspec to the push list in the configuration. No\n loaded remote instances will be affected.

\n","group":"remote"},"git_remote_get_push_refspecs":{"type":"function","file":"remote.h","line":214,"lineto":214,"args":[{"name":"array","type":"git_strarray *","comment":"pointer to the array in which to store the strings"},{"name":"remote","type":"const git_remote *","comment":"the remote to query"}],"argline":"git_strarray *array, const git_remote *remote","sig":"git_strarray *::const git_remote *","return":{"type":"int","comment":null},"description":"

Get the remote's list of push refspecs

\n","comments":"

The memory is owned by the user and should be freed with\n git_strarray_free.

\n","group":"remote"},"git_remote_refspec_count":{"type":"function","file":"remote.h","line":222,"lineto":222,"args":[{"name":"remote","type":"const git_remote *","comment":"the remote"}],"argline":"const git_remote *remote","sig":"const git_remote *","return":{"type":"size_t","comment":" the amount of refspecs configured in this remote"},"description":"

Get the number of refspecs for a remote

\n","comments":"","group":"remote"},"git_remote_get_refspec":{"type":"function","file":"remote.h","line":231,"lineto":231,"args":[{"name":"remote","type":"const git_remote *","comment":"the remote to query"},{"name":"n","type":"size_t","comment":"the refspec to get"}],"argline":"const git_remote *remote, size_t n","sig":"const git_remote *::size_t","return":{"type":"const git_refspec *","comment":" the nth refspec"},"description":"

Get a refspec from the remote

\n","comments":"","group":"remote"},"git_remote_connect":{"type":"function","file":"remote.h","line":246,"lineto":246,"args":[{"name":"remote","type":"git_remote *","comment":"the remote to connect to"},{"name":"direction","type":"git_direction","comment":"GIT_DIRECTION_FETCH if you want to fetch or\n GIT_DIRECTION_PUSH if you want to push"},{"name":"callbacks","type":"const git_remote_callbacks *","comment":"the callbacks to use for this connection"}],"argline":"git_remote *remote, git_direction direction, const git_remote_callbacks *callbacks","sig":"git_remote *::git_direction::const git_remote_callbacks *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Open a connection to a remote

\n","comments":"

The transport is selected based on the URL. The direction argument\n is due to a limitation of the git protocol (over TCP or SSH) which\n starts up a specific binary which can only do the one or the other.

\n","group":"remote","examples":{"network/fetch.c":["ex/v0.23.0/network/fetch.html#git_remote_connect-6"],"network/ls-remote.c":["ex/v0.23.0/network/ls-remote.html#git_remote_connect-4"]}},"git_remote_ls":{"type":"function","file":"remote.h","line":268,"lineto":268,"args":[{"name":"out","type":"const git_remote_head ***","comment":"pointer to the array"},{"name":"size","type":"size_t *","comment":"the number of remote heads"},{"name":"remote","type":"git_remote *","comment":"the remote"}],"argline":"const git_remote_head ***out, size_t *size, git_remote *remote","sig":"const git_remote_head ***::size_t *::git_remote *","return":{"type":"int","comment":" 0 on success, or an error code"},"description":"

Get the remote repository's reference advertisement list

\n","comments":"

Get the list of references with which the server responds to a new\n connection.

\n\n

The remote (or more exactly its transport) must have connected to\n the remote repository. This list is available as soon as the\n connection to the remote is initiated and it remains available\n after disconnecting.

\n\n

The memory belongs to the remote. The pointer will be valid as long\n as a new connection is not initiated, but it is recommended that\n you make a copy in order to make use of the data.

\n","group":"remote","examples":{"network/ls-remote.c":["ex/v0.23.0/network/ls-remote.html#git_remote_ls-5"]}},"git_remote_connected":{"type":"function","file":"remote.h","line":279,"lineto":279,"args":[{"name":"remote","type":"const git_remote *","comment":"the remote"}],"argline":"const git_remote *remote","sig":"const git_remote *","return":{"type":"int","comment":" 1 if it's connected, 0 otherwise."},"description":"

Check whether the remote is connected

\n","comments":"

Check whether the remote's underlying transport is connected to the\n remote host.

\n","group":"remote"},"git_remote_stop":{"type":"function","file":"remote.h","line":289,"lineto":289,"args":[{"name":"remote","type":"git_remote *","comment":"the remote"}],"argline":"git_remote *remote","sig":"git_remote *","return":{"type":"void","comment":null},"description":"

Cancel the operation

\n","comments":"

At certain points in its operation, the network code checks whether\n the operation has been cancelled and if so stops the operation.

\n","group":"remote"},"git_remote_disconnect":{"type":"function","file":"remote.h","line":298,"lineto":298,"args":[{"name":"remote","type":"git_remote *","comment":"the remote to disconnect from"}],"argline":"git_remote *remote","sig":"git_remote *","return":{"type":"void","comment":null},"description":"

Disconnect from the remote

\n","comments":"

Close the connection to the remote.

\n","group":"remote","examples":{"network/fetch.c":["ex/v0.23.0/network/fetch.html#git_remote_disconnect-7"]}},"git_remote_free":{"type":"function","file":"remote.h","line":308,"lineto":308,"args":[{"name":"remote","type":"git_remote *","comment":"the remote to free"}],"argline":"git_remote *remote","sig":"git_remote *","return":{"type":"void","comment":null},"description":"

Free the memory associated with a remote

\n","comments":"

This also disconnects from the remote, if the connection\n has not been closed yet (using git_remote_disconnect).

\n","group":"remote","examples":{"network/fetch.c":["ex/v0.23.0/network/fetch.html#git_remote_free-8","ex/v0.23.0/network/fetch.html#git_remote_free-9"],"network/ls-remote.c":["ex/v0.23.0/network/ls-remote.html#git_remote_free-6"],"remote.c":["ex/v0.23.0/remote.html#git_remote_free-10"]}},"git_remote_list":{"type":"function","file":"remote.h","line":319,"lineto":319,"args":[{"name":"out","type":"git_strarray *","comment":"a string array which receives the names of the remotes"},{"name":"repo","type":"git_repository *","comment":"the repository to query"}],"argline":"git_strarray *out, git_repository *repo","sig":"git_strarray *::git_repository *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Get a list of the configured remotes for a repo

\n","comments":"

The string array must be freed by the user.

\n","group":"remote","examples":{"remote.c":["ex/v0.23.0/remote.html#git_remote_list-11"]}},"git_remote_init_callbacks":{"type":"function","file":"remote.h","line":470,"lineto":472,"args":[{"name":"opts","type":"git_remote_callbacks *","comment":"the `git_remote_callbacks` struct to initialize"},{"name":"version","type":"unsigned int","comment":"Version of struct; pass `GIT_REMOTE_CALLBACKS_VERSION`"}],"argline":"git_remote_callbacks *opts, unsigned int version","sig":"git_remote_callbacks *::unsigned int","return":{"type":"int","comment":" Zero on success; -1 on failure."},"description":"

Initializes a git_remote_callbacks with default values. Equivalent to\n creating an instance with GIT_REMOTE_CALLBACKS_INIT.

\n","comments":"","group":"remote"},"git_fetch_init_options":{"type":"function","file":"remote.h","line":555,"lineto":557,"args":[{"name":"opts","type":"git_fetch_options *","comment":"the `git_push_options` instance to initialize."},{"name":"version","type":"unsigned int","comment":"the version of the struct; you should pass\n `GIT_FETCH_OPTIONS_VERSION` here."}],"argline":"git_fetch_options *opts, unsigned int version","sig":"git_fetch_options *::unsigned int","return":{"type":"int","comment":" Zero on success; -1 on failure."},"description":"

Initializes a git_fetch_options with default values. Equivalent to\n creating an instance with GIT_FETCH_OPTIONS_INIT.

\n","comments":"","group":"fetch"},"git_push_init_options":{"type":"function","file":"remote.h","line":594,"lineto":596,"args":[{"name":"opts","type":"git_push_options *","comment":"the `git_push_options` instance to initialize."},{"name":"version","type":"unsigned int","comment":"the version of the struct; you should pass\n `GIT_PUSH_OPTIONS_VERSION` here."}],"argline":"git_push_options *opts, unsigned int version","sig":"git_push_options *::unsigned int","return":{"type":"int","comment":" Zero on success; -1 on failure."},"description":"

Initializes a git_push_options with default values. Equivalent to\n creating an instance with GIT_PUSH_OPTIONS_INIT.

\n","comments":"","group":"push"},"git_remote_download":{"type":"function","file":"remote.h","line":614,"lineto":614,"args":[{"name":"remote","type":"git_remote *","comment":"the remote"},{"name":"refspecs","type":"const git_strarray *","comment":"the refspecs to use for this negotiation and\n download. Use NULL or an empty array to use the base refspecs"},{"name":"opts","type":"const git_fetch_options *","comment":"the options to use for this fetch"}],"argline":"git_remote *remote, const git_strarray *refspecs, const git_fetch_options *opts","sig":"git_remote *::const git_strarray *::const git_fetch_options *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Download and index the packfile

\n","comments":"

Connect to the remote if it hasn't been done yet, negotiate with\n the remote git which objects are missing, download and index the\n packfile.

\n\n

The .idx file will be created and both it and the packfile with be\n renamed to their final name.

\n","group":"remote","examples":{"network/fetch.c":["ex/v0.23.0/network/fetch.html#git_remote_download-10"]}},"git_remote_upload":{"type":"function","file":"remote.h","line":628,"lineto":628,"args":[{"name":"remote","type":"git_remote *","comment":"the remote"},{"name":"refspecs","type":"const git_strarray *","comment":"the refspecs to use for this negotiation and\n upload. Use NULL or an empty array to use the base refspecs"},{"name":"opts","type":"const git_push_options *","comment":"the options to use for this push"}],"argline":"git_remote *remote, const git_strarray *refspecs, const git_push_options *opts","sig":"git_remote *::const git_strarray *::const git_push_options *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Create a packfile and send it to the server

\n","comments":"

Connect to the remote if it hasn't been done yet, negotiate with\n the remote git which objects are missing, create a packfile with the missing objects and send it.

\n","group":"remote"},"git_remote_update_tips":{"type":"function","file":"remote.h","line":644,"lineto":649,"args":[{"name":"remote","type":"git_remote *","comment":"the remote to update"},{"name":"callbacks","type":"const git_remote_callbacks *","comment":"pointer to the callback structure to use"},{"name":"update_fetchhead","type":"int","comment":"whether to write to FETCH_HEAD. Pass 1 to behave like git."},{"name":"download_tags","type":"git_remote_autotag_option_t","comment":"what the behaviour for downloading tags is for this fetch. This is\n ignored for push. This must be the same value passed to `git_remote_download()`."},{"name":"reflog_message","type":"const char *","comment":"The message to insert into the reflogs. If\n NULL and fetching, the default is \"fetch \n\", where \n is\n the name of the remote (or its url, for in-memory remotes). This\n parameter is ignored when pushing."}],"argline":"git_remote *remote, const git_remote_callbacks *callbacks, int update_fetchhead, git_remote_autotag_option_t download_tags, const char *reflog_message","sig":"git_remote *::const git_remote_callbacks *::int::git_remote_autotag_option_t::const char *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Update the tips to the new state

\n","comments":"","group":"remote","examples":{"network/fetch.c":["ex/v0.23.0/network/fetch.html#git_remote_update_tips-11"]}},"git_remote_fetch":{"type":"function","file":"remote.h","line":665,"lineto":669,"args":[{"name":"remote","type":"git_remote *","comment":"the remote to fetch from"},{"name":"refspecs","type":"const git_strarray *","comment":"the refspecs to use for this fetch. Pass NULL or an\n empty array to use the base refspecs."},{"name":"opts","type":"const git_fetch_options *","comment":"options to use for this fetch"},{"name":"reflog_message","type":"const char *","comment":"The message to insert into the reflogs. If NULL, the\n\t\t\t\t\t\t\t\t default is \"fetch\""}],"argline":"git_remote *remote, const git_strarray *refspecs, const git_fetch_options *opts, const char *reflog_message","sig":"git_remote *::const git_strarray *::const git_fetch_options *::const char *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Download new data and update tips

\n","comments":"

Convenience function to connect to a remote, download the data,\n disconnect and update the remote-tracking branches.

\n","group":"remote"},"git_remote_prune":{"type":"function","file":"remote.h","line":678,"lineto":678,"args":[{"name":"remote","type":"git_remote *","comment":"the remote to prune"},{"name":"callbacks","type":"const git_remote_callbacks *","comment":"callbacks to use for this prune"}],"argline":"git_remote *remote, const git_remote_callbacks *callbacks","sig":"git_remote *::const git_remote_callbacks *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Prune tracking refs that are no longer present on remote

\n","comments":"","group":"remote"},"git_remote_push":{"type":"function","file":"remote.h","line":690,"lineto":692,"args":[{"name":"remote","type":"git_remote *","comment":"the remote to push to"},{"name":"refspecs","type":"const git_strarray *","comment":"the refspecs to use for pushing. If none are\n passed, the configured refspecs will be used"},{"name":"opts","type":"const git_push_options *","comment":"options to use for this push"}],"argline":"git_remote *remote, const git_strarray *refspecs, const git_push_options *opts","sig":"git_remote *::const git_strarray *::const git_push_options *","return":{"type":"int","comment":null},"description":"

Perform a push

\n","comments":"

Peform all the steps from a push.

\n","group":"remote"},"git_remote_stats":{"type":"function","file":"remote.h","line":697,"lineto":697,"args":[{"name":"remote","type":"git_remote *","comment":null}],"argline":"git_remote *remote","sig":"git_remote *","return":{"type":"const git_transfer_progress *","comment":null},"description":"

Get the statistics structure that is filled in by the fetch operation.

\n","comments":"","group":"remote","examples":{"network/fetch.c":["ex/v0.23.0/network/fetch.html#git_remote_stats-12"]}},"git_remote_autotag":{"type":"function","file":"remote.h","line":705,"lineto":705,"args":[{"name":"remote","type":"const git_remote *","comment":"the remote to query"}],"argline":"const git_remote *remote","sig":"const git_remote *","return":{"type":"git_remote_autotag_option_t","comment":" the auto-follow setting"},"description":"

Retrieve the tag auto-follow setting

\n","comments":"","group":"remote"},"git_remote_set_autotag":{"type":"function","file":"remote.h","line":717,"lineto":717,"args":[{"name":"repo","type":"git_repository *","comment":"the repository in which to make the change"},{"name":"remote","type":"const char *","comment":"the name of the remote"},{"name":"value","type":"git_remote_autotag_option_t","comment":"the new value to take."}],"argline":"git_repository *repo, const char *remote, git_remote_autotag_option_t value","sig":"git_repository *::const char *::git_remote_autotag_option_t","return":{"type":"int","comment":null},"description":"

Set the remote's tag following setting.

\n","comments":"

The change will be made in the configuration. No loaded remotes\n will be affected.

\n","group":"remote"},"git_remote_prune_refs":{"type":"function","file":"remote.h","line":724,"lineto":724,"args":[{"name":"remote","type":"const git_remote *","comment":"the remote to query"}],"argline":"const git_remote *remote","sig":"const git_remote *","return":{"type":"int","comment":" the ref-prune setting"},"description":"

Retrieve the ref-prune setting

\n","comments":"","group":"remote"},"git_remote_rename":{"type":"function","file":"remote.h","line":746,"lineto":750,"args":[{"name":"problems","type":"git_strarray *","comment":"non-default refspecs cannot be renamed and will be\n stored here for further processing by the caller. Always free this\n strarray on successful return."},{"name":"repo","type":"git_repository *","comment":"the repository in which to rename"},{"name":"name","type":"const char *","comment":"the current name of the reamote"},{"name":"new_name","type":"const char *","comment":"the new name the remote should bear"}],"argline":"git_strarray *problems, git_repository *repo, const char *name, const char *new_name","sig":"git_strarray *::git_repository *::const char *::const char *","return":{"type":"int","comment":" 0, GIT_EINVALIDSPEC, GIT_EEXISTS or an error code"},"description":"

Give the remote a new name

\n","comments":"

All remote-tracking branches and configuration settings\n for the remote are updated.

\n\n

The new name will be checked for validity.\n See git_tag_create() for rules about valid names.

\n\n

No loaded instances of a the remote with the old name will change\n their name or their list of refspecs.

\n","group":"remote","examples":{"remote.c":["ex/v0.23.0/remote.html#git_remote_rename-12"]}},"git_remote_is_valid_name":{"type":"function","file":"remote.h","line":758,"lineto":758,"args":[{"name":"remote_name","type":"const char *","comment":"name to be checked."}],"argline":"const char *remote_name","sig":"const char *","return":{"type":"int","comment":" 1 if the reference name is acceptable; 0 if it isn't"},"description":"

Ensure the remote name is well-formed.

\n","comments":"","group":"remote"},"git_remote_delete":{"type":"function","file":"remote.h","line":770,"lineto":770,"args":[{"name":"repo","type":"git_repository *","comment":"the repository in which to act"},{"name":"name","type":"const char *","comment":"the name of the remove to delete"}],"argline":"git_repository *repo, const char *name","sig":"git_repository *::const char *","return":{"type":"int","comment":" 0 on success, or an error code."},"description":"

Delete an existing persisted remote.

\n","comments":"

All remote-tracking branches and configuration settings\n for the remote will be removed.

\n","group":"remote","examples":{"remote.c":["ex/v0.23.0/remote.html#git_remote_delete-13"]}},"git_remote_default_branch":{"type":"function","file":"remote.h","line":788,"lineto":788,"args":[{"name":"out","type":"git_buf *","comment":"the buffern in which to store the reference name"},{"name":"remote","type":"git_remote *","comment":"the remote"}],"argline":"git_buf *out, git_remote *remote","sig":"git_buf *::git_remote *","return":{"type":"int","comment":" 0, GIT_ENOTFOUND if the remote does not have any references\n or none of them point to HEAD's commit, or an error message."},"description":"

Retrieve the name of the remote's default branch

\n","comments":"

The default branch of a repository is the branch which HEAD points\n to. If the remote does not support reporting this information\n directly, it performs the guess as git does; that is, if there are\n multiple branches which point to the same commit, the first one is\n chosen. If the master branch is a candidate, it wins.

\n\n

This function must only be called after connecting.

\n","group":"remote"},"git_repository_open":{"type":"function","file":"repository.h","line":37,"lineto":37,"args":[{"name":"out","type":"git_repository **","comment":"pointer to the repo which will be opened"},{"name":"path","type":"const char *","comment":"the path to the repository"}],"argline":"git_repository **out, const char *path","sig":"git_repository **::const char *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Open a git repository.

\n","comments":"

The 'path' argument must point to either a git repository\n folder, or an existing work dir.

\n\n

The method will automatically detect if 'path' is a normal\n or bare repository or fail is 'path' is neither.

\n","group":"repository","examples":{"general.c":["ex/v0.23.0/general.html#git_repository_open-58"],"network/git2.c":["ex/v0.23.0/network/git2.html#git_repository_open-5"],"remote.c":["ex/v0.23.0/remote.html#git_repository_open-14"]}},"git_repository_wrap_odb":{"type":"function","file":"repository.h","line":50,"lineto":50,"args":[{"name":"out","type":"git_repository **","comment":"pointer to the repo"},{"name":"odb","type":"git_odb *","comment":"the object database to wrap"}],"argline":"git_repository **out, git_odb *odb","sig":"git_repository **::git_odb *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Create a "fake" repository to wrap an object database

\n","comments":"

Create a repository object to wrap an object database to be used\n with the API when all you have is an object database. This doesn't\n have any paths associated with it, so use with care.

\n","group":"repository"},"git_repository_discover":{"type":"function","file":"repository.h","line":78,"lineto":82,"args":[{"name":"out","type":"git_buf *","comment":"A pointer to a user-allocated git_buf which will contain\n the found path."},{"name":"start_path","type":"const char *","comment":"The base path where the lookup starts."},{"name":"across_fs","type":"int","comment":"If true, then the lookup will not stop when a\n filesystem device change is detected while exploring parent directories."},{"name":"ceiling_dirs","type":"const char *","comment":"A GIT_PATH_LIST_SEPARATOR separated list of\n absolute symbolic link free paths. The lookup will stop when any\n of this paths is reached. Note that the lookup always performs on\n start_path no matter start_path appears in ceiling_dirs ceiling_dirs\n might be NULL (which is equivalent to an empty string)"}],"argline":"git_buf *out, const char *start_path, int across_fs, const char *ceiling_dirs","sig":"git_buf *::const char *::int::const char *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Look for a git repository and copy its path in the given buffer.\n The lookup start from base_path and walk across parent directories\n if nothing has been found. The lookup ends when the first repository\n is found, or when reaching a directory referenced in ceiling_dirs\n or when the filesystem changes (in case across_fs is true).

\n","comments":"

The method will automatically detect if the repository is bare\n (if there is a repository).

\n","group":"repository","examples":{"remote.c":["ex/v0.23.0/remote.html#git_repository_discover-15"]}},"git_repository_open_ext":{"type":"function","file":"repository.h","line":122,"lineto":126,"args":[{"name":"out","type":"git_repository **","comment":"Pointer to the repo which will be opened. This can\n actually be NULL if you only want to use the error code to\n see if a repo at this path could be opened."},{"name":"path","type":"const char *","comment":"Path to open as git repository. If the flags\n permit \"searching\", then this can be a path to a subdirectory\n inside the working directory of the repository."},{"name":"flags","type":"unsigned int","comment":"A combination of the GIT_REPOSITORY_OPEN flags above."},{"name":"ceiling_dirs","type":"const char *","comment":"A GIT_PATH_LIST_SEPARATOR delimited list of path\n prefixes at which the search for a containing repository should\n terminate."}],"argline":"git_repository **out, const char *path, unsigned int flags, const char *ceiling_dirs","sig":"git_repository **::const char *::unsigned int::const char *","return":{"type":"int","comment":" 0 on success, GIT_ENOTFOUND if no repository could be found,\n or -1 if there was a repository but open failed for some reason\n (such as repo corruption or system errors)."},"description":"

Find and open a repository with extended controls.

\n","comments":"","group":"repository","examples":{"blame.c":["ex/v0.23.0/blame.html#git_repository_open_ext-24"],"cat-file.c":["ex/v0.23.0/cat-file.html#git_repository_open_ext-31"],"describe.c":["ex/v0.23.0/describe.html#git_repository_open_ext-6"],"diff.c":["ex/v0.23.0/diff.html#git_repository_open_ext-15"],"log.c":["ex/v0.23.0/log.html#git_repository_open_ext-44","ex/v0.23.0/log.html#git_repository_open_ext-45"],"rev-parse.c":["ex/v0.23.0/rev-parse.html#git_repository_open_ext-16"],"status.c":["ex/v0.23.0/status.html#git_repository_open_ext-5"],"tag.c":["ex/v0.23.0/tag.html#git_repository_open_ext-11"]}},"git_repository_open_bare":{"type":"function","file":"repository.h","line":139,"lineto":139,"args":[{"name":"out","type":"git_repository **","comment":"Pointer to the repo which will be opened."},{"name":"bare_path","type":"const char *","comment":"Direct path to the bare repository"}],"argline":"git_repository **out, const char *bare_path","sig":"git_repository **::const char *","return":{"type":"int","comment":" 0 on success, or an error code"},"description":"

Open a bare repository on the serverside.

\n","comments":"

This is a fast open for bare repositories that will come in handy\n if you're e.g. hosting git repositories and need to access them\n efficiently

\n","group":"repository"},"git_repository_free":{"type":"function","file":"repository.h","line":152,"lineto":152,"args":[{"name":"repo","type":"git_repository *","comment":"repository handle to close. If NULL nothing occurs."}],"argline":"git_repository *repo","sig":"git_repository *","return":{"type":"void","comment":null},"description":"

Free a previously allocated repository

\n","comments":"

Note that after a repository is free'd, all the objects it has spawned\n will still exist until they are manually closed by the user\n with git_object_free, but accessing any of the attributes of\n an object without a backing repository will result in undefined\n behavior

\n","group":"repository","examples":{"blame.c":["ex/v0.23.0/blame.html#git_repository_free-25"],"cat-file.c":["ex/v0.23.0/cat-file.html#git_repository_free-32"],"describe.c":["ex/v0.23.0/describe.html#git_repository_free-7"],"diff.c":["ex/v0.23.0/diff.html#git_repository_free-16"],"general.c":["ex/v0.23.0/general.html#git_repository_free-59"],"init.c":["ex/v0.23.0/init.html#git_repository_free-6"],"log.c":["ex/v0.23.0/log.html#git_repository_free-46"],"network/clone.c":["ex/v0.23.0/network/clone.html#git_repository_free-3"],"network/git2.c":["ex/v0.23.0/network/git2.html#git_repository_free-6"],"rev-parse.c":["ex/v0.23.0/rev-parse.html#git_repository_free-17"],"status.c":["ex/v0.23.0/status.html#git_repository_free-6"],"tag.c":["ex/v0.23.0/tag.html#git_repository_free-12"]}},"git_repository_init":{"type":"function","file":"repository.h","line":169,"lineto":172,"args":[{"name":"out","type":"git_repository **","comment":"pointer to the repo which will be created or reinitialized"},{"name":"path","type":"const char *","comment":"the path to the repository"},{"name":"is_bare","type":"unsigned int","comment":"if true, a Git repository without a working directory is\n\t\tcreated at the pointed path. If false, provided path will be\n\t\tconsidered as the working directory into which the .git directory\n\t\twill be created."}],"argline":"git_repository **out, const char *path, unsigned int is_bare","sig":"git_repository **::const char *::unsigned int","return":{"type":"int","comment":" 0 or an error code"},"description":"

Creates a new Git repository in the given folder.

\n","comments":"

TODO:\n - Reinit the repository

\n","group":"repository","examples":{"init.c":["ex/v0.23.0/init.html#git_repository_init-7"]}},"git_repository_init_init_options":{"type":"function","file":"repository.h","line":281,"lineto":283,"args":[{"name":"opts","type":"git_repository_init_options *","comment":"the `git_repository_init_options` struct to initialize"},{"name":"version","type":"unsigned int","comment":"Version of struct; pass `GIT_REPOSITORY_INIT_OPTIONS_VERSION`"}],"argline":"git_repository_init_options *opts, unsigned int version","sig":"git_repository_init_options *::unsigned int","return":{"type":"int","comment":" Zero on success; -1 on failure."},"description":"

Initializes a git_repository_init_options with default values. Equivalent\n to creating an instance with GIT_REPOSITORY_INIT_OPTIONS_INIT.

\n","comments":"","group":"repository"},"git_repository_init_ext":{"type":"function","file":"repository.h","line":298,"lineto":301,"args":[{"name":"out","type":"git_repository **","comment":"Pointer to the repo which will be created or reinitialized."},{"name":"repo_path","type":"const char *","comment":"The path to the repository."},{"name":"opts","type":"git_repository_init_options *","comment":"Pointer to git_repository_init_options struct."}],"argline":"git_repository **out, const char *repo_path, git_repository_init_options *opts","sig":"git_repository **::const char *::git_repository_init_options *","return":{"type":"int","comment":" 0 or an error code on failure."},"description":"

Create a new Git repository in the given folder with extended controls.

\n","comments":"

This will initialize a new git repository (creating the repo_path\n if requested by flags) and working directory as needed. It will\n auto-detect the case sensitivity of the file system and if the\n file system supports file mode bits correctly.

\n","group":"repository","examples":{"init.c":["ex/v0.23.0/init.html#git_repository_init_ext-8"]}},"git_repository_head":{"type":"function","file":"repository.h","line":316,"lineto":316,"args":[{"name":"out","type":"git_reference **","comment":"pointer to the reference which will be retrieved"},{"name":"repo","type":"git_repository *","comment":"a repository object"}],"argline":"git_reference **out, git_repository *repo","sig":"git_reference **::git_repository *","return":{"type":"int","comment":" 0 on success, GIT_EUNBORNBRANCH when HEAD points to a non existing\n branch, GIT_ENOTFOUND when HEAD is missing; an error code otherwise"},"description":"

Retrieve and resolve the reference pointed at by HEAD.

\n","comments":"

The returned git_reference will be owned by caller and\n git_reference_free() must be called when done with it to release the\n allocated memory and prevent a leak.

\n","group":"repository","examples":{"status.c":["ex/v0.23.0/status.html#git_repository_head-7"]}},"git_repository_head_detached":{"type":"function","file":"repository.h","line":328,"lineto":328,"args":[{"name":"repo","type":"git_repository *","comment":"Repo to test"}],"argline":"git_repository *repo","sig":"git_repository *","return":{"type":"int","comment":" 1 if HEAD is detached, 0 if it's not; error code if there\n was an error."},"description":"

Check if a repository's HEAD is detached

\n","comments":"

A repository's HEAD is detached when it points directly to a commit\n instead of a branch.

\n","group":"repository"},"git_repository_head_unborn":{"type":"function","file":"repository.h","line":340,"lineto":340,"args":[{"name":"repo","type":"git_repository *","comment":"Repo to test"}],"argline":"git_repository *repo","sig":"git_repository *","return":{"type":"int","comment":" 1 if the current branch is unborn, 0 if it's not; error\n code if there was an error"},"description":"

Check if the current branch is unborn

\n","comments":"

An unborn branch is one named from HEAD but which doesn't exist in\n the refs namespace, because it doesn't have any commit to point to.

\n","group":"repository"},"git_repository_is_empty":{"type":"function","file":"repository.h","line":352,"lineto":352,"args":[{"name":"repo","type":"git_repository *","comment":"Repo to test"}],"argline":"git_repository *repo","sig":"git_repository *","return":{"type":"int","comment":" 1 if the repository is empty, 0 if it isn't, error code\n if the repository is corrupted"},"description":"

Check if a repository is empty

\n","comments":"

An empty repository has just been initialized and contains no references\n apart from HEAD, which must be pointing to the unborn master branch.

\n","group":"repository"},"git_repository_path":{"type":"function","file":"repository.h","line":363,"lineto":363,"args":[{"name":"repo","type":"git_repository *","comment":"A repository object"}],"argline":"git_repository *repo","sig":"git_repository *","return":{"type":"const char *","comment":" the path to the repository"},"description":"

Get the path of this repository

\n","comments":"

This is the path of the .git folder for normal repositories,\n or of the repository itself for bare repositories.

\n","group":"repository","examples":{"init.c":["ex/v0.23.0/init.html#git_repository_path-9"],"status.c":["ex/v0.23.0/status.html#git_repository_path-8"]}},"git_repository_workdir":{"type":"function","file":"repository.h","line":374,"lineto":374,"args":[{"name":"repo","type":"git_repository *","comment":"A repository object"}],"argline":"git_repository *repo","sig":"git_repository *","return":{"type":"const char *","comment":" the path to the working dir, if it exists"},"description":"

Get the path of the working directory for this repository

\n","comments":"

If the repository is bare, this function will always return\n NULL.

\n","group":"repository","examples":{"init.c":["ex/v0.23.0/init.html#git_repository_workdir-10"]}},"git_repository_set_workdir":{"type":"function","file":"repository.h","line":393,"lineto":394,"args":[{"name":"repo","type":"git_repository *","comment":"A repository object"},{"name":"workdir","type":"const char *","comment":"The path to a working directory"},{"name":"update_gitlink","type":"int","comment":"Create/update gitlink in workdir and set config\n \"core.worktree\" (if workdir is not the parent of the .git directory)"}],"argline":"git_repository *repo, const char *workdir, int update_gitlink","sig":"git_repository *::const char *::int","return":{"type":"int","comment":" 0, or an error code"},"description":"

Set the path to the working directory for this repository

\n","comments":"

The working directory doesn't need to be the same one\n that contains the .git folder for this repository.

\n\n

If this repository is bare, setting its working directory\n will turn it into a normal repository, capable of performing\n all the common workdir operations (checkout, status, index\n manipulation, etc).

\n","group":"repository"},"git_repository_is_bare":{"type":"function","file":"repository.h","line":402,"lineto":402,"args":[{"name":"repo","type":"git_repository *","comment":"Repo to test"}],"argline":"git_repository *repo","sig":"git_repository *","return":{"type":"int","comment":" 1 if the repository is bare, 0 otherwise."},"description":"

Check if a repository is bare

\n","comments":"","group":"repository","examples":{"status.c":["ex/v0.23.0/status.html#git_repository_is_bare-9"]}},"git_repository_config":{"type":"function","file":"repository.h","line":418,"lineto":418,"args":[{"name":"out","type":"git_config **","comment":"Pointer to store the loaded configuration"},{"name":"repo","type":"git_repository *","comment":"A repository object"}],"argline":"git_config **out, git_repository *repo","sig":"git_config **::git_repository *","return":{"type":"int","comment":" 0, or an error code"},"description":"

Get the configuration file for this repository.

\n","comments":"

If a configuration file has not been set, the default\n config set for the repository will be returned, including\n global and system configurations (if they are available).

\n\n

The configuration file must be freed once it's no longer\n being used by the user.

\n","group":"repository"},"git_repository_config_snapshot":{"type":"function","file":"repository.h","line":434,"lineto":434,"args":[{"name":"out","type":"git_config **","comment":"Pointer to store the loaded configuration"},{"name":"repo","type":"git_repository *","comment":"the repository"}],"argline":"git_config **out, git_repository *repo","sig":"git_config **::git_repository *","return":{"type":"int","comment":" 0, or an error code"},"description":"

Get a snapshot of the repository's configuration

\n","comments":"

Convenience function to take a snapshot from the repository's\n configuration. The contents of this snapshot will not change,\n even if the underlying config files are modified.

\n\n

The configuration file must be freed once it's no longer\n being used by the user.

\n","group":"repository"},"git_repository_odb":{"type":"function","file":"repository.h","line":450,"lineto":450,"args":[{"name":"out","type":"git_odb **","comment":"Pointer to store the loaded ODB"},{"name":"repo","type":"git_repository *","comment":"A repository object"}],"argline":"git_odb **out, git_repository *repo","sig":"git_odb **::git_repository *","return":{"type":"int","comment":" 0, or an error code"},"description":"

Get the Object Database for this repository.

\n","comments":"

If a custom ODB has not been set, the default\n database for the repository will be returned (the one\n located in .git/objects).

\n\n

The ODB must be freed once it's no longer being used by\n the user.

\n","group":"repository","examples":{"cat-file.c":["ex/v0.23.0/cat-file.html#git_repository_odb-33"],"general.c":["ex/v0.23.0/general.html#git_repository_odb-60"]}},"git_repository_refdb":{"type":"function","file":"repository.h","line":466,"lineto":466,"args":[{"name":"out","type":"git_refdb **","comment":"Pointer to store the loaded refdb"},{"name":"repo","type":"git_repository *","comment":"A repository object"}],"argline":"git_refdb **out, git_repository *repo","sig":"git_refdb **::git_repository *","return":{"type":"int","comment":" 0, or an error code"},"description":"

Get the Reference Database Backend for this repository.

\n","comments":"

If a custom refsdb has not been set, the default database for\n the repository will be returned (the one that manipulates loose\n and packed references in the .git directory).

\n\n

The refdb must be freed once it's no longer being used by\n the user.

\n","group":"repository"},"git_repository_index":{"type":"function","file":"repository.h","line":482,"lineto":482,"args":[{"name":"out","type":"git_index **","comment":"Pointer to store the loaded index"},{"name":"repo","type":"git_repository *","comment":"A repository object"}],"argline":"git_index **out, git_repository *repo","sig":"git_index **::git_repository *","return":{"type":"int","comment":" 0, or an error code"},"description":"

Get the Index file for this repository.

\n","comments":"

If a custom index has not been set, the default\n index for the repository will be returned (the one\n located in .git/index).

\n\n

The index must be freed once it's no longer being used by\n the user.

\n","group":"repository","examples":{"general.c":["ex/v0.23.0/general.html#git_repository_index-61"],"init.c":["ex/v0.23.0/init.html#git_repository_index-11"]}},"git_repository_message":{"type":"function","file":"repository.h","line":500,"lineto":500,"args":[{"name":"out","type":"git_buf *","comment":"git_buf to write data into"},{"name":"repo","type":"git_repository *","comment":"Repository to read prepared message from"}],"argline":"git_buf *out, git_repository *repo","sig":"git_buf *::git_repository *","return":{"type":"int","comment":" 0, GIT_ENOTFOUND if no message exists or an error code"},"description":"

Retrieve git's prepared message

\n","comments":"

Operations such as git revert/cherry-pick/merge with the -n option\n stop just short of creating a commit with the changes and save\n their prepared message in .git/MERGE_MSG so the next git-commit\n execution can present it to the user for them to amend if they\n wish.

\n\n

Use this function to get the contents of this file. Don't forget to\n remove the file after you create the commit.

\n","group":"repository"},"git_repository_message_remove":{"type":"function","file":"repository.h","line":507,"lineto":507,"args":[{"name":"repo","type":"git_repository *","comment":null}],"argline":"git_repository *repo","sig":"git_repository *","return":{"type":"int","comment":null},"description":"

Remove git's prepared message.

\n","comments":"

Remove the message that git_repository_message retrieves.

\n","group":"repository"},"git_repository_state_cleanup":{"type":"function","file":"repository.h","line":516,"lineto":516,"args":[{"name":"repo","type":"git_repository *","comment":"A repository object"}],"argline":"git_repository *repo","sig":"git_repository *","return":{"type":"int","comment":" 0 on success, or error"},"description":"

Remove all the metadata associated with an ongoing command like merge,\n revert, cherry-pick, etc. For example: MERGE_HEAD, MERGE_MSG, etc.

\n","comments":"","group":"repository"},"git_repository_fetchhead_foreach":{"type":"function","file":"repository.h","line":535,"lineto":538,"args":[{"name":"repo","type":"git_repository *","comment":"A repository object"},{"name":"callback","type":"git_repository_fetchhead_foreach_cb","comment":"Callback function"},{"name":"payload","type":"void *","comment":"Pointer to callback data (optional)"}],"argline":"git_repository *repo, git_repository_fetchhead_foreach_cb callback, void *payload","sig":"git_repository *::git_repository_fetchhead_foreach_cb::void *","return":{"type":"int","comment":" 0 on success, non-zero callback return value, GIT_ENOTFOUND if\n there is no FETCH_HEAD file, or other error code."},"description":"

Invoke 'callback' for each entry in the given FETCH_HEAD file.

\n","comments":"

Return a non-zero value from the callback to stop the loop.

\n","group":"repository"},"git_repository_mergehead_foreach":{"type":"function","file":"repository.h","line":555,"lineto":558,"args":[{"name":"repo","type":"git_repository *","comment":"A repository object"},{"name":"callback","type":"git_repository_mergehead_foreach_cb","comment":"Callback function"},{"name":"payload","type":"void *","comment":"Pointer to callback data (optional)"}],"argline":"git_repository *repo, git_repository_mergehead_foreach_cb callback, void *payload","sig":"git_repository *::git_repository_mergehead_foreach_cb::void *","return":{"type":"int","comment":" 0 on success, non-zero callback return value, GIT_ENOTFOUND if\n there is no MERGE_HEAD file, or other error code."},"description":"

If a merge is in progress, invoke 'callback' for each commit ID in the\n MERGE_HEAD file.

\n","comments":"

Return a non-zero value from the callback to stop the loop.

\n","group":"repository"},"git_repository_hashfile":{"type":"function","file":"repository.h","line":583,"lineto":588,"args":[{"name":"out","type":"git_oid *","comment":"Output value of calculated SHA"},{"name":"repo","type":"git_repository *","comment":"Repository pointer"},{"name":"path","type":"const char *","comment":"Path to file on disk whose contents should be hashed. If the\n repository is not NULL, this can be a relative path."},{"name":"type","type":"git_otype","comment":"The object type to hash as (e.g. GIT_OBJ_BLOB)"},{"name":"as_path","type":"const char *","comment":"The path to use to look up filtering rules. If this is\n NULL, then the `path` parameter will be used instead. If\n this is passed as the empty string, then no filters will be\n applied when calculating the hash."}],"argline":"git_oid *out, git_repository *repo, const char *path, git_otype type, const char *as_path","sig":"git_oid *::git_repository *::const char *::git_otype::const char *","return":{"type":"int","comment":" 0 on success, or an error code"},"description":"

Calculate hash of file using repository filtering rules.

\n","comments":"

If you simply want to calculate the hash of a file on disk with no filters,\n you can just use the git_odb_hashfile() API. However, if you want to\n hash a file in the repository and you want to apply filtering rules (e.g.\n crlf filters) before generating the SHA, then use this function.

\n\n

Note: if the repository has core.safecrlf set to fail and the\n filtering triggers that failure, then this function will return an\n error and not calculate the hash of the file.

\n","group":"repository"},"git_repository_set_head":{"type":"function","file":"repository.h","line":608,"lineto":610,"args":[{"name":"repo","type":"git_repository *","comment":"Repository pointer"},{"name":"refname","type":"const char *","comment":"Canonical name of the reference the HEAD should point at"}],"argline":"git_repository *repo, const char *refname","sig":"git_repository *::const char *","return":{"type":"int","comment":" 0 on success, or an error code"},"description":"

Make the repository HEAD point to the specified reference.

\n","comments":"

If the provided reference points to a Tree or a Blob, the HEAD is\n unaltered and -1 is returned.

\n\n

If the provided reference points to a branch, the HEAD will point\n to that branch, staying attached, or become attached if it isn't yet.\n If the branch doesn't exist yet, no error will be return. The HEAD\n will then be attached to an unborn branch.

\n\n

Otherwise, the HEAD will be detached and will directly point to\n the Commit.

\n","group":"repository"},"git_repository_set_head_detached":{"type":"function","file":"repository.h","line":628,"lineto":630,"args":[{"name":"repo","type":"git_repository *","comment":"Repository pointer"},{"name":"commitish","type":"const git_oid *","comment":"Object id of the Commit the HEAD should point to"}],"argline":"git_repository *repo, const git_oid *commitish","sig":"git_repository *::const git_oid *","return":{"type":"int","comment":" 0 on success, or an error code"},"description":"

Make the repository HEAD directly point to the Commit.

\n","comments":"

If the provided committish cannot be found in the repository, the HEAD\n is unaltered and GIT_ENOTFOUND is returned.

\n\n

If the provided commitish cannot be peeled into a commit, the HEAD\n is unaltered and -1 is returned.

\n\n

Otherwise, the HEAD will eventually be detached and will directly point to\n the peeled Commit.

\n","group":"repository"},"git_repository_set_head_detached_from_annotated":{"type":"function","file":"repository.h","line":644,"lineto":646,"args":[{"name":"repo","type":"git_repository *","comment":null},{"name":"commitish","type":"const git_annotated_commit *","comment":null}],"argline":"git_repository *repo, const git_annotated_commit *commitish","sig":"git_repository *::const git_annotated_commit *","return":{"type":"int","comment":null},"description":"

Make the repository HEAD directly point to the Commit.

\n","comments":"

This behaves like git_repository_set_head_detached() but takes an\n annotated commit, which lets you specify which extended sha syntax\n string was specified by a user, allowing for more exact reflog\n messages.

\n\n

See the documentation for git_repository_set_head_detached().

\n","group":"repository"},"git_repository_detach_head":{"type":"function","file":"repository.h","line":665,"lineto":666,"args":[{"name":"repo","type":"git_repository *","comment":"Repository pointer"}],"argline":"git_repository *repo","sig":"git_repository *","return":{"type":"int","comment":" 0 on success, GIT_EUNBORNBRANCH when HEAD points to a non existing\n branch or an error code"},"description":"

Detach the HEAD.

\n","comments":"

If the HEAD is already detached and points to a Commit, 0 is returned.

\n\n

If the HEAD is already detached and points to a Tag, the HEAD is\n updated into making it point to the peeled Commit, and 0 is returned.

\n\n

If the HEAD is already detached and points to a non commitish, the HEAD is\n unaltered, and -1 is returned.

\n\n

Otherwise, the HEAD will be detached and point to the peeled Commit.

\n","group":"repository"},"git_repository_state":{"type":"function","file":"repository.h","line":694,"lineto":694,"args":[{"name":"repo","type":"git_repository *","comment":"Repository pointer"}],"argline":"git_repository *repo","sig":"git_repository *","return":{"type":"int","comment":" The state of the repository"},"description":"

Determines the status of a git repository - ie, whether an operation\n (merge, cherry-pick, etc) is in progress.

\n","comments":"","group":"repository"},"git_repository_set_namespace":{"type":"function","file":"repository.h","line":708,"lineto":708,"args":[{"name":"repo","type":"git_repository *","comment":"The repo"},{"name":"nmspace","type":"const char *","comment":"The namespace. This should not include the refs\n\tfolder, e.g. to namespace all references under `refs/namespaces/foo/`,\n\tuse `foo` as the namespace."}],"argline":"git_repository *repo, const char *nmspace","sig":"git_repository *::const char *","return":{"type":"int","comment":" 0 on success, -1 on error"},"description":"

Sets the active namespace for this Git Repository

\n","comments":"

This namespace affects all reference operations for the repo.\n See man gitnamespaces

\n","group":"repository"},"git_repository_get_namespace":{"type":"function","file":"repository.h","line":716,"lineto":716,"args":[{"name":"repo","type":"git_repository *","comment":"The repo"}],"argline":"git_repository *repo","sig":"git_repository *","return":{"type":"const char *","comment":" the active namespace, or NULL if there isn't one"},"description":"

Get the currently active namespace for this repository

\n","comments":"","group":"repository"},"git_repository_is_shallow":{"type":"function","file":"repository.h","line":725,"lineto":725,"args":[{"name":"repo","type":"git_repository *","comment":"The repository"}],"argline":"git_repository *repo","sig":"git_repository *","return":{"type":"int","comment":" 1 if shallow, zero if not"},"description":"

Determine if the repository was a shallow clone

\n","comments":"","group":"repository"},"git_repository_ident":{"type":"function","file":"repository.h","line":737,"lineto":737,"args":[{"name":"name","type":"const char **","comment":"where to store the pointer to the name"},{"name":"email","type":"const char **","comment":"where to store the pointer to the email"},{"name":"repo","type":"const git_repository *","comment":"the repository"}],"argline":"const char **name, const char **email, const git_repository *repo","sig":"const char **::const char **::const git_repository *","return":{"type":"int","comment":null},"description":"

Retrieve the configured identity to use for reflogs

\n","comments":"

The memory is owned by the repository and must not be freed by the\n user.

\n","group":"repository"},"git_repository_set_ident":{"type":"function","file":"repository.h","line":750,"lineto":750,"args":[{"name":"repo","type":"git_repository *","comment":"the repository to configure"},{"name":"name","type":"const char *","comment":"the email to use for the reflog entries"},{"name":"email","type":"const char *","comment":null}],"argline":"git_repository *repo, const char *name, const char *email","sig":"git_repository *::const char *::const char *","return":{"type":"int","comment":null},"description":"

Set the identity to be used for writing reflogs

\n","comments":"

If both are set, this name and email will be used to write to the\n reflog. Pass NULL to unset. When unset, the identity will be taken\n from the repository's configuration.

\n","group":"repository"},"git_reset":{"type":"function","file":"reset.h","line":62,"lineto":66,"args":[{"name":"repo","type":"git_repository *","comment":"Repository where to perform the reset operation."},{"name":"target","type":"git_object *","comment":"Committish to which the Head should be moved to. This object\n must belong to the given `repo` and can either be a git_commit or a\n git_tag. When a git_tag is being passed, it should be dereferencable\n to a git_commit which oid will be used as the target of the branch."},{"name":"reset_type","type":"git_reset_t","comment":"Kind of reset operation to perform."},{"name":"checkout_opts","type":"const git_checkout_options *","comment":"Checkout options to be used for a HARD reset.\n The checkout_strategy field will be overridden (based on reset_type).\n This parameter can be used to propagate notify and progress callbacks."}],"argline":"git_repository *repo, git_object *target, git_reset_t reset_type, const git_checkout_options *checkout_opts","sig":"git_repository *::git_object *::git_reset_t::const git_checkout_options *","return":{"type":"int","comment":" 0 on success or an error code"},"description":"

Sets the current head to the specified commit oid and optionally\n resets the index and working tree to match.

\n","comments":"

SOFT reset means the Head will be moved to the commit.

\n\n

MIXED reset will trigger a SOFT reset, plus the index will be replaced\n with the content of the commit tree.

\n\n

HARD reset will trigger a MIXED reset and the working directory will be\n replaced with the content of the index. (Untracked and ignored files\n will be left alone, however.)

\n\n

TODO: Implement remaining kinds of resets.

\n","group":"reset"},"git_reset_from_annotated":{"type":"function","file":"reset.h","line":80,"lineto":84,"args":[{"name":"repo","type":"git_repository *","comment":null},{"name":"commit","type":"git_annotated_commit *","comment":null},{"name":"reset_type","type":"git_reset_t","comment":null},{"name":"checkout_opts","type":"const git_checkout_options *","comment":null}],"argline":"git_repository *repo, git_annotated_commit *commit, git_reset_t reset_type, const git_checkout_options *checkout_opts","sig":"git_repository *::git_annotated_commit *::git_reset_t::const git_checkout_options *","return":{"type":"int","comment":null},"description":"

Sets the current head to the specified commit oid and optionally\n resets the index and working tree to match.

\n","comments":"

This behaves like git_reset() but takes an annotated commit,\n which lets you specify which extended sha syntax string was\n specified by a user, allowing for more exact reflog messages.

\n\n

See the documentation for git_reset().

\n","group":"reset"},"git_reset_default":{"type":"function","file":"reset.h","line":104,"lineto":107,"args":[{"name":"repo","type":"git_repository *","comment":"Repository where to perform the reset operation."},{"name":"target","type":"git_object *","comment":"The committish which content will be used to reset the content\n of the index."},{"name":"pathspecs","type":"git_strarray *","comment":"List of pathspecs to operate on."}],"argline":"git_repository *repo, git_object *target, git_strarray *pathspecs","sig":"git_repository *::git_object *::git_strarray *","return":{"type":"int","comment":" 0 on success or an error code \n<\n 0"},"description":"

Updates some entries in the index from the target commit tree.

\n","comments":"

The scope of the updated entries is determined by the paths\n being passed in the pathspec parameters.

\n\n

Passing a NULL target will result in removing\n entries in the index matching the provided pathspecs.

\n","group":"reset"},"git_revert_init_options":{"type":"function","file":"revert.h","line":47,"lineto":49,"args":[{"name":"opts","type":"git_revert_options *","comment":"the `git_revert_options` struct to initialize"},{"name":"version","type":"unsigned int","comment":"Version of struct; pass `GIT_REVERT_OPTIONS_VERSION`"}],"argline":"git_revert_options *opts, unsigned int version","sig":"git_revert_options *::unsigned int","return":{"type":"int","comment":" Zero on success; -1 on failure."},"description":"

Initializes a git_revert_options with default values. Equivalent to\n creating an instance with GIT_REVERT_OPTIONS_INIT.

\n","comments":"","group":"revert"},"git_revert_commit":{"type":"function","file":"revert.h","line":65,"lineto":71,"args":[{"name":"out","type":"git_index **","comment":"pointer to store the index result in"},{"name":"repo","type":"git_repository *","comment":"the repository that contains the given commits"},{"name":"revert_commit","type":"git_commit *","comment":"the commit to revert"},{"name":"our_commit","type":"git_commit *","comment":"the commit to revert against (eg, HEAD)"},{"name":"mainline","type":"unsigned int","comment":"the parent of the revert commit, if it is a merge"},{"name":"merge_options","type":"const git_merge_options *","comment":"the merge options (or null for defaults)"}],"argline":"git_index **out, git_repository *repo, git_commit *revert_commit, git_commit *our_commit, unsigned int mainline, const git_merge_options *merge_options","sig":"git_index **::git_repository *::git_commit *::git_commit *::unsigned int::const git_merge_options *","return":{"type":"int","comment":" zero on success, -1 on failure."},"description":"

Reverts the given commit against the given "our" commit, producing an\n index that reflects the result of the revert.

\n","comments":"

The returned index must be freed explicitly with git_index_free.

\n","group":"revert"},"git_revert":{"type":"function","file":"revert.h","line":81,"lineto":84,"args":[{"name":"repo","type":"git_repository *","comment":"the repository to revert"},{"name":"commit","type":"git_commit *","comment":"the commit to revert"},{"name":"given_opts","type":"const git_revert_options *","comment":"merge flags"}],"argline":"git_repository *repo, git_commit *commit, const git_revert_options *given_opts","sig":"git_repository *::git_commit *::const git_revert_options *","return":{"type":"int","comment":" zero on success, -1 on failure."},"description":"

Reverts the given commit, producing changes in the index and working directory.

\n","comments":"","group":"revert"},"git_revparse_single":{"type":"function","file":"revparse.h","line":37,"lineto":38,"args":[{"name":"out","type":"git_object **","comment":"pointer to output object"},{"name":"repo","type":"git_repository *","comment":"the repository to search in"},{"name":"spec","type":"const char *","comment":"the textual specification for an object"}],"argline":"git_object **out, git_repository *repo, const char *spec","sig":"git_object **::git_repository *::const char *","return":{"type":"int","comment":" 0 on success, GIT_ENOTFOUND, GIT_EAMBIGUOUS, GIT_EINVALIDSPEC or an error code"},"description":"

Find a single object, as specified by a revision string.

\n","comments":"

See man gitrevisions, or\n http://git-scm.com/docs/git-rev-parse.html#_specifying_revisions for\n information on the syntax accepted.

\n\n

The returned object should be released with git_object_free when no\n longer needed.

\n","group":"revparse","examples":{"blame.c":["ex/v0.23.0/blame.html#git_revparse_single-26"],"cat-file.c":["ex/v0.23.0/cat-file.html#git_revparse_single-34"],"describe.c":["ex/v0.23.0/describe.html#git_revparse_single-8"],"log.c":["ex/v0.23.0/log.html#git_revparse_single-47"],"tag.c":["ex/v0.23.0/tag.html#git_revparse_single-13","ex/v0.23.0/tag.html#git_revparse_single-14","ex/v0.23.0/tag.html#git_revparse_single-15","ex/v0.23.0/tag.html#git_revparse_single-16"]}},"git_revparse_ext":{"type":"function","file":"revparse.h","line":61,"lineto":65,"args":[{"name":"object_out","type":"git_object **","comment":"pointer to output object"},{"name":"reference_out","type":"git_reference **","comment":"pointer to output reference or NULL"},{"name":"repo","type":"git_repository *","comment":"the repository to search in"},{"name":"spec","type":"const char *","comment":"the textual specification for an object"}],"argline":"git_object **object_out, git_reference **reference_out, git_repository *repo, const char *spec","sig":"git_object **::git_reference **::git_repository *::const char *","return":{"type":"int","comment":" 0 on success, GIT_ENOTFOUND, GIT_EAMBIGUOUS, GIT_EINVALIDSPEC\n or an error code"},"description":"

Find a single object and intermediate reference by a revision string.

\n","comments":"

See man gitrevisions, or\n http://git-scm.com/docs/git-rev-parse.html#_specifying_revisions for\n information on the syntax accepted.

\n\n

In some cases (\n@\n{\n<\n-n>} or `\n<branchname

\n\n
\n

@\n{upstream}), the expression may\n point to an intermediate reference. When such expressions are being passed\n in,reference_out` will be valued as well.

\n
\n\n

The returned object should be released with git_object_free and the\n returned reference with git_reference_free when no longer needed.

\n","group":"revparse"},"git_revparse":{"type":"function","file":"revparse.h","line":105,"lineto":108,"args":[{"name":"revspec","type":"git_revspec *","comment":"Pointer to an user-allocated git_revspec struct where\n\t the result of the rev-parse will be stored"},{"name":"repo","type":"git_repository *","comment":"the repository to search in"},{"name":"spec","type":"const char *","comment":"the rev-parse spec to parse"}],"argline":"git_revspec *revspec, git_repository *repo, const char *spec","sig":"git_revspec *::git_repository *::const char *","return":{"type":"int","comment":" 0 on success, GIT_INVALIDSPEC, GIT_ENOTFOUND, GIT_EAMBIGUOUS or an error code"},"description":"

Parse a revision string for from, to, and intent.

\n","comments":"

See man gitrevisions or\n http://git-scm.com/docs/git-rev-parse.html#_specifying_revisions for\n information on the syntax accepted.

\n","group":"revparse","examples":{"blame.c":["ex/v0.23.0/blame.html#git_revparse-27"],"log.c":["ex/v0.23.0/log.html#git_revparse-48"],"rev-parse.c":["ex/v0.23.0/rev-parse.html#git_revparse-18","ex/v0.23.0/rev-parse.html#git_revparse-19"]}},"git_revwalk_new":{"type":"function","file":"revwalk.h","line":75,"lineto":75,"args":[{"name":"out","type":"git_revwalk **","comment":"pointer to the new revision walker"},{"name":"repo","type":"git_repository *","comment":"the repo to walk through"}],"argline":"git_revwalk **out, git_repository *repo","sig":"git_revwalk **::git_repository *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Allocate a new revision walker to iterate through a repo.

\n","comments":"

This revision walker uses a custom memory pool and an internal\n commit cache, so it is relatively expensive to allocate.

\n\n

For maximum performance, this revision walker should be\n reused for different walks.

\n\n

This revision walker is not thread safe: it may only be\n used to walk a repository on a single thread; however,\n it is possible to have several revision walkers in\n several different threads walking the same repository.

\n","group":"revwalk","examples":{"general.c":["ex/v0.23.0/general.html#git_revwalk_new-62"],"log.c":["ex/v0.23.0/log.html#git_revwalk_new-49","ex/v0.23.0/log.html#git_revwalk_new-50"]}},"git_revwalk_reset":{"type":"function","file":"revwalk.h","line":90,"lineto":90,"args":[{"name":"walker","type":"git_revwalk *","comment":"handle to reset."}],"argline":"git_revwalk *walker","sig":"git_revwalk *","return":{"type":"void","comment":null},"description":"

Reset the revision walker for reuse.

\n","comments":"

This will clear all the pushed and hidden commits, and\n leave the walker in a blank state (just like at\n creation) ready to receive new commit pushes and\n start a new walk.

\n\n

The revision walk is automatically reset when a walk\n is over.

\n","group":"revwalk"},"git_revwalk_push":{"type":"function","file":"revwalk.h","line":109,"lineto":109,"args":[{"name":"walk","type":"git_revwalk *","comment":"the walker being used for the traversal."},{"name":"id","type":"const git_oid *","comment":"the oid of the commit to start from."}],"argline":"git_revwalk *walk, const git_oid *id","sig":"git_revwalk *::const git_oid *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Add a new root for the traversal

\n","comments":"

The pushed commit will be marked as one of the roots from which to\n start the walk. This commit may not be walked if it or a child is\n hidden.

\n\n

At least one commit must be pushed onto the walker before a walk\n can be started.

\n\n

The given id must belong to a committish on the walked\n repository.

\n","group":"revwalk","examples":{"general.c":["ex/v0.23.0/general.html#git_revwalk_push-63"],"log.c":["ex/v0.23.0/log.html#git_revwalk_push-51"]}},"git_revwalk_push_glob":{"type":"function","file":"revwalk.h","line":127,"lineto":127,"args":[{"name":"walk","type":"git_revwalk *","comment":"the walker being used for the traversal"},{"name":"glob","type":"const char *","comment":"the glob pattern references should match"}],"argline":"git_revwalk *walk, const char *glob","sig":"git_revwalk *::const char *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Push matching references

\n","comments":"

The OIDs pointed to by the references that match the given glob\n pattern will be pushed to the revision walker.

\n\n

A leading 'refs/' is implied if not present as well as a trailing\n '/\n\\\n*' if the glob lacks '?', '\n\\\n*' or '['.

\n\n

Any references matching this glob which do not point to a\n committish will be ignored.

\n","group":"revwalk"},"git_revwalk_push_head":{"type":"function","file":"revwalk.h","line":135,"lineto":135,"args":[{"name":"walk","type":"git_revwalk *","comment":"the walker being used for the traversal"}],"argline":"git_revwalk *walk","sig":"git_revwalk *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Push the repository's HEAD

\n","comments":"","group":"revwalk","examples":{"log.c":["ex/v0.23.0/log.html#git_revwalk_push_head-52"]}},"git_revwalk_hide":{"type":"function","file":"revwalk.h","line":150,"lineto":150,"args":[{"name":"walk","type":"git_revwalk *","comment":"the walker being used for the traversal."},{"name":"commit_id","type":"const git_oid *","comment":"the oid of commit that will be ignored during the traversal"}],"argline":"git_revwalk *walk, const git_oid *commit_id","sig":"git_revwalk *::const git_oid *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Mark a commit (and its ancestors) uninteresting for the output.

\n","comments":"

The given id must belong to a committish on the walked\n repository.

\n\n

The resolved commit and all its parents will be hidden from the\n output on the revision walk.

\n","group":"revwalk","examples":{"log.c":["ex/v0.23.0/log.html#git_revwalk_hide-53"]}},"git_revwalk_hide_glob":{"type":"function","file":"revwalk.h","line":169,"lineto":169,"args":[{"name":"walk","type":"git_revwalk *","comment":"the walker being used for the traversal"},{"name":"glob","type":"const char *","comment":"the glob pattern references should match"}],"argline":"git_revwalk *walk, const char *glob","sig":"git_revwalk *::const char *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Hide matching references.

\n","comments":"

The OIDs pointed to by the references that match the given glob\n pattern and their ancestors will be hidden from the output on the\n revision walk.

\n\n

A leading 'refs/' is implied if not present as well as a trailing\n '/\n\\\n*' if the glob lacks '?', '\n\\\n*' or '['.

\n\n

Any references matching this glob which do not point to a\n committish will be ignored.

\n","group":"revwalk"},"git_revwalk_hide_head":{"type":"function","file":"revwalk.h","line":177,"lineto":177,"args":[{"name":"walk","type":"git_revwalk *","comment":"the walker being used for the traversal"}],"argline":"git_revwalk *walk","sig":"git_revwalk *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Hide the repository's HEAD

\n","comments":"","group":"revwalk"},"git_revwalk_push_ref":{"type":"function","file":"revwalk.h","line":188,"lineto":188,"args":[{"name":"walk","type":"git_revwalk *","comment":"the walker being used for the traversal"},{"name":"refname","type":"const char *","comment":"the reference to push"}],"argline":"git_revwalk *walk, const char *refname","sig":"git_revwalk *::const char *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Push the OID pointed to by a reference

\n","comments":"

The reference must point to a committish.

\n","group":"revwalk"},"git_revwalk_hide_ref":{"type":"function","file":"revwalk.h","line":199,"lineto":199,"args":[{"name":"walk","type":"git_revwalk *","comment":"the walker being used for the traversal"},{"name":"refname","type":"const char *","comment":"the reference to hide"}],"argline":"git_revwalk *walk, const char *refname","sig":"git_revwalk *::const char *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Hide the OID pointed to by a reference

\n","comments":"

The reference must point to a committish.

\n","group":"revwalk"},"git_revwalk_next":{"type":"function","file":"revwalk.h","line":219,"lineto":219,"args":[{"name":"out","type":"git_oid *","comment":"Pointer where to store the oid of the next commit"},{"name":"walk","type":"git_revwalk *","comment":"the walker to pop the commit from."}],"argline":"git_oid *out, git_revwalk *walk","sig":"git_oid *::git_revwalk *","return":{"type":"int","comment":" 0 if the next commit was found;\n\tGIT_ITEROVER if there are no commits left to iterate"},"description":"

Get the next commit from the revision walk.

\n","comments":"

The initial call to this method is not blocking when\n iterating through a repo with a time-sorting mode.

\n\n

Iterating with Topological or inverted modes makes the initial\n call blocking to preprocess the commit list, but this block should be\n mostly unnoticeable on most repositories (topological preprocessing\n times at 0.3s on the git.git repo).

\n\n

The revision walker is reset when the walk is over.

\n","group":"revwalk","examples":{"general.c":["ex/v0.23.0/general.html#git_revwalk_next-64"],"log.c":["ex/v0.23.0/log.html#git_revwalk_next-54"]}},"git_revwalk_sorting":{"type":"function","file":"revwalk.h","line":230,"lineto":230,"args":[{"name":"walk","type":"git_revwalk *","comment":"the walker being used for the traversal."},{"name":"sort_mode","type":"unsigned int","comment":"combination of GIT_SORT_XXX flags"}],"argline":"git_revwalk *walk, unsigned int sort_mode","sig":"git_revwalk *::unsigned int","return":{"type":"void","comment":null},"description":"

Change the sorting mode when iterating through the\n repository's contents.

\n","comments":"

Changing the sorting mode resets the walker.

\n","group":"revwalk","examples":{"general.c":["ex/v0.23.0/general.html#git_revwalk_sorting-65"],"log.c":["ex/v0.23.0/log.html#git_revwalk_sorting-55","ex/v0.23.0/log.html#git_revwalk_sorting-56"]}},"git_revwalk_push_range":{"type":"function","file":"revwalk.h","line":245,"lineto":245,"args":[{"name":"walk","type":"git_revwalk *","comment":"the walker being used for the traversal"},{"name":"range","type":"const char *","comment":"the range"}],"argline":"git_revwalk *walk, const char *range","sig":"git_revwalk *::const char *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Push and hide the respective endpoints of the given range.

\n","comments":"

The range should be of the form

\n\n

<commit

\n\n
\n

..\n<commit

\n\n

where each \n<commit\nis in the form accepted by 'git_revparse_single'.\n The left-hand commit will be hidden and the right-hand commit pushed.

\n
\n","group":"revwalk"},"git_revwalk_simplify_first_parent":{"type":"function","file":"revwalk.h","line":252,"lineto":252,"args":[{"name":"walk","type":"git_revwalk *","comment":null}],"argline":"git_revwalk *walk","sig":"git_revwalk *","return":{"type":"void","comment":null},"description":"

Simplify the history by first-parent

\n","comments":"

No parents other than the first for each commit will be enqueued.

\n","group":"revwalk"},"git_revwalk_free":{"type":"function","file":"revwalk.h","line":260,"lineto":260,"args":[{"name":"walk","type":"git_revwalk *","comment":"traversal handle to close. If NULL nothing occurs."}],"argline":"git_revwalk *walk","sig":"git_revwalk *","return":{"type":"void","comment":null},"description":"

Free a revision walker previously allocated.

\n","comments":"","group":"revwalk","examples":{"general.c":["ex/v0.23.0/general.html#git_revwalk_free-66"],"log.c":["ex/v0.23.0/log.html#git_revwalk_free-57"]}},"git_revwalk_repository":{"type":"function","file":"revwalk.h","line":269,"lineto":269,"args":[{"name":"walk","type":"git_revwalk *","comment":"the revision walker"}],"argline":"git_revwalk *walk","sig":"git_revwalk *","return":{"type":"git_repository *","comment":" the repository being walked"},"description":"

Return the repository on which this walker\n is operating.

\n","comments":"","group":"revwalk"},"git_revwalk_add_hide_cb":{"type":"function","file":"revwalk.h","line":290,"lineto":293,"args":[{"name":"walk","type":"git_revwalk *","comment":"the revision walker"},{"name":"hide_cb","type":"git_revwalk_hide_cb","comment":"callback function to hide a commit and its parents"},{"name":"payload","type":"void *","comment":"data payload to be passed to callback function"}],"argline":"git_revwalk *walk, git_revwalk_hide_cb hide_cb, void *payload","sig":"git_revwalk *::git_revwalk_hide_cb::void *","return":{"type":"int","comment":null},"description":"

Adds a callback function to hide a commit and its parents

\n","comments":"","group":"revwalk"},"git_signature_new":{"type":"function","file":"signature.h","line":37,"lineto":37,"args":[{"name":"out","type":"git_signature **","comment":"new signature, in case of error NULL"},{"name":"name","type":"const char *","comment":"name of the person"},{"name":"email","type":"const char *","comment":"email of the person"},{"name":"time","type":"git_time_t","comment":"time when the action happened"},{"name":"offset","type":"int","comment":"timezone offset in minutes for the time"}],"argline":"git_signature **out, const char *name, const char *email, git_time_t time, int offset","sig":"git_signature **::const char *::const char *::git_time_t::int","return":{"type":"int","comment":" 0 or an error code"},"description":"

Create a new action signature.

\n","comments":"

Call git_signature_free() to free the data.

\n\n

Note: angle brackets ('\n<\n' and '>') characters are not allowed\n to be used in either the name or the email parameter.

\n","group":"signature","examples":{"general.c":["ex/v0.23.0/general.html#git_signature_new-67","ex/v0.23.0/general.html#git_signature_new-68"]}},"git_signature_now":{"type":"function","file":"signature.h","line":49,"lineto":49,"args":[{"name":"out","type":"git_signature **","comment":"new signature, in case of error NULL"},{"name":"name","type":"const char *","comment":"name of the person"},{"name":"email","type":"const char *","comment":"email of the person"}],"argline":"git_signature **out, const char *name, const char *email","sig":"git_signature **::const char *::const char *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Create a new action signature with a timestamp of 'now'.

\n","comments":"

Call git_signature_free() to free the data.

\n","group":"signature"},"git_signature_default":{"type":"function","file":"signature.h","line":63,"lineto":63,"args":[{"name":"out","type":"git_signature **","comment":"new signature"},{"name":"repo","type":"git_repository *","comment":"repository pointer"}],"argline":"git_signature **out, git_repository *repo","sig":"git_signature **::git_repository *","return":{"type":"int","comment":" 0 on success, GIT_ENOTFOUND if config is missing, or error code"},"description":"

Create a new action signature with default user and now timestamp.

\n","comments":"

This looks up the user.name and user.email from the configuration and\n uses the current time as the timestamp, and creates a new signature\n based on that information. It will return GIT_ENOTFOUND if either the\n user.name or user.email are not set.

\n","group":"signature","examples":{"init.c":["ex/v0.23.0/init.html#git_signature_default-12"],"tag.c":["ex/v0.23.0/tag.html#git_signature_default-17"]}},"git_signature_dup":{"type":"function","file":"signature.h","line":75,"lineto":75,"args":[{"name":"dest","type":"git_signature **","comment":"pointer where to store the copy"},{"name":"sig","type":"const git_signature *","comment":"signature to duplicate"}],"argline":"git_signature **dest, const git_signature *sig","sig":"git_signature **::const git_signature *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Create a copy of an existing signature. All internal strings are also\n duplicated.

\n","comments":"

Call git_signature_free() to free the data.

\n","group":"signature"},"git_signature_free":{"type":"function","file":"signature.h","line":86,"lineto":86,"args":[{"name":"sig","type":"git_signature *","comment":"signature to free"}],"argline":"git_signature *sig","sig":"git_signature *","return":{"type":"void","comment":null},"description":"

Free an existing signature.

\n","comments":"

Because the signature is not an opaque structure, it is legal to free it\n manually, but be sure to free the "name" and "email" strings in addition\n to the structure itself.

\n","group":"signature","examples":{"init.c":["ex/v0.23.0/init.html#git_signature_free-13"],"tag.c":["ex/v0.23.0/tag.html#git_signature_free-18"]}},"git_stash_apply_init_options":{"type":"function","file":"stash.h","line":153,"lineto":154,"args":[{"name":"opts","type":"git_stash_apply_options *","comment":"the `git_stash_apply_options` instance to initialize."},{"name":"version","type":"unsigned int","comment":"the version of the struct; you should pass\n `GIT_STASH_APPLY_OPTIONS_INIT` here."}],"argline":"git_stash_apply_options *opts, unsigned int version","sig":"git_stash_apply_options *::unsigned int","return":{"type":"int","comment":" Zero on success; -1 on failure."},"description":"

Initializes a git_stash_apply_options with default values. Equivalent to\n creating an instance with GIT_STASH_APPLY_OPTIONS_INIT.

\n","comments":"","group":"stash"},"git_stash_apply":{"type":"function","file":"stash.h","line":182,"lineto":185,"args":[{"name":"repo","type":"git_repository *","comment":"The owning repository."},{"name":"index","type":"size_t","comment":"The position within the stash list. 0 points to the\n most recent stashed state."},{"name":"options","type":"const git_stash_apply_options *","comment":"Options to control how stashes are applied."}],"argline":"git_repository *repo, size_t index, const git_stash_apply_options *options","sig":"git_repository *::size_t::const git_stash_apply_options *","return":{"type":"int","comment":" 0 on success, GIT_ENOTFOUND if there's no stashed state for the\n given index, GIT_EMERGECONFLICT if changes exist in the working\n directory, or an error code"},"description":"

Apply a single stashed state from the stash list.

\n","comments":"

If local changes in the working directory conflict with changes in the\n stash then GIT_EMERGECONFLICT will be returned. In this case, the index\n will always remain unmodified and all files in the working directory will\n remain unmodified. However, if you are restoring untracked files or\n ignored files and there is a conflict when applying the modified files,\n then those files will remain in the working directory.

\n\n

If passing the GIT_STASH_APPLY_REINSTATE_INDEX flag and there would be\n conflicts when reinstating the index, the function will return\n GIT_EMERGECONFLICT and both the working directory and index will be left\n unmodified.

\n\n

Note that a minimum checkout strategy of GIT_CHECKOUT_SAFE is implied.

\n","group":"stash"},"git_stash_foreach":{"type":"function","file":"stash.h","line":218,"lineto":221,"args":[{"name":"repo","type":"git_repository *","comment":"Repository where to find the stash."},{"name":"callback","type":"git_stash_cb","comment":"Callback to invoke per found stashed state. The most\n recent stash state will be enumerated first."},{"name":"payload","type":"void *","comment":"Extra parameter to callback function."}],"argline":"git_repository *repo, git_stash_cb callback, void *payload","sig":"git_repository *::git_stash_cb::void *","return":{"type":"int","comment":" 0 on success, non-zero callback return value, or error code."},"description":"

Loop over all the stashed states and issue a callback for each one.

\n","comments":"

If the callback returns a non-zero value, this will stop looping.

\n","group":"stash"},"git_stash_drop":{"type":"function","file":"stash.h","line":234,"lineto":236,"args":[{"name":"repo","type":"git_repository *","comment":"The owning repository."},{"name":"index","type":"size_t","comment":"The position within the stash list. 0 points to the\n most recent stashed state."}],"argline":"git_repository *repo, size_t index","sig":"git_repository *::size_t","return":{"type":"int","comment":" 0 on success, GIT_ENOTFOUND if there's no stashed state for the given\n index, or error code."},"description":"

Remove a single stashed state from the stash list.

\n","comments":"","group":"stash"},"git_stash_pop":{"type":"function","file":"stash.h","line":250,"lineto":253,"args":[{"name":"repo","type":"git_repository *","comment":"The owning repository."},{"name":"index","type":"size_t","comment":"The position within the stash list. 0 points to the\n most recent stashed state."},{"name":"options","type":"const git_stash_apply_options *","comment":"Options to control how stashes are applied."}],"argline":"git_repository *repo, size_t index, const git_stash_apply_options *options","sig":"git_repository *::size_t::const git_stash_apply_options *","return":{"type":"int","comment":" 0 on success, GIT_ENOTFOUND if there's no stashed state for the given\n index, or error code. (see git_stash_apply() above for details)"},"description":"

Apply a single stashed state from the stash list and remove it from the list\n if successful.

\n","comments":"","group":"stash"},"git_status_init_options":{"type":"function","file":"status.h","line":195,"lineto":197,"args":[{"name":"opts","type":"git_status_options *","comment":"The `git_status_options` instance to initialize."},{"name":"version","type":"unsigned int","comment":"Version of struct; pass `GIT_STATUS_OPTIONS_VERSION`"}],"argline":"git_status_options *opts, unsigned int version","sig":"git_status_options *::unsigned int","return":{"type":"int","comment":" Zero on success; -1 on failure."},"description":"

Initializes a git_status_options with default values. Equivalent to\n creating an instance with GIT_STATUS_OPTIONS_INIT.

\n","comments":"","group":"status"},"git_status_foreach":{"type":"function","file":"status.h","line":235,"lineto":238,"args":[{"name":"repo","type":"git_repository *","comment":"A repository object"},{"name":"callback","type":"git_status_cb","comment":"The function to call on each file"},{"name":"payload","type":"void *","comment":"Pointer to pass through to callback function"}],"argline":"git_repository *repo, git_status_cb callback, void *payload","sig":"git_repository *::git_status_cb::void *","return":{"type":"int","comment":" 0 on success, non-zero callback return value, or error code"},"description":"

Gather file statuses and run a callback for each one.

\n","comments":"

The callback is passed the path of the file, the status (a combination of\n the git_status_t values above) and the payload data pointer passed\n into this function.

\n\n

If the callback returns a non-zero value, this function will stop looping\n and return that value to caller.

\n","group":"status","examples":{"status.c":["ex/v0.23.0/status.html#git_status_foreach-10"]}},"git_status_foreach_ext":{"type":"function","file":"status.h","line":259,"lineto":263,"args":[{"name":"repo","type":"git_repository *","comment":"Repository object"},{"name":"opts","type":"const git_status_options *","comment":"Status options structure"},{"name":"callback","type":"git_status_cb","comment":"The function to call on each file"},{"name":"payload","type":"void *","comment":"Pointer to pass through to callback function"}],"argline":"git_repository *repo, const git_status_options *opts, git_status_cb callback, void *payload","sig":"git_repository *::const git_status_options *::git_status_cb::void *","return":{"type":"int","comment":" 0 on success, non-zero callback return value, or error code"},"description":"

Gather file status information and run callbacks as requested.

\n","comments":"

This is an extended version of the git_status_foreach() API that\n allows for more granular control over which paths will be processed and\n in what order. See the git_status_options structure for details\n about the additional controls that this makes available.

\n\n

Note that if a pathspec is given in the git_status_options to filter\n the status, then the results from rename detection (if you enable it) may\n not be accurate. To do rename detection properly, this must be called\n with no pathspec so that all files can be considered.

\n","group":"status","examples":{"status.c":["ex/v0.23.0/status.html#git_status_foreach_ext-11"]}},"git_status_file":{"type":"function","file":"status.h","line":291,"lineto":294,"args":[{"name":"status_flags","type":"unsigned int *","comment":"Output combination of git_status_t values for file"},{"name":"repo","type":"git_repository *","comment":"A repository object"},{"name":"path","type":"const char *","comment":"The exact path to retrieve status for relative to the\n repository working directory"}],"argline":"unsigned int *status_flags, git_repository *repo, const char *path","sig":"unsigned int *::git_repository *::const char *","return":{"type":"int","comment":" 0 on success, GIT_ENOTFOUND if the file is not found in the HEAD,\n index, and work tree, GIT_EAMBIGUOUS if `path` matches multiple files\n or if it refers to a folder, and -1 on other errors."},"description":"

Get file status for a single file.

\n","comments":"

This tries to get status for the filename that you give. If no files\n match that name (in either the HEAD, index, or working directory), this\n returns GIT_ENOTFOUND.

\n\n

If the name matches multiple files (for example, if the path names a\n directory or if running on a case- insensitive filesystem and yet the\n HEAD has two entries that both match the path), then this returns\n GIT_EAMBIGUOUS because it cannot give correct results.

\n\n

This does not do any sort of rename detection. Renames require a set of\n targets and because of the path filtering, there is not enough\n information to check renames correctly. To check file status with rename\n detection, there is no choice but to do a full git_status_list_new and\n scan through looking for the path that you are interested in.

\n","group":"status"},"git_status_list_new":{"type":"function","file":"status.h","line":309,"lineto":312,"args":[{"name":"out","type":"git_status_list **","comment":"Pointer to store the status results in"},{"name":"repo","type":"git_repository *","comment":"Repository object"},{"name":"opts","type":"const git_status_options *","comment":"Status options structure"}],"argline":"git_status_list **out, git_repository *repo, const git_status_options *opts","sig":"git_status_list **::git_repository *::const git_status_options *","return":{"type":"int","comment":" 0 on success or error code"},"description":"

Gather file status information and populate the git_status_list.

\n","comments":"

Note that if a pathspec is given in the git_status_options to filter\n the status, then the results from rename detection (if you enable it) may\n not be accurate. To do rename detection properly, this must be called\n with no pathspec so that all files can be considered.

\n","group":"status","examples":{"status.c":["ex/v0.23.0/status.html#git_status_list_new-12","ex/v0.23.0/status.html#git_status_list_new-13"]}},"git_status_list_entrycount":{"type":"function","file":"status.h","line":323,"lineto":324,"args":[{"name":"statuslist","type":"git_status_list *","comment":"Existing status list object"}],"argline":"git_status_list *statuslist","sig":"git_status_list *","return":{"type":"size_t","comment":" the number of status entries"},"description":"

Gets the count of status entries in this list.

\n","comments":"

If there are no changes in status (at least according the options given\n when the status list was created), this can return 0.

\n","group":"status","examples":{"status.c":["ex/v0.23.0/status.html#git_status_list_entrycount-14","ex/v0.23.0/status.html#git_status_list_entrycount-15"]}},"git_status_byindex":{"type":"function","file":"status.h","line":335,"lineto":337,"args":[{"name":"statuslist","type":"git_status_list *","comment":"Existing status list object"},{"name":"idx","type":"size_t","comment":"Position of the entry"}],"argline":"git_status_list *statuslist, size_t idx","sig":"git_status_list *::size_t","return":{"type":"const git_status_entry *","comment":" Pointer to the entry; NULL if out of bounds"},"description":"

Get a pointer to one of the entries in the status list.

\n","comments":"

The entry is not modifiable and should not be freed.

\n","group":"status","examples":{"status.c":["ex/v0.23.0/status.html#git_status_byindex-16","ex/v0.23.0/status.html#git_status_byindex-17","ex/v0.23.0/status.html#git_status_byindex-18","ex/v0.23.0/status.html#git_status_byindex-19","ex/v0.23.0/status.html#git_status_byindex-20","ex/v0.23.0/status.html#git_status_byindex-21"]}},"git_status_list_free":{"type":"function","file":"status.h","line":344,"lineto":345,"args":[{"name":"statuslist","type":"git_status_list *","comment":"Existing status list object"}],"argline":"git_status_list *statuslist","sig":"git_status_list *","return":{"type":"void","comment":null},"description":"

Free an existing status list

\n","comments":"","group":"status","examples":{"status.c":["ex/v0.23.0/status.html#git_status_list_free-22"]}},"git_status_should_ignore":{"type":"function","file":"status.h","line":363,"lineto":366,"args":[{"name":"ignored","type":"int *","comment":"Boolean returning 0 if the file is not ignored, 1 if it is"},{"name":"repo","type":"git_repository *","comment":"A repository object"},{"name":"path","type":"const char *","comment":"The file to check ignores for, rooted at the repo's workdir."}],"argline":"int *ignored, git_repository *repo, const char *path","sig":"int *::git_repository *::const char *","return":{"type":"int","comment":" 0 if ignore rules could be processed for the file (regardless\n of whether it exists or not), or an error \n<\n 0 if they could not."},"description":"

Test if the ignore rules apply to a given file.

\n","comments":"

This function checks the ignore rules to see if they would apply to the\n given file. This indicates if the file would be ignored regardless of\n whether the file is already in the index or committed to the repository.

\n\n

One way to think of this is if you were to do "git add ." on the\n directory containing the file, would it be added or not?

\n","group":"status"},"git_strarray_free":{"type":"function","file":"strarray.h","line":41,"lineto":41,"args":[{"name":"array","type":"git_strarray *","comment":"git_strarray from which to free string data"}],"argline":"git_strarray *array","sig":"git_strarray *","return":{"type":"void","comment":null},"description":"

Close a string array object

\n","comments":"

This method should be called on git_strarray objects where the strings\n array is allocated and contains allocated strings, such as what you\n would get from git_strarray_copy(). Not doing so, will result in a\n memory leak.

\n\n

This does not free the git_strarray itself, since the library will\n never allocate that object directly itself (it is more commonly embedded\n inside another struct or created on the stack).

\n","group":"strarray","examples":{"general.c":["ex/v0.23.0/general.html#git_strarray_free-69"],"remote.c":["ex/v0.23.0/remote.html#git_strarray_free-16","ex/v0.23.0/remote.html#git_strarray_free-17"],"tag.c":["ex/v0.23.0/tag.html#git_strarray_free-19"]}},"git_strarray_copy":{"type":"function","file":"strarray.h","line":53,"lineto":53,"args":[{"name":"tgt","type":"git_strarray *","comment":"target"},{"name":"src","type":"const git_strarray *","comment":"source"}],"argline":"git_strarray *tgt, const git_strarray *src","sig":"git_strarray *::const git_strarray *","return":{"type":"int","comment":" 0 on success, \n<\n 0 on allocation failure"},"description":"

Copy a string array object from source to target.

\n","comments":"

Note: target is overwritten and hence should be empty, otherwise its\n contents are leaked. Call git_strarray_free() if necessary.

\n","group":"strarray"},"git_submodule_update_init_options":{"type":"function","file":"submodule.h","line":162,"lineto":163,"args":[{"name":"opts","type":"git_submodule_update_options *","comment":"The `git_submodule_update_options` instance to initialize."},{"name":"version","type":"unsigned int","comment":"Version of struct; pass `GIT_SUBMODULE_UPDATE_OPTIONS_VERSION`"}],"argline":"git_submodule_update_options *opts, unsigned int version","sig":"git_submodule_update_options *::unsigned int","return":{"type":"int","comment":" Zero on success; -1 on failure."},"description":"

Initializes a git_submodule_update_options with default values.\n Equivalent to creating an instance with GIT_SUBMODULE_UPDATE_OPTIONS_INIT.

\n","comments":"","group":"submodule"},"git_submodule_update":{"type":"function","file":"submodule.h","line":181,"lineto":181,"args":[{"name":"submodule","type":"git_submodule *","comment":"Submodule object"},{"name":"init","type":"int","comment":"If the submodule is not initialized, setting this flag to true\n will initialize the submodule before updating. Otherwise, this will\n return an error if attempting to update an uninitialzed repository.\n but setting this to true forces them to be updated."},{"name":"options","type":"git_submodule_update_options *","comment":"configuration options for the update. If NULL, the\n function works as though GIT_SUBMODULE_UPDATE_OPTIONS_INIT was passed."}],"argline":"git_submodule *submodule, int init, git_submodule_update_options *options","sig":"git_submodule *::int::git_submodule_update_options *","return":{"type":"int","comment":" 0 on success, any non-zero return value from a callback\n function, or a negative value to indicate an error (use\n `giterr_last` for a detailed error message)."},"description":"

Update a submodule. This will clone a missing submodule and\n checkout the subrepository to the commit specified in the index of\n containing repository.

\n","comments":"","group":"submodule"},"git_submodule_lookup":{"type":"function","file":"submodule.h","line":210,"lineto":213,"args":[{"name":"out","type":"git_submodule **","comment":"Output ptr to submodule; pass NULL to just get return code"},{"name":"repo","type":"git_repository *","comment":"The parent repository"},{"name":"name","type":"const char *","comment":"The name of or path to the submodule; trailing slashes okay"}],"argline":"git_submodule **out, git_repository *repo, const char *name","sig":"git_submodule **::git_repository *::const char *","return":{"type":"int","comment":" 0 on success, GIT_ENOTFOUND if submodule does not exist,\n GIT_EEXISTS if a repository is found in working directory only,\n -1 on other errors."},"description":"

Lookup submodule information by name or path.

\n","comments":"

Given either the submodule name or path (they are usually the same), this\n returns a structure describing the submodule.

\n\n

There are two expected error scenarios:

\n\n
    \n
  • The submodule is not mentioned in the HEAD, the index, and the config,\nbut does "exist" in the working directory (i.e. there is a subdirectory\nthat appears to be a Git repository). In this case, this function\nreturns GIT_EEXISTS to indicate a sub-repository exists but not in a\nstate where a git_submodule can be instantiated.
  • \n
  • The submodule is not mentioned in the HEAD, index, or config and the\nworking directory doesn't contain a value git repo at that path.\nThere may or may not be anything else at that path, but nothing that\nlooks like a submodule. In this case, this returns GIT_ENOTFOUND.
  • \n
\n\n

You must call git_submodule_free when done with the submodule.

\n","group":"submodule"},"git_submodule_free":{"type":"function","file":"submodule.h","line":220,"lineto":220,"args":[{"name":"submodule","type":"git_submodule *","comment":"Submodule object"}],"argline":"git_submodule *submodule","sig":"git_submodule *","return":{"type":"void","comment":null},"description":"

Release a submodule

\n","comments":"","group":"submodule"},"git_submodule_foreach":{"type":"function","file":"submodule.h","line":240,"lineto":243,"args":[{"name":"repo","type":"git_repository *","comment":"The repository"},{"name":"callback","type":"int (*)(git_submodule *, const char *, void *)","comment":"Function to be called with the name of each submodule.\n Return a non-zero value to terminate the iteration."},{"name":"payload","type":"void *","comment":"Extra data to pass to callback"}],"argline":"git_repository *repo, int (*)(git_submodule *, const char *, void *) callback, void *payload","sig":"git_repository *::int (*)(git_submodule *, const char *, void *)::void *","return":{"type":"int","comment":" 0 on success, -1 on error, or non-zero return value of callback"},"description":"

Iterate over all tracked submodules of a repository.

\n","comments":"

See the note on git_submodule above. This iterates over the tracked\n submodules as described therein.

\n\n

If you are concerned about items in the working directory that look like\n submodules but are not tracked, the diff API will generate a diff record\n for workdir items that look like submodules but are not tracked, showing\n them as added in the workdir. Also, the status API will treat the entire\n subdirectory of a contained git repo as a single GIT_STATUS_WT_NEW item.

\n","group":"submodule","examples":{"status.c":["ex/v0.23.0/status.html#git_submodule_foreach-23"]}},"git_submodule_add_setup":{"type":"function","file":"submodule.h","line":270,"lineto":275,"args":[{"name":"out","type":"git_submodule **","comment":"The newly created submodule ready to open for clone"},{"name":"repo","type":"git_repository *","comment":"The repository in which you want to create the submodule"},{"name":"url","type":"const char *","comment":"URL for the submodule's remote"},{"name":"path","type":"const char *","comment":"Path at which the submodule should be created"},{"name":"use_gitlink","type":"int","comment":"Should workdir contain a gitlink to the repo in\n .git/modules vs. repo directly in workdir."}],"argline":"git_submodule **out, git_repository *repo, const char *url, const char *path, int use_gitlink","sig":"git_submodule **::git_repository *::const char *::const char *::int","return":{"type":"int","comment":" 0 on success, GIT_EEXISTS if submodule already exists,\n -1 on other errors."},"description":"

Set up a new git submodule for checkout.

\n","comments":"

This does "git submodule add" up to the fetch and checkout of the\n submodule contents. It preps a new submodule, creates an entry in\n .gitmodules and creates an empty initialized repository either at the\n given path in the working directory or in .git/modules with a gitlink\n from the working directory to the new repo.

\n\n

To fully emulate "git submodule add" call this function, then open the\n submodule repo and perform the clone step as needed. Lastly, call\n git_submodule_add_finalize() to wrap up adding the new submodule and\n .gitmodules to the index to be ready to commit.

\n\n

You must call git_submodule_free on the submodule object when done.

\n","group":"submodule"},"git_submodule_add_finalize":{"type":"function","file":"submodule.h","line":287,"lineto":287,"args":[{"name":"submodule","type":"git_submodule *","comment":"The submodule to finish adding."}],"argline":"git_submodule *submodule","sig":"git_submodule *","return":{"type":"int","comment":null},"description":"

Resolve the setup of a new git submodule.

\n","comments":"

This should be called on a submodule once you have called add setup\n and done the clone of the submodule. This adds the .gitmodules file\n and the newly cloned submodule to the index to be ready to be committed\n (but doesn't actually do the commit).

\n","group":"submodule"},"git_submodule_add_to_index":{"type":"function","file":"submodule.h","line":299,"lineto":301,"args":[{"name":"submodule","type":"git_submodule *","comment":"The submodule to add to the index"},{"name":"write_index","type":"int","comment":"Boolean if this should immediately write the index\n file. If you pass this as false, you will have to get the\n git_index and explicitly call `git_index_write()` on it to\n save the change."}],"argline":"git_submodule *submodule, int write_index","sig":"git_submodule *::int","return":{"type":"int","comment":" 0 on success, \n<\n0 on failure"},"description":"

Add current submodule HEAD commit to index of superproject.

\n","comments":"","group":"submodule"},"git_submodule_owner":{"type":"function","file":"submodule.h","line":314,"lineto":314,"args":[{"name":"submodule","type":"git_submodule *","comment":"Pointer to submodule object"}],"argline":"git_submodule *submodule","sig":"git_submodule *","return":{"type":"git_repository *","comment":" Pointer to `git_repository`"},"description":"

Get the containing repository for a submodule.

\n","comments":"

This returns a pointer to the repository that contains the submodule.\n This is a just a reference to the repository that was passed to the\n original git_submodule_lookup() call, so if that repository has been\n freed, then this may be a dangling reference.

\n","group":"submodule"},"git_submodule_name":{"type":"function","file":"submodule.h","line":322,"lineto":322,"args":[{"name":"submodule","type":"git_submodule *","comment":"Pointer to submodule object"}],"argline":"git_submodule *submodule","sig":"git_submodule *","return":{"type":"const char *","comment":" Pointer to the submodule name"},"description":"

Get the name of submodule.

\n","comments":"","group":"submodule","examples":{"status.c":["ex/v0.23.0/status.html#git_submodule_name-24"]}},"git_submodule_path":{"type":"function","file":"submodule.h","line":333,"lineto":333,"args":[{"name":"submodule","type":"git_submodule *","comment":"Pointer to submodule object"}],"argline":"git_submodule *submodule","sig":"git_submodule *","return":{"type":"const char *","comment":" Pointer to the submodule path"},"description":"

Get the path to the submodule.

\n","comments":"

The path is almost always the same as the submodule name, but the\n two are actually not required to match.

\n","group":"submodule","examples":{"status.c":["ex/v0.23.0/status.html#git_submodule_path-25"]}},"git_submodule_url":{"type":"function","file":"submodule.h","line":341,"lineto":341,"args":[{"name":"submodule","type":"git_submodule *","comment":"Pointer to submodule object"}],"argline":"git_submodule *submodule","sig":"git_submodule *","return":{"type":"const char *","comment":" Pointer to the submodule url"},"description":"

Get the URL for the submodule.

\n","comments":"","group":"submodule"},"git_submodule_resolve_url":{"type":"function","file":"submodule.h","line":351,"lineto":351,"args":[{"name":"out","type":"git_buf *","comment":"buffer to store the absolute submodule url in"},{"name":"repo","type":"git_repository *","comment":"Pointer to repository object"},{"name":"url","type":"const char *","comment":"Relative url"}],"argline":"git_buf *out, git_repository *repo, const char *url","sig":"git_buf *::git_repository *::const char *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Resolve a submodule url relative to the given repository.

\n","comments":"","group":"submodule"},"git_submodule_branch":{"type":"function","file":"submodule.h","line":359,"lineto":359,"args":[{"name":"submodule","type":"git_submodule *","comment":"Pointer to submodule object"}],"argline":"git_submodule *submodule","sig":"git_submodule *","return":{"type":"const char *","comment":" Pointer to the submodule branch"},"description":"

Get the branch for the submodule.

\n","comments":"","group":"submodule"},"git_submodule_set_branch":{"type":"function","file":"submodule.h","line":372,"lineto":372,"args":[{"name":"repo","type":"git_repository *","comment":"the repository to affect"},{"name":"name","type":"const char *","comment":"the name of the submodule to configure"},{"name":"branch","type":"const char *","comment":"Branch that should be used for the submodule"}],"argline":"git_repository *repo, const char *name, const char *branch","sig":"git_repository *::const char *::const char *","return":{"type":"int","comment":" 0 on success, \n<\n0 on failure"},"description":"

Set the branch for the submodule in the configuration

\n","comments":"

After calling this, you may wish to call git_submodule_sync() to\n write the changes to the checked out submodule repository.

\n","group":"submodule"},"git_submodule_set_url":{"type":"function","file":"submodule.h","line":386,"lineto":386,"args":[{"name":"repo","type":"git_repository *","comment":"the repository to affect"},{"name":"name","type":"const char *","comment":"the name of the submodule to configure"},{"name":"url","type":"const char *","comment":"URL that should be used for the submodule"}],"argline":"git_repository *repo, const char *name, const char *url","sig":"git_repository *::const char *::const char *","return":{"type":"int","comment":" 0 on success, \n<\n0 on failure"},"description":"

Set the URL for the submodule in the configuration

\n","comments":"

After calling this, you may wish to call git_submodule_sync() to\n write the changes to the checked out submodule repository.

\n","group":"submodule"},"git_submodule_index_id":{"type":"function","file":"submodule.h","line":394,"lineto":394,"args":[{"name":"submodule","type":"git_submodule *","comment":"Pointer to submodule object"}],"argline":"git_submodule *submodule","sig":"git_submodule *","return":{"type":"const git_oid *","comment":" Pointer to git_oid or NULL if submodule is not in index."},"description":"

Get the OID for the submodule in the index.

\n","comments":"","group":"submodule"},"git_submodule_head_id":{"type":"function","file":"submodule.h","line":402,"lineto":402,"args":[{"name":"submodule","type":"git_submodule *","comment":"Pointer to submodule object"}],"argline":"git_submodule *submodule","sig":"git_submodule *","return":{"type":"const git_oid *","comment":" Pointer to git_oid or NULL if submodule is not in the HEAD."},"description":"

Get the OID for the submodule in the current HEAD tree.

\n","comments":"","group":"submodule"},"git_submodule_wd_id":{"type":"function","file":"submodule.h","line":415,"lineto":415,"args":[{"name":"submodule","type":"git_submodule *","comment":"Pointer to submodule object"}],"argline":"git_submodule *submodule","sig":"git_submodule *","return":{"type":"const git_oid *","comment":" Pointer to git_oid or NULL if submodule is not checked out."},"description":"

Get the OID for the submodule in the current working directory.

\n","comments":"

This returns the OID that corresponds to looking up 'HEAD' in the checked\n out submodule. If there are pending changes in the index or anything\n else, this won't notice that. You should call git_submodule_status()\n for a more complete picture about the state of the working directory.

\n","group":"submodule"},"git_submodule_ignore":{"type":"function","file":"submodule.h","line":440,"lineto":441,"args":[{"name":"submodule","type":"git_submodule *","comment":"The submodule to check"}],"argline":"git_submodule *submodule","sig":"git_submodule *","return":{"type":"git_submodule_ignore_t","comment":" The current git_submodule_ignore_t valyue what will be used for\n this submodule."},"description":"

Get the ignore rule that will be used for the submodule.

\n","comments":"

These values control the behavior of git_submodule_status() for this\n submodule. There are four ignore values:

\n\n
    \n
  • GIT_SUBMODULE_IGNORE_NONE will consider any change to the contents\nof the submodule from a clean checkout to be dirty, including the\naddition of untracked files. This is the default if unspecified.
  • \n
  • GIT_SUBMODULE_IGNORE_UNTRACKED examines the contents of the\nworking tree (i.e. call git_status_foreach() on the submodule) but\nUNTRACKED files will not count as making the submodule dirty.
  • \n
  • GIT_SUBMODULE_IGNORE_DIRTY means to only check if the HEAD of the\nsubmodule has moved for status. This is fast since it does not need to\nscan the working tree of the submodule at all.
  • \n
  • GIT_SUBMODULE_IGNORE_ALL means not to open the submodule repo.\nThe working directory will be consider clean so long as there is a\nchecked out version present.
  • \n
\n","group":"submodule"},"git_submodule_set_ignore":{"type":"function","file":"submodule.h","line":453,"lineto":456,"args":[{"name":"repo","type":"git_repository *","comment":"the repository to affect"},{"name":"name","type":"const char *","comment":"the name of the submdule"},{"name":"ignore","type":"git_submodule_ignore_t","comment":"The new value for the ignore rule"}],"argline":"git_repository *repo, const char *name, git_submodule_ignore_t ignore","sig":"git_repository *::const char *::git_submodule_ignore_t","return":{"type":"int","comment":" 0 or an error code"},"description":"

Set the ignore rule for the submodule in the configuration

\n","comments":"

This does not affect any currently-loaded instances.

\n","group":"submodule"},"git_submodule_update_strategy":{"type":"function","file":"submodule.h","line":468,"lineto":469,"args":[{"name":"submodule","type":"git_submodule *","comment":"The submodule to check"}],"argline":"git_submodule *submodule","sig":"git_submodule *","return":{"type":"git_submodule_update_t","comment":" The current git_submodule_update_t value that will be used\n for this submodule."},"description":"

Get the update rule that will be used for the submodule.

\n","comments":"

This value controls the behavior of the git submodule update command.\n There are four useful values documented with git_submodule_update_t.

\n","group":"submodule"},"git_submodule_set_update":{"type":"function","file":"submodule.h","line":481,"lineto":484,"args":[{"name":"repo","type":"git_repository *","comment":"the repository to affect"},{"name":"name","type":"const char *","comment":"the name of the submodule to configure"},{"name":"update","type":"git_submodule_update_t","comment":"The new value to use"}],"argline":"git_repository *repo, const char *name, git_submodule_update_t update","sig":"git_repository *::const char *::git_submodule_update_t","return":{"type":"int","comment":" 0 or an error code"},"description":"

Set the update rule for the submodule in the configuration

\n","comments":"

This setting won't affect any existing instances.

\n","group":"submodule"},"git_submodule_fetch_recurse_submodules":{"type":"function","file":"submodule.h","line":497,"lineto":498,"args":[{"name":"submodule","type":"git_submodule *","comment":null}],"argline":"git_submodule *submodule","sig":"git_submodule *","return":{"type":"git_submodule_recurse_t","comment":" 0 if fetchRecurseSubmodules is false, 1 if true"},"description":"

Read the fetchRecurseSubmodules rule for a submodule.

\n","comments":"

This accesses the submodule.\n<name

\n\n
\n

.fetchRecurseSubmodules value for\n the submodule that controls fetching behavior for the submodule.

\n
\n\n

Note that at this time, libgit2 does not honor this setting and the\n fetch functionality current ignores submodules.

\n","group":"submodule"},"git_submodule_set_fetch_recurse_submodules":{"type":"function","file":"submodule.h","line":510,"lineto":513,"args":[{"name":"repo","type":"git_repository *","comment":"the repository to affect"},{"name":"name","type":"const char *","comment":"the submodule to configure"},{"name":"fetch_recurse_submodules","type":"git_submodule_recurse_t","comment":"Boolean value"}],"argline":"git_repository *repo, const char *name, git_submodule_recurse_t fetch_recurse_submodules","sig":"git_repository *::const char *::git_submodule_recurse_t","return":{"type":"int","comment":" old value for fetchRecurseSubmodules"},"description":"

Set the fetchRecurseSubmodules rule for a submodule in the configuration

\n","comments":"

This setting won't affect any existing instances.

\n","group":"submodule"},"git_submodule_init":{"type":"function","file":"submodule.h","line":528,"lineto":528,"args":[{"name":"submodule","type":"git_submodule *","comment":"The submodule to write into the superproject config"},{"name":"overwrite","type":"int","comment":"By default, existing entries will not be overwritten,\n but setting this to true forces them to be updated."}],"argline":"git_submodule *submodule, int overwrite","sig":"git_submodule *::int","return":{"type":"int","comment":" 0 on success, \n<\n0 on failure."},"description":"

Copy submodule info into ".git/config" file.

\n","comments":"

Just like "git submodule init", this copies information about the\n submodule into ".git/config". You can use the accessor functions\n above to alter the in-memory git_submodule object and control what\n is written to the config, overriding what is in .gitmodules.

\n","group":"submodule"},"git_submodule_repo_init":{"type":"function","file":"submodule.h","line":543,"lineto":546,"args":[{"name":"out","type":"git_repository **","comment":"Output pointer to the created git repository."},{"name":"sm","type":"const git_submodule *","comment":"The submodule to create a new subrepository from."},{"name":"use_gitlink","type":"int","comment":"Should the workdir contain a gitlink to\n the repo in .git/modules vs. repo directly in workdir."}],"argline":"git_repository **out, const git_submodule *sm, int use_gitlink","sig":"git_repository **::const git_submodule *::int","return":{"type":"int","comment":" 0 on success, \n<\n0 on failure."},"description":"

Set up the subrepository for a submodule in preparation for clone.

\n","comments":"

This function can be called to init and set up a submodule\n repository from a submodule in preparation to clone it from\n its remote.

\n","group":"submodule"},"git_submodule_sync":{"type":"function","file":"submodule.h","line":556,"lineto":556,"args":[{"name":"submodule","type":"git_submodule *","comment":null}],"argline":"git_submodule *submodule","sig":"git_submodule *","return":{"type":"int","comment":null},"description":"

Copy submodule remote info into submodule repo.

\n","comments":"

This copies the information about the submodules URL into the checked out\n submodule config, acting like "git submodule sync". This is useful if\n you have altered the URL for the submodule (or it has been altered by a\n fetch of upstream changes) and you need to update your local repo.

\n","group":"submodule"},"git_submodule_open":{"type":"function","file":"submodule.h","line":570,"lineto":572,"args":[{"name":"repo","type":"git_repository **","comment":"Pointer to the submodule repo which was opened"},{"name":"submodule","type":"git_submodule *","comment":"Submodule to be opened"}],"argline":"git_repository **repo, git_submodule *submodule","sig":"git_repository **::git_submodule *","return":{"type":"int","comment":" 0 on success, \n<\n0 if submodule repo could not be opened."},"description":"

Open the repository for a submodule.

\n","comments":"

This is a newly opened repository object. The caller is responsible for\n calling git_repository_free() on it when done. Multiple calls to this\n function will return distinct git_repository objects. This will only\n work if the submodule is checked out into the working directory.

\n","group":"submodule"},"git_submodule_reload":{"type":"function","file":"submodule.h","line":584,"lineto":584,"args":[{"name":"submodule","type":"git_submodule *","comment":"The submodule to reload"},{"name":"force","type":"int","comment":"Force reload even if the data doesn't seem out of date"}],"argline":"git_submodule *submodule, int force","sig":"git_submodule *::int","return":{"type":"int","comment":" 0 on success, \n<\n0 on error"},"description":"

Reread submodule info from config, index, and HEAD.

\n","comments":"

Call this to reread cached submodule information for this submodule if\n you have reason to believe that it has changed.

\n","group":"submodule"},"git_submodule_status":{"type":"function","file":"submodule.h","line":600,"lineto":604,"args":[{"name":"status","type":"unsigned int *","comment":"Combination of `GIT_SUBMODULE_STATUS` flags"},{"name":"repo","type":"git_repository *","comment":"the repository in which to look"},{"name":"name","type":"const char *","comment":"name of the submodule"},{"name":"ignore","type":"git_submodule_ignore_t","comment":"the ignore rules to follow"}],"argline":"unsigned int *status, git_repository *repo, const char *name, git_submodule_ignore_t ignore","sig":"unsigned int *::git_repository *::const char *::git_submodule_ignore_t","return":{"type":"int","comment":" 0 on success, \n<\n0 on error"},"description":"

Get the status for a submodule.

\n","comments":"

This looks at a submodule and tries to determine the status. It\n will return a combination of the GIT_SUBMODULE_STATUS values above.\n How deeply it examines the working directory to do this will depend\n on the git_submodule_ignore_t value for the submodule.

\n","group":"submodule","examples":{"status.c":["ex/v0.23.0/status.html#git_submodule_status-26"]}},"git_submodule_location":{"type":"function","file":"submodule.h","line":620,"lineto":622,"args":[{"name":"location_status","type":"unsigned int *","comment":"Combination of first four `GIT_SUBMODULE_STATUS` flags"},{"name":"submodule","type":"git_submodule *","comment":"Submodule for which to get status"}],"argline":"unsigned int *location_status, git_submodule *submodule","sig":"unsigned int *::git_submodule *","return":{"type":"int","comment":" 0 on success, \n<\n0 on error"},"description":"

Get the locations of submodule information.

\n","comments":"

This is a bit like a very lightweight version of git_submodule_status.\n It just returns a made of the first four submodule status values (i.e.\n the ones like GIT_SUBMODULE_STATUS_IN_HEAD, etc) that tell you where the\n submodule data comes from (i.e. the HEAD commit, gitmodules file, etc.).\n This can be useful if you want to know if the submodule is present in the\n working directory at this point in time, etc.

\n","group":"submodule"},"git_commit_create_from_ids":{"type":"function","file":"sys/commit.h","line":34,"lineto":44,"args":[{"name":"id","type":"git_oid *","comment":null},{"name":"repo","type":"git_repository *","comment":null},{"name":"update_ref","type":"const char *","comment":null},{"name":"author","type":"const git_signature *","comment":null},{"name":"committer","type":"const git_signature *","comment":null},{"name":"message_encoding","type":"const char *","comment":null},{"name":"message","type":"const char *","comment":null},{"name":"tree","type":"const git_oid *","comment":null},{"name":"parent_count","type":"size_t","comment":null},{"name":"parents","type":"const git_oid *[]","comment":null}],"argline":"git_oid *id, git_repository *repo, const char *update_ref, const git_signature *author, const git_signature *committer, const char *message_encoding, const char *message, const git_oid *tree, size_t parent_count, const git_oid *[] parents","sig":"git_oid *::git_repository *::const char *::const git_signature *::const git_signature *::const char *::const char *::const git_oid *::size_t::const git_oid *[]","return":{"type":"int","comment":null},"description":"

Create new commit in the repository from a list of git_oid values.

\n","comments":"

See documentation for git_commit_create() for information about the\n parameters, as the meaning is identical excepting that tree and\n parents now take git_oid. This is a dangerous API in that nor\n the tree, neither the parents list of git_oids are checked for\n validity.

\n","group":"commit"},"git_commit_create_from_callback":{"type":"function","file":"sys/commit.h","line":66,"lineto":76,"args":[{"name":"id","type":"git_oid *","comment":null},{"name":"repo","type":"git_repository *","comment":null},{"name":"update_ref","type":"const char *","comment":null},{"name":"author","type":"const git_signature *","comment":null},{"name":"committer","type":"const git_signature *","comment":null},{"name":"message_encoding","type":"const char *","comment":null},{"name":"message","type":"const char *","comment":null},{"name":"tree","type":"const git_oid *","comment":null},{"name":"parent_cb","type":"git_commit_parent_callback","comment":null},{"name":"parent_payload","type":"void *","comment":null}],"argline":"git_oid *id, git_repository *repo, const char *update_ref, const git_signature *author, const git_signature *committer, const char *message_encoding, const char *message, const git_oid *tree, git_commit_parent_callback parent_cb, void *parent_payload","sig":"git_oid *::git_repository *::const char *::const git_signature *::const git_signature *::const char *::const char *::const git_oid *::git_commit_parent_callback::void *","return":{"type":"int","comment":null},"description":"

Create a new commit in the repository with an callback to supply parents.

\n","comments":"

See documentation for git_commit_create() for information about the\n parameters, as the meaning is identical excepting that tree takes a\n git_oid and doesn't check for validity, and parent_cb is invoked\n with parent_payload and should return git_oid values or NULL to\n indicate that all parents are accounted for.

\n","group":"commit"},"git_config_init_backend":{"type":"function","file":"sys/config.h","line":83,"lineto":85,"args":[{"name":"backend","type":"git_config_backend *","comment":null},{"name":"version","type":"unsigned int","comment":"Version of struct; pass `GIT_CONFIG_BACKEND_VERSION`"}],"argline":"git_config_backend *backend, unsigned int version","sig":"git_config_backend *::unsigned int","return":{"type":"int","comment":" Zero on success; -1 on failure."},"description":"

Initializes a git_config_backend with default values. Equivalent to\n creating an instance with GIT_CONFIG_BACKEND_INIT.

\n","comments":"","group":"config"},"git_config_add_backend":{"type":"function","file":"sys/config.h","line":105,"lineto":109,"args":[{"name":"cfg","type":"git_config *","comment":"the configuration to add the file to"},{"name":"file","type":"git_config_backend *","comment":"the configuration file (backend) to add"},{"name":"level","type":"git_config_level_t","comment":"the priority level of the backend"},{"name":"force","type":"int","comment":"if a config file already exists for the given\n priority level, replace it"}],"argline":"git_config *cfg, git_config_backend *file, git_config_level_t level, int force","sig":"git_config *::git_config_backend *::git_config_level_t::int","return":{"type":"int","comment":" 0 on success, GIT_EEXISTS when adding more than one file\n for a given priority level (and force_replace set to 0), or error code"},"description":"

Add a generic config file instance to an existing config

\n","comments":"

Note that the configuration object will free the file\n automatically.

\n\n

Further queries on this config object will access each\n of the config file instances in order (instances with\n a higher priority level will be accessed first).

\n","group":"config"},"git_diff_print_callback__to_buf":{"type":"function","file":"sys/diff.h","line":37,"lineto":41,"args":[{"name":"delta","type":"const git_diff_delta *","comment":null},{"name":"hunk","type":"const git_diff_hunk *","comment":null},{"name":"line","type":"const git_diff_line *","comment":null},{"name":"payload","type":"void *","comment":null}],"argline":"const git_diff_delta *delta, const git_diff_hunk *hunk, const git_diff_line *line, void *payload","sig":"const git_diff_delta *::const git_diff_hunk *::const git_diff_line *::void *","return":{"type":"int","comment":null},"description":"

Diff print callback that writes to a git_buf.

\n","comments":"

This function is provided not for you to call it directly, but instead\n so you can use it as a function pointer to the git_diff_print or\n git_patch_print APIs. When using those APIs, you specify a callback\n to actually handle the diff and/or patch data.

\n\n

Use this callback to easily write that data to a git_buf buffer. You\n must pass a git_buf * value as the payload to the git_diff_print\n and/or git_patch_print function. The data will be appended to the\n buffer (after any existing content).

\n","group":"diff"},"git_diff_print_callback__to_file_handle":{"type":"function","file":"sys/diff.h","line":57,"lineto":61,"args":[{"name":"delta","type":"const git_diff_delta *","comment":null},{"name":"hunk","type":"const git_diff_hunk *","comment":null},{"name":"line","type":"const git_diff_line *","comment":null},{"name":"payload","type":"void *","comment":null}],"argline":"const git_diff_delta *delta, const git_diff_hunk *hunk, const git_diff_line *line, void *payload","sig":"const git_diff_delta *::const git_diff_hunk *::const git_diff_line *::void *","return":{"type":"int","comment":null},"description":"

Diff print callback that writes to stdio FILE handle.

\n","comments":"

This function is provided not for you to call it directly, but instead\n so you can use it as a function pointer to the git_diff_print or\n git_patch_print APIs. When using those APIs, you specify a callback\n to actually handle the diff and/or patch data.

\n\n

Use this callback to easily write that data to a stdio FILE handle. You\n must pass a FILE * value (such as stdout or stderr or the return\n value from fopen()) as the payload to the git_diff_print\n and/or git_patch_print function. If you pass NULL, this will write\n data to stdout.

\n","group":"diff"},"git_diff_get_perfdata":{"type":"function","file":"sys/diff.h","line":83,"lineto":84,"args":[{"name":"out","type":"git_diff_perfdata *","comment":"Structure to be filled with diff performance data"},{"name":"diff","type":"const git_diff *","comment":"Diff to read performance data from"}],"argline":"git_diff_perfdata *out, const git_diff *diff","sig":"git_diff_perfdata *::const git_diff *","return":{"type":"int","comment":" 0 for success, \n<\n0 for error"},"description":"

Get performance data for a diff object.

\n","comments":"","group":"diff"},"git_status_list_get_perfdata":{"type":"function","file":"sys/diff.h","line":89,"lineto":90,"args":[{"name":"out","type":"git_diff_perfdata *","comment":null},{"name":"status","type":"const git_status_list *","comment":null}],"argline":"git_diff_perfdata *out, const git_status_list *status","sig":"git_diff_perfdata *::const git_status_list *","return":{"type":"int","comment":null},"description":"

Get performance data for diffs from a git_status_list

\n","comments":"","group":"status"},"git_filter_lookup":{"type":"function","file":"sys/filter.h","line":27,"lineto":27,"args":[{"name":"name","type":"const char *","comment":"The name of the filter"}],"argline":"const char *name","sig":"const char *","return":{"type":"git_filter *","comment":" Pointer to the filter object or NULL if not found"},"description":"

Look up a filter by name

\n","comments":"","group":"filter"},"git_filter_list_new":{"type":"function","file":"sys/filter.h","line":57,"lineto":61,"args":[{"name":"out","type":"git_filter_list **","comment":null},{"name":"repo","type":"git_repository *","comment":null},{"name":"mode","type":"git_filter_mode_t","comment":null},{"name":"options","type":"uint32_t","comment":null}],"argline":"git_filter_list **out, git_repository *repo, git_filter_mode_t mode, uint32_t options","sig":"git_filter_list **::git_repository *::git_filter_mode_t::uint32_t","return":{"type":"int","comment":null},"description":"

Create a new empty filter list

\n","comments":"

Normally you won't use this because git_filter_list_load will create\n the filter list for you, but you can use this in combination with the\n git_filter_lookup and git_filter_list_push functions to assemble\n your own chains of filters.

\n","group":"filter"},"git_filter_list_push":{"type":"function","file":"sys/filter.h","line":76,"lineto":77,"args":[{"name":"fl","type":"git_filter_list *","comment":null},{"name":"filter","type":"git_filter *","comment":null},{"name":"payload","type":"void *","comment":null}],"argline":"git_filter_list *fl, git_filter *filter, void *payload","sig":"git_filter_list *::git_filter *::void *","return":{"type":"int","comment":null},"description":"

Add a filter to a filter list with the given payload.

\n","comments":"

Normally you won't have to do this because the filter list is created\n by calling the "check" function on registered filters when the filter\n attributes are set, but this does allow more direct manipulation of\n filter lists when desired.

\n\n

Note that normally the "check" function can set up a payload for the\n filter. Using this function, you can either pass in a payload if you\n know the expected payload format, or you can pass NULL. Some filters\n may fail with a NULL payload. Good luck!

\n","group":"filter"},"git_filter_list_length":{"type":"function","file":"sys/filter.h","line":90,"lineto":90,"args":[{"name":"fl","type":"const git_filter_list *","comment":"A filter list"}],"argline":"const git_filter_list *fl","sig":"const git_filter_list *","return":{"type":"size_t","comment":" The number of filters in the list"},"description":"

Look up how many filters are in the list

\n","comments":"

We will attempt to apply all of these filters to any data passed in,\n but note that the filter apply action still has the option of skipping\n data that is passed in (for example, the CRLF filter will skip data\n that appears to be binary).

\n","group":"filter"},"git_filter_source_repo":{"type":"function","file":"sys/filter.h","line":100,"lineto":100,"args":[{"name":"src","type":"const git_filter_source *","comment":null}],"argline":"const git_filter_source *src","sig":"const git_filter_source *","return":{"type":"git_repository *","comment":null},"description":"

Get the repository that the source data is coming from.

\n","comments":"","group":"filter"},"git_filter_source_path":{"type":"function","file":"sys/filter.h","line":105,"lineto":105,"args":[{"name":"src","type":"const git_filter_source *","comment":null}],"argline":"const git_filter_source *src","sig":"const git_filter_source *","return":{"type":"const char *","comment":null},"description":"

Get the path that the source data is coming from.

\n","comments":"","group":"filter"},"git_filter_source_filemode":{"type":"function","file":"sys/filter.h","line":111,"lineto":111,"args":[{"name":"src","type":"const git_filter_source *","comment":null}],"argline":"const git_filter_source *src","sig":"const git_filter_source *","return":{"type":"uint16_t","comment":null},"description":"

Get the file mode of the source file\n If the mode is unknown, this will return 0

\n","comments":"","group":"filter"},"git_filter_source_id":{"type":"function","file":"sys/filter.h","line":118,"lineto":118,"args":[{"name":"src","type":"const git_filter_source *","comment":null}],"argline":"const git_filter_source *src","sig":"const git_filter_source *","return":{"type":"const git_oid *","comment":null},"description":"

Get the OID of the source\n If the OID is unknown (often the case with GIT_FILTER_CLEAN) then\n this will return NULL.

\n","comments":"","group":"filter"},"git_filter_source_mode":{"type":"function","file":"sys/filter.h","line":123,"lineto":123,"args":[{"name":"src","type":"const git_filter_source *","comment":null}],"argline":"const git_filter_source *src","sig":"const git_filter_source *","return":{"type":"git_filter_mode_t","comment":null},"description":"

Get the git_filter_mode_t to be used

\n","comments":"","group":"filter"},"git_filter_source_flags":{"type":"function","file":"sys/filter.h","line":128,"lineto":128,"args":[{"name":"src","type":"const git_filter_source *","comment":null}],"argline":"const git_filter_source *src","sig":"const git_filter_source *","return":{"type":"uint32_t","comment":null},"description":"

Get the combination git_filter_flag_t options to be applied

\n","comments":"","group":"filter"},"git_filter_register":{"type":"function","file":"sys/filter.h","line":289,"lineto":290,"args":[{"name":"name","type":"const char *","comment":"A name by which the filter can be referenced. Attempting\n \t\t\tto register with an in-use name will return GIT_EEXISTS."},{"name":"filter","type":"git_filter *","comment":"The filter definition. This pointer will be stored as is\n \t\t\tby libgit2 so it must be a durable allocation (either static\n \t\t\tor on the heap)."},{"name":"priority","type":"int","comment":"The priority for filter application"}],"argline":"const char *name, git_filter *filter, int priority","sig":"const char *::git_filter *::int","return":{"type":"int","comment":" 0 on successful registry, error code \n<\n0 on failure"},"description":"

Register a filter under a given name with a given priority.

\n","comments":"

As mentioned elsewhere, the initialize callback will not be invoked\n immediately. It is deferred until the filter is used in some way.

\n\n

A filter's attribute checks and check and apply callbacks will be\n issued in order of priority on smudge (to workdir), and in reverse\n order of priority on clean (to odb).

\n\n

Two filters are preregistered with libgit2:\n - GIT_FILTER_CRLF with priority 0\n - GIT_FILTER_IDENT with priority 100

\n\n

Currently the filter registry is not thread safe, so any registering or\n deregistering of filters must be done outside of any possible usage of\n the filters (i.e. during application setup or shutdown).

\n","group":"filter"},"git_filter_unregister":{"type":"function","file":"sys/filter.h","line":305,"lineto":305,"args":[{"name":"name","type":"const char *","comment":"The name under which the filter was registered"}],"argline":"const char *name","sig":"const char *","return":{"type":"int","comment":" 0 on success, error code \n<\n0 on failure"},"description":"

Remove the filter with the given name

\n","comments":"

Attempting to remove the builtin libgit2 filters is not permitted and\n will return an error.

\n\n

Currently the filter registry is not thread safe, so any registering or\n deregistering of filters must be done outside of any possible usage of\n the filters (i.e. during application setup or shutdown).

\n","group":"filter"},"git_hashsig_create":{"type":"function","file":"sys/hashsig.h","line":62,"lineto":66,"args":[{"name":"out","type":"git_hashsig **","comment":"The computed similarity signature."},{"name":"buf","type":"const char *","comment":"The input buffer."},{"name":"buflen","type":"size_t","comment":"The input buffer size."},{"name":"opts","type":"git_hashsig_option_t","comment":"The signature computation options (see above)."}],"argline":"git_hashsig **out, const char *buf, size_t buflen, git_hashsig_option_t opts","sig":"git_hashsig **::const char *::size_t::git_hashsig_option_t","return":{"type":"int","comment":" 0 on success, GIT_EBUFS if the buffer doesn't contain enough data to\n compute a valid signature (unless GIT_HASHSIG_ALLOW_SMALL_FILES is set), or\n error code."},"description":"

Compute a similarity signature for a text buffer

\n","comments":"

If you have passed the option GIT_HASHSIG_IGNORE_WHITESPACE, then the\n whitespace will be removed from the buffer while it is being processed,\n modifying the buffer in place. Sorry about that!

\n","group":"hashsig"},"git_hashsig_create_fromfile":{"type":"function","file":"sys/hashsig.h","line":81,"lineto":84,"args":[{"name":"out","type":"git_hashsig **","comment":"The computed similarity signature."},{"name":"path","type":"const char *","comment":"The path to the input file."},{"name":"opts","type":"git_hashsig_option_t","comment":"The signature computation options (see above)."}],"argline":"git_hashsig **out, const char *path, git_hashsig_option_t opts","sig":"git_hashsig **::const char *::git_hashsig_option_t","return":{"type":"int","comment":" 0 on success, GIT_EBUFS if the buffer doesn't contain enough data to\n compute a valid signature (unless GIT_HASHSIG_ALLOW_SMALL_FILES is set), or\n error code."},"description":"

Compute a similarity signature for a text file

\n","comments":"

This walks through the file, only loading a maximum of 4K of file data at\n a time. Otherwise, it acts just like git_hashsig_create.

\n","group":"hashsig"},"git_hashsig_free":{"type":"function","file":"sys/hashsig.h","line":91,"lineto":91,"args":[{"name":"sig","type":"git_hashsig *","comment":"The similarity signature to free."}],"argline":"git_hashsig *sig","sig":"git_hashsig *","return":{"type":"void","comment":null},"description":"

Release memory for a content similarity signature

\n","comments":"","group":"hashsig"},"git_hashsig_compare":{"type":"function","file":"sys/hashsig.h","line":100,"lineto":102,"args":[{"name":"a","type":"const git_hashsig *","comment":"The first similarity signature to compare."},{"name":"b","type":"const git_hashsig *","comment":"The second similarity signature to compare."}],"argline":"const git_hashsig *a, const git_hashsig *b","sig":"const git_hashsig *::const git_hashsig *","return":{"type":"int","comment":" [0 to 100] on success as the similarity score, or error code."},"description":"

Measure similarity score between two similarity signatures

\n","comments":"","group":"hashsig"},"git_mempack_new":{"type":"function","file":"sys/mempack.h","line":44,"lineto":44,"args":[{"name":"out","type":"git_odb_backend **","comment":"Poiter where to store the ODB backend"}],"argline":"git_odb_backend **out","sig":"git_odb_backend **","return":{"type":"int","comment":" 0 on success; error code otherwise"},"description":"
Instantiate a new mempack backend.\n
\n","comments":"
The backend must be added to an existing ODB with the highest\npriority.\n\n    git_mempack_new(\n
\n\n

&mempacker\n);\n git_repository_odb(\n&odb\n, repository);\n git_odb_add_backend(odb, mempacker, 999);

\n\n
Once the backend has been loaded, all writes to the ODB will\ninstead be queued in memory, and can be finalized with\n`git_mempack_dump`.\n\nSubsequent reads will also be served from the in-memory store\nto ensure consistency, until the memory store is dumped.\n
\n","group":"mempack"},"git_mempack_reset":{"type":"function","file":"sys/mempack.h","line":81,"lineto":81,"args":[{"name":"backend","type":"git_odb_backend *","comment":"The mempack backend"}],"argline":"git_odb_backend *backend","sig":"git_odb_backend *","return":{"type":"void","comment":null},"description":"
Reset the memory packer by clearing all the queued objects.\n
\n","comments":"
This assumes that `git_mempack_dump` has been called before to\nstore all the queued objects into a single packfile.\n\nAlternatively, call `reset` without a previous dump to "undo"\nall the recently written objects, giving transaction-like\nsemantics to the Git repository.\n
\n","group":"mempack"},"git_odb_init_backend":{"type":"function","file":"sys/odb_backend.h","line":100,"lineto":102,"args":[{"name":"backend","type":"git_odb_backend *","comment":null},{"name":"version","type":"unsigned int","comment":"Version the struct; pass `GIT_ODB_BACKEND_VERSION`"}],"argline":"git_odb_backend *backend, unsigned int version","sig":"git_odb_backend *::unsigned int","return":{"type":"int","comment":" Zero on success; -1 on failure."},"description":"

Initializes a git_odb_backend with default values. Equivalent to\n creating an instance with GIT_ODB_BACKEND_INIT.

\n","comments":"","group":"odb"},"git_openssl_set_locking":{"type":"function","file":"sys/openssl.h","line":34,"lineto":34,"args":[],"argline":"","sig":"","return":{"type":"int","comment":" 0 on success, -1 if there are errors or if libgit2 was not\n built with OpenSSL and threading support."},"description":"

Initialize the OpenSSL locks

\n","comments":"

OpenSSL requires the application to determine how it performs\n locking.

\n\n

This is a last-resort convenience function which libgit2 provides for\n allocating and initializing the locks as well as setting the\n locking function to use the system's native locking functions.

\n\n

The locking function will be cleared and the memory will be freed\n when you call git_threads_sutdown().

\n\n

If your programming language has an OpenSSL package/bindings, it\n likely sets up locking. You should very strongly prefer that over\n this function.

\n","group":"openssl"},"git_refdb_init_backend":{"type":"function","file":"sys/refdb_backend.h","line":182,"lineto":184,"args":[{"name":"backend","type":"git_refdb_backend *","comment":null},{"name":"version","type":"unsigned int","comment":"Version of struct; pass `GIT_REFDB_BACKEND_VERSION`"}],"argline":"git_refdb_backend *backend, unsigned int version","sig":"git_refdb_backend *::unsigned int","return":{"type":"int","comment":" Zero on success; -1 on failure."},"description":"

Initializes a git_refdb_backend with default values. Equivalent to\n creating an instance with GIT_REFDB_BACKEND_INIT.

\n","comments":"","group":"refdb"},"git_refdb_backend_fs":{"type":"function","file":"sys/refdb_backend.h","line":197,"lineto":199,"args":[{"name":"backend_out","type":"git_refdb_backend **","comment":"Output pointer to the git_refdb_backend object"},{"name":"repo","type":"git_repository *","comment":"Git repository to access"}],"argline":"git_refdb_backend **backend_out, git_repository *repo","sig":"git_refdb_backend **::git_repository *","return":{"type":"int","comment":" 0 on success, \n<\n0 error code on failure"},"description":"

Constructors for default filesystem-based refdb backend

\n","comments":"

Under normal usage, this is called for you when the repository is\n opened / created, but you can use this to explicitly construct a\n filesystem refdb backend for a repository.

\n","group":"refdb"},"git_refdb_set_backend":{"type":"function","file":"sys/refdb_backend.h","line":211,"lineto":213,"args":[{"name":"refdb","type":"git_refdb *","comment":"database to add the backend to"},{"name":"backend","type":"git_refdb_backend *","comment":"pointer to a git_refdb_backend instance"}],"argline":"git_refdb *refdb, git_refdb_backend *backend","sig":"git_refdb *::git_refdb_backend *","return":{"type":"int","comment":" 0 on success; error code otherwise"},"description":"

Sets the custom backend to an existing reference DB

\n","comments":"

The git_refdb will take ownership of the git_refdb_backend so you\n should NOT free it after calling this function.

\n","group":"refdb"},"git_reference__alloc":{"type":"function","file":"sys/refs.h","line":31,"lineto":34,"args":[{"name":"name","type":"const char *","comment":"the reference name"},{"name":"oid","type":"const git_oid *","comment":"the object id for a direct reference"},{"name":"peel","type":"const git_oid *","comment":"the first non-tag object's OID, or NULL"}],"argline":"const char *name, const git_oid *oid, const git_oid *peel","sig":"const char *::const git_oid *::const git_oid *","return":{"type":"git_reference *","comment":" the created git_reference or NULL on error"},"description":"

Create a new direct reference from an OID.

\n","comments":"","group":"reference"},"git_reference__alloc_symbolic":{"type":"function","file":"sys/refs.h","line":43,"lineto":45,"args":[{"name":"name","type":"const char *","comment":"the reference name"},{"name":"target","type":"const char *","comment":"the target for a symbolic reference"}],"argline":"const char *name, const char *target","sig":"const char *::const char *","return":{"type":"git_reference *","comment":" the created git_reference or NULL on error"},"description":"

Create a new symbolic reference.

\n","comments":"","group":"reference"},"git_repository_new":{"type":"function","file":"sys/repository.h","line":31,"lineto":31,"args":[{"name":"out","type":"git_repository **","comment":"The blank repository"}],"argline":"git_repository **out","sig":"git_repository **","return":{"type":"int","comment":" 0 on success, or an error code"},"description":"

Create a new repository with neither backends nor config object

\n","comments":"

Note that this is only useful if you wish to associate the repository\n with a non-filesystem-backed object database and config store.

\n","group":"repository"},"git_repository__cleanup":{"type":"function","file":"sys/repository.h","line":44,"lineto":44,"args":[{"name":"repo","type":"git_repository *","comment":null}],"argline":"git_repository *repo","sig":"git_repository *","return":{"type":"void","comment":null},"description":"

Reset all the internal state in a repository.

\n","comments":"

This will free all the mapped memory and internal objects\n of the repository and leave it in a "blank" state.

\n\n

There's no need to call this function directly unless you're\n trying to aggressively cleanup the repo before its\n deallocation. git_repository_free already performs this operation\n before deallocation the repo.

\n","group":"repository"},"git_repository_reinit_filesystem":{"type":"function","file":"sys/repository.h","line":61,"lineto":63,"args":[{"name":"repo","type":"git_repository *","comment":"A repository object"},{"name":"recurse_submodules","type":"int","comment":"Should submodules be updated recursively"}],"argline":"git_repository *repo, int recurse_submodules","sig":"git_repository *::int","return":{"type":"int","comment":" 0 on success, \n<\n 0 on error"},"description":"

Update the filesystem config settings for an open repository

\n","comments":"

When a repository is initialized, config values are set based on the\n properties of the filesystem that the repository is on, such as\n "core.ignorecase", "core.filemode", "core.symlinks", etc. If the\n repository is moved to a new filesystem, these properties may no\n longer be correct and API calls may not behave as expected. This\n call reruns the phase of repository initialization that sets those\n properties to compensate for the current filesystem of the repo.

\n","group":"repository"},"git_repository_set_config":{"type":"function","file":"sys/repository.h","line":78,"lineto":78,"args":[{"name":"repo","type":"git_repository *","comment":"A repository object"},{"name":"config","type":"git_config *","comment":"A Config object"}],"argline":"git_repository *repo, git_config *config","sig":"git_repository *::git_config *","return":{"type":"void","comment":null},"description":"

Set the configuration file for this repository

\n","comments":"

This configuration file will be used for all configuration\n queries involving this repository.

\n\n

The repository will keep a reference to the config file;\n the user must still free the config after setting it\n to the repository, or it will leak.

\n","group":"repository"},"git_repository_set_odb":{"type":"function","file":"sys/repository.h","line":93,"lineto":93,"args":[{"name":"repo","type":"git_repository *","comment":"A repository object"},{"name":"odb","type":"git_odb *","comment":"An ODB object"}],"argline":"git_repository *repo, git_odb *odb","sig":"git_repository *::git_odb *","return":{"type":"void","comment":null},"description":"

Set the Object Database for this repository

\n","comments":"

The ODB will be used for all object-related operations\n involving this repository.

\n\n

The repository will keep a reference to the ODB; the user\n must still free the ODB object after setting it to the\n repository, or it will leak.

\n","group":"repository"},"git_repository_set_refdb":{"type":"function","file":"sys/repository.h","line":108,"lineto":108,"args":[{"name":"repo","type":"git_repository *","comment":"A repository object"},{"name":"refdb","type":"git_refdb *","comment":"An refdb object"}],"argline":"git_repository *repo, git_refdb *refdb","sig":"git_repository *::git_refdb *","return":{"type":"void","comment":null},"description":"

Set the Reference Database Backend for this repository

\n","comments":"

The refdb will be used for all reference related operations\n involving this repository.

\n\n

The repository will keep a reference to the refdb; the user\n must still free the refdb object after setting it to the\n repository, or it will leak.

\n","group":"repository"},"git_repository_set_index":{"type":"function","file":"sys/repository.h","line":123,"lineto":123,"args":[{"name":"repo","type":"git_repository *","comment":"A repository object"},{"name":"index","type":"git_index *","comment":"An index object"}],"argline":"git_repository *repo, git_index *index","sig":"git_repository *::git_index *","return":{"type":"void","comment":null},"description":"

Set the index file for this repository

\n","comments":"

This index will be used for all index-related operations\n involving this repository.

\n\n

The repository will keep a reference to the index file;\n the user must still free the index after setting it\n to the repository, or it will leak.

\n","group":"repository"},"git_repository_set_bare":{"type":"function","file":"sys/repository.h","line":136,"lineto":136,"args":[{"name":"repo","type":"git_repository *","comment":"Repo to make bare"}],"argline":"git_repository *repo","sig":"git_repository *","return":{"type":"int","comment":" 0 on success, \n<\n0 on failure"},"description":"

Set a repository to be bare.

\n","comments":"

Clear the working directory and set core.bare to true. You may also\n want to call git_repository_set_index(repo, NULL) since a bare repo\n typically does not have an index, but this function will not do that\n for you.

\n","group":"repository"},"git_transport_init":{"type":"function","file":"sys/transport.h","line":111,"lineto":113,"args":[{"name":"opts","type":"struct git_transport *","comment":"the `git_transport` struct to initialize"},{"name":"version","type":"unsigned int","comment":"Version of struct; pass `GIT_TRANSPORT_VERSION`"}],"argline":"struct git_transport *opts, unsigned int version","sig":"struct git_transport *::unsigned int","return":{"type":"int","comment":" Zero on success; -1 on failure."},"description":"

Initializes a git_transport with default values. Equivalent to\n creating an instance with GIT_TRANSPORT_INIT.

\n","comments":"","group":"transport"},"git_transport_new":{"type":"function","file":"sys/transport.h","line":125,"lineto":125,"args":[{"name":"out","type":"struct git_transport **","comment":"The newly created transport (out)"},{"name":"owner","type":"git_remote *","comment":"The git_remote which will own this transport"},{"name":"url","type":"const char *","comment":"The URL to connect to"}],"argline":"struct git_transport **out, git_remote *owner, const char *url","sig":"struct git_transport **::git_remote *::const char *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Function to use to create a transport from a URL. The transport database\n is scanned to find a transport that implements the scheme of the URI (i.e.\n git:// or http://) and a transport object is returned to the caller.

\n","comments":"","group":"transport"},"git_transport_ssh_with_paths":{"type":"function","file":"sys/transport.h","line":141,"lineto":141,"args":[{"name":"out","type":"struct git_transport **","comment":"the resulting transport"},{"name":"owner","type":"git_remote *","comment":"the owning remote"},{"name":"payload","type":"void *","comment":"a strarray with the paths"}],"argline":"struct git_transport **out, git_remote *owner, void *payload","sig":"struct git_transport **::git_remote *::void *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Create an ssh transport with custom git command paths

\n","comments":"

This is a factory function suitable for setting as the transport\n callback in a remote (or for a clone in the options).

\n\n

The payload argument must be a strarray pointer with the paths for\n the git-upload-pack and git-receive-pack at index 0 and 1.

\n","group":"transport"},"git_transport_unregister":{"type":"function","file":"sys/transport.h","line":169,"lineto":170,"args":[{"name":"prefix","type":"const char *","comment":"From the previous call to git_transport_register"}],"argline":"const char *prefix","sig":"const char *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Unregister a custom transport definition which was previously registered\n with git_transport_register.

\n","comments":"","group":"transport"},"git_transport_dummy":{"type":"function","file":"sys/transport.h","line":183,"lineto":186,"args":[{"name":"out","type":"struct git_transport **","comment":"The newly created transport (out)"},{"name":"owner","type":"git_remote *","comment":"The git_remote which will own this transport"},{"name":"payload","type":"void *","comment":"You must pass NULL for this parameter."}],"argline":"struct git_transport **out, git_remote *owner, void *payload","sig":"struct git_transport **::git_remote *::void *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Create an instance of the dummy transport.

\n","comments":"","group":"transport"},"git_transport_local":{"type":"function","file":"sys/transport.h","line":196,"lineto":199,"args":[{"name":"out","type":"struct git_transport **","comment":"The newly created transport (out)"},{"name":"owner","type":"git_remote *","comment":"The git_remote which will own this transport"},{"name":"payload","type":"void *","comment":"You must pass NULL for this parameter."}],"argline":"struct git_transport **out, git_remote *owner, void *payload","sig":"struct git_transport **::git_remote *::void *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Create an instance of the local transport.

\n","comments":"","group":"transport"},"git_transport_smart":{"type":"function","file":"sys/transport.h","line":209,"lineto":212,"args":[{"name":"out","type":"struct git_transport **","comment":"The newly created transport (out)"},{"name":"owner","type":"git_remote *","comment":"The git_remote which will own this transport"},{"name":"payload","type":"void *","comment":"A pointer to a git_smart_subtransport_definition"}],"argline":"struct git_transport **out, git_remote *owner, void *payload","sig":"struct git_transport **::git_remote *::void *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Create an instance of the smart transport.

\n","comments":"","group":"transport"},"git_smart_subtransport_http":{"type":"function","file":"sys/transport.h","line":322,"lineto":325,"args":[{"name":"out","type":"git_smart_subtransport **","comment":"The newly created subtransport"},{"name":"owner","type":"struct git_transport *","comment":"The smart transport to own this subtransport"},{"name":"param","type":"void *","comment":null}],"argline":"git_smart_subtransport **out, struct git_transport *owner, void *param","sig":"git_smart_subtransport **::struct git_transport *::void *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Create an instance of the http subtransport. This subtransport\n also supports https. On Win32, this subtransport may be implemented\n using the WinHTTP library.

\n","comments":"","group":"smart"},"git_smart_subtransport_git":{"type":"function","file":"sys/transport.h","line":334,"lineto":337,"args":[{"name":"out","type":"git_smart_subtransport **","comment":"The newly created subtransport"},{"name":"owner","type":"struct git_transport *","comment":"The smart transport to own this subtransport"},{"name":"param","type":"void *","comment":null}],"argline":"git_smart_subtransport **out, struct git_transport *owner, void *param","sig":"git_smart_subtransport **::struct git_transport *::void *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Create an instance of the git subtransport.

\n","comments":"","group":"smart"},"git_smart_subtransport_ssh":{"type":"function","file":"sys/transport.h","line":346,"lineto":349,"args":[{"name":"out","type":"git_smart_subtransport **","comment":"The newly created subtransport"},{"name":"owner","type":"struct git_transport *","comment":"The smart transport to own this subtransport"},{"name":"param","type":"void *","comment":null}],"argline":"git_smart_subtransport **out, struct git_transport *owner, void *param","sig":"git_smart_subtransport **::struct git_transport *::void *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Create an instance of the ssh subtransport.

\n","comments":"","group":"smart"},"git_tag_lookup":{"type":"function","file":"tag.h","line":33,"lineto":34,"args":[{"name":"out","type":"git_tag **","comment":"pointer to the looked up tag"},{"name":"repo","type":"git_repository *","comment":"the repo to use when locating the tag."},{"name":"id","type":"const git_oid *","comment":"identity of the tag to locate."}],"argline":"git_tag **out, git_repository *repo, const git_oid *id","sig":"git_tag **::git_repository *::const git_oid *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Lookup a tag object from the repository.

\n","comments":"","group":"tag","examples":{"general.c":["ex/v0.23.0/general.html#git_tag_lookup-70"]}},"git_tag_lookup_prefix":{"type":"function","file":"tag.h","line":48,"lineto":49,"args":[{"name":"out","type":"git_tag **","comment":"pointer to the looked up tag"},{"name":"repo","type":"git_repository *","comment":"the repo to use when locating the tag."},{"name":"id","type":"const git_oid *","comment":"identity of the tag to locate."},{"name":"len","type":"size_t","comment":"the length of the short identifier"}],"argline":"git_tag **out, git_repository *repo, const git_oid *id, size_t len","sig":"git_tag **::git_repository *::const git_oid *::size_t","return":{"type":"int","comment":" 0 or an error code"},"description":"

Lookup a tag object from the repository,\n given a prefix of its identifier (short id).

\n","comments":"","group":"tag"},"git_tag_free":{"type":"function","file":"tag.h","line":61,"lineto":61,"args":[{"name":"tag","type":"git_tag *","comment":"the tag to close"}],"argline":"git_tag *tag","sig":"git_tag *","return":{"type":"void","comment":null},"description":"

Close an open tag

\n","comments":"

You can no longer use the git_tag pointer after this call.

\n\n

IMPORTANT: You MUST call this method when you are through with a tag to\n release memory. Failure to do so will cause a memory leak.

\n","group":"tag"},"git_tag_id":{"type":"function","file":"tag.h","line":69,"lineto":69,"args":[{"name":"tag","type":"const git_tag *","comment":"a previously loaded tag."}],"argline":"const git_tag *tag","sig":"const git_tag *","return":{"type":"const git_oid *","comment":" object identity for the tag."},"description":"

Get the id of a tag.

\n","comments":"","group":"tag"},"git_tag_owner":{"type":"function","file":"tag.h","line":77,"lineto":77,"args":[{"name":"tag","type":"const git_tag *","comment":"A previously loaded tag."}],"argline":"const git_tag *tag","sig":"const git_tag *","return":{"type":"git_repository *","comment":" Repository that contains this tag."},"description":"

Get the repository that contains the tag.

\n","comments":"","group":"tag"},"git_tag_target":{"type":"function","file":"tag.h","line":89,"lineto":89,"args":[{"name":"target_out","type":"git_object **","comment":"pointer where to store the target"},{"name":"tag","type":"const git_tag *","comment":"a previously loaded tag."}],"argline":"git_object **target_out, const git_tag *tag","sig":"git_object **::const git_tag *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Get the tagged object of a tag

\n","comments":"

This method performs a repository lookup for the\n given object and returns it

\n","group":"tag","examples":{"general.c":["ex/v0.23.0/general.html#git_tag_target-71"]}},"git_tag_target_id":{"type":"function","file":"tag.h","line":97,"lineto":97,"args":[{"name":"tag","type":"const git_tag *","comment":"a previously loaded tag."}],"argline":"const git_tag *tag","sig":"const git_tag *","return":{"type":"const git_oid *","comment":" pointer to the OID"},"description":"

Get the OID of the tagged object of a tag

\n","comments":"","group":"tag","examples":{"cat-file.c":["ex/v0.23.0/cat-file.html#git_tag_target_id-35"]}},"git_tag_target_type":{"type":"function","file":"tag.h","line":105,"lineto":105,"args":[{"name":"tag","type":"const git_tag *","comment":"a previously loaded tag."}],"argline":"const git_tag *tag","sig":"const git_tag *","return":{"type":"git_otype","comment":" type of the tagged object"},"description":"

Get the type of a tag's tagged object

\n","comments":"","group":"tag","examples":{"cat-file.c":["ex/v0.23.0/cat-file.html#git_tag_target_type-36"],"general.c":["ex/v0.23.0/general.html#git_tag_target_type-72"]}},"git_tag_name":{"type":"function","file":"tag.h","line":113,"lineto":113,"args":[{"name":"tag","type":"const git_tag *","comment":"a previously loaded tag."}],"argline":"const git_tag *tag","sig":"const git_tag *","return":{"type":"const char *","comment":" name of the tag"},"description":"

Get the name of a tag

\n","comments":"","group":"tag","examples":{"cat-file.c":["ex/v0.23.0/cat-file.html#git_tag_name-37"],"general.c":["ex/v0.23.0/general.html#git_tag_name-73"],"tag.c":["ex/v0.23.0/tag.html#git_tag_name-20"]}},"git_tag_tagger":{"type":"function","file":"tag.h","line":121,"lineto":121,"args":[{"name":"tag","type":"const git_tag *","comment":"a previously loaded tag."}],"argline":"const git_tag *tag","sig":"const git_tag *","return":{"type":"const git_signature *","comment":" reference to the tag's author or NULL when unspecified"},"description":"

Get the tagger (author) of a tag

\n","comments":"","group":"tag","examples":{"cat-file.c":["ex/v0.23.0/cat-file.html#git_tag_tagger-38"]}},"git_tag_message":{"type":"function","file":"tag.h","line":129,"lineto":129,"args":[{"name":"tag","type":"const git_tag *","comment":"a previously loaded tag."}],"argline":"const git_tag *tag","sig":"const git_tag *","return":{"type":"const char *","comment":" message of the tag or NULL when unspecified"},"description":"

Get the message of a tag

\n","comments":"","group":"tag","examples":{"cat-file.c":["ex/v0.23.0/cat-file.html#git_tag_message-39","ex/v0.23.0/cat-file.html#git_tag_message-40"],"general.c":["ex/v0.23.0/general.html#git_tag_message-74"],"tag.c":["ex/v0.23.0/tag.html#git_tag_message-21"]}},"git_tag_create":{"type":"function","file":"tag.h","line":171,"lineto":178,"args":[{"name":"oid","type":"git_oid *","comment":"Pointer where to store the OID of the\n newly created tag. If the tag already exists, this parameter\n will be the oid of the existing tag, and the function will\n return a GIT_EEXISTS error code."},{"name":"repo","type":"git_repository *","comment":"Repository where to store the tag"},{"name":"tag_name","type":"const char *","comment":"Name for the tag; this name is validated\n for consistency. It should also not conflict with an\n already existing tag name"},{"name":"target","type":"const git_object *","comment":"Object to which this tag points. This object\n must belong to the given `repo`."},{"name":"tagger","type":"const git_signature *","comment":"Signature of the tagger for this tag, and\n of the tagging time"},{"name":"message","type":"const char *","comment":"Full message for this tag"},{"name":"force","type":"int","comment":"Overwrite existing references"}],"argline":"git_oid *oid, git_repository *repo, const char *tag_name, const git_object *target, const git_signature *tagger, const char *message, int force","sig":"git_oid *::git_repository *::const char *::const git_object *::const git_signature *::const char *::int","return":{"type":"int","comment":" 0 on success, GIT_EINVALIDSPEC or an error code\n\tA tag object is written to the ODB, and a proper reference\n\tis written in the /refs/tags folder, pointing to it"},"description":"

Create a new tag in the repository from an object

\n","comments":"

A new reference will also be created pointing to\n this tag object. If force is true and a reference\n already exists with the given name, it'll be replaced.

\n\n

The message will not be cleaned up. This can be achieved\n through git_message_prettify().

\n\n

The tag name will be checked for validity. You must avoid\n the characters '~', '^', ':', '\n\\\n', '?', '[', and '*', and the\n sequences ".." and "\n@\n{" which have special meaning to revparse.

\n","group":"tag","examples":{"tag.c":["ex/v0.23.0/tag.html#git_tag_create-22"]}},"git_tag_annotation_create":{"type":"function","file":"tag.h","line":203,"lineto":209,"args":[{"name":"oid","type":"git_oid *","comment":"Pointer where to store the OID of the\n newly created tag"},{"name":"repo","type":"git_repository *","comment":"Repository where to store the tag"},{"name":"tag_name","type":"const char *","comment":"Name for the tag"},{"name":"target","type":"const git_object *","comment":"Object to which this tag points. This object\n must belong to the given `repo`."},{"name":"tagger","type":"const git_signature *","comment":"Signature of the tagger for this tag, and\n of the tagging time"},{"name":"message","type":"const char *","comment":"Full message for this tag"}],"argline":"git_oid *oid, git_repository *repo, const char *tag_name, const git_object *target, const git_signature *tagger, const char *message","sig":"git_oid *::git_repository *::const char *::const git_object *::const git_signature *::const char *","return":{"type":"int","comment":" 0 on success or an error code"},"description":"

Create a new tag in the object database pointing to a git_object

\n","comments":"

The message will not be cleaned up. This can be achieved\n through git_message_prettify().

\n","group":"tag"},"git_tag_create_frombuffer":{"type":"function","file":"tag.h","line":220,"lineto":224,"args":[{"name":"oid","type":"git_oid *","comment":"Pointer where to store the OID of the newly created tag"},{"name":"repo","type":"git_repository *","comment":"Repository where to store the tag"},{"name":"buffer","type":"const char *","comment":"Raw tag data"},{"name":"force","type":"int","comment":"Overwrite existing tags"}],"argline":"git_oid *oid, git_repository *repo, const char *buffer, int force","sig":"git_oid *::git_repository *::const char *::int","return":{"type":"int","comment":" 0 on success; error code otherwise"},"description":"

Create a new tag in the repository from a buffer

\n","comments":"","group":"tag"},"git_tag_create_lightweight":{"type":"function","file":"tag.h","line":256,"lineto":261,"args":[{"name":"oid","type":"git_oid *","comment":"Pointer where to store the OID of the provided\n target object. If the tag already exists, this parameter\n will be filled with the oid of the existing pointed object\n and the function will return a GIT_EEXISTS error code."},{"name":"repo","type":"git_repository *","comment":"Repository where to store the lightweight tag"},{"name":"tag_name","type":"const char *","comment":"Name for the tag; this name is validated\n for consistency. It should also not conflict with an\n already existing tag name"},{"name":"target","type":"const git_object *","comment":"Object to which this tag points. This object\n must belong to the given `repo`."},{"name":"force","type":"int","comment":"Overwrite existing references"}],"argline":"git_oid *oid, git_repository *repo, const char *tag_name, const git_object *target, int force","sig":"git_oid *::git_repository *::const char *::const git_object *::int","return":{"type":"int","comment":" 0 on success, GIT_EINVALIDSPEC or an error code\n\tA proper reference is written in the /refs/tags folder,\n pointing to the provided target object"},"description":"

Create a new lightweight tag pointing at a target object

\n","comments":"

A new direct reference will be created pointing to\n this target object. If force is true and a reference\n already exists with the given name, it'll be replaced.

\n\n

The tag name will be checked for validity.\n See git_tag_create() for rules about valid names.

\n","group":"tag","examples":{"tag.c":["ex/v0.23.0/tag.html#git_tag_create_lightweight-23"]}},"git_tag_delete":{"type":"function","file":"tag.h","line":276,"lineto":278,"args":[{"name":"repo","type":"git_repository *","comment":"Repository where lives the tag"},{"name":"tag_name","type":"const char *","comment":"Name of the tag to be deleted;\n this name is validated for consistency."}],"argline":"git_repository *repo, const char *tag_name","sig":"git_repository *::const char *","return":{"type":"int","comment":" 0 on success, GIT_EINVALIDSPEC or an error code"},"description":"

Delete an existing tag reference.

\n","comments":"

The tag name will be checked for validity.\n See git_tag_create() for rules about valid names.

\n","group":"tag","examples":{"tag.c":["ex/v0.23.0/tag.html#git_tag_delete-24"]}},"git_tag_list":{"type":"function","file":"tag.h","line":293,"lineto":295,"args":[{"name":"tag_names","type":"git_strarray *","comment":"Pointer to a git_strarray structure where\n\t\tthe tag names will be stored"},{"name":"repo","type":"git_repository *","comment":"Repository where to find the tags"}],"argline":"git_strarray *tag_names, git_repository *repo","sig":"git_strarray *::git_repository *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Fill a list with all the tags in the Repository

\n","comments":"

The string array will be filled with the names of the\n matching tags; these values are owned by the user and\n should be free'd manually when no longer needed, using\n git_strarray_free.

\n","group":"tag"},"git_tag_list_match":{"type":"function","file":"tag.h","line":315,"lineto":318,"args":[{"name":"tag_names","type":"git_strarray *","comment":"Pointer to a git_strarray structure where\n\t\tthe tag names will be stored"},{"name":"pattern","type":"const char *","comment":"Standard fnmatch pattern"},{"name":"repo","type":"git_repository *","comment":"Repository where to find the tags"}],"argline":"git_strarray *tag_names, const char *pattern, git_repository *repo","sig":"git_strarray *::const char *::git_repository *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Fill a list with all the tags in the Repository\n which name match a defined pattern

\n","comments":"

If an empty pattern is provided, all the tags\n will be returned.

\n\n

The string array will be filled with the names of the\n matching tags; these values are owned by the user and\n should be free'd manually when no longer needed, using\n git_strarray_free.

\n","group":"tag","examples":{"tag.c":["ex/v0.23.0/tag.html#git_tag_list_match-25"]}},"git_tag_foreach":{"type":"function","file":"tag.h","line":330,"lineto":333,"args":[{"name":"repo","type":"git_repository *","comment":"Repository"},{"name":"callback","type":"git_tag_foreach_cb","comment":"Callback function"},{"name":"payload","type":"void *","comment":"Pointer to callback data (optional)"}],"argline":"git_repository *repo, git_tag_foreach_cb callback, void *payload","sig":"git_repository *::git_tag_foreach_cb::void *","return":{"type":"int","comment":null},"description":"

Call callback `cb' for each tag in the repository

\n","comments":"","group":"tag"},"git_tag_peel":{"type":"function","file":"tag.h","line":346,"lineto":348,"args":[{"name":"tag_target_out","type":"git_object **","comment":"Pointer to the peeled git_object"},{"name":"tag","type":"const git_tag *","comment":"The tag to be processed"}],"argline":"git_object **tag_target_out, const git_tag *tag","sig":"git_object **::const git_tag *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Recursively peel a tag until a non tag git_object is found

\n","comments":"

The retrieved tag_target object is owned by the repository\n and should be closed with the git_object_free method.

\n","group":"tag"},"git_trace_set":{"type":"function","file":"trace.h","line":63,"lineto":63,"args":[{"name":"level","type":"git_trace_level_t","comment":"Level to set tracing to"},{"name":"cb","type":"git_trace_callback","comment":"Function to call with trace data"}],"argline":"git_trace_level_t level, git_trace_callback cb","sig":"git_trace_level_t::git_trace_callback","return":{"type":"int","comment":" 0 or an error code"},"description":"

Sets the system tracing configuration to the specified level with the\n specified callback. When system events occur at a level equal to, or\n lower than, the given level they will be reported to the given callback.

\n","comments":"","group":"trace"},"git_cred_has_username":{"type":"function","file":"transport.h","line":197,"lineto":197,"args":[{"name":"cred","type":"git_cred *","comment":"object to check"}],"argline":"git_cred *cred","sig":"git_cred *","return":{"type":"int","comment":" 1 if the credential object has non-NULL username, 0 otherwise"},"description":"

Check whether a credential object contains username information.

\n","comments":"","group":"cred"},"git_cred_userpass_plaintext_new":{"type":"function","file":"transport.h","line":208,"lineto":211,"args":[{"name":"out","type":"git_cred **","comment":"The newly created credential object."},{"name":"username","type":"const char *","comment":"The username of the credential."},{"name":"password","type":"const char *","comment":"The password of the credential."}],"argline":"git_cred **out, const char *username, const char *password","sig":"git_cred **::const char *::const char *","return":{"type":"int","comment":" 0 for success or an error code for failure"},"description":"

Create a new plain-text username and password credential object.\n The supplied credential parameter will be internally duplicated.

\n","comments":"","group":"cred"},"git_cred_ssh_key_new":{"type":"function","file":"transport.h","line":224,"lineto":229,"args":[{"name":"out","type":"git_cred **","comment":"The newly created credential object."},{"name":"username","type":"const char *","comment":"username to use to authenticate"},{"name":"publickey","type":"const char *","comment":"The path to the public key of the credential."},{"name":"privatekey","type":"const char *","comment":"The path to the private key of the credential."},{"name":"passphrase","type":"const char *","comment":"The passphrase of the credential."}],"argline":"git_cred **out, const char *username, const char *publickey, const char *privatekey, const char *passphrase","sig":"git_cred **::const char *::const char *::const char *::const char *","return":{"type":"int","comment":" 0 for success or an error code for failure"},"description":"

Create a new passphrase-protected ssh key credential object.\n The supplied credential parameter will be internally duplicated.

\n","comments":"","group":"cred"},"git_cred_ssh_interactive_new":{"type":"function","file":"transport.h","line":240,"lineto":244,"args":[{"name":"out","type":"git_cred **","comment":null},{"name":"username","type":"const char *","comment":"Username to use to authenticate."},{"name":"prompt_callback","type":"git_cred_ssh_interactive_callback","comment":"The callback method used for prompts."},{"name":"payload","type":"void *","comment":"Additional data to pass to the callback."}],"argline":"git_cred **out, const char *username, git_cred_ssh_interactive_callback prompt_callback, void *payload","sig":"git_cred **::const char *::git_cred_ssh_interactive_callback::void *","return":{"type":"int","comment":" 0 for success or an error code for failure."},"description":"

Create a new ssh keyboard-interactive based credential object.\n The supplied credential parameter will be internally duplicated.

\n","comments":"","group":"cred"},"git_cred_ssh_key_from_agent":{"type":"function","file":"transport.h","line":254,"lineto":256,"args":[{"name":"out","type":"git_cred **","comment":"The newly created credential object."},{"name":"username","type":"const char *","comment":"username to use to authenticate"}],"argline":"git_cred **out, const char *username","sig":"git_cred **::const char *","return":{"type":"int","comment":" 0 for success or an error code for failure"},"description":"

Create a new ssh key credential object used for querying an ssh-agent.\n The supplied credential parameter will be internally duplicated.

\n","comments":"","group":"cred"},"git_cred_ssh_custom_new":{"type":"function","file":"transport.h","line":276,"lineto":282,"args":[{"name":"out","type":"git_cred **","comment":"The newly created credential object."},{"name":"username","type":"const char *","comment":"username to use to authenticate"},{"name":"publickey","type":"const char *","comment":"The bytes of the public key."},{"name":"publickey_len","type":"size_t","comment":"The length of the public key in bytes."},{"name":"sign_callback","type":"git_cred_sign_callback","comment":"The callback method to sign the data during the challenge."},{"name":"payload","type":"void *","comment":"Additional data to pass to the callback."}],"argline":"git_cred **out, const char *username, const char *publickey, size_t publickey_len, git_cred_sign_callback sign_callback, void *payload","sig":"git_cred **::const char *::const char *::size_t::git_cred_sign_callback::void *","return":{"type":"int","comment":" 0 for success or an error code for failure"},"description":"

Create an ssh key credential with a custom signing function.

\n","comments":"

This lets you use your own function to sign the challenge.

\n\n

This function and its credential type is provided for completeness\n and wraps libssh2_userauth_publickey(), which is undocumented.

\n\n

The supplied credential parameter will be internally duplicated.

\n","group":"cred"},"git_cred_default_new":{"type":"function","file":"transport.h","line":290,"lineto":290,"args":[{"name":"out","type":"git_cred **","comment":null}],"argline":"git_cred **out","sig":"git_cred **","return":{"type":"int","comment":" 0 for success or an error code for failure"},"description":"

Create a "default" credential usable for Negotiate mechanisms like NTLM\n or Kerberos authentication.

\n","comments":"","group":"cred"},"git_cred_username_new":{"type":"function","file":"transport.h","line":298,"lineto":298,"args":[{"name":"cred","type":"git_cred **","comment":null},{"name":"username","type":"const char *","comment":null}],"argline":"git_cred **cred, const char *username","sig":"git_cred **::const char *","return":{"type":"int","comment":null},"description":"

Create a credential to specify a username.

\n","comments":"

This is used with ssh authentication to query for the username if\n none is specified in the url.

\n","group":"cred"},"git_cred_ssh_key_memory_new":{"type":"function","file":"transport.h","line":310,"lineto":315,"args":[{"name":"out","type":"git_cred **","comment":"The newly created credential object."},{"name":"username","type":"const char *","comment":"username to use to authenticate."},{"name":"publickey","type":"const char *","comment":"The public key of the credential."},{"name":"privatekey","type":"const char *","comment":"The private key of the credential."},{"name":"passphrase","type":"const char *","comment":"The passphrase of the credential."}],"argline":"git_cred **out, const char *username, const char *publickey, const char *privatekey, const char *passphrase","sig":"git_cred **::const char *::const char *::const char *::const char *","return":{"type":"int","comment":" 0 for success or an error code for failure"},"description":"

Create a new ssh key credential object reading the keys from memory.

\n","comments":"","group":"cred"},"git_tree_lookup":{"type":"function","file":"tree.h","line":32,"lineto":33,"args":[{"name":"out","type":"git_tree **","comment":"Pointer to the looked up tree"},{"name":"repo","type":"git_repository *","comment":"The repo to use when locating the tree."},{"name":"id","type":"const git_oid *","comment":"Identity of the tree to locate."}],"argline":"git_tree **out, git_repository *repo, const git_oid *id","sig":"git_tree **::git_repository *::const git_oid *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Lookup a tree object from the repository.

\n","comments":"","group":"tree","examples":{"general.c":["ex/v0.23.0/general.html#git_tree_lookup-75","ex/v0.23.0/general.html#git_tree_lookup-76"],"init.c":["ex/v0.23.0/init.html#git_tree_lookup-14"]}},"git_tree_lookup_prefix":{"type":"function","file":"tree.h","line":47,"lineto":51,"args":[{"name":"out","type":"git_tree **","comment":"pointer to the looked up tree"},{"name":"repo","type":"git_repository *","comment":"the repo to use when locating the tree."},{"name":"id","type":"const git_oid *","comment":"identity of the tree to locate."},{"name":"len","type":"size_t","comment":"the length of the short identifier"}],"argline":"git_tree **out, git_repository *repo, const git_oid *id, size_t len","sig":"git_tree **::git_repository *::const git_oid *::size_t","return":{"type":"int","comment":" 0 or an error code"},"description":"

Lookup a tree object from the repository,\n given a prefix of its identifier (short id).

\n","comments":"","group":"tree"},"git_tree_free":{"type":"function","file":"tree.h","line":63,"lineto":63,"args":[{"name":"tree","type":"git_tree *","comment":"The tree to close"}],"argline":"git_tree *tree","sig":"git_tree *","return":{"type":"void","comment":null},"description":"

Close an open tree

\n","comments":"

You can no longer use the git_tree pointer after this call.

\n\n

IMPORTANT: You MUST call this method when you stop using a tree to\n release memory. Failure to do so will cause a memory leak.

\n","group":"tree","examples":{"diff.c":["ex/v0.23.0/diff.html#git_tree_free-17","ex/v0.23.0/diff.html#git_tree_free-18"],"init.c":["ex/v0.23.0/init.html#git_tree_free-15"],"log.c":["ex/v0.23.0/log.html#git_tree_free-58","ex/v0.23.0/log.html#git_tree_free-59","ex/v0.23.0/log.html#git_tree_free-60","ex/v0.23.0/log.html#git_tree_free-61","ex/v0.23.0/log.html#git_tree_free-62"]}},"git_tree_id":{"type":"function","file":"tree.h","line":71,"lineto":71,"args":[{"name":"tree","type":"const git_tree *","comment":"a previously loaded tree."}],"argline":"const git_tree *tree","sig":"const git_tree *","return":{"type":"const git_oid *","comment":" object identity for the tree."},"description":"

Get the id of a tree.

\n","comments":"","group":"tree"},"git_tree_owner":{"type":"function","file":"tree.h","line":79,"lineto":79,"args":[{"name":"tree","type":"const git_tree *","comment":"A previously loaded tree."}],"argline":"const git_tree *tree","sig":"const git_tree *","return":{"type":"git_repository *","comment":" Repository that contains this tree."},"description":"

Get the repository that contains the tree.

\n","comments":"","group":"tree"},"git_tree_entrycount":{"type":"function","file":"tree.h","line":87,"lineto":87,"args":[{"name":"tree","type":"const git_tree *","comment":"a previously loaded tree."}],"argline":"const git_tree *tree","sig":"const git_tree *","return":{"type":"size_t","comment":" the number of entries in the tree"},"description":"

Get the number of entries listed in a tree

\n","comments":"","group":"tree","examples":{"cat-file.c":["ex/v0.23.0/cat-file.html#git_tree_entrycount-41"],"general.c":["ex/v0.23.0/general.html#git_tree_entrycount-77"]}},"git_tree_entry_byname":{"type":"function","file":"tree.h","line":99,"lineto":100,"args":[{"name":"tree","type":"const git_tree *","comment":"a previously loaded tree."},{"name":"filename","type":"const char *","comment":"the filename of the desired entry"}],"argline":"const git_tree *tree, const char *filename","sig":"const git_tree *::const char *","return":{"type":"const git_tree_entry *","comment":" the tree entry; NULL if not found"},"description":"

Lookup a tree entry by its filename

\n","comments":"

This returns a git_tree_entry that is owned by the git_tree. You don't\n have to free it, but you must not use it after the git_tree is released.

\n","group":"tree","examples":{"general.c":["ex/v0.23.0/general.html#git_tree_entry_byname-78"]}},"git_tree_entry_byindex":{"type":"function","file":"tree.h","line":112,"lineto":113,"args":[{"name":"tree","type":"const git_tree *","comment":"a previously loaded tree."},{"name":"idx","type":"size_t","comment":"the position in the entry list"}],"argline":"const git_tree *tree, size_t idx","sig":"const git_tree *::size_t","return":{"type":"const git_tree_entry *","comment":" the tree entry; NULL if not found"},"description":"

Lookup a tree entry by its position in the tree

\n","comments":"

This returns a git_tree_entry that is owned by the git_tree. You don't\n have to free it, but you must not use it after the git_tree is released.

\n","group":"tree","examples":{"cat-file.c":["ex/v0.23.0/cat-file.html#git_tree_entry_byindex-42"],"general.c":["ex/v0.23.0/general.html#git_tree_entry_byindex-79"]}},"git_tree_entry_byid":{"type":"function","file":"tree.h","line":127,"lineto":128,"args":[{"name":"tree","type":"const git_tree *","comment":"a previously loaded tree."},{"name":"id","type":"const git_oid *","comment":"the sha being looked for"}],"argline":"const git_tree *tree, const git_oid *id","sig":"const git_tree *::const git_oid *","return":{"type":"const git_tree_entry *","comment":" the tree entry; NULL if not found"},"description":"

Lookup a tree entry by SHA value.

\n","comments":"

This returns a git_tree_entry that is owned by the git_tree. You don't\n have to free it, but you must not use it after the git_tree is released.

\n\n

Warning: this must examine every entry in the tree, so it is not fast.

\n","group":"tree"},"git_tree_entry_bypath":{"type":"function","file":"tree.h","line":142,"lineto":145,"args":[{"name":"out","type":"git_tree_entry **","comment":"Pointer where to store the tree entry"},{"name":"root","type":"const git_tree *","comment":"Previously loaded tree which is the root of the relative path"},{"name":"path","type":"const char *","comment":"Path to the contained entry"}],"argline":"git_tree_entry **out, const git_tree *root, const char *path","sig":"git_tree_entry **::const git_tree *::const char *","return":{"type":"int","comment":" 0 on success; GIT_ENOTFOUND if the path does not exist"},"description":"

Retrieve a tree entry contained in a tree or in any of its subtrees,\n given its relative path.

\n","comments":"

Unlike the other lookup functions, the returned tree entry is owned by\n the user and must be freed explicitly with git_tree_entry_free().

\n","group":"tree"},"git_tree_entry_dup":{"type":"function","file":"tree.h","line":157,"lineto":157,"args":[{"name":"dest","type":"git_tree_entry **","comment":"pointer where to store the copy"},{"name":"source","type":"const git_tree_entry *","comment":"tree entry to duplicate"}],"argline":"git_tree_entry **dest, const git_tree_entry *source","sig":"git_tree_entry **::const git_tree_entry *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Duplicate a tree entry

\n","comments":"

Create a copy of a tree entry. The returned copy is owned by the user,\n and must be freed explicitly with git_tree_entry_free().

\n","group":"tree"},"git_tree_entry_free":{"type":"function","file":"tree.h","line":168,"lineto":168,"args":[{"name":"entry","type":"git_tree_entry *","comment":"The entry to free"}],"argline":"git_tree_entry *entry","sig":"git_tree_entry *","return":{"type":"void","comment":null},"description":"

Free a user-owned tree entry

\n","comments":"

IMPORTANT: This function is only needed for tree entries owned by the\n user, such as the ones returned by git_tree_entry_dup() or\n git_tree_entry_bypath().

\n","group":"tree"},"git_tree_entry_name":{"type":"function","file":"tree.h","line":176,"lineto":176,"args":[{"name":"entry","type":"const git_tree_entry *","comment":"a tree entry"}],"argline":"const git_tree_entry *entry","sig":"const git_tree_entry *","return":{"type":"const char *","comment":" the name of the file"},"description":"

Get the filename of a tree entry

\n","comments":"","group":"tree","examples":{"cat-file.c":["ex/v0.23.0/cat-file.html#git_tree_entry_name-43"],"general.c":["ex/v0.23.0/general.html#git_tree_entry_name-80","ex/v0.23.0/general.html#git_tree_entry_name-81"]}},"git_tree_entry_id":{"type":"function","file":"tree.h","line":184,"lineto":184,"args":[{"name":"entry","type":"const git_tree_entry *","comment":"a tree entry"}],"argline":"const git_tree_entry *entry","sig":"const git_tree_entry *","return":{"type":"const git_oid *","comment":" the oid of the object"},"description":"

Get the id of the object pointed by the entry

\n","comments":"","group":"tree","examples":{"cat-file.c":["ex/v0.23.0/cat-file.html#git_tree_entry_id-44"]}},"git_tree_entry_type":{"type":"function","file":"tree.h","line":192,"lineto":192,"args":[{"name":"entry","type":"const git_tree_entry *","comment":"a tree entry"}],"argline":"const git_tree_entry *entry","sig":"const git_tree_entry *","return":{"type":"git_otype","comment":" the type of the pointed object"},"description":"

Get the type of the object pointed by the entry

\n","comments":"","group":"tree","examples":{"cat-file.c":["ex/v0.23.0/cat-file.html#git_tree_entry_type-45"]}},"git_tree_entry_filemode":{"type":"function","file":"tree.h","line":200,"lineto":200,"args":[{"name":"entry","type":"const git_tree_entry *","comment":"a tree entry"}],"argline":"const git_tree_entry *entry","sig":"const git_tree_entry *","return":{"type":"git_filemode_t","comment":" filemode as an integer"},"description":"

Get the UNIX file attributes of a tree entry

\n","comments":"","group":"tree","examples":{"cat-file.c":["ex/v0.23.0/cat-file.html#git_tree_entry_filemode-46"]}},"git_tree_entry_filemode_raw":{"type":"function","file":"tree.h","line":212,"lineto":212,"args":[{"name":"entry","type":"const git_tree_entry *","comment":"a tree entry"}],"argline":"const git_tree_entry *entry","sig":"const git_tree_entry *","return":{"type":"git_filemode_t","comment":" filemode as an integer"},"description":"

Get the raw UNIX file attributes of a tree entry

\n","comments":"

This function does not perform any normalization and is only useful\n if you need to be able to recreate the original tree object.

\n","group":"tree"},"git_tree_entry_cmp":{"type":"function","file":"tree.h","line":220,"lineto":220,"args":[{"name":"e1","type":"const git_tree_entry *","comment":"first tree entry"},{"name":"e2","type":"const git_tree_entry *","comment":"second tree entry"}],"argline":"const git_tree_entry *e1, const git_tree_entry *e2","sig":"const git_tree_entry *::const git_tree_entry *","return":{"type":"int","comment":" \n<\n0 if e1 is before e2, 0 if e1 == e2, >0 if e1 is after e2"},"description":"

Compare two tree entries

\n","comments":"","group":"tree"},"git_tree_entry_to_object":{"type":"function","file":"tree.h","line":232,"lineto":235,"args":[{"name":"object_out","type":"git_object **","comment":"pointer to the converted object"},{"name":"repo","type":"git_repository *","comment":"repository where to lookup the pointed object"},{"name":"entry","type":"const git_tree_entry *","comment":"a tree entry"}],"argline":"git_object **object_out, git_repository *repo, const git_tree_entry *entry","sig":"git_object **::git_repository *::const git_tree_entry *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Convert a tree entry to the git_object it points to.

\n","comments":"

You must call git_object_free() on the object when you are done with it.

\n","group":"tree","examples":{"general.c":["ex/v0.23.0/general.html#git_tree_entry_to_object-82"]}},"git_treebuilder_new":{"type":"function","file":"tree.h","line":254,"lineto":255,"args":[{"name":"out","type":"git_treebuilder **","comment":"Pointer where to store the tree builder"},{"name":"repo","type":"git_repository *","comment":"Repository in which to store the object"},{"name":"source","type":"const git_tree *","comment":"Source tree to initialize the builder (optional)"}],"argline":"git_treebuilder **out, git_repository *repo, const git_tree *source","sig":"git_treebuilder **::git_repository *::const git_tree *","return":{"type":"int","comment":" 0 on success; error code otherwise"},"description":"

Create a new tree builder.

\n","comments":"

The tree builder can be used to create or modify trees in memory and\n write them as tree objects to the database.

\n\n

If the source parameter is not NULL, the tree builder will be\n initialized with the entries of the given tree.

\n\n

If the source parameter is NULL, the tree builder will start with no\n entries and will have to be filled manually.

\n","group":"treebuilder"},"git_treebuilder_clear":{"type":"function","file":"tree.h","line":262,"lineto":262,"args":[{"name":"bld","type":"git_treebuilder *","comment":"Builder to clear"}],"argline":"git_treebuilder *bld","sig":"git_treebuilder *","return":{"type":"void","comment":null},"description":"

Clear all the entires in the builder

\n","comments":"","group":"treebuilder"},"git_treebuilder_entrycount":{"type":"function","file":"tree.h","line":270,"lineto":270,"args":[{"name":"bld","type":"git_treebuilder *","comment":"a previously loaded treebuilder."}],"argline":"git_treebuilder *bld","sig":"git_treebuilder *","return":{"type":"unsigned int","comment":" the number of entries in the treebuilder"},"description":"

Get the number of entries listed in a treebuilder

\n","comments":"","group":"treebuilder"},"git_treebuilder_free":{"type":"function","file":"tree.h","line":281,"lineto":281,"args":[{"name":"bld","type":"git_treebuilder *","comment":"Builder to free"}],"argline":"git_treebuilder *bld","sig":"git_treebuilder *","return":{"type":"void","comment":null},"description":"

Free a tree builder

\n","comments":"

This will clear all the entries and free to builder.\n Failing to free the builder after you're done using it\n will result in a memory leak

\n","group":"treebuilder"},"git_treebuilder_get":{"type":"function","file":"tree.h","line":293,"lineto":294,"args":[{"name":"bld","type":"git_treebuilder *","comment":"Tree builder"},{"name":"filename","type":"const char *","comment":"Name of the entry"}],"argline":"git_treebuilder *bld, const char *filename","sig":"git_treebuilder *::const char *","return":{"type":"const git_tree_entry *","comment":" pointer to the entry; NULL if not found"},"description":"

Get an entry from the builder from its filename

\n","comments":"

The returned entry is owned by the builder and should\n not be freed manually.

\n","group":"treebuilder"},"git_treebuilder_insert":{"type":"function","file":"tree.h","line":323,"lineto":328,"args":[{"name":"out","type":"const git_tree_entry **","comment":"Pointer to store the entry (optional)"},{"name":"bld","type":"git_treebuilder *","comment":"Tree builder"},{"name":"filename","type":"const char *","comment":"Filename of the entry"},{"name":"id","type":"const git_oid *","comment":"SHA1 oid of the entry"},{"name":"filemode","type":"git_filemode_t","comment":"Folder attributes of the entry. This parameter must\n\t\t\tbe valued with one of the following entries: 0040000, 0100644,\n\t\t\t0100755, 0120000 or 0160000."}],"argline":"const git_tree_entry **out, git_treebuilder *bld, const char *filename, const git_oid *id, git_filemode_t filemode","sig":"const git_tree_entry **::git_treebuilder *::const char *::const git_oid *::git_filemode_t","return":{"type":"int","comment":" 0 or an error code"},"description":"

Add or update an entry to the builder

\n","comments":"

Insert a new entry for filename in the builder with the\n given attributes.

\n\n

If an entry named filename already exists, its attributes\n will be updated with the given ones.

\n\n

The optional pointer out can be used to retrieve a pointer to the\n newly created/updated entry. Pass NULL if you do not need it. The\n pointer may not be valid past the next operation in this\n builder. Duplicate the entry if you want to keep it.

\n\n

No attempt is being made to ensure that the provided oid points\n to an existing git object in the object database, nor that the\n attributes make sense regarding the type of the pointed at object.

\n","group":"treebuilder"},"git_treebuilder_remove":{"type":"function","file":"tree.h","line":336,"lineto":337,"args":[{"name":"bld","type":"git_treebuilder *","comment":"Tree builder"},{"name":"filename","type":"const char *","comment":"Filename of the entry to remove"}],"argline":"git_treebuilder *bld, const char *filename","sig":"git_treebuilder *::const char *","return":{"type":"int","comment":null},"description":"

Remove an entry from the builder by its filename

\n","comments":"","group":"treebuilder"},"git_treebuilder_filter":{"type":"function","file":"tree.h","line":360,"lineto":363,"args":[{"name":"bld","type":"git_treebuilder *","comment":"Tree builder"},{"name":"filter","type":"git_treebuilder_filter_cb","comment":"Callback to filter entries"},{"name":"payload","type":"void *","comment":"Extra data to pass to filter callback"}],"argline":"git_treebuilder *bld, git_treebuilder_filter_cb filter, void *payload","sig":"git_treebuilder *::git_treebuilder_filter_cb::void *","return":{"type":"void","comment":null},"description":"

Selectively remove entries in the tree

\n","comments":"

The filter callback will be called for each entry in the tree with a\n pointer to the entry and the provided payload; if the callback returns\n non-zero, the entry will be filtered (removed from the builder).

\n","group":"treebuilder"},"git_treebuilder_write":{"type":"function","file":"tree.h","line":375,"lineto":376,"args":[{"name":"id","type":"git_oid *","comment":"Pointer to store the OID of the newly written tree"},{"name":"bld","type":"git_treebuilder *","comment":"Tree builder to write"}],"argline":"git_oid *id, git_treebuilder *bld","sig":"git_oid *::git_treebuilder *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Write the contents of the tree builder as a tree object

\n","comments":"

The tree builder will be written to the given repo, and its\n identifying SHA1 hash will be stored in the id pointer.

\n","group":"treebuilder"},"git_tree_walk":{"type":"function","file":"tree.h","line":406,"lineto":410,"args":[{"name":"tree","type":"const git_tree *","comment":"The tree to walk"},{"name":"mode","type":"git_treewalk_mode","comment":"Traversal mode (pre or post-order)"},{"name":"callback","type":"git_treewalk_cb","comment":"Function to call on each tree entry"},{"name":"payload","type":"void *","comment":"Opaque pointer to be passed on each callback"}],"argline":"const git_tree *tree, git_treewalk_mode mode, git_treewalk_cb callback, void *payload","sig":"const git_tree *::git_treewalk_mode::git_treewalk_cb::void *","return":{"type":"int","comment":" 0 or an error code"},"description":"

Traverse the entries in a tree and its subtrees in post or pre order.

\n","comments":"

The entries will be traversed in the specified order, children subtrees\n will be automatically loaded as required, and the callback will be\n called once per entry with the current (relative) root for the entry and\n the entry data itself.

\n\n

If the callback returns a positive value, the passed entry will be\n skipped on the traversal (in pre mode). A negative value stops the walk.

\n","group":"tree"}},"callbacks":{"git_checkout_notify_cb":{"type":"callback","file":"checkout.h","line":223,"lineto":229,"args":[{"name":"why","type":"git_checkout_notify_t","comment":null},{"name":"path","type":"const char *","comment":null},{"name":"baseline","type":"const git_diff_file *","comment":null},{"name":"target","type":"const git_diff_file *","comment":null},{"name":"workdir","type":"const git_diff_file *","comment":null},{"name":"payload","type":"void *","comment":null}],"argline":"git_checkout_notify_t why, const char *path, const git_diff_file *baseline, const git_diff_file *target, const git_diff_file *workdir, void *payload","sig":"git_checkout_notify_t::const char *::const git_diff_file *::const git_diff_file *::const git_diff_file *::void *","return":{"type":"int","comment":null},"description":"

Checkout notification callback function

\n","comments":""},"git_checkout_progress_cb":{"type":"callback","file":"checkout.h","line":232,"lineto":236,"args":[{"name":"path","type":"const char *","comment":null},{"name":"completed_steps","type":"size_t","comment":null},{"name":"total_steps","type":"size_t","comment":null},{"name":"payload","type":"void *","comment":null}],"argline":"const char *path, size_t completed_steps, size_t total_steps, void *payload","sig":"const char *::size_t::size_t::void *","return":{"type":"void","comment":null},"description":"

Checkout progress notification function

\n","comments":""},"git_checkout_perfdata_cb":{"type":"callback","file":"checkout.h","line":239,"lineto":241,"args":[{"name":"perfdata","type":"const git_checkout_perfdata *","comment":null},{"name":"payload","type":"void *","comment":null}],"argline":"const git_checkout_perfdata *perfdata, void *payload","sig":"const git_checkout_perfdata *::void *","return":{"type":"void","comment":null},"description":"

Checkout perfdata notification function

\n","comments":""},"git_remote_create_cb":{"type":"callback","file":"clone.h","line":69,"lineto":74,"args":[{"name":"out","type":"git_remote **","comment":"the resulting remote"},{"name":"repo","type":"git_repository *","comment":"the repository in which to create the remote"},{"name":"name","type":"const char *","comment":"the remote's name"},{"name":"url","type":"const char *","comment":"the remote's url"},{"name":"payload","type":"void *","comment":"an opaque payload"}],"argline":"git_remote **out, git_repository *repo, const char *name, const char *url, void *payload","sig":"git_remote **::git_repository *::const char *::const char *::void *","return":{"type":"int","comment":" 0, GIT_EINVALIDSPEC, GIT_EEXISTS or an error code"},"description":"

The signature of a function matching git_remote_create, with an additional\n void* as a callback payload.

\n","comments":"

Callers of git_clone may provide a function matching this signature to override\n the remote creation and customization process during a clone operation.

\n"},"git_repository_create_cb":{"type":"callback","file":"clone.h","line":90,"lineto":94,"args":[{"name":"out","type":"git_repository **","comment":"the resulting repository"},{"name":"path","type":"const char *","comment":"path in which to create the repository"},{"name":"bare","type":"int","comment":"whether the repository is bare. This is the value from the clone options"},{"name":"payload","type":"void *","comment":"payload specified by the options"}],"argline":"git_repository **out, const char *path, int bare, void *payload","sig":"git_repository **::const char *::int::void *","return":{"type":"int","comment":" 0, or a negative value to indicate error"},"description":"

The signature of a function matchin git_repository_init, with an\n aditional void * as callback payload.

\n","comments":"

Callers of git_clone my provide a function matching this signature\n to override the repository creation and customization process\n during a clone operation.

\n"},"git_diff_notify_cb":{"type":"callback","file":"diff.h","line":343,"lineto":347,"args":[{"name":"diff_so_far","type":"const git_diff *","comment":null},{"name":"delta_to_add","type":"const git_diff_delta *","comment":null},{"name":"matched_pathspec","type":"const char *","comment":null},{"name":"payload","type":"void *","comment":null}],"argline":"const git_diff *diff_so_far, const git_diff_delta *delta_to_add, const char *matched_pathspec, void *payload","sig":"const git_diff *::const git_diff_delta *::const char *::void *","return":{"type":"int","comment":null},"description":"

Diff notification callback function.

\n","comments":"

The callback will be called for each file, just before the git_delta_t\n gets inserted into the diff.

\n\n

When the callback:\n - returns \n<\n 0, the diff process will be aborted.\n - returns > 0, the delta will not be inserted into the diff, but the\n diff process continues.\n - returns 0, the delta is inserted into the diff, and the diff process\n continues.

\n"},"git_diff_file_cb":{"type":"callback","file":"diff.h","line":423,"lineto":426,"args":[{"name":"delta","type":"const git_diff_delta *","comment":"A pointer to the delta data for the file"},{"name":"progress","type":"float","comment":"Goes from 0 to 1 over the diff"},{"name":"payload","type":"void *","comment":"User-specified pointer from foreach function"}],"argline":"const git_diff_delta *delta, float progress, void *payload","sig":"const git_diff_delta *::float::void *","return":{"type":"int","comment":null},"description":"

When iterating over a diff, callback that will be made per file.

\n","comments":""},"git_diff_binary_cb":{"type":"callback","file":"diff.h","line":470,"lineto":473,"args":[{"name":"delta","type":"const git_diff_delta *","comment":null},{"name":"binary","type":"const git_diff_binary *","comment":null},{"name":"payload","type":"void *","comment":null}],"argline":"const git_diff_delta *delta, const git_diff_binary *binary, void *payload","sig":"const git_diff_delta *::const git_diff_binary *::void *","return":{"type":"int","comment":null},"description":"

When iterating over a diff, callback that will be made for\n binary content within the diff.

\n","comments":""},"git_diff_hunk_cb":{"type":"callback","file":"diff.h","line":490,"lineto":493,"args":[{"name":"delta","type":"const git_diff_delta *","comment":null},{"name":"hunk","type":"const git_diff_hunk *","comment":null},{"name":"payload","type":"void *","comment":null}],"argline":"const git_diff_delta *delta, const git_diff_hunk *hunk, void *payload","sig":"const git_diff_delta *::const git_diff_hunk *::void *","return":{"type":"int","comment":null},"description":"

When iterating over a diff, callback that will be made per hunk.

\n","comments":""},"git_diff_line_cb":{"type":"callback","file":"diff.h","line":543,"lineto":547,"args":[{"name":"delta","type":"const git_diff_delta *","comment":null},{"name":"hunk","type":"const git_diff_hunk *","comment":null},{"name":"line","type":"const git_diff_line *","comment":null},{"name":"payload","type":"void *","comment":null}],"argline":"const git_diff_delta *delta, const git_diff_hunk *hunk, const git_diff_line *line, void *payload","sig":"const git_diff_delta *::const git_diff_hunk *::const git_diff_line *::void *","return":{"type":"int","comment":null},"description":"

When iterating over a diff, callback that will be made per text diff\n line. In this context, the provided range will be NULL.

\n","comments":"

When printing a diff, callback that will be made to output each line\n of text. This uses some extra GIT_DIFF_LINE_... constants for output\n of lines of file and hunk headers.

\n"},"git_index_matched_path_cb":{"type":"callback","file":"index.h","line":146,"lineto":147,"args":[{"name":"path","type":"const char *","comment":null},{"name":"matched_pathspec","type":"const char *","comment":null},{"name":"payload","type":"void *","comment":null}],"argline":"const char *path, const char *matched_pathspec, void *payload","sig":"const char *::const char *::void *","return":{"type":"int","comment":null},"description":"

Callback for APIs that add/remove/update files matching pathspec

\n","comments":""},"git_headlist_cb":{"type":"callback","file":"net.h","line":55,"lineto":55,"args":[{"name":"rhead","type":"git_remote_head *","comment":null},{"name":"payload","type":"void *","comment":null}],"argline":"git_remote_head *rhead, void *payload","sig":"git_remote_head *::void *","return":{"type":"int","comment":null},"description":"

Callback for listing the remote heads

\n","comments":""},"git_note_foreach_cb":{"type":"callback","file":"notes.h","line":29,"lineto":30,"args":[{"name":"blob_id","type":"const git_oid *","comment":null},{"name":"annotated_object_id","type":"const git_oid *","comment":null},{"name":"payload","type":"void *","comment":null}],"argline":"const git_oid *blob_id, const git_oid *annotated_object_id, void *payload","sig":"const git_oid *::const git_oid *::void *","return":{"type":"int","comment":null},"description":"

Callback for git_note_foreach.

\n","comments":"

Receives:\n - blob_id: Oid of the blob containing the message\n - annotated_object_id: Oid of the git object being annotated\n - payload: Payload data passed to git_note_foreach

\n"},"git_odb_foreach_cb":{"type":"callback","file":"odb.h","line":26,"lineto":26,"args":[{"name":"id","type":"const git_oid *","comment":null},{"name":"payload","type":"void *","comment":null}],"argline":"const git_oid *id, void *payload","sig":"const git_oid *::void *","return":{"type":"int","comment":null},"description":"

Function type for callbacks from git_odb_foreach.

\n","comments":""},"git_packbuilder_progress":{"type":"callback","file":"pack.h","line":210,"lineto":214,"args":[{"name":"stage","type":"int","comment":null},{"name":"current","type":"unsigned int","comment":null},{"name":"total","type":"unsigned int","comment":null},{"name":"payload","type":"void *","comment":null}],"argline":"int stage, unsigned int current, unsigned int total, void *payload","sig":"int::unsigned int::unsigned int::void *","return":{"type":"int","comment":null},"description":"

Packbuilder progress notification function

\n","comments":""},"git_remote_rename_problem_cb":{"type":"callback","file":"remote.h","line":28,"lineto":28,"args":[{"name":"problematic_refspec","type":"const char *","comment":null},{"name":"payload","type":"void *","comment":null}],"argline":"const char *problematic_refspec, void *payload","sig":"const char *::void *","return":{"type":"int","comment":null},"description":"

git2/remote.h

\n","comments":"

@\n{

\n"},"git_push_transfer_progress":{"type":"callback","file":"remote.h","line":332,"lineto":336,"args":[{"name":"current","type":"unsigned int","comment":null},{"name":"total","type":"unsigned int","comment":null},{"name":"bytes","type":"size_t","comment":null},{"name":"payload","type":"void *","comment":null}],"argline":"unsigned int current, unsigned int total, size_t bytes, void *payload","sig":"unsigned int::unsigned int::size_t::void *","return":{"type":"int","comment":null},"description":"

Push network progress notification function

\n","comments":""},"git_push_negotiation":{"type":"callback","file":"remote.h","line":365,"lineto":365,"args":[{"name":"updates","type":"const git_push_update **","comment":"an array containing the updates which will be sent\n as commands to the destination."},{"name":"len","type":"size_t","comment":"number of elements in `updates`"},{"name":"payload","type":"void *","comment":"Payload provided by the caller"}],"argline":"const git_push_update **updates, size_t len, void *payload","sig":"const git_push_update **::size_t::void *","return":{"type":"int","comment":null},"description":"","comments":""},"git_revwalk_hide_cb":{"type":"callback","file":"revwalk.h","line":279,"lineto":281,"args":[{"name":"commit_id","type":"const git_oid *","comment":"oid of Commit"},{"name":"payload","type":"void *","comment":"User-specified pointer to data to be passed as data payload"}],"argline":"const git_oid *commit_id, void *payload","sig":"const git_oid *::void *","return":{"type":"int","comment":null},"description":"

This is a callback function that user can provide to hide a\n commit and its parents. If the callback function returns non-zero value,\n then this commit and its parents will be hidden.

\n","comments":""},"git_stash_apply_progress_cb":{"type":"callback","file":"stash.h","line":113,"lineto":115,"args":[{"name":"progress","type":"git_stash_apply_progress_t","comment":null},{"name":"payload","type":"void *","comment":null}],"argline":"git_stash_apply_progress_t progress, void *payload","sig":"git_stash_apply_progress_t::void *","return":{"type":"int","comment":null},"description":"

Stash application progress notification function.\n Return 0 to continue processing, or a negative value to\n abort the stash application.

\n","comments":""},"git_stash_cb":{"type":"callback","file":"stash.h","line":198,"lineto":202,"args":[{"name":"index","type":"size_t","comment":"The position within the stash list. 0 points to the\n most recent stashed state."},{"name":"message","type":"const char *","comment":"The stash message."},{"name":"stash_id","type":"const int *","comment":"The commit oid of the stashed state."},{"name":"payload","type":"void *","comment":"Extra parameter to callback function."}],"argline":"size_t index, const char *message, const int *stash_id, void *payload","sig":"size_t::const char *::const int *::void *","return":{"type":"int","comment":" 0 to continue iterating or non-zero to stop."},"description":"

This is a callback function you can provide to iterate over all the\n stashed states that will be invoked per entry.

\n","comments":""},"git_status_cb":{"type":"callback","file":"status.h","line":61,"lineto":62,"args":[{"name":"path","type":"const char *","comment":null},{"name":"status_flags","type":"unsigned int","comment":null},{"name":"payload","type":"void *","comment":null}],"argline":"const char *path, unsigned int status_flags, void *payload","sig":"const char *::unsigned int::void *","return":{"type":"int","comment":null},"description":"

Function pointer to receive status on individual files

\n","comments":"

path is the relative path to the file from the root of the repository.

\n\n

status_flags is a combination of git_status_t values that apply.

\n\n

payload is the value you passed to the foreach function as payload.

\n"},"git_filter_init_fn":{"type":"callback","file":"sys/filter.h","line":152,"lineto":152,"args":[{"name":"self","type":"git_filter *","comment":null}],"argline":"git_filter *self","sig":"git_filter *","return":{"type":"int","comment":null},"description":"

Initialize callback on filter

\n","comments":"

Specified as filter.initialize, this is an optional callback invoked\n before a filter is first used. It will be called once at most.

\n\n

If non-NULL, the filter's initialize callback will be invoked right\n before the first use of the filter, so you can defer expensive\n initialization operations (in case libgit2 is being used in a way that\n doesn't need the filter).

\n"},"git_filter_shutdown_fn":{"type":"callback","file":"sys/filter.h","line":164,"lineto":164,"args":[{"name":"self","type":"git_filter *","comment":null}],"argline":"git_filter *self","sig":"git_filter *","return":{"type":"void","comment":null},"description":"

Shutdown callback on filter

\n","comments":"

Specified as filter.shutdown, this is an optional callback invoked\n when the filter is unregistered or when libgit2 is shutting down. It\n will be called once at most and should release resources as needed.\n This may be called even if the initialize callback was not made.

\n\n

Typically this function will free the git_filter object itself.

\n"},"git_filter_check_fn":{"type":"callback","file":"sys/filter.h","line":186,"lineto":190,"args":[{"name":"self","type":"git_filter *","comment":null},{"name":"payload","type":"void **","comment":null},{"name":"src","type":"const git_filter_source *","comment":null},{"name":"attr_values","type":"const char **","comment":null}],"argline":"git_filter *self, void **payload, const git_filter_source *src, const char **attr_values","sig":"git_filter *::void **::const git_filter_source *::const char **","return":{"type":"int","comment":null},"description":"

Callback to decide if a given source needs this filter

\n","comments":"

Specified as filter.check, this is an optional callback that checks\n if filtering is needed for a given source.

\n\n

It should return 0 if the filter should be applied (i.e. success),\n GIT_PASSTHROUGH if the filter should not be applied, or an error code\n to fail out of the filter processing pipeline and return to the caller.

\n\n

The attr_values will be set to the values of any attributes given in\n the filter definition. See git_filter below for more detail.

\n\n

The payload will be a pointer to a reference payload for the filter.\n This will start as NULL, but check can assign to this pointer for\n later use by the apply callback. Note that the value should be heap\n allocated (not stack), so that it doesn't go away before the apply\n callback can use it. If a filter allocates and assigns a value to the\n payload, it will need a cleanup callback to free the payload.

\n"},"git_filter_apply_fn":{"type":"callback","file":"sys/filter.h","line":204,"lineto":209,"args":[{"name":"self","type":"git_filter *","comment":null},{"name":"payload","type":"void **","comment":null},{"name":"to","type":"git_buf *","comment":null},{"name":"from","type":"const git_buf *","comment":null},{"name":"src","type":"const git_filter_source *","comment":null}],"argline":"git_filter *self, void **payload, git_buf *to, const git_buf *from, const git_filter_source *src","sig":"git_filter *::void **::git_buf *::const git_buf *::const git_filter_source *","return":{"type":"int","comment":null},"description":"

Callback to actually perform the data filtering

\n","comments":"

Specified as filter.apply, this is the callback that actually filters\n data. If it successfully writes the output, it should return 0. Like\n check, it can return GIT_PASSTHROUGH to indicate that the filter\n doesn't want to run. Other error codes will stop filter processing and\n return to the caller.

\n\n

The payload value will refer to any payload that was set by the\n check callback. It may be read from or written to as needed.

\n"},"git_filter_cleanup_fn":{"type":"callback","file":"sys/filter.h","line":226,"lineto":228,"args":[{"name":"self","type":"git_filter *","comment":null},{"name":"payload","type":"void *","comment":null}],"argline":"git_filter *self, void *payload","sig":"git_filter *::void *","return":{"type":"void","comment":null},"description":"

Callback to clean up after filtering has been applied

\n","comments":"

Specified as filter.cleanup, this is an optional callback invoked\n after the filter has been applied. If the check or apply callbacks\n allocated a payload to keep per-source filter state, use this\n callback to free that payload and release resources as required.

\n"},"git_trace_callback":{"type":"callback","file":"trace.h","line":52,"lineto":52,"args":[{"name":"level","type":"git_trace_level_t","comment":null},{"name":"msg","type":"const char *","comment":null}],"argline":"git_trace_level_t level, const char *msg","sig":"git_trace_level_t::const char *","return":{"type":"void","comment":null},"description":"

An instance for a tracing function

\n","comments":""},"git_transport_cb":{"type":"callback","file":"transport.h","line":24,"lineto":24,"args":[{"name":"out","type":"git_transport **","comment":null},{"name":"owner","type":"git_remote *","comment":null},{"name":"param","type":"void *","comment":null}],"argline":"git_transport **out, git_remote *owner, void *param","sig":"git_transport **::git_remote *::void *","return":{"type":"int","comment":null},"description":"

Signature of a function which creates a transport

\n","comments":""},"git_cred_acquire_cb":{"type":"callback","file":"transport.h","line":329,"lineto":334,"args":[{"name":"cred","type":"git_cred **","comment":null},{"name":"url","type":"const char *","comment":null},{"name":"username_from_url","type":"const char *","comment":null},{"name":"allowed_types","type":"unsigned int","comment":null},{"name":"payload","type":"void *","comment":null}],"argline":"git_cred **cred, const char *url, const char *username_from_url, unsigned int allowed_types, void *payload","sig":"git_cred **::const char *::const char *::unsigned int::void *","return":{"type":"int","comment":null},"description":"

Signature of a function which acquires a credential object.

\n","comments":"
    \n
  • cred: The newly created credential object.
  • \n
  • url: The resource for which we are demanding a credential.
  • \n
  • username_from_url: The username that was embedded in a "user\n@\nhost"\n remote url, or NULL if not included.
  • \n
  • allowed_types: A bitmask stating which cred types are OK to return.
  • \n
  • payload: The payload provided when specifying this callback.
  • \n
  • returns 0 for success, \n<\n0 to indicate an error, > 0 to indicate\n no credential was acquired
  • \n
\n"},"git_treebuilder_filter_cb":{"type":"callback","file":"tree.h","line":346,"lineto":347,"args":[{"name":"entry","type":"const git_tree_entry *","comment":null},{"name":"payload","type":"void *","comment":null}],"argline":"const git_tree_entry *entry, void *payload","sig":"const git_tree_entry *::void *","return":{"type":"int","comment":null},"description":"

Callback for git_treebuilder_filter

\n","comments":"

The return value is treated as a boolean, with zero indicating that the\n entry should be left alone and any non-zero value meaning that the\n entry should be removed from the treebuilder list (i.e. filtered out).

\n"},"git_treewalk_cb":{"type":"callback","file":"tree.h","line":380,"lineto":381,"args":[{"name":"root","type":"const char *","comment":null},{"name":"entry","type":"const git_tree_entry *","comment":null},{"name":"payload","type":"void *","comment":null}],"argline":"const char *root, const git_tree_entry *entry, void *payload","sig":"const char *::const git_tree_entry *::void *","return":{"type":"int","comment":null},"description":"

Callback for the tree traversal method

\n","comments":""},"git_transfer_progress_cb":{"type":"callback","file":"types.h","line":270,"lineto":270,"args":[{"name":"stats","type":"const git_transfer_progress *","comment":"Structure containing information about the state of the transfer"},{"name":"payload","type":"void *","comment":"Payload provided by caller"}],"argline":"const git_transfer_progress *stats, void *payload","sig":"const git_transfer_progress *::void *","return":{"type":"int","comment":null},"description":"

Type for progress callbacks during indexing. Return a value less than zero\n to cancel the transfer.

\n","comments":""},"git_transport_message_cb":{"type":"callback","file":"types.h","line":280,"lineto":280,"args":[{"name":"str","type":"const char *","comment":"The message from the transport"},{"name":"len","type":"int","comment":"The length of the message"},{"name":"payload","type":"void *","comment":"Payload provided by the caller"}],"argline":"const char *str, int len, void *payload","sig":"const char *::int::void *","return":{"type":"int","comment":null},"description":"

Type for messages delivered by the transport. Return a negative value\n to cancel the network operation.

\n","comments":""},"git_transport_certificate_check_cb":{"type":"callback","file":"types.h","line":330,"lineto":330,"args":[{"name":"cert","type":"git_cert *","comment":"The host certificate"},{"name":"valid","type":"int","comment":"Whether the libgit2 checks (OpenSSL or WinHTTP) think\n this certificate is valid"},{"name":"host","type":"const char *","comment":"Hostname of the host libgit2 connected to"},{"name":"payload","type":"void *","comment":"Payload provided by the caller"}],"argline":"git_cert *cert, int valid, const char *host, void *payload","sig":"git_cert *::int::const char *::void *","return":{"type":"int","comment":null},"description":"

Callback for the user's custom certificate checks.

\n","comments":""}},"globals":{},"types":[["git_annotated_commit",{"decl":"git_annotated_commit","type":"struct","value":"git_annotated_commit","file":"types.h","line":178,"lineto":178,"tdef":"typedef","description":" Annotated commits, the input to merge and rebase. ","comments":"","used":{"returns":[],"needs":["git_annotated_commit_free","git_annotated_commit_from_fetchhead","git_annotated_commit_from_ref","git_annotated_commit_from_revspec","git_annotated_commit_id","git_annotated_commit_lookup","git_branch_create_from_annotated","git_merge","git_merge_analysis","git_rebase_init","git_repository_set_head_detached_from_annotated","git_reset_from_annotated"]}}],["git_attr_t",{"decl":["GIT_ATTR_UNSPECIFIED_T","GIT_ATTR_TRUE_T","GIT_ATTR_FALSE_T","GIT_ATTR_VALUE_T"],"type":"enum","file":"attr.h","line":82,"lineto":87,"block":"GIT_ATTR_UNSPECIFIED_T\nGIT_ATTR_TRUE_T\nGIT_ATTR_FALSE_T\nGIT_ATTR_VALUE_T","tdef":"typedef","description":" Possible states for an attribute","comments":"","fields":[{"type":"int","name":"GIT_ATTR_UNSPECIFIED_T","comments":"

The attribute has been left unspecified

\n","value":0},{"type":"int","name":"GIT_ATTR_TRUE_T","comments":"

The attribute has been set

\n","value":1},{"type":"int","name":"GIT_ATTR_FALSE_T","comments":"

The attribute has been unset

\n","value":2},{"type":"int","name":"GIT_ATTR_VALUE_T","comments":"

This attribute has a value

\n","value":3}],"used":{"returns":[],"needs":[]}}],["git_blame_flag_t",{"decl":["GIT_BLAME_NORMAL","GIT_BLAME_TRACK_COPIES_SAME_FILE","GIT_BLAME_TRACK_COPIES_SAME_COMMIT_MOVES","GIT_BLAME_TRACK_COPIES_SAME_COMMIT_COPIES","GIT_BLAME_TRACK_COPIES_ANY_COMMIT_COPIES","GIT_BLAME_FIRST_PARENT"],"type":"enum","file":"blame.h","line":26,"lineto":46,"block":"GIT_BLAME_NORMAL\nGIT_BLAME_TRACK_COPIES_SAME_FILE\nGIT_BLAME_TRACK_COPIES_SAME_COMMIT_MOVES\nGIT_BLAME_TRACK_COPIES_SAME_COMMIT_COPIES\nGIT_BLAME_TRACK_COPIES_ANY_COMMIT_COPIES\nGIT_BLAME_FIRST_PARENT","tdef":"typedef","description":" Flags for indicating option behavior for git_blame APIs.","comments":"","fields":[{"type":"int","name":"GIT_BLAME_NORMAL","comments":"

Normal blame, the default

\n","value":0},{"type":"int","name":"GIT_BLAME_TRACK_COPIES_SAME_FILE","comments":"

Track lines that have moved within a file (like git blame -M).\n NOT IMPLEMENTED.

\n","value":1},{"type":"int","name":"GIT_BLAME_TRACK_COPIES_SAME_COMMIT_MOVES","comments":"

Track lines that have moved across files in the same commit (like git blame -C).\n NOT IMPLEMENTED.

\n","value":2},{"type":"int","name":"GIT_BLAME_TRACK_COPIES_SAME_COMMIT_COPIES","comments":"

Track lines that have been copied from another file that exists in the\n same commit (like git blame -CC). Implies SAME_FILE.\n NOT IMPLEMENTED.

\n","value":4},{"type":"int","name":"GIT_BLAME_TRACK_COPIES_ANY_COMMIT_COPIES","comments":"

Track lines that have been copied from another file that exists in any\n commit (like git blame -CCC). Implies SAME_COMMIT_COPIES.\n NOT IMPLEMENTED.

\n","value":8},{"type":"int","name":"GIT_BLAME_FIRST_PARENT","comments":"

Restrict the search of commits to those reachable following only the\n first parents.

\n","value":16}],"used":{"returns":[],"needs":[]}}],["git_blame_hunk",{"decl":["uint16_t lines_in_hunk","git_oid final_commit_id","uint16_t final_start_line_number","git_signature * final_signature","git_oid orig_commit_id","const char * orig_path","uint16_t orig_start_line_number","git_signature * orig_signature","char boundary"],"type":"struct","value":"git_blame_hunk","file":"blame.h","line":115,"lineto":128,"block":"uint16_t lines_in_hunk\ngit_oid final_commit_id\nuint16_t final_start_line_number\ngit_signature * final_signature\ngit_oid orig_commit_id\nconst char * orig_path\nuint16_t orig_start_line_number\ngit_signature * orig_signature\nchar boundary","tdef":"typedef","description":" Structure that represents a blame hunk.","comments":"
    \n
  • lines_in_hunk is the number of lines in this hunk
  • \n
  • final_commit_id is the OID of the commit where this line was last\nchanged.
  • \n
  • final_start_line_number is the 1-based line number where this hunk\nbegins, in the final version of the file
  • \n
  • orig_commit_id is the OID of the commit where this hunk was found. This\nwill usually be the same as final_commit_id, except when\nGIT_BLAME_TRACK_COPIES_ANY_COMMIT_COPIES has been specified.
  • \n
  • orig_path is the path to the file where this hunk originated, as of the\ncommit specified by orig_commit_id.
  • \n
  • orig_start_line_number is the 1-based line number where this hunk begins\nin the file named by orig_path in the commit specified by\norig_commit_id.
  • \n
  • boundary is 1 iff the hunk has been tracked to a boundary commit (the\nroot, or the commit specified in git_blame_options.oldest_commit)
  • \n
\n","fields":[{"type":"uint16_t","name":"lines_in_hunk","comments":""},{"type":"git_oid","name":"final_commit_id","comments":""},{"type":"uint16_t","name":"final_start_line_number","comments":""},{"type":"git_signature *","name":"final_signature","comments":""},{"type":"git_oid","name":"orig_commit_id","comments":""},{"type":"const char *","name":"orig_path","comments":""},{"type":"uint16_t","name":"orig_start_line_number","comments":""},{"type":"git_signature *","name":"orig_signature","comments":""},{"type":"char","name":"boundary","comments":""}],"used":{"returns":["git_blame_get_hunk_byindex","git_blame_get_hunk_byline"],"needs":[]}}],["git_blame_options",{"decl":["unsigned int version","uint32_t flags","uint16_t min_match_characters","git_oid newest_commit","git_oid oldest_commit","uint32_t min_line","uint32_t max_line"],"type":"struct","value":"git_blame_options","file":"blame.h","line":70,"lineto":79,"block":"unsigned int version\nuint32_t flags\nuint16_t min_match_characters\ngit_oid newest_commit\ngit_oid oldest_commit\nuint32_t min_line\nuint32_t max_line","tdef":"typedef","description":" Blame options structure","comments":"

Use zeros to indicate default settings. It's easiest to use the\n GIT_BLAME_OPTIONS_INIT macro:\n git_blame_options opts = GIT_BLAME_OPTIONS_INIT;

\n\n
    \n
  • flags is a combination of the git_blame_flag_t values above.
  • \n
  • min_match_characters is the lower bound on the number of alphanumeric\ncharacters that must be detected as moving/copying within a file for it to\nassociate those lines with the parent commit. The default value is 20.\nThis value only takes effect if any of the GIT_BLAME_TRACK_COPIES_*\nflags are specified.
  • \n
  • newest_commit is the id of the newest commit to consider. The default\n is HEAD.
  • \n
  • oldest_commit is the id of the oldest commit to consider. The default\n is the first commit encountered with a NULL parent.\n\n
      \n
    • min_line is the first line in the file to blame. The default is 1 (line\n numbers start with 1).
    • \n
    • max_line is the last line in the file to blame. The default is the last\n line of the file.
    • \n
  • \n
\n","fields":[{"type":"unsigned int","name":"version","comments":""},{"type":"uint32_t","name":"flags","comments":""},{"type":"uint16_t","name":"min_match_characters","comments":""},{"type":"git_oid","name":"newest_commit","comments":""},{"type":"git_oid","name":"oldest_commit","comments":""},{"type":"uint32_t","name":"min_line","comments":""},{"type":"uint32_t","name":"max_line","comments":""}],"used":{"returns":[],"needs":["git_blame_file","git_blame_init_options"]}}],["git_blob",{"decl":"git_blob","type":"struct","value":"git_blob","file":"types.h","line":117,"lineto":117,"tdef":"typedef","description":" In-memory representation of a blob object. ","comments":"","used":{"returns":[],"needs":["git_blob_filtered_content","git_blob_free","git_blob_id","git_blob_is_binary","git_blob_lookup","git_blob_lookup_prefix","git_blob_owner","git_blob_rawcontent","git_blob_rawsize","git_diff_blob_to_buffer","git_diff_blobs","git_filter_list_apply_to_blob","git_filter_list_load","git_filter_list_stream_blob","git_patch_from_blob_and_buffer","git_patch_from_blobs"]}}],["git_branch_iterator",{"decl":"git_branch_iterator","type":"struct","value":"git_branch_iterator","file":"branch.h","line":88,"lineto":88,"tdef":"typedef","description":" Iterator type for branches ","comments":"","used":{"returns":[],"needs":["git_branch_iterator_free","git_branch_iterator_new","git_branch_next"]}}],["git_branch_t",{"decl":["GIT_BRANCH_LOCAL","GIT_BRANCH_REMOTE","GIT_BRANCH_ALL"],"type":"enum","file":"types.h","line":198,"lineto":202,"block":"GIT_BRANCH_LOCAL\nGIT_BRANCH_REMOTE\nGIT_BRANCH_ALL","tdef":"typedef","description":" Basic type of any Git branch. ","comments":"","fields":[{"type":"int","name":"GIT_BRANCH_LOCAL","comments":"","value":1},{"type":"int","name":"GIT_BRANCH_REMOTE","comments":"","value":2},{"type":"int","name":"GIT_BRANCH_ALL","comments":"","value":3}],"used":{"returns":[],"needs":["git_branch_iterator_new","git_branch_lookup","git_branch_next"]}}],["git_buf",{"decl":["char * ptr","size_t asize","size_t size"],"type":"struct","value":"git_buf","file":"buffer.h","line":52,"lineto":55,"block":"char * ptr\nsize_t asize\nsize_t size","tdef":"typedef","description":" A data buffer for exporting data from libgit2","comments":"

Sometimes libgit2 wants to return an allocated data buffer to the\n caller and have the caller take responsibility for freeing that memory.\n This can be awkward if the caller does not have easy access to the same\n allocation functions that libgit2 is using. In those cases, libgit2\n will fill in a git_buf and the caller can use git_buf_free() to\n release it when they are done.

\n\n

A git_buf may also be used for the caller to pass in a reference to\n a block of memory they hold. In this case, libgit2 will not resize or\n free the memory, but will read from it as needed.

\n\n

A git_buf is a public structure with three fields:

\n\n
    \n
  • ptr points to the start of the allocated memory. If it is NULL,\nthen the git_buf is considered empty and libgit2 will feel free\nto overwrite it with new data.

  • \n
  • size holds the size (in bytes) of the data that is actually used.

  • \n
  • asize holds the known total amount of allocated memory if the ptr\nwas allocated by libgit2. It may be larger than size. If ptr\nwas not allocated by libgit2 and should not be resized and/or freed,\nthen asize will be set to zero.

  • \n
\n\n

Some APIs may occasionally do something slightly unusual with a buffer,\n such as setting ptr to a value that was passed in by the user. In\n those cases, the behavior will be clearly documented by the API.

\n","fields":[{"type":"char *","name":"ptr","comments":""},{"type":"size_t","name":"asize","comments":""},{"type":"size_t","name":"size","comments":""}],"used":{"returns":[],"needs":["git_blob_filtered_content","git_buf_contains_nul","git_buf_free","git_buf_grow","git_buf_is_binary","git_buf_set","git_commit_header_field","git_config_find_global","git_config_find_system","git_config_find_xdg","git_config_get_path","git_config_get_string_buf","git_config_parse_path","git_describe_format","git_diff_commit_as_email","git_diff_format_email","git_diff_stats_to_buf","git_filter_list_apply_to_blob","git_filter_list_apply_to_data","git_filter_list_apply_to_file","git_filter_list_stream_data","git_message_prettify","git_object_short_id","git_patch_to_buf","git_refspec_rtransform","git_refspec_transform","git_remote_default_branch","git_repository_discover","git_repository_message","git_submodule_resolve_url"]}}],["git_cert",{"decl":["git_cert_t cert_type"],"type":"struct","value":"git_cert","file":"types.h","line":314,"lineto":319,"block":"git_cert_t cert_type","tdef":"typedef","description":" Parent type for `git_cert_hostkey` and `git_cert_x509`.","comments":"","fields":[{"type":"git_cert_t","name":"cert_type","comments":" Type of certificate. A `GIT_CERT_` value."}],"used":{"returns":[],"needs":[]}}],["git_cert_hostkey",{"decl":["git_cert_t cert_type","git_cert_ssh_t type","unsigned char [16] hash_md5","unsigned char [20] hash_sha1"],"type":"struct","value":"git_cert_hostkey","file":"transport.h","line":39,"lineto":62,"block":"git_cert_t cert_type\ngit_cert_ssh_t type\nunsigned char [16] hash_md5\nunsigned char [20] hash_sha1","tdef":"typedef","description":" Hostkey information taken from libssh2","comments":"","fields":[{"type":"git_cert_t","name":"cert_type","comments":" Type of certificate. Here to share the header with\n `git_cert`."},{"type":"git_cert_ssh_t","name":"type","comments":" A hostkey type from libssh2, either\n `GIT_CERT_SSH_MD5` or `GIT_CERT_SSH_SHA1`"},{"type":"unsigned char [16]","name":"hash_md5","comments":" Hostkey hash. If type has `GIT_CERT_SSH_MD5` set, this will\n have the MD5 hash of the hostkey."},{"type":"unsigned char [20]","name":"hash_sha1","comments":" Hostkey hash. If type has `GIT_CERT_SSH_SHA1` set, this will\n have the SHA-1 hash of the hostkey."}],"used":{"returns":[],"needs":[]}}],["git_cert_ssh_t",{"decl":["GIT_CERT_SSH_MD5","GIT_CERT_SSH_SHA1"],"type":"enum","file":"transport.h","line":29,"lineto":34,"block":"GIT_CERT_SSH_MD5\nGIT_CERT_SSH_SHA1","tdef":"typedef","description":" Type of SSH host fingerprint","comments":"","fields":[{"type":"int","name":"GIT_CERT_SSH_MD5","comments":"

MD5 is available

\n","value":1},{"type":"int","name":"GIT_CERT_SSH_SHA1","comments":"

SHA-1 is available

\n","value":2}],"used":{"returns":[],"needs":[]}}],["git_cert_t",{"decl":["GIT_CERT_NONE","GIT_CERT_X509","GIT_CERT_HOSTKEY_LIBSSH2","GIT_CERT_STRARRAY"],"type":"enum","file":"types.h","line":286,"lineto":309,"block":"GIT_CERT_NONE\nGIT_CERT_X509\nGIT_CERT_HOSTKEY_LIBSSH2\nGIT_CERT_STRARRAY\nGIT_CERT_NONE\nGIT_CERT_X509\nGIT_CERT_HOSTKEY_LIBSSH2\nGIT_CERT_STRARRAY","tdef":"typedef","description":" Type of host certificate structure that is passed to the check callback","comments":"","fields":[{"type":"int","name":"GIT_CERT_NONE","comments":"

No information about the certificate is available. This may\n happen when using curl.

\n","value":0},{"type":"int","name":"GIT_CERT_X509","comments":"

The data argument to the callback will be a pointer to\n the DER-encoded data.

\n","value":1},{"type":"int","name":"GIT_CERT_HOSTKEY_LIBSSH2","comments":"

The data argument to the callback will be a pointer to a\n git_cert_hostkey structure.

\n","value":2},{"type":"int","name":"GIT_CERT_STRARRAY","comments":"

The data argument to the callback will be a pointer to a\n git_strarray with name:content strings containing\n information about the certificate. This is used when using\n curl.

\n","value":3}],"used":{"returns":[],"needs":[]}}],["git_cert_x509",{"decl":["git_cert_t cert_type","void * data","size_t len"],"type":"struct","value":"git_cert_x509","file":"transport.h","line":67,"lineto":81,"block":"git_cert_t cert_type\nvoid * data\nsize_t len","tdef":"typedef","description":" X.509 certificate information","comments":"","fields":[{"type":"git_cert_t","name":"cert_type","comments":" Type of certificate. Here to share the header with\n `git_cert`."},{"type":"void *","name":"data","comments":" Pointer to the X.509 certificate data"},{"type":"size_t","name":"len","comments":" Length of the memory block pointed to by `data`."}],"used":{"returns":[],"needs":[]}}],["git_checkout_notify_t",{"decl":["GIT_CHECKOUT_NOTIFY_NONE","GIT_CHECKOUT_NOTIFY_CONFLICT","GIT_CHECKOUT_NOTIFY_DIRTY","GIT_CHECKOUT_NOTIFY_UPDATED","GIT_CHECKOUT_NOTIFY_UNTRACKED","GIT_CHECKOUT_NOTIFY_IGNORED","GIT_CHECKOUT_NOTIFY_ALL"],"type":"enum","file":"checkout.h","line":205,"lineto":214,"block":"GIT_CHECKOUT_NOTIFY_NONE\nGIT_CHECKOUT_NOTIFY_CONFLICT\nGIT_CHECKOUT_NOTIFY_DIRTY\nGIT_CHECKOUT_NOTIFY_UPDATED\nGIT_CHECKOUT_NOTIFY_UNTRACKED\nGIT_CHECKOUT_NOTIFY_IGNORED\nGIT_CHECKOUT_NOTIFY_ALL","tdef":"typedef","description":" Checkout notification flags","comments":"

Checkout will invoke an options notification callback (notify_cb) for\n certain cases - you pick which ones via notify_flags:

\n\n
    \n
  • GIT_CHECKOUT_NOTIFY_CONFLICT invokes checkout on conflicting paths.

  • \n
  • GIT_CHECKOUT_NOTIFY_DIRTY notifies about "dirty" files, i.e. those that\ndo not need an update but no longer match the baseline. Core git\ndisplays these files when checkout runs, but won't stop the checkout.

  • \n
  • GIT_CHECKOUT_NOTIFY_UPDATED sends notification for any file changed.

  • \n
  • GIT_CHECKOUT_NOTIFY_UNTRACKED notifies about untracked files.

  • \n
  • GIT_CHECKOUT_NOTIFY_IGNORED notifies about ignored files.

  • \n
\n\n

Returning a non-zero value from this callback will cancel the checkout.\n The non-zero return value will be propagated back and returned by the\n git_checkout_... call.

\n\n

Notification callbacks are made prior to modifying any files on disk,\n so canceling on any notification will still happen prior to any files\n being modified.

\n","fields":[{"type":"int","name":"GIT_CHECKOUT_NOTIFY_NONE","comments":"","value":0},{"type":"int","name":"GIT_CHECKOUT_NOTIFY_CONFLICT","comments":"","value":1},{"type":"int","name":"GIT_CHECKOUT_NOTIFY_DIRTY","comments":"","value":2},{"type":"int","name":"GIT_CHECKOUT_NOTIFY_UPDATED","comments":"","value":4},{"type":"int","name":"GIT_CHECKOUT_NOTIFY_UNTRACKED","comments":"","value":8},{"type":"int","name":"GIT_CHECKOUT_NOTIFY_IGNORED","comments":"","value":16},{"type":"int","name":"GIT_CHECKOUT_NOTIFY_ALL","comments":"","value":65535}],"used":{"returns":[],"needs":[]}}],["git_checkout_options",{"decl":["unsigned int version","unsigned int checkout_strategy","int disable_filters","unsigned int dir_mode","unsigned int file_mode","int file_open_flags","unsigned int notify_flags","git_checkout_notify_cb notify_cb","void * notify_payload","git_checkout_progress_cb progress_cb","void * progress_payload","git_strarray paths","git_tree * baseline","git_index * baseline_index","const char * target_directory","const char * ancestor_label","const char * our_label","const char * their_label","git_checkout_perfdata_cb perfdata_cb","void * perfdata_payload"],"type":"struct","value":"git_checkout_options","file":"checkout.h","line":251,"lineto":295,"block":"unsigned int version\nunsigned int checkout_strategy\nint disable_filters\nunsigned int dir_mode\nunsigned int file_mode\nint file_open_flags\nunsigned int notify_flags\ngit_checkout_notify_cb notify_cb\nvoid * notify_payload\ngit_checkout_progress_cb progress_cb\nvoid * progress_payload\ngit_strarray paths\ngit_tree * baseline\ngit_index * baseline_index\nconst char * target_directory\nconst char * ancestor_label\nconst char * our_label\nconst char * their_label\ngit_checkout_perfdata_cb perfdata_cb\nvoid * perfdata_payload","tdef":"typedef","description":" Checkout options structure","comments":"

Zero out for defaults. Initialize with GIT_CHECKOUT_OPTIONS_INIT macro to\n correctly set the version field. E.g.

\n\n
    git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT;\n
\n","fields":[{"type":"unsigned int","name":"version","comments":""},{"type":"unsigned int","name":"checkout_strategy","comments":" default will be a dry run "},{"type":"int","name":"disable_filters","comments":" don't apply filters like CRLF conversion "},{"type":"unsigned int","name":"dir_mode","comments":" default is 0755 "},{"type":"unsigned int","name":"file_mode","comments":" default is 0644 or 0755 as dictated by blob "},{"type":"int","name":"file_open_flags","comments":" default is O_CREAT | O_TRUNC | O_WRONLY "},{"type":"unsigned int","name":"notify_flags","comments":" see `git_checkout_notify_t` above "},{"type":"git_checkout_notify_cb","name":"notify_cb","comments":""},{"type":"void *","name":"notify_payload","comments":""},{"type":"git_checkout_progress_cb","name":"progress_cb","comments":" Optional callback to notify the consumer of checkout progress. "},{"type":"void *","name":"progress_payload","comments":""},{"type":"git_strarray","name":"paths","comments":" When not zeroed out, array of fnmatch patterns specifying which\n paths should be taken into account, otherwise all files. Use\n GIT_CHECKOUT_DISABLE_PATHSPEC_MATCH to treat as simple list."},{"type":"git_tree *","name":"baseline","comments":" The expected content of the working directory; defaults to HEAD.\n If the working directory does not match this baseline information,\n that will produce a checkout conflict."},{"type":"git_index *","name":"baseline_index","comments":" expected content of workdir, expressed as an index. "},{"type":"const char *","name":"target_directory","comments":" alternative checkout path to workdir "},{"type":"const char *","name":"ancestor_label","comments":" the name of the common ancestor side of conflicts "},{"type":"const char *","name":"our_label","comments":" the name of the \"our\" side of conflicts "},{"type":"const char *","name":"their_label","comments":" the name of the \"their\" side of conflicts "},{"type":"git_checkout_perfdata_cb","name":"perfdata_cb","comments":" Optional callback to notify the consumer of performance data. "},{"type":"void *","name":"perfdata_payload","comments":""}],"used":{"returns":[],"needs":["git_checkout_head","git_checkout_index","git_checkout_init_options","git_checkout_tree","git_merge","git_reset","git_reset_from_annotated"]}}],["git_checkout_strategy_t",{"decl":["GIT_CHECKOUT_NONE","GIT_CHECKOUT_SAFE","GIT_CHECKOUT_FORCE","GIT_CHECKOUT_RECREATE_MISSING","GIT_CHECKOUT_ALLOW_CONFLICTS","GIT_CHECKOUT_REMOVE_UNTRACKED","GIT_CHECKOUT_REMOVE_IGNORED","GIT_CHECKOUT_UPDATE_ONLY","GIT_CHECKOUT_DONT_UPDATE_INDEX","GIT_CHECKOUT_NO_REFRESH","GIT_CHECKOUT_SKIP_UNMERGED","GIT_CHECKOUT_USE_OURS","GIT_CHECKOUT_USE_THEIRS","GIT_CHECKOUT_DISABLE_PATHSPEC_MATCH","GIT_CHECKOUT_SKIP_LOCKED_DIRECTORIES","GIT_CHECKOUT_DONT_OVERWRITE_IGNORED","GIT_CHECKOUT_CONFLICT_STYLE_MERGE","GIT_CHECKOUT_CONFLICT_STYLE_DIFF3","GIT_CHECKOUT_DONT_REMOVE_EXISTING","GIT_CHECKOUT_DONT_WRITE_INDEX","GIT_CHECKOUT_UPDATE_SUBMODULES","GIT_CHECKOUT_UPDATE_SUBMODULES_IF_CHANGED"],"type":"enum","file":"checkout.h","line":106,"lineto":177,"block":"GIT_CHECKOUT_NONE\nGIT_CHECKOUT_SAFE\nGIT_CHECKOUT_FORCE\nGIT_CHECKOUT_RECREATE_MISSING\nGIT_CHECKOUT_ALLOW_CONFLICTS\nGIT_CHECKOUT_REMOVE_UNTRACKED\nGIT_CHECKOUT_REMOVE_IGNORED\nGIT_CHECKOUT_UPDATE_ONLY\nGIT_CHECKOUT_DONT_UPDATE_INDEX\nGIT_CHECKOUT_NO_REFRESH\nGIT_CHECKOUT_SKIP_UNMERGED\nGIT_CHECKOUT_USE_OURS\nGIT_CHECKOUT_USE_THEIRS\nGIT_CHECKOUT_DISABLE_PATHSPEC_MATCH\nGIT_CHECKOUT_SKIP_LOCKED_DIRECTORIES\nGIT_CHECKOUT_DONT_OVERWRITE_IGNORED\nGIT_CHECKOUT_CONFLICT_STYLE_MERGE\nGIT_CHECKOUT_CONFLICT_STYLE_DIFF3\nGIT_CHECKOUT_DONT_REMOVE_EXISTING\nGIT_CHECKOUT_DONT_WRITE_INDEX\nGIT_CHECKOUT_UPDATE_SUBMODULES\nGIT_CHECKOUT_UPDATE_SUBMODULES_IF_CHANGED","tdef":"typedef","description":" Checkout behavior flags","comments":"

In libgit2, checkout is used to update the working directory and index\n to match a target tree. Unlike git checkout, it does not move the HEAD\n commit for you - use git_repository_set_head or the like to do that.

\n\n

Checkout looks at (up to) four things: the "target" tree you want to\n check out, the "baseline" tree of what was checked out previously, the\n working directory for actual files, and the index for staged changes.

\n\n

You give checkout one of three strategies for update:

\n\n
    \n
  • GIT_CHECKOUT_NONE is a dry-run strategy that checks for conflicts,\netc., but doesn't make any actual changes.

  • \n
  • GIT_CHECKOUT_FORCE is at the opposite extreme, taking any action to\nmake the working directory match the target (including potentially\ndiscarding modified files).

  • \n
  • GIT_CHECKOUT_SAFE is between these two options, it will only make\nmodifications that will not lose changes.

    \n\n
                     |  target == baseline   |  target != baseline  |\n
    \n\n

    ---------------------|-----------------------|----------------------|\n workdir == baseline | no action | create, update, or |\n | | delete file |\n---------------------|-----------------------|----------------------|\n workdir exists and | no action | conflict (notify |\n is != baseline | notify dirty MODIFIED | and cancel checkout) |\n---------------------|-----------------------|----------------------|\n workdir missing, | notify dirty DELETED | create file |\n baseline present | | |\n---------------------|-----------------------|----------------------|

  • \n
\n\n

To emulate git checkout, use GIT_CHECKOUT_SAFE with a checkout\n notification callback (see below) that displays information about dirty\n files. The default behavior will cancel checkout on conflicts.

\n\n

To emulate git checkout-index, use GIT_CHECKOUT_SAFE with a\n notification callback that cancels the operation if a dirty-but-existing\n file is found in the working directory. This core git command isn't\n quite "force" but is sensitive about some types of changes.

\n\n

To emulate git checkout -f, use GIT_CHECKOUT_FORCE.

\n\n

There are some additional flags to modified the behavior of checkout:

\n\n
    \n
  • GIT_CHECKOUT_ALLOW_CONFLICTS makes SAFE mode apply safe file updates\neven if there are conflicts (instead of cancelling the checkout).

  • \n
  • GIT_CHECKOUT_REMOVE_UNTRACKED means remove untracked files (i.e. not\nin target, baseline, or index, and not ignored) from the working dir.

  • \n
  • GIT_CHECKOUT_REMOVE_IGNORED means remove ignored files (that are also\nuntracked) from the working directory as well.

  • \n
  • GIT_CHECKOUT_UPDATE_ONLY means to only update the content of files that\nalready exist. Files will not be created nor deleted. This just skips\napplying adds, deletes, and typechanges.

  • \n
  • GIT_CHECKOUT_DONT_UPDATE_INDEX prevents checkout from writing the\nupdated files' information to the index.

  • \n
  • Normally, checkout will reload the index and git attributes from disk\nbefore any operations. GIT_CHECKOUT_NO_REFRESH prevents this reload.

  • \n
  • Unmerged index entries are conflicts. GIT_CHECKOUT_SKIP_UNMERGED skips\nfiles with unmerged index entries instead. GIT_CHECKOUT_USE_OURS and\nGIT_CHECKOUT_USE_THEIRS to proceed with the checkout using either the\nstage 2 ("ours") or stage 3 ("theirs") version of files in the index.

  • \n
  • GIT_CHECKOUT_DONT_OVERWRITE_IGNORED prevents ignored files from being\noverwritten. Normally, files that are ignored in the working directory\nare not considered "precious" and may be overwritten if the checkout\ntarget contains that file.

  • \n
  • GIT_CHECKOUT_DONT_REMOVE_EXISTING prevents checkout from removing\nfiles or folders that fold to the same name on case insensitive\nfilesystems. This can cause files to retain their existing names\nand write through existing symbolic links.

  • \n
\n","fields":[{"type":"int","name":"GIT_CHECKOUT_NONE","comments":"

default is a dry run, no actual updates

\n","value":0},{"type":"int","name":"GIT_CHECKOUT_SAFE","comments":"

Allow safe updates that cannot overwrite uncommitted data

\n","value":1},{"type":"int","name":"GIT_CHECKOUT_FORCE","comments":"

Allow all updates to force working directory to look like index

\n","value":2},{"type":"int","name":"GIT_CHECKOUT_RECREATE_MISSING","comments":"

Allow checkout to recreate missing files

\n","value":4},{"type":"int","name":"GIT_CHECKOUT_ALLOW_CONFLICTS","comments":"

Allow checkout to make safe updates even if conflicts are found

\n","value":16},{"type":"int","name":"GIT_CHECKOUT_REMOVE_UNTRACKED","comments":"

Remove untracked files not in index (that are not ignored)

\n","value":32},{"type":"int","name":"GIT_CHECKOUT_REMOVE_IGNORED","comments":"

Remove ignored files not in index

\n","value":64},{"type":"int","name":"GIT_CHECKOUT_UPDATE_ONLY","comments":"

Only update existing files, don't create new ones

\n","value":128},{"type":"int","name":"GIT_CHECKOUT_DONT_UPDATE_INDEX","comments":"

Normally checkout updates index entries as it goes; this stops that.\n Implies GIT_CHECKOUT_DONT_WRITE_INDEX.

\n","value":256},{"type":"int","name":"GIT_CHECKOUT_NO_REFRESH","comments":"

Don't refresh index/config/etc before doing checkout

\n","value":512},{"type":"int","name":"GIT_CHECKOUT_SKIP_UNMERGED","comments":"

Allow checkout to skip unmerged files

\n","value":1024},{"type":"int","name":"GIT_CHECKOUT_USE_OURS","comments":"

For unmerged files, checkout stage 2 from index

\n","value":2048},{"type":"int","name":"GIT_CHECKOUT_USE_THEIRS","comments":"

For unmerged files, checkout stage 3 from index

\n","value":4096},{"type":"int","name":"GIT_CHECKOUT_DISABLE_PATHSPEC_MATCH","comments":"

Treat pathspec as simple list of exact match file paths

\n","value":8192},{"type":"int","name":"GIT_CHECKOUT_SKIP_LOCKED_DIRECTORIES","comments":"

Ignore directories in use, they will be left empty

\n","value":262144},{"type":"int","name":"GIT_CHECKOUT_DONT_OVERWRITE_IGNORED","comments":"

Don't overwrite ignored files that exist in the checkout target

\n","value":524288},{"type":"int","name":"GIT_CHECKOUT_CONFLICT_STYLE_MERGE","comments":"

Write normal merge files for conflicts

\n","value":1048576},{"type":"int","name":"GIT_CHECKOUT_CONFLICT_STYLE_DIFF3","comments":"

Include common ancestor data in diff3 format files for conflicts

\n","value":2097152},{"type":"int","name":"GIT_CHECKOUT_DONT_REMOVE_EXISTING","comments":"

Don't overwrite existing files or folders

\n","value":4194304},{"type":"int","name":"GIT_CHECKOUT_DONT_WRITE_INDEX","comments":"

Normally checkout writes the index upon completion; this prevents that.

\n","value":8388608},{"type":"int","name":"GIT_CHECKOUT_UPDATE_SUBMODULES","comments":"

Recursively checkout submodules with same options (NOT IMPLEMENTED)

\n","value":65536},{"type":"int","name":"GIT_CHECKOUT_UPDATE_SUBMODULES_IF_CHANGED","comments":"

Recursively checkout submodules if HEAD moved in super repo (NOT IMPLEMENTED)

\n","value":131072}],"used":{"returns":[],"needs":[]}}],["git_cherrypick_options",{"decl":["unsigned int version","unsigned int mainline","git_merge_options merge_opts","git_checkout_options checkout_opts"],"type":"struct","value":"git_cherrypick_options","file":"cherrypick.h","line":26,"lineto":34,"block":"unsigned int version\nunsigned int mainline\ngit_merge_options merge_opts\ngit_checkout_options checkout_opts","tdef":"typedef","description":" Cherry-pick options","comments":"","fields":[{"type":"unsigned int","name":"version","comments":""},{"type":"unsigned int","name":"mainline","comments":" For merge commits, the \"mainline\" is treated as the parent. "},{"type":"git_merge_options","name":"merge_opts","comments":" Options for the merging "},{"type":"git_checkout_options","name":"checkout_opts","comments":" Options for the checkout "}],"used":{"returns":[],"needs":["git_cherrypick","git_cherrypick_init_options"]}}],["git_clone_local_t",{"decl":["GIT_CLONE_LOCAL_AUTO","GIT_CLONE_LOCAL","GIT_CLONE_NO_LOCAL","GIT_CLONE_LOCAL_NO_LINKS"],"type":"enum","file":"clone.h","line":33,"lineto":53,"block":"GIT_CLONE_LOCAL_AUTO\nGIT_CLONE_LOCAL\nGIT_CLONE_NO_LOCAL\nGIT_CLONE_LOCAL_NO_LINKS","tdef":"typedef","description":" Options for bypassing the git-aware transport on clone. Bypassing\n it means that instead of a fetch, libgit2 will copy the object\n database directory instead of figuring out what it needs, which is\n faster. If possible, it will hardlink the files to save space.","comments":"","fields":[{"type":"int","name":"GIT_CLONE_LOCAL_AUTO","comments":"

Auto-detect (default), libgit2 will bypass the git-aware\n transport for local paths, but use a normal fetch for\n file:// urls.

\n","value":0},{"type":"int","name":"GIT_CLONE_LOCAL","comments":"

Bypass the git-aware transport even for a file:// url.

\n","value":1},{"type":"int","name":"GIT_CLONE_NO_LOCAL","comments":"

Do no bypass the git-aware transport

\n","value":2},{"type":"int","name":"GIT_CLONE_LOCAL_NO_LINKS","comments":"

Bypass the git-aware transport, but do not try to use\n hardlinks.

\n","value":3}],"used":{"returns":[],"needs":[]}}],["git_clone_options",{"decl":["unsigned int version","git_checkout_options checkout_opts","git_fetch_options fetch_opts","int bare","git_clone_local_t local","const char * checkout_branch","git_repository_create_cb repository_cb","void * repository_cb_payload","git_remote_create_cb remote_cb","void * remote_cb_payload"],"type":"struct","value":"git_clone_options","file":"clone.h","line":103,"lineto":164,"block":"unsigned int version\ngit_checkout_options checkout_opts\ngit_fetch_options fetch_opts\nint bare\ngit_clone_local_t local\nconst char * checkout_branch\ngit_repository_create_cb repository_cb\nvoid * repository_cb_payload\ngit_remote_create_cb remote_cb\nvoid * remote_cb_payload","tdef":"typedef","description":" Clone options structure","comments":"

Use the GIT_CLONE_OPTIONS_INIT to get the default settings, like this:

\n\n
    git_clone_options opts = GIT_CLONE_OPTIONS_INIT;\n
\n","fields":[{"type":"unsigned int","name":"version","comments":""},{"type":"git_checkout_options","name":"checkout_opts","comments":" These options are passed to the checkout step. To disable\n checkout, set the `checkout_strategy` to\n `GIT_CHECKOUT_NONE`."},{"type":"git_fetch_options","name":"fetch_opts","comments":" Options which control the fetch, including callbacks.\n\n The callbacks are used for reporting fetch progress, and for acquiring\n credentials in the event they are needed."},{"type":"int","name":"bare","comments":" Set to zero (false) to create a standard repo, or non-zero\n for a bare repo"},{"type":"git_clone_local_t","name":"local","comments":" Whether to use a fetch or copy the object database."},{"type":"const char *","name":"checkout_branch","comments":" The name of the branch to checkout. NULL means use the\n remote's default branch."},{"type":"git_repository_create_cb","name":"repository_cb","comments":" A callback used to create the new repository into which to\n clone. If NULL, the 'bare' field will be used to determine\n whether to create a bare repository."},{"type":"void *","name":"repository_cb_payload","comments":" An opaque payload to pass to the git_repository creation callback.\n This parameter is ignored unless repository_cb is non-NULL."},{"type":"git_remote_create_cb","name":"remote_cb","comments":" A callback used to create the git_remote, prior to its being\n used to perform the clone operation. See the documentation for\n git_remote_create_cb for details. This parameter may be NULL,\n indicating that git_clone should provide default behavior."},{"type":"void *","name":"remote_cb_payload","comments":" An opaque payload to pass to the git_remote creation callback.\n This parameter is ignored unless remote_cb is non-NULL."}],"used":{"returns":[],"needs":["git_clone","git_clone_init_options"]}}],["git_commit",{"decl":"git_commit","type":"struct","value":"git_commit","file":"types.h","line":120,"lineto":120,"tdef":"typedef","description":" Parsed representation of a commit object. ","comments":"","used":{"returns":[],"needs":["git_branch_create","git_cherrypick","git_cherrypick_commit","git_commit_amend","git_commit_author","git_commit_committer","git_commit_create","git_commit_free","git_commit_header_field","git_commit_id","git_commit_lookup","git_commit_lookup_prefix","git_commit_message","git_commit_message_encoding","git_commit_message_raw","git_commit_nth_gen_ancestor","git_commit_owner","git_commit_parent","git_commit_parent_id","git_commit_parentcount","git_commit_raw_header","git_commit_summary","git_commit_time","git_commit_time_offset","git_commit_tree","git_commit_tree_id","git_diff_commit_as_email","git_merge_commits","git_revert","git_revert_commit"]}}],["git_config",{"decl":"git_config","type":"struct","value":"git_config","file":"types.h","line":138,"lineto":138,"tdef":"typedef","description":" Memory representation of a set of config files ","comments":"","used":{"returns":[],"needs":["git_config_add_backend","git_config_add_file_ondisk","git_config_delete_entry","git_config_delete_multivar","git_config_foreach","git_config_foreach_match","git_config_free","git_config_get_bool","git_config_get_entry","git_config_get_int32","git_config_get_int64","git_config_get_mapped","git_config_get_multivar_foreach","git_config_get_path","git_config_get_string","git_config_get_string_buf","git_config_iterator_glob_new","git_config_iterator_new","git_config_multivar_iterator_new","git_config_new","git_config_open_default","git_config_open_global","git_config_open_level","git_config_open_ondisk","git_config_set_bool","git_config_set_int32","git_config_set_int64","git_config_set_multivar","git_config_set_string","git_config_snapshot","git_repository_config","git_repository_config_snapshot","git_repository_set_config"]}}],["git_config_backend",{"decl":"git_config_backend","type":"struct","value":"git_config_backend","file":"types.h","line":141,"lineto":141,"block":"unsigned int version\nint readonly\nstruct git_config * cfg\nint (*)(struct git_config_backend *, git_config_level_t) open\nint (*)(struct git_config_backend *, const char *, git_config_entry **) get\nint (*)(struct git_config_backend *, const char *, const char *) set\nint (*)(git_config_backend *, const char *, const char *, const char *) set_multivar\nint (*)(struct git_config_backend *, const char *) del\nint (*)(struct git_config_backend *, const char *, const char *) del_multivar\nint (*)(git_config_iterator **, struct git_config_backend *) iterator\nint (*)(struct git_config_backend **, struct git_config_backend *) snapshot\nvoid (*)(struct git_config_backend *) free","tdef":"typedef","description":" Interface to access a configuration file ","comments":"","fields":[{"type":"unsigned int","name":"version","comments":""},{"type":"int","name":"readonly","comments":" True if this backend is for a snapshot "},{"type":"struct git_config *","name":"cfg","comments":""},{"type":"int (*)(struct git_config_backend *, git_config_level_t)","name":"open","comments":""},{"type":"int (*)(struct git_config_backend *, const char *, git_config_entry **)","name":"get","comments":""},{"type":"int (*)(struct git_config_backend *, const char *, const char *)","name":"set","comments":""},{"type":"int (*)(git_config_backend *, const char *, const char *, const char *)","name":"set_multivar","comments":""},{"type":"int (*)(struct git_config_backend *, const char *)","name":"del","comments":""},{"type":"int (*)(struct git_config_backend *, const char *, const char *)","name":"del_multivar","comments":""},{"type":"int (*)(git_config_iterator **, struct git_config_backend *)","name":"iterator","comments":""},{"type":"int (*)(struct git_config_backend **, struct git_config_backend *)","name":"snapshot","comments":" Produce a read-only version of this backend "},{"type":"void (*)(struct git_config_backend *)","name":"free","comments":""}],"used":{"returns":[],"needs":["git_config_add_backend","git_config_backend_foreach_match","git_config_init_backend"]}}],["git_config_entry",{"decl":["const char * name","const char * value","git_config_level_t level","void (*)(struct git_config_entry *) free","void * payload"],"type":"struct","value":"git_config_entry","file":"config.h","line":61,"lineto":67,"block":"const char * name\nconst char * value\ngit_config_level_t level\nvoid (*)(struct git_config_entry *) free\nvoid * payload","tdef":"typedef","description":" An entry in a configuration file","comments":"","fields":[{"type":"const char *","name":"name","comments":" Name of the entry (normalised) "},{"type":"const char *","name":"value","comments":" String value of the entry "},{"type":"git_config_level_t","name":"level","comments":" Which config file this was found in "},{"type":"void (*)(struct git_config_entry *)","name":"free","comments":" Free function for this entry "},{"type":"void *","name":"payload","comments":" Opaque value for the free function. Do not read or write "}],"used":{"returns":[],"needs":["git_config_entry_free","git_config_get_entry","git_config_next"]}}],["git_config_iterator",{"decl":["git_config_backend * backend","unsigned int flags","int (*)(git_config_entry **, git_config_iterator *) next","void (*)(git_config_iterator *) free"],"type":"struct","value":"git_config_iterator","file":"sys/config.h","line":34,"lineto":48,"block":"git_config_backend * backend\nunsigned int flags\nint (*)(git_config_entry **, git_config_iterator *) next\nvoid (*)(git_config_iterator *) free","tdef":null,"description":" Every iterator must have this struct as its first element, so the\n API can talk to it. You'd define your iterator as","comments":"
 struct my_iterator {\n         git_config_iterator parent;\n         ...\n }\n
\n\n

and assign iter->parent.backend to your git_config_backend.

\n","fields":[{"type":"git_config_backend *","name":"backend","comments":""},{"type":"unsigned int","name":"flags","comments":""},{"type":"int (*)(git_config_entry **, git_config_iterator *)","name":"next","comments":" Return the current entry and advance the iterator. The\n memory belongs to the library."},{"type":"void (*)(git_config_iterator *)","name":"free","comments":" Free the iterator"}],"used":{"returns":[],"needs":["git_config_iterator_free","git_config_iterator_glob_new","git_config_iterator_new","git_config_multivar_iterator_new","git_config_next"]}}],["git_config_level_t",{"decl":["GIT_CONFIG_LEVEL_SYSTEM","GIT_CONFIG_LEVEL_XDG","GIT_CONFIG_LEVEL_GLOBAL","GIT_CONFIG_LEVEL_LOCAL","GIT_CONFIG_LEVEL_APP","GIT_CONFIG_HIGHEST_LEVEL"],"type":"enum","file":"config.h","line":31,"lineto":56,"block":"GIT_CONFIG_LEVEL_SYSTEM\nGIT_CONFIG_LEVEL_XDG\nGIT_CONFIG_LEVEL_GLOBAL\nGIT_CONFIG_LEVEL_LOCAL\nGIT_CONFIG_LEVEL_APP\nGIT_CONFIG_HIGHEST_LEVEL","tdef":"typedef","description":" Priority level of a config file.\n These priority levels correspond to the natural escalation logic\n (from higher to lower) when searching for config entries in git.git.","comments":"

git_config_open_default() and git_repository_config() honor those\n priority levels as well.

\n","fields":[{"type":"int","name":"GIT_CONFIG_LEVEL_SYSTEM","comments":"

System-wide configuration file; /etc/gitconfig on Linux systems

\n","value":1},{"type":"int","name":"GIT_CONFIG_LEVEL_XDG","comments":"

XDG compatible configuration file; typically ~/.config/git/config

\n","value":2},{"type":"int","name":"GIT_CONFIG_LEVEL_GLOBAL","comments":"

User-specific configuration file (also called Global configuration\n file); typically ~/.gitconfig

\n","value":3},{"type":"int","name":"GIT_CONFIG_LEVEL_LOCAL","comments":"

Repository specific configuration file; $WORK_DIR/.git/config on\n non-bare repos

\n","value":4},{"type":"int","name":"GIT_CONFIG_LEVEL_APP","comments":"

Application specific configuration file; freely defined by applications

\n","value":5},{"type":"int","name":"GIT_CONFIG_HIGHEST_LEVEL","comments":"

Represents the highest level available config file (i.e. the most\n specific config file available that actually is loaded)

\n","value":-1}],"used":{"returns":[],"needs":["git_config_add_backend","git_config_add_file_ondisk","git_config_open_level"]}}],["git_cred_default",{"decl":"git_cred_default","type":"struct","value":"git_cred_default","file":"transport.h","line":183,"lineto":183,"tdef":"typedef","description":" A key for NTLM/Kerberos \"default\" credentials ","comments":"","used":{"returns":[],"needs":[]}}],["git_cred_ssh_custom",{"decl":["git_cred parent","char * username","char * publickey","size_t publickey_len","git_cred_sign_callback sign_callback","void * payload"],"type":"struct","value":"git_cred_ssh_custom","file":"transport.h","line":173,"lineto":180,"block":"git_cred parent\nchar * username\nchar * publickey\nsize_t publickey_len\ngit_cred_sign_callback sign_callback\nvoid * payload","tdef":"typedef","description":" A key with a custom signature function","comments":"","fields":[{"type":"git_cred","name":"parent","comments":""},{"type":"char *","name":"username","comments":""},{"type":"char *","name":"publickey","comments":""},{"type":"size_t","name":"publickey_len","comments":""},{"type":"git_cred_sign_callback","name":"sign_callback","comments":""},{"type":"void *","name":"payload","comments":""}],"used":{"returns":[],"needs":[]}}],["git_cred_ssh_interactive",{"decl":["git_cred parent","char * username","git_cred_ssh_interactive_callback prompt_callback","void * payload"],"type":"struct","value":"git_cred_ssh_interactive","file":"transport.h","line":163,"lineto":168,"block":"git_cred parent\nchar * username\ngit_cred_ssh_interactive_callback prompt_callback\nvoid * payload","tdef":"typedef","description":" Keyboard-interactive based ssh authentication","comments":"","fields":[{"type":"git_cred","name":"parent","comments":""},{"type":"char *","name":"username","comments":""},{"type":"git_cred_ssh_interactive_callback","name":"prompt_callback","comments":""},{"type":"void *","name":"payload","comments":""}],"used":{"returns":[],"needs":[]}}],["git_cred_ssh_key",{"decl":["git_cred parent","char * username","char * publickey","char * privatekey","char * passphrase"],"type":"struct","value":"git_cred_ssh_key","file":"transport.h","line":152,"lineto":158,"block":"git_cred parent\nchar * username\nchar * publickey\nchar * privatekey\nchar * passphrase","tdef":"typedef","description":" A ssh key from disk","comments":"","fields":[{"type":"git_cred","name":"parent","comments":""},{"type":"char *","name":"username","comments":""},{"type":"char *","name":"publickey","comments":""},{"type":"char *","name":"privatekey","comments":""},{"type":"char *","name":"passphrase","comments":""}],"used":{"returns":[],"needs":[]}}],["git_cred_username",{"decl":["git_cred parent","char [1] username"],"type":"struct","value":"git_cred_username","file":"transport.h","line":186,"lineto":189,"block":"git_cred parent\nchar [1] username","tdef":"typedef","description":" Username-only credential information ","comments":"","fields":[{"type":"git_cred","name":"parent","comments":""},{"type":"char [1]","name":"username","comments":""}],"used":{"returns":[],"needs":[]}}],["git_cred_userpass_payload",{"decl":["const char * username","const char * password"],"type":"struct","value":"git_cred_userpass_payload","file":"cred_helpers.h","line":24,"lineto":27,"block":"const char * username\nconst char * password","tdef":"typedef","description":" Payload for git_cred_stock_userpass_plaintext.","comments":"","fields":[{"type":"const char *","name":"username","comments":""},{"type":"const char *","name":"password","comments":""}],"used":{"returns":[],"needs":[]}}],["git_cred_userpass_plaintext",{"decl":["git_cred parent","char * username","char * password"],"type":"struct","value":"git_cred_userpass_plaintext","file":"transport.h","line":129,"lineto":133,"block":"git_cred parent\nchar * username\nchar * password","tdef":"typedef","description":" A plaintext username and password ","comments":"","fields":[{"type":"git_cred","name":"parent","comments":""},{"type":"char *","name":"username","comments":""},{"type":"char *","name":"password","comments":""}],"used":{"returns":[],"needs":[]}}],["git_credtype_t",{"decl":["GIT_CREDTYPE_USERPASS_PLAINTEXT","GIT_CREDTYPE_SSH_KEY","GIT_CREDTYPE_SSH_CUSTOM","GIT_CREDTYPE_DEFAULT","GIT_CREDTYPE_SSH_INTERACTIVE","GIT_CREDTYPE_USERNAME","GIT_CREDTYPE_SSH_MEMORY"],"type":"enum","file":"transport.h","line":88,"lineto":118,"block":"GIT_CREDTYPE_USERPASS_PLAINTEXT\nGIT_CREDTYPE_SSH_KEY\nGIT_CREDTYPE_SSH_CUSTOM\nGIT_CREDTYPE_DEFAULT\nGIT_CREDTYPE_SSH_INTERACTIVE\nGIT_CREDTYPE_USERNAME\nGIT_CREDTYPE_SSH_MEMORY","tdef":"typedef","description":" Authentication type requested ","comments":"","fields":[{"type":"int","name":"GIT_CREDTYPE_USERPASS_PLAINTEXT","comments":"","value":1},{"type":"int","name":"GIT_CREDTYPE_SSH_KEY","comments":"","value":2},{"type":"int","name":"GIT_CREDTYPE_SSH_CUSTOM","comments":"","value":4},{"type":"int","name":"GIT_CREDTYPE_DEFAULT","comments":"","value":8},{"type":"int","name":"GIT_CREDTYPE_SSH_INTERACTIVE","comments":"","value":16},{"type":"int","name":"GIT_CREDTYPE_USERNAME","comments":"

Username-only information

\n\n

If the SSH transport does not know which username to use,\n it will ask via this credential type.

\n","value":32},{"type":"int","name":"GIT_CREDTYPE_SSH_MEMORY","comments":"

Credentials read from memory.

\n\n

Only available for libssh2+OpenSSL for now.

\n","value":64}],"used":{"returns":[],"needs":[]}}],["git_cvar_map",{"decl":["git_cvar_t cvar_type","const char * str_match","int map_value"],"type":"struct","value":"git_cvar_map","file":"config.h","line":90,"lineto":94,"block":"git_cvar_t cvar_type\nconst char * str_match\nint map_value","tdef":"typedef","description":" Mapping from config variables to values.","comments":"","fields":[{"type":"git_cvar_t","name":"cvar_type","comments":""},{"type":"const char *","name":"str_match","comments":""},{"type":"int","name":"map_value","comments":""}],"used":{"returns":[],"needs":["git_config_get_mapped","git_config_lookup_map_value"]}}],["git_cvar_t",{"decl":["GIT_CVAR_FALSE","GIT_CVAR_TRUE","GIT_CVAR_INT32","GIT_CVAR_STRING"],"type":"enum","file":"config.h","line":80,"lineto":85,"block":"GIT_CVAR_FALSE\nGIT_CVAR_TRUE\nGIT_CVAR_INT32\nGIT_CVAR_STRING","tdef":"typedef","description":" Config var type","comments":"","fields":[{"type":"int","name":"GIT_CVAR_FALSE","comments":"","value":0},{"type":"int","name":"GIT_CVAR_TRUE","comments":"","value":1},{"type":"int","name":"GIT_CVAR_INT32","comments":"","value":2},{"type":"int","name":"GIT_CVAR_STRING","comments":"","value":3}],"used":{"returns":[],"needs":[]}}],["git_delta_t",{"decl":["GIT_DELTA_UNMODIFIED","GIT_DELTA_ADDED","GIT_DELTA_DELETED","GIT_DELTA_MODIFIED","GIT_DELTA_RENAMED","GIT_DELTA_COPIED","GIT_DELTA_IGNORED","GIT_DELTA_UNTRACKED","GIT_DELTA_TYPECHANGE","GIT_DELTA_UNREADABLE","GIT_DELTA_CONFLICTED"],"type":"enum","file":"diff.h","line":242,"lineto":254,"block":"GIT_DELTA_UNMODIFIED\nGIT_DELTA_ADDED\nGIT_DELTA_DELETED\nGIT_DELTA_MODIFIED\nGIT_DELTA_RENAMED\nGIT_DELTA_COPIED\nGIT_DELTA_IGNORED\nGIT_DELTA_UNTRACKED\nGIT_DELTA_TYPECHANGE\nGIT_DELTA_UNREADABLE\nGIT_DELTA_CONFLICTED","tdef":"typedef","description":" What type of change is described by a git_diff_delta?","comments":"

GIT_DELTA_RENAMED and GIT_DELTA_COPIED will only show up if you run\n git_diff_find_similar() on the diff object.

\n\n

GIT_DELTA_TYPECHANGE only shows up given GIT_DIFF_INCLUDE_TYPECHANGE\n in the option flags (otherwise type changes will be split into ADDED /\n DELETED pairs).

\n","fields":[{"type":"int","name":"GIT_DELTA_UNMODIFIED","comments":"

no changes

\n","value":0},{"type":"int","name":"GIT_DELTA_ADDED","comments":"

entry does not exist in old version

\n","value":1},{"type":"int","name":"GIT_DELTA_DELETED","comments":"

entry does not exist in new version

\n","value":2},{"type":"int","name":"GIT_DELTA_MODIFIED","comments":"

entry content changed between old and new

\n","value":3},{"type":"int","name":"GIT_DELTA_RENAMED","comments":"

entry was renamed between old and new

\n","value":4},{"type":"int","name":"GIT_DELTA_COPIED","comments":"

entry was copied from another old entry

\n","value":5},{"type":"int","name":"GIT_DELTA_IGNORED","comments":"

entry is ignored item in workdir

\n","value":6},{"type":"int","name":"GIT_DELTA_UNTRACKED","comments":"

entry is untracked item in workdir

\n","value":7},{"type":"int","name":"GIT_DELTA_TYPECHANGE","comments":"

type of entry changed between old and new

\n","value":8},{"type":"int","name":"GIT_DELTA_UNREADABLE","comments":"

entry is unreadable

\n","value":9},{"type":"int","name":"GIT_DELTA_CONFLICTED","comments":"

entry in the index is conflicted

\n","value":10}],"used":{"returns":[],"needs":["git_diff_num_deltas_of_type","git_diff_status_char"]}}],["git_describe_format_options",{"decl":["unsigned int version","unsigned int abbreviated_size","int always_use_long_format","const char * dirty_suffix"],"type":"struct","value":"git_describe_format_options","file":"describe.h","line":78,"lineto":98,"block":"unsigned int version\nunsigned int abbreviated_size\nint always_use_long_format\nconst char * dirty_suffix","tdef":"typedef","description":" Options for formatting the describe string","comments":"","fields":[{"type":"unsigned int","name":"version","comments":""},{"type":"unsigned int","name":"abbreviated_size","comments":" Size of the abbreviated commit id to use. This value is the\n lower bound for the length of the abbreviated string. The\n default is 7."},{"type":"int","name":"always_use_long_format","comments":" Set to use the long format even when a shorter name could be used."},{"type":"const char *","name":"dirty_suffix","comments":" If the workdir is dirty and this is set, this string will\n be appended to the description string."}],"used":{"returns":[],"needs":["git_describe_format"]}}],["git_describe_options",{"decl":["unsigned int version","unsigned int max_candidates_tags","unsigned int describe_strategy","const char * pattern","int only_follow_first_parent","int show_commit_oid_as_fallback"],"type":"struct","value":"git_describe_options","file":"describe.h","line":44,"lineto":62,"block":"unsigned int version\nunsigned int max_candidates_tags\nunsigned int describe_strategy\nconst char * pattern\nint only_follow_first_parent\nint show_commit_oid_as_fallback","tdef":"typedef","description":" Describe options structure","comments":"

Initialize with GIT_DESCRIBE_OPTIONS_INIT macro to correctly set\n the version field. E.g.

\n\n
    git_describe_options opts = GIT_DESCRIBE_OPTIONS_INIT;\n
\n","fields":[{"type":"unsigned int","name":"version","comments":""},{"type":"unsigned int","name":"max_candidates_tags","comments":""},{"type":"unsigned int","name":"describe_strategy","comments":" default: 10 "},{"type":"const char *","name":"pattern","comments":" default: GIT_DESCRIBE_DEFAULT "},{"type":"int","name":"only_follow_first_parent","comments":" When calculating the distance from the matching tag or\n reference, only walk down the first-parent ancestry."},{"type":"int","name":"show_commit_oid_as_fallback","comments":" If no matching tag or reference is found, the describe\n operation would normally fail. If this option is set, it\n will instead fall back to showing the full id of the\n commit."}],"used":{"returns":[],"needs":["git_describe_commit","git_describe_workdir"]}}],["git_describe_strategy_t",{"decl":["GIT_DESCRIBE_DEFAULT","GIT_DESCRIBE_TAGS","GIT_DESCRIBE_ALL"],"type":"enum","file":"describe.h","line":30,"lineto":34,"block":"GIT_DESCRIBE_DEFAULT\nGIT_DESCRIBE_TAGS\nGIT_DESCRIBE_ALL","tdef":"typedef","description":" Reference lookup strategy","comments":"

These behave like the --tags and --all optios to git-describe,\n namely they say to look for any reference in either refs/tags/ or\n refs/ respectively.

\n","fields":[{"type":"int","name":"GIT_DESCRIBE_DEFAULT","comments":"","value":0},{"type":"int","name":"GIT_DESCRIBE_TAGS","comments":"","value":1},{"type":"int","name":"GIT_DESCRIBE_ALL","comments":"","value":2}],"used":{"returns":[],"needs":[]}}],["git_diff",{"decl":"git_diff","type":"struct","value":"git_diff","file":"diff.h","line":215,"lineto":215,"tdef":"typedef","description":" The diff object that contains all individual file deltas.","comments":"

This is an opaque structure which will be allocated by one of the diff\n generator functions below (such as git_diff_tree_to_tree). You are\n responsible for releasing the object memory when done, using the\n git_diff_free() function.

\n","used":{"returns":[],"needs":["git_diff_find_similar","git_diff_foreach","git_diff_format_email","git_diff_free","git_diff_get_delta","git_diff_get_perfdata","git_diff_get_stats","git_diff_index_to_workdir","git_diff_is_sorted_icase","git_diff_merge","git_diff_num_deltas","git_diff_num_deltas_of_type","git_diff_print","git_diff_tree_to_index","git_diff_tree_to_tree","git_diff_tree_to_workdir","git_diff_tree_to_workdir_with_index","git_patch_from_diff","git_pathspec_match_diff"]}}],["git_diff_binary",{"decl":["git_diff_binary_file old_file","git_diff_binary_file new_file"],"type":"struct","value":"git_diff_binary","file":"diff.h","line":461,"lineto":464,"block":"git_diff_binary_file old_file\ngit_diff_binary_file new_file","tdef":"typedef","description":" Structure describing the binary contents of a diff. ","comments":"","fields":[{"type":"git_diff_binary_file","name":"old_file","comments":" The contents of the old file. "},{"type":"git_diff_binary_file","name":"new_file","comments":" The contents of the new file. "}],"used":{"returns":[],"needs":[]}}],["git_diff_binary_file",{"decl":["git_diff_binary_t type","const char * data","size_t datalen","size_t inflatedlen"],"type":"struct","value":"git_diff_binary_file","file":"diff.h","line":446,"lineto":458,"block":"git_diff_binary_t type\nconst char * data\nsize_t datalen\nsize_t inflatedlen","tdef":"typedef","description":" The contents of one of the files in a binary diff. ","comments":"","fields":[{"type":"git_diff_binary_t","name":"type","comments":" The type of binary data for this file. "},{"type":"const char *","name":"data","comments":" The binary data, deflated. "},{"type":"size_t","name":"datalen","comments":" The length of the binary data. "},{"type":"size_t","name":"inflatedlen","comments":" The length of the binary data after inflation. "}],"used":{"returns":[],"needs":[]}}],["git_diff_binary_t",{"decl":["GIT_DIFF_BINARY_NONE","GIT_DIFF_BINARY_LITERAL","GIT_DIFF_BINARY_DELTA"],"type":"enum","file":"diff.h","line":434,"lineto":443,"block":"GIT_DIFF_BINARY_NONE\nGIT_DIFF_BINARY_LITERAL\nGIT_DIFF_BINARY_DELTA","tdef":"typedef","description":" When producing a binary diff, the binary data returned will be\n either the deflated full (\"literal\") contents of the file, or\n the deflated binary delta between the two sides (whichever is\n smaller).","comments":"","fields":[{"type":"int","name":"GIT_DIFF_BINARY_NONE","comments":"

There is no binary delta.

\n","value":0},{"type":"int","name":"GIT_DIFF_BINARY_LITERAL","comments":"

The binary data is the literal contents of the file.

\n","value":1},{"type":"int","name":"GIT_DIFF_BINARY_DELTA","comments":"

The binary data is the delta from one side to the other.

\n","value":2}],"used":{"returns":[],"needs":[]}}],["git_diff_delta",{"decl":["git_delta_t status","uint32_t flags","uint16_t similarity","uint16_t nfiles","git_diff_file old_file","git_diff_file new_file"],"type":"struct","value":"git_diff_delta","file":"diff.h","line":321,"lineto":328,"block":"git_delta_t status\nuint32_t flags\nuint16_t similarity\nuint16_t nfiles\ngit_diff_file old_file\ngit_diff_file new_file","tdef":"typedef","description":" Description of changes to one entry.","comments":"

When iterating over a diff, this will be passed to most callbacks and\n you can use the contents to understand exactly what has changed.

\n\n

The old_file represents the "from" side of the diff and the new_file\n represents to "to" side of the diff. What those means depend on the\n function that was used to generate the diff and will be documented below.\n You can also use the GIT_DIFF_REVERSE flag to flip it around.

\n\n

Although the two sides of the delta are named "old_file" and "new_file",\n they actually may correspond to entries that represent a file, a symbolic\n link, a submodule commit id, or even a tree (if you are tracking type\n changes or ignored/untracked directories).

\n\n

Under some circumstances, in the name of efficiency, not all fields will\n be filled in, but we generally try to fill in as much as possible. One\n example is that the "flags" field may not have either the BINARY or the\n NOT_BINARY flag set to avoid examining file contents if you do not pass\n in hunk and/or line callbacks to the diff foreach iteration function. It\n will just use the git attributes for those files.

\n\n

The similarity score is zero unless you call git_diff_find_similar()\n which does a similarity analysis of files in the diff. Use that\n function to do rename and copy detection, and to split heavily modified\n files in add/delete pairs. After that call, deltas with a status of\n GIT_DELTA_RENAMED or GIT_DELTA_COPIED will have a similarity score\n between 0 and 100 indicating how similar the old and new sides are.

\n\n

If you ask git_diff_find_similar to find heavily modified files to\n break, but to not actually break the records, then GIT_DELTA_MODIFIED\n records may have a non-zero similarity score if the self-similarity is\n below the split threshold. To display this value like core Git, invert\n the score (a la printf("M%03d", 100 - delta->similarity)).

\n","fields":[{"type":"git_delta_t","name":"status","comments":""},{"type":"uint32_t","name":"flags","comments":" git_diff_flag_t values "},{"type":"uint16_t","name":"similarity","comments":" for RENAMED and COPIED, value 0-100 "},{"type":"uint16_t","name":"nfiles","comments":" number of files in this delta "},{"type":"git_diff_file","name":"old_file","comments":""},{"type":"git_diff_file","name":"new_file","comments":""}],"used":{"returns":["git_diff_get_delta","git_patch_get_delta","git_pathspec_match_list_diff_entry"],"needs":["git_diff_print_callback__to_buf","git_diff_print_callback__to_file_handle"]}}],["git_diff_file",{"decl":["git_oid id","const char * path","git_off_t size","uint32_t flags","uint16_t mode"],"type":"struct","value":"git_diff_file","file":"diff.h","line":277,"lineto":283,"block":"git_oid id\nconst char * path\ngit_off_t size\nuint32_t flags\nuint16_t mode","tdef":"typedef","description":" Description of one side of a delta.","comments":"

Although this is called a "file", it could represent a file, a symbolic\n link, a submodule commit id, or even a tree (although that only if you\n are tracking type changes or ignored/untracked directories).

\n\n

The oid is the git_oid of the item. If the entry represents an\n absent side of a diff (e.g. the old_file of a GIT_DELTA_ADDED delta),\n then the oid will be zeroes.

\n\n

path is the NUL-terminated path to the entry relative to the working\n directory of the repository.

\n\n

size is the size of the entry in bytes.

\n\n

flags is a combination of the git_diff_flag_t types

\n\n

mode is, roughly, the stat() st_mode value for the item. This will\n be restricted to one of the git_filemode_t values.

\n","fields":[{"type":"git_oid","name":"id","comments":""},{"type":"const char *","name":"path","comments":""},{"type":"git_off_t","name":"size","comments":""},{"type":"uint32_t","name":"flags","comments":""},{"type":"uint16_t","name":"mode","comments":""}],"used":{"returns":[],"needs":[]}}],["git_diff_find_options",{"decl":["unsigned int version","uint32_t flags","uint16_t rename_threshold","uint16_t rename_from_rewrite_threshold","uint16_t copy_threshold","uint16_t break_rewrite_threshold","size_t rename_limit","git_diff_similarity_metric * metric"],"type":"struct","value":"git_diff_find_options","file":"diff.h","line":658,"lineto":684,"block":"unsigned int version\nuint32_t flags\nuint16_t rename_threshold\nuint16_t rename_from_rewrite_threshold\nuint16_t copy_threshold\nuint16_t break_rewrite_threshold\nsize_t rename_limit\ngit_diff_similarity_metric * metric","tdef":"typedef","description":" Control behavior of rename and copy detection","comments":"

These options mostly mimic parameters that can be passed to git-diff.

\n\n
    \n
  • rename_threshold is the same as the -M option with a value
  • \n
  • copy_threshold is the same as the -C option with a value
  • \n
  • rename_from_rewrite_threshold matches the top of the -B option
  • \n
  • break_rewrite_threshold matches the bottom of the -B option
  • \n
  • rename_limit is the maximum number of matches to consider for\na particular file. This is a little different from the -l option\nto regular Git because we will still process up to this many matches\nbefore abandoning the search.
  • \n
\n\n

The metric option allows you to plug in a custom similarity metric.\n Set it to NULL for the default internal metric which is based on sampling\n hashes of ranges of data in the file. The default metric is a pretty\n good similarity approximation that should work fairly well for both text\n and binary data, and is pretty fast with fixed memory overhead.

\n","fields":[{"type":"unsigned int","name":"version","comments":""},{"type":"uint32_t","name":"flags","comments":" Combination of git_diff_find_t values (default GIT_DIFF_FIND_BY_CONFIG).\n NOTE: if you don't explicitly set this, `diff.renames` could be set\n to false, resulting in `git_diff_find_similar` doing nothing."},{"type":"uint16_t","name":"rename_threshold","comments":" Similarity to consider a file renamed (default 50) "},{"type":"uint16_t","name":"rename_from_rewrite_threshold","comments":" Similarity of modified to be eligible rename source (default 50) "},{"type":"uint16_t","name":"copy_threshold","comments":" Similarity to consider a file a copy (default 50) "},{"type":"uint16_t","name":"break_rewrite_threshold","comments":" Similarity to split modify into delete/add pair (default 60) "},{"type":"size_t","name":"rename_limit","comments":" Maximum similarity sources to examine for a file (somewhat like\n git-diff's `-l` option or `diff.renameLimit` config) (default 200)"},{"type":"git_diff_similarity_metric *","name":"metric","comments":" Pluggable similarity metric; pass NULL to use internal metric "}],"used":{"returns":[],"needs":["git_diff_find_init_options","git_diff_find_similar"]}}],["git_diff_find_t",{"decl":["GIT_DIFF_FIND_BY_CONFIG","GIT_DIFF_FIND_RENAMES","GIT_DIFF_FIND_RENAMES_FROM_REWRITES","GIT_DIFF_FIND_COPIES","GIT_DIFF_FIND_COPIES_FROM_UNMODIFIED","GIT_DIFF_FIND_REWRITES","GIT_DIFF_BREAK_REWRITES","GIT_DIFF_FIND_AND_BREAK_REWRITES","GIT_DIFF_FIND_FOR_UNTRACKED","GIT_DIFF_FIND_ALL","GIT_DIFF_FIND_IGNORE_LEADING_WHITESPACE","GIT_DIFF_FIND_IGNORE_WHITESPACE","GIT_DIFF_FIND_DONT_IGNORE_WHITESPACE","GIT_DIFF_FIND_EXACT_MATCH_ONLY","GIT_DIFF_BREAK_REWRITES_FOR_RENAMES_ONLY","GIT_DIFF_FIND_REMOVE_UNMODIFIED"],"type":"enum","file":"diff.h","line":552,"lineto":621,"block":"GIT_DIFF_FIND_BY_CONFIG\nGIT_DIFF_FIND_RENAMES\nGIT_DIFF_FIND_RENAMES_FROM_REWRITES\nGIT_DIFF_FIND_COPIES\nGIT_DIFF_FIND_COPIES_FROM_UNMODIFIED\nGIT_DIFF_FIND_REWRITES\nGIT_DIFF_BREAK_REWRITES\nGIT_DIFF_FIND_AND_BREAK_REWRITES\nGIT_DIFF_FIND_FOR_UNTRACKED\nGIT_DIFF_FIND_ALL\nGIT_DIFF_FIND_IGNORE_LEADING_WHITESPACE\nGIT_DIFF_FIND_IGNORE_WHITESPACE\nGIT_DIFF_FIND_DONT_IGNORE_WHITESPACE\nGIT_DIFF_FIND_EXACT_MATCH_ONLY\nGIT_DIFF_BREAK_REWRITES_FOR_RENAMES_ONLY\nGIT_DIFF_FIND_REMOVE_UNMODIFIED","tdef":"typedef","description":" Flags to control the behavior of diff rename/copy detection.","comments":"","fields":[{"type":"int","name":"GIT_DIFF_FIND_BY_CONFIG","comments":"

Obey diff.renames. Overridden by any other GIT_DIFF_FIND_... flag.

\n","value":0},{"type":"int","name":"GIT_DIFF_FIND_RENAMES","comments":"

Look for renames? (--find-renames)

\n","value":1},{"type":"int","name":"GIT_DIFF_FIND_RENAMES_FROM_REWRITES","comments":"

Consider old side of MODIFIED for renames? (--break-rewrites=N)

\n","value":2},{"type":"int","name":"GIT_DIFF_FIND_COPIES","comments":"

Look for copies? (a la --find-copies).

\n","value":4},{"type":"int","name":"GIT_DIFF_FIND_COPIES_FROM_UNMODIFIED","comments":"

Consider UNMODIFIED as copy sources? (--find-copies-harder).

\n\n

For this to work correctly, use GIT_DIFF_INCLUDE_UNMODIFIED when\n the initial git_diff is being generated.

\n","value":8},{"type":"int","name":"GIT_DIFF_FIND_REWRITES","comments":"

Mark significant rewrites for split (--break-rewrites=/M)

\n","value":16},{"type":"int","name":"GIT_DIFF_BREAK_REWRITES","comments":"

Actually split large rewrites into delete/add pairs

\n","value":32},{"type":"int","name":"GIT_DIFF_FIND_AND_BREAK_REWRITES","comments":"

Mark rewrites for split and break into delete/add pairs

\n","value":48},{"type":"int","name":"GIT_DIFF_FIND_FOR_UNTRACKED","comments":"

Find renames/copies for UNTRACKED items in working directory.

\n\n

For this to work correctly, use GIT_DIFF_INCLUDE_UNTRACKED when the\n initial git_diff is being generated (and obviously the diff must\n be against the working directory for this to make sense).

\n","value":64},{"type":"int","name":"GIT_DIFF_FIND_ALL","comments":"

Turn on all finding features.

\n","value":255},{"type":"int","name":"GIT_DIFF_FIND_IGNORE_LEADING_WHITESPACE","comments":"

Measure similarity ignoring leading whitespace (default)

\n","value":0},{"type":"int","name":"GIT_DIFF_FIND_IGNORE_WHITESPACE","comments":"

Measure similarity ignoring all whitespace

\n","value":4096},{"type":"int","name":"GIT_DIFF_FIND_DONT_IGNORE_WHITESPACE","comments":"

Measure similarity including all data

\n","value":8192},{"type":"int","name":"GIT_DIFF_FIND_EXACT_MATCH_ONLY","comments":"

Measure similarity only by comparing SHAs (fast and cheap)

\n","value":16384},{"type":"int","name":"GIT_DIFF_BREAK_REWRITES_FOR_RENAMES_ONLY","comments":"

Do not break rewrites unless they contribute to a rename.

\n\n

Normally, GIT_DIFF_FIND_AND_BREAK_REWRITES will measure the self-\n similarity of modified files and split the ones that have changed a\n lot into a DELETE / ADD pair. Then the sides of that pair will be\n considered candidates for rename and copy detection.

\n\n

If you add this flag in and the split pair is not used for an\n actual rename or copy, then the modified record will be restored to\n a regular MODIFIED record instead of being split.

\n","value":32768},{"type":"int","name":"GIT_DIFF_FIND_REMOVE_UNMODIFIED","comments":"

Remove any UNMODIFIED deltas after find_similar is done.

\n\n

Using GIT_DIFF_FIND_COPIES_FROM_UNMODIFIED to emulate the\n --find-copies-harder behavior requires building a diff with the\n GIT_DIFF_INCLUDE_UNMODIFIED flag. If you do not want UNMODIFIED\n records in the final result, pass this flag to have them removed.

\n","value":65536}],"used":{"returns":[],"needs":[]}}],["git_diff_flag_t",{"decl":["GIT_DIFF_FLAG_BINARY","GIT_DIFF_FLAG_NOT_BINARY","GIT_DIFF_FLAG_VALID_ID","GIT_DIFF_FLAG_EXISTS"],"type":"enum","file":"diff.h","line":225,"lineto":230,"block":"GIT_DIFF_FLAG_BINARY\nGIT_DIFF_FLAG_NOT_BINARY\nGIT_DIFF_FLAG_VALID_ID\nGIT_DIFF_FLAG_EXISTS","tdef":"typedef","description":" Flags for the delta object and the file objects on each side.","comments":"

These flags are used for both the flags value of the git_diff_delta\n and the flags for the git_diff_file objects representing the old and\n new sides of the delta. Values outside of this public range should be\n considered reserved for internal or future use.

\n","fields":[{"type":"int","name":"GIT_DIFF_FLAG_BINARY","comments":"

file(s) treated as binary data

\n","value":1},{"type":"int","name":"GIT_DIFF_FLAG_NOT_BINARY","comments":"

file(s) treated as text data

\n","value":2},{"type":"int","name":"GIT_DIFF_FLAG_VALID_ID","comments":"

id value is known correct

\n","value":4},{"type":"int","name":"GIT_DIFF_FLAG_EXISTS","comments":"

file exists at this side of the delta

\n","value":8}],"used":{"returns":[],"needs":[]}}],["git_diff_format_email_flags_t",{"decl":["GIT_DIFF_FORMAT_EMAIL_NONE","GIT_DIFF_FORMAT_EMAIL_EXCLUDE_SUBJECT_PATCH_MARKER"],"type":"enum","file":"diff.h","line":1218,"lineto":1225,"block":"GIT_DIFF_FORMAT_EMAIL_NONE\nGIT_DIFF_FORMAT_EMAIL_EXCLUDE_SUBJECT_PATCH_MARKER","tdef":"typedef","description":" Formatting options for diff e-mail generation","comments":"","fields":[{"type":"int","name":"GIT_DIFF_FORMAT_EMAIL_NONE","comments":"

Normal patch, the default

\n","value":0},{"type":"int","name":"GIT_DIFF_FORMAT_EMAIL_EXCLUDE_SUBJECT_PATCH_MARKER","comments":"

Don't insert "[PATCH]" in the subject header

\n","value":1}],"used":{"returns":[],"needs":["git_diff_commit_as_email"]}}],["git_diff_format_email_options",{"decl":["unsigned int version","git_diff_format_email_flags_t flags","size_t patch_no","size_t total_patches","const git_oid * id","const char * summary","const git_signature * author"],"type":"struct","value":"git_diff_format_email_options","file":"diff.h","line":1230,"lineto":1249,"block":"unsigned int version\ngit_diff_format_email_flags_t flags\nsize_t patch_no\nsize_t total_patches\nconst git_oid * id\nconst char * summary\nconst git_signature * author","tdef":"typedef","description":" Options for controlling the formatting of the generated e-mail.","comments":"","fields":[{"type":"unsigned int","name":"version","comments":""},{"type":"git_diff_format_email_flags_t","name":"flags","comments":""},{"type":"size_t","name":"patch_no","comments":" This patch number "},{"type":"size_t","name":"total_patches","comments":" Total number of patches in this series "},{"type":"const git_oid *","name":"id","comments":" id to use for the commit "},{"type":"const char *","name":"summary","comments":" Summary of the change "},{"type":"const git_signature *","name":"author","comments":" Author of the change "}],"used":{"returns":[],"needs":["git_diff_format_email","git_diff_format_email_init_options"]}}],["git_diff_format_t",{"decl":["GIT_DIFF_FORMAT_PATCH","GIT_DIFF_FORMAT_PATCH_HEADER","GIT_DIFF_FORMAT_RAW","GIT_DIFF_FORMAT_NAME_ONLY","GIT_DIFF_FORMAT_NAME_STATUS"],"type":"enum","file":"diff.h","line":981,"lineto":987,"block":"GIT_DIFF_FORMAT_PATCH\nGIT_DIFF_FORMAT_PATCH_HEADER\nGIT_DIFF_FORMAT_RAW\nGIT_DIFF_FORMAT_NAME_ONLY\nGIT_DIFF_FORMAT_NAME_STATUS","tdef":"typedef","description":" Possible output formats for diff data","comments":"","fields":[{"type":"int","name":"GIT_DIFF_FORMAT_PATCH","comments":"

full git diff

\n","value":1},{"type":"int","name":"GIT_DIFF_FORMAT_PATCH_HEADER","comments":"

just the file headers of patch

\n","value":2},{"type":"int","name":"GIT_DIFF_FORMAT_RAW","comments":"

like git diff --raw

\n","value":3},{"type":"int","name":"GIT_DIFF_FORMAT_NAME_ONLY","comments":"

like git diff --name-only

\n","value":4},{"type":"int","name":"GIT_DIFF_FORMAT_NAME_STATUS","comments":"

like git diff --name-status

\n","value":5}],"used":{"returns":[],"needs":["git_diff_print"]}}],["git_diff_hunk",{"decl":["int old_start","int old_lines","int new_start","int new_lines","size_t header_len","char [128] header"],"type":"struct","value":"git_diff_hunk","file":"diff.h","line":478,"lineto":485,"block":"int old_start\nint old_lines\nint new_start\nint new_lines\nsize_t header_len\nchar [128] header","tdef":"typedef","description":" Structure describing a hunk of a diff.","comments":"","fields":[{"type":"int","name":"old_start","comments":" Starting line number in old_file "},{"type":"int","name":"old_lines","comments":" Number of lines in old_file "},{"type":"int","name":"new_start","comments":" Starting line number in new_file "},{"type":"int","name":"new_lines","comments":" Number of lines in new_file "},{"type":"size_t","name":"header_len","comments":" Number of bytes in header text "},{"type":"char [128]","name":"header","comments":" Header text, NUL-byte terminated "}],"used":{"returns":[],"needs":["git_diff_print_callback__to_buf","git_diff_print_callback__to_file_handle","git_patch_get_hunk"]}}],["git_diff_line",{"decl":["char origin","int old_lineno","int new_lineno","int num_lines","size_t content_len","git_off_t content_offset","const char * content"],"type":"struct","value":"git_diff_line","file":"diff.h","line":525,"lineto":533,"block":"char origin\nint old_lineno\nint new_lineno\nint num_lines\nsize_t content_len\ngit_off_t content_offset\nconst char * content","tdef":"typedef","description":" Structure describing a line (or data span) of a diff.","comments":"","fields":[{"type":"char","name":"origin","comments":" A git_diff_line_t value "},{"type":"int","name":"old_lineno","comments":" Line number in old file or -1 for added line "},{"type":"int","name":"new_lineno","comments":" Line number in new file or -1 for deleted line "},{"type":"int","name":"num_lines","comments":" Number of newline characters in content "},{"type":"size_t","name":"content_len","comments":" Number of bytes of data "},{"type":"git_off_t","name":"content_offset","comments":" Offset in the original file to the content "},{"type":"const char *","name":"content","comments":" Pointer to diff text, not NUL-byte terminated "}],"used":{"returns":[],"needs":["git_diff_print_callback__to_buf","git_diff_print_callback__to_file_handle","git_patch_get_line_in_hunk"]}}],["git_diff_line_t",{"decl":["GIT_DIFF_LINE_CONTEXT","GIT_DIFF_LINE_ADDITION","GIT_DIFF_LINE_DELETION","GIT_DIFF_LINE_CONTEXT_EOFNL","GIT_DIFF_LINE_ADD_EOFNL","GIT_DIFF_LINE_DEL_EOFNL","GIT_DIFF_LINE_FILE_HDR","GIT_DIFF_LINE_HUNK_HDR","GIT_DIFF_LINE_BINARY"],"type":"enum","file":"diff.h","line":504,"lineto":520,"block":"GIT_DIFF_LINE_CONTEXT\nGIT_DIFF_LINE_ADDITION\nGIT_DIFF_LINE_DELETION\nGIT_DIFF_LINE_CONTEXT_EOFNL\nGIT_DIFF_LINE_ADD_EOFNL\nGIT_DIFF_LINE_DEL_EOFNL\nGIT_DIFF_LINE_FILE_HDR\nGIT_DIFF_LINE_HUNK_HDR\nGIT_DIFF_LINE_BINARY","tdef":"typedef","description":" Line origin constants.","comments":"

These values describe where a line came from and will be passed to\n the git_diff_line_cb when iterating over a diff. There are some\n special origin constants at the end that are used for the text\n output callbacks to demarcate lines that are actually part of\n the file or hunk headers.

\n","fields":[{"type":"int","name":"GIT_DIFF_LINE_CONTEXT","comments":"","value":32},{"type":"int","name":"GIT_DIFF_LINE_ADDITION","comments":"","value":43},{"type":"int","name":"GIT_DIFF_LINE_DELETION","comments":"","value":45},{"type":"int","name":"GIT_DIFF_LINE_CONTEXT_EOFNL","comments":"

Both files have no LF at end

\n","value":61},{"type":"int","name":"GIT_DIFF_LINE_ADD_EOFNL","comments":"

Old has no LF at end, new does

\n","value":62},{"type":"int","name":"GIT_DIFF_LINE_DEL_EOFNL","comments":"

Old has LF at end, new does not

\n","value":60},{"type":"int","name":"GIT_DIFF_LINE_FILE_HDR","comments":"","value":70},{"type":"int","name":"GIT_DIFF_LINE_HUNK_HDR","comments":"","value":72},{"type":"int","name":"GIT_DIFF_LINE_BINARY","comments":"

For "Binary files x and y differ"

\n","value":66}],"used":{"returns":[],"needs":[]}}],["git_diff_option_t",{"decl":["GIT_DIFF_NORMAL","GIT_DIFF_REVERSE","GIT_DIFF_INCLUDE_IGNORED","GIT_DIFF_RECURSE_IGNORED_DIRS","GIT_DIFF_INCLUDE_UNTRACKED","GIT_DIFF_RECURSE_UNTRACKED_DIRS","GIT_DIFF_INCLUDE_UNMODIFIED","GIT_DIFF_INCLUDE_TYPECHANGE","GIT_DIFF_INCLUDE_TYPECHANGE_TREES","GIT_DIFF_IGNORE_FILEMODE","GIT_DIFF_IGNORE_SUBMODULES","GIT_DIFF_IGNORE_CASE","GIT_DIFF_INCLUDE_CASECHANGE","GIT_DIFF_DISABLE_PATHSPEC_MATCH","GIT_DIFF_SKIP_BINARY_CHECK","GIT_DIFF_ENABLE_FAST_UNTRACKED_DIRS","GIT_DIFF_UPDATE_INDEX","GIT_DIFF_INCLUDE_UNREADABLE","GIT_DIFF_INCLUDE_UNREADABLE_AS_UNTRACKED","GIT_DIFF_FORCE_TEXT","GIT_DIFF_FORCE_BINARY","GIT_DIFF_IGNORE_WHITESPACE","GIT_DIFF_IGNORE_WHITESPACE_CHANGE","GIT_DIFF_IGNORE_WHITESPACE_EOL","GIT_DIFF_SHOW_UNTRACKED_CONTENT","GIT_DIFF_SHOW_UNMODIFIED","GIT_DIFF_PATIENCE","GIT_DIFF_MINIMAL","GIT_DIFF_SHOW_BINARY"],"type":"enum","file":"diff.h","line":72,"lineto":205,"block":"GIT_DIFF_NORMAL\nGIT_DIFF_REVERSE\nGIT_DIFF_INCLUDE_IGNORED\nGIT_DIFF_RECURSE_IGNORED_DIRS\nGIT_DIFF_INCLUDE_UNTRACKED\nGIT_DIFF_RECURSE_UNTRACKED_DIRS\nGIT_DIFF_INCLUDE_UNMODIFIED\nGIT_DIFF_INCLUDE_TYPECHANGE\nGIT_DIFF_INCLUDE_TYPECHANGE_TREES\nGIT_DIFF_IGNORE_FILEMODE\nGIT_DIFF_IGNORE_SUBMODULES\nGIT_DIFF_IGNORE_CASE\nGIT_DIFF_INCLUDE_CASECHANGE\nGIT_DIFF_DISABLE_PATHSPEC_MATCH\nGIT_DIFF_SKIP_BINARY_CHECK\nGIT_DIFF_ENABLE_FAST_UNTRACKED_DIRS\nGIT_DIFF_UPDATE_INDEX\nGIT_DIFF_INCLUDE_UNREADABLE\nGIT_DIFF_INCLUDE_UNREADABLE_AS_UNTRACKED\nGIT_DIFF_FORCE_TEXT\nGIT_DIFF_FORCE_BINARY\nGIT_DIFF_IGNORE_WHITESPACE\nGIT_DIFF_IGNORE_WHITESPACE_CHANGE\nGIT_DIFF_IGNORE_WHITESPACE_EOL\nGIT_DIFF_SHOW_UNTRACKED_CONTENT\nGIT_DIFF_SHOW_UNMODIFIED\nGIT_DIFF_PATIENCE\nGIT_DIFF_MINIMAL\nGIT_DIFF_SHOW_BINARY","tdef":"typedef","description":" Flags for diff options. A combination of these flags can be passed\n in via the `flags` value in the `git_diff_options`.","comments":"","fields":[{"type":"int","name":"GIT_DIFF_NORMAL","comments":"

Normal diff, the default

\n","value":0},{"type":"int","name":"GIT_DIFF_REVERSE","comments":"

Reverse the sides of the diff

\n","value":1},{"type":"int","name":"GIT_DIFF_INCLUDE_IGNORED","comments":"

Include ignored files in the diff

\n","value":2},{"type":"int","name":"GIT_DIFF_RECURSE_IGNORED_DIRS","comments":"

Even with GIT_DIFF_INCLUDE_IGNORED, an entire ignored directory\n will be marked with only a single entry in the diff; this flag\n adds all files under the directory as IGNORED entries, too.

\n","value":4},{"type":"int","name":"GIT_DIFF_INCLUDE_UNTRACKED","comments":"

Include untracked files in the diff

\n","value":8},{"type":"int","name":"GIT_DIFF_RECURSE_UNTRACKED_DIRS","comments":"

Even with GIT_DIFF_INCLUDE_UNTRACKED, an entire untracked\n directory will be marked with only a single entry in the diff\n (a la what core Git does in git status); this flag adds all\n files under untracked directories as UNTRACKED entries, too.

\n","value":16},{"type":"int","name":"GIT_DIFF_INCLUDE_UNMODIFIED","comments":"

Include unmodified files in the diff

\n","value":32},{"type":"int","name":"GIT_DIFF_INCLUDE_TYPECHANGE","comments":"

Normally, a type change between files will be converted into a\n DELETED record for the old and an ADDED record for the new; this\n options enabled the generation of TYPECHANGE delta records.

\n","value":64},{"type":"int","name":"GIT_DIFF_INCLUDE_TYPECHANGE_TREES","comments":"

Even with GIT_DIFF_INCLUDE_TYPECHANGE, blob->tree changes still\n generally show as a DELETED blob. This flag tries to correctly\n label blob->tree transitions as TYPECHANGE records with new_file's\n mode set to tree. Note: the tree SHA will not be available.

\n","value":128},{"type":"int","name":"GIT_DIFF_IGNORE_FILEMODE","comments":"

Ignore file mode changes

\n","value":256},{"type":"int","name":"GIT_DIFF_IGNORE_SUBMODULES","comments":"

Treat all submodules as unmodified

\n","value":512},{"type":"int","name":"GIT_DIFF_IGNORE_CASE","comments":"

Use case insensitive filename comparisons

\n","value":1024},{"type":"int","name":"GIT_DIFF_INCLUDE_CASECHANGE","comments":"

May be combined with GIT_DIFF_IGNORE_CASE to specify that a file\n that has changed case will be returned as an add/delete pair.

\n","value":2048},{"type":"int","name":"GIT_DIFF_DISABLE_PATHSPEC_MATCH","comments":"

If the pathspec is set in the diff options, this flags means to\n apply it as an exact match instead of as an fnmatch pattern.

\n","value":4096},{"type":"int","name":"GIT_DIFF_SKIP_BINARY_CHECK","comments":"

Disable updating of the binary flag in delta records. This is\n useful when iterating over a diff if you don't need hunk and data\n callbacks and want to avoid having to load file completely.

\n","value":8192},{"type":"int","name":"GIT_DIFF_ENABLE_FAST_UNTRACKED_DIRS","comments":"

When diff finds an untracked directory, to match the behavior of\n core Git, it scans the contents for IGNORED and UNTRACKED files.\n If all contents are IGNORED, then the directory is IGNORED; if\n any contents are not IGNORED, then the directory is UNTRACKED.\n This is extra work that may not matter in many cases. This flag\n turns off that scan and immediately labels an untracked directory\n as UNTRACKED (changing the behavior to not match core Git).

\n","value":16384},{"type":"int","name":"GIT_DIFF_UPDATE_INDEX","comments":"

When diff finds a file in the working directory with stat\n information different from the index, but the OID ends up being the\n same, write the correct stat information into the index. Note:\n without this flag, diff will always leave the index untouched.

\n","value":32768},{"type":"int","name":"GIT_DIFF_INCLUDE_UNREADABLE","comments":"

Include unreadable files in the diff

\n","value":65536},{"type":"int","name":"GIT_DIFF_INCLUDE_UNREADABLE_AS_UNTRACKED","comments":"

Include unreadable files in the diff

\n","value":131072},{"type":"int","name":"GIT_DIFF_FORCE_TEXT","comments":"

Treat all files as text, disabling binary attributes \n&\n detection

\n","value":1048576},{"type":"int","name":"GIT_DIFF_FORCE_BINARY","comments":"

Treat all files as binary, disabling text diffs

\n","value":2097152},{"type":"int","name":"GIT_DIFF_IGNORE_WHITESPACE","comments":"

Ignore all whitespace

\n","value":4194304},{"type":"int","name":"GIT_DIFF_IGNORE_WHITESPACE_CHANGE","comments":"

Ignore changes in amount of whitespace

\n","value":8388608},{"type":"int","name":"GIT_DIFF_IGNORE_WHITESPACE_EOL","comments":"

Ignore whitespace at end of line

\n","value":16777216},{"type":"int","name":"GIT_DIFF_SHOW_UNTRACKED_CONTENT","comments":"

When generating patch text, include the content of untracked\n files. This automatically turns on GIT_DIFF_INCLUDE_UNTRACKED but\n it does not turn on GIT_DIFF_RECURSE_UNTRACKED_DIRS. Add that\n flag if you want the content of every single UNTRACKED file.

\n","value":33554432},{"type":"int","name":"GIT_DIFF_SHOW_UNMODIFIED","comments":"

When generating output, include the names of unmodified files if\n they are included in the git_diff. Normally these are skipped in\n the formats that list files (e.g. name-only, name-status, raw).\n Even with this, these will not be included in patch format.

\n","value":67108864},{"type":"int","name":"GIT_DIFF_PATIENCE","comments":"

Use the "patience diff" algorithm

\n","value":268435456},{"type":"int","name":"GIT_DIFF_MINIMAL","comments":"

Take extra time to find minimal diff

\n","value":536870912},{"type":"int","name":"GIT_DIFF_SHOW_BINARY","comments":"

Include the necessary deflate / delta information so that git-apply\n can apply given diff information to binary files.

\n","value":1073741824}],"used":{"returns":[],"needs":[]}}],["git_diff_options",{"decl":["unsigned int version","uint32_t flags","git_submodule_ignore_t ignore_submodules","git_strarray pathspec","git_diff_notify_cb notify_cb","void * notify_payload","uint32_t context_lines","uint32_t interhunk_lines","uint16_t id_abbrev","git_off_t max_size","const char * old_prefix","const char * new_prefix"],"type":"struct","value":"git_diff_options","file":"diff.h","line":374,"lineto":393,"block":"unsigned int version\nuint32_t flags\ngit_submodule_ignore_t ignore_submodules\ngit_strarray pathspec\ngit_diff_notify_cb notify_cb\nvoid * notify_payload\nuint32_t context_lines\nuint32_t interhunk_lines\nuint16_t id_abbrev\ngit_off_t max_size\nconst char * old_prefix\nconst char * new_prefix","tdef":"typedef","description":" Structure describing options about how the diff should be executed.","comments":"

Setting all values of the structure to zero will yield the default\n values. Similarly, passing NULL for the options structure will\n give the defaults. The default values are marked below.

\n\n
    \n
  • flags is a combination of the git_diff_option_t values above
  • \n
  • context_lines is the number of unchanged lines that define the\nboundary of a hunk (and to display before and after)
  • \n
  • interhunk_lines is the maximum number of unchanged lines between\nhunk boundaries before the hunks will be merged into a one.
  • \n
  • old_prefix is the virtual "directory" to prefix to old file names\nin hunk headers (default "a")
  • \n
  • new_prefix is the virtual "directory" to prefix to new file names\nin hunk headers (default "b")
  • \n
  • pathspec is an array of paths / fnmatch patterns to constrain diff
  • \n
  • max_size is a file size (in bytes) above which a blob will be marked\nas binary automatically; pass a negative value to disable.
  • \n
  • notify_cb is an optional callback function, notifying the consumer of\nwhich files are being examined as the diff is generated
  • \n
  • notify_payload is the payload data to pass to the notify_cb function
  • \n
  • ignore_submodules overrides the submodule ignore setting for all\nsubmodules in the diff.
  • \n
\n","fields":[{"type":"unsigned int","name":"version","comments":" version for the struct "},{"type":"uint32_t","name":"flags","comments":" defaults to GIT_DIFF_NORMAL "},{"type":"git_submodule_ignore_t","name":"ignore_submodules","comments":" submodule ignore rule "},{"type":"git_strarray","name":"pathspec","comments":" defaults to include all paths "},{"type":"git_diff_notify_cb","name":"notify_cb","comments":""},{"type":"void *","name":"notify_payload","comments":""},{"type":"uint32_t","name":"context_lines","comments":" defaults to 3 "},{"type":"uint32_t","name":"interhunk_lines","comments":" defaults to 0 "},{"type":"uint16_t","name":"id_abbrev","comments":" default 'core.abbrev' or 7 if unset "},{"type":"git_off_t","name":"max_size","comments":" defaults to 512MB "},{"type":"const char *","name":"old_prefix","comments":" defaults to \"a\" "},{"type":"const char *","name":"new_prefix","comments":" defaults to \"b\" "}],"used":{"returns":[],"needs":["git_diff_blob_to_buffer","git_diff_blobs","git_diff_buffers","git_diff_commit_as_email","git_diff_index_to_workdir","git_diff_init_options","git_diff_tree_to_index","git_diff_tree_to_tree","git_diff_tree_to_workdir","git_diff_tree_to_workdir_with_index","git_patch_from_blob_and_buffer","git_patch_from_blobs","git_patch_from_buffers"]}}],["git_diff_perfdata",{"decl":["unsigned int version","size_t stat_calls","size_t oid_calculations"],"type":"struct","value":"git_diff_perfdata","file":"sys/diff.h","line":67,"lineto":71,"block":"unsigned int version\nsize_t stat_calls\nsize_t oid_calculations","tdef":"typedef","description":" Performance data from diffing","comments":"","fields":[{"type":"unsigned int","name":"version","comments":""},{"type":"size_t","name":"stat_calls","comments":""},{"type":"size_t","name":"oid_calculations","comments":""}],"used":{"returns":[],"needs":["git_diff_get_perfdata","git_status_list_get_perfdata"]}}],["git_diff_similarity_metric",{"decl":["int (*)(void **, const git_diff_file *, const char *, void *) file_signature","int (*)(void **, const git_diff_file *, const char *, size_t, void *) buffer_signature","void (*)(void *, void *) free_signature","int (*)(int *, void *, void *, void *) similarity","void * payload"],"type":"struct","value":"git_diff_similarity_metric","file":"diff.h","line":626,"lineto":636,"block":"int (*)(void **, const git_diff_file *, const char *, void *) file_signature\nint (*)(void **, const git_diff_file *, const char *, size_t, void *) buffer_signature\nvoid (*)(void *, void *) free_signature\nint (*)(int *, void *, void *, void *) similarity\nvoid * payload","tdef":"typedef","description":" Pluggable similarity metric","comments":"","fields":[{"type":"int (*)(void **, const git_diff_file *, const char *, void *)","name":"file_signature","comments":""},{"type":"int (*)(void **, const git_diff_file *, const char *, size_t, void *)","name":"buffer_signature","comments":""},{"type":"void (*)(void *, void *)","name":"free_signature","comments":""},{"type":"int (*)(int *, void *, void *, void *)","name":"similarity","comments":""},{"type":"void *","name":"payload","comments":""}],"used":{"returns":[],"needs":[]}}],["git_diff_stats",{"decl":"git_diff_stats","type":"struct","value":"git_diff_stats","file":"diff.h","line":1132,"lineto":1132,"tdef":"typedef","description":" This is an opaque structure which is allocated by `git_diff_get_stats`.\n You are responsible for releasing the object memory when done, using the\n `git_diff_stats_free()` function.","comments":"","used":{"returns":[],"needs":["git_diff_get_stats","git_diff_stats_deletions","git_diff_stats_files_changed","git_diff_stats_free","git_diff_stats_insertions","git_diff_stats_to_buf"]}}],["git_diff_stats_format_t",{"decl":["GIT_DIFF_STATS_NONE","GIT_DIFF_STATS_FULL","GIT_DIFF_STATS_SHORT","GIT_DIFF_STATS_NUMBER","GIT_DIFF_STATS_INCLUDE_SUMMARY"],"type":"enum","file":"diff.h","line":1137,"lineto":1152,"block":"GIT_DIFF_STATS_NONE\nGIT_DIFF_STATS_FULL\nGIT_DIFF_STATS_SHORT\nGIT_DIFF_STATS_NUMBER\nGIT_DIFF_STATS_INCLUDE_SUMMARY","tdef":"typedef","description":" Formatting options for diff stats","comments":"","fields":[{"type":"int","name":"GIT_DIFF_STATS_NONE","comments":"

No stats

\n","value":0},{"type":"int","name":"GIT_DIFF_STATS_FULL","comments":"

Full statistics, equivalent of --stat

\n","value":1},{"type":"int","name":"GIT_DIFF_STATS_SHORT","comments":"

Short statistics, equivalent of --shortstat

\n","value":2},{"type":"int","name":"GIT_DIFF_STATS_NUMBER","comments":"

Number statistics, equivalent of --numstat

\n","value":4},{"type":"int","name":"GIT_DIFF_STATS_INCLUDE_SUMMARY","comments":"

Extended header information such as creations, renames and mode changes, equivalent of --summary

\n","value":8}],"used":{"returns":[],"needs":["git_diff_stats_to_buf"]}}],["git_direction",{"decl":["GIT_DIRECTION_FETCH","GIT_DIRECTION_PUSH"],"type":"enum","file":"net.h","line":31,"lineto":34,"block":"GIT_DIRECTION_FETCH\nGIT_DIRECTION_PUSH","tdef":"typedef","description":" Direction of the connection.","comments":"

We need this because we need to know whether we should call\n git-upload-pack or git-receive-pack on the remote end when get_refs\n gets called.

\n","fields":[{"type":"int","name":"GIT_DIRECTION_FETCH","comments":"","value":0},{"type":"int","name":"GIT_DIRECTION_PUSH","comments":"","value":1}],"used":{"returns":[],"needs":["git_remote_connect"]}}],["git_error",{"decl":["char * message","int klass"],"type":"struct","value":"git_error","file":"errors.h","line":62,"lineto":65,"block":"char * message\nint klass","tdef":"typedef","description":" Structure to store extra details of the last error that occurred.","comments":"

This is kept on a per-thread basis if GIT_THREADS was defined when the\n library was build, otherwise one is kept globally for the library

\n","fields":[{"type":"char *","name":"message","comments":""},{"type":"int","name":"klass","comments":""}],"used":{"returns":["giterr_last"],"needs":["giterr_detach"]}}],["git_error_code",{"decl":["GIT_OK","GIT_ERROR","GIT_ENOTFOUND","GIT_EEXISTS","GIT_EAMBIGUOUS","GIT_EBUFS","GIT_EUSER","GIT_EBAREREPO","GIT_EUNBORNBRANCH","GIT_EUNMERGED","GIT_ENONFASTFORWARD","GIT_EINVALIDSPEC","GIT_ECONFLICT","GIT_ELOCKED","GIT_EMODIFIED","GIT_EAUTH","GIT_ECERTIFICATE","GIT_EAPPLIED","GIT_EPEEL","GIT_EEOF","GIT_EINVALID","GIT_EUNCOMMITTED","GIT_PASSTHROUGH","GIT_ITEROVER"],"type":"enum","file":"errors.h","line":21,"lineto":54,"block":"GIT_OK\nGIT_ERROR\nGIT_ENOTFOUND\nGIT_EEXISTS\nGIT_EAMBIGUOUS\nGIT_EBUFS\nGIT_EUSER\nGIT_EBAREREPO\nGIT_EUNBORNBRANCH\nGIT_EUNMERGED\nGIT_ENONFASTFORWARD\nGIT_EINVALIDSPEC\nGIT_ECONFLICT\nGIT_ELOCKED\nGIT_EMODIFIED\nGIT_EAUTH\nGIT_ECERTIFICATE\nGIT_EAPPLIED\nGIT_EPEEL\nGIT_EEOF\nGIT_EINVALID\nGIT_EUNCOMMITTED\nGIT_PASSTHROUGH\nGIT_ITEROVER","tdef":"typedef","description":" Generic return codes ","comments":"","fields":[{"type":"int","name":"GIT_OK","comments":"

No error

\n","value":0},{"type":"int","name":"GIT_ERROR","comments":"

Generic error

\n","value":-1},{"type":"int","name":"GIT_ENOTFOUND","comments":"

Requested object could not be found

\n","value":-3},{"type":"int","name":"GIT_EEXISTS","comments":"

Object exists preventing operation

\n","value":-4},{"type":"int","name":"GIT_EAMBIGUOUS","comments":"

More than one object matches

\n","value":-5},{"type":"int","name":"GIT_EBUFS","comments":"

Output buffer too short to hold data

\n","value":-6},{"type":"int","name":"GIT_EUSER","comments":"","value":-7},{"type":"int","name":"GIT_EBAREREPO","comments":"

Operation not allowed on bare repository

\n","value":-8},{"type":"int","name":"GIT_EUNBORNBRANCH","comments":"

HEAD refers to branch with no commits

\n","value":-9},{"type":"int","name":"GIT_EUNMERGED","comments":"

Merge in progress prevented operation

\n","value":-10},{"type":"int","name":"GIT_ENONFASTFORWARD","comments":"

Reference was not fast-forwardable

\n","value":-11},{"type":"int","name":"GIT_EINVALIDSPEC","comments":"

Name/ref spec was not in a valid format

\n","value":-12},{"type":"int","name":"GIT_ECONFLICT","comments":"

Checkout conflicts prevented operation

\n","value":-13},{"type":"int","name":"GIT_ELOCKED","comments":"

Lock file prevented operation

\n","value":-14},{"type":"int","name":"GIT_EMODIFIED","comments":"

Reference value does not match expected

\n","value":-15},{"type":"int","name":"GIT_EAUTH","comments":"

Authentication error

\n","value":-16},{"type":"int","name":"GIT_ECERTIFICATE","comments":"

Server certificate is invalid

\n","value":-17},{"type":"int","name":"GIT_EAPPLIED","comments":"

Patch/merge has already been applied

\n","value":-18},{"type":"int","name":"GIT_EPEEL","comments":"

The requested peel operation is not possible

\n","value":-19},{"type":"int","name":"GIT_EEOF","comments":"

Unexpected EOF

\n","value":-20},{"type":"int","name":"GIT_EINVALID","comments":"

Invalid operation or input

\n","value":-21},{"type":"int","name":"GIT_EUNCOMMITTED","comments":"

Uncommitted changes in index prevented operation

\n","value":-22},{"type":"int","name":"GIT_PASSTHROUGH","comments":"

Internal only

\n","value":-30},{"type":"int","name":"GIT_ITEROVER","comments":"

Signals end of iteration with iterator

\n","value":-31}],"used":{"returns":[],"needs":[]}}],["git_error_t",{"decl":["GITERR_NONE","GITERR_NOMEMORY","GITERR_OS","GITERR_INVALID","GITERR_REFERENCE","GITERR_ZLIB","GITERR_REPOSITORY","GITERR_CONFIG","GITERR_REGEX","GITERR_ODB","GITERR_INDEX","GITERR_OBJECT","GITERR_NET","GITERR_TAG","GITERR_TREE","GITERR_INDEXER","GITERR_SSL","GITERR_SUBMODULE","GITERR_THREAD","GITERR_STASH","GITERR_CHECKOUT","GITERR_FETCHHEAD","GITERR_MERGE","GITERR_SSH","GITERR_FILTER","GITERR_REVERT","GITERR_CALLBACK","GITERR_CHERRYPICK","GITERR_DESCRIBE","GITERR_REBASE","GITERR_FILESYSTEM"],"type":"enum","file":"errors.h","line":68,"lineto":100,"block":"GITERR_NONE\nGITERR_NOMEMORY\nGITERR_OS\nGITERR_INVALID\nGITERR_REFERENCE\nGITERR_ZLIB\nGITERR_REPOSITORY\nGITERR_CONFIG\nGITERR_REGEX\nGITERR_ODB\nGITERR_INDEX\nGITERR_OBJECT\nGITERR_NET\nGITERR_TAG\nGITERR_TREE\nGITERR_INDEXER\nGITERR_SSL\nGITERR_SUBMODULE\nGITERR_THREAD\nGITERR_STASH\nGITERR_CHECKOUT\nGITERR_FETCHHEAD\nGITERR_MERGE\nGITERR_SSH\nGITERR_FILTER\nGITERR_REVERT\nGITERR_CALLBACK\nGITERR_CHERRYPICK\nGITERR_DESCRIBE\nGITERR_REBASE\nGITERR_FILESYSTEM","tdef":"typedef","description":" Error classes ","comments":"","fields":[{"type":"int","name":"GITERR_NONE","comments":"","value":0},{"type":"int","name":"GITERR_NOMEMORY","comments":"","value":1},{"type":"int","name":"GITERR_OS","comments":"","value":2},{"type":"int","name":"GITERR_INVALID","comments":"","value":3},{"type":"int","name":"GITERR_REFERENCE","comments":"","value":4},{"type":"int","name":"GITERR_ZLIB","comments":"","value":5},{"type":"int","name":"GITERR_REPOSITORY","comments":"","value":6},{"type":"int","name":"GITERR_CONFIG","comments":"","value":7},{"type":"int","name":"GITERR_REGEX","comments":"","value":8},{"type":"int","name":"GITERR_ODB","comments":"","value":9},{"type":"int","name":"GITERR_INDEX","comments":"","value":10},{"type":"int","name":"GITERR_OBJECT","comments":"","value":11},{"type":"int","name":"GITERR_NET","comments":"","value":12},{"type":"int","name":"GITERR_TAG","comments":"","value":13},{"type":"int","name":"GITERR_TREE","comments":"","value":14},{"type":"int","name":"GITERR_INDEXER","comments":"","value":15},{"type":"int","name":"GITERR_SSL","comments":"","value":16},{"type":"int","name":"GITERR_SUBMODULE","comments":"","value":17},{"type":"int","name":"GITERR_THREAD","comments":"","value":18},{"type":"int","name":"GITERR_STASH","comments":"","value":19},{"type":"int","name":"GITERR_CHECKOUT","comments":"","value":20},{"type":"int","name":"GITERR_FETCHHEAD","comments":"","value":21},{"type":"int","name":"GITERR_MERGE","comments":"","value":22},{"type":"int","name":"GITERR_SSH","comments":"","value":23},{"type":"int","name":"GITERR_FILTER","comments":"","value":24},{"type":"int","name":"GITERR_REVERT","comments":"","value":25},{"type":"int","name":"GITERR_CALLBACK","comments":"","value":26},{"type":"int","name":"GITERR_CHERRYPICK","comments":"","value":27},{"type":"int","name":"GITERR_DESCRIBE","comments":"","value":28},{"type":"int","name":"GITERR_REBASE","comments":"","value":29},{"type":"int","name":"GITERR_FILESYSTEM","comments":"","value":30}],"used":{"returns":[],"needs":[]}}],["git_feature_t",{"decl":["GIT_FEATURE_THREADS","GIT_FEATURE_HTTPS","GIT_FEATURE_SSH"],"type":"enum","file":"common.h","line":100,"lineto":104,"block":"GIT_FEATURE_THREADS\nGIT_FEATURE_HTTPS\nGIT_FEATURE_SSH","tdef":"typedef","description":" Combinations of these values describe the features with which libgit2\n was compiled","comments":"","fields":[{"type":"int","name":"GIT_FEATURE_THREADS","comments":"","value":1},{"type":"int","name":"GIT_FEATURE_HTTPS","comments":"","value":2},{"type":"int","name":"GIT_FEATURE_SSH","comments":"","value":4}],"used":{"returns":[],"needs":[]}}],["git_filemode_t",{"decl":["GIT_FILEMODE_UNREADABLE","GIT_FILEMODE_TREE","GIT_FILEMODE_BLOB","GIT_FILEMODE_BLOB_EXECUTABLE","GIT_FILEMODE_LINK","GIT_FILEMODE_COMMIT"],"type":"enum","file":"types.h","line":205,"lineto":212,"block":"GIT_FILEMODE_UNREADABLE\nGIT_FILEMODE_TREE\nGIT_FILEMODE_BLOB\nGIT_FILEMODE_BLOB_EXECUTABLE\nGIT_FILEMODE_LINK\nGIT_FILEMODE_COMMIT","tdef":"typedef","description":" Valid modes for index and tree entries. ","comments":"","fields":[{"type":"int","name":"GIT_FILEMODE_UNREADABLE","comments":"","value":0},{"type":"int","name":"GIT_FILEMODE_TREE","comments":"","value":16384},{"type":"int","name":"GIT_FILEMODE_BLOB","comments":"","value":33188},{"type":"int","name":"GIT_FILEMODE_BLOB_EXECUTABLE","comments":"","value":33261},{"type":"int","name":"GIT_FILEMODE_LINK","comments":"","value":40960},{"type":"int","name":"GIT_FILEMODE_COMMIT","comments":"","value":57344}],"used":{"returns":[],"needs":["git_treebuilder_insert"]}}],["git_filter",{"decl":["unsigned int version","const char * attributes","git_filter_init_fn initialize","git_filter_shutdown_fn shutdown","git_filter_check_fn check","git_filter_apply_fn apply","git_filter_stream_fn stream","git_filter_cleanup_fn cleanup"],"type":"struct","value":"git_filter","file":"sys/filter.h","line":248,"lineto":259,"tdef":null,"description":" Filter structure used to register custom filters.","comments":"

To associate extra data with a filter, allocate extra data and put the\n git_filter struct at the start of your data buffer, then cast the\n self pointer to your larger structure when your callback is invoked.

\n\n

version should be set to GIT_FILTER_VERSION

\n\n

attributes is a whitespace-separated list of attribute names to check\n for this filter (e.g. "eol crlf text"). If the attribute name is bare,\n it will be simply loaded and passed to the check callback. If it has\n a value (i.e. "name=value"), the attribute must match that value for\n the filter to be applied.

\n\n

The initialize, shutdown, check, apply, and cleanup callbacks\n are all documented above with the respective function pointer typedefs.

\n","block":"unsigned int version\nconst char * attributes\ngit_filter_init_fn initialize\ngit_filter_shutdown_fn shutdown\ngit_filter_check_fn check\ngit_filter_apply_fn apply\ngit_filter_stream_fn stream\ngit_filter_cleanup_fn cleanup","fields":[{"type":"unsigned int","name":"version","comments":""},{"type":"const char *","name":"attributes","comments":""},{"type":"git_filter_init_fn","name":"initialize","comments":""},{"type":"git_filter_shutdown_fn","name":"shutdown","comments":""},{"type":"git_filter_check_fn","name":"check","comments":""},{"type":"git_filter_apply_fn","name":"apply","comments":""},{"type":"git_filter_stream_fn","name":"stream","comments":""},{"type":"git_filter_cleanup_fn","name":"cleanup","comments":""}],"used":{"returns":["git_filter_lookup"],"needs":["git_filter_list_push","git_filter_register"]}}],["git_filter_flag_t",{"decl":["GIT_FILTER_DEFAULT","GIT_FILTER_ALLOW_UNSAFE"],"type":"enum","file":"filter.h","line":41,"lineto":44,"block":"GIT_FILTER_DEFAULT\nGIT_FILTER_ALLOW_UNSAFE","tdef":"typedef","description":" Filter option flags.","comments":"","fields":[{"type":"int","name":"GIT_FILTER_DEFAULT","comments":"","value":0},{"type":"int","name":"GIT_FILTER_ALLOW_UNSAFE","comments":"","value":1}],"used":{"returns":[],"needs":[]}}],["git_filter_list",{"decl":"git_filter_list","type":"struct","value":"git_filter_list","file":"filter.h","line":73,"lineto":73,"tdef":"typedef","description":" List of filters to be applied","comments":"

This represents a list of filters to be applied to a file / blob. You\n can build the list with one call, apply it with another, and dispose it\n with a third. In typical usage, there are not many occasions where a\n git_filter_list is needed directly since the library will generally\n handle conversions for you, but it can be convenient to be able to\n build and apply the list sometimes.

\n","used":{"returns":[],"needs":["git_filter_list_apply_to_blob","git_filter_list_apply_to_data","git_filter_list_apply_to_file","git_filter_list_contains","git_filter_list_free","git_filter_list_length","git_filter_list_load","git_filter_list_new","git_filter_list_push","git_filter_list_stream_blob","git_filter_list_stream_data","git_filter_list_stream_file"]}}],["git_filter_mode_t",{"decl":["GIT_FILTER_TO_WORKTREE","GIT_FILTER_SMUDGE","GIT_FILTER_TO_ODB","GIT_FILTER_CLEAN"],"type":"enum","file":"filter.h","line":31,"lineto":36,"block":"GIT_FILTER_TO_WORKTREE\nGIT_FILTER_SMUDGE\nGIT_FILTER_TO_ODB\nGIT_FILTER_CLEAN","tdef":"typedef","description":" Filters are applied in one of two directions: smudging - which is\n exporting a file from the Git object database to the working directory,\n and cleaning - which is importing a file from the working directory to\n the Git object database. These values control which direction of\n change is being applied.","comments":"","fields":[{"type":"int","name":"GIT_FILTER_TO_WORKTREE","comments":"","value":0},{"type":"int","name":"GIT_FILTER_SMUDGE","comments":"","value":0},{"type":"int","name":"GIT_FILTER_TO_ODB","comments":"","value":1},{"type":"int","name":"GIT_FILTER_CLEAN","comments":"","value":1}],"used":{"returns":[],"needs":["git_filter_list_load","git_filter_list_new"]}}],["git_filter_source",{"decl":"git_filter_source","type":"struct","value":"git_filter_source","file":"sys/filter.h","line":95,"lineto":95,"tdef":"typedef","description":" A filter source represents a file/blob to be processed","comments":"","used":{"returns":[],"needs":["git_filter_source_filemode","git_filter_source_flags","git_filter_source_id","git_filter_source_mode","git_filter_source_path","git_filter_source_repo"]}}],["git_hashsig",{"decl":"git_hashsig","type":"struct","value":"git_hashsig","file":"sys/hashsig.h","line":17,"lineto":17,"tdef":"typedef","description":" Similarity signature of arbitrary text content based on line hashes","comments":"","used":{"returns":[],"needs":["git_hashsig_compare","git_hashsig_create","git_hashsig_create_fromfile","git_hashsig_free"]}}],["git_hashsig_option_t",{"decl":["GIT_HASHSIG_NORMAL","GIT_HASHSIG_IGNORE_WHITESPACE","GIT_HASHSIG_SMART_WHITESPACE","GIT_HASHSIG_ALLOW_SMALL_FILES"],"type":"enum","file":"sys/hashsig.h","line":25,"lineto":45,"block":"GIT_HASHSIG_NORMAL\nGIT_HASHSIG_IGNORE_WHITESPACE\nGIT_HASHSIG_SMART_WHITESPACE\nGIT_HASHSIG_ALLOW_SMALL_FILES","tdef":"typedef","description":" Options for hashsig computation","comments":"

The options GIT_HASHSIG_NORMAL, GIT_HASHSIG_IGNORE_WHITESPACE,\n GIT_HASHSIG_SMART_WHITESPACE are exclusive and should not be combined.

\n","fields":[{"type":"int","name":"GIT_HASHSIG_NORMAL","comments":"

Use all data

\n","value":0},{"type":"int","name":"GIT_HASHSIG_IGNORE_WHITESPACE","comments":"

Ignore whitespace

\n","value":1},{"type":"int","name":"GIT_HASHSIG_SMART_WHITESPACE","comments":"

Ignore

\n\n

and all space after

\n","value":2},{"type":"int","name":"GIT_HASHSIG_ALLOW_SMALL_FILES","comments":"

Allow hashing of small files

\n","value":4}],"used":{"returns":[],"needs":["git_hashsig_create","git_hashsig_create_fromfile"]}}],["git_idxentry_extended_flag_t",{"decl":["GIT_IDXENTRY_INTENT_TO_ADD","GIT_IDXENTRY_SKIP_WORKTREE","GIT_IDXENTRY_EXTENDED2","GIT_IDXENTRY_EXTENDED_FLAGS","GIT_IDXENTRY_UPDATE","GIT_IDXENTRY_REMOVE","GIT_IDXENTRY_UPTODATE","GIT_IDXENTRY_ADDED","GIT_IDXENTRY_HASHED","GIT_IDXENTRY_UNHASHED","GIT_IDXENTRY_WT_REMOVE","GIT_IDXENTRY_CONFLICTED","GIT_IDXENTRY_UNPACKED","GIT_IDXENTRY_NEW_SKIP_WORKTREE"],"type":"enum","file":"index.h","line":115,"lineto":135,"block":"GIT_IDXENTRY_INTENT_TO_ADD\nGIT_IDXENTRY_SKIP_WORKTREE\nGIT_IDXENTRY_EXTENDED2\nGIT_IDXENTRY_EXTENDED_FLAGS\nGIT_IDXENTRY_UPDATE\nGIT_IDXENTRY_REMOVE\nGIT_IDXENTRY_UPTODATE\nGIT_IDXENTRY_ADDED\nGIT_IDXENTRY_HASHED\nGIT_IDXENTRY_UNHASHED\nGIT_IDXENTRY_WT_REMOVE\nGIT_IDXENTRY_CONFLICTED\nGIT_IDXENTRY_UNPACKED\nGIT_IDXENTRY_NEW_SKIP_WORKTREE","tdef":"typedef","description":" Bitmasks for on-disk fields of `git_index_entry`'s `flags_extended`","comments":"

In memory, the flags_extended fields are divided into two parts: the\n fields that are read from and written to disk, and other fields that\n in-memory only and used by libgit2. Only the flags in\n GIT_IDXENTRY_EXTENDED_FLAGS will get saved on-disk.

\n\n

Thee first three bitmasks match the three fields in the\n git_index_entry flags_extended value that belong on disk. You\n can use them to interpret the data in the flags_extended.

\n\n

The rest of the bitmasks match the other fields in the git_index_entry\n flags_extended value that are only used in-memory by libgit2.\n You can use them to interpret the data in the flags_extended.

\n","fields":[{"type":"int","name":"GIT_IDXENTRY_INTENT_TO_ADD","comments":"","value":8192},{"type":"int","name":"GIT_IDXENTRY_SKIP_WORKTREE","comments":"","value":16384},{"type":"int","name":"GIT_IDXENTRY_EXTENDED2","comments":"

Reserved for future extension

\n","value":32768},{"type":"int","name":"GIT_IDXENTRY_EXTENDED_FLAGS","comments":"

Reserved for future extension

\n","value":24576},{"type":"int","name":"GIT_IDXENTRY_UPDATE","comments":"

Reserved for future extension

\n","value":1},{"type":"int","name":"GIT_IDXENTRY_REMOVE","comments":"

Reserved for future extension

\n","value":2},{"type":"int","name":"GIT_IDXENTRY_UPTODATE","comments":"

Reserved for future extension

\n","value":4},{"type":"int","name":"GIT_IDXENTRY_ADDED","comments":"

Reserved for future extension

\n","value":8},{"type":"int","name":"GIT_IDXENTRY_HASHED","comments":"

Reserved for future extension

\n","value":16},{"type":"int","name":"GIT_IDXENTRY_UNHASHED","comments":"

Reserved for future extension

\n","value":32},{"type":"int","name":"GIT_IDXENTRY_WT_REMOVE","comments":"

remove in work directory

\n","value":64},{"type":"int","name":"GIT_IDXENTRY_CONFLICTED","comments":"","value":128},{"type":"int","name":"GIT_IDXENTRY_UNPACKED","comments":"","value":256},{"type":"int","name":"GIT_IDXENTRY_NEW_SKIP_WORKTREE","comments":"","value":512}],"used":{"returns":[],"needs":[]}}],["git_index",{"decl":"git_index","type":"struct","value":"git_index","file":"types.h","line":132,"lineto":132,"tdef":"typedef","description":" Memory representation of an index file. ","comments":"","used":{"returns":[],"needs":["git_checkout_index","git_cherrypick_commit","git_diff_index_to_workdir","git_diff_tree_to_index","git_index_add","git_index_add_all","git_index_add_bypath","git_index_add_frombuffer","git_index_caps","git_index_checksum","git_index_clear","git_index_conflict_add","git_index_conflict_cleanup","git_index_conflict_get","git_index_conflict_iterator_new","git_index_conflict_remove","git_index_entrycount","git_index_find","git_index_free","git_index_get_byindex","git_index_get_bypath","git_index_has_conflicts","git_index_new","git_index_open","git_index_owner","git_index_path","git_index_read","git_index_read_tree","git_index_remove","git_index_remove_all","git_index_remove_bypath","git_index_remove_directory","git_index_set_caps","git_index_update_all","git_index_write","git_index_write_tree","git_index_write_tree_to","git_merge_commits","git_merge_trees","git_pathspec_match_index","git_repository_index","git_repository_set_index","git_revert_commit"]}}],["git_index_add_option_t",{"decl":["GIT_INDEX_ADD_DEFAULT","GIT_INDEX_ADD_FORCE","GIT_INDEX_ADD_DISABLE_PATHSPEC_MATCH","GIT_INDEX_ADD_CHECK_PATHSPEC"],"type":"enum","file":"index.h","line":150,"lineto":155,"block":"GIT_INDEX_ADD_DEFAULT\nGIT_INDEX_ADD_FORCE\nGIT_INDEX_ADD_DISABLE_PATHSPEC_MATCH\nGIT_INDEX_ADD_CHECK_PATHSPEC","tdef":"typedef","description":" Flags for APIs that add files matching pathspec ","comments":"","fields":[{"type":"int","name":"GIT_INDEX_ADD_DEFAULT","comments":"","value":0},{"type":"int","name":"GIT_INDEX_ADD_FORCE","comments":"","value":1},{"type":"int","name":"GIT_INDEX_ADD_DISABLE_PATHSPEC_MATCH","comments":"","value":2},{"type":"int","name":"GIT_INDEX_ADD_CHECK_PATHSPEC","comments":"","value":4}],"used":{"returns":[],"needs":[]}}],["git_index_conflict_iterator",{"decl":"git_index_conflict_iterator","type":"struct","value":"git_index_conflict_iterator","file":"types.h","line":135,"lineto":135,"tdef":"typedef","description":" An iterator for conflicts in the index. ","comments":"","used":{"returns":[],"needs":["git_index_conflict_iterator_free","git_index_conflict_iterator_new","git_index_conflict_next"]}}],["git_index_entry",{"decl":["git_index_time ctime","git_index_time mtime","uint32_t dev","uint32_t ino","uint32_t mode","uint32_t uid","uint32_t gid","uint32_t file_size","git_oid id","uint16_t flags","uint16_t flags_extended","const char * path"],"type":"struct","value":"git_index_entry","file":"index.h","line":53,"lineto":70,"block":"git_index_time ctime\ngit_index_time mtime\nuint32_t dev\nuint32_t ino\nuint32_t mode\nuint32_t uid\nuint32_t gid\nuint32_t file_size\ngit_oid id\nuint16_t flags\nuint16_t flags_extended\nconst char * path","tdef":"typedef","description":" In-memory representation of a file entry in the index.","comments":"

This is a public structure that represents a file entry in the index.\n The meaning of the fields corresponds to core Git's documentation (in\n "Documentation/technical/index-format.txt").

\n\n

The flags field consists of a number of bit fields which can be\n accessed via the first set of GIT_IDXENTRY_... bitmasks below. These\n flags are all read from and persisted to disk.

\n\n

The flags_extended field also has a number of bit fields which can be\n accessed via the later GIT_IDXENTRY_... bitmasks below. Some of\n these flags are read from and written to disk, but some are set aside\n for in-memory only reference.

\n\n

Note that the time and size fields are truncated to 32 bits. This\n is enough to detect changes, which is enough for the index to\n function as a cache, but it should not be taken as an authoritative\n source for that data.

\n","fields":[{"type":"git_index_time","name":"ctime","comments":""},{"type":"git_index_time","name":"mtime","comments":""},{"type":"uint32_t","name":"dev","comments":""},{"type":"uint32_t","name":"ino","comments":""},{"type":"uint32_t","name":"mode","comments":""},{"type":"uint32_t","name":"uid","comments":""},{"type":"uint32_t","name":"gid","comments":""},{"type":"uint32_t","name":"file_size","comments":""},{"type":"git_oid","name":"id","comments":""},{"type":"uint16_t","name":"flags","comments":""},{"type":"uint16_t","name":"flags_extended","comments":""},{"type":"const char *","name":"path","comments":""}],"used":{"returns":["git_index_get_byindex","git_index_get_bypath"],"needs":["git_index_add","git_index_add_frombuffer","git_index_conflict_add","git_index_conflict_get","git_index_conflict_next","git_index_entry_is_conflict","git_index_entry_stage","git_merge_file_from_index"]}}],["git_index_time",{"decl":["int32_t seconds","uint32_t nanoseconds"],"type":"struct","value":"git_index_time","file":"index.h","line":26,"lineto":30,"block":"int32_t seconds\nuint32_t nanoseconds","tdef":"typedef","description":" Time structure used in a git index entry ","comments":"","fields":[{"type":"int32_t","name":"seconds","comments":""},{"type":"uint32_t","name":"nanoseconds","comments":""}],"used":{"returns":[],"needs":[]}}],["git_indexcap_t",{"decl":["GIT_INDEXCAP_IGNORE_CASE","GIT_INDEXCAP_NO_FILEMODE","GIT_INDEXCAP_NO_SYMLINKS","GIT_INDEXCAP_FROM_OWNER"],"type":"enum","file":"index.h","line":138,"lineto":143,"block":"GIT_INDEXCAP_IGNORE_CASE\nGIT_INDEXCAP_NO_FILEMODE\nGIT_INDEXCAP_NO_SYMLINKS\nGIT_INDEXCAP_FROM_OWNER","tdef":"typedef","description":" Capabilities of system that affect index actions. ","comments":"","fields":[{"type":"int","name":"GIT_INDEXCAP_IGNORE_CASE","comments":"","value":1},{"type":"int","name":"GIT_INDEXCAP_NO_FILEMODE","comments":"","value":2},{"type":"int","name":"GIT_INDEXCAP_NO_SYMLINKS","comments":"","value":4},{"type":"int","name":"GIT_INDEXCAP_FROM_OWNER","comments":"","value":-1}],"used":{"returns":[],"needs":[]}}],["git_indxentry_flag_t",{"decl":["GIT_IDXENTRY_EXTENDED","GIT_IDXENTRY_VALID"],"type":"enum","file":"index.h","line":86,"lineto":89,"block":"GIT_IDXENTRY_EXTENDED\nGIT_IDXENTRY_VALID","tdef":"typedef","description":" Flags for index entries","comments":"","fields":[{"type":"int","name":"GIT_IDXENTRY_EXTENDED","comments":"","value":16384},{"type":"int","name":"GIT_IDXENTRY_VALID","comments":"","value":32768}],"used":{"returns":[],"needs":[]}}],["git_libgit2_opt_t",{"decl":["GIT_OPT_GET_MWINDOW_SIZE","GIT_OPT_SET_MWINDOW_SIZE","GIT_OPT_GET_MWINDOW_MAPPED_LIMIT","GIT_OPT_SET_MWINDOW_MAPPED_LIMIT","GIT_OPT_GET_SEARCH_PATH","GIT_OPT_SET_SEARCH_PATH","GIT_OPT_SET_CACHE_OBJECT_LIMIT","GIT_OPT_SET_CACHE_MAX_SIZE","GIT_OPT_ENABLE_CACHING","GIT_OPT_GET_CACHED_MEMORY","GIT_OPT_GET_TEMPLATE_PATH","GIT_OPT_SET_TEMPLATE_PATH","GIT_OPT_SET_SSL_CERT_LOCATIONS"],"type":"enum","file":"common.h","line":132,"lineto":146,"block":"GIT_OPT_GET_MWINDOW_SIZE\nGIT_OPT_SET_MWINDOW_SIZE\nGIT_OPT_GET_MWINDOW_MAPPED_LIMIT\nGIT_OPT_SET_MWINDOW_MAPPED_LIMIT\nGIT_OPT_GET_SEARCH_PATH\nGIT_OPT_SET_SEARCH_PATH\nGIT_OPT_SET_CACHE_OBJECT_LIMIT\nGIT_OPT_SET_CACHE_MAX_SIZE\nGIT_OPT_ENABLE_CACHING\nGIT_OPT_GET_CACHED_MEMORY\nGIT_OPT_GET_TEMPLATE_PATH\nGIT_OPT_SET_TEMPLATE_PATH\nGIT_OPT_SET_SSL_CERT_LOCATIONS","tdef":"typedef","description":" Global library options","comments":"

These are used to select which global option to set or get and are\n used in git_libgit2_opts().

\n","fields":[{"type":"int","name":"GIT_OPT_GET_MWINDOW_SIZE","comments":"","value":0},{"type":"int","name":"GIT_OPT_SET_MWINDOW_SIZE","comments":"","value":1},{"type":"int","name":"GIT_OPT_GET_MWINDOW_MAPPED_LIMIT","comments":"","value":2},{"type":"int","name":"GIT_OPT_SET_MWINDOW_MAPPED_LIMIT","comments":"","value":3},{"type":"int","name":"GIT_OPT_GET_SEARCH_PATH","comments":"","value":4},{"type":"int","name":"GIT_OPT_SET_SEARCH_PATH","comments":"","value":5},{"type":"int","name":"GIT_OPT_SET_CACHE_OBJECT_LIMIT","comments":"","value":6},{"type":"int","name":"GIT_OPT_SET_CACHE_MAX_SIZE","comments":"","value":7},{"type":"int","name":"GIT_OPT_ENABLE_CACHING","comments":"","value":8},{"type":"int","name":"GIT_OPT_GET_CACHED_MEMORY","comments":"","value":9},{"type":"int","name":"GIT_OPT_GET_TEMPLATE_PATH","comments":"","value":10},{"type":"int","name":"GIT_OPT_SET_TEMPLATE_PATH","comments":"","value":11},{"type":"int","name":"GIT_OPT_SET_SSL_CERT_LOCATIONS","comments":"","value":12}],"used":{"returns":[],"needs":[]}}],["git_merge_analysis_t",{"decl":["GIT_MERGE_ANALYSIS_NONE","GIT_MERGE_ANALYSIS_NORMAL","GIT_MERGE_ANALYSIS_UP_TO_DATE","GIT_MERGE_ANALYSIS_FASTFORWARD","GIT_MERGE_ANALYSIS_UNBORN"],"type":"enum","file":"merge.h","line":272,"lineto":301,"block":"GIT_MERGE_ANALYSIS_NONE\nGIT_MERGE_ANALYSIS_NORMAL\nGIT_MERGE_ANALYSIS_UP_TO_DATE\nGIT_MERGE_ANALYSIS_FASTFORWARD\nGIT_MERGE_ANALYSIS_UNBORN","tdef":"typedef","description":" The results of `git_merge_analysis` indicate the merge opportunities.","comments":"","fields":[{"type":"int","name":"GIT_MERGE_ANALYSIS_NONE","comments":"

No merge is possible. (Unused.)

\n","value":0},{"type":"int","name":"GIT_MERGE_ANALYSIS_NORMAL","comments":"

A "normal" merge; both HEAD and the given merge input have diverged\n from their common ancestor. The divergent commits must be merged.

\n","value":1},{"type":"int","name":"GIT_MERGE_ANALYSIS_UP_TO_DATE","comments":"

All given merge inputs are reachable from HEAD, meaning the\n repository is up-to-date and no merge needs to be performed.

\n","value":2},{"type":"int","name":"GIT_MERGE_ANALYSIS_FASTFORWARD","comments":"

The given merge input is a fast-forward from HEAD and no merge\n needs to be performed. Instead, the client can check out the\n given merge input.

\n","value":4},{"type":"int","name":"GIT_MERGE_ANALYSIS_UNBORN","comments":"

The HEAD of the current repository is "unborn" and does not point to\n a valid commit. No merge can be performed, but the caller may wish\n to simply set HEAD to the target commit(s).

\n","value":8}],"used":{"returns":[],"needs":["git_merge_analysis"]}}],["git_merge_file_favor_t",{"decl":["GIT_MERGE_FILE_FAVOR_NORMAL","GIT_MERGE_FILE_FAVOR_OURS","GIT_MERGE_FILE_FAVOR_THEIRS","GIT_MERGE_FILE_FAVOR_UNION"],"type":"enum","file":"merge.h","line":81,"lineto":111,"block":"GIT_MERGE_FILE_FAVOR_NORMAL\nGIT_MERGE_FILE_FAVOR_OURS\nGIT_MERGE_FILE_FAVOR_THEIRS\nGIT_MERGE_FILE_FAVOR_UNION","tdef":"typedef","description":" Merge file favor options for `git_merge_options` instruct the file-level\n merging functionality how to deal with conflicting regions of the files.","comments":"","fields":[{"type":"int","name":"GIT_MERGE_FILE_FAVOR_NORMAL","comments":"

When a region of a file is changed in both branches, a conflict\n will be recorded in the index so that git_checkout can produce\n a merge file with conflict markers in the working directory.\n This is the default.

\n","value":0},{"type":"int","name":"GIT_MERGE_FILE_FAVOR_OURS","comments":"

When a region of a file is changed in both branches, the file\n created in the index will contain the "ours" side of any conflicting\n region. The index will not record a conflict.

\n","value":1},{"type":"int","name":"GIT_MERGE_FILE_FAVOR_THEIRS","comments":"

When a region of a file is changed in both branches, the file\n created in the index will contain the "theirs" side of any conflicting\n region. The index will not record a conflict.

\n","value":2},{"type":"int","name":"GIT_MERGE_FILE_FAVOR_UNION","comments":"

When a region of a file is changed in both branches, the file\n created in the index will contain each unique line from each side,\n which has the result of combining both files. The index will not\n record a conflict.

\n","value":3}],"used":{"returns":[],"needs":[]}}],["git_merge_file_flags_t",{"decl":["GIT_MERGE_FILE_DEFAULT","GIT_MERGE_FILE_STYLE_MERGE","GIT_MERGE_FILE_STYLE_DIFF3","GIT_MERGE_FILE_SIMPLIFY_ALNUM","GIT_MERGE_FILE_IGNORE_WHITESPACE","GIT_MERGE_FILE_IGNORE_WHITESPACE_CHANGE","GIT_MERGE_FILE_IGNORE_WHITESPACE_EOL","GIT_MERGE_FILE_DIFF_PATIENCE","GIT_MERGE_FILE_DIFF_MINIMAL"],"type":"enum","file":"merge.h","line":116,"lineto":143,"block":"GIT_MERGE_FILE_DEFAULT\nGIT_MERGE_FILE_STYLE_MERGE\nGIT_MERGE_FILE_STYLE_DIFF3\nGIT_MERGE_FILE_SIMPLIFY_ALNUM\nGIT_MERGE_FILE_IGNORE_WHITESPACE\nGIT_MERGE_FILE_IGNORE_WHITESPACE_CHANGE\nGIT_MERGE_FILE_IGNORE_WHITESPACE_EOL\nGIT_MERGE_FILE_DIFF_PATIENCE\nGIT_MERGE_FILE_DIFF_MINIMAL","tdef":"typedef","description":" File merging flags","comments":"","fields":[{"type":"int","name":"GIT_MERGE_FILE_DEFAULT","comments":"

Defaults

\n","value":0},{"type":"int","name":"GIT_MERGE_FILE_STYLE_MERGE","comments":"

Create standard conflicted merge files

\n","value":1},{"type":"int","name":"GIT_MERGE_FILE_STYLE_DIFF3","comments":"

Create diff3-style files

\n","value":2},{"type":"int","name":"GIT_MERGE_FILE_SIMPLIFY_ALNUM","comments":"

Condense non-alphanumeric regions for simplified diff file

\n","value":4},{"type":"int","name":"GIT_MERGE_FILE_IGNORE_WHITESPACE","comments":"

Ignore all whitespace

\n","value":8},{"type":"int","name":"GIT_MERGE_FILE_IGNORE_WHITESPACE_CHANGE","comments":"

Ignore changes in amount of whitespace

\n","value":16},{"type":"int","name":"GIT_MERGE_FILE_IGNORE_WHITESPACE_EOL","comments":"

Ignore whitespace at end of line

\n","value":32},{"type":"int","name":"GIT_MERGE_FILE_DIFF_PATIENCE","comments":"

Use the "patience diff" algorithm

\n","value":64},{"type":"int","name":"GIT_MERGE_FILE_DIFF_MINIMAL","comments":"

Take extra time to find minimal diff

\n","value":128}],"used":{"returns":[],"needs":[]}}],["git_merge_file_input",{"decl":["unsigned int version","const char * ptr","size_t size","const char * path","unsigned int mode"],"type":"struct","value":"git_merge_file_input","file":"merge.h","line":32,"lineto":46,"block":"unsigned int version\nconst char * ptr\nsize_t size\nconst char * path\nunsigned int mode","tdef":"typedef","description":" The file inputs to `git_merge_file`. Callers should populate the\n `git_merge_file_input` structure with descriptions of the files in\n each side of the conflict for use in producing the merge file.","comments":"","fields":[{"type":"unsigned int","name":"version","comments":""},{"type":"const char *","name":"ptr","comments":" Pointer to the contents of the file. "},{"type":"size_t","name":"size","comments":" Size of the contents pointed to in `ptr`. "},{"type":"const char *","name":"path","comments":" File name of the conflicted file, or `NULL` to not merge the path. "},{"type":"unsigned int","name":"mode","comments":" File mode of the conflicted file, or `0` to not merge the mode. "}],"used":{"returns":[],"needs":["git_merge_file","git_merge_file_init_input"]}}],["git_merge_file_options",{"decl":["unsigned int version","const char * ancestor_label","const char * our_label","const char * their_label","git_merge_file_favor_t favor","unsigned int flags"],"type":"struct","value":"git_merge_file_options","file":"merge.h","line":148,"lineto":174,"block":"unsigned int version\nconst char * ancestor_label\nconst char * our_label\nconst char * their_label\ngit_merge_file_favor_t favor\nunsigned int flags","tdef":"typedef","description":" Options for merging a file","comments":"","fields":[{"type":"unsigned int","name":"version","comments":""},{"type":"const char *","name":"ancestor_label","comments":" Label for the ancestor file side of the conflict which will be prepended\n to labels in diff3-format merge files."},{"type":"const char *","name":"our_label","comments":" Label for our file side of the conflict which will be prepended\n to labels in merge files."},{"type":"const char *","name":"their_label","comments":" Label for their file side of the conflict which will be prepended\n to labels in merge files."},{"type":"git_merge_file_favor_t","name":"favor","comments":" The file to favor in region conflicts. "},{"type":"unsigned int","name":"flags","comments":" see `git_merge_file_flags_t` above "}],"used":{"returns":[],"needs":["git_merge_file","git_merge_file_from_index","git_merge_file_init_options"]}}],["git_merge_file_result",{"decl":["unsigned int automergeable","const char * path","unsigned int mode","const char * ptr","size_t len"],"type":"struct","value":"git_merge_file_result","file":"merge.h","line":195,"lineto":216,"block":"unsigned int automergeable\nconst char * path\nunsigned int mode\nconst char * ptr\nsize_t len","tdef":"typedef","description":" Information about file-level merging","comments":"","fields":[{"type":"unsigned int","name":"automergeable","comments":" True if the output was automerged, false if the output contains\n conflict markers."},{"type":"const char *","name":"path","comments":" The path that the resultant merge file should use, or NULL if a\n filename conflict would occur."},{"type":"unsigned int","name":"mode","comments":" The mode that the resultant merge file should use. "},{"type":"const char *","name":"ptr","comments":" The contents of the merge. "},{"type":"size_t","name":"len","comments":" The length of the merge contents. "}],"used":{"returns":[],"needs":["git_merge_file","git_merge_file_from_index","git_merge_file_result_free"]}}],["git_merge_options",{"decl":["unsigned int version","git_merge_tree_flag_t tree_flags","unsigned int rename_threshold","unsigned int target_limit","git_diff_similarity_metric * metric","git_merge_file_favor_t file_favor","unsigned int file_flags"],"type":"struct","value":"git_merge_options","file":"merge.h","line":221,"lineto":251,"block":"unsigned int version\ngit_merge_tree_flag_t tree_flags\nunsigned int rename_threshold\nunsigned int target_limit\ngit_diff_similarity_metric * metric\ngit_merge_file_favor_t file_favor\nunsigned int file_flags","tdef":"typedef","description":" Merging options","comments":"","fields":[{"type":"unsigned int","name":"version","comments":""},{"type":"git_merge_tree_flag_t","name":"tree_flags","comments":""},{"type":"unsigned int","name":"rename_threshold","comments":" Similarity to consider a file renamed (default 50). If\n `GIT_MERGE_TREE_FIND_RENAMES` is enabled, added files will be compared\n with deleted files to determine their similarity. Files that are\n more similar than the rename threshold (percentage-wise) will be\n treated as a rename."},{"type":"unsigned int","name":"target_limit","comments":" Maximum similarity sources to examine for renames (default 200).\n If the number of rename candidates (add / delete pairs) is greater\n than this value, inexact rename detection is aborted.\n\n This setting overrides the `merge.renameLimit` configuration value."},{"type":"git_diff_similarity_metric *","name":"metric","comments":" Pluggable similarity metric; pass NULL to use internal metric "},{"type":"git_merge_file_favor_t","name":"file_favor","comments":" Flags for handling conflicting content. "},{"type":"unsigned int","name":"file_flags","comments":" see `git_merge_file_flags_t` above "}],"used":{"returns":[],"needs":["git_cherrypick_commit","git_merge","git_merge_commits","git_merge_init_options","git_merge_trees","git_revert_commit"]}}],["git_merge_preference_t",{"decl":["GIT_MERGE_PREFERENCE_NONE","GIT_MERGE_PREFERENCE_NO_FASTFORWARD","GIT_MERGE_PREFERENCE_FASTFORWARD_ONLY"],"type":"enum","file":"merge.h","line":306,"lineto":324,"block":"GIT_MERGE_PREFERENCE_NONE\nGIT_MERGE_PREFERENCE_NO_FASTFORWARD\nGIT_MERGE_PREFERENCE_FASTFORWARD_ONLY","tdef":"typedef","description":" The user's stated preference for merges.","comments":"","fields":[{"type":"int","name":"GIT_MERGE_PREFERENCE_NONE","comments":"

No configuration was found that suggests a preferred behavior for\n merge.

\n","value":0},{"type":"int","name":"GIT_MERGE_PREFERENCE_NO_FASTFORWARD","comments":"

There is a merge.ff=false configuration setting, suggesting that\n the user does not want to allow a fast-forward merge.

\n","value":1},{"type":"int","name":"GIT_MERGE_PREFERENCE_FASTFORWARD_ONLY","comments":"

There is a merge.ff=only configuration setting, suggesting that\n the user only wants fast-forward merges.

\n","value":2}],"used":{"returns":[],"needs":["git_merge_analysis"]}}],["git_merge_result",{"decl":"git_merge_result","type":"struct","value":"git_merge_result","file":"types.h","line":181,"lineto":181,"tdef":"typedef","description":" Merge result ","comments":"","used":{"returns":[],"needs":[]}}],["git_merge_tree_flag_t",{"decl":["GIT_MERGE_TREE_FIND_RENAMES"],"type":"enum","file":"merge.h","line":68,"lineto":75,"block":"GIT_MERGE_TREE_FIND_RENAMES","tdef":"typedef","description":" Flags for `git_merge_tree` options. A combination of these flags can be\n passed in via the `tree_flags` value in the `git_merge_options`.","comments":"","fields":[{"type":"int","name":"GIT_MERGE_TREE_FIND_RENAMES","comments":"

Detect renames that occur between the common ancestor and the "ours"\n side or the common ancestor and the "theirs" side. This will enable\n the ability to merge between a modified and renamed file.

\n","value":1}],"used":{"returns":[],"needs":[]}}],["git_note",{"decl":"git_note","type":"struct","value":"git_note","file":"types.h","line":150,"lineto":150,"tdef":"typedef","description":" Representation of a git note ","comments":"","used":{"returns":[],"needs":["git_note_author","git_note_committer","git_note_free","git_note_id","git_note_message","git_note_read"]}}],["git_note_iterator",{"decl":"git_note_iterator","type":"struct","value":"git_note_iterator","file":"notes.h","line":35,"lineto":35,"tdef":"typedef","description":" note iterator","comments":"","used":{"returns":[],"needs":["git_note_iterator_free","git_note_iterator_new","git_note_next"]}}],["git_object",{"decl":"git_object","type":"struct","value":"git_object","file":"types.h","line":108,"lineto":108,"tdef":"typedef","description":" Representation of a generic object in a repository ","comments":"","used":{"returns":[],"needs":["git_checkout_tree","git_describe_commit","git_object_dup","git_object_free","git_object_id","git_object_lookup","git_object_lookup_bypath","git_object_lookup_prefix","git_object_owner","git_object_peel","git_object_short_id","git_object_type","git_reference_peel","git_reset","git_reset_default","git_revparse_ext","git_revparse_single","git_tag_annotation_create","git_tag_create","git_tag_create_lightweight","git_tag_peel","git_tag_target","git_tree_entry_to_object"]}}],["git_odb",{"decl":"git_odb","type":"struct","value":"git_odb","file":"types.h","line":81,"lineto":81,"tdef":"typedef","description":" An open object database handle. ","comments":"","used":{"returns":[],"needs":["git_indexer_new","git_odb_add_alternate","git_odb_add_backend","git_odb_add_disk_alternate","git_odb_exists","git_odb_exists_prefix","git_odb_foreach","git_odb_free","git_odb_get_backend","git_odb_new","git_odb_num_backends","git_odb_open","git_odb_open_rstream","git_odb_open_wstream","git_odb_read","git_odb_read_header","git_odb_read_prefix","git_odb_refresh","git_odb_write","git_odb_write_pack","git_repository_odb","git_repository_set_odb","git_repository_wrap_odb"]}}],["git_odb_backend",{"decl":"git_odb_backend","type":"struct","value":"git_odb_backend","file":"types.h","line":84,"lineto":84,"block":"unsigned int version\ngit_odb * odb\nint (*)(void **, size_t *, git_otype *, git_odb_backend *, const git_oid *) read\nint (*)(git_oid *, void **, size_t *, git_otype *, git_odb_backend *, const git_oid *, size_t) read_prefix\nint (*)(size_t *, git_otype *, git_odb_backend *, const git_oid *) read_header\nint (*)(git_odb_backend *, const git_oid *, const void *, size_t, git_otype) write\nint (*)(git_odb_stream **, git_odb_backend *, git_off_t, git_otype) writestream\nint (*)(git_odb_stream **, git_odb_backend *, const git_oid *) readstream\nint (*)(git_odb_backend *, const git_oid *) exists\nint (*)(git_oid *, git_odb_backend *, const git_oid *, size_t) exists_prefix\nint (*)(git_odb_backend *) refresh\nint (*)(git_odb_backend *, git_odb_foreach_cb, void *) foreach\nint (*)(git_odb_writepack **, git_odb_backend *, git_odb *, git_transfer_progress_cb, void *) writepack\nvoid (*)(git_odb_backend *) free","tdef":"typedef","description":" A custom backend in an ODB ","comments":"","fields":[{"type":"unsigned int","name":"version","comments":""},{"type":"git_odb *","name":"odb","comments":""},{"type":"int (*)(void **, size_t *, git_otype *, git_odb_backend *, const git_oid *)","name":"read","comments":""},{"type":"int (*)(git_oid *, void **, size_t *, git_otype *, git_odb_backend *, const git_oid *, size_t)","name":"read_prefix","comments":""},{"type":"int (*)(size_t *, git_otype *, git_odb_backend *, const git_oid *)","name":"read_header","comments":""},{"type":"int (*)(git_odb_backend *, const git_oid *, const void *, size_t, git_otype)","name":"write","comments":" Write an object into the backend. The id of the object has\n already been calculated and is passed in."},{"type":"int (*)(git_odb_stream **, git_odb_backend *, git_off_t, git_otype)","name":"writestream","comments":""},{"type":"int (*)(git_odb_stream **, git_odb_backend *, const git_oid *)","name":"readstream","comments":""},{"type":"int (*)(git_odb_backend *, const git_oid *)","name":"exists","comments":""},{"type":"int (*)(git_oid *, git_odb_backend *, const git_oid *, size_t)","name":"exists_prefix","comments":""},{"type":"int (*)(git_odb_backend *)","name":"refresh","comments":" If the backend implements a refreshing mechanism, it should be exposed\n through this endpoint. Each call to `git_odb_refresh()` will invoke it.\n\n However, the backend implementation should try to stay up-to-date as much\n as possible by itself as libgit2 will not automatically invoke\n `git_odb_refresh()`. For instance, a potential strategy for the backend\n implementation to achieve this could be to internally invoke this\n endpoint on failed lookups (ie. `exists()`, `read()`, `read_header()`)."},{"type":"int (*)(git_odb_backend *, git_odb_foreach_cb, void *)","name":"foreach","comments":""},{"type":"int (*)(git_odb_writepack **, git_odb_backend *, git_odb *, git_transfer_progress_cb, void *)","name":"writepack","comments":""},{"type":"void (*)(git_odb_backend *)","name":"free","comments":""}],"used":{"returns":[],"needs":["git_mempack_new","git_mempack_reset","git_odb_add_alternate","git_odb_add_backend","git_odb_backend_loose","git_odb_backend_one_pack","git_odb_backend_pack","git_odb_get_backend","git_odb_init_backend"]}}],["git_odb_object",{"decl":"git_odb_object","type":"struct","value":"git_odb_object","file":"types.h","line":87,"lineto":87,"tdef":"typedef","description":" An object read from the ODB ","comments":"","used":{"returns":[],"needs":["git_odb_object_data","git_odb_object_dup","git_odb_object_free","git_odb_object_id","git_odb_object_size","git_odb_object_type","git_odb_read","git_odb_read_prefix"]}}],["git_odb_stream",{"decl":"git_odb_stream","type":"struct","value":"git_odb_stream","file":"types.h","line":90,"lineto":90,"block":"git_odb_backend * backend\nunsigned int mode\nvoid * hash_ctx\ngit_off_t declared_size\ngit_off_t received_bytes\nint (*)(git_odb_stream *, char *, size_t) read\nint (*)(git_odb_stream *, const char *, size_t) write\nint (*)(git_odb_stream *, const int *) finalize_write\nvoid (*)(git_odb_stream *) free","tdef":"typedef","description":" A stream to read/write from the ODB ","comments":"","fields":[{"type":"git_odb_backend *","name":"backend","comments":""},{"type":"unsigned int","name":"mode","comments":""},{"type":"void *","name":"hash_ctx","comments":""},{"type":"git_off_t","name":"declared_size","comments":""},{"type":"git_off_t","name":"received_bytes","comments":""},{"type":"int (*)(git_odb_stream *, char *, size_t)","name":"read","comments":" Write at most `len` bytes into `buffer` and advance the stream."},{"type":"int (*)(git_odb_stream *, const char *, size_t)","name":"write","comments":" Write `len` bytes from `buffer` into the stream."},{"type":"int (*)(git_odb_stream *, const int *)","name":"finalize_write","comments":" Store the contents of the stream as an object with the id\n specified in `oid`.\n\n This method might not be invoked if:\n - an error occurs earlier with the `write` callback,\n - the object referred to by `oid` already exists in any backend, or\n - the final number of received bytes differs from the size declared\n with `git_odb_open_wstream()`"},{"type":"void (*)(git_odb_stream *)","name":"free","comments":" Free the stream's memory.\n\n This method might be called without a call to `finalize_write` if\n an error occurs or if the object is already present in the ODB."}],"used":{"returns":[],"needs":["git_odb_open_rstream","git_odb_open_wstream","git_odb_stream_finalize_write","git_odb_stream_free","git_odb_stream_read","git_odb_stream_write"]}}],["git_odb_stream_t",{"decl":["GIT_STREAM_RDONLY","GIT_STREAM_WRONLY","GIT_STREAM_RW"],"type":"enum","file":"odb_backend.h","line":70,"lineto":74,"block":"GIT_STREAM_RDONLY\nGIT_STREAM_WRONLY\nGIT_STREAM_RW","tdef":"typedef","description":" Streaming mode ","comments":"","fields":[{"type":"int","name":"GIT_STREAM_RDONLY","comments":"","value":2},{"type":"int","name":"GIT_STREAM_WRONLY","comments":"","value":4},{"type":"int","name":"GIT_STREAM_RW","comments":"","value":6}],"used":{"returns":[],"needs":[]}}],["git_odb_writepack",{"decl":"git_odb_writepack","type":"struct","value":"git_odb_writepack","file":"types.h","line":93,"lineto":93,"block":"git_odb_backend * backend\nint (*)(git_odb_writepack *, const void *, size_t, git_transfer_progress *) append\nint (*)(git_odb_writepack *, git_transfer_progress *) commit\nvoid (*)(git_odb_writepack *) free","tdef":"typedef","description":" A stream to write a packfile to the ODB ","comments":"","fields":[{"type":"git_odb_backend *","name":"backend","comments":""},{"type":"int (*)(git_odb_writepack *, const void *, size_t, git_transfer_progress *)","name":"append","comments":""},{"type":"int (*)(git_odb_writepack *, git_transfer_progress *)","name":"commit","comments":""},{"type":"void (*)(git_odb_writepack *)","name":"free","comments":""}],"used":{"returns":[],"needs":["git_odb_write_pack"]}}],["git_oid",{"decl":["unsigned char [20] id"],"type":"struct","value":"git_oid","file":"oid.h","line":33,"lineto":36,"block":"unsigned char [20] id","tdef":"typedef","description":" Unique identity of any object (commit, tree, blob, tag). ","comments":"","fields":[{"type":"unsigned char [20]","name":"id","comments":" raw binary formatted id "}],"used":{"returns":["git_annotated_commit_id","git_blob_id","git_commit_id","git_commit_parent_id","git_commit_tree_id","git_filter_source_id","git_index_checksum","git_indexer_hash","git_note_id","git_object_id","git_odb_object_id","git_packbuilder_hash","git_reference_target","git_reference_target_peel","git_reflog_entry_id_new","git_reflog_entry_id_old","git_submodule_head_id","git_submodule_index_id","git_submodule_wd_id","git_tag_id","git_tag_target_id","git_tree_entry_id","git_tree_id"],"needs":["git_annotated_commit_from_fetchhead","git_annotated_commit_lookup","git_blob_create_frombuffer","git_blob_create_fromchunks","git_blob_create_fromdisk","git_blob_create_fromworkdir","git_blob_lookup","git_blob_lookup_prefix","git_commit_amend","git_commit_create","git_commit_create_from_callback","git_commit_create_from_ids","git_commit_create_v","git_commit_lookup","git_commit_lookup_prefix","git_graph_ahead_behind","git_graph_descendant_of","git_index_write_tree","git_index_write_tree_to","git_merge_base","git_merge_base_many","git_merge_base_octopus","git_merge_bases","git_merge_bases_many","git_note_create","git_note_next","git_note_read","git_note_remove","git_object_lookup","git_object_lookup_prefix","git_odb_exists","git_odb_exists_prefix","git_odb_hash","git_odb_hashfile","git_odb_open_rstream","git_odb_read","git_odb_read_header","git_odb_read_prefix","git_odb_stream_finalize_write","git_odb_write","git_oid_cmp","git_oid_cpy","git_oid_equal","git_oid_fmt","git_oid_fromraw","git_oid_fromstr","git_oid_fromstrn","git_oid_fromstrp","git_oid_iszero","git_oid_ncmp","git_oid_nfmt","git_oid_pathfmt","git_oid_strcmp","git_oid_streq","git_oid_tostr","git_oid_tostr_s","git_packbuilder_insert","git_packbuilder_insert_commit","git_packbuilder_insert_recur","git_packbuilder_insert_tree","git_rebase_commit","git_reference__alloc","git_reference_create","git_reference_create_matching","git_reference_name_to_id","git_reference_set_target","git_reflog_append","git_repository_hashfile","git_repository_set_head_detached","git_revwalk_hide","git_revwalk_next","git_revwalk_push","git_tag_annotation_create","git_tag_create","git_tag_create_frombuffer","git_tag_create_lightweight","git_tag_lookup","git_tag_lookup_prefix","git_tree_entry_byid","git_tree_lookup","git_tree_lookup_prefix","git_treebuilder_insert","git_treebuilder_write"]}}],["git_oid_shorten",{"decl":"git_oid_shorten","type":"struct","value":"git_oid_shorten","file":"oid.h","line":216,"lineto":216,"tdef":"typedef","description":" OID Shortener object","comments":"","used":{"returns":["git_oid_shorten_new"],"needs":["git_oid_shorten_add","git_oid_shorten_free"]}}],["git_oidarray",{"decl":["git_oid * ids","size_t count"],"type":"struct","value":"git_oidarray","file":"oidarray.h","line":16,"lineto":19,"block":"git_oid * ids\nsize_t count","tdef":"typedef","description":" Array of object ids ","comments":"","fields":[{"type":"git_oid *","name":"ids","comments":""},{"type":"size_t","name":"count","comments":""}],"used":{"returns":[],"needs":["git_merge_bases","git_merge_bases_many","git_oidarray_free"]}}],["git_otype",{"decl":["GIT_OBJ_ANY","GIT_OBJ_BAD","GIT_OBJ__EXT1","GIT_OBJ_COMMIT","GIT_OBJ_TREE","GIT_OBJ_BLOB","GIT_OBJ_TAG","GIT_OBJ__EXT2","GIT_OBJ_OFS_DELTA","GIT_OBJ_REF_DELTA"],"type":"enum","file":"types.h","line":67,"lineto":78,"block":"GIT_OBJ_ANY\nGIT_OBJ_BAD\nGIT_OBJ__EXT1\nGIT_OBJ_COMMIT\nGIT_OBJ_TREE\nGIT_OBJ_BLOB\nGIT_OBJ_TAG\nGIT_OBJ__EXT2\nGIT_OBJ_OFS_DELTA\nGIT_OBJ_REF_DELTA","tdef":"typedef","description":" Basic type (loose or packed) of any Git object. ","comments":"","fields":[{"type":"int","name":"GIT_OBJ_ANY","comments":"

Object can be any of the following

\n","value":-2},{"type":"int","name":"GIT_OBJ_BAD","comments":"

Object is invalid.

\n","value":-1},{"type":"int","name":"GIT_OBJ__EXT1","comments":"

Reserved for future use.

\n","value":0},{"type":"int","name":"GIT_OBJ_COMMIT","comments":"

A commit object.

\n","value":1},{"type":"int","name":"GIT_OBJ_TREE","comments":"

A tree (directory listing) object.

\n","value":2},{"type":"int","name":"GIT_OBJ_BLOB","comments":"

A file revision object.

\n","value":3},{"type":"int","name":"GIT_OBJ_TAG","comments":"

An annotated tag object.

\n","value":4},{"type":"int","name":"GIT_OBJ__EXT2","comments":"

Reserved for future use.

\n","value":5},{"type":"int","name":"GIT_OBJ_OFS_DELTA","comments":"

A delta, base is given by an offset.

\n","value":6},{"type":"int","name":"GIT_OBJ_REF_DELTA","comments":"

A delta, base is given by object id.

\n","value":7}],"used":{"returns":[],"needs":["git_object__size","git_object_lookup","git_object_lookup_bypath","git_object_lookup_prefix","git_object_peel","git_object_type2string","git_object_typeisloose","git_odb_hash","git_odb_hashfile","git_odb_open_wstream","git_odb_read_header","git_odb_write","git_reference_peel","git_repository_hashfile"]}}],["git_packbuilder",{"decl":"git_packbuilder","type":"struct","value":"git_packbuilder","file":"types.h","line":153,"lineto":153,"tdef":"typedef","description":" Representation of a git packbuilder ","comments":"","used":{"returns":[],"needs":["git_packbuilder_foreach","git_packbuilder_free","git_packbuilder_hash","git_packbuilder_insert","git_packbuilder_insert_commit","git_packbuilder_insert_recur","git_packbuilder_insert_tree","git_packbuilder_insert_walk","git_packbuilder_new","git_packbuilder_object_count","git_packbuilder_set_callbacks","git_packbuilder_set_threads","git_packbuilder_write","git_packbuilder_written"]}}],["git_packbuilder_stage_t",{"decl":["GIT_PACKBUILDER_ADDING_OBJECTS","GIT_PACKBUILDER_DELTAFICATION"],"type":"enum","file":"pack.h","line":51,"lineto":54,"block":"GIT_PACKBUILDER_ADDING_OBJECTS\nGIT_PACKBUILDER_DELTAFICATION","tdef":"typedef","description":" Stages that are reported by the packbuilder progress callback.","comments":"","fields":[{"type":"int","name":"GIT_PACKBUILDER_ADDING_OBJECTS","comments":"","value":0},{"type":"int","name":"GIT_PACKBUILDER_DELTAFICATION","comments":"","value":1}],"used":{"returns":[],"needs":[]}}],["git_patch",{"decl":"git_patch","type":"struct","value":"git_patch","file":"patch.h","line":29,"lineto":29,"tdef":"typedef","description":" The diff patch is used to store all the text diffs for a delta.","comments":"

You can easily loop over the content of patches and get information about\n them.

\n","used":{"returns":[],"needs":["git_patch_free","git_patch_from_blob_and_buffer","git_patch_from_blobs","git_patch_from_buffers","git_patch_from_diff","git_patch_get_delta","git_patch_get_hunk","git_patch_get_line_in_hunk","git_patch_line_stats","git_patch_num_hunks","git_patch_num_lines_in_hunk","git_patch_print","git_patch_size","git_patch_to_buf"]}}],["git_pathspec",{"decl":"git_pathspec","type":"struct","value":"git_pathspec","file":"pathspec.h","line":20,"lineto":20,"tdef":"typedef","description":" Compiled pathspec","comments":"","used":{"returns":[],"needs":["git_pathspec_free","git_pathspec_match_diff","git_pathspec_match_index","git_pathspec_match_tree","git_pathspec_match_workdir","git_pathspec_matches_path","git_pathspec_new"]}}],["git_pathspec_flag_t",{"decl":["GIT_PATHSPEC_DEFAULT","GIT_PATHSPEC_IGNORE_CASE","GIT_PATHSPEC_USE_CASE","GIT_PATHSPEC_NO_GLOB","GIT_PATHSPEC_NO_MATCH_ERROR","GIT_PATHSPEC_FIND_FAILURES","GIT_PATHSPEC_FAILURES_ONLY"],"type":"enum","file":"pathspec.h","line":48,"lineto":56,"block":"GIT_PATHSPEC_DEFAULT\nGIT_PATHSPEC_IGNORE_CASE\nGIT_PATHSPEC_USE_CASE\nGIT_PATHSPEC_NO_GLOB\nGIT_PATHSPEC_NO_MATCH_ERROR\nGIT_PATHSPEC_FIND_FAILURES\nGIT_PATHSPEC_FAILURES_ONLY","tdef":"typedef","description":" Options controlling how pathspec match should be executed","comments":"
    \n
  • GIT_PATHSPEC_IGNORE_CASE forces match to ignore case; otherwise\nmatch will use native case sensitivity of platform filesystem
  • \n
  • GIT_PATHSPEC_USE_CASE forces case sensitive match; otherwise\nmatch will use native case sensitivity of platform filesystem
  • \n
  • GIT_PATHSPEC_NO_GLOB disables glob patterns and just uses simple\nstring comparison for matching
  • \n
  • GIT_PATHSPEC_NO_MATCH_ERROR means the match functions return error\ncode GIT_ENOTFOUND if no matches are found; otherwise no matches is\nstill success (return 0) but git_pathspec_match_list_entrycount\nwill indicate 0 matches.
  • \n
  • GIT_PATHSPEC_FIND_FAILURES means that the git_pathspec_match_list\nshould track which patterns matched which files so that at the end of\nthe match we can identify patterns that did not match any files.
  • \n
  • GIT_PATHSPEC_FAILURES_ONLY means that the git_pathspec_match_list\ndoes not need to keep the actual matching filenames. Use this to\njust test if there were any matches at all or in combination with\nGIT_PATHSPEC_FIND_FAILURES to validate a pathspec.
  • \n
\n","fields":[{"type":"int","name":"GIT_PATHSPEC_DEFAULT","comments":"","value":0},{"type":"int","name":"GIT_PATHSPEC_IGNORE_CASE","comments":"","value":1},{"type":"int","name":"GIT_PATHSPEC_USE_CASE","comments":"","value":2},{"type":"int","name":"GIT_PATHSPEC_NO_GLOB","comments":"","value":4},{"type":"int","name":"GIT_PATHSPEC_NO_MATCH_ERROR","comments":"","value":8},{"type":"int","name":"GIT_PATHSPEC_FIND_FAILURES","comments":"","value":16},{"type":"int","name":"GIT_PATHSPEC_FAILURES_ONLY","comments":"","value":32}],"used":{"returns":[],"needs":[]}}],["git_pathspec_match_list",{"decl":"git_pathspec_match_list","type":"struct","value":"git_pathspec_match_list","file":"pathspec.h","line":25,"lineto":25,"tdef":"typedef","description":" List of filenames matching a pathspec","comments":"","used":{"returns":[],"needs":["git_pathspec_match_diff","git_pathspec_match_index","git_pathspec_match_list_diff_entry","git_pathspec_match_list_entry","git_pathspec_match_list_entrycount","git_pathspec_match_list_failed_entry","git_pathspec_match_list_failed_entrycount","git_pathspec_match_list_free","git_pathspec_match_tree","git_pathspec_match_workdir"]}}],["git_push",{"decl":"git_push","type":"struct","value":"git_push","file":"types.h","line":236,"lineto":236,"tdef":"typedef","description":" Preparation for a push operation. Can be used to configure what to\n push and the level of parallelism of the packfile builder.","comments":"","used":{"returns":[],"needs":[]}}],["git_push_options",{"decl":["unsigned int version","unsigned int pb_parallelism","git_remote_callbacks callbacks"],"type":"struct","value":"git_push_options","file":"remote.h","line":563,"lineto":580,"block":"unsigned int version\nunsigned int pb_parallelism\ngit_remote_callbacks callbacks","tdef":"typedef","description":" Controls the behavior of a git_push object.","comments":"","fields":[{"type":"unsigned int","name":"version","comments":""},{"type":"unsigned int","name":"pb_parallelism","comments":" If the transport being used to push to the remote requires the creation\n of a pack file, this controls the number of worker threads used by\n the packbuilder when creating that pack file to be sent to the remote.\n\n If set to 0, the packbuilder will auto-detect the number of threads\n to create. The default value is 1."},{"type":"git_remote_callbacks","name":"callbacks","comments":" Callbacks to use for this push operation"}],"used":{"returns":[],"needs":["git_push_init_options","git_remote_push","git_remote_upload"]}}],["git_push_update",{"decl":["char * src_refname","char * dst_refname","git_oid src","git_oid dst"],"type":"struct","value":"git_push_update","file":"remote.h","line":340,"lineto":357,"block":"char * src_refname\nchar * dst_refname\ngit_oid src\ngit_oid dst","tdef":"typedef","description":" Represents an update which will be performed on the remote during push","comments":"","fields":[{"type":"char *","name":"src_refname","comments":" The source name of the reference"},{"type":"char *","name":"dst_refname","comments":" The name of the reference to update on the server"},{"type":"git_oid","name":"src","comments":" The current target of the reference"},{"type":"git_oid","name":"dst","comments":" The new target for the reference"}],"used":{"returns":[],"needs":[]}}],["git_rebase",{"decl":"git_rebase","type":"struct","value":"git_rebase","file":"types.h","line":187,"lineto":187,"tdef":"typedef","description":" Representation of a rebase ","comments":"","used":{"returns":[],"needs":["git_rebase_abort","git_rebase_commit","git_rebase_finish","git_rebase_free","git_rebase_init","git_rebase_next","git_rebase_open","git_rebase_operation_byindex","git_rebase_operation_current","git_rebase_operation_entrycount"]}}],["git_rebase_operation",{"decl":["git_rebase_operation_t type","const git_oid id","const char * exec"],"type":"struct","value":"git_rebase_operation","file":"rebase.h","line":115,"lineto":130,"block":"git_rebase_operation_t type\nconst git_oid id\nconst char * exec","tdef":"typedef","description":" A rebase operation","comments":"

Describes a single instruction/operation to be performed during the\n rebase.

\n","fields":[{"type":"git_rebase_operation_t","name":"type","comments":" The type of rebase operation. "},{"type":"const git_oid","name":"id","comments":" The commit ID being cherry-picked. This will be populated for\n all operations except those of type `GIT_REBASE_OPERATION_EXEC`."},{"type":"const char *","name":"exec","comments":" The executable the user has requested be run. This will only\n be populated for operations of type `GIT_REBASE_OPERATION_EXEC`."}],"used":{"returns":["git_rebase_operation_byindex"],"needs":["git_rebase_next"]}}],["git_rebase_operation_t",{"decl":["GIT_REBASE_OPERATION_PICK","GIT_REBASE_OPERATION_REWORD","GIT_REBASE_OPERATION_EDIT","GIT_REBASE_OPERATION_SQUASH","GIT_REBASE_OPERATION_FIXUP","GIT_REBASE_OPERATION_EXEC"],"type":"enum","file":"rebase.h","line":64,"lineto":100,"block":"GIT_REBASE_OPERATION_PICK\nGIT_REBASE_OPERATION_REWORD\nGIT_REBASE_OPERATION_EDIT\nGIT_REBASE_OPERATION_SQUASH\nGIT_REBASE_OPERATION_FIXUP\nGIT_REBASE_OPERATION_EXEC","tdef":"typedef","description":" Type of rebase operation in-progress after calling `git_rebase_next`.","comments":"","fields":[{"type":"int","name":"GIT_REBASE_OPERATION_PICK","comments":"

The given commit is to be cherry-picked. The client should commit\n the changes and continue if there are no conflicts.

\n","value":0},{"type":"int","name":"GIT_REBASE_OPERATION_REWORD","comments":"

The given commit is to be cherry-picked, but the client should prompt\n the user to provide an updated commit message.

\n","value":1},{"type":"int","name":"GIT_REBASE_OPERATION_EDIT","comments":"

The given commit is to be cherry-picked, but the client should stop\n to allow the user to edit the changes before committing them.

\n","value":2},{"type":"int","name":"GIT_REBASE_OPERATION_SQUASH","comments":"

The given commit is to be squashed into the previous commit. The\n commit message will be merged with the previous message.

\n","value":3},{"type":"int","name":"GIT_REBASE_OPERATION_FIXUP","comments":"

The given commit is to be squashed into the previous commit. The\n commit message from this commit will be discarded.

\n","value":4},{"type":"int","name":"GIT_REBASE_OPERATION_EXEC","comments":"

No commit will be cherry-picked. The client should run the given\n command and (if successful) continue.

\n","value":5}],"used":{"returns":[],"needs":[]}}],["git_ref_t",{"decl":["GIT_REF_INVALID","GIT_REF_OID","GIT_REF_SYMBOLIC","GIT_REF_LISTALL"],"type":"enum","file":"types.h","line":190,"lineto":195,"block":"GIT_REF_INVALID\nGIT_REF_OID\nGIT_REF_SYMBOLIC\nGIT_REF_LISTALL","tdef":"typedef","description":" Basic type of any Git reference. ","comments":"","fields":[{"type":"int","name":"GIT_REF_INVALID","comments":"

Invalid reference

\n","value":0},{"type":"int","name":"GIT_REF_OID","comments":"

A reference which points at an object id

\n","value":1},{"type":"int","name":"GIT_REF_SYMBOLIC","comments":"

A reference which points at another reference

\n","value":2},{"type":"int","name":"GIT_REF_LISTALL","comments":"","value":3}],"used":{"returns":[],"needs":[]}}],["git_refdb",{"decl":"git_refdb","type":"struct","value":"git_refdb","file":"types.h","line":96,"lineto":96,"tdef":"typedef","description":" An open refs database handle. ","comments":"","used":{"returns":[],"needs":["git_refdb_compress","git_refdb_free","git_refdb_new","git_refdb_open","git_refdb_set_backend","git_repository_refdb","git_repository_set_refdb"]}}],["git_refdb_backend",{"decl":"git_refdb_backend","type":"struct","value":"git_refdb_backend","file":"types.h","line":99,"lineto":99,"block":"unsigned int version\nint (*)(int *, git_refdb_backend *, const char *) exists\nint (*)(git_reference **, git_refdb_backend *, const char *) lookup\nint (*)(git_reference_iterator **, struct git_refdb_backend *, const char *) iterator\nint (*)(git_refdb_backend *, const git_reference *, int, const git_signature *, const char *, const git_oid *, const char *) write\nint (*)(git_reference **, git_refdb_backend *, const char *, const char *, int, const git_signature *, const char *) rename\nint (*)(git_refdb_backend *, const char *, const git_oid *, const char *) del\nint (*)(git_refdb_backend *) compress\nint (*)(git_refdb_backend *, const char *) has_log\nint (*)(git_refdb_backend *, const char *) ensure_log\nvoid (*)(git_refdb_backend *) free\nint (*)(git_reflog **, git_refdb_backend *, const char *) reflog_read\nint (*)(git_refdb_backend *, git_reflog *) reflog_write\nint (*)(git_refdb_backend *, const char *, const char *) reflog_rename\nint (*)(git_refdb_backend *, const char *) reflog_delete\nint (*)(void **, git_refdb_backend *, const char *) lock\nint (*)(git_refdb_backend *, void *, int, int, const git_reference *, const git_signature *, const char *) unlock","tdef":"typedef","description":" A custom backend for refs ","comments":"","fields":[{"type":"unsigned int","name":"version","comments":""},{"type":"int (*)(int *, git_refdb_backend *, const char *)","name":"exists","comments":" Queries the refdb backend to determine if the given ref_name\n exists. A refdb implementation must provide this function."},{"type":"int (*)(git_reference **, git_refdb_backend *, const char *)","name":"lookup","comments":" Queries the refdb backend for a given reference. A refdb\n implementation must provide this function."},{"type":"int (*)(git_reference_iterator **, struct git_refdb_backend *, const char *)","name":"iterator","comments":" Allocate an iterator object for the backend.\n\n A refdb implementation must provide this function."},{"type":"int (*)(git_refdb_backend *, const git_reference *, int, const git_signature *, const char *, const git_oid *, const char *)","name":"write","comments":""},{"type":"int (*)(git_reference **, git_refdb_backend *, const char *, const char *, int, const git_signature *, const char *)","name":"rename","comments":""},{"type":"int (*)(git_refdb_backend *, const char *, const git_oid *, const char *)","name":"del","comments":" Deletes the given reference from the refdb. A refdb implementation\n must provide this function."},{"type":"int (*)(git_refdb_backend *)","name":"compress","comments":" Suggests that the given refdb compress or optimize its references.\n This mechanism is implementation specific. (For on-disk reference\n databases, this may pack all loose references.) A refdb\n implementation may provide this function; if it is not provided,\n nothing will be done."},{"type":"int (*)(git_refdb_backend *, const char *)","name":"has_log","comments":" Query whether a particular reference has a log (may be empty)"},{"type":"int (*)(git_refdb_backend *, const char *)","name":"ensure_log","comments":" Make sure a particular reference will have a reflog which\n will be appended to on writes."},{"type":"void (*)(git_refdb_backend *)","name":"free","comments":" Frees any resources held by the refdb. A refdb implementation may\n provide this function; if it is not provided, nothing will be done."},{"type":"int (*)(git_reflog **, git_refdb_backend *, const char *)","name":"reflog_read","comments":" Read the reflog for the given reference name."},{"type":"int (*)(git_refdb_backend *, git_reflog *)","name":"reflog_write","comments":" Write a reflog to disk."},{"type":"int (*)(git_refdb_backend *, const char *, const char *)","name":"reflog_rename","comments":" Rename a reflog"},{"type":"int (*)(git_refdb_backend *, const char *)","name":"reflog_delete","comments":" Remove a reflog."},{"type":"int (*)(void **, git_refdb_backend *, const char *)","name":"lock","comments":" Lock a reference. The opaque parameter will be passed to the unlock function"},{"type":"int (*)(git_refdb_backend *, void *, int, int, const git_reference *, const git_signature *, const char *)","name":"unlock","comments":" Unlock a reference. Only one of target or symbolic_target\n will be set. success indicates whether to update the\n reference or discard the lock (if it's false)"}],"used":{"returns":[],"needs":["git_refdb_backend_fs","git_refdb_init_backend","git_refdb_set_backend"]}}],["git_reference",{"decl":"git_reference","type":"struct","value":"git_reference","file":"types.h","line":169,"lineto":169,"tdef":"typedef","description":" In-memory representation of a reference. ","comments":"","used":{"returns":["git_reference__alloc","git_reference__alloc_symbolic"],"needs":["git_annotated_commit_from_ref","git_branch_create","git_branch_create_from_annotated","git_branch_delete","git_branch_is_head","git_branch_lookup","git_branch_move","git_branch_name","git_branch_next","git_branch_set_upstream","git_branch_upstream","git_reference_cmp","git_reference_create","git_reference_create_matching","git_reference_delete","git_reference_dwim","git_reference_free","git_reference_is_branch","git_reference_is_note","git_reference_is_remote","git_reference_is_tag","git_reference_lookup","git_reference_name","git_reference_next","git_reference_owner","git_reference_peel","git_reference_rename","git_reference_resolve","git_reference_set_target","git_reference_shorthand","git_reference_symbolic_create","git_reference_symbolic_create_matching","git_reference_symbolic_set_target","git_reference_symbolic_target","git_reference_target","git_reference_target_peel","git_reference_type","git_repository_head","git_revparse_ext"]}}],["git_reference_iterator",{"decl":"git_reference_iterator","type":"struct","value":"git_reference_iterator","file":"types.h","line":172,"lineto":172,"block":"git_refdb * db\nint (*)(git_reference **, git_reference_iterator *) next\nint (*)(const char **, git_reference_iterator *) next_name\nvoid (*)(git_reference_iterator *) free","tdef":"typedef","description":" Iterator for references ","comments":"","fields":[{"type":"git_refdb *","name":"db","comments":""},{"type":"int (*)(git_reference **, git_reference_iterator *)","name":"next","comments":" Return the current reference and advance the iterator."},{"type":"int (*)(const char **, git_reference_iterator *)","name":"next_name","comments":" Return the name of the current reference and advance the iterator"},{"type":"void (*)(git_reference_iterator *)","name":"free","comments":" Free the iterator"}],"used":{"returns":[],"needs":["git_reference_iterator_free","git_reference_iterator_glob_new","git_reference_iterator_new","git_reference_next","git_reference_next_name"]}}],["git_reference_normalize_t",{"decl":["GIT_REF_FORMAT_NORMAL","GIT_REF_FORMAT_ALLOW_ONELEVEL","GIT_REF_FORMAT_REFSPEC_PATTERN","GIT_REF_FORMAT_REFSPEC_SHORTHAND"],"type":"enum","file":"refs.h","line":625,"lineto":654,"block":"GIT_REF_FORMAT_NORMAL\nGIT_REF_FORMAT_ALLOW_ONELEVEL\nGIT_REF_FORMAT_REFSPEC_PATTERN\nGIT_REF_FORMAT_REFSPEC_SHORTHAND","tdef":"typedef","description":" Normalization options for reference lookup","comments":"","fields":[{"type":"int","name":"GIT_REF_FORMAT_NORMAL","comments":"

No particular normalization.

\n","value":0},{"type":"int","name":"GIT_REF_FORMAT_ALLOW_ONELEVEL","comments":"

Control whether one-level refnames are accepted\n (i.e., refnames that do not contain multiple /-separated\n components). Those are expected to be written only using\n uppercase letters and underscore (FETCH_HEAD, ...)

\n","value":1},{"type":"int","name":"GIT_REF_FORMAT_REFSPEC_PATTERN","comments":"

Interpret the provided name as a reference pattern for a\n refspec (as used with remote repositories). If this option\n is enabled, the name is allowed to contain a single * (\n<star

\n\n
\n

)\n in place of a one full pathname component\n (e.g., foo/\n<star\n/bar but not foo/bar\n<star\n).

\n
\n","value":2},{"type":"int","name":"GIT_REF_FORMAT_REFSPEC_SHORTHAND","comments":"

Interpret the name as part of a refspec in shorthand form\n so the ONELEVEL naming rules aren't enforced and 'master'\n becomes a valid name.

\n","value":4}],"used":{"returns":[],"needs":[]}}],["git_reflog",{"decl":"git_reflog","type":"struct","value":"git_reflog","file":"types.h","line":147,"lineto":147,"tdef":"typedef","description":" Representation of a reference log ","comments":"","used":{"returns":[],"needs":["git_reflog_append","git_reflog_drop","git_reflog_entry_byindex","git_reflog_entrycount","git_reflog_free","git_reflog_read","git_reflog_write"]}}],["git_reflog_entry",{"decl":"git_reflog_entry","type":"struct","value":"git_reflog_entry","file":"types.h","line":144,"lineto":144,"tdef":"typedef","description":" Representation of a reference log entry ","comments":"","used":{"returns":["git_reflog_entry_byindex"],"needs":["git_reflog_entry_committer","git_reflog_entry_id_new","git_reflog_entry_id_old","git_reflog_entry_message"]}}],["git_remote",{"decl":"git_remote","type":"struct","value":"git_remote","file":"types.h","line":224,"lineto":224,"tdef":"typedef","description":" Git's idea of a remote repository. A remote can be anonymous (in\n which case it does not have backing configuration entires).","comments":"","used":{"returns":[],"needs":["git_remote_autotag","git_remote_connect","git_remote_connected","git_remote_create","git_remote_create_anonymous","git_remote_create_with_fetchspec","git_remote_default_branch","git_remote_disconnect","git_remote_download","git_remote_dup","git_remote_fetch","git_remote_free","git_remote_get_fetch_refspecs","git_remote_get_push_refspecs","git_remote_get_refspec","git_remote_lookup","git_remote_ls","git_remote_name","git_remote_owner","git_remote_prune","git_remote_prune_refs","git_remote_push","git_remote_pushurl","git_remote_refspec_count","git_remote_stats","git_remote_stop","git_remote_update_tips","git_remote_upload","git_remote_url","git_transport_dummy","git_transport_local","git_transport_new","git_transport_smart","git_transport_ssh_with_paths"]}}],["git_remote_autotag_option_t",{"decl":["GIT_REMOTE_DOWNLOAD_TAGS_UNSPECIFIED","GIT_REMOTE_DOWNLOAD_TAGS_AUTO","GIT_REMOTE_DOWNLOAD_TAGS_NONE","GIT_REMOTE_DOWNLOAD_TAGS_ALL"],"type":"enum","file":"remote.h","line":494,"lineto":512,"block":"GIT_REMOTE_DOWNLOAD_TAGS_UNSPECIFIED\nGIT_REMOTE_DOWNLOAD_TAGS_AUTO\nGIT_REMOTE_DOWNLOAD_TAGS_NONE\nGIT_REMOTE_DOWNLOAD_TAGS_ALL","tdef":"typedef","description":" Automatic tag following option","comments":"

Lets us select the --tags option to use.

\n","fields":[{"type":"int","name":"GIT_REMOTE_DOWNLOAD_TAGS_UNSPECIFIED","comments":"

Use the setting from the configuration.

\n","value":0},{"type":"int","name":"GIT_REMOTE_DOWNLOAD_TAGS_AUTO","comments":"

Ask the server for tags pointing to objects we're already\n downloading.

\n","value":1},{"type":"int","name":"GIT_REMOTE_DOWNLOAD_TAGS_NONE","comments":"

Don't ask for any tags beyond the refspecs.

\n","value":2},{"type":"int","name":"GIT_REMOTE_DOWNLOAD_TAGS_ALL","comments":"

Ask for the all the tags.

\n","value":3}],"used":{"returns":[],"needs":["git_remote_set_autotag","git_remote_update_tips"]}}],["git_remote_callbacks",{"decl":["unsigned int version","git_transport_message_cb sideband_progress","int (*)(git_remote_completion_type, void *) completion","git_cred_acquire_cb credentials","git_transport_certificate_check_cb certificate_check","git_transfer_progress_cb transfer_progress","int (*)(const char *, const git_oid *, const git_oid *, void *) update_tips","git_packbuilder_progress pack_progress","git_push_transfer_progress push_transfer_progress","int (*)(const char *, const char *, void *) push_update_reference","git_push_negotiation push_negotiation","git_transport_cb transport","void * payload"],"type":"struct","value":"git_remote_callbacks","file":"remote.h","line":373,"lineto":457,"block":"unsigned int version\ngit_transport_message_cb sideband_progress\nint (*)(git_remote_completion_type, void *) completion\ngit_cred_acquire_cb credentials\ngit_transport_certificate_check_cb certificate_check\ngit_transfer_progress_cb transfer_progress\nint (*)(const char *, const git_oid *, const git_oid *, void *) update_tips\ngit_packbuilder_progress pack_progress\ngit_push_transfer_progress push_transfer_progress\nint (*)(const char *, const char *, void *) push_update_reference\ngit_push_negotiation push_negotiation\ngit_transport_cb transport\nvoid * payload","tdef":null,"description":" The callback settings structure","comments":"

Set the callbacks to be called by the remote when informing the user\n about the progress of the network operations.

\n","fields":[{"type":"unsigned int","name":"version","comments":""},{"type":"git_transport_message_cb","name":"sideband_progress","comments":" Textual progress from the remote. Text send over the\n progress side-band will be passed to this function (this is\n the 'counting objects' output."},{"type":"int (*)(git_remote_completion_type, void *)","name":"completion","comments":" Completion is called when different parts of the download\n process are done (currently unused)."},{"type":"git_cred_acquire_cb","name":"credentials","comments":" This will be called if the remote host requires\n authentication in order to connect to it.\n\n Returning GIT_PASSTHROUGH will make libgit2 behave as\n though this field isn't set."},{"type":"git_transport_certificate_check_cb","name":"certificate_check","comments":" If cert verification fails, this will be called to let the\n user make the final decision of whether to allow the\n connection to proceed. Returns 1 to allow the connection, 0\n to disallow it or a negative value to indicate an error."},{"type":"git_transfer_progress_cb","name":"transfer_progress","comments":" During the download of new data, this will be regularly\n called with the current count of progress done by the\n indexer."},{"type":"int (*)(const char *, const git_oid *, const git_oid *, void *)","name":"update_tips","comments":" Each time a reference is updated locally, this function\n will be called with information about it."},{"type":"git_packbuilder_progress","name":"pack_progress","comments":" Function to call with progress information during pack\n building. Be aware that this is called inline with pack\n building operations, so performance may be affected."},{"type":"git_push_transfer_progress","name":"push_transfer_progress","comments":" Function to call with progress information during the\n upload portion of a push. Be aware that this is called\n inline with pack building operations, so performance may be\n affected."},{"type":"int (*)(const char *, const char *, void *)","name":"push_update_reference","comments":" Called for each updated reference on push. If `status` is\n not `NULL`, the update was rejected by the remote server\n and `status` contains the reason given."},{"type":"git_push_negotiation","name":"push_negotiation","comments":" Called once between the negotiation step and the upload. It\n provides information about what updates will be performed."},{"type":"git_transport_cb","name":"transport","comments":" Create the transport to use for this operation. Leave NULL\n to auto-detect."},{"type":"void *","name":"payload","comments":" This will be passed to each of the callbacks in this struct\n as the last parameter."}],"used":{"returns":[],"needs":["git_remote_connect","git_remote_init_callbacks","git_remote_prune","git_remote_update_tips"]}}],["git_remote_completion_type",{"decl":["GIT_REMOTE_COMPLETION_DOWNLOAD","GIT_REMOTE_COMPLETION_INDEXING","GIT_REMOTE_COMPLETION_ERROR"],"type":"enum","file":"remote.h","line":325,"lineto":329,"block":"GIT_REMOTE_COMPLETION_DOWNLOAD\nGIT_REMOTE_COMPLETION_INDEXING\nGIT_REMOTE_COMPLETION_ERROR\nGIT_REMOTE_COMPLETION_DOWNLOAD\nGIT_REMOTE_COMPLETION_INDEXING\nGIT_REMOTE_COMPLETION_ERROR","tdef":"typedef","description":" Argument to the completion callback which tells it which operation\n finished.","comments":"","fields":[{"type":"int","name":"GIT_REMOTE_COMPLETION_DOWNLOAD","comments":"","value":0},{"type":"int","name":"GIT_REMOTE_COMPLETION_INDEXING","comments":"","value":1},{"type":"int","name":"GIT_REMOTE_COMPLETION_ERROR","comments":"","value":2}],"used":{"returns":[],"needs":[]}}],["git_remote_head",{"decl":["int local","git_oid oid","git_oid loid","char * name","char * symref_target"],"type":"struct","value":"git_remote_head","file":"net.h","line":40,"lineto":50,"block":"int local\ngit_oid oid\ngit_oid loid\nchar * name\nchar * symref_target","tdef":null,"description":" Description of a reference advertised by a remote server, given out\n on `ls` calls.","comments":"","fields":[{"type":"int","name":"local","comments":""},{"type":"git_oid","name":"oid","comments":""},{"type":"git_oid","name":"loid","comments":""},{"type":"char *","name":"name","comments":""},{"type":"char *","name":"symref_target","comments":" If the server send a symref mapping for this ref, this will\n point to the target."}],"used":{"returns":[],"needs":["git_remote_ls"]}}],["git_repository",{"decl":"git_repository","type":"struct","value":"git_repository","file":"types.h","line":105,"lineto":105,"tdef":"typedef","description":" Representation of an existing git repository,\n including all its object contents","comments":"","used":{"returns":["git_blob_owner","git_commit_owner","git_filter_source_repo","git_index_owner","git_object_owner","git_reference_owner","git_remote_owner","git_revwalk_repository","git_submodule_owner","git_tag_owner","git_tree_owner"],"needs":["git_annotated_commit_from_fetchhead","git_annotated_commit_from_ref","git_annotated_commit_from_revspec","git_annotated_commit_lookup","git_attr_add_macro","git_attr_cache_flush","git_attr_foreach","git_attr_get","git_attr_get_many","git_blame_file","git_blob_create_frombuffer","git_blob_create_fromchunks","git_blob_create_fromdisk","git_blob_create_fromworkdir","git_blob_lookup","git_blob_lookup_prefix","git_branch_create","git_branch_create_from_annotated","git_branch_iterator_new","git_branch_lookup","git_checkout_head","git_checkout_index","git_checkout_tree","git_cherrypick","git_cherrypick_commit","git_clone","git_commit_create","git_commit_create_from_callback","git_commit_create_from_ids","git_commit_create_v","git_commit_lookup","git_commit_lookup_prefix","git_describe_workdir","git_diff_commit_as_email","git_diff_index_to_workdir","git_diff_tree_to_index","git_diff_tree_to_tree","git_diff_tree_to_workdir","git_diff_tree_to_workdir_with_index","git_filter_list_apply_to_file","git_filter_list_load","git_filter_list_new","git_filter_list_stream_file","git_graph_ahead_behind","git_graph_descendant_of","git_ignore_add_rule","git_ignore_clear_internal_rules","git_ignore_path_is_ignored","git_index_write_tree_to","git_merge","git_merge_analysis","git_merge_base","git_merge_base_many","git_merge_base_octopus","git_merge_bases","git_merge_bases_many","git_merge_commits","git_merge_file_from_index","git_merge_trees","git_note_create","git_note_foreach","git_note_iterator_new","git_note_read","git_note_remove","git_object_lookup","git_object_lookup_prefix","git_packbuilder_new","git_pathspec_match_workdir","git_rebase_init","git_rebase_open","git_refdb_backend_fs","git_refdb_new","git_refdb_open","git_reference_create","git_reference_create_matching","git_reference_dwim","git_reference_ensure_log","git_reference_foreach","git_reference_foreach_glob","git_reference_foreach_name","git_reference_has_log","git_reference_iterator_glob_new","git_reference_iterator_new","git_reference_list","git_reference_lookup","git_reference_name_to_id","git_reference_remove","git_reference_symbolic_create","git_reference_symbolic_create_matching","git_reflog_delete","git_reflog_read","git_reflog_rename","git_remote_add_fetch","git_remote_add_push","git_remote_create","git_remote_create_anonymous","git_remote_create_with_fetchspec","git_remote_delete","git_remote_list","git_remote_lookup","git_remote_rename","git_remote_set_autotag","git_remote_set_pushurl","git_remote_set_url","git_repository__cleanup","git_repository_config","git_repository_config_snapshot","git_repository_detach_head","git_repository_fetchhead_foreach","git_repository_free","git_repository_get_namespace","git_repository_hashfile","git_repository_head","git_repository_head_detached","git_repository_head_unborn","git_repository_ident","git_repository_index","git_repository_init","git_repository_init_ext","git_repository_is_bare","git_repository_is_empty","git_repository_is_shallow","git_repository_mergehead_foreach","git_repository_message","git_repository_message_remove","git_repository_new","git_repository_odb","git_repository_open","git_repository_open_bare","git_repository_open_ext","git_repository_path","git_repository_refdb","git_repository_reinit_filesystem","git_repository_set_bare","git_repository_set_config","git_repository_set_head","git_repository_set_head_detached","git_repository_set_head_detached_from_annotated","git_repository_set_ident","git_repository_set_index","git_repository_set_namespace","git_repository_set_odb","git_repository_set_refdb","git_repository_set_workdir","git_repository_state","git_repository_state_cleanup","git_repository_workdir","git_repository_wrap_odb","git_reset","git_reset_default","git_reset_from_annotated","git_revert","git_revert_commit","git_revparse","git_revparse_ext","git_revparse_single","git_revwalk_new","git_signature_default","git_stash_apply","git_stash_drop","git_stash_foreach","git_stash_pop","git_status_file","git_status_foreach","git_status_foreach_ext","git_status_list_new","git_status_should_ignore","git_submodule_add_setup","git_submodule_foreach","git_submodule_lookup","git_submodule_open","git_submodule_repo_init","git_submodule_resolve_url","git_submodule_set_branch","git_submodule_set_fetch_recurse_submodules","git_submodule_set_ignore","git_submodule_set_update","git_submodule_set_url","git_submodule_status","git_tag_annotation_create","git_tag_create","git_tag_create_frombuffer","git_tag_create_lightweight","git_tag_delete","git_tag_foreach","git_tag_list","git_tag_list_match","git_tag_lookup","git_tag_lookup_prefix","git_tree_entry_to_object","git_tree_lookup","git_tree_lookup_prefix","git_treebuilder_new"]}}],["git_repository_init_flag_t",{"decl":["GIT_REPOSITORY_INIT_BARE","GIT_REPOSITORY_INIT_NO_REINIT","GIT_REPOSITORY_INIT_NO_DOTGIT_DIR","GIT_REPOSITORY_INIT_MKDIR","GIT_REPOSITORY_INIT_MKPATH","GIT_REPOSITORY_INIT_EXTERNAL_TEMPLATE","GIT_REPOSITORY_INIT_RELATIVE_GITLINK"],"type":"enum","file":"repository.h","line":202,"lineto":210,"block":"GIT_REPOSITORY_INIT_BARE\nGIT_REPOSITORY_INIT_NO_REINIT\nGIT_REPOSITORY_INIT_NO_DOTGIT_DIR\nGIT_REPOSITORY_INIT_MKDIR\nGIT_REPOSITORY_INIT_MKPATH\nGIT_REPOSITORY_INIT_EXTERNAL_TEMPLATE\nGIT_REPOSITORY_INIT_RELATIVE_GITLINK","tdef":"typedef","description":" Option flags for `git_repository_init_ext`.","comments":"

These flags configure extra behaviors to git_repository_init_ext.\n In every case, the default behavior is the zero value (i.e. flag is\n not set). Just OR the flag values together for the flags parameter\n when initializing a new repo. Details of individual values are:

\n\n
    \n
  • BARE - Create a bare repository with no working directory.
  • \n
  • NO_REINIT - Return an GIT_EEXISTS error if the repo_path appears to\n already be an git repository.
  • \n
  • NO_DOTGIT_DIR - Normally a "/.git/" will be appended to the repo\n path for non-bare repos (if it is not already there), but\n passing this flag prevents that behavior.
  • \n
  • MKDIR - Make the repo_path (and workdir_path) as needed. Init is\n always willing to create the ".git" directory even without this\n flag. This flag tells init to create the trailing component of\n the repo and workdir paths as needed.
  • \n
  • MKPATH - Recursively make all components of the repo and workdir\n paths as necessary.
  • \n
  • EXTERNAL_TEMPLATE - libgit2 normally uses internal templates to\n initialize a new repo. This flags enables external templates,\n looking the "template_path" from the options if set, or the\n init.templatedir global config if not, or falling back on\n "/usr/share/git-core/templates" if it exists.
  • \n
  • GIT_REPOSITORY_INIT_RELATIVE_GITLINK - If an alternate workdir is\n specified, use relative paths for the gitdir and core.worktree.
  • \n
\n","fields":[{"type":"int","name":"GIT_REPOSITORY_INIT_BARE","comments":"","value":1},{"type":"int","name":"GIT_REPOSITORY_INIT_NO_REINIT","comments":"","value":2},{"type":"int","name":"GIT_REPOSITORY_INIT_NO_DOTGIT_DIR","comments":"","value":4},{"type":"int","name":"GIT_REPOSITORY_INIT_MKDIR","comments":"","value":8},{"type":"int","name":"GIT_REPOSITORY_INIT_MKPATH","comments":"","value":16},{"type":"int","name":"GIT_REPOSITORY_INIT_EXTERNAL_TEMPLATE","comments":"","value":32},{"type":"int","name":"GIT_REPOSITORY_INIT_RELATIVE_GITLINK","comments":"","value":64}],"used":{"returns":[],"needs":[]}}],["git_repository_init_mode_t",{"decl":["GIT_REPOSITORY_INIT_SHARED_UMASK","GIT_REPOSITORY_INIT_SHARED_GROUP","GIT_REPOSITORY_INIT_SHARED_ALL"],"type":"enum","file":"repository.h","line":225,"lineto":229,"block":"GIT_REPOSITORY_INIT_SHARED_UMASK\nGIT_REPOSITORY_INIT_SHARED_GROUP\nGIT_REPOSITORY_INIT_SHARED_ALL","tdef":"typedef","description":" Mode options for `git_repository_init_ext`.","comments":"

Set the mode field of the git_repository_init_options structure\n either to the custom mode that you would like, or to one of the\n following modes:

\n\n
    \n
  • SHARED_UMASK - Use permissions configured by umask - the default.
  • \n
  • SHARED_GROUP - Use "--shared=group" behavior, chmod'ing the new repo\n to be group writable and "g+sx" for sticky group assignment.
  • \n
  • SHARED_ALL - Use "--shared=all" behavior, adding world readability.
  • \n
  • Anything else - Set to custom value.
  • \n
\n","fields":[{"type":"int","name":"GIT_REPOSITORY_INIT_SHARED_UMASK","comments":"","value":0},{"type":"int","name":"GIT_REPOSITORY_INIT_SHARED_GROUP","comments":"","value":1533},{"type":"int","name":"GIT_REPOSITORY_INIT_SHARED_ALL","comments":"","value":1535}],"used":{"returns":[],"needs":[]}}],["git_repository_init_options",{"decl":["unsigned int version","uint32_t flags","uint32_t mode","const char * workdir_path","const char * description","const char * template_path","const char * initial_head","const char * origin_url"],"type":"struct","value":"git_repository_init_options","file":"repository.h","line":259,"lineto":268,"block":"unsigned int version\nuint32_t flags\nuint32_t mode\nconst char * workdir_path\nconst char * description\nconst char * template_path\nconst char * initial_head\nconst char * origin_url","tdef":"typedef","description":" Extended options structure for `git_repository_init_ext`.","comments":"

This contains extra options for git_repository_init_ext that enable\n additional initialization features. The fields are:

\n\n
    \n
  • flags - Combination of GIT_REPOSITORY_INIT flags above.
  • \n
  • mode - Set to one of the standard GIT_REPOSITORY_INIT_SHARED_...\n constants above, or to a custom value that you would like.
  • \n
  • workdir_path - The path to the working dir or NULL for default (i.e.\n repo_path parent on non-bare repos). IF THIS IS RELATIVE PATH,\n IT WILL BE EVALUATED RELATIVE TO THE REPO_PATH. If this is not\n the "natural" working directory, a .git gitlink file will be\n created here linking to the repo_path.
  • \n
  • description - If set, this will be used to initialize the "description"\n file in the repository, instead of using the template content.
  • \n
  • template_path - When GIT_REPOSITORY_INIT_EXTERNAL_TEMPLATE is set,\n this contains the path to use for the template directory. If\n this is NULL, the config or default directory options will be\n used instead.
  • \n
  • initial_head - The name of the head to point HEAD at. If NULL, then\n this will be treated as "master" and the HEAD ref will be set\n to "refs/heads/master". If this begins with "refs/" it will be\n used verbatim; otherwise "refs/heads/" will be prefixed.
  • \n
  • origin_url - If this is non-NULL, then after the rest of the\n repository initialization is completed, an "origin" remote\n will be added pointing to this URL.
  • \n
\n","fields":[{"type":"unsigned int","name":"version","comments":""},{"type":"uint32_t","name":"flags","comments":""},{"type":"uint32_t","name":"mode","comments":""},{"type":"const char *","name":"workdir_path","comments":""},{"type":"const char *","name":"description","comments":""},{"type":"const char *","name":"template_path","comments":""},{"type":"const char *","name":"initial_head","comments":""},{"type":"const char *","name":"origin_url","comments":""}],"used":{"returns":[],"needs":["git_repository_init_ext","git_repository_init_init_options"]}}],["git_repository_open_flag_t",{"decl":["GIT_REPOSITORY_OPEN_NO_SEARCH","GIT_REPOSITORY_OPEN_CROSS_FS","GIT_REPOSITORY_OPEN_BARE"],"type":"enum","file":"repository.h","line":99,"lineto":103,"block":"GIT_REPOSITORY_OPEN_NO_SEARCH\nGIT_REPOSITORY_OPEN_CROSS_FS\nGIT_REPOSITORY_OPEN_BARE","tdef":"typedef","description":" Option flags for `git_repository_open_ext`.","comments":"
    \n
  • GIT_REPOSITORY_OPEN_NO_SEARCH - Only open the repository if it can be\nimmediately found in the start_path. Do not walk up from the\nstart_path looking at parent directories.
  • \n
  • GIT_REPOSITORY_OPEN_CROSS_FS - Unless this flag is set, open will not\ncontinue searching across filesystem boundaries (i.e. when st_dev\nchanges from the stat system call). (E.g. Searching in a user's home\ndirectory "/home/user/source/" will not return "/.git/" as the found\nrepo if "/" is a different filesystem than "/home".)
  • \n
  • GIT_REPOSITORY_OPEN_BARE - Open repository as a bare repo regardless\nof core.bare config, and defer loading config file for faster setup.\nUnlike git_repository_open_bare, this can follow gitlinks.
  • \n
\n","fields":[{"type":"int","name":"GIT_REPOSITORY_OPEN_NO_SEARCH","comments":"","value":1},{"type":"int","name":"GIT_REPOSITORY_OPEN_CROSS_FS","comments":"","value":2},{"type":"int","name":"GIT_REPOSITORY_OPEN_BARE","comments":"","value":4}],"used":{"returns":[],"needs":[]}}],["git_repository_state_t",{"decl":["GIT_REPOSITORY_STATE_NONE","GIT_REPOSITORY_STATE_MERGE","GIT_REPOSITORY_STATE_REVERT","GIT_REPOSITORY_STATE_CHERRYPICK","GIT_REPOSITORY_STATE_BISECT","GIT_REPOSITORY_STATE_REBASE","GIT_REPOSITORY_STATE_REBASE_INTERACTIVE","GIT_REPOSITORY_STATE_REBASE_MERGE","GIT_REPOSITORY_STATE_APPLY_MAILBOX","GIT_REPOSITORY_STATE_APPLY_MAILBOX_OR_REBASE"],"type":"enum","file":"repository.h","line":674,"lineto":685,"block":"GIT_REPOSITORY_STATE_NONE\nGIT_REPOSITORY_STATE_MERGE\nGIT_REPOSITORY_STATE_REVERT\nGIT_REPOSITORY_STATE_CHERRYPICK\nGIT_REPOSITORY_STATE_BISECT\nGIT_REPOSITORY_STATE_REBASE\nGIT_REPOSITORY_STATE_REBASE_INTERACTIVE\nGIT_REPOSITORY_STATE_REBASE_MERGE\nGIT_REPOSITORY_STATE_APPLY_MAILBOX\nGIT_REPOSITORY_STATE_APPLY_MAILBOX_OR_REBASE","tdef":"typedef","description":" Repository state","comments":"

These values represent possible states for the repository to be in,\n based on the current operation which is ongoing.

\n","fields":[{"type":"int","name":"GIT_REPOSITORY_STATE_NONE","comments":"","value":0},{"type":"int","name":"GIT_REPOSITORY_STATE_MERGE","comments":"","value":1},{"type":"int","name":"GIT_REPOSITORY_STATE_REVERT","comments":"","value":2},{"type":"int","name":"GIT_REPOSITORY_STATE_CHERRYPICK","comments":"","value":3},{"type":"int","name":"GIT_REPOSITORY_STATE_BISECT","comments":"","value":4},{"type":"int","name":"GIT_REPOSITORY_STATE_REBASE","comments":"","value":5},{"type":"int","name":"GIT_REPOSITORY_STATE_REBASE_INTERACTIVE","comments":"","value":6},{"type":"int","name":"GIT_REPOSITORY_STATE_REBASE_MERGE","comments":"","value":7},{"type":"int","name":"GIT_REPOSITORY_STATE_APPLY_MAILBOX","comments":"","value":8},{"type":"int","name":"GIT_REPOSITORY_STATE_APPLY_MAILBOX_OR_REBASE","comments":"","value":9}],"used":{"returns":[],"needs":[]}}],["git_reset_t",{"decl":["GIT_RESET_SOFT","GIT_RESET_MIXED","GIT_RESET_HARD"],"type":"enum","file":"reset.h","line":26,"lineto":30,"block":"GIT_RESET_SOFT\nGIT_RESET_MIXED\nGIT_RESET_HARD","tdef":"typedef","description":" Kinds of reset operation","comments":"","fields":[{"type":"int","name":"GIT_RESET_SOFT","comments":"

Move the head to the given commit

\n","value":1},{"type":"int","name":"GIT_RESET_MIXED","comments":"

SOFT plus reset index to the commit

\n","value":2},{"type":"int","name":"GIT_RESET_HARD","comments":"

MIXED plus changes in working tree discarded

\n","value":3}],"used":{"returns":[],"needs":["git_reset","git_reset_from_annotated"]}}],["git_revert_options",{"decl":["unsigned int version","unsigned int mainline","git_merge_options merge_opts","git_checkout_options checkout_opts"],"type":"struct","value":"git_revert_options","file":"revert.h","line":26,"lineto":34,"block":"unsigned int version\nunsigned int mainline\ngit_merge_options merge_opts\ngit_checkout_options checkout_opts","tdef":"typedef","description":" Options for revert","comments":"","fields":[{"type":"unsigned int","name":"version","comments":""},{"type":"unsigned int","name":"mainline","comments":" For merge commits, the \"mainline\" is treated as the parent. "},{"type":"git_merge_options","name":"merge_opts","comments":" Options for the merging "},{"type":"git_checkout_options","name":"checkout_opts","comments":" Options for the checkout "}],"used":{"returns":[],"needs":["git_revert","git_revert_init_options"]}}],["git_revparse_mode_t",{"decl":["GIT_REVPARSE_SINGLE","GIT_REVPARSE_RANGE","GIT_REVPARSE_MERGE_BASE"],"type":"enum","file":"revparse.h","line":71,"lineto":78,"block":"GIT_REVPARSE_SINGLE\nGIT_REVPARSE_RANGE\nGIT_REVPARSE_MERGE_BASE","tdef":"typedef","description":" Revparse flags. These indicate the intended behavior of the spec passed to\n git_revparse.","comments":"","fields":[{"type":"int","name":"GIT_REVPARSE_SINGLE","comments":"

The spec targeted a single object.

\n","value":1},{"type":"int","name":"GIT_REVPARSE_RANGE","comments":"

The spec targeted a range of commits.

\n","value":2},{"type":"int","name":"GIT_REVPARSE_MERGE_BASE","comments":"

The spec used the '...' operator, which invokes special semantics.

\n","value":4}],"used":{"returns":[],"needs":[]}}],["git_revspec",{"decl":["git_object * from","git_object * to","unsigned int flags"],"type":"struct","value":"git_revspec","file":"revparse.h","line":83,"lineto":90,"block":"git_object * from\ngit_object * to\nunsigned int flags","tdef":"typedef","description":" Git Revision Spec: output of a `git_revparse` operation","comments":"","fields":[{"type":"git_object *","name":"from","comments":" The left element of the revspec; must be freed by the user "},{"type":"git_object *","name":"to","comments":" The right element of the revspec; must be freed by the user "},{"type":"unsigned int","name":"flags","comments":" The intent of the revspec (i.e. `git_revparse_mode_t` flags) "}],"used":{"returns":[],"needs":["git_revparse"]}}],["git_revwalk",{"decl":"git_revwalk","type":"struct","value":"git_revwalk","file":"types.h","line":111,"lineto":111,"tdef":"typedef","description":" Representation of an in-progress walk through the commits in a repo ","comments":"","used":{"returns":[],"needs":["git_packbuilder_insert_walk","git_revwalk_add_hide_cb","git_revwalk_free","git_revwalk_hide","git_revwalk_hide_glob","git_revwalk_hide_head","git_revwalk_hide_ref","git_revwalk_new","git_revwalk_next","git_revwalk_push","git_revwalk_push_glob","git_revwalk_push_head","git_revwalk_push_range","git_revwalk_push_ref","git_revwalk_repository","git_revwalk_reset","git_revwalk_simplify_first_parent","git_revwalk_sorting"]}}],["git_signature",{"decl":["char * name","char * email","git_time when"],"type":"struct","value":"git_signature","file":"types.h","line":162,"lineto":166,"block":"char * name\nchar * email\ngit_time when","tdef":"typedef","description":" An action signature (e.g. for committers, taggers, etc) ","comments":"","fields":[{"type":"char *","name":"name","comments":" full name of the author "},{"type":"char *","name":"email","comments":" email of the author "},{"type":"git_time","name":"when","comments":" time when the action happened "}],"used":{"returns":["git_commit_author","git_commit_committer","git_note_author","git_note_committer","git_reflog_entry_committer","git_tag_tagger"],"needs":["git_commit_amend","git_commit_create","git_commit_create_from_callback","git_commit_create_from_ids","git_commit_create_v","git_note_create","git_note_remove","git_rebase_commit","git_rebase_finish","git_reflog_append","git_signature_default","git_signature_dup","git_signature_free","git_signature_new","git_signature_now","git_tag_annotation_create","git_tag_create"]}}],["git_smart_subtransport_definition",{"decl":["git_smart_subtransport_cb callback","unsigned int rpc","void * param"],"type":"struct","value":"git_smart_subtransport_definition","file":"sys/transport.h","line":296,"lineto":309,"block":"git_smart_subtransport_cb callback\nunsigned int rpc\nvoid * param","tdef":"typedef","description":" Definition for a \"subtransport\"","comments":"

This is used to let the smart protocol code know about the protocol\n which you are implementing.

\n","fields":[{"type":"git_smart_subtransport_cb","name":"callback","comments":" The function to use to create the git_smart_subtransport "},{"type":"unsigned int","name":"rpc","comments":" True if the protocol is stateless; false otherwise. For example,\n http:// is stateless, but git:// is not."},{"type":"void *","name":"param","comments":" Param of the callback"}],"used":{"returns":[],"needs":[]}}],["git_sort_t",{"decl":["GIT_SORT_NONE","GIT_SORT_TOPOLOGICAL","GIT_SORT_TIME","GIT_SORT_REVERSE"],"type":"enum","file":"revwalk.h","line":26,"lineto":55,"block":"GIT_SORT_NONE\nGIT_SORT_TOPOLOGICAL\nGIT_SORT_TIME\nGIT_SORT_REVERSE","tdef":"typedef","description":" Flags to specify the sorting which a revwalk should perform.","comments":"","fields":[{"type":"int","name":"GIT_SORT_NONE","comments":"

Sort the repository contents in no particular ordering;\n this sorting is arbitrary, implementation-specific\n and subject to change at any time.\n This is the default sorting for new walkers.

\n","value":0},{"type":"int","name":"GIT_SORT_TOPOLOGICAL","comments":"

Sort the repository contents in topological order\n (parents before children); this sorting mode\n can be combined with time sorting.

\n","value":1},{"type":"int","name":"GIT_SORT_TIME","comments":"

Sort the repository contents by commit time;\n this sorting mode can be combined with\n topological sorting.

\n","value":2},{"type":"int","name":"GIT_SORT_REVERSE","comments":"

Iterate through the repository contents in reverse\n order; this sorting mode can be combined with\n any of the above.

\n","value":4}],"used":{"returns":[],"needs":[]}}],["git_stash_apply_flags",{"decl":["GIT_STASH_APPLY_DEFAULT","GIT_STASH_APPLY_REINSTATE_INDEX"],"type":"enum","file":"stash.h","line":74,"lineto":81,"block":"GIT_STASH_APPLY_DEFAULT\nGIT_STASH_APPLY_REINSTATE_INDEX","tdef":"typedef","description":" Stash application flags. ","comments":"","fields":[{"type":"int","name":"GIT_STASH_APPLY_DEFAULT","comments":"","value":0},{"type":"int","name":"GIT_STASH_APPLY_REINSTATE_INDEX","comments":"","value":1}],"used":{"returns":[],"needs":[]}}],["git_stash_flags",{"decl":["GIT_STASH_DEFAULT","GIT_STASH_KEEP_INDEX","GIT_STASH_INCLUDE_UNTRACKED","GIT_STASH_INCLUDE_IGNORED"],"type":"enum","file":"stash.h","line":24,"lineto":47,"block":"GIT_STASH_DEFAULT\nGIT_STASH_KEEP_INDEX\nGIT_STASH_INCLUDE_UNTRACKED\nGIT_STASH_INCLUDE_IGNORED","tdef":"typedef","description":" Stash flags","comments":"","fields":[{"type":"int","name":"GIT_STASH_DEFAULT","comments":"

No option, default

\n","value":0},{"type":"int","name":"GIT_STASH_KEEP_INDEX","comments":"

All changes already added to the index are left intact in\n the working directory

\n","value":1},{"type":"int","name":"GIT_STASH_INCLUDE_UNTRACKED","comments":"

All untracked files are also stashed and then cleaned up\n from the working directory

\n","value":2},{"type":"int","name":"GIT_STASH_INCLUDE_IGNORED","comments":"

All ignored files are also stashed and then cleaned up from\n the working directory

\n","value":4}],"used":{"returns":[],"needs":[]}}],["git_status_list",{"decl":"git_status_list","type":"struct","value":"git_status_list","file":"types.h","line":184,"lineto":184,"tdef":"typedef","description":" Representation of a status collection ","comments":"","used":{"returns":[],"needs":["git_status_byindex","git_status_list_entrycount","git_status_list_free","git_status_list_get_perfdata","git_status_list_new"]}}],["git_status_opt_t",{"decl":["GIT_STATUS_OPT_INCLUDE_UNTRACKED","GIT_STATUS_OPT_INCLUDE_IGNORED","GIT_STATUS_OPT_INCLUDE_UNMODIFIED","GIT_STATUS_OPT_EXCLUDE_SUBMODULES","GIT_STATUS_OPT_RECURSE_UNTRACKED_DIRS","GIT_STATUS_OPT_DISABLE_PATHSPEC_MATCH","GIT_STATUS_OPT_RECURSE_IGNORED_DIRS","GIT_STATUS_OPT_RENAMES_HEAD_TO_INDEX","GIT_STATUS_OPT_RENAMES_INDEX_TO_WORKDIR","GIT_STATUS_OPT_SORT_CASE_SENSITIVELY","GIT_STATUS_OPT_SORT_CASE_INSENSITIVELY","GIT_STATUS_OPT_RENAMES_FROM_REWRITES","GIT_STATUS_OPT_NO_REFRESH","GIT_STATUS_OPT_UPDATE_INDEX","GIT_STATUS_OPT_INCLUDE_UNREADABLE","GIT_STATUS_OPT_INCLUDE_UNREADABLE_AS_UNTRACKED"],"type":"enum","file":"status.h","line":137,"lineto":154,"block":"GIT_STATUS_OPT_INCLUDE_UNTRACKED\nGIT_STATUS_OPT_INCLUDE_IGNORED\nGIT_STATUS_OPT_INCLUDE_UNMODIFIED\nGIT_STATUS_OPT_EXCLUDE_SUBMODULES\nGIT_STATUS_OPT_RECURSE_UNTRACKED_DIRS\nGIT_STATUS_OPT_DISABLE_PATHSPEC_MATCH\nGIT_STATUS_OPT_RECURSE_IGNORED_DIRS\nGIT_STATUS_OPT_RENAMES_HEAD_TO_INDEX\nGIT_STATUS_OPT_RENAMES_INDEX_TO_WORKDIR\nGIT_STATUS_OPT_SORT_CASE_SENSITIVELY\nGIT_STATUS_OPT_SORT_CASE_INSENSITIVELY\nGIT_STATUS_OPT_RENAMES_FROM_REWRITES\nGIT_STATUS_OPT_NO_REFRESH\nGIT_STATUS_OPT_UPDATE_INDEX\nGIT_STATUS_OPT_INCLUDE_UNREADABLE\nGIT_STATUS_OPT_INCLUDE_UNREADABLE_AS_UNTRACKED","tdef":"typedef","description":" Flags to control status callbacks","comments":"
    \n
  • GIT_STATUS_OPT_INCLUDE_UNTRACKED says that callbacks should be made\non untracked files. These will only be made if the workdir files are\nincluded in the status "show" option.
  • \n
  • GIT_STATUS_OPT_INCLUDE_IGNORED says that ignored files get callbacks.\nAgain, these callbacks will only be made if the workdir files are\nincluded in the status "show" option.
  • \n
  • GIT_STATUS_OPT_INCLUDE_UNMODIFIED indicates that callback should be\nmade even on unmodified files.
  • \n
  • GIT_STATUS_OPT_EXCLUDE_SUBMODULES indicates that submodules should be\nskipped. This only applies if there are no pending typechanges to\nthe submodule (either from or to another type).
  • \n
  • GIT_STATUS_OPT_RECURSE_UNTRACKED_DIRS indicates that all files in\nuntracked directories should be included. Normally if an entire\ndirectory is new, then just the top-level directory is included (with\na trailing slash on the entry name). This flag says to include all\nof the individual files in the directory instead.
  • \n
  • GIT_STATUS_OPT_DISABLE_PATHSPEC_MATCH indicates that the given path\nshould be treated as a literal path, and not as a pathspec pattern.
  • \n
  • GIT_STATUS_OPT_RECURSE_IGNORED_DIRS indicates that the contents of\nignored directories should be included in the status. This is like\ndoing git ls-files -o -i --exclude-standard with core git.
  • \n
  • GIT_STATUS_OPT_RENAMES_HEAD_TO_INDEX indicates that rename detection\nshould be processed between the head and the index and enables\nthe GIT_STATUS_INDEX_RENAMED as a possible status flag.
  • \n
  • GIT_STATUS_OPT_RENAMES_INDEX_TO_WORKDIR indicates that rename\ndetection should be run between the index and the working directory\nand enabled GIT_STATUS_WT_RENAMED as a possible status flag.
  • \n
  • GIT_STATUS_OPT_SORT_CASE_SENSITIVELY overrides the native case\nsensitivity for the file system and forces the output to be in\ncase-sensitive order
  • \n
  • GIT_STATUS_OPT_SORT_CASE_INSENSITIVELY overrides the native case\nsensitivity for the file system and forces the output to be in\ncase-insensitive order
  • \n
  • GIT_STATUS_OPT_RENAMES_FROM_REWRITES indicates that rename detection\nshould include rewritten files
  • \n
  • GIT_STATUS_OPT_NO_REFRESH bypasses the default status behavior of\ndoing a "soft" index reload (i.e. reloading the index data if the\nfile on disk has been modified outside libgit2).
  • \n
  • GIT_STATUS_OPT_UPDATE_INDEX tells libgit2 to refresh the stat cache\nin the index for files that are unchanged but have out of date stat\ninformation in the index. It will result in less work being done on\nsubsequent calls to get status. This is mutually exclusive with the\nNO_REFRESH option.
  • \n
\n\n

Calling git_status_foreach() is like calling the extended version\n with: GIT_STATUS_OPT_INCLUDE_IGNORED, GIT_STATUS_OPT_INCLUDE_UNTRACKED,\n and GIT_STATUS_OPT_RECURSE_UNTRACKED_DIRS. Those options are bundled\n together as GIT_STATUS_OPT_DEFAULTS if you want them as a baseline.

\n","fields":[{"type":"int","name":"GIT_STATUS_OPT_INCLUDE_UNTRACKED","comments":"","value":1},{"type":"int","name":"GIT_STATUS_OPT_INCLUDE_IGNORED","comments":"","value":2},{"type":"int","name":"GIT_STATUS_OPT_INCLUDE_UNMODIFIED","comments":"","value":4},{"type":"int","name":"GIT_STATUS_OPT_EXCLUDE_SUBMODULES","comments":"","value":8},{"type":"int","name":"GIT_STATUS_OPT_RECURSE_UNTRACKED_DIRS","comments":"","value":16},{"type":"int","name":"GIT_STATUS_OPT_DISABLE_PATHSPEC_MATCH","comments":"","value":32},{"type":"int","name":"GIT_STATUS_OPT_RECURSE_IGNORED_DIRS","comments":"","value":64},{"type":"int","name":"GIT_STATUS_OPT_RENAMES_HEAD_TO_INDEX","comments":"","value":128},{"type":"int","name":"GIT_STATUS_OPT_RENAMES_INDEX_TO_WORKDIR","comments":"","value":256},{"type":"int","name":"GIT_STATUS_OPT_SORT_CASE_SENSITIVELY","comments":"","value":512},{"type":"int","name":"GIT_STATUS_OPT_SORT_CASE_INSENSITIVELY","comments":"","value":1024},{"type":"int","name":"GIT_STATUS_OPT_RENAMES_FROM_REWRITES","comments":"","value":2048},{"type":"int","name":"GIT_STATUS_OPT_NO_REFRESH","comments":"","value":4096},{"type":"int","name":"GIT_STATUS_OPT_UPDATE_INDEX","comments":"","value":8192},{"type":"int","name":"GIT_STATUS_OPT_INCLUDE_UNREADABLE","comments":"","value":16384},{"type":"int","name":"GIT_STATUS_OPT_INCLUDE_UNREADABLE_AS_UNTRACKED","comments":"","value":32768}],"used":{"returns":[],"needs":[]}}],["git_status_show_t",{"decl":["GIT_STATUS_SHOW_INDEX_AND_WORKDIR","GIT_STATUS_SHOW_INDEX_ONLY","GIT_STATUS_SHOW_WORKDIR_ONLY"],"type":"enum","file":"status.h","line":79,"lineto":83,"block":"GIT_STATUS_SHOW_INDEX_AND_WORKDIR\nGIT_STATUS_SHOW_INDEX_ONLY\nGIT_STATUS_SHOW_WORKDIR_ONLY","tdef":"typedef","description":" Select the files on which to report status.","comments":"

With git_status_foreach_ext, this will control which changes get\n callbacks. With git_status_list_new, these will control which\n changes are included in the list.

\n\n
    \n
  • GIT_STATUS_SHOW_INDEX_AND_WORKDIR is the default. This roughly\nmatches git status --porcelain regarding which files are\nincluded and in what order.
  • \n
  • GIT_STATUS_SHOW_INDEX_ONLY only gives status based on HEAD to index\ncomparison, not looking at working directory changes.
  • \n
  • GIT_STATUS_SHOW_WORKDIR_ONLY only gives status based on index to\nworking directory comparison, not comparing the index to the HEAD.
  • \n
\n","fields":[{"type":"int","name":"GIT_STATUS_SHOW_INDEX_AND_WORKDIR","comments":"","value":0},{"type":"int","name":"GIT_STATUS_SHOW_INDEX_ONLY","comments":"","value":1},{"type":"int","name":"GIT_STATUS_SHOW_WORKDIR_ONLY","comments":"","value":2}],"used":{"returns":[],"needs":[]}}],["git_status_t",{"decl":["GIT_STATUS_CURRENT","GIT_STATUS_INDEX_NEW","GIT_STATUS_INDEX_MODIFIED","GIT_STATUS_INDEX_DELETED","GIT_STATUS_INDEX_RENAMED","GIT_STATUS_INDEX_TYPECHANGE","GIT_STATUS_WT_NEW","GIT_STATUS_WT_MODIFIED","GIT_STATUS_WT_DELETED","GIT_STATUS_WT_TYPECHANGE","GIT_STATUS_WT_RENAMED","GIT_STATUS_WT_UNREADABLE","GIT_STATUS_IGNORED","GIT_STATUS_CONFLICTED"],"type":"enum","file":"status.h","line":32,"lineto":50,"block":"GIT_STATUS_CURRENT\nGIT_STATUS_INDEX_NEW\nGIT_STATUS_INDEX_MODIFIED\nGIT_STATUS_INDEX_DELETED\nGIT_STATUS_INDEX_RENAMED\nGIT_STATUS_INDEX_TYPECHANGE\nGIT_STATUS_WT_NEW\nGIT_STATUS_WT_MODIFIED\nGIT_STATUS_WT_DELETED\nGIT_STATUS_WT_TYPECHANGE\nGIT_STATUS_WT_RENAMED\nGIT_STATUS_WT_UNREADABLE\nGIT_STATUS_IGNORED\nGIT_STATUS_CONFLICTED","tdef":"typedef","description":" Status flags for a single file.","comments":"

A combination of these values will be returned to indicate the status of\n a file. Status compares the working directory, the index, and the\n current HEAD of the repository. The GIT_STATUS_INDEX set of flags\n represents the status of file in the index relative to the HEAD, and the\n GIT_STATUS_WT set of flags represent the status of the file in the\n working directory relative to the index.

\n","fields":[{"type":"int","name":"GIT_STATUS_CURRENT","comments":"","value":0},{"type":"int","name":"GIT_STATUS_INDEX_NEW","comments":"","value":1},{"type":"int","name":"GIT_STATUS_INDEX_MODIFIED","comments":"","value":2},{"type":"int","name":"GIT_STATUS_INDEX_DELETED","comments":"","value":4},{"type":"int","name":"GIT_STATUS_INDEX_RENAMED","comments":"","value":8},{"type":"int","name":"GIT_STATUS_INDEX_TYPECHANGE","comments":"","value":16},{"type":"int","name":"GIT_STATUS_WT_NEW","comments":"","value":128},{"type":"int","name":"GIT_STATUS_WT_MODIFIED","comments":"","value":256},{"type":"int","name":"GIT_STATUS_WT_DELETED","comments":"","value":512},{"type":"int","name":"GIT_STATUS_WT_TYPECHANGE","comments":"","value":1024},{"type":"int","name":"GIT_STATUS_WT_RENAMED","comments":"","value":2048},{"type":"int","name":"GIT_STATUS_WT_UNREADABLE","comments":"","value":4096},{"type":"int","name":"GIT_STATUS_IGNORED","comments":"","value":16384},{"type":"int","name":"GIT_STATUS_CONFLICTED","comments":"","value":32768}],"used":{"returns":[],"needs":[]}}],["git_strarray",{"decl":["char ** strings","size_t count"],"type":"struct","value":"git_strarray","file":"strarray.h","line":22,"lineto":25,"block":"char ** strings\nsize_t count","tdef":"typedef","description":" Array of strings ","comments":"","fields":[{"type":"char **","name":"strings","comments":""},{"type":"size_t","name":"count","comments":""}],"used":{"returns":[],"needs":["git_index_add_all","git_index_remove_all","git_index_update_all","git_pathspec_new","git_reference_list","git_remote_download","git_remote_fetch","git_remote_get_fetch_refspecs","git_remote_get_push_refspecs","git_remote_list","git_remote_push","git_remote_rename","git_remote_upload","git_reset_default","git_strarray_copy","git_strarray_free","git_tag_list","git_tag_list_match"]}}],["git_stream",{"decl":["int version","int encrypted","int proxy_support","int (*)(struct git_stream *) connect","int (*)(git_cert **, struct git_stream *) certificate","int (*)(struct git_stream *, const char *) set_proxy","ssize_t (*)(struct git_stream *, void *, size_t) read","ssize_t (*)(struct git_stream *, const char *, size_t, int) write","int (*)(struct git_stream *) close","void (*)(struct git_stream *) free"],"type":"struct","value":"git_stream","file":"sys/stream.h","line":28,"lineto":40,"block":"int version\nint encrypted\nint proxy_support\nint (*)(struct git_stream *) connect\nint (*)(git_cert **, struct git_stream *) certificate\nint (*)(struct git_stream *, const char *) set_proxy\nssize_t (*)(struct git_stream *, void *, size_t) read\nssize_t (*)(struct git_stream *, const char *, size_t, int) write\nint (*)(struct git_stream *) close\nvoid (*)(struct git_stream *) free","tdef":"typedef","description":" Every stream must have this struct as its first element, so the\n API can talk to it. You'd define your stream as","comments":"
 struct my_stream {\n         git_stream parent;\n         ...\n }\n
\n\n

and fill the functions

\n","fields":[{"type":"int","name":"version","comments":""},{"type":"int","name":"encrypted","comments":""},{"type":"int","name":"proxy_support","comments":""},{"type":"int (*)(struct git_stream *)","name":"connect","comments":""},{"type":"int (*)(git_cert **, struct git_stream *)","name":"certificate","comments":""},{"type":"int (*)(struct git_stream *, const char *)","name":"set_proxy","comments":""},{"type":"ssize_t (*)(struct git_stream *, void *, size_t)","name":"read","comments":""},{"type":"ssize_t (*)(struct git_stream *, const char *, size_t, int)","name":"write","comments":""},{"type":"int (*)(struct git_stream *)","name":"close","comments":""},{"type":"void (*)(struct git_stream *)","name":"free","comments":""}],"used":{"returns":[],"needs":[]}}],["git_submodule",{"decl":"git_submodule","type":"struct","value":"git_submodule","file":"types.h","line":335,"lineto":335,"tdef":"typedef","description":" Opaque structure representing a submodule.","comments":"","used":{"returns":[],"needs":["git_submodule_add_finalize","git_submodule_add_setup","git_submodule_add_to_index","git_submodule_branch","git_submodule_fetch_recurse_submodules","git_submodule_foreach","git_submodule_free","git_submodule_head_id","git_submodule_ignore","git_submodule_index_id","git_submodule_init","git_submodule_location","git_submodule_lookup","git_submodule_name","git_submodule_open","git_submodule_owner","git_submodule_path","git_submodule_reload","git_submodule_repo_init","git_submodule_sync","git_submodule_update","git_submodule_update_strategy","git_submodule_url","git_submodule_wd_id"]}}],["git_submodule_ignore_t",{"decl":["GIT_SUBMODULE_IGNORE_UNSPECIFIED","GIT_SUBMODULE_IGNORE_NONE","GIT_SUBMODULE_IGNORE_UNTRACKED","GIT_SUBMODULE_IGNORE_DIRTY","GIT_SUBMODULE_IGNORE_ALL"],"type":"enum","file":"types.h","line":399,"lineto":406,"block":"GIT_SUBMODULE_IGNORE_UNSPECIFIED\nGIT_SUBMODULE_IGNORE_NONE\nGIT_SUBMODULE_IGNORE_UNTRACKED\nGIT_SUBMODULE_IGNORE_DIRTY\nGIT_SUBMODULE_IGNORE_ALL","tdef":"typedef","description":" Submodule ignore values","comments":"

These values represent settings for the submodule.$name.ignore\n configuration value which says how deeply to look at the working\n directory when getting submodule status.

\n\n

You can override this value in memory on a per-submodule basis with\n git_submodule_set_ignore() and can write the changed value to disk\n with git_submodule_save(). If you have overwritten the value, you\n can revert to the on disk value by using GIT_SUBMODULE_IGNORE_RESET.

\n\n

The values are:

\n\n
    \n
  • GIT_SUBMODULE_IGNORE_UNSPECIFIED: use the submodule's configuration
  • \n
  • GIT_SUBMODULE_IGNORE_NONE: don't ignore any change - i.e. even an\nuntracked file, will mark the submodule as dirty. Ignored files are\nstill ignored, of course.
  • \n
  • GIT_SUBMODULE_IGNORE_UNTRACKED: ignore untracked files; only changes\nto tracked files, or the index or the HEAD commit will matter.
  • \n
  • GIT_SUBMODULE_IGNORE_DIRTY: ignore changes in the working directory,\nonly considering changes if the HEAD of submodule has moved from the\nvalue in the superproject.
  • \n
  • GIT_SUBMODULE_IGNORE_ALL: never check if the submodule is dirty
  • \n
  • GIT_SUBMODULE_IGNORE_DEFAULT: not used except as static initializer\nwhen we don't want any particular ignore rule to be specified.
  • \n
\n","fields":[{"type":"int","name":"GIT_SUBMODULE_IGNORE_UNSPECIFIED","comments":"

use the submodule's configuration

\n","value":-1},{"type":"int","name":"GIT_SUBMODULE_IGNORE_NONE","comments":"

any change or untracked == dirty

\n","value":1},{"type":"int","name":"GIT_SUBMODULE_IGNORE_UNTRACKED","comments":"

dirty if tracked files change

\n","value":2},{"type":"int","name":"GIT_SUBMODULE_IGNORE_DIRTY","comments":"

only dirty if HEAD moved

\n","value":3},{"type":"int","name":"GIT_SUBMODULE_IGNORE_ALL","comments":"

never dirty

\n","value":4}],"used":{"returns":[],"needs":["git_submodule_set_ignore","git_submodule_status"]}}],["git_submodule_recurse_t",{"decl":["GIT_SUBMODULE_RECURSE_NO","GIT_SUBMODULE_RECURSE_YES","GIT_SUBMODULE_RECURSE_ONDEMAND"],"type":"enum","file":"types.h","line":418,"lineto":422,"block":"GIT_SUBMODULE_RECURSE_NO\nGIT_SUBMODULE_RECURSE_YES\nGIT_SUBMODULE_RECURSE_ONDEMAND","tdef":"typedef","description":" Options for submodule recurse.","comments":"

Represent the value of submodule.$name.fetchRecurseSubmodules

\n\n
    \n
  • GIT_SUBMODULE_RECURSE_NO - do no recurse into submodules
  • \n
  • GIT_SUBMODULE_RECURSE_YES - recurse into submodules
  • \n
  • GIT_SUBMODULE_RECURSE_ONDEMAND - recurse into submodules only when\n commit not already in local clone
  • \n
\n","fields":[{"type":"int","name":"GIT_SUBMODULE_RECURSE_NO","comments":"","value":0},{"type":"int","name":"GIT_SUBMODULE_RECURSE_YES","comments":"","value":1},{"type":"int","name":"GIT_SUBMODULE_RECURSE_ONDEMAND","comments":"","value":2}],"used":{"returns":[],"needs":["git_submodule_set_fetch_recurse_submodules"]}}],["git_submodule_status_t",{"decl":["GIT_SUBMODULE_STATUS_IN_HEAD","GIT_SUBMODULE_STATUS_IN_INDEX","GIT_SUBMODULE_STATUS_IN_CONFIG","GIT_SUBMODULE_STATUS_IN_WD","GIT_SUBMODULE_STATUS_INDEX_ADDED","GIT_SUBMODULE_STATUS_INDEX_DELETED","GIT_SUBMODULE_STATUS_INDEX_MODIFIED","GIT_SUBMODULE_STATUS_WD_UNINITIALIZED","GIT_SUBMODULE_STATUS_WD_ADDED","GIT_SUBMODULE_STATUS_WD_DELETED","GIT_SUBMODULE_STATUS_WD_MODIFIED","GIT_SUBMODULE_STATUS_WD_INDEX_MODIFIED","GIT_SUBMODULE_STATUS_WD_WD_MODIFIED","GIT_SUBMODULE_STATUS_WD_UNTRACKED"],"type":"enum","file":"submodule.h","line":74,"lineto":89,"block":"GIT_SUBMODULE_STATUS_IN_HEAD\nGIT_SUBMODULE_STATUS_IN_INDEX\nGIT_SUBMODULE_STATUS_IN_CONFIG\nGIT_SUBMODULE_STATUS_IN_WD\nGIT_SUBMODULE_STATUS_INDEX_ADDED\nGIT_SUBMODULE_STATUS_INDEX_DELETED\nGIT_SUBMODULE_STATUS_INDEX_MODIFIED\nGIT_SUBMODULE_STATUS_WD_UNINITIALIZED\nGIT_SUBMODULE_STATUS_WD_ADDED\nGIT_SUBMODULE_STATUS_WD_DELETED\nGIT_SUBMODULE_STATUS_WD_MODIFIED\nGIT_SUBMODULE_STATUS_WD_INDEX_MODIFIED\nGIT_SUBMODULE_STATUS_WD_WD_MODIFIED\nGIT_SUBMODULE_STATUS_WD_UNTRACKED","tdef":"typedef","description":" Return codes for submodule status.","comments":"

A combination of these flags will be returned to describe the status of a\n submodule. Depending on the "ignore" property of the submodule, some of\n the flags may never be returned because they indicate changes that are\n supposed to be ignored.

\n\n

Submodule info is contained in 4 places: the HEAD tree, the index, config\n files (both .git/config and .gitmodules), and the working directory. Any\n or all of those places might be missing information about the submodule\n depending on what state the repo is in. We consider all four places to\n build the combination of status flags.

\n\n

There are four values that are not really status, but give basic info\n about what sources of submodule data are available. These will be\n returned even if ignore is set to "ALL".

\n\n
    \n
  • IN_HEAD - superproject head contains submodule
  • \n
  • IN_INDEX - superproject index contains submodule
  • \n
  • IN_CONFIG - superproject gitmodules has submodule
  • \n
  • IN_WD - superproject workdir has submodule
  • \n
\n\n

The following values will be returned so long as ignore is not "ALL".

\n\n
    \n
  • INDEX_ADDED - in index, not in head
  • \n
  • INDEX_DELETED - in head, not in index
  • \n
  • INDEX_MODIFIED - index and head don't match
  • \n
  • WD_UNINITIALIZED - workdir contains empty directory
  • \n
  • WD_ADDED - in workdir, not index
  • \n
  • WD_DELETED - in index, not workdir
  • \n
  • WD_MODIFIED - index and workdir head don't match
  • \n
\n\n

The following can only be returned if ignore is "NONE" or "UNTRACKED".

\n\n
    \n
  • WD_INDEX_MODIFIED - submodule workdir index is dirty
  • \n
  • WD_WD_MODIFIED - submodule workdir has modified files
  • \n
\n\n

Lastly, the following will only be returned for ignore "NONE".

\n\n
    \n
  • WD_UNTRACKED - wd contains untracked files
  • \n
\n","fields":[{"type":"int","name":"GIT_SUBMODULE_STATUS_IN_HEAD","comments":"","value":1},{"type":"int","name":"GIT_SUBMODULE_STATUS_IN_INDEX","comments":"","value":2},{"type":"int","name":"GIT_SUBMODULE_STATUS_IN_CONFIG","comments":"","value":4},{"type":"int","name":"GIT_SUBMODULE_STATUS_IN_WD","comments":"","value":8},{"type":"int","name":"GIT_SUBMODULE_STATUS_INDEX_ADDED","comments":"","value":16},{"type":"int","name":"GIT_SUBMODULE_STATUS_INDEX_DELETED","comments":"","value":32},{"type":"int","name":"GIT_SUBMODULE_STATUS_INDEX_MODIFIED","comments":"","value":64},{"type":"int","name":"GIT_SUBMODULE_STATUS_WD_UNINITIALIZED","comments":"","value":128},{"type":"int","name":"GIT_SUBMODULE_STATUS_WD_ADDED","comments":"","value":256},{"type":"int","name":"GIT_SUBMODULE_STATUS_WD_DELETED","comments":"","value":512},{"type":"int","name":"GIT_SUBMODULE_STATUS_WD_MODIFIED","comments":"","value":1024},{"type":"int","name":"GIT_SUBMODULE_STATUS_WD_INDEX_MODIFIED","comments":"","value":2048},{"type":"int","name":"GIT_SUBMODULE_STATUS_WD_WD_MODIFIED","comments":"","value":4096},{"type":"int","name":"GIT_SUBMODULE_STATUS_WD_UNTRACKED","comments":"","value":8192}],"used":{"returns":[],"needs":[]}}],["git_submodule_update_options",{"decl":["unsigned int version","git_checkout_options checkout_opts","git_fetch_options fetch_opts","unsigned int clone_checkout_strategy"],"type":"struct","value":"git_submodule_update_options","file":"submodule.h","line":118,"lineto":146,"block":"unsigned int version\ngit_checkout_options checkout_opts\ngit_fetch_options fetch_opts\nunsigned int clone_checkout_strategy","tdef":"typedef","description":" Submodule update options structure","comments":"

Use the GIT_SUBMODULE_UPDATE_OPTIONS_INIT to get the default settings,\n like this:

\n\n

git_submodule_update_options opts = GIT_SUBMODULE_UPDATE_OPTIONS_INIT;

\n","fields":[{"type":"unsigned int","name":"version","comments":""},{"type":"git_checkout_options","name":"checkout_opts","comments":" These options are passed to the checkout step. To disable\n checkout, set the `checkout_strategy` to\n `GIT_CHECKOUT_NONE`. Generally you will want the use\n GIT_CHECKOUT_SAFE to update files in the working\n directory. Use the `clone_checkout_strategy` field\n to set the checkout strategy that will be used in\n the case where update needs to clone the repository."},{"type":"git_fetch_options","name":"fetch_opts","comments":" Options which control the fetch, including callbacks.\n\n The callbacks to use for reporting fetch progress, and for acquiring\n credentials in the event they are needed."},{"type":"unsigned int","name":"clone_checkout_strategy","comments":" The checkout strategy to use when the sub repository needs to\n be cloned. Use GIT_CHECKOUT_SAFE to create all files\n in the working directory for the newly cloned repository."}],"used":{"returns":[],"needs":["git_submodule_update","git_submodule_update_init_options"]}}],["git_submodule_update_t",{"decl":["GIT_SUBMODULE_UPDATE_CHECKOUT","GIT_SUBMODULE_UPDATE_REBASE","GIT_SUBMODULE_UPDATE_MERGE","GIT_SUBMODULE_UPDATE_NONE","GIT_SUBMODULE_UPDATE_DEFAULT"],"type":"enum","file":"types.h","line":363,"lineto":370,"block":"GIT_SUBMODULE_UPDATE_CHECKOUT\nGIT_SUBMODULE_UPDATE_REBASE\nGIT_SUBMODULE_UPDATE_MERGE\nGIT_SUBMODULE_UPDATE_NONE\nGIT_SUBMODULE_UPDATE_DEFAULT","tdef":"typedef","description":" Submodule update values","comments":"

These values represent settings for the submodule.$name.update\n configuration value which says how to handle git submodule update for\n this submodule. The value is usually set in the ".gitmodules" file and\n copied to ".git/config" when the submodule is initialized.

\n\n

You can override this setting on a per-submodule basis with\n git_submodule_set_update() and write the changed value to disk using\n git_submodule_save(). If you have overwritten the value, you can\n revert it by passing GIT_SUBMODULE_UPDATE_RESET to the set function.

\n\n

The values are:

\n\n
    \n
  • GIT_SUBMODULE_UPDATE_CHECKOUT: the default; when a submodule is\nupdated, checkout the new detached HEAD to the submodule directory.
  • \n
  • GIT_SUBMODULE_UPDATE_REBASE: update by rebasing the current checked\nout branch onto the commit from the superproject.
  • \n
  • GIT_SUBMODULE_UPDATE_MERGE: update by merging the commit in the\nsuperproject into the current checkout out branch of the submodule.
  • \n
  • GIT_SUBMODULE_UPDATE_NONE: do not update this submodule even when\nthe commit in the superproject is updated.
  • \n
  • GIT_SUBMODULE_UPDATE_DEFAULT: not used except as static initializer\nwhen we don't want any particular update rule to be specified.
  • \n
\n","fields":[{"type":"int","name":"GIT_SUBMODULE_UPDATE_CHECKOUT","comments":"","value":1},{"type":"int","name":"GIT_SUBMODULE_UPDATE_REBASE","comments":"","value":2},{"type":"int","name":"GIT_SUBMODULE_UPDATE_MERGE","comments":"","value":3},{"type":"int","name":"GIT_SUBMODULE_UPDATE_NONE","comments":"","value":4},{"type":"int","name":"GIT_SUBMODULE_UPDATE_DEFAULT","comments":"","value":0}],"used":{"returns":[],"needs":["git_submodule_set_update"]}}],["git_tag",{"decl":"git_tag","type":"struct","value":"git_tag","file":"types.h","line":114,"lineto":114,"tdef":"typedef","description":" Parsed representation of a tag object. ","comments":"","used":{"returns":[],"needs":["git_tag_free","git_tag_id","git_tag_lookup","git_tag_lookup_prefix","git_tag_message","git_tag_name","git_tag_owner","git_tag_peel","git_tag_tagger","git_tag_target","git_tag_target_id","git_tag_target_type"]}}],["git_time",{"decl":["git_time_t time","int offset"],"type":"struct","value":"git_time","file":"types.h","line":156,"lineto":159,"block":"git_time_t time\nint offset","tdef":"typedef","description":" Time in a signature ","comments":"","fields":[{"type":"git_time_t","name":"time","comments":" time in seconds from epoch "},{"type":"int","name":"offset","comments":" timezone offset, in minutes "}],"used":{"returns":[],"needs":[]}}],["git_trace_level_t",{"decl":["GIT_TRACE_NONE","GIT_TRACE_FATAL","GIT_TRACE_ERROR","GIT_TRACE_WARN","GIT_TRACE_INFO","GIT_TRACE_DEBUG","GIT_TRACE_TRACE"],"type":"enum","file":"trace.h","line":26,"lineto":47,"block":"GIT_TRACE_NONE\nGIT_TRACE_FATAL\nGIT_TRACE_ERROR\nGIT_TRACE_WARN\nGIT_TRACE_INFO\nGIT_TRACE_DEBUG\nGIT_TRACE_TRACE","tdef":"typedef","description":" Available tracing levels. When tracing is set to a particular level,\n callers will be provided tracing at the given level and all lower levels.","comments":"","fields":[{"type":"int","name":"GIT_TRACE_NONE","comments":"

No tracing will be performed.

\n","value":0},{"type":"int","name":"GIT_TRACE_FATAL","comments":"

Severe errors that may impact the program's execution

\n","value":1},{"type":"int","name":"GIT_TRACE_ERROR","comments":"

Errors that do not impact the program's execution

\n","value":2},{"type":"int","name":"GIT_TRACE_WARN","comments":"

Warnings that suggest abnormal data

\n","value":3},{"type":"int","name":"GIT_TRACE_INFO","comments":"

Informational messages about program execution

\n","value":4},{"type":"int","name":"GIT_TRACE_DEBUG","comments":"

Detailed data that allows for debugging

\n","value":5},{"type":"int","name":"GIT_TRACE_TRACE","comments":"

Exceptionally detailed debugging data

\n","value":6}],"used":{"returns":[],"needs":["git_trace_set"]}}],["git_transaction",{"decl":"git_transaction","type":"struct","value":"git_transaction","file":"types.h","line":175,"lineto":175,"tdef":"typedef","description":" Transactional interface to references ","comments":"","used":{"returns":[],"needs":[]}}],["git_transfer_progress",{"decl":["unsigned int total_objects","unsigned int indexed_objects","unsigned int received_objects","unsigned int local_objects","unsigned int total_deltas","unsigned int indexed_deltas","size_t received_bytes"],"type":"struct","value":"git_transfer_progress","file":"types.h","line":253,"lineto":261,"block":"unsigned int total_objects\nunsigned int indexed_objects\nunsigned int received_objects\nunsigned int local_objects\nunsigned int total_deltas\nunsigned int indexed_deltas\nsize_t received_bytes","tdef":"typedef","description":" This is passed as the first argument to the callback to allow the\n user to see the progress.","comments":"
    \n
  • total_objects: number of objects in the packfile being downloaded
  • \n
  • indexed_objects: received objects that have been hashed
  • \n
  • received_objects: objects which have been downloaded
  • \n
  • local_objects: locally-available objects that have been injected\nin order to fix a thin pack.
  • \n
  • received-bytes: size of the packfile received up to now
  • \n
\n","fields":[{"type":"unsigned int","name":"total_objects","comments":""},{"type":"unsigned int","name":"indexed_objects","comments":""},{"type":"unsigned int","name":"received_objects","comments":""},{"type":"unsigned int","name":"local_objects","comments":""},{"type":"unsigned int","name":"total_deltas","comments":""},{"type":"unsigned int","name":"indexed_deltas","comments":""},{"type":"size_t","name":"received_bytes","comments":""}],"used":{"returns":["git_remote_stats"],"needs":["git_indexer_append","git_indexer_commit"]}}],["git_transport",{"decl":"git_transport","type":"struct","value":"git_transport","file":"types.h","line":230,"lineto":230,"tdef":"typedef","description":" Interface which represents a transport to communicate with a\n remote.","comments":"","used":{"returns":[],"needs":["git_smart_subtransport_git","git_smart_subtransport_http","git_smart_subtransport_ssh","git_transport_dummy","git_transport_init","git_transport_local","git_transport_new","git_transport_smart","git_transport_ssh_with_paths"]}}],["git_transport_flags_t",{"decl":["GIT_TRANSPORTFLAGS_NONE"],"type":"enum","file":"sys/transport.h","line":29,"lineto":31,"block":"GIT_TRANSPORTFLAGS_NONE","tdef":"typedef","description":" Flags to pass to transport","comments":"

Currently unused.

\n","fields":[{"type":"int","name":"GIT_TRANSPORTFLAGS_NONE","comments":"","value":0}],"used":{"returns":[],"needs":[]}}],["git_tree",{"decl":"git_tree","type":"struct","value":"git_tree","file":"types.h","line":126,"lineto":126,"tdef":"typedef","description":" Representation of a tree object. ","comments":"","used":{"returns":[],"needs":["git_commit_amend","git_commit_create","git_commit_create_v","git_commit_tree","git_diff_tree_to_index","git_diff_tree_to_tree","git_diff_tree_to_workdir","git_diff_tree_to_workdir_with_index","git_index_read_tree","git_merge_trees","git_pathspec_match_tree","git_tree_entry_byid","git_tree_entry_byindex","git_tree_entry_byname","git_tree_entry_bypath","git_tree_entrycount","git_tree_free","git_tree_id","git_tree_lookup","git_tree_lookup_prefix","git_tree_owner","git_tree_walk","git_treebuilder_new"]}}],["git_tree_entry",{"decl":"git_tree_entry","type":"struct","value":"git_tree_entry","file":"types.h","line":123,"lineto":123,"tdef":"typedef","description":" Representation of each one of the entries in a tree object. ","comments":"","used":{"returns":["git_tree_entry_byid","git_tree_entry_byindex","git_tree_entry_byname","git_treebuilder_get"],"needs":["git_tree_entry_bypath","git_tree_entry_cmp","git_tree_entry_dup","git_tree_entry_filemode","git_tree_entry_filemode_raw","git_tree_entry_free","git_tree_entry_id","git_tree_entry_name","git_tree_entry_to_object","git_tree_entry_type","git_treebuilder_insert"]}}],["git_treebuilder",{"decl":"git_treebuilder","type":"struct","value":"git_treebuilder","file":"types.h","line":129,"lineto":129,"tdef":"typedef","description":" Constructor for in-memory trees ","comments":"","used":{"returns":[],"needs":["git_treebuilder_clear","git_treebuilder_entrycount","git_treebuilder_filter","git_treebuilder_free","git_treebuilder_get","git_treebuilder_insert","git_treebuilder_new","git_treebuilder_remove","git_treebuilder_write"]}}],["git_treewalk_mode",{"decl":["GIT_TREEWALK_PRE","GIT_TREEWALK_POST"],"type":"enum","file":"tree.h","line":384,"lineto":387,"block":"GIT_TREEWALK_PRE\nGIT_TREEWALK_POST","tdef":"typedef","description":" Tree traversal modes ","comments":"","fields":[{"type":"int","name":"GIT_TREEWALK_PRE","comments":"","value":0},{"type":"int","name":"GIT_TREEWALK_POST","comments":"","value":1}],"used":{"returns":[],"needs":["git_tree_walk"]}}],["git_writestream",{"decl":"git_writestream","type":"struct","value":"git_writestream","file":"types.h","line":425,"lineto":425,"tdef":"typedef","description":" A type to write in a streaming fashion, for example, for filters. ","comments":"","used":{"returns":[],"needs":["git_filter_list_stream_blob","git_filter_list_stream_data","git_filter_list_stream_file"]}}]],"prefix":"include/git2","groups":[["annotated",["git_annotated_commit_free","git_annotated_commit_from_fetchhead","git_annotated_commit_from_ref","git_annotated_commit_from_revspec","git_annotated_commit_id","git_annotated_commit_lookup"]],["attr",["git_attr_add_macro","git_attr_cache_flush","git_attr_foreach","git_attr_get","git_attr_get_many","git_attr_value"]],["blame",["git_blame_buffer","git_blame_file","git_blame_free","git_blame_get_hunk_byindex","git_blame_get_hunk_byline","git_blame_get_hunk_count","git_blame_init_options"]],["blob",["git_blob_create_frombuffer","git_blob_create_fromchunks","git_blob_create_fromdisk","git_blob_create_fromworkdir","git_blob_filtered_content","git_blob_free","git_blob_id","git_blob_is_binary","git_blob_lookup","git_blob_lookup_prefix","git_blob_owner","git_blob_rawcontent","git_blob_rawsize"]],["branch",["git_branch_create","git_branch_create_from_annotated","git_branch_delete","git_branch_is_head","git_branch_iterator_free","git_branch_iterator_new","git_branch_lookup","git_branch_move","git_branch_name","git_branch_next","git_branch_set_upstream","git_branch_upstream"]],["buf",["git_buf_contains_nul","git_buf_free","git_buf_grow","git_buf_is_binary","git_buf_set"]],["checkout",["git_checkout_head","git_checkout_index","git_checkout_init_options","git_checkout_tree"]],["cherrypick",["git_cherrypick","git_cherrypick_commit","git_cherrypick_init_options"]],["clone",["git_clone","git_clone_init_options"]],["commit",["git_commit_amend","git_commit_author","git_commit_committer","git_commit_create","git_commit_create_from_callback","git_commit_create_from_ids","git_commit_create_v","git_commit_free","git_commit_header_field","git_commit_id","git_commit_lookup","git_commit_lookup_prefix","git_commit_message","git_commit_message_encoding","git_commit_message_raw","git_commit_nth_gen_ancestor","git_commit_owner","git_commit_parent","git_commit_parent_id","git_commit_parentcount","git_commit_raw_header","git_commit_summary","git_commit_time","git_commit_time_offset","git_commit_tree","git_commit_tree_id"]],["config",["git_config_add_backend","git_config_add_file_ondisk","git_config_backend_foreach_match","git_config_delete_entry","git_config_delete_multivar","git_config_entry_free","git_config_find_global","git_config_find_system","git_config_find_xdg","git_config_foreach","git_config_foreach_match","git_config_free","git_config_get_bool","git_config_get_entry","git_config_get_int32","git_config_get_int64","git_config_get_mapped","git_config_get_multivar_foreach","git_config_get_path","git_config_get_string","git_config_get_string_buf","git_config_init_backend","git_config_iterator_free","git_config_iterator_glob_new","git_config_iterator_new","git_config_lookup_map_value","git_config_multivar_iterator_new","git_config_new","git_config_next","git_config_open_default","git_config_open_global","git_config_open_level","git_config_open_ondisk","git_config_parse_bool","git_config_parse_int32","git_config_parse_int64","git_config_parse_path","git_config_set_bool","git_config_set_int32","git_config_set_int64","git_config_set_multivar","git_config_set_string","git_config_snapshot"]],["cred",["git_cred_default_new","git_cred_has_username","git_cred_ssh_custom_new","git_cred_ssh_interactive_new","git_cred_ssh_key_from_agent","git_cred_ssh_key_memory_new","git_cred_ssh_key_new","git_cred_username_new","git_cred_userpass","git_cred_userpass_plaintext_new"]],["describe",["git_describe_commit","git_describe_format","git_describe_result_free","git_describe_workdir"]],["diff",["git_diff_blob_to_buffer","git_diff_blobs","git_diff_buffers","git_diff_commit_as_email","git_diff_find_init_options","git_diff_find_similar","git_diff_foreach","git_diff_format_email","git_diff_format_email_init_options","git_diff_free","git_diff_get_delta","git_diff_get_perfdata","git_diff_get_stats","git_diff_index_to_workdir","git_diff_init_options","git_diff_is_sorted_icase","git_diff_merge","git_diff_num_deltas","git_diff_num_deltas_of_type","git_diff_print","git_diff_print_callback__to_buf","git_diff_print_callback__to_file_handle","git_diff_stats_deletions","git_diff_stats_files_changed","git_diff_stats_free","git_diff_stats_insertions","git_diff_stats_to_buf","git_diff_status_char","git_diff_tree_to_index","git_diff_tree_to_tree","git_diff_tree_to_workdir","git_diff_tree_to_workdir_with_index"]],["fetch",["git_fetch_init_options"]],["filter",["git_filter_list_apply_to_blob","git_filter_list_apply_to_data","git_filter_list_apply_to_file","git_filter_list_contains","git_filter_list_free","git_filter_list_length","git_filter_list_load","git_filter_list_new","git_filter_list_push","git_filter_list_stream_blob","git_filter_list_stream_data","git_filter_list_stream_file","git_filter_lookup","git_filter_register","git_filter_source_filemode","git_filter_source_flags","git_filter_source_id","git_filter_source_mode","git_filter_source_path","git_filter_source_repo","git_filter_unregister"]],["giterr",["giterr_clear","giterr_detach","giterr_last","giterr_set_oom","giterr_set_str"]],["graph",["git_graph_ahead_behind","git_graph_descendant_of"]],["hashsig",["git_hashsig_compare","git_hashsig_create","git_hashsig_create_fromfile","git_hashsig_free"]],["ignore",["git_ignore_add_rule","git_ignore_clear_internal_rules","git_ignore_path_is_ignored"]],["index",["git_index_add","git_index_add_all","git_index_add_bypath","git_index_add_frombuffer","git_index_caps","git_index_checksum","git_index_clear","git_index_conflict_add","git_index_conflict_cleanup","git_index_conflict_get","git_index_conflict_iterator_free","git_index_conflict_iterator_new","git_index_conflict_next","git_index_conflict_remove","git_index_entry_is_conflict","git_index_entry_stage","git_index_entrycount","git_index_find","git_index_free","git_index_get_byindex","git_index_get_bypath","git_index_has_conflicts","git_index_new","git_index_open","git_index_owner","git_index_path","git_index_read","git_index_read_tree","git_index_remove","git_index_remove_all","git_index_remove_bypath","git_index_remove_directory","git_index_set_caps","git_index_update_all","git_index_write","git_index_write_tree","git_index_write_tree_to"]],["indexer",["git_indexer_append","git_indexer_commit","git_indexer_free","git_indexer_hash","git_indexer_new"]],["libgit2",["git_libgit2_features","git_libgit2_init","git_libgit2_opts","git_libgit2_shutdown","git_libgit2_version"]],["mempack",["git_mempack_new","git_mempack_reset"]],["merge",["git_merge","git_merge_analysis","git_merge_base","git_merge_base_many","git_merge_base_octopus","git_merge_bases","git_merge_bases_many","git_merge_commits","git_merge_file","git_merge_file_from_index","git_merge_file_init_input","git_merge_file_init_options","git_merge_file_result_free","git_merge_init_options","git_merge_trees"]],["message",["git_message_prettify"]],["note",["git_note_author","git_note_committer","git_note_create","git_note_foreach","git_note_free","git_note_id","git_note_iterator_free","git_note_iterator_new","git_note_message","git_note_next","git_note_read","git_note_remove"]],["object",["git_object__size","git_object_dup","git_object_free","git_object_id","git_object_lookup","git_object_lookup_bypath","git_object_lookup_prefix","git_object_owner","git_object_peel","git_object_short_id","git_object_string2type","git_object_type","git_object_type2string","git_object_typeisloose"]],["odb",["git_odb_add_alternate","git_odb_add_backend","git_odb_add_disk_alternate","git_odb_backend_loose","git_odb_backend_one_pack","git_odb_backend_pack","git_odb_exists","git_odb_exists_prefix","git_odb_foreach","git_odb_free","git_odb_get_backend","git_odb_hash","git_odb_hashfile","git_odb_init_backend","git_odb_new","git_odb_num_backends","git_odb_object_data","git_odb_object_dup","git_odb_object_free","git_odb_object_id","git_odb_object_size","git_odb_object_type","git_odb_open","git_odb_open_rstream","git_odb_open_wstream","git_odb_read","git_odb_read_header","git_odb_read_prefix","git_odb_refresh","git_odb_stream_finalize_write","git_odb_stream_free","git_odb_stream_read","git_odb_stream_write","git_odb_write","git_odb_write_pack"]],["oid",["git_oid_cmp","git_oid_cpy","git_oid_equal","git_oid_fmt","git_oid_fromraw","git_oid_fromstr","git_oid_fromstrn","git_oid_fromstrp","git_oid_iszero","git_oid_ncmp","git_oid_nfmt","git_oid_pathfmt","git_oid_shorten_add","git_oid_shorten_free","git_oid_shorten_new","git_oid_strcmp","git_oid_streq","git_oid_tostr","git_oid_tostr_s"]],["oidarray",["git_oidarray_free"]],["openssl",["git_openssl_set_locking"]],["packbuilder",["git_packbuilder_foreach","git_packbuilder_free","git_packbuilder_hash","git_packbuilder_insert","git_packbuilder_insert_commit","git_packbuilder_insert_recur","git_packbuilder_insert_tree","git_packbuilder_insert_walk","git_packbuilder_new","git_packbuilder_object_count","git_packbuilder_set_callbacks","git_packbuilder_set_threads","git_packbuilder_write","git_packbuilder_written"]],["patch",["git_patch_free","git_patch_from_blob_and_buffer","git_patch_from_blobs","git_patch_from_buffers","git_patch_from_diff","git_patch_get_delta","git_patch_get_hunk","git_patch_get_line_in_hunk","git_patch_line_stats","git_patch_num_hunks","git_patch_num_lines_in_hunk","git_patch_print","git_patch_size","git_patch_to_buf"]],["pathspec",["git_pathspec_free","git_pathspec_match_diff","git_pathspec_match_index","git_pathspec_match_list_diff_entry","git_pathspec_match_list_entry","git_pathspec_match_list_entrycount","git_pathspec_match_list_failed_entry","git_pathspec_match_list_failed_entrycount","git_pathspec_match_list_free","git_pathspec_match_tree","git_pathspec_match_workdir","git_pathspec_matches_path","git_pathspec_new"]],["push",["git_push_init_options"]],["rebase",["git_rebase_abort","git_rebase_commit","git_rebase_finish","git_rebase_free","git_rebase_init","git_rebase_init_options","git_rebase_next","git_rebase_open","git_rebase_operation_byindex","git_rebase_operation_current","git_rebase_operation_entrycount"]],["refdb",["git_refdb_backend_fs","git_refdb_compress","git_refdb_free","git_refdb_init_backend","git_refdb_new","git_refdb_open","git_refdb_set_backend"]],["reference",["git_reference__alloc","git_reference__alloc_symbolic","git_reference_cmp","git_reference_create","git_reference_create_matching","git_reference_delete","git_reference_dwim","git_reference_ensure_log","git_reference_foreach","git_reference_foreach_glob","git_reference_foreach_name","git_reference_free","git_reference_has_log","git_reference_is_branch","git_reference_is_note","git_reference_is_remote","git_reference_is_tag","git_reference_is_valid_name","git_reference_iterator_free","git_reference_iterator_glob_new","git_reference_iterator_new","git_reference_list","git_reference_lookup","git_reference_name","git_reference_name_to_id","git_reference_next","git_reference_next_name","git_reference_normalize_name","git_reference_owner","git_reference_peel","git_reference_remove","git_reference_rename","git_reference_resolve","git_reference_set_target","git_reference_shorthand","git_reference_symbolic_create","git_reference_symbolic_create_matching","git_reference_symbolic_set_target","git_reference_symbolic_target","git_reference_target","git_reference_target_peel","git_reference_type"]],["reflog",["git_reflog_append","git_reflog_delete","git_reflog_drop","git_reflog_entry_byindex","git_reflog_entry_committer","git_reflog_entry_id_new","git_reflog_entry_id_old","git_reflog_entry_message","git_reflog_entrycount","git_reflog_free","git_reflog_read","git_reflog_rename","git_reflog_write"]],["refspec",["git_refspec_direction","git_refspec_dst","git_refspec_dst_matches","git_refspec_force","git_refspec_rtransform","git_refspec_src","git_refspec_src_matches","git_refspec_string","git_refspec_transform"]],["remote",["git_remote_add_fetch","git_remote_add_push","git_remote_autotag","git_remote_connect","git_remote_connected","git_remote_create","git_remote_create_anonymous","git_remote_create_with_fetchspec","git_remote_default_branch","git_remote_delete","git_remote_disconnect","git_remote_download","git_remote_dup","git_remote_fetch","git_remote_free","git_remote_get_fetch_refspecs","git_remote_get_push_refspecs","git_remote_get_refspec","git_remote_init_callbacks","git_remote_is_valid_name","git_remote_list","git_remote_lookup","git_remote_ls","git_remote_name","git_remote_owner","git_remote_prune","git_remote_prune_refs","git_remote_push","git_remote_pushurl","git_remote_refspec_count","git_remote_rename","git_remote_set_autotag","git_remote_set_pushurl","git_remote_set_url","git_remote_stats","git_remote_stop","git_remote_update_tips","git_remote_upload","git_remote_url"]],["repository",["git_repository__cleanup","git_repository_config","git_repository_config_snapshot","git_repository_detach_head","git_repository_discover","git_repository_fetchhead_foreach","git_repository_free","git_repository_get_namespace","git_repository_hashfile","git_repository_head","git_repository_head_detached","git_repository_head_unborn","git_repository_ident","git_repository_index","git_repository_init","git_repository_init_ext","git_repository_init_init_options","git_repository_is_bare","git_repository_is_empty","git_repository_is_shallow","git_repository_mergehead_foreach","git_repository_message","git_repository_message_remove","git_repository_new","git_repository_odb","git_repository_open","git_repository_open_bare","git_repository_open_ext","git_repository_path","git_repository_refdb","git_repository_reinit_filesystem","git_repository_set_bare","git_repository_set_config","git_repository_set_head","git_repository_set_head_detached","git_repository_set_head_detached_from_annotated","git_repository_set_ident","git_repository_set_index","git_repository_set_namespace","git_repository_set_odb","git_repository_set_refdb","git_repository_set_workdir","git_repository_state","git_repository_state_cleanup","git_repository_workdir","git_repository_wrap_odb"]],["reset",["git_reset","git_reset_default","git_reset_from_annotated"]],["revert",["git_revert","git_revert_commit","git_revert_init_options"]],["revparse",["git_revparse","git_revparse_ext","git_revparse_single"]],["revwalk",["git_revwalk_add_hide_cb","git_revwalk_free","git_revwalk_hide","git_revwalk_hide_glob","git_revwalk_hide_head","git_revwalk_hide_ref","git_revwalk_new","git_revwalk_next","git_revwalk_push","git_revwalk_push_glob","git_revwalk_push_head","git_revwalk_push_range","git_revwalk_push_ref","git_revwalk_repository","git_revwalk_reset","git_revwalk_simplify_first_parent","git_revwalk_sorting"]],["signature",["git_signature_default","git_signature_dup","git_signature_free","git_signature_new","git_signature_now"]],["smart",["git_smart_subtransport_git","git_smart_subtransport_http","git_smart_subtransport_ssh"]],["stash",["git_stash_apply","git_stash_apply_init_options","git_stash_drop","git_stash_foreach","git_stash_pop"]],["status",["git_status_byindex","git_status_file","git_status_foreach","git_status_foreach_ext","git_status_init_options","git_status_list_entrycount","git_status_list_free","git_status_list_get_perfdata","git_status_list_new","git_status_should_ignore"]],["strarray",["git_strarray_copy","git_strarray_free"]],["submodule",["git_submodule_add_finalize","git_submodule_add_setup","git_submodule_add_to_index","git_submodule_branch","git_submodule_fetch_recurse_submodules","git_submodule_foreach","git_submodule_free","git_submodule_head_id","git_submodule_ignore","git_submodule_index_id","git_submodule_init","git_submodule_location","git_submodule_lookup","git_submodule_name","git_submodule_open","git_submodule_owner","git_submodule_path","git_submodule_reload","git_submodule_repo_init","git_submodule_resolve_url","git_submodule_set_branch","git_submodule_set_fetch_recurse_submodules","git_submodule_set_ignore","git_submodule_set_update","git_submodule_set_url","git_submodule_status","git_submodule_sync","git_submodule_update","git_submodule_update_init_options","git_submodule_update_strategy","git_submodule_url","git_submodule_wd_id"]],["tag",["git_tag_annotation_create","git_tag_create","git_tag_create_frombuffer","git_tag_create_lightweight","git_tag_delete","git_tag_foreach","git_tag_free","git_tag_id","git_tag_list","git_tag_list_match","git_tag_lookup","git_tag_lookup_prefix","git_tag_message","git_tag_name","git_tag_owner","git_tag_peel","git_tag_tagger","git_tag_target","git_tag_target_id","git_tag_target_type"]],["trace",["git_trace_set"]],["transport",["git_transport_dummy","git_transport_init","git_transport_local","git_transport_new","git_transport_smart","git_transport_ssh_with_paths","git_transport_unregister"]],["tree",["git_tree_entry_byid","git_tree_entry_byindex","git_tree_entry_byname","git_tree_entry_bypath","git_tree_entry_cmp","git_tree_entry_dup","git_tree_entry_filemode","git_tree_entry_filemode_raw","git_tree_entry_free","git_tree_entry_id","git_tree_entry_name","git_tree_entry_to_object","git_tree_entry_type","git_tree_entrycount","git_tree_free","git_tree_id","git_tree_lookup","git_tree_lookup_prefix","git_tree_owner","git_tree_walk"]],["treebuilder",["git_treebuilder_clear","git_treebuilder_entrycount","git_treebuilder_filter","git_treebuilder_free","git_treebuilder_get","git_treebuilder_insert","git_treebuilder_new","git_treebuilder_remove","git_treebuilder_write"]]],"examples":[["add.c","ex/v0.23.0/add.html"],["blame.c","ex/v0.23.0/blame.html"],["cat-file.c","ex/v0.23.0/cat-file.html"],["common.c","ex/v0.23.0/common.html"],["describe.c","ex/v0.23.0/describe.html"],["diff.c","ex/v0.23.0/diff.html"],["for-each-ref.c","ex/v0.23.0/for-each-ref.html"],["general.c","ex/v0.23.0/general.html"],["init.c","ex/v0.23.0/init.html"],["log.c","ex/v0.23.0/log.html"],["network/clone.c","ex/v0.23.0/network/clone.html"],["network/common.c","ex/v0.23.0/network/common.html"],["network/fetch.c","ex/v0.23.0/network/fetch.html"],["network/git2.c","ex/v0.23.0/network/git2.html"],["network/index-pack.c","ex/v0.23.0/network/index-pack.html"],["network/ls-remote.c","ex/v0.23.0/network/ls-remote.html"],["remote.c","ex/v0.23.0/remote.html"],["rev-list.c","ex/v0.23.0/rev-list.html"],["rev-parse.c","ex/v0.23.0/rev-parse.html"],["showindex.c","ex/v0.23.0/showindex.html"],["status.c","ex/v0.23.0/status.html"],["tag.c","ex/v0.23.0/tag.html"]]} diff --git a/generate/scripts/generateJson.js b/generate/scripts/generateJson.js index 611be7b308..49a2795c2d 100644 --- a/generate/scripts/generateJson.js +++ b/generate/scripts/generateJson.js @@ -1,10 +1,8 @@ -const fs = require("fs"); const path = require("path"); const utils = require("./utils"); var _; -var version = require("../../package.json").vendorDependencies.libgit2.version; -var libgit2 = require("../input/v" + version + ".json"); +var libgit2 = require("../input/libgit2-docs.json"); var descriptor = require("../input/descriptor.json"); var supplement = require("../input/libgit2-supplement.json"); @@ -46,8 +44,13 @@ module.exports = function generateJson() { !~supplement.remove[groupName].functions.indexOf(fnName); }); + // If we've already found some functions for this group lets add the new + // ones we found instead of overwriting the old ones + if (memo[groupName]) { + memo[groupName] = memo[groupName].concat(functionNames); + } // if we have an empty group then just ignore it - if (functionNames.length) { + else if (functionNames.length) { memo[groupName] = functionNames; } @@ -166,9 +169,18 @@ module.exports = function generateJson() { } }; + var addSelfReferentialField = function(prop){ + if (helpers.isSelfReferential(prop.type)) { + prop.isSelfReferential = true; + def.isExtendedStruct = true; + } + }; + def.fields.forEach(addDependencies); + def.fields.forEach(addSelfReferentialField); def.functions.forEach(addDependencies); + Object.keys(dependencies).forEach(function (dependencyFilename) { def.dependencies.push("../include/" + dependencyFilename + ".h"); }); @@ -180,7 +192,6 @@ module.exports = function generateJson() { fn.cppClassName = def.cppClassName; }); }); - // Process enums _(enums).forEach(function(enumerable) { output.some(function(obj) { @@ -219,7 +230,7 @@ module.exports = function generateJson() { _.merge(enumerable, _.omit(override, ["values"])); output.push(enumerable); - }).value(); + }); output = _.sortBy(output, "typeName"); @@ -228,8 +239,7 @@ module.exports = function generateJson() { } - utils.writeFile("output/idefs.json", output); - + utils.writeLocalFile("output/idefs.json", output); }; if (require.main === module) { diff --git a/generate/scripts/generateMissingTests.js b/generate/scripts/generateMissingTests.js index 0a89c7bd8f..29b6474b3e 100644 --- a/generate/scripts/generateMissingTests.js +++ b/generate/scripts/generateMissingTests.js @@ -1,7 +1,4 @@ const path = require("path"); -const Promise = require("nodegit-promise"); -const promisify = require("promisify-node"); -const fse = promisify(require("fs-extra")); const utils = require("./utils"); const testFilesPath = "../test/tests"; @@ -15,7 +12,7 @@ module.exports = function generateMissingTests() { var testFilePath = path.join(testFilesPath, idef.filename + ".js"); var result = {}; - var file = utils.readFile(testFilePath); + var file = utils.readLocalFile(testFilePath); if (file) { var fieldsResult = []; var functionsResult = []; @@ -61,7 +58,7 @@ module.exports = function generateMissingTests() { Promise.all(promises).then( function() { - utils.writeFile("output/missing-tests.json", output); + utils.writeLocalFile("/output/missing-tests.json", output); }, function(fail) { console.error(fail); diff --git a/generate/scripts/generateNativeCode.js b/generate/scripts/generateNativeCode.js index a8efec20d7..44fb21dec5 100644 --- a/generate/scripts/generateNativeCode.js +++ b/generate/scripts/generateNativeCode.js @@ -1,10 +1,7 @@ const path = require("path"); -const promisify = require("promisify-node"); -const fse = promisify(require("fs-extra")); -const exec = promisify(function(command, opts, callback) { - return require("child_process").exec(command, opts, callback); -}); - +const fse = require("fs-extra"); +const os = require('os'); +const exec = require('../../utils/execPromise'); const utils = require("./utils"); module.exports = function generateNativeCode() { @@ -27,36 +24,45 @@ module.exports = function generateNativeCode() { }; var partials = { - asyncFunction: utils.readFile("templates/partials/async_function.cc"), - callbackHelpers: utils.readFile("templates/partials/callback_helpers.cc"), - convertFromV8: utils.readFile("templates/partials/convert_from_v8.cc"), - convertToV8: utils.readFile("templates/partials/convert_to_v8.cc"), - doc: utils.readFile("templates/partials/doc.cc"), - fields: utils.readFile("templates/partials/fields.cc"), - guardArguments: utils.readFile("templates/partials/guard_arguments.cc"), - syncFunction: utils.readFile("templates/partials/sync_function.cc"), - fieldAccessors: utils.readFile("templates/partials/field_accessors.cc") + asyncFunction: utils.readLocalFile("templates/partials/async_function.cc"), + callbackHelpers: utils.readLocalFile("templates/partials/callback_helpers.cc"), + configurableCallbacks: utils.readLocalFile("templates/partials/configurable_callbacks.cc"), + convertFromV8: utils.readLocalFile("templates/partials/convert_from_v8.cc"), + convertToV8: utils.readLocalFile("templates/partials/convert_to_v8.cc"), + doc: utils.readLocalFile("templates/partials/doc.cc"), + fields: utils.readLocalFile("templates/partials/fields.cc"), + guardArguments: utils.readLocalFile("templates/partials/guard_arguments.cc"), + syncFunction: utils.readLocalFile("templates/partials/sync_function.cc"), + fieldAccessors: utils.readLocalFile("templates/partials/field_accessors.cc"), + traits: utils.readLocalFile("templates/partials/traits.h") }; var templates = { - class_content: utils.readFile("templates/templates/class_content.cc"), - struct_content: utils.readFile("templates/templates/struct_content.cc"), - class_header: utils.readFile("templates/templates/class_header.h"), - struct_header: utils.readFile("templates/templates/struct_header.h"), - binding: utils.readFile("templates/templates/binding.gyp"), - nodegitCC: utils.readFile("templates/templates/nodegit.cc"), - nodegitJS: utils.readFile("templates/templates/nodegit.js"), - enums: utils.readFile("templates/templates/enums.js") + class_content: utils.readLocalFile("templates/templates/class_content.cc"), + struct_content: utils.readLocalFile("templates/templates/struct_content.cc"), + class_header: utils.readLocalFile("templates/templates/class_header.h"), + struct_header: utils.readLocalFile("templates/templates/struct_header.h"), + binding: utils.readLocalFile("templates/templates/binding.gyp"), + nodegitCC: utils.readLocalFile("templates/templates/nodegit.cc"), + nodegitJS: utils.readLocalFile("templates/templates/nodegit.js"), + enums: utils.readLocalFile("templates/templates/enums.js") }; var filters = { and: require("../templates/filters/and"), argsInfo: require("../templates/filters/args_info"), + arrayTypeToPlainType: require("../templates/filters/array_type_to_plain_type"), + asElementPointer: require("../templates/filters/as_element_pointer"), + callbackArgsInfo: require("../templates/filters/callback_args_info"), + callbackArgsCount: require("../templates/filters/callback_args_count"), cppToV8: require("../templates/filters/cpp_to_v8"), defaultValue: require("../templates/filters/default_value"), fieldsInfo: require("../templates/filters/fields_info"), + getCPPFunctionForRootProto: require("../templates/filters/get_cpp_function_for_root_proto"), + hasFunctionOnRootProto: require("../templates/filters/has_function_on_root_proto"), hasReturnType: require("../templates/filters/has_return_type"), hasReturnValue: require("../templates/filters/has_return_value"), + isArrayType: require("../templates/filters/is_array_type"), isDoublePointer: require("../templates/filters/is_double_pointer"), isFixedLengthString: require("../templates/filters/is_fixed_length_string"), isOid: require("../templates/filters/is_oid"), @@ -69,8 +75,13 @@ module.exports = function generateNativeCode() { replace: require("../templates/filters/replace"), returnsCount: require("../templates/filters/returns_count"), returnsInfo: require("../templates/filters/returns_info"), + subtract: require("../templates/filters/subtract"), + thisInfo: require("../templates/filters/this_info"), titleCase: require("../templates/filters/title_case"), + toBool: require('../templates/filters/to_bool'), + toSizeOfArray: require("../templates/filters/to_size_of_array"), unPointer: require("../templates/filters/un_pointer"), + setUnsigned: require("../templates/filters/unsigned"), upper: require("../templates/filters/upper") }; @@ -86,7 +97,9 @@ module.exports = function generateNativeCode() { // Attach all partials to select templates. Object.keys(partials).forEach(function(partial) { + templates.class_header.registerPartial(partial, combyne(partials[partial])); templates.class_content.registerPartial(partial, combyne(partials[partial])); + templates.struct_header.registerPartial(partial, combyne(partials[partial])); templates.struct_content.registerPartial(partial, combyne(partials[partial])); }); @@ -98,45 +111,63 @@ module.exports = function generateNativeCode() { return !idef.ignore; }); + const tempDirPath = path.join(os.tmpdir(), 'nodegit_build'); + const tempSrcDirPath = path.join(tempDirPath, "src"); + const tempIncludeDirPath = path.join(tempDirPath, "include"); + + const finalSrcDirPath = path.join(__dirname, '../../src'); + const finalIncludeDirPath = path.join(__dirname, '../../include'); - fse.remove(path.resolve(__dirname, "../../src")).then(function() { - return fse.remove(path.resolve(__dirname, "../../include")); + fse.remove(tempDirPath).then(function() { + return fse.copy(path.resolve(__dirname, "../templates/manual/include"), tempIncludeDirPath); }).then(function() { - return fse.copy(path.resolve(__dirname, "../templates/manual/"), path.resolve(__dirname, "../../")); + return fse.copy(path.resolve(__dirname, "../templates/manual/src"), tempSrcDirPath); }).then(function() { // Write out single purpose templates. - utils.writeFile("../binding.gyp", beautify(templates.binding.render(enabled))); - utils.writeFile("../src/nodegit.cc", templates.nodegitCC.render(enabled)); - utils.writeFile("../lib/nodegit.js", beautify(templates.nodegitJS.render(enabled))); + utils.writeLocalFile("../binding.gyp", beautify(templates.binding.render(enabled)), "binding.gyp"); + utils.writeFile(path.join(tempSrcDirPath, "nodegit.cc"), templates.nodegitCC.render(enabled), "nodegit.cc"); + utils.writeLocalFile("../lib/nodegit.js", beautify(templates.nodegitJS.render(enabled)), "nodegit.js"); // Write out all the classes. enabled.forEach(function(idef) { if (idef.type && idef.type != "enum") { utils.writeFile( - "../src/" + idef.filename + ".cc", templates[idef.type + "_content"].render(idef) + path.join(tempSrcDirPath, idef.filename + ".cc"), + templates[idef.type + "_content"].render(idef), + idef.type + "_content.cc" ); + utils.writeFile( - "../include/" + idef.filename + ".h", templates[idef.type + "_header"].render(idef) + path.join(tempIncludeDirPath, idef.filename + ".h"), + templates[idef.type + "_header"].render(idef), + idef.type + "_header.h" ); } }); - utils.writeFile("../lib/enums.js", beautify(templates.enums.render(enabled))); + utils.writeLocalFile("../lib/enums.js", beautify(templates.enums.render(enabled)), "enums.js"); }).then(function() { return exec("command -v astyle").then(function(astyle) { if (astyle) { return exec( "astyle --options=\".astylerc\" " - + path.resolve(__dirname, "../../src") + "/*.cc " - + path.resolve(__dirname, "../../include") + "/*.h" + + tempSrcDirPath + "/*.cc " + + tempIncludeDirPath + "/*.h" ).then(function() { return exec( "rm " - + path.resolve(__dirname, "../../src") + "/*.cc.orig " - + path.resolve(__dirname, "../../include") + "/*.h.orig " + + tempSrcDirPath + "/*.cc.orig " + + tempIncludeDirPath + "/*.h.orig " ); }); } }, function() {}) + }).then(function() { + return Promise.all([ + utils.syncDirs(tempSrcDirPath, finalSrcDirPath), + utils.syncDirs(tempIncludeDirPath, finalIncludeDirPath), + ]); + }).then(function() { + return fse.remove(tempDirPath); }).catch(console.log); }; diff --git a/generate/scripts/helpers.js b/generate/scripts/helpers.js index 48bfdaff43..e278e1cc05 100644 --- a/generate/scripts/helpers.js +++ b/generate/scripts/helpers.js @@ -1,14 +1,15 @@ - -var callbackTypePattern = /\s*_cb/; +var callbackTypePattern = /\s*_(cb|fn)/, + selfReferentialTypePattern = /\s*_fn/; var utils = require("./utils"); var _ = require("lodash"); +var path = require("path"); +var fs = require("fs"); // TODO: When libgit2's docs include callbacks we should be able to remove this -var version = require("../../package.json").vendorDependencies.libgit2.version; var callbackDefs = require("../input/callbacks.json"); var descriptor = require("../input/descriptor.json"); -var libgit2 = require("../input/v" + version + ".json"); +var libgit2 = require("../input/libgit2-docs.json"); var cTypes = libgit2.groups.map(function(group) { return group[0];}); @@ -22,7 +23,10 @@ var cTypeMappings = { "size_t": "Number", "uint16_t": "Number", "uint32_t": "Number", - "uint64_t": "Number" + "uint64_t": "Number", + "double": "Number", + "git_object_size_t": "Number", + "git_time_t": "Number", } var collisionMappings = { @@ -38,6 +42,7 @@ var Helpers = { .replace("struct", "") .replace(utils.doublePointerRegex, "") .replace(utils.pointerRegex, "") + .replace(utils.arrayTypeRegex, "") .trim(); }, @@ -66,15 +71,23 @@ var Helpers = { }, isConstructorFunction: function(cType, fnName) { - var initFnName = cType.split('_'); + var deprecatedInitFnName = cType.split("_"); + deprecatedInitFnName.splice(-1, 0, "init"); + deprecatedInitFnName = deprecatedInitFnName.join("_"); - initFnName.splice(-1, 0, "init"); - initFnName = initFnName.join('_'); + var initFnName = cType + "_init"; - return initFnName === fnName; + return initFnName === fnName || deprecatedInitFnName === fnName; }, hasConstructor: function(type, normalizedType) { + if (normalizedType && descriptor.types[normalizedType.substr(4)]) { + var descriptorEntry = descriptor.types[normalizedType.substr(4)]; + if (descriptorEntry.hasOwnProperty('hasConstructor')) { + return descriptorEntry.hasConstructor; + } + } + return type.used && type.used.needs && type.used.needs.some(function (fnName) { @@ -82,8 +95,8 @@ var Helpers = { }); }, - isCallbackFunction: function(cType) { - return callbackTypePattern.test(cType); + isCallbackFunction: function(cType, isCallback) { + return isCallback === true || callbackTypePattern.test(cType); }, isPayloadFor: function(cbField, payloadName) { @@ -92,6 +105,10 @@ var Helpers = { && ~cbField.name.indexOf(payloadName.replace("_payload", "")); }, + isSelfReferential: function(cType){ + return selfReferentialTypePattern.test(cType); + }, + getLibgitType: function(normalizedType, types) { var libgitType; @@ -108,8 +125,9 @@ var Helpers = { processCallback: function(field) { field.isCallbackFunction = true; - if (callbackDefs[field.type]) { - _.merge(field, callbackDefs[field.type]); + var callbackDef = callbackDefs[field.type] || callbackDefs[field.cType]; + if (callbackDef) { + _.merge(field, callbackDef); } else { if (process.env.BUILD_ONLY) { @@ -141,6 +159,7 @@ var Helpers = { } }, + // returns the libgittype found in types decorateLibgitType: function(type, types, enums) { var normalizedType = Helpers.normalizeCtype(type.cType); var libgitType = Helpers.getLibgitType(normalizedType, types); @@ -148,7 +167,9 @@ var Helpers = { if (libgitType) { type.isLibgitType = true; type.isEnum = libgitType.type === "enum"; - type.hasConstructor = Helpers.hasConstructor(type, normalizedType); + type.hasConstructor = Helpers.hasConstructor(libgitType, normalizedType); + type.isClassType = !type.isEnum && !type.hasConstructor; + type.isStructType = !type.isEnum && !!type.hasConstructor; // there are no enums at the struct level currently, but we still need to override function args if (type.isEnum) { @@ -159,9 +180,13 @@ var Helpers = { } } + type.freeFunctionName = libgitType.freeFunctionName; + // we don't want to overwrite the c type of the passed in type _.merge(type, descriptor.types[normalizedType.replace("git_", "")] || {}, { cType: type.cType }); } + + return libgitType; }, decoratePrimaryType: function(typeDef, enums) { @@ -174,6 +199,13 @@ var Helpers = { typeDef.filename = typeDef.typeName; typeDef.isLibgitType = true; typeDef.dependencies = []; + typeDef.selfFreeing = Boolean(typeDefOverrides.selfFreeing); + + if (typeDefOverrides.freeFunctionName) { + typeDef.freeFunctionName = typeDefOverrides.freeFunctionName; + } else if (typeDef.type === 'struct') { + typeDef.freeFunctionName = 'free'; + } typeDef.fields = typeDef.fields || []; typeDef.fields.forEach(function (field, index, allFields) { @@ -209,8 +241,9 @@ var Helpers = { field.jsFunctionName = utils.camelCase(field.name); field.cppClassName = Helpers.cTypeToCppName(field.type); field.jsClassName = utils.titleCase(Helpers.cTypeToJsName(field.type)); + field.ownedByThis = true; - if (Helpers.isCallbackFunction(field.cType)) { + if (Helpers.isCallbackFunction(field.cType, field.isCallback)) { Helpers.processCallback(field); var argOverrides = fieldOverrides.args || {}; @@ -232,7 +265,7 @@ var Helpers = { }, decorateArg: function(arg, allArgs, typeDef, fnDef, argOverrides, enums) { - var type = arg.cType || arg.type; + var type = argOverrides.cType || argOverrides.type || arg.cType || arg.type; var normalizedType = Helpers.normalizeCtype(type); arg.cType = type; @@ -261,8 +294,13 @@ var Helpers = { // itself and determine if this function goes on the prototype // or is a constructor method. arg.isReturn = arg.name === "out" || (utils.isDoublePointer(arg.type) && normalizedType == typeDef.cType); - arg.isSelf = utils.isPointer(arg.type) && normalizedType == typeDef.cType; - + if (typeof arg.isSelf == 'undefined') { + arg.isSelf = utils.isPointer(arg.type) && + normalizedType == typeDef.cType && + arg.cppClassName !== "Array" && + argOverrides.cppClassName !== "Array" && + _.every(allArgs, function(_arg) { return !_arg.isSelf; }); + } if (arg.isReturn && fnDef.return && fnDef.return.type === "int") { fnDef.return.isErrorCode = true; fnDef.isAsync = true; @@ -288,13 +326,11 @@ var Helpers = { // available if (key == typeDef.cType + "_free") { typeDef.freeFunctionName = key; - //fnDef.ignore = true; - //return; } fnDef.cppFunctionName = Helpers.cTypeToCppName(key, "git_" + typeDef.typeName); fnDef.jsFunctionName = Helpers.cTypeToJsName(key, "git_" + typeDef.typeName); - //fnDef.isAsync = false; // until proven otherwise + fnDef.jsClassName = typeDef.jsClassName; if (fnDef.cppFunctionName == typeDef.cppClassName) { fnDef.cppFunctionName = fnDef.cppFunctionName.replace("Git", ""); @@ -310,6 +346,10 @@ var Helpers = { } }); + if (fnDef.cFile) { + fnDef.implementation = fs.readFileSync(path.resolve(fnDef.cFile), 'utf8'); + } + if (fnDef.return) { Helpers.decorateArg(fnDef.return, fnDef.args, typeDef, fnDef, fnOverrides.return || {}, enums); } @@ -322,7 +362,7 @@ var Helpers = { if (fnDef.jsFunctionName == utils.camelCase(collidingName)) { fnDef.jsFunctionName = utils.camelCase(newName); } - }).value(); + }); if ("git_" + typeDef.typeName == fnDef.cFunctionName) { fnDef.useAsOnRootProto = true; diff --git a/generate/scripts/utils.js b/generate/scripts/utils.js index 3395fe272f..c6e843134a 100644 --- a/generate/scripts/utils.js +++ b/generate/scripts/utils.js @@ -1,5 +1,6 @@ -const promisify = require("promisify-node"); const fse = require("fs-extra"); +const walk = require("walk"); +const _ = require('lodash'); const fs = require("fs"); const path = require("path"); @@ -8,27 +9,44 @@ const path = require("path"); var local = path.join.bind(null, __dirname, "../"); var util = { + arrayTypeRegex: /\[\d*\]\s*/, pointerRegex: /\s*\*\s*/, doublePointerRegex: /\s*\*\*\s*/, - readFile: function(file) { + readLocalFile: function(filePath) { + return util.readFile(local(filePath)); + }, + + readFile: function(filePath) { try { - return fs.readFileSync(local(file)).toString(); + return fs.readFileSync(filePath).toString(); } catch (unhandledException) { return ""; } }, - writeFile: function(file, content) { + writeLocalFile: function(filePath, content, header) { + return util.writeFile(local(filePath), content, header); + }, + + writeFile: function(filePath, content, header) { try { - var file = local(file); if (typeof content == "object") { content = JSON.stringify(content, null, 2) } - fse.ensureFileSync(file); - fse.writeFileSync(file, content); + if (header) { + var commentPrefix = ~header.indexOf('.gyp') ? '#' : '//' + content = commentPrefix + + " This is a generated file, modify: generate/templates/templates/" + + header + + "\n\n" + + content; + } + + fse.ensureFileSync(filePath); + fse.writeFileSync(filePath, content); return true; } catch (exception) { @@ -46,12 +64,51 @@ var util = { }).join(""); }, - camelCase: function(str) { - return str.split(/_|\//).map(function(val, index) { - return (index >= 1 - ? val[0].toUpperCase() + val.slice(1) - : val[0].toLowerCase() + val.slice(1)); - }).join(""); + camelCase: _.camelCase, + + getFilePathsRelativeToDir: function(dir) { + const files = []; + const walker = walk.walk(dir, { followLinks: false }); + if (!util.isDirectory(dir)) { + return Promise.resolve([]); + } + + return new Promise(function(resolve, reject) { + walker.on('file', function(root, stat, next) { + files.push(path.relative(dir, path.join(root, stat.name))); + next(); + }); + + walker.on('end', function() { + resolve(files); + }); + + walker.on('errors', function() { + reject(); + }); + }); + }, + + isFile: function(path) { + var isFile; + try { + isFile = fse.statSync(path).isFile(); + } catch(e) { + isFile = false; + } + + return isFile; + }, + + isDirectory: function(path) { + var isDirectory; + try { + isDirectory = fse.statSync(path).isDirectory(); + } catch(e) { + isDirectory = false; + } + + return isDirectory; }, isPointer: function(type) { @@ -60,8 +117,39 @@ var util = { isDoublePointer: function(type) { return util.doublePointerRegex.test(type); - } + }, + + syncDirs: function(fromDir, toDir) { + let toFilePaths; + let fromFilePaths; + return Promise.all([ + util.getFilePathsRelativeToDir(toDir), + util.getFilePathsRelativeToDir(fromDir) + ]) + .then(function(filePaths) { + toFilePaths = filePaths[0]; + fromFilePaths = filePaths[1]; + // Delete files that aren't in fromDir + return Promise.all(toFilePaths.map(function(filePath) { + if (!util.isFile(path.join(fromDir, filePath))) { + return fse.remove(path.join(toDir, filePath)); + } + return Promise.resolve(); + })); + }) + .then(function() { + // Copy files that don't exist in toDir or have different contents + return Promise.all(fromFilePaths.map(function(filePath) { + const toFilePath = path.join(toDir, filePath); + const fromFilePath = path.join(fromDir, filePath); + if (!util.isFile(toFilePath) || util.readFile(toFilePath) !== util.readFile(fromFilePath)) { + return fse.copy(fromFilePath, toFilePath); + } + return Promise.resolve(); + })); + }); + } }; module.exports = util; diff --git a/generate/templates/README.md b/generate/templates/README.md new file mode 100644 index 0000000000..ee8b1f70c5 --- /dev/null +++ b/generate/templates/README.md @@ -0,0 +1,35 @@ +# Manual templates + + Manual templates override generated code from nodegit while generating source code. They really should be avoid untill absolutely necessary. + +## Why? + + #### 1. Performance + > Everytime the library switches between C land and the javascript thread, there is a penalty in performance. If in practice the usage of a method in libgit2 requires crossing the c/javascript boundary frequently, it might be better option to use manual templates. An example being ```Revwalk::FastWalk```. + + #### 2. Saftey + > The generated code sometimes does not handle structures that are interdependent. An example would be ```git_patch``` and ```git_diff```. A ```git_patch```'s memory is owned by ```git_diff```, and that includes all of the children of ```git_patch```, as well. So a ```git_diff_hunk```, ```git_diff_line```, and ```git_patch``` all are owned by a ```git_diff```, and when that ```git_diff``` is deleted, all the memory for any patches, hunks, or lines that are in use as NodeGitWrappers are now corrupted. Further, a ```git_diff``` keeps a file handle open for its entire lifespan, which can lead to NodeGit holding onto file locks in Windows. Due to both of these compounding issues, we wrote manual templates to shift ownership away from a ```git_diff``` to ```git_patch```, ```git_diff_hunk```, and ```git_diff_line``` and also shorten the lifespan of a diff. + + #### 3. Odd cases + > If a new pattern exists in libgit that would be difficult to implement using generated code, manual templates can be used for one-off cases. Typically generated code takes care of most patterns seen in libgit, but if function signatures do not follow typical pattern, manual templates could be used. Example: ```git_filter``` and ```git_remote_ls```. + +
+----- +## Implementing manual templates + +#### 1. Write manual .cc and .h files to *generate/templates/manual/* + *.cc files -> /generate/templates/manual/src/ + *.h files -> /generate/templates/manual/include/ + +#### 2. Remove all references from /generate configuration files + +#### 3. Add references to binding.gyp template + location: /generate/templates/templates/binding.gyp + +#### 4. Add headers to nodegit.cc template + location: /generate/templates/templates/nodegit.cc + +#### 5. Add new wrapper to nodegit.js template + use rawApi.ManualWrapper reference to add _ManualWrapper + add any js wrapper (if any) via importExtension + diff --git a/generate/templates/filters/args_info.js b/generate/templates/filters/args_info.js index e2fe799d79..55270102d1 100644 --- a/generate/templates/filters/args_info.js +++ b/generate/templates/filters/args_info.js @@ -1,3 +1,11 @@ +var bannedCppClassNames = [ + "Buffer", + "Function", + "GitBuf", + "GitStrarray", + "Wrapper" +]; + module.exports = function(args) { var result = [], cArg, @@ -13,15 +21,15 @@ module.exports = function(args) { jsArg++; } - if (cArg === args.length -1) { - arg.lastArg = true; - } - else { - arg.lastArg = false; - } + arg.lastArg = cArg === args.length - 1; + arg.firstArg = !arg.lastArg && cArg === 0; arg.cArg = cArg; arg.isCppClassStringOrArray = ~["String", "Array"].indexOf(arg.cppClassName); + arg.isConst = ~arg.cType.indexOf("const "); + + arg.isUnwrappable = !arg.isStructType && arg.isLibgitType && !arg.isEnum && + !bannedCppClassNames.includes(arg.cppClassName); // if we have a callback then we also need the corresponding payload for that callback if (arg.isCallbackFunction) { diff --git a/generate/templates/filters/array_type_to_plain_type.js b/generate/templates/filters/array_type_to_plain_type.js new file mode 100644 index 0000000000..55f2833500 --- /dev/null +++ b/generate/templates/filters/array_type_to_plain_type.js @@ -0,0 +1,3 @@ +module.exports = function(cType) { + return /(.*)\s\[\d+\]\s*/.exec(cType)[1]; +}; diff --git a/generate/templates/filters/as_element_pointer.js b/generate/templates/filters/as_element_pointer.js new file mode 100644 index 0000000000..8b34eed172 --- /dev/null +++ b/generate/templates/filters/as_element_pointer.js @@ -0,0 +1,7 @@ +const isArrayType = require("./is_array_type"); + +module.exports = function(cType, parsedName) { + return isArrayType(cType) ? + "&" + parsedName + "[i]" : + parsedName; +}; diff --git a/generate/templates/filters/callback_args_count.js b/generate/templates/filters/callback_args_count.js new file mode 100644 index 0000000000..26c7762ead --- /dev/null +++ b/generate/templates/filters/callback_args_count.js @@ -0,0 +1,18 @@ +module.exports = function(args) { + if (!args) { + return 0; + } + + return args.reduce( + function(count, arg) { + var shouldCount = !arg.isReturn && + !arg.isSelf && + arg.name !== "payload" && + arg.name !== "self" && + !arg.ignore; + + return shouldCount ? count + 1 : count; + }, + 0 + ); +}; diff --git a/generate/templates/filters/callback_args_info.js b/generate/templates/filters/callback_args_info.js new file mode 100644 index 0000000000..a7285c0b85 --- /dev/null +++ b/generate/templates/filters/callback_args_info.js @@ -0,0 +1,27 @@ +module.exports = function(args) { + var result = args.reduce( + function(argList, arg) { + var useArg = !arg.isReturn && + !arg.isSelf && + arg.name !== "payload" && + arg.name !== "self" && + !arg.ignore; + + if (!useArg) { + return argList; + } + + arg.firstArg = argList.length === 0; + argList.push(arg); + + return argList; + }, + [] + ); + + if (result.length) { + result[result.length - 1].lastArg = true; + } + + return result; +}; diff --git a/generate/templates/filters/fields_info.js b/generate/templates/filters/fields_info.js index 8ec8a930b1..6022aab127 100644 --- a/generate/templates/filters/fields_info.js +++ b/generate/templates/filters/fields_info.js @@ -1,14 +1,26 @@ +var bannedCppClassNames = [ + "Buffer", + "Function", + "GitBuf", + "GitStrarray", + "Wrapper" +]; + module.exports = function(fields) { var result = []; - fields.forEach(function (field){ + fields.forEach(function (field, index){ var fieldInfo = {}; fieldInfo.__proto__ = field; + fieldInfo.index = index; fieldInfo.parsedName = field.name || "result"; fieldInfo.isCppClassIntType = ~["Uint32", "Int32"].indexOf(field.cppClassName); fieldInfo.parsedClassName = (field.cppClassName || '').toLowerCase() + "_t"; + fieldInfo.hasOwner = !fieldInfo.selfOwned && !!fieldInfo.ownedByThis; + fieldInfo.isUnwrappable = fieldInfo.isLibgitType && !fieldInfo.isEnum && + !bannedCppClassNames.includes(fieldInfo.cppClassName); result.push(fieldInfo); }); diff --git a/generate/templates/filters/get_cpp_function_for_root_proto.js b/generate/templates/filters/get_cpp_function_for_root_proto.js new file mode 100644 index 0000000000..6571af880a --- /dev/null +++ b/generate/templates/filters/get_cpp_function_for_root_proto.js @@ -0,0 +1,12 @@ +module.exports = function(functions) { + if (!functions || functions.length === 0) { + throw new Error("Should not be able to get function from empty function list"); + } + + const fun = functions.find(function(f) { return f.useAsOnRootProto; }); + if (!fun) { + throw new Error("There is no function on the root prototype for this collection"); + } + + return fun.cppFunctionName; +}; diff --git a/generate/templates/filters/has_function_on_root_proto.js b/generate/templates/filters/has_function_on_root_proto.js new file mode 100644 index 0000000000..626ce0ff65 --- /dev/null +++ b/generate/templates/filters/has_function_on_root_proto.js @@ -0,0 +1,7 @@ +module.exports = function(functions) { + if (!functions || functions.length === 0) { + return false; + } + + return functions.some(function(f) { return f.useAsOnRootProto; }); +}; diff --git a/generate/templates/filters/is_array_type.js b/generate/templates/filters/is_array_type.js new file mode 100644 index 0000000000..d633d9e407 --- /dev/null +++ b/generate/templates/filters/is_array_type.js @@ -0,0 +1,3 @@ +module.exports = function(cType) { + return /\s\[\d+\]\s*/.test(cType); +}; diff --git a/generate/templates/filters/js_args_count.js b/generate/templates/filters/js_args_count.js index 5be437f417..17a56a1c11 100644 --- a/generate/templates/filters/js_args_count.js +++ b/generate/templates/filters/js_args_count.js @@ -5,11 +5,11 @@ module.exports = function(args) { if (!args) { return 0; } - + for(cArg = 0, jsArg = 0; cArg < args.length; cArg++) { var arg = args[cArg]; - if (!arg.isReturn && !arg.isSelf && !arg.isPayload) { + if (!arg.isReturn && !arg.isSelf) { jsArg++; } } diff --git a/generate/templates/filters/returns_info.js b/generate/templates/filters/returns_info.js index 7eaf26e7ad..5f7bcdc08a 100644 --- a/generate/templates/filters/returns_info.js +++ b/generate/templates/filters/returns_info.js @@ -4,6 +4,22 @@ module.exports = function(fn, argReturnsOnly, isAsync) { var result = []; var args = fn.args || []; + // We will use this to figure out the index + // of arguments, because sync functions + // need to respect ownership to an arbitrary + // parameter that is labeled by name in the + // descriptor, and we won't have access to + // any sort of string to argument index + // in the template. + var nameToArgIndex = {}; + var thisArgName = ''; + args.forEach(function (arg, index) { + nameToArgIndex[arg.name] = index; + if (arg.isSelf) { + thisArgName = arg.name; + } + }); + args.forEach(function (arg) { if (!arg.isReturn) return; @@ -11,6 +27,7 @@ module.exports = function(fn, argReturnsOnly, isAsync) { return_info.__proto__ = arg; + return_info.isAsync = isAsync; return_info.parsedName = isAsync ? "baton->" + return_info.name : return_info.name; return_info.isCppClassIntType = ~['Uint32', 'Int32'].indexOf(return_info.cppClassName); return_info.needsDereference @@ -21,6 +38,23 @@ module.exports = function(fn, argReturnsOnly, isAsync) { return_info.returnNameOrName = return_info.returnName || return_info.name; return_info.jsOrCppClassName = return_info.jsClassName || return_info.cppClassName; return_info.isOutParam = true; + return_info.hasOwner = !return_info.selfOwned && + !!(return_info.ownedBy || return_info.ownedByThis || return_info.ownerFn); + return_info.ownedByIndices = []; + + if (isAsync && return_info.ownedByThis) { + return_info.ownedBy = return_info.ownedBy || []; + return_info.ownedBy.unshift(thisArgName); + } + + // Here we convert ownedBy, which is the list of parameter names + // that own this result to the argument index. + // sync functions will need to know this. + if (!isAsync && return_info.ownedBy) { + return_info.ownedBy.forEach(function (argName) { + return_info.ownedByIndices.push(nameToArgIndex[argName]); + }) + } result.push(return_info); }); @@ -33,7 +67,28 @@ module.exports = function(fn, argReturnsOnly, isAsync) { var return_info = {}; return_info.__proto__ = fn.return; - return_info.parsedName = return_info.name && isAsync ? "baton->" + return_info.name : "result"; + + return_info.isAsync = isAsync; + return_info.hasOwner = !return_info.selfOwned && + !!(return_info.ownedBy || return_info.ownedByThis || return_info.ownerFn); + return_info.ownedByIndices = []; + return_info.ownedBy = return_info.ownedBy || []; + + if (return_info.ownedByThis && isAsync) { + return_info.ownedBy.push(thisArgName); + } + + if (!isAsync) { + return_info.ownedByIndices = return_info.ownedBy.map(function (ownerName) { + return nameToArgIndex[ownerName]; + }); + } + + if (isAsync) { + return_info.parsedName = "baton->" + (return_info.name || "result"); + } else { + return_info.parsedName = "result"; + } return_info.isCppClassIntType = ~['Uint32', 'Int32'].indexOf(return_info.cppClassName); return_info.parsedClassName = (return_info.cppClassName || '').toLowerCase() + "_t"; return_info.returnNameOrName = return_info.returnName || return_info.name; diff --git a/generate/templates/filters/subtract.js b/generate/templates/filters/subtract.js new file mode 100644 index 0000000000..6329f2e2cd --- /dev/null +++ b/generate/templates/filters/subtract.js @@ -0,0 +1,3 @@ +module.exports = function(value, other) { + return value - other; +}; diff --git a/generate/templates/filters/this_info.js b/generate/templates/filters/this_info.js new file mode 100644 index 0000000000..e5d57520ab --- /dev/null +++ b/generate/templates/filters/this_info.js @@ -0,0 +1,8 @@ +module.exports = function(args, fieldToRetrieve) { + const thisArg = args.find(arg => arg.isSelf); + if (thisArg) { + return thisArg[fieldToRetrieve]; + } + + return; +}; diff --git a/generate/templates/filters/to_bool.js b/generate/templates/filters/to_bool.js new file mode 100644 index 0000000000..dd6063f287 --- /dev/null +++ b/generate/templates/filters/to_bool.js @@ -0,0 +1,3 @@ +module.exports = function(value) { + return !!value; +}; diff --git a/generate/templates/filters/to_size_of_array.js b/generate/templates/filters/to_size_of_array.js new file mode 100644 index 0000000000..b56e9315fa --- /dev/null +++ b/generate/templates/filters/to_size_of_array.js @@ -0,0 +1,3 @@ +module.exports = function(cType) { + return /\s\[(\d+)\]\s*/.exec(cType)[1]; +}; diff --git a/generate/templates/filters/unsigned.js b/generate/templates/filters/unsigned.js new file mode 100644 index 0000000000..a460783311 --- /dev/null +++ b/generate/templates/filters/unsigned.js @@ -0,0 +1,3 @@ +module.exports = function(value) { + return value < 0 ? 0 : value; +}; diff --git a/generate/templates/manual/clone/clone.cc b/generate/templates/manual/clone/clone.cc new file mode 100644 index 0000000000..02c47ff58b --- /dev/null +++ b/generate/templates/manual/clone/clone.cc @@ -0,0 +1,210 @@ +// NOTE you may need to occasionally rebuild this method by calling the generators +// if major changes are made to the templates / generator. + +// Due to some file locking issues, we have the need to free a repository after it's cloned. +// We do not expose free functions to javascript, and so, we've moved the implementation of +// cloning, freeing the repo, and opening the repo into a custom template. + +/* + * @param String url + * @param String local_path + * @param CloneOptions options + * @param Repository callback + */ +NAN_METHOD(GitClone::Clone) { + + if (info.Length() == 0 || !info[0]->IsString()) { + return Nan::ThrowError("String url is required."); + } + + if (info.Length() == 1 || !info[1]->IsString()) { + return Nan::ThrowError("String local_path is required."); + } + + if (!info[info.Length() - 1]->IsFunction()) { + return Nan::ThrowError("Callback is required and must be a Function."); + } + + CloneBaton *baton = new CloneBaton(); + nodegit::Context *nodegitContext = reinterpret_cast(info.Data().As()->Value()); + std::map> cleanupHandles; + + if (info[2]->IsNull() || info[2]->IsUndefined()) { + baton->options = nullptr; + } else { + auto conversionResult = ConfigurableGitCloneOptions::fromJavascript(nodegitContext, info[2]); + if (!conversionResult.result) { + return Nan::ThrowError(Nan::New(conversionResult.error).ToLocalChecked()); + } + + auto convertedObject = conversionResult.result; + cleanupHandles["options"] = convertedObject; + baton->options = convertedObject->GetValue(); + } + + baton->error_code = GIT_OK; + baton->error = NULL; + + // start convert_from_v8 block + const char *from_url = NULL; + + Nan::Utf8String url(Nan::To(info[0]).ToLocalChecked()); + // malloc with one extra byte so we can add the terminating null character + // C-strings expect: + from_url = (const char *)malloc(url.length() + 1); + // copy the characters from the nodejs string into our C-string (used instead + // of strdup or strcpy because nulls in the middle of strings are valid coming + // from nodejs): + memcpy((void *)from_url, *url, url.length()); + // ensure the final byte of our new string is null, extra casts added to + // ensure compatibility with various C types used in the nodejs binding + // generation: + memset((void *)(((char *)from_url) + url.length()), 0, 1); + // end convert_from_v8 block + baton->url = from_url; + // start convert_from_v8 block + const char *from_local_path = NULL; + + Nan::Utf8String local_path(Nan::To(info[1]).ToLocalChecked()); + // malloc with one extra byte so we can add the terminating null character + // C-strings expect: + from_local_path = (const char *)malloc(local_path.length() + 1); + // copy the characters from the nodejs string into our C-string (used instead + // of strdup or strcpy because nulls in the middle of strings are valid coming + // from nodejs): + memcpy((void *)from_local_path, *local_path, local_path.length()); + // ensure the final byte of our new string is null, extra casts added to + // ensure compatibility with various C types used in the nodejs binding + // generation: + memset((void *)(((char *)from_local_path) + local_path.length()), 0, 1); + // end convert_from_v8 block + baton->local_path = from_local_path; + + Nan::Callback *callback = + new Nan::Callback(v8::Local::Cast(info[info.Length() - 1])); + CloneWorker *worker = new CloneWorker(baton, callback, cleanupHandles); + + worker->Reference("url", info[0]); + worker->Reference("local_path", info[1]); + + nodegitContext->QueueWorker(worker); + return; +} + +nodegit::LockMaster GitClone::CloneWorker::AcquireLocks() { + nodegit::LockMaster lockMaster( + true, + baton->url, + baton->local_path, + baton->options + ); + return lockMaster; +} + +void GitClone::CloneWorker::Execute() { + git_error_clear(); + + git_repository *repo; + int result = + git_clone(&repo, baton->url, baton->local_path, baton->options); + + if (result == GIT_OK) { + // This is required to clean up after the clone to avoid file locking + // issues in Windows and potentially other issues we don't know about. + git_repository_free(repo); + + // We want to provide a valid repository object, so reopen the repository + // after clone and cleanup. + result = git_repository_open(&baton->out, baton->local_path); + } + + baton->error_code = result; + + if (result != GIT_OK && git_error_last()->klass != GIT_ERROR_NONE) { + baton->error = git_error_dup(git_error_last()); + } +} + +void GitClone::CloneWorker::HandleErrorCallback() { + if (baton->error) { + if (baton->error->message) { + free((void *)baton->error->message); + } + + free((void *)baton->error); + } + + git_repository_free(baton->out); + + free((void*)baton->url); + free((void*)baton->local_path); + + delete baton; +} + +void GitClone::CloneWorker::HandleOKCallback() { + if (baton->error_code == GIT_OK) { + v8::Local to; + // start convert_to_v8 block + + if (baton->out != NULL) { + // GitRepository baton->out + to = GitRepository::New(baton->out, true); + } else { + to = Nan::Null(); + } + + // end convert_to_v8 block + v8::Local result = to; + + v8::Local argv[2] = {Nan::Null(), result}; + callback->Call(2, argv, async_resource); + } else { + if (baton->error) { + v8::Local err; + if (baton->error->message) { + err = Nan::To(Nan::Error(baton->error->message)).ToLocalChecked(); + } else { + err = Nan::To(Nan::Error("Method clone has thrown an error.")).ToLocalChecked(); + } + Nan::Set(err, Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); + Nan::Set(err, Nan::New("errorFunction").ToLocalChecked(), + Nan::New("Clone.clone").ToLocalChecked()); + v8::Local argv[1] = {err}; + callback->Call(1, argv, async_resource); + if (baton->error->message) + free((void *)baton->error->message); + free((void *)baton->error); + } else if (baton->error_code < 0) { + bool callbackFired = false; + if (!callbackErrorHandle.IsEmpty()) { + v8::Local maybeError = Nan::New(callbackErrorHandle); + if (!maybeError->IsNull() && !maybeError->IsUndefined()) { + v8::Local argv[1] = { + maybeError + }; + callback->Call(1, argv, async_resource); + callbackFired = true; + } + } + + if (!callbackFired) { + v8::Local err = + Nan::To(Nan::Error("Method clone has thrown an error.")).ToLocalChecked(); + Nan::Set(err, Nan::New("errno").ToLocalChecked(), + Nan::New(baton->error_code)); + Nan::Set(err, Nan::New("errorFunction").ToLocalChecked(), + Nan::New("Clone.clone").ToLocalChecked()); + v8::Local argv[1] = {err}; + callback->Call(1, argv, async_resource); + } + } else { + callback->Call(0, NULL, async_resource); + } + } + + free((void*)baton->url); + free((void*)baton->local_path); + + delete baton; +} diff --git a/generate/templates/manual/commit/extract_signature.cc b/generate/templates/manual/commit/extract_signature.cc new file mode 100644 index 0000000000..82a2141116 --- /dev/null +++ b/generate/templates/manual/commit/extract_signature.cc @@ -0,0 +1,162 @@ +NAN_METHOD(GitCommit::ExtractSignature) +{ + if (info.Length() == 0 || !info[0]->IsObject()) { + return Nan::ThrowError("Repository repo is required."); + } + + if (info.Length() == 1 || (!info[1]->IsObject() && !info[1]->IsString())) { + return Nan::ThrowError("Oid commit_id is required."); + } + + if (info.Length() >= 4 && !info[2]->IsString() && !info[2]->IsUndefined() && !info[2]->IsNull()) { + return Nan::ThrowError("String signature_field must be a string or undefined/null."); + } + + if (!info[info.Length() - 1]->IsFunction()) { + return Nan::ThrowError("Callback is required and must be a Function."); + } + + ExtractSignatureBaton* baton = new ExtractSignatureBaton(); + + baton->error_code = GIT_OK; + baton->error = NULL; + baton->signature = GIT_BUF_INIT_CONST(NULL, 0); + baton->signed_data = GIT_BUF_INIT_CONST(NULL, 0); + baton->repo = Nan::ObjectWrap::Unwrap(Nan::To(info[0]).ToLocalChecked())->GetValue(); + + // baton->commit_id + if (info[1]->IsString()) { + Nan::Utf8String oidString(Nan::To(info[1]).ToLocalChecked()); + baton->commit_id = (git_oid *)malloc(sizeof(git_oid)); + if (git_oid_fromstr(baton->commit_id, (const char *)strdup(*oidString)) != GIT_OK) { + free(baton->commit_id); + + if (git_error_last()->klass != GIT_ERROR_NONE) { + return Nan::ThrowError(git_error_last()->message); + } else { + return Nan::ThrowError("Unknown Error"); + } + } + } else { + baton->commit_id = Nan::ObjectWrap::Unwrap(Nan::To(info[1]).ToLocalChecked())->GetValue(); + } + + // baton->field + if (info[2]->IsString()) { + Nan::Utf8String field(Nan::To(info[2]).ToLocalChecked()); + baton->field = (char *)malloc(field.length() + 1); + memcpy((void *)baton->field, *field, field.length()); + baton->field[field.length()] = 0; + } else { + baton->field = NULL; + } + + Nan::Callback *callback = new Nan::Callback(Local::Cast(info[info.Length() - 1])); + + std::map> cleanupHandles; + ExtractSignatureWorker *worker = new ExtractSignatureWorker(baton, callback, cleanupHandles); + worker->Reference("repo", info[0]); + worker->Reference("commit_id", info[1]); + nodegit::Context *nodegitContext = reinterpret_cast(info.Data().As()->Value()); + nodegitContext->QueueWorker(worker); + return; +} + +nodegit::LockMaster GitCommit::ExtractSignatureWorker::AcquireLocks() { + nodegit::LockMaster lockMaster(true, baton->repo); + return lockMaster; +} + +void GitCommit::ExtractSignatureWorker::Execute() +{ + git_error_clear(); + + baton->error_code = git_commit_extract_signature( + &baton->signature, + &baton->signed_data, + baton->repo, + baton->commit_id, + (const char *)baton->field + ); + + if (baton->error_code != GIT_OK) { + baton->error = git_error_dup(git_error_last()); + } +} + +void GitCommit::ExtractSignatureWorker::HandleErrorCallback() { + if (baton->error) { + if (baton->error->message) { + free((void *)baton->error->message); + } + + free((void *)baton->error); + } + + git_buf_dispose(&baton->signature); + git_buf_dispose(&baton->signed_data); + + free(baton->field); + + delete baton; +} + +void GitCommit::ExtractSignatureWorker::HandleOKCallback() +{ + if (baton->error_code == GIT_OK) + { + Local result = Nan::New(); + Nan::Set( + result, + Nan::New("signature").ToLocalChecked(), + Nan::New(baton->signature.ptr, baton->signature.size).ToLocalChecked() + ); + Nan::Set( + result, + Nan::New("signedData").ToLocalChecked(), + Nan::New(baton->signed_data.ptr, baton->signed_data.size).ToLocalChecked() + ); + + Local argv[2] = { + Nan::Null(), + result + }; + callback->Call(2, argv, async_resource); + } + else if (baton->error) + { + Local argv[1] = { + Nan::Error(baton->error->message) + }; + callback->Call(1, argv, async_resource); + if (baton->error->message) + { + free((void *)baton->error->message); + } + + free((void *)baton->error); + } + else if (baton->error_code < 0) + { + Local err = Nan::To(Nan::Error("Extract Signature has thrown an error.")).ToLocalChecked(); + Nan::Set(err, Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); + Nan::Set(err, Nan::New("errorFunction").ToLocalChecked(), Nan::New("Commit.extractSignature").ToLocalChecked()); + Local argv[1] = { + err + }; + callback->Call(1, argv, async_resource); + } + else + { + callback->Call(0, NULL, async_resource); + } + + git_buf_dispose(&baton->signature); + git_buf_dispose(&baton->signed_data); + + if (baton->field != NULL) { + free((void *)baton->field); + } + + delete baton; +} diff --git a/generate/templates/manual/filter_list/load.cc b/generate/templates/manual/filter_list/load.cc new file mode 100644 index 0000000000..22e2f1f4f3 --- /dev/null +++ b/generate/templates/manual/filter_list/load.cc @@ -0,0 +1,227 @@ +// NOTE you may need to occasionally rebuild this method by calling the generators +// if major changes are made to the templates / generator. + +// git_filter_list_load has a more complex ownership pattern than is currently available +// in the generator. This is because it not only has to get the repo as an owner, +// but it also needs to discover which custom filters, a git_filter, it is bound to, if any. +// We must enforce that the custom filters are not freed before a git_filter_list is freed, +// but a git_filter_list also has pointers to the repo in it. + +// TODO In the future, it would be awesome if we could instead of writing a manual method like this, provide +// custom ownership methods that can be injected into the HandleOKCallback. + +/* + * @param Repository repo + * @param Blob blob + * @param String path + * @param Number mode + * @param Number flags + * @param FilterList callback + */ +NAN_METHOD(GitFilterList::Load) { + if (info.Length() == 0 || !info[0]->IsObject()) { + return Nan::ThrowError("Repository repo is required."); + } + + if (info.Length() == 2 || !info[2]->IsString()) { + return Nan::ThrowError("String path is required."); + } + + if (info.Length() == 3 || !info[3]->IsNumber()) { + return Nan::ThrowError("Number mode is required."); + } + + if (info.Length() == 4 || !info[4]->IsNumber()) { + return Nan::ThrowError("Number flags is required."); + } + + if (!info[info.Length() - 1]->IsFunction()) { + return Nan::ThrowError("Callback is required and must be a Function."); + } + + LoadBaton *baton = new LoadBaton(); + + baton->error_code = GIT_OK; + baton->error = NULL; + + // start convert_from_v8 block + git_repository *from_repo = NULL; + from_repo = + Nan::ObjectWrap::Unwrap(Nan::To(info[0]).ToLocalChecked())->GetValue(); + // end convert_from_v8 block + baton->repo = from_repo; + // start convert_from_v8 block + git_blob *from_blob = NULL; + if (info[1]->IsObject()) { + from_blob = + Nan::ObjectWrap::Unwrap(Nan::To(info[1]).ToLocalChecked())->GetValue(); + } else { + from_blob = 0; + } + // end convert_from_v8 block + baton->blob = from_blob; + // start convert_from_v8 block + const char *from_path = NULL; + + Nan::Utf8String path(Nan::To(info[2]).ToLocalChecked()); + // malloc with one extra byte so we can add the terminating null character + // C-strings expect: + from_path = (const char *)malloc(path.length() + 1); + // copy the characters from the nodejs string into our C-string (used instead + // of strdup or strcpy because nulls in the middle of strings are valid coming + // from nodejs): + memcpy((void *)from_path, *path, path.length()); + // ensure the final byte of our new string is null, extra casts added to + // ensure compatibility with various C types used in the nodejs binding + // generation: + memset((void *)(((char *)from_path) + path.length()), 0, 1); + // end convert_from_v8 block + baton->path = from_path; + // start convert_from_v8 block + git_filter_mode_t from_mode; + from_mode = (git_filter_mode_t)(int)info[3].As()->Value(); + // end convert_from_v8 block + baton->mode = from_mode; + // start convert_from_v8 block + uint32_t from_flags; + from_flags = (uint32_t)info[4].As()->Value(); + // end convert_from_v8 block + baton->flags = from_flags; + + Nan::Callback *callback = + new Nan::Callback(v8::Local::Cast(info[info.Length() - 1])); + std::map> cleanupHandles; + LoadWorker *worker = new LoadWorker(baton, callback, cleanupHandles); + + worker->Reference("repo", info[0]); + worker->Reference("blob", info[1]); + + nodegit::Context *nodegitContext = reinterpret_cast(info.Data().As()->Value()); + nodegitContext->QueueWorker(worker); + return; +} + +nodegit::LockMaster GitFilterList::LoadWorker::AcquireLocks() { + nodegit::LockMaster lockMaster( + true, + baton->repo, + baton->blob, + baton->path + ); + return lockMaster; +} + +void GitFilterList::LoadWorker::Execute() { + git_error_clear(); + + int result = git_filter_list_load(&baton->filters, baton->repo, baton->blob, + baton->path, baton->mode, baton->flags); + + baton->error_code = result; + + if (result != GIT_OK && git_error_last()->klass != GIT_ERROR_NONE) { + baton->error = git_error_dup(git_error_last()); + } +} + +void GitFilterList::LoadWorker::HandleErrorCallback() { + if (baton->error) { + if (baton->error->message) { + free((void *)baton->error->message); + } + + free((void *)baton->error); + } + + git_filter_list_free(baton->filters); + + free((void *)baton->path); + + delete baton; +} + +void GitFilterList::LoadWorker::HandleOKCallback() { + if (baton->error_code == GIT_OK) { + v8::Local to; + // start convert_to_v8 block + + if (baton->filters != NULL) { + // GitFilterList baton->filters + v8::Local owners = Nan::New(0); + nodegit::Context *nodegitContext = nodegit::Context::GetCurrentContext(); + + Nan::Set( + owners, + Nan::New(0), + Nan::To(this->GetFromPersistent("repo")).ToLocalChecked() + ); + + to = GitFilterList::New(baton->filters, true, Nan::To(owners).ToLocalChecked()); + auto filterListWrapper = Nan::ObjectWrap::Unwrap(to.As()); + auto filterRegistryCleanupHandles = static_pointer_cast(nodegit::Context::GetCurrentContext()->GetCleanupHandle("filterRegistry")); + std::for_each( + filterRegistryCleanupHandles->registeredFilters.begin(), + filterRegistryCleanupHandles->registeredFilters.end(), + [this, &filterListWrapper](std::pair> filterCleanupHandle) { + if (git_filter_list_contains(baton->filters, filterCleanupHandle.first.c_str())) { + filterListWrapper->SaveCleanupHandle(filterCleanupHandle.second); + } + } + ); + } else { + to = Nan::Null(); + } + + // end convert_to_v8 block + v8::Local result = to; + + v8::Local argv[2] = {Nan::Null(), result}; + callback->Call(2, argv, async_resource); + } else { + if (baton->error) { + v8::Local err; + if (baton->error->message) { + err = Nan::To(Nan::Error(baton->error->message)).ToLocalChecked(); + } else { + err = Nan::To(Nan::Error("Method load has thrown an error.")).ToLocalChecked(); + } + Nan::Set(err, Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); + Nan::Set(err, Nan::New("errorFunction").ToLocalChecked(), + Nan::New("FilterList.load").ToLocalChecked()); + v8::Local argv[1] = {err}; + callback->Call(1, argv, async_resource); + if (baton->error->message) + free((void *)baton->error->message); + free((void *)baton->error); + } else if (baton->error_code < 0) { + bool callbackFired = false; + if (!callbackErrorHandle.IsEmpty()) { + v8::Local maybeError = Nan::New(callbackErrorHandle); + if (!maybeError->IsNull() && !maybeError->IsUndefined()) { + v8::Local argv[1] = { + maybeError + }; + callback->Call(1, argv, async_resource); + callbackFired = true; + } + } + + if (!callbackFired) { + v8::Local err = + Nan::To(Nan::Error("Method load has thrown an error.")).ToLocalChecked(); + Nan::Set(err, Nan::New("errno").ToLocalChecked(), + Nan::New(baton->error_code)); + Nan::Set(err, Nan::New("errorFunction").ToLocalChecked(), + Nan::New("FilterList.load").ToLocalChecked()); + v8::Local argv[1] = {err}; + callback->Call(1, argv, async_resource); + } + } else { + callback->Call(0, NULL, async_resource); + } + } + + free((void *)baton->path); + + delete baton; +} diff --git a/generate/templates/manual/filter_source/repo.cc b/generate/templates/manual/filter_source/repo.cc new file mode 100644 index 0000000000..78903d86b6 --- /dev/null +++ b/generate/templates/manual/filter_source/repo.cc @@ -0,0 +1,107 @@ +// NOTE you may need to occasionally rebuild this method by calling the generators +// if major changes are made to the templates / generator. + +// Due to some garbage collection issues related to submodules and git_filters, we need to clone the repository +// pointer before giving it to a user. + +/* + * @param Repository callback + */ +NAN_METHOD(GitFilterSource::Repo) { + if (!info[info.Length() - 1]->IsFunction()) { + return Nan::ThrowError("Callback is required and must be a Function."); + } + + RepoBaton *baton = new RepoBaton(); + + baton->error_code = GIT_OK; + baton->error = NULL; + baton->src = Nan::ObjectWrap::Unwrap(info.This())->GetValue(); + + Nan::Callback *callback = new Nan::Callback(v8::Local::Cast(info[info.Length() - 1])); + std::map> cleanupHandles; + RepoWorker *worker = new RepoWorker(baton, callback, cleanupHandles); + + worker->Reference("src", info.This()); + + nodegit::Context *nodegitContext = reinterpret_cast(info.Data().As()->Value()); + nodegitContext->QueueWorker(worker); + return; +} + +nodegit::LockMaster GitFilterSource::RepoWorker::AcquireLocks() { + nodegit::LockMaster lockMaster(true, baton->src); + return lockMaster; +} + +void GitFilterSource::RepoWorker::Execute() { + git_error_clear(); + + git_repository *repo = git_filter_source_repo(baton->src); + baton->error_code = git_repository_open(&repo, git_repository_path(repo)); + + if (baton->error_code == GIT_OK) { + baton->out = repo; + } else if (git_error_last()->klass != GIT_ERROR_NONE) { + baton->error = git_error_dup(git_error_last()); + } +} + +void GitFilterSource::RepoWorker::HandleErrorCallback() { + if (baton->error) { + if (baton->error->message) { + free((void *)baton->error->message); + } + + free((void *)baton->error); + } + + git_repository_free(baton->out); + + delete baton; +} + +void GitFilterSource::RepoWorker::HandleOKCallback() { + if (baton->error_code == GIT_OK) { + v8::Local to; + + if (baton->out != NULL) { + to = GitRepository::New(baton->out, true); + } else { + to = Nan::Null(); + } + + v8::Local argv[2] = {Nan::Null(), to}; + callback->Call(2, argv, async_resource); + } else { + if (baton->error) { + v8::Local err; + if (baton->error->message) { + err = Nan::To(Nan::Error(baton->error->message)).ToLocalChecked(); + } else { + err = Nan::To(Nan::Error("Method repo has thrown an error.")).ToLocalChecked(); + } + Nan::Set(err, Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); + Nan::Set(err, Nan::New("errorFunction").ToLocalChecked(), + Nan::New("FilterSource.repo").ToLocalChecked()); + v8::Local argv[1] = {err}; + callback->Call(1, argv, async_resource); + if (baton->error->message) + free((void *)baton->error->message); + free((void *)baton->error); + } else if (baton->error_code < 0) { + v8::Local err = + Nan::To(Nan::Error("Method repo has thrown an error.")).ToLocalChecked(); + Nan::Set(err, Nan::New("errno").ToLocalChecked(), + Nan::New(baton->error_code)); + Nan::Set(err, Nan::New("errorFunction").ToLocalChecked(), + Nan::New("FilterSource.repo").ToLocalChecked()); + v8::Local argv[1] = {err}; + callback->Call(1, argv, async_resource); + } else { + callback->Call(0, NULL, async_resource); + } + } + + delete baton; +} diff --git a/generate/templates/manual/include/async_baton.h b/generate/templates/manual/include/async_baton.h new file mode 100644 index 0000000000..33da4a4520 --- /dev/null +++ b/generate/templates/manual/include/async_baton.h @@ -0,0 +1,78 @@ +#ifndef ASYNC_BATON +#define ASYNC_BATON + +#include +#include +#include +#include + +#include "lock_master.h" +#include "nodegit.h" +#include "thread_pool.h" + +namespace nodegit { + // Base class for Batons used for callbacks (for example, + // JS functions passed as callback parameters, + // or field properties of configuration objects whose values are callbacks) + class AsyncBaton { + public: + typedef std::function AsyncCallback; + typedef std::function CompletionCallback; + + AsyncBaton(); + AsyncBaton(const AsyncBaton &) = delete; + AsyncBaton(AsyncBaton &&) = delete; + AsyncBaton &operator=(const AsyncBaton &) = delete; + AsyncBaton &operator=(AsyncBaton &&) = delete; + + virtual ~AsyncBaton() {} + + void Done(); + + Nan::AsyncResource *GetAsyncResource(); + + void SetCallbackError(v8::Local error); + + protected: + void ExecuteAsyncPerform(AsyncCallback asyncCallback, AsyncCallback asyncCancelCb, CompletionCallback onCompletion); + + private: + void SignalCompletion(); + void WaitForCompletion(); + + Nan::AsyncResource *asyncResource; + Nan::Global &callbackErrorHandle; + ThreadPool::Callback onCompletion; + std::unique_ptr completedMutex; + std::condition_variable completedCondition; + bool hasCompleted; + }; + + void deleteBaton(AsyncBaton *baton); + + template + class AsyncBatonWithResult : public AsyncBaton { + public: + ResultT defaultResult; // result returned if the callback doesn't return anything valid + ResultT result; + + AsyncBatonWithResult(const ResultT &defaultResult) + : defaultResult(defaultResult) { + } + + ResultT ExecuteAsync(AsyncBaton::AsyncCallback asyncCallback, AsyncBaton::AsyncCallback asyncCancelCb, AsyncBaton::CompletionCallback onCompletion = nullptr) { + result = 0; + ExecuteAsyncPerform(asyncCallback, asyncCancelCb, onCompletion); + return result; + } + }; + + class AsyncBatonWithNoResult : public AsyncBaton { + public: + void ExecuteAsync(AsyncBaton::AsyncCallback asyncCallback, AsyncBaton::AsyncCallback asyncCancelCb, AsyncBaton::CompletionCallback onCompletion = nullptr) { + ExecuteAsyncPerform(asyncCallback, asyncCancelCb, onCompletion); + } + }; +} + +#endif diff --git a/generate/templates/manual/include/async_worker.h b/generate/templates/manual/include/async_worker.h new file mode 100644 index 0000000000..b8f2909901 --- /dev/null +++ b/generate/templates/manual/include/async_worker.h @@ -0,0 +1,91 @@ +#ifndef NODEGIT_ASYNC_WORKER +#define NODEGIT_ASYNC_WORKER + +#include +#include +#include +#include +#include "lock_master.h" +#include "cleanup_handle.h" + +namespace nodegit { + class AsyncWorker : public Nan::AsyncWorker { + public: + AsyncWorker(Nan::Callback *callback, const char *resourceName, std::map> &cleanupHandles); + AsyncWorker(Nan::Callback *callback, const char *resourceName); + AsyncWorker(const AsyncWorker &) = delete; + AsyncWorker(AsyncWorker &&) = delete; + AsyncWorker &operator=(const AsyncWorker &) = delete; + AsyncWorker &operator=(AsyncWorker &&) = delete; + + // This must be implemented by every async worker + // so that the thread pool can lock separately + // from the execute method in the AsyncWorker + virtual nodegit::LockMaster AcquireLocks() = 0; + + // Ensure that the `HandleErrorCallback` will be called + // when the AsyncWork is complete + void Cancel(); + + // Retrieves the async resource attached to this AsyncWorker + // This is used to inform libgit2 callbacks what asyncResource + // they should use when working with any javascript + Nan::AsyncResource *GetAsyncResource(); + + Nan::Global *GetCallbackErrorHandle(); + + bool GetIsCancelled() const; + + void Destroy() override; + + void RegisterCleanupCall(std::function cleanupCall); + + template + void Reference(v8::Local item) { + if (item->IsFunction() || item->IsString() || item->IsNull() || item->IsUndefined()) { + return; + } + + auto objectWrapPointer = Nan::ObjectWrap::Unwrap(item.As()); + objectWrapPointer->Reference(); + RegisterCleanupCall([objectWrapPointer]() { + objectWrapPointer->Unreference(); + }); + } + + template + inline void Reference(const char *label, v8::Local item) { + SaveToPersistent(label, item); + Reference(item); + } + + template + inline void Reference(const char *label, v8::Local item) { + SaveToPersistent(label, item); + Reference(item); + } + + template + inline void Reference(const char *label, v8::Local array) { + SaveToPersistent(label, array); + for (uint32_t i = 0; i < array->Length(); ++i) { + Reference(Nan::Get(array, i).ToLocalChecked()); + } + } + + inline void Reference(const char *label, v8::Local item) { + SaveToPersistent(label, item); + } + + protected: + std::map> cleanupHandles; + Nan::Global callbackErrorHandle; + + private: + std::vector> cleanupCalls; + bool isCancelled = false; + + }; +} + +#endif diff --git a/generate/templates/manual/include/callback_wrapper.h b/generate/templates/manual/include/callback_wrapper.h index e02182f096..d50b976105 100644 --- a/generate/templates/manual/include/callback_wrapper.h +++ b/generate/templates/manual/include/callback_wrapper.h @@ -1,17 +1,65 @@ #ifndef CALLBACK_WRAPPER_H #define CALLBACK_WRAPPER_H -#include -#include - -#include "nan.h" +#include +#include +#include using namespace v8; using namespace node; -struct CallbackWrapper { - NanCallback* jsCallback; - void * payload; +class CallbackWrapper { + std::unique_ptr jsCallback; + + // throttling data, used for callbacks that need to be throttled + uint32_t throttle; // in milliseconds - if > 0, calls to the JS callback will be throttled + uint64_t lastCallTime; + + // false will trigger the callback and not wait for the callback to finish + // in this case, the underlying libgit2 function will immediately be given + // the default result + bool waitForResult; + +public: + CallbackWrapper(): jsCallback(nullptr), throttle(0), lastCallTime(0) {} + + CallbackWrapper(const CallbackWrapper &) = delete; + CallbackWrapper(CallbackWrapper &&) = delete; + CallbackWrapper &operator=(const CallbackWrapper &) = delete; + CallbackWrapper &operator=(CallbackWrapper &&) = delete; + + bool HasCallback() { + return jsCallback != nullptr; + } + + Nan::Callback* GetCallback() { + return jsCallback.get(); + } + + void SetCallback(std::unique_ptr callback, uint32_t throttle = 0, bool waitForResult = true) { + jsCallback = std::move(callback); + this->throttle = throttle; + this->waitForResult = waitForResult; + } + + bool ShouldWaitForResult() { + return waitForResult; + } + + bool WillBeThrottled() { + if(!throttle) { + return false; + } + // throttle if needed + uint64_t now = uv_hrtime(); + if(lastCallTime > 0 && now < lastCallTime + throttle * (uint64_t)1000000) { + // throttled + return true; + } else { + lastCallTime = now; + return false; + } + } }; #endif diff --git a/generate/templates/manual/include/cleanup_handle.h b/generate/templates/manual/include/cleanup_handle.h new file mode 100644 index 0000000000..5eca8cf70d --- /dev/null +++ b/generate/templates/manual/include/cleanup_handle.h @@ -0,0 +1,21 @@ +#ifndef NODEGIT_CLEANUP_HANDLE_H +#define NODEGIT_CLEANUP_HANDLE_H + +#include +#include +#include + +namespace nodegit { + class CleanupHandle { + public: + CleanupHandle(); + virtual ~CleanupHandle(); + }; + + class FilterRegistryCleanupHandles : public CleanupHandle { + public: + std::map> registeredFilters; + }; +} + +#endif diff --git a/generate/templates/manual/include/configurable_class_wrapper.h b/generate/templates/manual/include/configurable_class_wrapper.h new file mode 100644 index 0000000000..ff83a3176d --- /dev/null +++ b/generate/templates/manual/include/configurable_class_wrapper.h @@ -0,0 +1,59 @@ +#ifndef CALLER_CONFIGURABLE_CLASS_WRAPPER_H +#define CALLER_CONFIGURABLE_CLASS_WRAPPER_H + +#include +#include +#include + +#include "cleanup_handle.h" + +namespace nodegit { + class Context; + + template + class ConfigurableClassWrapper : public CleanupHandle { + public: + typedef typename Traits::cType cType; + typedef typename Traits::configurableCppClass configurableCppClass; + + struct v8ConversionResult { + v8ConversionResult(std::string _error) + : error(std::move(_error)), result(nullptr) + {} + + v8ConversionResult(std::shared_ptr _result) + : result(std::move(_result)) + {} + + std::string error; + std::shared_ptr result; + }; + + // We copy the entity + ConfigurableClassWrapper(nodegit::Context *_nodeGitContext) + : nodegitContext(_nodeGitContext), raw(nullptr) {} + + ConfigurableClassWrapper(const ConfigurableClassWrapper &) = delete; + ConfigurableClassWrapper(ConfigurableClassWrapper &&) = delete; + ConfigurableClassWrapper &operator=(const ConfigurableClassWrapper &) = delete; + ConfigurableClassWrapper &operator=(ConfigurableClassWrapper &&) = delete; + + virtual ~ConfigurableClassWrapper() { + if (raw != nullptr) { + free(raw); + raw = nullptr; + } + } + + const Context *nodegitContext = nullptr; + cType *GetValue() { + return raw; + } + + protected: + cType *raw; + std::vector> childCleanupVector; + }; +} + +#endif diff --git a/generate/templates/manual/include/context.h b/generate/templates/manual/include/context.h new file mode 100644 index 0000000000..11e8b93f8a --- /dev/null +++ b/generate/templates/manual/include/context.h @@ -0,0 +1,90 @@ +#ifndef NODEGIT_CONTEXT +#define NODEGIT_CONTEXT + +#include +#include +#include +#include +#include +#include + +#include "async_worker.h" +#include "cleanup_handle.h" +#include "thread_pool.h" +#include "tracker_wrap.h" + +namespace nodegit { + class AsyncContextCleanupHandle; + class Context { + public: + Context(v8::Isolate *isolate); + Context(const Context &) = delete; + Context(Context &&) = delete; + Context &operator=(const Context &) = delete; + Context &operator=(Context &&) = delete; + + ~Context(); + + static Context *GetCurrentContext(); + + v8::Local GetFromPersistent(std::string key); + + void QueueWorker(nodegit::AsyncWorker *worker); + + void SaveToPersistent(std::string key, const v8::Local &value); + + void SaveCleanupHandle(std::string key, std::shared_ptr cleanupHandle); + + std::shared_ptr GetCleanupHandle(std::string key); + + std::shared_ptr RemoveCleanupHandle(std::string key); + + void ShutdownThreadPool(std::unique_ptr cleanupHandle); + + inline void LinkTrackerList(nodegit::TrackerWrap::TrackerList *list) { + list->Link(&trackerList); + } + + inline int TrackerListSize() { + return nodegit::TrackerWrap::SizeFromList(&trackerList); + } + + private: + v8::Isolate *isolate; + + ThreadPool threadPool; + + // This map contains persistent handles that need to be cleaned up + // after the context has been torn down. + // Often this is used as a context-aware storage cell for `*::InitializeComponent` + // to store function templates on them. + Nan::Global persistentStorage; + + std::map> cleanupHandles; + + nodegit::TrackerWrap::TrackerList trackerList; + + static std::map contexts; + }; + + class AsyncContextCleanupHandle { + public: + AsyncContextCleanupHandle(const AsyncContextCleanupHandle &) = delete; + AsyncContextCleanupHandle(AsyncContextCleanupHandle &&) = delete; + AsyncContextCleanupHandle &operator=(const AsyncContextCleanupHandle &) = delete; + AsyncContextCleanupHandle &operator=(AsyncContextCleanupHandle &&) = delete; + ~AsyncContextCleanupHandle(); + + private: + static void AsyncCleanupContext(void *data, void (*uvCallback)(void *), void *uvCallbackData); + + friend class Context; + AsyncContextCleanupHandle(v8::Isolate *isolate, Context *context); + Context *context; + node::AsyncCleanupHookHandle handle; + void (*doneCallback)(void *); + void *doneData; + }; +} + +#endif diff --git a/generate/templates/manual/include/convenient_hunk.h b/generate/templates/manual/include/convenient_hunk.h new file mode 100644 index 0000000000..c45da7368f --- /dev/null +++ b/generate/templates/manual/include/convenient_hunk.h @@ -0,0 +1,89 @@ +#ifndef CONVENIENTHUNK_H +#define CONVENIENTHUNK_H +// generated from class_header.h +#include +#include + +#include "async_baton.h" +#include "async_worker.h" +#include "lock_master.h" +#include "promise_completion.h" + +extern "C" { +#include +} + +#include "../include/typedefs.h" + +struct HunkData { + git_diff_hunk hunk; + std::vector *lines; + size_t numLines; +}; + +void HunkDataFree(HunkData *hunk); + +using namespace node; +using namespace v8; + +class ConvenientHunk : public Nan::ObjectWrap { + public: + static void InitializeComponent (v8::Local target, nodegit::Context *nodegitContext); + + static v8::Local New(void *raw); + + HunkData *GetValue(); + char *GetHeader(); + size_t GetSize(); + + void Reference(); + void Unreference(); + + private: + ConvenientHunk(HunkData *hunk); + ConvenientHunk(const ConvenientHunk &) = delete; + ConvenientHunk(ConvenientHunk &&) = delete; + ConvenientHunk &operator=(const ConvenientHunk &) = delete; + ConvenientHunk &operator=(ConvenientHunk &&) = delete; + ~ConvenientHunk(); + + HunkData *hunk; + + static NAN_METHOD(JSNewFunction); + static NAN_METHOD(Size); + + static NAN_METHOD(OldStart); + static NAN_METHOD(OldLines); + static NAN_METHOD(NewStart); + static NAN_METHOD(NewLines); + static NAN_METHOD(HeaderLen); + static NAN_METHOD(Header); + + struct LinesBaton { + HunkData *hunk; + std::vector *lines; + }; + class LinesWorker : public nodegit::AsyncWorker { + public: + LinesWorker( + LinesBaton *_baton, + Nan::Callback *callback + ) : nodegit::AsyncWorker(callback, "nodegit:AsyncWorker:ConvenientHunk:Lines") + , baton(_baton) {}; + LinesWorker(const LinesWorker &) = delete; + LinesWorker(LinesWorker &&) = delete; + LinesWorker &operator=(const LinesWorker &) = delete; + LinesWorker &operator=(LinesWorker &&) = delete; + ~LinesWorker(){}; + void Execute(); + void HandleErrorCallback(); + void HandleOKCallback(); + nodegit::LockMaster AcquireLocks(); + + private: + LinesBaton *baton; + }; + static NAN_METHOD(Lines); +}; + +#endif diff --git a/generate/templates/manual/include/convenient_patch.h b/generate/templates/manual/include/convenient_patch.h new file mode 100644 index 0000000000..a894765694 --- /dev/null +++ b/generate/templates/manual/include/convenient_patch.h @@ -0,0 +1,123 @@ +#ifndef CONVENIENTPATCH_H +#define CONVENIENTPATCH_H +// generated from class_header.h +#include +#include + +#include "async_baton.h" +#include "async_worker.h" +#include "lock_master.h" +#include "promise_completion.h" + +extern "C" { +#include +} + +#include "../include/typedefs.h" +#include "../include/convenient_hunk.h" + +struct ConvenientLineStats { + size_t context; + size_t additions; + size_t deletions; +}; + +struct PatchData { + ConvenientLineStats lineStats; + git_delta_t status; + git_diff_file new_file; + git_diff_file old_file; + std::vector *hunks; + size_t numHunks; +}; + +PatchData *createFromRaw(git_patch *raw); +void PatchDataFree(PatchData *patch); + +using namespace node; +using namespace v8; + +class ConvenientPatch : public Nan::ObjectWrap { + public: + ConvenientPatch(const ConvenientPatch &) = delete; + ConvenientPatch(ConvenientPatch &&) = delete; + ConvenientPatch &operator=(const ConvenientPatch &) = delete; + ConvenientPatch &operator=(ConvenientPatch &&) = delete; + + static void InitializeComponent(v8::Local target, nodegit::Context *nodegitContext); + + static v8::Local New(void *raw); + + ConvenientLineStats GetLineStats(); + git_delta_t GetStatus(); + git_diff_file GetOldFile(); + git_diff_file GetNewFile(); + size_t GetNumHunks(); + PatchData *GetValue(); + + void Reference(); + void Unreference(); + + private: + ConvenientPatch(PatchData *raw); + ~ConvenientPatch(); + + PatchData *patch; + + static NAN_METHOD(JSNewFunction); + + // patch methods + static NAN_METHOD(LineStats); + + // hunk methods + static NAN_METHOD(Size); + + struct HunksBaton { + PatchData *patch; + std::vector *hunks; + }; + class HunksWorker : public nodegit::AsyncWorker { + public: + HunksWorker( + HunksBaton *_baton, + Nan::Callback *callback + ) : nodegit::AsyncWorker(callback, "nodegit:AsyncWorker:ConvenientPatch:Hunks") + , baton(_baton) {}; + HunksWorker(const HunksWorker &) = delete; + HunksWorker(HunksWorker &&) = delete; + HunksWorker &operator=(const HunksWorker &) = delete; + HunksWorker &operator=(HunksWorker &&) = delete; + ~HunksWorker(){}; + void Execute(); + void HandleErrorCallback(); + void HandleOKCallback(); + nodegit::LockMaster AcquireLocks(); + + private: + HunksBaton *baton; + }; + + static NAN_METHOD(Hunks); + + // delta methods + static NAN_METHOD(OldFile); + static NAN_METHOD(NewFile); + + // convenient status methods + static NAN_METHOD(Status); + static NAN_METHOD(IsUnmodified); + static NAN_METHOD(IsAdded); + static NAN_METHOD(IsDeleted); + static NAN_METHOD(IsModified); + static NAN_METHOD(IsRenamed); + static NAN_METHOD(IsCopied); + static NAN_METHOD(IsIgnored); + static NAN_METHOD(IsUntracked); + static NAN_METHOD(IsTypeChange); + static NAN_METHOD(IsUnreadable); + static NAN_METHOD(IsConflicted); + + // Hunk methods +}; + +#endif diff --git a/generate/templates/manual/include/filter_registry.h b/generate/templates/manual/include/filter_registry.h new file mode 100644 index 0000000000..ca98d972e4 --- /dev/null +++ b/generate/templates/manual/include/filter_registry.h @@ -0,0 +1,88 @@ +#ifndef GITFILTERREGISTRY_H +#define GITFILTERREGISTRY_H +#include +#include +#include + +#include "async_baton.h" +#include "async_worker.h" +#include "cleanup_handle.h" +#include "context.h" +#include "lock_master.h" +#include "nodegit_wrapper.h" +#include "promise_completion.h" + +extern "C" { +#include +} + +#include "../include/typedefs.h" + +#include "../include/filter.h" + +using namespace node; +using namespace v8; + + +class GitFilterRegistry : public Nan::ObjectWrap { + public: + static void InitializeComponent(v8::Local target, nodegit::Context *nodegitContext); + + private: + + static NAN_METHOD(GitFilterRegister); + + static NAN_METHOD(GitFilterUnregister); + + struct FilterRegisterBaton { + const git_error *error; + git_filter *filter; + char *filter_name; + int filter_priority; + int error_code; + }; + + struct FilterUnregisterBaton { + const git_error *error; + char *filter_name; + int error_code; + }; + + class RegisterWorker : public nodegit::AsyncWorker { + public: + RegisterWorker(FilterRegisterBaton *_baton, Nan::Callback *callback, std::map> &cleanupHandles) + : nodegit::AsyncWorker(callback, "nodegit:AsyncWorker:FilterRegistry:Register", cleanupHandles), baton(_baton) {}; + RegisterWorker(const RegisterWorker &) = delete; + RegisterWorker(RegisterWorker &&) = delete; + RegisterWorker &operator=(const RegisterWorker &) = delete; + RegisterWorker &operator=(RegisterWorker &&) = delete; + ~RegisterWorker() {}; + void Execute(); + void HandleErrorCallback(); + void HandleOKCallback(); + nodegit::LockMaster AcquireLocks(); + + private: + FilterRegisterBaton *baton; + }; + + class UnregisterWorker : public nodegit::AsyncWorker { + public: + UnregisterWorker(FilterUnregisterBaton *_baton, Nan::Callback *callback) + : nodegit::AsyncWorker(callback, "nodegit:AsyncWorker:FilterRegistry:Unregister"), baton(_baton) {}; + UnregisterWorker(const UnregisterWorker &) = delete; + UnregisterWorker(UnregisterWorker &&) = delete; + UnregisterWorker &operator=(const UnregisterWorker &) = delete; + UnregisterWorker &operator=(UnregisterWorker &&) = delete; + ~UnregisterWorker() {}; + void Execute(); + void HandleErrorCallback(); + void HandleOKCallback(); + nodegit::LockMaster AcquireLocks(); + + private: + FilterUnregisterBaton *baton; + }; +}; + +#endif diff --git a/generate/templates/manual/include/functions/copy.h b/generate/templates/manual/include/functions/copy.h index 299d07fea1..9983e575af 100644 --- a/generate/templates/manual/include/functions/copy.h +++ b/generate/templates/manual/include/functions/copy.h @@ -14,5 +14,10 @@ const git_index_time *git_index_time_dup(const git_index_time *arg); const git_time *git_time_dup(const git_time *arg); const git_diff_delta *git_diff_delta_dup(const git_diff_delta *arg); const git_diff_file *git_diff_file_dup(const git_diff_file *arg); +git_remote_head *git_remote_head_dup(const git_remote_head *src); + + +void git_time_dup(git_time **out, const git_time *arg); +void git_transfer_progress_dup(git_transfer_progress **out, const git_transfer_progress *arg); #endif diff --git a/generate/templates/manual/include/functions/free.h b/generate/templates/manual/include/functions/free.h new file mode 100644 index 0000000000..873417b985 --- /dev/null +++ b/generate/templates/manual/include/functions/free.h @@ -0,0 +1,12 @@ +#include + +#include + +#include "git2.h" + +#ifndef NODEGIT_FREE_FUNCTIONS +#define NODEGIT_FREE_FUNCTIONS + +void git_remote_head_free(git_remote_head *remote_head); + +#endif diff --git a/generate/templates/manual/include/git_buf_converter.h b/generate/templates/manual/include/git_buf_converter.h index ca2a502d84..5671246298 100644 --- a/generate/templates/manual/include/git_buf_converter.h +++ b/generate/templates/manual/include/git_buf_converter.h @@ -4,13 +4,13 @@ #include #include "nan.h" -#include "git2/strarray.h" +#include "git2/buffer.h" using namespace v8; -class StrArrayConverter { +class GitBufConverter { public: - static git_strarray *Convert (Handle val); + static git_buf *Convert(v8::Local val); }; #endif diff --git a/generate/templates/manual/include/init_ssh2.h b/generate/templates/manual/include/init_ssh2.h new file mode 100644 index 0000000000..d7f92b71a4 --- /dev/null +++ b/generate/templates/manual/include/init_ssh2.h @@ -0,0 +1,6 @@ +#ifndef INIT_SSH2 +#define INIT_SSH2 + +void init_ssh2(); + +#endif diff --git a/generate/templates/manual/include/lock_master.h b/generate/templates/manual/include/lock_master.h new file mode 100644 index 0000000000..0cd313b60d --- /dev/null +++ b/generate/templates/manual/include/lock_master.h @@ -0,0 +1,182 @@ +#ifndef LOCK_MASTER_H +#define LOCK_MASTER_H + +#include + +namespace nodegit { + class LockMasterImpl; + + class LockMaster { + private: + LockMasterImpl *impl; + + template + void AddLocks(const T *t) { + // by default, don't lock anything + } + + // base case for variadic template unwinding + void AddParameters() { + } + + // processes a single parameter, then calls recursively on the rest + template + void AddParameters(const T *t, const Types*... args) { + if(t) { + AddLocks(t); + } + AddParameters(args...); + } + + void ConstructorImpl(); + void DestructorImpl(); + void ObjectToLock(const void *); + void ObjectsToLockAdded(); + public: + + // we lock on construction + template LockMaster(bool asyncAction, const Types*... types) { + if(!asyncAction) { + impl = nullptr; + return; + } + + ConstructorImpl(); + AddParameters(types...); + ObjectsToLockAdded(); + } + + // we don't want this object to be copyable, there can only be one lock holder + LockMaster(const LockMaster &other) = delete; + + LockMaster &operator=(const LockMaster &other) = delete; + + // expose a move constructor so that LockMaster can be returned + LockMaster(LockMaster &&other); + + LockMaster &operator=(LockMaster &&other); + + // and unlock on destruction + ~LockMaster() { + if(!impl) { + return; + } + DestructorImpl(); + } + + // TemporaryUnlock unlocks the LockMaster currently registered on the thread, + // and re-locks it on destruction. + class TemporaryUnlock { + LockMasterImpl *impl; + + void ConstructorImpl(); + void DestructorImpl(); + public: + TemporaryUnlock() { + // We can't return here if disabled + // It's possible that a LockMaster was fully constructed and registered + // before the thread safety was disabled. + // So we rely on ConstructorImpl to abort if there is no registered LockMaster + ConstructorImpl(); + } + TemporaryUnlock(const TemporaryUnlock &) = delete; + TemporaryUnlock(TemporaryUnlock &&) = delete; + TemporaryUnlock &operator=(const TemporaryUnlock &) = delete; + TemporaryUnlock &operator=(TemporaryUnlock &&) = delete; + ~TemporaryUnlock() { + if(!impl) { + return; + } + DestructorImpl(); + } + }; + + static void InitializeGlobal(); + static void InitializeContext(); + }; + + + template<> inline void LockMaster::AddLocks(const git_repository *repo) { + // when using a repo, lock the repo + ObjectToLock(repo); + } + + template<> inline void LockMaster::AddLocks(const git_index *index) { + // when using an index, lock the repo, or if there isn't one lock the index + const void *owner = git_index_owner(index); + if(!owner) { + owner = index; + } + ObjectToLock(owner); + } + + template<> inline void LockMaster::AddLocks(const git_commit *commit) { + // when using a commit, lock the repo + const void *owner = git_commit_owner(commit); + ObjectToLock(owner); + } + + // ... more locking rules would go here. According to an analysis of idefs.json, + // the following types are passed as non-const * and may require locking + // (some likely, some probably not): + // 'git_annotated_commit', + // 'git_blame_options', + // 'git_blob', + // 'git_buf', + // 'git_checkout_options', + // 'git_cherrypick_options', + // 'git_clone_options', + // 'git_commit', + // 'git_config', + // 'git_diff', + // 'git_diff_perfdata', + // 'git_error', + // 'git_fetch_options', + // 'git_fetch_options', + // 'git_filter', + // 'git_filter_list', + // 'git_hashsig', + // 'git_index', + // 'git_merge_file_input', + // 'git_merge_options', + // 'git_merge_options', + // 'git_note', + // 'git_note_iterator', + // 'git_object', + // 'git_odb', + // 'git_odb_object', + // 'git_oid', + // 'git_oidarray', + // 'git_packbuilder', + // 'git_patch', + // 'git_pathspec', + // 'git_push_options', + // 'git_rebase', + // 'git_rebase_options', + // 'git_refdb', + // 'git_reference', + // 'git_reflog', + // 'git_remote', + // 'git_remote_callbacks', + // 'git_remote_callbacks', + // 'git_repository', + // 'git_repository_init_options', + // 'git_revwalk', + // 'git_signature', + // 'git_stash_apply_options', + // 'git_status_list', + // 'git_strarray', + // 'git_submodule', + // 'git_submodule_update_options', + // 'git_tag', + // 'git_transfer_progress', + // 'git_transport', + // 'git_tree', + // 'git_treebuilder', + // 'git_writestream' + // + // Other types are always passed as const * and perhaps don't require locking + // (it's not a guarantee though) +} + +#endif diff --git a/generate/templates/manual/include/macros.h b/generate/templates/manual/include/macros.h deleted file mode 100644 index 80e63ab045..0000000000 --- a/generate/templates/manual/include/macros.h +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef NODEGIT_PSUEDONAN_H_ -#if (NODE_MODULE_VERSION > 0x000B) -// Node 0.11+ (0.11.3 and below won't compile with these) -# define NodeGitPsueodoNanReturnEscapingValue(val) NanReturnValue(NanEscapeScope(val)) - -#else -// Node 0.8 and 0.10 -# define NodeGitPsueodoNanReturnEscapingValue(val) NanReturnValue(val) - -#endif - -#endif //NODEGIT_PSUEDONAN_H_ diff --git a/generate/templates/manual/include/nodegit.h b/generate/templates/manual/include/nodegit.h new file mode 100644 index 0000000000..bab3e4179b --- /dev/null +++ b/generate/templates/manual/include/nodegit.h @@ -0,0 +1,11 @@ +#ifndef NODEGIT_H +#define NODEGIT_H + +v8::Local GetPrivate(v8::Local object, + v8::Local key); + +void SetPrivate(v8::Local object, + v8::Local key, + v8::Local value); + +#endif diff --git a/generate/templates/manual/include/nodegit_wrapper.h b/generate/templates/manual/include/nodegit_wrapper.h new file mode 100644 index 0000000000..c72f29027d --- /dev/null +++ b/generate/templates/manual/include/nodegit_wrapper.h @@ -0,0 +1,94 @@ +#ifndef NODEGIT_WRAPPER_H +#define NODEGIT_WRAPPER_H + +#include +#include + +#include "tracker_wrap.h" +#include "cleanup_handle.h" + +// the Traits template parameter supplies: +// typename cppClass - the C++ type of the NodeGit wrapper (e.g. GitRepository) +// typename cType - the C type of the libgit2 object being wrapped (e.g. git_repository) +// +// static const bool isDuplicable +// static void duplicate(cType **dest, cType *src) - duplicates src using dupFunction or cpyFunction +// +// static const bool isFreeable +// static void free(cType *raw) - frees the object using freeFunctionName +// +// nodegit::TrackerWrap allows for cheap tracking of new objects, avoiding searchs +// in a container to remove the tracking of a specific object. + +namespace nodegit { + class Context; +} + +template +class NodeGitWrapper : public nodegit::TrackerWrap { +public: + // replicate Traits typedefs for ease of use + typedef typename Traits::cType cType; + typedef typename Traits::cppClass cppClass; + + // whether raw should be freed on destruction + // TODO: this should be protected but we have a few use cases that change this to + // false from the outside. I suspect it gets turned to false to avoid + // double-free problems in cases like when we pass cred objects to libgit2 + // and it frees them. We should probably be NULLing raw in that case + // (and through a method) instead of changing selfFreeing, but that's + // a separate issue. + bool selfFreeing; + + nodegit::Context *nodegitContext = nullptr; + +protected: + cType *raw; + std::vector> childCleanupVector; + + // owner of the object, in the memory management sense. only populated + // when using ownedByThis, and the type doesn't have a dupFunction + // CopyablePersistentTraits are used to get the reset-on-destruct behavior. + Nan::Persistent > owner; + + // diagnostic count of self-freeing object instances + thread_local static int SelfFreeingInstanceCount; + // diagnostic count of constructed non-self-freeing object instances + thread_local static int NonSelfFreeingConstructedCount; + + static void InitializeTemplate(v8::Local &tpl); + + NodeGitWrapper(cType *raw, bool selfFreeing, v8::Local owner); + NodeGitWrapper(const char *error); // calls ThrowError + NodeGitWrapper(const NodeGitWrapper &) = delete; + NodeGitWrapper(NodeGitWrapper &&) = delete; + NodeGitWrapper &operator=(const NodeGitWrapper &) = delete; + NodeGitWrapper &operator=(NodeGitWrapper &&) = delete; + ~NodeGitWrapper(); + + static NAN_METHOD(JSNewFunction); + + static NAN_METHOD(GetSelfFreeingInstanceCount); + static NAN_METHOD(GetNonSelfFreeingConstructedCount); + + void SetNativeOwners(v8::Local owners); + +public: + static v8::Local New(const cType *raw, bool selfFreeing, v8::Local owner = v8::Local()); + + void SaveCleanupHandle(std::shared_ptr cleanupHandle); + + void Reference(); + void Unreference(); + + void AddReferenceCallbacks(size_t, std::function, std::function); + + cType *GetValue(); + void ClearValue(); + +private: + std::unordered_map> referenceCallbacks; + std::unordered_map> unreferenceCallbacks; +}; + +#endif diff --git a/generate/templates/manual/include/promise_completion.h b/generate/templates/manual/include/promise_completion.h new file mode 100644 index 0000000000..da933b7de3 --- /dev/null +++ b/generate/templates/manual/include/promise_completion.h @@ -0,0 +1,42 @@ +#ifndef PROMISE_COMPLETION +#define PROMISE_COMPLETION + +#include + +#include "async_baton.h" +#include "context.h" + +// PromiseCompletion forwards either the resolved result or the rejection reason +// to the native layer, once the promise completes +// +// inherits ObjectWrap so it can be used in v8 and managed by the garbage collector +// it isn't wired up to be instantiated or accessed from the JS layer other than +// for the purpose of promise result forwarding +class PromiseCompletion : public Nan::ObjectWrap +{ + // callback type called when a promise completes + typedef void (*Callback) (bool isFulfilled, nodegit::AsyncBaton *baton, v8::Local resultOfPromise); + + static NAN_METHOD(New); + static NAN_METHOD(PromiseFulfilled); + static NAN_METHOD(PromiseRejected); + + static v8::Local Bind(v8::Local method, v8::Local object); + static void CallCallback(bool isFulfilled, const Nan::FunctionCallbackInfo &info); + + // callback and baton stored for the promise that this PromiseCompletion is + // attached to. when the promise completes, the callback will be called with + // the result, and the stored baton. + Callback callback; + nodegit::AsyncBaton *baton; + + void Setup(v8::Local thenFn, v8::Local result, nodegit::AsyncBaton *baton, Callback callback); +public: + // If result is a promise, this will instantiate a new PromiseCompletion + // and have it forward the promise result / reason via the baton and callback + static bool ForwardIfPromise(v8::Local result, nodegit::AsyncBaton *baton, Callback callback); + + static void InitializeComponent(nodegit::Context *nodegitContext); +}; + +#endif diff --git a/generate/templates/manual/include/reference_counter.h b/generate/templates/manual/include/reference_counter.h new file mode 100644 index 0000000000..2afa2310c7 --- /dev/null +++ b/generate/templates/manual/include/reference_counter.h @@ -0,0 +1,30 @@ +#ifndef REFERENCE_COUNTER_H +#define REFERENCE_COUNTER_H + +#include + +#include "lock_master.h" + +// There are certain instances in libgit2 which can be retrieved from multiple sources +// We need to make sure that we're counting how many times we've seen that pointer +// so that when we are performing free behavior, we don't free it until it is no longer +// referenced. The main example of this behavior is the repository instance, where +// after git_repository_open open (first instance) we can git_commit_lookup, followed by +// git_commit_owner (second instance). +// +// I was hoping that we could construct a Persistent handle, but that would interfere with +// GC. We want it to attmept to GC, and if this handle exists, the final repo will not +// free itself :(. +// +// Make sure to utilize LockMaster when incrementing or decrementing a reference count. +class ReferenceCounter { +public: + static void incrementCountForPointer(void *ptr); + + static unsigned long decrementCountForPointer(void *ptr); + +private: + static std::unordered_map referenceCountByPointer; +}; + +#endif diff --git a/generate/templates/manual/include/str_array_converter.h b/generate/templates/manual/include/str_array_converter.h index c0df65fc93..d5edd61872 100644 --- a/generate/templates/manual/include/str_array_converter.h +++ b/generate/templates/manual/include/str_array_converter.h @@ -11,11 +11,13 @@ using namespace v8; class StrArrayConverter { public: - static git_strarray *Convert (Handle val); + static git_strarray *Convert (v8::Local val); + static void ConvertInto(git_strarray *out, v8::Local val); + static void ConvertInto(git_strarray *out, v8::Local val); private: - static git_strarray *ConvertArray(Array *val); - static git_strarray *ConvertString(Handle val); + static git_strarray *ConvertArray(v8::Local val); + static git_strarray *ConvertString(v8::Local val); static git_strarray *AllocStrArray(const size_t count); static git_strarray *ConstructStrArray(int argc, char** argv); }; diff --git a/generate/templates/manual/include/thread_pool.h b/generate/templates/manual/include/thread_pool.h new file mode 100644 index 0000000000..4653e80795 --- /dev/null +++ b/generate/templates/manual/include/thread_pool.h @@ -0,0 +1,84 @@ +#ifndef THREAD_POOL_H +#define THREAD_POOL_H + +#include +#include +#include +#include + +#include "async_worker.h" + +// Temporary workaround for LFS checkout. Comment added to be reverted. +// With the threadpool rewrite, a Worker will execute its callbacks with +// objects temporary unlock (to prevent deadlocks), and we'll wait until +// the callback is done to lock them back again (to make sure it's thread-safe). +// LFS checkout lost performance after this, and the proper way to fix it is +// to integrate nodegit-lfs into nodegit. Until this is implemented, a +// temporary workaround has been applied, which affects only Workers leveraging +// threaded libgit2 functions (at the moment only checkout) and does the +// following: +// - do not wait for the current callback to end, so that it can send the +// next callback to the main JS thread. +// - do not temporary unlock the objects, since they would be locked back +// again before the callback is executed. + +namespace nodegit { + class Context; + class AsyncContextCleanupHandle; + class ThreadPoolImpl; + + class ThreadPool { + public: + typedef std::function Callback; + typedef std::function QueueCallbackFn; + // Temporary workaround for LFS checkout. Code modified to be reverted. + // typedef std::function OnPostCallbackFn; + typedef std::function OnPostCallbackFn; + + // Initializes thread pool and spins up the requested number of threads + // The provided loop will be used for completion callbacks, whenever + // queued work is completed + ThreadPool(int numberOfThreads, uv_loop_t *loop, nodegit::Context *context); + + ThreadPool(const ThreadPool &) = delete; + ThreadPool(ThreadPool &&) = delete; + ThreadPool &operator=(const ThreadPool &) = delete; + ThreadPool &operator=(ThreadPool &&) = delete; + + ~ThreadPool(); + + // Queues work on the thread pool, followed by completion call scheduled + // on the loop provided in the constructor. + // QueueWork should be called on the loop provided in the constructor. + void QueueWorker(nodegit::AsyncWorker *worker); + + // When an AsyncWorker is being executed, the threads involved in executing + // will ensure that this is set to the AsyncResource belonging to the AsyncWorker. + // This ensures that any callbacks from libgit2 take the correct AsyncResource + // when scheduling work on the JS thread. + static Nan::AsyncResource *GetCurrentAsyncResource(); + + // Same as GetCurrentAsyncResource, except used to ensure callbacks occur + // in the correct context. + static const nodegit::Context *GetCurrentContext(); + + // Same as GetCurrentAsyncResource, except used for callbacks to store errors + // for use after completion of async work + static Nan::Global *GetCurrentCallbackErrorHandle(); + + // Queues a callback on the loop provided in the constructor + static void PostCallbackEvent(OnPostCallbackFn onPostCallback); + + // Called once at libgit2 initialization to setup contracts with libgit2 + static void InitializeGlobal(); + + // Will asynchronously shutdown the thread pool + // It will also clean up any resources that the thread pool is keeping alive + void Shutdown(std::unique_ptr cleanupHandle); + + private: + std::unique_ptr impl; + }; +} + +#endif diff --git a/generate/templates/manual/include/tracker_wrap.h b/generate/templates/manual/include/tracker_wrap.h new file mode 100644 index 0000000000..3b15eba424 --- /dev/null +++ b/generate/templates/manual/include/tracker_wrap.h @@ -0,0 +1,76 @@ +#ifndef TRACKERWRAP_H +#define TRACKERWRAP_H + +#include +#include +#include + +namespace nodegit { + // Base class used to track wrapped objects, so that we can + // free the objects that were not freed at the time of context + // closing (because their WeakCallback didn't trigger. See + // https://github.com/nodejs/help/issues/3297). + // Implementation based on node.js's class RefTracker (napi). + class TrackerWrap : public Nan::ObjectWrap { + public: + TrackerWrap() = default; + virtual ~TrackerWrap() = default; + TrackerWrap(const TrackerWrap &other) = delete; + TrackerWrap(TrackerWrap &&other) = delete; + TrackerWrap& operator=(const TrackerWrap &other) = delete; + TrackerWrap& operator=(TrackerWrap &&other) = delete; + + // aliases: + // 'TrackerList': used in functionality related to a list. + // 'TrackerWrap' used in functionality not related to a list. + using TrackerList = TrackerWrap; + + // Links 'this' right after 'listStart' + inline void Link(TrackerList* listStart) { + m_prev = listStart; + m_next = listStart->m_next; + if (m_next != nullptr) { + m_next->m_prev = this; + } + listStart->m_next = this; + } + + // Unlinks itself from the list it's linked to + inline TrackerWrap* Unlink() { + if (m_prev != nullptr) { + m_prev->m_next = m_next; + } + if (m_next != nullptr) { + m_next->m_prev = m_prev; + } + m_prev = nullptr; + m_next = nullptr; + return this; + } + + inline void SetTrackerWrapOwners(std::unique_ptr< std::vector > &&owners) { + m_owners = std::move(owners); + } + + inline const std::vector* GetTrackerWrapOwners() const { + return m_owners.get(); + } + + // Unlinks and returns the first item of 'listStart' + static TrackerWrap* UnlinkFirst(TrackerList *listStart); + + // Returns number of items following 'listStart' + static int SizeFromList(TrackerList *listStart); + + // Deletes items following 'listStart', but not 'listStart' itself + static void DeleteFromList(TrackerList *listStart); + + private: + TrackerList* m_next {}; + TrackerList* m_prev {}; + // m_owners will store pointers to native objects + std::unique_ptr< std::vector > m_owners {}; + }; +} + +#endif diff --git a/generate/templates/manual/include/typedefs.h b/generate/templates/manual/include/typedefs.h new file mode 100644 index 0000000000..a1fe6311cf --- /dev/null +++ b/generate/templates/manual/include/typedefs.h @@ -0,0 +1,8 @@ +#ifndef TYPEDEFS_H +#define TYPEDEFS_H + +#include "git2/submodule.h" + +typedef int (*git_submodule_cb)(git_submodule *sm, const char *name, void *payload); + +#endif diff --git a/generate/templates/manual/include/v8_helpers.h b/generate/templates/manual/include/v8_helpers.h new file mode 100644 index 0000000000..184b8d31b1 --- /dev/null +++ b/generate/templates/manual/include/v8_helpers.h @@ -0,0 +1,10 @@ +#ifndef NODEGIT_V8_HELPERS_H +#define NODEGIT_V8_HELPERS_H + +#include + +namespace nodegit { + v8::Local safeGetField(v8::Local &containerObj, std::string fieldName); +} + +#endif diff --git a/generate/templates/manual/include/worker_pool.h b/generate/templates/manual/include/worker_pool.h new file mode 100644 index 0000000000..3380c87060 --- /dev/null +++ b/generate/templates/manual/include/worker_pool.h @@ -0,0 +1,180 @@ +#ifndef WORK_POOL_H +#define WORK_POOL_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/** + * \class WorkItem + * Abstract class for work items in the WorkerPool. + */ +class WorkItem +{ +public: + WorkItem() = default; + virtual ~WorkItem() = default; + WorkItem(const WorkItem &other) = default; + WorkItem(WorkItem &&other) = default; + WorkItem& operator=(const WorkItem &other) = default; + WorkItem& operator=(WorkItem &&other) = default; +}; + +/** + * \class Worker + * Interface for Workers in the WorkerPool. + */ +class IWorker +{ +public: + IWorker() = default; + virtual ~IWorker() = default; + IWorker(const IWorker &other) = delete; + IWorker(IWorker &&other) = delete; + IWorker& operator=(const IWorker &other) = delete; + IWorker& operator=(IWorker &&other) = delete; + + virtual bool Initialize() = 0; + virtual bool Execute(std::unique_ptr &&work) = 0; +}; + +/* Enumeration describing the Worker Pool Status: +* - kOk: everything ok. +* - kInitializeFailed: a worker thread failed when calling Initialize(). +* - kExecuteFailed: a worker thread failed when calling Execute(). +* - kShutdownEarly: InsertWork() was called but the worker pool was stopped. +*/ +enum class WPStatus {kOk, kInitializeFailed, kExecuteFailed, kShutdownEarly}; + +/** + * \class WorkerPool + * To leverage this class, a Worker must inherit from IWorker. + * WorkItem is an abstract class from which to inherit too. + */ +template +class WorkerPool { +public: + WorkerPool(); + ~WorkerPool() = default; + WorkerPool(const WorkerPool &other) = delete; + WorkerPool(WorkerPool &&other) = delete; + WorkerPool& operator=(const WorkerPool &other) = delete; + WorkerPool& operator=(WorkerPool &&other) = delete; + + void Init(std::vector< std::shared_ptr > workers); + void InsertWork(std::unique_ptr &&work); + void Shutdown(); + WPStatus Status() { return m_atomicWPStatus; } + +private: + void DoWork(std::shared_ptr worker); + + std::mutex m_mutex {}; // locks m_workQueue and m_stop + std::condition_variable m_condition {}; + std::queue< std::unique_ptr > m_workQueue {}; + bool m_stop {true}; // initially the workpool has no worker threads + std::vector> m_threads {}; + std::atomic m_atomicWPStatus {WPStatus::kOk}; +}; + + +template +WorkerPool::WorkerPool() { + static_assert(std::is_base_of::value, "Worker must inherit from IWorker"); +} + +// launches the worker threads, if they hadn't been launched already +template +void WorkerPool::Init(std::vector< std::shared_ptr > workers) +{ + { + std::lock_guard lock(m_mutex); + if (!m_stop) + return; + m_stop = false; + } + + std::for_each (workers.begin(), workers.end(), [this](std::shared_ptr worker) { + m_threads.emplace_back(std::make_unique(std::bind(&WorkerPool::DoWork, this, worker))); + }); +} + +// queues work, or sets WPStatus::kShutdownEarly +template +void WorkerPool::InsertWork(std::unique_ptr &&work) +{ + { + std::lock_guard lock(m_mutex); + if (m_stop) { + m_atomicWPStatus = WPStatus::kShutdownEarly; + return; + } + m_workQueue.emplace(std::move(work)); + } + m_condition.notify_one(); +} + +template +void WorkerPool::Shutdown() +{ + { + std::lock_guard lock(m_mutex); + if (m_stop) { + return; + } + m_stop = true; + } + m_condition.notify_all(); + + std::for_each (m_threads.begin(), m_threads.end(), [](std::unique_ptr &wt) { + if (wt->joinable()) { + wt->join(); + } + }); +} + +template +void WorkerPool::DoWork(std::shared_ptr worker) +{ + if (!worker->Initialize()) { + m_atomicWPStatus = WPStatus::kInitializeFailed; + return; + } + + while (true) { + std::unique_ptr work {}; + { + std::unique_lock lock(m_mutex); + m_condition.wait(lock, [this] { + return this->m_stop || !this->m_workQueue.empty(); + }); + + // stop all workers if any of them failed on Initialize() or Execute() + // or the workerPool shutdown early + if (Status() != WPStatus::kOk) { + return; + } + + if (m_stop && m_workQueue.empty()) { + return; + } + + work = std::move(m_workQueue.front()); + m_workQueue.pop(); + } + + if (!worker->Execute(std::move(work))) { + m_atomicWPStatus = WPStatus::kExecuteFailed; + return; + } + } +} + +#endif // WORK_POOL_H + diff --git a/generate/templates/manual/include/wrapper.h b/generate/templates/manual/include/wrapper.h index f429defbd7..f24ce800ba 100644 --- a/generate/templates/manual/include/wrapper.h +++ b/generate/templates/manual/include/wrapper.h @@ -9,18 +9,17 @@ #include #include "nan.h" +#include "context.h" using namespace node; using namespace v8; -class Wrapper : public ObjectWrap { +class Wrapper : public Nan::ObjectWrap { public: - - static Persistent constructor_template; - static void InitializeComponent (Handle target); + static void InitializeComponent (v8::Local target, nodegit::Context *nodegitContext); void *GetValue(); - static Handle New(void *raw); + static v8::Local New(const void *raw); private: Wrapper(void *raw); diff --git a/generate/templates/manual/libgit2/opts.cc b/generate/templates/manual/libgit2/opts.cc new file mode 100644 index 0000000000..5829adc6cd --- /dev/null +++ b/generate/templates/manual/libgit2/opts.cc @@ -0,0 +1,117 @@ +NAN_METHOD(GitLibgit2::Opts) +{ + Nan::EscapableHandleScope scope; + + if (info.Length() == 0 || !info[0]->IsNumber()) { + return Nan::ThrowError("Number option is required."); + } + + const int from_option = (int)info[0].As()->Value(); + + git_error_clear(); + + v8::Local to = Nan::Undefined(); + switch (from_option) { + // GET size_t + case GIT_OPT_GET_MWINDOW_SIZE: + case GIT_OPT_GET_MWINDOW_MAPPED_LIMIT: + case GIT_OPT_GET_PACK_MAX_OBJECTS: { + size_t option_value; + if (git_libgit2_opts(from_option, &option_value)) { + return Nan::ThrowError("git_libgit2_opts failed"); + } + to = Nan::New(option_value); + break; + } + // GET int + case GIT_OPT_GET_OWNER_VALIDATION: { + int option_value; + if (git_libgit2_opts(from_option, &option_value)) { + return Nan::ThrowError("git_libgit2_opts failed"); + } + to = Nan::New(option_value); + break; + } + // GET unsigned long + case GIT_OPT_GET_WINDOWS_SHAREMODE: { + unsigned long option_value; + if (git_libgit2_opts(from_option, &option_value)) { + return Nan::ThrowError("git_libgit2_opts failed"); + } + to = Nan::New(option_value); + break; + } + // GET ssize_t + case GIT_OPT_GET_CACHED_MEMORY: { + ssize_t option_value; + if (git_libgit2_opts(from_option, &option_value)) { + return Nan::ThrowError("git_libgit2_opts failed"); + } + to = Nan::New(option_value); + break; + } + // GET git_buf + case GIT_OPT_GET_TEMPLATE_PATH: + case GIT_OPT_GET_USER_AGENT: { + git_buf option_value = { 0 }; + if (git_libgit2_opts(from_option, &option_value)) { + return Nan::ThrowError("git_libgit2_opts failed"); + } + to = Nan::New(option_value.ptr, option_value.size) + .ToLocalChecked(); + git_buf_dispose(&option_value); + break; + } + case GIT_OPT_GET_SEARCH_PATH: { + git_buf option_value = { 0 }; + if (info.Length() < 2 || !info[1]->IsNumber()) { + return Nan::ThrowError("Number option is required."); + } + const int level = (int)info[1].As()->Value(); + if (git_libgit2_opts(from_option, level, &option_value)) { + return Nan::ThrowError("git_libgit2_opts failed"); + } + to = Nan::New(option_value.ptr, option_value.size) + .ToLocalChecked(); + git_buf_dispose(&option_value); + break; + } + // SET int + case GIT_OPT_ENABLE_CACHING: + case GIT_OPT_ENABLE_STRICT_OBJECT_CREATION: + case GIT_OPT_ENABLE_STRICT_SYMBOLIC_REF_CREATION: + case GIT_OPT_ENABLE_OFS_DELTA: + case GIT_OPT_ENABLE_FSYNC_GITDIR: + case GIT_OPT_ENABLE_STRICT_HASH_VERIFICATION: + case GIT_OPT_ENABLE_UNSAVED_INDEX_SAFETY: + case GIT_OPT_DISABLE_PACK_KEEP_FILE_CHECKS: + case GIT_OPT_SET_OWNER_VALIDATION: { + if (info.Length() < 2 || !info[1]->IsNumber()) { + return Nan::ThrowError("Number option is required."); + } + const int option_arg = (int)info[1].As()->Value(); + if (git_libgit2_opts(from_option, option_arg)) { + return Nan::ThrowError("git_libgit2_opts failed"); + } + break; + } + // SET size_t + case GIT_OPT_SET_MWINDOW_SIZE: + case GIT_OPT_SET_MWINDOW_MAPPED_LIMIT: + case GIT_OPT_SET_PACK_MAX_OBJECTS: { + if (info.Length() < 2 || !info[1]->IsNumber()) { + return Nan::ThrowError("Number option is required."); + } + const size_t option_arg = (size_t)info[1].As()->Value(); + if (git_libgit2_opts(from_option, option_arg)) { + return Nan::ThrowError("git_libgit2_opts failed"); + } + break; + } + default: { + return Nan::ThrowError("Unsupported option"); + } + } + + return info.GetReturnValue().Set(scope.Escape(to)); +} diff --git a/generate/templates/manual/patches/convenient_patches.cc b/generate/templates/manual/patches/convenient_patches.cc new file mode 100644 index 0000000000..8873fe07c8 --- /dev/null +++ b/generate/templates/manual/patches/convenient_patches.cc @@ -0,0 +1,205 @@ +NAN_METHOD(GitPatch::ConvenientFromDiff) { + if (info.Length() == 0 || !info[0]->IsObject()) { + return Nan::ThrowError("Diff diff is required."); + } + + if (!info[info.Length() - 1]->IsFunction()) { + return Nan::ThrowError("Callback is required and must be a Function."); + } + + ConvenientFromDiffBaton *baton = new ConvenientFromDiffBaton(); + + baton->error_code = GIT_OK; + baton->error = NULL; + + baton->diff = Nan::ObjectWrap::Unwrap(Nan::To(info[0]).ToLocalChecked())->GetValue(); + + if (info[1]->IsArray()) { + v8::Local context = Nan::GetCurrentContext(); + const v8::Local indexesArray = info[1].As(); + const uint32_t numIndexes = indexesArray->Length(); + + for (uint32_t i = 0; i < numIndexes; ++i) { + v8::Local value = indexesArray->Get(context, i).ToLocalChecked(); + int idx = value.As()->Value(); + baton->indexes.push_back(idx); + } + } + + baton->out = new std::vector; + baton->out->reserve(git_diff_num_deltas(baton->diff)); + + Nan::Callback *callback = new Nan::Callback(Local::Cast(info[info.Length() - 1])); + std::map> cleanupHandles; + ConvenientFromDiffWorker *worker = new ConvenientFromDiffWorker(baton, callback, cleanupHandles); + + worker->Reference("diff", info[0]); + + nodegit::Context *nodegitContext = reinterpret_cast(info.Data().As()->Value()); + nodegitContext->QueueWorker(worker); + return; +} + +nodegit::LockMaster GitPatch::ConvenientFromDiffWorker::AcquireLocks() { + nodegit::LockMaster lockMaster(true, baton->diff); + return lockMaster; +} + +void GitPatch::ConvenientFromDiffWorker::Execute() { + git_error_clear(); + + std::vector patchesToBeFreed; + + if (baton->indexes.size() > 0) { + for (int idx : baton->indexes) { + git_patch *nextPatch; + int result = git_patch_from_diff(&nextPatch, baton->diff, idx); + + if (result) { + while (!patchesToBeFreed.empty()) + { + git_patch_free(patchesToBeFreed.back()); + patchesToBeFreed.pop_back(); + } + + while (!baton->out->empty()) { + PatchDataFree(baton->out->back()); + baton->out->pop_back(); + } + + baton->error_code = result; + + if (git_error_last()->klass != GIT_ERROR_NONE) { + baton->error = git_error_dup(git_error_last()); + } + + delete baton->out; + baton->out = NULL; + + return; + } + + if (nextPatch != NULL) { + baton->out->push_back(createFromRaw(nextPatch)); + patchesToBeFreed.push_back(nextPatch); + } + } + } else { + for (std::size_t i = 0; i < git_diff_num_deltas(baton->diff); ++i) { + git_patch *nextPatch; + int result = git_patch_from_diff(&nextPatch, baton->diff, i); + + if (result) { + while (!patchesToBeFreed.empty()) + { + git_patch_free(patchesToBeFreed.back()); + patchesToBeFreed.pop_back(); + } + + while (!baton->out->empty()) { + PatchDataFree(baton->out->back()); + baton->out->pop_back(); + } + + baton->error_code = result; + + if (git_error_last()->klass != GIT_ERROR_NONE) { + baton->error = git_error_dup(git_error_last()); + } + + delete baton->out; + baton->out = NULL; + + return; + } + + if (nextPatch != NULL) { + baton->out->push_back(createFromRaw(nextPatch)); + patchesToBeFreed.push_back(nextPatch); + } + } + } + + while (!patchesToBeFreed.empty()) + { + git_patch_free(patchesToBeFreed.back()); + patchesToBeFreed.pop_back(); + } +} + +void GitPatch::ConvenientFromDiffWorker::HandleErrorCallback() { + if (baton->error) { + if (baton->error->message) { + free((void *)baton->error->message); + } + + free((void *)baton->error); + } + + while (!baton->out->empty()) { + PatchDataFree(baton->out->back()); + baton->out->pop_back(); + } + + delete baton->out; + + delete baton; +} + +void GitPatch::ConvenientFromDiffWorker::HandleOKCallback() { + if (baton->out != NULL) { + unsigned int size = baton->out->size(); + Local result = Nan::New(size); + + for (unsigned int i = 0; i < size; ++i) { + Nan::Set(result, Nan::New(i), ConvenientPatch::New((void *)baton->out->at(i))); + } + + delete baton->out; + + Local argv[2] = { + Nan::Null(), + result + }; + callback->Call(2, argv, async_resource); + + return; + } + + if (baton->error) { + Local err; + if (baton->error->message) { + err = Nan::To(Nan::Error(baton->error->message)).ToLocalChecked(); + } else { + err = Nan::To(Nan::Error("Method convenientFromDiff has thrown an error.")).ToLocalChecked(); + } + Nan::Set(err, Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); + Nan::Set(err, Nan::New("errorFunction").ToLocalChecked(), Nan::New("Patch.convenientFromDiff").ToLocalChecked()); + Local argv[1] = { + err + }; + callback->Call(1, argv, async_resource); + if (baton->error->message) + { + free((void *)baton->error->message); + } + + free((void *)baton->error); + + return; + } + + if (baton->error_code < 0) { + Local err = Nan::To(Nan::Error("method convenientFromDiff has thrown an error.")).ToLocalChecked(); + Nan::Set(err, Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); + Nan::Set(err, Nan::New("errorFunction").ToLocalChecked(), Nan::New("Patch.convenientFromDiff").ToLocalChecked()); + Local argv[1] = { + err + }; + callback->Call(1, argv, async_resource); + + return; + } + + Nan::Call(*callback, 0, NULL); +} diff --git a/generate/templates/manual/remote/ls.cc b/generate/templates/manual/remote/ls.cc new file mode 100644 index 0000000000..97c801c629 --- /dev/null +++ b/generate/templates/manual/remote/ls.cc @@ -0,0 +1,116 @@ +NAN_METHOD(GitRemote::ReferenceList) +{ + if (!info[info.Length() - 1]->IsFunction()) { + return Nan::ThrowError("Callback is required and must be a Function."); + } + + ReferenceListBaton* baton = new ReferenceListBaton(); + + baton->error_code = GIT_OK; + baton->error = NULL; + baton->out = new std::vector; + baton->remote = Nan::ObjectWrap::Unwrap(info.This())->GetValue(); + + Nan::Callback *callback = new Nan::Callback(Local::Cast(info[info.Length() - 1])); + std::map> cleanupHandles; + ReferenceListWorker *worker = new ReferenceListWorker(baton, callback, cleanupHandles); + worker->Reference("remote", info.This()); + nodegit::Context *nodegitContext = reinterpret_cast(info.Data().As()->Value()); + nodegitContext->QueueWorker(worker); + return; +} + +nodegit::LockMaster GitRemote::ReferenceListWorker::AcquireLocks() { + nodegit::LockMaster lockMaster(true, baton->remote); + return lockMaster; +} + +void GitRemote::ReferenceListWorker::Execute() +{ + git_error_clear(); + + const git_remote_head **remote_heads; + size_t num_remote_heads; + baton->error_code = git_remote_ls( + &remote_heads, + &num_remote_heads, + baton->remote + ); + + if (baton->error_code != GIT_OK) { + baton->error = git_error_dup(git_error_last()); + delete baton->out; + baton->out = NULL; + return; + } + + baton->out->reserve(num_remote_heads); + + for (size_t head_index = 0; head_index < num_remote_heads; ++head_index) { + git_remote_head *remote_head = git_remote_head_dup(remote_heads[head_index]); + baton->out->push_back(remote_head); + } +} + +void GitRemote::ReferenceListWorker::HandleErrorCallback() { + if (baton->error) { + if (baton->error->message) { + free((void *)baton->error->message); + } + + free((void *)baton->error); + } + + delete baton->out; + + delete baton; +} + +void GitRemote::ReferenceListWorker::HandleOKCallback() +{ + if (baton->out != NULL) + { + unsigned int size = baton->out->size(); + Local result = Nan::New(size); + for (unsigned int i = 0; i < size; i++) { + Nan::Set(result, Nan::New(i), GitRemoteHead::New(baton->out->at(i), true)); + } + + delete baton->out; + + Local argv[2] = { + Nan::Null(), + result + }; + callback->Call(2, argv, async_resource); + } + else if (baton->error) + { + Local argv[1] = { + Nan::Error(baton->error->message) + }; + callback->Call(1, argv, async_resource); + if (baton->error->message) + { + free((void *)baton->error->message); + } + + free((void *)baton->error); + } + else if (baton->error_code < 0) + { + Local err = Nan::To(Nan::Error("Reference List has thrown an error.")).ToLocalChecked(); + Nan::Set(err, Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); + Nan::Set(err, Nan::New("errorFunction").ToLocalChecked(), Nan::New("Remote.referenceList").ToLocalChecked()); + Local argv[1] = { + err + }; + callback->Call(1, argv, async_resource); + } + else + { + callback->Call(0, NULL, async_resource); + } + + delete baton; +} diff --git a/generate/templates/manual/repository/get_references.cc b/generate/templates/manual/repository/get_references.cc new file mode 100644 index 0000000000..56bc12ac34 --- /dev/null +++ b/generate/templates/manual/repository/get_references.cc @@ -0,0 +1,162 @@ +NAN_METHOD(GitRepository::GetReferences) +{ + if (!info[info.Length() - 1]->IsFunction()) { + return Nan::ThrowError("Callback is required and must be a Function."); + } + + GetReferencesBaton* baton = new GetReferencesBaton(); + + baton->error_code = GIT_OK; + baton->error = NULL; + baton->out = new std::vector; + baton->repo = Nan::ObjectWrap::Unwrap(info.This())->GetValue(); + + Nan::Callback *callback = new Nan::Callback(Local::Cast(info[info.Length() - 1])); + std::map> cleanupHandles; + GetReferencesWorker *worker = new GetReferencesWorker(baton, callback, cleanupHandles); + worker->Reference("repo", info.This()); + nodegit::Context *nodegitContext = reinterpret_cast(info.Data().As()->Value()); + nodegitContext->QueueWorker(worker); + return; +} + +nodegit::LockMaster GitRepository::GetReferencesWorker::AcquireLocks() { + nodegit::LockMaster lockMaster(true, baton->repo); + return lockMaster; +} + +void GitRepository::GetReferencesWorker::Execute() +{ + giterr_clear(); + + git_repository *repo = baton->repo; + + git_strarray reference_names; + baton->error_code = git_reference_list(&reference_names, repo); + + if (baton->error_code != GIT_OK) { + if (giterr_last() != NULL) { + baton->error = git_error_dup(giterr_last()); + } + delete baton->out; + baton->out = NULL; + return; + } + + for (size_t reference_index = 0; reference_index < reference_names.count; ++reference_index) { + git_reference *reference; + baton->error_code = git_reference_lookup(&reference, repo, reference_names.strings[reference_index]); + + // stop execution and return if there is an error + if (baton->error_code != GIT_OK) { + if (giterr_last() != NULL) { + baton->error = git_error_dup(giterr_last()); + } + + // unwind and return + while (baton->out->size()) { + git_reference *referenceToFree = baton->out->back(); + baton->out->pop_back(); + git_reference_free(referenceToFree); + } + + git_strarray_free(&reference_names); + delete baton->out; + baton->out = NULL; + return; + } + + if (git_reference_type(reference) == GIT_REF_SYMBOLIC) { + git_reference *resolved_reference; + int resolve_result = git_reference_resolve(&resolved_reference, reference); + git_reference_free(reference); + + // if we can't resolve the ref, then just ignore it + if (resolve_result == GIT_OK) { + baton->out->push_back(resolved_reference); + } + } else { + baton->out->push_back(reference); + } + } + + git_strarray_free(&reference_names); +} + +void GitRepository::GetReferencesWorker::HandleErrorCallback() { + if (baton->error) { + if (baton->error->message) { + free((void *)baton->error->message); + } + + free((void *)baton->error); + } + + while (baton->out->size()) { + git_reference *referenceToFree = baton->out->back(); + baton->out->pop_back(); + git_reference_free(referenceToFree); + } + + delete baton->out; + + delete baton; +} + +void GitRepository::GetReferencesWorker::HandleOKCallback() +{ + if (baton->out != NULL) + { + unsigned int size = baton->out->size(); + Local result = Nan::New(size); + for (unsigned int i = 0; i < size; i++) { + git_reference *reference = baton->out->at(i); + Nan::Set( + result, + Nan::New(i), + GitRefs::New( + reference, + true, + Nan::To(GitRepository::New(git_reference_owner(reference), true)).ToLocalChecked() + ) + ); + } + + delete baton->out; + + Local argv[2] = { + Nan::Null(), + result + }; + callback->Call(2, argv, async_resource); + } + else if (baton->error) + { + Local argv[1] = { + Nan::Error(baton->error->message) + }; + callback->Call(1, argv, async_resource); + if (baton->error->message) + { + free((void *)baton->error->message); + } + + free((void *)baton->error); + } + else if (baton->error_code < 0) + { + Local err = Nan::To(Nan::Error("Repository getReferences has thrown an error.")).ToLocalChecked(); + Nan::Set(err, Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); + Nan::Set(err, Nan::New("errorFunction").ToLocalChecked(), Nan::New("Repository.getReferences").ToLocalChecked()); + Local argv[1] = { + err + }; + callback->Call(1, argv, async_resource); + } + else + { + callback->Call(0, NULL, async_resource); + } + + delete baton; +} diff --git a/generate/templates/manual/repository/get_remotes.cc b/generate/templates/manual/repository/get_remotes.cc new file mode 100644 index 0000000000..a7c316bb0e --- /dev/null +++ b/generate/templates/manual/repository/get_remotes.cc @@ -0,0 +1,161 @@ +NAN_METHOD(GitRepository::GetRemotes) +{ + if (!info[info.Length() - 1]->IsFunction()) { + return Nan::ThrowError("Callback is required and must be a Function."); + } + + GetRemotesBaton* baton = new GetRemotesBaton(); + + baton->error_code = GIT_OK; + baton->error = NULL; + baton->out = new std::vector; + baton->repo = Nan::ObjectWrap::Unwrap(info.This())->GetValue(); + + Nan::Callback *callback = new Nan::Callback(Local::Cast(info[info.Length() - 1])); + std::map> cleanupHandles; + GetRemotesWorker *worker = new GetRemotesWorker(baton, callback, cleanupHandles); + worker->Reference("repo", info.This()); + nodegit::Context *nodegitContext = reinterpret_cast(info.Data().As()->Value()); + nodegitContext->QueueWorker(worker); + return; +} + +nodegit::LockMaster GitRepository::GetRemotesWorker::AcquireLocks() { + nodegit::LockMaster lockMaster(true); + return lockMaster; +} + +void GitRepository::GetRemotesWorker::Execute() +{ + giterr_clear(); + + git_repository *repo = baton->repo; + + if (baton->error_code != GIT_OK) { + if (giterr_last() != NULL) { + baton->error = git_error_dup(giterr_last()); + } + delete baton->out; + baton->out = NULL; + return; + } + + git_strarray remote_names; + baton->error_code = git_remote_list(&remote_names, repo); + + if (baton->error_code != GIT_OK) { + if (giterr_last() != NULL) { + baton->error = git_error_dup(giterr_last()); + } + + delete baton->out; + baton->out = NULL; + return; + } + + for (size_t remote_index = 0; remote_index < remote_names.count; ++remote_index) { + git_remote *remote; + baton->error_code = git_remote_lookup(&remote, repo, remote_names.strings[remote_index]); + + // stop execution and return if there is an error + if (baton->error_code != GIT_OK) { + if (giterr_last() != NULL) { + baton->error = git_error_dup(giterr_last()); + } + + // unwind and return + while (baton->out->size()) { + git_remote *remoteToFree = baton->out->back(); + baton->out->pop_back(); + git_remote_free(remoteToFree); + } + + git_strarray_free(&remote_names); + delete baton->out; + baton->out = NULL; + return; + } + + baton->out->push_back(remote); + } + + git_strarray_free(&remote_names); +} + +void GitRepository::GetRemotesWorker::HandleErrorCallback() { + if (baton->error) { + if (baton->error->message) { + free((void *)baton->error->message); + } + + free((void *)baton->error); + } + + while (baton->out->size()) { + git_remote *remoteToFree = baton->out->back(); + baton->out->pop_back(); + git_remote_free(remoteToFree); + } + + delete baton->out; + + delete baton; +} + +void GitRepository::GetRemotesWorker::HandleOKCallback() +{ + if (baton->out != NULL) + { + unsigned int size = baton->out->size(); + Local result = Nan::New(size); + for (unsigned int i = 0; i < size; i++) { + git_remote *remote = baton->out->at(i); + Nan::Set( + result, + Nan::New(i), + GitRemote::New( + remote, + true, + Nan::To(GitRepository::New(git_remote_owner(remote), true)).ToLocalChecked() + ) + ); + } + + delete baton->out; + + Local argv[2] = { + Nan::Null(), + result + }; + callback->Call(2, argv, async_resource); + } + else if (baton->error) + { + Local argv[1] = { + Nan::Error(baton->error->message) + }; + callback->Call(1, argv, async_resource); + if (baton->error->message) + { + free((void *)baton->error->message); + } + + free((void *)baton->error); + } + else if (baton->error_code < 0) + { + Local err = Nan::To(Nan::Error("Repository refreshRemotes has thrown an error.")).ToLocalChecked(); + Nan::Set(err, Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); + Nan::Set(err, Nan::New("errorFunction").ToLocalChecked(), Nan::New("Repository.refreshRemotes").ToLocalChecked()); + Local argv[1] = { + err + }; + callback->Call(1, argv, async_resource); + } + else + { + callback->Call(0, NULL, async_resource); + } + + delete baton; +} diff --git a/generate/templates/manual/repository/get_submodules.cc b/generate/templates/manual/repository/get_submodules.cc new file mode 100644 index 0000000000..069f6bdbc8 --- /dev/null +++ b/generate/templates/manual/repository/get_submodules.cc @@ -0,0 +1,141 @@ +NAN_METHOD(GitRepository::GetSubmodules) +{ + if (!info[info.Length() - 1]->IsFunction()) { + return Nan::ThrowError("Callback is required and must be a Function."); + } + + GetSubmodulesBaton* baton = new GetSubmodulesBaton(); + + baton->error_code = GIT_OK; + baton->error = NULL; + baton->out = new std::vector; + baton->repo = Nan::ObjectWrap::Unwrap(info.This())->GetValue(); + + Nan::Callback *callback = new Nan::Callback(Local::Cast(info[info.Length() - 1])); + std::map> cleanupHandles; + GetSubmodulesWorker *worker = new GetSubmodulesWorker(baton, callback, cleanupHandles); + worker->Reference("repo", info.This()); + nodegit::Context *nodegitContext = reinterpret_cast(info.Data().As()->Value()); + nodegitContext->QueueWorker(worker); + return; +} + +struct submodule_foreach_payload { + git_repository *repo; + std::vector *out; +}; + +int foreachSubmoduleCB(git_submodule *submodule, const char *name, void *void_payload) { + submodule_foreach_payload *payload = (submodule_foreach_payload *)void_payload; + git_submodule *out; + + int result = git_submodule_lookup(&out, payload->repo, name); + if (result == GIT_OK) { + payload->out->push_back(out); + } + + return result; +} + +nodegit::LockMaster GitRepository::GetSubmodulesWorker::AcquireLocks() { + nodegit::LockMaster lockMaster(true, baton->repo); + return lockMaster; +} + +void GitRepository::GetSubmodulesWorker::Execute() +{ + giterr_clear(); + + submodule_foreach_payload payload { baton->repo, baton->out }; + baton->error_code = git_submodule_foreach(baton->repo, foreachSubmoduleCB, (void *)&payload); + + if (baton->error_code != GIT_OK) { + if (giterr_last() != NULL) { + baton->error = git_error_dup(giterr_last()); + } + + while (baton->out->size()) { + git_submodule_free(baton->out->back()); + baton->out->pop_back(); + } + delete baton->out; + baton->out = NULL; + } +} + +void GitRepository::GetSubmodulesWorker::HandleErrorCallback() { + if (baton->error) { + if (baton->error->message) { + free((void *)baton->error->message); + } + + free((void *)baton->error); + } + + while (baton->out->size()) { + git_submodule_free(baton->out->back()); + baton->out->pop_back(); + } + + delete baton->out; + + delete baton; +} + +void GitRepository::GetSubmodulesWorker::HandleOKCallback() +{ + if (baton->out != NULL) + { + unsigned int size = baton->out->size(); + Local result = Nan::New(size); + for (unsigned int i = 0; i < size; i++) { + git_submodule *submodule = baton->out->at(i); + Nan::Set( + result, + Nan::New(i), + GitSubmodule::New( + submodule, + true, + Nan::To(GitRepository::New(git_submodule_owner(submodule), true)).ToLocalChecked() + ) + ); + } + + delete baton->out; + + Local argv[2] = { + Nan::Null(), + result + }; + callback->Call(2, argv, async_resource); + } + else if (baton->error) + { + Local argv[1] = { + Nan::Error(baton->error->message) + }; + callback->Call(1, argv, async_resource); + if (baton->error->message) + { + free((void *)baton->error->message); + } + + free((void *)baton->error); + } + else if (baton->error_code < 0) + { + Local err = Nan::To(Nan::Error("Repository getSubmodules has thrown an error.")).ToLocalChecked(); + Nan::Set(err, Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); + Nan::Set(err, Nan::New("errorFunction").ToLocalChecked(), Nan::New("Repository.getSubmodules").ToLocalChecked()); + Local argv[1] = { + err + }; + callback->Call(1, argv, async_resource); + } + else + { + callback->Call(0, NULL, async_resource); + } + + delete baton; +} diff --git a/generate/templates/manual/repository/refresh_references.cc b/generate/templates/manual/repository/refresh_references.cc new file mode 100644 index 0000000000..5194f1c48c --- /dev/null +++ b/generate/templates/manual/repository/refresh_references.cc @@ -0,0 +1,712 @@ +int getOidOfReferenceCommit(git_oid *commitOid, git_reference *ref) { + git_object *commitObject; + int result = git_reference_peel(&commitObject, ref, GIT_OBJ_COMMIT); + + if (result != GIT_OK) { + return result; + } + + git_oid_cpy(commitOid, git_object_id(commitObject)); + git_object_free(commitObject); + return result; +} + +int asDirectReference(git_reference **out, git_reference *ref) { + if (git_reference_type(ref) != GIT_REF_SYMBOLIC) { + return git_reference_dup(out, ref); + } + + int error = git_reference_resolve(out, ref); + if (error != GIT_OK) { + *out = NULL; + } + + return GIT_OK; +} + +int lookupDirectReferenceByShorthand(git_reference **out, git_repository *repo, const char *shorthand) { + git_reference *ref = NULL; + int result = git_reference_dwim(&ref, repo, shorthand); + + if (result != GIT_OK) { + return result; + } + + result = asDirectReference(out, ref); + git_reference_free(ref); + return result; +} + +int lookupDirectReferenceByFullName(git_reference **out, git_repository *repo, const char *fullName) { + git_reference *ref = NULL; + int result = git_reference_lookup(&ref, repo, fullName); + + if (result != GIT_OK) { + return result; + } + + result = asDirectReference(out, ref); + git_reference_free(ref); + return result; +} + +char *getRemoteNameOfReference(git_reference *remoteReference) { + return strtok(strdup(git_reference_shorthand(remoteReference)), "/"); +} + +bool gitStrArrayContains(git_strarray *strarray, const char *string) { + for (size_t i = 0; i < strarray->count; ++i) { + if (strcmp(strarray->strings[i], string) == 0) { + return true; + } + } + return false; +} + +class RefreshedRefModel { +public: + RefreshedRefModel(git_reference *ref): + fullName(strdup(git_reference_name(ref))), + message(NULL), + sha(new char[GIT_OID_HEXSZ + 1]), + shorthand(strdup(git_reference_shorthand(ref))), + tagOdbBuffer(NULL), + tagOdbBufferLength(0), + type(NULL) + { + if (git_reference_is_branch(ref)) { + type = "branch"; + } else if (git_reference_is_remote(ref)) { + type = "remote"; + } else { + type = "tag"; + } + } + + RefreshedRefModel(const RefreshedRefModel &) = delete; + RefreshedRefModel(RefreshedRefModel &&) = delete; + RefreshedRefModel &operator=(const RefreshedRefModel &) = delete; + RefreshedRefModel &operator=(RefreshedRefModel &&) = delete; + + static int fromReference(RefreshedRefModel **out, git_reference *ref, git_odb *odb) { + RefreshedRefModel *refModel = new RefreshedRefModel(ref); + const git_oid *referencedTargetOid = git_reference_target(ref); + + if (!git_reference_is_tag(ref)) { + git_oid_tostr(refModel->sha, GIT_OID_HEXSZ + 1, referencedTargetOid); + + *out = refModel; + return GIT_OK; + } + git_repository *repo = git_reference_owner(ref); + + git_tag *referencedTag; + if (git_tag_lookup(&referencedTag, repo, referencedTargetOid) == GIT_OK) { + const char *tagMessage = git_tag_message(referencedTag); + refModel->message = tagMessage ? strdup(tagMessage) : NULL; + + git_odb_object *tagOdbObject; + if (git_odb_read(&tagOdbObject, odb, git_tag_id(referencedTag)) == GIT_OK) { + refModel->tagOdbBufferLength = git_odb_object_size(tagOdbObject); + refModel->tagOdbBuffer = new char[refModel->tagOdbBufferLength]; + std::memcpy(refModel->tagOdbBuffer, git_odb_object_data(tagOdbObject), refModel->tagOdbBufferLength); + git_odb_object_free(tagOdbObject); + } + + git_tag_free(referencedTag); + } + + git_oid peeledReferencedTargetOid; + int error = getOidOfReferenceCommit(&peeledReferencedTargetOid, ref); + if (error != GIT_OK) { + delete refModel; + return error; + } + + git_oid_tostr(refModel->sha, GIT_OID_HEXSZ + 1, &peeledReferencedTargetOid); + + *out = refModel; + return GIT_OK; + } + + static void ensureSignatureRegexes() { + if (!signatureRegexesBySignatureType.IsEmpty()) { + return; + } + + v8::Local gpgsigArray = Nan::New(2), + x509Array = Nan::New(1); + + Nan::Set( + gpgsigArray, + Nan::New(0), + Nan::New( + Nan::New("-----BEGIN PGP SIGNATURE-----[\\s\\S]+?-----END PGP SIGNATURE-----").ToLocalChecked(), + static_cast(v8::RegExp::Flags::kGlobal | v8::RegExp::Flags::kMultiline) + ).ToLocalChecked() + ); + + Nan::Set( + gpgsigArray, + Nan::New(1), + Nan::New( + Nan::New("-----BEGIN PGP MESSAGE-----[\\s\\S]+?-----END PGP MESSAGE-----").ToLocalChecked(), + static_cast(v8::RegExp::Flags::kGlobal | v8::RegExp::Flags::kMultiline) + ).ToLocalChecked() + ); + + Nan::Set( + x509Array, + Nan::New(0), + Nan::New( + Nan::New("-----BEGIN SIGNED MESSAGE-----[\\s\\S]+?-----END SIGNED MESSAGE-----").ToLocalChecked(), + static_cast(v8::RegExp::Flags::kGlobal | v8::RegExp::Flags::kMultiline) + ).ToLocalChecked() + ); + + v8::Local result = Nan::New(); + Nan::Set(result, Nan::New("gpgsig").ToLocalChecked(), gpgsigArray); + Nan::Set(result, Nan::New("x509").ToLocalChecked(), x509Array); + + signatureRegexesBySignatureType.Reset(result); + } + + v8::Local toJavascript(v8::Local signatureType) { + v8::Local result = Nan::New(); + + v8::Local jsFullName; + if (fullName == NULL) { + jsFullName = Nan::Null(); + } else { + jsFullName = Nan::New(fullName).ToLocalChecked(); + } + Nan::Set(result, Nan::New("fullName").ToLocalChecked(), jsFullName); + + v8::Local jsMessage; + if (message == NULL) { + jsMessage = Nan::Null(); + } else { + jsMessage = Nan::New(message).ToLocalChecked(); + } + Nan::Set(result, Nan::New("message").ToLocalChecked(), jsMessage); + + Nan::Set( + result, + Nan::New("sha").ToLocalChecked(), + Nan::New(sha).ToLocalChecked() + ); + + v8::Local jsShorthand; + if (shorthand == NULL) { + jsShorthand = Nan::Null(); + } else { + jsShorthand = Nan::New(shorthand).ToLocalChecked(); + } + Nan::Set(result, Nan::New("shorthand").ToLocalChecked(), jsShorthand); + + v8::Local jsTagSignature = Nan::Null(); + if (tagOdbBuffer != NULL && tagOdbBufferLength != 0) { + // tagOdbBuffer is already a copy, so we'd like to use NewBuffer instead, + // but we were getting segfaults and couldn't easily figure out why. :( + // We tried passing the tagOdbBuffer directly to NewBuffer and then nullifying tagOdbBuffer so that + // the destructor didn't double free, but that still segfaulted internally in Node. + v8::Local buffer = Nan::CopyBuffer(tagOdbBuffer, tagOdbBufferLength).ToLocalChecked(); + v8::Local toStringProp = Nan::Get(buffer, Nan::New("toString").ToLocalChecked()).ToLocalChecked(); + v8::Local jsTagOdbObjectString = Nan::To(Nan::CallAsFunction(Nan::To(toStringProp).ToLocalChecked(), buffer, 0, NULL).ToLocalChecked()).ToLocalChecked(); + + v8::Local _signatureRegexesBySignatureType = Nan::New(signatureRegexesBySignatureType); + v8::Local signatureRegexes = v8::Local::Cast(Nan::Get(_signatureRegexesBySignatureType, signatureType).ToLocalChecked()); + + for (uint32_t i = 0; i < signatureRegexes->Length(); ++i) { + v8::Local argv[] = { + Nan::Get(signatureRegexes, Nan::New(i)).ToLocalChecked() + }; + + v8::Local matchProp = Nan::Get(jsTagOdbObjectString, Nan::New("match").ToLocalChecked()).ToLocalChecked(); + v8::Local match = Nan::CallAsFunction(Nan::To(matchProp).ToLocalChecked(), jsTagOdbObjectString, 1, argv).ToLocalChecked(); + if (match->IsArray()) { + jsTagSignature = Nan::Get(Nan::To(match).ToLocalChecked(), 0).ToLocalChecked(); + break; + } + } + } + Nan::Set(result, Nan::New("tagSignature").ToLocalChecked(), jsTagSignature); + + v8::Local jsType; + if (type == NULL) { + jsType = Nan::Null(); + } else { + jsType = Nan::New(type).ToLocalChecked(); + } + Nan::Set(result, Nan::New("type").ToLocalChecked(), jsType); + + return result; + } + + ~RefreshedRefModel() { + if (fullName != NULL) { free(fullName); } + if (message != NULL) { free(message); } + delete[] sha; + if (shorthand != NULL) { free(shorthand); } + if (tagOdbBuffer != NULL) { delete[] tagOdbBuffer; } + } + + char *fullName, *message, *sha, *shorthand, *tagOdbBuffer; + size_t tagOdbBufferLength; + const char *type; + static Nan::Persistent signatureRegexesBySignatureType; +}; + +Nan::Persistent RefreshedRefModel::signatureRegexesBySignatureType; + +class UpstreamModel { +public: + UpstreamModel(const char *inputDownstreamFullName, const char *inputUpstreamFullName): + downstreamFullName((char *)strdup(inputDownstreamFullName)), + upstreamFullName((char *)strdup(inputUpstreamFullName)), + ahead(0), + behind(0) {} + + UpstreamModel(const UpstreamModel &) = delete; + UpstreamModel(UpstreamModel &&) = delete; + UpstreamModel &operator=(const UpstreamModel &) = delete; + UpstreamModel &operator=(UpstreamModel &&) = delete; + + static bool fromReference(UpstreamModel **out, git_reference *ref) { + if (!git_reference_is_branch(ref)) { + return false; + } + + git_reference *upstream; + int result = git_branch_upstream(&upstream, ref); + if (result != GIT_OK) { + return false; + } + + UpstreamModel *upstreamModel = new UpstreamModel( + git_reference_name(ref), + git_reference_name(upstream) + ); + + git_oid localCommitOid; + result = getOidOfReferenceCommit(&localCommitOid, ref); + if (result != GIT_OK) { + delete upstreamModel; + return false; + } + + git_oid upstreamCommitOid; + result = getOidOfReferenceCommit(&upstreamCommitOid, upstream); + if (result != GIT_OK) { + delete upstreamModel; + return false; + } + + result = git_graph_ahead_behind( + &upstreamModel->ahead, + &upstreamModel->behind, + git_reference_owner(ref), + &localCommitOid, + &upstreamCommitOid + ); + + if (result != GIT_OK) { + delete upstreamModel; + return false; + } + + *out = upstreamModel; + return true; + } + + v8::Local toJavascript() { + v8::Local result = Nan::New(); + + v8::Local jsDownstreamFullName; + if (downstreamFullName == NULL) { + jsDownstreamFullName = Nan::Null(); + } else { + jsDownstreamFullName = Nan::New(downstreamFullName).ToLocalChecked(); + } + Nan::Set(result, Nan::New("downstreamFullName").ToLocalChecked(), jsDownstreamFullName); + + v8::Local jsUpstreamFullName; + if (upstreamFullName == NULL) { + jsUpstreamFullName = Nan::Null(); + } else { + jsUpstreamFullName = Nan::New(upstreamFullName).ToLocalChecked(); + } + Nan::Set(result, Nan::New("upstreamFullName").ToLocalChecked(), jsUpstreamFullName); + + Nan::Set(result, Nan::New("ahead").ToLocalChecked(), Nan::New(ahead)); + Nan::Set(result, Nan::New("behind").ToLocalChecked(), Nan::New(behind)); + return result; + } + + ~UpstreamModel() { + if (downstreamFullName != NULL) { free(downstreamFullName); } + if (upstreamFullName != NULL) { free(upstreamFullName); } + } + + char *downstreamFullName; + char *upstreamFullName; + size_t ahead; + size_t behind; +}; + +class RefreshReferencesData { +public: + RefreshReferencesData(): + headRefFullName(NULL), + cherrypick(NULL), + merge(NULL) {} + + RefreshReferencesData(const RefreshReferencesData &) = delete; + RefreshReferencesData(RefreshReferencesData &&) = delete; + RefreshReferencesData &operator=(const RefreshReferencesData &) = delete; + RefreshReferencesData &operator=(RefreshReferencesData &&) = delete; + + ~RefreshReferencesData() { + while(refs.size()) { + delete refs.back(); + refs.pop_back(); + } + while(upstreamInfo.size()) { + delete upstreamInfo.back(); + upstreamInfo.pop_back(); + } + if (headRefFullName != NULL) { free(headRefFullName); } + if (cherrypick != NULL) { delete cherrypick; } + if (merge != NULL) { delete merge; } + } + + std::vector refs; + std::vector upstreamInfo; + char *headRefFullName; + RefreshedRefModel *cherrypick; + RefreshedRefModel *merge; +}; + +NAN_METHOD(GitRepository::RefreshReferences) +{ + v8::Local signatureType; + if (info.Length() == 2) { + if (!info[0]->IsString()) { + return Nan::ThrowError("Signature type must be \"gpgsig\" or \"x509\"."); + } + + v8::Local signatureTypeParam = Nan::To(info[0]).ToLocalChecked(); + if ( + Nan::Equals(signatureTypeParam, Nan::New("gpgsig").ToLocalChecked()) != Nan::Just(true) + && Nan::Equals(signatureTypeParam, Nan::New("x509").ToLocalChecked()) != Nan::Just(true) + ) { + return Nan::ThrowError("Signature type must be \"gpgsig\" or \"x509\"."); + } + signatureType = signatureTypeParam; + } else { + signatureType = Nan::New("gpgsig").ToLocalChecked(); + } + + if (!info[info.Length() - 1]->IsFunction()) { + return Nan::ThrowError("Callback is required and must be a Function."); + } + + RefreshReferencesBaton* baton = new RefreshReferencesBaton(); + + baton->error_code = GIT_OK; + baton->error = NULL; + baton->out = (void *)new RefreshReferencesData(); + baton->repo = Nan::ObjectWrap::Unwrap(info.This())->GetValue(); + + Nan::Callback *callback = new Nan::Callback(Local::Cast(info[info.Length() - 1])); + std::map> cleanupHandles; + RefreshReferencesWorker *worker = new RefreshReferencesWorker(baton, callback, cleanupHandles); + worker->Reference("repo", info.This()); + worker->Reference("signatureType", signatureType); + nodegit::Context *nodegitContext = reinterpret_cast(info.Data().As()->Value()); + nodegitContext->QueueWorker(worker); + return; +} + +nodegit::LockMaster GitRepository::RefreshReferencesWorker::AcquireLocks() { + nodegit::LockMaster lockMaster(true, baton->repo); + return lockMaster; +} + +void GitRepository::RefreshReferencesWorker::Execute() +{ + giterr_clear(); + + git_repository *repo = baton->repo; + RefreshReferencesData *refreshData = (RefreshReferencesData *)baton->out; + git_odb *odb; + + baton->error_code = git_repository_odb(&odb, repo); + if (baton->error_code != GIT_OK) { + if (giterr_last() != NULL) { + baton->error = git_error_dup(giterr_last()); + } + delete refreshData; + baton->out = NULL; + return; + } + + // START Refresh HEAD + git_reference *headRef = NULL; + baton->error_code = lookupDirectReferenceByShorthand(&headRef, repo, "HEAD"); + + if (baton->error_code != GIT_OK || headRef == NULL) { + if (giterr_last() != NULL) { + baton->error = git_error_dup(giterr_last()); + } + git_odb_free(odb); + delete refreshData; + baton->out = NULL; + return; + } + + RefreshedRefModel *headModel; + baton->error_code = RefreshedRefModel::fromReference(&headModel, headRef, odb); + if (baton->error_code != GIT_OK) { + if (giterr_last() != NULL) { + baton->error = git_error_dup(giterr_last()); + } + git_odb_free(odb); + git_reference_free(headRef); + delete refreshData; + baton->out = NULL; + return; + } + refreshData->refs.push_back(headModel); + + refreshData->headRefFullName = strdup(git_reference_name(headRef)); + git_reference_free(headRef); + // END Refresh HEAD + + // START Refresh CHERRY_PICK_HEAD + git_reference *cherrypickRef = NULL; + if (lookupDirectReferenceByShorthand(&cherrypickRef, repo, "CHERRY_PICK_HEAD") == GIT_OK && cherrypickRef != NULL) { + baton->error_code = RefreshedRefModel::fromReference(&refreshData->cherrypick, cherrypickRef, odb); + git_reference_free(cherrypickRef); + } else { + cherrypickRef = NULL; + } + // END Refresh CHERRY_PICK_HEAD + + // START Refresh MERGE_HEAD + git_reference *mergeRef = NULL; + // fall through if cherry pick failed + if (baton->error_code == GIT_OK && lookupDirectReferenceByShorthand(&mergeRef, repo, "MERGE_HEAD") == GIT_OK && mergeRef != NULL) { + baton->error_code = RefreshedRefModel::fromReference(&refreshData->merge, mergeRef, odb); + git_reference_free(mergeRef); + } else { + mergeRef = NULL; + } + // END Refresh MERGE_HEAD + + if (baton->error_code != GIT_OK) { + if (giterr_last() != NULL) { + baton->error = git_error_dup(giterr_last()); + } + git_odb_free(odb); + delete refreshData; + baton->out = NULL; + return; + } + + // Retrieve reference models and upstream info for each reference + git_strarray referenceNames; + baton->error_code = git_reference_list(&referenceNames, repo); + + if (baton->error_code != GIT_OK) { + if (giterr_last() != NULL) { + baton->error = git_error_dup(giterr_last()); + } + git_odb_free(odb); + delete refreshData; + baton->out = NULL; + return; + } + + git_strarray remoteNames; + baton->error_code = git_remote_list(&remoteNames, repo); + + if (baton->error_code != GIT_OK) { + if (giterr_last() != NULL) { + baton->error = git_error_dup(giterr_last()); + } + git_odb_free(odb); + git_strarray_free(&referenceNames); + delete refreshData; + baton->out = NULL; + return; + } + + for (size_t referenceIndex = 0; referenceIndex < referenceNames.count; ++referenceIndex) { + git_reference *reference; + baton->error_code = lookupDirectReferenceByFullName(&reference, repo, referenceNames.strings[referenceIndex]); + + if (baton->error_code != GIT_OK) { + break; + } + if (reference == NULL) { + // lookup found the reference but failed to resolve it directly + continue; + } + + UpstreamModel *upstreamModel; + if (UpstreamModel::fromReference(&upstreamModel, reference)) { + refreshData->upstreamInfo.push_back(upstreamModel); + } + + bool isBranch = git_reference_is_branch(reference); + bool isRemote = git_reference_is_remote(reference); + bool isTag = git_reference_is_tag(reference); + if ( + strcmp(referenceNames.strings[referenceIndex], headModel->fullName) == 0 + || (!isBranch && !isRemote && !isTag) + ) { + git_reference_free(reference); + continue; + } + + if (isRemote) { + char *remoteNameOfRef = getRemoteNameOfReference(reference); + bool isFromExistingRemote = gitStrArrayContains(&remoteNames, remoteNameOfRef); + free(remoteNameOfRef); + if (!isFromExistingRemote) { + git_reference_free(reference); + continue; + } + } + + RefreshedRefModel *refreshedRefModel; + baton->error_code = RefreshedRefModel::fromReference(&refreshedRefModel, reference, odb); + git_reference_free(reference); + + if (baton->error_code == GIT_OK) { + refreshData->refs.push_back(refreshedRefModel); + } else { + baton->error_code = GIT_OK; + } + } + + git_odb_free(odb); + git_strarray_free(&remoteNames); + git_strarray_free(&referenceNames); + + if (baton->error_code != GIT_OK) { + if (giterr_last() != NULL) { + baton->error = git_error_dup(giterr_last()); + } + delete refreshData; + baton->out = NULL; + return; + } +} + +void GitRepository::RefreshReferencesWorker::HandleErrorCallback() { + if (baton->error) { + if (baton->error->message) { + free((void *)baton->error->message); + } + + free((void *)baton->error); + } + + RefreshReferencesData *refreshData = (RefreshReferencesData *)baton->out; + delete refreshData; + + delete baton; +} + +void GitRepository::RefreshReferencesWorker::HandleOKCallback() +{ + if (baton->out != NULL) + { + RefreshedRefModel::ensureSignatureRegexes(); + auto refreshData = (RefreshReferencesData *)baton->out; + v8::Local result = Nan::New(); + + Nan::Set( + result, + Nan::New("headRefFullName").ToLocalChecked(), + Nan::New(refreshData->headRefFullName).ToLocalChecked() + ); + + v8::Local signatureType = Nan::To(GetFromPersistent("signatureType")).ToLocalChecked(); + + unsigned int numRefs = refreshData->refs.size(); + v8::Local refs = Nan::New(numRefs); + for (unsigned int i = 0; i < numRefs; ++i) { + RefreshedRefModel *refreshedRefModel = refreshData->refs[i]; + Nan::Set(refs, Nan::New(i), refreshedRefModel->toJavascript(signatureType)); + } + Nan::Set(result, Nan::New("refs").ToLocalChecked(), refs); + + unsigned int numUpstreamInfo = refreshData->upstreamInfo.size(); + v8::Local upstreamInfo = Nan::New(numUpstreamInfo); + for (unsigned int i = 0; i < numUpstreamInfo; ++i) { + UpstreamModel *upstreamModel = refreshData->upstreamInfo[i]; + Nan::Set(upstreamInfo, Nan::New(i), upstreamModel->toJavascript()); + } + Nan::Set(result, Nan::New("upstreamInfo").ToLocalChecked(), upstreamInfo); + + if (refreshData->cherrypick != NULL) { + Nan::Set( + result, + Nan::New("cherrypick").ToLocalChecked(), + refreshData->cherrypick->toJavascript(signatureType) + ); + } else { + Nan::Set(result, Nan::New("cherrypick").ToLocalChecked(), Nan::Null()); + } + + if (refreshData->merge != NULL) { + Nan::Set( + result, + Nan::New("merge").ToLocalChecked(), + refreshData->merge->toJavascript(signatureType) + ); + } else { + Nan::Set(result, Nan::New("merge").ToLocalChecked(), Nan::Null()); + } + + delete refreshData; + + Local argv[2] = { + Nan::Null(), + result + }; + callback->Call(2, argv, async_resource); + } + else if (baton->error) + { + Local argv[1] = { + Nan::Error(baton->error->message) + }; + callback->Call(1, argv, async_resource); + if (baton->error->message) + { + free((void *)baton->error->message); + } + + free((void *)baton->error); + } + else if (baton->error_code < 0) + { + Local err = Nan::To(Nan::Error("Repository refreshReferences has thrown an error.")).ToLocalChecked(); + Nan::Set(err, Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); + Nan::Set(err, Nan::New("errorFunction").ToLocalChecked(), Nan::New("Repository.refreshReferences").ToLocalChecked()); + Local argv[1] = { + err + }; + callback->Call(1, argv, async_resource); + } + else + { + callback->Call(0, NULL, async_resource); + } + + delete baton; +} diff --git a/generate/templates/manual/repository/statistics.cc b/generate/templates/manual/repository/statistics.cc new file mode 100644 index 0000000000..f438bb5f8d --- /dev/null +++ b/generate/templates/manual/repository/statistics.cc @@ -0,0 +1,1892 @@ +/** + * \struct CommitsGraphNode + */ +struct CommitsGraphNode +{ + CommitsGraphNode(uint32_t aParentsLeft) : parentsLeft(aParentsLeft) {} + CommitsGraphNode() = default; + ~CommitsGraphNode() = default; + CommitsGraphNode(const CommitsGraphNode &other) = delete; + CommitsGraphNode(CommitsGraphNode &&other) = delete; + CommitsGraphNode& operator=(const CommitsGraphNode &other) = delete; + CommitsGraphNode& operator=(CommitsGraphNode &&other) = delete; + + std::vector children {}; + uint32_t parentsLeft {0}; // used when calculating the maximum history depth +}; + +/** + * \class CommitsGraph + */ +class CommitsGraph +{ +public: + CommitsGraph() = default; + ~CommitsGraph() = default; + CommitsGraph(const CommitsGraph &other) = delete; + CommitsGraph(CommitsGraph &&other) = delete; + CommitsGraph& operator=(const CommitsGraph &other) = delete; + CommitsGraph& operator=(CommitsGraph &&other) = delete; + + using CommitsGraphMap = std::unordered_map>; + + void AddNode(const std::string &oidStr, const std::vector &parents); + uint32_t CalculateMaxDepth(); + +private: + void addParentNode(const std::string &oidParentStr, CommitsGraphNode *child); + + CommitsGraphMap m_mapOidNode {}; + std::vector m_roots {}; +}; + +/** + * CommitsGraph::AddNode + * + * \param oidStr oid of the commit object to add. + * \param parents oids of the commit's parents. + */ +void CommitsGraph::AddNode(const std::string &oidStr, const std::vector &parents) +{ + const uint32_t numParents = static_cast(parents.size()); + + auto emplacePair = m_mapOidNode.emplace(std::make_pair( + oidStr, std::make_unique(numParents))); + + CommitsGraphMap::iterator itNode = emplacePair.first; + + // if this node already added by a child, update its parentsLeft + if (emplacePair.second == false) { + itNode->second.get()->parentsLeft = numParents; + } + + // set roots + if (numParents == 0) { + m_roots.emplace_back(itNode->second.get()); + } + + // add parents + for (unsigned int i = 0; i < numParents; ++i) { + addParentNode(parents.at(i), itNode->second.get()); + } +} + +/** + * CommitsGraph::CalculateMaxDepth + * \return Calculated maximum depth of the tree. + * + * Uses iterative algorithm to count levels. + * Considers multiple initial commits. + * Considers that children of one level can have multiple parents, hence we insert unique children + * at each level. + * Considers that same child can be in different levels. Here to prevent counting the same child + * multiple times, we only add a child when the last parent (parentsLeft) inserts it. This is + * actually what makes the algorithm fast. + * Recursive algorithm avoided to prevent stack overflow in case of excessive levels in the tree. + * + * Explanation of the algorithm: + * once the graph is built with the commit history, `CalculateMaxDepth()` counts the maximum number + * of levels from any of the roots to any of the leaves, which gives us the maximum depth + * (`historyStructure.maxDepth` in the final result). + * Inside `CalculateMaxDepth()`, to count levels, we add in an iterative way for each level and + * starting at the roots level, all the children from that level, but only if each child is the last + * time we'll consider it in the algorithm (for example if a child node 'C' has 2 parents 'P1' and + * 'P2', and 'P1' has already been considered before in the algorithm as parent of 'C', and now we are + * processing 'C' as a child from 'P2', which will be the last time, as 'C' has no more parents left). + * This way we prevent counting 'C' multiple times. + */ +uint32_t CommitsGraph::CalculateMaxDepth() +{ + uint32_t maxDepth {0}; + std::unordered_set parents {}; + std::unordered_set children {}; + + // start from the root commmits + for (CommitsGraphNode *root : m_roots) { + children.insert(root); + } + + while (!children.empty()) { + ++maxDepth; + parents = std::move(children); + + // add unique children of next level, and only if from the last parent + for (CommitsGraphNode *parent : parents) { + for (CommitsGraphNode *child : parent->children) { + if (--child->parentsLeft == 0) { + children.insert(child); + } + } + } + } + + return maxDepth; +} + +/** + * CommitsGraph::addParentNode + * + * \param oidParentStr oid of the parent commit to add. + * \param child Child of the parent commit being added. + */ +void CommitsGraph::addParentNode(const std::string &oidParentStr, CommitsGraphNode *child) +{ + CommitsGraphMap::iterator itParentNode = m_mapOidNode.emplace(std::make_pair( + oidParentStr, std::make_unique())).first; + + // add child to parent + itParentNode->second->children.emplace_back(child); +} + +/** + * \struct TreeStatistics + * Structure to store statistics for a git tree object. + */ +struct TreeStatistics +{ + TreeStatistics() = default; + ~TreeStatistics() = default; + TreeStatistics(const TreeStatistics &other) = delete; + TreeStatistics(TreeStatistics &&other) = default; + TreeStatistics& operator=(const TreeStatistics &other) = delete; + TreeStatistics& operator=(TreeStatistics &&other) = default; + + size_t numDirectories{0}; + size_t maxPathDepth {0}; + size_t maxPathLength {0}; + size_t numFiles {0}; + size_t totalFileSize {0}; + size_t numSymlinks {0}; + size_t numSubmodules {0}; +}; + +/** + * \struct Statistics + * Stores statistics of the analyzed repository. + */ +struct Statistics +{ + Statistics() = default; + ~Statistics() = default; + Statistics(const Statistics &other) = delete; + Statistics(Statistics &&other) = delete; + Statistics& operator=(const Statistics &other) = delete; + Statistics& operator=(Statistics &&other) = delete; + + struct { + struct { size_t count {0}; size_t size {0}; } commits; + struct { size_t count {0}; size_t size {0}; size_t entries {0}; } trees; + struct { size_t count {0}; size_t size {0}; } blobs; + struct { size_t count {0}; } annotatedTags; + struct { size_t count {0}; } references; + } repositorySize {}; + + struct { + struct { size_t maxSize {0}; size_t maxParents {0}; } commits; + struct { size_t maxEntries {0}; } trees; + struct { size_t maxSize {0}; } blobs; + } biggestObjects {}; + + struct { + uint32_t maxDepth {0}; + uint32_t maxTagDepth {0}; + } historyStructure {}; + + TreeStatistics biggestCheckouts {}; +}; + +/** + * \struct OdbObjectsData + * Structure to store, for each object read from the repository: + * - its information (size, parents for a commit, etc.) + * - different data needed to obtain the resulting statistics + */ +struct OdbObjectsData +{ + static constexpr uint32_t kUnreachable = 0; + + struct CommitInfo { + std::string oidTree {}; + size_t size {0}; + std::vector parents {}; + // number of sources from which a commit can be reached: + // a child commit, a tag, or a direct git reference + uint32_t reachability {kUnreachable}; + }; + + struct TreeInfoAndStats { + size_t size {0}; + size_t numEntries {0}; + std::vector entryBlobs {}; + std::vector< std::pair > entryTreesNameLen {}; + // number of sources from which a tree can be reached: + // a commit, another tree's entry, or a tag + uint32_t reachability {kUnreachable}; + TreeStatistics stats {}; + bool statsDone {false}; + }; + + struct BlobInfo { + size_t size {0}; + // number of sources from which a blob can be reached: + // a tree's entry, or a tag + uint32_t reachability {kUnreachable}; + }; + + struct TagInfo { + static constexpr uint32_t kUnsetDepth = 0; + + std::string oidTarget {}; + git_object_t typeTarget {GIT_OBJECT_INVALID}; + uint32_t depth {kUnsetDepth}; + // number of sources from which a tag can be reached: + // a reference, or another tag + uint32_t reachability {kUnreachable}; + }; + + OdbObjectsData() = default; + ~OdbObjectsData() = default; + OdbObjectsData(const OdbObjectsData &other) = delete; + OdbObjectsData(OdbObjectsData &&other) = delete; + OdbObjectsData& operator=(const OdbObjectsData &other) = delete; + OdbObjectsData& operator=(OdbObjectsData &&other) = delete; + + struct { + std::unordered_map info {}; + std::unordered_set unreachables {}; + // Tree of commits (graph) to be built after having read the object + // database, and pruned unreachable objects. + // Used to calculate the maximum history depth. + CommitsGraph graph {}; + size_t totalSize {0}; + size_t maxSize {0}; + size_t maxParents {0}; + } commits {}; + + struct { + std::unordered_map info; + std::unordered_set unreachables {}; + size_t totalSize {0}; + size_t totalEntries {0}; + size_t maxEntries {0}; + } trees {}; + + struct { + std::unordered_map info {}; + std::unordered_set unreachables {}; + size_t totalSize {0}; + size_t maxSize {0}; + } blobs {}; + + struct { + std::unordered_map info; + std::unordered_set unreachables {}; + } tags {}; + + struct { + std::mutex commits {}; + std::mutex trees {}; + std::mutex blobs {}; + std::mutex tags {}; + } infoMutex; + + using iterCommitInfo = std::unordered_map::iterator; + using iterUnreachable = std::unordered_set::iterator; + using iterTreeInfo = std::unordered_map::iterator; + using iterBlobInfo = std::unordered_map::iterator; + using iterTagInfo = std::unordered_map::iterator; +}; + +/** + * \class WorkItemOid + * WorkItem storing odb oids for the WorkPool. + */ +class WorkItemOid : public WorkItem { +public: + WorkItemOid(const git_oid &oid) + : m_oid(oid) {} + ~WorkItemOid() = default; + WorkItemOid(const WorkItemOid &other) = delete; + WorkItemOid(WorkItemOid &&other) = delete; + WorkItemOid& operator=(const WorkItemOid &other) = delete; + WorkItemOid& operator=(WorkItemOid &&other) = delete; + + const git_oid& GetOid() const { return m_oid; } + +private: + git_oid m_oid {}; +}; + +/** + * \class WorkerStoreOdbData + * Worker for the WorkPool to store odb object data. + */ +class WorkerStoreOdbData : public IWorker +{ +public: + WorkerStoreOdbData(const std::string &repoPath, OdbObjectsData *odbObjectsData) + : m_repoPath(repoPath), m_odbObjectsData(odbObjectsData) {} + ~WorkerStoreOdbData(); + WorkerStoreOdbData(const WorkerStoreOdbData &other) = delete; + WorkerStoreOdbData(WorkerStoreOdbData &&other) = delete; + WorkerStoreOdbData& operator=(const WorkerStoreOdbData &other) = delete; + WorkerStoreOdbData& operator=(WorkerStoreOdbData &&other) = delete; + + bool Initialize(); + bool Execute(std::unique_ptr &&work); + +private: + OdbObjectsData::TreeInfoAndStats thisTreeInfoAndStats(const git_tree *tree, size_t size, size_t numEntries); + + std::string m_repoPath {}; + git_repository *m_repo {nullptr}; + git_odb *m_odb {nullptr}; + OdbObjectsData *m_odbObjectsData {nullptr}; +}; + +/** + * WorkerStoreOdbData::~WorkerStoreOdbData + */ +WorkerStoreOdbData::~WorkerStoreOdbData() { + if (m_odb) { + git_odb_free(m_odb); + } + if (m_repo) { + git_repository_free(m_repo); + } +} + +/** + * WorkerStoreOdbData::Initialize + */ +bool WorkerStoreOdbData::Initialize() { + if (m_repo != nullptr) { // if already initialized + return true; + } + + return !m_repoPath.empty() && + git_repository_open(&m_repo, m_repoPath.c_str()) == GIT_OK && + git_repository_odb(&m_odb, m_repo) == GIT_OK; +} + +/** + * WorkerStoreOdbData::Execute + */ +bool WorkerStoreOdbData::Execute(std::unique_ptr &&work) +{ + std::unique_ptr wi {static_cast(work.release())}; + const git_oid &oid = wi->GetOid(); + + // NOTE about PERFORMANCE (May 2021): + // git_object_lookup() is as expensive as git_odb_read(). + // They give access to different information from the libgit2 API. + // Try to call only one of them if possible. + + git_object *target {nullptr}; + if (git_object_lookup(&target, m_repo, &oid, GIT_OBJECT_ANY) != GIT_OK) { + return false; + } + + switch (git_object_type(target)) + { + case GIT_OBJECT_COMMIT: + { + git_commit *commit = (git_commit*)target; + // NOTE about PERFORMANCE (May 2021): + // calling git_odb_object_size() was slightly faster than calculating header size + message size + 1 with GK repo + + // obtain size + git_odb_object *obj {nullptr}; + if (git_odb_read(&obj, m_odb, &oid) != GIT_OK) { + git_object_free(target); + return false; + } + const size_t size = git_odb_object_size(obj); + git_odb_object_free(obj); + + // obtain CommitInfo + const unsigned int numParents = git_commit_parentcount(commit); + std::vector parents {}; + for (unsigned int i = 0; i < numParents; ++i) { + parents.emplace_back(reinterpret_cast(git_commit_parent_id(commit, i)->id), + GIT_OID_RAWSZ); + } + + OdbObjectsData::CommitInfo commitInfo { + std::string(reinterpret_cast(git_commit_tree_id(commit)->id), GIT_OID_RAWSZ), + size, + std::move(parents), + OdbObjectsData::kUnreachable}; + + { // lock + std::lock_guard lock(m_odbObjectsData->infoMutex.commits); + + m_odbObjectsData->commits.info.emplace(std::make_pair( + std::string(reinterpret_cast(oid.id), GIT_OID_RAWSZ), + std::move(commitInfo))); + } + } + break; + + case GIT_OBJECT_TREE: + { + git_tree *tree = (git_tree*)target; + + // do not count empty trees, like git's empty tree "4b825dc642cb6eb9a060e54bf8d69288fbee4904" + const size_t numEntries = git_tree_entrycount(tree); + if (numEntries == 0) { + git_object_free(target); + return true; + } + + // obtain size + git_odb_object *obj {nullptr}; + if (git_odb_read(&obj, m_odb, &oid) != GIT_OK) { + git_object_free(target); + return false; + } + const size_t size = git_odb_object_size(obj); + git_odb_object_free(obj); + + // obtain tree data and calculate statistics for only this tree (not recursively) + OdbObjectsData::TreeInfoAndStats treeInfoAndStats = thisTreeInfoAndStats(tree, size, numEntries); + + { // lock + std::lock_guard lock(m_odbObjectsData->infoMutex.trees); + + m_odbObjectsData->trees.info.emplace(std::make_pair( + std::string(reinterpret_cast(oid.id), GIT_OID_RAWSZ), + std::move(treeInfoAndStats))); + } + } + break; + + case GIT_OBJECT_BLOB: + { + git_blob *blob = (git_blob*)target; + const size_t size = git_blob_rawsize(blob); + OdbObjectsData::BlobInfo blobInfo {size, OdbObjectsData::kUnreachable}; + + { // lock + std::lock_guard lock(m_odbObjectsData->infoMutex.blobs); + + m_odbObjectsData->blobs.info.emplace(std::make_pair( + std::string(reinterpret_cast(oid.id), GIT_OID_RAWSZ), + std::move(blobInfo))); + } + } + break; + + case GIT_OBJECT_TAG: + { + // obtain TagInfo + git_tag *tag = (git_tag*)target; + const git_oid *oid_target = git_tag_target_id(tag); + OdbObjectsData::TagInfo tagInfo { + std::string(reinterpret_cast(oid_target->id), GIT_OID_RAWSZ), + git_tag_target_type(tag), + OdbObjectsData::TagInfo::kUnsetDepth, + OdbObjectsData::kUnreachable}; + + { // lock + std::lock_guard lock(m_odbObjectsData->infoMutex.tags); + m_odbObjectsData->tags.info.emplace(std::make_pair( + std::string(reinterpret_cast(oid.id), GIT_OID_RAWSZ), + std::move(tagInfo))); + } + } + break; + + default: + break; + } + + git_object_free(target); + + return true; +} + +/** + * WorkerStoreOdbData::thisTreeInfoAndStats + * + * Obtain tree data and calculate the part of this tree's statistics that each thread can do. + * + * \param tree tree to get data from and calculate partial statistics of. + * \param size tree size, to be added to the final result. + * \param numEntries number of entries of this tree. + * \return this tree's data and partial statistics. + */ +OdbObjectsData::TreeInfoAndStats WorkerStoreOdbData::thisTreeInfoAndStats(const git_tree *tree, size_t size, + size_t numEntries) +{ + OdbObjectsData::TreeInfoAndStats treeInfoAndStats {}; + treeInfoAndStats.size = size; + treeInfoAndStats.numEntries = numEntries; + + for (size_t i = 0; i < numEntries; ++i) + { + const git_tree_entry *te = git_tree_entry_byindex(tree, i); + if (te == nullptr) { + continue; + } + const git_object_t te_type = git_tree_entry_type(te); + const char *teName {nullptr}; + size_t teNameLen {0}; + const git_oid *te_oid {nullptr}; + + switch (te_type) + { + // count submodules + case GIT_OBJECT_COMMIT: + if (git_tree_entry_filemode(te) == GIT_FILEMODE_COMMIT) { + ++treeInfoAndStats.stats.numSubmodules; + } + break; + + case GIT_OBJECT_BLOB: + { + // count symbolic links, but don't add them as blob entries + if (git_tree_entry_filemode(te) == GIT_FILEMODE_LINK) { + ++treeInfoAndStats.stats.numSymlinks; + } + else { + ++treeInfoAndStats.stats.numFiles; + teName = git_tree_entry_name(te); + teNameLen = std::char_traits::length(teName); + treeInfoAndStats.stats.maxPathLength = + std::max(treeInfoAndStats.stats.maxPathLength, teNameLen); + } + // store both types of files (symbolic links and non symbolic links) as entryBlob + te_oid = git_tree_entry_id(te); + treeInfoAndStats.entryBlobs.emplace_back( + reinterpret_cast(te_oid->id), GIT_OID_RAWSZ); + } + break; + + case GIT_OBJECT_TREE: + { + // We store tree's name length to compare in posterior stage, after threads work + teName = git_tree_entry_name(te); + teNameLen = std::char_traits::length(teName); + + te_oid = git_tree_entry_id(te); + treeInfoAndStats.entryTreesNameLen.emplace_back(std::make_pair( + std::string(reinterpret_cast(te_oid->id), GIT_OID_RAWSZ), + teNameLen)); + } + break; + + default: + break; + } + } + + return treeInfoAndStats; +} + +/** + * \class WorkItemOidStrType + * WorkItem storing pointers to object info structs for the WorkPool. + */ +class WorkItemOidStrType : public WorkItem { +public: + WorkItemOidStrType(void *objectInfo, git_object_t type) + : m_objectInfo(objectInfo), m_oid_type(type) {} + ~WorkItemOidStrType() = default; + WorkItemOidStrType(const WorkItemOidStrType &other) = delete; + WorkItemOidStrType(WorkItemOidStrType &&other) = delete; + WorkItemOidStrType& operator=(const WorkItemOidStrType &other) = delete; + WorkItemOidStrType& operator=(WorkItemOidStrType &&other) = delete; + + void* GetObjectInfo() const { return m_objectInfo; } + const git_object_t& GetOidType() const { return m_oid_type; } + +private: + void *m_objectInfo {nullptr}; + git_object_t m_oid_type {}; +}; + +/** + * \class WorkerReachCounter + * Worker for the WorkPool to count reachability of each object. + */ +class WorkerReachCounter : public IWorker +{ +public: + WorkerReachCounter(OdbObjectsData *odbObjectsData) + : m_odbObjectsData(odbObjectsData) {} + ~WorkerReachCounter() = default; + WorkerReachCounter(const WorkerReachCounter &other) = delete; + WorkerReachCounter(WorkerReachCounter &&other) = delete; + WorkerReachCounter& operator=(const WorkerReachCounter &other) = delete; + WorkerReachCounter& operator=(WorkerReachCounter &&other) = delete; + + bool Initialize() { return true; } + bool Execute(std::unique_ptr &&work); + +private: + void setReachabilityFromTags(void *objectInfo); + void setReachabilityFromCommits(void *objectInfo); + void setReachabilityFromTrees(void *objectInfo); + + OdbObjectsData *m_odbObjectsData {nullptr}; +}; + +/** + * WorkerReachCounter::Execute + */ +bool WorkerReachCounter::Execute(std::unique_ptr &&work) +{ + std::unique_ptr wi {static_cast(work.release())}; + void *objectInfo = wi->GetObjectInfo(); + const git_object_t &oid_type = wi->GetOidType(); + + switch (oid_type) { + case GIT_OBJECT_TAG: + setReachabilityFromTags(objectInfo); + break; + case GIT_OBJECT_COMMIT: + setReachabilityFromCommits(objectInfo); + break; + case GIT_OBJECT_TREE: + setReachabilityFromTrees(objectInfo); + break; + case GIT_OBJECT_BLOB: + // do not process blobs in this stage + break; + default: + break; + } + + return true; +} + +/** + * WorkerReachCounter::setReachabilityFromTags + * Adds reachability counter where tags point (any type of object). + */ +void WorkerReachCounter::setReachabilityFromTags(void *objectInfo) +{ + const OdbObjectsData::TagInfo *tagInfo = static_cast(objectInfo); + + switch (tagInfo->typeTarget) { + case GIT_OBJECT_COMMIT: + { + OdbObjectsData::iterCommitInfo itCommitInfo = + m_odbObjectsData->commits.info.find(tagInfo->oidTarget); + + if (itCommitInfo != m_odbObjectsData->commits.info.end()) { + { // lock + std::lock_guard lock(m_odbObjectsData->infoMutex.commits); + ++itCommitInfo->second.reachability; + } + } + } + break; + + case GIT_OBJECT_TREE: + { + OdbObjectsData::iterTreeInfo itTreeInfo = + m_odbObjectsData->trees.info.find(tagInfo->oidTarget); + + if (itTreeInfo != m_odbObjectsData->trees.info.end()) { + { // lock + std::lock_guard lock(m_odbObjectsData->infoMutex.trees); + ++itTreeInfo->second.reachability; + } + } + } + + case GIT_OBJECT_BLOB: + { + OdbObjectsData::iterBlobInfo itBlobInfo = + m_odbObjectsData->blobs.info.find(tagInfo->oidTarget); + + if (itBlobInfo != m_odbObjectsData->blobs.info.end()) { + { // lock + std::lock_guard lock(m_odbObjectsData->infoMutex.blobs); + ++itBlobInfo->second.reachability; + } + } + } + + case GIT_OBJECT_TAG: + { + OdbObjectsData::iterTagInfo itTargetTagInfo = + m_odbObjectsData->tags.info.find(tagInfo->oidTarget); + + if (itTargetTagInfo != m_odbObjectsData->tags.info.end()) { + { // lock + std::lock_guard lock(m_odbObjectsData->infoMutex.tags); + ++itTargetTagInfo->second.reachability; + } + } + } + default: + break; + } +} + +/** + * WorkerReachCounter::setReachabilityFromCommits + * Adds reachability counter where commits point (parents and tree). + */ +void WorkerReachCounter::setReachabilityFromCommits(void *objectInfo) +{ + const OdbObjectsData::CommitInfo *commitInfo = + static_cast(objectInfo); + const size_t numParents = commitInfo->parents.size(); + + // set parents' reachability + for (size_t i = 0; i < numParents; ++i) { + OdbObjectsData::iterCommitInfo itParentCommitInfo = + m_odbObjectsData->commits.info.find(commitInfo->parents.at(i)); + + if (itParentCommitInfo != m_odbObjectsData->commits.info.end()) { + { // lock + std::lock_guard lock(m_odbObjectsData->infoMutex.commits); + ++itParentCommitInfo->second.reachability; + } + } + } + + // add 1 to its tree's reachability + OdbObjectsData::iterTreeInfo itCommitTreeInfo = + m_odbObjectsData->trees.info.find(commitInfo->oidTree); + + if (itCommitTreeInfo != m_odbObjectsData->trees.info.end()) { + { // lock + std::lock_guard lock(m_odbObjectsData->infoMutex.trees); + ++itCommitTreeInfo->second.reachability; + } + } +} + +/** + * WorkerReachCounter::setReachabilityFromTrees + * Adds reachability counter where tree entries point (blobs and other trees). + */ +void WorkerReachCounter::setReachabilityFromTrees(void *objectInfo) +{ + const OdbObjectsData::TreeInfoAndStats *treeInfo = + static_cast(objectInfo); + + // set entry blobs' reachability + for (auto &blob : treeInfo->entryBlobs) { + OdbObjectsData::iterBlobInfo itBlobInfo = m_odbObjectsData->blobs.info.find(blob); + + if (itBlobInfo != m_odbObjectsData->blobs.info.end()) { + { // lock + std::lock_guard lock(m_odbObjectsData->infoMutex.blobs); + ++itBlobInfo->second.reachability; + } + } + } + + // set entry trees' reachability + for (auto &treeNameLen : treeInfo->entryTreesNameLen) { + OdbObjectsData::iterTreeInfo itTreeInfo = m_odbObjectsData->trees.info.find(treeNameLen.first); + + if (itTreeInfo != m_odbObjectsData->trees.info.end()) { + { // lock + std::lock_guard lock(m_odbObjectsData->infoMutex.trees); + ++itTreeInfo->second.reachability; + } + } + } +} + +/** + * forEachOdbCb. Callback for git_odb_foreach. + * Returns GIT_OK on success; GIT_EUSER otherwise + */ +static int forEachOdbCb(const git_oid *oid, void *payloadToCast) +{ + WorkerPool *workerPool = + static_cast*>(payloadToCast); + + // Must insert copies of oid, since the pointers might not survive until worker thread picks it up + workerPool->InsertWork(std::make_unique(*oid)); + + // check there were no problems inserting work + if (workerPool->Status() != WPStatus::kOk) { + return GIT_EUSER; + } + + return GIT_OK; +} + +/** + * \class RepoAnalysis + * Class to analyse and hold repository statistics + */ +class RepoAnalysis +{ +public: + static constexpr unsigned int kMinThreads = 4; + + explicit RepoAnalysis(git_repository *repo) + : m_repo(repo) {} + ~RepoAnalysis() = default; + RepoAnalysis(const RepoAnalysis &other) = delete; + RepoAnalysis(RepoAnalysis &&other) = delete; + RepoAnalysis& operator=(const RepoAnalysis &other) = delete; + RepoAnalysis& operator=(RepoAnalysis &&other) = delete; + + int Analyze(); + v8::Local StatisticsToJS() const; + +private: + // stage 1 methods: store data from repository (with threads) + int storeObjectsInfo(); + int storeAndCountRefs(); + // stage 2 methods: count reachability of each object (with threads) + // NOTE: we need this stage, since so far libgit2 doesn't provide unreachable objects + bool setObjectsReachability(); + void setReachabilityFromRefs(); + void setUnreachables(); + // stage 3 methods: prune unreachable oids + void pruneUnreachables(); + void pruneUnreachableTags(); + void pruneUnreachableCommits(); + void pruneUnreachableTrees(); + void pruneUnreachableBlobs(); + // stage 4 methods: repositorySize and biggestObjects + void statsCountAndMax(); + // stage 5 methods: historyStructure and biggestCheckouts + bool statsHistoryAndBiggestCheckouts(); + bool calculateBiggestCheckouts(); + OdbObjectsData::iterTreeInfo calculateTreeStatistics(const std::string &oidTree); + bool calculateMaxTagDepth(); + OdbObjectsData::iterTagInfo calculateTagDepth(const std::string &oidTag); + // methods to return the statistics calculated + void fillOutStatistics(); + v8::Local repositorySizeToJS() const; + v8::Local biggestObjectsToJS() const; + v8::Local historyStructureToJS() const; + v8::Local biggestCheckoutsToJS() const; + + git_repository *m_repo {nullptr}; + Statistics m_statistics {}; + // odb objects info to build while reading the object database by each thread + OdbObjectsData m_odbObjectsData {}; + // oid and type of peeled references + std::unordered_map m_peeledRefs {}; +}; + +/** + * RepoAnalysis::Analyze + * To obtain the final result, the whole process is run in different stages. + * If a stage leverages threads via a worker pool, the worker pool is created + * and we wait until all the threads are done to continue with the next stage. + */ +int RepoAnalysis::Analyze() +{ + int errorCode {GIT_OK}; + + // stage 1 + if ((errorCode = storeObjectsInfo() != GIT_OK)) { + return errorCode; + } + + // stage 2 + if (!setObjectsReachability()) { + return GIT_EUSER; + } + + // stage 3 + pruneUnreachables(); + + // stage 4 + statsCountAndMax(); + + // stage 5 + if (!statsHistoryAndBiggestCheckouts()) { + return GIT_EUSER; + } + + fillOutStatistics(); + + return errorCode; +} + +/** + * RepoAnalysis::StatisticsToJS + */ +v8::Local RepoAnalysis::StatisticsToJS() const +{ + v8::Local result = Nan::New(); + + v8::Local repositorySize = repositorySizeToJS(); + Nan::Set(result, Nan::New("repositorySize").ToLocalChecked(), repositorySize); + + v8::Local biggestObjects = biggestObjectsToJS(); + Nan::Set(result, Nan::New("biggestObjects").ToLocalChecked(), biggestObjects); + + v8::Local historyStructure = historyStructureToJS(); + Nan::Set(result, Nan::New("historyStructure").ToLocalChecked(), historyStructure); + + v8::Local biggestCheckouts = biggestCheckoutsToJS(); + Nan::Set(result, Nan::New("biggestCheckouts").ToLocalChecked(), biggestCheckouts); + + return result; +} + +/** + * RepoAnalysis::storeObjectsInfo + * Store information from read odb objects. + * Starts building a container which eventually will hold only reachable objects. + * Leverages threads via a worker pool . + */ +int RepoAnalysis::storeObjectsInfo() +{ + int errorCode {GIT_OK}; + + // get the objects database + git_odb *odb {nullptr}; + if ((errorCode = git_repository_odb(&odb, m_repo)) != GIT_OK) { + return errorCode; + } + + // initialize workers for the worker pool + const std::string repoPath = git_repository_path(m_repo); + const unsigned int numThreads = + std::max(std::thread::hardware_concurrency(), static_cast(kMinThreads)); + + std::vector< std::shared_ptr > workers {}; + for (unsigned int i = 0; i < numThreads; ++i) { + workers.emplace_back(std::make_shared(repoPath, &m_odbObjectsData)); + } + + // initialize worker pool + WorkerPool workerPool {}; + workerPool.Init(workers); + + if ((errorCode = git_odb_foreach(odb, forEachOdbCb, &workerPool)) != GIT_OK) { + workerPool.Shutdown(); + git_odb_free(odb); + return errorCode; + } + + // main thread will work on the refs while waiting for the threads to finish + if ((errorCode = storeAndCountRefs() != GIT_OK)) { + workerPool.Shutdown(); + git_odb_free(odb); + return errorCode; + } + + // wait for the threads to finish and shutdown the work pool + workerPool.Shutdown(); + + // check there were no problems during execution + if (workerPool.Status() != WPStatus::kOk) { + git_odb_free(odb); + return GIT_EUSER; + } + + git_odb_free(odb); + + return errorCode; +} + +/** + * RepoAnalysis::storeAndCountRefs + * Stores the oid and type of peeled references. + * Also counts total references. + */ +int RepoAnalysis::storeAndCountRefs() +{ + int errorCode {GIT_OK}; + git_strarray ref_list; + + // count refs + if ((errorCode = git_reference_list(&ref_list, m_repo)) != GIT_OK) { + return errorCode; + } + m_statistics.repositorySize.references.count = ref_list.count; + + // store refs info + for (size_t i = 0; i < ref_list.count; ++i) + { + // lookup ref + git_reference *ref {nullptr}; + const int refLookupError = git_reference_lookup(&ref, m_repo, ref_list.strings[i]); + if (refLookupError == GIT_ENOTFOUND || refLookupError == GIT_EINVALIDSPEC) { + continue; + } + else if (refLookupError != GIT_OK) { + git_strarray_dispose(&ref_list); + return refLookupError; + } + + // obtain peeled oid of the reference + bool found_oid = false; + git_oid oid_ref; + switch (git_reference_type(ref)) + { + case GIT_REFERENCE_DIRECT: + git_oid_cpy(&oid_ref, git_reference_target(ref)); + found_oid = true; + break; + + case GIT_REFERENCE_SYMBOLIC: + { + git_reference *ref_resolved {nullptr}; + if ((errorCode = git_reference_resolve(&ref_resolved, ref)) != GIT_OK) { + git_reference_free(ref); + git_strarray_dispose(&ref_list); + return errorCode; + } + git_oid_cpy(&oid_ref, git_reference_target(ref_resolved)); + found_oid = true; + git_reference_free(ref_resolved); + } + break; + + default: + break; + } + + // store object's oid and type + if (found_oid) + { + git_object *target {nullptr}; + if ((errorCode = git_object_lookup(&target, m_repo, &oid_ref, GIT_OBJECT_ANY)) != GIT_OK) { + git_reference_free(ref); + git_strarray_dispose(&ref_list); + return errorCode; + } + + m_peeledRefs.emplace(std::make_pair( + std::string(reinterpret_cast(oid_ref.id), GIT_OID_RAWSZ), + git_object_type(target))); + + git_object_free(target); + } + git_reference_free(ref); + } + git_strarray_dispose(&ref_list); + + return errorCode; +} + +/** + * RepoAnalysis::setObjectsReachability + * Leverages threads via a worker pool to + * set reachability from tags, commits, and trees. + * NOTE: the worker pool leveraged in this method runs at a different stage than the + * worker pool leveraged in previous stages, meaning they do not run at the same time, hence + * access to 'm_odbObjectsData->....info' won't suffer from a data race. + * NOTE: performance didn't improve leveraging threads for adding objects to unreachables container. + * \return false if the workerPool finished with errors; true otherwise + */ +bool RepoAnalysis::setObjectsReachability() +{ + // references are not objects, hence they won't be sent to the worker threads + setReachabilityFromRefs(); + + const unsigned int numThreads = + std::max(std::thread::hardware_concurrency(), static_cast(kMinThreads)); + std::vector< std::shared_ptr > workers {}; + for (unsigned int i = 0; i < numThreads; ++i) { + workers.emplace_back(std::make_shared(&m_odbObjectsData)); + } + + // initialize worker pool + WorkerPool workerPool {}; + workerPool.Init(workers); + + // NOTE: avoid queueing same type of objects in a row, so that different mutex can be used concurrently + uint8_t workInserted {0}; + OdbObjectsData::iterTagInfo itTagInfo = m_odbObjectsData.tags.info.begin(); + OdbObjectsData::iterCommitInfo itCommitInfo = m_odbObjectsData.commits.info.begin(); + OdbObjectsData::iterTreeInfo itTreeInfo = m_odbObjectsData.trees.info.begin(); + do { + workInserted = 0; + // insert tag + if (itTagInfo != m_odbObjectsData.tags.info.end()) { + workerPool.InsertWork(std::make_unique(&itTagInfo->second, GIT_OBJECT_TAG)); + ++itTagInfo; + ++workInserted; + } + // insert commmit + if (itCommitInfo != m_odbObjectsData.commits.info.end()) { + workerPool.InsertWork(std::make_unique(&itCommitInfo->second, GIT_OBJECT_COMMIT)); + ++itCommitInfo; + ++workInserted; + } + // insert tree + if (itTreeInfo != m_odbObjectsData.trees.info.end()) { + workerPool.InsertWork(std::make_unique(&itTreeInfo->second, GIT_OBJECT_TREE)); + ++itTreeInfo; + ++workInserted; + } + // blobs do not reach to any other object, hence no need to process them + } while (workInserted); + + // wait for the threads to finish and shutdown the work pool + workerPool.Shutdown(); + + // check there were no problems during execution + if (workerPool.Status() != WPStatus::kOk) { + return false; + } + + setUnreachables(); + + return true; +} + +/** + * RepoAnalysis::setReachabilityFromRefs + * Adds reachability counter where peeled refs point (normally a commit or a tag). + */ +void RepoAnalysis::setReachabilityFromRefs() +{ + for (const auto &ref : m_peeledRefs) { + switch (ref.second) { + case GIT_OBJECT_COMMIT: + { + OdbObjectsData::iterCommitInfo itCommitInfo = + m_odbObjectsData.commits.info.find(ref.first); + + if (itCommitInfo != m_odbObjectsData.commits.info.end()) { + ++itCommitInfo->second.reachability; + } + } + break; + case GIT_OBJECT_TREE: + { + OdbObjectsData::iterTreeInfo itTreeInfo = + m_odbObjectsData.trees.info.find(ref.first); + + if (itTreeInfo != m_odbObjectsData.trees.info.end()) { + ++itTreeInfo->second.reachability; + } + } + break; + case GIT_OBJECT_BLOB: + { + OdbObjectsData::iterBlobInfo itBlobInfo = + m_odbObjectsData.blobs.info.find(ref.first); + + if (itBlobInfo != m_odbObjectsData.blobs.info.end()) { + ++itBlobInfo->second.reachability; + } + } + break; + case GIT_OBJECT_TAG: + { + OdbObjectsData::iterTagInfo itTagInfo = + m_odbObjectsData.tags.info.find(ref.first); + + if (itTagInfo != m_odbObjectsData.tags.info.end()) { + ++itTagInfo->second.reachability; + } + } + break; + default: + break; + } + } +} + +/** + * RepoAnalysis::setUnreachables + * After setting reachability, we add the unreached objects to their unreachables container. + */ +void RepoAnalysis::setUnreachables() +{ + for (const auto &tag : m_odbObjectsData.tags.info) { + if (!tag.second.reachability) { + m_odbObjectsData.tags.unreachables.emplace(tag.first); + } + } + for (const auto &commit : m_odbObjectsData.commits.info) { + if (!commit.second.reachability) { + m_odbObjectsData.commits.unreachables.emplace(commit.first); + } + } + for (const auto &tree : m_odbObjectsData.trees.info) { + if (!tree.second.reachability) { + m_odbObjectsData.trees.unreachables.emplace(tree.first); + } + } + for (const auto &blob : m_odbObjectsData.blobs.info) { + if (!blob.second.reachability) { + m_odbObjectsData.blobs.unreachables.emplace(blob.first); + } + } +} + +/** + * RepoAnalysis::pruneUnreachables + * Removes from their containers the unreachable objects. + * Decreases reachability of the objects they can reach. + */ +void RepoAnalysis::pruneUnreachables() +{ + // NOTE: order is important here, since each method prunes its own objects, but + // only decreases reachability of the objects connected to it; and those + // connected objects will be checked and pruned afterwards. + pruneUnreachableTags(); + pruneUnreachableCommits(); + pruneUnreachableTrees(); + pruneUnreachableBlobs(); +} + +/** + * RepoAnalysis::pruneUnreachableTags + * Prune tags and their chained tags if they become unreachable. + * Also decreases reachability of targets. + */ +void RepoAnalysis::pruneUnreachableTags() +{ + while (!m_odbObjectsData.tags.unreachables.empty()) { + std::unordered_set newUnreachables {}; + + // erase unreachable tags + for (OdbObjectsData::iterUnreachable itTagUnrch = m_odbObjectsData.tags.unreachables.begin(); + itTagUnrch != m_odbObjectsData.tags.unreachables.end(); ++itTagUnrch) + { + OdbObjectsData::iterTagInfo itTagInfo = m_odbObjectsData.tags.info.find(*itTagUnrch); + + if (itTagInfo != m_odbObjectsData.tags.info.end()) { + const std::string &oidTarget = itTagInfo->second.oidTarget; + switch (itTagInfo->second.typeTarget) { + case GIT_OBJECT_TAG: + { + // if target is another tag, add it to newUnreachables + OdbObjectsData::iterTagInfo itTargetTagInfo = m_odbObjectsData.tags.info.find(oidTarget); + if (itTargetTagInfo != m_odbObjectsData.tags.info.end()) { + if (--itTargetTagInfo->second.reachability == OdbObjectsData::kUnreachable) { + newUnreachables.emplace(itTargetTagInfo->first); + } + } + } + break; + case GIT_OBJECT_COMMIT: + { + OdbObjectsData::iterCommitInfo itCommitInfo = m_odbObjectsData.commits.info.find(oidTarget); + if (itCommitInfo != m_odbObjectsData.commits.info.end()) { + if (--itCommitInfo->second.reachability == OdbObjectsData::kUnreachable) { + m_odbObjectsData.commits.unreachables.emplace(itCommitInfo->first); + } + } + } + break; + case GIT_OBJECT_TREE: + { + OdbObjectsData::iterTreeInfo itTreeInfo = m_odbObjectsData.trees.info.find(oidTarget); + if (itTreeInfo != m_odbObjectsData.trees.info.end()) { + if (--itTreeInfo->second.reachability == OdbObjectsData::kUnreachable) { + m_odbObjectsData.trees.unreachables.emplace(itTreeInfo->first); + } + } + } + break; + case GIT_OBJECT_BLOB: + { + OdbObjectsData::iterBlobInfo itBlobInfo = m_odbObjectsData.blobs.info.find(oidTarget); + if (itBlobInfo != m_odbObjectsData.blobs.info.end()) { + if (--itBlobInfo->second.reachability == OdbObjectsData::kUnreachable) { + m_odbObjectsData.blobs.unreachables.emplace(itBlobInfo->first); + } + } + } + break; + default: + break; + } + // erase tag from the tag's container + m_odbObjectsData.tags.info.erase(itTagInfo); + } + } + // set new unreachable tags + m_odbObjectsData.tags.unreachables = std::move(newUnreachables); + } +} + +/** + * RepoAnalysis::pruneUnreachableCommits + * Prune commits and decrease reachability of their associated trees. + */ +void RepoAnalysis::pruneUnreachableCommits() +{ + while (!m_odbObjectsData.commits.unreachables.empty()) { + std::unordered_set newUnreachables {}; + + // erase unreachable commits + for (OdbObjectsData::iterUnreachable itCommitUnrch = m_odbObjectsData.commits.unreachables.begin(); + itCommitUnrch != m_odbObjectsData.commits.unreachables.end(); ++itCommitUnrch) + { + OdbObjectsData::iterCommitInfo itCommitInfo = m_odbObjectsData.commits.info.find(*itCommitUnrch); + + if (itCommitInfo != m_odbObjectsData.commits.info.end()) + { + // decrease commit's parents reachability and add them as newUnreachable + const size_t numParents = itCommitInfo->second.parents.size(); + for (size_t i = 0; i < numParents; ++i) { + OdbObjectsData::iterCommitInfo itParentCommitInfo = + m_odbObjectsData.commits.info.find(itCommitInfo->second.parents.at(i)); + + if (itParentCommitInfo != m_odbObjectsData.commits.info.end()) { + if (--itParentCommitInfo->second.reachability == OdbObjectsData::kUnreachable) { + newUnreachables.emplace(itParentCommitInfo->first); + } + } + } + // decrease reachability of the commit's tree + OdbObjectsData::iterTreeInfo itTreeInfo = + m_odbObjectsData.trees.info.find(itCommitInfo->second.oidTree); + if (itTreeInfo != m_odbObjectsData.trees.info.end()) { + if (--itTreeInfo->second.reachability == OdbObjectsData::kUnreachable) { + m_odbObjectsData.trees.unreachables.emplace(itTreeInfo->first); + } + } + // erase commit from the commit's container + m_odbObjectsData.commits.info.erase(itCommitInfo); + } + } + // set new unreachable commits + m_odbObjectsData.commits.unreachables = std::move(newUnreachables); + } +} + +/** + * RepoAnalysis::pruneUnreachableTrees + * Prune unreachable trees and decrement reachability of their entries. + */ +void RepoAnalysis::pruneUnreachableTrees() +{ + while (!m_odbObjectsData.trees.unreachables.empty()) { + std::unordered_set newUnreachables {}; + + // erase unreachable trees + for (OdbObjectsData::iterUnreachable itTreeUnrch = m_odbObjectsData.trees.unreachables.begin(); + itTreeUnrch != m_odbObjectsData.trees.unreachables.end(); ++itTreeUnrch) + { + OdbObjectsData::iterTreeInfo itTreeInfo = m_odbObjectsData.trees.info.find(*itTreeUnrch); + + if (itTreeInfo != m_odbObjectsData.trees.info.end()) { + // decrease reachability of the entry blobs + for (auto &blob : itTreeInfo->second.entryBlobs) { + OdbObjectsData::iterBlobInfo itEntryBlobInfo = m_odbObjectsData.blobs.info.find(blob); + if (itEntryBlobInfo != m_odbObjectsData.blobs.info.end()) { + if (--itEntryBlobInfo->second.reachability == OdbObjectsData::kUnreachable) { + m_odbObjectsData.blobs.unreachables.emplace(blob); + } + } + } + // decrease reachability of the entry trees and add them as newUnreachables + for (auto &treeNameLen : itTreeInfo->second.entryTreesNameLen) { + OdbObjectsData::iterTreeInfo itEntryTreeInfo = + m_odbObjectsData.trees.info.find(treeNameLen.first); + if (itEntryTreeInfo != m_odbObjectsData.trees.info.end()) { + if (--itEntryTreeInfo->second.reachability == OdbObjectsData::kUnreachable) { + newUnreachables.emplace(treeNameLen.first); + } + } + } + // erase tree from the tree's container + m_odbObjectsData.trees.info.erase(itTreeInfo); + } + } + // set new unreachable trees + m_odbObjectsData.trees.unreachables = std::move(newUnreachables); + } +} + +/** + * RepoAnalysis::pruneUnreachableBlobs + * Rremoves unreachable blobs from their container. + */ +void RepoAnalysis::pruneUnreachableBlobs() +{ + for (OdbObjectsData::iterUnreachable itBlobUnrch = m_odbObjectsData.blobs.unreachables.begin(); + itBlobUnrch != m_odbObjectsData.blobs.unreachables.end(); ++itBlobUnrch) + { + m_odbObjectsData.blobs.info.erase(*itBlobUnrch); + } +} + +/** + * RepoAnalysis::statsCountAndMax + * Statistics for repositorySize (count objects) and biggestObjects (get maximum of them). + * Also builds the commits graph. + * NOTE: better results achieved not leveraging threads. + */ +void RepoAnalysis::statsCountAndMax() +{ + // commits + for (auto &info : m_odbObjectsData.commits.info) { + OdbObjectsData::CommitInfo &commitInfo = info.second; + const size_t objectSize = commitInfo.size; + + m_odbObjectsData.commits.totalSize += objectSize; + m_odbObjectsData.commits.maxSize = std::max(m_odbObjectsData.commits.maxSize, objectSize); + m_odbObjectsData.commits.maxParents = std::max( + m_odbObjectsData.commits.maxParents, commitInfo.parents.size()); + + // build commit's graph + m_odbObjectsData.commits.graph.AddNode(info.first, commitInfo.parents); + } + // trees + for (auto &info : m_odbObjectsData.trees.info) { + OdbObjectsData::TreeInfoAndStats &treeInfo = info.second; + const size_t numEntries = treeInfo.numEntries; + const size_t objectSize = treeInfo.size; + + m_odbObjectsData.trees.totalSize += objectSize; + m_odbObjectsData.trees.totalEntries += numEntries; + m_odbObjectsData.trees.maxEntries = std::max(m_odbObjectsData.trees.maxEntries, numEntries); + } + // blobs + for (auto &info : m_odbObjectsData.blobs.info) { + OdbObjectsData::BlobInfo &blobInfo = info.second; + const size_t objectSize = blobInfo.size; + + m_odbObjectsData.blobs.totalSize += objectSize; + m_odbObjectsData.blobs.maxSize = std::max(m_odbObjectsData.blobs.maxSize, objectSize); + } + // no need to process tags here (we already have the count) +} + +/** + * RepoAnalysis::statsHistoryAndBiggestCheckouts + * Statistics for historyStructure and biggestCheckouts. + * \return true if success; false if something went wrong. + */ +bool RepoAnalysis::statsHistoryAndBiggestCheckouts() +{ + if (!calculateBiggestCheckouts()) { + return false; + } + + if (!calculateMaxTagDepth()) { + return false; + } + + // calculate max commit history depth + m_statistics.historyStructure.maxDepth = m_odbObjectsData.commits.graph.CalculateMaxDepth(); + + return true; +} + +/** + * RepoAnalysis::calculateBiggestCheckouts + * + * Once threads have collected data from objects and unreachable objects + * have been pruned, biggest checkouts can be calculated. + * Threads have already collected partial non-recursive tree statistics. + * \return true if success; false if something went wrong. + */ +bool RepoAnalysis::calculateBiggestCheckouts() +{ + for (auto &commitInfo : m_odbObjectsData.commits.info) + { + // calculate this commit's data + const std::string &commitOidTree = commitInfo.second.oidTree; + + OdbObjectsData::iterTreeInfo itTreeInfo {}; + if ((itTreeInfo = calculateTreeStatistics(commitOidTree)) == m_odbObjectsData.trees.info.end()) { + return false; + } + + // update biggestCheckouts data + OdbObjectsData::TreeInfoAndStats &treeInfoAndStats = itTreeInfo->second; + m_statistics.biggestCheckouts.numDirectories = std::max( + m_statistics.biggestCheckouts.numDirectories, treeInfoAndStats.stats.numDirectories); + m_statistics.biggestCheckouts.totalFileSize = std::max( + m_statistics.biggestCheckouts.totalFileSize, treeInfoAndStats.stats.totalFileSize); + m_statistics.biggestCheckouts.maxPathDepth = std::max( + m_statistics.biggestCheckouts.maxPathDepth, treeInfoAndStats.stats.maxPathDepth); + m_statistics.biggestCheckouts.numFiles = std::max( + m_statistics.biggestCheckouts.numFiles, treeInfoAndStats.stats.numFiles); + m_statistics.biggestCheckouts.maxPathLength = std::max( + m_statistics.biggestCheckouts.maxPathLength, treeInfoAndStats.stats.maxPathLength); + m_statistics.biggestCheckouts.numSymlinks = std::max( + m_statistics.biggestCheckouts.numSymlinks, treeInfoAndStats.stats.numSymlinks); + m_statistics.biggestCheckouts.numSubmodules = std::max( + m_statistics.biggestCheckouts.numSubmodules, treeInfoAndStats.stats.numSubmodules); + } + + return true; +} + +/** + * RepoAnalysis::calculateTreeStatistics + * + * Calculates tree statistics recursively, considering individual tree's statistics + * have already been calculated. + * The maximum number of recursive calls depend directly on the maximum path depth of + * the repository. For instance, the linux repository have a maximum path depth of 13, + * so it should be safe against stack overflow. + * Returns an iterator to the tree info container, or to end if something went wrong. + */ +OdbObjectsData::iterTreeInfo RepoAnalysis::calculateTreeStatistics(const std::string &oidTree) +{ + OdbObjectsData::iterTreeInfo itTreeInfo = m_odbObjectsData.trees.info.find(oidTree); + if (itTreeInfo == m_odbObjectsData.trees.info.end()) { + return itTreeInfo; + } + + OdbObjectsData::TreeInfoAndStats &treeInfoAndStats = itTreeInfo->second; + + // prune recursivity + if (treeInfoAndStats.statsDone) { + return itTreeInfo; + } + + ++treeInfoAndStats.stats.numDirectories; + ++treeInfoAndStats.stats.maxPathDepth; + // the following partial statistics have also been calculated in previous stage with threads: + // - treeInfoAndStats.stats.numFiles + // - treeInfoAndStats.stats.maxPathLength + // - treeInfoAndStats.stats.numSymLinks + // - treeInfoAndStats.stats.numSubmodules + + // totalFileSize + OdbObjectsData::iterBlobInfo itBlobInfo {}; + for (auto &oidBlob : treeInfoAndStats.entryBlobs) + { + if ((itBlobInfo = m_odbObjectsData.blobs.info.find(oidBlob)) == m_odbObjectsData.blobs.info.end()) { + return m_odbObjectsData.trees.info.end(); // to let the caller know that something went wrong + } + + treeInfoAndStats.stats.totalFileSize += itBlobInfo->second.size; + } + + // recursively into subtrees + for (const auto &subTreeNameLen : treeInfoAndStats.entryTreesNameLen) + { + OdbObjectsData::iterTreeInfo itSubTreeInfo {}; + if ((itSubTreeInfo = calculateTreeStatistics(subTreeNameLen.first)) == + m_odbObjectsData.trees.info.end()) { + return itSubTreeInfo; + } + + OdbObjectsData::TreeInfoAndStats &subTreeInfoAndStats = itSubTreeInfo->second; + treeInfoAndStats.stats.numDirectories += subTreeInfoAndStats.stats.numDirectories; + treeInfoAndStats.stats.maxPathDepth = std::max(treeInfoAndStats.stats.maxPathDepth, + subTreeInfoAndStats.stats.maxPathDepth + 1); + treeInfoAndStats.stats.maxPathLength = std::max(treeInfoAndStats.stats.maxPathLength, + subTreeNameLen.second + 1 + subTreeInfoAndStats.stats.maxPathLength); + treeInfoAndStats.stats.numFiles += subTreeInfoAndStats.stats.numFiles; + treeInfoAndStats.stats.totalFileSize += subTreeInfoAndStats.stats.totalFileSize; + treeInfoAndStats.stats.numSymlinks += subTreeInfoAndStats.stats.numSymlinks; + treeInfoAndStats.stats.numSubmodules += subTreeInfoAndStats.stats.numSubmodules; + } + + treeInfoAndStats.statsDone = true; + + return itTreeInfo; +} + +/** + * RepoAnalysis::calculateMaxTagDepth + * \return true if success; false if something went wrong. + */ +bool RepoAnalysis::calculateMaxTagDepth() +{ + for (auto &tag : m_odbObjectsData.tags.info) + { + OdbObjectsData::iterTagInfo itTagInfo {}; + if ((itTagInfo = calculateTagDepth(tag.first)) == m_odbObjectsData.tags.info.end()) { + return false; + } + + // update maxTagDepth + OdbObjectsData::TagInfo &tagInfo = itTagInfo->second; + m_statistics.historyStructure.maxTagDepth = std::max( + m_statistics.historyStructure.maxTagDepth, tagInfo.depth); + } + + return true; +} + +/** + * RepoAnalysis::calculateTagDepth + * + * Calculates recursively the tag depth of the oidTag passed as a parameter. + * Returns an iterator to the tag info container, or to end if something went wrong. + */ +OdbObjectsData::iterTagInfo RepoAnalysis::calculateTagDepth(const std::string &oidTag) +{ + OdbObjectsData::iterTagInfo itTagInfo = m_odbObjectsData.tags.info.find(oidTag); + if (itTagInfo == m_odbObjectsData.tags.info.end()) { + return itTagInfo; + } + + OdbObjectsData::TagInfo &tagInfo = itTagInfo->second; + + // prune recursivity + if (tagInfo.depth != OdbObjectsData::TagInfo::kUnsetDepth) { + return itTagInfo; + } + + ++tagInfo.depth; + + if (tagInfo.typeTarget == GIT_OBJECT_TAG) + { + OdbObjectsData::iterTagInfo itChainedTagInfo {}; + if ((itChainedTagInfo = calculateTagDepth(tagInfo.oidTarget)) == m_odbObjectsData.tags.info.end()) { + return itChainedTagInfo; + } + + OdbObjectsData::TagInfo &chainedTagInfo = itChainedTagInfo->second; + tagInfo.depth += chainedTagInfo.depth; + } + + return itTagInfo; +} + +/** + * RepoAnalysis::fillOutStatistics + */ +void RepoAnalysis::fillOutStatistics() +{ + m_statistics.repositorySize.commits.count = m_odbObjectsData.commits.info.size(); + m_statistics.repositorySize.commits.size = m_odbObjectsData.commits.totalSize; + m_statistics.repositorySize.trees.count = m_odbObjectsData.trees.info.size(); + m_statistics.repositorySize.trees.size = m_odbObjectsData.trees.totalSize; + m_statistics.repositorySize.trees.entries = m_odbObjectsData.trees.totalEntries; + m_statistics.repositorySize.blobs.count = m_odbObjectsData.blobs.info.size(); + m_statistics.repositorySize.blobs.size = m_odbObjectsData.blobs.totalSize; + m_statistics.repositorySize.annotatedTags.count = m_odbObjectsData.tags.info.size(); + + m_statistics.biggestObjects.commits.maxSize = m_odbObjectsData.commits.maxSize; + m_statistics.biggestObjects.commits.maxParents = m_odbObjectsData.commits.maxParents; + m_statistics.biggestObjects.trees.maxEntries = m_odbObjectsData.trees.maxEntries; + m_statistics.biggestObjects.blobs.maxSize = m_odbObjectsData.blobs.maxSize; + + // m_statistics.biggestCheckouts have already been filled out while running +} + +/** + * RepoAnalysis::repositorySizeToJS + */ +v8::Local RepoAnalysis::repositorySizeToJS() const +{ + v8::Local commits = Nan::New(); + Nan::Set(commits, Nan::New("count").ToLocalChecked(), + Nan::New(m_statistics.repositorySize.commits.count)); + Nan::Set(commits, Nan::New("size").ToLocalChecked(), + Nan::New(m_statistics.repositorySize.commits.size)); + + v8::Local trees = Nan::New(); + Nan::Set(trees, Nan::New("count").ToLocalChecked(), + Nan::New(m_statistics.repositorySize.trees.count)); + Nan::Set(trees, Nan::New("size").ToLocalChecked(), + Nan::New(m_statistics.repositorySize.trees.size)); + Nan::Set(trees, Nan::New("entries").ToLocalChecked(), + Nan::New(m_statistics.repositorySize.trees.entries)); + + v8::Local blobs = Nan::New(); + Nan::Set(blobs, Nan::New("count").ToLocalChecked(), + Nan::New(m_statistics.repositorySize.blobs.count)); + Nan::Set(blobs, Nan::New("size").ToLocalChecked(), + Nan::New(m_statistics.repositorySize.blobs.size)); + + v8::Local annotatedTags = Nan::New(); + Nan::Set(annotatedTags, Nan::New("count").ToLocalChecked(), + Nan::New(m_statistics.repositorySize.annotatedTags.count)); + + v8::Local references = Nan::New(); + Nan::Set(references, Nan::New("count").ToLocalChecked(), + Nan::New(m_statistics.repositorySize.references.count)); + + v8::Local result = Nan::New(); + Nan::Set(result, Nan::New("commits").ToLocalChecked(), commits); + Nan::Set(result, Nan::New("trees").ToLocalChecked(), trees); + Nan::Set(result, Nan::New("blobs").ToLocalChecked(), blobs); + Nan::Set(result, Nan::New("annotatedTags").ToLocalChecked(), annotatedTags); + Nan::Set(result, Nan::New("references").ToLocalChecked(), references); + + return result; +} + +/** + * RepoAnalysis::biggestObjectsToJS + */ +v8::Local RepoAnalysis::biggestObjectsToJS() const +{ + v8::Local commits = Nan::New(); + Nan::Set(commits, Nan::New("maxSize").ToLocalChecked(), + Nan::New(m_statistics.biggestObjects.commits.maxSize)); + Nan::Set(commits, Nan::New("maxParents").ToLocalChecked(), + Nan::New(m_statistics.biggestObjects.commits.maxParents)); + + v8::Local trees = Nan::New(); + Nan::Set(trees, Nan::New("maxEntries").ToLocalChecked(), + Nan::New(m_statistics.biggestObjects.trees.maxEntries)); + + v8::Local blobs = Nan::New(); + Nan::Set(blobs, Nan::New("maxSize").ToLocalChecked(), + Nan::New(m_statistics.biggestObjects.blobs.maxSize)); + + v8::Local result = Nan::New(); + Nan::Set(result, Nan::New("commits").ToLocalChecked(), commits); + Nan::Set(result, Nan::New("trees").ToLocalChecked(), trees); + Nan::Set(result, Nan::New("blobs").ToLocalChecked(), blobs); + + return result; +} + +/** + * RepoAnalysis::historyStructureToJS + */ +v8::Local RepoAnalysis::historyStructureToJS() const +{ + v8::Local result = Nan::New(); + Nan::Set(result, Nan::New("maxDepth").ToLocalChecked(), + Nan::New(m_statistics.historyStructure.maxDepth)); + Nan::Set(result, Nan::New("maxTagDepth").ToLocalChecked(), + Nan::New(m_statistics.historyStructure.maxTagDepth)); + + return result; +} + +/** + * RepoAnalysis::biggestCheckoutsToJS + */ +v8::Local RepoAnalysis::biggestCheckoutsToJS() const +{ + v8::Local result = Nan::New(); + Nan::Set(result, Nan::New("numDirectories").ToLocalChecked(), + Nan::New(m_statistics.biggestCheckouts.numDirectories)); + Nan::Set(result, Nan::New("maxPathDepth").ToLocalChecked(), + Nan::New(m_statistics.biggestCheckouts.maxPathDepth)); + Nan::Set(result, Nan::New("maxPathLength").ToLocalChecked(), + Nan::New(m_statistics.biggestCheckouts.maxPathLength)); + Nan::Set(result, Nan::New("numFiles").ToLocalChecked(), + Nan::New(m_statistics.biggestCheckouts.numFiles)); + Nan::Set(result, Nan::New("totalFileSize").ToLocalChecked(), + Nan::New(m_statistics.biggestCheckouts.totalFileSize)); + Nan::Set(result, Nan::New("numSymlinks").ToLocalChecked(), + Nan::New(m_statistics.biggestCheckouts.numSymlinks)); + Nan::Set(result, Nan::New("numSubmodules").ToLocalChecked(), + Nan::New(m_statistics.biggestCheckouts.numSubmodules)); + + return result; +} + +NAN_METHOD(GitRepository::Statistics) +{ + if (!info[info.Length() - 1]->IsFunction()) { + return Nan::ThrowError("Callback is required and must be a Function."); + } + + StatisticsBaton* baton = new StatisticsBaton(); + + baton->error_code = GIT_OK; + baton->error = NULL; + baton->repo = Nan::ObjectWrap::Unwrap(info.This())->GetValue(); + baton->out = static_cast(new RepoAnalysis(baton->repo)); + + Nan::Callback *callback = new Nan::Callback(Local::Cast(info[info.Length() - 1])); + std::map> cleanupHandles; + StatisticsWorker *worker = new StatisticsWorker(baton, callback, cleanupHandles); + worker->Reference("repo", info.This()); + nodegit::Context *nodegitContext = + reinterpret_cast(info.Data().As()->Value()); + nodegitContext->QueueWorker(worker); + return; +} + +nodegit::LockMaster GitRepository::StatisticsWorker::AcquireLocks() +{ + nodegit::LockMaster lockMaster(true, baton->repo); + + return lockMaster; +} + +void GitRepository::StatisticsWorker::Execute() +{ + git_error_clear(); + + RepoAnalysis *repoAnalysis = static_cast(baton->out); + if ((baton->error_code = repoAnalysis->Analyze()) != GIT_OK) + { + if (git_error_last()->klass != GIT_ERROR_NONE) { + baton->error = git_error_dup(git_error_last()); + } + + delete repoAnalysis; + baton->out = nullptr; + } +} + +void GitRepository::StatisticsWorker::HandleErrorCallback() +{ + if (baton->error) { + if (baton->error->message) { + free((void *)baton->error->message); + } + + free((void *)baton->error); + } + + RepoAnalysis *repoAnalysis = static_cast(baton->out); + if (repoAnalysis) { + delete repoAnalysis; + } + + delete baton; +} + +void GitRepository::StatisticsWorker::HandleOKCallback() +{ + if (baton->out != NULL) + { + RepoAnalysis *repoAnalysis = static_cast(baton->out); + Local result = repoAnalysis->StatisticsToJS(); + + delete repoAnalysis; + + Local argv[2] = { + Nan::Null(), + result + }; + callback->Call(2, argv, async_resource); + } + else if (baton->error) + { + Local err; + + if (baton->error->message) { + err = Nan::To(Nan::Error(baton->error->message)).ToLocalChecked(); + } else { + err = Nan::To(Nan::Error("Method statistics has thrown an error.")).ToLocalChecked(); + } + Nan::Set(err, Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); + Nan::Set(err, Nan::New("errorFunction").ToLocalChecked(), Nan::New("GitRepository.statistics").ToLocalChecked()); + Local argv[1] = { + err + }; + + callback->Call(1, argv, async_resource); + + if (baton->error->message) { + free((void *)baton->error->message); + } + + free((void *)baton->error); + } + else if (baton->error_code < 0) + { + Local err = Nan::To(Nan::Error("Method statistics has thrown an error.")).ToLocalChecked(); + Nan::Set(err, Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); + Nan::Set(err, Nan::New("errorFunction").ToLocalChecked(), Nan::New("GitRepository.statistics").ToLocalChecked()); + Local argv[1] = { + err + }; + callback->Call(1, argv, async_resource); + } + else + { + callback->Call(0, NULL, async_resource); + } + + delete baton; +} \ No newline at end of file diff --git a/generate/templates/manual/revwalk/commit_walk.cc b/generate/templates/manual/revwalk/commit_walk.cc new file mode 100644 index 0000000000..4fe60de9e1 --- /dev/null +++ b/generate/templates/manual/revwalk/commit_walk.cc @@ -0,0 +1,275 @@ +#define SET_ON_OBJECT(obj, field, data) Nan::Set(obj, Nan::New(field).ToLocalChecked(), data) + +v8::Local signatureToJavascript(const git_signature *signature) { + v8::Local signatureObject = Nan::New(); + SET_ON_OBJECT(signatureObject, "name", Nan::New(signature->name).ToLocalChecked()); + SET_ON_OBJECT(signatureObject, "email", Nan::New(signature->email).ToLocalChecked()); + SET_ON_OBJECT(signatureObject, "date", Nan::New(signature->when.time * 1000)); + std::stringstream fullSignature; + fullSignature << signature->name << " <" << signature << ">"; + SET_ON_OBJECT(signatureObject, "full", Nan::New(fullSignature.str()).ToLocalChecked()); + return signatureObject; +} + +#include +class CommitModel { +public: + CommitModel(git_commit *commit, bool fetchSignature): + commit(commit), + fetchSignature(fetchSignature), + signature({ 0, 0, 0 }), + signedData({ 0, 0, 0 }) + { + if (fetchSignature) { + const int error = git_commit_extract_signature( + &signature, + &signedData, + git_commit_owner(commit), + const_cast(git_commit_id(commit)), + NULL + ); + if (error != GIT_ENOTFOUND) { + assert(error == GIT_OK); + } + } + + const size_t parentCount = git_commit_parentcount(commit); + parentIds.reserve(parentCount); + for (size_t parentIndex = 0; parentIndex < parentCount; ++parentIndex) { + parentIds.push_back(git_oid_tostr_s(git_commit_parent_id(commit, parentIndex))); + } + } + + CommitModel(const CommitModel &) = delete; + CommitModel(CommitModel &&) = delete; + CommitModel &operator=(const CommitModel &) = delete; + CommitModel &operator=(CommitModel &&) = delete; + + v8::Local toJavascript() { + if (!fetchSignature) { + v8::Local commitObject = GitCommit::New( + commit, + true, + Nan::To(GitRepository::New( + git_commit_owner(commit), + true + )).ToLocalChecked() + ); + commit = NULL; + return commitObject; + } + + v8::Local commitModel = Nan::New(); + SET_ON_OBJECT(commitModel, "sha", Nan::New(git_oid_tostr_s(git_commit_id(commit))).ToLocalChecked()); + SET_ON_OBJECT(commitModel, "message", Nan::New(git_commit_message(commit)).ToLocalChecked()); + SET_ON_OBJECT(commitModel, "author", signatureToJavascript(git_commit_author(commit))); + SET_ON_OBJECT(commitModel, "committer", signatureToJavascript(git_commit_committer(commit))); + + size_t parentCount = parentIds.size(); + v8::Local parents = Nan::New(parentCount); + for (size_t parentIndex = 0; parentIndex < parentCount; ++parentIndex) { + Nan::Set(parents, Nan::New(parentIndex), Nan::New(parentIds[parentIndex]).ToLocalChecked()); + } + SET_ON_OBJECT(commitModel, "parents", parents); + + if (signature.size != 0 || signedData.size != 0) { + v8::Local gpgSignature = Nan::New(); + if (signature.size != 0) { + SET_ON_OBJECT(gpgSignature, "signature", Nan::New(signature.ptr).ToLocalChecked()); + } else { + SET_ON_OBJECT(gpgSignature, "signature", Nan::Null()); + } + + if (signedData.size != 0) { + SET_ON_OBJECT(gpgSignature, "signedData", Nan::New(signedData.ptr).ToLocalChecked()); + } else { + SET_ON_OBJECT(gpgSignature, "signedData", Nan::Null()); + } + + SET_ON_OBJECT(commitModel, "gpgSignature", gpgSignature); + } + + return commitModel; + } + + ~CommitModel() { + git_buf_dispose(&signature); + git_buf_dispose(&signedData); + if (commit) { + git_commit_free(commit); + } + } + +private: + git_commit *commit; + bool fetchSignature; + git_buf signature, signedData; + std::vector parentIds; +}; + +NAN_METHOD(GitRevwalk::CommitWalk) { + if (info.Length() == 0 || !info[0]->IsNumber()) { + return Nan::ThrowError("Max count is required and must be a number."); + } + + if (info.Length() >= 3 && !info[1]->IsNull() && !info[1]->IsUndefined() && !info[1]->IsObject()) { + return Nan::ThrowError("Options must be an object, null, or undefined."); + } + + if (!info[info.Length() - 1]->IsFunction()) { + return Nan::ThrowError("Callback is required and must be a Function."); + } + + CommitWalkBaton* baton = new CommitWalkBaton(); + + baton->error_code = GIT_OK; + baton->error = NULL; + baton->max_count = Nan::To(info[0]).FromJust(); + std::vector *out = new std::vector; + out->reserve(baton->max_count); + baton->out = static_cast(out); + if (info.Length() == 3 && info[1]->IsObject()) { + v8::Local options = Nan::To(info[1]).ToLocalChecked(); + v8::Local propName = Nan::New("returnPlainObjects").ToLocalChecked(); + if (Nan::Has(options, propName).FromJust()) { + baton->returnPlainObjects = Nan::Get(options, propName).ToLocalChecked()->IsTrue(); + } else { + baton->returnPlainObjects = false; + } + } else { + baton->returnPlainObjects = false; + } + baton->walk = Nan::ObjectWrap::Unwrap(info.This())->GetValue(); + Nan::Callback *callback = new Nan::Callback(Local::Cast(info[info.Length() - 1])); + std::map> cleanupHandles; + CommitWalkWorker *worker = new CommitWalkWorker(baton, callback, cleanupHandles); + worker->Reference("commitWalk", info.This()); + + nodegit::Context *nodegitContext = reinterpret_cast(info.Data().As()->Value()); + nodegitContext->QueueWorker(worker); + return; +} + +nodegit::LockMaster GitRevwalk::CommitWalkWorker::AcquireLocks() { + nodegit::LockMaster lockMaster(true); + return lockMaster; +} + +void GitRevwalk::CommitWalkWorker::Execute() { + giterr_clear(); + + std::vector *out = static_cast *>(baton->out); + for (int i = 0; i < baton->max_count; i++) { + git_oid next_commit_id; + baton->error_code = git_revwalk_next(&next_commit_id, baton->walk); + + if (baton->error_code == GIT_ITEROVER) { + baton->error_code = GIT_OK; + return; + } + + if (baton->error_code != GIT_OK) { + if (giterr_last() != NULL) { + baton->error = git_error_dup(giterr_last()); + } + + while (out->size()) { + delete out->back(); + out->pop_back(); + } + + delete out; + baton->out = NULL; + + return; + } + + git_commit *commit; + baton->error_code = git_commit_lookup(&commit, git_revwalk_repository(baton->walk), &next_commit_id); + + if (baton->error_code != GIT_OK) { + if (giterr_last() != NULL) { + baton->error = git_error_dup(giterr_last()); + } + + while (out->size()) { + delete out->back(); + out->pop_back(); + } + + delete out; + baton->out = NULL; + + return; + } + + out->push_back(new CommitModel(commit, baton->returnPlainObjects)); + } +} + +void GitRevwalk::CommitWalkWorker::HandleErrorCallback() { + if (baton->error) { + if (baton->error->message) { + free((void *)baton->error->message); + } + + free((void *)baton->error); + } + + auto out = static_cast *>(baton->out); + while (out->size()) { + delete out->back(); + out->pop_back(); + } + + delete out; + + delete baton; +} + +void GitRevwalk::CommitWalkWorker::HandleOKCallback() { + if (baton->out != NULL) { + std::vector *out = static_cast *>(baton->out); + const unsigned int size = out->size(); + Local result = Nan::New(size); + for (unsigned int i = 0; i < size; i++) { + CommitModel *commitModel = out->at(i); + Nan::Set( + result, + Nan::New(i), + commitModel->toJavascript() + ); + delete commitModel; + } + + delete out; + + Local argv[2] = { + Nan::Null(), + result + }; + callback->Call(2, argv, async_resource); + } else if (baton->error) { + Local argv[1] = { + Nan::Error(baton->error->message) + }; + callback->Call(1, argv, async_resource); + if (baton->error->message) { + free((void *)baton->error->message); + } + + free((void *)baton->error); + } else if (baton->error_code < 0) { + Local err = Nan::To(Nan::Error("Revwalk commitWalk has thrown an error.")).ToLocalChecked(); + Nan::Set(err, Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); + Nan::Set(err, Nan::New("errorFunction").ToLocalChecked(), Nan::New("Revwalk.commitWalk").ToLocalChecked()); + Local argv[1] = { + err + }; + callback->Call(1, argv, async_resource); + } else { + callback->Call(0, NULL, async_resource); + } + + delete baton; +} diff --git a/generate/templates/manual/revwalk/fast_walk.cc b/generate/templates/manual/revwalk/fast_walk.cc new file mode 100644 index 0000000000..ce2d05a2d3 --- /dev/null +++ b/generate/templates/manual/revwalk/fast_walk.cc @@ -0,0 +1,168 @@ +NAN_METHOD(GitRevwalk::FastWalk) +{ + if (info.Length() == 0 || !info[0]->IsNumber()) { + return Nan::ThrowError("Max count is required and must be a number."); + } + + if (!info[info.Length() - 1]->IsFunction()) { + return Nan::ThrowError("Callback is required and must be a Function."); + } + + FastWalkBaton* baton = new FastWalkBaton(); + + baton->error_code = GIT_OK; + baton->error = NULL; + baton->max_count = Nan::To(info[0]).FromJust(); + baton->out = new std::vector; + baton->out->reserve(baton->max_count); + baton->walk = Nan::ObjectWrap::Unwrap(info.This())->GetValue(); + + Nan::Callback *callback = new Nan::Callback(Local::Cast(info[info.Length() - 1])); + std::map> cleanupHandles; + FastWalkWorker *worker = new FastWalkWorker(baton, callback, cleanupHandles); + worker->Reference("fastWalk", info.This()); + + nodegit::Context *nodegitContext = reinterpret_cast(info.Data().As()->Value()); + nodegitContext->QueueWorker(worker); + return; +} + +nodegit::LockMaster GitRevwalk::FastWalkWorker::AcquireLocks() { + nodegit::LockMaster lockMaster(true); + return lockMaster; +} + +void GitRevwalk::FastWalkWorker::Execute() +{ + for (int i = 0; i < baton->max_count; i++) + { + git_oid *nextCommit = (git_oid *)malloc(sizeof(git_oid)); + git_error_clear(); + baton->error_code = git_revwalk_next(nextCommit, baton->walk); + + if (baton->error_code != GIT_OK) + { + // We couldn't get a commit out of the revwalk. It's either in + // an error state or there aren't anymore commits in the revwalk. + free(nextCommit); + + if (baton->error_code != GIT_ITEROVER) { + baton->error = git_error_dup(git_error_last()); + + while(!baton->out->empty()) + { + // part of me wants to #define shoot free so we can take the + // baton out back and shoot the oids + git_oid *oidToFree = baton->out->back(); + free(oidToFree); + baton->out->pop_back(); + } + + delete baton->out; + + baton->out = NULL; + } + else { + baton->error_code = GIT_OK; + } + + break; + } + + baton->out->push_back(nextCommit); + } +} + +void GitRevwalk::FastWalkWorker::HandleErrorCallback() { + if (baton->error) { + if (baton->error->message) { + free((void *)baton->error->message); + } + + free((void *)baton->error); + } + + while(!baton->out->empty()) { + free(baton->out->back()); + baton->out->pop_back(); + } + + delete baton->out; + + delete baton; +} + +void GitRevwalk::FastWalkWorker::HandleOKCallback() +{ + if (baton->out != NULL) + { + unsigned int size = baton->out->size(); + Local result = Nan::New(size); + for (unsigned int i = 0; i < size; i++) { + Nan::Set(result, Nan::New(i), GitOid::New(baton->out->at(i), true)); + } + + delete baton->out; + + Local argv[2] = { + Nan::Null(), + result + }; + callback->Call(2, argv, async_resource); + } + else + { + if (baton->error) + { + Local err; + if (baton->error->message) { + err = Nan::To(Nan::Error(baton->error->message)).ToLocalChecked(); + } else { + err = Nan::To(Nan::Error("Method fastWalk has thrown an error.")).ToLocalChecked(); + } + Nan::Set(err, Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); + Nan::Set(err, Nan::New("errorFunction").ToLocalChecked(), Nan::New("Revwalk.fastWalk").ToLocalChecked()); + Local argv[1] = { + err + }; + callback->Call(1, argv, async_resource); + if (baton->error->message) + { + free((void *)baton->error->message); + } + + free((void *)baton->error); + } + else if (baton->error_code < 0) + { + bool callbackFired = false; + if (!callbackErrorHandle.IsEmpty()) { + v8::Local maybeError = Nan::New(callbackErrorHandle); + if (!maybeError->IsNull() && !maybeError->IsUndefined()) { + v8::Local argv[1] = { + maybeError + }; + callback->Call(1, argv, async_resource); + callbackFired = true; + } + } + + if (!callbackFired) + { + Local err = Nan::To(Nan::Error("Method next has thrown an error.")).ToLocalChecked(); + Nan::Set(err, Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); + Nan::Set(err, Nan::New("errorFunction").ToLocalChecked(), Nan::New("Revwalk.fastWalk").ToLocalChecked()); + Local argv[1] = { + err + }; + callback->Call(1, argv, async_resource); + } + } + else + { + callback->Call(0, NULL, async_resource); + } + } + + delete baton; +} diff --git a/generate/templates/manual/revwalk/file_history_walk.cc b/generate/templates/manual/revwalk/file_history_walk.cc new file mode 100644 index 0000000000..569bb022dc --- /dev/null +++ b/generate/templates/manual/revwalk/file_history_walk.cc @@ -0,0 +1,520 @@ +// Note: commit is not owned by this class (must be freed elsewhere) +class FileHistoryEvent { +public: + FileHistoryEvent( + git_delta_t inputType, + bool inputExistsInCurrentTree, + bool inputIsMergeCommit, + git_commit *inputCommit, + const char *inputFrom, + const char *inputTo + ): + type(inputType), + existsInCurrentTree(inputExistsInCurrentTree), + isMergeCommit(inputIsMergeCommit), + from(inputFrom == NULL ? NULL : strdup(inputFrom)), + to(inputTo == NULL ? NULL : strdup(inputTo)), + commit(inputCommit) + { + if (inputCommit != NULL) { + const int error = git_commit_dup(&commit, inputCommit); + assert(error == GIT_OK); + } + } + + FileHistoryEvent(const FileHistoryEvent &) = delete; + FileHistoryEvent(FileHistoryEvent &&) = delete; + FileHistoryEvent &operator=(const FileHistoryEvent &) = delete; + FileHistoryEvent &operator=(FileHistoryEvent &&) = delete; + + ~FileHistoryEvent() { + if (commit != NULL) { + git_commit_free(commit); + } + + if(from != NULL) { + free((void *)from); + } + + if(to != NULL) { + free((void *)to); + } + } + + v8::Local toJavascript() { + v8::Local historyEntry = Nan::New(); + v8::Local owners = Nan::New(0); + Nan::Set( + owners, + Nan::New(owners->Length()), + Nan::To(GitRepository::New( + git_commit_owner(commit), + true + )).ToLocalChecked() + ); + Nan::Set(historyEntry, Nan::New("commit").ToLocalChecked(), GitCommit::New(commit, true, owners)); + commit = NULL; + Nan::Set(historyEntry, Nan::New("status").ToLocalChecked(), Nan::New(type)); + Nan::Set(historyEntry, Nan::New("isMergeCommit").ToLocalChecked(), Nan::New(isMergeCommit)); + if (type == GIT_DELTA_RENAMED) { + if (from != NULL) { + Nan::Set(historyEntry, Nan::New("oldName").ToLocalChecked(), Nan::New(from).ToLocalChecked()); + } + if (to != NULL) { + Nan::Set(historyEntry, Nan::New("newName").ToLocalChecked(), Nan::New(to).ToLocalChecked()); + } + } + return historyEntry; + } + + static int buildHistoryEvent( + FileHistoryEvent **fileHistoryEvent, + git_repository *repo, + git_commit *currentCommit, + git_tree *currentTree, + git_tree *parentTree, + const char *filePath + ) { + int errorCode; + git_tree_entry *currentEntry; + if (git_tree_entry_bypath(¤tEntry, currentTree, filePath) != GIT_OK) { + currentEntry = NULL; + } + git_tree_entry *parentEntry; + if (git_tree_entry_bypath(&parentEntry, parentTree, filePath) != GIT_OK) { + parentEntry = NULL; + } + + if (!currentEntry && !parentEntry) { + *fileHistoryEvent = new FileHistoryEvent(GIT_DELTA_UNMODIFIED, false, false, currentCommit, NULL, NULL); + return GIT_OK; + } + + // The filePath was added + if (currentEntry && !parentEntry) { + git_diff *diff; + if ((errorCode = git_diff_tree_to_tree(&diff, repo, parentTree, currentTree, NULL)) != GIT_OK) { + git_tree_entry_free(currentEntry); + return errorCode; + } + if ((errorCode = git_diff_find_similar(diff, NULL)) != GIT_OK) { + git_diff_free(diff); + git_tree_entry_free(currentEntry); + return errorCode; + } + const size_t numDeltas = git_diff_num_deltas(diff); + for (size_t i = 0; i < numDeltas; ++i) { + const git_diff_delta *delta = git_diff_get_delta(diff, i); + if (delta->new_file.path != NULL && std::strcmp(delta->new_file.path, filePath) == 0) { + if (delta->status == GIT_DELTA_RENAMED + || (delta->old_file.path != NULL && std::strcmp(delta->old_file.path, filePath) != 0)) { + *fileHistoryEvent = new FileHistoryEvent( + GIT_DELTA_RENAMED, + true, + false, + currentCommit, + delta->old_file.path, + delta->new_file.path + ); + git_diff_free(diff); + git_tree_entry_free(currentEntry); + return GIT_OK; + } + break; + } + } + git_diff_free(diff); + git_tree_entry_free(currentEntry); + + *fileHistoryEvent = new FileHistoryEvent(GIT_DELTA_ADDED, true, false, currentCommit, NULL, NULL); + return GIT_OK; + } + + // The filePath was deleted + if (!currentEntry && parentEntry) { + git_diff *diff; + if ((errorCode = git_diff_tree_to_tree(&diff, repo, parentTree, currentTree, NULL)) != GIT_OK) { + git_tree_entry_free(parentEntry); + return errorCode; + } + if ((errorCode = git_diff_find_similar(diff, NULL)) != GIT_OK) { + git_diff_free(diff); + git_tree_entry_free(parentEntry); + return errorCode; + } + const size_t numDeltas = git_diff_num_deltas(diff); + for (size_t i = 0; i < numDeltas; ++i) { + const git_diff_delta *delta = git_diff_get_delta(diff, i); + if (delta->old_file.path != NULL && std::strcmp(delta->old_file.path, filePath) == 0) { + if (delta->status == GIT_DELTA_RENAMED + || (delta->new_file.path != NULL && std::strcmp(delta->new_file.path, filePath) != 0)) { + *fileHistoryEvent = new FileHistoryEvent( + GIT_DELTA_RENAMED, + false, + false, + currentCommit, + delta->old_file.path, + delta->new_file.path + ); + git_diff_free(diff); + git_tree_entry_free(parentEntry); + return GIT_OK; + } + break; + } + } + git_diff_free(diff); + git_tree_entry_free(parentEntry); + + *fileHistoryEvent = new FileHistoryEvent(GIT_DELTA_DELETED, false, false, currentCommit, NULL, NULL); + return GIT_OK; + } + + if (git_oid_cmp(git_tree_entry_id(currentEntry), git_tree_entry_id(parentEntry)) != 0 + || git_tree_entry_filemode(currentEntry) != git_tree_entry_filemode(parentEntry) + ) { + git_tree_entry_free(parentEntry); + git_tree_entry_free(currentEntry); + *fileHistoryEvent = new FileHistoryEvent(GIT_DELTA_MODIFIED, true, false, currentCommit, NULL, NULL); + return GIT_OK; + } + + *fileHistoryEvent = new FileHistoryEvent(GIT_DELTA_UNMODIFIED, true, false, currentCommit, NULL, NULL); + git_tree_entry_free(parentEntry); + git_tree_entry_free(currentEntry); + return GIT_OK; + } + + git_delta_t type; + bool existsInCurrentTree, isMergeCommit; + const char *from, *to; + git_commit *commit; +}; + +NAN_METHOD(GitRevwalk::FileHistoryWalk) +{ + if (info.Length() == 0 || !info[0]->IsString()) { + return Nan::ThrowError("File path to get the history is required."); + } + + if (info.Length() == 1 || !info[1]->IsNumber()) { + return Nan::ThrowError("Max count is required and must be a number."); + } + + if (!info[info.Length() - 1]->IsFunction()) { + return Nan::ThrowError("Callback is required and must be a Function."); + } + + FileHistoryWalkBaton* baton = new FileHistoryWalkBaton(); + + baton->error_code = GIT_OK; + baton->error = NULL; + Nan::Utf8String from_js_file_path(Nan::To(info[0]).ToLocalChecked()); + baton->file_path = strdup(*from_js_file_path); + baton->max_count = Nan::To(info[1]).FromJust(); + baton->out = new std::vector; + baton->out->reserve(baton->max_count); + baton->walk = Nan::ObjectWrap::Unwrap(info.This())->GetValue(); + + Nan::Callback *callback = new Nan::Callback(Local::Cast(info[info.Length() - 1])); + std::map> cleanupHandles; + FileHistoryWalkWorker *worker = new FileHistoryWalkWorker(baton, callback, cleanupHandles); + worker->Reference("fileHistoryWalk", info.This()); + + nodegit::Context *nodegitContext = reinterpret_cast(info.Data().As()->Value()); + nodegitContext->QueueWorker(worker); + return; +} + +nodegit::LockMaster GitRevwalk::FileHistoryWalkWorker::AcquireLocks() { + nodegit::LockMaster lockMaster(true); + return lockMaster; +} + +void GitRevwalk::FileHistoryWalkWorker::Execute() +{ + git_repository *repo = git_revwalk_repository(baton->walk); + git_oid currentOid; + git_error_clear(); + for ( + unsigned int revwalkIterations = 0; + revwalkIterations < baton->max_count && (baton->error_code = git_revwalk_next(¤tOid, baton->walk)) == GIT_OK; + ++revwalkIterations + ) { + git_commit *currentCommit; + if ((baton->error_code = git_commit_lookup(¤tCommit, repo, ¤tOid)) != GIT_OK) { + break; + } + + git_tree *currentTree; + if ((baton->error_code = git_commit_tree(¤tTree, currentCommit)) != GIT_OK) { + git_commit_free(currentCommit); + break; + } + + const unsigned int parentCount = git_commit_parentcount(currentCommit); + if (parentCount == 0) { + git_tree_entry* entry; + if (git_tree_entry_bypath(&entry, currentTree, baton->file_path) == GIT_OK) { + baton->out->push_back(new FileHistoryEvent(GIT_DELTA_ADDED, false, false, currentCommit, NULL, NULL)); + git_tree_entry_free(entry); + } + git_commit_free(currentCommit); + git_tree_free(currentTree); + continue; + } + + if (parentCount == 1) { + git_commit *parentCommit; + if ((baton->error_code = git_commit_parent(&parentCommit, currentCommit, 0)) != GIT_OK) { + git_commit_free(currentCommit); + git_tree_free(currentTree); + break; + } + + git_tree *parentTree; + if ((baton->error_code = git_commit_tree(&parentTree, parentCommit)) != GIT_OK) { + git_commit_free(currentCommit); + git_commit_free(parentCommit); + git_tree_free(currentTree); + break; + } + + + FileHistoryEvent *fileHistoryEvent; + if ((baton->error_code = FileHistoryEvent::buildHistoryEvent( + &fileHistoryEvent, + repo, + currentCommit, + currentTree, + parentTree, + baton->file_path + )) != GIT_OK) { + git_commit_free(currentCommit); + git_commit_free(parentCommit); + git_tree_free(currentTree); + git_tree_free(parentTree); + break; + } + + if (fileHistoryEvent->type != GIT_DELTA_UNMODIFIED) { + baton->out->push_back(fileHistoryEvent); + } + + git_commit_free(currentCommit); + git_commit_free(parentCommit); + git_tree_free(currentTree); + git_tree_free(parentTree); + continue; + } + + std::pair firstMatchingParentIndex(false, 0); + bool fileExistsInCurrent = false, fileExistsInSomeParent = false; + for (unsigned int parentIndex = 0; parentIndex < parentCount; ++parentIndex) { + git_commit *parentCommit; + if ((baton->error_code = git_commit_parent(&parentCommit, currentCommit, parentIndex)) != GIT_OK) { + break; + } + + git_tree *parentTree; + if ((baton->error_code = git_commit_tree(&parentTree, parentCommit)) != GIT_OK) { + git_commit_free(parentCommit); + break; + } + + FileHistoryEvent *fileHistoryEvent; + if ((baton->error_code = FileHistoryEvent::buildHistoryEvent( + &fileHistoryEvent, + repo, + currentCommit, + currentTree, + parentTree, + baton->file_path + )) != GIT_OK) { + git_tree_free(parentTree); + git_commit_free(parentCommit); + break; + } + + switch (fileHistoryEvent->type) { + case GIT_DELTA_ADDED: { + fileExistsInCurrent = true; + break; + } + case GIT_DELTA_MODIFIED: { + fileExistsInCurrent = true; + fileExistsInSomeParent = true; + break; + } + case GIT_DELTA_DELETED: { + fileExistsInSomeParent = true; + break; + } + case GIT_DELTA_RENAMED: { + if (fileHistoryEvent->existsInCurrentTree) { + fileExistsInCurrent = true; + } else { + fileExistsInSomeParent = true; + } + break; + } + case GIT_DELTA_UNMODIFIED: { + if (fileHistoryEvent->existsInCurrentTree) { + fileExistsInCurrent = true; + fileExistsInSomeParent = true; + } + firstMatchingParentIndex = std::make_pair(true, parentIndex); + break; + } + default: { + break; + } + } + + delete fileHistoryEvent; + git_commit_free(parentCommit); + git_tree_free(parentTree); + + if (firstMatchingParentIndex.first) { + break; + } + } + + if (baton->error_code != GIT_OK) { + git_tree_free(currentTree); + git_commit_free(currentCommit); + break; + } + + if (!firstMatchingParentIndex.first) { + assert(fileExistsInCurrent || fileExistsInSomeParent); + git_delta_t mergeType = GIT_DELTA_UNREADABLE; // It will never result in this case because of the assertion above. + if (fileExistsInCurrent && fileExistsInSomeParent) { + mergeType = GIT_DELTA_MODIFIED; + } else if (fileExistsInCurrent) { + mergeType = GIT_DELTA_ADDED; + } else if (fileExistsInSomeParent) { + mergeType = GIT_DELTA_DELETED; + } + + FileHistoryEvent *fileHistoryEvent = new FileHistoryEvent( + mergeType, + mergeType != GIT_DELTA_DELETED, + true, + currentCommit, + NULL, + NULL + ); + baton->out->push_back(fileHistoryEvent); + git_tree_free(currentTree); + git_commit_free(currentCommit); + continue; + } + + assert(firstMatchingParentIndex.first); + for (unsigned int parentIndex = 0; parentIndex < parentCount; ++parentIndex) { + if (parentIndex == firstMatchingParentIndex.second) { + continue; + } + + const git_oid *parentOid = git_commit_parent_id(currentCommit, parentIndex); + assert(parentOid != NULL); + git_revwalk_hide(baton->walk, parentOid); + } + git_commit_free(currentCommit); + git_tree_free(currentTree); + } + + if (baton->error_code != GIT_OK && baton->error_code != GIT_ITEROVER) { + // Something went wrong in our loop, discard everything in the async worker + for (unsigned int i = 0; i < baton->out->size(); ++i) { + delete static_cast(baton->out->at(i)); + } + delete baton->out; + baton->out = NULL; + baton->error = git_error_dup(git_error_last()); + } + free((void *)baton->file_path); + baton->file_path = NULL; +} + +void GitRevwalk::FileHistoryWalkWorker::HandleErrorCallback() { + if (baton->error) { + if (baton->error->message) { + free((void *)baton->error->message); + } + + free((void *)baton->error); + } + + for (unsigned int i = 0; i < baton->out->size(); ++i) { + delete static_cast(baton->out->at(i)); + } + + delete baton->out; + + free((void *)baton->file_path); + + delete baton; +} + +void GitRevwalk::FileHistoryWalkWorker::HandleOKCallback() +{ + if (baton->out != NULL) { + const unsigned int size = baton->out->size(); + v8::Local result = Nan::New(size); + for (unsigned int i = 0; i < size; i++) { + FileHistoryEvent *batonResult = static_cast(baton->out->at(i)); + Nan::Set(result, Nan::New(i), batonResult->toJavascript()); + delete batonResult; + } + + Nan::Set(result, Nan::New("reachedEndOfHistory").ToLocalChecked(), Nan::New(baton->error_code == GIT_ITEROVER)); + + v8::Local argv[2] = { + Nan::Null(), + result + }; + callback->Call(2, argv, async_resource); + + delete baton->out; + return; + } + + if (baton->error) { + v8::Local err; + if (baton->error->message) { + err = Nan::To(Nan::Error(baton->error->message)).ToLocalChecked(); + } else { + err = Nan::To(Nan::Error("Method fileHistoryWalk has thrown an error.")).ToLocalChecked(); + } + Nan::Set(err, Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); + Nan::Set(err, Nan::New("errorFunction").ToLocalChecked(), Nan::New("Revwalk.fileHistoryWalk").ToLocalChecked()); + v8::Local argv[1] = { + err + }; + callback->Call(1, argv, async_resource); + if (baton->error->message) + { + free((void *)baton->error->message); + } + + free((void *)baton->error); + return; + } + + if (baton->error_code < 0) { + v8::Local err = Nan::To(Nan::Error("Method next has thrown an error.")).ToLocalChecked(); + Nan::Set(err, Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); + Nan::Set(err, Nan::New("errorFunction").ToLocalChecked(), Nan::New("Revwalk.fileHistoryWalk").ToLocalChecked()); + v8::Local argv[1] = { + err + }; + callback->Call(1, argv, async_resource); + return; + } + + callback->Call(0, NULL, async_resource); + + delete baton; +} diff --git a/generate/templates/manual/src/async_baton.cc b/generate/templates/manual/src/async_baton.cc new file mode 100644 index 0000000000..56694f33f1 --- /dev/null +++ b/generate/templates/manual/src/async_baton.cc @@ -0,0 +1,89 @@ +#include "../include/async_baton.h" + +namespace nodegit { + void deleteBaton(AsyncBaton *baton) { + delete baton; + } + + AsyncBaton::AsyncBaton() + : asyncResource(ThreadPool::GetCurrentAsyncResource()), + callbackErrorHandle(*ThreadPool::GetCurrentCallbackErrorHandle()), + completedMutex(new std::mutex), + hasCompleted(false) + {} + + void AsyncBaton::SignalCompletion() { + std::lock_guard lock(*completedMutex); + hasCompleted = true; + completedCondition.notify_one(); + } + + void AsyncBaton::Done() { + onCompletion(); + } + + Nan::AsyncResource *AsyncBaton::GetAsyncResource() { + return asyncResource; + } + + void AsyncBaton::SetCallbackError(v8::Local error) { + callbackErrorHandle.Reset(error); + } + + void AsyncBaton::ExecuteAsyncPerform(AsyncCallback asyncCallback, AsyncCallback asyncCancelCb, CompletionCallback onCompletion) { + auto jsCallback = [asyncCallback, this]() { + asyncCallback(this); + }; + auto cancelCallback = [asyncCancelCb, this]() { + asyncCancelCb(this); + }; + + if (onCompletion) { + this->onCompletion = [this, onCompletion]() { + onCompletion(this); + }; + + ThreadPool::PostCallbackEvent( + [jsCallback, cancelCallback]( + ThreadPool::QueueCallbackFn queueCallback, + ThreadPool::Callback callbackCompleted, + bool isThreaded // Temporary workaround for LFS checkout. Code added to be reverted. + ) -> ThreadPool::Callback { + queueCallback(jsCallback, cancelCallback); + callbackCompleted(); + + return []() {}; + } + ); + } else { + ThreadPool::PostCallbackEvent( + [this, jsCallback, cancelCallback]( + ThreadPool::QueueCallbackFn queueCallback, + ThreadPool::Callback callbackCompleted, + bool isThreaded // Temporary workaround for LFS checkout. Code added to be reverted. + ) -> ThreadPool::Callback { + // Temporary workaround for LFS checkout. Code modified to be reverted. + if (!isThreaded) { + this->onCompletion = callbackCompleted; + + queueCallback(jsCallback, cancelCallback); + + return std::bind(&AsyncBaton::SignalCompletion, this); + } + else { + this->onCompletion = std::bind(&AsyncBaton::SignalCompletion, this); + queueCallback(jsCallback, cancelCallback); + return []() {}; + } + } + ); + + WaitForCompletion(); + } + } + + void AsyncBaton::WaitForCompletion() { + std::unique_lock lock(*completedMutex); + while (!hasCompleted) completedCondition.wait(lock); + } +} diff --git a/generate/templates/manual/src/async_worker.cc b/generate/templates/manual/src/async_worker.cc new file mode 100644 index 0000000000..709e8a1e83 --- /dev/null +++ b/generate/templates/manual/src/async_worker.cc @@ -0,0 +1,43 @@ +#include "../include/async_worker.h" + +namespace nodegit { + AsyncWorker::AsyncWorker(Nan::Callback *callback, const char *resourceName, std::map> &_cleanupHandles) + : Nan::AsyncWorker(callback, resourceName), cleanupHandles(_cleanupHandles) + {} + + AsyncWorker::AsyncWorker(Nan::Callback *callback, const char *resourceName) + : Nan::AsyncWorker(callback, resourceName) + {} + + void AsyncWorker::Cancel() { + isCancelled = true; + + // We use Nan::AsyncWorker's ErrorMessage flow + // to trigger `HandleErrorCallback` for cancellation + // of AsyncWork + SetErrorMessage("SHUTTING DOWN"); + } + + Nan::AsyncResource *AsyncWorker::GetAsyncResource() { + return async_resource; + } + + Nan::Global *AsyncWorker::GetCallbackErrorHandle() { + return &callbackErrorHandle; + } + + bool AsyncWorker::GetIsCancelled() const { + return isCancelled; + } + + void AsyncWorker::Destroy() { + std::for_each(cleanupCalls.begin(), cleanupCalls.end(), [](std::function cleanupCall) { + cleanupCall(); + }); + Nan::AsyncWorker::Destroy(); + } + + void AsyncWorker::RegisterCleanupCall(std::function cleanupCall) { + cleanupCalls.push_back(cleanupCall); + } +} diff --git a/generate/templates/manual/src/cleanup_handle.cc b/generate/templates/manual/src/cleanup_handle.cc new file mode 100644 index 0000000000..b243d4f0e0 --- /dev/null +++ b/generate/templates/manual/src/cleanup_handle.cc @@ -0,0 +1,6 @@ +#include "../include/cleanup_handle.h" + +namespace nodegit { + CleanupHandle::CleanupHandle() {} + CleanupHandle::~CleanupHandle() {} +} diff --git a/generate/templates/manual/src/context.cc b/generate/templates/manual/src/context.cc new file mode 100644 index 0000000000..a4c9483dc7 --- /dev/null +++ b/generate/templates/manual/src/context.cc @@ -0,0 +1,84 @@ +#include "../include/context.h" + +namespace nodegit { + std::map Context::contexts; + + AsyncContextCleanupHandle::AsyncContextCleanupHandle(v8::Isolate *isolate, Context *context) + : context(context), + handle(node::AddEnvironmentCleanupHook(isolate, AsyncCleanupContext, this)) + {} + + AsyncContextCleanupHandle::~AsyncContextCleanupHandle() { + delete context; + doneCallback(doneData); + } + + void AsyncContextCleanupHandle::AsyncCleanupContext(void *data, void(*uvCallback)(void*), void *uvCallbackData) { + std::unique_ptr cleanupHandle(static_cast(data)); + cleanupHandle->doneCallback = uvCallback; + cleanupHandle->doneData = uvCallbackData; + // the ordering of std::move and the call to Context::ShutdownThreadPool prohibits + // us from referring to context on cleanupHandle if we're also intending to move + // the unique_ptr into the method. + Context *context = cleanupHandle->context; + context->ShutdownThreadPool(std::move(cleanupHandle)); + } + + Context::Context(v8::Isolate *isolate) + : isolate(isolate) + , threadPool(10, node::GetCurrentEventLoop(isolate), this) + { + Nan::HandleScope scopoe; + v8::Local storage = Nan::New(); + persistentStorage.Reset(storage); + contexts[isolate] = this; + new AsyncContextCleanupHandle(isolate, this); + } + + Context::~Context() { + nodegit::TrackerWrap::DeleteFromList(&trackerList); + contexts.erase(isolate); + } + + std::shared_ptr Context::GetCleanupHandle(std::string key) { + return cleanupHandles[key]; + } + + Context *Context::GetCurrentContext() { + Nan::HandleScope scope; + v8::Local context = Nan::GetCurrentContext(); + v8::Isolate *isolate = context->GetIsolate(); + return contexts[isolate]; + } + + v8::Local Context::GetFromPersistent(std::string key) { + Nan::EscapableHandleScope scope; + v8::Local storage = Nan::New(persistentStorage); + Nan::MaybeLocal value = Nan::Get(storage, Nan::New(key).ToLocalChecked()); + return scope.Escape(value.ToLocalChecked()); + } + + void Context::QueueWorker(nodegit::AsyncWorker *worker) { + threadPool.QueueWorker(worker); + } + + std::shared_ptr Context::RemoveCleanupHandle(std::string key) { + std::shared_ptr cleanupItem = cleanupHandles[key]; + cleanupHandles.erase(key); + return cleanupItem; + } + + void Context::SaveToPersistent(std::string key, const v8::Local &value) { + Nan::HandleScope scope; + v8::Local storage = Nan::New(persistentStorage); + Nan::Set(storage, Nan::New(key).ToLocalChecked(), value); + } + + void Context::SaveCleanupHandle(std::string key, std::shared_ptr cleanupItem) { + cleanupHandles[key] = cleanupItem; + } + + void Context::ShutdownThreadPool(std::unique_ptr cleanupHandle) { + threadPool.Shutdown(std::move(cleanupHandle)); + } +} diff --git a/generate/templates/manual/src/convenient_hunk.cc b/generate/templates/manual/src/convenient_hunk.cc new file mode 100644 index 0000000000..2d33e50b66 --- /dev/null +++ b/generate/templates/manual/src/convenient_hunk.cc @@ -0,0 +1,211 @@ +#include +#include + +extern "C" { + #include +} + +#include "../include/context.h" +#include "../include/functions/copy.h" +#include "../include/convenient_hunk.h" +#include "../include/diff_line.h" + +using namespace std; +using namespace v8; +using namespace node; + +void HunkDataFree(HunkData *hunk) { + while (!hunk->lines->empty()) { + git_diff_line *line = hunk->lines->back(); + hunk->lines->pop_back(); + free((void *)line->content); + free((void *)line); + } + delete hunk->lines; + delete hunk; +} + +ConvenientHunk::ConvenientHunk(HunkData *raw) { + this->hunk = raw; +} + +ConvenientHunk::~ConvenientHunk() { + HunkDataFree(this->hunk); +} + +void ConvenientHunk::InitializeComponent(Local target, nodegit::Context *nodegitContext) { + Nan::HandleScope scope; + + Local nodegitExternal = Nan::New(nodegitContext); + Local tpl = Nan::New(JSNewFunction, nodegitExternal); + + tpl->InstanceTemplate()->SetInternalFieldCount(2); + tpl->SetClassName(Nan::New("ConvenientHunk").ToLocalChecked()); + + Nan::SetPrototypeMethod(tpl, "size", Size, nodegitExternal); + Nan::SetPrototypeMethod(tpl, "lines", Lines, nodegitExternal); + + Nan::SetPrototypeMethod(tpl, "oldStart", OldStart, nodegitExternal); + Nan::SetPrototypeMethod(tpl, "oldLines", OldLines, nodegitExternal); + Nan::SetPrototypeMethod(tpl, "newStart", NewStart, nodegitExternal); + Nan::SetPrototypeMethod(tpl, "newLines", NewLines, nodegitExternal); + Nan::SetPrototypeMethod(tpl, "headerLen", HeaderLen, nodegitExternal); + Nan::SetPrototypeMethod(tpl, "header", Header, nodegitExternal); + + Local constructor_template = Nan::GetFunction(tpl).ToLocalChecked(); + nodegitContext->SaveToPersistent("ConvenientHunk::Template", constructor_template); + Nan::Set(target, Nan::New("ConvenientHunk").ToLocalChecked(), constructor_template); +} + +NAN_METHOD(ConvenientHunk::JSNewFunction) { + + if (info.Length() == 0 || !info[0]->IsExternal()) { + return Nan::ThrowError("A new ConvenientHunk cannot be instantiated."); + } + + ConvenientHunk* object = new ConvenientHunk(static_cast(Local::Cast(info[0])->Value())); + object->Wrap(info.This()); + + info.GetReturnValue().Set(info.This()); +} + +Local ConvenientHunk::New(void *raw) { + Nan::EscapableHandleScope scope; + Local argv[1] = { Nan::New((void *)raw) }; + nodegit::Context *nodegitContext = nodegit::Context::GetCurrentContext(); + Local constructor_template = nodegitContext->GetFromPersistent("ConvenientHunk::Template").As(); + return scope.Escape(Nan::NewInstance(constructor_template, 1, argv).ToLocalChecked()); +} + +HunkData *ConvenientHunk::GetValue() { + return this->hunk; +} + +size_t ConvenientHunk::GetSize() { + return this->hunk->numLines; +} + +NAN_METHOD(ConvenientHunk::Size) { + Local to; + to = Nan::New(Nan::ObjectWrap::Unwrap(info.This())->GetSize()); + info.GetReturnValue().Set(to); +} + +NAN_METHOD(ConvenientHunk::Lines) { + if (info.Length() == 0 || !info[0]->IsFunction()) { + return Nan::ThrowError("Callback is required and must be a Function."); + } + + LinesBaton *baton = new LinesBaton(); + + baton->hunk = Nan::ObjectWrap::Unwrap(info.This())->GetValue(); + baton->lines = new std::vector; + baton->lines->reserve(baton->hunk->numLines); + + Nan::Callback *callback = new Nan::Callback(Local::Cast(info[0])); + LinesWorker *worker = new LinesWorker(baton, callback); + + worker->Reference("hunk", info.This()); + + nodegit::Context *nodegitContext = reinterpret_cast(info.Data().As()->Value()); + nodegitContext->QueueWorker(worker); + return; +} + +nodegit::LockMaster ConvenientHunk::LinesWorker::AcquireLocks() { + return nodegit::LockMaster(true); +} + +void ConvenientHunk::LinesWorker::Execute() { + for (unsigned int i = 0; i < baton->hunk->numLines; ++i) { + git_diff_line *storeLine = (git_diff_line *)malloc(sizeof(git_diff_line)); + storeLine->origin = baton->hunk->lines->at(i)->origin; + storeLine->old_lineno = baton->hunk->lines->at(i)->old_lineno; + storeLine->new_lineno = baton->hunk->lines->at(i)->new_lineno; + storeLine->num_lines = baton->hunk->lines->at(i)->num_lines; + storeLine->content_len = baton->hunk->lines->at(i)->content_len; + storeLine->content_offset = baton->hunk->lines->at(i)->content_offset; + storeLine->content = strdup(baton->hunk->lines->at(i)->content); + baton->lines->push_back(storeLine); + } +} + +void ConvenientHunk::LinesWorker::HandleErrorCallback() { + while (!baton->lines->empty()) { + free(baton->lines->back()); + baton->lines->pop_back(); + } + + delete baton->lines; +} + +void ConvenientHunk::LinesWorker::HandleOKCallback() { + unsigned int size = baton->lines->size(); + Local result = Nan::New(size); + + for(unsigned int i = 0; i < size; ++i) { + Nan::Set(result, Nan::New(i), GitDiffLine::New(baton->lines->at(i), true)); + } + + delete baton->lines; + + Local argv[2] = { + Nan::Null(), + result + }; + callback->Call(2, argv, async_resource); + + delete baton; +} + +NAN_METHOD(ConvenientHunk::OldStart) { + Local to; + int old_start = Nan::ObjectWrap::Unwrap(info.This())->GetValue()->hunk.old_start; + info.GetReturnValue().Set(Nan::New(old_start)); +} + + +NAN_METHOD(ConvenientHunk::OldLines) { + Local to; + int old_lines = Nan::ObjectWrap::Unwrap(info.This())->GetValue()->hunk.old_lines; + info.GetReturnValue().Set(Nan::New(old_lines)); +} + +NAN_METHOD(ConvenientHunk::NewStart) { + Local to; + int new_start = Nan::ObjectWrap::Unwrap(info.This())->GetValue()->hunk.new_start; + info.GetReturnValue().Set(Nan::New(new_start)); +} + +NAN_METHOD(ConvenientHunk::NewLines) { + Local to; + int new_lines = Nan::ObjectWrap::Unwrap(info.This())->GetValue()->hunk.new_lines; + info.GetReturnValue().Set(Nan::New(new_lines)); +} + +NAN_METHOD(ConvenientHunk::HeaderLen) { + Local to; + size_t header_len = Nan::ObjectWrap::Unwrap(info.This())->GetValue()->hunk.header_len; + info.GetReturnValue().Set(Nan::New(header_len)); +} + +NAN_METHOD(ConvenientHunk::Header) { + Local to; + + char *header = Nan::ObjectWrap::Unwrap(info.This())->GetValue()->hunk.header; + if (header) { + to = Nan::New(header).ToLocalChecked(); + } else { + to = Nan::Null(); + } + + info.GetReturnValue().Set(to); +} + +void ConvenientHunk::Reference() { + Ref(); +} + +void ConvenientHunk::Unreference() { + Unref(); +} diff --git a/generate/templates/manual/src/convenient_patch.cc b/generate/templates/manual/src/convenient_patch.cc new file mode 100644 index 0000000000..22e6e6b49b --- /dev/null +++ b/generate/templates/manual/src/convenient_patch.cc @@ -0,0 +1,430 @@ +#include +#include + +extern "C" { + #include +} + +#include "../include/context.h" +#include "../include/convenient_hunk.h" +#include "../include/convenient_patch.h" +#include "../include/functions/copy.h" +#include "../include/diff_file.h" + +using namespace std; +using namespace v8; +using namespace node; + +void PatchDataFree(PatchData *patch) { + free((void *)patch->old_file.path); + free((void *)patch->new_file.path); + while(!patch->hunks->empty()) { + HunkData *hunk = patch->hunks->back(); + patch->hunks->pop_back(); + while (!hunk->lines->empty()) { + git_diff_line *line = hunk->lines->back(); + hunk->lines->pop_back(); + free((void *)line->content); + free((void *)line); + } + delete hunk; + } + delete patch; +} + +PatchData *createFromRaw(git_patch *raw) { + PatchData *patch = new PatchData(); + const git_diff_delta *delta = git_patch_get_delta(raw); + + patch->status = delta->status; + + patch->old_file = delta->old_file; + patch->old_file.path = strdup(delta->old_file.path); + + patch->new_file = delta->new_file; + patch->new_file.path = strdup(delta->new_file.path); + + git_patch_line_stats( + &patch->lineStats.context, + &patch->lineStats.additions, + &patch->lineStats.deletions, + raw + ); + + patch->numHunks = git_patch_num_hunks(raw); + patch->hunks = new std::vector; + patch->hunks->reserve(patch->numHunks); + + for (unsigned int i = 0; i < patch->numHunks; ++i) { + HunkData *hunkData = new HunkData(); + const git_diff_hunk *hunk = NULL; + int result = git_patch_get_hunk(&hunk, &hunkData->numLines, raw, i); + if (result != 0) { + continue; + } + + hunkData->hunk.old_start = hunk->old_start; + hunkData->hunk.old_lines = hunk->old_lines; + hunkData->hunk.new_start = hunk->new_start; + hunkData->hunk.new_lines = hunk->new_lines; + hunkData->hunk.header_len = hunk->header_len; + memcpy(&hunkData->hunk.header, &hunk->header, 128); + + hunkData->lines = new std::vector; + hunkData->lines->reserve(hunkData->numLines); + + static const int noNewlineStringLength = 29; + bool EOFFlag = false; + for (unsigned int j = 0; j < hunkData->numLines; ++j) { + git_diff_line *storeLine = (git_diff_line *)malloc(sizeof(git_diff_line)); + const git_diff_line *line = NULL; + int result = git_patch_get_line_in_hunk(&line, raw, i, j); + if (result != 0) { + continue; + } + + if (j == 0) { + int calculatedContentLength = line->content_len; + if ( + calculatedContentLength > noNewlineStringLength && + !strncmp( + &line->content[calculatedContentLength - noNewlineStringLength], + "\n\\ No newline at end of file\n", (std::min)(calculatedContentLength, noNewlineStringLength) + )) { + EOFFlag = true; + } + } + + storeLine->origin = line->origin; + storeLine->old_lineno = line->old_lineno; + storeLine->new_lineno = line->new_lineno; + storeLine->num_lines = line->num_lines; + storeLine->content_len = line->content_len; + storeLine->content_offset = line->content_offset; + char * transferContent; + if (EOFFlag) { + transferContent = (char *)malloc(storeLine->content_len + noNewlineStringLength + 1); + memcpy(transferContent, line->content, storeLine->content_len); + memcpy(transferContent + storeLine->content_len, "\n\\ No newline at end of file\n", noNewlineStringLength); + transferContent[storeLine->content_len + noNewlineStringLength] = '\0'; + } else { + transferContent = (char *)malloc(storeLine->content_len + 1); + memcpy(transferContent, line->content, storeLine->content_len); + transferContent[storeLine->content_len] = '\0'; + } + storeLine->content = strdup(transferContent); + free((void *)transferContent); + hunkData->lines->push_back(storeLine); + } + patch->hunks->push_back(hunkData); + } + + return patch; +} + +ConvenientPatch::ConvenientPatch(PatchData *raw) { + this->patch = raw; +} + +ConvenientPatch::~ConvenientPatch() { + PatchDataFree(this->patch); +} + +void ConvenientPatch::InitializeComponent(Local target, nodegit::Context *nodegitContext) { + Nan::HandleScope scope; + + Local nodegitExternal = Nan::New(nodegitContext); + Local tpl = Nan::New(JSNewFunction, nodegitExternal); + + tpl->InstanceTemplate()->SetInternalFieldCount(2); + tpl->SetClassName(Nan::New("ConvenientPatch").ToLocalChecked()); + + Nan::SetPrototypeMethod(tpl, "hunks", Hunks, nodegitExternal); + Nan::SetPrototypeMethod(tpl, "lineStats", LineStats, nodegitExternal); + Nan::SetPrototypeMethod(tpl, "size", Size, nodegitExternal); + + Nan::SetPrototypeMethod(tpl, "oldFile", OldFile, nodegitExternal); + Nan::SetPrototypeMethod(tpl, "newFile", NewFile, nodegitExternal); + Nan::SetPrototypeMethod(tpl, "status", Status, nodegitExternal); + Nan::SetPrototypeMethod(tpl, "isUnmodified", IsUnmodified, nodegitExternal); + Nan::SetPrototypeMethod(tpl, "isAdded", IsAdded, nodegitExternal); + Nan::SetPrototypeMethod(tpl, "isDeleted", IsDeleted, nodegitExternal); + Nan::SetPrototypeMethod(tpl, "isModified", IsModified, nodegitExternal); + Nan::SetPrototypeMethod(tpl, "isRenamed", IsRenamed, nodegitExternal); + Nan::SetPrototypeMethod(tpl, "isCopied", IsCopied, nodegitExternal); + Nan::SetPrototypeMethod(tpl, "isIgnored", IsIgnored, nodegitExternal); + Nan::SetPrototypeMethod(tpl, "isUntracked", IsUntracked, nodegitExternal); + Nan::SetPrototypeMethod(tpl, "isTypeChange", IsTypeChange, nodegitExternal); + Nan::SetPrototypeMethod(tpl, "isUnreadable", IsUnreadable, nodegitExternal); + Nan::SetPrototypeMethod(tpl, "isConflicted", IsConflicted, nodegitExternal); + + Local constructor_template = Nan::GetFunction(tpl).ToLocalChecked(); + nodegitContext->SaveToPersistent("ConvenientPatch::Template", constructor_template); + Nan::Set(target, Nan::New("ConvenientPatch").ToLocalChecked(), constructor_template); +} + +NAN_METHOD(ConvenientPatch::JSNewFunction) { + + if (info.Length() == 0 || !info[0]->IsExternal()) { + return Nan::ThrowError("A new ConvenientPatch cannot be instantiated."); + } + + ConvenientPatch* object = new ConvenientPatch(static_cast(Local::Cast(info[0])->Value())); + object->Wrap(info.This()); + + info.GetReturnValue().Set(info.This()); +} + +Local ConvenientPatch::New(void *raw) { + Nan::EscapableHandleScope scope; + Local argv[1] = { Nan::New((void *)raw) }; + nodegit::Context *nodegitContext = nodegit::Context::GetCurrentContext(); + Local constructor_template = nodegitContext->GetFromPersistent("ConvenientPatch::Template").As(); + return scope.Escape(Nan::NewInstance(constructor_template, 1, argv).ToLocalChecked()); +} + +ConvenientLineStats ConvenientPatch::GetLineStats() { + return this->patch->lineStats; +} + +git_delta_t ConvenientPatch::GetStatus() { + return this->patch->status; +} + +git_diff_file ConvenientPatch::GetOldFile() { + return this->patch->old_file; +} + +git_diff_file ConvenientPatch::GetNewFile() { + return this->patch->new_file; +} + +size_t ConvenientPatch::GetNumHunks() { + return this->patch->numHunks; +} + +PatchData *ConvenientPatch::GetValue() { + return this->patch; +} + +NAN_METHOD(ConvenientPatch::Hunks) { + if (info.Length() == 0 || !info[0]->IsFunction()) { + return Nan::ThrowError("Callback is required and must be a Function."); + } + + HunksBaton *baton = new HunksBaton(); + + baton->patch = Nan::ObjectWrap::Unwrap(info.This())->GetValue(); + baton->hunks = new std::vector; + baton->hunks->reserve(baton->patch->numHunks); + + Nan::Callback *callback = new Nan::Callback(Local::Cast(info[0])); + HunksWorker *worker = new HunksWorker(baton, callback); + + worker->Reference("patch", info.This()); + + nodegit::Context *nodegitContext = reinterpret_cast(info.Data().As()->Value()); + nodegitContext->QueueWorker(worker); + return; +} + +nodegit::LockMaster ConvenientPatch::HunksWorker::AcquireLocks() { + return nodegit::LockMaster(true); +} + +void ConvenientPatch::HunksWorker::Execute() { + // copy hunks + for (unsigned int i = 0; i < baton->patch->numHunks; ++i) { + HunkData *hunkData = new HunkData(); + hunkData->numLines = baton->patch->hunks->at(i)->numLines; + hunkData->hunk.old_start = baton->patch->hunks->at(i)->hunk.old_start; + hunkData->hunk.old_lines = baton->patch->hunks->at(i)->hunk.old_lines; + hunkData->hunk.new_start = baton->patch->hunks->at(i)->hunk.new_start; + hunkData->hunk.new_lines = baton->patch->hunks->at(i)->hunk.new_lines; + hunkData->hunk.header_len = baton->patch->hunks->at(i)->hunk.header_len; + memcpy(&hunkData->hunk.header, &baton->patch->hunks->at(i)->hunk.header, 128); + + hunkData->lines = new std::vector; + hunkData->lines->reserve(hunkData->numLines); + + for (unsigned int j = 0; j < hunkData->numLines; ++j) { + git_diff_line *storeLine = (git_diff_line *)malloc(sizeof(git_diff_line)); + storeLine->origin = baton->patch->hunks->at(i)->lines->at(j)->origin; + storeLine->old_lineno = baton->patch->hunks->at(i)->lines->at(j)->old_lineno; + storeLine->new_lineno = baton->patch->hunks->at(i)->lines->at(j)->new_lineno; + storeLine->num_lines = baton->patch->hunks->at(i)->lines->at(j)->num_lines; + storeLine->content_len = baton->patch->hunks->at(i)->lines->at(j)->content_len; + storeLine->content_offset = baton->patch->hunks->at(i)->lines->at(j)->content_offset; + storeLine->content = strdup(baton->patch->hunks->at(i)->lines->at(j)->content); + hunkData->lines->push_back(storeLine); + } + baton->hunks->push_back(hunkData); + } +} + +void ConvenientPatch::HunksWorker::HandleErrorCallback() { + while (!baton->hunks->empty()) { + HunkData *hunk = baton->hunks->back(); + baton->hunks->pop_back(); + + while (!hunk->lines->empty()) { + free(hunk->lines->back()); + hunk->lines->pop_back(); + } + } + + delete baton->hunks; +} + +void ConvenientPatch::HunksWorker::HandleOKCallback() { + unsigned int size = baton->hunks->size(); + Local result = Nan::New(size); + + for(unsigned int i = 0; i < size; ++i) { + Nan::Set(result, Nan::New(i), ConvenientHunk::New(baton->hunks->at(i))); + } + + delete baton->hunks; + + Local argv[2] = { + Nan::Null(), + result + }; + callback->Call(2, argv, async_resource); + + delete baton; +} + +NAN_METHOD(ConvenientPatch::LineStats) { + Nan::EscapableHandleScope scope; + + Local to; + Local toReturn = Nan::New(); + ConvenientLineStats stats = Nan::ObjectWrap::Unwrap(info.This())->GetLineStats(); + + to = Nan::New(stats.context); + Nan::Set(toReturn, Nan::New("total_context").ToLocalChecked(), to); + to = Nan::New(stats.additions); + Nan::Set(toReturn, Nan::New("total_additions").ToLocalChecked(), to); + to = Nan::New(stats.deletions); + Nan::Set(toReturn, Nan::New("total_deletions").ToLocalChecked(), to); + + return info.GetReturnValue().Set(scope.Escape(toReturn)); +} + +NAN_METHOD(ConvenientPatch::Size) { + Local to; + + to = Nan::New(Nan::ObjectWrap::Unwrap(info.This())->GetNumHunks()); + + info.GetReturnValue().Set(to); +} + +NAN_METHOD(ConvenientPatch::OldFile) { + Nan::EscapableHandleScope scope; + + Local to; + git_diff_file *old_file = (git_diff_file *)malloc(sizeof(git_diff_file)); + *old_file = Nan::ObjectWrap::Unwrap(info.This())->GetOldFile(); + + to = GitDiffFile::New(old_file, true); + + return info.GetReturnValue().Set(to); +} + +NAN_METHOD(ConvenientPatch::NewFile) { + Nan::EscapableHandleScope scope; + + Local to; + git_diff_file *new_file = (git_diff_file *)malloc(sizeof(git_diff_file)); + *new_file = Nan::ObjectWrap::Unwrap(info.This())->GetNewFile(); + if (new_file != NULL) { + to = GitDiffFile::New(new_file, true); + } else { + to = Nan::Null(); + } + + return info.GetReturnValue().Set(to); +} + +NAN_METHOD(ConvenientPatch::Status) { + Local to; + to = Nan::New(Nan::ObjectWrap::Unwrap(info.This())->GetStatus()); + info.GetReturnValue().Set(to); +} + +NAN_METHOD(ConvenientPatch::IsUnmodified) { + Nan::EscapableHandleScope scope; + + Local to; + to = Nan::New(Nan::ObjectWrap::Unwrap(info.This())->GetStatus() == GIT_DELTA_UNMODIFIED); + info.GetReturnValue().Set(to); +} + +NAN_METHOD(ConvenientPatch::IsAdded) { + Local to; + to = Nan::New(Nan::ObjectWrap::Unwrap(info.This())->GetStatus() == GIT_DELTA_ADDED); + info.GetReturnValue().Set(to); +} + +NAN_METHOD(ConvenientPatch::IsDeleted) { + Local to; + to = Nan::New(Nan::ObjectWrap::Unwrap(info.This())->GetStatus() == GIT_DELTA_DELETED); + info.GetReturnValue().Set(to); +} + +NAN_METHOD(ConvenientPatch::IsModified) { + Local to; + to = Nan::New(Nan::ObjectWrap::Unwrap(info.This())->GetStatus() == GIT_DELTA_MODIFIED); + info.GetReturnValue().Set(to); +} + +NAN_METHOD(ConvenientPatch::IsRenamed) { + Local to; + to = Nan::New(Nan::ObjectWrap::Unwrap(info.This())->GetStatus() == GIT_DELTA_RENAMED); + info.GetReturnValue().Set(to); +} + +NAN_METHOD(ConvenientPatch::IsCopied) { + Local to; + to = Nan::New(Nan::ObjectWrap::Unwrap(info.This())->GetStatus() == GIT_DELTA_COPIED); + info.GetReturnValue().Set(to); +} + +NAN_METHOD(ConvenientPatch::IsIgnored) { + Local to; + to = Nan::New(Nan::ObjectWrap::Unwrap(info.This())->GetStatus() == GIT_DELTA_IGNORED); + info.GetReturnValue().Set(to); +} + +NAN_METHOD(ConvenientPatch::IsUntracked) { + Local to; + to = Nan::New(Nan::ObjectWrap::Unwrap(info.This())->GetStatus() == GIT_DELTA_UNTRACKED); + info.GetReturnValue().Set(to); +} + +NAN_METHOD(ConvenientPatch::IsTypeChange) { + Local to; + to = Nan::New(Nan::ObjectWrap::Unwrap(info.This())->GetStatus() == GIT_DELTA_TYPECHANGE); + info.GetReturnValue().Set(to); +} + +NAN_METHOD(ConvenientPatch::IsUnreadable) { + Local to; + to = Nan::New(Nan::ObjectWrap::Unwrap(info.This())->GetStatus() == GIT_DELTA_UNREADABLE); + info.GetReturnValue().Set(to); +} + +NAN_METHOD(ConvenientPatch::IsConflicted) { + Local to; + to = Nan::New(Nan::ObjectWrap::Unwrap(info.This())->GetStatus() == GIT_DELTA_CONFLICTED); + info.GetReturnValue().Set(to); +} + +void ConvenientPatch::Reference() { + Ref(); +} + +void ConvenientPatch::Unreference() { + Unref(); +} diff --git a/generate/templates/manual/src/filter_registry.cc b/generate/templates/manual/src/filter_registry.cc new file mode 100644 index 0000000000..21a7cfbb86 --- /dev/null +++ b/generate/templates/manual/src/filter_registry.cc @@ -0,0 +1,270 @@ +#include +#include + +extern "C" { + #include +} + +#include "../include/nodegit.h" +#include "../include/cleanup_handle.h" +#include "../include/context.h" +#include "../include/lock_master.h" +#include "../include/functions/copy.h" +#include "../include/filter_registry.h" +#include "nodegit_wrapper.cc" + +#include "../include/filter.h" + +using namespace std; +using namespace v8; +using namespace node; + +void GitFilterRegistry::InitializeComponent(v8::Local target, nodegit::Context *nodegitContext) { + Nan::HandleScope scope; + + v8::Local filterRegistry = Nan::New(); + + Local nodegitExternal = Nan::New(nodegitContext); + Nan::SetMethod(filterRegistry, "register", GitFilterRegister, nodegitExternal); + Nan::SetMethod(filterRegistry, "unregister", GitFilterUnregister, nodegitExternal); + + Nan::Set(target, Nan::New("FilterRegistry").ToLocalChecked(), filterRegistry); + nodegitContext->SaveToPersistent("FilterRegistry", filterRegistry); + std::shared_ptr filterRegistryCleanupHandles(new nodegit::FilterRegistryCleanupHandles); + nodegitContext->SaveCleanupHandle("filterRegistry", filterRegistryCleanupHandles); +} + +NAN_METHOD(GitFilterRegistry::GitFilterRegister) { + Nan::EscapableHandleScope scope; + + if (info.Length() == 0 || !info[0]->IsString()) { + return Nan::ThrowError("String name is required."); + } + + if (info.Length() == 1 || !info[1]->IsObject()) { + return Nan::ThrowError("Filter filter is required."); + } + + if (info.Length() == 2 || !info[2]->IsNumber()) { + return Nan::ThrowError("Number priority is required."); + } + + if (info.Length() == 3 || !info[3]->IsFunction()) { + return Nan::ThrowError("Callback is required and must be a Function."); + } + + FilterRegisterBaton *baton = new FilterRegisterBaton(); + nodegit::Context *nodegitContext = reinterpret_cast(info.Data().As()->Value()); + std::map> cleanupHandles; + + { + auto conversionResult = ConfigurableGitFilter::fromJavascript(nodegitContext, info[1]); + if (!conversionResult.result) { + delete baton; + return Nan::ThrowError(Nan::New(conversionResult.error).ToLocalChecked()); + } + + auto convertedObject = conversionResult.result; + cleanupHandles["filter"] = convertedObject; + baton->filter = convertedObject->GetValue(); + } + + Nan::Utf8String name(Nan::To(info[0]).ToLocalChecked()); + + baton->filter_name = (char *)malloc(name.length() + 1); + memcpy((void *)baton->filter_name, *name, name.length()); + memset((void *)(((char *)baton->filter_name) + name.length()), 0, 1); + + baton->error_code = GIT_OK; + baton->filter_priority = Nan::To(info[2]).FromJust(); + + Nan::Callback *callback = new Nan::Callback(Local::Cast(info[3])); + RegisterWorker *worker = new RegisterWorker(baton, callback, cleanupHandles); + + worker->Reference("filter_name", info[0]); + worker->Reference("filter_priority", info[2]); + + nodegitContext->QueueWorker(worker); + return; +} + +nodegit::LockMaster GitFilterRegistry::RegisterWorker::AcquireLocks() { + return nodegit::LockMaster(true, baton->filter_name, baton->filter); +} + +void GitFilterRegistry::RegisterWorker::Execute() { + git_error_clear(); + + { + int result = git_filter_register(baton->filter_name, baton->filter, baton->filter_priority); + baton->error_code = result; + + if (result != GIT_OK && git_error_last()->klass != GIT_ERROR_NONE) { + baton->error = git_error_dup(git_error_last()); + } + } +} + +void GitFilterRegistry::RegisterWorker::HandleErrorCallback() { + if (baton->error) { + if (baton->error->message) { + free((void *)baton->error->message); + } + + free((void *)baton->error); + } + + free(baton->filter_name); + + delete baton; +} + +void GitFilterRegistry::RegisterWorker::HandleOKCallback() { + if (baton->error_code == GIT_OK) { + static_pointer_cast(nodegit::Context::GetCurrentContext()->GetCleanupHandle("filterRegistry"))->registeredFilters[baton->filter_name] = cleanupHandles["filter"]; + v8::Local result = Nan::New(baton->error_code); + v8::Local argv[2] = { + Nan::Null(), + result + }; + callback->Call(2, argv, async_resource); + } + else if (baton->error) { + v8::Local err; + if (baton->error->message) { + err = Nan::To(Nan::Error(baton->error->message)).ToLocalChecked(); + } else { + err = Nan::To(Nan::Error("Method register has thrown an error.")).ToLocalChecked(); + } + Nan::Set(err, Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); + Nan::Set(err, Nan::New("errorFunction").ToLocalChecked(), Nan::New("FilterRegistry.register").ToLocalChecked()); + v8::Local argv[1] = { + err + }; + callback->Call(1, argv, async_resource); + if (baton->error->message) + free((void *)baton->error->message); + free((void *)baton->error); + } + else if (baton->error_code < 0) { + v8::Local err = Nan::To(Nan::Error("Method register has thrown an error.")).ToLocalChecked(); + Nan::Set(err, Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); + Nan::Set(err, Nan::New("errorFunction").ToLocalChecked(), Nan::New("FilterRegistry.register").ToLocalChecked()); + v8::Local argv[1] = { + err + }; + callback->Call(1, argv, async_resource); + } + else { + callback->Call(0, NULL, async_resource); + } + + free(baton->filter_name); + + delete baton; +} + +NAN_METHOD(GitFilterRegistry::GitFilterUnregister) { + Nan::EscapableHandleScope scope; + + if (info.Length() == 0 || !info[0]->IsString()) { + return Nan::ThrowError("String name is required."); + } + + if (info.Length() == 1 || !info[1]->IsFunction()) { + return Nan::ThrowError("Callback is required and must be a Function."); + } + + FilterUnregisterBaton *baton = new FilterUnregisterBaton(); + Nan::Utf8String name(Nan::To(info[0]).ToLocalChecked()); + + baton->filter_name = (char *)malloc(name.length() + 1); + memcpy((void *)baton->filter_name, *name, name.length()); + memset((void *)(((char *)baton->filter_name) + name.length()), 0, 1); + + baton->error_code = GIT_OK; + + /* Setting up Async Worker */ + Nan::Callback *callback = new Nan::Callback(Local::Cast(info[1])); + UnregisterWorker *worker = new UnregisterWorker(baton, callback); + + nodegit::Context *nodegitContext = reinterpret_cast(info.Data().As()->Value()); + nodegitContext->QueueWorker(worker); + return; +} + +nodegit::LockMaster GitFilterRegistry::UnregisterWorker::AcquireLocks() { + return nodegit::LockMaster(true, baton->filter_name); +} + +void GitFilterRegistry::UnregisterWorker::Execute() { + git_error_clear(); + + { + int result = git_filter_unregister(baton->filter_name); + baton->error_code = result; + + if (result != GIT_OK && git_error_last()->klass != GIT_ERROR_NONE) { + baton->error = git_error_dup(git_error_last()); + } + } +} + +void GitFilterRegistry::UnregisterWorker::HandleErrorCallback() { + if (baton->error) { + if (baton->error->message) { + free((void *)baton->error->message); + } + + free((void *)baton->error); + } + + free(baton->filter_name); + + delete baton; +} + +void GitFilterRegistry::UnregisterWorker::HandleOKCallback() { + if (baton->error_code == GIT_OK) { + static_pointer_cast(nodegit::Context::GetCurrentContext()->GetCleanupHandle("filterRegistry"))->registeredFilters.erase(baton->filter_name); + v8::Local result = Nan::New(baton->error_code); + v8::Local argv[2] = { + Nan::Null(), + result + }; + callback->Call(2, argv, async_resource); + } + else if (baton->error) { + v8::Local err; + if (baton->error->message) { + err = Nan::To(Nan::Error(baton->error->message)).ToLocalChecked(); + } else { + err = Nan::To(Nan::Error("Method register has thrown an error.")).ToLocalChecked(); + } + Nan::Set(err, Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); + Nan::Set(err, Nan::New("errorFunction").ToLocalChecked(), Nan::New("FilterRegistry.unregister").ToLocalChecked()); + v8::Local argv[1] = { + err + }; + callback->Call(1, argv, async_resource); + if (baton->error->message) + free((void *)baton->error->message); + free((void *)baton->error); + } + else if (baton->error_code < 0) { + v8::Local err = Nan::To(Nan::Error("Method unregister has thrown an error.")).ToLocalChecked(); + Nan::Set(err, Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); + Nan::Set(err, Nan::New("errorFunction").ToLocalChecked(), Nan::New("FilterRegistry.unregister").ToLocalChecked()); + v8::Local argv[1] = { + err + }; + callback->Call(1, argv, async_resource); + } + else { + callback->Call(0, NULL, async_resource); + } + + free(baton->filter_name); + + delete baton; +} diff --git a/generate/templates/manual/src/functions/copy.cc b/generate/templates/manual/src/functions/copy.cc index a7b59c1990..90327650b0 100644 --- a/generate/templates/manual/src/functions/copy.cc +++ b/generate/templates/manual/src/functions/copy.cc @@ -2,6 +2,7 @@ #include #include "git2.h" +#include "git2/diff.h" const git_error *git_error_dup(const git_error *arg) { git_error *result = (git_error *)malloc(sizeof(git_error)); @@ -9,3 +10,28 @@ const git_error *git_error_dup(const git_error *arg) { result->message = strdup(arg->message); return result; } + +void git_time_dup(git_time **out, const git_time *arg) { + *out = (git_time *)malloc(sizeof(git_time)); + memcpy(*out, arg, sizeof(git_time)); +} + +void git_transfer_progress_dup(git_transfer_progress **out, const git_transfer_progress *arg) { + *out = (git_transfer_progress *)malloc(sizeof(git_transfer_progress)); + memcpy(*out, arg, sizeof(git_transfer_progress)); +} + +git_remote_head *git_remote_head_dup(const git_remote_head *src) { + git_remote_head *dest = (git_remote_head *)malloc(sizeof(git_remote_head)); + dest->local = src->local; + git_oid_cpy(&dest->oid, &src->oid); + git_oid_cpy(&dest->loid, &src->loid); + + dest->name = src->name + ? strdup(src->name) + : NULL; + dest->symref_target = src->symref_target + ? strdup(src->symref_target) + : NULL; + return dest; +} diff --git a/generate/templates/manual/src/functions/free.cc b/generate/templates/manual/src/functions/free.cc new file mode 100644 index 0000000000..a52a7016f7 --- /dev/null +++ b/generate/templates/manual/src/functions/free.cc @@ -0,0 +1,9 @@ +#include + +#include "git2.h" + +void git_remote_head_free(git_remote_head *remote_head) { + free(remote_head->name); + free(remote_head->symref_target); + free(remote_head); +} diff --git a/generate/templates/manual/src/git_buf_converter.cc b/generate/templates/manual/src/git_buf_converter.cc index 7ab25a6b52..da6f425f89 100644 --- a/generate/templates/manual/src/git_buf_converter.cc +++ b/generate/templates/manual/src/git_buf_converter.cc @@ -1,7 +1,6 @@ #include #include #include -#include #include "../include/git_buf_converter.h" #include "git2/buffer.h" @@ -9,18 +8,21 @@ using namespace v8; using namespace node; -git_buf *StrArrayConverter::Convert(Handle val) { +git_buf *GitBufConverter::Convert(Local val) { if (val->IsString() || val->IsStringObject()) { - string v8String = ConvertString(val->ToString()); + Nan::Utf8String param1(Nan::To(val).ToLocalChecked()); + std::string v8String = std::string(*param1); + const size_t size = sizeof(git_buf); uint8_t* memory = reinterpret_cast(malloc(size)); git_buf *result = reinterpret_cast(memory); - size_t stringLength = v8String.length() - 1; + size_t stringLength = v8String.length(); memory = reinterpret_cast(malloc(stringLength)); memcpy(memory, v8String.c_str(), stringLength); + result->reserved = stringLength; result->size = stringLength; result->ptr = reinterpret_cast(memory); return result; diff --git a/generate/templates/manual/src/init_ssh2.cc b/generate/templates/manual/src/init_ssh2.cc new file mode 100644 index 0000000000..a8e2543c27 --- /dev/null +++ b/generate/templates/manual/src/init_ssh2.cc @@ -0,0 +1,12 @@ +// We are initializing libssh2 from a separate .cc file to avoid ssize_t +// redefinition conflicts caused by incliding both node.h and libssh2.h from +// the same file (e.g. nodegit.cc) +// +// The redefinition can also be avoided by #defines but that is risky in case +// the libraries depend on the different definitions. + +#include + +void init_ssh2() { + libssh2_init(0); +} diff --git a/generate/templates/manual/src/lock_master.cc b/generate/templates/manual/src/lock_master.cc new file mode 100644 index 0000000000..8ad33378f9 --- /dev/null +++ b/generate/templates/manual/src/lock_master.cc @@ -0,0 +1,239 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "../include/lock_master.h" +namespace nodegit { + // information about a lockable object + // - the mutex used to lock it and the number of outstanding locks + struct ObjectInfo { + std::shared_ptr mutex; + unsigned useCount; + + ObjectInfo(unsigned useCount) + : mutex(new std::mutex), useCount(useCount) + {} + }; + + // LockMaster implementation details + // implemented in a separate class to keep LockMaster opaque + class LockMasterImpl { + // STATIC variables / methods + + // A map from objects that are locked (or were locked), to information on their mutex + static std::map mutexes; + // A mutex used for the mutexes map + static std::mutex mapMutex; + + // A thread local storage slot for the current thread-specific LockMasterImpl instance + thread_local static LockMasterImpl* currentLockMaster; + + // Cleans up any mutexes that are not currently used + static NAN_GC_CALLBACK(CleanupMutexes); + + public: + static void InitializeContext(); + + // INSTANCE variables / methods + + private: + // The set of objects this LockMaster is responsible for locking + std::set objectsToLock; + + // Mutexes locked by this LockMaster on construction and unlocked on destruction + std::vector> GetMutexes(int useCountDelta); + void Register(); + void Unregister(); + + public: + static LockMasterImpl *CurrentLockMasterImpl() { + return (LockMasterImpl *)currentLockMaster; + } + + LockMasterImpl() { + Register(); + } + + ~LockMasterImpl() { + Unregister(); + Unlock(true); + } + + void ObjectToLock(const void *objectToLock) { + objectsToLock.insert(objectToLock); + } + + void Lock(bool acquireMutexes); + void Unlock(bool releaseMutexes); + }; + + std::map LockMasterImpl::mutexes; + std::mutex LockMasterImpl::mapMutex; + thread_local LockMasterImpl* LockMasterImpl::currentLockMaster = nullptr; + + LockMaster::LockMaster(LockMaster &&other) { + impl = other.impl; + other.impl = nullptr; + } + + LockMaster &LockMaster::operator=(LockMaster &&other) { + if (&other == this) { + return *this; + } + + impl = other.impl; + other.impl = nullptr; + + return *this; + } + + void LockMasterImpl::InitializeContext() { + Nan::AddGCEpilogueCallback(CleanupMutexes); + } + + NAN_GC_CALLBACK(LockMasterImpl::CleanupMutexes) { + std::lock_guard lock(mapMutex); + + for (auto it = mutexes.begin(); it != mutexes.end(); ) + { + // if the mutex is not used by any LockMasters, + // we can destroy it + unsigned useCount = it->second.useCount; + if (!useCount) { + auto to_erase = it; + it++; + mutexes.erase(to_erase); + } else { + it++; + } + } + } + + void LockMaster::InitializeContext() { + LockMasterImpl::InitializeContext(); + } + + std::vector> LockMasterImpl::GetMutexes(int useCountDelta) { + std::vector> objectMutexes; + std::lock_guard lock(mapMutex); + + for (auto object : objectsToLock) { + if (object) { + // ensure we have an initialized mutex for each object + auto mutexIt = mutexes.find(object); + if (mutexIt == mutexes.end()) { + mutexIt = mutexes.insert( + std::make_pair( + object, + ObjectInfo(0U) + ) + ).first; + } + + objectMutexes.push_back(mutexIt->second.mutex); + mutexIt->second.useCount += useCountDelta; + } + } + + return objectMutexes; + } + + void LockMasterImpl::Register() { + currentLockMaster = this; + } + + void LockMasterImpl::Unregister() { + currentLockMaster = nullptr; + } + + void LockMasterImpl::Lock(bool acquireMutexes) { + std::vector> objectMutexes = GetMutexes(acquireMutexes * 1); + + auto alreadyLocked = objectMutexes.end(); + std::vector>::iterator it; + + // we will attempt to lock all the mutexes at the same time to avoid deadlocks + // note in most cases we are locking 0 or 1 mutexes. more than 1 implies + // passing objects with different repos/owners in the same call. + do { + // go through all the mutexes and try to lock them + for (it = objectMutexes.begin(); it != objectMutexes.end(); it++) { + // if we already locked this mutex in a previous pass via std::mutex::lock, + // we don't need to lock it again + if (it == alreadyLocked) { + continue; + } + + // first, try to lock (non-blocking) + bool success = (*it)->try_lock(); + if (!success) { + // we have failed to lock a mutex... unlock everything we have locked + std::for_each(objectMutexes.begin(), it, [](std::shared_ptr mutex) { + mutex->unlock(); + }); + + if (alreadyLocked > it && alreadyLocked != objectMutexes.end()) { + (*alreadyLocked)->unlock(); + } + + // now do a blocking lock on what we couldn't lock + (*it)->lock(); + // mark that we have already locked this one + // if there are more mutexes than this one, we will go back to locking everything + alreadyLocked = it; + break; + } + } + } while (it != objectMutexes.end()); + } + + void LockMasterImpl::Unlock(bool releaseMutexes) { + // Get the mutexes but don't decrement their use count until after we've + // unlocked them all. + std::vector> objectMutexes = GetMutexes(0); + + std::for_each(objectMutexes.begin(), objectMutexes.end(), [](std::shared_ptr mutex) { + mutex->unlock(); + }); + + GetMutexes(releaseMutexes * -1); + } + + // LockMaster + + void LockMaster::ConstructorImpl() { + impl = new LockMasterImpl(); + } + + void LockMaster::DestructorImpl() { + delete impl; + } + + void LockMaster::ObjectToLock(const void *objectToLock) { + impl->ObjectToLock(objectToLock); + } + + void LockMaster::ObjectsToLockAdded() { + impl->Lock(true); + } + + // LockMaster::TemporaryUnlock + + void LockMaster::TemporaryUnlock::ConstructorImpl() { + impl = LockMasterImpl::CurrentLockMasterImpl(); + if (impl) { + impl->Unlock(false); + } + } + + void LockMaster::TemporaryUnlock::DestructorImpl() { + impl->Lock(false); + } + +} diff --git a/generate/templates/manual/src/nodegit_wrapper.cc b/generate/templates/manual/src/nodegit_wrapper.cc new file mode 100644 index 0000000000..a790d7bc3c --- /dev/null +++ b/generate/templates/manual/src/nodegit_wrapper.cc @@ -0,0 +1,186 @@ +template +NodeGitWrapper::NodeGitWrapper(typename Traits::cType *raw, bool selfFreeing, v8::Local owner) + : nodegitContext(nodegit::Context::GetCurrentContext()) { + nodegitContext->LinkTrackerList(this); + if (Traits::isSingleton) { + ReferenceCounter::incrementCountForPointer((void *)raw); + this->raw = raw; + } else if (!owner.IsEmpty()) { + // if we have an owner, it could mean 2 things: + // 1. We are borrowed memory from another struct and should not be freed. We will keep a handle to the owner + // so that the owner isn't gc'd while we are using its memory. + // 2. We are borrowed memory from another struct and can be duplicated, so we should duplicate + // and become selfFreeing. + // 3. We are cached memory, potentially on the repo or config. + // Even though we have a handle in another objects cache, we are expected to call free, + // otherwise we are leaking memory. Cached objects are reference counted in libgit2, but will be leaked + // even if the cache is cleared if we haven't freed them. We will keep a handle on the owner, even though it + // is probably safe as we're reference counted. This should at worst just ensure that the cache owner is the + // last thing to be freed, and that is more safety than anything else. + if (Traits::isDuplicable) { + Traits::duplicate(&this->raw, raw); + selfFreeing = true; + } else { + SetNativeOwners(owner); + this->owner.Reset(owner); + this->raw = raw; + } + } else { + this->raw = raw; + } + this->selfFreeing = selfFreeing; + + if (selfFreeing) { + SelfFreeingInstanceCount++; + } else { + NonSelfFreeingConstructedCount++; + } +} + +template +NodeGitWrapper::NodeGitWrapper(const char *error) + : nodegitContext(nodegit::Context::GetCurrentContext()) { + selfFreeing = false; + raw = NULL; + Nan::ThrowError(error); +} + +template +NodeGitWrapper::~NodeGitWrapper() { + Unlink(); + if (Traits::isFreeable && selfFreeing) { + Traits::free(raw); + SelfFreeingInstanceCount--; + raw = NULL; + } + else if (!selfFreeing) { + --NonSelfFreeingConstructedCount; + } +} + +template +NAN_METHOD(NodeGitWrapper::JSNewFunction) { + cppClass * instance; + + if (info.Length() == 0 || !info[0]->IsExternal()) { + Nan::TryCatch tryCatch; + instance = new cppClass(); + // handle the case where the default constructor is not supported + if(tryCatch.HasCaught()) { + delete instance; + tryCatch.ReThrow(); + return; + } + } else { + instance = new cppClass(static_cast( + Local::Cast(info[0])->Value()), + Nan::To(info[1]).FromJust(), + info.Length() >= 3 && !info[2].IsEmpty() && info[2]->IsObject() ? Nan::To(info[2]).ToLocalChecked() : Local() + ); + } + + instance->Wrap(info.This()); + info.GetReturnValue().Set(info.This()); +} + +template +void NodeGitWrapper::SetNativeOwners(v8::Local owners) { + assert(owners->IsArray() || owners->IsObject()); + Nan::HandleScope scope; + std::unique_ptr< std::vector > trackerOwners = + std::make_unique< std::vector >(); + + if (owners->IsArray()) { + v8::Local context = Nan::GetCurrentContext(); + const v8::Local ownersArray = owners.As(); + const uint32_t numOwners = ownersArray->Length(); + + for (uint32_t i = 0; i < numOwners; ++i) { + v8::Local value = ownersArray->Get(context, i).ToLocalChecked(); + const v8::Local object = value.As(); + Nan::ObjectWrap *objectWrap = Nan::ObjectWrap::Unwrap(object); + trackerOwners->push_back(static_cast(objectWrap)); + } + } + else if (owners->IsObject()) { + Nan::ObjectWrap *objectWrap = Nan::ObjectWrap::Unwrap(owners); + trackerOwners->push_back(static_cast(objectWrap)); + } + + SetTrackerWrapOwners(std::move(trackerOwners)); +} + +template +v8::Local NodeGitWrapper::New(const typename Traits::cType *raw, bool selfFreeing, v8::Local owner) { + Nan::EscapableHandleScope scope; + Local argv[3] = { Nan::New((void *)raw), Nan::New(selfFreeing), owner }; + nodegit::Context *nodegitContext = nodegit::Context::GetCurrentContext(); + Local constructor_template = nodegitContext->GetFromPersistent( + std::string(Traits::className()) + "::Template" + ).As(); + return scope.Escape( + Nan::NewInstance( + constructor_template, + owner.IsEmpty() ? 2 : 3, // passing an empty handle as part of the arguments causes a crash + argv + ).ToLocalChecked()); +} + +template +typename Traits::cType *NodeGitWrapper::GetValue() { + return raw; +} + +template +void NodeGitWrapper::ClearValue() { + raw = NULL; +} + +template +thread_local int NodeGitWrapper::SelfFreeingInstanceCount; + +template +thread_local int NodeGitWrapper::NonSelfFreeingConstructedCount; + +template +NAN_METHOD(NodeGitWrapper::GetSelfFreeingInstanceCount) { + info.GetReturnValue().Set(SelfFreeingInstanceCount); +} + +template +NAN_METHOD(NodeGitWrapper::GetNonSelfFreeingConstructedCount) { + info.GetReturnValue().Set(NonSelfFreeingConstructedCount); +} + +template +void NodeGitWrapper::InitializeTemplate(v8::Local &tpl) { + Nan::SetMethod(tpl, "getSelfFreeingInstanceCount", GetSelfFreeingInstanceCount); + Nan::SetMethod(tpl, "getNonSelfFreeingConstructedCount", GetNonSelfFreeingConstructedCount); +} + +template +void NodeGitWrapper::Reference() { + Ref(); + for (auto &i : referenceCallbacks) { + i.second(); + } +} + +template +void NodeGitWrapper::Unreference() { + Unref(); + for (auto &i : unreferenceCallbacks) { + i.second(); + } +} + +template +void NodeGitWrapper::AddReferenceCallbacks(size_t fieldIndex, std::function refCb, std::function unrefCb) { + referenceCallbacks[fieldIndex] = refCb; + unreferenceCallbacks[fieldIndex] = unrefCb; +} + +template +void NodeGitWrapper::SaveCleanupHandle(std::shared_ptr cleanupHandle) { + childCleanupVector.push_back(cleanupHandle); +} diff --git a/generate/templates/manual/src/promise_completion.cc b/generate/templates/manual/src/promise_completion.cc new file mode 100644 index 0000000000..d3e4f4426e --- /dev/null +++ b/generate/templates/manual/src/promise_completion.cc @@ -0,0 +1,121 @@ +#include +#include "../include/promise_completion.h" + +// initializes the persistent handles for NAN_METHODs +void PromiseCompletion::InitializeComponent(nodegit::Context *nodegitContext) { + Nan::HandleScope scope; + v8::Local nodegitExternal = Nan::New(nodegitContext); + v8::Local newTemplate = Nan::New(New, nodegitExternal); + newTemplate->InstanceTemplate()->SetInternalFieldCount(2); + + nodegitContext->SaveToPersistent( + "PromiseCompletion::Template", + Nan::GetFunction(newTemplate).ToLocalChecked() + ); + + v8::Local promiseFulfilled = Nan::GetFunction( + Nan::New(PromiseFulfilled, nodegitExternal) + ).ToLocalChecked(); + nodegitContext->SaveToPersistent("PromiseCompletion::PromiseFulfilled", promiseFulfilled); + + v8::Local promiseRejected = Nan::GetFunction( + Nan::New(PromiseRejected, nodegitExternal) + ).ToLocalChecked(); + nodegitContext->SaveToPersistent("PromiseCompletion::PromiseRejected", promiseRejected); +} + +bool PromiseCompletion::ForwardIfPromise(v8::Local result, nodegit::AsyncBaton *baton, Callback callback) +{ + Nan::HandleScope scope; + + // check if the result is a promise + if (!result.IsEmpty() && result->IsObject()) { + Nan::MaybeLocal maybeThenProp = Nan::Get(Nan::To(result).ToLocalChecked(), Nan::New("then").ToLocalChecked()); + if (!maybeThenProp.IsEmpty()) { + v8::Local thenProp = maybeThenProp.ToLocalChecked(); + if(thenProp->IsFunction()) { + // we can be reasonably certain that the result is a promise + + // create a new v8 instance of PromiseCompletion + nodegit::Context *nodegitContext = nodegit::Context::GetCurrentContext(); + v8::Local constructor_template = nodegitContext->GetFromPersistent("PromiseCompletion::Template") + .As(); + v8::Local object = Nan::NewInstance(constructor_template).ToLocalChecked(); + + // set up the native PromiseCompletion object + PromiseCompletion *promiseCompletion = ObjectWrap::Unwrap(object); + promiseCompletion->Setup(thenProp.As(), result, baton, callback); + + return true; + } + } + } + + return false; +} + +// creates a new instance of PromiseCompletion, wrapped in a v8 object +NAN_METHOD(PromiseCompletion::New) { + PromiseCompletion *promiseCompletion = new PromiseCompletion(); + promiseCompletion->Wrap(info.This()); + info.GetReturnValue().Set(info.This()); +} + +// sets up a Promise to forward the promise result via the baton and callback +void PromiseCompletion::Setup(v8::Local thenFn, v8::Local result, nodegit::AsyncBaton *baton, Callback callback) { + this->callback = callback; + this->baton = baton; + + v8::Local promise = Nan::To(result).ToLocalChecked(); + + nodegit::Context *nodegitContext = nodegit::Context::GetCurrentContext(); + v8::Local thisHandle = handle(); + v8::Local promiseFulfilled = nodegitContext->GetFromPersistent("PromiseCompletion::PromiseFulfilled") + .As(); + v8::Local promiseRejected = nodegitContext->GetFromPersistent("PromiseCompletion::PromiseRejected") + .As(); + + v8::Local argv[2] = { + Bind(promiseFulfilled, thisHandle), + Bind(promiseRejected, thisHandle) + }; + + // call the promise's .then method with resolve and reject callbacks + Nan::Call(Nan::Callback(thenFn), promise, 2, argv); +} + +// binds an object to be the context of the function. +// there might be a better way to do this than calling Function.bind... +v8::Local PromiseCompletion::Bind(v8::Local function, v8::Local object) { + Nan::EscapableHandleScope scope; + + v8::Local bind = + Nan::Get(function, Nan::New("bind").ToLocalChecked()) + .ToLocalChecked().As(); + + v8::Local argv[1] = { object }; + + return scope.Escape(Nan::Call(bind, Nan::To(function).ToLocalChecked(), 1, argv).ToLocalChecked()); +} + +// calls the callback stored in the PromiseCompletion, passing the baton that +// was provided in construction +void PromiseCompletion::CallCallback(bool isFulfilled, const Nan::FunctionCallbackInfo &info) { + v8::Local resultOfPromise; + + if (info.Length() > 0) { + resultOfPromise = info[0]; + } + + PromiseCompletion *promiseCompletion = ObjectWrap::Unwrap(Nan::To(info.This()).ToLocalChecked()); + + (*promiseCompletion->callback)(isFulfilled, promiseCompletion->baton, resultOfPromise); +} + +NAN_METHOD(PromiseCompletion::PromiseFulfilled) { + CallCallback(true, info); +} + +NAN_METHOD(PromiseCompletion::PromiseRejected) { + CallCallback(false, info); +} diff --git a/generate/templates/manual/src/reference_counter.cc b/generate/templates/manual/src/reference_counter.cc new file mode 100644 index 0000000000..e3bc483a7a --- /dev/null +++ b/generate/templates/manual/src/reference_counter.cc @@ -0,0 +1,24 @@ +#include "../include/reference_counter.h" + +void ReferenceCounter::incrementCountForPointer(void *ptr) { + nodegit::LockMaster lm(true, &referenceCountByPointer); + if (referenceCountByPointer.find(ptr) == referenceCountByPointer.end()) { + referenceCountByPointer[ptr] = 1; + } else { + referenceCountByPointer[ptr] = referenceCountByPointer[ptr] + 1; + } +} + +unsigned long ReferenceCounter::decrementCountForPointer(void *ptr) { + nodegit::LockMaster lm(true, &referenceCountByPointer); + unsigned long referenceCount = referenceCountByPointer[ptr]; + if (referenceCount == 1) { + referenceCountByPointer.erase(ptr); + return 0; + } else { + referenceCountByPointer[ptr] = referenceCount - 1; + return referenceCountByPointer[ptr]; + } +} + +std::unordered_map ReferenceCounter::referenceCountByPointer; diff --git a/generate/templates/manual/src/str_array_converter.cc b/generate/templates/manual/src/str_array_converter.cc index bea3a2e31b..5d04c65622 100644 --- a/generate/templates/manual/src/str_array_converter.cc +++ b/generate/templates/manual/src/str_array_converter.cc @@ -9,15 +9,15 @@ using namespace v8; using namespace node; -git_strarray *StrArrayConverter::Convert(Handle val) { - if (!val->BooleanValue()) { +git_strarray *StrArrayConverter::Convert(v8::Local val) { + if (!Nan::To(val).FromJust()) { return NULL; } else if (val->IsArray()) { - return ConvertArray(Array::Cast(*val)); + return ConvertArray(v8::Local::Cast(val)); } else if (val->IsString() || val->IsStringObject()) { - return ConvertString(val->ToString()); + return ConvertString(Nan::To(val).ToLocalChecked()); } else { return NULL; @@ -33,20 +33,20 @@ git_strarray * StrArrayConverter::AllocStrArray(const size_t count) { return result; } -git_strarray *StrArrayConverter::ConvertArray(Array *val) { +git_strarray *StrArrayConverter::ConvertArray(v8::Local val) { git_strarray *result = AllocStrArray(val->Length()); for(size_t i = 0; i < result->count; i++) { - NanUtf8String entry(val->Get(i)); + Nan::Utf8String entry(Nan::Get(val, i).ToLocalChecked()); result->strings[i] = strdup(*entry); } return result; } -git_strarray* StrArrayConverter::ConvertString(Handle val) { +git_strarray* StrArrayConverter::ConvertString(v8::Local val) { char *strings[1]; - NanUtf8String utf8String(val); + Nan::Utf8String utf8String(val); strings[0] = *utf8String; @@ -62,3 +62,19 @@ git_strarray *StrArrayConverter::ConstructStrArray(int argc, char** argv) { return result; } + +void StrArrayConverter::ConvertInto(git_strarray *out, v8::Local val) { + out->count = val->Length(); + out->strings = (char**) malloc(out->count * sizeof(char*)); + for (uint32_t i = 0; i < out->count; ++i) { + Nan::Utf8String utf8String(Nan::Get(val, i).ToLocalChecked().As()); + out->strings[i] = strdup(*utf8String); + } +} + +void StrArrayConverter::ConvertInto(git_strarray *out, v8::Local val) { + Nan::Utf8String utf8String(val); + out->count = 1; + out->strings = (char**) malloc(out->count * sizeof(char*)); + out->strings[0] = strdup(*utf8String); +} diff --git a/generate/templates/manual/src/thread_pool.cc b/generate/templates/manual/src/thread_pool.cc new file mode 100644 index 0000000000..4cd5c095a3 --- /dev/null +++ b/generate/templates/manual/src/thread_pool.cc @@ -0,0 +1,808 @@ +#include +#include "../include/context.h" +#include "../include/thread_pool.h" + +#include +#include +#include +#include +#include +#include // Temporary workaround for LFS checkout. Code added to be reverted. + +extern "C" { + #include +} + +using namespace std::placeholders; + +namespace nodegit { + class Executor { + public: + struct Task { + enum Type { SHUTDOWN, WORK }; + + Task(Type initType) + : type(initType) + {} + Task(const Task &) = delete; + Task(Task &&) = delete; + Task &operator=(const Task &) = delete; + Task &operator=(Task &&) = delete; + + // We must define a virtual destructor so that derived classes are castable + virtual ~Task() {} + + Type type; + }; + + struct ShutdownTask : Task { + ShutdownTask() + : Task(SHUTDOWN) + {} + }; + + struct WorkTask : Task { + WorkTask(ThreadPool::Callback initCallback, Nan::AsyncResource *asyncResource, Nan::Global *callbackErrorHandle) + : Task(WORK), asyncResource(asyncResource), callbackErrorHandle(callbackErrorHandle), callback(initCallback) + {} + + Nan::AsyncResource *asyncResource; + Nan::Global *callbackErrorHandle; + ThreadPool::Callback callback; + }; + + typedef std::function PostCallbackEventToOrchestratorFn; + typedef std::function PostCompletedEventToOrchestratorFn; + typedef std::function()> TakeNextTaskFn; + + struct Event { + enum Type { COMPLETED, CALLBACK_TYPE }; + Event(Type initType) + : type(initType) + {} + Event(const Event &) = delete; + Event(Event &&) = delete; + Event &operator=(const Event &) = delete; + Event &operator=(Event &&) = delete; + + Type type; + + // We must define a virtual destructor so that derived classes are castable + virtual ~Event() {} + }; + + struct CompletedEvent : Event { + CompletedEvent() + : Event(COMPLETED) + {} + }; + + struct CallbackEvent : Event { + CallbackEvent(ThreadPool::OnPostCallbackFn initCallback) + : Event(CALLBACK_TYPE), callback(initCallback) + {} + + // Temporary workaround for LFS checkout. Code modified to be reverted. + // ThreadPool::Callback operator()(ThreadPool::QueueCallbackFn queueCb, ThreadPool::Callback completedCb) { + // return callback(queueCb, completedCb); + ThreadPool::Callback operator()(ThreadPool::QueueCallbackFn queueCb, ThreadPool::Callback completedCb, bool isThreaded) { + return callback(queueCb, completedCb, isThreaded); + } + + private: + ThreadPool::OnPostCallbackFn callback; + }; + + Executor( + PostCallbackEventToOrchestratorFn postCallbackEventToOrchestrator, + PostCompletedEventToOrchestratorFn postCompletedEventToOrchestrator, + TakeNextTaskFn takeNextTask, + nodegit::Context *context + ); + + void RunTaskLoop(); + + // Orchestrator needs to call this to ensure that the executor is done reading from + // the Orchestrator's memory + void WaitForThreadClose(); + + // Temporary workaround for LFS checkout. Code added to be reverted. + // Returns true if the task running spawned threads within libgit2 + bool IsGitThreaded() { return currentGitThreads > kInitialGitThreads; } + + static Nan::AsyncResource *GetCurrentAsyncResource(); + + static const nodegit::Context *GetCurrentContext(); + + static Nan::Global *GetCurrentCallbackErrorHandle(); + + static void PostCallbackEvent(ThreadPool::OnPostCallbackFn onPostCallback); + + // Libgit2 will call this before it spawns a child thread. + // That way we can decide what the TLS for that thread should be + // We will make sure that the context for the current async work + // is preserved on the child thread through this method + static void *RetrieveTLSForLibgit2ChildThread(); + + // Libgit2 will call this on a child thread with the pointer that was + // retrieved from RetrieveTLSForLibgit2ChildThread. That allows us + // to store the necessary thread local storage for the child thread + static void SetTLSForLibgit2ChildThread(void *vexecutor); + + // Called when a libgit2 child thread exits. This gives us the ability + // to teardown any TLS we set up for the child thread if we need to + static void TeardownTLSOnLibgit2ChildThread(); + + private: + Nan::AsyncResource *currentAsyncResource; + Nan::Global *currentCallbackErrorHandle; + nodegit::Context *currentContext; + + // We need to populate the executor on every thread that libgit2 + // could make a callback on so that it can correctly queue callbacks + // in the correct javascript context + thread_local static Executor *executor; + thread_local static bool isExecutorThread; + PostCallbackEventToOrchestratorFn postCallbackEventToOrchestrator; + PostCompletedEventToOrchestratorFn postCompletedEventToOrchestrator; + TakeNextTaskFn takeNextTask; + std::thread thread; + + // Temporary workaround for LFS checkout. Code added to be reverted. + static constexpr int kInitialGitThreads {0}; + // Number of threads spawned internally by libgit2 to deal with + // the task of this Executor instance. Defaults to kInitialGitThreads. + std::atomic currentGitThreads {kInitialGitThreads}; + }; + + Executor::Executor( + PostCallbackEventToOrchestratorFn postCallbackEventToOrchestrator, + PostCompletedEventToOrchestratorFn postCompletedEventToOrchestrator, + TakeNextTaskFn takeNextTask, + nodegit::Context *context + ) + : currentAsyncResource(nullptr), + currentCallbackErrorHandle(nullptr), + currentContext(context), + postCallbackEventToOrchestrator(postCallbackEventToOrchestrator), + postCompletedEventToOrchestrator(postCompletedEventToOrchestrator), + takeNextTask(takeNextTask), + thread(&Executor::RunTaskLoop, this) + {} + + void Executor::RunTaskLoop() { + // Set the thread local storage so that libgit2 can pick up the current executor + // for the thread. + isExecutorThread = true; + executor = this; + + for ( ; ; ) { + std::unique_ptr task = takeNextTask(); + if (task->type == Task::Type::SHUTDOWN) { + return; + } + + WorkTask *workTask = static_cast(task.get()); + + // Temporary workaround for LFS checkout. Code added to be reverted. + currentGitThreads = kInitialGitThreads; + + currentAsyncResource = workTask->asyncResource; + currentCallbackErrorHandle = workTask->callbackErrorHandle; + workTask->callback(); + currentCallbackErrorHandle = nullptr; + currentAsyncResource = nullptr; + + postCompletedEventToOrchestrator(); + } + } + + void Executor::WaitForThreadClose() { + thread.join(); + } + + Nan::AsyncResource *Executor::GetCurrentAsyncResource() { + if (executor) { + return executor->currentAsyncResource; + } + + // NOTE this should always be set when a libgit2 callback is running, + // so this case should not happen. + return nullptr; + } + + const nodegit::Context *Executor::GetCurrentContext() { + if (executor) { + return executor->currentContext; + } + + // NOTE this should always be set when a libgit2 callback is running, + // so this case should not happen. + return nullptr; + } + + Nan::Global *Executor::GetCurrentCallbackErrorHandle() { + if (executor) { + return executor->currentCallbackErrorHandle; + } + + // NOTE this should always be set when a libgit2 callback is running, + // so this case should not happen. + return nullptr; + } + + void Executor::PostCallbackEvent(ThreadPool::OnPostCallbackFn onPostCallback) { + if (executor) { + executor->postCallbackEventToOrchestrator(onPostCallback); + } + } + + void *Executor::RetrieveTLSForLibgit2ChildThread() { + // Temporary workaround for LFS checkout. Code added to be reverted. + ++Executor::executor->currentGitThreads; + return Executor::executor; + } + + void Executor::SetTLSForLibgit2ChildThread(void *vexecutor) { + Executor::executor = static_cast(vexecutor); + } + + void Executor::TeardownTLSOnLibgit2ChildThread() { + if (!isExecutorThread) { + // Temporary workaround for LFS checkout. Code added to be reverted. + --Executor::executor->currentGitThreads; + Executor::executor = nullptr; + } + } + + thread_local Executor *Executor::executor = nullptr; + thread_local bool Executor::isExecutorThread = false; + + class Orchestrator { + public: + struct Job { + enum Type { SHUTDOWN, ASYNC_WORK }; + Job(Type initType) + : type(initType) + {} + Job(const Job &) = delete; + Job(Job &&) = delete; + Job &operator=(const Job &) = delete; + Job &operator=(Job &&) = delete; + + virtual ~Job() {} + + Type type; + }; + + struct ShutdownJob : Job { + ShutdownJob() + : Job(SHUTDOWN) + {} + }; + + struct AsyncWorkJob : Job { + AsyncWorkJob(nodegit::AsyncWorker *initWorker) + : Job(ASYNC_WORK), worker(initWorker) + {} + + nodegit::AsyncWorker *worker; + }; + + typedef std::function QueueCallbackOnJSThreadFn; + typedef std::function()> TakeNextJobFn; + + private: + class OrchestratorImpl { + public: + OrchestratorImpl( + QueueCallbackOnJSThreadFn queueCallbackOnJSThread, + TakeNextJobFn takeNextJob, + nodegit::Context *context + ); + + void RunJobLoop(); + + // The Executor will call this method to queue a CallbackEvent in Orchestrator's event loop + void PostCallbackEvent(ThreadPool::OnPostCallbackFn onPostCallback); + + // The Executor will call this method after completion its work. This should queue + // a CompletedEvent in Thread's event loop + void PostCompletedEvent(); + + // This will be used by Executor to take jobs that the Thread has picked up and run them. + std::unique_ptr TakeNextTask(); + + // This is used to wait for the Orchestrator's thread to shutdown after signaling shutdown + void WaitForThreadClose(); + + private: + // The only thread safe way to pull events from executorEventsQueue + std::shared_ptr TakeEventFromExecutor(); + + void ScheduleWorkTaskOnExecutor(ThreadPool::Callback callback, Nan::AsyncResource *asyncResource, Nan::Global *callbackErrorHandle); + + void ScheduleShutdownTaskOnExecutor(); + + std::condition_variable taskCondition; + std::unique_ptr taskMutex; + + std::queue> executorEventsQueue; + std::unique_ptr executorEventsMutex; + std::condition_variable executorEventsCondition; + + QueueCallbackOnJSThreadFn queueCallbackOnJSThread; + TakeNextJobFn takeNextJob; + std::unique_ptr task; + std::thread thread; + Executor executor; + }; + + std::unique_ptr impl; + + public: + Orchestrator( + QueueCallbackOnJSThreadFn queueCallbackOnJSThread, + TakeNextJobFn takeNextJob, + nodegit::Context *context + ); + + void WaitForThreadClose(); + }; + + Orchestrator::OrchestratorImpl::OrchestratorImpl( + QueueCallbackOnJSThreadFn queueCallbackOnJSThread, + TakeNextJobFn takeNextJob, + nodegit::Context *context + ) + : taskMutex(new std::mutex), + executorEventsMutex(new std::mutex), + queueCallbackOnJSThread(queueCallbackOnJSThread), + takeNextJob(takeNextJob), + task(nullptr), + thread(&Orchestrator::OrchestratorImpl::RunJobLoop, this), + executor( + std::bind(&Orchestrator::OrchestratorImpl::PostCallbackEvent, this, _1), + std::bind(&Orchestrator::OrchestratorImpl::PostCompletedEvent, this), + std::bind(&Orchestrator::OrchestratorImpl::TakeNextTask, this), + context + ) + {} + + void Orchestrator::OrchestratorImpl::RunJobLoop() { + for ( ; ; ) { + auto job = takeNextJob(); + switch (job->type) { + case Job::Type::SHUTDOWN: { + ScheduleShutdownTaskOnExecutor(); + executor.WaitForThreadClose(); + return; + } + + case Job::Type::ASYNC_WORK: { + std::shared_ptr asyncWorkJob = std::static_pointer_cast(job); + nodegit::AsyncWorker *worker = asyncWorkJob->worker; + // We lock at this level, because we temporarily unlock the lock master + // when a callback is fired. We need to be on the same thread to ensure + // the same thread that acquired the locks also releases them + nodegit::LockMaster lock = worker->AcquireLocks(); + ScheduleWorkTaskOnExecutor(std::bind(&nodegit::AsyncWorker::Execute, worker), worker->GetAsyncResource(), worker->GetCallbackErrorHandle()); + for ( ; ; ) { + std::shared_ptr event = TakeEventFromExecutor(); + if (event->type == Executor::Event::Type::COMPLETED) { + break; + } + + // We must have received a callback from libgit2 + auto callbackEvent = std::static_pointer_cast(event); + std::shared_ptr callbackMutex(new std::mutex); + std::shared_ptr callbackCondition(new std::condition_variable); + bool hasCompleted = false; + + // Temporary workaround for LFS checkout. Code removed to be reverted. + //LockMaster::TemporaryUnlock temporaryUnlock; + + // Temporary workaround for LFS checkout. Code added to be reverted. + bool isWorkerThreaded = executor.IsGitThreaded(); + ThreadPool::Callback callbackCompleted = []() {}; + if (!isWorkerThreaded) { + callbackCompleted = [callbackCondition, callbackMutex, &hasCompleted]() { + std::lock_guard lock(*callbackMutex); + hasCompleted = true; + callbackCondition->notify_one(); + }; + } + std::unique_ptr temporaryUnlock {nullptr}; + if (!isWorkerThreaded) { + temporaryUnlock = std::make_unique(); + } + + auto onCompletedCallback = (*callbackEvent)( + [this](ThreadPool::Callback callback, ThreadPool::Callback cancelCallback) { + queueCallbackOnJSThread(callback, cancelCallback, false); + }, + // Temporary workaround for LFS checkout. Code modified to be reverted. + /* + [callbackCondition, callbackMutex, &hasCompleted]() { + std::lock_guard lock(*callbackMutex); + hasCompleted = true; + callbackCondition->notify_one(); + } + */ + callbackCompleted, + isWorkerThreaded + ); + + // Temporary workaround for LFS checkout. Code modified to be reverted. + if (!isWorkerThreaded) { + std::unique_lock lock(*callbackMutex); + while (!hasCompleted) callbackCondition->wait(lock); + onCompletedCallback(); + } + } + + queueCallbackOnJSThread( + [worker]() { + worker->WorkComplete(); + worker->Destroy(); + }, + [worker]() { + worker->Cancel(); + worker->WorkComplete(); + worker->Destroy(); + }, + true + ); + } + } + } + } + + // TODO add a cancel callback to `OnPostCallbackFn` which can be used on nodegit terminate + void Orchestrator::OrchestratorImpl::PostCallbackEvent(ThreadPool::OnPostCallbackFn onPostCallback) { + std::lock_guard lock(*executorEventsMutex); + std::shared_ptr callbackEvent(new Executor::CallbackEvent(onPostCallback)); + executorEventsQueue.push(callbackEvent); + executorEventsCondition.notify_one(); + } + + void Orchestrator::OrchestratorImpl::PostCompletedEvent() { + std::lock_guard lock(*executorEventsMutex); + std::shared_ptr completedEvent(new Executor::CompletedEvent); + executorEventsQueue.push(completedEvent); + executorEventsCondition.notify_one(); + } + + std::shared_ptr Orchestrator::OrchestratorImpl::TakeEventFromExecutor() { + std::unique_lock lock(*executorEventsMutex); + while (executorEventsQueue.empty()) executorEventsCondition.wait(lock); + std::shared_ptr executorEvent = executorEventsQueue.front(); + executorEventsQueue.pop(); + return executorEvent; + } + + void Orchestrator::OrchestratorImpl::ScheduleShutdownTaskOnExecutor() { + std::lock_guard lock(*taskMutex); + task.reset(new Executor::ShutdownTask); + taskCondition.notify_one(); + } + + void Orchestrator::OrchestratorImpl::ScheduleWorkTaskOnExecutor(ThreadPool::Callback callback, Nan::AsyncResource *asyncResource, Nan::Global *callbackErrorHandle) { + std::lock_guard lock(*taskMutex); + task.reset(new Executor::WorkTask(callback, asyncResource, callbackErrorHandle)); + taskCondition.notify_one(); + } + + std::unique_ptr Orchestrator::OrchestratorImpl::TakeNextTask() { + std::unique_lock lock(*taskMutex); + while (!task) taskCondition.wait(lock); + return std::move(task); + } + + void Orchestrator::OrchestratorImpl::WaitForThreadClose() { + thread.join(); + } + + Orchestrator::Orchestrator( + QueueCallbackOnJSThreadFn queueCallbackOnJSThread, + TakeNextJobFn takeNextJob, + nodegit::Context *context + ) + : impl(new OrchestratorImpl(queueCallbackOnJSThread, takeNextJob, context)) + {} + + void Orchestrator::WaitForThreadClose() { + impl->WaitForThreadClose(); + } + + class ThreadPoolImpl { + public: + ThreadPoolImpl(int numberOfThreads, uv_loop_t *loop, nodegit::Context *context); + + void QueueWorker(nodegit::AsyncWorker *worker); + + std::shared_ptr TakeNextJob(); + + void QueueCallbackOnJSThread(ThreadPool::Callback callback, ThreadPool::Callback cancelCallback, bool isWork); + + static void RunLoopCallbacks(uv_async_t *handle); + + void Shutdown(std::unique_ptr cleanupHandle); + + struct AsyncCallbackData { + AsyncCallbackData(ThreadPoolImpl *pool) + : pool(pool) + {} + + std::unique_ptr cleanupHandle; + ThreadPoolImpl *pool; + }; + + private: + bool isMarkedForDeletion; + + struct JSThreadCallback { + JSThreadCallback(ThreadPool::Callback callback, ThreadPool::Callback cancelCallback, bool isWork) + : isWork(isWork), callback(callback), cancelCallback(cancelCallback) + {} + + JSThreadCallback() + : isWork(false), callback(nullptr), cancelCallback(nullptr) + {} + + void performCallback() { + callback(); + } + + void cancel() { + cancelCallback(); + } + + bool isWork; + + private: + ThreadPool::Callback callback; + ThreadPool::Callback cancelCallback; + }; + + void RunLoopCallbacks(); + + std::queue> orchestratorJobQueue; + std::unique_ptr orchestratorJobMutex; + std::condition_variable orchestratorJobCondition; + size_t workInProgressCount; + + // completion and async callbacks to be performed on the loop + std::queue jsThreadCallbackQueue; + std::unique_ptr jsThreadCallbackMutex; + uv_async_t jsThreadCallbackAsync; + + std::vector orchestrators; + }; + + // context required to be passed to Orchestrators, but ThreadPoolImpl doesn't need to keep it + ThreadPoolImpl::ThreadPoolImpl(int numberOfThreads, uv_loop_t *loop, nodegit::Context *context) + : isMarkedForDeletion(false), + orchestratorJobMutex(new std::mutex), + jsThreadCallbackMutex(new std::mutex) + { + uv_async_init(loop, &jsThreadCallbackAsync, RunLoopCallbacks); + jsThreadCallbackAsync.data = new AsyncCallbackData(this); + uv_unref((uv_handle_t *)&jsThreadCallbackAsync); + + workInProgressCount = 0; + + for (int i = 0; i < numberOfThreads; i++) { + orchestrators.emplace_back( + std::bind(&ThreadPoolImpl::QueueCallbackOnJSThread, this, _1, _2, _3), + std::bind(&ThreadPoolImpl::TakeNextJob, this), + context + ); + } + } + + void ThreadPoolImpl::QueueWorker(nodegit::AsyncWorker *worker) { + std::lock_guard lock(*orchestratorJobMutex); + // there is work on the thread pool - reference the handle so + // node doesn't terminate + uv_ref((uv_handle_t *)&jsThreadCallbackAsync); + orchestratorJobQueue.emplace(new Orchestrator::AsyncWorkJob(worker)); + workInProgressCount++; + orchestratorJobCondition.notify_one(); + } + + std::shared_ptr ThreadPoolImpl::TakeNextJob() { + std::unique_lock lock(*orchestratorJobMutex); + while (orchestratorJobQueue.empty()) orchestratorJobCondition.wait(lock); + auto orchestratorJob = orchestratorJobQueue.front(); + + // When the thread pool is shutting down, the thread pool will drain the work queue and replace it with + // a single shared_ptr to a shutdown job, so don't pop the queue when we're shutting down so + // everyone gets the signal + if (orchestratorJob->type != Orchestrator::Job::Type::SHUTDOWN) { + orchestratorJobQueue.pop(); + } + + return orchestratorJob; + } + + void ThreadPoolImpl::QueueCallbackOnJSThread(ThreadPool::Callback callback, ThreadPool::Callback cancelCallback, bool isWork) { + std::unique_lock lock(*jsThreadCallbackMutex); + // When the threadpool is shutting down, we want to free up the executors to also shutdown + // that means that we need to cancel all non-work callbacks as soon as we see them and + // we know that we are shutting down + if (isMarkedForDeletion && !isWork) { + // we don't know how long the cancelCallback will take, and it certainly doesn't need the lock + // while we're running it, so unlock it immediately. + lock.unlock(); + cancelCallback(); + return; + } + + bool queueWasEmpty = jsThreadCallbackQueue.empty(); + jsThreadCallbackQueue.emplace(callback, cancelCallback, isWork); + // we only trigger RunLoopCallbacks via the jsThreadCallbackAsync handle if the queue + // was empty. Otherwise, we depend on RunLoopCallbacks to re-trigger itself + if (queueWasEmpty) { + uv_async_send(&jsThreadCallbackAsync); + } + } + + void ThreadPoolImpl::RunLoopCallbacks(uv_async_t* handle) { + auto asyncCallbackData = static_cast(handle->data); + if (asyncCallbackData->pool) { + asyncCallbackData->pool->RunLoopCallbacks(); + } + } + + // NOTE this should theoretically never be triggered during a cleanup operation + void ThreadPoolImpl::RunLoopCallbacks() { + Nan::HandleScope scope; + v8::Local context = Nan::GetCurrentContext(); + node::CallbackScope callbackScope(context->GetIsolate(), Nan::New(), {0, 0}); + + std::unique_lock lock(*jsThreadCallbackMutex); + // get the next callback to run + JSThreadCallback jsThreadCallback = jsThreadCallbackQueue.front(); + jsThreadCallbackQueue.pop(); + + lock.unlock(); + jsThreadCallback.performCallback(); + lock.lock(); + + if (!jsThreadCallbackQueue.empty()) { + uv_async_send(&jsThreadCallbackAsync); + } + + // if there is no ongoing work / completion processing, node doesn't need + // to be prevented from terminating + if (jsThreadCallback.isWork) { + std::lock_guard orchestratorLock(*orchestratorJobMutex); + workInProgressCount--; + if (!workInProgressCount) { + uv_unref((uv_handle_t *)&jsThreadCallbackAsync); + } + } + } + + void ThreadPoolImpl::Shutdown(std::unique_ptr cleanupHandle) { + std::queue> cancelledJobs; + std::queue cancelledCallbacks; + { + std::unique_lock orchestratorLock(*orchestratorJobMutex, std::defer_lock); + std::unique_lock jsThreadLock(*jsThreadCallbackMutex, std::defer_lock); + std::lock(orchestratorLock, jsThreadLock); + + // Once we've marked for deletion, we will start cancelling all callbacks + // when an attempt to queue a callback is made + isMarkedForDeletion = true; + // We want to grab all of the jobs that have been queued and run their cancel routines + // so that we can clean up their resources + orchestratorJobQueue.swap(cancelledJobs); + // We also want to grab all callbacks that have been queued so that we can + // run their cancel routines, this will help terminate the async workers + // that are currently being executed complete so that the threads + // running them can exit cleanly + jsThreadCallbackQueue.swap(cancelledCallbacks); + // Pushing a ShutdownJob into the queue will instruct all threads + // to start their shutdown process when they see the job is available. + orchestratorJobQueue.emplace(new Orchestrator::ShutdownJob); + + if (workInProgressCount) { + // unref the jsThreadCallback for all work in progress + // it will not be used after this function has completed + while (workInProgressCount--) { + uv_unref((uv_handle_t *)&jsThreadCallbackAsync); + } + } + + orchestratorJobCondition.notify_all(); + } + + Nan::HandleScope scope; + v8::Local context = Nan::GetCurrentContext(); + node::CallbackScope callbackScope(context->GetIsolate(), Nan::New(), {0, 0}); + + while (cancelledJobs.size()) { + std::shared_ptr cancelledJob = cancelledJobs.front(); + std::shared_ptr asyncWorkJob = std::static_pointer_cast(cancelledJob); + + asyncWorkJob->worker->Cancel(); + asyncWorkJob->worker->WorkComplete(); + asyncWorkJob->worker->Destroy(); + + cancelledJobs.pop(); + } + + // We need to cancel all callbacks that were scheduled before the shutdown + // request went through. This will help finish any work any currently operating + // executors are undertaking + while (cancelledCallbacks.size()) { + JSThreadCallback cancelledCallback = cancelledCallbacks.front(); + cancelledCallback.cancel(); + cancelledCallbacks.pop(); + } + + std::for_each(orchestrators.begin(), orchestrators.end(), [](Orchestrator &orchestrator) { + orchestrator.WaitForThreadClose(); + }); + + // After we have completed waiting for all threads to close + // we will need to cleanup the rest of the completion callbacks + // from workers that were still running when the shutdown signal + // was sent + std::lock_guard jsThreadLock(*jsThreadCallbackMutex); + while (jsThreadCallbackQueue.size()) { + JSThreadCallback jsThreadCallback = jsThreadCallbackQueue.front(); + jsThreadCallback.cancel(); + jsThreadCallbackQueue.pop(); + } + + AsyncCallbackData *asyncCallbackData = static_cast(jsThreadCallbackAsync.data); + asyncCallbackData->cleanupHandle.swap(cleanupHandle); + asyncCallbackData->pool = nullptr; + + uv_close(reinterpret_cast(&jsThreadCallbackAsync), [](uv_handle_t *handle) { + auto asyncCallbackData = static_cast(handle->data); + delete asyncCallbackData; + }); + } + + ThreadPool::ThreadPool(int numberOfThreads, uv_loop_t *loop, nodegit::Context *context) + : impl(new ThreadPoolImpl(numberOfThreads, loop, context)) + {} + + ThreadPool::~ThreadPool() {} + + void ThreadPool::QueueWorker(nodegit::AsyncWorker *worker) { + impl->QueueWorker(worker); + } + + void ThreadPool::PostCallbackEvent(OnPostCallbackFn onPostCallback) { + Executor::PostCallbackEvent(onPostCallback); + } + + Nan::AsyncResource *ThreadPool::GetCurrentAsyncResource() { + return Executor::GetCurrentAsyncResource(); + } + + const nodegit::Context *ThreadPool::GetCurrentContext() { + return Executor::GetCurrentContext(); + } + + Nan::Global *ThreadPool::GetCurrentCallbackErrorHandle() { + return Executor::GetCurrentCallbackErrorHandle(); + } + + void ThreadPool::Shutdown(std::unique_ptr cleanupHandle) { + impl->Shutdown(std::move(cleanupHandle)); + } + + void ThreadPool::InitializeGlobal() { + git_custom_tls_set_callbacks( + Executor::RetrieveTLSForLibgit2ChildThread, + Executor::SetTLSForLibgit2ChildThread, + Executor::TeardownTLSOnLibgit2ChildThread + ); + } +} diff --git a/generate/templates/manual/src/tracker_wrap.cc b/generate/templates/manual/src/tracker_wrap.cc new file mode 100644 index 0000000000..85034d88de --- /dev/null +++ b/generate/templates/manual/src/tracker_wrap.cc @@ -0,0 +1,238 @@ +#include "../include/tracker_wrap.h" + +#include +#include + +namespace { + /** + * \class TrackerWrapTreeNode + * + * Parents of a TrackerWrapTreeNode will be the nodes holding TrackerWrap objects that + * are owners of the TrackerWrap object that this node holds. The same way for its children. + */ + class TrackerWrapTreeNode + { + public: + TrackerWrapTreeNode(nodegit::TrackerWrap *trackerWrap) : m_trackerWrap(trackerWrap) {} + TrackerWrapTreeNode() = delete; + ~TrackerWrapTreeNode(); + TrackerWrapTreeNode(const TrackerWrapTreeNode &other) = delete; + TrackerWrapTreeNode(TrackerWrapTreeNode &&other) = delete; + TrackerWrapTreeNode& operator=(const TrackerWrapTreeNode &other) = delete; + TrackerWrapTreeNode& operator=(TrackerWrapTreeNode &&other) = delete; + + inline const std::unordered_set& Children() const; + inline nodegit::TrackerWrap* TrackerWrap(); + inline void AddChild(TrackerWrapTreeNode *child); + + private: + std::unordered_set m_children {}; + nodegit::TrackerWrap *m_trackerWrap {}; + }; + + /** + * TrackerWrapTreeNode::~TrackerWrapTreeNode() + * Frees the memory of the TrackerWrap pointer it holds. + */ + TrackerWrapTreeNode::~TrackerWrapTreeNode() { + delete m_trackerWrap; + } + + /** + * TrackerWrapTreeNode::Children() + * + * Returns a reference to the children nodes of this. + */ + const std::unordered_set& TrackerWrapTreeNode::Children() const { + return m_children; + } + + /** + * TrackerWrapTreeNode::TrackerWrap() + * + * Returns a pointer to the node's TrackerWrap object. + */ + nodegit::TrackerWrap* TrackerWrapTreeNode::TrackerWrap() { + return m_trackerWrap; + } + + /** + * TrackerWrapTreeNode::AddChild() + */ + void TrackerWrapTreeNode::AddChild(TrackerWrapTreeNode *child) { + m_children.insert(child); + } + + /** + * \class TrackerWrapTrees + * + * Class containing a list of trees with nodes holding TrackerWrap objects. + * For a TrackerWrap object 'P' which owns another TrackerWrap object 'C', + * 'P' will be held in a node which will be the parent of the child node + * that holds 'C'. + * On destruction, nodes will be freed in a children-first way. + * + * NOTE: nodegit code previous to this change is prepared to manage an array of + * owners, so class TrackerWrapTrees considers multiple owners (parent nodes) too. + */ + class TrackerWrapTrees + { + public: + TrackerWrapTrees(nodegit::TrackerWrap::TrackerList *trackerList); + TrackerWrapTrees() = delete; + ~TrackerWrapTrees(); + TrackerWrapTrees(const TrackerWrapTrees &other) = delete; + TrackerWrapTrees(TrackerWrapTrees &&other) = delete; + TrackerWrapTrees& operator=(const TrackerWrapTrees &other) = delete; + TrackerWrapTrees& operator=(TrackerWrapTrees &&other) = delete; + + private: + void addNode(nodegit::TrackerWrap *trackerWrap); + void addParentNode(nodegit::TrackerWrap *owner, TrackerWrapTreeNode *child); + void deleteTree(TrackerWrapTreeNode *node); + void freeAllTreesChildrenFirst(); + + using TrackerWrapTreeNodeMap = std::unordered_map>; + + TrackerWrapTreeNodeMap m_mapTrackerWrapNode {}; + std::vector m_roots {}; + }; + + /** + * TrackerWrapTrees::TrackerWrapTrees(nodegit::TrackerWrap::TrackerList *trackerList) + * + * Unlinks items from trackerList and adds them to a tree. + * For each root (TrackerWrap item without owners), it adds a new tree root. + * + * \param trackerList TrackerList pointer from which the TrackerWrapTrees object will be created. + */ + TrackerWrapTrees::TrackerWrapTrees(nodegit::TrackerWrap::TrackerList *trackerList) + { + nodegit::TrackerWrap *trackerWrap {}; + while ((trackerWrap = nodegit::TrackerWrap::UnlinkFirst(trackerList)) != nullptr) { + addNode(trackerWrap); + } + } + + /* + * TrackerWrapTrees::~TrackerWrapTrees + */ + TrackerWrapTrees::~TrackerWrapTrees() { + freeAllTreesChildrenFirst(); + } + + /** + * TrackerWrapTrees::addNode + * + * \param trackerWrap pointer to the TrackerWrap object to add as a node in a tree. + */ + void TrackerWrapTrees::addNode(nodegit::TrackerWrap *trackerWrap) { + // add trackerWrap as a node + // NOTE: 'emplace' will create a temporal TrackerWrapTreeNode and will + // free it if trackerWrap already exists as a key. To prevent freeing + // the node at this moment we have to find it first. + auto addedNodeIter = m_mapTrackerWrapNode.find(trackerWrap); + if (addedNodeIter == m_mapTrackerWrapNode.end()) { + addedNodeIter = m_mapTrackerWrapNode.emplace(std::make_pair( + trackerWrap, std::make_unique(trackerWrap))).first; + } + TrackerWrapTreeNode *addedNode = addedNodeIter->second.get(); + + // if trackerWrap has no owners, add it as a root node + const std::vector *owners = trackerWrap->GetTrackerWrapOwners(); + if (owners == nullptr) { + m_roots.push_back(addedNode); + } + else { + // add addedNode's parents and link them with this child + for (nodegit::TrackerWrap *owner : *owners) { + addParentNode(owner, addedNode); + } + } + } + + /** + * TrackerWrapTrees::addParentNode + * + * \param owner TrackerWrap pointer for the new parent node to add. + * \param child TrackerWrapTreeNode pointer to be the child node of the new parent node to add. + */ + void TrackerWrapTrees::addParentNode(nodegit::TrackerWrap *owner, TrackerWrapTreeNode *child) + { + // adds a new parent node (holding the owner) + // NOTE: 'emplace' will create a temporal TrackerWrapTreeNode and will + // free it if trackerWrap already exists as a key. To prevent freeing + // the node at this moment we have to find it first. + auto addedParentNodeIter = m_mapTrackerWrapNode.find(owner); + if (addedParentNodeIter == m_mapTrackerWrapNode.end()) { + addedParentNodeIter = m_mapTrackerWrapNode.emplace(std::make_pair( + owner, std::make_unique(owner))).first; + } + TrackerWrapTreeNode *addedParentNode = addedParentNodeIter->second.get(); + + // links parent to child + addedParentNode->AddChild(child); + } + + /** + * TrackerWrapTrees::deleteTree + * + * Deletes the tree from the node passed as a parameter + * in a children-first way and recursively. + * + * \param node node from where to delete all its children and itself. + */ + void TrackerWrapTrees::deleteTree(TrackerWrapTreeNode *node) + { + // delete all node's children first + const std::unordered_set &children = node->Children(); + for (TrackerWrapTreeNode *child : children) { + // check that child hasn't been removed previously by another parent + if (m_mapTrackerWrapNode.find(child->TrackerWrap()) != m_mapTrackerWrapNode.end()) { + deleteTree(child); + } + } + + // then deletes itself from the container, which will + // actually free 'node' and the TrackerWrap object it holds + m_mapTrackerWrapNode.erase(node->TrackerWrap()); + } + + /** + * TrackerWrapTrees::freeAllTreesChildrenFirst + * + * Deletes all the trees held, in a children-first way. + */ + void TrackerWrapTrees::freeAllTreesChildrenFirst() { + for (TrackerWrapTreeNode *root : m_roots) { + deleteTree(root); + } + m_roots.clear(); + } +} // end anonymous namespace + + +namespace nodegit { + TrackerWrap* TrackerWrap::UnlinkFirst(TrackerList *listStart) { + assert(listStart != nullptr); + return listStart->m_next == nullptr ? nullptr : listStart->m_next->Unlink(); + } + + int TrackerWrap::SizeFromList(TrackerList *listStart) { + assert(listStart != nullptr); + TrackerList *t {listStart}; + int count {0}; + while (t->m_next != nullptr) { + ++count; + t = t->m_next; + } + return count; + } + + void TrackerWrap::DeleteFromList(TrackerList *listStart) { + assert(listStart != nullptr); + // creates an object TrackerWrapTrees, which will free + // the nodes of its trees in a children-first way + TrackerWrapTrees trackerWrapTrees(listStart); + } +} \ No newline at end of file diff --git a/generate/templates/manual/src/v8_helpers.cc b/generate/templates/manual/src/v8_helpers.cc new file mode 100644 index 0000000000..bd97fba34e --- /dev/null +++ b/generate/templates/manual/src/v8_helpers.cc @@ -0,0 +1,19 @@ +#include "../include/v8_helpers.h" + +namespace nodegit { + v8::Local safeGetField(v8::Local &containerObject, std::string field) { + auto maybeFieldName = Nan::New(field); + if (maybeFieldName.IsEmpty()) { + v8::Local emptyResult; + return emptyResult; + } + + auto maybeRetrievedField = Nan::Get(containerObject, maybeFieldName.ToLocalChecked()); + if (maybeRetrievedField.IsEmpty()) { + v8::Local emptyResult; + return emptyResult; + } + + return maybeRetrievedField.ToLocalChecked(); + } +} diff --git a/generate/templates/manual/src/wrapper.cc b/generate/templates/manual/src/wrapper.cc index 8966bb6fa7..3bad23c7d4 100644 --- a/generate/templates/manual/src/wrapper.cc +++ b/generate/templates/manual/src/wrapper.cc @@ -16,42 +16,44 @@ Wrapper::Wrapper(void *raw) { this->raw = raw; } -void Wrapper::InitializeComponent(Handle target) { - NanScope(); +void Wrapper::InitializeComponent(Local target, nodegit::Context *nodegitContext) { + Nan::HandleScope scope; - Local tpl = NanNew(JSNewFunction); + Local nodegitExternal = Nan::New(nodegitContext); + Local tpl = Nan::New(JSNewFunction, nodegitExternal); - tpl->InstanceTemplate()->SetInternalFieldCount(1); - tpl->SetClassName(NanNew("Wrapper")); + tpl->InstanceTemplate()->SetInternalFieldCount(2); + tpl->SetClassName(Nan::New("Wrapper").ToLocalChecked()); - NODE_SET_PROTOTYPE_METHOD(tpl, "toBuffer", ToBuffer); + Nan::SetPrototypeMethod(tpl, "toBuffer", ToBuffer, nodegitExternal); - NanAssignPersistent(constructor_template, tpl); - target->Set(NanNew("Wrapper"), tpl->GetFunction()); + Local constructor_template = Nan::GetFunction(tpl).ToLocalChecked(); + nodegitContext->SaveToPersistent("Wrapper::Template", constructor_template); + Nan::Set(target, Nan::New("Wrapper").ToLocalChecked(), constructor_template); } NAN_METHOD(Wrapper::JSNewFunction) { - NanScope(); - if (args.Length() == 0 || !args[0]->IsExternal()) { - return NanThrowError("void * is required."); + if (info.Length() == 0 || !info[0]->IsExternal()) { + return Nan::ThrowError("void * is required."); } - Wrapper* object = new Wrapper(External::Cast(*args[0])->Value()); - object->Wrap(args.This()); + Wrapper* object = new Wrapper(External::Cast(*info[0])->Value()); + object->Wrap(info.This()); - NanReturnValue(args.This()); + info.GetReturnValue().Set(info.This()); } -Handle Wrapper::New(void *raw) { - NanEscapableScope(); +Local Wrapper::New(const void *raw) { + Nan::EscapableHandleScope scope; - Handle argv[1] = { NanNew((void *)raw) }; + Local argv[1] = { Nan::New((void *)raw) }; Local instance; - Local constructorHandle = NanNew(constructor_template); - instance = constructorHandle->GetFunction()->NewInstance(1, argv); + nodegit::Context *nodegitContext = nodegit::Context::GetCurrentContext(); + Local constructor_template = nodegitContext->GetFromPersistent("Wrapper::Template").As(); + instance = Nan::NewInstance(constructor_template, 1, argv).ToLocalChecked(); - return NanEscapeScope(instance); + return scope.Escape(instance); } void *Wrapper::GetValue() { @@ -59,24 +61,20 @@ void *Wrapper::GetValue() { } NAN_METHOD(Wrapper::ToBuffer) { - NanScope(); - if(args.Length() == 0 || !args[0]->IsNumber()) { - return NanThrowError("Number is required."); + if(info.Length() == 0 || !info[0]->IsNumber()) { + return Nan::ThrowError("Number is required."); } - int len = args[0]->ToNumber()->Value(); + int len = Nan::To(info[0]).FromJust(); Local bufferConstructor = Local::Cast( - NanGetCurrentContext()->Global()->Get(NanNew("Buffer"))); + Nan::Get(Nan::GetCurrentContext()->Global(), Nan::New("Buffer").ToLocalChecked()).ToLocalChecked()); - Handle constructorArgs[1] = { NanNew(len) }; - Local nodeBuffer = bufferConstructor->NewInstance(1, constructorArgs); + Local constructorArgs[1] = { Nan::New(len) }; + Local nodeBuffer = Nan::NewInstance(bufferConstructor, 1, constructorArgs).ToLocalChecked(); - std::memcpy(node::Buffer::Data(nodeBuffer), ObjectWrap::Unwrap(args.This())->GetValue(), len); + std::memcpy(node::Buffer::Data(nodeBuffer), Nan::ObjectWrap::Unwrap(info.This())->GetValue(), len); - NanReturnValue(nodeBuffer); + info.GetReturnValue().Set(nodeBuffer); } - - -Persistent Wrapper::constructor_template; diff --git a/generate/templates/manual/tree/get_all_filepaths.cc b/generate/templates/manual/tree/get_all_filepaths.cc new file mode 100644 index 0000000000..758383980a --- /dev/null +++ b/generate/templates/manual/tree/get_all_filepaths.cc @@ -0,0 +1,157 @@ + +namespace TreeFilepathsHelpers { + +int iterateTreePaths(git_repository *repo, git_tree *tree, std::vector *paths,std::string *buffer) { + size_t size = git_tree_entrycount(tree); + for (size_t i = 0; i < size; i++) { + const git_tree_entry *entry = git_tree_entry_byindex(tree, i); + const git_filemode_t filemode = git_tree_entry_filemode(entry); + if (filemode == GIT_FILEMODE_BLOB || filemode == GIT_FILEMODE_BLOB_EXECUTABLE) { + paths->push_back(*buffer + std::string(git_tree_entry_name(entry))); + } + else if (filemode == GIT_FILEMODE_TREE) { + git_tree *subtree; + int error = git_tree_lookup(&subtree, repo, git_tree_entry_id(entry)); + if (error == GIT_OK) { + size_t size = buffer->size(); + /* append the next entry to the path */ + buffer->append(git_tree_entry_name(entry)); + buffer->append("/"); + error = iterateTreePaths(repo, subtree, paths, buffer); + git_tree_free(subtree); + buffer->resize(size); + } + + if (error < 0 ) { + return error; + } + + } + } + return GIT_OK; +} + +} // end anonymous namespace + +NAN_METHOD(GitTree::GetAllFilepaths) +{ + if (!info[info.Length() - 1]->IsFunction()) { + return Nan::ThrowError("Callback is required and must be a Function."); + } + + GetAllFilepathsBaton* baton = new GetAllFilepathsBaton(); + + baton->error_code = GIT_OK; + baton->error = NULL; + baton->tree = Nan::ObjectWrap::Unwrap(info.This())->GetValue(); + baton->out = new std::vector; + baton->repo = git_tree_owner(baton->tree); + + Nan::Callback *callback = new Nan::Callback(Local::Cast(info[info.Length() - 1])); + std::map> cleanupHandles; + GetAllFilepathsWorker *worker = new GetAllFilepathsWorker(baton, callback, cleanupHandles); + worker->Reference("tree", info.This()); + nodegit::Context *nodegitContext = reinterpret_cast(info.Data().As()->Value()); + nodegitContext->QueueWorker(worker); + + return; +} + +nodegit::LockMaster GitTree::GetAllFilepathsWorker::AcquireLocks() { + nodegit::LockMaster lockMaster(true, baton->tree, baton->repo); + return lockMaster; +} + +void GitTree::GetAllFilepathsWorker::Execute() +{ + std::string buffer; + buffer.reserve(4096); + baton->error_code = TreeFilepathsHelpers::iterateTreePaths(baton->repo, baton->tree, baton->out, &buffer); + if (baton->error_code != GIT_OK && git_error_last()->klass != GIT_ERROR_NONE) { + baton->error = git_error_dup(git_error_last()); + } +} + +void GitTree::GetAllFilepathsWorker::HandleErrorCallback() { + if (baton->error) { + if (baton->error->message) { + free((void *)baton->error->message); + } + + free((void *)baton->error); + } + + delete baton->out; + + delete baton; +} + +void GitTree::GetAllFilepathsWorker::HandleOKCallback() +{ + if (baton->error_code == GIT_OK) { + std::vector &paths = *(baton->out); + v8::Local result = Nan::New(paths.size()); + for (unsigned int i = 0; i < paths.size(); i++) { + Nan::Set(result, i, Nan::New(paths[i]).ToLocalChecked()); + } + + v8::Local argv[2] = {Nan::Null(), result}; + callback->Call(2, argv, async_resource); + } + else + { + if (baton->error) + { + Local err; + if (baton->error->message) { + err = Nan::To(Nan::Error(baton->error->message)).ToLocalChecked(); + } else { + err = Nan::To(Nan::Error("Method getAllFilepaths has thrown an error.")).ToLocalChecked(); + } + Nan::Set(err, Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); + Nan::Set(err, Nan::New("errorFunction").ToLocalChecked(), Nan::New("Tree.getAllFilepaths").ToLocalChecked()); + Local argv[1] = { + err + }; + callback->Call(1, argv, async_resource); + if (baton->error->message) + { + free((void *)baton->error->message); + } + + free((void *)baton->error); + } + else if (baton->error_code < 0) + { + bool callbackFired = false; + if (!callbackErrorHandle.IsEmpty()) { + v8::Local maybeError = Nan::New(callbackErrorHandle); + if (!maybeError->IsNull() && !maybeError->IsUndefined()) { + v8::Local argv[1] = { + maybeError + }; + callback->Call(1, argv, async_resource); + callbackFired = true; + } + } + + if (!callbackFired) + { + Local err = Nan::To(Nan::Error("Method getAllFilepaths has thrown an error.")).ToLocalChecked(); + Nan::Set(err, Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); + Nan::Set(err, Nan::New("errorFunction").ToLocalChecked(), Nan::New("Revwalk.getAllFilepaths").ToLocalChecked()); + Local argv[1] = { + err + }; + callback->Call(1, argv, async_resource); + } + } + else + { + callback->Call(0, NULL, async_resource); + } + } + + delete baton->out; + delete baton; +} diff --git a/generate/templates/partials/async_function.cc b/generate/templates/partials/async_function.cc index 503befe85e..d23ec7f609 100644 --- a/generate/templates/partials/async_function.cc +++ b/generate/templates/partials/async_function.cc @@ -1,166 +1,368 @@ {%partial doc .%} NAN_METHOD({{ cppClassName }}::{{ cppFunctionName }}) { - NanScope(); {%partial guardArguments .%} - if (args.Length() == {{args|jsArgsCount}} || !args[{{args|jsArgsCount}}]->IsFunction()) { - return NanThrowError("Callback is required and must be a Function."); + if (!info[info.Length() - 1]->IsFunction()) { + return Nan::ThrowError("Callback is required and must be a Function."); } - {{ cppFunctionName }}Baton* baton = new {{ cppFunctionName }}Baton; + {{ cppFunctionName }}Baton* baton = new {{ cppFunctionName }}Baton(); baton->error_code = GIT_OK; baton->error = NULL; {%each args|argsInfo as arg %} {%if arg.globalPayload %} - {{ cppFunctionName }}_globalPayload* globalPayload = new {{ cppFunctionName }}_globalPayload; - {%endif%} - {%if arg.cppClassName == "GitBuf" %} - baton->{{arg.name}} = ({{ arg.cType }})malloc(sizeof({{ arg.cType|replace '*' '' }}));; - baton->{{arg.name}}->ptr = NULL; - baton->{{arg.name}}->size = baton->{{arg.name}}->asize = 0; + {{ cppFunctionName }}_globalPayload* globalPayload = new {{ cppFunctionName }}_globalPayload; {%endif%} {%endeach%} + nodegit::Context *nodegitContext = reinterpret_cast(info.Data().As()->Value()); + std::map> cleanupHandles; + {%each args|argsInfo as arg %} {%if not arg.isReturn %} {%if arg.isSelf %} - baton->{{ arg.name }} = ObjectWrap::Unwrap<{{ arg.cppClassName }}>(args.This())->GetValue(); + baton->{{ arg.name }} = Nan::ObjectWrap::Unwrap<{{ arg.cppClassName }}>(info.This())->GetValue(); {%elsif arg.isCallbackFunction %} - if (!args[{{ arg.jsArg }}]->IsFunction()) { - baton->{{ arg.name }} = NULL; - {%if arg.payload.globalPayload %} - globalPayload->{{ arg.name }} = NULL; - {%else%} - baton->{{ arg.payload.name }} = NULL; - {%endif%} - } - else { - baton->{{ arg.name}} = {{ cppFunctionName }}_{{ arg.name }}_cppCallback; + if (!info[{{ arg.jsArg }}]->IsFunction()) { + baton->{{ arg.name }} = NULL; {%if arg.payload.globalPayload %} - globalPayload->{{ arg.name }} = new NanCallback(args[{{ arg.jsArg }}].As()); + globalPayload->{{ arg.name }} = NULL; {%else%} - baton->{{ arg.payload.name }} = new NanCallback(args[{{ arg.jsArg }}].As()); + // NOTE this is a dead path + baton->{{ arg.payload.name }} = NULL; {%endif%} - } + } + else { + baton->{{ arg.name}} = {{ cppFunctionName }}_{{ arg.name }}_cppCallback; + {%if arg.payload.globalPayload %} + globalPayload->{{ arg.name }} = new Nan::Callback(info[{{ arg.jsArg }}].As()); + {%else%} + // NOTE this is a dead path + baton->{{ arg.payload.name }} = new Nan::Callback(info[{{ arg.jsArg }}].As()); + {%endif%} + } {%elsif arg.payloadFor %} {%if arg.globalPayload %} - baton->{{ arg.name }} = globalPayload; + baton->{{ arg.name }} = globalPayload; {%endif%} + {% elsif arg.isStructType %} + {% if arg.isOptional %} + if (info[{{ arg.jsArg }}]->IsNull() || info[{{ arg.jsArg }}]->IsUndefined()) { + baton->{{ arg.name }} = nullptr; + } else + {% endif %} + {% if arg.cppClassName == 'Array' %} + { + v8::Local tempArray = v8::Local::Cast(info[{{ arg.jsArg }}]); + baton->{{ arg.name }} = ({{ arg.cType|unPointer }}*)malloc(sizeof({{ arg.cType|unPointer }}) * tempArray->Length()); + for (uint32_t i = 0; i < tempArray->Length(); ++i) { + auto conversionResult = Configurable{{ arg.arrayElementCppClassName }}::fromJavascript( + nodegitContext, + Nan::Get(tempArray, i).ToLocalChecked() + ); + + if (!conversionResult.result) { + // TODO free previously allocated memory + free(baton->{{ arg.name }}); + return Nan::ThrowError(Nan::New(conversionResult.error).ToLocalChecked()); + } + + auto convertedObject = conversionResult.result; + cleanupHandles[std::string("{{ arg.name }}") + std::to_string(i)] = convertedObject; + baton->{{ arg.name }}[i] = *convertedObject->GetValue(); + } + } + {% else %} + { + auto conversionResult = Configurable{{ arg.cppClassName }}::fromJavascript(nodegitContext, info[{{ arg.jsArg }}]); + if (!conversionResult.result) { + return Nan::ThrowError(Nan::New(conversionResult.error).ToLocalChecked()); + } + + auto convertedObject = conversionResult.result; + cleanupHandles["{{ arg.name }}"] = convertedObject; + baton->{{ arg.name }} = convertedObject->GetValue(); + } + {% endif %} {%elsif arg.name %} - {%partial convertFromV8 arg%} + {%partial convertFromV8 arg%} {%if not arg.payloadFor %} - baton->{{ arg.name }} = from_{{ arg.name }}; + baton->{{ arg.name }} = from_{{ arg.name }}; {%if arg | isOid %} - baton->{{ arg.name }}NeedsFree = args[{{ arg.jsArg }}]->IsString(); + baton->{{ arg.name }}NeedsFree = info[{{ arg.jsArg }}]->IsString(); {%endif%} {%endif%} {%endif%} {%elsif arg.shouldAlloc %} - baton->{{ arg.name }} = ({{ arg.cType }})malloc(sizeof({{ arg.cType|replace '*' '' }})); + baton->{{arg.name}} = ({{ arg.cType }})malloc(sizeof({{ arg.cType|replace '*' '' }})); + {%if arg.cppClassName == "GitBuf" %} + baton->{{arg.name}}->ptr = NULL; + baton->{{arg.name}}->size = baton->{{arg.name}}->reserved = 0; + {%endif%} {%endif%} {%endeach%} - NanCallback *callback = new NanCallback(Local::Cast(args[{{args|jsArgsCount}}])); - {{ cppFunctionName }}Worker *worker = new {{ cppFunctionName }}Worker(baton, callback); + Nan::Callback *callback = new Nan::Callback(v8::Local::Cast(info[info.Length() - 1])); + {{ cppFunctionName }}Worker *worker = new {{ cppFunctionName }}Worker(baton, callback, cleanupHandles); + {%each args|argsInfo as arg %} {%if not arg.isReturn %} {%if arg.isSelf %} - worker->SaveToPersistent("{{ arg.name }}", args.This()); + worker->Reference<{{ arg.cppClassName }}>("{{ arg.name }}", info.This()); {%elsif not arg.isCallbackFunction %} - if (!args[{{ arg.jsArg }}]->IsUndefined() && !args[{{ arg.jsArg }}]->IsNull()) - worker->SaveToPersistent("{{ arg.name }}", args[{{ arg.jsArg }}]->ToObject()); + {%if arg.isUnwrappable %} + {% if arg.cppClassName == "Array" %} + if (info[{{ arg.jsArg }}]->IsArray()) { + worker->Reference<{{ arg.arrayElementCppClassName }}>("{{ arg.name }}", info[{{ arg.jsArg }}].As()); + } + {% else %} + worker->Reference<{{ arg.cppClassName }}>("{{ arg.name }}", info[{{ arg.jsArg }}]); + {% endif %} + {% else %} + worker->Reference("{{ arg.name }}", info[{{ arg.jsArg }}]); + {% endif %} {%endif%} {%endif%} {%endeach%} - NanAsyncQueueWorker(worker); - NanReturnUndefined(); + nodegitContext->QueueWorker(worker); + return; +} + +nodegit::LockMaster {{ cppClassName }}::{{ cppFunctionName }}Worker::AcquireLocks() { + nodegit::LockMaster lockMaster( + /*asyncAction: */true + {%each args|argsInfo as arg %} + {%if arg.cType|isPointer%} + {%if not arg.cType|isDoublePointer%} + ,baton->{{ arg.name }} + {%endif%} + {%endif%} + {%endeach%} + ); + + return lockMaster; } void {{ cppClassName }}::{{ cppFunctionName }}Worker::Execute() { + git_error_clear(); + {%if .|hasReturnType %} - {{ return.cType }} result = {{ cFunctionName }}( + {{ return.cType }} result = {{ cFunctionName }}( {%else%} - {{ cFunctionName }}( + {{ cFunctionName }}( {%endif%} {%-- Insert Function Arguments --%} {%each args|argsInfo as arg %} {%-- turn the pointer into a ref --%} - {%if arg.isReturn|and arg.cType|isDoublePointer %}&{%endif%}baton->{{ arg.name }}{%if not arg.lastArg %},{%endif%} - + {%if arg.isReturn|and arg.cType|isDoublePointer %}&{%endif%}baton->{{ arg.name }}{%if not arg.lastArg %},{%endif%} {%endeach%} - ); + ); + + {% if return.isResultOrError %} + baton->error_code = result; + if (result < GIT_OK && git_error_last()->klass != GIT_ERROR_NONE) { + baton->error = git_error_dup(git_error_last()); + } + + {% elsif return.isErrorCode %} + baton->error_code = result; - {%if return.isErrorCode %} - baton->error_code = result; + if (result != GIT_OK && git_error_last()->klass != GIT_ERROR_NONE) { + baton->error = git_error_dup(git_error_last()); + } + + {%elsif return.cType != 'void' %} + + baton->result = result; + + {%endif%} +} - if (result != GIT_OK && giterr_last() != NULL) { - baton->error = git_error_dup(giterr_last()); +void {{ cppClassName }}::{{ cppFunctionName }}Worker::HandleErrorCallback() { + if (!GetIsCancelled()) { + v8::Local err = Nan::To(Nan::Error(ErrorMessage())).ToLocalChecked(); + Nan::Set(err, Nan::New("errorFunction").ToLocalChecked(), Nan::New("{{ jsClassName }}.{{ jsFunctionName }}").ToLocalChecked()); + v8::Local argv[1] = { + err + }; + callback->Call(1, argv, async_resource); } - {%elsif not return.cType == 'void' %} + if (baton->error) { + if (baton->error->message) { + free((void *)baton->error->message); + } - baton->result = result; + free((void *)baton->error); + } - {%endif%} + {%each args|argsInfo as arg %} + {%if arg.shouldAlloc %} + {%if not arg.isCppClassStringOrArray %} + {%elsif arg | isOid %} + if (baton->{{ arg.name}}NeedsFree) { + baton->{{ arg.name}}NeedsFree = false; + free((void*)baton->{{ arg.name }}); + } + {%elsif arg.isCallbackFunction %} + {%if not arg.payload.globalPayload %} + delete baton->{{ arg.payload.name }}; + {%endif%} + {%elsif arg.globalPayload %} + delete ({{ cppFunctionName}}_globalPayload*)baton->{{ arg.name }}; + {%else%} + free((void*)baton->{{ arg.name }}); + {%endif%} + {%elsif arg.freeFunctionName|and arg.isReturn|and arg.selfFreeing %} + {{ arg.freeFunctionName }}(baton->{{ arg.name }}); + {%endif%} + {%endeach%} + + {%each args|argsInfo as arg %} + {%if arg.isCppClassStringOrArray %} + {%if arg.freeFunctionName %} + {%elsif not arg.isConst%} + free((void *)baton->{{ arg.name }}); + {%endif%} + {%elsif arg | isOid %} + if (baton->{{ arg.name}}NeedsFree) { + baton->{{ arg.name}}NeedsFree = false; + free((void *)baton->{{ arg.name }}); + } + {%elsif arg.isCallbackFunction %} + {%if not arg.payload.globalPayload %} + delete baton->{{ arg.payload.name }}; + {%endif%} + {%elsif arg.globalPayload %} + delete ({{ cppFunctionName}}_globalPayload*)baton->{{ arg.name }}; + {%endif%} + {%if arg.cppClassName == "GitBuf" %} + {%if cppFunctionName == "Set" %} + {%else%} + git_buf_dispose(baton->{{ arg.name }}); + free((void *)baton->{{ arg.name }}); + {%endif%} + {%endif%} + {%endeach%} + + delete baton; } void {{ cppClassName }}::{{ cppFunctionName }}Worker::HandleOKCallback() { - if (baton->error_code == GIT_OK) { - {%if not .|returnsCount %} - Handle result = NanUndefined(); - {%else%} - Handle to; + {%if return.isResultOrError %} + if (baton->error_code >= GIT_OK) { + {%else%} + if (baton->error_code == GIT_OK) { + {%endif%} + + {%if return.isResultOrError %} + v8::Local result = Nan::New(baton->error_code); + + {%elsif not .|returnsCount %} + v8::Local result = Nan::Undefined(); + {%else%} + v8::Local v8ConversionSlot; + {%if .|returnsCount > 1 %} + v8::Local result = Nan::New(); + {%endif%} + {%each .|returnsInfo 0 1 as _return %} + {%partial convertToV8 _return %} {%if .|returnsCount > 1 %} - Handle result = NanNew(); - {%endif%} - {%each .|returnsInfo 0 1 as _return %} - {%partial convertToV8 _return %} - {%if .|returnsCount > 1 %} - result->Set(NanNew("{{ _return.returnNameOrName }}"), to); - {%endif%} - {%endeach%} - {%if .|returnsCount == 1 %} - Handle result = to; + Nan::Set(result, Nan::New("{{ _return.returnNameOrName }}").ToLocalChecked(), v8ConversionSlot); {%endif%} + {%endeach%} + {%if .|returnsCount == 1 %} + v8::Local result = v8ConversionSlot; {%endif%} - Handle argv[2] = { - NanNull(), + {%endif%} + + {% each args|argsInfo as arg %} + {% if not arg.ignore %} + {% if arg.isStructType %} + {% if arg.preserveOnThis %} + { + {% if args|thisInfo 'isReturn' %} + auto objWrap = Nan::ObjectWrap::Unwrap<{{ args|thisInfo 'cppClassName' }}>(result.As()); + {% else %} + auto objWrap = Nan::ObjectWrap::Unwrap<{{ args|thisInfo 'cppClassName' }}>(GetFromPersistent("{{ args|thisInfo 'name' }}").As()); + {% endif %} + objWrap->SaveCleanupHandle(cleanupHandles["{{ arg.name }}"]); + } + {% endif %} + {% endif %} + {% endif %} + {% endeach %} + + v8::Local argv[2] = { + Nan::Null(), result }; - callback->Call(2, argv); + callback->Call(2, argv, async_resource); } else { if (baton->error) { - Handle argv[1] = { - NanError(baton->error->message) + v8::Local err; + if (baton->error->message) { + err = Nan::To(Nan::Error(baton->error->message)).ToLocalChecked(); + } else { + err = Nan::To(Nan::Error("Method {{ jsFunctionName }} has thrown an error.")).ToLocalChecked(); + } + Nan::Set(err, Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); + Nan::Set(err, Nan::New("errorFunction").ToLocalChecked(), Nan::New("{{ jsClassName }}.{{ jsFunctionName }}").ToLocalChecked()); + v8::Local argv[1] = { + err }; - callback->Call(1, argv); + callback->Call(1, argv, async_resource); if (baton->error->message) free((void *)baton->error->message); free((void *)baton->error); + } else if (baton->error_code < 0) { + bool callbackFired = false; + if (!callbackErrorHandle.IsEmpty()) { + v8::Local maybeError = Nan::New(callbackErrorHandle); + if (!maybeError->IsNull() && !maybeError->IsUndefined()) { + v8::Local argv[1] = { + maybeError + }; + callback->Call(1, argv, async_resource); + callbackFired = true; + } + } + + if (!callbackFired) { + v8::Local err = Nan::To(Nan::Error("Method {{ jsFunctionName }} has thrown an error.")).ToLocalChecked(); + Nan::Set(err, Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); + Nan::Set(err, Nan::New("errorFunction").ToLocalChecked(), Nan::New("{{ jsClassName }}.{{ jsFunctionName }}").ToLocalChecked()); + v8::Local argv[1] = { + err + }; + callback->Call(1, argv, async_resource); + } } else { - callback->Call(0, NULL); + callback->Call(0, NULL, async_resource); } {%each args|argsInfo as arg %} {%if arg.shouldAlloc %} {%if not arg.isCppClassStringOrArray %} {%elsif arg | isOid %} - if (baton->{{ arg.name}}NeedsFree) { - baton->{{ arg.name}}NeedsFree = false; - free((void*)baton->{{ arg.name }}); - } + if (baton->{{ arg.name}}NeedsFree) { + baton->{{ arg.name}}NeedsFree = false; + free((void*)baton->{{ arg.name }}); + } {%elsif arg.isCallbackFunction %} {%if not arg.payload.globalPayload %} - delete baton->{{ arg.payload.name }}; + delete baton->{{ arg.payload.name }}; {%endif%} {%elsif arg.globalPayload %} - delete ({{ cppFunctionName}}_globalPayload*)baton->{{ arg.name }}; + delete ({{ cppFunctionName}}_globalPayload*)baton->{{ arg.name }}; {%else%} - free((void*)baton->{{ arg.name }}); + free((void*)baton->{{ arg.name }}); {%endif%} + {%elsif arg.freeFunctionName|and arg.isReturn|and arg.selfFreeing %} + {{ arg.freeFunctionName }}(baton->{{ arg.name }}); {%endif%} {%endeach%} } @@ -168,25 +370,27 @@ void {{ cppClassName }}::{{ cppFunctionName }}Worker::HandleOKCallback() { {%each args|argsInfo as arg %} {%if arg.isCppClassStringOrArray %} {%if arg.freeFunctionName %} - {{ arg.freeFunctionName }}(baton->{{ arg.name }}); - {%else%} - free((void *)baton->{{ arg.name }}); + {%elsif not arg.isConst%} + free((void *)baton->{{ arg.name }}); {%endif%} {%elsif arg | isOid %} - if (baton->{{ arg.name}}NeedsFree) { - baton->{{ arg.name}}NeedsFree = false; - free((void *)baton->{{ arg.name }}); - } + if (baton->{{ arg.name}}NeedsFree) { + baton->{{ arg.name}}NeedsFree = false; + free((void *)baton->{{ arg.name }}); + } {%elsif arg.isCallbackFunction %} {%if not arg.payload.globalPayload %} - delete baton->{{ arg.payload.name }}; + delete baton->{{ arg.payload.name }}; {%endif%} {%elsif arg.globalPayload %} - delete ({{ cppFunctionName}}_globalPayload*)baton->{{ arg.name }}; + delete ({{ cppFunctionName}}_globalPayload*)baton->{{ arg.name }}; {%endif%} {%if arg.cppClassName == "GitBuf" %} - if (baton->{{ arg.name }}->ptr) free((void *)baton->{{ arg.name }}->ptr); - free((void *)baton->{{ arg.name }}); + {%if cppFunctionName == "Set" %} + {%else%} + git_buf_dispose(baton->{{ arg.name }}); + free((void *)baton->{{ arg.name }}); + {%endif%} {%endif%} {%endeach%} diff --git a/generate/templates/partials/callback_helpers.cc b/generate/templates/partials/callback_helpers.cc index 8c1d346513..5050350e41 100644 --- a/generate/templates/partials/callback_helpers.cc +++ b/generate/templates/partials/callback_helpers.cc @@ -6,85 +6,64 @@ {{ arg.cType }} {{ arg.name}}{% if not arg.lastArg %},{% endif %} {% endeach %} ) { - {{ cppFunctionName }}_{{ cbFunction.name|titleCase }}Baton* baton = new {{ cppFunctionName }}_{{ cbFunction.name|titleCase }}Baton(); + {{ cppFunctionName }}_{{ cbFunction.name|titleCase }}Baton baton({{ cbFunction.return.noResults }}); {% each cbFunction.args|argsInfo as arg %} - baton->{{ arg.name }} = {{ arg.name }}; + baton.{{ arg.name }} = {{ arg.name }}; {% endeach %} - baton->result = 0; - baton->req.data = baton; - baton->done = false; - - uv_async_init(uv_default_loop(), &baton->req, (uv_async_cb) {{ cppFunctionName }}_{{ cbFunction.name }}_async); - uv_async_send(&baton->req); - - while(!baton->done) { - this_thread::sleep_for(chrono::milliseconds(1)); - } - - {% each cbFunction|returnsInfo false true as _return %} - {% if _return.isOutParam %} - *{{ _return.name }} = *baton->{{ _return.name }}; - {% endif %} - {% endeach %} + return baton.ExecuteAsync({{ cppFunctionName }}_{{ cbFunction.name }}_async, {{ cppFunctionName }}_{{ cbFunction.name }}_cancelAsync); +} - return baton->result; +void {{ cppClassName }}::{{ cppFunctionName }}_{{ cbFunction.name }}_cancelAsync(void *untypedBaton) { + {{ cppFunctionName }}_{{ cbFunction.name|titleCase }}Baton* baton = static_cast<{{ cppFunctionName }}_{{ cbFunction.name|titleCase }}Baton*>(untypedBaton); + baton->result = {{ cbFunction.return.cancel }}; + baton->Done(); } -void {{ cppClassName }}::{{ cppFunctionName }}_{{ cbFunction.name }}_async(uv_async_t* req, int status) { - NanScope(); +void {{ cppClassName }}::{{ cppFunctionName }}_{{ cbFunction.name }}_async(void *untypedBaton) { + Nan::HandleScope scope; - {{ cppFunctionName }}_{{ cbFunction.name|titleCase }}Baton* baton = static_cast<{{ cppFunctionName }}_{{ cbFunction.name|titleCase }}Baton*>(req->data); + {{ cppFunctionName }}_{{ cbFunction.name|titleCase }}Baton* baton = static_cast<{{ cppFunctionName }}_{{ cbFunction.name|titleCase }}Baton*>(untypedBaton); {% each cbFunction.args|argsInfo as arg %} {% if arg | isPayload %} {% if cbFunction.payload.globalPayload %} - NanCallback* callback = (({{ cppFunctionName }}_globalPayload*)baton->{{ arg.name }})->{{ cbFunction.name }}; + Nan::Callback* callback = (({{ cppFunctionName }}_globalPayload*)baton->{{ arg.name }})->{{ cbFunction.name }}; {% else %} - NanCallback* callback = (NanCallback *)baton->{{ arg.name }}; + Nan::Callback* callback = (Nan::Callback *)baton->{{ arg.name }}; {% endif %} {% endif %} {% endeach %} - Local argv[{{ cbFunction.args|jsArgsCount }}] = { - {% each cbFunction.args|argsInfo as arg %} - {% if arg | isPayload %} - {%-- payload is always the last arg --%} - // payload is null because we can use closure scope in javascript - NanUndefined() - {% elsif arg.isJsArg %} - {% if arg.isEnum %} - NanNew((int)baton->{{ arg.name }}), - {% elsif arg.isLibgitType %} - NanNew({{ arg.cppClassName }}::New((void *)baton->{{ arg.name }}, false)), - {% elsif arg.cType == "size_t" %} - // HACK: NAN should really have an overload for NanNew to support size_t - NanNew((unsigned int)baton->{{ arg.name }}), - {% else %} - NanNew(baton->{{ arg.name }}), - {% endif %} + v8::Local argv[{{ cbFunction.args|callbackArgsCount }}] = { + {% each cbFunction.args|callbackArgsInfo as arg %} + {% if not arg.firstArg %}, {% endif %} + {% if arg.isEnum %} + Nan::New((int)baton->{{ arg.name }}) + {% elsif arg.isLibgitType %} + {{ arg.cppClassName }}::New(baton->{{ arg.name }}, false) + {% elsif arg.cType == "size_t" %} + // HACK: NAN should really have an overload for Nan::New to support size_t + Nan::New((unsigned int)baton->{{ arg.name }}) + {% elsif arg.cppClassName == 'String' %} + Nan::New(baton->{{ arg.name }}).ToLocalChecked() + {% else %} + Nan::New(baton->{{ arg.name }}) {% endif %} {% endeach %} }; - TryCatch tryCatch; - Handle result = callback->Call({{ cbFunction.args|jsArgsCount }}, argv); - - if (result->IsObject() && result->ToObject()->Has(NanNew("then"))) { - Handle thenProp = result->ToObject()->Get(NanNew("then")); + Nan::TryCatch tryCatch; + Nan::MaybeLocal maybeResult = (*callback)(baton->GetAsyncResource(), {{ cbFunction.args|callbackArgsCount }}, argv); - if (thenProp->IsFunction()) { - // we can be reasonbly certain that the result is a promise - Local promise = result->ToObject(); - - NanAssignPersistent(baton->promise, promise); + v8::Local result; + if (!maybeResult.IsEmpty()) { + result = maybeResult.ToLocalChecked(); + } - uv_close((uv_handle_t*) &baton->req, NULL); - uv_async_init(uv_default_loop(), &baton->req, (uv_async_cb) {{ cppFunctionName }}_{{ cbFunction.name }}_asyncPromisePolling); - uv_async_send(&baton->req); - return; - } + if(PromiseCompletion::ForwardIfPromise(result, baton, {{ cppFunctionName }}_{{ cbFunction.name }}_promiseCompleted)) { + return; } {% each cbFunction|returnsInfo false true as _return %} @@ -93,83 +72,70 @@ void {{ cppClassName }}::{{ cppFunctionName }}_{{ cbFunction.name }}_async(uv_as } else if (!result->IsNull() && !result->IsUndefined()) { {% if _return.isOutParam %} - {{ _return.cppClassName }}* wrapper = ObjectWrap::Unwrap<{{ _return.cppClassName }}>(result->ToObject()); + {{ _return.cppClassName }}* wrapper = Nan::ObjectWrap::Unwrap<{{ _return.cppClassName }}>(Nan::To(result).ToLocalChecked()); wrapper->selfFreeing = false; - baton->{{ _return.name }} = wrapper->GetRefValue(); + *baton->{{ _return.name }} = wrapper->GetValue(); baton->result = {{ cbFunction.return.success }}; {% else %} if (result->IsNumber()) { - baton->result = (int)result->ToNumber()->Value(); + baton->result = Nan::To(result).FromJust(); } else { - baton->result = {{ cbFunction.return.noResults }}; + baton->result = baton->defaultResult; } {% endif %} } else { - baton->result = {{ cbFunction.return.noResults }}; + baton->result = baton->defaultResult; } {% endeach %} - baton->done = true; - uv_close((uv_handle_t*) &baton->req, NULL); + baton->Done(); } -void {{ cppClassName }}::{{ cppFunctionName }}_{{ cbFunction.name }}_asyncPromisePolling(uv_async_t* req, int status) { - NanScope(); +void {{ cppClassName }}::{{ cppFunctionName }}_{{ cbFunction.name }}_promiseCompleted(bool isFulfilled, nodegit::AsyncBaton *_baton, v8::Local result) { + Nan::HandleScope scope; - {{ cppFunctionName }}_{{ cbFunction.name|titleCase }}Baton* baton = static_cast<{{ cppFunctionName }}_{{ cbFunction.name|titleCase }}Baton*>(req->data); - Local promise = NanNew(baton->promise); - NanCallback* isPendingFn = new NanCallback(promise->Get(NanNew("isPending")).As()); - Local argv[1]; // MSBUILD won't assign an array of length 0 - Local isPending = isPendingFn->Call(promise, 0, argv)->ToBoolean(); - - if (isPending->Value()) { - uv_async_send(&baton->req); - return; - } - - NanCallback* isFulfilledFn = new NanCallback(promise->Get(NanNew("isFulfilled")).As()); - Local isFulfilled = isFulfilledFn->Call(promise, 0, argv)->ToBoolean(); - - if (isFulfilled->Value()) { - NanCallback* resultFn = new NanCallback(promise->Get(NanNew("value")).As()); - Handle result = resultFn->Call(promise, 0, argv); + {{ cppFunctionName }}_{{ cbFunction.name|titleCase }}Baton* baton = static_cast<{{ cppFunctionName }}_{{ cbFunction.name|titleCase }}Baton*>(_baton); + if (isFulfilled) { {% each cbFunction|returnsInfo false true as _return %} if (result.IsEmpty() || result->IsNativeError()) { baton->result = {{ cbFunction.return.error }}; } else if (!result->IsNull() && !result->IsUndefined()) { {% if _return.isOutParam %} - {{ _return.cppClassName }}* wrapper = ObjectWrap::Unwrap<{{ _return.cppClassName }}>(result->ToObject()); + {{ _return.cppClassName }}* wrapper = Nan::ObjectWrap::Unwrap<{{ _return.cppClassName }}>(Nan::To(result).ToLocalChecked()); wrapper->selfFreeing = false; - baton->{{ _return.name }} = wrapper->GetRefValue(); + *baton->{{ _return.name }} = wrapper->GetValue(); baton->result = {{ cbFunction.return.success }}; {% else %} if (result->IsNumber()) { - baton->result = (int)result->ToNumber()->Value(); + baton->result = Nan::To(result).FromJust(); } else { - baton->result = {{ cbFunction.return.noResults }}; + baton->result = baton->defaultResult; } {% endif %} } else { - baton->result = {{ cbFunction.return.noResults }}; + baton->result = baton->defaultResult; } {% endeach %} - baton->done = true; } else { // promise was rejected + {{ cppClassName }}* instance = static_cast<{{ cppClassName }}*>(baton->{% each cbFunction.args|argsInfo as arg %} + {% if arg.payload == true %}{{arg.name}}{% elsif arg.lastArg %}{{arg.name}}{% endif %} + {% endeach %}); + v8::Local parent = instance->handle(); + SetPrivate(parent, Nan::New("NodeGitPromiseError").ToLocalChecked(), result); + baton->result = {{ cbFunction.return.error }}; - baton->done = false; } - - uv_close((uv_handle_t*) &baton->req, NULL); + baton->Done(); } {%endif%} {%endeach%} diff --git a/generate/templates/partials/configurable_callbacks.cc b/generate/templates/partials/configurable_callbacks.cc new file mode 100644 index 0000000000..79eef554b8 --- /dev/null +++ b/generate/templates/partials/configurable_callbacks.cc @@ -0,0 +1,227 @@ +{% each fields|fieldsInfo as field %} + {% if not field.ignore %} + {% if field.isCallbackFunction %} + Configurable{{ cppClassName }}* Configurable{{ cppClassName }}::{{ field.jsFunctionName }}_getInstanceFromBaton({{ field.name|titleCase }}Baton* baton) { + {% if isExtendedStruct %} + return static_cast((({{cType}}_extended *)baton->self)->payload); + {% else %} + return static_cast(baton-> + {% each field.args|argsInfo as arg %} + {% if arg.payload == true %} + {{arg.name}} + {% elsif arg.lastArg %} + {{arg.name}} + {% endif %} + {% endeach %}); + {% endif %} + } + + {{ field.return.type }} Configurable{{ cppClassName }}::{{ field.jsFunctionName }}_cppCallback ( + {% each field.args|argsInfo as arg %} + {{ arg.cType }} {{ arg.name}}{% if not arg.lastArg %},{% endif %} + {% endeach %} + ) { + {{ field.name|titleCase }}Baton *baton = + new {{ field.name|titleCase }}Baton({{ field.return.noResults }}); + + {% each field.args|argsInfo as arg %} + baton->{{ arg.name }} = {{ arg.name }}; + {% endeach %} + + Configurable{{ cppClassName }}* instance = {{ field.jsFunctionName }}_getInstanceFromBaton(baton); + + {% if field.return.type == "void" %} + if (instance->nodegitContext != nodegit::ThreadPool::GetCurrentContext()) { + delete baton; + } else if (instance->{{ field.jsFunctionName }}.WillBeThrottled()) { + delete baton; + } else if (instance->{{ field.jsFunctionName }}.ShouldWaitForResult()) { + baton->ExecuteAsync({{ field.jsFunctionName }}_async, {{ field.jsFunctionName }}_cancelAsync); + delete baton; + } else { + baton->ExecuteAsync({{ field.jsFunctionName }}_async, {{ field.jsFunctionName }}_cancelAsync, nodegit::deleteBaton); + } + return; + {% else %} + {{ field.return.type }} result; + + if (instance->nodegitContext != nodegit::ThreadPool::GetCurrentContext()) { + result = baton->defaultResult; + delete baton; + } else if (instance->{{ field.jsFunctionName }}.WillBeThrottled()) { + result = baton->defaultResult; + delete baton; + } else if (instance->{{ field.jsFunctionName }}.ShouldWaitForResult()) { + result = baton->ExecuteAsync({{ field.jsFunctionName }}_async, {{ field.jsFunctionName }}_cancelAsync); + delete baton; + } else { + result = baton->defaultResult; + baton->ExecuteAsync({{ field.jsFunctionName }}_async, {{ field.jsFunctionName }}_cancelAsync, nodegit::deleteBaton); + } + return result; + {% endif %} + } + + void Configurable{{ cppClassName }}::{{ field.jsFunctionName }}_cancelAsync(void *untypedBaton) { + {{ field.name|titleCase }}Baton* baton = static_cast<{{ field.name|titleCase }}Baton*>(untypedBaton); + {% if field.return.type != "void" %} + baton->result = {{ field.return.cancel }}; + {% endif %} + baton->Done(); + } + + void Configurable{{ cppClassName }}::{{ field.jsFunctionName }}_async(void *untypedBaton) { + Nan::HandleScope scope; + + {{ field.name|titleCase }}Baton* baton = static_cast<{{ field.name|titleCase }}Baton*>(untypedBaton); + Configurable{{ cppClassName }}* instance = {{ field.jsFunctionName }}_getInstanceFromBaton(baton); + + if (instance->{{ field.jsFunctionName }}.GetCallback()->IsEmpty()) { + {% if field.return.type == "int" %} + baton->result = baton->defaultResult; // no results acquired + {% endif %} + baton->Done(); + return; + } + + {% each field.args|callbackArgsInfo as arg %} + {% if arg.cppClassName == "Array" %} + v8::Local _{{arg.name}}_array = Nan::New(baton->{{ arg.arrayLengthArgumentName }}); + for(uint32_t i = 0; i < _{{arg.name}}_array->Length(); i++) { + Nan::Set(_{{arg.name}}_array, i, {{arg.arrayElementCppClassName}}::New(baton->{{arg.name}}[i], false)); + } + {% endif %} + {% endeach %} + + {% if field.args|callbackArgsCount == 0 %} + v8::Local *argv = NULL; + {% else %} + v8::Local argv[{{ field.args|callbackArgsCount }}] = { + {% each field.args|callbackArgsInfo as arg %} + {% if not arg.firstArg %},{% endif %} + {% if arg.isEnum %} + Nan::New((int)baton->{{ arg.name }}) + {% elsif arg.cppClassName == "Array" %} + _{{arg.name}}_array + {% elsif arg.isLibgitType %} + {{ arg.cppClassName }}::New(baton->{{ arg.name }}, false) + {% elsif arg.cType == "size_t" %} + // HACK: NAN should really have an overload for Nan::New to support size_t + Nan::New((unsigned int)baton->{{ arg.name }}) + {% elsif arg.cppClassName == "String" %} + baton->{{ arg.name }} == NULL + ? Nan::EmptyString() + : Nan::New({%if arg.cType | isDoublePointer %}*{% endif %}baton->{{ arg.name }}).ToLocalChecked() + {% else %} + Nan::New(baton->{{ arg.name }}) + {% endif %} + {% endeach %} + }; + {% endif %} + + Nan::TryCatch tryCatch; + + Nan::MaybeLocal maybeResult = (*(instance->{{ field.jsFunctionName }}.GetCallback()))( + baton->GetAsyncResource(), + {{ field.args|callbackArgsCount }}, + argv + ); + v8::Local result; + if (!maybeResult.IsEmpty()) { + result = maybeResult.ToLocalChecked(); + } + + if (PromiseCompletion::ForwardIfPromise(result, baton, Configurable{{ cppClassName }}::{{ field.jsFunctionName }}_promiseCompleted)) { + return; + } + + {% if field.return.type == "void" %} + baton->Done(); + {% else %} + {% each field|returnsInfo false true as _return %} + if (result.IsEmpty() || result->IsNativeError()) { + baton->result = {{ field.return.error }}; + } + else if (!result->IsNull() && !result->IsUndefined()) { + {% if _return.isOutParam %} + {{ _return.cppClassName }}* wrapper = Nan::ObjectWrap::Unwrap<{{ _return.cppClassName }}>(Nan::To(result).ToLocalChecked()); + wrapper->selfFreeing = false; + + {% if _return.cppClassName == "GitOid" %} + git_oid_cpy(baton->{{ _return.name }}, wrapper->GetValue()); + {% else %} + *baton->{{ _return.name }} = wrapper->GetValue(); + {% endif %} + baton->result = {{ field.return.success }}; + {% else %} + if (result->IsNumber()) { + baton->result = Nan::To(result).FromJust(); + } + else { + baton->result = baton->defaultResult; + } + {% endif %} + } + else { + baton->result = baton->defaultResult; + } + {% endeach %} + baton->Done(); + {% endif %} + } + + void Configurable{{ cppClassName }}::{{ field.jsFunctionName }}_promiseCompleted(bool isFulfilled, nodegit::AsyncBaton *_baton, v8::Local result) { + Nan::HandleScope scope; + + {{ field.name|titleCase }}Baton* baton = static_cast<{{ field.name|titleCase }}Baton*>(_baton); + {% if field.return.type == "void" %} + baton->Done(); + {% else %} + if (isFulfilled) { + {% each field|returnsInfo false true as _return %} + if (result.IsEmpty() || result->IsNativeError()) { + baton->result = {{ field.return.error }}; + } + else if (!result->IsNull() && !result->IsUndefined()) { + {% if _return.isOutParam %} + {{ _return.cppClassName }}* wrapper = Nan::ObjectWrap::Unwrap<{{ _return.cppClassName }}>(Nan::To(result).ToLocalChecked()); + wrapper->selfFreeing = false; + + {% if _return.cppClassName == "GitOid" %} + git_oid_cpy(baton->{{ _return.name }}, wrapper->GetValue()); + {% else %} + *baton->{{ _return.name }} = wrapper->GetValue(); + {% endif %} + baton->result = {{ field.return.success }}; + {% else %} + if (result->IsNumber()) { + baton->result = Nan::To(result).FromJust(); + } + else { + baton->result = baton->defaultResult; + } + {% endif %} + } + else { + baton->result = baton->defaultResult; + } + {% endeach %} + } + else { + // promise was rejected + {% if isExtendedStruct %} + Configurable{{ cppClassName }}* instance = static_cast((({{cType}}_extended *)baton->self)->payload); + {% else %} + Configurable{{ cppClassName }}* instance = static_cast(baton->{% each field.args|argsInfo as arg %} + {% if arg.payload == true %}{{arg.name}}{% elsif arg.lastArg %}{{arg.name}}{% endif %} + {% endeach %}); + {% endif %} + baton->SetCallbackError(result); + baton->result = {{ field.return.error }}; + } + baton->Done(); + {% endif %} + } + {% endif %} + {% endif %} +{% endeach %} diff --git a/generate/templates/partials/convert_from_v8.cc b/generate/templates/partials/convert_from_v8.cc index 3d71b63399..f33eddd0f6 100644 --- a/generate/templates/partials/convert_from_v8.cc +++ b/generate/templates/partials/convert_from_v8.cc @@ -1,6 +1,12 @@ {%if not isPayload %} // start convert_from_v8 block + {%if cType|isPointer %} + {{ cType }} from_{{ name }} = NULL; + {%elsif cType|isDoublePointer %} + {{ cType }} from_{{ name }} = NULL; + {%else%} {{ cType }} from_{{ name }}; + {%endif%} {%if isOptional | or isBoolean %} {%if cppClassName == 'GitStrarray'%} @@ -8,57 +14,86 @@ {% elsif cppClassName == 'GitBuf' %} {%-- Print nothing --%} {%else%} - if (args[{{ jsArg }}]->Is{{ cppClassName|cppToV8 }}()) { + if ((info.Length() - 1) > {{ jsArg }} && info[{{ jsArg }}]->Is{{ cppClassName|cppToV8 }}()) { {%endif%} {%endif%} {%if cppClassName == 'String'%} - String::Utf8Value {{ name }}(args[{{ jsArg }}]->ToString()); - from_{{ name }} = ({{ cType }}) strdup(*{{ name }}); + Nan::Utf8String {{ name }}(Nan::To(info[{{ jsArg }}]).ToLocalChecked()); + // malloc with one extra byte so we can add the terminating null character C-strings expect: + from_{{ name }} = ({{ cType }}) malloc({{ name }}.length() + 1); + // copy the characters from the nodejs string into our C-string (used instead of strdup or strcpy because nulls in + // the middle of strings are valid coming from nodejs): + memcpy((void *)from_{{ name }}, *{{ name }}, {{ name }}.length()); + // ensure the final byte of our new string is null, extra casts added to ensure compatibility with various C types + // used in the nodejs binding generation: + memset((void *)(((char *)from_{{ name }}) + {{ name }}.length()), 0, 1); {%elsif cppClassName == 'GitStrarray' %} - from_{{ name }} = StrArrayConverter::Convert(args[{{ jsArg }}]); + from_{{ name }} = StrArrayConverter::Convert(info[{{ jsArg }}]); {%elsif cppClassName == 'GitBuf' %} - from_{{ name }} = GitBufConverter::Convert(args[{{ jsArg }}]); + from_{{ name }} = GitBufConverter::Convert(info[{{ jsArg }}]); {%elsif cppClassName == 'Wrapper'%} - String::Utf8Value {{ name }}(args[{{ jsArg }}]->ToString()); - from_{{ name }} = ({{ cType }}) strdup(*{{ name }}); + Nan::Utf8String {{ name }}(Nan::To(info[{{ jsArg }}]).ToLocalChecked()); + // malloc with one extra byte so we can add the terminating null character C-strings expect: + from_{{ name }} = ({{ cType }}) malloc({{ name }}.length() + 1); + // copy the characters from the nodejs string into our C-string (used instead of strdup or strcpy because nulls in + // the middle of strings are valid coming from nodejs): + memcpy((void *)from_{{ name }}, *{{ name }}, {{ name }}.length()); + // ensure the final byte of our new string is null, extra casts added to ensure compatibility with various C types + // used in the nodejs binding generation: + memset((void *)(((char *)from_{{ name }}) + {{ name }}.length()), 0, 1); {%elsif cppClassName == 'Array'%} - Array *tmp_{{ name }} = Array::Cast(*args[{{ jsArg }}]); - from_{{ name }} = ({{ cType }})malloc(tmp_{{ name }}->Length() * sizeof({{ cType|replace '**' '*' }})); - for (unsigned int i = 0; i < tmp_{{ name }}->Length(); i++) { + v8::Local tmp_{{ name }} = v8::Local::Cast(info[{{ jsArg }}]); + from_{{ name }} = ({{ cType }})malloc(tmp_{{ name }}->Length() * sizeof({{ cType|unPointer }})); + for (unsigned int i = 0; i < tmp_{{ name }}->Length(); i++) { {%-- // FIXME: should recursively call convertFromv8. --%} - from_{{ name }}[i] = ObjectWrap::Unwrap<{{ arrayElementCppClassName }}>(tmp_{{ name }}->Get(NanNew(static_cast(i)))->ToObject())->GetValue(); + const v8::Local arrayVal = Nan::Get(tmp_{{ name }},i).ToLocalChecked(); + {%if arrayElementCppClassName == 'GitOid'%} + if (arrayVal->IsString()) { + // Try and parse in a string to a git_oid + Nan::Utf8String oidString(Nan::To(arrayVal).ToLocalChecked()); + + if (git_oid_fromstr(&from_{{ name }}[i], (const char *) strdup(*oidString)) != GIT_OK) { + return Nan::ThrowError(git_error_last()->message); + } + } + else { + git_oid_cpy(&from_{{ name }}[i], Nan::ObjectWrap::Unwrap(Nan::To(arrayVal).ToLocalChecked())->GetValue()); } + {%else%} + from_{{ name }}[i] = Nan::ObjectWrap::Unwrap<{{ arrayElementCppClassName }}>(Nan::To(arrayVal).ToLocalChecked())->GetValue(); + {%endif%} + } {%elsif cppClassName == 'Function'%} {%elsif cppClassName == 'Buffer'%} - from_{{ name }} = Buffer::Data(args[{{ jsArg }}]->ToObject()); + from_{{ name }} = Buffer::Data(Nan::To(info[{{ jsArg }}]).ToLocalChecked()); {%elsif cppClassName|isV8Value %} {%if cType|isPointer %} - *from_{{ name }} = ({{ cType|unPointer }}) {{ cast }} {%if isEnum %}(int){%endif%} args[{{ jsArg }}]->To{{ cppClassName }}()->Value(); + *from_{{ name }} = ({{ cType|unPointer }}) {{ cast }} {%if isEnum %}(int){%endif%} info[{{ jsArg }}].As()->Value(); {%else%} - from_{{ name }} = ({{ cType }}) {{ cast }} {%if isEnum %}(int){%endif%} args[{{ jsArg }}]->To{{ cppClassName }}()->Value(); + from_{{ name }} = ({{ cType }}) {{ cast }} {%if isEnum %}(int){%endif%} info[{{ jsArg }}].As()->Value(); {%endif%} {%elsif cppClassName == 'GitOid'%} - if (args[{{ jsArg }}]->IsString()) { + if (info[{{ jsArg }}]->IsString()) { // Try and parse in a string to a git_oid - String::Utf8Value oidString(args[{{ jsArg }}]->ToString()); + Nan::Utf8String oidString(Nan::To(info[{{ jsArg }}]).ToLocalChecked()); git_oid *oidOut = (git_oid *)malloc(sizeof(git_oid)); if (git_oid_fromstr(oidOut, (const char *) strdup(*oidString)) != GIT_OK) { free(oidOut); - if (giterr_last()) { - return NanThrowError(giterr_last()->message); + if (git_error_last()->klass != GIT_ERROR_NONE) { + return Nan::ThrowError(git_error_last()->message); } else { - return NanThrowError("Unknown Error"); + return Nan::ThrowError("Unknown Error"); } } @@ -69,24 +104,16 @@ {%endif%} } else { - {%if cType|isDoublePointer %} - from_{{ name }} = ObjectWrap::Unwrap<{{ cppClassName }}>(args[{{ jsArg }}]->ToObject())->GetRefValue(); - {%else%} - from_{{ name }} = ObjectWrap::Unwrap<{{ cppClassName }}>(args[{{ jsArg }}]->ToObject())->GetValue(); - {%endif%} + {%if cType|isDoublePointer %}*{%endif%}from_{{ name }} = Nan::ObjectWrap::Unwrap<{{ cppClassName }}>(Nan::To(info[{{ jsArg }}]).ToLocalChecked())->GetValue(); } {%else%} - {%if cType|isDoublePointer %} - from_{{ name }} = ObjectWrap::Unwrap<{{ cppClassName }}>(args[{{ jsArg }}]->ToObject())->GetRefValue(); - {%else%} - from_{{ name }} = ObjectWrap::Unwrap<{{ cppClassName }}>(args[{{ jsArg }}]->ToObject())->GetValue(); - {%endif%} + {%if cType|isDoublePointer %}*{%endif%}from_{{ name }} = Nan::ObjectWrap::Unwrap<{{ cppClassName }}>(Nan::To(info[{{ jsArg }}]).ToLocalChecked())->GetValue(); {%endif%} {%if isBoolean %} } else { - from_{{ name }} = args[{{ jsArg }}]->IsTrue() ? 1 : 0; + from_{{ name }} = info[{{ jsArg }}]->IsTrue() ? 1 : 0; } {%elsif isOptional %} {%if cppClassName != 'GitStrarray'%} diff --git a/generate/templates/partials/convert_to_v8.cc b/generate/templates/partials/convert_to_v8.cc index 4d7b848f02..ccba9b330f 100644 --- a/generate/templates/partials/convert_to_v8.cc +++ b/generate/templates/partials/convert_to_v8.cc @@ -2,15 +2,18 @@ {% if cppClassName == 'String' %} if ({{= parsedName =}}){ {% if size %} - to = NanNew({{= parsedName =}}, {{ size }}); + v8ConversionSlot = Nan::New({{= parsedName =}}, {{ size }}).ToLocalChecked(); {% elsif cType == 'char **' %} - to = NanNew(*{{= parsedName =}}); + v8ConversionSlot = Nan::New(*{{= parsedName =}}).ToLocalChecked(); + {% elsif cType == 'char' %} + char convertToNullTerminated[2] = { {{= parsedName =}}, '\0' }; + v8ConversionSlot = Nan::New(convertToNullTerminated).ToLocalChecked(); {% else %} - to = NanNew({{= parsedName =}}); + v8ConversionSlot = Nan::New({{= parsedName =}}).ToLocalChecked(); {% endif %} } else { - to = NanNull(); + v8ConversionSlot = Nan::Null(); } {% if freeFunctionName %} @@ -18,55 +21,119 @@ {% endif %} {% elsif cppClassName|isV8Value %} - - {% if isCppClassIntType %} - to = NanNew<{{ cppClassName }}>(({{ parsedClassName }}){{= parsedName =}}); + {% if cType|isArrayType %} + v8::Local tmpArray = Nan::New({{ cType|toSizeOfArray }}); + for (unsigned int i = 0; i < {{ cType|toSizeOfArray }}; i++) { + v8::Local element; + {% if isCppClassIntType %} + element = Nan::New<{{ cppClassName }}>(({{ parsedClassName }}){{= parsedName =}}[i]); + {% else %} + element = Nan::New<{{ cppClassName }}>({% if needsDereference %}*{% endif %}{{= parsedName =}}[i]); + {% endif %} + Nan::Set(tmpArray, Nan::New(i), element); + } + v8ConversionSlot = tmpArray; + {% elsif isCppClassIntType %} + v8ConversionSlot = Nan::New<{{ cppClassName }}>(({{ parsedClassName }}){{= parsedName =}}); {% else %} - to = NanNew<{{ cppClassName }}>({% if needsDereference %}*{% endif %}{{= parsedName =}}); + v8ConversionSlot = Nan::New<{{ cppClassName }}>({% if needsDereference %}*{% endif %}{{= parsedName =}}); {% endif %} {% elsif cppClassName == 'External' %} - to = NanNew((void *){{= parsedName =}}); + v8ConversionSlot = Nan::New((void *){{= parsedName =}}); {% elsif cppClassName == 'Array' %} {%-- // FIXME this is not general purpose enough. --%} {% if size %} - Local tmpArray = NanNew({{= parsedName =}}->{{ size }}); + v8::Local tmpArray = Nan::New({{= parsedName =}}->{{ size }}); for (unsigned int i = 0; i < {{= parsedName =}}->{{ size }}; i++) { - tmpArray->Set(NanNew(i), NanNew({{= parsedName =}}->{{ key }}[i])); + v8::Local element; + {% if arrayElementCppClassName %} + element = {{ arrayElementCppClassName }}::New( + {{ cType|asElementPointer parsedName }}->{{ key }}[i], + {{ selfFreeing|toBool }} + {% if hasOwner %} + , owners + {% endif %} + ); + {% else %} + element = Nan::New({{= parsedName =}}->{{ key }}[i]).ToLocalChecked(); + {% endif %} + Nan::Set(tmpArray, Nan::New(i), element); } {% else %} - Local tmpArray = NanNew({{= parsedName =}}); + v8::Local tmpArray = Nan::New({{= parsedName =}}); {% endif %} - to = tmpArray; + v8ConversionSlot = tmpArray; {% elsif cppClassName == 'GitBuf' %} + {% if doNotConvert %} + v8ConversionSlot = Nan::Null(); + {% else %} if ({{= parsedName =}}) { - to = NanNew({{= parsedName =}}->ptr, {{= parsedName = }}->size); + v8ConversionSlot = Nan::New({{= parsedName =}}->ptr, {{= parsedName = }}->size).ToLocalChecked(); } else { - to = NanNull(); + v8ConversionSlot = Nan::Null(); } + {% endif %} {% else %} - {% if copy %} - if ({{= parsedName =}} != NULL) { - {{= parsedName =}} = ({{ cType|replace '**' '*' }} {% if not cType|isPointer %}*{% endif %}){{ copy }}({{= parsedName =}}); - } + {% if cType|isArrayType %} + v8::Local tmpArray = Nan::New({{ cType|toSizeOfArray }}); + for (unsigned int i = 0; i < {{ cType|toSizeOfArray }}; i++) { {% endif %} - - if ({{= parsedName =}} != NULL) { - // {{= cppClassName }} {{= parsedName }} + if ({{ cType|asElementPointer parsedName }} != NULL) { + {% if hasOwner %} + v8::Local owners = Nan::New(0); + {% if ownedBy %} + {% if isAsync %} + {% each ownedBy as owner %} + {%-- If the owner of this object is "this" in an async method, it will be stored in the persistent handle by name. --%} + Nan::Set(owners, Nan::New(owners->Length()), Nan::To(this->GetFromPersistent("{{= owner =}}")).ToLocalChecked()); + {% endeach %} + {% else %} + {% each ownedByIndices as ownedByIndex %} + Nan::Set(owners, Nan::New(owners->Length()), Nan::To(info[{{= ownedByIndex =}}]).ToLocalChecked()); + {% endeach %} + {% endif %} + {% endif %} + {%if isAsync %} + {% elsif ownedByThis %} + {%-- If the owner of this object is "this", it will be retrievable from the info object in a sync method. --%} + Nan::Set(owners, owners->Length(), info.This()); + {% endif %} + {% if ownerFn | toBool %} + Nan::Set( + owners, + Nan::New(owners->Length()), + Nan::To({{= ownerFn.singletonCppClassName =}}::New( + {{= ownerFn.name =}}({{ cType|asElementPointer parsedName }}), + true + )).ToLocalChecked() + ); + {% endif %} + {% endif %} {% if cppClassName == 'Wrapper' %} - to = {{ cppClassName }}::New((void *){{= parsedName =}}); + v8ConversionSlot = {{ cppClassName }}::New({{ cType|asElementPointer parsedName }}); {% else %} - to = {{ cppClassName }}::New((void *){{= parsedName =}}, false); + v8ConversionSlot = {{ cppClassName }}::New( + {{ cType|asElementPointer parsedName }}, + {{ selfFreeing|toBool }} + {% if hasOwner %} + , owners + {% endif %} + ); {% endif %} } else { - to = NanNull(); + v8ConversionSlot = Nan::Null(); } - + {% if cType|isArrayType %} + Nan::Set(tmpArray, Nan::New(i), v8ConversionSlot); + } + v8ConversionSlot = tmpArray; + {% endif %} {% endif %} // end convert_to_v8 block diff --git a/generate/templates/partials/field_accessors.cc b/generate/templates/partials/field_accessors.cc index 9426ea07bd..bcd5e5f870 100644 --- a/generate/templates/partials/field_accessors.cc +++ b/generate/templates/partials/field_accessors.cc @@ -1,71 +1,63 @@ {% each fields|fieldsInfo as field %} {% if not field.ignore %} NAN_GETTER({{ cppClassName }}::Get{{ field.cppFunctionName }}) { - NanScope(); - {{ cppClassName }} *wrapper = ObjectWrap::Unwrap<{{ cppClassName }}>(args.This()); + {{ cppClassName }} *wrapper = Nan::ObjectWrap::Unwrap<{{ cppClassName }}>(info.This()); {% if field.isEnum %} - NanReturnValue(NanNew((int)wrapper->GetValue()->{{ field.name }})); + info.GetReturnValue().Set(Nan::New((int)wrapper->GetValue()->{{ field.name }})); - {% elsif field.isLibgitType | or field.payloadFor %} - NanReturnValue(NanNew(wrapper->{{ field.name }})); - - {% elsif field.isCallbackFunction %} - NanReturnValue(wrapper->{{ field.name }}->GetFunction()); + {% elsif field.isLibgitType %} + info.GetReturnValue().Set(Nan::New(wrapper->{{ field.name }})); {% elsif field.cppClassName == 'String' %} if (wrapper->GetValue()->{{ field.name }}) { - NanReturnValue(NanNew(wrapper->GetValue()->{{ field.name }})); + info.GetReturnValue().Set(Nan::New(wrapper->GetValue()->{{ field.name }}).ToLocalChecked()); } else { - NanReturnUndefined(); + return; } {% elsif field.cppClassName|isV8Value %} - NanReturnValue(NanNew<{{ field.cppClassName }}>(wrapper->GetValue()->{{ field.name }})); + info.GetReturnValue().Set(Nan::New<{{ field.cppClassName }}>(wrapper->GetValue()->{{ field.name }})); {% endif %} } NAN_SETTER({{ cppClassName }}::Set{{ field.cppFunctionName }}) { - NanScope(); - - {{ cppClassName }} *wrapper = ObjectWrap::Unwrap<{{ cppClassName }}>(args.This()); + {{ cppClassName }} *wrapper = Nan::ObjectWrap::Unwrap<{{ cppClassName }}>(info.This()); {% if field.isEnum %} if (value->IsNumber()) { - wrapper->GetValue()->{{ field.name }} = ({{ field.cType }}) value->Int32Value(); + wrapper->GetValue()->{{ field.name }} = ({{ field.cType }}) Nan::To(value).FromJust(); } {% elsif field.isLibgitType %} - Handle {{ field.name }}(value->ToObject()); - NanDisposePersistent(wrapper->{{ field.name }}); - - NanAssignPersistent(wrapper->{{ field.name }}, {{ field.name }}); - - wrapper->raw->{{ field.name }} = {% if not field.cType | isPointer %}*{% endif %}{% if field.cppClassName == 'GitStrarray' %}StrArrayConverter::Convert({{ field.name }}->ToObject()){% else %}ObjectWrap::Unwrap<{{ field.cppClassName }}>({{ field.name }}->ToObject())->GetValue(){% endif %}; - - {% elsif field.isCallbackFunction %} - if (wrapper->{{ field.name }} != NULL) { - delete wrapper->{{ field.name }}; - } - - if (value->IsFunction()) { - if (!wrapper->raw->{{ field.name }}) { - wrapper->raw->{{ field.name }} = ({{ field.cType }}){{ field.name }}_cppCallback; - } - - wrapper->{{ field.name }} = new NanCallback(value.As()); - } - - {% elsif field.payloadFor %} - NanAssignPersistent(wrapper->{{ field.name }}, value); + v8::Local {{ field.name }}(Nan::To(value).ToLocalChecked()); + + wrapper->{{ field.name }}.Reset({{ field.name }}); + + {% if field.cppClassName == 'GitStrarray' %} + wrapper->raw->{{ field.name }} = {% if not field.cType | isPointer %}*{% endif %}StrArrayConverter::Convert({{ field.name }}); + {% else %} + auto wrappedObject = Nan::ObjectWrap::Unwrap<{{ field.cppClassName }}>({{ field.name }}); + wrapper->raw->{{ field.name }} = {% if not field.cType | isPointer %}*{% endif %}wrappedObject->GetValue(); + {%-- We are assuming that users are responsible enough to not replace fields on their structs mid-operation, and would rather build out code to prevent that than be smarter here --%} + wrapper->AddReferenceCallbacks( + {{ field.index }}, + [wrappedObject]() { + wrappedObject->Reference(); + }, + [wrappedObject]() { + wrappedObject->Unreference(); + } + ); + {% endif %} {% elsif field.cppClassName == 'String' %} if (wrapper->GetValue()->{{ field.name }}) { } - String::Utf8Value str(value); + Nan::Utf8String str(value); wrapper->GetValue()->{{ field.name }} = strdup(*str); {% elsif field.isCppClassIntType %} @@ -75,194 +67,9 @@ {% else %} if (value->IsNumber()) { - wrapper->GetValue()->{{ field.name }} = ({{ field.cType }}) value->Int32Value(); + wrapper->GetValue()->{{ field.name }} = ({{ field.cType }}) Nan::To(value).FromJust(); } {% endif %} } - - {% if field.isCallbackFunction %} - {{ field.return.type }} {{ cppClassName }}::{{ field.name }}_cppCallback ( - {% each field.args|argsInfo as arg %} - {{ arg.cType }} {{ arg.name}}{% if not arg.lastArg %},{% endif %} - {% endeach %} - ) { - {{ field.name|titleCase }}Baton* baton = new {{ field.name|titleCase }}Baton(); - - {% each field.args|argsInfo as arg %} - baton->{{ arg.name }} = {{ arg.name }}; - {% endeach %} - - baton->result = 0; - baton->req.data = baton; - baton->done = false; - - uv_async_init(uv_default_loop(), &baton->req, (uv_async_cb) {{ field.name }}_async); - uv_async_send(&baton->req); - - while(!baton->done) { - this_thread::sleep_for(chrono::milliseconds(1)); - } - - {% each field|returnsInfo false true as _return %} - {% if _return.isOutParam %} - *{{ _return.name }} = *baton->{{ _return.name }}; - {% endif %} - {% endeach %} - - return baton->result; - } - - void {{ cppClassName }}::{{ field.name }}_async(uv_async_t* req, int status) { - NanScope(); - - {{ field.name|titleCase }}Baton* baton = static_cast<{{ field.name|titleCase }}Baton*>(req->data); - {{ cppClassName }}* instance = static_cast<{{ cppClassName }}*>(baton->{% each field.args|argsInfo as arg %} - {% if arg.payload == true %}{{arg.name}}{% elsif arg.lastArg %}{{arg.name}}{% endif %} - {% endeach %}); - - if (instance->{{ field.name }}->IsEmpty()) { - {% if field.return.type == "int" %} - baton->result = {{ field.return.noResults }}; // no results acquired - {% endif %} - - baton->done = true; - return; - } - - {% each field.args|argsInfo as arg %} - {% if arg.name == "payload" %} - {%-- Do nothing --%} - {% elsif arg.isJsArg %} - {% if arg.cType == "const char *" %} - if (baton->{{ arg.name }} == NULL) { - baton->{{ arg.name }} = ""; - } - {% endif %} - {% endif %} - {% endeach %} - - Local argv[{{ field.args|jsArgsCount }}] = { - {% each field.args|argsInfo as arg %} - {% if arg.name == "payload" %} - {%-- payload is always the last arg --%} - NanNew(instance->{{ fields|payloadFor field.name }}) - {% elsif arg.isJsArg %} - {% if arg.isEnum %} - NanNew((int)baton->{{ arg.name }}), - {% elsif arg.isLibgitType %} - NanNew({{ arg.cppClassName }}::New((void *)baton->{{ arg.name }}, false)), - {% elsif arg.cType == "size_t" %} - // HACK: NAN should really have an overload for NanNew to support size_t - NanNew((unsigned int)baton->{{ arg.name }}), - {% else %} - NanNew(baton->{{ arg.name }}), - {% endif %} - {% endif %} - {% endeach %} - }; - - TryCatch tryCatch; - Handle result = instance->{{ field.name }}->Call({{ field.args|jsArgsCount }}, argv); - - if (result->IsObject() && result->ToObject()->Has(NanNew("then"))) { - Handle thenProp = result->ToObject()->Get(NanNew("then")); - - if (thenProp->IsFunction()) { - // we can be reasonbly certain that the result is a promise - Local promise = result->ToObject(); - - NanAssignPersistent(baton->promise, promise); - - uv_close((uv_handle_t*) &baton->req, NULL); - uv_async_init(uv_default_loop(), &baton->req, (uv_async_cb) {{ field.name }}_asyncPromisePolling); - uv_async_send(&baton->req); - return; - } - } - - {% each field|returnsInfo false true as _return %} - if (result.IsEmpty() || result->IsNativeError()) { - baton->result = {{ field.return.error }}; - } - else if (!result->IsNull() && !result->IsUndefined()) { - {% if _return.isOutParam %} - {{ _return.cppClassName }}* wrapper = ObjectWrap::Unwrap<{{ _return.cppClassName }}>(result->ToObject()); - wrapper->selfFreeing = false; - - baton->{{ _return.name }} = wrapper->GetRefValue(); - baton->result = {{ field.return.success }}; - {% else %} - if (result->IsNumber()) { - baton->result = (int)result->ToNumber()->Value(); - } - else { - baton->result = {{ field.return.noResults }}; - } - {% endif %} - } - else { - baton->result = {{ field.return.noResults }}; - } - {% endeach %} - baton->done = true; - uv_close((uv_handle_t*) &baton->req, NULL); - } - - void {{ cppClassName }}::{{ field.name }}_asyncPromisePolling(uv_async_t* req, int status) { - NanScope(); - - {{ field.name|titleCase }}Baton* baton = static_cast<{{ field.name|titleCase }}Baton*>(req->data); - Local promise = NanNew(baton->promise); - NanCallback* isPendingFn = new NanCallback(promise->Get(NanNew("isPending")).As()); - Local argv[1]; // MSBUILD won't assign an array of length 0 - Local isPending = isPendingFn->Call(promise, 0, argv)->ToBoolean(); - - if (isPending->Value()) { - uv_async_send(&baton->req); - return; - } - - NanCallback* isFulfilledFn = new NanCallback(promise->Get(NanNew("isFulfilled")).As()); - Local isFulfilled = isFulfilledFn->Call(promise, 0, argv)->ToBoolean(); - - if (isFulfilled->Value()) { - NanCallback* resultFn = new NanCallback(promise->Get(NanNew("value")).As()); - Handle result = resultFn->Call(promise, 0, argv); - - {% each field|returnsInfo false true as _return %} - if (result.IsEmpty() || result->IsNativeError()) { - baton->result = {{ field.return.error }}; - } - else if (!result->IsNull() && !result->IsUndefined()) { - {% if _return.isOutParam %} - {{ _return.cppClassName }}* wrapper = ObjectWrap::Unwrap<{{ _return.cppClassName }}>(result->ToObject()); - wrapper->selfFreeing = false; - - baton->{{ _return.name }} = wrapper->GetRefValue(); - baton->result = {{ field.return.success }}; - {% else %} - if (result->IsNumber()) { - baton->result = (int)result->ToNumber()->Value(); - } - else{ - baton->result = {{ field.return.noResults }}; - } - {% endif %} - } - else { - baton->result = {{ field.return.noResults }}; - } - {% endeach %} - baton->done = true; - } - else { - // promise was rejected - baton->result = {{ field.return.error }}; - baton->done = false; - } - - uv_close((uv_handle_t*) &baton->req, NULL); - } - {% endif %} {% endif %} {% endeach %} diff --git a/generate/templates/partials/fields.cc b/generate/templates/partials/fields.cc index 56dc04eff9..d9478549e5 100644 --- a/generate/templates/partials/fields.cc +++ b/generate/templates/partials/fields.cc @@ -1,29 +1,32 @@ {% each fields|fieldsInfo as field %} {% if not field.ignore %} + // start field block NAN_METHOD({{ cppClassName }}::{{ field.cppFunctionName }}) { - NanScope(); - Handle to; + v8::Local v8ConversionSlot; {% if field | isFixedLengthString %} - char* {{ field.name }} = (char *)ObjectWrap::Unwrap<{{ cppClassName }}>(args.This())->GetValue()->{{ field.name }}; + char* {{ field.name }} = (char *)Nan::ObjectWrap::Unwrap<{{ cppClassName }}>(info.This())->GetValue()->{{ field.name }}; {% else %} - {{ field.cType }} - {% if not field.cppClassName|isV8Value %} - {% if not field.cType|isPointer %} - * + {% if field.cType|isArrayType %} + {{ field.cType|arrayTypeToPlainType }} *{{ field.name }} = + {% else %} + {{ field.cType }} + {% if not field.cppClassName|isV8Value %} + {% if not field.cType|isPointer %}*{% endif %} {% endif %} - {% endif %} - {{ field.name }} = - {% if not field.cppClassName|isV8Value %} - {% if not field.cType|isPointer %} - & + {{ field.name }} = + {% if not field.cppClassName|isV8Value %} + {% if field.cType|isArrayType %}{% elsif not field.cType|isPointer %} + & + {% endif %} {% endif %} {% endif %} - ObjectWrap::Unwrap<{{ cppClassName }}>(args.This())->GetValue()->{{ field.name }}; + Nan::ObjectWrap::Unwrap<{{ cppClassName }}>(info.This())->GetValue()->{{ field.name }}; {% endif %} {% partial convertToV8 field %} - NanReturnValue(to); + info.GetReturnValue().Set(v8ConversionSlot); } + // end field block {% endif %} {% endeach %} diff --git a/generate/templates/partials/guard_arguments.cc b/generate/templates/partials/guard_arguments.cc index 9d3b21f0cb..bcfc332841 100644 --- a/generate/templates/partials/guard_arguments.cc +++ b/generate/templates/partials/guard_arguments.cc @@ -4,21 +4,21 @@ {%if not arg.isOptional%} {%if not arg.payloadFor %} {%if arg | isOid %} - if (args.Length() == {{arg.jsArg}} - || (!args[{{arg.jsArg}}]->IsObject() && !args[{{arg.jsArg}}]->IsString())) { - return NanThrowError("{{arg.jsClassName}} {{arg.name}} is required."); + if (info.Length() == {{arg.jsArg}} + || (!info[{{arg.jsArg}}]->IsObject() && !info[{{arg.jsArg}}]->IsString())) { + return Nan::ThrowError("{{arg.jsClassName}} {{arg.name}} is required."); } {%elsif arg.isCallbackFunction %} - if (args.Length() == {{arg.jsArg}} || !args[{{arg.jsArg}}]->IsFunction()) { - return NanThrowError("{{arg.jsClassName}} {{arg.name}} is required."); + if (info.Length() == {{arg.jsArg}} || !info[{{arg.jsArg}}]->IsFunction()) { + return Nan::ThrowError("{{arg.jsClassName}} {{arg.name}} is required."); } {%elsif arg.cppClassName == "GitStrarray" %} - if (args.Length() == {{arg.jsArg}} || !args[{{arg.jsArg}}]->BooleanValue()) { - return NanThrowError("Array, String Object, or string {{arg.name}} is required."); + if (info.Length() == {{arg.jsArg}} || !(Nan::To(info[{{arg.jsArg}}]).FromJust())) { + return Nan::ThrowError("Array, String Object, or string {{arg.name}} is required."); } {%else%} - if (args.Length() == {{arg.jsArg}} || !args[{{arg.jsArg}}]->Is{{arg.cppClassName|cppToV8}}()) { - return NanThrowError("{{arg.jsClassName}} {{arg.name}} is required."); + if (info.Length() == {{arg.jsArg}} || !info[{{arg.jsArg}}]->Is{{arg.cppClassName|cppToV8}}()) { + return Nan::ThrowError("{{arg.jsClassName}} {{arg.name}} is required."); } {%endif%} diff --git a/generate/templates/partials/sync_function.cc b/generate/templates/partials/sync_function.cc index cf9ab11f27..cf6febe67a 100644 --- a/generate/templates/partials/sync_function.cc +++ b/generate/templates/partials/sync_function.cc @@ -1,14 +1,14 @@ {%partial doc .%} NAN_METHOD({{ cppClassName }}::{{ cppFunctionName }}) { - NanEscapableScope(); + Nan::EscapableHandleScope scope; {%partial guardArguments .%} {%each .|returnsInfo 'true' as _return %} {%if _return.shouldAlloc %} - {{ _return.cType }}{{ _return.name }} = ({{ _return.cType }})malloc(sizeof({{ _return.cType|unPointer }})); + {{ _return.cType }}{{ _return.name }} = ({{ _return.cType }})malloc(sizeof({{ _return.cType|unPointer }})); {%else%} - {{ _return.cType|unPointer }} {{ _return.name }} = {{ _return.cType|unPointer|defaultValue }}; + {{ _return.cType|unPointer }} {{ _return.name }} = {{ _return.cType|unPointer|defaultValue }}; {%endif%} {%endeach%} @@ -17,100 +17,115 @@ NAN_METHOD({{ cppClassName }}::{{ cppFunctionName }}) { {%if not arg.isReturn %} {%partial convertFromV8 arg %} {%if arg.saveArg %} - Handle {{ arg.name }}(args[{{ arg.jsArg }}]->ToObject()); - {{ cppClassName }} *thisObj = ObjectWrap::Unwrap<{{ cppClassName }}>(args.This()); + v8::Local {{ arg.name }}(Nan::To(info[{{ arg.jsArg }}]).ToLocalChecked()); + {{ cppClassName }} *thisObj = Nan::ObjectWrap::Unwrap<{{ cppClassName }}>(info.This()); - NanDisposePersistent(thisObj->{{ cppFunctionName }}_{{ arg.name }}); - - NanAssignPersistent(thisObj->{{ cppFunctionName }}_{{ arg.name }}, {{ arg.name }}); + thisObj->{{ cppFunctionName }}_{{ arg.name }}.Reset({{ arg.name }}); {%endif%} {%endif%} {%endif%} {%endeach%} -{%each args|argsInfo as arg %} -{%endeach%} + {%-- Inside a free call, if the value is already free'd don't do it again.--%} + {%if cppFunctionName == "Free" %} + if (Nan::ObjectWrap::Unwrap<{{ cppClassName }}>(info.This())->GetValue() != NULL) { + {%endif%} -{%-- Inside a free call, if the value is already free'd don't do it again.--%} -{% if cppFunctionName == "Free" %} -if (ObjectWrap::Unwrap<{{ cppClassName }}>(args.This())->GetValue() != NULL) { -{% endif %} + git_error_clear(); -{%if .|hasReturnValue %} - {{ return.cType }} result = {%endif%}{{ cFunctionName }}( - {%each args|argsInfo as arg %} - {%if arg.isReturn %} - {%if not arg.shouldAlloc %}&{%endif%} - {%endif%} - {%if arg.isSelf %} -ObjectWrap::Unwrap<{{ arg.cppClassName }}>(args.This())->GetValue() - {%elsif arg.isReturn %} -{{ arg.name }} - {%else%} -from_{{ arg.name }} - {%endif%} - {%if not arg.lastArg %},{%endif%} - {%endeach%} - ); + { // lock master scope start + nodegit::LockMaster lockMaster( + /*asyncAction: */false + {%each args|argsInfo as arg %} + {%if arg.cType|isPointer%} + {%if not arg.isReturn%} + , + {%if arg.isSelf %} + Nan::ObjectWrap::Unwrap<{{ arg.cppClassName }}>(info.This())->GetValue() + {%else%} + from_{{ arg.name }} + {%endif%} + {%endif%} + {%endif%} + {%endeach%} + ); -{%if .|hasReturnValue |and return.isErrorCode %} - if (result != GIT_OK) { - {%each args|argsInfo as arg %} - {%if arg.shouldAlloc %} - free({{ arg.name }}); - {%elsif arg | isOid %} - if (args[{{ arg.jsArg }}]->IsString()) { - free({{ arg.name }}); - } - {%endif%} - {%endeach%} + {%if .|hasReturnType %} {{ return.cType }} result = {%endif%} + {{ cFunctionName }}( + {%each args|argsInfo as arg %} + {%if arg.isReturn %} + {%if not arg.shouldAlloc %}&{%endif%} + {%endif%} + {%if arg.isSelf %} + Nan::ObjectWrap::Unwrap<{{ arg.cppClassName }}>(info.This())->GetValue() + {%elsif arg.isReturn %} + {{ arg.name }} + {%else%} + from_{{ arg.name }} + {%endif%} + {%if not arg.lastArg %},{%endif%} + {%endeach%} + ); - if (giterr_last()) { - return NanThrowError(giterr_last()->message); - } else { - return NanThrowError("Unknown Error"); - } - } -{%endif%} + {%if .|hasReturnType |and return.isErrorCode %} + if (result != GIT_OK) { + {%each args|argsInfo as arg %} + {%if arg | isOid %} + if (info[{{ arg.jsArg }}]->IsString()) { + free((void *)from_{{ arg.name }}); + } + {%elsif arg.shouldAlloc %} + free({{ arg.name }}); + {%endif%} + {%endeach%} -{% if cppFunctionName == "Free" %} - ObjectWrap::Unwrap<{{ cppClassName }}>(args.This())->ClearValue(); -} -{% endif %} + if (git_error_last()->klass != GIT_ERROR_NONE) { + return Nan::ThrowError(git_error_last()->message); + } else { + return Nan::ThrowError("Unknown Error"); + } + } // lock master scope end + {%endif%} + {%if cppFunctionName == "Free" %} + Nan::ObjectWrap::Unwrap<{{ cppClassName }}>(info.This())->ClearValue(); + } // lock master scope end + {%endif%} -{%each args|argsInfo as arg %} - {%if arg | isOid %} - if (args[{{ arg.jsArg }}]->IsString()) { - free((void *)from_{{ arg.name }}); - } - {%endif%} -{%endeach%} -{%if not .|returnsCount %} - NanReturnUndefined(); -{%else%} - {%if return.cType | isPointer %} - // null checks on pointers - if (!result) { - NodeGitPsueodoNanReturnEscapingValue(NanUndefined()); - } - {%endif%} + {%each args|argsInfo as arg %} + {%if arg | isOid %} + if (info[{{ arg.jsArg }}]->IsString()) { + free((void *)from_{{ arg.name }}); + } + {%endif%} + {%endeach%} - Handle to; - {%if .|returnsCount > 1 %} - Handle toReturn = NanNew(); - {%endif%} - {%each .|returnsInfo as _return %} - {%partial convertToV8 _return %} - {%if .|returnsCount > 1 %} - toReturn->Set(NanNew("{{ _return.returnNameOrName }}"), to); + {%if not .|returnsCount %} + return info.GetReturnValue().Set(scope.Escape(Nan::Undefined())); + {%else%} + {%if return.cType | isPointer %} + // null checks on pointers + if (!result) { + return info.GetReturnValue().Set(scope.Escape(Nan::Undefined())); + } + {%endif%} + + v8::Local v8ConversionSlot; + {%if .|returnsCount > 1 %} + v8::Local toReturn = Nan::New(); + {%endif%} + {%each .|returnsInfo as _return %} + {%partial convertToV8 _return %} + {%if .|returnsCount > 1 %} + Nan::Set(toReturn, Nan::New("{{ _return.returnNameOrName }}").ToLocalChecked(), v8ConversionSlot); + {%endif%} + {%endeach%} + {%if .|returnsCount == 1 %} + return info.GetReturnValue().Set(scope.Escape(v8ConversionSlot)); + {%else%} + return info.GetReturnValue().Set(scope.Escape(toReturn)); + {%endif%} {%endif%} - {%endeach%} - {%if .|returnsCount == 1 %} - NodeGitPsueodoNanReturnEscapingValue(to); - {%else%} - NodeGitPsueodoNanReturnEscapingValue(toReturn); - {%endif%} -{%endif%} + } } diff --git a/generate/templates/partials/traits.h b/generate/templates/partials/traits.h new file mode 100644 index 0000000000..9f1f2eed76 --- /dev/null +++ b/generate/templates/partials/traits.h @@ -0,0 +1,42 @@ +class {{ cppClassName }}; +{% if type == 'struct' %} +class Configurable{{ cppClassName }}; +{% endif %} + +struct {{ cppClassName }}Traits { + typedef {{ cppClassName }} cppClass; + typedef {{ cType }} cType; + {% if type == 'struct' %} + typedef Configurable{{ cppClassName }} configurableCppClass; + {% endif %} + + static const bool isDuplicable = {{ dupFunction|toBool |or cpyFunction|toBool}}; + static void duplicate({{ cType }} **dest, {{ cType }} *src) { + {% if dupFunction %} + {{ dupFunction }}(dest, src); + {% elsif cpyFunction %} + {{ cType }} *copy = ({{ cType }} *)malloc(sizeof({{ cType }})); + {{ cpyFunction }}(copy, src); + *dest = copy; + {% else %} + Nan::ThrowError("duplicate called on {{ cppClassName }} which cannot be duplicated"); + {% endif %} + } + + static std::string className() { return "{{ cppClassName }}"; }; + static const bool isSingleton = {{ isSingleton | toBool }}; + static const bool isFreeable = {{ freeFunctionName | toBool}}; + static void free({{ cType }} *raw) { + {% if freeFunctionName %} + unsigned long referenceCount = 0; + {% if isSingleton %} + referenceCount = ReferenceCounter::decrementCountForPointer((void *)raw); + {% endif %} + if (referenceCount == 0) { + ::{{ freeFunctionName }}(raw); // :: to avoid calling this free recursively + } + {% else %} + Nan::ThrowError("free called on {{ cppClassName }} which cannot be freed"); + {% endif %} + } +}; diff --git a/generate/templates/templates/binding.gyp b/generate/templates/templates/binding.gyp index ed13a69f8a..4476c9236d 100644 --- a/generate/templates/templates/binding.gyp +++ b/generate/templates/templates/binding.gyp @@ -1,23 +1,51 @@ -# // This is a generated file, modify: generate/templates/binding.gyp. - { + "variables": { + "variables": { + "target%": "none", + }, + "is_electron%": " #include -#include -#include extern "C" { #include @@ -11,9 +8,11 @@ extern "C" { {% endeach %} } +#include "../include/nodegit.h" +#include "../include/lock_master.h" #include "../include/functions/copy.h" -#include "../include/macros.h" #include "../include/{{ filename }}.h" +#include "nodegit_wrapper.cc" {% each dependencies as dependency %} #include "{{ dependency }}" @@ -26,19 +25,7 @@ using namespace v8; using namespace node; {% if cType %} - {{ cppClassName }}::{{ cppClassName }}({{ cType }} *raw, bool selfFreeing) { - this->raw = raw; - this->selfFreeing = selfFreeing; - } - {{ cppClassName }}::~{{ cppClassName }}() { - {% if freeFunctionName %} - if (this->selfFreeing) { - {{ freeFunctionName }}(this->raw); - this->raw = NULL; - } - {% endif %} - // this will cause an error if you have a non-self-freeing object that also needs // to save values. Since the object that will eventually free the object has no // way of knowing to free these values. @@ -47,100 +34,82 @@ using namespace node; {% each function.args as arg %} {% if arg.saveArg %} - NanDisposePersistent({{ function.cppFunctionName }}_{{ arg.name }}); + {{ function.cppFunctionName }}_{{ arg.name }}).Reset(); {% endif %} {% endeach %} {% endif %} {% endeach %} - } - void {{ cppClassName }}::InitializeComponent(Handle target) { - NanScope(); + void {{ cppClassName }}::InitializeComponent(v8::Local target, nodegit::Context *nodegitContext) { + Nan::HandleScope scope; - Local tpl = NanNew(JSNewFunction); + v8::Local nodegitExternal = Nan::New(nodegitContext); + v8::Local tpl = Nan::New(JSNewFunction, nodegitExternal); - tpl->InstanceTemplate()->SetInternalFieldCount(1); - tpl->SetClassName(NanNew("{{ jsClassName }}")); + tpl->InstanceTemplate()->SetInternalFieldCount(2); + tpl->SetClassName(Nan::New("{{ jsClassName }}").ToLocalChecked()); {% each functions as function %} {% if not function.ignore %} {% if function.isPrototypeMethod %} - NODE_SET_PROTOTYPE_METHOD(tpl, "{{ function.jsFunctionName }}", {{ function.cppFunctionName }}); + Nan::SetPrototypeMethod(tpl, "{{ function.jsFunctionName }}", {{ function.cppFunctionName }}, nodegitExternal); {% else %} - NODE_SET_METHOD(tpl, "{{ function.jsFunctionName }}", {{ function.cppFunctionName }}); + Nan::SetMethod(tpl, "{{ function.jsFunctionName }}", {{ function.cppFunctionName }}, nodegitExternal); {% endif %} {% endif %} {% endeach %} {% each fields as field %} {% if not field.ignore %} - NODE_SET_PROTOTYPE_METHOD(tpl, "{{ field.jsFunctionName }}", {{ field.cppFunctionName }}); + Nan::SetPrototypeMethod(tpl, "{{ field.jsFunctionName }}", {{ field.cppFunctionName }}, nodegitExternal); {% endif %} {% endeach %} - Local _constructor_template = tpl->GetFunction(); - NanAssignPersistent(constructor_template, _constructor_template); - target->Set(NanNew("{{ jsClassName }}"), _constructor_template); - } - - NAN_METHOD({{ cppClassName }}::JSNewFunction) { - NanScope(); - - if (args.Length() == 0 || !args[0]->IsExternal()) { - {% if createFunctionName %} - return NanThrowError("A new {{ cppClassName }} cannot be instantiated. Use {{ jsCreateFunctionName }} instead."); - {% else %} - return NanThrowError("A new {{ cppClassName }} cannot be instantiated."); - {% endif %} - } - - {{ cppClassName }}* object = new {{ cppClassName }}(static_cast<{{ cType }} *>(Handle::Cast(args[0])->Value()), args[1]->BooleanValue()); - object->Wrap(args.This()); + InitializeTemplate(tpl); - NanReturnValue(args.This()); - } - - Handle {{ cppClassName }}::New(void *raw, bool selfFreeing) { - NanEscapableScope(); - Handle argv[2] = { NanNew((void *)raw), NanNew(selfFreeing) }; - return NanEscapeScope(NanNew({{ cppClassName }}::constructor_template)->NewInstance(2, argv)); - } - - {{ cType }} *{{ cppClassName }}::GetValue() { - return this->raw; - } - - {{ cType }} **{{ cppClassName }}::GetRefValue() { - return this->raw == NULL ? NULL : &this->raw; - } - - void {{ cppClassName }}::ClearValue() { - this->raw = NULL; + v8::Local constructor_template = Nan::GetFunction(tpl).ToLocalChecked(); + nodegitContext->SaveToPersistent("{{ cppClassName }}::Template", constructor_template); + Nan::Set(target, Nan::New("{{ jsClassName }}").ToLocalChecked(), constructor_template); } {% else %} - void {{ cppClassName }}::InitializeComponent(Handle target) { - NanScope(); + void {{ cppClassName }}::InitializeComponent(v8::Local target, nodegit::Context *nodegitContext) { + Nan::HandleScope scope; + Local nodegitExternal = Nan::New(nodegitContext); - Local object = NanNew(); + {% if functions|hasFunctionOnRootProto %} + v8::Local object = Nan::New({{ functions|getCPPFunctionForRootProto }}, nodegitExternal); + {% else %} + v8::Local object = Nan::New(); + {% endif %} {% each functions as function %} {% if not function.ignore %} - NODE_SET_METHOD(object, "{{ function.jsFunctionName }}", {{ function.cppFunctionName }}); + Nan::SetMethod(object, "{{ function.jsFunctionName }}", {{ function.cppFunctionName }}, nodegitExternal); {% endif %} {% endeach %} - target->Set(NanNew("{{ jsClassName }}"), object); + Nan::Set( + target, + Nan::New("{{ jsClassName }}").ToLocalChecked(), + {% if functions|hasFunctionOnRootProto %} + Nan::GetFunction(object).ToLocalChecked() + {% else %} + object + {% endif %} + ); } {% endif %} {% each functions as function %} {% if not function.ignore %} - {% if function.isAsync %} + {% if function.isManual %} + {{= function.implementation =}} + {% elsif function.isAsync %} {% partial asyncFunction function %} {% else %} {% partial syncFunction function %} @@ -150,6 +119,8 @@ using namespace node; {% partial fields . %} -{% if not cTypeIsUndefined %} - Persistent {{ cppClassName }}::constructor_template; +{%if cType %} +// force base class template instantiation, to make sure we get all the +// methods, statics, etc. +template class NodeGitWrapper<{{ cppClassName }}Traits>; {% endif %} diff --git a/generate/templates/templates/class_header.h b/generate/templates/templates/class_header.h index d7f903f268..9112347825 100644 --- a/generate/templates/templates/class_header.h +++ b/generate/templates/templates/class_header.h @@ -1,16 +1,33 @@ #ifndef {{ cppClassName|upper }}_H #define {{ cppClassName|upper }}_H -// generated from class_header.h #include #include +#include +#include +#include +#include +#include + +#include "async_baton.h" +#include "async_worker.h" +#include "cleanup_handle.h" +#include "context.h" +#include "lock_master.h" +#include "nodegit_wrapper.h" +#include "promise_completion.h" +#include "reference_counter.h" +#include "worker_pool.h" extern "C" { #include +#include {%each cDependencies as dependency %} #include <{{ dependency }}> {%endeach%} } +#include "../include/typedefs.h" + {%each dependencies as dependency%} #include "{{ dependency }}" {%endeach%} @@ -29,20 +46,28 @@ struct {{ cType }} { using namespace node; using namespace v8; -class {{ cppClassName }} : public ObjectWrap { - public: +{%if cType %} +{%partial traits .%} +{%endif%} - static Persistent constructor_template; - static void InitializeComponent (Handle target); +class {{ cppClassName }} : public +{%if cType %} + NodeGitWrapper<{{ cppClassName }}Traits> +{%else%} + Nan::ObjectWrap +{%endif%} +{ + {%if cType %} + // grant full access to base class + friend class NodeGitWrapper<{{ cppClassName }}Traits>; + {%endif %} + public: + {{ cppClassName }}(const {{ cppClassName }} &) = delete; + {{ cppClassName }}({{ cppClassName }} &&) = delete; + {{ cppClassName }} &operator=(const {{ cppClassName }} &) = delete; + {{ cppClassName }} &operator=({{ cppClassName }} &&) = delete; - {%if cType%} - {{ cType }} *GetValue(); - {{ cType }} **GetRefValue(); - void ClearValue(); - - static Handle New(void *raw, bool selfFreeing); - {%endif%} - bool selfFreeing; + static void InitializeComponent (v8::Local target, nodegit::Context *nodegitContext); {% each functions as function %} {% if not function.ignore %} @@ -57,17 +82,19 @@ class {{ cppClassName }} : public ObjectWrap { {% endeach %} ); - static void {{ function.cppFunctionName }}_{{ arg.name }}_async(uv_async_t* req, int status); - static void {{ function.cppFunctionName }}_{{ arg.name }}_asyncPromisePolling(uv_async_t* req, int status); - struct {{ function.cppFunctionName }}_{{ arg.name|titleCase }}Baton { + static void {{ function.cppFunctionName }}_{{ arg.name }}_cancelAsync(void *baton); + static void {{ function.cppFunctionName }}_{{ arg.name }}_async(void *baton); + static void {{ function.cppFunctionName }}_{{ arg.name }}_promiseCompleted(bool isFulfilled, nodegit::AsyncBaton *_baton, v8::Local result); + class {{ function.cppFunctionName }}_{{ arg.name|titleCase }}Baton : public nodegit::AsyncBatonWithResult<{{ arg.return.type }}> { + public: {% each arg.args|argsInfo as cbArg %} {{ cbArg.cType }} {{ cbArg.name }}; {% endeach %} - uv_async_t req; - {{ arg.return.type }} result; - Persistent promise; - bool done; + + {{ function.cppFunctionName }}_{{ arg.name|titleCase }}Baton(const {{ arg.return.type }} &defaultResult) + : nodegit::AsyncBatonWithResult<{{ arg.return.type }}>(defaultResult) { + } }; {% endif %} {% endeach %} @@ -76,25 +103,22 @@ class {{ cppClassName }} : public ObjectWrap { private: - - {%if cType%} - {{ cppClassName }}({{ cType }} *raw, bool selfFreeing); + {{ cppClassName }}() + : NodeGitWrapper<{{ cppClassName }}Traits>( + {% if createFunctionName %} + "A new {{ cppClassName }} cannot be instantiated. Use {{ jsCreateFunctionName }} instead." + {% else %} + "A new {{ cppClassName }} cannot be instantiated." + {% endif %} + ) + {} + {{ cppClassName }}({{ cType }} *raw, bool selfFreeing, v8::Local owner = v8::Local()) + : NodeGitWrapper<{{ cppClassName }}Traits>(raw, selfFreeing, owner) + {} ~{{ cppClassName }}(); {%endif%} - {% each functions as function %} - {% if not function.ignore %} - {% each function.args as arg %} - {% if arg.saveArg %} - Persistent {{ function.cppFunctionName }}_{{ arg.name }}; - {% endif %} - {% endeach %} - {% endif %} - {% endeach %} - - static NAN_METHOD(JSNewFunction); - {%each fields as field%} {%if not field.ignore%} static NAN_METHOD({{ field.cppFunctionName }}); @@ -102,33 +126,45 @@ class {{ cppClassName }} : public ObjectWrap { {%endeach%} {%each functions as function%} - {%if not function.ignore%} - {%if function.isAsync%} + {%if not function.ignore %} + {%if function.isAsync %} struct {{ function.cppFunctionName }}Baton { int error_code; const git_error* error; {%each function.args as arg%} {%if arg.isReturn%} - {{ arg.cType|replace "**" "*" }} {{ arg.name }}; + {{= arg.cType|replace "**" "*" =}} {{ arg.name }}; {%else%} - {{ arg.cType }} {{ arg.name }}; + {{= arg.cType =}} {{ arg.name }}; {%if arg | isOid %} bool {{ arg.name }}NeedsFree; {%endif%} {%endif%} {%endeach%} + {% if function.return.isResultOrError %} + {% elsif function.return.isErrorCode %} + {% elsif function.return.cType != 'void' %} + {{ function.return.cType }} result; + {% endif %} }; - class {{ function.cppFunctionName }}Worker : public NanAsyncWorker { + class {{ function.cppFunctionName }}Worker : public nodegit::AsyncWorker { public: {{ function.cppFunctionName }}Worker( {{ function.cppFunctionName }}Baton *_baton, - NanCallback *callback - ) : NanAsyncWorker(callback) + Nan::Callback *callback, + std::map> &cleanupHandles + ) : nodegit::AsyncWorker(callback, "nodegit:AsyncWorker:{{ cppClassName }}:{{ function.cppFunctionName }}", cleanupHandles) , baton(_baton) {}; + {{ function.cppFunctionName }}Worker(const {{ function.cppFunctionName }}Worker &) = delete; + {{ function.cppFunctionName }}Worker({{ function.cppFunctionName }}Worker &&) = delete; + {{ function.cppFunctionName }}Worker &operator=(const {{ function.cppFunctionName }}Worker &) = delete; + {{ function.cppFunctionName }}Worker &operator=({{ function.cppFunctionName }}Worker &&) = delete; ~{{ function.cppFunctionName }}Worker() {}; void Execute(); + void HandleErrorCallback(); void HandleOKCallback(); + nodegit::LockMaster AcquireLocks(); private: {{ function.cppFunctionName }}Baton *baton; @@ -146,7 +182,7 @@ class {{ cppClassName }} : public ObjectWrap { struct {{ function.cppFunctionName }}_globalPayload { {%each function.args as arg %} {%if arg.isCallbackFunction %} - NanCallback * {{ arg.name }}; + Nan::Callback * {{ arg.name }}; {%endif%} {%endeach%} @@ -158,6 +194,11 @@ class {{ cppClassName }} : public ObjectWrap { {%endeach%} } + {{ function.cppFunctionName }}_globalPayload(const {{ function.cppFunctionName }}_globalPayload &) = delete; + {{ function.cppFunctionName }}_globalPayload({{ function.cppFunctionName }}_globalPayload &&) = delete; + {{ function.cppFunctionName }}_globalPayload &operator=(const {{ function.cppFunctionName }}_globalPayload &) = delete; + {{ function.cppFunctionName }}_globalPayload &operator=({{ function.cppFunctionName }}_globalPayload &&) = delete; + ~{{ function.cppFunctionName }}_globalPayload() { {%each function.args as arg %} {%if arg.isCallbackFunction %} @@ -171,10 +212,6 @@ class {{ cppClassName }} : public ObjectWrap { {%endif%} {%endeach%} {%endeach%} - - {%if cType%} - {{ cType }} *raw; - {%endif%} }; #endif diff --git a/generate/templates/templates/nodegit.cc b/generate/templates/templates/nodegit.cc index 9bd2dd89b3..e43f8b2ae5 100644 --- a/generate/templates/templates/nodegit.cc +++ b/generate/templates/templates/nodegit.cc @@ -1,25 +1,128 @@ -// This is a generated file, modify: generate/templates/nodegit.cc. -#include #include +#include + #include +#include +#include +#include +#include +#include +#include "../include/init_ssh2.h" +#include "../include/lock_master.h" +#include "../include/nodegit.h" +#include "../include/context.h" #include "../include/wrapper.h" +#include "../include/promise_completion.h" #include "../include/functions/copy.h" {% each %} {% if type != "enum" %} #include "../include/{{ filename }}.h" {% endif %} {% endeach %} +#include "../include/convenient_patch.h" +#include "../include/convenient_hunk.h" +#include "../include/filter_registry.h" + +using namespace v8; + +Local GetPrivate(Local object, Local key) { + Local value; + Nan::Maybe result = Nan::HasPrivate(object, key); + if (!(result.IsJust() && result.FromJust())) + return Local(); + if (Nan::GetPrivate(object, key).ToLocal(&value)) + return value; + return Local(); +} + +void SetPrivate(Local object, Local key, Local value) { + if (value.IsEmpty()) + return; + Nan::SetPrivate(object, key, value); +} + +static uv_mutex_t *opensslMutexes; + +void OpenSSL_LockingCallback(int mode, int type, const char *, int) { + if (mode & CRYPTO_LOCK) { + uv_mutex_lock(&opensslMutexes[type]); + } else { + uv_mutex_unlock(&opensslMutexes[type]); + } +} + +void OpenSSL_IDCallback(CRYPTO_THREADID *id) { + CRYPTO_THREADID_set_numeric(id, (unsigned long)uv_thread_self()); +} -extern "C" void init(Handle target) { - NanScope(); +void OpenSSL_ThreadSetup() { + opensslMutexes=(uv_mutex_t *)malloc(CRYPTO_num_locks() * sizeof(uv_mutex_t)); - Wrapper::InitializeComponent(target); + for (int i=0; iTrackerListSize()); +} + +static std::once_flag libraryInitializedFlag; +static std::mutex libraryInitializationMutex; + +NAN_MODULE_INIT(init) { + { + // We only want to do initialization logic once, and we also want to prevent any thread from completely loading + // the module until initialization has occurred. + // All of this initialization logic ends up being shared. + const std::lock_guard lock(libraryInitializationMutex); + std::call_once(libraryInitializedFlag, []() { + // Initialize thread safety in openssl and libssh2 + OpenSSL_ThreadSetup(); + init_ssh2(); + // Initialize libgit2. + git_libgit2_init(); + + // Register thread pool with libgit2 + nodegit::ThreadPool::InitializeGlobal(); + }); + } + + // Exports function 'getNumberOfTrackedObjects' + Nan::Set(target + , Nan::New("getNumberOfTrackedObjects").ToLocalChecked() + , Nan::GetFunction(Nan::New(GetNumberOfTrackedObjects)).ToLocalChecked() + ); + + Nan::HandleScope scope; + Local context = Nan::GetCurrentContext(); + Isolate *isolate = context->GetIsolate(); + nodegit::Context *nodegitContext = new nodegit::Context(isolate); + + Wrapper::InitializeComponent(target, nodegitContext); + PromiseCompletion::InitializeComponent(nodegitContext); {% each %} - {% if type != "enum" %} - {{ cppClassName }}::InitializeComponent(target); + {% if type == 'class' %} + {{ cppClassName }}::InitializeComponent(target, nodegitContext); + {% elsif type == 'struct' %} + {% if isReturnable %} + {{ cppClassName }}::InitializeComponent(target, nodegitContext); + {% endif %} {% endif %} {% endeach %} + + ConvenientHunk::InitializeComponent(target, nodegitContext); + ConvenientPatch::InitializeComponent(target, nodegitContext); + GitFilterRegistry::InitializeComponent(target, nodegitContext); + + nodegit::LockMaster::InitializeContext(); } -NODE_MODULE(nodegit, init) +NAN_MODULE_WORKER_ENABLED(nodegit, init) diff --git a/generate/templates/templates/nodegit.js b/generate/templates/templates/nodegit.js index babfbf5d08..43e7d9de02 100644 --- a/generate/templates/templates/nodegit.js +++ b/generate/templates/templates/nodegit.js @@ -1,5 +1,11 @@ -var Promise = require("nodegit-promise"); -var promisify = require("promisify-node"); +var _ = require("lodash"); +var util = require("util"); +var worker; + +try { + worker = require("worker_threads"); +} catch (e) {} + var rawApi; // Attempt to load the production release first, if it fails fall back to the @@ -16,10 +22,25 @@ catch (ex) { rawApi = require("../build/Debug/nodegit.node"); } +var promisify = fn => fn && util.promisify(fn); // jshint ignore:line + +// For disccussion on why `cloneDeep` is required, see: +// https://github.com/facebook/jest/issues/3552 +// https://github.com/facebook/jest/issues/3550 +// https://github.com/nodejs/node/issues/5016 +rawApi = _.cloneDeep(rawApi); + // Native methods do not return an identifiable function, so we // have to override them here /* jshint ignore:start */ {% each . as idef %} + {% if idef.type == 'struct' %} + rawApi.{{ idef.jsClassName }} = util.deprecate(function {{ idef.jsClassName }}() { + try { + require("./deprecated/structs/{{ idef.jsClassName }}").call(this, rawApi); + } catch (error) {/* allow these to be undefined */} + }, "Instantiation of {{ idef.jsClassName }} is deprecated and will be removed in an upcoming version"); + {% endif %} {% if idef.type != "enum" %} {% if idef.functions.length > 0 %} @@ -51,6 +72,22 @@ catch (ex) { {% endif %} {% endeach %} + +var _ConvenientPatch = rawApi.ConvenientPatch; +var _ConvenientPatch_hunks = _ConvenientPatch.prototype.hunks; +_ConvenientPatch.prototype.hunks = promisify(_ConvenientPatch_hunks); + +var _ConvenientHunk = rawApi.ConvenientHunk; +var _ConvenientHunk_lines = _ConvenientHunk.prototype.lines; +_ConvenientHunk.prototype.lines = promisify(_ConvenientHunk_lines); + +var _FilterRegistry = rawApi.FilterRegistry; +var _FilterRegistry_register = _FilterRegistry.register; +_FilterRegistry.register = promisify(_FilterRegistry_register); + +var _FilterRegistry_unregister = _FilterRegistry.unregister; +_FilterRegistry.unregister = promisify(_FilterRegistry_unregister); + /* jshint ignore:end */ // Set the exports prototype to the raw API. @@ -70,17 +107,15 @@ var importExtension = function(name) { // Load up utils rawApi.Utils = {}; require("./utils/lookup_wrapper"); -require("./utils/normalize_options"); require("./utils/shallow_clone"); // Load up extra types; -require("./convenient_line"); -require("./convenient_hunk"); -require("./convenient_patch"); require("./status_file"); require("./enums.js"); // Import extensions +// [Manual] extensions +importExtension("filter_registry"); {% each %} {% if type != "enum" %} importExtension("{{ filename }}"); @@ -110,14 +145,8 @@ require("./enums.js"); {% endeach %} /* jshint ignore:end */ -// Wrap asynchronous methods to return promises. -promisify(exports); - // Set version. exports.version = require("../package").version; // Expose Promise implementation. exports.Promise = Promise; - -// Initialize libgit2. -exports.Libgit2.init(); diff --git a/generate/templates/templates/struct_content.cc b/generate/templates/templates/struct_content.cc index 4e7b862ba3..d7355d2a29 100644 --- a/generate/templates/templates/struct_content.cc +++ b/generate/templates/templates/struct_content.cc @@ -1,8 +1,11 @@ -// This is a generated file, modify: generate/templates/struct_content.cc. +// generated from struct_content.cc #include #include -#include -#include +#ifdef WIN32 +#include +#else +#include +#endif // win32 extern "C" { #include @@ -12,8 +15,11 @@ extern "C" { } #include +#include "../include/nodegit.h" +#include "../include/lock_master.h" #include "../include/functions/copy.h" #include "../include/{{ filename }}.h" +#include "nodegit_wrapper.cc" {% each dependencies as dependency %} #include "{{ dependency }}" @@ -23,130 +29,336 @@ using namespace v8; using namespace node; using namespace std; +{% if isReturnable %} + {{ cppClassName }}::{{ cppClassName }}() : NodeGitWrapper<{{ cppClassName }}Traits>(NULL, true, v8::Local()) + { + {% if ignoreInit == true %} + this->raw = new {{ cType }}; + {% else %} + {% if isExtendedStruct %} + {{ cType }}_extended wrappedValue = {{ cType|upper }}_INIT; + this->raw = ({{ cType }}*) malloc(sizeof({{ cType }}_extended)); + memcpy(this->raw, &wrappedValue, sizeof({{ cType }}_extended)); + {% else %} + {{ cType }} wrappedValue = {{ cType|upper }}_INIT; + this->raw = ({{ cType }}*) malloc(sizeof({{ cType }})); + memcpy(this->raw, &wrappedValue, sizeof({{ cType }})); + {% endif %} + {% endif %} -// generated from struct_content.cc -{{ cppClassName }}::{{ cppClassName }}() { - {% if ignoreInit == true %} - {{ cType }}* wrappedValue = new {{ cType }}; - {% else %} - {{ cType }} wrappedValue = {{ cType|upper }}_INIT; - {% endif %} - this->raw = ({{ cType }}*) malloc(sizeof({{ cType }})); - memcpy(this->raw, &wrappedValue, sizeof({{ cType }})); - - this->ConstructFields(); - this->selfFreeing = true; -} + this->ConstructFields(); + } -{{ cppClassName }}::{{ cppClassName }}({{ cType }}* raw, bool selfFreeing) { - this->raw = raw; - this->ConstructFields(); - this->selfFreeing = selfFreeing; -} + {{ cppClassName }}::{{ cppClassName }}({{ cType }}* raw, bool selfFreeing, v8::Local owner) + : NodeGitWrapper<{{ cppClassName }}Traits>(raw, selfFreeing, owner) + { + this->ConstructFields(); + } -{{ cppClassName }}::~{{ cppClassName }}() { - {% each fields|fieldsInfo as field %} - {% if not field.ignore %} - {% if not field.isEnum %} - {% if field.isCallbackFunction %} - if (this->{{ field.name }} != NULL) { - delete this->{{ field.name }}; - this->raw->{{ fields|payloadFor field.name }} = NULL; + {{ cppClassName }}::~{{ cppClassName }}() { + {% each fields|fieldsInfo as field %} + {% if not field.ignore %} + {% if not field.isEnum %} + {% if field.isLibgitType %} + this->{{ field.name }}.Reset(); + {% endif %} + {% endif %} + {% endif %} + {% endeach %} } + + void {{ cppClassName }}::ConstructFields() { + {% each fields|fieldsInfo as field %} + {% if not field.ignore %} + {% if not field.isEnum %} + {% if field.isLibgitType %} + v8::Local {{ field.name }}Temp = Nan::To({{ field.cppClassName }}::New( + {%if not field.cType|isPointer %}&{%endif%}this->raw->{{ field.name }}, + false + )).ToLocalChecked(); + this->{{ field.name }}.Reset({{ field.name }}Temp); + {% endif %} {% endif %} {% endif %} - {% endif %} - {% endeach %} + {% endeach %} + } + + void {{ cppClassName }}::InitializeComponent(Local target, nodegit::Context *nodegitContext) { + Nan::HandleScope scope; + + Local nodegitExternal = Nan::New(nodegitContext); + Local tpl = Nan::New(JSNewFunction, nodegitExternal); + + tpl->InstanceTemplate()->SetInternalFieldCount(2); + tpl->SetClassName(Nan::New("{{ jsClassName }}").ToLocalChecked()); - if (this->selfFreeing) { - free(this->raw); + {% each fields as field %} + {% if not field.ignore %} + {% if not field | isPayload %} + Nan::SetAccessor(tpl->InstanceTemplate(), Nan::New("{{ field.jsFunctionName }}").ToLocalChecked(), Get{{ field.cppFunctionName}}, Set{{ field.cppFunctionName}}, nodegitExternal); + {% endif %} + {% endif %} + {% endeach %} + + InitializeTemplate(tpl); + + v8::Local constructor_template = Nan::GetFunction(tpl).ToLocalChecked(); + nodegitContext->SaveToPersistent("{{ cppClassName }}::Template", constructor_template); } + + {% partial fieldAccessors . %} + + // force base class template instantiation, to make sure we get all the + // methods, statics, etc. + template class NodeGitWrapper<{{ cppClassName }}Traits>; + +{% endif %} + +Configurable{{ cppClassName }}::Configurable{{ cppClassName }}(nodegit::Context *nodegitContext) + : nodegit::ConfigurableClassWrapper<{{ cppClassName }}Traits>(nodegitContext) +{ + {% if ignoreInit == true %} + this->raw = ({{ cType }}*) malloc(sizeof({{ cType }})); + {% else %} + {{ cType }}{% if isExtendedStruct %}_extended{% endif %} wrappedValue = {{ cType|upper }}_INIT; + this->raw = ({{ cType }}*) malloc(sizeof({{ cType }}{% if isExtendedStruct %}_extended{% endif %})); + memcpy(this->raw, &wrappedValue, sizeof({{ cType }}{% if isExtendedStruct %}_extended{% endif %})); + {% endif %} } -void {{ cppClassName }}::ConstructFields() { +Configurable{{ cppClassName }}::~Configurable{{ cppClassName }}() { {% each fields|fieldsInfo as field %} {% if not field.ignore %} - {% if not field.isEnum %} - {% if field.hasConstructor |or field.isLibgitType %} - Local {{ field.name }}Temp = {{ field.cppClassName }}::New( - &this->raw->{{ field.name }}, - false - )->ToObject(); - NanAssignPersistent(this->{{ field.name }}, {{ field.name }}Temp); - - {% elsif field.isCallbackFunction %} - - // Set the static method call and set the payload for this function to be - // the current instance - this->raw->{{ field.name }} = NULL; - this->raw->{{ fields|payloadFor field.name }} = (void *)this; - this->{{ field.name }} = NULL; - {% elsif field.payloadFor %} - - Local {{ field.name }} = NanUndefined(); - NanAssignPersistent(this->{{ field.name }}, {{ field.name }}); - {% endif %} + {% if field.cppClassName == 'GitStrarray' %} + if (this->raw->{{ field.name }}.count) { + for (size_t i = 0; i < this->raw->{{ field.name }}.count; ++i) { + free(this->raw->{{ field.name }}.strings[i]); + } + free(this->raw->{{ field.name }}.strings); + } + {% elsif field.cppClassName == 'String' %} + free((void*)this->raw->{{ field.name }}); {% endif %} {% endif %} {% endeach %} } -void {{ cppClassName }}::InitializeComponent(Handle target) { - NanScope(); - - Local tpl = NanNew(JSNewFunction); +nodegit::ConfigurableClassWrapper<{{ cppClassName }}Traits>::v8ConversionResult Configurable{{ cppClassName }}::fromJavascript(nodegit::Context *nodegitContext, v8::Local input) { + if (!input->IsObject()) { + return { + "Must pass object for Configurable{{ cppClassName }}" + }; + } - tpl->InstanceTemplate()->SetInternalFieldCount(1); - tpl->SetClassName(NanNew("{{ jsClassName }}")); + Nan::HandleScope scope; + v8::Local inputObj = input.As(); + std::shared_ptr output(new Configurable{{ cppClassName }}(nodegitContext)); + // unpack the data into the correct fields {% each fields as field %} {% if not field.ignore %} - {% if not field | isPayload %} - tpl->InstanceTemplate()->SetAccessor(NanNew("{{ field.jsFunctionName }}"), Get{{ field.cppFunctionName}}, Set{{ field.cppFunctionName}}); - {% endif %} - {% endif %} - {% endeach %} + {% if field.isClassType %} + {% if field.cppClassName == 'GitOid' %} + { + v8::Local maybeOid = nodegit::safeGetField(inputObj, "{{ field.jsFunctionName }}"); + if (!maybeOid.IsEmpty() && !maybeOid->IsUndefined() && !maybeOid->IsNull()) { + if (maybeOid->IsString()) { + Nan::Utf8String oidString(maybeOid.As()); + if (git_oid_fromstr(&output->raw->{{ field.name }}, *oidString) != GIT_OK) { + return { + git_error_last()->message + }; + } + } else if (maybeOid->IsObject()) { + if (git_oid_cpy(&output->raw->{{ field.name }}, Nan::ObjectWrap::Unwrap<{{ field.cppClassName }}>(maybeOid.As())->GetValue()) != GIT_OK) { + return { + git_error_last()->message + }; + } + } else { + return { + "Must pass String or NodeGit.Oid to {{ field.jsFunctionName }}" + }; + } + } + } + {% elsif field.cppClassName == 'GitStrarray' %} + output->raw->{{ field.name }}.count = 0; + output->raw->{{ field.name }}.strings = nullptr; - Local _constructor_template = tpl->GetFunction(); - NanAssignPersistent(constructor_template, _constructor_template); - target->Set(NanNew("{{ jsClassName }}"), _constructor_template); -} + { + v8::Local maybeStrarray = nodegit::safeGetField(inputObj, "{{ field.jsFunctionName }}"); + if (!maybeStrarray.IsEmpty() && !maybeStrarray->IsUndefined() && !maybeStrarray->IsNull()) { + if (maybeStrarray->IsArray()) { + v8::Local strarrayValue = maybeStrarray.As(); + // validate the StrArray is indeed a list of strings + for (uint32_t i = 0; i < strarrayValue->Length(); ++i) { + // TODO confirm that sparse array at least boils down to undefined + v8::Local arrayValue = Nan::Get(strarrayValue, i).ToLocalChecked(); + if (!arrayValue->IsString()) { + return { + "Must pass String or Array of strings to {{ field.jsFunctionName }}" + }; + } + } -NAN_METHOD({{ cppClassName }}::JSNewFunction) { - NanScope(); - {{ cppClassName }}* instance; + StrArrayConverter::ConvertInto(&output->raw->{{ field.name }}, strarrayValue); + } else if (maybeStrarray->IsString()) { + v8::Local strarrayValue = maybeStrarray.As(); + StrArrayConverter::ConvertInto(&output->raw->{{ field.name }}, strarrayValue); + } else { + return { + "Must pass String or Array of strings to {{ field.jsFunctionName }}" + }; + } + } + } + {% else %} + { + v8::Local maybeObject = nodegit::safeGetField(inputObj, "{{ field.jsFunctionName }}"); + if (!maybeObject.IsEmpty() && !maybeObject->IsUndefined() && !maybeObject->IsNull()) { + if (!maybeObject->IsObject()) { + return { + "Must pass NodeGit.{{ field.jsClassName }} to {{ field.jsFunctionName }}" + }; + } - if (args.Length() == 0 || !args[0]->IsExternal()) { - instance = new {{ cppClassName }}(); - } - else { - instance = new {{ cppClassName }}(static_cast<{{ cType }}*>(Handle::Cast(args[0])->Value()), args[1]->BooleanValue()); - } + v8::Local objectValue = maybeObject.As(); + output->raw->{{ field.name }} = Nan::ObjectWrap::Unwrap<{{ field.cppClassName }}>(objectValue)->GetValue(); + output->{{ field.jsFunctionName }}.Reset(objectValue); + } + } + {% endif %} + {% elsif field.isCallbackFunction %} + { + v8::Local maybeCallback = nodegit::safeGetField(inputObj, "{{ field.jsFunctionName }}"); + if (!maybeCallback.IsEmpty() && !maybeCallback->IsUndefined() && !maybeCallback->IsNull()) { + if (!maybeCallback->IsFunction() && !maybeCallback->IsObject()) { + return { + "Must pass Function or CallbackSpecifier to {{ field.jsFunctionName}}" + }; + } - instance->Wrap(args.This()); + std::unique_ptr callback; + uint32_t throttle = {% if field.return.throttle %}{{ field.return.throttle }}{% else %}0{% endif %}; + bool waitForResult = true; - NanReturnValue(args.This()); -} + if (maybeCallback->IsFunction()) { + callback.reset(new Nan::Callback(maybeCallback.As())); + } else { + v8::Local callbackSpecifier = maybeCallback.As(); + v8::Local maybeCallback = nodegit::safeGetField(callbackSpecifier, "callback"); + if (maybeCallback.IsEmpty() || !maybeCallback->IsFunction()) { + return { + "Must pass callback to CallbackSpecifier" + }; + } -Handle {{ cppClassName }}::New(void* raw, bool selfFreeing) { - NanEscapableScope(); + callback.reset(new Nan::Callback(maybeCallback.As())); - Handle argv[2] = { NanNew((void *)raw), NanNew(selfFreeing) }; - return NanEscapeScope(NanNew({{ cppClassName }}::constructor_template)->NewInstance(2, argv)); -} + v8::Local maybeThrottle = nodegit::safeGetField(callbackSpecifier, "throttle"); + if (!maybeThrottle.IsEmpty() && !maybeThrottle->IsUndefined() && !maybeThrottle->IsNull()) { + if (!maybeThrottle->IsNumber()) { + return { + "Must pass zero or positive number as throttle to CallbackSpecifier" + }; + } -{{ cType }} *{{ cppClassName }}::GetValue() { - return this->raw; -} + throttle = maybeThrottle->Uint32Value(Nan::GetCurrentContext()).FromJust(); + } -{{ cType }} **{{ cppClassName }}::GetRefValue() { - return this->raw == NULL ? NULL : &this->raw; -} + v8::Local maybeWaitForResult = nodegit::safeGetField(callbackSpecifier, "waitForResult"); + if (!maybeWaitForResult.IsEmpty() && !maybeWaitForResult->IsUndefined() && !maybeWaitForResult->IsNull()) { + if (!maybeWaitForResult->IsBoolean()) { + return { + "Must pass a boolean as waitForResult to callbackSpecifier" + }; + } + + waitForResult = Nan::To(maybeWaitForResult).FromJust(); + } + } + + output->{{ field.jsFunctionName }}.SetCallback(std::move(callback), throttle, waitForResult); + output->raw->{{ field.name }} = ({{ field.cType }}){{ field.jsFunctionName }}_cppCallback; + } + } + {% elsif field.isStructType %} + { + v8::Local maybeNestedObject = nodegit::safeGetField(inputObj, "{{ field.jsFunctionName }}"); + if (!maybeNestedObject.IsEmpty() && !maybeNestedObject->IsUndefined() && !maybeNestedObject->IsNull()) { + auto conversionResult = Configurable{{ field.cppClassName }}::fromJavascript(nodegitContext, maybeNestedObject); + if (!conversionResult.result) { + std::string error = "Failed to set {{ field.jsFunctionName }}: "; + error += conversionResult.error; + return { + error + }; + } + + auto child = conversionResult.result; + output->childCleanupVector.push_back(child); + output->raw->{{ field.name }} = *child->GetValue(); + } + } + {% elsif field.payloadFor %} + output->raw->{{ field.name }} = (void *)output.get(); + {% elsif field.cppClassName == 'String' %} + output->raw->{{ field.name }} = nullptr; + { + v8::Local maybeString = nodegit::safeGetField(inputObj, "{{ field.jsFunctionName }}"); + if (!maybeString.IsEmpty() && !maybeString->IsUndefined() && !maybeString->IsNull()) { + if (!maybeString->IsString()) { + return { + "Must pass string to {{ field.jsFunctionName }}" + }; + } + + Nan::Utf8String utf8String(maybeString.As()); + output->raw->{{ field.name }} = strdup(*utf8String); + } + } + {% elsif field.isCppClassIntType %} + { + v8::Local maybeNumber = nodegit::safeGetField(inputObj, "{{ field.jsFunctionName }}"); + if (!maybeNumber.IsEmpty() && !maybeNumber->IsUndefined() && !maybeNumber->IsNull()) { + if (!maybeNumber->IsNumber()) { + return { + "Must pass {{ field.cppClassName }} to {{ field.jsFunctionName }}" + }; + } + + output->raw->{{ field.name }} = maybeNumber->{{ field.cppClassName }}Value(); + } + } + {% else %} + { + v8::Local maybeNumber = nodegit::safeGetField(inputObj, "{{ field.jsFunctionName }}"); + if (!maybeNumber.IsEmpty() && !maybeNumber->IsUndefined() && !maybeNumber->IsNull()) { + if (!maybeNumber->IsNumber()) { + return { + "Must pass Int32 to {{ field.jsFunctionName }}" + }; + } + + output->raw->{{ field.name }} = static_cast<{{ field.cType }}>(maybeNumber->Int32Value(Nan::GetCurrentContext()).FromJust()); + } + } + {% endif %} + {% endif %} + {% endeach %} + + {% if isExtendedStruct %} + (({{ cType }}_extended *)output->raw)->payload = (void *)output.get(); + {% endif %} -void {{ cppClassName }}::ClearValue() { - this->raw = NULL; + return { + output + }; } -{% partial fieldAccessors . %} +{% partial configurableCallbacks %} -Persistent {{ cppClassName }}::constructor_template; +// force base class template instantiation, to make sure we get all the +// methods, statics, etc. +template class nodegit::ConfigurableClassWrapper<{{ cppClassName }}Traits>; diff --git a/generate/templates/templates/struct_header.h b/generate/templates/templates/struct_header.h index 471e6e31ef..ac05fb3543 100644 --- a/generate/templates/templates/struct_header.h +++ b/generate/templates/templates/struct_header.h @@ -1,11 +1,22 @@ +// generated from struct_header.h #ifndef {{ cppClassName|upper }}_H #define {{ cppClassName|upper }}_H -// generated from struct_header.h #include #include +#include + +#include "async_baton.h" +#include "async_worker.h" +#include "callback_wrapper.h" +#include "context.h" +#include "reference_counter.h" +#include "nodegit_wrapper.h" +#include "configurable_class_wrapper.h" +#include "v8_helpers.h" extern "C" { #include + #include {% each cDependencies as dependency %} #include <{{ dependency }}> {% endeach %} @@ -18,75 +29,127 @@ extern "C" { using namespace node; using namespace v8; -class {{ cppClassName }} : public ObjectWrap { - public: - {{ cppClassName }}({{ cType }}* raw, bool selfFreeing); - static Persistent constructor_template; - static void InitializeComponent (Handle target); - - {{ cType }} *GetValue(); - {{ cType }} **GetRefValue(); - void ClearValue(); - - static Handle New(void *raw, bool selfFreeing); +{%partial traits .%} +{% if isExtendedStruct %} +struct {{ cType }}_extended { + {{ cType }} raw; + void* payload; +}; +{% endif %} +{% if isReturnable %} + class {{ cppClassName }} : public NodeGitWrapper<{{ cppClassName }}Traits> { + // grant full access to base class + friend class NodeGitWrapper<{{ cppClassName }}Traits>; + + public: + {{ cppClassName }}({{ cType }}* raw, bool selfFreeing, v8::Local owner = v8::Local()); + {{ cppClassName }}(const {{ cppClassName }} &) = delete; + {{ cppClassName }}({{ cppClassName }} &&) = delete; + {{ cppClassName }} &operator=(const {{ cppClassName }} &) = delete; + {{ cppClassName }} &operator=({{ cppClassName }} &&) = delete; + static void InitializeComponent (v8::Local target, nodegit::Context *nodegitContext); + + private: + {{ cppClassName }}(); + ~{{ cppClassName }}(); + + void ConstructFields(); + + {% each fields as field %} + {% if not field.ignore %} + {% if not field.isEnum %} + {% if field.isLibgitType %} + Nan::Global {{ field.name }}; + {% endif %} + {% endif %} - bool selfFreeing; + static NAN_GETTER(Get{{ field.cppFunctionName }}); + static NAN_SETTER(Set{{ field.cppFunctionName }}); - {% each fields as field %} - {% if not field.ignore %} - {% if field.isCallbackFunction %} - static {{ field.return.type }} {{ field.name }}_cppCallback ( + {% endif %} + {% endeach %} + }; +{% endif %} + +class Configurable{{ cppClassName }} : public nodegit::ConfigurableClassWrapper<{{ cppClassName }}Traits> { + friend class nodegit::ConfigurableClassWrapper<{{ cppClassName }}Traits>; + +public: + static v8ConversionResult fromJavascript(nodegit::Context *nodegitContext, v8::Local input); + ~Configurable{{ cppClassName }}(); + + Configurable{{ cppClassName }}(const Configurable{{ cppClassName }} &) = delete; + Configurable{{ cppClassName }}(Configurable{{ cppClassName }} &&) = delete; + Configurable{{ cppClassName }} &operator=(const Configurable{{ cppClassName }} &) = delete; + Configurable{{ cppClassName }} &operator=(Configurable{{ cppClassName }} &&) = delete; + + {% each fields as field %} + {% if not field.ignore %} + {% if field.isCallbackFunction %} + static {{ field.return.type }} {{ field.jsFunctionName }}_cppCallback ( + {% each field.args|argsInfo as arg %} + {{ arg.cType }} {{ arg.name}} + {% if not arg.lastArg %} + , + {% endif %} + {% endeach %} + ); + + static void {{ field.jsFunctionName }}_cancelAsync(void *baton); + static void {{ field.jsFunctionName }}_async(void *baton); + static void {{ field.jsFunctionName }}_promiseCompleted(bool isFulfilled, nodegit::AsyncBaton *_baton, v8::Local result); + {% if field.return.type == 'void' %} + class {{ field.name|titleCase }}Baton : public nodegit::AsyncBatonWithNoResult { + public: {% each field.args|argsInfo as arg %} - {{ arg.cType }} {{ arg.name}} - {% if not arg.lastArg %} - , - {% endif %} + {{ arg.cType }} {{ arg.name }}; {% endeach %} - ); - static void {{ field.name }}_async(uv_async_t* req, int status); - static void {{ field.name }}_asyncPromisePolling(uv_async_t* req, int status); - struct {{ field.name|titleCase }}Baton { + {{ field.name|titleCase }}Baton() + : nodegit::AsyncBatonWithNoResult() { + } + }; + {% else %} + class {{ field.name|titleCase }}Baton : public nodegit::AsyncBatonWithResult<{{ field.return.type }}> { + public: {% each field.args|argsInfo as arg %} - {{ arg.cType }} {{ arg.name}}; + {{ arg.cType }} {{ arg.name }}; {% endeach %} - uv_async_t req; - {{ field.return.type }} result; - Persistent promise; - bool done; + {{ field.name|titleCase }}Baton(const {{ field.return.type }} &defaultResult) + : nodegit::AsyncBatonWithResult<{{ field.return.type }}>(defaultResult) { + } }; {% endif %} + static Configurable{{ cppClassName }} * {{ field.jsFunctionName }}_getInstanceFromBaton ( + {{ field.name|titleCase }}Baton *baton); {% endif %} - {% endeach %} - - private: - {{ cppClassName }}(); - ~{{ cppClassName }}(); - - void ConstructFields(); - - static NAN_METHOD(JSNewFunction); + {% endif %} + {% endeach %} - {% each fields as field %} - {% if not field.ignore %} - {% if not field.isEnum %} - {% if field.isLibgitType %} - Persistent {{ field.name }}; - {% elsif field.isCallbackFunction %} - NanCallback* {{ field.name }}; - {% elsif field.payloadFor %} - Persistent {{ field.name }}; +private: + Configurable{{ cppClassName }}(nodegit::Context *nodegitContext); + Configurable{{ cppClassName }}() = delete; + Nan::Global promiseError; + + {% each fields as field %} + {% if not field.ignore %} + {% if not field.isEnum %} + {% if field.isClassType %} + {% if field.cppClassName == 'GitOid' %} + {%-- We do not need to generate anything here --%} + {% elsif field.cppClassName == 'GitStrarray' %} + {%-- We do not need to generate anything here --%} + {% else %} + Nan::Global {{ field.jsFunctionName }}; {% endif %} + {% elsif field.isCallbackFunction %} + CallbackWrapper {{ field.jsFunctionName }}; {% endif %} - - static NAN_GETTER(Get{{ field.cppFunctionName }}); - static NAN_SETTER(Set{{ field.cppFunctionName }}); - {% endif %} - {% endeach %} + {% endif %} + {% endeach %} - {{ cType }} *raw; }; #endif diff --git a/guides/README.md b/guides/README.md index e4a2bdf14f..3fda23c7b5 100644 --- a/guides/README.md +++ b/guides/README.md @@ -12,7 +12,6 @@ description: Learning NodeGit - [Basics](install/) - [From source](install/from-source) - [Electron](install/electron/) -- [NW.js](install/nw.js/) *** diff --git a/guides/cloning/README.md b/guides/cloning/README.md index f5bf533331..8b8390f236 100644 --- a/guides/cloning/README.md +++ b/guides/cloning/README.md @@ -83,8 +83,10 @@ to passthrough the certificate check. *Note: this is not a problem with Windows or Linux* ``` javascript -cloneOptions.remoteCallbacks = { - certificateCheck: function() { return 1; } +cloneOptions.fetchOpts = { + callbacks: { + certificateCheck: function() { return 0; } + } }; ``` @@ -110,7 +112,7 @@ a function to attempt opening in this case. ``` javascript var errorAndAttemptOpen = function() { - return NodeGit.Repository.open(local); + return NodeGit.Repository.open(localPath); }; ``` diff --git a/guides/cloning/gh-two-factor/README.md b/guides/cloning/gh-two-factor/README.md index 11f6520fc9..a6d24d40dd 100644 --- a/guides/cloning/gh-two-factor/README.md +++ b/guides/cloning/gh-two-factor/README.md @@ -99,8 +99,10 @@ to passthrough the certificate check. *Note: this is not a problem with Windows or Linux* ``` javascript -cloneOptions.remoteCallbacks = { - certificateCheck: function() { return 1; } +cloneOptions.fetchOpts = { + callbacks: { + certificateCheck: function() { return 0; } + } }; ``` @@ -112,13 +114,15 @@ callback that expects credentials to be passed. This function will be attached below the above `certificateCheck`, and will respond back with the OAuth token. -The `remoteCallbacks` object now looks like this: +The `fetchOpts` object now looks like this: ``` javascript -cloneOptions.remoteCallbacks = { - certificateCheck: function() { return 1; }, - credentials: function() { - return NodeGit.Cred.userpassPlaintextNew(GITHUB_TOKEN, "x-oauth-basic"); +cloneOptions.fetchOpts = { + callbacks: { + certificateCheck: function() { return 0; }, + credentials: function() { + return NodeGit.Cred.userpassPlaintextNew(GITHUB_TOKEN, "x-oauth-basic"); + } } }; ``` @@ -145,7 +149,7 @@ a function to attempt opening in this case. ``` javascript var errorAndAttemptOpen = function() { - return NodeGit.Repository.open(local); + return NodeGit.Repository.open(localPath); }; ``` diff --git a/guides/cloning/gh-two-factor/index.js b/guides/cloning/gh-two-factor/index.js index 113f3fe067..945aac3514 100644 --- a/guides/cloning/gh-two-factor/index.js +++ b/guides/cloning/gh-two-factor/index.js @@ -20,10 +20,12 @@ var cloneOptions = {}; // This is a required callback for OS X machines. There is a known issue // with libgit2 being able to verify certificates from GitHub. -cloneOptions.remoteCallbacks = { - certificateCheck: function() { return 1; }, - credentials: function() { - return NodeGit.Cred.userpassPlaintextNew(GITHUB_TOKEN, "x-oauth-basic"); +cloneOptions.fetchOpts = { + callbacks: { + certificateCheck: function() { return 0; }, + credentials: function() { + return NodeGit.Credential.userpassPlaintextNew(GITHUB_TOKEN, "x-oauth-basic"); + } } }; diff --git a/guides/cloning/index.js b/guides/cloning/index.js index 2b0d7c9ff5..ec455fbd7f 100644 --- a/guides/cloning/index.js +++ b/guides/cloning/index.js @@ -16,8 +16,10 @@ var cloneOptions = {}; // This is a required callback for OS X machines. There is a known issue // with libgit2 being able to verify certificates from GitHub. -cloneOptions.remoteCallbacks = { - certificateCheck: function() { return 1; } +cloneOptions.fetchOpts = { + callbacks: { + certificateCheck: function() { return 0; } + } }; // Invoke the clone operation and store the returned Promise. diff --git a/guides/cloning/ssh-with-agent/README.md b/guides/cloning/ssh-with-agent/README.md index 9cc1110691..46a72b823a 100644 --- a/guides/cloning/ssh-with-agent/README.md +++ b/guides/cloning/ssh-with-agent/README.md @@ -81,8 +81,10 @@ to passthrough the certificate check. *Note: this is not a problem with Windows or Linux* ``` javascript -cloneOptions.remoteCallbacks = { - certificateCheck: function() { return 1; } +cloneOptions.fetchOpts = { + callbacks: { + certificateCheck: function() { return 0; } + } }; ``` @@ -95,13 +97,15 @@ This function will be attached below the above `certificateCheck`, and will respond back with the credentials from the agent. You'll notice we handle the second argument passed to credentials, `userName`. -The `remoteCallbacks` object now looks like this: +The `fetchOpts` object now looks like this: ``` javascript -cloneOptions.remoteCallbacks = { - certificateCheck: function() { return 1; }, - credentials: function(url, userName) { - return NodeGit.Cred.sshKeyFromAgent(userName); +cloneOptions.fetchOpts = { + callbacks: { + certificateCheck: function() { return 0; }, + credentials: function(url, userName) { + return NodeGit.Cred.sshKeyFromAgent(userName); + } } }; ``` @@ -133,7 +137,7 @@ a function to attempt opening in this case. ``` javascript var errorAndAttemptOpen = function() { - return NodeGit.Repository.open(local); + return NodeGit.Repository.open(localPath); }; ``` diff --git a/guides/cloning/ssh-with-agent/index.js b/guides/cloning/ssh-with-agent/index.js index a507ba789f..655f07e242 100644 --- a/guides/cloning/ssh-with-agent/index.js +++ b/guides/cloning/ssh-with-agent/index.js @@ -15,14 +15,16 @@ var cloneOptions = {}; // This is a required callback for OS X machines. There is a known issue // with libgit2 being able to verify certificates from GitHub. -cloneOptions.remoteCallbacks = { - certificateCheck: function() { return 1; }, - - // Credentials are passed two arguments, url and username. We forward the - // `userName` argument to the `sshKeyFromAgent` function to validate - // authentication. - credentials: function(url, userName) { - return NodeGit.Cred.sshKeyFromAgent(userName); +cloneOptions.fetchOpts = { + callbacks: { + certificateCheck: function() { return 0; }, + + // Credentials are passed two arguments, url and username. We forward the + // `userName` argument to the `sshKeyFromAgent` function to validate + // authentication. + credentials: function(url, userName) { + return NodeGit.Credential.sshKeyFromAgent(userName); + } } }; diff --git a/guides/install/electron/README.md b/guides/install/electron/README.md index 794c4084a6..99e67084a8 100644 --- a/guides/install/electron/README.md +++ b/guides/install/electron/README.md @@ -12,24 +12,14 @@ description: How to install NodeGit with Electron Install for Electron ---------------------- -For an application that is built using [Electron](https://github.com/atom/Electron) you'll need to have the `engines.electron` set to the version of Electron that you are targeting in your root `package.json` file. +Please see the official electron docs [here](https://github.com/electron/electron/blob/master/docs/tutorial/using-native-node-modules.md) -For example if you have an Electron app that's targeting version 0.20.7 your package.json file would look something like: - -```json -{ - "name": "elec-app", - "displayName": "My Electron app", - "version": "0.0.1", - "description": "", - "main": "main.js", - "author": "", - "engines": { - "electron": "0.20.7" - } -} +For a slightly simpler version of the first method, use an `.npmrc` file. For example if you have an Electron app that's targeting version 1.2.8 your .npmrc file would look something like: +``` +runtime = electron +target = 1.2.8 +target_arch = x64 +disturl = https://atom.io/download/atom-shell ``` -And when doing an `npm install` or `apm install` inside of your Electron's root folder it will compile NodeGit targeting that version of Electron during the install. - -*NOTE: there are no pre-built binaries for Electron, you must rebuild NodeGit. Visit our [building guides](../from-source) for help* +*NOTE: We try to provide prebuilt binaries for electron, but we don't always have them available for every version. If prebuilts are not available and you have trouble with local compilation, visit our [building guides](../from-source) for help* diff --git a/guides/install/from-source/README.md b/guides/install/from-source/README.md index c85e2e3faf..64bfce18b3 100644 --- a/guides/install/from-source/README.md +++ b/guides/install/from-source/README.md @@ -64,6 +64,16 @@ npm install nodegit --msvs_version=2013 # Or whatever version you've installed. ``` +### Electron and OpenSSL ### +A local version of OpenSSL is required when building for Electron. This is due to Electron using BoringSSL, as we are not able to link to it like we are OpenSSL in Node. + +`acquireOpenSSL.js` will attempt to download OpenSSL prebuilts from S3. If preferred, it can also be built locally by setting the environment variable `npm_config_openssl_bin_url=skip`. On macOS, this should Just Work(tm). On Windows, things are a little trickier. + +- We rely on the Visual Studio dev tools to be installed, specifically `vcvarsall.bat` to provide access to the tools. If this is not in the default location for VS2017, you'll need to `npm config set vcvarsall_path ` or set the environment variable `npm_config_vcvarsall_path` pointing to it. +- See [Compilation and Installation](https://wiki.openssl.org/index.php/Compilation_and_Installation#Windows) regarding required dependencies, specifically `Perl` (Strawberry Perl is known to work) and `NASM`. Make sure they're on the PATH. + +Alternatively, you can provide your own OpenSSL binaries and headers. These can either go in `vendor/openssl` (e.g. `/vendor/openssl/{lib,bin,include}` should exist) or in an external directory located by `npm config set openssl_dir ` or the environment variable `npm_config_openssl_dir`. Additionally, you can `npm config set openssl_bin_url ` or the environment variable `npm_config_openssl_bin_url` to download and extract prebuilt binaries (only supports tar.gz files). `npm config set openssl_bin_sha256 ` or the environment variable `npm_config_openssl_bin_sha256` can be set to verify the download. + ##### A note on environment variables in Windows ##### In many of the npm scripts (and examples above), things are run like `BUILD_ONLY=true npm install`. This sets the `BUILD_ONLY` environment variable @@ -76,7 +86,7 @@ See here for more details: ### Debug build: ### -In order to track down possible bugs, you will need a debug buid so you +In order to track down possible bugs, you will need a debug build so you can get a backtrace with [gdb](http://www.gnu.org/software/gdb/) or [lldb](http://lldb.llvm.org/). diff --git a/guides/install/nw.js/README.md b/guides/install/nw.js/README.md deleted file mode 100644 index 5eb978b3ab..0000000000 --- a/guides/install/nw.js/README.md +++ /dev/null @@ -1,33 +0,0 @@ ---- -layout: full -menu_item: guides -title: NW.js -description: How to install NodeGit with NW.js ---- - -[Return to all guides](../../) - -* * * - -Install for nwjs ----------------- - -For an application that is built using [NW.js](https://github.com/nwjs/nw.js) you'll need to have the `engines['nw.js']` set to the version of NW.js that you are targeting in your root `package.json` file. - -For example if you have an NS.js app that's targeting version 0.12.0 your package.json file would look something like - -```json -{ - "name": "nw-app", - "displayName": "My NW.js app", - "version": "0.0.1", - "description": "", - "engines": { - "nw.js": "0.12.0" - } -} -``` - -And when doing an `npm install` inside of your NW.js app's root folder it will compile NodeGit targeting that version of NW.js during the install. - -*NOTE: there are no pre-built binaries for NW.js, you must rebuild NodeGit. Visit our [building guides](../from-source) for help* diff --git a/guides/repositories/README.md b/guides/repositories/README.md index 65cb063c2e..a436a24c93 100644 --- a/guides/repositories/README.md +++ b/guides/repositories/README.md @@ -85,7 +85,7 @@ You can pass a second function parameter to the `.then` method that will have the reason why a promise failed in it's first argument. ``` javascript -NodeGit.Repository.open(pathToRepo).then(function (sucessfulResult) { +NodeGit.Repository.open(pathToRepo).then(function (successfulResult) { // This is the first function of the then which contains the successfully // calculated result of the promise }, function (reasonForFailure) { @@ -100,7 +100,7 @@ You can also append a `.catch` to the end of a promise chain which will receive any promise failure that isn't previously caught ``` javascript -NodeGit.Repository.open(pathToRepo).then(function (sucessfulResult) { +NodeGit.Repository.open(pathToRepo).then(function (successfulResult) { // This is the first function of the then which contains the successfully // calculated result of the promise }) @@ -115,7 +115,7 @@ If you append a `.done` at the end of your chain, you will have any error that wasn't previously handled by the above 2 methods thrown. ``` javascript -NodeGit.Repository.open(pathToRepo).then(function (sucessfulResult) { +NodeGit.Repository.open(pathToRepo).then(function (successfulResult) { // This is the first function of the then which contains the successfully // calculated result of the promise }) diff --git a/lib/README.md b/lib/README.md new file mode 100644 index 0000000000..3d12686af6 --- /dev/null +++ b/lib/README.md @@ -0,0 +1,3 @@ +## /lib + + Contains javascript extensions for the generated NodeGit modules. Any additional behavior on top of the standard libgit2 behavior will be found here. diff --git a/lib/attr.js b/lib/attr.js new file mode 100644 index 0000000000..8ecdd5eeeb --- /dev/null +++ b/lib/attr.js @@ -0,0 +1,20 @@ +var util = require("util"); +var NodeGit = require("../"); + +NodeGit.Attr.STATES = {}; +var DEPRECATED_STATES = { + UNSPECIFIED_T: "UNSPECIFIED", + TRUE_T: "TRUE", + FALSE_T: "FALSE", + VALUE_T: "STRING" +}; + +Object.keys(DEPRECATED_STATES).forEach((key) => { + const newKey = DEPRECATED_STATES[key]; + Object.defineProperty(NodeGit.Attr.STATES, key, { + get: util.deprecate( + () => NodeGit.Attr.VALUE[newKey], + `Use NodeGit.Attr.VALUE.${newKey} instead of NodeGit.Attr.STATES.${key}.` + ) + }); +}); diff --git a/lib/blob.js b/lib/blob.js index f55ff27dab..be63312485 100644 --- a/lib/blob.js +++ b/lib/blob.js @@ -1,8 +1,10 @@ +var util = require("util"); var NodeGit = require("../"); var Blob = NodeGit.Blob; var LookupWrapper = NodeGit.Utils.lookupWrapper; var TreeEntry = NodeGit.TreeEntry; +var _filteredContent = Blob.filteredContent; /** * Retrieves the blob pointed to by the oid @@ -22,15 +24,6 @@ Blob.prototype.content = function() { return this.rawcontent().toBuffer(this.rawsize()); }; -/** - * Retrieve the Blob's content as String. - * - * @return {String} Contents as a string. - */ -Blob.prototype.toString = function() { - return this.content().toString(); -}; - /** * Retrieve the Blob's type. * @@ -41,3 +34,18 @@ Blob.prototype.filemode = function() { return this.isBinary() ? FileMode.EXECUTABLE : FileMode.BLOB; }; + +/** + * Retrieve the Blob's content as String. + * + * @return {String} Contents as a string. + */ +Blob.prototype.toString = function() { + return this.content().toString(); +}; + +Blob.filteredContent = util.deprecate( + _filteredContent, + "NodeGit.Blob.filteredContent is deprecated" + + " use NodeGit.Blob.prototype.filter instead." +); diff --git a/lib/branch.js b/lib/branch.js new file mode 100644 index 0000000000..bc4b234439 --- /dev/null +++ b/lib/branch.js @@ -0,0 +1,19 @@ +var NodeGit = require("../"); +var Branch = NodeGit.Branch; + +var _remoteName = Branch.remoteName; + +/** + * Retrieve the Branch's Remote Name as a String. + * + * @async + * @param {Repository} repo The repo to get the remote name from + * @param {String} the refname of the branch + * @return {String} remote name as a string. + */ +Branch.remoteName = function(repo, remoteRef) { + return _remoteName.call(this, repo, remoteRef) + .then(function(remoteNameBuffer) { + return remoteNameBuffer.toString(); + }); +}; diff --git a/lib/buf.js b/lib/buf.js new file mode 100644 index 0000000000..aec6ba693d --- /dev/null +++ b/lib/buf.js @@ -0,0 +1,43 @@ +var util = require("util"); +var NodeGit = require("../"); +var Buf = NodeGit.Buf; + +var _set = Buf.prototype.set; +var _grow = Buf.prototype.grow; +var _isBinary = Buf.prototype.isBinary; +var _containsNul = Buf.prototype.containsNul; + +/** + * Sets the content of a GitBuf to a string. + * @param {string} The utf8 value to set in the buffer. + * The string will be null terminated. + */ +var _setString = function(content) { + const buf = Buffer.from(content + "\0", "utf8"); + this.set(buf, buf.length); +}; + +Buf.prototype.set = util.deprecate( + _set, + "NodeGit.Buf.prototype.set is deprecated." +); + +Buf.prototype.setString = util.deprecate( + _setString, + "NodeGit.Buf.prototype.setString is deprecated." +); + +Buf.prototype.grow = util.deprecate( + _grow, + "NodeGit.Buf.prototype.grow is deprecated." +); + +Buf.prototype.isBinary = util.deprecate( + _isBinary, + "NodeGit.Buf.prototype.isBinary is deprecated." +); + +Buf.prototype.containsNul = util.deprecate( + _containsNul, + "NodeGit.Buf.prototype.containsNul is deprecated." +); \ No newline at end of file diff --git a/lib/checkout.js b/lib/checkout.js deleted file mode 100644 index 01f0ef59b2..0000000000 --- a/lib/checkout.js +++ /dev/null @@ -1,51 +0,0 @@ -var NodeGit = require("../"); -var normalizeOptions = NodeGit.Utils.normalizeOptions; - -var Checkout = NodeGit.Checkout; -var _head = Checkout.head; -var _index = Checkout.index; -var _tree = Checkout.tree; - -/** -* Patch head checkout to automatically coerce objects. -* -* @async -* @param {Repository} repo The repo to checkout head -* @param {CheckoutOptions} [options] Options for the checkout -* @return {Void} checkout complete -*/ -Checkout.head = function(url, options) { - options = normalizeOptions(options, NodeGit.CheckoutOptions); - - return _head.call(this, url, options); -}; - -/** -* Patch index checkout to automatically coerce objects. -* -* @async -* @param {Repository} repo The repo to checkout an index -* @param {Index} The index to checkout -* @param {CheckoutOptions} [options] Options for the checkout -* @return {Void} checkout complete -*/ -Checkout.index = function(repo, index, options) { - options = normalizeOptions(options, NodeGit.CheckoutOptions); - - return _index.call(this, repo, index, options); -}; - -/** -* Patch tree checkout to automatically coerce objects. -* -* @async -* @param {Repository} repo -* @param {Oid|Tree|Commit|Reference} treeish -* @param {CheckoutOptions} [options] -* @return {Void} checkout complete -*/ -Checkout.tree = function(repo, treeish, options) { - options = normalizeOptions(options, NodeGit.CheckoutOptions); - - return _tree.call(this, repo, treeish, options); -}; diff --git a/lib/cherrypick.js b/lib/cherrypick.js deleted file mode 100644 index 8afd9fc17b..0000000000 --- a/lib/cherrypick.js +++ /dev/null @@ -1,73 +0,0 @@ -var NodeGit = require("../"); -var shallowClone = require("./utils/shallow_clone"); -var normalizeOptions = NodeGit.Utils.normalizeOptions; - -var Cherrypick = NodeGit.Cherrypick; -var _cherrypick = Cherrypick.cherrypick; -var _commit = Cherrypick.commit; - -/** -* Cherrypick a commit and, changing the index and working directory -* -* @async -* @param {Repository} repo The repo to checkout head -* @param {Commit} commit The commit to cherrypick -* @param {CherrypickOptions} [options] Options for the cherrypick -* @return {int} 0 on success, -1 on failure -*/ -Cherrypick.cherrypick = function(repo, commit, options) { - var mergeOpts; - var checkoutOpts; - - if (options) { - options = shallowClone(options); - mergeOpts = options.mergeOpts; - checkoutOpts = options.checkoutOpts; - delete options.mergeOpts; - delete options.checkoutOpts; - } - - options = normalizeOptions(options, NodeGit.CherrypickOptions); - - if (mergeOpts) { - options.mergeOpts = - normalizeOptions(mergeOpts, NodeGit.MergeOptions); - } - - if (checkoutOpts) { - options.checkoutOpts = - normalizeOptions(checkoutOpts, NodeGit.CheckoutOptions); - } - - return _cherrypick.call(this, repo, commit, options); -}; - -/** -* Cherrypicks the given commit against "our" commit, producing an index that -* reflects the result of the cherrypick. The index is not backed by a repo. -* -* @async -* @param {Repository} repo The repo to cherrypick commits -* @param {Commit} cherrypick_commit The commit to cherrypick -* @param {Commit} our_commit The commit to revert against -* @param {int} mainline The parent of the revert commit (1 or -* 2) if it's a merge, 0 otherwise -* @param {MergeOptions} [merge_options] Merge options for the cherrypick -* @return {int} 0 on success, -1 on failure -*/ -Cherrypick.commit = function( - repo, - cherrypick_commit, - our_commit, - mainline, - merge_options) { - merge_options = normalizeOptions(merge_options, NodeGit.MergeOptions); - - return _commit.call( - this, - repo, - cherrypick_commit, - our_commit, - mainline, - merge_options); -}; diff --git a/lib/clone.js b/lib/clone.js deleted file mode 100644 index 5b9a7710f2..0000000000 --- a/lib/clone.js +++ /dev/null @@ -1,60 +0,0 @@ -var NodeGit = require("../"); -var shallowClone = require("./utils/shallow_clone"); -var normalizeOptions = NodeGit.Utils.normalizeOptions; - -var Clone = NodeGit.Clone; -var clone = Clone.clone; - -/** - * Patch repository cloning to automatically coerce objects. - * - * @async - * @param {String} url url of the repository - * @param {String} local_path local path to store repository - * @param {CloneOptions} [options] - * @return {Repository} repo - */ -Clone.clone = function(url, local_path, options) { - var remoteCallbacks = {}; - var fetchOpts = {}; - - if (options) { - options = shallowClone(options); - if (options.fetchOpts) { - fetchOpts = shallowClone(options.fetchOpts); - } - delete options.fetchOpts; - } - - options = normalizeOptions(options, NodeGit.CloneOptions); - - if (fetchOpts.callbacks) { - remoteCallbacks = shallowClone(fetchOpts.callbacks); - delete fetchOpts.callbacks; - } - - fetchOpts = normalizeOptions(fetchOpts, NodeGit.FetchOptions); - - fetchOpts.callbacks = - normalizeOptions(remoteCallbacks, NodeGit.RemoteCallbacks); - - if (options) { - options.fetchOpts = fetchOpts; - } - - // This is required to clean up after the clone to avoid file locking - // issues in Windows and potentially other issues we don't know about. - var freeRepository = function(repository) { - repository.free(); - }; - - // We want to provide a valid repository object, so reopen the repository - // after clone and cleanup. - var openRepository = function() { - return NodeGit.Repository.open(local_path); - }; - - return clone.call(this, url, local_path, options) - .then(freeRepository) - .then(openRepository); -}; diff --git a/lib/commit.js b/lib/commit.js index 1b49acb18c..8eb561e585 100644 --- a/lib/commit.js +++ b/lib/commit.js @@ -1,9 +1,12 @@ var events = require("events"); -var Promise = require("nodegit-promise"); +var fp = require("lodash/fp"); var NodeGit = require("../"); var Commit = NodeGit.Commit; var LookupWrapper = NodeGit.Utils.lookupWrapper; +var _amend = Commit.prototype.amend; +var _parent = Commit.prototype.parent; + /** * Retrieves the commit pointed to by the oid * @async @@ -14,19 +17,213 @@ var LookupWrapper = NodeGit.Utils.lookupWrapper; Commit.lookup = LookupWrapper(Commit); /** - * Retrieve the SHA. - * @return {String} + * @async + * @param {Number} n + * @return {Commit} */ -Commit.prototype.sha = function() { - return this.id().toString(); +Commit.prototype.parent = function(n) { + var repo = this.repo; + return _parent.call(this, n).then(p => { + p.repo = repo; + return p; + }); }; /** - * Retrieve the commit time as a unix timestamp. - * @return {Number} + * Amend a commit + * @async + * @param {String} update_ref + * @param {Signature} author + * @param {Signature} committer + * @param {String} message_encoding + * @param {String} message + * @param {Tree|Oid} tree + * @return {Oid} */ -Commit.prototype.timeMs = function() { - return this.time() * 1000; +Commit.prototype.amend = function ( + updateRef, author, committer, message_encoding, message, tree) { + var repo = this.repo; + var _this = this; + var treePromise; + + if (tree instanceof NodeGit.Oid){ + treePromise = repo.getTree(tree); + } else { + treePromise = Promise.resolve(tree); + } + + return treePromise + .then(function(treeObject){ + return _amend.call(_this, + updateRef, + author, + committer, + message_encoding, + message, + treeObject + ); + }); +}; + +/** + * Amend a commit with the given signature + * @async + * @param {String} updateRef + * @param {Signature} author + * @param {Signature} committer + * @param {String} messageEncoding + * @param {String} message + * @param {Tree|Oid} tree + * @param {Function} onSignature Callback to be called with string to be signed + * @return {Oid} +*/ +Commit.prototype.amendWithSignature = function( + updateRef, + author, + committer, + messageEncoding, + message, + tree, + onSignature +) { + let repo = this.repo; + let parentOids = this.parents(); + let _this = this; + let promises = []; + + if (tree instanceof NodeGit.Oid) { + promises.push(repo.getTree(tree)); + } else { + promises.push(Promise.resolve(tree)); + } + + parentOids.forEach(function (parentOid) { + promises.push(repo.getCommit(parentOid)); + }); + + let treeObject; + let parents; + let commitContent; + let commit; + let skippedSigning; + let resolvedAuthor; + let resolvedCommitter; + let resolvedMessageEncoding; + let resolvedMessage; + let resolvedTree; + + let createCommitPromise = Promise.all(promises) + .then(function(results) { + treeObject = fp.head(results); + parents = fp.tail(results); + return _this.getTree(); + }) + .then(function(commitTreeResult) { + let commitTree = commitTreeResult; + + let truthyArgs = fp.omitBy( + fp.isNil, + { + author, + committer, + messageEncoding, + message, + tree: treeObject + } + ); + + let commitFields = { + author: _this.author(), + committer: _this.committer(), + messageEncoding: _this.messageEncoding(), + message: _this.message(), + tree: commitTree + }; + + ({ + author: resolvedAuthor, + committer: resolvedCommitter, + messageEncoding: resolvedMessageEncoding, + message: resolvedMessage, + tree: resolvedTree + } = fp.assign( + commitFields, + truthyArgs + )); + + return Commit.createBuffer( + repo, + resolvedAuthor, + resolvedCommitter, + resolvedMessageEncoding, + resolvedMessage, + resolvedTree, + parents.length, + parents + ); + }) + .then(function(commitContentResult) { + commitContent = commitContentResult; + if (!commitContent.endsWith("\n")) { + commitContent += "\n"; + } + return onSignature(commitContent); + }) + .then(function({ code, field, signedData }) { + switch (code) { + case NodeGit.Error.CODE.OK: + return Commit.createWithSignature( + repo, + commitContent, + signedData, + field + ); + case NodeGit.Error.CODE.PASSTHROUGH: + skippedSigning = true; + return Commit.create( + repo, + updateRef, + resolvedAuthor, + resolvedCommitter, + resolvedMessageEncoding, + resolvedMessage, + resolvedTree, + parents.length, + parents + ); + default: { + const error = new Error( + `Commit.amendWithSignature threw with error code ${code}` + ); + error.errno = code; + throw error; + } + } + }); + + if (!updateRef) { + return createCommitPromise; + } + + return createCommitPromise + .then(function(commitOid) { + if (skippedSigning) { + return commitOid; + } + + return repo.getCommit(commitOid) + .then(function(commitResult) { + commit = commitResult; + return repo.getReference(updateRef); + }).then(function(ref) { + return ref.setTarget( + commitOid, + `commit (amend): ${commit.summary()}` + ); + }).then(function() { + return commitOid; + }); + }); }; /** @@ -38,13 +235,43 @@ Commit.prototype.date = function() { }; /** - * Get the tree associated with this commit. + * Generate an array of diff trees showing changes between this commit + * and its parent(s). * * @async - * @return {Tree} + * @return {Array} an array of diffs */ -Commit.prototype.getTree = function(callback) { - return this.repo.getTree(this.treeId(), callback); +Commit.prototype.getDiff = function() { + return this.getDiffWithOptions(null); +}; + +/** + * Generate an array of diff trees showing changes between this commit + * and its parent(s). + * + * @async + * @param {Object} options + * @return {Array} an array of diffs + */ +Commit.prototype.getDiffWithOptions = function(options) { + var commit = this; + + return commit.getTree().then(function(thisTree) { + return commit.getParents().then(function(parents) { + var diffs; + if (parents.length) { + diffs = parents.map(function(parent) { + return parent.getTree().then(function(parentTree) { + return thisTree.diffWithOptions(parentTree, options); + }); + }); + } else { + diffs = [thisTree.diffWithOptions(null, options)]; + } + + return Promise.all(diffs); + }); + }); }; /** @@ -55,18 +282,63 @@ Commit.prototype.getTree = function(callback) { * @param {String} path * @return {TreeEntry} */ -Commit.prototype.getEntry = function(path, callback) { +Commit.prototype.getEntry = function(path) { return this.getTree().then(function(tree) { - return tree.getEntry(path).then(function(entry) { - if (typeof callback === "function") { - callback(null, entry); - } + return tree.getEntry(path); + }); +}; - return entry; - }); - }, callback); +/** + * Retrieve the commit's parents as commit objects. + * + * @async + * @param {number} limit Optional amount of parents to return. + * @return {Array} array of commits + */ +Commit.prototype.getParents = function(limit) { + var parents = []; + + // If no limit was set, default to the maximum parents. + limit = typeof limit === "number" ? limit : this.parentcount(); + limit = Math.min(limit, this.parentcount()); + + for (var i = 0; i < limit; i++) { + var oid = this.parentId(i); + var parent = this.repo.getCommit(oid); + + parents.push(parent); + } + + // Wait for all parents to complete, before returning. + return Promise.all(parents); }; +/** + * @typedef extractedSignature + * @type {Object} + * @property {String} signature the signature of the commit + * @property {String} signedData the extracted signed data + */ + +/** + * Retrieve the signature and signed data for a commit. + * @param {String} field Optional field to get from the signature, + * defaults to gpgsig + * @return {extractedSignature} + */ +Commit.prototype.getSignature = function(field) { + return Commit.extractSignature(this.repo, this.id(), field); +}; + +/** + * Get the tree associated with this commit. + * + * @async + * @return {Tree} + */ +Commit.prototype.getTree = function() { + return this.repo.getTree(this.treeId()); +}; /** * Walk the history from this commit backwards. @@ -94,12 +366,12 @@ Commit.prototype.history = function() { event.start = function() { revwalk.walk(oid, function commitRevWalk(error, commit) { if (error) { - return event.emit("error", error); - } - - if (!commit) { - event.emit("end", commits); - return; + if (error.errno === NodeGit.Error.CODE.ITEROVER) { + event.emit("end", commits); + return; + } else { + return event.emit("error", error); + } } event.emit("commit", commit); @@ -110,49 +382,25 @@ Commit.prototype.history = function() { return event; }; - /** - * Retrieve the commit's parents as commit objects. + * Get the specified parent of the commit. * + * @param {number} the position of the parent, starting from 0 * @async - * @param {number} limit Optional amount of parents to return. - * @param {Function} callback - * @return {Array} array of commits + * @return {Commit} the parent commit at the specified position */ -Commit.prototype.getParents = function(limit, callback) { - var parents = []; - - // Shift arguments. - if (typeof limit === "function") { - callback = limit; - } - - // If no limit was set, default to the maximum parents. - limit = typeof limit === "number" ? limit : this.parentcount(); - limit = Math.min(limit, this.parentcount()); - - for (var i = 0; i < limit; i++) { - var oid = this.parentId(i); - var parent = this.repo.getCommit(oid); - - parents.push(parent); - } - - // Wait for all parents to complete, before returning. - return Promise.all(parents).then(function(parents) { - if (typeof callback === "function") { - callback(null, parents); - } - - return parents; - }, callback); +Commit.prototype.parent = function (id) { + var repository = this.repo; + return _parent.call(this, id).then(function(parent) { + parent.repo = repository; + return parent; + }); }; /** - * Retrieve the commit"s parent shas. + * Retrieve the commit's parent shas. * - * @param {Function} callback - * @return {Array} array of oids + * @return {Array} array of oids */ Commit.prototype.parents = function() { var result = []; @@ -165,76 +413,20 @@ Commit.prototype.parents = function() { }; /** - * Generate an array of diff trees showing changes between this commit - * and its parent(s). - * - * @async - * @param {Function} callback - * @return {Array} an array of diffs + * Retrieve the SHA. + * @return {String} */ -Commit.prototype.getDiff = function(callback) { - var commit = this; - - return commit.getTree().then(function(thisTree) { - return commit.getParents().then(function(parents) { - var diffs; - if (parents.length) { - diffs = parents.map(function(parent) { - return parent.getTree().then(function(parentTree) { - return thisTree.diff(parentTree); - }); - }); - } else { - diffs = [thisTree.diff(null)]; - } - - return Promise.all(diffs); - }); - }).then(function(diffs) { - if (typeof callback === "function") { - callback(null, diffs); - } - - return diffs; - }, callback); +Commit.prototype.sha = function() { + return this.id().toString(); }; /** - * Amend a commit - * @async - * @param {String} update_ref - * @param {Signature} author - * @param {Signature} committer - * @param {String} message_encoding - * @param {String} message - * @param {Tree|Oid} tree - * @param {Oid} callback + * Retrieve the commit time as a unix timestamp. + * @return {Number} */ -var amend = Commit.prototype.amend; -Commit.prototype.amend = function ( - updateRef, author, committer, message_encoding, message, tree, callback) { - var repo = this.repo; - var _this = this; - var treePromise; - - if (tree instanceof NodeGit.Oid){ - treePromise = repo.getTree(tree); - } else { - treePromise = Promise.resolve(tree); - } - - return treePromise - .then(function(treeObject){ - return amend.call(_this, - updateRef, - author, - committer, - message_encoding, - message, - treeObject - ); - }); - }; +Commit.prototype.timeMs = function() { + return this.time() * 1000; +}; /** * The sha of this commit diff --git a/lib/config.js b/lib/config.js index 1527ede7be..37b792da85 100644 --- a/lib/config.js +++ b/lib/config.js @@ -1,8 +1,48 @@ +var util = require("util"); var NodeGit = require("../"); var Config = NodeGit.Config; +var _getBool = Config.prototype.getBool; +var _setBool = Config.prototype.setBool; + +/** + * @async + * @param {String} name The variable's name + * @return {Boolean} The variable's value + */ +Config.prototype.getBool = function(name) { + return _getBool.call(this, name) + .then(result => Boolean(result)); +}; + +/** + * @async + * @param {String} name The variable's name + * @param {Boolean} name The variable's value + * @return {Number} 0 or an error code + */ +Config.prototype.setBool = function(name, value) { + return _setBool.call(this, name, value ? 1 : 0); +}; + // Backwards compatibility. Config.prototype.getString = function() { return this.getStringBuf.apply(this, arguments); }; + +NodeGit.Enums.CVAR = {}; +var DEPRECATED_CVAR_ENUMS = [ + "FALSE", + "TRUE", + "INT32", + "STRING" +]; +DEPRECATED_CVAR_ENUMS.forEach((key) => { + Object.defineProperty(NodeGit.Enums.CVAR, key, { + get: util.deprecate( + () => Config.MAP[key], + `Use NodeGit.Config.MAP.${key} instead of NodeGit.Enums.CVAR.${key}.` + ) + }); +}); diff --git a/lib/convenient_hunk.js b/lib/convenient_hunk.js deleted file mode 100644 index 37e78b5bed..0000000000 --- a/lib/convenient_hunk.js +++ /dev/null @@ -1,55 +0,0 @@ -var NodeGit = require("../"); -var Promise = require("nodegit-promise"); -var ConvenientLine = NodeGit.ConvenientLine; - -function ConvenientHunk(hunk, linesInHunk, patch, i) { - this.hunk = hunk; - this.linesInHunk = linesInHunk; - this.patch = patch; - this.i = i; -} - -/** - * Diff header string that represents the context of this hunk - * of the diff. Something like `@@ -169,14 +167,12 @@ ...` - * @return {String} - */ -ConvenientHunk.prototype.header = function() { - return this.hunk.header(); -}; - -/** - * Number of lines in this hunk - * @return {Number} - */ -ConvenientHunk.prototype.size = function() { - return this.linesInHunk; -}; - -/** - * The lines in this hunk - * @async - * @return {Array} a promise that resolves to an array of - * ConvenientLines - */ -ConvenientHunk.prototype.lines = function() { - var _this = this; - var size = _this.size(); - var linePromises = []; - var i; - - function makeLinePromise(i) { - return _this.patch.getLineInHunk(_this.i, i) - .then(function(line) { - return new ConvenientLine(line, i); - }); - } - - for (i = 0; i < size; i++) { - linePromises.push(makeLinePromise(i)); - } - - return Promise.all(linePromises); -}; - -NodeGit.ConvenientHunk = ConvenientHunk; diff --git a/lib/convenient_hunks.js b/lib/convenient_hunks.js new file mode 100644 index 0000000000..ef8070d061 --- /dev/null +++ b/lib/convenient_hunks.js @@ -0,0 +1,61 @@ +var NodeGit = require("../"); + +var ConvenientHunk = NodeGit.ConvenientHunk; + +var header = ConvenientHunk.prototype.header; + /** + * Diff header string that represents the context of this hunk + * of the diff. Something like `@@ -169,14 +167,12 @@ ...` + * @return {String} + */ +ConvenientHunk.prototype.header = header; + +var headerLen = ConvenientHunk.prototype.headerLen; +/** + * The length of the header + * @return {Number} + */ +ConvenientHunk.prototype.headerLen = headerLen; + +var lines = ConvenientHunk.prototype.lines; +/** + * The lines in this hunk + * @async + * @return {Array} + */ +ConvenientHunk.prototype.lines = lines; + +var newLines = ConvenientHunk.prototype.newLines; +/** + * The number of new lines in the hunk + * @return {Number} + */ +ConvenientHunk.prototype.newLines = newLines; + +var newStart = ConvenientHunk.prototype.newStart; +/** + * The starting offset of the first new line in the file + * @return {Number} + */ +ConvenientHunk.prototype.newStart = newStart; + +var oldLines = ConvenientHunk.prototype.oldLines; +/** + * The number of old lines in the hunk + * @return {Number} + */ +ConvenientHunk.prototype.oldLines = oldLines; + +var oldStart = ConvenientHunk.prototype.oldStart; +/** + * The starting offset of the first old line in the file + * @return {Number} + */ +ConvenientHunk.prototype.oldStart = oldStart; + +var size = ConvenientHunk.prototype.size; +/** + * Number of lines in this hunk + * @return {Number} + */ +ConvenientHunk.prototype.size = size; diff --git a/lib/convenient_line.js b/lib/convenient_line.js deleted file mode 100644 index e2f947dc47..0000000000 --- a/lib/convenient_line.js +++ /dev/null @@ -1,74 +0,0 @@ -var NodeGit = require("../"); - -function ConvenientLine(raw, i) { - this.raw = raw; - this.i = i; -} - -/** -* The content of the line -* @return {String} -*/ -ConvenientLine.prototype.origin = function() { - return this.raw.origin(); -}; - -/** -* The content of the line -* @return {String} -*/ -ConvenientLine.prototype.oldLineno = function() { - return this.raw.oldLineno(); -}; - -/** -* The content of the line -* @return {String} -*/ -ConvenientLine.prototype.newLineno = function() { - return this.raw.newLineno(); -}; - -/** -* The content of the line -* @return {String} -*/ -ConvenientLine.prototype.numLines = function() { - return this.raw.numLines(); -}; - -/** -* The content of the line -* @return {String} -*/ -ConvenientLine.prototype.contentLen = function() { - return this.raw.contentLen(); -}; - - -/** -* The content of the line -* @return {String} -*/ -ConvenientLine.prototype.contentOffset = function() { - return this.raw.contentOffset(); -}; - -/** -* The content of the line -* @return {String} -*/ -ConvenientLine.prototype.rawContent = function() { - return this.raw.content(); -}; - -/** -* The relevant line -* @return {String} -*/ -ConvenientLine.prototype.content = function() { - return this.raw.content() - .substring(0, this.raw.contentLen()).replace("\n", ""); -}; - -NodeGit.ConvenientLine = ConvenientLine; diff --git a/lib/convenient_patch.js b/lib/convenient_patch.js index ad217aa25f..1e825382b7 100644 --- a/lib/convenient_patch.js +++ b/lib/convenient_patch.js @@ -1,163 +1,131 @@ var NodeGit = require("../"); -var Promise = require("nodegit-promise"); -var Diff = NodeGit.Diff; -var ConvenientHunk = NodeGit.ConvenientHunk; -function ConvenientPatch(delta, patch, i) { - this.delta = delta; - this.patch = patch; - this.i = i; -} - -/** - * Old name of the file - * @return {String} - */ -ConvenientPatch.prototype.oldFile = function() { - return this.delta.oldFile(); -}; - -/** - * New name of the file - * @return {String} - */ -ConvenientPatch.prototype.newFile = function() { - return this.delta.newFile(); -}; - -/** - * The number of hunks in this patch - * @return {Number} - */ -ConvenientPatch.prototype.size = function() { - return this.patch.numHunks(); -}; +var ConvenientPatch = NodeGit.ConvenientPatch; +var hunks = ConvenientPatch.prototype.hunks; /** * The hunks in this patch * @async * @return {Array} a promise that resolves to an array of * ConvenientHunks */ -ConvenientPatch.prototype.hunks = function() { - var _this = this; - var size = _this.size(); - var hunkPromises = []; - var i; - - function makeHunkPromise(i) { - return _this.patch.getHunk(i) - .then(function(hunkWithLineCount) { - return new ConvenientHunk( - hunkWithLineCount.hunk, - hunkWithLineCount.linesInHunk, - _this.patch, - i - ); - }); - } - - for (i = 0; i < size; i++) { - hunkPromises.push(makeHunkPromise(i)); - } - - return Promise.all(hunkPromises); -}; +ConvenientPatch.prototype.hunks = hunks; +var isAdded = ConvenientPatch.prototype.isAdded; /** - * The status of this patch (unmodified, added, deleted) - * @return {Number} + * Is this an added patch? + * @return {Boolean} */ -ConvenientPatch.prototype.status = function() { - return this.delta.status(); -}; +ConvenientPatch.prototype.isAdded = isAdded; +var isConflicted = ConvenientPatch.prototype.isConflicted; /** - * Is this an unmodified patch? + * Is this a conflicted patch? * @return {Boolean} */ -ConvenientPatch.prototype.isUnmodified = function() { - return this.status() == Diff.DELTA.UNMODIFIED; -}; +ConvenientPatch.prototype.isConflicted = isConflicted; +var isCopied = ConvenientPatch.prototype.isCopied; /** - * Is this an added patch? + * Is this a copied patch? * @return {Boolean} */ -ConvenientPatch.prototype.isAdded = function() { - return this.status() == Diff.DELTA.ADDED; -}; +ConvenientPatch.prototype.isCopied = isCopied; +var isDeleted = ConvenientPatch.prototype.isDeleted; /** * Is this a deleted patch? * @return {Boolean} */ -ConvenientPatch.prototype.isDeleted = function() { - return this.status() == Diff.DELTA.DELETED; -}; +ConvenientPatch.prototype.isDeleted = isDeleted; + +var isIgnored = ConvenientPatch.prototype.isIgnored; +/** + * Is this an ignored patch? + * @return {Boolean} + */ +ConvenientPatch.prototype.isIgnored = isIgnored; +var isModified = ConvenientPatch.prototype.isModified; /** * Is this an modified patch? * @return {Boolean} */ -ConvenientPatch.prototype.isModified = function() { - return this.status() == Diff.DELTA.MODIFIED; -}; +ConvenientPatch.prototype.isModified = isModified; +var isRenamed = ConvenientPatch.prototype.isRenamed; /** * Is this a renamed patch? * @return {Boolean} */ -ConvenientPatch.prototype.isRenamed = function() { - return this.status() == Diff.DELTA.RENAMED; -}; +ConvenientPatch.prototype.isRenamed = isRenamed; +var isTypeChange = ConvenientPatch.prototype.isTypeChange; /** - * Is this a copied patch? + * Is this a type change? * @return {Boolean} */ -ConvenientPatch.prototype.isCopied = function() { - return this.status() == Diff.DELTA.COPIED; -}; +ConvenientPatch.prototype.isTypeChange = isTypeChange; +var isUnmodified = ConvenientPatch.prototype.isUnmodified; /** - * Is this an ignored patch? + * Is this an unmodified patch? * @return {Boolean} */ -ConvenientPatch.prototype.isIgnored = function() { - return this.status() == Diff.DELTA.IGNORED; -}; +ConvenientPatch.prototype.isUnmodified = isUnmodified; +var isUnreadable = ConvenientPatch.prototype.isUnreadable; /** - * Is this an untracked patch? + * Is this an undreadable patch? * @return {Boolean} */ -ConvenientPatch.prototype.isUntracked = function() { - return this.status() == Diff.DELTA.UNTRACKED; -}; +ConvenientPatch.prototype.isUnreadable = isUnreadable; +var isUntracked = ConvenientPatch.prototype.isUntracked; /** - * Is this a type change? + * Is this an untracked patch? * @return {Boolean} */ -ConvenientPatch.prototype.isTypeChange = function() { - return this.status() == Diff.DELTA.TYPECHANGE; -}; +ConvenientPatch.prototype.isUntracked = isUntracked; /** - * Is this an undreadable patch? - * @return {Boolean} + * @typedef lineStats + * @type {Object} + * @property {number} total_context # of contexts in the patch + * @property {number} total_additions # of lines added in the patch + * @property {number} total_deletions # of lines deleted in the patch */ -ConvenientPatch.prototype.isUnreadable = function() { - return this.status() == Diff.DELTA.UNREADABLE; -}; +var lineStats = ConvenientPatch.prototype.lineStats; +/** + * The line statistics of this patch (#contexts, #added, #deleted) + * @return {lineStats} + */ +ConvenientPatch.prototype.lineStats = lineStats; +var newFile = ConvenientPatch.prototype.newFile; /** - * Is this a conflicted patch? - * @return {Boolean} + * New attributes of the file + * @return {DiffFile} + */ +ConvenientPatch.prototype.newFile = newFile; + +var oldFile = ConvenientPatch.prototype.oldFile; +/** + * Old attributes of the file + * @return {DiffFile} */ -ConvenientPatch.prototype.isConflicted = function() { - return this.status() == Diff.DELTA.CONFLICTED; -}; +ConvenientPatch.prototype.oldFile = oldFile; -NodeGit.ConvenientPatch = ConvenientPatch; +var size = ConvenientPatch.prototype.size; +/** + * The number of hunks in this patch + * @return {Number} + */ +ConvenientPatch.prototype.size = size; + +var status = ConvenientPatch.prototype.status; +/** + * The status of this patch (unmodified, added, deleted) + * @return {Number} + */ +ConvenientPatch.prototype.status = status; diff --git a/lib/credential.js b/lib/credential.js new file mode 100644 index 0000000000..af1a59125e --- /dev/null +++ b/lib/credential.js @@ -0,0 +1,34 @@ +var util = require("util"); +var NodeGit = require("../"); + +var Credential = NodeGit.Credential; + +var deprecatedFn = (method) => + util.deprecate( + Credential[method].bind(Credential), + `Use NodeGit.Credential.${method} instead of NodeGit.Cred.${method}` + ); + +var createCredTypeDeprecationMessage = type => + `Use NodeGit.Credential.TYPE.${type} instead of NodeGit.Cred.TYPE.${type}`; + +NodeGit.Cred = { + defaultNew: deprecatedFn("defaultNew"), + sshKeyFromAgent: deprecatedFn("sshKeyFromAgent"), + sshKeyNew: deprecatedFn("sshKeyNew"), + sshKeyMemoryNew: deprecatedFn("sshKeyMemoryNew"), + usernameNew: deprecatedFn("usernameNew"), + userpassPlaintextNew: deprecatedFn("userpassPlaintextNew"), + TYPE: Object.keys(Credential.TYPE).reduce( + (type, key) => { + Object.defineProperty(type, key, { + get: util.deprecate( + () => Credential.TYPE[key], + createCredTypeDeprecationMessage(type) + ) + }); + return type; + }, + {} + ) +}; diff --git a/lib/deprecated/structs/ApplyOptions.js b/lib/deprecated/structs/ApplyOptions.js new file mode 100644 index 0000000000..cd9f22ca07 --- /dev/null +++ b/lib/deprecated/structs/ApplyOptions.js @@ -0,0 +1,3 @@ +module.exports = function() { + this.flags = 0; +}; diff --git a/lib/deprecated/structs/BlameOptions.js b/lib/deprecated/structs/BlameOptions.js new file mode 100644 index 0000000000..8ffd415de9 --- /dev/null +++ b/lib/deprecated/structs/BlameOptions.js @@ -0,0 +1,6 @@ +module.exports = function() { + this.flags = 0; + this.minMatchCharacters = 0; + this.minLine = 0; + this.maxLine = 0; +}; diff --git a/lib/deprecated/structs/BlobFilterOptions.js b/lib/deprecated/structs/BlobFilterOptions.js new file mode 100644 index 0000000000..df9a3d762b --- /dev/null +++ b/lib/deprecated/structs/BlobFilterOptions.js @@ -0,0 +1,3 @@ +module.exports = function() { + this.flags = 1; +}; diff --git a/lib/deprecated/structs/CheckoutOptions.js b/lib/deprecated/structs/CheckoutOptions.js new file mode 100644 index 0000000000..89e28d0939 --- /dev/null +++ b/lib/deprecated/structs/CheckoutOptions.js @@ -0,0 +1,8 @@ +module.exports = function() { + this.checkoutStrategy = 1; + this.disableFilters = 0; + this.dirMode = 0; + this.fileMode = 0; + this.fileOpenFlags = 0; + this.notifyFlags = 0; +}; diff --git a/lib/deprecated/structs/CherrypickOptions.js b/lib/deprecated/structs/CherrypickOptions.js new file mode 100644 index 0000000000..fce5efa102 --- /dev/null +++ b/lib/deprecated/structs/CherrypickOptions.js @@ -0,0 +1,5 @@ +module.exports = function(NodeGit) { + this.checkoutOpts = new NodeGit.CheckoutOptions(); + this.mainline = 0; + this.mergeOpts = new NodeGit.MergeOptions(); +}; diff --git a/lib/deprecated/structs/CloneOptions.js b/lib/deprecated/structs/CloneOptions.js new file mode 100644 index 0000000000..84deb60da8 --- /dev/null +++ b/lib/deprecated/structs/CloneOptions.js @@ -0,0 +1,6 @@ +module.exports = function(NodeGit) { + this.bare = 0; + this.checkoutOpts = new NodeGit.CheckoutOptions(); + this.fetchOpts = new NodeGit.FetchOptions(); + this.local = 0; +}; diff --git a/lib/deprecated/structs/DescribeFormatOptions.js b/lib/deprecated/structs/DescribeFormatOptions.js new file mode 100644 index 0000000000..6e9d25031a --- /dev/null +++ b/lib/deprecated/structs/DescribeFormatOptions.js @@ -0,0 +1,4 @@ +module.exports = function() { + this.abbreviatedSize = 7; + this.alwaysUseLongFormat = 0; +}; diff --git a/lib/deprecated/structs/DescribeOptions.js b/lib/deprecated/structs/DescribeOptions.js new file mode 100644 index 0000000000..a4c29a2a7b --- /dev/null +++ b/lib/deprecated/structs/DescribeOptions.js @@ -0,0 +1,6 @@ +module.exports = function() { + this.describeStrategy = 0; + this.maxCandidatesTags = 10; + this.onlyFollowFirstParent = 0; + this.showCommitOidAsFallback = 0; +}; diff --git a/lib/deprecated/structs/DiffFindOptions.js b/lib/deprecated/structs/DiffFindOptions.js new file mode 100644 index 0000000000..459bc0ac16 --- /dev/null +++ b/lib/deprecated/structs/DiffFindOptions.js @@ -0,0 +1,8 @@ +module.exports = function() { + this.breakRewriteThreshold = 0; + this.copyThreshold = 0; + this.flags = 0; + this.renameFromRewriteThreshold = 0; + this.renameLimit = 0; + this.renameThreshold = 0; +}; diff --git a/lib/deprecated/structs/DiffOptions.js b/lib/deprecated/structs/DiffOptions.js new file mode 100644 index 0000000000..eeb6c5c3a1 --- /dev/null +++ b/lib/deprecated/structs/DiffOptions.js @@ -0,0 +1,8 @@ +module.exports = function() { + this.contextLines = 3; + this.flags = 0; + this.idAbbrev = 0; + this.ignoreSubmodules = -1; + this.interhunkLines = 0; + this.maxSize = 0; +}; diff --git a/lib/deprecated/structs/FetchOptions.js b/lib/deprecated/structs/FetchOptions.js new file mode 100644 index 0000000000..cd3f890dc2 --- /dev/null +++ b/lib/deprecated/structs/FetchOptions.js @@ -0,0 +1,7 @@ +module.exports = function(NodeGit) { + this.callbacks = new NodeGit.RemoteCallbacks(); + this.downloadTags = 0; + this.proxyOpts = new NodeGit.ProxyOptions(); + this.prune = 0; + this.updateFetchhead = 1; +}; diff --git a/lib/deprecated/structs/MergeFileInput.js b/lib/deprecated/structs/MergeFileInput.js new file mode 100644 index 0000000000..0b77f13830 --- /dev/null +++ b/lib/deprecated/structs/MergeFileInput.js @@ -0,0 +1,4 @@ +module.exports = function() { + this.mode = 0; + this.size = 0; +}; diff --git a/lib/deprecated/structs/MergeFileOptions.js b/lib/deprecated/structs/MergeFileOptions.js new file mode 100644 index 0000000000..fd7101514d --- /dev/null +++ b/lib/deprecated/structs/MergeFileOptions.js @@ -0,0 +1,5 @@ +module.exports = function() { + this.favor = 0; + this.flags = 0; + this.markerSize = 0; +}; diff --git a/lib/deprecated/structs/MergeOptions.js b/lib/deprecated/structs/MergeOptions.js new file mode 100644 index 0000000000..3c73243a27 --- /dev/null +++ b/lib/deprecated/structs/MergeOptions.js @@ -0,0 +1,8 @@ +module.exports = function() { + this.fileFavor = 0; + this.fileFlags = 0; + this.flags = 1; + this.recursionLimit = 0; + this.renameThreshold = 0; + this.targetLimit = 0; +}; diff --git a/lib/deprecated/structs/ProxyOptions.js b/lib/deprecated/structs/ProxyOptions.js new file mode 100644 index 0000000000..d1b3260bae --- /dev/null +++ b/lib/deprecated/structs/ProxyOptions.js @@ -0,0 +1,3 @@ +module.exports = function() { + this.type = 0; +}; diff --git a/lib/deprecated/structs/PushOptions.js b/lib/deprecated/structs/PushOptions.js new file mode 100644 index 0000000000..bab5bc14f9 --- /dev/null +++ b/lib/deprecated/structs/PushOptions.js @@ -0,0 +1,5 @@ +module.exports = function(NodeGit) { + this.callbacks = new NodeGit.RemoteCallbacks(); + this.pbParallelism = 1; + this.proxyOpts = new NodeGit.ProxyOptions(); +}; diff --git a/lib/deprecated/structs/RebaseOptions.js b/lib/deprecated/structs/RebaseOptions.js new file mode 100644 index 0000000000..414b296b5a --- /dev/null +++ b/lib/deprecated/structs/RebaseOptions.js @@ -0,0 +1,6 @@ +module.exports = function(NodeGit) { + this.checkoutOptions = new NodeGit.CheckoutOptions(); + this.inmemory = 0; + this.mergeOptions = new NodeGit.MergeOptions(); + this.quiet = 0; +}; diff --git a/lib/deprecated/structs/RemoteCreateOptions.js b/lib/deprecated/structs/RemoteCreateOptions.js new file mode 100644 index 0000000000..cd9f22ca07 --- /dev/null +++ b/lib/deprecated/structs/RemoteCreateOptions.js @@ -0,0 +1,3 @@ +module.exports = function() { + this.flags = 0; +}; diff --git a/lib/deprecated/structs/RepositoryInitOptions.js b/lib/deprecated/structs/RepositoryInitOptions.js new file mode 100644 index 0000000000..39657b17ea --- /dev/null +++ b/lib/deprecated/structs/RepositoryInitOptions.js @@ -0,0 +1,4 @@ +module.exports = function() { + this.flags = 0; + this.mode = 0; +}; diff --git a/lib/deprecated/structs/RevertOptions.js b/lib/deprecated/structs/RevertOptions.js new file mode 100644 index 0000000000..fce5efa102 --- /dev/null +++ b/lib/deprecated/structs/RevertOptions.js @@ -0,0 +1,5 @@ +module.exports = function(NodeGit) { + this.checkoutOpts = new NodeGit.CheckoutOptions(); + this.mainline = 0; + this.mergeOpts = new NodeGit.MergeOptions(); +}; diff --git a/lib/deprecated/structs/StashApplyOptions.js b/lib/deprecated/structs/StashApplyOptions.js new file mode 100644 index 0000000000..a7a9fcc839 --- /dev/null +++ b/lib/deprecated/structs/StashApplyOptions.js @@ -0,0 +1,4 @@ +module.exports = function(NodeGit) { + this.checkoutOptions = new NodeGit.CheckoutOptions(); + this.flags = 0; +}; diff --git a/lib/deprecated/structs/StatusOptions.js b/lib/deprecated/structs/StatusOptions.js new file mode 100644 index 0000000000..d7c35c0f4d --- /dev/null +++ b/lib/deprecated/structs/StatusOptions.js @@ -0,0 +1,4 @@ +module.exports = function() { + this.flags = 0; + this.show = 0; +}; diff --git a/lib/deprecated/structs/SubmoduleUpdateOptions.js b/lib/deprecated/structs/SubmoduleUpdateOptions.js new file mode 100644 index 0000000000..8dad87f119 --- /dev/null +++ b/lib/deprecated/structs/SubmoduleUpdateOptions.js @@ -0,0 +1,5 @@ +module.exports = function(NodeGit) { + this.allowFetch = 1; + this.checkoutOpts = new NodeGit.CheckoutOptions(); + this.fetchOpts = new NodeGit.FetchOptions(); +}; diff --git a/lib/diff.js b/lib/diff.js index d8cd10362b..2ae41a62b6 100644 --- a/lib/diff.js +++ b/lib/diff.js @@ -1,81 +1,25 @@ var NodeGit = require("../"); -var Promise = require("nodegit-promise"); var Diff = NodeGit.Diff; -var ConvenientPatch = NodeGit.ConvenientPatch; -var normalizeOptions = NodeGit.Utils.normalizeOptions; var Patch = NodeGit.Patch; +var _blobToBuffer = Diff.blobToBuffer; /** - * Retrieve patches in this difflist - * + * Directly run a diff between a blob and a buffer. * @async - * @return {Array} a promise that resolves to an array of - * ConvenientPatches + * @param {Blob} old_blob Blob for old side of diff, or NULL for empty blob + * @param {String} old_as_path Treat old blob as if it had this filename; + * can be NULL + * @param {String} buffer Raw data for new side of diff, or NULL for empty + * @param {String} buffer_as_path Treat buffer as if it had this filename; + * can be NULL + * @param {DiffOptions} opts Options for diff, or NULL for default options + * @param {Function} file_cb Callback for "file"; made once if there is a diff; + * can be NULL + * @param {Function} binary_cb Callback for binary files; can be NULL + * @param {Function} hunk_cb Callback for each hunk in diff; can be NULL + * @param {Function} line_cb Callback for each line in diff; can be NULL */ -Diff.prototype.patches = function() { - var _this = this; - var size = _this.numDeltas(); - var patchPromises = []; - var i; - - function makePatchPromise(i) { - return Patch.fromDiff(_this, i) - .then(function(patch) { - return new ConvenientPatch(_this.getDelta(i), patch, i); - }); - } - - for (i = 0; i < size; i++) { - patchPromises.push(makePatchPromise(i)); - } - - return Promise.all(patchPromises); -}; - -// Override Diff.indexToWorkdir to normalize opts -var indexToWorkdir = Diff.indexToWorkdir; -Diff.indexToWorkdir = function(repo, index, opts) { - opts = normalizeOptions(opts, NodeGit.DiffOptions); - return indexToWorkdir(repo, index, opts); -}; - -// Override Diff.treeToIndex to normalize opts -var treeToIndex = Diff.treeToIndex; -Diff.treeToIndex = function(repo, tree, index, opts) { - opts = normalizeOptions(opts, NodeGit.DiffOptions); - return treeToIndex(repo, tree, index, opts); -}; - -// Override Diff.treeToTree to normalize opts -var treeToTree = Diff.treeToTree; -Diff.treeToTree = function(repo, from_tree, to_tree, opts) { - opts = normalizeOptions(opts, NodeGit.DiffOptions); - return treeToTree(repo, from_tree, to_tree, opts); -}; - -// Override Diff.treeToWorkdir to normalize opts -var treeToWorkdir = Diff.treeToWorkdir; -Diff.treeToWorkdir = function(repo, tree, opts) { - opts = normalizeOptions(opts, NodeGit.DiffOptions); - return treeToWorkdir(repo, tree, opts); -}; - -// Override Diff.treeToWorkdir to normalize opts -var treeToWorkdirWithIndex = Diff.treeToWorkdirWithIndex; -Diff.treeToWorkdirWithIndex = function(repo, tree, opts) { - opts = normalizeOptions(opts, NodeGit.DiffOptions); - return treeToWorkdirWithIndex(repo, tree, opts); -}; - -// Override Diff.findSimilar to normalize opts -var findSimilar = Diff.prototype.findSimilar; -Diff.prototype.findSimilar = function(opts) { - opts = normalizeOptions(opts, NodeGit.DiffFindOptions); - return findSimilar.call(this, opts); -}; - -var blobToBuffer = Diff.blobToBuffer; Diff.blobToBuffer= function( old_blob, old_as_path, @@ -86,15 +30,21 @@ Diff.blobToBuffer= function( binary_cb, hunk_cb, line_cb) { - var bufferLength = !buffer ? 0 : buffer.length; - - opts = normalizeOptions(opts, NodeGit.DiffOptions); + var bufferText; + var bufferLength; + if (buffer instanceof Buffer) { + bufferText = buffer.toString("utf8"); + bufferLength = Buffer.byteLength(buffer, "utf8"); + } else { + bufferText = buffer; + bufferLength = !buffer ? 0 : Buffer.byteLength(buffer, "utf8"); + } - return blobToBuffer.call( + return _blobToBuffer.call( this, old_blob, old_as_path, - buffer, + bufferText, bufferLength, buffer_as_path, opts, @@ -104,3 +54,14 @@ Diff.blobToBuffer= function( line_cb, null); }; + +/** + * Retrieve patches in this difflist + * + * @async + * @return {Array} a promise that resolves to an array of + * ConvenientPatches + */ +Diff.prototype.patches = function(idxs) { + return Patch.convenientFromDiff(this, idxs); +}; diff --git a/lib/diff_file.js b/lib/diff_file.js new file mode 100644 index 0000000000..34ce315ce2 --- /dev/null +++ b/lib/diff_file.js @@ -0,0 +1,38 @@ +var NodeGit = require("../"); + +var DiffFile = NodeGit.DiffFile; + +var flags = DiffFile.prototype.flags; +/** + * Returns the file's flags + * @return {Number} + */ +DiffFile.prototype.flags = flags; + +var id = DiffFile.prototype.id; +/** + * Returns the file's Oid + * @return {Oid} + */ +DiffFile.prototype.id = id; + +var mode = DiffFile.prototype.mode; +/** + * Returns the file's mode + * @return {Number} + */ +DiffFile.prototype.mode = mode; + +var path = DiffFile.prototype.path; +/** + * Returns the file's path + * @return {String} + */ +DiffFile.prototype.path = path; + +var size = DiffFile.prototype.size; +/** + * Returns the file's size + * @return {Number} + */ +DiffFile.prototype.size = size; diff --git a/lib/diff_line.js b/lib/diff_line.js new file mode 100644 index 0000000000..f856f07c7d --- /dev/null +++ b/lib/diff_line.js @@ -0,0 +1,32 @@ +var NodeGit = require("../"); +var DiffLine = NodeGit.DiffLine; + +var _rawContent = DiffLine.prototype.content; + +/** +* The relevant line +* @return {String} +*/ +DiffLine.prototype.content = function() { + if (!this._cache) { + this._cache = {}; + } + + if (!this._cache.content) { + this._cache.content = Buffer.from(this.rawContent()) + .slice(0, this.contentLen()) + .toString("utf8"); + } + + return this._cache.content; +}; + +/** +* The non utf8 translated text +* @return {String} +*/ +DiffLine.prototype.rawContent = function() { + return _rawContent.call(this); +}; + +NodeGit.DiffLine = DiffLine; diff --git a/lib/error.js b/lib/error.js new file mode 100644 index 0000000000..819299681c --- /dev/null +++ b/lib/error.js @@ -0,0 +1,17 @@ +var util = require("util"); +var NodeGit = require("../"); + +// Deprecated ----------------------------------------------------------------- + +// In 0.28.0 git_error was majorly refactored to have better naming in libgit2 +// We will continue to support the old enum entries but with a deprecation +// warning as they will go away soon. +Object.keys(NodeGit.Error.CODE).forEach((key) => { + Object.defineProperty(NodeGit.Error.CODE, `GITERR_${key}`, { + get: util.deprecate( + () => NodeGit.Error.CODE[key], + `Use NodeGit.Error.CODE.${key} instead of ` + + `NodeGit.Error.CODE.GETERR_${key}.` + ) + }); +}); diff --git a/lib/filter_registry.js b/lib/filter_registry.js new file mode 100644 index 0000000000..cfa17415e0 --- /dev/null +++ b/lib/filter_registry.js @@ -0,0 +1,22 @@ +var NodeGit = require("../"); + +var FilterRegistry = NodeGit.FilterRegistry; + +var _register = FilterRegistry.register; + +// register should add filter by name to dict and return +// Override FilterRegistry.register to normalize Filter +FilterRegistry.register = function(name, filter, priority) { + // setting default value of attributes + if (filter.attributes === undefined) { + filter.attributes = ""; + } + + if (!filter.check || !filter.apply) { + return Promise.reject(new Error( + "ERROR: please provide check and apply callbacks for filter" + )); + } + + return _register(name, filter, priority); +}; diff --git a/lib/graph.js b/lib/graph.js new file mode 100644 index 0000000000..7371410076 --- /dev/null +++ b/lib/graph.js @@ -0,0 +1,15 @@ +var NodeGit = require("../"); + +var Graph = NodeGit.Graph; + +var _reachableFromAny = Graph.reachableFromAny; + +/** + * Determine if a commit is reachable from any of a list of commits by following parent edges. + * @param {repository} the repository where the commits exist + * @param {commit} a previously loaded commit + * @param {descendant_array} oids of the commits + */ +Graph.reachableFromAny = function(repository, commit, descendant_array) { + return _reachableFromAny(repository, commit, descendant_array, descendant_array.length); +}; diff --git a/lib/index.js b/lib/index.js index a7f41571e9..ad37cea782 100644 --- a/lib/index.js +++ b/lib/index.js @@ -1,8 +1,15 @@ +var util = require("util"); var NodeGit = require("../"); var Index = NodeGit.Index; -var Status = NodeGit.Status; -var Pathspec = NodeGit.Pathspec; + +var _addAll = Index.prototype.addAll; +var _removeAll = Index.prototype.removeAll; +var _updateAll = Index.prototype.updateAll; + +Index.prototype.addAll = function(pathspec, flags, matchedCallback) { + return _addAll.call(this, pathspec || "*", flags, matchedCallback, null); +}; /** * Return an array of the entries in this index. @@ -19,38 +26,78 @@ Index.prototype.entries = function() { return result; }; -var addAll = Index.prototype.addAll; -Index.prototype.addAll = function(pathspec, flags, matchedCallback) { - // This status path code is here to speedup addall, which currently is - // excessively slow due to adding every single unignored file to the index - // even if it has no changes. Remove this when it's fixed in libgit2 - // https://github.com/libgit2/libgit2/issues/2687 - var paths = []; - var repo = this.owner(); - var statusCB = function(path) { - paths.push(path); - }; - var idx = this; - var ps = Pathspec.create(pathspec || "*"); - - return Status.foreach(repo, statusCB) - .then(function() { - return paths; - }) - .then(function(paths) { - paths = paths.filter(function(path) { - return !!(ps.matchesPath(0, path)); - }); - return addAll.call(idx, paths, flags, matchedCallback, null); - }); -}; - -var removeAll = Index.prototype.removeAll; Index.prototype.removeAll = function(pathspec, matchedCallback) { - return removeAll.call(this, pathspec || "*", matchedCallback, null); + return _removeAll.call(this, pathspec || "*", matchedCallback, null); }; -var updateAll = Index.prototype.updateAll; Index.prototype.updateAll = function(pathspec, matchedCallback) { - return updateAll.call(this, pathspec || "*", matchedCallback, null); + return _updateAll.call(this, pathspec || "*", matchedCallback, null); +}; + +// Deprecated ----------------------------------------------------------------- + +NodeGit.Index.CAP = {}; +Object.keys(NodeGit.Index.CAPABILITY).forEach((key) => { + Object.defineProperty(NodeGit.Index.CAP, key, { + get: util.deprecate( + () => NodeGit.Index.CAPABILITY[key], + `Use NodeGit.Index.CAPABILITY.${key} instead of ` + + `NodeGit.Index.CAP.${key}.` + ) + }); +}); + +NodeGit.Enums.INDXENTRY_FLAG = {}; +Object.defineProperty(NodeGit.Enums.INDXENTRY_FLAG, "IDXENTRY_EXTENDED", { + get: util.deprecate( + () => NodeGit.Index.ENTRY_FLAG.ENTRY_EXTENDED, + "Use NodeGit.Index.ENTRY_FLAG.ENTRY_EXTENDED instead of " + + "NodeGit.Enums.INDXENTRY_FLAG.IDXENTRY_EXTENDED." + ) +}); +Object.defineProperty(NodeGit.Enums.INDXENTRY_FLAG, "IDXENTRY_VALID", { + get: util.deprecate( + () => NodeGit.Index.ENTRY_FLAG.ENTRY_VALID, + "Use NodeGit.Index.ENTRY_FLAG.ENTRY_VALID instead of " + + "NodeGit.Enums.INDXENTRY_FLAG.IDXENTRY_VALID." + ) +}); + +NodeGit.Enums.IDXENTRY_EXTENDED_FLAG = {}; +var EXTENDED_FLAGS_MAP = { + IDXENTRY_INTENT_TO_ADD: "ENTRY_INTENT_TO_ADD", + IDXENTRY_SKIP_WORKTREE: "ENTRY_SKIP_WORKTREE", + S: "S", + IDXENTRY_UPTODATE: "ENTRY_UPTODATE" +}; +Object.keys(EXTENDED_FLAGS_MAP).forEach((key) => { + const newKey = EXTENDED_FLAGS_MAP[key]; + Object.defineProperty(NodeGit.Enums.IDXENTRY_EXTENDED_FLAG, key, { + get: util.deprecate( + () => NodeGit.Index.ENTRY_EXTENDED_FLAG[newKey], + `Use NodeGit.Index.ENTRY_EXTENDED_FLAG.${newKey} instead of ` + + `NodeGit.Enums.IDXENTRY_EXTENDED_FLAG.${key}.` + ) + }); +}); + +var DEPRECATED_EXTENDED_FLAGS = { + IDXENTRY_EXTENDED2: 32768, + IDXENTRY_UPDATE: 1, + IDXENTRY_REMOVE: 2, + IDXENTRY_ADDED: 8, + IDXENTRY_HASHED: 16, + IDXENTRY_UNHASHED: 32, + IDXENTRY_WT_REMOVE: 64, + IDXENTRY_CONFLICTED: 128, + IDXENTRY_UNPACKED: 256, + IDXENTRY_NEW_SKIP_WORKTREE: 512, }; +Object.keys(DEPRECATED_EXTENDED_FLAGS).forEach((key) => { + Object.defineProperty(NodeGit.Enums.IDXENTRY_EXTENDED_FLAG, key, { + get: util.deprecate( + () => DEPRECATED_EXTENDED_FLAGS[key], + "LibGit2 has removed this flag for public usage." + ) + }); +}); diff --git a/lib/merge.js b/lib/merge.js index 5dd286fc92..549bbad919 100644 --- a/lib/merge.js +++ b/lib/merge.js @@ -1,10 +1,8 @@ var NodeGit = require("../"); -var normalizeOptions = NodeGit.Utils.normalizeOptions; -var Promise = require("nodegit-promise"); var Merge = NodeGit.Merge; -var mergeCommits = Merge.commits; -var mergeMerge = Merge.merge; +var _commits = Merge.commits; +var _merge = Merge.merge; /** * Merge 2 commits together and create an new index that can @@ -16,13 +14,11 @@ var mergeMerge = Merge.merge; * @param {MergeOptions} [options] The merge tree options (null for default) */ Merge.commits = function(repo, ourCommit, theirCommit, options) { - options = normalizeOptions(options, NodeGit.MergeOptions); - return Promise.all([ repo.getCommit(ourCommit), repo.getCommit(theirCommit) ]).then(function(commits) { - return mergeCommits.call(this, repo, commits[0], commits[1], options); + return _commits.call(this, repo, commits[0], commits[1], options); }); }; @@ -30,19 +26,16 @@ Merge.commits = function(repo, ourCommit, theirCommit, options) { * Merge a commit into HEAD and writes the results to the working directory. * * @param {Repository} repo Repository that contains the given commits - * @param {Commit} theirHead The annotated to merge into HEAD + * @param {AnnotatedCommit} theirHead The annotated commit to merge into HEAD * @param {MergeOptions} [mergeOpts] The merge tree options (null for default) * @param {CheckoutOptions} [checkoutOpts] The checkout options * (null for default) */ Merge.merge = function(repo, theirHead, mergeOpts, checkoutOpts) { - mergeOpts = normalizeOptions(mergeOpts || {}, NodeGit.MergeOptions); - checkoutOpts = normalizeOptions(checkoutOpts || {}, NodeGit.CheckoutOptions); - // Even though git_merge takes an array of annotated_commits, it expects // exactly one to have been passed in or it will throw an error... ÂŻ\_(ă„)_/ÂŻ var theirHeads = [theirHead]; - return mergeMerge.call(this, repo, theirHeads, theirHeads.length, + return _merge.call(this, repo, theirHeads, theirHeads.length, mergeOpts, checkoutOpts); }; diff --git a/lib/note.js b/lib/note.js index 4f3ff76bbb..8e46427cf6 100644 --- a/lib/note.js +++ b/lib/note.js @@ -2,8 +2,9 @@ var NodeGit = require("../"); var Note = NodeGit.Note; +var _foreach = Note.foreach; + // Override Note.foreach to eliminate the need to pass null payload -var foreach = Note.foreach; Note.foreach = function(repo, notesRef, callback) { function wrapperCallback(blobId, objectId) { // We need to copy the OID since libgit2 types are getting cleaned up @@ -12,5 +13,5 @@ Note.foreach = function(repo, notesRef, callback) { return callback(blobId.copy(), objectId.copy()); } - return foreach(repo, notesRef, wrapperCallback, null); + return _foreach(repo, notesRef, wrapperCallback, null); }; diff --git a/lib/object.js b/lib/object.js index 21938883fa..680aebd121 100644 --- a/lib/object.js +++ b/lib/object.js @@ -1,35 +1,45 @@ +var util = require("util"); var NodeGit = require("../"); var Obj = NodeGit.Object; /** - * Is this object a commit? + * Is this object a blob? * @return {Boolean} */ -Obj.prototype.isCommit = function() { - return this.type() == Obj.TYPE.COMMIT; +Obj.prototype.isBlob = function() { + return this.type() == Obj.TYPE.BLOB; }; /** - * Is this object a tree? + * Is this object a commit? * @return {Boolean} */ -Obj.prototype.isTree = function() { - return this.type() == Obj.TYPE.TREE; +Obj.prototype.isCommit = function() { + return this.type() == Obj.TYPE.COMMIT; }; /** - * Is this object a blob? + * Is this object a tag? * @return {Boolean} */ -Obj.prototype.isBlob = function() { - return this.type() == Obj.TYPE.BLOB; +Obj.prototype.isTag = function() { + return this.type() == Obj.TYPE.TAG; }; /** - * Is this object a tag? + * Is this object a tree? * @return {Boolean} */ -Obj.prototype.isTag = function() { - return this.type() == Obj.TYPE.TAG; +Obj.prototype.isTree = function() { + return this.type() == Obj.TYPE.TREE; }; + +// Deprecated ----------------------------------------------------------------- + +Object.defineProperty(Obj.TYPE, "BAD", { + get: util.deprecate( + () => Obj.TYPE.INVALID, + "Use NodeGit.Object.TYPE.INVALID instead of NodeGit.Object.TYPE.BAD." + ) +}); diff --git a/lib/odb.js b/lib/odb.js deleted file mode 100644 index 85a7649281..0000000000 --- a/lib/odb.js +++ /dev/null @@ -1,14 +0,0 @@ -var NodeGit = require("../"); - -var Odb = NodeGit.Odb; -var read = Odb.prototype.read; - -Odb.prototype.read = function(oid, callback) { - return read.call(this, oid).then(function(odbObject) { - if (typeof callback === "function") { - callback(null, odbObject); - } - - return odbObject; - }, callback); -}; diff --git a/lib/oid.js b/lib/oid.js index c3a84ecfb3..fcbf9b48f8 100644 --- a/lib/oid.js +++ b/lib/oid.js @@ -4,11 +4,11 @@ var Oid = NodeGit.Oid; // Backwards compatibility. Object.defineProperties(Oid.prototype, { - "toString": { + "allocfmt": { value: Oid.prototype.tostrS, enumerable: false }, - "allocfmt": { + "toString": { value: Oid.prototype.tostrS, enumerable: false } diff --git a/lib/rebase.js b/lib/rebase.js index 8160428f73..821d470ddd 100644 --- a/lib/rebase.js +++ b/lib/rebase.js @@ -1,7 +1,51 @@ var NodeGit = require("../"); var Rebase = NodeGit.Rebase; -var normalizeOptions = NodeGit.Utils.normalizeOptions; -var shallowClone = require("./utils/shallow_clone"); + +var _init = Rebase.init; +var _open = Rebase.open; + +function defaultRebaseOptions(repository, options, checkoutStrategy) { + if (options) { + // Ensure we don't modify the passed-in options object. + // This could lead to us recursing commitCreateCb if the same + // options object is later re-used. + options = Object.assign({}, options); + + if (options.signingCb && !options.commitCreateCb) { + console.warn("signingCb is deperecated, use commitCreateCb instead."); + + let signingCb = options.signingCb; + options.commitCreateCb = function ( + author, + committer, + message_encoding, + message, + tree, + parent_count, + parents + ) { + return repository.createCommitWithSignature( + null, + author, + committer, + message, + tree, + parents, + signingCb).then((oid) => { + return oid; + }); + }; + } + } else if (checkoutStrategy) { + options = { + checkoutOptions: { + checkoutStrategy: checkoutStrategy + } + }; + } + + return options; +} /** * Initializes a rebase @@ -15,32 +59,14 @@ var shallowClone = require("./utils/shallow_clone"); * onto the given upstream * @param {RebaseOptions} options Options to specify how rebase is performed, * or NULL - * @param {Function} callback * @return {Remote} */ - var init = Rebase.init; Rebase.init = function(repository, branch, upstream, onto, options) { - var checkoutOptions; - - if (options) { - options = shallowClone(options); - checkoutOptions = options.checkoutOptions; - delete options.checkoutOptions; - - options = normalizeOptions(options, NodeGit.RebaseOptions); - } else { - options = normalizeOptions({}, NodeGit.RebaseOptions); - checkoutOptions = { - checkoutStrategy: NodeGit.Checkout.STRATEGY.FORCE - }; - } - - if (checkoutOptions) { - options.checkoutOptions = - normalizeOptions(checkoutOptions, NodeGit.CheckoutOptions); - } - - return init(repository, branch, upstream, onto, options); + return _init(repository, branch, upstream, onto, defaultRebaseOptions( + repository, + options, + NodeGit.Checkout.STRATEGY.FORCE + )); }; /** @@ -49,30 +75,12 @@ Rebase.init = function(repository, branch, upstream, onto, options) { * @async * @param {Repository} repo The repository that has a rebase in-progress * @param {RebaseOptions} options Options to specify how rebase is performed - * @param {Function} callback * @return {Remote} */ -var rebaseOpen = Rebase.open; Rebase.open = function(repository, options) { - var checkoutOptions; - - if (options) { - options = shallowClone(options); - checkoutOptions = options.checkoutOptions; - delete options.checkoutOptions; - - options = normalizeOptions(options, NodeGit.RebaseOptions); - } else { - options = normalizeOptions({}, NodeGit.RebaseOptions); - checkoutOptions = { - checkoutStrategy: NodeGit.Checkout.STRATEGY.SAFE - }; - } - - if (checkoutOptions) { - options.checkoutOptions = - normalizeOptions(checkoutOptions, NodeGit.CheckoutOptions); - } - - return rebaseOpen(repository, options); + return _open(repository, defaultRebaseOptions( + repository, + options, + NodeGit.Checkout.STRATEGY.SAFE + )); }; diff --git a/lib/reference.js b/lib/reference.js index d9b3b8c273..af3e006216 100644 --- a/lib/reference.js +++ b/lib/reference.js @@ -1,3 +1,4 @@ +var util = require("util"); var NodeGit = require("../"); var LookupWrapper = NodeGit.Utils.lookupWrapper; @@ -5,39 +6,39 @@ var Reference = NodeGit.Reference; var Branch = NodeGit.Branch; /** -* Retrieves the reference pointed to by the oid +* Retrieves the reference by it's short name * @async * @param {Repository} repo The repo that the reference lives in * @param {String|Reference} id The reference to lookup * @param {Function} callback * @return {Reference} */ -Reference.lookup = LookupWrapper(Reference); +Reference.dwim = LookupWrapper(Reference, Reference.dwim); /** -* Retrieves the reference by it's short name +* Retrieves the reference pointed to by the oid * @async * @param {Repository} repo The repo that the reference lives in * @param {String|Reference} id The reference to lookup * @param {Function} callback * @return {Reference} */ -Reference.dwim = LookupWrapper(Reference, Reference.dwim); +Reference.lookup = LookupWrapper(Reference); /** - * Returns true if this reference is valid + * Returns true if this reference is not symbolic * @return {Boolean} */ -Reference.prototype.isValid = function() { - return this.type() != Reference.TYPE.INVALID; +Reference.prototype.isConcrete = function() { + return this.type() == Reference.TYPE.DIRECT; }; /** - * Returns true if this reference is not symbolic + * Returns if the ref is pointed at by HEAD * @return {Boolean} */ -Reference.prototype.isConcrete = function() { - return this.type() == Reference.TYPE.OID; +Reference.prototype.isHead = function() { + return Branch.isHead(this); }; /** @@ -48,6 +49,14 @@ Reference.prototype.isSymbolic = function() { return this.type() == Reference.TYPE.SYMBOLIC; }; +/** + * Returns true if this reference is valid + * @return {Boolean} + */ +Reference.prototype.isValid = function() { + return this.type() != Reference.TYPE.INVALID; +}; + /** * Returns the name of the reference. * @return {String} @@ -56,10 +65,149 @@ Reference.prototype.toString = function() { return this.name(); }; +const getTerminal = (repo, refName, depth = 10, prevRef = null) => { + if (depth <= 0) { + return Promise.resolve({ + error: NodeGit.Error.CODE.ENOTFOUND, + out: prevRef + }); + } + + return NodeGit.Reference.lookup(repo, refName) + .then((ref) => { + if (ref.type() === NodeGit.Reference.TYPE.DIRECT) { + return { + error: NodeGit.Error.CODE.OK, + out: ref + }; + } else { + return getTerminal(repo, ref.symbolicTarget(), depth - 1, ref) + .then(({ error, out }) => { + if (error === NodeGit.Error.CODE.ENOTFOUND && !out) { + return { error, out: ref }; + } else { + return { error, out }; + } + }); + } + }) + .catch((error) => { + return { + error: error.errno, + out: null + }; + }); +}; + +const getSignatureForReflog = (repo) => { + const { email, name } = repo.ident(); + if (email && name) { + return Promise.resolve(NodeGit.Signature.now(name, email)); + } + + return NodeGit.Signature.default(repo) + .catch(() => NodeGit.Signature.now("unknown", "unknown")); +}; + /** - * Returns if the ref is pointed at by HEAD - * @return {bool} + * Given a reference name, follows symbolic links and updates the direct + * reference to point to a given OID. Updates the reflog with a given message. + * + * @async + * @param {Repository} repo The repo where the reference and objects live + * @param {String} refName The reference name to update + * @param {Oid} oid The target OID that the reference will point to + * @param {String} logMessage The reflog message to be writted + * @param {Signature} signature Optional signature to use for the reflog entry */ -Reference.prototype.isHead = function() { - return Branch.isHead(this); +Reference.updateTerminal = function ( + repo, + refName, + oid, + logMessage, + signature +) { + let signatureToUse; + let promiseChain = Promise.resolve(); + + if (!signature) { + promiseChain = promiseChain + .then(() => getSignatureForReflog(repo)) + .then((sig) => { + signatureToUse = sig; + return Promise.resolve(); + }); + } else { + signatureToUse = signature; + } + + return promiseChain + .then(() => getTerminal(repo, refName)) + .then(({ error, out }) => { + if (error === NodeGit.Error.CODE.ENOTFOUND && out) { + return NodeGit.Reference.create( + repo, + out.symbolicTarget(), + oid, + 0, + logMessage + ); + } else if (error === NodeGit.Error.CODE.ENOTFOUND) { + return NodeGit.Reference.create( + repo, + refName, + oid, + 0, + logMessage + ); + } else { + return NodeGit.Reference.createMatching( + repo, + out.name(), + oid, + 1, + out.target(), + logMessage + ); + } + }) + .then(() => NodeGit.Reflog.read(repo, refName)) + .then((reflog) => { + // Janky, but works. Ideally, we would want to generate the correct reflog + // entry in the first place, rather than drop the most recent entry and + // write the correct one. + // NOTE: There is a theoretical race condition that could happen here. + // We may want to consider some kind of transactional logic to make sure + // that the reflog on disk isn't modified before we can write back. + reflog.drop(0, 1); + reflog.append(oid, signatureToUse, logMessage); + return reflog.write(); + }); }; + +// Deprecated ----------------------------------------------------------------- + +Object.defineProperty(NodeGit.Reference.TYPE, "OID", { + get: util.deprecate( + () => NodeGit.Reference.TYPE.DIRECT, + "Use NodeGit.Reference.TYPE.DIRECT instead of NodeGit.Reference.TYPE.OID." + ) +}); + +Object.defineProperty(NodeGit.Reference.TYPE, "LISTALL", { + get: util.deprecate( + () => NodeGit.Reference.TYPE.ALL, + "Use NodeGit.Reference.TYPE.ALL instead of NodeGit.Reference.TYPE.LISTALL." + ) +}); + +NodeGit.Reference.NORMALIZE = {}; +Object.keys(NodeGit.Reference.FORMAT).forEach((key) => { + Object.defineProperty(NodeGit.Reference.NORMALIZE, `REF_FORMAT_${key}`, { + get: util.deprecate( + () => NodeGit.Reference.FORMAT[key], + `Use NodeGit.Reference.FORMAT.${key} instead of ` + + `NodeGit.Reference.NORMALIZE.REF_FORMAT_${key}.` + ) + }); +}); diff --git a/lib/remote.js b/lib/remote.js index 949702100a..c0483ca87a 100644 --- a/lib/remote.js +++ b/lib/remote.js @@ -1,13 +1,8 @@ +var util = require("util"); var NodeGit = require("../"); -var normalizeOptions = NodeGit.Utils.normalizeOptions; var lookupWrapper = NodeGit.Utils.lookupWrapper; -var shallowClone = require("./utils/shallow_clone"); var Remote = NodeGit.Remote; -var connect = Remote.prototype.connect; -var download = Remote.prototype.download; -var fetch = Remote.prototype.fetch; -var push = Remote.prototype.push; /** * Retrieves the remote by name @@ -20,108 +15,31 @@ var push = Remote.prototype.push; Remote.lookup = lookupWrapper(Remote); /** - * Connects to a remote + * Lists advertised references from a remote. You must connect to the remote + * before using referenceList. * * @async - * @param {Enums.DIRECTION} direction The direction for the connection - * @param {RemoteCallbacks} callbacks The callback functions for the connection - * @param {Function} callback - * @return {Number} error code - */ -Remote.prototype.connect = function(direction, callbacks) { - callbacks = normalizeOptions(callbacks, NodeGit.RemoteCallbacks); - - return connect.call(this, direction, callbacks); -}; - -/** - * Connects to a remote - * - * @async - * @param {Array} refSpecs The ref specs that should be pushed - * @param {FetchOptions} opts The fetch options for download, contains callbacks - * @param {Function} callback - * @return {Number} error code - */ -Remote.prototype.download = function(refspecs, opts) { - var callbacks; - - if (opts) { - opts = shallowClone(opts); - callbacks = opts.callbacks; - delete opts.callbacks; - } else { - opts = {}; - } - - opts = normalizeOptions(opts, NodeGit.FetchOptions); - - if (callbacks) { - opts.callbacks = - normalizeOptions(callbacks, NodeGit.RemoteCallbacks); - } - - return download.call(this, refspecs, opts); -}; - -/** - * Connects to a remote - * - * @async - * @param {Array} refSpecs The ref specs that should be pushed - * @param {FetchOptions} opts The fetch options for download, contains callbacks - * @param {String} message The message to use for the update reflog messages - * @param {Function} callback - * @return {Number} error code - */ -Remote.prototype.fetch = function(refspecs, opts, reflog_message) { - var callbacks; - - if (opts) { - opts = shallowClone(opts); - callbacks = opts.callbacks; - delete opts.callbacks; - } else { - opts = {}; - } - - opts = normalizeOptions(opts, NodeGit.FetchOptions); - - if (callbacks) { - opts.callbacks = - normalizeOptions(callbacks, NodeGit.RemoteCallbacks); - } - - return fetch.call(this, refspecs, opts, reflog_message); -}; - -/** - * Pushes to a remote + * @return {Promise>} a list of the remote heads the remote + * had available at the last established + * connection. * - * @async - * @param {Array} refSpecs The ref specs that should be pushed - * @param {PushOptions} options Options for the checkout - * @param {Function} callback - * @return {Number} error code */ -Remote.prototype.push = function(refSpecs, opts) { - var callbacks; - if (opts) { - opts = shallowClone(opts); - callbacks = opts.callbacks; - delete opts.callbacks; - } else { - opts = {}; - } - - opts = normalizeOptions(opts, NodeGit.PushOptions); - - if (callbacks) { - opts.callbacks = - normalizeOptions(callbacks, NodeGit.RemoteCallbacks); - } +Remote.prototype.referenceList = Remote.prototype.referenceList; - return push.call(this, refSpecs, opts); +NodeGit.Remote.COMPLETION_TYPE = {}; +var DEPRECATED_STATES = { + COMPLETION_DOWNLOAD: "DOWNLOAD", + COMPLETION_INDEXING: "INDEXING", + COMPLETION_ERROR: "ERROR" }; -module.exports = Remote; +Object.keys(DEPRECATED_STATES).forEach((key) => { + const newKey = DEPRECATED_STATES[key]; + Object.defineProperty(NodeGit.Remote.COMPLETION_TYPE, key, { + get: util.deprecate( + () => NodeGit.Remote.COMPLETION[newKey], + `Use NodeGit.Remote.COMPLETION.${newKey} instead of ` + + `NodeGit.Remote.COMPLETION_TYPE.${key}.` + ) + }); +}); diff --git a/lib/repository.js b/lib/repository.js index bad13b7837..64d566dcdc 100644 --- a/lib/repository.js +++ b/lib/repository.js @@ -1,13 +1,13 @@ -var Promise = require("nodegit-promise"); -var promisify = require("promisify-node"); -var fse = promisify(require("fs-extra")); +var fse = require("fs-extra"); +var fp = require("lodash/fp"); var NodeGit = require("../"); var Blob = NodeGit.Blob; var Checkout = NodeGit.Checkout; var Commit = NodeGit.Commit; -var normalizeOptions = NodeGit.Utils.normalizeOptions; var shallowClone = NodeGit.Utils.shallowClone; var path = require("path"); +var Filter = NodeGit.Filter; +var FilterList = NodeGit.FilterList; var Reference = NodeGit.Reference; var Remote = NodeGit.Remote; var Repository = NodeGit.Repository; @@ -15,435 +15,607 @@ var Revwalk = NodeGit.Revwalk; var Status = NodeGit.Status; var StatusFile = NodeGit.StatusFile; var StatusList = NodeGit.StatusList; +var Submodule = NodeGit.Submodule; var Tag = NodeGit.Tag; var Tree = NodeGit.Tree; var TreeBuilder = NodeGit.Treebuilder; -Object.defineProperty(Repository.prototype, "openIndex", { - enumerable: false, - value: Repository.prototype.index -}); +var _discover = Repository.discover; +var _fetchheadForeach = Repository.prototype.fetchheadForeach; +var _mergeheadForeach = Repository.prototype.mergeheadForeach; + +function applySelectedLinesToTarget + (originalContent, newLines, pathHunks, isStaged, reverse) { + // 43: ascii code for '+' + // 45: ascii code for '-' + var lineTypes = { + ADDED: !reverse ? 43 : 45, + DELETED: !reverse ? 45 : 43 + }; + var newContent = ""; + var oldIndex = 0; + var linesPromises = []; -/** - * Creates a branch with the passed in name pointing to the commit - * - * @async - * @param {String} name Branch name, e.g. "master" - * @param {Commit|String|Oid} commit The commit the branch will point to - * @param {bool} force Overwrite branch if it exists - * @param {Signature} signature Identity to use to populate reflog - * @param {String} logMessage One line message to be appended to the reflog - * @return {Ref} - */ -Repository.prototype.createBranch = -function(name, commit, force) { - var repo = this; + var oldLines = originalContent.toString().split("\n"); - if (commit instanceof Commit) { - return NodeGit.Branch.create( - repo, - name, - commit, - force ? 1 : 0); + // if no selected lines were sent, return the original content + if (!newLines || newLines.length === 0) { + return originalContent; } - else { - return repo.getCommit(commit).then(function(commit) { - return NodeGit.Branch.create( - repo, - name, - commit, - force ? 1 : 0); + + function lineEqualsFirstNewLine(hunkLine) { + return ((hunkLine.oldLineno() === newLines[0].oldLineno()) && + (hunkLine.newLineno() === newLines[0].newLineno())); + } + + function processSelectedLine(hunkLine) { + // if this hunk line is a selected line find the selected line + var newLine = newLines.filter(function(nLine) { + return ((hunkLine.oldLineno() === nLine.oldLineno()) && + (hunkLine.newLineno() === nLine.newLineno())); }); + + if (hunkLine.content().indexOf("\\ No newline at end of file") !== -1) { + return false; + } + + // determine what to add to the new content + if ((isStaged && newLine && newLine.length > 0) || + (!isStaged && (!newLine || newLine.length === 0))) { + if (hunkLine.origin() !== lineTypes.ADDED) { + newContent += hunkLine.content(); + } + if ((isStaged && hunkLine.origin() !== lineTypes.DELETED) || + (!isStaged && hunkLine.origin() !== lineTypes.ADDED)) { + oldIndex++; + } + } + else { + switch (hunkLine.origin()) { + case lineTypes.ADDED: + newContent += hunkLine.content(); + if (isStaged) { + oldIndex++; + } + break; + case lineTypes.DELETED: + if (!isStaged) { + oldIndex++; + } + break; + default: + newContent += oldLines[oldIndex++]; + if (oldIndex < oldLines.length) { + newContent += "\n"; + } + break; + } + } } -}; -/** - * Creates a branch with the passed in name pointing to the commit - * - * @async - * @param {String} startPath The base path where the lookup starts. - * @param {Number} acrossFs If non-zero, then the lookup will not stop when a - filesystem device change is detected while exploring - parent directories. - * @param {String} ceilingDirs A list of absolute symbolic link free paths. - which - * @return {String} Path of the git repository - */ -var discover = Repository.discover; -Repository.discover = function(searchPath, acrossFs, ceilingDirs, callback) { - return discover(searchPath, acrossFs, ceilingDirs) - .then(function(foundPath) { - foundPath = path.resolve(foundPath); - if (typeof callback === "function") { - callback(null, foundPath); + // find the affected hunk + pathHunks.forEach(function(pathHunk) { + linesPromises.push(pathHunk.lines()); + }); + + return Promise.all(linesPromises).then(function(results) { + for (var i = 0; i < results.length && newContent.length < 1; i++) { + var hunkStart = isStaged || reverse ? pathHunks[i].newStart() + : pathHunks[i].oldStart(); + var lines = results[i]; + if (lines.filter(lineEqualsFirstNewLine).length > 0) { + // add content that is before the hunk + while (hunkStart > (oldIndex + 1)) { + newContent += oldLines[oldIndex++] + "\n"; + } + + // modify the lines of the hunk according to the selection + lines.forEach(processSelectedLine); + + // add the rest of the file + while (oldLines.length > oldIndex) { + newContent += oldLines[oldIndex++] + + (oldLines.length > oldIndex ? "\n" : ""); + } } - return foundPath; - }, callback); -}; + } -/** - * Look up a refs's commit. - * - * @async - * @param {String|Ref} name Ref name, e.g. "master", "refs/heads/master" - * or Branch Ref - * @return {Commit} - */ -Repository.prototype.getReferenceCommit = function(name, callback) { - var repository = this; + return newContent; + }); +} - return this.getReference(name).then(function(reference) { - return repository.getCommit(reference.target()).then(function(commit) { - if (typeof callback === "function") { - callback(null, commit); +function getPathHunks(repo, index, filePath, isStaged, additionalDiffOptions) { + var diffOptions = additionalDiffOptions ? { + flags: additionalDiffOptions + } : undefined; + + return Promise.resolve() + .then(function() { + if (isStaged) { + return repo.getHeadCommit() + .then(function getTreeFromCommit(commit) { + return commit.getTree(); + }) + .then(function getDiffFromTree(tree) { + return NodeGit.Diff.treeToIndex(repo, tree, index, diffOptions); + }); } - return commit; - }); - }, callback); -}; + return NodeGit.Diff.indexToWorkdir(repo, index, { + flags: + NodeGit.Diff.OPTION.SHOW_UNTRACKED_CONTENT | + NodeGit.Diff.OPTION.RECURSE_UNTRACKED_DIRS | + (additionalDiffOptions || 0) + }); + }) + .then(function(diff) { + return NodeGit.Status.file(repo, filePath) + .then(function(status) { + if (!(status & NodeGit.Status.STATUS.WT_MODIFIED) && + !(status & NodeGit.Status.STATUS.INDEX_MODIFIED)) { + return Promise.reject + ("Selected staging is only available on modified files."); + } + return diff.patches(); + }); + }) + .then(function(patches) { + var pathPatch = patches.filter(function(patch) { + return patch.newFile().path() === filePath; + }); -/** -* Look up a branch. Alias for `getReference` -* -* @async -* @param {String|Ref} name Ref name, e.g. "master", "refs/heads/master" -* or Branch Ref -* @return {Ref} -*/ -Repository.prototype.getBranch = function(name, callback) { - return this.getReference(name, callback); -}; + if (pathPatch.length !== 1) { + return Promise.reject("No differences found for this file."); + } -/** -* Look up a branch's most recent commit. Alias to `getReferenceCommit` -* -* @async -* @param {String|Ref} name Ref name, e.g. "master", "refs/heads/master" -* or Branch Ref -* @return {Commit} -*/ -Repository.prototype.getBranchCommit = function(name, callback) { - return this.getReferenceCommit(name, callback); -}; + return pathPatch[0].hunks(); + }); +} -/** - * Gets the branch that HEAD currently points to - * Is an alias to head() - * @async - * @return {Reference} - */ -Repository.prototype.getCurrentBranch = function() { - return this.head(); -}; +function getReflogMessageForCommit(commit) { + var parentCount = commit.parentcount(); + var summary = commit.summary(); + var commitType; + + if (parentCount >= 2) { + commitType = " (merge)"; + } else if (parentCount == 0) { + commitType = " (initial)"; + } else { + commitType = ""; + } + + return `commit${commitType}: ${summary}`; +} /** - * Lookup the reference with the given name. + * Goes through a rebase's rebase operations and commits them if there are + * no merge conflicts * - * @async - * @param {String|Ref} name Ref name, e.g. "master", "refs/heads/master" - * or Branch Ref - * @return {Reference} + * @param {Repository} repository The repository that the rebase is being + * performed in + * @param {Rebase} rebase The current rebase being performed + * @param {Signature} signature Identity of the one performing the rebase + * @param {Function} beforeNextFn Callback to be called before each + * invocation of next(). If the callback + * returns a promise, the next() will be + * called when the promise resolves. + * @param {Function} beforeFinishFn Callback called before the invocation + * of finish(). If the callback returns a + * promise, finish() will be called when the + * promise resolves. This callback will be + * provided a detailed overview of the rebase + * @return {Int|Index} An error code for an unsuccesful rebase or an index for + * a rebase with conflicts */ -Repository.prototype.getReference = function(name, callback) { - var repository = this; +function performRebase( + repository, + rebase, + signature, + beforeNextFn, + beforeFinishFn +) { + var beforeNextFnResult; + + /* In the case of FF merges and a beforeFinishFn, this will fail + * when looking for 'rewritten' so we need to handle that case. + */ + function readRebaseMetadataFile(fileName, continueOnError) { + return fse.readFile( + path.join(repository.path(), "rebase-merge", fileName), + { encoding: "utf8" } + ) + .then(fp.trim) + .catch(function(err) { + if (continueOnError) { + return null; + } + throw err; + }); + } - return Reference.dwim(this, name).then(function(reference) { - if (reference.isSymbolic()) { - return reference.resolve().then(function(reference) { - reference.repo = repository; + function calcHeadName(input) { + return input.replace(/refs\/heads\/(.*)/, "$1"); + } - if (typeof callback === "function") { - callback(null, reference); + function getPromise() { + return rebase.next() + .then(function() { + return repository.refreshIndex(); + }) + .then(function(index) { + if (index.hasConflicts()) { + throw index; } - return reference; - }, callback); - } else { - reference.repo = repository; - if (typeof callback === "function") { - callback(null, reference); - } - return reference; - } - }, callback); -}; + return rebase.commit(null, signature); + }) + .then(function() { -Repository.getReferences = function(repo, type, refNamesOnly, callback) { - return Reference.list(repo).then(function(refList) { - var refFilterPromises = []; - var filteredRefs = []; - - refList.forEach(function(refName) { - refFilterPromises.push(Reference.lookup(repo, refName) - .then(function(ref) { - if (type == Reference.TYPE.LISTALL || ref.type() == type) { - if (refNamesOnly) { - filteredRefs.push(refName); - return; - } - - if (ref.isSymbolic()) { - return ref.resolve().then(function(resolvedRef) { - resolvedRef.repo = repo; - - filteredRefs.push(resolvedRef); - }) - .catch(function() { - // If we can't resolve the ref then just ignore it. + return performRebase( + repository, + rebase, + signature, + beforeNextFn, + beforeFinishFn + ); + }) + .catch(function(error) { + if (error && error.errno === NodeGit.Error.CODE.ITEROVER) { + const calcRewritten = fp.cond([ + [fp.isEmpty, fp.constant(null)], + [fp.stubTrue, fp.flow([ + fp.split("\n"), + fp.map(fp.split(" ")) + ])] + ]); + + const beforeFinishFnPromise = !beforeFinishFn ? + Promise.resolve() : + Promise.all([ + readRebaseMetadataFile("onto_name"), + readRebaseMetadataFile("onto"), + readRebaseMetadataFile("head-name").then(calcHeadName), + readRebaseMetadataFile("orig-head"), + readRebaseMetadataFile("rewritten", true).then(calcRewritten) + ]) + .then(function([ + ontoName, + ontoSha, + originalHeadName, + originalHeadSha, + rewritten + ]) { + return beforeFinishFn({ + ontoName, + ontoSha, + originalHeadName, + originalHeadSha, + rebase, + rewritten + }); }); - } - else { - filteredRefs.push(ref); - } - } - }) - ); - }); - return Promise.all(refFilterPromises).then(function() { - if (typeof callback === "function") { - callback(null, filteredRefs); - } - return filteredRefs; - }, callback); - }); -}; + return beforeFinishFnPromise + .then(function() { + return rebase.finish(signature); + }); + } else { + throw error; + } + }); + } + if(beforeNextFn) { + beforeNextFnResult = beforeNextFn(rebase); + // if beforeNextFn returns a promise, chain the promise + return Promise.resolve(beforeNextFnResult) + .then(getPromise); + } -/** - * Lookup references for a repository. - * - * @async - * @param {Reference.TYPE} type Type of reference to look up - * @return {Array} - */ -Repository.prototype.getReferences = function(type, callback) { - return Repository.getReferences(this, type, false, callback); -}; + return getPromise(); +} /** - * Lookup reference names for a repository. + * Look for a git repository, returning its path. * * @async - * @param {Reference.TYPE} type Type of reference to look up - * @return {Array} + * @param {String} startPath The base path where the lookup starts. + * @param {Number} acrossFs If non-zero, then the lookup will not stop when a + filesystem device change is detected while exploring + parent directories. + * @param {String} ceilingDirs A list of absolute symbolic link free paths. + the search will stop if any of these paths + are hit. This may be set to null + * @return {String} Path of the git repository */ -Repository.prototype.getReferenceNames = function(type, callback) { - return Repository.getReferences(this, type, true, callback); +Repository.discover = function(startPath, acrossFs, ceilingDirs) { + return _discover(startPath, acrossFs, ceilingDirs) + .then(function(foundPath) { + return path.resolve(foundPath); + }); }; -/** - * Retrieve the commit identified by oid. - * - * @async - * @param {String|Oid} String sha or Oid - * @return {Commit} - */ -Repository.prototype.getCommit = function(oid, callback) { - var repository = this; - return Commit.lookup(repository, oid).then(function(commit) { - commit.repo = repository; +Repository.getReferences = function(repo, type, refNamesOnly) { + return repo.getReferences().then(function(refList) { + var filteredRefList = refList.filter(function(reference) { + return type === Reference.TYPE.ALL || reference.type( ) === type; + }); - if (typeof callback === "function") { - callback(null, commit); + if (refNamesOnly) { + return filteredRefList.map(function(reference) { + return reference.name(); + }); } - return commit; - }, callback); + return filteredRefList; + }); }; /** - * Retrieve the blob represented by the oid. + * This will set the HEAD to point to the local branch and then attempt + * to update the index and working tree to match the content of the + * latest commit on that branch * * @async - * @param {String|Oid} String sha or Oid - * @return {Blob} + * @param {String|Reference} branch the branch to checkout + * @param {Object|CheckoutOptions} opts the options to use for the checkout */ -Repository.prototype.getBlob = function(oid, callback) { - var repository = this; - - return Blob.lookup(repository, oid).then(function(blob) { - blob.repo = repository; +Repository.prototype.checkoutBranch = function(branch, opts) { + var repo = this; - if (typeof callback === "function") { - callback(null, blob); + return repo.getReference(branch) + .then(function(ref) { + if (!ref.isBranch()) { + return false; } - - return blob; - }, callback); + return repo.checkoutRef(ref, opts); + }); }; /** - * Retrieve the tree represented by the oid. + * This will set the HEAD to point to the reference and then attempt + * to update the index and working tree to match the content of the + * latest commit on that reference * * @async - * @param {String|Oid} String sha or Oid - * @return {Tree} + * @param {Reference} reference the reference to checkout + * @param {Object|CheckoutOptions} opts the options to use for the checkout */ -Repository.prototype.getTree = function(oid, callback) { - var repository = this; - - return Tree.lookup(repository, oid).then(function(tree) { - tree.repo = repository; - - if (typeof callback === "function") { - callback(null, tree); - } +Repository.prototype.checkoutRef = function(reference, opts) { + var repo = this; + opts = opts || {}; - return tree; - }, callback); + opts.checkoutStrategy = opts.checkoutStrategy || + (NodeGit.Checkout.STRATEGY.SAFE | + NodeGit.Checkout.STRATEGY.RECREATE_MISSING); + return repo.getReferenceCommit(reference.name()) + .then(function(commit) { + return commit.getTree(); + }) + .then(function(tree) { + return Checkout.tree(repo, tree, opts); + }) + .then(function() { + var name = reference.name(); + return repo.setHead(name); + }); }; /** - * Creates a new annotated tag + * Continues an existing rebase * * @async - * @param {String|Oid} String sha or Oid - * @param {String} name the name of the tag - * @param {String} message the description that will be attached to the - * annotated tag - * @return {Tag} + * @param {Signature} signature Identity of the one performing the rebase + * @param {Function} beforeNextFn Callback to be called before each step + * of the rebase. If the callback returns a + * promise, the rebase will resume when the + * promise resolves. The rebase object is + * is passed to the callback. + * @param {Function} beforeFinishFn Callback called before the invocation + * of finish(). If the callback returns a + * promise, finish() will be called when the + * promise resolves. This callback will be + * provided a detailed overview of the rebase + * @param {RebaseOptions} rebaseOptions Options to initialize the rebase object + * with + * @return {Oid|Index} A commit id for a succesful merge or an index for a + * rebase with conflicts */ -Repository.prototype.createTag = function(oid, name, message, callback) { - var repository = this; - var signature = repository.defaultSignature(); +Repository.prototype.continueRebase = function( + signature, + beforeNextFn, + beforeFinishFn, + rebaseOptions +) { + const repo = this; + + let rebase; + let promiseChain = Promise.resolve(); + + if (!signature) { + promiseChain = promiseChain + .then(() => repo.defaultSignature()) + .then((signatureResult) => { + signature = signatureResult; + }); + } - return Commit.lookup(repository, oid) - .then(function(commit) { - // Final argument is `force` which overwrites any previous tag - return Tag.create(repository, name, commit, signature, message, 0); + return promiseChain + .then(() => repo.refreshIndex()) + .then((index) => { + if (index.hasConflicts()) { + throw index; + } + + return NodeGit.Rebase.open(repo, rebaseOptions); }) - .then(function(tagOid) { - return repository.getTag(tagOid, callback); + .then((_rebase) => { + rebase = _rebase; + return rebase.commit(null, signature) + .catch((e) => { + // If the first commit on continueRebase is a + // "patch already applied" error, + // interpret that as an explicit "skip commit" + // and ignore the error. + const errno = fp.get(["errno"], e); + if (errno === NodeGit.Error.CODE.EAPPLIED) { + return; + } + + throw e; + }); + }) + .then(() => { + return performRebase( + repo, + rebase, + signature, + beforeNextFn, + beforeFinishFn + ); + }) + .then((error) => { + if (error) { + throw error; + } + + return repo.getBranchCommit("HEAD"); }); }; /** - * Creates a new lightweight tag + * Creates a branch with the passed in name pointing to the commit * * @async - * @param {String|Oid} String sha or Oid - * @param {String} name the name of the tag + * @param {String} name Branch name, e.g. "master" + * @param {Commit|String|Oid} commit The commit the branch will point to + * @param {Boolean} force Overwrite branch if it exists * @return {Reference} */ -Repository.prototype.createLightweightTag = function(oid, name, callback) { - var repository = this; +Repository.prototype.createBranch = function(name, commit, force) { + var repo = this; - return Commit.lookup(repository, oid) - .then(function(commit) { - // Final argument is `force` which overwrites any previous tag - return Tag.createLightweight(repository, name, commit, 0); - }) - .then(function() { - return Reference.lookup(repository, "refs/tags/" + name); + if (commit instanceof Commit) { + return NodeGit.Branch.create( + repo, + name, + commit, + force ? 1 : 0); + } + else { + return repo.getCommit(commit).then(function(commit) { + return NodeGit.Branch.create( + repo, + name, + commit, + force ? 1 : 0); }); + } }; /** - * Retrieve the tag represented by the oid. + * Create a blob from a buffer * * @async - * @param {String|Oid} String sha or Oid - * @return {Tag} + * @param {Buffer} buffer + * @return {Oid} */ -Repository.prototype.getTag = function(oid, callback) { - var repository = this; - - return Tag.lookup(repository, oid).then(function(reference) { - reference.repo = repository; - - if (typeof callback === "function") { - callback(null, reference); - } - - return reference; - }, callback); +Repository.prototype.createBlobFromBuffer = function(buffer) { + return Blob.createFromBuffer(this, buffer, buffer.length); }; /** - * Retrieve the tag represented by the tag name. + * Create a commit * * @async - * @param {String} Short or full tag name - * @return {Tag} + * @param {String} updateRef + * @param {Signature} author + * @param {Signature} committer + * @param {String} message + * @param {Oid|String} Tree + * @param {Array} parents + * @return {Oid} The oid of the commit */ -Repository.prototype.getTagByName = function(name, callback) { - var repo = this; - - name = ~name.indexOf("refs/tags/") ? name : "refs/tags/" + name; +Repository.prototype.createCommit = function( + updateRef, author, committer, message, tree, parents) { - return Reference.nameToId(repo, name).then(function(oid) { - return Tag.lookup(repo, oid).then(function(reference) { - reference.repo = repo; + var repo = this; + var promises = []; - if (typeof callback === "function") { - callback(null, reference); - } + parents = parents || []; - return reference; - }); - }, callback); -}; + promises.push(repo.getTree(tree)); -/** - * Deletes a tag from a repository by the tag name. - * - * @async - * @param {String} Short or full tag name - */ -Repository.prototype.deleteTagByName = function(name) { - var repository = this; + parents.forEach(function(parent) { + promises.push(repo.getCommit(parent)); + }); - name = ~name.indexOf("refs/tags/") ? name.substr(10) : name; + return Promise.all(promises).then(function(results) { + tree = results[0]; - return Tag.delete(repository, name); -}; + // Get the normalized values for our input into the function + var parentsLength = parents.length; + parents = []; -/** - * Instantiate a new revision walker for browsing the Repository"s history. - * See also `Commit.prototype.history()` - * - * @param {String|Oid} String sha or Oid - * @return {RevWalk} - */ -Repository.prototype.createRevWalk = function() { - var revWalk = Revwalk.create(this); - revWalk.repo = this; - return revWalk; -}; + for (var i = 0; i < parentsLength; i++) { + parents.push(results[i + 1]); + } -/** - * Retrieve the master branch commit. - * - * @async - * @return {Commit} - */ -Repository.prototype.getMasterCommit = function(callback) { - return this.getBranchCommit("master", callback); + return Commit.create( + repo, + updateRef, + author, + committer, + null /* use default message encoding */, + message, + tree, + parents.length, + parents + ); + }); }; /** - * Retrieve the commit that HEAD is currently pointing to + * Create a commit * * @async - * @return {Commit} + * @param {Signature} author + * @param {Signature} committer + * @param {String} message + * @param {Oid|String} treeOid + * @param {Array} parents + * @return {String} The content of the commit object + * as a string */ -Repository.prototype.getHeadCommit = function(callback) { - var repo = this; - - return Reference.nameToId(repo, "HEAD") - .then(function(head) { - return repo.getCommit(head, callback); - }) - .catch(function() { - return null; +Repository.prototype.createCommitBuffer = function( + author, committer, message, treeOid, parents) { + + const repo = this; + const promises = (parents || []) + .reduce(function(acc, parent) { + acc.push(repo.getCommit(parent)); + return acc; + }, [repo.getTree(treeOid)]); + + return Promise.all(promises) + .then(function([tree, ...parentCommits]) { + return Commit.createBuffer( + repo, + author, + committer, + null /* use default message encoding */, + message, + tree, + parentCommits.length, + parentCommits + ); }); }; /** - * Create a commit + * Create a commit that is digitally signed * * @async * @param {String} updateRef @@ -452,13 +624,23 @@ Repository.prototype.getHeadCommit = function(callback) { * @param {String} message * @param {Tree|Oid|String} Tree * @param {Array} parents + * @param {Function} onSignature Callback to be called with string to be signed * @return {Oid} The oid of the commit */ -Repository.prototype.createCommit = function( - updateRef, author, committer, message, tree, parents, callback) { +Repository.prototype.createCommitWithSignature = function( + updateRef, + author, + committer, + message, + tree, + parents, + onSignature +) { var repo = this; var promises = []; + var commitContent; + var skippedSigning; parents = parents || []; @@ -468,7 +650,7 @@ Repository.prototype.createCommit = function( promises.push(repo.getCommit(parent)); }); - return Promise.all(promises).then(function(results) { + const createCommitPromise = Promise.all(promises).then(function(results) { tree = results[0]; // Get the normalized values for our input into the function @@ -479,9 +661,8 @@ Repository.prototype.createCommit = function( parents.push(results[i + 1]); } - return Commit.create( + return Commit.createBuffer( repo, - updateRef, author, committer, null /* use default message encoding */, @@ -490,17 +671,74 @@ Repository.prototype.createCommit = function( parents.length, parents ); - }).then(function(commit) { - if (typeof callback === "function") { - callback(null, commit); + }).then(function(commitContentResult) { + commitContent = commitContentResult; + if (!commitContent.endsWith("\n")) { + commitContent += "\n"; + } + return onSignature(commitContent); + }).then(function({ code, field, signedData }) { + switch (code) { + case NodeGit.Error.CODE.OK: + return Commit.createWithSignature( + repo, + commitContent, + signedData, + field + ); + case NodeGit.Error.CODE.PASSTHROUGH: + skippedSigning = true; + return Commit.create( + repo, + updateRef, + author, + committer, + null /* use default message encoding */, + message, + tree, + parents.length, + parents + ); + default: { + const error = new Error( + "Repository.prototype.createCommitWithSignature " + + `threw with error code ${code}` + ); + error.errno = code; + throw error; + } } + }); + + if (!updateRef) { + return createCommitPromise; + } - return commit; - }, callback); + return createCommitPromise + .then(function(commitOid) { + if (skippedSigning) { + return commitOid; + } + + return repo.getCommit(commitOid) + .then(function(commitResult) { + return Reference.updateTerminal( + repo, + updateRef, + commitOid, + getReflogMessageForCommit(commitResult), + committer + ); + }) + .then(function() { + return commitOid; + }); + }); }; /** * Creates a new commit on HEAD from the list of passed in files + * * @async * @param {Array} filesToAdd * @param {Signature} author @@ -512,160 +750,245 @@ Repository.prototype.createCommitOnHead = function( filesToAdd, author, committer, - message, - callback) { + message) { - var index; var repo = this; - return repo.openIndex() - .then(function(index_) { - index = index_; - index.read(1); - if (!filesToAdd) { filesToAdd = []; } - filesToAdd.forEach(function(filePath) { - index.addByPath(filePath); - }); - index.write(); - return index.writeTree(); + return repo.refreshIndex() + .then(function(index) { + if (!filesToAdd) { + filesToAdd = []; + } + + return filesToAdd + .reduce(function(lastFilePromise, filePath) { + return lastFilePromise + .then(function() { + return index.addByPath(filePath); + }); + }, Promise.resolve()) + .then(function() { + return index.write(); + }) + .then(function() { + return index.writeTree(); + }); }) .then(function(treeOid) { return repo.getHeadCommit() .then(function(parent) { + if (parent !== null) { // To handle a fresh repo with no commits + parent = [parent]; + } return repo.createCommit( "HEAD", author, committer, message, treeOid, - [parent] + parent ); }); - }, callback); + }); }; /** - * Create a blob from a buffer + * Creates a new lightweight tag * - * @param {Buffer} buffer - * @return {Blob} + * @async + * @param {String|Oid} String sha or Oid + * @param {String} name the name of the tag + * @return {Reference} */ -Repository.prototype.createBlobFromBuffer = function(buffer, callback) { - return Blob.createFromBuffer(this, buffer, buffer.length, callback); +Repository.prototype.createLightweightTag = function(oid, name) { + var repository = this; + + return Commit.lookup(repository, oid) + .then(function(commit) { + // Final argument is `force` which overwrites any previous tag + return Tag.createLightweight(repository, name, commit, 0); + }) + .then(function() { + return Reference.lookup(repository, "refs/tags/" + name); + }); }; /** - * Create a new tree builder. + * Instantiate a new revision walker for browsing the Repository"s history. + * See also `Commit.prototype.history()` * - * @param {Tree} tree + * @return {Revwalk} */ -Repository.prototype.treeBuilder = function() { - var builder = TreeBuilder.create(null); - - builder.root = builder; - builder.repo = this; +Repository.prototype.createRevWalk = function() { + return Revwalk.create(this); +}; - return builder; +/** + * Creates a new annotated tag + * + * @async + * @param {String|Oid} String sha or Oid + * @param {String} name the name of the tag + * @param {String} message the description that will be attached to the + * annotated tag + * @return {Tag} + */ +Repository.prototype.createTag = function(oid, name, message) { + const repository = this; + let signature = null; + + return repository.defaultSignature() + .then((signatureResult) => { + signature = signatureResult; + return Commit.lookup(repository, oid); + }) + .then((commit) => { + // Final argument is `force` which overwrites any previous tag + return Tag.create(repository, name, commit, signature, message, 0); + }) + .then((tagOid) => { + return repository.getTag(tagOid); + }); }; /** * Gets the default signature for the default user and now timestamp + * + * @async * @return {Signature} */ Repository.prototype.defaultSignature = function() { - var result = NodeGit.Signature.default(this); - - if (!result || !result.name()) { - result = NodeGit.Signature.now("unknown", "unknown@unknown.com"); - } - - return result; -}; - -/** -* Lists out the remotes in the given repository. -* -* @param {Function} Optional callback -* @return {Object} Promise object. -*/ -Repository.prototype.getRemotes = function(callback) { - return Remote.list(this).then(function(remotes) { - if (typeof callback === "function") { - callback(null, remotes); - } - - return remotes; - }, callback); + return NodeGit.Signature.default(this) + .then((result) => { + if (!result || !result.name()) { + result = NodeGit.Signature.now("unknown", "unknown@example.com"); + } + return result; + }) + .catch(() => { + return NodeGit.Signature.now("unknown", "unknown@example.com"); + }); }; /** - * Gets a remote from the repo + * Deletes a tag from a repository by the tag name. * - * @param {String|Remote} remote - * @param {Function} callback - * @return {Remote} The remote object + * @async + * @param {String} Short or full tag name */ -Repository.prototype.getRemote = function(remote, callback) { - if (remote instanceof NodeGit.Remote) { - return Promise.resolve(remote).then(function(remoteObj) { - if (typeof callback === "function") { - callback(null, remoteObj); - } - - return remoteObj; - }, callback); - } +Repository.prototype.deleteTagByName = function(name) { + var repository = this; - return NodeGit.Remote.lookup(this, remote).then(function(remoteObj) { - if (typeof callback === "function") { - callback(null, remoteObj); - } + name = ~name.indexOf("refs/tags/") ? name.substr(10) : name; - return remoteObj; - }, callback); + return Tag.delete(repository, name); }; /** - * Fetches from a remote + * Discard line selection of a specified file. + * Assumes selected lines are unstaged. * + * @async + * @param {String} filePath The relative path of this file in the repo + * @param {Array} selectedLines The array of DiffLine objects + * selected for discarding + * @return {Number} 0 or an error code + */ +Repository.prototype.discardLines = + function(filePath, selectedLines, additionalDiffOptions) { + var repo = this; + var fullFilePath = path.join(repo.workdir(), filePath); + var index; + var originalContent; + var filterList; + + return repo.refreshIndex() + .then(function(indexResult) { + index = indexResult; + return FilterList.load( + repo, + null, + filePath, + Filter.MODE.CLEAN, + Filter.FLAG.DEFAULT + ); + }) + .then(function(_filterList) { + filterList = _filterList; + + if (filterList) { + return filterList.applyToFile(repo, filePath); + } + + return fse.readFile(fullFilePath, "utf8"); + }) + .then(function(content) { + originalContent = content; + return getPathHunks(repo, index, filePath, false, additionalDiffOptions); + }) + .then(function(hunks) { + return applySelectedLinesToTarget( + originalContent, selectedLines, hunks, false, true + ); + }) + .then(function(newContent) { + return FilterList.load( + repo, + null, + filePath, + Filter.MODE.SMUDGE, + Filter.FLAG.DEFAULT + ) + .then(function(_filterList) { + filterList = _filterList; + if (filterList) { + /* jshint ignore:start */ + // We need the constructor for the check in NodeGit's C++ layer + // to accept an object, and this seems to be a nice way to do it + return filterList.applyToData(new String(newContent)); + /* jshint ignore:end */ + } + + return newContent; + }); + }) + .then(function(filteredContent) { + return fse.writeFile(fullFilePath, filteredContent); + }); +}; + +/** + * Fetches from a remote + * + * @async * @param {String|Remote} remote * @param {Object|FetchOptions} fetchOptions Options for the fetch, includes * callbacks for fetching */ Repository.prototype.fetch = function( remote, - fetchOptions, - callback) + fetchOptions) { var repo = this; - function finallyFn() { - if (typeof callback === "function") { - callback(); - } - } - return repo.getRemote(remote) .then(function(remote) { return remote.fetch(null, fetchOptions, "Fetch from " + remote) .then(function() { return remote.disconnect(); }); - }) - .then(finallyFn, finallyFn); + }); }; /** * Fetches from all remotes. This is done in series due to deadlocking issues * with fetching from many remotes that can happen. + * + * @async * @param {Object|FetchOptions} fetchOptions Options for the fetch, includes * callbacks for fetching - * @param {Function} callback */ -Repository.prototype.fetchAll = function( - fetchOptions, - callback) -{ +Repository.prototype.fetchAll = function(fetchOptions) { var repo = this; function createCallbackWrapper(fn, remote) { @@ -685,7 +1008,7 @@ Repository.prototype.fetchAll = function( var certificateCheck = remoteCallbacks.certificateCheck; var transferProgress = remoteCallbacks.transferProgress; - return repo.getRemotes() + return repo.getRemoteNames() .then(function(remotes) { return remotes.reduce(function(fetchPromise, remote) { var wrappedFetchOptions = shallowClone(fetchOptions); @@ -712,303 +1035,198 @@ Repository.prototype.fetchAll = function( return repo.fetch(remote, wrappedFetchOptions); }); }, Promise.resolve()); - }) - .then(function() { - if (typeof callback === "function") { - callback(); - } }); }; +/** + * @async + * @param {FetchheadForeachCb} callback The callback function to be called on + * each entry + */ +Repository.prototype.fetchheadForeach = function(callback) { + return _fetchheadForeach.call(this, callback, null); +}; /** - * Merge a branch onto another branch + * Retrieve the blob represented by the oid. * - * @param {String|Ref} to - * @param {String|Ref} from - * @param {Signature} signature - * @param {Merge.PREFERENCE} mergePreference - * @return {Oid|Index} A commit id for a succesful merge or an index for a - * merge with conflicts + * @async + * @param {String|Oid} String sha or Oid + * @return {Blob} */ -Repository.prototype.mergeBranches = - function(to, from, signature, mergePreference) { - var repo = this; - var fromBranch; - var toBranch; - mergePreference = mergePreference || NodeGit.Merge.PREFERENCE.NONE; - - signature = signature || repo.defaultSignature(); - - return Promise.all([ - repo.getBranch(to), - repo.getBranch(from) - ]).then(function(objects) { - toBranch = objects[0]; - fromBranch = objects[1]; +Repository.prototype.getBlob = function(oid) { + var repository = this; - return Promise.all([ - repo.getBranchCommit(toBranch), - repo.getBranchCommit(fromBranch) - ]); - }) - .then(function(branchCommits) { - var toCommitOid = branchCommits[0].toString(); - var fromCommitOid = branchCommits[1].toString(); + return Blob.lookup(repository, oid).then(function(blob) { + blob.repo = repository; + return blob; + }); +}; - return NodeGit.Merge.base(repo, toCommitOid, fromCommitOid) - .then(function(baseCommit) { - if (baseCommit.toString() == fromCommitOid) { - // The commit we're merging to is already in our history. - // nothing to do so just return the commit the branch is on - return toCommitOid; - } - else if (baseCommit.toString() == toCommitOid && - mergePreference !== NodeGit.Merge.PREFERENCE.NO_FASTFORWARD) { - // fast forward - var message = - "Fast forward branch " + - toBranch.shorthand() + - " to branch " + - fromBranch.shorthand(); +/** +* Look up a branch. Alias for `getReference` +* +* @async +* @param {String|Reference} name Ref name, e.g. "master", "refs/heads/master" +* or Branch Ref +* @return {Reference} +*/ +Repository.prototype.getBranch = function(name) { + return this.getReference(name); +}; - return branchCommits[1].getTree() - .then(function(tree) { - if (toBranch.isHead()) { - // Checkout the tree if we're on the branch - var opts = { - checkoutStrategy: NodeGit.Checkout.STRATEGY.SAFE | - NodeGit.Checkout.STRATEGY.RECREATE_MISSING - }; - return NodeGit.Checkout.tree(repo, tree, opts); - } - }) - .then(function() { - return toBranch.setTarget( - fromCommitOid, - message) - .then(function() { - return fromCommitOid; - }); - }); - } - else if (mergePreference !== NodeGit.Merge.PREFERENCE.FASTFORWARD_ONLY) { - var updateHead; - // We have to merge. Lets do it! - return NodeGit.Reference.lookup(repo, "HEAD") - .then(function(headRef) { - return headRef.resolve(); - }) - .then(function(headRef) { - updateHead = !!headRef && (headRef.name() === toBranch.name()); - return NodeGit.Merge.commits(repo, toCommitOid, fromCommitOid); - }) - .then(function(index) { - // if we have conflicts then throw the index - if (index.hasConflicts()) { - throw index; - } +/** +* Look up a branch's most recent commit. Alias to `getReferenceCommit` +* +* @async +* @param {String|Reference} name Ref name, e.g. "master", "refs/heads/master" +* or Branch Ref +* @return {Commit} +*/ +Repository.prototype.getBranchCommit = function(name) { + return this.getReferenceCommit(name); +}; - // No conflicts so just go ahead with the merge - index.write(); - return index.writeTreeTo(repo); - }) - .then(function(oid) { - var message = - "Merged " + - fromBranch.shorthand() + - " into " + - toBranch.shorthand(); +/** + * Retrieve the commit identified by oid. + * + * @async + * @param {String|Oid} String sha or Oid + * @return {Commit} + */ +Repository.prototype.getCommit = function(oid) { + var repository = this; - return repo.createCommit( - toBranch.name(), - signature, - signature, - message, - oid, - [toCommitOid, fromCommitOid]); - }) - .then(function(commit) { - // // we've updated the checked out branch, so make sure we update - // // head so that our index isn't messed up - if (updateHead) { - return repo.getBranch(to) - .then(function(branch) { - return repo.getBranchCommit(branch); - }) - .then(function(branchCommit) { - return branchCommit.getTree(); - }) - .then(function(tree) { - var opts = { - checkoutStrategy: NodeGit.Checkout.STRATEGY.SAFE | - NodeGit.Checkout.STRATEGY.RECREATE_MISSING - }; - return NodeGit.Checkout.tree(repo, tree, opts); - }) - .then(function() { - return commit; - }); - } - else { - return commit; - } - }); - } - else { - // A non fast-forwardable merge with ff-only - return toCommitOid; - } - }); - }); + return Commit.lookup(repository, oid); }; /** - * Goes through a rebase's rebase operations and commits them if there are - * no merge conflicts + * Gets the branch that HEAD currently points to + * Is an alias to head() * - * @param {Repository} repository The repository that the rebase is being - * performed in - * @param {Rebase} rebase The current rebase being performed - * @param {Signature} signature Identity of the one performing the rebase - * @return {Int|Index} An error code for an unsuccesful rebase or an index for - * a rebase with conflicts + * @async + * @return {Reference} */ -function performRebase(repository, rebase, signature) { - return rebase.next() - .then(function(rebaseOperation) { - return repository.openIndex() - .then(function(index) { - if (index.hasConflicts()) { - throw index; - } - - if (rebaseOperation) { - rebase.commit(null, signature); +Repository.prototype.getCurrentBranch = function() { + return this.head(); +}; - return performRebase(repository, rebase, signature); - } +/** + * Retrieve the commit that HEAD is currently pointing to + * + * @async + * @return {Commit} + */ +Repository.prototype.getHeadCommit = function() { + var repo = this; - return rebase.finish(signature); - }); + return Reference.nameToId(repo, "HEAD") + .then(function(head) { + return repo.getCommit(head); + }) + .catch(function() { + return null; }); -} +}; /** - * Rebases a branch onto another branch + * Retrieve the master branch commit. * - * @param {String} branch - * @param {String} upstream - * @param {String} onto - * @param {Signature} signature Identity of the one performing the rebase - * @return {Oid|Index} A commit id for a succesful merge or an index for a - * rebase with conflicts + * @async + * @return {Commit} */ -Repository.prototype.rebaseBranches = function( - branch, - upstream, - onto, - signature) -{ - var repo = this; - var branchCommit; - var upstreamCommit; - var ontoCommit; - - signature = signature || repo.defaultSignature(); +Repository.prototype.getMasterCommit = function() { + return this.getBranchCommit("master"); +}; - return Promise.all([ - repo.getReference(branch), - upstream ? repo.getReference(upstream) : null, - onto ? repo.getReference(onto) : null - ]) - .then(function(refs) { - return Promise.all([ - NodeGit.AnnotatedCommit.fromRef(repo, refs[0]), - upstream ? NodeGit.AnnotatedCommit.fromRef(repo, refs[1]) : null, - onto ? NodeGit.AnnotatedCommit.fromRef(repo, refs[2]) : null - ]); - }) - .then(function(annotatedCommits) { - branchCommit = annotatedCommits[0]; - upstreamCommit = annotatedCommits[1]; - ontoCommit = annotatedCommits[2]; +/** + * Lookup the reference with the given name. + * + * @async + * @param {String|Reference} name Ref name, e.g. "master", "refs/heads/master" + * or Branch Ref + * @return {Reference} + */ +Repository.prototype.getReference = function(name) { + var repository = this; - return NodeGit.Merge.base(repo, branchCommit.id(), upstreamCommit.id()); - }) - .then(function(oid) { - if (oid.toString() === branchCommit.id().toString()) { - // we just need to fast-forward - return repo.mergeBranches(branch, upstream) - .then(function() { - // checkout 'branch' to match the behavior of rebase - return repo.checkoutBranch(branch); - }); - } else if (oid.toString() === upstreamCommit.id().toString()) { - // 'branch' is already on top of 'upstream' - // checkout 'branch' to match the behavior of rebase - return repo.checkoutBranch(branch); + return Reference.dwim(this, name).then(function(reference) { + if (reference.isSymbolic()) { + return reference.resolve().then(function(reference) { + reference.repo = repository; + return reference; + }); } - return NodeGit.Rebase.init(repo, branchCommit, upstreamCommit, ontoCommit) - .then(function(rebase) { - return performRebase(repo, rebase, signature); - }) - .then(function(error) { - if (error) { - throw error; - } - }); - }) - .then(function() { - return repo.getBranchCommit("HEAD"); + reference.repo = repository; + return reference; + }); +}; + +/** + * Look up a refs's commit. + * + * @async + * @param {String|Reference} name Ref name, e.g. "master", "refs/heads/master" + * or Branch Ref + * @return {Commit} + */ +Repository.prototype.getReferenceCommit = function(name) { + var repository = this; + + return this.getReference(name).then(function(reference) { + return repository.getCommit(reference.target()); }); }; /** - * Continues an existing rebase + * Lookup reference names for a repository. + * + * @async + * @param {Reference.TYPE} type Type of reference to look up + * @return {Array} + */ +Repository.prototype.getReferenceNames = function(type) { + return Repository.getReferences(this, type, true); +}; + +/** + * Lookup references for a repository. * - * @param {Signature} signature Identity of the one performing the rebase - * @return {Oid|Index} A commit id for a succesful merge or an index for a - * rebase with conflicts + * @async + * @param {Reference.TYPE} type Type of reference to look up + * @return {Array} */ -Repository.prototype.continueRebase = function(signature) { - var repo = this; - - signature = signature || repo.defaultSignature(); - - return repo.openIndex() - .then(function(index) { - if (index.hasConflicts()) { - throw index; - } - return NodeGit.Rebase.open(repo); - }) - .then(function(rebase) { - rebase.commit(null, signature); - - return performRebase(repo, rebase, signature); - }) - .then(function(error) { - if (error) { - throw error; - } +/** + * Gets a remote from the repo + * + * @async + * @param {String|Remote} remote + * @return {Remote} The remote object + */ +Repository.prototype.getRemote = function(remote) { + if (remote instanceof NodeGit.Remote) { + return Promise.resolve(remote); + } - return repo.getBranchCommit("HEAD"); - }); + return NodeGit.Remote.lookup(this, remote); }; -// Override Repository.initExt to normalize initoptions -var initExt = Repository.initExt; -Repository.initExt = function(repo_path, opts) { - opts = normalizeOptions(opts, NodeGit.RepositoryInitOptions); - return initExt(repo_path, opts); +/** +* Lists out the remotes in the given repository. +* +* @async +* @return {Object} Promise object. +*/ +Repository.prototype.getRemoteNames = function() { + return Remote.list(this); }; /** * Get the status of a repo to it's working directory * + * @async * @param {obj} opts * @return {Array} */ @@ -1034,8 +1252,9 @@ Repository.prototype.getStatus = function(opts) { * Get extended statuses of a repo to it's working directory. Status entries * have `status`, `headToIndex` delta, and `indexToWorkdir` deltas * + * @async * @param {obj} opts - * @return {Array} + * @return {Array} */ Repository.prototype.getStatusExt = function(opts) { var statuses = []; @@ -1062,304 +1281,693 @@ Repository.prototype.getStatusExt = function(opts) { }; /** - * This will set the HEAD to point to the local branch and then attempt - * to update the index and working tree to match the content of the - * latest commit on that branch + * Get the names of the submodules in the repository. * * @async - * @param {String|Reference} branch the branch to checkout - * @param {Object|CheckoutOptions} opts the options to use for the checkout + * @return {Array} */ -Repository.prototype.checkoutBranch = function(branch, opts) { +Repository.prototype.getSubmoduleNames = function() { + var names = []; + var submoduleCallback = function(submodule, name, payload) { + names.push(name); + }; + + return Submodule.foreach(this, submoduleCallback).then(function() { + return names; + }); +}; + +/** + * Retrieve the tag represented by the oid. + * + * @async + * @param {String|Oid} String sha or Oid + * @return {Tag} + */ +Repository.prototype.getTag = function(oid) { + var repository = this; + + return Tag.lookup(repository, oid).then(function(reference) { + reference.repo = repository; + return reference; + }); +}; + +/** + * Retrieve the tag represented by the tag name. + * + * @async + * @param {String} Short or full tag name + * @return {Tag} + */ +Repository.prototype.getTagByName = function(name) { var repo = this; - var reference; - opts = opts || {}; - opts.checkoutStrategy = opts.checkoutStrategy || - (NodeGit.Checkout.STRATEGY.SAFE | - NodeGit.Checkout.STRATEGY.RECREATE_MISSING); - return repo.getReference(branch) - .then(function(ref) { - if (!ref.isBranch()) { - return false; - } - reference = ref; - return repo.getBranchCommit(ref.name()); + name = ~name.indexOf("refs/tags/") ? name : "refs/tags/" + name; + + return Reference.nameToId(repo, name) + .then(function(oid) { + return Tag.lookup(repo, oid); + }).then(function(reference) { + reference.repo = repo; + return reference; + }); +}; + +/** + * Retrieve the tree represented by the oid. + * + * @async + * @param {String|Oid} String sha or Oid + * @return {Tree} + */ +Repository.prototype.getTree = function(oid) { + var repository = this; + + return Tree.lookup(repository, oid).then(function(tree) { + tree.repo = repository; + return tree; + }); +}; + +/** + * Returns true if the repository is in the APPLY_MAILBOX or + * APPLY_MAILBOX_OR_REBASE state. + * @return {Boolean} + */ +Repository.prototype.isApplyingMailbox = function() { + var state = this.state(); + return state === NodeGit.Repository.STATE.APPLY_MAILBOX || + state === NodeGit.Repository.STATE.APPLY_MAILBOX_OR_REBASE; +}; + +/** + * Returns true if the repository is in the BISECT state. + * @return {Boolean} + */ +Repository.prototype.isBisecting = function() { + return this.state() === NodeGit.Repository.STATE.BISECT; +}; + +/** + * Returns true if the repository is in the CHERRYPICK state. + * @return {Boolean} + */ +Repository.prototype.isCherrypicking = function() { + return this.state() === NodeGit.Repository.STATE.CHERRYPICK; +}; + +/** + * Returns true if the repository is in the default NONE state. + * @return {Boolean} + */ +Repository.prototype.isDefaultState = function() { + return this.state() === NodeGit.Repository.STATE.NONE; +}; + +/** + * Returns true if the repository is in the MERGE state. + * @return {Boolean} + */ +Repository.prototype.isMerging = function() { + return this.state() === NodeGit.Repository.STATE.MERGE; +}; + +/** + * Returns true if the repository is in the REBASE, REBASE_INTERACTIVE, or + * REBASE_MERGE state. + * @return {Boolean} + */ +Repository.prototype.isRebasing = function() { + var state = this.state(); + return state === NodeGit.Repository.STATE.REBASE || + state === NodeGit.Repository.STATE.REBASE_INTERACTIVE || + state === NodeGit.Repository.STATE.REBASE_MERGE; +}; + +/** + * Returns true if the repository is in the REVERT state. + * @return {Boolean} + */ +Repository.prototype.isReverting = function() { + return this.state() === NodeGit.Repository.STATE.REVERT; +}; + +/** + * Rebases a branch onto another branch + * + * @async + * @param {String} branch + * @param {String} upstream + * @param {String} onto + * @param {Signature} signature Identity of the one performing the rebase + * @param {Function} beforeNextFn Callback to be called before each step + * of the rebase. If the callback returns a + * promise, the rebase will resume when the + * promise resolves. The rebase object is + * is passed to the callback. + * @param {Function} beforeFinishFn Callback called before the invocation + * of finish(). If the callback returns a + * promise, finish() will be called when the + * promise resolves. This callback will be + * provided a detailed overview of the rebase + * @param {RebaseOptions} rebaseOptions Options to initialize the rebase object + * with + * @return {Oid|Index} A commit id for a succesful merge or an index for a + * rebase with conflicts + */ +Repository.prototype.rebaseBranches = function( + branch, + upstream, + onto, + signature, + beforeNextFn, + beforeFinishFn, + rebaseOptions +) +{ + const repo = this; + let branchCommit; + let upstreamCommit; + let ontoCommit; + let mergeOptions = (rebaseOptions || {}).mergeOptions; + + let promiseChain = Promise.resolve(); + + if (!signature) { + promiseChain = promiseChain + .then(() => repo.defaultSignature()) + .then((signatureResult) => { + signature = signatureResult; + }); + } + + return Promise.all([ + repo.getReference(branch), + upstream ? repo.getReference(upstream) : null, + onto ? repo.getReference(onto) : null + ]) + .then(function(refs) { + return Promise.all([ + NodeGit.AnnotatedCommit.fromRef(repo, refs[0]), + upstream ? NodeGit.AnnotatedCommit.fromRef(repo, refs[1]) : null, + onto ? NodeGit.AnnotatedCommit.fromRef(repo, refs[2]) : null + ]); }) - .then(function(commit) { - return commit.getTree(); + .then(function(annotatedCommits) { + branchCommit = annotatedCommits[0]; + upstreamCommit = annotatedCommits[1]; + ontoCommit = annotatedCommits[2]; + + return NodeGit.Merge.base(repo, branchCommit.id(), upstreamCommit.id()); }) - .then(function(tree) { - return Checkout.tree(repo, tree, opts); + .then(function(oid) { + if (oid.toString() === branchCommit.id().toString()) { + // we just need to fast-forward + return repo.mergeBranches(branch, upstream, null, null, mergeOptions) + .then(function() { + // checkout 'branch' to match the behavior of rebase + return repo.checkoutBranch(branch); + }); + } else if (oid.toString() === upstreamCommit.id().toString()) { + // 'branch' is already on top of 'upstream' + // checkout 'branch' to match the behavior of rebase + return repo.checkoutBranch(branch); + } + + return NodeGit.Rebase.init( + repo, + branchCommit, + upstreamCommit, + ontoCommit, + rebaseOptions + ) + .then(function(rebase) { + return performRebase( + repo, + rebase, + signature, + beforeNextFn, + beforeFinishFn + ); + }) + .then(function(error) { + if (error) { + throw error; + } + }); }) .then(function() { - var name = reference.name(); - return repo.setHead(name); + return repo.getBranchCommit("HEAD"); }); }; -var fetchheadForeach = Repository.prototype.fetchheadForeach; /** + * Grabs a fresh copy of the index from the repository. Invalidates + * all previously grabbed indexes + * * @async - * @param {FetchheadForeachCb} callback The callback function to be called on - * each entry + * @return {Index} */ -Repository.prototype.fetchheadForeach = function(callback) { - return fetchheadForeach.call(this, callback, null); +Repository.prototype.refreshIndex = function() { + var repo = this; + + repo.setIndex(); // clear the index + + return repo.index(); }; /** - * Stages or unstages line selection of a specified file + * Merge a branch onto another branch + * * @async - * @param {String} filePath The relative path of this file in the repo - * @param {Array} newLines The array of DiffLine objects - * selected for staging or unstaging - * @param {Boolean} isStaged Are the selected lines currently staged - * @return {Number} 0 or an error code + * @param {String|Reference} to + * @param {String|Reference} from + * @param {Signature} signature + * @param {Merge.PREFERENCE} mergePreference + * @param {MergeOptions} mergeOptions + * @param {MergeBranchOptions} mergeBranchOptions + * @return {Oid|Index} A commit id for a succesful merge or an index for a + * merge with conflicts */ -Repository.prototype.stageLines = - function(filePath, selectedLines, isSelectionStaged) { +Repository.prototype.mergeBranches = function( + to, + from, + signature, + mergePreference, + mergeOptions, + mergeBranchOptions +) { + const repo = this; + let fromBranch; + let toBranch; + // Support old parameter `processMergeMessageCallback` + const isOldOptionParameter = typeof mergeBranchOptions === "function"; + if (isOldOptionParameter) { + console.error("DeprecationWarning: Repository#mergeBranches parameter " + + "processMergeMessageCallback, use MergeBranchOptions"); + } + const processMergeMessageCallback = mergeBranchOptions && + (isOldOptionParameter ? + mergeBranchOptions : + mergeBranchOptions.processMergeMessageCallback) || + function (message) { return message; }; + const signingCallback = mergeBranchOptions && mergeBranchOptions.signingCb; - function applySelectedLinesToBlob - (pathHunks, isStaged, newLines, originalBlob) { - var lineTypes = { - ADDED: 43, // ascii code for '+' - DELETED: 45 // ascii code for '-' - }; - var newContent = ""; - var oldIndex = 0; - var linesPromises = []; + mergePreference = mergePreference || NodeGit.Merge.PREFERENCE.NONE; - //split the original file into lines - var oldLines = originalBlob.toString().split("\n"); + let promiseChain = Promise.resolve(); - //if no selected lines were sent, return the original content - if (!newLines || newLines.length === 0) { - return originalBlob; - } + if (!signature) { + promiseChain = promiseChain + .then(() => repo.defaultSignature()) + .then((signatureResult) => { + signature = signatureResult; + }); + } - function lineEqualsFirstNewLine(hunkLine) { - return ((hunkLine.oldLineno() === newLines[0].oldLineno()) && - (hunkLine.newLineno() === newLines[0].newLineno())); - } + return promiseChain.then(() => Promise.all([ + repo.getBranch(to), + repo.getBranch(from) + ])) + .then((objects) => { + toBranch = objects[0]; + fromBranch = objects[1]; - function processSelectedLine(hunkLine) { - //if this hunk line is a selected line find the selected line - var newLine = newLines.filter(function(nLine) { - return ((hunkLine.oldLineno() === nLine.oldLineno()) && - (hunkLine.newLineno() === nLine.newLineno())); - }); + return Promise.all([ + repo.getBranchCommit(toBranch), + repo.getBranchCommit(fromBranch) + ]); + }) + .then((branchCommits) => { + var toCommitOid = branchCommits[0].toString(); + var fromCommitOid = branchCommits[1].toString(); - if (hunkLine.raw.content() - .indexOf("\\ No newline at end of file") != -1) { - return false; + return NodeGit.Merge.base(repo, toCommitOid, fromCommitOid) + .then((baseCommit) => { + if (baseCommit.toString() == fromCommitOid) { + // The commit we're merging to is already in our history. + // nothing to do so just return the commit the branch is on + return toCommitOid; } + else if (baseCommit.toString() == toCommitOid && + mergePreference !== NodeGit.Merge.PREFERENCE.NO_FASTFORWARD) { + // fast forward + var message = + "Fast forward branch " + + toBranch.shorthand() + + " to branch " + + fromBranch.shorthand(); - //determine what to add to the new content - if ((isStaged && newLine && newLine.length > 0) || - (!isStaged && (!newLine || newLine.length === 0))) { - if (hunkLine.origin() !== lineTypes.ADDED) { - newContent += hunkLine.content(); - if (hunkLine.raw.numLines() !== 0) { - newContent += "\n"; + return branchCommits[1].getTree() + .then((tree) => { + if (toBranch.isHead()) { + // Checkout the tree if we're on the branch + var opts = { + checkoutStrategy: NodeGit.Checkout.STRATEGY.SAFE | + NodeGit.Checkout.STRATEGY.RECREATE_MISSING + }; + return NodeGit.Checkout.tree(repo, tree, opts); } - } - if ((isStaged && hunkLine.origin() !== lineTypes.DELETED) || - (!isStaged && hunkLine.origin() !== lineTypes.ADDED)) { - oldIndex++; - } - } - else { - switch (hunkLine.origin()) { - case lineTypes.ADDED: - newContent += hunkLine.content(); - if (hunkLine.raw.numLines() !== 0) { - newContent += "\n"; - } - if (isStaged) { - oldIndex++; - } - break; - case lineTypes.DELETED: - if (!isStaged) { - oldIndex++; - } - break; - default: - newContent += oldLines[oldIndex++]; - if (oldIndex < oldLines.length) { - newContent += "\n"; - } - break; - } + }) + .then(() => { + return toBranch.setTarget( + fromCommitOid, + message) + .then(() => { + return fromCommitOid; + }); + }); } - } + else if (mergePreference !== NodeGit.Merge.PREFERENCE.FASTFORWARD_ONLY) { + var updateHead; + // We have to merge. Lets do it! + return NodeGit.Reference.lookup(repo, "HEAD") + .then((headRef) => { + return headRef.resolve(); + }) + .then((headRef) => { + updateHead = !!headRef && (headRef.name() === toBranch.name()); + return NodeGit.Merge.commits( + repo, + toCommitOid, + fromCommitOid, + mergeOptions + ); + }) + .then((index) => { + // if we have conflicts then throw the index + if (index.hasConflicts()) { + throw index; + } - //find the affected hunk - pathHunks.forEach(function(pathHunk) { - linesPromises.push(pathHunk.lines()); - }); - return Promise.all(linesPromises).then(function(results) { - for (var index = 0; index < results.length && - newContent.length < 1; index++) { - var hunkStart = isStaged ? pathHunks[index].hunk.newStart() - : pathHunks[index].hunk.oldStart(); - var lines = results[index]; - if (lines.filter(lineEqualsFirstNewLine).length > 0) { - //add content that is before the hunk - while (hunkStart > (oldIndex + 1)) { - newContent += oldLines[oldIndex++] + "\n"; + // No conflicts so just go ahead with the merge + return index.writeTreeTo(repo); + }) + .then((oid) => { + var mergeDecorator; + if (fromBranch.isTag()) { + mergeDecorator = "tag"; + } else if (fromBranch.isRemote()) { + mergeDecorator = "remote-tracking branch"; + } else { + mergeDecorator = "branch"; } - //modify the lines of the hunk according to the selection - lines.forEach(processSelectedLine); + var message = + "Merge " + + mergeDecorator + + " '" + + fromBranch.shorthand() + + "'"; - //add the rest of the file - while (oldLines.length > oldIndex) { - newContent += oldLines[oldIndex++] + - (oldLines.length > oldIndex ? "\n" : ""); + // https://github.com/git/git/blob/master/builtin/fmt-merge-msg.c#L456-L459 + if (toBranch.shorthand() !== "master") { + message += " into " + toBranch.shorthand(); } - } + + return Promise.all([oid, processMergeMessageCallback(message)]); + }) + .then(([oid, message]) => { + if (signingCallback) { + return repo.createCommitWithSignature( + toBranch.name(), + signature, + signature, + message, + oid, + [toCommitOid, fromCommitOid], + signingCallback + ); + } + return repo.createCommit( + toBranch.name(), + signature, + signature, + message, + oid, + [toCommitOid, fromCommitOid] + ); + }) + .then((commit) => { + // we've updated the checked out branch, so make sure we update + // head so that our index isn't messed up + if (updateHead) { + return repo.getBranch(to) + .then((branch) => { + return repo.getBranchCommit(branch); + }) + .then((branchCommit) => { + return branchCommit.getTree(); + }) + .then((tree) => { + var opts = { + checkoutStrategy: NodeGit.Checkout.STRATEGY.SAFE | + NodeGit.Checkout.STRATEGY.RECREATE_MISSING + }; + return NodeGit.Checkout.tree(repo, tree, opts); + }) + .then(() => { + return commit; + }); + } + else { + return commit; + } + }); + } + else { + // A non fast-forwardable merge with ff-only + return toCommitOid; } - return newContent; }); - } + }); +}; + +/** + * @async + * @param {MergeheadForeachCb} callback The callback function to be called on + * each entry + */ +Repository.prototype.mergeheadForeach = function(callback) { + return _mergeheadForeach.call(this, callback, null); +}; +/** + * Stages or unstages line selection of a specified file + * + * @async + * @param {String|Array} filePath The relative path of this file in the repo + * @param {Boolean} stageNew Set to stage new filemode. Unset to unstage. + * @return {Number} 0 or an error code + */ +Repository.prototype.stageFilemode = + function(filePath, stageNew, additionalDiffOptions) { var repo = this; var index; - var diffPromise = isSelectionStaged ? + var diffOptions = additionalDiffOptions ? { + flags: additionalDiffOptions + } : undefined; + var diffPromise = stageNew ? + NodeGit.Diff.indexToWorkdir(repo, index, { + flags: + NodeGit.Diff.OPTION.SHOW_UNTRACKED_CONTENT | + NodeGit.Diff.OPTION.RECURSE_UNTRACKED_DIRS | + (additionalDiffOptions || 0) + }) + : repo.getHeadCommit() .then(function getTreeFromCommit(commit) { return commit.getTree(); }) .then(function getDiffFromTree(tree) { - return NodeGit.Diff.treeToIndex(repo, tree, index); - }) - : - NodeGit.Diff.indexToWorkdir(repo, index, { - flags: - NodeGit.Diff.OPTION.SHOW_UNTRACKED_CONTENT | - NodeGit.Diff.OPTION.RECURSE_UNTRACKED_DIRS + return NodeGit.Diff.treeToIndex(repo, tree, index, diffOptions); }); + var filePaths = (filePath instanceof Array) ? filePath : [filePath]; var indexLock = repo.path().replace(".git/", "") + ".git/index.lock"; return fse.remove(indexLock) .then(function() { - return repo.openIndex(); + return repo.refreshIndex(); }) .then(function(indexResult) { index = indexResult; - return index.read(1); }) .then(function() { return diffPromise; }) .then(function(diff) { - if (!(NodeGit.Status.file(repo, filePath) & - NodeGit.Status.STATUS.WT_MODIFIED) && - !(NodeGit.Status.file(repo, filePath) & - NodeGit.Status.STATUS.INDEX_MODIFIED)) { - return Promise.reject - ("Selected staging is only available on modified files."); + var origLength = filePaths.length; + var fileFilterPromises = fp.map(function(p) { + return NodeGit.Status.file(repo, p) + .then(function(status) { + return { + path: p, + filter: ( + (status & NodeGit.Status.STATUS.WT_MODIFIED) || + (status & NodeGit.Status.STATUS.INDEX_MODIFIED) + ) + }; + }); + }, filePaths); + + return Promise.all(fileFilterPromises) + .then(function(results) { + filePaths = fp.flow([ + fp.filter(function(filterResult) { + return filterResult.filter; + }), + fp.map(function(filterResult) { + return filterResult.path; + }) + ])(results); + + if (filePaths.length === 0 && origLength > 0) { + return Promise.reject + ("Selected staging is only available on modified files."); + } + return diff.patches(); + }); + }) + .then(function(patches) { + var pathPatches = patches.filter(function(patch) { + return ~filePaths.indexOf(patch.newFile().path()); + }); + if (pathPatches.length === 0) { + return Promise.reject("No differences found for this file."); } + + return pathPatches + .reduce(function(lastIndexAddPromise, pathPatch) { + var entry = index.getByPath(pathPatch.newFile().path(), 0); + + entry.mode = stageNew ? + pathPatch.newFile().mode() : pathPatch.oldFile().mode(); + + return lastIndexAddPromise + .then(function() { + return index.add(entry); + }); + }, Promise.resolve()); + }) + .then(function() { + return index.write(); + }); +}; + +/** + * Stages or unstages line selection of a specified file + * + * @async + * @param {String} filePath The relative path of this file in the repo + * @param {Array} selectedLines The array of DiffLine objects + * selected for staging or unstaging + * @param {Boolean} isStaged Are the selected lines currently staged + * @return {Number} 0 or an error code + */ +Repository.prototype.stageLines = + function(filePath, selectedLines, isSelectionStaged, additionalDiffOptions) { + + var repo = this; + var index; + var originalBlob; + + // The following chain checks if there is a patch with no hunks left for the + // file, and no filemode changes were done on the file. It is then safe to + // stage the entire file so the file doesn't show as having unstaged changes + // in `git status`. Also, check if there are no type changes. + var lastHunkStagedPromise = function lastHunkStagedPromise(result) { + return NodeGit.Diff.indexToWorkdir(repo, index, { + flags: + NodeGit.Diff.OPTION.SHOW_UNTRACKED_CONTENT | + NodeGit.Diff.OPTION.RECURSE_UNTRACKED_DIRS | + (additionalDiffOptions || 0) + }) + .then(function(diff) { return diff.patches(); }) .then(function(patches) { - var pathOid = index.getByPath(filePath).id; var pathPatch = patches.filter(function(patch) { return patch.newFile().path() === filePath; }); - if (pathPatch.length !== 1) { - return Promise.reject("No differences found for this file."); + var emptyPatch = false; + if (pathPatch.length > 0) { + // No hunks, unchanged file mode, and no type changes. + emptyPatch = pathPatch[0].size() === 0 && + pathPatch[0].oldFile().mode() === pathPatch[0].newFile().mode() && + !pathPatch[0].isTypeChange(); + } + if (emptyPatch) { + return index.addByPath(filePath) + .then(function() { + return index.write(); + }); } - return Promise.all([repo.getBlob(pathOid), pathPatch[0].hunks()]); + + return result; + }); + }; + + return repo.refreshIndex() + .then(function(indexResult) { + index = indexResult; + var pathOid = index.getByPath(filePath).id; + + return repo.getBlob(pathOid); + }) + .then(function(blob) { + originalBlob = blob; + + return getPathHunks( + repo, + index, + filePath, + isSelectionStaged, + additionalDiffOptions + ); }) - .then(function(results) { - var originalBlob = results[0]; - var pathHunks = results[1]; - return applySelectedLinesToBlob( - pathHunks, isSelectionStaged, selectedLines, originalBlob); + .then(function(hunks) { + return applySelectedLinesToTarget( + originalBlob, selectedLines, hunks, isSelectionStaged + ); }) .then(function(newContent) { - var newContentBuffer = new Buffer(newContent); + var newContentBuffer = Buffer.from(newContent); - var newOid = repo.createBlobFromBuffer(newContentBuffer); - return repo.getBlob(newOid); + return repo.createBlobFromBuffer(newContentBuffer); }) + .then(newOid => repo.getBlob(newOid)) .then(function(newBlob) { var entry = index.getByPath(filePath, 0); entry.id = newBlob.id(); entry.path = filePath; entry.fileSize = newBlob.content().length; - entry.mode = newBlob.filemode(); - index.add(entry); + return index.add(entry); + }) + .then(function() { return index.write(); - }); -}; - -/** - * Returns true if the repository is in the default NONE state. - * @return {Boolean} - */ -Repository.prototype.isDefaultState = function() { - return this.state() === NodeGit.Repository.STATE.NONE; -}; - -/** - * Returns true if the repository is in the APPLY_MAILBOX or - * APPLY_MAILBOX_OR_REBASE state. - * @return {Boolean} - */ -Repository.prototype.isApplyingMailbox = function() { - var state = this.state(); - return state === NodeGit.Repository.STATE.APPLY_MAILBOX || - state === NodeGit.Repository.STATE.APPLY_MAILBOX_OR_REBASE; -}; - -/** - * Returns true if the repository is in the BISECT state. - * @return {Boolean} - */ -Repository.prototype.isBisecting = function() { - return this.state() === NodeGit.Repository.STATE.BISECT; -}; + }) + .then(function(result) { + if (isSelectionStaged) { + return result; + } -/** - * Returns true if the repository is in the CHERRYPICK state. - * @return {Boolean} - */ -Repository.prototype.isCherrypicking = function() { - return this.state() === NodeGit.Repository.STATE.CHERRYPICK; + return lastHunkStagedPromise(result); + }); }; /** - * Returns true if the repository is in the MERGE state. - * @return {Boolean} + * Create a new tree builder. + * + * @param {Tree} tree */ -Repository.prototype.isMerging = function() { - return this.state() === NodeGit.Repository.STATE.MERGE; -}; +Repository.prototype.treeBuilder = function() { + var builder = TreeBuilder.create(null); -/** - * Returns true if the repository is in the REBASE, REBASE_INTERACTIVE, or - * REBASE_MERGE state. - * @return {Boolean} - */ -Repository.prototype.isRebasing = function() { - var state = this.state(); - return state === NodeGit.Repository.STATE.REBASE || - state === NodeGit.Repository.STATE.REBASE_INTERACTIVE || - state === NodeGit.Repository.STATE.REBASE_MERGE; -}; + builder.root = builder; + builder.repo = this; -/** - * Returns true if the repository is in the REVERT state. - * @return {Boolean} - */ -Repository.prototype.isReverting = function() { - return this.state() === NodeGit.Repository.STATE.REVERT; + return builder; }; - -module.exports = Repository; diff --git a/lib/reset.js b/lib/reset.js index be9bc54555..38b6b1bffc 100644 --- a/lib/reset.js +++ b/lib/reset.js @@ -1,35 +1,36 @@ var NodeGit = require("../"); -var normalizeOptions = NodeGit.Utils.normalizeOptions; var Reset = NodeGit.Reset; +var _default = Reset.default; +var _reset = Reset.reset; /** * Look up a refs's commit. * * @async * @param {Repository} repo Repository where to perform the reset operation. - * @param {Object} target The committish which content will be used to reset the - * content of the index. + * @param {Commit|Tag} target The committish which content will be used to reset + * the content of the index. * @param {Strarray} pathspecs List of pathspecs to operate on. * * @return {Number} 0 on success or an error code */ -var defaultFn = Reset.default; Reset.default = function(repo, target, pathspecs) { - return defaultFn.call(this, repo, target, pathspecs); + return _default.call(this, repo, target, pathspecs); }; /** - * Look up a refs's commit. + * Reset a repository's current HEAD to the specified target. * * @async * @param {Repository} repo Repository where to perform the reset operation. * - * @param {Object} target Committish to which the Head should be moved to. This - * object must belong to the given `repo` and can either - * be a git_commit or a git_tag. When a git_tag is being - * passed, it should be dereferencable to a git_commit - * which oid will be used as the target of the branch. + * @param {Commit|Tag} target Committish to which the Head should be moved to. + * This object must belong to the given `repo` and can + * either be a git_commit or a git_tag. When a git_tag is + * being passed, it should be dereferencable to a + * git_commit which oid will be used as the target of the + * branch. * @param {Number} resetType Kind of reset operation to perform. * * @param {CheckoutOptions} opts Checkout options to be used for a HARD reset. @@ -38,16 +39,13 @@ Reset.default = function(repo, target, pathspecs) { * used to propagate notify and progress * callbacks. * - * @param {String|Ref} name Ref name, e.g. "master", "refs/heads/master" - * or Branch Ref - * * @return {Number} 0 on success or an error code */ -var reset = Reset.reset; Reset.reset = function(repo, target, resetType, opts) { - opts = normalizeOptions(opts, NodeGit.CheckoutOptions); - - return reset.call(this, repo, target, resetType, opts); + if (repo !== target.repo) { + // this is the same that is performed on libgit2's side + // https://github.com/nodegit/libgit2/blob/8d89e409616831b7b30a5ca7b89354957137b65e/src/reset.c#L120-L124 + throw new Error("Repository and target commit's repository does not match"); + } + return _reset.call(this, repo, target, resetType, opts); }; - -module.exports = Reset; diff --git a/lib/revparse.js b/lib/revparse.js new file mode 100644 index 0000000000..74c1fa4c24 --- /dev/null +++ b/lib/revparse.js @@ -0,0 +1,18 @@ +var util = require("util"); +var NodeGit = require("../"); + +const MODE = { + SINGLE: 1, + RANGE: 2, + MERGE_BASE: 4, +}; + +NodeGit.Revparse.MODE = {}; +Object.keys(MODE).forEach((key) => { + Object.defineProperty(NodeGit.Revparse.MODE, key, { + get: util.deprecate( + () => MODE[key], + `Use NodeGit.Revspec.TYPE.${key} instead of NodeGit.Revparse.MODE.${key}.` + ) + }); +}); diff --git a/lib/revwalk.js b/lib/revwalk.js index a87bb2417d..7787fc89b1 100644 --- a/lib/revwalk.js +++ b/lib/revwalk.js @@ -1,12 +1,94 @@ var NodeGit = require("../"); var Revwalk = NodeGit.Revwalk; -var Promise = require("nodegit-promise"); Object.defineProperty(Revwalk.prototype, "repo", { - get: function () { return this.repository(); } + get: function () { return this.repository(); }, + configurable: true }); -var oldSorting = Revwalk.prototype.sorting; +var _sorting = Revwalk.prototype.sorting; +/** + * @typedef historyEntry + * @type {Object} + * @property {Commit} commit the commit for this entry + * @property {Number} status the status of the file in the commit + * @property {String} newName the new name that is provided when status is + * renamed + * @property {String} oldName the old name that is provided when status is + * renamed + */ +var fileHistoryWalk = Revwalk.prototype.fileHistoryWalk; +/** + * @param {String} filePath + * @param {Number} max_count + * @async + * @return {Array} + */ +Revwalk.prototype.fileHistoryWalk = fileHistoryWalk; + +/** + * Get a number of commits. + * + * @async + * @param {Number} count (default: 10) + * @return {Array} + */ +Revwalk.prototype.getCommits = function(count) { + count = count || 10; + var promises = []; + var walker = this; + + function walkCommitsCount(count) { + if (count === 0) { return; } + + return walker.next().then(function(oid) { + promises.push(walker.repo.getCommit(oid)); + return walkCommitsCount(count - 1); + }) + .catch(function(error) { + if (error.errno !== NodeGit.Error.CODE.ITEROVER) { + throw error; + } + }); + } + + return walkCommitsCount(count).then(function() { + return Promise.all(promises); + }); +}; + +/** + * Walk the history grabbing commits until the checkFn called with the + * current commit returns false. + * + * @async + * @param {Function} checkFn function returns false to stop walking + * @return {Array} + */ +Revwalk.prototype.getCommitsUntil = function(checkFn) { + var commits = []; + var walker = this; + + function walkCommitsCb() { + return walker.next().then(function(oid) { + return walker.repo.getCommit(oid).then(function(commit) { + commits.push(commit); + if (checkFn(commit)) { + return walkCommitsCb(); + } + }); + }) + .catch(function(error) { + if (error.errno !== NodeGit.Error.CODE.ITEROVER) { + throw error; + } + }); + } + + return walkCommitsCb().then(function() { + return commits; + }); +}; /** * Set the sort order for the revwalk. This function takes variable arguments @@ -21,7 +103,7 @@ Revwalk.prototype.sorting = function() { sort |= arguments[i]; } - oldSorting.call(this, sort); + _sorting.call(this, sort); }; /** @@ -30,7 +112,6 @@ Revwalk.prototype.sorting = function() { * * @param {Oid} oid * @param {Function} callback - * @return {Commit} */ Revwalk.prototype.walk = function(oid, callback) { var revwalk = this; @@ -59,60 +140,3 @@ Revwalk.prototype.walk = function(oid, callback) { walk(); }; - - -/** - * Walk the history grabbing commits until the checkFn called with the - * current commit returns false. - * - * @param {Function} checkFn function returns false to stop walking - * @return {Array} - */ -Revwalk.prototype.getCommitsUntil = function(checkFn) { - var commits = []; - var walker = this; - - function walkCommitsCb() { - return walker.next().then(function(oid) { - if (!oid) { return; } - - return walker.repo.getCommit(oid).then(function(commit) { - commits.push(commit); - if (checkFn(commit)) { - return walkCommitsCb(); - } - }); - }); - } - - return walkCommitsCb().then(function() { - return commits; - }); -}; - -/** - * Get a number of commits. - * - * @param {Number} count (default: 10) - * @return {Array} - */ -Revwalk.prototype.getCommits = function(count) { - count = count || 10; - var promises = []; - var walker = this; - - function walkCommitsCount(count) { - if (count === 0) { return; } - - return walker.next().then(function(oid) { - if (!oid) { return; } - - promises.push(walker.repo.getCommit(oid)); - return walkCommitsCount(count - 1); - }); - } - - return walkCommitsCount(count).then(function() { - return Promise.all(promises); - }); -}; diff --git a/lib/signature.js b/lib/signature.js index 7fc8e274d3..4dfe84a363 100644 --- a/lib/signature.js +++ b/lib/signature.js @@ -1,11 +1,38 @@ var NodeGit = require("../"); var Signature = NodeGit.Signature; +const toPaddedDoubleDigitString = (number) => { + if (number < 10) { + return `0${number}`; + } + + return `${number}`; +}; + /** * Standard string representation of an author. - * - * @return {string} Representation of the author. + * @param {Boolean} withTime Whether or not to include timestamp + * @return {String} Representation of the author. */ -Signature.prototype.toString = function() { - return this.name().toString() + " <" + this.email().toString() + ">"; +Signature.prototype.toString = function(withTime) { + const name = this.name().toString(); + const email = this.email().toString(); + + let stringifiedSignature = `${name} <${email}>`; + + if (!withTime) { + return stringifiedSignature; + } + + const when = this.when(); + const offset = when.offset(); + const offsetMagnitude = Math.abs(offset); + const time = when.time(); + + const sign = (offset < 0 || when.sign() === "-") ? "-" : "+"; + const hours = toPaddedDoubleDigitString(Math.floor(offsetMagnitude / 60)); + const minutes = toPaddedDoubleDigitString(offsetMagnitude % 60); + + stringifiedSignature += ` ${time} ${sign}${hours}${minutes}`; + return stringifiedSignature; }; diff --git a/lib/stash.js b/lib/stash.js index 2df42ecca0..88e9f3510d 100644 --- a/lib/stash.js +++ b/lib/stash.js @@ -1,10 +1,9 @@ var NodeGit = require("../"); -var normalizeOptions = NodeGit.Utils.normalizeOptions; -var shallowClone = require("./utils/shallow_clone"); var Stash = NodeGit.Stash; +var _foreach = Stash.foreach; + // Override Stash.foreach to eliminate the need to pass null payload -var foreach = Stash.foreach; Stash.foreach = function(repo, callback) { function wrappedCallback(index, message, oid) { // We need to copy the OID since libgit2 types are getting cleaned up @@ -13,49 +12,5 @@ Stash.foreach = function(repo, callback) { return callback(index, message, oid.copy()); } - return foreach(repo, wrappedCallback, null); -}; - -var sApply = Stash.apply; -Stash.apply = function(repo, index, options) { - var checkoutOptions; - - if (options) { - options = shallowClone(options); - checkoutOptions = options.checkoutOptions; - delete options.checkoutOptions; - } else { - options = {}; - } - - options = normalizeOptions(options, NodeGit.StashApplyOptions); - - if (checkoutOptions) { - options.checkoutOptions = - normalizeOptions(checkoutOptions, NodeGit.checkoutOptions); - } - - return sApply(repo, index, options); -}; - -var pop = Stash.pop; -Stash.pop = function(repo, index, options) { - var checkoutOptions; - - if (options) { - options = shallowClone(options); - checkoutOptions = options.checkoutOptions; - delete options.checkoutOptions; - } else { - options = {}; - } - - options = normalizeOptions(options, NodeGit.StashApplyOptions); - - if (checkoutOptions) { - options.checkoutOptions = - normalizeOptions(checkoutOptions, NodeGit.CheckoutOptions); - } - - return pop(repo, index, options); + return _foreach(repo, wrappedCallback, null); }; diff --git a/lib/status.js b/lib/status.js index 964569df08..93aca08e09 100644 --- a/lib/status.js +++ b/lib/status.js @@ -1,17 +1,16 @@ var NodeGit = require("../"); -var normalizeOptions = NodeGit.Utils.normalizeOptions; var Status = NodeGit.Status; +var _foreach = Status.foreach; +var _foreachExt = Status.foreachExt; + // Override Status.foreach to eliminate the need to pass null payload -var foreach = Status.foreach; Status.foreach = function(repo, callback) { - return foreach(repo, callback, null); + return _foreach(repo, callback, null); }; -// Override Status.foreachExt to normalize opts -var foreachExt = Status.foreachExt; +// Override Status.foreachExt to eliminate the need to pass null payload Status.foreachExt = function(repo, opts, callback) { - opts = normalizeOptions(opts, NodeGit.StatusOptions); - return foreachExt(repo, opts, callback, null); + return _foreachExt(repo, opts, callback, null); }; diff --git a/lib/status_file.js b/lib/status_file.js index 2d02dbeb38..ac6b124e37 100644 --- a/lib/status_file.js +++ b/lib/status_file.js @@ -37,12 +37,6 @@ var StatusFile = function(args) { }; return { - status: function() { - return data.statuses; - }, - statusBit: function() { - return data.statusBit; - }, headToIndex: function() { if (data.entry) { return entry.headToIndex(); @@ -57,48 +51,54 @@ var StatusFile = function(args) { return undefined; } }, - path: function() { - return data.path; + inIndex: function() { + return status & codes.INDEX_NEW || + status & codes.INDEX_MODIFIED || + status & codes.INDEX_DELETED || + status & codes.INDEX_TYPECHANGE || + status & codes.INDEX_RENAMED; }, - isNew: function() { + inWorkingTree: function() { return status & codes.WT_NEW || - status & codes.INDEX_NEW; + status & codes.WT_MODIFIED || + status & codes.WT_DELETED || + status & codes.WT_TYPECHANGE || + status & codes.WT_RENAMED; }, - isModified: function() { - return status & codes.WT_MODIFIED || - status & codes.INDEX_MODIFIED; + isConflicted: function() { + return status & codes.CONFLICTED; }, isDeleted: function() { return status & codes.WT_DELETED || status & codes.INDEX_DELETED; }, - isTypechange: function() { - return status & codes.WT_TYPECHANGE || - status & codes.INDEX_TYPECHANGE; + isIgnored: function() { + return status & codes.IGNORED; + }, + isModified: function() { + return status & codes.WT_MODIFIED || + status & codes.INDEX_MODIFIED; + }, + isNew: function() { + return status & codes.WT_NEW || + status & codes.INDEX_NEW; }, isRenamed: function() { return status & codes.WT_RENAMED || status & codes.INDEX_RENAMED; }, - isIgnored: function() { - return status & codes.IGNORED; + isTypechange: function() { + return status & codes.WT_TYPECHANGE || + status & codes.INDEX_TYPECHANGE; }, - isConflicted: function() { - return status & codes.CONFLICTED; + path: function() { + return data.path; }, - inWorkingTree: function() { - return status & codes.WT_NEW || - status & codes.WT_MODIFIED || - status & codes.WT_DELETED || - status & codes.WT_TYPECHANGE || - status & codes.WT_RENAMED; + status: function() { + return data.statuses; }, - inIndex: function() { - return status & codes.INDEX_NEW || - status & codes.INDEX_MODIFIED || - status & codes.INDEX_DELETED || - status & codes.INDEX_TYPECHANGE || - status & codes.INDEX_RENAMED; + statusBit: function() { + return data.statusBit; } }; }; diff --git a/lib/status_list.js b/lib/status_list.js deleted file mode 100644 index e05eede09d..0000000000 --- a/lib/status_list.js +++ /dev/null @@ -1,11 +0,0 @@ -var NodeGit = require("../"); -var normalizeOptions = NodeGit.Utils.normalizeOptions; - -var StatusList = NodeGit.StatusList; - -// Override StatusList.create to normalize opts -var create = StatusList.create; -StatusList.create = function(repo, opts) { - opts = normalizeOptions(opts, NodeGit.StatusOptions); - return create(repo, opts); -}; diff --git a/lib/submodule.js b/lib/submodule.js new file mode 100644 index 0000000000..2b0cb530db --- /dev/null +++ b/lib/submodule.js @@ -0,0 +1,10 @@ +var NodeGit = require("../"); + +var Submodule = NodeGit.Submodule; + +var _foreach = Submodule.foreach; + +// Override Submodule.foreach to eliminate the need to pass null payload +Submodule.foreach = function(repo, callback) { + return _foreach(repo, callback, null); +}; diff --git a/lib/tag.js b/lib/tag.js index bf8ddff49f..aae20c9302 100644 --- a/lib/tag.js +++ b/lib/tag.js @@ -1,12 +1,141 @@ +var util = require("util"); var NodeGit = require("../"); var LookupWrapper = NodeGit.Utils.lookupWrapper; var Tag = NodeGit.Tag; +const signatureRegexesBySignatureType = { + gpgsig: [ + /-----BEGIN PGP SIGNATURE-----[\s\S]+?-----END PGP SIGNATURE-----/gm, + /-----BEGIN PGP MESSAGE-----[\s\S]+?-----END PGP MESSAGE-----/gm, + ], + x509: [ + /-----BEGIN SIGNED MESSAGE-----[\s\S]+?-----END SIGNED MESSAGE-----/gm, + ] +}; + /** -* Retrieves the tag pointed to by the oid -* @async -* @param {Repository} repo The repo that the tag lives in -* @param {String|Oid|Tag} id The tag to lookup -* @return {Tag} -*/ + * Retrieves the tag pointed to by the oid + * @async + * @param {Repository} repo The repo that the tag lives in + * @param {String|Oid|Tag} id The tag to lookup + * @return {Tag} + */ Tag.lookup = LookupWrapper(Tag); + +/** + * @async + * @param {Repository} repo + * @param {String} tagName + * @param {Oid} target + * @param {Signature} tagger + * @return {String} + */ +Tag.createBuffer = function(repo, tagName, target, tagger, message) { + return NodeGit.Object.lookup(repo, target, NodeGit.Object.TYPE.ANY) + .then((object) => { + if (!NodeGit.Object.typeisloose(object.type())) { + throw new Error("Object must be a loose type"); + } + + const id = object.id().toString(); + const objectType = NodeGit.Object.type2String(object.type()); + const lines = [ + `object ${id}`, + `type ${objectType}`, + `tag ${tagName}`, + `tagger ${tagger.toString(true)}\n`, + `${message}${message.endsWith("\n") ? "" : "\n"}` + ]; + return lines.join("\n"); + }); +}; + +const deprecatedCreateWithSignatureHelper = util.deprecate(function(repo, oidTarget) { + return repo.getCommit(oidTarget); +}, "Tag.createWithSignature target should be a Git Object, not Oid"); + +/** + * @async + * @param {Repository} repo + * @param {String} tagName + * @param {Object} target + * @param {Signature} tagger + * @param {String} message + * @param {Number} force + * @param {Function} signingCallback Takes a string and returns a string + * representing the signed message + * @return {Oid} + */ +Tag.createWithSignature = async ( + repo, + tagName, + target, + tagger, + message, + force, + signingCallback +) => { + let targetOid; + if (!target.id) { + targetOid = await deprecatedCreateWithSignatureHelper(repo, target); + } else { + targetOid = target; + } + + const tagBuffer = await Tag.createBuffer(repo, tagName, targetOid.id(), tagger, message); + const { code, signedData } = await signingCallback(tagBuffer); + switch (code) { + case NodeGit.Error.CODE.OK: { + const normalizedEnding = signedData.endsWith("\n") ? "" : "\n"; + const signedTagString = tagBuffer + signedData + normalizedEnding; + return Tag.createFromBuffer(repo, signedTagString, force); + } + case NodeGit.Error.CODE.PASSTHROUGH: + return Tag.create( + repo, + tagName, + targetOid, + tagger, + message, + force + ); + default: { + const error = new Error( + `Tag.createWithSignature threw with error code ${code}` + ); + error.errno = code; + throw error; + } + } +}; + +/** + * Retrieves the signature of an annotated tag + * @async + * @param {String} signatureType + * @return {String|null} + */ +Tag.prototype.extractSignature = function(signatureType = "gpgsig") { + const id = this.id(); + const repo = this.repo; + const signatureRegexes = signatureRegexesBySignatureType[signatureType]; + if (!signatureRegexes) { + throw new Error("Unsupported signature type"); + } + + return repo.odb().then((odb) => { + return odb.read(id); + }).then((odbObject) => { + const odbData = odbObject.toString(); + + for (const regex of signatureRegexes) { + const matchResult = odbData.match(regex); + + if (matchResult !== null) { + return matchResult[0]; + } + } + + throw new Error("this tag is not signed"); + }); +}; diff --git a/lib/tree.js b/lib/tree.js index 071a7bb270..1067fa3f2d 100644 --- a/lib/tree.js +++ b/lib/tree.js @@ -6,32 +6,62 @@ var LookupWrapper = NodeGit.Utils.lookupWrapper; var Tree = NodeGit.Tree; var Treebuilder = NodeGit.Treebuilder; - /** * Retrieves the tree pointed to by the oid * @async * @param {Repository} repo The repo that the tree lives in * @param {String|Oid|Tree} id The tree to lookup -* @param {Function} callback * @return {Tree} */ Tree.lookup = LookupWrapper(Tree); +/** + * Make builder. This is helpful for modifying trees. + * @return {Treebuilder} + */ +Tree.prototype.builder = function() { + var builder = Treebuilder.create(this); + + builder.root = builder; + builder.repo = this.repo; + + return builder; +}; + /** * Diff two trees * @async * @param {Tree} tree to diff against - * @param {Function} callback - * @return {DiffList} + * @return {Diff} */ -Tree.prototype.diff = function(tree, callback) { - return Diff.treeToTree(this.repo, tree, this, null).then(function(diff) { - if (typeof callback === "function") { - callback(null, diff); - } +Tree.prototype.diff = function(tree) { + return this.diffWithOptions(tree, null); +}; - return diff; - }, callback); +/** + * Diff two trees with options + * @async + * @param {Tree} tree to diff against + * @param {Object} options + * @return {Diff} + */ +Tree.prototype.diffWithOptions = function(tree, options) { + return Diff.treeToTree(this.repo, tree, this, options); +}; + +/** + * Return an array of the entries in this tree (excluding its children). + * @return {Array} an array of TreeEntrys + */ +Tree.prototype.entries = function() { + var size = this.entryCount(); + var result = []; + + for (var i = 0; i < size; i++) { + result.push(this.entryByIndex(i)); + } + + return result; }; /** @@ -53,7 +83,7 @@ Tree.prototype.entryByIndex = function(i) { * @return {TreeEntry} */ Tree.prototype.entryByName = function(name) { - var entry = this.entryByname(name); + var entry = this._entryByName(name); entry.parent = this; return entry; }; @@ -61,38 +91,26 @@ Tree.prototype.entryByName = function(name) { /** * Get an entry at a path. Unlike by name, this takes a fully * qualified path, like `/foo/bar/baz.javascript` - * + * @async * @param {String} filePath * @return {TreeEntry} */ -Tree.prototype.getEntry = function(filePath, callback) { +Tree.prototype.getEntry = function(filePath) { var tree = this; return this.entryByPath(filePath).then(function(entry) { entry.parent = tree; entry.dirtoparent = path.dirname(filePath); - - if (typeof callback === "function") { - callback(null, entry); - } - return entry; }); }; /** - * Return an array of the entries in this tree (excluding its children). - * @return {Array} an array of TreeEntrys + * Return the path of this tree, like `/lib/foo/bar` + * @return {String} */ -Tree.prototype.entries = function() { - var size = this.entryCount(); - var result = []; - - for (var i = 0; i < size; i++) { - result.push(this.entryByIndex(i)); - } - - return result; +Tree.prototype.path = function(blobsOnly) { + return this.entry ? this.entry.path() : ""; }; /** @@ -115,6 +133,8 @@ Tree.prototype.walk = function(blobsOnly) { var event = new events.EventEmitter(); var total = 1; + var entries = new Set(); + var finalEntires = []; // This looks like a DFS, but it is a BFS because of implicit queueing in // the recursive call to `entry.getTree(bfs)` @@ -124,21 +144,26 @@ Tree.prototype.walk = function(blobsOnly) { if (error) { return event.emit("error", error); } - var entries = tree.entries(); - entries.forEach(function (entry, entryIndex) { - if (!blobsOnly || entry.isFile()) { + + tree.entries().forEach(function (entry, entryIndex) { + if (!blobsOnly || entry.isFile() && !entries.has(entry)) { event.emit("entry", entry); - entries.push(entry); + entries.add(entry); + + // Node 0.12 doesn't support either [v for (v of entries)] nor + // Array.from so we'll just maintain our own list. + finalEntires.push(entry); } if (entry.isTree()) { total++; - entry.getTree(bfs); + entry.getTree() + .then(result => bfs(null, result), bfs); } }); if (total === 0) { - event.emit("end", entries); + event.emit("end", finalEntires); } } @@ -148,24 +173,3 @@ Tree.prototype.walk = function(blobsOnly) { return event; }; - -/** - * Return the path of this tree, like `/lib/foo/bar` - * @return {String} - */ -Tree.prototype.path = function(blobsOnly) { - return this.entry ? this.entry.path() : ""; -}; - -/** - * Make builder. This is helpful for modifying trees. - * @return {Treebuilder} - */ -Tree.prototype.builder = function() { - var builder = Treebuilder.create(this); - - builder.root = builder; - builder.repo = this.repo; - - return builder; -}; diff --git a/lib/tree_entry.js b/lib/tree_entry.js index d4309098ce..a978de9a3c 100644 --- a/lib/tree_entry.js +++ b/lib/tree_entry.js @@ -1,86 +1,94 @@ -var path = require("path"); +var path = require("path").posix; var NodeGit = require("../"); -var Tree = NodeGit.Tree; var TreeEntry = NodeGit.TreeEntry; /** - * Is this TreeEntry a blob? (i.e., a file) - * @return {Boolean} + * Retrieve the blob for this entry. Make sure to call `isBlob` first! + * @async + * @return {Blob} */ -TreeEntry.prototype.isFile = function() { - return this.attr() === TreeEntry.FILEMODE.BLOB || - this.attr() === TreeEntry.FILEMODE.EXECUTABLE; +TreeEntry.prototype.getBlob = function() { + return this.parent.repo.getBlob(this.id()); }; /** - * Is this TreeEntry a tree? (i.e., a directory) + * Retrieve the tree for this entry. Make sure to call `isTree` first! + * @async + * @return {Tree} + */ +TreeEntry.prototype.getTree = function() { + var entry = this; + + return this.parent.repo.getTree(this.id()).then(function(tree) { + tree.entry = entry; + return tree; + }); +}; + +/** + * Is this TreeEntry a blob? Alias for `isFile` * @return {Boolean} */ -TreeEntry.prototype.isTree = function() { - return this.attr() === TreeEntry.FILEMODE.TREE; +TreeEntry.prototype.isBlob = function() { + return this.isFile(); }; /** * Is this TreeEntry a directory? Alias for `isTree` * @return {Boolean} */ -TreeEntry.prototype.isDirectory = TreeEntry.prototype.isTree; +TreeEntry.prototype.isDirectory = function() { + return this.isTree(); +}; /** - * Is this TreeEntry a blob? Alias for `isFile` + * Is this TreeEntry a blob? (i.e., a file) * @return {Boolean} */ -TreeEntry.prototype.isBlob = TreeEntry.prototype.isFile; +TreeEntry.prototype.isFile = function() { + return this.filemode() === TreeEntry.FILEMODE.BLOB || + this.filemode() === TreeEntry.FILEMODE.EXECUTABLE; +}; /** - * Retrieve the SHA for this TreeEntry. - * @return {String} + * Is this TreeEntry a submodule? + * @return {Boolean} */ -TreeEntry.prototype.sha = function() { - return this.oid().toString(); +TreeEntry.prototype.isSubmodule = function() { + return this.filemode() === TreeEntry.FILEMODE.COMMIT; }; /** - * Retrieve the tree for this entry. Make sure to call `isTree` first! - * @async - * @return {Tree} + * Is this TreeEntry a tree? (i.e., a directory) + * @return {Boolean} */ -TreeEntry.prototype.getTree = function(callback) { - var entry = this; - - return this.parent.repo.getTree(this.oid()).then(function(tree) { - tree.entry = entry; - - if (typeof callback === "function") { - callback(null, tree); - } - - return tree; - }, callback); +TreeEntry.prototype.isTree = function() { + return this.filemode() === TreeEntry.FILEMODE.TREE; }; /** - * Retrieve the tree for this entry. Make sure to call `isTree` first! - * @async - * @return {Blob} + * Retrieve the SHA for this TreeEntry. Alias for `sha` + * @return {String} */ -TreeEntry.prototype.getBlob = function(callback) { - return this.parent.repo.getBlob(this.oid()).then(function(blob) { - if (typeof callback === "function") { - callback(null, blob); - } - - return blob; - }, callback); +TreeEntry.prototype.oid = function() { + return this.sha(); }; /** * Returns the path for this entry. * @return {String} */ -TreeEntry.prototype.path = function(callback) { +TreeEntry.prototype.path = function() { var dirtoparent = this.dirtoparent || ""; - return path.join(this.parent.path(), dirtoparent, this.filename()); + return path.join(this.parent.path(), dirtoparent, this.name()); +}; + +/** + * Retrieve the SHA for this TreeEntry. + * @return {String} + */ +TreeEntry.prototype.sha = function() { + return this.id().toString(); }; /** @@ -89,7 +97,3 @@ TreeEntry.prototype.path = function(callback) { TreeEntry.prototype.toString = function() { return this.path(); }; - -TreeEntry.prototype.oid = function() { - return Tree.entryId(this).toString(); -}; diff --git a/lib/utils/lookup_wrapper.js b/lib/utils/lookup_wrapper.js index 309c675a27..eee4dd7682 100644 --- a/lib/utils/lookup_wrapper.js +++ b/lib/utils/lookup_wrapper.js @@ -1,4 +1,3 @@ -var Promise = require("nodegit-promise"); var NodeGit = require("../../"); /** diff --git a/lib/utils/normalize_options.js b/lib/utils/normalize_options.js deleted file mode 100644 index 2aac5658ff..0000000000 --- a/lib/utils/normalize_options.js +++ /dev/null @@ -1,27 +0,0 @@ -var NodeGit = require("../../"); - -/** - * Normalize an object to match a struct. - * - * @param {String, Object} oid - The oid string or instance. - * @return {Object} An Oid instance. - */ -function normalizeOptions(options, Ctor) { - if (!options) { - return null; - } - - if (options instanceof Ctor) { - return options; - } - - var instance = new Ctor(); - - Object.keys(options).forEach(function(key) { - instance[key] = options[key]; - }); - - return instance; -} - -NodeGit.Utils.normalizeOptions = normalizeOptions; diff --git a/lib/utils/shallow_clone.js b/lib/utils/shallow_clone.js index 1d536274bb..0dbe4113e9 100644 --- a/lib/utils/shallow_clone.js +++ b/lib/utils/shallow_clone.js @@ -11,4 +11,4 @@ function shallowClone() { }, {}); } -NodeGit.Utils.shallowClone = module.exports = shallowClone; +NodeGit.Utils.shallowClone = shallowClone; diff --git a/lifecycleScripts/README.md b/lifecycleScripts/README.md new file mode 100644 index 0000000000..cc1feeb148 --- /dev/null +++ b/lifecycleScripts/README.md @@ -0,0 +1,5 @@ +## /lifecycleScripts + + These scripts are responsible for downloading the right dependencies, configuring vendors, and all other dependencies that are required to build, generate, and clean the module. + + \ No newline at end of file diff --git a/lifecycleScripts/clean.js b/lifecycleScripts/clean.js index 43f54e1b47..a0f7076b3f 100644 --- a/lifecycleScripts/clean.js +++ b/lifecycleScripts/clean.js @@ -1,142 +1,5 @@ -var fse = require("fs-extra"); +var cleanForPublish = require("clean-for-publish"); var path = require("path"); -var npm = require("npm"); -var Promise = require("nodegit-promise"); -var rooted = path.join.bind(path, __dirname, ".."); -if (fse.existsSync(rooted(".didntcomefromthenpmregistry"))) { - console.error("[nodegit] We only clean when downloaded from the npm " + - "registry. Skipping clean."); - return; -} - -npm.load({ - "production": true -}, function() { - - var filesToDelete = [ - "build/Makefile", - "build/binding.Makefile", - "build/config.gypi", - "build/gyp-mac-tool", - "build/nodegit.target.mk", - "build/vendor", - - "build/Release/.deps", - "build/Release/git2.a", - "build/Release/http_parser.a", - "build/Release/linker.lock", - "build/Release/obj.target", - "build/Release/openssl.a", - "build/Release/ssh2.a", - "build/Release/zlib.a", - - "build/Debug/.deps", - "build/Debug/git2.a", - "build/Debug/http_parser.a", - "build/Debug/linker.lock", - "build/Debug/obj.target", - "build/Debug/openssl.a", - "build/Debug/ssh2.a", - "build/Debug/zlib.a", - - "example", - "generate", - "include", - "lifecycleScripts", - "src", - "test", - "vendor", - - ".astylerc", - ".editorconfig", - ".gitingore", - ".gitmodules", - ".jshintrc", - ".npmignore", - ".travis.yml", - "appveyor.yml", - "binding.gyp", - "TESTING.md" - ]; - - var modulesToPrune = [ - "for-node-webkit", - "which-native-nodish", - "fs-extra", - "node-pre-gyp", - "npm" - ]; - - console.info("[nodegit] Cleaning up after ourselves."); - - Promise.all([ - cleanFiles(), - pruneDevDependencies(), - pruneOtherDependencies() - ]).then( - function success() { - console.info("[nodegit] Done cleaning, enjoy!"); - }, - function failure() { - console.error("[nodegit] Couldn't finish cleaning."); - } - ); - - function cleanFiles() { - console.info("[nodegit] Deleting unneeded files."); - return new Promise(function(resolve, reject) { - var failures = filesToDelete.some(function(deletable) { - try { - fse.removeSync(rooted(deletable)); - return false; - } - catch (e) { - console.info("[nodegit] Error deleting files. Errored on " + - rooted(deletable) + "."); - console.error(e); - - reject(e); - return true; - } - }); - - if (!failures) { - console.info("[nodegit] Finished deleting files."); - resolve(); - } - }); - } - - function pruneDevDependencies() { - console.info("[nodegit] Pruning devdependencies."); - return new Promise(function (resolve, reject) { - npm.commands.prune(function(err) { - if (err) { - console.error("[nodegit] Failed pruning devdependencies."); - reject(err); - } - else { - console.info("[nodegit] Successfully pruned devdependencies."); - resolve(); - } - }); - }); - } - - function pruneOtherDependencies() { - console.info("[nodegit] Cleaning unneeded dependencies."); - return new Promise(function (resolve, reject) { - npm.commands.uninstall(modulesToPrune, function(err) { - if (err) { - console.error("[nodegit] Failed cleaning unneeded dependencies."); - reject(err); - } - else { - console.info("[nodegit] Successfully cleaned unneeded dependencies."); - resolve(); - } - }); - }); - } -}); +var location = path.join(__dirname, ".."); +cleanForPublish(location); diff --git a/lifecycleScripts/configureLibssh2.js b/lifecycleScripts/configureLibssh2.js deleted file mode 100644 index 3b237d3115..0000000000 --- a/lifecycleScripts/configureLibssh2.js +++ /dev/null @@ -1,38 +0,0 @@ -var Promise = require("nodegit-promise"); -var cp = require("child_process"); -var path = require("path"); -var rooted = path.join.bind(path, __dirname, ".."); - -module.exports = function retrieveExternalDependencies() { - if (process.platform === "win32") { - return Promise.resolve(""); - } - - return new Promise(function(resolve, reject) { - console.info("[nodegit] Configuring libssh2."); - cp.execFile( - rooted("vendor/libssh2/") + "configure", - {cwd: rooted("vendor/libssh2/")}, - function(err, stdout, stderr) { - if (err) { - console.error(err); - console.error(stderr); - reject(err, stderr); - } - else { - resolve(stdout); - } - } - ); - }); -}; - -// Called on the command line -if (require.main === module) { - if (process.platform === "win32") { - console.log("nothing to do"); - } - else { - module.exports(); - } -} diff --git a/lifecycleScripts/install.js b/lifecycleScripts/install.js old mode 100644 new mode 100755 index 84a30d32aa..96e47afbe5 --- a/lifecycleScripts/install.js +++ b/lifecycleScripts/install.js @@ -1,117 +1,75 @@ -var promisify = require("promisify-node"); +var buildFlags = require("../utils/buildFlags"); +var spawn = require("child_process").spawn; var path = require("path"); -var fs = require("fs"); -var whichNativeNodish = require("which-native-nodish"); -var prepareForBuild = require("./prepareForBuild"); +const nodePreGypModulePath = require.resolve("@mapbox/node-pre-gyp"); -var exec = promisify(function(command, opts, callback) { - return require("child_process").exec(command, opts, callback); -}); -var nwVersion = null; -var asVersion = null; +module.exports = function install() { + console.log("[nodegit] Running install script"); -var local = path.join.bind(path, __dirname); + var nodePreGyp = "node-pre-gyp"; -return whichNativeNodish("..") - .then(function(results) { - nwVersion = results.nwVersion; - asVersion = results.asVersion; - }) - .then(function() { - if (nwVersion) { - console.info("[nodegit] Must build for node-webkit/nw.js"); - return prepareAndBuild(); - } - else if (asVersion) { - console.info("[nodegit] Must build for atom-shell"); - return prepareAndBuild(); - } - if (fs.existsSync(local("../.didntcomefromthenpmregistry"))) { - return prepareAndBuild(); - } - if (process.env.BUILD_DEBUG) { - console.info("[nodegit] Doing a debug build, no fetching allowed."); - return prepareAndBuild(); - } - if (process.env.BUILD_ONLY) { - console.info("[nodegit] BUILD_ONLY is set to true, no fetching allowed."); - return prepareAndBuild(); - } - console.info("[nodegit] Fetching binary from S3."); - return exec("node-pre-gyp install") - .then( - function() { - console.info("[nodegit] Completed installation successfully."); - }, - function() { - console.info("[nodegit] Failed to install prebuilt binary, " + - "building manually."); - return prepareAndBuild(); - } - ); - }); + if (process.platform === "win32") { + nodePreGyp += ".cmd"; + } + var args = ["install"]; -function prepareAndBuild() { - console.info("[nodegit] Regenerating and configuring code"); - return prepareForBuild() - .then(function() { - return build(); - }); -} + if (buildFlags.mustBuild) { + console.info( + "[nodegit] Pre-built download disabled, building from source." + ); + args.push("--build-from-source"); -function build() { - console.info("[nodegit] Everything is ready to go, attempting compilation"); - if (nwVersion) { - console.info("[nodegit] Building native node-webkit module."); + if (buildFlags.debugBuild) { + console.info("[nodegit] Building debug version."); + args.push("--debug"); + } } else { - console.info("[nodegit] Building native node module."); + args.push("--fallback-to-build"); } - var opts = { - cwd: ".", - maxBuffer: Number.MAX_VALUE, - env: process.env - }; + return new Promise(function(resolve, reject) { + const gypPath = path.join(__dirname, "..", "node_modules", "node-gyp", "bin", "node-gyp.js"); - var prefix = ""; - var target = ""; - var debug = (process.env.BUILD_DEBUG ? " --debug" : ""); - var builder = "pangyp"; - var distUrl = ""; - - if (asVersion) { - prefix = (process.platform == "win32" ? - "SET HOME=%HOME%\\.atom-shell-gyp&& " : - "HOME=~/.atom-shell-gyp"); - - target = "--target=" + asVersion; + const nodePreGypPath = path.resolve(path.dirname(nodePreGypModulePath), path.join("..", "bin", nodePreGyp)); + console.log("node-pre-gyp path", nodePreGypPath); + var spawnedNodePreGyp = spawn(nodePreGypPath, args, { + env: { + ...process.env, + npm_config_node_gyp: gypPath + }, + shell: process.platform === "win32" + }); - distUrl = "--dist-url=https://gh-contractor-zcbenz.s3." + - "amazonaws.com/atom-shell/dist"; - } - else if (nwVersion) { - builder = "nw-gyp"; - target = "--target=" + nwVersion; - } + spawnedNodePreGyp.stdout.on("data", function(data) { + console.info(data.toString().trim()); + }); - builder = path.resolve(".", "node_modules", ".bin", builder); - builder = builder.replace(/\s/g, "\\$&"); - var cmd = [prefix, builder, "rebuild", target, debug, distUrl] - .join(" ").trim(); + spawnedNodePreGyp.stderr.on("data", function(data) { + console.error(data.toString().trim()); + }); - return exec(cmd, opts) - .then(function() { - console.info("[nodegit] Compilation complete."); - console.info("[nodegit] Completed installation successfully."); - process.exitCode = 0; - }, - function(err, stderr) { - console.error(err); - console.error(stderr); - process.exitCode = 13; + spawnedNodePreGyp.on("close", function(code) { + if (!code) { + resolve(); + } else { + reject(code); } - ); + }); + }) + .then(function() { + console.info("[nodegit] Completed installation successfully."); + }); +}; + +// Called on the command line +if (require.main === module) { + module.exports() + .catch(function(e) { + console.error("[nodegit] ERROR - Could not finish install"); + console.error("[nodegit] ERROR - finished with error code: " + e); + process.exit(e); + }); } diff --git a/lifecycleScripts/postinstall.js b/lifecycleScripts/postinstall.js new file mode 100755 index 0000000000..f8260e3b73 --- /dev/null +++ b/lifecycleScripts/postinstall.js @@ -0,0 +1,83 @@ +var fse = require("fs-extra"); +var path = require("path"); + +var exec = require("../utils/execPromise"); +var buildFlags = require("../utils/buildFlags"); + +var rootPath = path.join(__dirname, ".."); + +function printStandardLibError() { + console.log( + "[nodegit] ERROR - the latest libstdc++ is missing on your system!" + ); + console.log(""); + console.log("On Ubuntu you can install it using:"); + console.log(""); + console.log("$ sudo add-apt-repository ppa:ubuntu-toolchain-r/test"); + console.log("$ sudo apt-get update"); + console.log("$ sudo apt-get install libstdc++-4.9-dev"); +} + +module.exports = function install() { + if (buildFlags.isGitRepo) { + // If we're building NodeGit from a git repo we aren't going to do any + // cleaning up + return Promise.resolve(); + } + if (buildFlags.isElectron || buildFlags.isNWjs) { + // If we're building for electron or NWjs, we're unable to require the + // built library so we have to just assume success, unfortunately. + return Promise.resolve(); + } + + return exec("node \"" + path.join(rootPath, "lib/nodegit.js\"")) + .catch(function(e) { + if (~e.toString().indexOf("Module version mismatch")) { + console.warn( + "[nodegit] WARN - NodeGit was built for a different version of node." + ); + console.warn( + "If you are building NodeGit for electron/nwjs you can " + + "ignore this warning." + ); + } + else { + throw e; + } + }) + .then(function() { + // If we're using NodeGit from a package manager then let's clean up after + // ourselves when we install successfully. + if (!buildFlags.mustBuild) { + // We can't remove the source files yet because apparently the + // "standard workflow" for native node moduels in Electron/nwjs is to + // build them for node and then nah eff that noise let's rebuild them + // again for the actual platform! Hurray!!! When that madness is dead + // we can clean up the source which is a serious amount of data. + // fse.removeSync(path.join(rootPath, "vendor")); + // fse.removeSync(path.join(rootPath, "src")); + // fse.removeSync(path.join(rootPath, "include")); + + fse.removeSync(path.join(rootPath, "build/Release/*.a")); + fse.removeSync(path.join(rootPath, "build/Release/obj.target")); + } + }); +}; + +// Called on the command line +if (require.main === module) { + module.exports() + .catch(function(e) { + console.warn("[nodegit] WARN - Could not finish postinstall"); + + if ( + process.platform === "linux" && + ~e.toString().indexOf("libstdc++") + ) { + printStandardLibError(); + } + else { + console.log(e); + } + }); +} diff --git a/lifecycleScripts/preinstall.js b/lifecycleScripts/preinstall.js new file mode 100755 index 0000000000..870cf15580 --- /dev/null +++ b/lifecycleScripts/preinstall.js @@ -0,0 +1,47 @@ +var path = require("path"); +var local = path.join.bind(path, __dirname); + +var exec = require(local("../utils/execPromise")); +var buildFlags = require(local("../utils/buildFlags")); + +module.exports = function prepareForBuild() { + console.log("[nodegit] Running pre-install script"); + + return exec("npm -v") + .then( + function(npmVersion) { + if (npmVersion.split(".")[0] < 3) { + console.log( + "[nodegit] npm@2 installed, pre-loading required packages" + ); + return exec("npm install --ignore-scripts"); + } + + return Promise.resolve(); + }, + function() { + // We're installing via yarn, so don't + // care about compability with npm@2 + } + ) + .then(function() { + if (buildFlags.isGitRepo) { + var submodules = require(local("submodules")); + var generate = require(local("../generate")); + return submodules() + .then(function() { + return generate(); + }); + } + }); +}; + +// Called on the command line +if (require.main === module) { + module.exports() + .catch(function(e) { + console.error("[nodegit] ERROR - Could not finish preinstall"); + console.error(e); + process.exit(1); + }); +} diff --git a/lifecycleScripts/prepareForBuild.js b/lifecycleScripts/prepareForBuild.js deleted file mode 100644 index ab49a2c6dd..0000000000 --- a/lifecycleScripts/prepareForBuild.js +++ /dev/null @@ -1,34 +0,0 @@ -var Promise = require("nodegit-promise"); -var cp = require("child_process"); -var path = require("path"); - -var local = path.join.bind(path, __dirname); - -var configure = require(local("configureLibssh2")); -var generate = require(local("../generate")); - -module.exports = function prepareForBuild() { - - return new Promise(function(resolve, reject) { - cp.exec("npm install --ignore-scripts", function(err, stdout, stderr) { - if (err) { - console.error(stderr); - reject(err, stderr); - } - else { - resolve(); - console.info(stdout); - } - }); - }).then(function() { - return Promise.all([ - configure(), - generate() - ]); - }); -}; - -// Called on the command line -if (require.main === module) { - module.exports(); -} diff --git a/lifecycleScripts/submodules/getStatus.js b/lifecycleScripts/submodules/getStatus.js new file mode 100644 index 0000000000..2fcc42d37c --- /dev/null +++ b/lifecycleScripts/submodules/getStatus.js @@ -0,0 +1,50 @@ +var path = require("path"); +var rootDir = path.join(__dirname, "../.."); +var exec = require(path.join(rootDir, "./utils/execPromise")); + +module.exports = function getStatus() { + return exec("git submodule status", { cwd: rootDir}) + .then(function(stdout) { + if (!stdout) { + // In the case where we pull from npm they pre-init the submodules for + // us and `git submodule status` returns empty-string. In that case + // we'll just assume that we're good. + return Promise.resolve([]); + } + + function getStatusPromiseFromLine(line) { + var lineSections = line.trim().split(" "); + var onNewCommit = !!~lineSections[0].indexOf("+"); + var needsInitialization = !!~lineSections[0].indexOf("-"); + var commitOid = lineSections[0].replace("+", "").replace("-", ""); + var name = lineSections[1]; + + return exec("git status", { cwd: path.join(rootDir, name)}) + .then(function(workDirStatus) { + return { + commitOid: commitOid, + onNewCommit: onNewCommit, + name: name, + needsInitialization: needsInitialization, + workDirDirty: !~workDirStatus + .trim() + .split("\n") + .pop() + .indexOf("nothing to commit") + }; + }); + } + + return Promise.all(stdout + .trim() + .split("\n") + .map(getStatusPromiseFromLine) + ); + }) + .catch(function() { + // In the case that NodeGit is required from another project via npm we + // won't be able to run submodule commands but that's ok since the + // correct version of libgit2 is published with nodegit. + return Promise.resolve([]); + }); +}; diff --git a/lifecycleScripts/submodules/index.js b/lifecycleScripts/submodules/index.js new file mode 100644 index 0000000000..2d13d3c891 --- /dev/null +++ b/lifecycleScripts/submodules/index.js @@ -0,0 +1,82 @@ +var path = require("path"); +var rootDir = path.join(__dirname, "../.."); + +var gitExecutableLocation = require( + path.join(rootDir, "./utils/gitExecutableLocation") +); +var submoduleStatus = require("./getStatus"); + +var exec = require(path.join(rootDir, "./utils/execPromise")); + +module.exports = function submodules() { + return gitExecutableLocation() + .catch(function() { + console.error("[nodegit] ERROR - Compilation of NodeGit requires git " + + "CLI to be installed and on the path"); + + throw new Error("git CLI is not installed or not on the path"); + }) + .then(function() { + console.log("[nodegit] Checking submodule status"); + return submoduleStatus(); + }) + .then(function(statuses) { + function printSubmodule(submoduleName) { + console.log("\t" + submoduleName); + } + + var dirtySubmodules = statuses + .filter(function(status) { + return status.workDirDirty && !status.needsInitialization; + }) + .map(function(dirtySubmodule) { + return dirtySubmodule.name; + }); + + if (dirtySubmodules.length) { + console.error( + "[nodegit] ERROR - Some submodules have uncommited changes:" + ); + dirtySubmodules.forEach(printSubmodule); + console.error( + "\nThey must either be committed or discarded before we build" + ); + + throw new Error("Dirty Submodules: " + dirtySubmodules.join(" ")); + } + + var outOfSyncSubmodules = statuses + .filter(function(status) { + return status.onNewCommit && !status.needsInitialization; + }) + .map(function(outOfSyncSubmodule) { + return outOfSyncSubmodule.name; + }); + + if (outOfSyncSubmodules.length) { + console.warn( + "[nodegit] WARNING - Some submodules are pointing to an new commit:" + ); + outOfSyncSubmodules.forEach(printSubmodule); + console.warn("\nThey will not be updated."); + } + + return statuses + .filter(function(status) { + return !status.onNewCommit; + }) + .reduce(function(chainPromise, submoduleToUpdate) { + return chainPromise + .then(function() { + console.log( + "[nodegit] Initializing submodule", + submoduleToUpdate.name + ); + return exec( + "git submodule update --init --recursive " + + submoduleToUpdate.name + ); + }); + }, Promise.resolve()); + }); +}; diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000000..93f2f440d8 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,10243 @@ +{ + "name": "nodegit", + "version": "0.28.0-alpha.36", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "nodegit", + "version": "0.28.0-alpha.36", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@mapbox/node-pre-gyp": "^2.0.0", + "fs-extra": "^7.0.0", + "got": "^14.4.7", + "json5": "^2.1.0", + "lodash": "^4.17.14", + "nan": "^2.23.1", + "node-gyp": "^11.2.0", + "tar-fs": "^3.0.9" + }, + "devDependencies": { + "aws-sdk": "^2.1095.0", + "clean-for-publish": "~1.0.2", + "combyne": "~0.8.1", + "js-beautify": "~1.5.10", + "jshint": "^2.10.0", + "lcov-result-merger": "^3.1.0", + "mocha": "^11.4.0", + "nyc": "^17.1.0", + "walk": "^2.3.9" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.5.tgz", + "integrity": "sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.7.tgz", + "integrity": "sha512-SRijHmF0PSPgLIBYlWnG0hyeJLwXE2CgpsXaMOrtt2yp9/86ALw6oUlj9KYuZ0JN07T4eBMVIW4li/9S1j2BGA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.5", + "@babel/helper-compilation-targets": "^7.26.5", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.7", + "@babel/parser": "^7.26.7", + "@babel/template": "^7.25.9", + "@babel/traverse": "^7.26.7", + "@babel/types": "^7.26.7", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.5.tgz", + "integrity": "sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.26.5", + "@babel/types": "^7.26.5", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz", + "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.26.5", + "@babel/helper-validator-option": "^7.25.9", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", + "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", + "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", + "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.1.tgz", + "integrity": "sha512-FCvFTm0sWV8Fxhpp2McP5/W53GPllQ9QeQ7SiqGWjMf/LVG07lFa5+pgK05IRhVwtvafT22KF+ZSnM9I545CvQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.2.tgz", + "integrity": "sha512-QYLs8299NA7WM/bZAdp+CviYYkVoYXlDW2rzliy3chxd1PQjej7JORuMJDJXJUb9g0TT+B99EwaVLKmX+sPXWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.1" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.7.tgz", + "integrity": "sha512-1x1sgeyRLC3r5fQOM0/xtQKsYjyxmFjaOrLJNtZ81inNjyJHGIolTULPiSc/2qe1/qfpFLisLQYFnnZl7QoedA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.5", + "@babel/parser": "^7.26.7", + "@babel/template": "^7.25.9", + "@babel/types": "^7.26.7", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.1.tgz", + "integrity": "sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "license": "MIT" + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "license": "ISC", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@isaacs/fs-minipass/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@mapbox/node-pre-gyp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-2.0.0.tgz", + "integrity": "sha512-llMXd39jtP0HpQLVI37Bf1m2ADlEb35GYSh1SDSLsBhR+5iCxiNGlT31yqbNtVHygHAtMy6dWFERpU2JgufhPg==", + "license": "BSD-3-Clause", + "dependencies": { + "consola": "^3.2.3", + "detect-libc": "^2.0.0", + "https-proxy-agent": "^7.0.5", + "node-fetch": "^2.6.7", + "nopt": "^8.0.0", + "semver": "^7.5.3", + "tar": "^7.4.0" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@npmcli/agent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-3.0.0.tgz", + "integrity": "sha512-S79NdEgDQd/NGCay6TCoVzXSj74skRZIKJcpJjC5lOq34SZzyI6MqtiiWoiVWoVrTcGjNeC4ipbh1VIHlpfF5Q==", + "license": "ISC", + "dependencies": { + "agent-base": "^7.1.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.1", + "lru-cache": "^10.0.1", + "socks-proxy-agent": "^8.0.3" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/fs": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-4.0.0.tgz", + "integrity": "sha512-/xGlezI6xfGO9NwuJlnwz/K14qD1kCSAGtacBHnGzeAIuJGazcp45KP5NuyARXoKb7cwulAGWVsbeSxdG/cb0Q==", + "license": "ISC", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@sec-ant/readable-stream": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz", + "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==", + "license": "MIT" + }, + "node_modules/@sindresorhus/is": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-7.0.1.tgz", + "integrity": "sha512-QWLl2P+rsCJeofkDNIT3WFmb6NrRud1SUYW8dIhXK/46XFV8Q/g7Bsvib0Askb0reRLe+WYPeeE+l5cH7SlkuQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", + "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", + "license": "MIT", + "dependencies": { + "defer-to-connect": "^2.0.1" + }, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", + "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", + "license": "MIT" + }, + "node_modules/abbrev": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", + "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=", + "dev": true + }, + "node_modules/agent-base": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/append-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz", + "integrity": "sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE=", + "dev": true, + "dependencies": { + "buffer-equal": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/append-transform": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", + "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", + "dev": true, + "license": "MIT", + "dependencies": { + "default-require-extensions": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", + "dev": true, + "license": "MIT" + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/aws-sdk": { + "version": "2.1692.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1692.0.tgz", + "integrity": "sha512-x511uiJ/57FIsbgUe5csJ13k3uzu25uWQE+XqfBis/sB0SFoiElJWXRkgEAUh0U6n40eT3ay5Ue4oPkRMu1LYw==", + "dev": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "buffer": "4.9.2", + "events": "1.1.1", + "ieee754": "1.1.13", + "jmespath": "0.16.0", + "querystring": "0.2.0", + "sax": "1.2.1", + "url": "0.10.3", + "util": "^0.12.4", + "uuid": "8.0.0", + "xml2js": "0.6.2" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/b4a": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz", + "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==", + "license": "Apache-2.0" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/bare-events": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.4.tgz", + "integrity": "sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==", + "license": "Apache-2.0", + "optional": true + }, + "node_modules/bare-fs": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.1.5.tgz", + "integrity": "sha512-1zccWBMypln0jEE05LzZt+V/8y8AQsQQqxtklqaIyg5nu6OAYFhZxPXinJTSG+kU5qyNmeLgcn9AW7eHiCHVLA==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "bare-events": "^2.5.4", + "bare-path": "^3.0.0", + "bare-stream": "^2.6.4" + }, + "engines": { + "bare": ">=1.16.0" + }, + "peerDependencies": { + "bare-buffer": "*" + }, + "peerDependenciesMeta": { + "bare-buffer": { + "optional": true + } + } + }, + "node_modules/bare-os": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.6.1.tgz", + "integrity": "sha512-uaIjxokhFidJP+bmmvKSgiMzj2sV5GPHaZVAIktcxcpCyBFFWO+YlikVAdhmUo2vYFvFhOXIAlldqV29L8126g==", + "license": "Apache-2.0", + "optional": true, + "engines": { + "bare": ">=1.14.0" + } + }, + "node_modules/bare-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz", + "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "bare-os": "^3.0.1" + } + }, + "node_modules/bare-stream": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.6.5.tgz", + "integrity": "sha512-jSmxKJNJmHySi6hC42zlZnq00rga4jjxcgNZjY9N5WlOe/iOoGRtdwGsHzQv2RlH2KOYMwGUXhf2zXd32BA9RA==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "streamx": "^2.21.0" + }, + "peerDependencies": { + "bare-buffer": "*", + "bare-events": "*" + }, + "peerDependenciesMeta": { + "bare-buffer": { + "optional": true + }, + "bare-events": { + "optional": true + } + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "node_modules/browserslist": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", + "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.1" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "dev": true, + "dependencies": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "node_modules/buffer-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz", + "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/cacache": { + "version": "19.0.1", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-19.0.1.tgz", + "integrity": "sha512-hdsUxulXCi5STId78vRVYEtDAjq99ICAUktLTeTYsLoTE6Z8dS0c8pWNCxwdrk9YfJeobDZc2Y186hD/5ZQgFQ==", + "license": "ISC", + "dependencies": { + "@npmcli/fs": "^4.0.0", + "fs-minipass": "^3.0.0", + "glob": "^10.2.2", + "lru-cache": "^10.0.1", + "minipass": "^7.0.3", + "minipass-collect": "^2.0.1", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "p-map": "^7.0.2", + "ssri": "^12.0.0", + "tar": "^7.4.3", + "unique-filename": "^4.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/cacache/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/cacache/node_modules/fs-minipass": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", + "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/cacache/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/cacache/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/cacache/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/cacheable-lookup": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", + "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", + "license": "MIT", + "engines": { + "node": ">=14.16" + } + }, + "node_modules/cacheable-request": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-12.0.1.tgz", + "integrity": "sha512-Yo9wGIQUaAfIbk+qY0X4cDQgCosecfBe3V9NSyeY4qPC2SAkbCS4Xj79VP8WOzitpJUZKc/wsRCYF5ariDIwkg==", + "license": "MIT", + "dependencies": { + "@types/http-cache-semantics": "^4.0.4", + "get-stream": "^9.0.1", + "http-cache-semantics": "^4.1.1", + "keyv": "^4.5.4", + "mimic-response": "^4.0.0", + "normalize-url": "^8.0.1", + "responselike": "^3.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/cacheable-request/node_modules/mimic-response": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", + "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caching-transform": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", + "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasha": "^5.0.0", + "make-dir": "^3.0.0", + "package-hash": "^4.0.0", + "write-file-atomic": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001696", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001696.tgz", + "integrity": "sha512-pDCPkvzfa39ehJtJ+OwGT/2yvT2SbjfHhiIW2LWOAcMQ7BzwxT/XuyUp4OTOd0XFWA6BKw0JalnBHgSi5DGJBQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/clean-for-publish": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clean-for-publish/-/clean-for-publish-1.0.4.tgz", + "integrity": "sha1-KZMj50qzSwXSIHBsWd+B3QTKAYo=", + "dev": true, + "dependencies": { + "fs-extra": "^0.26.2", + "glob": "~5.0.15", + "yargs": "~3.29.0" + }, + "bin": { + "clean-for-publish": "lib/cli.js" + } + }, + "node_modules/clean-for-publish/node_modules/fs-extra": { + "version": "0.26.7", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.26.7.tgz", + "integrity": "sha1-muH92UiXeY7at20JGM9C0MMYT6k=", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.0", + "path-is-absolute": "^1.0.0", + "rimraf": "^2.2.8" + } + }, + "node_modules/clean-for-publish/node_modules/jsonfile": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/clean-for-publish/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/clean-for-publish/node_modules/rimraf/node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cli": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz", + "integrity": "sha1-IoF1NPJL+klQw01TLUjsvGIbjBQ=", + "dev": true, + "dependencies": { + "exit": "0.1.2", + "glob": "^7.1.1" + }, + "engines": { + "node": ">=0.2.5" + } + }, + "node_modules/cli/node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "dependencies": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cliui/node_modules/is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cliui/node_modules/string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "dependencies": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clone-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", + "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", + "dev": true + }, + "node_modules/cloneable-readable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz", + "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "process-nextick-args": "^2.0.0", + "readable-stream": "^2.3.5" + } + }, + "node_modules/cloneable-readable/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/cloneable-readable/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/cloneable-readable/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/combyne": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/combyne/-/combyne-0.8.1.tgz", + "integrity": "sha1-WJ3kcEXVcVbcHs4YXWTDidzLR9g=", + "dev": true + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "node_modules/config-chain": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "dev": true, + "dependencies": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "node_modules/consola": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", + "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", + "license": "MIT", + "engines": { + "node": "^14.18.0 || >=16.10.0" + } + }, + "node_modules/console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "dev": true, + "dependencies": { + "date-now": "^0.1.4" + } + }, + "node_modules/convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.1" + } + }, + "node_modules/convert-source-map/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cross-spawn/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", + "dev": true + }, + "node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-require-extensions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.1.tgz", + "integrity": "sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "strip-bom": "^4.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "dependencies": { + "object-keys": "^1.0.12" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/detect-libc": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", + "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/diff": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-7.0.0.tgz", + "integrity": "sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/duplexify/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/duplexify/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/duplexify/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.90", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.90.tgz", + "integrity": "sha512-C3PN4aydfW91Natdyd449Kw+BzhLmof6tzy5W1pFC5SpQxVXT+oyiyOG9AgYYSN9OdA/ik3YkCrpwqI8ug5Tug==", + "dev": true, + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "license": "MIT" + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", + "dev": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/exponential-backoff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", + "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==" + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "node_modules/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", + "license": "MIT" + }, + "node_modules/fdir": { + "version": "6.4.4", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz", + "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "license": "MIT", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" + } + }, + "node_modules/flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "node_modules/flush-write-stream/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/flush-write-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/flush-write-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/foreachasync": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/foreachasync/-/foreachasync-3.0.0.tgz", + "integrity": "sha1-VQKYfchxS+M5IJfzLgBxyd7gfPY=", + "dev": true + }, + "node_modules/foreground-child": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/form-data-encoder": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-4.0.2.tgz", + "integrity": "sha512-KQVhvhK8ZkWzxKxOr56CPulAhH3dobtuQ4+hNQ+HekH/Wp5gSOafqRAeTphQUJAIk0GBvHZgJ2ZGRWd5kphMuw==", + "license": "MIT", + "engines": { + "node": ">= 18" + } + }, + "node_modules/fromentries": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", + "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/fs-mkdirp-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz", + "integrity": "sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.11", + "through2": "^2.0.3" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz", + "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==", + "license": "MIT", + "dependencies": { + "@sec-ant/readable-stream": "^0.4.1", + "is-stream": "^4.0.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-stream/node_modules/is-stream": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz", + "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "dev": true, + "dependencies": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", + "dev": true, + "dependencies": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "node_modules/glob-stream": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz", + "integrity": "sha512-uMbLGAP3S2aDOHUDfdoYcdIePUCfysbAd0IAoWVZbeGU/oNQ8asHVSshLDJUPWxfzj8zsCG7/XeHPHTtow0nsw==", + "dev": true, + "dependencies": { + "extend": "^3.0.0", + "glob": "^7.1.1", + "glob-parent": "^3.1.0", + "is-negated-glob": "^1.0.0", + "ordered-read-streams": "^1.0.0", + "pumpify": "^1.3.5", + "readable-stream": "^2.1.5", + "remove-trailing-separator": "^1.0.1", + "to-absolute-glob": "^2.0.0", + "unique-stream": "^2.0.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/glob-stream/node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-stream/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/glob-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/glob-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/got": { + "version": "14.4.7", + "resolved": "https://registry.npmjs.org/got/-/got-14.4.7.tgz", + "integrity": "sha512-DI8zV1231tqiGzOiOzQWDhsBmncFW7oQDH6Zgy6pDPrqJuVZMtoSgPLLsBZQj8Jg4JFfwoOsDA8NGtLQLnIx2g==", + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^7.0.1", + "@szmarczak/http-timer": "^5.0.1", + "cacheable-lookup": "^7.0.0", + "cacheable-request": "^12.0.1", + "decompress-response": "^6.0.0", + "form-data-encoder": "^4.0.2", + "http2-wrapper": "^2.2.1", + "lowercase-keys": "^3.0.0", + "p-cancelable": "^4.0.1", + "responselike": "^3.0.0", + "type-fest": "^4.26.1" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/got/node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.9", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", + "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasha": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", + "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-stream": "^2.0.0", + "type-fest": "^0.8.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true, + "license": "MIT" + }, + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/http2-wrapper": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz", + "integrity": "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==", + "license": "MIT", + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.2.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", + "dev": true + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "node_modules/invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ip-address": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", + "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "license": "MIT", + "dependencies": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/ip-address/node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "license": "BSD-3-Clause" + }, + "node_modules/is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "dev": true, + "dependencies": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-arguments": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", + "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", + "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-proto": "^1.0.0", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-negated-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", + "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "dev": true, + "dependencies": { + "is-unc-path": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "node_modules/is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "dev": true, + "dependencies": { + "unc-path-regex": "^0.1.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "node_modules/is-valid-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz", + "integrity": "sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-hook": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", + "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "append-transform": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-processinfo": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz", + "integrity": "sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==", + "dev": true, + "license": "ISC", + "dependencies": { + "archy": "^1.0.0", + "cross-spawn": "^7.0.3", + "istanbul-lib-coverage": "^3.2.0", + "p-map": "^3.0.0", + "rimraf": "^3.0.0", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-processinfo/node_modules/p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-processinfo/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report/node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/istanbul-lib-report/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jmespath": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.16.0.tgz", + "integrity": "sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/js-beautify": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.5.10.tgz", + "integrity": "sha1-TZU3FwJpk0SlFsomv1nwonu3Vxk=", + "dev": true, + "dependencies": { + "config-chain": "~1.1.5", + "mkdirp": "~0.5.0", + "nopt": "~3.0.1" + }, + "bin": { + "css-beautify": "js/bin/css-beautify.js", + "html-beautify": "js/bin/html-beautify.js", + "js-beautify": "js/bin/js-beautify.js" + } + }, + "node_modules/js-beautify/node_modules/nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "dev": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/js-yaml/node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/jsbn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", + "license": "MIT" + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jshint": { + "version": "2.13.4", + "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.13.4.tgz", + "integrity": "sha512-HO3bosL84b2qWqI0q+kpT/OpRJwo0R4ivgmxaO848+bo10rc50SkPnrtwSFXttW0ym4np8jbJvLwk5NziB7jIw==", + "dev": true, + "dependencies": { + "cli": "~1.0.0", + "console-browserify": "1.1.x", + "exit": "0.1.x", + "htmlparser2": "3.8.x", + "lodash": "~4.17.21", + "minimatch": "~3.0.2", + "strip-json-comments": "1.0.x" + }, + "bin": { + "jshint": "bin/jshint" + } + }, + "node_modules/jshint/node_modules/dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dev": true, + "dependencies": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + } + }, + "node_modules/jshint/node_modules/dom-serializer/node_modules/domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/jshint/node_modules/dom-serializer/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/jshint/node_modules/domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true + }, + "node_modules/jshint/node_modules/domhandler": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", + "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=", + "dev": true, + "dependencies": { + "domelementtype": "1" + } + }, + "node_modules/jshint/node_modules/domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "dev": true, + "dependencies": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "node_modules/jshint/node_modules/entities": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", + "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=", + "dev": true + }, + "node_modules/jshint/node_modules/htmlparser2": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", + "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=", + "dev": true, + "dependencies": { + "domelementtype": "1", + "domhandler": "2.3", + "domutils": "1.5", + "entities": "1.0", + "readable-stream": "1.1" + } + }, + "node_modules/jshint/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "node_modules/jshint/node_modules/minimatch": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", + "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/jshint/node_modules/readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/jshint/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/klaw": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", + "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.9" + } + }, + "node_modules/lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "dev": true, + "dependencies": { + "readable-stream": "^2.0.5" + }, + "engines": { + "node": ">= 0.6.3" + } + }, + "node_modules/lazystream/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/lazystream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/lazystream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "dependencies": { + "invert-kv": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lcov-result-merger": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lcov-result-merger/-/lcov-result-merger-3.3.0.tgz", + "integrity": "sha512-Krg9p24jGaIT93RBMA8b5qLHDEiAXTavaTiEdMAZaJS93PsBKIcg/89cw/8rgeSfRuQX+I9x7h73SHFjCZ6cHg==", + "dev": true, + "dependencies": { + "through2": "^2.0.3", + "vinyl": "^2.1.0", + "vinyl-fs": "^3.0.2", + "yargs": "^16.2.0" + }, + "bin": { + "lcov-result-merger": "bin/lcov-result-merger.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/lcov-result-merger/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/lcov-result-merger/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/lcov-result-merger/node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/lcov-result-merger/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/lead": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lead/-/lead-1.0.0.tgz", + "integrity": "sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=", + "dev": true, + "dependencies": { + "flush-write-stream": "^1.0.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lowercase-keys": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", + "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC" + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/make-fetch-happen": { + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-14.0.3.tgz", + "integrity": "sha512-QMjGbFTP0blj97EeidG5hk/QhKQ3T4ICckQGLgz38QF7Vgbk6e6FTARN8KhKxyBbWn8R0HU+bnw8aSoFPD4qtQ==", + "license": "ISC", + "dependencies": { + "@npmcli/agent": "^3.0.0", + "cacache": "^19.0.1", + "http-cache-semantics": "^4.1.1", + "minipass": "^7.0.2", + "minipass-fetch": "^4.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^1.0.0", + "proc-log": "^5.0.0", + "promise-retry": "^2.0.1", + "ssri": "^12.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/make-fetch-happen/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", + "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-collect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz", + "integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==", + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minipass-collect/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minipass-fetch": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-4.0.1.tgz", + "integrity": "sha512-j7U11C5HXigVuutxebFadoYBbd7VSdZWggSe64NVdvWNBqGAiXPL2QVCehjmw7lY1oF9gOllYbORh+hiNgfPgQ==", + "license": "MIT", + "dependencies": { + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^3.0.1" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/minipass-fetch/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.2.tgz", + "integrity": "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==", + "license": "MIT", + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mocha": { + "version": "11.4.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-11.4.0.tgz", + "integrity": "sha512-O6oi5Y9G6uu8f9iqXR6iKNLWHLRex3PKbmHynfpmUnMJJGrdgXh8ZmS85Ei5KR2Gnl+/gQ9s+Ktv5CqKybNw4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "browser-stdout": "^1.3.1", + "chokidar": "^4.0.1", + "debug": "^4.3.5", + "diff": "^7.0.0", + "escape-string-regexp": "^4.0.0", + "find-up": "^5.0.0", + "glob": "^10.4.5", + "he": "^1.2.0", + "js-yaml": "^4.1.0", + "log-symbols": "^4.1.0", + "minimatch": "^5.1.6", + "ms": "^2.1.3", + "picocolors": "^1.1.1", + "serialize-javascript": "^6.0.2", + "strip-json-comments": "^3.1.1", + "supports-color": "^8.1.1", + "workerpool": "^6.5.1", + "yargs": "^17.7.2", + "yargs-parser": "^21.1.1", + "yargs-unparser": "^2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/mocha/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/mocha/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/mocha/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/mocha/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mocha/node_modules/glob/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mocha/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/mocha/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mocha/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/mocha/node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha/node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/mocha/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/nan": { + "version": "2.23.1", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.23.1.tgz", + "integrity": "sha512-r7bBUGKzlqk8oPBDYxt6Z0aEdF1G1rwlMcLk8LCOMbOzf0mG+JUfUzG4fIMWwHWP0iyaLWEQZJmtB7nOHEm/qw==", + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-gyp": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-11.2.0.tgz", + "integrity": "sha512-T0S1zqskVUSxcsSTkAsLc7xCycrRYmtDHadDinzocrThjyQCn5kMlEBSj6H4qDbgsIOSLmmlRIeb0lZXj+UArA==", + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^14.0.3", + "nopt": "^8.0.0", + "proc-log": "^5.0.0", + "semver": "^7.3.5", + "tar": "^7.4.3", + "tinyglobby": "^0.2.12", + "which": "^5.0.0" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/node-preload": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", + "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "process-on-spawn": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/node-releases": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "dev": true, + "license": "MIT" + }, + "node_modules/nopt": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-8.1.0.tgz", + "integrity": "sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==", + "license": "ISC", + "dependencies": { + "abbrev": "^3.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/nopt/node_modules/abbrev": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-3.0.1.tgz", + "integrity": "sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==", + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.1.tgz", + "integrity": "sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/now-and-later": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.1.tgz", + "integrity": "sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==", + "dev": true, + "dependencies": { + "once": "^1.3.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nyc": { + "version": "17.1.0", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-17.1.0.tgz", + "integrity": "sha512-U42vQ4czpKa0QdI1hu950XuNhYqgoM+ZF1HT+VuUHL9hPfDPVvNQyltmMqdE9bUHMVa+8yNbc3QKTj8zQhlVxQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "caching-transform": "^4.0.0", + "convert-source-map": "^1.7.0", + "decamelize": "^1.2.0", + "find-cache-dir": "^3.2.0", + "find-up": "^4.1.0", + "foreground-child": "^3.3.0", + "get-package-type": "^0.1.0", + "glob": "^7.1.6", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-hook": "^3.0.0", + "istanbul-lib-instrument": "^6.0.2", + "istanbul-lib-processinfo": "^2.0.2", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "make-dir": "^3.0.0", + "node-preload": "^0.2.1", + "p-map": "^3.0.0", + "process-on-spawn": "^1.0.0", + "resolve-from": "^5.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "spawn-wrap": "^2.0.0", + "test-exclude": "^6.0.0", + "yargs": "^15.0.2" + }, + "bin": { + "nyc": "bin/nyc.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/nyc/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/nyc/node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/nyc/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/nyc/node_modules/p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/nyc/node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/ordered-read-streams": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", + "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=", + "dev": true, + "dependencies": { + "readable-stream": "^2.0.1" + } + }, + "node_modules/ordered-read-streams/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/ordered-read-streams/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/ordered-read-streams/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dev": true, + "dependencies": { + "lcid": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/p-cancelable": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-4.0.1.tgz", + "integrity": "sha512-wBowNApzd45EIKdO1LaU+LrMBwAcjfPaYtVzV3lmfM3gf8Z4CHZsiIqlM8TZZ8okYvh5A1cP6gTfCRQtwUpaUg==", + "license": "MIT", + "engines": { + "node": ">=14.16" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-map": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.3.tgz", + "integrity": "sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/package-hash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", + "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "graceful-fs": "^4.1.15", + "hasha": "^5.0.0", + "lodash.flattendeep": "^4.4.0", + "release-zalgo": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "license": "BlueOak-1.0.0" + }, + "node_modules/path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/proc-log": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-5.0.0.tgz", + "integrity": "sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==", + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "node_modules/process-on-spawn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.1.0.tgz", + "integrity": "sha512-JOnOPQ/8TZgjs1JIH/m9ni7FfimjNa/PRx7y/Wb5qdItsnhO0jE4AT7fC0HjC28DUQWDr50dwSYZLdRMlqDq3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "fromentries": "^1.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "license": "MIT", + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=", + "dev": true + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "dependencies": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } + }, + "node_modules/pumpify/node_modules/pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", + "dev": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/release-zalgo": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", + "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==", + "dev": true, + "license": "ISC", + "dependencies": { + "es6-error": "^4.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/remove-bom-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz", + "integrity": "sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5", + "is-utf8": "^0.2.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/remove-bom-stream": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz", + "integrity": "sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=", + "dev": true, + "dependencies": { + "remove-bom-buffer": "^3.0.0", + "safe-buffer": "^5.1.0", + "through2": "^2.0.3" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "node_modules/replace-ext": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz", + "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true, + "license": "ISC" + }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "license": "MIT" + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-options": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz", + "integrity": "sha1-MrueOcBtZzONyTeMDW1gdFZq0TE=", + "dev": true, + "dependencies": { + "value-or-function": "^3.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/responselike": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", + "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", + "license": "MIT", + "dependencies": { + "lowercase-keys": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "optional": true + }, + "node_modules/sax": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", + "integrity": "sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA==", + "dev": true, + "license": "ISC" + }, + "node_modules/semver": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.0.tgz", + "integrity": "sha512-DrfFnPzblFmNrIZzg5RzHegbiRWg7KMR7btwi2yjHwx06zsUbO5g613sVwEV7FTwmzJu+Io0lJe2GJ3LxqpvBQ==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "license": "MIT", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.4.tgz", + "integrity": "sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ==", + "license": "MIT", + "dependencies": { + "ip-address": "^9.0.5", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", + "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "socks": "^2.8.3" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/spawn-wrap": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", + "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^2.0.0", + "is-windows": "^1.0.2", + "make-dir": "^3.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "which": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/spawn-wrap/node_modules/foreground-child": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/spawn-wrap/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "node_modules/ssri": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-12.0.0.tgz", + "integrity": "sha512-S7iGNosepx9RadX82oimUkvr0Ct7IjJbEbs4mJcTxst8um95J3sDYU1RBEOvdu6oL1Wek2ODI5i4MAw+dZ6cAQ==", + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/ssri/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", + "dev": true + }, + "node_modules/streamx": { + "version": "2.22.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.22.0.tgz", + "integrity": "sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw==", + "license": "MIT", + "dependencies": { + "fast-fifo": "^1.3.2", + "text-decoder": "^1.1.0" + }, + "optionalDependencies": { + "bare-events": "^2.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", + "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", + "dev": true, + "bin": { + "strip-json-comments": "cli.js" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/tar": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", + "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", + "license": "ISC", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.0.1", + "mkdirp": "^3.0.1", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/tar-fs": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.1.tgz", + "integrity": "sha512-LZA0oaPOc2fVo82Txf3gw+AkEd38szODlptMYejQUhndHMLQ9M059uXR+AfS7DNo0NpINvSqDsvyaCrBVkptWg==", + "dependencies": { + "pump": "^3.0.0", + "tar-stream": "^3.1.5" + }, + "optionalDependencies": { + "bare-fs": "^4.0.1", + "bare-path": "^3.0.0" + } + }, + "node_modules/tar-stream": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", + "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", + "license": "MIT", + "dependencies": { + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, + "node_modules/tar/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/tar/node_modules/mkdirp": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", + "license": "MIT", + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/test-exclude/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/text-decoder": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", + "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==", + "license": "Apache-2.0", + "dependencies": { + "b4a": "^1.6.4" + } + }, + "node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/through2-filter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz", + "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==", + "dev": true, + "dependencies": { + "through2": "~2.0.0", + "xtend": "~4.0.0" + } + }, + "node_modules/through2/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/through2/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/through2/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.13.tgz", + "integrity": "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==", + "license": "MIT", + "dependencies": { + "fdir": "^6.4.4", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/to-absolute-glob": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", + "integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=", + "dev": true, + "dependencies": { + "is-absolute": "^1.0.0", + "is-negated-glob": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-through": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-through/-/to-through-2.0.0.tgz", + "integrity": "sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY=", + "dev": true, + "dependencies": { + "through2": "^2.0.3" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" + }, + "node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=8" + } + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unique-filename": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-4.0.0.tgz", + "integrity": "sha512-XSnEewXmQ+veP7xX2dS5Q4yZAvO40cBN2MWkJ7D/6sW4Dg6wYBNwM1Vrnz1FhH5AdeLIlUXRI9e28z1YZi71NQ==", + "license": "ISC", + "dependencies": { + "unique-slug": "^5.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/unique-slug": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-5.0.0.tgz", + "integrity": "sha512-9OdaqO5kwqR+1kVgHAhsp5vPNU0hnxRa26rBFNfNgM7M6pNtgzeBn3s/xbyCQL3dcjzOatcef6UUHpB/6MaETg==", + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/unique-stream": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz", + "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==", + "dev": true, + "dependencies": { + "json-stable-stringify-without-jsonify": "^1.0.1", + "through2-filter": "^3.0.0" + } + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz", + "integrity": "sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/url": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", + "integrity": "sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ=", + "dev": true, + "dependencies": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + }, + "node_modules/url/node_modules/punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + }, + "node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "node_modules/uuid": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.0.0.tgz", + "integrity": "sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw==", + "dev": true, + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/value-or-function": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-3.0.0.tgz", + "integrity": "sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vinyl": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.1.tgz", + "integrity": "sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==", + "dev": true, + "dependencies": { + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vinyl-fs": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-3.0.3.tgz", + "integrity": "sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==", + "dev": true, + "dependencies": { + "fs-mkdirp-stream": "^1.0.0", + "glob-stream": "^6.1.0", + "graceful-fs": "^4.0.0", + "is-valid-glob": "^1.0.0", + "lazystream": "^1.0.0", + "lead": "^1.0.0", + "object.assign": "^4.0.4", + "pumpify": "^1.3.5", + "readable-stream": "^2.3.3", + "remove-bom-buffer": "^3.0.0", + "remove-bom-stream": "^1.2.0", + "resolve-options": "^1.1.0", + "through2": "^2.0.0", + "to-through": "^2.0.0", + "value-or-function": "^3.0.0", + "vinyl": "^2.0.0", + "vinyl-sourcemap": "^1.1.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vinyl-fs/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/vinyl-fs/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/vinyl-fs/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/vinyl-sourcemap": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz", + "integrity": "sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY=", + "dev": true, + "dependencies": { + "append-buffer": "^1.0.2", + "convert-source-map": "^1.5.0", + "graceful-fs": "^4.1.6", + "normalize-path": "^2.1.1", + "now-and-later": "^2.0.0", + "remove-bom-buffer": "^3.0.0", + "vinyl": "^2.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/walk": { + "version": "2.3.15", + "resolved": "https://registry.npmjs.org/walk/-/walk-2.3.15.tgz", + "integrity": "sha512-4eRTBZljBfIISK1Vnt69Gvr2w/wc3U6Vtrw7qiN5iqYJPH7LElcYh/iU4XWhdCy2dZqv1ToMyYlybDylfG/5Vg==", + "dev": true, + "dependencies": { + "foreachasync": "^3.0.0" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", + "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/which-module": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/which-typed-array": { + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "license": "ISC", + "engines": { + "node": ">=16" + } + }, + "node_modules/window-size": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", + "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=", + "dev": true, + "bin": { + "window-size": "cli.js" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/workerpool": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz", + "integrity": "sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "dependencies": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "dependencies": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/xml2js": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.2.tgz", + "integrity": "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==", + "dev": true, + "license": "MIT", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", + "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", + "dev": true + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yargs": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.29.0.tgz", + "integrity": "sha1-GquWYOrnnYuPZ1vK7qtu40ws9pw=", + "dev": true, + "dependencies": { + "camelcase": "^1.2.1", + "cliui": "^3.0.3", + "decamelize": "^1.0.0", + "os-locale": "^1.4.0", + "window-size": "^0.1.2", + "y18n": "^3.2.0" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-unparser/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yargs-unparser/node_modules/decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + }, + "dependencies": { + "@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + } + }, + "@babel/compat-data": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.5.tgz", + "integrity": "sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg==", + "dev": true + }, + "@babel/core": { + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.7.tgz", + "integrity": "sha512-SRijHmF0PSPgLIBYlWnG0hyeJLwXE2CgpsXaMOrtt2yp9/86ALw6oUlj9KYuZ0JN07T4eBMVIW4li/9S1j2BGA==", + "dev": true, + "peer": true, + "requires": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.5", + "@babel/helper-compilation-targets": "^7.26.5", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.7", + "@babel/parser": "^7.26.7", + "@babel/template": "^7.25.9", + "@babel/traverse": "^7.26.7", + "@babel/types": "^7.26.7", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "dependencies": { + "convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.5.tgz", + "integrity": "sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==", + "dev": true, + "requires": { + "@babel/parser": "^7.26.5", + "@babel/types": "^7.26.5", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz", + "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.26.5", + "@babel/helper-validator-option": "^7.25.9", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "dependencies": { + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } + } + }, + "@babel/helper-module-imports": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", + "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", + "dev": true, + "requires": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + } + }, + "@babel/helper-module-transforms": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", + "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" + } + }, + "@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true + }, + "@babel/helper-validator-identifier": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "dev": true + }, + "@babel/helper-validator-option": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", + "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", + "dev": true + }, + "@babel/helpers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.1.tgz", + "integrity": "sha512-FCvFTm0sWV8Fxhpp2McP5/W53GPllQ9QeQ7SiqGWjMf/LVG07lFa5+pgK05IRhVwtvafT22KF+ZSnM9I545CvQ==", + "dev": true, + "requires": { + "@babel/template": "^7.27.1", + "@babel/types": "^7.27.1" + } + }, + "@babel/parser": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.2.tgz", + "integrity": "sha512-QYLs8299NA7WM/bZAdp+CviYYkVoYXlDW2rzliy3chxd1PQjej7JORuMJDJXJUb9g0TT+B99EwaVLKmX+sPXWw==", + "dev": true, + "requires": { + "@babel/types": "^7.27.1" + } + }, + "@babel/template": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + } + }, + "@babel/traverse": { + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.7.tgz", + "integrity": "sha512-1x1sgeyRLC3r5fQOM0/xtQKsYjyxmFjaOrLJNtZ81inNjyJHGIolTULPiSc/2qe1/qfpFLisLQYFnnZl7QoedA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.5", + "@babel/parser": "^7.26.7", + "@babel/template": "^7.25.9", + "@babel/types": "^7.26.7", + "debug": "^4.3.1", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.1.tgz", + "integrity": "sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" + } + }, + "@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "requires": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==" + }, + "ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==" + }, + "emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "requires": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + } + }, + "strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "requires": { + "ansi-regex": "^6.0.1" + } + }, + "wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "requires": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + } + } + } + }, + "@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "requires": { + "minipass": "^7.0.4" + }, + "dependencies": { + "minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==" + } + } + }, + "@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + } + } + }, + "@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true + }, + "@jridgewell/gen-mapping": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true + }, + "@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true + }, + "@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "@mapbox/node-pre-gyp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-2.0.0.tgz", + "integrity": "sha512-llMXd39jtP0HpQLVI37Bf1m2ADlEb35GYSh1SDSLsBhR+5iCxiNGlT31yqbNtVHygHAtMy6dWFERpU2JgufhPg==", + "requires": { + "consola": "^3.2.3", + "detect-libc": "^2.0.0", + "https-proxy-agent": "^7.0.5", + "node-fetch": "^2.6.7", + "nopt": "^8.0.0", + "semver": "^7.5.3", + "tar": "^7.4.0" + } + }, + "@npmcli/agent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-3.0.0.tgz", + "integrity": "sha512-S79NdEgDQd/NGCay6TCoVzXSj74skRZIKJcpJjC5lOq34SZzyI6MqtiiWoiVWoVrTcGjNeC4ipbh1VIHlpfF5Q==", + "requires": { + "agent-base": "^7.1.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.1", + "lru-cache": "^10.0.1", + "socks-proxy-agent": "^8.0.3" + } + }, + "@npmcli/fs": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-4.0.0.tgz", + "integrity": "sha512-/xGlezI6xfGO9NwuJlnwz/K14qD1kCSAGtacBHnGzeAIuJGazcp45KP5NuyARXoKb7cwulAGWVsbeSxdG/cb0Q==", + "requires": { + "semver": "^7.3.5" + } + }, + "@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "optional": true + }, + "@sec-ant/readable-stream": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz", + "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==" + }, + "@sindresorhus/is": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-7.0.1.tgz", + "integrity": "sha512-QWLl2P+rsCJeofkDNIT3WFmb6NrRud1SUYW8dIhXK/46XFV8Q/g7Bsvib0Askb0reRLe+WYPeeE+l5cH7SlkuQ==" + }, + "@szmarczak/http-timer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", + "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", + "requires": { + "defer-to-connect": "^2.0.1" + } + }, + "@types/http-cache-semantics": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", + "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==" + }, + "abbrev": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", + "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=", + "dev": true + }, + "agent-base": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==" + }, + "aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "append-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz", + "integrity": "sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE=", + "dev": true, + "requires": { + "buffer-equal": "^1.0.0" + } + }, + "append-transform": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", + "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", + "dev": true, + "requires": { + "default-require-extensions": "^3.0.0" + } + }, + "archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", + "dev": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "requires": { + "possible-typed-array-names": "^1.0.0" + } + }, + "aws-sdk": { + "version": "2.1692.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1692.0.tgz", + "integrity": "sha512-x511uiJ/57FIsbgUe5csJ13k3uzu25uWQE+XqfBis/sB0SFoiElJWXRkgEAUh0U6n40eT3ay5Ue4oPkRMu1LYw==", + "dev": true, + "requires": { + "buffer": "4.9.2", + "events": "1.1.1", + "ieee754": "1.1.13", + "jmespath": "0.16.0", + "querystring": "0.2.0", + "sax": "1.2.1", + "url": "0.10.3", + "util": "^0.12.4", + "uuid": "8.0.0", + "xml2js": "0.6.2" + } + }, + "b4a": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz", + "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==" + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "bare-events": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.4.tgz", + "integrity": "sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==", + "optional": true + }, + "bare-fs": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.1.5.tgz", + "integrity": "sha512-1zccWBMypln0jEE05LzZt+V/8y8AQsQQqxtklqaIyg5nu6OAYFhZxPXinJTSG+kU5qyNmeLgcn9AW7eHiCHVLA==", + "optional": true, + "requires": { + "bare-events": "^2.5.4", + "bare-path": "^3.0.0", + "bare-stream": "^2.6.4" + } + }, + "bare-os": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.6.1.tgz", + "integrity": "sha512-uaIjxokhFidJP+bmmvKSgiMzj2sV5GPHaZVAIktcxcpCyBFFWO+YlikVAdhmUo2vYFvFhOXIAlldqV29L8126g==", + "optional": true + }, + "bare-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz", + "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==", + "optional": true, + "requires": { + "bare-os": "^3.0.1" + } + }, + "bare-stream": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.6.5.tgz", + "integrity": "sha512-jSmxKJNJmHySi6hC42zlZnq00rga4jjxcgNZjY9N5WlOe/iOoGRtdwGsHzQv2RlH2KOYMwGUXhf2zXd32BA9RA==", + "optional": true, + "requires": { + "streamx": "^2.21.0" + } + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "browserslist": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", + "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", + "dev": true, + "peer": true, + "requires": { + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.1" + } + }, + "buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "buffer-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz", + "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=", + "dev": true + }, + "cacache": { + "version": "19.0.1", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-19.0.1.tgz", + "integrity": "sha512-hdsUxulXCi5STId78vRVYEtDAjq99ICAUktLTeTYsLoTE6Z8dS0c8pWNCxwdrk9YfJeobDZc2Y186hD/5ZQgFQ==", + "requires": { + "@npmcli/fs": "^4.0.0", + "fs-minipass": "^3.0.0", + "glob": "^10.2.2", + "lru-cache": "^10.0.1", + "minipass": "^7.0.3", + "minipass-collect": "^2.0.1", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "p-map": "^7.0.2", + "ssri": "^12.0.0", + "tar": "^7.4.3", + "unique-filename": "^4.0.0" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "requires": { + "balanced-match": "^1.0.0" + } + }, + "fs-minipass": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", + "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", + "requires": { + "minipass": "^7.0.3" + } + }, + "glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "requires": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + } + }, + "minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==" + } + } + }, + "cacheable-lookup": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", + "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==" + }, + "cacheable-request": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-12.0.1.tgz", + "integrity": "sha512-Yo9wGIQUaAfIbk+qY0X4cDQgCosecfBe3V9NSyeY4qPC2SAkbCS4Xj79VP8WOzitpJUZKc/wsRCYF5ariDIwkg==", + "requires": { + "@types/http-cache-semantics": "^4.0.4", + "get-stream": "^9.0.1", + "http-cache-semantics": "^4.1.1", + "keyv": "^4.5.4", + "mimic-response": "^4.0.0", + "normalize-url": "^8.0.1", + "responselike": "^3.0.0" + }, + "dependencies": { + "mimic-response": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", + "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==" + } + } + }, + "caching-transform": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", + "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", + "dev": true, + "requires": { + "hasha": "^5.0.0", + "make-dir": "^3.0.0", + "package-hash": "^4.0.0", + "write-file-atomic": "^3.0.0" + } + }, + "call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "dev": true, + "requires": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + } + }, + "call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "requires": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + } + }, + "call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "requires": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + } + }, + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "dev": true + }, + "caniuse-lite": { + "version": "1.0.30001696", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001696.tgz", + "integrity": "sha512-pDCPkvzfa39ehJtJ+OwGT/2yvT2SbjfHhiIW2LWOAcMQ7BzwxT/XuyUp4OTOd0XFWA6BKw0JalnBHgSi5DGJBQ==", + "dev": true + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "requires": { + "readdirp": "^4.0.1" + } + }, + "chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==" + }, + "clean-for-publish": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clean-for-publish/-/clean-for-publish-1.0.4.tgz", + "integrity": "sha1-KZMj50qzSwXSIHBsWd+B3QTKAYo=", + "dev": true, + "requires": { + "fs-extra": "^0.26.2", + "glob": "~5.0.15", + "yargs": "~3.29.0" + }, + "dependencies": { + "fs-extra": { + "version": "0.26.7", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.26.7.tgz", + "integrity": "sha1-muH92UiXeY7at20JGM9C0MMYT6k=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.0", + "path-is-absolute": "^1.0.0", + "rimraf": "^2.2.8" + } + }, + "jsonfile": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + }, + "dependencies": { + "glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } + } + } + } + }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true + }, + "cli": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz", + "integrity": "sha1-IoF1NPJL+klQw01TLUjsvGIbjBQ=", + "dev": true, + "requires": { + "exit": "0.1.2", + "glob": "^7.1.1" + }, + "dependencies": { + "glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } + } + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "dev": true + }, + "clone-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", + "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", + "dev": true + }, + "clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", + "dev": true + }, + "cloneable-readable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz", + "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "process-nextick-args": "^2.0.0", + "readable-stream": "^2.3.5" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "combyne": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/combyne/-/combyne-0.8.1.tgz", + "integrity": "sha1-WJ3kcEXVcVbcHs4YXWTDidzLR9g=", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "config-chain": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "dev": true, + "requires": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "consola": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", + "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==" + }, + "console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "dev": true, + "requires": { + "date-now": "^0.1.4" + } + }, + "convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "dependencies": { + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", + "dev": true + }, + "debug": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "requires": { + "ms": "^2.1.3" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "requires": { + "mimic-response": "^3.1.0" + } + }, + "default-require-extensions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.1.tgz", + "integrity": "sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==", + "dev": true, + "requires": { + "strip-bom": "^4.0.0" + } + }, + "defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==" + }, + "define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "requires": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + } + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "detect-libc": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", + "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==" + }, + "diff": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-7.0.0.tgz", + "integrity": "sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==", + "dev": true + }, + "dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "requires": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + } + }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, + "electron-to-chromium": { + "version": "1.5.90", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.90.tgz", + "integrity": "sha512-C3PN4aydfW91Natdyd449Kw+BzhLmof6tzy5W1pFC5SpQxVXT+oyiyOG9AgYYSN9OdA/ik3YkCrpwqI8ug5Tug==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "requires": { + "once": "^1.4.0" + } + }, + "env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==" + }, + "err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==" + }, + "es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true + }, + "es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true + }, + "es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "requires": { + "es-errors": "^1.3.0" + } + }, + "es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true + }, + "escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", + "dev": true + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true + }, + "exponential-backoff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", + "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==" + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==" + }, + "fdir": { + "version": "6.4.4", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz", + "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", + "requires": {} + }, + "find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true + }, + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dev": true, + "requires": { + "is-callable": "^1.2.7" + } + }, + "foreachasync": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/foreachasync/-/foreachasync-3.0.0.tgz", + "integrity": "sha1-VQKYfchxS+M5IJfzLgBxyd7gfPY=", + "dev": true + }, + "foreground-child": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", + "requires": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "dependencies": { + "signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==" + } + } + }, + "form-data-encoder": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-4.0.2.tgz", + "integrity": "sha512-KQVhvhK8ZkWzxKxOr56CPulAhH3dobtuQ4+hNQ+HekH/Wp5gSOafqRAeTphQUJAIk0GBvHZgJ2ZGRWd5kphMuw==" + }, + "fromentries": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", + "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", + "dev": true + }, + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs-mkdirp-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz", + "integrity": "sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "through2": "^2.0.3" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true + }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "requires": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + } + }, + "get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true + }, + "get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "requires": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + } + }, + "get-stream": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz", + "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==", + "requires": { + "@sec-ant/readable-stream": "^0.4.1", + "is-stream": "^4.0.1" + }, + "dependencies": { + "is-stream": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz", + "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==" + } + } + }, + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "dev": true, + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "glob-stream": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz", + "integrity": "sha512-uMbLGAP3S2aDOHUDfdoYcdIePUCfysbAd0IAoWVZbeGU/oNQ8asHVSshLDJUPWxfzj8zsCG7/XeHPHTtow0nsw==", + "dev": true, + "requires": { + "extend": "^3.0.0", + "glob": "^7.1.1", + "glob-parent": "^3.1.0", + "is-negated-glob": "^1.0.0", + "ordered-read-streams": "^1.0.0", + "pumpify": "^1.3.5", + "readable-stream": "^2.1.5", + "remove-trailing-separator": "^1.0.1", + "to-absolute-glob": "^2.0.0", + "unique-stream": "^2.0.2" + }, + "dependencies": { + "glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true + }, + "got": { + "version": "14.4.7", + "resolved": "https://registry.npmjs.org/got/-/got-14.4.7.tgz", + "integrity": "sha512-DI8zV1231tqiGzOiOzQWDhsBmncFW7oQDH6Zgy6pDPrqJuVZMtoSgPLLsBZQj8Jg4JFfwoOsDA8NGtLQLnIx2g==", + "requires": { + "@sindresorhus/is": "^7.0.1", + "@szmarczak/http-timer": "^5.0.1", + "cacheable-lookup": "^7.0.0", + "cacheable-request": "^12.0.1", + "decompress-response": "^6.0.0", + "form-data-encoder": "^4.0.2", + "http2-wrapper": "^2.2.1", + "lowercase-keys": "^3.0.0", + "p-cancelable": "^4.0.1", + "responselike": "^3.0.0", + "type-fest": "^4.26.1" + }, + "dependencies": { + "type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==" + } + } + }, + "graceful-fs": { + "version": "4.2.9", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", + "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "requires": { + "es-define-property": "^1.0.0" + } + }, + "has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true + }, + "has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "requires": { + "has-symbols": "^1.0.3" + } + }, + "hasha": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", + "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", + "dev": true, + "requires": { + "is-stream": "^2.0.0", + "type-fest": "^0.8.0" + } + }, + "hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "requires": { + "function-bind": "^1.1.2" + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" + }, + "http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "requires": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + } + }, + "http2-wrapper": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz", + "integrity": "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==", + "requires": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.2.0" + } + }, + "https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "requires": { + "agent-base": "^7.1.2", + "debug": "4" + } + }, + "iconv-lite": { + "version": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", + "dev": true + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==" + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true + }, + "ip-address": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", + "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "requires": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + }, + "dependencies": { + "sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==" + } + } + }, + "is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "dev": true, + "requires": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + } + }, + "is-arguments": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", + "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", + "dev": true, + "requires": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "is-generator-function": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", + "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", + "dev": true, + "requires": { + "call-bound": "^1.0.3", + "get-proto": "^1.0.0", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + } + }, + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + }, + "is-negated-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", + "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=", + "dev": true + }, + "is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true + }, + "is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, + "requires": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + } + }, + "is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "dev": true, + "requires": { + "is-unc-path": "^1.0.0" + } + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true + }, + "is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dev": true, + "requires": { + "which-typed-array": "^1.1.16" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "dev": true, + "requires": { + "unc-path-regex": "^0.1.2" + } + }, + "is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "is-valid-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz", + "integrity": "sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true + }, + "istanbul-lib-hook": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", + "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", + "dev": true, + "requires": { + "append-transform": "^2.0.0" + } + }, + "istanbul-lib-instrument": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", + "dev": true, + "requires": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + } + }, + "istanbul-lib-processinfo": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz", + "integrity": "sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==", + "dev": true, + "requires": { + "archy": "^1.0.0", + "cross-spawn": "^7.0.3", + "istanbul-lib-coverage": "^3.2.0", + "p-map": "^3.0.0", + "rimraf": "^3.0.0", + "uuid": "^8.3.2" + }, + "dependencies": { + "p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true + } + } + }, + "istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "requires": { + "semver": "^7.5.3" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "istanbul-reports": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "requires": { + "@isaacs/cliui": "^8.0.2", + "@pkgjs/parseargs": "^0.11.0" + } + }, + "jmespath": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.16.0.tgz", + "integrity": "sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw==", + "dev": true + }, + "js-beautify": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.5.10.tgz", + "integrity": "sha1-TZU3FwJpk0SlFsomv1nwonu3Vxk=", + "dev": true, + "requires": { + "config-chain": "~1.1.5", + "mkdirp": "~0.5.0", + "nopt": "~3.0.1" + }, + "dependencies": { + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "dev": true, + "requires": { + "abbrev": "1" + } + } + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "dependencies": { + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + } + } + }, + "jsbn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==" + }, + "jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true + }, + "jshint": { + "version": "2.13.4", + "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.13.4.tgz", + "integrity": "sha512-HO3bosL84b2qWqI0q+kpT/OpRJwo0R4ivgmxaO848+bo10rc50SkPnrtwSFXttW0ym4np8jbJvLwk5NziB7jIw==", + "dev": true, + "requires": { + "cli": "~1.0.0", + "console-browserify": "1.1.x", + "exit": "0.1.x", + "htmlparser2": "3.8.x", + "lodash": "~4.17.21", + "minimatch": "~3.0.2", + "strip-json-comments": "1.0.x" + }, + "dependencies": { + "dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + }, + "dependencies": { + "domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "dev": true + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true + } + } + }, + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true + }, + "domhandler": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", + "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=", + "dev": true, + "requires": { + "domelementtype": "1" + } + }, + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "dev": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "entities": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", + "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=", + "dev": true + }, + "htmlparser2": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", + "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=", + "dev": true, + "requires": { + "domelementtype": "1", + "domhandler": "2.3", + "domutils": "1.5", + "entities": "1.0", + "readable-stream": "1.1" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "minimatch": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", + "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, + "json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==" + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "requires": { + "json-buffer": "3.0.1" + } + }, + "klaw": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", + "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.9" + } + }, + "lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "dev": true, + "requires": { + "readable-stream": "^2.0.5" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "requires": { + "invert-kv": "^1.0.0" + } + }, + "lcov-result-merger": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lcov-result-merger/-/lcov-result-merger-3.3.0.tgz", + "integrity": "sha512-Krg9p24jGaIT93RBMA8b5qLHDEiAXTavaTiEdMAZaJS93PsBKIcg/89cw/8rgeSfRuQX+I9x7h73SHFjCZ6cHg==", + "dev": true, + "requires": { + "through2": "^2.0.3", + "vinyl": "^2.1.0", + "vinyl-fs": "^3.0.2", + "yargs": "^16.2.0" + }, + "dependencies": { + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + } + } + }, + "lead": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lead/-/lead-1.0.0.tgz", + "integrity": "sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=", + "dev": true, + "requires": { + "flush-write-stream": "^1.0.2" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", + "dev": true + }, + "log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + } + }, + "lowercase-keys": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", + "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==" + }, + "lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } + } + }, + "make-fetch-happen": { + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-14.0.3.tgz", + "integrity": "sha512-QMjGbFTP0blj97EeidG5hk/QhKQ3T4ICckQGLgz38QF7Vgbk6e6FTARN8KhKxyBbWn8R0HU+bnw8aSoFPD4qtQ==", + "requires": { + "@npmcli/agent": "^3.0.0", + "cacache": "^19.0.1", + "http-cache-semantics": "^4.1.1", + "minipass": "^7.0.2", + "minipass-fetch": "^4.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^1.0.0", + "proc-log": "^5.0.0", + "promise-retry": "^2.0.1", + "ssri": "^12.0.0" + }, + "dependencies": { + "minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==" + } + } + }, + "math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true + }, + "mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==" + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", + "dev": true + }, + "minipass": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", + "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", + "requires": { + "yallist": "^4.0.0" + } + }, + "minipass-collect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz", + "integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==", + "requires": { + "minipass": "^7.0.3" + }, + "dependencies": { + "minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==" + } + } + }, + "minipass-fetch": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-4.0.1.tgz", + "integrity": "sha512-j7U11C5HXigVuutxebFadoYBbd7VSdZWggSe64NVdvWNBqGAiXPL2QVCehjmw7lY1oF9gOllYbORh+hiNgfPgQ==", + "requires": { + "encoding": "^0.1.13", + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^3.0.1" + }, + "dependencies": { + "minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==" + } + } + }, + "minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "requires": { + "minipass": "^3.0.0" + } + }, + "minizlib": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.2.tgz", + "integrity": "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==", + "requires": { + "minipass": "^7.1.2" + }, + "dependencies": { + "minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==" + } + } + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "mocha": { + "version": "11.4.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-11.4.0.tgz", + "integrity": "sha512-O6oi5Y9G6uu8f9iqXR6iKNLWHLRex3PKbmHynfpmUnMJJGrdgXh8ZmS85Ei5KR2Gnl+/gQ9s+Ktv5CqKybNw4A==", + "dev": true, + "requires": { + "browser-stdout": "^1.3.1", + "chokidar": "^4.0.1", + "debug": "^4.3.5", + "diff": "^7.0.0", + "escape-string-regexp": "^4.0.0", + "find-up": "^5.0.0", + "glob": "^10.4.5", + "he": "^1.2.0", + "js-yaml": "^4.1.0", + "log-symbols": "^4.1.0", + "minimatch": "^5.1.6", + "ms": "^2.1.3", + "picocolors": "^1.1.1", + "serialize-javascript": "^6.0.2", + "strip-json-comments": "^3.1.1", + "supports-color": "^8.1.1", + "workerpool": "^6.5.1", + "yargs": "^17.7.2", + "yargs-parser": "^21.1.1", + "yargs-unparser": "^2.0.0" + }, + "dependencies": { + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + } + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "requires": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "dependencies": { + "minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, + "yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "requires": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + } + }, + "yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true + } + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "nan": { + "version": "2.23.1", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.23.1.tgz", + "integrity": "sha512-r7bBUGKzlqk8oPBDYxt6Z0aEdF1G1rwlMcLk8LCOMbOzf0mG+JUfUzG4fIMWwHWP0iyaLWEQZJmtB7nOHEm/qw==" + }, + "negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==" + }, + "node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "requires": { + "whatwg-url": "^5.0.0" + } + }, + "node-gyp": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-11.2.0.tgz", + "integrity": "sha512-T0S1zqskVUSxcsSTkAsLc7xCycrRYmtDHadDinzocrThjyQCn5kMlEBSj6H4qDbgsIOSLmmlRIeb0lZXj+UArA==", + "requires": { + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^14.0.3", + "nopt": "^8.0.0", + "proc-log": "^5.0.0", + "semver": "^7.3.5", + "tar": "^7.4.3", + "tinyglobby": "^0.2.12", + "which": "^5.0.0" + } + }, + "node-preload": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", + "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", + "dev": true, + "requires": { + "process-on-spawn": "^1.0.0" + } + }, + "node-releases": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "dev": true + }, + "nopt": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-8.1.0.tgz", + "integrity": "sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==", + "requires": { + "abbrev": "^3.0.0" + }, + "dependencies": { + "abbrev": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-3.0.1.tgz", + "integrity": "sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==" + } + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "normalize-url": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.1.tgz", + "integrity": "sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==" + }, + "now-and-later": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.1.tgz", + "integrity": "sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==", + "dev": true, + "requires": { + "once": "^1.3.2" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "nyc": { + "version": "17.1.0", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-17.1.0.tgz", + "integrity": "sha512-U42vQ4czpKa0QdI1hu950XuNhYqgoM+ZF1HT+VuUHL9hPfDPVvNQyltmMqdE9bUHMVa+8yNbc3QKTj8zQhlVxQ==", + "dev": true, + "requires": { + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "caching-transform": "^4.0.0", + "convert-source-map": "^1.7.0", + "decamelize": "^1.2.0", + "find-cache-dir": "^3.2.0", + "find-up": "^4.1.0", + "foreground-child": "^3.3.0", + "get-package-type": "^0.1.0", + "glob": "^7.1.6", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-hook": "^3.0.0", + "istanbul-lib-instrument": "^6.0.2", + "istanbul-lib-processinfo": "^2.0.2", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "make-dir": "^3.0.0", + "node-preload": "^0.2.1", + "p-map": "^3.0.0", + "process-on-spawn": "^1.0.0", + "resolve-from": "^5.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "spawn-wrap": "^2.0.0", + "test-exclude": "^6.0.0", + "yargs": "^15.0.2" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + } + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "ordered-read-streams": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", + "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=", + "dev": true, + "requires": { + "readable-stream": "^2.0.1" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dev": true, + "requires": { + "lcid": "^1.0.0" + } + }, + "p-cancelable": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-4.0.1.tgz", + "integrity": "sha512-wBowNApzd45EIKdO1LaU+LrMBwAcjfPaYtVzV3lmfM3gf8Z4CHZsiIqlM8TZZ8okYvh5A1cP6gTfCRQtwUpaUg==" + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-map": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.3.tgz", + "integrity": "sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==" + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "package-hash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", + "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.15", + "hasha": "^5.0.0", + "lodash.flattendeep": "^4.4.0", + "release-zalgo": "^1.0.0" + } + }, + "package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==" + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + }, + "path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "requires": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "dependencies": { + "minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==" + } + } + }, + "picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true + }, + "picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "peer": true + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + }, + "possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true + }, + "proc-log": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-5.0.0.tgz", + "integrity": "sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "process-on-spawn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.1.0.tgz", + "integrity": "sha512-JOnOPQ/8TZgjs1JIH/m9ni7FfimjNa/PRx7y/Wb5qdItsnhO0jE4AT7fC0HjC28DUQWDr50dwSYZLdRMlqDq3Q==", + "dev": true, + "requires": { + "fromentries": "^1.2.0" + } + }, + "promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "requires": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + } + }, + "proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=", + "dev": true + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==" + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true + }, + "release-zalgo": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", + "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==", + "dev": true, + "requires": { + "es6-error": "^4.0.1" + } + }, + "remove-bom-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz", + "integrity": "sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5", + "is-utf8": "^0.2.1" + } + }, + "remove-bom-stream": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz", + "integrity": "sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=", + "dev": true, + "requires": { + "remove-bom-buffer": "^3.0.0", + "safe-buffer": "^5.1.0", + "through2": "^2.0.3" + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "replace-ext": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz", + "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==", + "dev": true + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==" + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + }, + "resolve-options": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz", + "integrity": "sha1-MrueOcBtZzONyTeMDW1gdFZq0TE=", + "dev": true, + "requires": { + "value-or-function": "^3.0.0" + } + }, + "responselike": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", + "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", + "requires": { + "lowercase-keys": "^3.0.0" + } + }, + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==" + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + }, + "dependencies": { + "glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, + "requires": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "optional": true + }, + "sax": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", + "integrity": "sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA==", + "dev": true + }, + "semver": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.0.tgz", + "integrity": "sha512-DrfFnPzblFmNrIZzg5RzHegbiRWg7KMR7btwi2yjHwx06zsUbO5g613sVwEV7FTwmzJu+Io0lJe2GJ3LxqpvBQ==" + }, + "serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "requires": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + } + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + }, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==" + }, + "socks": { + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.4.tgz", + "integrity": "sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ==", + "requires": { + "ip-address": "^9.0.5", + "smart-buffer": "^4.2.0" + } + }, + "socks-proxy-agent": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", + "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", + "requires": { + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "socks": "^2.8.3" + } + }, + "spawn-wrap": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", + "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", + "dev": true, + "requires": { + "foreground-child": "^2.0.0", + "is-windows": "^1.0.2", + "make-dir": "^3.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "which": "^2.0.1" + }, + "dependencies": { + "foreground-child": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "ssri": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-12.0.0.tgz", + "integrity": "sha512-S7iGNosepx9RadX82oimUkvr0Ct7IjJbEbs4mJcTxst8um95J3sDYU1RBEOvdu6oL1Wek2ODI5i4MAw+dZ6cAQ==", + "requires": { + "minipass": "^7.0.3" + }, + "dependencies": { + "minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==" + } + } + }, + "stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", + "dev": true + }, + "streamx": { + "version": "2.22.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.22.0.tgz", + "integrity": "sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw==", + "requires": { + "bare-events": "^2.2.0", + "fast-fifo": "^1.3.2", + "text-decoder": "^1.1.0" + } + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "string-width-cjs": { + "version": "npm:string-width@4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-ansi-cjs": { + "version": "npm:strip-ansi@6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true + }, + "strip-json-comments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", + "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", + "dev": true + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "tar": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", + "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", + "requires": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.0.1", + "mkdirp": "^3.0.1", + "yallist": "^5.0.0" + }, + "dependencies": { + "minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==" + }, + "mkdirp": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==" + }, + "yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==" + } + } + }, + "tar-fs": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.1.tgz", + "integrity": "sha512-LZA0oaPOc2fVo82Txf3gw+AkEd38szODlptMYejQUhndHMLQ9M059uXR+AfS7DNo0NpINvSqDsvyaCrBVkptWg==", + "requires": { + "bare-fs": "^4.0.1", + "bare-path": "^3.0.0", + "pump": "^3.0.0", + "tar-stream": "^3.1.5" + } + }, + "tar-stream": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", + "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", + "requires": { + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, + "test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "dependencies": { + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } + } + }, + "text-decoder": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", + "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==", + "requires": { + "b4a": "^1.6.4" + } + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "through2-filter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz", + "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==", + "dev": true, + "requires": { + "through2": "~2.0.0", + "xtend": "~4.0.0" + } + }, + "tinyglobby": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.13.tgz", + "integrity": "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==", + "requires": { + "fdir": "^6.4.4", + "picomatch": "^4.0.2" + } + }, + "to-absolute-glob": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", + "integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=", + "dev": true, + "requires": { + "is-absolute": "^1.0.0", + "is-negated-glob": "^1.0.0" + } + }, + "to-through": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-through/-/to-through-2.0.0.tgz", + "integrity": "sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY=", + "dev": true, + "requires": { + "through2": "^2.0.3" + } + }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "requires": { + "is-typedarray": "^1.0.0" + } + }, + "unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", + "dev": true + }, + "unique-filename": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-4.0.0.tgz", + "integrity": "sha512-XSnEewXmQ+veP7xX2dS5Q4yZAvO40cBN2MWkJ7D/6sW4Dg6wYBNwM1Vrnz1FhH5AdeLIlUXRI9e28z1YZi71NQ==", + "requires": { + "unique-slug": "^5.0.0" + } + }, + "unique-slug": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-5.0.0.tgz", + "integrity": "sha512-9OdaqO5kwqR+1kVgHAhsp5vPNU0hnxRa26rBFNfNgM7M6pNtgzeBn3s/xbyCQL3dcjzOatcef6UUHpB/6MaETg==", + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "unique-stream": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz", + "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==", + "dev": true, + "requires": { + "json-stable-stringify-without-jsonify": "^1.0.1", + "through2-filter": "^3.0.0" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + }, + "update-browserslist-db": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz", + "integrity": "sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==", + "dev": true, + "requires": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + } + }, + "url": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", + "integrity": "sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "uuid": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.0.0.tgz", + "integrity": "sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw==", + "dev": true + }, + "value-or-function": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-3.0.0.tgz", + "integrity": "sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=", + "dev": true + }, + "vinyl": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.1.tgz", + "integrity": "sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==", + "dev": true, + "requires": { + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" + } + }, + "vinyl-fs": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-3.0.3.tgz", + "integrity": "sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==", + "dev": true, + "requires": { + "fs-mkdirp-stream": "^1.0.0", + "glob-stream": "^6.1.0", + "graceful-fs": "^4.0.0", + "is-valid-glob": "^1.0.0", + "lazystream": "^1.0.0", + "lead": "^1.0.0", + "object.assign": "^4.0.4", + "pumpify": "^1.3.5", + "readable-stream": "^2.3.3", + "remove-bom-buffer": "^3.0.0", + "remove-bom-stream": "^1.2.0", + "resolve-options": "^1.1.0", + "through2": "^2.0.0", + "to-through": "^2.0.0", + "value-or-function": "^3.0.0", + "vinyl": "^2.0.0", + "vinyl-sourcemap": "^1.1.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "vinyl-sourcemap": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz", + "integrity": "sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY=", + "dev": true, + "requires": { + "append-buffer": "^1.0.2", + "convert-source-map": "^1.5.0", + "graceful-fs": "^4.1.6", + "normalize-path": "^2.1.1", + "now-and-later": "^2.0.0", + "remove-bom-buffer": "^3.0.0", + "vinyl": "^2.0.0" + } + }, + "walk": { + "version": "2.3.15", + "resolved": "https://registry.npmjs.org/walk/-/walk-2.3.15.tgz", + "integrity": "sha512-4eRTBZljBfIISK1Vnt69Gvr2w/wc3U6Vtrw7qiN5iqYJPH7LElcYh/iU4XWhdCy2dZqv1ToMyYlybDylfG/5Vg==", + "dev": true, + "requires": { + "foreachasync": "^3.0.0" + } + }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "which": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", + "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", + "requires": { + "isexe": "^3.1.1" + }, + "dependencies": { + "isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==" + } + } + }, + "which-module": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", + "dev": true + }, + "which-typed-array": { + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + } + }, + "window-size": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", + "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=", + "dev": true + }, + "workerpool": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz", + "integrity": "sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==", + "dev": true + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "wrap-ansi-cjs": { + "version": "npm:wrap-ansi@7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "xml2js": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.2.tgz", + "integrity": "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==", + "dev": true, + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + } + }, + "xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "dev": true + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + }, + "y18n": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", + "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", + "dev": true + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "yargs": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.29.0.tgz", + "integrity": "sha1-GquWYOrnnYuPZ1vK7qtu40ws9pw=", + "dev": true, + "requires": { + "camelcase": "^1.2.1", + "cliui": "^3.0.3", + "decamelize": "^1.0.0", + "os-locale": "^1.4.0", + "window-size": "^0.1.2", + "y18n": "^3.2.0" + } + }, + "yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true + }, + "yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "requires": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "dependencies": { + "camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true + }, + "decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true + } + } + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true + } + } +} diff --git a/package.json b/package.json index cd9a70f09b..41ccc32dc4 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "nodegit", "description": "Node.js libgit2 asynchronous native bindings", - "version": "0.4.1", + "version": "0.28.0-alpha.36", "homepage": "http://nodegit.org", "keywords": [ "libgit2", @@ -19,6 +19,10 @@ { "name": "Max Korp", "email": "maxkorp@8bytealchemy.com" + }, + { + "name": "Tyler Ang-Wanek", + "email": "tylerw@axosoft.com" } ], "main": "lib/nodegit.js", @@ -31,66 +35,54 @@ "lib": "./lib" }, "engines": { - "node": ">= 0.12" + "node": ">= 20" }, - "bundledDependencies": [ - "node-pre-gyp" - ], "dependencies": { - "fs-extra": "^0.18.2", - "node-pre-gyp": "^0.6.5", - "nodegit-promise": "^3.0.1", - "npm": "^2.9.0", - "promisify-node": "^0.2.1", - "which-native-nodish": "^1.1.1" + "@mapbox/node-pre-gyp": "^2.0.0", + "fs-extra": "^7.0.0", + "got": "^14.4.7", + "json5": "^2.1.0", + "lodash": "^4.17.14", + "nan": "^2.23.1", + "node-gyp": "^11.2.0", + "tar-fs": "^3.0.9" }, "devDependencies": { - "combyne": "^0.8.0", - "coveralls": "^2.11.2", - "istanbul": "^0.3.13", - "js-beautify": "^1.5.5", - "jshint": "^2.7.0", - "lcov-result-merger": "^1.0.2", - "lodash": "^3.8.0", - "mocha": "^2.2.4", - "nan": "^1.8.4", - "nw-gyp": "^0.12.4", - "pangyp": "^2.2.1", - "request": "^2.55.0", - "tar": "^2.1.0" - }, - "vendorDependencies": { - "libgit2": { - "sha": "2cb4b6534fbcbe600ecf3db95ba19e4525c8d4b8", - "version": "0.23.1" - }, - "libssh2": "1.4.3", - "http_parser": "2.5.0" + "aws-sdk": "^2.1095.0", + "clean-for-publish": "~1.0.2", + "combyne": "~0.8.1", + "js-beautify": "~1.5.10", + "jshint": "^2.10.0", + "lcov-result-merger": "^3.1.0", + "mocha": "^11.4.0", + "nyc": "^17.1.0", + "walk": "^2.3.9" }, "binary": { + "bucket_name": "axonodegit", "module_name": "nodegit", "module_path": "./build/Release/", - "host": "https://nodegit.s3.amazonaws.com/nodegit/nodegit/" + "host": "https://axonodegit.s3.amazonaws.com/nodegit/nodegit/" }, "scripts": { - "lint": "jshint lib test/tests test/utils examples lifecycleScripts", - "coveralls": "cat ./test/coverage/merged.lcov | coveralls", - "filtercov": "lcov --extract test/coverage/cpp/lcov_full.info $(pwd)/src/* $(pwd)/src/**/* $(pwd)/include/* $(pwd)/include/**/* --output-file test/coverage/cpp/lcov.info && rm test/coverage/cpp/lcov_full.info", - "cppcov": "mkdir -p test/coverage/cpp && lcov --gcov-tool $(which gcov) --capture --directory build/Release/obj.target/nodegit/src --output-file test/coverage/cpp/lcov_full.info", - "mergecov": "lcov-result-merger 'test/**/*.info' 'test/coverage/merged.lcov' && genhtml test/coverage/merged.lcov --output-directory test/coverage/report", "cov": "npm run cppcov && npm run filtercov && npm run mergecov", - "mocha": "mocha test/runner test/tests", - "mochaDebug": "mocha --debug-brk test/runner test/tests", - "test": "npm run lint && (iojs --expose-gc test || node --expose-gc test)", + "cppcov": "mkdir -p test/coverage/cpp && ./lcov-1.10/bin/lcov --gcov-tool /usr/bin/gcov-4.9 --capture --directory build/Release/obj.target/nodegit/src --output-file test/coverage/cpp/lcov_full.info", + "filtercov": "./lcov-1.10/bin/lcov --extract test/coverage/cpp/lcov_full.info $(pwd)/src/* $(pwd)/src/**/* $(pwd)/include/* $(pwd)/include/**/* --output-file test/coverage/cpp/lcov.info && rm test/coverage/cpp/lcov_full.info", "generateJson": "node generate/scripts/generateJson", - "generateNativeCode": "node generate/scripts/generateNativeCode", "generateMissingTests": "node generate/scripts/generateMissingTests", - "prepublish": "node lifecycleScripts/prepareForBuild.js", - "install": "node lifecycleScripts/install", + "generateNativeCode": "node generate/scripts/generateNativeCode", + "install": "node lifecycleScripts/preinstall && node lifecycleScripts/install", "installDebug": "BUILD_DEBUG=true npm install", - "recompile": "pangyp configure build", - "rebuild": "node generate && pangyp configure build", - "recompileDebug": "pangyp configure --debug build", - "rebuildDebug": "node generate && pangyp configure --debug build" + "lint": "jshint lib test/tests test/utils lifecycleScripts", + "mergecov": "lcov-result-merger 'test/**/*.info' 'test/coverage/merged.lcov' && ./lcov-1.10/bin/genhtml test/coverage/merged.lcov --output-directory test/coverage/report", + "mocha": "mocha --expose-gc test/runner test/tests --timeout 15000", + "mochaDebug": "mocha --expose-gc --inspect-brk test/runner test/tests --timeout 15000", + "postinstall": "node lifecycleScripts/postinstall", + "rebuild": "node generate && node-gyp configure build", + "rebuildDebug": "node generate && node-gyp configure --debug build", + "recompile": "node-gyp configure build", + "recompileDebug": "node-gyp configure --debug build", + "test": "npm run lint && node --expose-gc test", + "xcodeDebug": "node-gyp configure -- -f xcode" } } diff --git a/test/README.md b/test/README.md new file mode 100644 index 0000000000..e6bdccbc4d --- /dev/null +++ b/test/README.md @@ -0,0 +1,36 @@ +## /test + +Contains all the test scripts, runner, and keys for running the tests. + +----------- + +#### /home +Contains gitconfig for the test repositories. + +#### /repos +Contains blame, empty, nonrepo, and workdir test repositories. + +#### /tests +Unit tests for NodeGit. + +#### /utils +Test utilities with garbage collector, index, and repository setup, that can be used in tests. + + +## Keys + +Note: all files are encoded in base64 in `\*.enc` and decoded before the test suite runs. + +### encrypted_rsa + - passphrase "test-password" + - registered as deploy key on [nodegit/test](https://github.com/nodegit/test) repo named "Encrypted test key" + +### id_rsa + - registered as deploy key on [nodegit/test](https://github.com/nodegit/test) repo named "Unencrypted Test Key" + +### private.ppk + - same key as id_rsa + - ppk format is used by putty/pageant and converted/generated by puttygen + +### nodegit-test-rsa + - registered as deploy key on [nodegit/private](https://github.com/nodegit/private) repo named "Tests" diff --git a/test/encrypted_rsa b/test/encrypted_rsa new file mode 100644 index 0000000000..2ecf534faf --- /dev/null +++ b/test/encrypted_rsa @@ -0,0 +1,54 @@ +-----BEGIN RSA PRIVATE KEY----- +Proc-Type: 4,ENCRYPTED +DEK-Info: AES-128-CBC,76C5AF2E37D863AA3712FFD502FE63FF + +dp3B4Mz7//+AxUpMEBiJUmOGherBSM5LGov4Je7Od+LoORPCGu17+l44VovPnwgg +JrK5IcV/MiDOJ/iYXtyeMWtUWU8v66M3bmQn83VzcUv0SnuXi673tNtZe14u2UhM +adW78AqC15lM2za1iMLM7Y5MTcg8rAtXZIuOllxIRCt+sbsLWObMo9YHPjiRPPa/ +cDfIW+PXTTiIE0qw+7cACVRXXZsH04HqvrK8qH34MZcGqLjA3sj1fZt0wd2IgwGa +CK0lm8edMcLlZeM9vippKUEgNvjgN+8xCcPf9AoCEQepd4JVAIJYeeV+qxkUsp4s +SV2dUF8RWXdTG9QT7PCZq0o0KMcD0u7yhAquI21+ggti3lx1Ix9I5wMNCBqNEYVE +Q/hNt8PJwjaiD3x+rFHjjiVmA0onAIgdMXPLLkg43H3kBYanFc8mP+hLtegNlY5V +zfb3RilnMua0DHf0sqybvPNrvrUNchQPL0Py00PP4yf3nuKcIYgqgj+1wMVK1prS +4nMCyFNAlSt7KxSJOGU050BeBYcYlQRPXicoesNqfFmJ2hNv4jc1EM9khxSlcsU6 +zS3ZFv4kPJoKnn6CBOjsFwZ8EY7wwJvZHwDFZnrBXU8LcLG8+KCjvjHb0qXGFfG7 +g3VElz5IFhN6MrpGGrn/81LFGepg4FCa+55xCje1ykJrPdMwTnA4ezOfvcVXIuFm +iVk/2GiUUDOmn2FeSyNYSgQ/UFgxc5jUXMRcSDRKOM3y/Upl8+hzne91IHVVH1el +ChMR5HowQaRKmTgml6nG43D4jTcwcJdhcuDbXlbvBgVg0rTs4ZDVjP6RtCTmZete +nlHIYeRxutvGBYD4xjuSEldsSoQvVaDkLoKNZCHLzNFEutG4P4Ee8frGFD11j3gu +R+p7KlLLa+MyfW3Z3yxMc84iTw8ULzIQFRQX3Wk1NBW9giRpxEDZpXK3KYZErFZ6 +dK2zFAYpryYQxFx5+Qnl9okTAxi7NHhAVksKAQQBEgikbS8vJSJvDBhidpOJ1Kr0 +L896bjOFdzl8Xz0VturUmduSghiCrMPzCC5iVonJfqNLaXExYDWlcr+GpZzbuxbw +tP0KjvL4lM9MwgxCAXLh6SAwn79I3VWFTDMsFBLoCVpReyu7RU546DhuspZmY7+l +kuWhjE4P+zYGy9Rd8xnXREsDD43m2laX1JDjRHDAw5maUBWJXCXUDmSSL1Tyha9y +r6H99HjfMYc2RgPr+4yjYeVU1d1PgS94q9u8XiFDsDC3+WrxpQQdpraN6gRhdb2j +aoZ7BpqMxccaMwskRayoTCXOzd0p2Xf848soQtnRTE7/TowUHE0QGFn5v+zgUeFI +aGj61MB9q+M297/XTeqDowr4QDYGWA8HWGGkaAUhmntyoQRjIdN50dztDy0IeQrY +rL7scCBGeyxlFJiazhs5h9ppCchhhuxR2hViRGzXIdaII2MwKHh1UDw7+Jm14K46 +fSrFmhZJn2cGFL+fRQEwV1tBUG083DJJFtfP0XxDtcEkSZxMfE7GFDTL7izRGdCg +Mj3zOsUbhZxc8YSAqPIT/tYNuaESk/m+s14EF4ni8WU19T4tKNy0LFh5eFHfk9OO +Sz1CIaOWVRSnDcYiOGacpBV8LLrjaqq+awi9EATj9t/47OzOKbO3IVzVgjZKQBsl +mgo+vjZ3W0LH59XNVgE15x6NqG+gdlPRbX+1iJF44c8RWIm5RLtZ8RfQw63P1PgI +R9VRlfqhtna17nOYP/w03WfGDRUGR6MgSdwyy6pKo93hsvJRCpBzmAiXtcVxiVZ7 +ggGk6khhtWrEKZe8DYT1lWamJyng+dUhHGPxYPdoeBy9fZ2fQzoT+OVPCFCuUy2h +wBwRJjOCr7e7fwuyS+cAM/1uRfLDMq7xs7N1JGSVePAvGvICrEDHoMMe5oSMKpoi +EEjPxS+glKdLflbXatJ4V5+Zm/dVvSkb9b+k5RNV4rFZst1Yahl/7expic0rVF6h +nOieyRPzFeE9cGDtDkoFOicixJfLOI6Ex/6nfGsIJa2hcXFm+ibO54vWCgtgMaXm +AANrwxvvEWROvmkL8l/tbmWgj8Nd/Vt8L+2r/7tcZ6vWWqseTUNOYL9o2gV6lHEn +OkGY/WrPUfAIXml5dWTDWGGi8YuE2KhYXBn6msN8lcO7hGOIWetfnCGB7xsafjBl +4xaT18L4b+mNSX3lmCqfcXMY0tJZUZBgFw9gAdIl3xcKqyUSMHJHyMpm7dj0cP0P +Egs4Y4qDN5uvVI2zHobYfhez2uk+T43yXu/tYFVFL9I37/fshzPJoVb7oevNDNKH +siPljm/dhGB8jxbXoARJFoHgUeA+CLj9bD9JSh5Siu93KTjYTJZLK/XC0nVe/R4q +Sd7EaM2B92IU5LPGnO7BvcXHygjhwCqVyyGFiS5m6VirG6TsZEawPTVtWFme+T71 +FQevwtgNkmblN7ETvqrsXkaU992zGa7dPs8Dsvpmm9TS7wHNObFRPQshJ7i7lKG4 +vypXduG0vPjGwFqoz4UxGYFYpytfXT83+Iww4VGfKA0NbIkG3huh/Tl5mya39FUi +b2tMk2pE9Zjj0uLTlTR7YSPKDD/C67kPww9ppCW3CTJPn7Fp5cIMjGp6KtCEnfz4 +dMRMPOH7VIi57XsSWm2frcxmMkNIE+80JD9hW7zjANkrsHZ/l9QwTOCzlMNWKu82 +RrXIj4peZocXBYxlqNyX7LaaK1lVgbjwX51eyaNKMiOcV483XEWAj6omkJi2jRte +eOMLQ0ZmIMklIG8dA4YTilmvFczN5TUEfGmKknQ3tVkjGyYVThjbKoEeSJODKDIN +md46fUM1sIYR/CtDQl3KK0KSUdYGvsSNOF4g/6D96d6GQk85nQvlUkxCjjUxNaur +TgF0+DM3O+UjSs2RGldrqtb4DP2AtqH1WulKdX94Y/LUb6icGI6jC6QwgdAjZpAC +s+os4irP6fLOho4IpNtqFqWzairzFhnyDWussh9A50mxPt1EFl1ygbjgD6KKdtx3 +ZaI+ZjKtqY/2d4qmhnKT68is5cv/vXy+Eow3uT5SvXeCOtS8ceWBpYKfO/pc3Bh2 +wNf1gVqdttD3npCqaXCKo9QdXYqt+hqeLK55p7D7CMG5c05tOCr06l3VUG7Wq5RK +-----END RSA PRIVATE KEY----- diff --git a/test/encrypted_rsa.pub b/test/encrypted_rsa.pub new file mode 100644 index 0000000000..3ab84a7d05 --- /dev/null +++ b/test/encrypted_rsa.pub @@ -0,0 +1 @@ +ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQC6x3pGhFSz+CT5bjeIWNvYNh4BBNFiGn+YzT09we58vwnyHWb940e6SJalrTqLH+6QWAXMcZpSZFBwnYia9Ja/XE2UWwxQU5rryGdc5Tju/u1kB0HuMjGpQDmFSpVrJcfRS5wXJCtoka5O0qvPUUNVAK9k/6HVX+2CGbafNjOMXnNtWgKKWlDd5eQAk3Ok3LvSrTv0kp9S3C4KdO8cz9NvtlWXHTFit94kOIzaL/v10f2u6V93VvV5jckJwZhjfyH1Q2WS/+j0ck7WqyGEBltPz6dubJipqrlAHRUacmWtI0ODdsoNwUrKCidiEkwheWA2SmbIdkTInt5vrcYvbOdNrn9aJ1aII15PSLE7eCqNdasEkp2G75hQ5DWYnprxVGY2FzqCCg2DwYev1qe4MzJ+m9PrUL+FKCrkhiCgpaOT+Noz5gX1gRvYtvg+BeRA2uoIi7rK1A3CapKRJmVM7kukgCZ5ZSMgXgXPtX4ttUgu43jVjEdcjrkoZqBSH8l72cmEcIyjahuJZqg859CyQbX5qAGDwxdz7Qjj0gwGU//bNd3/vZMzWEfkN49iDpYjipLZzg4MR946kFTT90X9S5ryjSXkyFZJWSyks8K8BOztL/o8avAu4RUn/4+ipISSz+5FoOi/pkH+KkvIoSzlcuGxAigDyUlev8wxn/FQj2tmGQ== your_email@example.com diff --git a/test/id_rsa b/test/id_rsa deleted file mode 100644 index 91ae66320a..0000000000 --- a/test/id_rsa +++ /dev/null @@ -1,27 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -MIIEpAIBAAKCAQEA5E3IF5x7qkdIG8HoJ6/Wcc+IU5I41f0qYCTTyc+5qPxyjW8d -K6o49T9MhkdOd0fRkhRYptrreDSvQzz1JEHcrnMPg6C5GERyZpSeATWvTUwg9LJf -nklztvevZGaIwmEjoG5pAicfJnYE8Ic3YBP44Qa7GNITxOqUU5VPh+vP83jXSVAC -CX9Cy1zpt4aUyiwNfVSApbZf4/VbwSaYER3QcpVxMi/B6JGKY5EEJNWV495uzZaP -Mg3YOFXJYziVgvl4fJMUTHyucf1UVbGCgkFzeUJcynqn+1EkQ1Ev+5haD1AVvneJ -MCrRsUbFriC9snqs4n2VEzoLIffmVgFsVn30GQIDAQABAoIBAQDPQm2sQbti0mN8 -D4Uawl8D40v30n8WhUa7EbPTOmlqKAQ2sfDhex9KRbTLEmEBmImA/Eee8o9iCTIy -8Fv8Fm6pUHt9G6Pti/XvemwW3Q3QNpSUkHqN0FDkgecQVqVBEb6uHo3mDm4RFINX -eOmkp30BjIK9/blEw1D0sFALLOEUPaDdPMwiXtFgqfrFSgpDET3TvQIwZ2LxxTm0 -cNmP3sCSlZHJNkZI4hBEWaaXR+V5/+C1qblDCo5blAWTcX3UzqrwUUJgFi6VnBuh -7S9Q6+CEIU+4JRyWQNmY8YgZFaAp6IOr/kyfPxTP1+UEVVgcLn3WDYwfG9og0tmz -fzlruAgBAoGBAPfz73Pey86tNZEanhJhbX8gVjzy2hvyhT0paHg0q/H6c1VWOtUH -OwZ3Ns2xAZqJhlDqCHnQYSCZDly042U/theP4N8zo1APb4Yg4qdmXF9QE1+2M03r -kS6138gU/CSCLf8pCYa6pA/GmsaXxloeJGLvT4fzOZRsVav80/92XHRhAoGBAOu2 -mKh4Gr1EjgN9QNbk9cQTSFDtlBEqO/0pTepvL73UvNp/BAn4iYZFU4WnklFVBSWc -L84Sc732xU12TAbTTUsa6E7W29pS8u7zVTxlIdQIIU5pzDyU1pNNk2kpxzte5p3Y -PDtniPFsoYLWoH0LpsKL93t2pLAj+IOkE6f3XBq5AoGAIKaYo5N1FxQr952frx/x -QUpK0N/R5Ng8v18SiLG26rhmM5iVSrQXC7TrHI7wfR8a9tC6qP/NqnM9NuwC/bQ0 -EEo7/GhaWxKNRwZRkmWiSFLNGk9t1hbtGU+N1lUdFtmloPIQdRNiw0kN3JTj474Q -YI7O1EItFORnK6yxZfR6HEECgYEA1CT7MGUoa8APsMRCXyaiq15Pb8bjxK8mXquW -HLEFXuzhLCW1FORDoj0y9s/iuKC0iS0ROX8R/J7k5NrbgikbH8WP36UxKkYNr1IC -HOFImPTYRSKjVsL+fIUNb1DSp3S6SsYbL7v3XJJQqtlQiDq8U8x1aQFXJ9C4EoLR -zhKrKsECgYBtU/TSF/TATZY5XtrN9O+HX1Fbz70Ci8XgvioheVI2fezOcXPRzDcC -OYPaCMNKA5E8gHdg4s0TN7uDvKTJ+KhSg2V7gZ39A28dHrJaRX7Nz4k6t2uEBjX9 -a1JidpAIbJ+3w7+hj6L299tVZvS+Y/6Dz/uuEQGXfJg/l/5CCvQPsA== ------END RSA PRIVATE KEY----- diff --git a/test/id_rsa.enc b/test/id_rsa.enc new file mode 100644 index 0000000000..8c992bebde --- /dev/null +++ b/test/id_rsa.enc @@ -0,0 +1 @@ +LS0tLS1CRUdJTiBPUEVOU1NIIFBSSVZBVEUgS0VZLS0tLS0KYjNCbGJuTnphQzFyWlhrdGRqRUFBQUFBQkc1dmJtVUFBQUFFYm05dVpRQUFBQUFBQUFBQkFBQUNGd0FBQUFkemMyZ3RjbgpOaEFBQUFBd0VBQVFBQUFnRUFzRG5CRGV2dVZTNzFLVHg0OEdiRzlMeHp3UUJ1OVVYc25Qd3ROdGh3bHdpRmpYL1M5U0lKCnhwNENIdVBjS3JYdjJLcTI1NnRMby9jcENkZk9waFhjSWNpZ09RNzc1MGQwSDAvZkpyMHpzWjh3akFiZ1ZPOXpPanlRbXUKbE15WWNzWmpkMURESjQ2djBwNGU4YTZsbldwbHduVFNzVVB3OVVXRkt0MDRDcDZSNVpXaHdlTDg5cmI2Qk13SEJySURNWQpWY2VZSVlGZFRsZWU5MStGQWhLZVVFVE9LNzF6aWRPQXY0Ti9jdnRUQWNtYmlhTTgvUEtXVDEvRDFCeDJ6YzJsY0d3Y2RWCkJiaUxWQmNZKzJReGZzWjVlMGk5SGhKdjdCcWw4SXgxTTYzaVlkQU0yQUFseEZkTU1ONEMwUW1YeDlkSkxTdFdFcXRXZ2gKSHNGY05MSnpDTUs5MGRnSEh3OHZnOTFtdGNMVjVUS01nb3RXaEI2YjRMdkZEUUlac2V5RnY0cVJnM2NOb1hlUFY3bmg3OQp1YVlhL0NremJrNEdZQytsbXhENndFZDhHOGM4d0s4cjJ3NW04ZTAwWmdrQUVhbnovZGZRZ1dzdHBkajRmK05RdUVXRnN6CnNpeGlrTUtOVnJhWnpoRmFUaE9DbTNUUHNmY05LZ2NBN3VXVGJZNllNMlQ1SmowU3ZHRW5Ka1EzUitIK1RIamxqc0wrMnUKWVRCM2NlZ2dXc1dzSmlyazFTdjNlMURxUlhUeGNTcDlyRWlMaHVxV0NLL0t4QzZyWGpBMGJWSkgxMENnRjJNZWtVRTJtNApmeVZjUE5ML0VYWVN1V2t6elZzTDFjdzJSc3psS3RIQVJMNzRISlp6Z3RZMjZ2SlFLOTlub09QMk10aEc0dWI5aWRyajN1CmtBQUFkQVVoVnBRRklWYVVBQUFBQUhjM05vTFhKellRQUFBZ0VBc0RuQkRldnVWUzcxS1R4NDhHYkc5THh6d1FCdTlVWHMKblB3dE50aHdsd2lGalgvUzlTSUp4cDRDSHVQY0tyWHYyS3EyNTZ0TG8vY3BDZGZPcGhYY0ljaWdPUTc3NTBkMEgwL2ZKcgowenNaOHdqQWJnVk85ek9qeVFtdWxNeVljc1pqZDFEREo0NnYwcDRlOGE2bG5XcGx3blRTc1VQdzlVV0ZLdDA0Q3A2UjVaCldod2VMODlyYjZCTXdIQnJJRE1ZVmNlWUlZRmRUbGVlOTErRkFoS2VVRVRPSzcxemlkT0F2NE4vY3Z0VEFjbWJpYU04L1AKS1dUMS9EMUJ4MnpjMmxjR3djZFZCYmlMVkJjWSsyUXhmc1o1ZTBpOUhoSnY3QnFsOEl4MU02M2lZZEFNMkFBbHhGZE1NTgo0QzBRbVh4OWRKTFN0V0VxdFdnaEhzRmNOTEp6Q01LOTBkZ0hIdzh2ZzkxbXRjTFY1VEtNZ290V2hCNmI0THZGRFFJWnNlCnlGdjRxUmczY05vWGVQVjduaDc5dWFZYS9Da3piazRHWUMrbG14RDZ3RWQ4RzhjOHdLOHIydzVtOGUwMFpna0FFYW56L2QKZlFnV3N0cGRqNGYrTlF1RVdGc3pzaXhpa01LTlZyYVp6aEZhVGhPQ20zVFBzZmNOS2djQTd1V1RiWTZZTTJUNUpqMFN2RwpFbkprUTNSK0grVEhqbGpzTCsydVlUQjNjZWdnV3NXc0ppcmsxU3YzZTFEcVJYVHhjU3A5ckVpTGh1cVdDSy9LeEM2clhqCkEwYlZKSDEwQ2dGMk1la1VFMm00ZnlWY1BOTC9FWFlTdVdrenpWc0wxY3cyUnN6bEt0SEFSTDc0SEpaemd0WTI2dkpRSzkKOW5vT1AyTXRoRzR1YjlpZHJqM3VrQUFBQURBUUFCQUFBQ0FGL2pUUlNTSitEWjZEUkQzMXFQMGZvaEFLc24zVGhBai9ycgpqSDZuVHJ3ZnV1dS9mYjQ4Z3kwN2xOUFNFRjU5R01EQVF6M1RpeGp3eDdlL1lZWWxwdDRMR0lOemo4WE1yM2JLTXhZVkpTCmVsQXZsdVZHcGkwRVFENkhzaUx0SUpaek5IUWIwZFNZWXpzckpwTkRBSUtpL2pQTTlVZlhQQ2w1Wm5ob1hySUlqa0pxSk4KWW0rSllXQWZ6U041Q0JGQlBDQ1F0a3FrNVd4WGFQd1pVWHBMUHpGVi93ajEwUVJSdldCMzRNVmowMHJKdElReitsOTRjQwpsSVpubm44dzBRdE5CelF4amlYS3dLVkUzQ2NONFpDbDFqd3EzQnljMDZHWTdtbnhRMlNYWFBMMERja0thNEptTGVMNUtuCmNyelJiRUllRWVEM3VoRnpVM0kwckVOUVJoNjY5SXByYWpmUnpMY0Z4bkM3M0JTMVJUeWNmcGRTR0ZPUFhULzJOZDM2MlgKU2VwNlZOeFN0NWE2d2tXZ0hKaDJIOGRQY25pREgxRG1yQWRQOTdBa2VpMWxtWHFiekNJVjlwaWQzbWZNQUpiSm00UmhRcApURHZldUU4TmlCZ0k2MlRrd3Vjb1cyeTNMZFN2MTM3aUpCbkpTYzExRzlBNWJHMnlRWEUyYWlYUXhIeW9UMlF0VmY1WklYClJhVkx1YlFuY1NnTEJqZ0NkMUNsakI1amxSWU10U2M4YkZhL1RKNW9YT1ZNdENYNHhhcVo3Z3JHS05CcUJsRFRXblRnWk0KbXZ3UFZ1Y2xlNzI4MzZPSlBYbzFMajNLM2ttcnhDMXVORzA3NjMvemJLOWl2QWF1SFRMMnQ0cHkra0k0NC9ZcERvR2sybgp4bFdNZEQzTDNKVXgzUXo5THhBQUFCQVFDVzh6YVI5T2VPMXAzWGkxNFg5MDNuOWNjY1JVcGRMOEZSUDZ5MWkrVFpmN2RSClpla3ltWDZGbU9qbTAvbm9XM0hwZVoyYmJEaUFQRFp1VzRmUW1nWjBnemxvZERDZUp2UHF2U1FzUWVISjRjMkdzVG4xVHMKMzNYU1RWeFVLd3dqbEZ2TGpvMkJBdmlBaGZ3YUN3UmxUaGlrRy9CdC8wbVhObTF6cHFZbnFBc1pXb3JqOVVWQTYyT1c4MQpDVVgxL2RVMWtjUkFpY2NsUWxqTlNEWGJ6aWJVN2pvdXpzQzNFVUVEcG1HZG1UUVh4WHNCNTFVTmh5eVZoMmdBVnFDMDAyCm1Kd2dFVXNqcHFzYUw2TTczYXo4Mzg4b0RwWGJwMUNLTER5aDh2SnBJTkgwak5OZEQxd1dvQVJRZUhzL05iUUZLUThJTkkKdlBzWnowWkdmRzcvdVMrSkFBQUJBUURiVG94anFOUHJGT1piWDkzeDZONTVJV05DVUt1cUwxVks2MURIYUtYZmlpd0hEeQpRYjEzUnhPREk2RlNXMElIeVpqMDh5ZjBTVElGOXNZTUFwNy9GS1FORElqVVZyMVI2Z0RFZ0F3K2N5L2dpeWowVWxxSE1zCmdUUnNnSmEvSjJQYnViRDRWMzdZUkQ4enB2a0tmOFNKMGJRalEwaUx0YUNVYm9BUDVmYWFYbElLdmUyeHpLdVgzT0l2TTMKTyt1UTBJMDZqZGtMc2JBRzEvZ0E5emJmaW1wTHdJQkJkVUl6djdoRTJqOGJoak9HbTVTSU5rczRZZVROVFZXZHhmcjdiLwowVlFPSXJDd0RQKytCaGM5N2QrWDdZVVVkUUgzUHBTV3JWb0pOc0hNcHVUWmhpd0NnRk1NT1RYSEdWbGpFOHJnZGVTbFBzCmdCMXNRaHhyUlNNQitmQUFBQkFRRE50ZTQrMW5sWUtWNkVRWXhyeUpVQUtPdE1LSmZBNVhSVHNzWGhzRXlSMDBxL1djd3QKcmZmMzV3N2ZBWEJWd2VOemVlaXlwZXZKc1lnUnBBdTlPTVl0d1hFQlY1Rit5SUJRa2lHMTdiU2V6L3NibnlvaVdVNkJBWApHYmRDamZhNGVVRVRGemJjbGp0S2xnQUJSR2pXRDdQRk82V2ZwQWpRcGNqYVFwSVQ2WHpYZnVmV2d0bG5Ga1d5UGRXekpMCjQyV1lDemNhU3JKU0ZLZnpORHZtUjNzbllOZHB1bE1aUEtlRnZtZTJUWmp1VFJSRTd1OEtaRnhQalBkK0E4R2FuQnJOUGkKalBjSXE1SmFDWnpMMzVkaGlYcGJCQzJTMlh5cktwbWMrWEpRODJxZU93ZDZlOW9KVjEzUDdKU3NZYUVqdlFUeU5yNkE2bgo0ODIvcW1SZHUxUjNBQUFBQm01dmJtRnRaUUVDQXdRPQotLS0tLUVORCBPUEVOU1NIIFBSSVZBVEUgS0VZLS0tLS0K \ No newline at end of file diff --git a/test/id_rsa.pub b/test/id_rsa.pub index bd84623f11..77f36c6534 100644 --- a/test/id_rsa.pub +++ b/test/id_rsa.pub @@ -1 +1 @@ -ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDkTcgXnHuqR0gbwegnr9Zxz4hTkjjV/SpgJNPJz7mo/HKNbx0rqjj1P0yGR053R9GSFFim2ut4NK9DPPUkQdyucw+DoLkYRHJmlJ4BNa9NTCD0sl+eSXO2969kZojCYSOgbmkCJx8mdgTwhzdgE/jhBrsY0hPE6pRTlU+H68/zeNdJUAIJf0LLXOm3hpTKLA19VICltl/j9VvBJpgRHdBylXEyL8HokYpjkQQk1ZXj3m7Nlo8yDdg4VcljOJWC+Xh8kxRMfK5x/VRVsYKCQXN5QlzKeqf7USRDUS/7mFoPUBW+d4kwKtGxRsWuIL2yeqzifZUTOgsh9+ZWAWxWffQZ your_email@example.com +ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCwOcEN6+5VLvUpPHjwZsb0vHPBAG71Reyc/C022HCXCIWNf9L1IgnGngIe49wqte/Yqrbnq0uj9ykJ186mFdwhyKA5DvvnR3QfT98mvTOxnzCMBuBU73M6PJCa6UzJhyxmN3UMMnjq/Snh7xrqWdamXCdNKxQ/D1RYUq3TgKnpHllaHB4vz2tvoEzAcGsgMxhVx5ghgV1OV573X4UCEp5QRM4rvXOJ04C/g39y+1MByZuJozz88pZPX8PUHHbNzaVwbBx1UFuItUFxj7ZDF+xnl7SL0eEm/sGqXwjHUzreJh0AzYACXEV0ww3gLRCZfH10ktK1YSq1aCEewVw0snMIwr3R2AcfDy+D3Wa1wtXlMoyCi1aEHpvgu8UNAhmx7IW/ipGDdw2hd49XueHv25phr8KTNuTgZgL6WbEPrAR3wbxzzAryvbDmbx7TRmCQARqfP919CBay2l2Ph/41C4RYWzOyLGKQwo1WtpnOEVpOE4KbdM+x9w0qBwDu5ZNtjpgzZPkmPRK8YScmRDdH4f5MeOWOwv7a5hMHdx6CBaxawmKuTVK/d7UOpFdPFxKn2sSIuG6pYIr8rELqteMDRtUkfXQKAXYx6RQTabh/JVw80v8RdhK5aTPNWwvVzDZGzOUq0cBEvvgclnOC1jbq8lAr32eg4/Yy2Ebi5v2J2uPe6Q== noname diff --git a/test/index.js b/test/index.js index bde4d989c8..abd2fc2174 100644 --- a/test/index.js +++ b/test/index.js @@ -1,8 +1,14 @@ var fork = require("child_process").fork; var path = require("path"); +var fs = require('fs'); -var bin = "./node_modules/.bin/istanbul"; -var cov = "cover --report=lcov --dir=test/coverage/js _mocha --".split(" "); +var bin = "./node_modules/.bin/nyc"; +var cov = [ + "--reporter=lcov", + "--reporter=text-summary", + "--report-dir=test/coverage/js", + "mocha" +] if (process.platform === 'win32') { bin = "./node_modules/mocha/bin/mocha"; @@ -12,7 +18,31 @@ if (process.platform === 'win32') { var args = cov.concat([ "test/runner", "test/tests", - "--expose-gc" + "--expose-gc", + "--timeout", + "15000" ]); +if (!process.env.APPVEYOR && !process.env.TRAVIS && !process.env.GITHUB_ACTION) { + var local = path.join.bind(path, __dirname); + var dummyPath = local("home"); + process.env.HOME = dummyPath; + process.env.USERPROFILE = dummyPath; +} + +// unencrypt test keys +function unencryptKey(fileName) { + var base64Contents = fs.readFileSync( + path.join(__dirname, fileName + '.enc'), + 'utf8' + ); + var asciiContents = Buffer.from(base64Contents, 'base64') + .toString('ascii'); + fs.writeFileSync(path.join(__dirname, fileName), asciiContents, 'utf8'); +} + +unencryptKey('private.ppk'); +unencryptKey('id_rsa'); +unencryptKey('nodegit-test-rsa'); + fork(bin, args, { cwd: path.join(__dirname, "../") }).on("close", process.exit); diff --git a/test/nodegit-test-rsa b/test/nodegit-test-rsa deleted file mode 100644 index f5500849f1..0000000000 --- a/test/nodegit-test-rsa +++ /dev/null @@ -1,15 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -MIICXQIBAAKBgQC5VMnDStyy3BDQ4Ilb/XnD5htRn0f3Is8NITe9o/KwZcPy2MFM -RssnQjyp/WoQXl/o3Id+UaTZ+TKzYYmP/bGnYlyZP+FBBTKrCcDDW0fVjLbDazEX -usAYCW58iGG9EomrwpSVrZlrLsZc1CPUdeeC8jmTuBQR7fyDFxM4sdoIyQIDAQAB -AoGBAA7ZZ00Ze3NtRH+n7fmL5qy2jCvPClIX3OUdazzrnO9bSAb2LQ6ygWaE3R11 -q4DiPucGfGi3m/DHEbPjtcTuu8Qdqr7Nb0FU2CS2og0zMO+Z+CcyzIkXN0o7spig -ekEY1Uml5MKGcJxu6afsOn+9LIi05SsYPCdtB5z716IewNgxAkEA2pKXov7jobMb -2vBA4BtEtcryflWFO21uwMDHlJ34mjrUAMCX89NPrY//v8g0eYGLm9ZAj/Ik632+ -uOKHCXaG7QJBANkRBBcnKojqybJoxbL9PLJ3VoJ+EfLllGsbMHzc5VMwQF8ViwBD -dOQ5feVKg601814Y1NGul/nprk896GNbUc0CQQCHD8iV1u1wcQ4IZyeflBoMQAFC -YbQ3ebLTdwyc4FTLcQiqAlijOXNl67J8nskWQB+1x1oT2OxJfGVLN+d7yHstAkBz -GKCwniXhn4z/OqrJc5mBj+GhI7PktXLzL+GP85jteUJIqKWhqCMM+KcWs2IKr/ax -SD1gSVFwREYW4l6cgElpAkBtngXppGinh3nywIIo/SFmUJV/cUlWBi6MMgfsP8b6 -37+bqJI+m56WBdAG2xNz0uk6DIMp6R7JafOpfgOIPPk9 ------END RSA PRIVATE KEY----- diff --git a/test/nodegit-test-rsa.enc b/test/nodegit-test-rsa.enc new file mode 100644 index 0000000000..c90ea0781b --- /dev/null +++ b/test/nodegit-test-rsa.enc @@ -0,0 +1 @@ +LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFcEFJQkFBS0NBUUVBekNxSzI3cEV1cU1GQm45b3FIU2pzbkkrOFdxNW9IQUNHRU1tSmMyRHd6VDNNbXZ2ClR1ejZBUTU3L3lLK3lEZnY0VFlseWlVdHZBeUFxSy83TklNRmRTWldVOGIvNkNZQUhMcDZPM0p4WUZLUEQxa2MKdDBwNlVpNHdsY0lNRFZ5a252L3hlY0lYeXNqRVZaUEpUbGdoNDRqWXltOEFXdzg0YzQzQzNqelNJYkhHWlBDcgpxdi91ekgveVdZcFlrb3hBMXcyKy9LTDRBdlBpOUtRdkl6L2FpeUhqdzdEM1k2ZnRadW5GaGNyZ0hHZUhyUjBSCnJXT2ZybXZHYSthZStMRHI4Rk9TSno5U1RmY2dwZXNrYzFjNGorWkFFOHdxdzhhYmd6SVhXckducS9UUE5ScHcKU0hoMHg2T3g2aDJ3VStGTjdkTWZwOGNxekw2dXpiZUY5SXkrVlFJREFRQUJBb0lCQUhmME10dUFhQ3NqNXFyMwpwcHo2MHNiZ1d0enFzSjl6ejdkRGxLRTNTMGdnMFhBZGZGL3AyY1ZQSmtrenQ5WFpENlpKY3hCK29ZMVA1ek8xCkdhbXpwVHc4UnhJMzVGa1lJbzYrZlZ4NkUrVGMvTkt1cjdGOUg3c3pDamFpNlFQY3Y1ZnZsb2ZNSXNCeER2R2MKdi9TNDBVaG5PY0JPVVc0dTFpTUdVa3pTZlQ5dnJtbEFPNnVtaHExSVdFUTZnOUVCUXovNm9RUFNWUCszVGIwbgppemZWK1pIQkpQMS9jVEdsdmFzb2tFOTgvS3VpQmoyeHB3bVJHcy95YndyMVZMbTRWVkVKQTlLREI5aldueXgvCkpVMnpLQ3UreVMxSHBLcXVWdEh5NUw4ditDRzJQUkNtUnpGcEVQbVRpaGpaKy9HbG1xM3Bjc1FhK2FVZFduUW8KcTkyVXFtRUNnWUVBLzVGTEdORGd2blRyZ2dvMnltcXNSbGtaNTV0NjJIVXl2K3NPaUJ5eDc4VXFNSitjZENoRApJUTcvQmE4NE9QU2Jyb0E3WDJ2ZldEK01OcXRUdWFsUUl1eFJ0Ukh6c2hYNFZZODNWdzJRRmJ6RFp2dk5RV25UCjVybWlIK1FXS0N3THFEY3NQTm81eHdxemlXZ3JWdk1ZRFloaTR6enNlQW9yNFB6dTZRREVkUWtDZ1lFQXpJTDcKcUtXRWg1Q2NSRmlrY25mUEpJL2dySHkwckdpRHBneXE1N25sWWNOWm1BTEdaUnRyN2hDeVpNZTMyYVdISVdMcgoxa2hadE16bEFiZlBBYjdNdDIyT2RCWTJ3UDF3WG8wa25YMVdTUlN2RUt5MTFwN1RqRTJFVFBMekJmUkJ2ckR5CkF2T3l2UjVOUWxrQk4yMDhNRHlyUnRhcStpTTZxdmVweFVZUGZlMENnWUVBcUFHUTE3aUE5bE9RZXNWU0xaRWcKdllKWG1EMUs3YjlsNUdxVysvMjVMOEZ5c2RKTG5NVFhGSVZ5T3Y5c08yejZaeVhmWWlSZEIvdUdwbTNNdFpITApuNW14UVJLVEhMQjZ0MnhWMmdHTmhleTRuQnZPWEVGQXp6MmJpZEY4aTE0aEw2MU5oSmVGUWdjVDdiR3dSQkc4Cjd6Q0lxWS9rZUNsZm5TRkp3WjBDaVZrQ2dZQnJOMGdrRkJJMDJCVjBwMXdmUHJ4MEdKSGJHODNFalU1bllVREEKRjI4d0g2LzZ4NG1uUEFjTFdlbU1lRC9rZEtreFVhRCtTQlB2ZTNPYndQZGZuTjNLVkQ5WWtNVEh6Slo2bTFoVQowSDdKOVhRS00rRm8wUDlyRU1DSmJ0MEZoQlpybUd4b0s4Yks2dlhxRUt0WW1ZWHlhL3dIT1VlTnQ2WnNOMGJqCnkyVVh5UUtCZ1FEQTBjTm5aT0FuUllTaE93bjlsR3YxcFJ6SGRZdTduMlVteXpaM2RuRUhsTXRSRlFaQjIvdmYKVFpwWGVNSTJyWGRGUVphb1pydWxmZE1Fa3BDVmlTSGlRWnFKNlkrYXZ3NjQ1dzV3a09RU1F3ZjNzOEYrL0t5agoyNDMyY25pN3grUGVlOXp6R3VmQ3RJNkZSK2hTdDZSdnNsRzdRWFgreHM3dGxCNmU0SEhmUUE9PQotLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQo= \ No newline at end of file diff --git a/test/nodegit-test-rsa.pub b/test/nodegit-test-rsa.pub index 8092c16421..7321a79e5c 100644 --- a/test/nodegit-test-rsa.pub +++ b/test/nodegit-test-rsa.pub @@ -1 +1 @@ -ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQC5VMnDStyy3BDQ4Ilb/XnD5htRn0f3Is8NITe9o/KwZcPy2MFMRssnQjyp/WoQXl/o3Id+UaTZ+TKzYYmP/bGnYlyZP+FBBTKrCcDDW0fVjLbDazEXusAYCW58iGG9EomrwpSVrZlrLsZc1CPUdeeC8jmTuBQR7fyDFxM4sdoIyQ== +ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDMKorbukS6owUGf2iodKOycj7xarmgcAIYQyYlzYPDNPcya+9O7PoBDnv/Ir7IN+/hNiXKJS28DICor/s0gwV1JlZTxv/oJgAcuno7cnFgUo8PWRy3SnpSLjCVwgwNXKSe//F5whfKyMRVk8lOWCHjiNjKbwBbDzhzjcLePNIhscZk8Kuq/+7Mf/JZiliSjEDXDb78ovgC8+L0pC8jP9qLIePDsPdjp+1m6cWFyuAcZ4etHRGtY5+ua8Zr5p74sOvwU5InP1JN9yCl6yRzVziP5kATzCrDxpuDMhdasaer9M81GnBIeHTHo7HqHbBT4U3t0x+nxyrMvq7Nt4X0jL5V diff --git a/test/private.ppk.enc b/test/private.ppk.enc new file mode 100644 index 0000000000..c388d98d86 --- /dev/null +++ b/test/private.ppk.enc @@ -0,0 +1,47 @@ +UHVUVFktVXNlci1LZXktRmlsZS0zOiBzc2gtcnNhCkVuY3J5cHRpb246IG5vbmUKQ29tbWVudDog +bm9uYW1lClB1YmxpYy1MaW5lczogMTIKQUFBQUIzTnphQzF5YzJFQUFBQURBUUFCQUFBQ0FRQ3dP +Y0VONis1Vkx2VXBQSGp3WnNiMHZIUEJBRzcxUmV5YwovQzAyMkhDWENJV05mOUwxSWduR25nSWU0 +OXdxdGUvWXFyYm5xMHVqOXlrSjE4Nm1GZHdoeUtBNUR2dm5SM1FmClQ5OG12VE94bnpDTUJ1QlU3 +M002UEpDYTZVekpoeXhtTjNVTU1uanEvU25oN3hycVdkYW1YQ2ROS3hRL0QxUlkKVXEzVGdLbnBI +bGxhSEI0dnoydHZvRXpBY0dzZ014aFZ4NWdoZ1YxT1Y1NzNYNFVDRXA1UVJNNHJ2WE9KMDRDLwpn +Mzl5KzFNQnladUpveno4OHBaUFg4UFVISGJOemFWd2JCeDFVRnVJdFVGeGo3WkRGK3hubDdTTDBl +RW0vc0dxClh3akhVenJlSmgwQXpZQUNYRVYwd3czZ0xSQ1pmSDEwa3RLMVlTcTFhQ0Vld1Z3MHNu +TUl3cjNSMkFjZkR5K0QKM1dhMXd0WGxNb3lDaTFhRUhwdmd1OFVOQWhteDdJVy9pcEdEZHcyaGQ0 +OVh1ZUh2MjVwaHI4S1ROdVRnWmdMNgpXYkVQckFSM3dieHp6QXJ5dmJEbWJ4N1RSbUNRQVJxZlA5 +MTlDQmF5MmwyUGgvNDFDNFJZV3pPeUxHS1F3bzFXCnRwbk9FVnBPRTRLYmRNK3g5dzBxQndEdTVa +TnRqcGd6WlBrbVBSSzhZU2NtUkRkSDRmNU1lT1dPd3Y3YTVoTUgKZHg2Q0JheGF3bUt1VFZLL2Q3 +VU9wRmRQRnhLbjJzU0l1RzZwWUlyOHJFTHF0ZU1EUnRVa2ZYUUtBWFl4NlJRVAphYmgvSlZ3ODB2 +OFJkaEs1YVRQTld3dlZ6RFpHek9VcTBjQkV2dmdjbG5PQzFqYnE4bEFyMzJlZzQvWXkyRWJpCjV2 +MkoydVBlNlE9PQpQcml2YXRlLUxpbmVzOiAyOApBQUFDQUYvalRSU1NKK0RaNkRSRDMxcVAwZm9o +QUtzbjNUaEFqL3Jyakg2blRyd2Z1dXUvZmI0OGd5MDdsTlBTCkVGNTlHTURBUXozVGl4and4N2Uv +WVlZbHB0NExHSU56ajhYTXIzYktNeFlWSlNlbEF2bHVWR3BpMEVRRDZIc2kKTHRJSlp6TkhRYjBk +U1lZenNySnBOREFJS2kvalBNOVVmWFBDbDVabmhvWHJJSWprSnFKTlltK0pZV0FmelNONQpDQkZC +UENDUXRrcWs1V3hYYVB3WlVYcExQekZWL3dqMTBRUlJ2V0IzNE1WajAwckp0SVF6K2w5NGNDbEla +bm5uCjh3MFF0TkJ6UXhqaVhLd0tWRTNDY040WkNsMWp3cTNCeWMwNkdZN21ueFEyU1hYUEwwRGNr +S2E0Sm1MZUw1S24KY3J6UmJFSWVFZUQzdWhGelUzSTByRU5RUmg2NjlJcHJhamZSekxjRnhuQzcz +QlMxUlR5Y2ZwZFNHRk9QWFQvMgpOZDM2MlhTZXA2Vk54U3Q1YTZ3a1dnSEpoMkg4ZFBjbmlESDFE +bXJBZFA5N0FrZWkxbG1YcWJ6Q0lWOXBpZDNtCmZNQUpiSm00UmhRcFREdmV1RThOaUJnSTYyVGt3 +dWNvVzJ5M0xkU3YxMzdpSkJuSlNjMTFHOUE1YkcyeVFYRTIKYWlYUXhIeW9UMlF0VmY1WklYUmFW +THViUW5jU2dMQmpnQ2QxQ2xqQjVqbFJZTXRTYzhiRmEvVEo1b1hPVk10QwpYNHhhcVo3Z3JHS05C +cUJsRFRXblRnWk1tdndQVnVjbGU3MjgzNk9KUFhvMUxqM0sza21yeEMxdU5HMDc2My96CmJLOWl2 +QWF1SFRMMnQ0cHkra0k0NC9ZcERvR2sybnhsV01kRDNMM0pVeDNRejlMeEFBQUJBUURiVG94anFO +UHIKRk9aYlg5M3g2TjU1SVdOQ1VLdXFMMVZLNjFESGFLWGZpaXdIRHlRYjEzUnhPREk2RlNXMElI +eVpqMDh5ZjBTVApJRjlzWU1BcDcvRktRTkRJalVWcjFSNmdERWdBdytjeS9naXlqMFVscUhNc2dU +UnNnSmEvSjJQYnViRDRWMzdZClJEOHpwdmtLZjhTSjBiUWpRMGlMdGFDVWJvQVA1ZmFhWGxJS3Zl +Mnh6S3VYM09Jdk0zTyt1UTBJMDZqZGtMc2IKQUcxL2dBOXpiZmltcEx3SUJCZFVJenY3aEUyajhi +aGpPR201U0lOa3M0WWVUTlRWV2R4ZnI3Yi8wVlFPSXJDdwpEUCsrQmhjOTdkK1g3WVVVZFFIM1Bw +U1dyVm9KTnNITXB1VFpoaXdDZ0ZNTU9UWEhHVmxqRThyZ2RlU2xQc2dCCjFzUWh4clJTTUIrZkFB +QUJBUUROdGU0KzFubFlLVjZFUVl4cnlKVUFLT3RNS0pmQTVYUlRzc1hoc0V5UjAwcS8KV2N3dHJm +ZjM1dzdmQVhCVndlTnplZWl5cGV2SnNZZ1JwQXU5T01ZdHdYRUJWNUYreUlCUWtpRzE3YlNlei9z +YgpueW9pV1U2QkFYR2JkQ2pmYTRlVUVURnpiY2xqdEtsZ0FCUkdqV0Q3UEZPNldmcEFqUXBjamFR +cElUNlh6WGZ1CmZXZ3RsbkZrV3lQZFd6Skw0MldZQ3pjYVNySlNGS2Z6TkR2bVIzc25ZTmRwdWxN +WlBLZUZ2bWUyVFpqdVRSUkUKN3U4S1pGeFBqUGQrQThHYW5Cck5QaWpQY0lxNUphQ1p6TDM1ZGhp +WHBiQkMyUzJYeXJLcG1jK1hKUTgycWVPdwpkNmU5b0pWMTNQN0pTc1lhRWp2UVR5TnI2QTZuNDgy +L3FtUmR1MVIzQUFBQkFRQ1c4emFSOU9lTzFwM1hpMTRYCjkwM245Y2NjUlVwZEw4RlJQNnkxaStU +WmY3ZFJaZWt5bVg2Rm1Pam0wL25vVzNIcGVaMmJiRGlBUERadVc0ZlEKbWdaMGd6bG9kRENlSnZQ +cXZTUXNRZUhKNGMyR3NUbjFUczMzWFNUVnhVS3d3amxGdkxqbzJCQXZpQWhmd2FDdwpSbFRoaWtH +L0J0LzBtWE5tMXpwcVlucUFzWldvcmo5VVZBNjJPVzgxQ1VYMS9kVTFrY1JBaWNjbFFsak5TRFhi +CnppYlU3am91enNDM0VVRURwbUdkbVRRWHhYc0I1MVVOaHl5VmgyZ0FWcUMwMDJtSndnRVVzanBx +c2FMNk03M2EKejgzODhvRHBYYnAxQ0tMRHloOHZKcElOSDBqTk5kRDF3V29BUlFlSHMvTmJRRktR +OElOSXZQc1p6MFpHZkc3Lwp1UytKClByaXZhdGUtTUFDOiBmMjY3ZTM0MzYwOTViZDc5OWYwNzQw +NDExZmJhMDM0YzZjOWNiN2VhYzk1ZDg4NDk3ZGVlYmMxNGZjZWQ0ZDU2Cg== diff --git a/test/runner.js b/test/runner.js index 8a4ff378f2..3ca48486bd 100644 --- a/test/runner.js +++ b/test/runner.js @@ -1,20 +1,47 @@ -var promisify = require("promisify-node"); -var fse = promisify("fs-extra"); +var fse = require("fs-extra"); var path = require("path"); var local = path.join.bind(path, __dirname); +var exec = require('../utils/execPromise'); -// Have to wrap exec, since it has a weird callback signature. -var exec = promisify(function(command, opts, callback) { - return require("child_process").exec(command, opts, callback); -}); +var NodeGit = require('..'); var workdirPath = local("repos/workdir"); +var constWorkdirPath = local("repos/constworkdir"); + +const testRepos = [ + "repos/bare", + "repos/blameRepo", + "repos/cherrypick", + "repos/clone", + "repos/constworkdir", + "repos/convenientLineTest", + "repos/empty", + "repos/index", + "repos/index", + "repos/merge", + "repos/merge-head", + "repos/new", + "repos/newrepo", + "repos/nonrepo", + "repos/rebase", + "repos/renamedFileRepo", + "repos/revertRepo", + "repos/stagingRepo", + "repos/submodule", + "repos/submodule/nodegittest/", + "repos/tree/", + "repos/workdir", +]; before(function() { this.timeout(350000); - var url = "https://github.com/nodegit/test"; + var testUrl = "https://github.com/nodegit/test"; + var constTestUrl = "https://github.com/nodegit/test-frozen"; return fse.remove(local("repos")) + .then(function() { + fse.remove(local("home")) + }) .then(function() { fse.mkdir(local("repos")); }) @@ -22,7 +49,17 @@ before(function() { return exec("git init " + local("repos", "empty")); }) .then(function() { - return exec("git clone " + url + " " + workdirPath); + return exec("git clone " + constTestUrl + " " + constWorkdirPath); + }) + .then(function() { + return exec("git clone " + testUrl + " " + workdirPath); + }) + .then(function() { + //to checkout the longpaths-checkout branch + if(process.platform === "win32") { + return exec("git config core.longpaths true", {cwd: workdirPath}); + } + return Promise.resolve(); }) .then(function() { return exec("git checkout rev-walk", {cwd: workdirPath}); @@ -30,6 +67,9 @@ before(function() { .then(function() { return exec("git checkout checkout-test", {cwd: workdirPath}); }) + .then(function() { + return exec("git checkout longpaths-checkout", {cwd: workdirPath}); + }) .then(function() { return exec("git checkout master", {cwd: workdirPath}); }) @@ -39,7 +79,20 @@ before(function() { .then(function() { return fse.writeFile(local("repos", "nonrepo", "file.txt"), "This is a bogus file"); - }); + }) + .then(function() { + return fse.mkdir(local("home")); + }) + .then(function() { + return fse.writeFile(local("home", ".gitconfig"), + "[user]\n name = John Doe\n email = johndoe@example.com"); + }) + .then( async function() { + //mark all test repos as safe + for(let repo of testRepos) { + await exec(`git config --global --add safe.directory ${local(repo)}`); + } + }) }); beforeEach(function() { diff --git a/test/tests/annotated_commit.js b/test/tests/annotated_commit.js new file mode 100644 index 0000000000..c87ba859bf --- /dev/null +++ b/test/tests/annotated_commit.js @@ -0,0 +1,74 @@ +var assert = require("assert"); +var path = require("path"); +var local = path.join.bind(path, __dirname); + +describe("AnnotatedCommit", function() { + var NodeGit = require("../../"); + var Repository = NodeGit.Repository; + var AnnotatedCommit = NodeGit.AnnotatedCommit; + var Branch = NodeGit.Branch; + + var reposPath = local("../repos/workdir"); + var branchName = "master"; + + beforeEach(function() { + var test = this; + + return Repository.open(reposPath) + .then(function(repository) { + test.repository = repository; + }); + }); + + it("can create an AnnotatedCommit from a ref", function() { + var test = this; + + return Branch.lookup(test.repository, branchName, Branch.BRANCH.LOCAL) + .then(function(ref) { + return AnnotatedCommit.fromRef(test.repository, ref); + }) + .then(function(annotatedCommit) { + assert(annotatedCommit.id()); + }); + }); + + it("can lookup an AnnotatedCommit after creating it", function() { + var test = this; + var id; + + return Branch.lookup(test.repository, branchName, Branch.BRANCH.LOCAL) + .then(function(ref) { + return AnnotatedCommit.fromRef(test.repository, ref); + }) + .then(function(annotatedCommit) { + id = annotatedCommit.id(); + return AnnotatedCommit.lookup(test.repository, id); + }) + .then(function(annotatedCommit) { + assert(id, annotatedCommit.id()); + }); + }); + + it("can lookup an AnnotatedCommit from a revspec", function() { + var test = this; + + return AnnotatedCommit.fromRevspec(test.repository, "checkout-test") + .then(function(annotatedCommit) { + assert.equal(annotatedCommit.id().toString(), + "1729c73906bb8467f4095c2f4044083016b4dfde"); + }); + }); + + it("can lookup an AnnotatedCommit from a fetchhead", function() { + var test = this; + + return AnnotatedCommit.fromFetchhead(test.repository, + "rev-walk", + "https://github.com/nodegit/test", + "32789a79e71fbc9e04d3eff7425e1771eb595150") + .then(function(annotatedCommit) { + assert.equal(annotatedCommit.id().toString(), + "32789a79e71fbc9e04d3eff7425e1771eb595150"); + }); + }); +}); diff --git a/test/tests/blame.js b/test/tests/blame.js new file mode 100644 index 0000000000..c16efdd034 --- /dev/null +++ b/test/tests/blame.js @@ -0,0 +1,36 @@ +var assert = require("assert"); +var RepoUtils = require("../utils/repository_setup"); +var path = require("path"); +var local = path.join.bind(path, __dirname); + +describe("Blame", function() { + var NodeGit = require("../../"); + + var Blame = NodeGit.Blame; + + var test; + var fileName = "foobar.js"; + var repoPath = local("../repos/blameRepo"); + + beforeEach(function() { + test = this; + + return RepoUtils.createRepository(repoPath) + .then(function(repository) { + test.repository = repository; + + return RepoUtils.commitFileToRepo( + repository, + fileName, + "line1\nline2\nline3" + ); + }); + }); + + it("can initialize blame without options", function() { + return Blame.file(test.repository, fileName) + .then(function(blame) { + assert(blame); + }); + }); +}); diff --git a/test/tests/blob.js b/test/tests/blob.js index 342cb25781..2d6512c86c 100644 --- a/test/tests/blob.js +++ b/test/tests/blob.js @@ -1,16 +1,80 @@ var assert = require("assert"); var path = require("path"); var local = path.join.bind(path, __dirname); +var fse = require("fs-extra"); +var exec = require("../../utils/execPromise"); describe("Blob", function() { var NodeGit = require("../../"); var Oid = NodeGit.Oid; var Repository = NodeGit.Repository; + var Blob = NodeGit.Blob; var FileMode = NodeGit.TreeEntry.FILEMODE; var reposPath = local("../repos/workdir"); var oid = "111dd657329797f6165f52f5085f61ac976dcf04"; + var previousCommitOid = ""; + + function commitFile(repo, fileName, fileContent, commitMessage) { + var index; + var treeOid; + var parent; + + return fse.writeFile(path.join(repo.workdir(), fileName), fileContent) + .then(function() { + return repo.refreshIndex(); + }) + .then(function(indexResult) { + index = indexResult; + }) + .then(function() { + return index.addByPath(fileName); + }) + .then(function() { + return index.write(); + }) + .then(function() { + return index.writeTree(); + }) + .then(function(oidResult) { + treeOid = oidResult; + return NodeGit.Reference.nameToId(repo, "HEAD"); + }) + .then(function(head) { + return repo.getCommit(head); + }) + .then(function(parentResult) { + parent = parentResult; + return Promise.all([ + NodeGit.Signature.create("Foo Bar", "foo@bar.com", 123456789, 60), + NodeGit.Signature.create("Foo A Bar", "foo@bar.com", 987654321, 90) + ]); + }) + .then(function(signatures) { + var author = signatures[0]; + var committer = signatures[1]; + + return repo.createCommit( + "HEAD", + author, + committer, + commitMessage, + treeOid, + [parent] + ); + }); + } + + before(function() { + return Repository.open(reposPath) + .then(function(repository) { + return repository.getHeadCommit(); + }) + .then(function(commit) { + previousCommitOid = commit.id(); + }); + }); beforeEach(function() { var test = this; @@ -26,6 +90,16 @@ describe("Blob", function() { }); }); + after(function() { + return exec("git clean -xdf", {cwd: reposPath}) + .then(function() { + return exec("git checkout master", {cwd: reposPath}); + }) + .then(function() { + return exec("git reset --hard " + previousCommitOid, {cwd: reposPath}); + }); + }); + it("can provide content as a buffer", function() { var contents = this.blob.content(); @@ -50,4 +124,539 @@ describe("Blob", function() { assert.equal(blob.id().toString(), oid); }); }); + + describe("createFromBuffer", function() { + it("creates a new blob from the buffer", function() { + var content = "This is a new buffer"; + var buf = Buffer.from(content, content.length); + var test = this; + + return Blob.createFromBuffer(test.repository, buf, content.length) + .then(function(oid) { + return test.repository.getBlob(oid); + }) + .then(function(newBlob) { + assert.equal(newBlob.toString(), content); + }); + }); + + it("creates blob with content equal to length", function() { + var content = "This is a new buffer"; + var buf = Buffer.from(content, content.length); + var test = this; + + return Blob.createFromBuffer(test.repository, buf, 2) + .then(function(oid) { + return test.repository.getBlob(oid); + }) + .then(function(newBlob) { + assert.equal(newBlob.toString(), "Th"); + }); + }); + + it("throws an error when repository is null", function() { + return Blob.createFromBuffer(null, null, 0) + .catch(function(error) { + assert.strictEqual(error.message, "Repository repo is required."); + }); + }); + + it("throws an error when buffer is null", function() { + var test = this; + return Blob.createFromBuffer(test.repository, null) + .catch(function(error) { + assert.strictEqual(error.message, "Buffer buffer is required."); + }); + }); + + it("throws an error when no length is provided", function() { + var test = this; + return Blob.createFromBuffer(test.repository, Buffer.from("testing")) + .catch(function(error) { + assert.strictEqual(error.message, "Number len is required."); + }); + }); + }); + + describe("createFromDisk", function() { + var fileName = path.join(reposPath, "testFile.zzz"); + var fileContent = "this is my file content"; + + beforeEach(function() { + return fse.writeFile(fileName, fileContent); + }); + + afterEach(function() { + return fse.unlink(fileName); + }); + + it("creates a new blob from the file", function() { + var test = this; + + return Blob.createFromDisk(test.repository, fileName) + .then(function(oid) { + return test.repository.getBlob(oid); + }) + .then(function(newBlob) { + assert.equal(newBlob.toString(), fileContent); + }); + }); + + it("throws an error when the file cannot be found", function() { + var test = this; + + return Blob.createFromDisk(test.repository, "aaaaaaaaaa") + .catch(function(error) { + assert.equal(error.errno, -3); + }); + }); + + it("throws an error when repository is null", function() { + return Blob.createFromDisk(null, null, 0) + .catch(function(error) { + assert.strictEqual(error.message, "Repository repo is required."); + }); + }); + + it("throws an error when path is null", function() { + var test = this; + return Blob.createFromDisk(test.repository, null) + .catch(function(error) { + assert.strictEqual(error.message, "String path is required."); + }); + }); + }); + + describe("createFromWorkdir", function() { + it("creates a blob from the file", function() { + var fileName = "package.json"; + var filePath = path.join(reposPath, "package.json"); + var test = this; + + return fse.readFile(filePath) + .then(function(content) { + test.content = content.toString(); + return Blob.createFromWorkdir(test.repository, fileName); + }) + .then(function(oid) { + return test.repository.getBlob(oid); + }) + .then(function(newBlob) { + assert.equal(newBlob.toString(), test.content); + }); + }); + + it("throws an error when the file cannot be found", function() { + var test = this; + + return Blob.createFromWorkdir(test.repository, "thisisabadfile.jpg") + .catch(function(error) { + assert.equal(error.errno, -3); + }); + }); + + it("throws an error when repository is null", function() { + return Blob.createFromWorkdir(null, null, 0) + .catch(function(error) { + assert.strictEqual(error.message, "Repository repo is required."); + }); + }); + + it("throws an error when path is null", function() { + var test = this; + return Blob.createFromWorkdir(test.repository, null) + .catch(function(error) { + assert + .strictEqual(error.message, "String relative_path is required."); + }); + }); + }); + + describe("filteredContent (DEPRECATED)", function() { + var attrFileName = ".gitattributes"; + var filter = "* text eol=crlf"; + var lineEndingRegex = /\r\n|\r|\n/; + var newFileName = "testfile.test"; + + it("retrieves the filtered content", function() { + var test = this; + + return commitFile( + test.repository, + attrFileName, + filter, + "added gitattributes") + .then(function() { + return commitFile( + test.repository, + newFileName, + "this\nis\nfun\guys", + "added LF ending file" + ); + }) + .then(function(oid) { + return test.repository.getCommit(oid); + }) + .then(function(commit) { + test.filteredCommit = commit; + return commit.getEntry(newFileName); + }) + .then(function(entry) { + return entry.getBlob(); + }) + .then(function(lfBlob) { + test.lfBlob = lfBlob; + var ending = test.lfBlob.toString().match(lineEndingRegex); + assert.strictEqual(ending[0], "\n"); + + return Blob.filteredContent( + test.lfBlob, + newFileName, + 0 + ); + }) + .then(function(content) { + var ending = content.match(lineEndingRegex); + assert.strictEqual(ending[0], "\r\n"); + assert.notStrictEqual(content, test.blob.toString()); + }); + }); + + it("returns non-binary filtered content when checking binary", function() { + var test = this; + + return commitFile( + test.repository, + attrFileName, + filter, + "added gitattributes") + .then(function() { + return commitFile( + test.repository, + newFileName, + "this\nis\nfun\guys", + "added LF ending file" + ); + }) + .then(function(oid) { + return test.repository.getCommit(oid); + }) + .then(function(commit) { + test.filteredCommit = commit; + return commit.getEntry(newFileName); + }) + .then(function(entry) { + return entry.getBlob(); + }) + .then(function(lfBlob) { + test.lfBlob = lfBlob; + var ending = test.lfBlob.toString().match(lineEndingRegex); + assert.strictEqual(ending[0], "\n"); + + return Blob.filteredContent( + test.lfBlob, + newFileName, + 1 + ); + }) + .then(function(content) { + var ending = content.match(lineEndingRegex); + assert.strictEqual(ending[0], "\r\n"); + assert.notStrictEqual(content, test.blob.toString()); + }); + }); + + it("returns nothing when checking binary blob", function() { + var test = this; + var binary = Buffer.from(new Uint8Array([1,2,3,4,5,6])); + + return commitFile( + test.repository, + attrFileName, + filter, + "added gitattributes") + .then(function() { + return commitFile( + test.repository, + newFileName, + binary, + "binary content" + ); + }) + .then(function(oid) { + return test.repository.getCommit(oid); + }) + .then(function(commit) { + test.filteredCommit = commit; + return commit.getEntry(newFileName); + }) + .then(function(entry) { + return entry.getBlob(); + }) + .then(function(binaryBlob) { + test.binaryBlob = binaryBlob; + assert.equal(true, binaryBlob.isBinary()); + + return Blob.filteredContent( + test.binaryBlob, + newFileName, + 1 + ); + }) + .then(function(content) { + assert.strictEqual(content, ""); + }); + }); + + it("returns blob when not checking binary on binary blob", function() { + var test = this; + var binary = Buffer.from(new Uint8Array([1,2,3,4,5,6])); + + return commitFile( + test.repository, + attrFileName, + filter, + "added gitattributes") + .then(function() { + return commitFile( + test.repository, + newFileName, + binary, + "binary content" + ); + }) + .then(function(oid) { + return test.repository.getCommit(oid); + }) + .then(function(commit) { + test.filteredCommit = commit; + return commit.getEntry(newFileName); + }) + .then(function(entry) { + return entry.getBlob(); + }) + .then(function(binaryBlob) { + test.binaryBlob = binaryBlob; + assert.equal(true, binaryBlob.isBinary()); + + return Blob.filteredContent( + test.binaryBlob, + newFileName, + 0 + ); + }) + .then(function(content) { + assert.strictEqual(content, binary.toString()); + }); + }); + + it("throws an error when the blob is null", function() { + return Blob.filteredContent(null, "", 0) + .catch(function(err) { + assert.strictEqual( + err.message, + "Blob blob is required." + ); + }); + }); + + it("throws an error when the path is null", function() { + var test = this; + return Blob.filteredContent(test.blob, null, 0) + .catch(function(err) { + assert.strictEqual(err.message, "String as_path is required."); + }); + }); + + it("throws an error when the flag is undefined", function() { + var test = this; + return Blob.filteredContent(test.blob, "") + .catch(function(err) { + assert.strictEqual( + err.message, + "Number check_for_binary_data is required." + ); + }); + }); + }); + + describe("filter", function() { + var attrFileName = ".gitattributes"; + var filter = "* text eol=crlf"; + var lineEndingRegex = /\r\n|\r|\n/; + var newFileName = "testfile.test"; + + it("retrieves the filtered content", function() { + var test = this; + + return commitFile( + test.repository, + attrFileName, + filter, + "added gitattributes") + .then(function() { + return commitFile( + test.repository, + newFileName, + "this\nis\nfun\guys", + "added LF ending file" + ); + }) + .then(function(oid) { + return test.repository.getCommit(oid); + }) + .then(function(commit) { + test.filteredCommit = commit; + return commit.getEntry(newFileName); + }) + .then(function(entry) { + return entry.getBlob(); + }) + .then(function(lfBlob) { + test.lfBlob = lfBlob; + var ending = test.lfBlob.toString().match(lineEndingRegex); + assert.strictEqual(ending[0], "\n"); + + return test.lfBlob.filter(newFileName, { flags: 0 }); + }) + .then(function(content) { + var ending = content.match(lineEndingRegex); + assert.strictEqual(ending[0], "\r\n"); + assert.notStrictEqual(content, test.blob.toString()); + }); + }); + + it("returns non-binary filtered content when checking binary", function() { + var test = this; + + return commitFile( + test.repository, + attrFileName, + filter, + "added gitattributes") + .then(function() { + return commitFile( + test.repository, + newFileName, + "this\nis\nfun\guys", + "added LF ending file" + ); + }) + .then(function(oid) { + return test.repository.getCommit(oid); + }) + .then(function(commit) { + test.filteredCommit = commit; + return commit.getEntry(newFileName); + }) + .then(function(entry) { + return entry.getBlob(); + }) + .then(function(lfBlob) { + test.lfBlob = lfBlob; + var ending = test.lfBlob.toString().match(lineEndingRegex); + assert.strictEqual(ending[0], "\n"); + + return test.lfBlob.filter( + newFileName, + { flags: NodeGit.Blob.FILTER_FLAG.CHECK_FOR_BINARY } + ); + }) + .then(function(content) { + var ending = content.match(lineEndingRegex); + assert.strictEqual(ending[0], "\r\n"); + assert.notStrictEqual(content, test.blob.toString()); + }); + }); + + it("returns nothing when checking binary blob", function() { + var test = this; + var binary = Buffer.from(new Uint8Array([1,2,3,4,5,6])); + + return commitFile( + test.repository, + attrFileName, + filter, + "added gitattributes") + .then(function() { + return commitFile( + test.repository, + newFileName, + binary, + "binary content" + ); + }) + .then(function(oid) { + return test.repository.getCommit(oid); + }) + .then(function(commit) { + test.filteredCommit = commit; + return commit.getEntry(newFileName); + }) + .then(function(entry) { + return entry.getBlob(); + }) + .then(function(binaryBlob) { + test.binaryBlob = binaryBlob; + assert.equal(true, binaryBlob.isBinary()); + + return test.binaryBlob.filter( + newFileName, + { flags: NodeGit.Blob.FILTER_FLAG.CHECK_FOR_BINARY } + ); + }) + .then(function(content) { + assert.strictEqual(content, ""); + }); + }); + + it("returns blob when not checking binary on binary blob", function() { + var test = this; + var binary = Buffer.from(new Uint8Array([1,2,3,4,5,6])); + + return commitFile( + test.repository, + attrFileName, + filter, + "added gitattributes") + .then(function() { + return commitFile( + test.repository, + newFileName, + binary, + "binary content" + ); + }) + .then(function(oid) { + return test.repository.getCommit(oid); + }) + .then(function(commit) { + test.filteredCommit = commit; + return commit.getEntry(newFileName); + }) + .then(function(entry) { + return entry.getBlob(); + }) + .then(function(binaryBlob) { + test.binaryBlob = binaryBlob; + assert.equal(true, binaryBlob.isBinary()); + + return test.binaryBlob.filter( + newFileName, + { flags: 0 } + ); + }) + .then(function(content) { + assert.strictEqual(content, binary.toString()); + }); + }); + + it("throws an error when the path is null", function() { + var test = this; + return test.blob.filter(test.blob, null, { flags: 0 }) + .catch(function(err) { + assert.strictEqual(err.message, "String as_path is required."); + }); + }); + }); }); diff --git a/test/tests/branch.js b/test/tests/branch.js index 922b481520..3900e4242b 100644 --- a/test/tests/branch.js +++ b/test/tests/branch.js @@ -1,14 +1,20 @@ var assert = require("assert"); var path = require("path"); -var Promise = require("nodegit-promise"); var local = path.join.bind(path, __dirname); describe("Branch", function() { var NodeGit = require("../../"); var Repository = NodeGit.Repository; var Branch = NodeGit.Branch; + var AnnotatedCommit = NodeGit.AnnotatedCommit; var branchName = "test-branch"; + var branchName2 = "test-branch2"; var fullBranchName = "refs/heads/" + branchName; + var fullBranchName2 = "refs/heads/" + branchName2; + var remoteName = "origin"; + var upstreamName = "origin/master"; + var fullUpstreamName = "refs/remotes/origin/master"; + var nonHeadCommit = "c82fb078a192ea221c9f1093c64321c60d64aa0d"; var reposPath = local("../repos/workdir"); @@ -27,6 +33,8 @@ describe("Branch", function() { }) .then(function(branch) { test.branch = branch; + return test.repository.createBranch( + branchName2, test.masterCommit, true); }); }); @@ -45,7 +53,7 @@ describe("Branch", function() { return repo.getBranch(branchName) // Reverse the results, since if we found it it wasn't deleted - .then(Promise.reject, Promise.resolve); + .then(Promise.reject.bind(Promise), Promise.resolve.bind(Promise)); }); it("can see if the branch is pointed to by head", function() { @@ -56,4 +64,105 @@ describe("Branch", function() { assert.ok(branch.isHead()); }); }); + + it("can set an upstream for a branch", function() { + var branch = this.branch; + + return NodeGit.Branch.setUpstream(branch, upstreamName) + .then(function() { + return NodeGit.Branch.upstream(branch); + }) + .then(function(upstream) { + assert.equal(upstream.shorthand(), upstreamName); + }); + }); + + it("can get the name of a branch", function() { + var branch = this.branch; + + return NodeGit.Branch.name(branch) + .then(function(branchNameToTest) { + assert.equal(branchNameToTest, branchName); + }); + }); + + it("can get the remote name of a branch", function() { + var repo = this.repository; + + return NodeGit.Branch.remoteName(repo, fullUpstreamName) + .then(function(remoteNameToTest) { + assert.equal(remoteNameToTest, remoteName); + }); + }); + + it("cannot get remote name from a non-remote branch", function() { + var repo = this.repository; + + return NodeGit.Branch.remoteName(repo, fullBranchName) + .then(function() { + assert.fail("The ref should not have been a remote"); + }) + .catch(function(err) { + assert.strictEqual(err.errno, -1); + }); + }); + + it("can rename a branch", function() { + var branch = this.branch; + + // don't force the move + return Branch.move(branch, branchName2, 0) + .then(function(branch) { + return Promise.reject(new Error( + "should not be able to rename the branch")); + }, function(error) { + return Promise.resolve() + .then(function() { + // force the move + return Branch.move(branch, branchName2, 1); + }) + .then(function(branch) { + assert.equal(branch.name(), fullBranchName2); + }); + }); + }); + + it("can lookup a branch", function() { + var repo = this.repository; + + return Branch.lookup(repo, branchName, Branch.BRANCH.LOCAL) + .then(function(branch) { + assert.equal(branch.name(), fullBranchName); + return Branch.lookup(repo, upstreamName, Branch.BRANCH.REMOTE); + }) + .then(function(branch) { + assert.equal(branch.name(), fullUpstreamName); + }); + }); + + it("can create branch from annotated commit", function() { + var repo = this.repository; + var annotatedCommit = null; + + return AnnotatedCommit.fromRevspec(repo, nonHeadCommit) + .then(function(theAnnotatedCommit) { + annotatedCommit = theAnnotatedCommit; + return Branch.createFromAnnotated( + repo, branchName, annotatedCommit, 0); + }) + .then(function(branch) { + return Promise.reject(new Error( + "should not be able to create the branch")); + }, function(error) { + return Promise.resolve() + .then(function() { + // force the branch creation + return Branch.createFromAnnotated( + repo, branchName, annotatedCommit, 1); + }) + .then(function(branch) { + assert.equal(branch.name(), fullBranchName); + }); + }); + }); }); diff --git a/test/tests/checkout.js b/test/tests/checkout.js index 3dbc28ff18..c10d50d3a7 100644 --- a/test/tests/checkout.js +++ b/test/tests/checkout.js @@ -1,6 +1,5 @@ var assert = require("assert"); var path = require("path"); -var Promise = require("nodegit-promise"); var fse = require("fs-extra"); var local = path.join.bind(path, __dirname); @@ -15,6 +14,7 @@ describe("Checkout", function() { var readMePath = local("../repos/workdir/" + readMeName); var packageJsonPath = local("../repos/workdir/" + packageJsonName); var checkoutBranchName = "checkout-test"; + var longpathBranchName = "longpaths-checkout"; beforeEach(function() { var test = this; @@ -36,6 +36,52 @@ describe("Checkout", function() { }); }); + it("can checkout a branch with a long file path", function() { + var test = this; + + return (function () { + if(process.platform === "win32") { + return test.repository.config() + .then(function(config) { + return config.setBool("core.longpaths", true); + }); + } + + return Promise.resolve(); + })() + .then(function() { + return test.repository.checkoutBranch(longpathBranchName); + }) + .then(function() { + return test.repository.getStatus(); + }) + .then(function(statuses) { + assert.equal(statuses.length, 0); + }); + }); + + it("cannot checkout long path file if core.longpaths is not set on win32", function() { + var test = this; + + if (process.platform !== "win32") { + this.skip(); + } + + return test.repository.config() + .then(function(config) { + config.setBool("core.longpaths", false); + }) + .then(function () { + return test.repository.checkoutBranch(longpathBranchName); + }) + .then(function() { + assert.fail(); + }) + .catch(function(err) { + assert(~err.message.indexOf("path too long")); + }); + }); + it("can force checkout a single file", function() { var test = this; @@ -76,7 +122,7 @@ describe("Checkout", function() { var test = this; return test.repository.getTagByName("annotated-tag").then(function(tag) { - return Checkout.tree(test.repository, test.tag); + return Checkout.tree(test.repository, tag); }).then(function() { return test.repository.getHeadCommit(); }).then(function(commit) { @@ -110,58 +156,63 @@ describe("Checkout", function() { }); it("can checkout an index with conflicts", function() { - var test = this; + const test = this; - var testBranchName = "test"; - var ourCommit; + const testBranchName = "test"; + let ourCommit; + let signature; - return test.repository.getBranchCommit(checkoutBranchName) - .then(function(commit) { + return test.repository.defaultSignature() + .then((signatureResult) => { + signature = signatureResult; + return test.repository.getBranchCommit(checkoutBranchName); + }) + .then((commit) => { ourCommit = commit; return test.repository.createBranch(testBranchName, commit.id()); }) - .then(function() { + .then(() => { return test.repository.checkoutBranch(testBranchName); }) - .then(function(branch) { + .then((branch) => { fse.writeFileSync(packageJsonPath, "\n"); - return test.repository.openIndex() - .then(function(index) { - index.read(1); - index.addByPath(packageJsonName); - index.write(); - - return index.writeTree(); + return test.repository.refreshIndex() + .then((index) => { + return index.addByPath(packageJsonName) + .then(() => { + return index.write(); + }) + .then(() => { + return index.writeTree(); + }); }); }) - .then(function(oid) { + .then((oid) => { assert.equal(oid.toString(), "85135ab398976a4d5be6a8704297a45f2b1e7ab2"); - var signature = test.repository.defaultSignature(); - return test.repository.createCommit("refs/heads/" + testBranchName, signature, signature, "we made breaking changes", oid, [ourCommit]); }) - .then(function(commit) { + .then((commit) => { return Promise.all([ test.repository.getBranchCommit(testBranchName), test.repository.getBranchCommit("master") ]); }) - .then(function(commits) { + .then((commits) => { return NodeGit.Merge.commits(test.repository, commits[0], commits[1], null); }) - .then(function(index) { + .then((index) => { assert.ok(index); assert.ok(index.hasConflicts && index.hasConflicts()); return NodeGit.Checkout.index(test.repository, index); }) - .then(function() { + .then(() => { // Verify that the conflict has been written to disk var conflictedContent = fse.readFileSync(packageJsonPath, "utf-8"); @@ -177,7 +228,7 @@ describe("Checkout", function() { return Checkout.head(test.repository, opts); }) - .then(function() { + .then(() => { var finalContent = fse.readFileSync(packageJsonPath, "utf-8"); assert.equal(finalContent, "\n"); }); diff --git a/test/tests/cherrypick.js b/test/tests/cherrypick.js index 325fd410bf..1a1dc92235 100644 --- a/test/tests/cherrypick.js +++ b/test/tests/cherrypick.js @@ -1,8 +1,7 @@ var assert = require("assert"); var path = require("path"); var local = path.join.bind(path, __dirname); -var promisify = require("promisify-node"); -var fse = promisify(require("fs-extra")); +var fse = require("fs-extra"); describe("Cherrypick", function() { var RepoUtils = require("../utils/repository_setup"); @@ -75,8 +74,6 @@ describe("Cherrypick", function() { }) .then(function(index) { assert(index); - index.write(); - return index.writeTreeTo(repo); }) .then(function(oid) { diff --git a/test/tests/clone.js b/test/tests/clone.js index f73d29b7fa..f256e85f51 100644 --- a/test/tests/clone.js +++ b/test/tests/clone.js @@ -1,8 +1,28 @@ var path = require("path"); var assert = require("assert"); -var promisify = require("promisify-node"); -var fse = promisify(require("fs-extra")); +var fse = require("fs-extra"); var local = path.join.bind(path, __dirname); +var _ = require("lodash"); + + +const generatePathWithLength = (base, length) => { + let path = `${base}/`; + const baseLength = path.length; + const remaining = length - baseLength; + + for (let i = 0; i < remaining; ++i) { + // add a slash every 240 characters, but not as first or last character + if (i % 239 == 0 && i != remaining - 1 && i != 0) { + path += "/"; + } else { + path += "a"; + } + } + + assert.ok(path.length === length); + + return path; +}; describe("Clone", function() { var NodeGit = require("../../"); @@ -10,22 +30,28 @@ describe("Clone", function() { var Clone = NodeGit.Clone; var clonePath = local("../repos/clone"); + var longClonePath = generatePathWithLength(clonePath, 600); - var sshPublicKey = local("../id_rsa.pub"); - var sshPrivateKey = local("../id_rsa"); + var sshPublicKeyPath = local("../id_rsa.pub"); + var sshPrivateKeyPath = local("../id_rsa"); + var sshEncryptedPublicKeyPath = local("../encrypted_rsa.pub"); + var sshEncryptedPrivateKeyPath = local("../encrypted_rsa"); // Set a reasonable timeout here now that our repository has grown. this.timeout(30000); beforeEach(function() { - return fse.remove(clonePath).catch(function(err) { - console.log(err); - - throw err; - }); + return fse.remove(clonePath) + .then(function() { + return fse.remove(longClonePath); + }) + .catch(function(err) { + console.log(err); + throw err; + }); }); - it("can clone with http", function() { + it.skip("can clone with http", function() { var test = this; var url = "http://git.tbranyen.com/smart/site-content"; @@ -41,15 +67,153 @@ describe("Clone", function() { var opts = { fetchOpts: { callbacks: { - certificateCheck: function() { - return 1; + certificateCheck: () => 0 + } + } + }; + + return Clone(url, clonePath, opts).then(function(repo) { + assert.ok(repo instanceof Repository); + test.repository = repo; + }); + }); + + it("can clone twice with https using same config object", function() { + var test = this; + var url = "https://github.com/nodegit/test.git"; + var progressCount = 0; + var opts = { + fetchOpts: { + callbacks: { + transferProgress: function(progress) { + progressCount++; } } } }; + return Clone(url, clonePath, opts) + .then(function(repo) { + assert.ok(repo instanceof Repository); + assert.notEqual(progressCount, 0); + return fse.remove(clonePath); + }) + .then(function() { + progressCount = 0; + return Clone(url, clonePath, opts); + }) + .then(function(repo) { + assert.ok(repo instanceof Repository); + assert.notEqual(progressCount, 0); + test.repository = repo; + }); + }); + + function updateProgressIntervals(progressIntervals, lastInvocation) { + var now = new Date(); + if (lastInvocation) { + progressIntervals.push(now - lastInvocation); + } + return now; + } + + it("can clone with https and default throttled progress", function() { + var test = this; + var url = "https://github.com/nodegit/test.git"; + var progressCount = 0; + var lastInvocation; + var progressIntervals = []; + var opts = { + fetchOpts: { + callbacks: { + transferProgress: function(progress) { + lastInvocation = updateProgressIntervals(progressIntervals, + lastInvocation); + progressCount++; + } + } + } + }; + return Clone(url, clonePath, opts).then(function(repo) { assert.ok(repo instanceof Repository); + assert.notEqual(progressCount, 0); + var averageProgressInterval = _.sum(progressIntervals) / + progressIntervals.length; + // even though we are specifying a throttle period of 100, + // the throttle is applied on the scheduling side, + // and actual execution is at the mercy of the main js thread + // so the actual throttle intervals could be less than the specified + // throttle period + if (!averageProgressInterval || averageProgressInterval < 75) { + assert.fail(averageProgressInterval, 75, + "unexpected average time between callbacks", "<"); + } + test.repository = repo; + }); + }); + + it("can clone with https and explicitly throttled progress", function() { + var test = this; + var url = "https://github.com/nodegit/test.git"; + var progressCount = 0; + var lastInvocation; + var progressIntervals = []; + var opts = { + fetchOpts: { + callbacks: { + transferProgress: { + throttle: 50, + callback: function(progress) { + lastInvocation = updateProgressIntervals(progressIntervals, + lastInvocation); + progressCount++; + } + } + } + } + }; + + return Clone(url, clonePath, opts).then(function(repo) { + assert.ok(repo instanceof Repository); + assert.notEqual(progressCount, 0); + var averageProgressInterval = _.sum(progressIntervals) / + progressIntervals.length; + if (!averageProgressInterval || averageProgressInterval < 35) { + assert.fail(averageProgressInterval, 35, + "unexpected average time between callbacks", "<"); + } + test.repository = repo; + }); + }); + + it("can clone without waiting for callback results", function() { + var test = this; + var url = "https://github.com/nodegit/test.git"; + var lastReceivedObjects = 0; + var cloneFinished = false; + var opts = { + fetchOpts: { + callbacks: { + transferProgress: { + waitForResult: false, + callback: function(progress) { + var receivedObjects = progress.receivedObjects(); + assert.false( + cloneFinished, + "callback running after clone completion" + ); + assert.gt(receivedObjects, lastReceivedObjects); + lastReceivedObjects = receivedObjects; + } + } + } + } + }; + + return Clone(url, clonePath, opts).then(function(repo) { + assert.ok(repo instanceof Repository); + cloneFinished = true; test.repository = repo; }); }); @@ -60,9 +224,7 @@ describe("Clone", function() { var opts = { fetchOpts: { callbacks: { - certificateCheck: function() { - return 1; - } + certificateCheck: () => 0 } } }; @@ -79,11 +241,9 @@ describe("Clone", function() { var opts = { fetchOpts: { callbacks: { - certificateCheck: function() { - return 1; - }, + certificateCheck: () => 0, credentials: function(url, userName) { - return NodeGit.Cred.sshKeyFromAgent(userName); + return NodeGit.Credential.sshKeyFromAgent(userName); } } } @@ -101,14 +261,12 @@ describe("Clone", function() { var opts = { fetchOpts: { callbacks: { - certificateCheck: function() { - return 1; - }, + certificateCheck: () => 0, credentials: function(url, userName) { - return NodeGit.Cred.sshKeyNew( + return NodeGit.Credential.sshKeyNew( userName, - sshPublicKey, - sshPrivateKey, + sshPublicKeyPath, + sshPrivateKeyPath, ""); } } @@ -121,19 +279,44 @@ describe("Clone", function() { }); }); - it("can clone with git", function() { + it("can clone with ssh while manually loading an encrypted key", function() { var test = this; - var url = "git://github.com/nodegit/test.git"; + var url = "git@github.com:nodegit/test.git"; var opts = { fetchOpts: { callbacks: { - certificateCheck: function() { - return 1; + certificateCheck: () => 0, + credentials: function(url, userName) { + return NodeGit.Credential.sshKeyNew( + userName, + sshEncryptedPublicKeyPath, + sshEncryptedPrivateKeyPath, + "test-password" + ); } } } }; + return Clone(url, clonePath, opts).then(function(repo) { + assert.ok(repo instanceof Repository); + test.repository = repo; + }); + }); + + // Since 15 March the unauthenticated git protocol on port 9418 is no longer supported in Github. + // https://github.blog/2021-09-01-improving-git-protocol-security-github/ + it.skip("can clone with git", function() { + var test = this; + var url = "git://github.com/nodegit/test.git"; + var opts = { + fetchOpts: { + callbacks: { + certificateCheck: () => 0 + } + } + }; + return Clone(url, clonePath, opts).then(function(repo) { test.repository = repo; assert.ok(repo instanceof Repository); @@ -159,16 +342,14 @@ describe("Clone", function() { return Clone(url, clonePath, { fetchOpts: { callbacks: { - certificateCheck: function() { - return 1; - }, + certificateCheck: () => 0, credentials: function() { if (firstPass) { firstPass = false; - return NodeGit.Cred.userpassPlaintextNew("fake-token", + return NodeGit.Credential.userpassPlaintextNew("fake-token", "x-oauth-basic"); } else { - return NodeGit.Cred.defaultNew(); + return NodeGit.Credential.defaultNew(); } } } diff --git a/test/tests/commit.js b/test/tests/commit.js index 7eac7b4953..8ff9b8ea78 100644 --- a/test/tests/commit.js +++ b/test/tests/commit.js @@ -1,20 +1,23 @@ var assert = require("assert"); var path = require("path"); -var Promise = require("nodegit-promise"); -var promisify = require("promisify-node"); -var fse = promisify(require("fs-extra")); +var fse = require("fs-extra"); + +var garbageCollect = require("../utils/garbage_collect.js"); +var leakTest = require("../utils/leak_test"); + var local = path.join.bind(path, __dirname); -// Have to wrap exec, since it has a weird callback signature. -var exec = promisify(function(command, opts, callback) { - return require("child_process").exec(command, opts, callback); -}); +var exec = require("../../utils/execPromise"); describe("Commit", function() { var NodeGit = require("../../"); var Repository = NodeGit.Repository; + var Commit = NodeGit.Commit; + var Diff = NodeGit.Diff; + var Oid = NodeGit.Oid; var reposPath = local("../repos/workdir"); + var newRepoPath = local("../repos/new"); var oid = "fce88902e66c72b5b93e75bdb5ae717038b221f6"; function reinitialize(test) { @@ -29,6 +32,55 @@ describe("Commit", function() { }); } + function commitFile(repo, fileName, fileContent, commitMessage) { + var index; + var treeOid; + var parent; + + return fse.writeFile(path.join(repo.workdir(), fileName), fileContent) + .then(function() { + return repo.refreshIndex(); + }) + .then(function(indexResult) { + index = indexResult; + }) + .then(function() { + return index.addByPath(fileName); + }) + .then(function() { + return index.write(); + }) + .then(function() { + return index.writeTree(); + }) + .then(function(oidResult) { + treeOid = oidResult; + return NodeGit.Reference.nameToId(repo, "HEAD"); + }) + .then(function(head) { + return repo.getCommit(head); + }) + .then(function(parentResult) { + parent = parentResult; + return Promise.all([ + NodeGit.Signature.create("Foo Bar", "foo@bar.com", 123456789, 60), + NodeGit.Signature.create("Foo A Bar", "foo@bar.com", 987654321, 90) + ]); + }) + .then(function(signatures) { + var author = signatures[0]; + var committer = signatures[1]; + + return repo.createCommit( + "HEAD", + author, + committer, + "message", + treeOid, + [parent]); + }); + } + function undoCommit() { return exec("git reset --hard HEAD~1", {cwd: reposPath}); } @@ -76,6 +128,18 @@ describe("Commit", function() { assert.equal(this.commit.timeOffset(), 780); }); + it("can call getTree on a parent commit", function() { + return this.commit.parent(0) + .then(function(parent) { + return parent.getTree(); + }) + .then(function(tree) { + assert.equal( + tree.id().toString(), "327ff68e59f94f0c25d2c62fb0938efa01e8a107" + ); + }); + }); + it("can create a commit", function() { var test = this; var expectedCommitId = "315e77328ef596f3bc065d8ac6dd2c72c09de8a5"; @@ -93,11 +157,10 @@ describe("Commit", function() { return fse.writeFile(path.join(repo.workdir(), fileName), fileContent); }) .then(function() { - return repo.openIndex(); + return repo.refreshIndex(); }) .then(function(indexResult) { index = indexResult; - return index.read(1); }) .then(function() { return index.addByPath(fileName); @@ -148,10 +211,82 @@ describe("Commit", function() { }); }); + it("can create a commit as a buffer", function() { + var test = this; + var fileName = "newfile.txt"; + var fileContent = "hello world"; + + const expectedCommitContent = + "tree 11c8685af551550e73e5ab89fa554576bd92ef3f\n" + + "parent 32789a79e71fbc9e04d3eff7425e1771eb595150\n" + + "author Foo Bar 123456789 +0100\n" + + "committer Foo A Bar 987654321 +0130\n\n" + + "message"; + + var repo; + var index; + var treeOid; + var parent; + + return NodeGit.Repository.open(reposPath) + .then(function(repoResult) { + repo = repoResult; + return fse.writeFile(path.join(repo.workdir(), fileName), fileContent); + }) + .then(function() { + return repo.refreshIndex(); + }) + .then(function(indexResult) { + index = indexResult; + }) + .then(function() { + return index.addByPath(fileName); + }) + .then(function() { + return index.write(); + }) + .then(function() { + return index.writeTree(); + }) + .then(function(oidResult) { + treeOid = oidResult; + return NodeGit.Reference.nameToId(repo, "HEAD"); + }) + .then(function(head) { + return repo.getCommit(head); + }) + .then(function(parentResult) { + parent = parentResult; + return Promise.all([ + NodeGit.Signature.create("Foo Bar", "foo@bar.com", 123456789, 60), + NodeGit.Signature.create("Foo A Bar", "foo@bar.com", 987654321, 90) + ]); + }) + .then(function(signatures) { + var author = signatures[0]; + var committer = signatures[1]; + + return repo.createCommitBuffer( + author, + committer, + "message", + treeOid, + [parent]); + }) + .then(function(commitContent) { + assert.equal(expectedCommitContent, commitContent); + return reinitialize(test); + }, function(reason) { + return reinitialize(test) + .then(function() { + return Promise.reject(reason); + }); + }); + }); it("can amend commit", function(){ var commitToAmendId = "315e77328ef596f3bc065d8ac6dd2c72c09de8a5"; - var expectedAmendedCommitId = "57836e96555243666ea74ea888310cc7c41d4613"; + var expectedAmendedCommitId = "a41de0d1c3dc169c873dd03bd9240d9f88e60ffc"; var fileName = "newfile.txt"; var fileContent = "hello world"; var newFileName = "newerfile.txt"; @@ -173,11 +308,10 @@ describe("Commit", function() { return fse.writeFile(path.join(repo.workdir(), fileName), fileContent); }) .then(function() { - return repo.openIndex(); + return repo.refreshIndex(); }) .then(function(indexResult) { index = indexResult; - return index.read(1); }) .then(function() { return index.addByPath(fileName); @@ -221,11 +355,10 @@ describe("Commit", function() { ); }) .then(function() { - return repo.openIndex(); + return repo.refreshIndex(); }) .then(function(indexResult) { index = indexResult; - return index.read(1); }) .then(function() { return index.addByPath(newFileName); @@ -318,11 +451,11 @@ describe("Commit", function() { }).then(function(reflog) { var reflogEntry = reflog.entryByIndex(0); assert.equal( - NodeGit.Reflog.entryMessage(reflogEntry), + reflogEntry.message(), customReflogMessage ); assert.equal( - NodeGit.Reflog.entryIdNew(reflogEntry).toString(), + reflogEntry.idNew().toString(), oid ); // only setTarget should have added to the entrycount @@ -330,6 +463,242 @@ describe("Commit", function() { }); }); + describe("amendWithSignature", function() { + it("can amend with signature", function() { + const signedData = "-----BEGIN PGP SIGNATURE-----\n" + + "\n" + + "iQJHBAEBCAAxFiEEKdxGpJ93wnkLaBKfURjJKedOfEMFAlxPKUYTHHN0ZXZla0Bh\n" + + "eG9zb2Z0LmNvbQAKCRBRGMkp5058Q3vcD/0Uf6P68g98Kbvsgjg/aidM1ujruXaw\n" + + "X5WSsCAw+wWGICOj0n+KBnmQruI4HSFz3zykEshuOpcBv1X/+huwDeB/hBqonCU8\n" + + "QdexCdWR70YbT1bufesUwV9v1qwE4WOmFxWXgwh55K0wDRkc0u2aLcwrJkIEEVfs\n" + + "HqZyFzU4kwbGekY/m7d1DsBhWyKEGW9/25WMYmjWOWOiaFjeBaHLlxiEM8KGnMLH\n" + + "wx37NuFuaABgi23AAcBGdeWy04TEuU4S51+bHM3RotrZ2cryW2lEbkkXodhIJcq0\n" + + "RgrStCbvR0ehnOPdYSiRbxK8JNLZuNjHlK2g7wVi+C83vwMQuhU4H6OlYHGVr664\n" + + "4YzL83FdIo7wiMOFd2OOMLlCfHgTun60FvjCs4WHjrwH1fQl287FRPLa/4olBSQP\n" + + "yUXJaZdxm4cB4L/1pmbb/J/XUiOio3MpaN3GFm2hZloUlag1uPDBtCxTl5odvj4a\n" + + "GOmTBWznXxF/zrKnQVSvv+EccNxYFc0VVjAxGgNqPzIxDAKtw1lE5pbBkFpFpNHz\n" + + "StmwZkP9QIJY4hJYQfM+pzHLe8xjexL+Kh/TrYXgY1m/4vJe0HJSsnRnaR8Yfqhh\n" + + "LReqo94VHRYXR0rZQv4py0D9TrWaI8xHLve6ewhLPNRzyaI9fNrinbcPYZZOWnRi\n" + + "ekgUBx+BX6nJOw==\n" + + "=4Hy5\n" + + "-----END PGP SIGNATURE-----"; + + const onSignature = () => ({ + code: NodeGit.Error.CODE.OK, + field: "gpgsig", + signedData + }); + + var repo; + var oid; + var commit; + var message; + var parents; + + return NodeGit.Repository.open(reposPath) + .then(function(repoResult) { + repo = repoResult; + return repo.getHeadCommit(); + }) + .then(function(headCommit) { + message = headCommit.message() + "\n"; + parents = headCommit.parents(); + + return headCommit.amendWithSignature( + null, + null, + null, + null, + null, + null, + onSignature + ); + }) + .then(function(oidResult) { + oid = oidResult; + return NodeGit.Commit.lookup(repo, oid); + }) + .then(function(commitResult) { + commit = commitResult; + return commit.getSignature("gpgsig"); + }) + .then(function(signatureInfo) { + assert.equal(signatureInfo.signature, signedData); + assert.equal(commit.message(), message); + assert.deepEqual(commit.parents(), parents); + }); + }); + + it("will respects overridden arguments", function() { + const signedData = "-----BEGIN PGP SIGNATURE-----\n" + + "\n" + + "iQJHBAEBCAAxFiEEKdxGpJ93wnkLaBKfURjJKedOfEMFAlxPKUYTHHN0ZXZla0Bh\n" + + "eG9zb2Z0LmNvbQAKCRBRGMkp5058Q3vcD/0Uf6P68g98Kbvsgjg/aidM1ujruXaw\n" + + "X5WSsCAw+wWGICOj0n+KBnmQruI4HSFz3zykEshuOpcBv1X/+huwDeB/hBqonCU8\n" + + "QdexCdWR70YbT1bufesUwV9v1qwE4WOmFxWXgwh55K0wDRkc0u2aLcwrJkIEEVfs\n" + + "HqZyFzU4kwbGekY/m7d1DsBhWyKEGW9/25WMYmjWOWOiaFjeBaHLlxiEM8KGnMLH\n" + + "wx37NuFuaABgi23AAcBGdeWy04TEuU4S51+bHM3RotrZ2cryW2lEbkkXodhIJcq0\n" + + "RgrStCbvR0ehnOPdYSiRbxK8JNLZuNjHlK2g7wVi+C83vwMQuhU4H6OlYHGVr664\n" + + "4YzL83FdIo7wiMOFd2OOMLlCfHgTun60FvjCs4WHjrwH1fQl287FRPLa/4olBSQP\n" + + "yUXJaZdxm4cB4L/1pmbb/J/XUiOio3MpaN3GFm2hZloUlag1uPDBtCxTl5odvj4a\n" + + "GOmTBWznXxF/zrKnQVSvv+EccNxYFc0VVjAxGgNqPzIxDAKtw1lE5pbBkFpFpNHz\n" + + "StmwZkP9QIJY4hJYQfM+pzHLe8xjexL+Kh/TrYXgY1m/4vJe0HJSsnRnaR8Yfqhh\n" + + "LReqo94VHRYXR0rZQv4py0D9TrWaI8xHLve6ewhLPNRzyaI9fNrinbcPYZZOWnRi\n" + + "ekgUBx+BX6nJOw==\n" + + "=4Hy5\n" + + "-----END PGP SIGNATURE-----"; + + const onSignature = () => ({ + code: NodeGit.Error.CODE.OK, + field: "gpgsig", + signedData + }); + + var repo; + var oid; + var commit; + var message; + var parents; + var commitTree; + + var author = NodeGit.Signature.create( + "Scooby Doo", + "scoob@mystery.com", + 123456789, + 60 + ); + var committer = NodeGit.Signature.create( + "Shaggy Rogers", + "shaggy@mystery.com", + 987654321, + 90 + ); + var tree = Oid.fromString("f4661419a6fbbe865f78644fec722c023ce4b65f"); + + return NodeGit.Repository.open(reposPath) + .then(function(repoResult) { + repo = repoResult; + return repo.getHeadCommit(); + }) + .then(function(headCommit) { + message = headCommit.message() + "\n"; + parents = headCommit.parents(); + + return headCommit.amendWithSignature( + null, + author, + committer, + null, + null, + tree, + onSignature + ); + }) + .then(function(oidResult) { + oid = oidResult; + return NodeGit.Commit.lookup(repo, oid); + }) + .then(function(commitResult) { + commit = commitResult; + return commit.getTree(); + }) + .then(function(commitTreeResult) { + commitTree = commitTreeResult; + return commit.getSignature("gpgsig"); + }) + .then(function(signatureInfo) { + assert.equal(signatureInfo.signature, signedData); + assert.equal(commit.message(), message); + assert.deepEqual(commit.parents(), parents); + assert.deepEqual(commitTree.id(), tree); + assert.deepEqual(commit.author(), author); + assert.deepEqual(commit.committer(), committer); + }); + }); + + it("can optionally skip signing process", function() { + const onSignature = () => ({ + code: NodeGit.Error.CODE.PASSTHROUGH + }); + + var repo; + var oid; + var commit; + var message; + var parents; + + return NodeGit.Repository.open(reposPath) + .then(function(repoResult) { + repo = repoResult; + return repo.getHeadCommit(); + }) + .then(function(headCommit) { + message = headCommit.message(); + parents = headCommit.parents(); + + return headCommit.amendWithSignature( + null, + null, + null, + null, + null, + null, + onSignature + ); + }) + .then(function(oidResult) { + oid = oidResult; + return NodeGit.Commit.lookup(repo, oid); + }) + .then(function(commitResult) { + commit = commitResult; + return commit.getSignature("gpgsig") + .then(function() { + assert.fail("Should not have a signature"); + }, function(error) { + if (error && error.message === "this commit is not signed") { + return; + } + throw error; + }); + }) + .then(function(signatureInfo) { + assert.equal(commit.message(), message); + assert.deepEqual(commit.parents(), parents); + }); + }); + + it("will throw if signing callback returns an error code", function() { + const onSignature = () => ({ + code: NodeGit.Error.CODE.ERROR + }); + + return NodeGit.Repository.open(reposPath) + .then(function(repo) { + return repo.getHeadCommit(); + }) + .then(function(headCommit) { + return headCommit.amendWithSignature( + null, + null, + null, + null, + null, + null, + onSignature + ); + }) + .then(function() { + assert.fail("amendWithSignature should have failed."); + }, function(error) { + if (error && error.errno === NodeGit.Error.CODE.ERROR) { + return; + } + throw error; + }); + }); + }); + it("has an owner", function() { var owner = this.commit.owner(); assert.ok(owner instanceof Repository); @@ -405,6 +774,16 @@ describe("Commit", function() { assert.equal(1, this.commit.parentcount()); }); + it("can fetch a single parent", function() { + return this.commit.parent(0).then(function(parent) { + assert.strictEqual(parent.sha(), + "ecfd36c80a3e9081f200dfda2391acadb56dac27"); + // This used to crash due to a missing .repo property on the retrieved + // parent. + return parent.getTree().then(tree => assert(tree)); + }); + }); + it("can retrieve and walk a commit tree", function() { var commitTreeEntryCount = 0; var expectedCommitTreeEntryCount = 198; @@ -443,6 +822,145 @@ describe("Commit", function() { }); }); + // it("can get the commit diff in large context", function() { + // For displaying the full file we can set context_lines of options. + // Eventually this should work, but right now there is a + // comment in diff.c in libgit2 of "/* TODO: parse thresholds */" + // It will add the "--unified" but not with the "=x" part. + // options.context_lines = 20000; + // }); + + it("can get the commit diff without whitespace", function() { + var repo; + var options = {}; + var GIT_DIFF_IGNORE_WHITESPACE = (1 << 22); + options.flags = GIT_DIFF_IGNORE_WHITESPACE; + + var fileName = "whitespacetest.txt"; + var fileContent = "line a\nline b\nline c\nline d\n line e\nline f\n" + + "line g\nline h\nline i\n line j\nline k\nline l\n" + + "line m\nline n\n line o\nline p\nline q\n" + + "line r\nline s\nline t\nline u\nline v\nline w\n" + + "line x\nline y\nline z\n"; + var changedFileContent = "line a\nline b\n line c\nline d\n" + + "line e\nline f\nline g\n line h\nline i\nline j\n" + + "line k\nline l\nline m\nline n\nline o\nlinep\n" + + " line q\nline r\nline s\nline t\n\nline u\n" + + "line v1\nline w\nline x\n \nline y\nline z\n"; + + return NodeGit.Repository.open(reposPath) + .then(function(repoResult) { + repo = repoResult; + return commitFile(repo, fileName, fileContent, "commit this"); + }) + .then(function(){ + return commitFile(repo, fileName, changedFileContent, "commit that"); + }) + .then (function() { + return repo.getHeadCommit(); + }) + .then (function(wsCommit) { + return wsCommit.getDiffWithOptions(options); + }) + .then(function(diff) { + assert.equal(diff.length, 1); + return diff[0].patches(); + }) + .then(function(patches) { + assert.equal(patches.length, 1); + var patch = patches[0]; + + assert.equal(patch.oldFile().path(), fileName); + assert.equal(patch.newFile().path(), fileName); + assert.ok(patch.isModified()); + + return patch.hunks(); + }) + .then(function(hunks) { + return hunks[0].lines(); + }) + .then(function(lines) { + //check all hunk lines + assert.equal(lines.length, 12); + assert.equal(lines[0].origin(), Diff.LINE.CONTEXT); + + assert.equal(lines[1].content().length, 9); + assert.equal(lines[1].content(), "line s\n"); + assert.equal(lines[1].origin(), Diff.LINE.CONTEXT); + + assert.equal(lines[2].origin(), Diff.LINE.CONTEXT); + + assert.equal(lines[3].content().length, 1); + assert.equal(lines[3].content(), "\n"); + assert.equal(lines[3].origin(), Diff.LINE.ADDITION); + + assert.equal(lines[4].origin(), Diff.LINE.CONTEXT); + + assert.equal(lines[5].content().length, 7); + assert.equal(lines[5].content(), "line v\n"); + assert.equal(lines[5].origin(), Diff.LINE.DELETION); + + assert.equal(lines[6].content().length, 8); + assert.equal(lines[6].content(), "line v1\n"); + assert.equal(lines[6].origin(), Diff.LINE.ADDITION); + + assert.equal(lines[7].origin(), Diff.LINE.CONTEXT); + + assert.equal(lines[8].origin(), Diff.LINE.CONTEXT); + + assert.equal(lines[9].content().length, 4); + assert.equal(lines[9].content(), "\t\t\t\n"); + assert.equal(lines[9].origin(), Diff.LINE.ADDITION); + + assert.equal(lines[10].origin(), Diff.LINE.CONTEXT); + + assert.equal(lines[11].origin(), Diff.LINE.CONTEXT); + }); + }); + + it("can get header fields", function() { + var commit = this.commit; + return commit.headerField("parent").then(function(field) { + assert.equal(field, + "ecfd36c80a3e9081f200dfda2391acadb56dac27"); + return commit.headerField("author"); + }) + .then(function(field) { + assert.equal(field, + "Michael Robinson 1362012884 +1300"); + return commit.headerField("committer"); + }) + .then(function(field) { + assert.equal(field, + "Michael Robinson 1362012884 +1300"); + }); + }); + + it("can lookup using a short id", function () { + return NodeGit.Repository.open(reposPath) + .then(function (repo) { + return Commit.lookupPrefix(repo, Oid.fromString("bf1da765"), 8); + }) + .then(function (commit) { + assert.equal(commit.id().toString(), + "bf1da765e357a9b936d6d511f2c7b78e0de53632"); + }); + }); + + it("can find nth gen ancestor", function () { + return NodeGit.Repository.open(reposPath) + .then(function (repo) { + return repo.getCommit("b52067acaa755c3b3fc21b484ffed2bce4150f62"); + }) + .then(function (commit) { + return commit.nthGenAncestor(3); + }) + .then(function (commit) { + assert.equal(commit.id().toString(), + "9b2f3a37d46d47248d2704b6a46ec7e197bcd48c"); + }); + }); + describe("Commit's Author", function() { before(function() { this.author = this.commit.author(); @@ -478,4 +996,611 @@ describe("Commit", function() { assert.equal(this.committer.email(), "mike@panmedia.co.nz"); }); }); + + describe("Commit's Body", function() { + + it("null if only summary", function() { + var test = this; + return NodeGit.Commit.lookup(test.repository, + "15315cf41ad76400d9189c85a5827b77b8c392f1") + .then(function(commit) { + assert.equal(commit.body(), null); + }); + }); + + it("non-null when body exists", function() { + var test = this; + return NodeGit.Commit.lookup(test.repository, + "c82fb078a192ea221c9f1093c64321c60d64aa0d") + .then(function(commit) { + assert.equal(commit.body(), + "Added new methods in checkout and repository"); + }); + }); + }); + + it("does not leak", function() { + var test = this; + + return leakTest(NodeGit.Commit, function() { + return NodeGit.Commit.lookup(test.repository, oid); + }); + }); + + it("duplicates signature", function() { + garbageCollect(); + var Signature = NodeGit.Signature; + var startSelfFreeingCount = Signature.getSelfFreeingInstanceCount(); + var startNonSelfFreeingCount = + Signature.getNonSelfFreeingConstructedCount(); + var signature = this.commit.author(); + + garbageCollect(); + var endSelfFreeingCount = Signature.getSelfFreeingInstanceCount(); + var endNonSelfFreeingCount = Signature.getNonSelfFreeingConstructedCount(); + // we should get one duplicated, self-freeing signature + assert.equal(startSelfFreeingCount + 1, endSelfFreeingCount); + assert.equal(startNonSelfFreeingCount, endNonSelfFreeingCount); + + signature = null; + garbageCollect(); + endSelfFreeingCount = Signature.getSelfFreeingInstanceCount(); + // the self-freeing signature should get freed + assert.equal(startSelfFreeingCount, endSelfFreeingCount); + }); + + describe("Commit's Signature", function() { + it("Can create a signed commit in a repo", function() { + var signedData = "-----BEGIN PGP SIGNATURE-----\n" + + "Version: GnuPG v1.4.12 (Darwin)\n" + + "\n" + + "iQIcBAABAgAGBQJQ+FMIAAoJEH+LfPdZDSs1e3EQAJMjhqjWF+WkGLHju7pTw2al\n" + + "o6IoMAhv0Z/LHlWhzBd9e7JeCnanRt12bAU7yvYp9+Z+z+dbwqLwDoFp8LVuigl8\n" + + "JGLcnwiUW3rSvhjdCp9irdb4+bhKUnKUzSdsR2CK4/hC0N2i/HOvMYX+BRsvqweq\n" + + "AsAkA6dAWh+gAfedrBUkCTGhlNYoetjdakWqlGL1TiKAefEZrtA1TpPkGn92vbLq\n" + + "SphFRUY9hVn1ZBWrT3hEpvAIcZag3rTOiRVT1X1flj8B2vGCEr3RrcwOIZikpdaW\n" + + "who/X3xh/DGbI2RbuxmmJpxxP/8dsVchRJJzBwG+yhwU/iN3MlV2c5D69tls/Dok\n" + + "6VbyU4lm/ae0y3yR83D9dUlkycOnmmlBAHKIZ9qUts9X7mWJf0+yy2QxJVpjaTGG\n" + + "cmnQKKPeNIhGJk2ENnnnzjEve7L7YJQF6itbx5VCOcsGh3Ocb3YR7DMdWjt7f8pu\n" + + "c6j+q1rP7EpE2afUN/geSlp5i3x8aXZPDj67jImbVCE/Q1X9voCtyzGJH7MXR0N9\n" + + "ZpRF8yzveRfMH8bwAJjSOGAFF5XkcR/RNY95o+J+QcgBLdX48h+ZdNmUf6jqlu3J\n" + + "7KmTXXQcOVpN6dD3CmRFsbjq+x6RHwa8u1iGn+oIkX908r97ckfB/kHKH7ZdXIJc\n" + + "cpxtDQQMGYFpXK/71stq\n" + + "=ozeK\n" + + "-----END PGP SIGNATURE-----"; + + const onSignature = () => ({ + code: NodeGit.Error.CODE.OK, + field: "gpgsig", + signedData + }); + + var test = this; + var expectedCommitId = "ccb99bb20716ef7c37e92c7b8db029a7af7f747b"; + var fileName = "newfile.txt"; + var fileContent = "hello world"; + + var repo; + var index; + var treeOid; + var parent; + + return NodeGit.Repository.open(reposPath) + .then(function(repoResult) { + repo = repoResult; + return fse.writeFile(path.join(repo.workdir(), fileName), fileContent); + }) + .then(function() { + return repo.refreshIndex(); + }) + .then(function(indexResult) { + index = indexResult; + }) + .then(function() { + return index.addByPath(fileName); + }) + .then(function() { + return index.write(); + }) + .then(function() { + return index.writeTree(); + }) + .then(function(oidResult) { + treeOid = oidResult; + return NodeGit.Reference.nameToId(repo, "HEAD"); + }) + .then(function(head) { + return repo.getCommit(head); + }) + .then(function(parentResult) { + parent = parentResult; + return Promise.all([ + NodeGit.Signature.create("Foo Bar", "foo@bar.com", 123456789, 60), + NodeGit.Signature.create("Foo A Bar", "foo@bar.com", 987654321, 90) + ]); + }) + .then(function(signatures) { + var author = signatures[0]; + var committer = signatures[1]; + + return repo.createCommitWithSignature( + null, + author, + committer, + "message", + treeOid, + [parent], + onSignature + ); + }) + .then(function(commitId) { + assert.equal(expectedCommitId, commitId); + return NodeGit.Commit.lookup(repo, commitId); + }) + .then(function(commit) { + return commit.getSignature("gpgsig"); + }) + .then(function(signatureInfo) { + assert.equal(signedData, signatureInfo.signature); + return reinitialize(test); + }, function(reason) { + return reinitialize(test) + .then(function() { + return Promise.reject(reason); + }); + }); + }); + + it("Can create a signed commit in a repo and update existing ref", + function() { + var signedData = "-----BEGIN PGP SIGNATURE-----\n" + + "Version: GnuPG v1.4.12 (Darwin)\n" + + "\n" + + "iQIcBAABAgAGBQJQ+FMIAAoJEH+LfPdZDSs1e3EQAJMjhqjWF+WkGLHju7pTw2al\n" + + "o6IoMAhv0Z/LHlWhzBd9e7JeCnanRt12bAU7yvYp9+Z+z+dbwqLwDoFp8LVuigl8\n" + + "JGLcnwiUW3rSvhjdCp9irdb4+bhKUnKUzSdsR2CK4/hC0N2i/HOvMYX+BRsvqweq\n" + + "AsAkA6dAWh+gAfedrBUkCTGhlNYoetjdakWqlGL1TiKAefEZrtA1TpPkGn92vbLq\n" + + "SphFRUY9hVn1ZBWrT3hEpvAIcZag3rTOiRVT1X1flj8B2vGCEr3RrcwOIZikpdaW\n" + + "who/X3xh/DGbI2RbuxmmJpxxP/8dsVchRJJzBwG+yhwU/iN3MlV2c5D69tls/Dok\n" + + "6VbyU4lm/ae0y3yR83D9dUlkycOnmmlBAHKIZ9qUts9X7mWJf0+yy2QxJVpjaTGG\n" + + "cmnQKKPeNIhGJk2ENnnnzjEve7L7YJQF6itbx5VCOcsGh3Ocb3YR7DMdWjt7f8pu\n" + + "c6j+q1rP7EpE2afUN/geSlp5i3x8aXZPDj67jImbVCE/Q1X9voCtyzGJH7MXR0N9\n" + + "ZpRF8yzveRfMH8bwAJjSOGAFF5XkcR/RNY95o+J+QcgBLdX48h+ZdNmUf6jqlu3J\n" + + "7KmTXXQcOVpN6dD3CmRFsbjq+x6RHwa8u1iGn+oIkX908r97ckfB/kHKH7ZdXIJc\n" + + "cpxtDQQMGYFpXK/71stq\n" + + "=ozeK\n" + + "-----END PGP SIGNATURE-----"; + + const onSignature = () => ({ + code: NodeGit.Error.CODE.OK, + field: "gpgsig", + signedData + }); + + var test = this; + var expectedCommitId = "ccb99bb20716ef7c37e92c7b8db029a7af7f747b"; + var fileName = "newfile.txt"; + var fileContent = "hello world"; + + var repo; + var index; + var treeOid; + var parent; + + return NodeGit.Repository.open(reposPath) + .then(function(repoResult) { + repo = repoResult; + return fse.writeFile(path.join(repo.workdir(), fileName), fileContent); + }) + .then(function() { + return repo.refreshIndex(); + }) + .then(function(indexResult) { + index = indexResult; + }) + .then(function() { + return index.addByPath(fileName); + }) + .then(function() { + return index.write(); + }) + .then(function() { + return index.writeTree(); + }) + .then(function(oidResult) { + treeOid = oidResult; + return NodeGit.Reference.nameToId(repo, "HEAD"); + }) + .then(function(head) { + return repo.getCommit(head); + }) + .then(function(parentResult) { + parent = parentResult; + return Promise.all([ + NodeGit.Signature.create("Foo Bar", "foo@bar.com", 123456789, 60), + NodeGit.Signature.create("Foo A Bar", "foo@bar.com", 987654321, 90) + ]); + }) + .then(function(signatures) { + var author = signatures[0]; + var committer = signatures[1]; + + return repo.createCommitWithSignature( + "HEAD", + author, + committer, + "message", + treeOid, + [parent], + onSignature); + }) + .then(function(commitId) { + assert.equal(expectedCommitId, commitId); + return NodeGit.Commit.lookup(repo, commitId); + }) + .then(function(commit) { + return commit.getSignature("gpgsig"); + }) + .then(function(signatureInfo) { + assert.equal(signedData, signatureInfo.signature); + return repo.getHeadCommit(); + }) + .then(function(headCommit) { + assert.equal(expectedCommitId, headCommit.id()); + return undoCommit() + .then(function(){ + return reinitialize(test); + }); + }, function(reason) { + return reinitialize(test) + .then(function() { + return Promise.reject(reason); + }); + }); + }); + + it("Can create a signed commit in bare a repo and update non-existent ref", + function() { + var signedData = "-----BEGIN PGP SIGNATURE-----\n" + + "\n" + + "iQIzBAABCAAdFiEEHYpzGBSIRCy6QrNr0R10kNTwiG8FAlxcuSoACgkQ0R10kNTw\n" + + "iG9sZA//Z6mrX5l//gjtn7Fy3Cg5khasNMZA15JUPzfoSyVkaYM7g/iZrJr4uZmm\n" + + "lrhqxTDP4SUEL6dMOT0fjAudulP19Stv0mUMOoQ9cfvU0DAuFlI1z2Ny9IR+3hJK\n" + + "XpIQCHZAAY9KrGajJvDO+WqukrMwKh2dwaQLgB2+cS7ehBpbW45+l+Bq4hTlULiJ\n" + + "ohZ2SQhqj65knErdbfJ2B7yVlQbfG2vbD6qN4qJOkJpkFRdDhLmGnNjUj+vcmYO2\n" + + "Be5CLyjuhYszzUqys6ix4UHr10KihFk31N17CgA2ZsDSzE3VsMCPlVPV9jWuMceJ\n" + + "0IFsJEXFR4SOlRAq23BxD7aaYao6AF/YBhCQnDiuiQLCJ7WdUAmja6VPyEajAjoX\n" + + "CkdDs1P4N9IeIPvJECn8Df4NEEkzW8sV3i96ryk066m1ZmZWemJ2zdGVbfR+AuFZ\n" + + "7QwgBRidj3thIk0geh9g10+pbRuTzxNXklqxq4DQb3VEXIIJMUcqtN1bUPEPiLyA\n" + + "SU3uJ1THyYznAVZy6aqw+mNq7Lg9gV65LRd0WtNqgneknDZoH3zXyzlcJexjHkRF\n" + + "qt4K6w9TDA2Erda3wE4BM4MCgl1Hc629kH3ROCyWTFuJAEZtNDJPgIc2LTRDhHNd\n" + + "+K937RhWU8lUnI2jJLmKdQDk2dnS1ZepFqA5Ynwza1qDSOgUqVw=\n" + + "=M81P\n" + + "-----END PGP SIGNATURE-----"; + + const onSignature = () => ({ + code: NodeGit.Error.CODE.OK, + field: "gpgsig", + signedData + }); + + var expectedCommitId = "ef11571eb3590007712c7ee3b4a11cd9c6094e30"; + var fileName = "newfile.txt"; + var fileContent = "hello world"; + + var repo; + var index; + var treeOid; + + return NodeGit.Repository.init(newRepoPath, 0) + .then(function(repoResult) { + repo = repoResult; + return fse.writeFile(path.join(repo.workdir(), fileName), fileContent); + }) + .then(function() { + return repo.refreshIndex(); + }) + .then(function(indexResult) { + index = indexResult; + }) + .then(function() { + return index.addByPath(fileName); + }) + .then(function() { + return index.write(); + }) + .then(function() { + return index.writeTree(); + }) + .then(function(oidResult) { + treeOid = oidResult; + return Promise.all([ + NodeGit.Signature.create("Foo Bar", "foo@bar.com", 123456789, 60), + NodeGit.Signature.create("Foo A Bar", "foo@bar.com", 987654321, 90) + ]); + }) + .then(function(signatures) { + var author = signatures[0]; + var committer = signatures[1]; + + return repo.createCommitWithSignature( + "HEAD", + author, + committer, + "message", + treeOid, + [], + onSignature); + }) + .then(function(commitId) { + assert.equal(expectedCommitId, commitId); + return NodeGit.Commit.lookup(repo, commitId); + }) + .then(function(commit) { + return commit.getSignature("gpgsig"); + }) + .then(function(signatureInfo) { + assert.equal(signedData, signatureInfo.signature); + return repo.getHeadCommit(); + }) + .then(function(headCommit) { + assert.equal(expectedCommitId, headCommit.id()); + }); + }); + + it("Can create a signed commit raw", function() { + var expectedCommitId = "cc1401eaac4e9e77190e98a9353b305f0c6313d8"; + + var signature = "-----BEGIN PGP SIGNATURE-----\n\n" + + "iQEcBAABCAAGBQJarBhIAAoJEE8pfTd/81lKQA4IAL8Mu5kc4B/MX9s4XB26Ahap\n" + + "n06kCx3RQ1KHMZIRomAjCnb48WieNVuy1y+Ut0RgfCxxrJ1ZnzFG3kF2bIKwIxNI\n" + + "tYIC76iWny+mrVnb2mjKYjn/3F4c4VJGENq9ITiV1WeE4yJ8dHw2ox2D+hACzTvQ\n" + + "KVroedk8BDFJxS6DFb20To35xbAVhwBnAGRcII4Wi5PPMFpqAhGLfq3Czv95ddSz\n" + + "BHlyp27+YWSpV0Og0dqOEhsdDYaPrOBGRcoRiqjue+l5tgK/QerLFZ4aovZzpuEP\n" + + "Xx1yZfqXIiy4Bo40qScSrdnmnp/kMq/NQGR3jYU+SleFHVKNFsya9UwurMaezY0=\n" + + "=eZzi\n-----END PGP SIGNATURE-----"; + + var commit_content = "tree f4661419a6fbbe865f78644fec722c023ce4b65f\n" + + "parent 32789a79e71fbc9e04d3eff7425e1771eb595150\n" + + "author Tyler Ang-Wanek 1521227848 -0700\n" + + "committer Tyler Ang-Wanek 1521227848 -0700\n\n" + + "GPG Signed commit\n"; + + var repo; + var commit; + + return NodeGit.Repository.open(reposPath) + .then(function(repoResult) { + repo = repoResult; + return Commit.createWithSignature( + repo, + commit_content, + signature, + "gpgsig"); + }) + .then(function(commitId) { + assert.equal(expectedCommitId, commitId); + return NodeGit.Commit.lookup(repo, commitId); + }) + .then(function(commitResult) { + commit = commitResult; + return commit.getSignature(); + }) + .then(function(signatureInfoDefault) { + assert.equal(signature, signatureInfoDefault.signature); + assert.equal(commit_content, signatureInfoDefault.signedData); + + return commit.getSignature("gpgsig"); + }) + .then(function(signatureInfo) { + assert.equal(signature, signatureInfo.signature); + assert.equal(commit_content, signatureInfo.signedData); + }); + }); + + it("Can retrieve the gpg signature from a commit", function() { + var expectedSignedData = + "tree f4661419a6fbbe865f78644fec722c023ce4b65f\n" + + "parent 32789a79e71fbc9e04d3eff7425e1771eb595150\n" + + "author Tyler Ang-Wanek 1521227848 -0700\n" + + "committer Tyler Ang-Wanek 1521227848 -0700\n\n" + + "GPG Signed commit\n"; + + var expectedSignature = + "-----BEGIN PGP SIGNATURE-----\n\n" + + "iQEcBAABCAAGBQJarBhIAAoJEE8pfTd/81lKQA4IAL8Mu5kc4B/MX9s4XB26Ahap\n" + + "n06kCx3RQ1KHMZIRomAjCnb48WieNVuy1y+Ut0RgfCxxrJ1ZnzFG3kF2bIKwIxNI\n" + + "tYIC76iWny+mrVnb2mjKYjn/3F4c4VJGENq9ITiV1WeE4yJ8dHw2ox2D+hACzTvQ\n" + + "KVroedk8BDFJxS6DFb20To35xbAVhwBnAGRcII4Wi5PPMFpqAhGLfq3Czv95ddSz\n" + + "BHlyp27+YWSpV0Og0dqOEhsdDYaPrOBGRcoRiqjue+l5tgK/QerLFZ4aovZzpuEP\n" + + "Xx1yZfqXIiy4Bo40qScSrdnmnp/kMq/NQGR3jYU+SleFHVKNFsya9UwurMaezY0=\n" + + "=eZzi\n-----END PGP SIGNATURE-----"; + + return NodeGit.Commit.lookup( + this.repository, + "cc1401eaac4e9e77190e98a9353b305f0c6313d8" + ) + .then(function(commit) { + return commit.getSignature(); + }) + .then(function(extractSignature) { + assert.equal( + extractSignature.signature, + expectedSignature + ); + assert.equal( + extractSignature.signedData, + expectedSignedData + ); + }); + }); + + it("Can be optionally skipped to create without signature", function() { + const onSignature = () => ({ + code: NodeGit.Error.CODE.PASSTHROUGH + }); + + var test = this; + var expectedCommitId = "c9bffe040519231d32431c101bca4efc0917f64c"; + var fileName = "newfile.txt"; + var fileContent = "hello world"; + + var repo; + var index; + var treeOid; + var parent; + + return NodeGit.Repository.open(reposPath) + .then(function(repoResult) { + repo = repoResult; + return fse.writeFile(path.join(repo.workdir(), fileName), fileContent); + }) + .then(function() { + return repo.refreshIndex(); + }) + .then(function(indexResult) { + index = indexResult; + }) + .then(function() { + return index.addByPath(fileName); + }) + .then(function() { + return index.write(); + }) + .then(function() { + return index.writeTree(); + }) + .then(function(oidResult) { + treeOid = oidResult; + return NodeGit.Reference.nameToId(repo, "HEAD"); + }) + .then(function(head) { + return repo.getCommit(head); + }) + .then(function(parentResult) { + parent = parentResult; + return Promise.all([ + NodeGit.Signature.create("Foo Bar", "foo@bar.com", 123456789, 60), + NodeGit.Signature.create("Foo A Bar", "foo@bar.com", 987654321, 90) + ]); + }) + .then(function(signatures) { + var author = signatures[0]; + var committer = signatures[1]; + + return repo.createCommitWithSignature( + null, + author, + committer, + "message", + treeOid, + [parent], + onSignature + ); + }) + .then(function(commitId) { + assert.equal(expectedCommitId, commitId); + return NodeGit.Commit.lookup(repo, commitId); + }) + .then(function(commit) { + return commit.getSignature("gpgsig") + .then(function() { + assert.fail("Should not have been able to retrieve gpgsig"); + }, function(error) { + if (error && error.message === "this commit is not signed") { + return; + } + throw error; + }); + }) + .then(function() { + return reinitialize(test); + }, function(reason) { + return reinitialize(test) + .then(function() { + return Promise.reject(reason); + }); + }); + }); + + it("Will throw if the signing cb returns an error code", function() { + const onSignature = () => ({ + code: NodeGit.Error.CODE.ERROR + }); + + var test = this; + var fileName = "newfile.txt"; + var fileContent = "hello world"; + + var repo; + var index; + var treeOid; + var parent; + + return NodeGit.Repository.open(reposPath) + .then(function(repoResult) { + repo = repoResult; + return fse.writeFile(path.join(repo.workdir(), fileName), fileContent); + }) + .then(function() { + return repo.refreshIndex(); + }) + .then(function(indexResult) { + index = indexResult; + }) + .then(function() { + return index.addByPath(fileName); + }) + .then(function() { + return index.write(); + }) + .then(function() { + return index.writeTree(); + }) + .then(function(oidResult) { + treeOid = oidResult; + return NodeGit.Reference.nameToId(repo, "HEAD"); + }) + .then(function(head) { + return repo.getCommit(head); + }) + .then(function(parentResult) { + parent = parentResult; + return Promise.all([ + NodeGit.Signature.create("Foo Bar", "foo@bar.com", 123456789, 60), + NodeGit.Signature.create("Foo A Bar", "foo@bar.com", 987654321, 90) + ]); + }) + .then(function(signatures) { + var author = signatures[0]; + var committer = signatures[1]; + + return repo.createCommitWithSignature( + null, + author, + committer, + "message", + treeOid, + [parent], + onSignature + ); + }) + .then(function() { + assert.fail("createCommitWithSignature should have failed."); + }, function(error) { + if (error && error.errno === NodeGit.Error.CODE.ERROR) { + return; + } + throw error; + }) + .then(function() { + return reinitialize(test); + }, function(reason) { + return reinitialize(test) + .then(function() { + return Promise.reject(reason); + }); + }); + }); + }); }); diff --git a/test/tests/config.js b/test/tests/config.js index 15e20b6e7f..bc4b802f37 100644 --- a/test/tests/config.js +++ b/test/tests/config.js @@ -1,18 +1,109 @@ var assert = require("assert"); var path = require("path"); var local = path.join.bind(path, __dirname); -var promisify = require("promisify-node"); -// Have to wrap exec, since it has a weird callback signature. -var exec = promisify(function(command, opts, callback) { - return require("child_process").exec(command, opts, callback); -}); +var exec = require("../../utils/execPromise"); describe("Config", function() { var NodeGit = require("../../"); + var Repository = NodeGit.Repository; + var Config = NodeGit.Config; var reposPath = local("../repos/workdir"); + describe("openOnDisk", function() { + var configPath = path.join(reposPath, ".git/config"); + + it("opens the same config as the repo", function() { + var repo; + var onDiskConfig; + return Repository.open(reposPath) + .then(function(_repo) { + repo = _repo; + return Config.openOndisk(configPath); + }) + .then(function(config) { + onDiskConfig = config; + return repo.config(); + }) + .then(function(repoConfig) { + return Promise.all([ + onDiskConfig.getString("core.filemode"), + onDiskConfig.getString("core.bare"), + repoConfig.getString("core.filemode"), + repoConfig.getString("core.bare") + ]); + }) + .then(function(results) { + var onDiskFileMode = results[0]; + var onDiskBare = results[1]; + var repoFileMode = results[2]; + var repoBare = results[3]; + + assert.equal(onDiskFileMode, repoFileMode); + assert.equal(onDiskBare, repoBare); + }); + }); + + it("opens the config and can change a value", function() { + var repo; + var onDiskConfig; + var repoConfig; + var originalFileMode; + return Repository.open(reposPath) + .then(function(_repo) { + repo = _repo; + return Config.openOndisk(configPath); + }) + .then(function(config) { + onDiskConfig = config; + return repo.config(); + }) + .then(function(_repoConfig) { + repoConfig = _repoConfig; + return Promise.all([ + onDiskConfig.getString("core.filemode"), + repoConfig.getString("core.filemode") + ]); + }) + .then(function(results) { + var onDiskFileMode = results[0]; + var repoFileMode = results[1]; + + assert.equal(onDiskFileMode, repoFileMode); + originalFileMode = onDiskFileMode; + var oppositeFileMode = onDiskFileMode === "true" ? "false" : "true"; + + return onDiskConfig.setString( + "core.filemode", + oppositeFileMode + ); + }) + .then(function() { + return Config.openOndisk(configPath); + }) + .then(function(config) { + return Promise.all([ + config.getString("core.filemode"), + repoConfig.getString("core.filemode") + ]); + }) + .then(function(results) { + var onDiskFileMode = results[0]; + var repoFileMode = results[1]; + assert.notEqual(onDiskFileMode, originalFileMode); + assert.equal(onDiskFileMode, repoFileMode); + }) + .then(function() { + // cleanup + return onDiskConfig.setString( + "core.filemode", + originalFileMode + ); + }); + }); + }); + it("can get and set a global value", function() { var savedUserName; @@ -45,6 +136,18 @@ describe("Config", function() { }); }); + it("will reject when getting value of non-existent config key", function() { + // Test initially for finding source of a segfault. There was a problem + // where getting an empty config value crashes nodegit. + return NodeGit.Config.openDefault() + .then(function(config) { + return config.getString("user.fakevalue"); + }) + .catch(function (e) { + return true; + }); + }); + it("can get and set a repo config value", function() { var savedUserName; @@ -84,4 +187,24 @@ describe("Config", function() { }); }); }); + + describe("getPath", function() { + it("can get path for a given config", function() { + return NodeGit.Repository.open(reposPath) + .then(function(repo) { + return repo.config(); + }) + .then(function(config) { + return Promise.all([ + config.getPath("core.filemode"), + config.getString("core.filemode") + ]); + }) + .then(function(results) { + var localFilemode = results[0]; + var repoFilemode = results[1]; + assert.equal(localFilemode, repoFilemode); + }); + }); + }); }); diff --git a/test/tests/convenient_line.js b/test/tests/convenient_line.js new file mode 100644 index 0000000000..994041cb45 --- /dev/null +++ b/test/tests/convenient_line.js @@ -0,0 +1,68 @@ +var assert = require("assert"); +var repoSetup = require("../utils/repository_setup"); +var fse = require("fs-extra"); +var path = require("path"); +var local = path.join.bind(path, __dirname); + +describe("ConvenientLine", function() { + var repoPath = local("../repos/convenientLineTest"); + var unicodeLine = "Ťḥ𝖎ṧ â„“á»đť“ệ çǒ𝚗ẗảḭṋṦ Ă›đť§Ç𝗰ṓḍ𝔢\n"; + var asciiLine = "but this line doesn't\n"; + + beforeEach(function() { + var test = this; + + return repoSetup.createRepository(repoPath) + .then(function(repo) { + return repoSetup.commitFileToRepo( + repo, + "fileWithUnicodeChars", + unicodeLine + asciiLine + ); + }) + .then(function(commit) { + return commit.getDiff(); + }) + .then(function(diff) { + return diff[0].patches(); + }) + .then(function(patches) { + return patches[0].hunks(); + }) + .then(function(hunks) { + return hunks[0].lines(); + }) + .then(function(lines) { + test.unicodeLine = lines[0]; + test.asciiLine = lines[1]; + }); + }); + + after(function() { + return fse.remove(repoPath); + }); + + it("can parse the byte length of a unicode string", function() { + var line = this.unicodeLine; + + assert.equal(line.contentLen(), Buffer.byteLength(unicodeLine, "utf8")); + }); + + it("can get a line that contains unicode", function() { + var line = this.unicodeLine; + + assert.equal(line.content(), unicodeLine); + }); + + it("can parse the byte length of a ascii string", function() { + var line = this.asciiLine; + + assert.equal(line.contentLen(), Buffer.byteLength(asciiLine, "utf8")); + }); + + it("can get a line that contains ascii", function() { + var line = this.asciiLine; + + assert.equal(line.content(), asciiLine); + }); +}); diff --git a/test/tests/cred.js b/test/tests/cred.js index 28e48ef482..eee98d69bd 100644 --- a/test/tests/cred.js +++ b/test/tests/cred.js @@ -1,31 +1,73 @@ var assert = require("assert"); var path = require("path"); +var fs = require("fs"); var local = path.join.bind(path, __dirname); describe("Cred", function() { var NodeGit = require("../../"); - + var sshPublicKey = local("../id_rsa.pub"); var sshPrivateKey = local("../id_rsa"); it("can create default credentials", function() { - var defaultCreds = NodeGit.Cred.defaultNew(); - assert.ok(defaultCreds instanceof NodeGit.Cred); + var defaultCreds = NodeGit.Credential.defaultNew(); + assert.ok(defaultCreds instanceof NodeGit.Credential); }); it("can create ssh credentials using passed keys", function() { - var cred = NodeGit.Cred.sshKeyNew( + var cred = NodeGit.Credential.sshKeyNew( "username", sshPublicKey, sshPrivateKey, ""); - assert.ok(cred instanceof NodeGit.Cred); + assert.ok(cred instanceof NodeGit.Credential); + }); + + it("can create ssh credentials using passed keys in memory", function() { + var publicKeyContents = fs.readFileSync(sshPublicKey, { + encoding: "ascii" + }); + var privateKeyContents = fs.readFileSync(sshPrivateKey, { + encoding: "ascii" + }); + + return NodeGit.Credential.sshKeyMemoryNew( + "username", + publicKeyContents, + privateKeyContents, + "").then(function(cred) { + assert.ok(cred instanceof NodeGit.Credential); + }); }); it("can create credentials using plaintext", function() { - var plaintextCreds = NodeGit.Cred.userpassPlaintextNew + var plaintextCreds = NodeGit.Credential.userpassPlaintextNew + ("username", "password"); + assert.ok(plaintextCreds instanceof NodeGit.Credential); + }); + + it("can create credentials using agent", function() { + var fromAgentCreds = NodeGit.Credential.sshKeyFromAgent + ("username"); + assert.ok(fromAgentCreds instanceof NodeGit.Credential); + }); + + it("can create credentials using username", function() { + return NodeGit.Credential.usernameNew + ("username").then(function(cred) { + assert.ok(cred instanceof NodeGit.Credential); + }); + }); + + it("can return 1 if a username exists", function() { + var plaintextCreds = NodeGit.Credential.userpassPlaintextNew ("username", "password"); - assert.ok(plaintextCreds instanceof NodeGit.Cred); + assert.ok(plaintextCreds.hasUsername() === 1); + }); + + it("can return 0 if a username does not exist", function() { + var defaultCreds = NodeGit.Credential.defaultNew(); + assert.ok(defaultCreds.hasUsername() === 0); }); }); diff --git a/test/tests/diff.js b/test/tests/diff.js index 83fab71b6d..9fd483c388 100644 --- a/test/tests/diff.js +++ b/test/tests/diff.js @@ -1,14 +1,36 @@ var assert = require("assert"); var path = require("path"); -var promisify = require("promisify-node"); -var Promise = require("nodegit-promise"); -var fse = promisify(require("fs-extra")); +var _ = require("lodash"); +var fse = require("fs-extra"); var local = path.join.bind(path, __dirname); +function getLinesFromDiff(diff) { + return diff.patches() + .then(function(patches) { + return Promise.all(_.map(patches, function(patch) { + return patch.hunks(); + })); + }) + .then(function(listsOfHunks) { + var hunks = _.flatten(listsOfHunks); + return Promise.all(_.map(hunks, function(hunk) { + return hunk.lines(); + })); + }) + .then(function(listsOfLines) { + var lines = _.flatten(listsOfLines); + return _.map(lines, function(line) { + return line.content(); + }); + }); +} + describe("Diff", function() { var NodeGit = require("../../"); var Repository = NodeGit.Repository; var Diff = NodeGit.Diff; + var Blob = NodeGit.Blob; + var Index = NodeGit.Index; var reposPath = local("../repos/workdir"); var oid = "fce88902e66c72b5b93e75bdb5ae717038b221f6"; @@ -27,7 +49,7 @@ describe("Diff", function() { return Repository.open(reposPath).then(function(repository) { test.repository = repository; - return repository.openIndex(); + return repository.refreshIndex(); }) .then(function(index) { test.index = index; @@ -90,7 +112,7 @@ describe("Diff", function() { }); }); - it("can walk a DiffList", function() { + it("can walk an Array", function() { return this.diff[0].patches() .then(function(patches) { var patch = patches[0]; @@ -115,16 +137,16 @@ describe("Diff", function() { var oldContent = "__Before submitting a pull request, please ensure " + "both unit tests and lint checks pass.__\n"; - assert.equal(lines[3].rawContent(), oldContent); + assert.equal(lines[3].content(), oldContent); assert.equal(lines[3].origin(), Diff.LINE.DELETION); - assert.equal(lines[3].contentLen(), 90); + assert.equal(lines[3].content().length, oldContent.length); var newContent = "__Before submitting a pull request, please ensure " + "both that you've added unit tests to cover your shiny new code, " + "and that all unit tests and lint checks pass.__\n"; - assert.equal(lines[4].rawContent(), newContent); + assert.equal(lines[4].content(), newContent); assert.equal(lines[4].origin(), Diff.LINE.ADDITION); - assert.equal(lines[4].contentLen(), 162); + assert.equal(lines[4].content().length, newContent.length); }); }); @@ -134,17 +156,17 @@ describe("Diff", function() { assert.equal(patches.length, 3); assert(patches[2].isUntracked()); - var oldFile = patches[2].delta.oldFile(); + var oldFile = patches[2].oldFile(); assert.equal(oldFile.path(), "wddiff.txt"); assert.equal(oldFile.size(), 0); - var newFile = patches[2].delta.newFile(); + var newFile = patches[2].newFile(); assert.equal(newFile.path(), "wddiff.txt"); assert.equal(newFile.size(), 23); }); }); - it("can resolve individual line chages from the patch hunks", function() { + it("can resolve individual line changes from the patch hunks", function() { return this.workdirDiff.patches() .then(function(patches) { var result = []; @@ -182,7 +204,7 @@ describe("Diff", function() { }) .then(function(lines) { lines.forEach(function(line) { - assert(!/\n/.exec(line.content())); + assert(/\n/.exec(line.content())); assert(/\n/.exec(line.rawContent())); }); }); @@ -221,6 +243,36 @@ describe("Diff", function() { }); }); + it("can diff the contents of a file to a string with unicode characters", + function(done) { + var evilString = "Unicode’s fun!\nAnd it’s good for you!\n"; + var buffer = Buffer.from(evilString); + var test = this; + Blob.createFromBuffer(test.repository, buffer, buffer.length) + .then(function(oid) { + return Blob.lookup(test.repository, oid); + }) + .then(function(blob) { + blob.repo = test.repository; + return Diff.blobToBuffer( + blob, + null, + evilString, + null, + null, + null, + null, + function(delta, hunk, payload) { + assert.fail( + "There aren't any changes so this shouldn't be called."); + done(); + }); + }) + .then(function() { + done(); + }); + }); + it("can diff with a null tree", function() { var repo = this.repository; var tree = this.masterCommitTree; @@ -229,7 +281,11 @@ describe("Diff", function() { return diff.patches(); }) .then(function(patches) { - assert.equal(patches.length, 84); + // Number of patches returned is 84 or 85 depending + // on something unknown at this time. Hopefully we can + // eventually resolve the root cause of the difference. + // https://github.com/nodegit/nodegit/issues/746 + assert.ok(patches.length === 84 || patches.length === 85); }); }); @@ -270,6 +326,168 @@ describe("Diff", function() { }); }); + it("can pass undefined pathspec as option to indexToWorkdir", function() { + var test = this; + + return Repository.open(reposPath).then(function(repository) { + test.repository = repository; + + return repository.refreshIndex(); + }) + .then(function(index) { + test.index = index; + + return test.repository.getBranchCommit("master"); + }) + .then(function() { + var opts = { + flags: Diff.OPTION.INCLUDE_UNTRACKED | + Diff.OPTION.RECURSE_UNTRACKED_DIRS, + pathspec: undefined + }; + + // should not segfault + return Diff.indexToWorkdir(test.repository, test.index, opts); + }); + }); + + + it("can merge two commit diffs", function() { + var linesOfFirstDiff; + var linesOfSecondDiff; + var firstDiff = this.diff[0]; + var secondDiff; + var oid = "c88d39e70585199425b111c6a2c7fa7b4bc617ad"; + return this.repository.getCommit(oid) + .then(function(testCommit) { + return testCommit.getDiff(); + }) + .then(function(_secondDiff) { + secondDiff = _secondDiff[0]; + return Promise.all([ + getLinesFromDiff(firstDiff), + getLinesFromDiff(secondDiff) + ]); + }) + .then(function(listOfLines) { + linesOfFirstDiff = listOfLines[0]; + linesOfSecondDiff = listOfLines[1]; + return firstDiff.merge(secondDiff); + }) + .then(function() { + return getLinesFromDiff(firstDiff); + }) + .then(function(linesOfMergedDiff) { + var allDiffLines = _.flatten([ + linesOfFirstDiff, + linesOfSecondDiff + ]); + _.forEach(allDiffLines, function(diffLine) { + assert.ok(_.includes(linesOfMergedDiff, diffLine)); + }); + }); + }); + + describe("merge between commit diff and workdir and index diff", function() { + beforeEach(function() { + var test = this; + return fse.writeFile( + path.join(test.repository.workdir(), "newFile.txt"), "some line\n" + ) + .then(function() { + return test.index.addAll(undefined, undefined, function() { + // ensure that there is no deadlock if we call + // a sync libgit2 function from the callback + test.repository.path(); + + return 0; // confirm add + }); + }) + .then(function() { + return test.repository.getHeadCommit(); + }) + .then(function(headCommit) { + return Promise.all([ + headCommit.getTree(), + test.repository.index() + ]); + }) + .then(function([headTree, index]) { + const diffOptions = new NodeGit.DiffOptions(); + if (index.caps() & Index.CAPABILITY.IGNORE_CASE !== 0) { + diffOptions.flags |= Diff.OPTION.IGNORE_CASE; + } + + return Promise.all([ + Diff.treeToWorkdirWithIndex(test.repository, headTree, diffOptions), + test.commit.getDiffWithOptions(diffOptions) + ]); + }) + .then(function(diffs) { + test.workDirWithIndexDiff = diffs[0]; + // The second item in `diffs` is the commit diff which contains and + // array of diffs, one for each parent + test.commitDiff = diffs[1][0]; + }); + }); + + it("can merge a diff from a commit into a diff from a work dir and index", + function() { + var test = this; + var linesOfWorkDirWithIndexDiff; + var linesOfCommitDiff; + return Promise.all([ + getLinesFromDiff(test.workDirWithIndexDiff), + getLinesFromDiff(test.commitDiff) + ]) + .then(function(linesOfDiffs) { + linesOfWorkDirWithIndexDiff = linesOfDiffs[0]; + linesOfCommitDiff = linesOfDiffs[1]; + return test.workDirWithIndexDiff.merge(test.commitDiff); + }) + .then(function() { + return getLinesFromDiff(test.workDirWithIndexDiff); + }) + .then(function(linesOfMergedDiff) { + var allDiffLines = _.flatten([ + linesOfWorkDirWithIndexDiff, + linesOfCommitDiff + ]); + _.forEach(allDiffLines, function(diffLine) { + assert.ok(_.includes(linesOfMergedDiff, diffLine)); + }); + }); + }); + + it("can merge a diff from a workdir and index into a diff from a commit", + function() { + var test = this; + var linesOfWorkDirWithIndexDiff; + var linesOfCommitDiff; + return Promise.all([ + getLinesFromDiff(test.workDirWithIndexDiff), + getLinesFromDiff(test.commitDiff) + ]) + .then(function(linesOfDiffs) { + linesOfWorkDirWithIndexDiff = linesOfDiffs[0]; + linesOfCommitDiff = linesOfDiffs[1]; + return test.commitDiff.merge(test.workDirWithIndexDiff); + }) + .then(function() { + return getLinesFromDiff(test.commitDiff); + }) + .then(function(linesOfMergedDiff) { + var allDiffLines = _.flatten([ + linesOfWorkDirWithIndexDiff, + linesOfCommitDiff + ]); + _.forEach(allDiffLines, function(diffLine) { + assert.ok(_.includes(linesOfMergedDiff, diffLine)); + }); + }); + }); + }); + // This wasn't working before. It was only passing because the promise chain // was broken it.skip("can find similar files in a diff", function() { diff --git a/test/tests/filter.js b/test/tests/filter.js new file mode 100644 index 0000000000..06e138ba5d --- /dev/null +++ b/test/tests/filter.js @@ -0,0 +1,844 @@ +var assert = require("assert"); +var fse = require("fs-extra"); +var path = require("path"); +var local = path.join.bind(path, __dirname); +var garbageCollect = require("../utils/garbage_collect.js"); + +describe("Filter", function() { + var NodeGit = require("../../"); + + var emptyRepoPath = local("../repos/empty"); + var filterName = "psuedo_filter"; + var Registry = NodeGit.FilterRegistry; + var Checkout = NodeGit.Checkout; + var Repository = NodeGit.Repository; + var FilterList = NodeGit.FilterList; + var reposPath = local("../repos/workdir"); + + var packageJsonPath = path.join(reposPath, "package.json"); + var readmePath = path.join(reposPath, "README.md"); + + var mockFilter = { + apply: function() {}, + check: function() {} + }; + + function commitFile(repo, fileName, fileContent, commitMessage) { + let index; + let treeOid; + let parent; + + return fse.writeFile(path.join(repo.workdir(), fileName), fileContent) + .then(function() { + return repo.refreshIndex(); + }) + .then(function(indexResult) { + index = indexResult; + }) + .then(function() { + return index.addByPath(fileName); + }) + .then(function() { + return index.write(); + }) + .then(function() { + return index.writeTree(); + }) + .then(function(oidResult) { + treeOid = oidResult; + return NodeGit.Reference.nameToId(repo, "HEAD"); + }) + .then(function(head) { + return repo.getCommit(head); + }) + .then(function(parentResult) { + parent = parentResult; + return Promise.all([ + NodeGit.Signature.create("Foo Bar", "foo@bar.com", 123456789, 60), + NodeGit.Signature.create("Foo A Bar", "foo@bar.com", 987654321, 90) + ]); + }) + .then(function(signatures) { + let author = signatures[0]; + let committer = signatures[1]; + + return repo.createCommit( + "HEAD", + author, + committer, + commitMessage, + treeOid, + [parent] + ); + }); + } + + beforeEach(function() { + var test = this; + + return Repository.open(reposPath) + .then(function(repository) { + test.repository = repository; + return Repository.open(emptyRepoPath); + }) + .then(function(emptyRepo) { + test.emptyRepo = emptyRepo; + return fse.writeFile( + path.join(reposPath, ".gitattributes"), + "*.md filter=" + filterName + " -text", + { encoding: "utf-8" } + ); + }); + }); + + afterEach(function() { + return Registry.unregister(filterName) + .catch(function(error) { + if (error === NodeGit.Error.CODE.ERROR) { + throw new Error("Cannot unregister filter"); + } + }); + }); + + describe("Register", function() { + var secondFilter = "hellofilter"; + + after(function(done) { + Registry.unregister(secondFilter) + .then(function() { + done(); + }); + }); + + it("can register a filter", function() { + return Registry.register(filterName, mockFilter, 0) + .then(function(result) { + assert.strictEqual(result, NodeGit.Error.CODE.OK); + }); + }); + + it("can register multiple filters", function() { + return Registry.register(filterName, mockFilter, 0) + .then(function(result) { + assert.strictEqual(result, NodeGit.Error.CODE.OK); + return Registry.register(secondFilter, mockFilter, 1); + }) + .then(function(result) { + assert.strictEqual(result, NodeGit.Error.CODE.OK); + }); + }); + + it("cannot register the same filter twice", function() { + return Registry.register(filterName, mockFilter, 0) + .then(function(result) { + assert.strictEqual(result, NodeGit.Error.CODE.OK); + return Registry.register(filterName, mockFilter, 0); + }) + .catch(function(error) { + assert.strictEqual(error.errno, NodeGit.Error.CODE.EEXISTS); + }); + }); + }); + + describe("Unregister", function() { + beforeEach(function() { + return Registry.register(filterName, mockFilter, 0); + }); + + it("can unregister the filter", function() { + return Registry.unregister(filterName) + .then(function(result) { + assert.strictEqual(result, NodeGit.Error.CODE.OK); + }); + }); + + it("cannot unregister the filter twice", function() { + return Registry.unregister(filterName) + .then(function(result) { + assert.strictEqual(result, NodeGit.Error.CODE.OK); + return Registry.unregister(filterName); + }) + .then(function(result) { + assert.fail("Should not have unregistered successfully"); + }) + .catch(function(error) { + assert.strictEqual(error.errno, NodeGit.Error.CODE.ENOTFOUND); + }); + }); + }); + + describe("Apply", function() { + before(function() { + var test = this; + return fse.readFile(readmePath, "utf8") + .then((function(content) { + test.originalReadmeContent = content; + })); + }); + + afterEach(function() { + this.timeout(15000); + return fse.writeFile(readmePath, this.originalReadmeContent); + }); + + var message = "some new fancy filter"; + var length = message.length; + var tempBuffer = Buffer.from(message, "utf-8"); + var largeBufferSize = 500000000; + + it("should not apply when check returns GIT_PASSTHROUGH", function(){ + var test = this; + var applied = false; + + return Registry.register(filterName, { + apply: function() { + applied = true; + }, + check: function() { + return NodeGit.Error.CODE.PASSTHROUGH; + } + }, 0) + .then(function(result) { + assert.strictEqual(result, NodeGit.Error.CODE.OK); + return fse.writeFile( + packageJsonPath, + "Changing content to trigger checkout", + { encoding: "utf-8" } + ); + }) + .then(function() { + var opts = { + checkoutStrategy: Checkout.STRATEGY.FORCE, + paths: "package.json" + }; + return Checkout.head(test.repository, opts); + }) + .then(function() { + assert.notStrictEqual(applied, true); + }); + }); + + it("should apply filter when check succeeds", function() { + var test = this; + var applied = false; + + return Registry.register(filterName, { + apply: function() { + applied = true; + }, + check: function() { + return NodeGit.Error.CODE.OK; + } + }, 0) + .then(function(result) { + assert.strictEqual(result, NodeGit.Error.CODE.OK); + return fse.writeFile( + packageJsonPath, + "Changing content to trigger checkout", + { encoding: "utf-8" } + ); + }) + .then(function() { + var opts = { + checkoutStrategy: Checkout.STRATEGY.FORCE, + paths: "package.json" + }; + return Checkout.head(test.repository, opts); + }) + .then(function() { + assert.strictEqual(applied, true); + }); + }); + + it("does not apply when GIT_PASSTHROUGH is returned", function() { + var test = this; + + return Registry.register(filterName, { + apply: function(to, from, source) { + to.set(tempBuffer, length); + return NodeGit.Error.CODE.PASSTHROUGH; + }, + check: function() { + return NodeGit.Error.CODE.OK; + } + }, 0) + .then(function(result) { + assert.strictEqual(result, NodeGit.Error.CODE.OK); + }) + .then(function() { + var readmeContent = fse.readFileSync( + packageJsonPath, + "utf-8" + ); + assert.notStrictEqual(readmeContent, message); + + return fse.writeFile( + packageJsonPath, + "Changing content to trigger checkout" + ); + }) + .then(function() { + var opts = { + checkoutStrategy: Checkout.STRATEGY.FORCE, + paths: "package.json" + }; + return Checkout.head(test.repository, opts); + }) + .then(function() { + var postInitializeReadmeContents = fse.readFileSync( + readmePath, + "utf-8" + ); + + assert.notStrictEqual(postInitializeReadmeContents, message); + }); + }); + + it("applies the filter data on checkout", function() { + var test = this; + + return Registry.register(filterName, { + apply: function(to, from, source) { + to.set(tempBuffer, length); + return NodeGit.Error.CODE.OK; + }, + check: function(src, attr) { + return NodeGit.Error.CODE.OK; + } + }, 0) + .then(function(result) { + assert.strictEqual(result, 0); + }) + .then(function() { + var readmeContent = fse.readFileSync( + readmePath, + "utf-8" + ); + assert.notStrictEqual(readmeContent, message); + fse.writeFileSync(readmePath, "whoa", "utf8"); + + var opts = { + checkoutStrategy: Checkout.STRATEGY.FORCE, + paths: ["README.md"] + }; + return Checkout.head(test.repository, opts); + }) + .then(function() { + var postInitializeReadmeContents = fse.readFileSync( + readmePath, + "utf-8" + ); + + assert.strictEqual(postInitializeReadmeContents, message); + }); + }); + + it("can run sync callback on checkout without deadlocking", function() { // jshint ignore:line + var test = this; + var syncCallbackResult = 1; + + return Registry.register(filterName, { + apply: function() { + syncCallbackResult = test.repository.isEmpty(); + }, + check: function() { + return NodeGit.Error.CODE.OK; + } + }, 0) + .then(function(result) { + assert.strictEqual(result, NodeGit.Error.CODE.OK); + return fse.writeFile( + packageJsonPath, + "Changing content to trigger checkout", + { encoding: "utf-8" } + ); + }) + .then(function() { + var opts = { + checkoutStrategy: Checkout.STRATEGY.FORCE, + paths: "package.json" + }; + return Checkout.head(test.repository, opts); + }) + .then(function() { + assert.strictEqual(syncCallbackResult, 0); + }); + }); + + // Temporary workaround for LFS checkout. Test skipped. + // To activate when reverting workaround. + // 'Checkout.head' and 'Submodule.lookup' do work with the repo locked. + // They should work together without deadlocking. + it.skip("can run async callback on checkout without deadlocking", function() { // jshint ignore:line + var test = this; + var submoduleNameIn = "vendor/libgit2"; + var asyncCallbackResult = ""; + + return Registry.register(filterName, { + apply: function() { + return NodeGit.Submodule.lookup(test.repository, submoduleNameIn) + .then(function(submodule) { + return submodule.name(); + }) + .then(function(name) { + asyncCallbackResult = name; + return NodeGit.Error.CODE.OK; + }); + }, + check: function() { + return NodeGit.Error.CODE.OK; + } + }, 0) + .then(function(result) { + assert.strictEqual(result, NodeGit.Error.CODE.OK); + return fse.writeFile( + packageJsonPath, + "Changing content to trigger checkout", + { encoding: "utf-8" } + ); + }) + .then(function() { + var opts = { + checkoutStrategy: Checkout.STRATEGY.FORCE, + paths: "package.json" + }; + return Checkout.head(test.repository, opts); + }) + .then(function() { + assert.equal(asyncCallbackResult, submoduleNameIn); + }); + }); + + // this test is useless on 32 bit CI, because we cannot construct + // a buffer big enough to test anything of significance :)... + if (process.arch === "x64") { + it("applies the massive filter data on checkout", function() { + this.timeout(350000); + var test = this; + var largeBuffer = Buffer.alloc(largeBufferSize, "a"); + + return Registry.register(filterName, { + apply: function(to, from, source) { + to.set(largeBuffer, largeBufferSize); + return NodeGit.Error.CODE.OK; + }, + check: function(src, attr) { + return NodeGit.Error.CODE.OK; + } + }, 0) + .then(function(result) { + assert.strictEqual(result, 0); + }) + .then(function() { + var fd = fse.openSync(readmePath, "r"); + var readBuf = Buffer.allocUnsafe(largeBufferSize); + var readLength = fse.readSync( + fd, + readBuf, + 0, + largeBufferSize, + 0 + ); + fse.closeSync(fd); + + assert.notStrictEqual(readLength, largeBufferSize); + fse.writeFileSync(readmePath, "whoa", "utf8"); + + var opts = { + checkoutStrategy: Checkout.STRATEGY.FORCE, + paths: ["README.md"] + }; + return Checkout.head(test.repository, opts); + }) + .then(function() { + var fd = fse.openSync(readmePath, "r"); + var readBuf = Buffer.allocUnsafe(largeBufferSize); + var readLength = fse.readSync( + fd, + readBuf, + 0, + largeBufferSize, + 0 + ); + fse.closeSync(fd); + + assert.strictEqual( + readLength, + largeBufferSize + ); + }); + }); + } + + it("applies the filter data on checkout with gc", function() { + var test = this; + + return Registry.register(filterName, { + apply: function(to, from, source) { + to.set(tempBuffer, length); + return NodeGit.Error.CODE.OK; + }, + check: function(src, attr) { + return NodeGit.Error.CODE.OK; + } + }, 0) + .then(function(result) { + assert.strictEqual(result, NodeGit.Error.CODE.OK); + }) + .then(function() { + var readmeContent = fse.readFileSync( + readmePath, + "utf-8" + ); + assert.notStrictEqual(readmeContent, message); + fse.writeFileSync(readmePath, "whoa", "utf8"); + garbageCollect(); + + var opts = { + checkoutStrategy: Checkout.STRATEGY.FORCE, + paths: ["README.md"] + }; + return Checkout.head(test.repository, opts); + }) + .then(function() { + var postInitializeReadmeContents = fse.readFileSync( + readmePath, + "utf-8" + ); + + assert.strictEqual(postInitializeReadmeContents, message); + }); + }); + + it("applies the filter data on commit", function() { + var test = this; + + return Registry.register(filterName, { + apply: function(to, from, source) { + to.set(tempBuffer, length); + return NodeGit.Error.CODE.OK; + }, + check: function(src, attr) { + return src.path() === "README.md" ? + 0 : NodeGit.Error.CODE.PASSTHROUGH; + } + }, 0) + .then(function(result) { + assert.strictEqual(result, NodeGit.Error.CODE.OK); + }) + .then(function() { + var readmeContent = fse.readFileSync( + readmePath, + "utf-8" + ); + assert.notStrictEqual(readmeContent, "testing commit contents"); + }) + .then(function() { + return commitFile(test.repository, "README.md", + "testing commit contents", + "test commit" + ); + }) + .then(function(oid) { + return test.repository.getHeadCommit(); + }) + .then(function(commit) { + var postInitializeReadmeContents = fse.readFileSync( + readmePath, + "utf-8" + ); + + assert.strictEqual( + postInitializeReadmeContents, "testing commit contents" + ); + assert.strictEqual(commit.message(), "test commit"); + + return commit.getEntry("README.md"); + }) + .then(function(entry) { + assert.strictEqual(entry.isBlob(), true); + return entry.getBlob(); + }) + .then(function(blob) { + assert.strictEqual(blob.toString(), message); + }); + }); + + it("applies the filter data on commit with gc", function() { + var test = this; + + return Registry.register(filterName, { + apply: function(to, from, source) { + to.set(tempBuffer, length); + return NodeGit.Error.CODE.OK; + }, + check: function(src, attr) { + return src.path() === "README.md" ? + 0 : NodeGit.Error.CODE.PASSTHROUGH; + } + }, 0) + .then(function(result) { + garbageCollect(); + assert.strictEqual(result, NodeGit.Error.CODE.OK); + }) + .then(function() { + var readmeContent = fse.readFileSync( + readmePath, + "utf-8" + ); + assert.notStrictEqual(readmeContent, "testing commit contents"); + }) + .then(function() { + return commitFile(test.repository, "README.md", + "testing commit contents", + "test commit" + ); + }) + .then(function(oid) { + garbageCollect(); + return test.repository.getHeadCommit(); + }) + .then(function(commit) { + var postInitializeReadmeContents = fse.readFileSync( + readmePath, + "utf-8" + ); + + assert.strictEqual( + postInitializeReadmeContents, "testing commit contents" + ); + assert.strictEqual(commit.message(), "test commit"); + garbageCollect(); + + return commit.getEntry("README.md"); + }) + .then(function(entry) { + assert.strictEqual(entry.isBlob(), true); + return entry.getBlob(); + }) + .then(function(blob) { + assert.strictEqual(blob.toString(), message); + }); + }); + }); + + describe("Manually Apply", function() { + beforeEach(function() { + var test = this; + var opts = { + checkoutStrategy: Checkout.STRATEGY.FORCE, + paths: "README.md" + }; + return Checkout.head(test.repository, opts) + .then(() => fse.readFile(readmePath, "utf8")) + .then((function(content) { + test.originalReadmeContent = content; + })); + }); + + afterEach(function() { + this.timeout(15000); + return fse.writeFile(readmePath, this.originalReadmeContent); + }); + + var message = "This is the filtered content, friends"; + var length = message.length; + var tempBuffer = Buffer.from(message, "utf-8"); + + it("applies the filters for a path on demand", function() { + var test = this; + + return Registry.register(filterName, { + apply: function(to, from, source) { + to.set(tempBuffer, length); + return NodeGit.Error.CODE.OK; + }, + check: function(src, attr) { + return NodeGit.Error.CODE.OK; + } + }, 0) + .then(function(result) { + assert.strictEqual(result, 0); + }) + .then(function() { + var readmeContent = fse.readFileSync( + readmePath, + "utf-8" + ); + assert.notStrictEqual(readmeContent, message); + fse.writeFileSync(readmePath, "whoa", "utf8"); + + return FilterList.load( + test.repository, + null, + "README.md", + NodeGit.Filter.MODE.CLEAN, + NodeGit.Filter.FLAG.DEFAULT + ); + }) + .then(function(list) { + return list.applyToFile(test.repository, "README.md"); + }) + .then(function(content) { + assert.equal(content, message); + }); + }); + + it("applies the filters to a buffer on demand", function() { + var test = this; + + return Registry.register(filterName, { + apply: function(to, from, source) { + to.set(tempBuffer, length); + return NodeGit.Error.CODE.OK; + }, + check: function(src, attr) { + return NodeGit.Error.CODE.OK; + } + }, 0) + .then(function(result) { + assert.strictEqual(result, 0); + }) + .then(function() { + var readmeContent = fse.readFileSync( + readmePath, + "utf-8" + ); + assert.notStrictEqual(readmeContent, message); + fse.writeFileSync(readmePath, "whoa", "utf8"); + + return FilterList.load( + test.repository, + null, + "README.md", + NodeGit.Filter.MODE.CLEAN, + NodeGit.Filter.FLAG.DEFAULT + ); + }) + .then(function(list) { + /* jshint ignore:start */ + return list.applyToData(new String("garbo garbo garbo garbo")); + /* jshint ignore:end */ + }) + .then(function(content) { + assert.equal(content, message); + }); + }); + + it("applies the filters to a blob on demand", function() { + var test = this; + var list; + + return Registry.register(filterName, { + apply: function(to, from, source) { + to.set(tempBuffer, length); + return NodeGit.Error.CODE.OK; + }, + check: function(src, attr) { + return NodeGit.Error.CODE.OK; + } + }, 0) + .then(function(result) { + assert.strictEqual(result, 0); + }) + .then(function() { + var readmeContent = fse.readFileSync( + readmePath, + "utf-8" + ); + assert.notStrictEqual(readmeContent, message); + fse.writeFileSync(readmePath, "whoa", "utf8"); + + return FilterList.load( + test.repository, + null, + "README.md", + NodeGit.Filter.MODE.CLEAN, + NodeGit.Filter.FLAG.DEFAULT + ); + }) + .then(function(_list) { + list = _list; + + return test.repository.getHeadCommit(); + }) + .then(function(commit) { + return commit.getTree(); + }) + .then(function(tree) { + return tree.entryByPath("README.md"); + }) + .then(function(entry) { + return test.repository.getBlob(entry.id()); + }) + .then(function(blob) { + return list.applyToBlob(blob); + }) + .then(function(content) { + assert.equal(content, message); + list = null; + }); + }); + }); + + describe("FilterSource", function() { + var message = "some new fancy filter"; + + before(function() { + var test = this; + return fse.readFile(readmePath, "utf8") + .then((function(content) { + test.originalReadmeContent = content; + })); + }); + + afterEach(function() { + this.timeout(15000); + return fse.writeFile(readmePath, this.originalReadmeContent); + }); + + it("a FilterSource has an async repo getter", function() { + var test = this; + + return Registry.register(filterName, { + apply: function(to, from, source) { + return source.repo() + .then(function() { + return NodeGit.Error.CODE.PASSTHROUGH; + }); + }, + check: function(source) { + return source.repo() + .then(function() { + return NodeGit.Error.CODE.OK; + }); + } + }, 0) + .then(function(result) { + assert.strictEqual(result, NodeGit.Error.CODE.OK); + }) + .then(function() { + var readmeContent = fse.readFileSync( + packageJsonPath, + "utf-8" + ); + assert.notStrictEqual(readmeContent, message); + + return fse.writeFile( + packageJsonPath, + "Changing content to trigger checkout" + ); + }) + .then(function() { + var opts = { + checkoutStrategy: Checkout.STRATEGY.FORCE, + paths: "package.json" + }; + return Checkout.head(test.repository, opts); + }) + .then(function() { + garbageCollect(); + }); + }); + }); +}); diff --git a/test/tests/graph.js b/test/tests/graph.js index 10f4db12b9..87dcfda544 100644 --- a/test/tests/graph.js +++ b/test/tests/graph.js @@ -28,4 +28,51 @@ describe("Graph", function() { assert.equal(result.behind, 1); }); }); + + it("can tell if a commit is a descendant of another", function() { + return Graph.descendantOf( + this.repository, + "32789a79e71fbc9e04d3eff7425e1771eb595150", + "e0aeedcff0584ebe00aed2c03c8ecd10839df908" + ) + .then(function(result) { + assert.equal(result, 1); + }); + }); + + it("can tell if a commit is not a descendant of another", function() { + return Graph.descendantOf( + this.repository, + "1528a019c504c9b5a68dc7d83bb2a887eb2473af", + "32789a79e71fbc9e04d3eff7425e1771eb595150" + ) + .then(function(result) { + assert.equal(result, 0); + }); + }); + + it("descendantOf will error if provided bad commits", function() { + return Graph.descendantOf( + this.repository, + "81b06facd90fe7a6e9bbd9cee59736a79105b7be", + "26744fc697849d370246749b67ac43b792a4af0c" + ) + .catch(function(result) { + assert(~result.message.indexOf("object not found - no match for id")); + }); + }); + + it("can tell if a commit is reachable from any of a list of commits", function() { + return Graph.reachableFromAny( + this.repository, + "32789a79e71fbc9e04d3eff7425e1771eb595150", + [ + "1729c73906bb8467f4095c2f4044083016b4dfde", + "e0aeedcff0584ebe00aed2c03c8ecd10839df908" + ] + ) + .then(function(result) { + assert.equal(result, 0); + }); + }); }); diff --git a/test/tests/ignore.js b/test/tests/ignore.js index 1286de90f4..f834b28d0f 100644 --- a/test/tests/ignore.js +++ b/test/tests/ignore.js @@ -18,7 +18,16 @@ describe("Ignore", function() { }); it("can determine if a path is ignored", function() { - assert.equal(Ignore.pathIsIgnored(this.repository, ".git"), true); - assert.equal(Ignore.pathIsIgnored(this.repository, "LICENSE"), false); + function expectIgnoreState(repo, fileName, expected) { + return Ignore.pathIsIgnored(repo, fileName) + .then(function(ignored) { + assert.equal(ignored, expected); + }); + } + + return Promise.all([ + expectIgnoreState(this.repository, ".git", true), + expectIgnoreState(this.repository, "LICENSE", false) + ]); }); }); diff --git a/test/tests/index.js b/test/tests/index.js index a221c0b012..f3d29e7f7f 100644 --- a/test/tests/index.js +++ b/test/tests/index.js @@ -1,18 +1,14 @@ var assert = require("assert"); var path = require("path"); var local = path.join.bind(path, __dirname); -var Promise = require("nodegit-promise"); -var promisify = require("promisify-node"); -var fse = promisify(require("fs-extra")); - -var writeFile = promisify(function(filename, data, callback) { - return require("fs").writeFile(filename, data, {}, callback); -}); +var fse = require("fs-extra"); describe("Index", function() { + var IndexUtils = require("../utils/index_setup"); var RepoUtils = require("../utils/repository_setup"); var NodeGit = require("../../"); var Repository = NodeGit.Repository; + var ErrorCodes = NodeGit.Error.CODE; var reposPath = local("../repos/workdir"); @@ -22,7 +18,7 @@ describe("Index", function() { return Repository.open(reposPath) .then(function(repo) { test.repository = repo; - return repo.openIndex(); + return repo.refreshIndex(); }) .then(function(index) { test.index = index; @@ -47,16 +43,27 @@ describe("Index", function() { newFile2: "and this will have more content" }; var fileNames = Object.keys(fileContent); + var test = this; + var addCallbacksCount = 0; return Promise.all(fileNames.map(function(fileName) { - return writeFile( + return fse.writeFile( path.join(repo.workdir(), fileName), - fileContent[fileName]); + fileContent[fileName], {}); })) .then(function() { - return index.addAll(); + return index.addAll(undefined, undefined, function() { + addCallbacksCount++; + // ensure that there is no deadlock if we call + // a sync libgit2 function from the callback + test.repository.path(); + + return 0; // confirm add + }); }) .then(function() { + assert.equal(addCallbacksCount, 2); + var newFiles = index.entries().filter(function(entry) { return ~fileNames.indexOf(entry.path); }); @@ -69,7 +76,7 @@ describe("Index", function() { })); }) .then(function() { - index.clear(); + return index.clear(); }); }); @@ -82,11 +89,12 @@ describe("Index", function() { differentFileName: "this has a different name and shouldn't be deleted" }; var fileNames = Object.keys(fileContent); + var removeCallbacksCount = 0; return Promise.all(fileNames.map(function(fileName) { - return writeFile( + return fse.writeFile( path.join(repo.workdir(), fileName), - fileContent[fileName]); + fileContent[fileName], {}); })) .then(function() { return index.addAll(); @@ -98,9 +106,15 @@ describe("Index", function() { assert.equal(newFiles.length, 3); - return index.removeAll("newFile*"); + return index.removeAll("newFile*", function() { + removeCallbacksCount++; + + return 0; // confirm remove + }); }) .then(function() { + assert.equal(removeCallbacksCount, 2); + var newFiles = index.entries().filter(function(entry) { return ~fileNames.indexOf(entry.path); }); @@ -113,7 +127,7 @@ describe("Index", function() { })); }) .then(function() { - index.clear(); + return index.clear(); }); }); @@ -125,11 +139,12 @@ describe("Index", function() { newFile2: "and this will have more content" }; var fileNames = Object.keys(fileContent); + var updateCallbacksCount = 0; return Promise.all(fileNames.map(function(fileName) { - return writeFile( + return fse.writeFile( path.join(repo.workdir(), fileName), - fileContent[fileName]); + fileContent[fileName], {}); })) .then(function() { return index.addAll(); @@ -144,9 +159,15 @@ describe("Index", function() { return fse.remove(path.join(repo.workdir(), fileNames[0])); }) .then(function() { - return index.updateAll("newFile*"); + return index.updateAll("newFile*", function() { + updateCallbacksCount++; + + return 0; // confirm update + }); }) .then(function() { + assert.equal(updateCallbacksCount, 1); + var newFiles = index.entries().filter(function(entry) { return ~fileNames.indexOf(entry.path); }); @@ -282,4 +303,119 @@ describe("Index", function() { return Promise.all(promises); }); }); + + it("can add a conflict to the index", function() { + var repo; + var repoPath = local("../repos/index"); + var ourBranchName = "ours"; + var theirBranchName = "theirs"; + var fileName = "testFile.txt"; + var ancestorIndexEntry; + var ourIndexEntry; + var theirIndexEntry; + + return RepoUtils.createRepository(repoPath) + .then(function(_repo) { + repo = _repo; + return IndexUtils.createConflict( + repo, + ourBranchName, + theirBranchName, + fileName + ); + }) + .then(function(index) { + assert.ok(index.hasConflicts()); + return index.conflictGet(fileName); + }) + .then(function(indexEntries) { + // Store all indexEntries for conflict + ancestorIndexEntry = indexEntries.ancestor_out; + ourIndexEntry = indexEntries.our_out; + theirIndexEntry = indexEntries.their_out; + + // Stage conflicted file + return RepoUtils.addFileToIndex(repo, fileName); + }) + .then(function() { + return repo.index(); + }) + .then(function(index) { + assert.ok(!index.hasConflicts()); + return index.conflictAdd( + ancestorIndexEntry, + ourIndexEntry, + theirIndexEntry + ); + }) + .then(function() { + return repo.index(); + }) + .then(function(index) { + assert(index.hasConflicts()); + }); + }); + + it("can find the specified file in the index", function() { + var test = this; + + return test.index.find("src/wrapper.cc") + .then(function(position) { + assert.notEqual(position, null); + }); + }); + + it("cannot find the specified file in the index", function() { + var test = this; + + return test.index.find("src/thisisfake.cc") + .then(function(position) { + assert.fail("the item should not be found"); + }) + .catch(function(error) { + assert.strictEqual(error.errno, ErrorCodes.ENOTFOUND); + }); + }); + + it("cannot find the directory in the index", function() { + var test = this; + + return test.index.find("src") + .then(function(position) { + assert.fail("the item should not be found"); + }) + .catch(function(error) { + assert.strictEqual(error.errno, ErrorCodes.ENOTFOUND); + }); + }); + + it("can find the specified prefix in the index", function() { + var test = this; + + return test.index.findPrefix("src/") + .then(function(position) { + assert.notEqual(position, null); + }); + }); + + it("cannot find the specified prefix in the index", function() { + var test = this; + + return test.index.find("testing123/") + .then(function(position) { + assert.fail("the item should not be found"); + }) + .catch(function(error) { + assert.strictEqual(error.errno, ErrorCodes.ENOTFOUND); + }); + }); + + it("can find the prefix when a file shares the name", function() { + var test = this; + + return test.index.find("LICENSE") + .then(function(position) { + assert.notEqual(position, null); + }); + }); }); diff --git a/test/tests/merge.js b/test/tests/merge.js index a5511c59f4..a5010925b2 100644 --- a/test/tests/merge.js +++ b/test/tests/merge.js @@ -1,12 +1,8 @@ var assert = require("assert"); var path = require("path"); -var Promise = require("nodegit-promise"); -var promisify = require("promisify-node"); -var fse = promisify(require("fs-extra")); +var fse = require("fs-extra"); var local = path.join.bind(path, __dirname); -fse.ensureDir = promisify(fse.ensureDir); - describe("Merge", function() { var NodeGit = require("../../"); var RepoUtils = require("../utils/repository_setup"); @@ -45,12 +41,14 @@ describe("Merge", function() { ourFileContent) // Load up the repository index and make our initial commit to HEAD .then(function() { - return repository.openIndex() - .then(function(index) { - index.read(1); - index.addByPath(ourFileName); - index.write(); - + return repository.refreshIndex(); + }) + .then(function(index) { + return index.addByPath(ourFileName) + .then(function() { + return index.write(); + }) + .then(function() { return index.writeTree(); }); }) @@ -81,12 +79,14 @@ describe("Merge", function() { theirFileContent); }) .then(function() { - return repository.openIndex() - .then(function(index) { - index.read(1); - index.addByPath(theirFileName); - index.write(); - + return repository.refreshIndex(); + }) + .then(function(index) { + return index.addByPath(theirFileName) + .then(function() { + return index.write(); + }) + .then(function() { return index.writeTree(); }); }) @@ -110,7 +110,6 @@ describe("Merge", function() { }) .then(function(index) { assert(!index.hasConflicts()); - index.write(); return index.writeTreeTo(repository); }) .then(function(oid) { @@ -150,14 +149,16 @@ describe("Merge", function() { ourFileContent) // Load up the repository index and make our initial commit to HEAD .then(function() { - return repository.openIndex() - .then(function(index) { - index.read(1); - index.addByPath(ourFileName); - index.write(); - - return index.writeTree(); - }); + return repository.refreshIndex(); + }) + .then(function(index) { + return index.addByPath(ourFileName) + .then(function() { + return index.write(); + }) + .then(function() { + return index.writeTree(); + }); }) .then(function(oid) { assert.equal(oid.toString(), @@ -186,14 +187,16 @@ describe("Merge", function() { theirFileContent); }) .then(function() { - return repository.openIndex() - .then(function(index) { - index.read(1); - index.addByPath(theirFileName); - index.write(); - - return index.writeTree(); - }); + return repository.refreshIndex(); + }) + .then(function(index) { + return index.addByPath(theirFileName) + .then(function() { + return index.write(); + }) + .then(function() { + return index.writeTree(); + }); }) .then(function(oid) { assert.equal(oid.toString(), @@ -262,14 +265,16 @@ describe("Merge", function() { ourFileContent) // Load up the repository index and make our initial commit to HEAD .then(function() { - return repository.openIndex() - .then(function(index) { - index.read(1); - index.addByPath(ourFileName); - index.write(); - - return index.writeTree(); - }); + return repository.refreshIndex(); + }) + .then(function(index) { + return index.addByPath(ourFileName) + .then(function() { + return index.write(); + }) + .then(function() { + return index.writeTree(); + }); }) .then(function(oid) { assert.equal(oid.toString(), @@ -298,14 +303,16 @@ describe("Merge", function() { theirFileContent); }) .then(function() { - return repository.openIndex() - .then(function(index) { - index.read(1); - index.addByPath(theirFileName); - index.write(); - - return index.writeTree(); - }); + return repository.refreshIndex(); + }) + .then(function(index) { + return index.addByPath(theirFileName) + .then(function() { + return index.write(); + }) + .then(function() { + return index.writeTree(); + }); }) .then(function(oid) { assert.equal(oid.toString(), @@ -338,7 +345,7 @@ describe("Merge", function() { }) .then(function(oid) { assert.equal(oid.toString(), - "6806d22d2b6c0095b29dc5ec51829caeb67861f1"); + "65516eb7b20f51d275096cd28f132ff606a09e07"); return repository.getBranchCommit(ourBranchName) .then(function(branchCommit) { @@ -381,14 +388,16 @@ describe("Merge", function() { initialFileContent) // Load up the repository index and make our initial commit to HEAD .then(function() { - return repository.openIndex() - .then(function(index) { - index.read(1); - index.addByPath(initialFileName); - index.write(); - - return index.writeTree(); - }); + return repository.refreshIndex(); + }) + .then(function(index) { + return index.addByPath(initialFileName) + .then(function() { + return index.write(); + }) + .then(function() { + return index.writeTree(); + }); }) .then(function(oid) { assert.equal(oid.toString(), @@ -419,14 +428,16 @@ describe("Merge", function() { ourFileContent); }) .then(function() { - return repository.openIndex() - .then(function(index) { - index.read(1); - index.addByPath(ourFileName); - index.write(); - - return index.writeTree(); - }); + return repository.refreshIndex(); + }) + .then(function(index) { + return index.addByPath(ourFileName) + .then(function() { + return index.write(); + }) + .then(function() { + return index.writeTree(); + }); }) .then(function(oid) { assert.equal(oid.toString(), @@ -448,14 +459,16 @@ describe("Merge", function() { theirFileContent); }) .then(function() { - return repository.openIndex() - .then(function(index) { - index.read(1); - index.addByPath(theirFileName); - index.write(); - - return index.writeTree(); - }); + return repository.refreshIndex(); + }) + .then(function(index) { + return index.addByPath(theirFileName) + .then(function() { + return index.write(); + }) + .then(function() { + return index.writeTree(); + }); }) .then(function(oid) { assert.equal(oid.toString(), @@ -485,7 +498,7 @@ describe("Merge", function() { }) .then(function(commitId) { assert.equal(commitId.toString(), - "5384feb481d9c29081b3a0c1478fcc24a3953efa"); + "96d6f1d0704eb3ef9121a13348d17c1d672c28aa"); }) .then(function() { return repository.getStatus(); @@ -496,6 +509,324 @@ describe("Merge", function() { }); }); + it( + "can merge --no-ff a non-fast-forward using the convenience method " + + "with custom merge message via sync callback", + function() { + var initialFileName = "initialFile.txt"; + var ourFileName = "ourNewFile.txt"; + var theirFileName = "theirNewFile.txt"; + + var initialFileContent = "I'd like to drive somewhere"; + var ourFileContent = "I like Toll Roads. I have an EZ-Pass!"; + var theirFileContent = "I'm skeptical about Toll Roads"; + + var ourSignature = NodeGit.Signature.create + ("Ron Paul", "RonPaul@TollRoadsRBest.info", 123456789, 60); + var theirSignature = NodeGit.Signature.create + ("Greg Abbott", "Gregggg@IllTollYourFace.us", 123456789, 60); + + var repository = this.repository; + var initialCommit; + var ourCommit; + var theirCommit; + var ourBranch; + var theirBranch; + + return fse.writeFile( + path.join(repository.workdir(), initialFileName), + initialFileContent) + // Load up the repository index and make our initial commit to HEAD + .then(function() { + return repository.refreshIndex(); + }) + .then(function(index) { + return index.addByPath(initialFileName) + .then(function() { + return index.write(); + }) + .then(function() { + return index.writeTree(); + }); + }) + .then(function(oid) { + assert.equal(oid.toString(), + "21a553813e2f670815b649eef51eeadb253a5d0c"); + + return repository.createCommit("HEAD", ourSignature, + ourSignature, "initial commit", oid, []); + }) + .then(function(commitOid) { + assert.equal(commitOid.toString(), + "af66a9c799a10a23319ee4318c8bb2021521f539"); + + return repository.getCommit(commitOid).then(function(commit) { + initialCommit = commit; + }).then(function() { + return repository.createBranch(ourBranchName, commitOid) + .then(function(branch) { + ourBranch = branch; + return repository.createBranch(theirBranchName, commitOid); + }); + }); + }) + .then(function(branch) { + theirBranch = branch; + }) + .then(function() { + return fse.writeFile(path.join(repository.workdir(), ourFileName), + ourFileContent); + }) + .then(function() { + return repository.refreshIndex(); + }) + .then(function(index) { + return index.addByPath(ourFileName) + .then(function() { + return index.write(); + }) + .then(function() { + return index.writeTree(); + }); + }) + .then(function(oid) { + assert.equal(oid.toString(), + "af60aa06b3537f75b427f6268a130c842c84a137"); + + return repository.createCommit(ourBranch.name(), ourSignature, + ourSignature, "we made a commit", oid, [initialCommit]); + }) + .then(function(commitOid) { + assert.equal(commitOid.toString(), + "7ce31c05427659986d50abfb90c8f7db88ef4fa1"); + + return repository.getCommit(commitOid).then(function(commit) { + ourCommit = commit; + }); + }) + .then(function() { + return fse.writeFile(path.join(repository.workdir(), theirFileName), + theirFileContent); + }) + .then(function() { + return repository.refreshIndex(); + }) + .then(function(index) { + return index.addByPath(theirFileName) + .then(function() { + return index.write(); + }) + .then(function() { + return index.writeTree(); + }); + }) + .then(function(oid) { + assert.equal(oid.toString(), + "f007361737a2ca00a0e80fc2daf55064463173b4"); + + return repository.createCommit(theirBranch.name(), theirSignature, + theirSignature, "they made a commit", oid, [initialCommit]); + }) + .then(function(commitOid) { + assert.equal(commitOid.toString(), + "b588f0eef1809226f8f7db542940749da15ae1de"); + + return repository.getCommit(commitOid).then(function(commit) { + theirCommit = commit; + }); + }) + .then(function() { + var opts = {checkoutStrategy: NodeGit.Checkout.STRATEGY.FORCE}; + return repository.checkoutBranch(ourBranchName, opts); + }) + .then(function() { + return repository.mergeBranches( + ourBranchName, + theirBranchName, + ourSignature, + NodeGit.Merge.PREFERENCE.NO_FASTFORWARD, + null, + { + processMergeMessageCallback: function(message) { + assert(message === "Merge branch 'theirs' into ours"); + return "We manipulated the message, HAH."; + } + } + ); + }) + .then(function(commitId) { + assert.equal(commitId.toString(), + "5b49a43be0ba95e7767dd9a2880bab4795c6db70"); + }) + .then(function() { + return repository.getStatus(); + }) + .then(function(statuses) { + // make sure we didn't change the index + assert.equal(statuses.length, 0); + }); + } + ); + + it( + "can merge --no-ff a non-fast-forward using the convenience method " + + "with custom merge message via async callback", + function() { + var initialFileName = "initialFile.txt"; + var ourFileName = "ourNewFile.txt"; + var theirFileName = "theirNewFile.txt"; + + var initialFileContent = "I'd like to drive somewhere"; + var ourFileContent = "I like Toll Roads. I have an EZ-Pass!"; + var theirFileContent = "I'm skeptical about Toll Roads"; + + var ourSignature = NodeGit.Signature.create + ("Ron Paul", "RonPaul@TollRoadsRBest.info", 123456789, 60); + var theirSignature = NodeGit.Signature.create + ("Greg Abbott", "Gregggg@IllTollYourFace.us", 123456789, 60); + + var repository = this.repository; + var initialCommit; + var ourCommit; + var theirCommit; + var ourBranch; + var theirBranch; + + return fse.writeFile( + path.join(repository.workdir(), initialFileName), + initialFileContent) + // Load up the repository index and make our initial commit to HEAD + .then(function() { + return repository.refreshIndex(); + }) + .then(function(index) { + return index.addByPath(initialFileName) + .then(function() { + return index.write(); + }) + .then(function() { + return index.writeTree(); + }); + }) + .then(function(oid) { + assert.equal(oid.toString(), + "21a553813e2f670815b649eef51eeadb253a5d0c"); + + return repository.createCommit("HEAD", ourSignature, + ourSignature, "initial commit", oid, []); + }) + .then(function(commitOid) { + assert.equal(commitOid.toString(), + "af66a9c799a10a23319ee4318c8bb2021521f539"); + + return repository.getCommit(commitOid).then(function(commit) { + initialCommit = commit; + }).then(function() { + return repository.createBranch(ourBranchName, commitOid) + .then(function(branch) { + ourBranch = branch; + return repository.createBranch(theirBranchName, commitOid); + }); + }); + }) + .then(function(branch) { + theirBranch = branch; + }) + .then(function() { + return fse.writeFile(path.join(repository.workdir(), ourFileName), + ourFileContent); + }) + .then(function() { + return repository.refreshIndex(); + }) + .then(function(index) { + return index.addByPath(ourFileName) + .then(function() { + return index.write(); + }) + .then(function() { + return index.writeTree(); + }); + }) + .then(function(oid) { + assert.equal(oid.toString(), + "af60aa06b3537f75b427f6268a130c842c84a137"); + + return repository.createCommit(ourBranch.name(), ourSignature, + ourSignature, "we made a commit", oid, [initialCommit]); + }) + .then(function(commitOid) { + assert.equal(commitOid.toString(), + "7ce31c05427659986d50abfb90c8f7db88ef4fa1"); + + return repository.getCommit(commitOid).then(function(commit) { + ourCommit = commit; + }); + }) + .then(function() { + return fse.writeFile(path.join(repository.workdir(), theirFileName), + theirFileContent); + }) + .then(function() { + return repository.refreshIndex(); + }) + .then(function(index) { + return index.addByPath(theirFileName) + .then(function() { + return index.write(); + }) + .then(function() { + return index.writeTree(); + }); + }) + .then(function(oid) { + assert.equal(oid.toString(), + "f007361737a2ca00a0e80fc2daf55064463173b4"); + + return repository.createCommit(theirBranch.name(), theirSignature, + theirSignature, "they made a commit", oid, [initialCommit]); + }) + .then(function(commitOid) { + assert.equal(commitOid.toString(), + "b588f0eef1809226f8f7db542940749da15ae1de"); + + return repository.getCommit(commitOid).then(function(commit) { + theirCommit = commit; + }); + }) + .then(function() { + var opts = {checkoutStrategy: NodeGit.Checkout.STRATEGY.FORCE}; + return repository.checkoutBranch(ourBranchName, opts); + }) + .then(function() { + return repository.mergeBranches( + ourBranchName, + theirBranchName, + ourSignature, + NodeGit.Merge.PREFERENCE.NO_FASTFORWARD, + null, + { + processMergeMessageCallback: function(message) { + assert(message === "Merge branch 'theirs' into ours"); + return Promise.resolve("We manipulated the message, HAH."); + } + } + ); + }) + .then(function(commitId) { + assert.equal(commitId.toString(), + "5b49a43be0ba95e7767dd9a2880bab4795c6db70"); + }) + .then(function() { + return repository.getStatus(); + }) + .then(function(statuses) { + // make sure we didn't change the index + assert.equal(statuses.length, 0); + }); + } + ); + it("can merge --ff-only a fast-forward using the convenience method", function() { var ourFileName = "ourNewFile.txt"; @@ -520,14 +851,16 @@ describe("Merge", function() { ourFileContent) // Load up the repository index and make our initial commit to HEAD .then(function() { - return repository.openIndex() - .then(function(index) { - index.read(1); - index.addByPath(ourFileName); - index.write(); - - return index.writeTree(); - }); + return repository.refreshIndex(); + }) + .then(function(index) { + return index.addByPath(ourFileName) + .then(function() { + return index.write(); + }) + .then(function() { + return index.writeTree(); + }); }) .then(function(oid) { assert.equal(oid.toString(), @@ -556,14 +889,16 @@ describe("Merge", function() { theirFileContent); }) .then(function() { - return repository.openIndex() - .then(function(index) { - index.read(1); - index.addByPath(theirFileName); - index.write(); - - return index.writeTree(); - }); + return repository.refreshIndex(); + }) + .then(function(index) { + return index.addByPath(theirFileName) + .then(function() { + return index.write(); + }) + .then(function() { + return index.writeTree(); + }); }) .then(function(oid) { assert.equal(oid.toString(), @@ -636,14 +971,16 @@ describe("Merge", function() { initialFileContent) // Load up the repository index and make our initial commit to HEAD .then(function() { - return repository.openIndex() - .then(function(index) { - index.read(1); - index.addByPath(initialFileName); - index.write(); - - return index.writeTree(); - }); + return repository.refreshIndex(); + }) + .then(function(index) { + return index.addByPath(initialFileName) + .then(function() { + return index.write(); + }) + .then(function() { + return index.writeTree(); + }); }) .then(function(oid) { assert.equal(oid.toString(), @@ -674,14 +1011,16 @@ describe("Merge", function() { ourFileContent); }) .then(function() { - return repository.openIndex() - .then(function(index) { - index.read(1); - index.addByPath(ourFileName); - index.write(); - - return index.writeTree(); - }); + return repository.refreshIndex(); + }) + .then(function(index) { + return index.addByPath(ourFileName) + .then(function() { + return index.write(); + }) + .then(function() { + return index.writeTree(); + }); }) .then(function(oid) { assert.equal(oid.toString(), @@ -703,14 +1042,16 @@ describe("Merge", function() { theirFileContent); }) .then(function() { - return repository.openIndex() - .then(function(index) { - index.read(1); - index.addByPath(theirFileName); - index.write(); - - return index.writeTree(); - }); + return repository.refreshIndex(); + }) + .then(function(index) { + return index.addByPath(theirFileName) + .then(function() { + return index.write(); + }) + .then(function() { + return index.writeTree(); + }); }) .then(function(oid) { assert.equal(oid.toString(), @@ -777,14 +1118,16 @@ describe("Merge", function() { initialFileContent) // Load up the repository index and make our initial commit to HEAD .then(function() { - return repository.openIndex() - .then(function(index) { - index.read(1); - index.addByPath(initialFileName); - index.write(); - - return index.writeTree(); - }); + return repository.refreshIndex(); + }) + .then(function(index) { + return index.addByPath(initialFileName) + .then(function() { + return index.write(); + }) + .then(function() { + return index.writeTree(); + }); }) .then(function(oid) { assert.equal(oid.toString(), @@ -815,14 +1158,16 @@ describe("Merge", function() { ourFileContent); }) .then(function() { - return repository.openIndex() - .then(function(index) { - index.read(1); - index.addByPath(ourFileName); - index.write(); - - return index.writeTree(); - }); + return repository.refreshIndex(); + }) + .then(function(index) { + return index.addByPath(ourFileName) + .then(function() { + return index.write(); + }) + .then(function() { + return index.writeTree(); + }); }) .then(function(oid) { assert.equal(oid.toString(), @@ -844,14 +1189,16 @@ describe("Merge", function() { theirFileContent); }) .then(function() { - return repository.openIndex() - .then(function(index) { - index.read(1); - index.addByPath(theirFileName); - index.write(); - - return index.writeTree(); - }); + return repository.refreshIndex(); + }) + .then(function(index) { + return index.addByPath(theirFileName) + .then(function() { + return index.write(); + }) + .then(function(){ + return index.writeTree(); + }); }) .then(function(oid) { assert.equal(oid.toString(), @@ -874,7 +1221,7 @@ describe("Merge", function() { }) .then(function(commitId) { assert.equal(commitId.toString(), - "5384feb481d9c29081b3a0c1478fcc24a3953efa"); + "96d6f1d0704eb3ef9121a13348d17c1d672c28aa"); }); }); @@ -904,12 +1251,14 @@ describe("Merge", function() { return fse.writeFile(path.join(repository.workdir(), fileName), baseFileContent) .then(function() { - return repository.openIndex() - .then(function(index) { - index.read(1); - index.addByPath(fileName); - index.write(); - + return repository.refreshIndex(); + }) + .then(function(index) { + return index.addByPath(fileName) + .then(function() { + return index.write(); + }) + .then(function() { return index.writeTree(); }); }) @@ -946,13 +1295,16 @@ describe("Merge", function() { ourFileContent); }) .then(function() { - return repository.openIndex().then(function(index) { - index.read(1); - index.addByPath(fileName); - index.write(); - - return index.writeTree(); - }); + return repository.refreshIndex(); + }) + .then(function(index) { + return index.addByPath(fileName) + .then(function() { + return index.write(); + }) + .then(function() { + return index.writeTree(); + }); }) .then(function(oid) { assert.equal(oid.toString(), @@ -974,13 +1326,16 @@ describe("Merge", function() { theirFileContent); }) .then(function() { - return repository.openIndex().then(function(index) { - index.read(1); - index.addByPath(fileName); - index.write(); - - return index.writeTree(); - }); + return repository.refreshIndex(); + }) + .then(function(index) { + return index.addByPath(fileName) + .then(function() { + return index.write(); + }) + .then(function() { + return index.writeTree(); + }); }) .then(function(oid) { assert.equal(oid.toString(), @@ -1012,13 +1367,16 @@ describe("Merge", function() { finalFileContent); }) .then(function() { - return repository.openIndex().then(function(index) { - index.read(1); - index.addByPath(fileName); - index.write(); - - return index.writeTree(); - }); + return repository.refreshIndex(); + }) + .then(function(index) { + return index.addByPath(fileName) + .then(function() { + return index.write(); + }) + .then(function() { + return index.writeTree(); + }); }) .then(function(oid) { assert.equal(oid.toString(), @@ -1073,13 +1431,16 @@ describe("Merge", function() { return fse.writeFile(path.join(repository.workdir(), fileName), baseFileContent) .then(function() { - return repository.openIndex().then(function(index) { - index.read(1); - index.addByPath(fileName); - index.write(); - - return index.writeTree(); - }); + return repository.refreshIndex(); + }) + .then(function(index) { + return index.addByPath(fileName) + .then(function() { + return index.write(); + }) + .then(function() { + return index.writeTree(); + }); }) .then(function(oid) { assert.equal(oid.toString(), @@ -1108,13 +1469,16 @@ describe("Merge", function() { baseFileContent + theirFileContent); }) .then(function() { - return repository.openIndex().then(function(index) { - index.read(1); - index.addByPath(fileName); - index.write(); - - return index.writeTree(); - }); + return repository.refreshIndex(); + }) + .then(function(index) { + return index.addByPath(fileName) + .then(function() { + return index.write(); + }) + .then(function() { + return index.writeTree(); + }); }) .then(function(oid) { assert.equal(oid.toString(), @@ -1131,13 +1495,16 @@ describe("Merge", function() { baseFileContent + ourFileContent); }) .then(function() { - return repository.openIndex().then(function(index) { - index.read(1); - index.addByPath(fileName); - index.write(); - - return index.writeTree(); - }); + return repository.refreshIndex(); + }) + .then(function(index) { + return index.addByPath(fileName) + .then(function() { + return index.write(); + }) + .then(function() { + return index.writeTree(); + }); }) .then(function(oid) { assert.equal(oid.toString(), @@ -1173,9 +1540,7 @@ describe("Merge", function() { .then(function(theirAnnotatedCommit) { return NodeGit.Merge(repository, theirAnnotatedCommit); }) - .then(function(result) { - assert.equal(result, 0); - + .then(function() { assert.equal(repository.state(), NodeGit.Repository.STATE.MERGE); // verify the convenience method @@ -1200,12 +1565,14 @@ describe("Merge", function() { conflictSolvedFileContent); }) .then(function() { - return repository.openIndex() - .then(function(index) { - index.read(1); - index.addByPath(fileName); - index.write(); - + return repository.refreshIndex(); + }) + .then(function(index) { + return index.addByPath(fileName) + .then(function() { + return index.write(); + }) + .then(function() { return index.writeTree(); }); }) @@ -1225,7 +1592,7 @@ describe("Merge", function() { }) .then(function(commitOid) { assert.equal(commitOid.toString(), - "03ba156a7a1660f179b6b2dbc6a542fcf88d022d"); + "8221726e3f96e3d3e0258f655e107383dc3c7335"); // merge isn't cleaned up automatically assert.ok(fse.existsSync(path.join(repoGitPath, "MERGE_HEAD"))); @@ -1244,4 +1611,27 @@ describe("Merge", function() { assert.ok(repository.isDefaultState()); }); }); + + it("can retrieve error code on if common merge base not found", function() { + var repo; + return NodeGit.Repository.open(local("../repos/workdir")) + .then(function(r) { + repo = r; + return repo.getCommit("4bd806114ce26503c103c85dcc985021951bbc18"); + }) + .then(function(commit) { + return commit.getParents(commit.parentcount()); + }) + .then(function(parents) { + return NodeGit.Merge.base(repo, parents[0], parents[1]) + .then(function() { + return Promise.reject(new Error( + "should not be able to retrieve common merge base")); + }, function(err) { + assert.equal("no merge base found", err.message); + assert.equal("Merge.base", err.errorFunction); + assert.equal(NodeGit.Error.CODE.ENOTFOUND, err.errno); + }); + }); + }); }); diff --git a/test/tests/note.js b/test/tests/note.js index 1624714e7c..9622c667de 100644 --- a/test/tests/note.js +++ b/test/tests/note.js @@ -6,7 +6,7 @@ describe("Note", function() { var NodeGit = require("../../"); var Note = NodeGit.Note; var Signature = NodeGit.Signature; - var reposPath = local("../../"); + var reposPath = local("../repos/workdir"); beforeEach(function() { var test = this; @@ -15,7 +15,7 @@ describe("Note", function() { test.repository = repository; return repository.getMasterCommit().then(function(commit) { - test.commit = commit; + test.commit = commit; }); }); }); @@ -58,12 +58,14 @@ describe("Note", function() { var noteRef = "refs/notes/commits"; var sig = Signature.create("John", "john@doe.com", Date.now(), 0); - return Note.remove(this.repository, noteRef, sig, sig, sha) + Note.create(this.repository, noteRef, sig, sig, sha, "Testing!", 1) + .then((noteSha) => Note.remove(this.repository, noteRef, sig, sig, sha)) .then(function() { return Note.read(test.repository, noteRef, sha).catch(function(ex) { - assert.equal(ex.message, "Note could not be found"); + assert.equal(ex.message, "note could not be found"); done(); }); - }); + }) + .catch(done); }); }); diff --git a/test/tests/oid.js b/test/tests/oid.js index 7ec57631d8..4c2fbcdad3 100644 --- a/test/tests/oid.js +++ b/test/tests/oid.js @@ -2,6 +2,8 @@ var assert = require("assert"); var path = require("path"); var local = path.join.bind(path, __dirname); +var leakTest = require("../utils/leak_test"); + describe("Oid", function() { var NodeGit = require("../../"); var Oid = NodeGit.Oid; @@ -43,4 +45,51 @@ describe("Oid", function() { assert.equal(commits[0].toString(), oid); }); }); + + it("can compare two identical oids", function() { + assert.equal(this.oid.cmp(this.oid), 0); + }); + + it("can compare two different oids", function() { + var oid2 = Oid.fromString("13c633665257696a3800b0a39ff636b4593f918f"); + assert.notEqual(this.oid.cmp(oid2), 0); + }); + + it("can compare the first chunk of two identical oids", function() { + assert.equal(this.oid.ncmp(this.oid, 5), 0); + }); + + it("can compare the first chunk of two different oids", function() { + var oid2 = Oid.fromString("13c633665257696a3800b0a39ff636b4593f918f"); + assert.notEqual(this.oid.ncmp(oid2, 5), 0); + }); + + it("can check the equality of two identical oids", function() { + assert(this.oid.equal(this.oid)); + }); + + it("can check the equality of two different oids", function() { + var oid2 = Oid.fromString("13c633665257696a3800b0a39ff636b4593f918f"); + assert(!this.oid.equal(oid2)); + }); + + it("does not leak constructed Oid", function() { + return leakTest(Oid, function() { + return Promise.resolve( + Oid.fromString("13c633665257696a3800b0a39ff636b4593f918f") + ); + }); + }); + + it("does not leak owned Oid", function() { + return leakTest(Oid, function() { + return NodeGit.Repository.open(local("../repos/workdir")) + .then(function(repo) { + return NodeGit.Commit.lookup(repo, oid); + }) + .then(function(commit) { + return commit.id(); + }); + }); + }); }); diff --git a/test/tests/patch.js b/test/tests/patch.js new file mode 100644 index 0000000000..fe7fe3734a --- /dev/null +++ b/test/tests/patch.js @@ -0,0 +1,109 @@ +var assert = require("assert"); +var path = require("path"); +var local = path.join.bind(path, __dirname); + +describe("Patch", function() { + var NodeGit = require("../../"); + var Repository = NodeGit.Repository; + + var reposPath = local("../repos/workdir"); + var oid = "fce88902e66c72b5b93e75bdb5ae717038b221f6"; + + beforeEach(function() { + var test = this; + + return Repository.open(reposPath).then(function(repository) { + test.repository = repository; + + return repository.refreshIndex(); + }) + .then(function(index) { + test.index = index; + + return test.repository.getBranchCommit("master"); + }) + .then(function(masterCommit) { + return masterCommit.getTree(); + }) + .then(function(tree) { + test.masterCommitTree = tree; + + return test.repository.getCommit(oid); + }) + .then(function(commit) { + test.commit = commit; + + return commit.getDiff(); + }) + .then(function(diff) { + test.diff = diff; + + return diff[0].patches(); + }) + .catch(function(e) { + return Promise.reject(e); + }); + }); + + it("retrieve the line stats of a patch", function() { + return this.diff[0].patches() + .then(function(patches) { + var patch = patches[0]; + var lineStats = patch.lineStats(); + + assert.equal(patch.oldFile().path(), "README.md"); + assert.equal(patch.newFile().path(), "README.md"); + assert.equal(patch.size(), 1); + assert.ok(patch.isModified()); + assert.equal(lineStats.total_context, 3); + assert.equal(lineStats.total_additions, 1); + assert.equal(lineStats.total_deletions, 1); + }); + + }); + + it("can generate patch from blobs", function() { + // Generates a patch for README.md from commit + // fce88902e66c72b5b93e75bdb5ae717038b221f6 + const file = "README.md"; + + return NodeGit.Blob.lookup( + this.repository, + "b252f396b17661462372f78b7bcfc403b8731aaa" + ).then(blob => { + return NodeGit.Blob.lookup( + this.repository, + "b8d014998072c3f9e4b7eba8486011e80d8de98a" + ).then(oldBlob => { + return NodeGit.Patch.fromBlobs(oldBlob, file, blob, file) + .then(patch => { + assert.strictEqual(patch.size(0, 0, 0), 254); + }); + }); + }); + }); + + it("can generate patch from blobs without 'old_blob'", function() { + // Generates a patch for README.md from commit + // fce88902e66c72b5b93e75bdb5ae717038b221f6 without + // old_blob. Should show all lines as additions. + const file = "README.md"; + + return NodeGit.Blob.lookup( + this.repository, + "b252f396b17661462372f78b7bcfc403b8731aaa" + ).then(blob => { + return NodeGit.Patch.fromBlobs(null, file, blob, file) + .then(patch => { + assert.strictEqual(patch.size(0, 0, 0), 8905); + }); + }); + }); + + it("can generate patch from blobs without arguments", function() { + return NodeGit.Patch.fromBlobs() + .then(patch => { + assert.strictEqual(patch.size(0, 0, 0), 0); + }); + }); +}); diff --git a/test/tests/rebase.js b/test/tests/rebase.js index a6789eb793..d9aae1fbce 100644 --- a/test/tests/rebase.js +++ b/test/tests/rebase.js @@ -1,12 +1,16 @@ var assert = require("assert"); var path = require("path"); var local = path.join.bind(path, __dirname); -var Promise = require("nodegit-promise"); -var promisify = require("promisify-node"); -var fse = promisify(require("fs-extra")); +var fse = require("fs-extra"); + +var garbageCollect = require("../utils/garbage_collect.js"); + +const isNode8 = process.versions.node.split(".")[0] === "8"; describe("Rebase", function() { var NodeGit = require("../../"); + var Checkout = NodeGit.Checkout; + var Merge = NodeGit.Merge; var RepoUtils = require("../utils/repository_setup"); var repoPath = local("../repos/rebase"); @@ -14,13 +18,15 @@ describe("Rebase", function() { var theirBranchName = "theirs"; var removeFileFromIndex = function(repository, fileName) { - return repository.openIndex() + return repository.refreshIndex() .then(function(index) { - index.read(1); - index.removeByPath(fileName); - index.write(); - - return index.writeTree(); + return index.removeByPath(fileName) + .then(function() { + return index.write(); + }) + .then(function() { + return index.writeTree(); + }); }); }; @@ -143,7 +149,7 @@ describe("Rebase", function() { }); }); - it("can cleanly rebase a branch onto another branch", function() { + it("can cleanly rebase a branch in-memory", function() { var baseFileName = "baseNewFile.txt"; var ourFileName = "ourNewFile.txt"; var theirFileName = "theirNewFile.txt"; @@ -260,6 +266,187 @@ describe("Rebase", function() { var ourAnnotatedCommit = annotatedCommits[0]; var theirAnnotatedCommit = annotatedCommits[1]; + assert.equal(ourAnnotatedCommit.id().toString(), + "e7f37ee070837052937e24ad8ba66f6d83ae7941"); + assert.equal(theirAnnotatedCommit.id().toString(), + "e9ebd92f2f4778baf6fa8e92f0c68642f931a554"); + + var rebaseOptions = new NodeGit.RebaseOptions(); + rebaseOptions.inmemory = 1; + + return NodeGit.Rebase.init(repository, ourAnnotatedCommit, + theirAnnotatedCommit, undefined, rebaseOptions); + }) + .then(function(newRebase) { + rebase = newRebase; + + // there should only be 1 rebase operation to perform + assert.equal(rebase.operationEntrycount(), 1); + + return rebase.next(); + }) + .then(function(rebaseOperation) { + assert.equal(rebaseOperation.type(), + NodeGit.RebaseOperation.REBASE_OPERATION.PICK); + assert.equal(rebaseOperation.id().toString(), + "e7f37ee070837052937e24ad8ba66f6d83ae7941"); + + return rebase.commit(null, ourSignature); + }) + .then(function(commitOid) { + assert.equal(commitOid.toString(), + "b937100ee0ea17ef20525306763505a7fe2be29e"); + + // git_rebase_operation_current returns the index of the rebase + // operation that was last applied, so after the first operation, it + // should be 0. + assert.equal(rebase.operationCurrent(), 0); + + return rebase.finish(ourSignature, {}); + }) + .then(function(result) { + assert.equal(result, 0); + + return repository.getBranchCommit(ourBranchName); + }) + .then(function(commit) { + // verify that the "ours" branch has NOT moved. + // In-memory rebase does not touch refs. + assert.equal(commit.id().toString(), + "e7f37ee070837052937e24ad8ba66f6d83ae7941"); + + // Lookup the new commit + return NodeGit.Commit.lookup(repository, + "b937100ee0ea17ef20525306763505a7fe2be29e"); + }) + .then(function(commit) { + // Lookup the parent of our new commit + return commit.parent(0); + }) + .then(function(commit) { + // verify that we are on top of "their commit" + assert.equal(commit.id().toString(), + "e9ebd92f2f4778baf6fa8e92f0c68642f931a554"); + }); + }); + + it("can cleanly rebase a branch onto another branch", function() { + var baseFileName = "baseNewFile.txt"; + var ourFileName = "ourNewFile.txt"; + var theirFileName = "theirNewFile.txt"; + + var baseFileContent = "How do you feel about Toll Roads?"; + var ourFileContent = "I like Toll Roads. I have an EZ-Pass!"; + var theirFileContent = "I'm skeptical about Toll Roads"; + + var ourSignature = NodeGit.Signature.create + ("Ron Paul", "RonPaul@TollRoadsRBest.info", 123456789, 60); + var theirSignature = NodeGit.Signature.create + ("Greg Abbott", "Gregggg@IllTollYourFace.us", 123456789, 60); + + var repository = this.repository; + var ourCommit; + var ourBranch; + var theirBranch; + var rebase; + + return fse.writeFile(path.join(repository.workdir(), baseFileName), + baseFileContent) + // Load up the repository index and make our initial commit to HEAD + .then(function() { + return RepoUtils.addFileToIndex(repository, baseFileName); + }) + .then(function(oid) { + assert.equal(oid.toString(), + "b5cdc109d437c4541a13fb7509116b5f03d5039a"); + + return repository.createCommit("HEAD", ourSignature, + ourSignature, "initial commit", oid, []); + }) + .then(function(commitOid) { + assert.equal(commitOid.toString(), + "be03abdf0353d05924c53bebeb0e5bb129cda44a"); + + return repository.getCommit(commitOid).then(function(commit) { + ourCommit = commit; + }).then(function() { + return repository.createBranch(ourBranchName, commitOid) + .then(function(branch) { + ourBranch = branch; + return repository.createBranch(theirBranchName, commitOid); + }); + }); + }) + .then(function(branch) { + theirBranch = branch; + return fse.writeFile(path.join(repository.workdir(), theirFileName), + theirFileContent); + }) + .then(function() { + return RepoUtils.addFileToIndex(repository, theirFileName); + }) + .then(function(oid) { + assert.equal(oid.toString(), + "be5f0fd38a39a67135ad68921c93cd5c17fefb3d"); + + return repository.createCommit(theirBranch.name(), theirSignature, + theirSignature, "they made a commit", oid, [ourCommit]); + }) + .then(function(commitOid) { + assert.equal(commitOid.toString(), + "e9ebd92f2f4778baf6fa8e92f0c68642f931a554"); + + return removeFileFromIndex(repository, theirFileName); + }) + .then(function() { + return fse.remove(path.join(repository.workdir(), theirFileName)); + }) + .then(function() { + return fse.writeFile(path.join(repository.workdir(), ourFileName), + ourFileContent); + }) + .then(function() { + return RepoUtils.addFileToIndex(repository, ourFileName); + }) + .then(function(oid) { + assert.equal(oid.toString(), + "77867fc0bfeb3f80ab18a78c8d53aa3a06207047"); + + return repository.createCommit(ourBranch.name(), ourSignature, + ourSignature, "we made a commit", oid, [ourCommit]); + }) + .then(function(commitOid) { + assert.equal(commitOid.toString(), + "e7f37ee070837052937e24ad8ba66f6d83ae7941"); + + return removeFileFromIndex(repository, ourFileName); + }) + .then(function() { + return fse.remove(path.join(repository.workdir(), ourFileName)); + }) + .then(function() { + return repository.checkoutBranch(ourBranchName); + }) + .then(function() { + return Promise.all([ + repository.getReference(ourBranchName), + repository.getReference(theirBranchName) + ]); + }) + .then(function(refs) { + assert.equal(refs.length, 2); + + return Promise.all([ + NodeGit.AnnotatedCommit.fromRef(repository, refs[0]), + NodeGit.AnnotatedCommit.fromRef(repository, refs[1]) + ]); + }) + .then(function(annotatedCommits) { + assert.equal(annotatedCommits.length, 2); + + var ourAnnotatedCommit = annotatedCommits[0]; + var theirAnnotatedCommit = annotatedCommits[1]; + assert.equal(ourAnnotatedCommit.id().toString(), "e7f37ee070837052937e24ad8ba66f6d83ae7941"); assert.equal(theirAnnotatedCommit.id().toString(), @@ -455,7 +642,7 @@ describe("Rebase", function() { assert.equal(rebaseOperation.id().toString(), "28cfeb17f66132edb3c4dacb7ff38e8dd48a1844"); - return repository.openIndex() + return repository.refreshIndex() .then(function(index) { assert.ok(index.hasConflicts()); }); @@ -473,7 +660,7 @@ describe("Rebase", function() { return RepoUtils.addFileToIndex(repository, fileName); }) .then(function(oid) { - return repository.openIndex() + return repository.refreshIndex() .then(function(index) { assert.ok(!index.hasConflicts()); @@ -657,7 +844,7 @@ describe("Rebase", function() { }); }) .then(function() { - return rebase.abort(ourSignature); + return rebase.abort(); }) .then(function() { return NodeGit.Rebase.open(repository) @@ -666,7 +853,7 @@ describe("Rebase", function() { "There should not be a rebase in progress"); }) .catch(function(e) { - assert.equal(e.message, "There is no rebase in progress"); + assert.equal(e.message, "there is no rebase in progress"); }); }) .then(function() { @@ -686,7 +873,8 @@ describe("Rebase", function() { }); }); - it("can fast-forward via rebase using the convenience methods", function() { + it("can fast-forward via rebase using the convenience methods", + function() { var ourFileName = "ourNewFile.txt"; var theirFileName = "theirNewFile.txt"; @@ -788,41 +976,49 @@ describe("Rebase", function() { }); }); - it("can rebase using the convenience method", function() { - var baseFileName = "baseNewFile.txt"; + it( + "can fast-forward a merge commit via rebase using the " + + "convenience methods that has a beforeFinishFn", + function() { var ourFileName = "ourNewFile.txt"; var theirFileName = "theirNewFile.txt"; + var theirOtherFileName = "antherNewFile.txt"; - var baseFileContent = "How do you feel about Toll Roads?"; var ourFileContent = "I like Toll Roads. I have an EZ-Pass!"; var theirFileContent = "I'm skeptical about Toll Roads"; + var theirOtherFileContent = "This is some more content, guys!"; var ourSignature = NodeGit.Signature.create ("Ron Paul", "RonPaul@TollRoadsRBest.info", 123456789, 60); var theirSignature = NodeGit.Signature.create ("Greg Abbott", "Gregggg@IllTollYourFace.us", 123456789, 60); + var theirOtherSignature = NodeGit.Signature.create + ("Greg Abbott", "Gregggg@IllTollYourFace.us", 123456999, 60); + var ourMergeSignature = NodeGit.Signature.create + ("Ron Paul", "RonPaul@TollRoadsRBest.info", 123456889, 60); var repository = this.repository; var ourCommit; - var ourBranch; + var theirCommit; var theirBranch; + var ourBranch; - return fse.writeFile(path.join(repository.workdir(), baseFileName), - baseFileContent) + return fse.writeFile(path.join(repository.workdir(), ourFileName), + ourFileContent) // Load up the repository index and make our initial commit to HEAD .then(function() { - return RepoUtils.addFileToIndex(repository, baseFileName); + return RepoUtils.addFileToIndex(repository, ourFileName); }) .then(function(oid) { assert.equal(oid.toString(), - "b5cdc109d437c4541a13fb7509116b5f03d5039a"); + "11ead82b1135b8e240fb5d61e703312fb9cc3d6a"); return repository.createCommit("HEAD", ourSignature, - ourSignature, "initial commit", oid, []); + ourSignature, "we made a commit", oid, []); }) .then(function(commitOid) { assert.equal(commitOid.toString(), - "be03abdf0353d05924c53bebeb0e5bb129cda44a"); + "91a183f87842ebb7a9b08dad8bc2473985796844"); return repository.getCommit(commitOid).then(function(commit) { ourCommit = commit; @@ -844,72 +1040,535 @@ describe("Rebase", function() { }) .then(function(oid) { assert.equal(oid.toString(), - "be5f0fd38a39a67135ad68921c93cd5c17fefb3d"); + "76631cb5a290dafe2959152626bb90f2a6d8ec94"); return repository.createCommit(theirBranch.name(), theirSignature, theirSignature, "they made a commit", oid, [ourCommit]); }) .then(function(commitOid) { + theirCommit = commitOid; assert.equal(commitOid.toString(), - "e9ebd92f2f4778baf6fa8e92f0c68642f931a554"); - - return removeFileFromIndex(repository, theirFileName); + "0e9231d489b3f4303635fc4b0397830da095e7e7"); }) .then(function() { - return fse.remove(path.join(repository.workdir(), theirFileName)); + return repository.checkoutBranch( + ourBranch, + { checkoutStrategy: Checkout.STRATEGY.FORCE } + ); }) .then(function() { - return fse.writeFile(path.join(repository.workdir(), ourFileName), - ourFileContent); + return repository.mergeBranches( + ourBranchName, + theirBranchName, + ourMergeSignature, + Merge.PREFERENCE.NO_FASTFORWARD + ); }) .then(function() { - return RepoUtils.addFileToIndex(repository, ourFileName); + return repository.getHeadCommit(); + }) + .then(function(headCommit) { + assert.notEqual(ourCommit.id().toString(), headCommit.id().toString()); + }) + .then(function() { + return repository.checkoutBranch( + theirBranch, + { checkoutStrategy: Checkout.STRATEGY.FORCE } + ); + }) + .then(function() { + return fse.writeFile( + path.join(repository.workdir(), theirOtherFileName), + theirOtherFileContent + ); + }) + .then(function() { + return RepoUtils.addFileToIndex(repository, theirOtherFileName); }) .then(function(oid) { assert.equal(oid.toString(), - "77867fc0bfeb3f80ab18a78c8d53aa3a06207047"); + "c242b53f2c9446544cf9bdac7e8ed6ce583226cb"); - return repository.createCommit(ourBranch.name(), ourSignature, - ourSignature, "we made a commit", oid, [ourCommit]); + return repository.createCommit(theirBranch.name(), theirOtherSignature, + theirOtherSignature, "they made another commit", oid, [theirCommit]); }) .then(function(commitOid) { assert.equal(commitOid.toString(), - "e7f37ee070837052937e24ad8ba66f6d83ae7941"); - - return removeFileFromIndex(repository, ourFileName); - }) - .then(function() { - return fse.remove(path.join(repository.workdir(), ourFileName)); + "8fa0ce25a2accf464b004ddeeb63add7b816b627"); }) .then(function() { - return repository.checkoutBranch(ourBranchName); + return Promise.all([ + repository.getReference(ourBranchName), + repository.getReference(theirBranchName) + ]); }) - .then(function() { - return repository.rebaseBranches(ourBranchName, theirBranchName, - null, ourSignature); + .then(function(refs) { + assert.equal(refs.length, 2); + + return Promise.all([ + NodeGit.AnnotatedCommit.fromRef(repository, refs[0]), + NodeGit.AnnotatedCommit.fromRef(repository, refs[1]) + ]); }) - .then(function(commit) { - // verify that the "ours" branch has moved to the correct place - assert.equal(commit.id().toString(), - "b937100ee0ea17ef20525306763505a7fe2be29e"); + .then(function(annotatedCommits) { + assert.equal(annotatedCommits.length, 2); - return commit.parent(0); + var ourAnnotatedCommit = annotatedCommits[0]; + var theirAnnotatedCommit = annotatedCommits[1]; + + assert.equal(ourAnnotatedCommit.id().toString(), + "0d1d322b59df68bac6eea6a2a189f974cb590368"); + assert.equal(theirAnnotatedCommit.id().toString(), + "8fa0ce25a2accf464b004ddeeb63add7b816b627"); + + return repository.rebaseBranches( + ourBranchName, + theirBranchName, + null, + ourSignature, + null, + function(rebaseData) { + assert.equal(rebaseData.rewritten, null); + } + ); }) .then(function(commit) { - // verify that we are on top of "their commit" assert.equal(commit.id().toString(), - "e9ebd92f2f4778baf6fa8e92f0c68642f931a554"); + "8fa0ce25a2accf464b004ddeeb63add7b816b627"); }); }); - it("can rebase with conflicts using the convenience methods", function() { - var fileName = "everyonesFile.txt"; - - var baseFileContent = "How do you feel about Toll Roads?\n"; - var ourFileContent = "I like Toll Roads. I have an EZ-Pass!\n"; - var theirFileContent = "I'm skeptical about Toll Roads\n"; + it("can rebase using the convenience method", function() { + var baseFileName = "baseNewFile.txt"; + var ourFileName = "ourNewFile.txt"; + var theirFileName = "theirNewFile.txt"; - var expectedConflictedFileContent = + var baseFileContent = "How do you feel about Toll Roads?"; + var ourFileContent = "I like Toll Roads. I have an EZ-Pass!"; + var theirFileContent = "I'm skeptical about Toll Roads"; + + var ourSignature = NodeGit.Signature.create + ("Ron Paul", "RonPaul@TollRoadsRBest.info", 123456789, 60); + var theirSignature = NodeGit.Signature.create + ("Greg Abbott", "Gregggg@IllTollYourFace.us", 123456789, 60); + + var repository = this.repository; + var ourCommit; + var ourBranch; + var theirBranch; + + var nextCalls = 0; + + return fse.writeFile(path.join(repository.workdir(), baseFileName), + baseFileContent) + // Load up the repository index and make our initial commit to HEAD + .then(function() { + return RepoUtils.addFileToIndex(repository, baseFileName); + }) + .then(function(oid) { + assert.equal(oid.toString(), + "b5cdc109d437c4541a13fb7509116b5f03d5039a"); + + return repository.createCommit("HEAD", ourSignature, + ourSignature, "initial commit", oid, []); + }) + .then(function(commitOid) { + assert.equal(commitOid.toString(), + "be03abdf0353d05924c53bebeb0e5bb129cda44a"); + + return repository.getCommit(commitOid).then(function(commit) { + ourCommit = commit; + }).then(function() { + return repository.createBranch(ourBranchName, commitOid) + .then(function(branch) { + ourBranch = branch; + return repository.createBranch(theirBranchName, commitOid); + }); + }); + }) + .then(function(branch) { + theirBranch = branch; + return fse.writeFile(path.join(repository.workdir(), theirFileName), + theirFileContent); + }) + .then(function() { + return RepoUtils.addFileToIndex(repository, theirFileName); + }) + .then(function(oid) { + assert.equal(oid.toString(), + "be5f0fd38a39a67135ad68921c93cd5c17fefb3d"); + + return repository.createCommit(theirBranch.name(), theirSignature, + theirSignature, "they made a commit", oid, [ourCommit]); + }) + .then(function(commitOid) { + assert.equal(commitOid.toString(), + "e9ebd92f2f4778baf6fa8e92f0c68642f931a554"); + + return removeFileFromIndex(repository, theirFileName); + }) + .then(function() { + return fse.remove(path.join(repository.workdir(), theirFileName)); + }) + .then(function() { + return fse.writeFile(path.join(repository.workdir(), ourFileName), + ourFileContent); + }) + .then(function() { + return RepoUtils.addFileToIndex(repository, ourFileName); + }) + .then(function(oid) { + assert.equal(oid.toString(), + "77867fc0bfeb3f80ab18a78c8d53aa3a06207047"); + + return repository.createCommit(ourBranch.name(), ourSignature, + ourSignature, "we made a commit", oid, [ourCommit]); + }) + .then(function(commitOid) { + assert.equal(commitOid.toString(), + "e7f37ee070837052937e24ad8ba66f6d83ae7941"); + + return removeFileFromIndex(repository, ourFileName); + }) + .then(function() { + return fse.remove(path.join(repository.workdir(), ourFileName)); + }) + .then(function() { + return repository.checkoutBranch(ourBranchName); + }) + .then(function() { + return repository.rebaseBranches(ourBranchName, theirBranchName, + null, ourSignature, function(rebase) { + assert.ok(rebase instanceof NodeGit.Rebase); + + nextCalls++; + + return Promise.resolve(); + }); + }) + .then(function(commit) { + // verify that the beforeNextFn callback was called + assert.equal(nextCalls, 2); + + // verify that the "ours" branch has moved to the correct place + assert.equal(commit.id().toString(), + "b937100ee0ea17ef20525306763505a7fe2be29e"); + + return commit.parent(0); + }) + .then(function(commit) { + // verify that we are on top of "their commit" + assert.equal(commit.id().toString(), + "e9ebd92f2f4778baf6fa8e92f0c68642f931a554"); + }); + }); + + it("beforeFinishFn sync callback receives correct rebase data", function() { + var baseFileName = "baseNewFile.txt"; + var ourFileName = "ourNewFile.txt"; + var theirFileName = "theirNewFile.txt"; + + var baseFileContent = "How do you feel about Toll Roads?"; + var ourFileContent = "I like Toll Roads. I have an EZ-Pass!"; + var theirFileContent = "I'm skeptical about Toll Roads"; + + var ourSignature = NodeGit.Signature.create + ("Ron Paul", "RonPaul@TollRoadsRBest.info", 123456789, 60); + var theirSignature = NodeGit.Signature.create + ("Greg Abbott", "Gregggg@IllTollYourFace.us", 123456789, 60); + + var repository = this.repository; + var ourCommit; + var ourBranch; + var theirBranch; + var ourBranchShaPreRebase; + var ourBranchShaPostRebase = "b937100ee0ea17ef20525306763505a7fe2be29e"; + var theirBranchSha; + + var nextCalls = 0; + + var calledBeforeFinishFn = false; + + return fse.writeFile(path.join(repository.workdir(), baseFileName), + baseFileContent) + // Load up the repository index and make our initial commit to HEAD + .then(function() { + return RepoUtils.addFileToIndex(repository, baseFileName); + }) + .then(function(oid) { + assert.equal(oid.toString(), + "b5cdc109d437c4541a13fb7509116b5f03d5039a"); + + return repository.createCommit("HEAD", ourSignature, + ourSignature, "initial commit", oid, []); + }) + .then(function(commitOid) { + assert.equal(commitOid.toString(), + "be03abdf0353d05924c53bebeb0e5bb129cda44a"); + + return repository.getCommit(commitOid).then(function(commit) { + ourCommit = commit; + }).then(function() { + return repository.createBranch(ourBranchName, commitOid) + .then(function(branch) { + ourBranch = branch; + return repository.createBranch(theirBranchName, commitOid); + }); + }); + }) + .then(function(branch) { + theirBranch = branch; + return fse.writeFile(path.join(repository.workdir(), theirFileName), + theirFileContent); + }) + .then(function() { + return RepoUtils.addFileToIndex(repository, theirFileName); + }) + .then(function(oid) { + assert.equal(oid.toString(), + "be5f0fd38a39a67135ad68921c93cd5c17fefb3d"); + + return repository.createCommit(theirBranch.name(), theirSignature, + theirSignature, "they made a commit", oid, [ourCommit]); + }) + .then(function(commitOid) { + theirBranchSha = commitOid.toString(); + assert.equal(theirBranchSha, + "e9ebd92f2f4778baf6fa8e92f0c68642f931a554"); + + return removeFileFromIndex(repository, theirFileName); + }) + .then(function() { + return fse.remove(path.join(repository.workdir(), theirFileName)); + }) + .then(function() { + return fse.writeFile(path.join(repository.workdir(), ourFileName), + ourFileContent); + }) + .then(function() { + return RepoUtils.addFileToIndex(repository, ourFileName); + }) + .then(function(oid) { + assert.equal(oid.toString(), + "77867fc0bfeb3f80ab18a78c8d53aa3a06207047"); + + return repository.createCommit(ourBranch.name(), ourSignature, + ourSignature, "we made a commit", oid, [ourCommit]); + }) + .then(function(commitOid) { + ourBranchShaPreRebase = commitOid.toString(); + assert.equal(ourBranchShaPreRebase, + "e7f37ee070837052937e24ad8ba66f6d83ae7941"); + + return removeFileFromIndex(repository, ourFileName); + }) + .then(function() { + return fse.remove(path.join(repository.workdir(), ourFileName)); + }) + .then(function() { + return repository.checkoutBranch(ourBranchName); + }) + .then(function() { + return repository.rebaseBranches(ourBranchName, theirBranchName, + null, ourSignature, function(rebase) { + assert.ok(rebase instanceof NodeGit.Rebase); + + nextCalls++; + + return Promise.resolve(); + }, function(rebaseMetadata) { + calledBeforeFinishFn = true; + + assert.equal(rebaseMetadata.ontoName, theirBranchName); + assert.equal(rebaseMetadata.ontoSha, theirBranchSha); + assert.equal(rebaseMetadata.originalHeadName, ourBranchName); + assert.equal( + rebaseMetadata.originalHeadSha, + ourBranchShaPreRebase + ); + assert.deepEqual( + rebaseMetadata.rewritten, + [[ourBranchShaPreRebase, ourBranchShaPostRebase]] + ); + }); + }) + .then(function(commit) { + // verify that the beforeNextFn callback was called + assert.equal(nextCalls, 2); + + // verify that the beforeFinishFn callback was called + assert(calledBeforeFinishFn, "beforeFinishFn was not called"); + + // verify that the "ours" branch has moved to the correct place + assert.equal(commit.id().toString(), ourBranchShaPostRebase); + + return commit.parent(0); + }) + .then(function(commit) { + // verify that we are on top of "their commit" + assert.equal(commit.id().toString(), + "e9ebd92f2f4778baf6fa8e92f0c68642f931a554"); + }); + }); + + it("beforeFinishFn async callback receives correct rebase data", function() { + var baseFileName = "baseNewFile.txt"; + var ourFileName = "ourNewFile.txt"; + var theirFileName = "theirNewFile.txt"; + + var baseFileContent = "How do you feel about Toll Roads?"; + var ourFileContent = "I like Toll Roads. I have an EZ-Pass!"; + var theirFileContent = "I'm skeptical about Toll Roads"; + + var ourSignature = NodeGit.Signature.create + ("Ron Paul", "RonPaul@TollRoadsRBest.info", 123456789, 60); + var theirSignature = NodeGit.Signature.create + ("Greg Abbott", "Gregggg@IllTollYourFace.us", 123456789, 60); + + var repository = this.repository; + var ourCommit; + var ourBranch; + var theirBranch; + var ourBranchShaPreRebase; + var ourBranchShaPostRebase = "b937100ee0ea17ef20525306763505a7fe2be29e"; + var theirBranchSha; + + var nextCalls = 0; + + var calledBeforeFinishFn = false; + + return fse.writeFile(path.join(repository.workdir(), baseFileName), + baseFileContent) + // Load up the repository index and make our initial commit to HEAD + .then(function() { + return RepoUtils.addFileToIndex(repository, baseFileName); + }) + .then(function(oid) { + assert.equal(oid.toString(), + "b5cdc109d437c4541a13fb7509116b5f03d5039a"); + + return repository.createCommit("HEAD", ourSignature, + ourSignature, "initial commit", oid, []); + }) + .then(function(commitOid) { + assert.equal(commitOid.toString(), + "be03abdf0353d05924c53bebeb0e5bb129cda44a"); + + return repository.getCommit(commitOid).then(function(commit) { + ourCommit = commit; + }).then(function() { + return repository.createBranch(ourBranchName, commitOid) + .then(function(branch) { + ourBranch = branch; + return repository.createBranch(theirBranchName, commitOid); + }); + }); + }) + .then(function(branch) { + theirBranch = branch; + return fse.writeFile(path.join(repository.workdir(), theirFileName), + theirFileContent); + }) + .then(function() { + return RepoUtils.addFileToIndex(repository, theirFileName); + }) + .then(function(oid) { + assert.equal(oid.toString(), + "be5f0fd38a39a67135ad68921c93cd5c17fefb3d"); + + return repository.createCommit(theirBranch.name(), theirSignature, + theirSignature, "they made a commit", oid, [ourCommit]); + }) + .then(function(commitOid) { + theirBranchSha = commitOid.toString(); + assert.equal(theirBranchSha, + "e9ebd92f2f4778baf6fa8e92f0c68642f931a554"); + + return removeFileFromIndex(repository, theirFileName); + }) + .then(function() { + return fse.remove(path.join(repository.workdir(), theirFileName)); + }) + .then(function() { + return fse.writeFile(path.join(repository.workdir(), ourFileName), + ourFileContent); + }) + .then(function() { + return RepoUtils.addFileToIndex(repository, ourFileName); + }) + .then(function(oid) { + assert.equal(oid.toString(), + "77867fc0bfeb3f80ab18a78c8d53aa3a06207047"); + + return repository.createCommit(ourBranch.name(), ourSignature, + ourSignature, "we made a commit", oid, [ourCommit]); + }) + .then(function(commitOid) { + ourBranchShaPreRebase = commitOid.toString(); + assert.equal(ourBranchShaPreRebase, + "e7f37ee070837052937e24ad8ba66f6d83ae7941"); + + return removeFileFromIndex(repository, ourFileName); + }) + .then(function() { + return fse.remove(path.join(repository.workdir(), ourFileName)); + }) + .then(function() { + return repository.checkoutBranch(ourBranchName); + }) + .then(function() { + return repository.rebaseBranches(ourBranchName, theirBranchName, + null, ourSignature, function(rebase) { + assert.ok(rebase instanceof NodeGit.Rebase); + + nextCalls++; + + return Promise.resolve(); + }, function(rebaseMetadata) { + calledBeforeFinishFn = true; + + assert.equal(rebaseMetadata.ontoName, theirBranchName); + assert.equal(rebaseMetadata.ontoSha, theirBranchSha); + assert.equal(rebaseMetadata.originalHeadName, ourBranchName); + assert.equal( + rebaseMetadata.originalHeadSha, + ourBranchShaPreRebase + ); + assert.deepEqual( + rebaseMetadata.rewritten, + [[ourBranchShaPreRebase, ourBranchShaPostRebase]] + ); + + return Promise.resolve(); + }); + }) + .then(function(commit) { + // verify that the beforeNextFn callback was called + assert.equal(nextCalls, 2); + + // verify that the beforeFinishFn callback was called + assert(calledBeforeFinishFn, "beforeFinishFn was not called"); + + // verify that the "ours" branch has moved to the correct place + assert.equal(commit.id().toString(), ourBranchShaPostRebase); + + return commit.parent(0); + }) + .then(function(commit) { + // verify that we are on top of "their commit" + assert.equal(commit.id().toString(), + "e9ebd92f2f4778baf6fa8e92f0c68642f931a554"); + }); + }); + + it("can rebase with conflicts using the convenience methods", function() { + var fileName = "everyonesFile.txt"; + + var baseFileContent = "How do you feel about Toll Roads?\n"; + var ourFileContent = "I like Toll Roads. I have an EZ-Pass!\n"; + var theirFileContent = "I'm skeptical about Toll Roads\n"; + + var expectedConflictedFileContent = "How do you feel about Toll Roads?\n" + "<<<<<<< theirs\n" + "I'm skeptical about Toll Roads\n" + @@ -931,6 +1590,7 @@ describe("Rebase", function() { var ourCommit; var ourBranch; var theirBranch; + var nextCalls=0; return fse.writeFile(path.join(repository.workdir(), fileName), baseFileContent) @@ -1027,14 +1687,23 @@ describe("Rebase", function() { return RepoUtils.addFileToIndex(repository, fileName); }) .then(function(oid) { - return repository.openIndex() + return repository.refreshIndex() .then(function(index) { assert.ok(!index.hasConflicts()); - return repository.continueRebase(ourSignature); + return repository.continueRebase(ourSignature, function(rebase) { + assert.ok(rebase instanceof NodeGit.Rebase); + + nextCalls++; + + return Promise.resolve(); + }); }); }) .then(function(commit) { + // verify that the beforeNextFn callback was called + assert.equal(nextCalls, 1); + // verify that the "ours" branch has moved to the correct place assert.equal(commit.id().toString(), "ef6d0e95167435b3d58f51ab165948c72f6f94b6"); @@ -1050,4 +1719,825 @@ describe("Rebase", function() { "b3c355bb606ec7da87174dfa1a0b0c0e3dc97bc0"); }); }); + + if (!isNode8) { + it("can sign commits during the rebase", function() { + var baseFileName = "baseNewFile.txt"; + var ourFileName = "ourNewFile.txt"; + var theirFileName = "theirNewFile.txt"; + + var baseFileContent = "How do you feel about Toll Roads?"; + var ourFileContent = "I like Toll Roads. I have an EZ-Pass!"; + var theirFileContent = "I'm skeptical about Toll Roads"; + + var ourSignature = NodeGit.Signature.create + ("Ron Paul", "RonPaul@TollRoadsRBest.info", 123456789, 60); + var theirSignature = NodeGit.Signature.create + ("Greg Abbott", "Gregggg@IllTollYourFace.us", 123456789, 60); + + var repository = this.repository; + var ourCommit; + var ourBranch; + var theirBranch; + var rebase; + + return fse.writeFile(path.join(repository.workdir(), baseFileName), + baseFileContent) + // Load up the repository index and make our initial commit to HEAD + .then(function() { + return RepoUtils.addFileToIndex(repository, baseFileName); + }) + .then(function(oid) { + assert.equal(oid.toString(), + "b5cdc109d437c4541a13fb7509116b5f03d5039a"); + + return repository.createCommit("HEAD", ourSignature, + ourSignature, "initial commit", oid, []); + }) + .then(function(commitOid) { + assert.equal(commitOid.toString(), + "be03abdf0353d05924c53bebeb0e5bb129cda44a"); + + return repository.getCommit(commitOid).then(function(commit) { + ourCommit = commit; + }).then(function() { + return repository.createBranch(ourBranchName, commitOid) + .then(function(branch) { + ourBranch = branch; + return repository.createBranch(theirBranchName, commitOid); + }); + }); + }) + .then(function(branch) { + theirBranch = branch; + return fse.writeFile(path.join(repository.workdir(), theirFileName), + theirFileContent); + }) + .then(function() { + return RepoUtils.addFileToIndex(repository, theirFileName); + }) + .then(function(oid) { + assert.equal(oid.toString(), + "be5f0fd38a39a67135ad68921c93cd5c17fefb3d"); + + return repository.createCommit(theirBranch.name(), theirSignature, + theirSignature, "they made a commit", oid, [ourCommit]); + }) + .then(function(commitOid) { + assert.equal(commitOid.toString(), + "e9ebd92f2f4778baf6fa8e92f0c68642f931a554"); + + return removeFileFromIndex(repository, theirFileName); + }) + .then(function() { + return fse.remove(path.join(repository.workdir(), theirFileName)); + }) + .then(function() { + return fse.writeFile(path.join(repository.workdir(), ourFileName), + ourFileContent); + }) + .then(function() { + return RepoUtils.addFileToIndex(repository, ourFileName); + }) + .then(function(oid) { + assert.equal(oid.toString(), + "77867fc0bfeb3f80ab18a78c8d53aa3a06207047"); + + return repository.createCommit(ourBranch.name(), ourSignature, + ourSignature, "we made a commit", oid, [ourCommit]); + }) + .then(function(commitOid) { + assert.equal(commitOid.toString(), + "e7f37ee070837052937e24ad8ba66f6d83ae7941"); + + return removeFileFromIndex(repository, ourFileName); + }) + .then(function() { + return fse.remove(path.join(repository.workdir(), ourFileName)); + }) + .then(function() { + return repository.checkoutBranch(ourBranchName); + }) + .then(function() { + return Promise.all([ + repository.getReference(ourBranchName), + repository.getReference(theirBranchName) + ]); + }) + .then(function(refs) { + assert.equal(refs.length, 2); + + return Promise.all([ + NodeGit.AnnotatedCommit.fromRef(repository, refs[0]), + NodeGit.AnnotatedCommit.fromRef(repository, refs[1]) + ]); + }) + .then(function(annotatedCommits) { + assert.equal(annotatedCommits.length, 2); + + var ourAnnotatedCommit = annotatedCommits[0]; + var theirAnnotatedCommit = annotatedCommits[1]; + + assert.equal(ourAnnotatedCommit.id().toString(), + "e7f37ee070837052937e24ad8ba66f6d83ae7941"); + assert.equal(theirAnnotatedCommit.id().toString(), + "e9ebd92f2f4778baf6fa8e92f0c68642f931a554"); + + return NodeGit.Rebase.init(repository, ourAnnotatedCommit, + theirAnnotatedCommit, null, { + signingCb: (commitContent) => ({ + code: NodeGit.Error.CODE.OK, + field: "moose-sig", + signedData: "A moose was here." + }) + }); + }) + .then(function(newRebase) { + rebase = newRebase; + + // there should only be 1 rebase operation to perform + assert.equal(rebase.operationEntrycount(), 1); + + return rebase.next(); + }) + .then(function(rebaseOperation) { + assert.equal(rebaseOperation.type(), + NodeGit.RebaseOperation.REBASE_OPERATION.PICK); + assert.equal(rebaseOperation.id().toString(), + "e7f37ee070837052937e24ad8ba66f6d83ae7941"); + + // Make sure we don't crash calling the signature CB + // after collecting garbage. + garbageCollect(); + + return rebase.commit(null, ourSignature); + }) + .then(function(commitOid) { + assert.equal(commitOid.toString(), + "617cd03370dd799f372e9dcfcd0b097aede1bd7f"); + + // git_rebase_operation_current returns the index of the rebase + // operation that was last applied, so after the first operation, it + // should be 0. + assert.equal(rebase.operationCurrent(), 0); + + return rebase.finish(ourSignature, {}); + }) + .then(function(result) { + assert.equal(result, 0); + + return repository.getBranchCommit(ourBranchName); + }) + .then(function(commit) { + // verify that the "ours" branch has moved to the correct place + assert.equal(commit.id().toString(), + "617cd03370dd799f372e9dcfcd0b097aede1bd7f"); + + return Promise.all([ + commit.parent(0), + NodeGit.Commit.extractSignature( + repository, + "617cd03370dd799f372e9dcfcd0b097aede1bd7f", + "moose-sig" + ) + ]); + }) + .then(function([parent, { signature }]) { + // verify that we are on top of "their commit" + assert.equal(parent.id().toString(), + "e9ebd92f2f4778baf6fa8e92f0c68642f931a554"); + assert.equal(signature, "A moose was here."); + }); + }); + + it("can optionally skip signing commits", function() { + var baseFileName = "baseNewFile.txt"; + var ourFileName = "ourNewFile.txt"; + var theirFileName = "theirNewFile.txt"; + + var baseFileContent = "How do you feel about Toll Roads?"; + var ourFileContent = "I like Toll Roads. I have an EZ-Pass!"; + var theirFileContent = "I'm skeptical about Toll Roads"; + + var ourSignature = NodeGit.Signature.create + ("Ron Paul", "RonPaul@TollRoadsRBest.info", 123456789, 60); + var theirSignature = NodeGit.Signature.create + ("Greg Abbott", "Gregggg@IllTollYourFace.us", 123456789, 60); + + var repository = this.repository; + var ourCommit; + var ourBranch; + var theirBranch; + var rebase; + + return fse.writeFile(path.join(repository.workdir(), baseFileName), + baseFileContent) + // Load up the repository index and make our initial commit to HEAD + .then(function() { + return RepoUtils.addFileToIndex(repository, baseFileName); + }) + .then(function(oid) { + assert.equal(oid.toString(), + "b5cdc109d437c4541a13fb7509116b5f03d5039a"); + + return repository.createCommit("HEAD", ourSignature, + ourSignature, "initial commit", oid, []); + }) + .then(function(commitOid) { + assert.equal(commitOid.toString(), + "be03abdf0353d05924c53bebeb0e5bb129cda44a"); + + return repository.getCommit(commitOid).then(function(commit) { + ourCommit = commit; + }).then(function() { + return repository.createBranch(ourBranchName, commitOid) + .then(function(branch) { + ourBranch = branch; + return repository.createBranch(theirBranchName, commitOid); + }); + }); + }) + .then(function(branch) { + theirBranch = branch; + return fse.writeFile(path.join(repository.workdir(), theirFileName), + theirFileContent); + }) + .then(function() { + return RepoUtils.addFileToIndex(repository, theirFileName); + }) + .then(function(oid) { + assert.equal(oid.toString(), + "be5f0fd38a39a67135ad68921c93cd5c17fefb3d"); + + return repository.createCommit(theirBranch.name(), theirSignature, + theirSignature, "they made a commit", oid, [ourCommit]); + }) + .then(function(commitOid) { + assert.equal(commitOid.toString(), + "e9ebd92f2f4778baf6fa8e92f0c68642f931a554"); + + return removeFileFromIndex(repository, theirFileName); + }) + .then(function() { + return fse.remove(path.join(repository.workdir(), theirFileName)); + }) + .then(function() { + return fse.writeFile(path.join(repository.workdir(), ourFileName), + ourFileContent); + }) + .then(function() { + return RepoUtils.addFileToIndex(repository, ourFileName); + }) + .then(function(oid) { + assert.equal(oid.toString(), + "77867fc0bfeb3f80ab18a78c8d53aa3a06207047"); + + return repository.createCommit(ourBranch.name(), ourSignature, + ourSignature, "we made a commit", oid, [ourCommit]); + }) + .then(function(commitOid) { + assert.equal(commitOid.toString(), + "e7f37ee070837052937e24ad8ba66f6d83ae7941"); + + return removeFileFromIndex(repository, ourFileName); + }) + .then(function() { + return fse.remove(path.join(repository.workdir(), ourFileName)); + }) + .then(function() { + return repository.checkoutBranch(ourBranchName); + }) + .then(function() { + return Promise.all([ + repository.getReference(ourBranchName), + repository.getReference(theirBranchName) + ]); + }) + .then(function(refs) { + assert.equal(refs.length, 2); + + return Promise.all([ + NodeGit.AnnotatedCommit.fromRef(repository, refs[0]), + NodeGit.AnnotatedCommit.fromRef(repository, refs[1]) + ]); + }) + .then(function(annotatedCommits) { + assert.equal(annotatedCommits.length, 2); + + var ourAnnotatedCommit = annotatedCommits[0]; + var theirAnnotatedCommit = annotatedCommits[1]; + + assert.equal(ourAnnotatedCommit.id().toString(), + "e7f37ee070837052937e24ad8ba66f6d83ae7941"); + assert.equal(theirAnnotatedCommit.id().toString(), + "e9ebd92f2f4778baf6fa8e92f0c68642f931a554"); + + return NodeGit.Rebase.init(repository, ourAnnotatedCommit, + theirAnnotatedCommit, null, { + signingCb: () => ({ + code: NodeGit.Error.CODE.PASSTHROUGH + }) + }); + }) + .then(function(newRebase) { + rebase = newRebase; + + // there should only be 1 rebase operation to perform + assert.equal(rebase.operationEntrycount(), 1); + + return rebase.next(); + }) + .then(function(rebaseOperation) { + assert.equal(rebaseOperation.type(), + NodeGit.RebaseOperation.REBASE_OPERATION.PICK); + assert.equal(rebaseOperation.id().toString(), + "e7f37ee070837052937e24ad8ba66f6d83ae7941"); + + // Make sure we don't crash calling the signature CB + // after collecting garbage. + garbageCollect(); + + return rebase.commit(null, ourSignature); + }) + .then(function(commitOid) { + assert.equal(commitOid.toString(), + "b937100ee0ea17ef20525306763505a7fe2be29e"); + + // git_rebase_operation_current returns the index of the rebase + // operation that was last applied, so after the first operation, it + // should be 0. + assert.equal(rebase.operationCurrent(), 0); + + return rebase.finish(ourSignature, {}); + }) + .then(function(result) { + assert.equal(result, 0); + + return repository.getBranchCommit(ourBranchName); + }) + .then(function(commit) { + // verify that the "ours" branch has moved to the correct place + assert.equal(commit.id().toString(), + "b937100ee0ea17ef20525306763505a7fe2be29e"); + + return commit.parent(0); + }) + .then(function(parent) { + // verify that we are on top of "their commit" + assert.equal(parent.id().toString(), + "e9ebd92f2f4778baf6fa8e92f0c68642f931a554"); + return NodeGit.Commit.extractSignature( + repository, + "b937100ee0ea17ef20525306763505a7fe2be29e", + "moose-sig" + ) + .then(function() { + assert.fail("This commit should not be signed."); + }, function (error) { + if (error && error.message === "this commit is not signed") { + return; + } + throw error; + }); + }); + }); + + it("will throw if commit signing cb returns an error code", function() { + var baseFileName = "baseNewFile.txt"; + var ourFileName = "ourNewFile.txt"; + var theirFileName = "theirNewFile.txt"; + + var baseFileContent = "How do you feel about Toll Roads?"; + var ourFileContent = "I like Toll Roads. I have an EZ-Pass!"; + var theirFileContent = "I'm skeptical about Toll Roads"; + + var ourSignature = NodeGit.Signature.create + ("Ron Paul", "RonPaul@TollRoadsRBest.info", 123456789, 60); + var theirSignature = NodeGit.Signature.create + ("Greg Abbott", "Gregggg@IllTollYourFace.us", 123456789, 60); + + var repository = this.repository; + var ourCommit; + var ourBranch; + var theirBranch; + var rebase; + + return fse.writeFile(path.join(repository.workdir(), baseFileName), + baseFileContent) + // Load up the repository index and make our initial commit to HEAD + .then(function() { + return RepoUtils.addFileToIndex(repository, baseFileName); + }) + .then(function(oid) { + assert.equal(oid.toString(), + "b5cdc109d437c4541a13fb7509116b5f03d5039a"); + + return repository.createCommit("HEAD", ourSignature, + ourSignature, "initial commit", oid, []); + }) + .then(function(commitOid) { + assert.equal(commitOid.toString(), + "be03abdf0353d05924c53bebeb0e5bb129cda44a"); + + return repository.getCommit(commitOid).then(function(commit) { + ourCommit = commit; + }).then(function() { + return repository.createBranch(ourBranchName, commitOid) + .then(function(branch) { + ourBranch = branch; + return repository.createBranch(theirBranchName, commitOid); + }); + }); + }) + .then(function(branch) { + theirBranch = branch; + return fse.writeFile(path.join(repository.workdir(), theirFileName), + theirFileContent); + }) + .then(function() { + return RepoUtils.addFileToIndex(repository, theirFileName); + }) + .then(function(oid) { + assert.equal(oid.toString(), + "be5f0fd38a39a67135ad68921c93cd5c17fefb3d"); + + return repository.createCommit(theirBranch.name(), theirSignature, + theirSignature, "they made a commit", oid, [ourCommit]); + }) + .then(function(commitOid) { + assert.equal(commitOid.toString(), + "e9ebd92f2f4778baf6fa8e92f0c68642f931a554"); + + return removeFileFromIndex(repository, theirFileName); + }) + .then(function() { + return fse.remove(path.join(repository.workdir(), theirFileName)); + }) + .then(function() { + return fse.writeFile(path.join(repository.workdir(), ourFileName), + ourFileContent); + }) + .then(function() { + return RepoUtils.addFileToIndex(repository, ourFileName); + }) + .then(function(oid) { + assert.equal(oid.toString(), + "77867fc0bfeb3f80ab18a78c8d53aa3a06207047"); + + return repository.createCommit(ourBranch.name(), ourSignature, + ourSignature, "we made a commit", oid, [ourCommit]); + }) + .then(function(commitOid) { + assert.equal(commitOid.toString(), + "e7f37ee070837052937e24ad8ba66f6d83ae7941"); + + return removeFileFromIndex(repository, ourFileName); + }) + .then(function() { + return fse.remove(path.join(repository.workdir(), ourFileName)); + }) + .then(function() { + return repository.checkoutBranch(ourBranchName); + }) + .then(function() { + return Promise.all([ + repository.getReference(ourBranchName), + repository.getReference(theirBranchName) + ]); + }) + .then(function(refs) { + assert.equal(refs.length, 2); + + return Promise.all([ + NodeGit.AnnotatedCommit.fromRef(repository, refs[0]), + NodeGit.AnnotatedCommit.fromRef(repository, refs[1]) + ]); + }) + .then(function(annotatedCommits) { + assert.equal(annotatedCommits.length, 2); + + var ourAnnotatedCommit = annotatedCommits[0]; + var theirAnnotatedCommit = annotatedCommits[1]; + + assert.equal(ourAnnotatedCommit.id().toString(), + "e7f37ee070837052937e24ad8ba66f6d83ae7941"); + assert.equal(theirAnnotatedCommit.id().toString(), + "e9ebd92f2f4778baf6fa8e92f0c68642f931a554"); + + return NodeGit.Rebase.init(repository, ourAnnotatedCommit, + theirAnnotatedCommit, null, { + signingCb: () => ({ + code: NodeGit.Error.CODE.ERROR + }) + }); + }) + .then(function(newRebase) { + rebase = newRebase; + + // there should only be 1 rebase operation to perform + assert.equal(rebase.operationEntrycount(), 1); + + return rebase.next(); + }) + .then(function(rebaseOperation) { + assert.equal(rebaseOperation.type(), + NodeGit.RebaseOperation.REBASE_OPERATION.PICK); + assert.equal(rebaseOperation.id().toString(), + "e7f37ee070837052937e24ad8ba66f6d83ae7941"); + + // Make sure we don't crash calling the signature CB + // after collecting garbage. + garbageCollect(); + + return rebase.commit(null, ourSignature); + }) + .then(function() { + assert.fail("rebase.commit should have failed"); + }, function(error) { + if (error && error.errno === NodeGit.Error.CODE.ERROR) { + return; + } + throw error; + }); + }); + } + + it("will not throw on patch already applied errors", function() { + var baseFileName = "baseNewFile.txt"; + var theirFileName = "myFile.txt"; + + var baseFileContent = "How do you feel about Toll Roads?"; + var theirFileContent = "Hello there"; + + var ourSignature = NodeGit.Signature.create + ("Ron Paul", "RonPaul@TollRoadsRBest.info", 123456789, 60); + var theirSignature = NodeGit.Signature.create + ("Greg Abbott", "Gregggg@IllTollYourFace.us", 123456789, 60); + + var repository = this.repository; + var initialCommit; + var ourBranch; + var theirBranch; + var rebase; + + return fse.writeFile(path.join(repository.workdir(), baseFileName), + baseFileContent) + // Load up the repository index and make our initial commit to HEAD + .then(function() { + return RepoUtils.addFileToIndex(repository, baseFileName); + }) + .then(function(oid) { + assert.equal(oid.toString(), + "b5cdc109d437c4541a13fb7509116b5f03d5039a"); + + return repository.createCommit("HEAD", ourSignature, + ourSignature, "initial commit", oid, []); + }) + .then(function(commitOid) { + assert.equal(commitOid.toString(), + "be03abdf0353d05924c53bebeb0e5bb129cda44a"); + + return repository.getCommit(commitOid).then(function(commit) { + initialCommit = commit; + }).then(function() { + return repository.createBranch(ourBranchName, commitOid) + .then(function(branch) { + ourBranch = branch; + return repository.createBranch(theirBranchName, commitOid); + }); + }); + }) + .then(function(branch) { + theirBranch = branch; + return fse.writeFile( + path.join(repository.workdir(), theirFileName), + theirFileContent + ); + }) + .then(function() { + return RepoUtils.addFileToIndex(repository, theirFileName); + }) + .then(function(oid) { + assert.equal(oid.toString(), + "6f14d06b24fa8ea26f511dd8a94a003fd37eadc5"); + + return repository.createCommit(theirBranch.name(), theirSignature, + theirSignature, "they made a commit", oid, [initialCommit]) + .then(function(commitOid) { + assert.equal(commitOid.toString(), + "c4cc225184b9c9682cb48294358d9d65f8ec42c7"); + return repository.createCommit(ourBranch.name(), ourSignature, + ourSignature, "we made a commit", oid, [initialCommit]); + }); + }) + .then(function(commitOid) { + assert.equal(commitOid.toString(), + "5814ffa17b8a677191d89d5372f1e46d50d976ae"); + + return removeFileFromIndex(repository, theirFileName); + }) + .then(function() { + return fse.remove(path.join(repository.workdir(), theirFileName)); + }) + .then(function() { + return repository.checkoutBranch(ourBranchName); + }) + .then(function() { + return Promise.all([ + repository.getReference(ourBranchName), + repository.getReference(theirBranchName) + ]); + }) + .then(function(refs) { + assert.equal(refs.length, 2); + + return Promise.all([ + NodeGit.AnnotatedCommit.fromRef(repository, refs[0]), + NodeGit.AnnotatedCommit.fromRef(repository, refs[1]) + ]); + }) + .then(function(annotatedCommits) { + assert.equal(annotatedCommits.length, 2); + + var ourAnnotatedCommit = annotatedCommits[0]; + var theirAnnotatedCommit = annotatedCommits[1]; + + assert.equal(ourAnnotatedCommit.id().toString(), + "5814ffa17b8a677191d89d5372f1e46d50d976ae"); + assert.equal(theirAnnotatedCommit.id().toString(), + "c4cc225184b9c9682cb48294358d9d65f8ec42c7"); + + return NodeGit.Rebase.init( + repository, + ourAnnotatedCommit, + theirAnnotatedCommit + ); + }) + .then(function(newRebase) { + rebase = newRebase; + + // there should only be 1 rebase operation to perform + assert.equal(rebase.operationEntrycount(), 1); + + return rebase.next(); + }) + .catch(function(error) { + assert.fail(error); + + throw error; + }) + .then(function(rebaseOperation) { + assert.equal(rebaseOperation.type(), + NodeGit.RebaseOperation.REBASE_OPERATION.PICK); + assert.equal(rebaseOperation.id().toString(), + "5814ffa17b8a677191d89d5372f1e46d50d976ae"); + + return rebase.commit(null, ourSignature); + }) + .then(function() { + assert.fail("Rebase should have failed."); + }, function (error) { + if (error && error.errno === NodeGit.Error.CODE.EAPPLIED) { + return; + } + + assert.fail(error); + + throw error; + }) + .then(function() { + return repository.continueRebase(); + }) + .then(function() { + return rebase.next(); + }) + .catch(function(error) { + assert.equal(error.errno, NodeGit.Error.CODE.ITEROVER); + }); + }); + + + it("rebase signs correctly if rebaseOptions are re-used", function () { + const ourFileName = "ourNewFile.txt"; + const theirFileName = "theirNewFile.txt"; + + const ourFileContent = "I like Toll Roads. I have an EZ-Pass!"; + const theirFileContent = "I'm skeptical about Toll Roads"; + + const ourSignature = NodeGit.Signature.create + ("Ron Paul", "RonPaul@TollRoadsRBest.info", 123456789, 60); + const theirSignature = NodeGit.Signature.create + ("Greg Abbott", "Gregggg@IllTollYourFace.us", 123456789, 60); + + let ourCommit; + let theirCommit; + + let rebase; + let newCommitOid; + + const rebaseOptions = { + signingCb: () => ({ + code: NodeGit.Error.CODE.OK, + field: "moose-sig", + signedData: "A moose was here." + }) + }; + + const repository = this.repository; + + // Create two commits on master + // one + return fse.writeFile(path.join(repository.workdir(), ourFileName), + ourFileContent) + .then(() => RepoUtils.addFileToIndex(repository, ourFileName)) + .then((oid) => { + assert.equal(oid.toString(), + "11ead82b1135b8e240fb5d61e703312fb9cc3d6a"); + return repository.createCommit("HEAD", ourSignature, ourSignature, + "we made a commit", oid, []); + }) + .then((commitOid) => { + assert.equal(commitOid.toString(), + "91a183f87842ebb7a9b08dad8bc2473985796844"); + return repository.getCommit(commitOid); + }) + .then((_ourCommit) => { + ourCommit = _ourCommit; + return fse.writeFile(path.join(repository.workdir(), theirFileName), + theirFileContent); + }) + .then(() => RepoUtils.addFileToIndex(repository, theirFileName)) + .then((oid) => { + assert.equal(oid.toString(), + "76631cb5a290dafe2959152626bb90f2a6d8ec94"); + return repository.createCommit("HEAD", theirSignature, + theirSignature, "they made a commit", oid, [ourCommit]); + }) + .then((commitOid) => { + assert.equal(commitOid.toString(), + "0e9231d489b3f4303635fc4b0397830da095e7e7"); + return repository.getCommit(commitOid); + + }) + .then((_theirCommit) => { + theirCommit = _theirCommit; + return Promise.all([ + NodeGit.AnnotatedCommit.lookup( + repository, + ourCommit.id() + ), + NodeGit.AnnotatedCommit.lookup( + repository, + theirCommit.id() + ) + ]); + }) + // rebase latest commit + .then(([ourAnnotatedCommit, theirAnnotatedCommit]) => + NodeGit.Rebase.init( + repository, + // branch, upstream, onto + theirAnnotatedCommit, ourAnnotatedCommit, null, + rebaseOptions // use once + )) + .then(() => { + return NodeGit.Rebase.open( + repository, + rebaseOptions // use twice + ); + }) + .then((_rebase) => { + rebase = _rebase; + return rebase.next(); + }) + .then(() => { + const operationCurrentIndex = rebase.operationCurrent(); + assert(operationCurrentIndex === 0); + // Make sure we don't crash calling the signature CB + // after collecting garbage. + garbageCollect(); + return rebase.commit(null, ourSignature); + }) + .then((_newCommitOid) => { + newCommitOid = _newCommitOid; + assert.strictEqual(newCommitOid.toString(), + "9909e435b52322a71dc341d747b29c392a34c745"); + return rebase.next(); + }) + .then(() => { + assert.fail("should throw"); + }) + .catch((error) => { + assert(error.errno === NodeGit.Error.CODE.ITEROVER); + assert.strictEqual(rebase.finish(ourSignature), 0); + return NodeGit.Commit.extractSignature( + repository, + newCommitOid.toString(), + "moose-sig" + ); + }) + .then((sig) => { + assert.strictEqual(sig.signature, "A moose was here."); + }); +}); }); diff --git a/test/tests/refs.js b/test/tests/refs.js index 12b44ec545..1cad9f4084 100644 --- a/test/tests/refs.js +++ b/test/tests/refs.js @@ -1,17 +1,14 @@ var assert = require("assert"); var path = require("path"); -var promisify = require("promisify-node"); var local = path.join.bind(path, __dirname); -// Have to wrap exec, since it has a weird callback signature. -var exec = promisify(function(command, opts, callback) { - return require("child_process").exec(command, opts, callback); -}); +var exec = require("../../utils/execPromise"); describe("Reference", function() { var NodeGit = require("../../"); var Repository = NodeGit.Repository; var Reference = NodeGit.Reference; + var Reflog = NodeGit.Reflog; var reposPath = local("../repos/workdir"); var refName = "refs/heads/master"; @@ -53,6 +50,19 @@ describe("Reference", function() { assert.equal(this.reference.toString(), refName); }); + it("can compare two identical references", function() { + assert.equal(this.reference.cmp(this.reference), 0); + }); + + it("can compare two different references", function() { + var ref = this.reference; + + return this.repository.getReference("checkout-test") + .then(function(otherRef) { + assert.notEqual(ref.cmp(otherRef), 0); + }); + }); + it("will return undefined looking up the symbolic target if not symbolic", function() { assert(this.reference.symbolicTarget() === undefined); @@ -66,4 +76,49 @@ describe("Reference", function() { }); }); + it("can rename a reference", function() { + var newRefName = "refs/heads/chasta-boran"; + var ref = this.reference; + var repo = this.repository; + var reflogMessage = "reflog message"; + var refExistsMessage = "Renamed ref still exists"; + + return repo.getReference(newRefName) + .then(function() { + // The new ref name should not exist yet + throw new Error(refExistsMessage); + }) + .catch(function(err) { + // Should throw an error explaining that the ref + // does not exist + assert.ok(err.message.includes(newRefName)); + return ref.rename(newRefName, 0, reflogMessage); + }) + .then(function(reference) { + // The ref should be renamed at this point + assert.equal(reference.name(), newRefName); + return repo.getReference(refName); + }) + .then(function() { + // The original ref name should not be found + throw new Error(refExistsMessage); + }) + .catch(function(err) { + assert.ok(err.message.includes(refName)); + return Reflog.read(repo, newRefName); + }) + .then(function(reflog) { + var refEntryMessage = reflog + .entryByIndex(0) + .message(); + // The reflog should have the message passed to + // the rename + assert.equal(refEntryMessage, reflogMessage); + return repo.getReference(newRefName); + }) + .then(function(newRef) { + // Set the ref name back to `master` + return newRef.rename(refName, 0, "another reflog message"); + }); + }); }); diff --git a/test/tests/remote.js b/test/tests/remote.js index 92fe286e41..c9bf8192c7 100644 --- a/test/tests/remote.js +++ b/test/tests/remote.js @@ -1,7 +1,13 @@ var assert = require("assert"); var path = require("path"); -var Promise = require("nodegit-promise"); var local = path.join.bind(path, __dirname); +var _ = require("lodash"); +var fp = require("lodash/fp"); + +var garbageCollect = require("../utils/garbage_collect.js"); +var RepoUtils = require("../utils/repository_setup"); + +const isNode8 = process.versions.node.split(".")[0] === "8"; describe("Remote", function() { var NodeGit = require("../../"); @@ -9,12 +15,13 @@ describe("Remote", function() { var Remote = NodeGit.Remote; var reposPath = local("../repos/workdir"); + var bareReposPath = local("../repos/bare"); var url = "https://github.com/nodegit/test"; var url2 = "https://github.com/nodegit/test2"; var privateUrl = "git@github.com:nodegit/private"; function removeNonOrigins(repo) { - return repo.getRemotes() + return repo.getRemoteNames() .then(function(remotes) { return remotes.reduce(function(promise, remote) { if (remote !== "origin") { @@ -41,6 +48,9 @@ describe("Remote", function() { test.remote = remote; return removeNonOrigins(test.repository); + }) + .then(function() { + return RepoUtils.createRepository(bareReposPath, 1); }); }); @@ -62,13 +72,17 @@ describe("Remote", function() { it("can set a remote", function() { var repository = this.repository; - Remote.create(repository, "origin1", url); - - Remote.setPushurl(repository, "origin1", "https://google.com/"); - return Remote.lookup(repository, "origin1").then(function(remote) { - assert.equal(remote.pushurl(), "https://google.com/"); - }); + return Remote.create(repository, "origin1", url) + .then(function() { + return Remote.setPushurl(repository, "origin1", "https://google.com/"); + }) + .then(function() { + return Remote.lookup(repository, "origin1"); + }) + .then(function(remote) { + assert.equal(remote.pushurl(), "https://google.com/"); + }); }); it("can read the remote name", function() { @@ -77,22 +91,53 @@ describe("Remote", function() { it("can create and load a new remote", function() { var repository = this.repository; - Remote.create(repository, "origin2", url); - return Remote.lookup(repository, "origin2").then(function(remote) { - assert(remote.url(), url); - }); + return Remote.create(repository, "origin2", url) + .then(function() { + return Remote.lookup(repository, "origin2"); + }) + .then(function(remote) { + assert(remote.url(), url); + }); + }); + + it("can rename a remote", function() { + var repository = this.repository; + + return Remote.list(repository) + .then(function(remoteNames) { + assert.deepEqual(remoteNames, ["origin"]); + return Remote.rename(repository, "origin", "origin2"); + }) + .then(function(problems) { + assert.deepEqual(problems, []); + return Remote.list(repository); + }) + .then(function(remoteNames) { + assert.deepEqual(remoteNames, ["origin2"]); + return Remote.rename(repository, "origin2", "origin"); + }) + .then(function(problems) { + assert.deepEqual(problems, []); + return Remote.list(repository); + }) + .then(function(remoteNames) { + assert.deepEqual(remoteNames, ["origin"]); + }); }); it("can delete a remote", function() { var repository = this.repository; - Remote.create(repository, "origin3", url); - return Remote.delete(repository, "origin3") + return Remote.create(repository, "origin3", url) .then(function() { - return Remote.lookup(repository, "origin3"); + return Remote.delete(repository, "origin3"); }) - .then(Promise.reject, Promise.resolve); + .then(function() { + return Remote.lookup(repository, "origin3") + // We only want to catch the failed lookup + .then(Promise.reject.bind(Promise), Promise.resolve.bind(Promise)); + }); }); it("can download from a remote", function() { @@ -102,9 +147,7 @@ describe("Remote", function() { return repo.getRemote("origin") .then(function(remote) { remoteCallbacks = { - certificateCheck: function() { - return 1; - } + certificateCheck: () => 0 }; return remote.connect(NodeGit.Enums.DIRECTION.FETCH, remoteCallbacks) @@ -116,6 +159,59 @@ describe("Remote", function() { }); }); + it("can monitor transfer progress while pushing", function() { + var repo = this.repository; + var wasCalled = false; + + return Remote.create(repo, "bare", bareReposPath) + .then(function(remote) { + var fetchOpts = { + callbacks: { + pushTransferProgress: function() { + wasCalled = true; + } + } + }; + + var ref = "refs/heads/master"; + var refs = [ref + ":" + ref]; + + return remote.push(refs, fetchOpts) + .then(function(res) { + assert.ok(wasCalled); + }); + }); + }); + + it("can monitor transfer progress while pushing with throttling", + function() { + var repo = this.repository; + var wasCalled = false; + + return Remote.create(repo, "bare", bareReposPath) + .then(function(remote) { + var fetchOpts = { + callbacks: { + pushTransferProgress: { + throttle: 200, + callback: function() { + wasCalled = true; + }, + } + } + }; + + var ref = "refs/heads/master"; + var refs = [ref + ":" + ref]; + + return remote.push(refs, fetchOpts) + .then(function(res) { + assert.ok(wasCalled); + }); + }); + } + ); + it("can monitor transfer progress while downloading", function() { // Set a reasonable timeout here now that our repository has grown. this.timeout(600000); @@ -123,18 +219,14 @@ describe("Remote", function() { var repo = this.repository; var wasCalled = false; - Remote.create(repo, "test2", url2); - - return repo.getRemote("test2") + return Remote.create(repo, "test2", url2) .then(function(remote) { var fetchOpts = { callbacks: { credentials: function(url, userName) { - return NodeGit.Cred.sshKeyFromAgent(userName); - }, - certificateCheck: function() { - return 1; + return NodeGit.Credential.sshKeyFromAgent(userName); }, + certificateCheck: () => 0, transferProgress: function() { wasCalled = true; @@ -151,148 +243,385 @@ describe("Remote", function() { }); }); + it("can get the default branch of a remote", function() { + var remoteCallbacks = { + certificateCheck: () => 0 + }; + + var remote = this.remote; + + return remote.connect(NodeGit.Enums.DIRECTION.FETCH, remoteCallbacks) + .then(function() { return remote.defaultBranch(); }) + .then(function(branchName) { + assert.equal("refs/heads/master", branchName); + }); + }); + it("can fetch from a remote", function() { return this.repository.fetch("origin", { callbacks: { credentials: function(url, userName) { - return NodeGit.Cred.sshKeyFromAgent(userName); + return NodeGit.Credential.sshKeyFromAgent(userName); }, - certificateCheck: function() { - return 1; - } + certificateCheck: () => 0 } }); }); it("can fetch from a private repository", function() { - this.timeout(15000); - var repo = this.repository; - var remote = Remote.create(repo, "private", privateUrl); var fetchOptions = { callbacks: { credentials: function(url, userName) { - return NodeGit.Cred.sshKeyNew( + return NodeGit.Credential.sshKeyNew( userName, path.resolve("./test/nodegit-test-rsa.pub"), path.resolve("./test/nodegit-test-rsa"), "" ); }, - certificateCheck: function() { - return 1; - } + certificateCheck: () => 0 } }; - return remote.fetch(null, fetchOptions, "Fetch from private") + return Remote.create(repo, "private", privateUrl) + .then(function(remote) { + return remote.fetch(null, fetchOptions, "Fetch from private"); + }) .catch(function() { assert.fail("Unable to fetch from private repository"); }); }); it("can reject fetching from private repository without valid credentials", - function() { - this.timeout(15000); - - var repo = this.repository; - var remote = Remote.create(repo, "private", privateUrl); - var fetchOptions = { - callbacks: { - credentials: function(url, userName) { - return NodeGit.Cred.sshKeyFromAgent(userName); - }, - certificateCheck: function() { - return 1; + function() { + var repo = this.repository; + var firstPass = true; + var fetchOptions = { + callbacks: { + credentials: function(url, userName) { + if (firstPass) { + firstPass = false; + return NodeGit.Credential.sshKeyFromAgent(userName); + } + }, + certificateCheck: () => 0 } - } - }; - - return remote.fetch(null, fetchOptions, "Fetch from private") - .then(function () { - assert.fail("Should not be able to fetch from repository"); - }) - .catch(function(error) { - assert.equal( - error.message.trim(), - "ERROR: Repository not found.", - "Should not be able to find repository." - ); - }); + }; + + return Remote.create(repo, "private", privateUrl) + .then(function(remote) { + return remote.fetch(null, fetchOptions, "Fetch from private"); + }) + .then(function () { + assert.fail("Should not be able to fetch from repository"); + }) + .catch(function(error) { + assert.equal( + error.message.trim(), + "ERROR: Repository not found.", + "Should not be able to find repository." + ); + }); }); it("can fetch from all remotes", function() { - // Set a reasonable timeout here for the fetchAll test - this.timeout(15000); - var repository = this.repository; - Remote.create(repository, "test1", url); - Remote.create(repository, "test2", url2); - return repository.fetchAll({ - callbacks: { - credentials: function(url, userName) { - return NodeGit.Cred.sshKeyFromAgent(userName); - }, - certificateCheck: function() { - return 1; - } - } - }); + return Remote.create(repository, "test1", url) + .then(function() { + return Remote.create(repository, "test2", url2); + }) + .then(function() { + return repository.fetchAll({ + callbacks: { + credentials: function(url, userName) { + return NodeGit.Credential.sshKeyFromAgent(userName); + }, + certificateCheck: () => 0 + } + }); + }); }); - it("cannot push to a repository with invalid credentials", function() { - this.timeout(5000); - var repo = this.repository; - var branch = "should-not-exist"; - return Remote.lookup(repo, "origin") + if (!isNode8) { + it("will reject if credentials promise rejects", function() { + var repo = this.repository; + var branch = "should-not-exist"; + return Remote.lookup(repo, "origin") .then(function(remote) { var ref = "refs/heads/" + branch; var refs = [ref + ":" + ref]; - var firstPass = true; var options = { callbacks: { credentials: function(url, userName) { - if (firstPass) { - firstPass = false; - if (url.indexOf("https") === -1) { - return NodeGit.Cred.sshKeyFromAgent(userName); - } else { - return NodeGit.Cred.userpassPlaintextNew(userName, ""); - } - } else { - return NodeGit.Cred.defaultNew(); - } + var test = Promise.resolve("test") + .then(function() { return; }) + .then(function() { return; }) + .then(function() { return; }) + .then(function() { + return Promise.reject(new Error("failure case")); + }); + return test; }, - certificateCheck: function() { - return 1; - } + certificateCheck: () => 0 } }; return remote.push(refs, options); }) - // takes care of windows bug, see the .catch for the proper pathway - // that this flow should take (cred cb doesn't run twice -> throws error) .then(function() { return Promise.reject( new Error("should not be able to push to the repository")); - }, function(err) { - if (err.message.indexOf(401) === -1) { - throw err; - } else { - return Promise.resolve(); - } + }, function(err) { + if (err.message === "failure case") + { + return Promise.resolve(); + } else { + throw err; + } + }) + .then(function() { + return Remote.lookup(repo, "origin"); + }) + .then(function(remote) { + var ref = "refs/heads/" + branch; + var refs = [ref + ":" + ref]; + var options = { + callbacks: { + credentials: function(url, userName) { + var test = Promise.resolve() + .then(Promise.resolve.bind(Promise)) + .then(Promise.resolve.bind(Promise)) + .then(Promise.resolve.bind(Promise)) + .then(Promise.reject.bind(Promise)); + return test; + }, + certificateCheck: () => 0 + } + }; + return remote.push(refs, options); + }) + .then(function() { + return Promise.reject( + new Error("should not be able to push to the repository")); + }, function(err) { + if (err.message === "Method push has thrown an error.") + { + return Promise.resolve(); + } else { + throw err; + } + }); + }); + + it("cannot push to a repository with invalid credentials", function() { + var repo = this.repository; + var branch = "should-not-exist"; + return Remote.lookup(repo, "origin") + .then(function(remote) { + var ref = "refs/heads/" + branch; + var refs = [ref + ":" + ref]; + var firstPass = true; + var options = { + callbacks: { + credentials: function(url, userName) { + if (firstPass) { + firstPass = false; + if (url.indexOf("https") === -1) { + return NodeGit.Credential.sshKeyFromAgent(userName); + } else { + return NodeGit.Credential + .userpassPlaintextNew(userName, ""); + } + } else { + return Promise.reject(); + } + }, + certificateCheck: () => 0 + } + }; + return remote.push(refs, options); + }) + // takes care of windows bug, see the .catch for the proper pathway + // that this flow should take (cred cb doesn't run twice -> + // throws error) + .then(function() { + return Promise.reject( + new Error("should not be able to push to the repository")); + }, function(err) { + if (err.message.indexOf(401) === -1) { + throw err; + } else { + return Promise.resolve(); + } + }) + // catches linux / osx failure to use anonymous credentials + // stops callback infinite loop + .catch(function (reason) { + const messageWithoutNewlines = reason.message.replace( + /\n|\r/g, + "" + ); + const validErrors = [ + "Method push has thrown an error.", + "failed to set credentials: The parameter is incorrect." + ]; + assert.ok( + _.includes(validErrors, messageWithoutNewlines), + "Unexpected error: " + reason.message + ); + }); + }); + } + + it("is kept alive by refspec", function() { + var repo = this.repository; + var Remote = NodeGit.Remote; + + garbageCollect(); + var startSelfFreeingCount = Remote.getSelfFreeingInstanceCount(); + var startNonSelfFreeingCount = Remote.getNonSelfFreeingConstructedCount(); + + var resolve; + var promise = new Promise(function(_resolve) { resolve = _resolve; }); + + var remote; + + repo.getRemote("origin") + .then(function(_remote) { + remote = _remote; + setTimeout(resolve, 0); + }); + + return promise + .then(function() { + // make sure we have created one self-freeing remote + assert.equal(startSelfFreeingCount + 1, + Remote.getSelfFreeingInstanceCount()); + assert.equal(startNonSelfFreeingCount, + Remote.getNonSelfFreeingConstructedCount()); + var refspec = remote.getRefspec(0); + assert.equal("refs/heads/*", refspec.src()); + remote = null; + garbageCollect(); + // the refspec should be holding on to the remote + assert.equal(startSelfFreeingCount + 1, + Remote.getSelfFreeingInstanceCount()); + + assert.equal("refs/heads/*", refspec.src()); + + refspec = null; + garbageCollect(); + // the remote should be freed now + assert.equal(startSelfFreeingCount, + Remote.getSelfFreeingInstanceCount()); + }); + }); + + it("can retrieve the list of references advertised by a remote", function() { + var expectedRemoteHeads = { + HEAD: { + local: 0, + oid: "32789a79e71fbc9e04d3eff7425e1771eb595150", + loid: "0000000000000000000000000000000000000000", + name: "HEAD", + symrefTarget: "refs/heads/master" + }, + "refs/heads/checkout-test": { + local: 0, + oid: "1729c73906bb8467f4095c2f4044083016b4dfde", + loid: "0000000000000000000000000000000000000000", + name: "refs/heads/checkout-test", + symrefTarget: null + }, + "refs/heads/master": { + local: 0, + oid: "32789a79e71fbc9e04d3eff7425e1771eb595150", + loid: "0000000000000000000000000000000000000000", + name: "refs/heads/master", + symrefTarget: null + }, + "refs/heads/rev-walk": { + local: 0, + oid: "32789a79e71fbc9e04d3eff7425e1771eb595150", + loid: "0000000000000000000000000000000000000000", + name: "refs/heads/rev-walk", + symrefTarget: null + }, + "refs/tags/annotated-tag": { + local: 0, + oid: "dc800017566123ff3c746b37284a24a66546667e", + loid: "0000000000000000000000000000000000000000", + name: "refs/tags/annotated-tag", + symrefTarget: null + }, + "refs/tags/annotated-tag^{}": { + local: 0, + oid: "32789a79e71fbc9e04d3eff7425e1771eb595150", + loid: "0000000000000000000000000000000000000000", + name: "refs/tags/annotated-tag^{}", + symrefTarget: null + }, + "refs/tags/light-weight-tag": { + local: 0, + oid: "32789a79e71fbc9e04d3eff7425e1771eb595150", + loid: "0000000000000000000000000000000000000000", + name: "refs/tags/light-weight-tag", + symrefTarget: null + } + }; + + return this.repository.getRemote("origin") + .then(function(remote) { + return Promise.all([ + remote, + remote.connect(NodeGit.Enums.DIRECTION.FETCH) + ]); }) - // catches linux / osx failure to use anonymous credentials - // stops callback infinite loop - .catch(function (reason) { - if (reason.message !== - "credentials callback returned an invalid cred type") - { - throw reason; - } else { - return Promise.resolve(); - } + .then(function(results) { + var remote = results[0]; + return Promise.all([remote, remote.referenceList()]); + }) + .then(function(results) { + var remote = results[0]; + var remoteHeads = results[1]; + var remoteHeadsBySha = fp.flow([ + fp.map(function(remoteHead) { + return { + local: remoteHead.local(), + oid: remoteHead.oid().toString(), + loid: remoteHead.loid().toString(), + name: remoteHead.name(), + symrefTarget: remoteHead.symrefTarget() + }; + }), + fp.keyBy("name") + ])(remoteHeads); + + fp.flow([ + fp.keys, + fp.forEach(function(remoteHeadName) { + assert(fp.isEqual( + expectedRemoteHeads[remoteHeadName], + remoteHeadsBySha[remoteHeadName] + ), "Expectations for head " + remoteHeadName + " were not met."); + }) + ])(expectedRemoteHeads); + + return remote.disconnect(); + }); + }); + + it("will error when retrieving reference list if not connected", function() { + return this.repository.getRemote("origin") + .then(function(remote) { + return remote.referenceList(); + }) + .then(function() { + assert.fail("Unconnected remote should have no reference list."); + }) + .catch(function(notConnectedError) { + assert(notConnectedError.message === "this remote has never connected"); }); }); }); diff --git a/test/tests/repository.js b/test/tests/repository.js index 6c485713de..29f2075099 100644 --- a/test/tests/repository.js +++ b/test/tests/repository.js @@ -1,9 +1,9 @@ var assert = require("assert"); var path = require("path"); -var promisify = require("promisify-node"); -var Promise = require("nodegit-promise"); -var fse = promisify(require("fs-extra")); +var fse = require("fs-extra"); var local = path.join.bind(path, __dirname); +var IndexUtils = require("../utils/index_setup"); +var RepoUtils = require("../utils/repository_setup"); describe("Repository", function() { var NodeGit = require("../../"); @@ -11,6 +11,7 @@ describe("Repository", function() { var Index = NodeGit.Index; var Signature = NodeGit.Signature; + var constReposPath = local("../repos/constworkdir"); var reposPath = local("../repos/workdir"); var newRepoPath = local("../repos/newrepo"); var emptyRepoPath = local("../repos/empty"); @@ -18,7 +19,13 @@ describe("Repository", function() { beforeEach(function() { var test = this; - return Repository.open(reposPath) + return Repository.open(constReposPath) + .then(function(constRepository) { + test.constRepository = constRepository; + }) + .then(function() { + return Repository.open(reposPath); + }) .then(function(repository) { test.repository = repository; }) @@ -30,6 +37,14 @@ describe("Repository", function() { }); }); + it("cannot instantiate a repository", function() { + assert.throws( + function() { new Repository(); }, + undefined, + "hello" + ); + }); + it("can open a valid repository", function() { assert.ok(this.repository instanceof Repository); }); @@ -66,6 +81,19 @@ describe("Repository", function() { }); }); + it("can be cleaned", function() { + this.repository.cleanup(); + + // try getting a commit after cleanup (to test that the repo is usable) + return this.repository.getHeadCommit() + .then(function(commit) { + assert.equal( + commit.toString(), + "32789a79e71fbc9e04d3eff7425e1771eb595150" + ); + }); + }); + it("can read the index", function() { return this.repository.index() .then(function(index) { @@ -74,7 +102,7 @@ describe("Repository", function() { }); it("can list remotes", function() { - return this.repository.getRemotes() + return this.repository.getRemoteNames() .then(function(remotes) { assert.equal(remotes.length, 1); assert.equal(remotes[0], "origin"); @@ -88,10 +116,21 @@ describe("Repository", function() { }); }); - it("can get the default signature", function() { - var sig = this.repository.defaultSignature(); + it("can get a reference commit", function() { + return this.repository.getReferenceCommit("master") + .then(function(commit) { + assert.equal( + "32789a79e71fbc9e04d3eff7425e1771eb595150", + commit.toString() + ); + }); + }); - assert(sig instanceof Signature); + it("can get the default signature", function() { + this.repository.defaultSignature() + .then((sig) => { + assert(sig instanceof Signature); + }); }); it("gets statuses with StatusFile", function() { @@ -152,11 +191,9 @@ describe("Repository", function() { return repo.fetch("origin", { credentials: function(url, userName) { - return NodeGit.Cred.sshKeyFromAgent(userName); + return NodeGit.Credential.sshKeyFromAgent(userName); }, - certificateCheck: function() { - return 1; - } + certificateCheck: () => 0 }) .then(function() { return repo.fetchheadForeach(function(refname, remoteUrl, oid, isMerge) { @@ -178,13 +215,23 @@ describe("Repository", function() { }); }); - it("can discover if a path is part of a repository", function() { + function discover(ceiling) { var testPath = path.join(reposPath, "lib", "util", "normalize_oid.js"); var expectedPath = path.join(reposPath, ".git"); - return NodeGit.Repository.discover(testPath, 0, "") + return NodeGit.Repository.discover(testPath, 0, ceiling) .then(function(foundPath) { assert.equal(expectedPath, foundPath); }); + } + + it("can discover if a path is part of a repository, null ceiling", + function() { + return discover(null); + }); + + it("can discover if a path is part of a repository, empty ceiling", + function() { + return discover(""); }); it("can create a repo using initExt", function() { @@ -232,4 +279,116 @@ describe("Repository", function() { assert(!commit); }); }); + + it("can commit on head on a empty repo with createCommitOnHead", function() { + const fileName = "my-new-file-that-shouldnt-exist.file"; + const fileContent = "new file from repository test"; + const repo = this.emptyRepo; + const filePath = path.join(repo.workdir(), fileName); + const commitMsg = "Doug this has been commited"; + let authSig; + let commitSig; + + return repo.defaultSignature() + .then((sig) => { + authSig = sig; + commitSig = sig; + return fse.writeFile(filePath, fileContent); + }) + .then(() => { + return repo.createCommitOnHead( + [fileName], + authSig, + commitSig, + commitMsg + ); + }) + .then((oidResult) => { + return repo.getHeadCommit() + .then(function(commit) { + assert.equal( + commit.toString(), + oidResult.toString() + ); + }); + }); + }); + + it("can get all merge heads in a repo with mergeheadForeach", function() { + var repo; + var repoPath = local("../repos/merge-head"); + var ourBranchName = "ours"; + var theirBranchName = "theirs"; + var theirBranch; + var fileName = "testFile.txt"; + var numMergeHeads = 0; + var assertBranchTargetIs = function (theirBranch, mergeHead) { + assert.equal(theirBranch.target(), mergeHead.toString()); + numMergeHeads++; + }; + + return RepoUtils.createRepository(repoPath) + .then(function(_repo) { + repo = _repo; + return IndexUtils.createConflict( + repo, + ourBranchName, + theirBranchName, + fileName + ); + }) + .then(function() { + return repo.getBranch(theirBranchName); + }) + .then(function(_theirBranch) { + // Write the MERGE_HEAD file manually since createConflict does not + theirBranch = _theirBranch; + return fse.writeFile( + path.join(repoPath, ".git", "MERGE_HEAD"), + theirBranch.target().toString() + "\n" + ); + }) + .then(function() { + return repo.mergeheadForeach( + assertBranchTargetIs.bind(this, theirBranch) + ); + }) + .then(function() { + assert.equal(numMergeHeads, 1); + }); + }); + + it("can obtain statistics from a valid constant repository", function() { + return this.constRepository.statistics() + .then(function(analysisReport) { + + assert.equal(analysisReport.repositorySize.commits.count, 992); + assert.equal(analysisReport.repositorySize.commits.size, 265544); + assert.equal(analysisReport.repositorySize.trees.count, 2416); + assert.equal(analysisReport.repositorySize.trees.size, 1188325); + assert.equal(analysisReport.repositorySize.trees.entries, 32571); + assert.equal(analysisReport.repositorySize.blobs.count, 4149); + assert.equal(analysisReport.repositorySize.blobs.size, 48489622); + assert.equal(analysisReport.repositorySize.annotatedTags.count, 1); + assert.equal(analysisReport.repositorySize.references.count, 8); + + assert.equal(analysisReport.biggestObjects.commits.maxSize, 956); + assert.equal(analysisReport.biggestObjects.commits.maxParents, 2); + assert.equal(analysisReport.biggestObjects.trees.maxEntries, 93); + assert.equal(analysisReport.biggestObjects.blobs.maxSize, 1077756); + + assert.equal(analysisReport.historyStructure.maxDepth, 931); + assert.equal(analysisReport.historyStructure.maxTagDepth, 1); + + assert.equal(analysisReport.biggestCheckouts.numDirectories, 128); + assert.equal(analysisReport.biggestCheckouts.maxPathDepth, 10); + assert.equal(analysisReport.biggestCheckouts.maxPathLength, 107); + assert.equal(analysisReport.biggestCheckouts.numFiles, 514); + assert.equal(analysisReport.biggestCheckouts.totalFileSize, 5160886); + assert.equal(analysisReport.biggestCheckouts.numSymlinks, 2); + assert.equal(analysisReport.biggestCheckouts.numSubmodules, 4); + + // console.log(JSON.stringify(analysisReport,null,2)); + }); + }); }); diff --git a/test/tests/reset.js b/test/tests/reset.js index 3638c5761e..214bf08fd1 100644 --- a/test/tests/reset.js +++ b/test/tests/reset.js @@ -1,13 +1,13 @@ var assert = require("assert"); var path = require("path"); var local = path.join.bind(path, __dirname); -var promisify = require("promisify-node"); -var fse = promisify(require("fs-extra")); +var fse = require("fs-extra"); describe("Reset", function() { var NodeGit = require("../../"); var Repository = NodeGit.Repository; var Reset = NodeGit.Reset; + var AnnotatedCommit = NodeGit.AnnotatedCommit; var reposPath = local("../repos/workdir"); var currentCommitOid = "32789a79e71fbc9e04d3eff7425e1771eb595150"; @@ -54,7 +54,7 @@ describe("Reset", function() { return Reset.default(test.repo, test.previousCommit, filePath) .then(function() { - return test.repo.openIndex(); + return test.repo.refreshIndex(); }) .then(function(index) { return index.writeTree(); @@ -80,7 +80,7 @@ describe("Reset", function() { return Reset.default(test.repo, test.currentCommit, filePath); }) .then(function() { - return test.repo.openIndex(); + return test.repo.refreshIndex(); }) .then(function(index) { return index.writeTree(); @@ -104,25 +104,57 @@ describe("Reset", function() { }); }); - it("can perform a soft reset", function() { - var test = this; - - return Reset.reset(test.repo, test.previousCommit, Reset.TYPE.SOFT) + function resetFrom(repo, commit, resetType, annotated) { + var promise = null; + if (annotated) { + promise = AnnotatedCommit.lookup(repo, commit.id()) + .then(function(annotatedCommit) { + return Reset.fromAnnotated(repo, annotatedCommit, resetType); + }); + } else { + promise = Reset.reset(repo, commit, resetType); + } + return promise .then(function() { - return test.repo.openIndex(); + return repo.refreshIndex(); }) .then(function(index) { return index.writeTree(); }) .then(function(oid) { - return test.repo.getTree(oid); + return repo.getTree(oid); }) .then(function(tree) { return tree.getEntry(filePath); }) .then(function(entry) { return entry.getBlob(); - }) + }); + } + + it("can perform a soft reset", function() { + var test = this; + + return resetFrom(test.repo, test.previousCommit, Reset.TYPE.SOFT, false) + .then(function(blob) { + var currentCommitContents = test.currentCommitBlob.toString(); + var previousCommitContents = test.previousCommitBlob.toString(); + var resetContents = blob.toString(); + + // With a soft reset all of the changes should be in the index + // still so the index should still == what we had at the current + // commit and not the one nwe reset to + assert(resetContents == currentCommitContents); + assert(resetContents != previousCommitContents); + + return Reset(test.repo, test.currentCommit, Reset.TYPE.HARD); + }); + }); + + it("can perform an annotated soft reset", function() { + var test = this; + + return resetFrom(test.repo, test.previousCommit, Reset.TYPE.SOFT, true) .then(function(blob) { var currentCommitContents = test.currentCommitBlob.toString(); var previousCommitContents = test.previousCommitBlob.toString(); @@ -130,7 +162,7 @@ describe("Reset", function() { // With a soft reset all of the changes should be in the index // still so the index should still == what we had at the current - // commit and not the one we reset to + // commit and not the one nwe reset to assert(resetContents == currentCommitContents); assert(resetContents != previousCommitContents); @@ -141,22 +173,32 @@ describe("Reset", function() { it("can perform a mixed reset", function() { var test = this; - return Reset.reset(test.repo, test.previousCommit, Reset.TYPE.MIXED) - .then(function() { - return test.repo.openIndex(); - }) - .then(function(index) { - return index.writeTree(); - }) - .then(function(oid) { - return test.repo.getTree(oid); - }) - .then(function(tree) { - return tree.getEntry(filePath); - }) - .then(function(entry) { - return entry.getBlob(); + return resetFrom(test.repo, test.previousCommit, Reset.TYPE.MIXED, false) + .then(function(blob) { + var currentCommitContents = test.currentCommitBlob.toString(); + var previousCommitContents = test.previousCommitBlob.toString(); + var resetContents = blob.toString(); + + // With a mixed reset all of the changes should removed from the index + // but still in the working directory. (i.e. unstaged) + assert(resetContents != currentCommitContents); + assert(resetContents == previousCommitContents); + + return fse.readFile(path.join(test.repo.workdir(), filePath)); }) + .then(function(fileContents) { + var currentCommitContents = test.currentCommitBlob.toString(); + + assert(fileContents == currentCommitContents); + + return Reset.reset(test.repo, test.currentCommit, Reset.TYPE.HARD); + }); + }); + + it("can perform an annotated mixed reset", function() { + var test = this; + + return resetFrom(test.repo, test.previousCommit, Reset.TYPE.MIXED, true) .then(function(blob) { var currentCommitContents = test.currentCommitBlob.toString(); var previousCommitContents = test.previousCommitBlob.toString(); @@ -181,22 +223,32 @@ describe("Reset", function() { it("can perform a hard reset", function() { var test = this; - return Reset.reset(test.repo, test.previousCommit, Reset.TYPE.HARD) - .then(function() { - return test.repo.openIndex(); - }) - .then(function(index) { - return index.writeTree(); - }) - .then(function(oid) { - return test.repo.getTree(oid); - }) - .then(function(tree) { - return tree.getEntry(filePath); - }) - .then(function(entry) { - return entry.getBlob(); + return resetFrom(test.repo, test.previousCommit, Reset.TYPE.HARD, false) + .then(function(blob) { + var currentCommitContents = test.currentCommitBlob.toString(); + var previousCommitContents = test.previousCommitBlob.toString(); + var resetContents = blob.toString(); + + // With a hard reset all of the changes should removed from the index + // and also removed from the working directory + assert(resetContents != currentCommitContents); + assert(resetContents == previousCommitContents); + + return fse.readFile(path.join(test.repo.workdir(), filePath)); }) + .then(function(fileContents) { + var previousCommitContents = test.previousCommitBlob.toString(); + + assert(fileContents == previousCommitContents); + + return Reset.reset(test.repo, test.currentCommit, Reset.TYPE.HARD); + }); + }); + + it("can perform an annotated hard reset", function() { + var test = this; + + return resetFrom(test.repo, test.previousCommit, Reset.TYPE.HARD, true) .then(function(blob) { var currentCommitContents = test.currentCommitBlob.toString(); var previousCommitContents = test.previousCommitBlob.toString(); @@ -217,4 +269,43 @@ describe("Reset", function() { return Reset.reset(test.repo, test.currentCommit, Reset.TYPE.HARD); }); }); + + it("reset fails if parameter is not a Commit object", function() { + var test = this; + var commit = test.repo.getReferenceCommit("master"); + try { + Reset.reset(test.repo, commit, Reset.TYPE.HARD); + assert.fail( + "Should not be able to pass a Promise (Commit) into the function" + ); + } catch (err) { + // ok + assert.equal( + "Repository and target commit's repository does not match", + err.message + ); + } + }); + + it("reset fails if originating repository is not the same", function() { + var test = this; + var testCommit = null; + return test.repo.getReferenceCommit("master") + .then(function(commit) { + testCommit = commit; + return Repository.open(reposPath); + }) + .then(function(repo) { + return Reset.reset(repo, testCommit, Reset.TYPE.HARD); + }) + .then(function() { + assert.fail("Different source repository instance should fail"); + }) + .catch(function(err) { + assert.equal( + "Repository and target commit's repository does not match", + err.message + ); + }); + }); }); diff --git a/test/tests/revert.js b/test/tests/revert.js new file mode 100644 index 0000000000..accb529cae --- /dev/null +++ b/test/tests/revert.js @@ -0,0 +1,84 @@ +var _ = require("lodash"); +var assert = require("assert"); +var RepoUtils = require("../utils/repository_setup"); +var path = require("path"); +var fs = require("fs"); +var local = path.join.bind(path, __dirname); + +describe("Revert", function() { + var NodeGit = require("../../"); + + var Revert = NodeGit.Revert; + var RevertOptions = NodeGit.RevertOptions; + var Status = NodeGit.Status; + + var test; + var fileName = "foobar.js"; + var repoPath = local("../repos/revertRepo"); + + beforeEach(function() { + test = this; + + return RepoUtils.createRepository(repoPath) + .then(function(repository) { + test.repository = repository; + + return RepoUtils.commitFileToRepo( + repository, + fileName, + "line1\nline2\nline3" + ); + }) + .then(function(firstCommit) { + test.firstCommit = firstCommit; + }); + }); + + it("revert modifies the working directoy", function() { + var fileStats = fs.statSync(path.join(repoPath, fileName)); + assert.ok(fileStats.isFile()); + + return Revert.revert(test.repository, test.firstCommit, new RevertOptions()) + .then(function() { + try { + fs.statSync(path.join(repoPath, fileName)); + } catch (e) { + // we expect this not to exist + return; + } + + assert.fail("Working directory was not reverted"); + }); + }); + + it("revert modifies the index", function() { + return Revert.revert(test.repository, test.firstCommit, new RevertOptions()) + .then(() => test.repository.getStatus()) + .then((status) => { + assert.equal(1, status.length); + assert.ok(_.endsWith(fileName, status[0].path())); + assert.equal(Status.STATUS.INDEX_DELETED, status[0].statusBit()); + }); + }); + + it("RevertOptions is optional (unspecified)", function() { + return Revert.revert(test.repository, test.firstCommit) + .catch(function(error) { + throw error; + }); + }); + + it("RevertOptions is optional (null)", function() { + return Revert.revert(test.repository, test.firstCommit, null) + .catch(function(error) { + throw error; + }); + }); + + it("RevertOptions without MergeOptions should not segfault", function() { + return Revert.revert(test.repository, test.firstCommit, {}) + .catch(function(error) { + throw error; + }); + }); +}); diff --git a/test/tests/revparse.js b/test/tests/revparse.js index a097b9a3ec..84ed44ca8c 100644 --- a/test/tests/revparse.js +++ b/test/tests/revparse.js @@ -37,7 +37,7 @@ describe("Revparse", function() { }) .catch(function(error) { assert.ok(error instanceof Error); - assert.equal(error.message, "Revspec 'INVALID' not found."); + assert.equal(error.message, "revspec 'INVALID' not found"); }); }); diff --git a/test/tests/revwalk.js b/test/tests/revwalk.js index d871a2193c..bb1cd06ee5 100644 --- a/test/tests/revwalk.js +++ b/test/tests/revwalk.js @@ -1,7 +1,11 @@ var assert = require("assert"); +var RepoUtils = require("../utils/repository_setup"); +var fse = require("fs-extra"); var path = require("path"); var local = path.join.bind(path, __dirname); +var leakTest = require("../utils/leak_test"); + describe("Revwalk", function() { var NodeGit = require("../../"); var Repository = NodeGit.Repository; @@ -27,6 +31,7 @@ describe("Revwalk", function() { beforeEach(function() { this.walker = this.repository.createRevWalk(); + this.walker.sorting(NodeGit.Revwalk.SORT.TIME); this.walker.push(this.commit.id()); }); @@ -82,7 +87,7 @@ describe("Revwalk", function() { it("can get a specified number of commits", function() { var test = this; var storedCommits; - return test.walker.getCommits() + return test.walker.getCommits(10) .then(function(commits) { assert.equal(commits.length, 10); storedCommits = commits; @@ -99,6 +104,33 @@ describe("Revwalk", function() { }); }); + it("can get the largest number of commits within a specified range", + function() { + var test = this; + var storedCommits; + return test.walker.getCommits(991) + .then(function(commits) { + assert.equal(commits.length, 990); + storedCommits = commits; + test.walker = test.repository.createRevWalk(); + test.walker.push(test.commit.id()); + }); + }); + + it("will return all commits from the revwalk if nothing matches", function() { + var test = this; + var magicSha = "notintherepoatallwhatsoeverisntthatcool"; + + function checkCommit(commit) { + return commit.toString() != magicSha; + } + + return test.walker.getCommitsUntil(checkCommit) + .then(function(commits) { + assert.equal(commits.length, 990); + }); + }); + it("can get commits until you tell it not to", function() { var test = this; var magicSha = "b8a94aefb22d0534cc0e5acf533989c13d8725dc"; @@ -114,6 +146,211 @@ describe("Revwalk", function() { }); }); + it("can do a fast walk", function() { + var test = this; + var magicSha = "b8a94aefb22d0534cc0e5acf533989c13d8725dc"; + + return test.walker.fastWalk(10) + .then(function(commitOids) { + assert.equal(commitOids.length, 10); + assert.equal(commitOids[3].toString(), magicSha); + }); + }); + + it("can get the history of a file", function() { + var test = this; + var magicShas = [ + "6ed3027eda383d417457b99b38c73f88f601c368", + "95cefff6aabd3c1f6138ec289f42fec0921ff610", + "7ad92a7e4d26a1af93f3450aea8b9d9b8069ea8c", + "96f077977eb1ffcb63f9ce766cdf110e9392fdf5", + "694adc5369687c47e02642941906cfc5cb21e6c2", + "eebd0ead15d62eaf0ba276da53af43bbc3ce43ab", + "1273fff13b3c28cfdb13ba7f575d696d2a8902e1" + ]; + + return test.walker.fileHistoryWalk("include/functions/copy.h", 1000) + .then(function(results) { + var shas = results.map(function(result) { + return result.commit.sha(); + }); + assert.equal(magicShas.length, shas.length); + magicShas.forEach(function(sha, i) { + assert.equal(sha, shas[i]); + }); + }); + }); + + it("can get the history of a dir", function() { + var test = this; + var magicShas = [ + "6ed3027eda383d417457b99b38c73f88f601c368", + "95cefff6aabd3c1f6138ec289f42fec0921ff610", + "7ad92a7e4d26a1af93f3450aea8b9d9b8069ea8c", + "96f077977eb1ffcb63f9ce766cdf110e9392fdf5", + "694adc5369687c47e02642941906cfc5cb21e6c2", + "eebd0ead15d62eaf0ba276da53af43bbc3ce43ab", + "1273fff13b3c28cfdb13ba7f575d696d2a8902e1", + "271c65ed16ab147cee715e1076e1d716156cc5a3", + "94d532004323641fd169f375869c36a82b32fac7", + "1c71929a905da9faab64472d53815d46ff4391dd", + "3947245612ae27077517038704b7a679e742658e", + "a44c81558d0f72ccf6c1facbe2ba0b9b711586a9", + "01d469416b26340ee4922d5171ef8dbe46c879f4" + ]; + + return test.walker.fileHistoryWalk("include/functions", 1000) + .then(function(results) { + var shas = results.map(function(result) { + return result.commit.sha(); + }); + assert.equal(magicShas.length, shas.length); + magicShas.forEach(function(sha, i) { + assert.equal(sha, shas[i]); + }); + }); + }); + + it("can get the history of a file while ignoring parallel branches", + function() { + var test = this; + var magicShas = [ + "f80e085e3118bbd6aad49dad7c53bdc37088bf9b", + "907b29d8a3b765570435c922a59cd849836a7b51" + ]; + var shas; + var walker = test.repository.createRevWalk(); + walker.sorting(NodeGit.Revwalk.SORT.TIME); + walker.push("115d114e2c4d5028c7a78428f16a4528c51be7dd"); + + return walker.fileHistoryWalk("README.md", 15) + .then(function(results) { + shas = results.map(function(result) { + return result.commit.sha(); + }); + assert.equal(magicShas.length, shas.length); + magicShas.forEach(function(sha, i) { + assert.equal(sha, shas[i]); + }); + + magicShas = [ + "be6905d459f1b236e44b2445df25aff1783993e9", + "4a34168b80fe706f52417106821c9cbfec630e47", + "f80e085e3118bbd6aad49dad7c53bdc37088bf9b", + "694b2d703a02501f288269bea7d1a5d643a83cc8", + "907b29d8a3b765570435c922a59cd849836a7b51" + ]; + + walker = test.repository.createRevWalk(); + walker.sorting(NodeGit.Revwalk.SORT.TIME); + walker.push("d46f7da82969ca6620864d79a55b951be0540bda"); + + return walker.fileHistoryWalk("README.md", 50); + }) + .then(function(results) { + shas = results.map(function(result) { + return result.commit.sha(); + }); + assert.equal(magicShas.length, shas.length); + magicShas.forEach(function(sha, i) { + assert.equal(sha, shas[i]); + }); + }); + }); + + it("can yield information about renames in a file history walk", + function() { + var treeOid; + var repo; + var fileNameA = "a.txt"; + var fileNameB = "b.txt"; + var repoPath = local("../repos/renamedFileRepo"); + var signature = NodeGit.Signature.create("Foo bar", + "foo@bar.com", 123456789, 60); + var headCommit; + + return RepoUtils.createRepository(repoPath) + .then(function(r) { + repo = r; + return RepoUtils.commitFileToRepo( + repo, + fileNameA, + "line1\nline2\nline3\n" + ); + }) + .then(function() { + return fse.move( + path.join(repoPath, fileNameA), + path.join(repoPath, fileNameB) + ); + }) + .then(function() { + return repo.refreshIndex(); + }) + .then(function(index) { + return index.addByPath(fileNameB) + .then(function() { + return index.removeByPath(fileNameA); + }) + .then(function() { + return index.write(); + }) + .then(function() { + return index.writeTree(); + }); + }) + .then(function(oidResult) { + treeOid = oidResult; + return NodeGit.Reference.nameToId(repo, "HEAD"); + }) + .then(function(head) { + return repo.getCommit(head); + }) + .then(function(head) { + return repo.createCommit("HEAD", signature, signature, + "renamed commit", treeOid, [head]); + }) + .then(function() { + return NodeGit.Reference.nameToId(repo, "HEAD"); + }) + .then(function(commitOid) { + headCommit = commitOid.tostrS(); + var walker = repo.createRevWalk(); + walker.sorting(NodeGit.Revwalk.SORT.TIME); + walker.push(commitOid.tostrS()); + return walker.fileHistoryWalk(fileNameB, 5); + }) + .then(function(results) { + assert.equal(results[0].status, NodeGit.Diff.DELTA.RENAMED); + assert.equal(results[0].newName, fileNameB); + assert.equal(results[0].oldName, fileNameA); + }) + .then(function() { + var walker = repo.createRevWalk(); + walker.sorting(NodeGit.Revwalk.SORT.TIME); + walker.push(headCommit); + return walker.fileHistoryWalk(fileNameA, 5); + }) + .then(function(results) { + assert.equal(results[0].status, NodeGit.Diff.DELTA.RENAMED); + assert.equal(results[0].newName, fileNameB); + assert.equal(results[0].oldName, fileNameA); + }) + .then(function() { + return fse.remove(repoPath); + }); + }); + + it("does not leak", function() { + var test = this; + + return leakTest(NodeGit.Revwalk, function() { + const walker = test.repository.createRevWalk(); + walker.push("115d114e2c4d5028c7a78428f16a4528c51be7dd"); + return walker.next(); + }); + }); + // This test requires forcing garbage collection, so mocha needs to be run // via node rather than npm, with a la `node --expose-gc [pathtohmoca] // [testglob]` @@ -124,8 +361,8 @@ describe("Revwalk", function() { var walker = repository.createRevWalk(); repository.getMasterCommit().then(function(firstCommitOnMaster) { - walker.walk(firstCommitOnMaster, function(err, commit) { - if (!err && !commit) { + walker.walk(firstCommitOnMaster.id(), function(err, commit) { + if (err && err.errno === NodeGit.Error.CODE.ITEROVER) { return done(); } @@ -152,7 +389,13 @@ describe("Revwalk", function() { promise = promise.then(getNext); } } - return promise; + return promise.catch(function(error) { + if (error && error.errno === NodeGit.Error.CODE.ITEROVER) { + return Promise.resolve(); + } else { + throw error; + } + }); function getNext() { return walker.next(); diff --git a/test/tests/signature.js b/test/tests/signature.js index 6a369969fa..e0387c3d3b 100644 --- a/test/tests/signature.js +++ b/test/tests/signature.js @@ -1,13 +1,9 @@ var assert = require("assert"); var path = require("path"); var local = path.join.bind(path, __dirname); -var promisify = require("promisify-node"); -var Promise = require("nodegit-promise"); -// Have to wrap exec, since it has a weird callback signature. -var exec = promisify(function(command, opts, callback) { - return require("child_process").exec(command, opts, callback); -}); +var garbageCollect = require("../utils/garbage_collect.js"); +var exec = require("../../utils/execPromise"); describe("Signature", function() { var NodeGit = require("../../"); @@ -45,47 +41,94 @@ describe("Signature", function() { assert.equal(when.offset(), -now.getTimezoneOffset()); }); - it("can get a default signature when no user name is set", function(done) { + it("can get a default signature when no user name is set", function() { var savedUserName; var savedUserEmail; - var cleanUp = function() { + var cleanUp = () => { return exec("git config --global user.name \"" + savedUserName + "\"") - .then(function() { + .then(() => { exec("git config --global user.email \"" + savedUserEmail + "\""); }); }; return exec("git config --global user.name") - .then(function(userName) { + .then((userName) => { savedUserName = userName.trim(); return exec("git config --global user.email"); }) - .then(function(userEmail) { + .then((userEmail) => { savedUserEmail = userEmail.trim(); return exec("git config --global --unset user.name"); }) - .then(function() { + .then(() => { return exec("git config --global --unset user.email"); }) - .then(function() { + .then(() => { return Repository.open(reposPath); }) - .then(function(repo) { - var sig = repo.defaultSignature(); + .then((repo) => { + return repo.defaultSignature(); + }) + .then((sig) => { assert.equal(sig.name(), "unknown"); - assert.equal(sig.email(), "unknown@unknown.com"); + assert.equal(sig.email(), "unknown@example.com"); }) .then(cleanUp) - .then(done) - .catch(function(e) { - cleanUp() + .catch((e) => { + return cleanUp() .then(function() { - done(e); return Promise.reject(e); }); }); }); + + it("duplicates time", function() { + garbageCollect(); + var Time = NodeGit.Time; + var startSelfFreeingCount = Time.getSelfFreeingInstanceCount(); + var startNonSelfFreeingCount = + Time.getNonSelfFreeingConstructedCount(); + var time = Signature.now(name, email).when(); + + garbageCollect(); + var endSelfFreeingCount = Time.getSelfFreeingInstanceCount(); + var endNonSelfFreeingCount = Time.getNonSelfFreeingConstructedCount(); + // we should get one duplicated, self-freeing time + assert.equal(startSelfFreeingCount + 1, endSelfFreeingCount); + assert.equal(startNonSelfFreeingCount, endNonSelfFreeingCount); + + time = null; + garbageCollect(); + endSelfFreeingCount = Time.getSelfFreeingInstanceCount(); + // the self-freeing time should get freed + assert.equal(startSelfFreeingCount, endSelfFreeingCount); + }); + + it("toString does not provide a timestamp by default", function () { + const signature = Signature.create( + "Shaggy Rogers", + "shaggy@mystery.com", + 987654321, + 90 + ); + + assert.equal(signature.toString(), "Shaggy Rogers "); + }); + + it("toString provides the correct timestamp when requested", function() { + const signature = Signature.create( + "Shaggy Rogers", + "shaggy@mystery.com", + 987654321, + 90 + ); + + assert.equal( + signature.toString(true), + "Shaggy Rogers 987654321 +0130" + ); + }); }); diff --git a/test/tests/stage.js b/test/tests/stage.js index 23bc4074e4..34de76630f 100644 --- a/test/tests/stage.js +++ b/test/tests/stage.js @@ -1,8 +1,8 @@ var assert = require("assert"); var path = require("path"); -var Promise = require("nodegit-promise"); -var promisify = require("promisify-node"); -var fse = promisify(require("fs-extra")); +var fse = require("fs-extra"); + +var exec = require("../../utils/execPromise"); describe("Stage", function() { var RepoUtils = require("../utils/repository_setup"); @@ -17,10 +17,6 @@ describe("Stage", function() { return RepoUtils.createRepository(repoPath) .then(function(repo) { test.repository = repo; - return repo.openIndex(); - }) - .then(function(index) { - test.index = index; }); }); @@ -28,7 +24,7 @@ describe("Stage", function() { return fse.remove(test.repository.workdir()); }); -function stagingTest(staging, newFileContent) { + function stagingTest(isUnstaged, newFileContent, discarding) { var fileContent = newFileContent || "One line of text\n" + "Two lines of text\n"+ @@ -51,42 +47,62 @@ function stagingTest(staging, newFileContent) { "Nineteen lines of text\n"+ "Twenty lines of text\n"; var fileName = "stagedLinesTest.txt"; - var index; - var stagedFile; + var expectedContent; var workingDirFile; var getDiffFunction; - if (staging) { - stagedFile = fileContent.replace("Fifteen", "Changed fifteen"); - workingDirFile = stagedFile.replace("Three", "Changed three") + + if (!isUnstaged || discarding) { + expectedContent = fileContent.replace("Three", "Changed three") + .replace("Seventeen", "Changed seventeen"); + workingDirFile = expectedContent.replace("Fifteen", "Changed fifteen"); + } + else { + expectedContent = fileContent.replace("Fifteen", "Changed fifteen"); + workingDirFile = expectedContent.replace("Three", "Changed three") .replace("Seventeen", "Changed seventeen"); + } + + if (isUnstaged) { getDiffFunction = function() { - return NodeGit.Diff.indexToWorkdir(test.repository, index, { - flags: - NodeGit.Diff.OPTION.SHOW_UNTRACKED_CONTENT | - NodeGit.Diff.OPTION.RECURSE_UNTRACKED_DIRS + return test.repository.refreshIndex() + .then(function(index) { + return NodeGit.Diff.indexToWorkdir( + test.repository, + index, + { + flags: + NodeGit.Diff.OPTION.SHOW_UNTRACKED_CONTENT | + NodeGit.Diff.OPTION.RECURSE_UNTRACKED_DIRS + } + ); }); }; } else { - stagedFile = fileContent.replace("Three", "Changed three") - .replace("Seventeen", "Changed seventeen"); - workingDirFile = stagedFile.replace("Fifteen", "Changed fifteen"); - getDiffFunction = function() { return RepoUtils.addFileToIndex(test.repository, fileName) .then(function() { return test.repository.getBranchCommit("master"); }) .then(function(masterCommit) { - return masterCommit.getTree(); + var treePromise = masterCommit.getTree(); + var indexPromise = test.repository.refreshIndex(); + + return Promise.all([treePromise, indexPromise]); }) - .then(function(masterTree) { + .then(function(treeAndIndex) { + var masterTree = treeAndIndex[0]; + var index = treeAndIndex[1]; return NodeGit.Diff.treeToIndex( - test.repository, masterTree, index, { - flags: - NodeGit.Diff.OPTION.SHOW_UNTRACKED_CONTENT | - NodeGit.Diff.OPTION.RECURSE_UNTRACKED_DIRS - }); + test.repository, + masterTree, + index, + { + flags: + NodeGit.Diff.OPTION.SHOW_UNTRACKED_CONTENT | + NodeGit.Diff.OPTION.RECURSE_UNTRACKED_DIRS + } + ); }); }; } @@ -97,10 +113,6 @@ function stagingTest(staging, newFileContent) { workingDirFile); }) .then(function() { - return test.repository.openIndex(); - }) - .then(function(repoIndex) { - index = repoIndex; return getDiffFunction(); }) .then(function(fileDiff) { @@ -130,15 +142,28 @@ function stagingTest(staging, newFileContent) { } }); }); - return test.repository.stageLines(fileName, linesToStage, !staging); + + if (discarding) { + return test.repository.discardLines(fileName, linesToStage); + } + + return test.repository.stageLines(fileName, linesToStage, !isUnstaged); }) - .then(function(stageResult) { - assert.equal(stageResult, 0); - var pathOid = index.getByPath(fileName).id; - return test.repository.getBlob(pathOid); + .then(function() { + if (discarding) { + return fse.readFile( + path.join(test.repository.workdir(), fileName), "utf8" + ); + } + + return test.repository.refreshIndex() + .then(function(reloadedIndex) { + var pathOid = reloadedIndex.getByPath(fileName).id; + return test.repository.getBlob(pathOid); + }); }) .then(function(resultFileContents) { - assert.equal(resultFileContents.toString(), stagedFile); + assert.equal(resultFileContents.toString(), expectedContent); }); } @@ -182,4 +207,317 @@ function stagingTest(staging, newFileContent) { "\nSixteen lines of text\nSeventeen lines of text\nEighteen lines of text"; return stagingTest(false, newlineEofTestFileContent2); }); + + //This is used to test case where the last hunk is staged. + var lastHunkStagedFileContent = + "Thirteen lines of text\n"+ + "Fourteen lines of text\n"+ + "Fifteen lines of text\n"+ + "Sixteen lines of text\n"+ + "Shforteenteen lines of text\n"; + + it("staging last hunk stages whole file if no filemode changes", function() { + return stagingTest(true, lastHunkStagedFileContent) + .then(function() { + return test.repository.refreshIndex(); + }) + .then(function(index) { + return NodeGit.Diff.indexToWorkdir(test.repository, index, { + flags: + NodeGit.Diff.OPTION.SHOW_UNTRACKED_CONTENT | + NodeGit.Diff.OPTION.RECURSE_UNTRACKED_DIRS + }); + }) + .then(function(diff) { + assert.equal(Object.keys(diff).length, 0); //Empty diff + return diff.patches(); + }) + .then(function(patches) { + //patches will have at least one item if there is something unstaged + assert.equal(patches.length, 0); + }); + }); + + function compareFilemodes(vsWorkdir, index, fileModeDifference) { + //Takes diff of head commit vs Workdir (if vsWorkdir is set) or vs Index + //(if vsWorkdir is unset). Note: there's only one file in the filemode + //staging tests for which this helper fn was written. + //index - index to use (vsWorkdir is unset) + //fileModeDifference - expected (newfilemode) - (oldfilemode) + return test.repository.getHeadCommit() + .then(function(commit) { + return commit.getTree(); + }) + .then(function(tree) { + if (vsWorkdir) { + return NodeGit.Diff.treeToWorkdir(test.repository, tree); + } else { + return NodeGit.Diff.treeToIndex(test.repository, tree, index); + } + }) + .then(function(diff) { + return diff.getDelta(0); + }) + .then(function(delta) { + if (fileModeDifference === 0) { + if (!delta) { + return true; + } else { + throw ("File change when no file change expected."); + } + } else { + assert(delta.newFile().mode() - delta.oldFile().mode() === + fileModeDifference); + } + return true; + }); + } + + function createAndCommitFiles(repo, filePaths, fileContent, afterWriteFn) { + filePaths = filePaths instanceof Array ? filePaths : [filePaths]; + var filePromises = filePaths.map(function(fileName) { + return RepoUtils.commitFileToRepo(repo, fileName, fileContent) + .then(function() { + //First, create a file, have the same file in both the repo and workdir. + return fse.writeFile(path.join(repo.workdir(), fileName), fileContent); + }) + .then(function() { + return afterWriteFn(repo, fileName); + }); + }); + + return Promise.all(filePromises); + } + + if (process.platform == "linux" || process.platform == "darwin") { + it("can stage filemode changes for one file", function() { + var fileContent = "Blek"; + var fileName = "stageFilemodeTest.txt"; + var index; + + function afterWriteFn(repo, fileName) { + return fse.chmod(path.join(repo.workdir(), fileName), + 0755 /* new filemode */); + } + + return createAndCommitFiles( + test.repository, fileName, fileContent, afterWriteFn + ) + //Then, diff between head commit and workdir should have filemode change + .then(function() { + return compareFilemodes(true, null, 0111 /* expect +x */) + .then(function() { + return test.repository.stageFilemode(fileName, true); + }); + }) + //Now lets do a commit... + .then(function() { + return test.repository.refreshIndex(); + }) + .then(function(_index) { + index = _index; + return index.writeTree(); + }) + .then(function (oid) { + return test.repository.getHeadCommit() + .then(function(parent) { + var signature = NodeGit.Signature.create("Foo bar", + "foo@bar.com", 123456789, 60); + return test.repository.createCommit("HEAD", signature, signature, + "initial commit", oid, [parent]); + }); + //... alright, we did a commit. + }) + // Now if we compare head commit to the workdir, + // there shouldn't be a filemode change + .then(function() { + return compareFilemodes(true, null, 0); + }); + }); + + it("can unstage filemode changes", function() { + var fileContent = "Blek"; + var fileName = "stageFilemodeTest2.txt"; + var index; + + function afterWriteFn(repo, fileName) { + return fse.chmod(path.join(repo.workdir(), fileName), + 0755 /* new filemode */); + } + + return createAndCommitFiles( + test.repository, + fileName, + fileContent, + afterWriteFn + ) + //Then, diff between head commit and workdir should have filemode change + .then(function() { + return compareFilemodes(true, null, 0111 /* expect +x */); + }) + .then(function() { + return test.repository.refreshIndex(); + }) + .then(function(repoIndex) { + //Now we stage the whole file... + index = repoIndex; + return index.addByPath(fileName); + }) + .then(function() { + return index.write(); + }) + .then(function() { + //We expect the Index to have the filemode changes now. + return compareFilemodes(false, index, 0111 /* expect +x */) + .then(function() { + //...then we attempt to unstage filemode + return test.repository.stageFilemode(fileName, false /* unstage */); + }); + }) + .then(function() { + return test.repository.refreshIndex(); + }) + //We expect the Index to have no filemode changes, since we unstaged. + .then(function(freshIndex) { + return compareFilemodes(false, freshIndex, 0 /* expect +x */); + }) + //We also expect the workdir to now have the filemode change. + .then(function() { + return compareFilemodes(true, null, 0111 /* expect +x */); + }); + }); + } else if (process.platform == "win32") { + it("can stage/unstage filemode changes for one file", function() { + var fileContent = "Blek"; + var fileName = "stageFilemodeTest.txt"; + var index; + + function afterWriteFn(repo, fileName) { + //change the permission on index + return exec("git update-index --chmod=+x " + fileName, + {cwd: repo.workdir()}) + .then(function() { + //Commit the change with execute bit set + return exec("git commit -m 'test'", + {cwd: repo.workdir()}); + }) + .then(function() { + //Then, change the permission on index + return exec("git update-index --chmod=-x " + fileName, + {cwd: repo.workdir()}); + }); + } + + return createAndCommitFiles( + test.repository, fileName, fileContent, afterWriteFn + ) + .then(function() { + return test.repository.refreshIndex(); + }) + .then(function(repoIndex) { + index = repoIndex; + //Head commit vs index + //We expect the Index to have +x + return compareFilemodes(false, index, -0111 /* expect +x */); + }) + .then(function() { + //...then we attempt to unstage filemode + return test.repository.stageFilemode(fileName, false /* unstage */); + }) + .then(function() { + return test.repository.refreshIndex(); + }) + .then(function(freshIndex) { + return compareFilemodes(false, freshIndex, 0 /* expect nochange */); + }); + }); + } + + it("can stage/unstage filemode changes for multiple files", function() { + var fileContent = "Blek"; + var fileName = ["stageFilemodeTest.txt", "stageFilemodeTest2.txt"]; + var index; + + var repoWorkDir = test.repository.workdir(); + var signature = NodeGit.Signature.create("Foo bar", + "foo@bar.com", 123456789, 60); + + return Promise.all(fileName.map(function(file) { + return fse.writeFile(path.join(repoWorkDir, file), fileContent); + })) + .then(function() { + // Initial commit + return test.repository.refreshIndex(); + }) + .then(function(index) { + return fileName + .reduce(function(lastPromise, file) { + return lastPromise + .then(function() { + return index.addByPath(file); + }); + }, Promise.resolve()) + .then(function() { + return index.write(); + }) + .then(function() { + return index.writeTree(); + }); + }) + .then(function(oid) { + return test.repository.createCommit("HEAD", signature, signature, + "initial commit", oid, []); + }) + .then(function(commitOid) { + return test.repository.getCommit(commitOid); + }) + .then(function() { + //change the permission on index + return exec("git update-index --chmod=+x " + fileName[0], + {cwd: test.repository.workdir()}); + }) + .then(function() { + //change the permission on index + return exec("git update-index --chmod=+x " + fileName[1], + {cwd: test.repository.workdir()}); + }) + .then(function() { + //Commit the change with execute bit set + return exec("git commit -m 'test'", + {cwd: test.repository.workdir()}); + }) + .then(function() { + //Then, change the permission on index back to -x + return exec("git update-index --chmod=-x " + fileName[0], + {cwd: test.repository.workdir()}); + }) + .then(function() { + //Then, change the permission on index back to -x + return exec("git update-index --chmod=-x " + fileName[1], + {cwd: test.repository.workdir()}); + }) + .then(function() { + return test.repository.refreshIndex(); + }) + .then(function(repoIndex) { + index = repoIndex; + //Head commit vs index + //We expect the Index to have +x + return compareFilemodes(false, index, -0111 /* expect +x */); + }) + .then(function() { + //...then we attempt to unstage filemode + return test.repository.stageFilemode(fileName, false /* unstage */); + }) + .then(function() { + return test.repository.refreshIndex(); + }) + .then(function(freshIndex) { + return compareFilemodes(false, freshIndex, 0 /* expect nochange */); + }); + }); + + it("can discard selected lines", function() { + return stagingTest(true, null, true); + }); }); diff --git a/test/tests/stash.js b/test/tests/stash.js index 44fe48e25a..811a0c5091 100644 --- a/test/tests/stash.js +++ b/test/tests/stash.js @@ -1,8 +1,6 @@ var assert = require("assert"); var path = require("path"); -var promisify = require("promisify-node"); -var Promise = require("nodegit-promise"); -var fse = promisify(require("fs-extra")); +var fse = require("fs-extra"); var local = path.join.bind(path, __dirname); describe("Stash", function() { @@ -32,25 +30,24 @@ describe("Stash", function() { }); }); - it("can save and drop a stash", function() { - var fileName = "README.md"; - var fileContent = "Cha-cha-cha-chaaaaaangessssss"; - var repo = this.repository; - var filePath = path.join(repo.workdir(), fileName); - var oldContent; - var stashes = []; - var stashOid; - var stashMessage = "stash test"; + function saveDropStash(repo, stashMessage) { + const fileName = "README.md"; + const fileContent = "Cha-cha-cha-chaaaaaangessssss"; + const filePath = path.join(repo.workdir(), fileName); + let oldContent; + let stashes = []; + let stashOid; return fse.readFile(filePath) - .then(function(content) { + .then((content) => { oldContent = content; return fse.writeFile(filePath, fileContent); }) - .then(function() { - return Stash.save(repo, repo.defaultSignature(), stashMessage, 0); + .then(() => repo.defaultSignature()) + .then((signature) => { + return Stash.save(repo, signature, stashMessage, 0); }) - .then(function(oid) { + .then((oid) => { stashOid = oid; var stashCb = function(index, message, oid) { stashes.push({index: index, message: message, oid: oid}); @@ -58,106 +55,119 @@ describe("Stash", function() { return Stash.foreach(repo, stashCb); }) - .then(function() { + .then(() => { assert.equal(stashes.length, 1); assert.equal(stashes[0].index, 0); - assert.equal(stashes[0].message, "On master: " + stashMessage); + const expectedMessage = !stashMessage ? + "WIP on master: 32789a7 Fixes EJS not being installed via NPM" : + "On master: " + stashMessage; + assert.equal(stashes[0].message, expectedMessage); assert.equal(stashes[0].oid.toString(), stashOid.toString()); return Stash.drop(repo, 0); }) - .then(function () { + .then(() => { stashes = []; - var stashCb = function(index, message, oid) { + var stashCb = (index, message, oid) => { stashes.push({index: index, message: message, oid: oid}); }; return Stash.foreach(repo, stashCb); }) - .then(function() { + .then(() => { assert.equal(stashes.length, 0); }) - .catch(function(e) { + .catch((e) => { return fse.writeFile(filePath, oldContent) - .then(function() { + .then(() => { return Promise.reject(e); }); }); + } + + it("can save and drop a stash", function() { + return saveDropStash(this.repository, "stash test"); + }); + + it("can save a stash with no message and drop it", function() { + return saveDropStash(this.repository, null); }); it("can save and pop a stash", function() { - var fileNameA = "README.md"; - var fileNameB = "install.js"; - var oldContentA; - var oldContentB; - var fileContent = "Cha-cha-cha-chaaaaaangessssss"; - var repo = this.repository; - var filePathA = path.join(repo.workdir(), fileNameA); - var filePathB = path.join(repo.workdir(), fileNameB); - var stashMessage = "stash test"; + const fileNameA = "README.md"; + const fileNameB = "install.js"; + let oldContentA; + let oldContentB; + const fileContent = "Cha-cha-cha-chaaaaaangessssss"; + const repo = this.repository; + const filePathA = path.join(repo.workdir(), fileNameA); + const filePathB = path.join(repo.workdir(), fileNameB); + const stashMessage = "stash test"; return fse.readFile(filePathA, "utf-8") - .then(function(content) { + .then((content) => { oldContentA = content; return fse.writeFile(filePathA, fileContent); }) - .then(function() { + .then(() => { return fse.readFile(filePathB, "utf-8"); }) - .then(function(content) { + .then((content) => { oldContentB = content; return fse.writeFile(filePathB, fileContent); }) - .then(function() { - return Stash.save(repo, repo.defaultSignature(), stashMessage, 0); + .then(() => repo.defaultSignature()) + .then((signature) => { + return Stash.save(repo, signature, stashMessage, 0); }) - .then(function() { + .then(() => { return fse.readFile(filePathA, "utf-8"); }) - .then(function(content) { + .then((content) => { assert.equal(oldContentA, content); return fse.readFile(filePathB, "utf-8"); }) - .then(function(content) { + .then((content) => { assert.equal(oldContentB, content); return Stash.pop(repo, 0); }) - .then(function() { + .then(() => { return fse.readFile(filePathA, "utf-8"); }) - .then(function(content) { + .then((content) => { assert.equal(fileContent, content); return fse.readFile(filePathB, "utf-8"); }) - .then(function(content) { + .then((content) => { assert.equal(fileContent, content); }); }); it("can save a stash, change files, and fail to pop stash", function() { - var fileName = "README.md"; - var fileContent = "Cha-cha-cha-chaaaaaangessssss"; - var fileContent2 = "Somewhere over the repo, changes were made."; - var repo = this.repository; - var filePath = path.join(repo.workdir(), fileName); - var oldContent; - var stashMessage = "stash test"; + const fileName = "README.md"; + const fileContent = "Cha-cha-cha-chaaaaaangessssss"; + const fileContent2 = "Somewhere over the repo, changes were made."; + const repo = this.repository; + const filePath = path.join(repo.workdir(), fileName); + let oldContent; + const stashMessage = "stash test"; return fse.readFile(filePath) - .then(function(content) { + .then((content) => { oldContent = content; return fse.writeFile(filePath, fileContent); }) - .then(function() { - return Stash.save(repo, repo.defaultSignature(), stashMessage, 0); + .then(() => repo.defaultSignature()) + .then((signature) => { + return Stash.save(repo, signature, stashMessage, 0); }) - .then(function() { + .then(() => { return fse.writeFile(filePath, fileContent2); }) - .then(function() { + .then(() => { return Stash.pop(repo, 0); }) - .catch(function(reason) { + .catch((reason) => { if (reason.message !== "1 conflict prevents checkout") { throw reason; } else { @@ -167,81 +177,154 @@ describe("Stash", function() { }); it("can save, apply, then drop the stash", function() { - var fileName = "README.md"; - var fileContent = "Cha-cha-cha-chaaaaaangessssss"; - var repo = this.repository; - var filePath = path.join(repo.workdir(), fileName); - var oldContent; - var stashMessage = "stash test"; + const fileName = "README.md"; + const fileContent = "Cha-cha-cha-chaaaaaangessssss"; + const repo = this.repository; + const filePath = path.join(repo.workdir(), fileName); + let oldContent; + const stashMessage = "stash test"; return fse.readFile(filePath) - .then(function(content) { + .then((content) => { oldContent = content; return fse.writeFile(filePath, fileContent); }) - .then(function() { - return Stash.save(repo, repo.defaultSignature(), stashMessage, 0); + .then(() => repo.defaultSignature()) + .then((signature) => { + return Stash.save(repo, signature, stashMessage, 0); }) - .then(function() { + .then(() => { return Stash.apply(repo, 0); }) - .then(function() { + .then(() => { return Stash.drop(repo, 0); - }, function() { + }, () => { throw new Error("Unable to drop stash after apply."); }) - .then(function() { + .then(() => { return Stash.drop(repo, 0); }) - .catch(function(reason) { - if (reason.message !== "Reference 'refs/stash' not found") { - Promise.reject(); + .catch((reason) => { + if (reason.message !== "reference 'refs/stash' not found") { + throw reason; } }); }); it("can save multiple stashes and pop an arbitrary stash", function() { - var fileName = "README.md"; - var fileContentA = "Hi. It's me. I'm the dog. My name is the dog."; - var fileContentB = "Everyone likes me. I'm cute."; - var fileContentC = "I think I will bark at nothing now. Ba. Ba. Baba Baba."; - var repo = this.repository; - var filePath = path.join(repo.workdir(), fileName); - var oldContent; - var stashMessageA = "stash test A"; - var stashMessageB = "stash test B"; - var stashMessageC = "stash test C"; - - function writeAndStash(path, content, message) { + const fileName = "README.md"; + const fileContentA = "Hi. It's me. I'm the dog. My name is the dog."; + const fileContentB = "Everyone likes me. I'm cute."; + const fileContentC = + "I think I will bark at nothing now. Ba. Ba. Baba Baba."; + const repo = this.repository; + const filePath = path.join(repo.workdir(), fileName); + let oldContent; + const stashMessageA = "stash test A"; + const stashMessageB = "stash test B"; + const stashMessageC = "stash test C"; + + const writeAndStash = (path, content, message) => { return fse.writeFile(path, content) - .then(function() { - return Stash.save(repo, repo.defaultSignature(), message, 0); + .then(() => repo.defaultSignature()) + .then((signature) => { + return Stash.save(repo, signature, message, 0); }); - } + }; return fse.readFile(filePath, "utf-8") - .then(function (content) { + .then((content) => { oldContent = content; return writeAndStash(filePath, fileContentA, stashMessageA); }) - .then(function() { + .then(() => { return writeAndStash(filePath, fileContentB, stashMessageB); }) - .then(function() { + .then(() => { return writeAndStash(filePath, fileContentC, stashMessageC); }) - .then(function() { + .then(() => { return fse.readFile(filePath, "utf-8"); }) - .then(function(content) { + .then((content) => { assert.equal(oldContent, content); return Stash.pop(repo, 1); }) - .then(function() { + .then(() => { return fse.readFile(filePath, "utf-8"); }) - .then(function(content) { + .then((content) => { assert.equal(fileContentB, content); }); }); + + it("can partial stash the workdir and pop it", function() { + const repo = this.repository; + + const fileName1 = "README.md"; + const fileName2 = "install.js"; + const fileName3 = "LICENSE"; + + const fileContentA = "Hi. It's me. I'm the dog. My name is the dog."; + const fileContentB = "Everyone likes me. I'm cute."; + + let oldContentA; + let oldContentB; + let oldContentC; + + const filePath1 = path.join(repo.workdir(), fileName1); + const filePath2 = path.join(repo.workdir(), fileName2); + const filePath3 = path.join(repo.workdir(), fileName3); + + const options = { + flags: 0, + message: "stast test", + paths: [fileName1, fileName2] + }; + + return fse.readFile(filePath1, "utf-8") + .then((content) => { + oldContentA = content; + return fse.readFile(filePath2, "utf-8"); + }) + .then((content) => { + oldContentB = content; + return fse.readFile(filePath3, "utf-8"); + }) + .then((content) => { + oldContentC = content; + return fse.writeFile(filePath1, fileContentA); + }) + .then(() => fse.writeFile(filePath2, fileContentB)) + .then(() => repo.defaultSignature()) + .then((signature) => { + options.stasher = signature; + return Stash.saveWithOpts(repo, options); + }) + .then(() => fse.readFile(filePath1, "utf-8")) + .then((content) => { + assert.equal(oldContentA, content); + return fse.readFile(filePath2, "utf-8"); + }) + .then((content) => { + assert.equal(oldContentB, content); + return fse.readFile(filePath3, "utf-8"); + }) + .then((content) => { + assert.equal(oldContentC, content); + return Stash.pop(repo, 0); + }) + .then(() => fse.readFile(filePath1, "utf-8")) + .then((content) => { + assert.equal(fileContentA, content); + return fse.readFile(filePath2, "utf-8"); + }) + .then((content) => { + assert.equal(fileContentB, content); + return fse.readFile(filePath3, "utf-8"); + }) + .then((content) => { + assert.equal(oldContentC, content); + }); + }); }); diff --git a/test/tests/status.js b/test/tests/status.js index 7c8a3ed89e..f3caeb7bf4 100644 --- a/test/tests/status.js +++ b/test/tests/status.js @@ -1,12 +1,8 @@ var assert = require("assert"); var path = require("path"); -var promisify = require("promisify-node"); -var Promise = require("nodegit-promise"); -var fse = promisify(require("fs-extra")); +var fse = require("fs-extra"); var local = path.join.bind(path, __dirname); -var exec = promisify(function(command, opts, callback) { - return require("child_process").exec(command, opts, callback); -}); +var exec = require("../../utils/execPromise"); describe("Status", function() { var NodeGit = require("../../"); @@ -105,7 +101,27 @@ describe("Status", function() { .then(function() { return Promise.reject(e); }); + }); + }); + it("gets status on non-existent file results in error", function() { + var fileName = "non-existent-Status.file-test.txt"; + var repo = this.repository; + var filePath = path.join(repo.workdir(), fileName); + return exec("git clean -xdf", {cwd: reposPath}) + .then(function() { + assert.equal(false, fse.existsSync(filePath)); + return Status.file(repo, filePath) + .then(function() { + assert.fail("Non-existent file should throw error on Status.file"); + }, function(err) { + assert.equal(NodeGit.Error.CODE.ENOTFOUND, err.errno); + assert.equal("Status.file", err.errorFunction); + assert.equal( + "attempt to get status of nonexistent file '" + filePath + "'", + err.message + ); + }); }); }); }); diff --git a/test/tests/status_list.js b/test/tests/status_list.js index 95315a9a6b..68a08910ec 100644 --- a/test/tests/status_list.js +++ b/test/tests/status_list.js @@ -1,12 +1,8 @@ var assert = require("assert"); var path = require("path"); -var promisify = require("promisify-node"); -var Promise = require("nodegit-promise"); -var fse = promisify(require("fs-extra")); +var fse = require("fs-extra"); var local = path.join.bind(path, __dirname); -var exec = promisify(function(command, opts, callback) { - return require("child_process").exec(command, opts, callback); -}); +var exec = require("../../utils/execPromise"); describe("StatusList", function() { var NodeGit = require("../../"); diff --git a/test/tests/submodule.js b/test/tests/submodule.js new file mode 100644 index 0000000000..2323fa56ca --- /dev/null +++ b/test/tests/submodule.js @@ -0,0 +1,194 @@ +var assert = require("assert"); +var path = require("path"); +var local = path.join.bind(path, __dirname); + +describe("Submodule", function() { + var NodeGit = require("../../"); + var Repository = NodeGit.Repository; + var RepoUtils = require("../utils/repository_setup"); + var Submodule = NodeGit.Submodule; + + var repoPath = local("../repos/submodule"); + + beforeEach(function() { + var test = this; + + return RepoUtils.createRepository(repoPath) + .then(function(repo) { + test.repository = repo; + return Repository.open(local("../repos/workdir")); + }) + .then(function(repo) { + test.workdirRepository = repo; + }); + }); + + it("can walk over the submodules", function() { + var repo = this.workdirRepository; + var submoduleName = "vendor/libgit2"; + + return repo.getSubmoduleNames() + .then(function(submodules) { + assert.equal(submodules.length, 1); + + var submodule = submodules[0]; + assert.equal(submodule, submoduleName); + return submodule; + }) + .then(function(submodule) { + return Submodule.lookup(repo, submodule); + }) + .then(function(submodule) { + assert.equal(submodule.name(), submoduleName); + }); + }); + + it("can get submodule status", function() { + var repo = this.workdirRepository; + var submoduleName = "vendor/libgit2"; + + return Submodule.status(repo, submoduleName, Submodule.IGNORE.NONE) + .then(function(status) { + assert.equal(Submodule.STATUS.IN_CONFIG, status); + }); + }); + + it("can get submodule location", function() { + var repo = this.workdirRepository; + var submoduleName = "vendor/libgit2"; + + return Submodule.lookup(repo, submoduleName) + .then(function(submodule) { + return submodule.location(); + }) + .then(function(status) { + assert.equal(Submodule.STATUS.IN_CONFIG, status); + }); + }); + + it("can set submodule ignore", function() { + var repo = this.workdirRepository; + var submoduleName = "vendor/libgit2"; + + return Submodule.setIgnore(repo, submoduleName, Submodule.IGNORE.ALL) + .then(function() { + return Submodule.lookup(repo, submoduleName); + }) + .then(function(submodule) { + assert.equal(Submodule.IGNORE.ALL, submodule.ignore()); + }); + }); + + it("can set submodule url", function() { + var repo = this.workdirRepository; + var submoduleName = "vendor/libgit2"; + var submoduleUrl = "https://github.com/githubtraining/hellogitworld.git"; + + return Submodule.setUrl(repo, submoduleName, submoduleUrl) + .then(function() { + return Submodule.lookup(repo, submoduleName); + }) + .then(function(submodule) { + assert.equal(submoduleUrl, submodule.url()); + }); + }); + + it("can set submodule update", function() { + var repo = this.workdirRepository; + var submoduleName = "vendor/libgit2"; + + return Submodule.setUpdate(repo, submoduleName, Submodule.UPDATE.NONE) + .then(function() { + return Submodule.lookup(repo, submoduleName); + }) + .then(function(submodule) { + assert.equal(Submodule.UPDATE.NONE, submodule.updateStrategy()); + }); + }); + + it("can setup and finalize submodule add", function() { + this.timeout(30000); + + var repo = this.repository; + var submodulePath = "nodegittest"; + var submoduleUrl = "https://github.com/nodegit/test.git"; + + var submodule; + var submoduleRepo; + + return NodeGit.Submodule.addSetup(repo, submoduleUrl, submodulePath, 0) + .then(function(_submodule) { + submodule = _submodule; + + return submodule.init(0); + }) + .then(function() { + return submodule.open(); + }) + .then(function(_submoduleRepo) { + submoduleRepo = _submoduleRepo; + return submoduleRepo.fetch("origin", null, null); + }) + .then(function() { + return submoduleRepo.getReference("origin/master"); + }) + .then(function(reference) { + return reference.peel(NodeGit.Object.TYPE.COMMIT); + }) + .then(function(commit) { + return submoduleRepo.createBranch("master", commit.id()); + }) + .then(function() { + return submodule.addFinalize(); + }) + .then(function() { + // check whether the submodule exists + return Submodule.lookup(repo, submodulePath); + }) + .then(function(submodule) { + assert.equal(submodule.name(), submodulePath); + // check whether .gitmodules and the submodule are in the index + return repo.refreshIndex(); + }) + .then(function(index) { + var entries = index.entries(); + assert.equal(entries.length, 2); + assert.equal(entries[0].path, ".gitmodules"); + assert.equal(entries[1].path, submodulePath); + }); + }); + + it("can run sync callback without deadlocking", function() { + var repo = this.workdirRepository; + var submodules = []; + var submoduleCallback = function(submodule, name, payload) { + var submoduleName = submodule.name(); + assert.equal(submoduleName, name); + submodules.push(name); + }; + + return Submodule.foreach(repo, submoduleCallback).then(function() { + assert.equal(submodules.length, 1); + }); + }); + + // 'Submodule.foreach' and 'Submodule.lookup' do work with the repo locked. + // They should work together without deadlocking. + it("can run async callback without deadlocking", function() { + var repo = this.workdirRepository; + var submodules = []; + var submoduleCallback = function(submodule, name, payload) { + var owner = submodule.owner(); + + return Submodule.lookup(owner, name) + .then(function(submodule) { + assert.equal(submodule.name(), name); + submodules.push(name); + }); + }; + + return Submodule.foreach(repo, submoduleCallback).then(function() { + assert.equal(submodules.length, 1); + }); + }); +}); diff --git a/test/tests/tag.js b/test/tests/tag.js index 663c1dd84e..21acdcc1bc 100644 --- a/test/tests/tag.js +++ b/test/tests/tag.js @@ -1,7 +1,6 @@ var assert = require("assert"); var path = require("path"); var local = path.join.bind(path, __dirname); -var Promise = require("nodegit-promise"); describe("Tag", function() { var NodeGit = require("../../"); @@ -10,12 +9,15 @@ describe("Tag", function() { var Obj = NodeGit.Object; var Oid = NodeGit.Oid; var Reference = NodeGit.Reference; + var Signature = NodeGit.Signature; var reposPath = local("../repos/workdir"); var tagName = "annotated-tag"; + var tagPattern = "annotated*"; var tagFullName = "refs/tags/" + tagName; var tagOid = "dc800017566123ff3c746b37284a24a66546667e"; var commitPointedTo = "32789a79e71fbc9e04d3eff7425e1771eb595150"; + var commitPointedTo2 = "c82fb078a192ea221c9f1093c64321c60d64aa0d"; var tagMessage = "This is an annotated tag\n"; function testTag(tag, name) { @@ -23,10 +25,11 @@ describe("Tag", function() { assert.equal(tag.targetType(), Obj.TYPE.COMMIT); assert.equal(tag.message(), tagMessage); - var target = tag.target(); - - assert.ok(target.isCommit()); - assert.equal(target.id().toString(), commitPointedTo); + return tag.target() + .then(function(target) { + assert.ok(target.isCommit()); + assert.equal(target.id().toString(), commitPointedTo); + }); } beforeEach(function() { @@ -41,21 +44,21 @@ describe("Tag", function() { it("can get a tag from a repo via the tag name", function() { return this.repository.getTagByName(tagName) .then(function(tag) { - testTag(tag); + return testTag(tag); }); }); it("can get a tag from a repo via the long tag name", function() { return this.repository.getTagByName(tagFullName) .then(function(tag) { - testTag(tag); + return testTag(tag); }); }); it("can get a tag from a repo via the tag's OID as a string", function() { return this.repository.getTag(tagOid) .then(function(tag) { - testTag(tag); + return testTag(tag); }); }); @@ -64,7 +67,7 @@ describe("Tag", function() { return this.repository.getTag(oid) .then(function(tag) { - testTag(tag); + return testTag(tag); }); }); @@ -79,6 +82,13 @@ describe("Tag", function() { }); }); + it("can list tags of a pattern in a repo", function() { + return Tag.listMatch(tagPattern, this.repository) + .then(function(tagNames) { + assert.equal(tagNames.length, 1); + }); + }); + it("can create a new annotated tag in a repo and delete it", function() { var oid = Oid.fromString(commitPointedTo); var name = "created-annotated-tag"; @@ -86,7 +96,7 @@ describe("Tag", function() { return repository.createTag(oid, name, tagMessage) .then(function(tag) { - testTag(tag, name); + return testTag(tag, name); }) .then(function() { return repository.createTag(oid, name, tagMessage); @@ -145,4 +155,532 @@ describe("Tag", function() { return Promise.resolve(); }); }); + + it("can create a new signed tag with Tag.create and delete it", function() { + var name = "created-signed-tag-create"; + var repository = this.repository; + var signature = null; + var commit = null; + var commit2 = null; + + return Signature.default(repository) + .then(function(signatureResult) { + signature = signatureResult; + return repository.getCommit(commitPointedTo); + }) + .then(function(theCommit) { + commit = theCommit; + return repository.getCommit(commitPointedTo2); + }) + .then(function(theCommit2) { + commit2 = theCommit2; + return Tag.create(repository, name, commit, signature, tagMessage, 1); + }) + .then(function(oid) { + return repository.getTag(oid); + }) + .then(function(tag) { + assert(tag.tagger(), signature); + return testTag(tag, name); + }) + .then(function() { + // overwriting is okay + return Tag.create(repository, name, commit2, signature, tagMessage, 1); + }) + .then(function() { + // overwriting is not okay + return Tag.create(repository, name, commit, signature, tagMessage, 0); + }) + .then(function() { + return Promise.reject(new Error("should not be able to create the '" + + name + "' tag twice")); + }, function() { + return Promise.resolve() + .then(function() { + return repository.deleteTagByName(name); + }) + .then(function() { + return Reference.lookup(repository, "refs/tags/" + name); + }) + .then(function() { + return Promise.reject(new Error("the tag '" + name + + "' should not exist")); + }, function() { + return Promise.resolve(); + }); + }); + }); + + it("can create a Tag buffer", function() { + const targetOid = Oid.fromString(commitPointedTo); + const name = "created-signed-tag-annotationCreate"; + const repository = this.repository; + const signature = Signature.create( + "Shaggy Rogers", + "shaggy@mystery.com", + 987654321, + 90 + ); + const message = "I'm a teapot"; + + return Tag.createBuffer(repository, name, targetOid, signature, message) + .then((tagBuffer) => { + const lines = tagBuffer.split("\n"); + assert.equal(7, lines.length); + assert.equal(lines[0], `object ${commitPointedTo}`); + assert.equal(lines[1], "type commit"); + assert.equal(lines[2], `tag ${name}`); + assert.equal( + lines[3], + "tagger Shaggy Rogers 987654321 +0130" + ); + assert.equal(lines[4], ""); + assert.equal(lines[5], message); + assert.equal(lines[6], ""); + }); + }); + + it("can create a Tag from a Tag buffer", function() { + const targetOid = Oid.fromString(commitPointedTo); + const otherTargetOid = Oid.fromString(commitPointedTo2); + const name = "created-signed-tag-annotationCreate"; + const repository = this.repository; + const signature = Signature.create( + "Shaggy Rogers", + "shaggy@mystery.com", + 987654321, + 90 + ); + const message = "I'm a teapot"; + + let odb; + let buffer; + let otherBuffer; + + return repository.odb() + .then((odbResult) => { + odb = odbResult; + return Tag.createBuffer( + repository, + name, + targetOid, + signature, + message + ); + }) + .then((bufferResult) => { + buffer = bufferResult; + return Tag.createBuffer( + repository, + name, + otherTargetOid, + signature, + message + ); + }) + .then((bufferResult) => { + otherBuffer = bufferResult; + return Tag.createFromBuffer(repository, buffer, 1); + }) + .then((oid) => { + return odb.read(oid); + }) + .then((object) => { + const lines = object.toString().split("\n"); + assert(object.type(), Obj.TYPE.TAG); + assert.equal(7, lines.length); + assert.equal(lines[0], `object ${commitPointedTo}`); + assert.equal(lines[1], "type commit"); + assert.equal(lines[2], `tag ${name}`); + assert.equal( + lines[3], + "tagger Shaggy Rogers 987654321 +0130" + ); + assert.equal(lines[4], ""); + assert.equal(lines[5], message); + assert.equal(lines[6], ""); + }) + .then(() => { + // overwriting is okay + return Tag.createFromBuffer(repository, otherBuffer, 1); + }) + .then(() => { + // overwriting is not okay + return Tag.createFromBuffer(repository, buffer, 0); + }) + .then(() => { + return Promise.reject( + new Error("should not be able to create the '" + name + "' tag twice") + ); + }, + () => { + return Promise.resolve(); + }); + }); + + describe("createWithSignature and extractSignature", function() { + it( + "can create a tag with a signature and extract the signature", + function() { + var targetCommit; + var otherTargetCommit; + const name = "created-signed-tag-annotationCreate"; + const repository = this.repository; + const signature = Signature.create( + "Shaggy Rogers", + "shaggy@mystery.com", + 987654321, + 90 + ); + const signatureLines = [ + "-----BEGIN PGP SIGNATURE-----", + "iQIzBAABCAAdFiEEKdxGpJ93wnkLaBKfURjJKedOfEMFAlxR4JUACgkQURjJKedO", + "fEN+8A//cXmkRmhzQMdTEdrxty7tVKQ7lVhL7r7e+cB84hO7WrDn8549c7/Puflu", + "idanWfyoAEMSNWDgY84lx/t3I3YYKXsLDPT93HiMhCXmPVZcfLxlARRL1rrNZV4q", + "L9hhqb9bFrRNBn6YebhygeLXLHlDKEZzx8W9jnDLU8Px8UTkwdQIDnPDfT7UOPPU", + "MYDgP3OwWwoG8dUlZXaHjtFz29wPlJo177MwdLYwn4zpEIysoY1ev5IKWD+LPW4g", + "vdQnaK1x3dozmG8YLUZw5iW7ap9DpahbAGQgdy1z1ypiNUjNuhaP8zkG1ci6X88N", + "6MIoQ+YqfowRJJTIr1lzssxsRI1syjfS6smnI4ZNE6S+6mIKN96ES2OZF+rn4xnD", + "PofR9Qh2gPq++ULriPE/cX7ZkZ0/ZDZGDfIGvricB8JEJhISZn/VMX/KScJs+rFq", + "KWN5Au6Uc2pEqeq5OP4y2k0QUmKQT9sh9OepnPmfqF8hG6wI8nM67jT/FEOcpr0v", + "qoN2NRXrcq3iZAp07AGq9IdpYhBcEW7MFmOcNt+Zb8SbTMp6DawnREg9xzz1SIkZ", + "Cdp1XoJ6mkVvzBB4T/Esp7j1VztinTX2PpX7C1CE5LC76UfCiEjEWOmWrVuPuA5a", + "oRrJvgPJg8gpVj04r2m8nvUK1gwhxg9ZB+SK+nd3OAd0dnbJwTE=", + "=dW3g", + "-----END PGP SIGNATURE-----" + ]; + const message = "I'm a teapot"; + const signingCallback = (message) => ({ + code: NodeGit.Error.CODE.OK, + signedData: signatureLines.join("\n") + }); + + let odb; + let oid; + let object; + + return repository.getCommit(commitPointedTo).then((commit) => { + targetCommit = commit; + return repository.getCommit(commitPointedTo2); + }).then((commit) => { + otherTargetCommit = commit; + return repository.odb(); + }).then((odbResult) => { + odb = odbResult; + + return Tag.createWithSignature( + repository, + name, + targetCommit, + signature, + message, + 1, + signingCallback + ); + }) + .then((oidResult) => { + oid = oidResult; + return odb.read(oid); + }) + .then((objectResult) => { + object = objectResult; + const lines = object.toString().split("\n"); + assert(object.type(), Obj.TYPE.TAG); + assert.equal(signatureLines.length + 7, lines.length); + assert.equal(lines[0], `object ${commitPointedTo}`); + assert.equal(lines[1], "type commit"); + assert.equal(lines[2], `tag ${name}`); + assert.equal( + lines[3], + "tagger Shaggy Rogers 987654321 +0130" + ); + assert.equal(lines[4], ""); + assert.equal(lines[5], message); + for (let i = 6; i < 6 + signatureLines.length; i++) { + assert.equal(lines[i], signatureLines[i - 6]); + } + assert.equal(lines[6 + signatureLines.length], ""); + + return Tag.lookup(repository, oid); + }) + .then((tag) => { + return tag.extractSignature(); + }) + .then((tagSignature) => { + assert.equal(tagSignature, signatureLines.join("\n")); + }) + .then(() => { + // overwriting is okay + return Tag.createWithSignature( + repository, + name, + targetCommit, + signature, + message, + 1, + signingCallback + ); + }) + .then(() => { + // overwriting is not okay + return Tag.createWithSignature( + repository, + name, + otherTargetCommit, + signature, + message, + 0, + signingCallback + ); + }) + .then(() => { + return Promise.reject( + new Error( + "should not be able to create the '" + name + "' tag twice" + ) + ); + }, + () => { + return Promise.resolve(); + }); + } + ); + + it("can optionally skip the signing process", function() { + var targetCommit; + var otherTargetCommit; + const name = "created-signed-tag-annotationCreate"; + const repository = this.repository; + const signature = Signature.create( + "Shaggy Rogers", + "shaggy@mystery.com", + 987654321, + 90 + ); + const message = "I'm a teapot"; + const signingCallback = () => ({ + code: NodeGit.Error.CODE.PASSTHROUGH + }); + + let odb; + let oid; + let object; + + return repository.getCommit(commitPointedTo).then((commit) => { + targetCommit = commit; + return repository.getCommit(commitPointedTo2); + }).then((commit) => { + otherTargetCommit = commit; + return repository.odb(); + }).then((odbResult) => { + odb = odbResult; + + return Tag.createWithSignature( + repository, + name, + targetCommit, + signature, + message, + 1, + signingCallback + ); + }) + .then((oidResult) => { + oid = oidResult; + return odb.read(oid); + }) + .then((objectResult) => { + object = objectResult; + const lines = object.toString().split("\n"); + assert(object.type(), Obj.TYPE.TAG); + assert.equal(7, lines.length); + assert.equal(lines[0], `object ${commitPointedTo}`); + assert.equal(lines[1], "type commit"); + assert.equal(lines[2], `tag ${name}`); + assert.equal( + lines[3], + "tagger Shaggy Rogers 987654321 +0130" + ); + assert.equal(lines[4], ""); + assert.equal(lines[5], message); + assert.equal(lines[6], ""); + + return Tag.lookup(repository, oid); + }) + .then((tag) => { + return tag.extractSignature(); + }) + .then(function() { + assert.fail("Tag should not have been signed."); + }, function(error) { + if (error && error.message === "this tag is not signed") { + return; + } + + throw error; + }) + .then(() => { + // overwriting is okay + return Tag.createWithSignature( + repository, + name, + targetCommit, + signature, + message, + 1, + signingCallback + ); + }) + .then(() => { + // overwriting is not okay + return Tag.createWithSignature( + repository, + name, + otherTargetCommit, + signature, + message, + 0, + signingCallback + ); + }) + .then(() => { + return Promise.reject( + new Error("should not be able to create the '" + name + "' tag twice") + ); + }, + () => { + return Promise.resolve(); + }); + }); + + it("will throw if signing callback returns an error code", function() { + var targetCommit; + const name = "created-signed-tag-annotationCreate"; + const repository = this.repository; + const signature = Signature.create( + "Shaggy Rogers", + "shaggy@mystery.com", + 987654321, + 90 + ); + const message = "I'm a teapot"; + const signingCallback = () => ({ + code: NodeGit.Error.CODE.ERROR + }); + + + return repository.getCommit(commitPointedTo).then((commit) => { + targetCommit = commit; + return Tag.createWithSignature( + repository, + name, + targetCommit, + signature, + message, + 1, + signingCallback + ); + }).then(function() { + assert.fail("Should not have been able to create tag"); + }, function(error) { + if (error && error.errno === NodeGit.Error.CODE.ERROR) { + return; + } + throw error; + }); + }); + }); + + it("will show a deprecation warning if createWithSignature use oid instead object", function() { + var targetCommit; + const name = "created-signed-tag-annotationCreate"; + const repository = this.repository; + const signature = Signature.create( + "Shaggy Rogers", + "shaggy@mystery.com", + 987654321, + 90 + ); + const message = "I'm a teapot"; + const signingCallback = () => ({ + code: NodeGit.Error.CODE.ERROR + }); + + + return repository.getCommit(commitPointedTo).then((commit) => { + targetCommit = commit; + return Tag.createWithSignature( + repository, + name, + targetCommit.id(), + signature, + message, + 1, + signingCallback + ); + }).then(function() { + assert.fail("Should not have been able to create tag"); + }, function(error) { + if (error && error.errno === NodeGit.Error.CODE.ERROR) { + return; + } + throw error; + }); + }); + + it("can create a new signed tag with Tag.annotationCreate", function() { + var targetCommit; + var name = "created-signed-tag-annotationCreate"; + var repository = this.repository; + var signature = null; + var odb = null; + + return repository.getCommit(commitPointedTo).then((commit) => { + targetCommit = commit; + return Signature.default(repository); + }).then(function(signatureResult) { + signature = signatureResult; + return repository.odb(); + }) + .then(function(theOdb) { + odb = theOdb; + }) + .then(function() { + return Tag.annotationCreate( + repository, name, targetCommit, signature, tagMessage); + }) + .then(function(oid) { + return odb.read(oid); + }) + .then(function(object) { + assert(object.type(), Obj.TYPE.TAG); + }); + }); + + it("can peel a tag", function() { + return this.repository.getTagByName(tagName) + .then(function(tag) { + return tag.peel(); + }) + .then(function(object) { + assert.equal(object.isCommit(), true); + }); + }); + + it("can get tag's target id", function() { + return this.repository.getTagByName(tagName) + .then(function(tag) { + assert.equal(commitPointedTo, tag.targetId()); + }); + }); + + it("can get tag's owner", function() { + var repository = this.repository; + return this.repository.getTagByName(tagName) + .then(function(tag) { + var owner = tag.owner(); + assert.ok(owner instanceof Repository); + assert.equal(repository.path(), owner.path()); + }); + }); }); diff --git a/test/tests/tree.js b/test/tests/tree.js new file mode 100644 index 0000000000..052459a80b --- /dev/null +++ b/test/tests/tree.js @@ -0,0 +1,124 @@ +var assert = require("assert"); +var path = require("path"); +var local = path.join.bind(path, __dirname); +var fse = require("fs-extra"); + +describe("Tree", function() { + var NodeGit = require("../../"); + var RepoUtils = require("../utils/repository_setup"); + + var repoPath = local("../repos/tree"); + var existingPath = local("../repos/workdir"); + var oid = "5716e9757886eaf38d51c86b192258c960d9cfea"; + + beforeEach(function() { + var test = this; + return RepoUtils.createRepository(repoPath) + .then(function(repo) { + test.repository = repo; + }).then(function() { + return NodeGit.Repository.open(existingPath); + }).then(function(repository) { + test.existingRepo = repository; + return repository.getCommit(oid); + }).then(function(commit) { + test.commit = commit; + }); + }); + + after(function() { + return fse.remove(repoPath); + }); + + it("gets an entry by name", + function() { + return this.commit.getTree().then(function(tree) { + var entry = tree.entryByName("README.md"); + assert(entry); + }); + }); + + it("updates a tree", function () { + var repo = this.existingRepo; + var update = new NodeGit.TreeUpdate(); + update.action = NodeGit.Tree.UPDATE.REMOVE; + update.path = "README.md"; + return this.commit.getTree().then(function(tree) { + return tree.createUpdated(repo, 1, [update]); + }) + .then(function(treeOid) { + return repo.getTree(treeOid); + }) + .then(function(updatedTree) { + assert.throws(function () { + updatedTree.entryByName("README.md"); + }); + }); + }); + + it("walks its entries and returns the same entries on both progress and end", + function() { + var repo = this.repository; + var file1 = "test.txt"; + var file2 = "foo/bar.txt"; + var expectedPaths = [file1, file2]; + var progressEntries = []; + var endEntries; + + return RepoUtils.commitFileToRepo(repo, file1, "") + .then(function(commit) { + return RepoUtils.commitFileToRepo(repo, file2, "", commit); + }) + .then(function(commit) { + return commit.getTree(); + }) + .then(function(tree) { + assert(tree); + + return new Promise(function (resolve, reject) { + var walker = tree.walk(); + + walker.on("entry", function(entry) { + progressEntries.push(entry); + }); + walker.on("end", function(entries) { + endEntries = entries; + resolve(); + }); + walker.on("error", reject); + + walker.start(); + }); + }) + .then(function() { + assert(progressEntries.length); + assert(endEntries && endEntries.length); + + function getEntryPath(entry) { + return entry.path(); + } + + var progressFilePaths = progressEntries.map(getEntryPath); + var endFilePaths = endEntries.map(getEntryPath); + + assert.deepEqual( + expectedPaths, progressFilePaths, + "progress entry paths do not match expected paths" + ); + + assert.deepEqual( + expectedPaths, endFilePaths, + "end entry paths do not match expected paths" + ); + }); + }); + + it("get all paths from a tree", async function () { + const tree = await this.commit.getTree(); + const paths = await tree.getAllFilepaths(); + assert.equal(paths.length, 512); + assert.equal(paths[0], ".gitignore"); + assert.equal(paths[511], "wscript"); + }); + +}); diff --git a/test/tests/tree_entry.js b/test/tests/tree_entry.js index 371b8e6366..f62f374f04 100644 --- a/test/tests/tree_entry.js +++ b/test/tests/tree_entry.js @@ -1,8 +1,9 @@ var assert = require("assert"); -var Promise = require("nodegit-promise"); var path = require("path"); var local = path.join.bind(path, __dirname); +var leakTest = require("../utils/leak_test"); + describe("TreeEntry", function() { var NodeGit = require("../../"); var Repository = NodeGit.Repository; @@ -39,26 +40,33 @@ describe("TreeEntry", function() { }); }); + it("provides the correct length for a file", function() { + return this.commit.getEntry("README.md") + .then(function(entry) { + assert.equal(entry.name().length, 9); + }); + }); + it("provides the filename", function() { return this.commit.getEntry("test/raw-commit.js") .then(function(entry) { - assert.equal(entry.filename(), "raw-commit.js"); + assert.equal(entry.name(), "raw-commit.js"); }); }); it("provides the full path", function() { return this.commit.getEntry("test/raw-commit.js") .then(function(entry) { - assert.equal(entry.path(), path.normalize("test/raw-commit.js")); + assert.equal(entry.path(), "test/raw-commit.js"); }); }); - it("provides the full path when the entry came from a tree", function(done) { + it("provides the full path when the entry came from a tree", function() { var testTree = function(tree, _dir) { var dir = _dir || "", testPromises = []; tree.entries().forEach(function(entry) { - var currentPath = path.join(dir, entry.filename()); + var currentPath = path.posix.join(dir, entry.name()); if (entry.isTree()) { testPromises.push( entry.getTree().then(function (subtree) { @@ -74,10 +82,7 @@ describe("TreeEntry", function() { }; return this.commit.getTree() - .then(testTree) - .done(function() { - done(); - }); + .then(testTree); }); it("provides the blob representation of the entry", function() { @@ -116,10 +121,68 @@ describe("TreeEntry", function() { }); }); - it("can determine if an entry is a directory", function() { + it("can determine if an entry is not a file", function() { return this.commit.getEntry("example") .then(function(entry) { assert.equal(entry.isFile(), false); }); }); + + it("can determine if an entry is a directory", function() { + return this.commit.getEntry("example") + .then(function(entry) { + assert.equal(entry.isDirectory(), true); + }); + }); + + it("can determine if an entry is a submodule", function() { + var repo = this.repository; + return repo.getCommit("878ef6efbc5f85c4f63aeedf41addc262a621308") + .then(function(commit) { + return commit.getEntry("vendor/libgit2") + .then(function(entry) { + assert.equal(entry.isSubmodule(), true); + }); + }); + }); + + it("can determine if an entry is not a submodule", function() { + return this.commit.getEntry("example") + .then(function(entry) { + assert.equal(entry.isSubmodule(), false); + }); + }); + + it("can convert entry into a blob", function() { + var repo = this.repository; + return this.commit.getEntry("README.md") + .then(function(entry) { + return entry.toObject(repo); + }) + .then(function(object) { + assert.equal(object.isBlob(), true); + }); + }); + + it("can convert entry into a tree", function() { + var repo = this.repository; + return this.commit.getEntry("example") + .then(function(entry) { + return entry.toObject(repo); + }) + .then(function(object) { + assert.equal(object.isTree(), true); + }); + }); + + it("does not leak", function() { + var test = this; + + return leakTest(NodeGit.TreeEntry, function() { + return test.commit.getTree() + .then(function(tree) { + return tree.entryByPath("example"); + }); + }); + }); }); diff --git a/test/tests/treebuilder.js b/test/tests/treebuilder.js new file mode 100644 index 0000000000..6462fd9346 --- /dev/null +++ b/test/tests/treebuilder.js @@ -0,0 +1,98 @@ +var assert = require("assert"); +var path = require("path"); +var fse = require("fs-extra"); +var local = path.join.bind(path, __dirname); + +var leakTest = require("../utils/leak_test"); + +describe("TreeBuilder", function(){ + + var Git = require("../../"); + var reposPath = local("../repos/workdir"); + var oid = "111dd657329797f6165f52f5085f61ac976dcf04"; + + //setup test repo each test + beforeEach(function() { + var test = this; + + return Git.Repository.open(reposPath) + .then(function(repo) { + test.repo = repo; + }); + }); + //treebuilder created with no source when creating a new folder + // (each folder in git is a tree) + // or the root folder for a root commit + it("Can create a new treebuilder with no source", function(){ + + return Git.Treebuilder.create(this.repo, null); + }); + //treebuilder created with a source tree can add / read from tree + it("Can create a treebuilder from the latest commit tree", function(){ + + var test = this; + //get latest commit + return test.repo.getHeadCommit() + //get tree of commit + .then(function(commit){ return commit.getTree(); }) + //make treebuilder from tree + .then(function(tree){ return Git.Treebuilder.create(test.repo, tree); }) + //verify treebuilder can do stuff + .then(function(treeBuilder){ + //check + //count how many entries we should have + return fse.readdir(reposPath) + //treebuilder should have all entries in the clean working dir + //(minus .git folder) + .then(function(dirEntries) { + return assert.equal(dirEntries.length-1, treeBuilder.entrycount()); + }); + }); + }); + //adding a tree is adding a folder + it("Can add a new tree to an existing tree", function(){ + + var test = this; + //get latest commit + return test.repo.getHeadCommit() + //get tree of commit + .then(function(commit){ return commit.getTree(); }) + //make treebuilder from tree + .then(function(tree){ return Git.Treebuilder.create(test.repo, tree); }) + //verify treebuilder can do stuff + .then(function(rootTreeBuilder){ + //new dir builder + return Git.Treebuilder.create(test.repo, null) + .then(function(newTreeBuilder) { + return newTreeBuilder.write(); + }) + .then(function(oid) { + return rootTreeBuilder.insert( + "mynewfolder", + oid, + Git.TreeEntry.FILEMODE.TREE + ); + }); + }) + .then(function(newTreeEntry){ + assert(newTreeEntry.isTree(), + "Created a tree (new folder) that is a tree"); + return Git.Tree.lookup(test.repo, newTreeEntry.oid()); + }); + }); + + it("does not leak inserts", function() { + var test = this; + + // The underlying C++ git_tree_entry is owned by the treebuilder that + // creates it. But since git_tree_entry is duplicable the generator will + // duplicate it and mark it as self freeing. + // Validate this with the leakTest. + return leakTest(Git.TreeEntry, function() { + return Git.Treebuilder.create(test.repo, null) + .then(function(builder) { + return builder.insert("test", oid, Git.TreeEntry.FILEMODE.BLOB); + }); + }); + }); +}); diff --git a/test/tests/worker.js b/test/tests/worker.js new file mode 100644 index 0000000000..f39e19e6da --- /dev/null +++ b/test/tests/worker.js @@ -0,0 +1,216 @@ +const path = require("path"); +const assert = require("assert"); +const fse = require("fs-extra"); +const local = path.join.bind(path, __dirname); +const NodeGit = require("../../"); + +let filterName = "psuedo_filter"; +let Worker; + +try { + Worker = require("worker_threads").Worker; +} catch (e) {} + +if (Worker) { + describe("Worker", function() { + const clonePath = local("../repos/clone"); + + // Set a reasonable timeout here now that our repository has grown. + this.timeout(30000); + + beforeEach(function() { + return fse.remove(clonePath).catch(function(err) { + console.log(err); + + throw err; + }); + }); + + afterEach(function() { + return NodeGit.FilterRegistry.unregister(filterName) + .catch(function(error) { + if (error === NodeGit.Error.CODE.ERROR) { + throw new Error("Cannot unregister filter"); + } + }); + }); + + it("can perform basic functionality via worker thread", function(done) { + const workerPath = local("../utils/worker.js"); + const worker = new Worker(workerPath, { + workerData: { + clonePath, + url: "https://github.com/nodegit/test.git" + } + }); + worker.on("message", (message) => { + switch (message) { + case "init": + break; + case "success": + done(); + break; + case "failure": + assert.fail(); + break; + } + }); + worker.on("error", () => assert.fail()); + worker.on("exit", (code) => { + if (code !== 0) { + assert.fail(); + } + }); + }); + + for (let i = 0; i < 5; ++i) { + // disabled until we can address flakiness + it.skip(`can kill worker thread while in use #${i}`, function(done) { // jshint ignore:line + const workerPath = local("../utils/worker.js"); + const worker = new Worker(workerPath, { + workerData: { + clonePath, + url: "https://github.com/nodegit/test.git" + } + }); + worker.on("message", (message) => { + switch (message) { + case "init": + setTimeout(() => { worker.terminate(); }, 500); + break; + case "success": + assert.fail(); + break; + case "failure": + assert.fail(); + break; + } + }); + worker.on("error", () => assert.fail()); + worker.on("exit", (code) => { + if (code === 1) { + done(); + } else { + assert.fail(); + } + }); + }); + } + + // NOTE: first try was to build a test measuring memory used, checking + // that memory allocated by objects was being freed, but it was problematic + // to obtain the memory freed by a different context (a worker) after the + // context was gone, and the data in the tests wasn't consistent. + // So instead this test checks that the count of objects created/destroyed + // during the test match the count of objects being tracked by the + // nodegit::Context, which will be destroyed on context shutdown. To check + // that they are actually being freed can be done with a debugger/profiler. + it("can track objects to free on context shutdown", function(done) { + let testOk; + const workerPath = local("../utils/worker_context_aware.js"); + const worker = new Worker(workerPath, { + workerData: { + clonePath, + url: "https://github.com/nodegit/test.git" + } + }); + worker.on("message", (message) => { + switch (message) { + case "numbersMatch": + testOk = true; + worker.terminate(); + break; + case "numbersDoNotMatch": + testOk = false; + worker.terminate(); + break; + case "failure": + assert.fail(); + break; + } + }); + worker.on("error", () => assert.fail()); + worker.on("exit", (code) => { + if (code === 1 && testOk === true) { + done(); + } + else { + assert.fail(); + } + }); + }); + + // This tests that while calling filter's apply callbacks and the worker + // is terminated, node exits gracefully. To make sure we terminate the + // worker during a checkout, continuous checkouts will be running in a loop. + it("can kill worker thread while doing a checkout and exit gracefully", function(done) { // jshint ignore:line + const workerPath = local("../utils/worker_checkout.js"); + const worker = new Worker(workerPath, { + workerData: { + clonePath, + url: "https://github.com/nodegit/test.git" + } + }); + worker.on("message", (message) => { + switch (message) { + case "init": + // give enough time for the worker to start applying the filter + // during continuous checkouts + setTimeout(() => { worker.terminate(); }, 10000); + break; + case "success": + assert.fail(); + break; + case "failure": + assert.fail(); + break; + } + }); + worker.on("error", () => assert.fail()); + worker.on("exit", (code) => { + if (code == 1) { + done(); + } else { + assert.fail(); + } + }); + }); + + // This tests that after calling filter's apply callbacks and the worker + // is terminated, there will be no memory leaks. + it("can track objects to free on context shutdown after multiple checkouts", function(done) { // jshint ignore:line + let testOk; + const workerPath = local("../utils/worker_context_aware_checkout.js"); + const worker = new Worker(workerPath, { + workerData: { + clonePath, + url: "https://github.com/nodegit/test.git" + } + }); + worker.on("message", (message) => { + switch (message) { + case "numbersMatch": + testOk = true; + worker.terminate(); + break; + case "numbersDoNotMatch": + testOk = false; + worker.terminate(); + break; + case "failure": + assert.fail(); + break; + } + }); + worker.on("error", () => assert.fail()); + worker.on("exit", (code) => { + if (code === 1 && testOk === true) { + done(); + } + else { + assert.fail(); + } + }); + }); + }); +} diff --git a/test/utils/garbage_collect.js b/test/utils/garbage_collect.js new file mode 100644 index 0000000000..a288b99c87 --- /dev/null +++ b/test/utils/garbage_collect.js @@ -0,0 +1,20 @@ +// aggressively collects garbage until we fail to improve terminatingIterations +// times. +function garbageCollect() { + var terminatingIterations = 3; + var usedBeforeGC = Number.MAX_VALUE; + var nondecreasingIterations = 0; + for ( ; ; ) { + global.gc(); + var usedAfterGC = process.memoryUsage().heapUsed; + if (usedAfterGC >= usedBeforeGC) { + nondecreasingIterations++; + if (nondecreasingIterations >= terminatingIterations) { + break; + } + } + usedBeforeGC = usedAfterGC; + } +} + +module.exports = garbageCollect; diff --git a/test/utils/index_setup.js b/test/utils/index_setup.js new file mode 100644 index 0000000000..ab5a75336e --- /dev/null +++ b/test/utils/index_setup.js @@ -0,0 +1,92 @@ +var NodeGit = require("../../"); +var path = require("path"); +var fse = require("fs-extra"); +var RepoUtils = require("../utils/repository_setup"); + +var IndexSetup = { + createConflict: function createConflict( + repository, + _ourBranchName, + _theirBranchName, + _fileName + ) { + var fileName = _fileName || "everyonesFile.txt"; + + var ourBranchName = _ourBranchName || "ours"; + var theirBranchName = _theirBranchName || "theirs"; + + var baseFileContent = "How do you feel about Toll Roads?\n"; + var ourFileContent = "I like Toll Roads. I have an EZ-Pass!\n"; + var theirFileContent = "I'm skeptical about Toll Roads\n"; + + var ourSignature = NodeGit.Signature.create + ("Ron Paul", "RonPaul@TollRoadsRBest.info", 123456789, 60); + var theirSignature = NodeGit.Signature.create + ("Greg Abbott", "Gregggg@IllTollYourFace.us", 123456789, 60); + + var ourCommit; + var ourBranch; + var theirBranch; + + return fse.writeFile( + path.join(repository.workdir(), fileName), + baseFileContent + ) + .then(function() { + return RepoUtils.addFileToIndex(repository, fileName); + }) + .then(function(oid) { + return repository.createCommit("HEAD", ourSignature, + ourSignature, "initial commit", oid, []); + }) + .then(function(commitOid) { + return repository.getCommit(commitOid).then(function(commit) { + ourCommit = commit; + }).then(function() { + return repository.createBranch(ourBranchName, commitOid) + .then(function(branch) { + ourBranch = branch; + return repository.createBranch(theirBranchName, commitOid); + }); + }); + }) + .then(function(branch) { + theirBranch = branch; + return fse.writeFile(path.join(repository.workdir(), fileName), + baseFileContent + theirFileContent); + }) + .then(function() { + return RepoUtils.addFileToIndex(repository, fileName); + }) + .then(function(oid) { + return repository.createCommit(theirBranch.name(), theirSignature, + theirSignature, "they made a commit", oid, [ourCommit]); + }) + .then(function(commitOid) { + return fse.writeFile(path.join(repository.workdir(), fileName), + baseFileContent + ourFileContent); + }) + .then(function() { + return RepoUtils.addFileToIndex(repository, fileName); + }) + .then(function(oid) { + return repository.createCommit(ourBranch.name(), ourSignature, + ourSignature, "we made a commit", oid, [ourCommit]); + }) + .then(function() { + return repository.checkoutBranch( + ourBranch, + new NodeGit.CheckoutOptions() + ); + }) + .then(function() { + return repository.mergeBranches(ourBranchName, theirBranchName); + }) + .catch(function(index) { + return NodeGit.Checkout.index(repository, index) + .then(function() { return index; }); + }); + } +}; + +module.exports = IndexSetup; diff --git a/test/utils/leak_test.js b/test/utils/leak_test.js new file mode 100644 index 0000000000..a784facb19 --- /dev/null +++ b/test/utils/leak_test.js @@ -0,0 +1,33 @@ +var assert = require("assert"); + +var garbageCollect = require("./garbage_collect"); + +function leakTest(Type, getInstance) { + garbageCollect(); + var startSelfFreeingCount = Type.getSelfFreeingInstanceCount(); + var startNonSelfFreeingCount = Type.getNonSelfFreeingConstructedCount(); + + var resolve; + var promise = new Promise(function(_resolve) { resolve = _resolve; }); + + getInstance() + .then(function() { + var selfFreeingCount = Type.getSelfFreeingInstanceCount(); + assert.equal(startSelfFreeingCount + 1, selfFreeingCount); + // get out of this promise chain to help GC get rid of the commit + setTimeout(resolve, 0); + }); + + return promise + .then(function() { + garbageCollect(); + var endSelfFreeingCount = Type.getSelfFreeingInstanceCount(); + var endNonSelfFreeingCount = Type.getNonSelfFreeingConstructedCount(); + // any new self-freeing commits should have been freed + assert.equal(startSelfFreeingCount, endSelfFreeingCount); + // no new non-self-freeing commits should have been constructed + assert.equal(startNonSelfFreeingCount, endNonSelfFreeingCount); + }); +} + +module.exports = leakTest; diff --git a/test/utils/loop_checkout.js b/test/utils/loop_checkout.js new file mode 100644 index 0000000000..f6e6c07360 --- /dev/null +++ b/test/utils/loop_checkout.js @@ -0,0 +1,91 @@ +const fse = require("fs-extra"); +const path = require("path"); +const NodeGit = require("../../"); + +const getDirExtFiles = function(dir, ext, done) { + let results = []; + fse.readdir(dir, function(err, list) { + if (err) { + return done(err); + } + let i = 0; + (function next() { + let file = list[i++]; + if (!file) { + return done(null, results); + } + file = path.resolve(dir, file); + fse.stat(file, function(err, stat) { + if (stat && stat.isDirectory()) { + getDirExtFiles(file, ext, function(err, res) { + results = results.concat(res); + next(); + }); + } else { + if (path.extname(file) == ".".concat(ext)) { + results.push(file); + } + next(); + } + }); + })(); + }); +}; + +const getDirFilesToChange = function(dir, ext) { + return new Promise(function(resolve, reject) { + getDirExtFiles(dir, ext, function(err, results) { + if (err) { + reject(err); + } + resolve(results); + }); + }); +}; + +// Changes the content of files with extension 'ext' +// in directory 'dir' recursively. +// Returns relative file paths +const changeDirExtFiles = function (dir, ext, newText) { + let filesChanged = []; + return getDirFilesToChange(dir, ext) + .then(function(filesWithExt) { + filesWithExt.forEach(function(file) { + fse.writeFile( + file, + newText, + { encoding: "utf-8" } + ); + filesChanged.push(path.relative(dir, file)); + }); + return filesChanged; + }) + .catch(function(err) { + throw new Error("Error getting files with extension .".concat(ext)); + }); +}; + +// 'times' to limit the number of iterations in the loop. +// 0 means no limit. +const loopingCheckoutHead = async function(repoPath, repo, times) { + const text0 = "Text0: changing content to trigger checkout"; + const text1 = "Text1: changing content to trigger checkout"; + + let iteration = 0; + for (let i = 0; true; i = ++i%2) { + const newText = (i == 0) ? text0 : text1; + const jsRelativeFilePahts = await changeDirExtFiles(repoPath, "js", newText); // jshint ignore:line + let checkoutOpts = { + checkoutStrategy: NodeGit.Checkout.STRATEGY.FORCE, + paths: jsRelativeFilePahts + }; + await NodeGit.Checkout.head(repo, checkoutOpts); + + if (++iteration == times) { + break; + } + } + return; +}; + +module.exports = loopingCheckoutHead; \ No newline at end of file diff --git a/test/utils/repository_setup.js b/test/utils/repository_setup.js index 8b63af2663..5a36bf7460 100644 --- a/test/utils/repository_setup.js +++ b/test/utils/repository_setup.js @@ -1,36 +1,46 @@ var assert = require("assert"); var NodeGit = require("../../"); var path = require("path"); -var Promise = require("nodegit-promise"); -var promisify = require("promisify-node"); -var fse = promisify(require("fs-extra")); +var fse = require("fs-extra"); var RepositorySetup = { addFileToIndex: function addFileToIndex(repository, fileName) { - return repository.openIndex() + return repository.refreshIndex() .then(function(index) { - index.read(1); - index.addByPath(fileName); - index.write(); - - return index.writeTree(); + return index.addByPath(fileName) + .then(function() { + return index.write(); + }) + .then(function() { + return index.writeTree(); + }); }); }, commitFileToRepo: - function commitFileToRepo(repository, fileName, fileContent) { + function commitFileToRepo(repository, fileName, fileContent, parentCommit) { var repoWorkDir = repository.workdir(); var signature = NodeGit.Signature.create("Foo bar", "foo@bar.com", 123456789, 60); - return fse.writeFile(path.join(repoWorkDir, fileName), fileContent) + var filePath = path.join(repoWorkDir, fileName); + var parents = []; + if (parentCommit) { + parents.push(parentCommit); + } + + // fse.ensure allows us to write files inside new folders + return fse.ensureFile(filePath) + .then(function() { + return fse.writeFile(filePath, fileContent); + }) .then(function() { return RepositorySetup.addFileToIndex(repository, fileName); }) .then(function(oid) { return repository.createCommit("HEAD", signature, signature, - "initial commit", oid, []); + "initial commit", oid, parents); }) .then(function(commitOid) { return repository.getCommit(commitOid); @@ -38,14 +48,15 @@ var RepositorySetup = { }, createRepository: - function createRepository(repoPath){ + function createRepository(repoPath, isBare){ // Create a new repository in a clean directory return fse.remove(repoPath) .then(function() { return fse.ensureDir(repoPath); }) .then(function() { - return NodeGit.Repository.init(repoPath, 0); + var bare = typeof isBare !== "undefined" ? isBare : 0; + return NodeGit.Repository.init(repoPath, bare); }); }, diff --git a/test/utils/worker.js b/test/utils/worker.js new file mode 100644 index 0000000000..6f2d218408 --- /dev/null +++ b/test/utils/worker.js @@ -0,0 +1,38 @@ +const { + isMainThread, + parentPort, + workerData +} = require("worker_threads"); +const assert = require("assert"); +const NodeGit = require("../../"); + +if (isMainThread) { + throw new Error("Must be run via worker thread"); +} + +parentPort.postMessage("init"); + +const { clonePath, url } = workerData; +const opts = { + fetchOpts: { + callbacks: { + certificateCheck: () => 0 + } + } +}; + +let repository; +return NodeGit.Clone(url, clonePath, opts).then((_repository) => { + repository = _repository; + assert.ok(repository instanceof NodeGit.Repository); + return repository.index(); +}).then((index) => { + assert.ok(index instanceof NodeGit.Index); + return repository.getRemoteNames(); +}).then((remotes) => { + assert.ok(Array.isArray(remotes)); + return repository.getCurrentBranch(); +}).then((branch) => { + assert.ok(branch instanceof NodeGit.Reference); + parentPort.postMessage("success"); +}).catch(() => parentPort.postMessage("failure")); diff --git a/test/utils/worker_checkout.js b/test/utils/worker_checkout.js new file mode 100644 index 0000000000..adfb7aa7c7 --- /dev/null +++ b/test/utils/worker_checkout.js @@ -0,0 +1,51 @@ +const { + isMainThread, + parentPort, + workerData +} = require("worker_threads"); +const assert = require("assert"); +const NodeGit = require("../../"); +const loopingCheckoutHead = require("./loop_checkout.js"); + +if (isMainThread) { + throw new Error("Must be run via worker thread"); +} + +parentPort.postMessage("init"); + +const { clonePath, url } = workerData; +const cloneOpts = { + fetchOpts: { + callbacks: { + certificateCheck: () => 0 + } + } +}; + +let repository; +let filterName = "psuedo_filter"; +let applyCallbackResult = 1; + +return NodeGit.Clone(url, clonePath, cloneOpts) +.then(function(_repository) { + repository = _repository; + assert.ok(repository instanceof NodeGit.Repository); + return NodeGit.FilterRegistry.register(filterName, { + apply: function() { + applyCallbackResult = 0; + }, + check: function() { + return NodeGit.Error.CODE.OK; + } + }, 0); +}) +.then(function(result) { + assert.strictEqual(result, NodeGit.Error.CODE.OK); + return loopingCheckoutHead(clonePath, repository, 0); +}).then(function() { + assert.strictEqual(applyCallbackResult, 0); + parentPort.postMessage("success"); +}) +.catch((err) => { + parentPort.postMessage("failure"); +}); \ No newline at end of file diff --git a/test/utils/worker_context_aware.js b/test/utils/worker_context_aware.js new file mode 100644 index 0000000000..b7784fdaef --- /dev/null +++ b/test/utils/worker_context_aware.js @@ -0,0 +1,74 @@ +const { + isMainThread, + parentPort, + workerData +} = require("worker_threads"); +const garbageCollect = require("./garbage_collect.js"); +const assert = require("assert"); +const NodeGit = require("../../"); +const { promisify } = require("util"); + +if (isMainThread) { + throw new Error("Must be run via worker thread"); +} + +const { clonePath, url } = workerData; +const opts = { + fetchOpts: { + callbacks: { + certificateCheck: () => 0 + } + } +}; + +let repository; +const oid = "fce88902e66c72b5b93e75bdb5ae717038b221f6"; + +return NodeGit.Clone(url, clonePath, opts) +.then((_repository) => { + repository = _repository; + assert.ok(repository instanceof NodeGit.Repository); + return repository.getCommit(oid); +}).then((commit) => { + assert.ok(commit instanceof NodeGit.Commit); + var historyCount = 0; + var history = commit.history(); + + history.on("commit", function(commit) { + // Number of commits is known to be higher than 200 + if (++historyCount == 200) { + // Tracked objects must work too when the Garbage Collector is triggered + garbageCollect(); + + // Count total of objects left after being created/destroyed + const freeingCount = + NodeGit.Cert.getNonSelfFreeingConstructedCount() + + NodeGit.Repository.getSelfFreeingInstanceCount() + + NodeGit.Commit.getSelfFreeingInstanceCount() + + NodeGit.Oid.getSelfFreeingInstanceCount() + + NodeGit.Revwalk.getSelfFreeingInstanceCount(); + + const numberOfTrackedObjects = NodeGit.getNumberOfTrackedObjects(); + + if (freeingCount === numberOfTrackedObjects) { + parentPort.postMessage("numbersMatch"); + } + else { + parentPort.postMessage("numbersDoNotMatch"); + } + } + }); + + history.on("end", function(commits) { + // Test should not get this far + parentPort.postMessage("failure"); + }); + + history.on("error", function(err) { + assert.ok(false); + }); + + history.start(); + + return promisify(setTimeout)(50000); +}).catch(() => parentPort.postMessage("failure")); \ No newline at end of file diff --git a/test/utils/worker_context_aware_checkout.js b/test/utils/worker_context_aware_checkout.js new file mode 100644 index 0000000000..6562915a49 --- /dev/null +++ b/test/utils/worker_context_aware_checkout.js @@ -0,0 +1,66 @@ +const { + isMainThread, + parentPort, + workerData +} = require("worker_threads"); +const garbageCollect = require("./garbage_collect.js"); +const assert = require("assert"); +const NodeGit = require("../../"); +const loopingCheckoutHead = require("./loop_checkout.js"); +const { promisify } = require("util"); + +if (isMainThread) { + throw new Error("Must be run via worker thread"); +} + +const { clonePath, url } = workerData; +const cloneOpts = { + fetchOpts: { + callbacks: { + certificateCheck: () => 0 + } + } +}; + +let repository; +let filterName = "psuedo_filter"; +let applyCallbackResult = 1; + +return NodeGit.Clone(url, clonePath, cloneOpts) +.then(function(_repository) { + repository = _repository; + assert.ok(repository instanceof NodeGit.Repository); + return NodeGit.FilterRegistry.register(filterName, { + apply: function() { + applyCallbackResult = 0; + }, + check: function() { + return NodeGit.Error.CODE.OK; + } + }, 0); +}) +.then(function(result) { + assert.strictEqual(result, NodeGit.Error.CODE.OK); + return loopingCheckoutHead(clonePath, repository, 10); +}).then(function() { + assert.strictEqual(applyCallbackResult, 0); + // Tracked objects must work too when the Garbage Collector is triggered + garbageCollect(); + + // Count total of objects left after being created/destroyed + const freeingCount = + NodeGit.Cert.getNonSelfFreeingConstructedCount() + + NodeGit.FilterSource.getNonSelfFreeingConstructedCount() + + NodeGit.Buf.getNonSelfFreeingConstructedCount() + + NodeGit.Repository.getSelfFreeingInstanceCount(); + + const numberOfTrackedObjects = NodeGit.getNumberOfTrackedObjects(); + + if (freeingCount === numberOfTrackedObjects) { + parentPort.postMessage("numbersMatch"); + } + else { + parentPort.postMessage("numbersDoNotMatch"); + } + return promisify(setTimeout)(50000); +}).catch((err) => parentPort.postMessage("failure")); \ No newline at end of file diff --git a/utils/README.md b/utils/README.md new file mode 100644 index 0000000000..cf046f05b8 --- /dev/null +++ b/utils/README.md @@ -0,0 +1,9 @@ +## /utils + + Contains utilities for NodeGit + + #### buildFlags + Determines how NodeGit should build. Use `BUILD_ONLY` environment variable to build from source. + + ## acquireOpenSSL + Download and compile OpenSSL. diff --git a/utils/acquireOpenSSL.mjs b/utils/acquireOpenSSL.mjs new file mode 100644 index 0000000000..930b5ab33c --- /dev/null +++ b/utils/acquireOpenSSL.mjs @@ -0,0 +1,488 @@ +import crypto from "crypto"; +import { spawn } from "child_process"; +import execPromise from "./execPromise.js"; +import got from "got"; +import path from "path"; +import stream from "stream"; +import tar from "tar-fs"; +import zlib from "zlib"; +import { createWriteStream, promises as fs } from "fs"; +import { performance } from "perf_hooks"; +import { promisify } from "util"; + +import { hostArch, targetArch } from "./buildFlags.js"; + +const pipeline = promisify(stream.pipeline); + +import packageJson from '../package.json' with { type: "json" }; + +const OPENSSL_VERSION = "3.0.18"; +const win32BatPath = path.join(import.meta.dirname, "build-openssl.bat"); +const vendorPath = path.resolve(import.meta.dirname, "..", "vendor"); +const opensslPatchPath = path.join(vendorPath, "patches", "openssl"); +const extractPath = path.join(vendorPath, "openssl"); + +const exists = (filePath) => fs.stat(filePath).then(() => true).catch(() => false); + +const pathsToIncludeForPackage = [ + "include", "lib" +]; + +const getOpenSSLSourceUrl = (version) => `https://www.openssl.org/source/openssl-${version}.tar.gz`; +const getOpenSSLSourceSha256Url = (version) => `${getOpenSSLSourceUrl(version)}.sha256`; + +class HashVerify extends stream.Transform { + constructor(algorithm, onFinal) { + super(); + this.onFinal = onFinal; + this.hash = crypto.createHash(algorithm); + } + + _transform(chunk, encoding, callback) { + this.hash.update(chunk, encoding); + callback(null, chunk); + } + + _final(callback) { + const digest = this.hash.digest("hex"); + const onFinalResult = this.onFinal(digest); + callback(onFinalResult); + } +} + +const makeHashVerifyOnFinal = (expected) => (digest) => { + const digestOk = digest === expected; + return digestOk + ? null + : new Error(`Digest not OK: ${digest} !== ${this.expected}`); +}; + +// currently this only needs to be done on linux +const applyOpenSSLPatches = async (buildCwd, operatingSystem) => { + try { + await fs.access(opensslPatchPath); + + for (const patchFilename of await fs.readdir(opensslPatchPath)) { + const patchTarget = patchFilename.split("-")[1]; + if (patchFilename.split(".").pop() === "patch" && (patchTarget === operatingSystem || patchTarget === "all")) { + console.log(`applying ${patchFilename}`); + await execPromise(`patch -up0 -i ${path.join(opensslPatchPath, patchFilename)}`, { + cwd: buildCwd + }, { pipeOutput: true }); + } + } + } catch(e) { + if (e.code === "ENOENT") { + // no patches to apply + return; + } + + console.log("Patch application failed: ", e); + throw e; + } +} + +const buildDarwin = async (buildCwd, macOsDeploymentTarget) => { + if (!macOsDeploymentTarget) { + throw new Error("Expected macOsDeploymentTarget to be specified"); + } + + const buildConfig = targetArch === "x64" ? "darwin64-x86_64-cc" : "darwin64-arm64-cc"; + + const configureArgs = [ + buildConfig, + // speed up ecdh on little-endian platforms with 128bit int support + "enable-ec_nistp_64_gcc_128", + // compile static libraries + "no-shared", + // disable ssl2, ssl3, and compression + "no-ssl2", + "no-ssl3", + "no-comp", + // disable tty ui since it fails a bunch of tests on GHA runners and we're just gonna link anyways + "no-ui-console", + // set install directory + `--prefix="${extractPath}"`, + `--openssldir="${extractPath}"`, + // set macos version requirement + `-mmacosx-version-min=${macOsDeploymentTarget}` + ]; + + await execPromise(`./Configure ${configureArgs.join(" ")}`, { + cwd: buildCwd + }, { pipeOutput: true }); + + await applyOpenSSLPatches(buildCwd, "darwin"); + + // only build the libraries, not the fuzzer or apps + await execPromise("make build_libs", { + cwd: buildCwd + }, { pipeOutput: true }); + + await execPromise("make test", { + cwd: buildCwd + }, { pipeOutput: true }); + + await execPromise("make install_sw", { + cwd: buildCwd, + maxBuffer: 10 * 1024 * 1024 // we should really just use spawn + }, { pipeOutput: true }); +}; + +const buildLinux = async (buildCwd) => { + const buildConfig = targetArch === "x64" ? "linux-x86_64" : "linux-aarch64"; + + const configureArgs = [ + buildConfig, + // disable ssl3, and compression + "no-ssl3", + "no-comp", + // set install directory + `--prefix="${extractPath}"`, + `--openssldir="${extractPath}"`, + "--libdir=lib", + ]; + await execPromise(`./Configure ${configureArgs.join(" ")}`, { + cwd: buildCwd + }, { pipeOutput: true }); + + await applyOpenSSLPatches(buildCwd, "linux"); + + // only build the libraries, not the fuzzer or apps + await execPromise("make build_libs", { + cwd: buildCwd, + maxBuffer: 10 * 1024 * 1024 + }, { pipeOutput: true }); + + if (hostArch === targetArch) { + await execPromise("make test", { + cwd: buildCwd, + maxBuffer: 10 * 1024 * 1024 + }, { pipeOutput: true }); + } + + // only install software, not the docs + await execPromise("make install_sw", { + cwd: buildCwd, + maxBuffer: 10 * 1024 * 1024 // we should really just use spawn + }, { pipeOutput: true }); +}; + +const buildWin32 = async (buildCwd) => { + let vcvarsallPath = undefined; + + if (process.env.npm_config_vcvarsall_path && await exists(process.env.npm_config_vcvarsall_path)) { + vcvarsallPath = process.env.npm_config_vcvarsall_path; + } else { + const potentialMsvsPaths = []; + + // GYP_MSVS_OVERRIDE_PATH is set by node-gyp so this should cover most cases + if (process.env.GYP_MSVS_OVERRIDE_PATH) { + potentialMsvsPaths.push(process.env.GYP_MSVS_OVERRIDE_PATH); + } + + const packageTypes = ["BuildTools", "Community", "Professional", "Enterprise"]; + const versions = ["2022", "2019"] + + const computePossiblePaths = (parentPath) => { + let possiblePaths = [] + for (const packageType of packageTypes) { + for (const version of versions) { + possiblePaths.push(path.join(parentPath, version, packageType)); + } + } + + return possiblePaths; + } + + if (process.env["ProgramFiles(x86)"]) { + const parentPath = path.join(process.env["ProgramFiles(x86)"], 'Microsoft Visual Studio'); + potentialMsvsPaths.push(...computePossiblePaths(parentPath)); + } + + if (process.env.ProgramFiles) { + const parentPath = path.join(process.env.ProgramFiles, 'Microsoft Visual Studio'); + potentialMsvsPaths.push(...computePossiblePaths(parentPath)); + } + + for (const potentialPath of potentialMsvsPaths) { + const wholePath = path.join(potentialPath, 'VC', 'Auxiliary', 'Build', 'vcvarsall.bat'); + console.log("checking", wholePath); + if (await exists(wholePath)) { + vcvarsallPath = wholePath; + break; + } + } + + if (!vcvarsallPath) { + throw new Error(`vcvarsall.bat not found`); + } + } + + let vcTarget; + switch (targetArch) { + case "x64": + vcTarget = "VC-WIN64A"; + break; + + case "x86": + vcTarget = "VC-WIN32"; + break; + + case "arm64": + vcTarget = "VC-WIN64-ARM"; + break; + } + + let vsBuildArch = hostArch === targetArch + ? hostArch + : `${hostArch}_${targetArch}`; + + console.log("Using vcvarsall.bat at: ", vcvarsallPath); + console.log("Using vsBuildArch: ", vsBuildArch); + console.log("Using vcTarget: ", vcTarget); + + await new Promise((resolve, reject) => { + const buildProcess = spawn(`"${win32BatPath}" "${vcvarsallPath}" ${vsBuildArch} ${vcTarget}`, { + cwd: buildCwd, + shell: process.platform === "win32", + env: { + ...process.env, + NODEGIT_SKIP_TESTS: targetArch !== hostArch ? "1" : undefined + } + }); + + buildProcess.stdout.on("data", function(data) { + console.info(data.toString().trim()); + }); + + buildProcess.stderr.on("data", function(data) { + console.error(data.toString().trim()); + }); + + buildProcess.on("close", function(code) { + if (!code) { + resolve(); + } else { + reject(code); + } + }); + }); + + +}; + +const removeOpenSSLIfOudated = async (openSSLVersion) => { + try { + let openSSLResult; + try { + const openSSLPath = path.join(extractPath, "bin", "openssl"); + openSSLResult = await execPromise(`${openSSLPath} version`); + } catch { + /* if we fail to get the version, assume removal not required */ + } + + if (!openSSLResult) { + return; + } + + const versionMatch = openSSLResult.match(/^OpenSSL (\d\.\d\.\d[a-z]*)/); + const installedVersion = versionMatch && versionMatch[1]; + if (!installedVersion || installedVersion === openSSLVersion) { + return; + } + + console.log("Removing outdated OpenSSL at: ", extractPath); + await fs.rm(extractPath, { recursive: true, force: true }); + console.log("Outdated OpenSSL removed."); + } catch (err) { + console.log("Remove outdated OpenSSL failed: ", err); + } +}; + +const makeOnStreamDownloadProgress = () => { + let lastReport = performance.now(); + return ({ percent, transferred, total }) => { + const currentTime = performance.now(); + if (currentTime - lastReport > 1 * 1000) { + lastReport = currentTime; + console.log(`progress: ${transferred}/${total} (${(percent * 100).toFixed(2)}%)`) + } + }; +}; + +const buildOpenSSLIfNecessary = async ({ + macOsDeploymentTarget, + openSSLVersion +}) => { + if (process.platform !== "darwin" && process.platform !== "win32" && process.platform !== "linux") { + console.log(`Skipping OpenSSL build, not required on ${process.platform}`); + return; + } + + await removeOpenSSLIfOudated(openSSLVersion); + + try { + await fs.stat(extractPath); + console.log("Skipping OpenSSL build, dir exists"); + return; + } catch {} + + const openSSLUrl = getOpenSSLSourceUrl(openSSLVersion); + const openSSLSha256Url = getOpenSSLSourceSha256Url(openSSLVersion); + + const openSSLSha256 = (await got(openSSLSha256Url)).body.trim().split(' ')[0]; + + const downloadStream = got.stream(openSSLUrl); + downloadStream.on("downloadProgress", makeOnStreamDownloadProgress()); + + await pipeline( + downloadStream, + new HashVerify("sha256", makeHashVerifyOnFinal(openSSLSha256)), + zlib.createGunzip(), + tar.extract(extractPath) + ); + + console.log(`OpenSSL ${openSSLVersion} download + extract complete: SHA256 OK.`); + + const buildCwd = path.join(extractPath, `openssl-${openSSLVersion}`); + + if (process.platform === "darwin") { + await buildDarwin(buildCwd, macOsDeploymentTarget); + } else if (process.platform === "linux") { + await buildLinux(buildCwd); + } else if (process.platform === "win32") { + await buildWin32(buildCwd); + } else { + throw new Error(`Unknown platform: ${process.platform}`); + } + + console.log("Build finished."); +} + +const downloadOpenSSLIfNecessary = async ({ + downloadBinUrl, + maybeDownloadSha256, + maybeDownloadSha256Url +}) => { + if (process.platform !== "darwin" && process.platform !== "win32" && process.platform !== "linux") { + console.log(`Skipping OpenSSL download, not required on ${process.platform}`); + return; + } + + try { + await fs.stat(extractPath); + console.log("Skipping OpenSSL download, dir exists"); + return; + } catch {} + + if (maybeDownloadSha256Url) { + maybeDownloadSha256 = (await got(maybeDownloadSha256Url)).body.trim(); + } + + const downloadStream = got.stream(downloadBinUrl); + downloadStream.on("downloadProgress", makeOnStreamDownloadProgress()); + + const pipelineSteps = [ + downloadStream, + maybeDownloadSha256 + ? new HashVerify("sha256", makeHashVerifyOnFinal(maybeDownloadSha256)) + : null, + zlib.createGunzip(), + tar.extract(extractPath) + ].filter(step => step !== null); + await pipeline( + ...pipelineSteps + ); + + console.log(`OpenSSL download + extract complete${maybeDownloadSha256 ? ": SHA256 OK." : "."}`); + console.log("Download finished."); +} + +export const getOpenSSLPackageName = () => { + return `openssl-${OPENSSL_VERSION}-${process.platform}-${targetArch}.tar.gz`; +} + +export const getOpenSSLPackagePath = () => path.join(import.meta.dirname, getOpenSSLPackageName()); + +const getOpenSSLPackageUrl = () => { + const hostUrl = new URL(packageJson.binary.host); + hostUrl.pathname = getOpenSSLPackageName(); + return hostUrl.toString(); +}; + +const buildPackage = async () => { + let resolve, reject; + const promise = new Promise((_resolve, _reject) => { + resolve = _resolve; + reject = _reject; + }); + await pipeline( + tar.pack(extractPath, { + entries: pathsToIncludeForPackage, + ignore: (name) => { + // Ignore pkgconfig files + return path.extname(name) === ".pc" + || path.basename(name) === "pkgconfig"; + }, + dmode: 0o0755, + fmode: 0o0644 + }), + zlib.createGzip(), + new HashVerify("sha256", (digest) => { + resolve(digest); + }), + createWriteStream(getOpenSSLPackagePath()) + ); + const digest = await promise; + await fs.writeFile(`${getOpenSSLPackagePath()}.sha256`, digest); +}; + +const acquireOpenSSL = async () => { + try { + const downloadBinUrl = process.env.npm_config_openssl_bin_url + || (['win32', 'darwin'].includes(process.platform) ? getOpenSSLPackageUrl() : undefined); + if (downloadBinUrl && downloadBinUrl !== 'skip' && !process.env.NODEGIT_OPENSSL_BUILD_PACKAGE) { + const downloadOptions = { downloadBinUrl }; + if (process.env.npm_config_openssl_bin_sha256 !== 'skip') { + if (process.env.npm_config_openssl_bin_sha256) { + downloadOptions.maybeDownloadSha256 = process.env.npm_config_openssl_bin_sha256; + } else { + downloadOptions.maybeDownloadSha256Url = `${getOpenSSLPackageUrl()}.sha256`; + } + } + + await downloadOpenSSLIfNecessary(downloadOptions); + return; + } + + let macOsDeploymentTarget; + if (process.platform === "darwin") { + macOsDeploymentTarget = process.argv[2] ?? process.env.OPENSSL_MACOS_DEPLOYMENT_TARGET + if (!macOsDeploymentTarget || !macOsDeploymentTarget.match(/\d+\.\d+/)) { + throw new Error(`Invalid macOsDeploymentTarget: ${macOsDeploymentTarget}`); + } + } + + await buildOpenSSLIfNecessary({ + openSSLVersion: OPENSSL_VERSION, + macOsDeploymentTarget + }); + if (process.env.NODEGIT_OPENSSL_BUILD_PACKAGE) { + await buildPackage(); + } + } catch (err) { + console.error("Acquire failed: ", err); + process.exit(1); + } +}; + +if (process.argv[1] === import.meta.filename) { + try { + await acquireOpenSSL(); + } + catch(error) { + console.error("Acquire OpenSSL failed: ", error); + process.exit(1); + } +} diff --git a/utils/build-openssl.bat b/utils/build-openssl.bat new file mode 100644 index 0000000000..af8063d7c4 --- /dev/null +++ b/utils/build-openssl.bat @@ -0,0 +1,22 @@ +rem Build OpenSSL for Windows +rem %1 - path to vcvarsall.bat +rem %2 - architecture argument for vcvarsall.bat +rem %3 - OpenSSL Configure target + +@call %1 %2 + +perl .\Configure %3 no-shared no-ssl2 no-ssl3 no-comp --prefix="%cd%\.." --openssldir="%cd%\.." || goto :error + +nmake || goto :error + +if "%NODEGIT_SKIP_TESTS%" NEQ "1" ( + nmake test || goto :error +) + +nmake install || goto :error + +goto :EOF + +:error +echo Failed with error #%errorlevel%. +exit /b %errorlevel% \ No newline at end of file diff --git a/utils/buildFlags.js b/utils/buildFlags.js new file mode 100644 index 0000000000..7ea87428ba --- /dev/null +++ b/utils/buildFlags.js @@ -0,0 +1,41 @@ +var fs = require("fs"); +var path = require("path"); + +var isGitRepo; + +try { + fs.statSync(path.join(__dirname, "..", ".git")); + isGitRepo = true; +} catch (e) { + isGitRepo = false; +} + +const convertArch = (archStr) => { + const convertedArch = { + 'ia32': 'x86', + 'x86': 'x86', + 'x64': 'x64', + 'arm64': 'arm64' + }[archStr]; + + if (!convertedArch) { + throw new Error('unsupported architecture'); + } + + return convertedArch; +} + +const hostArch = convertArch(process.arch); +const targetArch = process.env.npm_config_arch + ? convertArch(process.env.npm_config_arch) + : hostArch; + +module.exports = { + hostArch, + targetArch, + debugBuild: !!process.env.BUILD_DEBUG, + isElectron: process.env.npm_config_runtime === "electron", + isGitRepo: isGitRepo, + isNwjs: process.env.npm_config_runtime === "node-webkit", + mustBuild: !!(isGitRepo || process.env.BUILD_DEBUG || process.env.BUILD_ONLY) +}; diff --git a/utils/configureLibssh2.js b/utils/configureLibssh2.js new file mode 100644 index 0000000000..95fd5d3649 --- /dev/null +++ b/utils/configureLibssh2.js @@ -0,0 +1,57 @@ +var cp = require("child_process"); +var fse = require("fs-extra"); +var path = require("path"); + +const { hostArch, targetArch } = require("./buildFlags"); + +const opensslVendorDirectory = path.resolve(__dirname, "..", "vendor", "openssl"); +const libssh2VendorDirectory = path.resolve(__dirname, "..", "vendor", "libssh2"); +const libssh2ConfigureScript = path.join(libssh2VendorDirectory, "configure"); +const libssh2StaticConfigDirectory = path.resolve(__dirname, "..", "vendor", "static_config", "libssh2"); + +module.exports = function retrieveExternalDependencies() { + console.info("[nodegit] Configuring libssh2."); + + // Copy Windows / Mac preconfigured files + if (process.platform === "win32" || process.platform === "darwin") { + return fse.copy( + path.join(libssh2StaticConfigDirectory, process.platform), + path.join(libssh2VendorDirectory, "src") + ); + } + + // Run the `configure` script on Linux + let cpArgs = ` --with-libssl-prefix=${opensslVendorDirectory}`; + + const archConfigMap = { + 'x64': 'x86_64-linux-gnu', + 'arm64': 'aarch64-linux-gnu' + }; + + cpArgs += ` --build=${archConfigMap[hostArch]}`; + cpArgs += ` --host=${archConfigMap[targetArch]}`; + + return new Promise(function(resolve, reject) { + cp.exec( + `${libssh2ConfigureScript}${cpArgs}`, + { + cwd: libssh2VendorDirectory + }, + function(err, stdout, stderr) { + if (err) { + console.error(err); + console.error(stderr); + reject(err, stderr); + } + else { + resolve(stdout); + } + } + ); + }); +}; + +// Called on the command line +if (require.main === module) { + module.exports(); +} diff --git a/utils/defaultCxxStandard.js b/utils/defaultCxxStandard.js new file mode 100644 index 0000000000..5a7d7beb5a --- /dev/null +++ b/utils/defaultCxxStandard.js @@ -0,0 +1,24 @@ +const targetSpecified = process.argv[2] !== 'none'; + +let cxxStandard = '14'; + +if (targetSpecified) { + // Assume electron if target is specified. + // If building node 18 / 19 via target, will need to specify C++ standard manually + const majorVersion = process.argv[2].split('.')[0]; + if (Number.parseInt(majorVersion) >= 32) { + cxxStandard = '20'; + } else if (Number.parseInt(majorVersion) >= 21) { + cxxStandard = '17'; + } +} else { + const abiVersion = Number.parseInt(process.versions.modules) ?? 0; + // Node 18 === 108 + if (abiVersion >= 131) { + cxxStandard = '20'; + } else if (abiVersion >= 108) { + cxxStandard = '17'; + } +} + +process.stdout.write(cxxStandard); diff --git a/utils/execPromise.js b/utils/execPromise.js new file mode 100644 index 0000000000..acdc785ec6 --- /dev/null +++ b/utils/execPromise.js @@ -0,0 +1,24 @@ +var cp = require('child_process'); + +// We have to manually promisify this because at this is required in lifecycle +// methods and we are not guaranteed that any 3rd party packages are installed +// at this point +module.exports = function(command, opts, extraOpts = {}) { + return new Promise(function(resolve, reject) { + const childProcess = cp.exec(command, opts, function(err, result) { + if (err) { + reject(err); + } + else { + resolve(result); + } + }); + + if (extraOpts.pipeOutput) { + childProcess.stdout.pipe(process.stdout); + childProcess.stderr.pipe(process.stderr); + } + + return childProcess; + }); +}; diff --git a/utils/getElectronOpenSSLRoot.js b/utils/getElectronOpenSSLRoot.js new file mode 100644 index 0000000000..a8ccc09b7b --- /dev/null +++ b/utils/getElectronOpenSSLRoot.js @@ -0,0 +1,10 @@ +const path = require("path"); + +if (process.argv.length < 3) { + process.exit(1); +} + +const [, , moduleRootDir] = process.argv; + +const openSSLRoot = process.env.npm_config_openssl_dir || path.join(moduleRootDir, 'vendor', 'openssl'); +process.stdout.write(openSSLRoot); diff --git a/utils/gitExecutableLocation.js b/utils/gitExecutableLocation.js new file mode 100644 index 0000000000..48316510f6 --- /dev/null +++ b/utils/gitExecutableLocation.js @@ -0,0 +1,23 @@ +var cp = require("child_process"); + +module.exports = function gitExecutableLocation() { + return new Promise(function(resolve, reject) { + var cmd; + + if (process.platform === "win32") { + cmd = "where git"; + } + else { + cmd = "which git"; + } + + cp.exec(cmd, function(err, stdout, stderr) { + if (err) { + reject(err, stderr); + } + else { + resolve(stdout); + } + }); + }); +}; diff --git a/utils/isBuildingForElectron.js b/utils/isBuildingForElectron.js new file mode 100644 index 0000000000..295f6ab1fb --- /dev/null +++ b/utils/isBuildingForElectron.js @@ -0,0 +1,30 @@ +const fs = require("fs") +const JSON5 = require("json5"); +const path = require("path"); + +if (process.argv.length < 3) { + process.exit(1); +} + +const last = arr => arr[arr.length - 1]; +const [, , nodeRootDir] = process.argv; + +let isElectron = last(nodeRootDir.split(path.sep)).startsWith("iojs"); + +if (!isElectron) { + try { + // Not ideal, would love it if there were a full featured gyp package to do this operation instead. + const { variables: { built_with_electron } } = JSON5.parse( + fs.readFileSync( + path.resolve(nodeRootDir, "include", "node", "config.gypi"), + "utf8" + ) + ); + + if (built_with_electron) { + isElectron = true; + } + } catch (e) {} +} + +process.stdout.write(isElectron ? "1" : "0"); diff --git a/utils/retry.js b/utils/retry.js new file mode 100644 index 0000000000..c7a57fb065 --- /dev/null +++ b/utils/retry.js @@ -0,0 +1,51 @@ +const { spawn } = require('child_process'); + +const [, , cmd, ...args] = process.argv; +if (!cmd) { + process.exit(-1); +} + +const once = (fn) => { + let runOnce = false; + return (...args) => { + if (runOnce) { + return; + } + + runOnce = true; + fn(...args); + } +}; + +const retry = (numRetries = 3) => { + const child = spawn(cmd, args, { + shell: process.platform === 'win32', + stdio: [0, 'pipe', 'pipe'] + }); + + child.setMaxListeners(0); + + child.stdout.setEncoding('utf8'); + child.stderr.setEncoding('utf8'); + + child.stdout.pipe(process.stdout); + child.stderr.pipe(process.stderr); + + const cleanupAndExit = once((error, status) => { + child.kill(); + if (numRetries > 0 && (error || status !== 0)) { + retry(numRetries - 1); + } else if (error) { + console.log(error); + process.exit(-1); + } else { + process.exit(status); + } + }); + const onClose = status => cleanupAndExit(null, status); + + child.on('close', onClose); + child.on('error', cleanupAndExit); +}; + +retry(); diff --git a/utils/uploadOpenSSL.mjs b/utils/uploadOpenSSL.mjs new file mode 100644 index 0000000000..5de760462e --- /dev/null +++ b/utils/uploadOpenSSL.mjs @@ -0,0 +1,32 @@ +import aws from 'aws-sdk'; +import fs from "fs"; +import path from "path"; + +import pkgJson from '../package.json' with { type: "json" }; +import { getOpenSSLPackagePath, getOpenSSLPackageName } from './acquireOpenSSL.mjs'; + +const s3 = new aws.S3(); + +const uploadBinaryToS3 = (fileName, bucketName, pathToFile) => + s3.upload({ + Body: fs.createReadStream(pathToFile), + Bucket: bucketName, + Key: fileName, + ACL: "public-read" + }).promise(); + +export const uploadOpenSSL = async () => { + const packageName = path.basename(getOpenSSLPackageName()); + const packagePath = getOpenSSLPackagePath(); + console.log(`Uploading ${packagePath} to s3://${pkgJson.binary.bucket_name}/${packageName}`); + await uploadBinaryToS3(packageName, pkgJson.binary.bucket_name, packagePath); + const sha256PackageName = `${packageName}.sha256`; + await uploadBinaryToS3(sha256PackageName, pkgJson.binary.bucket_name, `${packagePath}.sha256`); +}; + +if (process.argv[1] === import.meta.filename) { + uploadOpenSSL().catch((error) => { + console.error('Push to S3 failed: ', error); + process.exit(1); + }); +} diff --git a/vendor/http_parser b/vendor/http_parser new file mode 160000 index 0000000000..39c2c1e573 --- /dev/null +++ b/vendor/http_parser @@ -0,0 +1 @@ +Subproject commit 39c2c1e5733eb2cb7397a370cf50508ea1214bf7 diff --git a/vendor/http_parser/.gitignore b/vendor/http_parser/.gitignore deleted file mode 100644 index 32cb51b2d3..0000000000 --- a/vendor/http_parser/.gitignore +++ /dev/null @@ -1,28 +0,0 @@ -/out/ -core -tags -*.o -test -test_g -test_fast -bench -url_parser -parsertrace -parsertrace_g -*.mk -*.Makefile -*.so.* -*.a - - -# Visual Studio uglies -*.suo -*.sln -*.vcxproj -*.vcxproj.filters -*.vcxproj.user -*.opensdf -*.ncrunchsolution* -*.sdf -*.vsp -*.psess diff --git a/vendor/http_parser/.mailmap b/vendor/http_parser/.mailmap deleted file mode 100644 index 278d141263..0000000000 --- a/vendor/http_parser/.mailmap +++ /dev/null @@ -1,8 +0,0 @@ -# update AUTHORS with: -# git log --all --reverse --format='%aN <%aE>' | perl -ne 'BEGIN{print "# Authors ordered by first contribution.\n"} print unless $h{$_}; $h{$_} = 1' > AUTHORS -Ryan Dahl -Salman Haq -Simon Zimmermann -Thomas LE ROUX LE ROUX Thomas -Thomas LE ROUX Thomas LE ROUX -Fedor Indutny diff --git a/vendor/http_parser/.travis.yml b/vendor/http_parser/.travis.yml deleted file mode 100644 index 4b038e6e62..0000000000 --- a/vendor/http_parser/.travis.yml +++ /dev/null @@ -1,13 +0,0 @@ -language: c - -compiler: - - clang - - gcc - -script: - - "make" - -notifications: - email: false - irc: - - "irc.freenode.net#node-ci" diff --git a/vendor/http_parser/AUTHORS b/vendor/http_parser/AUTHORS deleted file mode 100644 index 8e2df1d06e..0000000000 --- a/vendor/http_parser/AUTHORS +++ /dev/null @@ -1,67 +0,0 @@ -# Authors ordered by first contribution. -Ryan Dahl -Jeremy Hinegardner -Sergey Shepelev -Joe Damato -tomika -Phoenix Sol -Cliff Frey -Ewen Cheslack-Postava -Santiago Gala -Tim Becker -Jeff Terrace -Ben Noordhuis -Nathan Rajlich -Mark Nottingham -Aman Gupta -Tim Becker -Sean Cunningham -Peter Griess -Salman Haq -Cliff Frey -Jon Kolb -Fouad Mardini -Paul Querna -Felix GeisendoĚrfer -koichik -Andre Caron -Ivo Raisr -James McLaughlin -David Gwynne -Thomas LE ROUX -Randy Rizun -Andre Louis Caron -Simon Zimmermann -Erik Dubbelboer -Martell Malone -Bertrand Paquet -BogDan Vatra -Peter Faiman -Corey Richardson -TĂłth Tamás -Cam Swords -Chris Dickinson -Uli Köhler -Charlie Somerville -Patrik Stutz -Fedor Indutny -runner -Alexis Campailla -David Wragg -Vinnie Falco -Alex Butum -Rex Feng -Alex Kocharin -Mark Koopman -Helge HeĂź -Alexis La Goutte -George Miroshnykov -Maciej MaĹ‚ecki -Marc O'Morain -Jeff Pinner -Timothy J Fontaine -Akagi201 -Romain Giraud -Jay Satiro -Arne Steen -Kjell Schubert diff --git a/vendor/http_parser/LICENSE-MIT b/vendor/http_parser/LICENSE-MIT deleted file mode 100644 index 58010b3889..0000000000 --- a/vendor/http_parser/LICENSE-MIT +++ /dev/null @@ -1,23 +0,0 @@ -http_parser.c is based on src/http/ngx_http_parse.c from NGINX copyright -Igor Sysoev. - -Additional changes are licensed under the same terms as NGINX and -copyright Joyent, Inc. and other Node contributors. All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to -deal in the Software without restriction, including without limitation the -rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -sell copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -IN THE SOFTWARE. diff --git a/vendor/http_parser/Makefile b/vendor/http_parser/Makefile deleted file mode 100644 index 373709c667..0000000000 --- a/vendor/http_parser/Makefile +++ /dev/null @@ -1,136 +0,0 @@ -# Copyright Joyent, Inc. and other Node contributors. All rights reserved. -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to -# deal in the Software without restriction, including without limitation the -# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -# sell copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -# IN THE SOFTWARE. - -PLATFORM ?= $(shell sh -c 'uname -s | tr "[A-Z]" "[a-z]"') -SONAME ?= libhttp_parser.so.2.5.0 - -CC?=gcc -AR?=ar - -CPPFLAGS ?= -LDFLAGS ?= - -CPPFLAGS += -I. -CPPFLAGS_DEBUG = $(CPPFLAGS) -DHTTP_PARSER_STRICT=1 -CPPFLAGS_DEBUG += $(CPPFLAGS_DEBUG_EXTRA) -CPPFLAGS_FAST = $(CPPFLAGS) -DHTTP_PARSER_STRICT=0 -CPPFLAGS_FAST += $(CPPFLAGS_FAST_EXTRA) -CPPFLAGS_BENCH = $(CPPFLAGS_FAST) - -CFLAGS += -Wall -Wextra -Werror -CFLAGS_DEBUG = $(CFLAGS) -O0 -g $(CFLAGS_DEBUG_EXTRA) -CFLAGS_FAST = $(CFLAGS) -O3 $(CFLAGS_FAST_EXTRA) -CFLAGS_BENCH = $(CFLAGS_FAST) -Wno-unused-parameter -CFLAGS_LIB = $(CFLAGS_FAST) -fPIC - -LDFLAGS_LIB = $(LDFLAGS) -shared - -INSTALL ?= install -PREFIX ?= $(DESTDIR)/usr/local -LIBDIR = $(PREFIX)/lib -INCLUDEDIR = $(PREFIX)/include - -ifneq (darwin,$(PLATFORM)) -# TODO(bnoordhuis) The native SunOS linker expects -h rather than -soname... -LDFLAGS_LIB += -Wl,-soname=$(SONAME) -endif - -test: test_g test_fast - ./test_g - ./test_fast - -test_g: http_parser_g.o test_g.o - $(CC) $(CFLAGS_DEBUG) $(LDFLAGS) http_parser_g.o test_g.o -o $@ - -test_g.o: test.c http_parser.h Makefile - $(CC) $(CPPFLAGS_DEBUG) $(CFLAGS_DEBUG) -c test.c -o $@ - -http_parser_g.o: http_parser.c http_parser.h Makefile - $(CC) $(CPPFLAGS_DEBUG) $(CFLAGS_DEBUG) -c http_parser.c -o $@ - -test_fast: http_parser.o test.o http_parser.h - $(CC) $(CFLAGS_FAST) $(LDFLAGS) http_parser.o test.o -o $@ - -test.o: test.c http_parser.h Makefile - $(CC) $(CPPFLAGS_FAST) $(CFLAGS_FAST) -c test.c -o $@ - -bench: http_parser.o bench.o - $(CC) $(CFLAGS_BENCH) $(LDFLAGS) http_parser.o bench.o -o $@ - -bench.o: bench.c http_parser.h Makefile - $(CC) $(CPPFLAGS_BENCH) $(CFLAGS_BENCH) -c bench.c -o $@ - -http_parser.o: http_parser.c http_parser.h Makefile - $(CC) $(CPPFLAGS_FAST) $(CFLAGS_FAST) -c http_parser.c - -test-run-timed: test_fast - while(true) do time ./test_fast > /dev/null; done - -test-valgrind: test_g - valgrind ./test_g - -libhttp_parser.o: http_parser.c http_parser.h Makefile - $(CC) $(CPPFLAGS_FAST) $(CFLAGS_LIB) -c http_parser.c -o libhttp_parser.o - -library: libhttp_parser.o - $(CC) $(LDFLAGS_LIB) -o $(SONAME) $< - -package: http_parser.o - $(AR) rcs libhttp_parser.a http_parser.o - -url_parser: http_parser.o contrib/url_parser.c - $(CC) $(CPPFLAGS_FAST) $(CFLAGS_FAST) $^ -o $@ - -url_parser_g: http_parser_g.o contrib/url_parser.c - $(CC) $(CPPFLAGS_DEBUG) $(CFLAGS_DEBUG) $^ -o $@ - -parsertrace: http_parser.o contrib/parsertrace.c - $(CC) $(CPPFLAGS_FAST) $(CFLAGS_FAST) $^ -o parsertrace - -parsertrace_g: http_parser_g.o contrib/parsertrace.c - $(CC) $(CPPFLAGS_DEBUG) $(CFLAGS_DEBUG) $^ -o parsertrace_g - -tags: http_parser.c http_parser.h test.c - ctags $^ - -install: library - $(INSTALL) -D http_parser.h $(INCLUDEDIR)/http_parser.h - $(INSTALL) -D $(SONAME) $(LIBDIR)/$(SONAME) - ln -s $(LIBDIR)/$(SONAME) $(LIBDIR)/libhttp_parser.so - -install-strip: library - $(INSTALL) -D http_parser.h $(INCLUDEDIR)/http_parser.h - $(INSTALL) -D -s $(SONAME) $(LIBDIR)/$(SONAME) - ln -s $(LIBDIR)/$(SONAME) $(LIBDIR)/libhttp_parser.so - -uninstall: - rm $(INCLUDEDIR)/http_parser.h - rm $(LIBDIR)/$(SONAME) - rm $(LIBDIR)/libhttp_parser.so - -clean: - rm -f *.o *.a tags test test_fast test_g \ - http_parser.tar libhttp_parser.so.* \ - url_parser url_parser_g parsertrace parsertrace_g - -contrib/url_parser.c: http_parser.h -contrib/parsertrace.c: http_parser.h - -.PHONY: clean package test-run test-run-timed test-valgrind install install-strip uninstall diff --git a/vendor/http_parser/README.md b/vendor/http_parser/README.md deleted file mode 100644 index 7c54dd42d0..0000000000 --- a/vendor/http_parser/README.md +++ /dev/null @@ -1,183 +0,0 @@ -HTTP Parser -=========== - -[![Build Status](https://travis-ci.org/joyent/http-parser.png?branch=master)](https://travis-ci.org/joyent/http-parser) - -This is a parser for HTTP messages written in C. It parses both requests and -responses. The parser is designed to be used in performance HTTP -applications. It does not make any syscalls nor allocations, it does not -buffer data, it can be interrupted at anytime. Depending on your -architecture, it only requires about 40 bytes of data per message -stream (in a web server that is per connection). - -Features: - - * No dependencies - * Handles persistent streams (keep-alive). - * Decodes chunked encoding. - * Upgrade support - * Defends against buffer overflow attacks. - -The parser extracts the following information from HTTP messages: - - * Header fields and values - * Content-Length - * Request method - * Response status code - * Transfer-Encoding - * HTTP version - * Request URL - * Message body - - -Usage ------ - -One `http_parser` object is used per TCP connection. Initialize the struct -using `http_parser_init()` and set the callbacks. That might look something -like this for a request parser: -```c -http_parser_settings settings; -settings.on_url = my_url_callback; -settings.on_header_field = my_header_field_callback; -/* ... */ - -http_parser *parser = malloc(sizeof(http_parser)); -http_parser_init(parser, HTTP_REQUEST); -parser->data = my_socket; -``` - -When data is received on the socket execute the parser and check for errors. - -```c -size_t len = 80*1024, nparsed; -char buf[len]; -ssize_t recved; - -recved = recv(fd, buf, len, 0); - -if (recved < 0) { - /* Handle error. */ -} - -/* Start up / continue the parser. - * Note we pass recved==0 to signal that EOF has been received. - */ -nparsed = http_parser_execute(parser, &settings, buf, recved); - -if (parser->upgrade) { - /* handle new protocol */ -} else if (nparsed != recved) { - /* Handle error. Usually just close the connection. */ -} -``` - -HTTP needs to know where the end of the stream is. For example, sometimes -servers send responses without Content-Length and expect the client to -consume input (for the body) until EOF. To tell http_parser about EOF, give -`0` as the fourth parameter to `http_parser_execute()`. Callbacks and errors -can still be encountered during an EOF, so one must still be prepared -to receive them. - -Scalar valued message information such as `status_code`, `method`, and the -HTTP version are stored in the parser structure. This data is only -temporally stored in `http_parser` and gets reset on each new message. If -this information is needed later, copy it out of the structure during the -`headers_complete` callback. - -The parser decodes the transfer-encoding for both requests and responses -transparently. That is, a chunked encoding is decoded before being sent to -the on_body callback. - - -The Special Problem of Upgrade ------------------------------- - -HTTP supports upgrading the connection to a different protocol. An -increasingly common example of this is the Web Socket protocol which sends -a request like - - GET /demo HTTP/1.1 - Upgrade: WebSocket - Connection: Upgrade - Host: example.com - Origin: http://example.com - WebSocket-Protocol: sample - -followed by non-HTTP data. - -(See http://tools.ietf.org/html/draft-hixie-thewebsocketprotocol-75 for more -information the Web Socket protocol.) - -To support this, the parser will treat this as a normal HTTP message without a -body, issuing both on_headers_complete and on_message_complete callbacks. However -http_parser_execute() will stop parsing at the end of the headers and return. - -The user is expected to check if `parser->upgrade` has been set to 1 after -`http_parser_execute()` returns. Non-HTTP data begins at the buffer supplied -offset by the return value of `http_parser_execute()`. - - -Callbacks ---------- - -During the `http_parser_execute()` call, the callbacks set in -`http_parser_settings` will be executed. The parser maintains state and -never looks behind, so buffering the data is not necessary. If you need to -save certain data for later usage, you can do that from the callbacks. - -There are two types of callbacks: - -* notification `typedef int (*http_cb) (http_parser*);` - Callbacks: on_message_begin, on_headers_complete, on_message_complete. -* data `typedef int (*http_data_cb) (http_parser*, const char *at, size_t length);` - Callbacks: (requests only) on_url, - (common) on_header_field, on_header_value, on_body; - -Callbacks must return 0 on success. Returning a non-zero value indicates -error to the parser, making it exit immediately. - -In case you parse HTTP message in chunks (i.e. `read()` request line -from socket, parse, read half headers, parse, etc) your data callbacks -may be called more than once. Http-parser guarantees that data pointer is only -valid for the lifetime of callback. You can also `read()` into a heap allocated -buffer to avoid copying memory around if this fits your application. - -Reading headers may be a tricky task if you read/parse headers partially. -Basically, you need to remember whether last header callback was field or value -and apply the following logic: - - (on_header_field and on_header_value shortened to on_h_*) - ------------------------ ------------ -------------------------------------------- - | State (prev. callback) | Callback | Description/action | - ------------------------ ------------ -------------------------------------------- - | nothing (first call) | on_h_field | Allocate new buffer and copy callback data | - | | | into it | - ------------------------ ------------ -------------------------------------------- - | value | on_h_field | New header started. | - | | | Copy current name,value buffers to headers | - | | | list and allocate new buffer for new name | - ------------------------ ------------ -------------------------------------------- - | field | on_h_field | Previous name continues. Reallocate name | - | | | buffer and append callback data to it | - ------------------------ ------------ -------------------------------------------- - | field | on_h_value | Value for current header started. Allocate | - | | | new buffer and copy callback data to it | - ------------------------ ------------ -------------------------------------------- - | value | on_h_value | Value continues. Reallocate value buffer | - | | | and append callback data to it | - ------------------------ ------------ -------------------------------------------- - - -Parsing URLs ------------- - -A simplistic zero-copy URL parser is provided as `http_parser_parse_url()`. -Users of this library may wish to use it to parse URLs constructed from -consecutive `on_url` callbacks. - -See examples of reading in headers: - -* [partial example](http://gist.github.com/155877) in C -* [from http-parser tests](http://github.com/joyent/http-parser/blob/37a0ff8/test.c#L403) in C -* [from Node library](http://github.com/joyent/node/blob/842eaf4/src/http.js#L284) in Javascript diff --git a/vendor/http_parser/bench.c b/vendor/http_parser/bench.c deleted file mode 100644 index 5b452fa1cd..0000000000 --- a/vendor/http_parser/bench.c +++ /dev/null @@ -1,111 +0,0 @@ -/* Copyright Fedor Indutny. All rights reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to - * deal in the Software without restriction, including without limitation the - * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - * sell copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS - * IN THE SOFTWARE. - */ -#include "http_parser.h" -#include -#include -#include -#include - -static const char data[] = - "POST /joyent/http-parser HTTP/1.1\r\n" - "Host: github.com\r\n" - "DNT: 1\r\n" - "Accept-Encoding: gzip, deflate, sdch\r\n" - "Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4\r\n" - "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) " - "AppleWebKit/537.36 (KHTML, like Gecko) " - "Chrome/39.0.2171.65 Safari/537.36\r\n" - "Accept: text/html,application/xhtml+xml,application/xml;q=0.9," - "image/webp,*/*;q=0.8\r\n" - "Referer: https://github.com/joyent/http-parser\r\n" - "Connection: keep-alive\r\n" - "Transfer-Encoding: chunked\r\n" - "Cache-Control: max-age=0\r\n\r\nb\r\nhello world\r\n0\r\n\r\n"; -static const size_t data_len = sizeof(data) - 1; - -static int on_info(http_parser* p) { - return 0; -} - - -static int on_data(http_parser* p, const char *at, size_t length) { - return 0; -} - -static http_parser_settings settings = { - .on_message_begin = on_info, - .on_headers_complete = on_info, - .on_message_complete = on_info, - .on_header_field = on_data, - .on_header_value = on_data, - .on_url = on_data, - .on_status = on_data, - .on_body = on_data -}; - -int bench(int iter_count, int silent) { - struct http_parser parser; - int i; - int err; - struct timeval start; - struct timeval end; - float rps; - - if (!silent) { - err = gettimeofday(&start, NULL); - assert(err == 0); - } - - for (i = 0; i < iter_count; i++) { - size_t parsed; - http_parser_init(&parser, HTTP_REQUEST); - - parsed = http_parser_execute(&parser, &settings, data, data_len); - assert(parsed == data_len); - } - - if (!silent) { - err = gettimeofday(&end, NULL); - assert(err == 0); - - fprintf(stdout, "Benchmark result:\n"); - - rps = (float) (end.tv_sec - start.tv_sec) + - (end.tv_usec - start.tv_usec) * 1e-6f; - fprintf(stdout, "Took %f seconds to run\n", rps); - - rps = (float) iter_count / rps; - fprintf(stdout, "%f req/sec\n", rps); - fflush(stdout); - } - - return 0; -} - -int main(int argc, char** argv) { - if (argc == 2 && strcmp(argv[1], "infinite") == 0) { - for (;;) - bench(5000000, 1); - return 0; - } else { - return bench(5000000, 0); - } -} diff --git a/vendor/http_parser/contrib/parsertrace.c b/vendor/http_parser/contrib/parsertrace.c deleted file mode 100644 index e7153680f4..0000000000 --- a/vendor/http_parser/contrib/parsertrace.c +++ /dev/null @@ -1,160 +0,0 @@ -/* Based on src/http/ngx_http_parse.c from NGINX copyright Igor Sysoev - * - * Additional changes are licensed under the same terms as NGINX and - * copyright Joyent, Inc. and other Node contributors. All rights reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to - * deal in the Software without restriction, including without limitation the - * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - * sell copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS - * IN THE SOFTWARE. - */ - -/* Dump what the parser finds to stdout as it happen */ - -#include "http_parser.h" -#include -#include -#include - -int on_message_begin(http_parser* _) { - (void)_; - printf("\n***MESSAGE BEGIN***\n\n"); - return 0; -} - -int on_headers_complete(http_parser* _) { - (void)_; - printf("\n***HEADERS COMPLETE***\n\n"); - return 0; -} - -int on_message_complete(http_parser* _) { - (void)_; - printf("\n***MESSAGE COMPLETE***\n\n"); - return 0; -} - -int on_url(http_parser* _, const char* at, size_t length) { - (void)_; - printf("Url: %.*s\n", (int)length, at); - return 0; -} - -int on_header_field(http_parser* _, const char* at, size_t length) { - (void)_; - printf("Header field: %.*s\n", (int)length, at); - return 0; -} - -int on_header_value(http_parser* _, const char* at, size_t length) { - (void)_; - printf("Header value: %.*s\n", (int)length, at); - return 0; -} - -int on_body(http_parser* _, const char* at, size_t length) { - (void)_; - printf("Body: %.*s\n", (int)length, at); - return 0; -} - -void usage(const char* name) { - fprintf(stderr, - "Usage: %s $type $filename\n" - " type: -x, where x is one of {r,b,q}\n" - " parses file as a Response, reQuest, or Both\n", - name); - exit(EXIT_FAILURE); -} - -int main(int argc, char* argv[]) { - enum http_parser_type file_type; - - if (argc != 3) { - usage(argv[0]); - } - - char* type = argv[1]; - if (type[0] != '-') { - usage(argv[0]); - } - - switch (type[1]) { - /* in the case of "-", type[1] will be NUL */ - case 'r': - file_type = HTTP_RESPONSE; - break; - case 'q': - file_type = HTTP_REQUEST; - break; - case 'b': - file_type = HTTP_BOTH; - break; - default: - usage(argv[0]); - } - - char* filename = argv[2]; - FILE* file = fopen(filename, "r"); - if (file == NULL) { - perror("fopen"); - goto fail; - } - - fseek(file, 0, SEEK_END); - long file_length = ftell(file); - if (file_length == -1) { - perror("ftell"); - goto fail; - } - fseek(file, 0, SEEK_SET); - - char* data = malloc(file_length); - if (fread(data, 1, file_length, file) != (size_t)file_length) { - fprintf(stderr, "couldn't read entire file\n"); - free(data); - goto fail; - } - - http_parser_settings settings; - memset(&settings, 0, sizeof(settings)); - settings.on_message_begin = on_message_begin; - settings.on_url = on_url; - settings.on_header_field = on_header_field; - settings.on_header_value = on_header_value; - settings.on_headers_complete = on_headers_complete; - settings.on_body = on_body; - settings.on_message_complete = on_message_complete; - - http_parser parser; - http_parser_init(&parser, file_type); - size_t nparsed = http_parser_execute(&parser, &settings, data, file_length); - free(data); - - if (nparsed != (size_t)file_length) { - fprintf(stderr, - "Error: %s (%s)\n", - http_errno_description(HTTP_PARSER_ERRNO(&parser)), - http_errno_name(HTTP_PARSER_ERRNO(&parser))); - goto fail; - } - - return EXIT_SUCCESS; - -fail: - fclose(file); - return EXIT_FAILURE; -} diff --git a/vendor/http_parser/contrib/url_parser.c b/vendor/http_parser/contrib/url_parser.c deleted file mode 100644 index 6650b414af..0000000000 --- a/vendor/http_parser/contrib/url_parser.c +++ /dev/null @@ -1,46 +0,0 @@ -#include "http_parser.h" -#include -#include - -void -dump_url (const char *url, const struct http_parser_url *u) -{ - unsigned int i; - - printf("\tfield_set: 0x%x, port: %u\n", u->field_set, u->port); - for (i = 0; i < UF_MAX; i++) { - if ((u->field_set & (1 << i)) == 0) { - printf("\tfield_data[%u]: unset\n", i); - continue; - } - - printf("\tfield_data[%u]: off: %u, len: %u, part: %.*s\n", - i, - u->field_data[i].off, - u->field_data[i].len, - u->field_data[i].len, - url + u->field_data[i].off); - } -} - -int main(int argc, char ** argv) { - struct http_parser_url u; - int len, connect, result; - - if (argc != 3) { - printf("Syntax : %s connect|get url\n", argv[0]); - return 1; - } - len = strlen(argv[2]); - connect = strcmp("connect", argv[1]) == 0 ? 1 : 0; - printf("Parsing %s, connect %d\n", argv[2], connect); - - result = http_parser_parse_url(argv[2], len, connect, &u); - if (result != 0) { - printf("Parse error : %d\n", result); - return result; - } - printf("Parse ok, result : \n"); - dump_url(argv[2], &u); - return 0; -} \ No newline at end of file diff --git a/vendor/http_parser/http_parser.c b/vendor/http_parser/http_parser.c deleted file mode 100644 index 0fa1c36272..0000000000 --- a/vendor/http_parser/http_parser.c +++ /dev/null @@ -1,2429 +0,0 @@ -/* Based on src/http/ngx_http_parse.c from NGINX copyright Igor Sysoev - * - * Additional changes are licensed under the same terms as NGINX and - * copyright Joyent, Inc. and other Node contributors. All rights reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to - * deal in the Software without restriction, including without limitation the - * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - * sell copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS - * IN THE SOFTWARE. - */ -#include "http_parser.h" -#include -#include -#include -#include -#include -#include - -#ifndef ULLONG_MAX -# define ULLONG_MAX ((uint64_t) -1) /* 2^64-1 */ -#endif - -#ifndef MIN -# define MIN(a,b) ((a) < (b) ? (a) : (b)) -#endif - -#ifndef ARRAY_SIZE -# define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0])) -#endif - -#ifndef BIT_AT -# define BIT_AT(a, i) \ - (!!((unsigned int) (a)[(unsigned int) (i) >> 3] & \ - (1 << ((unsigned int) (i) & 7)))) -#endif - -#ifndef ELEM_AT -# define ELEM_AT(a, i, v) ((unsigned int) (i) < ARRAY_SIZE(a) ? (a)[(i)] : (v)) -#endif - -#define SET_ERRNO(e) \ -do { \ - parser->http_errno = (e); \ -} while(0) - -#define CURRENT_STATE() p_state -#define UPDATE_STATE(V) p_state = (enum state) (V); -#define RETURN(V) \ -do { \ - parser->state = CURRENT_STATE(); \ - return (V); \ -} while (0); -#define REEXECUTE() \ - goto reexecute; \ - - -#ifdef __GNUC__ -# define LIKELY(X) __builtin_expect(!!(X), 1) -# define UNLIKELY(X) __builtin_expect(!!(X), 0) -#else -# define LIKELY(X) (X) -# define UNLIKELY(X) (X) -#endif - - -/* Run the notify callback FOR, returning ER if it fails */ -#define CALLBACK_NOTIFY_(FOR, ER) \ -do { \ - assert(HTTP_PARSER_ERRNO(parser) == HPE_OK); \ - \ - if (LIKELY(settings->on_##FOR)) { \ - parser->state = CURRENT_STATE(); \ - if (UNLIKELY(0 != settings->on_##FOR(parser))) { \ - SET_ERRNO(HPE_CB_##FOR); \ - } \ - UPDATE_STATE(parser->state); \ - \ - /* We either errored above or got paused; get out */ \ - if (UNLIKELY(HTTP_PARSER_ERRNO(parser) != HPE_OK)) { \ - return (ER); \ - } \ - } \ -} while (0) - -/* Run the notify callback FOR and consume the current byte */ -#define CALLBACK_NOTIFY(FOR) CALLBACK_NOTIFY_(FOR, p - data + 1) - -/* Run the notify callback FOR and don't consume the current byte */ -#define CALLBACK_NOTIFY_NOADVANCE(FOR) CALLBACK_NOTIFY_(FOR, p - data) - -/* Run data callback FOR with LEN bytes, returning ER if it fails */ -#define CALLBACK_DATA_(FOR, LEN, ER) \ -do { \ - assert(HTTP_PARSER_ERRNO(parser) == HPE_OK); \ - \ - if (FOR##_mark) { \ - if (LIKELY(settings->on_##FOR)) { \ - parser->state = CURRENT_STATE(); \ - if (UNLIKELY(0 != \ - settings->on_##FOR(parser, FOR##_mark, (LEN)))) { \ - SET_ERRNO(HPE_CB_##FOR); \ - } \ - UPDATE_STATE(parser->state); \ - \ - /* We either errored above or got paused; get out */ \ - if (UNLIKELY(HTTP_PARSER_ERRNO(parser) != HPE_OK)) { \ - return (ER); \ - } \ - } \ - FOR##_mark = NULL; \ - } \ -} while (0) - -/* Run the data callback FOR and consume the current byte */ -#define CALLBACK_DATA(FOR) \ - CALLBACK_DATA_(FOR, p - FOR##_mark, p - data + 1) - -/* Run the data callback FOR and don't consume the current byte */ -#define CALLBACK_DATA_NOADVANCE(FOR) \ - CALLBACK_DATA_(FOR, p - FOR##_mark, p - data) - -/* Set the mark FOR; non-destructive if mark is already set */ -#define MARK(FOR) \ -do { \ - if (!FOR##_mark) { \ - FOR##_mark = p; \ - } \ -} while (0) - -/* Don't allow the total size of the HTTP headers (including the status - * line) to exceed HTTP_MAX_HEADER_SIZE. This check is here to protect - * embedders against denial-of-service attacks where the attacker feeds - * us a never-ending header that the embedder keeps buffering. - * - * This check is arguably the responsibility of embedders but we're doing - * it on the embedder's behalf because most won't bother and this way we - * make the web a little safer. HTTP_MAX_HEADER_SIZE is still far bigger - * than any reasonable request or response so this should never affect - * day-to-day operation. - */ -#define COUNT_HEADER_SIZE(V) \ -do { \ - parser->nread += (V); \ - if (UNLIKELY(parser->nread > (HTTP_MAX_HEADER_SIZE))) { \ - SET_ERRNO(HPE_HEADER_OVERFLOW); \ - goto error; \ - } \ -} while (0) - - -#define PROXY_CONNECTION "proxy-connection" -#define CONNECTION "connection" -#define CONTENT_LENGTH "content-length" -#define TRANSFER_ENCODING "transfer-encoding" -#define UPGRADE "upgrade" -#define CHUNKED "chunked" -#define KEEP_ALIVE "keep-alive" -#define CLOSE "close" - - -static const char *method_strings[] = - { -#define XX(num, name, string) #string, - HTTP_METHOD_MAP(XX) -#undef XX - }; - - -/* Tokens as defined by rfc 2616. Also lowercases them. - * token = 1* - * separators = "(" | ")" | "<" | ">" | "@" - * | "," | ";" | ":" | "\" | <"> - * | "/" | "[" | "]" | "?" | "=" - * | "{" | "}" | SP | HT - */ -static const char tokens[256] = { -/* 0 nul 1 soh 2 stx 3 etx 4 eot 5 enq 6 ack 7 bel */ - 0, 0, 0, 0, 0, 0, 0, 0, -/* 8 bs 9 ht 10 nl 11 vt 12 np 13 cr 14 so 15 si */ - 0, 0, 0, 0, 0, 0, 0, 0, -/* 16 dle 17 dc1 18 dc2 19 dc3 20 dc4 21 nak 22 syn 23 etb */ - 0, 0, 0, 0, 0, 0, 0, 0, -/* 24 can 25 em 26 sub 27 esc 28 fs 29 gs 30 rs 31 us */ - 0, 0, 0, 0, 0, 0, 0, 0, -/* 32 sp 33 ! 34 " 35 # 36 $ 37 % 38 & 39 ' */ - 0, '!', 0, '#', '$', '%', '&', '\'', -/* 40 ( 41 ) 42 * 43 + 44 , 45 - 46 . 47 / */ - 0, 0, '*', '+', 0, '-', '.', 0, -/* 48 0 49 1 50 2 51 3 52 4 53 5 54 6 55 7 */ - '0', '1', '2', '3', '4', '5', '6', '7', -/* 56 8 57 9 58 : 59 ; 60 < 61 = 62 > 63 ? */ - '8', '9', 0, 0, 0, 0, 0, 0, -/* 64 @ 65 A 66 B 67 C 68 D 69 E 70 F 71 G */ - 0, 'a', 'b', 'c', 'd', 'e', 'f', 'g', -/* 72 H 73 I 74 J 75 K 76 L 77 M 78 N 79 O */ - 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', -/* 80 P 81 Q 82 R 83 S 84 T 85 U 86 V 87 W */ - 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', -/* 88 X 89 Y 90 Z 91 [ 92 \ 93 ] 94 ^ 95 _ */ - 'x', 'y', 'z', 0, 0, 0, '^', '_', -/* 96 ` 97 a 98 b 99 c 100 d 101 e 102 f 103 g */ - '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', -/* 104 h 105 i 106 j 107 k 108 l 109 m 110 n 111 o */ - 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', -/* 112 p 113 q 114 r 115 s 116 t 117 u 118 v 119 w */ - 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', -/* 120 x 121 y 122 z 123 { 124 | 125 } 126 ~ 127 del */ - 'x', 'y', 'z', 0, '|', 0, '~', 0 }; - - -static const int8_t unhex[256] = - {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 - ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 - ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 - , 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,-1,-1,-1,-1,-1,-1 - ,-1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1 - ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 - ,-1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1 - ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 - }; - - -#if HTTP_PARSER_STRICT -# define T(v) 0 -#else -# define T(v) v -#endif - - -static const uint8_t normal_url_char[32] = { -/* 0 nul 1 soh 2 stx 3 etx 4 eot 5 enq 6 ack 7 bel */ - 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0, -/* 8 bs 9 ht 10 nl 11 vt 12 np 13 cr 14 so 15 si */ - 0 | T(2) | 0 | 0 | T(16) | 0 | 0 | 0, -/* 16 dle 17 dc1 18 dc2 19 dc3 20 dc4 21 nak 22 syn 23 etb */ - 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0, -/* 24 can 25 em 26 sub 27 esc 28 fs 29 gs 30 rs 31 us */ - 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0, -/* 32 sp 33 ! 34 " 35 # 36 $ 37 % 38 & 39 ' */ - 0 | 2 | 4 | 0 | 16 | 32 | 64 | 128, -/* 40 ( 41 ) 42 * 43 + 44 , 45 - 46 . 47 / */ - 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128, -/* 48 0 49 1 50 2 51 3 52 4 53 5 54 6 55 7 */ - 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128, -/* 56 8 57 9 58 : 59 ; 60 < 61 = 62 > 63 ? */ - 1 | 2 | 4 | 8 | 16 | 32 | 64 | 0, -/* 64 @ 65 A 66 B 67 C 68 D 69 E 70 F 71 G */ - 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128, -/* 72 H 73 I 74 J 75 K 76 L 77 M 78 N 79 O */ - 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128, -/* 80 P 81 Q 82 R 83 S 84 T 85 U 86 V 87 W */ - 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128, -/* 88 X 89 Y 90 Z 91 [ 92 \ 93 ] 94 ^ 95 _ */ - 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128, -/* 96 ` 97 a 98 b 99 c 100 d 101 e 102 f 103 g */ - 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128, -/* 104 h 105 i 106 j 107 k 108 l 109 m 110 n 111 o */ - 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128, -/* 112 p 113 q 114 r 115 s 116 t 117 u 118 v 119 w */ - 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128, -/* 120 x 121 y 122 z 123 { 124 | 125 } 126 ~ 127 del */ - 1 | 2 | 4 | 8 | 16 | 32 | 64 | 0, }; - -#undef T - -enum state - { s_dead = 1 /* important that this is > 0 */ - - , s_start_req_or_res - , s_res_or_resp_H - , s_start_res - , s_res_H - , s_res_HT - , s_res_HTT - , s_res_HTTP - , s_res_first_http_major - , s_res_http_major - , s_res_first_http_minor - , s_res_http_minor - , s_res_first_status_code - , s_res_status_code - , s_res_status_start - , s_res_status - , s_res_line_almost_done - - , s_start_req - - , s_req_method - , s_req_spaces_before_url - , s_req_schema - , s_req_schema_slash - , s_req_schema_slash_slash - , s_req_server_start - , s_req_server - , s_req_server_with_at - , s_req_path - , s_req_query_string_start - , s_req_query_string - , s_req_fragment_start - , s_req_fragment - , s_req_http_start - , s_req_http_H - , s_req_http_HT - , s_req_http_HTT - , s_req_http_HTTP - , s_req_first_http_major - , s_req_http_major - , s_req_first_http_minor - , s_req_http_minor - , s_req_line_almost_done - - , s_header_field_start - , s_header_field - , s_header_value_discard_ws - , s_header_value_discard_ws_almost_done - , s_header_value_discard_lws - , s_header_value_start - , s_header_value - , s_header_value_lws - - , s_header_almost_done - - , s_chunk_size_start - , s_chunk_size - , s_chunk_parameters - , s_chunk_size_almost_done - - , s_headers_almost_done - , s_headers_done - - /* Important: 's_headers_done' must be the last 'header' state. All - * states beyond this must be 'body' states. It is used for overflow - * checking. See the PARSING_HEADER() macro. - */ - - , s_chunk_data - , s_chunk_data_almost_done - , s_chunk_data_done - - , s_body_identity - , s_body_identity_eof - - , s_message_done - }; - - -#define PARSING_HEADER(state) (state <= s_headers_done) - - -enum header_states - { h_general = 0 - , h_C - , h_CO - , h_CON - - , h_matching_connection - , h_matching_proxy_connection - , h_matching_content_length - , h_matching_transfer_encoding - , h_matching_upgrade - - , h_connection - , h_content_length - , h_transfer_encoding - , h_upgrade - - , h_matching_transfer_encoding_chunked - , h_matching_connection_token_start - , h_matching_connection_keep_alive - , h_matching_connection_close - , h_matching_connection_upgrade - , h_matching_connection_token - - , h_transfer_encoding_chunked - , h_connection_keep_alive - , h_connection_close - , h_connection_upgrade - }; - -enum http_host_state - { - s_http_host_dead = 1 - , s_http_userinfo_start - , s_http_userinfo - , s_http_host_start - , s_http_host_v6_start - , s_http_host - , s_http_host_v6 - , s_http_host_v6_end - , s_http_host_port_start - , s_http_host_port -}; - -/* Macros for character classes; depends on strict-mode */ -#define CR '\r' -#define LF '\n' -#define LOWER(c) (unsigned char)(c | 0x20) -#define IS_ALPHA(c) (LOWER(c) >= 'a' && LOWER(c) <= 'z') -#define IS_NUM(c) ((c) >= '0' && (c) <= '9') -#define IS_ALPHANUM(c) (IS_ALPHA(c) || IS_NUM(c)) -#define IS_HEX(c) (IS_NUM(c) || (LOWER(c) >= 'a' && LOWER(c) <= 'f')) -#define IS_MARK(c) ((c) == '-' || (c) == '_' || (c) == '.' || \ - (c) == '!' || (c) == '~' || (c) == '*' || (c) == '\'' || (c) == '(' || \ - (c) == ')') -#define IS_USERINFO_CHAR(c) (IS_ALPHANUM(c) || IS_MARK(c) || (c) == '%' || \ - (c) == ';' || (c) == ':' || (c) == '&' || (c) == '=' || (c) == '+' || \ - (c) == '$' || (c) == ',') - -#define STRICT_TOKEN(c) (tokens[(unsigned char)c]) - -#if HTTP_PARSER_STRICT -#define TOKEN(c) (tokens[(unsigned char)c]) -#define IS_URL_CHAR(c) (BIT_AT(normal_url_char, (unsigned char)c)) -#define IS_HOST_CHAR(c) (IS_ALPHANUM(c) || (c) == '.' || (c) == '-') -#else -#define TOKEN(c) ((c == ' ') ? ' ' : tokens[(unsigned char)c]) -#define IS_URL_CHAR(c) \ - (BIT_AT(normal_url_char, (unsigned char)c) || ((c) & 0x80)) -#define IS_HOST_CHAR(c) \ - (IS_ALPHANUM(c) || (c) == '.' || (c) == '-' || (c) == '_') -#endif - - -#define start_state (parser->type == HTTP_REQUEST ? s_start_req : s_start_res) - - -#if HTTP_PARSER_STRICT -# define STRICT_CHECK(cond) \ -do { \ - if (cond) { \ - SET_ERRNO(HPE_STRICT); \ - goto error; \ - } \ -} while (0) -# define NEW_MESSAGE() (http_should_keep_alive(parser) ? start_state : s_dead) -#else -# define STRICT_CHECK(cond) -# define NEW_MESSAGE() start_state -#endif - - -/* Map errno values to strings for human-readable output */ -#define HTTP_STRERROR_GEN(n, s) { "HPE_" #n, s }, -static struct { - const char *name; - const char *description; -} http_strerror_tab[] = { - HTTP_ERRNO_MAP(HTTP_STRERROR_GEN) -}; -#undef HTTP_STRERROR_GEN - -int http_message_needs_eof(const http_parser *parser); - -/* Our URL parser. - * - * This is designed to be shared by http_parser_execute() for URL validation, - * hence it has a state transition + byte-for-byte interface. In addition, it - * is meant to be embedded in http_parser_parse_url(), which does the dirty - * work of turning state transitions URL components for its API. - * - * This function should only be invoked with non-space characters. It is - * assumed that the caller cares about (and can detect) the transition between - * URL and non-URL states by looking for these. - */ -static enum state -parse_url_char(enum state s, const char ch) -{ - if (ch == ' ' || ch == '\r' || ch == '\n') { - return s_dead; - } - -#if HTTP_PARSER_STRICT - if (ch == '\t' || ch == '\f') { - return s_dead; - } -#endif - - switch (s) { - case s_req_spaces_before_url: - /* Proxied requests are followed by scheme of an absolute URI (alpha). - * All methods except CONNECT are followed by '/' or '*'. - */ - - if (ch == '/' || ch == '*') { - return s_req_path; - } - - if (IS_ALPHA(ch)) { - return s_req_schema; - } - - break; - - case s_req_schema: - if (IS_ALPHA(ch)) { - return s; - } - - if (ch == ':') { - return s_req_schema_slash; - } - - break; - - case s_req_schema_slash: - if (ch == '/') { - return s_req_schema_slash_slash; - } - - break; - - case s_req_schema_slash_slash: - if (ch == '/') { - return s_req_server_start; - } - - break; - - case s_req_server_with_at: - if (ch == '@') { - return s_dead; - } - - /* FALLTHROUGH */ - case s_req_server_start: - case s_req_server: - if (ch == '/') { - return s_req_path; - } - - if (ch == '?') { - return s_req_query_string_start; - } - - if (ch == '@') { - return s_req_server_with_at; - } - - if (IS_USERINFO_CHAR(ch) || ch == '[' || ch == ']') { - return s_req_server; - } - - break; - - case s_req_path: - if (IS_URL_CHAR(ch)) { - return s; - } - - switch (ch) { - case '?': - return s_req_query_string_start; - - case '#': - return s_req_fragment_start; - } - - break; - - case s_req_query_string_start: - case s_req_query_string: - if (IS_URL_CHAR(ch)) { - return s_req_query_string; - } - - switch (ch) { - case '?': - /* allow extra '?' in query string */ - return s_req_query_string; - - case '#': - return s_req_fragment_start; - } - - break; - - case s_req_fragment_start: - if (IS_URL_CHAR(ch)) { - return s_req_fragment; - } - - switch (ch) { - case '?': - return s_req_fragment; - - case '#': - return s; - } - - break; - - case s_req_fragment: - if (IS_URL_CHAR(ch)) { - return s; - } - - switch (ch) { - case '?': - case '#': - return s; - } - - break; - - default: - break; - } - - /* We should never fall out of the switch above unless there's an error */ - return s_dead; -} - -size_t http_parser_execute (http_parser *parser, - const http_parser_settings *settings, - const char *data, - size_t len) -{ - char c, ch; - int8_t unhex_val; - const char *p = data; - const char *header_field_mark = 0; - const char *header_value_mark = 0; - const char *url_mark = 0; - const char *body_mark = 0; - const char *status_mark = 0; - enum state p_state = (enum state) parser->state; - - /* We're in an error state. Don't bother doing anything. */ - if (HTTP_PARSER_ERRNO(parser) != HPE_OK) { - return 0; - } - - if (len == 0) { - switch (CURRENT_STATE()) { - case s_body_identity_eof: - /* Use of CALLBACK_NOTIFY() here would erroneously return 1 byte read if - * we got paused. - */ - CALLBACK_NOTIFY_NOADVANCE(message_complete); - return 0; - - case s_dead: - case s_start_req_or_res: - case s_start_res: - case s_start_req: - return 0; - - default: - SET_ERRNO(HPE_INVALID_EOF_STATE); - return 1; - } - } - - - if (CURRENT_STATE() == s_header_field) - header_field_mark = data; - if (CURRENT_STATE() == s_header_value) - header_value_mark = data; - switch (CURRENT_STATE()) { - case s_req_path: - case s_req_schema: - case s_req_schema_slash: - case s_req_schema_slash_slash: - case s_req_server_start: - case s_req_server: - case s_req_server_with_at: - case s_req_query_string_start: - case s_req_query_string: - case s_req_fragment_start: - case s_req_fragment: - url_mark = data; - break; - case s_res_status: - status_mark = data; - break; - default: - break; - } - - for (p=data; p != data + len; p++) { - ch = *p; - - if (PARSING_HEADER(CURRENT_STATE())) - COUNT_HEADER_SIZE(1); - -reexecute: - switch (CURRENT_STATE()) { - - case s_dead: - /* this state is used after a 'Connection: close' message - * the parser will error out if it reads another message - */ - if (LIKELY(ch == CR || ch == LF)) - break; - - SET_ERRNO(HPE_CLOSED_CONNECTION); - goto error; - - case s_start_req_or_res: - { - if (ch == CR || ch == LF) - break; - parser->flags = 0; - parser->content_length = ULLONG_MAX; - - if (ch == 'H') { - UPDATE_STATE(s_res_or_resp_H); - - CALLBACK_NOTIFY(message_begin); - } else { - parser->type = HTTP_REQUEST; - UPDATE_STATE(s_start_req); - REEXECUTE(); - } - - break; - } - - case s_res_or_resp_H: - if (ch == 'T') { - parser->type = HTTP_RESPONSE; - UPDATE_STATE(s_res_HT); - } else { - if (UNLIKELY(ch != 'E')) { - SET_ERRNO(HPE_INVALID_CONSTANT); - goto error; - } - - parser->type = HTTP_REQUEST; - parser->method = HTTP_HEAD; - parser->index = 2; - UPDATE_STATE(s_req_method); - } - break; - - case s_start_res: - { - parser->flags = 0; - parser->content_length = ULLONG_MAX; - - switch (ch) { - case 'H': - UPDATE_STATE(s_res_H); - break; - - case CR: - case LF: - break; - - default: - SET_ERRNO(HPE_INVALID_CONSTANT); - goto error; - } - - CALLBACK_NOTIFY(message_begin); - break; - } - - case s_res_H: - STRICT_CHECK(ch != 'T'); - UPDATE_STATE(s_res_HT); - break; - - case s_res_HT: - STRICT_CHECK(ch != 'T'); - UPDATE_STATE(s_res_HTT); - break; - - case s_res_HTT: - STRICT_CHECK(ch != 'P'); - UPDATE_STATE(s_res_HTTP); - break; - - case s_res_HTTP: - STRICT_CHECK(ch != '/'); - UPDATE_STATE(s_res_first_http_major); - break; - - case s_res_first_http_major: - if (UNLIKELY(ch < '0' || ch > '9')) { - SET_ERRNO(HPE_INVALID_VERSION); - goto error; - } - - parser->http_major = ch - '0'; - UPDATE_STATE(s_res_http_major); - break; - - /* major HTTP version or dot */ - case s_res_http_major: - { - if (ch == '.') { - UPDATE_STATE(s_res_first_http_minor); - break; - } - - if (!IS_NUM(ch)) { - SET_ERRNO(HPE_INVALID_VERSION); - goto error; - } - - parser->http_major *= 10; - parser->http_major += ch - '0'; - - if (UNLIKELY(parser->http_major > 999)) { - SET_ERRNO(HPE_INVALID_VERSION); - goto error; - } - - break; - } - - /* first digit of minor HTTP version */ - case s_res_first_http_minor: - if (UNLIKELY(!IS_NUM(ch))) { - SET_ERRNO(HPE_INVALID_VERSION); - goto error; - } - - parser->http_minor = ch - '0'; - UPDATE_STATE(s_res_http_minor); - break; - - /* minor HTTP version or end of request line */ - case s_res_http_minor: - { - if (ch == ' ') { - UPDATE_STATE(s_res_first_status_code); - break; - } - - if (UNLIKELY(!IS_NUM(ch))) { - SET_ERRNO(HPE_INVALID_VERSION); - goto error; - } - - parser->http_minor *= 10; - parser->http_minor += ch - '0'; - - if (UNLIKELY(parser->http_minor > 999)) { - SET_ERRNO(HPE_INVALID_VERSION); - goto error; - } - - break; - } - - case s_res_first_status_code: - { - if (!IS_NUM(ch)) { - if (ch == ' ') { - break; - } - - SET_ERRNO(HPE_INVALID_STATUS); - goto error; - } - parser->status_code = ch - '0'; - UPDATE_STATE(s_res_status_code); - break; - } - - case s_res_status_code: - { - if (!IS_NUM(ch)) { - switch (ch) { - case ' ': - UPDATE_STATE(s_res_status_start); - break; - case CR: - UPDATE_STATE(s_res_line_almost_done); - break; - case LF: - UPDATE_STATE(s_header_field_start); - break; - default: - SET_ERRNO(HPE_INVALID_STATUS); - goto error; - } - break; - } - - parser->status_code *= 10; - parser->status_code += ch - '0'; - - if (UNLIKELY(parser->status_code > 999)) { - SET_ERRNO(HPE_INVALID_STATUS); - goto error; - } - - break; - } - - case s_res_status_start: - { - if (ch == CR) { - UPDATE_STATE(s_res_line_almost_done); - break; - } - - if (ch == LF) { - UPDATE_STATE(s_header_field_start); - break; - } - - MARK(status); - UPDATE_STATE(s_res_status); - parser->index = 0; - break; - } - - case s_res_status: - if (ch == CR) { - UPDATE_STATE(s_res_line_almost_done); - CALLBACK_DATA(status); - break; - } - - if (ch == LF) { - UPDATE_STATE(s_header_field_start); - CALLBACK_DATA(status); - break; - } - - break; - - case s_res_line_almost_done: - STRICT_CHECK(ch != LF); - UPDATE_STATE(s_header_field_start); - break; - - case s_start_req: - { - if (ch == CR || ch == LF) - break; - parser->flags = 0; - parser->content_length = ULLONG_MAX; - - if (UNLIKELY(!IS_ALPHA(ch))) { - SET_ERRNO(HPE_INVALID_METHOD); - goto error; - } - - parser->method = (enum http_method) 0; - parser->index = 1; - switch (ch) { - case 'C': parser->method = HTTP_CONNECT; /* or COPY, CHECKOUT */ break; - case 'D': parser->method = HTTP_DELETE; break; - case 'G': parser->method = HTTP_GET; break; - case 'H': parser->method = HTTP_HEAD; break; - case 'L': parser->method = HTTP_LOCK; break; - case 'M': parser->method = HTTP_MKCOL; /* or MOVE, MKACTIVITY, MERGE, M-SEARCH, MKCALENDAR */ break; - case 'N': parser->method = HTTP_NOTIFY; break; - case 'O': parser->method = HTTP_OPTIONS; break; - case 'P': parser->method = HTTP_POST; - /* or PROPFIND|PROPPATCH|PUT|PATCH|PURGE */ - break; - case 'R': parser->method = HTTP_REPORT; break; - case 'S': parser->method = HTTP_SUBSCRIBE; /* or SEARCH */ break; - case 'T': parser->method = HTTP_TRACE; break; - case 'U': parser->method = HTTP_UNLOCK; /* or UNSUBSCRIBE */ break; - default: - SET_ERRNO(HPE_INVALID_METHOD); - goto error; - } - UPDATE_STATE(s_req_method); - - CALLBACK_NOTIFY(message_begin); - - break; - } - - case s_req_method: - { - const char *matcher; - if (UNLIKELY(ch == '\0')) { - SET_ERRNO(HPE_INVALID_METHOD); - goto error; - } - - matcher = method_strings[parser->method]; - if (ch == ' ' && matcher[parser->index] == '\0') { - UPDATE_STATE(s_req_spaces_before_url); - } else if (ch == matcher[parser->index]) { - ; /* nada */ - } else if (parser->method == HTTP_CONNECT) { - if (parser->index == 1 && ch == 'H') { - parser->method = HTTP_CHECKOUT; - } else if (parser->index == 2 && ch == 'P') { - parser->method = HTTP_COPY; - } else { - SET_ERRNO(HPE_INVALID_METHOD); - goto error; - } - } else if (parser->method == HTTP_MKCOL) { - if (parser->index == 1 && ch == 'O') { - parser->method = HTTP_MOVE; - } else if (parser->index == 1 && ch == 'E') { - parser->method = HTTP_MERGE; - } else if (parser->index == 1 && ch == '-') { - parser->method = HTTP_MSEARCH; - } else if (parser->index == 2 && ch == 'A') { - parser->method = HTTP_MKACTIVITY; - } else if (parser->index == 3 && ch == 'A') { - parser->method = HTTP_MKCALENDAR; - } else { - SET_ERRNO(HPE_INVALID_METHOD); - goto error; - } - } else if (parser->method == HTTP_SUBSCRIBE) { - if (parser->index == 1 && ch == 'E') { - parser->method = HTTP_SEARCH; - } else { - SET_ERRNO(HPE_INVALID_METHOD); - goto error; - } - } else if (parser->index == 1 && parser->method == HTTP_POST) { - if (ch == 'R') { - parser->method = HTTP_PROPFIND; /* or HTTP_PROPPATCH */ - } else if (ch == 'U') { - parser->method = HTTP_PUT; /* or HTTP_PURGE */ - } else if (ch == 'A') { - parser->method = HTTP_PATCH; - } else { - SET_ERRNO(HPE_INVALID_METHOD); - goto error; - } - } else if (parser->index == 2) { - if (parser->method == HTTP_PUT) { - if (ch == 'R') { - parser->method = HTTP_PURGE; - } else { - SET_ERRNO(HPE_INVALID_METHOD); - goto error; - } - } else if (parser->method == HTTP_UNLOCK) { - if (ch == 'S') { - parser->method = HTTP_UNSUBSCRIBE; - } else { - SET_ERRNO(HPE_INVALID_METHOD); - goto error; - } - } else { - SET_ERRNO(HPE_INVALID_METHOD); - goto error; - } - } else if (parser->index == 4 && parser->method == HTTP_PROPFIND && ch == 'P') { - parser->method = HTTP_PROPPATCH; - } else { - SET_ERRNO(HPE_INVALID_METHOD); - goto error; - } - - ++parser->index; - break; - } - - case s_req_spaces_before_url: - { - if (ch == ' ') break; - - MARK(url); - if (parser->method == HTTP_CONNECT) { - UPDATE_STATE(s_req_server_start); - } - - UPDATE_STATE(parse_url_char(CURRENT_STATE(), ch)); - if (UNLIKELY(CURRENT_STATE() == s_dead)) { - SET_ERRNO(HPE_INVALID_URL); - goto error; - } - - break; - } - - case s_req_schema: - case s_req_schema_slash: - case s_req_schema_slash_slash: - case s_req_server_start: - { - switch (ch) { - /* No whitespace allowed here */ - case ' ': - case CR: - case LF: - SET_ERRNO(HPE_INVALID_URL); - goto error; - default: - UPDATE_STATE(parse_url_char(CURRENT_STATE(), ch)); - if (UNLIKELY(CURRENT_STATE() == s_dead)) { - SET_ERRNO(HPE_INVALID_URL); - goto error; - } - } - - break; - } - - case s_req_server: - case s_req_server_with_at: - case s_req_path: - case s_req_query_string_start: - case s_req_query_string: - case s_req_fragment_start: - case s_req_fragment: - { - switch (ch) { - case ' ': - UPDATE_STATE(s_req_http_start); - CALLBACK_DATA(url); - break; - case CR: - case LF: - parser->http_major = 0; - parser->http_minor = 9; - UPDATE_STATE((ch == CR) ? - s_req_line_almost_done : - s_header_field_start); - CALLBACK_DATA(url); - break; - default: - UPDATE_STATE(parse_url_char(CURRENT_STATE(), ch)); - if (UNLIKELY(CURRENT_STATE() == s_dead)) { - SET_ERRNO(HPE_INVALID_URL); - goto error; - } - } - break; - } - - case s_req_http_start: - switch (ch) { - case 'H': - UPDATE_STATE(s_req_http_H); - break; - case ' ': - break; - default: - SET_ERRNO(HPE_INVALID_CONSTANT); - goto error; - } - break; - - case s_req_http_H: - STRICT_CHECK(ch != 'T'); - UPDATE_STATE(s_req_http_HT); - break; - - case s_req_http_HT: - STRICT_CHECK(ch != 'T'); - UPDATE_STATE(s_req_http_HTT); - break; - - case s_req_http_HTT: - STRICT_CHECK(ch != 'P'); - UPDATE_STATE(s_req_http_HTTP); - break; - - case s_req_http_HTTP: - STRICT_CHECK(ch != '/'); - UPDATE_STATE(s_req_first_http_major); - break; - - /* first digit of major HTTP version */ - case s_req_first_http_major: - if (UNLIKELY(ch < '1' || ch > '9')) { - SET_ERRNO(HPE_INVALID_VERSION); - goto error; - } - - parser->http_major = ch - '0'; - UPDATE_STATE(s_req_http_major); - break; - - /* major HTTP version or dot */ - case s_req_http_major: - { - if (ch == '.') { - UPDATE_STATE(s_req_first_http_minor); - break; - } - - if (UNLIKELY(!IS_NUM(ch))) { - SET_ERRNO(HPE_INVALID_VERSION); - goto error; - } - - parser->http_major *= 10; - parser->http_major += ch - '0'; - - if (UNLIKELY(parser->http_major > 999)) { - SET_ERRNO(HPE_INVALID_VERSION); - goto error; - } - - break; - } - - /* first digit of minor HTTP version */ - case s_req_first_http_minor: - if (UNLIKELY(!IS_NUM(ch))) { - SET_ERRNO(HPE_INVALID_VERSION); - goto error; - } - - parser->http_minor = ch - '0'; - UPDATE_STATE(s_req_http_minor); - break; - - /* minor HTTP version or end of request line */ - case s_req_http_minor: - { - if (ch == CR) { - UPDATE_STATE(s_req_line_almost_done); - break; - } - - if (ch == LF) { - UPDATE_STATE(s_header_field_start); - break; - } - - /* XXX allow spaces after digit? */ - - if (UNLIKELY(!IS_NUM(ch))) { - SET_ERRNO(HPE_INVALID_VERSION); - goto error; - } - - parser->http_minor *= 10; - parser->http_minor += ch - '0'; - - if (UNLIKELY(parser->http_minor > 999)) { - SET_ERRNO(HPE_INVALID_VERSION); - goto error; - } - - break; - } - - /* end of request line */ - case s_req_line_almost_done: - { - if (UNLIKELY(ch != LF)) { - SET_ERRNO(HPE_LF_EXPECTED); - goto error; - } - - UPDATE_STATE(s_header_field_start); - break; - } - - case s_header_field_start: - { - if (ch == CR) { - UPDATE_STATE(s_headers_almost_done); - break; - } - - if (ch == LF) { - /* they might be just sending \n instead of \r\n so this would be - * the second \n to denote the end of headers*/ - UPDATE_STATE(s_headers_almost_done); - REEXECUTE(); - } - - c = TOKEN(ch); - - if (UNLIKELY(!c)) { - SET_ERRNO(HPE_INVALID_HEADER_TOKEN); - goto error; - } - - MARK(header_field); - - parser->index = 0; - UPDATE_STATE(s_header_field); - - switch (c) { - case 'c': - parser->header_state = h_C; - break; - - case 'p': - parser->header_state = h_matching_proxy_connection; - break; - - case 't': - parser->header_state = h_matching_transfer_encoding; - break; - - case 'u': - parser->header_state = h_matching_upgrade; - break; - - default: - parser->header_state = h_general; - break; - } - break; - } - - case s_header_field: - { - const char* start = p; - for (; p != data + len; p++) { - ch = *p; - c = TOKEN(ch); - - if (!c) - break; - - switch (parser->header_state) { - case h_general: - break; - - case h_C: - parser->index++; - parser->header_state = (c == 'o' ? h_CO : h_general); - break; - - case h_CO: - parser->index++; - parser->header_state = (c == 'n' ? h_CON : h_general); - break; - - case h_CON: - parser->index++; - switch (c) { - case 'n': - parser->header_state = h_matching_connection; - break; - case 't': - parser->header_state = h_matching_content_length; - break; - default: - parser->header_state = h_general; - break; - } - break; - - /* connection */ - - case h_matching_connection: - parser->index++; - if (parser->index > sizeof(CONNECTION)-1 - || c != CONNECTION[parser->index]) { - parser->header_state = h_general; - } else if (parser->index == sizeof(CONNECTION)-2) { - parser->header_state = h_connection; - } - break; - - /* proxy-connection */ - - case h_matching_proxy_connection: - parser->index++; - if (parser->index > sizeof(PROXY_CONNECTION)-1 - || c != PROXY_CONNECTION[parser->index]) { - parser->header_state = h_general; - } else if (parser->index == sizeof(PROXY_CONNECTION)-2) { - parser->header_state = h_connection; - } - break; - - /* content-length */ - - case h_matching_content_length: - parser->index++; - if (parser->index > sizeof(CONTENT_LENGTH)-1 - || c != CONTENT_LENGTH[parser->index]) { - parser->header_state = h_general; - } else if (parser->index == sizeof(CONTENT_LENGTH)-2) { - parser->header_state = h_content_length; - } - break; - - /* transfer-encoding */ - - case h_matching_transfer_encoding: - parser->index++; - if (parser->index > sizeof(TRANSFER_ENCODING)-1 - || c != TRANSFER_ENCODING[parser->index]) { - parser->header_state = h_general; - } else if (parser->index == sizeof(TRANSFER_ENCODING)-2) { - parser->header_state = h_transfer_encoding; - } - break; - - /* upgrade */ - - case h_matching_upgrade: - parser->index++; - if (parser->index > sizeof(UPGRADE)-1 - || c != UPGRADE[parser->index]) { - parser->header_state = h_general; - } else if (parser->index == sizeof(UPGRADE)-2) { - parser->header_state = h_upgrade; - } - break; - - case h_connection: - case h_content_length: - case h_transfer_encoding: - case h_upgrade: - if (ch != ' ') parser->header_state = h_general; - break; - - default: - assert(0 && "Unknown header_state"); - break; - } - } - - COUNT_HEADER_SIZE(p - start); - - if (p == data + len) { - --p; - break; - } - - if (ch == ':') { - UPDATE_STATE(s_header_value_discard_ws); - CALLBACK_DATA(header_field); - break; - } - - SET_ERRNO(HPE_INVALID_HEADER_TOKEN); - goto error; - } - - case s_header_value_discard_ws: - if (ch == ' ' || ch == '\t') break; - - if (ch == CR) { - UPDATE_STATE(s_header_value_discard_ws_almost_done); - break; - } - - if (ch == LF) { - UPDATE_STATE(s_header_value_discard_lws); - break; - } - - /* FALLTHROUGH */ - - case s_header_value_start: - { - MARK(header_value); - - UPDATE_STATE(s_header_value); - parser->index = 0; - - c = LOWER(ch); - - switch (parser->header_state) { - case h_upgrade: - parser->flags |= F_UPGRADE; - parser->header_state = h_general; - break; - - case h_transfer_encoding: - /* looking for 'Transfer-Encoding: chunked' */ - if ('c' == c) { - parser->header_state = h_matching_transfer_encoding_chunked; - } else { - parser->header_state = h_general; - } - break; - - case h_content_length: - if (UNLIKELY(!IS_NUM(ch))) { - SET_ERRNO(HPE_INVALID_CONTENT_LENGTH); - goto error; - } - - parser->content_length = ch - '0'; - break; - - case h_connection: - /* looking for 'Connection: keep-alive' */ - if (c == 'k') { - parser->header_state = h_matching_connection_keep_alive; - /* looking for 'Connection: close' */ - } else if (c == 'c') { - parser->header_state = h_matching_connection_close; - } else if (c == 'u') { - parser->header_state = h_matching_connection_upgrade; - } else { - parser->header_state = h_matching_connection_token; - } - break; - - /* Multi-value `Connection` header */ - case h_matching_connection_token_start: - break; - - default: - parser->header_state = h_general; - break; - } - break; - } - - case s_header_value: - { - const char* start = p; - enum header_states h_state = (enum header_states) parser->header_state; - for (; p != data + len; p++) { - ch = *p; - if (ch == CR) { - UPDATE_STATE(s_header_almost_done); - parser->header_state = h_state; - CALLBACK_DATA(header_value); - break; - } - - if (ch == LF) { - UPDATE_STATE(s_header_almost_done); - COUNT_HEADER_SIZE(p - start); - parser->header_state = h_state; - CALLBACK_DATA_NOADVANCE(header_value); - REEXECUTE(); - } - - c = LOWER(ch); - - switch (h_state) { - case h_general: - { - const char* p_cr; - const char* p_lf; - size_t limit = data + len - p; - - limit = MIN(limit, HTTP_MAX_HEADER_SIZE); - - p_cr = (const char*) memchr(p, CR, limit); - p_lf = (const char*) memchr(p, LF, limit); - if (p_cr != NULL) { - if (p_lf != NULL && p_cr >= p_lf) - p = p_lf; - else - p = p_cr; - } else if (UNLIKELY(p_lf != NULL)) { - p = p_lf; - } else { - p = data + len; - } - --p; - - break; - } - - case h_connection: - case h_transfer_encoding: - assert(0 && "Shouldn't get here."); - break; - - case h_content_length: - { - uint64_t t; - - if (ch == ' ') break; - - if (UNLIKELY(!IS_NUM(ch))) { - SET_ERRNO(HPE_INVALID_CONTENT_LENGTH); - parser->header_state = h_state; - goto error; - } - - t = parser->content_length; - t *= 10; - t += ch - '0'; - - /* Overflow? Test against a conservative limit for simplicity. */ - if (UNLIKELY((ULLONG_MAX - 10) / 10 < parser->content_length)) { - SET_ERRNO(HPE_INVALID_CONTENT_LENGTH); - parser->header_state = h_state; - goto error; - } - - parser->content_length = t; - break; - } - - /* Transfer-Encoding: chunked */ - case h_matching_transfer_encoding_chunked: - parser->index++; - if (parser->index > sizeof(CHUNKED)-1 - || c != CHUNKED[parser->index]) { - h_state = h_general; - } else if (parser->index == sizeof(CHUNKED)-2) { - h_state = h_transfer_encoding_chunked; - } - break; - - case h_matching_connection_token_start: - /* looking for 'Connection: keep-alive' */ - if (c == 'k') { - h_state = h_matching_connection_keep_alive; - /* looking for 'Connection: close' */ - } else if (c == 'c') { - h_state = h_matching_connection_close; - } else if (c == 'u') { - h_state = h_matching_connection_upgrade; - } else if (STRICT_TOKEN(c)) { - h_state = h_matching_connection_token; - } else if (c == ' ' || c == '\t') { - /* Skip lws */ - } else { - h_state = h_general; - } - break; - - /* looking for 'Connection: keep-alive' */ - case h_matching_connection_keep_alive: - parser->index++; - if (parser->index > sizeof(KEEP_ALIVE)-1 - || c != KEEP_ALIVE[parser->index]) { - h_state = h_matching_connection_token; - } else if (parser->index == sizeof(KEEP_ALIVE)-2) { - h_state = h_connection_keep_alive; - } - break; - - /* looking for 'Connection: close' */ - case h_matching_connection_close: - parser->index++; - if (parser->index > sizeof(CLOSE)-1 || c != CLOSE[parser->index]) { - h_state = h_matching_connection_token; - } else if (parser->index == sizeof(CLOSE)-2) { - h_state = h_connection_close; - } - break; - - /* looking for 'Connection: upgrade' */ - case h_matching_connection_upgrade: - parser->index++; - if (parser->index > sizeof(UPGRADE) - 1 || - c != UPGRADE[parser->index]) { - h_state = h_matching_connection_token; - } else if (parser->index == sizeof(UPGRADE)-2) { - h_state = h_connection_upgrade; - } - break; - - case h_matching_connection_token: - if (ch == ',') { - h_state = h_matching_connection_token_start; - parser->index = 0; - } - break; - - case h_transfer_encoding_chunked: - if (ch != ' ') h_state = h_general; - break; - - case h_connection_keep_alive: - case h_connection_close: - case h_connection_upgrade: - if (ch == ',') { - if (h_state == h_connection_keep_alive) { - parser->flags |= F_CONNECTION_KEEP_ALIVE; - } else if (h_state == h_connection_close) { - parser->flags |= F_CONNECTION_CLOSE; - } else if (h_state == h_connection_upgrade) { - parser->flags |= F_CONNECTION_UPGRADE; - } - h_state = h_matching_connection_token_start; - parser->index = 0; - } else if (ch != ' ') { - h_state = h_matching_connection_token; - } - break; - - default: - UPDATE_STATE(s_header_value); - h_state = h_general; - break; - } - } - parser->header_state = h_state; - - COUNT_HEADER_SIZE(p - start); - - if (p == data + len) - --p; - break; - } - - case s_header_almost_done: - { - STRICT_CHECK(ch != LF); - - UPDATE_STATE(s_header_value_lws); - break; - } - - case s_header_value_lws: - { - if (ch == ' ' || ch == '\t') { - UPDATE_STATE(s_header_value_start); - REEXECUTE(); - } - - /* finished the header */ - switch (parser->header_state) { - case h_connection_keep_alive: - parser->flags |= F_CONNECTION_KEEP_ALIVE; - break; - case h_connection_close: - parser->flags |= F_CONNECTION_CLOSE; - break; - case h_transfer_encoding_chunked: - parser->flags |= F_CHUNKED; - break; - case h_connection_upgrade: - parser->flags |= F_CONNECTION_UPGRADE; - break; - default: - break; - } - - UPDATE_STATE(s_header_field_start); - REEXECUTE(); - } - - case s_header_value_discard_ws_almost_done: - { - STRICT_CHECK(ch != LF); - UPDATE_STATE(s_header_value_discard_lws); - break; - } - - case s_header_value_discard_lws: - { - if (ch == ' ' || ch == '\t') { - UPDATE_STATE(s_header_value_discard_ws); - break; - } else { - switch (parser->header_state) { - case h_connection_keep_alive: - parser->flags |= F_CONNECTION_KEEP_ALIVE; - break; - case h_connection_close: - parser->flags |= F_CONNECTION_CLOSE; - break; - case h_connection_upgrade: - parser->flags |= F_CONNECTION_UPGRADE; - break; - case h_transfer_encoding_chunked: - parser->flags |= F_CHUNKED; - break; - default: - break; - } - - /* header value was empty */ - MARK(header_value); - UPDATE_STATE(s_header_field_start); - CALLBACK_DATA_NOADVANCE(header_value); - REEXECUTE(); - } - } - - case s_headers_almost_done: - { - STRICT_CHECK(ch != LF); - - if (parser->flags & F_TRAILING) { - /* End of a chunked request */ - UPDATE_STATE(s_message_done); - CALLBACK_NOTIFY_NOADVANCE(chunk_complete); - REEXECUTE(); - } - - UPDATE_STATE(s_headers_done); - - /* Set this here so that on_headers_complete() callbacks can see it */ - parser->upgrade = - ((parser->flags & (F_UPGRADE | F_CONNECTION_UPGRADE)) == - (F_UPGRADE | F_CONNECTION_UPGRADE) || - parser->method == HTTP_CONNECT); - - /* Here we call the headers_complete callback. This is somewhat - * different than other callbacks because if the user returns 1, we - * will interpret that as saying that this message has no body. This - * is needed for the annoying case of recieving a response to a HEAD - * request. - * - * We'd like to use CALLBACK_NOTIFY_NOADVANCE() here but we cannot, so - * we have to simulate it by handling a change in errno below. - */ - if (settings->on_headers_complete) { - switch (settings->on_headers_complete(parser)) { - case 0: - break; - - case 1: - parser->flags |= F_SKIPBODY; - break; - - default: - SET_ERRNO(HPE_CB_headers_complete); - RETURN(p - data); /* Error */ - } - } - - if (HTTP_PARSER_ERRNO(parser) != HPE_OK) { - RETURN(p - data); - } - - REEXECUTE(); - } - - case s_headers_done: - { - STRICT_CHECK(ch != LF); - - parser->nread = 0; - - int hasBody = parser->flags & F_CHUNKED || - (parser->content_length > 0 && parser->content_length != ULLONG_MAX); - if (parser->upgrade && (parser->method == HTTP_CONNECT || - (parser->flags & F_SKIPBODY) || !hasBody)) { - /* Exit, the rest of the message is in a different protocol. */ - UPDATE_STATE(NEW_MESSAGE()); - CALLBACK_NOTIFY(message_complete); - RETURN((p - data) + 1); - } - - if (parser->flags & F_SKIPBODY) { - UPDATE_STATE(NEW_MESSAGE()); - CALLBACK_NOTIFY(message_complete); - } else if (parser->flags & F_CHUNKED) { - /* chunked encoding - ignore Content-Length header */ - UPDATE_STATE(s_chunk_size_start); - } else { - if (parser->content_length == 0) { - /* Content-Length header given but zero: Content-Length: 0\r\n */ - UPDATE_STATE(NEW_MESSAGE()); - CALLBACK_NOTIFY(message_complete); - } else if (parser->content_length != ULLONG_MAX) { - /* Content-Length header given and non-zero */ - UPDATE_STATE(s_body_identity); - } else { - if (parser->type == HTTP_REQUEST || - !http_message_needs_eof(parser)) { - /* Assume content-length 0 - read the next */ - UPDATE_STATE(NEW_MESSAGE()); - CALLBACK_NOTIFY(message_complete); - } else { - /* Read body until EOF */ - UPDATE_STATE(s_body_identity_eof); - } - } - } - - break; - } - - case s_body_identity: - { - uint64_t to_read = MIN(parser->content_length, - (uint64_t) ((data + len) - p)); - - assert(parser->content_length != 0 - && parser->content_length != ULLONG_MAX); - - /* The difference between advancing content_length and p is because - * the latter will automaticaly advance on the next loop iteration. - * Further, if content_length ends up at 0, we want to see the last - * byte again for our message complete callback. - */ - MARK(body); - parser->content_length -= to_read; - p += to_read - 1; - - if (parser->content_length == 0) { - UPDATE_STATE(s_message_done); - - /* Mimic CALLBACK_DATA_NOADVANCE() but with one extra byte. - * - * The alternative to doing this is to wait for the next byte to - * trigger the data callback, just as in every other case. The - * problem with this is that this makes it difficult for the test - * harness to distinguish between complete-on-EOF and - * complete-on-length. It's not clear that this distinction is - * important for applications, but let's keep it for now. - */ - CALLBACK_DATA_(body, p - body_mark + 1, p - data); - REEXECUTE(); - } - - break; - } - - /* read until EOF */ - case s_body_identity_eof: - MARK(body); - p = data + len - 1; - - break; - - case s_message_done: - UPDATE_STATE(NEW_MESSAGE()); - CALLBACK_NOTIFY(message_complete); - if (parser->upgrade) { - /* Exit, the rest of the message is in a different protocol. */ - RETURN((p - data) + 1); - } - break; - - case s_chunk_size_start: - { - assert(parser->nread == 1); - assert(parser->flags & F_CHUNKED); - - unhex_val = unhex[(unsigned char)ch]; - if (UNLIKELY(unhex_val == -1)) { - SET_ERRNO(HPE_INVALID_CHUNK_SIZE); - goto error; - } - - parser->content_length = unhex_val; - UPDATE_STATE(s_chunk_size); - break; - } - - case s_chunk_size: - { - uint64_t t; - - assert(parser->flags & F_CHUNKED); - - if (ch == CR) { - UPDATE_STATE(s_chunk_size_almost_done); - break; - } - - unhex_val = unhex[(unsigned char)ch]; - - if (unhex_val == -1) { - if (ch == ';' || ch == ' ') { - UPDATE_STATE(s_chunk_parameters); - break; - } - - SET_ERRNO(HPE_INVALID_CHUNK_SIZE); - goto error; - } - - t = parser->content_length; - t *= 16; - t += unhex_val; - - /* Overflow? Test against a conservative limit for simplicity. */ - if (UNLIKELY((ULLONG_MAX - 16) / 16 < parser->content_length)) { - SET_ERRNO(HPE_INVALID_CONTENT_LENGTH); - goto error; - } - - parser->content_length = t; - break; - } - - case s_chunk_parameters: - { - assert(parser->flags & F_CHUNKED); - /* just ignore this shit. TODO check for overflow */ - if (ch == CR) { - UPDATE_STATE(s_chunk_size_almost_done); - break; - } - break; - } - - case s_chunk_size_almost_done: - { - assert(parser->flags & F_CHUNKED); - STRICT_CHECK(ch != LF); - - parser->nread = 0; - - if (parser->content_length == 0) { - parser->flags |= F_TRAILING; - UPDATE_STATE(s_header_field_start); - } else { - UPDATE_STATE(s_chunk_data); - } - CALLBACK_NOTIFY(chunk_header); - break; - } - - case s_chunk_data: - { - uint64_t to_read = MIN(parser->content_length, - (uint64_t) ((data + len) - p)); - - assert(parser->flags & F_CHUNKED); - assert(parser->content_length != 0 - && parser->content_length != ULLONG_MAX); - - /* See the explanation in s_body_identity for why the content - * length and data pointers are managed this way. - */ - MARK(body); - parser->content_length -= to_read; - p += to_read - 1; - - if (parser->content_length == 0) { - UPDATE_STATE(s_chunk_data_almost_done); - } - - break; - } - - case s_chunk_data_almost_done: - assert(parser->flags & F_CHUNKED); - assert(parser->content_length == 0); - STRICT_CHECK(ch != CR); - UPDATE_STATE(s_chunk_data_done); - CALLBACK_DATA(body); - break; - - case s_chunk_data_done: - assert(parser->flags & F_CHUNKED); - STRICT_CHECK(ch != LF); - parser->nread = 0; - UPDATE_STATE(s_chunk_size_start); - CALLBACK_NOTIFY(chunk_complete); - break; - - default: - assert(0 && "unhandled state"); - SET_ERRNO(HPE_INVALID_INTERNAL_STATE); - goto error; - } - } - - /* Run callbacks for any marks that we have leftover after we ran our of - * bytes. There should be at most one of these set, so it's OK to invoke - * them in series (unset marks will not result in callbacks). - * - * We use the NOADVANCE() variety of callbacks here because 'p' has already - * overflowed 'data' and this allows us to correct for the off-by-one that - * we'd otherwise have (since CALLBACK_DATA() is meant to be run with a 'p' - * value that's in-bounds). - */ - - assert(((header_field_mark ? 1 : 0) + - (header_value_mark ? 1 : 0) + - (url_mark ? 1 : 0) + - (body_mark ? 1 : 0) + - (status_mark ? 1 : 0)) <= 1); - - CALLBACK_DATA_NOADVANCE(header_field); - CALLBACK_DATA_NOADVANCE(header_value); - CALLBACK_DATA_NOADVANCE(url); - CALLBACK_DATA_NOADVANCE(body); - CALLBACK_DATA_NOADVANCE(status); - - RETURN(len); - -error: - if (HTTP_PARSER_ERRNO(parser) == HPE_OK) { - SET_ERRNO(HPE_UNKNOWN); - } - - RETURN(p - data); -} - - -/* Does the parser need to see an EOF to find the end of the message? */ -int -http_message_needs_eof (const http_parser *parser) -{ - if (parser->type == HTTP_REQUEST) { - return 0; - } - - /* See RFC 2616 section 4.4 */ - if (parser->status_code / 100 == 1 || /* 1xx e.g. Continue */ - parser->status_code == 204 || /* No Content */ - parser->status_code == 304 || /* Not Modified */ - parser->flags & F_SKIPBODY) { /* response to a HEAD request */ - return 0; - } - - if ((parser->flags & F_CHUNKED) || parser->content_length != ULLONG_MAX) { - return 0; - } - - return 1; -} - - -int -http_should_keep_alive (const http_parser *parser) -{ - if (parser->http_major > 0 && parser->http_minor > 0) { - /* HTTP/1.1 */ - if (parser->flags & F_CONNECTION_CLOSE) { - return 0; - } - } else { - /* HTTP/1.0 or earlier */ - if (!(parser->flags & F_CONNECTION_KEEP_ALIVE)) { - return 0; - } - } - - return !http_message_needs_eof(parser); -} - - -const char * -http_method_str (enum http_method m) -{ - return ELEM_AT(method_strings, m, ""); -} - - -void -http_parser_init (http_parser *parser, enum http_parser_type t) -{ - void *data = parser->data; /* preserve application data */ - memset(parser, 0, sizeof(*parser)); - parser->data = data; - parser->type = t; - parser->state = (t == HTTP_REQUEST ? s_start_req : (t == HTTP_RESPONSE ? s_start_res : s_start_req_or_res)); - parser->http_errno = HPE_OK; -} - -void -http_parser_settings_init(http_parser_settings *settings) -{ - memset(settings, 0, sizeof(*settings)); -} - -const char * -http_errno_name(enum http_errno err) { - assert(((size_t) err) < - (sizeof(http_strerror_tab) / sizeof(http_strerror_tab[0]))); - return http_strerror_tab[err].name; -} - -const char * -http_errno_description(enum http_errno err) { - assert(((size_t) err) < - (sizeof(http_strerror_tab) / sizeof(http_strerror_tab[0]))); - return http_strerror_tab[err].description; -} - -static enum http_host_state -http_parse_host_char(enum http_host_state s, const char ch) { - switch(s) { - case s_http_userinfo: - case s_http_userinfo_start: - if (ch == '@') { - return s_http_host_start; - } - - if (IS_USERINFO_CHAR(ch)) { - return s_http_userinfo; - } - break; - - case s_http_host_start: - if (ch == '[') { - return s_http_host_v6_start; - } - - if (IS_HOST_CHAR(ch)) { - return s_http_host; - } - - break; - - case s_http_host: - if (IS_HOST_CHAR(ch)) { - return s_http_host; - } - - /* FALLTHROUGH */ - case s_http_host_v6_end: - if (ch == ':') { - return s_http_host_port_start; - } - - break; - - case s_http_host_v6: - if (ch == ']') { - return s_http_host_v6_end; - } - - /* FALLTHROUGH */ - case s_http_host_v6_start: - if (IS_HEX(ch) || ch == ':' || ch == '.') { - return s_http_host_v6; - } - - break; - - case s_http_host_port: - case s_http_host_port_start: - if (IS_NUM(ch)) { - return s_http_host_port; - } - - break; - - default: - break; - } - return s_http_host_dead; -} - -static int -http_parse_host(const char * buf, struct http_parser_url *u, int found_at) { - enum http_host_state s; - - const char *p; - size_t buflen = u->field_data[UF_HOST].off + u->field_data[UF_HOST].len; - - u->field_data[UF_HOST].len = 0; - - s = found_at ? s_http_userinfo_start : s_http_host_start; - - for (p = buf + u->field_data[UF_HOST].off; p < buf + buflen; p++) { - enum http_host_state new_s = http_parse_host_char(s, *p); - - if (new_s == s_http_host_dead) { - return 1; - } - - switch(new_s) { - case s_http_host: - if (s != s_http_host) { - u->field_data[UF_HOST].off = p - buf; - } - u->field_data[UF_HOST].len++; - break; - - case s_http_host_v6: - if (s != s_http_host_v6) { - u->field_data[UF_HOST].off = p - buf; - } - u->field_data[UF_HOST].len++; - break; - - case s_http_host_port: - if (s != s_http_host_port) { - u->field_data[UF_PORT].off = p - buf; - u->field_data[UF_PORT].len = 0; - u->field_set |= (1 << UF_PORT); - } - u->field_data[UF_PORT].len++; - break; - - case s_http_userinfo: - if (s != s_http_userinfo) { - u->field_data[UF_USERINFO].off = p - buf ; - u->field_data[UF_USERINFO].len = 0; - u->field_set |= (1 << UF_USERINFO); - } - u->field_data[UF_USERINFO].len++; - break; - - default: - break; - } - s = new_s; - } - - /* Make sure we don't end somewhere unexpected */ - switch (s) { - case s_http_host_start: - case s_http_host_v6_start: - case s_http_host_v6: - case s_http_host_port_start: - case s_http_userinfo: - case s_http_userinfo_start: - return 1; - default: - break; - } - - return 0; -} - -int -http_parser_parse_url(const char *buf, size_t buflen, int is_connect, - struct http_parser_url *u) -{ - enum state s; - const char *p; - enum http_parser_url_fields uf, old_uf; - int found_at = 0; - - u->port = u->field_set = 0; - s = is_connect ? s_req_server_start : s_req_spaces_before_url; - old_uf = UF_MAX; - - for (p = buf; p < buf + buflen; p++) { - s = parse_url_char(s, *p); - - /* Figure out the next field that we're operating on */ - switch (s) { - case s_dead: - return 1; - - /* Skip delimeters */ - case s_req_schema_slash: - case s_req_schema_slash_slash: - case s_req_server_start: - case s_req_query_string_start: - case s_req_fragment_start: - continue; - - case s_req_schema: - uf = UF_SCHEMA; - break; - - case s_req_server_with_at: - found_at = 1; - - /* FALLTROUGH */ - case s_req_server: - uf = UF_HOST; - break; - - case s_req_path: - uf = UF_PATH; - break; - - case s_req_query_string: - uf = UF_QUERY; - break; - - case s_req_fragment: - uf = UF_FRAGMENT; - break; - - default: - assert(!"Unexpected state"); - return 1; - } - - /* Nothing's changed; soldier on */ - if (uf == old_uf) { - u->field_data[uf].len++; - continue; - } - - u->field_data[uf].off = p - buf; - u->field_data[uf].len = 1; - - u->field_set |= (1 << uf); - old_uf = uf; - } - - /* host must be present if there is a schema */ - /* parsing http:///toto will fail */ - if ((u->field_set & ((1 << UF_SCHEMA) | (1 << UF_HOST))) != 0) { - if (http_parse_host(buf, u, found_at) != 0) { - return 1; - } - } - - /* CONNECT requests can only contain "hostname:port" */ - if (is_connect && u->field_set != ((1 << UF_HOST)|(1 << UF_PORT))) { - return 1; - } - - if (u->field_set & (1 << UF_PORT)) { - /* Don't bother with endp; we've already validated the string */ - unsigned long v = strtoul(buf + u->field_data[UF_PORT].off, NULL, 10); - - /* Ports have a max value of 2^16 */ - if (v > 0xffff) { - return 1; - } - - u->port = (uint16_t) v; - } - - return 0; -} - -void -http_parser_pause(http_parser *parser, int paused) { - /* Users should only be pausing/unpausing a parser that is not in an error - * state. In non-debug builds, there's not much that we can do about this - * other than ignore it. - */ - if (HTTP_PARSER_ERRNO(parser) == HPE_OK || - HTTP_PARSER_ERRNO(parser) == HPE_PAUSED) { - SET_ERRNO((paused) ? HPE_PAUSED : HPE_OK); - } else { - assert(0 && "Attempting to pause parser in error state"); - } -} - -int -http_body_is_final(const struct http_parser *parser) { - return parser->state == s_message_done; -} - -unsigned long -http_parser_version(void) { - return HTTP_PARSER_VERSION_MAJOR * 0x10000 | - HTTP_PARSER_VERSION_MINOR * 0x00100 | - HTTP_PARSER_VERSION_PATCH * 0x00001; -} diff --git a/vendor/http_parser/http_parser.gyp b/vendor/http_parser/http_parser.gyp deleted file mode 100644 index ef34ecaeae..0000000000 --- a/vendor/http_parser/http_parser.gyp +++ /dev/null @@ -1,111 +0,0 @@ -# This file is used with the GYP meta build system. -# http://code.google.com/p/gyp/ -# To build try this: -# svn co http://gyp.googlecode.com/svn/trunk gyp -# ./gyp/gyp -f make --depth=`pwd` http_parser.gyp -# ./out/Debug/test -{ - 'target_defaults': { - 'default_configuration': 'Debug', - 'configurations': { - # TODO: hoist these out and put them somewhere common, because - # RuntimeLibrary MUST MATCH across the entire project - 'Debug': { - 'defines': [ 'DEBUG', '_DEBUG' ], - 'cflags': [ '-Wall', '-Wextra', '-O0', '-g', '-ftrapv' ], - 'msvs_settings': { - 'VCCLCompilerTool': { - 'RuntimeLibrary': 1, # static debug - }, - }, - }, - 'Release': { - 'defines': [ 'NDEBUG' ], - 'cflags': [ '-Wall', '-Wextra', '-O3' ], - 'msvs_settings': { - 'VCCLCompilerTool': { - 'RuntimeLibrary': 0, # static release - }, - }, - } - }, - 'msvs_settings': { - 'VCCLCompilerTool': { - }, - 'VCLibrarianTool': { - }, - 'VCLinkerTool': { - 'GenerateDebugInformation': 'true', - }, - }, - 'conditions': [ - ['OS == "win"', { - 'defines': [ - 'WIN32' - ], - }] - ], - }, - - 'targets': [ - { - 'target_name': 'http_parser', - 'type': 'static_library', - 'include_dirs': [ '.' ], - 'direct_dependent_settings': { - 'defines': [ 'HTTP_PARSER_STRICT=0' ], - 'include_dirs': [ '.' ], - }, - 'defines': [ 'HTTP_PARSER_STRICT=0' ], - 'sources': [ './http_parser.c', ], - 'conditions': [ - ['OS=="win"', { - 'msvs_settings': { - 'VCCLCompilerTool': { - # Compile as C++. http_parser.c is actually C99, but C++ is - # close enough in this case. - 'CompileAs': 2, - }, - }, - }] - ], - }, - - { - 'target_name': 'http_parser_strict', - 'type': 'static_library', - 'include_dirs': [ '.' ], - 'direct_dependent_settings': { - 'defines': [ 'HTTP_PARSER_STRICT=1' ], - 'include_dirs': [ '.' ], - }, - 'defines': [ 'HTTP_PARSER_STRICT=1' ], - 'sources': [ './http_parser.c', ], - 'conditions': [ - ['OS=="win"', { - 'msvs_settings': { - 'VCCLCompilerTool': { - # Compile as C++. http_parser.c is actually C99, but C++ is - # close enough in this case. - 'CompileAs': 2, - }, - }, - }] - ], - }, - - { - 'target_name': 'test-nonstrict', - 'type': 'executable', - 'dependencies': [ 'http_parser' ], - 'sources': [ 'test.c' ] - }, - - { - 'target_name': 'test-strict', - 'type': 'executable', - 'dependencies': [ 'http_parser_strict' ], - 'sources': [ 'test.c' ] - } - ] -} diff --git a/vendor/http_parser/http_parser.h b/vendor/http_parser/http_parser.h deleted file mode 100644 index eb71bf9921..0000000000 --- a/vendor/http_parser/http_parser.h +++ /dev/null @@ -1,342 +0,0 @@ -/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to - * deal in the Software without restriction, including without limitation the - * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - * sell copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS - * IN THE SOFTWARE. - */ -#ifndef http_parser_h -#define http_parser_h -#ifdef __cplusplus -extern "C" { -#endif - -/* Also update SONAME in the Makefile whenever you change these. */ -#define HTTP_PARSER_VERSION_MAJOR 2 -#define HTTP_PARSER_VERSION_MINOR 5 -#define HTTP_PARSER_VERSION_PATCH 0 - -#include -#if defined(_WIN32) && !defined(__MINGW32__) && (!defined(_MSC_VER) || _MSC_VER<1600) -#include -#include -typedef __int8 int8_t; -typedef unsigned __int8 uint8_t; -typedef __int16 int16_t; -typedef unsigned __int16 uint16_t; -typedef __int32 int32_t; -typedef unsigned __int32 uint32_t; -typedef __int64 int64_t; -typedef unsigned __int64 uint64_t; -#else -#include -#endif - -/* Compile with -DHTTP_PARSER_STRICT=0 to make less checks, but run - * faster - */ -#ifndef HTTP_PARSER_STRICT -# define HTTP_PARSER_STRICT 1 -#endif - -/* Maximium header size allowed. If the macro is not defined - * before including this header then the default is used. To - * change the maximum header size, define the macro in the build - * environment (e.g. -DHTTP_MAX_HEADER_SIZE=). To remove - * the effective limit on the size of the header, define the macro - * to a very large number (e.g. -DHTTP_MAX_HEADER_SIZE=0x7fffffff) - */ -#ifndef HTTP_MAX_HEADER_SIZE -# define HTTP_MAX_HEADER_SIZE (80*1024) -#endif - -typedef struct http_parser http_parser; -typedef struct http_parser_settings http_parser_settings; - - -/* Callbacks should return non-zero to indicate an error. The parser will - * then halt execution. - * - * The one exception is on_headers_complete. In a HTTP_RESPONSE parser - * returning '1' from on_headers_complete will tell the parser that it - * should not expect a body. This is used when receiving a response to a - * HEAD request which may contain 'Content-Length' or 'Transfer-Encoding: - * chunked' headers that indicate the presence of a body. - * - * http_data_cb does not return data chunks. It will be called arbitrarily - * many times for each string. E.G. you might get 10 callbacks for "on_url" - * each providing just a few characters more data. - */ -typedef int (*http_data_cb) (http_parser*, const char *at, size_t length); -typedef int (*http_cb) (http_parser*); - - -/* Request Methods */ -#define HTTP_METHOD_MAP(XX) \ - XX(0, DELETE, DELETE) \ - XX(1, GET, GET) \ - XX(2, HEAD, HEAD) \ - XX(3, POST, POST) \ - XX(4, PUT, PUT) \ - /* pathological */ \ - XX(5, CONNECT, CONNECT) \ - XX(6, OPTIONS, OPTIONS) \ - XX(7, TRACE, TRACE) \ - /* webdav */ \ - XX(8, COPY, COPY) \ - XX(9, LOCK, LOCK) \ - XX(10, MKCOL, MKCOL) \ - XX(11, MOVE, MOVE) \ - XX(12, PROPFIND, PROPFIND) \ - XX(13, PROPPATCH, PROPPATCH) \ - XX(14, SEARCH, SEARCH) \ - XX(15, UNLOCK, UNLOCK) \ - /* subversion */ \ - XX(16, REPORT, REPORT) \ - XX(17, MKACTIVITY, MKACTIVITY) \ - XX(18, CHECKOUT, CHECKOUT) \ - XX(19, MERGE, MERGE) \ - /* upnp */ \ - XX(20, MSEARCH, M-SEARCH) \ - XX(21, NOTIFY, NOTIFY) \ - XX(22, SUBSCRIBE, SUBSCRIBE) \ - XX(23, UNSUBSCRIBE, UNSUBSCRIBE) \ - /* RFC-5789 */ \ - XX(24, PATCH, PATCH) \ - XX(25, PURGE, PURGE) \ - /* CalDAV */ \ - XX(26, MKCALENDAR, MKCALENDAR) \ - -enum http_method - { -#define XX(num, name, string) HTTP_##name = num, - HTTP_METHOD_MAP(XX) -#undef XX - }; - - -enum http_parser_type { HTTP_REQUEST, HTTP_RESPONSE, HTTP_BOTH }; - - -/* Flag values for http_parser.flags field */ -enum flags - { F_CHUNKED = 1 << 0 - , F_CONNECTION_KEEP_ALIVE = 1 << 1 - , F_CONNECTION_CLOSE = 1 << 2 - , F_CONNECTION_UPGRADE = 1 << 3 - , F_TRAILING = 1 << 4 - , F_UPGRADE = 1 << 5 - , F_SKIPBODY = 1 << 6 - }; - - -/* Map for errno-related constants - * - * The provided argument should be a macro that takes 2 arguments. - */ -#define HTTP_ERRNO_MAP(XX) \ - /* No error */ \ - XX(OK, "success") \ - \ - /* Callback-related errors */ \ - XX(CB_message_begin, "the on_message_begin callback failed") \ - XX(CB_url, "the on_url callback failed") \ - XX(CB_header_field, "the on_header_field callback failed") \ - XX(CB_header_value, "the on_header_value callback failed") \ - XX(CB_headers_complete, "the on_headers_complete callback failed") \ - XX(CB_body, "the on_body callback failed") \ - XX(CB_message_complete, "the on_message_complete callback failed") \ - XX(CB_status, "the on_status callback failed") \ - XX(CB_chunk_header, "the on_chunk_header callback failed") \ - XX(CB_chunk_complete, "the on_chunk_complete callback failed") \ - \ - /* Parsing-related errors */ \ - XX(INVALID_EOF_STATE, "stream ended at an unexpected time") \ - XX(HEADER_OVERFLOW, \ - "too many header bytes seen; overflow detected") \ - XX(CLOSED_CONNECTION, \ - "data received after completed connection: close message") \ - XX(INVALID_VERSION, "invalid HTTP version") \ - XX(INVALID_STATUS, "invalid HTTP status code") \ - XX(INVALID_METHOD, "invalid HTTP method") \ - XX(INVALID_URL, "invalid URL") \ - XX(INVALID_HOST, "invalid host") \ - XX(INVALID_PORT, "invalid port") \ - XX(INVALID_PATH, "invalid path") \ - XX(INVALID_QUERY_STRING, "invalid query string") \ - XX(INVALID_FRAGMENT, "invalid fragment") \ - XX(LF_EXPECTED, "LF character expected") \ - XX(INVALID_HEADER_TOKEN, "invalid character in header") \ - XX(INVALID_CONTENT_LENGTH, \ - "invalid character in content-length header") \ - XX(INVALID_CHUNK_SIZE, \ - "invalid character in chunk size header") \ - XX(INVALID_CONSTANT, "invalid constant string") \ - XX(INVALID_INTERNAL_STATE, "encountered unexpected internal state")\ - XX(STRICT, "strict mode assertion failed") \ - XX(PAUSED, "parser is paused") \ - XX(UNKNOWN, "an unknown error occurred") - - -/* Define HPE_* values for each errno value above */ -#define HTTP_ERRNO_GEN(n, s) HPE_##n, -enum http_errno { - HTTP_ERRNO_MAP(HTTP_ERRNO_GEN) -}; -#undef HTTP_ERRNO_GEN - - -/* Get an http_errno value from an http_parser */ -#define HTTP_PARSER_ERRNO(p) ((enum http_errno) (p)->http_errno) - - -struct http_parser { - /** PRIVATE **/ - unsigned int type : 2; /* enum http_parser_type */ - unsigned int flags : 7; /* F_* values from 'flags' enum; semi-public */ - unsigned int state : 7; /* enum state from http_parser.c */ - unsigned int header_state : 8; /* enum header_state from http_parser.c */ - unsigned int index : 8; /* index into current matcher */ - - uint32_t nread; /* # bytes read in various scenarios */ - uint64_t content_length; /* # bytes in body (0 if no Content-Length header) */ - - /** READ-ONLY **/ - unsigned short http_major; - unsigned short http_minor; - unsigned int status_code : 16; /* responses only */ - unsigned int method : 8; /* requests only */ - unsigned int http_errno : 7; - - /* 1 = Upgrade header was present and the parser has exited because of that. - * 0 = No upgrade header present. - * Should be checked when http_parser_execute() returns in addition to - * error checking. - */ - unsigned int upgrade : 1; - - /** PUBLIC **/ - void *data; /* A pointer to get hook to the "connection" or "socket" object */ -}; - - -struct http_parser_settings { - http_cb on_message_begin; - http_data_cb on_url; - http_data_cb on_status; - http_data_cb on_header_field; - http_data_cb on_header_value; - http_cb on_headers_complete; - http_data_cb on_body; - http_cb on_message_complete; - /* When on_chunk_header is called, the current chunk length is stored - * in parser->content_length. - */ - http_cb on_chunk_header; - http_cb on_chunk_complete; -}; - - -enum http_parser_url_fields - { UF_SCHEMA = 0 - , UF_HOST = 1 - , UF_PORT = 2 - , UF_PATH = 3 - , UF_QUERY = 4 - , UF_FRAGMENT = 5 - , UF_USERINFO = 6 - , UF_MAX = 7 - }; - - -/* Result structure for http_parser_parse_url(). - * - * Callers should index into field_data[] with UF_* values iff field_set - * has the relevant (1 << UF_*) bit set. As a courtesy to clients (and - * because we probably have padding left over), we convert any port to - * a uint16_t. - */ -struct http_parser_url { - uint16_t field_set; /* Bitmask of (1 << UF_*) values */ - uint16_t port; /* Converted UF_PORT string */ - - struct { - uint16_t off; /* Offset into buffer in which field starts */ - uint16_t len; /* Length of run in buffer */ - } field_data[UF_MAX]; -}; - - -/* Returns the library version. Bits 16-23 contain the major version number, - * bits 8-15 the minor version number and bits 0-7 the patch level. - * Usage example: - * - * unsigned long version = http_parser_version(); - * unsigned major = (version >> 16) & 255; - * unsigned minor = (version >> 8) & 255; - * unsigned patch = version & 255; - * printf("http_parser v%u.%u.%u\n", major, minor, patch); - */ -unsigned long http_parser_version(void); - -void http_parser_init(http_parser *parser, enum http_parser_type type); - - -/* Initialize http_parser_settings members to 0 - */ -void http_parser_settings_init(http_parser_settings *settings); - - -/* Executes the parser. Returns number of parsed bytes. Sets - * `parser->http_errno` on error. */ -size_t http_parser_execute(http_parser *parser, - const http_parser_settings *settings, - const char *data, - size_t len); - - -/* If http_should_keep_alive() in the on_headers_complete or - * on_message_complete callback returns 0, then this should be - * the last message on the connection. - * If you are the server, respond with the "Connection: close" header. - * If you are the client, close the connection. - */ -int http_should_keep_alive(const http_parser *parser); - -/* Returns a string version of the HTTP method. */ -const char *http_method_str(enum http_method m); - -/* Return a string name of the given error */ -const char *http_errno_name(enum http_errno err); - -/* Return a string description of the given error */ -const char *http_errno_description(enum http_errno err); - -/* Parse a URL; return nonzero on failure */ -int http_parser_parse_url(const char *buf, size_t buflen, - int is_connect, - struct http_parser_url *u); - -/* Pause or un-pause the parser; a nonzero value pauses */ -void http_parser_pause(http_parser *parser, int paused); - -/* Checks if this is the final chunk of the body. */ -int http_body_is_final(const http_parser *parser); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/vendor/http_parser/test.c b/vendor/http_parser/test.c deleted file mode 100644 index 4c00571eba..0000000000 --- a/vendor/http_parser/test.c +++ /dev/null @@ -1,3852 +0,0 @@ -/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to - * deal in the Software without restriction, including without limitation the - * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - * sell copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS - * IN THE SOFTWARE. - */ -#include "http_parser.h" -#include -#include -#include -#include /* rand */ -#include -#include - -#if defined(__APPLE__) -# undef strlcat -# undef strlncpy -# undef strlcpy -#endif /* defined(__APPLE__) */ - -#undef TRUE -#define TRUE 1 -#undef FALSE -#define FALSE 0 - -#define MAX_HEADERS 13 -#define MAX_ELEMENT_SIZE 2048 -#define MAX_CHUNKS 16 - -#define MIN(a,b) ((a) < (b) ? (a) : (b)) - -static http_parser *parser; - -struct message { - const char *name; // for debugging purposes - const char *raw; - enum http_parser_type type; - enum http_method method; - int status_code; - char response_status[MAX_ELEMENT_SIZE]; - char request_path[MAX_ELEMENT_SIZE]; - char request_url[MAX_ELEMENT_SIZE]; - char fragment[MAX_ELEMENT_SIZE]; - char query_string[MAX_ELEMENT_SIZE]; - char body[MAX_ELEMENT_SIZE]; - size_t body_size; - const char *host; - const char *userinfo; - uint16_t port; - int num_headers; - enum { NONE=0, FIELD, VALUE } last_header_element; - char headers [MAX_HEADERS][2][MAX_ELEMENT_SIZE]; - int should_keep_alive; - - int num_chunks; - int num_chunks_complete; - int chunk_lengths[MAX_CHUNKS]; - - const char *upgrade; // upgraded body - - unsigned short http_major; - unsigned short http_minor; - - int message_begin_cb_called; - int headers_complete_cb_called; - int message_complete_cb_called; - int message_complete_on_eof; - int body_is_final; -}; - -static int currently_parsing_eof; - -static struct message messages[5]; -static int num_messages; -static http_parser_settings *current_pause_parser; - -/* * R E Q U E S T S * */ -const struct message requests[] = -#define CURL_GET 0 -{ {.name= "curl get" - ,.type= HTTP_REQUEST - ,.raw= "GET /test HTTP/1.1\r\n" - "User-Agent: curl/7.18.0 (i486-pc-linux-gnu) libcurl/7.18.0 OpenSSL/0.9.8g zlib/1.2.3.3 libidn/1.1\r\n" - "Host: 0.0.0.0=5000\r\n" - "Accept: */*\r\n" - "\r\n" - ,.should_keep_alive= TRUE - ,.message_complete_on_eof= FALSE - ,.http_major= 1 - ,.http_minor= 1 - ,.method= HTTP_GET - ,.query_string= "" - ,.fragment= "" - ,.request_path= "/test" - ,.request_url= "/test" - ,.num_headers= 3 - ,.headers= - { { "User-Agent", "curl/7.18.0 (i486-pc-linux-gnu) libcurl/7.18.0 OpenSSL/0.9.8g zlib/1.2.3.3 libidn/1.1" } - , { "Host", "0.0.0.0=5000" } - , { "Accept", "*/*" } - } - ,.body= "" - } - -#define FIREFOX_GET 1 -, {.name= "firefox get" - ,.type= HTTP_REQUEST - ,.raw= "GET /favicon.ico HTTP/1.1\r\n" - "Host: 0.0.0.0=5000\r\n" - "User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9) Gecko/2008061015 Firefox/3.0\r\n" - "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n" - "Accept-Language: en-us,en;q=0.5\r\n" - "Accept-Encoding: gzip,deflate\r\n" - "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n" - "Keep-Alive: 300\r\n" - "Connection: keep-alive\r\n" - "\r\n" - ,.should_keep_alive= TRUE - ,.message_complete_on_eof= FALSE - ,.http_major= 1 - ,.http_minor= 1 - ,.method= HTTP_GET - ,.query_string= "" - ,.fragment= "" - ,.request_path= "/favicon.ico" - ,.request_url= "/favicon.ico" - ,.num_headers= 8 - ,.headers= - { { "Host", "0.0.0.0=5000" } - , { "User-Agent", "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9) Gecko/2008061015 Firefox/3.0" } - , { "Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" } - , { "Accept-Language", "en-us,en;q=0.5" } - , { "Accept-Encoding", "gzip,deflate" } - , { "Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.7" } - , { "Keep-Alive", "300" } - , { "Connection", "keep-alive" } - } - ,.body= "" - } - -#define DUMBFUCK 2 -, {.name= "dumbfuck" - ,.type= HTTP_REQUEST - ,.raw= "GET /dumbfuck HTTP/1.1\r\n" - "aaaaaaaaaaaaa:++++++++++\r\n" - "\r\n" - ,.should_keep_alive= TRUE - ,.message_complete_on_eof= FALSE - ,.http_major= 1 - ,.http_minor= 1 - ,.method= HTTP_GET - ,.query_string= "" - ,.fragment= "" - ,.request_path= "/dumbfuck" - ,.request_url= "/dumbfuck" - ,.num_headers= 1 - ,.headers= - { { "aaaaaaaaaaaaa", "++++++++++" } - } - ,.body= "" - } - -#define FRAGMENT_IN_URI 3 -, {.name= "fragment in url" - ,.type= HTTP_REQUEST - ,.raw= "GET /forums/1/topics/2375?page=1#posts-17408 HTTP/1.1\r\n" - "\r\n" - ,.should_keep_alive= TRUE - ,.message_complete_on_eof= FALSE - ,.http_major= 1 - ,.http_minor= 1 - ,.method= HTTP_GET - ,.query_string= "page=1" - ,.fragment= "posts-17408" - ,.request_path= "/forums/1/topics/2375" - /* XXX request url does include fragment? */ - ,.request_url= "/forums/1/topics/2375?page=1#posts-17408" - ,.num_headers= 0 - ,.body= "" - } - -#define GET_NO_HEADERS_NO_BODY 4 -, {.name= "get no headers no body" - ,.type= HTTP_REQUEST - ,.raw= "GET /get_no_headers_no_body/world HTTP/1.1\r\n" - "\r\n" - ,.should_keep_alive= TRUE - ,.message_complete_on_eof= FALSE /* would need Connection: close */ - ,.http_major= 1 - ,.http_minor= 1 - ,.method= HTTP_GET - ,.query_string= "" - ,.fragment= "" - ,.request_path= "/get_no_headers_no_body/world" - ,.request_url= "/get_no_headers_no_body/world" - ,.num_headers= 0 - ,.body= "" - } - -#define GET_ONE_HEADER_NO_BODY 5 -, {.name= "get one header no body" - ,.type= HTTP_REQUEST - ,.raw= "GET /get_one_header_no_body HTTP/1.1\r\n" - "Accept: */*\r\n" - "\r\n" - ,.should_keep_alive= TRUE - ,.message_complete_on_eof= FALSE /* would need Connection: close */ - ,.http_major= 1 - ,.http_minor= 1 - ,.method= HTTP_GET - ,.query_string= "" - ,.fragment= "" - ,.request_path= "/get_one_header_no_body" - ,.request_url= "/get_one_header_no_body" - ,.num_headers= 1 - ,.headers= - { { "Accept" , "*/*" } - } - ,.body= "" - } - -#define GET_FUNKY_CONTENT_LENGTH 6 -, {.name= "get funky content length body hello" - ,.type= HTTP_REQUEST - ,.raw= "GET /get_funky_content_length_body_hello HTTP/1.0\r\n" - "conTENT-Length: 5\r\n" - "\r\n" - "HELLO" - ,.should_keep_alive= FALSE - ,.message_complete_on_eof= FALSE - ,.http_major= 1 - ,.http_minor= 0 - ,.method= HTTP_GET - ,.query_string= "" - ,.fragment= "" - ,.request_path= "/get_funky_content_length_body_hello" - ,.request_url= "/get_funky_content_length_body_hello" - ,.num_headers= 1 - ,.headers= - { { "conTENT-Length" , "5" } - } - ,.body= "HELLO" - } - -#define POST_IDENTITY_BODY_WORLD 7 -, {.name= "post identity body world" - ,.type= HTTP_REQUEST - ,.raw= "POST /post_identity_body_world?q=search#hey HTTP/1.1\r\n" - "Accept: */*\r\n" - "Transfer-Encoding: identity\r\n" - "Content-Length: 5\r\n" - "\r\n" - "World" - ,.should_keep_alive= TRUE - ,.message_complete_on_eof= FALSE - ,.http_major= 1 - ,.http_minor= 1 - ,.method= HTTP_POST - ,.query_string= "q=search" - ,.fragment= "hey" - ,.request_path= "/post_identity_body_world" - ,.request_url= "/post_identity_body_world?q=search#hey" - ,.num_headers= 3 - ,.headers= - { { "Accept", "*/*" } - , { "Transfer-Encoding", "identity" } - , { "Content-Length", "5" } - } - ,.body= "World" - } - -#define POST_CHUNKED_ALL_YOUR_BASE 8 -, {.name= "post - chunked body: all your base are belong to us" - ,.type= HTTP_REQUEST - ,.raw= "POST /post_chunked_all_your_base HTTP/1.1\r\n" - "Transfer-Encoding: chunked\r\n" - "\r\n" - "1e\r\nall your base are belong to us\r\n" - "0\r\n" - "\r\n" - ,.should_keep_alive= TRUE - ,.message_complete_on_eof= FALSE - ,.http_major= 1 - ,.http_minor= 1 - ,.method= HTTP_POST - ,.query_string= "" - ,.fragment= "" - ,.request_path= "/post_chunked_all_your_base" - ,.request_url= "/post_chunked_all_your_base" - ,.num_headers= 1 - ,.headers= - { { "Transfer-Encoding" , "chunked" } - } - ,.body= "all your base are belong to us" - ,.num_chunks_complete= 2 - ,.chunk_lengths= { 0x1e } - } - -#define TWO_CHUNKS_MULT_ZERO_END 9 -, {.name= "two chunks ; triple zero ending" - ,.type= HTTP_REQUEST - ,.raw= "POST /two_chunks_mult_zero_end HTTP/1.1\r\n" - "Transfer-Encoding: chunked\r\n" - "\r\n" - "5\r\nhello\r\n" - "6\r\n world\r\n" - "000\r\n" - "\r\n" - ,.should_keep_alive= TRUE - ,.message_complete_on_eof= FALSE - ,.http_major= 1 - ,.http_minor= 1 - ,.method= HTTP_POST - ,.query_string= "" - ,.fragment= "" - ,.request_path= "/two_chunks_mult_zero_end" - ,.request_url= "/two_chunks_mult_zero_end" - ,.num_headers= 1 - ,.headers= - { { "Transfer-Encoding", "chunked" } - } - ,.body= "hello world" - ,.num_chunks_complete= 3 - ,.chunk_lengths= { 5, 6 } - } - -#define CHUNKED_W_TRAILING_HEADERS 10 -, {.name= "chunked with trailing headers. blech." - ,.type= HTTP_REQUEST - ,.raw= "POST /chunked_w_trailing_headers HTTP/1.1\r\n" - "Transfer-Encoding: chunked\r\n" - "\r\n" - "5\r\nhello\r\n" - "6\r\n world\r\n" - "0\r\n" - "Vary: *\r\n" - "Content-Type: text/plain\r\n" - "\r\n" - ,.should_keep_alive= TRUE - ,.message_complete_on_eof= FALSE - ,.http_major= 1 - ,.http_minor= 1 - ,.method= HTTP_POST - ,.query_string= "" - ,.fragment= "" - ,.request_path= "/chunked_w_trailing_headers" - ,.request_url= "/chunked_w_trailing_headers" - ,.num_headers= 3 - ,.headers= - { { "Transfer-Encoding", "chunked" } - , { "Vary", "*" } - , { "Content-Type", "text/plain" } - } - ,.body= "hello world" - ,.num_chunks_complete= 3 - ,.chunk_lengths= { 5, 6 } - } - -#define CHUNKED_W_BULLSHIT_AFTER_LENGTH 11 -, {.name= "with bullshit after the length" - ,.type= HTTP_REQUEST - ,.raw= "POST /chunked_w_bullshit_after_length HTTP/1.1\r\n" - "Transfer-Encoding: chunked\r\n" - "\r\n" - "5; ihatew3;whatthefuck=aretheseparametersfor\r\nhello\r\n" - "6; blahblah; blah\r\n world\r\n" - "0\r\n" - "\r\n" - ,.should_keep_alive= TRUE - ,.message_complete_on_eof= FALSE - ,.http_major= 1 - ,.http_minor= 1 - ,.method= HTTP_POST - ,.query_string= "" - ,.fragment= "" - ,.request_path= "/chunked_w_bullshit_after_length" - ,.request_url= "/chunked_w_bullshit_after_length" - ,.num_headers= 1 - ,.headers= - { { "Transfer-Encoding", "chunked" } - } - ,.body= "hello world" - ,.num_chunks_complete= 3 - ,.chunk_lengths= { 5, 6 } - } - -#define WITH_QUOTES 12 -, {.name= "with quotes" - ,.type= HTTP_REQUEST - ,.raw= "GET /with_\"stupid\"_quotes?foo=\"bar\" HTTP/1.1\r\n\r\n" - ,.should_keep_alive= TRUE - ,.message_complete_on_eof= FALSE - ,.http_major= 1 - ,.http_minor= 1 - ,.method= HTTP_GET - ,.query_string= "foo=\"bar\"" - ,.fragment= "" - ,.request_path= "/with_\"stupid\"_quotes" - ,.request_url= "/with_\"stupid\"_quotes?foo=\"bar\"" - ,.num_headers= 0 - ,.headers= { } - ,.body= "" - } - -#define APACHEBENCH_GET 13 -/* The server receiving this request SHOULD NOT wait for EOF - * to know that content-length == 0. - * How to represent this in a unit test? message_complete_on_eof - * Compare with NO_CONTENT_LENGTH_RESPONSE. - */ -, {.name = "apachebench get" - ,.type= HTTP_REQUEST - ,.raw= "GET /test HTTP/1.0\r\n" - "Host: 0.0.0.0:5000\r\n" - "User-Agent: ApacheBench/2.3\r\n" - "Accept: */*\r\n\r\n" - ,.should_keep_alive= FALSE - ,.message_complete_on_eof= FALSE - ,.http_major= 1 - ,.http_minor= 0 - ,.method= HTTP_GET - ,.query_string= "" - ,.fragment= "" - ,.request_path= "/test" - ,.request_url= "/test" - ,.num_headers= 3 - ,.headers= { { "Host", "0.0.0.0:5000" } - , { "User-Agent", "ApacheBench/2.3" } - , { "Accept", "*/*" } - } - ,.body= "" - } - -#define QUERY_URL_WITH_QUESTION_MARK_GET 14 -/* Some clients include '?' characters in query strings. - */ -, {.name = "query url with question mark" - ,.type= HTTP_REQUEST - ,.raw= "GET /test.cgi?foo=bar?baz HTTP/1.1\r\n\r\n" - ,.should_keep_alive= TRUE - ,.message_complete_on_eof= FALSE - ,.http_major= 1 - ,.http_minor= 1 - ,.method= HTTP_GET - ,.query_string= "foo=bar?baz" - ,.fragment= "" - ,.request_path= "/test.cgi" - ,.request_url= "/test.cgi?foo=bar?baz" - ,.num_headers= 0 - ,.headers= {} - ,.body= "" - } - -#define PREFIX_NEWLINE_GET 15 -/* Some clients, especially after a POST in a keep-alive connection, - * will send an extra CRLF before the next request - */ -, {.name = "newline prefix get" - ,.type= HTTP_REQUEST - ,.raw= "\r\nGET /test HTTP/1.1\r\n\r\n" - ,.should_keep_alive= TRUE - ,.message_complete_on_eof= FALSE - ,.http_major= 1 - ,.http_minor= 1 - ,.method= HTTP_GET - ,.query_string= "" - ,.fragment= "" - ,.request_path= "/test" - ,.request_url= "/test" - ,.num_headers= 0 - ,.headers= { } - ,.body= "" - } - -#define UPGRADE_REQUEST 16 -, {.name = "upgrade request" - ,.type= HTTP_REQUEST - ,.raw= "GET /demo HTTP/1.1\r\n" - "Host: example.com\r\n" - "Connection: Upgrade\r\n" - "Sec-WebSocket-Key2: 12998 5 Y3 1 .P00\r\n" - "Sec-WebSocket-Protocol: sample\r\n" - "Upgrade: WebSocket\r\n" - "Sec-WebSocket-Key1: 4 @1 46546xW%0l 1 5\r\n" - "Origin: http://example.com\r\n" - "\r\n" - "Hot diggity dogg" - ,.should_keep_alive= TRUE - ,.message_complete_on_eof= FALSE - ,.http_major= 1 - ,.http_minor= 1 - ,.method= HTTP_GET - ,.query_string= "" - ,.fragment= "" - ,.request_path= "/demo" - ,.request_url= "/demo" - ,.num_headers= 7 - ,.upgrade="Hot diggity dogg" - ,.headers= { { "Host", "example.com" } - , { "Connection", "Upgrade" } - , { "Sec-WebSocket-Key2", "12998 5 Y3 1 .P00" } - , { "Sec-WebSocket-Protocol", "sample" } - , { "Upgrade", "WebSocket" } - , { "Sec-WebSocket-Key1", "4 @1 46546xW%0l 1 5" } - , { "Origin", "http://example.com" } - } - ,.body= "" - } - -#define CONNECT_REQUEST 17 -, {.name = "connect request" - ,.type= HTTP_REQUEST - ,.raw= "CONNECT 0-home0.netscape.com:443 HTTP/1.0\r\n" - "User-agent: Mozilla/1.1N\r\n" - "Proxy-authorization: basic aGVsbG86d29ybGQ=\r\n" - "\r\n" - "some data\r\n" - "and yet even more data" - ,.should_keep_alive= FALSE - ,.message_complete_on_eof= FALSE - ,.http_major= 1 - ,.http_minor= 0 - ,.method= HTTP_CONNECT - ,.query_string= "" - ,.fragment= "" - ,.request_path= "" - ,.request_url= "0-home0.netscape.com:443" - ,.num_headers= 2 - ,.upgrade="some data\r\nand yet even more data" - ,.headers= { { "User-agent", "Mozilla/1.1N" } - , { "Proxy-authorization", "basic aGVsbG86d29ybGQ=" } - } - ,.body= "" - } - -#define REPORT_REQ 18 -, {.name= "report request" - ,.type= HTTP_REQUEST - ,.raw= "REPORT /test HTTP/1.1\r\n" - "\r\n" - ,.should_keep_alive= TRUE - ,.message_complete_on_eof= FALSE - ,.http_major= 1 - ,.http_minor= 1 - ,.method= HTTP_REPORT - ,.query_string= "" - ,.fragment= "" - ,.request_path= "/test" - ,.request_url= "/test" - ,.num_headers= 0 - ,.headers= {} - ,.body= "" - } - -#define NO_HTTP_VERSION 19 -, {.name= "request with no http version" - ,.type= HTTP_REQUEST - ,.raw= "GET /\r\n" - "\r\n" - ,.should_keep_alive= FALSE - ,.message_complete_on_eof= FALSE - ,.http_major= 0 - ,.http_minor= 9 - ,.method= HTTP_GET - ,.query_string= "" - ,.fragment= "" - ,.request_path= "/" - ,.request_url= "/" - ,.num_headers= 0 - ,.headers= {} - ,.body= "" - } - -#define MSEARCH_REQ 20 -, {.name= "m-search request" - ,.type= HTTP_REQUEST - ,.raw= "M-SEARCH * HTTP/1.1\r\n" - "HOST: 239.255.255.250:1900\r\n" - "MAN: \"ssdp:discover\"\r\n" - "ST: \"ssdp:all\"\r\n" - "\r\n" - ,.should_keep_alive= TRUE - ,.message_complete_on_eof= FALSE - ,.http_major= 1 - ,.http_minor= 1 - ,.method= HTTP_MSEARCH - ,.query_string= "" - ,.fragment= "" - ,.request_path= "*" - ,.request_url= "*" - ,.num_headers= 3 - ,.headers= { { "HOST", "239.255.255.250:1900" } - , { "MAN", "\"ssdp:discover\"" } - , { "ST", "\"ssdp:all\"" } - } - ,.body= "" - } - -#define LINE_FOLDING_IN_HEADER 21 -, {.name= "line folding in header value" - ,.type= HTTP_REQUEST - ,.raw= "GET / HTTP/1.1\r\n" - "Line1: abc\r\n" - "\tdef\r\n" - " ghi\r\n" - "\t\tjkl\r\n" - " mno \r\n" - "\t \tqrs\r\n" - "Line2: \t line2\t\r\n" - "Line3:\r\n" - " line3\r\n" - "Line4: \r\n" - " \r\n" - "Connection:\r\n" - " close\r\n" - "\r\n" - ,.should_keep_alive= FALSE - ,.message_complete_on_eof= FALSE - ,.http_major= 1 - ,.http_minor= 1 - ,.method= HTTP_GET - ,.query_string= "" - ,.fragment= "" - ,.request_path= "/" - ,.request_url= "/" - ,.num_headers= 5 - ,.headers= { { "Line1", "abc\tdef ghi\t\tjkl mno \t \tqrs" } - , { "Line2", "line2\t" } - , { "Line3", "line3" } - , { "Line4", "" } - , { "Connection", "close" }, - } - ,.body= "" - } - - -#define QUERY_TERMINATED_HOST 22 -, {.name= "host terminated by a query string" - ,.type= HTTP_REQUEST - ,.raw= "GET http://hypnotoad.org?hail=all HTTP/1.1\r\n" - "\r\n" - ,.should_keep_alive= TRUE - ,.message_complete_on_eof= FALSE - ,.http_major= 1 - ,.http_minor= 1 - ,.method= HTTP_GET - ,.query_string= "hail=all" - ,.fragment= "" - ,.request_path= "" - ,.request_url= "http://hypnotoad.org?hail=all" - ,.host= "hypnotoad.org" - ,.num_headers= 0 - ,.headers= { } - ,.body= "" - } - -#define QUERY_TERMINATED_HOSTPORT 23 -, {.name= "host:port terminated by a query string" - ,.type= HTTP_REQUEST - ,.raw= "GET http://hypnotoad.org:1234?hail=all HTTP/1.1\r\n" - "\r\n" - ,.should_keep_alive= TRUE - ,.message_complete_on_eof= FALSE - ,.http_major= 1 - ,.http_minor= 1 - ,.method= HTTP_GET - ,.query_string= "hail=all" - ,.fragment= "" - ,.request_path= "" - ,.request_url= "http://hypnotoad.org:1234?hail=all" - ,.host= "hypnotoad.org" - ,.port= 1234 - ,.num_headers= 0 - ,.headers= { } - ,.body= "" - } - -#define SPACE_TERMINATED_HOSTPORT 24 -, {.name= "host:port terminated by a space" - ,.type= HTTP_REQUEST - ,.raw= "GET http://hypnotoad.org:1234 HTTP/1.1\r\n" - "\r\n" - ,.should_keep_alive= TRUE - ,.message_complete_on_eof= FALSE - ,.http_major= 1 - ,.http_minor= 1 - ,.method= HTTP_GET - ,.query_string= "" - ,.fragment= "" - ,.request_path= "" - ,.request_url= "http://hypnotoad.org:1234" - ,.host= "hypnotoad.org" - ,.port= 1234 - ,.num_headers= 0 - ,.headers= { } - ,.body= "" - } - -#define PATCH_REQ 25 -, {.name = "PATCH request" - ,.type= HTTP_REQUEST - ,.raw= "PATCH /file.txt HTTP/1.1\r\n" - "Host: www.example.com\r\n" - "Content-Type: application/example\r\n" - "If-Match: \"e0023aa4e\"\r\n" - "Content-Length: 10\r\n" - "\r\n" - "cccccccccc" - ,.should_keep_alive= TRUE - ,.message_complete_on_eof= FALSE - ,.http_major= 1 - ,.http_minor= 1 - ,.method= HTTP_PATCH - ,.query_string= "" - ,.fragment= "" - ,.request_path= "/file.txt" - ,.request_url= "/file.txt" - ,.num_headers= 4 - ,.headers= { { "Host", "www.example.com" } - , { "Content-Type", "application/example" } - , { "If-Match", "\"e0023aa4e\"" } - , { "Content-Length", "10" } - } - ,.body= "cccccccccc" - } - -#define CONNECT_CAPS_REQUEST 26 -, {.name = "connect caps request" - ,.type= HTTP_REQUEST - ,.raw= "CONNECT HOME0.NETSCAPE.COM:443 HTTP/1.0\r\n" - "User-agent: Mozilla/1.1N\r\n" - "Proxy-authorization: basic aGVsbG86d29ybGQ=\r\n" - "\r\n" - ,.should_keep_alive= FALSE - ,.message_complete_on_eof= FALSE - ,.http_major= 1 - ,.http_minor= 0 - ,.method= HTTP_CONNECT - ,.query_string= "" - ,.fragment= "" - ,.request_path= "" - ,.request_url= "HOME0.NETSCAPE.COM:443" - ,.num_headers= 2 - ,.upgrade="" - ,.headers= { { "User-agent", "Mozilla/1.1N" } - , { "Proxy-authorization", "basic aGVsbG86d29ybGQ=" } - } - ,.body= "" - } - -#if !HTTP_PARSER_STRICT -#define UTF8_PATH_REQ 27 -, {.name= "utf-8 path request" - ,.type= HTTP_REQUEST - ,.raw= "GET /δ¶/δt/pope?q=1#narf HTTP/1.1\r\n" - "Host: github.com\r\n" - "\r\n" - ,.should_keep_alive= TRUE - ,.message_complete_on_eof= FALSE - ,.http_major= 1 - ,.http_minor= 1 - ,.method= HTTP_GET - ,.query_string= "q=1" - ,.fragment= "narf" - ,.request_path= "/δ¶/δt/pope" - ,.request_url= "/δ¶/δt/pope?q=1#narf" - ,.num_headers= 1 - ,.headers= { {"Host", "github.com" } - } - ,.body= "" - } - -#define HOSTNAME_UNDERSCORE 28 -, {.name = "hostname underscore" - ,.type= HTTP_REQUEST - ,.raw= "CONNECT home_0.netscape.com:443 HTTP/1.0\r\n" - "User-agent: Mozilla/1.1N\r\n" - "Proxy-authorization: basic aGVsbG86d29ybGQ=\r\n" - "\r\n" - ,.should_keep_alive= FALSE - ,.message_complete_on_eof= FALSE - ,.http_major= 1 - ,.http_minor= 0 - ,.method= HTTP_CONNECT - ,.query_string= "" - ,.fragment= "" - ,.request_path= "" - ,.request_url= "home_0.netscape.com:443" - ,.num_headers= 2 - ,.upgrade="" - ,.headers= { { "User-agent", "Mozilla/1.1N" } - , { "Proxy-authorization", "basic aGVsbG86d29ybGQ=" } - } - ,.body= "" - } -#endif /* !HTTP_PARSER_STRICT */ - -/* see https://github.com/ry/http-parser/issues/47 */ -#define EAT_TRAILING_CRLF_NO_CONNECTION_CLOSE 29 -, {.name = "eat CRLF between requests, no \"Connection: close\" header" - ,.raw= "POST / HTTP/1.1\r\n" - "Host: www.example.com\r\n" - "Content-Type: application/x-www-form-urlencoded\r\n" - "Content-Length: 4\r\n" - "\r\n" - "q=42\r\n" /* note the trailing CRLF */ - ,.should_keep_alive= TRUE - ,.message_complete_on_eof= FALSE - ,.http_major= 1 - ,.http_minor= 1 - ,.method= HTTP_POST - ,.query_string= "" - ,.fragment= "" - ,.request_path= "/" - ,.request_url= "/" - ,.num_headers= 3 - ,.upgrade= 0 - ,.headers= { { "Host", "www.example.com" } - , { "Content-Type", "application/x-www-form-urlencoded" } - , { "Content-Length", "4" } - } - ,.body= "q=42" - } - -/* see https://github.com/ry/http-parser/issues/47 */ -#define EAT_TRAILING_CRLF_WITH_CONNECTION_CLOSE 30 -, {.name = "eat CRLF between requests even if \"Connection: close\" is set" - ,.raw= "POST / HTTP/1.1\r\n" - "Host: www.example.com\r\n" - "Content-Type: application/x-www-form-urlencoded\r\n" - "Content-Length: 4\r\n" - "Connection: close\r\n" - "\r\n" - "q=42\r\n" /* note the trailing CRLF */ - ,.should_keep_alive= FALSE - ,.message_complete_on_eof= FALSE /* input buffer isn't empty when on_message_complete is called */ - ,.http_major= 1 - ,.http_minor= 1 - ,.method= HTTP_POST - ,.query_string= "" - ,.fragment= "" - ,.request_path= "/" - ,.request_url= "/" - ,.num_headers= 4 - ,.upgrade= 0 - ,.headers= { { "Host", "www.example.com" } - , { "Content-Type", "application/x-www-form-urlencoded" } - , { "Content-Length", "4" } - , { "Connection", "close" } - } - ,.body= "q=42" - } - -#define PURGE_REQ 31 -, {.name = "PURGE request" - ,.type= HTTP_REQUEST - ,.raw= "PURGE /file.txt HTTP/1.1\r\n" - "Host: www.example.com\r\n" - "\r\n" - ,.should_keep_alive= TRUE - ,.message_complete_on_eof= FALSE - ,.http_major= 1 - ,.http_minor= 1 - ,.method= HTTP_PURGE - ,.query_string= "" - ,.fragment= "" - ,.request_path= "/file.txt" - ,.request_url= "/file.txt" - ,.num_headers= 1 - ,.headers= { { "Host", "www.example.com" } } - ,.body= "" - } - -#define SEARCH_REQ 32 -, {.name = "SEARCH request" - ,.type= HTTP_REQUEST - ,.raw= "SEARCH / HTTP/1.1\r\n" - "Host: www.example.com\r\n" - "\r\n" - ,.should_keep_alive= TRUE - ,.message_complete_on_eof= FALSE - ,.http_major= 1 - ,.http_minor= 1 - ,.method= HTTP_SEARCH - ,.query_string= "" - ,.fragment= "" - ,.request_path= "/" - ,.request_url= "/" - ,.num_headers= 1 - ,.headers= { { "Host", "www.example.com" } } - ,.body= "" - } - -#define PROXY_WITH_BASIC_AUTH 33 -, {.name= "host:port and basic_auth" - ,.type= HTTP_REQUEST - ,.raw= "GET http://a%12:b!&*$@hypnotoad.org:1234/toto HTTP/1.1\r\n" - "\r\n" - ,.should_keep_alive= TRUE - ,.message_complete_on_eof= FALSE - ,.http_major= 1 - ,.http_minor= 1 - ,.method= HTTP_GET - ,.fragment= "" - ,.request_path= "/toto" - ,.request_url= "http://a%12:b!&*$@hypnotoad.org:1234/toto" - ,.host= "hypnotoad.org" - ,.userinfo= "a%12:b!&*$" - ,.port= 1234 - ,.num_headers= 0 - ,.headers= { } - ,.body= "" - } - -#define LINE_FOLDING_IN_HEADER_WITH_LF 34 -, {.name= "line folding in header value" - ,.type= HTTP_REQUEST - ,.raw= "GET / HTTP/1.1\n" - "Line1: abc\n" - "\tdef\n" - " ghi\n" - "\t\tjkl\n" - " mno \n" - "\t \tqrs\n" - "Line2: \t line2\t\n" - "Line3:\n" - " line3\n" - "Line4: \n" - " \n" - "Connection:\n" - " close\n" - "\n" - ,.should_keep_alive= FALSE - ,.message_complete_on_eof= FALSE - ,.http_major= 1 - ,.http_minor= 1 - ,.method= HTTP_GET - ,.query_string= "" - ,.fragment= "" - ,.request_path= "/" - ,.request_url= "/" - ,.num_headers= 5 - ,.headers= { { "Line1", "abc\tdef ghi\t\tjkl mno \t \tqrs" } - , { "Line2", "line2\t" } - , { "Line3", "line3" } - , { "Line4", "" } - , { "Connection", "close" }, - } - ,.body= "" - } - -#define CONNECTION_MULTI 35 -, {.name = "multiple connection header values with folding" - ,.type= HTTP_REQUEST - ,.raw= "GET /demo HTTP/1.1\r\n" - "Host: example.com\r\n" - "Connection: Something,\r\n" - " Upgrade, ,Keep-Alive\r\n" - "Sec-WebSocket-Key2: 12998 5 Y3 1 .P00\r\n" - "Sec-WebSocket-Protocol: sample\r\n" - "Upgrade: WebSocket\r\n" - "Sec-WebSocket-Key1: 4 @1 46546xW%0l 1 5\r\n" - "Origin: http://example.com\r\n" - "\r\n" - "Hot diggity dogg" - ,.should_keep_alive= TRUE - ,.message_complete_on_eof= FALSE - ,.http_major= 1 - ,.http_minor= 1 - ,.method= HTTP_GET - ,.query_string= "" - ,.fragment= "" - ,.request_path= "/demo" - ,.request_url= "/demo" - ,.num_headers= 7 - ,.upgrade="Hot diggity dogg" - ,.headers= { { "Host", "example.com" } - , { "Connection", "Something, Upgrade, ,Keep-Alive" } - , { "Sec-WebSocket-Key2", "12998 5 Y3 1 .P00" } - , { "Sec-WebSocket-Protocol", "sample" } - , { "Upgrade", "WebSocket" } - , { "Sec-WebSocket-Key1", "4 @1 46546xW%0l 1 5" } - , { "Origin", "http://example.com" } - } - ,.body= "" - } - -#define CONNECTION_MULTI_LWS 36 -, {.name = "multiple connection header values with folding and lws" - ,.type= HTTP_REQUEST - ,.raw= "GET /demo HTTP/1.1\r\n" - "Connection: keep-alive, upgrade\r\n" - "Upgrade: WebSocket\r\n" - "\r\n" - "Hot diggity dogg" - ,.should_keep_alive= TRUE - ,.message_complete_on_eof= FALSE - ,.http_major= 1 - ,.http_minor= 1 - ,.method= HTTP_GET - ,.query_string= "" - ,.fragment= "" - ,.request_path= "/demo" - ,.request_url= "/demo" - ,.num_headers= 2 - ,.upgrade="Hot diggity dogg" - ,.headers= { { "Connection", "keep-alive, upgrade" } - , { "Upgrade", "WebSocket" } - } - ,.body= "" - } - -#define CONNECTION_MULTI_LWS_CRLF 37 -, {.name = "multiple connection header values with folding and lws" - ,.type= HTTP_REQUEST - ,.raw= "GET /demo HTTP/1.1\r\n" - "Connection: keep-alive, \r\n upgrade\r\n" - "Upgrade: WebSocket\r\n" - "\r\n" - "Hot diggity dogg" - ,.should_keep_alive= TRUE - ,.message_complete_on_eof= FALSE - ,.http_major= 1 - ,.http_minor= 1 - ,.method= HTTP_GET - ,.query_string= "" - ,.fragment= "" - ,.request_path= "/demo" - ,.request_url= "/demo" - ,.num_headers= 2 - ,.upgrade="Hot diggity dogg" - ,.headers= { { "Connection", "keep-alive, upgrade" } - , { "Upgrade", "WebSocket" } - } - ,.body= "" - } - -#define UPGRADE_POST_REQUEST 38 -, {.name = "upgrade post request" - ,.type= HTTP_REQUEST - ,.raw= "POST /demo HTTP/1.1\r\n" - "Host: example.com\r\n" - "Connection: Upgrade\r\n" - "Upgrade: HTTP/2.0\r\n" - "Content-Length: 15\r\n" - "\r\n" - "sweet post body" - "Hot diggity dogg" - ,.should_keep_alive= TRUE - ,.message_complete_on_eof= FALSE - ,.http_major= 1 - ,.http_minor= 1 - ,.method= HTTP_POST - ,.request_path= "/demo" - ,.request_url= "/demo" - ,.num_headers= 4 - ,.upgrade="Hot diggity dogg" - ,.headers= { { "Host", "example.com" } - , { "Connection", "Upgrade" } - , { "Upgrade", "HTTP/2.0" } - , { "Content-Length", "15" } - } - ,.body= "sweet post body" - } - -#define CONNECT_WITH_BODY_REQUEST 39 -, {.name = "connect with body request" - ,.type= HTTP_REQUEST - ,.raw= "CONNECT foo.bar.com:443 HTTP/1.0\r\n" - "User-agent: Mozilla/1.1N\r\n" - "Proxy-authorization: basic aGVsbG86d29ybGQ=\r\n" - "Content-Length: 10\r\n" - "\r\n" - "blarfcicle" - ,.should_keep_alive= FALSE - ,.message_complete_on_eof= FALSE - ,.http_major= 1 - ,.http_minor= 0 - ,.method= HTTP_CONNECT - ,.request_url= "foo.bar.com:443" - ,.num_headers= 3 - ,.upgrade="blarfcicle" - ,.headers= { { "User-agent", "Mozilla/1.1N" } - , { "Proxy-authorization", "basic aGVsbG86d29ybGQ=" } - , { "Content-Length", "10" } - } - ,.body= "" - } - -, {.name= NULL } /* sentinel */ -}; - -/* * R E S P O N S E S * */ -const struct message responses[] = -#define GOOGLE_301 0 -{ {.name= "google 301" - ,.type= HTTP_RESPONSE - ,.raw= "HTTP/1.1 301 Moved Permanently\r\n" - "Location: http://www.google.com/\r\n" - "Content-Type: text/html; charset=UTF-8\r\n" - "Date: Sun, 26 Apr 2009 11:11:49 GMT\r\n" - "Expires: Tue, 26 May 2009 11:11:49 GMT\r\n" - "X-$PrototypeBI-Version: 1.6.0.3\r\n" /* $ char in header field */ - "Cache-Control: public, max-age=2592000\r\n" - "Server: gws\r\n" - "Content-Length: 219 \r\n" - "\r\n" - "\n" - "301 Moved\n" - "

301 Moved

\n" - "The document has moved\n" - "here.\r\n" - "\r\n" - ,.should_keep_alive= TRUE - ,.message_complete_on_eof= FALSE - ,.http_major= 1 - ,.http_minor= 1 - ,.status_code= 301 - ,.response_status= "Moved Permanently" - ,.num_headers= 8 - ,.headers= - { { "Location", "http://www.google.com/" } - , { "Content-Type", "text/html; charset=UTF-8" } - , { "Date", "Sun, 26 Apr 2009 11:11:49 GMT" } - , { "Expires", "Tue, 26 May 2009 11:11:49 GMT" } - , { "X-$PrototypeBI-Version", "1.6.0.3" } - , { "Cache-Control", "public, max-age=2592000" } - , { "Server", "gws" } - , { "Content-Length", "219 " } - } - ,.body= "\n" - "301 Moved\n" - "

301 Moved

\n" - "The document has moved\n" - "here.\r\n" - "\r\n" - } - -#define NO_CONTENT_LENGTH_RESPONSE 1 -/* The client should wait for the server's EOF. That is, when content-length - * is not specified, and "Connection: close", the end of body is specified - * by the EOF. - * Compare with APACHEBENCH_GET - */ -, {.name= "no content-length response" - ,.type= HTTP_RESPONSE - ,.raw= "HTTP/1.1 200 OK\r\n" - "Date: Tue, 04 Aug 2009 07:59:32 GMT\r\n" - "Server: Apache\r\n" - "X-Powered-By: Servlet/2.5 JSP/2.1\r\n" - "Content-Type: text/xml; charset=utf-8\r\n" - "Connection: close\r\n" - "\r\n" - "\n" - "\n" - " \n" - " \n" - " SOAP-ENV:Client\n" - " Client Error\n" - " \n" - " \n" - "" - ,.should_keep_alive= FALSE - ,.message_complete_on_eof= TRUE - ,.http_major= 1 - ,.http_minor= 1 - ,.status_code= 200 - ,.response_status= "OK" - ,.num_headers= 5 - ,.headers= - { { "Date", "Tue, 04 Aug 2009 07:59:32 GMT" } - , { "Server", "Apache" } - , { "X-Powered-By", "Servlet/2.5 JSP/2.1" } - , { "Content-Type", "text/xml; charset=utf-8" } - , { "Connection", "close" } - } - ,.body= "\n" - "\n" - " \n" - " \n" - " SOAP-ENV:Client\n" - " Client Error\n" - " \n" - " \n" - "" - } - -#define NO_HEADERS_NO_BODY_404 2 -, {.name= "404 no headers no body" - ,.type= HTTP_RESPONSE - ,.raw= "HTTP/1.1 404 Not Found\r\n\r\n" - ,.should_keep_alive= FALSE - ,.message_complete_on_eof= TRUE - ,.http_major= 1 - ,.http_minor= 1 - ,.status_code= 404 - ,.response_status= "Not Found" - ,.num_headers= 0 - ,.headers= {} - ,.body_size= 0 - ,.body= "" - } - -#define NO_REASON_PHRASE 3 -, {.name= "301 no response phrase" - ,.type= HTTP_RESPONSE - ,.raw= "HTTP/1.1 301\r\n\r\n" - ,.should_keep_alive = FALSE - ,.message_complete_on_eof= TRUE - ,.http_major= 1 - ,.http_minor= 1 - ,.status_code= 301 - ,.response_status= "" - ,.num_headers= 0 - ,.headers= {} - ,.body= "" - } - -#define TRAILING_SPACE_ON_CHUNKED_BODY 4 -, {.name="200 trailing space on chunked body" - ,.type= HTTP_RESPONSE - ,.raw= "HTTP/1.1 200 OK\r\n" - "Content-Type: text/plain\r\n" - "Transfer-Encoding: chunked\r\n" - "\r\n" - "25 \r\n" - "This is the data in the first chunk\r\n" - "\r\n" - "1C\r\n" - "and this is the second one\r\n" - "\r\n" - "0 \r\n" - "\r\n" - ,.should_keep_alive= TRUE - ,.message_complete_on_eof= FALSE - ,.http_major= 1 - ,.http_minor= 1 - ,.status_code= 200 - ,.response_status= "OK" - ,.num_headers= 2 - ,.headers= - { {"Content-Type", "text/plain" } - , {"Transfer-Encoding", "chunked" } - } - ,.body_size = 37+28 - ,.body = - "This is the data in the first chunk\r\n" - "and this is the second one\r\n" - ,.num_chunks_complete= 3 - ,.chunk_lengths= { 0x25, 0x1c } - } - -#define NO_CARRIAGE_RET 5 -, {.name="no carriage ret" - ,.type= HTTP_RESPONSE - ,.raw= "HTTP/1.1 200 OK\n" - "Content-Type: text/html; charset=utf-8\n" - "Connection: close\n" - "\n" - "these headers are from http://news.ycombinator.com/" - ,.should_keep_alive= FALSE - ,.message_complete_on_eof= TRUE - ,.http_major= 1 - ,.http_minor= 1 - ,.status_code= 200 - ,.response_status= "OK" - ,.num_headers= 2 - ,.headers= - { {"Content-Type", "text/html; charset=utf-8" } - , {"Connection", "close" } - } - ,.body= "these headers are from http://news.ycombinator.com/" - } - -#define PROXY_CONNECTION 6 -, {.name="proxy connection" - ,.type= HTTP_RESPONSE - ,.raw= "HTTP/1.1 200 OK\r\n" - "Content-Type: text/html; charset=UTF-8\r\n" - "Content-Length: 11\r\n" - "Proxy-Connection: close\r\n" - "Date: Thu, 31 Dec 2009 20:55:48 +0000\r\n" - "\r\n" - "hello world" - ,.should_keep_alive= FALSE - ,.message_complete_on_eof= FALSE - ,.http_major= 1 - ,.http_minor= 1 - ,.status_code= 200 - ,.response_status= "OK" - ,.num_headers= 4 - ,.headers= - { {"Content-Type", "text/html; charset=UTF-8" } - , {"Content-Length", "11" } - , {"Proxy-Connection", "close" } - , {"Date", "Thu, 31 Dec 2009 20:55:48 +0000"} - } - ,.body= "hello world" - } - -#define UNDERSTORE_HEADER_KEY 7 - // shown by - // curl -o /dev/null -v "http://ad.doubleclick.net/pfadx/DARTSHELLCONFIGXML;dcmt=text/xml;" -, {.name="underscore header key" - ,.type= HTTP_RESPONSE - ,.raw= "HTTP/1.1 200 OK\r\n" - "Server: DCLK-AdSvr\r\n" - "Content-Type: text/xml\r\n" - "Content-Length: 0\r\n" - "DCLK_imp: v7;x;114750856;0-0;0;17820020;0/0;21603567/21621457/1;;~okv=;dcmt=text/xml;;~cs=o\r\n\r\n" - ,.should_keep_alive= TRUE - ,.message_complete_on_eof= FALSE - ,.http_major= 1 - ,.http_minor= 1 - ,.status_code= 200 - ,.response_status= "OK" - ,.num_headers= 4 - ,.headers= - { {"Server", "DCLK-AdSvr" } - , {"Content-Type", "text/xml" } - , {"Content-Length", "0" } - , {"DCLK_imp", "v7;x;114750856;0-0;0;17820020;0/0;21603567/21621457/1;;~okv=;dcmt=text/xml;;~cs=o" } - } - ,.body= "" - } - -#define BONJOUR_MADAME_FR 8 -/* The client should not merge two headers fields when the first one doesn't - * have a value. - */ -, {.name= "bonjourmadame.fr" - ,.type= HTTP_RESPONSE - ,.raw= "HTTP/1.0 301 Moved Permanently\r\n" - "Date: Thu, 03 Jun 2010 09:56:32 GMT\r\n" - "Server: Apache/2.2.3 (Red Hat)\r\n" - "Cache-Control: public\r\n" - "Pragma: \r\n" - "Location: http://www.bonjourmadame.fr/\r\n" - "Vary: Accept-Encoding\r\n" - "Content-Length: 0\r\n" - "Content-Type: text/html; charset=UTF-8\r\n" - "Connection: keep-alive\r\n" - "\r\n" - ,.should_keep_alive= TRUE - ,.message_complete_on_eof= FALSE - ,.http_major= 1 - ,.http_minor= 0 - ,.status_code= 301 - ,.response_status= "Moved Permanently" - ,.num_headers= 9 - ,.headers= - { { "Date", "Thu, 03 Jun 2010 09:56:32 GMT" } - , { "Server", "Apache/2.2.3 (Red Hat)" } - , { "Cache-Control", "public" } - , { "Pragma", "" } - , { "Location", "http://www.bonjourmadame.fr/" } - , { "Vary", "Accept-Encoding" } - , { "Content-Length", "0" } - , { "Content-Type", "text/html; charset=UTF-8" } - , { "Connection", "keep-alive" } - } - ,.body= "" - } - -#define RES_FIELD_UNDERSCORE 9 -/* Should handle spaces in header fields */ -, {.name= "field underscore" - ,.type= HTTP_RESPONSE - ,.raw= "HTTP/1.1 200 OK\r\n" - "Date: Tue, 28 Sep 2010 01:14:13 GMT\r\n" - "Server: Apache\r\n" - "Cache-Control: no-cache, must-revalidate\r\n" - "Expires: Mon, 26 Jul 1997 05:00:00 GMT\r\n" - ".et-Cookie: PlaxoCS=1274804622353690521; path=/; domain=.plaxo.com\r\n" - "Vary: Accept-Encoding\r\n" - "_eep-Alive: timeout=45\r\n" /* semantic value ignored */ - "_onnection: Keep-Alive\r\n" /* semantic value ignored */ - "Transfer-Encoding: chunked\r\n" - "Content-Type: text/html\r\n" - "Connection: close\r\n" - "\r\n" - "0\r\n\r\n" - ,.should_keep_alive= FALSE - ,.message_complete_on_eof= FALSE - ,.http_major= 1 - ,.http_minor= 1 - ,.status_code= 200 - ,.response_status= "OK" - ,.num_headers= 11 - ,.headers= - { { "Date", "Tue, 28 Sep 2010 01:14:13 GMT" } - , { "Server", "Apache" } - , { "Cache-Control", "no-cache, must-revalidate" } - , { "Expires", "Mon, 26 Jul 1997 05:00:00 GMT" } - , { ".et-Cookie", "PlaxoCS=1274804622353690521; path=/; domain=.plaxo.com" } - , { "Vary", "Accept-Encoding" } - , { "_eep-Alive", "timeout=45" } - , { "_onnection", "Keep-Alive" } - , { "Transfer-Encoding", "chunked" } - , { "Content-Type", "text/html" } - , { "Connection", "close" } - } - ,.body= "" - ,.num_chunks_complete= 1 - ,.chunk_lengths= {} - } - -#define NON_ASCII_IN_STATUS_LINE 10 -/* Should handle non-ASCII in status line */ -, {.name= "non-ASCII in status line" - ,.type= HTTP_RESPONSE - ,.raw= "HTTP/1.1 500 OriĂ«ntatieprobleem\r\n" - "Date: Fri, 5 Nov 2010 23:07:12 GMT+2\r\n" - "Content-Length: 0\r\n" - "Connection: close\r\n" - "\r\n" - ,.should_keep_alive= FALSE - ,.message_complete_on_eof= FALSE - ,.http_major= 1 - ,.http_minor= 1 - ,.status_code= 500 - ,.response_status= "OriĂ«ntatieprobleem" - ,.num_headers= 3 - ,.headers= - { { "Date", "Fri, 5 Nov 2010 23:07:12 GMT+2" } - , { "Content-Length", "0" } - , { "Connection", "close" } - } - ,.body= "" - } - -#define HTTP_VERSION_0_9 11 -/* Should handle HTTP/0.9 */ -, {.name= "http version 0.9" - ,.type= HTTP_RESPONSE - ,.raw= "HTTP/0.9 200 OK\r\n" - "\r\n" - ,.should_keep_alive= FALSE - ,.message_complete_on_eof= TRUE - ,.http_major= 0 - ,.http_minor= 9 - ,.status_code= 200 - ,.response_status= "OK" - ,.num_headers= 0 - ,.headers= - {} - ,.body= "" - } - -#define NO_CONTENT_LENGTH_NO_TRANSFER_ENCODING_RESPONSE 12 -/* The client should wait for the server's EOF. That is, when neither - * content-length nor transfer-encoding is specified, the end of body - * is specified by the EOF. - */ -, {.name= "neither content-length nor transfer-encoding response" - ,.type= HTTP_RESPONSE - ,.raw= "HTTP/1.1 200 OK\r\n" - "Content-Type: text/plain\r\n" - "\r\n" - "hello world" - ,.should_keep_alive= FALSE - ,.message_complete_on_eof= TRUE - ,.http_major= 1 - ,.http_minor= 1 - ,.status_code= 200 - ,.response_status= "OK" - ,.num_headers= 1 - ,.headers= - { { "Content-Type", "text/plain" } - } - ,.body= "hello world" - } - -#define NO_BODY_HTTP10_KA_200 13 -, {.name= "HTTP/1.0 with keep-alive and EOF-terminated 200 status" - ,.type= HTTP_RESPONSE - ,.raw= "HTTP/1.0 200 OK\r\n" - "Connection: keep-alive\r\n" - "\r\n" - ,.should_keep_alive= FALSE - ,.message_complete_on_eof= TRUE - ,.http_major= 1 - ,.http_minor= 0 - ,.status_code= 200 - ,.response_status= "OK" - ,.num_headers= 1 - ,.headers= - { { "Connection", "keep-alive" } - } - ,.body_size= 0 - ,.body= "" - } - -#define NO_BODY_HTTP10_KA_204 14 -, {.name= "HTTP/1.0 with keep-alive and a 204 status" - ,.type= HTTP_RESPONSE - ,.raw= "HTTP/1.0 204 No content\r\n" - "Connection: keep-alive\r\n" - "\r\n" - ,.should_keep_alive= TRUE - ,.message_complete_on_eof= FALSE - ,.http_major= 1 - ,.http_minor= 0 - ,.status_code= 204 - ,.response_status= "No content" - ,.num_headers= 1 - ,.headers= - { { "Connection", "keep-alive" } - } - ,.body_size= 0 - ,.body= "" - } - -#define NO_BODY_HTTP11_KA_200 15 -, {.name= "HTTP/1.1 with an EOF-terminated 200 status" - ,.type= HTTP_RESPONSE - ,.raw= "HTTP/1.1 200 OK\r\n" - "\r\n" - ,.should_keep_alive= FALSE - ,.message_complete_on_eof= TRUE - ,.http_major= 1 - ,.http_minor= 1 - ,.status_code= 200 - ,.response_status= "OK" - ,.num_headers= 0 - ,.headers={} - ,.body_size= 0 - ,.body= "" - } - -#define NO_BODY_HTTP11_KA_204 16 -, {.name= "HTTP/1.1 with a 204 status" - ,.type= HTTP_RESPONSE - ,.raw= "HTTP/1.1 204 No content\r\n" - "\r\n" - ,.should_keep_alive= TRUE - ,.message_complete_on_eof= FALSE - ,.http_major= 1 - ,.http_minor= 1 - ,.status_code= 204 - ,.response_status= "No content" - ,.num_headers= 0 - ,.headers={} - ,.body_size= 0 - ,.body= "" - } - -#define NO_BODY_HTTP11_NOKA_204 17 -, {.name= "HTTP/1.1 with a 204 status and keep-alive disabled" - ,.type= HTTP_RESPONSE - ,.raw= "HTTP/1.1 204 No content\r\n" - "Connection: close\r\n" - "\r\n" - ,.should_keep_alive= FALSE - ,.message_complete_on_eof= FALSE - ,.http_major= 1 - ,.http_minor= 1 - ,.status_code= 204 - ,.response_status= "No content" - ,.num_headers= 1 - ,.headers= - { { "Connection", "close" } - } - ,.body_size= 0 - ,.body= "" - } - -#define NO_BODY_HTTP11_KA_CHUNKED_200 18 -, {.name= "HTTP/1.1 with chunked endocing and a 200 response" - ,.type= HTTP_RESPONSE - ,.raw= "HTTP/1.1 200 OK\r\n" - "Transfer-Encoding: chunked\r\n" - "\r\n" - "0\r\n" - "\r\n" - ,.should_keep_alive= TRUE - ,.message_complete_on_eof= FALSE - ,.http_major= 1 - ,.http_minor= 1 - ,.status_code= 200 - ,.response_status= "OK" - ,.num_headers= 1 - ,.headers= - { { "Transfer-Encoding", "chunked" } - } - ,.body_size= 0 - ,.body= "" - ,.num_chunks_complete= 1 - } - -#if !HTTP_PARSER_STRICT -#define SPACE_IN_FIELD_RES 19 -/* Should handle spaces in header fields */ -, {.name= "field space" - ,.type= HTTP_RESPONSE - ,.raw= "HTTP/1.1 200 OK\r\n" - "Server: Microsoft-IIS/6.0\r\n" - "X-Powered-By: ASP.NET\r\n" - "en-US Content-Type: text/xml\r\n" /* this is the problem */ - "Content-Type: text/xml\r\n" - "Content-Length: 16\r\n" - "Date: Fri, 23 Jul 2010 18:45:38 GMT\r\n" - "Connection: keep-alive\r\n" - "\r\n" - "hello" /* fake body */ - ,.should_keep_alive= TRUE - ,.message_complete_on_eof= FALSE - ,.http_major= 1 - ,.http_minor= 1 - ,.status_code= 200 - ,.response_status= "OK" - ,.num_headers= 7 - ,.headers= - { { "Server", "Microsoft-IIS/6.0" } - , { "X-Powered-By", "ASP.NET" } - , { "en-US Content-Type", "text/xml" } - , { "Content-Type", "text/xml" } - , { "Content-Length", "16" } - , { "Date", "Fri, 23 Jul 2010 18:45:38 GMT" } - , { "Connection", "keep-alive" } - } - ,.body= "hello" - } -#endif /* !HTTP_PARSER_STRICT */ - -#define AMAZON_COM 20 -, {.name= "amazon.com" - ,.type= HTTP_RESPONSE - ,.raw= "HTTP/1.1 301 MovedPermanently\r\n" - "Date: Wed, 15 May 2013 17:06:33 GMT\r\n" - "Server: Server\r\n" - "x-amz-id-1: 0GPHKXSJQ826RK7GZEB2\r\n" - "p3p: policyref=\"http://www.amazon.com/w3c/p3p.xml\",CP=\"CAO DSP LAW CUR ADM IVAo IVDo CONo OTPo OUR DELi PUBi OTRi BUS PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA HEA PRE LOC GOV OTC \"\r\n" - "x-amz-id-2: STN69VZxIFSz9YJLbz1GDbxpbjG6Qjmmq5E3DxRhOUw+Et0p4hr7c/Q8qNcx4oAD\r\n" - "Location: http://www.amazon.com/Dan-Brown/e/B000AP9DSU/ref=s9_pop_gw_al1?_encoding=UTF8&refinementId=618073011&pf_rd_m=ATVPDKIKX0DER&pf_rd_s=center-2&pf_rd_r=0SHYY5BZXN3KR20BNFAY&pf_rd_t=101&pf_rd_p=1263340922&pf_rd_i=507846\r\n" - "Vary: Accept-Encoding,User-Agent\r\n" - "Content-Type: text/html; charset=ISO-8859-1\r\n" - "Transfer-Encoding: chunked\r\n" - "\r\n" - "1\r\n" - "\n\r\n" - "0\r\n" - "\r\n" - ,.should_keep_alive= TRUE - ,.message_complete_on_eof= FALSE - ,.http_major= 1 - ,.http_minor= 1 - ,.status_code= 301 - ,.response_status= "MovedPermanently" - ,.num_headers= 9 - ,.headers= { { "Date", "Wed, 15 May 2013 17:06:33 GMT" } - , { "Server", "Server" } - , { "x-amz-id-1", "0GPHKXSJQ826RK7GZEB2" } - , { "p3p", "policyref=\"http://www.amazon.com/w3c/p3p.xml\",CP=\"CAO DSP LAW CUR ADM IVAo IVDo CONo OTPo OUR DELi PUBi OTRi BUS PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA HEA PRE LOC GOV OTC \"" } - , { "x-amz-id-2", "STN69VZxIFSz9YJLbz1GDbxpbjG6Qjmmq5E3DxRhOUw+Et0p4hr7c/Q8qNcx4oAD" } - , { "Location", "http://www.amazon.com/Dan-Brown/e/B000AP9DSU/ref=s9_pop_gw_al1?_encoding=UTF8&refinementId=618073011&pf_rd_m=ATVPDKIKX0DER&pf_rd_s=center-2&pf_rd_r=0SHYY5BZXN3KR20BNFAY&pf_rd_t=101&pf_rd_p=1263340922&pf_rd_i=507846" } - , { "Vary", "Accept-Encoding,User-Agent" } - , { "Content-Type", "text/html; charset=ISO-8859-1" } - , { "Transfer-Encoding", "chunked" } - } - ,.body= "\n" - ,.num_chunks_complete= 2 - ,.chunk_lengths= { 1 } - } - -#define EMPTY_REASON_PHRASE_AFTER_SPACE 20 -, {.name= "empty reason phrase after space" - ,.type= HTTP_RESPONSE - ,.raw= "HTTP/1.1 200 \r\n" - "\r\n" - ,.should_keep_alive= FALSE - ,.message_complete_on_eof= TRUE - ,.http_major= 1 - ,.http_minor= 1 - ,.status_code= 200 - ,.response_status= "" - ,.num_headers= 0 - ,.headers= {} - ,.body= "" - } - -, {.name= NULL } /* sentinel */ -}; - -/* strnlen() is a POSIX.2008 addition. Can't rely on it being available so - * define it ourselves. - */ -size_t -strnlen(const char *s, size_t maxlen) -{ - const char *p; - - p = memchr(s, '\0', maxlen); - if (p == NULL) - return maxlen; - - return p - s; -} - -size_t -strlncat(char *dst, size_t len, const char *src, size_t n) -{ - size_t slen; - size_t dlen; - size_t rlen; - size_t ncpy; - - slen = strnlen(src, n); - dlen = strnlen(dst, len); - - if (dlen < len) { - rlen = len - dlen; - ncpy = slen < rlen ? slen : (rlen - 1); - memcpy(dst + dlen, src, ncpy); - dst[dlen + ncpy] = '\0'; - } - - assert(len > slen + dlen); - return slen + dlen; -} - -size_t -strlcat(char *dst, const char *src, size_t len) -{ - return strlncat(dst, len, src, (size_t) -1); -} - -size_t -strlncpy(char *dst, size_t len, const char *src, size_t n) -{ - size_t slen; - size_t ncpy; - - slen = strnlen(src, n); - - if (len > 0) { - ncpy = slen < len ? slen : (len - 1); - memcpy(dst, src, ncpy); - dst[ncpy] = '\0'; - } - - assert(len > slen); - return slen; -} - -size_t -strlcpy(char *dst, const char *src, size_t len) -{ - return strlncpy(dst, len, src, (size_t) -1); -} - -int -request_url_cb (http_parser *p, const char *buf, size_t len) -{ - assert(p == parser); - strlncat(messages[num_messages].request_url, - sizeof(messages[num_messages].request_url), - buf, - len); - return 0; -} - -int -header_field_cb (http_parser *p, const char *buf, size_t len) -{ - assert(p == parser); - struct message *m = &messages[num_messages]; - - if (m->last_header_element != FIELD) - m->num_headers++; - - strlncat(m->headers[m->num_headers-1][0], - sizeof(m->headers[m->num_headers-1][0]), - buf, - len); - - m->last_header_element = FIELD; - - return 0; -} - -int -header_value_cb (http_parser *p, const char *buf, size_t len) -{ - assert(p == parser); - struct message *m = &messages[num_messages]; - - strlncat(m->headers[m->num_headers-1][1], - sizeof(m->headers[m->num_headers-1][1]), - buf, - len); - - m->last_header_element = VALUE; - - return 0; -} - -void -check_body_is_final (const http_parser *p) -{ - if (messages[num_messages].body_is_final) { - fprintf(stderr, "\n\n *** Error http_body_is_final() should return 1 " - "on last on_body callback call " - "but it doesn't! ***\n\n"); - assert(0); - abort(); - } - messages[num_messages].body_is_final = http_body_is_final(p); -} - -int -body_cb (http_parser *p, const char *buf, size_t len) -{ - assert(p == parser); - strlncat(messages[num_messages].body, - sizeof(messages[num_messages].body), - buf, - len); - messages[num_messages].body_size += len; - check_body_is_final(p); - // printf("body_cb: '%s'\n", requests[num_messages].body); - return 0; -} - -int -count_body_cb (http_parser *p, const char *buf, size_t len) -{ - assert(p == parser); - assert(buf); - messages[num_messages].body_size += len; - check_body_is_final(p); - return 0; -} - -int -message_begin_cb (http_parser *p) -{ - assert(p == parser); - messages[num_messages].message_begin_cb_called = TRUE; - return 0; -} - -int -headers_complete_cb (http_parser *p) -{ - assert(p == parser); - messages[num_messages].method = parser->method; - messages[num_messages].status_code = parser->status_code; - messages[num_messages].http_major = parser->http_major; - messages[num_messages].http_minor = parser->http_minor; - messages[num_messages].headers_complete_cb_called = TRUE; - messages[num_messages].should_keep_alive = http_should_keep_alive(parser); - return 0; -} - -int -message_complete_cb (http_parser *p) -{ - assert(p == parser); - if (messages[num_messages].should_keep_alive != http_should_keep_alive(parser)) - { - fprintf(stderr, "\n\n *** Error http_should_keep_alive() should have same " - "value in both on_message_complete and on_headers_complete " - "but it doesn't! ***\n\n"); - assert(0); - abort(); - } - - if (messages[num_messages].body_size && - http_body_is_final(p) && - !messages[num_messages].body_is_final) - { - fprintf(stderr, "\n\n *** Error http_body_is_final() should return 1 " - "on last on_body callback call " - "but it doesn't! ***\n\n"); - assert(0); - abort(); - } - - messages[num_messages].message_complete_cb_called = TRUE; - - messages[num_messages].message_complete_on_eof = currently_parsing_eof; - - num_messages++; - return 0; -} - -int -response_status_cb (http_parser *p, const char *buf, size_t len) -{ - assert(p == parser); - strlncat(messages[num_messages].response_status, - sizeof(messages[num_messages].response_status), - buf, - len); - return 0; -} - -int -chunk_header_cb (http_parser *p) -{ - assert(p == parser); - int chunk_idx = messages[num_messages].num_chunks; - messages[num_messages].num_chunks++; - if (chunk_idx < MAX_CHUNKS) { - messages[num_messages].chunk_lengths[chunk_idx] = p->content_length; - } - - return 0; -} - -int -chunk_complete_cb (http_parser *p) -{ - assert(p == parser); - - /* Here we want to verify that each chunk_header_cb is matched by a - * chunk_complete_cb, so not only should the total number of calls to - * both callbacks be the same, but they also should be interleaved - * properly */ - assert(messages[num_messages].num_chunks == - messages[num_messages].num_chunks_complete + 1); - - messages[num_messages].num_chunks_complete++; - return 0; -} - -/* These dontcall_* callbacks exist so that we can verify that when we're - * paused, no additional callbacks are invoked */ -int -dontcall_message_begin_cb (http_parser *p) -{ - if (p) { } // gcc - fprintf(stderr, "\n\n*** on_message_begin() called on paused parser ***\n\n"); - abort(); -} - -int -dontcall_header_field_cb (http_parser *p, const char *buf, size_t len) -{ - if (p || buf || len) { } // gcc - fprintf(stderr, "\n\n*** on_header_field() called on paused parser ***\n\n"); - abort(); -} - -int -dontcall_header_value_cb (http_parser *p, const char *buf, size_t len) -{ - if (p || buf || len) { } // gcc - fprintf(stderr, "\n\n*** on_header_value() called on paused parser ***\n\n"); - abort(); -} - -int -dontcall_request_url_cb (http_parser *p, const char *buf, size_t len) -{ - if (p || buf || len) { } // gcc - fprintf(stderr, "\n\n*** on_request_url() called on paused parser ***\n\n"); - abort(); -} - -int -dontcall_body_cb (http_parser *p, const char *buf, size_t len) -{ - if (p || buf || len) { } // gcc - fprintf(stderr, "\n\n*** on_body_cb() called on paused parser ***\n\n"); - abort(); -} - -int -dontcall_headers_complete_cb (http_parser *p) -{ - if (p) { } // gcc - fprintf(stderr, "\n\n*** on_headers_complete() called on paused " - "parser ***\n\n"); - abort(); -} - -int -dontcall_message_complete_cb (http_parser *p) -{ - if (p) { } // gcc - fprintf(stderr, "\n\n*** on_message_complete() called on paused " - "parser ***\n\n"); - abort(); -} - -int -dontcall_response_status_cb (http_parser *p, const char *buf, size_t len) -{ - if (p || buf || len) { } // gcc - fprintf(stderr, "\n\n*** on_status() called on paused parser ***\n\n"); - abort(); -} - -int -dontcall_chunk_header_cb (http_parser *p) -{ - if (p) { } // gcc - fprintf(stderr, "\n\n*** on_chunk_header() called on paused parser ***\n\n"); - exit(1); -} - -int -dontcall_chunk_complete_cb (http_parser *p) -{ - if (p) { } // gcc - fprintf(stderr, "\n\n*** on_chunk_complete() " - "called on paused parser ***\n\n"); - exit(1); -} - -static http_parser_settings settings_dontcall = - {.on_message_begin = dontcall_message_begin_cb - ,.on_header_field = dontcall_header_field_cb - ,.on_header_value = dontcall_header_value_cb - ,.on_url = dontcall_request_url_cb - ,.on_status = dontcall_response_status_cb - ,.on_body = dontcall_body_cb - ,.on_headers_complete = dontcall_headers_complete_cb - ,.on_message_complete = dontcall_message_complete_cb - ,.on_chunk_header = dontcall_chunk_header_cb - ,.on_chunk_complete = dontcall_chunk_complete_cb - }; - -/* These pause_* callbacks always pause the parser and just invoke the regular - * callback that tracks content. Before returning, we overwrite the parser - * settings to point to the _dontcall variety so that we can verify that - * the pause actually did, you know, pause. */ -int -pause_message_begin_cb (http_parser *p) -{ - http_parser_pause(p, 1); - *current_pause_parser = settings_dontcall; - return message_begin_cb(p); -} - -int -pause_header_field_cb (http_parser *p, const char *buf, size_t len) -{ - http_parser_pause(p, 1); - *current_pause_parser = settings_dontcall; - return header_field_cb(p, buf, len); -} - -int -pause_header_value_cb (http_parser *p, const char *buf, size_t len) -{ - http_parser_pause(p, 1); - *current_pause_parser = settings_dontcall; - return header_value_cb(p, buf, len); -} - -int -pause_request_url_cb (http_parser *p, const char *buf, size_t len) -{ - http_parser_pause(p, 1); - *current_pause_parser = settings_dontcall; - return request_url_cb(p, buf, len); -} - -int -pause_body_cb (http_parser *p, const char *buf, size_t len) -{ - http_parser_pause(p, 1); - *current_pause_parser = settings_dontcall; - return body_cb(p, buf, len); -} - -int -pause_headers_complete_cb (http_parser *p) -{ - http_parser_pause(p, 1); - *current_pause_parser = settings_dontcall; - return headers_complete_cb(p); -} - -int -pause_message_complete_cb (http_parser *p) -{ - http_parser_pause(p, 1); - *current_pause_parser = settings_dontcall; - return message_complete_cb(p); -} - -int -pause_response_status_cb (http_parser *p, const char *buf, size_t len) -{ - http_parser_pause(p, 1); - *current_pause_parser = settings_dontcall; - return response_status_cb(p, buf, len); -} - -int -pause_chunk_header_cb (http_parser *p) -{ - http_parser_pause(p, 1); - *current_pause_parser = settings_dontcall; - return chunk_header_cb(p); -} - -int -pause_chunk_complete_cb (http_parser *p) -{ - http_parser_pause(p, 1); - *current_pause_parser = settings_dontcall; - return chunk_complete_cb(p); -} - -static http_parser_settings settings_pause = - {.on_message_begin = pause_message_begin_cb - ,.on_header_field = pause_header_field_cb - ,.on_header_value = pause_header_value_cb - ,.on_url = pause_request_url_cb - ,.on_status = pause_response_status_cb - ,.on_body = pause_body_cb - ,.on_headers_complete = pause_headers_complete_cb - ,.on_message_complete = pause_message_complete_cb - ,.on_chunk_header = pause_chunk_header_cb - ,.on_chunk_complete = pause_chunk_complete_cb - }; - -static http_parser_settings settings = - {.on_message_begin = message_begin_cb - ,.on_header_field = header_field_cb - ,.on_header_value = header_value_cb - ,.on_url = request_url_cb - ,.on_status = response_status_cb - ,.on_body = body_cb - ,.on_headers_complete = headers_complete_cb - ,.on_message_complete = message_complete_cb - ,.on_chunk_header = chunk_header_cb - ,.on_chunk_complete = chunk_complete_cb - }; - -static http_parser_settings settings_count_body = - {.on_message_begin = message_begin_cb - ,.on_header_field = header_field_cb - ,.on_header_value = header_value_cb - ,.on_url = request_url_cb - ,.on_status = response_status_cb - ,.on_body = count_body_cb - ,.on_headers_complete = headers_complete_cb - ,.on_message_complete = message_complete_cb - ,.on_chunk_header = chunk_header_cb - ,.on_chunk_complete = chunk_complete_cb - }; - -static http_parser_settings settings_null = - {.on_message_begin = 0 - ,.on_header_field = 0 - ,.on_header_value = 0 - ,.on_url = 0 - ,.on_status = 0 - ,.on_body = 0 - ,.on_headers_complete = 0 - ,.on_message_complete = 0 - ,.on_chunk_header = 0 - ,.on_chunk_complete = 0 - }; - -void -parser_init (enum http_parser_type type) -{ - num_messages = 0; - - assert(parser == NULL); - - parser = malloc(sizeof(http_parser)); - - http_parser_init(parser, type); - - memset(&messages, 0, sizeof messages); - -} - -void -parser_free () -{ - assert(parser); - free(parser); - parser = NULL; -} - -size_t parse (const char *buf, size_t len) -{ - size_t nparsed; - currently_parsing_eof = (len == 0); - nparsed = http_parser_execute(parser, &settings, buf, len); - return nparsed; -} - -size_t parse_count_body (const char *buf, size_t len) -{ - size_t nparsed; - currently_parsing_eof = (len == 0); - nparsed = http_parser_execute(parser, &settings_count_body, buf, len); - return nparsed; -} - -size_t parse_pause (const char *buf, size_t len) -{ - size_t nparsed; - http_parser_settings s = settings_pause; - - currently_parsing_eof = (len == 0); - current_pause_parser = &s; - nparsed = http_parser_execute(parser, current_pause_parser, buf, len); - return nparsed; -} - -static inline int -check_str_eq (const struct message *m, - const char *prop, - const char *expected, - const char *found) { - if ((expected == NULL) != (found == NULL)) { - printf("\n*** Error: %s in '%s' ***\n\n", prop, m->name); - printf("expected %s\n", (expected == NULL) ? "NULL" : expected); - printf(" found %s\n", (found == NULL) ? "NULL" : found); - return 0; - } - if (expected != NULL && 0 != strcmp(expected, found)) { - printf("\n*** Error: %s in '%s' ***\n\n", prop, m->name); - printf("expected '%s'\n", expected); - printf(" found '%s'\n", found); - return 0; - } - return 1; -} - -static inline int -check_num_eq (const struct message *m, - const char *prop, - int expected, - int found) { - if (expected != found) { - printf("\n*** Error: %s in '%s' ***\n\n", prop, m->name); - printf("expected %d\n", expected); - printf(" found %d\n", found); - return 0; - } - return 1; -} - -#define MESSAGE_CHECK_STR_EQ(expected, found, prop) \ - if (!check_str_eq(expected, #prop, expected->prop, found->prop)) return 0 - -#define MESSAGE_CHECK_NUM_EQ(expected, found, prop) \ - if (!check_num_eq(expected, #prop, expected->prop, found->prop)) return 0 - -#define MESSAGE_CHECK_URL_EQ(u, expected, found, prop, fn) \ -do { \ - char ubuf[256]; \ - \ - if ((u)->field_set & (1 << (fn))) { \ - memcpy(ubuf, (found)->request_url + (u)->field_data[(fn)].off, \ - (u)->field_data[(fn)].len); \ - ubuf[(u)->field_data[(fn)].len] = '\0'; \ - } else { \ - ubuf[0] = '\0'; \ - } \ - \ - check_str_eq(expected, #prop, expected->prop, ubuf); \ -} while(0) - -int -message_eq (int index, const struct message *expected) -{ - int i; - struct message *m = &messages[index]; - - MESSAGE_CHECK_NUM_EQ(expected, m, http_major); - MESSAGE_CHECK_NUM_EQ(expected, m, http_minor); - - if (expected->type == HTTP_REQUEST) { - MESSAGE_CHECK_NUM_EQ(expected, m, method); - } else { - MESSAGE_CHECK_NUM_EQ(expected, m, status_code); - MESSAGE_CHECK_STR_EQ(expected, m, response_status); - } - - MESSAGE_CHECK_NUM_EQ(expected, m, should_keep_alive); - MESSAGE_CHECK_NUM_EQ(expected, m, message_complete_on_eof); - - assert(m->message_begin_cb_called); - assert(m->headers_complete_cb_called); - assert(m->message_complete_cb_called); - - - MESSAGE_CHECK_STR_EQ(expected, m, request_url); - - /* Check URL components; we can't do this w/ CONNECT since it doesn't - * send us a well-formed URL. - */ - if (*m->request_url && m->method != HTTP_CONNECT) { - struct http_parser_url u; - - if (http_parser_parse_url(m->request_url, strlen(m->request_url), 0, &u)) { - fprintf(stderr, "\n\n*** failed to parse URL %s ***\n\n", - m->request_url); - abort(); - } - - if (expected->host) { - MESSAGE_CHECK_URL_EQ(&u, expected, m, host, UF_HOST); - } - - if (expected->userinfo) { - MESSAGE_CHECK_URL_EQ(&u, expected, m, userinfo, UF_USERINFO); - } - - m->port = (u.field_set & (1 << UF_PORT)) ? - u.port : 0; - - MESSAGE_CHECK_URL_EQ(&u, expected, m, query_string, UF_QUERY); - MESSAGE_CHECK_URL_EQ(&u, expected, m, fragment, UF_FRAGMENT); - MESSAGE_CHECK_URL_EQ(&u, expected, m, request_path, UF_PATH); - MESSAGE_CHECK_NUM_EQ(expected, m, port); - } - - if (expected->body_size) { - MESSAGE_CHECK_NUM_EQ(expected, m, body_size); - } else { - MESSAGE_CHECK_STR_EQ(expected, m, body); - } - - assert(m->num_chunks == m->num_chunks_complete); - MESSAGE_CHECK_NUM_EQ(expected, m, num_chunks_complete); - for (i = 0; i < m->num_chunks && i < MAX_CHUNKS; i++) { - MESSAGE_CHECK_NUM_EQ(expected, m, chunk_lengths[i]); - } - - MESSAGE_CHECK_NUM_EQ(expected, m, num_headers); - - int r; - for (i = 0; i < m->num_headers; i++) { - r = check_str_eq(expected, "header field", expected->headers[i][0], m->headers[i][0]); - if (!r) return 0; - r = check_str_eq(expected, "header value", expected->headers[i][1], m->headers[i][1]); - if (!r) return 0; - } - - MESSAGE_CHECK_STR_EQ(expected, m, upgrade); - - return 1; -} - -/* Given a sequence of varargs messages, return the number of them that the - * parser should successfully parse, taking into account that upgraded - * messages prevent all subsequent messages from being parsed. - */ -size_t -count_parsed_messages(const size_t nmsgs, ...) { - size_t i; - va_list ap; - - va_start(ap, nmsgs); - - for (i = 0; i < nmsgs; i++) { - struct message *m = va_arg(ap, struct message *); - - if (m->upgrade) { - va_end(ap); - return i + 1; - } - } - - va_end(ap); - return nmsgs; -} - -/* Given a sequence of bytes and the number of these that we were able to - * parse, verify that upgrade bodies are correct. - */ -void -upgrade_message_fix(char *body, const size_t nread, const size_t nmsgs, ...) { - va_list ap; - size_t i; - size_t off = 0; - - va_start(ap, nmsgs); - - for (i = 0; i < nmsgs; i++) { - struct message *m = va_arg(ap, struct message *); - - off += strlen(m->raw); - - if (m->upgrade) { - off -= strlen(m->upgrade); - - /* Check the portion of the response after its specified upgrade */ - if (!check_str_eq(m, "upgrade", body + off, body + nread)) { - abort(); - } - - /* Fix up the response so that message_eq() will verify the beginning - * of the upgrade */ - *(body + nread + strlen(m->upgrade)) = '\0'; - messages[num_messages -1 ].upgrade = body + nread; - - va_end(ap); - return; - } - } - - va_end(ap); - printf("\n\n*** Error: expected a message with upgrade ***\n"); - - abort(); -} - -static void -print_error (const char *raw, size_t error_location) -{ - fprintf(stderr, "\n*** %s ***\n\n", - http_errno_description(HTTP_PARSER_ERRNO(parser))); - - int this_line = 0, char_len = 0; - size_t i, j, len = strlen(raw), error_location_line = 0; - for (i = 0; i < len; i++) { - if (i == error_location) this_line = 1; - switch (raw[i]) { - case '\r': - char_len = 2; - fprintf(stderr, "\\r"); - break; - - case '\n': - fprintf(stderr, "\\n\n"); - - if (this_line) goto print; - - error_location_line = 0; - continue; - - default: - char_len = 1; - fputc(raw[i], stderr); - break; - } - if (!this_line) error_location_line += char_len; - } - - fprintf(stderr, "[eof]\n"); - - print: - for (j = 0; j < error_location_line; j++) { - fputc(' ', stderr); - } - fprintf(stderr, "^\n\nerror location: %u\n", (unsigned int)error_location); -} - -void -test_preserve_data (void) -{ - char my_data[] = "application-specific data"; - http_parser parser; - parser.data = my_data; - http_parser_init(&parser, HTTP_REQUEST); - if (parser.data != my_data) { - printf("\n*** parser.data not preserved accross http_parser_init ***\n\n"); - abort(); - } -} - -struct url_test { - const char *name; - const char *url; - int is_connect; - struct http_parser_url u; - int rv; -}; - -const struct url_test url_tests[] = -{ {.name="proxy request" - ,.url="http://hostname/" - ,.is_connect=0 - ,.u= - {.field_set=(1 << UF_SCHEMA) | (1 << UF_HOST) | (1 << UF_PATH) - ,.port=0 - ,.field_data= - {{ 0, 4 } /* UF_SCHEMA */ - ,{ 7, 8 } /* UF_HOST */ - ,{ 0, 0 } /* UF_PORT */ - ,{ 15, 1 } /* UF_PATH */ - ,{ 0, 0 } /* UF_QUERY */ - ,{ 0, 0 } /* UF_FRAGMENT */ - ,{ 0, 0 } /* UF_USERINFO */ - } - } - ,.rv=0 - } - -, {.name="proxy request with port" - ,.url="http://hostname:444/" - ,.is_connect=0 - ,.u= - {.field_set=(1 << UF_SCHEMA) | (1 << UF_HOST) | (1 << UF_PORT) | (1 << UF_PATH) - ,.port=444 - ,.field_data= - {{ 0, 4 } /* UF_SCHEMA */ - ,{ 7, 8 } /* UF_HOST */ - ,{ 16, 3 } /* UF_PORT */ - ,{ 19, 1 } /* UF_PATH */ - ,{ 0, 0 } /* UF_QUERY */ - ,{ 0, 0 } /* UF_FRAGMENT */ - ,{ 0, 0 } /* UF_USERINFO */ - } - } - ,.rv=0 - } - -, {.name="CONNECT request" - ,.url="hostname:443" - ,.is_connect=1 - ,.u= - {.field_set=(1 << UF_HOST) | (1 << UF_PORT) - ,.port=443 - ,.field_data= - {{ 0, 0 } /* UF_SCHEMA */ - ,{ 0, 8 } /* UF_HOST */ - ,{ 9, 3 } /* UF_PORT */ - ,{ 0, 0 } /* UF_PATH */ - ,{ 0, 0 } /* UF_QUERY */ - ,{ 0, 0 } /* UF_FRAGMENT */ - ,{ 0, 0 } /* UF_USERINFO */ - } - } - ,.rv=0 - } - -, {.name="CONNECT request but not connect" - ,.url="hostname:443" - ,.is_connect=0 - ,.rv=1 - } - -, {.name="proxy ipv6 request" - ,.url="http://[1:2::3:4]/" - ,.is_connect=0 - ,.u= - {.field_set=(1 << UF_SCHEMA) | (1 << UF_HOST) | (1 << UF_PATH) - ,.port=0 - ,.field_data= - {{ 0, 4 } /* UF_SCHEMA */ - ,{ 8, 8 } /* UF_HOST */ - ,{ 0, 0 } /* UF_PORT */ - ,{ 17, 1 } /* UF_PATH */ - ,{ 0, 0 } /* UF_QUERY */ - ,{ 0, 0 } /* UF_FRAGMENT */ - ,{ 0, 0 } /* UF_USERINFO */ - } - } - ,.rv=0 - } - -, {.name="proxy ipv6 request with port" - ,.url="http://[1:2::3:4]:67/" - ,.is_connect=0 - ,.u= - {.field_set=(1 << UF_SCHEMA) | (1 << UF_HOST) | (1 << UF_PORT) | (1 << UF_PATH) - ,.port=67 - ,.field_data= - {{ 0, 4 } /* UF_SCHEMA */ - ,{ 8, 8 } /* UF_HOST */ - ,{ 18, 2 } /* UF_PORT */ - ,{ 20, 1 } /* UF_PATH */ - ,{ 0, 0 } /* UF_QUERY */ - ,{ 0, 0 } /* UF_FRAGMENT */ - ,{ 0, 0 } /* UF_USERINFO */ - } - } - ,.rv=0 - } - -, {.name="CONNECT ipv6 address" - ,.url="[1:2::3:4]:443" - ,.is_connect=1 - ,.u= - {.field_set=(1 << UF_HOST) | (1 << UF_PORT) - ,.port=443 - ,.field_data= - {{ 0, 0 } /* UF_SCHEMA */ - ,{ 1, 8 } /* UF_HOST */ - ,{ 11, 3 } /* UF_PORT */ - ,{ 0, 0 } /* UF_PATH */ - ,{ 0, 0 } /* UF_QUERY */ - ,{ 0, 0 } /* UF_FRAGMENT */ - ,{ 0, 0 } /* UF_USERINFO */ - } - } - ,.rv=0 - } - -, {.name="ipv4 in ipv6 address" - ,.url="http://[2001:0000:0000:0000:0000:0000:1.9.1.1]/" - ,.is_connect=0 - ,.u= - {.field_set=(1 << UF_SCHEMA) | (1 << UF_HOST) | (1 << UF_PATH) - ,.port=0 - ,.field_data= - {{ 0, 4 } /* UF_SCHEMA */ - ,{ 8, 37 } /* UF_HOST */ - ,{ 0, 0 } /* UF_PORT */ - ,{ 46, 1 } /* UF_PATH */ - ,{ 0, 0 } /* UF_QUERY */ - ,{ 0, 0 } /* UF_FRAGMENT */ - ,{ 0, 0 } /* UF_USERINFO */ - } - } - ,.rv=0 - } - -, {.name="extra ? in query string" - ,.url="http://a.tbcdn.cn/p/fp/2010c/??fp-header-min.css,fp-base-min.css," - "fp-channel-min.css,fp-product-min.css,fp-mall-min.css,fp-category-min.css," - "fp-sub-min.css,fp-gdp4p-min.css,fp-css3-min.css,fp-misc-min.css?t=20101022.css" - ,.is_connect=0 - ,.u= - {.field_set=(1<field_set, u->port); - for (i = 0; i < UF_MAX; i++) { - if ((u->field_set & (1 << i)) == 0) { - printf("\tfield_data[%u]: unset\n", i); - continue; - } - - printf("\tfield_data[%u]: off: %u len: %u part: \"%.*s\n\"", - i, - u->field_data[i].off, - u->field_data[i].len, - u->field_data[i].len, - url + u->field_data[i].off); - } -} - -void -test_parse_url (void) -{ - struct http_parser_url u; - const struct url_test *test; - unsigned int i; - int rv; - - for (i = 0; i < (sizeof(url_tests) / sizeof(url_tests[0])); i++) { - test = &url_tests[i]; - memset(&u, 0, sizeof(u)); - - rv = http_parser_parse_url(test->url, - strlen(test->url), - test->is_connect, - &u); - - if (test->rv == 0) { - if (rv != 0) { - printf("\n*** http_parser_parse_url(\"%s\") \"%s\" test failed, " - "unexpected rv %d ***\n\n", test->url, test->name, rv); - abort(); - } - - if (memcmp(&u, &test->u, sizeof(u)) != 0) { - printf("\n*** http_parser_parse_url(\"%s\") \"%s\" failed ***\n", - test->url, test->name); - - printf("target http_parser_url:\n"); - dump_url(test->url, &test->u); - printf("result http_parser_url:\n"); - dump_url(test->url, &u); - - abort(); - } - } else { - /* test->rv != 0 */ - if (rv == 0) { - printf("\n*** http_parser_parse_url(\"%s\") \"%s\" test failed, " - "unexpected rv %d ***\n\n", test->url, test->name, rv); - abort(); - } - } - } -} - -void -test_method_str (void) -{ - assert(0 == strcmp("GET", http_method_str(HTTP_GET))); - assert(0 == strcmp("", http_method_str(1337))); -} - -void -test_message (const struct message *message) -{ - size_t raw_len = strlen(message->raw); - size_t msg1len; - for (msg1len = 0; msg1len < raw_len; msg1len++) { - parser_init(message->type); - - size_t read; - const char *msg1 = message->raw; - const char *msg2 = msg1 + msg1len; - size_t msg2len = raw_len - msg1len; - - if (msg1len) { - read = parse(msg1, msg1len); - - if (message->upgrade && parser->upgrade && num_messages > 0) { - messages[num_messages - 1].upgrade = msg1 + read; - goto test; - } - - if (read != msg1len) { - print_error(msg1, read); - abort(); - } - } - - - read = parse(msg2, msg2len); - - if (message->upgrade && parser->upgrade) { - messages[num_messages - 1].upgrade = msg2 + read; - goto test; - } - - if (read != msg2len) { - print_error(msg2, read); - abort(); - } - - read = parse(NULL, 0); - - if (read != 0) { - print_error(message->raw, read); - abort(); - } - - test: - - if (num_messages != 1) { - printf("\n*** num_messages != 1 after testing '%s' ***\n\n", message->name); - abort(); - } - - if(!message_eq(0, message)) abort(); - - parser_free(); - } -} - -void -test_message_count_body (const struct message *message) -{ - parser_init(message->type); - - size_t read; - size_t l = strlen(message->raw); - size_t i, toread; - size_t chunk = 4024; - - for (i = 0; i < l; i+= chunk) { - toread = MIN(l-i, chunk); - read = parse_count_body(message->raw + i, toread); - if (read != toread) { - print_error(message->raw, read); - abort(); - } - } - - - read = parse_count_body(NULL, 0); - if (read != 0) { - print_error(message->raw, read); - abort(); - } - - if (num_messages != 1) { - printf("\n*** num_messages != 1 after testing '%s' ***\n\n", message->name); - abort(); - } - - if(!message_eq(0, message)) abort(); - - parser_free(); -} - -void -test_simple (const char *buf, enum http_errno err_expected) -{ - parser_init(HTTP_REQUEST); - - enum http_errno err; - - parse(buf, strlen(buf)); - err = HTTP_PARSER_ERRNO(parser); - parse(NULL, 0); - - parser_free(); - - /* In strict mode, allow us to pass with an unexpected HPE_STRICT as - * long as the caller isn't expecting success. - */ -#if HTTP_PARSER_STRICT - if (err_expected != err && err_expected != HPE_OK && err != HPE_STRICT) { -#else - if (err_expected != err) { -#endif - fprintf(stderr, "\n*** test_simple expected %s, but saw %s ***\n\n%s\n", - http_errno_name(err_expected), http_errno_name(err), buf); - abort(); - } -} - -void -test_header_overflow_error (int req) -{ - http_parser parser; - http_parser_init(&parser, req ? HTTP_REQUEST : HTTP_RESPONSE); - size_t parsed; - const char *buf; - buf = req ? "GET / HTTP/1.1\r\n" : "HTTP/1.0 200 OK\r\n"; - parsed = http_parser_execute(&parser, &settings_null, buf, strlen(buf)); - assert(parsed == strlen(buf)); - - buf = "header-key: header-value\r\n"; - size_t buflen = strlen(buf); - - int i; - for (i = 0; i < 10000; i++) { - parsed = http_parser_execute(&parser, &settings_null, buf, buflen); - if (parsed != buflen) { - //fprintf(stderr, "error found on iter %d\n", i); - assert(HTTP_PARSER_ERRNO(&parser) == HPE_HEADER_OVERFLOW); - return; - } - } - - fprintf(stderr, "\n*** Error expected but none in header overflow test ***\n"); - abort(); -} - - -void -test_header_nread_value () -{ - http_parser parser; - http_parser_init(&parser, HTTP_REQUEST); - size_t parsed; - const char *buf; - buf = "GET / HTTP/1.1\r\nheader: value\nhdr: value\r\n"; - parsed = http_parser_execute(&parser, &settings_null, buf, strlen(buf)); - assert(parsed == strlen(buf)); - - assert(parser.nread == strlen(buf)); -} - - -static void -test_content_length_overflow (const char *buf, size_t buflen, int expect_ok) -{ - http_parser parser; - http_parser_init(&parser, HTTP_RESPONSE); - http_parser_execute(&parser, &settings_null, buf, buflen); - - if (expect_ok) - assert(HTTP_PARSER_ERRNO(&parser) == HPE_OK); - else - assert(HTTP_PARSER_ERRNO(&parser) == HPE_INVALID_CONTENT_LENGTH); -} - -void -test_header_content_length_overflow_error (void) -{ -#define X(size) \ - "HTTP/1.1 200 OK\r\n" \ - "Content-Length: " #size "\r\n" \ - "\r\n" - const char a[] = X(1844674407370955160); /* 2^64 / 10 - 1 */ - const char b[] = X(18446744073709551615); /* 2^64-1 */ - const char c[] = X(18446744073709551616); /* 2^64 */ -#undef X - test_content_length_overflow(a, sizeof(a) - 1, 1); /* expect ok */ - test_content_length_overflow(b, sizeof(b) - 1, 0); /* expect failure */ - test_content_length_overflow(c, sizeof(c) - 1, 0); /* expect failure */ -} - -void -test_chunk_content_length_overflow_error (void) -{ -#define X(size) \ - "HTTP/1.1 200 OK\r\n" \ - "Transfer-Encoding: chunked\r\n" \ - "\r\n" \ - #size "\r\n" \ - "..." - const char a[] = X(FFFFFFFFFFFFFFE); /* 2^64 / 16 - 1 */ - const char b[] = X(FFFFFFFFFFFFFFFF); /* 2^64-1 */ - const char c[] = X(10000000000000000); /* 2^64 */ -#undef X - test_content_length_overflow(a, sizeof(a) - 1, 1); /* expect ok */ - test_content_length_overflow(b, sizeof(b) - 1, 0); /* expect failure */ - test_content_length_overflow(c, sizeof(c) - 1, 0); /* expect failure */ -} - -void -test_no_overflow_long_body (int req, size_t length) -{ - http_parser parser; - http_parser_init(&parser, req ? HTTP_REQUEST : HTTP_RESPONSE); - size_t parsed; - size_t i; - char buf1[3000]; - size_t buf1len = sprintf(buf1, "%s\r\nConnection: Keep-Alive\r\nContent-Length: %lu\r\n\r\n", - req ? "POST / HTTP/1.0" : "HTTP/1.0 200 OK", (unsigned long)length); - parsed = http_parser_execute(&parser, &settings_null, buf1, buf1len); - if (parsed != buf1len) - goto err; - - for (i = 0; i < length; i++) { - char foo = 'a'; - parsed = http_parser_execute(&parser, &settings_null, &foo, 1); - if (parsed != 1) - goto err; - } - - parsed = http_parser_execute(&parser, &settings_null, buf1, buf1len); - if (parsed != buf1len) goto err; - return; - - err: - fprintf(stderr, - "\n*** error in test_no_overflow_long_body %s of length %lu ***\n", - req ? "REQUEST" : "RESPONSE", - (unsigned long)length); - abort(); -} - -void -test_multiple3 (const struct message *r1, const struct message *r2, const struct message *r3) -{ - int message_count = count_parsed_messages(3, r1, r2, r3); - - char total[ strlen(r1->raw) - + strlen(r2->raw) - + strlen(r3->raw) - + 1 - ]; - total[0] = '\0'; - - strcat(total, r1->raw); - strcat(total, r2->raw); - strcat(total, r3->raw); - - parser_init(r1->type); - - size_t read; - - read = parse(total, strlen(total)); - - if (parser->upgrade) { - upgrade_message_fix(total, read, 3, r1, r2, r3); - goto test; - } - - if (read != strlen(total)) { - print_error(total, read); - abort(); - } - - read = parse(NULL, 0); - - if (read != 0) { - print_error(total, read); - abort(); - } - -test: - - if (message_count != num_messages) { - fprintf(stderr, "\n\n*** Parser didn't see 3 messages only %d *** \n", num_messages); - abort(); - } - - if (!message_eq(0, r1)) abort(); - if (message_count > 1 && !message_eq(1, r2)) abort(); - if (message_count > 2 && !message_eq(2, r3)) abort(); - - parser_free(); -} - -/* SCAN through every possible breaking to make sure the - * parser can handle getting the content in any chunks that - * might come from the socket - */ -void -test_scan (const struct message *r1, const struct message *r2, const struct message *r3) -{ - char total[80*1024] = "\0"; - char buf1[80*1024] = "\0"; - char buf2[80*1024] = "\0"; - char buf3[80*1024] = "\0"; - - strcat(total, r1->raw); - strcat(total, r2->raw); - strcat(total, r3->raw); - - size_t read; - - int total_len = strlen(total); - - int total_ops = 2 * (total_len - 1) * (total_len - 2) / 2; - int ops = 0 ; - - size_t buf1_len, buf2_len, buf3_len; - int message_count = count_parsed_messages(3, r1, r2, r3); - - int i,j,type_both; - for (type_both = 0; type_both < 2; type_both ++ ) { - for (j = 2; j < total_len; j ++ ) { - for (i = 1; i < j; i ++ ) { - - if (ops % 1000 == 0) { - printf("\b\b\b\b%3.0f%%", 100 * (float)ops /(float)total_ops); - fflush(stdout); - } - ops += 1; - - parser_init(type_both ? HTTP_BOTH : r1->type); - - buf1_len = i; - strlncpy(buf1, sizeof(buf1), total, buf1_len); - buf1[buf1_len] = 0; - - buf2_len = j - i; - strlncpy(buf2, sizeof(buf1), total+i, buf2_len); - buf2[buf2_len] = 0; - - buf3_len = total_len - j; - strlncpy(buf3, sizeof(buf1), total+j, buf3_len); - buf3[buf3_len] = 0; - - read = parse(buf1, buf1_len); - - if (parser->upgrade) goto test; - - if (read != buf1_len) { - print_error(buf1, read); - goto error; - } - - read += parse(buf2, buf2_len); - - if (parser->upgrade) goto test; - - if (read != buf1_len + buf2_len) { - print_error(buf2, read); - goto error; - } - - read += parse(buf3, buf3_len); - - if (parser->upgrade) goto test; - - if (read != buf1_len + buf2_len + buf3_len) { - print_error(buf3, read); - goto error; - } - - parse(NULL, 0); - -test: - if (parser->upgrade) { - upgrade_message_fix(total, read, 3, r1, r2, r3); - } - - if (message_count != num_messages) { - fprintf(stderr, "\n\nParser didn't see %d messages only %d\n", - message_count, num_messages); - goto error; - } - - if (!message_eq(0, r1)) { - fprintf(stderr, "\n\nError matching messages[0] in test_scan.\n"); - goto error; - } - - if (message_count > 1 && !message_eq(1, r2)) { - fprintf(stderr, "\n\nError matching messages[1] in test_scan.\n"); - goto error; - } - - if (message_count > 2 && !message_eq(2, r3)) { - fprintf(stderr, "\n\nError matching messages[2] in test_scan.\n"); - goto error; - } - - parser_free(); - } - } - } - puts("\b\b\b\b100%"); - return; - - error: - fprintf(stderr, "i=%d j=%d\n", i, j); - fprintf(stderr, "buf1 (%u) %s\n\n", (unsigned int)buf1_len, buf1); - fprintf(stderr, "buf2 (%u) %s\n\n", (unsigned int)buf2_len , buf2); - fprintf(stderr, "buf3 (%u) %s\n", (unsigned int)buf3_len, buf3); - abort(); -} - -// user required to free the result -// string terminated by \0 -char * -create_large_chunked_message (int body_size_in_kb, const char* headers) -{ - int i; - size_t wrote = 0; - size_t headers_len = strlen(headers); - size_t bufsize = headers_len + (5+1024+2)*body_size_in_kb + 6; - char * buf = malloc(bufsize); - - memcpy(buf, headers, headers_len); - wrote += headers_len; - - for (i = 0; i < body_size_in_kb; i++) { - // write 1kb chunk into the body. - memcpy(buf + wrote, "400\r\n", 5); - wrote += 5; - memset(buf + wrote, 'C', 1024); - wrote += 1024; - strcpy(buf + wrote, "\r\n"); - wrote += 2; - } - - memcpy(buf + wrote, "0\r\n\r\n", 6); - wrote += 6; - assert(wrote == bufsize); - - return buf; -} - -/* Verify that we can pause parsing at any of the bytes in the - * message and still get the result that we're expecting. */ -void -test_message_pause (const struct message *msg) -{ - char *buf = (char*) msg->raw; - size_t buflen = strlen(msg->raw); - size_t nread; - - parser_init(msg->type); - - do { - nread = parse_pause(buf, buflen); - - // We can only set the upgrade buffer once we've gotten our message - // completion callback. - if (messages[0].message_complete_cb_called && - msg->upgrade && - parser->upgrade) { - messages[0].upgrade = buf + nread; - goto test; - } - - if (nread < buflen) { - - // Not much do to if we failed a strict-mode check - if (HTTP_PARSER_ERRNO(parser) == HPE_STRICT) { - parser_free(); - return; - } - - assert (HTTP_PARSER_ERRNO(parser) == HPE_PAUSED); - } - - buf += nread; - buflen -= nread; - http_parser_pause(parser, 0); - } while (buflen > 0); - - nread = parse_pause(NULL, 0); - assert (nread == 0); - -test: - if (num_messages != 1) { - printf("\n*** num_messages != 1 after testing '%s' ***\n\n", msg->name); - abort(); - } - - if(!message_eq(0, msg)) abort(); - - parser_free(); -} - -int -main (void) -{ - parser = NULL; - int i, j, k; - int request_count; - int response_count; - unsigned long version; - unsigned major; - unsigned minor; - unsigned patch; - - version = http_parser_version(); - major = (version >> 16) & 255; - minor = (version >> 8) & 255; - patch = version & 255; - printf("http_parser v%u.%u.%u (0x%06lx)\n", major, minor, patch, version); - - printf("sizeof(http_parser) = %u\n", (unsigned int)sizeof(http_parser)); - - for (request_count = 0; requests[request_count].name; request_count++); - for (response_count = 0; responses[response_count].name; response_count++); - - //// API - test_preserve_data(); - test_parse_url(); - test_method_str(); - - //// NREAD - test_header_nread_value(); - - //// OVERFLOW CONDITIONS - - test_header_overflow_error(HTTP_REQUEST); - test_no_overflow_long_body(HTTP_REQUEST, 1000); - test_no_overflow_long_body(HTTP_REQUEST, 100000); - - test_header_overflow_error(HTTP_RESPONSE); - test_no_overflow_long_body(HTTP_RESPONSE, 1000); - test_no_overflow_long_body(HTTP_RESPONSE, 100000); - - test_header_content_length_overflow_error(); - test_chunk_content_length_overflow_error(); - - //// RESPONSES - - for (i = 0; i < response_count; i++) { - test_message(&responses[i]); - } - - for (i = 0; i < response_count; i++) { - test_message_pause(&responses[i]); - } - - for (i = 0; i < response_count; i++) { - if (!responses[i].should_keep_alive) continue; - for (j = 0; j < response_count; j++) { - if (!responses[j].should_keep_alive) continue; - for (k = 0; k < response_count; k++) { - test_multiple3(&responses[i], &responses[j], &responses[k]); - } - } - } - - test_message_count_body(&responses[NO_HEADERS_NO_BODY_404]); - test_message_count_body(&responses[TRAILING_SPACE_ON_CHUNKED_BODY]); - - // test very large chunked response - { - char * msg = create_large_chunked_message(31337, - "HTTP/1.0 200 OK\r\n" - "Transfer-Encoding: chunked\r\n" - "Content-Type: text/plain\r\n" - "\r\n"); - struct message large_chunked = - {.name= "large chunked" - ,.type= HTTP_RESPONSE - ,.raw= msg - ,.should_keep_alive= FALSE - ,.message_complete_on_eof= FALSE - ,.http_major= 1 - ,.http_minor= 0 - ,.status_code= 200 - ,.response_status= "OK" - ,.num_headers= 2 - ,.headers= - { { "Transfer-Encoding", "chunked" } - , { "Content-Type", "text/plain" } - } - ,.body_size= 31337*1024 - ,.num_chunks_complete= 31338 - }; - for (i = 0; i < MAX_CHUNKS; i++) { - large_chunked.chunk_lengths[i] = 1024; - } - test_message_count_body(&large_chunked); - free(msg); - } - - - - printf("response scan 1/2 "); - test_scan( &responses[TRAILING_SPACE_ON_CHUNKED_BODY] - , &responses[NO_BODY_HTTP10_KA_204] - , &responses[NO_REASON_PHRASE] - ); - - printf("response scan 2/2 "); - test_scan( &responses[BONJOUR_MADAME_FR] - , &responses[UNDERSTORE_HEADER_KEY] - , &responses[NO_CARRIAGE_RET] - ); - - puts("responses okay"); - - - /// REQUESTS - - test_simple("GET / HTP/1.1\r\n\r\n", HPE_INVALID_VERSION); - - // Well-formed but incomplete - test_simple("GET / HTTP/1.1\r\n" - "Content-Type: text/plain\r\n" - "Content-Length: 6\r\n" - "\r\n" - "fooba", - HPE_OK); - - static const char *all_methods[] = { - "DELETE", - "GET", - "HEAD", - "POST", - "PUT", - //"CONNECT", //CONNECT can't be tested like other methods, it's a tunnel - "OPTIONS", - "TRACE", - "COPY", - "LOCK", - "MKCOL", - "MOVE", - "PROPFIND", - "PROPPATCH", - "UNLOCK", - "REPORT", - "MKACTIVITY", - "CHECKOUT", - "MERGE", - "M-SEARCH", - "NOTIFY", - "SUBSCRIBE", - "UNSUBSCRIBE", - "PATCH", - 0 }; - const char **this_method; - for (this_method = all_methods; *this_method; this_method++) { - char buf[200]; - sprintf(buf, "%s / HTTP/1.1\r\n\r\n", *this_method); - test_simple(buf, HPE_OK); - } - - static const char *bad_methods[] = { - "ASDF", - "C******", - "COLA", - "GEM", - "GETA", - "M****", - "MKCOLA", - "PROPPATCHA", - "PUN", - "PX", - "SA", - "hello world", - 0 }; - for (this_method = bad_methods; *this_method; this_method++) { - char buf[200]; - sprintf(buf, "%s / HTTP/1.1\r\n\r\n", *this_method); - test_simple(buf, HPE_INVALID_METHOD); - } - - // illegal header field name line folding - test_simple("GET / HTTP/1.1\r\n" - "name\r\n" - " : value\r\n" - "\r\n", - HPE_INVALID_HEADER_TOKEN); - - const char *dumbfuck2 = - "GET / HTTP/1.1\r\n" - "X-SSL-Bullshit: -----BEGIN CERTIFICATE-----\r\n" - "\tMIIFbTCCBFWgAwIBAgICH4cwDQYJKoZIhvcNAQEFBQAwcDELMAkGA1UEBhMCVUsx\r\n" - "\tETAPBgNVBAoTCGVTY2llbmNlMRIwEAYDVQQLEwlBdXRob3JpdHkxCzAJBgNVBAMT\r\n" - "\tAkNBMS0wKwYJKoZIhvcNAQkBFh5jYS1vcGVyYXRvckBncmlkLXN1cHBvcnQuYWMu\r\n" - "\tdWswHhcNMDYwNzI3MTQxMzI4WhcNMDcwNzI3MTQxMzI4WjBbMQswCQYDVQQGEwJV\r\n" - "\tSzERMA8GA1UEChMIZVNjaWVuY2UxEzARBgNVBAsTCk1hbmNoZXN0ZXIxCzAJBgNV\r\n" - "\tBAcTmrsogriqMWLAk1DMRcwFQYDVQQDEw5taWNoYWVsIHBhcmQYJKoZIhvcNAQEB\r\n" - "\tBQADggEPADCCAQoCggEBANPEQBgl1IaKdSS1TbhF3hEXSl72G9J+WC/1R64fAcEF\r\n" - "\tW51rEyFYiIeZGx/BVzwXbeBoNUK41OK65sxGuflMo5gLflbwJtHBRIEKAfVVp3YR\r\n" - "\tgW7cMA/s/XKgL1GEC7rQw8lIZT8RApukCGqOVHSi/F1SiFlPDxuDfmdiNzL31+sL\r\n" - "\t0iwHDdNkGjy5pyBSB8Y79dsSJtCW/iaLB0/n8Sj7HgvvZJ7x0fr+RQjYOUUfrePP\r\n" - "\tu2MSpFyf+9BbC/aXgaZuiCvSR+8Snv3xApQY+fULK/xY8h8Ua51iXoQ5jrgu2SqR\r\n" - "\twgA7BUi3G8LFzMBl8FRCDYGUDy7M6QaHXx1ZWIPWNKsCAwEAAaOCAiQwggIgMAwG\r\n" - "\tA1UdEwEB/wQCMAAwEQYJYIZIAYb4QgHTTPAQDAgWgMA4GA1UdDwEB/wQEAwID6DAs\r\n" - "\tBglghkgBhvhCAQ0EHxYdVUsgZS1TY2llbmNlIFVzZXIgQ2VydGlmaWNhdGUwHQYD\r\n" - "\tVR0OBBYEFDTt/sf9PeMaZDHkUIldrDYMNTBZMIGaBgNVHSMEgZIwgY+AFAI4qxGj\r\n" - "\tloCLDdMVKwiljjDastqooXSkcjBwMQswCQYDVQQGEwJVSzERMA8GA1UEChMIZVNj\r\n" - "\taWVuY2UxEjAQBgNVBAsTCUF1dGhvcml0eTELMAkGA1UEAxMCQ0ExLTArBgkqhkiG\r\n" - "\t9w0BCQEWHmNhLW9wZXJhdG9yQGdyaWQtc3VwcG9ydC5hYy51a4IBADApBgNVHRIE\r\n" - "\tIjAggR5jYS1vcGVyYXRvckBncmlkLXN1cHBvcnQuYWMudWswGQYDVR0gBBIwEDAO\r\n" - "\tBgwrBgEEAdkvAQEBAQYwPQYJYIZIAYb4QgEEBDAWLmh0dHA6Ly9jYS5ncmlkLXN1\r\n" - "\tcHBvcnQuYWMudmT4sopwqlBWsvcHViL2NybC9jYWNybC5jcmwwPQYJYIZIAYb4QgEDBDAWLmh0\r\n" - "\tdHA6Ly9jYS5ncmlkLXN1cHBvcnQuYWMudWsvcHViL2NybC9jYWNybC5jcmwwPwYD\r\n" - "\tVR0fBDgwNjA0oDKgMIYuaHR0cDovL2NhLmdyaWQt5hYy51ay9wdWIv\r\n" - "\tY3JsL2NhY3JsLmNybDANBgkqhkiG9w0BAQUFAAOCAQEAS/U4iiooBENGW/Hwmmd3\r\n" - "\tXCy6Zrt08YjKCzGNjorT98g8uGsqYjSxv/hmi0qlnlHs+k/3Iobc3LjS5AMYr5L8\r\n" - "\tUO7OSkgFFlLHQyC9JzPfmLCAugvzEbyv4Olnsr8hbxF1MbKZoQxUZtMVu29wjfXk\r\n" - "\thTeApBv7eaKCWpSp7MCbvgzm74izKhu3vlDk9w6qVrxePfGgpKPqfHiOoGhFnbTK\r\n" - "\twTC6o2xq5y0qZ03JonF7OJspEd3I5zKY3E+ov7/ZhW6DqT8UFvsAdjvQbXyhV8Eu\r\n" - "\tYhixw1aKEPzNjNowuIseVogKOLXxWI5vAi5HgXdS0/ES5gDGsABo4fqovUKlgop3\r\n" - "\tRA==\r\n" - "\t-----END CERTIFICATE-----\r\n" - "\r\n"; - test_simple(dumbfuck2, HPE_OK); - - const char *corrupted_connection = - "GET / HTTP/1.1\r\n" - "Host: www.example.com\r\n" - "Connection\r\033\065\325eep-Alive\r\n" - "Accept-Encoding: gzip\r\n" - "\r\n"; - test_simple(corrupted_connection, HPE_INVALID_HEADER_TOKEN); - - const char *corrupted_header_name = - "GET / HTTP/1.1\r\n" - "Host: www.example.com\r\n" - "X-Some-Header\r\033\065\325eep-Alive\r\n" - "Accept-Encoding: gzip\r\n" - "\r\n"; - test_simple(corrupted_header_name, HPE_INVALID_HEADER_TOKEN); - -#if 0 - // NOTE(Wed Nov 18 11:57:27 CET 2009) this seems okay. we just read body - // until EOF. - // - // no content-length - // error if there is a body without content length - const char *bad_get_no_headers_no_body = "GET /bad_get_no_headers_no_body/world HTTP/1.1\r\n" - "Accept: */*\r\n" - "\r\n" - "HELLO"; - test_simple(bad_get_no_headers_no_body, 0); -#endif - /* TODO sending junk and large headers gets rejected */ - - - /* check to make sure our predefined requests are okay */ - for (i = 0; requests[i].name; i++) { - test_message(&requests[i]); - } - - for (i = 0; i < request_count; i++) { - test_message_pause(&requests[i]); - } - - for (i = 0; i < request_count; i++) { - if (!requests[i].should_keep_alive) continue; - for (j = 0; j < request_count; j++) { - if (!requests[j].should_keep_alive) continue; - for (k = 0; k < request_count; k++) { - test_multiple3(&requests[i], &requests[j], &requests[k]); - } - } - } - - printf("request scan 1/4 "); - test_scan( &requests[GET_NO_HEADERS_NO_BODY] - , &requests[GET_ONE_HEADER_NO_BODY] - , &requests[GET_NO_HEADERS_NO_BODY] - ); - - printf("request scan 2/4 "); - test_scan( &requests[POST_CHUNKED_ALL_YOUR_BASE] - , &requests[POST_IDENTITY_BODY_WORLD] - , &requests[GET_FUNKY_CONTENT_LENGTH] - ); - - printf("request scan 3/4 "); - test_scan( &requests[TWO_CHUNKS_MULT_ZERO_END] - , &requests[CHUNKED_W_TRAILING_HEADERS] - , &requests[CHUNKED_W_BULLSHIT_AFTER_LENGTH] - ); - - printf("request scan 4/4 "); - test_scan( &requests[QUERY_URL_WITH_QUESTION_MARK_GET] - , &requests[PREFIX_NEWLINE_GET ] - , &requests[CONNECT_REQUEST] - ); - - puts("requests okay"); - - return 0; -} diff --git a/vendor/libgit2 b/vendor/libgit2 new file mode 160000 index 0000000000..2644628edb --- /dev/null +++ b/vendor/libgit2 @@ -0,0 +1 @@ +Subproject commit 2644628edb8742338a952d40f5e9549b17480e3a diff --git a/vendor/libgit2.gyp b/vendor/libgit2.gyp index 593efb8c12..aff29d76a2 100644 --- a/vendor/libgit2.gyp +++ b/vendor/libgit2.gyp @@ -7,7 +7,10 @@ "library%": "static_library", "openssl_enable_asm%": 0, # only supported with the Visual Studio 2012 (VC11) toolchain. "gcc_version%": 0, + "is_electron%": "=43", { - "cflags": [ - "-Wno-old-style-declaration" - ], - }], - ["OS=='solaris'", { - "defines": [ - "__EXTENSIONS__" - ], - }], - ["target_arch=='arm'", { - "sources": [ - "openssl/openssl/crypto/armcap.c" + ["OS=='linux'", { + "conditions": [ + ["<(is_electron) == 1", { + "include_dirs": ["<(electron_openssl_root)/include"] + }] ], - }], - ], + "sources": [ + "libgit2/deps/ntlmclient/crypt_openssl.c", + ], + "defines": [ + "CRYPT_OPENSSL" + ] + }] + ] }, + { + "target_name": "pcre", + "type": "static_library", + "sources": [ + "libgit2/deps/pcre/pcre_byte_order.c", + "libgit2/deps/pcre/pcre_chartables.c", + "libgit2/deps/pcre/pcre_compile.c", + "libgit2/deps/pcre/pcre_config.c", + "libgit2/deps/pcre/pcre_dfa_exec.c", + "libgit2/deps/pcre/pcre_exec.c", + "libgit2/deps/pcre/pcre_fullinfo.c", + "libgit2/deps/pcre/pcre_get.c", + "libgit2/deps/pcre/pcre_globals.c", + "libgit2/deps/pcre/pcre_jit_compile.c", + "libgit2/deps/pcre/pcre_maketables.c", + "libgit2/deps/pcre/pcre_newline.c", + "libgit2/deps/pcre/pcre_ord2utf8.c", + "libgit2/deps/pcre/pcreposix.c", + "libgit2/deps/pcre/pcre_printint.c", + "libgit2/deps/pcre/pcre_refcount.c", + "libgit2/deps/pcre/pcre_string_utils.c", + "libgit2/deps/pcre/pcre_study.c", + "libgit2/deps/pcre/pcre_tables.c", + "libgit2/deps/pcre/pcre_ucd.c", + "libgit2/deps/pcre/pcre_valid_utf8.c", + "libgit2/deps/pcre/pcre_version.c", + "libgit2/deps/pcre/pcre_xclass.c", + ], + "conditions": [ + ["OS=='linux' or OS.endswith('bsd') or <(is_IBMi) == 1", { + "defines": [ + "HAVE_DIRENT_H", + "HAVE_SYS_STAT_H", + "HAVE_SYS_TYPES_H", + "HAVE_UNISTD_H", + "HAVE_STDINT_H", + "HAVE_INTTYPES_H", + "HAVE_BCOPY", + "HAVE_MEMMOVE", + "HAVE_STRERROR", + "HAVE_STRTOLL", + "HAVE_STRTOQ", + "SUPPORT_PCRE8", + "NO_RECURSE", + "HAVE_LONG_LONG", + "HAVE_UNSIGNED_LONG_LONG", + "NEWLINE=10", + "POSIX_MALLOC_THRESHOLD=10", + "LINK_SIZE=2", + "PARENS_NEST_LIMIT=250", + "MATCH_LIMIT=10000000", + "MATCH_LIMIT_RECURSION=10000000", + "PCREGREP_BUFSIZE", + "MAX_NAME_SIZE=32", + "MAX_NAME_COUNT=10000" + ] + }], + ["OS=='win'", { + "defines": [ + "HAVE_SYS_STAT_H", + "HAVE_SYS_TYPES_H", + "HAVE_WINDOWS_H", + "HAVE_STDINT_H", + "HAVE_INTTYPES_H", + "HAVE_MEMMOVE", + "HAVE_STRERROR", + "HAVE_STRTOLL", + "HAVE__STRTOI64", + "SUPPORT_PCRE8", + "NO_RECURSE", + "HAVE_LONG_LONG", + "HAVE_UNSIGNED_LONG_LONG", + "NEWLINE=10", + "POSIX_MALLOC_THRESHOLD=10", + "LINK_SIZE=2", + "PARENS_NEST_LIMIT=250", + "MATCH_LIMIT=10000000", + "MATCH_LIMIT_RECURSION=10000000", + "PCREGREP_BUFSIZE", + "MAX_NAME_SIZE=32", + "MAX_NAME_COUNT=10000" + ] + }] + ] + } ] } diff --git a/vendor/libgit2/.HEADER b/vendor/libgit2/.HEADER deleted file mode 100644 index fd8430bc86..0000000000 --- a/vendor/libgit2/.HEADER +++ /dev/null @@ -1,24 +0,0 @@ -/* - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2, - * as published by the Free Software Foundation. - * - * In addition to the permissions in the GNU General Public License, - * the authors give you unlimited permission to link the compiled - * version of this file into combinations with other programs, - * and to distribute those combinations without any restriction - * coming from the use of this file. (The General Public License - * restrictions do apply in other respects; for example, they cover - * modification of the file, and distribution when not linked into - * a combined executable.) - * - * This file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ diff --git a/vendor/libgit2/.editorconfig b/vendor/libgit2/.editorconfig deleted file mode 100644 index be59274e86..0000000000 --- a/vendor/libgit2/.editorconfig +++ /dev/null @@ -1,14 +0,0 @@ -; Check http://editorconfig.org/ for more informations -; Top-most EditorConfig file -root = true - -; tab indentation -[*] -indent_style = tab -trim_trailing_whitespace = true -insert_final_newline = true - -; 4-column space indentation -[*.md] -indent_style = space -indent_size = 4 diff --git a/vendor/libgit2/.gitattributes b/vendor/libgit2/.gitattributes deleted file mode 100644 index 176a458f94..0000000000 --- a/vendor/libgit2/.gitattributes +++ /dev/null @@ -1 +0,0 @@ -* text=auto diff --git a/vendor/libgit2/.gitignore b/vendor/libgit2/.gitignore deleted file mode 100644 index 1ef1ec7300..0000000000 --- a/vendor/libgit2/.gitignore +++ /dev/null @@ -1,33 +0,0 @@ -/tests/clar.suite -/tests/clar.suite.rule -/tests/.clarcache -/apidocs -/trash-*.exe -/libgit2.pc -/config.mak -*.o -*.a -*.exe -*.gcda -*.gcno -*.gcov -.lock-wafbuild -.waf* -build/ -build-amiga/ -tests/tmp/ -msvc/Debug/ -msvc/Release/ -*.sln -*.suo -*.vc*proj* -*.sdf -*.opensdf -*.aps -*.cmake -!cmake/Modules/*.cmake -.DS_Store -*~ -.*.swp -tags -mkmf.log diff --git a/vendor/libgit2/.mailmap b/vendor/libgit2/.mailmap deleted file mode 100644 index c656f64c77..0000000000 --- a/vendor/libgit2/.mailmap +++ /dev/null @@ -1,21 +0,0 @@ -Vicent MartĂ­ Vicent Marti -Vicent MartĂ­ Vicent MartĂ­ -Michael Schubert schu -Ben Straub Ben Straub -Ben Straub Ben Straub -Carlos MartĂ­n Nieto -Carlos MartĂ­n Nieto -nulltoken -Scott J. Goldman -Martin Woodward -Peter Drahoš -Adam Roben -Adam Roben -Xavier L. -Xavier L. -Sascha Cunz -Authmillenon -Authmillenon -Edward Thomson -J. David Ibáñez -Russell Belfer diff --git a/vendor/libgit2/.travis.yml b/vendor/libgit2/.travis.yml deleted file mode 100644 index 9022fdec28..0000000000 --- a/vendor/libgit2/.travis.yml +++ /dev/null @@ -1,87 +0,0 @@ -# Travis-CI Build for libgit2 -# see travis-ci.org for details - -language: c - -os: - - linux - - osx - -compiler: - - gcc - - clang - -# Settings to try -env: - global: - - secure: "YnhS+8n6B+uoyaYfaJ3Lei7cSJqHDPiKJCKFIF2c87YDfmCvAJke8QtE7IzjYDs7UFkTCM4ox+ph2bERUrxZbSCyEkHdjIZpKuMJfYWja/jgMqTMxdyOH9y8JLFbZsSXDIXDwqBlC6vVyl1fP90M35wuWcNTs6tctfVWVofEFbs=" - - GITTEST_INVASIVE_FS_SIZE=1 - matrix: - - OPTIONS="-DTHREADSAFE=ON -DCMAKE_BUILD_TYPE=Release" - - OPTIONS="-DTHREADSAFE=OFF -DBUILD_EXAMPLES=ON" - -addons: - apt: - packages: - - cmake - - libssh2-1-dev - - openssh-client - - openssh-server - - valgrind - -sudo: false - -matrix: - fast_finish: true - exclude: - - os: osx - compiler: gcc - include: - - compiler: i586-mingw32msvc-gcc - env: OPTIONS="-DCMAKE_TOOLCHAIN_FILE=../script/toolchain-mingw32.cmake" SKIP_TESTS=1 - os: linux - - compiler: gcc - env: COVERITY=1 - os: linux - - compiler: gcc - env: - - VALGRIND=1 - OPTIONS="-DBUILD_CLAR=ON -DBUILD_EXAMPLES=OFF -DCMAKE_BUILD_TYPE=Debug" - os: linux - allow_failures: - - env: COVERITY=1 - - env: - - VALGRIND=1 - OPTIONS="-DBUILD_CLAR=ON -DBUILD_EXAMPLES=OFF -DCMAKE_BUILD_TYPE=Debug" - -install: - - if [ "$TRAVIS_OS_NAME" = "osx" ]; then ./script/install-deps-${TRAVIS_OS_NAME}.sh; fi - -# Run the Build script and tests -script: - - script/cibuild.sh - -# Run Tests -after_success: - - if [ "$TRAVIS_OS_NAME" = "linux" -a -n "$VALGRIND" ]; then valgrind --leak-check=full --show-reachable=yes --suppressions=./libgit2_clar.supp _build/libgit2_clar -ionline; fi - -# Only watch the development and master branches -branches: - only: - - master - - /^maint.*/ - -# Notify development list when needed -notifications: - irc: - channels: - - irc.freenode.net#libgit2 - on_success: change - on_failure: always - use_notice: true - skip_join: true - campfire: - on_success: always - on_failure: always - rooms: - - secure: "sH0dpPWMirbEe7AvLddZ2yOp8rzHalGmv0bYL/LIhVw3JDI589HCYckeLMSB\n3e/FeXw4bn0EqXWEXijVa4ijbilVY6d8oprdqMdWHEodng4KvY5vID3iZSGT\nxylhahO1XHmRynKQLOAvxlc93IlpVW38vQfby8giIY1nkpspb2w=" diff --git a/vendor/libgit2/AUTHORS b/vendor/libgit2/AUTHORS deleted file mode 100644 index 61e2113ec9..0000000000 --- a/vendor/libgit2/AUTHORS +++ /dev/null @@ -1,76 +0,0 @@ -The following people contribute or have contributed -to the libgit2 project (sorted alphabetically): - -Alex Budovski -Alexei Sholik -Andreas Ericsson -Anton "antong" Gyllenberg -Ankur Sethi -Arthur Schreiber -Ben Noordhuis -Ben Straub -Benjamin C Meyer -Brian Downing -Brian Lopez -Carlos MartĂ­n Nieto -Colin Timmermans -Daniel Huckstep -Dave Borowitz -David Boyce -David Glesser -Dmitry Kakurin -Dmitry Kovega -Emeric Fermas -Emmanuel Rodriguez -Florian Forster -Holger Weiss -Ingmar Vanhassel -J. David Ibáñez -Jacques Germishuys -Jakob Pfender -Jason Penny -Jason R. McNeil -Jerome Lambourg -Johan 't Hart -John Wiegley -Jonathan "Duke" Leto -Julien Miotte -Julio Espinoza-Sokal -Justin Love -Kelly "kelly.leahy" Leahy -Kirill A. Shutemov -Lambert CLARA -Luc Bertrand -Marc Pegon -Marcel Groothuis -Marco Villegas -Michael "schu" Schubert -Microsoft Corporation -Olivier Ramonat -Peter Drahoš -Pierre Habouzit -Pierre-Olivier Latour -Przemyslaw Pawelczyk -Ramsay Jones -Robert G. Jakabosky -Romain Geissler -Romain Muller -Russell Belfer -Sakari Jokinen -Samuel Charles "Sam" Day -Sarath Lakshman -Sascha Cunz -Sascha Peilicke -Scott Chacon -Sebastian Schuberth -Sergey Nikishin -Shawn O. Pearce -Shuhei Tanuma -Steve FrĂ©cinaux -Sven Strickroth -Tim Branyen -Tim Clem -Tim Harder -Torsten Bögershausen -Trent Mick -Vicent Marti diff --git a/vendor/libgit2/CHANGELOG.md b/vendor/libgit2/CHANGELOG.md deleted file mode 100644 index b824a66da3..0000000000 --- a/vendor/libgit2/CHANGELOG.md +++ /dev/null @@ -1,537 +0,0 @@ -v0.23 + 1 -------- - -### Changes or improvements - -### API additions - -### API removals - -v0.23 ------- - -### Changes or improvements - -* Patience and minimal diff drivers can now be used for merges. - -* Merges can now ignore whitespace changes. - -* Updated binary identification in CRLF filtering to avoid false positives in - UTF-8 files. - -* Rename and copy detection is enabled for small files. - -* Checkout can now handle an initial checkout of a repository, making - `GIT_CHECKOUT_SAFE_CREATE` unnecessary for users of clone. - -* The signature parameter in the ref-modifying functions has been - removed. Use `git_repository_set_ident()` and - `git_repository_ident()` to override the signature to be used. - -* The local transport now auto-scales the number of threads to use - when creating the packfile instead of sticking to one. - -* Reference renaming now uses the right id for the old value. - -* The annotated version of branch creation, HEAD detaching and reset - allow for specifying the expression from the user to be put into the - reflog. - -* `git_rebase_commit` now returns `GIT_EUNMERGED` when you attempt to - commit with unstaged changes. - -* On Mac OS X, we now use SecureTransport to provide the cryptographic - support for HTTPS connections insead of OpenSSL. - -* Checkout can now accept an index for the baseline computations via the - `baseline_index` member. - -* The configuration for fetching is no longer stored inside the - `git_remote` struct but has been moved to a `git_fetch_options`. The - remote functions now take these options or the callbacks instead of - setting them beforehand. - -* `git_submodule` instances are no longer cached or shared across - lookup. Each submodule represents the configuration at the time of - loading. - -* The index now uses diffs for `add_all()` and `update_all()` which - gives it a speed boost and closer semantics to git. - -* The ssh transport now reports the stderr output from the server as - the error message, which allows you to get the "repository not - found" messages. - -* `git_index_conflict_add()` will remove staged entries that exist for - conflicted paths. - -* The flags for a `git_diff_file` will now have the `GIT_DIFF_FLAG_EXISTS` - bit set when a file exists on that side of the diff. This is useful - for understanding whether a side of the diff exists in the presence of - a conflict. - -* The constructor for a write-stream into the odb now takes - `git_off_t` instead of `size_t` for the size of the blob, which - allows putting large files into the odb on 32-bit systems. - -* The remote's push and pull URLs now honor the url.$URL.insteadOf - configuration. This allows modifying URL prefixes to a custom - value via gitconfig. - -* `git_diff_foreach`, `git_diff_blobs`, `git_diff_blob_to_buffer`, - and `git_diff_buffers` now accept a new binary callback of type - `git_diff_binary_cb` that includes the binary diff information. - -* The race condition mitigations described in `racy-git.txt` have been - implemented. - -* If libcurl is installed, we will use it to connect to HTTP(S) - servers. - -### API additions - -* The `git_merge_options` gained a `file_flags` member. - -* Parsing and retrieving a configuration value as a path is exposed - via `git_config_parse_path()` and `git_config_get_path()` - respectively. - -* `git_repository_set_ident()` and `git_repository_ident()` serve to - set and query which identity will be used when writing to the - reflog. - -* `git_config_entry_free()` frees a config entry. - -* `git_config_get_string_buf()` provides a way to safely retrieve a - string from a non-snapshot configuration. - -* `git_annotated_commit_from_revspec()` allows to get an annotated - commit from an extended sha synatx string. - -* `git_repository_set_head_detached_from_annotated()`, - `git_branch_create_from_annotated()` and - `git_reset_from_annotated()` allow for the caller to provide an - annotated commit through which they can control what expression is - put into the reflog as the source/target. - -* `git_index_add_frombuffer()` can now create a blob from memory - buffer and add it to the index which is attached to a repository. - -* The structure `git_fetch_options` has been added to determine the - runtime configuration for fetching, such as callbacks, pruning and - autotag behaviour. It has the runtime initializer - `git_fetch_init_options()`. - -* The enum `git_fetch_prune_t` has been added, letting you specify the - pruning behaviour for a fetch. - -* A push operation will notify the caller of what updates it indends - to perform on the remote, which provides similar information to - git's pre-push hook. - -* `git_stash_apply()` can now apply a stashed state from the stash list, - placing the data into the working directory and index. - -* `git_stash_pop()` will apply a stashed state (like `git_stash_apply()`) - but will remove the stashed state after a successful application. - -* A new error code `GIT_EEOF` indicates an early EOF from the - server. This typically indicates an error with the URL or - configuration of the server, and tools can use this to show messages - about failing to communicate with the server. - -* A new error code `GIT_EINVALID` indicates that an argument to a - function is invalid, or an invalid operation was requested. - -* `git_diff_index_to_workdir()` and `git_diff_tree_to_index()` will now - produce deltas of type `GIT_DELTA_CONFLICTED` to indicate that the index - side of the delta is a conflict. - -* The `git_status` family of functions will now produce status of type - `GIT_STATUS_CONFLICTED` to indicate that a conflict exists for that file - in the index. - -* `git_index_entry_is_conflict()` is a utility function to determine if - a given index entry has a non-zero stage entry, indicating that it is - one side of a conflict. - -* It is now possible to pass a keypair via a buffer instead of a - path. For this, `GIT_CREDTYPE_SSH_MEMORY` and - `git_cred_ssh_key_memory_new()` have been added. - -* `git_filter_list_contains` will indicate whether a particular - filter will be run in the given filter list. - -* `git_commit_header_field()` has been added, which allows retrieving - the contents of an arbitrary header field. - -* `git_submodule_set_branch()` allows to set the configured branch for - a submodule. - -### API removals - -* `git_remote_save()` and `git_remote_clear_refspecs()` have been - removed. Remote's configuration is changed via the configuration - directly or through a convenience function which performs changes to - the configuration directly. - -* `git_remote_set_callbacks()`, `git_remote_get_callbacks()` and - `git_remote_set_transport()` have been removed and the remote no - longer stores this configuration. - -* `git_remote_set_fetch_refpecs()` and - `git_remote_set_push_refspecs()` have been removed. There is no - longer a way to set the base refspecs at run-time. - -* `git_submodule_save()` has been removed. The submodules are no - longer configured via the objects. - -* `git_submodule_reload_all()` has been removed as we no longer cache - submodules. - -### Breaking API changes - -* `git_smart_subtransport_cb` now has a `param` parameter. - -* The `git_merge_options` structure member `flags` has been renamed - to `tree_flags`. - -* The `git_merge_file_options` structure member `flags` is now - an unsigned int. It was previously a `git_merge_file_flags_t`. - -* `GIT_CHECKOUT_SAFE_CREATE` has been removed. Most users will generally - be able to switch to `GIT_CHECKOUT_SAFE`, but if you require missing - file handling during checkout, you may now use `GIT_CHECKOUT_SAFE | - GIT_CHECKOUT_RECREATE_MISSING`. - -* The `git_clone_options` and `git_submodule_update_options` - structures no longer have a `signature` field. - -* The following functions have removed the signature and/or log message - parameters in favour of git-emulating ones. - - * `git_branch_create()`, `git_branch_move()` - * `git_rebase_init()`, `git_rebase_abort()` - * `git_reference_symbolic_create_matching()`, - `git_reference_symbolic_create()`, `git_reference_create()`, - `git_reference_create_matching()`, - `git_reference_symbolic_set_target()`, - `git_reference_set_target()`, `git_reference_rename()` - * `git_remote_update_tips()`, `git_remote_fetch()`, `git_remote_push()` - * `git_repository_set_head()`, - `git_repository_set_head_detached()`, - `git_repository_detach_head()` - * `git_reset()` - -* `git_config_get_entry()` now gives back a ref-counted - `git_config_entry`. You must free it when you no longer need it. - -* `git_config_get_string()` will return an error if used on a - non-snapshot configuration, as there can be no guarantee that the - returned pointer is valid. - -* `git_note_default_ref()` now uses a `git_buf` to return the string, - as the string is otherwise not guaranteed to stay allocated. - -* `git_rebase_operation_current()` will return `GIT_REBASE_NO_OPERATION` - if it is called immediately after creating a rebase session but before - you have applied the first patch. - -* `git_rebase_options` now contains a `git_checkout_options` struct - that will be used for functions that modify the working directory, - namely `git_checkout_init`, `git_checkout_next` and - `git_checkout_abort`. As a result, `git_rebase_open` now also takes - a `git_rebase_options` and only the `git_rebase_init` and - `git_rebase_open` functions take a `git_rebase_options`, where they - will persist the options to subsequent `git_rebase` calls. - -* The `git_clone_options` struct now has fetch options in a - `fetch_opts` field instead of remote callbacks in - `remote_callbacks`. - -* The remote callbacks has gained a new member `push_negotiation` - which gets called before sending the update commands to the server. - -* The following functions no longer act on a remote instance but - change the repository's configuration. Their signatures have changed - accordingly: - - * `git_remote_set_url()`, `git_remote_seturl()` - * `git_remote_add_fetch()`, `git_remote_add_push()` and - * `git_remote_set_autotag()` - -* `git_remote_connect()` and `git_remote_prune()` now take a pointer - to the callbacks. - -* `git_remote_fetch()` and `git_remote_download()` now take a pointer - to fetch options which determine the runtime configuration. - -* The `git_remote_autotag_option_t` values have been changed. It has - gained a `_UNSPECIFIED` default value to specify no override for the - configured setting. - -* `git_remote_update_tips()` now takes a pointer to the callbacks as - well as a boolean whether to write `FETCH_HEAD` and the autotag - setting. - -* `git_remote_create_anonymous()` no longer takes a fetch refspec as - url-only remotes cannot have configured refspecs. - -* The `git_submodule_update_options` struct now has fetch options in - the `fetch_opts` field instead of callbacks in the - `remote_callbacks` field. - -* The following functions no longer act on a submodule instance but - change the repository's configuration. Their signatures have changed - accordingly: - - * `git_submodule_set_url()`, `git_submodule_set_ignore()`, - `git_submodule_set_update()`, - `git_submodule_set_fetch_recurse_submodules()`. - -* `git_submodule_status()` no longer takes a submodule instance but a - repsitory, a submodule name and an ignore setting. - -* The `push` function in the `git_transport` interface now takes a - pointer to the remote callbacks. - -* The `git_index_entry` struct's fields' types have been changed to - more accurately reflect what is in fact stored in the - index. Specifically, time and file size are 32 bits intead of 64, as - these values are truncated. - -* `GIT_EMERGECONFLICT` is now `GIT_ECONFLICT`, which more accurately - describes the nature of the error. - -* It is no longer allowed to call `git_buf_grow()` on buffers - borrowing the memory they point to. - -v0.22 ------- - -### Changes or improvements - -* `git_signature_new()` now requires a non-empty email address. - -* Use CommonCrypto libraries for SHA-1 calculation on Mac OS X. - -* Disable SSL compression and SSLv2 and SSLv3 ciphers in favor of TLSv1 - in OpenSSL. - -* The fetch behavior of remotes with autotag set to `GIT_REMOTE_DOWNLOAD_TAGS_ALL` - has been changed to match git 1.9.0 and later. In this mode, libgit2 now - fetches all tags in addition to whatever else needs to be fetched. - -* `git_checkout()` now handles case-changing renames correctly on - case-insensitive filesystems; for example renaming "readme" to "README". - -* The search for libssh2 is now done via pkg-config instead of a - custom search of a few directories. - -* Add support for core.protectHFS and core.protectNTFS. Add more - validation for filenames which we write such as references. - -* The local transport now generates textual progress output like - git-upload-pack does ("counting objects"). - -* `git_checkout_index()` can now check out an in-memory index that is not - necessarily the repository's index, so you may check out an index - that was produced by git_merge and friends while retaining the cached - information. - -* Remove the default timeout for receiving / sending data over HTTP using - the WinHTTP transport layer. - -* Add SPNEGO (Kerberos) authentication using GSSAPI on Unix systems. - -* Provide built-in objects for the empty blob (e69de29) and empty - tree (4b825dc) objects. - -* The index' tree cache is now filled upon read-tree and write-tree - and the cache is written to disk. - -* LF -> CRLF filter refuses to handle mixed-EOL files - -* LF -> CRLF filter now runs when * text = auto (with Git for Windows 1.9.4) - -* File unlocks are atomic again via rename. Read-only files on Windows are - made read-write if necessary. - -* Share open packfiles across repositories to share descriptors and mmaps. - -* Use a map for the treebuilder, making insertion O(1) - -* The build system now accepts an option EMBED_SSH_PATH which when set - tells it to include a copy of libssh2 at the given location. This is - enabled for MSVC. - -* Add support for refspecs with the asterisk in the middle of a - pattern. - -* Fetching now performs opportunistic updates. To achieve this, we - introduce a difference between active and passive refspecs, which - make `git_remote_download()` and `git_remote_fetch()` to take a list of - resfpecs to be the active list, similarly to how git fetch accepts a - list on the command-line. - -* The THREADSAFE option to build libgit2 with threading support has - been flipped to be on by default. - -* The remote object has learnt to prune remote-tracking branches. If - the remote is configured to do so, this will happen via - `git_remote_fetch()`. You can also call `git_remote_prune()` after - connecting or fetching to perform the prune. - - -### API additions - -* Introduce `git_buf_text_is_binary()` and `git_buf_text_contains_nul()` for - consumers to perform binary detection on a git_buf. - -* `git_branch_upstream_remote()` has been introduced to provide the - branch..remote configuration value. - -* Introduce `git_describe_commit()` and `git_describe_workdir()` to provide - a description of the current commit (and working tree, respectively) - based on the nearest tag or reference - -* Introduce `git_merge_bases()` and the `git_oidarray` type to expose all - merge bases between two commits. - -* Introduce `git_merge_bases_many()` to expose all merge bases between - multiple commits. - -* Introduce rebase functionality (using the merge algorithm only). - Introduce `git_rebase_init()` to begin a new rebase session, - `git_rebase_open()` to open an in-progress rebase session, - `git_rebase_commit()` to commit the current rebase operation, - `git_rebase_next()` to apply the next rebase operation, - `git_rebase_abort()` to abort an in-progress rebase and `git_rebase_finish()` - to complete a rebase operation. - -* Introduce `git_note_author()` and `git_note_committer()` to get the author - and committer information on a `git_note`, respectively. - -* A factory function for ssh has been added which allows to change the - path of the programs to execute for receive-pack and upload-pack on - the server, `git_transport_ssh_with_paths()`. - -* The ssh transport supports asking the remote host for accepted - credential types as well as multiple challeges using a single - connection. This requires to know which username you want to connect - as, so this introduces the USERNAME credential type which the ssh - transport will use to ask for the username. - -* The `GIT_EPEEL` error code has been introduced when we cannot peel a tag - to the requested object type; if the given object otherwise cannot be - peeled, `GIT_EINVALIDSPEC` is returned. - -* Introduce `GIT_REPOSITORY_INIT_RELATIVE_GITLINK` to use relative paths - when writing gitlinks, as is used by git core for submodules. - -* `git_remote_prune()` has been added. See above for description. - - -* Introduce reference transactions, which allow multiple references to - be locked at the same time and updates be queued. This also allows - us to safely update a reflog with arbitrary contents, as we need to - do for stash. - -### API removals - -* `git_remote_supported_url()` and `git_remote_is_valid_url()` have been - removed as they have become essentially useless with rsync-style ssh paths. - -* `git_clone_into()` and `git_clone_local_into()` have been removed from the - public API in favour of `git_clone callbacks`. - -* The option to ignore certificate errors via `git_remote_cert_check()` - is no longer present. Instead, `git_remote_callbacks` has gained a new - entry which lets the user perform their own certificate checks. - -### Breaking API changes - -* `git_cherry_pick()` is now `git_cherrypick()`. - -* The `git_submodule_update()` function was renamed to - `git_submodule_update_strategy()`. `git_submodule_update()` is now used to - provide functionalty similar to "git submodule update". - -* `git_treebuilder_create()` was renamed to `git_treebuilder_new()` to better - reflect it being a constructor rather than something which writes to - disk. - -* `git_treebuilder_new()` (was `git_treebuilder_create()`) now takes a - repository so that it can query repository configuration. - Subsequently, `git_treebuilder_write()` no longer takes a repository. - -* `git_threads_init()` and `git_threads_shutdown()` have been renamed to - `git_libgit2_init()` and `git_libgit2_shutdown()` to better explain what - their purpose is, as it's grown to be more than just about threads. - -* `git_libgit2_init()` and `git_libgit2_shutdown()` now return the number of - initializations of the library, so consumers may schedule work on the - first initialization. - -* The `git_transport_register()` function no longer takes a priority and takes - a URL scheme name (eg "http") instead of a prefix like "http://" - -* `git_index_name_entrycount()` and `git_index_reuc_entrycount()` now - return size_t instead of unsigned int. - -* The `context_lines` and `interhunk_lines` fields in `git_diff`_options are - now `uint32_t` instead of `uint16_t`. This allows to set them to `UINT_MAX`, - in effect asking for "infinite" context e.g. to iterate over all the - unmodified lines of a diff. - -* `git_status_file()` now takes an exact path. Use `git_status_list_new()` if - pathspec searching is needed. - -* `git_note_create()` has changed the position of the notes reference - name to match `git_note_remove()`. - -* Rename `git_remote_load()` to `git_remote_lookup()` to bring it in line - with the rest of the lookup functions. - -* `git_remote_rename()` now takes the repository and the remote's - current name. Accepting a remote indicates we want to change it, - which we only did partially. It is much clearer if we accept a name - and no loaded objects are changed. - -* `git_remote_delete()` now accepts the repository and the remote's name - instead of a loaded remote. - -* `git_merge_head` is now `git_annotated_commit`, to better reflect its usage - for multiple functions (including rebase) - -* The `git_clone_options` struct no longer provides the `ignore_cert_errors` or - `remote_name` members for remote customization. - - Instead, the `git_clone_options` struct has two new members, `remote_cb` and - `remote_cb_payload`, which allow the caller to completely override the remote - creation process. If needed, the caller can use this callback to give their - remote a name other than the default (origin) or disable cert checking. - - The `remote_callbacks` member has been preserved for convenience, although it - is not used when a remote creation callback is supplied. - -* The `git_clone`_options struct now provides `repository_cb` and - `repository_cb_payload` to allow the user to create a repository with - custom options. - -* The `git_push` struct to perform a push has been replaced with - `git_remote_upload()`. The refspecs and options are passed as a - function argument. `git_push_update_tips()` is now also - `git_remote_update_tips()` and the callbacks are in the same struct as - the rest. - -* The `git_remote_set_transport()` function now sets a transport factory function, - rather than a pre-existing transport instance. - -* The `git_transport` structure definition has moved into the sys/transport.h - file. - -* libgit2 no longer automatically sets the OpenSSL locking - functions. This is not something which we can know to do. A - last-resort convenience function is provided in sys/openssl.h, - `git_openssl_set_locking()` which can be used to set the locking. diff --git a/vendor/libgit2/CMakeLists.txt b/vendor/libgit2/CMakeLists.txt deleted file mode 100644 index 4747818fea..0000000000 --- a/vendor/libgit2/CMakeLists.txt +++ /dev/null @@ -1,608 +0,0 @@ -# CMake build script for the libgit2 project -# -# Building (out of source build): -# > mkdir build && cd build -# > cmake .. [-DSETTINGS=VALUE] -# > cmake --build . -# -# Testing: -# > ctest -V -# -# Install: -# > cmake --build . --target install - -PROJECT(libgit2 C) -CMAKE_MINIMUM_REQUIRED(VERSION 2.8) -CMAKE_POLICY(SET CMP0015 NEW) - -# Add find modules to the path -SET(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules/") - -INCLUDE(CheckLibraryExists) -INCLUDE(AddCFlagIfSupported) -INCLUDE(FindPkgConfig) - -# Build options -# -OPTION( SONAME "Set the (SO)VERSION of the target" ON ) -OPTION( BUILD_SHARED_LIBS "Build Shared Library (OFF for Static)" ON ) -OPTION( THREADSAFE "Build libgit2 as threadsafe" ON ) -OPTION( BUILD_CLAR "Build Tests using the Clar suite" ON ) -OPTION( BUILD_EXAMPLES "Build library usage example apps" OFF ) -OPTION( TAGS "Generate tags" OFF ) -OPTION( PROFILE "Generate profiling information" OFF ) -OPTION( ENABLE_TRACE "Enables tracing support" OFF ) -OPTION( LIBGIT2_FILENAME "Name of the produced binary" OFF ) - -OPTION( USE_ICONV "Link with and use iconv library" OFF ) -OPTION( USE_SSH "Link with libssh to enable SSH support" ON ) -OPTION( USE_GSSAPI "Link with libgssapi for SPNEGO auth" OFF ) -OPTION( VALGRIND "Configure build for valgrind" OFF ) -OPTION( CURL "User curl for HTTP if available" ON) - -IF(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") - SET( USE_ICONV ON ) - FIND_PACKAGE(Security) - FIND_PACKAGE(CoreFoundation REQUIRED) -ENDIF() - -IF(MSVC) - # This option is only available when building with MSVC. By default, libgit2 - # is build using the cdecl calling convention, which is useful if you're - # writing C. However, the CLR and Win32 API both expect stdcall. - # - # If you are writing a CLR program and want to link to libgit2, you'll want - # to turn this on by invoking CMake with the "-DSTDCALL=ON" argument. - OPTION( STDCALL "Build libgit2 with the __stdcall convention" OFF ) - - # This option must match the settings used in your program, in particular if you - # are linking statically - OPTION( STATIC_CRT "Link the static CRT libraries" ON ) - - ADD_DEFINITIONS(-D_SCL_SECURE_NO_WARNINGS) - ADD_DEFINITIONS(-D_CRT_SECURE_NO_DEPRECATE) - ADD_DEFINITIONS(-D_CRT_NONSTDC_NO_DEPRECATE) -ENDIF() - - -IF(WIN32) - # By default, libgit2 is built with WinHTTP. To use the built-in - # HTTP transport, invoke CMake with the "-DWINHTTP=OFF" argument. - OPTION( WINHTTP "Use Win32 WinHTTP routines" ON ) -ENDIF() - -IF(MSVC) - # Enable MSVC CRTDBG memory leak reporting when in debug mode. - OPTION(MSVC_CRTDBG "Enable CRTDBG memory leak reporting" OFF) -ENDIF() - -IF (NOT ${CMAKE_SYSTEM_NAME} MATCHES "Darwin") - OPTION( USE_OPENSSL "Link with and use openssl library" ON ) -ENDIF() - -# This variable will contain the libraries we need to put into -# libgit2.pc's Requires.private. That is, what we're linking to or -# what someone who's statically linking us needs to link to. -SET(LIBGIT2_PC_REQUIRES "") -# This will be set later if we use the system's http-parser library or -# use iconv (OSX) and will be written to the Libs.private field in the -# pc file. -SET(LIBGIT2_PC_LIBS "") - -# Installation paths -# -SET(BIN_INSTALL_DIR bin CACHE PATH "Where to install binaries to.") -SET(LIB_INSTALL_DIR lib CACHE PATH "Where to install libraries to.") -SET(INCLUDE_INSTALL_DIR include CACHE PATH "Where to install headers to.") - -FUNCTION(TARGET_OS_LIBRARIES target) - IF(WIN32) - TARGET_LINK_LIBRARIES(${target} ws2_32) - ELSEIF(CMAKE_SYSTEM_NAME MATCHES "(Solaris|SunOS)") - TARGET_LINK_LIBRARIES(${target} socket nsl) - LIST(APPEND LIBGIT2_PC_LIBS "-lsocket" "-lnsl") - SET(LIBGIT2_PC_LIBS ${LIBGIT2_PC_LIBS} PARENT_SCOPE) - ENDIF() - CHECK_LIBRARY_EXISTS(rt clock_gettime "time.h" NEED_LIBRT) - IF(NEED_LIBRT) - TARGET_LINK_LIBRARIES(${target} rt) - LIST(APPEND LIBGIT2_PC_LIBS "-lrt") - SET(LIBGIT2_PC_LIBS ${LIBGIT2_PC_LIBS} PARENT_SCOPE) - ENDIF() - - IF(THREADSAFE) - TARGET_LINK_LIBRARIES(${target} ${CMAKE_THREAD_LIBS_INIT}) - ENDIF() -ENDFUNCTION() - -# For the MSVC IDE, this function splits up the source files like windows -# explorer does. This is esp. useful with the libgit2_clar project, were -# usually 2 or more files share the same name. Sadly, this file grouping -# is a per-directory option in cmake and not per-target, resulting in -# empty virtual folders "tests" for the git2.dll -FUNCTION(MSVC_SPLIT_SOURCES target) - IF(MSVC_IDE) - GET_TARGET_PROPERTY(sources ${target} SOURCES) - FOREACH(source ${sources}) - IF(source MATCHES ".*/") - STRING(REPLACE ${CMAKE_CURRENT_SOURCE_DIR}/ "" rel ${source}) - IF(rel) - STRING(REGEX REPLACE "/([^/]*)$" "" rel ${rel}) - IF(rel) - STRING(REPLACE "/" "\\\\" rel ${rel}) - SOURCE_GROUP(${rel} FILES ${source}) - ENDIF() - ENDIF() - ENDIF() - ENDFOREACH() - ENDIF() -ENDFUNCTION() - -FILE(STRINGS "include/git2/version.h" GIT2_HEADER REGEX "^#define LIBGIT2_VERSION \"[^\"]*\"$") - -STRING(REGEX REPLACE "^.*LIBGIT2_VERSION \"([0-9]+).*$" "\\1" LIBGIT2_VERSION_MAJOR "${GIT2_HEADER}") -STRING(REGEX REPLACE "^.*LIBGIT2_VERSION \"[0-9]+\\.([0-9]+).*$" "\\1" LIBGIT2_VERSION_MINOR "${GIT2_HEADER}") -STRING(REGEX REPLACE "^.*LIBGIT2_VERSION \"[0-9]+\\.[0-9]+\\.([0-9]+).*$" "\\1" LIBGIT2_VERSION_REV "${GIT2_HEADER}") -SET(LIBGIT2_VERSION_STRING "${LIBGIT2_VERSION_MAJOR}.${LIBGIT2_VERSION_MINOR}.${LIBGIT2_VERSION_REV}") - -FILE(STRINGS "include/git2/version.h" GIT2_HEADER_SOVERSION REGEX "^#define LIBGIT2_SOVERSION [0-9]+$") -STRING(REGEX REPLACE "^.*LIBGIT2_SOVERSION ([0-9]+)$" "\\1" LIBGIT2_SOVERSION "${GIT2_HEADER_SOVERSION}") - -# Find required dependencies -INCLUDE_DIRECTORIES(src include) - -IF (SECURITY_FOUND) - MESSAGE("-- Found Security ${SECURITY_DIRS}") - LIST(APPEND LIBGIT2_PC_LIBS "-framework Security") -ENDIF() - -IF (COREFOUNDATION_FOUND) - MESSAGE("-- Found CoreFoundation ${COREFOUNDATION_DIRS}") - LIST(APPEND LIBGIT2_PC_LIBS "-framework CoreFoundation") -ENDIF() - - -IF (WIN32 AND WINHTTP) - ADD_DEFINITIONS(-DGIT_WINHTTP) - INCLUDE_DIRECTORIES(deps/http-parser) - FILE(GLOB SRC_HTTP deps/http-parser/*.c deps/http-parser/*.h) - - # Since MinGW does not come with headers or an import library for winhttp, - # we have to include a private header and generate our own import library - IF (MINGW) - FIND_PROGRAM(DLLTOOL dlltool CMAKE_FIND_ROOT_PATH_BOTH) - IF (NOT DLLTOOL) - MESSAGE(FATAL_ERROR "Could not find dlltool command") - ENDIF () - - SET(LIBWINHTTP_PATH "${CMAKE_CURRENT_BINARY_DIR}/deps/winhttp") - FILE(MAKE_DIRECTORY ${LIBWINHTTP_PATH}) - - IF ("${CMAKE_SIZEOF_VOID_P}" EQUAL "8") - set(WINHTTP_DEF "${CMAKE_CURRENT_SOURCE_DIR}/deps/winhttp/winhttp64.def") - ELSE() - set(WINHTTP_DEF "${CMAKE_CURRENT_SOURCE_DIR}/deps/winhttp/winhttp.def") - ENDIF() - - ADD_CUSTOM_COMMAND( - OUTPUT ${LIBWINHTTP_PATH}/libwinhttp.a - COMMAND ${DLLTOOL} -d ${WINHTTP_DEF} -k -D winhttp.dll -l libwinhttp.a - DEPENDS ${WINHTTP_DEF} - WORKING_DIRECTORY ${LIBWINHTTP_PATH} - ) - - SET_SOURCE_FILES_PROPERTIES( - ${CMAKE_CURRENT_SOURCE_DIR}/src/transports/winhttp.c - PROPERTIES OBJECT_DEPENDS ${LIBWINHTTP_PATH}/libwinhttp.a - ) - - INCLUDE_DIRECTORIES(deps/winhttp) - LINK_DIRECTORIES(${LIBWINHTTP_PATH}) - ENDIF () - - LINK_LIBRARIES(winhttp rpcrt4 crypt32) -ELSE () - IF (CURL) - PKG_CHECK_MODULES(CURL libcurl) - ENDIF () - - IF (NOT AMIGA AND USE_OPENSSL) - FIND_PACKAGE(OpenSSL) - ENDIF () - - IF (CURL_FOUND) - ADD_DEFINITIONS(-DGIT_CURL) - INCLUDE_DIRECTORIES(${CURL_INCLUDE_DIRS}) - LINK_LIBRARIES(${CURL_LIBRARIES}) - LIST(APPEND LIBGIT2_PC_LIBS ${CURL_LDFLAGS}) - ENDIF() - - FIND_PACKAGE(HTTP_Parser) - IF (HTTP_PARSER_FOUND AND HTTP_PARSER_VERSION_MAJOR EQUAL 2) - INCLUDE_DIRECTORIES(${HTTP_PARSER_INCLUDE_DIRS}) - LINK_LIBRARIES(${HTTP_PARSER_LIBRARIES}) - LIST(APPEND LIBGIT2_PC_LIBS "-lhttp_parser") - ELSE() - MESSAGE(STATUS "http-parser was not found or is too old; using bundled 3rd-party sources.") - INCLUDE_DIRECTORIES(deps/http-parser) - FILE(GLOB SRC_HTTP deps/http-parser/*.c deps/http-parser/*.h) - ENDIF() -ENDIF() - -# Specify sha1 implementation -IF (WIN32 AND NOT MINGW AND NOT SHA1_TYPE STREQUAL "builtin") - ADD_DEFINITIONS(-DWIN32_SHA1) - FILE(GLOB SRC_SHA1 src/hash/hash_win32.c) -ELSEIF (${CMAKE_SYSTEM_NAME} MATCHES "Darwin") - ADD_DEFINITIONS(-DGIT_COMMON_CRYPTO) -ELSEIF (OPENSSL_FOUND AND NOT SHA1_TYPE STREQUAL "builtin") - ADD_DEFINITIONS(-DOPENSSL_SHA1) - IF (CMAKE_SYSTEM_NAME MATCHES "FreeBSD") - LIST(APPEND LIBGIT2_PC_LIBS "-lssl") - ELSE() - SET(LIBGIT2_PC_REQUIRES "${LIBGIT2_PC_REQUIRES} openssl") - ENDIF () -ELSE() - FILE(GLOB SRC_SHA1 src/hash/hash_generic.c) -ENDIF() - -# Enable tracing -IF (ENABLE_TRACE STREQUAL "ON") - ADD_DEFINITIONS(-DGIT_TRACE) -ENDIF() - -# Include POSIX regex when it is required -IF(WIN32 OR AMIGA OR CMAKE_SYSTEM_NAME MATCHES "(Solaris|SunOS)") - INCLUDE_DIRECTORIES(deps/regex) - SET(SRC_REGEX deps/regex/regex.c) -ENDIF() - -# Optional external dependency: zlib -FIND_PACKAGE(ZLIB) -IF (ZLIB_FOUND) - INCLUDE_DIRECTORIES(${ZLIB_INCLUDE_DIRS}) - LINK_LIBRARIES(${ZLIB_LIBRARIES}) - IF(APPLE OR CMAKE_SYSTEM_NAME MATCHES "FreeBSD") - LIST(APPEND LIBGIT2_PC_LIBS "-lz") - ELSE() - SET(LIBGIT2_PC_REQUIRES "${LIBGIT2_PC_REQUIRES} zlib") - ENDIF() -ELSE() - MESSAGE(STATUS "zlib was not found; using bundled 3rd-party sources." ) - INCLUDE_DIRECTORIES(deps/zlib) - ADD_DEFINITIONS(-DNO_VIZ -DSTDC -DNO_GZIP) - FILE(GLOB SRC_ZLIB deps/zlib/*.c deps/zlib/*.h) -ENDIF() - -# Optional external dependency: libssh2 -IF (USE_SSH) - PKG_CHECK_MODULES(LIBSSH2 libssh2) -ENDIF() -IF (LIBSSH2_FOUND) - ADD_DEFINITIONS(-DGIT_SSH) - INCLUDE_DIRECTORIES(${LIBSSH2_INCLUDE_DIRS}) - LINK_DIRECTORIES(${LIBSSH2_LIBRARY_DIRS}) - LIST(APPEND LIBGIT2_PC_LIBS ${LIBSSH2_LDFLAGS}) - #SET(LIBGIT2_PC_LIBS "${LIBGIT2_PC_LIBS} ${LIBSSH2_LDFLAGS}") - SET(SSH_LIBRARIES ${LIBSSH2_LIBRARIES}) - - CHECK_LIBRARY_EXISTS("${LIBSSH2_LIBRARIES}" libssh2_userauth_publickey_frommemory "" HAVE_LIBSSH2_MEMORY_CREDENTIALS) - IF (HAVE_LIBSSH2_MEMORY_CREDENTIALS) - ADD_DEFINITIONS(-DGIT_SSH_MEMORY_CREDENTIALS) - ENDIF() -ELSE() - MESSAGE(STATUS "LIBSSH2 not found. Set CMAKE_PREFIX_PATH if it is installed outside of the default search path.") -ENDIF() - -# Optional external dependency: libgssapi -IF (USE_GSSAPI) - FIND_PACKAGE(GSSAPI) -ENDIF() -IF (GSSAPI_FOUND) - ADD_DEFINITIONS(-DGIT_GSSAPI) -ENDIF() - -# Optional external dependency: iconv -IF (USE_ICONV) - FIND_PACKAGE(Iconv) -ENDIF() -IF (ICONV_FOUND) - ADD_DEFINITIONS(-DGIT_USE_ICONV) - INCLUDE_DIRECTORIES(${ICONV_INCLUDE_DIR}) - LIST(APPEND LIBGIT2_PC_LIBS ${ICONV_LIBRARIES}) -ENDIF() - -# Platform specific compilation flags -IF (MSVC) - - STRING(REPLACE "/Zm1000" " " CMAKE_C_FLAGS "${CMAKE_C_FLAGS}") - - # /GF - String pooling - # /MP - Parallel build - SET(CMAKE_C_FLAGS "/GF /MP /nologo ${CMAKE_C_FLAGS}") - - IF (STDCALL) - # /Gz - stdcall calling convention - SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /Gz") - ENDIF () - - IF (STATIC_CRT) - SET(CRT_FLAG_DEBUG "/MTd") - SET(CRT_FLAG_RELEASE "/MT") - ELSE() - SET(CRT_FLAG_DEBUG "/MDd") - SET(CRT_FLAG_RELEASE "/MD") - ENDIF() - - IF (MSVC_CRTDBG) - SET(CRT_FLAG_DEBUG "${CRT_FLAG_DEBUG} /DGIT_MSVC_CRTDBG") - ENDIF() - - # /Zi - Create debugging information - # /Od - Disable optimization - # /D_DEBUG - #define _DEBUG - # /MTd - Statically link the multithreaded debug version of the CRT - # /MDd - Dynamically link the multithreaded debug version of the CRT - # /RTC1 - Run time checks - SET(CMAKE_C_FLAGS_DEBUG "/Zi /Od /D_DEBUG /RTC1 ${CRT_FLAG_DEBUG}") - - # /DNDEBUG - Disables asserts - # /MT - Statically link the multithreaded release version of the CRT - # /MD - Dynamically link the multithreaded release version of the CRT - # /O2 - Optimize for speed - # /Oy - Enable frame pointer omission (FPO) (otherwise CMake will automatically turn it off) - # /GL - Link time code generation (whole program optimization) - # /Gy - Function-level linking - SET(CMAKE_C_FLAGS_RELEASE "/DNDEBUG /O2 /Oy /GL /Gy ${CRT_FLAG_RELEASE}") - - # /Oy- - Disable frame pointer omission (FPO) - SET(CMAKE_C_FLAGS_RELWITHDEBINFO "/DNDEBUG /Zi /O2 /Oy- /GL /Gy ${CRT_FLAG_RELEASE}") - - # /O1 - Optimize for size - SET(CMAKE_C_FLAGS_MINSIZEREL "/DNDEBUG /O1 /Oy /GL /Gy ${CRT_FLAG_RELEASE}") - - # /DYNAMICBASE - Address space load randomization (ASLR) - # /NXCOMPAT - Data execution prevention (DEP) - # /LARGEADDRESSAWARE - >2GB user address space on x86 - # /VERSION - Embed version information in PE header - SET(CMAKE_EXE_LINKER_FLAGS "/DYNAMICBASE /NXCOMPAT /LARGEADDRESSAWARE /VERSION:${LIBGIT2_VERSION_MAJOR}.${LIBGIT2_VERSION_MINOR}") - - # /DEBUG - Create a PDB - # /LTCG - Link time code generation (whole program optimization) - # /OPT:REF /OPT:ICF - Fold out duplicate code at link step - # /INCREMENTAL:NO - Required to use /LTCG - # /DEBUGTYPE:cv,fixup - Additional data embedded in the PDB (requires /INCREMENTAL:NO, so not on for Debug) - SET(CMAKE_EXE_LINKER_FLAGS_DEBUG "/DEBUG") - SET(CMAKE_EXE_LINKER_FLAGS_RELEASE "/RELEASE /LTCG /OPT:REF /OPT:ICF /INCREMENTAL:NO") - SET(CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO "/DEBUG /RELEASE /LTCG /OPT:REF /OPT:ICF /INCREMENTAL:NO /DEBUGTYPE:cv,fixup") - SET(CMAKE_EXE_LINKER_FLAGS_MINSIZEREL "/RELEASE /LTCG /OPT:REF /OPT:ICF /INCREMENTAL:NO") - - # Same linker settings for DLL as EXE - SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS}") - SET(CMAKE_SHARED_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG}") - SET(CMAKE_SHARED_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE}") - SET(CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO}") - SET(CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL "${CMAKE_EXE_LINKER_FLAGS_MINSIZEREL}") - - SET(WIN_RC "src/win32/git2.rc") - - # Precompiled headers - -ELSE () - SET(CMAKE_C_FLAGS "-D_GNU_SOURCE -Wall -Wextra ${CMAKE_C_FLAGS}") - - IF (CMAKE_SYSTEM_NAME MATCHES "(Solaris|SunOS)") - SET(CMAKE_C_FLAGS "-std=c99 -D_POSIX_C_SOURCE=200112L -D__EXTENSIONS__ -D_POSIX_PTHREAD_SEMANTICS ${CMAKE_C_FLAGS}") - ENDIF() - - IF (WIN32 AND NOT CYGWIN) - SET(CMAKE_C_FLAGS_DEBUG "-D_DEBUG") - ENDIF () - - IF (MINGW) # MinGW always does PIC and complains if we tell it to - STRING(REGEX REPLACE "-fPIC" "" CMAKE_SHARED_LIBRARY_C_FLAGS "${CMAKE_SHARED_LIBRARY_C_FLAGS}") - # MinGW >= 3.14 uses the C99-style stdio functions - # automatically, but forks like mingw-w64 still want - # us to define this in order to use them - ADD_DEFINITIONS(-D__USE_MINGW_ANSI_STDIO=1) - - ELSEIF (BUILD_SHARED_LIBS) - ADD_C_FLAG_IF_SUPPORTED(-fvisibility=hidden) - - SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC") - ENDIF () - - ADD_C_FLAG_IF_SUPPORTED(-Wdocumentation) - ADD_C_FLAG_IF_SUPPORTED(-Wno-missing-field-initializers) - ADD_C_FLAG_IF_SUPPORTED(-Wstrict-aliasing=2) - ADD_C_FLAG_IF_SUPPORTED(-Wstrict-prototypes) - ADD_C_FLAG_IF_SUPPORTED(-Wdeclaration-after-statement) - ADD_C_FLAG_IF_SUPPORTED(-Wno-unused-const-variable) - ADD_C_FLAG_IF_SUPPORTED(-Wno-unused-function) - - IF (APPLE) # Apple deprecated OpenSSL - ADD_C_FLAG_IF_SUPPORTED(-Wno-deprecated-declarations) - ENDIF() - - IF (PROFILE) - SET(CMAKE_C_FLAGS "-pg ${CMAKE_C_FLAGS}") - SET(CMAKE_EXE_LINKER_FLAGS "-pg ${CMAKE_EXE_LINKER_FLAGS}") - ENDIF () -ENDIF() - -IF( NOT CMAKE_CONFIGURATION_TYPES ) - # Build Debug by default - IF (NOT CMAKE_BUILD_TYPE) - SET(CMAKE_BUILD_TYPE "Debug" CACHE STRING "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel." FORCE) - ENDIF () -ELSE() - # Using a multi-configuration generator eg MSVC or Xcode - # that uses CMAKE_CONFIGURATION_TYPES and not CMAKE_BUILD_TYPE -ENDIF() - -IF (SECURITY_FOUND) - ADD_DEFINITIONS(-DGIT_SECURE_TRANSPORT) - INCLUDE_DIRECTORIES(${SECURITY_INCLUDE_DIR}) -ENDIF () - -IF (OPENSSL_FOUND) - ADD_DEFINITIONS(-DGIT_OPENSSL) - INCLUDE_DIRECTORIES(${OPENSSL_INCLUDE_DIR}) - SET(SSL_LIBRARIES ${OPENSSL_LIBRARIES}) -ENDIF() - - - -IF (THREADSAFE) - IF (NOT WIN32) - FIND_PACKAGE(Threads REQUIRED) - ENDIF() - - ADD_DEFINITIONS(-DGIT_THREADS) -ENDIF() - -ADD_DEFINITIONS(-D_FILE_OFFSET_BITS=64) - -# Collect sourcefiles -FILE(GLOB SRC_H include/git2.h include/git2/*.h include/git2/sys/*.h) - -# On Windows use specific platform sources -IF (WIN32 AND NOT CYGWIN) - ADD_DEFINITIONS(-DWIN32 -D_WIN32_WINNT=0x0501) - FILE(GLOB SRC_OS src/win32/*.c src/win32/*.h) -ELSEIF (AMIGA) - ADD_DEFINITIONS(-DNO_ADDRINFO -DNO_READDIR_R -DNO_MMAP) -ELSE() - IF (VALGRIND) - ADD_DEFINITIONS(-DNO_MMAP) - ENDIF() - FILE(GLOB SRC_OS src/unix/*.c src/unix/*.h) -ENDIF() -FILE(GLOB SRC_GIT2 src/*.c src/*.h src/transports/*.c src/transports/*.h src/xdiff/*.c src/xdiff/*.h) - -# Determine architecture of the machine -IF (CMAKE_SIZEOF_VOID_P EQUAL 8) - ADD_DEFINITIONS(-DGIT_ARCH_64) -ELSEIF (CMAKE_SIZEOF_VOID_P EQUAL 4) - ADD_DEFINITIONS(-DGIT_ARCH_32) -ELSE() - MESSAGE(FATAL_ERROR "Unsupported architecture") -ENDIF() - -# Compile and link libgit2 -ADD_LIBRARY(git2 ${SRC_H} ${SRC_GIT2} ${SRC_OS} ${SRC_ZLIB} ${SRC_HTTP} ${SRC_REGEX} ${SRC_SHA1} ${WIN_RC}) -TARGET_LINK_LIBRARIES(git2 ${SECURITY_DIRS}) -TARGET_LINK_LIBRARIES(git2 ${COREFOUNDATION_DIRS}) -TARGET_LINK_LIBRARIES(git2 ${SSL_LIBRARIES}) -TARGET_LINK_LIBRARIES(git2 ${SSH_LIBRARIES}) -TARGET_LINK_LIBRARIES(git2 ${GSSAPI_LIBRARIES}) -TARGET_LINK_LIBRARIES(git2 ${ICONV_LIBRARIES}) -TARGET_OS_LIBRARIES(git2) - -# Workaround for Cmake bug #0011240 (see http://public.kitware.com/Bug/view.php?id=11240) -# Win64+MSVC+static libs = linker error -IF(MSVC AND GIT_ARCH_64 AND NOT BUILD_SHARED_LIBS) - SET_TARGET_PROPERTIES(git2 PROPERTIES STATIC_LIBRARY_FLAGS "/MACHINE:x64") -ENDIF() - -MSVC_SPLIT_SOURCES(git2) - -IF (SONAME) - SET_TARGET_PROPERTIES(git2 PROPERTIES VERSION ${LIBGIT2_VERSION_STRING}) - SET_TARGET_PROPERTIES(git2 PROPERTIES SOVERSION ${LIBGIT2_SOVERSION}) - IF (LIBGIT2_FILENAME) - ADD_DEFINITIONS(-DLIBGIT2_FILENAME=\"${LIBGIT2_FILENAME}\") - SET_TARGET_PROPERTIES(git2 PROPERTIES OUTPUT_NAME ${LIBGIT2_FILENAME}) - ENDIF() -ENDIF() -STRING(REPLACE ";" " " LIBGIT2_PC_LIBS "${LIBGIT2_PC_LIBS}") -CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/libgit2.pc.in ${CMAKE_CURRENT_BINARY_DIR}/libgit2.pc @ONLY) - -IF (MSVC_IDE) - # Precompiled headers - SET_TARGET_PROPERTIES(git2 PROPERTIES COMPILE_FLAGS "/Yuprecompiled.h /FIprecompiled.h") - SET_SOURCE_FILES_PROPERTIES(src/win32/precompiled.c COMPILE_FLAGS "/Ycprecompiled.h") -ENDIF () - -# Install -INSTALL(TARGETS git2 - RUNTIME DESTINATION ${BIN_INSTALL_DIR} - LIBRARY DESTINATION ${LIB_INSTALL_DIR} - ARCHIVE DESTINATION ${LIB_INSTALL_DIR} -) -INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/libgit2.pc DESTINATION ${LIB_INSTALL_DIR}/pkgconfig ) -INSTALL(DIRECTORY include/git2 DESTINATION ${INCLUDE_INSTALL_DIR} ) -INSTALL(FILES include/git2.h DESTINATION ${INCLUDE_INSTALL_DIR} ) - -# Tests -IF (BUILD_CLAR) - FIND_PACKAGE(PythonInterp REQUIRED) - - SET(CLAR_FIXTURES "${CMAKE_CURRENT_SOURCE_DIR}/tests/resources/") - SET(CLAR_PATH "${CMAKE_CURRENT_SOURCE_DIR}/tests") - SET(CLAR_RESOURCES "${CMAKE_CURRENT_SOURCE_DIR}/tests/resources" CACHE PATH "Path to test resources.") - ADD_DEFINITIONS(-DCLAR_FIXTURE_PATH=\"${CLAR_FIXTURES}\") - ADD_DEFINITIONS(-DCLAR_RESOURCES=\"${TEST_RESOURCES}\") - ADD_DEFINITIONS(-DCLAR_TMPDIR=\"libgit2_tests\") - - INCLUDE_DIRECTORIES(${CLAR_PATH}) - FILE(GLOB_RECURSE SRC_TEST ${CLAR_PATH}/*/*.c ${CLAR_PATH}/*/*.h) - SET(SRC_CLAR "${CLAR_PATH}/main.c" "${CLAR_PATH}/clar_libgit2.c" "${CLAR_PATH}/clar_libgit2_trace.c" "${CLAR_PATH}/clar_libgit2_timer.c" "${CLAR_PATH}/clar.c") - - ADD_CUSTOM_COMMAND( - OUTPUT ${CLAR_PATH}/clar.suite - COMMAND ${PYTHON_EXECUTABLE} generate.py -f -xonline -xstress . - DEPENDS ${SRC_TEST} - WORKING_DIRECTORY ${CLAR_PATH} - ) - - SET_SOURCE_FILES_PROPERTIES( - ${CLAR_PATH}/clar.c - PROPERTIES OBJECT_DEPENDS ${CLAR_PATH}/clar.suite) - - ADD_EXECUTABLE(libgit2_clar ${SRC_H} ${SRC_GIT2} ${SRC_OS} ${SRC_CLAR} ${SRC_TEST} ${SRC_ZLIB} ${SRC_HTTP} ${SRC_REGEX} ${SRC_SHA1}) - - TARGET_LINK_LIBRARIES(libgit2_clar ${COREFOUNDATION_DIRS}) - TARGET_LINK_LIBRARIES(libgit2_clar ${SECURITY_DIRS}) - TARGET_LINK_LIBRARIES(libgit2_clar ${SSL_LIBRARIES}) - TARGET_LINK_LIBRARIES(libgit2_clar ${SSH_LIBRARIES}) - TARGET_LINK_LIBRARIES(libgit2_clar ${GSSAPI_LIBRARIES}) - TARGET_LINK_LIBRARIES(libgit2_clar ${ICONV_LIBRARIES}) - TARGET_OS_LIBRARIES(libgit2_clar) - MSVC_SPLIT_SOURCES(libgit2_clar) - - IF (MSVC_IDE) - # Precompiled headers - SET_TARGET_PROPERTIES(libgit2_clar PROPERTIES COMPILE_FLAGS "/Yuprecompiled.h /FIprecompiled.h") - ENDIF () - - ENABLE_TESTING() - IF (WINHTTP OR OPENSSL_FOUND OR SECURITY_FOUND) - ADD_TEST(libgit2_clar libgit2_clar -ionline) - ELSE () - ADD_TEST(libgit2_clar libgit2_clar -v) - ENDIF () -ENDIF () - -IF (TAGS) - FIND_PROGRAM(CTAGS ctags) - IF (NOT CTAGS) - MESSAGE(FATAL_ERROR "Could not find ctags command") - ENDIF () - - FILE(GLOB_RECURSE SRC_ALL *.[ch]) - - ADD_CUSTOM_COMMAND( - OUTPUT tags - COMMAND ${CTAGS} -a ${SRC_ALL} - DEPENDS ${SRC_ALL} - ) - ADD_CUSTOM_TARGET( - do_tags ALL - DEPENDS tags - ) -ENDIF () - -IF (BUILD_EXAMPLES) - ADD_SUBDIRECTORY(examples) -ENDIF () diff --git a/vendor/libgit2/CONTRIBUTING.md b/vendor/libgit2/CONTRIBUTING.md deleted file mode 100644 index 71fad63a95..0000000000 --- a/vendor/libgit2/CONTRIBUTING.md +++ /dev/null @@ -1,146 +0,0 @@ -# Welcome to libgit2! - -We're making it easy to do interesting things with git, and we'd love to have -your help. - -## Licensing - -By contributing to libgit2, you agree to release your contribution under -the terms of the license. Except for the `examples` directory, all code -is released under the [GPL v2 with linking exception](COPYING). - -The `examples` code is governed by the -[CC0 Public Domain Dedication](examples/COPYING), so that you may copy -from them into your own application. - -## Discussion & Chat - -We hang out in the -[`#libgit2`](http://webchat.freenode.net/?channels=#libgit2)) channel on -irc.freenode.net. - -Also, feel free to open an -[Issue](https://github.com/libgit2/libgit2/issues/new) to start a discussion -about any concerns you have. We like to use Issues for that so there is an -easily accessible permanent record of the conversation. - -## Libgit2 Versions - -The `master` branch is the main branch where development happens. -Releases are tagged -(e.g. [v0.21.0](https://github.com/libgit2/libgit2/releases/tag/v0.21.0) ) -and when a critical bug fix needs to be backported, it will be done on a -`-maint` maintenance branch. - -## Reporting Bugs - -First, know which version of libgit2 your problem is in and include it in -your bug report. This can either be a tag (e.g. -[v0.17.0](https://github.com/libgit2/libgit2/releases/tag/v0.17.0)) or a -commit SHA -(e.g. [01be7863](https://github.com/libgit2/libgit2/commit/01be7863)). -Using [`git describe`](http://git-scm.com/docs/git-describe) is a -great way to tell us what version you're working with. - -If you're not running against the latest `master` branch version, -please compile and test against that to avoid re-reporting an issue that's -already been fixed. - -It's *incredibly* helpful to be able to reproduce the problem. Please -include a list of steps, a bit of code, and/or a zipped repository (if -possible). Note that some of the libgit2 developers are employees of -GitHub, so if your repository is private, find us on IRC and we'll figure -out a way to help you. - -## Pull Requests - -Our work flow is a [typical GitHub -flow](https://guides.github.com/introduction/flow/index.html), where -contributors fork the [libgit2 repository](https://github.com/libgit2/libgit2), -make their changes on branch, and submit a -[Pull Request](https://help.github.com/articles/using-pull-requests) -(a.k.a. "PR"). Pull requests should usually be targeted at the `master` -branch. - -Life will be a lot easier for you (and us) if you follow this pattern -(i.e. fork, named branch, submit PR). If you use your fork's `master` -branch directly, things can get messy. - -Please include a nice description of your changes when you submit your PR; -if we have to read the whole diff to figure out why you're contributing -in the first place, you're less likely to get feedback and have your change -merged in. - -If you are starting to work on a particular area, feel free to submit a PR -that highlights your work in progress (and note in the PR title that it's -not ready to merge). These early PRs are welcome and will help in getting -visibility for your fix, allow others to comment early on the changes and -also let others know that you are currently working on something. - -Before wrapping up a PR, you should be sure to: - -* Write tests to cover any functional changes -* Update documentation for any changed public APIs -* Add to the [`CHANGELOG.md`](CHANGELOG.md) file describing any major changes - -## Unit Tests - -We believe that our unit tests allow us to keep the quality of libgit2 -high: any new changes must not cause unit test failures, and new changes -should include unit tests that cover the bug fixes or new features. -For bug fixes, we prefer unit tests that illustrate the failure before -the change, but pass with your changes. - -In addition to new tests, please ensure that your changes do not cause -any other test failures. Running the entire test suite is helpful -before you submit a pull request. When you build libgit2, the test -suite will also be built. You can run all tests by simply running -the resultant `libgit2_clar` binary. If you want to run a specific -unit test, you can name it with the `-s` option. For example: - - libgit2_clar -sstatus::worktree::long_filenames - -Or you can run an entire class of tests. For example, to run all the -worktree status tests: - - libgit2_clar -sstatus::worktree - -## Porting Code From Other Open-Source Projects - -`libgit2` is licensed under the terms of the GPL v2 with a linking -exception. Any code brought in must be compatible with those terms. - -The most common case is porting code from core Git. Git is a pure GPL -project, which means that in order to port code to this project, we need the -explicit permission of the author. Check the -[`git.git-authors`](https://github.com/libgit2/libgit2/blob/development/git.git-authors) -file for authors who have already consented. - -Other licenses have other requirements; check the license of the library -you're porting code *from* to see what you need to do. As a general rule, -MIT and BSD (3-clause) licenses are typically no problem. Apache 2.0 -license typically doesn't work due to GPL incompatibility. - -If your pull request uses code from core Git, another project, or code -from a forum / Stack Overflow, then *please* flag this in your PR and make -sure you've given proper credit to the original author in the code -snippet. - -## Style Guide - -The public API of `libgit2` is [ANSI C](http://en.wikipedia.org/wiki/ANSI_C) -(a.k.a. C89) compatible. Internally, `libgit2` is written using a portable -subset of C99 - in order to compile with GCC, Clang, MSVC, etc., we keep -local variable declarations at the tops of blocks only and avoid `//` style -comments. Additionally, `libgit2` follows some extra conventions for -function and type naming, code formatting, and testing. - -We like to keep the source code consistent and easy to read. Maintaining -this takes some discipline, but it's been more than worth it. Take a look -at the [conventions -file](https://github.com/libgit2/libgit2/blob/development/CONVENTIONS.md). - -## Starter Projects - -See our [projects -list](https://github.com/libgit2/libgit2/blob/development/PROJECTS.md). diff --git a/vendor/libgit2/CONVENTIONS.md b/vendor/libgit2/CONVENTIONS.md deleted file mode 100644 index 5b8238a782..0000000000 --- a/vendor/libgit2/CONVENTIONS.md +++ /dev/null @@ -1,234 +0,0 @@ -# Libgit2 Conventions - -We like to keep the source consistent and readable. Herein are some -guidelines that should help with that. - -## Compatibility - -`libgit2` runs on many different platforms with many different compilers. - -The public API of `libgit2` is [ANSI C](http://en.wikipedia.org/wiki/ANSI_C) -(a.k.a. C89) compatible. - -Internally, `libgit2` is written using a portable subset of C99 - in order -to maximize compatibility (e.g. with MSVC) we avoid certain C99 -extensions. Specifically, we keep local variable declarations at the tops -of blocks only and we avoid `//` style comments. - -Also, to the greatest extent possible, we try to avoid lots of `#ifdef`s -inside the core code base. This is somewhat unavoidable, but since it can -really hamper maintainability, we keep it to a minimum. - -## Match Surrounding Code - -If there is one rule to take away from this document, it is *new code should -match the surrounding code in a way that makes it impossible to distinguish -the new from the old.* Consistency is more important to us than anyone's -personal opinion about where braces should be placed or spaces vs. tabs. - -If a section of code is being completely rewritten, it is okay to bring it -in line with the standards that are laid out here, but we will not accept -submissions that contain a large number of changes that are merely -reformatting. - -## Naming Things - -All external types and functions start with `git_` and all `#define` macros -start with `GIT_`. The `libgit2` API is mostly broken into related -functional modules each with a corresponding header. All functions in a -module should be named like `git_modulename_functioname()` -(e.g. `git_repository_open()`). - -Functions with a single output parameter should name that parameter `out`. -Multiple outputs should be named `foo_out`, `bar_out`, etc. - -Parameters of type `git_oid` should be named `id`, or `foo_id`. Calls that -return an OID should be named `git_foo_id`. - -Where a callback function is used, the function should also include a -user-supplied extra input that is a `void *` named "payload" that will be -passed through to the callback at each invocation. - -## Typedefs - -Wherever possible, use `typedef`. In some cases, if a structure is just a -collection of function pointers, the pointer types don't need to be -separately typedef'd, but loose function pointer types should be. - -## Exports - -All exported functions must be declared as: - -```c -GIT_EXTERN(result_type) git_modulename_functionname(arg_list); -``` - -## Internals - -Functions whose *modulename* is followed by two underscores, -for example `git_odb__read_packed`, are semi-private functions. -They are primarily intended for use within the library itself, -and may disappear or change their signature in a future release. - -## Parameters - -Out parameters come first. - -Whenever possible, pass argument pointers as `const`. Some structures (such -as `git_repository` and `git_index`) have mutable internal structure that -prevents this. - -Callbacks should always take a `void *` payload as their last parameter. -Callback pointers are grouped with their payloads, and typically come last -when passed as arguments: - -```c -int git_foo(git_repository *repo, git_foo_cb callback, void *payload); -``` - -## Memory Ownership - -Some APIs allocate memory which the caller is responsible for freeing; others -return a pointer into a buffer that's owned by some other object. Make this -explicit in the documentation. - -## Return codes - -Most public APIs should return an `int` error code. As is typical with most -C library functions, a zero value indicates success and a negative value -indicates failure. - -Some bindings will transform these returned error codes into exception -types, so returning a semantically appropriate error code is important. -Check -[`include/git2/errors.h`](https://github.com/libgit2/libgit2/blob/development/include/git2/errors.h) -for the return codes already defined. - -In your implementation, use `giterr_set()` to provide extended error -information to callers. - -If a `libgit2` function internally invokes another function that reports an -error, but the error is not propagated up, use `giterr_clear()` to prevent -callers from getting the wrong error message later on. - - -## Structs - -Most public types should be opaque, e.g.: - -```C -typedef struct git_odb git_odb; -``` - -...with allocation functions returning an "instance" created within -the library, and not within the application. This allows the type -to grow (or shrink) in size without rebuilding client code. - -To preserve ABI compatibility, include an `int version` field in all opaque -structures, and initialize to the latest version in the construction call. -Increment the "latest" version whenever the structure changes, and try to only -append to the end of the structure. - -## Option Structures - -If a function's parameter count is too high, it may be desirable to package -up the options in a structure. Make them transparent, include a version -field, and provide an initializer constant or constructor. Using these -structures should be this easy: - -```C -git_foo_options opts = GIT_FOO_OPTIONS_INIT; -opts.baz = BAZ_OPTION_ONE; -git_foo(&opts); -``` - -## Enumerations - -Typedef all enumerated types. If each option stands alone, use the enum -type for passing them as parameters; if they are flags to be OR'ed together, -pass them as `unsigned int` or `uint32_t` or some appropriate type. - -## Code Layout - -Try to keep lines less than 80 characters long. This is a loose -requirement, but going significantly over 80 columns is not nice. - -Use common sense to wrap most code lines; public function declarations -can use a couple of different styles: - -```c -/** All on one line is okay if it fits */ -GIT_EXTERN(int) git_foo_simple(git_oid *id); - -/** Otherwise one argument per line is a good next step */ -GIT_EXTERN(int) git_foo_id( - git_oid **out, - int a, - int b); -``` - -Indent with tabs; set your editor's tab width to 4 for best effect. - -Avoid trailing whitespace and only commit Unix-style newlines (i.e. no CRLF -in the repository - just set `core.autocrlf` to true if you are writing code -on a Windows machine). - -## Documentation - -All comments should conform to Doxygen "javadoc" style conventions for -formatting the public API documentation. Try to document every parameter, -and keep the comments up to date if you change the parameter list. - -## Public Header Template - -Use this template when creating a new public header. - -```C -#ifndef INCLUDE_git_${filename}_h__ -#define INCLUDE_git_${filename}_h__ - -#include "git/common.h" - -/** - * @file git/${filename}.h - * @brief Git some description - * @defgroup git_${filename} some description routines - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/* ... definitions ... */ - -/** @} */ -GIT_END_DECL -#endif -``` - -## Inlined functions - -All inlined functions must be declared as: - -```C -GIT_INLINE(result_type) git_modulename_functionname(arg_list); -``` - -`GIT_INLINE` (or `inline`) should not be used in public headers in order -to preserve ANSI C compatibility. - -## Tests - -`libgit2` uses the [clar](https://github.com/vmg/clar) testing framework. - -All PRs should have corresponding tests. - -* If the PR fixes an existing issue, the test should fail prior to applying - the PR and succeed after applying it. -* If the PR is for new functionality, then the tests should exercise that - new functionality to a certain extent. We don't require 100% coverage - right now (although we are getting stricter over time). - -When adding new tests, we prefer if you attempt to reuse existing test data -(in `tests-clar/resources/`) if possible. If you are going to add new test -repositories, please try to strip them of unnecessary files (e.g. sample -hooks, etc). diff --git a/vendor/libgit2/COPYING b/vendor/libgit2/COPYING deleted file mode 100644 index 6f6115e3bf..0000000000 --- a/vendor/libgit2/COPYING +++ /dev/null @@ -1,914 +0,0 @@ - libgit2 is Copyright (C) the libgit2 contributors, - unless otherwise stated. See the AUTHORS file for details. - - Note that the only valid version of the GPL as far as this project - is concerned is _this_ particular version of the license (ie v2, not - v2.2 or v3.x or whatever), unless explicitly otherwise stated. - ----------------------------------------------------------------------- - - LINKING EXCEPTION - - In addition to the permissions in the GNU General Public License, - the authors give you unlimited permission to link the compiled - version of this library into combinations with other programs, - and to distribute those combinations without any restriction - coming from the use of this file. (The General Public License - restrictions do apply in other respects; for example, they cover - modification of the file, and distribution when not linked into - a combined executable.) - ----------------------------------------------------------------------- - - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General -Public License instead of this License. - ----------------------------------------------------------------------- - -The bundled ZLib code is licensed under the ZLib license: - -Copyright (C) 1995-2010 Jean-loup Gailly and Mark Adler - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. - - Jean-loup Gailly Mark Adler - jloup@gzip.org madler@alumni.caltech.edu - ----------------------------------------------------------------------- - -The Clar framework is licensed under the ISC license: - -Copyright (c) 2011-2015 Vicent Marti - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - ----------------------------------------------------------------------- - -The regex library (deps/regex/) is licensed under the GNU LGPL - - GNU LESSER GENERAL PUBLIC LICENSE - Version 2.1, February 1999 - - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. - - This license, the Lesser General Public License, applies to some -specially designated software packages--typically libraries--of the -Free Software Foundation and other authors who decide to use it. You -can use it too, but we suggest you first think carefully about whether -this license or the ordinary General Public License is the better -strategy to use in any particular case, based on the explanations below. - - When we speak of free software, we are referring to freedom of use, -not price. Our General Public Licenses are designed to make sure that -you have the freedom to distribute copies of free software (and charge -for this service if you wish); that you receive source code or can get -it if you want it; that you can change the software and use pieces of -it in new free programs; and that you are informed that you can do -these things. - - To protect your rights, we need to make restrictions that forbid -distributors to deny you these rights or to ask you to surrender these -rights. These restrictions translate to certain responsibilities for -you if you distribute copies of the library or if you modify it. - - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link other code with the library, you must provide -complete object files to the recipients, so that they can relink them -with the library after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. - - We protect your rights with a two-step method: (1) we copyright the -library, and (2) we offer you this license, which gives you legal -permission to copy, distribute and/or modify the library. - - To protect each distributor, we want to make it very clear that -there is no warranty for the free library. Also, if the library is -modified by someone else and passed on, the recipients should know -that what they have is not the original version, so that the original -author's reputation will not be affected by problems that might be -introduced by others. - - Finally, software patents pose a constant threat to the existence of -any free program. We wish to make sure that a company cannot -effectively restrict the users of a free program by obtaining a -restrictive license from a patent holder. Therefore, we insist that -any patent license obtained for a version of the library must be -consistent with the full freedom of use specified in this license. - - Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License. This license, the GNU Lesser -General Public License, applies to certain designated libraries, and -is quite different from the ordinary General Public License. We use -this license for certain libraries in order to permit linking those -libraries into non-free programs. - - When a program is linked with a library, whether statically or using -a shared library, the combination of the two is legally speaking a -combined work, a derivative of the original library. The ordinary -General Public License therefore permits such linking only if the -entire combination fits its criteria of freedom. The Lesser General -Public License permits more lax criteria for linking other code with -the library. - - We call this license the "Lesser" General Public License because it -does Less to protect the user's freedom than the ordinary General -Public License. It also provides other free software developers Less -of an advantage over competing non-free programs. These disadvantages -are the reason we use the ordinary General Public License for many -libraries. However, the Lesser license provides advantages in certain -special circumstances. - - For example, on rare occasions, there may be a special need to -encourage the widest possible use of a certain library, so that it becomes -a de-facto standard. To achieve this, non-free programs must be -allowed to use the library. A more frequent case is that a free -library does the same job as widely used non-free libraries. In this -case, there is little to gain by limiting the free library to free -software only, so we use the Lesser General Public License. - - In other cases, permission to use a particular library in non-free -programs enables a greater number of people to use a large body of -free software. For example, permission to use the GNU C Library in -non-free programs enables many more people to use the whole GNU -operating system, as well as its variant, the GNU/Linux operating -system. - - Although the Lesser General Public License is Less protective of the -users' freedom, it does ensure that the user of a program that is -linked with the Library has the freedom and the wherewithal to run -that program using a modified version of the Library. - - The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, whereas the latter must -be combined with the library in order to run. - - GNU LESSER GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). -Each licensee is addressed as "you". - - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. - - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) - - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control compilation -and installation of the library. - - Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. - - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. - - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a -fee. - - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) The modified work must itself be a software library. - - b) You must cause the files modified to carry prominent notices - stating that you changed the files and the date of any change. - - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. - - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. - - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Library. - -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. - - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. - - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. - - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. - - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not -compelled to copy the source along with the object code. - - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. - - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. - - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. - - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) - - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. - - 6. As an exception to the Sections above, you may also combine or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. - - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: - - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) - - b) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (1) uses at run time a - copy of the library already present on the user's computer system, - rather than copying library functions into the executable, and (2) - will operate properly with a modified version of the library, if - the user installs one, as long as the modified version is - interface-compatible with the version that the work was made with. - - c) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. - - d) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. - - e) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. - - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the materials to be distributed need not include anything that is -normally distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. - - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. - - 7. You may place library facilities that are a work based on the -Library side-by-side in a single library together with other library -facilities not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: - - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. - - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. - - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. - - 9. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Library or works based on it. - - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties with -this License. - - 11. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. - -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply, -and the section as a whole is intended to apply in other circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License may add -an explicit geographical distribution limitation excluding those countries, -so that distribution is permitted only in or among countries not thus -excluded. In such case, this License incorporates the limitation as if -written in the body of this License. - - 13. The Free Software Foundation may publish revised and/or new -versions of the Lesser General Public License from time to time. -Such new versions will be similar in spirit to the present version, -but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Library -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. - - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. - - NO WARRANTY - - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY -KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU -FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Libraries - - If you develop a new library, and you want it to be of the greatest -possible use to the public, we recommend making it free software that -everyone can redistribute and change. You can do so by permitting -redistribution under these terms (or, alternatively, under the terms of the -ordinary General Public License). - - To apply these terms, attach the following notices to the library. It is -safest to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least the -"copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -Also add information on how to contact you by electronic and paper mail. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the library, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the - library `Frob' (a library for tweaking knobs) written by James Random Hacker. - - , 1 April 1990 - Ty Coon, President of Vice - -That's all there is to it! - ----------------------------------------------------------------------- diff --git a/vendor/libgit2/Makefile.embed b/vendor/libgit2/Makefile.embed deleted file mode 100644 index eb8a78ebf3..0000000000 --- a/vendor/libgit2/Makefile.embed +++ /dev/null @@ -1,60 +0,0 @@ -PLATFORM=$(shell uname -s) - -ifneq (,$(CROSS_COMPILE)) - PREFIX=$(CROSS_COMPILE)- -else - PREFIX= -endif - -MINGW=0 -ifneq (,$(findstring MINGW32,$(PLATFORM))) - MINGW=1 -endif -ifneq (,$(findstring mingw,$(CROSS_COMPILE))) - MINGW=1 -endif - -rm=rm -f -AR=$(PREFIX)ar cq -RANLIB=$(PREFIX)ranlib - -LIBNAME=libgit2.a - -ifeq ($(MINGW),1) - CC=gcc -else - CC=cc -endif - -CC:=$(PREFIX)$(CC) - -INCLUDES= -I. -Isrc -Iinclude -Ideps/http-parser -Ideps/zlib - -DEFINES= $(INCLUDES) -DNO_VIZ -DSTDC -DNO_GZIP -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE $(EXTRA_DEFINES) -CFLAGS= -g $(DEFINES) -Wall -Wextra -Wno-missing-field-initializers -O2 $(EXTRA_CFLAGS) - -SRCS = $(wildcard src/*.c) $(wildcard src/transports/*.c) $(wildcard src/xdiff/*.c) $(wildcard deps/http-parser/*.c) $(wildcard deps/zlib/*.c) src/hash/hash_generic.c - -ifeq ($(MINGW),1) - SRCS += $(wildcard src/win32/*.c) $(wildcard src/compat/*.c) deps/regex/regex.c - INCLUDES += -Ideps/regex - DEFINES += -DWIN32 -D_WIN32_WINNT=0x0501 -D__USE_MINGW_ANSI_STDIO=1 -else - SRCS += $(wildcard src/unix/*.c) - CFLAGS += -fPIC -endif - -OBJS = $(patsubst %.c,%.o,$(SRCS)) - -%.c.o: - $(CC) $(CFLAGS) -c $*.c - -all: $(LIBNAME) - -$(LIBNAME): $(OBJS) - $(rm) $@ - $(AR) $@ $(OBJS) - $(RANLIB) $@ - -clean: - $(rm) $(OBJS) $(LIBNAME) diff --git a/vendor/libgit2/PROJECTS.md b/vendor/libgit2/PROJECTS.md deleted file mode 100644 index 4f200b7f9b..0000000000 --- a/vendor/libgit2/PROJECTS.md +++ /dev/null @@ -1,101 +0,0 @@ -Projects For LibGit2 -==================== - -So, you want to start helping out with `libgit2`? That's fantastic! We -welcome contributions and we promise we'll try to be nice. - -This is a list of libgit2 related projects that new contributors can take -on. It includes a number of good starter projects and well as some larger -ideas that no one is actively working on. - -## Before You Start - -Please start by reading the [README.md](README.md), -[CONTRIBUTING.md](CONTRIBUTING.md), and [CONVENTIONS.md](CONVENTIONS.md) -files before diving into one of these projects. Those explain our work -flow and coding conventions to help ensure that your work will be easily -integrated into libgit2. - -Next, work through the build instructions and make sure you can clone the -repository, compile it, and run the tests successfully. That will make -sure that your development environment is set up correctly and you are -ready to start on libgit2 development. - -## Starter Projects - -These are good small projects to get started with libgit2. - -* Look at the `examples/` programs, find an existing one that mirrors a - core Git command and add a missing command-line option. There are many - gaps right now and this helps demonstrate how to use the library. Here - are some specific ideas (though there are many more): - * Fix the `examples/diff.c` implementation of the `-B` - (a.k.a. `--break-rewrites`) command line option to actually look for - the optional `[][/]` configuration values. There is an - existing comment that reads `/* TODO: parse thresholds */`. The - trick to this one will be doing it in a manner that is clean and - simple, but still handles the various cases correctly (e.g. `-B/70%` - is apparently a legal setting). - * Implement the `--log-size` option for `examples/log.c`. I think all - the data is available, you would just need to add the code into the - `print_commit()` routine (along with a way of passing the option - into that function). - * As an extension to the matching idea for `examples/log.c`, add the - `-i` option to use `strcasestr()` for matches. - * For `examples/log.c`, implement the `--first-parent` option now that - libgit2 supports it in the revwalk API. -* Pick a Git command that is not already emulated in `examples/` and write - a new example that mirrors the behavior. Examples don't have to be - perfect emulations, but should demonstrate how to use the libgit2 APIs - to get results that are similar to Git commands. This lets you (and us) - easily exercise a particular facet of the API and measure compatability - and feature parity with core git. -* Submit a PR to clarify documentation! While we do try to document all of - the APIs, your fresh eyes on the documentation will find areas that are - confusing much more easily. - -If none of these appeal to you, take a look at our issues list to see if -there are any unresolved issues you'd like to jump in on. - -## Larger Projects - -These are ideas for larger projects mostly taken from our backlog of -[Issues](https://github.com/libgit2/libgit2/issues). Please don't dive -into one of these as a first project for libgit2 - we'd rather get to -know you first by successfully shipping your work on one of the smaller -projects above. - -Some of these projects are broken down into subprojects and/or have -some incremental steps listed towards the larger goal. Those steps -might make good smaller projects by themselves. - -* Port part of the Git test suite to run against the command line emulation - in examples/ - * Pick a Git command that is emulated in our examples/ area - * Extract the Git tests that exercise that command - * Convert the tests to call our emulation - * These tests could go in examples/tests/... -* Fix symlink support for files in the .git directory (i.e. don't overwrite - the symlinks when writing the file contents back out) -* Add hooks API to enumerate and manage hooks (not run them at this point) - * Enumeration of available hooks - * Lookup API to see which hooks have a script and get the script - * Read/write API to load a hook script and write a hook script - * Eventually, callback API to invoke a hook callback when libgit2 - executes the action in question -* Isolate logic of ignore evaluation into a standalone API -* Upgrade internal libxdiff code to latest from core Git -* Improve index internals with hashtable lookup for files instead of - using binary search every time -* Tree builder improvements: - * Extend to allow building a tree hierarchy -* Apply-patch API -* Add a patch editing API to enable "git add -p" type operations -* Textconv API to filter binary data before generating diffs (something - like the current Filter API, probably). -* Performance profiling and improvement -* Support "git replace" ref replacements -* Include conflicts in diff results and in status - * GIT_DELTA_CONFLICT for items in conflict (with multiple files) - * Appropriate flags for status -* Support sparse checkout (i.e. "core.sparsecheckout" and ".git/info/sparse-checkout") diff --git a/vendor/libgit2/README.md b/vendor/libgit2/README.md deleted file mode 100644 index 3191aeee2c..0000000000 --- a/vendor/libgit2/README.md +++ /dev/null @@ -1,244 +0,0 @@ -libgit2 - the Git linkable library -================================== - -[![Travis Build Status](https://secure.travis-ci.org/libgit2/libgit2.svg?branch=master)](http://travis-ci.org/libgit2/libgit2) -[![AppVeyor Build Status](https://ci.appveyor.com/api/projects/status/xvof5b4t5480a2q3/branch/master?svg=true)](https://ci.appveyor.com/project/libgit2/libgit2/branch/master) -[![Coverity Scan Build Status](https://scan.coverity.com/projects/639/badge.svg)](https://scan.coverity.com/projects/639) - -`libgit2` is a portable, pure C implementation of the Git core methods -provided as a re-entrant linkable library with a solid API, allowing you to -write native speed custom Git applications in any language with bindings. - -`libgit2` is licensed under a **very permissive license** (GPLv2 with a special -Linking Exception). This basically means that you can link it (unmodified) -with any kind of software without having to release its source code. -Additionally, the example code has been released to the public domain (see the -[separate license](examples/COPYING) for more information). - -* Website: [libgit2.github.com](http://libgit2.github.com) -* StackOverflow Tag: [libgit2](http://stackoverflow.com/questions/tagged/libgit2) -* Issues: [GitHub Issues](https://github.com/libgit2/libgit2/issues) (Right here!) -* API documentation: -* IRC: [#libgit2](irc://irc.freenode.net/libgit2) on irc.freenode.net. -* Mailing list: The libgit2 mailing list was - traditionally hosted in Librelist but has been deprecated. We encourage you to - [use StackOverflow](http://stackoverflow.com/questions/tagged/libgit2) instead for any questions regarding - the library, or [open an issue](https://github.com/libgit2/libgit2/issues) - on GitHub for bug reports. The mailing list archives are still available at - . - - -What It Can Do -============== - -`libgit2` is already very usable and is being used in production for many -applications including the GitHub.com site, in Plastic SCM and also powering -Microsoft's Visual Studio tools for Git. The library provides: - -* SHA conversions, formatting and shortening -* abstracted ODB backend system -* commit, tag, tree and blob parsing, editing, and write-back -* tree traversal -* revision walking -* index file (staging area) manipulation -* reference management (including packed references) -* config file management -* high level repository management -* thread safety and reentrancy -* descriptive and detailed error messages -* ...and more (over 175 different API calls) - -Optional dependencies -===================== - -While the library provides git functionality without the need for -dependencies, it can make use of a few libraries to add to it: - -- pthreads (non-Windows) to enable threadsafe access as well as multi-threaded pack generation -- OpenSSL (non-Windows) to talk over HTTPS and provide the SHA-1 functions -- LibSSH2 to enable the SSH transport -- iconv (OSX) to handle the HFS+ path encoding peculiarities - -Initialization -=============== - -The library needs to keep track of some global state. Call - - git_libgit2_init(); - -before calling any other libgit2 functions. You can call this function many times. A matching number of calls to - - git_libgit2_shutdown(); - -will free the resources. Note that if you have worker threads, you should -call `git_libgit2_shutdown` *after* those threads have exited. If you -require assistance coordinating this, simply have the worker threads call -`git_libgit2_init` at startup and `git_libgit2_shutdown` at shutdown. - -Threading -========= - -See [THREADING](THREADING.md) for information - -Building libgit2 - Using CMake -============================== - -`libgit2` builds cleanly on most platforms without any external dependencies. -Under Unix-like systems, like Linux, \*BSD and Mac OS X, libgit2 expects `pthreads` to be available; -they should be installed by default on all systems. Under Windows, libgit2 uses the native Windows API -for threading. - -The `libgit2` library is built using [CMake]() (version 2.8 or newer) on all platforms. - -On most systems you can build the library using the following commands - - $ mkdir build && cd build - $ cmake .. - $ cmake --build . - -Alternatively you can point the CMake GUI tool to the CMakeLists.txt file and generate platform specific build project or IDE workspace. - -To install the library you can specify the install prefix by setting: - - $ cmake .. -DCMAKE_INSTALL_PREFIX=/install/prefix - $ cmake --build . --target install - -For more advanced use or questions about CMake please read . - -The following CMake variables are declared: - -- `BIN_INSTALL_DIR`: Where to install binaries to. -- `LIB_INSTALL_DIR`: Where to install libraries to. -- `INCLUDE_INSTALL_DIR`: Where to install headers to. -- `BUILD_SHARED_LIBS`: Build libgit2 as a Shared Library (defaults to ON) -- `BUILD_CLAR`: Build [Clar](https://github.com/vmg/clar)-based test suite (defaults to ON) -- `THREADSAFE`: Build libgit2 with threading support (defaults to ON) -- `STDCALL`: Build libgit2 as `stdcall`. Turn off for `cdecl` (Windows; defaults to ON) - -Compiler and linker options ---------------------------- - -CMake lets you specify a few variables to control the behavior of the -compiler and linker. These flags are rarely used but can be useful for -64-bit to 32-bit cross-compilation. - -- `CMAKE_C_FLAGS`: Set your own compiler flags -- `CMAKE_FIND_ROOT_PATH`: Override the search path for libraries -- `ZLIB_LIBRARY`, `OPENSSL_SSL_LIBRARY` AND `OPENSSL_CRYPTO_LIBRARY`: -Tell CMake where to find those specific libraries - -MacOS X -------- - -If you want to build a universal binary for Mac OS X, CMake sets it -all up for you if you use `-DCMAKE_OSX_ARCHITECTURES="i386;x86_64"` -when configuring. - -Windows -------- - -You need to run the CMake commands from the Visual Studio command -prompt, not the regular or Windows SDK one. Select the right generator -for your version with the `-G "Visual Studio X" option. - -See [the website](https://libgit2.github.com/docs/guides/build-and-link) -for more detailed instructions. - -Android -------- - -Extract toolchain from NDK using, `make-standalone-toolchain.sh` script. -Optionally, crosscompile and install OpenSSL inside of it. Then create CMake -toolchain file that configures paths to your crosscompiler (substitute `{PATH}` -with full path to the toolchain): - - SET(CMAKE_SYSTEM_NAME Linux) - SET(CMAKE_SYSTEM_VERSION Android) - - SET(CMAKE_C_COMPILER {PATH}/bin/arm-linux-androideabi-gcc) - SET(CMAKE_CXX_COMPILER {PATH}/bin/arm-linux-androideabi-g++) - SET(CMAKE_FIND_ROOT_PATH {PATH}/sysroot/) - - SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) - SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) - SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) - -Add `-DCMAKE_TOOLCHAIN_FILE={pathToToolchainFile}` to cmake command -when configuring. - -Language Bindings -================================== - -Here are the bindings to libgit2 that are currently available: - -* C++ - * libqgit2, Qt bindings -* Chicken Scheme - * chicken-git -* D - * dlibgit -* Delphi - * GitForDelphi -* Erlang - * Geef -* Go - * git2go -* GObject - * libgit2-glib -* Haskell - * hgit2 -* Java - * Jagged -* Julia - * LibGit2.jl -* Lua - * luagit2 -* .NET - * libgit2sharp -* Node.js - * node-gitteh - * nodegit -* Objective-C - * objective-git -* OCaml - * ocaml-libgit2 -* Parrot Virtual Machine - * parrot-libgit2 -* Perl - * Git-Raw -* PHP - * php-git -* PowerShell - * GitPowerShell -* Python - * pygit2 -* R - * git2r -* Ruby - * Rugged -* Rust - * git2-rs -* Swift - * Gift -* Vala - * libgit2.vapi - -If you start another language binding to libgit2, please let us know so -we can add it to the list. - -How Can I Contribute? -================================== - -Check the [contribution guidelines](CONTRIBUTING.md) to understand our -workflow, the libgit2 [coding conventions](CONVENTIONS.md), and out list of -[good starting projects](PROJECTS.md). - -License -================================== - -`libgit2` is under GPL2 **with linking exception**. This means you can link to -and use the library from any program, proprietary or open source; paid or -gratis. However, you cannot modify libgit2 and distribute it without -supplying the source. - -See the [COPYING file](COPYING) for the full license text. diff --git a/vendor/libgit2/THREADING.md b/vendor/libgit2/THREADING.md deleted file mode 100644 index 3717d6c885..0000000000 --- a/vendor/libgit2/THREADING.md +++ /dev/null @@ -1,107 +0,0 @@ -Threads in libgit2 -================== - -You may safely use any libgit2 object from any thread, though there -may be issues depending on the cryptographic libraries libgit2 or its -dependencies link to (more on this later). For libgit2 itself, -provided you take the following into consideration you won't run into -issues: - -Sharing objects ---------------- - -Use an object from a single thread at a time. Most data structures do -not guard against concurrent access themselves. This is because they -are rarely used in isolation and it makes more sense to synchronize -access via a larger lock or similar mechanism. - -There are some objects which are read-only/immutable and are thus safe -to share across threads, such as references and configuration -snapshots. - -Error messages --------------- - -The error message is thread-local. The `giterr_last()` call must -happen on the same thread as the error in order to get the -message. Often this will be the case regardless, but if you use -something like the [GCD](http://en.wikipedia.org/wiki/Grand_Central_Dispatch) -on Mac OS X (where code is executed on an arbitrary thread), the code -must make sure to retrieve the error code on the thread where the error -happened. - -Threads and cryptographic libraries -======================================= - -On Windows ----------- - -When built as a native Windows DLL, libgit2 uses WinCNG and WinHTTP, -both of which are thread-safe. You do not need to do anything special. - -When using libssh2 which itself uses WinCNG, there are no special -steps necessary. If you are using a MinGW or similar environment where -libssh2 uses OpenSSL or libgcrypt, then the general case affects -you. - -On Mac OS X ------------ - -By default we use libcurl to perform the encryption. The -system-provided libcurl uses SecureTransport, so no special steps are -necessary. If you link against another libcurl (e.g. from homebrew) -refer to the general case. - -If the option to use libcurl was deactivated, the library makes use of -CommonCrypto and SecureTransport for cryptographic support. These are -thread-safe and you do not need to do anything special. - -Note that libssh2 may still use OpenSSL itself. In that case, the -general case still affects you if you use ssh. - -General Case ------------- - -By default we use libcurl, which has its own ![recommendations for -thread safety](http://curl.haxx.se/libcurl/c/libcurl-tutorial.html#Multi-threading). - -If libcurl was not found or was disabled, libgit2 uses OpenSSL to be -able to use HTTPS as a transport. This library is made to be -thread-implementation agnostic, and the users of the library must set -which locking function it should use. This means that libgit2 cannot -know what to set as the user of libgit2 may use OpenSSL independently -and the locking settings must survive libgit2 shutting down. - -libgit2 does provide a last-resort convenience function -`git_openssl_set_locking()` (available in `sys/openssl.h`) to use the -platform-native mutex mechanisms to perform the locking, which you may -rely on if you do not want to use OpenSSL outside of libgit2, or you -know that libgit2 will outlive the rest of the operations. It is not -safe to use OpenSSL multi-threaded after libgit2's shutdown function -has been called. - -If your programming language offers a package/bindings for OpenSSL, -you should very strongly prefer to use that in order to set up -locking, as they provide a level of coördination which is impossible -when using this function. - -See the -[OpenSSL documentation](https://www.openssl.org/docs/crypto/threads.html) -on threading for more details. - -Be also aware that libgit2 does not always link against OpenSSL -if there are alternatives provided by the system. - -libssh2 may be linked against OpenSSL or libgcrypt. If it uses -OpenSSL, you only need to set up threading for OpenSSL once and the -above paragraphs are enough. If it uses libgcrypt, then you need to -set up its locking before using it multi-threaded. libgit2 has no -direct connection to libgcrypt and thus has not convenience functions for -it (but libgcrypt has macros). Read libgcrypt's -[threading documentation for more information](http://www.gnupg.org/documentation/manuals/gcrypt/Multi_002dThreading.html) - -It is your responsibility as an application author or packager to know -what your dependencies are linked against and to take the appropriate -steps to ensure the cryptographic libraries are thread-safe. We agree -that this situation is far from ideal but at this time it is something -the application authors need to deal with. diff --git a/vendor/libgit2/api.docurium b/vendor/libgit2/api.docurium deleted file mode 100644 index 9e17817dbe..0000000000 --- a/vendor/libgit2/api.docurium +++ /dev/null @@ -1,13 +0,0 @@ -{ - "name": "libgit2", - "github": "libgit2/libgit2", - "input": "include/git2", - "prefix": "git_", - "output": "docs", - "branch": "gh-pages", - "examples": "examples", - "legacy": { - "input": {"src/git": ["v0.1.0"], - "src/git2": ["v0.2.0", "v0.3.0"]} - } -} diff --git a/vendor/libgit2/appveyor.yml b/vendor/libgit2/appveyor.yml deleted file mode 100644 index 166fa56b1e..0000000000 --- a/vendor/libgit2/appveyor.yml +++ /dev/null @@ -1,39 +0,0 @@ -version: '{build}' -branches: - only: - - master - - /^maint.*/ -environment: - GITTEST_INVASIVE_FS_STRUCTURE: 1 - GITTEST_INVASIVE_FS_SIZE: 1 - - matrix: - - GENERATOR: "Visual Studio 11" - ARCH: 32 - - GENERATOR: "Visual Studio 11 Win64" - ARCH: 64 - - GENERATOR: "MSYS Makefiles" - ARCH: 32 - - GENERATOR: "MSYS Makefiles" - ARCH: i686 # this is for 32-bit MinGW-w64 - - GENERATOR: "MSYS Makefiles" - ARCH: 64 -matrix: - allow_failures: - - GENERATOR: "MSYS Makefiles" - ARCH: 32 -cache: -- i686-4.9.2-release-win32-sjlj-rt_v3-rev1.7z -- x86_64-4.9.2-release-win32-seh-rt_v3-rev1.7z -build_script: -- ps: | - mkdir build - cd build - if ($env:GENERATOR -ne "MSYS Makefiles") { - cmake -D ENABLE_TRACE=ON -D BUILD_CLAR=ON -D MSVC_CRTDBG=ON .. -G"$env:GENERATOR" - cmake --build . --config Debug - } -- cmd: | - if "%GENERATOR%"=="MSYS Makefiles" (C:\MinGW\msys\1.0\bin\sh --login /c/projects/libgit2/script/appveyor-mingw.sh) -test_script: -- ps: ctest -V . diff --git a/vendor/libgit2/cmake/Modules/AddCFlagIfSupported.cmake b/vendor/libgit2/cmake/Modules/AddCFlagIfSupported.cmake deleted file mode 100644 index 67fc895103..0000000000 --- a/vendor/libgit2/cmake/Modules/AddCFlagIfSupported.cmake +++ /dev/null @@ -1,16 +0,0 @@ -# - Append compiler flag to CMAKE_C_FLAGS if compiler supports it -# ADD_C_FLAG_IF_SUPPORTED() -# - the compiler flag to test -# This internally calls the CHECK_C_COMPILER_FLAG macro. - -INCLUDE(CheckCCompilerFlag) - -MACRO(ADD_C_FLAG_IF_SUPPORTED _FLAG) - STRING(TOUPPER ${_FLAG} UPCASE) - STRING(REGEX REPLACE "^-" "" UPCASE_PRETTY ${UPCASE}) - CHECK_C_COMPILER_FLAG(${_FLAG} IS_${UPCASE_PRETTY}_SUPPORTED) - - IF(IS_${UPCASE_PRETTY}_SUPPORTED) - SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${_FLAG}") - ENDIF() -ENDMACRO() diff --git a/vendor/libgit2/cmake/Modules/FindCoreFoundation.cmake b/vendor/libgit2/cmake/Modules/FindCoreFoundation.cmake deleted file mode 100644 index ebd619a533..0000000000 --- a/vendor/libgit2/cmake/Modules/FindCoreFoundation.cmake +++ /dev/null @@ -1,9 +0,0 @@ -IF (COREFOUNDATION_INCLUDE_DIR AND COREFOUNDATION_DIRS) - SET(COREFOUNDATION_FOUND TRUE) -ELSE () - FIND_PATH(COREFOUNDATION_INCLUDE_DIR NAMES CoreFoundation.h) - FIND_LIBRARY(COREFOUNDATION_DIRS NAMES CoreFoundation) - IF (COREFOUNDATION_INCLUDE_DIR AND COREFOUNDATION_DIRS) - SET(COREFOUNDATION_FOUND TRUE) - ENDIF () -ENDIF () diff --git a/vendor/libgit2/cmake/Modules/FindGSSAPI.cmake b/vendor/libgit2/cmake/Modules/FindGSSAPI.cmake deleted file mode 100644 index 8520d35df0..0000000000 --- a/vendor/libgit2/cmake/Modules/FindGSSAPI.cmake +++ /dev/null @@ -1,324 +0,0 @@ -# - Try to find GSSAPI -# Once done this will define -# -# KRB5_CONFIG - Path to krb5-config -# GSSAPI_ROOT_DIR - Set this variable to the root installation of GSSAPI -# -# Read-Only variables: -# GSSAPI_FLAVOR_MIT - set to TURE if MIT Kerberos has been found -# GSSAPI_FLAVOR_HEIMDAL - set to TRUE if Heimdal Keberos has been found -# GSSAPI_FOUND - system has GSSAPI -# GSSAPI_INCLUDE_DIR - the GSSAPI include directory -# GSSAPI_LIBRARIES - Link these to use GSSAPI -# GSSAPI_DEFINITIONS - Compiler switches required for using GSSAPI -# -#============================================================================= -# Copyright (c) 2013 Andreas Schneider -# -# Distributed under the OSI-approved BSD License (the "License"); -# see accompanying file Copyright.txt for details. -# -# This software is distributed WITHOUT ANY WARRANTY; without even the -# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -# See the License for more information. -#============================================================================= -# - -find_path(GSSAPI_ROOT_DIR - NAMES - include/gssapi.h - include/gssapi/gssapi.h - HINTS - ${_GSSAPI_ROOT_HINTS} - PATHS - ${_GSSAPI_ROOT_PATHS} -) -mark_as_advanced(GSSAPI_ROOT_DIR) - -if (UNIX) - find_program(KRB5_CONFIG - NAMES - krb5-config - PATHS - ${GSSAPI_ROOT_DIR}/bin - /opt/local/bin) - mark_as_advanced(KRB5_CONFIG) - - if (KRB5_CONFIG) - # Check if we have MIT KRB5 - execute_process( - COMMAND - ${KRB5_CONFIG} --vendor - RESULT_VARIABLE - _GSSAPI_VENDOR_RESULT - OUTPUT_VARIABLE - _GSSAPI_VENDOR_STRING) - - if (_GSSAPI_VENDOR_STRING MATCHES ".*Massachusetts.*") - set(GSSAPI_FLAVOR_MIT TRUE) - else() - execute_process( - COMMAND - ${KRB5_CONFIG} --libs gssapi - RESULT_VARIABLE - _GSSAPI_LIBS_RESULT - OUTPUT_VARIABLE - _GSSAPI_LIBS_STRING) - - if (_GSSAPI_LIBS_STRING MATCHES ".*roken.*") - set(GSSAPI_FLAVOR_HEIMDAL TRUE) - endif() - endif() - - # Get the include dir - execute_process( - COMMAND - ${KRB5_CONFIG} --cflags gssapi - RESULT_VARIABLE - _GSSAPI_INCLUDE_RESULT - OUTPUT_VARIABLE - _GSSAPI_INCLUDE_STRING) - string(REGEX REPLACE "(\r?\n)+$" "" _GSSAPI_INCLUDE_STRING "${_GSSAPI_INCLUDE_STRING}") - string(REGEX REPLACE " *-I" "" _GSSAPI_INCLUDEDIR "${_GSSAPI_INCLUDE_STRING}") - endif() - - if (NOT GSSAPI_FLAVOR_MIT AND NOT GSSAPI_FLAVOR_HEIMDAL) - # Check for HEIMDAL - find_package(PkgConfig) - if (PKG_CONFIG_FOUND) - pkg_check_modules(_GSSAPI heimdal-gssapi) - endif (PKG_CONFIG_FOUND) - - if (_GSSAPI_FOUND) - set(GSSAPI_FLAVOR_HEIMDAL TRUE) - else() - find_path(_GSSAPI_ROKEN - NAMES - roken.h - PATHS - ${GSSAPI_ROOT_DIR}/include - ${_GSSAPI_INCLUDEDIR}) - if (_GSSAPI_ROKEN) - set(GSSAPI_FLAVOR_HEIMDAL TRUE) - endif() - endif () - endif() -endif (UNIX) - -find_path(GSSAPI_INCLUDE_DIR - NAMES - gssapi.h - gssapi/gssapi.h - PATHS - ${GSSAPI_ROOT_DIR}/include - ${_GSSAPI_INCLUDEDIR} -) - -if (GSSAPI_FLAVOR_MIT) - find_library(GSSAPI_LIBRARY - NAMES - gssapi_krb5 - PATHS - ${GSSAPI_ROOT_DIR}/lib - ${_GSSAPI_LIBDIR} - ) - - find_library(KRB5_LIBRARY - NAMES - krb5 - PATHS - ${GSSAPI_ROOT_DIR}/lib - ${_GSSAPI_LIBDIR} - ) - - find_library(K5CRYPTO_LIBRARY - NAMES - k5crypto - PATHS - ${GSSAPI_ROOT_DIR}/lib - ${_GSSAPI_LIBDIR} - ) - - find_library(COM_ERR_LIBRARY - NAMES - com_err - PATHS - ${GSSAPI_ROOT_DIR}/lib - ${_GSSAPI_LIBDIR} - ) - - if (GSSAPI_LIBRARY) - set(GSSAPI_LIBRARIES - ${GSSAPI_LIBRARIES} - ${GSSAPI_LIBRARY} - ) - endif (GSSAPI_LIBRARY) - - if (KRB5_LIBRARY) - set(GSSAPI_LIBRARIES - ${GSSAPI_LIBRARIES} - ${KRB5_LIBRARY} - ) - endif (KRB5_LIBRARY) - - if (K5CRYPTO_LIBRARY) - set(GSSAPI_LIBRARIES - ${GSSAPI_LIBRARIES} - ${K5CRYPTO_LIBRARY} - ) - endif (K5CRYPTO_LIBRARY) - - if (COM_ERR_LIBRARY) - set(GSSAPI_LIBRARIES - ${GSSAPI_LIBRARIES} - ${COM_ERR_LIBRARY} - ) - endif (COM_ERR_LIBRARY) -endif (GSSAPI_FLAVOR_MIT) - -if (GSSAPI_FLAVOR_HEIMDAL) - find_library(GSSAPI_LIBRARY - NAMES - gssapi - PATHS - ${GSSAPI_ROOT_DIR}/lib - ${_GSSAPI_LIBDIR} - ) - - find_library(KRB5_LIBRARY - NAMES - krb5 - PATHS - ${GSSAPI_ROOT_DIR}/lib - ${_GSSAPI_LIBDIR} - ) - - find_library(HCRYPTO_LIBRARY - NAMES - hcrypto - PATHS - ${GSSAPI_ROOT_DIR}/lib - ${_GSSAPI_LIBDIR} - ) - - find_library(COM_ERR_LIBRARY - NAMES - com_err - PATHS - ${GSSAPI_ROOT_DIR}/lib - ${_GSSAPI_LIBDIR} - ) - - find_library(HEIMNTLM_LIBRARY - NAMES - heimntlm - PATHS - ${GSSAPI_ROOT_DIR}/lib - ${_GSSAPI_LIBDIR} - ) - - find_library(HX509_LIBRARY - NAMES - hx509 - PATHS - ${GSSAPI_ROOT_DIR}/lib - ${_GSSAPI_LIBDIR} - ) - - find_library(ASN1_LIBRARY - NAMES - asn1 - PATHS - ${GSSAPI_ROOT_DIR}/lib - ${_GSSAPI_LIBDIR} - ) - - find_library(WIND_LIBRARY - NAMES - wind - PATHS - ${GSSAPI_ROOT_DIR}/lib - ${_GSSAPI_LIBDIR} - ) - - find_library(ROKEN_LIBRARY - NAMES - roken - PATHS - ${GSSAPI_ROOT_DIR}/lib - ${_GSSAPI_LIBDIR} - ) - - if (GSSAPI_LIBRARY) - set(GSSAPI_LIBRARIES - ${GSSAPI_LIBRARIES} - ${GSSAPI_LIBRARY} - ) - endif (GSSAPI_LIBRARY) - - if (KRB5_LIBRARY) - set(GSSAPI_LIBRARIES - ${GSSAPI_LIBRARIES} - ${KRB5_LIBRARY} - ) - endif (KRB5_LIBRARY) - - if (HCRYPTO_LIBRARY) - set(GSSAPI_LIBRARIES - ${GSSAPI_LIBRARIES} - ${HCRYPTO_LIBRARY} - ) - endif (HCRYPTO_LIBRARY) - - if (COM_ERR_LIBRARY) - set(GSSAPI_LIBRARIES - ${GSSAPI_LIBRARIES} - ${COM_ERR_LIBRARY} - ) - endif (COM_ERR_LIBRARY) - - if (HEIMNTLM_LIBRARY) - set(GSSAPI_LIBRARIES - ${GSSAPI_LIBRARIES} - ${HEIMNTLM_LIBRARY} - ) - endif (HEIMNTLM_LIBRARY) - - if (HX509_LIBRARY) - set(GSSAPI_LIBRARIES - ${GSSAPI_LIBRARIES} - ${HX509_LIBRARY} - ) - endif (HX509_LIBRARY) - - if (ASN1_LIBRARY) - set(GSSAPI_LIBRARIES - ${GSSAPI_LIBRARIES} - ${ASN1_LIBRARY} - ) - endif (ASN1_LIBRARY) - - if (WIND_LIBRARY) - set(GSSAPI_LIBRARIES - ${GSSAPI_LIBRARIES} - ${WIND_LIBRARY} - ) - endif (WIND_LIBRARY) - - if (ROKEN_LIBRARY) - set(GSSAPI_LIBRARIES - ${GSSAPI_LIBRARIES} - ${WIND_LIBRARY} - ) - endif (ROKEN_LIBRARY) -endif (GSSAPI_FLAVOR_HEIMDAL) - -include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(GSSAPI DEFAULT_MSG GSSAPI_LIBRARIES GSSAPI_INCLUDE_DIR) - -if (GSSAPI_INCLUDE_DIRS AND GSSAPI_LIBRARIES) - set(GSSAPI_FOUND TRUE) -endif (GSSAPI_INCLUDE_DIRS AND GSSAPI_LIBRARIES) - -# show the GSSAPI_INCLUDE_DIRS and GSSAPI_LIBRARIES variables only in the advanced view -mark_as_advanced(GSSAPI_INCLUDE_DIRS GSSAPI_LIBRARIES) diff --git a/vendor/libgit2/cmake/Modules/FindHTTP_Parser.cmake b/vendor/libgit2/cmake/Modules/FindHTTP_Parser.cmake deleted file mode 100644 index d92bf75cc6..0000000000 --- a/vendor/libgit2/cmake/Modules/FindHTTP_Parser.cmake +++ /dev/null @@ -1,39 +0,0 @@ -# - Try to find http-parser -# -# Defines the following variables: -# -# HTTP_PARSER_FOUND - system has http-parser -# HTTP_PARSER_INCLUDE_DIR - the http-parser include directory -# HTTP_PARSER_LIBRARIES - Link these to use http-parser -# HTTP_PARSER_VERSION_MAJOR - major version -# HTTP_PARSER_VERSION_MINOR - minor version -# HTTP_PARSER_VERSION_STRING - the version of http-parser found - -# Find the header and library -FIND_PATH(HTTP_PARSER_INCLUDE_DIR NAMES http_parser.h) -FIND_LIBRARY(HTTP_PARSER_LIBRARY NAMES http_parser libhttp_parser) - -# Found the header, read version -if (HTTP_PARSER_INCLUDE_DIR AND EXISTS "${HTTP_PARSER_INCLUDE_DIR}/http_parser.h") - FILE(READ "${HTTP_PARSER_INCLUDE_DIR}/http_parser.h" HTTP_PARSER_H) - IF (HTTP_PARSER_H) - STRING(REGEX REPLACE ".*#define[\t ]+HTTP_PARSER_VERSION_MAJOR[\t ]+([0-9]+).*" "\\1" HTTP_PARSER_VERSION_MAJOR "${HTTP_PARSER_H}") - STRING(REGEX REPLACE ".*#define[\t ]+HTTP_PARSER_VERSION_MINOR[\t ]+([0-9]+).*" "\\1" HTTP_PARSER_VERSION_MINOR "${HTTP_PARSER_H}") - SET(HTTP_PARSER_VERSION_STRING "${HTTP_PARSER_VERSION_MAJOR}.${HTTP_PARSER_VERSION_MINOR}") - ENDIF() - UNSET(HTTP_PARSER_H) -ENDIF() - -# Handle the QUIETLY and REQUIRED arguments and set HTTP_PARSER_FOUND -# to TRUE if all listed variables are TRUE -INCLUDE(FindPackageHandleStandardArgs) -FIND_PACKAGE_HANDLE_STANDARD_ARGS(HTTP_Parser REQUIRED_VARS HTTP_PARSER_INCLUDE_DIR HTTP_PARSER_LIBRARY) - -# Hide advanced variables -MARK_AS_ADVANCED(HTTP_PARSER_INCLUDE_DIR HTTP_PARSER_LIBRARY) - -# Set standard variables -IF (HTTP_PARSER_FOUND) - SET(HTTP_PARSER_LIBRARIES ${HTTP_PARSER_LIBRARY}) - set(HTTP_PARSER_INCLUDE_DIRS ${HTTP_PARSER_INCLUDE_DIR}) -ENDIF() diff --git a/vendor/libgit2/cmake/Modules/FindIconv.cmake b/vendor/libgit2/cmake/Modules/FindIconv.cmake deleted file mode 100644 index 95414bda6f..0000000000 --- a/vendor/libgit2/cmake/Modules/FindIconv.cmake +++ /dev/null @@ -1,40 +0,0 @@ -# - Try to find Iconv -# Once done this will define -# -# ICONV_FOUND - system has Iconv -# ICONV_INCLUDE_DIR - the Iconv include directory -# ICONV_LIBRARIES - Link these to use Iconv -# - -IF(ICONV_INCLUDE_DIR AND ICONV_LIBRARIES) - # Already in cache, be silent - SET(ICONV_FIND_QUIETLY TRUE) -ENDIF() - -FIND_PATH(ICONV_INCLUDE_DIR iconv.h) -FIND_LIBRARY(iconv_lib NAMES iconv libiconv libiconv-2 c) - -IF(ICONV_INCLUDE_DIR AND iconv_lib) - SET(ICONV_FOUND TRUE) -ENDIF() - -IF(ICONV_FOUND) - # split iconv into -L and -l linker options, so we can set them for pkg-config - GET_FILENAME_COMPONENT(iconv_path ${iconv_lib} PATH) - GET_FILENAME_COMPONENT(iconv_name ${iconv_lib} NAME_WE) - STRING(REGEX REPLACE "^lib" "" iconv_name ${iconv_name}) - SET(ICONV_LIBRARIES "-L${iconv_path} -l${iconv_name}") - - IF(NOT ICONV_FIND_QUIETLY) - MESSAGE(STATUS "Found Iconv: ${ICONV_LIBRARIES}") - ENDIF(NOT ICONV_FIND_QUIETLY) -ELSE() - IF(Iconv_FIND_REQUIRED) - MESSAGE(FATAL_ERROR "Could not find Iconv") - ENDIF(Iconv_FIND_REQUIRED) -ENDIF() - -MARK_AS_ADVANCED( - ICONV_INCLUDE_DIR - ICONV_LIBRARIES -) diff --git a/vendor/libgit2/cmake/Modules/FindSecurity.cmake b/vendor/libgit2/cmake/Modules/FindSecurity.cmake deleted file mode 100644 index 0decdde925..0000000000 --- a/vendor/libgit2/cmake/Modules/FindSecurity.cmake +++ /dev/null @@ -1,9 +0,0 @@ -IF (SECURITY_INCLUDE_DIR AND SECURITY_DIRS) - SET(SECURITY_FOUND TRUE) -ELSE () - FIND_PATH(SECURITY_INCLUDE_DIR NAMES Security/Security.h) - FIND_LIBRARY(SECURITY_DIRS NAMES Security) - IF (SECURITY_INCLUDE_DIR AND SECURITY_DIRS) - SET(SECURITY_FOUND TRUE) - ENDIF () -ENDIF () diff --git a/vendor/libgit2/deps/http-parser/LICENSE-MIT b/vendor/libgit2/deps/http-parser/LICENSE-MIT deleted file mode 100644 index 58010b3889..0000000000 --- a/vendor/libgit2/deps/http-parser/LICENSE-MIT +++ /dev/null @@ -1,23 +0,0 @@ -http_parser.c is based on src/http/ngx_http_parse.c from NGINX copyright -Igor Sysoev. - -Additional changes are licensed under the same terms as NGINX and -copyright Joyent, Inc. and other Node contributors. All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to -deal in the Software without restriction, including without limitation the -rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -sell copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -IN THE SOFTWARE. diff --git a/vendor/libgit2/deps/http-parser/http_parser.c b/vendor/libgit2/deps/http-parser/http_parser.c deleted file mode 100644 index 2035302547..0000000000 --- a/vendor/libgit2/deps/http-parser/http_parser.c +++ /dev/null @@ -1,2174 +0,0 @@ -/* Based on src/http/ngx_http_parse.c from NGINX copyright Igor Sysoev - * - * Additional changes are licensed under the same terms as NGINX and - * copyright Joyent, Inc. and other Node contributors. All rights reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to - * deal in the Software without restriction, including without limitation the - * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - * sell copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS - * IN THE SOFTWARE. - */ -#include "http_parser.h" -#include -#include -#include -#include -#include -#include - -#ifndef ULLONG_MAX -# define ULLONG_MAX ((uint64_t) -1) /* 2^64-1 */ -#endif - -#ifndef MIN -# define MIN(a,b) ((a) < (b) ? (a) : (b)) -#endif - -#ifndef ARRAY_SIZE -# define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0])) -#endif - -#ifndef BIT_AT -# define BIT_AT(a, i) \ - (!!((unsigned int) (a)[(unsigned int) (i) >> 3] & \ - (1 << ((unsigned int) (i) & 7)))) -#endif - -#ifndef ELEM_AT -# define ELEM_AT(a, i, v) ((unsigned int) (i) < ARRAY_SIZE(a) ? (a)[(i)] : (v)) -#endif - -#define SET_ERRNO(e) \ -do { \ - parser->http_errno = (e); \ -} while(0) - - -/* Run the notify callback FOR, returning ER if it fails */ -#define CALLBACK_NOTIFY_(FOR, ER) \ -do { \ - assert(HTTP_PARSER_ERRNO(parser) == HPE_OK); \ - \ - if (settings->on_##FOR) { \ - if (0 != settings->on_##FOR(parser)) { \ - SET_ERRNO(HPE_CB_##FOR); \ - } \ - \ - /* We either errored above or got paused; get out */ \ - if (HTTP_PARSER_ERRNO(parser) != HPE_OK) { \ - return (ER); \ - } \ - } \ -} while (0) - -/* Run the notify callback FOR and consume the current byte */ -#define CALLBACK_NOTIFY(FOR) CALLBACK_NOTIFY_(FOR, p - data + 1) - -/* Run the notify callback FOR and don't consume the current byte */ -#define CALLBACK_NOTIFY_NOADVANCE(FOR) CALLBACK_NOTIFY_(FOR, p - data) - -/* Run data callback FOR with LEN bytes, returning ER if it fails */ -#define CALLBACK_DATA_(FOR, LEN, ER) \ -do { \ - assert(HTTP_PARSER_ERRNO(parser) == HPE_OK); \ - \ - if (FOR##_mark) { \ - if (settings->on_##FOR) { \ - if (0 != settings->on_##FOR(parser, FOR##_mark, (LEN))) { \ - SET_ERRNO(HPE_CB_##FOR); \ - } \ - \ - /* We either errored above or got paused; get out */ \ - if (HTTP_PARSER_ERRNO(parser) != HPE_OK) { \ - return (ER); \ - } \ - } \ - FOR##_mark = NULL; \ - } \ -} while (0) - -/* Run the data callback FOR and consume the current byte */ -#define CALLBACK_DATA(FOR) \ - CALLBACK_DATA_(FOR, p - FOR##_mark, p - data + 1) - -/* Run the data callback FOR and don't consume the current byte */ -#define CALLBACK_DATA_NOADVANCE(FOR) \ - CALLBACK_DATA_(FOR, p - FOR##_mark, p - data) - -/* Set the mark FOR; non-destructive if mark is already set */ -#define MARK(FOR) \ -do { \ - if (!FOR##_mark) { \ - FOR##_mark = p; \ - } \ -} while (0) - - -#define PROXY_CONNECTION "proxy-connection" -#define CONNECTION "connection" -#define CONTENT_LENGTH "content-length" -#define TRANSFER_ENCODING "transfer-encoding" -#define UPGRADE "upgrade" -#define CHUNKED "chunked" -#define KEEP_ALIVE "keep-alive" -#define CLOSE "close" - - -static const char *method_strings[] = - { -#define XX(num, name, string) #string, - HTTP_METHOD_MAP(XX) -#undef XX - }; - - -/* Tokens as defined by rfc 2616. Also lowercases them. - * token = 1* - * separators = "(" | ")" | "<" | ">" | "@" - * | "," | ";" | ":" | "\" | <"> - * | "/" | "[" | "]" | "?" | "=" - * | "{" | "}" | SP | HT - */ -static const char tokens[256] = { -/* 0 nul 1 soh 2 stx 3 etx 4 eot 5 enq 6 ack 7 bel */ - 0, 0, 0, 0, 0, 0, 0, 0, -/* 8 bs 9 ht 10 nl 11 vt 12 np 13 cr 14 so 15 si */ - 0, 0, 0, 0, 0, 0, 0, 0, -/* 16 dle 17 dc1 18 dc2 19 dc3 20 dc4 21 nak 22 syn 23 etb */ - 0, 0, 0, 0, 0, 0, 0, 0, -/* 24 can 25 em 26 sub 27 esc 28 fs 29 gs 30 rs 31 us */ - 0, 0, 0, 0, 0, 0, 0, 0, -/* 32 sp 33 ! 34 " 35 # 36 $ 37 % 38 & 39 ' */ - 0, '!', 0, '#', '$', '%', '&', '\'', -/* 40 ( 41 ) 42 * 43 + 44 , 45 - 46 . 47 / */ - 0, 0, '*', '+', 0, '-', '.', 0, -/* 48 0 49 1 50 2 51 3 52 4 53 5 54 6 55 7 */ - '0', '1', '2', '3', '4', '5', '6', '7', -/* 56 8 57 9 58 : 59 ; 60 < 61 = 62 > 63 ? */ - '8', '9', 0, 0, 0, 0, 0, 0, -/* 64 @ 65 A 66 B 67 C 68 D 69 E 70 F 71 G */ - 0, 'a', 'b', 'c', 'd', 'e', 'f', 'g', -/* 72 H 73 I 74 J 75 K 76 L 77 M 78 N 79 O */ - 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', -/* 80 P 81 Q 82 R 83 S 84 T 85 U 86 V 87 W */ - 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', -/* 88 X 89 Y 90 Z 91 [ 92 \ 93 ] 94 ^ 95 _ */ - 'x', 'y', 'z', 0, 0, 0, '^', '_', -/* 96 ` 97 a 98 b 99 c 100 d 101 e 102 f 103 g */ - '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', -/* 104 h 105 i 106 j 107 k 108 l 109 m 110 n 111 o */ - 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', -/* 112 p 113 q 114 r 115 s 116 t 117 u 118 v 119 w */ - 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', -/* 120 x 121 y 122 z 123 { 124 | 125 } 126 ~ 127 del */ - 'x', 'y', 'z', 0, '|', 0, '~', 0 }; - - -static const int8_t unhex[256] = - {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 - ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 - ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 - , 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,-1,-1,-1,-1,-1,-1 - ,-1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1 - ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 - ,-1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1 - ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 - }; - - -#if HTTP_PARSER_STRICT -# define T(v) 0 -#else -# define T(v) v -#endif - - -static const uint8_t normal_url_char[32] = { -/* 0 nul 1 soh 2 stx 3 etx 4 eot 5 enq 6 ack 7 bel */ - 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0, -/* 8 bs 9 ht 10 nl 11 vt 12 np 13 cr 14 so 15 si */ - 0 | T(2) | 0 | 0 | T(16) | 0 | 0 | 0, -/* 16 dle 17 dc1 18 dc2 19 dc3 20 dc4 21 nak 22 syn 23 etb */ - 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0, -/* 24 can 25 em 26 sub 27 esc 28 fs 29 gs 30 rs 31 us */ - 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0, -/* 32 sp 33 ! 34 " 35 # 36 $ 37 % 38 & 39 ' */ - 0 | 2 | 4 | 0 | 16 | 32 | 64 | 128, -/* 40 ( 41 ) 42 * 43 + 44 , 45 - 46 . 47 / */ - 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128, -/* 48 0 49 1 50 2 51 3 52 4 53 5 54 6 55 7 */ - 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128, -/* 56 8 57 9 58 : 59 ; 60 < 61 = 62 > 63 ? */ - 1 | 2 | 4 | 8 | 16 | 32 | 64 | 0, -/* 64 @ 65 A 66 B 67 C 68 D 69 E 70 F 71 G */ - 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128, -/* 72 H 73 I 74 J 75 K 76 L 77 M 78 N 79 O */ - 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128, -/* 80 P 81 Q 82 R 83 S 84 T 85 U 86 V 87 W */ - 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128, -/* 88 X 89 Y 90 Z 91 [ 92 \ 93 ] 94 ^ 95 _ */ - 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128, -/* 96 ` 97 a 98 b 99 c 100 d 101 e 102 f 103 g */ - 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128, -/* 104 h 105 i 106 j 107 k 108 l 109 m 110 n 111 o */ - 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128, -/* 112 p 113 q 114 r 115 s 116 t 117 u 118 v 119 w */ - 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128, -/* 120 x 121 y 122 z 123 { 124 | 125 } 126 ~ 127 del */ - 1 | 2 | 4 | 8 | 16 | 32 | 64 | 0, }; - -#undef T - -enum state - { s_dead = 1 /* important that this is > 0 */ - - , s_start_req_or_res - , s_res_or_resp_H - , s_start_res - , s_res_H - , s_res_HT - , s_res_HTT - , s_res_HTTP - , s_res_first_http_major - , s_res_http_major - , s_res_first_http_minor - , s_res_http_minor - , s_res_first_status_code - , s_res_status_code - , s_res_status - , s_res_line_almost_done - - , s_start_req - - , s_req_method - , s_req_spaces_before_url - , s_req_schema - , s_req_schema_slash - , s_req_schema_slash_slash - , s_req_server_start - , s_req_server - , s_req_server_with_at - , s_req_path - , s_req_query_string_start - , s_req_query_string - , s_req_fragment_start - , s_req_fragment - , s_req_http_start - , s_req_http_H - , s_req_http_HT - , s_req_http_HTT - , s_req_http_HTTP - , s_req_first_http_major - , s_req_http_major - , s_req_first_http_minor - , s_req_http_minor - , s_req_line_almost_done - - , s_header_field_start - , s_header_field - , s_header_value_start - , s_header_value - , s_header_value_lws - - , s_header_almost_done - - , s_chunk_size_start - , s_chunk_size - , s_chunk_parameters - , s_chunk_size_almost_done - - , s_headers_almost_done - , s_headers_done - - /* Important: 's_headers_done' must be the last 'header' state. All - * states beyond this must be 'body' states. It is used for overflow - * checking. See the PARSING_HEADER() macro. - */ - - , s_chunk_data - , s_chunk_data_almost_done - , s_chunk_data_done - - , s_body_identity - , s_body_identity_eof - - , s_message_done - }; - - -#define PARSING_HEADER(state) (state <= s_headers_done) - - -enum header_states - { h_general = 0 - , h_C - , h_CO - , h_CON - - , h_matching_connection - , h_matching_proxy_connection - , h_matching_content_length - , h_matching_transfer_encoding - , h_matching_upgrade - - , h_connection - , h_content_length - , h_transfer_encoding - , h_upgrade - - , h_matching_transfer_encoding_chunked - , h_matching_connection_keep_alive - , h_matching_connection_close - - , h_transfer_encoding_chunked - , h_connection_keep_alive - , h_connection_close - }; - -enum http_host_state - { - s_http_host_dead = 1 - , s_http_userinfo_start - , s_http_userinfo - , s_http_host_start - , s_http_host_v6_start - , s_http_host - , s_http_host_v6 - , s_http_host_v6_end - , s_http_host_port_start - , s_http_host_port -}; - -/* Macros for character classes; depends on strict-mode */ -#define CR '\r' -#define LF '\n' -#define LOWER(c) (unsigned char)(c | 0x20) -#define IS_ALPHA(c) (LOWER(c) >= 'a' && LOWER(c) <= 'z') -#define IS_NUM(c) ((c) >= '0' && (c) <= '9') -#define IS_ALPHANUM(c) (IS_ALPHA(c) || IS_NUM(c)) -#define IS_HEX(c) (IS_NUM(c) || (LOWER(c) >= 'a' && LOWER(c) <= 'f')) -#define IS_MARK(c) ((c) == '-' || (c) == '_' || (c) == '.' || \ - (c) == '!' || (c) == '~' || (c) == '*' || (c) == '\'' || (c) == '(' || \ - (c) == ')') -#define IS_USERINFO_CHAR(c) (IS_ALPHANUM(c) || IS_MARK(c) || (c) == '%' || \ - (c) == ';' || (c) == ':' || (c) == '&' || (c) == '=' || (c) == '+' || \ - (c) == '$' || (c) == ',') - -#if HTTP_PARSER_STRICT -#define TOKEN(c) (tokens[(unsigned char)c]) -#define IS_URL_CHAR(c) (BIT_AT(normal_url_char, (unsigned char)c)) -#define IS_HOST_CHAR(c) (IS_ALPHANUM(c) || (c) == '.' || (c) == '-') -#else -#define TOKEN(c) ((c == ' ') ? ' ' : tokens[(unsigned char)c]) -#define IS_URL_CHAR(c) \ - (BIT_AT(normal_url_char, (unsigned char)c) || ((c) & 0x80)) -#define IS_HOST_CHAR(c) \ - (IS_ALPHANUM(c) || (c) == '.' || (c) == '-' || (c) == '_') -#endif - - -#define start_state (parser->type == HTTP_REQUEST ? s_start_req : s_start_res) - - -#if HTTP_PARSER_STRICT -# define STRICT_CHECK(cond) \ -do { \ - if (cond) { \ - SET_ERRNO(HPE_STRICT); \ - goto error; \ - } \ -} while (0) -# define NEW_MESSAGE() (http_should_keep_alive(parser) ? start_state : s_dead) -#else -# define STRICT_CHECK(cond) -# define NEW_MESSAGE() start_state -#endif - - -/* Map errno values to strings for human-readable output */ -#define HTTP_STRERROR_GEN(n, s) { "HPE_" #n, s }, -static struct { - const char *name; - const char *description; -} http_strerror_tab[] = { - HTTP_ERRNO_MAP(HTTP_STRERROR_GEN) -}; -#undef HTTP_STRERROR_GEN - -int http_message_needs_eof(const http_parser *parser); - -/* Our URL parser. - * - * This is designed to be shared by http_parser_execute() for URL validation, - * hence it has a state transition + byte-for-byte interface. In addition, it - * is meant to be embedded in http_parser_parse_url(), which does the dirty - * work of turning state transitions URL components for its API. - * - * This function should only be invoked with non-space characters. It is - * assumed that the caller cares about (and can detect) the transition between - * URL and non-URL states by looking for these. - */ -static enum state -parse_url_char(enum state s, const char ch) -{ - if (ch == ' ' || ch == '\r' || ch == '\n') { - return s_dead; - } - -#if HTTP_PARSER_STRICT - if (ch == '\t' || ch == '\f') { - return s_dead; - } -#endif - - switch (s) { - case s_req_spaces_before_url: - /* Proxied requests are followed by scheme of an absolute URI (alpha). - * All methods except CONNECT are followed by '/' or '*'. - */ - - if (ch == '/' || ch == '*') { - return s_req_path; - } - - if (IS_ALPHA(ch)) { - return s_req_schema; - } - - break; - - case s_req_schema: - if (IS_ALPHA(ch)) { - return s; - } - - if (ch == ':') { - return s_req_schema_slash; - } - - break; - - case s_req_schema_slash: - if (ch == '/') { - return s_req_schema_slash_slash; - } - - break; - - case s_req_schema_slash_slash: - if (ch == '/') { - return s_req_server_start; - } - - break; - - case s_req_server_with_at: - if (ch == '@') { - return s_dead; - } - - /* FALLTHROUGH */ - case s_req_server_start: - case s_req_server: - if (ch == '/') { - return s_req_path; - } - - if (ch == '?') { - return s_req_query_string_start; - } - - if (ch == '@') { - return s_req_server_with_at; - } - - if (IS_USERINFO_CHAR(ch) || ch == '[' || ch == ']') { - return s_req_server; - } - - break; - - case s_req_path: - if (IS_URL_CHAR(ch)) { - return s; - } - - switch (ch) { - case '?': - return s_req_query_string_start; - - case '#': - return s_req_fragment_start; - } - - break; - - case s_req_query_string_start: - case s_req_query_string: - if (IS_URL_CHAR(ch)) { - return s_req_query_string; - } - - switch (ch) { - case '?': - /* allow extra '?' in query string */ - return s_req_query_string; - - case '#': - return s_req_fragment_start; - } - - break; - - case s_req_fragment_start: - if (IS_URL_CHAR(ch)) { - return s_req_fragment; - } - - switch (ch) { - case '?': - return s_req_fragment; - - case '#': - return s; - } - - break; - - case s_req_fragment: - if (IS_URL_CHAR(ch)) { - return s; - } - - switch (ch) { - case '?': - case '#': - return s; - } - - break; - - default: - break; - } - - /* We should never fall out of the switch above unless there's an error */ - return s_dead; -} - -size_t http_parser_execute (http_parser *parser, - const http_parser_settings *settings, - const char *data, - size_t len) -{ - char c, ch; - int8_t unhex_val; - const char *p = data; - const char *header_field_mark = 0; - const char *header_value_mark = 0; - const char *url_mark = 0; - const char *body_mark = 0; - - /* We're in an error state. Don't bother doing anything. */ - if (HTTP_PARSER_ERRNO(parser) != HPE_OK) { - return 0; - } - - if (len == 0) { - switch (parser->state) { - case s_body_identity_eof: - /* Use of CALLBACK_NOTIFY() here would erroneously return 1 byte read if - * we got paused. - */ - CALLBACK_NOTIFY_NOADVANCE(message_complete); - return 0; - - case s_dead: - case s_start_req_or_res: - case s_start_res: - case s_start_req: - return 0; - - default: - SET_ERRNO(HPE_INVALID_EOF_STATE); - return 1; - } - } - - - if (parser->state == s_header_field) - header_field_mark = data; - if (parser->state == s_header_value) - header_value_mark = data; - switch (parser->state) { - case s_req_path: - case s_req_schema: - case s_req_schema_slash: - case s_req_schema_slash_slash: - case s_req_server_start: - case s_req_server: - case s_req_server_with_at: - case s_req_query_string_start: - case s_req_query_string: - case s_req_fragment_start: - case s_req_fragment: - url_mark = data; - break; - } - - for (p=data; p != data + len; p++) { - ch = *p; - - if (PARSING_HEADER(parser->state)) { - ++parser->nread; - /* Buffer overflow attack */ - if (parser->nread > HTTP_MAX_HEADER_SIZE) { - SET_ERRNO(HPE_HEADER_OVERFLOW); - goto error; - } - } - - reexecute_byte: - switch (parser->state) { - - case s_dead: - /* this state is used after a 'Connection: close' message - * the parser will error out if it reads another message - */ - if (ch == CR || ch == LF) - break; - - SET_ERRNO(HPE_CLOSED_CONNECTION); - goto error; - - case s_start_req_or_res: - { - if (ch == CR || ch == LF) - break; - parser->flags = 0; - parser->content_length = ULLONG_MAX; - - if (ch == 'H') { - parser->state = s_res_or_resp_H; - - CALLBACK_NOTIFY(message_begin); - } else { - parser->type = HTTP_REQUEST; - parser->state = s_start_req; - goto reexecute_byte; - } - - break; - } - - case s_res_or_resp_H: - if (ch == 'T') { - parser->type = HTTP_RESPONSE; - parser->state = s_res_HT; - } else { - if (ch != 'E') { - SET_ERRNO(HPE_INVALID_CONSTANT); - goto error; - } - - parser->type = HTTP_REQUEST; - parser->method = HTTP_HEAD; - parser->index = 2; - parser->state = s_req_method; - } - break; - - case s_start_res: - { - parser->flags = 0; - parser->content_length = ULLONG_MAX; - - switch (ch) { - case 'H': - parser->state = s_res_H; - break; - - case CR: - case LF: - break; - - default: - SET_ERRNO(HPE_INVALID_CONSTANT); - goto error; - } - - CALLBACK_NOTIFY(message_begin); - break; - } - - case s_res_H: - STRICT_CHECK(ch != 'T'); - parser->state = s_res_HT; - break; - - case s_res_HT: - STRICT_CHECK(ch != 'T'); - parser->state = s_res_HTT; - break; - - case s_res_HTT: - STRICT_CHECK(ch != 'P'); - parser->state = s_res_HTTP; - break; - - case s_res_HTTP: - STRICT_CHECK(ch != '/'); - parser->state = s_res_first_http_major; - break; - - case s_res_first_http_major: - if (ch < '0' || ch > '9') { - SET_ERRNO(HPE_INVALID_VERSION); - goto error; - } - - parser->http_major = ch - '0'; - parser->state = s_res_http_major; - break; - - /* major HTTP version or dot */ - case s_res_http_major: - { - if (ch == '.') { - parser->state = s_res_first_http_minor; - break; - } - - if (!IS_NUM(ch)) { - SET_ERRNO(HPE_INVALID_VERSION); - goto error; - } - - parser->http_major *= 10; - parser->http_major += ch - '0'; - - if (parser->http_major > 999) { - SET_ERRNO(HPE_INVALID_VERSION); - goto error; - } - - break; - } - - /* first digit of minor HTTP version */ - case s_res_first_http_minor: - if (!IS_NUM(ch)) { - SET_ERRNO(HPE_INVALID_VERSION); - goto error; - } - - parser->http_minor = ch - '0'; - parser->state = s_res_http_minor; - break; - - /* minor HTTP version or end of request line */ - case s_res_http_minor: - { - if (ch == ' ') { - parser->state = s_res_first_status_code; - break; - } - - if (!IS_NUM(ch)) { - SET_ERRNO(HPE_INVALID_VERSION); - goto error; - } - - parser->http_minor *= 10; - parser->http_minor += ch - '0'; - - if (parser->http_minor > 999) { - SET_ERRNO(HPE_INVALID_VERSION); - goto error; - } - - break; - } - - case s_res_first_status_code: - { - if (!IS_NUM(ch)) { - if (ch == ' ') { - break; - } - - SET_ERRNO(HPE_INVALID_STATUS); - goto error; - } - parser->status_code = ch - '0'; - parser->state = s_res_status_code; - break; - } - - case s_res_status_code: - { - if (!IS_NUM(ch)) { - switch (ch) { - case ' ': - parser->state = s_res_status; - break; - case CR: - parser->state = s_res_line_almost_done; - break; - case LF: - parser->state = s_header_field_start; - break; - default: - SET_ERRNO(HPE_INVALID_STATUS); - goto error; - } - break; - } - - parser->status_code *= 10; - parser->status_code += ch - '0'; - - if (parser->status_code > 999) { - SET_ERRNO(HPE_INVALID_STATUS); - goto error; - } - - break; - } - - case s_res_status: - /* the human readable status. e.g. "NOT FOUND" - * we are not humans so just ignore this */ - if (ch == CR) { - parser->state = s_res_line_almost_done; - break; - } - - if (ch == LF) { - parser->state = s_header_field_start; - break; - } - break; - - case s_res_line_almost_done: - STRICT_CHECK(ch != LF); - parser->state = s_header_field_start; - break; - - case s_start_req: - { - if (ch == CR || ch == LF) - break; - parser->flags = 0; - parser->content_length = ULLONG_MAX; - - if (!IS_ALPHA(ch)) { - SET_ERRNO(HPE_INVALID_METHOD); - goto error; - } - - parser->method = (enum http_method) 0; - parser->index = 1; - switch (ch) { - case 'C': parser->method = HTTP_CONNECT; /* or COPY, CHECKOUT */ break; - case 'D': parser->method = HTTP_DELETE; break; - case 'G': parser->method = HTTP_GET; break; - case 'H': parser->method = HTTP_HEAD; break; - case 'L': parser->method = HTTP_LOCK; break; - case 'M': parser->method = HTTP_MKCOL; /* or MOVE, MKACTIVITY, MERGE, M-SEARCH */ break; - case 'N': parser->method = HTTP_NOTIFY; break; - case 'O': parser->method = HTTP_OPTIONS; break; - case 'P': parser->method = HTTP_POST; - /* or PROPFIND|PROPPATCH|PUT|PATCH|PURGE */ - break; - case 'R': parser->method = HTTP_REPORT; break; - case 'S': parser->method = HTTP_SUBSCRIBE; /* or SEARCH */ break; - case 'T': parser->method = HTTP_TRACE; break; - case 'U': parser->method = HTTP_UNLOCK; /* or UNSUBSCRIBE */ break; - default: - SET_ERRNO(HPE_INVALID_METHOD); - goto error; - } - parser->state = s_req_method; - - CALLBACK_NOTIFY(message_begin); - - break; - } - - case s_req_method: - { - const char *matcher; - if (ch == '\0') { - SET_ERRNO(HPE_INVALID_METHOD); - goto error; - } - - matcher = method_strings[parser->method]; - if (ch == ' ' && matcher[parser->index] == '\0') { - parser->state = s_req_spaces_before_url; - } else if (ch == matcher[parser->index]) { - ; /* nada */ - } else if (parser->method == HTTP_CONNECT) { - if (parser->index == 1 && ch == 'H') { - parser->method = HTTP_CHECKOUT; - } else if (parser->index == 2 && ch == 'P') { - parser->method = HTTP_COPY; - } else { - goto error; - } - } else if (parser->method == HTTP_MKCOL) { - if (parser->index == 1 && ch == 'O') { - parser->method = HTTP_MOVE; - } else if (parser->index == 1 && ch == 'E') { - parser->method = HTTP_MERGE; - } else if (parser->index == 1 && ch == '-') { - parser->method = HTTP_MSEARCH; - } else if (parser->index == 2 && ch == 'A') { - parser->method = HTTP_MKACTIVITY; - } else { - goto error; - } - } else if (parser->method == HTTP_SUBSCRIBE) { - if (parser->index == 1 && ch == 'E') { - parser->method = HTTP_SEARCH; - } else { - goto error; - } - } else if (parser->index == 1 && parser->method == HTTP_POST) { - if (ch == 'R') { - parser->method = HTTP_PROPFIND; /* or HTTP_PROPPATCH */ - } else if (ch == 'U') { - parser->method = HTTP_PUT; /* or HTTP_PURGE */ - } else if (ch == 'A') { - parser->method = HTTP_PATCH; - } else { - goto error; - } - } else if (parser->index == 2) { - if (parser->method == HTTP_PUT) { - if (ch == 'R') parser->method = HTTP_PURGE; - } else if (parser->method == HTTP_UNLOCK) { - if (ch == 'S') parser->method = HTTP_UNSUBSCRIBE; - } - } else if (parser->index == 4 && parser->method == HTTP_PROPFIND && ch == 'P') { - parser->method = HTTP_PROPPATCH; - } else { - SET_ERRNO(HPE_INVALID_METHOD); - goto error; - } - - ++parser->index; - break; - } - - case s_req_spaces_before_url: - { - if (ch == ' ') break; - - MARK(url); - if (parser->method == HTTP_CONNECT) { - parser->state = s_req_server_start; - } - - parser->state = parse_url_char((enum state)parser->state, ch); - if (parser->state == s_dead) { - SET_ERRNO(HPE_INVALID_URL); - goto error; - } - - break; - } - - case s_req_schema: - case s_req_schema_slash: - case s_req_schema_slash_slash: - case s_req_server_start: - { - switch (ch) { - /* No whitespace allowed here */ - case ' ': - case CR: - case LF: - SET_ERRNO(HPE_INVALID_URL); - goto error; - default: - parser->state = parse_url_char((enum state)parser->state, ch); - if (parser->state == s_dead) { - SET_ERRNO(HPE_INVALID_URL); - goto error; - } - } - - break; - } - - case s_req_server: - case s_req_server_with_at: - case s_req_path: - case s_req_query_string_start: - case s_req_query_string: - case s_req_fragment_start: - case s_req_fragment: - { - switch (ch) { - case ' ': - parser->state = s_req_http_start; - CALLBACK_DATA(url); - break; - case CR: - case LF: - parser->http_major = 0; - parser->http_minor = 9; - parser->state = (ch == CR) ? - s_req_line_almost_done : - s_header_field_start; - CALLBACK_DATA(url); - break; - default: - parser->state = parse_url_char((enum state)parser->state, ch); - if (parser->state == s_dead) { - SET_ERRNO(HPE_INVALID_URL); - goto error; - } - } - break; - } - - case s_req_http_start: - switch (ch) { - case 'H': - parser->state = s_req_http_H; - break; - case ' ': - break; - default: - SET_ERRNO(HPE_INVALID_CONSTANT); - goto error; - } - break; - - case s_req_http_H: - STRICT_CHECK(ch != 'T'); - parser->state = s_req_http_HT; - break; - - case s_req_http_HT: - STRICT_CHECK(ch != 'T'); - parser->state = s_req_http_HTT; - break; - - case s_req_http_HTT: - STRICT_CHECK(ch != 'P'); - parser->state = s_req_http_HTTP; - break; - - case s_req_http_HTTP: - STRICT_CHECK(ch != '/'); - parser->state = s_req_first_http_major; - break; - - /* first digit of major HTTP version */ - case s_req_first_http_major: - if (ch < '1' || ch > '9') { - SET_ERRNO(HPE_INVALID_VERSION); - goto error; - } - - parser->http_major = ch - '0'; - parser->state = s_req_http_major; - break; - - /* major HTTP version or dot */ - case s_req_http_major: - { - if (ch == '.') { - parser->state = s_req_first_http_minor; - break; - } - - if (!IS_NUM(ch)) { - SET_ERRNO(HPE_INVALID_VERSION); - goto error; - } - - parser->http_major *= 10; - parser->http_major += ch - '0'; - - if (parser->http_major > 999) { - SET_ERRNO(HPE_INVALID_VERSION); - goto error; - } - - break; - } - - /* first digit of minor HTTP version */ - case s_req_first_http_minor: - if (!IS_NUM(ch)) { - SET_ERRNO(HPE_INVALID_VERSION); - goto error; - } - - parser->http_minor = ch - '0'; - parser->state = s_req_http_minor; - break; - - /* minor HTTP version or end of request line */ - case s_req_http_minor: - { - if (ch == CR) { - parser->state = s_req_line_almost_done; - break; - } - - if (ch == LF) { - parser->state = s_header_field_start; - break; - } - - /* XXX allow spaces after digit? */ - - if (!IS_NUM(ch)) { - SET_ERRNO(HPE_INVALID_VERSION); - goto error; - } - - parser->http_minor *= 10; - parser->http_minor += ch - '0'; - - if (parser->http_minor > 999) { - SET_ERRNO(HPE_INVALID_VERSION); - goto error; - } - - break; - } - - /* end of request line */ - case s_req_line_almost_done: - { - if (ch != LF) { - SET_ERRNO(HPE_LF_EXPECTED); - goto error; - } - - parser->state = s_header_field_start; - break; - } - - case s_header_field_start: - { - if (ch == CR) { - parser->state = s_headers_almost_done; - break; - } - - if (ch == LF) { - /* they might be just sending \n instead of \r\n so this would be - * the second \n to denote the end of headers*/ - parser->state = s_headers_almost_done; - goto reexecute_byte; - } - - c = TOKEN(ch); - - if (!c) { - SET_ERRNO(HPE_INVALID_HEADER_TOKEN); - goto error; - } - - MARK(header_field); - - parser->index = 0; - parser->state = s_header_field; - - switch (c) { - case 'c': - parser->header_state = h_C; - break; - - case 'p': - parser->header_state = h_matching_proxy_connection; - break; - - case 't': - parser->header_state = h_matching_transfer_encoding; - break; - - case 'u': - parser->header_state = h_matching_upgrade; - break; - - default: - parser->header_state = h_general; - break; - } - break; - } - - case s_header_field: - { - c = TOKEN(ch); - - if (c) { - switch (parser->header_state) { - case h_general: - break; - - case h_C: - parser->index++; - parser->header_state = (c == 'o' ? h_CO : h_general); - break; - - case h_CO: - parser->index++; - parser->header_state = (c == 'n' ? h_CON : h_general); - break; - - case h_CON: - parser->index++; - switch (c) { - case 'n': - parser->header_state = h_matching_connection; - break; - case 't': - parser->header_state = h_matching_content_length; - break; - default: - parser->header_state = h_general; - break; - } - break; - - /* connection */ - - case h_matching_connection: - parser->index++; - if (parser->index > sizeof(CONNECTION)-1 - || c != CONNECTION[parser->index]) { - parser->header_state = h_general; - } else if (parser->index == sizeof(CONNECTION)-2) { - parser->header_state = h_connection; - } - break; - - /* proxy-connection */ - - case h_matching_proxy_connection: - parser->index++; - if (parser->index > sizeof(PROXY_CONNECTION)-1 - || c != PROXY_CONNECTION[parser->index]) { - parser->header_state = h_general; - } else if (parser->index == sizeof(PROXY_CONNECTION)-2) { - parser->header_state = h_connection; - } - break; - - /* content-length */ - - case h_matching_content_length: - parser->index++; - if (parser->index > sizeof(CONTENT_LENGTH)-1 - || c != CONTENT_LENGTH[parser->index]) { - parser->header_state = h_general; - } else if (parser->index == sizeof(CONTENT_LENGTH)-2) { - parser->header_state = h_content_length; - } - break; - - /* transfer-encoding */ - - case h_matching_transfer_encoding: - parser->index++; - if (parser->index > sizeof(TRANSFER_ENCODING)-1 - || c != TRANSFER_ENCODING[parser->index]) { - parser->header_state = h_general; - } else if (parser->index == sizeof(TRANSFER_ENCODING)-2) { - parser->header_state = h_transfer_encoding; - } - break; - - /* upgrade */ - - case h_matching_upgrade: - parser->index++; - if (parser->index > sizeof(UPGRADE)-1 - || c != UPGRADE[parser->index]) { - parser->header_state = h_general; - } else if (parser->index == sizeof(UPGRADE)-2) { - parser->header_state = h_upgrade; - } - break; - - case h_connection: - case h_content_length: - case h_transfer_encoding: - case h_upgrade: - if (ch != ' ') parser->header_state = h_general; - break; - - default: - assert(0 && "Unknown header_state"); - break; - } - break; - } - - if (ch == ':') { - parser->state = s_header_value_start; - CALLBACK_DATA(header_field); - break; - } - - if (ch == CR) { - parser->state = s_header_almost_done; - CALLBACK_DATA(header_field); - break; - } - - if (ch == LF) { - parser->state = s_header_field_start; - CALLBACK_DATA(header_field); - break; - } - - SET_ERRNO(HPE_INVALID_HEADER_TOKEN); - goto error; - } - - case s_header_value_start: - { - if (ch == ' ' || ch == '\t') break; - - MARK(header_value); - - parser->state = s_header_value; - parser->index = 0; - - if (ch == CR) { - parser->header_state = h_general; - parser->state = s_header_almost_done; - CALLBACK_DATA(header_value); - break; - } - - if (ch == LF) { - parser->state = s_header_field_start; - CALLBACK_DATA(header_value); - break; - } - - c = LOWER(ch); - - switch (parser->header_state) { - case h_upgrade: - parser->flags |= F_UPGRADE; - parser->header_state = h_general; - break; - - case h_transfer_encoding: - /* looking for 'Transfer-Encoding: chunked' */ - if ('c' == c) { - parser->header_state = h_matching_transfer_encoding_chunked; - } else { - parser->header_state = h_general; - } - break; - - case h_content_length: - if (!IS_NUM(ch)) { - SET_ERRNO(HPE_INVALID_CONTENT_LENGTH); - goto error; - } - - parser->content_length = ch - '0'; - break; - - case h_connection: - /* looking for 'Connection: keep-alive' */ - if (c == 'k') { - parser->header_state = h_matching_connection_keep_alive; - /* looking for 'Connection: close' */ - } else if (c == 'c') { - parser->header_state = h_matching_connection_close; - } else { - parser->header_state = h_general; - } - break; - - default: - parser->header_state = h_general; - break; - } - break; - } - - case s_header_value: - { - - if (ch == CR) { - parser->state = s_header_almost_done; - CALLBACK_DATA(header_value); - break; - } - - if (ch == LF) { - parser->state = s_header_almost_done; - CALLBACK_DATA_NOADVANCE(header_value); - goto reexecute_byte; - } - - c = LOWER(ch); - - switch (parser->header_state) { - case h_general: - break; - - case h_connection: - case h_transfer_encoding: - assert(0 && "Shouldn't get here."); - break; - - case h_content_length: - { - uint64_t t; - - if (ch == ' ') break; - - if (!IS_NUM(ch)) { - SET_ERRNO(HPE_INVALID_CONTENT_LENGTH); - goto error; - } - - t = parser->content_length; - t *= 10; - t += ch - '0'; - - /* Overflow? */ - if (t < parser->content_length || t == ULLONG_MAX) { - SET_ERRNO(HPE_INVALID_CONTENT_LENGTH); - goto error; - } - - parser->content_length = t; - break; - } - - /* Transfer-Encoding: chunked */ - case h_matching_transfer_encoding_chunked: - parser->index++; - if (parser->index > sizeof(CHUNKED)-1 - || c != CHUNKED[parser->index]) { - parser->header_state = h_general; - } else if (parser->index == sizeof(CHUNKED)-2) { - parser->header_state = h_transfer_encoding_chunked; - } - break; - - /* looking for 'Connection: keep-alive' */ - case h_matching_connection_keep_alive: - parser->index++; - if (parser->index > sizeof(KEEP_ALIVE)-1 - || c != KEEP_ALIVE[parser->index]) { - parser->header_state = h_general; - } else if (parser->index == sizeof(KEEP_ALIVE)-2) { - parser->header_state = h_connection_keep_alive; - } - break; - - /* looking for 'Connection: close' */ - case h_matching_connection_close: - parser->index++; - if (parser->index > sizeof(CLOSE)-1 || c != CLOSE[parser->index]) { - parser->header_state = h_general; - } else if (parser->index == sizeof(CLOSE)-2) { - parser->header_state = h_connection_close; - } - break; - - case h_transfer_encoding_chunked: - case h_connection_keep_alive: - case h_connection_close: - if (ch != ' ') parser->header_state = h_general; - break; - - default: - parser->state = s_header_value; - parser->header_state = h_general; - break; - } - break; - } - - case s_header_almost_done: - { - STRICT_CHECK(ch != LF); - - parser->state = s_header_value_lws; - - switch (parser->header_state) { - case h_connection_keep_alive: - parser->flags |= F_CONNECTION_KEEP_ALIVE; - break; - case h_connection_close: - parser->flags |= F_CONNECTION_CLOSE; - break; - case h_transfer_encoding_chunked: - parser->flags |= F_CHUNKED; - break; - default: - break; - } - - break; - } - - case s_header_value_lws: - { - if (ch == ' ' || ch == '\t') - parser->state = s_header_value_start; - else - { - parser->state = s_header_field_start; - goto reexecute_byte; - } - break; - } - - case s_headers_almost_done: - { - STRICT_CHECK(ch != LF); - - if (parser->flags & F_TRAILING) { - /* End of a chunked request */ - parser->state = NEW_MESSAGE(); - CALLBACK_NOTIFY(message_complete); - break; - } - - parser->state = s_headers_done; - - /* Set this here so that on_headers_complete() callbacks can see it */ - parser->upgrade = - (parser->flags & F_UPGRADE || parser->method == HTTP_CONNECT); - - /* Here we call the headers_complete callback. This is somewhat - * different than other callbacks because if the user returns 1, we - * will interpret that as saying that this message has no body. This - * is needed for the annoying case of recieving a response to a HEAD - * request. - * - * We'd like to use CALLBACK_NOTIFY_NOADVANCE() here but we cannot, so - * we have to simulate it by handling a change in errno below. - */ - if (settings->on_headers_complete) { - switch (settings->on_headers_complete(parser)) { - case 0: - break; - - case 1: - parser->flags |= F_SKIPBODY; - break; - - default: - SET_ERRNO(HPE_CB_headers_complete); - return p - data; /* Error */ - } - } - - if (HTTP_PARSER_ERRNO(parser) != HPE_OK) { - return p - data; - } - - goto reexecute_byte; - } - - case s_headers_done: - { - STRICT_CHECK(ch != LF); - - parser->nread = 0; - - /* Exit, the rest of the connect is in a different protocol. */ - if (parser->upgrade) { - parser->state = NEW_MESSAGE(); - CALLBACK_NOTIFY(message_complete); - return (p - data) + 1; - } - - if (parser->flags & F_SKIPBODY) { - parser->state = NEW_MESSAGE(); - CALLBACK_NOTIFY(message_complete); - } else if (parser->flags & F_CHUNKED) { - /* chunked encoding - ignore Content-Length header */ - parser->state = s_chunk_size_start; - } else { - if (parser->content_length == 0) { - /* Content-Length header given but zero: Content-Length: 0\r\n */ - parser->state = NEW_MESSAGE(); - CALLBACK_NOTIFY(message_complete); - } else if (parser->content_length != ULLONG_MAX) { - /* Content-Length header given and non-zero */ - parser->state = s_body_identity; - } else { - if (parser->type == HTTP_REQUEST || - !http_message_needs_eof(parser)) { - /* Assume content-length 0 - read the next */ - parser->state = NEW_MESSAGE(); - CALLBACK_NOTIFY(message_complete); - } else { - /* Read body until EOF */ - parser->state = s_body_identity_eof; - } - } - } - - break; - } - - case s_body_identity: - { - uint64_t to_read = MIN(parser->content_length, - (uint64_t) ((data + len) - p)); - - assert(parser->content_length != 0 - && parser->content_length != ULLONG_MAX); - - /* The difference between advancing content_length and p is because - * the latter will automaticaly advance on the next loop iteration. - * Further, if content_length ends up at 0, we want to see the last - * byte again for our message complete callback. - */ - MARK(body); - parser->content_length -= to_read; - p += to_read - 1; - - if (parser->content_length == 0) { - parser->state = s_message_done; - - /* Mimic CALLBACK_DATA_NOADVANCE() but with one extra byte. - * - * The alternative to doing this is to wait for the next byte to - * trigger the data callback, just as in every other case. The - * problem with this is that this makes it difficult for the test - * harness to distinguish between complete-on-EOF and - * complete-on-length. It's not clear that this distinction is - * important for applications, but let's keep it for now. - */ - CALLBACK_DATA_(body, p - body_mark + 1, p - data); - goto reexecute_byte; - } - - break; - } - - /* read until EOF */ - case s_body_identity_eof: - MARK(body); - p = data + len - 1; - - break; - - case s_message_done: - parser->state = NEW_MESSAGE(); - CALLBACK_NOTIFY(message_complete); - break; - - case s_chunk_size_start: - { - assert(parser->nread == 1); - assert(parser->flags & F_CHUNKED); - - unhex_val = unhex[(unsigned char)ch]; - if (unhex_val == -1) { - SET_ERRNO(HPE_INVALID_CHUNK_SIZE); - goto error; - } - - parser->content_length = unhex_val; - parser->state = s_chunk_size; - break; - } - - case s_chunk_size: - { - uint64_t t; - - assert(parser->flags & F_CHUNKED); - - if (ch == CR) { - parser->state = s_chunk_size_almost_done; - break; - } - - unhex_val = unhex[(unsigned char)ch]; - - if (unhex_val == -1) { - if (ch == ';' || ch == ' ') { - parser->state = s_chunk_parameters; - break; - } - - SET_ERRNO(HPE_INVALID_CHUNK_SIZE); - goto error; - } - - t = parser->content_length; - t *= 16; - t += unhex_val; - - /* Overflow? */ - if (t < parser->content_length || t == ULLONG_MAX) { - SET_ERRNO(HPE_INVALID_CONTENT_LENGTH); - goto error; - } - - parser->content_length = t; - break; - } - - case s_chunk_parameters: - { - assert(parser->flags & F_CHUNKED); - /* just ignore this. TODO check for overflow */ - if (ch == CR) { - parser->state = s_chunk_size_almost_done; - break; - } - break; - } - - case s_chunk_size_almost_done: - { - assert(parser->flags & F_CHUNKED); - STRICT_CHECK(ch != LF); - - parser->nread = 0; - - if (parser->content_length == 0) { - parser->flags |= F_TRAILING; - parser->state = s_header_field_start; - } else { - parser->state = s_chunk_data; - } - break; - } - - case s_chunk_data: - { - uint64_t to_read = MIN(parser->content_length, - (uint64_t) ((data + len) - p)); - - assert(parser->flags & F_CHUNKED); - assert(parser->content_length != 0 - && parser->content_length != ULLONG_MAX); - - /* See the explanation in s_body_identity for why the content - * length and data pointers are managed this way. - */ - MARK(body); - parser->content_length -= to_read; - p += to_read - 1; - - if (parser->content_length == 0) { - parser->state = s_chunk_data_almost_done; - } - - break; - } - - case s_chunk_data_almost_done: - assert(parser->flags & F_CHUNKED); - assert(parser->content_length == 0); - STRICT_CHECK(ch != CR); - parser->state = s_chunk_data_done; - CALLBACK_DATA(body); - break; - - case s_chunk_data_done: - assert(parser->flags & F_CHUNKED); - STRICT_CHECK(ch != LF); - parser->nread = 0; - parser->state = s_chunk_size_start; - break; - - default: - assert(0 && "unhandled state"); - SET_ERRNO(HPE_INVALID_INTERNAL_STATE); - goto error; - } - } - - /* Run callbacks for any marks that we have leftover after we ran our of - * bytes. There should be at most one of these set, so it's OK to invoke - * them in series (unset marks will not result in callbacks). - * - * We use the NOADVANCE() variety of callbacks here because 'p' has already - * overflowed 'data' and this allows us to correct for the off-by-one that - * we'd otherwise have (since CALLBACK_DATA() is meant to be run with a 'p' - * value that's in-bounds). - */ - - assert(((header_field_mark ? 1 : 0) + - (header_value_mark ? 1 : 0) + - (url_mark ? 1 : 0) + - (body_mark ? 1 : 0)) <= 1); - - CALLBACK_DATA_NOADVANCE(header_field); - CALLBACK_DATA_NOADVANCE(header_value); - CALLBACK_DATA_NOADVANCE(url); - CALLBACK_DATA_NOADVANCE(body); - - return len; - -error: - if (HTTP_PARSER_ERRNO(parser) == HPE_OK) { - SET_ERRNO(HPE_UNKNOWN); - } - - return (p - data); -} - - -/* Does the parser need to see an EOF to find the end of the message? */ -int -http_message_needs_eof (const http_parser *parser) -{ - if (parser->type == HTTP_REQUEST) { - return 0; - } - - /* See RFC 2616 section 4.4 */ - if (parser->status_code / 100 == 1 || /* 1xx e.g. Continue */ - parser->status_code == 204 || /* No Content */ - parser->status_code == 304 || /* Not Modified */ - parser->flags & F_SKIPBODY) { /* response to a HEAD request */ - return 0; - } - - if ((parser->flags & F_CHUNKED) || parser->content_length != ULLONG_MAX) { - return 0; - } - - return 1; -} - - -int -http_should_keep_alive (const http_parser *parser) -{ - if (parser->http_major > 0 && parser->http_minor > 0) { - /* HTTP/1.1 */ - if (parser->flags & F_CONNECTION_CLOSE) { - return 0; - } - } else { - /* HTTP/1.0 or earlier */ - if (!(parser->flags & F_CONNECTION_KEEP_ALIVE)) { - return 0; - } - } - - return !http_message_needs_eof(parser); -} - - -const char * -http_method_str (enum http_method m) -{ - return ELEM_AT(method_strings, m, ""); -} - - -void -http_parser_init (http_parser *parser, enum http_parser_type t) -{ - void *data = parser->data; /* preserve application data */ - memset(parser, 0, sizeof(*parser)); - parser->data = data; - parser->type = t; - parser->state = (t == HTTP_REQUEST ? s_start_req : (t == HTTP_RESPONSE ? s_start_res : s_start_req_or_res)); - parser->http_errno = HPE_OK; -} - -const char * -http_errno_name(enum http_errno err) { - assert(err < (sizeof(http_strerror_tab)/sizeof(http_strerror_tab[0]))); - return http_strerror_tab[err].name; -} - -const char * -http_errno_description(enum http_errno err) { - assert(err < (sizeof(http_strerror_tab)/sizeof(http_strerror_tab[0]))); - return http_strerror_tab[err].description; -} - -static enum http_host_state -http_parse_host_char(enum http_host_state s, const char ch) { - switch(s) { - case s_http_userinfo: - case s_http_userinfo_start: - if (ch == '@') { - return s_http_host_start; - } - - if (IS_USERINFO_CHAR(ch)) { - return s_http_userinfo; - } - break; - - case s_http_host_start: - if (ch == '[') { - return s_http_host_v6_start; - } - - if (IS_HOST_CHAR(ch)) { - return s_http_host; - } - - break; - - case s_http_host: - if (IS_HOST_CHAR(ch)) { - return s_http_host; - } - - /* FALLTHROUGH */ - case s_http_host_v6_end: - if (ch == ':') { - return s_http_host_port_start; - } - - break; - - case s_http_host_v6: - if (ch == ']') { - return s_http_host_v6_end; - } - - /* FALLTHROUGH */ - case s_http_host_v6_start: - if (IS_HEX(ch) || ch == ':') { - return s_http_host_v6; - } - - break; - - case s_http_host_port: - case s_http_host_port_start: - if (IS_NUM(ch)) { - return s_http_host_port; - } - - break; - - default: - break; - } - return s_http_host_dead; -} - -static int -http_parse_host(const char * buf, struct http_parser_url *u, int found_at) { - enum http_host_state s; - - const char *p; - size_t buflen = u->field_data[UF_HOST].off + u->field_data[UF_HOST].len; - - u->field_data[UF_HOST].len = 0; - - s = found_at ? s_http_userinfo_start : s_http_host_start; - - for (p = buf + u->field_data[UF_HOST].off; p < buf + buflen; p++) { - enum http_host_state new_s = http_parse_host_char(s, *p); - - if (new_s == s_http_host_dead) { - return 1; - } - - switch(new_s) { - case s_http_host: - if (s != s_http_host) { - u->field_data[UF_HOST].off = p - buf; - } - u->field_data[UF_HOST].len++; - break; - - case s_http_host_v6: - if (s != s_http_host_v6) { - u->field_data[UF_HOST].off = p - buf; - } - u->field_data[UF_HOST].len++; - break; - - case s_http_host_port: - if (s != s_http_host_port) { - u->field_data[UF_PORT].off = p - buf; - u->field_data[UF_PORT].len = 0; - u->field_set |= (1 << UF_PORT); - } - u->field_data[UF_PORT].len++; - break; - - case s_http_userinfo: - if (s != s_http_userinfo) { - u->field_data[UF_USERINFO].off = p - buf ; - u->field_data[UF_USERINFO].len = 0; - u->field_set |= (1 << UF_USERINFO); - } - u->field_data[UF_USERINFO].len++; - break; - - default: - break; - } - s = new_s; - } - - /* Make sure we don't end somewhere unexpected */ - switch (s) { - case s_http_host_start: - case s_http_host_v6_start: - case s_http_host_v6: - case s_http_host_port_start: - case s_http_userinfo: - case s_http_userinfo_start: - return 1; - default: - break; - } - - return 0; -} - -int -http_parser_parse_url(const char *buf, size_t buflen, int is_connect, - struct http_parser_url *u) -{ - enum state s; - const char *p; - enum http_parser_url_fields uf, old_uf; - int found_at = 0; - - u->port = u->field_set = 0; - s = is_connect ? s_req_server_start : s_req_spaces_before_url; - uf = old_uf = UF_MAX; - - for (p = buf; p < buf + buflen; p++) { - s = parse_url_char(s, *p); - - /* Figure out the next field that we're operating on */ - switch (s) { - case s_dead: - return 1; - - /* Skip delimeters */ - case s_req_schema_slash: - case s_req_schema_slash_slash: - case s_req_server_start: - case s_req_query_string_start: - case s_req_fragment_start: - continue; - - case s_req_schema: - uf = UF_SCHEMA; - break; - - case s_req_server_with_at: - found_at = 1; - - /* FALLTROUGH */ - case s_req_server: - uf = UF_HOST; - break; - - case s_req_path: - uf = UF_PATH; - break; - - case s_req_query_string: - uf = UF_QUERY; - break; - - case s_req_fragment: - uf = UF_FRAGMENT; - break; - - default: - assert(!"Unexpected state"); - return 1; - } - - /* Nothing's changed; soldier on */ - if (uf == old_uf) { - u->field_data[uf].len++; - continue; - } - - u->field_data[uf].off = p - buf; - u->field_data[uf].len = 1; - - u->field_set |= (1 << uf); - old_uf = uf; - } - - /* host must be present if there is a schema */ - /* parsing http:///toto will fail */ - if ((u->field_set & ((1 << UF_SCHEMA) | (1 << UF_HOST))) != 0) { - if (http_parse_host(buf, u, found_at) != 0) { - return 1; - } - } - - /* CONNECT requests can only contain "hostname:port" */ - if (is_connect && u->field_set != ((1 << UF_HOST)|(1 << UF_PORT))) { - return 1; - } - - if (u->field_set & (1 << UF_PORT)) { - /* Don't bother with endp; we've already validated the string */ - unsigned long v = strtoul(buf + u->field_data[UF_PORT].off, NULL, 10); - - /* Ports have a max value of 2^16 */ - if (v > 0xffff) { - return 1; - } - - u->port = (uint16_t) v; - } - - return 0; -} - -void -http_parser_pause(http_parser *parser, int paused) { - /* Users should only be pausing/unpausing a parser that is not in an error - * state. In non-debug builds, there's not much that we can do about this - * other than ignore it. - */ - if (HTTP_PARSER_ERRNO(parser) == HPE_OK || - HTTP_PARSER_ERRNO(parser) == HPE_PAUSED) { - SET_ERRNO((paused) ? HPE_PAUSED : HPE_OK); - } else { - assert(0 && "Attempting to pause parser in error state"); - } -} - -int -http_body_is_final(const struct http_parser *parser) { - return parser->state == s_message_done; -} diff --git a/vendor/libgit2/deps/http-parser/http_parser.h b/vendor/libgit2/deps/http-parser/http_parser.h deleted file mode 100644 index 67e1d95dd6..0000000000 --- a/vendor/libgit2/deps/http-parser/http_parser.h +++ /dev/null @@ -1,305 +0,0 @@ -/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to - * deal in the Software without restriction, including without limitation the - * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - * sell copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS - * IN THE SOFTWARE. - */ -#ifndef http_parser_h -#define http_parser_h -#ifdef __cplusplus -extern "C" { -#endif - -#define HTTP_PARSER_VERSION_MAJOR 2 -#define HTTP_PARSER_VERSION_MINOR 0 - -#include -#if defined(_WIN32) && !defined(__MINGW32__) && (!defined(_MSC_VER) || _MSC_VER<1600) -#include -typedef __int8 int8_t; -typedef unsigned __int8 uint8_t; -typedef __int16 int16_t; -typedef unsigned __int16 uint16_t; -typedef __int32 int32_t; -typedef unsigned __int32 uint32_t; -typedef __int64 int64_t; -typedef unsigned __int64 uint64_t; -typedef SIZE_T size_t; -typedef SSIZE_T ssize_t; -#elif defined(__sun) || defined(__sun__) -#include -#else -#include -#endif - -/* Compile with -DHTTP_PARSER_STRICT=0 to make less checks, but run - * faster - */ -#ifndef HTTP_PARSER_STRICT -# define HTTP_PARSER_STRICT 1 -#endif - -/* Maximium header size allowed */ -#define HTTP_MAX_HEADER_SIZE (80*1024) - - -typedef struct http_parser http_parser; -typedef struct http_parser_settings http_parser_settings; - - -/* Callbacks should return non-zero to indicate an error. The parser will - * then halt execution. - * - * The one exception is on_headers_complete. In a HTTP_RESPONSE parser - * returning '1' from on_headers_complete will tell the parser that it - * should not expect a body. This is used when receiving a response to a - * HEAD request which may contain 'Content-Length' or 'Transfer-Encoding: - * chunked' headers that indicate the presence of a body. - * - * http_data_cb does not return data chunks. It will be call arbitrarally - * many times for each string. E.G. you might get 10 callbacks for "on_url" - * each providing just a few characters more data. - */ -typedef int (*http_data_cb) (http_parser*, const char *at, size_t length); -typedef int (*http_cb) (http_parser*); - - -/* Request Methods */ -#define HTTP_METHOD_MAP(XX) \ - XX(0, DELETE, DELETE) \ - XX(1, GET, GET) \ - XX(2, HEAD, HEAD) \ - XX(3, POST, POST) \ - XX(4, PUT, PUT) \ - /* pathological */ \ - XX(5, CONNECT, CONNECT) \ - XX(6, OPTIONS, OPTIONS) \ - XX(7, TRACE, TRACE) \ - /* webdav */ \ - XX(8, COPY, COPY) \ - XX(9, LOCK, LOCK) \ - XX(10, MKCOL, MKCOL) \ - XX(11, MOVE, MOVE) \ - XX(12, PROPFIND, PROPFIND) \ - XX(13, PROPPATCH, PROPPATCH) \ - XX(14, SEARCH, SEARCH) \ - XX(15, UNLOCK, UNLOCK) \ - /* subversion */ \ - XX(16, REPORT, REPORT) \ - XX(17, MKACTIVITY, MKACTIVITY) \ - XX(18, CHECKOUT, CHECKOUT) \ - XX(19, MERGE, MERGE) \ - /* upnp */ \ - XX(20, MSEARCH, M-SEARCH) \ - XX(21, NOTIFY, NOTIFY) \ - XX(22, SUBSCRIBE, SUBSCRIBE) \ - XX(23, UNSUBSCRIBE, UNSUBSCRIBE) \ - /* RFC-5789 */ \ - XX(24, PATCH, PATCH) \ - XX(25, PURGE, PURGE) \ - -enum http_method - { -#define XX(num, name, string) HTTP_##name = num, - HTTP_METHOD_MAP(XX) -#undef XX - }; - - -enum http_parser_type { HTTP_REQUEST, HTTP_RESPONSE, HTTP_BOTH }; - - -/* Flag values for http_parser.flags field */ -enum flags - { F_CHUNKED = 1 << 0 - , F_CONNECTION_KEEP_ALIVE = 1 << 1 - , F_CONNECTION_CLOSE = 1 << 2 - , F_TRAILING = 1 << 3 - , F_UPGRADE = 1 << 4 - , F_SKIPBODY = 1 << 5 - }; - - -/* Map for errno-related constants - * - * The provided argument should be a macro that takes 2 arguments. - */ -#define HTTP_ERRNO_MAP(XX) \ - /* No error */ \ - XX(OK, "success") \ - \ - /* Callback-related errors */ \ - XX(CB_message_begin, "the on_message_begin callback failed") \ - XX(CB_url, "the on_url callback failed") \ - XX(CB_header_field, "the on_header_field callback failed") \ - XX(CB_header_value, "the on_header_value callback failed") \ - XX(CB_headers_complete, "the on_headers_complete callback failed") \ - XX(CB_body, "the on_body callback failed") \ - XX(CB_message_complete, "the on_message_complete callback failed") \ - \ - /* Parsing-related errors */ \ - XX(INVALID_EOF_STATE, "stream ended at an unexpected time") \ - XX(HEADER_OVERFLOW, \ - "too many header bytes seen; overflow detected") \ - XX(CLOSED_CONNECTION, \ - "data received after completed connection: close message") \ - XX(INVALID_VERSION, "invalid HTTP version") \ - XX(INVALID_STATUS, "invalid HTTP status code") \ - XX(INVALID_METHOD, "invalid HTTP method") \ - XX(INVALID_URL, "invalid URL") \ - XX(INVALID_HOST, "invalid host") \ - XX(INVALID_PORT, "invalid port") \ - XX(INVALID_PATH, "invalid path") \ - XX(INVALID_QUERY_STRING, "invalid query string") \ - XX(INVALID_FRAGMENT, "invalid fragment") \ - XX(LF_EXPECTED, "LF character expected") \ - XX(INVALID_HEADER_TOKEN, "invalid character in header") \ - XX(INVALID_CONTENT_LENGTH, \ - "invalid character in content-length header") \ - XX(INVALID_CHUNK_SIZE, \ - "invalid character in chunk size header") \ - XX(INVALID_CONSTANT, "invalid constant string") \ - XX(INVALID_INTERNAL_STATE, "encountered unexpected internal state")\ - XX(STRICT, "strict mode assertion failed") \ - XX(PAUSED, "parser is paused") \ - XX(UNKNOWN, "an unknown error occurred") - - -/* Define HPE_* values for each errno value above */ -#define HTTP_ERRNO_GEN(n, s) HPE_##n, -enum http_errno { - HTTP_ERRNO_MAP(HTTP_ERRNO_GEN) -}; -#undef HTTP_ERRNO_GEN - - -/* Get an http_errno value from an http_parser */ -#define HTTP_PARSER_ERRNO(p) ((enum http_errno) (p)->http_errno) - - -struct http_parser { - /** PRIVATE **/ - unsigned char type : 2; /* enum http_parser_type */ - unsigned char flags : 6; /* F_* values from 'flags' enum; semi-public */ - unsigned char state; /* enum state from http_parser.c */ - unsigned char header_state; /* enum header_state from http_parser.c */ - unsigned char index; /* index into current matcher */ - - uint32_t nread; /* # bytes read in various scenarios */ - uint64_t content_length; /* # bytes in body (0 if no Content-Length header) */ - - /** READ-ONLY **/ - unsigned short http_major; - unsigned short http_minor; - unsigned short status_code; /* responses only */ - unsigned char method; /* requests only */ - unsigned char http_errno : 7; - - /* 1 = Upgrade header was present and the parser has exited because of that. - * 0 = No upgrade header present. - * Should be checked when http_parser_execute() returns in addition to - * error checking. - */ - unsigned char upgrade : 1; - - /** PUBLIC **/ - void *data; /* A pointer to get hook to the "connection" or "socket" object */ -}; - - -struct http_parser_settings { - http_cb on_message_begin; - http_data_cb on_url; - http_data_cb on_header_field; - http_data_cb on_header_value; - http_cb on_headers_complete; - http_data_cb on_body; - http_cb on_message_complete; -}; - - -enum http_parser_url_fields - { UF_SCHEMA = 0 - , UF_HOST = 1 - , UF_PORT = 2 - , UF_PATH = 3 - , UF_QUERY = 4 - , UF_FRAGMENT = 5 - , UF_USERINFO = 6 - , UF_MAX = 7 - }; - - -/* Result structure for http_parser_parse_url(). - * - * Callers should index into field_data[] with UF_* values iff field_set - * has the relevant (1 << UF_*) bit set. As a courtesy to clients (and - * because we probably have padding left over), we convert any port to - * a uint16_t. - */ -struct http_parser_url { - uint16_t field_set; /* Bitmask of (1 << UF_*) values */ - uint16_t port; /* Converted UF_PORT string */ - - struct { - uint16_t off; /* Offset into buffer in which field starts */ - uint16_t len; /* Length of run in buffer */ - } field_data[UF_MAX]; -}; - - -void http_parser_init(http_parser *parser, enum http_parser_type type); - - -size_t http_parser_execute(http_parser *parser, - const http_parser_settings *settings, - const char *data, - size_t len); - - -/* If http_should_keep_alive() in the on_headers_complete or - * on_message_complete callback returns 0, then this should be - * the last message on the connection. - * If you are the server, respond with the "Connection: close" header. - * If you are the client, close the connection. - */ -int http_should_keep_alive(const http_parser *parser); - -/* Returns a string version of the HTTP method. */ -const char *http_method_str(enum http_method m); - -/* Return a string name of the given error */ -const char *http_errno_name(enum http_errno err); - -/* Return a string description of the given error */ -const char *http_errno_description(enum http_errno err); - -/* Parse a URL; return nonzero on failure */ -int http_parser_parse_url(const char *buf, size_t buflen, - int is_connect, - struct http_parser_url *u); - -/* Pause or un-pause the parser; a nonzero value pauses */ -void http_parser_pause(http_parser *parser, int paused); - -/* Checks if this is the final chunk of the body. */ -int http_body_is_final(const http_parser *parser); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/vendor/libgit2/deps/regex/config.h b/vendor/libgit2/deps/regex/config.h deleted file mode 100644 index 95370690e0..0000000000 --- a/vendor/libgit2/deps/regex/config.h +++ /dev/null @@ -1,7 +0,0 @@ -#ifndef _REGEX_CONFIG_H_ -#define _REGEX_CONFIG_H_ - -# define GAWK -# define NO_MBSUPPORT - -#endif diff --git a/vendor/libgit2/deps/regex/regcomp.c b/vendor/libgit2/deps/regex/regcomp.c deleted file mode 100644 index 43bffbc21f..0000000000 --- a/vendor/libgit2/deps/regex/regcomp.c +++ /dev/null @@ -1,3857 +0,0 @@ -/* Extended regular expression matching and search library. - Copyright (C) 2002-2007,2009,2010 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Isamu Hasegawa . - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, write to the Free - Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - 02110-1301 USA. */ - -static reg_errcode_t re_compile_internal (regex_t *preg, const char * pattern, - size_t length, reg_syntax_t syntax); -static void re_compile_fastmap_iter (regex_t *bufp, - const re_dfastate_t *init_state, - char *fastmap); -static reg_errcode_t init_dfa (re_dfa_t *dfa, size_t pat_len); -#ifdef RE_ENABLE_I18N -static void free_charset (re_charset_t *cset); -#endif /* RE_ENABLE_I18N */ -static void free_workarea_compile (regex_t *preg); -static reg_errcode_t create_initial_state (re_dfa_t *dfa); -#ifdef RE_ENABLE_I18N -static void optimize_utf8 (re_dfa_t *dfa); -#endif -static reg_errcode_t analyze (regex_t *preg); -static reg_errcode_t preorder (bin_tree_t *root, - reg_errcode_t (fn (void *, bin_tree_t *)), - void *extra); -static reg_errcode_t postorder (bin_tree_t *root, - reg_errcode_t (fn (void *, bin_tree_t *)), - void *extra); -static reg_errcode_t optimize_subexps (void *extra, bin_tree_t *node); -static reg_errcode_t lower_subexps (void *extra, bin_tree_t *node); -static bin_tree_t *lower_subexp (reg_errcode_t *err, regex_t *preg, - bin_tree_t *node); -static reg_errcode_t calc_first (void *extra, bin_tree_t *node); -static reg_errcode_t calc_next (void *extra, bin_tree_t *node); -static reg_errcode_t link_nfa_nodes (void *extra, bin_tree_t *node); -static int duplicate_node (re_dfa_t *dfa, int org_idx, unsigned int constraint); -static int search_duplicated_node (const re_dfa_t *dfa, int org_node, - unsigned int constraint); -static reg_errcode_t calc_eclosure (re_dfa_t *dfa); -static reg_errcode_t calc_eclosure_iter (re_node_set *new_set, re_dfa_t *dfa, - int node, int root); -static reg_errcode_t calc_inveclosure (re_dfa_t *dfa); -static int fetch_number (re_string_t *input, re_token_t *token, - reg_syntax_t syntax); -static int peek_token (re_token_t *token, re_string_t *input, - reg_syntax_t syntax) internal_function; -static bin_tree_t *parse (re_string_t *regexp, regex_t *preg, - reg_syntax_t syntax, reg_errcode_t *err); -static bin_tree_t *parse_reg_exp (re_string_t *regexp, regex_t *preg, - re_token_t *token, reg_syntax_t syntax, - int nest, reg_errcode_t *err); -static bin_tree_t *parse_branch (re_string_t *regexp, regex_t *preg, - re_token_t *token, reg_syntax_t syntax, - int nest, reg_errcode_t *err); -static bin_tree_t *parse_expression (re_string_t *regexp, regex_t *preg, - re_token_t *token, reg_syntax_t syntax, - int nest, reg_errcode_t *err); -static bin_tree_t *parse_sub_exp (re_string_t *regexp, regex_t *preg, - re_token_t *token, reg_syntax_t syntax, - int nest, reg_errcode_t *err); -static bin_tree_t *parse_dup_op (bin_tree_t *dup_elem, re_string_t *regexp, - re_dfa_t *dfa, re_token_t *token, - reg_syntax_t syntax, reg_errcode_t *err); -static bin_tree_t *parse_bracket_exp (re_string_t *regexp, re_dfa_t *dfa, - re_token_t *token, reg_syntax_t syntax, - reg_errcode_t *err); -static reg_errcode_t parse_bracket_element (bracket_elem_t *elem, - re_string_t *regexp, - re_token_t *token, int token_len, - re_dfa_t *dfa, - reg_syntax_t syntax, - int accept_hyphen); -static reg_errcode_t parse_bracket_symbol (bracket_elem_t *elem, - re_string_t *regexp, - re_token_t *token); -#ifdef RE_ENABLE_I18N -static reg_errcode_t build_equiv_class (bitset_t sbcset, - re_charset_t *mbcset, - int *equiv_class_alloc, - const unsigned char *name); -static reg_errcode_t build_charclass (RE_TRANSLATE_TYPE trans, - bitset_t sbcset, - re_charset_t *mbcset, - int *char_class_alloc, - const char *class_name, - reg_syntax_t syntax); -#else /* not RE_ENABLE_I18N */ -static reg_errcode_t build_equiv_class (bitset_t sbcset, - const unsigned char *name); -static reg_errcode_t build_charclass (RE_TRANSLATE_TYPE trans, - bitset_t sbcset, - const char *class_name, - reg_syntax_t syntax); -#endif /* not RE_ENABLE_I18N */ -static bin_tree_t *build_charclass_op (re_dfa_t *dfa, - RE_TRANSLATE_TYPE trans, - const char *class_name, - const char *extra, - int non_match, reg_errcode_t *err); -static bin_tree_t *create_tree (re_dfa_t *dfa, - bin_tree_t *left, bin_tree_t *right, - re_token_type_t type); -static bin_tree_t *create_token_tree (re_dfa_t *dfa, - bin_tree_t *left, bin_tree_t *right, - const re_token_t *token); -static bin_tree_t *duplicate_tree (const bin_tree_t *src, re_dfa_t *dfa); -static void free_token (re_token_t *node); -static reg_errcode_t free_tree (void *extra, bin_tree_t *node); -static reg_errcode_t mark_opt_subexp (void *extra, bin_tree_t *node); - -/* This table gives an error message for each of the error codes listed - in regex.h. Obviously the order here has to be same as there. - POSIX doesn't require that we do anything for REG_NOERROR, - but why not be nice? */ - -const char __re_error_msgid[] attribute_hidden = - { -#define REG_NOERROR_IDX 0 - gettext_noop ("Success") /* REG_NOERROR */ - "\0" -#define REG_NOMATCH_IDX (REG_NOERROR_IDX + sizeof "Success") - gettext_noop ("No match") /* REG_NOMATCH */ - "\0" -#define REG_BADPAT_IDX (REG_NOMATCH_IDX + sizeof "No match") - gettext_noop ("Invalid regular expression") /* REG_BADPAT */ - "\0" -#define REG_ECOLLATE_IDX (REG_BADPAT_IDX + sizeof "Invalid regular expression") - gettext_noop ("Invalid collation character") /* REG_ECOLLATE */ - "\0" -#define REG_ECTYPE_IDX (REG_ECOLLATE_IDX + sizeof "Invalid collation character") - gettext_noop ("Invalid character class name") /* REG_ECTYPE */ - "\0" -#define REG_EESCAPE_IDX (REG_ECTYPE_IDX + sizeof "Invalid character class name") - gettext_noop ("Trailing backslash") /* REG_EESCAPE */ - "\0" -#define REG_ESUBREG_IDX (REG_EESCAPE_IDX + sizeof "Trailing backslash") - gettext_noop ("Invalid back reference") /* REG_ESUBREG */ - "\0" -#define REG_EBRACK_IDX (REG_ESUBREG_IDX + sizeof "Invalid back reference") - gettext_noop ("Unmatched [ or [^") /* REG_EBRACK */ - "\0" -#define REG_EPAREN_IDX (REG_EBRACK_IDX + sizeof "Unmatched [ or [^") - gettext_noop ("Unmatched ( or \\(") /* REG_EPAREN */ - "\0" -#define REG_EBRACE_IDX (REG_EPAREN_IDX + sizeof "Unmatched ( or \\(") - gettext_noop ("Unmatched \\{") /* REG_EBRACE */ - "\0" -#define REG_BADBR_IDX (REG_EBRACE_IDX + sizeof "Unmatched \\{") - gettext_noop ("Invalid content of \\{\\}") /* REG_BADBR */ - "\0" -#define REG_ERANGE_IDX (REG_BADBR_IDX + sizeof "Invalid content of \\{\\}") - gettext_noop ("Invalid range end") /* REG_ERANGE */ - "\0" -#define REG_ESPACE_IDX (REG_ERANGE_IDX + sizeof "Invalid range end") - gettext_noop ("Memory exhausted") /* REG_ESPACE */ - "\0" -#define REG_BADRPT_IDX (REG_ESPACE_IDX + sizeof "Memory exhausted") - gettext_noop ("Invalid preceding regular expression") /* REG_BADRPT */ - "\0" -#define REG_EEND_IDX (REG_BADRPT_IDX + sizeof "Invalid preceding regular expression") - gettext_noop ("Premature end of regular expression") /* REG_EEND */ - "\0" -#define REG_ESIZE_IDX (REG_EEND_IDX + sizeof "Premature end of regular expression") - gettext_noop ("Regular expression too big") /* REG_ESIZE */ - "\0" -#define REG_ERPAREN_IDX (REG_ESIZE_IDX + sizeof "Regular expression too big") - gettext_noop ("Unmatched ) or \\)") /* REG_ERPAREN */ - }; - -const size_t __re_error_msgid_idx[] attribute_hidden = - { - REG_NOERROR_IDX, - REG_NOMATCH_IDX, - REG_BADPAT_IDX, - REG_ECOLLATE_IDX, - REG_ECTYPE_IDX, - REG_EESCAPE_IDX, - REG_ESUBREG_IDX, - REG_EBRACK_IDX, - REG_EPAREN_IDX, - REG_EBRACE_IDX, - REG_BADBR_IDX, - REG_ERANGE_IDX, - REG_ESPACE_IDX, - REG_BADRPT_IDX, - REG_EEND_IDX, - REG_ESIZE_IDX, - REG_ERPAREN_IDX - }; - -/* Entry points for GNU code. */ - - -#ifdef ZOS_USS - -/* For ZOS USS we must define btowc */ - -wchar_t -btowc (int c) -{ - wchar_t wtmp[2]; - char tmp[2]; - - tmp[0] = c; - tmp[1] = 0; - - mbtowc (wtmp, tmp, 1); - return wtmp[0]; -} -#endif - -/* re_compile_pattern is the GNU regular expression compiler: it - compiles PATTERN (of length LENGTH) and puts the result in BUFP. - Returns 0 if the pattern was valid, otherwise an error string. - - Assumes the `allocated' (and perhaps `buffer') and `translate' fields - are set in BUFP on entry. */ - -const char * -re_compile_pattern (const char *pattern, - size_t length, - struct re_pattern_buffer *bufp) -{ - reg_errcode_t ret; - - /* And GNU code determines whether or not to get register information - by passing null for the REGS argument to re_match, etc., not by - setting no_sub, unless RE_NO_SUB is set. */ - bufp->no_sub = !!(re_syntax_options & RE_NO_SUB); - - /* Match anchors at newline. */ - bufp->newline_anchor = 1; - - ret = re_compile_internal (bufp, pattern, length, re_syntax_options); - - if (!ret) - return NULL; - return gettext (__re_error_msgid + __re_error_msgid_idx[(int) ret]); -} -#ifdef _LIBC -weak_alias (__re_compile_pattern, re_compile_pattern) -#endif - -/* Set by `re_set_syntax' to the current regexp syntax to recognize. Can - also be assigned to arbitrarily: each pattern buffer stores its own - syntax, so it can be changed between regex compilations. */ -/* This has no initializer because initialized variables in Emacs - become read-only after dumping. */ -reg_syntax_t re_syntax_options; - - -/* Specify the precise syntax of regexps for compilation. This provides - for compatibility for various utilities which historically have - different, incompatible syntaxes. - - The argument SYNTAX is a bit mask comprised of the various bits - defined in regex.h. We return the old syntax. */ - -reg_syntax_t -re_set_syntax (reg_syntax_t syntax) -{ - reg_syntax_t ret = re_syntax_options; - - re_syntax_options = syntax; - return ret; -} -#ifdef _LIBC -weak_alias (__re_set_syntax, re_set_syntax) -#endif - -int -re_compile_fastmap (struct re_pattern_buffer *bufp) -{ - re_dfa_t *dfa = (re_dfa_t *) bufp->buffer; - char *fastmap = bufp->fastmap; - - memset (fastmap, '\0', sizeof (char) * SBC_MAX); - re_compile_fastmap_iter (bufp, dfa->init_state, fastmap); - if (dfa->init_state != dfa->init_state_word) - re_compile_fastmap_iter (bufp, dfa->init_state_word, fastmap); - if (dfa->init_state != dfa->init_state_nl) - re_compile_fastmap_iter (bufp, dfa->init_state_nl, fastmap); - if (dfa->init_state != dfa->init_state_begbuf) - re_compile_fastmap_iter (bufp, dfa->init_state_begbuf, fastmap); - bufp->fastmap_accurate = 1; - return 0; -} -#ifdef _LIBC -weak_alias (__re_compile_fastmap, re_compile_fastmap) -#endif - -static inline void -__attribute ((always_inline)) -re_set_fastmap (char *fastmap, int icase, int ch) -{ - fastmap[ch] = 1; - if (icase) - fastmap[tolower (ch)] = 1; -} - -/* Helper function for re_compile_fastmap. - Compile fastmap for the initial_state INIT_STATE. */ - -static void -re_compile_fastmap_iter (regex_t *bufp, const re_dfastate_t *init_state, - char *fastmap) -{ - volatile re_dfa_t *dfa = (re_dfa_t *) bufp->buffer; - int node_cnt; - int icase = (dfa->mb_cur_max == 1 && (bufp->syntax & RE_ICASE)); - for (node_cnt = 0; node_cnt < init_state->nodes.nelem; ++node_cnt) - { - int node = init_state->nodes.elems[node_cnt]; - re_token_type_t type = dfa->nodes[node].type; - - if (type == CHARACTER) - { - re_set_fastmap (fastmap, icase, dfa->nodes[node].opr.c); -#ifdef RE_ENABLE_I18N - if ((bufp->syntax & RE_ICASE) && dfa->mb_cur_max > 1) - { - unsigned char *buf = re_malloc (unsigned char, dfa->mb_cur_max), *p; - wchar_t wc; - mbstate_t state; - - p = buf; - *p++ = dfa->nodes[node].opr.c; - while (++node < dfa->nodes_len - && dfa->nodes[node].type == CHARACTER - && dfa->nodes[node].mb_partial) - *p++ = dfa->nodes[node].opr.c; - memset (&state, '\0', sizeof (state)); - if (__mbrtowc (&wc, (const char *) buf, p - buf, - &state) == p - buf - && (__wcrtomb ((char *) buf, towlower (wc), &state) - != (size_t) -1)) - re_set_fastmap (fastmap, 0, buf[0]); - re_free (buf); - } -#endif - } - else if (type == SIMPLE_BRACKET) - { - int i, ch; - for (i = 0, ch = 0; i < BITSET_WORDS; ++i) - { - int j; - bitset_word_t w = dfa->nodes[node].opr.sbcset[i]; - for (j = 0; j < BITSET_WORD_BITS; ++j, ++ch) - if (w & ((bitset_word_t) 1 << j)) - re_set_fastmap (fastmap, icase, ch); - } - } -#ifdef RE_ENABLE_I18N - else if (type == COMPLEX_BRACKET) - { - re_charset_t *cset = dfa->nodes[node].opr.mbcset; - int i; - -# ifdef _LIBC - /* See if we have to try all bytes which start multiple collation - elements. - e.g. In da_DK, we want to catch 'a' since "aa" is a valid - collation element, and don't catch 'b' since 'b' is - the only collation element which starts from 'b' (and - it is caught by SIMPLE_BRACKET). */ - if (_NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES) != 0 - && (cset->ncoll_syms || cset->nranges)) - { - const int32_t *table = (const int32_t *) - _NL_CURRENT (LC_COLLATE, _NL_COLLATE_TABLEMB); - for (i = 0; i < SBC_MAX; ++i) - if (table[i] < 0) - re_set_fastmap (fastmap, icase, i); - } -# endif /* _LIBC */ - - /* See if we have to start the match at all multibyte characters, - i.e. where we would not find an invalid sequence. This only - applies to multibyte character sets; for single byte character - sets, the SIMPLE_BRACKET again suffices. */ - if (dfa->mb_cur_max > 1 - && (cset->nchar_classes || cset->non_match || cset->nranges -# ifdef _LIBC - || cset->nequiv_classes -# endif /* _LIBC */ - )) - { - unsigned char c = 0; - do - { - mbstate_t mbs; - memset (&mbs, 0, sizeof (mbs)); - if (__mbrtowc (NULL, (char *) &c, 1, &mbs) == (size_t) -2) - re_set_fastmap (fastmap, false, (int) c); - } - while (++c != 0); - } - - else - { - /* ... Else catch all bytes which can start the mbchars. */ - for (i = 0; i < cset->nmbchars; ++i) - { - char buf[256]; - mbstate_t state; - memset (&state, '\0', sizeof (state)); - if (__wcrtomb (buf, cset->mbchars[i], &state) != (size_t) -1) - re_set_fastmap (fastmap, icase, *(unsigned char *) buf); - if ((bufp->syntax & RE_ICASE) && dfa->mb_cur_max > 1) - { - if (__wcrtomb (buf, towlower (cset->mbchars[i]), &state) - != (size_t) -1) - re_set_fastmap (fastmap, false, *(unsigned char *) buf); - } - } - } - } -#endif /* RE_ENABLE_I18N */ - else if (type == OP_PERIOD -#ifdef RE_ENABLE_I18N - || type == OP_UTF8_PERIOD -#endif /* RE_ENABLE_I18N */ - || type == END_OF_RE) - { - memset (fastmap, '\1', sizeof (char) * SBC_MAX); - if (type == END_OF_RE) - bufp->can_be_null = 1; - return; - } - } -} - -/* Entry point for POSIX code. */ -/* regcomp takes a regular expression as a string and compiles it. - - PREG is a regex_t *. We do not expect any fields to be initialized, - since POSIX says we shouldn't. Thus, we set - - `buffer' to the compiled pattern; - `used' to the length of the compiled pattern; - `syntax' to RE_SYNTAX_POSIX_EXTENDED if the - REG_EXTENDED bit in CFLAGS is set; otherwise, to - RE_SYNTAX_POSIX_BASIC; - `newline_anchor' to REG_NEWLINE being set in CFLAGS; - `fastmap' to an allocated space for the fastmap; - `fastmap_accurate' to zero; - `re_nsub' to the number of subexpressions in PATTERN. - - PATTERN is the address of the pattern string. - - CFLAGS is a series of bits which affect compilation. - - If REG_EXTENDED is set, we use POSIX extended syntax; otherwise, we - use POSIX basic syntax. - - If REG_NEWLINE is set, then . and [^...] don't match newline. - Also, regexec will try a match beginning after every newline. - - If REG_ICASE is set, then we considers upper- and lowercase - versions of letters to be equivalent when matching. - - If REG_NOSUB is set, then when PREG is passed to regexec, that - routine will report only success or failure, and nothing about the - registers. - - It returns 0 if it succeeds, nonzero if it doesn't. (See regex.h for - the return codes and their meanings.) */ - -int -regcomp (regex_t *__restrict preg, - const char *__restrict pattern, - int cflags) -{ - reg_errcode_t ret; - reg_syntax_t syntax = ((cflags & REG_EXTENDED) ? RE_SYNTAX_POSIX_EXTENDED - : RE_SYNTAX_POSIX_BASIC); - - preg->buffer = NULL; - preg->allocated = 0; - preg->used = 0; - - /* Try to allocate space for the fastmap. */ - preg->fastmap = re_malloc (char, SBC_MAX); - if (BE (preg->fastmap == NULL, 0)) - return REG_ESPACE; - - syntax |= (cflags & REG_ICASE) ? RE_ICASE : 0; - - /* If REG_NEWLINE is set, newlines are treated differently. */ - if (cflags & REG_NEWLINE) - { /* REG_NEWLINE implies neither . nor [^...] match newline. */ - syntax &= ~RE_DOT_NEWLINE; - syntax |= RE_HAT_LISTS_NOT_NEWLINE; - /* It also changes the matching behavior. */ - preg->newline_anchor = 1; - } - else - preg->newline_anchor = 0; - preg->no_sub = !!(cflags & REG_NOSUB); - preg->translate = NULL; - - ret = re_compile_internal (preg, pattern, strlen (pattern), syntax); - - /* POSIX doesn't distinguish between an unmatched open-group and an - unmatched close-group: both are REG_EPAREN. */ - if (ret == REG_ERPAREN) - ret = REG_EPAREN; - - /* We have already checked preg->fastmap != NULL. */ - if (BE (ret == REG_NOERROR, 1)) - /* Compute the fastmap now, since regexec cannot modify the pattern - buffer. This function never fails in this implementation. */ - (void) re_compile_fastmap (preg); - else - { - /* Some error occurred while compiling the expression. */ - re_free (preg->fastmap); - preg->fastmap = NULL; - } - - return (int) ret; -} -#ifdef _LIBC -weak_alias (__regcomp, regcomp) -#endif - -/* Returns a message corresponding to an error code, ERRCODE, returned - from either regcomp or regexec. We don't use PREG here. */ - -size_t -regerror(int errcode, UNUSED const regex_t *__restrict preg, - char *__restrict errbuf, size_t errbuf_size) -{ - const char *msg; - size_t msg_size; - - if (BE (errcode < 0 - || errcode >= (int) (sizeof (__re_error_msgid_idx) - / sizeof (__re_error_msgid_idx[0])), 0)) - /* Only error codes returned by the rest of the code should be passed - to this routine. If we are given anything else, or if other regex - code generates an invalid error code, then the program has a bug. - Dump core so we can fix it. */ - abort (); - - msg = gettext (__re_error_msgid + __re_error_msgid_idx[errcode]); - - msg_size = strlen (msg) + 1; /* Includes the null. */ - - if (BE (errbuf_size != 0, 1)) - { - if (BE (msg_size > errbuf_size, 0)) - { - memcpy (errbuf, msg, errbuf_size - 1); - errbuf[errbuf_size - 1] = 0; - } - else - memcpy (errbuf, msg, msg_size); - } - - return msg_size; -} -#ifdef _LIBC -weak_alias (__regerror, regerror) -#endif - - -#ifdef RE_ENABLE_I18N -/* This static array is used for the map to single-byte characters when - UTF-8 is used. Otherwise we would allocate memory just to initialize - it the same all the time. UTF-8 is the preferred encoding so this is - a worthwhile optimization. */ -#if __GNUC__ >= 3 -static const bitset_t utf8_sb_map = { - /* Set the first 128 bits. */ - [0 ... 0x80 / BITSET_WORD_BITS - 1] = BITSET_WORD_MAX -}; -#else /* ! (__GNUC__ >= 3) */ -static bitset_t utf8_sb_map; -#endif /* __GNUC__ >= 3 */ -#endif /* RE_ENABLE_I18N */ - - -static void -free_dfa_content (re_dfa_t *dfa) -{ - unsigned int i; - int j; - - if (dfa->nodes) - for (i = 0; i < dfa->nodes_len; ++i) - free_token (dfa->nodes + i); - re_free (dfa->nexts); - for (i = 0; i < dfa->nodes_len; ++i) - { - if (dfa->eclosures != NULL) - re_node_set_free (dfa->eclosures + i); - if (dfa->inveclosures != NULL) - re_node_set_free (dfa->inveclosures + i); - if (dfa->edests != NULL) - re_node_set_free (dfa->edests + i); - } - re_free (dfa->edests); - re_free (dfa->eclosures); - re_free (dfa->inveclosures); - re_free (dfa->nodes); - - if (dfa->state_table) - for (i = 0; i <= dfa->state_hash_mask; ++i) - { - struct re_state_table_entry *entry = dfa->state_table + i; - for (j = 0; j < entry->num; ++j) - { - re_dfastate_t *state = entry->array[j]; - free_state (state); - } - re_free (entry->array); - } - re_free (dfa->state_table); -#ifdef RE_ENABLE_I18N - if (dfa->sb_char != utf8_sb_map) - re_free (dfa->sb_char); -#endif - re_free (dfa->subexp_map); -#ifdef DEBUG - re_free (dfa->re_str); -#endif - - re_free (dfa); -} - - -/* Free dynamically allocated space used by PREG. */ - -void -regfree (regex_t *preg) -{ - re_dfa_t *dfa = (re_dfa_t *) preg->buffer; - if (BE (dfa != NULL, 1)) - free_dfa_content (dfa); - preg->buffer = NULL; - preg->allocated = 0; - - re_free (preg->fastmap); - preg->fastmap = NULL; - - re_free (preg->translate); - preg->translate = NULL; -} -#ifdef _LIBC -weak_alias (__regfree, regfree) -#endif - -/* Entry points compatible with 4.2 BSD regex library. We don't define - them unless specifically requested. */ - -#if defined _REGEX_RE_COMP || defined _LIBC - -/* BSD has one and only one pattern buffer. */ -static struct re_pattern_buffer re_comp_buf; - -char * -# ifdef _LIBC -/* Make these definitions weak in libc, so POSIX programs can redefine - these names if they don't use our functions, and still use - regcomp/regexec above without link errors. */ -weak_function -# endif -re_comp (s) - const char *s; -{ - reg_errcode_t ret; - char *fastmap; - - if (!s) - { - if (!re_comp_buf.buffer) - return gettext ("No previous regular expression"); - return 0; - } - - if (re_comp_buf.buffer) - { - fastmap = re_comp_buf.fastmap; - re_comp_buf.fastmap = NULL; - __regfree (&re_comp_buf); - memset (&re_comp_buf, '\0', sizeof (re_comp_buf)); - re_comp_buf.fastmap = fastmap; - } - - if (re_comp_buf.fastmap == NULL) - { - re_comp_buf.fastmap = (char *) malloc (SBC_MAX); - if (re_comp_buf.fastmap == NULL) - return (char *) gettext (__re_error_msgid - + __re_error_msgid_idx[(int) REG_ESPACE]); - } - - /* Since `re_exec' always passes NULL for the `regs' argument, we - don't need to initialize the pattern buffer fields which affect it. */ - - /* Match anchors at newlines. */ - re_comp_buf.newline_anchor = 1; - - ret = re_compile_internal (&re_comp_buf, s, strlen (s), re_syntax_options); - - if (!ret) - return NULL; - - /* Yes, we're discarding `const' here if !HAVE_LIBINTL. */ - return (char *) gettext (__re_error_msgid + __re_error_msgid_idx[(int) ret]); -} - -#ifdef _LIBC -libc_freeres_fn (free_mem) -{ - __regfree (&re_comp_buf); -} -#endif - -#endif /* _REGEX_RE_COMP */ - -/* Internal entry point. - Compile the regular expression PATTERN, whose length is LENGTH. - SYNTAX indicate regular expression's syntax. */ - -static reg_errcode_t -re_compile_internal (regex_t *preg, const char * pattern, size_t length, - reg_syntax_t syntax) -{ - reg_errcode_t err = REG_NOERROR; - re_dfa_t *dfa; - re_string_t regexp; - - /* Initialize the pattern buffer. */ - preg->fastmap_accurate = 0; - preg->syntax = syntax; - preg->not_bol = preg->not_eol = 0; - preg->used = 0; - preg->re_nsub = 0; - preg->can_be_null = 0; - preg->regs_allocated = REGS_UNALLOCATED; - - /* Initialize the dfa. */ - dfa = (re_dfa_t *) preg->buffer; - if (BE (preg->allocated < sizeof (re_dfa_t), 0)) - { - /* If zero allocated, but buffer is non-null, try to realloc - enough space. This loses if buffer's address is bogus, but - that is the user's responsibility. If ->buffer is NULL this - is a simple allocation. */ - dfa = re_realloc (preg->buffer, re_dfa_t, 1); - if (dfa == NULL) - return REG_ESPACE; - preg->allocated = sizeof (re_dfa_t); - preg->buffer = (unsigned char *) dfa; - } - preg->used = sizeof (re_dfa_t); - - err = init_dfa (dfa, length); - if (BE (err != REG_NOERROR, 0)) - { - free_dfa_content (dfa); - preg->buffer = NULL; - preg->allocated = 0; - return err; - } -#ifdef DEBUG - /* Note: length+1 will not overflow since it is checked in init_dfa. */ - dfa->re_str = re_malloc (char, length + 1); - strncpy (dfa->re_str, pattern, length + 1); -#endif - - __libc_lock_init (dfa->lock); - - err = re_string_construct (®exp, pattern, length, preg->translate, - syntax & RE_ICASE, dfa); - if (BE (err != REG_NOERROR, 0)) - { - re_compile_internal_free_return: - free_workarea_compile (preg); - re_string_destruct (®exp); - free_dfa_content (dfa); - preg->buffer = NULL; - preg->allocated = 0; - return err; - } - - /* Parse the regular expression, and build a structure tree. */ - preg->re_nsub = 0; - dfa->str_tree = parse (®exp, preg, syntax, &err); - if (BE (dfa->str_tree == NULL, 0)) - goto re_compile_internal_free_return; - - /* Analyze the tree and create the nfa. */ - err = analyze (preg); - if (BE (err != REG_NOERROR, 0)) - goto re_compile_internal_free_return; - -#ifdef RE_ENABLE_I18N - /* If possible, do searching in single byte encoding to speed things up. */ - if (dfa->is_utf8 && !(syntax & RE_ICASE) && preg->translate == NULL) - optimize_utf8 (dfa); -#endif - - /* Then create the initial state of the dfa. */ - err = create_initial_state (dfa); - - /* Release work areas. */ - free_workarea_compile (preg); - re_string_destruct (®exp); - - if (BE (err != REG_NOERROR, 0)) - { - free_dfa_content (dfa); - preg->buffer = NULL; - preg->allocated = 0; - } - - return err; -} - -/* Initialize DFA. We use the length of the regular expression PAT_LEN - as the initial length of some arrays. */ - -static reg_errcode_t -init_dfa (re_dfa_t *dfa, size_t pat_len) -{ - unsigned int table_size; - - memset (dfa, '\0', sizeof (re_dfa_t)); - - /* Force allocation of str_tree_storage the first time. */ - dfa->str_tree_storage_idx = BIN_TREE_STORAGE_SIZE; - - /* Avoid overflows. */ - if (pat_len == SIZE_MAX) - return REG_ESPACE; - - dfa->nodes_alloc = pat_len + 1; - dfa->nodes = re_malloc (re_token_t, dfa->nodes_alloc); - - /* table_size = 2 ^ ceil(log pat_len) */ - for (table_size = 1; ; table_size <<= 1) - if (table_size > pat_len) - break; - - dfa->state_table = calloc (sizeof (struct re_state_table_entry), table_size); - dfa->state_hash_mask = table_size - 1; - - dfa->mb_cur_max = MB_CUR_MAX; -#ifdef _LIBC - if (dfa->mb_cur_max == 6 - && strcmp (_NL_CURRENT (LC_CTYPE, _NL_CTYPE_CODESET_NAME), "UTF-8") == 0) - dfa->is_utf8 = 1; - dfa->map_notascii = (_NL_CURRENT_WORD (LC_CTYPE, _NL_CTYPE_MAP_TO_NONASCII) - != 0); -#else - dfa->is_utf8 = 1; - /* We check exhaustively in the loop below if this charset is a - superset of ASCII. */ - dfa->map_notascii = 0; -#endif - -#ifdef RE_ENABLE_I18N - if (dfa->mb_cur_max > 1) - { - if (dfa->is_utf8) - { -#if !defined(__GNUC__) || __GNUC__ < 3 - static short utf8_sb_map_inited = 0; - - if (! utf8_sb_map_inited) - { - int i; - - utf8_sb_map_inited = 0; - for (i = 0; i <= 0x80 / BITSET_WORD_BITS - 1; i++) - utf8_sb_map[i] = BITSET_WORD_MAX; - } -#endif - dfa->sb_char = (re_bitset_ptr_t) utf8_sb_map; - } - else - { - int i, j, ch; - - dfa->sb_char = (re_bitset_ptr_t) calloc (sizeof (bitset_t), 1); - if (BE (dfa->sb_char == NULL, 0)) - return REG_ESPACE; - - /* Set the bits corresponding to single byte chars. */ - for (i = 0, ch = 0; i < BITSET_WORDS; ++i) - for (j = 0; j < BITSET_WORD_BITS; ++j, ++ch) - { - wint_t wch = __btowc (ch); - if (wch != WEOF) - dfa->sb_char[i] |= (bitset_word_t) 1 << j; -# ifndef _LIBC - if (isascii (ch) && wch != ch) - dfa->map_notascii = 1; -# endif - } - } - } -#endif - - if (BE (dfa->nodes == NULL || dfa->state_table == NULL, 0)) - return REG_ESPACE; - return REG_NOERROR; -} - -/* Initialize WORD_CHAR table, which indicate which character is - "word". In this case "word" means that it is the word construction - character used by some operators like "\<", "\>", etc. */ - -static void -internal_function -init_word_char (re_dfa_t *dfa) -{ - int i, j, ch; - dfa->word_ops_used = 1; - for (i = 0, ch = 0; i < BITSET_WORDS; ++i) - for (j = 0; j < BITSET_WORD_BITS; ++j, ++ch) - if (isalnum (ch) || ch == '_') - dfa->word_char[i] |= (bitset_word_t) 1 << j; -} - -/* Free the work area which are only used while compiling. */ - -static void -free_workarea_compile (regex_t *preg) -{ - re_dfa_t *dfa = (re_dfa_t *) preg->buffer; - bin_tree_storage_t *storage, *next; - for (storage = dfa->str_tree_storage; storage; storage = next) - { - next = storage->next; - re_free (storage); - } - dfa->str_tree_storage = NULL; - dfa->str_tree_storage_idx = BIN_TREE_STORAGE_SIZE; - dfa->str_tree = NULL; - re_free (dfa->org_indices); - dfa->org_indices = NULL; -} - -/* Create initial states for all contexts. */ - -static reg_errcode_t -create_initial_state (re_dfa_t *dfa) -{ - int first, i; - reg_errcode_t err; - re_node_set init_nodes; - - /* Initial states have the epsilon closure of the node which is - the first node of the regular expression. */ - first = dfa->str_tree->first->node_idx; - dfa->init_node = first; - err = re_node_set_init_copy (&init_nodes, dfa->eclosures + first); - if (BE (err != REG_NOERROR, 0)) - return err; - - /* The back-references which are in initial states can epsilon transit, - since in this case all of the subexpressions can be null. - Then we add epsilon closures of the nodes which are the next nodes of - the back-references. */ - if (dfa->nbackref > 0) - for (i = 0; i < init_nodes.nelem; ++i) - { - int node_idx = init_nodes.elems[i]; - re_token_type_t type = dfa->nodes[node_idx].type; - - int clexp_idx; - if (type != OP_BACK_REF) - continue; - for (clexp_idx = 0; clexp_idx < init_nodes.nelem; ++clexp_idx) - { - re_token_t *clexp_node; - clexp_node = dfa->nodes + init_nodes.elems[clexp_idx]; - if (clexp_node->type == OP_CLOSE_SUBEXP - && clexp_node->opr.idx == dfa->nodes[node_idx].opr.idx) - break; - } - if (clexp_idx == init_nodes.nelem) - continue; - - if (type == OP_BACK_REF) - { - int dest_idx = dfa->edests[node_idx].elems[0]; - if (!re_node_set_contains (&init_nodes, dest_idx)) - { - reg_errcode_t err = re_node_set_merge (&init_nodes, - dfa->eclosures - + dest_idx); - if (err != REG_NOERROR) - return err; - i = 0; - } - } - } - - /* It must be the first time to invoke acquire_state. */ - dfa->init_state = re_acquire_state_context (&err, dfa, &init_nodes, 0); - /* We don't check ERR here, since the initial state must not be NULL. */ - if (BE (dfa->init_state == NULL, 0)) - return err; - if (dfa->init_state->has_constraint) - { - dfa->init_state_word = re_acquire_state_context (&err, dfa, &init_nodes, - CONTEXT_WORD); - dfa->init_state_nl = re_acquire_state_context (&err, dfa, &init_nodes, - CONTEXT_NEWLINE); - dfa->init_state_begbuf = re_acquire_state_context (&err, dfa, - &init_nodes, - CONTEXT_NEWLINE - | CONTEXT_BEGBUF); - if (BE (dfa->init_state_word == NULL || dfa->init_state_nl == NULL - || dfa->init_state_begbuf == NULL, 0)) - return err; - } - else - dfa->init_state_word = dfa->init_state_nl - = dfa->init_state_begbuf = dfa->init_state; - - re_node_set_free (&init_nodes); - return REG_NOERROR; -} - -#ifdef RE_ENABLE_I18N -/* If it is possible to do searching in single byte encoding instead of UTF-8 - to speed things up, set dfa->mb_cur_max to 1, clear is_utf8 and change - DFA nodes where needed. */ - -static void -optimize_utf8 (re_dfa_t *dfa) -{ - int node, i, mb_chars = 0, has_period = 0; - - for (node = 0; node < dfa->nodes_len; ++node) - switch (dfa->nodes[node].type) - { - case CHARACTER: - if (dfa->nodes[node].opr.c >= 0x80) - mb_chars = 1; - break; - case ANCHOR: - switch (dfa->nodes[node].opr.ctx_type) - { - case LINE_FIRST: - case LINE_LAST: - case BUF_FIRST: - case BUF_LAST: - break; - default: - /* Word anchors etc. cannot be handled. It's okay to test - opr.ctx_type since constraints (for all DFA nodes) are - created by ORing one or more opr.ctx_type values. */ - return; - } - break; - case OP_PERIOD: - has_period = 1; - break; - case OP_BACK_REF: - case OP_ALT: - case END_OF_RE: - case OP_DUP_ASTERISK: - case OP_OPEN_SUBEXP: - case OP_CLOSE_SUBEXP: - break; - case COMPLEX_BRACKET: - return; - case SIMPLE_BRACKET: - /* Just double check. The non-ASCII range starts at 0x80. */ - assert (0x80 % BITSET_WORD_BITS == 0); - for (i = 0x80 / BITSET_WORD_BITS; i < BITSET_WORDS; ++i) - if (dfa->nodes[node].opr.sbcset[i]) - return; - break; - default: - abort (); - } - - if (mb_chars || has_period) - for (node = 0; node < dfa->nodes_len; ++node) - { - if (dfa->nodes[node].type == CHARACTER - && dfa->nodes[node].opr.c >= 0x80) - dfa->nodes[node].mb_partial = 0; - else if (dfa->nodes[node].type == OP_PERIOD) - dfa->nodes[node].type = OP_UTF8_PERIOD; - } - - /* The search can be in single byte locale. */ - dfa->mb_cur_max = 1; - dfa->is_utf8 = 0; - dfa->has_mb_node = dfa->nbackref > 0 || has_period; -} -#endif - -/* Analyze the structure tree, and calculate "first", "next", "edest", - "eclosure", and "inveclosure". */ - -static reg_errcode_t -analyze (regex_t *preg) -{ - re_dfa_t *dfa = (re_dfa_t *) preg->buffer; - reg_errcode_t ret; - - /* Allocate arrays. */ - dfa->nexts = re_malloc (int, dfa->nodes_alloc); - dfa->org_indices = re_malloc (int, dfa->nodes_alloc); - dfa->edests = re_malloc (re_node_set, dfa->nodes_alloc); - dfa->eclosures = re_malloc (re_node_set, dfa->nodes_alloc); - if (BE (dfa->nexts == NULL || dfa->org_indices == NULL || dfa->edests == NULL - || dfa->eclosures == NULL, 0)) - return REG_ESPACE; - - dfa->subexp_map = re_malloc (int, preg->re_nsub); - if (dfa->subexp_map != NULL) - { - unsigned int i; - for (i = 0; i < preg->re_nsub; i++) - dfa->subexp_map[i] = i; - preorder (dfa->str_tree, optimize_subexps, dfa); - for (i = 0; i < preg->re_nsub; i++) - if (dfa->subexp_map[i] != (int)i) - break; - if (i == preg->re_nsub) - { - free (dfa->subexp_map); - dfa->subexp_map = NULL; - } - } - - ret = postorder (dfa->str_tree, lower_subexps, preg); - if (BE (ret != REG_NOERROR, 0)) - return ret; - ret = postorder (dfa->str_tree, calc_first, dfa); - if (BE (ret != REG_NOERROR, 0)) - return ret; - preorder (dfa->str_tree, calc_next, dfa); - ret = preorder (dfa->str_tree, link_nfa_nodes, dfa); - if (BE (ret != REG_NOERROR, 0)) - return ret; - ret = calc_eclosure (dfa); - if (BE (ret != REG_NOERROR, 0)) - return ret; - - /* We only need this during the prune_impossible_nodes pass in regexec.c; - skip it if p_i_n will not run, as calc_inveclosure can be quadratic. */ - if ((!preg->no_sub && preg->re_nsub > 0 && dfa->has_plural_match) - || dfa->nbackref) - { - dfa->inveclosures = re_malloc (re_node_set, dfa->nodes_len); - if (BE (dfa->inveclosures == NULL, 0)) - return REG_ESPACE; - ret = calc_inveclosure (dfa); - } - - return ret; -} - -/* Our parse trees are very unbalanced, so we cannot use a stack to - implement parse tree visits. Instead, we use parent pointers and - some hairy code in these two functions. */ -static reg_errcode_t -postorder (bin_tree_t *root, reg_errcode_t (fn (void *, bin_tree_t *)), - void *extra) -{ - bin_tree_t *node, *prev; - - for (node = root; ; ) - { - /* Descend down the tree, preferably to the left (or to the right - if that's the only child). */ - while (node->left || node->right) - if (node->left) - node = node->left; - else - node = node->right; - - do - { - reg_errcode_t err = fn (extra, node); - if (BE (err != REG_NOERROR, 0)) - return err; - if (node->parent == NULL) - return REG_NOERROR; - prev = node; - node = node->parent; - } - /* Go up while we have a node that is reached from the right. */ - while (node->right == prev || node->right == NULL); - node = node->right; - } -} - -static reg_errcode_t -preorder (bin_tree_t *root, reg_errcode_t (fn (void *, bin_tree_t *)), - void *extra) -{ - bin_tree_t *node; - - for (node = root; ; ) - { - reg_errcode_t err = fn (extra, node); - if (BE (err != REG_NOERROR, 0)) - return err; - - /* Go to the left node, or up and to the right. */ - if (node->left) - node = node->left; - else - { - bin_tree_t *prev = NULL; - while (node->right == prev || node->right == NULL) - { - prev = node; - node = node->parent; - if (!node) - return REG_NOERROR; - } - node = node->right; - } - } -} - -/* Optimization pass: if a SUBEXP is entirely contained, strip it and tell - re_search_internal to map the inner one's opr.idx to this one's. Adjust - backreferences as well. Requires a preorder visit. */ -static reg_errcode_t -optimize_subexps (void *extra, bin_tree_t *node) -{ - re_dfa_t *dfa = (re_dfa_t *) extra; - - if (node->token.type == OP_BACK_REF && dfa->subexp_map) - { - int idx = node->token.opr.idx; - node->token.opr.idx = dfa->subexp_map[idx]; - dfa->used_bkref_map |= 1 << node->token.opr.idx; - } - - else if (node->token.type == SUBEXP - && node->left && node->left->token.type == SUBEXP) - { - int other_idx = node->left->token.opr.idx; - - node->left = node->left->left; - if (node->left) - node->left->parent = node; - - dfa->subexp_map[other_idx] = dfa->subexp_map[node->token.opr.idx]; - if (other_idx < BITSET_WORD_BITS) - dfa->used_bkref_map &= ~((bitset_word_t) 1 << other_idx); - } - - return REG_NOERROR; -} - -/* Lowering pass: Turn each SUBEXP node into the appropriate concatenation - of OP_OPEN_SUBEXP, the body of the SUBEXP (if any) and OP_CLOSE_SUBEXP. */ -static reg_errcode_t -lower_subexps (void *extra, bin_tree_t *node) -{ - regex_t *preg = (regex_t *) extra; - reg_errcode_t err = REG_NOERROR; - - if (node->left && node->left->token.type == SUBEXP) - { - node->left = lower_subexp (&err, preg, node->left); - if (node->left) - node->left->parent = node; - } - if (node->right && node->right->token.type == SUBEXP) - { - node->right = lower_subexp (&err, preg, node->right); - if (node->right) - node->right->parent = node; - } - - return err; -} - -static bin_tree_t * -lower_subexp (reg_errcode_t *err, regex_t *preg, bin_tree_t *node) -{ - re_dfa_t *dfa = (re_dfa_t *) preg->buffer; - bin_tree_t *body = node->left; - bin_tree_t *op, *cls, *tree1, *tree; - - if (preg->no_sub - /* We do not optimize empty subexpressions, because otherwise we may - have bad CONCAT nodes with NULL children. This is obviously not - very common, so we do not lose much. An example that triggers - this case is the sed "script" /\(\)/x. */ - && node->left != NULL - && (node->token.opr.idx >= BITSET_WORD_BITS - || !(dfa->used_bkref_map - & ((bitset_word_t) 1 << node->token.opr.idx)))) - return node->left; - - /* Convert the SUBEXP node to the concatenation of an - OP_OPEN_SUBEXP, the contents, and an OP_CLOSE_SUBEXP. */ - op = create_tree (dfa, NULL, NULL, OP_OPEN_SUBEXP); - cls = create_tree (dfa, NULL, NULL, OP_CLOSE_SUBEXP); - tree1 = body ? create_tree (dfa, body, cls, CONCAT) : cls; - tree = create_tree (dfa, op, tree1, CONCAT); - if (BE (tree == NULL || tree1 == NULL || op == NULL || cls == NULL, 0)) - { - *err = REG_ESPACE; - return NULL; - } - - op->token.opr.idx = cls->token.opr.idx = node->token.opr.idx; - op->token.opt_subexp = cls->token.opt_subexp = node->token.opt_subexp; - return tree; -} - -/* Pass 1 in building the NFA: compute FIRST and create unlinked automaton - nodes. Requires a postorder visit. */ -static reg_errcode_t -calc_first (void *extra, bin_tree_t *node) -{ - re_dfa_t *dfa = (re_dfa_t *) extra; - if (node->token.type == CONCAT) - { - node->first = node->left->first; - node->node_idx = node->left->node_idx; - } - else - { - node->first = node; - node->node_idx = re_dfa_add_node (dfa, node->token); - if (BE (node->node_idx == -1, 0)) - return REG_ESPACE; - if (node->token.type == ANCHOR) - dfa->nodes[node->node_idx].constraint = node->token.opr.ctx_type; - } - return REG_NOERROR; -} - -/* Pass 2: compute NEXT on the tree. Preorder visit. */ -static reg_errcode_t -calc_next (UNUSED void *extra, bin_tree_t *node) -{ - switch (node->token.type) - { - case OP_DUP_ASTERISK: - node->left->next = node; - break; - case CONCAT: - node->left->next = node->right->first; - node->right->next = node->next; - break; - default: - if (node->left) - node->left->next = node->next; - if (node->right) - node->right->next = node->next; - break; - } - return REG_NOERROR; -} - -/* Pass 3: link all DFA nodes to their NEXT node (any order will do). */ -static reg_errcode_t -link_nfa_nodes (void *extra, bin_tree_t *node) -{ - re_dfa_t *dfa = (re_dfa_t *) extra; - int idx = node->node_idx; - reg_errcode_t err = REG_NOERROR; - - switch (node->token.type) - { - case CONCAT: - break; - - case END_OF_RE: - assert (node->next == NULL); - break; - - case OP_DUP_ASTERISK: - case OP_ALT: - { - int left, right; - dfa->has_plural_match = 1; - if (node->left != NULL) - left = node->left->first->node_idx; - else - left = node->next->node_idx; - if (node->right != NULL) - right = node->right->first->node_idx; - else - right = node->next->node_idx; - assert (left > -1); - assert (right > -1); - err = re_node_set_init_2 (dfa->edests + idx, left, right); - } - break; - - case ANCHOR: - case OP_OPEN_SUBEXP: - case OP_CLOSE_SUBEXP: - err = re_node_set_init_1 (dfa->edests + idx, node->next->node_idx); - break; - - case OP_BACK_REF: - dfa->nexts[idx] = node->next->node_idx; - if (node->token.type == OP_BACK_REF) - err = re_node_set_init_1 (dfa->edests + idx, dfa->nexts[idx]); - break; - - default: - assert (!IS_EPSILON_NODE (node->token.type)); - dfa->nexts[idx] = node->next->node_idx; - break; - } - - return err; -} - -/* Duplicate the epsilon closure of the node ROOT_NODE. - Note that duplicated nodes have constraint INIT_CONSTRAINT in addition - to their own constraint. */ - -static reg_errcode_t -internal_function -duplicate_node_closure (re_dfa_t *dfa, int top_org_node, int top_clone_node, - int root_node, unsigned int init_constraint) -{ - int org_node, clone_node, ret; - unsigned int constraint = init_constraint; - for (org_node = top_org_node, clone_node = top_clone_node;;) - { - int org_dest, clone_dest; - if (dfa->nodes[org_node].type == OP_BACK_REF) - { - /* If the back reference epsilon-transit, its destination must - also have the constraint. Then duplicate the epsilon closure - of the destination of the back reference, and store it in - edests of the back reference. */ - org_dest = dfa->nexts[org_node]; - re_node_set_empty (dfa->edests + clone_node); - clone_dest = duplicate_node (dfa, org_dest, constraint); - if (BE (clone_dest == -1, 0)) - return REG_ESPACE; - dfa->nexts[clone_node] = dfa->nexts[org_node]; - ret = re_node_set_insert (dfa->edests + clone_node, clone_dest); - if (BE (ret < 0, 0)) - return REG_ESPACE; - } - else if (dfa->edests[org_node].nelem == 0) - { - /* In case of the node can't epsilon-transit, don't duplicate the - destination and store the original destination as the - destination of the node. */ - dfa->nexts[clone_node] = dfa->nexts[org_node]; - break; - } - else if (dfa->edests[org_node].nelem == 1) - { - /* In case of the node can epsilon-transit, and it has only one - destination. */ - org_dest = dfa->edests[org_node].elems[0]; - re_node_set_empty (dfa->edests + clone_node); - /* If the node is root_node itself, it means the epsilon clsoure - has a loop. Then tie it to the destination of the root_node. */ - if (org_node == root_node && clone_node != org_node) - { - ret = re_node_set_insert (dfa->edests + clone_node, org_dest); - if (BE (ret < 0, 0)) - return REG_ESPACE; - break; - } - /* In case of the node has another constraint, add it. */ - constraint |= dfa->nodes[org_node].constraint; - clone_dest = duplicate_node (dfa, org_dest, constraint); - if (BE (clone_dest == -1, 0)) - return REG_ESPACE; - ret = re_node_set_insert (dfa->edests + clone_node, clone_dest); - if (BE (ret < 0, 0)) - return REG_ESPACE; - } - else /* dfa->edests[org_node].nelem == 2 */ - { - /* In case of the node can epsilon-transit, and it has two - destinations. In the bin_tree_t and DFA, that's '|' and '*'. */ - org_dest = dfa->edests[org_node].elems[0]; - re_node_set_empty (dfa->edests + clone_node); - /* Search for a duplicated node which satisfies the constraint. */ - clone_dest = search_duplicated_node (dfa, org_dest, constraint); - if (clone_dest == -1) - { - /* There is no such duplicated node, create a new one. */ - reg_errcode_t err; - clone_dest = duplicate_node (dfa, org_dest, constraint); - if (BE (clone_dest == -1, 0)) - return REG_ESPACE; - ret = re_node_set_insert (dfa->edests + clone_node, clone_dest); - if (BE (ret < 0, 0)) - return REG_ESPACE; - err = duplicate_node_closure (dfa, org_dest, clone_dest, - root_node, constraint); - if (BE (err != REG_NOERROR, 0)) - return err; - } - else - { - /* There is a duplicated node which satisfies the constraint, - use it to avoid infinite loop. */ - ret = re_node_set_insert (dfa->edests + clone_node, clone_dest); - if (BE (ret < 0, 0)) - return REG_ESPACE; - } - - org_dest = dfa->edests[org_node].elems[1]; - clone_dest = duplicate_node (dfa, org_dest, constraint); - if (BE (clone_dest == -1, 0)) - return REG_ESPACE; - ret = re_node_set_insert (dfa->edests + clone_node, clone_dest); - if (BE (ret < 0, 0)) - return REG_ESPACE; - } - org_node = org_dest; - clone_node = clone_dest; - } - return REG_NOERROR; -} - -/* Search for a node which is duplicated from the node ORG_NODE, and - satisfies the constraint CONSTRAINT. */ - -static int -search_duplicated_node (const re_dfa_t *dfa, int org_node, - unsigned int constraint) -{ - int idx; - for (idx = dfa->nodes_len - 1; dfa->nodes[idx].duplicated && idx > 0; --idx) - { - if (org_node == dfa->org_indices[idx] - && constraint == dfa->nodes[idx].constraint) - return idx; /* Found. */ - } - return -1; /* Not found. */ -} - -/* Duplicate the node whose index is ORG_IDX and set the constraint CONSTRAINT. - Return the index of the new node, or -1 if insufficient storage is - available. */ - -static int -duplicate_node (re_dfa_t *dfa, int org_idx, unsigned int constraint) -{ - int dup_idx = re_dfa_add_node (dfa, dfa->nodes[org_idx]); - if (BE (dup_idx != -1, 1)) - { - dfa->nodes[dup_idx].constraint = constraint; - dfa->nodes[dup_idx].constraint |= dfa->nodes[org_idx].constraint; - dfa->nodes[dup_idx].duplicated = 1; - - /* Store the index of the original node. */ - dfa->org_indices[dup_idx] = org_idx; - } - return dup_idx; -} - -static reg_errcode_t -calc_inveclosure (re_dfa_t *dfa) -{ - int ret; - unsigned int src, idx; - for (idx = 0; idx < dfa->nodes_len; ++idx) - re_node_set_init_empty (dfa->inveclosures + idx); - - for (src = 0; src < dfa->nodes_len; ++src) - { - int *elems = dfa->eclosures[src].elems; - int idx; - for (idx = 0; idx < dfa->eclosures[src].nelem; ++idx) - { - ret = re_node_set_insert_last (dfa->inveclosures + elems[idx], src); - if (BE (ret == -1, 0)) - return REG_ESPACE; - } - } - - return REG_NOERROR; -} - -/* Calculate "eclosure" for all the node in DFA. */ - -static reg_errcode_t -calc_eclosure (re_dfa_t *dfa) -{ - size_t node_idx; - int incomplete; -#ifdef DEBUG - assert (dfa->nodes_len > 0); -#endif - incomplete = 0; - /* For each nodes, calculate epsilon closure. */ - for (node_idx = 0; ; ++node_idx) - { - reg_errcode_t err; - re_node_set eclosure_elem; - if (node_idx == dfa->nodes_len) - { - if (!incomplete) - break; - incomplete = 0; - node_idx = 0; - } - -#ifdef DEBUG - assert (dfa->eclosures[node_idx].nelem != -1); -#endif - - /* If we have already calculated, skip it. */ - if (dfa->eclosures[node_idx].nelem != 0) - continue; - /* Calculate epsilon closure of `node_idx'. */ - err = calc_eclosure_iter (&eclosure_elem, dfa, node_idx, 1); - if (BE (err != REG_NOERROR, 0)) - return err; - - if (dfa->eclosures[node_idx].nelem == 0) - { - incomplete = 1; - re_node_set_free (&eclosure_elem); - } - } - return REG_NOERROR; -} - -/* Calculate epsilon closure of NODE. */ - -static reg_errcode_t -calc_eclosure_iter (re_node_set *new_set, re_dfa_t *dfa, int node, int root) -{ - reg_errcode_t err; - int i; - re_node_set eclosure; - int ret; - int incomplete = 0; - err = re_node_set_alloc (&eclosure, dfa->edests[node].nelem + 1); - if (BE (err != REG_NOERROR, 0)) - return err; - - /* This indicates that we are calculating this node now. - We reference this value to avoid infinite loop. */ - dfa->eclosures[node].nelem = -1; - - /* If the current node has constraints, duplicate all nodes - since they must inherit the constraints. */ - if (dfa->nodes[node].constraint - && dfa->edests[node].nelem - && !dfa->nodes[dfa->edests[node].elems[0]].duplicated) - { - err = duplicate_node_closure (dfa, node, node, node, - dfa->nodes[node].constraint); - if (BE (err != REG_NOERROR, 0)) - return err; - } - - /* Expand each epsilon destination nodes. */ - if (IS_EPSILON_NODE(dfa->nodes[node].type)) - for (i = 0; i < dfa->edests[node].nelem; ++i) - { - re_node_set eclosure_elem; - int edest = dfa->edests[node].elems[i]; - /* If calculating the epsilon closure of `edest' is in progress, - return intermediate result. */ - if (dfa->eclosures[edest].nelem == -1) - { - incomplete = 1; - continue; - } - /* If we haven't calculated the epsilon closure of `edest' yet, - calculate now. Otherwise use calculated epsilon closure. */ - if (dfa->eclosures[edest].nelem == 0) - { - err = calc_eclosure_iter (&eclosure_elem, dfa, edest, 0); - if (BE (err != REG_NOERROR, 0)) - return err; - } - else - eclosure_elem = dfa->eclosures[edest]; - /* Merge the epsilon closure of `edest'. */ - err = re_node_set_merge (&eclosure, &eclosure_elem); - if (BE (err != REG_NOERROR, 0)) - return err; - /* If the epsilon closure of `edest' is incomplete, - the epsilon closure of this node is also incomplete. */ - if (dfa->eclosures[edest].nelem == 0) - { - incomplete = 1; - re_node_set_free (&eclosure_elem); - } - } - - /* An epsilon closure includes itself. */ - ret = re_node_set_insert (&eclosure, node); - if (BE (ret < 0, 0)) - return REG_ESPACE; - if (incomplete && !root) - dfa->eclosures[node].nelem = 0; - else - dfa->eclosures[node] = eclosure; - *new_set = eclosure; - return REG_NOERROR; -} - -/* Functions for token which are used in the parser. */ - -/* Fetch a token from INPUT. - We must not use this function inside bracket expressions. */ - -static void -internal_function -fetch_token (re_token_t *result, re_string_t *input, reg_syntax_t syntax) -{ - re_string_skip_bytes (input, peek_token (result, input, syntax)); -} - -/* Peek a token from INPUT, and return the length of the token. - We must not use this function inside bracket expressions. */ - -static int -internal_function -peek_token (re_token_t *token, re_string_t *input, reg_syntax_t syntax) -{ - unsigned char c; - - if (re_string_eoi (input)) - { - token->type = END_OF_RE; - return 0; - } - - c = re_string_peek_byte (input, 0); - token->opr.c = c; - - token->word_char = 0; -#ifdef RE_ENABLE_I18N - token->mb_partial = 0; - if (input->mb_cur_max > 1 && - !re_string_first_byte (input, re_string_cur_idx (input))) - { - token->type = CHARACTER; - token->mb_partial = 1; - return 1; - } -#endif - if (c == '\\') - { - unsigned char c2; - if (re_string_cur_idx (input) + 1 >= re_string_length (input)) - { - token->type = BACK_SLASH; - return 1; - } - - c2 = re_string_peek_byte_case (input, 1); - token->opr.c = c2; - token->type = CHARACTER; -#ifdef RE_ENABLE_I18N - if (input->mb_cur_max > 1) - { - wint_t wc = re_string_wchar_at (input, - re_string_cur_idx (input) + 1); - token->word_char = IS_WIDE_WORD_CHAR (wc) != 0; - } - else -#endif - token->word_char = IS_WORD_CHAR (c2) != 0; - - switch (c2) - { - case '|': - if (!(syntax & RE_LIMITED_OPS) && !(syntax & RE_NO_BK_VBAR)) - token->type = OP_ALT; - break; - case '1': case '2': case '3': case '4': case '5': - case '6': case '7': case '8': case '9': - if (!(syntax & RE_NO_BK_REFS)) - { - token->type = OP_BACK_REF; - token->opr.idx = c2 - '1'; - } - break; - case '<': - if (!(syntax & RE_NO_GNU_OPS)) - { - token->type = ANCHOR; - token->opr.ctx_type = WORD_FIRST; - } - break; - case '>': - if (!(syntax & RE_NO_GNU_OPS)) - { - token->type = ANCHOR; - token->opr.ctx_type = WORD_LAST; - } - break; - case 'b': - if (!(syntax & RE_NO_GNU_OPS)) - { - token->type = ANCHOR; - token->opr.ctx_type = WORD_DELIM; - } - break; - case 'B': - if (!(syntax & RE_NO_GNU_OPS)) - { - token->type = ANCHOR; - token->opr.ctx_type = NOT_WORD_DELIM; - } - break; - case 'w': - if (!(syntax & RE_NO_GNU_OPS)) - token->type = OP_WORD; - break; - case 'W': - if (!(syntax & RE_NO_GNU_OPS)) - token->type = OP_NOTWORD; - break; - case 's': - if (!(syntax & RE_NO_GNU_OPS)) - token->type = OP_SPACE; - break; - case 'S': - if (!(syntax & RE_NO_GNU_OPS)) - token->type = OP_NOTSPACE; - break; - case '`': - if (!(syntax & RE_NO_GNU_OPS)) - { - token->type = ANCHOR; - token->opr.ctx_type = BUF_FIRST; - } - break; - case '\'': - if (!(syntax & RE_NO_GNU_OPS)) - { - token->type = ANCHOR; - token->opr.ctx_type = BUF_LAST; - } - break; - case '(': - if (!(syntax & RE_NO_BK_PARENS)) - token->type = OP_OPEN_SUBEXP; - break; - case ')': - if (!(syntax & RE_NO_BK_PARENS)) - token->type = OP_CLOSE_SUBEXP; - break; - case '+': - if (!(syntax & RE_LIMITED_OPS) && (syntax & RE_BK_PLUS_QM)) - token->type = OP_DUP_PLUS; - break; - case '?': - if (!(syntax & RE_LIMITED_OPS) && (syntax & RE_BK_PLUS_QM)) - token->type = OP_DUP_QUESTION; - break; - case '{': - if ((syntax & RE_INTERVALS) && (!(syntax & RE_NO_BK_BRACES))) - token->type = OP_OPEN_DUP_NUM; - break; - case '}': - if ((syntax & RE_INTERVALS) && (!(syntax & RE_NO_BK_BRACES))) - token->type = OP_CLOSE_DUP_NUM; - break; - default: - break; - } - return 2; - } - - token->type = CHARACTER; -#ifdef RE_ENABLE_I18N - if (input->mb_cur_max > 1) - { - wint_t wc = re_string_wchar_at (input, re_string_cur_idx (input)); - token->word_char = IS_WIDE_WORD_CHAR (wc) != 0; - } - else -#endif - token->word_char = IS_WORD_CHAR (token->opr.c); - - switch (c) - { - case '\n': - if (syntax & RE_NEWLINE_ALT) - token->type = OP_ALT; - break; - case '|': - if (!(syntax & RE_LIMITED_OPS) && (syntax & RE_NO_BK_VBAR)) - token->type = OP_ALT; - break; - case '*': - token->type = OP_DUP_ASTERISK; - break; - case '+': - if (!(syntax & RE_LIMITED_OPS) && !(syntax & RE_BK_PLUS_QM)) - token->type = OP_DUP_PLUS; - break; - case '?': - if (!(syntax & RE_LIMITED_OPS) && !(syntax & RE_BK_PLUS_QM)) - token->type = OP_DUP_QUESTION; - break; - case '{': - if ((syntax & RE_INTERVALS) && (syntax & RE_NO_BK_BRACES)) - token->type = OP_OPEN_DUP_NUM; - break; - case '}': - if ((syntax & RE_INTERVALS) && (syntax & RE_NO_BK_BRACES)) - token->type = OP_CLOSE_DUP_NUM; - break; - case '(': - if (syntax & RE_NO_BK_PARENS) - token->type = OP_OPEN_SUBEXP; - break; - case ')': - if (syntax & RE_NO_BK_PARENS) - token->type = OP_CLOSE_SUBEXP; - break; - case '[': - token->type = OP_OPEN_BRACKET; - break; - case '.': - token->type = OP_PERIOD; - break; - case '^': - if (!(syntax & (RE_CONTEXT_INDEP_ANCHORS | RE_CARET_ANCHORS_HERE)) && - re_string_cur_idx (input) != 0) - { - char prev = re_string_peek_byte (input, -1); - if (!(syntax & RE_NEWLINE_ALT) || prev != '\n') - break; - } - token->type = ANCHOR; - token->opr.ctx_type = LINE_FIRST; - break; - case '$': - if (!(syntax & RE_CONTEXT_INDEP_ANCHORS) && - re_string_cur_idx (input) + 1 != re_string_length (input)) - { - re_token_t next; - re_string_skip_bytes (input, 1); - peek_token (&next, input, syntax); - re_string_skip_bytes (input, -1); - if (next.type != OP_ALT && next.type != OP_CLOSE_SUBEXP) - break; - } - token->type = ANCHOR; - token->opr.ctx_type = LINE_LAST; - break; - default: - break; - } - return 1; -} - -/* Peek a token from INPUT, and return the length of the token. - We must not use this function out of bracket expressions. */ - -static int -internal_function -peek_token_bracket (re_token_t *token, re_string_t *input, reg_syntax_t syntax) -{ - unsigned char c; - if (re_string_eoi (input)) - { - token->type = END_OF_RE; - return 0; - } - c = re_string_peek_byte (input, 0); - token->opr.c = c; - -#ifdef RE_ENABLE_I18N - if (input->mb_cur_max > 1 && - !re_string_first_byte (input, re_string_cur_idx (input))) - { - token->type = CHARACTER; - return 1; - } -#endif /* RE_ENABLE_I18N */ - - if (c == '\\' && (syntax & RE_BACKSLASH_ESCAPE_IN_LISTS) - && re_string_cur_idx (input) + 1 < re_string_length (input)) - { - /* In this case, '\' escape a character. */ - unsigned char c2; - re_string_skip_bytes (input, 1); - c2 = re_string_peek_byte (input, 0); - token->opr.c = c2; - token->type = CHARACTER; - return 1; - } - if (c == '[') /* '[' is a special char in a bracket exps. */ - { - unsigned char c2; - int token_len; - if (re_string_cur_idx (input) + 1 < re_string_length (input)) - c2 = re_string_peek_byte (input, 1); - else - c2 = 0; - token->opr.c = c2; - token_len = 2; - switch (c2) - { - case '.': - token->type = OP_OPEN_COLL_ELEM; - break; - case '=': - token->type = OP_OPEN_EQUIV_CLASS; - break; - case ':': - if (syntax & RE_CHAR_CLASSES) - { - token->type = OP_OPEN_CHAR_CLASS; - break; - } - /* else fall through. */ - default: - token->type = CHARACTER; - token->opr.c = c; - token_len = 1; - break; - } - return token_len; - } - switch (c) - { - case '-': - token->type = OP_CHARSET_RANGE; - break; - case ']': - token->type = OP_CLOSE_BRACKET; - break; - case '^': - token->type = OP_NON_MATCH_LIST; - break; - default: - token->type = CHARACTER; - } - return 1; -} - -/* Functions for parser. */ - -/* Entry point of the parser. - Parse the regular expression REGEXP and return the structure tree. - If an error is occured, ERR is set by error code, and return NULL. - This function build the following tree, from regular expression : - CAT - / \ - / \ - EOR - - CAT means concatenation. - EOR means end of regular expression. */ - -static bin_tree_t * -parse (re_string_t *regexp, regex_t *preg, reg_syntax_t syntax, - reg_errcode_t *err) -{ - re_dfa_t *dfa = (re_dfa_t *) preg->buffer; - bin_tree_t *tree, *eor, *root; - re_token_t current_token; - dfa->syntax = syntax; - fetch_token (¤t_token, regexp, syntax | RE_CARET_ANCHORS_HERE); - tree = parse_reg_exp (regexp, preg, ¤t_token, syntax, 0, err); - if (BE (*err != REG_NOERROR && tree == NULL, 0)) - return NULL; - eor = create_tree (dfa, NULL, NULL, END_OF_RE); - if (tree != NULL) - root = create_tree (dfa, tree, eor, CONCAT); - else - root = eor; - if (BE (eor == NULL || root == NULL, 0)) - { - *err = REG_ESPACE; - return NULL; - } - return root; -} - -/* This function build the following tree, from regular expression - |: - ALT - / \ - / \ - - - ALT means alternative, which represents the operator `|'. */ - -static bin_tree_t * -parse_reg_exp (re_string_t *regexp, regex_t *preg, re_token_t *token, - reg_syntax_t syntax, int nest, reg_errcode_t *err) -{ - re_dfa_t *dfa = (re_dfa_t *) preg->buffer; - bin_tree_t *tree, *branch = NULL; - tree = parse_branch (regexp, preg, token, syntax, nest, err); - if (BE (*err != REG_NOERROR && tree == NULL, 0)) - return NULL; - - while (token->type == OP_ALT) - { - fetch_token (token, regexp, syntax | RE_CARET_ANCHORS_HERE); - if (token->type != OP_ALT && token->type != END_OF_RE - && (nest == 0 || token->type != OP_CLOSE_SUBEXP)) - { - branch = parse_branch (regexp, preg, token, syntax, nest, err); - if (BE (*err != REG_NOERROR && branch == NULL, 0)) - return NULL; - } - else - branch = NULL; - tree = create_tree (dfa, tree, branch, OP_ALT); - if (BE (tree == NULL, 0)) - { - *err = REG_ESPACE; - return NULL; - } - } - return tree; -} - -/* This function build the following tree, from regular expression - : - CAT - / \ - / \ - - - CAT means concatenation. */ - -static bin_tree_t * -parse_branch (re_string_t *regexp, regex_t *preg, re_token_t *token, - reg_syntax_t syntax, int nest, reg_errcode_t *err) -{ - bin_tree_t *tree, *exp; - re_dfa_t *dfa = (re_dfa_t *) preg->buffer; - tree = parse_expression (regexp, preg, token, syntax, nest, err); - if (BE (*err != REG_NOERROR && tree == NULL, 0)) - return NULL; - - while (token->type != OP_ALT && token->type != END_OF_RE - && (nest == 0 || token->type != OP_CLOSE_SUBEXP)) - { - exp = parse_expression (regexp, preg, token, syntax, nest, err); - if (BE (*err != REG_NOERROR && exp == NULL, 0)) - { - return NULL; - } - if (tree != NULL && exp != NULL) - { - tree = create_tree (dfa, tree, exp, CONCAT); - if (tree == NULL) - { - *err = REG_ESPACE; - return NULL; - } - } - else if (tree == NULL) - tree = exp; - /* Otherwise exp == NULL, we don't need to create new tree. */ - } - return tree; -} - -/* This function build the following tree, from regular expression a*: - * - | - a -*/ - -static bin_tree_t * -parse_expression (re_string_t *regexp, regex_t *preg, re_token_t *token, - reg_syntax_t syntax, int nest, reg_errcode_t *err) -{ - re_dfa_t *dfa = (re_dfa_t *) preg->buffer; - bin_tree_t *tree; - switch (token->type) - { - case CHARACTER: - tree = create_token_tree (dfa, NULL, NULL, token); - if (BE (tree == NULL, 0)) - { - *err = REG_ESPACE; - return NULL; - } -#ifdef RE_ENABLE_I18N - if (dfa->mb_cur_max > 1) - { - while (!re_string_eoi (regexp) - && !re_string_first_byte (regexp, re_string_cur_idx (regexp))) - { - bin_tree_t *mbc_remain; - fetch_token (token, regexp, syntax); - mbc_remain = create_token_tree (dfa, NULL, NULL, token); - tree = create_tree (dfa, tree, mbc_remain, CONCAT); - if (BE (mbc_remain == NULL || tree == NULL, 0)) - { - *err = REG_ESPACE; - return NULL; - } - } - } -#endif - break; - case OP_OPEN_SUBEXP: - tree = parse_sub_exp (regexp, preg, token, syntax, nest + 1, err); - if (BE (*err != REG_NOERROR && tree == NULL, 0)) - return NULL; - break; - case OP_OPEN_BRACKET: - tree = parse_bracket_exp (regexp, dfa, token, syntax, err); - if (BE (*err != REG_NOERROR && tree == NULL, 0)) - return NULL; - break; - case OP_BACK_REF: - if (!BE (dfa->completed_bkref_map & (1 << token->opr.idx), 1)) - { - *err = REG_ESUBREG; - return NULL; - } - dfa->used_bkref_map |= 1 << token->opr.idx; - tree = create_token_tree (dfa, NULL, NULL, token); - if (BE (tree == NULL, 0)) - { - *err = REG_ESPACE; - return NULL; - } - ++dfa->nbackref; - dfa->has_mb_node = 1; - break; - case OP_OPEN_DUP_NUM: - if (syntax & RE_CONTEXT_INVALID_DUP) - { - *err = REG_BADRPT; - return NULL; - } - /* FALLTHROUGH */ - case OP_DUP_ASTERISK: - case OP_DUP_PLUS: - case OP_DUP_QUESTION: - if (syntax & RE_CONTEXT_INVALID_OPS) - { - *err = REG_BADRPT; - return NULL; - } - else if (syntax & RE_CONTEXT_INDEP_OPS) - { - fetch_token (token, regexp, syntax); - return parse_expression (regexp, preg, token, syntax, nest, err); - } - /* else fall through */ - case OP_CLOSE_SUBEXP: - if ((token->type == OP_CLOSE_SUBEXP) && - !(syntax & RE_UNMATCHED_RIGHT_PAREN_ORD)) - { - *err = REG_ERPAREN; - return NULL; - } - /* else fall through */ - case OP_CLOSE_DUP_NUM: - /* We treat it as a normal character. */ - - /* Then we can these characters as normal characters. */ - token->type = CHARACTER; - /* mb_partial and word_char bits should be initialized already - by peek_token. */ - tree = create_token_tree (dfa, NULL, NULL, token); - if (BE (tree == NULL, 0)) - { - *err = REG_ESPACE; - return NULL; - } - break; - case ANCHOR: - if ((token->opr.ctx_type - & (WORD_DELIM | NOT_WORD_DELIM | WORD_FIRST | WORD_LAST)) - && dfa->word_ops_used == 0) - init_word_char (dfa); - if (token->opr.ctx_type == WORD_DELIM - || token->opr.ctx_type == NOT_WORD_DELIM) - { - bin_tree_t *tree_first, *tree_last; - if (token->opr.ctx_type == WORD_DELIM) - { - token->opr.ctx_type = WORD_FIRST; - tree_first = create_token_tree (dfa, NULL, NULL, token); - token->opr.ctx_type = WORD_LAST; - } - else - { - token->opr.ctx_type = INSIDE_WORD; - tree_first = create_token_tree (dfa, NULL, NULL, token); - token->opr.ctx_type = INSIDE_NOTWORD; - } - tree_last = create_token_tree (dfa, NULL, NULL, token); - tree = create_tree (dfa, tree_first, tree_last, OP_ALT); - if (BE (tree_first == NULL || tree_last == NULL || tree == NULL, 0)) - { - *err = REG_ESPACE; - return NULL; - } - } - else - { - tree = create_token_tree (dfa, NULL, NULL, token); - if (BE (tree == NULL, 0)) - { - *err = REG_ESPACE; - return NULL; - } - } - /* We must return here, since ANCHORs can't be followed - by repetition operators. - eg. RE"^*" is invalid or "", - it must not be "". */ - fetch_token (token, regexp, syntax); - return tree; - case OP_PERIOD: - tree = create_token_tree (dfa, NULL, NULL, token); - if (BE (tree == NULL, 0)) - { - *err = REG_ESPACE; - return NULL; - } - if (dfa->mb_cur_max > 1) - dfa->has_mb_node = 1; - break; - case OP_WORD: - case OP_NOTWORD: - tree = build_charclass_op (dfa, regexp->trans, - "alnum", - "_", - token->type == OP_NOTWORD, err); - if (BE (*err != REG_NOERROR && tree == NULL, 0)) - return NULL; - break; - case OP_SPACE: - case OP_NOTSPACE: - tree = build_charclass_op (dfa, regexp->trans, - "space", - "", - token->type == OP_NOTSPACE, err); - if (BE (*err != REG_NOERROR && tree == NULL, 0)) - return NULL; - break; - case OP_ALT: - case END_OF_RE: - return NULL; - case BACK_SLASH: - *err = REG_EESCAPE; - return NULL; - default: - /* Must not happen? */ -#ifdef DEBUG - assert (0); -#endif - return NULL; - } - fetch_token (token, regexp, syntax); - - while (token->type == OP_DUP_ASTERISK || token->type == OP_DUP_PLUS - || token->type == OP_DUP_QUESTION || token->type == OP_OPEN_DUP_NUM) - { - tree = parse_dup_op (tree, regexp, dfa, token, syntax, err); - if (BE (*err != REG_NOERROR && tree == NULL, 0)) - return NULL; - /* In BRE consecutive duplications are not allowed. */ - if ((syntax & RE_CONTEXT_INVALID_DUP) - && (token->type == OP_DUP_ASTERISK - || token->type == OP_OPEN_DUP_NUM)) - { - *err = REG_BADRPT; - return NULL; - } - } - - return tree; -} - -/* This function build the following tree, from regular expression - (): - SUBEXP - | - -*/ - -static bin_tree_t * -parse_sub_exp (re_string_t *regexp, regex_t *preg, re_token_t *token, - reg_syntax_t syntax, int nest, reg_errcode_t *err) -{ - re_dfa_t *dfa = (re_dfa_t *) preg->buffer; - bin_tree_t *tree; - size_t cur_nsub; - cur_nsub = preg->re_nsub++; - - fetch_token (token, regexp, syntax | RE_CARET_ANCHORS_HERE); - - /* The subexpression may be a null string. */ - if (token->type == OP_CLOSE_SUBEXP) - tree = NULL; - else - { - tree = parse_reg_exp (regexp, preg, token, syntax, nest, err); - if (BE (*err == REG_NOERROR && token->type != OP_CLOSE_SUBEXP, 0)) - *err = REG_EPAREN; - if (BE (*err != REG_NOERROR, 0)) - return NULL; - } - - if (cur_nsub <= '9' - '1') - dfa->completed_bkref_map |= 1 << cur_nsub; - - tree = create_tree (dfa, tree, NULL, SUBEXP); - if (BE (tree == NULL, 0)) - { - *err = REG_ESPACE; - return NULL; - } - tree->token.opr.idx = cur_nsub; - return tree; -} - -/* This function parse repetition operators like "*", "+", "{1,3}" etc. */ - -static bin_tree_t * -parse_dup_op (bin_tree_t *elem, re_string_t *regexp, re_dfa_t *dfa, - re_token_t *token, reg_syntax_t syntax, reg_errcode_t *err) -{ - bin_tree_t *tree = NULL, *old_tree = NULL; - int i, start, end, start_idx = re_string_cur_idx (regexp); -#ifndef RE_TOKEN_INIT_BUG - re_token_t start_token = *token; -#else - re_token_t start_token; - - memcpy ((void *) &start_token, (void *) token, sizeof start_token); -#endif - - if (token->type == OP_OPEN_DUP_NUM) - { - end = 0; - start = fetch_number (regexp, token, syntax); - if (start == -1) - { - if (token->type == CHARACTER && token->opr.c == ',') - start = 0; /* We treat "{,m}" as "{0,m}". */ - else - { - *err = REG_BADBR; /* {} is invalid. */ - return NULL; - } - } - if (BE (start != -2, 1)) - { - /* We treat "{n}" as "{n,n}". */ - end = ((token->type == OP_CLOSE_DUP_NUM) ? start - : ((token->type == CHARACTER && token->opr.c == ',') - ? fetch_number (regexp, token, syntax) : -2)); - } - if (BE (start == -2 || end == -2, 0)) - { - /* Invalid sequence. */ - if (BE (!(syntax & RE_INVALID_INTERVAL_ORD), 0)) - { - if (token->type == END_OF_RE) - *err = REG_EBRACE; - else - *err = REG_BADBR; - - return NULL; - } - - /* If the syntax bit is set, rollback. */ - re_string_set_index (regexp, start_idx); - *token = start_token; - token->type = CHARACTER; - /* mb_partial and word_char bits should be already initialized by - peek_token. */ - return elem; - } - - if (BE ((end != -1 && start > end) || token->type != OP_CLOSE_DUP_NUM, 0)) - { - /* First number greater than second. */ - *err = REG_BADBR; - return NULL; - } - } - else - { - start = (token->type == OP_DUP_PLUS) ? 1 : 0; - end = (token->type == OP_DUP_QUESTION) ? 1 : -1; - } - - fetch_token (token, regexp, syntax); - - if (BE (elem == NULL, 0)) - return NULL; - if (BE (start == 0 && end == 0, 0)) - { - postorder (elem, free_tree, NULL); - return NULL; - } - - /* Extract "{n,m}" to "...{0,}". */ - if (BE (start > 0, 0)) - { - tree = elem; - for (i = 2; i <= start; ++i) - { - elem = duplicate_tree (elem, dfa); - tree = create_tree (dfa, tree, elem, CONCAT); - if (BE (elem == NULL || tree == NULL, 0)) - goto parse_dup_op_espace; - } - - if (start == end) - return tree; - - /* Duplicate ELEM before it is marked optional. */ - elem = duplicate_tree (elem, dfa); - old_tree = tree; - } - else - old_tree = NULL; - - if (elem->token.type == SUBEXP) - postorder (elem, mark_opt_subexp, (void *) (long) elem->token.opr.idx); - - tree = create_tree (dfa, elem, NULL, (end == -1 ? OP_DUP_ASTERISK : OP_ALT)); - if (BE (tree == NULL, 0)) - goto parse_dup_op_espace; - - /* This loop is actually executed only when end != -1, - to rewrite {0,n} as ((...?)?)?... We have - already created the start+1-th copy. */ - for (i = start + 2; i <= end; ++i) - { - elem = duplicate_tree (elem, dfa); - tree = create_tree (dfa, tree, elem, CONCAT); - if (BE (elem == NULL || tree == NULL, 0)) - goto parse_dup_op_espace; - - tree = create_tree (dfa, tree, NULL, OP_ALT); - if (BE (tree == NULL, 0)) - goto parse_dup_op_espace; - } - - if (old_tree) - tree = create_tree (dfa, old_tree, tree, CONCAT); - - return tree; - - parse_dup_op_espace: - *err = REG_ESPACE; - return NULL; -} - -/* Size of the names for collating symbol/equivalence_class/character_class. - I'm not sure, but maybe enough. */ -#define BRACKET_NAME_BUF_SIZE 32 - -#ifndef _LIBC - /* Local function for parse_bracket_exp only used in case of NOT _LIBC. - Build the range expression which starts from START_ELEM, and ends - at END_ELEM. The result are written to MBCSET and SBCSET. - RANGE_ALLOC is the allocated size of mbcset->range_starts, and - mbcset->range_ends, is a pointer argument sinse we may - update it. */ - -static reg_errcode_t -internal_function -# ifdef RE_ENABLE_I18N -build_range_exp (bitset_t sbcset, re_charset_t *mbcset, int *range_alloc, - bracket_elem_t *start_elem, bracket_elem_t *end_elem) -# else /* not RE_ENABLE_I18N */ -build_range_exp (bitset_t sbcset, bracket_elem_t *start_elem, - bracket_elem_t *end_elem) -# endif /* not RE_ENABLE_I18N */ -{ - unsigned int start_ch, end_ch; - /* Equivalence Classes and Character Classes can't be a range start/end. */ - if (BE (start_elem->type == EQUIV_CLASS || start_elem->type == CHAR_CLASS - || end_elem->type == EQUIV_CLASS || end_elem->type == CHAR_CLASS, - 0)) - return REG_ERANGE; - - /* We can handle no multi character collating elements without libc - support. */ - if (BE ((start_elem->type == COLL_SYM - && strlen ((char *) start_elem->opr.name) > 1) - || (end_elem->type == COLL_SYM - && strlen ((char *) end_elem->opr.name) > 1), 0)) - return REG_ECOLLATE; - -# ifdef RE_ENABLE_I18N - { - wchar_t wc; - wint_t start_wc; - wint_t end_wc; - wchar_t cmp_buf[6] = {L'\0', L'\0', L'\0', L'\0', L'\0', L'\0'}; - - start_ch = ((start_elem->type == SB_CHAR) ? start_elem->opr.ch - : ((start_elem->type == COLL_SYM) ? start_elem->opr.name[0] - : 0)); - end_ch = ((end_elem->type == SB_CHAR) ? end_elem->opr.ch - : ((end_elem->type == COLL_SYM) ? end_elem->opr.name[0] - : 0)); -#ifdef GAWK - /* - * Fedora Core 2, maybe others, have broken `btowc' that returns -1 - * for any value > 127. Sigh. Note that `start_ch' and `end_ch' are - * unsigned, so we don't have sign extension problems. - */ - start_wc = ((start_elem->type == SB_CHAR || start_elem->type == COLL_SYM) - ? start_ch : start_elem->opr.wch); - end_wc = ((end_elem->type == SB_CHAR || end_elem->type == COLL_SYM) - ? end_ch : end_elem->opr.wch); -#else - start_wc = ((start_elem->type == SB_CHAR || start_elem->type == COLL_SYM) - ? __btowc (start_ch) : start_elem->opr.wch); - end_wc = ((end_elem->type == SB_CHAR || end_elem->type == COLL_SYM) - ? __btowc (end_ch) : end_elem->opr.wch); -#endif - if (start_wc == WEOF || end_wc == WEOF) - return REG_ECOLLATE; - cmp_buf[0] = start_wc; - cmp_buf[4] = end_wc; - if (wcscoll (cmp_buf, cmp_buf + 4) > 0) - return REG_ERANGE; - - /* Got valid collation sequence values, add them as a new entry. - However, for !_LIBC we have no collation elements: if the - character set is single byte, the single byte character set - that we build below suffices. parse_bracket_exp passes - no MBCSET if dfa->mb_cur_max == 1. */ - if (mbcset) - { - /* Check the space of the arrays. */ - if (BE (*range_alloc == mbcset->nranges, 0)) - { - /* There is not enough space, need realloc. */ - wchar_t *new_array_start, *new_array_end; - int new_nranges; - - /* +1 in case of mbcset->nranges is 0. */ - new_nranges = 2 * mbcset->nranges + 1; - /* Use realloc since mbcset->range_starts and mbcset->range_ends - are NULL if *range_alloc == 0. */ - new_array_start = re_realloc (mbcset->range_starts, wchar_t, - new_nranges); - new_array_end = re_realloc (mbcset->range_ends, wchar_t, - new_nranges); - - if (BE (new_array_start == NULL || new_array_end == NULL, 0)) - return REG_ESPACE; - - mbcset->range_starts = new_array_start; - mbcset->range_ends = new_array_end; - *range_alloc = new_nranges; - } - - mbcset->range_starts[mbcset->nranges] = start_wc; - mbcset->range_ends[mbcset->nranges++] = end_wc; - } - - /* Build the table for single byte characters. */ - for (wc = 0; wc < SBC_MAX; ++wc) - { - cmp_buf[2] = wc; - if (wcscoll (cmp_buf, cmp_buf + 2) <= 0 - && wcscoll (cmp_buf + 2, cmp_buf + 4) <= 0) - bitset_set (sbcset, wc); - } - } -# else /* not RE_ENABLE_I18N */ - { - unsigned int ch; - start_ch = ((start_elem->type == SB_CHAR ) ? start_elem->opr.ch - : ((start_elem->type == COLL_SYM) ? start_elem->opr.name[0] - : 0)); - end_ch = ((end_elem->type == SB_CHAR ) ? end_elem->opr.ch - : ((end_elem->type == COLL_SYM) ? end_elem->opr.name[0] - : 0)); - if (start_ch > end_ch) - return REG_ERANGE; - /* Build the table for single byte characters. */ - for (ch = 0; ch < SBC_MAX; ++ch) - if (start_ch <= ch && ch <= end_ch) - bitset_set (sbcset, ch); - } -# endif /* not RE_ENABLE_I18N */ - return REG_NOERROR; -} -#endif /* not _LIBC */ - -#ifndef _LIBC -/* Helper function for parse_bracket_exp only used in case of NOT _LIBC.. - Build the collating element which is represented by NAME. - The result are written to MBCSET and SBCSET. - COLL_SYM_ALLOC is the allocated size of mbcset->coll_sym, is a - pointer argument since we may update it. */ - -static reg_errcode_t -internal_function -# ifdef RE_ENABLE_I18N -build_collating_symbol (bitset_t sbcset, re_charset_t *mbcset, - int *coll_sym_alloc, const unsigned char *name) -# else /* not RE_ENABLE_I18N */ -build_collating_symbol (bitset_t sbcset, const unsigned char *name) -# endif /* not RE_ENABLE_I18N */ -{ - size_t name_len = strlen ((const char *) name); - if (BE (name_len != 1, 0)) - return REG_ECOLLATE; - else - { - bitset_set (sbcset, name[0]); - return REG_NOERROR; - } -} -#endif /* not _LIBC */ - -/* This function parse bracket expression like "[abc]", "[a-c]", - "[[.a-a.]]" etc. */ - -static bin_tree_t * -parse_bracket_exp (re_string_t *regexp, re_dfa_t *dfa, re_token_t *token, - reg_syntax_t syntax, reg_errcode_t *err) -{ -#ifdef _LIBC - const unsigned char *collseqmb; - const char *collseqwc; - uint32_t nrules; - int32_t table_size; - const int32_t *symb_table; - const unsigned char *extra; - - /* Local function for parse_bracket_exp used in _LIBC environement. - Seek the collating symbol entry correspondings to NAME. - Return the index of the symbol in the SYMB_TABLE. */ - - auto inline int32_t - __attribute ((always_inline)) - seek_collating_symbol_entry (name, name_len) - const unsigned char *name; - size_t name_len; - { - int32_t hash = elem_hash ((const char *) name, name_len); - int32_t elem = hash % table_size; - if (symb_table[2 * elem] != 0) - { - int32_t second = hash % (table_size - 2) + 1; - - do - { - /* First compare the hashing value. */ - if (symb_table[2 * elem] == hash - /* Compare the length of the name. */ - && name_len == extra[symb_table[2 * elem + 1]] - /* Compare the name. */ - && memcmp (name, &extra[symb_table[2 * elem + 1] + 1], - name_len) == 0) - { - /* Yep, this is the entry. */ - break; - } - - /* Next entry. */ - elem += second; - } - while (symb_table[2 * elem] != 0); - } - return elem; - } - - /* Local function for parse_bracket_exp used in _LIBC environment. - Look up the collation sequence value of BR_ELEM. - Return the value if succeeded, UINT_MAX otherwise. */ - - auto inline unsigned int - __attribute ((always_inline)) - lookup_collation_sequence_value (br_elem) - bracket_elem_t *br_elem; - { - if (br_elem->type == SB_CHAR) - { - /* - if (MB_CUR_MAX == 1) - */ - if (nrules == 0) - return collseqmb[br_elem->opr.ch]; - else - { - wint_t wc = __btowc (br_elem->opr.ch); - return __collseq_table_lookup (collseqwc, wc); - } - } - else if (br_elem->type == MB_CHAR) - { - if (nrules != 0) - return __collseq_table_lookup (collseqwc, br_elem->opr.wch); - } - else if (br_elem->type == COLL_SYM) - { - size_t sym_name_len = strlen ((char *) br_elem->opr.name); - if (nrules != 0) - { - int32_t elem, idx; - elem = seek_collating_symbol_entry (br_elem->opr.name, - sym_name_len); - if (symb_table[2 * elem] != 0) - { - /* We found the entry. */ - idx = symb_table[2 * elem + 1]; - /* Skip the name of collating element name. */ - idx += 1 + extra[idx]; - /* Skip the byte sequence of the collating element. */ - idx += 1 + extra[idx]; - /* Adjust for the alignment. */ - idx = (idx + 3) & ~3; - /* Skip the multibyte collation sequence value. */ - idx += sizeof (unsigned int); - /* Skip the wide char sequence of the collating element. */ - idx += sizeof (unsigned int) * - (1 + *(unsigned int *) (extra + idx)); - /* Return the collation sequence value. */ - return *(unsigned int *) (extra + idx); - } - else if (symb_table[2 * elem] == 0 && sym_name_len == 1) - { - /* No valid character. Match it as a single byte - character. */ - return collseqmb[br_elem->opr.name[0]]; - } - } - else if (sym_name_len == 1) - return collseqmb[br_elem->opr.name[0]]; - } - return UINT_MAX; - } - - /* Local function for parse_bracket_exp used in _LIBC environement. - Build the range expression which starts from START_ELEM, and ends - at END_ELEM. The result are written to MBCSET and SBCSET. - RANGE_ALLOC is the allocated size of mbcset->range_starts, and - mbcset->range_ends, is a pointer argument sinse we may - update it. */ - - auto inline reg_errcode_t - __attribute ((always_inline)) - build_range_exp (sbcset, mbcset, range_alloc, start_elem, end_elem) - re_charset_t *mbcset; - int *range_alloc; - bitset_t sbcset; - bracket_elem_t *start_elem, *end_elem; - { - unsigned int ch; - uint32_t start_collseq; - uint32_t end_collseq; - - /* Equivalence Classes and Character Classes can't be a range - start/end. */ - if (BE (start_elem->type == EQUIV_CLASS || start_elem->type == CHAR_CLASS - || end_elem->type == EQUIV_CLASS || end_elem->type == CHAR_CLASS, - 0)) - return REG_ERANGE; - - start_collseq = lookup_collation_sequence_value (start_elem); - end_collseq = lookup_collation_sequence_value (end_elem); - /* Check start/end collation sequence values. */ - if (BE (start_collseq == UINT_MAX || end_collseq == UINT_MAX, 0)) - return REG_ECOLLATE; - if (BE ((syntax & RE_NO_EMPTY_RANGES) && start_collseq > end_collseq, 0)) - return REG_ERANGE; - - /* Got valid collation sequence values, add them as a new entry. - However, if we have no collation elements, and the character set - is single byte, the single byte character set that we - build below suffices. */ - if (nrules > 0 || dfa->mb_cur_max > 1) - { - /* Check the space of the arrays. */ - if (BE (*range_alloc == mbcset->nranges, 0)) - { - /* There is not enough space, need realloc. */ - uint32_t *new_array_start; - uint32_t *new_array_end; - int new_nranges; - - /* +1 in case of mbcset->nranges is 0. */ - new_nranges = 2 * mbcset->nranges + 1; - new_array_start = re_realloc (mbcset->range_starts, uint32_t, - new_nranges); - new_array_end = re_realloc (mbcset->range_ends, uint32_t, - new_nranges); - - if (BE (new_array_start == NULL || new_array_end == NULL, 0)) - return REG_ESPACE; - - mbcset->range_starts = new_array_start; - mbcset->range_ends = new_array_end; - *range_alloc = new_nranges; - } - - mbcset->range_starts[mbcset->nranges] = start_collseq; - mbcset->range_ends[mbcset->nranges++] = end_collseq; - } - - /* Build the table for single byte characters. */ - for (ch = 0; ch < SBC_MAX; ch++) - { - uint32_t ch_collseq; - /* - if (MB_CUR_MAX == 1) - */ - if (nrules == 0) - ch_collseq = collseqmb[ch]; - else - ch_collseq = __collseq_table_lookup (collseqwc, __btowc (ch)); - if (start_collseq <= ch_collseq && ch_collseq <= end_collseq) - bitset_set (sbcset, ch); - } - return REG_NOERROR; - } - - /* Local function for parse_bracket_exp used in _LIBC environement. - Build the collating element which is represented by NAME. - The result are written to MBCSET and SBCSET. - COLL_SYM_ALLOC is the allocated size of mbcset->coll_sym, is a - pointer argument sinse we may update it. */ - - auto inline reg_errcode_t - __attribute ((always_inline)) - build_collating_symbol (sbcset, mbcset, coll_sym_alloc, name) - re_charset_t *mbcset; - int *coll_sym_alloc; - bitset_t sbcset; - const unsigned char *name; - { - int32_t elem, idx; - size_t name_len = strlen ((const char *) name); - if (nrules != 0) - { - elem = seek_collating_symbol_entry (name, name_len); - if (symb_table[2 * elem] != 0) - { - /* We found the entry. */ - idx = symb_table[2 * elem + 1]; - /* Skip the name of collating element name. */ - idx += 1 + extra[idx]; - } - else if (symb_table[2 * elem] == 0 && name_len == 1) - { - /* No valid character, treat it as a normal - character. */ - bitset_set (sbcset, name[0]); - return REG_NOERROR; - } - else - return REG_ECOLLATE; - - /* Got valid collation sequence, add it as a new entry. */ - /* Check the space of the arrays. */ - if (BE (*coll_sym_alloc == mbcset->ncoll_syms, 0)) - { - /* Not enough, realloc it. */ - /* +1 in case of mbcset->ncoll_syms is 0. */ - int new_coll_sym_alloc = 2 * mbcset->ncoll_syms + 1; - /* Use realloc since mbcset->coll_syms is NULL - if *alloc == 0. */ - int32_t *new_coll_syms = re_realloc (mbcset->coll_syms, int32_t, - new_coll_sym_alloc); - if (BE (new_coll_syms == NULL, 0)) - return REG_ESPACE; - mbcset->coll_syms = new_coll_syms; - *coll_sym_alloc = new_coll_sym_alloc; - } - mbcset->coll_syms[mbcset->ncoll_syms++] = idx; - return REG_NOERROR; - } - else - { - if (BE (name_len != 1, 0)) - return REG_ECOLLATE; - else - { - bitset_set (sbcset, name[0]); - return REG_NOERROR; - } - } - } -#endif - - re_token_t br_token; - re_bitset_ptr_t sbcset; -#ifdef RE_ENABLE_I18N - re_charset_t *mbcset; - int coll_sym_alloc = 0, range_alloc = 0, mbchar_alloc = 0; - int equiv_class_alloc = 0, char_class_alloc = 0; -#endif /* not RE_ENABLE_I18N */ - int non_match = 0; - bin_tree_t *work_tree; - int token_len; - int first_round = 1; -#ifdef _LIBC - collseqmb = (const unsigned char *) - _NL_CURRENT (LC_COLLATE, _NL_COLLATE_COLLSEQMB); - nrules = _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES); - if (nrules) - { - /* - if (MB_CUR_MAX > 1) - */ - collseqwc = _NL_CURRENT (LC_COLLATE, _NL_COLLATE_COLLSEQWC); - table_size = _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_SYMB_HASH_SIZEMB); - symb_table = (const int32_t *) _NL_CURRENT (LC_COLLATE, - _NL_COLLATE_SYMB_TABLEMB); - extra = (const unsigned char *) _NL_CURRENT (LC_COLLATE, - _NL_COLLATE_SYMB_EXTRAMB); - } -#endif - sbcset = (re_bitset_ptr_t) calloc (sizeof (bitset_t), 1); -#ifdef RE_ENABLE_I18N - mbcset = (re_charset_t *) calloc (sizeof (re_charset_t), 1); -#endif /* RE_ENABLE_I18N */ -#ifdef RE_ENABLE_I18N - if (BE (sbcset == NULL || mbcset == NULL, 0)) -#else - if (BE (sbcset == NULL, 0)) -#endif /* RE_ENABLE_I18N */ - { - *err = REG_ESPACE; - return NULL; - } - - token_len = peek_token_bracket (token, regexp, syntax); - if (BE (token->type == END_OF_RE, 0)) - { - *err = REG_BADPAT; - goto parse_bracket_exp_free_return; - } - if (token->type == OP_NON_MATCH_LIST) - { -#ifdef RE_ENABLE_I18N - mbcset->non_match = 1; -#endif /* not RE_ENABLE_I18N */ - non_match = 1; - if (syntax & RE_HAT_LISTS_NOT_NEWLINE) - bitset_set (sbcset, '\n'); - re_string_skip_bytes (regexp, token_len); /* Skip a token. */ - token_len = peek_token_bracket (token, regexp, syntax); - if (BE (token->type == END_OF_RE, 0)) - { - *err = REG_BADPAT; - goto parse_bracket_exp_free_return; - } - } - - /* We treat the first ']' as a normal character. */ - if (token->type == OP_CLOSE_BRACKET) - token->type = CHARACTER; - - while (1) - { - bracket_elem_t start_elem, end_elem; - unsigned char start_name_buf[BRACKET_NAME_BUF_SIZE]; - unsigned char end_name_buf[BRACKET_NAME_BUF_SIZE]; - reg_errcode_t ret; - int token_len2 = 0, is_range_exp = 0; - re_token_t token2; - - start_elem.opr.name = start_name_buf; - ret = parse_bracket_element (&start_elem, regexp, token, token_len, dfa, - syntax, first_round); - if (BE (ret != REG_NOERROR, 0)) - { - *err = ret; - goto parse_bracket_exp_free_return; - } - first_round = 0; - - /* Get information about the next token. We need it in any case. */ - token_len = peek_token_bracket (token, regexp, syntax); - - /* Do not check for ranges if we know they are not allowed. */ - if (start_elem.type != CHAR_CLASS && start_elem.type != EQUIV_CLASS) - { - if (BE (token->type == END_OF_RE, 0)) - { - *err = REG_EBRACK; - goto parse_bracket_exp_free_return; - } - if (token->type == OP_CHARSET_RANGE) - { - re_string_skip_bytes (regexp, token_len); /* Skip '-'. */ - token_len2 = peek_token_bracket (&token2, regexp, syntax); - if (BE (token2.type == END_OF_RE, 0)) - { - *err = REG_EBRACK; - goto parse_bracket_exp_free_return; - } - if (token2.type == OP_CLOSE_BRACKET) - { - /* We treat the last '-' as a normal character. */ - re_string_skip_bytes (regexp, -token_len); - token->type = CHARACTER; - } - else - is_range_exp = 1; - } - } - - if (is_range_exp == 1) - { - end_elem.opr.name = end_name_buf; - ret = parse_bracket_element (&end_elem, regexp, &token2, token_len2, - dfa, syntax, 1); - if (BE (ret != REG_NOERROR, 0)) - { - *err = ret; - goto parse_bracket_exp_free_return; - } - - token_len = peek_token_bracket (token, regexp, syntax); - -#ifdef _LIBC - *err = build_range_exp (sbcset, mbcset, &range_alloc, - &start_elem, &end_elem); -#else -# ifdef RE_ENABLE_I18N - *err = build_range_exp (sbcset, - dfa->mb_cur_max > 1 ? mbcset : NULL, - &range_alloc, &start_elem, &end_elem); -# else - *err = build_range_exp (sbcset, &start_elem, &end_elem); -# endif -#endif /* RE_ENABLE_I18N */ - if (BE (*err != REG_NOERROR, 0)) - goto parse_bracket_exp_free_return; - } - else - { - switch (start_elem.type) - { - case SB_CHAR: - bitset_set (sbcset, start_elem.opr.ch); - break; -#ifdef RE_ENABLE_I18N - case MB_CHAR: - /* Check whether the array has enough space. */ - if (BE (mbchar_alloc == mbcset->nmbchars, 0)) - { - wchar_t *new_mbchars; - /* Not enough, realloc it. */ - /* +1 in case of mbcset->nmbchars is 0. */ - mbchar_alloc = 2 * mbcset->nmbchars + 1; - /* Use realloc since array is NULL if *alloc == 0. */ - new_mbchars = re_realloc (mbcset->mbchars, wchar_t, - mbchar_alloc); - if (BE (new_mbchars == NULL, 0)) - goto parse_bracket_exp_espace; - mbcset->mbchars = new_mbchars; - } - mbcset->mbchars[mbcset->nmbchars++] = start_elem.opr.wch; - break; -#endif /* RE_ENABLE_I18N */ - case EQUIV_CLASS: - *err = build_equiv_class (sbcset, -#ifdef RE_ENABLE_I18N - mbcset, &equiv_class_alloc, -#endif /* RE_ENABLE_I18N */ - start_elem.opr.name); - if (BE (*err != REG_NOERROR, 0)) - goto parse_bracket_exp_free_return; - break; - case COLL_SYM: - *err = build_collating_symbol (sbcset, -#ifdef RE_ENABLE_I18N - mbcset, &coll_sym_alloc, -#endif /* RE_ENABLE_I18N */ - start_elem.opr.name); - if (BE (*err != REG_NOERROR, 0)) - goto parse_bracket_exp_free_return; - break; - case CHAR_CLASS: - *err = build_charclass (regexp->trans, sbcset, -#ifdef RE_ENABLE_I18N - mbcset, &char_class_alloc, -#endif /* RE_ENABLE_I18N */ - (const char *) start_elem.opr.name, syntax); - if (BE (*err != REG_NOERROR, 0)) - goto parse_bracket_exp_free_return; - break; - default: - assert (0); - break; - } - } - if (BE (token->type == END_OF_RE, 0)) - { - *err = REG_EBRACK; - goto parse_bracket_exp_free_return; - } - if (token->type == OP_CLOSE_BRACKET) - break; - } - - re_string_skip_bytes (regexp, token_len); /* Skip a token. */ - - /* If it is non-matching list. */ - if (non_match) - bitset_not (sbcset); - -#ifdef RE_ENABLE_I18N - /* Ensure only single byte characters are set. */ - if (dfa->mb_cur_max > 1) - bitset_mask (sbcset, dfa->sb_char); - - if (mbcset->nmbchars || mbcset->ncoll_syms || mbcset->nequiv_classes - || mbcset->nranges || (dfa->mb_cur_max > 1 && (mbcset->nchar_classes - || mbcset->non_match))) - { - bin_tree_t *mbc_tree; - int sbc_idx; - /* Build a tree for complex bracket. */ - dfa->has_mb_node = 1; - br_token.type = COMPLEX_BRACKET; - br_token.opr.mbcset = mbcset; - mbc_tree = create_token_tree (dfa, NULL, NULL, &br_token); - if (BE (mbc_tree == NULL, 0)) - goto parse_bracket_exp_espace; - for (sbc_idx = 0; sbc_idx < BITSET_WORDS; ++sbc_idx) - if (sbcset[sbc_idx]) - break; - /* If there are no bits set in sbcset, there is no point - of having both SIMPLE_BRACKET and COMPLEX_BRACKET. */ - if (sbc_idx < BITSET_WORDS) - { - /* Build a tree for simple bracket. */ - br_token.type = SIMPLE_BRACKET; - br_token.opr.sbcset = sbcset; - work_tree = create_token_tree (dfa, NULL, NULL, &br_token); - if (BE (work_tree == NULL, 0)) - goto parse_bracket_exp_espace; - - /* Then join them by ALT node. */ - work_tree = create_tree (dfa, work_tree, mbc_tree, OP_ALT); - if (BE (work_tree == NULL, 0)) - goto parse_bracket_exp_espace; - } - else - { - re_free (sbcset); - work_tree = mbc_tree; - } - } - else -#endif /* not RE_ENABLE_I18N */ - { -#ifdef RE_ENABLE_I18N - free_charset (mbcset); -#endif - /* Build a tree for simple bracket. */ - br_token.type = SIMPLE_BRACKET; - br_token.opr.sbcset = sbcset; - work_tree = create_token_tree (dfa, NULL, NULL, &br_token); - if (BE (work_tree == NULL, 0)) - goto parse_bracket_exp_espace; - } - return work_tree; - - parse_bracket_exp_espace: - *err = REG_ESPACE; - parse_bracket_exp_free_return: - re_free (sbcset); -#ifdef RE_ENABLE_I18N - free_charset (mbcset); -#endif /* RE_ENABLE_I18N */ - return NULL; -} - -/* Parse an element in the bracket expression. */ - -static reg_errcode_t -parse_bracket_element (bracket_elem_t *elem, re_string_t *regexp, - re_token_t *token, int token_len, UNUSED re_dfa_t *dfa, - reg_syntax_t syntax, int accept_hyphen) -{ -#ifdef RE_ENABLE_I18N - int cur_char_size; - cur_char_size = re_string_char_size_at (regexp, re_string_cur_idx (regexp)); - if (cur_char_size > 1) - { - elem->type = MB_CHAR; - elem->opr.wch = re_string_wchar_at (regexp, re_string_cur_idx (regexp)); - re_string_skip_bytes (regexp, cur_char_size); - return REG_NOERROR; - } -#endif /* RE_ENABLE_I18N */ - re_string_skip_bytes (regexp, token_len); /* Skip a token. */ - if (token->type == OP_OPEN_COLL_ELEM || token->type == OP_OPEN_CHAR_CLASS - || token->type == OP_OPEN_EQUIV_CLASS) - return parse_bracket_symbol (elem, regexp, token); - if (BE (token->type == OP_CHARSET_RANGE, 0) && !accept_hyphen) - { - /* A '-' must only appear as anything but a range indicator before - the closing bracket. Everything else is an error. */ - re_token_t token2; - (void) peek_token_bracket (&token2, regexp, syntax); - if (token2.type != OP_CLOSE_BRACKET) - /* The actual error value is not standardized since this whole - case is undefined. But ERANGE makes good sense. */ - return REG_ERANGE; - } - elem->type = SB_CHAR; - elem->opr.ch = token->opr.c; - return REG_NOERROR; -} - -/* Parse a bracket symbol in the bracket expression. Bracket symbols are - such as [::], [..], and - [==]. */ - -static reg_errcode_t -parse_bracket_symbol (bracket_elem_t *elem, re_string_t *regexp, - re_token_t *token) -{ - unsigned char ch, delim = token->opr.c; - int i = 0; - if (re_string_eoi(regexp)) - return REG_EBRACK; - for (;; ++i) - { - if (i >= BRACKET_NAME_BUF_SIZE) - return REG_EBRACK; - if (token->type == OP_OPEN_CHAR_CLASS) - ch = re_string_fetch_byte_case (regexp); - else - ch = re_string_fetch_byte (regexp); - if (re_string_eoi(regexp)) - return REG_EBRACK; - if (ch == delim && re_string_peek_byte (regexp, 0) == ']') - break; - elem->opr.name[i] = ch; - } - re_string_skip_bytes (regexp, 1); - elem->opr.name[i] = '\0'; - switch (token->type) - { - case OP_OPEN_COLL_ELEM: - elem->type = COLL_SYM; - break; - case OP_OPEN_EQUIV_CLASS: - elem->type = EQUIV_CLASS; - break; - case OP_OPEN_CHAR_CLASS: - elem->type = CHAR_CLASS; - break; - default: - break; - } - return REG_NOERROR; -} - - /* Helper function for parse_bracket_exp. - Build the equivalence class which is represented by NAME. - The result are written to MBCSET and SBCSET. - EQUIV_CLASS_ALLOC is the allocated size of mbcset->equiv_classes, - is a pointer argument sinse we may update it. */ - -static reg_errcode_t -#ifdef RE_ENABLE_I18N -build_equiv_class (bitset_t sbcset, re_charset_t *mbcset, - int *equiv_class_alloc, const unsigned char *name) -#else /* not RE_ENABLE_I18N */ -build_equiv_class (bitset_t sbcset, const unsigned char *name) -#endif /* not RE_ENABLE_I18N */ -{ -#ifdef _LIBC - uint32_t nrules = _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES); - if (nrules != 0) - { - const int32_t *table, *indirect; - const unsigned char *weights, *extra, *cp; - unsigned char char_buf[2]; - int32_t idx1, idx2; - unsigned int ch; - size_t len; - /* This #include defines a local function! */ -# include - /* Calculate the index for equivalence class. */ - cp = name; - table = (const int32_t *) _NL_CURRENT (LC_COLLATE, _NL_COLLATE_TABLEMB); - weights = (const unsigned char *) _NL_CURRENT (LC_COLLATE, - _NL_COLLATE_WEIGHTMB); - extra = (const unsigned char *) _NL_CURRENT (LC_COLLATE, - _NL_COLLATE_EXTRAMB); - indirect = (const int32_t *) _NL_CURRENT (LC_COLLATE, - _NL_COLLATE_INDIRECTMB); - idx1 = findidx (&cp); - if (BE (idx1 == 0 || cp < name + strlen ((const char *) name), 0)) - /* This isn't a valid character. */ - return REG_ECOLLATE; - - /* Build single byte matcing table for this equivalence class. */ - char_buf[1] = (unsigned char) '\0'; - len = weights[idx1 & 0xffffff]; - for (ch = 0; ch < SBC_MAX; ++ch) - { - char_buf[0] = ch; - cp = char_buf; - idx2 = findidx (&cp); -/* - idx2 = table[ch]; -*/ - if (idx2 == 0) - /* This isn't a valid character. */ - continue; - /* Compare only if the length matches and the collation rule - index is the same. */ - if (len == weights[idx2 & 0xffffff] && (idx1 >> 24) == (idx2 >> 24)) - { - int cnt = 0; - - while (cnt <= len && - weights[(idx1 & 0xffffff) + 1 + cnt] - == weights[(idx2 & 0xffffff) + 1 + cnt]) - ++cnt; - - if (cnt > len) - bitset_set (sbcset, ch); - } - } - /* Check whether the array has enough space. */ - if (BE (*equiv_class_alloc == mbcset->nequiv_classes, 0)) - { - /* Not enough, realloc it. */ - /* +1 in case of mbcset->nequiv_classes is 0. */ - int new_equiv_class_alloc = 2 * mbcset->nequiv_classes + 1; - /* Use realloc since the array is NULL if *alloc == 0. */ - int32_t *new_equiv_classes = re_realloc (mbcset->equiv_classes, - int32_t, - new_equiv_class_alloc); - if (BE (new_equiv_classes == NULL, 0)) - return REG_ESPACE; - mbcset->equiv_classes = new_equiv_classes; - *equiv_class_alloc = new_equiv_class_alloc; - } - mbcset->equiv_classes[mbcset->nequiv_classes++] = idx1; - } - else -#endif /* _LIBC */ - { - if (BE (strlen ((const char *) name) != 1, 0)) - return REG_ECOLLATE; - bitset_set (sbcset, *name); - } - return REG_NOERROR; -} - - /* Helper function for parse_bracket_exp. - Build the character class which is represented by NAME. - The result are written to MBCSET and SBCSET. - CHAR_CLASS_ALLOC is the allocated size of mbcset->char_classes, - is a pointer argument sinse we may update it. */ - -static reg_errcode_t -#ifdef RE_ENABLE_I18N -build_charclass (RE_TRANSLATE_TYPE trans, bitset_t sbcset, - re_charset_t *mbcset, int *char_class_alloc, - const char *class_name, reg_syntax_t syntax) -#else /* not RE_ENABLE_I18N */ -build_charclass (RE_TRANSLATE_TYPE trans, bitset_t sbcset, - const char *class_name, reg_syntax_t syntax) -#endif /* not RE_ENABLE_I18N */ -{ - int i; - - /* In case of REG_ICASE "upper" and "lower" match the both of - upper and lower cases. */ - if ((syntax & RE_ICASE) - && (strcmp (class_name, "upper") == 0 || strcmp (class_name, "lower") == 0)) - class_name = "alpha"; - -#ifdef RE_ENABLE_I18N - /* Check the space of the arrays. */ - if (BE (*char_class_alloc == mbcset->nchar_classes, 0)) - { - /* Not enough, realloc it. */ - /* +1 in case of mbcset->nchar_classes is 0. */ - int new_char_class_alloc = 2 * mbcset->nchar_classes + 1; - /* Use realloc since array is NULL if *alloc == 0. */ - wctype_t *new_char_classes = re_realloc (mbcset->char_classes, wctype_t, - new_char_class_alloc); - if (BE (new_char_classes == NULL, 0)) - return REG_ESPACE; - mbcset->char_classes = new_char_classes; - *char_class_alloc = new_char_class_alloc; - } - mbcset->char_classes[mbcset->nchar_classes++] = __wctype (class_name); -#endif /* RE_ENABLE_I18N */ - -#define BUILD_CHARCLASS_LOOP(ctype_func) \ - do { \ - if (BE (trans != NULL, 0)) \ - { \ - for (i = 0; i < SBC_MAX; ++i) \ - if (ctype_func (i)) \ - bitset_set (sbcset, trans[i]); \ - } \ - else \ - { \ - for (i = 0; i < SBC_MAX; ++i) \ - if (ctype_func (i)) \ - bitset_set (sbcset, i); \ - } \ - } while (0) - - if (strcmp (class_name, "alnum") == 0) - BUILD_CHARCLASS_LOOP (isalnum); - else if (strcmp (class_name, "cntrl") == 0) - BUILD_CHARCLASS_LOOP (iscntrl); - else if (strcmp (class_name, "lower") == 0) - BUILD_CHARCLASS_LOOP (islower); - else if (strcmp (class_name, "space") == 0) - BUILD_CHARCLASS_LOOP (isspace); - else if (strcmp (class_name, "alpha") == 0) - BUILD_CHARCLASS_LOOP (isalpha); - else if (strcmp (class_name, "digit") == 0) - BUILD_CHARCLASS_LOOP (isdigit); - else if (strcmp (class_name, "print") == 0) - BUILD_CHARCLASS_LOOP (isprint); - else if (strcmp (class_name, "upper") == 0) - BUILD_CHARCLASS_LOOP (isupper); - else if (strcmp (class_name, "blank") == 0) -#ifndef GAWK - BUILD_CHARCLASS_LOOP (isblank); -#else - /* see comments above */ - BUILD_CHARCLASS_LOOP (is_blank); -#endif - else if (strcmp (class_name, "graph") == 0) - BUILD_CHARCLASS_LOOP (isgraph); - else if (strcmp (class_name, "punct") == 0) - BUILD_CHARCLASS_LOOP (ispunct); - else if (strcmp (class_name, "xdigit") == 0) - BUILD_CHARCLASS_LOOP (isxdigit); - else - return REG_ECTYPE; - - return REG_NOERROR; -} - -static bin_tree_t * -build_charclass_op (re_dfa_t *dfa, RE_TRANSLATE_TYPE trans, - const char *class_name, - const char *extra, int non_match, - reg_errcode_t *err) -{ - re_bitset_ptr_t sbcset; -#ifdef RE_ENABLE_I18N - re_charset_t *mbcset; - int alloc = 0; -#endif /* not RE_ENABLE_I18N */ - reg_errcode_t ret; - re_token_t br_token; - bin_tree_t *tree; - - sbcset = (re_bitset_ptr_t) calloc (sizeof (bitset_t), 1); -#ifdef RE_ENABLE_I18N - mbcset = (re_charset_t *) calloc (sizeof (re_charset_t), 1); -#endif /* RE_ENABLE_I18N */ - -#ifdef RE_ENABLE_I18N - if (BE (sbcset == NULL || mbcset == NULL, 0)) -#else /* not RE_ENABLE_I18N */ - if (BE (sbcset == NULL, 0)) -#endif /* not RE_ENABLE_I18N */ - { - *err = REG_ESPACE; - return NULL; - } - - if (non_match) - { -#ifdef RE_ENABLE_I18N - mbcset->non_match = 1; -#endif /* not RE_ENABLE_I18N */ - } - - /* We don't care the syntax in this case. */ - ret = build_charclass (trans, sbcset, -#ifdef RE_ENABLE_I18N - mbcset, &alloc, -#endif /* RE_ENABLE_I18N */ - class_name, 0); - - if (BE (ret != REG_NOERROR, 0)) - { - re_free (sbcset); -#ifdef RE_ENABLE_I18N - free_charset (mbcset); -#endif /* RE_ENABLE_I18N */ - *err = ret; - return NULL; - } - /* \w match '_' also. */ - for (; *extra; extra++) - bitset_set (sbcset, *extra); - - /* If it is non-matching list. */ - if (non_match) - bitset_not (sbcset); - -#ifdef RE_ENABLE_I18N - /* Ensure only single byte characters are set. */ - if (dfa->mb_cur_max > 1) - bitset_mask (sbcset, dfa->sb_char); -#endif - - /* Build a tree for simple bracket. */ - br_token.type = SIMPLE_BRACKET; - br_token.opr.sbcset = sbcset; - tree = create_token_tree (dfa, NULL, NULL, &br_token); - if (BE (tree == NULL, 0)) - goto build_word_op_espace; - -#ifdef RE_ENABLE_I18N - if (dfa->mb_cur_max > 1) - { - bin_tree_t *mbc_tree; - /* Build a tree for complex bracket. */ - br_token.type = COMPLEX_BRACKET; - br_token.opr.mbcset = mbcset; - dfa->has_mb_node = 1; - mbc_tree = create_token_tree (dfa, NULL, NULL, &br_token); - if (BE (mbc_tree == NULL, 0)) - goto build_word_op_espace; - /* Then join them by ALT node. */ - tree = create_tree (dfa, tree, mbc_tree, OP_ALT); - if (BE (mbc_tree != NULL, 1)) - return tree; - } - else - { - free_charset (mbcset); - return tree; - } -#else /* not RE_ENABLE_I18N */ - return tree; -#endif /* not RE_ENABLE_I18N */ - - build_word_op_espace: - re_free (sbcset); -#ifdef RE_ENABLE_I18N - free_charset (mbcset); -#endif /* RE_ENABLE_I18N */ - *err = REG_ESPACE; - return NULL; -} - -/* This is intended for the expressions like "a{1,3}". - Fetch a number from `input', and return the number. - Return -1, if the number field is empty like "{,1}". - Return -2, If an error is occured. */ - -static int -fetch_number (re_string_t *input, re_token_t *token, reg_syntax_t syntax) -{ - int num = -1; - unsigned char c; - while (1) - { - fetch_token (token, input, syntax); - c = token->opr.c; - if (BE (token->type == END_OF_RE, 0)) - return -2; - if (token->type == OP_CLOSE_DUP_NUM || c == ',') - break; - num = ((token->type != CHARACTER || c < '0' || '9' < c || num == -2) - ? -2 : ((num == -1) ? c - '0' : num * 10 + c - '0')); - num = (num > RE_DUP_MAX) ? -2 : num; - } - return num; -} - -#ifdef RE_ENABLE_I18N -static void -free_charset (re_charset_t *cset) -{ - re_free (cset->mbchars); -# ifdef _LIBC - re_free (cset->coll_syms); - re_free (cset->equiv_classes); - re_free (cset->range_starts); - re_free (cset->range_ends); -# endif - re_free (cset->char_classes); - re_free (cset); -} -#endif /* RE_ENABLE_I18N */ - -/* Functions for binary tree operation. */ - -/* Create a tree node. */ - -static bin_tree_t * -create_tree (re_dfa_t *dfa, bin_tree_t *left, bin_tree_t *right, - re_token_type_t type) -{ - re_token_t t; - t.type = type; - return create_token_tree (dfa, left, right, &t); -} - -static bin_tree_t * -create_token_tree (re_dfa_t *dfa, bin_tree_t *left, bin_tree_t *right, - const re_token_t *token) -{ - bin_tree_t *tree; - if (BE (dfa->str_tree_storage_idx == BIN_TREE_STORAGE_SIZE, 0)) - { - bin_tree_storage_t *storage = re_malloc (bin_tree_storage_t, 1); - - if (storage == NULL) - return NULL; - storage->next = dfa->str_tree_storage; - dfa->str_tree_storage = storage; - dfa->str_tree_storage_idx = 0; - } - tree = &dfa->str_tree_storage->data[dfa->str_tree_storage_idx++]; - - tree->parent = NULL; - tree->left = left; - tree->right = right; - tree->token = *token; - tree->token.duplicated = 0; - tree->token.opt_subexp = 0; - tree->first = NULL; - tree->next = NULL; - tree->node_idx = -1; - - if (left != NULL) - left->parent = tree; - if (right != NULL) - right->parent = tree; - return tree; -} - -/* Mark the tree SRC as an optional subexpression. - To be called from preorder or postorder. */ - -static reg_errcode_t -mark_opt_subexp (void *extra, bin_tree_t *node) -{ - int idx = (int) (long) extra; - if (node->token.type == SUBEXP && node->token.opr.idx == idx) - node->token.opt_subexp = 1; - - return REG_NOERROR; -} - -/* Free the allocated memory inside NODE. */ - -static void -free_token (re_token_t *node) -{ -#ifdef RE_ENABLE_I18N - if (node->type == COMPLEX_BRACKET && node->duplicated == 0) - free_charset (node->opr.mbcset); - else -#endif /* RE_ENABLE_I18N */ - if (node->type == SIMPLE_BRACKET && node->duplicated == 0) - re_free (node->opr.sbcset); -} - -/* Worker function for tree walking. Free the allocated memory inside NODE - and its children. */ - -static reg_errcode_t -free_tree (UNUSED void *extra, bin_tree_t *node) -{ - free_token (&node->token); - return REG_NOERROR; -} - - -/* Duplicate the node SRC, and return new node. This is a preorder - visit similar to the one implemented by the generic visitor, but - we need more infrastructure to maintain two parallel trees --- so, - it's easier to duplicate. */ - -static bin_tree_t * -duplicate_tree (const bin_tree_t *root, re_dfa_t *dfa) -{ - const bin_tree_t *node; - bin_tree_t *dup_root; - bin_tree_t **p_new = &dup_root, *dup_node = root->parent; - - for (node = root; ; ) - { - /* Create a new tree and link it back to the current parent. */ - *p_new = create_token_tree (dfa, NULL, NULL, &node->token); - if (*p_new == NULL) - return NULL; - (*p_new)->parent = dup_node; - (*p_new)->token.duplicated = 1; - dup_node = *p_new; - - /* Go to the left node, or up and to the right. */ - if (node->left) - { - node = node->left; - p_new = &dup_node->left; - } - else - { - const bin_tree_t *prev = NULL; - while (node->right == prev || node->right == NULL) - { - prev = node; - node = node->parent; - dup_node = dup_node->parent; - if (!node) - return dup_root; - } - node = node->right; - p_new = &dup_node->right; - } - } -} diff --git a/vendor/libgit2/deps/regex/regex.c b/vendor/libgit2/deps/regex/regex.c deleted file mode 100644 index 225a001ee9..0000000000 --- a/vendor/libgit2/deps/regex/regex.c +++ /dev/null @@ -1,92 +0,0 @@ -/* Extended regular expression matching and search library. - Copyright (C) 2002, 2003, 2005 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Isamu Hasegawa . - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, write to the Free - Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - 02110-1301 USA. */ - -#include "config.h" - -/* Make sure noone compiles this code with a C++ compiler. */ -#ifdef __cplusplus -# error "This is C code, use a C compiler" -#endif - -#ifdef _LIBC -/* We have to keep the namespace clean. */ -# define regfree(preg) __regfree (preg) -# define regexec(pr, st, nm, pm, ef) __regexec (pr, st, nm, pm, ef) -# define regcomp(preg, pattern, cflags) __regcomp (preg, pattern, cflags) -# define regerror(errcode, preg, errbuf, errbuf_size) \ - __regerror(errcode, preg, errbuf, errbuf_size) -# define re_set_registers(bu, re, nu, st, en) \ - __re_set_registers (bu, re, nu, st, en) -# define re_match_2(bufp, string1, size1, string2, size2, pos, regs, stop) \ - __re_match_2 (bufp, string1, size1, string2, size2, pos, regs, stop) -# define re_match(bufp, string, size, pos, regs) \ - __re_match (bufp, string, size, pos, regs) -# define re_search(bufp, string, size, startpos, range, regs) \ - __re_search (bufp, string, size, startpos, range, regs) -# define re_compile_pattern(pattern, length, bufp) \ - __re_compile_pattern (pattern, length, bufp) -# define re_set_syntax(syntax) __re_set_syntax (syntax) -# define re_search_2(bufp, st1, s1, st2, s2, startpos, range, regs, stop) \ - __re_search_2 (bufp, st1, s1, st2, s2, startpos, range, regs, stop) -# define re_compile_fastmap(bufp) __re_compile_fastmap (bufp) - -# include "../locale/localeinfo.h" -#endif - -#if defined (_MSC_VER) -#include /* for size_t */ -#endif - -/* On some systems, limits.h sets RE_DUP_MAX to a lower value than - GNU regex allows. Include it before , which correctly - #undefs RE_DUP_MAX and sets it to the right value. */ -#include - -#ifdef GAWK -#undef alloca -#define alloca alloca_is_bad_you_should_never_use_it -#endif -#include -#include "regex_internal.h" - -#include "regex_internal.c" - -#ifdef GAWK -# define bool int - -# ifndef true -# define true (1) -# endif - -# ifndef false -# define false (0) -# endif -#endif -#include "regcomp.c" -#include "regexec.c" - -/* Binary backward compatibility. */ -#if _LIBC -# include -# if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_3) -link_warning (re_max_failures, "the 're_max_failures' variable is obsolete and will go away.") -int re_max_failures = 2000; -# endif -#endif diff --git a/vendor/libgit2/deps/regex/regex.h b/vendor/libgit2/deps/regex/regex.h deleted file mode 100644 index 61c9683872..0000000000 --- a/vendor/libgit2/deps/regex/regex.h +++ /dev/null @@ -1,582 +0,0 @@ -#include -#include - -/* Definitions for data structures and routines for the regular - expression library. - Copyright (C) 1985,1989-93,1995-98,2000,2001,2002,2003,2005,2006,2008 - Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, write to the Free - Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - 02110-1301 USA. */ - -#ifndef _REGEX_H -#define _REGEX_H 1 - -#ifdef HAVE_STDDEF_H -#include -#endif - -#ifdef HAVE_SYS_TYPES_H -#include -#endif - -#ifndef _LIBC -#define __USE_GNU 1 -#endif - -/* Allow the use in C++ code. */ -#ifdef __cplusplus -extern "C" { -#endif - -/* The following two types have to be signed and unsigned integer type - wide enough to hold a value of a pointer. For most ANSI compilers - ptrdiff_t and size_t should be likely OK. Still size of these two - types is 2 for Microsoft C. Ugh... */ -typedef long int s_reg_t; -typedef unsigned long int active_reg_t; - -/* The following bits are used to determine the regexp syntax we - recognize. The set/not-set meanings are chosen so that Emacs syntax - remains the value 0. The bits are given in alphabetical order, and - the definitions shifted by one from the previous bit; thus, when we - add or remove a bit, only one other definition need change. */ -typedef unsigned long int reg_syntax_t; - -#ifdef __USE_GNU -/* If this bit is not set, then \ inside a bracket expression is literal. - If set, then such a \ quotes the following character. */ -# define RE_BACKSLASH_ESCAPE_IN_LISTS ((unsigned long int) 1) - -/* If this bit is not set, then + and ? are operators, and \+ and \? are - literals. - If set, then \+ and \? are operators and + and ? are literals. */ -# define RE_BK_PLUS_QM (RE_BACKSLASH_ESCAPE_IN_LISTS << 1) - -/* If this bit is set, then character classes are supported. They are: - [:alpha:], [:upper:], [:lower:], [:digit:], [:alnum:], [:xdigit:], - [:space:], [:print:], [:punct:], [:graph:], and [:cntrl:]. - If not set, then character classes are not supported. */ -# define RE_CHAR_CLASSES (RE_BK_PLUS_QM << 1) - -/* If this bit is set, then ^ and $ are always anchors (outside bracket - expressions, of course). - If this bit is not set, then it depends: - ^ is an anchor if it is at the beginning of a regular - expression or after an open-group or an alternation operator; - $ is an anchor if it is at the end of a regular expression, or - before a close-group or an alternation operator. - - This bit could be (re)combined with RE_CONTEXT_INDEP_OPS, because - POSIX draft 11.2 says that * etc. in leading positions is undefined. - We already implemented a previous draft which made those constructs - invalid, though, so we haven't changed the code back. */ -# define RE_CONTEXT_INDEP_ANCHORS (RE_CHAR_CLASSES << 1) - -/* If this bit is set, then special characters are always special - regardless of where they are in the pattern. - If this bit is not set, then special characters are special only in - some contexts; otherwise they are ordinary. Specifically, - * + ? and intervals are only special when not after the beginning, - open-group, or alternation operator. */ -# define RE_CONTEXT_INDEP_OPS (RE_CONTEXT_INDEP_ANCHORS << 1) - -/* If this bit is set, then *, +, ?, and { cannot be first in an re or - immediately after an alternation or begin-group operator. */ -# define RE_CONTEXT_INVALID_OPS (RE_CONTEXT_INDEP_OPS << 1) - -/* If this bit is set, then . matches newline. - If not set, then it doesn't. */ -# define RE_DOT_NEWLINE (RE_CONTEXT_INVALID_OPS << 1) - -/* If this bit is set, then . doesn't match NUL. - If not set, then it does. */ -# define RE_DOT_NOT_NULL (RE_DOT_NEWLINE << 1) - -/* If this bit is set, nonmatching lists [^...] do not match newline. - If not set, they do. */ -# define RE_HAT_LISTS_NOT_NEWLINE (RE_DOT_NOT_NULL << 1) - -/* If this bit is set, either \{...\} or {...} defines an - interval, depending on RE_NO_BK_BRACES. - If not set, \{, \}, {, and } are literals. */ -# define RE_INTERVALS (RE_HAT_LISTS_NOT_NEWLINE << 1) - -/* If this bit is set, +, ? and | aren't recognized as operators. - If not set, they are. */ -# define RE_LIMITED_OPS (RE_INTERVALS << 1) - -/* If this bit is set, newline is an alternation operator. - If not set, newline is literal. */ -# define RE_NEWLINE_ALT (RE_LIMITED_OPS << 1) - -/* If this bit is set, then `{...}' defines an interval, and \{ and \} - are literals. - If not set, then `\{...\}' defines an interval. */ -# define RE_NO_BK_BRACES (RE_NEWLINE_ALT << 1) - -/* If this bit is set, (...) defines a group, and \( and \) are literals. - If not set, \(...\) defines a group, and ( and ) are literals. */ -# define RE_NO_BK_PARENS (RE_NO_BK_BRACES << 1) - -/* If this bit is set, then \ matches . - If not set, then \ is a back-reference. */ -# define RE_NO_BK_REFS (RE_NO_BK_PARENS << 1) - -/* If this bit is set, then | is an alternation operator, and \| is literal. - If not set, then \| is an alternation operator, and | is literal. */ -# define RE_NO_BK_VBAR (RE_NO_BK_REFS << 1) - -/* If this bit is set, then an ending range point collating higher - than the starting range point, as in [z-a], is invalid. - If not set, then when ending range point collates higher than the - starting range point, the range is ignored. */ -# define RE_NO_EMPTY_RANGES (RE_NO_BK_VBAR << 1) - -/* If this bit is set, then an unmatched ) is ordinary. - If not set, then an unmatched ) is invalid. */ -# define RE_UNMATCHED_RIGHT_PAREN_ORD (RE_NO_EMPTY_RANGES << 1) - -/* If this bit is set, succeed as soon as we match the whole pattern, - without further backtracking. */ -# define RE_NO_POSIX_BACKTRACKING (RE_UNMATCHED_RIGHT_PAREN_ORD << 1) - -/* If this bit is set, do not process the GNU regex operators. - If not set, then the GNU regex operators are recognized. */ -# define RE_NO_GNU_OPS (RE_NO_POSIX_BACKTRACKING << 1) - -/* If this bit is set, a syntactically invalid interval is treated as - a string of ordinary characters. For example, the ERE 'a{1' is - treated as 'a\{1'. */ -# define RE_INVALID_INTERVAL_ORD (RE_NO_GNU_OPS << 1) - -/* If this bit is set, then ignore case when matching. - If not set, then case is significant. */ -# define RE_ICASE (RE_INVALID_INTERVAL_ORD << 1) - -/* This bit is used internally like RE_CONTEXT_INDEP_ANCHORS but only - for ^, because it is difficult to scan the regex backwards to find - whether ^ should be special. */ -# define RE_CARET_ANCHORS_HERE (RE_ICASE << 1) - -/* If this bit is set, then \{ cannot be first in an bre or - immediately after an alternation or begin-group operator. */ -# define RE_CONTEXT_INVALID_DUP (RE_CARET_ANCHORS_HERE << 1) - -/* If this bit is set, then no_sub will be set to 1 during - re_compile_pattern. */ -#define RE_NO_SUB (RE_CONTEXT_INVALID_DUP << 1) -#endif - -/* This global variable defines the particular regexp syntax to use (for - some interfaces). When a regexp is compiled, the syntax used is - stored in the pattern buffer, so changing this does not affect - already-compiled regexps. */ -extern reg_syntax_t re_syntax_options; - -#ifdef __USE_GNU -/* Define combinations of the above bits for the standard possibilities. - (The [[[ comments delimit what gets put into the Texinfo file, so - don't delete them!) */ -/* [[[begin syntaxes]]] */ -#define RE_SYNTAX_EMACS 0 - -#define RE_SYNTAX_AWK \ - (RE_BACKSLASH_ESCAPE_IN_LISTS | RE_DOT_NOT_NULL \ - | RE_NO_BK_PARENS | RE_NO_BK_REFS \ - | RE_NO_BK_VBAR | RE_NO_EMPTY_RANGES \ - | RE_DOT_NEWLINE | RE_CONTEXT_INDEP_ANCHORS \ - | RE_UNMATCHED_RIGHT_PAREN_ORD | RE_NO_GNU_OPS) - -#define RE_SYNTAX_GNU_AWK \ - ((RE_SYNTAX_POSIX_EXTENDED | RE_BACKSLASH_ESCAPE_IN_LISTS \ - | RE_INVALID_INTERVAL_ORD) \ - & ~(RE_DOT_NOT_NULL | RE_CONTEXT_INDEP_OPS \ - | RE_CONTEXT_INVALID_OPS )) - -#define RE_SYNTAX_POSIX_AWK \ - (RE_SYNTAX_POSIX_EXTENDED | RE_BACKSLASH_ESCAPE_IN_LISTS \ - | RE_INTERVALS | RE_NO_GNU_OPS \ - | RE_INVALID_INTERVAL_ORD) - -#define RE_SYNTAX_GREP \ - (RE_BK_PLUS_QM | RE_CHAR_CLASSES \ - | RE_HAT_LISTS_NOT_NEWLINE | RE_INTERVALS \ - | RE_NEWLINE_ALT) - -#define RE_SYNTAX_EGREP \ - (RE_CHAR_CLASSES | RE_CONTEXT_INDEP_ANCHORS \ - | RE_CONTEXT_INDEP_OPS | RE_HAT_LISTS_NOT_NEWLINE \ - | RE_NEWLINE_ALT | RE_NO_BK_PARENS \ - | RE_NO_BK_VBAR) - -#define RE_SYNTAX_POSIX_EGREP \ - (RE_SYNTAX_EGREP | RE_INTERVALS | RE_NO_BK_BRACES \ - | RE_INVALID_INTERVAL_ORD) - -/* P1003.2/D11.2, section 4.20.7.1, lines 5078ff. */ -#define RE_SYNTAX_ED RE_SYNTAX_POSIX_BASIC - -#define RE_SYNTAX_SED RE_SYNTAX_POSIX_BASIC - -/* Syntax bits common to both basic and extended POSIX regex syntax. */ -#define _RE_SYNTAX_POSIX_COMMON \ - (RE_CHAR_CLASSES | RE_DOT_NEWLINE | RE_DOT_NOT_NULL \ - | RE_INTERVALS | RE_NO_EMPTY_RANGES) - -#define RE_SYNTAX_POSIX_BASIC \ - (_RE_SYNTAX_POSIX_COMMON | RE_BK_PLUS_QM | RE_CONTEXT_INVALID_DUP) - -/* Differs from ..._POSIX_BASIC only in that RE_BK_PLUS_QM becomes - RE_LIMITED_OPS, i.e., \? \+ \| are not recognized. Actually, this - isn't minimal, since other operators, such as \`, aren't disabled. */ -#define RE_SYNTAX_POSIX_MINIMAL_BASIC \ - (_RE_SYNTAX_POSIX_COMMON | RE_LIMITED_OPS) - -#define RE_SYNTAX_POSIX_EXTENDED \ - (_RE_SYNTAX_POSIX_COMMON | RE_CONTEXT_INDEP_ANCHORS \ - | RE_CONTEXT_INDEP_OPS | RE_NO_BK_BRACES \ - | RE_NO_BK_PARENS | RE_NO_BK_VBAR \ - | RE_CONTEXT_INVALID_OPS | RE_UNMATCHED_RIGHT_PAREN_ORD) - -/* Differs from ..._POSIX_EXTENDED in that RE_CONTEXT_INDEP_OPS is - removed and RE_NO_BK_REFS is added. */ -#define RE_SYNTAX_POSIX_MINIMAL_EXTENDED \ - (_RE_SYNTAX_POSIX_COMMON | RE_CONTEXT_INDEP_ANCHORS \ - | RE_CONTEXT_INVALID_OPS | RE_NO_BK_BRACES \ - | RE_NO_BK_PARENS | RE_NO_BK_REFS \ - | RE_NO_BK_VBAR | RE_UNMATCHED_RIGHT_PAREN_ORD) -/* [[[end syntaxes]]] */ - -/* Maximum number of duplicates an interval can allow. Some systems - (erroneously) define this in other header files, but we want our - value, so remove any previous define. */ -# ifdef RE_DUP_MAX -# undef RE_DUP_MAX -# endif -/* If sizeof(int) == 2, then ((1 << 15) - 1) overflows. */ -# define RE_DUP_MAX (0x7fff) -#endif - - -/* POSIX `cflags' bits (i.e., information for `regcomp'). */ - -/* If this bit is set, then use extended regular expression syntax. - If not set, then use basic regular expression syntax. */ -#define REG_EXTENDED 1 - -/* If this bit is set, then ignore case when matching. - If not set, then case is significant. */ -#define REG_ICASE (REG_EXTENDED << 1) - -/* If this bit is set, then anchors do not match at newline - characters in the string. - If not set, then anchors do match at newlines. */ -#define REG_NEWLINE (REG_ICASE << 1) - -/* If this bit is set, then report only success or fail in regexec. - If not set, then returns differ between not matching and errors. */ -#define REG_NOSUB (REG_NEWLINE << 1) - - -/* POSIX `eflags' bits (i.e., information for regexec). */ - -/* If this bit is set, then the beginning-of-line operator doesn't match - the beginning of the string (presumably because it's not the - beginning of a line). - If not set, then the beginning-of-line operator does match the - beginning of the string. */ -#define REG_NOTBOL 1 - -/* Like REG_NOTBOL, except for the end-of-line. */ -#define REG_NOTEOL (1 << 1) - -/* Use PMATCH[0] to delimit the start and end of the search in the - buffer. */ -#define REG_STARTEND (1 << 2) - - -/* If any error codes are removed, changed, or added, update the - `re_error_msg' table in regex.c. */ -typedef enum -{ -#if defined _XOPEN_SOURCE || defined __USE_XOPEN2K - REG_ENOSYS = -1, /* This will never happen for this implementation. */ -#endif - - REG_NOERROR = 0, /* Success. */ - REG_NOMATCH, /* Didn't find a match (for regexec). */ - - /* POSIX regcomp return error codes. (In the order listed in the - standard.) */ - REG_BADPAT, /* Invalid pattern. */ - REG_ECOLLATE, /* Inalid collating element. */ - REG_ECTYPE, /* Invalid character class name. */ - REG_EESCAPE, /* Trailing backslash. */ - REG_ESUBREG, /* Invalid back reference. */ - REG_EBRACK, /* Unmatched left bracket. */ - REG_EPAREN, /* Parenthesis imbalance. */ - REG_EBRACE, /* Unmatched \{. */ - REG_BADBR, /* Invalid contents of \{\}. */ - REG_ERANGE, /* Invalid range end. */ - REG_ESPACE, /* Ran out of memory. */ - REG_BADRPT, /* No preceding re for repetition op. */ - - /* Error codes we've added. */ - REG_EEND, /* Premature end. */ - REG_ESIZE, /* Compiled pattern bigger than 2^16 bytes. */ - REG_ERPAREN /* Unmatched ) or \); not returned from regcomp. */ -} reg_errcode_t; - -/* This data structure represents a compiled pattern. Before calling - the pattern compiler, the fields `buffer', `allocated', `fastmap', - `translate', and `no_sub' can be set. After the pattern has been - compiled, the `re_nsub' field is available. All other fields are - private to the regex routines. */ - -#ifndef RE_TRANSLATE_TYPE -# define __RE_TRANSLATE_TYPE unsigned char * -# ifdef __USE_GNU -# define RE_TRANSLATE_TYPE __RE_TRANSLATE_TYPE -# endif -#endif - -#ifdef __USE_GNU -# define __REPB_PREFIX(name) name -#else -# define __REPB_PREFIX(name) __##name -#endif - -struct re_pattern_buffer -{ - /* Space that holds the compiled pattern. It is declared as - `unsigned char *' because its elements are sometimes used as - array indexes. */ - unsigned char *__REPB_PREFIX(buffer); - - /* Number of bytes to which `buffer' points. */ - unsigned long int __REPB_PREFIX(allocated); - - /* Number of bytes actually used in `buffer'. */ - unsigned long int __REPB_PREFIX(used); - - /* Syntax setting with which the pattern was compiled. */ - reg_syntax_t __REPB_PREFIX(syntax); - - /* Pointer to a fastmap, if any, otherwise zero. re_search uses the - fastmap, if there is one, to skip over impossible starting points - for matches. */ - char *__REPB_PREFIX(fastmap); - - /* Either a translate table to apply to all characters before - comparing them, or zero for no translation. The translation is - applied to a pattern when it is compiled and to a string when it - is matched. */ - __RE_TRANSLATE_TYPE __REPB_PREFIX(translate); - - /* Number of subexpressions found by the compiler. */ - size_t re_nsub; - - /* Zero if this pattern cannot match the empty string, one else. - Well, in truth it's used only in `re_search_2', to see whether or - not we should use the fastmap, so we don't set this absolutely - perfectly; see `re_compile_fastmap' (the `duplicate' case). */ - unsigned __REPB_PREFIX(can_be_null) : 1; - - /* If REGS_UNALLOCATED, allocate space in the `regs' structure - for `max (RE_NREGS, re_nsub + 1)' groups. - If REGS_REALLOCATE, reallocate space if necessary. - If REGS_FIXED, use what's there. */ -#ifdef __USE_GNU -# define REGS_UNALLOCATED 0 -# define REGS_REALLOCATE 1 -# define REGS_FIXED 2 -#endif - unsigned __REPB_PREFIX(regs_allocated) : 2; - - /* Set to zero when `regex_compile' compiles a pattern; set to one - by `re_compile_fastmap' if it updates the fastmap. */ - unsigned __REPB_PREFIX(fastmap_accurate) : 1; - - /* If set, `re_match_2' does not return information about - subexpressions. */ - unsigned __REPB_PREFIX(no_sub) : 1; - - /* If set, a beginning-of-line anchor doesn't match at the beginning - of the string. */ - unsigned __REPB_PREFIX(not_bol) : 1; - - /* Similarly for an end-of-line anchor. */ - unsigned __REPB_PREFIX(not_eol) : 1; - - /* If true, an anchor at a newline matches. */ - unsigned __REPB_PREFIX(newline_anchor) : 1; -}; - -typedef struct re_pattern_buffer regex_t; - -/* Type for byte offsets within the string. POSIX mandates this. */ -typedef int regoff_t; - - -#ifdef __USE_GNU -/* This is the structure we store register match data in. See - regex.texinfo for a full description of what registers match. */ -struct re_registers -{ - unsigned num_regs; - regoff_t *start; - regoff_t *end; -}; - - -/* If `regs_allocated' is REGS_UNALLOCATED in the pattern buffer, - `re_match_2' returns information about at least this many registers - the first time a `regs' structure is passed. */ -# ifndef RE_NREGS -# define RE_NREGS 30 -# endif -#endif - - -/* POSIX specification for registers. Aside from the different names than - `re_registers', POSIX uses an array of structures, instead of a - structure of arrays. */ -typedef struct -{ - regoff_t rm_so; /* Byte offset from string's start to substring's start. */ - regoff_t rm_eo; /* Byte offset from string's start to substring's end. */ -} regmatch_t; - -/* Declarations for routines. */ - -#ifdef __USE_GNU -/* Sets the current default syntax to SYNTAX, and return the old syntax. - You can also simply assign to the `re_syntax_options' variable. */ -extern reg_syntax_t re_set_syntax (reg_syntax_t __syntax); - -/* Compile the regular expression PATTERN, with length LENGTH - and syntax given by the global `re_syntax_options', into the buffer - BUFFER. Return NULL if successful, and an error string if not. */ -extern const char *re_compile_pattern (const char *__pattern, size_t __length, - struct re_pattern_buffer *__buffer); - - -/* Compile a fastmap for the compiled pattern in BUFFER; used to - accelerate searches. Return 0 if successful and -2 if was an - internal error. */ -extern int re_compile_fastmap (struct re_pattern_buffer *__buffer); - - -/* Search in the string STRING (with length LENGTH) for the pattern - compiled into BUFFER. Start searching at position START, for RANGE - characters. Return the starting position of the match, -1 for no - match, or -2 for an internal error. Also return register - information in REGS (if REGS and BUFFER->no_sub are nonzero). */ -extern int re_search (struct re_pattern_buffer *__buffer, const char *__cstring, - int __length, int __start, int __range, - struct re_registers *__regs); - - -/* Like `re_search', but search in the concatenation of STRING1 and - STRING2. Also, stop searching at index START + STOP. */ -extern int re_search_2 (struct re_pattern_buffer *__buffer, - const char *__string1, int __length1, - const char *__string2, int __length2, int __start, - int __range, struct re_registers *__regs, int __stop); - - -/* Like `re_search', but return how many characters in STRING the regexp - in BUFFER matched, starting at position START. */ -extern int re_match (struct re_pattern_buffer *__buffer, const char *__cstring, - int __length, int __start, struct re_registers *__regs); - - -/* Relates to `re_match' as `re_search_2' relates to `re_search'. */ -extern int re_match_2 (struct re_pattern_buffer *__buffer, - const char *__string1, int __length1, - const char *__string2, int __length2, int __start, - struct re_registers *__regs, int __stop); - - -/* Set REGS to hold NUM_REGS registers, storing them in STARTS and - ENDS. Subsequent matches using BUFFER and REGS will use this memory - for recording register information. STARTS and ENDS must be - allocated with malloc, and must each be at least `NUM_REGS * sizeof - (regoff_t)' bytes long. - - If NUM_REGS == 0, then subsequent matches should allocate their own - register data. - - Unless this function is called, the first search or match using - PATTERN_BUFFER will allocate its own register data, without - freeing the old data. */ -extern void re_set_registers (struct re_pattern_buffer *__buffer, - struct re_registers *__regs, - unsigned int __num_regs, - regoff_t *__starts, regoff_t *__ends); -#endif /* Use GNU */ - -#if defined _REGEX_RE_COMP || (defined _LIBC && defined __USE_BSD) -# ifndef _CRAY -/* 4.2 bsd compatibility. */ -extern char *re_comp (const char *); -extern int re_exec (const char *); -# endif -#endif - -/* GCC 2.95 and later have "__restrict"; C99 compilers have - "restrict", and "configure" may have defined "restrict". */ -#ifndef __restrict -# if ! (2 < __GNUC__ || (2 == __GNUC__ && 95 <= __GNUC_MINOR__)) -# if defined restrict || 199901L <= __STDC_VERSION__ -# define __restrict restrict -# else -# define __restrict -# endif -# endif -#endif -/* gcc 3.1 and up support the [restrict] syntax. */ -#ifndef __restrict_arr -# if (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1)) \ - && !defined __GNUG__ -# define __restrict_arr __restrict -# else -# define __restrict_arr -# endif -#endif - -/* POSIX compatibility. */ -extern int regcomp (regex_t *__restrict __preg, - const char *__restrict __pattern, - int __cflags); - -extern int regexec (const regex_t *__restrict __preg, - const char *__restrict __cstring, size_t __nmatch, - regmatch_t __pmatch[__restrict_arr], - int __eflags); - -extern size_t regerror (int __errcode, const regex_t *__restrict __preg, - char *__restrict __errbuf, size_t __errbuf_size); - -extern void regfree (regex_t *__preg); - - -#ifdef __cplusplus -} -#endif /* C++ */ - -#endif /* regex.h */ diff --git a/vendor/libgit2/deps/regex/regex_internal.c b/vendor/libgit2/deps/regex/regex_internal.c deleted file mode 100644 index ad57c20dd2..0000000000 --- a/vendor/libgit2/deps/regex/regex_internal.c +++ /dev/null @@ -1,1744 +0,0 @@ -/* Extended regular expression matching and search library. - Copyright (C) 2002-2006, 2010 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Isamu Hasegawa . - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, write to the Free - Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - 02110-1301 USA. */ - -static void re_string_construct_common (const char *str, int len, - re_string_t *pstr, - RE_TRANSLATE_TYPE trans, int icase, - const re_dfa_t *dfa) internal_function; -static re_dfastate_t *create_ci_newstate (const re_dfa_t *dfa, - const re_node_set *nodes, - unsigned int hash) internal_function; -static re_dfastate_t *create_cd_newstate (const re_dfa_t *dfa, - const re_node_set *nodes, - unsigned int context, - unsigned int hash) internal_function; - -#ifdef GAWK -#undef MAX /* safety */ -static size_t -MAX(size_t a, size_t b) -{ - return (a > b ? a : b); -} -#endif - -/* Functions for string operation. */ - -/* This function allocate the buffers. It is necessary to call - re_string_reconstruct before using the object. */ - -static reg_errcode_t -internal_function -re_string_allocate (re_string_t *pstr, const char *str, int len, int init_len, - RE_TRANSLATE_TYPE trans, int icase, const re_dfa_t *dfa) -{ - reg_errcode_t ret; - int init_buf_len; - - /* Ensure at least one character fits into the buffers. */ - if (init_len < dfa->mb_cur_max) - init_len = dfa->mb_cur_max; - init_buf_len = (len + 1 < init_len) ? len + 1: init_len; - re_string_construct_common (str, len, pstr, trans, icase, dfa); - - ret = re_string_realloc_buffers (pstr, init_buf_len); - if (BE (ret != REG_NOERROR, 0)) - return ret; - - pstr->word_char = dfa->word_char; - pstr->word_ops_used = dfa->word_ops_used; - pstr->mbs = pstr->mbs_allocated ? pstr->mbs : (unsigned char *) str; - pstr->valid_len = (pstr->mbs_allocated || dfa->mb_cur_max > 1) ? 0 : len; - pstr->valid_raw_len = pstr->valid_len; - return REG_NOERROR; -} - -/* This function allocate the buffers, and initialize them. */ - -static reg_errcode_t -internal_function -re_string_construct (re_string_t *pstr, const char *str, int len, - RE_TRANSLATE_TYPE trans, int icase, const re_dfa_t *dfa) -{ - reg_errcode_t ret; - memset (pstr, '\0', sizeof (re_string_t)); - re_string_construct_common (str, len, pstr, trans, icase, dfa); - - if (len > 0) - { - ret = re_string_realloc_buffers (pstr, len + 1); - if (BE (ret != REG_NOERROR, 0)) - return ret; - } - pstr->mbs = pstr->mbs_allocated ? pstr->mbs : (unsigned char *) str; - - if (icase) - { -#ifdef RE_ENABLE_I18N - if (dfa->mb_cur_max > 1) - { - while (1) - { - ret = build_wcs_upper_buffer (pstr); - if (BE (ret != REG_NOERROR, 0)) - return ret; - if (pstr->valid_raw_len >= len) - break; - if (pstr->bufs_len > pstr->valid_len + dfa->mb_cur_max) - break; - ret = re_string_realloc_buffers (pstr, pstr->bufs_len * 2); - if (BE (ret != REG_NOERROR, 0)) - return ret; - } - } - else -#endif /* RE_ENABLE_I18N */ - build_upper_buffer (pstr); - } - else - { -#ifdef RE_ENABLE_I18N - if (dfa->mb_cur_max > 1) - build_wcs_buffer (pstr); - else -#endif /* RE_ENABLE_I18N */ - { - if (trans != NULL) - re_string_translate_buffer (pstr); - else - { - pstr->valid_len = pstr->bufs_len; - pstr->valid_raw_len = pstr->bufs_len; - } - } - } - - return REG_NOERROR; -} - -/* Helper functions for re_string_allocate, and re_string_construct. */ - -static reg_errcode_t -internal_function -re_string_realloc_buffers (re_string_t *pstr, int new_buf_len) -{ -#ifdef RE_ENABLE_I18N - if (pstr->mb_cur_max > 1) - { - wint_t *new_wcs; - - /* Avoid overflow in realloc. */ - const size_t max_object_size = MAX (sizeof (wint_t), sizeof (int)); - if (BE (SIZE_MAX / max_object_size < new_buf_len, 0)) - return REG_ESPACE; - - new_wcs = re_realloc (pstr->wcs, wint_t, new_buf_len); - if (BE (new_wcs == NULL, 0)) - return REG_ESPACE; - pstr->wcs = new_wcs; - if (pstr->offsets != NULL) - { - int *new_offsets = re_realloc (pstr->offsets, int, new_buf_len); - if (BE (new_offsets == NULL, 0)) - return REG_ESPACE; - pstr->offsets = new_offsets; - } - } -#endif /* RE_ENABLE_I18N */ - if (pstr->mbs_allocated) - { - unsigned char *new_mbs = re_realloc (pstr->mbs, unsigned char, - new_buf_len); - if (BE (new_mbs == NULL, 0)) - return REG_ESPACE; - pstr->mbs = new_mbs; - } - pstr->bufs_len = new_buf_len; - return REG_NOERROR; -} - - -static void -internal_function -re_string_construct_common (const char *str, int len, re_string_t *pstr, - RE_TRANSLATE_TYPE trans, int icase, - const re_dfa_t *dfa) -{ - pstr->raw_mbs = (const unsigned char *) str; - pstr->len = len; - pstr->raw_len = len; - pstr->trans = trans; - pstr->icase = icase ? 1 : 0; - pstr->mbs_allocated = (trans != NULL || icase); - pstr->mb_cur_max = dfa->mb_cur_max; - pstr->is_utf8 = dfa->is_utf8; - pstr->map_notascii = dfa->map_notascii; - pstr->stop = pstr->len; - pstr->raw_stop = pstr->stop; -} - -#ifdef RE_ENABLE_I18N - -/* Build wide character buffer PSTR->WCS. - If the byte sequence of the string are: - (0), (1), (0), (1), - Then wide character buffer will be: - , WEOF , , WEOF , - We use WEOF for padding, they indicate that the position isn't - a first byte of a multibyte character. - - Note that this function assumes PSTR->VALID_LEN elements are already - built and starts from PSTR->VALID_LEN. */ - -static void -internal_function -build_wcs_buffer (re_string_t *pstr) -{ -#ifdef _LIBC - unsigned char buf[MB_LEN_MAX]; - assert (MB_LEN_MAX >= pstr->mb_cur_max); -#else - unsigned char buf[64]; -#endif - mbstate_t prev_st; - int byte_idx, end_idx, remain_len; - size_t mbclen; - - /* Build the buffers from pstr->valid_len to either pstr->len or - pstr->bufs_len. */ - end_idx = (pstr->bufs_len > pstr->len) ? pstr->len : pstr->bufs_len; - for (byte_idx = pstr->valid_len; byte_idx < end_idx;) - { - wchar_t wc; - const char *p; - - remain_len = end_idx - byte_idx; - prev_st = pstr->cur_state; - /* Apply the translation if we need. */ - if (BE (pstr->trans != NULL, 0)) - { - int i, ch; - - for (i = 0; i < pstr->mb_cur_max && i < remain_len; ++i) - { - ch = pstr->raw_mbs [pstr->raw_mbs_idx + byte_idx + i]; - buf[i] = pstr->mbs[byte_idx + i] = pstr->trans[ch]; - } - p = (const char *) buf; - } - else - p = (const char *) pstr->raw_mbs + pstr->raw_mbs_idx + byte_idx; - mbclen = __mbrtowc (&wc, p, remain_len, &pstr->cur_state); - if (BE (mbclen == (size_t) -2, 0)) - { - /* The buffer doesn't have enough space, finish to build. */ - pstr->cur_state = prev_st; - break; - } - else if (BE (mbclen == (size_t) -1 || mbclen == 0, 0)) - { - /* We treat these cases as a singlebyte character. */ - mbclen = 1; - wc = (wchar_t) pstr->raw_mbs[pstr->raw_mbs_idx + byte_idx]; - if (BE (pstr->trans != NULL, 0)) - wc = pstr->trans[wc]; - pstr->cur_state = prev_st; - } - - /* Write wide character and padding. */ - pstr->wcs[byte_idx++] = wc; - /* Write paddings. */ - for (remain_len = byte_idx + mbclen - 1; byte_idx < remain_len ;) - pstr->wcs[byte_idx++] = WEOF; - } - pstr->valid_len = byte_idx; - pstr->valid_raw_len = byte_idx; -} - -/* Build wide character buffer PSTR->WCS like build_wcs_buffer, - but for REG_ICASE. */ - -static reg_errcode_t -internal_function -build_wcs_upper_buffer (re_string_t *pstr) -{ - mbstate_t prev_st; - int src_idx, byte_idx, end_idx, remain_len; - size_t mbclen; -#ifdef _LIBC - char buf[MB_LEN_MAX]; - assert (MB_LEN_MAX >= pstr->mb_cur_max); -#else - char buf[64]; -#endif - - byte_idx = pstr->valid_len; - end_idx = (pstr->bufs_len > pstr->len) ? pstr->len : pstr->bufs_len; - - /* The following optimization assumes that ASCII characters can be - mapped to wide characters with a simple cast. */ - if (! pstr->map_notascii && pstr->trans == NULL && !pstr->offsets_needed) - { - while (byte_idx < end_idx) - { - wchar_t wc; - - if (isascii (pstr->raw_mbs[pstr->raw_mbs_idx + byte_idx]) - && mbsinit (&pstr->cur_state)) - { - /* In case of a singlebyte character. */ - pstr->mbs[byte_idx] - = toupper (pstr->raw_mbs[pstr->raw_mbs_idx + byte_idx]); - /* The next step uses the assumption that wchar_t is encoded - ASCII-safe: all ASCII values can be converted like this. */ - pstr->wcs[byte_idx] = (wchar_t) pstr->mbs[byte_idx]; - ++byte_idx; - continue; - } - - remain_len = end_idx - byte_idx; - prev_st = pstr->cur_state; - mbclen = __mbrtowc (&wc, - ((const char *) pstr->raw_mbs + pstr->raw_mbs_idx - + byte_idx), remain_len, &pstr->cur_state); - if (BE (mbclen + 2 > 2, 1)) - { - wchar_t wcu = wc; - if (iswlower (wc)) - { - size_t mbcdlen; - - wcu = towupper (wc); - mbcdlen = wcrtomb (buf, wcu, &prev_st); - if (BE (mbclen == mbcdlen, 1)) - memcpy (pstr->mbs + byte_idx, buf, mbclen); - else - { - src_idx = byte_idx; - goto offsets_needed; - } - } - else - memcpy (pstr->mbs + byte_idx, - pstr->raw_mbs + pstr->raw_mbs_idx + byte_idx, mbclen); - pstr->wcs[byte_idx++] = wcu; - /* Write paddings. */ - for (remain_len = byte_idx + mbclen - 1; byte_idx < remain_len ;) - pstr->wcs[byte_idx++] = WEOF; - } - else if (mbclen == (size_t) -1 || mbclen == 0) - { - /* It is an invalid character or '\0'. Just use the byte. */ - int ch = pstr->raw_mbs[pstr->raw_mbs_idx + byte_idx]; - pstr->mbs[byte_idx] = ch; - /* And also cast it to wide char. */ - pstr->wcs[byte_idx++] = (wchar_t) ch; - if (BE (mbclen == (size_t) -1, 0)) - pstr->cur_state = prev_st; - } - else - { - /* The buffer doesn't have enough space, finish to build. */ - pstr->cur_state = prev_st; - break; - } - } - pstr->valid_len = byte_idx; - pstr->valid_raw_len = byte_idx; - return REG_NOERROR; - } - else - for (src_idx = pstr->valid_raw_len; byte_idx < end_idx;) - { - wchar_t wc; - const char *p; - offsets_needed: - remain_len = end_idx - byte_idx; - prev_st = pstr->cur_state; - if (BE (pstr->trans != NULL, 0)) - { - int i, ch; - - for (i = 0; i < pstr->mb_cur_max && i < remain_len; ++i) - { - ch = pstr->raw_mbs [pstr->raw_mbs_idx + src_idx + i]; - buf[i] = pstr->trans[ch]; - } - p = (const char *) buf; - } - else - p = (const char *) pstr->raw_mbs + pstr->raw_mbs_idx + src_idx; - mbclen = __mbrtowc (&wc, p, remain_len, &pstr->cur_state); - if (BE (mbclen + 2 > 2, 1)) - { - wchar_t wcu = wc; - if (iswlower (wc)) - { - size_t mbcdlen; - - wcu = towupper (wc); - mbcdlen = wcrtomb ((char *) buf, wcu, &prev_st); - if (BE (mbclen == mbcdlen, 1)) - memcpy (pstr->mbs + byte_idx, buf, mbclen); - else if (mbcdlen != (size_t) -1) - { - size_t i; - - if (byte_idx + mbcdlen > pstr->bufs_len) - { - pstr->cur_state = prev_st; - break; - } - - if (pstr->offsets == NULL) - { - pstr->offsets = re_malloc (int, pstr->bufs_len); - - if (pstr->offsets == NULL) - return REG_ESPACE; - } - if (!pstr->offsets_needed) - { - for (i = 0; i < (size_t) byte_idx; ++i) - pstr->offsets[i] = i; - pstr->offsets_needed = 1; - } - - memcpy (pstr->mbs + byte_idx, buf, mbcdlen); - pstr->wcs[byte_idx] = wcu; - pstr->offsets[byte_idx] = src_idx; - for (i = 1; i < mbcdlen; ++i) - { - pstr->offsets[byte_idx + i] - = src_idx + (i < mbclen ? i : mbclen - 1); - pstr->wcs[byte_idx + i] = WEOF; - } - pstr->len += mbcdlen - mbclen; - if (pstr->raw_stop > src_idx) - pstr->stop += mbcdlen - mbclen; - end_idx = (pstr->bufs_len > pstr->len) - ? pstr->len : pstr->bufs_len; - byte_idx += mbcdlen; - src_idx += mbclen; - continue; - } - else - memcpy (pstr->mbs + byte_idx, p, mbclen); - } - else - memcpy (pstr->mbs + byte_idx, p, mbclen); - - if (BE (pstr->offsets_needed != 0, 0)) - { - size_t i; - for (i = 0; i < mbclen; ++i) - pstr->offsets[byte_idx + i] = src_idx + i; - } - src_idx += mbclen; - - pstr->wcs[byte_idx++] = wcu; - /* Write paddings. */ - for (remain_len = byte_idx + mbclen - 1; byte_idx < remain_len ;) - pstr->wcs[byte_idx++] = WEOF; - } - else if (mbclen == (size_t) -1 || mbclen == 0) - { - /* It is an invalid character or '\0'. Just use the byte. */ - int ch = pstr->raw_mbs[pstr->raw_mbs_idx + src_idx]; - - if (BE (pstr->trans != NULL, 0)) - ch = pstr->trans [ch]; - pstr->mbs[byte_idx] = ch; - - if (BE (pstr->offsets_needed != 0, 0)) - pstr->offsets[byte_idx] = src_idx; - ++src_idx; - - /* And also cast it to wide char. */ - pstr->wcs[byte_idx++] = (wchar_t) ch; - if (BE (mbclen == (size_t) -1, 0)) - pstr->cur_state = prev_st; - } - else - { - /* The buffer doesn't have enough space, finish to build. */ - pstr->cur_state = prev_st; - break; - } - } - pstr->valid_len = byte_idx; - pstr->valid_raw_len = src_idx; - return REG_NOERROR; -} - -/* Skip characters until the index becomes greater than NEW_RAW_IDX. - Return the index. */ - -static int -internal_function -re_string_skip_chars (re_string_t *pstr, int new_raw_idx, wint_t *last_wc) -{ - mbstate_t prev_st; - int rawbuf_idx; - size_t mbclen; - wint_t wc = WEOF; - - /* Skip the characters which are not necessary to check. */ - for (rawbuf_idx = pstr->raw_mbs_idx + pstr->valid_raw_len; - rawbuf_idx < new_raw_idx;) - { - wchar_t wc2; - int remain_len = pstr->len - rawbuf_idx; - prev_st = pstr->cur_state; - mbclen = __mbrtowc (&wc2, (const char *) pstr->raw_mbs + rawbuf_idx, - remain_len, &pstr->cur_state); - if (BE (mbclen == (size_t) -2 || mbclen == (size_t) -1 || mbclen == 0, 0)) - { - /* We treat these cases as a single byte character. */ - if (mbclen == 0 || remain_len == 0) - wc = L'\0'; - else - wc = *(unsigned char *) (pstr->raw_mbs + rawbuf_idx); - mbclen = 1; - pstr->cur_state = prev_st; - } - else - wc = (wint_t) wc2; - /* Then proceed the next character. */ - rawbuf_idx += mbclen; - } - *last_wc = (wint_t) wc; - return rawbuf_idx; -} -#endif /* RE_ENABLE_I18N */ - -/* Build the buffer PSTR->MBS, and apply the translation if we need. - This function is used in case of REG_ICASE. */ - -static void -internal_function -build_upper_buffer (re_string_t *pstr) -{ - int char_idx, end_idx; - end_idx = (pstr->bufs_len > pstr->len) ? pstr->len : pstr->bufs_len; - - for (char_idx = pstr->valid_len; char_idx < end_idx; ++char_idx) - { - int ch = pstr->raw_mbs[pstr->raw_mbs_idx + char_idx]; - if (BE (pstr->trans != NULL, 0)) - ch = pstr->trans[ch]; - if (islower (ch)) - pstr->mbs[char_idx] = toupper (ch); - else - pstr->mbs[char_idx] = ch; - } - pstr->valid_len = char_idx; - pstr->valid_raw_len = char_idx; -} - -/* Apply TRANS to the buffer in PSTR. */ - -static void -internal_function -re_string_translate_buffer (re_string_t *pstr) -{ - int buf_idx, end_idx; - end_idx = (pstr->bufs_len > pstr->len) ? pstr->len : pstr->bufs_len; - - for (buf_idx = pstr->valid_len; buf_idx < end_idx; ++buf_idx) - { - int ch = pstr->raw_mbs[pstr->raw_mbs_idx + buf_idx]; - pstr->mbs[buf_idx] = pstr->trans[ch]; - } - - pstr->valid_len = buf_idx; - pstr->valid_raw_len = buf_idx; -} - -/* This function re-construct the buffers. - Concretely, convert to wide character in case of pstr->mb_cur_max > 1, - convert to upper case in case of REG_ICASE, apply translation. */ - -static reg_errcode_t -internal_function -re_string_reconstruct (re_string_t *pstr, int idx, int eflags) -{ - int offset = idx - pstr->raw_mbs_idx; - if (BE (offset < 0, 0)) - { - /* Reset buffer. */ -#ifdef RE_ENABLE_I18N - if (pstr->mb_cur_max > 1) - memset (&pstr->cur_state, '\0', sizeof (mbstate_t)); -#endif /* RE_ENABLE_I18N */ - pstr->len = pstr->raw_len; - pstr->stop = pstr->raw_stop; - pstr->valid_len = 0; - pstr->raw_mbs_idx = 0; - pstr->valid_raw_len = 0; - pstr->offsets_needed = 0; - pstr->tip_context = ((eflags & REG_NOTBOL) ? CONTEXT_BEGBUF - : CONTEXT_NEWLINE | CONTEXT_BEGBUF); - if (!pstr->mbs_allocated) - pstr->mbs = (unsigned char *) pstr->raw_mbs; - offset = idx; - } - - if (BE (offset != 0, 1)) - { - /* Should the already checked characters be kept? */ - if (BE (offset < pstr->valid_raw_len, 1)) - { - /* Yes, move them to the front of the buffer. */ -#ifdef RE_ENABLE_I18N - if (BE (pstr->offsets_needed, 0)) - { - int low = 0, high = pstr->valid_len, mid; - do - { - mid = (high + low) / 2; - if (pstr->offsets[mid] > offset) - high = mid; - else if (pstr->offsets[mid] < offset) - low = mid + 1; - else - break; - } - while (low < high); - if (pstr->offsets[mid] < offset) - ++mid; - pstr->tip_context = re_string_context_at (pstr, mid - 1, - eflags); - /* This can be quite complicated, so handle specially - only the common and easy case where the character with - different length representation of lower and upper - case is present at or after offset. */ - if (pstr->valid_len > offset - && mid == offset && pstr->offsets[mid] == offset) - { - memmove (pstr->wcs, pstr->wcs + offset, - (pstr->valid_len - offset) * sizeof (wint_t)); - memmove (pstr->mbs, pstr->mbs + offset, pstr->valid_len - offset); - pstr->valid_len -= offset; - pstr->valid_raw_len -= offset; - for (low = 0; low < pstr->valid_len; low++) - pstr->offsets[low] = pstr->offsets[low + offset] - offset; - } - else - { - /* Otherwise, just find out how long the partial multibyte - character at offset is and fill it with WEOF/255. */ - pstr->len = pstr->raw_len - idx + offset; - pstr->stop = pstr->raw_stop - idx + offset; - pstr->offsets_needed = 0; - while (mid > 0 && pstr->offsets[mid - 1] == offset) - --mid; - while (mid < pstr->valid_len) - if (pstr->wcs[mid] != WEOF) - break; - else - ++mid; - if (mid == pstr->valid_len) - pstr->valid_len = 0; - else - { - pstr->valid_len = pstr->offsets[mid] - offset; - if (pstr->valid_len) - { - for (low = 0; low < pstr->valid_len; ++low) - pstr->wcs[low] = WEOF; - memset (pstr->mbs, 255, pstr->valid_len); - } - } - pstr->valid_raw_len = pstr->valid_len; - } - } - else -#endif - { - pstr->tip_context = re_string_context_at (pstr, offset - 1, - eflags); -#ifdef RE_ENABLE_I18N - if (pstr->mb_cur_max > 1) - memmove (pstr->wcs, pstr->wcs + offset, - (pstr->valid_len - offset) * sizeof (wint_t)); -#endif /* RE_ENABLE_I18N */ - if (BE (pstr->mbs_allocated, 0)) - memmove (pstr->mbs, pstr->mbs + offset, - pstr->valid_len - offset); - pstr->valid_len -= offset; - pstr->valid_raw_len -= offset; -#if DEBUG - assert (pstr->valid_len > 0); -#endif - } - } - else - { -#ifdef RE_ENABLE_I18N - /* No, skip all characters until IDX. */ - int prev_valid_len = pstr->valid_len; - - if (BE (pstr->offsets_needed, 0)) - { - pstr->len = pstr->raw_len - idx + offset; - pstr->stop = pstr->raw_stop - idx + offset; - pstr->offsets_needed = 0; - } -#endif - pstr->valid_len = 0; -#ifdef RE_ENABLE_I18N - if (pstr->mb_cur_max > 1) - { - int wcs_idx; - wint_t wc = WEOF; - - if (pstr->is_utf8) - { - const unsigned char *raw, *p, *end; - - /* Special case UTF-8. Multi-byte chars start with any - byte other than 0x80 - 0xbf. */ - raw = pstr->raw_mbs + pstr->raw_mbs_idx; - end = raw + (offset - pstr->mb_cur_max); - if (end < pstr->raw_mbs) - end = pstr->raw_mbs; - p = raw + offset - 1; -#ifdef _LIBC - /* We know the wchar_t encoding is UCS4, so for the simple - case, ASCII characters, skip the conversion step. */ - if (isascii (*p) && BE (pstr->trans == NULL, 1)) - { - memset (&pstr->cur_state, '\0', sizeof (mbstate_t)); - /* pstr->valid_len = 0; */ - wc = (wchar_t) *p; - } - else -#endif - for (; p >= end; --p) - if ((*p & 0xc0) != 0x80) - { - mbstate_t cur_state; - wchar_t wc2; - int mlen = raw + pstr->len - p; - unsigned char buf[6]; - size_t mbclen; - - if (BE (pstr->trans != NULL, 0)) - { - int i = mlen < 6 ? mlen : 6; - while (--i >= 0) - buf[i] = pstr->trans[p[i]]; - } - /* XXX Don't use mbrtowc, we know which conversion - to use (UTF-8 -> UCS4). */ - memset (&cur_state, 0, sizeof (cur_state)); - mbclen = __mbrtowc (&wc2, (const char *) p, mlen, - &cur_state); - if (raw + offset - p <= mbclen - && mbclen < (size_t) -2) - { - memset (&pstr->cur_state, '\0', - sizeof (mbstate_t)); - pstr->valid_len = mbclen - (raw + offset - p); - wc = wc2; - } - break; - } - } - - if (wc == WEOF) - pstr->valid_len = re_string_skip_chars (pstr, idx, &wc) - idx; - if (wc == WEOF) - pstr->tip_context - = re_string_context_at (pstr, prev_valid_len - 1, eflags); - else - pstr->tip_context = ((BE (pstr->word_ops_used != 0, 0) - && IS_WIDE_WORD_CHAR (wc)) - ? CONTEXT_WORD - : ((IS_WIDE_NEWLINE (wc) - && pstr->newline_anchor) - ? CONTEXT_NEWLINE : 0)); - if (BE (pstr->valid_len, 0)) - { - for (wcs_idx = 0; wcs_idx < pstr->valid_len; ++wcs_idx) - pstr->wcs[wcs_idx] = WEOF; - if (pstr->mbs_allocated) - memset (pstr->mbs, 255, pstr->valid_len); - } - pstr->valid_raw_len = pstr->valid_len; - } - else -#endif /* RE_ENABLE_I18N */ - { - int c = pstr->raw_mbs[pstr->raw_mbs_idx + offset - 1]; - pstr->valid_raw_len = 0; - if (pstr->trans) - c = pstr->trans[c]; - pstr->tip_context = (bitset_contain (pstr->word_char, c) - ? CONTEXT_WORD - : ((IS_NEWLINE (c) && pstr->newline_anchor) - ? CONTEXT_NEWLINE : 0)); - } - } - if (!BE (pstr->mbs_allocated, 0)) - pstr->mbs += offset; - } - pstr->raw_mbs_idx = idx; - pstr->len -= offset; - pstr->stop -= offset; - - /* Then build the buffers. */ -#ifdef RE_ENABLE_I18N - if (pstr->mb_cur_max > 1) - { - if (pstr->icase) - { - reg_errcode_t ret = build_wcs_upper_buffer (pstr); - if (BE (ret != REG_NOERROR, 0)) - return ret; - } - else - build_wcs_buffer (pstr); - } - else -#endif /* RE_ENABLE_I18N */ - if (BE (pstr->mbs_allocated, 0)) - { - if (pstr->icase) - build_upper_buffer (pstr); - else if (pstr->trans != NULL) - re_string_translate_buffer (pstr); - } - else - pstr->valid_len = pstr->len; - - pstr->cur_idx = 0; - return REG_NOERROR; -} - -static unsigned char -internal_function __attribute ((pure)) -re_string_peek_byte_case (const re_string_t *pstr, int idx) -{ - int ch, off; - - /* Handle the common (easiest) cases first. */ - if (BE (!pstr->mbs_allocated, 1)) - return re_string_peek_byte (pstr, idx); - -#ifdef RE_ENABLE_I18N - if (pstr->mb_cur_max > 1 - && ! re_string_is_single_byte_char (pstr, pstr->cur_idx + idx)) - return re_string_peek_byte (pstr, idx); -#endif - - off = pstr->cur_idx + idx; -#ifdef RE_ENABLE_I18N - if (pstr->offsets_needed) - off = pstr->offsets[off]; -#endif - - ch = pstr->raw_mbs[pstr->raw_mbs_idx + off]; - -#ifdef RE_ENABLE_I18N - /* Ensure that e.g. for tr_TR.UTF-8 BACKSLASH DOTLESS SMALL LETTER I - this function returns CAPITAL LETTER I instead of first byte of - DOTLESS SMALL LETTER I. The latter would confuse the parser, - since peek_byte_case doesn't advance cur_idx in any way. */ - if (pstr->offsets_needed && !isascii (ch)) - return re_string_peek_byte (pstr, idx); -#endif - - return ch; -} - -static unsigned char -internal_function __attribute ((pure)) -re_string_fetch_byte_case (re_string_t *pstr) -{ - if (BE (!pstr->mbs_allocated, 1)) - return re_string_fetch_byte (pstr); - -#ifdef RE_ENABLE_I18N - if (pstr->offsets_needed) - { - int off, ch; - - /* For tr_TR.UTF-8 [[:islower:]] there is - [[: CAPITAL LETTER I WITH DOT lower:]] in mbs. Skip - in that case the whole multi-byte character and return - the original letter. On the other side, with - [[: DOTLESS SMALL LETTER I return [[:I, as doing - anything else would complicate things too much. */ - - if (!re_string_first_byte (pstr, pstr->cur_idx)) - return re_string_fetch_byte (pstr); - - off = pstr->offsets[pstr->cur_idx]; - ch = pstr->raw_mbs[pstr->raw_mbs_idx + off]; - - if (! isascii (ch)) - return re_string_fetch_byte (pstr); - - re_string_skip_bytes (pstr, - re_string_char_size_at (pstr, pstr->cur_idx)); - return ch; - } -#endif - - return pstr->raw_mbs[pstr->raw_mbs_idx + pstr->cur_idx++]; -} - -static void -internal_function -re_string_destruct (re_string_t *pstr) -{ -#ifdef RE_ENABLE_I18N - re_free (pstr->wcs); - re_free (pstr->offsets); -#endif /* RE_ENABLE_I18N */ - if (pstr->mbs_allocated) - re_free (pstr->mbs); -} - -/* Return the context at IDX in INPUT. */ - -static unsigned int -internal_function -re_string_context_at (const re_string_t *input, int idx, int eflags) -{ - int c; - if (BE (idx < 0, 0)) - /* In this case, we use the value stored in input->tip_context, - since we can't know the character in input->mbs[-1] here. */ - return input->tip_context; - if (BE (idx == input->len, 0)) - return ((eflags & REG_NOTEOL) ? CONTEXT_ENDBUF - : CONTEXT_NEWLINE | CONTEXT_ENDBUF); -#ifdef RE_ENABLE_I18N - if (input->mb_cur_max > 1) - { - wint_t wc; - int wc_idx = idx; - while(input->wcs[wc_idx] == WEOF) - { -#ifdef DEBUG - /* It must not happen. */ - assert (wc_idx >= 0); -#endif - --wc_idx; - if (wc_idx < 0) - return input->tip_context; - } - wc = input->wcs[wc_idx]; - if (BE (input->word_ops_used != 0, 0) && IS_WIDE_WORD_CHAR (wc)) - return CONTEXT_WORD; - return (IS_WIDE_NEWLINE (wc) && input->newline_anchor - ? CONTEXT_NEWLINE : 0); - } - else -#endif - { - c = re_string_byte_at (input, idx); - if (bitset_contain (input->word_char, c)) - return CONTEXT_WORD; - return IS_NEWLINE (c) && input->newline_anchor ? CONTEXT_NEWLINE : 0; - } -} - -/* Functions for set operation. */ - -static reg_errcode_t -internal_function -re_node_set_alloc (re_node_set *set, int size) -{ - /* - * ADR: valgrind says size can be 0, which then doesn't - * free the block of size 0. Harumph. This seems - * to work ok, though. - */ - if (size == 0) - { - memset(set, 0, sizeof(*set)); - return REG_NOERROR; - } - set->alloc = size; - set->nelem = 0; - set->elems = re_malloc (int, size); - if (BE (set->elems == NULL, 0)) - return REG_ESPACE; - return REG_NOERROR; -} - -static reg_errcode_t -internal_function -re_node_set_init_1 (re_node_set *set, int elem) -{ - set->alloc = 1; - set->nelem = 1; - set->elems = re_malloc (int, 1); - if (BE (set->elems == NULL, 0)) - { - set->alloc = set->nelem = 0; - return REG_ESPACE; - } - set->elems[0] = elem; - return REG_NOERROR; -} - -static reg_errcode_t -internal_function -re_node_set_init_2 (re_node_set *set, int elem1, int elem2) -{ - set->alloc = 2; - set->elems = re_malloc (int, 2); - if (BE (set->elems == NULL, 0)) - return REG_ESPACE; - if (elem1 == elem2) - { - set->nelem = 1; - set->elems[0] = elem1; - } - else - { - set->nelem = 2; - if (elem1 < elem2) - { - set->elems[0] = elem1; - set->elems[1] = elem2; - } - else - { - set->elems[0] = elem2; - set->elems[1] = elem1; - } - } - return REG_NOERROR; -} - -static reg_errcode_t -internal_function -re_node_set_init_copy (re_node_set *dest, const re_node_set *src) -{ - dest->nelem = src->nelem; - if (src->nelem > 0) - { - dest->alloc = dest->nelem; - dest->elems = re_malloc (int, dest->alloc); - if (BE (dest->elems == NULL, 0)) - { - dest->alloc = dest->nelem = 0; - return REG_ESPACE; - } - memcpy (dest->elems, src->elems, src->nelem * sizeof (int)); - } - else - re_node_set_init_empty (dest); - return REG_NOERROR; -} - -/* Calculate the intersection of the sets SRC1 and SRC2. And merge it to - DEST. Return value indicate the error code or REG_NOERROR if succeeded. - Note: We assume dest->elems is NULL, when dest->alloc is 0. */ - -static reg_errcode_t -internal_function -re_node_set_add_intersect (re_node_set *dest, const re_node_set *src1, - const re_node_set *src2) -{ - int i1, i2, is, id, delta, sbase; - if (src1->nelem == 0 || src2->nelem == 0) - return REG_NOERROR; - - /* We need dest->nelem + 2 * elems_in_intersection; this is a - conservative estimate. */ - if (src1->nelem + src2->nelem + dest->nelem > dest->alloc) - { - int new_alloc = src1->nelem + src2->nelem + dest->alloc; - int *new_elems = re_realloc (dest->elems, int, new_alloc); - if (BE (new_elems == NULL, 0)) - return REG_ESPACE; - dest->elems = new_elems; - dest->alloc = new_alloc; - } - - /* Find the items in the intersection of SRC1 and SRC2, and copy - into the top of DEST those that are not already in DEST itself. */ - sbase = dest->nelem + src1->nelem + src2->nelem; - i1 = src1->nelem - 1; - i2 = src2->nelem - 1; - id = dest->nelem - 1; - for (;;) - { - if (src1->elems[i1] == src2->elems[i2]) - { - /* Try to find the item in DEST. Maybe we could binary search? */ - while (id >= 0 && dest->elems[id] > src1->elems[i1]) - --id; - - if (id < 0 || dest->elems[id] != src1->elems[i1]) - dest->elems[--sbase] = src1->elems[i1]; - - if (--i1 < 0 || --i2 < 0) - break; - } - - /* Lower the highest of the two items. */ - else if (src1->elems[i1] < src2->elems[i2]) - { - if (--i2 < 0) - break; - } - else - { - if (--i1 < 0) - break; - } - } - - id = dest->nelem - 1; - is = dest->nelem + src1->nelem + src2->nelem - 1; - delta = is - sbase + 1; - - /* Now copy. When DELTA becomes zero, the remaining - DEST elements are already in place; this is more or - less the same loop that is in re_node_set_merge. */ - dest->nelem += delta; - if (delta > 0 && id >= 0) - for (;;) - { - if (dest->elems[is] > dest->elems[id]) - { - /* Copy from the top. */ - dest->elems[id + delta--] = dest->elems[is--]; - if (delta == 0) - break; - } - else - { - /* Slide from the bottom. */ - dest->elems[id + delta] = dest->elems[id]; - if (--id < 0) - break; - } - } - - /* Copy remaining SRC elements. */ - memcpy (dest->elems, dest->elems + sbase, delta * sizeof (int)); - - return REG_NOERROR; -} - -/* Calculate the union set of the sets SRC1 and SRC2. And store it to - DEST. Return value indicate the error code or REG_NOERROR if succeeded. */ - -static reg_errcode_t -internal_function -re_node_set_init_union (re_node_set *dest, const re_node_set *src1, - const re_node_set *src2) -{ - int i1, i2, id; - if (src1 != NULL && src1->nelem > 0 && src2 != NULL && src2->nelem > 0) - { - dest->alloc = src1->nelem + src2->nelem; - dest->elems = re_malloc (int, dest->alloc); - if (BE (dest->elems == NULL, 0)) - return REG_ESPACE; - } - else - { - if (src1 != NULL && src1->nelem > 0) - return re_node_set_init_copy (dest, src1); - else if (src2 != NULL && src2->nelem > 0) - return re_node_set_init_copy (dest, src2); - else - re_node_set_init_empty (dest); - return REG_NOERROR; - } - for (i1 = i2 = id = 0 ; i1 < src1->nelem && i2 < src2->nelem ;) - { - if (src1->elems[i1] > src2->elems[i2]) - { - dest->elems[id++] = src2->elems[i2++]; - continue; - } - if (src1->elems[i1] == src2->elems[i2]) - ++i2; - dest->elems[id++] = src1->elems[i1++]; - } - if (i1 < src1->nelem) - { - memcpy (dest->elems + id, src1->elems + i1, - (src1->nelem - i1) * sizeof (int)); - id += src1->nelem - i1; - } - else if (i2 < src2->nelem) - { - memcpy (dest->elems + id, src2->elems + i2, - (src2->nelem - i2) * sizeof (int)); - id += src2->nelem - i2; - } - dest->nelem = id; - return REG_NOERROR; -} - -/* Calculate the union set of the sets DEST and SRC. And store it to - DEST. Return value indicate the error code or REG_NOERROR if succeeded. */ - -static reg_errcode_t -internal_function -re_node_set_merge (re_node_set *dest, const re_node_set *src) -{ - int is, id, sbase, delta; - if (src == NULL || src->nelem == 0) - return REG_NOERROR; - if (dest->alloc < 2 * src->nelem + dest->nelem) - { - int new_alloc = 2 * (src->nelem + dest->alloc); - int *new_buffer = re_realloc (dest->elems, int, new_alloc); - if (BE (new_buffer == NULL, 0)) - return REG_ESPACE; - dest->elems = new_buffer; - dest->alloc = new_alloc; - } - - if (BE (dest->nelem == 0, 0)) - { - dest->nelem = src->nelem; - memcpy (dest->elems, src->elems, src->nelem * sizeof (int)); - return REG_NOERROR; - } - - /* Copy into the top of DEST the items of SRC that are not - found in DEST. Maybe we could binary search in DEST? */ - for (sbase = dest->nelem + 2 * src->nelem, - is = src->nelem - 1, id = dest->nelem - 1; is >= 0 && id >= 0; ) - { - if (dest->elems[id] == src->elems[is]) - is--, id--; - else if (dest->elems[id] < src->elems[is]) - dest->elems[--sbase] = src->elems[is--]; - else /* if (dest->elems[id] > src->elems[is]) */ - --id; - } - - if (is >= 0) - { - /* If DEST is exhausted, the remaining items of SRC must be unique. */ - sbase -= is + 1; - memcpy (dest->elems + sbase, src->elems, (is + 1) * sizeof (int)); - } - - id = dest->nelem - 1; - is = dest->nelem + 2 * src->nelem - 1; - delta = is - sbase + 1; - if (delta == 0) - return REG_NOERROR; - - /* Now copy. When DELTA becomes zero, the remaining - DEST elements are already in place. */ - dest->nelem += delta; - for (;;) - { - if (dest->elems[is] > dest->elems[id]) - { - /* Copy from the top. */ - dest->elems[id + delta--] = dest->elems[is--]; - if (delta == 0) - break; - } - else - { - /* Slide from the bottom. */ - dest->elems[id + delta] = dest->elems[id]; - if (--id < 0) - { - /* Copy remaining SRC elements. */ - memcpy (dest->elems, dest->elems + sbase, - delta * sizeof (int)); - break; - } - } - } - - return REG_NOERROR; -} - -/* Insert the new element ELEM to the re_node_set* SET. - SET should not already have ELEM. - return -1 if an error is occured, return 1 otherwise. */ - -static int -internal_function -re_node_set_insert (re_node_set *set, int elem) -{ - int idx; - /* In case the set is empty. */ - if (set->alloc == 0) - { - if (BE (re_node_set_init_1 (set, elem) == REG_NOERROR, 1)) - return 1; - else - return -1; - } - - if (BE (set->nelem, 0) == 0) - { - /* We already guaranteed above that set->alloc != 0. */ - set->elems[0] = elem; - ++set->nelem; - return 1; - } - - /* Realloc if we need. */ - if (set->alloc == set->nelem) - { - int *new_elems; - set->alloc = set->alloc * 2; - new_elems = re_realloc (set->elems, int, set->alloc); - if (BE (new_elems == NULL, 0)) - return -1; - set->elems = new_elems; - } - - /* Move the elements which follows the new element. Test the - first element separately to skip a check in the inner loop. */ - if (elem < set->elems[0]) - { - idx = 0; - for (idx = set->nelem; idx > 0; idx--) - set->elems[idx] = set->elems[idx - 1]; - } - else - { - for (idx = set->nelem; set->elems[idx - 1] > elem; idx--) - set->elems[idx] = set->elems[idx - 1]; - } - - /* Insert the new element. */ - set->elems[idx] = elem; - ++set->nelem; - return 1; -} - -/* Insert the new element ELEM to the re_node_set* SET. - SET should not already have any element greater than or equal to ELEM. - Return -1 if an error is occured, return 1 otherwise. */ - -static int -internal_function -re_node_set_insert_last (re_node_set *set, int elem) -{ - /* Realloc if we need. */ - if (set->alloc == set->nelem) - { - int *new_elems; - set->alloc = (set->alloc + 1) * 2; - new_elems = re_realloc (set->elems, int, set->alloc); - if (BE (new_elems == NULL, 0)) - return -1; - set->elems = new_elems; - } - - /* Insert the new element. */ - set->elems[set->nelem++] = elem; - return 1; -} - -/* Compare two node sets SET1 and SET2. - return 1 if SET1 and SET2 are equivalent, return 0 otherwise. */ - -static int -internal_function __attribute ((pure)) -re_node_set_compare (const re_node_set *set1, const re_node_set *set2) -{ - int i; - if (set1 == NULL || set2 == NULL || set1->nelem != set2->nelem) - return 0; - for (i = set1->nelem ; --i >= 0 ; ) - if (set1->elems[i] != set2->elems[i]) - return 0; - return 1; -} - -/* Return (idx + 1) if SET contains the element ELEM, return 0 otherwise. */ - -static int -internal_function __attribute ((pure)) -re_node_set_contains (const re_node_set *set, int elem) -{ - unsigned int idx, right, mid; - if (set->nelem <= 0) - return 0; - - /* Binary search the element. */ - idx = 0; - right = set->nelem - 1; - while (idx < right) - { - mid = (idx + right) / 2; - if (set->elems[mid] < elem) - idx = mid + 1; - else - right = mid; - } - return set->elems[idx] == elem ? idx + 1 : 0; -} - -static void -internal_function -re_node_set_remove_at (re_node_set *set, int idx) -{ - if (idx < 0 || idx >= set->nelem) - return; - --set->nelem; - for (; idx < set->nelem; idx++) - set->elems[idx] = set->elems[idx + 1]; -} - - -/* Add the token TOKEN to dfa->nodes, and return the index of the token. - Or return -1, if an error will be occured. */ - -static int -internal_function -re_dfa_add_node (re_dfa_t *dfa, re_token_t token) -{ - if (BE (dfa->nodes_len >= dfa->nodes_alloc, 0)) - { - size_t new_nodes_alloc = dfa->nodes_alloc * 2; - int *new_nexts, *new_indices; - re_node_set *new_edests, *new_eclosures; - re_token_t *new_nodes; - - /* Avoid overflows in realloc. */ - const size_t max_object_size = MAX (sizeof (re_token_t), - MAX (sizeof (re_node_set), - sizeof (int))); - if (BE (SIZE_MAX / max_object_size < new_nodes_alloc, 0)) - return -1; - - new_nodes = re_realloc (dfa->nodes, re_token_t, new_nodes_alloc); - if (BE (new_nodes == NULL, 0)) - return -1; - dfa->nodes = new_nodes; - new_nexts = re_realloc (dfa->nexts, int, new_nodes_alloc); - new_indices = re_realloc (dfa->org_indices, int, new_nodes_alloc); - new_edests = re_realloc (dfa->edests, re_node_set, new_nodes_alloc); - new_eclosures = re_realloc (dfa->eclosures, re_node_set, new_nodes_alloc); - if (BE (new_nexts == NULL || new_indices == NULL - || new_edests == NULL || new_eclosures == NULL, 0)) - return -1; - dfa->nexts = new_nexts; - dfa->org_indices = new_indices; - dfa->edests = new_edests; - dfa->eclosures = new_eclosures; - dfa->nodes_alloc = new_nodes_alloc; - } - dfa->nodes[dfa->nodes_len] = token; - dfa->nodes[dfa->nodes_len].constraint = 0; -#ifdef RE_ENABLE_I18N - dfa->nodes[dfa->nodes_len].accept_mb = - (token.type == OP_PERIOD && dfa->mb_cur_max > 1) || token.type == COMPLEX_BRACKET; -#endif - dfa->nexts[dfa->nodes_len] = -1; - re_node_set_init_empty (dfa->edests + dfa->nodes_len); - re_node_set_init_empty (dfa->eclosures + dfa->nodes_len); - return dfa->nodes_len++; -} - -static inline unsigned int -internal_function -calc_state_hash (const re_node_set *nodes, unsigned int context) -{ - unsigned int hash = nodes->nelem + context; - int i; - for (i = 0 ; i < nodes->nelem ; i++) - hash += nodes->elems[i]; - return hash; -} - -/* Search for the state whose node_set is equivalent to NODES. - Return the pointer to the state, if we found it in the DFA. - Otherwise create the new one and return it. In case of an error - return NULL and set the error code in ERR. - Note: - We assume NULL as the invalid state, then it is possible that - return value is NULL and ERR is REG_NOERROR. - - We never return non-NULL value in case of any errors, it is for - optimization. */ - -static re_dfastate_t * -internal_function -re_acquire_state (reg_errcode_t *err, const re_dfa_t *dfa, - const re_node_set *nodes) -{ - unsigned int hash; - re_dfastate_t *new_state; - struct re_state_table_entry *spot; - int i; - if (BE (nodes->nelem == 0, 0)) - { - *err = REG_NOERROR; - return NULL; - } - hash = calc_state_hash (nodes, 0); - spot = dfa->state_table + (hash & dfa->state_hash_mask); - - for (i = 0 ; i < spot->num ; i++) - { - re_dfastate_t *state = spot->array[i]; - if (hash != state->hash) - continue; - if (re_node_set_compare (&state->nodes, nodes)) - return state; - } - - /* There are no appropriate state in the dfa, create the new one. */ - new_state = create_ci_newstate (dfa, nodes, hash); - if (BE (new_state == NULL, 0)) - *err = REG_ESPACE; - - return new_state; -} - -/* Search for the state whose node_set is equivalent to NODES and - whose context is equivalent to CONTEXT. - Return the pointer to the state, if we found it in the DFA. - Otherwise create the new one and return it. In case of an error - return NULL and set the error code in ERR. - Note: - We assume NULL as the invalid state, then it is possible that - return value is NULL and ERR is REG_NOERROR. - - We never return non-NULL value in case of any errors, it is for - optimization. */ - -static re_dfastate_t * -internal_function -re_acquire_state_context (reg_errcode_t *err, const re_dfa_t *dfa, - const re_node_set *nodes, unsigned int context) -{ - unsigned int hash; - re_dfastate_t *new_state; - struct re_state_table_entry *spot; - int i; - if (nodes->nelem == 0) - { - *err = REG_NOERROR; - return NULL; - } - hash = calc_state_hash (nodes, context); - spot = dfa->state_table + (hash & dfa->state_hash_mask); - - for (i = 0 ; i < spot->num ; i++) - { - re_dfastate_t *state = spot->array[i]; - if (state->hash == hash - && state->context == context - && re_node_set_compare (state->entrance_nodes, nodes)) - return state; - } - /* There are no appropriate state in `dfa', create the new one. */ - new_state = create_cd_newstate (dfa, nodes, context, hash); - if (BE (new_state == NULL, 0)) - *err = REG_ESPACE; - - return new_state; -} - -/* Finish initialization of the new state NEWSTATE, and using its hash value - HASH put in the appropriate bucket of DFA's state table. Return value - indicates the error code if failed. */ - -static reg_errcode_t -register_state (const re_dfa_t *dfa, re_dfastate_t *newstate, - unsigned int hash) -{ - struct re_state_table_entry *spot; - reg_errcode_t err; - int i; - - newstate->hash = hash; - err = re_node_set_alloc (&newstate->non_eps_nodes, newstate->nodes.nelem); - if (BE (err != REG_NOERROR, 0)) - return REG_ESPACE; - for (i = 0; i < newstate->nodes.nelem; i++) - { - int elem = newstate->nodes.elems[i]; - if (!IS_EPSILON_NODE (dfa->nodes[elem].type)) - if (re_node_set_insert_last (&newstate->non_eps_nodes, elem) < 0) - return REG_ESPACE; - } - - spot = dfa->state_table + (hash & dfa->state_hash_mask); - if (BE (spot->alloc <= spot->num, 0)) - { - int new_alloc = 2 * spot->num + 2; - re_dfastate_t **new_array = re_realloc (spot->array, re_dfastate_t *, - new_alloc); - if (BE (new_array == NULL, 0)) - return REG_ESPACE; - spot->array = new_array; - spot->alloc = new_alloc; - } - spot->array[spot->num++] = newstate; - return REG_NOERROR; -} - -static void -free_state (re_dfastate_t *state) -{ - re_node_set_free (&state->non_eps_nodes); - re_node_set_free (&state->inveclosure); - if (state->entrance_nodes != &state->nodes) - { - re_node_set_free (state->entrance_nodes); - re_free (state->entrance_nodes); - } - re_node_set_free (&state->nodes); - re_free (state->word_trtable); - re_free (state->trtable); - re_free (state); -} - -/* Create the new state which is independ of contexts. - Return the new state if succeeded, otherwise return NULL. */ - -static re_dfastate_t * -internal_function -create_ci_newstate (const re_dfa_t *dfa, const re_node_set *nodes, - unsigned int hash) -{ - int i; - reg_errcode_t err; - re_dfastate_t *newstate; - - newstate = (re_dfastate_t *) calloc (sizeof (re_dfastate_t), 1); - if (BE (newstate == NULL, 0)) - return NULL; - err = re_node_set_init_copy (&newstate->nodes, nodes); - if (BE (err != REG_NOERROR, 0)) - { - re_free (newstate); - return NULL; - } - - newstate->entrance_nodes = &newstate->nodes; - for (i = 0 ; i < nodes->nelem ; i++) - { - re_token_t *node = dfa->nodes + nodes->elems[i]; - re_token_type_t type = node->type; - if (type == CHARACTER && !node->constraint) - continue; -#ifdef RE_ENABLE_I18N - newstate->accept_mb |= node->accept_mb; -#endif /* RE_ENABLE_I18N */ - - /* If the state has the halt node, the state is a halt state. */ - if (type == END_OF_RE) - newstate->halt = 1; - else if (type == OP_BACK_REF) - newstate->has_backref = 1; - else if (type == ANCHOR || node->constraint) - newstate->has_constraint = 1; - } - err = register_state (dfa, newstate, hash); - if (BE (err != REG_NOERROR, 0)) - { - free_state (newstate); - newstate = NULL; - } - return newstate; -} - -/* Create the new state which is depend on the context CONTEXT. - Return the new state if succeeded, otherwise return NULL. */ - -static re_dfastate_t * -internal_function -create_cd_newstate (const re_dfa_t *dfa, const re_node_set *nodes, - unsigned int context, unsigned int hash) -{ - int i, nctx_nodes = 0; - reg_errcode_t err; - re_dfastate_t *newstate; - - newstate = (re_dfastate_t *) calloc (sizeof (re_dfastate_t), 1); - if (BE (newstate == NULL, 0)) - return NULL; - err = re_node_set_init_copy (&newstate->nodes, nodes); - if (BE (err != REG_NOERROR, 0)) - { - re_free (newstate); - return NULL; - } - - newstate->context = context; - newstate->entrance_nodes = &newstate->nodes; - - for (i = 0 ; i < nodes->nelem ; i++) - { - re_token_t *node = dfa->nodes + nodes->elems[i]; - re_token_type_t type = node->type; - unsigned int constraint = node->constraint; - - if (type == CHARACTER && !constraint) - continue; -#ifdef RE_ENABLE_I18N - newstate->accept_mb |= node->accept_mb; -#endif /* RE_ENABLE_I18N */ - - /* If the state has the halt node, the state is a halt state. */ - if (type == END_OF_RE) - newstate->halt = 1; - else if (type == OP_BACK_REF) - newstate->has_backref = 1; - - if (constraint) - { - if (newstate->entrance_nodes == &newstate->nodes) - { - newstate->entrance_nodes = re_malloc (re_node_set, 1); - if (BE (newstate->entrance_nodes == NULL, 0)) - { - free_state (newstate); - return NULL; - } - if (re_node_set_init_copy (newstate->entrance_nodes, nodes) - != REG_NOERROR) - return NULL; - nctx_nodes = 0; - newstate->has_constraint = 1; - } - - if (NOT_SATISFY_PREV_CONSTRAINT (constraint,context)) - { - re_node_set_remove_at (&newstate->nodes, i - nctx_nodes); - ++nctx_nodes; - } - } - } - err = register_state (dfa, newstate, hash); - if (BE (err != REG_NOERROR, 0)) - { - free_state (newstate); - newstate = NULL; - } - return newstate; -} diff --git a/vendor/libgit2/deps/regex/regex_internal.h b/vendor/libgit2/deps/regex/regex_internal.h deleted file mode 100644 index 53ccebecd8..0000000000 --- a/vendor/libgit2/deps/regex/regex_internal.h +++ /dev/null @@ -1,819 +0,0 @@ -/* Extended regular expression matching and search library. - Copyright (C) 2002-2005, 2007, 2008, 2010 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Isamu Hasegawa . - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, write to the Free - Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA - 02111-1307 USA. */ - -#ifndef _REGEX_INTERNAL_H -#define _REGEX_INTERNAL_H 1 - -#include -#include -#include -#include -#include - -#ifndef UNUSED -# ifdef __GNUC__ -# define UNUSED __attribute__((unused)) -# else -# define UNUSED -# endif -#endif - -#if defined HAVE_LANGINFO_H || defined HAVE_LANGINFO_CODESET || defined _LIBC -# include -#endif -#if defined HAVE_LOCALE_H || defined _LIBC -# include -#endif -#if defined HAVE_WCHAR_H || defined _LIBC -# include -#endif /* HAVE_WCHAR_H || _LIBC */ -#if defined HAVE_WCTYPE_H || defined _LIBC -# include -#endif /* HAVE_WCTYPE_H || _LIBC */ -#if defined HAVE_STDBOOL_H || defined _LIBC -# include -#endif /* HAVE_STDBOOL_H || _LIBC */ -#if !defined(ZOS_USS) -#if defined HAVE_STDINT_H || defined _LIBC -# include -#endif /* HAVE_STDINT_H || _LIBC */ -#endif /* !ZOS_USS */ -#if defined _LIBC -# include -#else -# define __libc_lock_define(CLASS,NAME) -# define __libc_lock_init(NAME) do { } while (0) -# define __libc_lock_lock(NAME) do { } while (0) -# define __libc_lock_unlock(NAME) do { } while (0) -#endif - -#ifndef GAWK -/* In case that the system doesn't have isblank(). */ -#if !defined _LIBC && !defined HAVE_ISBLANK && !defined isblank -# define isblank(ch) ((ch) == ' ' || (ch) == '\t') -#endif -#else /* GAWK */ -/* - * This is a mess. On glibc systems you have to define - * a magic constant to get isblank() out of , since it's - * a C99 function. To heck with all that and borrow a page from - * dfa.c's book. - */ - -static int -is_blank (int c) -{ - return (c == ' ' || c == '\t'); -} -#endif /* GAWK */ - -#ifdef _LIBC -# ifndef _RE_DEFINE_LOCALE_FUNCTIONS -# define _RE_DEFINE_LOCALE_FUNCTIONS 1 -# include -# include -# include -# endif -#endif - -/* This is for other GNU distributions with internationalized messages. */ -#if (HAVE_LIBINTL_H && ENABLE_NLS) || defined _LIBC -# include -# ifdef _LIBC -# undef gettext -# define gettext(msgid) \ - INTUSE(__dcgettext) (_libc_intl_domainname, msgid, LC_MESSAGES) -# endif -#else -# define gettext(msgid) (msgid) -#endif - -#ifndef gettext_noop -/* This define is so xgettext can find the internationalizable - strings. */ -# define gettext_noop(String) String -#endif - -/* For loser systems without the definition. */ -#ifndef SIZE_MAX -# define SIZE_MAX ((size_t) -1) -#endif - -#ifndef NO_MBSUPPORT -#include "mbsupport.h" /* gawk */ -#endif -#ifndef MB_CUR_MAX -#define MB_CUR_MAX 1 -#endif - -#if (defined MBS_SUPPORT) || _LIBC -# define RE_ENABLE_I18N -#endif - -#if __GNUC__ >= 3 -# define BE(expr, val) __builtin_expect (expr, val) -#else -# define BE(expr, val) (expr) -# ifdef inline -# undef inline -# endif -# define inline -#endif - -/* Number of single byte character. */ -#define SBC_MAX 256 - -#define COLL_ELEM_LEN_MAX 8 - -/* The character which represents newline. */ -#define NEWLINE_CHAR '\n' -#define WIDE_NEWLINE_CHAR L'\n' - -/* Rename to standard API for using out of glibc. */ -#ifndef _LIBC -# ifdef __wctype -# undef __wctype -# endif -# define __wctype wctype -# ifdef __iswctype -# undef __iswctype -# endif -# define __iswctype iswctype -# define __btowc btowc -# define __mbrtowc mbrtowc -#undef __mempcpy /* GAWK */ -# define __mempcpy mempcpy -# define __wcrtomb wcrtomb -# define __regfree regfree -# define attribute_hidden -#endif /* not _LIBC */ - -#ifdef __GNUC__ -# define __attribute(arg) __attribute__ (arg) -#else -# define __attribute(arg) -#endif - -extern const char __re_error_msgid[] attribute_hidden; -extern const size_t __re_error_msgid_idx[] attribute_hidden; - -/* An integer used to represent a set of bits. It must be unsigned, - and must be at least as wide as unsigned int. */ -typedef unsigned long int bitset_word_t; -/* All bits set in a bitset_word_t. */ -#define BITSET_WORD_MAX ULONG_MAX -/* Number of bits in a bitset_word_t. Cast to int as most code use it - * like that for counting */ -#define BITSET_WORD_BITS ((int)(sizeof (bitset_word_t) * CHAR_BIT)) -/* Number of bitset_word_t in a bit_set. */ -#define BITSET_WORDS (SBC_MAX / BITSET_WORD_BITS) -typedef bitset_word_t bitset_t[BITSET_WORDS]; -typedef bitset_word_t *re_bitset_ptr_t; -typedef const bitset_word_t *re_const_bitset_ptr_t; - -#define bitset_set(set,i) \ - (set[i / BITSET_WORD_BITS] |= (bitset_word_t) 1 << i % BITSET_WORD_BITS) -#define bitset_clear(set,i) \ - (set[i / BITSET_WORD_BITS] &= ~((bitset_word_t) 1 << i % BITSET_WORD_BITS)) -#define bitset_contain(set,i) \ - (set[i / BITSET_WORD_BITS] & ((bitset_word_t) 1 << i % BITSET_WORD_BITS)) -#define bitset_empty(set) memset (set, '\0', sizeof (bitset_t)) -#define bitset_set_all(set) memset (set, '\xff', sizeof (bitset_t)) -#define bitset_copy(dest,src) memcpy (dest, src, sizeof (bitset_t)) - -#define PREV_WORD_CONSTRAINT 0x0001 -#define PREV_NOTWORD_CONSTRAINT 0x0002 -#define NEXT_WORD_CONSTRAINT 0x0004 -#define NEXT_NOTWORD_CONSTRAINT 0x0008 -#define PREV_NEWLINE_CONSTRAINT 0x0010 -#define NEXT_NEWLINE_CONSTRAINT 0x0020 -#define PREV_BEGBUF_CONSTRAINT 0x0040 -#define NEXT_ENDBUF_CONSTRAINT 0x0080 -#define WORD_DELIM_CONSTRAINT 0x0100 -#define NOT_WORD_DELIM_CONSTRAINT 0x0200 - -typedef enum -{ - INSIDE_WORD = PREV_WORD_CONSTRAINT | NEXT_WORD_CONSTRAINT, - WORD_FIRST = PREV_NOTWORD_CONSTRAINT | NEXT_WORD_CONSTRAINT, - WORD_LAST = PREV_WORD_CONSTRAINT | NEXT_NOTWORD_CONSTRAINT, - INSIDE_NOTWORD = PREV_NOTWORD_CONSTRAINT | NEXT_NOTWORD_CONSTRAINT, - LINE_FIRST = PREV_NEWLINE_CONSTRAINT, - LINE_LAST = NEXT_NEWLINE_CONSTRAINT, - BUF_FIRST = PREV_BEGBUF_CONSTRAINT, - BUF_LAST = NEXT_ENDBUF_CONSTRAINT, - WORD_DELIM = WORD_DELIM_CONSTRAINT, - NOT_WORD_DELIM = NOT_WORD_DELIM_CONSTRAINT -} re_context_type; - -typedef struct -{ - int alloc; - int nelem; - int *elems; -} re_node_set; - -typedef enum -{ - NON_TYPE = 0, - - /* Node type, These are used by token, node, tree. */ - CHARACTER = 1, - END_OF_RE = 2, - SIMPLE_BRACKET = 3, - OP_BACK_REF = 4, - OP_PERIOD = 5, -#ifdef RE_ENABLE_I18N - COMPLEX_BRACKET = 6, - OP_UTF8_PERIOD = 7, -#endif /* RE_ENABLE_I18N */ - - /* We define EPSILON_BIT as a macro so that OP_OPEN_SUBEXP is used - when the debugger shows values of this enum type. */ -#define EPSILON_BIT 8 - OP_OPEN_SUBEXP = EPSILON_BIT | 0, - OP_CLOSE_SUBEXP = EPSILON_BIT | 1, - OP_ALT = EPSILON_BIT | 2, - OP_DUP_ASTERISK = EPSILON_BIT | 3, - ANCHOR = EPSILON_BIT | 4, - - /* Tree type, these are used only by tree. */ - CONCAT = 16, - SUBEXP = 17, - - /* Token type, these are used only by token. */ - OP_DUP_PLUS = 18, - OP_DUP_QUESTION, - OP_OPEN_BRACKET, - OP_CLOSE_BRACKET, - OP_CHARSET_RANGE, - OP_OPEN_DUP_NUM, - OP_CLOSE_DUP_NUM, - OP_NON_MATCH_LIST, - OP_OPEN_COLL_ELEM, - OP_CLOSE_COLL_ELEM, - OP_OPEN_EQUIV_CLASS, - OP_CLOSE_EQUIV_CLASS, - OP_OPEN_CHAR_CLASS, - OP_CLOSE_CHAR_CLASS, - OP_WORD, - OP_NOTWORD, - OP_SPACE, - OP_NOTSPACE, - BACK_SLASH - -} re_token_type_t; - -#ifdef RE_ENABLE_I18N -typedef struct -{ - /* Multibyte characters. */ - wchar_t *mbchars; - - /* Collating symbols. */ -# ifdef _LIBC - int32_t *coll_syms; -# endif - - /* Equivalence classes. */ -# ifdef _LIBC - int32_t *equiv_classes; -# endif - - /* Range expressions. */ -# ifdef _LIBC - uint32_t *range_starts; - uint32_t *range_ends; -# else /* not _LIBC */ - wchar_t *range_starts; - wchar_t *range_ends; -# endif /* not _LIBC */ - - /* Character classes. */ - wctype_t *char_classes; - - /* If this character set is the non-matching list. */ - unsigned int non_match : 1; - - /* # of multibyte characters. */ - int nmbchars; - - /* # of collating symbols. */ - int ncoll_syms; - - /* # of equivalence classes. */ - int nequiv_classes; - - /* # of range expressions. */ - int nranges; - - /* # of character classes. */ - int nchar_classes; -} re_charset_t; -#endif /* RE_ENABLE_I18N */ - -typedef struct -{ - union - { - unsigned char c; /* for CHARACTER */ - re_bitset_ptr_t sbcset; /* for SIMPLE_BRACKET */ -#ifdef RE_ENABLE_I18N - re_charset_t *mbcset; /* for COMPLEX_BRACKET */ -#endif /* RE_ENABLE_I18N */ - int idx; /* for BACK_REF */ - re_context_type ctx_type; /* for ANCHOR */ - } opr; -#if __GNUC__ >= 2 - re_token_type_t type : 8; -#else - re_token_type_t type; -#endif - unsigned int constraint : 10; /* context constraint */ - unsigned int duplicated : 1; - unsigned int opt_subexp : 1; -#ifdef RE_ENABLE_I18N - unsigned int accept_mb : 1; - /* These 2 bits can be moved into the union if needed (e.g. if running out - of bits; move opr.c to opr.c.c and move the flags to opr.c.flags). */ - unsigned int mb_partial : 1; -#endif - unsigned int word_char : 1; -} re_token_t; - -#define IS_EPSILON_NODE(type) ((type) & EPSILON_BIT) - -struct re_string_t -{ - /* Indicate the raw buffer which is the original string passed as an - argument of regexec(), re_search(), etc.. */ - const unsigned char *raw_mbs; - /* Store the multibyte string. In case of "case insensitive mode" like - REG_ICASE, upper cases of the string are stored, otherwise MBS points - the same address that RAW_MBS points. */ - unsigned char *mbs; -#ifdef RE_ENABLE_I18N - /* Store the wide character string which is corresponding to MBS. */ - wint_t *wcs; - int *offsets; - mbstate_t cur_state; -#endif - /* Index in RAW_MBS. Each character mbs[i] corresponds to - raw_mbs[raw_mbs_idx + i]. */ - int raw_mbs_idx; - /* The length of the valid characters in the buffers. */ - int valid_len; - /* The corresponding number of bytes in raw_mbs array. */ - int valid_raw_len; - /* The length of the buffers MBS and WCS. */ - int bufs_len; - /* The index in MBS, which is updated by re_string_fetch_byte. */ - int cur_idx; - /* length of RAW_MBS array. */ - int raw_len; - /* This is RAW_LEN - RAW_MBS_IDX + VALID_LEN - VALID_RAW_LEN. */ - int len; - /* End of the buffer may be shorter than its length in the cases such - as re_match_2, re_search_2. Then, we use STOP for end of the buffer - instead of LEN. */ - int raw_stop; - /* This is RAW_STOP - RAW_MBS_IDX adjusted through OFFSETS. */ - int stop; - - /* The context of mbs[0]. We store the context independently, since - the context of mbs[0] may be different from raw_mbs[0], which is - the beginning of the input string. */ - unsigned int tip_context; - /* The translation passed as a part of an argument of re_compile_pattern. */ - RE_TRANSLATE_TYPE trans; - /* Copy of re_dfa_t's word_char. */ - re_const_bitset_ptr_t word_char; - /* 1 if REG_ICASE. */ - unsigned char icase; - unsigned char is_utf8; - unsigned char map_notascii; - unsigned char mbs_allocated; - unsigned char offsets_needed; - unsigned char newline_anchor; - unsigned char word_ops_used; - int mb_cur_max; -}; -typedef struct re_string_t re_string_t; - - -struct re_dfa_t; -typedef struct re_dfa_t re_dfa_t; - -#ifndef _LIBC -# ifdef __i386__ -# define internal_function __attribute ((regparm (3), stdcall)) -# else -# define internal_function -# endif -#endif - -#ifndef NOT_IN_libc -static reg_errcode_t re_string_realloc_buffers (re_string_t *pstr, - int new_buf_len) - internal_function; -# ifdef RE_ENABLE_I18N -static void build_wcs_buffer (re_string_t *pstr) internal_function; -static reg_errcode_t build_wcs_upper_buffer (re_string_t *pstr) - internal_function; -# endif /* RE_ENABLE_I18N */ -static void build_upper_buffer (re_string_t *pstr) internal_function; -static void re_string_translate_buffer (re_string_t *pstr) internal_function; -static unsigned int re_string_context_at (const re_string_t *input, int idx, - int eflags) - internal_function __attribute ((pure)); -#endif -#define re_string_peek_byte(pstr, offset) \ - ((pstr)->mbs[(pstr)->cur_idx + offset]) -#define re_string_fetch_byte(pstr) \ - ((pstr)->mbs[(pstr)->cur_idx++]) -#define re_string_first_byte(pstr, idx) \ - ((idx) == (pstr)->valid_len || (pstr)->wcs[idx] != WEOF) -#define re_string_is_single_byte_char(pstr, idx) \ - ((pstr)->wcs[idx] != WEOF && ((pstr)->valid_len == (idx) + 1 \ - || (pstr)->wcs[(idx) + 1] != WEOF)) -#define re_string_eoi(pstr) ((pstr)->stop <= (pstr)->cur_idx) -#define re_string_cur_idx(pstr) ((pstr)->cur_idx) -#define re_string_get_buffer(pstr) ((pstr)->mbs) -#define re_string_length(pstr) ((pstr)->len) -#define re_string_byte_at(pstr,idx) ((pstr)->mbs[idx]) -#define re_string_skip_bytes(pstr,idx) ((pstr)->cur_idx += (idx)) -#define re_string_set_index(pstr,idx) ((pstr)->cur_idx = (idx)) - -#ifndef _LIBC -# if HAVE_ALLOCA -# if (_MSC_VER) -# include -# define __libc_use_alloca(n) 0 -# else -# include -/* The OS usually guarantees only one guard page at the bottom of the stack, - and a page size can be as small as 4096 bytes. So we cannot safely - allocate anything larger than 4096 bytes. Also care for the possibility - of a few compiler-allocated temporary stack slots. */ -# define __libc_use_alloca(n) ((n) < 4032) -# endif -# else -/* alloca is implemented with malloc, so just use malloc. */ -# define __libc_use_alloca(n) 0 -# endif -#endif - -#define re_malloc(t,n) ((t *) malloc ((n) * sizeof (t))) -/* SunOS 4.1.x realloc doesn't accept null pointers: pre-Standard C. Sigh. */ -#define re_realloc(p,t,n) ((p != NULL) ? (t *) realloc (p,(n)*sizeof(t)) : (t *) calloc(n,sizeof(t))) -#define re_free(p) free (p) - -struct bin_tree_t -{ - struct bin_tree_t *parent; - struct bin_tree_t *left; - struct bin_tree_t *right; - struct bin_tree_t *first; - struct bin_tree_t *next; - - re_token_t token; - - /* `node_idx' is the index in dfa->nodes, if `type' == 0. - Otherwise `type' indicate the type of this node. */ - int node_idx; -}; -typedef struct bin_tree_t bin_tree_t; - -#define BIN_TREE_STORAGE_SIZE \ - ((1024 - sizeof (void *)) / sizeof (bin_tree_t)) - -struct bin_tree_storage_t -{ - struct bin_tree_storage_t *next; - bin_tree_t data[BIN_TREE_STORAGE_SIZE]; -}; -typedef struct bin_tree_storage_t bin_tree_storage_t; - -#define CONTEXT_WORD 1 -#define CONTEXT_NEWLINE (CONTEXT_WORD << 1) -#define CONTEXT_BEGBUF (CONTEXT_NEWLINE << 1) -#define CONTEXT_ENDBUF (CONTEXT_BEGBUF << 1) - -#define IS_WORD_CONTEXT(c) ((c) & CONTEXT_WORD) -#define IS_NEWLINE_CONTEXT(c) ((c) & CONTEXT_NEWLINE) -#define IS_BEGBUF_CONTEXT(c) ((c) & CONTEXT_BEGBUF) -#define IS_ENDBUF_CONTEXT(c) ((c) & CONTEXT_ENDBUF) -#define IS_ORDINARY_CONTEXT(c) ((c) == 0) - -#define IS_WORD_CHAR(ch) (isalnum (ch) || (ch) == '_') -#define IS_NEWLINE(ch) ((ch) == NEWLINE_CHAR) -#define IS_WIDE_WORD_CHAR(ch) (iswalnum (ch) || (ch) == L'_') -#define IS_WIDE_NEWLINE(ch) ((ch) == WIDE_NEWLINE_CHAR) - -#define NOT_SATISFY_PREV_CONSTRAINT(constraint,context) \ - ((((constraint) & PREV_WORD_CONSTRAINT) && !IS_WORD_CONTEXT (context)) \ - || ((constraint & PREV_NOTWORD_CONSTRAINT) && IS_WORD_CONTEXT (context)) \ - || ((constraint & PREV_NEWLINE_CONSTRAINT) && !IS_NEWLINE_CONTEXT (context))\ - || ((constraint & PREV_BEGBUF_CONSTRAINT) && !IS_BEGBUF_CONTEXT (context))) - -#define NOT_SATISFY_NEXT_CONSTRAINT(constraint,context) \ - ((((constraint) & NEXT_WORD_CONSTRAINT) && !IS_WORD_CONTEXT (context)) \ - || (((constraint) & NEXT_NOTWORD_CONSTRAINT) && IS_WORD_CONTEXT (context)) \ - || (((constraint) & NEXT_NEWLINE_CONSTRAINT) && !IS_NEWLINE_CONTEXT (context)) \ - || (((constraint) & NEXT_ENDBUF_CONSTRAINT) && !IS_ENDBUF_CONTEXT (context))) - -struct re_dfastate_t -{ - unsigned int hash; - re_node_set nodes; - re_node_set non_eps_nodes; - re_node_set inveclosure; - re_node_set *entrance_nodes; - struct re_dfastate_t **trtable, **word_trtable; - unsigned int context : 4; - unsigned int halt : 1; - /* If this state can accept `multi byte'. - Note that we refer to multibyte characters, and multi character - collating elements as `multi byte'. */ - unsigned int accept_mb : 1; - /* If this state has backreference node(s). */ - unsigned int has_backref : 1; - unsigned int has_constraint : 1; -}; -typedef struct re_dfastate_t re_dfastate_t; - -struct re_state_table_entry -{ - int num; - int alloc; - re_dfastate_t **array; -}; - -/* Array type used in re_sub_match_last_t and re_sub_match_top_t. */ - -typedef struct -{ - int next_idx; - int alloc; - re_dfastate_t **array; -} state_array_t; - -/* Store information about the node NODE whose type is OP_CLOSE_SUBEXP. */ - -typedef struct -{ - int node; - int str_idx; /* The position NODE match at. */ - state_array_t path; -} re_sub_match_last_t; - -/* Store information about the node NODE whose type is OP_OPEN_SUBEXP. - And information about the node, whose type is OP_CLOSE_SUBEXP, - corresponding to NODE is stored in LASTS. */ - -typedef struct -{ - int str_idx; - int node; - state_array_t *path; - int alasts; /* Allocation size of LASTS. */ - int nlasts; /* The number of LASTS. */ - re_sub_match_last_t **lasts; -} re_sub_match_top_t; - -struct re_backref_cache_entry -{ - int node; - int str_idx; - int subexp_from; - int subexp_to; - char more; - char unused; - unsigned short int eps_reachable_subexps_map; -}; - -typedef struct -{ - /* The string object corresponding to the input string. */ - re_string_t input; -#if defined _LIBC || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L) - const re_dfa_t *const dfa; -#else - const re_dfa_t *dfa; -#endif - /* EFLAGS of the argument of regexec. */ - int eflags; - /* Where the matching ends. */ - int match_last; - int last_node; - /* The state log used by the matcher. */ - re_dfastate_t **state_log; - int state_log_top; - /* Back reference cache. */ - int nbkref_ents; - int abkref_ents; - struct re_backref_cache_entry *bkref_ents; - int max_mb_elem_len; - int nsub_tops; - int asub_tops; - re_sub_match_top_t **sub_tops; -} re_match_context_t; - -typedef struct -{ - re_dfastate_t **sifted_states; - re_dfastate_t **limited_states; - int last_node; - int last_str_idx; - re_node_set limits; -} re_sift_context_t; - -struct re_fail_stack_ent_t -{ - int idx; - int node; - regmatch_t *regs; - re_node_set eps_via_nodes; -}; - -struct re_fail_stack_t -{ - int num; - int alloc; - struct re_fail_stack_ent_t *stack; -}; - -struct re_dfa_t -{ - re_token_t *nodes; - size_t nodes_alloc; - size_t nodes_len; - int *nexts; - int *org_indices; - re_node_set *edests; - re_node_set *eclosures; - re_node_set *inveclosures; - struct re_state_table_entry *state_table; - re_dfastate_t *init_state; - re_dfastate_t *init_state_word; - re_dfastate_t *init_state_nl; - re_dfastate_t *init_state_begbuf; - bin_tree_t *str_tree; - bin_tree_storage_t *str_tree_storage; - re_bitset_ptr_t sb_char; - int str_tree_storage_idx; - - /* number of subexpressions `re_nsub' is in regex_t. */ - unsigned int state_hash_mask; - int init_node; - int nbackref; /* The number of backreference in this dfa. */ - - /* Bitmap expressing which backreference is used. */ - bitset_word_t used_bkref_map; - bitset_word_t completed_bkref_map; - - unsigned int has_plural_match : 1; - /* If this dfa has "multibyte node", which is a backreference or - a node which can accept multibyte character or multi character - collating element. */ - unsigned int has_mb_node : 1; - unsigned int is_utf8 : 1; - unsigned int map_notascii : 1; - unsigned int word_ops_used : 1; - int mb_cur_max; - bitset_t word_char; - reg_syntax_t syntax; - int *subexp_map; -#ifdef DEBUG - char* re_str; -#endif -#if defined _LIBC - __libc_lock_define (, lock) -#endif -}; - -#define re_node_set_init_empty(set) memset (set, '\0', sizeof (re_node_set)) -#define re_node_set_remove(set,id) \ - (re_node_set_remove_at (set, re_node_set_contains (set, id) - 1)) -#define re_node_set_empty(p) ((p)->nelem = 0) -#define re_node_set_free(set) re_free ((set)->elems) - - -typedef enum -{ - SB_CHAR, - MB_CHAR, - EQUIV_CLASS, - COLL_SYM, - CHAR_CLASS -} bracket_elem_type; - -typedef struct -{ - bracket_elem_type type; - union - { - unsigned char ch; - unsigned char *name; - wchar_t wch; - } opr; -} bracket_elem_t; - - -/* Inline functions for bitset operation. */ -static inline void -bitset_not (bitset_t set) -{ - int bitset_i; - for (bitset_i = 0; bitset_i < BITSET_WORDS; ++bitset_i) - set[bitset_i] = ~set[bitset_i]; -} - -static inline void -bitset_merge (bitset_t dest, const bitset_t src) -{ - int bitset_i; - for (bitset_i = 0; bitset_i < BITSET_WORDS; ++bitset_i) - dest[bitset_i] |= src[bitset_i]; -} - -static inline void -bitset_mask (bitset_t dest, const bitset_t src) -{ - int bitset_i; - for (bitset_i = 0; bitset_i < BITSET_WORDS; ++bitset_i) - dest[bitset_i] &= src[bitset_i]; -} - -#ifdef RE_ENABLE_I18N -/* Inline functions for re_string. */ -static inline int -internal_function __attribute ((pure)) -re_string_char_size_at (const re_string_t *pstr, int idx) -{ - int byte_idx; - if (pstr->mb_cur_max == 1) - return 1; - for (byte_idx = 1; idx + byte_idx < pstr->valid_len; ++byte_idx) - if (pstr->wcs[idx + byte_idx] != WEOF) - break; - return byte_idx; -} - -static inline wint_t -internal_function __attribute ((pure)) -re_string_wchar_at (const re_string_t *pstr, int idx) -{ - if (pstr->mb_cur_max == 1) - return (wint_t) pstr->mbs[idx]; - return (wint_t) pstr->wcs[idx]; -} - -# ifndef NOT_IN_libc -static int -internal_function __attribute ((pure)) -re_string_elem_size_at (const re_string_t *pstr, int idx) -{ -# ifdef _LIBC - const unsigned char *p, *extra; - const int32_t *table, *indirect; - int32_t tmp; -# include - uint_fast32_t nrules = _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES); - - if (nrules != 0) - { - table = (const int32_t *) _NL_CURRENT (LC_COLLATE, _NL_COLLATE_TABLEMB); - extra = (const unsigned char *) - _NL_CURRENT (LC_COLLATE, _NL_COLLATE_EXTRAMB); - indirect = (const int32_t *) _NL_CURRENT (LC_COLLATE, - _NL_COLLATE_INDIRECTMB); - p = pstr->mbs + idx; - tmp = findidx (&p); - return p - pstr->mbs - idx; - } - else -# endif /* _LIBC */ - return 1; -} -# endif -#endif /* RE_ENABLE_I18N */ - -#endif /* _REGEX_INTERNAL_H */ diff --git a/vendor/libgit2/deps/regex/regexec.c b/vendor/libgit2/deps/regex/regexec.c deleted file mode 100644 index 0a1602e5aa..0000000000 --- a/vendor/libgit2/deps/regex/regexec.c +++ /dev/null @@ -1,4369 +0,0 @@ -/* Extended regular expression matching and search library. - Copyright (C) 2002-2005, 2007, 2009, 2010 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Isamu Hasegawa . - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, write to the Free - Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - 02110-1301 USA. */ - -static reg_errcode_t match_ctx_init (re_match_context_t *cache, int eflags, - int n) internal_function; -static void match_ctx_clean (re_match_context_t *mctx) internal_function; -static void match_ctx_free (re_match_context_t *cache) internal_function; -static reg_errcode_t match_ctx_add_entry (re_match_context_t *cache, int node, - int str_idx, int from, int to) - internal_function; -static int search_cur_bkref_entry (const re_match_context_t *mctx, int str_idx) - internal_function; -static reg_errcode_t match_ctx_add_subtop (re_match_context_t *mctx, int node, - int str_idx) internal_function; -static re_sub_match_last_t * match_ctx_add_sublast (re_sub_match_top_t *subtop, - int node, int str_idx) - internal_function; -static void sift_ctx_init (re_sift_context_t *sctx, re_dfastate_t **sifted_sts, - re_dfastate_t **limited_sts, int last_node, - int last_str_idx) - internal_function; -static reg_errcode_t re_search_internal (const regex_t *preg, - const char *string, int length, - int start, int range, int stop, - size_t nmatch, regmatch_t pmatch[], - int eflags); -static int re_search_2_stub (struct re_pattern_buffer *bufp, - const char *string1, int length1, - const char *string2, int length2, - int start, int range, struct re_registers *regs, - int stop, int ret_len); -static int re_search_stub (struct re_pattern_buffer *bufp, - const char *string, int length, int start, - int range, int stop, struct re_registers *regs, - int ret_len); -static unsigned re_copy_regs (struct re_registers *regs, regmatch_t *pmatch, - unsigned int nregs, int regs_allocated); -static reg_errcode_t prune_impossible_nodes (re_match_context_t *mctx); -static int check_matching (re_match_context_t *mctx, int fl_longest_match, - int *p_match_first) internal_function; -static int check_halt_state_context (const re_match_context_t *mctx, - const re_dfastate_t *state, int idx) - internal_function; -static void update_regs (const re_dfa_t *dfa, regmatch_t *pmatch, - regmatch_t *prev_idx_match, int cur_node, - int cur_idx, int nmatch) internal_function; -static reg_errcode_t push_fail_stack (struct re_fail_stack_t *fs, - int str_idx, int dest_node, int nregs, - regmatch_t *regs, - re_node_set *eps_via_nodes) - internal_function; -static reg_errcode_t set_regs (const regex_t *preg, - const re_match_context_t *mctx, - size_t nmatch, regmatch_t *pmatch, - int fl_backtrack) internal_function; -static reg_errcode_t free_fail_stack_return (struct re_fail_stack_t *fs) - internal_function; - -#ifdef RE_ENABLE_I18N -static int sift_states_iter_mb (const re_match_context_t *mctx, - re_sift_context_t *sctx, - int node_idx, int str_idx, int max_str_idx) - internal_function; -#endif /* RE_ENABLE_I18N */ -static reg_errcode_t sift_states_backward (const re_match_context_t *mctx, - re_sift_context_t *sctx) - internal_function; -static reg_errcode_t build_sifted_states (const re_match_context_t *mctx, - re_sift_context_t *sctx, int str_idx, - re_node_set *cur_dest) - internal_function; -static reg_errcode_t update_cur_sifted_state (const re_match_context_t *mctx, - re_sift_context_t *sctx, - int str_idx, - re_node_set *dest_nodes) - internal_function; -static reg_errcode_t add_epsilon_src_nodes (const re_dfa_t *dfa, - re_node_set *dest_nodes, - const re_node_set *candidates) - internal_function; -static int check_dst_limits (const re_match_context_t *mctx, - re_node_set *limits, - int dst_node, int dst_idx, int src_node, - int src_idx) internal_function; -static int check_dst_limits_calc_pos_1 (const re_match_context_t *mctx, - int boundaries, int subexp_idx, - int from_node, int bkref_idx) - internal_function; -static int check_dst_limits_calc_pos (const re_match_context_t *mctx, - int limit, int subexp_idx, - int node, int str_idx, - int bkref_idx) internal_function; -static reg_errcode_t check_subexp_limits (const re_dfa_t *dfa, - re_node_set *dest_nodes, - const re_node_set *candidates, - re_node_set *limits, - struct re_backref_cache_entry *bkref_ents, - int str_idx) internal_function; -static reg_errcode_t sift_states_bkref (const re_match_context_t *mctx, - re_sift_context_t *sctx, - int str_idx, const re_node_set *candidates) - internal_function; -static reg_errcode_t merge_state_array (const re_dfa_t *dfa, - re_dfastate_t **dst, - re_dfastate_t **src, int num) - internal_function; -static re_dfastate_t *find_recover_state (reg_errcode_t *err, - re_match_context_t *mctx) internal_function; -static re_dfastate_t *transit_state (reg_errcode_t *err, - re_match_context_t *mctx, - re_dfastate_t *state) internal_function; -static re_dfastate_t *merge_state_with_log (reg_errcode_t *err, - re_match_context_t *mctx, - re_dfastate_t *next_state) - internal_function; -static reg_errcode_t check_subexp_matching_top (re_match_context_t *mctx, - re_node_set *cur_nodes, - int str_idx) internal_function; -#if 0 -static re_dfastate_t *transit_state_sb (reg_errcode_t *err, - re_match_context_t *mctx, - re_dfastate_t *pstate) - internal_function; -#endif -#ifdef RE_ENABLE_I18N -static reg_errcode_t transit_state_mb (re_match_context_t *mctx, - re_dfastate_t *pstate) - internal_function; -#endif /* RE_ENABLE_I18N */ -static reg_errcode_t transit_state_bkref (re_match_context_t *mctx, - const re_node_set *nodes) - internal_function; -static reg_errcode_t get_subexp (re_match_context_t *mctx, - int bkref_node, int bkref_str_idx) - internal_function; -static reg_errcode_t get_subexp_sub (re_match_context_t *mctx, - const re_sub_match_top_t *sub_top, - re_sub_match_last_t *sub_last, - int bkref_node, int bkref_str) - internal_function; -static int find_subexp_node (const re_dfa_t *dfa, const re_node_set *nodes, - int subexp_idx, int type) internal_function; -static reg_errcode_t check_arrival (re_match_context_t *mctx, - state_array_t *path, int top_node, - int top_str, int last_node, int last_str, - int type) internal_function; -static reg_errcode_t check_arrival_add_next_nodes (re_match_context_t *mctx, - int str_idx, - re_node_set *cur_nodes, - re_node_set *next_nodes) - internal_function; -static reg_errcode_t check_arrival_expand_ecl (const re_dfa_t *dfa, - re_node_set *cur_nodes, - int ex_subexp, int type) - internal_function; -static reg_errcode_t check_arrival_expand_ecl_sub (const re_dfa_t *dfa, - re_node_set *dst_nodes, - int target, int ex_subexp, - int type) internal_function; -static reg_errcode_t expand_bkref_cache (re_match_context_t *mctx, - re_node_set *cur_nodes, int cur_str, - int subexp_num, int type) - internal_function; -static int build_trtable (const re_dfa_t *dfa, - re_dfastate_t *state) internal_function; -#ifdef RE_ENABLE_I18N -static int check_node_accept_bytes (const re_dfa_t *dfa, int node_idx, - const re_string_t *input, int idx) - internal_function; -# ifdef _LIBC -static unsigned int find_collation_sequence_value (const unsigned char *mbs, - size_t name_len) - internal_function; -# endif /* _LIBC */ -#endif /* RE_ENABLE_I18N */ -static int group_nodes_into_DFAstates (const re_dfa_t *dfa, - const re_dfastate_t *state, - re_node_set *states_node, - bitset_t *states_ch) internal_function; -static int check_node_accept (const re_match_context_t *mctx, - const re_token_t *node, int idx) - internal_function; -static reg_errcode_t extend_buffers (re_match_context_t *mctx) - internal_function; - -/* Entry point for POSIX code. */ - -/* regexec searches for a given pattern, specified by PREG, in the - string STRING. - - If NMATCH is zero or REG_NOSUB was set in the cflags argument to - `regcomp', we ignore PMATCH. Otherwise, we assume PMATCH has at - least NMATCH elements, and we set them to the offsets of the - corresponding matched substrings. - - EFLAGS specifies `execution flags' which affect matching: if - REG_NOTBOL is set, then ^ does not match at the beginning of the - string; if REG_NOTEOL is set, then $ does not match at the end. - - We return 0 if we find a match and REG_NOMATCH if not. */ - -int -regexec ( - const regex_t *__restrict preg, - const char *__restrict string, - size_t nmatch, - regmatch_t pmatch[], - int eflags) -{ - reg_errcode_t err; - int start, length; - - if (eflags & ~(REG_NOTBOL | REG_NOTEOL | REG_STARTEND)) - return REG_BADPAT; - - if (eflags & REG_STARTEND) - { - start = pmatch[0].rm_so; - length = pmatch[0].rm_eo; - } - else - { - start = 0; - length = strlen (string); - } - - __libc_lock_lock (dfa->lock); - if (preg->no_sub) - err = re_search_internal (preg, string, length, start, length - start, - length, 0, NULL, eflags); - else - err = re_search_internal (preg, string, length, start, length - start, - length, nmatch, pmatch, eflags); - __libc_lock_unlock (dfa->lock); - return err != REG_NOERROR; -} - -#ifdef _LIBC -# include -versioned_symbol (libc, __regexec, regexec, GLIBC_2_3_4); - -# if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_3_4) -__typeof__ (__regexec) __compat_regexec; - -int -attribute_compat_text_section -__compat_regexec (const regex_t *__restrict preg, - const char *__restrict string, size_t nmatch, - regmatch_t pmatch[], int eflags) -{ - return regexec (preg, string, nmatch, pmatch, - eflags & (REG_NOTBOL | REG_NOTEOL)); -} -compat_symbol (libc, __compat_regexec, regexec, GLIBC_2_0); -# endif -#endif - -/* Entry points for GNU code. */ - -/* re_match, re_search, re_match_2, re_search_2 - - The former two functions operate on STRING with length LENGTH, - while the later two operate on concatenation of STRING1 and STRING2 - with lengths LENGTH1 and LENGTH2, respectively. - - re_match() matches the compiled pattern in BUFP against the string, - starting at index START. - - re_search() first tries matching at index START, then it tries to match - starting from index START + 1, and so on. The last start position tried - is START + RANGE. (Thus RANGE = 0 forces re_search to operate the same - way as re_match().) - - The parameter STOP of re_{match,search}_2 specifies that no match exceeding - the first STOP characters of the concatenation of the strings should be - concerned. - - If REGS is not NULL, and BUFP->no_sub is not set, the offsets of the match - and all groups is stroed in REGS. (For the "_2" variants, the offsets are - computed relative to the concatenation, not relative to the individual - strings.) - - On success, re_match* functions return the length of the match, re_search* - return the position of the start of the match. Return value -1 means no - match was found and -2 indicates an internal error. */ - -int -re_match (struct re_pattern_buffer *bufp, - const char *string, - int length, - int start, - struct re_registers *regs) -{ - return re_search_stub (bufp, string, length, start, 0, length, regs, 1); -} -#ifdef _LIBC -weak_alias (__re_match, re_match) -#endif - -int -re_search (struct re_pattern_buffer *bufp, - const char *string, - int length, int start, int range, - struct re_registers *regs) -{ - return re_search_stub (bufp, string, length, start, range, length, regs, 0); -} -#ifdef _LIBC -weak_alias (__re_search, re_search) -#endif - -int -re_match_2 (struct re_pattern_buffer *bufp, - const char *string1, int length1, - const char *string2, int length2, int start, - struct re_registers *regs, int stop) -{ - return re_search_2_stub (bufp, string1, length1, string2, length2, - start, 0, regs, stop, 1); -} -#ifdef _LIBC -weak_alias (__re_match_2, re_match_2) -#endif - -int -re_search_2 (struct re_pattern_buffer *bufp, - const char *string1, int length1, - const char *string2, int length2, int start, - int range, struct re_registers *regs, int stop) -{ - return re_search_2_stub (bufp, string1, length1, string2, length2, - start, range, regs, stop, 0); -} -#ifdef _LIBC -weak_alias (__re_search_2, re_search_2) -#endif - -static int -re_search_2_stub (struct re_pattern_buffer *bufp, - const char *string1, int length1, - const char *string2, int length2, int start, - int range, struct re_registers *regs, - int stop, int ret_len) -{ - const char *str; - int rval; - int len = length1 + length2; - int free_str = 0; - - if (BE (length1 < 0 || length2 < 0 || stop < 0, 0)) - return -2; - - /* Concatenate the strings. */ - if (length2 > 0) - if (length1 > 0) - { - char *s = re_malloc (char, len); - - if (BE (s == NULL, 0)) - return -2; - memcpy (s, string1, length1); - memcpy (s + length1, string2, length2); - str = s; - free_str = 1; - } - else - str = string2; - else - str = string1; - - rval = re_search_stub (bufp, str, len, start, range, stop, regs, ret_len); - if (free_str) - re_free ((char *) str); - return rval; -} - -/* The parameters have the same meaning as those of re_search. - Additional parameters: - If RET_LEN is nonzero the length of the match is returned (re_match style); - otherwise the position of the match is returned. */ - -static int -re_search_stub (struct re_pattern_buffer *bufp, - const char *string, int length, int start, - int range, int stop, - struct re_registers *regs, int ret_len) -{ - reg_errcode_t result; - regmatch_t *pmatch; - int nregs, rval; - int eflags = 0; - - /* Check for out-of-range. */ - if (BE (start < 0 || start > length, 0)) - return -1; - if (BE (start + range > length, 0)) - range = length - start; - else if (BE (start + range < 0, 0)) - range = -start; - - __libc_lock_lock (dfa->lock); - - eflags |= (bufp->not_bol) ? REG_NOTBOL : 0; - eflags |= (bufp->not_eol) ? REG_NOTEOL : 0; - - /* Compile fastmap if we haven't yet. */ - if (range > 0 && bufp->fastmap != NULL && !bufp->fastmap_accurate) - re_compile_fastmap (bufp); - - if (BE (bufp->no_sub, 0)) - regs = NULL; - - /* We need at least 1 register. */ - if (regs == NULL) - nregs = 1; - else if (BE (bufp->regs_allocated == REGS_FIXED && - regs->num_regs < bufp->re_nsub + 1, 0)) - { - nregs = regs->num_regs; - if (BE (nregs < 1, 0)) - { - /* Nothing can be copied to regs. */ - regs = NULL; - nregs = 1; - } - } - else - nregs = bufp->re_nsub + 1; - pmatch = re_malloc (regmatch_t, nregs); - if (BE (pmatch == NULL, 0)) - { - rval = -2; - goto out; - } - - result = re_search_internal (bufp, string, length, start, range, stop, - nregs, pmatch, eflags); - - rval = 0; - - /* I hope we needn't fill ther regs with -1's when no match was found. */ - if (result != REG_NOERROR) - rval = -1; - else if (regs != NULL) - { - /* If caller wants register contents data back, copy them. */ - bufp->regs_allocated = re_copy_regs (regs, pmatch, nregs, - bufp->regs_allocated); - if (BE (bufp->regs_allocated == REGS_UNALLOCATED, 0)) - rval = -2; - } - - if (BE (rval == 0, 1)) - { - if (ret_len) - { - assert (pmatch[0].rm_so == start); - rval = pmatch[0].rm_eo - start; - } - else - rval = pmatch[0].rm_so; - } - re_free (pmatch); - out: - __libc_lock_unlock (dfa->lock); - return rval; -} - -static unsigned -re_copy_regs (struct re_registers *regs, - regmatch_t *pmatch, - unsigned int nregs, int regs_allocated) -{ - int rval = REGS_REALLOCATE; - unsigned int i; - unsigned int need_regs = nregs + 1; - /* We need one extra element beyond `num_regs' for the `-1' marker GNU code - uses. */ - - /* Have the register data arrays been allocated? */ - if (regs_allocated == REGS_UNALLOCATED) - { /* No. So allocate them with malloc. */ - regs->start = re_malloc (regoff_t, need_regs); - if (BE (regs->start == NULL, 0)) - return REGS_UNALLOCATED; - regs->end = re_malloc (regoff_t, need_regs); - if (BE (regs->end == NULL, 0)) - { - re_free (regs->start); - return REGS_UNALLOCATED; - } - regs->num_regs = need_regs; - } - else if (regs_allocated == REGS_REALLOCATE) - { /* Yes. If we need more elements than were already - allocated, reallocate them. If we need fewer, just - leave it alone. */ - if (BE (need_regs > regs->num_regs, 0)) - { - regoff_t *new_start = re_realloc (regs->start, regoff_t, need_regs); - regoff_t *new_end; - if (BE (new_start == NULL, 0)) - return REGS_UNALLOCATED; - new_end = re_realloc (regs->end, regoff_t, need_regs); - if (BE (new_end == NULL, 0)) - { - re_free (new_start); - return REGS_UNALLOCATED; - } - regs->start = new_start; - regs->end = new_end; - regs->num_regs = need_regs; - } - } - else - { - assert (regs_allocated == REGS_FIXED); - /* This function may not be called with REGS_FIXED and nregs too big. */ - assert (regs->num_regs >= nregs); - rval = REGS_FIXED; - } - - /* Copy the regs. */ - for (i = 0; i < nregs; ++i) - { - regs->start[i] = pmatch[i].rm_so; - regs->end[i] = pmatch[i].rm_eo; - } - for ( ; i < regs->num_regs; ++i) - regs->start[i] = regs->end[i] = -1; - - return rval; -} - -/* Set REGS to hold NUM_REGS registers, storing them in STARTS and - ENDS. Subsequent matches using PATTERN_BUFFER and REGS will use - this memory for recording register information. STARTS and ENDS - must be allocated using the malloc library routine, and must each - be at least NUM_REGS * sizeof (regoff_t) bytes long. - - If NUM_REGS == 0, then subsequent matches should allocate their own - register data. - - Unless this function is called, the first search or match using - PATTERN_BUFFER will allocate its own register data, without - freeing the old data. */ - -void -re_set_registers (struct re_pattern_buffer *bufp, - struct re_registers *regs, - unsigned num_regs, - regoff_t *starts, - regoff_t *ends) -{ - if (num_regs) - { - bufp->regs_allocated = REGS_REALLOCATE; - regs->num_regs = num_regs; - regs->start = starts; - regs->end = ends; - } - else - { - bufp->regs_allocated = REGS_UNALLOCATED; - regs->num_regs = 0; - regs->start = regs->end = (regoff_t *) 0; - } -} -#ifdef _LIBC -weak_alias (__re_set_registers, re_set_registers) -#endif - -/* Entry points compatible with 4.2 BSD regex library. We don't define - them unless specifically requested. */ - -#if defined _REGEX_RE_COMP || defined _LIBC -int -# ifdef _LIBC -weak_function -# endif -re_exec (s) - const char *s; -{ - return 0 == regexec (&re_comp_buf, s, 0, NULL, 0); -} -#endif /* _REGEX_RE_COMP */ - -/* Internal entry point. */ - -/* Searches for a compiled pattern PREG in the string STRING, whose - length is LENGTH. NMATCH, PMATCH, and EFLAGS have the same - mingings with regexec. START, and RANGE have the same meanings - with re_search. - Return REG_NOERROR if we find a match, and REG_NOMATCH if not, - otherwise return the error code. - Note: We assume front end functions already check ranges. - (START + RANGE >= 0 && START + RANGE <= LENGTH) */ - -static reg_errcode_t -re_search_internal (const regex_t *preg, - const char *string, - int length, int start, int range, int stop, - size_t nmatch, regmatch_t pmatch[], - int eflags) -{ - reg_errcode_t err; - const re_dfa_t *dfa = (const re_dfa_t *) preg->buffer; - int left_lim, right_lim, incr; - int fl_longest_match, match_first, match_kind, match_last = -1; - unsigned int extra_nmatch; - int sb, ch; -#if defined _LIBC || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L) - re_match_context_t mctx = { .dfa = dfa }; -#else - re_match_context_t mctx; -#endif - char *fastmap = (preg->fastmap != NULL && preg->fastmap_accurate - && range && !preg->can_be_null) ? preg->fastmap : NULL; - RE_TRANSLATE_TYPE t = preg->translate; - -#if !(defined _LIBC || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L)) - memset (&mctx, '\0', sizeof (re_match_context_t)); - mctx.dfa = dfa; -#endif - - extra_nmatch = (nmatch > preg->re_nsub) ? nmatch - (preg->re_nsub + 1) : 0; - nmatch -= extra_nmatch; - - /* Check if the DFA haven't been compiled. */ - if (BE (preg->used == 0 || dfa->init_state == NULL - || dfa->init_state_word == NULL || dfa->init_state_nl == NULL - || dfa->init_state_begbuf == NULL, 0)) - return REG_NOMATCH; - -#ifdef DEBUG - /* We assume front-end functions already check them. */ - assert (start + range >= 0 && start + range <= length); -#endif - - /* If initial states with non-begbuf contexts have no elements, - the regex must be anchored. If preg->newline_anchor is set, - we'll never use init_state_nl, so do not check it. */ - if (dfa->init_state->nodes.nelem == 0 - && dfa->init_state_word->nodes.nelem == 0 - && (dfa->init_state_nl->nodes.nelem == 0 - || !preg->newline_anchor)) - { - if (start != 0 && start + range != 0) - return REG_NOMATCH; - start = range = 0; - } - - /* We must check the longest matching, if nmatch > 0. */ - fl_longest_match = (nmatch != 0 || dfa->nbackref); - - err = re_string_allocate (&mctx.input, string, length, dfa->nodes_len + 1, - preg->translate, preg->syntax & RE_ICASE, dfa); - if (BE (err != REG_NOERROR, 0)) - goto free_return; - mctx.input.stop = stop; - mctx.input.raw_stop = stop; - mctx.input.newline_anchor = preg->newline_anchor; - - err = match_ctx_init (&mctx, eflags, dfa->nbackref * 2); - if (BE (err != REG_NOERROR, 0)) - goto free_return; - - /* We will log all the DFA states through which the dfa pass, - if nmatch > 1, or this dfa has "multibyte node", which is a - back-reference or a node which can accept multibyte character or - multi character collating element. */ - if (nmatch > 1 || dfa->has_mb_node) - { - /* Avoid overflow. */ - if (BE (SIZE_MAX / sizeof (re_dfastate_t *) <= (size_t)mctx.input.bufs_len, 0)) - { - err = REG_ESPACE; - goto free_return; - } - - mctx.state_log = re_malloc (re_dfastate_t *, mctx.input.bufs_len + 1); - if (BE (mctx.state_log == NULL, 0)) - { - err = REG_ESPACE; - goto free_return; - } - } - else - mctx.state_log = NULL; - - match_first = start; - mctx.input.tip_context = (eflags & REG_NOTBOL) ? CONTEXT_BEGBUF - : CONTEXT_NEWLINE | CONTEXT_BEGBUF; - - /* Check incrementally whether of not the input string match. */ - incr = (range < 0) ? -1 : 1; - left_lim = (range < 0) ? start + range : start; - right_lim = (range < 0) ? start : start + range; - sb = dfa->mb_cur_max == 1; - match_kind = - (fastmap - ? ((sb || !(preg->syntax & RE_ICASE || t) ? 4 : 0) - | (range >= 0 ? 2 : 0) - | (t != NULL ? 1 : 0)) - : 8); - - for (;; match_first += incr) - { - err = REG_NOMATCH; - if (match_first < left_lim || right_lim < match_first) - goto free_return; - - /* Advance as rapidly as possible through the string, until we - find a plausible place to start matching. This may be done - with varying efficiency, so there are various possibilities: - only the most common of them are specialized, in order to - save on code size. We use a switch statement for speed. */ - switch (match_kind) - { - case 8: - /* No fastmap. */ - break; - - case 7: - /* Fastmap with single-byte translation, match forward. */ - while (BE (match_first < right_lim, 1) - && !fastmap[t[(unsigned char) string[match_first]]]) - ++match_first; - goto forward_match_found_start_or_reached_end; - - case 6: - /* Fastmap without translation, match forward. */ - while (BE (match_first < right_lim, 1) - && !fastmap[(unsigned char) string[match_first]]) - ++match_first; - - forward_match_found_start_or_reached_end: - if (BE (match_first == right_lim, 0)) - { - ch = match_first >= length - ? 0 : (unsigned char) string[match_first]; - if (!fastmap[t ? t[ch] : ch]) - goto free_return; - } - break; - - case 4: - case 5: - /* Fastmap without multi-byte translation, match backwards. */ - while (match_first >= left_lim) - { - ch = match_first >= length - ? 0 : (unsigned char) string[match_first]; - if (fastmap[t ? t[ch] : ch]) - break; - --match_first; - } - if (match_first < left_lim) - goto free_return; - break; - - default: - /* In this case, we can't determine easily the current byte, - since it might be a component byte of a multibyte - character. Then we use the constructed buffer instead. */ - for (;;) - { - /* If MATCH_FIRST is out of the valid range, reconstruct the - buffers. */ - unsigned int offset = match_first - mctx.input.raw_mbs_idx; - if (BE (offset >= (unsigned int) mctx.input.valid_raw_len, 0)) - { - err = re_string_reconstruct (&mctx.input, match_first, - eflags); - if (BE (err != REG_NOERROR, 0)) - goto free_return; - - offset = match_first - mctx.input.raw_mbs_idx; - } - /* If MATCH_FIRST is out of the buffer, leave it as '\0'. - Note that MATCH_FIRST must not be smaller than 0. */ - ch = (match_first >= length - ? 0 : re_string_byte_at (&mctx.input, offset)); - if (fastmap[ch]) - break; - match_first += incr; - if (match_first < left_lim || match_first > right_lim) - { - err = REG_NOMATCH; - goto free_return; - } - } - break; - } - - /* Reconstruct the buffers so that the matcher can assume that - the matching starts from the beginning of the buffer. */ - err = re_string_reconstruct (&mctx.input, match_first, eflags); - if (BE (err != REG_NOERROR, 0)) - goto free_return; - -#ifdef RE_ENABLE_I18N - /* Don't consider this char as a possible match start if it part, - yet isn't the head, of a multibyte character. */ - if (!sb && !re_string_first_byte (&mctx.input, 0)) - continue; -#endif - - /* It seems to be appropriate one, then use the matcher. */ - /* We assume that the matching starts from 0. */ - mctx.state_log_top = mctx.nbkref_ents = mctx.max_mb_elem_len = 0; - match_last = check_matching (&mctx, fl_longest_match, - range >= 0 ? &match_first : NULL); - if (match_last != -1) - { - if (BE (match_last == -2, 0)) - { - err = REG_ESPACE; - goto free_return; - } - else - { - mctx.match_last = match_last; - if ((!preg->no_sub && nmatch > 1) || dfa->nbackref) - { - re_dfastate_t *pstate = mctx.state_log[match_last]; - mctx.last_node = check_halt_state_context (&mctx, pstate, - match_last); - } - if ((!preg->no_sub && nmatch > 1 && dfa->has_plural_match) - || dfa->nbackref) - { - err = prune_impossible_nodes (&mctx); - if (err == REG_NOERROR) - break; - if (BE (err != REG_NOMATCH, 0)) - goto free_return; - match_last = -1; - } - else - break; /* We found a match. */ - } - } - - match_ctx_clean (&mctx); - } - -#ifdef DEBUG - assert (match_last != -1); - assert (err == REG_NOERROR); -#endif - - /* Set pmatch[] if we need. */ - if (nmatch > 0) - { - unsigned int reg_idx; - - /* Initialize registers. */ - for (reg_idx = 1; reg_idx < nmatch; ++reg_idx) - pmatch[reg_idx].rm_so = pmatch[reg_idx].rm_eo = -1; - - /* Set the points where matching start/end. */ - pmatch[0].rm_so = 0; - pmatch[0].rm_eo = mctx.match_last; - - if (!preg->no_sub && nmatch > 1) - { - err = set_regs (preg, &mctx, nmatch, pmatch, - dfa->has_plural_match && dfa->nbackref > 0); - if (BE (err != REG_NOERROR, 0)) - goto free_return; - } - - /* At last, add the offset to the each registers, since we slided - the buffers so that we could assume that the matching starts - from 0. */ - for (reg_idx = 0; reg_idx < nmatch; ++reg_idx) - if (pmatch[reg_idx].rm_so != -1) - { -#ifdef RE_ENABLE_I18N - if (BE (mctx.input.offsets_needed != 0, 0)) - { - pmatch[reg_idx].rm_so = - (pmatch[reg_idx].rm_so == mctx.input.valid_len - ? mctx.input.valid_raw_len - : mctx.input.offsets[pmatch[reg_idx].rm_so]); - pmatch[reg_idx].rm_eo = - (pmatch[reg_idx].rm_eo == mctx.input.valid_len - ? mctx.input.valid_raw_len - : mctx.input.offsets[pmatch[reg_idx].rm_eo]); - } -#else - assert (mctx.input.offsets_needed == 0); -#endif - pmatch[reg_idx].rm_so += match_first; - pmatch[reg_idx].rm_eo += match_first; - } - for (reg_idx = 0; reg_idx < extra_nmatch; ++reg_idx) - { - pmatch[nmatch + reg_idx].rm_so = -1; - pmatch[nmatch + reg_idx].rm_eo = -1; - } - - if (dfa->subexp_map) - for (reg_idx = 0; reg_idx + 1 < nmatch; reg_idx++) - if (dfa->subexp_map[reg_idx] != (int)reg_idx) - { - pmatch[reg_idx + 1].rm_so - = pmatch[dfa->subexp_map[reg_idx] + 1].rm_so; - pmatch[reg_idx + 1].rm_eo - = pmatch[dfa->subexp_map[reg_idx] + 1].rm_eo; - } - } - - free_return: - re_free (mctx.state_log); - if (dfa->nbackref) - match_ctx_free (&mctx); - re_string_destruct (&mctx.input); - return err; -} - -static reg_errcode_t -prune_impossible_nodes (re_match_context_t *mctx) -{ - const re_dfa_t *const dfa = mctx->dfa; - int halt_node, match_last; - reg_errcode_t ret; - re_dfastate_t **sifted_states; - re_dfastate_t **lim_states = NULL; - re_sift_context_t sctx; -#ifdef DEBUG - assert (mctx->state_log != NULL); -#endif - match_last = mctx->match_last; - halt_node = mctx->last_node; - - /* Avoid overflow. */ - if (BE (SIZE_MAX / sizeof (re_dfastate_t *) <= (size_t)match_last, 0)) - return REG_ESPACE; - - sifted_states = re_malloc (re_dfastate_t *, match_last + 1); - if (BE (sifted_states == NULL, 0)) - { - ret = REG_ESPACE; - goto free_return; - } - if (dfa->nbackref) - { - lim_states = re_malloc (re_dfastate_t *, match_last + 1); - if (BE (lim_states == NULL, 0)) - { - ret = REG_ESPACE; - goto free_return; - } - while (1) - { - memset (lim_states, '\0', - sizeof (re_dfastate_t *) * (match_last + 1)); - sift_ctx_init (&sctx, sifted_states, lim_states, halt_node, - match_last); - ret = sift_states_backward (mctx, &sctx); - re_node_set_free (&sctx.limits); - if (BE (ret != REG_NOERROR, 0)) - goto free_return; - if (sifted_states[0] != NULL || lim_states[0] != NULL) - break; - do - { - --match_last; - if (match_last < 0) - { - ret = REG_NOMATCH; - goto free_return; - } - } while (mctx->state_log[match_last] == NULL - || !mctx->state_log[match_last]->halt); - halt_node = check_halt_state_context (mctx, - mctx->state_log[match_last], - match_last); - } - ret = merge_state_array (dfa, sifted_states, lim_states, - match_last + 1); - re_free (lim_states); - lim_states = NULL; - if (BE (ret != REG_NOERROR, 0)) - goto free_return; - } - else - { - sift_ctx_init (&sctx, sifted_states, lim_states, halt_node, match_last); - ret = sift_states_backward (mctx, &sctx); - re_node_set_free (&sctx.limits); - if (BE (ret != REG_NOERROR, 0)) - goto free_return; - if (sifted_states[0] == NULL) - { - ret = REG_NOMATCH; - goto free_return; - } - } - re_free (mctx->state_log); - mctx->state_log = sifted_states; - sifted_states = NULL; - mctx->last_node = halt_node; - mctx->match_last = match_last; - ret = REG_NOERROR; - free_return: - re_free (sifted_states); - re_free (lim_states); - return ret; -} - -/* Acquire an initial state and return it. - We must select appropriate initial state depending on the context, - since initial states may have constraints like "\<", "^", etc.. */ - -static inline re_dfastate_t * -__attribute ((always_inline)) internal_function -acquire_init_state_context (reg_errcode_t *err, const re_match_context_t *mctx, - int idx) -{ - const re_dfa_t *const dfa = mctx->dfa; - if (dfa->init_state->has_constraint) - { - unsigned int context; - context = re_string_context_at (&mctx->input, idx - 1, mctx->eflags); - if (IS_WORD_CONTEXT (context)) - return dfa->init_state_word; - else if (IS_ORDINARY_CONTEXT (context)) - return dfa->init_state; - else if (IS_BEGBUF_CONTEXT (context) && IS_NEWLINE_CONTEXT (context)) - return dfa->init_state_begbuf; - else if (IS_NEWLINE_CONTEXT (context)) - return dfa->init_state_nl; - else if (IS_BEGBUF_CONTEXT (context)) - { - /* It is relatively rare case, then calculate on demand. */ - return re_acquire_state_context (err, dfa, - dfa->init_state->entrance_nodes, - context); - } - else - /* Must not happen? */ - return dfa->init_state; - } - else - return dfa->init_state; -} - -/* Check whether the regular expression match input string INPUT or not, - and return the index where the matching end, return -1 if not match, - or return -2 in case of an error. - FL_LONGEST_MATCH means we want the POSIX longest matching. - If P_MATCH_FIRST is not NULL, and the match fails, it is set to the - next place where we may want to try matching. - Note that the matcher assume that the maching starts from the current - index of the buffer. */ - -static int -internal_function -check_matching (re_match_context_t *mctx, int fl_longest_match, - int *p_match_first) -{ - const re_dfa_t *const dfa = mctx->dfa; - reg_errcode_t err; - int match = 0; - int match_last = -1; - int cur_str_idx = re_string_cur_idx (&mctx->input); - re_dfastate_t *cur_state; - int at_init_state = p_match_first != NULL; - int next_start_idx = cur_str_idx; - - err = REG_NOERROR; - cur_state = acquire_init_state_context (&err, mctx, cur_str_idx); - /* An initial state must not be NULL (invalid). */ - if (BE (cur_state == NULL, 0)) - { - assert (err == REG_ESPACE); - return -2; - } - - if (mctx->state_log != NULL) - { - mctx->state_log[cur_str_idx] = cur_state; - - /* Check OP_OPEN_SUBEXP in the initial state in case that we use them - later. E.g. Processing back references. */ - if (BE (dfa->nbackref, 0)) - { - at_init_state = 0; - err = check_subexp_matching_top (mctx, &cur_state->nodes, 0); - if (BE (err != REG_NOERROR, 0)) - return err; - - if (cur_state->has_backref) - { - err = transit_state_bkref (mctx, &cur_state->nodes); - if (BE (err != REG_NOERROR, 0)) - return err; - } - } - } - - /* If the RE accepts NULL string. */ - if (BE (cur_state->halt, 0)) - { - if (!cur_state->has_constraint - || check_halt_state_context (mctx, cur_state, cur_str_idx)) - { - if (!fl_longest_match) - return cur_str_idx; - else - { - match_last = cur_str_idx; - match = 1; - } - } - } - - while (!re_string_eoi (&mctx->input)) - { - re_dfastate_t *old_state = cur_state; - int next_char_idx = re_string_cur_idx (&mctx->input) + 1; - - if (BE (next_char_idx >= mctx->input.bufs_len, 0) - || (BE (next_char_idx >= mctx->input.valid_len, 0) - && mctx->input.valid_len < mctx->input.len)) - { - err = extend_buffers (mctx); - if (BE (err != REG_NOERROR, 0)) - { - assert (err == REG_ESPACE); - return -2; - } - } - - cur_state = transit_state (&err, mctx, cur_state); - if (mctx->state_log != NULL) - cur_state = merge_state_with_log (&err, mctx, cur_state); - - if (cur_state == NULL) - { - /* Reached the invalid state or an error. Try to recover a valid - state using the state log, if available and if we have not - already found a valid (even if not the longest) match. */ - if (BE (err != REG_NOERROR, 0)) - return -2; - - if (mctx->state_log == NULL - || (match && !fl_longest_match) - || (cur_state = find_recover_state (&err, mctx)) == NULL) - break; - } - - if (BE (at_init_state, 0)) - { - if (old_state == cur_state) - next_start_idx = next_char_idx; - else - at_init_state = 0; - } - - if (cur_state->halt) - { - /* Reached a halt state. - Check the halt state can satisfy the current context. */ - if (!cur_state->has_constraint - || check_halt_state_context (mctx, cur_state, - re_string_cur_idx (&mctx->input))) - { - /* We found an appropriate halt state. */ - match_last = re_string_cur_idx (&mctx->input); - match = 1; - - /* We found a match, do not modify match_first below. */ - p_match_first = NULL; - if (!fl_longest_match) - break; - } - } - } - - if (p_match_first) - *p_match_first += next_start_idx; - - return match_last; -} - -/* Check NODE match the current context. */ - -static int -internal_function -check_halt_node_context (const re_dfa_t *dfa, int node, unsigned int context) -{ - re_token_type_t type = dfa->nodes[node].type; - unsigned int constraint = dfa->nodes[node].constraint; - if (type != END_OF_RE) - return 0; - if (!constraint) - return 1; - if (NOT_SATISFY_NEXT_CONSTRAINT (constraint, context)) - return 0; - return 1; -} - -/* Check the halt state STATE match the current context. - Return 0 if not match, if the node, STATE has, is a halt node and - match the context, return the node. */ - -static int -internal_function -check_halt_state_context (const re_match_context_t *mctx, - const re_dfastate_t *state, int idx) -{ - int i; - unsigned int context; -#ifdef DEBUG - assert (state->halt); -#endif - context = re_string_context_at (&mctx->input, idx, mctx->eflags); - for (i = 0; i < state->nodes.nelem; ++i) - if (check_halt_node_context (mctx->dfa, state->nodes.elems[i], context)) - return state->nodes.elems[i]; - return 0; -} - -/* Compute the next node to which "NFA" transit from NODE("NFA" is a NFA - corresponding to the DFA). - Return the destination node, and update EPS_VIA_NODES, return -1 in case - of errors. */ - -static int -internal_function -proceed_next_node (const re_match_context_t *mctx, int nregs, regmatch_t *regs, - int *pidx, int node, re_node_set *eps_via_nodes, - struct re_fail_stack_t *fs) -{ - const re_dfa_t *const dfa = mctx->dfa; - int i, err; - if (IS_EPSILON_NODE (dfa->nodes[node].type)) - { - re_node_set *cur_nodes = &mctx->state_log[*pidx]->nodes; - re_node_set *edests = &dfa->edests[node]; - int dest_node; - err = re_node_set_insert (eps_via_nodes, node); - if (BE (err < 0, 0)) - return -2; - /* Pick up a valid destination, or return -1 if none is found. */ - for (dest_node = -1, i = 0; i < edests->nelem; ++i) - { - int candidate = edests->elems[i]; - if (!re_node_set_contains (cur_nodes, candidate)) - continue; - if (dest_node == -1) - dest_node = candidate; - - else - { - /* In order to avoid infinite loop like "(a*)*", return the second - epsilon-transition if the first was already considered. */ - if (re_node_set_contains (eps_via_nodes, dest_node)) - return candidate; - - /* Otherwise, push the second epsilon-transition on the fail stack. */ - else if (fs != NULL - && push_fail_stack (fs, *pidx, candidate, nregs, regs, - eps_via_nodes)) - return -2; - - /* We know we are going to exit. */ - break; - } - } - return dest_node; - } - else - { - int naccepted = 0; - re_token_type_t type = dfa->nodes[node].type; - -#ifdef RE_ENABLE_I18N - if (dfa->nodes[node].accept_mb) - naccepted = check_node_accept_bytes (dfa, node, &mctx->input, *pidx); - else -#endif /* RE_ENABLE_I18N */ - if (type == OP_BACK_REF) - { - int subexp_idx = dfa->nodes[node].opr.idx + 1; - naccepted = regs[subexp_idx].rm_eo - regs[subexp_idx].rm_so; - if (fs != NULL) - { - if (regs[subexp_idx].rm_so == -1 || regs[subexp_idx].rm_eo == -1) - return -1; - else if (naccepted) - { - char *buf = (char *) re_string_get_buffer (&mctx->input); - if (memcmp (buf + regs[subexp_idx].rm_so, buf + *pidx, - naccepted) != 0) - return -1; - } - } - - if (naccepted == 0) - { - int dest_node; - err = re_node_set_insert (eps_via_nodes, node); - if (BE (err < 0, 0)) - return -2; - dest_node = dfa->edests[node].elems[0]; - if (re_node_set_contains (&mctx->state_log[*pidx]->nodes, - dest_node)) - return dest_node; - } - } - - if (naccepted != 0 - || check_node_accept (mctx, dfa->nodes + node, *pidx)) - { - int dest_node = dfa->nexts[node]; - *pidx = (naccepted == 0) ? *pidx + 1 : *pidx + naccepted; - if (fs && (*pidx > mctx->match_last || mctx->state_log[*pidx] == NULL - || !re_node_set_contains (&mctx->state_log[*pidx]->nodes, - dest_node))) - return -1; - re_node_set_empty (eps_via_nodes); - return dest_node; - } - } - return -1; -} - -static reg_errcode_t -internal_function -push_fail_stack (struct re_fail_stack_t *fs, int str_idx, int dest_node, - int nregs, regmatch_t *regs, re_node_set *eps_via_nodes) -{ - reg_errcode_t err; - int num = fs->num++; - if (fs->num == fs->alloc) - { - struct re_fail_stack_ent_t *new_array; - new_array = realloc (fs->stack, (sizeof (struct re_fail_stack_ent_t) - * fs->alloc * 2)); - if (new_array == NULL) - return REG_ESPACE; - fs->alloc *= 2; - fs->stack = new_array; - } - fs->stack[num].idx = str_idx; - fs->stack[num].node = dest_node; - fs->stack[num].regs = re_malloc (regmatch_t, nregs); - if (fs->stack[num].regs == NULL) - return REG_ESPACE; - memcpy (fs->stack[num].regs, regs, sizeof (regmatch_t) * nregs); - err = re_node_set_init_copy (&fs->stack[num].eps_via_nodes, eps_via_nodes); - return err; -} - -static int -internal_function -pop_fail_stack (struct re_fail_stack_t *fs, int *pidx, int nregs, - regmatch_t *regs, re_node_set *eps_via_nodes) -{ - int num = --fs->num; - assert (num >= 0); - *pidx = fs->stack[num].idx; - memcpy (regs, fs->stack[num].regs, sizeof (regmatch_t) * nregs); - re_node_set_free (eps_via_nodes); - re_free (fs->stack[num].regs); - *eps_via_nodes = fs->stack[num].eps_via_nodes; - return fs->stack[num].node; -} - -/* Set the positions where the subexpressions are starts/ends to registers - PMATCH. - Note: We assume that pmatch[0] is already set, and - pmatch[i].rm_so == pmatch[i].rm_eo == -1 for 0 < i < nmatch. */ - -static reg_errcode_t -internal_function -set_regs (const regex_t *preg, const re_match_context_t *mctx, size_t nmatch, - regmatch_t *pmatch, int fl_backtrack) -{ - const re_dfa_t *dfa = (const re_dfa_t *) preg->buffer; - int idx, cur_node; - re_node_set eps_via_nodes; - struct re_fail_stack_t *fs; - struct re_fail_stack_t fs_body = { 0, 2, NULL }; - regmatch_t *prev_idx_match; - int prev_idx_match_malloced = 0; - -#ifdef DEBUG - assert (nmatch > 1); - assert (mctx->state_log != NULL); -#endif - if (fl_backtrack) - { - fs = &fs_body; - fs->stack = re_malloc (struct re_fail_stack_ent_t, fs->alloc); - if (fs->stack == NULL) - return REG_ESPACE; - } - else - fs = NULL; - - cur_node = dfa->init_node; - re_node_set_init_empty (&eps_via_nodes); - -#ifdef HAVE_ALLOCA - if (__libc_use_alloca (nmatch * sizeof (regmatch_t))) - prev_idx_match = (regmatch_t *) alloca (nmatch * sizeof (regmatch_t)); - else -#endif - { - prev_idx_match = re_malloc (regmatch_t, nmatch); - if (prev_idx_match == NULL) - { - free_fail_stack_return (fs); - return REG_ESPACE; - } - prev_idx_match_malloced = 1; - } - memcpy (prev_idx_match, pmatch, sizeof (regmatch_t) * nmatch); - - for (idx = pmatch[0].rm_so; idx <= pmatch[0].rm_eo ;) - { - update_regs (dfa, pmatch, prev_idx_match, cur_node, idx, nmatch); - - if (idx == pmatch[0].rm_eo && cur_node == mctx->last_node) - { - unsigned int reg_idx; - if (fs) - { - for (reg_idx = 0; reg_idx < nmatch; ++reg_idx) - if (pmatch[reg_idx].rm_so > -1 && pmatch[reg_idx].rm_eo == -1) - break; - if (reg_idx == nmatch) - { - re_node_set_free (&eps_via_nodes); - if (prev_idx_match_malloced) - re_free (prev_idx_match); - return free_fail_stack_return (fs); - } - cur_node = pop_fail_stack (fs, &idx, nmatch, pmatch, - &eps_via_nodes); - } - else - { - re_node_set_free (&eps_via_nodes); - if (prev_idx_match_malloced) - re_free (prev_idx_match); - return REG_NOERROR; - } - } - - /* Proceed to next node. */ - cur_node = proceed_next_node (mctx, nmatch, pmatch, &idx, cur_node, - &eps_via_nodes, fs); - - if (BE (cur_node < 0, 0)) - { - if (BE (cur_node == -2, 0)) - { - re_node_set_free (&eps_via_nodes); - if (prev_idx_match_malloced) - re_free (prev_idx_match); - free_fail_stack_return (fs); - return REG_ESPACE; - } - if (fs) - cur_node = pop_fail_stack (fs, &idx, nmatch, pmatch, - &eps_via_nodes); - else - { - re_node_set_free (&eps_via_nodes); - if (prev_idx_match_malloced) - re_free (prev_idx_match); - return REG_NOMATCH; - } - } - } - re_node_set_free (&eps_via_nodes); - if (prev_idx_match_malloced) - re_free (prev_idx_match); - return free_fail_stack_return (fs); -} - -static reg_errcode_t -internal_function -free_fail_stack_return (struct re_fail_stack_t *fs) -{ - if (fs) - { - int fs_idx; - for (fs_idx = 0; fs_idx < fs->num; ++fs_idx) - { - re_node_set_free (&fs->stack[fs_idx].eps_via_nodes); - re_free (fs->stack[fs_idx].regs); - } - re_free (fs->stack); - } - return REG_NOERROR; -} - -static void -internal_function -update_regs (const re_dfa_t *dfa, regmatch_t *pmatch, - regmatch_t *prev_idx_match, int cur_node, int cur_idx, int nmatch) -{ - int type = dfa->nodes[cur_node].type; - if (type == OP_OPEN_SUBEXP) - { - int reg_num = dfa->nodes[cur_node].opr.idx + 1; - - /* We are at the first node of this sub expression. */ - if (reg_num < nmatch) - { - pmatch[reg_num].rm_so = cur_idx; - pmatch[reg_num].rm_eo = -1; - } - } - else if (type == OP_CLOSE_SUBEXP) - { - int reg_num = dfa->nodes[cur_node].opr.idx + 1; - if (reg_num < nmatch) - { - /* We are at the last node of this sub expression. */ - if (pmatch[reg_num].rm_so < cur_idx) - { - pmatch[reg_num].rm_eo = cur_idx; - /* This is a non-empty match or we are not inside an optional - subexpression. Accept this right away. */ - memcpy (prev_idx_match, pmatch, sizeof (regmatch_t) * nmatch); - } - else - { - if (dfa->nodes[cur_node].opt_subexp - && prev_idx_match[reg_num].rm_so != -1) - /* We transited through an empty match for an optional - subexpression, like (a?)*, and this is not the subexp's - first match. Copy back the old content of the registers - so that matches of an inner subexpression are undone as - well, like in ((a?))*. */ - memcpy (pmatch, prev_idx_match, sizeof (regmatch_t) * nmatch); - else - /* We completed a subexpression, but it may be part of - an optional one, so do not update PREV_IDX_MATCH. */ - pmatch[reg_num].rm_eo = cur_idx; - } - } - } -} - -/* This function checks the STATE_LOG from the SCTX->last_str_idx to 0 - and sift the nodes in each states according to the following rules. - Updated state_log will be wrote to STATE_LOG. - - Rules: We throw away the Node `a' in the STATE_LOG[STR_IDX] if... - 1. When STR_IDX == MATCH_LAST(the last index in the state_log): - If `a' isn't the LAST_NODE and `a' can't epsilon transit to - the LAST_NODE, we throw away the node `a'. - 2. When 0 <= STR_IDX < MATCH_LAST and `a' accepts - string `s' and transit to `b': - i. If 'b' isn't in the STATE_LOG[STR_IDX+strlen('s')], we throw - away the node `a'. - ii. If 'b' is in the STATE_LOG[STR_IDX+strlen('s')] but 'b' is - thrown away, we throw away the node `a'. - 3. When 0 <= STR_IDX < MATCH_LAST and 'a' epsilon transit to 'b': - i. If 'b' isn't in the STATE_LOG[STR_IDX], we throw away the - node `a'. - ii. If 'b' is in the STATE_LOG[STR_IDX] but 'b' is thrown away, - we throw away the node `a'. */ - -#define STATE_NODE_CONTAINS(state,node) \ - ((state) != NULL && re_node_set_contains (&(state)->nodes, node)) - -static reg_errcode_t -internal_function -sift_states_backward (const re_match_context_t *mctx, re_sift_context_t *sctx) -{ - reg_errcode_t err; - int null_cnt = 0; - int str_idx = sctx->last_str_idx; - re_node_set cur_dest; - -#ifdef DEBUG - assert (mctx->state_log != NULL && mctx->state_log[str_idx] != NULL); -#endif - - /* Build sifted state_log[str_idx]. It has the nodes which can epsilon - transit to the last_node and the last_node itself. */ - err = re_node_set_init_1 (&cur_dest, sctx->last_node); - if (BE (err != REG_NOERROR, 0)) - return err; - err = update_cur_sifted_state (mctx, sctx, str_idx, &cur_dest); - if (BE (err != REG_NOERROR, 0)) - goto free_return; - - /* Then check each states in the state_log. */ - while (str_idx > 0) - { - /* Update counters. */ - null_cnt = (sctx->sifted_states[str_idx] == NULL) ? null_cnt + 1 : 0; - if (null_cnt > mctx->max_mb_elem_len) - { - memset (sctx->sifted_states, '\0', - sizeof (re_dfastate_t *) * str_idx); - re_node_set_free (&cur_dest); - return REG_NOERROR; - } - re_node_set_empty (&cur_dest); - --str_idx; - - if (mctx->state_log[str_idx]) - { - err = build_sifted_states (mctx, sctx, str_idx, &cur_dest); - if (BE (err != REG_NOERROR, 0)) - goto free_return; - } - - /* Add all the nodes which satisfy the following conditions: - - It can epsilon transit to a node in CUR_DEST. - - It is in CUR_SRC. - And update state_log. */ - err = update_cur_sifted_state (mctx, sctx, str_idx, &cur_dest); - if (BE (err != REG_NOERROR, 0)) - goto free_return; - } - err = REG_NOERROR; - free_return: - re_node_set_free (&cur_dest); - return err; -} - -static reg_errcode_t -internal_function -build_sifted_states (const re_match_context_t *mctx, re_sift_context_t *sctx, - int str_idx, re_node_set *cur_dest) -{ - const re_dfa_t *const dfa = mctx->dfa; - const re_node_set *cur_src = &mctx->state_log[str_idx]->non_eps_nodes; - int i; - - /* Then build the next sifted state. - We build the next sifted state on `cur_dest', and update - `sifted_states[str_idx]' with `cur_dest'. - Note: - `cur_dest' is the sifted state from `state_log[str_idx + 1]'. - `cur_src' points the node_set of the old `state_log[str_idx]' - (with the epsilon nodes pre-filtered out). */ - for (i = 0; i < cur_src->nelem; i++) - { - int prev_node = cur_src->elems[i]; - int naccepted = 0; - int ret; - -#ifdef DEBUG - re_token_type_t type = dfa->nodes[prev_node].type; - assert (!IS_EPSILON_NODE (type)); -#endif -#ifdef RE_ENABLE_I18N - /* If the node may accept `multi byte'. */ - if (dfa->nodes[prev_node].accept_mb) - naccepted = sift_states_iter_mb (mctx, sctx, prev_node, - str_idx, sctx->last_str_idx); -#endif /* RE_ENABLE_I18N */ - - /* We don't check backreferences here. - See update_cur_sifted_state(). */ - if (!naccepted - && check_node_accept (mctx, dfa->nodes + prev_node, str_idx) - && STATE_NODE_CONTAINS (sctx->sifted_states[str_idx + 1], - dfa->nexts[prev_node])) - naccepted = 1; - - if (naccepted == 0) - continue; - - if (sctx->limits.nelem) - { - int to_idx = str_idx + naccepted; - if (check_dst_limits (mctx, &sctx->limits, - dfa->nexts[prev_node], to_idx, - prev_node, str_idx)) - continue; - } - ret = re_node_set_insert (cur_dest, prev_node); - if (BE (ret == -1, 0)) - return REG_ESPACE; - } - - return REG_NOERROR; -} - -/* Helper functions. */ - -static reg_errcode_t -internal_function -clean_state_log_if_needed (re_match_context_t *mctx, int next_state_log_idx) -{ - int top = mctx->state_log_top; - - if (next_state_log_idx >= mctx->input.bufs_len - || (next_state_log_idx >= mctx->input.valid_len - && mctx->input.valid_len < mctx->input.len)) - { - reg_errcode_t err; - err = extend_buffers (mctx); - if (BE (err != REG_NOERROR, 0)) - return err; - } - - if (top < next_state_log_idx) - { - memset (mctx->state_log + top + 1, '\0', - sizeof (re_dfastate_t *) * (next_state_log_idx - top)); - mctx->state_log_top = next_state_log_idx; - } - return REG_NOERROR; -} - -static reg_errcode_t -internal_function -merge_state_array (const re_dfa_t *dfa, re_dfastate_t **dst, - re_dfastate_t **src, int num) -{ - int st_idx; - reg_errcode_t err; - for (st_idx = 0; st_idx < num; ++st_idx) - { - if (dst[st_idx] == NULL) - dst[st_idx] = src[st_idx]; - else if (src[st_idx] != NULL) - { - re_node_set merged_set; - err = re_node_set_init_union (&merged_set, &dst[st_idx]->nodes, - &src[st_idx]->nodes); - if (BE (err != REG_NOERROR, 0)) - return err; - dst[st_idx] = re_acquire_state (&err, dfa, &merged_set); - re_node_set_free (&merged_set); - if (BE (err != REG_NOERROR, 0)) - return err; - } - } - return REG_NOERROR; -} - -static reg_errcode_t -internal_function -update_cur_sifted_state (const re_match_context_t *mctx, - re_sift_context_t *sctx, int str_idx, - re_node_set *dest_nodes) -{ - const re_dfa_t *const dfa = mctx->dfa; - reg_errcode_t err = REG_NOERROR; - const re_node_set *candidates; - candidates = ((mctx->state_log[str_idx] == NULL) ? NULL - : &mctx->state_log[str_idx]->nodes); - - if (dest_nodes->nelem == 0) - sctx->sifted_states[str_idx] = NULL; - else - { - if (candidates) - { - /* At first, add the nodes which can epsilon transit to a node in - DEST_NODE. */ - err = add_epsilon_src_nodes (dfa, dest_nodes, candidates); - if (BE (err != REG_NOERROR, 0)) - return err; - - /* Then, check the limitations in the current sift_context. */ - if (sctx->limits.nelem) - { - err = check_subexp_limits (dfa, dest_nodes, candidates, &sctx->limits, - mctx->bkref_ents, str_idx); - if (BE (err != REG_NOERROR, 0)) - return err; - } - } - - sctx->sifted_states[str_idx] = re_acquire_state (&err, dfa, dest_nodes); - if (BE (err != REG_NOERROR, 0)) - return err; - } - - if (candidates && mctx->state_log[str_idx]->has_backref) - { - err = sift_states_bkref (mctx, sctx, str_idx, candidates); - if (BE (err != REG_NOERROR, 0)) - return err; - } - return REG_NOERROR; -} - -static reg_errcode_t -internal_function -add_epsilon_src_nodes (const re_dfa_t *dfa, re_node_set *dest_nodes, - const re_node_set *candidates) -{ - reg_errcode_t err = REG_NOERROR; - int i; - - re_dfastate_t *state = re_acquire_state (&err, dfa, dest_nodes); - if (BE (err != REG_NOERROR, 0)) - return err; - - if (!state->inveclosure.alloc) - { - err = re_node_set_alloc (&state->inveclosure, dest_nodes->nelem); - if (BE (err != REG_NOERROR, 0)) - return REG_ESPACE; - for (i = 0; i < dest_nodes->nelem; i++) - { - err = re_node_set_merge (&state->inveclosure, - dfa->inveclosures + dest_nodes->elems[i]); - if (BE (err != REG_NOERROR, 0)) - return REG_ESPACE; - } - } - return re_node_set_add_intersect (dest_nodes, candidates, - &state->inveclosure); -} - -static reg_errcode_t -internal_function -sub_epsilon_src_nodes (const re_dfa_t *dfa, int node, re_node_set *dest_nodes, - const re_node_set *candidates) -{ - int ecl_idx; - reg_errcode_t err; - re_node_set *inv_eclosure = dfa->inveclosures + node; - re_node_set except_nodes; - re_node_set_init_empty (&except_nodes); - for (ecl_idx = 0; ecl_idx < inv_eclosure->nelem; ++ecl_idx) - { - int cur_node = inv_eclosure->elems[ecl_idx]; - if (cur_node == node) - continue; - if (IS_EPSILON_NODE (dfa->nodes[cur_node].type)) - { - int edst1 = dfa->edests[cur_node].elems[0]; - int edst2 = ((dfa->edests[cur_node].nelem > 1) - ? dfa->edests[cur_node].elems[1] : -1); - if ((!re_node_set_contains (inv_eclosure, edst1) - && re_node_set_contains (dest_nodes, edst1)) - || (edst2 > 0 - && !re_node_set_contains (inv_eclosure, edst2) - && re_node_set_contains (dest_nodes, edst2))) - { - err = re_node_set_add_intersect (&except_nodes, candidates, - dfa->inveclosures + cur_node); - if (BE (err != REG_NOERROR, 0)) - { - re_node_set_free (&except_nodes); - return err; - } - } - } - } - for (ecl_idx = 0; ecl_idx < inv_eclosure->nelem; ++ecl_idx) - { - int cur_node = inv_eclosure->elems[ecl_idx]; - if (!re_node_set_contains (&except_nodes, cur_node)) - { - int idx = re_node_set_contains (dest_nodes, cur_node) - 1; - re_node_set_remove_at (dest_nodes, idx); - } - } - re_node_set_free (&except_nodes); - return REG_NOERROR; -} - -static int -internal_function -check_dst_limits (const re_match_context_t *mctx, re_node_set *limits, - int dst_node, int dst_idx, int src_node, int src_idx) -{ - const re_dfa_t *const dfa = mctx->dfa; - int lim_idx, src_pos, dst_pos; - - int dst_bkref_idx = search_cur_bkref_entry (mctx, dst_idx); - int src_bkref_idx = search_cur_bkref_entry (mctx, src_idx); - for (lim_idx = 0; lim_idx < limits->nelem; ++lim_idx) - { - int subexp_idx; - struct re_backref_cache_entry *ent; - ent = mctx->bkref_ents + limits->elems[lim_idx]; - subexp_idx = dfa->nodes[ent->node].opr.idx; - - dst_pos = check_dst_limits_calc_pos (mctx, limits->elems[lim_idx], - subexp_idx, dst_node, dst_idx, - dst_bkref_idx); - src_pos = check_dst_limits_calc_pos (mctx, limits->elems[lim_idx], - subexp_idx, src_node, src_idx, - src_bkref_idx); - - /* In case of: - ( ) - ( ) - ( ) */ - if (src_pos == dst_pos) - continue; /* This is unrelated limitation. */ - else - return 1; - } - return 0; -} - -static int -internal_function -check_dst_limits_calc_pos_1 (const re_match_context_t *mctx, int boundaries, - int subexp_idx, int from_node, int bkref_idx) -{ - const re_dfa_t *const dfa = mctx->dfa; - const re_node_set *eclosures = dfa->eclosures + from_node; - int node_idx; - - /* Else, we are on the boundary: examine the nodes on the epsilon - closure. */ - for (node_idx = 0; node_idx < eclosures->nelem; ++node_idx) - { - int node = eclosures->elems[node_idx]; - switch (dfa->nodes[node].type) - { - case OP_BACK_REF: - if (bkref_idx != -1) - { - struct re_backref_cache_entry *ent = mctx->bkref_ents + bkref_idx; - do - { - int dst, cpos; - - if (ent->node != node) - continue; - - if (subexp_idx < BITSET_WORD_BITS - && !(ent->eps_reachable_subexps_map - & ((bitset_word_t) 1 << subexp_idx))) - continue; - - /* Recurse trying to reach the OP_OPEN_SUBEXP and - OP_CLOSE_SUBEXP cases below. But, if the - destination node is the same node as the source - node, don't recurse because it would cause an - infinite loop: a regex that exhibits this behavior - is ()\1*\1* */ - dst = dfa->edests[node].elems[0]; - if (dst == from_node) - { - if (boundaries & 1) - return -1; - else /* if (boundaries & 2) */ - return 0; - } - - cpos = - check_dst_limits_calc_pos_1 (mctx, boundaries, subexp_idx, - dst, bkref_idx); - if (cpos == -1 /* && (boundaries & 1) */) - return -1; - if (cpos == 0 && (boundaries & 2)) - return 0; - - if (subexp_idx < BITSET_WORD_BITS) - ent->eps_reachable_subexps_map - &= ~((bitset_word_t) 1 << subexp_idx); - } - while (ent++->more); - } - break; - - case OP_OPEN_SUBEXP: - if ((boundaries & 1) && subexp_idx == dfa->nodes[node].opr.idx) - return -1; - break; - - case OP_CLOSE_SUBEXP: - if ((boundaries & 2) && subexp_idx == dfa->nodes[node].opr.idx) - return 0; - break; - - default: - break; - } - } - - return (boundaries & 2) ? 1 : 0; -} - -static int -internal_function -check_dst_limits_calc_pos (const re_match_context_t *mctx, int limit, - int subexp_idx, int from_node, int str_idx, - int bkref_idx) -{ - struct re_backref_cache_entry *lim = mctx->bkref_ents + limit; - int boundaries; - - /* If we are outside the range of the subexpression, return -1 or 1. */ - if (str_idx < lim->subexp_from) - return -1; - - if (lim->subexp_to < str_idx) - return 1; - - /* If we are within the subexpression, return 0. */ - boundaries = (str_idx == lim->subexp_from); - boundaries |= (str_idx == lim->subexp_to) << 1; - if (boundaries == 0) - return 0; - - /* Else, examine epsilon closure. */ - return check_dst_limits_calc_pos_1 (mctx, boundaries, subexp_idx, - from_node, bkref_idx); -} - -/* Check the limitations of sub expressions LIMITS, and remove the nodes - which are against limitations from DEST_NODES. */ - -static reg_errcode_t -internal_function -check_subexp_limits (const re_dfa_t *dfa, re_node_set *dest_nodes, - const re_node_set *candidates, re_node_set *limits, - struct re_backref_cache_entry *bkref_ents, int str_idx) -{ - reg_errcode_t err; - int node_idx, lim_idx; - - for (lim_idx = 0; lim_idx < limits->nelem; ++lim_idx) - { - int subexp_idx; - struct re_backref_cache_entry *ent; - ent = bkref_ents + limits->elems[lim_idx]; - - if (str_idx <= ent->subexp_from || ent->str_idx < str_idx) - continue; /* This is unrelated limitation. */ - - subexp_idx = dfa->nodes[ent->node].opr.idx; - if (ent->subexp_to == str_idx) - { - int ops_node = -1; - int cls_node = -1; - for (node_idx = 0; node_idx < dest_nodes->nelem; ++node_idx) - { - int node = dest_nodes->elems[node_idx]; - re_token_type_t type = dfa->nodes[node].type; - if (type == OP_OPEN_SUBEXP - && subexp_idx == dfa->nodes[node].opr.idx) - ops_node = node; - else if (type == OP_CLOSE_SUBEXP - && subexp_idx == dfa->nodes[node].opr.idx) - cls_node = node; - } - - /* Check the limitation of the open subexpression. */ - /* Note that (ent->subexp_to = str_idx != ent->subexp_from). */ - if (ops_node >= 0) - { - err = sub_epsilon_src_nodes (dfa, ops_node, dest_nodes, - candidates); - if (BE (err != REG_NOERROR, 0)) - return err; - } - - /* Check the limitation of the close subexpression. */ - if (cls_node >= 0) - for (node_idx = 0; node_idx < dest_nodes->nelem; ++node_idx) - { - int node = dest_nodes->elems[node_idx]; - if (!re_node_set_contains (dfa->inveclosures + node, - cls_node) - && !re_node_set_contains (dfa->eclosures + node, - cls_node)) - { - /* It is against this limitation. - Remove it form the current sifted state. */ - err = sub_epsilon_src_nodes (dfa, node, dest_nodes, - candidates); - if (BE (err != REG_NOERROR, 0)) - return err; - --node_idx; - } - } - } - else /* (ent->subexp_to != str_idx) */ - { - for (node_idx = 0; node_idx < dest_nodes->nelem; ++node_idx) - { - int node = dest_nodes->elems[node_idx]; - re_token_type_t type = dfa->nodes[node].type; - if (type == OP_CLOSE_SUBEXP || type == OP_OPEN_SUBEXP) - { - if (subexp_idx != dfa->nodes[node].opr.idx) - continue; - /* It is against this limitation. - Remove it form the current sifted state. */ - err = sub_epsilon_src_nodes (dfa, node, dest_nodes, - candidates); - if (BE (err != REG_NOERROR, 0)) - return err; - } - } - } - } - return REG_NOERROR; -} - -static reg_errcode_t -internal_function -sift_states_bkref (const re_match_context_t *mctx, re_sift_context_t *sctx, - int str_idx, const re_node_set *candidates) -{ - const re_dfa_t *const dfa = mctx->dfa; - reg_errcode_t err; - int node_idx, node; - re_sift_context_t local_sctx; - int first_idx = search_cur_bkref_entry (mctx, str_idx); - - if (first_idx == -1) - return REG_NOERROR; - - local_sctx.sifted_states = NULL; /* Mark that it hasn't been initialized. */ - - for (node_idx = 0; node_idx < candidates->nelem; ++node_idx) - { - int enabled_idx; - re_token_type_t type; - struct re_backref_cache_entry *entry; - node = candidates->elems[node_idx]; - type = dfa->nodes[node].type; - /* Avoid infinite loop for the REs like "()\1+". */ - if (node == sctx->last_node && str_idx == sctx->last_str_idx) - continue; - if (type != OP_BACK_REF) - continue; - - entry = mctx->bkref_ents + first_idx; - enabled_idx = first_idx; - do - { - int subexp_len; - int to_idx; - int dst_node; - int ret; - re_dfastate_t *cur_state; - - if (entry->node != node) - continue; - subexp_len = entry->subexp_to - entry->subexp_from; - to_idx = str_idx + subexp_len; - dst_node = (subexp_len ? dfa->nexts[node] - : dfa->edests[node].elems[0]); - - if (to_idx > sctx->last_str_idx - || sctx->sifted_states[to_idx] == NULL - || !STATE_NODE_CONTAINS (sctx->sifted_states[to_idx], dst_node) - || check_dst_limits (mctx, &sctx->limits, node, - str_idx, dst_node, to_idx)) - continue; - - if (local_sctx.sifted_states == NULL) - { - local_sctx = *sctx; - err = re_node_set_init_copy (&local_sctx.limits, &sctx->limits); - if (BE (err != REG_NOERROR, 0)) - goto free_return; - } - local_sctx.last_node = node; - local_sctx.last_str_idx = str_idx; - ret = re_node_set_insert (&local_sctx.limits, enabled_idx); - if (BE (ret < 0, 0)) - { - err = REG_ESPACE; - goto free_return; - } - cur_state = local_sctx.sifted_states[str_idx]; - err = sift_states_backward (mctx, &local_sctx); - if (BE (err != REG_NOERROR, 0)) - goto free_return; - if (sctx->limited_states != NULL) - { - err = merge_state_array (dfa, sctx->limited_states, - local_sctx.sifted_states, - str_idx + 1); - if (BE (err != REG_NOERROR, 0)) - goto free_return; - } - local_sctx.sifted_states[str_idx] = cur_state; - re_node_set_remove (&local_sctx.limits, enabled_idx); - - /* mctx->bkref_ents may have changed, reload the pointer. */ - entry = mctx->bkref_ents + enabled_idx; - } - while (enabled_idx++, entry++->more); - } - err = REG_NOERROR; - free_return: - if (local_sctx.sifted_states != NULL) - { - re_node_set_free (&local_sctx.limits); - } - - return err; -} - - -#ifdef RE_ENABLE_I18N -static int -internal_function -sift_states_iter_mb (const re_match_context_t *mctx, re_sift_context_t *sctx, - int node_idx, int str_idx, int max_str_idx) -{ - const re_dfa_t *const dfa = mctx->dfa; - int naccepted; - /* Check the node can accept `multi byte'. */ - naccepted = check_node_accept_bytes (dfa, node_idx, &mctx->input, str_idx); - if (naccepted > 0 && str_idx + naccepted <= max_str_idx && - !STATE_NODE_CONTAINS (sctx->sifted_states[str_idx + naccepted], - dfa->nexts[node_idx])) - /* The node can't accept the `multi byte', or the - destination was already thrown away, then the node - could't accept the current input `multi byte'. */ - naccepted = 0; - /* Otherwise, it is sure that the node could accept - `naccepted' bytes input. */ - return naccepted; -} -#endif /* RE_ENABLE_I18N */ - - -/* Functions for state transition. */ - -/* Return the next state to which the current state STATE will transit by - accepting the current input byte, and update STATE_LOG if necessary. - If STATE can accept a multibyte char/collating element/back reference - update the destination of STATE_LOG. */ - -static re_dfastate_t * -internal_function -transit_state (reg_errcode_t *err, re_match_context_t *mctx, - re_dfastate_t *state) -{ - re_dfastate_t **trtable; - unsigned char ch; - -#ifdef RE_ENABLE_I18N - /* If the current state can accept multibyte. */ - if (BE (state->accept_mb, 0)) - { - *err = transit_state_mb (mctx, state); - if (BE (*err != REG_NOERROR, 0)) - return NULL; - } -#endif /* RE_ENABLE_I18N */ - - /* Then decide the next state with the single byte. */ -#if 0 - if (0) - /* don't use transition table */ - return transit_state_sb (err, mctx, state); -#endif - - /* Use transition table */ - ch = re_string_fetch_byte (&mctx->input); - for (;;) - { - trtable = state->trtable; - if (BE (trtable != NULL, 1)) - return trtable[ch]; - - trtable = state->word_trtable; - if (BE (trtable != NULL, 1)) - { - unsigned int context; - context - = re_string_context_at (&mctx->input, - re_string_cur_idx (&mctx->input) - 1, - mctx->eflags); - if (IS_WORD_CONTEXT (context)) - return trtable[ch + SBC_MAX]; - else - return trtable[ch]; - } - - if (!build_trtable (mctx->dfa, state)) - { - *err = REG_ESPACE; - return NULL; - } - - /* Retry, we now have a transition table. */ - } -} - -/* Update the state_log if we need */ -re_dfastate_t * -internal_function -merge_state_with_log (reg_errcode_t *err, re_match_context_t *mctx, - re_dfastate_t *next_state) -{ - const re_dfa_t *const dfa = mctx->dfa; - int cur_idx = re_string_cur_idx (&mctx->input); - - if (cur_idx > mctx->state_log_top) - { - mctx->state_log[cur_idx] = next_state; - mctx->state_log_top = cur_idx; - } - else if (mctx->state_log[cur_idx] == 0) - { - mctx->state_log[cur_idx] = next_state; - } - else - { - re_dfastate_t *pstate; - unsigned int context; - re_node_set next_nodes, *log_nodes, *table_nodes = NULL; - /* If (state_log[cur_idx] != 0), it implies that cur_idx is - the destination of a multibyte char/collating element/ - back reference. Then the next state is the union set of - these destinations and the results of the transition table. */ - pstate = mctx->state_log[cur_idx]; - log_nodes = pstate->entrance_nodes; - if (next_state != NULL) - { - table_nodes = next_state->entrance_nodes; - *err = re_node_set_init_union (&next_nodes, table_nodes, - log_nodes); - if (BE (*err != REG_NOERROR, 0)) - return NULL; - } - else - next_nodes = *log_nodes; - /* Note: We already add the nodes of the initial state, - then we don't need to add them here. */ - - context = re_string_context_at (&mctx->input, - re_string_cur_idx (&mctx->input) - 1, - mctx->eflags); - next_state = mctx->state_log[cur_idx] - = re_acquire_state_context (err, dfa, &next_nodes, context); - /* We don't need to check errors here, since the return value of - this function is next_state and ERR is already set. */ - - if (table_nodes != NULL) - re_node_set_free (&next_nodes); - } - - if (BE (dfa->nbackref, 0) && next_state != NULL) - { - /* Check OP_OPEN_SUBEXP in the current state in case that we use them - later. We must check them here, since the back references in the - next state might use them. */ - *err = check_subexp_matching_top (mctx, &next_state->nodes, - cur_idx); - if (BE (*err != REG_NOERROR, 0)) - return NULL; - - /* If the next state has back references. */ - if (next_state->has_backref) - { - *err = transit_state_bkref (mctx, &next_state->nodes); - if (BE (*err != REG_NOERROR, 0)) - return NULL; - next_state = mctx->state_log[cur_idx]; - } - } - - return next_state; -} - -/* Skip bytes in the input that correspond to part of a - multi-byte match, then look in the log for a state - from which to restart matching. */ -re_dfastate_t * -internal_function -find_recover_state (reg_errcode_t *err, re_match_context_t *mctx) -{ - re_dfastate_t *cur_state; - do - { - int max = mctx->state_log_top; - int cur_str_idx = re_string_cur_idx (&mctx->input); - - do - { - if (++cur_str_idx > max) - return NULL; - re_string_skip_bytes (&mctx->input, 1); - } - while (mctx->state_log[cur_str_idx] == NULL); - - cur_state = merge_state_with_log (err, mctx, NULL); - } - while (*err == REG_NOERROR && cur_state == NULL); - return cur_state; -} - -/* Helper functions for transit_state. */ - -/* From the node set CUR_NODES, pick up the nodes whose types are - OP_OPEN_SUBEXP and which have corresponding back references in the regular - expression. And register them to use them later for evaluating the - correspoding back references. */ - -static reg_errcode_t -internal_function -check_subexp_matching_top (re_match_context_t *mctx, re_node_set *cur_nodes, - int str_idx) -{ - const re_dfa_t *const dfa = mctx->dfa; - int node_idx; - reg_errcode_t err; - - /* TODO: This isn't efficient. - Because there might be more than one nodes whose types are - OP_OPEN_SUBEXP and whose index is SUBEXP_IDX, we must check all - nodes. - E.g. RE: (a){2} */ - for (node_idx = 0; node_idx < cur_nodes->nelem; ++node_idx) - { - int node = cur_nodes->elems[node_idx]; - if (dfa->nodes[node].type == OP_OPEN_SUBEXP - && dfa->nodes[node].opr.idx < BITSET_WORD_BITS - && (dfa->used_bkref_map - & ((bitset_word_t) 1 << dfa->nodes[node].opr.idx))) - { - err = match_ctx_add_subtop (mctx, node, str_idx); - if (BE (err != REG_NOERROR, 0)) - return err; - } - } - return REG_NOERROR; -} - -#if 0 -/* Return the next state to which the current state STATE will transit by - accepting the current input byte. */ - -static re_dfastate_t * -transit_state_sb (reg_errcode_t *err, re_match_context_t *mctx, - re_dfastate_t *state) -{ - const re_dfa_t *const dfa = mctx->dfa; - re_node_set next_nodes; - re_dfastate_t *next_state; - int node_cnt, cur_str_idx = re_string_cur_idx (&mctx->input); - unsigned int context; - - *err = re_node_set_alloc (&next_nodes, state->nodes.nelem + 1); - if (BE (*err != REG_NOERROR, 0)) - return NULL; - for (node_cnt = 0; node_cnt < state->nodes.nelem; ++node_cnt) - { - int cur_node = state->nodes.elems[node_cnt]; - if (check_node_accept (mctx, dfa->nodes + cur_node, cur_str_idx)) - { - *err = re_node_set_merge (&next_nodes, - dfa->eclosures + dfa->nexts[cur_node]); - if (BE (*err != REG_NOERROR, 0)) - { - re_node_set_free (&next_nodes); - return NULL; - } - } - } - context = re_string_context_at (&mctx->input, cur_str_idx, mctx->eflags); - next_state = re_acquire_state_context (err, dfa, &next_nodes, context); - /* We don't need to check errors here, since the return value of - this function is next_state and ERR is already set. */ - - re_node_set_free (&next_nodes); - re_string_skip_bytes (&mctx->input, 1); - return next_state; -} -#endif - -#ifdef RE_ENABLE_I18N -static reg_errcode_t -internal_function -transit_state_mb (re_match_context_t *mctx, re_dfastate_t *pstate) -{ - const re_dfa_t *const dfa = mctx->dfa; - reg_errcode_t err; - int i; - - for (i = 0; i < pstate->nodes.nelem; ++i) - { - re_node_set dest_nodes, *new_nodes; - int cur_node_idx = pstate->nodes.elems[i]; - int naccepted, dest_idx; - unsigned int context; - re_dfastate_t *dest_state; - - if (!dfa->nodes[cur_node_idx].accept_mb) - continue; - - if (dfa->nodes[cur_node_idx].constraint) - { - context = re_string_context_at (&mctx->input, - re_string_cur_idx (&mctx->input), - mctx->eflags); - if (NOT_SATISFY_NEXT_CONSTRAINT (dfa->nodes[cur_node_idx].constraint, - context)) - continue; - } - - /* How many bytes the node can accept? */ - naccepted = check_node_accept_bytes (dfa, cur_node_idx, &mctx->input, - re_string_cur_idx (&mctx->input)); - if (naccepted == 0) - continue; - - /* The node can accepts `naccepted' bytes. */ - dest_idx = re_string_cur_idx (&mctx->input) + naccepted; - mctx->max_mb_elem_len = ((mctx->max_mb_elem_len < naccepted) ? naccepted - : mctx->max_mb_elem_len); - err = clean_state_log_if_needed (mctx, dest_idx); - if (BE (err != REG_NOERROR, 0)) - return err; -#ifdef DEBUG - assert (dfa->nexts[cur_node_idx] != -1); -#endif - new_nodes = dfa->eclosures + dfa->nexts[cur_node_idx]; - - dest_state = mctx->state_log[dest_idx]; - if (dest_state == NULL) - dest_nodes = *new_nodes; - else - { - err = re_node_set_init_union (&dest_nodes, - dest_state->entrance_nodes, new_nodes); - if (BE (err != REG_NOERROR, 0)) - return err; - } - context = re_string_context_at (&mctx->input, dest_idx - 1, - mctx->eflags); - mctx->state_log[dest_idx] - = re_acquire_state_context (&err, dfa, &dest_nodes, context); - if (dest_state != NULL) - re_node_set_free (&dest_nodes); - if (BE (mctx->state_log[dest_idx] == NULL && err != REG_NOERROR, 0)) - return err; - } - return REG_NOERROR; -} -#endif /* RE_ENABLE_I18N */ - -static reg_errcode_t -internal_function -transit_state_bkref (re_match_context_t *mctx, const re_node_set *nodes) -{ - const re_dfa_t *const dfa = mctx->dfa; - reg_errcode_t err; - int i; - int cur_str_idx = re_string_cur_idx (&mctx->input); - - for (i = 0; i < nodes->nelem; ++i) - { - int dest_str_idx, prev_nelem, bkc_idx; - int node_idx = nodes->elems[i]; - unsigned int context; - const re_token_t *node = dfa->nodes + node_idx; - re_node_set *new_dest_nodes; - - /* Check whether `node' is a backreference or not. */ - if (node->type != OP_BACK_REF) - continue; - - if (node->constraint) - { - context = re_string_context_at (&mctx->input, cur_str_idx, - mctx->eflags); - if (NOT_SATISFY_NEXT_CONSTRAINT (node->constraint, context)) - continue; - } - - /* `node' is a backreference. - Check the substring which the substring matched. */ - bkc_idx = mctx->nbkref_ents; - err = get_subexp (mctx, node_idx, cur_str_idx); - if (BE (err != REG_NOERROR, 0)) - goto free_return; - - /* And add the epsilon closures (which is `new_dest_nodes') of - the backreference to appropriate state_log. */ -#ifdef DEBUG - assert (dfa->nexts[node_idx] != -1); -#endif - for (; bkc_idx < mctx->nbkref_ents; ++bkc_idx) - { - int subexp_len; - re_dfastate_t *dest_state; - struct re_backref_cache_entry *bkref_ent; - bkref_ent = mctx->bkref_ents + bkc_idx; - if (bkref_ent->node != node_idx || bkref_ent->str_idx != cur_str_idx) - continue; - subexp_len = bkref_ent->subexp_to - bkref_ent->subexp_from; - new_dest_nodes = (subexp_len == 0 - ? dfa->eclosures + dfa->edests[node_idx].elems[0] - : dfa->eclosures + dfa->nexts[node_idx]); - dest_str_idx = (cur_str_idx + bkref_ent->subexp_to - - bkref_ent->subexp_from); - context = re_string_context_at (&mctx->input, dest_str_idx - 1, - mctx->eflags); - dest_state = mctx->state_log[dest_str_idx]; - prev_nelem = ((mctx->state_log[cur_str_idx] == NULL) ? 0 - : mctx->state_log[cur_str_idx]->nodes.nelem); - /* Add `new_dest_node' to state_log. */ - if (dest_state == NULL) - { - mctx->state_log[dest_str_idx] - = re_acquire_state_context (&err, dfa, new_dest_nodes, - context); - if (BE (mctx->state_log[dest_str_idx] == NULL - && err != REG_NOERROR, 0)) - goto free_return; - } - else - { - re_node_set dest_nodes; - err = re_node_set_init_union (&dest_nodes, - dest_state->entrance_nodes, - new_dest_nodes); - if (BE (err != REG_NOERROR, 0)) - { - re_node_set_free (&dest_nodes); - goto free_return; - } - mctx->state_log[dest_str_idx] - = re_acquire_state_context (&err, dfa, &dest_nodes, context); - re_node_set_free (&dest_nodes); - if (BE (mctx->state_log[dest_str_idx] == NULL - && err != REG_NOERROR, 0)) - goto free_return; - } - /* We need to check recursively if the backreference can epsilon - transit. */ - if (subexp_len == 0 - && mctx->state_log[cur_str_idx]->nodes.nelem > prev_nelem) - { - err = check_subexp_matching_top (mctx, new_dest_nodes, - cur_str_idx); - if (BE (err != REG_NOERROR, 0)) - goto free_return; - err = transit_state_bkref (mctx, new_dest_nodes); - if (BE (err != REG_NOERROR, 0)) - goto free_return; - } - } - } - err = REG_NOERROR; - free_return: - return err; -} - -/* Enumerate all the candidates which the backreference BKREF_NODE can match - at BKREF_STR_IDX, and register them by match_ctx_add_entry(). - Note that we might collect inappropriate candidates here. - However, the cost of checking them strictly here is too high, then we - delay these checking for prune_impossible_nodes(). */ - -static reg_errcode_t -internal_function -get_subexp (re_match_context_t *mctx, int bkref_node, int bkref_str_idx) -{ - const re_dfa_t *const dfa = mctx->dfa; - int subexp_num, sub_top_idx; - const char *buf = (const char *) re_string_get_buffer (&mctx->input); - /* Return if we have already checked BKREF_NODE at BKREF_STR_IDX. */ - int cache_idx = search_cur_bkref_entry (mctx, bkref_str_idx); - if (cache_idx != -1) - { - const struct re_backref_cache_entry *entry - = mctx->bkref_ents + cache_idx; - do - if (entry->node == bkref_node) - return REG_NOERROR; /* We already checked it. */ - while (entry++->more); - } - - subexp_num = dfa->nodes[bkref_node].opr.idx; - - /* For each sub expression */ - for (sub_top_idx = 0; sub_top_idx < mctx->nsub_tops; ++sub_top_idx) - { - reg_errcode_t err; - re_sub_match_top_t *sub_top = mctx->sub_tops[sub_top_idx]; - re_sub_match_last_t *sub_last; - int sub_last_idx, sl_str, bkref_str_off; - - if (dfa->nodes[sub_top->node].opr.idx != subexp_num) - continue; /* It isn't related. */ - - sl_str = sub_top->str_idx; - bkref_str_off = bkref_str_idx; - /* At first, check the last node of sub expressions we already - evaluated. */ - for (sub_last_idx = 0; sub_last_idx < sub_top->nlasts; ++sub_last_idx) - { - int sl_str_diff; - sub_last = sub_top->lasts[sub_last_idx]; - sl_str_diff = sub_last->str_idx - sl_str; - /* The matched string by the sub expression match with the substring - at the back reference? */ - if (sl_str_diff > 0) - { - if (BE (bkref_str_off + sl_str_diff > mctx->input.valid_len, 0)) - { - /* Not enough chars for a successful match. */ - if (bkref_str_off + sl_str_diff > mctx->input.len) - break; - - err = clean_state_log_if_needed (mctx, - bkref_str_off - + sl_str_diff); - if (BE (err != REG_NOERROR, 0)) - return err; - buf = (const char *) re_string_get_buffer (&mctx->input); - } - if (memcmp (buf + bkref_str_off, buf + sl_str, sl_str_diff) != 0) - /* We don't need to search this sub expression any more. */ - break; - } - bkref_str_off += sl_str_diff; - sl_str += sl_str_diff; - err = get_subexp_sub (mctx, sub_top, sub_last, bkref_node, - bkref_str_idx); - - /* Reload buf, since the preceding call might have reallocated - the buffer. */ - buf = (const char *) re_string_get_buffer (&mctx->input); - - if (err == REG_NOMATCH) - continue; - if (BE (err != REG_NOERROR, 0)) - return err; - } - - if (sub_last_idx < sub_top->nlasts) - continue; - if (sub_last_idx > 0) - ++sl_str; - /* Then, search for the other last nodes of the sub expression. */ - for (; sl_str <= bkref_str_idx; ++sl_str) - { - int cls_node, sl_str_off; - const re_node_set *nodes; - sl_str_off = sl_str - sub_top->str_idx; - /* The matched string by the sub expression match with the substring - at the back reference? */ - if (sl_str_off > 0) - { - if (BE (bkref_str_off >= mctx->input.valid_len, 0)) - { - /* If we are at the end of the input, we cannot match. */ - if (bkref_str_off >= mctx->input.len) - break; - - err = extend_buffers (mctx); - if (BE (err != REG_NOERROR, 0)) - return err; - - buf = (const char *) re_string_get_buffer (&mctx->input); - } - if (buf [bkref_str_off++] != buf[sl_str - 1]) - break; /* We don't need to search this sub expression - any more. */ - } - if (mctx->state_log[sl_str] == NULL) - continue; - /* Does this state have a ')' of the sub expression? */ - nodes = &mctx->state_log[sl_str]->nodes; - cls_node = find_subexp_node (dfa, nodes, subexp_num, - OP_CLOSE_SUBEXP); - if (cls_node == -1) - continue; /* No. */ - if (sub_top->path == NULL) - { - sub_top->path = calloc (sizeof (state_array_t), - sl_str - sub_top->str_idx + 1); - if (sub_top->path == NULL) - return REG_ESPACE; - } - /* Can the OP_OPEN_SUBEXP node arrive the OP_CLOSE_SUBEXP node - in the current context? */ - err = check_arrival (mctx, sub_top->path, sub_top->node, - sub_top->str_idx, cls_node, sl_str, - OP_CLOSE_SUBEXP); - if (err == REG_NOMATCH) - continue; - if (BE (err != REG_NOERROR, 0)) - return err; - sub_last = match_ctx_add_sublast (sub_top, cls_node, sl_str); - if (BE (sub_last == NULL, 0)) - return REG_ESPACE; - err = get_subexp_sub (mctx, sub_top, sub_last, bkref_node, - bkref_str_idx); - if (err == REG_NOMATCH) - continue; - } - } - return REG_NOERROR; -} - -/* Helper functions for get_subexp(). */ - -/* Check SUB_LAST can arrive to the back reference BKREF_NODE at BKREF_STR. - If it can arrive, register the sub expression expressed with SUB_TOP - and SUB_LAST. */ - -static reg_errcode_t -internal_function -get_subexp_sub (re_match_context_t *mctx, const re_sub_match_top_t *sub_top, - re_sub_match_last_t *sub_last, int bkref_node, int bkref_str) -{ - reg_errcode_t err; - int to_idx; - /* Can the subexpression arrive the back reference? */ - err = check_arrival (mctx, &sub_last->path, sub_last->node, - sub_last->str_idx, bkref_node, bkref_str, - OP_OPEN_SUBEXP); - if (err != REG_NOERROR) - return err; - err = match_ctx_add_entry (mctx, bkref_node, bkref_str, sub_top->str_idx, - sub_last->str_idx); - if (BE (err != REG_NOERROR, 0)) - return err; - to_idx = bkref_str + sub_last->str_idx - sub_top->str_idx; - return clean_state_log_if_needed (mctx, to_idx); -} - -/* Find the first node which is '(' or ')' and whose index is SUBEXP_IDX. - Search '(' if FL_OPEN, or search ')' otherwise. - TODO: This function isn't efficient... - Because there might be more than one nodes whose types are - OP_OPEN_SUBEXP and whose index is SUBEXP_IDX, we must check all - nodes. - E.g. RE: (a){2} */ - -static int -internal_function -find_subexp_node (const re_dfa_t *dfa, const re_node_set *nodes, - int subexp_idx, int type) -{ - int cls_idx; - for (cls_idx = 0; cls_idx < nodes->nelem; ++cls_idx) - { - int cls_node = nodes->elems[cls_idx]; - const re_token_t *node = dfa->nodes + cls_node; - if (node->type == type - && node->opr.idx == subexp_idx) - return cls_node; - } - return -1; -} - -/* Check whether the node TOP_NODE at TOP_STR can arrive to the node - LAST_NODE at LAST_STR. We record the path onto PATH since it will be - heavily reused. - Return REG_NOERROR if it can arrive, or REG_NOMATCH otherwise. */ - -static reg_errcode_t -internal_function -check_arrival (re_match_context_t *mctx, state_array_t *path, int top_node, - int top_str, int last_node, int last_str, int type) -{ - const re_dfa_t *const dfa = mctx->dfa; - reg_errcode_t err = REG_NOERROR; - int subexp_num, backup_cur_idx, str_idx, null_cnt; - re_dfastate_t *cur_state = NULL; - re_node_set *cur_nodes, next_nodes; - re_dfastate_t **backup_state_log; - unsigned int context; - - subexp_num = dfa->nodes[top_node].opr.idx; - /* Extend the buffer if we need. */ - if (BE (path->alloc < last_str + mctx->max_mb_elem_len + 1, 0)) - { - re_dfastate_t **new_array; - int old_alloc = path->alloc; - path->alloc += last_str + mctx->max_mb_elem_len + 1; - new_array = re_realloc (path->array, re_dfastate_t *, path->alloc); - if (BE (new_array == NULL, 0)) - { - path->alloc = old_alloc; - return REG_ESPACE; - } - path->array = new_array; - memset (new_array + old_alloc, '\0', - sizeof (re_dfastate_t *) * (path->alloc - old_alloc)); - } - - str_idx = path->next_idx ? path->next_idx : top_str; - - /* Temporary modify MCTX. */ - backup_state_log = mctx->state_log; - backup_cur_idx = mctx->input.cur_idx; - mctx->state_log = path->array; - mctx->input.cur_idx = str_idx; - - /* Setup initial node set. */ - context = re_string_context_at (&mctx->input, str_idx - 1, mctx->eflags); - if (str_idx == top_str) - { - err = re_node_set_init_1 (&next_nodes, top_node); - if (BE (err != REG_NOERROR, 0)) - return err; - err = check_arrival_expand_ecl (dfa, &next_nodes, subexp_num, type); - if (BE (err != REG_NOERROR, 0)) - { - re_node_set_free (&next_nodes); - return err; - } - } - else - { - cur_state = mctx->state_log[str_idx]; - if (cur_state && cur_state->has_backref) - { - err = re_node_set_init_copy (&next_nodes, &cur_state->nodes); - if (BE (err != REG_NOERROR, 0)) - return err; - } - else - re_node_set_init_empty (&next_nodes); - } - if (str_idx == top_str || (cur_state && cur_state->has_backref)) - { - if (next_nodes.nelem) - { - err = expand_bkref_cache (mctx, &next_nodes, str_idx, - subexp_num, type); - if (BE (err != REG_NOERROR, 0)) - { - re_node_set_free (&next_nodes); - return err; - } - } - cur_state = re_acquire_state_context (&err, dfa, &next_nodes, context); - if (BE (cur_state == NULL && err != REG_NOERROR, 0)) - { - re_node_set_free (&next_nodes); - return err; - } - mctx->state_log[str_idx] = cur_state; - } - - for (null_cnt = 0; str_idx < last_str && null_cnt <= mctx->max_mb_elem_len;) - { - re_node_set_empty (&next_nodes); - if (mctx->state_log[str_idx + 1]) - { - err = re_node_set_merge (&next_nodes, - &mctx->state_log[str_idx + 1]->nodes); - if (BE (err != REG_NOERROR, 0)) - { - re_node_set_free (&next_nodes); - return err; - } - } - if (cur_state) - { - err = check_arrival_add_next_nodes (mctx, str_idx, - &cur_state->non_eps_nodes, - &next_nodes); - if (BE (err != REG_NOERROR, 0)) - { - re_node_set_free (&next_nodes); - return err; - } - } - ++str_idx; - if (next_nodes.nelem) - { - err = check_arrival_expand_ecl (dfa, &next_nodes, subexp_num, type); - if (BE (err != REG_NOERROR, 0)) - { - re_node_set_free (&next_nodes); - return err; - } - err = expand_bkref_cache (mctx, &next_nodes, str_idx, - subexp_num, type); - if (BE (err != REG_NOERROR, 0)) - { - re_node_set_free (&next_nodes); - return err; - } - } - context = re_string_context_at (&mctx->input, str_idx - 1, mctx->eflags); - cur_state = re_acquire_state_context (&err, dfa, &next_nodes, context); - if (BE (cur_state == NULL && err != REG_NOERROR, 0)) - { - re_node_set_free (&next_nodes); - return err; - } - mctx->state_log[str_idx] = cur_state; - null_cnt = cur_state == NULL ? null_cnt + 1 : 0; - } - re_node_set_free (&next_nodes); - cur_nodes = (mctx->state_log[last_str] == NULL ? NULL - : &mctx->state_log[last_str]->nodes); - path->next_idx = str_idx; - - /* Fix MCTX. */ - mctx->state_log = backup_state_log; - mctx->input.cur_idx = backup_cur_idx; - - /* Then check the current node set has the node LAST_NODE. */ - if (cur_nodes != NULL && re_node_set_contains (cur_nodes, last_node)) - return REG_NOERROR; - - return REG_NOMATCH; -} - -/* Helper functions for check_arrival. */ - -/* Calculate the destination nodes of CUR_NODES at STR_IDX, and append them - to NEXT_NODES. - TODO: This function is similar to the functions transit_state*(), - however this function has many additional works. - Can't we unify them? */ - -static reg_errcode_t -internal_function -check_arrival_add_next_nodes (re_match_context_t *mctx, int str_idx, - re_node_set *cur_nodes, re_node_set *next_nodes) -{ - const re_dfa_t *const dfa = mctx->dfa; - int result; - int cur_idx; -#ifdef RE_ENABLE_I18N - reg_errcode_t err = REG_NOERROR; -#endif - re_node_set union_set; - re_node_set_init_empty (&union_set); - for (cur_idx = 0; cur_idx < cur_nodes->nelem; ++cur_idx) - { - int naccepted = 0; - int cur_node = cur_nodes->elems[cur_idx]; -#ifdef DEBUG - re_token_type_t type = dfa->nodes[cur_node].type; - assert (!IS_EPSILON_NODE (type)); -#endif -#ifdef RE_ENABLE_I18N - /* If the node may accept `multi byte'. */ - if (dfa->nodes[cur_node].accept_mb) - { - naccepted = check_node_accept_bytes (dfa, cur_node, &mctx->input, - str_idx); - if (naccepted > 1) - { - re_dfastate_t *dest_state; - int next_node = dfa->nexts[cur_node]; - int next_idx = str_idx + naccepted; - dest_state = mctx->state_log[next_idx]; - re_node_set_empty (&union_set); - if (dest_state) - { - err = re_node_set_merge (&union_set, &dest_state->nodes); - if (BE (err != REG_NOERROR, 0)) - { - re_node_set_free (&union_set); - return err; - } - } - result = re_node_set_insert (&union_set, next_node); - if (BE (result < 0, 0)) - { - re_node_set_free (&union_set); - return REG_ESPACE; - } - mctx->state_log[next_idx] = re_acquire_state (&err, dfa, - &union_set); - if (BE (mctx->state_log[next_idx] == NULL - && err != REG_NOERROR, 0)) - { - re_node_set_free (&union_set); - return err; - } - } - } -#endif /* RE_ENABLE_I18N */ - if (naccepted - || check_node_accept (mctx, dfa->nodes + cur_node, str_idx)) - { - result = re_node_set_insert (next_nodes, dfa->nexts[cur_node]); - if (BE (result < 0, 0)) - { - re_node_set_free (&union_set); - return REG_ESPACE; - } - } - } - re_node_set_free (&union_set); - return REG_NOERROR; -} - -/* For all the nodes in CUR_NODES, add the epsilon closures of them to - CUR_NODES, however exclude the nodes which are: - - inside the sub expression whose number is EX_SUBEXP, if FL_OPEN. - - out of the sub expression whose number is EX_SUBEXP, if !FL_OPEN. -*/ - -static reg_errcode_t -internal_function -check_arrival_expand_ecl (const re_dfa_t *dfa, re_node_set *cur_nodes, - int ex_subexp, int type) -{ - reg_errcode_t err; - int idx, outside_node; - re_node_set new_nodes; -#ifdef DEBUG - assert (cur_nodes->nelem); -#endif - err = re_node_set_alloc (&new_nodes, cur_nodes->nelem); - if (BE (err != REG_NOERROR, 0)) - return err; - /* Create a new node set NEW_NODES with the nodes which are epsilon - closures of the node in CUR_NODES. */ - - for (idx = 0; idx < cur_nodes->nelem; ++idx) - { - int cur_node = cur_nodes->elems[idx]; - const re_node_set *eclosure = dfa->eclosures + cur_node; - outside_node = find_subexp_node (dfa, eclosure, ex_subexp, type); - if (outside_node == -1) - { - /* There are no problematic nodes, just merge them. */ - err = re_node_set_merge (&new_nodes, eclosure); - if (BE (err != REG_NOERROR, 0)) - { - re_node_set_free (&new_nodes); - return err; - } - } - else - { - /* There are problematic nodes, re-calculate incrementally. */ - err = check_arrival_expand_ecl_sub (dfa, &new_nodes, cur_node, - ex_subexp, type); - if (BE (err != REG_NOERROR, 0)) - { - re_node_set_free (&new_nodes); - return err; - } - } - } - re_node_set_free (cur_nodes); - *cur_nodes = new_nodes; - return REG_NOERROR; -} - -/* Helper function for check_arrival_expand_ecl. - Check incrementally the epsilon closure of TARGET, and if it isn't - problematic append it to DST_NODES. */ - -static reg_errcode_t -internal_function -check_arrival_expand_ecl_sub (const re_dfa_t *dfa, re_node_set *dst_nodes, - int target, int ex_subexp, int type) -{ - int cur_node; - for (cur_node = target; !re_node_set_contains (dst_nodes, cur_node);) - { - int err; - - if (dfa->nodes[cur_node].type == type - && dfa->nodes[cur_node].opr.idx == ex_subexp) - { - if (type == OP_CLOSE_SUBEXP) - { - err = re_node_set_insert (dst_nodes, cur_node); - if (BE (err == -1, 0)) - return REG_ESPACE; - } - break; - } - err = re_node_set_insert (dst_nodes, cur_node); - if (BE (err == -1, 0)) - return REG_ESPACE; - if (dfa->edests[cur_node].nelem == 0) - break; - if (dfa->edests[cur_node].nelem == 2) - { - err = check_arrival_expand_ecl_sub (dfa, dst_nodes, - dfa->edests[cur_node].elems[1], - ex_subexp, type); - if (BE (err != REG_NOERROR, 0)) - return err; - } - cur_node = dfa->edests[cur_node].elems[0]; - } - return REG_NOERROR; -} - - -/* For all the back references in the current state, calculate the - destination of the back references by the appropriate entry - in MCTX->BKREF_ENTS. */ - -static reg_errcode_t -internal_function -expand_bkref_cache (re_match_context_t *mctx, re_node_set *cur_nodes, - int cur_str, int subexp_num, int type) -{ - const re_dfa_t *const dfa = mctx->dfa; - reg_errcode_t err; - int cache_idx_start = search_cur_bkref_entry (mctx, cur_str); - struct re_backref_cache_entry *ent; - - if (cache_idx_start == -1) - return REG_NOERROR; - - restart: - ent = mctx->bkref_ents + cache_idx_start; - do - { - int to_idx, next_node; - - /* Is this entry ENT is appropriate? */ - if (!re_node_set_contains (cur_nodes, ent->node)) - continue; /* No. */ - - to_idx = cur_str + ent->subexp_to - ent->subexp_from; - /* Calculate the destination of the back reference, and append it - to MCTX->STATE_LOG. */ - if (to_idx == cur_str) - { - /* The backreference did epsilon transit, we must re-check all the - node in the current state. */ - re_node_set new_dests; - reg_errcode_t err2, err3; - next_node = dfa->edests[ent->node].elems[0]; - if (re_node_set_contains (cur_nodes, next_node)) - continue; - err = re_node_set_init_1 (&new_dests, next_node); - err2 = check_arrival_expand_ecl (dfa, &new_dests, subexp_num, type); - err3 = re_node_set_merge (cur_nodes, &new_dests); - re_node_set_free (&new_dests); - if (BE (err != REG_NOERROR || err2 != REG_NOERROR - || err3 != REG_NOERROR, 0)) - { - err = (err != REG_NOERROR ? err - : (err2 != REG_NOERROR ? err2 : err3)); - return err; - } - /* TODO: It is still inefficient... */ - goto restart; - } - else - { - re_node_set union_set; - next_node = dfa->nexts[ent->node]; - if (mctx->state_log[to_idx]) - { - int ret; - if (re_node_set_contains (&mctx->state_log[to_idx]->nodes, - next_node)) - continue; - err = re_node_set_init_copy (&union_set, - &mctx->state_log[to_idx]->nodes); - ret = re_node_set_insert (&union_set, next_node); - if (BE (err != REG_NOERROR || ret < 0, 0)) - { - re_node_set_free (&union_set); - err = err != REG_NOERROR ? err : REG_ESPACE; - return err; - } - } - else - { - err = re_node_set_init_1 (&union_set, next_node); - if (BE (err != REG_NOERROR, 0)) - return err; - } - mctx->state_log[to_idx] = re_acquire_state (&err, dfa, &union_set); - re_node_set_free (&union_set); - if (BE (mctx->state_log[to_idx] == NULL - && err != REG_NOERROR, 0)) - return err; - } - } - while (ent++->more); - return REG_NOERROR; -} - -/* Build transition table for the state. - Return 1 if succeeded, otherwise return NULL. */ - -static int -internal_function -build_trtable (const re_dfa_t *dfa, re_dfastate_t *state) -{ - reg_errcode_t err; - int i, j, ch, need_word_trtable = 0; - bitset_word_t elem, mask; - bool dests_node_malloced = false; - bool dest_states_malloced = false; - int ndests; /* Number of the destination states from `state'. */ - re_dfastate_t **trtable; - re_dfastate_t **dest_states = NULL, **dest_states_word, **dest_states_nl; - re_node_set follows, *dests_node; - bitset_t *dests_ch; - bitset_t acceptable; - - struct dests_alloc - { - re_node_set dests_node[SBC_MAX]; - bitset_t dests_ch[SBC_MAX]; - } *dests_alloc; - - /* We build DFA states which corresponds to the destination nodes - from `state'. `dests_node[i]' represents the nodes which i-th - destination state contains, and `dests_ch[i]' represents the - characters which i-th destination state accepts. */ -#ifdef HAVE_ALLOCA - if (__libc_use_alloca (sizeof (struct dests_alloc))) - dests_alloc = (struct dests_alloc *) alloca (sizeof (struct dests_alloc)); - else -#endif - { - dests_alloc = re_malloc (struct dests_alloc, 1); - if (BE (dests_alloc == NULL, 0)) - return 0; - dests_node_malloced = true; - } - dests_node = dests_alloc->dests_node; - dests_ch = dests_alloc->dests_ch; - - /* Initialize transiton table. */ - state->word_trtable = state->trtable = NULL; - - /* At first, group all nodes belonging to `state' into several - destinations. */ - ndests = group_nodes_into_DFAstates (dfa, state, dests_node, dests_ch); - if (BE (ndests <= 0, 0)) - { - if (dests_node_malloced) - free (dests_alloc); - /* Return 0 in case of an error, 1 otherwise. */ - if (ndests == 0) - { - state->trtable = (re_dfastate_t **) - calloc (sizeof (re_dfastate_t *), SBC_MAX); - return 1; - } - return 0; - } - - err = re_node_set_alloc (&follows, ndests + 1); - if (BE (err != REG_NOERROR, 0)) - goto out_free; - - /* Avoid arithmetic overflow in size calculation. */ - if (BE ((((SIZE_MAX - (sizeof (re_node_set) + sizeof (bitset_t)) * SBC_MAX) - / (3 * sizeof (re_dfastate_t *))) - < (size_t)ndests), - 0)) - goto out_free; - -#ifdef HAVE_ALLOCA - if (__libc_use_alloca ((sizeof (re_node_set) + sizeof (bitset_t)) * SBC_MAX - + ndests * 3 * sizeof (re_dfastate_t *))) - dest_states = (re_dfastate_t **) - alloca (ndests * 3 * sizeof (re_dfastate_t *)); - else -#endif - { - dest_states = (re_dfastate_t **) - malloc (ndests * 3 * sizeof (re_dfastate_t *)); - if (BE (dest_states == NULL, 0)) - { -out_free: - if (dest_states_malloced) - free (dest_states); - re_node_set_free (&follows); - for (i = 0; i < ndests; ++i) - re_node_set_free (dests_node + i); - if (dests_node_malloced) - free (dests_alloc); - return 0; - } - dest_states_malloced = true; - } - dest_states_word = dest_states + ndests; - dest_states_nl = dest_states_word + ndests; - bitset_empty (acceptable); - - /* Then build the states for all destinations. */ - for (i = 0; i < ndests; ++i) - { - int next_node; - re_node_set_empty (&follows); - /* Merge the follows of this destination states. */ - for (j = 0; j < dests_node[i].nelem; ++j) - { - next_node = dfa->nexts[dests_node[i].elems[j]]; - if (next_node != -1) - { - err = re_node_set_merge (&follows, dfa->eclosures + next_node); - if (BE (err != REG_NOERROR, 0)) - goto out_free; - } - } - dest_states[i] = re_acquire_state_context (&err, dfa, &follows, 0); - if (BE (dest_states[i] == NULL && err != REG_NOERROR, 0)) - goto out_free; - /* If the new state has context constraint, - build appropriate states for these contexts. */ - if (dest_states[i]->has_constraint) - { - dest_states_word[i] = re_acquire_state_context (&err, dfa, &follows, - CONTEXT_WORD); - if (BE (dest_states_word[i] == NULL && err != REG_NOERROR, 0)) - goto out_free; - - if (dest_states[i] != dest_states_word[i] && dfa->mb_cur_max > 1) - need_word_trtable = 1; - - dest_states_nl[i] = re_acquire_state_context (&err, dfa, &follows, - CONTEXT_NEWLINE); - if (BE (dest_states_nl[i] == NULL && err != REG_NOERROR, 0)) - goto out_free; - } - else - { - dest_states_word[i] = dest_states[i]; - dest_states_nl[i] = dest_states[i]; - } - bitset_merge (acceptable, dests_ch[i]); - } - - if (!BE (need_word_trtable, 0)) - { - /* We don't care about whether the following character is a word - character, or we are in a single-byte character set so we can - discern by looking at the character code: allocate a - 256-entry transition table. */ - trtable = state->trtable = - (re_dfastate_t **) calloc (sizeof (re_dfastate_t *), SBC_MAX); - if (BE (trtable == NULL, 0)) - goto out_free; - - /* For all characters ch...: */ - for (i = 0; i < BITSET_WORDS; ++i) - for (ch = i * BITSET_WORD_BITS, elem = acceptable[i], mask = 1; - elem; - mask <<= 1, elem >>= 1, ++ch) - if (BE (elem & 1, 0)) - { - /* There must be exactly one destination which accepts - character ch. See group_nodes_into_DFAstates. */ - for (j = 0; (dests_ch[j][i] & mask) == 0; ++j) - ; - - /* j-th destination accepts the word character ch. */ - if (dfa->word_char[i] & mask) - trtable[ch] = dest_states_word[j]; - else - trtable[ch] = dest_states[j]; - } - } - else - { - /* We care about whether the following character is a word - character, and we are in a multi-byte character set: discern - by looking at the character code: build two 256-entry - transition tables, one starting at trtable[0] and one - starting at trtable[SBC_MAX]. */ - trtable = state->word_trtable = - (re_dfastate_t **) calloc (sizeof (re_dfastate_t *), 2 * SBC_MAX); - if (BE (trtable == NULL, 0)) - goto out_free; - - /* For all characters ch...: */ - for (i = 0; i < BITSET_WORDS; ++i) - for (ch = i * BITSET_WORD_BITS, elem = acceptable[i], mask = 1; - elem; - mask <<= 1, elem >>= 1, ++ch) - if (BE (elem & 1, 0)) - { - /* There must be exactly one destination which accepts - character ch. See group_nodes_into_DFAstates. */ - for (j = 0; (dests_ch[j][i] & mask) == 0; ++j) - ; - - /* j-th destination accepts the word character ch. */ - trtable[ch] = dest_states[j]; - trtable[ch + SBC_MAX] = dest_states_word[j]; - } - } - - /* new line */ - if (bitset_contain (acceptable, NEWLINE_CHAR)) - { - /* The current state accepts newline character. */ - for (j = 0; j < ndests; ++j) - if (bitset_contain (dests_ch[j], NEWLINE_CHAR)) - { - /* k-th destination accepts newline character. */ - trtable[NEWLINE_CHAR] = dest_states_nl[j]; - if (need_word_trtable) - trtable[NEWLINE_CHAR + SBC_MAX] = dest_states_nl[j]; - /* There must be only one destination which accepts - newline. See group_nodes_into_DFAstates. */ - break; - } - } - - if (dest_states_malloced) - free (dest_states); - - re_node_set_free (&follows); - for (i = 0; i < ndests; ++i) - re_node_set_free (dests_node + i); - - if (dests_node_malloced) - free (dests_alloc); - - return 1; -} - -/* Group all nodes belonging to STATE into several destinations. - Then for all destinations, set the nodes belonging to the destination - to DESTS_NODE[i] and set the characters accepted by the destination - to DEST_CH[i]. This function return the number of destinations. */ - -static int -internal_function -group_nodes_into_DFAstates (const re_dfa_t *dfa, const re_dfastate_t *state, - re_node_set *dests_node, bitset_t *dests_ch) -{ - reg_errcode_t err; - int result; - int i, j, k; - int ndests; /* Number of the destinations from `state'. */ - bitset_t accepts; /* Characters a node can accept. */ - const re_node_set *cur_nodes = &state->nodes; - bitset_empty (accepts); - ndests = 0; - - /* For all the nodes belonging to `state', */ - for (i = 0; i < cur_nodes->nelem; ++i) - { - re_token_t *node = &dfa->nodes[cur_nodes->elems[i]]; - re_token_type_t type = node->type; - unsigned int constraint = node->constraint; - - /* Enumerate all single byte character this node can accept. */ - if (type == CHARACTER) - bitset_set (accepts, node->opr.c); - else if (type == SIMPLE_BRACKET) - { - bitset_merge (accepts, node->opr.sbcset); - } - else if (type == OP_PERIOD) - { -#ifdef RE_ENABLE_I18N - if (dfa->mb_cur_max > 1) - bitset_merge (accepts, dfa->sb_char); - else -#endif - bitset_set_all (accepts); - if (!(dfa->syntax & RE_DOT_NEWLINE)) - bitset_clear (accepts, '\n'); - if (dfa->syntax & RE_DOT_NOT_NULL) - bitset_clear (accepts, '\0'); - } -#ifdef RE_ENABLE_I18N - else if (type == OP_UTF8_PERIOD) - { - memset (accepts, '\xff', sizeof (bitset_t) / 2); - if (!(dfa->syntax & RE_DOT_NEWLINE)) - bitset_clear (accepts, '\n'); - if (dfa->syntax & RE_DOT_NOT_NULL) - bitset_clear (accepts, '\0'); - } -#endif - else - continue; - - /* Check the `accepts' and sift the characters which are not - match it the context. */ - if (constraint) - { - if (constraint & NEXT_NEWLINE_CONSTRAINT) - { - bool accepts_newline = bitset_contain (accepts, NEWLINE_CHAR); - bitset_empty (accepts); - if (accepts_newline) - bitset_set (accepts, NEWLINE_CHAR); - else - continue; - } - if (constraint & NEXT_ENDBUF_CONSTRAINT) - { - bitset_empty (accepts); - continue; - } - - if (constraint & NEXT_WORD_CONSTRAINT) - { - bitset_word_t any_set = 0; - if (type == CHARACTER && !node->word_char) - { - bitset_empty (accepts); - continue; - } -#ifdef RE_ENABLE_I18N - if (dfa->mb_cur_max > 1) - for (j = 0; j < BITSET_WORDS; ++j) - any_set |= (accepts[j] &= (dfa->word_char[j] | ~dfa->sb_char[j])); - else -#endif - for (j = 0; j < BITSET_WORDS; ++j) - any_set |= (accepts[j] &= dfa->word_char[j]); - if (!any_set) - continue; - } - if (constraint & NEXT_NOTWORD_CONSTRAINT) - { - bitset_word_t any_set = 0; - if (type == CHARACTER && node->word_char) - { - bitset_empty (accepts); - continue; - } -#ifdef RE_ENABLE_I18N - if (dfa->mb_cur_max > 1) - for (j = 0; j < BITSET_WORDS; ++j) - any_set |= (accepts[j] &= ~(dfa->word_char[j] & dfa->sb_char[j])); - else -#endif - for (j = 0; j < BITSET_WORDS; ++j) - any_set |= (accepts[j] &= ~dfa->word_char[j]); - if (!any_set) - continue; - } - } - - /* Then divide `accepts' into DFA states, or create a new - state. Above, we make sure that accepts is not empty. */ - for (j = 0; j < ndests; ++j) - { - bitset_t intersec; /* Intersection sets, see below. */ - bitset_t remains; - /* Flags, see below. */ - bitset_word_t has_intersec, not_subset, not_consumed; - - /* Optimization, skip if this state doesn't accept the character. */ - if (type == CHARACTER && !bitset_contain (dests_ch[j], node->opr.c)) - continue; - - /* Enumerate the intersection set of this state and `accepts'. */ - has_intersec = 0; - for (k = 0; k < BITSET_WORDS; ++k) - has_intersec |= intersec[k] = accepts[k] & dests_ch[j][k]; - /* And skip if the intersection set is empty. */ - if (!has_intersec) - continue; - - /* Then check if this state is a subset of `accepts'. */ - not_subset = not_consumed = 0; - for (k = 0; k < BITSET_WORDS; ++k) - { - not_subset |= remains[k] = ~accepts[k] & dests_ch[j][k]; - not_consumed |= accepts[k] = accepts[k] & ~dests_ch[j][k]; - } - - /* If this state isn't a subset of `accepts', create a - new group state, which has the `remains'. */ - if (not_subset) - { - bitset_copy (dests_ch[ndests], remains); - bitset_copy (dests_ch[j], intersec); - err = re_node_set_init_copy (dests_node + ndests, &dests_node[j]); - if (BE (err != REG_NOERROR, 0)) - goto error_return; - ++ndests; - } - - /* Put the position in the current group. */ - result = re_node_set_insert (&dests_node[j], cur_nodes->elems[i]); - if (BE (result < 0, 0)) - goto error_return; - - /* If all characters are consumed, go to next node. */ - if (!not_consumed) - break; - } - /* Some characters remain, create a new group. */ - if (j == ndests) - { - bitset_copy (dests_ch[ndests], accepts); - err = re_node_set_init_1 (dests_node + ndests, cur_nodes->elems[i]); - if (BE (err != REG_NOERROR, 0)) - goto error_return; - ++ndests; - bitset_empty (accepts); - } - } - return ndests; - error_return: - for (j = 0; j < ndests; ++j) - re_node_set_free (dests_node + j); - return -1; -} - -#ifdef RE_ENABLE_I18N -/* Check how many bytes the node `dfa->nodes[node_idx]' accepts. - Return the number of the bytes the node accepts. - STR_IDX is the current index of the input string. - - This function handles the nodes which can accept one character, or - one collating element like '.', '[a-z]', opposite to the other nodes - can only accept one byte. */ - -static int -internal_function -check_node_accept_bytes (const re_dfa_t *dfa, int node_idx, - const re_string_t *input, int str_idx) -{ - const re_token_t *node = dfa->nodes + node_idx; - int char_len, elem_len; - int i; - wint_t wc; - - if (BE (node->type == OP_UTF8_PERIOD, 0)) - { - unsigned char c = re_string_byte_at (input, str_idx), d; - if (BE (c < 0xc2, 1)) - return 0; - - if (str_idx + 2 > input->len) - return 0; - - d = re_string_byte_at (input, str_idx + 1); - if (c < 0xe0) - return (d < 0x80 || d > 0xbf) ? 0 : 2; - else if (c < 0xf0) - { - char_len = 3; - if (c == 0xe0 && d < 0xa0) - return 0; - } - else if (c < 0xf8) - { - char_len = 4; - if (c == 0xf0 && d < 0x90) - return 0; - } - else if (c < 0xfc) - { - char_len = 5; - if (c == 0xf8 && d < 0x88) - return 0; - } - else if (c < 0xfe) - { - char_len = 6; - if (c == 0xfc && d < 0x84) - return 0; - } - else - return 0; - - if (str_idx + char_len > input->len) - return 0; - - for (i = 1; i < char_len; ++i) - { - d = re_string_byte_at (input, str_idx + i); - if (d < 0x80 || d > 0xbf) - return 0; - } - return char_len; - } - - char_len = re_string_char_size_at (input, str_idx); - if (node->type == OP_PERIOD) - { - if (char_len <= 1) - return 0; - /* FIXME: I don't think this if is needed, as both '\n' - and '\0' are char_len == 1. */ - /* '.' accepts any one character except the following two cases. */ - if ((!(dfa->syntax & RE_DOT_NEWLINE) && - re_string_byte_at (input, str_idx) == '\n') || - ((dfa->syntax & RE_DOT_NOT_NULL) && - re_string_byte_at (input, str_idx) == '\0')) - return 0; - return char_len; - } - - elem_len = re_string_elem_size_at (input, str_idx); - wc = __btowc(*(input->mbs+str_idx)); - if (((elem_len <= 1 && char_len <= 1) || char_len == 0) && (wc != WEOF && wc < SBC_MAX)) - return 0; - - if (node->type == COMPLEX_BRACKET) - { - const re_charset_t *cset = node->opr.mbcset; -# ifdef _LIBC - const unsigned char *pin - = ((const unsigned char *) re_string_get_buffer (input) + str_idx); - int j; - uint32_t nrules; -# endif /* _LIBC */ - int match_len = 0; - wchar_t wc = ((cset->nranges || cset->nchar_classes || cset->nmbchars) - ? re_string_wchar_at (input, str_idx) : 0); - - /* match with multibyte character? */ - for (i = 0; i < cset->nmbchars; ++i) - if (wc == cset->mbchars[i]) - { - match_len = char_len; - goto check_node_accept_bytes_match; - } - /* match with character_class? */ - for (i = 0; i < cset->nchar_classes; ++i) - { - wctype_t wt = cset->char_classes[i]; - if (__iswctype (wc, wt)) - { - match_len = char_len; - goto check_node_accept_bytes_match; - } - } - -# ifdef _LIBC - nrules = _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES); - if (nrules != 0) - { - unsigned int in_collseq = 0; - const int32_t *table, *indirect; - const unsigned char *weights, *extra; - const char *collseqwc; - /* This #include defines a local function! */ -# include - - /* match with collating_symbol? */ - if (cset->ncoll_syms) - extra = (const unsigned char *) - _NL_CURRENT (LC_COLLATE, _NL_COLLATE_SYMB_EXTRAMB); - for (i = 0; i < cset->ncoll_syms; ++i) - { - const unsigned char *coll_sym = extra + cset->coll_syms[i]; - /* Compare the length of input collating element and - the length of current collating element. */ - if (*coll_sym != elem_len) - continue; - /* Compare each bytes. */ - for (j = 0; j < *coll_sym; j++) - if (pin[j] != coll_sym[1 + j]) - break; - if (j == *coll_sym) - { - /* Match if every bytes is equal. */ - match_len = j; - goto check_node_accept_bytes_match; - } - } - - if (cset->nranges) - { - if (elem_len <= char_len) - { - collseqwc = _NL_CURRENT (LC_COLLATE, _NL_COLLATE_COLLSEQWC); - in_collseq = __collseq_table_lookup (collseqwc, wc); - } - else - in_collseq = find_collation_sequence_value (pin, elem_len); - } - /* match with range expression? */ - for (i = 0; i < cset->nranges; ++i) - if (cset->range_starts[i] <= in_collseq - && in_collseq <= cset->range_ends[i]) - { - match_len = elem_len; - goto check_node_accept_bytes_match; - } - - /* match with equivalence_class? */ - if (cset->nequiv_classes) - { - const unsigned char *cp = pin; - table = (const int32_t *) - _NL_CURRENT (LC_COLLATE, _NL_COLLATE_TABLEMB); - weights = (const unsigned char *) - _NL_CURRENT (LC_COLLATE, _NL_COLLATE_WEIGHTMB); - extra = (const unsigned char *) - _NL_CURRENT (LC_COLLATE, _NL_COLLATE_EXTRAMB); - indirect = (const int32_t *) - _NL_CURRENT (LC_COLLATE, _NL_COLLATE_INDIRECTMB); - int32_t idx = findidx (&cp); - if (idx > 0) - for (i = 0; i < cset->nequiv_classes; ++i) - { - int32_t equiv_class_idx = cset->equiv_classes[i]; - size_t weight_len = weights[idx & 0xffffff]; - if (weight_len == weights[equiv_class_idx & 0xffffff] - && (idx >> 24) == (equiv_class_idx >> 24)) - { - int cnt = 0; - - idx &= 0xffffff; - equiv_class_idx &= 0xffffff; - - while (cnt <= weight_len - && (weights[equiv_class_idx + 1 + cnt] - == weights[idx + 1 + cnt])) - ++cnt; - if (cnt > weight_len) - { - match_len = elem_len; - goto check_node_accept_bytes_match; - } - } - } - } - } - else -# endif /* _LIBC */ - { - /* match with range expression? */ -#if __GNUC__ >= 2 - wchar_t cmp_buf[] = {L'\0', L'\0', wc, L'\0', L'\0', L'\0'}; -#else - wchar_t cmp_buf[] = {L'\0', L'\0', L'\0', L'\0', L'\0', L'\0'}; - cmp_buf[2] = wc; -#endif - for (i = 0; i < cset->nranges; ++i) - { - cmp_buf[0] = cset->range_starts[i]; - cmp_buf[4] = cset->range_ends[i]; - if (wcscoll (cmp_buf, cmp_buf + 2) <= 0 - && wcscoll (cmp_buf + 2, cmp_buf + 4) <= 0) - { - match_len = char_len; - goto check_node_accept_bytes_match; - } - } - } - check_node_accept_bytes_match: - if (!cset->non_match) - return match_len; - else - { - if (match_len > 0) - return 0; - else - return (elem_len > char_len) ? elem_len : char_len; - } - } - return 0; -} - -# ifdef _LIBC -static unsigned int -internal_function -find_collation_sequence_value (const unsigned char *mbs, size_t mbs_len) -{ - uint32_t nrules = _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES); - if (nrules == 0) - { - if (mbs_len == 1) - { - /* No valid character. Match it as a single byte character. */ - const unsigned char *collseq = (const unsigned char *) - _NL_CURRENT (LC_COLLATE, _NL_COLLATE_COLLSEQMB); - return collseq[mbs[0]]; - } - return UINT_MAX; - } - else - { - int32_t idx; - const unsigned char *extra = (const unsigned char *) - _NL_CURRENT (LC_COLLATE, _NL_COLLATE_SYMB_EXTRAMB); - int32_t extrasize = (const unsigned char *) - _NL_CURRENT (LC_COLLATE, _NL_COLLATE_SYMB_EXTRAMB + 1) - extra; - - for (idx = 0; idx < extrasize;) - { - int mbs_cnt, found = 0; - int32_t elem_mbs_len; - /* Skip the name of collating element name. */ - idx = idx + extra[idx] + 1; - elem_mbs_len = extra[idx++]; - if (mbs_len == elem_mbs_len) - { - for (mbs_cnt = 0; mbs_cnt < elem_mbs_len; ++mbs_cnt) - if (extra[idx + mbs_cnt] != mbs[mbs_cnt]) - break; - if (mbs_cnt == elem_mbs_len) - /* Found the entry. */ - found = 1; - } - /* Skip the byte sequence of the collating element. */ - idx += elem_mbs_len; - /* Adjust for the alignment. */ - idx = (idx + 3) & ~3; - /* Skip the collation sequence value. */ - idx += sizeof (uint32_t); - /* Skip the wide char sequence of the collating element. */ - idx = idx + sizeof (uint32_t) * (extra[idx] + 1); - /* If we found the entry, return the sequence value. */ - if (found) - return *(uint32_t *) (extra + idx); - /* Skip the collation sequence value. */ - idx += sizeof (uint32_t); - } - return UINT_MAX; - } -} -# endif /* _LIBC */ -#endif /* RE_ENABLE_I18N */ - -/* Check whether the node accepts the byte which is IDX-th - byte of the INPUT. */ - -static int -internal_function -check_node_accept (const re_match_context_t *mctx, const re_token_t *node, - int idx) -{ - unsigned char ch; - ch = re_string_byte_at (&mctx->input, idx); - switch (node->type) - { - case CHARACTER: - if (node->opr.c != ch) - return 0; - break; - - case SIMPLE_BRACKET: - if (!bitset_contain (node->opr.sbcset, ch)) - return 0; - break; - -#ifdef RE_ENABLE_I18N - case OP_UTF8_PERIOD: - if (ch >= 0x80) - return 0; - /* FALLTHROUGH */ -#endif - case OP_PERIOD: - if ((ch == '\n' && !(mctx->dfa->syntax & RE_DOT_NEWLINE)) - || (ch == '\0' && (mctx->dfa->syntax & RE_DOT_NOT_NULL))) - return 0; - break; - - default: - return 0; - } - - if (node->constraint) - { - /* The node has constraints. Check whether the current context - satisfies the constraints. */ - unsigned int context = re_string_context_at (&mctx->input, idx, - mctx->eflags); - if (NOT_SATISFY_NEXT_CONSTRAINT (node->constraint, context)) - return 0; - } - - return 1; -} - -/* Extend the buffers, if the buffers have run out. */ - -static reg_errcode_t -internal_function -extend_buffers (re_match_context_t *mctx) -{ - reg_errcode_t ret; - re_string_t *pstr = &mctx->input; - - /* Avoid overflow. */ - if (BE (INT_MAX / 2 / sizeof (re_dfastate_t *) <= (size_t)pstr->bufs_len, 0)) - return REG_ESPACE; - - /* Double the lengthes of the buffers. */ - ret = re_string_realloc_buffers (pstr, pstr->bufs_len * 2); - if (BE (ret != REG_NOERROR, 0)) - return ret; - - if (mctx->state_log != NULL) - { - /* And double the length of state_log. */ - /* XXX We have no indication of the size of this buffer. If this - allocation fail we have no indication that the state_log array - does not have the right size. */ - re_dfastate_t **new_array = re_realloc (mctx->state_log, re_dfastate_t *, - pstr->bufs_len + 1); - if (BE (new_array == NULL, 0)) - return REG_ESPACE; - mctx->state_log = new_array; - } - - /* Then reconstruct the buffers. */ - if (pstr->icase) - { -#ifdef RE_ENABLE_I18N - if (pstr->mb_cur_max > 1) - { - ret = build_wcs_upper_buffer (pstr); - if (BE (ret != REG_NOERROR, 0)) - return ret; - } - else -#endif /* RE_ENABLE_I18N */ - build_upper_buffer (pstr); - } - else - { -#ifdef RE_ENABLE_I18N - if (pstr->mb_cur_max > 1) - build_wcs_buffer (pstr); - else -#endif /* RE_ENABLE_I18N */ - { - if (pstr->trans != NULL) - re_string_translate_buffer (pstr); - } - } - return REG_NOERROR; -} - - -/* Functions for matching context. */ - -/* Initialize MCTX. */ - -static reg_errcode_t -internal_function -match_ctx_init (re_match_context_t *mctx, int eflags, int n) -{ - mctx->eflags = eflags; - mctx->match_last = -1; - if (n > 0) - { - mctx->bkref_ents = re_malloc (struct re_backref_cache_entry, n); - mctx->sub_tops = re_malloc (re_sub_match_top_t *, n); - if (BE (mctx->bkref_ents == NULL || mctx->sub_tops == NULL, 0)) - return REG_ESPACE; - } - /* Already zero-ed by the caller. - else - mctx->bkref_ents = NULL; - mctx->nbkref_ents = 0; - mctx->nsub_tops = 0; */ - mctx->abkref_ents = n; - mctx->max_mb_elem_len = 1; - mctx->asub_tops = n; - return REG_NOERROR; -} - -/* Clean the entries which depend on the current input in MCTX. - This function must be invoked when the matcher changes the start index - of the input, or changes the input string. */ - -static void -internal_function -match_ctx_clean (re_match_context_t *mctx) -{ - int st_idx; - for (st_idx = 0; st_idx < mctx->nsub_tops; ++st_idx) - { - int sl_idx; - re_sub_match_top_t *top = mctx->sub_tops[st_idx]; - for (sl_idx = 0; sl_idx < top->nlasts; ++sl_idx) - { - re_sub_match_last_t *last = top->lasts[sl_idx]; - re_free (last->path.array); - re_free (last); - } - re_free (top->lasts); - if (top->path) - { - re_free (top->path->array); - re_free (top->path); - } - free (top); - } - - mctx->nsub_tops = 0; - mctx->nbkref_ents = 0; -} - -/* Free all the memory associated with MCTX. */ - -static void -internal_function -match_ctx_free (re_match_context_t *mctx) -{ - /* First, free all the memory associated with MCTX->SUB_TOPS. */ - match_ctx_clean (mctx); - re_free (mctx->sub_tops); - re_free (mctx->bkref_ents); -} - -/* Add a new backreference entry to MCTX. - Note that we assume that caller never call this function with duplicate - entry, and call with STR_IDX which isn't smaller than any existing entry. -*/ - -static reg_errcode_t -internal_function -match_ctx_add_entry (re_match_context_t *mctx, int node, int str_idx, int from, - int to) -{ - if (mctx->nbkref_ents >= mctx->abkref_ents) - { - struct re_backref_cache_entry* new_entry; - new_entry = re_realloc (mctx->bkref_ents, struct re_backref_cache_entry, - mctx->abkref_ents * 2); - if (BE (new_entry == NULL, 0)) - { - re_free (mctx->bkref_ents); - return REG_ESPACE; - } - mctx->bkref_ents = new_entry; - memset (mctx->bkref_ents + mctx->nbkref_ents, '\0', - sizeof (struct re_backref_cache_entry) * mctx->abkref_ents); - mctx->abkref_ents *= 2; - } - if (mctx->nbkref_ents > 0 - && mctx->bkref_ents[mctx->nbkref_ents - 1].str_idx == str_idx) - mctx->bkref_ents[mctx->nbkref_ents - 1].more = 1; - - mctx->bkref_ents[mctx->nbkref_ents].node = node; - mctx->bkref_ents[mctx->nbkref_ents].str_idx = str_idx; - mctx->bkref_ents[mctx->nbkref_ents].subexp_from = from; - mctx->bkref_ents[mctx->nbkref_ents].subexp_to = to; - - /* This is a cache that saves negative results of check_dst_limits_calc_pos. - If bit N is clear, means that this entry won't epsilon-transition to - an OP_OPEN_SUBEXP or OP_CLOSE_SUBEXP for the N+1-th subexpression. If - it is set, check_dst_limits_calc_pos_1 will recurse and try to find one - such node. - - A backreference does not epsilon-transition unless it is empty, so set - to all zeros if FROM != TO. */ - mctx->bkref_ents[mctx->nbkref_ents].eps_reachable_subexps_map - = (from == to ? ~0 : 0); - - mctx->bkref_ents[mctx->nbkref_ents++].more = 0; - if (mctx->max_mb_elem_len < to - from) - mctx->max_mb_elem_len = to - from; - return REG_NOERROR; -} - -/* Search for the first entry which has the same str_idx, or -1 if none is - found. Note that MCTX->BKREF_ENTS is already sorted by MCTX->STR_IDX. */ - -static int -internal_function -search_cur_bkref_entry (const re_match_context_t *mctx, int str_idx) -{ - int left, right, mid, last; - last = right = mctx->nbkref_ents; - for (left = 0; left < right;) - { - mid = (left + right) / 2; - if (mctx->bkref_ents[mid].str_idx < str_idx) - left = mid + 1; - else - right = mid; - } - if (left < last && mctx->bkref_ents[left].str_idx == str_idx) - return left; - else - return -1; -} - -/* Register the node NODE, whose type is OP_OPEN_SUBEXP, and which matches - at STR_IDX. */ - -static reg_errcode_t -internal_function -match_ctx_add_subtop (re_match_context_t *mctx, int node, int str_idx) -{ -#ifdef DEBUG - assert (mctx->sub_tops != NULL); - assert (mctx->asub_tops > 0); -#endif - if (BE (mctx->nsub_tops == mctx->asub_tops, 0)) - { - int new_asub_tops = mctx->asub_tops * 2; - re_sub_match_top_t **new_array = re_realloc (mctx->sub_tops, - re_sub_match_top_t *, - new_asub_tops); - if (BE (new_array == NULL, 0)) - return REG_ESPACE; - mctx->sub_tops = new_array; - mctx->asub_tops = new_asub_tops; - } - mctx->sub_tops[mctx->nsub_tops] = calloc (1, sizeof (re_sub_match_top_t)); - if (BE (mctx->sub_tops[mctx->nsub_tops] == NULL, 0)) - return REG_ESPACE; - mctx->sub_tops[mctx->nsub_tops]->node = node; - mctx->sub_tops[mctx->nsub_tops++]->str_idx = str_idx; - return REG_NOERROR; -} - -/* Register the node NODE, whose type is OP_CLOSE_SUBEXP, and which matches - at STR_IDX, whose corresponding OP_OPEN_SUBEXP is SUB_TOP. */ - -static re_sub_match_last_t * -internal_function -match_ctx_add_sublast (re_sub_match_top_t *subtop, int node, int str_idx) -{ - re_sub_match_last_t *new_entry; - if (BE (subtop->nlasts == subtop->alasts, 0)) - { - int new_alasts = 2 * subtop->alasts + 1; - re_sub_match_last_t **new_array = re_realloc (subtop->lasts, - re_sub_match_last_t *, - new_alasts); - if (BE (new_array == NULL, 0)) - return NULL; - subtop->lasts = new_array; - subtop->alasts = new_alasts; - } - new_entry = calloc (1, sizeof (re_sub_match_last_t)); - if (BE (new_entry != NULL, 1)) - { - subtop->lasts[subtop->nlasts] = new_entry; - new_entry->node = node; - new_entry->str_idx = str_idx; - ++subtop->nlasts; - } - return new_entry; -} - -static void -internal_function -sift_ctx_init (re_sift_context_t *sctx, re_dfastate_t **sifted_sts, - re_dfastate_t **limited_sts, int last_node, int last_str_idx) -{ - sctx->sifted_states = sifted_sts; - sctx->limited_states = limited_sts; - sctx->last_node = last_node; - sctx->last_str_idx = last_str_idx; - re_node_set_init_empty (&sctx->limits); -} diff --git a/vendor/libgit2/deps/winhttp/urlmon.h b/vendor/libgit2/deps/winhttp/urlmon.h deleted file mode 100644 index 4143d501e4..0000000000 --- a/vendor/libgit2/deps/winhttp/urlmon.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#if defined(__MINGW_VERSION) || defined(__MINGW32_VERSION) - -#ifndef __CUSTOM_URLMON_H -#define __CUSTOM_URLMON_H - -typedef struct IInternetSecurityManager IInternetSecurityManager; - -typedef struct IInternetSecurityManagerVtbl -{ - HRESULT(STDMETHODCALLTYPE *QueryInterface)(IInternetSecurityManager *, REFIID, void **); - ULONG(STDMETHODCALLTYPE *AddRef)(IInternetSecurityManager *); - ULONG(STDMETHODCALLTYPE *Release)(IInternetSecurityManager *); - LPVOID SetSecuritySite; - LPVOID GetSecuritySite; - HRESULT(STDMETHODCALLTYPE *MapUrlToZone)(IInternetSecurityManager *, LPCWSTR, DWORD *, DWORD); - LPVOID GetSecurityId; - LPVOID ProcessUrlAction; - LPVOID QueryCustomPolicy; - LPVOID SetZoneMapping; - LPVOID GetZoneMappings; -} IInternetSecurityManagerVtbl; - -struct IInternetSecurityManager -{ - CONST_VTBL struct IInternetSecurityManagerVtbl *lpVtbl; -}; - -#define URLZONE_LOCAL_MACHINE 0 -#define URLZONE_INTRANET 1 -#define URLZONE_TRUSTED 2 - -#endif /* __CUSTOM_URLMON_H */ - -#else - -#include_next - -#endif diff --git a/vendor/libgit2/deps/winhttp/winhttp.def b/vendor/libgit2/deps/winhttp/winhttp.def deleted file mode 100644 index eecce59c3a..0000000000 --- a/vendor/libgit2/deps/winhttp/winhttp.def +++ /dev/null @@ -1,29 +0,0 @@ -LIBRARY WINHTTP -EXPORTS -WinHttpAddRequestHeaders@16 -WinHttpCheckPlatform@0 -WinHttpCloseHandle@4 -WinHttpConnect@16 -WinHttpCrackUrl@16 -WinHttpCreateUrl@16 -WinHttpDetectAutoProxyConfigUrl@8 -WinHttpGetDefaultProxyConfiguration@4 -WinHttpGetIEProxyConfigForCurrentUser@4 -WinHttpGetProxyForUrl@16 -WinHttpOpen@20 -WinHttpOpenRequest@28 -WinHttpQueryAuthSchemes@16 -WinHttpQueryDataAvailable@8 -WinHttpQueryHeaders@24 -WinHttpQueryOption@16 -WinHttpReadData@16 -WinHttpReceiveResponse@8 -WinHttpSendRequest@28 -WinHttpSetCredentials@24 -WinHttpSetDefaultProxyConfiguration@4 -WinHttpSetOption@16 -WinHttpSetStatusCallback@16 -WinHttpSetTimeouts@20 -WinHttpTimeFromSystemTime@8 -WinHttpTimeToSystemTime@8 -WinHttpWriteData@16 diff --git a/vendor/libgit2/deps/winhttp/winhttp.h b/vendor/libgit2/deps/winhttp/winhttp.h deleted file mode 100644 index dd1986a661..0000000000 --- a/vendor/libgit2/deps/winhttp/winhttp.h +++ /dev/null @@ -1,592 +0,0 @@ -/* - * Copyright (C) 2007 Francois Gouget - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA - */ - -#if defined(__MINGW_VERSION) || defined(__MINGW32_VERSION) - -#ifndef __WINE_WINHTTP_H -#define __WINE_WINHTTP_H - -#ifdef _WIN64 -#include -#else -#include -#endif - -#define WINHTTPAPI -#define BOOLAPI WINHTTPAPI BOOL WINAPI - - -typedef LPVOID HINTERNET; -typedef HINTERNET *LPHINTERNET; - -#define INTERNET_DEFAULT_PORT 0 -#define INTERNET_DEFAULT_HTTP_PORT 80 -#define INTERNET_DEFAULT_HTTPS_PORT 443 -typedef WORD INTERNET_PORT; -typedef INTERNET_PORT *LPINTERNET_PORT; - -#define INTERNET_SCHEME_HTTP 1 -#define INTERNET_SCHEME_HTTPS 2 -typedef int INTERNET_SCHEME, *LPINTERNET_SCHEME; - -#define ICU_ESCAPE 0x80000000 - -/* flags for WinHttpOpen */ -#define WINHTTP_FLAG_ASYNC 0x10000000 - -/* flags for WinHttpOpenRequest */ -#define WINHTTP_FLAG_ESCAPE_PERCENT 0x00000004 -#define WINHTTP_FLAG_NULL_CODEPAGE 0x00000008 -#define WINHTTP_FLAG_ESCAPE_DISABLE 0x00000040 -#define WINHTTP_FLAG_ESCAPE_DISABLE_QUERY 0x00000080 -#define WINHTTP_FLAG_BYPASS_PROXY_CACHE 0x00000100 -#define WINHTTP_FLAG_REFRESH WINHTTP_FLAG_BYPASS_PROXY_CACHE -#define WINHTTP_FLAG_SECURE 0x00800000 - -#define WINHTTP_ACCESS_TYPE_DEFAULT_PROXY 0 -#define WINHTTP_ACCESS_TYPE_NO_PROXY 1 -#define WINHTTP_ACCESS_TYPE_NAMED_PROXY 3 - -#define WINHTTP_NO_PROXY_NAME NULL -#define WINHTTP_NO_PROXY_BYPASS NULL - -#define WINHTTP_NO_REFERER NULL -#define WINHTTP_DEFAULT_ACCEPT_TYPES NULL - -#define WINHTTP_NO_ADDITIONAL_HEADERS NULL -#define WINHTTP_NO_REQUEST_DATA NULL - -#define WINHTTP_HEADER_NAME_BY_INDEX NULL -#define WINHTTP_NO_OUTPUT_BUFFER NULL -#define WINHTTP_NO_HEADER_INDEX NULL - -#define WINHTTP_ADDREQ_INDEX_MASK 0x0000FFFF -#define WINHTTP_ADDREQ_FLAGS_MASK 0xFFFF0000 -#define WINHTTP_ADDREQ_FLAG_ADD_IF_NEW 0x10000000 -#define WINHTTP_ADDREQ_FLAG_ADD 0x20000000 -#define WINHTTP_ADDREQ_FLAG_COALESCE_WITH_COMMA 0x40000000 -#define WINHTTP_ADDREQ_FLAG_COALESCE_WITH_SEMICOLON 0x01000000 -#define WINHTTP_ADDREQ_FLAG_COALESCE WINHTTP_ADDREQ_FLAG_COALESCE_WITH_COMMA -#define WINHTTP_ADDREQ_FLAG_REPLACE 0x80000000 - -#define WINHTTP_IGNORE_REQUEST_TOTAL_LENGTH 0 - -/* flags for WinHttp{Set/Query}Options */ -#define WINHTTP_FIRST_OPTION WINHTTP_OPTION_CALLBACK -#define WINHTTP_OPTION_CALLBACK 1 -#define WINHTTP_OPTION_RESOLVE_TIMEOUT 2 -#define WINHTTP_OPTION_CONNECT_TIMEOUT 3 -#define WINHTTP_OPTION_CONNECT_RETRIES 4 -#define WINHTTP_OPTION_SEND_TIMEOUT 5 -#define WINHTTP_OPTION_RECEIVE_TIMEOUT 6 -#define WINHTTP_OPTION_RECEIVE_RESPONSE_TIMEOUT 7 -#define WINHTTP_OPTION_HANDLE_TYPE 9 -#define WINHTTP_OPTION_READ_BUFFER_SIZE 12 -#define WINHTTP_OPTION_WRITE_BUFFER_SIZE 13 -#define WINHTTP_OPTION_PARENT_HANDLE 21 -#define WINHTTP_OPTION_EXTENDED_ERROR 24 -#define WINHTTP_OPTION_SECURITY_FLAGS 31 -#define WINHTTP_OPTION_SECURITY_CERTIFICATE_STRUCT 32 -#define WINHTTP_OPTION_URL 34 -#define WINHTTP_OPTION_SECURITY_KEY_BITNESS 36 -#define WINHTTP_OPTION_PROXY 38 -#define WINHTTP_OPTION_USER_AGENT 41 -#define WINHTTP_OPTION_CONTEXT_VALUE 45 -#define WINHTTP_OPTION_CLIENT_CERT_CONTEXT 47 -#define WINHTTP_OPTION_REQUEST_PRIORITY 58 -#define WINHTTP_OPTION_HTTP_VERSION 59 -#define WINHTTP_OPTION_DISABLE_FEATURE 63 -#define WINHTTP_OPTION_CODEPAGE 68 -#define WINHTTP_OPTION_MAX_CONNS_PER_SERVER 73 -#define WINHTTP_OPTION_MAX_CONNS_PER_1_0_SERVER 74 -#define WINHTTP_OPTION_AUTOLOGON_POLICY 77 -#define WINHTTP_OPTION_SERVER_CERT_CONTEXT 78 -#define WINHTTP_OPTION_ENABLE_FEATURE 79 -#define WINHTTP_OPTION_WORKER_THREAD_COUNT 80 -#define WINHTTP_OPTION_PASSPORT_COBRANDING_TEXT 81 -#define WINHTTP_OPTION_PASSPORT_COBRANDING_URL 82 -#define WINHTTP_OPTION_CONFIGURE_PASSPORT_AUTH 83 -#define WINHTTP_OPTION_SECURE_PROTOCOLS 84 -#define WINHTTP_OPTION_ENABLETRACING 85 -#define WINHTTP_OPTION_PASSPORT_SIGN_OUT 86 -#define WINHTTP_OPTION_PASSPORT_RETURN_URL 87 -#define WINHTTP_OPTION_REDIRECT_POLICY 88 -#define WINHTTP_OPTION_MAX_HTTP_AUTOMATIC_REDIRECTS 89 -#define WINHTTP_OPTION_MAX_HTTP_STATUS_CONTINUE 90 -#define WINHTTP_OPTION_MAX_RESPONSE_HEADER_SIZE 91 -#define WINHTTP_OPTION_MAX_RESPONSE_DRAIN_SIZE 92 -#define WINHTTP_OPTION_CONNECTION_INFO 93 -#define WINHTTP_OPTION_CLIENT_CERT_ISSUER_LIST 94 -#define WINHTTP_OPTION_SPN 96 -#define WINHTTP_OPTION_GLOBAL_PROXY_CREDS 97 -#define WINHTTP_OPTION_GLOBAL_SERVER_CREDS 98 -#define WINHTTP_OPTION_UNLOAD_NOTIFY_EVENT 99 -#define WINHTTP_OPTION_REJECT_USERPWD_IN_URL 100 -#define WINHTTP_OPTION_USE_GLOBAL_SERVER_CREDENTIALS 101 -#define WINHTTP_LAST_OPTION WINHTTP_OPTION_USE_GLOBAL_SERVER_CREDENTIALS -#define WINHTTP_OPTION_USERNAME 0x1000 -#define WINHTTP_OPTION_PASSWORD 0x1001 -#define WINHTTP_OPTION_PROXY_USERNAME 0x1002 -#define WINHTTP_OPTION_PROXY_PASSWORD 0x1003 - -#define WINHTTP_CONNS_PER_SERVER_UNLIMITED 0xFFFFFFFF - -#define WINHTTP_AUTOLOGON_SECURITY_LEVEL_MEDIUM 0 -#define WINHTTP_AUTOLOGON_SECURITY_LEVEL_LOW 1 -#define WINHTTP_AUTOLOGON_SECURITY_LEVEL_HIGH 2 -#define WINHTTP_AUTOLOGON_SECURITY_LEVEL_DEFAULT WINHTTP_AUTOLOGON_SECURITY_LEVEL_MEDIUM - -#define WINHTTP_OPTION_REDIRECT_POLICY_NEVER 0 -#define WINHTTP_OPTION_REDIRECT_POLICY_DISALLOW_HTTPS_TO_HTTP 1 -#define WINHTTP_OPTION_REDIRECT_POLICY_ALWAYS 2 -#define WINHTTP_OPTION_REDIRECT_POLICY_LAST WINHTTP_OPTION_REDIRECT_POLICY_ALWAYS -#define WINHTTP_OPTION_REDIRECT_POLICY_DEFAULT WINHTTP_OPTION_REDIRECT_POLICY_DISALLOW_HTTPS_TO_HTTP - -#define WINHTTP_DISABLE_PASSPORT_AUTH 0x00000000 -#define WINHTTP_ENABLE_PASSPORT_AUTH 0x10000000 -#define WINHTTP_DISABLE_PASSPORT_KEYRING 0x20000000 -#define WINHTTP_ENABLE_PASSPORT_KEYRING 0x40000000 - -#define WINHTTP_DISABLE_COOKIES 0x00000001 -#define WINHTTP_DISABLE_REDIRECTS 0x00000002 -#define WINHTTP_DISABLE_AUTHENTICATION 0x00000004 -#define WINHTTP_DISABLE_KEEP_ALIVE 0x00000008 -#define WINHTTP_ENABLE_SSL_REVOCATION 0x00000001 -#define WINHTTP_ENABLE_SSL_REVERT_IMPERSONATION 0x00000002 -#define WINHTTP_DISABLE_SPN_SERVER_PORT 0x00000000 -#define WINHTTP_ENABLE_SPN_SERVER_PORT 0x00000001 -#define WINHTTP_OPTION_SPN_MASK WINHTTP_ENABLE_SPN_SERVER_PORT - -/* Options for WinHttpOpenRequest */ -#define WINHTTP_NO_REFERER NULL -#define WINHTTP_DEFAULT_ACCEPT_TYPES NULL - -/* Options for WinHttpSendRequest */ -#define WINHTTP_NO_ADDITIONAL_HEADERS NULL -#define WINHTTP_NO_REQUEST_DATA NULL - -/* WinHTTP error codes */ -#define WINHTTP_ERROR_BASE 12000 -#define ERROR_WINHTTP_OUT_OF_HANDLES (WINHTTP_ERROR_BASE + 1) -#define ERROR_WINHTTP_TIMEOUT (WINHTTP_ERROR_BASE + 2) -#define ERROR_WINHTTP_INTERNAL_ERROR (WINHTTP_ERROR_BASE + 4) -#define ERROR_WINHTTP_INVALID_URL (WINHTTP_ERROR_BASE + 5) -#define ERROR_WINHTTP_UNRECOGNIZED_SCHEME (WINHTTP_ERROR_BASE + 6) -#define ERROR_WINHTTP_NAME_NOT_RESOLVED (WINHTTP_ERROR_BASE + 7) -#define ERROR_WINHTTP_INVALID_OPTION (WINHTTP_ERROR_BASE + 9) -#define ERROR_WINHTTP_OPTION_NOT_SETTABLE (WINHTTP_ERROR_BASE + 11) -#define ERROR_WINHTTP_SHUTDOWN (WINHTTP_ERROR_BASE + 12) -#define ERROR_WINHTTP_LOGIN_FAILURE (WINHTTP_ERROR_BASE + 15) -#define ERROR_WINHTTP_OPERATION_CANCELLED (WINHTTP_ERROR_BASE + 17) -#define ERROR_WINHTTP_INCORRECT_HANDLE_TYPE (WINHTTP_ERROR_BASE + 18) -#define ERROR_WINHTTP_INCORRECT_HANDLE_STATE (WINHTTP_ERROR_BASE + 19) -#define ERROR_WINHTTP_CANNOT_CONNECT (WINHTTP_ERROR_BASE + 29) -#define ERROR_WINHTTP_CONNECTION_ERROR (WINHTTP_ERROR_BASE + 30) -#define ERROR_WINHTTP_RESEND_REQUEST (WINHTTP_ERROR_BASE + 32) -#define ERROR_WINHTTP_SECURE_CERT_DATE_INVALID (WINHTTP_ERROR_BASE + 37) -#define ERROR_WINHTTP_SECURE_CERT_CN_INVALID (WINHTTP_ERROR_BASE + 38) -#define ERROR_WINHTTP_CLIENT_AUTH_CERT_NEEDED (WINHTTP_ERROR_BASE + 44) -#define ERROR_WINHTTP_SECURE_INVALID_CA (WINHTTP_ERROR_BASE + 45) -#define ERROR_WINHTTP_SECURE_CERT_REV_FAILED (WINHTTP_ERROR_BASE + 57) -#define ERROR_WINHTTP_CANNOT_CALL_BEFORE_OPEN (WINHTTP_ERROR_BASE + 100) -#define ERROR_WINHTTP_CANNOT_CALL_BEFORE_SEND (WINHTTP_ERROR_BASE + 101) -#define ERROR_WINHTTP_CANNOT_CALL_AFTER_SEND (WINHTTP_ERROR_BASE + 102) -#define ERROR_WINHTTP_CANNOT_CALL_AFTER_OPEN (WINHTTP_ERROR_BASE + 103) -#define ERROR_WINHTTP_HEADER_NOT_FOUND (WINHTTP_ERROR_BASE + 150) -#define ERROR_WINHTTP_INVALID_SERVER_RESPONSE (WINHTTP_ERROR_BASE + 152) -#define ERROR_WINHTTP_INVALID_HEADER (WINHTTP_ERROR_BASE + 153) -#define ERROR_WINHTTP_INVALID_QUERY_REQUEST (WINHTTP_ERROR_BASE + 154) -#define ERROR_WINHTTP_HEADER_ALREADY_EXISTS (WINHTTP_ERROR_BASE + 155) -#define ERROR_WINHTTP_REDIRECT_FAILED (WINHTTP_ERROR_BASE + 156) -#define ERROR_WINHTTP_SECURE_CHANNEL_ERROR (WINHTTP_ERROR_BASE + 157) -#define ERROR_WINHTTP_BAD_AUTO_PROXY_SCRIPT (WINHTTP_ERROR_BASE + 166) -#define ERROR_WINHTTP_UNABLE_TO_DOWNLOAD_SCRIPT (WINHTTP_ERROR_BASE + 167) -#define ERROR_WINHTTP_SECURE_INVALID_CERT (WINHTTP_ERROR_BASE + 169) -#define ERROR_WINHTTP_SECURE_CERT_REVOKED (WINHTTP_ERROR_BASE + 170) -#define ERROR_WINHTTP_NOT_INITIALIZED (WINHTTP_ERROR_BASE + 172) -#define ERROR_WINHTTP_SECURE_FAILURE (WINHTTP_ERROR_BASE + 175) -#define ERROR_WINHTTP_AUTO_PROXY_SERVICE_ERROR (WINHTTP_ERROR_BASE + 178) -#define ERROR_WINHTTP_SECURE_CERT_WRONG_USAGE (WINHTTP_ERROR_BASE + 179) -#define ERROR_WINHTTP_AUTODETECTION_FAILED (WINHTTP_ERROR_BASE + 180) -#define ERROR_WINHTTP_HEADER_COUNT_EXCEEDED (WINHTTP_ERROR_BASE + 181) -#define ERROR_WINHTTP_HEADER_SIZE_OVERFLOW (WINHTTP_ERROR_BASE + 182) -#define ERROR_WINHTTP_CHUNKED_ENCODING_HEADER_SIZE_OVERFLOW (WINHTTP_ERROR_BASE + 183) -#define ERROR_WINHTTP_RESPONSE_DRAIN_OVERFLOW (WINHTTP_ERROR_BASE + 184) -#define ERROR_WINHTTP_CLIENT_CERT_NO_PRIVATE_KEY (WINHTTP_ERROR_BASE + 185) -#define ERROR_WINHTTP_CLIENT_CERT_NO_ACCESS_PRIVATE_KEY (WINHTTP_ERROR_BASE + 186) -#define WINHTTP_ERROR_LAST (WINHTTP_ERROR_BASE + 186) - -/* WinHttp status codes */ -#define HTTP_STATUS_CONTINUE 100 -#define HTTP_STATUS_SWITCH_PROTOCOLS 101 -#define HTTP_STATUS_OK 200 -#define HTTP_STATUS_CREATED 201 -#define HTTP_STATUS_ACCEPTED 202 -#define HTTP_STATUS_PARTIAL 203 -#define HTTP_STATUS_NO_CONTENT 204 -#define HTTP_STATUS_RESET_CONTENT 205 -#define HTTP_STATUS_PARTIAL_CONTENT 206 -#define HTTP_STATUS_WEBDAV_MULTI_STATUS 207 -#define HTTP_STATUS_AMBIGUOUS 300 -#define HTTP_STATUS_MOVED 301 -#define HTTP_STATUS_REDIRECT 302 -#define HTTP_STATUS_REDIRECT_METHOD 303 -#define HTTP_STATUS_NOT_MODIFIED 304 -#define HTTP_STATUS_USE_PROXY 305 -#define HTTP_STATUS_REDIRECT_KEEP_VERB 307 -#define HTTP_STATUS_BAD_REQUEST 400 -#define HTTP_STATUS_DENIED 401 -#define HTTP_STATUS_PAYMENT_REQ 402 -#define HTTP_STATUS_FORBIDDEN 403 -#define HTTP_STATUS_NOT_FOUND 404 -#define HTTP_STATUS_BAD_METHOD 405 -#define HTTP_STATUS_NONE_ACCEPTABLE 406 -#define HTTP_STATUS_PROXY_AUTH_REQ 407 -#define HTTP_STATUS_REQUEST_TIMEOUT 408 -#define HTTP_STATUS_CONFLICT 409 -#define HTTP_STATUS_GONE 410 -#define HTTP_STATUS_LENGTH_REQUIRED 411 -#define HTTP_STATUS_PRECOND_FAILED 412 -#define HTTP_STATUS_REQUEST_TOO_LARGE 413 -#define HTTP_STATUS_URI_TOO_LONG 414 -#define HTTP_STATUS_UNSUPPORTED_MEDIA 415 -#define HTTP_STATUS_RETRY_WITH 449 -#define HTTP_STATUS_SERVER_ERROR 500 -#define HTTP_STATUS_NOT_SUPPORTED 501 -#define HTTP_STATUS_BAD_GATEWAY 502 -#define HTTP_STATUS_SERVICE_UNAVAIL 503 -#define HTTP_STATUS_GATEWAY_TIMEOUT 504 -#define HTTP_STATUS_VERSION_NOT_SUP 505 -#define HTTP_STATUS_FIRST HTTP_STATUS_CONTINUE -#define HTTP_STATUS_LAST HTTP_STATUS_VERSION_NOT_SUP - -#define SECURITY_FLAG_IGNORE_UNKNOWN_CA 0x00000100 -#define SECURITY_FLAG_IGNORE_CERT_DATE_INVALID 0x00002000 -#define SECURITY_FLAG_IGNORE_CERT_CN_INVALID 0x00001000 -#define SECURITY_FLAG_IGNORE_CERT_WRONG_USAGE 0x00000200 -#define SECURITY_FLAG_SECURE 0x00000001 -#define SECURITY_FLAG_STRENGTH_WEAK 0x10000000 -#define SECURITY_FLAG_STRENGTH_MEDIUM 0x40000000 -#define SECURITY_FLAG_STRENGTH_STRONG 0x20000000 - -#define ICU_NO_ENCODE 0x20000000 -#define ICU_DECODE 0x10000000 -#define ICU_NO_META 0x08000000 -#define ICU_ENCODE_SPACES_ONLY 0x04000000 -#define ICU_BROWSER_MODE 0x02000000 -#define ICU_ENCODE_PERCENT 0x00001000 - -/* Query flags */ -#define WINHTTP_QUERY_MIME_VERSION 0 -#define WINHTTP_QUERY_CONTENT_TYPE 1 -#define WINHTTP_QUERY_CONTENT_TRANSFER_ENCODING 2 -#define WINHTTP_QUERY_CONTENT_ID 3 -#define WINHTTP_QUERY_CONTENT_DESCRIPTION 4 -#define WINHTTP_QUERY_CONTENT_LENGTH 5 -#define WINHTTP_QUERY_CONTENT_LANGUAGE 6 -#define WINHTTP_QUERY_ALLOW 7 -#define WINHTTP_QUERY_PUBLIC 8 -#define WINHTTP_QUERY_DATE 9 -#define WINHTTP_QUERY_EXPIRES 10 -#define WINHTTP_QUERY_LAST_MODIFIED 11 -#define WINHTTP_QUERY_MESSAGE_ID 12 -#define WINHTTP_QUERY_URI 13 -#define WINHTTP_QUERY_DERIVED_FROM 14 -#define WINHTTP_QUERY_COST 15 -#define WINHTTP_QUERY_LINK 16 -#define WINHTTP_QUERY_PRAGMA 17 -#define WINHTTP_QUERY_VERSION 18 -#define WINHTTP_QUERY_STATUS_CODE 19 -#define WINHTTP_QUERY_STATUS_TEXT 20 -#define WINHTTP_QUERY_RAW_HEADERS 21 -#define WINHTTP_QUERY_RAW_HEADERS_CRLF 22 -#define WINHTTP_QUERY_CONNECTION 23 -#define WINHTTP_QUERY_ACCEPT 24 -#define WINHTTP_QUERY_ACCEPT_CHARSET 25 -#define WINHTTP_QUERY_ACCEPT_ENCODING 26 -#define WINHTTP_QUERY_ACCEPT_LANGUAGE 27 -#define WINHTTP_QUERY_AUTHORIZATION 28 -#define WINHTTP_QUERY_CONTENT_ENCODING 29 -#define WINHTTP_QUERY_FORWARDED 30 -#define WINHTTP_QUERY_FROM 31 -#define WINHTTP_QUERY_IF_MODIFIED_SINCE 32 -#define WINHTTP_QUERY_LOCATION 33 -#define WINHTTP_QUERY_ORIG_URI 34 -#define WINHTTP_QUERY_REFERER 35 -#define WINHTTP_QUERY_RETRY_AFTER 36 -#define WINHTTP_QUERY_SERVER 37 -#define WINHTTP_QUERY_TITLE 38 -#define WINHTTP_QUERY_USER_AGENT 39 -#define WINHTTP_QUERY_WWW_AUTHENTICATE 40 -#define WINHTTP_QUERY_PROXY_AUTHENTICATE 41 -#define WINHTTP_QUERY_ACCEPT_RANGES 42 -#define WINHTTP_QUERY_SET_COOKIE 43 -#define WINHTTP_QUERY_COOKIE 44 -#define WINHTTP_QUERY_REQUEST_METHOD 45 -#define WINHTTP_QUERY_REFRESH 46 -#define WINHTTP_QUERY_CONTENT_DISPOSITION 47 -#define WINHTTP_QUERY_AGE 48 -#define WINHTTP_QUERY_CACHE_CONTROL 49 -#define WINHTTP_QUERY_CONTENT_BASE 50 -#define WINHTTP_QUERY_CONTENT_LOCATION 51 -#define WINHTTP_QUERY_CONTENT_MD5 52 -#define WINHTTP_QUERY_CONTENT_RANGE 53 -#define WINHTTP_QUERY_ETAG 54 -#define WINHTTP_QUERY_HOST 55 -#define WINHTTP_QUERY_IF_MATCH 56 -#define WINHTTP_QUERY_IF_NONE_MATCH 57 -#define WINHTTP_QUERY_IF_RANGE 58 -#define WINHTTP_QUERY_IF_UNMODIFIED_SINCE 59 -#define WINHTTP_QUERY_MAX_FORWARDS 60 -#define WINHTTP_QUERY_PROXY_AUTHORIZATION 61 -#define WINHTTP_QUERY_RANGE 62 -#define WINHTTP_QUERY_TRANSFER_ENCODING 63 -#define WINHTTP_QUERY_UPGRADE 64 -#define WINHTTP_QUERY_VARY 65 -#define WINHTTP_QUERY_VIA 66 -#define WINHTTP_QUERY_WARNING 67 -#define WINHTTP_QUERY_EXPECT 68 -#define WINHTTP_QUERY_PROXY_CONNECTION 69 -#define WINHTTP_QUERY_UNLESS_MODIFIED_SINCE 70 -#define WINHTTP_QUERY_PROXY_SUPPORT 75 -#define WINHTTP_QUERY_AUTHENTICATION_INFO 76 -#define WINHTTP_QUERY_PASSPORT_URLS 77 -#define WINHTTP_QUERY_PASSPORT_CONFIG 78 -#define WINHTTP_QUERY_MAX 78 -#define WINHTTP_QUERY_CUSTOM 65535 -#define WINHTTP_QUERY_FLAG_REQUEST_HEADERS 0x80000000 -#define WINHTTP_QUERY_FLAG_SYSTEMTIME 0x40000000 -#define WINHTTP_QUERY_FLAG_NUMBER 0x20000000 - -/* Callback options */ -#define WINHTTP_CALLBACK_STATUS_RESOLVING_NAME 0x00000001 -#define WINHTTP_CALLBACK_STATUS_NAME_RESOLVED 0x00000002 -#define WINHTTP_CALLBACK_STATUS_CONNECTING_TO_SERVER 0x00000004 -#define WINHTTP_CALLBACK_STATUS_CONNECTED_TO_SERVER 0x00000008 -#define WINHTTP_CALLBACK_STATUS_SENDING_REQUEST 0x00000010 -#define WINHTTP_CALLBACK_STATUS_REQUEST_SENT 0x00000020 -#define WINHTTP_CALLBACK_STATUS_RECEIVING_RESPONSE 0x00000040 -#define WINHTTP_CALLBACK_STATUS_RESPONSE_RECEIVED 0x00000080 -#define WINHTTP_CALLBACK_STATUS_CLOSING_CONNECTION 0x00000100 -#define WINHTTP_CALLBACK_STATUS_CONNECTION_CLOSED 0x00000200 -#define WINHTTP_CALLBACK_STATUS_HANDLE_CREATED 0x00000400 -#define WINHTTP_CALLBACK_STATUS_HANDLE_CLOSING 0x00000800 -#define WINHTTP_CALLBACK_STATUS_DETECTING_PROXY 0x00001000 -#define WINHTTP_CALLBACK_STATUS_REDIRECT 0x00004000 -#define WINHTTP_CALLBACK_STATUS_INTERMEDIATE_RESPONSE 0x00008000 -#define WINHTTP_CALLBACK_STATUS_SECURE_FAILURE 0x00010000 -#define WINHTTP_CALLBACK_STATUS_HEADERS_AVAILABLE 0x00020000 -#define WINHTTP_CALLBACK_STATUS_DATA_AVAILABLE 0x00040000 -#define WINHTTP_CALLBACK_STATUS_READ_COMPLETE 0x00080000 -#define WINHTTP_CALLBACK_STATUS_WRITE_COMPLETE 0x00100000 -#define WINHTTP_CALLBACK_STATUS_REQUEST_ERROR 0x00200000 -#define WINHTTP_CALLBACK_STATUS_SENDREQUEST_COMPLETE 0x00400000 -#define WINHTTP_CALLBACK_FLAG_RESOLVE_NAME (WINHTTP_CALLBACK_STATUS_RESOLVING_NAME | WINHTTP_CALLBACK_STATUS_NAME_RESOLVED) -#define WINHTTP_CALLBACK_FLAG_CONNECT_TO_SERVER (WINHTTP_CALLBACK_STATUS_CONNECTING_TO_SERVER | WINHTTP_CALLBACK_STATUS_CONNECTED_TO_SERVER) -#define WINHTTP_CALLBACK_FLAG_SEND_REQUEST (WINHTTP_CALLBACK_STATUS_SENDING_REQUEST | WINHTTP_CALLBACK_STATUS_REQUEST_SENT) -#define WINHTTP_CALLBACK_FLAG_RECEIVE_RESPONSE (WINHTTP_CALLBACK_STATUS_RECEIVING_RESPONSE | WINHTTP_CALLBACK_STATUS_RESPONSE_RECEIVED) -#define WINHTTP_CALLBACK_FLAG_CLOSE_CONNECTION (WINHTTP_CALLBACK_STATUS_CLOSING_CONNECTION | WINHTTP_CALLBACK_STATUS_CONNECTION_CLOSED) -#define WINHTTP_CALLBACK_FLAG_HANDLES (WINHTTP_CALLBACK_STATUS_HANDLE_CREATED | WINHTTP_CALLBACK_STATUS_HANDLE_CLOSING) -#define WINHTTP_CALLBACK_FLAG_DETECTING_PROXY WINHTTP_CALLBACK_STATUS_DETECTING_PROXY -#define WINHTTP_CALLBACK_FLAG_REDIRECT WINHTTP_CALLBACK_STATUS_REDIRECT -#define WINHTTP_CALLBACK_FLAG_INTERMEDIATE_RESPONSE WINHTTP_CALLBACK_STATUS_INTERMEDIATE_RESPONSE -#define WINHTTP_CALLBACK_FLAG_SECURE_FAILURE WINHTTP_CALLBACK_STATUS_SECURE_FAILURE -#define WINHTTP_CALLBACK_FLAG_SENDREQUEST_COMPLETE WINHTTP_CALLBACK_STATUS_SENDREQUEST_COMPLETE -#define WINHTTP_CALLBACK_FLAG_HEADERS_AVAILABLE WINHTTP_CALLBACK_STATUS_HEADERS_AVAILABLE -#define WINHTTP_CALLBACK_FLAG_DATA_AVAILABLE WINHTTP_CALLBACK_STATUS_DATA_AVAILABLE -#define WINHTTP_CALLBACK_FLAG_READ_COMPLETE WINHTTP_CALLBACK_STATUS_READ_COMPLETE -#define WINHTTP_CALLBACK_FLAG_WRITE_COMPLETE WINHTTP_CALLBACK_STATUS_WRITE_COMPLETE -#define WINHTTP_CALLBACK_FLAG_REQUEST_ERROR WINHTTP_CALLBACK_STATUS_REQUEST_ERROR -#define WINHTTP_CALLBACK_FLAG_ALL_COMPLETIONS (WINHTTP_CALLBACK_STATUS_SENDREQUEST_COMPLETE | WINHTTP_CALLBACK_STATUS_HEADERS_AVAILABLE \ - | WINHTTP_CALLBACK_STATUS_DATA_AVAILABLE | WINHTTP_CALLBACK_STATUS_READ_COMPLETE \ - | WINHTTP_CALLBACK_STATUS_WRITE_COMPLETE | WINHTTP_CALLBACK_STATUS_REQUEST_ERROR) -#define WINHTTP_CALLBACK_FLAG_ALL_NOTIFICATIONS 0xffffffff -#define WINHTTP_INVALID_STATUS_CALLBACK ((WINHTTP_STATUS_CALLBACK)(-1)) - -#define API_RECEIVE_RESPONSE (1) -#define API_QUERY_DATA_AVAILABLE (2) -#define API_READ_DATA (3) -#define API_WRITE_DATA (4) -#define API_SEND_REQUEST (5) - -#define WINHTTP_HANDLE_TYPE_SESSION 1 -#define WINHTTP_HANDLE_TYPE_CONNECT 2 -#define WINHTTP_HANDLE_TYPE_REQUEST 3 - -#define WINHTTP_CALLBACK_STATUS_FLAG_CERT_REV_FAILED 0x00000001 -#define WINHTTP_CALLBACK_STATUS_FLAG_INVALID_CERT 0x00000002 -#define WINHTTP_CALLBACK_STATUS_FLAG_CERT_REVOKED 0x00000004 -#define WINHTTP_CALLBACK_STATUS_FLAG_INVALID_CA 0x00000008 -#define WINHTTP_CALLBACK_STATUS_FLAG_CERT_CN_INVALID 0x00000010 -#define WINHTTP_CALLBACK_STATUS_FLAG_CERT_DATE_INVALID 0x00000020 -#define WINHTTP_CALLBACK_STATUS_FLAG_CERT_WRONG_USAGE 0x00000040 -#define WINHTTP_CALLBACK_STATUS_FLAG_SECURITY_CHANNEL_ERROR 0x80000000 - -#define WINHTTP_FLAG_SECURE_PROTOCOL_SSL2 0x00000008 -#define WINHTTP_FLAG_SECURE_PROTOCOL_SSL3 0x00000020 -#define WINHTTP_FLAG_SECURE_PROTOCOL_TLS1 0x00000080 -#define WINHTTP_FLAG_SECURE_PROTOCOL_ALL (WINHTTP_FLAG_SECURE_PROTOCOL_SSL2 | WINHTTP_FLAG_SECURE_PROTOCOL_SSL3 | WINHTTP_FLAG_SECURE_PROTOCOL_TLS1) - -#define WINHTTP_AUTH_SCHEME_BASIC 0x00000001 -#define WINHTTP_AUTH_SCHEME_NTLM 0x00000002 -#define WINHTTP_AUTH_SCHEME_PASSPORT 0x00000004 -#define WINHTTP_AUTH_SCHEME_DIGEST 0x00000008 -#define WINHTTP_AUTH_SCHEME_NEGOTIATE 0x00000010 - -#define WINHTTP_AUTH_TARGET_SERVER 0x00000000 -#define WINHTTP_AUTH_TARGET_PROXY 0x00000001 - -#define WINHTTP_TIME_FORMAT_BUFSIZE 62 - -typedef struct -{ - DWORD dwStructSize; - LPWSTR lpszScheme; - DWORD dwSchemeLength; - INTERNET_SCHEME nScheme; - LPWSTR lpszHostName; - DWORD dwHostNameLength; - INTERNET_PORT nPort; - LPWSTR lpszUserName; - DWORD dwUserNameLength; - LPWSTR lpszPassword; - DWORD dwPasswordLength; - LPWSTR lpszUrlPath; - DWORD dwUrlPathLength; - LPWSTR lpszExtraInfo; - DWORD dwExtraInfoLength; -} URL_COMPONENTS, *LPURL_COMPONENTS; -typedef URL_COMPONENTS URL_COMPONENTSW; -typedef LPURL_COMPONENTS LPURL_COMPONENTSW; - -typedef struct -{ - DWORD_PTR dwResult; - DWORD dwError; -} WINHTTP_ASYNC_RESULT, *LPWINHTTP_ASYNC_RESULT; - -typedef struct -{ - FILETIME ftExpiry; - FILETIME ftStart; - LPWSTR lpszSubjectInfo; - LPWSTR lpszIssuerInfo; - LPWSTR lpszProtocolName; - LPWSTR lpszSignatureAlgName; - LPWSTR lpszEncryptionAlgName; - DWORD dwKeySize; -} WINHTTP_CERTIFICATE_INFO; - -typedef struct -{ - DWORD dwAccessType; - LPWSTR lpszProxy; - LPWSTR lpszProxyBypass; -} WINHTTP_PROXY_INFO, *LPWINHTTP_PROXY_INFO; -typedef WINHTTP_PROXY_INFO WINHTTP_PROXY_INFOW; -typedef LPWINHTTP_PROXY_INFO LPWINHTTP_PROXY_INFOW; - -typedef struct -{ - BOOL fAutoDetect; - LPWSTR lpszAutoConfigUrl; - LPWSTR lpszProxy; - LPWSTR lpszProxyBypass; -} WINHTTP_CURRENT_USER_IE_PROXY_CONFIG; - -typedef VOID (CALLBACK *WINHTTP_STATUS_CALLBACK)(HINTERNET,DWORD_PTR,DWORD,LPVOID,DWORD); - -#define WINHTTP_AUTO_DETECT_TYPE_DHCP 0x00000001 -#define WINHTTP_AUTO_DETECT_TYPE_DNS_A 0x00000002 - -#define WINHTTP_AUTOPROXY_AUTO_DETECT 0x00000001 -#define WINHTTP_AUTOPROXY_CONFIG_URL 0x00000002 -#define WINHTTP_AUTOPROXY_RUN_INPROCESS 0x00010000 -#define WINHTTP_AUTOPROXY_RUN_OUTPROCESS_ONLY 0x00020000 - -typedef struct -{ - DWORD dwFlags; - DWORD dwAutoDetectFlags; - LPCWSTR lpszAutoConfigUrl; - LPVOID lpvReserved; - DWORD dwReserved; - BOOL fAutoLogonIfChallenged; -} WINHTTP_AUTOPROXY_OPTIONS; - -typedef struct -{ - DWORD dwMajorVersion; - DWORD dwMinorVersion; -} HTTP_VERSION_INFO, *LPHTTP_VERSION_INFO; - -#ifdef _WS2DEF_ -typedef struct -{ - DWORD cbSize; - SOCKADDR_STORAGE LocalAddress; - SOCKADDR_STORAGE RemoteAddress; -} WINHTTP_CONNECTION_INFO; -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -BOOL WINAPI WinHttpAddRequestHeaders(HINTERNET,LPCWSTR,DWORD,DWORD); -BOOL WINAPI WinHttpDetectAutoProxyConfigUrl(DWORD,LPWSTR*); -BOOL WINAPI WinHttpCheckPlatform(void); -BOOL WINAPI WinHttpCloseHandle(HINTERNET); -HINTERNET WINAPI WinHttpConnect(HINTERNET,LPCWSTR,INTERNET_PORT,DWORD); -BOOL WINAPI WinHttpCrackUrl(LPCWSTR,DWORD,DWORD,LPURL_COMPONENTS); -BOOL WINAPI WinHttpCreateUrl(LPURL_COMPONENTS,DWORD,LPWSTR,LPDWORD); -BOOL WINAPI WinHttpGetDefaultProxyConfiguration(WINHTTP_PROXY_INFO*); -BOOL WINAPI WinHttpGetIEProxyConfigForCurrentUser(WINHTTP_CURRENT_USER_IE_PROXY_CONFIG*); -BOOL WINAPI WinHttpGetProxyForUrl(HINTERNET,LPCWSTR,WINHTTP_AUTOPROXY_OPTIONS*,WINHTTP_PROXY_INFO*); -HINTERNET WINAPI WinHttpOpen(LPCWSTR,DWORD,LPCWSTR,LPCWSTR,DWORD); -HINTERNET WINAPI WinHttpOpenRequest(HINTERNET,LPCWSTR,LPCWSTR,LPCWSTR,LPCWSTR,LPCWSTR*,DWORD); -BOOL WINAPI WinHttpQueryAuthParams(HINTERNET,DWORD,LPVOID*); -BOOL WINAPI WinHttpQueryAuthSchemes(HINTERNET,LPDWORD,LPDWORD,LPDWORD); -BOOL WINAPI WinHttpQueryDataAvailable(HINTERNET,LPDWORD); -BOOL WINAPI WinHttpQueryHeaders(HINTERNET,DWORD,LPCWSTR,LPVOID,LPDWORD,LPDWORD); -BOOL WINAPI WinHttpQueryOption(HINTERNET,DWORD,LPVOID,LPDWORD); -BOOL WINAPI WinHttpReadData(HINTERNET,LPVOID,DWORD,LPDWORD); -BOOL WINAPI WinHttpReceiveResponse(HINTERNET,LPVOID); -BOOL WINAPI WinHttpSendRequest(HINTERNET,LPCWSTR,DWORD,LPVOID,DWORD,DWORD,DWORD_PTR); -BOOL WINAPI WinHttpSetDefaultProxyConfiguration(WINHTTP_PROXY_INFO*); -BOOL WINAPI WinHttpSetCredentials(HINTERNET,DWORD,DWORD,LPCWSTR,LPCWSTR,LPVOID); -BOOL WINAPI WinHttpSetOption(HINTERNET,DWORD,LPVOID,DWORD); -WINHTTP_STATUS_CALLBACK WINAPI WinHttpSetStatusCallback(HINTERNET,WINHTTP_STATUS_CALLBACK,DWORD,DWORD_PTR); -BOOL WINAPI WinHttpSetTimeouts(HINTERNET,int,int,int,int); -BOOL WINAPI WinHttpTimeFromSystemTime(const SYSTEMTIME *,LPWSTR); -BOOL WINAPI WinHttpTimeToSystemTime(LPCWSTR,SYSTEMTIME*); -BOOL WINAPI WinHttpWriteData(HINTERNET,LPCVOID,DWORD,LPDWORD); - -#ifdef __cplusplus -} -#endif - -#include - -#endif /* __WINE_WINHTTP_H */ - -#else - -#include_next - -#endif diff --git a/vendor/libgit2/deps/winhttp/winhttp64.def b/vendor/libgit2/deps/winhttp/winhttp64.def deleted file mode 100644 index bfad3a0cef..0000000000 --- a/vendor/libgit2/deps/winhttp/winhttp64.def +++ /dev/null @@ -1,29 +0,0 @@ -LIBRARY WINHTTP -EXPORTS -WinHttpAddRequestHeaders -WinHttpCheckPlatform -WinHttpCloseHandle -WinHttpConnect -WinHttpCrackUrl -WinHttpCreateUrl -WinHttpDetectAutoProxyConfigUrl -WinHttpGetDefaultProxyConfiguration -WinHttpGetIEProxyConfigForCurrentUser -WinHttpGetProxyForUrl -WinHttpOpen -WinHttpOpenRequest -WinHttpQueryAuthSchemes -WinHttpQueryDataAvailable -WinHttpQueryHeaders -WinHttpQueryOption -WinHttpReadData -WinHttpReceiveResponse -WinHttpSendRequest -WinHttpSetCredentials -WinHttpSetDefaultProxyConfiguration -WinHttpSetOption -WinHttpSetStatusCallback -WinHttpSetTimeouts -WinHttpTimeFromSystemTime -WinHttpTimeToSystemTime -WinHttpWriteData diff --git a/vendor/libgit2/deps/zlib/adler32.c b/vendor/libgit2/deps/zlib/adler32.c deleted file mode 100644 index a868f073d8..0000000000 --- a/vendor/libgit2/deps/zlib/adler32.c +++ /dev/null @@ -1,179 +0,0 @@ -/* adler32.c -- compute the Adler-32 checksum of a data stream - * Copyright (C) 1995-2011 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* @(#) $Id$ */ - -#include "zutil.h" - -#define local static - -local uLong adler32_combine_ OF((uLong adler1, uLong adler2, z_off64_t len2)); - -#define BASE 65521 /* largest prime smaller than 65536 */ -#define NMAX 5552 -/* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */ - -#define DO1(buf,i) {adler += (buf)[i]; sum2 += adler;} -#define DO2(buf,i) DO1(buf,i); DO1(buf,i+1); -#define DO4(buf,i) DO2(buf,i); DO2(buf,i+2); -#define DO8(buf,i) DO4(buf,i); DO4(buf,i+4); -#define DO16(buf) DO8(buf,0); DO8(buf,8); - -/* use NO_DIVIDE if your processor does not do division in hardware -- - try it both ways to see which is faster */ -#ifdef NO_DIVIDE -/* note that this assumes BASE is 65521, where 65536 % 65521 == 15 - (thank you to John Reiser for pointing this out) */ -# define CHOP(a) \ - do { \ - unsigned long tmp = a >> 16; \ - a &= 0xffffUL; \ - a += (tmp << 4) - tmp; \ - } while (0) -# define MOD28(a) \ - do { \ - CHOP(a); \ - if (a >= BASE) a -= BASE; \ - } while (0) -# define MOD(a) \ - do { \ - CHOP(a); \ - MOD28(a); \ - } while (0) -# define MOD63(a) \ - do { /* this assumes a is not negative */ \ - z_off64_t tmp = a >> 32; \ - a &= 0xffffffffL; \ - a += (tmp << 8) - (tmp << 5) + tmp; \ - tmp = a >> 16; \ - a &= 0xffffL; \ - a += (tmp << 4) - tmp; \ - tmp = a >> 16; \ - a &= 0xffffL; \ - a += (tmp << 4) - tmp; \ - if (a >= BASE) a -= BASE; \ - } while (0) -#else -# define MOD(a) a %= BASE -# define MOD28(a) a %= BASE -# define MOD63(a) a %= BASE -#endif - -/* ========================================================================= */ -uLong ZEXPORT adler32(adler, buf, len) - uLong adler; - const Bytef *buf; - uInt len; -{ - unsigned long sum2; - unsigned n; - - /* split Adler-32 into component sums */ - sum2 = (adler >> 16) & 0xffff; - adler &= 0xffff; - - /* in case user likes doing a byte at a time, keep it fast */ - if (len == 1) { - adler += buf[0]; - if (adler >= BASE) - adler -= BASE; - sum2 += adler; - if (sum2 >= BASE) - sum2 -= BASE; - return adler | (sum2 << 16); - } - - /* initial Adler-32 value (deferred check for len == 1 speed) */ - if (buf == Z_NULL) - return 1L; - - /* in case short lengths are provided, keep it somewhat fast */ - if (len < 16) { - while (len--) { - adler += *buf++; - sum2 += adler; - } - if (adler >= BASE) - adler -= BASE; - MOD28(sum2); /* only added so many BASE's */ - return adler | (sum2 << 16); - } - - /* do length NMAX blocks -- requires just one modulo operation */ - while (len >= NMAX) { - len -= NMAX; - n = NMAX / 16; /* NMAX is divisible by 16 */ - do { - DO16(buf); /* 16 sums unrolled */ - buf += 16; - } while (--n); - MOD(adler); - MOD(sum2); - } - - /* do remaining bytes (less than NMAX, still just one modulo) */ - if (len) { /* avoid modulos if none remaining */ - while (len >= 16) { - len -= 16; - DO16(buf); - buf += 16; - } - while (len--) { - adler += *buf++; - sum2 += adler; - } - MOD(adler); - MOD(sum2); - } - - /* return recombined sums */ - return adler | (sum2 << 16); -} - -/* ========================================================================= */ -local uLong adler32_combine_(adler1, adler2, len2) - uLong adler1; - uLong adler2; - z_off64_t len2; -{ - unsigned long sum1; - unsigned long sum2; - unsigned rem; - - /* for negative len, return invalid adler32 as a clue for debugging */ - if (len2 < 0) - return 0xffffffffUL; - - /* the derivation of this formula is left as an exercise for the reader */ - MOD63(len2); /* assumes len2 >= 0 */ - rem = (unsigned)len2; - sum1 = adler1 & 0xffff; - sum2 = rem * sum1; - MOD(sum2); - sum1 += (adler2 & 0xffff) + BASE - 1; - sum2 += ((adler1 >> 16) & 0xffff) + ((adler2 >> 16) & 0xffff) + BASE - rem; - if (sum1 >= BASE) sum1 -= BASE; - if (sum1 >= BASE) sum1 -= BASE; - if (sum2 >= (BASE << 1)) sum2 -= (BASE << 1); - if (sum2 >= BASE) sum2 -= BASE; - return sum1 | (sum2 << 16); -} - -/* ========================================================================= */ -uLong ZEXPORT adler32_combine(adler1, adler2, len2) - uLong adler1; - uLong adler2; - z_off_t len2; -{ - return adler32_combine_(adler1, adler2, len2); -} - -uLong ZEXPORT adler32_combine64(adler1, adler2, len2) - uLong adler1; - uLong adler2; - z_off64_t len2; -{ - return adler32_combine_(adler1, adler2, len2); -} diff --git a/vendor/libgit2/deps/zlib/crc32.c b/vendor/libgit2/deps/zlib/crc32.c deleted file mode 100644 index 979a7190a3..0000000000 --- a/vendor/libgit2/deps/zlib/crc32.c +++ /dev/null @@ -1,425 +0,0 @@ -/* crc32.c -- compute the CRC-32 of a data stream - * Copyright (C) 1995-2006, 2010, 2011, 2012 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - * - * Thanks to Rodney Brown for his contribution of faster - * CRC methods: exclusive-oring 32 bits of data at a time, and pre-computing - * tables for updating the shift register in one step with three exclusive-ors - * instead of four steps with four exclusive-ors. This results in about a - * factor of two increase in speed on a Power PC G4 (PPC7455) using gcc -O3. - */ - -/* @(#) $Id$ */ - -/* - Note on the use of DYNAMIC_CRC_TABLE: there is no mutex or semaphore - protection on the static variables used to control the first-use generation - of the crc tables. Therefore, if you #define DYNAMIC_CRC_TABLE, you should - first call get_crc_table() to initialize the tables before allowing more than - one thread to use crc32(). - - DYNAMIC_CRC_TABLE and MAKECRCH can be #defined to write out crc32.h. - */ - -#ifdef MAKECRCH -# include -# ifndef DYNAMIC_CRC_TABLE -# define DYNAMIC_CRC_TABLE -# endif /* !DYNAMIC_CRC_TABLE */ -#endif /* MAKECRCH */ - -#include "zutil.h" /* for STDC and FAR definitions */ - -#define local static - -/* Definitions for doing the crc four data bytes at a time. */ -#if !defined(NOBYFOUR) && defined(Z_U4) -# define BYFOUR -#endif -#ifdef BYFOUR - local unsigned long crc32_little OF((unsigned long, - const unsigned char FAR *, unsigned)); - local unsigned long crc32_big OF((unsigned long, - const unsigned char FAR *, unsigned)); -# define TBLS 8 -#else -# define TBLS 1 -#endif /* BYFOUR */ - -/* Local functions for crc concatenation */ -local unsigned long gf2_matrix_times OF((unsigned long *mat, - unsigned long vec)); -local void gf2_matrix_square OF((unsigned long *square, unsigned long *mat)); -local uLong crc32_combine_ OF((uLong crc1, uLong crc2, z_off64_t len2)); - - -#ifdef DYNAMIC_CRC_TABLE - -local volatile int crc_table_empty = 1; -local z_crc_t FAR crc_table[TBLS][256]; -local void make_crc_table OF((void)); -#ifdef MAKECRCH - local void write_table OF((FILE *, const z_crc_t FAR *)); -#endif /* MAKECRCH */ -/* - Generate tables for a byte-wise 32-bit CRC calculation on the polynomial: - x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1. - - Polynomials over GF(2) are represented in binary, one bit per coefficient, - with the lowest powers in the most significant bit. Then adding polynomials - is just exclusive-or, and multiplying a polynomial by x is a right shift by - one. If we call the above polynomial p, and represent a byte as the - polynomial q, also with the lowest power in the most significant bit (so the - byte 0xb1 is the polynomial x^7+x^3+x+1), then the CRC is (q*x^32) mod p, - where a mod b means the remainder after dividing a by b. - - This calculation is done using the shift-register method of multiplying and - taking the remainder. The register is initialized to zero, and for each - incoming bit, x^32 is added mod p to the register if the bit is a one (where - x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by - x (which is shifting right by one and adding x^32 mod p if the bit shifted - out is a one). We start with the highest power (least significant bit) of - q and repeat for all eight bits of q. - - The first table is simply the CRC of all possible eight bit values. This is - all the information needed to generate CRCs on data a byte at a time for all - combinations of CRC register values and incoming bytes. The remaining tables - allow for word-at-a-time CRC calculation for both big-endian and little- - endian machines, where a word is four bytes. -*/ -local void make_crc_table() -{ - z_crc_t c; - int n, k; - z_crc_t poly; /* polynomial exclusive-or pattern */ - /* terms of polynomial defining this crc (except x^32): */ - static volatile int first = 1; /* flag to limit concurrent making */ - static const unsigned char p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26}; - - /* See if another task is already doing this (not thread-safe, but better - than nothing -- significantly reduces duration of vulnerability in - case the advice about DYNAMIC_CRC_TABLE is ignored) */ - if (first) { - first = 0; - - /* make exclusive-or pattern from polynomial (0xedb88320UL) */ - poly = 0; - for (n = 0; n < (int)(sizeof(p)/sizeof(unsigned char)); n++) - poly |= (z_crc_t)1 << (31 - p[n]); - - /* generate a crc for every 8-bit value */ - for (n = 0; n < 256; n++) { - c = (z_crc_t)n; - for (k = 0; k < 8; k++) - c = c & 1 ? poly ^ (c >> 1) : c >> 1; - crc_table[0][n] = c; - } - -#ifdef BYFOUR - /* generate crc for each value followed by one, two, and three zeros, - and then the byte reversal of those as well as the first table */ - for (n = 0; n < 256; n++) { - c = crc_table[0][n]; - crc_table[4][n] = ZSWAP32(c); - for (k = 1; k < 4; k++) { - c = crc_table[0][c & 0xff] ^ (c >> 8); - crc_table[k][n] = c; - crc_table[k + 4][n] = ZSWAP32(c); - } - } -#endif /* BYFOUR */ - - crc_table_empty = 0; - } - else { /* not first */ - /* wait for the other guy to finish (not efficient, but rare) */ - while (crc_table_empty) - ; - } - -#ifdef MAKECRCH - /* write out CRC tables to crc32.h */ - { - FILE *out; - - out = fopen("crc32.h", "w"); - if (out == NULL) return; - fprintf(out, "/* crc32.h -- tables for rapid CRC calculation\n"); - fprintf(out, " * Generated automatically by crc32.c\n */\n\n"); - fprintf(out, "local const z_crc_t FAR "); - fprintf(out, "crc_table[TBLS][256] =\n{\n {\n"); - write_table(out, crc_table[0]); -# ifdef BYFOUR - fprintf(out, "#ifdef BYFOUR\n"); - for (k = 1; k < 8; k++) { - fprintf(out, " },\n {\n"); - write_table(out, crc_table[k]); - } - fprintf(out, "#endif\n"); -# endif /* BYFOUR */ - fprintf(out, " }\n};\n"); - fclose(out); - } -#endif /* MAKECRCH */ -} - -#ifdef MAKECRCH -local void write_table(out, table) - FILE *out; - const z_crc_t FAR *table; -{ - int n; - - for (n = 0; n < 256; n++) - fprintf(out, "%s0x%08lxUL%s", n % 5 ? "" : " ", - (unsigned long)(table[n]), - n == 255 ? "\n" : (n % 5 == 4 ? ",\n" : ", ")); -} -#endif /* MAKECRCH */ - -#else /* !DYNAMIC_CRC_TABLE */ -/* ======================================================================== - * Tables of CRC-32s of all single-byte values, made by make_crc_table(). - */ -#include "crc32.h" -#endif /* DYNAMIC_CRC_TABLE */ - -/* ========================================================================= - * This function can be used by asm versions of crc32() - */ -const z_crc_t FAR * ZEXPORT get_crc_table() -{ -#ifdef DYNAMIC_CRC_TABLE - if (crc_table_empty) - make_crc_table(); -#endif /* DYNAMIC_CRC_TABLE */ - return (const z_crc_t FAR *)crc_table; -} - -/* ========================================================================= */ -#define DO1 crc = crc_table[0][((int)crc ^ (*buf++)) & 0xff] ^ (crc >> 8) -#define DO8 DO1; DO1; DO1; DO1; DO1; DO1; DO1; DO1 - -/* ========================================================================= */ -unsigned long ZEXPORT crc32(crc, buf, len) - unsigned long crc; - const unsigned char FAR *buf; - uInt len; -{ - if (buf == Z_NULL) return 0UL; - -#ifdef DYNAMIC_CRC_TABLE - if (crc_table_empty) - make_crc_table(); -#endif /* DYNAMIC_CRC_TABLE */ - -#ifdef BYFOUR - if (sizeof(void *) == sizeof(ptrdiff_t)) { - z_crc_t endian; - - endian = 1; - if (*((unsigned char *)(&endian))) - return crc32_little(crc, buf, len); - else - return crc32_big(crc, buf, len); - } -#endif /* BYFOUR */ - crc = crc ^ 0xffffffffUL; - while (len >= 8) { - DO8; - len -= 8; - } - if (len) do { - DO1; - } while (--len); - return crc ^ 0xffffffffUL; -} - -#ifdef BYFOUR - -/* ========================================================================= */ -#define DOLIT4 c ^= *buf4++; \ - c = crc_table[3][c & 0xff] ^ crc_table[2][(c >> 8) & 0xff] ^ \ - crc_table[1][(c >> 16) & 0xff] ^ crc_table[0][c >> 24] -#define DOLIT32 DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4 - -/* ========================================================================= */ -local unsigned long crc32_little(crc, buf, len) - unsigned long crc; - const unsigned char FAR *buf; - unsigned len; -{ - register z_crc_t c; - register const z_crc_t FAR *buf4; - - c = (z_crc_t)crc; - c = ~c; - while (len && ((ptrdiff_t)buf & 3)) { - c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8); - len--; - } - - buf4 = (const z_crc_t FAR *)(const void FAR *)buf; - while (len >= 32) { - DOLIT32; - len -= 32; - } - while (len >= 4) { - DOLIT4; - len -= 4; - } - buf = (const unsigned char FAR *)buf4; - - if (len) do { - c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8); - } while (--len); - c = ~c; - return (unsigned long)c; -} - -/* ========================================================================= */ -#define DOBIG4 c ^= *++buf4; \ - c = crc_table[4][c & 0xff] ^ crc_table[5][(c >> 8) & 0xff] ^ \ - crc_table[6][(c >> 16) & 0xff] ^ crc_table[7][c >> 24] -#define DOBIG32 DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4 - -/* ========================================================================= */ -local unsigned long crc32_big(crc, buf, len) - unsigned long crc; - const unsigned char FAR *buf; - unsigned len; -{ - register z_crc_t c; - register const z_crc_t FAR *buf4; - - c = ZSWAP32((z_crc_t)crc); - c = ~c; - while (len && ((ptrdiff_t)buf & 3)) { - c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8); - len--; - } - - buf4 = (const z_crc_t FAR *)(const void FAR *)buf; - buf4--; - while (len >= 32) { - DOBIG32; - len -= 32; - } - while (len >= 4) { - DOBIG4; - len -= 4; - } - buf4++; - buf = (const unsigned char FAR *)buf4; - - if (len) do { - c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8); - } while (--len); - c = ~c; - return (unsigned long)(ZSWAP32(c)); -} - -#endif /* BYFOUR */ - -#define GF2_DIM 32 /* dimension of GF(2) vectors (length of CRC) */ - -/* ========================================================================= */ -local unsigned long gf2_matrix_times(mat, vec) - unsigned long *mat; - unsigned long vec; -{ - unsigned long sum; - - sum = 0; - while (vec) { - if (vec & 1) - sum ^= *mat; - vec >>= 1; - mat++; - } - return sum; -} - -/* ========================================================================= */ -local void gf2_matrix_square(square, mat) - unsigned long *square; - unsigned long *mat; -{ - int n; - - for (n = 0; n < GF2_DIM; n++) - square[n] = gf2_matrix_times(mat, mat[n]); -} - -/* ========================================================================= */ -local uLong crc32_combine_(crc1, crc2, len2) - uLong crc1; - uLong crc2; - z_off64_t len2; -{ - int n; - unsigned long row; - unsigned long even[GF2_DIM]; /* even-power-of-two zeros operator */ - unsigned long odd[GF2_DIM]; /* odd-power-of-two zeros operator */ - - /* degenerate case (also disallow negative lengths) */ - if (len2 <= 0) - return crc1; - - /* put operator for one zero bit in odd */ - odd[0] = 0xedb88320UL; /* CRC-32 polynomial */ - row = 1; - for (n = 1; n < GF2_DIM; n++) { - odd[n] = row; - row <<= 1; - } - - /* put operator for two zero bits in even */ - gf2_matrix_square(even, odd); - - /* put operator for four zero bits in odd */ - gf2_matrix_square(odd, even); - - /* apply len2 zeros to crc1 (first square will put the operator for one - zero byte, eight zero bits, in even) */ - do { - /* apply zeros operator for this bit of len2 */ - gf2_matrix_square(even, odd); - if (len2 & 1) - crc1 = gf2_matrix_times(even, crc1); - len2 >>= 1; - - /* if no more bits set, then done */ - if (len2 == 0) - break; - - /* another iteration of the loop with odd and even swapped */ - gf2_matrix_square(odd, even); - if (len2 & 1) - crc1 = gf2_matrix_times(odd, crc1); - len2 >>= 1; - - /* if no more bits set, then done */ - } while (len2 != 0); - - /* return combined crc */ - crc1 ^= crc2; - return crc1; -} - -/* ========================================================================= */ -uLong ZEXPORT crc32_combine(crc1, crc2, len2) - uLong crc1; - uLong crc2; - z_off_t len2; -{ - return crc32_combine_(crc1, crc2, len2); -} - -uLong ZEXPORT crc32_combine64(crc1, crc2, len2) - uLong crc1; - uLong crc2; - z_off64_t len2; -{ - return crc32_combine_(crc1, crc2, len2); -} diff --git a/vendor/libgit2/deps/zlib/crc32.h b/vendor/libgit2/deps/zlib/crc32.h deleted file mode 100644 index 9e0c778102..0000000000 --- a/vendor/libgit2/deps/zlib/crc32.h +++ /dev/null @@ -1,441 +0,0 @@ -/* crc32.h -- tables for rapid CRC calculation - * Generated automatically by crc32.c - */ - -local const z_crc_t FAR crc_table[TBLS][256] = -{ - { - 0x00000000UL, 0x77073096UL, 0xee0e612cUL, 0x990951baUL, 0x076dc419UL, - 0x706af48fUL, 0xe963a535UL, 0x9e6495a3UL, 0x0edb8832UL, 0x79dcb8a4UL, - 0xe0d5e91eUL, 0x97d2d988UL, 0x09b64c2bUL, 0x7eb17cbdUL, 0xe7b82d07UL, - 0x90bf1d91UL, 0x1db71064UL, 0x6ab020f2UL, 0xf3b97148UL, 0x84be41deUL, - 0x1adad47dUL, 0x6ddde4ebUL, 0xf4d4b551UL, 0x83d385c7UL, 0x136c9856UL, - 0x646ba8c0UL, 0xfd62f97aUL, 0x8a65c9ecUL, 0x14015c4fUL, 0x63066cd9UL, - 0xfa0f3d63UL, 0x8d080df5UL, 0x3b6e20c8UL, 0x4c69105eUL, 0xd56041e4UL, - 0xa2677172UL, 0x3c03e4d1UL, 0x4b04d447UL, 0xd20d85fdUL, 0xa50ab56bUL, - 0x35b5a8faUL, 0x42b2986cUL, 0xdbbbc9d6UL, 0xacbcf940UL, 0x32d86ce3UL, - 0x45df5c75UL, 0xdcd60dcfUL, 0xabd13d59UL, 0x26d930acUL, 0x51de003aUL, - 0xc8d75180UL, 0xbfd06116UL, 0x21b4f4b5UL, 0x56b3c423UL, 0xcfba9599UL, - 0xb8bda50fUL, 0x2802b89eUL, 0x5f058808UL, 0xc60cd9b2UL, 0xb10be924UL, - 0x2f6f7c87UL, 0x58684c11UL, 0xc1611dabUL, 0xb6662d3dUL, 0x76dc4190UL, - 0x01db7106UL, 0x98d220bcUL, 0xefd5102aUL, 0x71b18589UL, 0x06b6b51fUL, - 0x9fbfe4a5UL, 0xe8b8d433UL, 0x7807c9a2UL, 0x0f00f934UL, 0x9609a88eUL, - 0xe10e9818UL, 0x7f6a0dbbUL, 0x086d3d2dUL, 0x91646c97UL, 0xe6635c01UL, - 0x6b6b51f4UL, 0x1c6c6162UL, 0x856530d8UL, 0xf262004eUL, 0x6c0695edUL, - 0x1b01a57bUL, 0x8208f4c1UL, 0xf50fc457UL, 0x65b0d9c6UL, 0x12b7e950UL, - 0x8bbeb8eaUL, 0xfcb9887cUL, 0x62dd1ddfUL, 0x15da2d49UL, 0x8cd37cf3UL, - 0xfbd44c65UL, 0x4db26158UL, 0x3ab551ceUL, 0xa3bc0074UL, 0xd4bb30e2UL, - 0x4adfa541UL, 0x3dd895d7UL, 0xa4d1c46dUL, 0xd3d6f4fbUL, 0x4369e96aUL, - 0x346ed9fcUL, 0xad678846UL, 0xda60b8d0UL, 0x44042d73UL, 0x33031de5UL, - 0xaa0a4c5fUL, 0xdd0d7cc9UL, 0x5005713cUL, 0x270241aaUL, 0xbe0b1010UL, - 0xc90c2086UL, 0x5768b525UL, 0x206f85b3UL, 0xb966d409UL, 0xce61e49fUL, - 0x5edef90eUL, 0x29d9c998UL, 0xb0d09822UL, 0xc7d7a8b4UL, 0x59b33d17UL, - 0x2eb40d81UL, 0xb7bd5c3bUL, 0xc0ba6cadUL, 0xedb88320UL, 0x9abfb3b6UL, - 0x03b6e20cUL, 0x74b1d29aUL, 0xead54739UL, 0x9dd277afUL, 0x04db2615UL, - 0x73dc1683UL, 0xe3630b12UL, 0x94643b84UL, 0x0d6d6a3eUL, 0x7a6a5aa8UL, - 0xe40ecf0bUL, 0x9309ff9dUL, 0x0a00ae27UL, 0x7d079eb1UL, 0xf00f9344UL, - 0x8708a3d2UL, 0x1e01f268UL, 0x6906c2feUL, 0xf762575dUL, 0x806567cbUL, - 0x196c3671UL, 0x6e6b06e7UL, 0xfed41b76UL, 0x89d32be0UL, 0x10da7a5aUL, - 0x67dd4accUL, 0xf9b9df6fUL, 0x8ebeeff9UL, 0x17b7be43UL, 0x60b08ed5UL, - 0xd6d6a3e8UL, 0xa1d1937eUL, 0x38d8c2c4UL, 0x4fdff252UL, 0xd1bb67f1UL, - 0xa6bc5767UL, 0x3fb506ddUL, 0x48b2364bUL, 0xd80d2bdaUL, 0xaf0a1b4cUL, - 0x36034af6UL, 0x41047a60UL, 0xdf60efc3UL, 0xa867df55UL, 0x316e8eefUL, - 0x4669be79UL, 0xcb61b38cUL, 0xbc66831aUL, 0x256fd2a0UL, 0x5268e236UL, - 0xcc0c7795UL, 0xbb0b4703UL, 0x220216b9UL, 0x5505262fUL, 0xc5ba3bbeUL, - 0xb2bd0b28UL, 0x2bb45a92UL, 0x5cb36a04UL, 0xc2d7ffa7UL, 0xb5d0cf31UL, - 0x2cd99e8bUL, 0x5bdeae1dUL, 0x9b64c2b0UL, 0xec63f226UL, 0x756aa39cUL, - 0x026d930aUL, 0x9c0906a9UL, 0xeb0e363fUL, 0x72076785UL, 0x05005713UL, - 0x95bf4a82UL, 0xe2b87a14UL, 0x7bb12baeUL, 0x0cb61b38UL, 0x92d28e9bUL, - 0xe5d5be0dUL, 0x7cdcefb7UL, 0x0bdbdf21UL, 0x86d3d2d4UL, 0xf1d4e242UL, - 0x68ddb3f8UL, 0x1fda836eUL, 0x81be16cdUL, 0xf6b9265bUL, 0x6fb077e1UL, - 0x18b74777UL, 0x88085ae6UL, 0xff0f6a70UL, 0x66063bcaUL, 0x11010b5cUL, - 0x8f659effUL, 0xf862ae69UL, 0x616bffd3UL, 0x166ccf45UL, 0xa00ae278UL, - 0xd70dd2eeUL, 0x4e048354UL, 0x3903b3c2UL, 0xa7672661UL, 0xd06016f7UL, - 0x4969474dUL, 0x3e6e77dbUL, 0xaed16a4aUL, 0xd9d65adcUL, 0x40df0b66UL, - 0x37d83bf0UL, 0xa9bcae53UL, 0xdebb9ec5UL, 0x47b2cf7fUL, 0x30b5ffe9UL, - 0xbdbdf21cUL, 0xcabac28aUL, 0x53b39330UL, 0x24b4a3a6UL, 0xbad03605UL, - 0xcdd70693UL, 0x54de5729UL, 0x23d967bfUL, 0xb3667a2eUL, 0xc4614ab8UL, - 0x5d681b02UL, 0x2a6f2b94UL, 0xb40bbe37UL, 0xc30c8ea1UL, 0x5a05df1bUL, - 0x2d02ef8dUL -#ifdef BYFOUR - }, - { - 0x00000000UL, 0x191b3141UL, 0x32366282UL, 0x2b2d53c3UL, 0x646cc504UL, - 0x7d77f445UL, 0x565aa786UL, 0x4f4196c7UL, 0xc8d98a08UL, 0xd1c2bb49UL, - 0xfaefe88aUL, 0xe3f4d9cbUL, 0xacb54f0cUL, 0xb5ae7e4dUL, 0x9e832d8eUL, - 0x87981ccfUL, 0x4ac21251UL, 0x53d92310UL, 0x78f470d3UL, 0x61ef4192UL, - 0x2eaed755UL, 0x37b5e614UL, 0x1c98b5d7UL, 0x05838496UL, 0x821b9859UL, - 0x9b00a918UL, 0xb02dfadbUL, 0xa936cb9aUL, 0xe6775d5dUL, 0xff6c6c1cUL, - 0xd4413fdfUL, 0xcd5a0e9eUL, 0x958424a2UL, 0x8c9f15e3UL, 0xa7b24620UL, - 0xbea97761UL, 0xf1e8e1a6UL, 0xe8f3d0e7UL, 0xc3de8324UL, 0xdac5b265UL, - 0x5d5daeaaUL, 0x44469febUL, 0x6f6bcc28UL, 0x7670fd69UL, 0x39316baeUL, - 0x202a5aefUL, 0x0b07092cUL, 0x121c386dUL, 0xdf4636f3UL, 0xc65d07b2UL, - 0xed705471UL, 0xf46b6530UL, 0xbb2af3f7UL, 0xa231c2b6UL, 0x891c9175UL, - 0x9007a034UL, 0x179fbcfbUL, 0x0e848dbaUL, 0x25a9de79UL, 0x3cb2ef38UL, - 0x73f379ffUL, 0x6ae848beUL, 0x41c51b7dUL, 0x58de2a3cUL, 0xf0794f05UL, - 0xe9627e44UL, 0xc24f2d87UL, 0xdb541cc6UL, 0x94158a01UL, 0x8d0ebb40UL, - 0xa623e883UL, 0xbf38d9c2UL, 0x38a0c50dUL, 0x21bbf44cUL, 0x0a96a78fUL, - 0x138d96ceUL, 0x5ccc0009UL, 0x45d73148UL, 0x6efa628bUL, 0x77e153caUL, - 0xbabb5d54UL, 0xa3a06c15UL, 0x888d3fd6UL, 0x91960e97UL, 0xded79850UL, - 0xc7cca911UL, 0xece1fad2UL, 0xf5facb93UL, 0x7262d75cUL, 0x6b79e61dUL, - 0x4054b5deUL, 0x594f849fUL, 0x160e1258UL, 0x0f152319UL, 0x243870daUL, - 0x3d23419bUL, 0x65fd6ba7UL, 0x7ce65ae6UL, 0x57cb0925UL, 0x4ed03864UL, - 0x0191aea3UL, 0x188a9fe2UL, 0x33a7cc21UL, 0x2abcfd60UL, 0xad24e1afUL, - 0xb43fd0eeUL, 0x9f12832dUL, 0x8609b26cUL, 0xc94824abUL, 0xd05315eaUL, - 0xfb7e4629UL, 0xe2657768UL, 0x2f3f79f6UL, 0x362448b7UL, 0x1d091b74UL, - 0x04122a35UL, 0x4b53bcf2UL, 0x52488db3UL, 0x7965de70UL, 0x607eef31UL, - 0xe7e6f3feUL, 0xfefdc2bfUL, 0xd5d0917cUL, 0xcccba03dUL, 0x838a36faUL, - 0x9a9107bbUL, 0xb1bc5478UL, 0xa8a76539UL, 0x3b83984bUL, 0x2298a90aUL, - 0x09b5fac9UL, 0x10aecb88UL, 0x5fef5d4fUL, 0x46f46c0eUL, 0x6dd93fcdUL, - 0x74c20e8cUL, 0xf35a1243UL, 0xea412302UL, 0xc16c70c1UL, 0xd8774180UL, - 0x9736d747UL, 0x8e2de606UL, 0xa500b5c5UL, 0xbc1b8484UL, 0x71418a1aUL, - 0x685abb5bUL, 0x4377e898UL, 0x5a6cd9d9UL, 0x152d4f1eUL, 0x0c367e5fUL, - 0x271b2d9cUL, 0x3e001cddUL, 0xb9980012UL, 0xa0833153UL, 0x8bae6290UL, - 0x92b553d1UL, 0xddf4c516UL, 0xc4eff457UL, 0xefc2a794UL, 0xf6d996d5UL, - 0xae07bce9UL, 0xb71c8da8UL, 0x9c31de6bUL, 0x852aef2aUL, 0xca6b79edUL, - 0xd37048acUL, 0xf85d1b6fUL, 0xe1462a2eUL, 0x66de36e1UL, 0x7fc507a0UL, - 0x54e85463UL, 0x4df36522UL, 0x02b2f3e5UL, 0x1ba9c2a4UL, 0x30849167UL, - 0x299fa026UL, 0xe4c5aeb8UL, 0xfdde9ff9UL, 0xd6f3cc3aUL, 0xcfe8fd7bUL, - 0x80a96bbcUL, 0x99b25afdUL, 0xb29f093eUL, 0xab84387fUL, 0x2c1c24b0UL, - 0x350715f1UL, 0x1e2a4632UL, 0x07317773UL, 0x4870e1b4UL, 0x516bd0f5UL, - 0x7a468336UL, 0x635db277UL, 0xcbfad74eUL, 0xd2e1e60fUL, 0xf9ccb5ccUL, - 0xe0d7848dUL, 0xaf96124aUL, 0xb68d230bUL, 0x9da070c8UL, 0x84bb4189UL, - 0x03235d46UL, 0x1a386c07UL, 0x31153fc4UL, 0x280e0e85UL, 0x674f9842UL, - 0x7e54a903UL, 0x5579fac0UL, 0x4c62cb81UL, 0x8138c51fUL, 0x9823f45eUL, - 0xb30ea79dUL, 0xaa1596dcUL, 0xe554001bUL, 0xfc4f315aUL, 0xd7626299UL, - 0xce7953d8UL, 0x49e14f17UL, 0x50fa7e56UL, 0x7bd72d95UL, 0x62cc1cd4UL, - 0x2d8d8a13UL, 0x3496bb52UL, 0x1fbbe891UL, 0x06a0d9d0UL, 0x5e7ef3ecUL, - 0x4765c2adUL, 0x6c48916eUL, 0x7553a02fUL, 0x3a1236e8UL, 0x230907a9UL, - 0x0824546aUL, 0x113f652bUL, 0x96a779e4UL, 0x8fbc48a5UL, 0xa4911b66UL, - 0xbd8a2a27UL, 0xf2cbbce0UL, 0xebd08da1UL, 0xc0fdde62UL, 0xd9e6ef23UL, - 0x14bce1bdUL, 0x0da7d0fcUL, 0x268a833fUL, 0x3f91b27eUL, 0x70d024b9UL, - 0x69cb15f8UL, 0x42e6463bUL, 0x5bfd777aUL, 0xdc656bb5UL, 0xc57e5af4UL, - 0xee530937UL, 0xf7483876UL, 0xb809aeb1UL, 0xa1129ff0UL, 0x8a3fcc33UL, - 0x9324fd72UL - }, - { - 0x00000000UL, 0x01c26a37UL, 0x0384d46eUL, 0x0246be59UL, 0x0709a8dcUL, - 0x06cbc2ebUL, 0x048d7cb2UL, 0x054f1685UL, 0x0e1351b8UL, 0x0fd13b8fUL, - 0x0d9785d6UL, 0x0c55efe1UL, 0x091af964UL, 0x08d89353UL, 0x0a9e2d0aUL, - 0x0b5c473dUL, 0x1c26a370UL, 0x1de4c947UL, 0x1fa2771eUL, 0x1e601d29UL, - 0x1b2f0bacUL, 0x1aed619bUL, 0x18abdfc2UL, 0x1969b5f5UL, 0x1235f2c8UL, - 0x13f798ffUL, 0x11b126a6UL, 0x10734c91UL, 0x153c5a14UL, 0x14fe3023UL, - 0x16b88e7aUL, 0x177ae44dUL, 0x384d46e0UL, 0x398f2cd7UL, 0x3bc9928eUL, - 0x3a0bf8b9UL, 0x3f44ee3cUL, 0x3e86840bUL, 0x3cc03a52UL, 0x3d025065UL, - 0x365e1758UL, 0x379c7d6fUL, 0x35dac336UL, 0x3418a901UL, 0x3157bf84UL, - 0x3095d5b3UL, 0x32d36beaUL, 0x331101ddUL, 0x246be590UL, 0x25a98fa7UL, - 0x27ef31feUL, 0x262d5bc9UL, 0x23624d4cUL, 0x22a0277bUL, 0x20e69922UL, - 0x2124f315UL, 0x2a78b428UL, 0x2bbade1fUL, 0x29fc6046UL, 0x283e0a71UL, - 0x2d711cf4UL, 0x2cb376c3UL, 0x2ef5c89aUL, 0x2f37a2adUL, 0x709a8dc0UL, - 0x7158e7f7UL, 0x731e59aeUL, 0x72dc3399UL, 0x7793251cUL, 0x76514f2bUL, - 0x7417f172UL, 0x75d59b45UL, 0x7e89dc78UL, 0x7f4bb64fUL, 0x7d0d0816UL, - 0x7ccf6221UL, 0x798074a4UL, 0x78421e93UL, 0x7a04a0caUL, 0x7bc6cafdUL, - 0x6cbc2eb0UL, 0x6d7e4487UL, 0x6f38fadeUL, 0x6efa90e9UL, 0x6bb5866cUL, - 0x6a77ec5bUL, 0x68315202UL, 0x69f33835UL, 0x62af7f08UL, 0x636d153fUL, - 0x612bab66UL, 0x60e9c151UL, 0x65a6d7d4UL, 0x6464bde3UL, 0x662203baUL, - 0x67e0698dUL, 0x48d7cb20UL, 0x4915a117UL, 0x4b531f4eUL, 0x4a917579UL, - 0x4fde63fcUL, 0x4e1c09cbUL, 0x4c5ab792UL, 0x4d98dda5UL, 0x46c49a98UL, - 0x4706f0afUL, 0x45404ef6UL, 0x448224c1UL, 0x41cd3244UL, 0x400f5873UL, - 0x4249e62aUL, 0x438b8c1dUL, 0x54f16850UL, 0x55330267UL, 0x5775bc3eUL, - 0x56b7d609UL, 0x53f8c08cUL, 0x523aaabbUL, 0x507c14e2UL, 0x51be7ed5UL, - 0x5ae239e8UL, 0x5b2053dfUL, 0x5966ed86UL, 0x58a487b1UL, 0x5deb9134UL, - 0x5c29fb03UL, 0x5e6f455aUL, 0x5fad2f6dUL, 0xe1351b80UL, 0xe0f771b7UL, - 0xe2b1cfeeUL, 0xe373a5d9UL, 0xe63cb35cUL, 0xe7fed96bUL, 0xe5b86732UL, - 0xe47a0d05UL, 0xef264a38UL, 0xeee4200fUL, 0xeca29e56UL, 0xed60f461UL, - 0xe82fe2e4UL, 0xe9ed88d3UL, 0xebab368aUL, 0xea695cbdUL, 0xfd13b8f0UL, - 0xfcd1d2c7UL, 0xfe976c9eUL, 0xff5506a9UL, 0xfa1a102cUL, 0xfbd87a1bUL, - 0xf99ec442UL, 0xf85cae75UL, 0xf300e948UL, 0xf2c2837fUL, 0xf0843d26UL, - 0xf1465711UL, 0xf4094194UL, 0xf5cb2ba3UL, 0xf78d95faUL, 0xf64fffcdUL, - 0xd9785d60UL, 0xd8ba3757UL, 0xdafc890eUL, 0xdb3ee339UL, 0xde71f5bcUL, - 0xdfb39f8bUL, 0xddf521d2UL, 0xdc374be5UL, 0xd76b0cd8UL, 0xd6a966efUL, - 0xd4efd8b6UL, 0xd52db281UL, 0xd062a404UL, 0xd1a0ce33UL, 0xd3e6706aUL, - 0xd2241a5dUL, 0xc55efe10UL, 0xc49c9427UL, 0xc6da2a7eUL, 0xc7184049UL, - 0xc25756ccUL, 0xc3953cfbUL, 0xc1d382a2UL, 0xc011e895UL, 0xcb4dafa8UL, - 0xca8fc59fUL, 0xc8c97bc6UL, 0xc90b11f1UL, 0xcc440774UL, 0xcd866d43UL, - 0xcfc0d31aUL, 0xce02b92dUL, 0x91af9640UL, 0x906dfc77UL, 0x922b422eUL, - 0x93e92819UL, 0x96a63e9cUL, 0x976454abUL, 0x9522eaf2UL, 0x94e080c5UL, - 0x9fbcc7f8UL, 0x9e7eadcfUL, 0x9c381396UL, 0x9dfa79a1UL, 0x98b56f24UL, - 0x99770513UL, 0x9b31bb4aUL, 0x9af3d17dUL, 0x8d893530UL, 0x8c4b5f07UL, - 0x8e0de15eUL, 0x8fcf8b69UL, 0x8a809decUL, 0x8b42f7dbUL, 0x89044982UL, - 0x88c623b5UL, 0x839a6488UL, 0x82580ebfUL, 0x801eb0e6UL, 0x81dcdad1UL, - 0x8493cc54UL, 0x8551a663UL, 0x8717183aUL, 0x86d5720dUL, 0xa9e2d0a0UL, - 0xa820ba97UL, 0xaa6604ceUL, 0xaba46ef9UL, 0xaeeb787cUL, 0xaf29124bUL, - 0xad6fac12UL, 0xacadc625UL, 0xa7f18118UL, 0xa633eb2fUL, 0xa4755576UL, - 0xa5b73f41UL, 0xa0f829c4UL, 0xa13a43f3UL, 0xa37cfdaaUL, 0xa2be979dUL, - 0xb5c473d0UL, 0xb40619e7UL, 0xb640a7beUL, 0xb782cd89UL, 0xb2cddb0cUL, - 0xb30fb13bUL, 0xb1490f62UL, 0xb08b6555UL, 0xbbd72268UL, 0xba15485fUL, - 0xb853f606UL, 0xb9919c31UL, 0xbcde8ab4UL, 0xbd1ce083UL, 0xbf5a5edaUL, - 0xbe9834edUL - }, - { - 0x00000000UL, 0xb8bc6765UL, 0xaa09c88bUL, 0x12b5afeeUL, 0x8f629757UL, - 0x37def032UL, 0x256b5fdcUL, 0x9dd738b9UL, 0xc5b428efUL, 0x7d084f8aUL, - 0x6fbde064UL, 0xd7018701UL, 0x4ad6bfb8UL, 0xf26ad8ddUL, 0xe0df7733UL, - 0x58631056UL, 0x5019579fUL, 0xe8a530faUL, 0xfa109f14UL, 0x42acf871UL, - 0xdf7bc0c8UL, 0x67c7a7adUL, 0x75720843UL, 0xcdce6f26UL, 0x95ad7f70UL, - 0x2d111815UL, 0x3fa4b7fbUL, 0x8718d09eUL, 0x1acfe827UL, 0xa2738f42UL, - 0xb0c620acUL, 0x087a47c9UL, 0xa032af3eUL, 0x188ec85bUL, 0x0a3b67b5UL, - 0xb28700d0UL, 0x2f503869UL, 0x97ec5f0cUL, 0x8559f0e2UL, 0x3de59787UL, - 0x658687d1UL, 0xdd3ae0b4UL, 0xcf8f4f5aUL, 0x7733283fUL, 0xeae41086UL, - 0x525877e3UL, 0x40edd80dUL, 0xf851bf68UL, 0xf02bf8a1UL, 0x48979fc4UL, - 0x5a22302aUL, 0xe29e574fUL, 0x7f496ff6UL, 0xc7f50893UL, 0xd540a77dUL, - 0x6dfcc018UL, 0x359fd04eUL, 0x8d23b72bUL, 0x9f9618c5UL, 0x272a7fa0UL, - 0xbafd4719UL, 0x0241207cUL, 0x10f48f92UL, 0xa848e8f7UL, 0x9b14583dUL, - 0x23a83f58UL, 0x311d90b6UL, 0x89a1f7d3UL, 0x1476cf6aUL, 0xaccaa80fUL, - 0xbe7f07e1UL, 0x06c36084UL, 0x5ea070d2UL, 0xe61c17b7UL, 0xf4a9b859UL, - 0x4c15df3cUL, 0xd1c2e785UL, 0x697e80e0UL, 0x7bcb2f0eUL, 0xc377486bUL, - 0xcb0d0fa2UL, 0x73b168c7UL, 0x6104c729UL, 0xd9b8a04cUL, 0x446f98f5UL, - 0xfcd3ff90UL, 0xee66507eUL, 0x56da371bUL, 0x0eb9274dUL, 0xb6054028UL, - 0xa4b0efc6UL, 0x1c0c88a3UL, 0x81dbb01aUL, 0x3967d77fUL, 0x2bd27891UL, - 0x936e1ff4UL, 0x3b26f703UL, 0x839a9066UL, 0x912f3f88UL, 0x299358edUL, - 0xb4446054UL, 0x0cf80731UL, 0x1e4da8dfUL, 0xa6f1cfbaUL, 0xfe92dfecUL, - 0x462eb889UL, 0x549b1767UL, 0xec277002UL, 0x71f048bbUL, 0xc94c2fdeUL, - 0xdbf98030UL, 0x6345e755UL, 0x6b3fa09cUL, 0xd383c7f9UL, 0xc1366817UL, - 0x798a0f72UL, 0xe45d37cbUL, 0x5ce150aeUL, 0x4e54ff40UL, 0xf6e89825UL, - 0xae8b8873UL, 0x1637ef16UL, 0x048240f8UL, 0xbc3e279dUL, 0x21e91f24UL, - 0x99557841UL, 0x8be0d7afUL, 0x335cb0caUL, 0xed59b63bUL, 0x55e5d15eUL, - 0x47507eb0UL, 0xffec19d5UL, 0x623b216cUL, 0xda874609UL, 0xc832e9e7UL, - 0x708e8e82UL, 0x28ed9ed4UL, 0x9051f9b1UL, 0x82e4565fUL, 0x3a58313aUL, - 0xa78f0983UL, 0x1f336ee6UL, 0x0d86c108UL, 0xb53aa66dUL, 0xbd40e1a4UL, - 0x05fc86c1UL, 0x1749292fUL, 0xaff54e4aUL, 0x322276f3UL, 0x8a9e1196UL, - 0x982bbe78UL, 0x2097d91dUL, 0x78f4c94bUL, 0xc048ae2eUL, 0xd2fd01c0UL, - 0x6a4166a5UL, 0xf7965e1cUL, 0x4f2a3979UL, 0x5d9f9697UL, 0xe523f1f2UL, - 0x4d6b1905UL, 0xf5d77e60UL, 0xe762d18eUL, 0x5fdeb6ebUL, 0xc2098e52UL, - 0x7ab5e937UL, 0x680046d9UL, 0xd0bc21bcUL, 0x88df31eaUL, 0x3063568fUL, - 0x22d6f961UL, 0x9a6a9e04UL, 0x07bda6bdUL, 0xbf01c1d8UL, 0xadb46e36UL, - 0x15080953UL, 0x1d724e9aUL, 0xa5ce29ffUL, 0xb77b8611UL, 0x0fc7e174UL, - 0x9210d9cdUL, 0x2aacbea8UL, 0x38191146UL, 0x80a57623UL, 0xd8c66675UL, - 0x607a0110UL, 0x72cfaefeUL, 0xca73c99bUL, 0x57a4f122UL, 0xef189647UL, - 0xfdad39a9UL, 0x45115eccUL, 0x764dee06UL, 0xcef18963UL, 0xdc44268dUL, - 0x64f841e8UL, 0xf92f7951UL, 0x41931e34UL, 0x5326b1daUL, 0xeb9ad6bfUL, - 0xb3f9c6e9UL, 0x0b45a18cUL, 0x19f00e62UL, 0xa14c6907UL, 0x3c9b51beUL, - 0x842736dbUL, 0x96929935UL, 0x2e2efe50UL, 0x2654b999UL, 0x9ee8defcUL, - 0x8c5d7112UL, 0x34e11677UL, 0xa9362eceUL, 0x118a49abUL, 0x033fe645UL, - 0xbb838120UL, 0xe3e09176UL, 0x5b5cf613UL, 0x49e959fdUL, 0xf1553e98UL, - 0x6c820621UL, 0xd43e6144UL, 0xc68bceaaUL, 0x7e37a9cfUL, 0xd67f4138UL, - 0x6ec3265dUL, 0x7c7689b3UL, 0xc4caeed6UL, 0x591dd66fUL, 0xe1a1b10aUL, - 0xf3141ee4UL, 0x4ba87981UL, 0x13cb69d7UL, 0xab770eb2UL, 0xb9c2a15cUL, - 0x017ec639UL, 0x9ca9fe80UL, 0x241599e5UL, 0x36a0360bUL, 0x8e1c516eUL, - 0x866616a7UL, 0x3eda71c2UL, 0x2c6fde2cUL, 0x94d3b949UL, 0x090481f0UL, - 0xb1b8e695UL, 0xa30d497bUL, 0x1bb12e1eUL, 0x43d23e48UL, 0xfb6e592dUL, - 0xe9dbf6c3UL, 0x516791a6UL, 0xccb0a91fUL, 0x740cce7aUL, 0x66b96194UL, - 0xde0506f1UL - }, - { - 0x00000000UL, 0x96300777UL, 0x2c610eeeUL, 0xba510999UL, 0x19c46d07UL, - 0x8ff46a70UL, 0x35a563e9UL, 0xa395649eUL, 0x3288db0eUL, 0xa4b8dc79UL, - 0x1ee9d5e0UL, 0x88d9d297UL, 0x2b4cb609UL, 0xbd7cb17eUL, 0x072db8e7UL, - 0x911dbf90UL, 0x6410b71dUL, 0xf220b06aUL, 0x4871b9f3UL, 0xde41be84UL, - 0x7dd4da1aUL, 0xebe4dd6dUL, 0x51b5d4f4UL, 0xc785d383UL, 0x56986c13UL, - 0xc0a86b64UL, 0x7af962fdUL, 0xecc9658aUL, 0x4f5c0114UL, 0xd96c0663UL, - 0x633d0ffaUL, 0xf50d088dUL, 0xc8206e3bUL, 0x5e10694cUL, 0xe44160d5UL, - 0x727167a2UL, 0xd1e4033cUL, 0x47d4044bUL, 0xfd850dd2UL, 0x6bb50aa5UL, - 0xfaa8b535UL, 0x6c98b242UL, 0xd6c9bbdbUL, 0x40f9bcacUL, 0xe36cd832UL, - 0x755cdf45UL, 0xcf0dd6dcUL, 0x593dd1abUL, 0xac30d926UL, 0x3a00de51UL, - 0x8051d7c8UL, 0x1661d0bfUL, 0xb5f4b421UL, 0x23c4b356UL, 0x9995bacfUL, - 0x0fa5bdb8UL, 0x9eb80228UL, 0x0888055fUL, 0xb2d90cc6UL, 0x24e90bb1UL, - 0x877c6f2fUL, 0x114c6858UL, 0xab1d61c1UL, 0x3d2d66b6UL, 0x9041dc76UL, - 0x0671db01UL, 0xbc20d298UL, 0x2a10d5efUL, 0x8985b171UL, 0x1fb5b606UL, - 0xa5e4bf9fUL, 0x33d4b8e8UL, 0xa2c90778UL, 0x34f9000fUL, 0x8ea80996UL, - 0x18980ee1UL, 0xbb0d6a7fUL, 0x2d3d6d08UL, 0x976c6491UL, 0x015c63e6UL, - 0xf4516b6bUL, 0x62616c1cUL, 0xd8306585UL, 0x4e0062f2UL, 0xed95066cUL, - 0x7ba5011bUL, 0xc1f40882UL, 0x57c40ff5UL, 0xc6d9b065UL, 0x50e9b712UL, - 0xeab8be8bUL, 0x7c88b9fcUL, 0xdf1ddd62UL, 0x492dda15UL, 0xf37cd38cUL, - 0x654cd4fbUL, 0x5861b24dUL, 0xce51b53aUL, 0x7400bca3UL, 0xe230bbd4UL, - 0x41a5df4aUL, 0xd795d83dUL, 0x6dc4d1a4UL, 0xfbf4d6d3UL, 0x6ae96943UL, - 0xfcd96e34UL, 0x468867adUL, 0xd0b860daUL, 0x732d0444UL, 0xe51d0333UL, - 0x5f4c0aaaUL, 0xc97c0dddUL, 0x3c710550UL, 0xaa410227UL, 0x10100bbeUL, - 0x86200cc9UL, 0x25b56857UL, 0xb3856f20UL, 0x09d466b9UL, 0x9fe461ceUL, - 0x0ef9de5eUL, 0x98c9d929UL, 0x2298d0b0UL, 0xb4a8d7c7UL, 0x173db359UL, - 0x810db42eUL, 0x3b5cbdb7UL, 0xad6cbac0UL, 0x2083b8edUL, 0xb6b3bf9aUL, - 0x0ce2b603UL, 0x9ad2b174UL, 0x3947d5eaUL, 0xaf77d29dUL, 0x1526db04UL, - 0x8316dc73UL, 0x120b63e3UL, 0x843b6494UL, 0x3e6a6d0dUL, 0xa85a6a7aUL, - 0x0bcf0ee4UL, 0x9dff0993UL, 0x27ae000aUL, 0xb19e077dUL, 0x44930ff0UL, - 0xd2a30887UL, 0x68f2011eUL, 0xfec20669UL, 0x5d5762f7UL, 0xcb676580UL, - 0x71366c19UL, 0xe7066b6eUL, 0x761bd4feUL, 0xe02bd389UL, 0x5a7ada10UL, - 0xcc4add67UL, 0x6fdfb9f9UL, 0xf9efbe8eUL, 0x43beb717UL, 0xd58eb060UL, - 0xe8a3d6d6UL, 0x7e93d1a1UL, 0xc4c2d838UL, 0x52f2df4fUL, 0xf167bbd1UL, - 0x6757bca6UL, 0xdd06b53fUL, 0x4b36b248UL, 0xda2b0dd8UL, 0x4c1b0aafUL, - 0xf64a0336UL, 0x607a0441UL, 0xc3ef60dfUL, 0x55df67a8UL, 0xef8e6e31UL, - 0x79be6946UL, 0x8cb361cbUL, 0x1a8366bcUL, 0xa0d26f25UL, 0x36e26852UL, - 0x95770cccUL, 0x03470bbbUL, 0xb9160222UL, 0x2f260555UL, 0xbe3bbac5UL, - 0x280bbdb2UL, 0x925ab42bUL, 0x046ab35cUL, 0xa7ffd7c2UL, 0x31cfd0b5UL, - 0x8b9ed92cUL, 0x1daede5bUL, 0xb0c2649bUL, 0x26f263ecUL, 0x9ca36a75UL, - 0x0a936d02UL, 0xa906099cUL, 0x3f360eebUL, 0x85670772UL, 0x13570005UL, - 0x824abf95UL, 0x147ab8e2UL, 0xae2bb17bUL, 0x381bb60cUL, 0x9b8ed292UL, - 0x0dbed5e5UL, 0xb7efdc7cUL, 0x21dfdb0bUL, 0xd4d2d386UL, 0x42e2d4f1UL, - 0xf8b3dd68UL, 0x6e83da1fUL, 0xcd16be81UL, 0x5b26b9f6UL, 0xe177b06fUL, - 0x7747b718UL, 0xe65a0888UL, 0x706a0fffUL, 0xca3b0666UL, 0x5c0b0111UL, - 0xff9e658fUL, 0x69ae62f8UL, 0xd3ff6b61UL, 0x45cf6c16UL, 0x78e20aa0UL, - 0xeed20dd7UL, 0x5483044eUL, 0xc2b30339UL, 0x612667a7UL, 0xf71660d0UL, - 0x4d476949UL, 0xdb776e3eUL, 0x4a6ad1aeUL, 0xdc5ad6d9UL, 0x660bdf40UL, - 0xf03bd837UL, 0x53aebca9UL, 0xc59ebbdeUL, 0x7fcfb247UL, 0xe9ffb530UL, - 0x1cf2bdbdUL, 0x8ac2bacaUL, 0x3093b353UL, 0xa6a3b424UL, 0x0536d0baUL, - 0x9306d7cdUL, 0x2957de54UL, 0xbf67d923UL, 0x2e7a66b3UL, 0xb84a61c4UL, - 0x021b685dUL, 0x942b6f2aUL, 0x37be0bb4UL, 0xa18e0cc3UL, 0x1bdf055aUL, - 0x8def022dUL - }, - { - 0x00000000UL, 0x41311b19UL, 0x82623632UL, 0xc3532d2bUL, 0x04c56c64UL, - 0x45f4777dUL, 0x86a75a56UL, 0xc796414fUL, 0x088ad9c8UL, 0x49bbc2d1UL, - 0x8ae8effaUL, 0xcbd9f4e3UL, 0x0c4fb5acUL, 0x4d7eaeb5UL, 0x8e2d839eUL, - 0xcf1c9887UL, 0x5112c24aUL, 0x1023d953UL, 0xd370f478UL, 0x9241ef61UL, - 0x55d7ae2eUL, 0x14e6b537UL, 0xd7b5981cUL, 0x96848305UL, 0x59981b82UL, - 0x18a9009bUL, 0xdbfa2db0UL, 0x9acb36a9UL, 0x5d5d77e6UL, 0x1c6c6cffUL, - 0xdf3f41d4UL, 0x9e0e5acdUL, 0xa2248495UL, 0xe3159f8cUL, 0x2046b2a7UL, - 0x6177a9beUL, 0xa6e1e8f1UL, 0xe7d0f3e8UL, 0x2483dec3UL, 0x65b2c5daUL, - 0xaaae5d5dUL, 0xeb9f4644UL, 0x28cc6b6fUL, 0x69fd7076UL, 0xae6b3139UL, - 0xef5a2a20UL, 0x2c09070bUL, 0x6d381c12UL, 0xf33646dfUL, 0xb2075dc6UL, - 0x715470edUL, 0x30656bf4UL, 0xf7f32abbUL, 0xb6c231a2UL, 0x75911c89UL, - 0x34a00790UL, 0xfbbc9f17UL, 0xba8d840eUL, 0x79dea925UL, 0x38efb23cUL, - 0xff79f373UL, 0xbe48e86aUL, 0x7d1bc541UL, 0x3c2ade58UL, 0x054f79f0UL, - 0x447e62e9UL, 0x872d4fc2UL, 0xc61c54dbUL, 0x018a1594UL, 0x40bb0e8dUL, - 0x83e823a6UL, 0xc2d938bfUL, 0x0dc5a038UL, 0x4cf4bb21UL, 0x8fa7960aUL, - 0xce968d13UL, 0x0900cc5cUL, 0x4831d745UL, 0x8b62fa6eUL, 0xca53e177UL, - 0x545dbbbaUL, 0x156ca0a3UL, 0xd63f8d88UL, 0x970e9691UL, 0x5098d7deUL, - 0x11a9ccc7UL, 0xd2fae1ecUL, 0x93cbfaf5UL, 0x5cd76272UL, 0x1de6796bUL, - 0xdeb55440UL, 0x9f844f59UL, 0x58120e16UL, 0x1923150fUL, 0xda703824UL, - 0x9b41233dUL, 0xa76bfd65UL, 0xe65ae67cUL, 0x2509cb57UL, 0x6438d04eUL, - 0xa3ae9101UL, 0xe29f8a18UL, 0x21cca733UL, 0x60fdbc2aUL, 0xafe124adUL, - 0xeed03fb4UL, 0x2d83129fUL, 0x6cb20986UL, 0xab2448c9UL, 0xea1553d0UL, - 0x29467efbUL, 0x687765e2UL, 0xf6793f2fUL, 0xb7482436UL, 0x741b091dUL, - 0x352a1204UL, 0xf2bc534bUL, 0xb38d4852UL, 0x70de6579UL, 0x31ef7e60UL, - 0xfef3e6e7UL, 0xbfc2fdfeUL, 0x7c91d0d5UL, 0x3da0cbccUL, 0xfa368a83UL, - 0xbb07919aUL, 0x7854bcb1UL, 0x3965a7a8UL, 0x4b98833bUL, 0x0aa99822UL, - 0xc9fab509UL, 0x88cbae10UL, 0x4f5def5fUL, 0x0e6cf446UL, 0xcd3fd96dUL, - 0x8c0ec274UL, 0x43125af3UL, 0x022341eaUL, 0xc1706cc1UL, 0x804177d8UL, - 0x47d73697UL, 0x06e62d8eUL, 0xc5b500a5UL, 0x84841bbcUL, 0x1a8a4171UL, - 0x5bbb5a68UL, 0x98e87743UL, 0xd9d96c5aUL, 0x1e4f2d15UL, 0x5f7e360cUL, - 0x9c2d1b27UL, 0xdd1c003eUL, 0x120098b9UL, 0x533183a0UL, 0x9062ae8bUL, - 0xd153b592UL, 0x16c5f4ddUL, 0x57f4efc4UL, 0x94a7c2efUL, 0xd596d9f6UL, - 0xe9bc07aeUL, 0xa88d1cb7UL, 0x6bde319cUL, 0x2aef2a85UL, 0xed796bcaUL, - 0xac4870d3UL, 0x6f1b5df8UL, 0x2e2a46e1UL, 0xe136de66UL, 0xa007c57fUL, - 0x6354e854UL, 0x2265f34dUL, 0xe5f3b202UL, 0xa4c2a91bUL, 0x67918430UL, - 0x26a09f29UL, 0xb8aec5e4UL, 0xf99fdefdUL, 0x3accf3d6UL, 0x7bfde8cfUL, - 0xbc6ba980UL, 0xfd5ab299UL, 0x3e099fb2UL, 0x7f3884abUL, 0xb0241c2cUL, - 0xf1150735UL, 0x32462a1eUL, 0x73773107UL, 0xb4e17048UL, 0xf5d06b51UL, - 0x3683467aUL, 0x77b25d63UL, 0x4ed7facbUL, 0x0fe6e1d2UL, 0xccb5ccf9UL, - 0x8d84d7e0UL, 0x4a1296afUL, 0x0b238db6UL, 0xc870a09dUL, 0x8941bb84UL, - 0x465d2303UL, 0x076c381aUL, 0xc43f1531UL, 0x850e0e28UL, 0x42984f67UL, - 0x03a9547eUL, 0xc0fa7955UL, 0x81cb624cUL, 0x1fc53881UL, 0x5ef42398UL, - 0x9da70eb3UL, 0xdc9615aaUL, 0x1b0054e5UL, 0x5a314ffcUL, 0x996262d7UL, - 0xd85379ceUL, 0x174fe149UL, 0x567efa50UL, 0x952dd77bUL, 0xd41ccc62UL, - 0x138a8d2dUL, 0x52bb9634UL, 0x91e8bb1fUL, 0xd0d9a006UL, 0xecf37e5eUL, - 0xadc26547UL, 0x6e91486cUL, 0x2fa05375UL, 0xe836123aUL, 0xa9070923UL, - 0x6a542408UL, 0x2b653f11UL, 0xe479a796UL, 0xa548bc8fUL, 0x661b91a4UL, - 0x272a8abdUL, 0xe0bccbf2UL, 0xa18dd0ebUL, 0x62defdc0UL, 0x23efe6d9UL, - 0xbde1bc14UL, 0xfcd0a70dUL, 0x3f838a26UL, 0x7eb2913fUL, 0xb924d070UL, - 0xf815cb69UL, 0x3b46e642UL, 0x7a77fd5bUL, 0xb56b65dcUL, 0xf45a7ec5UL, - 0x370953eeUL, 0x763848f7UL, 0xb1ae09b8UL, 0xf09f12a1UL, 0x33cc3f8aUL, - 0x72fd2493UL - }, - { - 0x00000000UL, 0x376ac201UL, 0x6ed48403UL, 0x59be4602UL, 0xdca80907UL, - 0xebc2cb06UL, 0xb27c8d04UL, 0x85164f05UL, 0xb851130eUL, 0x8f3bd10fUL, - 0xd685970dUL, 0xe1ef550cUL, 0x64f91a09UL, 0x5393d808UL, 0x0a2d9e0aUL, - 0x3d475c0bUL, 0x70a3261cUL, 0x47c9e41dUL, 0x1e77a21fUL, 0x291d601eUL, - 0xac0b2f1bUL, 0x9b61ed1aUL, 0xc2dfab18UL, 0xf5b56919UL, 0xc8f23512UL, - 0xff98f713UL, 0xa626b111UL, 0x914c7310UL, 0x145a3c15UL, 0x2330fe14UL, - 0x7a8eb816UL, 0x4de47a17UL, 0xe0464d38UL, 0xd72c8f39UL, 0x8e92c93bUL, - 0xb9f80b3aUL, 0x3cee443fUL, 0x0b84863eUL, 0x523ac03cUL, 0x6550023dUL, - 0x58175e36UL, 0x6f7d9c37UL, 0x36c3da35UL, 0x01a91834UL, 0x84bf5731UL, - 0xb3d59530UL, 0xea6bd332UL, 0xdd011133UL, 0x90e56b24UL, 0xa78fa925UL, - 0xfe31ef27UL, 0xc95b2d26UL, 0x4c4d6223UL, 0x7b27a022UL, 0x2299e620UL, - 0x15f32421UL, 0x28b4782aUL, 0x1fdeba2bUL, 0x4660fc29UL, 0x710a3e28UL, - 0xf41c712dUL, 0xc376b32cUL, 0x9ac8f52eUL, 0xada2372fUL, 0xc08d9a70UL, - 0xf7e75871UL, 0xae591e73UL, 0x9933dc72UL, 0x1c259377UL, 0x2b4f5176UL, - 0x72f11774UL, 0x459bd575UL, 0x78dc897eUL, 0x4fb64b7fUL, 0x16080d7dUL, - 0x2162cf7cUL, 0xa4748079UL, 0x931e4278UL, 0xcaa0047aUL, 0xfdcac67bUL, - 0xb02ebc6cUL, 0x87447e6dUL, 0xdefa386fUL, 0xe990fa6eUL, 0x6c86b56bUL, - 0x5bec776aUL, 0x02523168UL, 0x3538f369UL, 0x087faf62UL, 0x3f156d63UL, - 0x66ab2b61UL, 0x51c1e960UL, 0xd4d7a665UL, 0xe3bd6464UL, 0xba032266UL, - 0x8d69e067UL, 0x20cbd748UL, 0x17a11549UL, 0x4e1f534bUL, 0x7975914aUL, - 0xfc63de4fUL, 0xcb091c4eUL, 0x92b75a4cUL, 0xa5dd984dUL, 0x989ac446UL, - 0xaff00647UL, 0xf64e4045UL, 0xc1248244UL, 0x4432cd41UL, 0x73580f40UL, - 0x2ae64942UL, 0x1d8c8b43UL, 0x5068f154UL, 0x67023355UL, 0x3ebc7557UL, - 0x09d6b756UL, 0x8cc0f853UL, 0xbbaa3a52UL, 0xe2147c50UL, 0xd57ebe51UL, - 0xe839e25aUL, 0xdf53205bUL, 0x86ed6659UL, 0xb187a458UL, 0x3491eb5dUL, - 0x03fb295cUL, 0x5a456f5eUL, 0x6d2fad5fUL, 0x801b35e1UL, 0xb771f7e0UL, - 0xeecfb1e2UL, 0xd9a573e3UL, 0x5cb33ce6UL, 0x6bd9fee7UL, 0x3267b8e5UL, - 0x050d7ae4UL, 0x384a26efUL, 0x0f20e4eeUL, 0x569ea2ecUL, 0x61f460edUL, - 0xe4e22fe8UL, 0xd388ede9UL, 0x8a36abebUL, 0xbd5c69eaUL, 0xf0b813fdUL, - 0xc7d2d1fcUL, 0x9e6c97feUL, 0xa90655ffUL, 0x2c101afaUL, 0x1b7ad8fbUL, - 0x42c49ef9UL, 0x75ae5cf8UL, 0x48e900f3UL, 0x7f83c2f2UL, 0x263d84f0UL, - 0x115746f1UL, 0x944109f4UL, 0xa32bcbf5UL, 0xfa958df7UL, 0xcdff4ff6UL, - 0x605d78d9UL, 0x5737bad8UL, 0x0e89fcdaUL, 0x39e33edbUL, 0xbcf571deUL, - 0x8b9fb3dfUL, 0xd221f5ddUL, 0xe54b37dcUL, 0xd80c6bd7UL, 0xef66a9d6UL, - 0xb6d8efd4UL, 0x81b22dd5UL, 0x04a462d0UL, 0x33cea0d1UL, 0x6a70e6d3UL, - 0x5d1a24d2UL, 0x10fe5ec5UL, 0x27949cc4UL, 0x7e2adac6UL, 0x494018c7UL, - 0xcc5657c2UL, 0xfb3c95c3UL, 0xa282d3c1UL, 0x95e811c0UL, 0xa8af4dcbUL, - 0x9fc58fcaUL, 0xc67bc9c8UL, 0xf1110bc9UL, 0x740744ccUL, 0x436d86cdUL, - 0x1ad3c0cfUL, 0x2db902ceUL, 0x4096af91UL, 0x77fc6d90UL, 0x2e422b92UL, - 0x1928e993UL, 0x9c3ea696UL, 0xab546497UL, 0xf2ea2295UL, 0xc580e094UL, - 0xf8c7bc9fUL, 0xcfad7e9eUL, 0x9613389cUL, 0xa179fa9dUL, 0x246fb598UL, - 0x13057799UL, 0x4abb319bUL, 0x7dd1f39aUL, 0x3035898dUL, 0x075f4b8cUL, - 0x5ee10d8eUL, 0x698bcf8fUL, 0xec9d808aUL, 0xdbf7428bUL, 0x82490489UL, - 0xb523c688UL, 0x88649a83UL, 0xbf0e5882UL, 0xe6b01e80UL, 0xd1dadc81UL, - 0x54cc9384UL, 0x63a65185UL, 0x3a181787UL, 0x0d72d586UL, 0xa0d0e2a9UL, - 0x97ba20a8UL, 0xce0466aaUL, 0xf96ea4abUL, 0x7c78ebaeUL, 0x4b1229afUL, - 0x12ac6fadUL, 0x25c6adacUL, 0x1881f1a7UL, 0x2feb33a6UL, 0x765575a4UL, - 0x413fb7a5UL, 0xc429f8a0UL, 0xf3433aa1UL, 0xaafd7ca3UL, 0x9d97bea2UL, - 0xd073c4b5UL, 0xe71906b4UL, 0xbea740b6UL, 0x89cd82b7UL, 0x0cdbcdb2UL, - 0x3bb10fb3UL, 0x620f49b1UL, 0x55658bb0UL, 0x6822d7bbUL, 0x5f4815baUL, - 0x06f653b8UL, 0x319c91b9UL, 0xb48adebcUL, 0x83e01cbdUL, 0xda5e5abfUL, - 0xed3498beUL - }, - { - 0x00000000UL, 0x6567bcb8UL, 0x8bc809aaUL, 0xeeafb512UL, 0x5797628fUL, - 0x32f0de37UL, 0xdc5f6b25UL, 0xb938d79dUL, 0xef28b4c5UL, 0x8a4f087dUL, - 0x64e0bd6fUL, 0x018701d7UL, 0xb8bfd64aUL, 0xddd86af2UL, 0x3377dfe0UL, - 0x56106358UL, 0x9f571950UL, 0xfa30a5e8UL, 0x149f10faUL, 0x71f8ac42UL, - 0xc8c07bdfUL, 0xada7c767UL, 0x43087275UL, 0x266fcecdUL, 0x707fad95UL, - 0x1518112dUL, 0xfbb7a43fUL, 0x9ed01887UL, 0x27e8cf1aUL, 0x428f73a2UL, - 0xac20c6b0UL, 0xc9477a08UL, 0x3eaf32a0UL, 0x5bc88e18UL, 0xb5673b0aUL, - 0xd00087b2UL, 0x6938502fUL, 0x0c5fec97UL, 0xe2f05985UL, 0x8797e53dUL, - 0xd1878665UL, 0xb4e03addUL, 0x5a4f8fcfUL, 0x3f283377UL, 0x8610e4eaUL, - 0xe3775852UL, 0x0dd8ed40UL, 0x68bf51f8UL, 0xa1f82bf0UL, 0xc49f9748UL, - 0x2a30225aUL, 0x4f579ee2UL, 0xf66f497fUL, 0x9308f5c7UL, 0x7da740d5UL, - 0x18c0fc6dUL, 0x4ed09f35UL, 0x2bb7238dUL, 0xc518969fUL, 0xa07f2a27UL, - 0x1947fdbaUL, 0x7c204102UL, 0x928ff410UL, 0xf7e848a8UL, 0x3d58149bUL, - 0x583fa823UL, 0xb6901d31UL, 0xd3f7a189UL, 0x6acf7614UL, 0x0fa8caacUL, - 0xe1077fbeUL, 0x8460c306UL, 0xd270a05eUL, 0xb7171ce6UL, 0x59b8a9f4UL, - 0x3cdf154cUL, 0x85e7c2d1UL, 0xe0807e69UL, 0x0e2fcb7bUL, 0x6b4877c3UL, - 0xa20f0dcbUL, 0xc768b173UL, 0x29c70461UL, 0x4ca0b8d9UL, 0xf5986f44UL, - 0x90ffd3fcUL, 0x7e5066eeUL, 0x1b37da56UL, 0x4d27b90eUL, 0x284005b6UL, - 0xc6efb0a4UL, 0xa3880c1cUL, 0x1ab0db81UL, 0x7fd76739UL, 0x9178d22bUL, - 0xf41f6e93UL, 0x03f7263bUL, 0x66909a83UL, 0x883f2f91UL, 0xed589329UL, - 0x546044b4UL, 0x3107f80cUL, 0xdfa84d1eUL, 0xbacff1a6UL, 0xecdf92feUL, - 0x89b82e46UL, 0x67179b54UL, 0x027027ecUL, 0xbb48f071UL, 0xde2f4cc9UL, - 0x3080f9dbUL, 0x55e74563UL, 0x9ca03f6bUL, 0xf9c783d3UL, 0x176836c1UL, - 0x720f8a79UL, 0xcb375de4UL, 0xae50e15cUL, 0x40ff544eUL, 0x2598e8f6UL, - 0x73888baeUL, 0x16ef3716UL, 0xf8408204UL, 0x9d273ebcUL, 0x241fe921UL, - 0x41785599UL, 0xafd7e08bUL, 0xcab05c33UL, 0x3bb659edUL, 0x5ed1e555UL, - 0xb07e5047UL, 0xd519ecffUL, 0x6c213b62UL, 0x094687daUL, 0xe7e932c8UL, - 0x828e8e70UL, 0xd49eed28UL, 0xb1f95190UL, 0x5f56e482UL, 0x3a31583aUL, - 0x83098fa7UL, 0xe66e331fUL, 0x08c1860dUL, 0x6da63ab5UL, 0xa4e140bdUL, - 0xc186fc05UL, 0x2f294917UL, 0x4a4ef5afUL, 0xf3762232UL, 0x96119e8aUL, - 0x78be2b98UL, 0x1dd99720UL, 0x4bc9f478UL, 0x2eae48c0UL, 0xc001fdd2UL, - 0xa566416aUL, 0x1c5e96f7UL, 0x79392a4fUL, 0x97969f5dUL, 0xf2f123e5UL, - 0x05196b4dUL, 0x607ed7f5UL, 0x8ed162e7UL, 0xebb6de5fUL, 0x528e09c2UL, - 0x37e9b57aUL, 0xd9460068UL, 0xbc21bcd0UL, 0xea31df88UL, 0x8f566330UL, - 0x61f9d622UL, 0x049e6a9aUL, 0xbda6bd07UL, 0xd8c101bfUL, 0x366eb4adUL, - 0x53090815UL, 0x9a4e721dUL, 0xff29cea5UL, 0x11867bb7UL, 0x74e1c70fUL, - 0xcdd91092UL, 0xa8beac2aUL, 0x46111938UL, 0x2376a580UL, 0x7566c6d8UL, - 0x10017a60UL, 0xfeaecf72UL, 0x9bc973caUL, 0x22f1a457UL, 0x479618efUL, - 0xa939adfdUL, 0xcc5e1145UL, 0x06ee4d76UL, 0x6389f1ceUL, 0x8d2644dcUL, - 0xe841f864UL, 0x51792ff9UL, 0x341e9341UL, 0xdab12653UL, 0xbfd69aebUL, - 0xe9c6f9b3UL, 0x8ca1450bUL, 0x620ef019UL, 0x07694ca1UL, 0xbe519b3cUL, - 0xdb362784UL, 0x35999296UL, 0x50fe2e2eUL, 0x99b95426UL, 0xfcdee89eUL, - 0x12715d8cUL, 0x7716e134UL, 0xce2e36a9UL, 0xab498a11UL, 0x45e63f03UL, - 0x208183bbUL, 0x7691e0e3UL, 0x13f65c5bUL, 0xfd59e949UL, 0x983e55f1UL, - 0x2106826cUL, 0x44613ed4UL, 0xaace8bc6UL, 0xcfa9377eUL, 0x38417fd6UL, - 0x5d26c36eUL, 0xb389767cUL, 0xd6eecac4UL, 0x6fd61d59UL, 0x0ab1a1e1UL, - 0xe41e14f3UL, 0x8179a84bUL, 0xd769cb13UL, 0xb20e77abUL, 0x5ca1c2b9UL, - 0x39c67e01UL, 0x80fea99cUL, 0xe5991524UL, 0x0b36a036UL, 0x6e511c8eUL, - 0xa7166686UL, 0xc271da3eUL, 0x2cde6f2cUL, 0x49b9d394UL, 0xf0810409UL, - 0x95e6b8b1UL, 0x7b490da3UL, 0x1e2eb11bUL, 0x483ed243UL, 0x2d596efbUL, - 0xc3f6dbe9UL, 0xa6916751UL, 0x1fa9b0ccUL, 0x7ace0c74UL, 0x9461b966UL, - 0xf10605deUL -#endif - } -}; diff --git a/vendor/libgit2/deps/zlib/deflate.c b/vendor/libgit2/deps/zlib/deflate.c deleted file mode 100644 index 696957705b..0000000000 --- a/vendor/libgit2/deps/zlib/deflate.c +++ /dev/null @@ -1,1967 +0,0 @@ -/* deflate.c -- compress data using the deflation algorithm - * Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* - * ALGORITHM - * - * The "deflation" process depends on being able to identify portions - * of the input text which are identical to earlier input (within a - * sliding window trailing behind the input currently being processed). - * - * The most straightforward technique turns out to be the fastest for - * most input files: try all possible matches and select the longest. - * The key feature of this algorithm is that insertions into the string - * dictionary are very simple and thus fast, and deletions are avoided - * completely. Insertions are performed at each input character, whereas - * string matches are performed only when the previous match ends. So it - * is preferable to spend more time in matches to allow very fast string - * insertions and avoid deletions. The matching algorithm for small - * strings is inspired from that of Rabin & Karp. A brute force approach - * is used to find longer strings when a small match has been found. - * A similar algorithm is used in comic (by Jan-Mark Wams) and freeze - * (by Leonid Broukhis). - * A previous version of this file used a more sophisticated algorithm - * (by Fiala and Greene) which is guaranteed to run in linear amortized - * time, but has a larger average cost, uses more memory and is patented. - * However the F&G algorithm may be faster for some highly redundant - * files if the parameter max_chain_length (described below) is too large. - * - * ACKNOWLEDGEMENTS - * - * The idea of lazy evaluation of matches is due to Jan-Mark Wams, and - * I found it in 'freeze' written by Leonid Broukhis. - * Thanks to many people for bug reports and testing. - * - * REFERENCES - * - * Deutsch, L.P.,"DEFLATE Compressed Data Format Specification". - * Available in http://tools.ietf.org/html/rfc1951 - * - * A description of the Rabin and Karp algorithm is given in the book - * "Algorithms" by R. Sedgewick, Addison-Wesley, p252. - * - * Fiala,E.R., and Greene,D.H. - * Data Compression with Finite Windows, Comm.ACM, 32,4 (1989) 490-595 - * - */ - -/* @(#) $Id$ */ - -#include "deflate.h" - -const char deflate_copyright[] = - " deflate 1.2.8 Copyright 1995-2013 Jean-loup Gailly and Mark Adler "; -/* - If you use the zlib library in a product, an acknowledgment is welcome - in the documentation of your product. If for some reason you cannot - include such an acknowledgment, I would appreciate that you keep this - copyright string in the executable of your product. - */ - -/* =========================================================================== - * Function prototypes. - */ -typedef enum { - need_more, /* block not completed, need more input or more output */ - block_done, /* block flush performed */ - finish_started, /* finish started, need only more output at next deflate */ - finish_done /* finish done, accept no more input or output */ -} block_state; - -typedef block_state (*compress_func) OF((deflate_state *s, int flush)); -/* Compression function. Returns the block state after the call. */ - -local void fill_window OF((deflate_state *s)); -local block_state deflate_stored OF((deflate_state *s, int flush)); -local block_state deflate_fast OF((deflate_state *s, int flush)); -#ifndef FASTEST -local block_state deflate_slow OF((deflate_state *s, int flush)); -#endif -local block_state deflate_rle OF((deflate_state *s, int flush)); -local block_state deflate_huff OF((deflate_state *s, int flush)); -local void lm_init OF((deflate_state *s)); -local void putShortMSB OF((deflate_state *s, uInt b)); -local void flush_pending OF((z_streamp strm)); -local int read_buf OF((z_streamp strm, Bytef *buf, unsigned size)); -#ifdef ASMV - void match_init OF((void)); /* asm code initialization */ - uInt longest_match OF((deflate_state *s, IPos cur_match)); -#else -local uInt longest_match OF((deflate_state *s, IPos cur_match)); -#endif - -#ifdef DEBUG -local void check_match OF((deflate_state *s, IPos start, IPos match, - int length)); -#endif - -/* =========================================================================== - * Local data - */ - -#define NIL 0 -/* Tail of hash chains */ - -#ifndef TOO_FAR -# define TOO_FAR 4096 -#endif -/* Matches of length 3 are discarded if their distance exceeds TOO_FAR */ - -/* Values for max_lazy_match, good_match and max_chain_length, depending on - * the desired pack level (0..9). The values given below have been tuned to - * exclude worst case performance for pathological files. Better values may be - * found for specific files. - */ -typedef struct config_s { - ush good_length; /* reduce lazy search above this match length */ - ush max_lazy; /* do not perform lazy search above this match length */ - ush nice_length; /* quit search above this match length */ - ush max_chain; - compress_func func; -} config; - -#ifdef FASTEST -local const config configuration_table[2] = { -/* good lazy nice chain */ -/* 0 */ {0, 0, 0, 0, deflate_stored}, /* store only */ -/* 1 */ {4, 4, 8, 4, deflate_fast}}; /* max speed, no lazy matches */ -#else -local const config configuration_table[10] = { -/* good lazy nice chain */ -/* 0 */ {0, 0, 0, 0, deflate_stored}, /* store only */ -/* 1 */ {4, 4, 8, 4, deflate_fast}, /* max speed, no lazy matches */ -/* 2 */ {4, 5, 16, 8, deflate_fast}, -/* 3 */ {4, 6, 32, 32, deflate_fast}, - -/* 4 */ {4, 4, 16, 16, deflate_slow}, /* lazy matches */ -/* 5 */ {8, 16, 32, 32, deflate_slow}, -/* 6 */ {8, 16, 128, 128, deflate_slow}, -/* 7 */ {8, 32, 128, 256, deflate_slow}, -/* 8 */ {32, 128, 258, 1024, deflate_slow}, -/* 9 */ {32, 258, 258, 4096, deflate_slow}}; /* max compression */ -#endif - -/* Note: the deflate() code requires max_lazy >= MIN_MATCH and max_chain >= 4 - * For deflate_fast() (levels <= 3) good is ignored and lazy has a different - * meaning. - */ - -#define EQUAL 0 -/* result of memcmp for equal strings */ - -#ifndef NO_DUMMY_DECL -struct static_tree_desc_s {int dummy;}; /* for buggy compilers */ -#endif - -/* rank Z_BLOCK between Z_NO_FLUSH and Z_PARTIAL_FLUSH */ -#define RANK(f) (((f) << 1) - ((f) > 4 ? 9 : 0)) - -/* =========================================================================== - * Update a hash value with the given input byte - * IN assertion: all calls to to UPDATE_HASH are made with consecutive - * input characters, so that a running hash key can be computed from the - * previous key instead of complete recalculation each time. - */ -#define UPDATE_HASH(s,h,c) (h = (((h)<hash_shift) ^ (c)) & s->hash_mask) - - -/* =========================================================================== - * Insert string str in the dictionary and set match_head to the previous head - * of the hash chain (the most recent string with same hash key). Return - * the previous length of the hash chain. - * If this file is compiled with -DFASTEST, the compression level is forced - * to 1, and no hash chains are maintained. - * IN assertion: all calls to to INSERT_STRING are made with consecutive - * input characters and the first MIN_MATCH bytes of str are valid - * (except for the last MIN_MATCH-1 bytes of the input file). - */ -#ifdef FASTEST -#define INSERT_STRING(s, str, match_head) \ - (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \ - match_head = s->head[s->ins_h], \ - s->head[s->ins_h] = (Pos)(str)) -#else -#define INSERT_STRING(s, str, match_head) \ - (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \ - match_head = s->prev[(str) & s->w_mask] = s->head[s->ins_h], \ - s->head[s->ins_h] = (Pos)(str)) -#endif - -/* =========================================================================== - * Initialize the hash table (avoiding 64K overflow for 16 bit systems). - * prev[] will be initialized on the fly. - */ -#define CLEAR_HASH(s) \ - s->head[s->hash_size-1] = NIL; \ - zmemzero((Bytef *)s->head, (unsigned)(s->hash_size-1)*sizeof(*s->head)); - -/* ========================================================================= */ -int ZEXPORT deflateInit_(strm, level, version, stream_size) - z_streamp strm; - int level; - const char *version; - int stream_size; -{ - return deflateInit2_(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL, - Z_DEFAULT_STRATEGY, version, stream_size); - /* To do: ignore strm->next_in if we use it as window */ -} - -/* ========================================================================= */ -int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, - version, stream_size) - z_streamp strm; - int level; - int method; - int windowBits; - int memLevel; - int strategy; - const char *version; - int stream_size; -{ - deflate_state *s; - int wrap = 1; - static const char my_version[] = ZLIB_VERSION; - - ushf *overlay; - /* We overlay pending_buf and d_buf+l_buf. This works since the average - * output size for (length,distance) codes is <= 24 bits. - */ - - if (version == Z_NULL || version[0] != my_version[0] || - stream_size != sizeof(z_stream)) { - return Z_VERSION_ERROR; - } - if (strm == Z_NULL) return Z_STREAM_ERROR; - - strm->msg = Z_NULL; - if (strm->zalloc == (alloc_func)0) { -#ifdef Z_SOLO - return Z_STREAM_ERROR; -#else - strm->zalloc = zcalloc; - strm->opaque = (voidpf)0; -#endif - } - if (strm->zfree == (free_func)0) -#ifdef Z_SOLO - return Z_STREAM_ERROR; -#else - strm->zfree = zcfree; -#endif - -#ifdef FASTEST - if (level != 0) level = 1; -#else - if (level == Z_DEFAULT_COMPRESSION) level = 6; -#endif - - if (windowBits < 0) { /* suppress zlib wrapper */ - wrap = 0; - windowBits = -windowBits; - } -#ifdef GZIP - else if (windowBits > 15) { - wrap = 2; /* write gzip wrapper instead */ - windowBits -= 16; - } -#endif - if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method != Z_DEFLATED || - windowBits < 8 || windowBits > 15 || level < 0 || level > 9 || - strategy < 0 || strategy > Z_FIXED) { - return Z_STREAM_ERROR; - } - if (windowBits == 8) windowBits = 9; /* until 256-byte window bug fixed */ - s = (deflate_state *) ZALLOC(strm, 1, sizeof(deflate_state)); - if (s == Z_NULL) return Z_MEM_ERROR; - strm->state = (struct internal_state FAR *)s; - s->strm = strm; - - s->wrap = wrap; - s->gzhead = Z_NULL; - s->w_bits = windowBits; - s->w_size = 1 << s->w_bits; - s->w_mask = s->w_size - 1; - - s->hash_bits = memLevel + 7; - s->hash_size = 1 << s->hash_bits; - s->hash_mask = s->hash_size - 1; - s->hash_shift = ((s->hash_bits+MIN_MATCH-1)/MIN_MATCH); - - s->window = (Bytef *) ZALLOC(strm, s->w_size, 2*sizeof(Byte)); - s->prev = (Posf *) ZALLOC(strm, s->w_size, sizeof(Pos)); - s->head = (Posf *) ZALLOC(strm, s->hash_size, sizeof(Pos)); - - s->high_water = 0; /* nothing written to s->window yet */ - - s->lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */ - - overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2); - s->pending_buf = (uchf *) overlay; - s->pending_buf_size = (ulg)s->lit_bufsize * (sizeof(ush)+2L); - - if (s->window == Z_NULL || s->prev == Z_NULL || s->head == Z_NULL || - s->pending_buf == Z_NULL) { - s->status = FINISH_STATE; - strm->msg = ERR_MSG(Z_MEM_ERROR); - deflateEnd (strm); - return Z_MEM_ERROR; - } - s->d_buf = overlay + s->lit_bufsize/sizeof(ush); - s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize; - - s->level = level; - s->strategy = strategy; - s->method = (Byte)method; - - return deflateReset(strm); -} - -/* ========================================================================= */ -int ZEXPORT deflateSetDictionary (strm, dictionary, dictLength) - z_streamp strm; - const Bytef *dictionary; - uInt dictLength; -{ - deflate_state *s; - uInt str, n; - int wrap; - unsigned avail; - z_const unsigned char *next; - - if (strm == Z_NULL || strm->state == Z_NULL || dictionary == Z_NULL) - return Z_STREAM_ERROR; - s = strm->state; - wrap = s->wrap; - if (wrap == 2 || (wrap == 1 && s->status != INIT_STATE) || s->lookahead) - return Z_STREAM_ERROR; - - /* when using zlib wrappers, compute Adler-32 for provided dictionary */ - if (wrap == 1) - strm->adler = adler32(strm->adler, dictionary, dictLength); - s->wrap = 0; /* avoid computing Adler-32 in read_buf */ - - /* if dictionary would fill window, just replace the history */ - if (dictLength >= s->w_size) { - if (wrap == 0) { /* already empty otherwise */ - CLEAR_HASH(s); - s->strstart = 0; - s->block_start = 0L; - s->insert = 0; - } - dictionary += dictLength - s->w_size; /* use the tail */ - dictLength = s->w_size; - } - - /* insert dictionary into window and hash */ - avail = strm->avail_in; - next = strm->next_in; - strm->avail_in = dictLength; - strm->next_in = (z_const Bytef *)dictionary; - fill_window(s); - while (s->lookahead >= MIN_MATCH) { - str = s->strstart; - n = s->lookahead - (MIN_MATCH-1); - do { - UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); -#ifndef FASTEST - s->prev[str & s->w_mask] = s->head[s->ins_h]; -#endif - s->head[s->ins_h] = (Pos)str; - str++; - } while (--n); - s->strstart = str; - s->lookahead = MIN_MATCH-1; - fill_window(s); - } - s->strstart += s->lookahead; - s->block_start = (long)s->strstart; - s->insert = s->lookahead; - s->lookahead = 0; - s->match_length = s->prev_length = MIN_MATCH-1; - s->match_available = 0; - strm->next_in = next; - strm->avail_in = avail; - s->wrap = wrap; - return Z_OK; -} - -/* ========================================================================= */ -int ZEXPORT deflateResetKeep (strm) - z_streamp strm; -{ - deflate_state *s; - - if (strm == Z_NULL || strm->state == Z_NULL || - strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0) { - return Z_STREAM_ERROR; - } - - strm->total_in = strm->total_out = 0; - strm->msg = Z_NULL; /* use zfree if we ever allocate msg dynamically */ - strm->data_type = Z_UNKNOWN; - - s = (deflate_state *)strm->state; - s->pending = 0; - s->pending_out = s->pending_buf; - - if (s->wrap < 0) { - s->wrap = -s->wrap; /* was made negative by deflate(..., Z_FINISH); */ - } - s->status = s->wrap ? INIT_STATE : BUSY_STATE; - strm->adler = -#ifdef GZIP - s->wrap == 2 ? crc32(0L, Z_NULL, 0) : -#endif - adler32(0L, Z_NULL, 0); - s->last_flush = Z_NO_FLUSH; - - _tr_init(s); - - return Z_OK; -} - -/* ========================================================================= */ -int ZEXPORT deflateReset (strm) - z_streamp strm; -{ - int ret; - - ret = deflateResetKeep(strm); - if (ret == Z_OK) - lm_init(strm->state); - return ret; -} - -/* ========================================================================= */ -int ZEXPORT deflateSetHeader (strm, head) - z_streamp strm; - gz_headerp head; -{ - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - if (strm->state->wrap != 2) return Z_STREAM_ERROR; - strm->state->gzhead = head; - return Z_OK; -} - -/* ========================================================================= */ -int ZEXPORT deflatePending (strm, pending, bits) - unsigned *pending; - int *bits; - z_streamp strm; -{ - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - if (pending != Z_NULL) - *pending = strm->state->pending; - if (bits != Z_NULL) - *bits = strm->state->bi_valid; - return Z_OK; -} - -/* ========================================================================= */ -int ZEXPORT deflatePrime (strm, bits, value) - z_streamp strm; - int bits; - int value; -{ - deflate_state *s; - int put; - - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - s = strm->state; - if ((Bytef *)(s->d_buf) < s->pending_out + ((Buf_size + 7) >> 3)) - return Z_BUF_ERROR; - do { - put = Buf_size - s->bi_valid; - if (put > bits) - put = bits; - s->bi_buf |= (ush)((value & ((1 << put) - 1)) << s->bi_valid); - s->bi_valid += put; - _tr_flush_bits(s); - value >>= put; - bits -= put; - } while (bits); - return Z_OK; -} - -/* ========================================================================= */ -int ZEXPORT deflateParams(strm, level, strategy) - z_streamp strm; - int level; - int strategy; -{ - deflate_state *s; - compress_func func; - int err = Z_OK; - - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - s = strm->state; - -#ifdef FASTEST - if (level != 0) level = 1; -#else - if (level == Z_DEFAULT_COMPRESSION) level = 6; -#endif - if (level < 0 || level > 9 || strategy < 0 || strategy > Z_FIXED) { - return Z_STREAM_ERROR; - } - func = configuration_table[s->level].func; - - if ((strategy != s->strategy || func != configuration_table[level].func) && - strm->total_in != 0) { - /* Flush the last buffer: */ - err = deflate(strm, Z_BLOCK); - if (err == Z_BUF_ERROR && s->pending == 0) - err = Z_OK; - } - if (s->level != level) { - s->level = level; - s->max_lazy_match = configuration_table[level].max_lazy; - s->good_match = configuration_table[level].good_length; - s->nice_match = configuration_table[level].nice_length; - s->max_chain_length = configuration_table[level].max_chain; - } - s->strategy = strategy; - return err; -} - -/* ========================================================================= */ -int ZEXPORT deflateTune(strm, good_length, max_lazy, nice_length, max_chain) - z_streamp strm; - int good_length; - int max_lazy; - int nice_length; - int max_chain; -{ - deflate_state *s; - - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - s = strm->state; - s->good_match = good_length; - s->max_lazy_match = max_lazy; - s->nice_match = nice_length; - s->max_chain_length = max_chain; - return Z_OK; -} - -/* ========================================================================= - * For the default windowBits of 15 and memLevel of 8, this function returns - * a close to exact, as well as small, upper bound on the compressed size. - * They are coded as constants here for a reason--if the #define's are - * changed, then this function needs to be changed as well. The return - * value for 15 and 8 only works for those exact settings. - * - * For any setting other than those defaults for windowBits and memLevel, - * the value returned is a conservative worst case for the maximum expansion - * resulting from using fixed blocks instead of stored blocks, which deflate - * can emit on compressed data for some combinations of the parameters. - * - * This function could be more sophisticated to provide closer upper bounds for - * every combination of windowBits and memLevel. But even the conservative - * upper bound of about 14% expansion does not seem onerous for output buffer - * allocation. - */ -uLong ZEXPORT deflateBound(strm, sourceLen) - z_streamp strm; - uLong sourceLen; -{ - deflate_state *s; - uLong complen, wraplen; - Bytef *str; - - /* conservative upper bound for compressed data */ - complen = sourceLen + - ((sourceLen + 7) >> 3) + ((sourceLen + 63) >> 6) + 5; - - /* if can't get parameters, return conservative bound plus zlib wrapper */ - if (strm == Z_NULL || strm->state == Z_NULL) - return complen + 6; - - /* compute wrapper length */ - s = strm->state; - switch (s->wrap) { - case 0: /* raw deflate */ - wraplen = 0; - break; - case 1: /* zlib wrapper */ - wraplen = 6 + (s->strstart ? 4 : 0); - break; - case 2: /* gzip wrapper */ - wraplen = 18; - if (s->gzhead != Z_NULL) { /* user-supplied gzip header */ - if (s->gzhead->extra != Z_NULL) - wraplen += 2 + s->gzhead->extra_len; - str = s->gzhead->name; - if (str != Z_NULL) - do { - wraplen++; - } while (*str++); - str = s->gzhead->comment; - if (str != Z_NULL) - do { - wraplen++; - } while (*str++); - if (s->gzhead->hcrc) - wraplen += 2; - } - break; - default: /* for compiler happiness */ - wraplen = 6; - } - - /* if not default parameters, return conservative bound */ - if (s->w_bits != 15 || s->hash_bits != 8 + 7) - return complen + wraplen; - - /* default settings: return tight bound for that case */ - return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) + - (sourceLen >> 25) + 13 - 6 + wraplen; -} - -/* ========================================================================= - * Put a short in the pending buffer. The 16-bit value is put in MSB order. - * IN assertion: the stream state is correct and there is enough room in - * pending_buf. - */ -local void putShortMSB (s, b) - deflate_state *s; - uInt b; -{ - put_byte(s, (Byte)(b >> 8)); - put_byte(s, (Byte)(b & 0xff)); -} - -/* ========================================================================= - * Flush as much pending output as possible. All deflate() output goes - * through this function so some applications may wish to modify it - * to avoid allocating a large strm->next_out buffer and copying into it. - * (See also read_buf()). - */ -local void flush_pending(strm) - z_streamp strm; -{ - unsigned len; - deflate_state *s = strm->state; - - _tr_flush_bits(s); - len = s->pending; - if (len > strm->avail_out) len = strm->avail_out; - if (len == 0) return; - - zmemcpy(strm->next_out, s->pending_out, len); - strm->next_out += len; - s->pending_out += len; - strm->total_out += len; - strm->avail_out -= len; - s->pending -= len; - if (s->pending == 0) { - s->pending_out = s->pending_buf; - } -} - -/* ========================================================================= */ -int ZEXPORT deflate (strm, flush) - z_streamp strm; - int flush; -{ - int old_flush; /* value of flush param for previous deflate call */ - deflate_state *s; - - if (strm == Z_NULL || strm->state == Z_NULL || - flush > Z_BLOCK || flush < 0) { - return Z_STREAM_ERROR; - } - s = strm->state; - - if (strm->next_out == Z_NULL || - (strm->next_in == Z_NULL && strm->avail_in != 0) || - (s->status == FINISH_STATE && flush != Z_FINISH)) { - ERR_RETURN(strm, Z_STREAM_ERROR); - } - if (strm->avail_out == 0) ERR_RETURN(strm, Z_BUF_ERROR); - - s->strm = strm; /* just in case */ - old_flush = s->last_flush; - s->last_flush = flush; - - /* Write the header */ - if (s->status == INIT_STATE) { -#ifdef GZIP - if (s->wrap == 2) { - strm->adler = crc32(0L, Z_NULL, 0); - put_byte(s, 31); - put_byte(s, 139); - put_byte(s, 8); - if (s->gzhead == Z_NULL) { - put_byte(s, 0); - put_byte(s, 0); - put_byte(s, 0); - put_byte(s, 0); - put_byte(s, 0); - put_byte(s, s->level == 9 ? 2 : - (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ? - 4 : 0)); - put_byte(s, OS_CODE); - s->status = BUSY_STATE; - } - else { - put_byte(s, (s->gzhead->text ? 1 : 0) + - (s->gzhead->hcrc ? 2 : 0) + - (s->gzhead->extra == Z_NULL ? 0 : 4) + - (s->gzhead->name == Z_NULL ? 0 : 8) + - (s->gzhead->comment == Z_NULL ? 0 : 16) - ); - put_byte(s, (Byte)(s->gzhead->time & 0xff)); - put_byte(s, (Byte)((s->gzhead->time >> 8) & 0xff)); - put_byte(s, (Byte)((s->gzhead->time >> 16) & 0xff)); - put_byte(s, (Byte)((s->gzhead->time >> 24) & 0xff)); - put_byte(s, s->level == 9 ? 2 : - (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ? - 4 : 0)); - put_byte(s, s->gzhead->os & 0xff); - if (s->gzhead->extra != Z_NULL) { - put_byte(s, s->gzhead->extra_len & 0xff); - put_byte(s, (s->gzhead->extra_len >> 8) & 0xff); - } - if (s->gzhead->hcrc) - strm->adler = crc32(strm->adler, s->pending_buf, - s->pending); - s->gzindex = 0; - s->status = EXTRA_STATE; - } - } - else -#endif - { - uInt header = (Z_DEFLATED + ((s->w_bits-8)<<4)) << 8; - uInt level_flags; - - if (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2) - level_flags = 0; - else if (s->level < 6) - level_flags = 1; - else if (s->level == 6) - level_flags = 2; - else - level_flags = 3; - header |= (level_flags << 6); - if (s->strstart != 0) header |= PRESET_DICT; - header += 31 - (header % 31); - - s->status = BUSY_STATE; - putShortMSB(s, header); - - /* Save the adler32 of the preset dictionary: */ - if (s->strstart != 0) { - putShortMSB(s, (uInt)(strm->adler >> 16)); - putShortMSB(s, (uInt)(strm->adler & 0xffff)); - } - strm->adler = adler32(0L, Z_NULL, 0); - } - } -#ifdef GZIP - if (s->status == EXTRA_STATE) { - if (s->gzhead->extra != Z_NULL) { - uInt beg = s->pending; /* start of bytes to update crc */ - - while (s->gzindex < (s->gzhead->extra_len & 0xffff)) { - if (s->pending == s->pending_buf_size) { - if (s->gzhead->hcrc && s->pending > beg) - strm->adler = crc32(strm->adler, s->pending_buf + beg, - s->pending - beg); - flush_pending(strm); - beg = s->pending; - if (s->pending == s->pending_buf_size) - break; - } - put_byte(s, s->gzhead->extra[s->gzindex]); - s->gzindex++; - } - if (s->gzhead->hcrc && s->pending > beg) - strm->adler = crc32(strm->adler, s->pending_buf + beg, - s->pending - beg); - if (s->gzindex == s->gzhead->extra_len) { - s->gzindex = 0; - s->status = NAME_STATE; - } - } - else - s->status = NAME_STATE; - } - if (s->status == NAME_STATE) { - if (s->gzhead->name != Z_NULL) { - uInt beg = s->pending; /* start of bytes to update crc */ - int val; - - do { - if (s->pending == s->pending_buf_size) { - if (s->gzhead->hcrc && s->pending > beg) - strm->adler = crc32(strm->adler, s->pending_buf + beg, - s->pending - beg); - flush_pending(strm); - beg = s->pending; - if (s->pending == s->pending_buf_size) { - val = 1; - break; - } - } - val = s->gzhead->name[s->gzindex++]; - put_byte(s, val); - } while (val != 0); - if (s->gzhead->hcrc && s->pending > beg) - strm->adler = crc32(strm->adler, s->pending_buf + beg, - s->pending - beg); - if (val == 0) { - s->gzindex = 0; - s->status = COMMENT_STATE; - } - } - else - s->status = COMMENT_STATE; - } - if (s->status == COMMENT_STATE) { - if (s->gzhead->comment != Z_NULL) { - uInt beg = s->pending; /* start of bytes to update crc */ - int val; - - do { - if (s->pending == s->pending_buf_size) { - if (s->gzhead->hcrc && s->pending > beg) - strm->adler = crc32(strm->adler, s->pending_buf + beg, - s->pending - beg); - flush_pending(strm); - beg = s->pending; - if (s->pending == s->pending_buf_size) { - val = 1; - break; - } - } - val = s->gzhead->comment[s->gzindex++]; - put_byte(s, val); - } while (val != 0); - if (s->gzhead->hcrc && s->pending > beg) - strm->adler = crc32(strm->adler, s->pending_buf + beg, - s->pending - beg); - if (val == 0) - s->status = HCRC_STATE; - } - else - s->status = HCRC_STATE; - } - if (s->status == HCRC_STATE) { - if (s->gzhead->hcrc) { - if (s->pending + 2 > s->pending_buf_size) - flush_pending(strm); - if (s->pending + 2 <= s->pending_buf_size) { - put_byte(s, (Byte)(strm->adler & 0xff)); - put_byte(s, (Byte)((strm->adler >> 8) & 0xff)); - strm->adler = crc32(0L, Z_NULL, 0); - s->status = BUSY_STATE; - } - } - else - s->status = BUSY_STATE; - } -#endif - - /* Flush as much pending output as possible */ - if (s->pending != 0) { - flush_pending(strm); - if (strm->avail_out == 0) { - /* Since avail_out is 0, deflate will be called again with - * more output space, but possibly with both pending and - * avail_in equal to zero. There won't be anything to do, - * but this is not an error situation so make sure we - * return OK instead of BUF_ERROR at next call of deflate: - */ - s->last_flush = -1; - return Z_OK; - } - - /* Make sure there is something to do and avoid duplicate consecutive - * flushes. For repeated and useless calls with Z_FINISH, we keep - * returning Z_STREAM_END instead of Z_BUF_ERROR. - */ - } else if (strm->avail_in == 0 && RANK(flush) <= RANK(old_flush) && - flush != Z_FINISH) { - ERR_RETURN(strm, Z_BUF_ERROR); - } - - /* User must not provide more input after the first FINISH: */ - if (s->status == FINISH_STATE && strm->avail_in != 0) { - ERR_RETURN(strm, Z_BUF_ERROR); - } - - /* Start a new block or continue the current one. - */ - if (strm->avail_in != 0 || s->lookahead != 0 || - (flush != Z_NO_FLUSH && s->status != FINISH_STATE)) { - block_state bstate; - - bstate = s->strategy == Z_HUFFMAN_ONLY ? deflate_huff(s, flush) : - (s->strategy == Z_RLE ? deflate_rle(s, flush) : - (*(configuration_table[s->level].func))(s, flush)); - - if (bstate == finish_started || bstate == finish_done) { - s->status = FINISH_STATE; - } - if (bstate == need_more || bstate == finish_started) { - if (strm->avail_out == 0) { - s->last_flush = -1; /* avoid BUF_ERROR next call, see above */ - } - return Z_OK; - /* If flush != Z_NO_FLUSH && avail_out == 0, the next call - * of deflate should use the same flush parameter to make sure - * that the flush is complete. So we don't have to output an - * empty block here, this will be done at next call. This also - * ensures that for a very small output buffer, we emit at most - * one empty block. - */ - } - if (bstate == block_done) { - if (flush == Z_PARTIAL_FLUSH) { - _tr_align(s); - } else if (flush != Z_BLOCK) { /* FULL_FLUSH or SYNC_FLUSH */ - _tr_stored_block(s, (char*)0, 0L, 0); - /* For a full flush, this empty block will be recognized - * as a special marker by inflate_sync(). - */ - if (flush == Z_FULL_FLUSH) { - CLEAR_HASH(s); /* forget history */ - if (s->lookahead == 0) { - s->strstart = 0; - s->block_start = 0L; - s->insert = 0; - } - } - } - flush_pending(strm); - if (strm->avail_out == 0) { - s->last_flush = -1; /* avoid BUF_ERROR at next call, see above */ - return Z_OK; - } - } - } - Assert(strm->avail_out > 0, "bug2"); - - if (flush != Z_FINISH) return Z_OK; - if (s->wrap <= 0) return Z_STREAM_END; - - /* Write the trailer */ -#ifdef GZIP - if (s->wrap == 2) { - put_byte(s, (Byte)(strm->adler & 0xff)); - put_byte(s, (Byte)((strm->adler >> 8) & 0xff)); - put_byte(s, (Byte)((strm->adler >> 16) & 0xff)); - put_byte(s, (Byte)((strm->adler >> 24) & 0xff)); - put_byte(s, (Byte)(strm->total_in & 0xff)); - put_byte(s, (Byte)((strm->total_in >> 8) & 0xff)); - put_byte(s, (Byte)((strm->total_in >> 16) & 0xff)); - put_byte(s, (Byte)((strm->total_in >> 24) & 0xff)); - } - else -#endif - { - putShortMSB(s, (uInt)(strm->adler >> 16)); - putShortMSB(s, (uInt)(strm->adler & 0xffff)); - } - flush_pending(strm); - /* If avail_out is zero, the application will call deflate again - * to flush the rest. - */ - if (s->wrap > 0) s->wrap = -s->wrap; /* write the trailer only once! */ - return s->pending != 0 ? Z_OK : Z_STREAM_END; -} - -/* ========================================================================= */ -int ZEXPORT deflateEnd (strm) - z_streamp strm; -{ - int status; - - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - - status = strm->state->status; - if (status != INIT_STATE && - status != EXTRA_STATE && - status != NAME_STATE && - status != COMMENT_STATE && - status != HCRC_STATE && - status != BUSY_STATE && - status != FINISH_STATE) { - return Z_STREAM_ERROR; - } - - /* Deallocate in reverse order of allocations: */ - TRY_FREE(strm, strm->state->pending_buf); - TRY_FREE(strm, strm->state->head); - TRY_FREE(strm, strm->state->prev); - TRY_FREE(strm, strm->state->window); - - ZFREE(strm, strm->state); - strm->state = Z_NULL; - - return status == BUSY_STATE ? Z_DATA_ERROR : Z_OK; -} - -/* ========================================================================= - * Copy the source state to the destination state. - * To simplify the source, this is not supported for 16-bit MSDOS (which - * doesn't have enough memory anyway to duplicate compression states). - */ -int ZEXPORT deflateCopy (dest, source) - z_streamp dest; - z_streamp source; -{ -#ifdef MAXSEG_64K - return Z_STREAM_ERROR; -#else - deflate_state *ds; - deflate_state *ss; - ushf *overlay; - - - if (source == Z_NULL || dest == Z_NULL || source->state == Z_NULL) { - return Z_STREAM_ERROR; - } - - ss = source->state; - - zmemcpy((voidpf)dest, (voidpf)source, sizeof(z_stream)); - - ds = (deflate_state *) ZALLOC(dest, 1, sizeof(deflate_state)); - if (ds == Z_NULL) return Z_MEM_ERROR; - dest->state = (struct internal_state FAR *) ds; - zmemcpy((voidpf)ds, (voidpf)ss, sizeof(deflate_state)); - ds->strm = dest; - - ds->window = (Bytef *) ZALLOC(dest, ds->w_size, 2*sizeof(Byte)); - ds->prev = (Posf *) ZALLOC(dest, ds->w_size, sizeof(Pos)); - ds->head = (Posf *) ZALLOC(dest, ds->hash_size, sizeof(Pos)); - overlay = (ushf *) ZALLOC(dest, ds->lit_bufsize, sizeof(ush)+2); - ds->pending_buf = (uchf *) overlay; - - if (ds->window == Z_NULL || ds->prev == Z_NULL || ds->head == Z_NULL || - ds->pending_buf == Z_NULL) { - deflateEnd (dest); - return Z_MEM_ERROR; - } - /* following zmemcpy do not work for 16-bit MSDOS */ - zmemcpy(ds->window, ss->window, ds->w_size * 2 * sizeof(Byte)); - zmemcpy((voidpf)ds->prev, (voidpf)ss->prev, ds->w_size * sizeof(Pos)); - zmemcpy((voidpf)ds->head, (voidpf)ss->head, ds->hash_size * sizeof(Pos)); - zmemcpy(ds->pending_buf, ss->pending_buf, (uInt)ds->pending_buf_size); - - ds->pending_out = ds->pending_buf + (ss->pending_out - ss->pending_buf); - ds->d_buf = overlay + ds->lit_bufsize/sizeof(ush); - ds->l_buf = ds->pending_buf + (1+sizeof(ush))*ds->lit_bufsize; - - ds->l_desc.dyn_tree = ds->dyn_ltree; - ds->d_desc.dyn_tree = ds->dyn_dtree; - ds->bl_desc.dyn_tree = ds->bl_tree; - - return Z_OK; -#endif /* MAXSEG_64K */ -} - -/* =========================================================================== - * Read a new buffer from the current input stream, update the adler32 - * and total number of bytes read. All deflate() input goes through - * this function so some applications may wish to modify it to avoid - * allocating a large strm->next_in buffer and copying from it. - * (See also flush_pending()). - */ -local int read_buf(strm, buf, size) - z_streamp strm; - Bytef *buf; - unsigned size; -{ - unsigned len = strm->avail_in; - - if (len > size) len = size; - if (len == 0) return 0; - - strm->avail_in -= len; - - zmemcpy(buf, strm->next_in, len); - if (strm->state->wrap == 1) { - strm->adler = adler32(strm->adler, buf, len); - } -#ifdef GZIP - else if (strm->state->wrap == 2) { - strm->adler = crc32(strm->adler, buf, len); - } -#endif - strm->next_in += len; - strm->total_in += len; - - return (int)len; -} - -/* =========================================================================== - * Initialize the "longest match" routines for a new zlib stream - */ -local void lm_init (s) - deflate_state *s; -{ - s->window_size = (ulg)2L*s->w_size; - - CLEAR_HASH(s); - - /* Set the default configuration parameters: - */ - s->max_lazy_match = configuration_table[s->level].max_lazy; - s->good_match = configuration_table[s->level].good_length; - s->nice_match = configuration_table[s->level].nice_length; - s->max_chain_length = configuration_table[s->level].max_chain; - - s->strstart = 0; - s->block_start = 0L; - s->lookahead = 0; - s->insert = 0; - s->match_length = s->prev_length = MIN_MATCH-1; - s->match_available = 0; - s->ins_h = 0; -#ifndef FASTEST -#ifdef ASMV - match_init(); /* initialize the asm code */ -#endif -#endif -} - -#ifndef FASTEST -/* =========================================================================== - * Set match_start to the longest match starting at the given string and - * return its length. Matches shorter or equal to prev_length are discarded, - * in which case the result is equal to prev_length and match_start is - * garbage. - * IN assertions: cur_match is the head of the hash chain for the current - * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1 - * OUT assertion: the match length is not greater than s->lookahead. - */ -#ifndef ASMV -/* For 80x86 and 680x0, an optimized version will be provided in match.asm or - * match.S. The code will be functionally equivalent. - */ -local uInt longest_match(s, cur_match) - deflate_state *s; - IPos cur_match; /* current match */ -{ - unsigned chain_length = s->max_chain_length;/* max hash chain length */ - register Bytef *scan = s->window + s->strstart; /* current string */ - register Bytef *match; /* matched string */ - register int len; /* length of current match */ - int best_len = s->prev_length; /* best match length so far */ - int nice_match = s->nice_match; /* stop if match long enough */ - IPos limit = s->strstart > (IPos)MAX_DIST(s) ? - s->strstart - (IPos)MAX_DIST(s) : NIL; - /* Stop when cur_match becomes <= limit. To simplify the code, - * we prevent matches with the string of window index 0. - */ - Posf *prev = s->prev; - uInt wmask = s->w_mask; - -#ifdef UNALIGNED_OK - /* Compare two bytes at a time. Note: this is not always beneficial. - * Try with and without -DUNALIGNED_OK to check. - */ - register Bytef *strend = s->window + s->strstart + MAX_MATCH - 1; - register ush scan_start = *(ushf*)scan; - register ush scan_end = *(ushf*)(scan+best_len-1); -#else - register Bytef *strend = s->window + s->strstart + MAX_MATCH; - register Byte scan_end1 = scan[best_len-1]; - register Byte scan_end = scan[best_len]; -#endif - - /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. - * It is easy to get rid of this optimization if necessary. - */ - Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); - - /* Do not waste too much time if we already have a good match: */ - if (s->prev_length >= s->good_match) { - chain_length >>= 2; - } - /* Do not look for matches beyond the end of the input. This is necessary - * to make deflate deterministic. - */ - if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead; - - Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); - - do { - Assert(cur_match < s->strstart, "no future"); - match = s->window + cur_match; - - /* Skip to next match if the match length cannot increase - * or if the match length is less than 2. Note that the checks below - * for insufficient lookahead only occur occasionally for performance - * reasons. Therefore uninitialized memory will be accessed, and - * conditional jumps will be made that depend on those values. - * However the length of the match is limited to the lookahead, so - * the output of deflate is not affected by the uninitialized values. - */ -#if (defined(UNALIGNED_OK) && MAX_MATCH == 258) - /* This code assumes sizeof(unsigned short) == 2. Do not use - * UNALIGNED_OK if your compiler uses a different size. - */ - if (*(ushf*)(match+best_len-1) != scan_end || - *(ushf*)match != scan_start) continue; - - /* It is not necessary to compare scan[2] and match[2] since they are - * always equal when the other bytes match, given that the hash keys - * are equal and that HASH_BITS >= 8. Compare 2 bytes at a time at - * strstart+3, +5, ... up to strstart+257. We check for insufficient - * lookahead only every 4th comparison; the 128th check will be made - * at strstart+257. If MAX_MATCH-2 is not a multiple of 8, it is - * necessary to put more guard bytes at the end of the window, or - * to check more often for insufficient lookahead. - */ - Assert(scan[2] == match[2], "scan[2]?"); - scan++, match++; - do { - } while (*(ushf*)(scan+=2) == *(ushf*)(match+=2) && - *(ushf*)(scan+=2) == *(ushf*)(match+=2) && - *(ushf*)(scan+=2) == *(ushf*)(match+=2) && - *(ushf*)(scan+=2) == *(ushf*)(match+=2) && - scan < strend); - /* The funny "do {}" generates better code on most compilers */ - - /* Here, scan <= window+strstart+257 */ - Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); - if (*scan == *match) scan++; - - len = (MAX_MATCH - 1) - (int)(strend-scan); - scan = strend - (MAX_MATCH-1); - -#else /* UNALIGNED_OK */ - - if (match[best_len] != scan_end || - match[best_len-1] != scan_end1 || - *match != *scan || - *++match != scan[1]) continue; - - /* The check at best_len-1 can be removed because it will be made - * again later. (This heuristic is not always a win.) - * It is not necessary to compare scan[2] and match[2] since they - * are always equal when the other bytes match, given that - * the hash keys are equal and that HASH_BITS >= 8. - */ - scan += 2, match++; - Assert(*scan == *match, "match[2]?"); - - /* We check for insufficient lookahead only every 8th comparison; - * the 256th check will be made at strstart+258. - */ - do { - } while (*++scan == *++match && *++scan == *++match && - *++scan == *++match && *++scan == *++match && - *++scan == *++match && *++scan == *++match && - *++scan == *++match && *++scan == *++match && - scan < strend); - - Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); - - len = MAX_MATCH - (int)(strend - scan); - scan = strend - MAX_MATCH; - -#endif /* UNALIGNED_OK */ - - if (len > best_len) { - s->match_start = cur_match; - best_len = len; - if (len >= nice_match) break; -#ifdef UNALIGNED_OK - scan_end = *(ushf*)(scan+best_len-1); -#else - scan_end1 = scan[best_len-1]; - scan_end = scan[best_len]; -#endif - } - } while ((cur_match = prev[cur_match & wmask]) > limit - && --chain_length != 0); - - if ((uInt)best_len <= s->lookahead) return (uInt)best_len; - return s->lookahead; -} -#endif /* ASMV */ - -#else /* FASTEST */ - -/* --------------------------------------------------------------------------- - * Optimized version for FASTEST only - */ -local uInt longest_match(s, cur_match) - deflate_state *s; - IPos cur_match; /* current match */ -{ - register Bytef *scan = s->window + s->strstart; /* current string */ - register Bytef *match; /* matched string */ - register int len; /* length of current match */ - register Bytef *strend = s->window + s->strstart + MAX_MATCH; - - /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. - * It is easy to get rid of this optimization if necessary. - */ - Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); - - Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); - - Assert(cur_match < s->strstart, "no future"); - - match = s->window + cur_match; - - /* Return failure if the match length is less than 2: - */ - if (match[0] != scan[0] || match[1] != scan[1]) return MIN_MATCH-1; - - /* The check at best_len-1 can be removed because it will be made - * again later. (This heuristic is not always a win.) - * It is not necessary to compare scan[2] and match[2] since they - * are always equal when the other bytes match, given that - * the hash keys are equal and that HASH_BITS >= 8. - */ - scan += 2, match += 2; - Assert(*scan == *match, "match[2]?"); - - /* We check for insufficient lookahead only every 8th comparison; - * the 256th check will be made at strstart+258. - */ - do { - } while (*++scan == *++match && *++scan == *++match && - *++scan == *++match && *++scan == *++match && - *++scan == *++match && *++scan == *++match && - *++scan == *++match && *++scan == *++match && - scan < strend); - - Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); - - len = MAX_MATCH - (int)(strend - scan); - - if (len < MIN_MATCH) return MIN_MATCH - 1; - - s->match_start = cur_match; - return (uInt)len <= s->lookahead ? (uInt)len : s->lookahead; -} - -#endif /* FASTEST */ - -#ifdef DEBUG -/* =========================================================================== - * Check that the match at match_start is indeed a match. - */ -local void check_match(s, start, match, length) - deflate_state *s; - IPos start, match; - int length; -{ - /* check that the match is indeed a match */ - if (zmemcmp(s->window + match, - s->window + start, length) != EQUAL) { - fprintf(stderr, " start %u, match %u, length %d\n", - start, match, length); - do { - fprintf(stderr, "%c%c", s->window[match++], s->window[start++]); - } while (--length != 0); - z_error("invalid match"); - } - if (z_verbose > 1) { - fprintf(stderr,"\\[%d,%d]", start-match, length); - do { putc(s->window[start++], stderr); } while (--length != 0); - } -} -#else -# define check_match(s, start, match, length) -#endif /* DEBUG */ - -/* =========================================================================== - * Fill the window when the lookahead becomes insufficient. - * Updates strstart and lookahead. - * - * IN assertion: lookahead < MIN_LOOKAHEAD - * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD - * At least one byte has been read, or avail_in == 0; reads are - * performed for at least two bytes (required for the zip translate_eol - * option -- not supported here). - */ -local void fill_window(s) - deflate_state *s; -{ - register unsigned n, m; - register Posf *p; - unsigned more; /* Amount of free space at the end of the window. */ - uInt wsize = s->w_size; - - Assert(s->lookahead < MIN_LOOKAHEAD, "already enough lookahead"); - - do { - more = (unsigned)(s->window_size -(ulg)s->lookahead -(ulg)s->strstart); - - /* Deal with !@#$% 64K limit: */ - if (sizeof(int) <= 2) { - if (more == 0 && s->strstart == 0 && s->lookahead == 0) { - more = wsize; - - } else if (more == (unsigned)(-1)) { - /* Very unlikely, but possible on 16 bit machine if - * strstart == 0 && lookahead == 1 (input done a byte at time) - */ - more--; - } - } - - /* If the window is almost full and there is insufficient lookahead, - * move the upper half to the lower one to make room in the upper half. - */ - if (s->strstart >= wsize+MAX_DIST(s)) { - - zmemcpy(s->window, s->window+wsize, (unsigned)wsize); - s->match_start -= wsize; - s->strstart -= wsize; /* we now have strstart >= MAX_DIST */ - s->block_start -= (long) wsize; - - /* Slide the hash table (could be avoided with 32 bit values - at the expense of memory usage). We slide even when level == 0 - to keep the hash table consistent if we switch back to level > 0 - later. (Using level 0 permanently is not an optimal usage of - zlib, so we don't care about this pathological case.) - */ - n = s->hash_size; - p = &s->head[n]; - do { - m = *--p; - *p = (Pos)(m >= wsize ? m-wsize : NIL); - } while (--n); - - n = wsize; -#ifndef FASTEST - p = &s->prev[n]; - do { - m = *--p; - *p = (Pos)(m >= wsize ? m-wsize : NIL); - /* If n is not on any hash chain, prev[n] is garbage but - * its value will never be used. - */ - } while (--n); -#endif - more += wsize; - } - if (s->strm->avail_in == 0) break; - - /* If there was no sliding: - * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 && - * more == window_size - lookahead - strstart - * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1) - * => more >= window_size - 2*WSIZE + 2 - * In the BIG_MEM or MMAP case (not yet supported), - * window_size == input_size + MIN_LOOKAHEAD && - * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD. - * Otherwise, window_size == 2*WSIZE so more >= 2. - * If there was sliding, more >= WSIZE. So in all cases, more >= 2. - */ - Assert(more >= 2, "more < 2"); - - n = read_buf(s->strm, s->window + s->strstart + s->lookahead, more); - s->lookahead += n; - - /* Initialize the hash value now that we have some input: */ - if (s->lookahead + s->insert >= MIN_MATCH) { - uInt str = s->strstart - s->insert; - s->ins_h = s->window[str]; - UPDATE_HASH(s, s->ins_h, s->window[str + 1]); -#if MIN_MATCH != 3 - Call UPDATE_HASH() MIN_MATCH-3 more times -#endif - while (s->insert) { - UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); -#ifndef FASTEST - s->prev[str & s->w_mask] = s->head[s->ins_h]; -#endif - s->head[s->ins_h] = (Pos)str; - str++; - s->insert--; - if (s->lookahead + s->insert < MIN_MATCH) - break; - } - } - /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage, - * but this is not important since only literal bytes will be emitted. - */ - - } while (s->lookahead < MIN_LOOKAHEAD && s->strm->avail_in != 0); - - /* If the WIN_INIT bytes after the end of the current data have never been - * written, then zero those bytes in order to avoid memory check reports of - * the use of uninitialized (or uninitialised as Julian writes) bytes by - * the longest match routines. Update the high water mark for the next - * time through here. WIN_INIT is set to MAX_MATCH since the longest match - * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead. - */ - if (s->high_water < s->window_size) { - ulg curr = s->strstart + (ulg)(s->lookahead); - ulg init; - - if (s->high_water < curr) { - /* Previous high water mark below current data -- zero WIN_INIT - * bytes or up to end of window, whichever is less. - */ - init = s->window_size - curr; - if (init > WIN_INIT) - init = WIN_INIT; - zmemzero(s->window + curr, (unsigned)init); - s->high_water = curr + init; - } - else if (s->high_water < (ulg)curr + WIN_INIT) { - /* High water mark at or above current data, but below current data - * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up - * to end of window, whichever is less. - */ - init = (ulg)curr + WIN_INIT - s->high_water; - if (init > s->window_size - s->high_water) - init = s->window_size - s->high_water; - zmemzero(s->window + s->high_water, (unsigned)init); - s->high_water += init; - } - } - - Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD, - "not enough room for search"); -} - -/* =========================================================================== - * Flush the current block, with given end-of-file flag. - * IN assertion: strstart is set to the end of the current match. - */ -#define FLUSH_BLOCK_ONLY(s, last) { \ - _tr_flush_block(s, (s->block_start >= 0L ? \ - (charf *)&s->window[(unsigned)s->block_start] : \ - (charf *)Z_NULL), \ - (ulg)((long)s->strstart - s->block_start), \ - (last)); \ - s->block_start = s->strstart; \ - flush_pending(s->strm); \ - Tracev((stderr,"[FLUSH]")); \ -} - -/* Same but force premature exit if necessary. */ -#define FLUSH_BLOCK(s, last) { \ - FLUSH_BLOCK_ONLY(s, last); \ - if (s->strm->avail_out == 0) return (last) ? finish_started : need_more; \ -} - -/* =========================================================================== - * Copy without compression as much as possible from the input stream, return - * the current block state. - * This function does not insert new strings in the dictionary since - * uncompressible data is probably not useful. This function is used - * only for the level=0 compression option. - * NOTE: this function should be optimized to avoid extra copying from - * window to pending_buf. - */ -local block_state deflate_stored(s, flush) - deflate_state *s; - int flush; -{ - /* Stored blocks are limited to 0xffff bytes, pending_buf is limited - * to pending_buf_size, and each stored block has a 5 byte header: - */ - ulg max_block_size = 0xffff; - ulg max_start; - - if (max_block_size > s->pending_buf_size - 5) { - max_block_size = s->pending_buf_size - 5; - } - - /* Copy as much as possible from input to output: */ - for (;;) { - /* Fill the window as much as possible: */ - if (s->lookahead <= 1) { - - Assert(s->strstart < s->w_size+MAX_DIST(s) || - s->block_start >= (long)s->w_size, "slide too late"); - - fill_window(s); - if (s->lookahead == 0 && flush == Z_NO_FLUSH) return need_more; - - if (s->lookahead == 0) break; /* flush the current block */ - } - Assert(s->block_start >= 0L, "block gone"); - - s->strstart += s->lookahead; - s->lookahead = 0; - - /* Emit a stored block if pending_buf will be full: */ - max_start = s->block_start + max_block_size; - if (s->strstart == 0 || (ulg)s->strstart >= max_start) { - /* strstart == 0 is possible when wraparound on 16-bit machine */ - s->lookahead = (uInt)(s->strstart - max_start); - s->strstart = (uInt)max_start; - FLUSH_BLOCK(s, 0); - } - /* Flush if we may have to slide, otherwise block_start may become - * negative and the data will be gone: - */ - if (s->strstart - (uInt)s->block_start >= MAX_DIST(s)) { - FLUSH_BLOCK(s, 0); - } - } - s->insert = 0; - if (flush == Z_FINISH) { - FLUSH_BLOCK(s, 1); - return finish_done; - } - if ((long)s->strstart > s->block_start) - FLUSH_BLOCK(s, 0); - return block_done; -} - -/* =========================================================================== - * Compress as much as possible from the input stream, return the current - * block state. - * This function does not perform lazy evaluation of matches and inserts - * new strings in the dictionary only for unmatched strings or for short - * matches. It is used only for the fast compression options. - */ -local block_state deflate_fast(s, flush) - deflate_state *s; - int flush; -{ - IPos hash_head; /* head of the hash chain */ - int bflush; /* set if current block must be flushed */ - - for (;;) { - /* Make sure that we always have enough lookahead, except - * at the end of the input file. We need MAX_MATCH bytes - * for the next match, plus MIN_MATCH bytes to insert the - * string following the next match. - */ - if (s->lookahead < MIN_LOOKAHEAD) { - fill_window(s); - if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) { - return need_more; - } - if (s->lookahead == 0) break; /* flush the current block */ - } - - /* Insert the string window[strstart .. strstart+2] in the - * dictionary, and set hash_head to the head of the hash chain: - */ - hash_head = NIL; - if (s->lookahead >= MIN_MATCH) { - INSERT_STRING(s, s->strstart, hash_head); - } - - /* Find the longest match, discarding those <= prev_length. - * At this point we have always match_length < MIN_MATCH - */ - if (hash_head != NIL && s->strstart - hash_head <= MAX_DIST(s)) { - /* To simplify the code, we prevent matches with the string - * of window index 0 (in particular we have to avoid a match - * of the string with itself at the start of the input file). - */ - s->match_length = longest_match (s, hash_head); - /* longest_match() sets match_start */ - } - if (s->match_length >= MIN_MATCH) { - check_match(s, s->strstart, s->match_start, s->match_length); - - _tr_tally_dist(s, s->strstart - s->match_start, - s->match_length - MIN_MATCH, bflush); - - s->lookahead -= s->match_length; - - /* Insert new strings in the hash table only if the match length - * is not too large. This saves time but degrades compression. - */ -#ifndef FASTEST - if (s->match_length <= s->max_insert_length && - s->lookahead >= MIN_MATCH) { - s->match_length--; /* string at strstart already in table */ - do { - s->strstart++; - INSERT_STRING(s, s->strstart, hash_head); - /* strstart never exceeds WSIZE-MAX_MATCH, so there are - * always MIN_MATCH bytes ahead. - */ - } while (--s->match_length != 0); - s->strstart++; - } else -#endif - { - s->strstart += s->match_length; - s->match_length = 0; - s->ins_h = s->window[s->strstart]; - UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]); -#if MIN_MATCH != 3 - Call UPDATE_HASH() MIN_MATCH-3 more times -#endif - /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not - * matter since it will be recomputed at next deflate call. - */ - } - } else { - /* No match, output a literal byte */ - Tracevv((stderr,"%c", s->window[s->strstart])); - _tr_tally_lit (s, s->window[s->strstart], bflush); - s->lookahead--; - s->strstart++; - } - if (bflush) FLUSH_BLOCK(s, 0); - } - s->insert = s->strstart < MIN_MATCH-1 ? s->strstart : MIN_MATCH-1; - if (flush == Z_FINISH) { - FLUSH_BLOCK(s, 1); - return finish_done; - } - if (s->last_lit) - FLUSH_BLOCK(s, 0); - return block_done; -} - -#ifndef FASTEST -/* =========================================================================== - * Same as above, but achieves better compression. We use a lazy - * evaluation for matches: a match is finally adopted only if there is - * no better match at the next window position. - */ -local block_state deflate_slow(s, flush) - deflate_state *s; - int flush; -{ - IPos hash_head; /* head of hash chain */ - int bflush; /* set if current block must be flushed */ - - /* Process the input block. */ - for (;;) { - /* Make sure that we always have enough lookahead, except - * at the end of the input file. We need MAX_MATCH bytes - * for the next match, plus MIN_MATCH bytes to insert the - * string following the next match. - */ - if (s->lookahead < MIN_LOOKAHEAD) { - fill_window(s); - if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) { - return need_more; - } - if (s->lookahead == 0) break; /* flush the current block */ - } - - /* Insert the string window[strstart .. strstart+2] in the - * dictionary, and set hash_head to the head of the hash chain: - */ - hash_head = NIL; - if (s->lookahead >= MIN_MATCH) { - INSERT_STRING(s, s->strstart, hash_head); - } - - /* Find the longest match, discarding those <= prev_length. - */ - s->prev_length = s->match_length, s->prev_match = s->match_start; - s->match_length = MIN_MATCH-1; - - if (hash_head != NIL && s->prev_length < s->max_lazy_match && - s->strstart - hash_head <= MAX_DIST(s)) { - /* To simplify the code, we prevent matches with the string - * of window index 0 (in particular we have to avoid a match - * of the string with itself at the start of the input file). - */ - s->match_length = longest_match (s, hash_head); - /* longest_match() sets match_start */ - - if (s->match_length <= 5 && (s->strategy == Z_FILTERED -#if TOO_FAR <= 32767 - || (s->match_length == MIN_MATCH && - s->strstart - s->match_start > TOO_FAR) -#endif - )) { - - /* If prev_match is also MIN_MATCH, match_start is garbage - * but we will ignore the current match anyway. - */ - s->match_length = MIN_MATCH-1; - } - } - /* If there was a match at the previous step and the current - * match is not better, output the previous match: - */ - if (s->prev_length >= MIN_MATCH && s->match_length <= s->prev_length) { - uInt max_insert = s->strstart + s->lookahead - MIN_MATCH; - /* Do not insert strings in hash table beyond this. */ - - check_match(s, s->strstart-1, s->prev_match, s->prev_length); - - _tr_tally_dist(s, s->strstart -1 - s->prev_match, - s->prev_length - MIN_MATCH, bflush); - - /* Insert in hash table all strings up to the end of the match. - * strstart-1 and strstart are already inserted. If there is not - * enough lookahead, the last two strings are not inserted in - * the hash table. - */ - s->lookahead -= s->prev_length-1; - s->prev_length -= 2; - do { - if (++s->strstart <= max_insert) { - INSERT_STRING(s, s->strstart, hash_head); - } - } while (--s->prev_length != 0); - s->match_available = 0; - s->match_length = MIN_MATCH-1; - s->strstart++; - - if (bflush) FLUSH_BLOCK(s, 0); - - } else if (s->match_available) { - /* If there was no match at the previous position, output a - * single literal. If there was a match but the current match - * is longer, truncate the previous match to a single literal. - */ - Tracevv((stderr,"%c", s->window[s->strstart-1])); - _tr_tally_lit(s, s->window[s->strstart-1], bflush); - if (bflush) { - FLUSH_BLOCK_ONLY(s, 0); - } - s->strstart++; - s->lookahead--; - if (s->strm->avail_out == 0) return need_more; - } else { - /* There is no previous match to compare with, wait for - * the next step to decide. - */ - s->match_available = 1; - s->strstart++; - s->lookahead--; - } - } - Assert (flush != Z_NO_FLUSH, "no flush?"); - if (s->match_available) { - Tracevv((stderr,"%c", s->window[s->strstart-1])); - _tr_tally_lit(s, s->window[s->strstart-1], bflush); - s->match_available = 0; - } - s->insert = s->strstart < MIN_MATCH-1 ? s->strstart : MIN_MATCH-1; - if (flush == Z_FINISH) { - FLUSH_BLOCK(s, 1); - return finish_done; - } - if (s->last_lit) - FLUSH_BLOCK(s, 0); - return block_done; -} -#endif /* FASTEST */ - -/* =========================================================================== - * For Z_RLE, simply look for runs of bytes, generate matches only of distance - * one. Do not maintain a hash table. (It will be regenerated if this run of - * deflate switches away from Z_RLE.) - */ -local block_state deflate_rle(s, flush) - deflate_state *s; - int flush; -{ - int bflush; /* set if current block must be flushed */ - uInt prev; /* byte at distance one to match */ - Bytef *scan, *strend; /* scan goes up to strend for length of run */ - - for (;;) { - /* Make sure that we always have enough lookahead, except - * at the end of the input file. We need MAX_MATCH bytes - * for the longest run, plus one for the unrolled loop. - */ - if (s->lookahead <= MAX_MATCH) { - fill_window(s); - if (s->lookahead <= MAX_MATCH && flush == Z_NO_FLUSH) { - return need_more; - } - if (s->lookahead == 0) break; /* flush the current block */ - } - - /* See how many times the previous byte repeats */ - s->match_length = 0; - if (s->lookahead >= MIN_MATCH && s->strstart > 0) { - scan = s->window + s->strstart - 1; - prev = *scan; - if (prev == *++scan && prev == *++scan && prev == *++scan) { - strend = s->window + s->strstart + MAX_MATCH; - do { - } while (prev == *++scan && prev == *++scan && - prev == *++scan && prev == *++scan && - prev == *++scan && prev == *++scan && - prev == *++scan && prev == *++scan && - scan < strend); - s->match_length = MAX_MATCH - (int)(strend - scan); - if (s->match_length > s->lookahead) - s->match_length = s->lookahead; - } - Assert(scan <= s->window+(uInt)(s->window_size-1), "wild scan"); - } - - /* Emit match if have run of MIN_MATCH or longer, else emit literal */ - if (s->match_length >= MIN_MATCH) { - check_match(s, s->strstart, s->strstart - 1, s->match_length); - - _tr_tally_dist(s, 1, s->match_length - MIN_MATCH, bflush); - - s->lookahead -= s->match_length; - s->strstart += s->match_length; - s->match_length = 0; - } else { - /* No match, output a literal byte */ - Tracevv((stderr,"%c", s->window[s->strstart])); - _tr_tally_lit (s, s->window[s->strstart], bflush); - s->lookahead--; - s->strstart++; - } - if (bflush) FLUSH_BLOCK(s, 0); - } - s->insert = 0; - if (flush == Z_FINISH) { - FLUSH_BLOCK(s, 1); - return finish_done; - } - if (s->last_lit) - FLUSH_BLOCK(s, 0); - return block_done; -} - -/* =========================================================================== - * For Z_HUFFMAN_ONLY, do not look for matches. Do not maintain a hash table. - * (It will be regenerated if this run of deflate switches away from Huffman.) - */ -local block_state deflate_huff(s, flush) - deflate_state *s; - int flush; -{ - int bflush; /* set if current block must be flushed */ - - for (;;) { - /* Make sure that we have a literal to write. */ - if (s->lookahead == 0) { - fill_window(s); - if (s->lookahead == 0) { - if (flush == Z_NO_FLUSH) - return need_more; - break; /* flush the current block */ - } - } - - /* Output a literal byte */ - s->match_length = 0; - Tracevv((stderr,"%c", s->window[s->strstart])); - _tr_tally_lit (s, s->window[s->strstart], bflush); - s->lookahead--; - s->strstart++; - if (bflush) FLUSH_BLOCK(s, 0); - } - s->insert = 0; - if (flush == Z_FINISH) { - FLUSH_BLOCK(s, 1); - return finish_done; - } - if (s->last_lit) - FLUSH_BLOCK(s, 0); - return block_done; -} diff --git a/vendor/libgit2/deps/zlib/deflate.h b/vendor/libgit2/deps/zlib/deflate.h deleted file mode 100644 index a17c8365c7..0000000000 --- a/vendor/libgit2/deps/zlib/deflate.h +++ /dev/null @@ -1,346 +0,0 @@ -/* deflate.h -- internal compression state - * Copyright (C) 1995-2012 Jean-loup Gailly - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* WARNING: this file should *not* be used by applications. It is - part of the implementation of the compression library and is - subject to change. Applications should only use zlib.h. - */ - -/* @(#) $Id$ */ - -#ifndef DEFLATE_H -#define DEFLATE_H - -#include "zutil.h" - -/* define NO_GZIP when compiling if you want to disable gzip header and - trailer creation by deflate(). NO_GZIP would be used to avoid linking in - the crc code when it is not needed. For shared libraries, gzip encoding - should be left enabled. */ -#ifndef NO_GZIP -# define GZIP -#endif - -/* =========================================================================== - * Internal compression state. - */ - -#define LENGTH_CODES 29 -/* number of length codes, not counting the special END_BLOCK code */ - -#define LITERALS 256 -/* number of literal bytes 0..255 */ - -#define L_CODES (LITERALS+1+LENGTH_CODES) -/* number of Literal or Length codes, including the END_BLOCK code */ - -#define D_CODES 30 -/* number of distance codes */ - -#define BL_CODES 19 -/* number of codes used to transfer the bit lengths */ - -#define HEAP_SIZE (2*L_CODES+1) -/* maximum heap size */ - -#define MAX_BITS 15 -/* All codes must not exceed MAX_BITS bits */ - -#define Buf_size 16 -/* size of bit buffer in bi_buf */ - -#define INIT_STATE 42 -#define EXTRA_STATE 69 -#define NAME_STATE 73 -#define COMMENT_STATE 91 -#define HCRC_STATE 103 -#define BUSY_STATE 113 -#define FINISH_STATE 666 -/* Stream status */ - - -/* Data structure describing a single value and its code string. */ -typedef struct ct_data_s { - union { - ush freq; /* frequency count */ - ush code; /* bit string */ - } fc; - union { - ush dad; /* father node in Huffman tree */ - ush len; /* length of bit string */ - } dl; -} FAR ct_data; - -#define Freq fc.freq -#define Code fc.code -#define Dad dl.dad -#define Len dl.len - -typedef struct static_tree_desc_s static_tree_desc; - -typedef struct tree_desc_s { - ct_data *dyn_tree; /* the dynamic tree */ - int max_code; /* largest code with non zero frequency */ - static_tree_desc *stat_desc; /* the corresponding static tree */ -} FAR tree_desc; - -typedef ush Pos; -typedef Pos FAR Posf; -typedef unsigned IPos; - -/* A Pos is an index in the character window. We use short instead of int to - * save space in the various tables. IPos is used only for parameter passing. - */ - -typedef struct internal_state { - z_streamp strm; /* pointer back to this zlib stream */ - int status; /* as the name implies */ - Bytef *pending_buf; /* output still pending */ - ulg pending_buf_size; /* size of pending_buf */ - Bytef *pending_out; /* next pending byte to output to the stream */ - uInt pending; /* nb of bytes in the pending buffer */ - int wrap; /* bit 0 true for zlib, bit 1 true for gzip */ - gz_headerp gzhead; /* gzip header information to write */ - uInt gzindex; /* where in extra, name, or comment */ - Byte method; /* can only be DEFLATED */ - int last_flush; /* value of flush param for previous deflate call */ - - /* used by deflate.c: */ - - uInt w_size; /* LZ77 window size (32K by default) */ - uInt w_bits; /* log2(w_size) (8..16) */ - uInt w_mask; /* w_size - 1 */ - - Bytef *window; - /* Sliding window. Input bytes are read into the second half of the window, - * and move to the first half later to keep a dictionary of at least wSize - * bytes. With this organization, matches are limited to a distance of - * wSize-MAX_MATCH bytes, but this ensures that IO is always - * performed with a length multiple of the block size. Also, it limits - * the window size to 64K, which is quite useful on MSDOS. - * To do: use the user input buffer as sliding window. - */ - - ulg window_size; - /* Actual size of window: 2*wSize, except when the user input buffer - * is directly used as sliding window. - */ - - Posf *prev; - /* Link to older string with same hash index. To limit the size of this - * array to 64K, this link is maintained only for the last 32K strings. - * An index in this array is thus a window index modulo 32K. - */ - - Posf *head; /* Heads of the hash chains or NIL. */ - - uInt ins_h; /* hash index of string to be inserted */ - uInt hash_size; /* number of elements in hash table */ - uInt hash_bits; /* log2(hash_size) */ - uInt hash_mask; /* hash_size-1 */ - - uInt hash_shift; - /* Number of bits by which ins_h must be shifted at each input - * step. It must be such that after MIN_MATCH steps, the oldest - * byte no longer takes part in the hash key, that is: - * hash_shift * MIN_MATCH >= hash_bits - */ - - long block_start; - /* Window position at the beginning of the current output block. Gets - * negative when the window is moved backwards. - */ - - uInt match_length; /* length of best match */ - IPos prev_match; /* previous match */ - int match_available; /* set if previous match exists */ - uInt strstart; /* start of string to insert */ - uInt match_start; /* start of matching string */ - uInt lookahead; /* number of valid bytes ahead in window */ - - uInt prev_length; - /* Length of the best match at previous step. Matches not greater than this - * are discarded. This is used in the lazy match evaluation. - */ - - uInt max_chain_length; - /* To speed up deflation, hash chains are never searched beyond this - * length. A higher limit improves compression ratio but degrades the - * speed. - */ - - uInt max_lazy_match; - /* Attempt to find a better match only when the current match is strictly - * smaller than this value. This mechanism is used only for compression - * levels >= 4. - */ -# define max_insert_length max_lazy_match - /* Insert new strings in the hash table only if the match length is not - * greater than this length. This saves time but degrades compression. - * max_insert_length is used only for compression levels <= 3. - */ - - int level; /* compression level (1..9) */ - int strategy; /* favor or force Huffman coding*/ - - uInt good_match; - /* Use a faster search when the previous match is longer than this */ - - int nice_match; /* Stop searching when current match exceeds this */ - - /* used by trees.c: */ - /* Didn't use ct_data typedef below to suppress compiler warning */ - struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */ - struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */ - struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */ - - struct tree_desc_s l_desc; /* desc. for literal tree */ - struct tree_desc_s d_desc; /* desc. for distance tree */ - struct tree_desc_s bl_desc; /* desc. for bit length tree */ - - ush bl_count[MAX_BITS+1]; - /* number of codes at each bit length for an optimal tree */ - - int heap[2*L_CODES+1]; /* heap used to build the Huffman trees */ - int heap_len; /* number of elements in the heap */ - int heap_max; /* element of largest frequency */ - /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used. - * The same heap array is used to build all trees. - */ - - uch depth[2*L_CODES+1]; - /* Depth of each subtree used as tie breaker for trees of equal frequency - */ - - uchf *l_buf; /* buffer for literals or lengths */ - - uInt lit_bufsize; - /* Size of match buffer for literals/lengths. There are 4 reasons for - * limiting lit_bufsize to 64K: - * - frequencies can be kept in 16 bit counters - * - if compression is not successful for the first block, all input - * data is still in the window so we can still emit a stored block even - * when input comes from standard input. (This can also be done for - * all blocks if lit_bufsize is not greater than 32K.) - * - if compression is not successful for a file smaller than 64K, we can - * even emit a stored file instead of a stored block (saving 5 bytes). - * This is applicable only for zip (not gzip or zlib). - * - creating new Huffman trees less frequently may not provide fast - * adaptation to changes in the input data statistics. (Take for - * example a binary file with poorly compressible code followed by - * a highly compressible string table.) Smaller buffer sizes give - * fast adaptation but have of course the overhead of transmitting - * trees more frequently. - * - I can't count above 4 - */ - - uInt last_lit; /* running index in l_buf */ - - ushf *d_buf; - /* Buffer for distances. To simplify the code, d_buf and l_buf have - * the same number of elements. To use different lengths, an extra flag - * array would be necessary. - */ - - ulg opt_len; /* bit length of current block with optimal trees */ - ulg static_len; /* bit length of current block with static trees */ - uInt matches; /* number of string matches in current block */ - uInt insert; /* bytes at end of window left to insert */ - -#ifdef DEBUG - ulg compressed_len; /* total bit length of compressed file mod 2^32 */ - ulg bits_sent; /* bit length of compressed data sent mod 2^32 */ -#endif - - ush bi_buf; - /* Output buffer. bits are inserted starting at the bottom (least - * significant bits). - */ - int bi_valid; - /* Number of valid bits in bi_buf. All bits above the last valid bit - * are always zero. - */ - - ulg high_water; - /* High water mark offset in window for initialized bytes -- bytes above - * this are set to zero in order to avoid memory check warnings when - * longest match routines access bytes past the input. This is then - * updated to the new high water mark. - */ - -} FAR deflate_state; - -/* Output a byte on the stream. - * IN assertion: there is enough room in pending_buf. - */ -#define put_byte(s, c) {s->pending_buf[s->pending++] = (c);} - - -#define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1) -/* Minimum amount of lookahead, except at the end of the input file. - * See deflate.c for comments about the MIN_MATCH+1. - */ - -#define MAX_DIST(s) ((s)->w_size-MIN_LOOKAHEAD) -/* In order to simplify the code, particularly on 16 bit machines, match - * distances are limited to MAX_DIST instead of WSIZE. - */ - -#define WIN_INIT MAX_MATCH -/* Number of bytes after end of data in window to initialize in order to avoid - memory checker errors from longest match routines */ - - /* in trees.c */ -void ZLIB_INTERNAL _tr_init OF((deflate_state *s)); -int ZLIB_INTERNAL _tr_tally OF((deflate_state *s, unsigned dist, unsigned lc)); -void ZLIB_INTERNAL _tr_flush_block OF((deflate_state *s, charf *buf, - ulg stored_len, int last)); -void ZLIB_INTERNAL _tr_flush_bits OF((deflate_state *s)); -void ZLIB_INTERNAL _tr_align OF((deflate_state *s)); -void ZLIB_INTERNAL _tr_stored_block OF((deflate_state *s, charf *buf, - ulg stored_len, int last)); - -#define d_code(dist) \ - ((dist) < 256 ? _dist_code[dist] : _dist_code[256+((dist)>>7)]) -/* Mapping from a distance to a distance code. dist is the distance - 1 and - * must not have side effects. _dist_code[256] and _dist_code[257] are never - * used. - */ - -#ifndef DEBUG -/* Inline versions of _tr_tally for speed: */ - -#if defined(GEN_TREES_H) || !defined(STDC) - extern uch ZLIB_INTERNAL _length_code[]; - extern uch ZLIB_INTERNAL _dist_code[]; -#else - extern const uch ZLIB_INTERNAL _length_code[]; - extern const uch ZLIB_INTERNAL _dist_code[]; -#endif - -# define _tr_tally_lit(s, c, flush) \ - { uch cc = (uch)(c); \ - s->d_buf[s->last_lit] = 0; \ - s->l_buf[s->last_lit++] = cc; \ - s->dyn_ltree[cc].Freq++; \ - flush = (s->last_lit == s->lit_bufsize-1); \ - } -# define _tr_tally_dist(s, distance, length, flush) \ - { uch len = (uch)(length); \ - ush dist = (ush)(distance); \ - s->d_buf[s->last_lit] = dist; \ - s->l_buf[s->last_lit++] = len; \ - dist--; \ - s->dyn_ltree[_length_code[len]+LITERALS+1].Freq++; \ - s->dyn_dtree[d_code(dist)].Freq++; \ - flush = (s->last_lit == s->lit_bufsize-1); \ - } -#else -# define _tr_tally_lit(s, c, flush) flush = _tr_tally(s, 0, c) -# define _tr_tally_dist(s, distance, length, flush) \ - flush = _tr_tally(s, distance, length) -#endif - -#endif /* DEFLATE_H */ diff --git a/vendor/libgit2/deps/zlib/infback.c b/vendor/libgit2/deps/zlib/infback.c deleted file mode 100644 index f3833c2e43..0000000000 --- a/vendor/libgit2/deps/zlib/infback.c +++ /dev/null @@ -1,640 +0,0 @@ -/* infback.c -- inflate using a call-back interface - * Copyright (C) 1995-2011 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* - This code is largely copied from inflate.c. Normally either infback.o or - inflate.o would be linked into an application--not both. The interface - with inffast.c is retained so that optimized assembler-coded versions of - inflate_fast() can be used with either inflate.c or infback.c. - */ - -#include "zutil.h" -#include "inftrees.h" -#include "inflate.h" -#include "inffast.h" - -/* function prototypes */ -local void fixedtables OF((struct inflate_state FAR *state)); - -/* - strm provides memory allocation functions in zalloc and zfree, or - Z_NULL to use the library memory allocation functions. - - windowBits is in the range 8..15, and window is a user-supplied - window and output buffer that is 2**windowBits bytes. - */ -int ZEXPORT inflateBackInit_(strm, windowBits, window, version, stream_size) -z_streamp strm; -int windowBits; -unsigned char FAR *window; -const char *version; -int stream_size; -{ - struct inflate_state FAR *state; - - if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || - stream_size != (int)(sizeof(z_stream))) - return Z_VERSION_ERROR; - if (strm == Z_NULL || window == Z_NULL || - windowBits < 8 || windowBits > 15) - return Z_STREAM_ERROR; - strm->msg = Z_NULL; /* in case we return an error */ - if (strm->zalloc == (alloc_func)0) { -#ifdef Z_SOLO - return Z_STREAM_ERROR; -#else - strm->zalloc = zcalloc; - strm->opaque = (voidpf)0; -#endif - } - if (strm->zfree == (free_func)0) -#ifdef Z_SOLO - return Z_STREAM_ERROR; -#else - strm->zfree = zcfree; -#endif - state = (struct inflate_state FAR *)ZALLOC(strm, 1, - sizeof(struct inflate_state)); - if (state == Z_NULL) return Z_MEM_ERROR; - Tracev((stderr, "inflate: allocated\n")); - strm->state = (struct internal_state FAR *)state; - state->dmax = 32768U; - state->wbits = windowBits; - state->wsize = 1U << windowBits; - state->window = window; - state->wnext = 0; - state->whave = 0; - return Z_OK; -} - -/* - Return state with length and distance decoding tables and index sizes set to - fixed code decoding. Normally this returns fixed tables from inffixed.h. - If BUILDFIXED is defined, then instead this routine builds the tables the - first time it's called, and returns those tables the first time and - thereafter. This reduces the size of the code by about 2K bytes, in - exchange for a little execution time. However, BUILDFIXED should not be - used for threaded applications, since the rewriting of the tables and virgin - may not be thread-safe. - */ -local void fixedtables(state) -struct inflate_state FAR *state; -{ -#ifdef BUILDFIXED - static int virgin = 1; - static code *lenfix, *distfix; - static code fixed[544]; - - /* build fixed huffman tables if first call (may not be thread safe) */ - if (virgin) { - unsigned sym, bits; - static code *next; - - /* literal/length table */ - sym = 0; - while (sym < 144) state->lens[sym++] = 8; - while (sym < 256) state->lens[sym++] = 9; - while (sym < 280) state->lens[sym++] = 7; - while (sym < 288) state->lens[sym++] = 8; - next = fixed; - lenfix = next; - bits = 9; - inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work); - - /* distance table */ - sym = 0; - while (sym < 32) state->lens[sym++] = 5; - distfix = next; - bits = 5; - inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work); - - /* do this just once */ - virgin = 0; - } -#else /* !BUILDFIXED */ -# include "inffixed.h" -#endif /* BUILDFIXED */ - state->lencode = lenfix; - state->lenbits = 9; - state->distcode = distfix; - state->distbits = 5; -} - -/* Macros for inflateBack(): */ - -/* Load returned state from inflate_fast() */ -#define LOAD() \ - do { \ - put = strm->next_out; \ - left = strm->avail_out; \ - next = strm->next_in; \ - have = strm->avail_in; \ - hold = state->hold; \ - bits = state->bits; \ - } while (0) - -/* Set state from registers for inflate_fast() */ -#define RESTORE() \ - do { \ - strm->next_out = put; \ - strm->avail_out = left; \ - strm->next_in = next; \ - strm->avail_in = have; \ - state->hold = hold; \ - state->bits = bits; \ - } while (0) - -/* Clear the input bit accumulator */ -#define INITBITS() \ - do { \ - hold = 0; \ - bits = 0; \ - } while (0) - -/* Assure that some input is available. If input is requested, but denied, - then return a Z_BUF_ERROR from inflateBack(). */ -#define PULL() \ - do { \ - if (have == 0) { \ - have = in(in_desc, &next); \ - if (have == 0) { \ - next = Z_NULL; \ - ret = Z_BUF_ERROR; \ - goto inf_leave; \ - } \ - } \ - } while (0) - -/* Get a byte of input into the bit accumulator, or return from inflateBack() - with an error if there is no input available. */ -#define PULLBYTE() \ - do { \ - PULL(); \ - have--; \ - hold += (unsigned long)(*next++) << bits; \ - bits += 8; \ - } while (0) - -/* Assure that there are at least n bits in the bit accumulator. If there is - not enough available input to do that, then return from inflateBack() with - an error. */ -#define NEEDBITS(n) \ - do { \ - while (bits < (unsigned)(n)) \ - PULLBYTE(); \ - } while (0) - -/* Return the low n bits of the bit accumulator (n < 16) */ -#define BITS(n) \ - ((unsigned)hold & ((1U << (n)) - 1)) - -/* Remove n bits from the bit accumulator */ -#define DROPBITS(n) \ - do { \ - hold >>= (n); \ - bits -= (unsigned)(n); \ - } while (0) - -/* Remove zero to seven bits as needed to go to a byte boundary */ -#define BYTEBITS() \ - do { \ - hold >>= bits & 7; \ - bits -= bits & 7; \ - } while (0) - -/* Assure that some output space is available, by writing out the window - if it's full. If the write fails, return from inflateBack() with a - Z_BUF_ERROR. */ -#define ROOM() \ - do { \ - if (left == 0) { \ - put = state->window; \ - left = state->wsize; \ - state->whave = left; \ - if (out(out_desc, put, left)) { \ - ret = Z_BUF_ERROR; \ - goto inf_leave; \ - } \ - } \ - } while (0) - -/* - strm provides the memory allocation functions and window buffer on input, - and provides information on the unused input on return. For Z_DATA_ERROR - returns, strm will also provide an error message. - - in() and out() are the call-back input and output functions. When - inflateBack() needs more input, it calls in(). When inflateBack() has - filled the window with output, or when it completes with data in the - window, it calls out() to write out the data. The application must not - change the provided input until in() is called again or inflateBack() - returns. The application must not change the window/output buffer until - inflateBack() returns. - - in() and out() are called with a descriptor parameter provided in the - inflateBack() call. This parameter can be a structure that provides the - information required to do the read or write, as well as accumulated - information on the input and output such as totals and check values. - - in() should return zero on failure. out() should return non-zero on - failure. If either in() or out() fails, than inflateBack() returns a - Z_BUF_ERROR. strm->next_in can be checked for Z_NULL to see whether it - was in() or out() that caused in the error. Otherwise, inflateBack() - returns Z_STREAM_END on success, Z_DATA_ERROR for an deflate format - error, or Z_MEM_ERROR if it could not allocate memory for the state. - inflateBack() can also return Z_STREAM_ERROR if the input parameters - are not correct, i.e. strm is Z_NULL or the state was not initialized. - */ -int ZEXPORT inflateBack(strm, in, in_desc, out, out_desc) -z_streamp strm; -in_func in; -void FAR *in_desc; -out_func out; -void FAR *out_desc; -{ - struct inflate_state FAR *state; - z_const unsigned char FAR *next; /* next input */ - unsigned char FAR *put; /* next output */ - unsigned have, left; /* available input and output */ - unsigned long hold; /* bit buffer */ - unsigned bits; /* bits in bit buffer */ - unsigned copy; /* number of stored or match bytes to copy */ - unsigned char FAR *from; /* where to copy match bytes from */ - code here; /* current decoding table entry */ - code last; /* parent table entry */ - unsigned len; /* length to copy for repeats, bits to drop */ - int ret; /* return code */ - static const unsigned short order[19] = /* permutation of code lengths */ - {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; - - /* Check that the strm exists and that the state was initialized */ - if (strm == Z_NULL || strm->state == Z_NULL) - return Z_STREAM_ERROR; - state = (struct inflate_state FAR *)strm->state; - - /* Reset the state */ - strm->msg = Z_NULL; - state->mode = TYPE; - state->last = 0; - state->whave = 0; - next = strm->next_in; - have = next != Z_NULL ? strm->avail_in : 0; - hold = 0; - bits = 0; - put = state->window; - left = state->wsize; - - /* Inflate until end of block marked as last */ - for (;;) - switch (state->mode) { - case TYPE: - /* determine and dispatch block type */ - if (state->last) { - BYTEBITS(); - state->mode = DONE; - break; - } - NEEDBITS(3); - state->last = BITS(1); - DROPBITS(1); - switch (BITS(2)) { - case 0: /* stored block */ - Tracev((stderr, "inflate: stored block%s\n", - state->last ? " (last)" : "")); - state->mode = STORED; - break; - case 1: /* fixed block */ - fixedtables(state); - Tracev((stderr, "inflate: fixed codes block%s\n", - state->last ? " (last)" : "")); - state->mode = LEN; /* decode codes */ - break; - case 2: /* dynamic block */ - Tracev((stderr, "inflate: dynamic codes block%s\n", - state->last ? " (last)" : "")); - state->mode = TABLE; - break; - case 3: - strm->msg = (char *)"invalid block type"; - state->mode = BAD; - } - DROPBITS(2); - break; - - case STORED: - /* get and verify stored block length */ - BYTEBITS(); /* go to byte boundary */ - NEEDBITS(32); - if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) { - strm->msg = (char *)"invalid stored block lengths"; - state->mode = BAD; - break; - } - state->length = (unsigned)hold & 0xffff; - Tracev((stderr, "inflate: stored length %u\n", - state->length)); - INITBITS(); - - /* copy stored block from input to output */ - while (state->length != 0) { - copy = state->length; - PULL(); - ROOM(); - if (copy > have) copy = have; - if (copy > left) copy = left; - zmemcpy(put, next, copy); - have -= copy; - next += copy; - left -= copy; - put += copy; - state->length -= copy; - } - Tracev((stderr, "inflate: stored end\n")); - state->mode = TYPE; - break; - - case TABLE: - /* get dynamic table entries descriptor */ - NEEDBITS(14); - state->nlen = BITS(5) + 257; - DROPBITS(5); - state->ndist = BITS(5) + 1; - DROPBITS(5); - state->ncode = BITS(4) + 4; - DROPBITS(4); -#ifndef PKZIP_BUG_WORKAROUND - if (state->nlen > 286 || state->ndist > 30) { - strm->msg = (char *)"too many length or distance symbols"; - state->mode = BAD; - break; - } -#endif - Tracev((stderr, "inflate: table sizes ok\n")); - - /* get code length code lengths (not a typo) */ - state->have = 0; - while (state->have < state->ncode) { - NEEDBITS(3); - state->lens[order[state->have++]] = (unsigned short)BITS(3); - DROPBITS(3); - } - while (state->have < 19) - state->lens[order[state->have++]] = 0; - state->next = state->codes; - state->lencode = (code const FAR *)(state->next); - state->lenbits = 7; - ret = inflate_table(CODES, state->lens, 19, &(state->next), - &(state->lenbits), state->work); - if (ret) { - strm->msg = (char *)"invalid code lengths set"; - state->mode = BAD; - break; - } - Tracev((stderr, "inflate: code lengths ok\n")); - - /* get length and distance code code lengths */ - state->have = 0; - while (state->have < state->nlen + state->ndist) { - for (;;) { - here = state->lencode[BITS(state->lenbits)]; - if ((unsigned)(here.bits) <= bits) break; - PULLBYTE(); - } - if (here.val < 16) { - DROPBITS(here.bits); - state->lens[state->have++] = here.val; - } - else { - if (here.val == 16) { - NEEDBITS(here.bits + 2); - DROPBITS(here.bits); - if (state->have == 0) { - strm->msg = (char *)"invalid bit length repeat"; - state->mode = BAD; - break; - } - len = (unsigned)(state->lens[state->have - 1]); - copy = 3 + BITS(2); - DROPBITS(2); - } - else if (here.val == 17) { - NEEDBITS(here.bits + 3); - DROPBITS(here.bits); - len = 0; - copy = 3 + BITS(3); - DROPBITS(3); - } - else { - NEEDBITS(here.bits + 7); - DROPBITS(here.bits); - len = 0; - copy = 11 + BITS(7); - DROPBITS(7); - } - if (state->have + copy > state->nlen + state->ndist) { - strm->msg = (char *)"invalid bit length repeat"; - state->mode = BAD; - break; - } - while (copy--) - state->lens[state->have++] = (unsigned short)len; - } - } - - /* handle error breaks in while */ - if (state->mode == BAD) break; - - /* check for end-of-block code (better have one) */ - if (state->lens[256] == 0) { - strm->msg = (char *)"invalid code -- missing end-of-block"; - state->mode = BAD; - break; - } - - /* build code tables -- note: do not change the lenbits or distbits - values here (9 and 6) without reading the comments in inftrees.h - concerning the ENOUGH constants, which depend on those values */ - state->next = state->codes; - state->lencode = (code const FAR *)(state->next); - state->lenbits = 9; - ret = inflate_table(LENS, state->lens, state->nlen, &(state->next), - &(state->lenbits), state->work); - if (ret) { - strm->msg = (char *)"invalid literal/lengths set"; - state->mode = BAD; - break; - } - state->distcode = (code const FAR *)(state->next); - state->distbits = 6; - ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist, - &(state->next), &(state->distbits), state->work); - if (ret) { - strm->msg = (char *)"invalid distances set"; - state->mode = BAD; - break; - } - Tracev((stderr, "inflate: codes ok\n")); - state->mode = LEN; - - case LEN: - /* use inflate_fast() if we have enough input and output */ - if (have >= 6 && left >= 258) { - RESTORE(); - if (state->whave < state->wsize) - state->whave = state->wsize - left; - inflate_fast(strm, state->wsize); - LOAD(); - break; - } - - /* get a literal, length, or end-of-block code */ - for (;;) { - here = state->lencode[BITS(state->lenbits)]; - if ((unsigned)(here.bits) <= bits) break; - PULLBYTE(); - } - if (here.op && (here.op & 0xf0) == 0) { - last = here; - for (;;) { - here = state->lencode[last.val + - (BITS(last.bits + last.op) >> last.bits)]; - if ((unsigned)(last.bits + here.bits) <= bits) break; - PULLBYTE(); - } - DROPBITS(last.bits); - } - DROPBITS(here.bits); - state->length = (unsigned)here.val; - - /* process literal */ - if (here.op == 0) { - Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? - "inflate: literal '%c'\n" : - "inflate: literal 0x%02x\n", here.val)); - ROOM(); - *put++ = (unsigned char)(state->length); - left--; - state->mode = LEN; - break; - } - - /* process end of block */ - if (here.op & 32) { - Tracevv((stderr, "inflate: end of block\n")); - state->mode = TYPE; - break; - } - - /* invalid code */ - if (here.op & 64) { - strm->msg = (char *)"invalid literal/length code"; - state->mode = BAD; - break; - } - - /* length code -- get extra bits, if any */ - state->extra = (unsigned)(here.op) & 15; - if (state->extra != 0) { - NEEDBITS(state->extra); - state->length += BITS(state->extra); - DROPBITS(state->extra); - } - Tracevv((stderr, "inflate: length %u\n", state->length)); - - /* get distance code */ - for (;;) { - here = state->distcode[BITS(state->distbits)]; - if ((unsigned)(here.bits) <= bits) break; - PULLBYTE(); - } - if ((here.op & 0xf0) == 0) { - last = here; - for (;;) { - here = state->distcode[last.val + - (BITS(last.bits + last.op) >> last.bits)]; - if ((unsigned)(last.bits + here.bits) <= bits) break; - PULLBYTE(); - } - DROPBITS(last.bits); - } - DROPBITS(here.bits); - if (here.op & 64) { - strm->msg = (char *)"invalid distance code"; - state->mode = BAD; - break; - } - state->offset = (unsigned)here.val; - - /* get distance extra bits, if any */ - state->extra = (unsigned)(here.op) & 15; - if (state->extra != 0) { - NEEDBITS(state->extra); - state->offset += BITS(state->extra); - DROPBITS(state->extra); - } - if (state->offset > state->wsize - (state->whave < state->wsize ? - left : 0)) { - strm->msg = (char *)"invalid distance too far back"; - state->mode = BAD; - break; - } - Tracevv((stderr, "inflate: distance %u\n", state->offset)); - - /* copy match from window to output */ - do { - ROOM(); - copy = state->wsize - state->offset; - if (copy < left) { - from = put + copy; - copy = left - copy; - } - else { - from = put - state->offset; - copy = left; - } - if (copy > state->length) copy = state->length; - state->length -= copy; - left -= copy; - do { - *put++ = *from++; - } while (--copy); - } while (state->length != 0); - break; - - case DONE: - /* inflate stream terminated properly -- write leftover output */ - ret = Z_STREAM_END; - if (left < state->wsize) { - if (out(out_desc, state->window, state->wsize - left)) - ret = Z_BUF_ERROR; - } - goto inf_leave; - - case BAD: - ret = Z_DATA_ERROR; - goto inf_leave; - - default: /* can't happen, but makes compilers happy */ - ret = Z_STREAM_ERROR; - goto inf_leave; - } - - /* Return unused input */ - inf_leave: - strm->next_in = next; - strm->avail_in = have; - return ret; -} - -int ZEXPORT inflateBackEnd(strm) -z_streamp strm; -{ - if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0) - return Z_STREAM_ERROR; - ZFREE(strm, strm->state); - strm->state = Z_NULL; - Tracev((stderr, "inflate: end\n")); - return Z_OK; -} diff --git a/vendor/libgit2/deps/zlib/inffast.c b/vendor/libgit2/deps/zlib/inffast.c deleted file mode 100644 index bda59ceb6a..0000000000 --- a/vendor/libgit2/deps/zlib/inffast.c +++ /dev/null @@ -1,340 +0,0 @@ -/* inffast.c -- fast decoding - * Copyright (C) 1995-2008, 2010, 2013 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -#include "zutil.h" -#include "inftrees.h" -#include "inflate.h" -#include "inffast.h" - -#ifndef ASMINF - -/* Allow machine dependent optimization for post-increment or pre-increment. - Based on testing to date, - Pre-increment preferred for: - - PowerPC G3 (Adler) - - MIPS R5000 (Randers-Pehrson) - Post-increment preferred for: - - none - No measurable difference: - - Pentium III (Anderson) - - M68060 (Nikl) - */ -#ifdef POSTINC -# define OFF 0 -# define PUP(a) *(a)++ -#else -# define OFF 1 -# define PUP(a) *++(a) -#endif - -/* - Decode literal, length, and distance codes and write out the resulting - literal and match bytes until either not enough input or output is - available, an end-of-block is encountered, or a data error is encountered. - When large enough input and output buffers are supplied to inflate(), for - example, a 16K input buffer and a 64K output buffer, more than 95% of the - inflate execution time is spent in this routine. - - Entry assumptions: - - state->mode == LEN - strm->avail_in >= 6 - strm->avail_out >= 258 - start >= strm->avail_out - state->bits < 8 - - On return, state->mode is one of: - - LEN -- ran out of enough output space or enough available input - TYPE -- reached end of block code, inflate() to interpret next block - BAD -- error in block data - - Notes: - - - The maximum input bits used by a length/distance pair is 15 bits for the - length code, 5 bits for the length extra, 15 bits for the distance code, - and 13 bits for the distance extra. This totals 48 bits, or six bytes. - Therefore if strm->avail_in >= 6, then there is enough input to avoid - checking for available input while decoding. - - - The maximum bytes that a single length/distance pair can output is 258 - bytes, which is the maximum length that can be coded. inflate_fast() - requires strm->avail_out >= 258 for each loop to avoid checking for - output space. - */ -void ZLIB_INTERNAL inflate_fast(strm, start) -z_streamp strm; -unsigned start; /* inflate()'s starting value for strm->avail_out */ -{ - struct inflate_state FAR *state; - z_const unsigned char FAR *in; /* local strm->next_in */ - z_const unsigned char FAR *last; /* have enough input while in < last */ - unsigned char FAR *out; /* local strm->next_out */ - unsigned char FAR *beg; /* inflate()'s initial strm->next_out */ - unsigned char FAR *end; /* while out < end, enough space available */ -#ifdef INFLATE_STRICT - unsigned dmax; /* maximum distance from zlib header */ -#endif - unsigned wsize; /* window size or zero if not using window */ - unsigned whave; /* valid bytes in the window */ - unsigned wnext; /* window write index */ - unsigned char FAR *window; /* allocated sliding window, if wsize != 0 */ - unsigned long hold; /* local strm->hold */ - unsigned bits; /* local strm->bits */ - code const FAR *lcode; /* local strm->lencode */ - code const FAR *dcode; /* local strm->distcode */ - unsigned lmask; /* mask for first level of length codes */ - unsigned dmask; /* mask for first level of distance codes */ - code here; /* retrieved table entry */ - unsigned op; /* code bits, operation, extra bits, or */ - /* window position, window bytes to copy */ - unsigned len; /* match length, unused bytes */ - unsigned dist; /* match distance */ - unsigned char FAR *from; /* where to copy match from */ - - /* copy state to local variables */ - state = (struct inflate_state FAR *)strm->state; - in = strm->next_in - OFF; - last = in + (strm->avail_in - 5); - out = strm->next_out - OFF; - beg = out - (start - strm->avail_out); - end = out + (strm->avail_out - 257); -#ifdef INFLATE_STRICT - dmax = state->dmax; -#endif - wsize = state->wsize; - whave = state->whave; - wnext = state->wnext; - window = state->window; - hold = state->hold; - bits = state->bits; - lcode = state->lencode; - dcode = state->distcode; - lmask = (1U << state->lenbits) - 1; - dmask = (1U << state->distbits) - 1; - - /* decode literals and length/distances until end-of-block or not enough - input data or output space */ - do { - if (bits < 15) { - hold += (unsigned long)(PUP(in)) << bits; - bits += 8; - hold += (unsigned long)(PUP(in)) << bits; - bits += 8; - } - here = lcode[hold & lmask]; - dolen: - op = (unsigned)(here.bits); - hold >>= op; - bits -= op; - op = (unsigned)(here.op); - if (op == 0) { /* literal */ - Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? - "inflate: literal '%c'\n" : - "inflate: literal 0x%02x\n", here.val)); - PUP(out) = (unsigned char)(here.val); - } - else if (op & 16) { /* length base */ - len = (unsigned)(here.val); - op &= 15; /* number of extra bits */ - if (op) { - if (bits < op) { - hold += (unsigned long)(PUP(in)) << bits; - bits += 8; - } - len += (unsigned)hold & ((1U << op) - 1); - hold >>= op; - bits -= op; - } - Tracevv((stderr, "inflate: length %u\n", len)); - if (bits < 15) { - hold += (unsigned long)(PUP(in)) << bits; - bits += 8; - hold += (unsigned long)(PUP(in)) << bits; - bits += 8; - } - here = dcode[hold & dmask]; - dodist: - op = (unsigned)(here.bits); - hold >>= op; - bits -= op; - op = (unsigned)(here.op); - if (op & 16) { /* distance base */ - dist = (unsigned)(here.val); - op &= 15; /* number of extra bits */ - if (bits < op) { - hold += (unsigned long)(PUP(in)) << bits; - bits += 8; - if (bits < op) { - hold += (unsigned long)(PUP(in)) << bits; - bits += 8; - } - } - dist += (unsigned)hold & ((1U << op) - 1); -#ifdef INFLATE_STRICT - if (dist > dmax) { - strm->msg = (char *)"invalid distance too far back"; - state->mode = BAD; - break; - } -#endif - hold >>= op; - bits -= op; - Tracevv((stderr, "inflate: distance %u\n", dist)); - op = (unsigned)(out - beg); /* max distance in output */ - if (dist > op) { /* see if copy from window */ - op = dist - op; /* distance back in window */ - if (op > whave) { - if (state->sane) { - strm->msg = - (char *)"invalid distance too far back"; - state->mode = BAD; - break; - } -#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR - if (len <= op - whave) { - do { - PUP(out) = 0; - } while (--len); - continue; - } - len -= op - whave; - do { - PUP(out) = 0; - } while (--op > whave); - if (op == 0) { - from = out - dist; - do { - PUP(out) = PUP(from); - } while (--len); - continue; - } -#endif - } - from = window - OFF; - if (wnext == 0) { /* very common case */ - from += wsize - op; - if (op < len) { /* some from window */ - len -= op; - do { - PUP(out) = PUP(from); - } while (--op); - from = out - dist; /* rest from output */ - } - } - else if (wnext < op) { /* wrap around window */ - from += wsize + wnext - op; - op -= wnext; - if (op < len) { /* some from end of window */ - len -= op; - do { - PUP(out) = PUP(from); - } while (--op); - from = window - OFF; - if (wnext < len) { /* some from start of window */ - op = wnext; - len -= op; - do { - PUP(out) = PUP(from); - } while (--op); - from = out - dist; /* rest from output */ - } - } - } - else { /* contiguous in window */ - from += wnext - op; - if (op < len) { /* some from window */ - len -= op; - do { - PUP(out) = PUP(from); - } while (--op); - from = out - dist; /* rest from output */ - } - } - while (len > 2) { - PUP(out) = PUP(from); - PUP(out) = PUP(from); - PUP(out) = PUP(from); - len -= 3; - } - if (len) { - PUP(out) = PUP(from); - if (len > 1) - PUP(out) = PUP(from); - } - } - else { - from = out - dist; /* copy direct from output */ - do { /* minimum length is three */ - PUP(out) = PUP(from); - PUP(out) = PUP(from); - PUP(out) = PUP(from); - len -= 3; - } while (len > 2); - if (len) { - PUP(out) = PUP(from); - if (len > 1) - PUP(out) = PUP(from); - } - } - } - else if ((op & 64) == 0) { /* 2nd level distance code */ - here = dcode[here.val + (hold & ((1U << op) - 1))]; - goto dodist; - } - else { - strm->msg = (char *)"invalid distance code"; - state->mode = BAD; - break; - } - } - else if ((op & 64) == 0) { /* 2nd level length code */ - here = lcode[here.val + (hold & ((1U << op) - 1))]; - goto dolen; - } - else if (op & 32) { /* end-of-block */ - Tracevv((stderr, "inflate: end of block\n")); - state->mode = TYPE; - break; - } - else { - strm->msg = (char *)"invalid literal/length code"; - state->mode = BAD; - break; - } - } while (in < last && out < end); - - /* return unused bytes (on entry, bits < 8, so in won't go too far back) */ - len = bits >> 3; - in -= len; - bits -= len << 3; - hold &= (1U << bits) - 1; - - /* update state and return */ - strm->next_in = in + OFF; - strm->next_out = out + OFF; - strm->avail_in = (unsigned)(in < last ? 5 + (last - in) : 5 - (in - last)); - strm->avail_out = (unsigned)(out < end ? - 257 + (end - out) : 257 - (out - end)); - state->hold = hold; - state->bits = bits; - return; -} - -/* - inflate_fast() speedups that turned out slower (on a PowerPC G3 750CXe): - - Using bit fields for code structure - - Different op definition to avoid & for extra bits (do & for table bits) - - Three separate decoding do-loops for direct, window, and wnext == 0 - - Special case for distance > 1 copies to do overlapped load and store copy - - Explicit branch predictions (based on measured branch probabilities) - - Deferring match copy and interspersed it with decoding subsequent codes - - Swapping literal/length else - - Swapping window/direct else - - Larger unrolled copy loops (three is about right) - - Moving len -= 3 statement into middle of loop - */ - -#endif /* !ASMINF */ diff --git a/vendor/libgit2/deps/zlib/inffast.h b/vendor/libgit2/deps/zlib/inffast.h deleted file mode 100644 index e5c1aa4ca8..0000000000 --- a/vendor/libgit2/deps/zlib/inffast.h +++ /dev/null @@ -1,11 +0,0 @@ -/* inffast.h -- header to use inffast.c - * Copyright (C) 1995-2003, 2010 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* WARNING: this file should *not* be used by applications. It is - part of the implementation of the compression library and is - subject to change. Applications should only use zlib.h. - */ - -void ZLIB_INTERNAL inflate_fast OF((z_streamp strm, unsigned start)); diff --git a/vendor/libgit2/deps/zlib/inffixed.h b/vendor/libgit2/deps/zlib/inffixed.h deleted file mode 100644 index d628327769..0000000000 --- a/vendor/libgit2/deps/zlib/inffixed.h +++ /dev/null @@ -1,94 +0,0 @@ - /* inffixed.h -- table for decoding fixed codes - * Generated automatically by makefixed(). - */ - - /* WARNING: this file should *not* be used by applications. - It is part of the implementation of this library and is - subject to change. Applications should only use zlib.h. - */ - - static const code lenfix[512] = { - {96,7,0},{0,8,80},{0,8,16},{20,8,115},{18,7,31},{0,8,112},{0,8,48}, - {0,9,192},{16,7,10},{0,8,96},{0,8,32},{0,9,160},{0,8,0},{0,8,128}, - {0,8,64},{0,9,224},{16,7,6},{0,8,88},{0,8,24},{0,9,144},{19,7,59}, - {0,8,120},{0,8,56},{0,9,208},{17,7,17},{0,8,104},{0,8,40},{0,9,176}, - {0,8,8},{0,8,136},{0,8,72},{0,9,240},{16,7,4},{0,8,84},{0,8,20}, - {21,8,227},{19,7,43},{0,8,116},{0,8,52},{0,9,200},{17,7,13},{0,8,100}, - {0,8,36},{0,9,168},{0,8,4},{0,8,132},{0,8,68},{0,9,232},{16,7,8}, - {0,8,92},{0,8,28},{0,9,152},{20,7,83},{0,8,124},{0,8,60},{0,9,216}, - {18,7,23},{0,8,108},{0,8,44},{0,9,184},{0,8,12},{0,8,140},{0,8,76}, - {0,9,248},{16,7,3},{0,8,82},{0,8,18},{21,8,163},{19,7,35},{0,8,114}, - {0,8,50},{0,9,196},{17,7,11},{0,8,98},{0,8,34},{0,9,164},{0,8,2}, - {0,8,130},{0,8,66},{0,9,228},{16,7,7},{0,8,90},{0,8,26},{0,9,148}, - {20,7,67},{0,8,122},{0,8,58},{0,9,212},{18,7,19},{0,8,106},{0,8,42}, - {0,9,180},{0,8,10},{0,8,138},{0,8,74},{0,9,244},{16,7,5},{0,8,86}, - {0,8,22},{64,8,0},{19,7,51},{0,8,118},{0,8,54},{0,9,204},{17,7,15}, - {0,8,102},{0,8,38},{0,9,172},{0,8,6},{0,8,134},{0,8,70},{0,9,236}, - {16,7,9},{0,8,94},{0,8,30},{0,9,156},{20,7,99},{0,8,126},{0,8,62}, - {0,9,220},{18,7,27},{0,8,110},{0,8,46},{0,9,188},{0,8,14},{0,8,142}, - {0,8,78},{0,9,252},{96,7,0},{0,8,81},{0,8,17},{21,8,131},{18,7,31}, - {0,8,113},{0,8,49},{0,9,194},{16,7,10},{0,8,97},{0,8,33},{0,9,162}, - {0,8,1},{0,8,129},{0,8,65},{0,9,226},{16,7,6},{0,8,89},{0,8,25}, - {0,9,146},{19,7,59},{0,8,121},{0,8,57},{0,9,210},{17,7,17},{0,8,105}, - {0,8,41},{0,9,178},{0,8,9},{0,8,137},{0,8,73},{0,9,242},{16,7,4}, - {0,8,85},{0,8,21},{16,8,258},{19,7,43},{0,8,117},{0,8,53},{0,9,202}, - {17,7,13},{0,8,101},{0,8,37},{0,9,170},{0,8,5},{0,8,133},{0,8,69}, - {0,9,234},{16,7,8},{0,8,93},{0,8,29},{0,9,154},{20,7,83},{0,8,125}, - {0,8,61},{0,9,218},{18,7,23},{0,8,109},{0,8,45},{0,9,186},{0,8,13}, - {0,8,141},{0,8,77},{0,9,250},{16,7,3},{0,8,83},{0,8,19},{21,8,195}, - {19,7,35},{0,8,115},{0,8,51},{0,9,198},{17,7,11},{0,8,99},{0,8,35}, - {0,9,166},{0,8,3},{0,8,131},{0,8,67},{0,9,230},{16,7,7},{0,8,91}, - {0,8,27},{0,9,150},{20,7,67},{0,8,123},{0,8,59},{0,9,214},{18,7,19}, - {0,8,107},{0,8,43},{0,9,182},{0,8,11},{0,8,139},{0,8,75},{0,9,246}, - {16,7,5},{0,8,87},{0,8,23},{64,8,0},{19,7,51},{0,8,119},{0,8,55}, - {0,9,206},{17,7,15},{0,8,103},{0,8,39},{0,9,174},{0,8,7},{0,8,135}, - {0,8,71},{0,9,238},{16,7,9},{0,8,95},{0,8,31},{0,9,158},{20,7,99}, - {0,8,127},{0,8,63},{0,9,222},{18,7,27},{0,8,111},{0,8,47},{0,9,190}, - {0,8,15},{0,8,143},{0,8,79},{0,9,254},{96,7,0},{0,8,80},{0,8,16}, - {20,8,115},{18,7,31},{0,8,112},{0,8,48},{0,9,193},{16,7,10},{0,8,96}, - {0,8,32},{0,9,161},{0,8,0},{0,8,128},{0,8,64},{0,9,225},{16,7,6}, - {0,8,88},{0,8,24},{0,9,145},{19,7,59},{0,8,120},{0,8,56},{0,9,209}, - {17,7,17},{0,8,104},{0,8,40},{0,9,177},{0,8,8},{0,8,136},{0,8,72}, - {0,9,241},{16,7,4},{0,8,84},{0,8,20},{21,8,227},{19,7,43},{0,8,116}, - {0,8,52},{0,9,201},{17,7,13},{0,8,100},{0,8,36},{0,9,169},{0,8,4}, - {0,8,132},{0,8,68},{0,9,233},{16,7,8},{0,8,92},{0,8,28},{0,9,153}, - {20,7,83},{0,8,124},{0,8,60},{0,9,217},{18,7,23},{0,8,108},{0,8,44}, - {0,9,185},{0,8,12},{0,8,140},{0,8,76},{0,9,249},{16,7,3},{0,8,82}, - {0,8,18},{21,8,163},{19,7,35},{0,8,114},{0,8,50},{0,9,197},{17,7,11}, - {0,8,98},{0,8,34},{0,9,165},{0,8,2},{0,8,130},{0,8,66},{0,9,229}, - {16,7,7},{0,8,90},{0,8,26},{0,9,149},{20,7,67},{0,8,122},{0,8,58}, - {0,9,213},{18,7,19},{0,8,106},{0,8,42},{0,9,181},{0,8,10},{0,8,138}, - {0,8,74},{0,9,245},{16,7,5},{0,8,86},{0,8,22},{64,8,0},{19,7,51}, - {0,8,118},{0,8,54},{0,9,205},{17,7,15},{0,8,102},{0,8,38},{0,9,173}, - {0,8,6},{0,8,134},{0,8,70},{0,9,237},{16,7,9},{0,8,94},{0,8,30}, - {0,9,157},{20,7,99},{0,8,126},{0,8,62},{0,9,221},{18,7,27},{0,8,110}, - {0,8,46},{0,9,189},{0,8,14},{0,8,142},{0,8,78},{0,9,253},{96,7,0}, - {0,8,81},{0,8,17},{21,8,131},{18,7,31},{0,8,113},{0,8,49},{0,9,195}, - {16,7,10},{0,8,97},{0,8,33},{0,9,163},{0,8,1},{0,8,129},{0,8,65}, - {0,9,227},{16,7,6},{0,8,89},{0,8,25},{0,9,147},{19,7,59},{0,8,121}, - {0,8,57},{0,9,211},{17,7,17},{0,8,105},{0,8,41},{0,9,179},{0,8,9}, - {0,8,137},{0,8,73},{0,9,243},{16,7,4},{0,8,85},{0,8,21},{16,8,258}, - {19,7,43},{0,8,117},{0,8,53},{0,9,203},{17,7,13},{0,8,101},{0,8,37}, - {0,9,171},{0,8,5},{0,8,133},{0,8,69},{0,9,235},{16,7,8},{0,8,93}, - {0,8,29},{0,9,155},{20,7,83},{0,8,125},{0,8,61},{0,9,219},{18,7,23}, - {0,8,109},{0,8,45},{0,9,187},{0,8,13},{0,8,141},{0,8,77},{0,9,251}, - {16,7,3},{0,8,83},{0,8,19},{21,8,195},{19,7,35},{0,8,115},{0,8,51}, - {0,9,199},{17,7,11},{0,8,99},{0,8,35},{0,9,167},{0,8,3},{0,8,131}, - {0,8,67},{0,9,231},{16,7,7},{0,8,91},{0,8,27},{0,9,151},{20,7,67}, - {0,8,123},{0,8,59},{0,9,215},{18,7,19},{0,8,107},{0,8,43},{0,9,183}, - {0,8,11},{0,8,139},{0,8,75},{0,9,247},{16,7,5},{0,8,87},{0,8,23}, - {64,8,0},{19,7,51},{0,8,119},{0,8,55},{0,9,207},{17,7,15},{0,8,103}, - {0,8,39},{0,9,175},{0,8,7},{0,8,135},{0,8,71},{0,9,239},{16,7,9}, - {0,8,95},{0,8,31},{0,9,159},{20,7,99},{0,8,127},{0,8,63},{0,9,223}, - {18,7,27},{0,8,111},{0,8,47},{0,9,191},{0,8,15},{0,8,143},{0,8,79}, - {0,9,255} - }; - - static const code distfix[32] = { - {16,5,1},{23,5,257},{19,5,17},{27,5,4097},{17,5,5},{25,5,1025}, - {21,5,65},{29,5,16385},{16,5,3},{24,5,513},{20,5,33},{28,5,8193}, - {18,5,9},{26,5,2049},{22,5,129},{64,5,0},{16,5,2},{23,5,385}, - {19,5,25},{27,5,6145},{17,5,7},{25,5,1537},{21,5,97},{29,5,24577}, - {16,5,4},{24,5,769},{20,5,49},{28,5,12289},{18,5,13},{26,5,3073}, - {22,5,193},{64,5,0} - }; diff --git a/vendor/libgit2/deps/zlib/inflate.c b/vendor/libgit2/deps/zlib/inflate.c deleted file mode 100644 index 870f89bb4d..0000000000 --- a/vendor/libgit2/deps/zlib/inflate.c +++ /dev/null @@ -1,1512 +0,0 @@ -/* inflate.c -- zlib decompression - * Copyright (C) 1995-2012 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* - * Change history: - * - * 1.2.beta0 24 Nov 2002 - * - First version -- complete rewrite of inflate to simplify code, avoid - * creation of window when not needed, minimize use of window when it is - * needed, make inffast.c even faster, implement gzip decoding, and to - * improve code readability and style over the previous zlib inflate code - * - * 1.2.beta1 25 Nov 2002 - * - Use pointers for available input and output checking in inffast.c - * - Remove input and output counters in inffast.c - * - Change inffast.c entry and loop from avail_in >= 7 to >= 6 - * - Remove unnecessary second byte pull from length extra in inffast.c - * - Unroll direct copy to three copies per loop in inffast.c - * - * 1.2.beta2 4 Dec 2002 - * - Change external routine names to reduce potential conflicts - * - Correct filename to inffixed.h for fixed tables in inflate.c - * - Make hbuf[] unsigned char to match parameter type in inflate.c - * - Change strm->next_out[-state->offset] to *(strm->next_out - state->offset) - * to avoid negation problem on Alphas (64 bit) in inflate.c - * - * 1.2.beta3 22 Dec 2002 - * - Add comments on state->bits assertion in inffast.c - * - Add comments on op field in inftrees.h - * - Fix bug in reuse of allocated window after inflateReset() - * - Remove bit fields--back to byte structure for speed - * - Remove distance extra == 0 check in inflate_fast()--only helps for lengths - * - Change post-increments to pre-increments in inflate_fast(), PPC biased? - * - Add compile time option, POSTINC, to use post-increments instead (Intel?) - * - Make MATCH copy in inflate() much faster for when inflate_fast() not used - * - Use local copies of stream next and avail values, as well as local bit - * buffer and bit count in inflate()--for speed when inflate_fast() not used - * - * 1.2.beta4 1 Jan 2003 - * - Split ptr - 257 statements in inflate_table() to avoid compiler warnings - * - Move a comment on output buffer sizes from inffast.c to inflate.c - * - Add comments in inffast.c to introduce the inflate_fast() routine - * - Rearrange window copies in inflate_fast() for speed and simplification - * - Unroll last copy for window match in inflate_fast() - * - Use local copies of window variables in inflate_fast() for speed - * - Pull out common wnext == 0 case for speed in inflate_fast() - * - Make op and len in inflate_fast() unsigned for consistency - * - Add FAR to lcode and dcode declarations in inflate_fast() - * - Simplified bad distance check in inflate_fast() - * - Added inflateBackInit(), inflateBack(), and inflateBackEnd() in new - * source file infback.c to provide a call-back interface to inflate for - * programs like gzip and unzip -- uses window as output buffer to avoid - * window copying - * - * 1.2.beta5 1 Jan 2003 - * - Improved inflateBack() interface to allow the caller to provide initial - * input in strm. - * - Fixed stored blocks bug in inflateBack() - * - * 1.2.beta6 4 Jan 2003 - * - Added comments in inffast.c on effectiveness of POSTINC - * - Typecasting all around to reduce compiler warnings - * - Changed loops from while (1) or do {} while (1) to for (;;), again to - * make compilers happy - * - Changed type of window in inflateBackInit() to unsigned char * - * - * 1.2.beta7 27 Jan 2003 - * - Changed many types to unsigned or unsigned short to avoid warnings - * - Added inflateCopy() function - * - * 1.2.0 9 Mar 2003 - * - Changed inflateBack() interface to provide separate opaque descriptors - * for the in() and out() functions - * - Changed inflateBack() argument and in_func typedef to swap the length - * and buffer address return values for the input function - * - Check next_in and next_out for Z_NULL on entry to inflate() - * - * The history for versions after 1.2.0 are in ChangeLog in zlib distribution. - */ - -#include "zutil.h" -#include "inftrees.h" -#include "inflate.h" -#include "inffast.h" - -#ifdef MAKEFIXED -# ifndef BUILDFIXED -# define BUILDFIXED -# endif -#endif - -/* function prototypes */ -local void fixedtables OF((struct inflate_state FAR *state)); -local int updatewindow OF((z_streamp strm, const unsigned char FAR *end, - unsigned copy)); -#ifdef BUILDFIXED - void makefixed OF((void)); -#endif -local unsigned syncsearch OF((unsigned FAR *have, const unsigned char FAR *buf, - unsigned len)); - -int ZEXPORT inflateResetKeep(strm) -z_streamp strm; -{ - struct inflate_state FAR *state; - - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - state = (struct inflate_state FAR *)strm->state; - strm->total_in = strm->total_out = state->total = 0; - strm->msg = Z_NULL; - if (state->wrap) /* to support ill-conceived Java test suite */ - strm->adler = state->wrap & 1; - state->mode = HEAD; - state->last = 0; - state->havedict = 0; - state->dmax = 32768U; - state->head = Z_NULL; - state->hold = 0; - state->bits = 0; - state->lencode = state->distcode = state->next = state->codes; - state->sane = 1; - state->back = -1; - Tracev((stderr, "inflate: reset\n")); - return Z_OK; -} - -int ZEXPORT inflateReset(strm) -z_streamp strm; -{ - struct inflate_state FAR *state; - - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - state = (struct inflate_state FAR *)strm->state; - state->wsize = 0; - state->whave = 0; - state->wnext = 0; - return inflateResetKeep(strm); -} - -int ZEXPORT inflateReset2(strm, windowBits) -z_streamp strm; -int windowBits; -{ - int wrap; - struct inflate_state FAR *state; - - /* get the state */ - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - state = (struct inflate_state FAR *)strm->state; - - /* extract wrap request from windowBits parameter */ - if (windowBits < 0) { - wrap = 0; - windowBits = -windowBits; - } - else { - wrap = (windowBits >> 4) + 1; -#ifdef GUNZIP - if (windowBits < 48) - windowBits &= 15; -#endif - } - - /* set number of window bits, free window if different */ - if (windowBits && (windowBits < 8 || windowBits > 15)) - return Z_STREAM_ERROR; - if (state->window != Z_NULL && state->wbits != (unsigned)windowBits) { - ZFREE(strm, state->window); - state->window = Z_NULL; - } - - /* update state and reset the rest of it */ - state->wrap = wrap; - state->wbits = (unsigned)windowBits; - return inflateReset(strm); -} - -int ZEXPORT inflateInit2_(strm, windowBits, version, stream_size) -z_streamp strm; -int windowBits; -const char *version; -int stream_size; -{ - int ret; - struct inflate_state FAR *state; - - if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || - stream_size != (int)(sizeof(z_stream))) - return Z_VERSION_ERROR; - if (strm == Z_NULL) return Z_STREAM_ERROR; - strm->msg = Z_NULL; /* in case we return an error */ - if (strm->zalloc == (alloc_func)0) { -#ifdef Z_SOLO - return Z_STREAM_ERROR; -#else - strm->zalloc = zcalloc; - strm->opaque = (voidpf)0; -#endif - } - if (strm->zfree == (free_func)0) -#ifdef Z_SOLO - return Z_STREAM_ERROR; -#else - strm->zfree = zcfree; -#endif - state = (struct inflate_state FAR *) - ZALLOC(strm, 1, sizeof(struct inflate_state)); - if (state == Z_NULL) return Z_MEM_ERROR; - Tracev((stderr, "inflate: allocated\n")); - strm->state = (struct internal_state FAR *)state; - state->window = Z_NULL; - ret = inflateReset2(strm, windowBits); - if (ret != Z_OK) { - ZFREE(strm, state); - strm->state = Z_NULL; - } - return ret; -} - -int ZEXPORT inflateInit_(strm, version, stream_size) -z_streamp strm; -const char *version; -int stream_size; -{ - return inflateInit2_(strm, DEF_WBITS, version, stream_size); -} - -int ZEXPORT inflatePrime(strm, bits, value) -z_streamp strm; -int bits; -int value; -{ - struct inflate_state FAR *state; - - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - state = (struct inflate_state FAR *)strm->state; - if (bits < 0) { - state->hold = 0; - state->bits = 0; - return Z_OK; - } - if (bits > 16 || state->bits + bits > 32) return Z_STREAM_ERROR; - value &= (1L << bits) - 1; - state->hold += value << state->bits; - state->bits += bits; - return Z_OK; -} - -/* - Return state with length and distance decoding tables and index sizes set to - fixed code decoding. Normally this returns fixed tables from inffixed.h. - If BUILDFIXED is defined, then instead this routine builds the tables the - first time it's called, and returns those tables the first time and - thereafter. This reduces the size of the code by about 2K bytes, in - exchange for a little execution time. However, BUILDFIXED should not be - used for threaded applications, since the rewriting of the tables and virgin - may not be thread-safe. - */ -local void fixedtables(state) -struct inflate_state FAR *state; -{ -#ifdef BUILDFIXED - static int virgin = 1; - static code *lenfix, *distfix; - static code fixed[544]; - - /* build fixed huffman tables if first call (may not be thread safe) */ - if (virgin) { - unsigned sym, bits; - static code *next; - - /* literal/length table */ - sym = 0; - while (sym < 144) state->lens[sym++] = 8; - while (sym < 256) state->lens[sym++] = 9; - while (sym < 280) state->lens[sym++] = 7; - while (sym < 288) state->lens[sym++] = 8; - next = fixed; - lenfix = next; - bits = 9; - inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work); - - /* distance table */ - sym = 0; - while (sym < 32) state->lens[sym++] = 5; - distfix = next; - bits = 5; - inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work); - - /* do this just once */ - virgin = 0; - } -#else /* !BUILDFIXED */ -# include "inffixed.h" -#endif /* BUILDFIXED */ - state->lencode = lenfix; - state->lenbits = 9; - state->distcode = distfix; - state->distbits = 5; -} - -#ifdef MAKEFIXED -#include - -/* - Write out the inffixed.h that is #include'd above. Defining MAKEFIXED also - defines BUILDFIXED, so the tables are built on the fly. makefixed() writes - those tables to stdout, which would be piped to inffixed.h. A small program - can simply call makefixed to do this: - - void makefixed(void); - - int main(void) - { - makefixed(); - return 0; - } - - Then that can be linked with zlib built with MAKEFIXED defined and run: - - a.out > inffixed.h - */ -void makefixed() -{ - unsigned low, size; - struct inflate_state state; - - fixedtables(&state); - puts(" /* inffixed.h -- table for decoding fixed codes"); - puts(" * Generated automatically by makefixed()."); - puts(" */"); - puts(""); - puts(" /* WARNING: this file should *not* be used by applications."); - puts(" It is part of the implementation of this library and is"); - puts(" subject to change. Applications should only use zlib.h."); - puts(" */"); - puts(""); - size = 1U << 9; - printf(" static const code lenfix[%u] = {", size); - low = 0; - for (;;) { - if ((low % 7) == 0) printf("\n "); - printf("{%u,%u,%d}", (low & 127) == 99 ? 64 : state.lencode[low].op, - state.lencode[low].bits, state.lencode[low].val); - if (++low == size) break; - putchar(','); - } - puts("\n };"); - size = 1U << 5; - printf("\n static const code distfix[%u] = {", size); - low = 0; - for (;;) { - if ((low % 6) == 0) printf("\n "); - printf("{%u,%u,%d}", state.distcode[low].op, state.distcode[low].bits, - state.distcode[low].val); - if (++low == size) break; - putchar(','); - } - puts("\n };"); -} -#endif /* MAKEFIXED */ - -/* - Update the window with the last wsize (normally 32K) bytes written before - returning. If window does not exist yet, create it. This is only called - when a window is already in use, or when output has been written during this - inflate call, but the end of the deflate stream has not been reached yet. - It is also called to create a window for dictionary data when a dictionary - is loaded. - - Providing output buffers larger than 32K to inflate() should provide a speed - advantage, since only the last 32K of output is copied to the sliding window - upon return from inflate(), and since all distances after the first 32K of - output will fall in the output data, making match copies simpler and faster. - The advantage may be dependent on the size of the processor's data caches. - */ -local int updatewindow(strm, end, copy) -z_streamp strm; -const Bytef *end; -unsigned copy; -{ - struct inflate_state FAR *state; - unsigned dist; - - state = (struct inflate_state FAR *)strm->state; - - /* if it hasn't been done already, allocate space for the window */ - if (state->window == Z_NULL) { - state->window = (unsigned char FAR *) - ZALLOC(strm, 1U << state->wbits, - sizeof(unsigned char)); - if (state->window == Z_NULL) return 1; - } - - /* if window not in use yet, initialize */ - if (state->wsize == 0) { - state->wsize = 1U << state->wbits; - state->wnext = 0; - state->whave = 0; - } - - /* copy state->wsize or less output bytes into the circular window */ - if (copy >= state->wsize) { - zmemcpy(state->window, end - state->wsize, state->wsize); - state->wnext = 0; - state->whave = state->wsize; - } - else { - dist = state->wsize - state->wnext; - if (dist > copy) dist = copy; - zmemcpy(state->window + state->wnext, end - copy, dist); - copy -= dist; - if (copy) { - zmemcpy(state->window, end - copy, copy); - state->wnext = copy; - state->whave = state->wsize; - } - else { - state->wnext += dist; - if (state->wnext == state->wsize) state->wnext = 0; - if (state->whave < state->wsize) state->whave += dist; - } - } - return 0; -} - -/* Macros for inflate(): */ - -/* check function to use adler32() for zlib or crc32() for gzip */ -#ifdef GUNZIP -# define UPDATE(check, buf, len) \ - (state->flags ? crc32(check, buf, len) : adler32(check, buf, len)) -#else -# define UPDATE(check, buf, len) adler32(check, buf, len) -#endif - -/* check macros for header crc */ -#ifdef GUNZIP -# define CRC2(check, word) \ - do { \ - hbuf[0] = (unsigned char)(word); \ - hbuf[1] = (unsigned char)((word) >> 8); \ - check = crc32(check, hbuf, 2); \ - } while (0) - -# define CRC4(check, word) \ - do { \ - hbuf[0] = (unsigned char)(word); \ - hbuf[1] = (unsigned char)((word) >> 8); \ - hbuf[2] = (unsigned char)((word) >> 16); \ - hbuf[3] = (unsigned char)((word) >> 24); \ - check = crc32(check, hbuf, 4); \ - } while (0) -#endif - -/* Load registers with state in inflate() for speed */ -#define LOAD() \ - do { \ - put = strm->next_out; \ - left = strm->avail_out; \ - next = strm->next_in; \ - have = strm->avail_in; \ - hold = state->hold; \ - bits = state->bits; \ - } while (0) - -/* Restore state from registers in inflate() */ -#define RESTORE() \ - do { \ - strm->next_out = put; \ - strm->avail_out = left; \ - strm->next_in = next; \ - strm->avail_in = have; \ - state->hold = hold; \ - state->bits = bits; \ - } while (0) - -/* Clear the input bit accumulator */ -#define INITBITS() \ - do { \ - hold = 0; \ - bits = 0; \ - } while (0) - -/* Get a byte of input into the bit accumulator, or return from inflate() - if there is no input available. */ -#define PULLBYTE() \ - do { \ - if (have == 0) goto inf_leave; \ - have--; \ - hold += (unsigned long)(*next++) << bits; \ - bits += 8; \ - } while (0) - -/* Assure that there are at least n bits in the bit accumulator. If there is - not enough available input to do that, then return from inflate(). */ -#define NEEDBITS(n) \ - do { \ - while (bits < (unsigned)(n)) \ - PULLBYTE(); \ - } while (0) - -/* Return the low n bits of the bit accumulator (n < 16) */ -#define BITS(n) \ - ((unsigned)hold & ((1U << (n)) - 1)) - -/* Remove n bits from the bit accumulator */ -#define DROPBITS(n) \ - do { \ - hold >>= (n); \ - bits -= (unsigned)(n); \ - } while (0) - -/* Remove zero to seven bits as needed to go to a byte boundary */ -#define BYTEBITS() \ - do { \ - hold >>= bits & 7; \ - bits -= bits & 7; \ - } while (0) - -/* - inflate() uses a state machine to process as much input data and generate as - much output data as possible before returning. The state machine is - structured roughly as follows: - - for (;;) switch (state) { - ... - case STATEn: - if (not enough input data or output space to make progress) - return; - ... make progress ... - state = STATEm; - break; - ... - } - - so when inflate() is called again, the same case is attempted again, and - if the appropriate resources are provided, the machine proceeds to the - next state. The NEEDBITS() macro is usually the way the state evaluates - whether it can proceed or should return. NEEDBITS() does the return if - the requested bits are not available. The typical use of the BITS macros - is: - - NEEDBITS(n); - ... do something with BITS(n) ... - DROPBITS(n); - - where NEEDBITS(n) either returns from inflate() if there isn't enough - input left to load n bits into the accumulator, or it continues. BITS(n) - gives the low n bits in the accumulator. When done, DROPBITS(n) drops - the low n bits off the accumulator. INITBITS() clears the accumulator - and sets the number of available bits to zero. BYTEBITS() discards just - enough bits to put the accumulator on a byte boundary. After BYTEBITS() - and a NEEDBITS(8), then BITS(8) would return the next byte in the stream. - - NEEDBITS(n) uses PULLBYTE() to get an available byte of input, or to return - if there is no input available. The decoding of variable length codes uses - PULLBYTE() directly in order to pull just enough bytes to decode the next - code, and no more. - - Some states loop until they get enough input, making sure that enough - state information is maintained to continue the loop where it left off - if NEEDBITS() returns in the loop. For example, want, need, and keep - would all have to actually be part of the saved state in case NEEDBITS() - returns: - - case STATEw: - while (want < need) { - NEEDBITS(n); - keep[want++] = BITS(n); - DROPBITS(n); - } - state = STATEx; - case STATEx: - - As shown above, if the next state is also the next case, then the break - is omitted. - - A state may also return if there is not enough output space available to - complete that state. Those states are copying stored data, writing a - literal byte, and copying a matching string. - - When returning, a "goto inf_leave" is used to update the total counters, - update the check value, and determine whether any progress has been made - during that inflate() call in order to return the proper return code. - Progress is defined as a change in either strm->avail_in or strm->avail_out. - When there is a window, goto inf_leave will update the window with the last - output written. If a goto inf_leave occurs in the middle of decompression - and there is no window currently, goto inf_leave will create one and copy - output to the window for the next call of inflate(). - - In this implementation, the flush parameter of inflate() only affects the - return code (per zlib.h). inflate() always writes as much as possible to - strm->next_out, given the space available and the provided input--the effect - documented in zlib.h of Z_SYNC_FLUSH. Furthermore, inflate() always defers - the allocation of and copying into a sliding window until necessary, which - provides the effect documented in zlib.h for Z_FINISH when the entire input - stream available. So the only thing the flush parameter actually does is: - when flush is set to Z_FINISH, inflate() cannot return Z_OK. Instead it - will return Z_BUF_ERROR if it has not reached the end of the stream. - */ - -int ZEXPORT inflate(strm, flush) -z_streamp strm; -int flush; -{ - struct inflate_state FAR *state; - z_const unsigned char FAR *next; /* next input */ - unsigned char FAR *put; /* next output */ - unsigned have, left; /* available input and output */ - unsigned long hold; /* bit buffer */ - unsigned bits; /* bits in bit buffer */ - unsigned in, out; /* save starting available input and output */ - unsigned copy; /* number of stored or match bytes to copy */ - unsigned char FAR *from; /* where to copy match bytes from */ - code here; /* current decoding table entry */ - code last; /* parent table entry */ - unsigned len; /* length to copy for repeats, bits to drop */ - int ret; /* return code */ -#ifdef GUNZIP - unsigned char hbuf[4]; /* buffer for gzip header crc calculation */ -#endif - static const unsigned short order[19] = /* permutation of code lengths */ - {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; - - if (strm == Z_NULL || strm->state == Z_NULL || strm->next_out == Z_NULL || - (strm->next_in == Z_NULL && strm->avail_in != 0)) - return Z_STREAM_ERROR; - - state = (struct inflate_state FAR *)strm->state; - if (state->mode == TYPE) state->mode = TYPEDO; /* skip check */ - LOAD(); - in = have; - out = left; - ret = Z_OK; - for (;;) - switch (state->mode) { - case HEAD: - if (state->wrap == 0) { - state->mode = TYPEDO; - break; - } - NEEDBITS(16); -#ifdef GUNZIP - if ((state->wrap & 2) && hold == 0x8b1f) { /* gzip header */ - state->check = crc32(0L, Z_NULL, 0); - CRC2(state->check, hold); - INITBITS(); - state->mode = FLAGS; - break; - } - state->flags = 0; /* expect zlib header */ - if (state->head != Z_NULL) - state->head->done = -1; - if (!(state->wrap & 1) || /* check if zlib header allowed */ -#else - if ( -#endif - ((BITS(8) << 8) + (hold >> 8)) % 31) { - strm->msg = (char *)"incorrect header check"; - state->mode = BAD; - break; - } - if (BITS(4) != Z_DEFLATED) { - strm->msg = (char *)"unknown compression method"; - state->mode = BAD; - break; - } - DROPBITS(4); - len = BITS(4) + 8; - if (state->wbits == 0) - state->wbits = len; - else if (len > state->wbits) { - strm->msg = (char *)"invalid window size"; - state->mode = BAD; - break; - } - state->dmax = 1U << len; - Tracev((stderr, "inflate: zlib header ok\n")); - strm->adler = state->check = adler32(0L, Z_NULL, 0); - state->mode = hold & 0x200 ? DICTID : TYPE; - INITBITS(); - break; -#ifdef GUNZIP - case FLAGS: - NEEDBITS(16); - state->flags = (int)(hold); - if ((state->flags & 0xff) != Z_DEFLATED) { - strm->msg = (char *)"unknown compression method"; - state->mode = BAD; - break; - } - if (state->flags & 0xe000) { - strm->msg = (char *)"unknown header flags set"; - state->mode = BAD; - break; - } - if (state->head != Z_NULL) - state->head->text = (int)((hold >> 8) & 1); - if (state->flags & 0x0200) CRC2(state->check, hold); - INITBITS(); - state->mode = TIME; - case TIME: - NEEDBITS(32); - if (state->head != Z_NULL) - state->head->time = hold; - if (state->flags & 0x0200) CRC4(state->check, hold); - INITBITS(); - state->mode = OS; - case OS: - NEEDBITS(16); - if (state->head != Z_NULL) { - state->head->xflags = (int)(hold & 0xff); - state->head->os = (int)(hold >> 8); - } - if (state->flags & 0x0200) CRC2(state->check, hold); - INITBITS(); - state->mode = EXLEN; - case EXLEN: - if (state->flags & 0x0400) { - NEEDBITS(16); - state->length = (unsigned)(hold); - if (state->head != Z_NULL) - state->head->extra_len = (unsigned)hold; - if (state->flags & 0x0200) CRC2(state->check, hold); - INITBITS(); - } - else if (state->head != Z_NULL) - state->head->extra = Z_NULL; - state->mode = EXTRA; - case EXTRA: - if (state->flags & 0x0400) { - copy = state->length; - if (copy > have) copy = have; - if (copy) { - if (state->head != Z_NULL && - state->head->extra != Z_NULL) { - len = state->head->extra_len - state->length; - zmemcpy(state->head->extra + len, next, - len + copy > state->head->extra_max ? - state->head->extra_max - len : copy); - } - if (state->flags & 0x0200) - state->check = crc32(state->check, next, copy); - have -= copy; - next += copy; - state->length -= copy; - } - if (state->length) goto inf_leave; - } - state->length = 0; - state->mode = NAME; - case NAME: - if (state->flags & 0x0800) { - if (have == 0) goto inf_leave; - copy = 0; - do { - len = (unsigned)(next[copy++]); - if (state->head != Z_NULL && - state->head->name != Z_NULL && - state->length < state->head->name_max) - state->head->name[state->length++] = len; - } while (len && copy < have); - if (state->flags & 0x0200) - state->check = crc32(state->check, next, copy); - have -= copy; - next += copy; - if (len) goto inf_leave; - } - else if (state->head != Z_NULL) - state->head->name = Z_NULL; - state->length = 0; - state->mode = COMMENT; - case COMMENT: - if (state->flags & 0x1000) { - if (have == 0) goto inf_leave; - copy = 0; - do { - len = (unsigned)(next[copy++]); - if (state->head != Z_NULL && - state->head->comment != Z_NULL && - state->length < state->head->comm_max) - state->head->comment[state->length++] = len; - } while (len && copy < have); - if (state->flags & 0x0200) - state->check = crc32(state->check, next, copy); - have -= copy; - next += copy; - if (len) goto inf_leave; - } - else if (state->head != Z_NULL) - state->head->comment = Z_NULL; - state->mode = HCRC; - case HCRC: - if (state->flags & 0x0200) { - NEEDBITS(16); - if (hold != (state->check & 0xffff)) { - strm->msg = (char *)"header crc mismatch"; - state->mode = BAD; - break; - } - INITBITS(); - } - if (state->head != Z_NULL) { - state->head->hcrc = (int)((state->flags >> 9) & 1); - state->head->done = 1; - } - strm->adler = state->check = crc32(0L, Z_NULL, 0); - state->mode = TYPE; - break; -#endif - case DICTID: - NEEDBITS(32); - strm->adler = state->check = ZSWAP32(hold); - INITBITS(); - state->mode = DICT; - case DICT: - if (state->havedict == 0) { - RESTORE(); - return Z_NEED_DICT; - } - strm->adler = state->check = adler32(0L, Z_NULL, 0); - state->mode = TYPE; - case TYPE: - if (flush == Z_BLOCK || flush == Z_TREES) goto inf_leave; - case TYPEDO: - if (state->last) { - BYTEBITS(); - state->mode = CHECK; - break; - } - NEEDBITS(3); - state->last = BITS(1); - DROPBITS(1); - switch (BITS(2)) { - case 0: /* stored block */ - Tracev((stderr, "inflate: stored block%s\n", - state->last ? " (last)" : "")); - state->mode = STORED; - break; - case 1: /* fixed block */ - fixedtables(state); - Tracev((stderr, "inflate: fixed codes block%s\n", - state->last ? " (last)" : "")); - state->mode = LEN_; /* decode codes */ - if (flush == Z_TREES) { - DROPBITS(2); - goto inf_leave; - } - break; - case 2: /* dynamic block */ - Tracev((stderr, "inflate: dynamic codes block%s\n", - state->last ? " (last)" : "")); - state->mode = TABLE; - break; - case 3: - strm->msg = (char *)"invalid block type"; - state->mode = BAD; - } - DROPBITS(2); - break; - case STORED: - BYTEBITS(); /* go to byte boundary */ - NEEDBITS(32); - if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) { - strm->msg = (char *)"invalid stored block lengths"; - state->mode = BAD; - break; - } - state->length = (unsigned)hold & 0xffff; - Tracev((stderr, "inflate: stored length %u\n", - state->length)); - INITBITS(); - state->mode = COPY_; - if (flush == Z_TREES) goto inf_leave; - case COPY_: - state->mode = COPY; - case COPY: - copy = state->length; - if (copy) { - if (copy > have) copy = have; - if (copy > left) copy = left; - if (copy == 0) goto inf_leave; - zmemcpy(put, next, copy); - have -= copy; - next += copy; - left -= copy; - put += copy; - state->length -= copy; - break; - } - Tracev((stderr, "inflate: stored end\n")); - state->mode = TYPE; - break; - case TABLE: - NEEDBITS(14); - state->nlen = BITS(5) + 257; - DROPBITS(5); - state->ndist = BITS(5) + 1; - DROPBITS(5); - state->ncode = BITS(4) + 4; - DROPBITS(4); -#ifndef PKZIP_BUG_WORKAROUND - if (state->nlen > 286 || state->ndist > 30) { - strm->msg = (char *)"too many length or distance symbols"; - state->mode = BAD; - break; - } -#endif - Tracev((stderr, "inflate: table sizes ok\n")); - state->have = 0; - state->mode = LENLENS; - case LENLENS: - while (state->have < state->ncode) { - NEEDBITS(3); - state->lens[order[state->have++]] = (unsigned short)BITS(3); - DROPBITS(3); - } - while (state->have < 19) - state->lens[order[state->have++]] = 0; - state->next = state->codes; - state->lencode = (const code FAR *)(state->next); - state->lenbits = 7; - ret = inflate_table(CODES, state->lens, 19, &(state->next), - &(state->lenbits), state->work); - if (ret) { - strm->msg = (char *)"invalid code lengths set"; - state->mode = BAD; - break; - } - Tracev((stderr, "inflate: code lengths ok\n")); - state->have = 0; - state->mode = CODELENS; - case CODELENS: - while (state->have < state->nlen + state->ndist) { - for (;;) { - here = state->lencode[BITS(state->lenbits)]; - if ((unsigned)(here.bits) <= bits) break; - PULLBYTE(); - } - if (here.val < 16) { - DROPBITS(here.bits); - state->lens[state->have++] = here.val; - } - else { - if (here.val == 16) { - NEEDBITS(here.bits + 2); - DROPBITS(here.bits); - if (state->have == 0) { - strm->msg = (char *)"invalid bit length repeat"; - state->mode = BAD; - break; - } - len = state->lens[state->have - 1]; - copy = 3 + BITS(2); - DROPBITS(2); - } - else if (here.val == 17) { - NEEDBITS(here.bits + 3); - DROPBITS(here.bits); - len = 0; - copy = 3 + BITS(3); - DROPBITS(3); - } - else { - NEEDBITS(here.bits + 7); - DROPBITS(here.bits); - len = 0; - copy = 11 + BITS(7); - DROPBITS(7); - } - if (state->have + copy > state->nlen + state->ndist) { - strm->msg = (char *)"invalid bit length repeat"; - state->mode = BAD; - break; - } - while (copy--) - state->lens[state->have++] = (unsigned short)len; - } - } - - /* handle error breaks in while */ - if (state->mode == BAD) break; - - /* check for end-of-block code (better have one) */ - if (state->lens[256] == 0) { - strm->msg = (char *)"invalid code -- missing end-of-block"; - state->mode = BAD; - break; - } - - /* build code tables -- note: do not change the lenbits or distbits - values here (9 and 6) without reading the comments in inftrees.h - concerning the ENOUGH constants, which depend on those values */ - state->next = state->codes; - state->lencode = (const code FAR *)(state->next); - state->lenbits = 9; - ret = inflate_table(LENS, state->lens, state->nlen, &(state->next), - &(state->lenbits), state->work); - if (ret) { - strm->msg = (char *)"invalid literal/lengths set"; - state->mode = BAD; - break; - } - state->distcode = (const code FAR *)(state->next); - state->distbits = 6; - ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist, - &(state->next), &(state->distbits), state->work); - if (ret) { - strm->msg = (char *)"invalid distances set"; - state->mode = BAD; - break; - } - Tracev((stderr, "inflate: codes ok\n")); - state->mode = LEN_; - if (flush == Z_TREES) goto inf_leave; - case LEN_: - state->mode = LEN; - case LEN: - if (have >= 6 && left >= 258) { - RESTORE(); - inflate_fast(strm, out); - LOAD(); - if (state->mode == TYPE) - state->back = -1; - break; - } - state->back = 0; - for (;;) { - here = state->lencode[BITS(state->lenbits)]; - if ((unsigned)(here.bits) <= bits) break; - PULLBYTE(); - } - if (here.op && (here.op & 0xf0) == 0) { - last = here; - for (;;) { - here = state->lencode[last.val + - (BITS(last.bits + last.op) >> last.bits)]; - if ((unsigned)(last.bits + here.bits) <= bits) break; - PULLBYTE(); - } - DROPBITS(last.bits); - state->back += last.bits; - } - DROPBITS(here.bits); - state->back += here.bits; - state->length = (unsigned)here.val; - if ((int)(here.op) == 0) { - Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? - "inflate: literal '%c'\n" : - "inflate: literal 0x%02x\n", here.val)); - state->mode = LIT; - break; - } - if (here.op & 32) { - Tracevv((stderr, "inflate: end of block\n")); - state->back = -1; - state->mode = TYPE; - break; - } - if (here.op & 64) { - strm->msg = (char *)"invalid literal/length code"; - state->mode = BAD; - break; - } - state->extra = (unsigned)(here.op) & 15; - state->mode = LENEXT; - case LENEXT: - if (state->extra) { - NEEDBITS(state->extra); - state->length += BITS(state->extra); - DROPBITS(state->extra); - state->back += state->extra; - } - Tracevv((stderr, "inflate: length %u\n", state->length)); - state->was = state->length; - state->mode = DIST; - case DIST: - for (;;) { - here = state->distcode[BITS(state->distbits)]; - if ((unsigned)(here.bits) <= bits) break; - PULLBYTE(); - } - if ((here.op & 0xf0) == 0) { - last = here; - for (;;) { - here = state->distcode[last.val + - (BITS(last.bits + last.op) >> last.bits)]; - if ((unsigned)(last.bits + here.bits) <= bits) break; - PULLBYTE(); - } - DROPBITS(last.bits); - state->back += last.bits; - } - DROPBITS(here.bits); - state->back += here.bits; - if (here.op & 64) { - strm->msg = (char *)"invalid distance code"; - state->mode = BAD; - break; - } - state->offset = (unsigned)here.val; - state->extra = (unsigned)(here.op) & 15; - state->mode = DISTEXT; - case DISTEXT: - if (state->extra) { - NEEDBITS(state->extra); - state->offset += BITS(state->extra); - DROPBITS(state->extra); - state->back += state->extra; - } -#ifdef INFLATE_STRICT - if (state->offset > state->dmax) { - strm->msg = (char *)"invalid distance too far back"; - state->mode = BAD; - break; - } -#endif - Tracevv((stderr, "inflate: distance %u\n", state->offset)); - state->mode = MATCH; - case MATCH: - if (left == 0) goto inf_leave; - copy = out - left; - if (state->offset > copy) { /* copy from window */ - copy = state->offset - copy; - if (copy > state->whave) { - if (state->sane) { - strm->msg = (char *)"invalid distance too far back"; - state->mode = BAD; - break; - } -#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR - Trace((stderr, "inflate.c too far\n")); - copy -= state->whave; - if (copy > state->length) copy = state->length; - if (copy > left) copy = left; - left -= copy; - state->length -= copy; - do { - *put++ = 0; - } while (--copy); - if (state->length == 0) state->mode = LEN; - break; -#endif - } - if (copy > state->wnext) { - copy -= state->wnext; - from = state->window + (state->wsize - copy); - } - else - from = state->window + (state->wnext - copy); - if (copy > state->length) copy = state->length; - } - else { /* copy from output */ - from = put - state->offset; - copy = state->length; - } - if (copy > left) copy = left; - left -= copy; - state->length -= copy; - do { - *put++ = *from++; - } while (--copy); - if (state->length == 0) state->mode = LEN; - break; - case LIT: - if (left == 0) goto inf_leave; - *put++ = (unsigned char)(state->length); - left--; - state->mode = LEN; - break; - case CHECK: - if (state->wrap) { - NEEDBITS(32); - out -= left; - strm->total_out += out; - state->total += out; - if (out) - strm->adler = state->check = - UPDATE(state->check, put - out, out); - out = left; - if (( -#ifdef GUNZIP - state->flags ? hold : -#endif - ZSWAP32(hold)) != state->check) { - strm->msg = (char *)"incorrect data check"; - state->mode = BAD; - break; - } - INITBITS(); - Tracev((stderr, "inflate: check matches trailer\n")); - } -#ifdef GUNZIP - state->mode = LENGTH; - case LENGTH: - if (state->wrap && state->flags) { - NEEDBITS(32); - if (hold != (state->total & 0xffffffffUL)) { - strm->msg = (char *)"incorrect length check"; - state->mode = BAD; - break; - } - INITBITS(); - Tracev((stderr, "inflate: length matches trailer\n")); - } -#endif - state->mode = DONE; - case DONE: - ret = Z_STREAM_END; - goto inf_leave; - case BAD: - ret = Z_DATA_ERROR; - goto inf_leave; - case MEM: - return Z_MEM_ERROR; - case SYNC: - default: - return Z_STREAM_ERROR; - } - - /* - Return from inflate(), updating the total counts and the check value. - If there was no progress during the inflate() call, return a buffer - error. Call updatewindow() to create and/or update the window state. - Note: a memory error from inflate() is non-recoverable. - */ - inf_leave: - RESTORE(); - if (state->wsize || (out != strm->avail_out && state->mode < BAD && - (state->mode < CHECK || flush != Z_FINISH))) - if (updatewindow(strm, strm->next_out, out - strm->avail_out)) { - state->mode = MEM; - return Z_MEM_ERROR; - } - in -= strm->avail_in; - out -= strm->avail_out; - strm->total_in += in; - strm->total_out += out; - state->total += out; - if (state->wrap && out) - strm->adler = state->check = - UPDATE(state->check, strm->next_out - out, out); - strm->data_type = state->bits + (state->last ? 64 : 0) + - (state->mode == TYPE ? 128 : 0) + - (state->mode == LEN_ || state->mode == COPY_ ? 256 : 0); - if (((in == 0 && out == 0) || flush == Z_FINISH) && ret == Z_OK) - ret = Z_BUF_ERROR; - return ret; -} - -int ZEXPORT inflateEnd(strm) -z_streamp strm; -{ - struct inflate_state FAR *state; - if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0) - return Z_STREAM_ERROR; - state = (struct inflate_state FAR *)strm->state; - if (state->window != Z_NULL) ZFREE(strm, state->window); - ZFREE(strm, strm->state); - strm->state = Z_NULL; - Tracev((stderr, "inflate: end\n")); - return Z_OK; -} - -int ZEXPORT inflateGetDictionary(strm, dictionary, dictLength) -z_streamp strm; -Bytef *dictionary; -uInt *dictLength; -{ - struct inflate_state FAR *state; - - /* check state */ - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - state = (struct inflate_state FAR *)strm->state; - - /* copy dictionary */ - if (state->whave && dictionary != Z_NULL) { - zmemcpy(dictionary, state->window + state->wnext, - state->whave - state->wnext); - zmemcpy(dictionary + state->whave - state->wnext, - state->window, state->wnext); - } - if (dictLength != Z_NULL) - *dictLength = state->whave; - return Z_OK; -} - -int ZEXPORT inflateSetDictionary(strm, dictionary, dictLength) -z_streamp strm; -const Bytef *dictionary; -uInt dictLength; -{ - struct inflate_state FAR *state; - unsigned long dictid; - int ret; - - /* check state */ - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - state = (struct inflate_state FAR *)strm->state; - if (state->wrap != 0 && state->mode != DICT) - return Z_STREAM_ERROR; - - /* check for correct dictionary identifier */ - if (state->mode == DICT) { - dictid = adler32(0L, Z_NULL, 0); - dictid = adler32(dictid, dictionary, dictLength); - if (dictid != state->check) - return Z_DATA_ERROR; - } - - /* copy dictionary to window using updatewindow(), which will amend the - existing dictionary if appropriate */ - ret = updatewindow(strm, dictionary + dictLength, dictLength); - if (ret) { - state->mode = MEM; - return Z_MEM_ERROR; - } - state->havedict = 1; - Tracev((stderr, "inflate: dictionary set\n")); - return Z_OK; -} - -int ZEXPORT inflateGetHeader(strm, head) -z_streamp strm; -gz_headerp head; -{ - struct inflate_state FAR *state; - - /* check state */ - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - state = (struct inflate_state FAR *)strm->state; - if ((state->wrap & 2) == 0) return Z_STREAM_ERROR; - - /* save header structure */ - state->head = head; - head->done = 0; - return Z_OK; -} - -/* - Search buf[0..len-1] for the pattern: 0, 0, 0xff, 0xff. Return when found - or when out of input. When called, *have is the number of pattern bytes - found in order so far, in 0..3. On return *have is updated to the new - state. If on return *have equals four, then the pattern was found and the - return value is how many bytes were read including the last byte of the - pattern. If *have is less than four, then the pattern has not been found - yet and the return value is len. In the latter case, syncsearch() can be - called again with more data and the *have state. *have is initialized to - zero for the first call. - */ -local unsigned syncsearch(have, buf, len) -unsigned FAR *have; -const unsigned char FAR *buf; -unsigned len; -{ - unsigned got; - unsigned next; - - got = *have; - next = 0; - while (next < len && got < 4) { - if ((int)(buf[next]) == (got < 2 ? 0 : 0xff)) - got++; - else if (buf[next]) - got = 0; - else - got = 4 - got; - next++; - } - *have = got; - return next; -} - -int ZEXPORT inflateSync(strm) -z_streamp strm; -{ - unsigned len; /* number of bytes to look at or looked at */ - unsigned long in, out; /* temporary to save total_in and total_out */ - unsigned char buf[4]; /* to restore bit buffer to byte string */ - struct inflate_state FAR *state; - - /* check parameters */ - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - state = (struct inflate_state FAR *)strm->state; - if (strm->avail_in == 0 && state->bits < 8) return Z_BUF_ERROR; - - /* if first time, start search in bit buffer */ - if (state->mode != SYNC) { - state->mode = SYNC; - state->hold <<= state->bits & 7; - state->bits -= state->bits & 7; - len = 0; - while (state->bits >= 8) { - buf[len++] = (unsigned char)(state->hold); - state->hold >>= 8; - state->bits -= 8; - } - state->have = 0; - syncsearch(&(state->have), buf, len); - } - - /* search available input */ - len = syncsearch(&(state->have), strm->next_in, strm->avail_in); - strm->avail_in -= len; - strm->next_in += len; - strm->total_in += len; - - /* return no joy or set up to restart inflate() on a new block */ - if (state->have != 4) return Z_DATA_ERROR; - in = strm->total_in; out = strm->total_out; - inflateReset(strm); - strm->total_in = in; strm->total_out = out; - state->mode = TYPE; - return Z_OK; -} - -/* - Returns true if inflate is currently at the end of a block generated by - Z_SYNC_FLUSH or Z_FULL_FLUSH. This function is used by one PPP - implementation to provide an additional safety check. PPP uses - Z_SYNC_FLUSH but removes the length bytes of the resulting empty stored - block. When decompressing, PPP checks that at the end of input packet, - inflate is waiting for these length bytes. - */ -int ZEXPORT inflateSyncPoint(strm) -z_streamp strm; -{ - struct inflate_state FAR *state; - - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - state = (struct inflate_state FAR *)strm->state; - return state->mode == STORED && state->bits == 0; -} - -int ZEXPORT inflateCopy(dest, source) -z_streamp dest; -z_streamp source; -{ - struct inflate_state FAR *state; - struct inflate_state FAR *copy; - unsigned char FAR *window; - unsigned wsize; - - /* check input */ - if (dest == Z_NULL || source == Z_NULL || source->state == Z_NULL || - source->zalloc == (alloc_func)0 || source->zfree == (free_func)0) - return Z_STREAM_ERROR; - state = (struct inflate_state FAR *)source->state; - - /* allocate space */ - copy = (struct inflate_state FAR *) - ZALLOC(source, 1, sizeof(struct inflate_state)); - if (copy == Z_NULL) return Z_MEM_ERROR; - window = Z_NULL; - if (state->window != Z_NULL) { - window = (unsigned char FAR *) - ZALLOC(source, 1U << state->wbits, sizeof(unsigned char)); - if (window == Z_NULL) { - ZFREE(source, copy); - return Z_MEM_ERROR; - } - } - - /* copy state */ - zmemcpy((voidpf)dest, (voidpf)source, sizeof(z_stream)); - zmemcpy((voidpf)copy, (voidpf)state, sizeof(struct inflate_state)); - if (state->lencode >= state->codes && - state->lencode <= state->codes + ENOUGH - 1) { - copy->lencode = copy->codes + (state->lencode - state->codes); - copy->distcode = copy->codes + (state->distcode - state->codes); - } - copy->next = copy->codes + (state->next - state->codes); - if (window != Z_NULL) { - wsize = 1U << state->wbits; - zmemcpy(window, state->window, wsize); - } - copy->window = window; - dest->state = (struct internal_state FAR *)copy; - return Z_OK; -} - -int ZEXPORT inflateUndermine(strm, subvert) -z_streamp strm; -int subvert; -{ - struct inflate_state FAR *state; - - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - state = (struct inflate_state FAR *)strm->state; - state->sane = !subvert; -#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR - return Z_OK; -#else - state->sane = 1; - return Z_DATA_ERROR; -#endif -} - -long ZEXPORT inflateMark(strm) -z_streamp strm; -{ - struct inflate_state FAR *state; - - if (strm == Z_NULL || strm->state == Z_NULL) return -1L << 16; - state = (struct inflate_state FAR *)strm->state; - return ((long)(state->back) << 16) + - (state->mode == COPY ? state->length : - (state->mode == MATCH ? state->was - state->length : 0)); -} diff --git a/vendor/libgit2/deps/zlib/inflate.h b/vendor/libgit2/deps/zlib/inflate.h deleted file mode 100644 index 95f4986d40..0000000000 --- a/vendor/libgit2/deps/zlib/inflate.h +++ /dev/null @@ -1,122 +0,0 @@ -/* inflate.h -- internal inflate state definition - * Copyright (C) 1995-2009 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* WARNING: this file should *not* be used by applications. It is - part of the implementation of the compression library and is - subject to change. Applications should only use zlib.h. - */ - -/* define NO_GZIP when compiling if you want to disable gzip header and - trailer decoding by inflate(). NO_GZIP would be used to avoid linking in - the crc code when it is not needed. For shared libraries, gzip decoding - should be left enabled. */ -#ifndef NO_GZIP -# define GUNZIP -#endif - -/* Possible inflate modes between inflate() calls */ -typedef enum { - HEAD, /* i: waiting for magic header */ - FLAGS, /* i: waiting for method and flags (gzip) */ - TIME, /* i: waiting for modification time (gzip) */ - OS, /* i: waiting for extra flags and operating system (gzip) */ - EXLEN, /* i: waiting for extra length (gzip) */ - EXTRA, /* i: waiting for extra bytes (gzip) */ - NAME, /* i: waiting for end of file name (gzip) */ - COMMENT, /* i: waiting for end of comment (gzip) */ - HCRC, /* i: waiting for header crc (gzip) */ - DICTID, /* i: waiting for dictionary check value */ - DICT, /* waiting for inflateSetDictionary() call */ - TYPE, /* i: waiting for type bits, including last-flag bit */ - TYPEDO, /* i: same, but skip check to exit inflate on new block */ - STORED, /* i: waiting for stored size (length and complement) */ - COPY_, /* i/o: same as COPY below, but only first time in */ - COPY, /* i/o: waiting for input or output to copy stored block */ - TABLE, /* i: waiting for dynamic block table lengths */ - LENLENS, /* i: waiting for code length code lengths */ - CODELENS, /* i: waiting for length/lit and distance code lengths */ - LEN_, /* i: same as LEN below, but only first time in */ - LEN, /* i: waiting for length/lit/eob code */ - LENEXT, /* i: waiting for length extra bits */ - DIST, /* i: waiting for distance code */ - DISTEXT, /* i: waiting for distance extra bits */ - MATCH, /* o: waiting for output space to copy string */ - LIT, /* o: waiting for output space to write literal */ - CHECK, /* i: waiting for 32-bit check value */ - LENGTH, /* i: waiting for 32-bit length (gzip) */ - DONE, /* finished check, done -- remain here until reset */ - BAD, /* got a data error -- remain here until reset */ - MEM, /* got an inflate() memory error -- remain here until reset */ - SYNC /* looking for synchronization bytes to restart inflate() */ -} inflate_mode; - -/* - State transitions between above modes - - - (most modes can go to BAD or MEM on error -- not shown for clarity) - - Process header: - HEAD -> (gzip) or (zlib) or (raw) - (gzip) -> FLAGS -> TIME -> OS -> EXLEN -> EXTRA -> NAME -> COMMENT -> - HCRC -> TYPE - (zlib) -> DICTID or TYPE - DICTID -> DICT -> TYPE - (raw) -> TYPEDO - Read deflate blocks: - TYPE -> TYPEDO -> STORED or TABLE or LEN_ or CHECK - STORED -> COPY_ -> COPY -> TYPE - TABLE -> LENLENS -> CODELENS -> LEN_ - LEN_ -> LEN - Read deflate codes in fixed or dynamic block: - LEN -> LENEXT or LIT or TYPE - LENEXT -> DIST -> DISTEXT -> MATCH -> LEN - LIT -> LEN - Process trailer: - CHECK -> LENGTH -> DONE - */ - -/* state maintained between inflate() calls. Approximately 10K bytes. */ -struct inflate_state { - inflate_mode mode; /* current inflate mode */ - int last; /* true if processing last block */ - int wrap; /* bit 0 true for zlib, bit 1 true for gzip */ - int havedict; /* true if dictionary provided */ - int flags; /* gzip header method and flags (0 if zlib) */ - unsigned dmax; /* zlib header max distance (INFLATE_STRICT) */ - unsigned long check; /* protected copy of check value */ - unsigned long total; /* protected copy of output count */ - gz_headerp head; /* where to save gzip header information */ - /* sliding window */ - unsigned wbits; /* log base 2 of requested window size */ - unsigned wsize; /* window size or zero if not using window */ - unsigned whave; /* valid bytes in the window */ - unsigned wnext; /* window write index */ - unsigned char FAR *window; /* allocated sliding window, if needed */ - /* bit accumulator */ - unsigned long hold; /* input bit accumulator */ - unsigned bits; /* number of bits in "in" */ - /* for string and stored block copying */ - unsigned length; /* literal or length of data to copy */ - unsigned offset; /* distance back to copy string from */ - /* for table and code decoding */ - unsigned extra; /* extra bits needed */ - /* fixed and dynamic code tables */ - code const FAR *lencode; /* starting table for length/literal codes */ - code const FAR *distcode; /* starting table for distance codes */ - unsigned lenbits; /* index bits for lencode */ - unsigned distbits; /* index bits for distcode */ - /* dynamic table building */ - unsigned ncode; /* number of code length code lengths */ - unsigned nlen; /* number of length code lengths */ - unsigned ndist; /* number of distance code lengths */ - unsigned have; /* number of code lengths in lens[] */ - code FAR *next; /* next available space in codes[] */ - unsigned short lens[320]; /* temporary storage for code lengths */ - unsigned short work[288]; /* work area for code table building */ - code codes[ENOUGH]; /* space for code tables */ - int sane; /* if false, allow invalid distance too far */ - int back; /* bits back of last unprocessed length/lit */ - unsigned was; /* initial length of match */ -}; diff --git a/vendor/libgit2/deps/zlib/inftrees.c b/vendor/libgit2/deps/zlib/inftrees.c deleted file mode 100644 index 44d89cf24e..0000000000 --- a/vendor/libgit2/deps/zlib/inftrees.c +++ /dev/null @@ -1,306 +0,0 @@ -/* inftrees.c -- generate Huffman trees for efficient decoding - * Copyright (C) 1995-2013 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -#include "zutil.h" -#include "inftrees.h" - -#define MAXBITS 15 - -const char inflate_copyright[] = - " inflate 1.2.8 Copyright 1995-2013 Mark Adler "; -/* - If you use the zlib library in a product, an acknowledgment is welcome - in the documentation of your product. If for some reason you cannot - include such an acknowledgment, I would appreciate that you keep this - copyright string in the executable of your product. - */ - -/* - Build a set of tables to decode the provided canonical Huffman code. - The code lengths are lens[0..codes-1]. The result starts at *table, - whose indices are 0..2^bits-1. work is a writable array of at least - lens shorts, which is used as a work area. type is the type of code - to be generated, CODES, LENS, or DISTS. On return, zero is success, - -1 is an invalid code, and +1 means that ENOUGH isn't enough. table - on return points to the next available entry's address. bits is the - requested root table index bits, and on return it is the actual root - table index bits. It will differ if the request is greater than the - longest code or if it is less than the shortest code. - */ -int ZLIB_INTERNAL inflate_table(type, lens, codes, table, bits, work) -codetype type; -unsigned short FAR *lens; -unsigned codes; -code FAR * FAR *table; -unsigned FAR *bits; -unsigned short FAR *work; -{ - unsigned len; /* a code's length in bits */ - unsigned sym; /* index of code symbols */ - unsigned min, max; /* minimum and maximum code lengths */ - unsigned root; /* number of index bits for root table */ - unsigned curr; /* number of index bits for current table */ - unsigned drop; /* code bits to drop for sub-table */ - int left; /* number of prefix codes available */ - unsigned used; /* code entries in table used */ - unsigned huff; /* Huffman code */ - unsigned incr; /* for incrementing code, index */ - unsigned fill; /* index for replicating entries */ - unsigned low; /* low bits for current root entry */ - unsigned mask; /* mask for low root bits */ - code here; /* table entry for duplication */ - code FAR *next; /* next available space in table */ - const unsigned short FAR *base; /* base value table to use */ - const unsigned short FAR *extra; /* extra bits table to use */ - int end; /* use base and extra for symbol > end */ - unsigned short count[MAXBITS+1]; /* number of codes of each length */ - unsigned short offs[MAXBITS+1]; /* offsets in table for each length */ - static const unsigned short lbase[31] = { /* Length codes 257..285 base */ - 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, - 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0}; - static const unsigned short lext[31] = { /* Length codes 257..285 extra */ - 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, - 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78}; - static const unsigned short dbase[32] = { /* Distance codes 0..29 base */ - 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, - 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, - 8193, 12289, 16385, 24577, 0, 0}; - static const unsigned short dext[32] = { /* Distance codes 0..29 extra */ - 16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, - 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, - 28, 28, 29, 29, 64, 64}; - - /* - Process a set of code lengths to create a canonical Huffman code. The - code lengths are lens[0..codes-1]. Each length corresponds to the - symbols 0..codes-1. The Huffman code is generated by first sorting the - symbols by length from short to long, and retaining the symbol order - for codes with equal lengths. Then the code starts with all zero bits - for the first code of the shortest length, and the codes are integer - increments for the same length, and zeros are appended as the length - increases. For the deflate format, these bits are stored backwards - from their more natural integer increment ordering, and so when the - decoding tables are built in the large loop below, the integer codes - are incremented backwards. - - This routine assumes, but does not check, that all of the entries in - lens[] are in the range 0..MAXBITS. The caller must assure this. - 1..MAXBITS is interpreted as that code length. zero means that that - symbol does not occur in this code. - - The codes are sorted by computing a count of codes for each length, - creating from that a table of starting indices for each length in the - sorted table, and then entering the symbols in order in the sorted - table. The sorted table is work[], with that space being provided by - the caller. - - The length counts are used for other purposes as well, i.e. finding - the minimum and maximum length codes, determining if there are any - codes at all, checking for a valid set of lengths, and looking ahead - at length counts to determine sub-table sizes when building the - decoding tables. - */ - - /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */ - for (len = 0; len <= MAXBITS; len++) - count[len] = 0; - for (sym = 0; sym < codes; sym++) - count[lens[sym]]++; - - /* bound code lengths, force root to be within code lengths */ - root = *bits; - for (max = MAXBITS; max >= 1; max--) - if (count[max] != 0) break; - if (root > max) root = max; - if (max == 0) { /* no symbols to code at all */ - here.op = (unsigned char)64; /* invalid code marker */ - here.bits = (unsigned char)1; - here.val = (unsigned short)0; - *(*table)++ = here; /* make a table to force an error */ - *(*table)++ = here; - *bits = 1; - return 0; /* no symbols, but wait for decoding to report error */ - } - for (min = 1; min < max; min++) - if (count[min] != 0) break; - if (root < min) root = min; - - /* check for an over-subscribed or incomplete set of lengths */ - left = 1; - for (len = 1; len <= MAXBITS; len++) { - left <<= 1; - left -= count[len]; - if (left < 0) return -1; /* over-subscribed */ - } - if (left > 0 && (type == CODES || max != 1)) - return -1; /* incomplete set */ - - /* generate offsets into symbol table for each length for sorting */ - offs[1] = 0; - for (len = 1; len < MAXBITS; len++) - offs[len + 1] = offs[len] + count[len]; - - /* sort symbols by length, by symbol order within each length */ - for (sym = 0; sym < codes; sym++) - if (lens[sym] != 0) work[offs[lens[sym]]++] = (unsigned short)sym; - - /* - Create and fill in decoding tables. In this loop, the table being - filled is at next and has curr index bits. The code being used is huff - with length len. That code is converted to an index by dropping drop - bits off of the bottom. For codes where len is less than drop + curr, - those top drop + curr - len bits are incremented through all values to - fill the table with replicated entries. - - root is the number of index bits for the root table. When len exceeds - root, sub-tables are created pointed to by the root entry with an index - of the low root bits of huff. This is saved in low to check for when a - new sub-table should be started. drop is zero when the root table is - being filled, and drop is root when sub-tables are being filled. - - When a new sub-table is needed, it is necessary to look ahead in the - code lengths to determine what size sub-table is needed. The length - counts are used for this, and so count[] is decremented as codes are - entered in the tables. - - used keeps track of how many table entries have been allocated from the - provided *table space. It is checked for LENS and DIST tables against - the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in - the initial root table size constants. See the comments in inftrees.h - for more information. - - sym increments through all symbols, and the loop terminates when - all codes of length max, i.e. all codes, have been processed. This - routine permits incomplete codes, so another loop after this one fills - in the rest of the decoding tables with invalid code markers. - */ - - /* set up for code type */ - switch (type) { - case CODES: - base = extra = work; /* dummy value--not used */ - end = 19; - break; - case LENS: - base = lbase; - base -= 257; - extra = lext; - extra -= 257; - end = 256; - break; - default: /* DISTS */ - base = dbase; - extra = dext; - end = -1; - } - - /* initialize state for loop */ - huff = 0; /* starting code */ - sym = 0; /* starting code symbol */ - len = min; /* starting code length */ - next = *table; /* current table to fill in */ - curr = root; /* current table index bits */ - drop = 0; /* current bits to drop from code for index */ - low = (unsigned)(-1); /* trigger new sub-table when len > root */ - used = 1U << root; /* use root table entries */ - mask = used - 1; /* mask for comparing low */ - - /* check available table space */ - if ((type == LENS && used > ENOUGH_LENS) || - (type == DISTS && used > ENOUGH_DISTS)) - return 1; - - /* process all codes and make table entries */ - for (;;) { - /* create table entry */ - here.bits = (unsigned char)(len - drop); - if ((int)(work[sym]) < end) { - here.op = (unsigned char)0; - here.val = work[sym]; - } - else if ((int)(work[sym]) > end) { - here.op = (unsigned char)(extra[work[sym]]); - here.val = base[work[sym]]; - } - else { - here.op = (unsigned char)(32 + 64); /* end of block */ - here.val = 0; - } - - /* replicate for those indices with low len bits equal to huff */ - incr = 1U << (len - drop); - fill = 1U << curr; - min = fill; /* save offset to next table */ - do { - fill -= incr; - next[(huff >> drop) + fill] = here; - } while (fill != 0); - - /* backwards increment the len-bit code huff */ - incr = 1U << (len - 1); - while (huff & incr) - incr >>= 1; - if (incr != 0) { - huff &= incr - 1; - huff += incr; - } - else - huff = 0; - - /* go to next symbol, update count, len */ - sym++; - if (--(count[len]) == 0) { - if (len == max) break; - len = lens[work[sym]]; - } - - /* create new sub-table if needed */ - if (len > root && (huff & mask) != low) { - /* if first time, transition to sub-tables */ - if (drop == 0) - drop = root; - - /* increment past last table */ - next += min; /* here min is 1 << curr */ - - /* determine length of next table */ - curr = len - drop; - left = (int)(1 << curr); - while (curr + drop < max) { - left -= count[curr + drop]; - if (left <= 0) break; - curr++; - left <<= 1; - } - - /* check for enough space */ - used += 1U << curr; - if ((type == LENS && used > ENOUGH_LENS) || - (type == DISTS && used > ENOUGH_DISTS)) - return 1; - - /* point entry in root table to sub-table */ - low = huff & mask; - (*table)[low].op = (unsigned char)curr; - (*table)[low].bits = (unsigned char)root; - (*table)[low].val = (unsigned short)(next - *table); - } - } - - /* fill in remaining table entry if code is incomplete (guaranteed to have - at most one remaining entry, since if the code is incomplete, the - maximum code length that was allowed to get this far is one bit) */ - if (huff != 0) { - here.op = (unsigned char)64; /* invalid code marker */ - here.bits = (unsigned char)(len - drop); - here.val = (unsigned short)0; - next[huff] = here; - } - - /* set return parameters */ - *table += used; - *bits = root; - return 0; -} diff --git a/vendor/libgit2/deps/zlib/inftrees.h b/vendor/libgit2/deps/zlib/inftrees.h deleted file mode 100644 index baa53a0b1a..0000000000 --- a/vendor/libgit2/deps/zlib/inftrees.h +++ /dev/null @@ -1,62 +0,0 @@ -/* inftrees.h -- header to use inftrees.c - * Copyright (C) 1995-2005, 2010 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* WARNING: this file should *not* be used by applications. It is - part of the implementation of the compression library and is - subject to change. Applications should only use zlib.h. - */ - -/* Structure for decoding tables. Each entry provides either the - information needed to do the operation requested by the code that - indexed that table entry, or it provides a pointer to another - table that indexes more bits of the code. op indicates whether - the entry is a pointer to another table, a literal, a length or - distance, an end-of-block, or an invalid code. For a table - pointer, the low four bits of op is the number of index bits of - that table. For a length or distance, the low four bits of op - is the number of extra bits to get after the code. bits is - the number of bits in this code or part of the code to drop off - of the bit buffer. val is the actual byte to output in the case - of a literal, the base length or distance, or the offset from - the current table to the next table. Each entry is four bytes. */ -typedef struct { - unsigned char op; /* operation, extra bits, table bits */ - unsigned char bits; /* bits in this part of the code */ - unsigned short val; /* offset in table or code value */ -} code; - -/* op values as set by inflate_table(): - 00000000 - literal - 0000tttt - table link, tttt != 0 is the number of table index bits - 0001eeee - length or distance, eeee is the number of extra bits - 01100000 - end of block - 01000000 - invalid code - */ - -/* Maximum size of the dynamic table. The maximum number of code structures is - 1444, which is the sum of 852 for literal/length codes and 592 for distance - codes. These values were found by exhaustive searches using the program - examples/enough.c found in the zlib distribtution. The arguments to that - program are the number of symbols, the initial root table size, and the - maximum bit length of a code. "enough 286 9 15" for literal/length codes - returns returns 852, and "enough 30 6 15" for distance codes returns 592. - The initial root table size (9 or 6) is found in the fifth argument of the - inflate_table() calls in inflate.c and infback.c. If the root table size is - changed, then these maximum sizes would be need to be recalculated and - updated. */ -#define ENOUGH_LENS 852 -#define ENOUGH_DISTS 592 -#define ENOUGH (ENOUGH_LENS+ENOUGH_DISTS) - -/* Type of code to build for inflate_table() */ -typedef enum { - CODES, - LENS, - DISTS -} codetype; - -int ZLIB_INTERNAL inflate_table OF((codetype type, unsigned short FAR *lens, - unsigned codes, code FAR * FAR *table, - unsigned FAR *bits, unsigned short FAR *work)); diff --git a/vendor/libgit2/deps/zlib/trees.c b/vendor/libgit2/deps/zlib/trees.c deleted file mode 100644 index bb866f012a..0000000000 --- a/vendor/libgit2/deps/zlib/trees.c +++ /dev/null @@ -1,1226 +0,0 @@ -/* trees.c -- output deflated data using Huffman coding - * Copyright (C) 1995-2012 Jean-loup Gailly - * detect_data_type() function provided freely by Cosmin Truta, 2006 - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* - * ALGORITHM - * - * The "deflation" process uses several Huffman trees. The more - * common source values are represented by shorter bit sequences. - * - * Each code tree is stored in a compressed form which is itself - * a Huffman encoding of the lengths of all the code strings (in - * ascending order by source values). The actual code strings are - * reconstructed from the lengths in the inflate process, as described - * in the deflate specification. - * - * REFERENCES - * - * Deutsch, L.P.,"'Deflate' Compressed Data Format Specification". - * Available in ftp.uu.net:/pub/archiving/zip/doc/deflate-1.1.doc - * - * Storer, James A. - * Data Compression: Methods and Theory, pp. 49-50. - * Computer Science Press, 1988. ISBN 0-7167-8156-5. - * - * Sedgewick, R. - * Algorithms, p290. - * Addison-Wesley, 1983. ISBN 0-201-06672-6. - */ - -/* @(#) $Id$ */ - -/* #define GEN_TREES_H */ - -#include "deflate.h" - -#ifdef DEBUG -# include -#endif - -/* =========================================================================== - * Constants - */ - -#define MAX_BL_BITS 7 -/* Bit length codes must not exceed MAX_BL_BITS bits */ - -#define END_BLOCK 256 -/* end of block literal code */ - -#define REP_3_6 16 -/* repeat previous bit length 3-6 times (2 bits of repeat count) */ - -#define REPZ_3_10 17 -/* repeat a zero length 3-10 times (3 bits of repeat count) */ - -#define REPZ_11_138 18 -/* repeat a zero length 11-138 times (7 bits of repeat count) */ - -local const int extra_lbits[LENGTH_CODES] /* extra bits for each length code */ - = {0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0}; - -local const int extra_dbits[D_CODES] /* extra bits for each distance code */ - = {0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13}; - -local const int extra_blbits[BL_CODES]/* extra bits for each bit length code */ - = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7}; - -local const uch bl_order[BL_CODES] - = {16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15}; -/* The lengths of the bit length codes are sent in order of decreasing - * probability, to avoid transmitting the lengths for unused bit length codes. - */ - -/* =========================================================================== - * Local data. These are initialized only once. - */ - -#define DIST_CODE_LEN 512 /* see definition of array dist_code below */ - -#if defined(GEN_TREES_H) || !defined(STDC) -/* non ANSI compilers may not accept trees.h */ - -local ct_data static_ltree[L_CODES+2]; -/* The static literal tree. Since the bit lengths are imposed, there is no - * need for the L_CODES extra codes used during heap construction. However - * The codes 286 and 287 are needed to build a canonical tree (see _tr_init - * below). - */ - -local ct_data static_dtree[D_CODES]; -/* The static distance tree. (Actually a trivial tree since all codes use - * 5 bits.) - */ - -uch _dist_code[DIST_CODE_LEN]; -/* Distance codes. The first 256 values correspond to the distances - * 3 .. 258, the last 256 values correspond to the top 8 bits of - * the 15 bit distances. - */ - -uch _length_code[MAX_MATCH-MIN_MATCH+1]; -/* length code for each normalized match length (0 == MIN_MATCH) */ - -local int base_length[LENGTH_CODES]; -/* First normalized length for each code (0 = MIN_MATCH) */ - -local int base_dist[D_CODES]; -/* First normalized distance for each code (0 = distance of 1) */ - -#else -# include "trees.h" -#endif /* GEN_TREES_H */ - -struct static_tree_desc_s { - const ct_data *static_tree; /* static tree or NULL */ - const intf *extra_bits; /* extra bits for each code or NULL */ - int extra_base; /* base index for extra_bits */ - int elems; /* max number of elements in the tree */ - int max_length; /* max bit length for the codes */ -}; - -local static_tree_desc static_l_desc = -{static_ltree, extra_lbits, LITERALS+1, L_CODES, MAX_BITS}; - -local static_tree_desc static_d_desc = -{static_dtree, extra_dbits, 0, D_CODES, MAX_BITS}; - -local static_tree_desc static_bl_desc = -{(const ct_data *)0, extra_blbits, 0, BL_CODES, MAX_BL_BITS}; - -/* =========================================================================== - * Local (static) routines in this file. - */ - -local void tr_static_init OF((void)); -local void init_block OF((deflate_state *s)); -local void pqdownheap OF((deflate_state *s, ct_data *tree, int k)); -local void gen_bitlen OF((deflate_state *s, tree_desc *desc)); -local void gen_codes OF((ct_data *tree, int max_code, ushf *bl_count)); -local void build_tree OF((deflate_state *s, tree_desc *desc)); -local void scan_tree OF((deflate_state *s, ct_data *tree, int max_code)); -local void send_tree OF((deflate_state *s, ct_data *tree, int max_code)); -local int build_bl_tree OF((deflate_state *s)); -local void send_all_trees OF((deflate_state *s, int lcodes, int dcodes, - int blcodes)); -local void compress_block OF((deflate_state *s, const ct_data *ltree, - const ct_data *dtree)); -local int detect_data_type OF((deflate_state *s)); -local unsigned bi_reverse OF((unsigned value, int length)); -local void bi_windup OF((deflate_state *s)); -local void bi_flush OF((deflate_state *s)); -local void copy_block OF((deflate_state *s, charf *buf, unsigned len, - int header)); - -#ifdef GEN_TREES_H -local void gen_trees_header OF((void)); -#endif - -#ifndef DEBUG -# define send_code(s, c, tree) send_bits(s, tree[c].Code, tree[c].Len) - /* Send a code of the given tree. c and tree must not have side effects */ - -#else /* DEBUG */ -# define send_code(s, c, tree) \ - { if (z_verbose>2) fprintf(stderr,"\ncd %3d ",(c)); \ - send_bits(s, tree[c].Code, tree[c].Len); } -#endif - -/* =========================================================================== - * Output a short LSB first on the stream. - * IN assertion: there is enough room in pendingBuf. - */ -#define put_short(s, w) { \ - put_byte(s, (uch)((w) & 0xff)); \ - put_byte(s, (uch)((ush)(w) >> 8)); \ -} - -/* =========================================================================== - * Send a value on a given number of bits. - * IN assertion: length <= 16 and value fits in length bits. - */ -#ifdef DEBUG -local void send_bits OF((deflate_state *s, int value, int length)); - -local void send_bits(s, value, length) - deflate_state *s; - int value; /* value to send */ - int length; /* number of bits */ -{ - Tracevv((stderr," l %2d v %4x ", length, value)); - Assert(length > 0 && length <= 15, "invalid length"); - s->bits_sent += (ulg)length; - - /* If not enough room in bi_buf, use (valid) bits from bi_buf and - * (16 - bi_valid) bits from value, leaving (width - (16-bi_valid)) - * unused bits in value. - */ - if (s->bi_valid > (int)Buf_size - length) { - s->bi_buf |= (ush)value << s->bi_valid; - put_short(s, s->bi_buf); - s->bi_buf = (ush)value >> (Buf_size - s->bi_valid); - s->bi_valid += length - Buf_size; - } else { - s->bi_buf |= (ush)value << s->bi_valid; - s->bi_valid += length; - } -} -#else /* !DEBUG */ - -#define send_bits(s, value, length) \ -{ int len = length;\ - if (s->bi_valid > (int)Buf_size - len) {\ - int val = value;\ - s->bi_buf |= (ush)val << s->bi_valid;\ - put_short(s, s->bi_buf);\ - s->bi_buf = (ush)val >> (Buf_size - s->bi_valid);\ - s->bi_valid += len - Buf_size;\ - } else {\ - s->bi_buf |= (ush)(value) << s->bi_valid;\ - s->bi_valid += len;\ - }\ -} -#endif /* DEBUG */ - - -/* the arguments must not have side effects */ - -/* =========================================================================== - * Initialize the various 'constant' tables. - */ -local void tr_static_init() -{ -#if defined(GEN_TREES_H) || !defined(STDC) - static int static_init_done = 0; - int n; /* iterates over tree elements */ - int bits; /* bit counter */ - int length; /* length value */ - int code; /* code value */ - int dist; /* distance index */ - ush bl_count[MAX_BITS+1]; - /* number of codes at each bit length for an optimal tree */ - - if (static_init_done) return; - - /* For some embedded targets, global variables are not initialized: */ -#ifdef NO_INIT_GLOBAL_POINTERS - static_l_desc.static_tree = static_ltree; - static_l_desc.extra_bits = extra_lbits; - static_d_desc.static_tree = static_dtree; - static_d_desc.extra_bits = extra_dbits; - static_bl_desc.extra_bits = extra_blbits; -#endif - - /* Initialize the mapping length (0..255) -> length code (0..28) */ - length = 0; - for (code = 0; code < LENGTH_CODES-1; code++) { - base_length[code] = length; - for (n = 0; n < (1< dist code (0..29) */ - dist = 0; - for (code = 0 ; code < 16; code++) { - base_dist[code] = dist; - for (n = 0; n < (1<>= 7; /* from now on, all distances are divided by 128 */ - for ( ; code < D_CODES; code++) { - base_dist[code] = dist << 7; - for (n = 0; n < (1<<(extra_dbits[code]-7)); n++) { - _dist_code[256 + dist++] = (uch)code; - } - } - Assert (dist == 256, "tr_static_init: 256+dist != 512"); - - /* Construct the codes of the static literal tree */ - for (bits = 0; bits <= MAX_BITS; bits++) bl_count[bits] = 0; - n = 0; - while (n <= 143) static_ltree[n++].Len = 8, bl_count[8]++; - while (n <= 255) static_ltree[n++].Len = 9, bl_count[9]++; - while (n <= 279) static_ltree[n++].Len = 7, bl_count[7]++; - while (n <= 287) static_ltree[n++].Len = 8, bl_count[8]++; - /* Codes 286 and 287 do not exist, but we must include them in the - * tree construction to get a canonical Huffman tree (longest code - * all ones) - */ - gen_codes((ct_data *)static_ltree, L_CODES+1, bl_count); - - /* The static distance tree is trivial: */ - for (n = 0; n < D_CODES; n++) { - static_dtree[n].Len = 5; - static_dtree[n].Code = bi_reverse((unsigned)n, 5); - } - static_init_done = 1; - -# ifdef GEN_TREES_H - gen_trees_header(); -# endif -#endif /* defined(GEN_TREES_H) || !defined(STDC) */ -} - -/* =========================================================================== - * Genererate the file trees.h describing the static trees. - */ -#ifdef GEN_TREES_H -# ifndef DEBUG -# include -# endif - -# define SEPARATOR(i, last, width) \ - ((i) == (last)? "\n};\n\n" : \ - ((i) % (width) == (width)-1 ? ",\n" : ", ")) - -void gen_trees_header() -{ - FILE *header = fopen("trees.h", "w"); - int i; - - Assert (header != NULL, "Can't open trees.h"); - fprintf(header, - "/* header created automatically with -DGEN_TREES_H */\n\n"); - - fprintf(header, "local const ct_data static_ltree[L_CODES+2] = {\n"); - for (i = 0; i < L_CODES+2; i++) { - fprintf(header, "{{%3u},{%3u}}%s", static_ltree[i].Code, - static_ltree[i].Len, SEPARATOR(i, L_CODES+1, 5)); - } - - fprintf(header, "local const ct_data static_dtree[D_CODES] = {\n"); - for (i = 0; i < D_CODES; i++) { - fprintf(header, "{{%2u},{%2u}}%s", static_dtree[i].Code, - static_dtree[i].Len, SEPARATOR(i, D_CODES-1, 5)); - } - - fprintf(header, "const uch ZLIB_INTERNAL _dist_code[DIST_CODE_LEN] = {\n"); - for (i = 0; i < DIST_CODE_LEN; i++) { - fprintf(header, "%2u%s", _dist_code[i], - SEPARATOR(i, DIST_CODE_LEN-1, 20)); - } - - fprintf(header, - "const uch ZLIB_INTERNAL _length_code[MAX_MATCH-MIN_MATCH+1]= {\n"); - for (i = 0; i < MAX_MATCH-MIN_MATCH+1; i++) { - fprintf(header, "%2u%s", _length_code[i], - SEPARATOR(i, MAX_MATCH-MIN_MATCH, 20)); - } - - fprintf(header, "local const int base_length[LENGTH_CODES] = {\n"); - for (i = 0; i < LENGTH_CODES; i++) { - fprintf(header, "%1u%s", base_length[i], - SEPARATOR(i, LENGTH_CODES-1, 20)); - } - - fprintf(header, "local const int base_dist[D_CODES] = {\n"); - for (i = 0; i < D_CODES; i++) { - fprintf(header, "%5u%s", base_dist[i], - SEPARATOR(i, D_CODES-1, 10)); - } - - fclose(header); -} -#endif /* GEN_TREES_H */ - -/* =========================================================================== - * Initialize the tree data structures for a new zlib stream. - */ -void ZLIB_INTERNAL _tr_init(s) - deflate_state *s; -{ - tr_static_init(); - - s->l_desc.dyn_tree = s->dyn_ltree; - s->l_desc.stat_desc = &static_l_desc; - - s->d_desc.dyn_tree = s->dyn_dtree; - s->d_desc.stat_desc = &static_d_desc; - - s->bl_desc.dyn_tree = s->bl_tree; - s->bl_desc.stat_desc = &static_bl_desc; - - s->bi_buf = 0; - s->bi_valid = 0; -#ifdef DEBUG - s->compressed_len = 0L; - s->bits_sent = 0L; -#endif - - /* Initialize the first block of the first file: */ - init_block(s); -} - -/* =========================================================================== - * Initialize a new block. - */ -local void init_block(s) - deflate_state *s; -{ - int n; /* iterates over tree elements */ - - /* Initialize the trees. */ - for (n = 0; n < L_CODES; n++) s->dyn_ltree[n].Freq = 0; - for (n = 0; n < D_CODES; n++) s->dyn_dtree[n].Freq = 0; - for (n = 0; n < BL_CODES; n++) s->bl_tree[n].Freq = 0; - - s->dyn_ltree[END_BLOCK].Freq = 1; - s->opt_len = s->static_len = 0L; - s->last_lit = s->matches = 0; -} - -#define SMALLEST 1 -/* Index within the heap array of least frequent node in the Huffman tree */ - - -/* =========================================================================== - * Remove the smallest element from the heap and recreate the heap with - * one less element. Updates heap and heap_len. - */ -#define pqremove(s, tree, top) \ -{\ - top = s->heap[SMALLEST]; \ - s->heap[SMALLEST] = s->heap[s->heap_len--]; \ - pqdownheap(s, tree, SMALLEST); \ -} - -/* =========================================================================== - * Compares to subtrees, using the tree depth as tie breaker when - * the subtrees have equal frequency. This minimizes the worst case length. - */ -#define smaller(tree, n, m, depth) \ - (tree[n].Freq < tree[m].Freq || \ - (tree[n].Freq == tree[m].Freq && depth[n] <= depth[m])) - -/* =========================================================================== - * Restore the heap property by moving down the tree starting at node k, - * exchanging a node with the smallest of its two sons if necessary, stopping - * when the heap property is re-established (each father smaller than its - * two sons). - */ -local void pqdownheap(s, tree, k) - deflate_state *s; - ct_data *tree; /* the tree to restore */ - int k; /* node to move down */ -{ - int v = s->heap[k]; - int j = k << 1; /* left son of k */ - while (j <= s->heap_len) { - /* Set j to the smallest of the two sons: */ - if (j < s->heap_len && - smaller(tree, s->heap[j+1], s->heap[j], s->depth)) { - j++; - } - /* Exit if v is smaller than both sons */ - if (smaller(tree, v, s->heap[j], s->depth)) break; - - /* Exchange v with the smallest son */ - s->heap[k] = s->heap[j]; k = j; - - /* And continue down the tree, setting j to the left son of k */ - j <<= 1; - } - s->heap[k] = v; -} - -/* =========================================================================== - * Compute the optimal bit lengths for a tree and update the total bit length - * for the current block. - * IN assertion: the fields freq and dad are set, heap[heap_max] and - * above are the tree nodes sorted by increasing frequency. - * OUT assertions: the field len is set to the optimal bit length, the - * array bl_count contains the frequencies for each bit length. - * The length opt_len is updated; static_len is also updated if stree is - * not null. - */ -local void gen_bitlen(s, desc) - deflate_state *s; - tree_desc *desc; /* the tree descriptor */ -{ - ct_data *tree = desc->dyn_tree; - int max_code = desc->max_code; - const ct_data *stree = desc->stat_desc->static_tree; - const intf *extra = desc->stat_desc->extra_bits; - int base = desc->stat_desc->extra_base; - int max_length = desc->stat_desc->max_length; - int h; /* heap index */ - int n, m; /* iterate over the tree elements */ - int bits; /* bit length */ - int xbits; /* extra bits */ - ush f; /* frequency */ - int overflow = 0; /* number of elements with bit length too large */ - - for (bits = 0; bits <= MAX_BITS; bits++) s->bl_count[bits] = 0; - - /* In a first pass, compute the optimal bit lengths (which may - * overflow in the case of the bit length tree). - */ - tree[s->heap[s->heap_max]].Len = 0; /* root of the heap */ - - for (h = s->heap_max+1; h < HEAP_SIZE; h++) { - n = s->heap[h]; - bits = tree[tree[n].Dad].Len + 1; - if (bits > max_length) bits = max_length, overflow++; - tree[n].Len = (ush)bits; - /* We overwrite tree[n].Dad which is no longer needed */ - - if (n > max_code) continue; /* not a leaf node */ - - s->bl_count[bits]++; - xbits = 0; - if (n >= base) xbits = extra[n-base]; - f = tree[n].Freq; - s->opt_len += (ulg)f * (bits + xbits); - if (stree) s->static_len += (ulg)f * (stree[n].Len + xbits); - } - if (overflow == 0) return; - - Trace((stderr,"\nbit length overflow\n")); - /* This happens for example on obj2 and pic of the Calgary corpus */ - - /* Find the first bit length which could increase: */ - do { - bits = max_length-1; - while (s->bl_count[bits] == 0) bits--; - s->bl_count[bits]--; /* move one leaf down the tree */ - s->bl_count[bits+1] += 2; /* move one overflow item as its brother */ - s->bl_count[max_length]--; - /* The brother of the overflow item also moves one step up, - * but this does not affect bl_count[max_length] - */ - overflow -= 2; - } while (overflow > 0); - - /* Now recompute all bit lengths, scanning in increasing frequency. - * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all - * lengths instead of fixing only the wrong ones. This idea is taken - * from 'ar' written by Haruhiko Okumura.) - */ - for (bits = max_length; bits != 0; bits--) { - n = s->bl_count[bits]; - while (n != 0) { - m = s->heap[--h]; - if (m > max_code) continue; - if ((unsigned) tree[m].Len != (unsigned) bits) { - Trace((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits)); - s->opt_len += ((long)bits - (long)tree[m].Len) - *(long)tree[m].Freq; - tree[m].Len = (ush)bits; - } - n--; - } - } -} - -/* =========================================================================== - * Generate the codes for a given tree and bit counts (which need not be - * optimal). - * IN assertion: the array bl_count contains the bit length statistics for - * the given tree and the field len is set for all tree elements. - * OUT assertion: the field code is set for all tree elements of non - * zero code length. - */ -local void gen_codes (tree, max_code, bl_count) - ct_data *tree; /* the tree to decorate */ - int max_code; /* largest code with non zero frequency */ - ushf *bl_count; /* number of codes at each bit length */ -{ - ush next_code[MAX_BITS+1]; /* next code value for each bit length */ - ush code = 0; /* running code value */ - int bits; /* bit index */ - int n; /* code index */ - - /* The distribution counts are first used to generate the code values - * without bit reversal. - */ - for (bits = 1; bits <= MAX_BITS; bits++) { - next_code[bits] = code = (code + bl_count[bits-1]) << 1; - } - /* Check that the bit counts in bl_count are consistent. The last code - * must be all ones. - */ - Assert (code + bl_count[MAX_BITS]-1 == (1<dyn_tree; - const ct_data *stree = desc->stat_desc->static_tree; - int elems = desc->stat_desc->elems; - int n, m; /* iterate over heap elements */ - int max_code = -1; /* largest code with non zero frequency */ - int node; /* new node being created */ - - /* Construct the initial heap, with least frequent element in - * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1]. - * heap[0] is not used. - */ - s->heap_len = 0, s->heap_max = HEAP_SIZE; - - for (n = 0; n < elems; n++) { - if (tree[n].Freq != 0) { - s->heap[++(s->heap_len)] = max_code = n; - s->depth[n] = 0; - } else { - tree[n].Len = 0; - } - } - - /* The pkzip format requires that at least one distance code exists, - * and that at least one bit should be sent even if there is only one - * possible code. So to avoid special checks later on we force at least - * two codes of non zero frequency. - */ - while (s->heap_len < 2) { - node = s->heap[++(s->heap_len)] = (max_code < 2 ? ++max_code : 0); - tree[node].Freq = 1; - s->depth[node] = 0; - s->opt_len--; if (stree) s->static_len -= stree[node].Len; - /* node is 0 or 1 so it does not have extra bits */ - } - desc->max_code = max_code; - - /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree, - * establish sub-heaps of increasing lengths: - */ - for (n = s->heap_len/2; n >= 1; n--) pqdownheap(s, tree, n); - - /* Construct the Huffman tree by repeatedly combining the least two - * frequent nodes. - */ - node = elems; /* next internal node of the tree */ - do { - pqremove(s, tree, n); /* n = node of least frequency */ - m = s->heap[SMALLEST]; /* m = node of next least frequency */ - - s->heap[--(s->heap_max)] = n; /* keep the nodes sorted by frequency */ - s->heap[--(s->heap_max)] = m; - - /* Create a new node father of n and m */ - tree[node].Freq = tree[n].Freq + tree[m].Freq; - s->depth[node] = (uch)((s->depth[n] >= s->depth[m] ? - s->depth[n] : s->depth[m]) + 1); - tree[n].Dad = tree[m].Dad = (ush)node; -#ifdef DUMP_BL_TREE - if (tree == s->bl_tree) { - fprintf(stderr,"\nnode %d(%d), sons %d(%d) %d(%d)", - node, tree[node].Freq, n, tree[n].Freq, m, tree[m].Freq); - } -#endif - /* and insert the new node in the heap */ - s->heap[SMALLEST] = node++; - pqdownheap(s, tree, SMALLEST); - - } while (s->heap_len >= 2); - - s->heap[--(s->heap_max)] = s->heap[SMALLEST]; - - /* At this point, the fields freq and dad are set. We can now - * generate the bit lengths. - */ - gen_bitlen(s, (tree_desc *)desc); - - /* The field len is now set, we can generate the bit codes */ - gen_codes ((ct_data *)tree, max_code, s->bl_count); -} - -/* =========================================================================== - * Scan a literal or distance tree to determine the frequencies of the codes - * in the bit length tree. - */ -local void scan_tree (s, tree, max_code) - deflate_state *s; - ct_data *tree; /* the tree to be scanned */ - int max_code; /* and its largest code of non zero frequency */ -{ - int n; /* iterates over all tree elements */ - int prevlen = -1; /* last emitted length */ - int curlen; /* length of current code */ - int nextlen = tree[0].Len; /* length of next code */ - int count = 0; /* repeat count of the current code */ - int max_count = 7; /* max repeat count */ - int min_count = 4; /* min repeat count */ - - if (nextlen == 0) max_count = 138, min_count = 3; - tree[max_code+1].Len = (ush)0xffff; /* guard */ - - for (n = 0; n <= max_code; n++) { - curlen = nextlen; nextlen = tree[n+1].Len; - if (++count < max_count && curlen == nextlen) { - continue; - } else if (count < min_count) { - s->bl_tree[curlen].Freq += (ush)count; - } else if (curlen != 0) { - if (curlen != prevlen) s->bl_tree[curlen].Freq++; - s->bl_tree[REP_3_6].Freq++; - } else if (count <= 10) { - s->bl_tree[REPZ_3_10].Freq++; - } else { - s->bl_tree[REPZ_11_138].Freq++; - } - count = 0; prevlen = curlen; - if (nextlen == 0) { - max_count = 138, min_count = 3; - } else if (curlen == nextlen) { - max_count = 6, min_count = 3; - } else { - max_count = 7, min_count = 4; - } - } -} - -/* =========================================================================== - * Send a literal or distance tree in compressed form, using the codes in - * bl_tree. - */ -local void send_tree (s, tree, max_code) - deflate_state *s; - ct_data *tree; /* the tree to be scanned */ - int max_code; /* and its largest code of non zero frequency */ -{ - int n; /* iterates over all tree elements */ - int prevlen = -1; /* last emitted length */ - int curlen; /* length of current code */ - int nextlen = tree[0].Len; /* length of next code */ - int count = 0; /* repeat count of the current code */ - int max_count = 7; /* max repeat count */ - int min_count = 4; /* min repeat count */ - - /* tree[max_code+1].Len = -1; */ /* guard already set */ - if (nextlen == 0) max_count = 138, min_count = 3; - - for (n = 0; n <= max_code; n++) { - curlen = nextlen; nextlen = tree[n+1].Len; - if (++count < max_count && curlen == nextlen) { - continue; - } else if (count < min_count) { - do { send_code(s, curlen, s->bl_tree); } while (--count != 0); - - } else if (curlen != 0) { - if (curlen != prevlen) { - send_code(s, curlen, s->bl_tree); count--; - } - Assert(count >= 3 && count <= 6, " 3_6?"); - send_code(s, REP_3_6, s->bl_tree); send_bits(s, count-3, 2); - - } else if (count <= 10) { - send_code(s, REPZ_3_10, s->bl_tree); send_bits(s, count-3, 3); - - } else { - send_code(s, REPZ_11_138, s->bl_tree); send_bits(s, count-11, 7); - } - count = 0; prevlen = curlen; - if (nextlen == 0) { - max_count = 138, min_count = 3; - } else if (curlen == nextlen) { - max_count = 6, min_count = 3; - } else { - max_count = 7, min_count = 4; - } - } -} - -/* =========================================================================== - * Construct the Huffman tree for the bit lengths and return the index in - * bl_order of the last bit length code to send. - */ -local int build_bl_tree(s) - deflate_state *s; -{ - int max_blindex; /* index of last bit length code of non zero freq */ - - /* Determine the bit length frequencies for literal and distance trees */ - scan_tree(s, (ct_data *)s->dyn_ltree, s->l_desc.max_code); - scan_tree(s, (ct_data *)s->dyn_dtree, s->d_desc.max_code); - - /* Build the bit length tree: */ - build_tree(s, (tree_desc *)(&(s->bl_desc))); - /* opt_len now includes the length of the tree representations, except - * the lengths of the bit lengths codes and the 5+5+4 bits for the counts. - */ - - /* Determine the number of bit length codes to send. The pkzip format - * requires that at least 4 bit length codes be sent. (appnote.txt says - * 3 but the actual value used is 4.) - */ - for (max_blindex = BL_CODES-1; max_blindex >= 3; max_blindex--) { - if (s->bl_tree[bl_order[max_blindex]].Len != 0) break; - } - /* Update opt_len to include the bit length tree and counts */ - s->opt_len += 3*(max_blindex+1) + 5+5+4; - Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld", - s->opt_len, s->static_len)); - - return max_blindex; -} - -/* =========================================================================== - * Send the header for a block using dynamic Huffman trees: the counts, the - * lengths of the bit length codes, the literal tree and the distance tree. - * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4. - */ -local void send_all_trees(s, lcodes, dcodes, blcodes) - deflate_state *s; - int lcodes, dcodes, blcodes; /* number of codes for each tree */ -{ - int rank; /* index in bl_order */ - - Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes"); - Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES, - "too many codes"); - Tracev((stderr, "\nbl counts: ")); - send_bits(s, lcodes-257, 5); /* not +255 as stated in appnote.txt */ - send_bits(s, dcodes-1, 5); - send_bits(s, blcodes-4, 4); /* not -3 as stated in appnote.txt */ - for (rank = 0; rank < blcodes; rank++) { - Tracev((stderr, "\nbl code %2d ", bl_order[rank])); - send_bits(s, s->bl_tree[bl_order[rank]].Len, 3); - } - Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent)); - - send_tree(s, (ct_data *)s->dyn_ltree, lcodes-1); /* literal tree */ - Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent)); - - send_tree(s, (ct_data *)s->dyn_dtree, dcodes-1); /* distance tree */ - Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent)); -} - -/* =========================================================================== - * Send a stored block - */ -void ZLIB_INTERNAL _tr_stored_block(s, buf, stored_len, last) - deflate_state *s; - charf *buf; /* input block */ - ulg stored_len; /* length of input block */ - int last; /* one if this is the last block for a file */ -{ - send_bits(s, (STORED_BLOCK<<1)+last, 3); /* send block type */ -#ifdef DEBUG - s->compressed_len = (s->compressed_len + 3 + 7) & (ulg)~7L; - s->compressed_len += (stored_len + 4) << 3; -#endif - copy_block(s, buf, (unsigned)stored_len, 1); /* with header */ -} - -/* =========================================================================== - * Flush the bits in the bit buffer to pending output (leaves at most 7 bits) - */ -void ZLIB_INTERNAL _tr_flush_bits(s) - deflate_state *s; -{ - bi_flush(s); -} - -/* =========================================================================== - * Send one empty static block to give enough lookahead for inflate. - * This takes 10 bits, of which 7 may remain in the bit buffer. - */ -void ZLIB_INTERNAL _tr_align(s) - deflate_state *s; -{ - send_bits(s, STATIC_TREES<<1, 3); - send_code(s, END_BLOCK, static_ltree); -#ifdef DEBUG - s->compressed_len += 10L; /* 3 for block type, 7 for EOB */ -#endif - bi_flush(s); -} - -/* =========================================================================== - * Determine the best encoding for the current block: dynamic trees, static - * trees or store, and output the encoded block to the zip file. - */ -void ZLIB_INTERNAL _tr_flush_block(s, buf, stored_len, last) - deflate_state *s; - charf *buf; /* input block, or NULL if too old */ - ulg stored_len; /* length of input block */ - int last; /* one if this is the last block for a file */ -{ - ulg opt_lenb, static_lenb; /* opt_len and static_len in bytes */ - int max_blindex = 0; /* index of last bit length code of non zero freq */ - - /* Build the Huffman trees unless a stored block is forced */ - if (s->level > 0) { - - /* Check if the file is binary or text */ - if (s->strm->data_type == Z_UNKNOWN) - s->strm->data_type = detect_data_type(s); - - /* Construct the literal and distance trees */ - build_tree(s, (tree_desc *)(&(s->l_desc))); - Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len, - s->static_len)); - - build_tree(s, (tree_desc *)(&(s->d_desc))); - Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len, - s->static_len)); - /* At this point, opt_len and static_len are the total bit lengths of - * the compressed block data, excluding the tree representations. - */ - - /* Build the bit length tree for the above two trees, and get the index - * in bl_order of the last bit length code to send. - */ - max_blindex = build_bl_tree(s); - - /* Determine the best encoding. Compute the block lengths in bytes. */ - opt_lenb = (s->opt_len+3+7)>>3; - static_lenb = (s->static_len+3+7)>>3; - - Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ", - opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len, - s->last_lit)); - - if (static_lenb <= opt_lenb) opt_lenb = static_lenb; - - } else { - Assert(buf != (char*)0, "lost buf"); - opt_lenb = static_lenb = stored_len + 5; /* force a stored block */ - } - -#ifdef FORCE_STORED - if (buf != (char*)0) { /* force stored block */ -#else - if (stored_len+4 <= opt_lenb && buf != (char*)0) { - /* 4: two words for the lengths */ -#endif - /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE. - * Otherwise we can't have processed more than WSIZE input bytes since - * the last block flush, because compression would have been - * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to - * transform a block into a stored block. - */ - _tr_stored_block(s, buf, stored_len, last); - -#ifdef FORCE_STATIC - } else if (static_lenb >= 0) { /* force static trees */ -#else - } else if (s->strategy == Z_FIXED || static_lenb == opt_lenb) { -#endif - send_bits(s, (STATIC_TREES<<1)+last, 3); - compress_block(s, (const ct_data *)static_ltree, - (const ct_data *)static_dtree); -#ifdef DEBUG - s->compressed_len += 3 + s->static_len; -#endif - } else { - send_bits(s, (DYN_TREES<<1)+last, 3); - send_all_trees(s, s->l_desc.max_code+1, s->d_desc.max_code+1, - max_blindex+1); - compress_block(s, (const ct_data *)s->dyn_ltree, - (const ct_data *)s->dyn_dtree); -#ifdef DEBUG - s->compressed_len += 3 + s->opt_len; -#endif - } - Assert (s->compressed_len == s->bits_sent, "bad compressed size"); - /* The above check is made mod 2^32, for files larger than 512 MB - * and uLong implemented on 32 bits. - */ - init_block(s); - - if (last) { - bi_windup(s); -#ifdef DEBUG - s->compressed_len += 7; /* align on byte boundary */ -#endif - } - Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3, - s->compressed_len-7*last)); -} - -/* =========================================================================== - * Save the match info and tally the frequency counts. Return true if - * the current block must be flushed. - */ -int ZLIB_INTERNAL _tr_tally (s, dist, lc) - deflate_state *s; - unsigned dist; /* distance of matched string */ - unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */ -{ - s->d_buf[s->last_lit] = (ush)dist; - s->l_buf[s->last_lit++] = (uch)lc; - if (dist == 0) { - /* lc is the unmatched char */ - s->dyn_ltree[lc].Freq++; - } else { - s->matches++; - /* Here, lc is the match length - MIN_MATCH */ - dist--; /* dist = match distance - 1 */ - Assert((ush)dist < (ush)MAX_DIST(s) && - (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) && - (ush)d_code(dist) < (ush)D_CODES, "_tr_tally: bad match"); - - s->dyn_ltree[_length_code[lc]+LITERALS+1].Freq++; - s->dyn_dtree[d_code(dist)].Freq++; - } - -#ifdef TRUNCATE_BLOCK - /* Try to guess if it is profitable to stop the current block here */ - if ((s->last_lit & 0x1fff) == 0 && s->level > 2) { - /* Compute an upper bound for the compressed length */ - ulg out_length = (ulg)s->last_lit*8L; - ulg in_length = (ulg)((long)s->strstart - s->block_start); - int dcode; - for (dcode = 0; dcode < D_CODES; dcode++) { - out_length += (ulg)s->dyn_dtree[dcode].Freq * - (5L+extra_dbits[dcode]); - } - out_length >>= 3; - Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ", - s->last_lit, in_length, out_length, - 100L - out_length*100L/in_length)); - if (s->matches < s->last_lit/2 && out_length < in_length/2) return 1; - } -#endif - return (s->last_lit == s->lit_bufsize-1); - /* We avoid equality with lit_bufsize because of wraparound at 64K - * on 16 bit machines and because stored blocks are restricted to - * 64K-1 bytes. - */ -} - -/* =========================================================================== - * Send the block data compressed using the given Huffman trees - */ -local void compress_block(s, ltree, dtree) - deflate_state *s; - const ct_data *ltree; /* literal tree */ - const ct_data *dtree; /* distance tree */ -{ - unsigned dist; /* distance of matched string */ - int lc; /* match length or unmatched char (if dist == 0) */ - unsigned lx = 0; /* running index in l_buf */ - unsigned code; /* the code to send */ - int extra; /* number of extra bits to send */ - - if (s->last_lit != 0) do { - dist = s->d_buf[lx]; - lc = s->l_buf[lx++]; - if (dist == 0) { - send_code(s, lc, ltree); /* send a literal byte */ - Tracecv(isgraph(lc), (stderr," '%c' ", lc)); - } else { - /* Here, lc is the match length - MIN_MATCH */ - code = _length_code[lc]; - send_code(s, code+LITERALS+1, ltree); /* send the length code */ - extra = extra_lbits[code]; - if (extra != 0) { - lc -= base_length[code]; - send_bits(s, lc, extra); /* send the extra length bits */ - } - dist--; /* dist is now the match distance - 1 */ - code = d_code(dist); - Assert (code < D_CODES, "bad d_code"); - - send_code(s, code, dtree); /* send the distance code */ - extra = extra_dbits[code]; - if (extra != 0) { - dist -= base_dist[code]; - send_bits(s, dist, extra); /* send the extra distance bits */ - } - } /* literal or match pair ? */ - - /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */ - Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx, - "pendingBuf overflow"); - - } while (lx < s->last_lit); - - send_code(s, END_BLOCK, ltree); -} - -/* =========================================================================== - * Check if the data type is TEXT or BINARY, using the following algorithm: - * - TEXT if the two conditions below are satisfied: - * a) There are no non-portable control characters belonging to the - * "black list" (0..6, 14..25, 28..31). - * b) There is at least one printable character belonging to the - * "white list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255). - * - BINARY otherwise. - * - The following partially-portable control characters form a - * "gray list" that is ignored in this detection algorithm: - * (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}). - * IN assertion: the fields Freq of dyn_ltree are set. - */ -local int detect_data_type(s) - deflate_state *s; -{ - /* black_mask is the bit mask of black-listed bytes - * set bits 0..6, 14..25, and 28..31 - * 0xf3ffc07f = binary 11110011111111111100000001111111 - */ - unsigned long black_mask = 0xf3ffc07fUL; - int n; - - /* Check for non-textual ("black-listed") bytes. */ - for (n = 0; n <= 31; n++, black_mask >>= 1) - if ((black_mask & 1) && (s->dyn_ltree[n].Freq != 0)) - return Z_BINARY; - - /* Check for textual ("white-listed") bytes. */ - if (s->dyn_ltree[9].Freq != 0 || s->dyn_ltree[10].Freq != 0 - || s->dyn_ltree[13].Freq != 0) - return Z_TEXT; - for (n = 32; n < LITERALS; n++) - if (s->dyn_ltree[n].Freq != 0) - return Z_TEXT; - - /* There are no "black-listed" or "white-listed" bytes: - * this stream either is empty or has tolerated ("gray-listed") bytes only. - */ - return Z_BINARY; -} - -/* =========================================================================== - * Reverse the first len bits of a code, using straightforward code (a faster - * method would use a table) - * IN assertion: 1 <= len <= 15 - */ -local unsigned bi_reverse(code, len) - unsigned code; /* the value to invert */ - int len; /* its bit length */ -{ - register unsigned res = 0; - do { - res |= code & 1; - code >>= 1, res <<= 1; - } while (--len > 0); - return res >> 1; -} - -/* =========================================================================== - * Flush the bit buffer, keeping at most 7 bits in it. - */ -local void bi_flush(s) - deflate_state *s; -{ - if (s->bi_valid == 16) { - put_short(s, s->bi_buf); - s->bi_buf = 0; - s->bi_valid = 0; - } else if (s->bi_valid >= 8) { - put_byte(s, (Byte)s->bi_buf); - s->bi_buf >>= 8; - s->bi_valid -= 8; - } -} - -/* =========================================================================== - * Flush the bit buffer and align the output on a byte boundary - */ -local void bi_windup(s) - deflate_state *s; -{ - if (s->bi_valid > 8) { - put_short(s, s->bi_buf); - } else if (s->bi_valid > 0) { - put_byte(s, (Byte)s->bi_buf); - } - s->bi_buf = 0; - s->bi_valid = 0; -#ifdef DEBUG - s->bits_sent = (s->bits_sent+7) & ~7; -#endif -} - -/* =========================================================================== - * Copy a stored block, storing first the length and its - * one's complement if requested. - */ -local void copy_block(s, buf, len, header) - deflate_state *s; - charf *buf; /* the input data */ - unsigned len; /* its length */ - int header; /* true if block header must be written */ -{ - bi_windup(s); /* align on byte boundary */ - - if (header) { - put_short(s, (ush)len); - put_short(s, (ush)~len); -#ifdef DEBUG - s->bits_sent += 2*16; -#endif - } -#ifdef DEBUG - s->bits_sent += (ulg)len<<3; -#endif - while (len--) { - put_byte(s, *buf++); - } -} diff --git a/vendor/libgit2/deps/zlib/trees.h b/vendor/libgit2/deps/zlib/trees.h deleted file mode 100644 index d35639d82a..0000000000 --- a/vendor/libgit2/deps/zlib/trees.h +++ /dev/null @@ -1,128 +0,0 @@ -/* header created automatically with -DGEN_TREES_H */ - -local const ct_data static_ltree[L_CODES+2] = { -{{ 12},{ 8}}, {{140},{ 8}}, {{ 76},{ 8}}, {{204},{ 8}}, {{ 44},{ 8}}, -{{172},{ 8}}, {{108},{ 8}}, {{236},{ 8}}, {{ 28},{ 8}}, {{156},{ 8}}, -{{ 92},{ 8}}, {{220},{ 8}}, {{ 60},{ 8}}, {{188},{ 8}}, {{124},{ 8}}, -{{252},{ 8}}, {{ 2},{ 8}}, {{130},{ 8}}, {{ 66},{ 8}}, {{194},{ 8}}, -{{ 34},{ 8}}, {{162},{ 8}}, {{ 98},{ 8}}, {{226},{ 8}}, {{ 18},{ 8}}, -{{146},{ 8}}, {{ 82},{ 8}}, {{210},{ 8}}, {{ 50},{ 8}}, {{178},{ 8}}, -{{114},{ 8}}, {{242},{ 8}}, {{ 10},{ 8}}, {{138},{ 8}}, {{ 74},{ 8}}, -{{202},{ 8}}, {{ 42},{ 8}}, {{170},{ 8}}, {{106},{ 8}}, {{234},{ 8}}, -{{ 26},{ 8}}, {{154},{ 8}}, {{ 90},{ 8}}, {{218},{ 8}}, {{ 58},{ 8}}, -{{186},{ 8}}, {{122},{ 8}}, {{250},{ 8}}, {{ 6},{ 8}}, {{134},{ 8}}, -{{ 70},{ 8}}, {{198},{ 8}}, {{ 38},{ 8}}, {{166},{ 8}}, {{102},{ 8}}, -{{230},{ 8}}, {{ 22},{ 8}}, {{150},{ 8}}, {{ 86},{ 8}}, {{214},{ 8}}, -{{ 54},{ 8}}, {{182},{ 8}}, {{118},{ 8}}, {{246},{ 8}}, {{ 14},{ 8}}, -{{142},{ 8}}, {{ 78},{ 8}}, {{206},{ 8}}, {{ 46},{ 8}}, {{174},{ 8}}, -{{110},{ 8}}, {{238},{ 8}}, {{ 30},{ 8}}, {{158},{ 8}}, {{ 94},{ 8}}, -{{222},{ 8}}, {{ 62},{ 8}}, {{190},{ 8}}, {{126},{ 8}}, {{254},{ 8}}, -{{ 1},{ 8}}, {{129},{ 8}}, {{ 65},{ 8}}, {{193},{ 8}}, {{ 33},{ 8}}, -{{161},{ 8}}, {{ 97},{ 8}}, {{225},{ 8}}, {{ 17},{ 8}}, {{145},{ 8}}, -{{ 81},{ 8}}, {{209},{ 8}}, {{ 49},{ 8}}, {{177},{ 8}}, {{113},{ 8}}, -{{241},{ 8}}, {{ 9},{ 8}}, {{137},{ 8}}, {{ 73},{ 8}}, {{201},{ 8}}, -{{ 41},{ 8}}, {{169},{ 8}}, {{105},{ 8}}, {{233},{ 8}}, {{ 25},{ 8}}, -{{153},{ 8}}, {{ 89},{ 8}}, {{217},{ 8}}, {{ 57},{ 8}}, {{185},{ 8}}, -{{121},{ 8}}, {{249},{ 8}}, {{ 5},{ 8}}, {{133},{ 8}}, {{ 69},{ 8}}, -{{197},{ 8}}, {{ 37},{ 8}}, {{165},{ 8}}, {{101},{ 8}}, {{229},{ 8}}, -{{ 21},{ 8}}, {{149},{ 8}}, {{ 85},{ 8}}, {{213},{ 8}}, {{ 53},{ 8}}, -{{181},{ 8}}, {{117},{ 8}}, {{245},{ 8}}, {{ 13},{ 8}}, {{141},{ 8}}, -{{ 77},{ 8}}, {{205},{ 8}}, {{ 45},{ 8}}, {{173},{ 8}}, {{109},{ 8}}, -{{237},{ 8}}, {{ 29},{ 8}}, {{157},{ 8}}, {{ 93},{ 8}}, {{221},{ 8}}, -{{ 61},{ 8}}, {{189},{ 8}}, {{125},{ 8}}, {{253},{ 8}}, {{ 19},{ 9}}, -{{275},{ 9}}, {{147},{ 9}}, {{403},{ 9}}, {{ 83},{ 9}}, {{339},{ 9}}, -{{211},{ 9}}, {{467},{ 9}}, {{ 51},{ 9}}, {{307},{ 9}}, {{179},{ 9}}, -{{435},{ 9}}, {{115},{ 9}}, {{371},{ 9}}, {{243},{ 9}}, {{499},{ 9}}, -{{ 11},{ 9}}, {{267},{ 9}}, {{139},{ 9}}, {{395},{ 9}}, {{ 75},{ 9}}, -{{331},{ 9}}, {{203},{ 9}}, {{459},{ 9}}, {{ 43},{ 9}}, {{299},{ 9}}, -{{171},{ 9}}, {{427},{ 9}}, {{107},{ 9}}, {{363},{ 9}}, {{235},{ 9}}, -{{491},{ 9}}, {{ 27},{ 9}}, {{283},{ 9}}, {{155},{ 9}}, {{411},{ 9}}, -{{ 91},{ 9}}, {{347},{ 9}}, {{219},{ 9}}, {{475},{ 9}}, {{ 59},{ 9}}, -{{315},{ 9}}, {{187},{ 9}}, {{443},{ 9}}, {{123},{ 9}}, {{379},{ 9}}, -{{251},{ 9}}, {{507},{ 9}}, {{ 7},{ 9}}, {{263},{ 9}}, {{135},{ 9}}, -{{391},{ 9}}, {{ 71},{ 9}}, {{327},{ 9}}, {{199},{ 9}}, {{455},{ 9}}, -{{ 39},{ 9}}, {{295},{ 9}}, {{167},{ 9}}, {{423},{ 9}}, {{103},{ 9}}, -{{359},{ 9}}, {{231},{ 9}}, {{487},{ 9}}, {{ 23},{ 9}}, {{279},{ 9}}, -{{151},{ 9}}, {{407},{ 9}}, {{ 87},{ 9}}, {{343},{ 9}}, {{215},{ 9}}, -{{471},{ 9}}, {{ 55},{ 9}}, {{311},{ 9}}, {{183},{ 9}}, {{439},{ 9}}, -{{119},{ 9}}, {{375},{ 9}}, {{247},{ 9}}, {{503},{ 9}}, {{ 15},{ 9}}, -{{271},{ 9}}, {{143},{ 9}}, {{399},{ 9}}, {{ 79},{ 9}}, {{335},{ 9}}, -{{207},{ 9}}, {{463},{ 9}}, {{ 47},{ 9}}, {{303},{ 9}}, {{175},{ 9}}, -{{431},{ 9}}, {{111},{ 9}}, {{367},{ 9}}, {{239},{ 9}}, {{495},{ 9}}, -{{ 31},{ 9}}, {{287},{ 9}}, {{159},{ 9}}, {{415},{ 9}}, {{ 95},{ 9}}, -{{351},{ 9}}, {{223},{ 9}}, {{479},{ 9}}, {{ 63},{ 9}}, {{319},{ 9}}, -{{191},{ 9}}, {{447},{ 9}}, {{127},{ 9}}, {{383},{ 9}}, {{255},{ 9}}, -{{511},{ 9}}, {{ 0},{ 7}}, {{ 64},{ 7}}, {{ 32},{ 7}}, {{ 96},{ 7}}, -{{ 16},{ 7}}, {{ 80},{ 7}}, {{ 48},{ 7}}, {{112},{ 7}}, {{ 8},{ 7}}, -{{ 72},{ 7}}, {{ 40},{ 7}}, {{104},{ 7}}, {{ 24},{ 7}}, {{ 88},{ 7}}, -{{ 56},{ 7}}, {{120},{ 7}}, {{ 4},{ 7}}, {{ 68},{ 7}}, {{ 36},{ 7}}, -{{100},{ 7}}, {{ 20},{ 7}}, {{ 84},{ 7}}, {{ 52},{ 7}}, {{116},{ 7}}, -{{ 3},{ 8}}, {{131},{ 8}}, {{ 67},{ 8}}, {{195},{ 8}}, {{ 35},{ 8}}, -{{163},{ 8}}, {{ 99},{ 8}}, {{227},{ 8}} -}; - -local const ct_data static_dtree[D_CODES] = { -{{ 0},{ 5}}, {{16},{ 5}}, {{ 8},{ 5}}, {{24},{ 5}}, {{ 4},{ 5}}, -{{20},{ 5}}, {{12},{ 5}}, {{28},{ 5}}, {{ 2},{ 5}}, {{18},{ 5}}, -{{10},{ 5}}, {{26},{ 5}}, {{ 6},{ 5}}, {{22},{ 5}}, {{14},{ 5}}, -{{30},{ 5}}, {{ 1},{ 5}}, {{17},{ 5}}, {{ 9},{ 5}}, {{25},{ 5}}, -{{ 5},{ 5}}, {{21},{ 5}}, {{13},{ 5}}, {{29},{ 5}}, {{ 3},{ 5}}, -{{19},{ 5}}, {{11},{ 5}}, {{27},{ 5}}, {{ 7},{ 5}}, {{23},{ 5}} -}; - -const uch ZLIB_INTERNAL _dist_code[DIST_CODE_LEN] = { - 0, 1, 2, 3, 4, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, - 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, -10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, -11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, -12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, -13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, -13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, -14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, -14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, -14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, -15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, -15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, -15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 16, 17, -18, 18, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, -23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, -24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, -26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, -26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, -27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, -27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, -28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, -28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, -28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, -29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, -29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, -29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29 -}; - -const uch ZLIB_INTERNAL _length_code[MAX_MATCH-MIN_MATCH+1]= { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 12, -13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, -17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, -19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, -21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, -22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, -23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, -24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, -25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, -25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, -26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, -26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, -27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 28 -}; - -local const int base_length[LENGTH_CODES] = { -0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20, 24, 28, 32, 40, 48, 56, -64, 80, 96, 112, 128, 160, 192, 224, 0 -}; - -local const int base_dist[D_CODES] = { - 0, 1, 2, 3, 4, 6, 8, 12, 16, 24, - 32, 48, 64, 96, 128, 192, 256, 384, 512, 768, - 1024, 1536, 2048, 3072, 4096, 6144, 8192, 12288, 16384, 24576 -}; - diff --git a/vendor/libgit2/deps/zlib/zconf.h b/vendor/libgit2/deps/zlib/zconf.h deleted file mode 100644 index 229c400248..0000000000 --- a/vendor/libgit2/deps/zlib/zconf.h +++ /dev/null @@ -1,58 +0,0 @@ -/* zconf.h -- configuration of the zlib compression library - * Copyright (C) 1995-2010 Jean-loup Gailly. - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* @(#) $Id$ */ - -#ifndef ZCONF_H -#define ZCONF_H - -#include "../../src/common.h" - -/* Jeez, don't complain about non-prototype - * forms, we didn't write zlib */ -#if defined(_MSC_VER) -# pragma warning( disable : 4131 ) -# pragma warning( disable : 4142 ) /* benign redefinition of type */ -#endif - -/* Maximum value for memLevel in deflateInit2 */ -#define MAX_MEM_LEVEL 9 - -/* Maximum value for windowBits in deflateInit2 and inflateInit2. - * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files - * created by gzip. (Files created by minigzip can still be extracted by - * gzip.) - */ -#define MAX_WBITS 15 /* 32K LZ77 window */ - -#define ZEXTERN extern -#define ZEXPORT -#define ZEXPORTVA -#ifndef FAR -# define FAR -#endif -#define OF(args) args -#define Z_ARG(args) args - -typedef unsigned char Byte; /* 8 bits */ -typedef unsigned int uInt; /* 16 bits or more */ -typedef unsigned long uLong; /* 32 bits or more */ -typedef unsigned long z_crc_t; - -typedef Byte FAR Bytef; -typedef char FAR charf; -typedef int FAR intf; -typedef uInt FAR uIntf; -typedef uLong FAR uLongf; - -typedef void const *voidpc; -typedef void FAR *voidpf; -typedef void *voidp; - -#define z_off_t git_off_t -#define z_off64_t z_off_t -#define z_const const - -#endif /* ZCONF_H */ diff --git a/vendor/libgit2/deps/zlib/zlib.h b/vendor/libgit2/deps/zlib/zlib.h deleted file mode 100644 index 3e0c7672ac..0000000000 --- a/vendor/libgit2/deps/zlib/zlib.h +++ /dev/null @@ -1,1768 +0,0 @@ -/* zlib.h -- interface of the 'zlib' general purpose compression library - version 1.2.8, April 28th, 2013 - - Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. - - Jean-loup Gailly Mark Adler - jloup@gzip.org madler@alumni.caltech.edu - - - The data format used by the zlib library is described by RFCs (Request for - Comments) 1950 to 1952 in the files http://tools.ietf.org/html/rfc1950 - (zlib format), rfc1951 (deflate format) and rfc1952 (gzip format). -*/ - -#ifndef ZLIB_H -#define ZLIB_H - -#include "zconf.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define ZLIB_VERSION "1.2.8" -#define ZLIB_VERNUM 0x1280 -#define ZLIB_VER_MAJOR 1 -#define ZLIB_VER_MINOR 2 -#define ZLIB_VER_REVISION 8 -#define ZLIB_VER_SUBREVISION 0 - -/* - The 'zlib' compression library provides in-memory compression and - decompression functions, including integrity checks of the uncompressed data. - This version of the library supports only one compression method (deflation) - but other algorithms will be added later and will have the same stream - interface. - - Compression can be done in a single step if the buffers are large enough, - or can be done by repeated calls of the compression function. In the latter - case, the application must provide more input and/or consume the output - (providing more output space) before each call. - - The compressed data format used by default by the in-memory functions is - the zlib format, which is a zlib wrapper documented in RFC 1950, wrapped - around a deflate stream, which is itself documented in RFC 1951. - - The library also supports reading and writing files in gzip (.gz) format - with an interface similar to that of stdio using the functions that start - with "gz". The gzip format is different from the zlib format. gzip is a - gzip wrapper, documented in RFC 1952, wrapped around a deflate stream. - - This library can optionally read and write gzip streams in memory as well. - - The zlib format was designed to be compact and fast for use in memory - and on communications channels. The gzip format was designed for single- - file compression on file systems, has a larger header than zlib to maintain - directory information, and uses a different, slower check method than zlib. - - The library does not install any signal handler. The decoder checks - the consistency of the compressed data, so the library should never crash - even in case of corrupted input. -*/ - -typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size)); -typedef void (*free_func) OF((voidpf opaque, voidpf address)); - -struct internal_state; - -typedef struct z_stream_s { - z_const Bytef *next_in; /* next input byte */ - uInt avail_in; /* number of bytes available at next_in */ - uLong total_in; /* total number of input bytes read so far */ - - Bytef *next_out; /* next output byte should be put there */ - uInt avail_out; /* remaining free space at next_out */ - uLong total_out; /* total number of bytes output so far */ - - z_const char *msg; /* last error message, NULL if no error */ - struct internal_state FAR *state; /* not visible by applications */ - - alloc_func zalloc; /* used to allocate the internal state */ - free_func zfree; /* used to free the internal state */ - voidpf opaque; /* private data object passed to zalloc and zfree */ - - int data_type; /* best guess about the data type: binary or text */ - uLong adler; /* adler32 value of the uncompressed data */ - uLong reserved; /* reserved for future use */ -} z_stream; - -typedef z_stream FAR *z_streamp; - -/* - gzip header information passed to and from zlib routines. See RFC 1952 - for more details on the meanings of these fields. -*/ -typedef struct gz_header_s { - int text; /* true if compressed data believed to be text */ - uLong time; /* modification time */ - int xflags; /* extra flags (not used when writing a gzip file) */ - int os; /* operating system */ - Bytef *extra; /* pointer to extra field or Z_NULL if none */ - uInt extra_len; /* extra field length (valid if extra != Z_NULL) */ - uInt extra_max; /* space at extra (only when reading header) */ - Bytef *name; /* pointer to zero-terminated file name or Z_NULL */ - uInt name_max; /* space at name (only when reading header) */ - Bytef *comment; /* pointer to zero-terminated comment or Z_NULL */ - uInt comm_max; /* space at comment (only when reading header) */ - int hcrc; /* true if there was or will be a header crc */ - int done; /* true when done reading gzip header (not used - when writing a gzip file) */ -} gz_header; - -typedef gz_header FAR *gz_headerp; - -/* - The application must update next_in and avail_in when avail_in has dropped - to zero. It must update next_out and avail_out when avail_out has dropped - to zero. The application must initialize zalloc, zfree and opaque before - calling the init function. All other fields are set by the compression - library and must not be updated by the application. - - The opaque value provided by the application will be passed as the first - parameter for calls of zalloc and zfree. This can be useful for custom - memory management. The compression library attaches no meaning to the - opaque value. - - zalloc must return Z_NULL if there is not enough memory for the object. - If zlib is used in a multi-threaded application, zalloc and zfree must be - thread safe. - - On 16-bit systems, the functions zalloc and zfree must be able to allocate - exactly 65536 bytes, but will not be required to allocate more than this if - the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS, pointers - returned by zalloc for objects of exactly 65536 bytes *must* have their - offset normalized to zero. The default allocation function provided by this - library ensures this (see zutil.c). To reduce memory requirements and avoid - any allocation of 64K objects, at the expense of compression ratio, compile - the library with -DMAX_WBITS=14 (see zconf.h). - - The fields total_in and total_out can be used for statistics or progress - reports. After compression, total_in holds the total size of the - uncompressed data and may be saved for use in the decompressor (particularly - if the decompressor wants to decompress everything in a single step). -*/ - - /* constants */ - -#define Z_NO_FLUSH 0 -#define Z_PARTIAL_FLUSH 1 -#define Z_SYNC_FLUSH 2 -#define Z_FULL_FLUSH 3 -#define Z_FINISH 4 -#define Z_BLOCK 5 -#define Z_TREES 6 -/* Allowed flush values; see deflate() and inflate() below for details */ - -#define Z_OK 0 -#define Z_STREAM_END 1 -#define Z_NEED_DICT 2 -#define Z_ERRNO (-1) -#define Z_STREAM_ERROR (-2) -#define Z_DATA_ERROR (-3) -#define Z_MEM_ERROR (-4) -#define Z_BUF_ERROR (-5) -#define Z_VERSION_ERROR (-6) -/* Return codes for the compression/decompression functions. Negative values - * are errors, positive values are used for special but normal events. - */ - -#define Z_NO_COMPRESSION 0 -#define Z_BEST_SPEED 1 -#define Z_BEST_COMPRESSION 9 -#define Z_DEFAULT_COMPRESSION (-1) -/* compression levels */ - -#define Z_FILTERED 1 -#define Z_HUFFMAN_ONLY 2 -#define Z_RLE 3 -#define Z_FIXED 4 -#define Z_DEFAULT_STRATEGY 0 -/* compression strategy; see deflateInit2() below for details */ - -#define Z_BINARY 0 -#define Z_TEXT 1 -#define Z_ASCII Z_TEXT /* for compatibility with 1.2.2 and earlier */ -#define Z_UNKNOWN 2 -/* Possible values of the data_type field (though see inflate()) */ - -#define Z_DEFLATED 8 -/* The deflate compression method (the only one supported in this version) */ - -#define Z_NULL 0 /* for initializing zalloc, zfree, opaque */ - -#define zlib_version zlibVersion() -/* for compatibility with versions < 1.0.2 */ - - - /* basic functions */ - -ZEXTERN const char * ZEXPORT zlibVersion OF((void)); -/* The application can compare zlibVersion and ZLIB_VERSION for consistency. - If the first character differs, the library code actually used is not - compatible with the zlib.h header file used by the application. This check - is automatically made by deflateInit and inflateInit. - */ - -/* -ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level)); - - Initializes the internal stream state for compression. The fields - zalloc, zfree and opaque must be initialized before by the caller. If - zalloc and zfree are set to Z_NULL, deflateInit updates them to use default - allocation functions. - - The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9: - 1 gives best speed, 9 gives best compression, 0 gives no compression at all - (the input data is simply copied a block at a time). Z_DEFAULT_COMPRESSION - requests a default compromise between speed and compression (currently - equivalent to level 6). - - deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough - memory, Z_STREAM_ERROR if level is not a valid compression level, or - Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible - with the version assumed by the caller (ZLIB_VERSION). msg is set to null - if there is no error message. deflateInit does not perform any compression: - this will be done by deflate(). -*/ - - -ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush)); -/* - deflate compresses as much data as possible, and stops when the input - buffer becomes empty or the output buffer becomes full. It may introduce - some output latency (reading input without producing any output) except when - forced to flush. - - The detailed semantics are as follows. deflate performs one or both of the - following actions: - - - Compress more input starting at next_in and update next_in and avail_in - accordingly. If not all input can be processed (because there is not - enough room in the output buffer), next_in and avail_in are updated and - processing will resume at this point for the next call of deflate(). - - - Provide more output starting at next_out and update next_out and avail_out - accordingly. This action is forced if the parameter flush is non zero. - Forcing flush frequently degrades the compression ratio, so this parameter - should be set only when necessary (in interactive applications). Some - output may be provided even if flush is not set. - - Before the call of deflate(), the application should ensure that at least - one of the actions is possible, by providing more input and/or consuming more - output, and updating avail_in or avail_out accordingly; avail_out should - never be zero before the call. The application can consume the compressed - output when it wants, for example when the output buffer is full (avail_out - == 0), or after each call of deflate(). If deflate returns Z_OK and with - zero avail_out, it must be called again after making room in the output - buffer because there might be more output pending. - - Normally the parameter flush is set to Z_NO_FLUSH, which allows deflate to - decide how much data to accumulate before producing output, in order to - maximize compression. - - If the parameter flush is set to Z_SYNC_FLUSH, all pending output is - flushed to the output buffer and the output is aligned on a byte boundary, so - that the decompressor can get all input data available so far. (In - particular avail_in is zero after the call if enough output space has been - provided before the call.) Flushing may degrade compression for some - compression algorithms and so it should be used only when necessary. This - completes the current deflate block and follows it with an empty stored block - that is three bits plus filler bits to the next byte, followed by four bytes - (00 00 ff ff). - - If flush is set to Z_PARTIAL_FLUSH, all pending output is flushed to the - output buffer, but the output is not aligned to a byte boundary. All of the - input data so far will be available to the decompressor, as for Z_SYNC_FLUSH. - This completes the current deflate block and follows it with an empty fixed - codes block that is 10 bits long. This assures that enough bytes are output - in order for the decompressor to finish the block before the empty fixed code - block. - - If flush is set to Z_BLOCK, a deflate block is completed and emitted, as - for Z_SYNC_FLUSH, but the output is not aligned on a byte boundary, and up to - seven bits of the current block are held to be written as the next byte after - the next deflate block is completed. In this case, the decompressor may not - be provided enough bits at this point in order to complete decompression of - the data provided so far to the compressor. It may need to wait for the next - block to be emitted. This is for advanced applications that need to control - the emission of deflate blocks. - - If flush is set to Z_FULL_FLUSH, all output is flushed as with - Z_SYNC_FLUSH, and the compression state is reset so that decompression can - restart from this point if previous compressed data has been damaged or if - random access is desired. Using Z_FULL_FLUSH too often can seriously degrade - compression. - - If deflate returns with avail_out == 0, this function must be called again - with the same value of the flush parameter and more output space (updated - avail_out), until the flush is complete (deflate returns with non-zero - avail_out). In the case of a Z_FULL_FLUSH or Z_SYNC_FLUSH, make sure that - avail_out is greater than six to avoid repeated flush markers due to - avail_out == 0 on return. - - If the parameter flush is set to Z_FINISH, pending input is processed, - pending output is flushed and deflate returns with Z_STREAM_END if there was - enough output space; if deflate returns with Z_OK, this function must be - called again with Z_FINISH and more output space (updated avail_out) but no - more input data, until it returns with Z_STREAM_END or an error. After - deflate has returned Z_STREAM_END, the only possible operations on the stream - are deflateReset or deflateEnd. - - Z_FINISH can be used immediately after deflateInit if all the compression - is to be done in a single step. In this case, avail_out must be at least the - value returned by deflateBound (see below). Then deflate is guaranteed to - return Z_STREAM_END. If not enough output space is provided, deflate will - not return Z_STREAM_END, and it must be called again as described above. - - deflate() sets strm->adler to the adler32 checksum of all input read - so far (that is, total_in bytes). - - deflate() may update strm->data_type if it can make a good guess about - the input data type (Z_BINARY or Z_TEXT). In doubt, the data is considered - binary. This field is only for information purposes and does not affect the - compression algorithm in any manner. - - deflate() returns Z_OK if some progress has been made (more input - processed or more output produced), Z_STREAM_END if all input has been - consumed and all output has been produced (only when flush is set to - Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example - if next_in or next_out was Z_NULL), Z_BUF_ERROR if no progress is possible - (for example avail_in or avail_out was zero). Note that Z_BUF_ERROR is not - fatal, and deflate() can be called again with more input and more output - space to continue compressing. -*/ - - -ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm)); -/* - All dynamically allocated data structures for this stream are freed. - This function discards any unprocessed input and does not flush any pending - output. - - deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the - stream state was inconsistent, Z_DATA_ERROR if the stream was freed - prematurely (some input or output was discarded). In the error case, msg - may be set but then points to a static string (which must not be - deallocated). -*/ - - -/* -ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm)); - - Initializes the internal stream state for decompression. The fields - next_in, avail_in, zalloc, zfree and opaque must be initialized before by - the caller. If next_in is not Z_NULL and avail_in is large enough (the - exact value depends on the compression method), inflateInit determines the - compression method from the zlib header and allocates all data structures - accordingly; otherwise the allocation will be deferred to the first call of - inflate. If zalloc and zfree are set to Z_NULL, inflateInit updates them to - use default allocation functions. - - inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough - memory, Z_VERSION_ERROR if the zlib library version is incompatible with the - version assumed by the caller, or Z_STREAM_ERROR if the parameters are - invalid, such as a null pointer to the structure. msg is set to null if - there is no error message. inflateInit does not perform any decompression - apart from possibly reading the zlib header if present: actual decompression - will be done by inflate(). (So next_in and avail_in may be modified, but - next_out and avail_out are unused and unchanged.) The current implementation - of inflateInit() does not process any header information -- that is deferred - until inflate() is called. -*/ - - -ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush)); -/* - inflate decompresses as much data as possible, and stops when the input - buffer becomes empty or the output buffer becomes full. It may introduce - some output latency (reading input without producing any output) except when - forced to flush. - - The detailed semantics are as follows. inflate performs one or both of the - following actions: - - - Decompress more input starting at next_in and update next_in and avail_in - accordingly. If not all input can be processed (because there is not - enough room in the output buffer), next_in is updated and processing will - resume at this point for the next call of inflate(). - - - Provide more output starting at next_out and update next_out and avail_out - accordingly. inflate() provides as much output as possible, until there is - no more input data or no more space in the output buffer (see below about - the flush parameter). - - Before the call of inflate(), the application should ensure that at least - one of the actions is possible, by providing more input and/or consuming more - output, and updating the next_* and avail_* values accordingly. The - application can consume the uncompressed output when it wants, for example - when the output buffer is full (avail_out == 0), or after each call of - inflate(). If inflate returns Z_OK and with zero avail_out, it must be - called again after making room in the output buffer because there might be - more output pending. - - The flush parameter of inflate() can be Z_NO_FLUSH, Z_SYNC_FLUSH, Z_FINISH, - Z_BLOCK, or Z_TREES. Z_SYNC_FLUSH requests that inflate() flush as much - output as possible to the output buffer. Z_BLOCK requests that inflate() - stop if and when it gets to the next deflate block boundary. When decoding - the zlib or gzip format, this will cause inflate() to return immediately - after the header and before the first block. When doing a raw inflate, - inflate() will go ahead and process the first block, and will return when it - gets to the end of that block, or when it runs out of data. - - The Z_BLOCK option assists in appending to or combining deflate streams. - Also to assist in this, on return inflate() will set strm->data_type to the - number of unused bits in the last byte taken from strm->next_in, plus 64 if - inflate() is currently decoding the last block in the deflate stream, plus - 128 if inflate() returned immediately after decoding an end-of-block code or - decoding the complete header up to just before the first byte of the deflate - stream. The end-of-block will not be indicated until all of the uncompressed - data from that block has been written to strm->next_out. The number of - unused bits may in general be greater than seven, except when bit 7 of - data_type is set, in which case the number of unused bits will be less than - eight. data_type is set as noted here every time inflate() returns for all - flush options, and so can be used to determine the amount of currently - consumed input in bits. - - The Z_TREES option behaves as Z_BLOCK does, but it also returns when the - end of each deflate block header is reached, before any actual data in that - block is decoded. This allows the caller to determine the length of the - deflate block header for later use in random access within a deflate block. - 256 is added to the value of strm->data_type when inflate() returns - immediately after reaching the end of the deflate block header. - - inflate() should normally be called until it returns Z_STREAM_END or an - error. However if all decompression is to be performed in a single step (a - single call of inflate), the parameter flush should be set to Z_FINISH. In - this case all pending input is processed and all pending output is flushed; - avail_out must be large enough to hold all of the uncompressed data for the - operation to complete. (The size of the uncompressed data may have been - saved by the compressor for this purpose.) The use of Z_FINISH is not - required to perform an inflation in one step. However it may be used to - inform inflate that a faster approach can be used for the single inflate() - call. Z_FINISH also informs inflate to not maintain a sliding window if the - stream completes, which reduces inflate's memory footprint. If the stream - does not complete, either because not all of the stream is provided or not - enough output space is provided, then a sliding window will be allocated and - inflate() can be called again to continue the operation as if Z_NO_FLUSH had - been used. - - In this implementation, inflate() always flushes as much output as - possible to the output buffer, and always uses the faster approach on the - first call. So the effects of the flush parameter in this implementation are - on the return value of inflate() as noted below, when inflate() returns early - when Z_BLOCK or Z_TREES is used, and when inflate() avoids the allocation of - memory for a sliding window when Z_FINISH is used. - - If a preset dictionary is needed after this call (see inflateSetDictionary - below), inflate sets strm->adler to the Adler-32 checksum of the dictionary - chosen by the compressor and returns Z_NEED_DICT; otherwise it sets - strm->adler to the Adler-32 checksum of all output produced so far (that is, - total_out bytes) and returns Z_OK, Z_STREAM_END or an error code as described - below. At the end of the stream, inflate() checks that its computed adler32 - checksum is equal to that saved by the compressor and returns Z_STREAM_END - only if the checksum is correct. - - inflate() can decompress and check either zlib-wrapped or gzip-wrapped - deflate data. The header type is detected automatically, if requested when - initializing with inflateInit2(). Any information contained in the gzip - header is not retained, so applications that need that information should - instead use raw inflate, see inflateInit2() below, or inflateBack() and - perform their own processing of the gzip header and trailer. When processing - gzip-wrapped deflate data, strm->adler32 is set to the CRC-32 of the output - producted so far. The CRC-32 is checked against the gzip trailer. - - inflate() returns Z_OK if some progress has been made (more input processed - or more output produced), Z_STREAM_END if the end of the compressed data has - been reached and all uncompressed output has been produced, Z_NEED_DICT if a - preset dictionary is needed at this point, Z_DATA_ERROR if the input data was - corrupted (input stream not conforming to the zlib format or incorrect check - value), Z_STREAM_ERROR if the stream structure was inconsistent (for example - next_in or next_out was Z_NULL), Z_MEM_ERROR if there was not enough memory, - Z_BUF_ERROR if no progress is possible or if there was not enough room in the - output buffer when Z_FINISH is used. Note that Z_BUF_ERROR is not fatal, and - inflate() can be called again with more input and more output space to - continue decompressing. If Z_DATA_ERROR is returned, the application may - then call inflateSync() to look for a good compression block if a partial - recovery of the data is desired. -*/ - - -ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm)); -/* - All dynamically allocated data structures for this stream are freed. - This function discards any unprocessed input and does not flush any pending - output. - - inflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state - was inconsistent. In the error case, msg may be set but then points to a - static string (which must not be deallocated). -*/ - - - /* Advanced functions */ - -/* - The following functions are needed only in some special applications. -*/ - -/* -ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm, - int level, - int method, - int windowBits, - int memLevel, - int strategy)); - - This is another version of deflateInit with more compression options. The - fields next_in, zalloc, zfree and opaque must be initialized before by the - caller. - - The method parameter is the compression method. It must be Z_DEFLATED in - this version of the library. - - The windowBits parameter is the base two logarithm of the window size - (the size of the history buffer). It should be in the range 8..15 for this - version of the library. Larger values of this parameter result in better - compression at the expense of memory usage. The default value is 15 if - deflateInit is used instead. - - windowBits can also be -8..-15 for raw deflate. In this case, -windowBits - determines the window size. deflate() will then generate raw deflate data - with no zlib header or trailer, and will not compute an adler32 check value. - - windowBits can also be greater than 15 for optional gzip encoding. Add - 16 to windowBits to write a simple gzip header and trailer around the - compressed data instead of a zlib wrapper. The gzip header will have no - file name, no extra data, no comment, no modification time (set to zero), no - header crc, and the operating system will be set to 255 (unknown). If a - gzip stream is being written, strm->adler is a crc32 instead of an adler32. - - The memLevel parameter specifies how much memory should be allocated - for the internal compression state. memLevel=1 uses minimum memory but is - slow and reduces compression ratio; memLevel=9 uses maximum memory for - optimal speed. The default value is 8. See zconf.h for total memory usage - as a function of windowBits and memLevel. - - The strategy parameter is used to tune the compression algorithm. Use the - value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a - filter (or predictor), Z_HUFFMAN_ONLY to force Huffman encoding only (no - string match), or Z_RLE to limit match distances to one (run-length - encoding). Filtered data consists mostly of small values with a somewhat - random distribution. In this case, the compression algorithm is tuned to - compress them better. The effect of Z_FILTERED is to force more Huffman - coding and less string matching; it is somewhat intermediate between - Z_DEFAULT_STRATEGY and Z_HUFFMAN_ONLY. Z_RLE is designed to be almost as - fast as Z_HUFFMAN_ONLY, but give better compression for PNG image data. The - strategy parameter only affects the compression ratio but not the - correctness of the compressed output even if it is not set appropriately. - Z_FIXED prevents the use of dynamic Huffman codes, allowing for a simpler - decoder for special applications. - - deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough - memory, Z_STREAM_ERROR if any parameter is invalid (such as an invalid - method), or Z_VERSION_ERROR if the zlib library version (zlib_version) is - incompatible with the version assumed by the caller (ZLIB_VERSION). msg is - set to null if there is no error message. deflateInit2 does not perform any - compression: this will be done by deflate(). -*/ - -ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm, - const Bytef *dictionary, - uInt dictLength)); -/* - Initializes the compression dictionary from the given byte sequence - without producing any compressed output. When using the zlib format, this - function must be called immediately after deflateInit, deflateInit2 or - deflateReset, and before any call of deflate. When doing raw deflate, this - function must be called either before any call of deflate, or immediately - after the completion of a deflate block, i.e. after all input has been - consumed and all output has been delivered when using any of the flush - options Z_BLOCK, Z_PARTIAL_FLUSH, Z_SYNC_FLUSH, or Z_FULL_FLUSH. The - compressor and decompressor must use exactly the same dictionary (see - inflateSetDictionary). - - The dictionary should consist of strings (byte sequences) that are likely - to be encountered later in the data to be compressed, with the most commonly - used strings preferably put towards the end of the dictionary. Using a - dictionary is most useful when the data to be compressed is short and can be - predicted with good accuracy; the data can then be compressed better than - with the default empty dictionary. - - Depending on the size of the compression data structures selected by - deflateInit or deflateInit2, a part of the dictionary may in effect be - discarded, for example if the dictionary is larger than the window size - provided in deflateInit or deflateInit2. Thus the strings most likely to be - useful should be put at the end of the dictionary, not at the front. In - addition, the current implementation of deflate will use at most the window - size minus 262 bytes of the provided dictionary. - - Upon return of this function, strm->adler is set to the adler32 value - of the dictionary; the decompressor may later use this value to determine - which dictionary has been used by the compressor. (The adler32 value - applies to the whole dictionary even if only a subset of the dictionary is - actually used by the compressor.) If a raw deflate was requested, then the - adler32 value is not computed and strm->adler is not set. - - deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a - parameter is invalid (e.g. dictionary being Z_NULL) or the stream state is - inconsistent (for example if deflate has already been called for this stream - or if not at a block boundary for raw deflate). deflateSetDictionary does - not perform any compression: this will be done by deflate(). -*/ - -ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest, - z_streamp source)); -/* - Sets the destination stream as a complete copy of the source stream. - - This function can be useful when several compression strategies will be - tried, for example when there are several ways of pre-processing the input - data with a filter. The streams that will be discarded should then be freed - by calling deflateEnd. Note that deflateCopy duplicates the internal - compression state which can be quite large, so this strategy is slow and can - consume lots of memory. - - deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not - enough memory, Z_STREAM_ERROR if the source stream state was inconsistent - (such as zalloc being Z_NULL). msg is left unchanged in both source and - destination. -*/ - -ZEXTERN int ZEXPORT deflateReset OF((z_streamp strm)); -/* - This function is equivalent to deflateEnd followed by deflateInit, - but does not free and reallocate all the internal compression state. The - stream will keep the same compression level and any other attributes that - may have been set by deflateInit2. - - deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source - stream state was inconsistent (such as zalloc or state being Z_NULL). -*/ - -ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm, - int level, - int strategy)); -/* - Dynamically update the compression level and compression strategy. The - interpretation of level and strategy is as in deflateInit2. This can be - used to switch between compression and straight copy of the input data, or - to switch to a different kind of input data requiring a different strategy. - If the compression level is changed, the input available so far is - compressed with the old level (and may be flushed); the new level will take - effect only at the next call of deflate(). - - Before the call of deflateParams, the stream state must be set as for - a call of deflate(), since the currently available input may have to be - compressed and flushed. In particular, strm->avail_out must be non-zero. - - deflateParams returns Z_OK if success, Z_STREAM_ERROR if the source - stream state was inconsistent or if a parameter was invalid, Z_BUF_ERROR if - strm->avail_out was zero. -*/ - -ZEXTERN int ZEXPORT deflateTune OF((z_streamp strm, - int good_length, - int max_lazy, - int nice_length, - int max_chain)); -/* - Fine tune deflate's internal compression parameters. This should only be - used by someone who understands the algorithm used by zlib's deflate for - searching for the best matching string, and even then only by the most - fanatic optimizer trying to squeeze out the last compressed bit for their - specific input data. Read the deflate.c source code for the meaning of the - max_lazy, good_length, nice_length, and max_chain parameters. - - deflateTune() can be called after deflateInit() or deflateInit2(), and - returns Z_OK on success, or Z_STREAM_ERROR for an invalid deflate stream. - */ - -ZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm, - uLong sourceLen)); -/* - deflateBound() returns an upper bound on the compressed size after - deflation of sourceLen bytes. It must be called after deflateInit() or - deflateInit2(), and after deflateSetHeader(), if used. This would be used - to allocate an output buffer for deflation in a single pass, and so would be - called before deflate(). If that first deflate() call is provided the - sourceLen input bytes, an output buffer allocated to the size returned by - deflateBound(), and the flush value Z_FINISH, then deflate() is guaranteed - to return Z_STREAM_END. Note that it is possible for the compressed size to - be larger than the value returned by deflateBound() if flush options other - than Z_FINISH or Z_NO_FLUSH are used. -*/ - -ZEXTERN int ZEXPORT deflatePending OF((z_streamp strm, - unsigned *pending, - int *bits)); -/* - deflatePending() returns the number of bytes and bits of output that have - been generated, but not yet provided in the available output. The bytes not - provided would be due to the available output space having being consumed. - The number of bits of output not provided are between 0 and 7, where they - await more bits to join them in order to fill out a full byte. If pending - or bits are Z_NULL, then those values are not set. - - deflatePending returns Z_OK if success, or Z_STREAM_ERROR if the source - stream state was inconsistent. - */ - -ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm, - int bits, - int value)); -/* - deflatePrime() inserts bits in the deflate output stream. The intent - is that this function is used to start off the deflate output with the bits - leftover from a previous deflate stream when appending to it. As such, this - function can only be used for raw deflate, and must be used before the first - deflate() call after a deflateInit2() or deflateReset(). bits must be less - than or equal to 16, and that many of the least significant bits of value - will be inserted in the output. - - deflatePrime returns Z_OK if success, Z_BUF_ERROR if there was not enough - room in the internal buffer to insert the bits, or Z_STREAM_ERROR if the - source stream state was inconsistent. -*/ - -ZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm, - gz_headerp head)); -/* - deflateSetHeader() provides gzip header information for when a gzip - stream is requested by deflateInit2(). deflateSetHeader() may be called - after deflateInit2() or deflateReset() and before the first call of - deflate(). The text, time, os, extra field, name, and comment information - in the provided gz_header structure are written to the gzip header (xflag is - ignored -- the extra flags are set according to the compression level). The - caller must assure that, if not Z_NULL, name and comment are terminated with - a zero byte, and that if extra is not Z_NULL, that extra_len bytes are - available there. If hcrc is true, a gzip header crc is included. Note that - the current versions of the command-line version of gzip (up through version - 1.3.x) do not support header crc's, and will report that it is a "multi-part - gzip file" and give up. - - If deflateSetHeader is not used, the default gzip header has text false, - the time set to zero, and os set to 255, with no extra, name, or comment - fields. The gzip header is returned to the default state by deflateReset(). - - deflateSetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source - stream state was inconsistent. -*/ - -/* -ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm, - int windowBits)); - - This is another version of inflateInit with an extra parameter. The - fields next_in, avail_in, zalloc, zfree and opaque must be initialized - before by the caller. - - The windowBits parameter is the base two logarithm of the maximum window - size (the size of the history buffer). It should be in the range 8..15 for - this version of the library. The default value is 15 if inflateInit is used - instead. windowBits must be greater than or equal to the windowBits value - provided to deflateInit2() while compressing, or it must be equal to 15 if - deflateInit2() was not used. If a compressed stream with a larger window - size is given as input, inflate() will return with the error code - Z_DATA_ERROR instead of trying to allocate a larger window. - - windowBits can also be zero to request that inflate use the window size in - the zlib header of the compressed stream. - - windowBits can also be -8..-15 for raw inflate. In this case, -windowBits - determines the window size. inflate() will then process raw deflate data, - not looking for a zlib or gzip header, not generating a check value, and not - looking for any check values for comparison at the end of the stream. This - is for use with other formats that use the deflate compressed data format - such as zip. Those formats provide their own check values. If a custom - format is developed using the raw deflate format for compressed data, it is - recommended that a check value such as an adler32 or a crc32 be applied to - the uncompressed data as is done in the zlib, gzip, and zip formats. For - most applications, the zlib format should be used as is. Note that comments - above on the use in deflateInit2() applies to the magnitude of windowBits. - - windowBits can also be greater than 15 for optional gzip decoding. Add - 32 to windowBits to enable zlib and gzip decoding with automatic header - detection, or add 16 to decode only the gzip format (the zlib format will - return a Z_DATA_ERROR). If a gzip stream is being decoded, strm->adler is a - crc32 instead of an adler32. - - inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough - memory, Z_VERSION_ERROR if the zlib library version is incompatible with the - version assumed by the caller, or Z_STREAM_ERROR if the parameters are - invalid, such as a null pointer to the structure. msg is set to null if - there is no error message. inflateInit2 does not perform any decompression - apart from possibly reading the zlib header if present: actual decompression - will be done by inflate(). (So next_in and avail_in may be modified, but - next_out and avail_out are unused and unchanged.) The current implementation - of inflateInit2() does not process any header information -- that is - deferred until inflate() is called. -*/ - -ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm, - const Bytef *dictionary, - uInt dictLength)); -/* - Initializes the decompression dictionary from the given uncompressed byte - sequence. This function must be called immediately after a call of inflate, - if that call returned Z_NEED_DICT. The dictionary chosen by the compressor - can be determined from the adler32 value returned by that call of inflate. - The compressor and decompressor must use exactly the same dictionary (see - deflateSetDictionary). For raw inflate, this function can be called at any - time to set the dictionary. If the provided dictionary is smaller than the - window and there is already data in the window, then the provided dictionary - will amend what's there. The application must insure that the dictionary - that was used for compression is provided. - - inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a - parameter is invalid (e.g. dictionary being Z_NULL) or the stream state is - inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the - expected one (incorrect adler32 value). inflateSetDictionary does not - perform any decompression: this will be done by subsequent calls of - inflate(). -*/ - -ZEXTERN int ZEXPORT inflateGetDictionary OF((z_streamp strm, - Bytef *dictionary, - uInt *dictLength)); -/* - Returns the sliding dictionary being maintained by inflate. dictLength is - set to the number of bytes in the dictionary, and that many bytes are copied - to dictionary. dictionary must have enough space, where 32768 bytes is - always enough. If inflateGetDictionary() is called with dictionary equal to - Z_NULL, then only the dictionary length is returned, and nothing is copied. - Similary, if dictLength is Z_NULL, then it is not set. - - inflateGetDictionary returns Z_OK on success, or Z_STREAM_ERROR if the - stream state is inconsistent. -*/ - -ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm)); -/* - Skips invalid compressed data until a possible full flush point (see above - for the description of deflate with Z_FULL_FLUSH) can be found, or until all - available input is skipped. No output is provided. - - inflateSync searches for a 00 00 FF FF pattern in the compressed data. - All full flush points have this pattern, but not all occurrences of this - pattern are full flush points. - - inflateSync returns Z_OK if a possible full flush point has been found, - Z_BUF_ERROR if no more input was provided, Z_DATA_ERROR if no flush point - has been found, or Z_STREAM_ERROR if the stream structure was inconsistent. - In the success case, the application may save the current current value of - total_in which indicates where valid compressed data was found. In the - error case, the application may repeatedly call inflateSync, providing more - input each time, until success or end of the input data. -*/ - -ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest, - z_streamp source)); -/* - Sets the destination stream as a complete copy of the source stream. - - This function can be useful when randomly accessing a large stream. The - first pass through the stream can periodically record the inflate state, - allowing restarting inflate at those points when randomly accessing the - stream. - - inflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not - enough memory, Z_STREAM_ERROR if the source stream state was inconsistent - (such as zalloc being Z_NULL). msg is left unchanged in both source and - destination. -*/ - -ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm)); -/* - This function is equivalent to inflateEnd followed by inflateInit, - but does not free and reallocate all the internal decompression state. The - stream will keep attributes that may have been set by inflateInit2. - - inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source - stream state was inconsistent (such as zalloc or state being Z_NULL). -*/ - -ZEXTERN int ZEXPORT inflateReset2 OF((z_streamp strm, - int windowBits)); -/* - This function is the same as inflateReset, but it also permits changing - the wrap and window size requests. The windowBits parameter is interpreted - the same as it is for inflateInit2. - - inflateReset2 returns Z_OK if success, or Z_STREAM_ERROR if the source - stream state was inconsistent (such as zalloc or state being Z_NULL), or if - the windowBits parameter is invalid. -*/ - -ZEXTERN int ZEXPORT inflatePrime OF((z_streamp strm, - int bits, - int value)); -/* - This function inserts bits in the inflate input stream. The intent is - that this function is used to start inflating at a bit position in the - middle of a byte. The provided bits will be used before any bytes are used - from next_in. This function should only be used with raw inflate, and - should be used before the first inflate() call after inflateInit2() or - inflateReset(). bits must be less than or equal to 16, and that many of the - least significant bits of value will be inserted in the input. - - If bits is negative, then the input stream bit buffer is emptied. Then - inflatePrime() can be called again to put bits in the buffer. This is used - to clear out bits leftover after feeding inflate a block description prior - to feeding inflate codes. - - inflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source - stream state was inconsistent. -*/ - -ZEXTERN long ZEXPORT inflateMark OF((z_streamp strm)); -/* - This function returns two values, one in the lower 16 bits of the return - value, and the other in the remaining upper bits, obtained by shifting the - return value down 16 bits. If the upper value is -1 and the lower value is - zero, then inflate() is currently decoding information outside of a block. - If the upper value is -1 and the lower value is non-zero, then inflate is in - the middle of a stored block, with the lower value equaling the number of - bytes from the input remaining to copy. If the upper value is not -1, then - it is the number of bits back from the current bit position in the input of - the code (literal or length/distance pair) currently being processed. In - that case the lower value is the number of bytes already emitted for that - code. - - A code is being processed if inflate is waiting for more input to complete - decoding of the code, or if it has completed decoding but is waiting for - more output space to write the literal or match data. - - inflateMark() is used to mark locations in the input data for random - access, which may be at bit positions, and to note those cases where the - output of a code may span boundaries of random access blocks. The current - location in the input stream can be determined from avail_in and data_type - as noted in the description for the Z_BLOCK flush parameter for inflate. - - inflateMark returns the value noted above or -1 << 16 if the provided - source stream state was inconsistent. -*/ - -ZEXTERN int ZEXPORT inflateGetHeader OF((z_streamp strm, - gz_headerp head)); -/* - inflateGetHeader() requests that gzip header information be stored in the - provided gz_header structure. inflateGetHeader() may be called after - inflateInit2() or inflateReset(), and before the first call of inflate(). - As inflate() processes the gzip stream, head->done is zero until the header - is completed, at which time head->done is set to one. If a zlib stream is - being decoded, then head->done is set to -1 to indicate that there will be - no gzip header information forthcoming. Note that Z_BLOCK or Z_TREES can be - used to force inflate() to return immediately after header processing is - complete and before any actual data is decompressed. - - The text, time, xflags, and os fields are filled in with the gzip header - contents. hcrc is set to true if there is a header CRC. (The header CRC - was valid if done is set to one.) If extra is not Z_NULL, then extra_max - contains the maximum number of bytes to write to extra. Once done is true, - extra_len contains the actual extra field length, and extra contains the - extra field, or that field truncated if extra_max is less than extra_len. - If name is not Z_NULL, then up to name_max characters are written there, - terminated with a zero unless the length is greater than name_max. If - comment is not Z_NULL, then up to comm_max characters are written there, - terminated with a zero unless the length is greater than comm_max. When any - of extra, name, or comment are not Z_NULL and the respective field is not - present in the header, then that field is set to Z_NULL to signal its - absence. This allows the use of deflateSetHeader() with the returned - structure to duplicate the header. However if those fields are set to - allocated memory, then the application will need to save those pointers - elsewhere so that they can be eventually freed. - - If inflateGetHeader is not used, then the header information is simply - discarded. The header is always checked for validity, including the header - CRC if present. inflateReset() will reset the process to discard the header - information. The application would need to call inflateGetHeader() again to - retrieve the header from the next gzip stream. - - inflateGetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source - stream state was inconsistent. -*/ - -/* -ZEXTERN int ZEXPORT inflateBackInit OF((z_streamp strm, int windowBits, - unsigned char FAR *window)); - - Initialize the internal stream state for decompression using inflateBack() - calls. The fields zalloc, zfree and opaque in strm must be initialized - before the call. If zalloc and zfree are Z_NULL, then the default library- - derived memory allocation routines are used. windowBits is the base two - logarithm of the window size, in the range 8..15. window is a caller - supplied buffer of that size. Except for special applications where it is - assured that deflate was used with small window sizes, windowBits must be 15 - and a 32K byte window must be supplied to be able to decompress general - deflate streams. - - See inflateBack() for the usage of these routines. - - inflateBackInit will return Z_OK on success, Z_STREAM_ERROR if any of - the parameters are invalid, Z_MEM_ERROR if the internal state could not be - allocated, or Z_VERSION_ERROR if the version of the library does not match - the version of the header file. -*/ - -typedef unsigned (*in_func) OF((void FAR *, - z_const unsigned char FAR * FAR *)); -typedef int (*out_func) OF((void FAR *, unsigned char FAR *, unsigned)); - -ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm, - in_func in, void FAR *in_desc, - out_func out, void FAR *out_desc)); -/* - inflateBack() does a raw inflate with a single call using a call-back - interface for input and output. This is potentially more efficient than - inflate() for file i/o applications, in that it avoids copying between the - output and the sliding window by simply making the window itself the output - buffer. inflate() can be faster on modern CPUs when used with large - buffers. inflateBack() trusts the application to not change the output - buffer passed by the output function, at least until inflateBack() returns. - - inflateBackInit() must be called first to allocate the internal state - and to initialize the state with the user-provided window buffer. - inflateBack() may then be used multiple times to inflate a complete, raw - deflate stream with each call. inflateBackEnd() is then called to free the - allocated state. - - A raw deflate stream is one with no zlib or gzip header or trailer. - This routine would normally be used in a utility that reads zip or gzip - files and writes out uncompressed files. The utility would decode the - header and process the trailer on its own, hence this routine expects only - the raw deflate stream to decompress. This is different from the normal - behavior of inflate(), which expects either a zlib or gzip header and - trailer around the deflate stream. - - inflateBack() uses two subroutines supplied by the caller that are then - called by inflateBack() for input and output. inflateBack() calls those - routines until it reads a complete deflate stream and writes out all of the - uncompressed data, or until it encounters an error. The function's - parameters and return types are defined above in the in_func and out_func - typedefs. inflateBack() will call in(in_desc, &buf) which should return the - number of bytes of provided input, and a pointer to that input in buf. If - there is no input available, in() must return zero--buf is ignored in that - case--and inflateBack() will return a buffer error. inflateBack() will call - out(out_desc, buf, len) to write the uncompressed data buf[0..len-1]. out() - should return zero on success, or non-zero on failure. If out() returns - non-zero, inflateBack() will return with an error. Neither in() nor out() - are permitted to change the contents of the window provided to - inflateBackInit(), which is also the buffer that out() uses to write from. - The length written by out() will be at most the window size. Any non-zero - amount of input may be provided by in(). - - For convenience, inflateBack() can be provided input on the first call by - setting strm->next_in and strm->avail_in. If that input is exhausted, then - in() will be called. Therefore strm->next_in must be initialized before - calling inflateBack(). If strm->next_in is Z_NULL, then in() will be called - immediately for input. If strm->next_in is not Z_NULL, then strm->avail_in - must also be initialized, and then if strm->avail_in is not zero, input will - initially be taken from strm->next_in[0 .. strm->avail_in - 1]. - - The in_desc and out_desc parameters of inflateBack() is passed as the - first parameter of in() and out() respectively when they are called. These - descriptors can be optionally used to pass any information that the caller- - supplied in() and out() functions need to do their job. - - On return, inflateBack() will set strm->next_in and strm->avail_in to - pass back any unused input that was provided by the last in() call. The - return values of inflateBack() can be Z_STREAM_END on success, Z_BUF_ERROR - if in() or out() returned an error, Z_DATA_ERROR if there was a format error - in the deflate stream (in which case strm->msg is set to indicate the nature - of the error), or Z_STREAM_ERROR if the stream was not properly initialized. - In the case of Z_BUF_ERROR, an input or output error can be distinguished - using strm->next_in which will be Z_NULL only if in() returned an error. If - strm->next_in is not Z_NULL, then the Z_BUF_ERROR was due to out() returning - non-zero. (in() will always be called before out(), so strm->next_in is - assured to be defined if out() returns non-zero.) Note that inflateBack() - cannot return Z_OK. -*/ - -ZEXTERN int ZEXPORT inflateBackEnd OF((z_streamp strm)); -/* - All memory allocated by inflateBackInit() is freed. - - inflateBackEnd() returns Z_OK on success, or Z_STREAM_ERROR if the stream - state was inconsistent. -*/ - -ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void)); -/* Return flags indicating compile-time options. - - Type sizes, two bits each, 00 = 16 bits, 01 = 32, 10 = 64, 11 = other: - 1.0: size of uInt - 3.2: size of uLong - 5.4: size of voidpf (pointer) - 7.6: size of z_off_t - - Compiler, assembler, and debug options: - 8: DEBUG - 9: ASMV or ASMINF -- use ASM code - 10: ZLIB_WINAPI -- exported functions use the WINAPI calling convention - 11: 0 (reserved) - - One-time table building (smaller code, but not thread-safe if true): - 12: BUILDFIXED -- build static block decoding tables when needed - 13: DYNAMIC_CRC_TABLE -- build CRC calculation tables when needed - 14,15: 0 (reserved) - - Library content (indicates missing functionality): - 16: NO_GZCOMPRESS -- gz* functions cannot compress (to avoid linking - deflate code when not needed) - 17: NO_GZIP -- deflate can't write gzip streams, and inflate can't detect - and decode gzip streams (to avoid linking crc code) - 18-19: 0 (reserved) - - Operation variations (changes in library functionality): - 20: PKZIP_BUG_WORKAROUND -- slightly more permissive inflate - 21: FASTEST -- deflate algorithm with only one, lowest compression level - 22,23: 0 (reserved) - - The sprintf variant used by gzprintf (zero is best): - 24: 0 = vs*, 1 = s* -- 1 means limited to 20 arguments after the format - 25: 0 = *nprintf, 1 = *printf -- 1 means gzprintf() not secure! - 26: 0 = returns value, 1 = void -- 1 means inferred string length returned - - Remainder: - 27-31: 0 (reserved) - */ - -#ifndef Z_SOLO - - /* utility functions */ - -/* - The following utility functions are implemented on top of the basic - stream-oriented functions. To simplify the interface, some default options - are assumed (compression level and memory usage, standard memory allocation - functions). The source code of these utility functions can be modified if - you need special options. -*/ - -ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen, - const Bytef *source, uLong sourceLen)); -/* - Compresses the source buffer into the destination buffer. sourceLen is - the byte length of the source buffer. Upon entry, destLen is the total size - of the destination buffer, which must be at least the value returned by - compressBound(sourceLen). Upon exit, destLen is the actual size of the - compressed buffer. - - compress returns Z_OK if success, Z_MEM_ERROR if there was not - enough memory, Z_BUF_ERROR if there was not enough room in the output - buffer. -*/ - -ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen, - const Bytef *source, uLong sourceLen, - int level)); -/* - Compresses the source buffer into the destination buffer. The level - parameter has the same meaning as in deflateInit. sourceLen is the byte - length of the source buffer. Upon entry, destLen is the total size of the - destination buffer, which must be at least the value returned by - compressBound(sourceLen). Upon exit, destLen is the actual size of the - compressed buffer. - - compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough - memory, Z_BUF_ERROR if there was not enough room in the output buffer, - Z_STREAM_ERROR if the level parameter is invalid. -*/ - -ZEXTERN uLong ZEXPORT compressBound OF((uLong sourceLen)); -/* - compressBound() returns an upper bound on the compressed size after - compress() or compress2() on sourceLen bytes. It would be used before a - compress() or compress2() call to allocate the destination buffer. -*/ - -ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen, - const Bytef *source, uLong sourceLen)); -/* - Decompresses the source buffer into the destination buffer. sourceLen is - the byte length of the source buffer. Upon entry, destLen is the total size - of the destination buffer, which must be large enough to hold the entire - uncompressed data. (The size of the uncompressed data must have been saved - previously by the compressor and transmitted to the decompressor by some - mechanism outside the scope of this compression library.) Upon exit, destLen - is the actual size of the uncompressed buffer. - - uncompress returns Z_OK if success, Z_MEM_ERROR if there was not - enough memory, Z_BUF_ERROR if there was not enough room in the output - buffer, or Z_DATA_ERROR if the input data was corrupted or incomplete. In - the case where there is not enough room, uncompress() will fill the output - buffer with the uncompressed data up to that point. -*/ - - /* gzip file access functions */ - -/* - This library supports reading and writing files in gzip (.gz) format with - an interface similar to that of stdio, using the functions that start with - "gz". The gzip format is different from the zlib format. gzip is a gzip - wrapper, documented in RFC 1952, wrapped around a deflate stream. -*/ - -typedef struct gzFile_s *gzFile; /* semi-opaque gzip file descriptor */ - -/* -ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode)); - - Opens a gzip (.gz) file for reading or writing. The mode parameter is as - in fopen ("rb" or "wb") but can also include a compression level ("wb9") or - a strategy: 'f' for filtered data as in "wb6f", 'h' for Huffman-only - compression as in "wb1h", 'R' for run-length encoding as in "wb1R", or 'F' - for fixed code compression as in "wb9F". (See the description of - deflateInit2 for more information about the strategy parameter.) 'T' will - request transparent writing or appending with no compression and not using - the gzip format. - - "a" can be used instead of "w" to request that the gzip stream that will - be written be appended to the file. "+" will result in an error, since - reading and writing to the same gzip file is not supported. The addition of - "x" when writing will create the file exclusively, which fails if the file - already exists. On systems that support it, the addition of "e" when - reading or writing will set the flag to close the file on an execve() call. - - These functions, as well as gzip, will read and decode a sequence of gzip - streams in a file. The append function of gzopen() can be used to create - such a file. (Also see gzflush() for another way to do this.) When - appending, gzopen does not test whether the file begins with a gzip stream, - nor does it look for the end of the gzip streams to begin appending. gzopen - will simply append a gzip stream to the existing file. - - gzopen can be used to read a file which is not in gzip format; in this - case gzread will directly read from the file without decompression. When - reading, this will be detected automatically by looking for the magic two- - byte gzip header. - - gzopen returns NULL if the file could not be opened, if there was - insufficient memory to allocate the gzFile state, or if an invalid mode was - specified (an 'r', 'w', or 'a' was not provided, or '+' was provided). - errno can be checked to determine if the reason gzopen failed was that the - file could not be opened. -*/ - -ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode)); -/* - gzdopen associates a gzFile with the file descriptor fd. File descriptors - are obtained from calls like open, dup, creat, pipe or fileno (if the file - has been previously opened with fopen). The mode parameter is as in gzopen. - - The next call of gzclose on the returned gzFile will also close the file - descriptor fd, just like fclose(fdopen(fd, mode)) closes the file descriptor - fd. If you want to keep fd open, use fd = dup(fd_keep); gz = gzdopen(fd, - mode);. The duplicated descriptor should be saved to avoid a leak, since - gzdopen does not close fd if it fails. If you are using fileno() to get the - file descriptor from a FILE *, then you will have to use dup() to avoid - double-close()ing the file descriptor. Both gzclose() and fclose() will - close the associated file descriptor, so they need to have different file - descriptors. - - gzdopen returns NULL if there was insufficient memory to allocate the - gzFile state, if an invalid mode was specified (an 'r', 'w', or 'a' was not - provided, or '+' was provided), or if fd is -1. The file descriptor is not - used until the next gz* read, write, seek, or close operation, so gzdopen - will not detect if fd is invalid (unless fd is -1). -*/ - -ZEXTERN int ZEXPORT gzbuffer OF((gzFile file, unsigned size)); -/* - Set the internal buffer size used by this library's functions. The - default buffer size is 8192 bytes. This function must be called after - gzopen() or gzdopen(), and before any other calls that read or write the - file. The buffer memory allocation is always deferred to the first read or - write. Two buffers are allocated, either both of the specified size when - writing, or one of the specified size and the other twice that size when - reading. A larger buffer size of, for example, 64K or 128K bytes will - noticeably increase the speed of decompression (reading). - - The new buffer size also affects the maximum length for gzprintf(). - - gzbuffer() returns 0 on success, or -1 on failure, such as being called - too late. -*/ - -ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy)); -/* - Dynamically update the compression level or strategy. See the description - of deflateInit2 for the meaning of these parameters. - - gzsetparams returns Z_OK if success, or Z_STREAM_ERROR if the file was not - opened for writing. -*/ - -ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len)); -/* - Reads the given number of uncompressed bytes from the compressed file. If - the input file is not in gzip format, gzread copies the given number of - bytes into the buffer directly from the file. - - After reaching the end of a gzip stream in the input, gzread will continue - to read, looking for another gzip stream. Any number of gzip streams may be - concatenated in the input file, and will all be decompressed by gzread(). - If something other than a gzip stream is encountered after a gzip stream, - that remaining trailing garbage is ignored (and no error is returned). - - gzread can be used to read a gzip file that is being concurrently written. - Upon reaching the end of the input, gzread will return with the available - data. If the error code returned by gzerror is Z_OK or Z_BUF_ERROR, then - gzclearerr can be used to clear the end of file indicator in order to permit - gzread to be tried again. Z_OK indicates that a gzip stream was completed - on the last gzread. Z_BUF_ERROR indicates that the input file ended in the - middle of a gzip stream. Note that gzread does not return -1 in the event - of an incomplete gzip stream. This error is deferred until gzclose(), which - will return Z_BUF_ERROR if the last gzread ended in the middle of a gzip - stream. Alternatively, gzerror can be used before gzclose to detect this - case. - - gzread returns the number of uncompressed bytes actually read, less than - len for end of file, or -1 for error. -*/ - -ZEXTERN int ZEXPORT gzwrite OF((gzFile file, - voidpc buf, unsigned len)); -/* - Writes the given number of uncompressed bytes into the compressed file. - gzwrite returns the number of uncompressed bytes written or 0 in case of - error. -*/ - -ZEXTERN int ZEXPORTVA gzprintf Z_ARG((gzFile file, const char *format, ...)); -/* - Converts, formats, and writes the arguments to the compressed file under - control of the format string, as in fprintf. gzprintf returns the number of - uncompressed bytes actually written, or 0 in case of error. The number of - uncompressed bytes written is limited to 8191, or one less than the buffer - size given to gzbuffer(). The caller should assure that this limit is not - exceeded. If it is exceeded, then gzprintf() will return an error (0) with - nothing written. In this case, there may also be a buffer overflow with - unpredictable consequences, which is possible only if zlib was compiled with - the insecure functions sprintf() or vsprintf() because the secure snprintf() - or vsnprintf() functions were not available. This can be determined using - zlibCompileFlags(). -*/ - -ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s)); -/* - Writes the given null-terminated string to the compressed file, excluding - the terminating null character. - - gzputs returns the number of characters written, or -1 in case of error. -*/ - -ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len)); -/* - Reads bytes from the compressed file until len-1 characters are read, or a - newline character is read and transferred to buf, or an end-of-file - condition is encountered. If any characters are read or if len == 1, the - string is terminated with a null character. If no characters are read due - to an end-of-file or len < 1, then the buffer is left untouched. - - gzgets returns buf which is a null-terminated string, or it returns NULL - for end-of-file or in case of error. If there was an error, the contents at - buf are indeterminate. -*/ - -ZEXTERN int ZEXPORT gzputc OF((gzFile file, int c)); -/* - Writes c, converted to an unsigned char, into the compressed file. gzputc - returns the value that was written, or -1 in case of error. -*/ - -ZEXTERN int ZEXPORT gzgetc OF((gzFile file)); -/* - Reads one byte from the compressed file. gzgetc returns this byte or -1 - in case of end of file or error. This is implemented as a macro for speed. - As such, it does not do all of the checking the other functions do. I.e. - it does not check to see if file is NULL, nor whether the structure file - points to has been clobbered or not. -*/ - -ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file)); -/* - Push one character back onto the stream to be read as the first character - on the next read. At least one character of push-back is allowed. - gzungetc() returns the character pushed, or -1 on failure. gzungetc() will - fail if c is -1, and may fail if a character has been pushed but not read - yet. If gzungetc is used immediately after gzopen or gzdopen, at least the - output buffer size of pushed characters is allowed. (See gzbuffer above.) - The pushed character will be discarded if the stream is repositioned with - gzseek() or gzrewind(). -*/ - -ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush)); -/* - Flushes all pending output into the compressed file. The parameter flush - is as in the deflate() function. The return value is the zlib error number - (see function gzerror below). gzflush is only permitted when writing. - - If the flush parameter is Z_FINISH, the remaining data is written and the - gzip stream is completed in the output. If gzwrite() is called again, a new - gzip stream will be started in the output. gzread() is able to read such - concatented gzip streams. - - gzflush should be called only when strictly necessary because it will - degrade compression if called too often. -*/ - -/* -ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file, - z_off_t offset, int whence)); - - Sets the starting position for the next gzread or gzwrite on the given - compressed file. The offset represents a number of bytes in the - uncompressed data stream. The whence parameter is defined as in lseek(2); - the value SEEK_END is not supported. - - If the file is opened for reading, this function is emulated but can be - extremely slow. If the file is opened for writing, only forward seeks are - supported; gzseek then compresses a sequence of zeroes up to the new - starting position. - - gzseek returns the resulting offset location as measured in bytes from - the beginning of the uncompressed stream, or -1 in case of error, in - particular if the file is opened for writing and the new starting position - would be before the current position. -*/ - -ZEXTERN int ZEXPORT gzrewind OF((gzFile file)); -/* - Rewinds the given file. This function is supported only for reading. - - gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET) -*/ - -/* -ZEXTERN z_off_t ZEXPORT gztell OF((gzFile file)); - - Returns the starting position for the next gzread or gzwrite on the given - compressed file. This position represents a number of bytes in the - uncompressed data stream, and is zero when starting, even if appending or - reading a gzip stream from the middle of a file using gzdopen(). - - gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR) -*/ - -/* -ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile file)); - - Returns the current offset in the file being read or written. This offset - includes the count of bytes that precede the gzip stream, for example when - appending or when using gzdopen() for reading. When reading, the offset - does not include as yet unused buffered input. This information can be used - for a progress indicator. On error, gzoffset() returns -1. -*/ - -ZEXTERN int ZEXPORT gzeof OF((gzFile file)); -/* - Returns true (1) if the end-of-file indicator has been set while reading, - false (0) otherwise. Note that the end-of-file indicator is set only if the - read tried to go past the end of the input, but came up short. Therefore, - just like feof(), gzeof() may return false even if there is no more data to - read, in the event that the last read request was for the exact number of - bytes remaining in the input file. This will happen if the input file size - is an exact multiple of the buffer size. - - If gzeof() returns true, then the read functions will return no more data, - unless the end-of-file indicator is reset by gzclearerr() and the input file - has grown since the previous end of file was detected. -*/ - -ZEXTERN int ZEXPORT gzdirect OF((gzFile file)); -/* - Returns true (1) if file is being copied directly while reading, or false - (0) if file is a gzip stream being decompressed. - - If the input file is empty, gzdirect() will return true, since the input - does not contain a gzip stream. - - If gzdirect() is used immediately after gzopen() or gzdopen() it will - cause buffers to be allocated to allow reading the file to determine if it - is a gzip file. Therefore if gzbuffer() is used, it should be called before - gzdirect(). - - When writing, gzdirect() returns true (1) if transparent writing was - requested ("wT" for the gzopen() mode), or false (0) otherwise. (Note: - gzdirect() is not needed when writing. Transparent writing must be - explicitly requested, so the application already knows the answer. When - linking statically, using gzdirect() will include all of the zlib code for - gzip file reading and decompression, which may not be desired.) -*/ - -ZEXTERN int ZEXPORT gzclose OF((gzFile file)); -/* - Flushes all pending output if necessary, closes the compressed file and - deallocates the (de)compression state. Note that once file is closed, you - cannot call gzerror with file, since its structures have been deallocated. - gzclose must not be called more than once on the same file, just as free - must not be called more than once on the same allocation. - - gzclose will return Z_STREAM_ERROR if file is not valid, Z_ERRNO on a - file operation error, Z_MEM_ERROR if out of memory, Z_BUF_ERROR if the - last read ended in the middle of a gzip stream, or Z_OK on success. -*/ - -ZEXTERN int ZEXPORT gzclose_r OF((gzFile file)); -ZEXTERN int ZEXPORT gzclose_w OF((gzFile file)); -/* - Same as gzclose(), but gzclose_r() is only for use when reading, and - gzclose_w() is only for use when writing or appending. The advantage to - using these instead of gzclose() is that they avoid linking in zlib - compression or decompression code that is not used when only reading or only - writing respectively. If gzclose() is used, then both compression and - decompression code will be included the application when linking to a static - zlib library. -*/ - -ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum)); -/* - Returns the error message for the last error which occurred on the given - compressed file. errnum is set to zlib error number. If an error occurred - in the file system and not in the compression library, errnum is set to - Z_ERRNO and the application may consult errno to get the exact error code. - - The application must not modify the returned string. Future calls to - this function may invalidate the previously returned string. If file is - closed, then the string previously returned by gzerror will no longer be - available. - - gzerror() should be used to distinguish errors from end-of-file for those - functions above that do not distinguish those cases in their return values. -*/ - -ZEXTERN void ZEXPORT gzclearerr OF((gzFile file)); -/* - Clears the error and end-of-file flags for file. This is analogous to the - clearerr() function in stdio. This is useful for continuing to read a gzip - file that is being written concurrently. -*/ - -#endif /* !Z_SOLO */ - - /* checksum functions */ - -/* - These functions are not related to compression but are exported - anyway because they might be useful in applications using the compression - library. -*/ - -ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len)); -/* - Update a running Adler-32 checksum with the bytes buf[0..len-1] and - return the updated checksum. If buf is Z_NULL, this function returns the - required initial value for the checksum. - - An Adler-32 checksum is almost as reliable as a CRC32 but can be computed - much faster. - - Usage example: - - uLong adler = adler32(0L, Z_NULL, 0); - - while (read_buffer(buffer, length) != EOF) { - adler = adler32(adler, buffer, length); - } - if (adler != original_adler) error(); -*/ - -/* -ZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2, - z_off_t len2)); - - Combine two Adler-32 checksums into one. For two sequences of bytes, seq1 - and seq2 with lengths len1 and len2, Adler-32 checksums were calculated for - each, adler1 and adler2. adler32_combine() returns the Adler-32 checksum of - seq1 and seq2 concatenated, requiring only adler1, adler2, and len2. Note - that the z_off_t type (like off_t) is a signed integer. If len2 is - negative, the result has no meaning or utility. -*/ - -ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len)); -/* - Update a running CRC-32 with the bytes buf[0..len-1] and return the - updated CRC-32. If buf is Z_NULL, this function returns the required - initial value for the crc. Pre- and post-conditioning (one's complement) is - performed within this function so it shouldn't be done by the application. - - Usage example: - - uLong crc = crc32(0L, Z_NULL, 0); - - while (read_buffer(buffer, length) != EOF) { - crc = crc32(crc, buffer, length); - } - if (crc != original_crc) error(); -*/ - -/* -ZEXTERN uLong ZEXPORT crc32_combine OF((uLong crc1, uLong crc2, z_off_t len2)); - - Combine two CRC-32 check values into one. For two sequences of bytes, - seq1 and seq2 with lengths len1 and len2, CRC-32 check values were - calculated for each, crc1 and crc2. crc32_combine() returns the CRC-32 - check value of seq1 and seq2 concatenated, requiring only crc1, crc2, and - len2. -*/ - - - /* various hacks, don't look :) */ - -/* deflateInit and inflateInit are macros to allow checking the zlib version - * and the compiler's view of z_stream: - */ -ZEXTERN int ZEXPORT deflateInit_ OF((z_streamp strm, int level, - const char *version, int stream_size)); -ZEXTERN int ZEXPORT inflateInit_ OF((z_streamp strm, - const char *version, int stream_size)); -ZEXTERN int ZEXPORT deflateInit2_ OF((z_streamp strm, int level, int method, - int windowBits, int memLevel, - int strategy, const char *version, - int stream_size)); -ZEXTERN int ZEXPORT inflateInit2_ OF((z_streamp strm, int windowBits, - const char *version, int stream_size)); -ZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits, - unsigned char FAR *window, - const char *version, - int stream_size)); -#define deflateInit(strm, level) \ - deflateInit_((strm), (level), ZLIB_VERSION, (int)sizeof(z_stream)) -#define inflateInit(strm) \ - inflateInit_((strm), ZLIB_VERSION, (int)sizeof(z_stream)) -#define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \ - deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\ - (strategy), ZLIB_VERSION, (int)sizeof(z_stream)) -#define inflateInit2(strm, windowBits) \ - inflateInit2_((strm), (windowBits), ZLIB_VERSION, \ - (int)sizeof(z_stream)) -#define inflateBackInit(strm, windowBits, window) \ - inflateBackInit_((strm), (windowBits), (window), \ - ZLIB_VERSION, (int)sizeof(z_stream)) - -#ifndef Z_SOLO - -/* gzgetc() macro and its supporting function and exposed data structure. Note - * that the real internal state is much larger than the exposed structure. - * This abbreviated structure exposes just enough for the gzgetc() macro. The - * user should not mess with these exposed elements, since their names or - * behavior could change in the future, perhaps even capriciously. They can - * only be used by the gzgetc() macro. You have been warned. - */ -struct gzFile_s { - unsigned have; - unsigned char *next; - z_off64_t pos; -}; -ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */ -#ifdef Z_PREFIX_SET -# undef z_gzgetc -# define z_gzgetc(g) \ - ((g)->have ? ((g)->have--, (g)->pos++, *((g)->next)++) : gzgetc(g)) -#else -# define gzgetc(g) \ - ((g)->have ? ((g)->have--, (g)->pos++, *((g)->next)++) : gzgetc(g)) -#endif - -/* provide 64-bit offset functions if _LARGEFILE64_SOURCE defined, and/or - * change the regular functions to 64 bits if _FILE_OFFSET_BITS is 64 (if - * both are true, the application gets the *64 functions, and the regular - * functions are changed to 64 bits) -- in case these are set on systems - * without large file support, _LFS64_LARGEFILE must also be true - */ -#ifdef Z_LARGE64 - ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); - ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int)); - ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile)); - ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile)); - ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off64_t)); - ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off64_t)); -#endif - -#if !defined(ZLIB_INTERNAL) && defined(Z_WANT64) -# ifdef Z_PREFIX_SET -# define z_gzopen z_gzopen64 -# define z_gzseek z_gzseek64 -# define z_gztell z_gztell64 -# define z_gzoffset z_gzoffset64 -# define z_adler32_combine z_adler32_combine64 -# define z_crc32_combine z_crc32_combine64 -# else -# define gzopen gzopen64 -# define gzseek gzseek64 -# define gztell gztell64 -# define gzoffset gzoffset64 -# define adler32_combine adler32_combine64 -# define crc32_combine crc32_combine64 -# endif -# ifndef Z_LARGE64 - ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); - ZEXTERN z_off_t ZEXPORT gzseek64 OF((gzFile, z_off_t, int)); - ZEXTERN z_off_t ZEXPORT gztell64 OF((gzFile)); - ZEXTERN z_off_t ZEXPORT gzoffset64 OF((gzFile)); - ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t)); - ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t)); -# endif -#else - ZEXTERN gzFile ZEXPORT gzopen OF((const char *, const char *)); - ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile, z_off_t, int)); - ZEXTERN z_off_t ZEXPORT gztell OF((gzFile)); - ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile)); - ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t)); - ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t)); -#endif - -#else /* Z_SOLO */ - - ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t)); - ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t)); - -#endif /* !Z_SOLO */ - -/* hack for buggy compilers */ -#if !defined(ZUTIL_H) && !defined(NO_DUMMY_DECL) - struct internal_state {int dummy;}; -#endif - -/* undocumented functions */ -ZEXTERN const char * ZEXPORT zError OF((int)); -ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp)); -ZEXTERN const z_crc_t FAR * ZEXPORT get_crc_table OF((void)); -ZEXTERN int ZEXPORT inflateUndermine OF((z_streamp, int)); -ZEXTERN int ZEXPORT inflateResetKeep OF((z_streamp)); -ZEXTERN int ZEXPORT deflateResetKeep OF((z_streamp)); -#if defined(_WIN32) && !defined(Z_SOLO) -ZEXTERN gzFile ZEXPORT gzopen_w OF((const wchar_t *path, - const char *mode)); -#endif -#if defined(STDC) || defined(Z_HAVE_STDARG_H) -# ifndef Z_SOLO -ZEXTERN int ZEXPORTVA gzvprintf Z_ARG((gzFile file, - const char *format, - va_list va)); -# endif -#endif - -#ifdef __cplusplus -} -#endif - -#endif /* ZLIB_H */ diff --git a/vendor/libgit2/deps/zlib/zutil.c b/vendor/libgit2/deps/zlib/zutil.c deleted file mode 100644 index 2fe2a71407..0000000000 --- a/vendor/libgit2/deps/zlib/zutil.c +++ /dev/null @@ -1,321 +0,0 @@ -/* zutil.c -- target dependent utility functions for the compression library - * Copyright (C) 1995-2005, 2010, 2011, 2012 Jean-loup Gailly. - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* @(#) $Id$ */ - -#include "zutil.h" - -#ifndef NO_DUMMY_DECL -struct internal_state {int dummy;}; /* for buggy compilers */ -#endif - -z_const char * const z_errmsg[10] = { -"need dictionary", /* Z_NEED_DICT 2 */ -"stream end", /* Z_STREAM_END 1 */ -"", /* Z_OK 0 */ -"file error", /* Z_ERRNO (-1) */ -"stream error", /* Z_STREAM_ERROR (-2) */ -"data error", /* Z_DATA_ERROR (-3) */ -"insufficient memory", /* Z_MEM_ERROR (-4) */ -"buffer error", /* Z_BUF_ERROR (-5) */ -"incompatible version",/* Z_VERSION_ERROR (-6) */ -""}; - - -const char * ZEXPORT zlibVersion() -{ - return ZLIB_VERSION; -} - -uLong ZEXPORT zlibCompileFlags() -{ - uLong flags; - - flags = 0; - switch ((int)(sizeof(uInt))) { - case 2: break; - case 4: flags += 1; break; - case 8: flags += 2; break; - default: flags += 3; - } - switch ((int)(sizeof(uLong))) { - case 2: break; - case 4: flags += 1 << 2; break; - case 8: flags += 2 << 2; break; - default: flags += 3 << 2; - } - switch ((int)(sizeof(voidpf))) { - case 2: break; - case 4: flags += 1 << 4; break; - case 8: flags += 2 << 4; break; - default: flags += 3 << 4; - } - switch ((int)(sizeof(z_off_t))) { - case 2: break; - case 4: flags += 1 << 6; break; - case 8: flags += 2 << 6; break; - default: flags += 3 << 6; - } -#ifdef DEBUG - flags += 1 << 8; -#endif -#if defined(ASMV) || defined(ASMINF) - flags += 1 << 9; -#endif -#ifdef ZLIB_WINAPI - flags += 1 << 10; -#endif -#ifdef BUILDFIXED - flags += 1 << 12; -#endif -#ifdef DYNAMIC_CRC_TABLE - flags += 1 << 13; -#endif -#ifdef NO_GZCOMPRESS - flags += 1L << 16; -#endif -#ifdef NO_GZIP - flags += 1L << 17; -#endif -#ifdef PKZIP_BUG_WORKAROUND - flags += 1L << 20; -#endif -#ifdef FASTEST - flags += 1L << 21; -#endif -#if defined(STDC) || defined(Z_HAVE_STDARG_H) -# ifdef NO_vsnprintf - flags += 1L << 25; -# ifdef HAS_vsprintf_void - flags += 1L << 26; -# endif -# else -# ifdef HAS_vsnprintf_void - flags += 1L << 26; -# endif -# endif -#else - flags += 1L << 24; -# ifdef NO_snprintf - flags += 1L << 25; -# ifdef HAS_sprintf_void - flags += 1L << 26; -# endif -# else -# ifdef HAS_snprintf_void - flags += 1L << 26; -# endif -# endif -#endif - return flags; -} - -#ifdef DEBUG - -# ifndef verbose -# define verbose 0 -# endif -int ZLIB_INTERNAL z_verbose = verbose; - -void ZLIB_INTERNAL z_error (m) - char *m; -{ - fprintf(stderr, "%s\n", m); - exit(1); -} -#endif - -/* exported to allow conversion of error code to string for compress() and - * uncompress() - */ -const char * ZEXPORT zError(err) - int err; -{ - return ERR_MSG(err); -} - -#if defined(_WIN32_WCE) - /* The Microsoft C Run-Time Library for Windows CE doesn't have - * errno. We define it as a global variable to simplify porting. - * Its value is always 0 and should not be used. - */ - int errno = 0; -#endif - -#ifndef HAVE_MEMCPY - -void ZLIB_INTERNAL zmemcpy(dest, source, len) - Bytef* dest; - const Bytef* source; - uInt len; -{ - if (len == 0) return; - do { - *dest++ = *source++; /* ??? to be unrolled */ - } while (--len != 0); -} - -int ZLIB_INTERNAL zmemcmp(s1, s2, len) - const Bytef* s1; - const Bytef* s2; - uInt len; -{ - uInt j; - - for (j = 0; j < len; j++) { - if (s1[j] != s2[j]) return 2*(s1[j] > s2[j])-1; - } - return 0; -} - -void ZLIB_INTERNAL zmemzero(dest, len) - Bytef* dest; - uInt len; -{ - if (len == 0) return; - do { - *dest++ = 0; /* ??? to be unrolled */ - } while (--len != 0); -} -#endif - -#ifndef Z_SOLO - -#ifdef SYS16BIT - -#ifdef __TURBOC__ -/* Turbo C in 16-bit mode */ - -# define MY_ZCALLOC - -/* Turbo C malloc() does not allow dynamic allocation of 64K bytes - * and farmalloc(64K) returns a pointer with an offset of 8, so we - * must fix the pointer. Warning: the pointer must be put back to its - * original form in order to free it, use zcfree(). - */ - -#define MAX_PTR 10 -/* 10*64K = 640K */ - -local int next_ptr = 0; - -typedef struct ptr_table_s { - voidpf org_ptr; - voidpf new_ptr; -} ptr_table; - -local ptr_table table[MAX_PTR]; -/* This table is used to remember the original form of pointers - * to large buffers (64K). Such pointers are normalized with a zero offset. - * Since MSDOS is not a preemptive multitasking OS, this table is not - * protected from concurrent access. This hack doesn't work anyway on - * a protected system like OS/2. Use Microsoft C instead. - */ - -voidpf ZLIB_INTERNAL zcalloc (voidpf opaque, unsigned items, unsigned size) -{ - voidpf buf = opaque; /* just to make some compilers happy */ - ulg bsize = (ulg)items*size; - - /* If we allocate less than 65520 bytes, we assume that farmalloc - * will return a usable pointer which doesn't have to be normalized. - */ - if (bsize < 65520L) { - buf = farmalloc(bsize); - if (*(ush*)&buf != 0) return buf; - } else { - buf = farmalloc(bsize + 16L); - } - if (buf == NULL || next_ptr >= MAX_PTR) return NULL; - table[next_ptr].org_ptr = buf; - - /* Normalize the pointer to seg:0 */ - *((ush*)&buf+1) += ((ush)((uch*)buf-0) + 15) >> 4; - *(ush*)&buf = 0; - table[next_ptr++].new_ptr = buf; - return buf; -} - -void ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr) -{ - int n; - if (*(ush*)&ptr != 0) { /* object < 64K */ - farfree(ptr); - return; - } - /* Find the original pointer */ - for (n = 0; n < next_ptr; n++) { - if (ptr != table[n].new_ptr) continue; - - farfree(table[n].org_ptr); - while (++n < next_ptr) { - table[n-1] = table[n]; - } - next_ptr--; - return; - } - ptr = opaque; /* just to make some compilers happy */ - Assert(0, "zcfree: ptr not found"); -} - -#endif /* __TURBOC__ */ - - -#ifdef M_I86 -/* Microsoft C in 16-bit mode */ - -# define MY_ZCALLOC - -#if (!defined(_MSC_VER) || (_MSC_VER <= 600)) -# define _halloc halloc -# define _hfree hfree -#endif - -voidpf ZLIB_INTERNAL zcalloc (voidpf opaque, uInt items, uInt size) -{ - if (opaque) opaque = 0; /* to make compiler happy */ - return _halloc((long)items, size); -} - -void ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr) -{ - if (opaque) opaque = 0; /* to make compiler happy */ - _hfree(ptr); -} - -#endif /* M_I86 */ - -#endif /* SYS16BIT */ - - -#ifndef MY_ZCALLOC /* Any system without a special alloc function */ - -#ifndef STDC -extern voidp malloc OF((uInt size)); -extern voidp calloc OF((uInt items, uInt size)); -extern void free OF((voidpf ptr)); -#endif - -voidpf ZLIB_INTERNAL zcalloc (opaque, items, size) - voidpf opaque; - unsigned items; - unsigned size; -{ - if (opaque) items += size - size; /* make compiler happy */ - return sizeof(uInt) > 2 ? (voidpf)malloc(items * size) : - (voidpf)calloc(items, size); -} - -void ZLIB_INTERNAL zcfree (opaque, ptr) - voidpf opaque; - voidpf ptr; -{ - free(ptr); - if (opaque) return; /* make compiler happy */ -} - -#endif /* MY_ZCALLOC */ - -#endif /* !Z_SOLO */ diff --git a/vendor/libgit2/deps/zlib/zutil.h b/vendor/libgit2/deps/zlib/zutil.h deleted file mode 100644 index 24ab06b1cf..0000000000 --- a/vendor/libgit2/deps/zlib/zutil.h +++ /dev/null @@ -1,253 +0,0 @@ -/* zutil.h -- internal interface and configuration of the compression library - * Copyright (C) 1995-2013 Jean-loup Gailly. - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* WARNING: this file should *not* be used by applications. It is - part of the implementation of the compression library and is - subject to change. Applications should only use zlib.h. - */ - -/* @(#) $Id$ */ - -#ifndef ZUTIL_H -#define ZUTIL_H - -#ifdef HAVE_HIDDEN -# define ZLIB_INTERNAL __attribute__((visibility ("hidden"))) -#else -# define ZLIB_INTERNAL -#endif - -#include "zlib.h" - -#if defined(STDC) && !defined(Z_SOLO) -# if !(defined(_WIN32_WCE) && defined(_MSC_VER)) -# include -# endif -# include -# include -#endif - -#ifdef Z_SOLO - typedef long ptrdiff_t; /* guess -- will be caught if guess is wrong */ -#endif - -#ifndef local -# define local static -#endif -/* compile with -Dlocal if your debugger can't find static symbols */ - -typedef unsigned char uch; -typedef uch FAR uchf; -typedef unsigned short ush; -typedef ush FAR ushf; -typedef unsigned long ulg; - -extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ -/* (size given to avoid silly warnings with Visual C++) */ - -#define ERR_MSG(err) z_errmsg[Z_NEED_DICT-(err)] - -#define ERR_RETURN(strm,err) \ - return (strm->msg = ERR_MSG(err), (err)) -/* To be used only when the state is known to be valid */ - - /* common constants */ - -#ifndef DEF_WBITS -# define DEF_WBITS MAX_WBITS -#endif -/* default windowBits for decompression. MAX_WBITS is for compression only */ - -#if MAX_MEM_LEVEL >= 8 -# define DEF_MEM_LEVEL 8 -#else -# define DEF_MEM_LEVEL MAX_MEM_LEVEL -#endif -/* default memLevel */ - -#define STORED_BLOCK 0 -#define STATIC_TREES 1 -#define DYN_TREES 2 -/* The three kinds of block type */ - -#define MIN_MATCH 3 -#define MAX_MATCH 258 -/* The minimum and maximum match lengths */ - -#define PRESET_DICT 0x20 /* preset dictionary flag in zlib header */ - - /* target dependencies */ - -#if defined(MSDOS) || (defined(WINDOWS) && !defined(WIN32)) -# define OS_CODE 0x00 -# ifndef Z_SOLO -# if defined(__TURBOC__) || defined(__BORLANDC__) -# if (__STDC__ == 1) && (defined(__LARGE__) || defined(__COMPACT__)) - /* Allow compilation with ANSI keywords only enabled */ - void _Cdecl farfree( void *block ); - void *_Cdecl farmalloc( unsigned long nbytes ); -# else -# include -# endif -# else /* MSC or DJGPP */ -# include -# endif -# endif -#endif - -#ifdef AMIGA -# define OS_CODE 0x01 -#endif - -#if defined(VAXC) || defined(VMS) -# define OS_CODE 0x02 -# define F_OPEN(name, mode) \ - fopen((name), (mode), "mbc=60", "ctx=stm", "rfm=fix", "mrs=512") -#endif - -#if defined(ATARI) || defined(atarist) -# define OS_CODE 0x05 -#endif - -#ifdef OS2 -# define OS_CODE 0x06 -# if defined(M_I86) && !defined(Z_SOLO) -# include -# endif -#endif - -#if defined(MACOS) || defined(TARGET_OS_MAC) -# define OS_CODE 0x07 -# ifndef Z_SOLO -# if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os -# include /* for fdopen */ -# else -# ifndef fdopen -# define fdopen(fd,mode) NULL /* No fdopen() */ -# endif -# endif -# endif -#endif - -#ifdef TOPS20 -# define OS_CODE 0x0a -#endif - -#ifdef WIN32 -# ifndef __CYGWIN__ /* Cygwin is Unix, not Win32 */ -# define OS_CODE 0x0b -# endif -#endif - -#ifdef __50SERIES /* Prime/PRIMOS */ -# define OS_CODE 0x0f -#endif - -#if defined(_BEOS_) || defined(RISCOS) -# define fdopen(fd,mode) NULL /* No fdopen() */ -#endif - -#if (defined(_MSC_VER) && (_MSC_VER > 600)) && !defined __INTERIX -# if defined(_WIN32_WCE) -# define fdopen(fd,mode) NULL /* No fdopen() */ -# ifndef _PTRDIFF_T_DEFINED - typedef int ptrdiff_t; -# define _PTRDIFF_T_DEFINED -# endif -# else -# define fdopen(fd,type) _fdopen(fd,type) -# endif -#endif - -#if defined(__BORLANDC__) && !defined(MSDOS) - #pragma warn -8004 - #pragma warn -8008 - #pragma warn -8066 -#endif - -/* provide prototypes for these when building zlib without LFS */ -#if !defined(_WIN32) && \ - (!defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0) - ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t)); - ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t)); -#endif - - /* common defaults */ - -#ifndef OS_CODE -# define OS_CODE 0x03 /* assume Unix */ -#endif - -#ifndef F_OPEN -# define F_OPEN(name, mode) fopen((name), (mode)) -#endif - - /* functions */ - -#if defined(pyr) || defined(Z_SOLO) -# define NO_MEMCPY -#endif -#if defined(SMALL_MEDIUM) && !defined(_MSC_VER) && !defined(__SC__) - /* Use our own functions for small and medium model with MSC <= 5.0. - * You may have to use the same strategy for Borland C (untested). - * The __SC__ check is for Symantec. - */ -# define NO_MEMCPY -#endif -#if defined(STDC) && !defined(HAVE_MEMCPY) && !defined(NO_MEMCPY) -# define HAVE_MEMCPY -#endif -#ifdef HAVE_MEMCPY -# ifdef SMALL_MEDIUM /* MSDOS small or medium model */ -# define zmemcpy _fmemcpy -# define zmemcmp _fmemcmp -# define zmemzero(dest, len) _fmemset(dest, 0, len) -# else -# define zmemcpy memcpy -# define zmemcmp memcmp -# define zmemzero(dest, len) memset(dest, 0, len) -# endif -#else - void ZLIB_INTERNAL zmemcpy OF((Bytef* dest, const Bytef* source, uInt len)); - int ZLIB_INTERNAL zmemcmp OF((const Bytef* s1, const Bytef* s2, uInt len)); - void ZLIB_INTERNAL zmemzero OF((Bytef* dest, uInt len)); -#endif - -/* Diagnostic functions */ -#ifdef DEBUG -# include - extern int ZLIB_INTERNAL z_verbose; - extern void ZLIB_INTERNAL z_error OF((char *m)); -# define Assert(cond,msg) {if(!(cond)) z_error(msg);} -# define Trace(x) {if (z_verbose>=0) fprintf x ;} -# define Tracev(x) {if (z_verbose>0) fprintf x ;} -# define Tracevv(x) {if (z_verbose>1) fprintf x ;} -# define Tracec(c,x) {if (z_verbose>0 && (c)) fprintf x ;} -# define Tracecv(c,x) {if (z_verbose>1 && (c)) fprintf x ;} -#else -# define Assert(cond,msg) -# define Trace(x) -# define Tracev(x) -# define Tracevv(x) -# define Tracec(c,x) -# define Tracecv(c,x) -#endif - -#ifndef Z_SOLO - voidpf ZLIB_INTERNAL zcalloc OF((voidpf opaque, unsigned items, - unsigned size)); - void ZLIB_INTERNAL zcfree OF((voidpf opaque, voidpf ptr)); -#endif - -#define ZALLOC(strm, items, size) \ - (*((strm)->zalloc))((strm)->opaque, (items), (size)) -#define ZFREE(strm, addr) (*((strm)->zfree))((strm)->opaque, (voidpf)(addr)) -#define TRY_FREE(s, p) {if (p) ZFREE(s, p);} - -/* Reverse the bytes in a 32-bit value */ -#define ZSWAP32(q) ((((q) >> 24) & 0xff) + (((q) >> 8) & 0xff00) + \ - (((q) & 0xff00) << 8) + (((q) & 0xff) << 24)) - -#endif /* ZUTIL_H */ diff --git a/vendor/libgit2/docs/checkout-internals.md b/vendor/libgit2/docs/checkout-internals.md deleted file mode 100644 index 6147ffdd8a..0000000000 --- a/vendor/libgit2/docs/checkout-internals.md +++ /dev/null @@ -1,204 +0,0 @@ -Checkout Internals -================== - -Checkout has to handle a lot of different cases. It examines the -differences between the target tree, the baseline tree and the working -directory, plus the contents of the index, and groups files into five -categories: - -1. UNMODIFIED - Files that match in all places. -2. SAFE - Files where the working directory and the baseline content - match that can be safely updated to the target. -3. DIRTY/MISSING - Files where the working directory differs from the - baseline but there is no conflicting change with the target. One - example is a file that doesn't exist in the working directory - no - data would be lost as a result of writing this file. Which action - will be taken with these files depends on the options you use. -4. CONFLICTS - Files where changes in the working directory conflict - with changes to be applied by the target. If conflicts are found, - they prevent any other modifications from being made (although there - are options to override that and force the update, of course). -5. UNTRACKED/IGNORED - Files in the working directory that are untracked - or ignored (i.e. only in the working directory, not the other places). - -Right now, this classification is done via 3 iterators (for the three -trees), with a final lookup in the index. At some point, this may move to -a 4 iterator version to incorporate the index better. - -The actual checkout is done in five phases (at least right now). - -1. The diff between the baseline and the target tree is used as a base - list of possible updates to be applied. -2. Iterate through the diff and the working directory, building a list of - actions to be taken (and sending notifications about conflicts and - dirty files). -3. Remove any files / directories as needed (because alphabetical - iteration means that an untracked directory will end up sorted *after* - a blob that should be checked out with the same name). -4. Update all blobs. -5. Update all submodules (after 4 in case a new .gitmodules blob was - checked out) - -Checkout could be driven either off a target-to-workdir diff or a -baseline-to-target diff. There are pros and cons of each. - -Target-to-workdir means the diff includes every file that could be -modified, which simplifies bookkeeping, but the code to constantly refer -back to the baseline gets complicated. - -Baseline-to-target has simpler code because the diff defines the action to -take, but needs special handling for untracked and ignored files, if they -need to be removed. - -The current checkout implementation is based on a baseline-to-target diff. - - -Picking Actions -=============== - -The most interesting aspect of this is phase 2, picking the actions that -should be taken. There are a lot of corner cases, so it may be easier to -start by looking at the rules for a simple 2-iterator diff: - -Key ---- -- B1,B2,B3 - blobs with different SHAs, -- Bi - ignored blob (WD only) -- T1,T2,T3 - trees with different SHAs, -- Ti - ignored tree (WD only) -- x - nothing - -Diff with 2 non-workdir iterators ---------------------------------- - -| | Old | New | | -|----|-----|-----|------------------------------------------------------------| -| 0 | x | x | nothing | -| 1 | x | B1 | added blob | -| 2 | x | T1 | added tree | -| 3 | B1 | x | removed blob | -| 4 | B1 | B1 | unmodified blob | -| 5 | B1 | B2 | modified blob | -| 6 | B1 | T1 | typechange blob -> tree | -| 7 | T1 | x | removed tree | -| 8 | T1 | B1 | typechange tree -> blob | -| 9 | T1 | T1 | unmodified tree | -| 10 | T1 | T2 | modified tree (implies modified/added/removed blob inside) | - - -Now, let's make the "New" iterator into a working directory iterator, so -we replace "added" items with either untracked or ignored, like this: - -Diff with non-work & workdir iterators --------------------------------------- - -| | Old | New | | -|----|-----|-----|------------------------------------------------------------| -| 0 | x | x | nothing | -| 1 | x | B1 | untracked blob | -| 2 | x | Bi | ignored file | -| 3 | x | T1 | untracked tree | -| 4 | x | Ti | ignored tree | -| 5 | B1 | x | removed blob | -| 6 | B1 | B1 | unmodified blob | -| 7 | B1 | B2 | modified blob | -| 8 | B1 | T1 | typechange blob -> tree | -| 9 | B1 | Ti | removed blob AND ignored tree as separate items | -| 10 | T1 | x | removed tree | -| 11 | T1 | B1 | typechange tree -> blob | -| 12 | T1 | Bi | removed tree AND ignored blob as separate items | -| 13 | T1 | T1 | unmodified tree | -| 14 | T1 | T2 | modified tree (implies modified/added/removed blob inside) | - -Note: if there is a corresponding entry in the old tree, then a working -directory item won't be ignored (i.e. no Bi or Ti for tracked items). - - -Now, expand this to three iterators: a baseline tree, a target tree, and -an actual working directory tree: - -Checkout From 3 Iterators (2 not workdir, 1 workdir) ----------------------------------------------------- - -(base == old HEAD; target == what to checkout; actual == working dir) - -| |base | target | actual/workdir | | -|-----|-----|------- |----------------|--------------------------------------------------------------------| -| 0 | x | x | x | nothing | -| 1 | x | x | B1/Bi/T1/Ti | untracked/ignored blob/tree (SAFE) | -| 2+ | x | B1 | x | add blob (SAFE) | -| 3 | x | B1 | B1 | independently added blob (FORCEABLE-2) | -| 4* | x | B1 | B2/Bi/T1/Ti | add blob with content conflict (FORCEABLE-2) | -| 5+ | x | T1 | x | add tree (SAFE) | -| 6* | x | T1 | B1/Bi | add tree with blob conflict (FORCEABLE-2) | -| 7 | x | T1 | T1/i | independently added tree (SAFE+MISSING) | -| 8 | B1 | x | x | independently deleted blob (SAFE+MISSING) | -| 9- | B1 | x | B1 | delete blob (SAFE) | -| 10- | B1 | x | B2 | delete of modified blob (FORCEABLE-1) | -| 11 | B1 | x | T1/Ti | independently deleted blob AND untrack/ign tree (SAFE+MISSING !!!) | -| 12 | B1 | B1 | x | locally deleted blob (DIRTY || SAFE+CREATE) | -| 13+ | B1 | B2 | x | update to deleted blob (SAFE+MISSING) | -| 14 | B1 | B1 | B1 | unmodified file (SAFE) | -| 15 | B1 | B1 | B2 | locally modified file (DIRTY) | -| 16+ | B1 | B2 | B1 | update unmodified blob (SAFE) | -| 17 | B1 | B2 | B2 | independently updated blob (FORCEABLE-1) | -| 18+ | B1 | B2 | B3 | update to modified blob (FORCEABLE-1) | -| 19 | B1 | B1 | T1/Ti | locally deleted blob AND untrack/ign tree (DIRTY) | -| 20* | B1 | B2 | T1/Ti | update to deleted blob AND untrack/ign tree (F-1) | -| 21+ | B1 | T1 | x | add tree with locally deleted blob (SAFE+MISSING) | -| 22* | B1 | T1 | B1 | add tree AND deleted blob (SAFE) | -| 23* | B1 | T1 | B2 | add tree with delete of modified blob (F-1) | -| 24 | B1 | T1 | T1 | add tree with deleted blob (F-1) | -| 25 | T1 | x | x | independently deleted tree (SAFE+MISSING) | -| 26 | T1 | x | B1/Bi | independently deleted tree AND untrack/ign blob (F-1) | -| 27- | T1 | x | T1 | deleted tree (MAYBE SAFE) | -| 28+ | T1 | B1 | x | deleted tree AND added blob (SAFE+MISSING) | -| 29 | T1 | B1 | B1 | independently typechanged tree -> blob (F-1) | -| 30+ | T1 | B1 | B2 | typechange tree->blob with conflicting blob (F-1) | -| 31* | T1 | B1 | T1/T2 | typechange tree->blob (MAYBE SAFE) | -| 32+ | T1 | T1 | x | restore locally deleted tree (SAFE+MISSING) | -| 33 | T1 | T1 | B1/Bi | locally typechange tree->untrack/ign blob (DIRTY) | -| 34 | T1 | T1 | T1/T2 | unmodified tree (MAYBE SAFE) | -| 35+ | T1 | T2 | x | update locally deleted tree (SAFE+MISSING) | -| 36* | T1 | T2 | B1/Bi | update to tree with typechanged tree->blob conflict (F-1) | -| 37 | T1 | T2 | T1/T2/T3 | update to existing tree (MAYBE SAFE) | - - -The number is followed by ' ' if no change is needed or '+' if the case -needs to write to disk or '-' if something must be deleted and '*' if -there should be a delete followed by an write. - -There are four tiers of safe cases: - -* SAFE == completely safe to update -* SAFE+MISSING == safe except the workdir is missing the expect content -* MAYBE SAFE == safe if workdir tree matches (or is missing) baseline - content, which is unknown at this point -* FORCEABLE == conflict unless FORCE is given -* DIRTY == no conflict but change is not applied unless FORCE - -Some slightly unusual circumstances: - -* 8 - parent dir is only deleted when file is, so parent will be left if - empty even though it would be deleted if the file were present -* 11 - core git does not consider this a conflict but attempts to delete T1 - and gives "unable to unlink file" error yet does not skip the rest - of the operation -* 12 - without FORCE file is left deleted (i.e. not restored) so new wd is - dirty (and warning message "D file" is printed), with FORCE, file is - restored. -* 24 - This should be considered MAYBE SAFE since effectively it is 7 and 8 - combined, but core git considers this a conflict unless forced. -* 26 - This combines two cases (1 & 25) (and also implied 8 for tree content) - which are ok on their own, but core git treat this as a conflict. - If not forced, this is a conflict. If forced, this actually doesn't - have to write anything and leaves the new blob as an untracked file. -* 32 - This is the only case where the baseline and target values match - and yet we will still write to the working directory. In all other - cases, if baseline == target, we don't touch the workdir (it is - either already right or is "dirty"). However, since this case also - implies that a ?/B1/x case will exist as well, it can be skipped. - -Cases 3, 17, 24, 26, and 29 are all considered conflicts even though -none of them will require making any updates to the working directory. - diff --git a/vendor/libgit2/docs/diff-internals.md b/vendor/libgit2/docs/diff-internals.md deleted file mode 100644 index da4c5a17c5..0000000000 --- a/vendor/libgit2/docs/diff-internals.md +++ /dev/null @@ -1,92 +0,0 @@ -Diff is broken into four phases: - -1. Building a list of things that have changed. These changes are called - deltas (git_diff_delta objects) and are grouped into a git_diff_list. -2. Applying file similarity measurement for rename and copy detection (and - to potentially split files that have changed radically). This step is - optional. -3. Computing the textual diff for each delta. Not all deltas have a - meaningful textual diff. For those that do, the textual diff can - either be generated on the fly and passed to output callbacks or can be - turned into a git_diff_patch object. -4. Formatting the diff and/or patch into standard text formats (such as - patches, raw lists, etc). - -In the source code, step 1 is implemented in `src/diff.c`, step 2 in -`src/diff_tform.c`, step 3 in `src/diff_patch.c`, and step 4 in -`src/diff_print.c`. Additionally, when it comes to accessing file -content, everything goes through diff drivers that are implemented in -`src/diff_driver.c`. - -External Objects ----------------- - -* `git_diff_options` represents user choices about how a diff should be - performed and is passed to most diff generating functions. -* `git_diff_file` represents an item on one side of a possible delta -* `git_diff_delta` represents a pair of items that have changed in some - way - it contains two `git_diff_file` plus a status and other stuff. -* `git_diff_list` is a list of deltas along with information about how - those particular deltas were found. -* `git_diff_patch` represents the actual diff between a pair of items. In - some cases, a delta may not have a corresponding patch, if the objects - are binary, for example. The content of a patch will be a set of hunks - and lines. -* A `hunk` is range of lines described by a `git_diff_range` (i.e. "lines - 10-20 in the old file became lines 12-23 in the new"). It will have a - header that compactly represents that information, and it will have a - number of lines of context surrounding added and deleted lines. -* A `line` is simple a line of data along with a `git_diff_line_t` value - that tells how the data should be interpreted (e.g. context or added). - -Internal Objects ----------------- - -* `git_diff_file_content` is an internal structure that represents the - data on one side of an item to be diffed; it is an augmented - `git_diff_file` with more flags and the actual file data. - - * it is created from a repository plus a) a git_diff_file, b) a git_blob, - or c) raw data and size - * there are three main operations on git_diff_file_content: - - * _initialization_ sets up the data structure and does what it can up to, - but not including loading and looking at the actual data - * _loading_ loads the data, preprocesses it (i.e. applies filters) and - potentially analyzes it (to decide if binary) - * _free_ releases loaded data and frees any allocated memory - -* The internal structure of a `git_diff_patch` stores the actual diff - between a pair of `git_diff_file_content` items - - * it may be "unset" if the items are not diffable - * "empty" if the items are the same - * otherwise it will consist of a set of hunks each of which covers some - number of lines of context, additions and deletions - * a patch is created from two git_diff_file_content items - * a patch is fully instantiated in three phases: - - * initial creation and initialization - * loading of data and preliminary data examination - * diffing of data and optional storage of diffs - * (TBD) if a patch is asked to store the diffs and the size of the diff - is significantly smaller than the raw data of the two sides, then the - patch may be flattened using a pool of string data - -* `git_diff_output` is an internal structure that represents an output - target for a `git_diff_patch` - * It consists of file, hunk, and line callbacks, plus a payload - * There is a standard flattened output that can be used for plain text output - * Typically we use a `git_xdiff_output` which drives the callbacks via the - xdiff code taken from core Git. - -* `git_diff_driver` is an internal structure that encapsulates the logic - for a given type of file - * a driver is looked up based on the name and mode of a file. - * the driver can then be used to: - * determine if a file is binary (by attributes, by git_diff_options - settings, or by examining the content) - * give you a function pointer that is used to evaluate function context - for hunk headers - * At some point, the logic for getting a filtered version of file content - or calculating the OID of a file may be moved into the driver. diff --git a/vendor/libgit2/docs/error-handling.md b/vendor/libgit2/docs/error-handling.md deleted file mode 100644 index 2dbe64a715..0000000000 --- a/vendor/libgit2/docs/error-handling.md +++ /dev/null @@ -1,270 +0,0 @@ -Error reporting in libgit2 -========================== - -Libgit2 tries to follow the POSIX style: functions return an `int` value -with 0 (zero) indicating success and negative values indicating an error. -There are specific negative error codes for each "expected failure" -(e.g. `GIT_ENOTFOUND` for files that take a path which might be missing) -and a generic error code (-1) for all critical or non-specific failures -(e.g. running out of memory or system corruption). - -When a negative value is returned, an error message is also set. The -message can be accessed via the `giterr_last` function which will return a -pointer to a `git_error` structure containing the error message text and -the class of error (i.e. what part of the library generated the error). - -For instance: An object lookup by SHA prefix (`git_object_lookup_prefix`) -has two expected failure cases: the SHA is not found at all which returns -`GIT_ENOTFOUND` or the SHA prefix is ambiguous (i.e. two or more objects -share the prefix) which returns `GIT_EAMBIGUOUS`. There are any number of -critical failures (such as a packfile being corrupted, a loose object -having the wrong access permissions, etc.) all of which will return -1. -When the object lookup is successful, it will return 0. - -If libgit2 was compiled with threads enabled (`-DTHREADSAFE=ON` when using -CMake), then the error message will be kept in thread-local storage, so it -will not be modified by other threads. If threads are not enabled, then -the error message is in global data. - -All of the error return codes, the `git_error` type, the error access -functions, and the error classes are defined in `include/git2/errors.h`. -See the documentation there for details on the APIs for accessing, -clearing, and even setting error codes. - -When writing libgit2 code, please be smart and conservative when returning -error codes. Functions usually have a maximum of two or three "expected -errors" and in most cases only one. If you feel there are more possible -expected error scenarios, then the API you are writing may be at too high -a level for core libgit2. - -Example usage -------------- - -When using libgit2, you will typically capture the return value from -functions using an `int` variable and check to see if it is negative. -When that happens, you can, if you wish, look at the specific value or -look at the error message that was generated. - -~~~c -{ - git_repository *repo; - int error = git_repository_open(&repo, "path/to/repo"); - - if (error < 0) { - fprintf(stderr, "Could not open repository: %s\n", giterr_last()->message); - exit(1); - } - - ... use `repo` here ... - - git_repository_free(repo); /* void function - no error return code */ -} -~~~ - -Some of the error return values do have meaning. Optionally, you can look -at the specific error values to decide what to do. - -~~~c -{ - git_repository *repo; - const char *path = "path/to/repo"; - int error = git_repository_open(&repo, path); - - if (error < 0) { - if (error == GIT_ENOTFOUND) - fprintf(stderr, "Could not find repository at path '%s'\n", path); - else - fprintf(stderr, "Unable to open repository: %s\n", - giterr_last()->message); - exit(1); - } - - ... happy ... -} -~~~ - -Some of the higher-level language bindings may use a range of information -from libgit2 to convert error return codes into exceptions, including the -specific error return codes and even the class of error and the error -message returned by `giterr_last`, but the full range of that logic is -beyond the scope of this document. - -Example internal implementation -------------------------------- - -Internally, libgit2 detects error scenarios, records error messages, and -returns error values. Errors from low-level functions are generally -passed upwards (unless the higher level can either handle the error or -wants to translate the error into something more meaningful). - -~~~c -int git_repository_open(git_repository **repository, const char *path) -{ - /* perform some logic to open the repository */ - if (p_exists(path) < 0) { - giterr_set(GITERR_REPOSITORY, "The path '%s' doesn't exist", path); - return GIT_ENOTFOUND; - } - - ... -} -~~~ - -The public error API --------------------- - -- `const git_error *giterr_last(void)`: The main function used to look up - the last error. This may return NULL if no error has occurred. - Otherwise this should return a `git_error` object indicating the class - of error and the error message that was generated by the library. - - The last error is stored in thread-local storage when libgit2 is - compiled with thread support, so you do not have to worry about another - thread overwriting the value. When thread support is off, the last - error is a global value. - - _Note_ There are some known bugs in the library where this may return - NULL even when an error code was generated. Please report these as - bugs, but in the meantime, please code defensively and check for NULL - when calling this function. - -- `void geterr_clear(void)`: This function clears the last error. The - library will call this when an error is generated by low level function - and the higher level function handles the error. - - _Note_ There are some known bugs in the library where a low level - function's error message is not cleared by higher level code that - handles the error and returns zero. Please report these as bugs, but in - the meantime, a zero return value from a libgit2 API does not guarantee - that `giterr_last()` will return NULL. - -- `void giterr_set_str(int error_class, const char *message)`: This - function can be used when writing a custom backend module to set the - libgit2 error message. See the documentation on this function for its - use. Normal usage of libgit2 will probably never need to call this API. - -- `void giterr_set_oom(void)`: This is a standard function for reporting - an out-of-memory error. It is written in a manner that it doesn't have - to allocate any extra memory in order to record the error, so this is - the best way to report that scenario. - -Deviations from the standard ----------------------------- - -There are some public functions that do not return `int` values. There -are two primary cases: - -* `void` return values: If a function has a `void` return, then it will - never fail. This primary will be used for object destructors. - -* `git_xyz *` return values: These are simple accessor functions where the - only meaningful error would typically be looking something up by index - and having the index be out of bounds. In those cases, the function - will typically return NULL. - -* Boolean return values: There are some cases where a function cannot fail - and wants to return a boolean value. In those cases, we try to return 1 - for true and 0 for false. These cases are rare and the return value for - the function should probably be an `unsigned int` to denote these cases. - If you find an exception, please open an issue and let's fix it. - -There are a few other exceptions to these rules here and there in the -library, but those are extremely rare and should probably be converted -over to other to more standard patterns for usage. Feel free to open -issues pointing these out. - -There are some known bugs in the library where some functions may return a -negative value but not set an error message and some other functions may -return zero (no error) and yet leave an error message set. Please report -these cases as issues and they will be fixed. In the meanwhile, please -code defensively, checking that the return value of `giterr_last` is not -NULL before using it, and not relying on `giterr_last` to return NULL when -a function returns 0 for success. - -The internal error API ----------------------- - -- `void giterr_set(int error_class, const char *fmt, ...)`: This is the - main internal function for setting an error. It works like `printf` to - format the error message. See the notes of `giterr_set_str` for a - general description of how error messages are stored (and also about - special handling for `error_class` of `GITERR_OS`). - -Writing error messages ----------------------- - -Here are some guidelines when writing error messages: - -- Use proper English, and an impersonal or past tenses: *The given path - does not exist*, *Failed to lookup object in ODB* - -- Use short, direct and objective messages. **One line, max**. libgit2 is - a low level library: think that all the messages reported will be thrown - as Ruby or Python exceptions. Think how long are common exception - messages in those languages. - -- **Do not add redundant information to the error message**, specially - information that can be inferred from the context. - - E.g. in `git_repository_open`, do not report a message like "Failed to - open repository: path not found". Somebody is calling that - function. If it fails, they already know that the repository failed to - open! - -General guidelines for error reporting --------------------------------------- - -- Libgit2 does not handle programming errors with these - functions. Programming errors are `assert`ed, and when their source is - internal, fixed as soon as possible. This is C, people. - - Example of programming errors that would **not** be handled: passing - NULL to a function that expects a valid pointer; passing a `git_tree` - to a function that expects a `git_commit`. All these cases need to be - identified with `assert` and fixed asap. - - Example of a runtime error: failing to parse a `git_tree` because it - contains invalid data. Failing to open a file because it doesn't exist - on disk. These errors are handled, a meaningful error message is set, - and an error code is returned. - -- In general, *do not* try to overwrite errors internally and *do* - propagate error codes from lower level functions to the higher level. - There are some cases where propagating an error code will be more - confusing rather than less, so there are some exceptions to this rule, - but the default behavior should be to simply clean up and pass the error - on up to the caller. - - **WRONG** - - ~~~c - int git_commit_parent(...) - { - ... - - if (git_commit_lookup(parent, repo, parent_id) < 0) { - giterr_set(GITERR_COMMIT, "Overwrite lookup error message"); - return -1; /* mask error code */ - } - - ... - } - ~~~ - - **RIGHT** - - ~~~c - int git_commit_parent(...) - { - ... - - error = git_commit_lookup(parent, repo, parent_id); - if (error < 0) { - /* cleanup intermediate objects if necessary */ - /* leave error message and propagate error code */ - return error; - } - - ... - } - ~~~ diff --git a/vendor/libgit2/docs/merge-df_conflicts.txt b/vendor/libgit2/docs/merge-df_conflicts.txt deleted file mode 100644 index 09780ee2d2..0000000000 --- a/vendor/libgit2/docs/merge-df_conflicts.txt +++ /dev/null @@ -1,41 +0,0 @@ -Anc / Our / Thr represent the ancestor / ours / theirs side of a merge -from branch "branch" into HEAD. Workdir represents the expected files in -the working directory. Index represents the expected files in the index, -with stage markers. - - Anc Our Thr Workdir Index -1 D D - D/F D/F D/F [0] - -2 D D+ D~HEAD (mod/del) D/F [0] - D/F D/F D [1] - D [2] - -3 D D D/F D/F [0] - D/F - -4 D D+ D~branch (mod/del) D/F [0] - D/F D/F D [1] - D [3] - -5 D D/F (add/add) D/F [2] - D/F D/F [3] - D/F - -6 D/F D/F D D [0] - D - -7 D/F D/F+ D/F (mod/del) D/F [1] - D D~branch (fil/dir) D/F [2] - D [3] - -8 D/F D/F D D [0] - D - -9 D/F D/F+ D/F (mod/del) D/F [1] - D D~HEAD (fil/dir) D [2] - D/F [3] - -10 D/F D/F (fil/dir) D/F [0] - D D~HEAD D [2] - D diff --git a/vendor/libgit2/examples/.gitignore b/vendor/libgit2/examples/.gitignore deleted file mode 100644 index 0e491598aa..0000000000 --- a/vendor/libgit2/examples/.gitignore +++ /dev/null @@ -1,15 +0,0 @@ -general -showindex -diff -rev-list -blame -cat-file -init -log -rev-parse -remote -status -tag -for-each-ref -describe -*.dSYM diff --git a/vendor/libgit2/examples/CMakeLists.txt b/vendor/libgit2/examples/CMakeLists.txt deleted file mode 100644 index 596be45ed3..0000000000 --- a/vendor/libgit2/examples/CMakeLists.txt +++ /dev/null @@ -1,16 +0,0 @@ -FILE(GLOB_RECURSE SRC_EXAMPLE_GIT2 network/*.c network/*.h) -ADD_EXECUTABLE(cgit2 ${SRC_EXAMPLE_GIT2}) -IF(WIN32 OR ANDROID) - TARGET_LINK_LIBRARIES(cgit2 git2) -ELSE() - TARGET_LINK_LIBRARIES(cgit2 git2 pthread) -ENDIF() - -FILE(GLOB SRC_EXAMPLE_APPS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.c) -FOREACH(src_app ${SRC_EXAMPLE_APPS}) - STRING(REPLACE ".c" "" app_name ${src_app}) - IF(NOT ${app_name} STREQUAL "common") - ADD_EXECUTABLE(${app_name} ${src_app} "common.c") - TARGET_LINK_LIBRARIES(${app_name} git2) - ENDIF() -ENDFOREACH() diff --git a/vendor/libgit2/examples/COPYING b/vendor/libgit2/examples/COPYING deleted file mode 100644 index 0e259d42c9..0000000000 --- a/vendor/libgit2/examples/COPYING +++ /dev/null @@ -1,121 +0,0 @@ -Creative Commons Legal Code - -CC0 1.0 Universal - - CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE - LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN - ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS - INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES - REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS - PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM - THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED - HEREUNDER. - -Statement of Purpose - -The laws of most jurisdictions throughout the world automatically confer -exclusive Copyright and Related Rights (defined below) upon the creator -and subsequent owner(s) (each and all, an "owner") of an original work of -authorship and/or a database (each, a "Work"). - -Certain owners wish to permanently relinquish those rights to a Work for -the purpose of contributing to a commons of creative, cultural and -scientific works ("Commons") that the public can reliably and without fear -of later claims of infringement build upon, modify, incorporate in other -works, reuse and redistribute as freely as possible in any form whatsoever -and for any purposes, including without limitation commercial purposes. -These owners may contribute to the Commons to promote the ideal of a free -culture and the further production of creative, cultural and scientific -works, or to gain reputation or greater distribution for their Work in -part through the use and efforts of others. - -For these and/or other purposes and motivations, and without any -expectation of additional consideration or compensation, the person -associating CC0 with a Work (the "Affirmer"), to the extent that he or she -is an owner of Copyright and Related Rights in the Work, voluntarily -elects to apply CC0 to the Work and publicly distribute the Work under its -terms, with knowledge of his or her Copyright and Related Rights in the -Work and the meaning and intended legal effect of CC0 on those rights. - -1. Copyright and Related Rights. A Work made available under CC0 may be -protected by copyright and related or neighboring rights ("Copyright and -Related Rights"). Copyright and Related Rights include, but are not -limited to, the following: - - i. the right to reproduce, adapt, distribute, perform, display, - communicate, and translate a Work; - ii. moral rights retained by the original author(s) and/or performer(s); -iii. publicity and privacy rights pertaining to a person's image or - likeness depicted in a Work; - iv. rights protecting against unfair competition in regards to a Work, - subject to the limitations in paragraph 4(a), below; - v. rights protecting the extraction, dissemination, use and reuse of data - in a Work; - vi. database rights (such as those arising under Directive 96/9/EC of the - European Parliament and of the Council of 11 March 1996 on the legal - protection of databases, and under any national implementation - thereof, including any amended or successor version of such - directive); and -vii. other similar, equivalent or corresponding rights throughout the - world based on applicable law or treaty, and any national - implementations thereof. - -2. Waiver. To the greatest extent permitted by, but not in contravention -of, applicable law, Affirmer hereby overtly, fully, permanently, -irrevocably and unconditionally waives, abandons, and surrenders all of -Affirmer's Copyright and Related Rights and associated claims and causes -of action, whether now known or unknown (including existing as well as -future claims and causes of action), in the Work (i) in all territories -worldwide, (ii) for the maximum duration provided by applicable law or -treaty (including future time extensions), (iii) in any current or future -medium and for any number of copies, and (iv) for any purpose whatsoever, -including without limitation commercial, advertising or promotional -purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each -member of the public at large and to the detriment of Affirmer's heirs and -successors, fully intending that such Waiver shall not be subject to -revocation, rescission, cancellation, termination, or any other legal or -equitable action to disrupt the quiet enjoyment of the Work by the public -as contemplated by Affirmer's express Statement of Purpose. - -3. Public License Fallback. Should any part of the Waiver for any reason -be judged legally invalid or ineffective under applicable law, then the -Waiver shall be preserved to the maximum extent permitted taking into -account Affirmer's express Statement of Purpose. In addition, to the -extent the Waiver is so judged Affirmer hereby grants to each affected -person a royalty-free, non transferable, non sublicensable, non exclusive, -irrevocable and unconditional license to exercise Affirmer's Copyright and -Related Rights in the Work (i) in all territories worldwide, (ii) for the -maximum duration provided by applicable law or treaty (including future -time extensions), (iii) in any current or future medium and for any number -of copies, and (iv) for any purpose whatsoever, including without -limitation commercial, advertising or promotional purposes (the -"License"). The License shall be deemed effective as of the date CC0 was -applied by Affirmer to the Work. Should any part of the License for any -reason be judged legally invalid or ineffective under applicable law, such -partial invalidity or ineffectiveness shall not invalidate the remainder -of the License, and in such case Affirmer hereby affirms that he or she -will not (i) exercise any of his or her remaining Copyright and Related -Rights in the Work or (ii) assert any associated claims and causes of -action with respect to the Work, in either case contrary to Affirmer's -express Statement of Purpose. - -4. Limitations and Disclaimers. - - a. No trademark or patent rights held by Affirmer are waived, abandoned, - surrendered, licensed or otherwise affected by this document. - b. Affirmer offers the Work as-is and makes no representations or - warranties of any kind concerning the Work, express, implied, - statutory or otherwise, including without limitation warranties of - title, merchantability, fitness for a particular purpose, non - infringement, or the absence of latent or other defects, accuracy, or - the present or absence of errors, whether or not discoverable, all to - the greatest extent permissible under applicable law. - c. Affirmer disclaims responsibility for clearing rights of other persons - that may apply to the Work or any use thereof, including without - limitation any person's Copyright and Related Rights in the Work. - Further, Affirmer disclaims responsibility for obtaining any necessary - consents, permissions or other rights required for any use of the - Work. - d. Affirmer understands and acknowledges that Creative Commons is not a - party to this document and has no duty or obligation with respect to - this CC0 or use of the Work. diff --git a/vendor/libgit2/examples/Makefile b/vendor/libgit2/examples/Makefile deleted file mode 100644 index bd7e92dc97..0000000000 --- a/vendor/libgit2/examples/Makefile +++ /dev/null @@ -1,17 +0,0 @@ -.PHONY: all - -CC = gcc -CFLAGS = -g -I../include -I../src -Wall -Wextra -Wmissing-prototypes -Wno-missing-field-initializers -LFLAGS = -L../build -lgit2 -lz -APPS = general showindex diff rev-list cat-file status log rev-parse init blame tag remote -APPS += for-each-ref -APPS += describe - -all: $(APPS) - -% : %.c - $(CC) -o $@ common.c $(CFLAGS) $< $(LFLAGS) - -clean: - $(RM) $(APPS) - $(RM) -r *.dSYM diff --git a/vendor/libgit2/examples/README.md b/vendor/libgit2/examples/README.md deleted file mode 100644 index 769c4b2678..0000000000 --- a/vendor/libgit2/examples/README.md +++ /dev/null @@ -1,22 +0,0 @@ -libgit2 examples -================ - -These examples are a mixture of basic emulation of core Git command line -functions and simple snippets demonstrating libgit2 API usage (for use -with Docurium). As a whole, they are not vetted carefully for bugs, error -handling, and cross-platform compatibility in the same manner as the rest -of the code in libgit2, so copy with caution. - -That being said, you are welcome to copy code from these examples as -desired when using libgit2. They have been [released to the public domain][cc0], -so there are no restrictions on their use. - -[cc0]: COPYING - -For annotated HTML versions, see the "Examples" section of: - - http://libgit2.github.com/libgit2 - -such as: - - http://libgit2.github.com/libgit2/ex/HEAD/general.html diff --git a/vendor/libgit2/examples/add.c b/vendor/libgit2/examples/add.c deleted file mode 100644 index 0101ab9ae1..0000000000 --- a/vendor/libgit2/examples/add.c +++ /dev/null @@ -1,159 +0,0 @@ -/* - * libgit2 "add" example - shows how to modify the index - * - * Written by the libgit2 contributors - * - * To the extent possible under law, the author(s) have dedicated all copyright - * and related and neighboring rights to this software to the public domain - * worldwide. This software is distributed without any warranty. - * - * You should have received a copy of the CC0 Public Domain Dedication along - * with this software. If not, see - * . - */ - -#include "common.h" -#include - -enum print_options { - SKIP = 1, - VERBOSE = 2, - UPDATE = 4, -}; - -struct print_payload { - enum print_options options; - git_repository *repo; -}; - -/* Forward declarations for helpers */ -static void parse_opts(int *options, int *count, int argc, char *argv[]); -void init_array(git_strarray *array, int argc, char **argv); -int print_matched_cb(const char *path, const char *matched_pathspec, void *payload); - -int main (int argc, char** argv) -{ - git_index_matched_path_cb matched_cb = NULL; - git_repository *repo = NULL; - git_index *index; - git_strarray array = {0}; - int options = 0, count = 0; - struct print_payload payload = {0}; - - git_libgit2_init(); - - parse_opts(&options, &count, argc, argv); - - init_array(&array, argc-count, argv+count); - - check_lg2(git_repository_open(&repo, "."), "No git repository", NULL); - check_lg2(git_repository_index(&index, repo), "Could not open repository index", NULL); - - if (options&VERBOSE || options&SKIP) { - matched_cb = &print_matched_cb; - } - - payload.options = options; - payload.repo = repo; - - if (options&UPDATE) { - git_index_update_all(index, &array, matched_cb, &payload); - } else { - git_index_add_all(index, &array, 0, matched_cb, &payload); - } - - git_index_write(index); - git_index_free(index); - git_repository_free(repo); - - git_libgit2_shutdown(); - - return 0; -} - -int print_matched_cb(const char *path, const char *matched_pathspec, void *payload) -{ - struct print_payload p = *(struct print_payload*)(payload); - int ret; - git_status_t status; - (void)matched_pathspec; - - if (git_status_file((unsigned int*)(&status), p.repo, path)) { - return -1; //abort - } - - if (status & GIT_STATUS_WT_MODIFIED || - status & GIT_STATUS_WT_NEW) { - printf("add '%s'\n", path); - ret = 0; - } else { - ret = 1; - } - - if(p.options & SKIP) { - ret = 1; - } - - return ret; -} - -void init_array(git_strarray *array, int argc, char **argv) -{ - unsigned int i; - - array->count = argc; - array->strings = malloc(sizeof(char*) * array->count); - assert(array->strings!=NULL); - - for(i=0; icount; i++) { - array->strings[i]=argv[i]; - } - - return; -} - -void print_usage(void) -{ - fprintf(stderr, "usage: add [options] [--] file-spec [file-spec] [...]\n\n"); - fprintf(stderr, "\t-n, --dry-run dry run\n"); - fprintf(stderr, "\t-v, --verbose be verbose\n"); - fprintf(stderr, "\t-u, --update update tracked files\n"); - exit(1); -} - -static void parse_opts(int *options, int *count, int argc, char *argv[]) -{ - int i; - - for (i = 1; i < argc; ++i) { - if (argv[i][0] != '-') { - break; - } - else if(!strcmp(argv[i], "--verbose") || !strcmp(argv[i], "-v")) { - *options |= VERBOSE; - } - else if(!strcmp(argv[i], "--dry-run") || !strcmp(argv[i], "-n")) { - *options |= SKIP; - } - else if(!strcmp(argv[i], "--update") || !strcmp(argv[i], "-u")) { - *options |= UPDATE; - } - else if(!strcmp(argv[i], "-h")) { - print_usage(); - break; - } - else if(!strcmp(argv[i], "--")) { - i++; - break; - } - else { - fprintf(stderr, "Unsupported option %s.\n", argv[i]); - print_usage(); - } - } - - if (argc<=i) - print_usage(); - - *count = i; -} diff --git a/vendor/libgit2/examples/blame.c b/vendor/libgit2/examples/blame.c deleted file mode 100644 index 9288352e2e..0000000000 --- a/vendor/libgit2/examples/blame.c +++ /dev/null @@ -1,212 +0,0 @@ -/* - * libgit2 "blame" example - shows how to use the blame API - * - * Written by the libgit2 contributors - * - * To the extent possible under law, the author(s) have dedicated all copyright - * and related and neighboring rights to this software to the public domain - * worldwide. This software is distributed without any warranty. - * - * You should have received a copy of the CC0 Public Domain Dedication along - * with this software. If not, see - * . - */ - -#include "common.h" - -#ifdef _MSC_VER -#define snprintf sprintf_s -#define strcasecmp strcmpi -#endif - -/** - * This example demonstrates how to invoke the libgit2 blame API to roughly - * simulate the output of `git blame` and a few of its command line arguments. - */ - -struct opts { - char *path; - char *commitspec; - int C; - int M; - int start_line; - int end_line; - int F; -}; -static void parse_opts(struct opts *o, int argc, char *argv[]); - -int main(int argc, char *argv[]) -{ - int line, break_on_null_hunk; - size_t i, rawsize; - char spec[1024] = {0}; - struct opts o = {0}; - const char *rawdata; - git_repository *repo = NULL; - git_revspec revspec = {0}; - git_blame_options blameopts = GIT_BLAME_OPTIONS_INIT; - git_blame *blame = NULL; - git_blob *blob; - git_object *obj; - - git_libgit2_init(); - - parse_opts(&o, argc, argv); - if (o.M) blameopts.flags |= GIT_BLAME_TRACK_COPIES_SAME_COMMIT_MOVES; - if (o.C) blameopts.flags |= GIT_BLAME_TRACK_COPIES_SAME_COMMIT_COPIES; - if (o.F) blameopts.flags |= GIT_BLAME_FIRST_PARENT; - - /** Open the repository. */ - check_lg2(git_repository_open_ext(&repo, ".", 0, NULL), "Couldn't open repository", NULL); - - /** - * The commit range comes in "commitish" form. Use the rev-parse API to - * nail down the end points. - */ - if (o.commitspec) { - check_lg2(git_revparse(&revspec, repo, o.commitspec), "Couldn't parse commit spec", NULL); - if (revspec.flags & GIT_REVPARSE_SINGLE) { - git_oid_cpy(&blameopts.newest_commit, git_object_id(revspec.from)); - git_object_free(revspec.from); - } else { - git_oid_cpy(&blameopts.oldest_commit, git_object_id(revspec.from)); - git_oid_cpy(&blameopts.newest_commit, git_object_id(revspec.to)); - git_object_free(revspec.from); - git_object_free(revspec.to); - } - } - - /** Run the blame. */ - check_lg2(git_blame_file(&blame, repo, o.path, &blameopts), "Blame error", NULL); - - /** - * Get the raw data inside the blob for output. We use the - * `commitish:path/to/file.txt` format to find it. - */ - if (git_oid_iszero(&blameopts.newest_commit)) - strcpy(spec, "HEAD"); - else - git_oid_tostr(spec, sizeof(spec), &blameopts.newest_commit); - strcat(spec, ":"); - strcat(spec, o.path); - - check_lg2(git_revparse_single(&obj, repo, spec), "Object lookup error", NULL); - check_lg2(git_blob_lookup(&blob, repo, git_object_id(obj)), "Blob lookup error", NULL); - git_object_free(obj); - - rawdata = git_blob_rawcontent(blob); - rawsize = git_blob_rawsize(blob); - - /** Produce the output. */ - line = 1; - i = 0; - break_on_null_hunk = 0; - while (i < rawsize) { - const char *eol = memchr(rawdata + i, '\n', rawsize - i); - char oid[10] = {0}; - const git_blame_hunk *hunk = git_blame_get_hunk_byline(blame, line); - - if (break_on_null_hunk && !hunk) - break; - - if (hunk) { - char sig[128] = {0}; - break_on_null_hunk = 1; - - git_oid_tostr(oid, 10, &hunk->final_commit_id); - snprintf(sig, 30, "%s <%s>", hunk->final_signature->name, hunk->final_signature->email); - - printf("%s ( %-30s %3d) %.*s\n", - oid, - sig, - line, - (int)(eol - rawdata - i), - rawdata + i); - } - - i = (int)(eol - rawdata + 1); - line++; - } - - /** Cleanup. */ - git_blob_free(blob); - git_blame_free(blame); - git_repository_free(repo); - - git_libgit2_shutdown(); - - return 0; -} - -/** Tell the user how to make this thing work. */ -static void usage(const char *msg, const char *arg) -{ - if (msg && arg) - fprintf(stderr, "%s: %s\n", msg, arg); - else if (msg) - fprintf(stderr, "%s\n", msg); - fprintf(stderr, "usage: blame [options] [] \n"); - fprintf(stderr, "\n"); - fprintf(stderr, " example: `HEAD~10..HEAD`, or `1234abcd`\n"); - fprintf(stderr, " -L process only line range n-m, counting from 1\n"); - fprintf(stderr, " -M find line moves within and across files\n"); - fprintf(stderr, " -C find line copies within and across files\n"); - fprintf(stderr, " -F follow only the first parent commits\n"); - fprintf(stderr, "\n"); - exit(1); -} - -/** Parse the arguments. */ -static void parse_opts(struct opts *o, int argc, char *argv[]) -{ - int i; - char *bare_args[3] = {0}; - - if (argc < 2) usage(NULL, NULL); - - for (i=1; i= 3) - usage("Invalid argument set", NULL); - bare_args[i] = a; - } - else if (!strcmp(a, "--")) - continue; - else if (!strcasecmp(a, "-M")) - o->M = 1; - else if (!strcasecmp(a, "-C")) - o->C = 1; - else if (!strcasecmp(a, "-F")) - o->F = 1; - else if (!strcasecmp(a, "-L")) { - i++; a = argv[i]; - if (i >= argc) fatal("Not enough arguments to -L", NULL); - check_lg2(sscanf(a, "%d,%d", &o->start_line, &o->end_line)-2, "-L format error", NULL); - } - else { - /* commit range */ - if (o->commitspec) fatal("Only one commit spec allowed", NULL); - o->commitspec = a; - } - } - - /* Handle the bare arguments */ - if (!bare_args[0]) usage("Please specify a path", NULL); - o->path = bare_args[0]; - if (bare_args[1]) { - /* */ - o->path = bare_args[1]; - o->commitspec = bare_args[0]; - } - if (bare_args[2]) { - /* */ - char spec[128] = {0}; - o->path = bare_args[2]; - sprintf(spec, "%s..%s", bare_args[0], bare_args[1]); - o->commitspec = spec; - } -} diff --git a/vendor/libgit2/examples/cat-file.c b/vendor/libgit2/examples/cat-file.c deleted file mode 100644 index f948740a1c..0000000000 --- a/vendor/libgit2/examples/cat-file.c +++ /dev/null @@ -1,246 +0,0 @@ -/* - * libgit2 "cat-file" example - shows how to print data from the ODB - * - * Written by the libgit2 contributors - * - * To the extent possible under law, the author(s) have dedicated all copyright - * and related and neighboring rights to this software to the public domain - * worldwide. This software is distributed without any warranty. - * - * You should have received a copy of the CC0 Public Domain Dedication along - * with this software. If not, see - * . - */ - -#include "common.h" - -static void print_signature(const char *header, const git_signature *sig) -{ - char sign; - int offset, hours, minutes; - - if (!sig) - return; - - offset = sig->when.offset; - if (offset < 0) { - sign = '-'; - offset = -offset; - } else { - sign = '+'; - } - - hours = offset / 60; - minutes = offset % 60; - - printf("%s %s <%s> %ld %c%02d%02d\n", - header, sig->name, sig->email, (long)sig->when.time, - sign, hours, minutes); -} - -/** Printing out a blob is simple, get the contents and print */ -static void show_blob(const git_blob *blob) -{ - /* ? Does this need crlf filtering? */ - fwrite(git_blob_rawcontent(blob), (size_t)git_blob_rawsize(blob), 1, stdout); -} - -/** Show each entry with its type, id and attributes */ -static void show_tree(const git_tree *tree) -{ - size_t i, max_i = (int)git_tree_entrycount(tree); - char oidstr[GIT_OID_HEXSZ + 1]; - const git_tree_entry *te; - - for (i = 0; i < max_i; ++i) { - te = git_tree_entry_byindex(tree, i); - - git_oid_tostr(oidstr, sizeof(oidstr), git_tree_entry_id(te)); - - printf("%06o %s %s\t%s\n", - git_tree_entry_filemode(te), - git_object_type2string(git_tree_entry_type(te)), - oidstr, git_tree_entry_name(te)); - } -} - -/** - * Commits and tags have a few interesting fields in their header. - */ -static void show_commit(const git_commit *commit) -{ - unsigned int i, max_i; - char oidstr[GIT_OID_HEXSZ + 1]; - - git_oid_tostr(oidstr, sizeof(oidstr), git_commit_tree_id(commit)); - printf("tree %s\n", oidstr); - - max_i = (unsigned int)git_commit_parentcount(commit); - for (i = 0; i < max_i; ++i) { - git_oid_tostr(oidstr, sizeof(oidstr), git_commit_parent_id(commit, i)); - printf("parent %s\n", oidstr); - } - - print_signature("author", git_commit_author(commit)); - print_signature("committer", git_commit_committer(commit)); - - if (git_commit_message(commit)) - printf("\n%s\n", git_commit_message(commit)); -} - -static void show_tag(const git_tag *tag) -{ - char oidstr[GIT_OID_HEXSZ + 1]; - - git_oid_tostr(oidstr, sizeof(oidstr), git_tag_target_id(tag));; - printf("object %s\n", oidstr); - printf("type %s\n", git_object_type2string(git_tag_target_type(tag))); - printf("tag %s\n", git_tag_name(tag)); - print_signature("tagger", git_tag_tagger(tag)); - - if (git_tag_message(tag)) - printf("\n%s\n", git_tag_message(tag)); -} - -enum { - SHOW_TYPE = 1, - SHOW_SIZE = 2, - SHOW_NONE = 3, - SHOW_PRETTY = 4 -}; - -/* Forward declarations for option-parsing helper */ -struct opts { - const char *dir; - const char *rev; - int action; - int verbose; -}; -static void parse_opts(struct opts *o, int argc, char *argv[]); - - -/** Entry point for this command */ -int main(int argc, char *argv[]) -{ - git_repository *repo; - struct opts o = { ".", NULL, 0, 0 }; - git_object *obj = NULL; - char oidstr[GIT_OID_HEXSZ + 1]; - - git_libgit2_init(); - - parse_opts(&o, argc, argv); - - check_lg2(git_repository_open_ext(&repo, o.dir, 0, NULL), - "Could not open repository", NULL); - check_lg2(git_revparse_single(&obj, repo, o.rev), - "Could not resolve", o.rev); - - if (o.verbose) { - char oidstr[GIT_OID_HEXSZ + 1]; - git_oid_tostr(oidstr, sizeof(oidstr), git_object_id(obj)); - - printf("%s %s\n--\n", - git_object_type2string(git_object_type(obj)), oidstr); - } - - switch (o.action) { - case SHOW_TYPE: - printf("%s\n", git_object_type2string(git_object_type(obj))); - break; - case SHOW_SIZE: { - git_odb *odb; - git_odb_object *odbobj; - - check_lg2(git_repository_odb(&odb, repo), "Could not open ODB", NULL); - check_lg2(git_odb_read(&odbobj, odb, git_object_id(obj)), - "Could not find obj", NULL); - - printf("%ld\n", (long)git_odb_object_size(odbobj)); - - git_odb_object_free(odbobj); - git_odb_free(odb); - } - break; - case SHOW_NONE: - /* just want return result */ - break; - case SHOW_PRETTY: - - switch (git_object_type(obj)) { - case GIT_OBJ_BLOB: - show_blob((const git_blob *)obj); - break; - case GIT_OBJ_COMMIT: - show_commit((const git_commit *)obj); - break; - case GIT_OBJ_TREE: - show_tree((const git_tree *)obj); - break; - case GIT_OBJ_TAG: - show_tag((const git_tag *)obj); - break; - default: - printf("unknown %s\n", oidstr); - break; - } - break; - } - - git_object_free(obj); - git_repository_free(repo); - - git_libgit2_shutdown(); - - return 0; -} - -/** Print out usage information */ -static void usage(const char *message, const char *arg) -{ - if (message && arg) - fprintf(stderr, "%s: %s\n", message, arg); - else if (message) - fprintf(stderr, "%s\n", message); - fprintf(stderr, - "usage: cat-file (-t | -s | -e | -p) [-v] [-q] " - "[-h|--help] [--git-dir=] \n"); - exit(1); -} - -/** Parse the command-line options taken from git */ -static void parse_opts(struct opts *o, int argc, char *argv[]) -{ - struct args_info args = ARGS_INFO_INIT; - - for (args.pos = 1; args.pos < argc; ++args.pos) { - char *a = argv[args.pos]; - - if (a[0] != '-') { - if (o->rev != NULL) - usage("Only one rev should be provided", NULL); - else - o->rev = a; - } - else if (!strcmp(a, "-t")) - o->action = SHOW_TYPE; - else if (!strcmp(a, "-s")) - o->action = SHOW_SIZE; - else if (!strcmp(a, "-e")) - o->action = SHOW_NONE; - else if (!strcmp(a, "-p")) - o->action = SHOW_PRETTY; - else if (!strcmp(a, "-q")) - o->verbose = 0; - else if (!strcmp(a, "-v")) - o->verbose = 1; - else if (!strcmp(a, "--help") || !strcmp(a, "-h")) - usage(NULL, NULL); - else if (!match_str_arg(&o->dir, &args, "--git-dir")) - usage("Unknown option", a); - } - - if (!o->action || !o->rev) - usage(NULL, NULL); - -} diff --git a/vendor/libgit2/examples/common.c b/vendor/libgit2/examples/common.c deleted file mode 100644 index 0f25f37877..0000000000 --- a/vendor/libgit2/examples/common.c +++ /dev/null @@ -1,218 +0,0 @@ -/* - * Utilities library for libgit2 examples - * - * Written by the libgit2 contributors - * - * To the extent possible under law, the author(s) have dedicated all copyright - * and related and neighboring rights to this software to the public domain - * worldwide. This software is distributed without any warranty. - * - * You should have received a copy of the CC0 Public Domain Dedication along - * with this software. If not, see - * . - */ - -#include "common.h" - -void check_lg2(int error, const char *message, const char *extra) -{ - const git_error *lg2err; - const char *lg2msg = "", *lg2spacer = ""; - - if (!error) - return; - - if ((lg2err = giterr_last()) != NULL && lg2err->message != NULL) { - lg2msg = lg2err->message; - lg2spacer = " - "; - } - - if (extra) - fprintf(stderr, "%s '%s' [%d]%s%s\n", - message, extra, error, lg2spacer, lg2msg); - else - fprintf(stderr, "%s [%d]%s%s\n", - message, error, lg2spacer, lg2msg); - - exit(1); -} - -void fatal(const char *message, const char *extra) -{ - if (extra) - fprintf(stderr, "%s %s\n", message, extra); - else - fprintf(stderr, "%s\n", message); - - exit(1); -} - -size_t is_prefixed(const char *str, const char *pfx) -{ - size_t len = strlen(pfx); - return strncmp(str, pfx, len) ? 0 : len; -} - -int optional_str_arg( - const char **out, struct args_info *args, const char *opt, const char *def) -{ - const char *found = args->argv[args->pos]; - size_t len = is_prefixed(found, opt); - - if (!len) - return 0; - - if (!found[len]) { - if (args->pos + 1 == args->argc) { - *out = def; - return 1; - } - args->pos += 1; - *out = args->argv[args->pos]; - return 1; - } - - if (found[len] == '=') { - *out = found + len + 1; - return 1; - } - - return 0; -} - -int match_str_arg( - const char **out, struct args_info *args, const char *opt) -{ - const char *found = args->argv[args->pos]; - size_t len = is_prefixed(found, opt); - - if (!len) - return 0; - - if (!found[len]) { - if (args->pos + 1 == args->argc) - fatal("expected value following argument", opt); - args->pos += 1; - *out = args->argv[args->pos]; - return 1; - } - - if (found[len] == '=') { - *out = found + len + 1; - return 1; - } - - return 0; -} - -static const char *match_numeric_arg(struct args_info *args, const char *opt) -{ - const char *found = args->argv[args->pos]; - size_t len = is_prefixed(found, opt); - - if (!len) - return NULL; - - if (!found[len]) { - if (args->pos + 1 == args->argc) - fatal("expected numeric value following argument", opt); - args->pos += 1; - found = args->argv[args->pos]; - } else { - found = found + len; - if (*found == '=') - found++; - } - - return found; -} - -int match_uint16_arg( - uint16_t *out, struct args_info *args, const char *opt) -{ - const char *found = match_numeric_arg(args, opt); - uint16_t val; - char *endptr = NULL; - - if (!found) - return 0; - - val = (uint16_t)strtoul(found, &endptr, 0); - if (!endptr || *endptr != '\0') - fatal("expected number after argument", opt); - - if (out) - *out = val; - return 1; -} - -static int match_int_internal( - int *out, const char *str, int allow_negative, const char *opt) -{ - char *endptr = NULL; - int val = (int)strtol(str, &endptr, 10); - - if (!endptr || *endptr != '\0') - fatal("expected number", opt); - else if (val < 0 && !allow_negative) - fatal("negative values are not allowed", opt); - - if (out) - *out = val; - - return 1; -} - -int is_integer(int *out, const char *str, int allow_negative) -{ - return match_int_internal(out, str, allow_negative, NULL); -} - -int match_int_arg( - int *out, struct args_info *args, const char *opt, int allow_negative) -{ - const char *found = match_numeric_arg(args, opt); - if (!found) - return 0; - return match_int_internal(out, found, allow_negative, opt); -} - -int diff_output( - const git_diff_delta *d, - const git_diff_hunk *h, - const git_diff_line *l, - void *p) -{ - FILE *fp = (FILE*)p; - - (void)d; (void)h; - - if (!fp) - fp = stdout; - - if (l->origin == GIT_DIFF_LINE_CONTEXT || - l->origin == GIT_DIFF_LINE_ADDITION || - l->origin == GIT_DIFF_LINE_DELETION) - fputc(l->origin, fp); - - fwrite(l->content, 1, l->content_len, fp); - - return 0; -} - -void treeish_to_tree( - git_tree **out, git_repository *repo, const char *treeish) -{ - git_object *obj = NULL; - - check_lg2( - git_revparse_single(&obj, repo, treeish), - "looking up object", treeish); - - check_lg2( - git_object_peel((git_object **)out, obj, GIT_OBJ_TREE), - "resolving object to tree", treeish); - - git_object_free(obj); -} - diff --git a/vendor/libgit2/examples/common.h b/vendor/libgit2/examples/common.h deleted file mode 100644 index b9fa37ce9c..0000000000 --- a/vendor/libgit2/examples/common.h +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Utilities library for libgit2 examples - * - * Written by the libgit2 contributors - * - * To the extent possible under law, the author(s) have dedicated all copyright - * and related and neighboring rights to this software to the public domain - * worldwide. This software is distributed without any warranty. - * - * You should have received a copy of the CC0 Public Domain Dedication along - * with this software. If not, see - * . - */ - -#include -#include -#include -#include - -/** - * Check libgit2 error code, printing error to stderr on failure and - * exiting the program. - */ -extern void check_lg2(int error, const char *message, const char *extra); - -/** - * Exit the program, printing error to stderr - */ -extern void fatal(const char *message, const char *extra); - -/** - * Check if a string has the given prefix. Returns 0 if not prefixed - * or the length of the prefix if it is. - */ -extern size_t is_prefixed(const char *str, const char *pfx); - -/** - * Match an integer string, returning 1 if matched, 0 if not. - */ -extern int is_integer(int *out, const char *str, int allow_negative); - -struct args_info { - int argc; - char **argv; - int pos; -}; -#define ARGS_INFO_INIT { argc, argv, 0 } - -/** - * Check current `args` entry against `opt` string. If it matches - * exactly, take the next arg as a string; if it matches as a prefix with - * an equal sign, take the remainder as a string; if value not supplied, - * default value `def` will be given. otherwise return 0. - */ -extern int optional_str_arg( - const char **out, struct args_info *args, const char *opt, const char *def); - -/** - * Check current `args` entry against `opt` string. If it matches - * exactly, take the next arg as a string; if it matches as a prefix with - * an equal sign, take the remainder as a string; otherwise return 0. - */ -extern int match_str_arg( - const char **out, struct args_info *args, const char *opt); - -/** - * Check current `args` entry against `opt` string parsing as uint16. If - * `opt` matches exactly, take the next arg as a uint16_t value; if `opt` - * is a prefix (equal sign optional), take the remainder of the arg as a - * uint16_t value; otherwise return 0. - */ -extern int match_uint16_arg( - uint16_t *out, struct args_info *args, const char *opt); - -/** - * Check current `args` entry against `opt` string parsing as int. If - * `opt` matches exactly, take the next arg as an int value; if it matches - * as a prefix (equal sign optional), take the remainder of the arg as a - * int value; otherwise return 0. - */ -extern int match_int_arg( - int *out, struct args_info *args, const char *opt, int allow_negative); - -/** - * Basic output function for plain text diff output - * Pass `FILE*` such as `stdout` or `stderr` as payload (or NULL == `stdout`) - */ -extern int diff_output( - const git_diff_delta*, const git_diff_hunk*, const git_diff_line*, void*); - -/** - * Convert a treeish argument to an actual tree; this will call check_lg2 - * and exit the program if `treeish` cannot be resolved to a tree - */ -extern void treeish_to_tree( - git_tree **out, git_repository *repo, const char *treeish); diff --git a/vendor/libgit2/examples/describe.c b/vendor/libgit2/examples/describe.c deleted file mode 100644 index 4cdf61f75c..0000000000 --- a/vendor/libgit2/examples/describe.c +++ /dev/null @@ -1,184 +0,0 @@ -/* - * libgit2 "describe" example - shows how to describe commits - * - * Written by the libgit2 contributors - * - * To the extent possible under law, the author(s) have dedicated all copyright - * and related and neighboring rights to this software to the public domain - * worldwide. This software is distributed without any warranty. - * - * You should have received a copy of the CC0 Public Domain Dedication along - * with this software. If not, see - * . - */ - -#include "common.h" -#include - -/** - * The following example partially reimplements the `git describe` command - * and some of its options. - * - * These commands should work: - - * - Describe HEAD with default options (`describe`) - * - Describe specified revision (`describe master~2`) - * - Describe specified revisions (`describe master~2 HEAD~3`) - * - Describe HEAD with dirty state suffix (`describe --dirty=*`) - * - Describe consider all refs (`describe --all master`) - * - Describe consider lightweight tags (`describe --tags temp-tag`) - * - Describe show non-default abbreviated size (`describe --abbrev=10`) - * - Describe always output the long format if matches a tag (`describe --long v1.0`) - * - Describe consider only tags of specified pattern (`describe --match v*-release`) - * - Describe show the fallback result (`describe --always`) - * - Describe follow only the first parent commit (`describe --first-parent`) - * - * The command line parsing logic is simplified and doesn't handle - * all of the use cases. - */ - -/** describe_options represents the parsed command line options */ -typedef struct { - const char **commits; - size_t commit_count; - git_describe_options describe_options; - git_describe_format_options format_options; -} describe_options; - -typedef struct args_info args_info; - -static void *xrealloc(void *oldp, size_t newsz) -{ - void *p = realloc(oldp, newsz); - if (p == NULL) { - fprintf(stderr, "Cannot allocate memory, exiting.\n"); - exit(1); - } - return p; -} - -static void opts_add_commit(describe_options *opts, const char *commit) -{ - size_t sz; - - assert(opts != NULL); - - sz = ++opts->commit_count * sizeof(opts->commits[0]); - opts->commits = xrealloc(opts->commits, sz); - opts->commits[opts->commit_count - 1] = commit; -} - -static void do_describe_single(git_repository *repo, describe_options *opts, const char *rev) -{ - git_object *commit; - git_describe_result *describe_result; - git_buf buf = { 0 }; - - if (rev) { - check_lg2(git_revparse_single(&commit, repo, rev), - "Failed to lookup rev", rev); - - check_lg2(git_describe_commit(&describe_result, commit, &opts->describe_options), - "Failed to describe rev", rev); - } - else - check_lg2(git_describe_workdir(&describe_result, repo, &opts->describe_options), - "Failed to describe workdir", NULL); - - check_lg2(git_describe_format(&buf, describe_result, &opts->format_options), - "Failed to format describe rev", rev); - - printf("%s\n", buf.ptr); -} - -static void do_describe(git_repository *repo, describe_options *opts) -{ - if (opts->commit_count == 0) - do_describe_single(repo, opts, NULL); - else - { - size_t i; - for (i = 0; i < opts->commit_count; i++) - do_describe_single(repo, opts, opts->commits[i]); - } -} - -static void print_usage(void) -{ - fprintf(stderr, "usage: see `git help describe`\n"); - exit(1); -} - -/** Parse command line arguments */ -static void parse_options(describe_options *opts, int argc, char **argv) -{ - args_info args = ARGS_INFO_INIT; - - for (args.pos = 1; args.pos < argc; ++args.pos) { - const char *curr = argv[args.pos]; - - if (curr[0] != '-') { - opts_add_commit(opts, curr); - } else if (!strcmp(curr, "--all")) { - opts->describe_options.describe_strategy = GIT_DESCRIBE_ALL; - } else if (!strcmp(curr, "--tags")) { - opts->describe_options.describe_strategy = GIT_DESCRIBE_TAGS; - } else if (!strcmp(curr, "--exact-match")) { - opts->describe_options.max_candidates_tags = 0; - } else if (!strcmp(curr, "--long")) { - opts->format_options.always_use_long_format = 1; - } else if (!strcmp(curr, "--always")) { - opts->describe_options.show_commit_oid_as_fallback = 1; - } else if (!strcmp(curr, "--first-parent")) { - opts->describe_options.only_follow_first_parent = 1; - } else if (optional_str_arg(&opts->format_options.dirty_suffix, &args, "--dirty", "-dirty")) { - } else if (match_int_arg((int *)&opts->format_options.abbreviated_size, &args, "--abbrev", 0)) { - } else if (match_int_arg((int *)&opts->describe_options.max_candidates_tags, &args, "--candidates", 0)) { - } else if (match_str_arg(&opts->describe_options.pattern, &args, "--match")) { - } else { - print_usage(); - } - } - - if (opts->commit_count > 0) { - if (opts->format_options.dirty_suffix) - fatal("--dirty is incompatible with commit-ishes", NULL); - } - else { - if (!opts->format_options.dirty_suffix || !opts->format_options.dirty_suffix[0]) { - opts_add_commit(opts, "HEAD"); - } - } -} - -/** Initialize describe_options struct */ -static void describe_options_init(describe_options *opts) -{ - memset(opts, 0, sizeof(*opts)); - - opts->commits = NULL; - opts->commit_count = 0; - git_describe_init_options(&opts->describe_options, GIT_DESCRIBE_OPTIONS_VERSION); - git_describe_init_format_options(&opts->format_options, GIT_DESCRIBE_FORMAT_OPTIONS_VERSION); -} - -int main(int argc, char **argv) -{ - git_repository *repo; - describe_options opts; - - git_libgit2_init(); - - check_lg2(git_repository_open_ext(&repo, ".", 0, NULL), - "Could not open repository", NULL); - - describe_options_init(&opts); - parse_options(&opts, argc, argv); - - do_describe(repo, &opts); - - git_repository_free(repo); - git_libgit2_shutdown(); - - return 0; -} diff --git a/vendor/libgit2/examples/diff.c b/vendor/libgit2/examples/diff.c deleted file mode 100644 index b69cb22182..0000000000 --- a/vendor/libgit2/examples/diff.c +++ /dev/null @@ -1,337 +0,0 @@ -/* - * libgit2 "diff" example - shows how to use the diff API - * - * Written by the libgit2 contributors - * - * To the extent possible under law, the author(s) have dedicated all copyright - * and related and neighboring rights to this software to the public domain - * worldwide. This software is distributed without any warranty. - * - * You should have received a copy of the CC0 Public Domain Dedication along - * with this software. If not, see - * . - */ - -#include "common.h" - -/** - * This example demonstrates the use of the libgit2 diff APIs to - * create `git_diff` objects and display them, emulating a number of - * core Git `diff` command line options. - * - * This covers on a portion of the core Git diff options and doesn't - * have particularly good error handling, but it should show most of - * the core libgit2 diff APIs, including various types of diffs and - * how to do renaming detection and patch formatting. - */ - -static const char *colors[] = { - "\033[m", /* reset */ - "\033[1m", /* bold */ - "\033[31m", /* red */ - "\033[32m", /* green */ - "\033[36m" /* cyan */ -}; - -enum { - OUTPUT_DIFF = (1 << 0), - OUTPUT_STAT = (1 << 1), - OUTPUT_SHORTSTAT = (1 << 2), - OUTPUT_NUMSTAT = (1 << 3), - OUTPUT_SUMMARY = (1 << 4) -}; - -enum { - CACHE_NORMAL = 0, - CACHE_ONLY = 1, - CACHE_NONE = 2 -}; - -/** The 'opts' struct captures all the various parsed command line options. */ -struct opts { - git_diff_options diffopts; - git_diff_find_options findopts; - int color; - int cache; - int output; - git_diff_format_t format; - const char *treeish1; - const char *treeish2; - const char *dir; -}; - -/** These functions are implemented at the end */ -static void usage(const char *message, const char *arg); -static void parse_opts(struct opts *o, int argc, char *argv[]); -static int color_printer( - const git_diff_delta*, const git_diff_hunk*, const git_diff_line*, void*); -static void diff_print_stats(git_diff *diff, struct opts *o); - -int main(int argc, char *argv[]) -{ - git_repository *repo = NULL; - git_tree *t1 = NULL, *t2 = NULL; - git_diff *diff; - struct opts o = { - GIT_DIFF_OPTIONS_INIT, GIT_DIFF_FIND_OPTIONS_INIT, - -1, 0, 0, GIT_DIFF_FORMAT_PATCH, NULL, NULL, "." - }; - - git_libgit2_init(); - - parse_opts(&o, argc, argv); - - check_lg2(git_repository_open_ext(&repo, o.dir, 0, NULL), - "Could not open repository", o.dir); - - /** - * Possible argument patterns: - * - * * <sha1> <sha2> - * * <sha1> --cached - * * <sha1> - * * --cached - * * --nocache (don't use index data in diff at all) - * * nothing - * - * Currently ranged arguments like <sha1>..<sha2> and <sha1>...<sha2> - * are not supported in this example - */ - - if (o.treeish1) - treeish_to_tree(&t1, repo, o.treeish1); - if (o.treeish2) - treeish_to_tree(&t2, repo, o.treeish2); - - if (t1 && t2) - check_lg2( - git_diff_tree_to_tree(&diff, repo, t1, t2, &o.diffopts), - "diff trees", NULL); - else if (o.cache != CACHE_NORMAL) { - if (!t1) - treeish_to_tree(&t1, repo, "HEAD"); - - if (o.cache == CACHE_NONE) - check_lg2( - git_diff_tree_to_workdir(&diff, repo, t1, &o.diffopts), - "diff tree to working directory", NULL); - else - check_lg2( - git_diff_tree_to_index(&diff, repo, t1, NULL, &o.diffopts), - "diff tree to index", NULL); - } - else if (t1) - check_lg2( - git_diff_tree_to_workdir_with_index(&diff, repo, t1, &o.diffopts), - "diff tree to working directory", NULL); - else - check_lg2( - git_diff_index_to_workdir(&diff, repo, NULL, &o.diffopts), - "diff index to working directory", NULL); - - /** Apply rename and copy detection if requested. */ - - if ((o.findopts.flags & GIT_DIFF_FIND_ALL) != 0) - check_lg2( - git_diff_find_similar(diff, &o.findopts), - "finding renames and copies", NULL); - - /** Generate simple output using libgit2 display helper. */ - - if (!o.output) - o.output = OUTPUT_DIFF; - - if (o.output != OUTPUT_DIFF) - diff_print_stats(diff, &o); - - if ((o.output & OUTPUT_DIFF) != 0) { - if (o.color >= 0) - fputs(colors[0], stdout); - - check_lg2( - git_diff_print(diff, o.format, color_printer, &o.color), - "displaying diff", NULL); - - if (o.color >= 0) - fputs(colors[0], stdout); - } - - /** Cleanup before exiting. */ - - git_diff_free(diff); - git_tree_free(t1); - git_tree_free(t2); - git_repository_free(repo); - - git_libgit2_shutdown(); - - return 0; -} - -static void usage(const char *message, const char *arg) -{ - if (message && arg) - fprintf(stderr, "%s: %s\n", message, arg); - else if (message) - fprintf(stderr, "%s\n", message); - fprintf(stderr, "usage: diff [ []]\n"); - exit(1); -} - -/** This implements very rudimentary colorized output. */ -static int color_printer( - const git_diff_delta *delta, - const git_diff_hunk *hunk, - const git_diff_line *line, - void *data) -{ - int *last_color = data, color = 0; - - (void)delta; (void)hunk; - - if (*last_color >= 0) { - switch (line->origin) { - case GIT_DIFF_LINE_ADDITION: color = 3; break; - case GIT_DIFF_LINE_DELETION: color = 2; break; - case GIT_DIFF_LINE_ADD_EOFNL: color = 3; break; - case GIT_DIFF_LINE_DEL_EOFNL: color = 2; break; - case GIT_DIFF_LINE_FILE_HDR: color = 1; break; - case GIT_DIFF_LINE_HUNK_HDR: color = 4; break; - default: break; - } - - if (color != *last_color) { - if (*last_color == 1 || color == 1) - fputs(colors[0], stdout); - fputs(colors[color], stdout); - *last_color = color; - } - } - - return diff_output(delta, hunk, line, stdout); -} - -/** Parse arguments as copied from git-diff. */ -static void parse_opts(struct opts *o, int argc, char *argv[]) -{ - struct args_info args = ARGS_INFO_INIT; - - - for (args.pos = 1; args.pos < argc; ++args.pos) { - const char *a = argv[args.pos]; - - if (a[0] != '-') { - if (o->treeish1 == NULL) - o->treeish1 = a; - else if (o->treeish2 == NULL) - o->treeish2 = a; - else - usage("Only one or two tree identifiers can be provided", NULL); - } - else if (!strcmp(a, "-p") || !strcmp(a, "-u") || - !strcmp(a, "--patch")) { - o->output |= OUTPUT_DIFF; - o->format = GIT_DIFF_FORMAT_PATCH; - } - else if (!strcmp(a, "--cached")) - o->cache = CACHE_ONLY; - else if (!strcmp(a, "--nocache")) - o->cache = CACHE_NONE; - else if (!strcmp(a, "--name-only") || !strcmp(a, "--format=name")) - o->format = GIT_DIFF_FORMAT_NAME_ONLY; - else if (!strcmp(a, "--name-status") || - !strcmp(a, "--format=name-status")) - o->format = GIT_DIFF_FORMAT_NAME_STATUS; - else if (!strcmp(a, "--raw") || !strcmp(a, "--format=raw")) - o->format = GIT_DIFF_FORMAT_RAW; - else if (!strcmp(a, "--format=diff-index")) { - o->format = GIT_DIFF_FORMAT_RAW; - o->diffopts.id_abbrev = 40; - } - else if (!strcmp(a, "--color")) - o->color = 0; - else if (!strcmp(a, "--no-color")) - o->color = -1; - else if (!strcmp(a, "-R")) - o->diffopts.flags |= GIT_DIFF_REVERSE; - else if (!strcmp(a, "-a") || !strcmp(a, "--text")) - o->diffopts.flags |= GIT_DIFF_FORCE_TEXT; - else if (!strcmp(a, "--ignore-space-at-eol")) - o->diffopts.flags |= GIT_DIFF_IGNORE_WHITESPACE_EOL; - else if (!strcmp(a, "-b") || !strcmp(a, "--ignore-space-change")) - o->diffopts.flags |= GIT_DIFF_IGNORE_WHITESPACE_CHANGE; - else if (!strcmp(a, "-w") || !strcmp(a, "--ignore-all-space")) - o->diffopts.flags |= GIT_DIFF_IGNORE_WHITESPACE; - else if (!strcmp(a, "--ignored")) - o->diffopts.flags |= GIT_DIFF_INCLUDE_IGNORED; - else if (!strcmp(a, "--untracked")) - o->diffopts.flags |= GIT_DIFF_INCLUDE_UNTRACKED; - else if (!strcmp(a, "--patience")) - o->diffopts.flags |= GIT_DIFF_PATIENCE; - else if (!strcmp(a, "--minimal")) - o->diffopts.flags |= GIT_DIFF_MINIMAL; - else if (!strcmp(a, "--stat")) - o->output |= OUTPUT_STAT; - else if (!strcmp(a, "--numstat")) - o->output |= OUTPUT_NUMSTAT; - else if (!strcmp(a, "--shortstat")) - o->output |= OUTPUT_SHORTSTAT; - else if (!strcmp(a, "--summary")) - o->output |= OUTPUT_SUMMARY; - else if (match_uint16_arg( - &o->findopts.rename_threshold, &args, "-M") || - match_uint16_arg( - &o->findopts.rename_threshold, &args, "--find-renames")) - o->findopts.flags |= GIT_DIFF_FIND_RENAMES; - else if (match_uint16_arg( - &o->findopts.copy_threshold, &args, "-C") || - match_uint16_arg( - &o->findopts.copy_threshold, &args, "--find-copies")) - o->findopts.flags |= GIT_DIFF_FIND_COPIES; - else if (!strcmp(a, "--find-copies-harder")) - o->findopts.flags |= GIT_DIFF_FIND_COPIES_FROM_UNMODIFIED; - else if (is_prefixed(a, "-B") || is_prefixed(a, "--break-rewrites")) - /* TODO: parse thresholds */ - o->findopts.flags |= GIT_DIFF_FIND_REWRITES; - else if (!match_uint16_arg( - &o->diffopts.context_lines, &args, "-U") && - !match_uint16_arg( - &o->diffopts.context_lines, &args, "--unified") && - !match_uint16_arg( - &o->diffopts.interhunk_lines, &args, "--inter-hunk-context") && - !match_uint16_arg( - &o->diffopts.id_abbrev, &args, "--abbrev") && - !match_str_arg(&o->diffopts.old_prefix, &args, "--src-prefix") && - !match_str_arg(&o->diffopts.new_prefix, &args, "--dst-prefix") && - !match_str_arg(&o->dir, &args, "--git-dir")) - usage("Unknown command line argument", a); - } -} - -/** Display diff output with "--stat", "--numstat", or "--shortstat" */ -static void diff_print_stats(git_diff *diff, struct opts *o) -{ - git_diff_stats *stats; - git_buf b = GIT_BUF_INIT_CONST(NULL, 0); - git_diff_stats_format_t format = 0; - - check_lg2( - git_diff_get_stats(&stats, diff), "generating stats for diff", NULL); - - if (o->output & OUTPUT_STAT) - format |= GIT_DIFF_STATS_FULL; - if (o->output & OUTPUT_SHORTSTAT) - format |= GIT_DIFF_STATS_SHORT; - if (o->output & OUTPUT_NUMSTAT) - format |= GIT_DIFF_STATS_NUMBER; - if (o->output & OUTPUT_SUMMARY) - format |= GIT_DIFF_STATS_INCLUDE_SUMMARY; - - check_lg2( - git_diff_stats_to_buf(&b, stats, format, 80), "formatting stats", NULL); - - fputs(b.ptr, stdout); - - git_buf_free(&b); - git_diff_stats_free(stats); -} diff --git a/vendor/libgit2/examples/for-each-ref.c b/vendor/libgit2/examples/for-each-ref.c deleted file mode 100644 index a8ceaaff96..0000000000 --- a/vendor/libgit2/examples/for-each-ref.c +++ /dev/null @@ -1,49 +0,0 @@ -#include -#include -#include "common.h" - -static int show_ref(git_reference *ref, void *data) -{ - git_repository *repo = data; - git_reference *resolved = NULL; - char hex[GIT_OID_HEXSZ+1]; - const git_oid *oid; - git_object *obj; - - if (git_reference_type(ref) == GIT_REF_SYMBOLIC) - check_lg2(git_reference_resolve(&resolved, ref), - "Unable to resolve symbolic reference", - git_reference_name(ref)); - - oid = git_reference_target(resolved ? resolved : ref); - git_oid_fmt(hex, oid); - hex[GIT_OID_HEXSZ] = 0; - check_lg2(git_object_lookup(&obj, repo, oid, GIT_OBJ_ANY), - "Unable to lookup object", hex); - - printf("%s %-6s\t%s\n", - hex, - git_object_type2string(git_object_type(obj)), - git_reference_name(ref)); - - if (resolved) - git_reference_free(resolved); - return 0; -} - -int main(int argc, char **argv) -{ - git_repository *repo; - git_libgit2_init(); - - if (argc != 1 || argv[1] /* silence -Wunused-parameter */) - fatal("Sorry, no for-each-ref options supported yet", NULL); - - check_lg2(git_repository_open(&repo, "."), - "Could not open repository", NULL); - check_lg2(git_reference_foreach(repo, show_ref, repo), - "Could not iterate over references", NULL); - - git_libgit2_shutdown(); - return 0; -} diff --git a/vendor/libgit2/examples/general.c b/vendor/libgit2/examples/general.c deleted file mode 100644 index 706650b677..0000000000 --- a/vendor/libgit2/examples/general.c +++ /dev/null @@ -1,531 +0,0 @@ -/* - * libgit2 "general" example - shows basic libgit2 concepts - * - * Written by the libgit2 contributors - * - * To the extent possible under law, the author(s) have dedicated all copyright - * and related and neighboring rights to this software to the public domain - * worldwide. This software is distributed without any warranty. - * - * You should have received a copy of the CC0 Public Domain Dedication along - * with this software. If not, see - * . - */ - -// [**libgit2**][lg] is a portable, pure C implementation of the Git core -// methods provided as a re-entrant linkable library with a solid API, -// allowing you to write native speed custom Git applications in any -// language which supports C bindings. -// -// This file is an example of using that API in a real, compilable C file. -// As the API is updated, this file will be updated to demonstrate the new -// functionality. -// -// If you're trying to write something in C using [libgit2][lg], you should -// also check out the generated [API documentation][ap]. We try to link to -// the relevant sections of the API docs in each section in this file. -// -// **libgit2** (for the most part) only implements the core plumbing -// functions, not really the higher level porcelain stuff. For a primer on -// Git Internals that you will need to know to work with Git at this level, -// check out [Chapter 9][pg] of the Pro Git book. -// -// [lg]: http://libgit2.github.com -// [ap]: http://libgit2.github.com/libgit2 -// [pg]: http://progit.org/book/ch9-0.html - -// ### Includes - -// Including the `git2.h` header will include all the other libgit2 headers -// that you need. It should be the only thing you need to include in order -// to compile properly and get all the libgit2 API. -#include -#include - -// Almost all libgit2 functions return 0 on success or negative on error. -// This is not production quality error checking, but should be sufficient -// as an example. -static void check_error(int error_code, const char *action) -{ - const git_error *error = giterr_last(); - if (!error_code) - return; - - printf("Error %d %s - %s\n", error_code, action, - (error && error->message) ? error->message : "???"); - - exit(1); -} - -int main (int argc, char** argv) -{ - // Initialize the library, this will set up any global state which libgit2 needs - // including threading and crypto - git_libgit2_init(); - - // ### Opening the Repository - - // There are a couple of methods for opening a repository, this being the - // simplest. There are also [methods][me] for specifying the index file - // and work tree locations, here we assume they are in the normal places. - // - // (Try running this program against tests/resources/testrepo.git.) - // - // [me]: http://libgit2.github.com/libgit2/#HEAD/group/repository - int error; - const char *repo_path = (argc > 1) ? argv[1] : "/opt/libgit2-test/.git"; - git_repository *repo; - - error = git_repository_open(&repo, repo_path); - check_error(error, "opening repository"); - - // ### SHA-1 Value Conversions - - // For our first example, we will convert a 40 character hex value to the - // 20 byte raw SHA1 value. - printf("*Hex to Raw*\n"); - char hex[] = "4a202b346bb0fb0db7eff3cffeb3c70babbd2045"; - - // The `git_oid` is the structure that keeps the SHA value. We will use - // this throughout the example for storing the value of the current SHA - // key we're working with. - git_oid oid; - git_oid_fromstr(&oid, hex); - - // Once we've converted the string into the oid value, we can get the raw - // value of the SHA by accessing `oid.id` - - // Next we will convert the 20 byte raw SHA1 value to a human readable 40 - // char hex value. - printf("\n*Raw to Hex*\n"); - char out[GIT_OID_HEXSZ+1]; - out[GIT_OID_HEXSZ] = '\0'; - - // If you have a oid, you can easily get the hex value of the SHA as well. - git_oid_fmt(out, &oid); - printf("SHA hex string: %s\n", out); - - // ### Working with the Object Database - - // **libgit2** provides [direct access][odb] to the object database. The - // object database is where the actual objects are stored in Git. For - // working with raw objects, we'll need to get this structure from the - // repository. - // - // [odb]: http://libgit2.github.com/libgit2/#HEAD/group/odb - git_odb *odb; - git_repository_odb(&odb, repo); - - // #### Raw Object Reading - - printf("\n*Raw Object Read*\n"); - git_odb_object *obj; - git_otype otype; - const unsigned char *data; - const char *str_type; - - // We can read raw objects directly from the object database if we have - // the oid (SHA) of the object. This allows us to access objects without - // knowing their type and inspect the raw bytes unparsed. - error = git_odb_read(&obj, odb, &oid); - check_error(error, "finding object in repository"); - - // A raw object only has three properties - the type (commit, blob, tree - // or tag), the size of the raw data and the raw, unparsed data itself. - // For a commit or tag, that raw data is human readable plain ASCII - // text. For a blob it is just file contents, so it could be text or - // binary data. For a tree it is a special binary format, so it's unlikely - // to be hugely helpful as a raw object. - data = (const unsigned char *)git_odb_object_data(obj); - otype = git_odb_object_type(obj); - - // We provide methods to convert from the object type which is an enum, to - // a string representation of that value (and vice-versa). - str_type = git_object_type2string(otype); - printf("object length and type: %d, %s\n", - (int)git_odb_object_size(obj), - str_type); - - // For proper memory management, close the object when you are done with - // it or it will leak memory. - git_odb_object_free(obj); - - // #### Raw Object Writing - - printf("\n*Raw Object Write*\n"); - - // You can also write raw object data to Git. This is pretty cool because - // it gives you direct access to the key/value properties of Git. Here - // we'll write a new blob object that just contains a simple string. - // Notice that we have to specify the object type as the `git_otype` enum. - git_odb_write(&oid, odb, "test data", sizeof("test data") - 1, GIT_OBJ_BLOB); - - // Now that we've written the object, we can check out what SHA1 was - // generated when the object was written to our database. - git_oid_fmt(out, &oid); - printf("Written Object: %s\n", out); - - // ### Object Parsing - - // libgit2 has methods to parse every object type in Git so you don't have - // to work directly with the raw data. This is much faster and simpler - // than trying to deal with the raw data yourself. - - // #### Commit Parsing - - // [Parsing commit objects][pco] is simple and gives you access to all the - // data in the commit - the author (name, email, datetime), committer - // (same), tree, message, encoding and parent(s). - // - // [pco]: http://libgit2.github.com/libgit2/#HEAD/group/commit - - printf("\n*Commit Parsing*\n"); - - git_commit *commit; - git_oid_fromstr(&oid, "8496071c1b46c854b31185ea97743be6a8774479"); - - error = git_commit_lookup(&commit, repo, &oid); - check_error(error, "looking up commit"); - - const git_signature *author, *cmtter; - const char *message; - time_t ctime; - unsigned int parents, p; - - // Each of the properties of the commit object are accessible via methods, - // including commonly needed variations, such as `git_commit_time` which - // returns the author time and `git_commit_message` which gives you the - // commit message (as a NUL-terminated string). - message = git_commit_message(commit); - author = git_commit_author(commit); - cmtter = git_commit_committer(commit); - ctime = git_commit_time(commit); - - // The author and committer methods return [git_signature] structures, - // which give you name, email and `when`, which is a `git_time` structure, - // giving you a timestamp and timezone offset. - printf("Author: %s (%s)\n", author->name, author->email); - - // Commits can have zero or more parents. The first (root) commit will - // have no parents, most commits will have one (i.e. the commit it was - // based on) and merge commits will have two or more. Commits can - // technically have any number, though it's rare to have more than two. - parents = git_commit_parentcount(commit); - for (p = 0;p < parents;p++) { - git_commit *parent; - git_commit_parent(&parent, commit, p); - git_oid_fmt(out, git_commit_id(parent)); - printf("Parent: %s\n", out); - git_commit_free(parent); - } - - // Don't forget to close the object to prevent memory leaks. You will have - // to do this for all the objects you open and parse. - git_commit_free(commit); - - // #### Writing Commits - - // libgit2 provides a couple of methods to create commit objects easily as - // well. There are four different create signatures, we'll just show one - // of them here. You can read about the other ones in the [commit API - // docs][cd]. - // - // [cd]: http://libgit2.github.com/libgit2/#HEAD/group/commit - - printf("\n*Commit Writing*\n"); - git_oid tree_id, parent_id, commit_id; - git_tree *tree; - git_commit *parent; - - // Creating signatures for an authoring identity and time is simple. You - // will need to do this to specify who created a commit and when. Default - // values for the name and email should be found in the `user.name` and - // `user.email` configuration options. See the `config` section of this - // example file to see how to access config values. - git_signature_new((git_signature **)&author, - "Scott Chacon", "schacon@gmail.com", 123456789, 60); - git_signature_new((git_signature **)&cmtter, - "Scott A Chacon", "scott@github.com", 987654321, 90); - - // Commit objects need a tree to point to and optionally one or more - // parents. Here we're creating oid objects to create the commit with, - // but you can also use - git_oid_fromstr(&tree_id, "f60079018b664e4e79329a7ef9559c8d9e0378d1"); - git_tree_lookup(&tree, repo, &tree_id); - git_oid_fromstr(&parent_id, "5b5b025afb0b4c913b4c338a42934a3863bf3644"); - git_commit_lookup(&parent, repo, &parent_id); - - // Here we actually create the commit object with a single call with all - // the values we need to create the commit. The SHA key is written to the - // `commit_id` variable here. - git_commit_create_v( - &commit_id, /* out id */ - repo, - NULL, /* do not update the HEAD */ - author, - cmtter, - NULL, /* use default message encoding */ - "example commit", - tree, - 1, parent); - - // Now we can take a look at the commit SHA we've generated. - git_oid_fmt(out, &commit_id); - printf("New Commit: %s\n", out); - - // #### Tag Parsing - - // You can parse and create tags with the [tag management API][tm], which - // functions very similarly to the commit lookup, parsing and creation - // methods, since the objects themselves are very similar. - // - // [tm]: http://libgit2.github.com/libgit2/#HEAD/group/tag - printf("\n*Tag Parsing*\n"); - git_tag *tag; - const char *tmessage, *tname; - git_otype ttype; - - // We create an oid for the tag object if we know the SHA and look it up - // the same way that we would a commit (or any other object). - git_oid_fromstr(&oid, "b25fa35b38051e4ae45d4222e795f9df2e43f1d1"); - - error = git_tag_lookup(&tag, repo, &oid); - check_error(error, "looking up tag"); - - // Now that we have the tag object, we can extract the information it - // generally contains: the target (usually a commit object), the type of - // the target object (usually 'commit'), the name ('v1.0'), the tagger (a - // git_signature - name, email, timestamp), and the tag message. - git_tag_target((git_object **)&commit, tag); - tname = git_tag_name(tag); // "test" - ttype = git_tag_target_type(tag); // GIT_OBJ_COMMIT (otype enum) - tmessage = git_tag_message(tag); // "tag message\n" - printf("Tag Message: %s\n", tmessage); - - git_commit_free(commit); - - // #### Tree Parsing - - // [Tree parsing][tp] is a bit different than the other objects, in that - // we have a subtype which is the tree entry. This is not an actual - // object type in Git, but a useful structure for parsing and traversing - // tree entries. - // - // [tp]: http://libgit2.github.com/libgit2/#HEAD/group/tree - printf("\n*Tree Parsing*\n"); - - const git_tree_entry *entry; - git_object *objt; - - // Create the oid and lookup the tree object just like the other objects. - git_oid_fromstr(&oid, "2a741c18ac5ff082a7caaec6e74db3075a1906b5"); - git_tree_lookup(&tree, repo, &oid); - - // Getting the count of entries in the tree so you can iterate over them - // if you want to. - size_t cnt = git_tree_entrycount(tree); // 3 - printf("tree entries: %d\n", (int)cnt); - - entry = git_tree_entry_byindex(tree, 0); - printf("Entry name: %s\n", git_tree_entry_name(entry)); // "hello.c" - - // You can also access tree entries by name if you know the name of the - // entry you're looking for. - entry = git_tree_entry_byname(tree, "README"); - git_tree_entry_name(entry); // "hello.c" - - // Once you have the entry object, you can access the content or subtree - // (or commit, in the case of submodules) that it points to. You can also - // get the mode if you want. - git_tree_entry_to_object(&objt, repo, entry); // blob - - // Remember to close the looked-up object once you are done using it - git_object_free(objt); - - // #### Blob Parsing - - // The last object type is the simplest and requires the least parsing - // help. Blobs are just file contents and can contain anything, there is - // no structure to it. The main advantage to using the [simple blob - // api][ba] is that when you're creating blobs you don't have to calculate - // the size of the content. There is also a helper for reading a file - // from disk and writing it to the db and getting the oid back so you - // don't have to do all those steps yourself. - // - // [ba]: http://libgit2.github.com/libgit2/#HEAD/group/blob - - printf("\n*Blob Parsing*\n"); - git_blob *blob; - - git_oid_fromstr(&oid, "1385f264afb75a56a5bec74243be9b367ba4ca08"); - git_blob_lookup(&blob, repo, &oid); - - // You can access a buffer with the raw contents of the blob directly. - // Note that this buffer may not be contain ASCII data for certain blobs - // (e.g. binary files): do not consider the buffer a NULL-terminated - // string, and use the `git_blob_rawsize` attribute to find out its exact - // size in bytes - printf("Blob Size: %ld\n", (long)git_blob_rawsize(blob)); // 8 - git_blob_rawcontent(blob); // "content" - - // ### Revwalking - - // The libgit2 [revision walking api][rw] provides methods to traverse the - // directed graph created by the parent pointers of the commit objects. - // Since all commits point back to the commit that came directly before - // them, you can walk this parentage as a graph and find all the commits - // that were ancestors of (reachable from) a given starting point. This - // can allow you to create `git log` type functionality. - // - // [rw]: http://libgit2.github.com/libgit2/#HEAD/group/revwalk - - printf("\n*Revwalking*\n"); - git_revwalk *walk; - git_commit *wcommit; - - git_oid_fromstr(&oid, "5b5b025afb0b4c913b4c338a42934a3863bf3644"); - - // To use the revwalker, create a new walker, tell it how you want to sort - // the output and then push one or more starting points onto the walker. - // If you want to emulate the output of `git log` you would push the SHA - // of the commit that HEAD points to into the walker and then start - // traversing them. You can also 'hide' commits that you want to stop at - // or not see any of their ancestors. So if you want to emulate `git log - // branch1..branch2`, you would push the oid of `branch2` and hide the oid - // of `branch1`. - git_revwalk_new(&walk, repo); - git_revwalk_sorting(walk, GIT_SORT_TOPOLOGICAL | GIT_SORT_REVERSE); - git_revwalk_push(walk, &oid); - - const git_signature *cauth; - const char *cmsg; - - // Now that we have the starting point pushed onto the walker, we start - // asking for ancestors. It will return them in the sorting order we asked - // for as commit oids. We can then lookup and parse the committed pointed - // at by the returned OID; note that this operation is specially fast - // since the raw contents of the commit object will be cached in memory - while ((git_revwalk_next(&oid, walk)) == 0) { - error = git_commit_lookup(&wcommit, repo, &oid); - check_error(error, "looking up commit during revwalk"); - - cmsg = git_commit_message(wcommit); - cauth = git_commit_author(wcommit); - printf("%s (%s)\n", cmsg, cauth->email); - - git_commit_free(wcommit); - } - - // Like the other objects, be sure to free the revwalker when you're done - // to prevent memory leaks. Also, make sure that the repository being - // walked it not deallocated while the walk is in progress, or it will - // result in undefined behavior - git_revwalk_free(walk); - - // ### Index File Manipulation - - // The [index file API][gi] allows you to read, traverse, update and write - // the Git index file (sometimes thought of as the staging area). - // - // [gi]: http://libgit2.github.com/libgit2/#HEAD/group/index - - printf("\n*Index Walking*\n"); - - git_index *index; - unsigned int i, ecount; - - // You can either open the index from the standard location in an open - // repository, as we're doing here, or you can open and manipulate any - // index file with `git_index_open_bare()`. The index for the repository - // will be located and loaded from disk. - git_repository_index(&index, repo); - - // For each entry in the index, you can get a bunch of information - // including the SHA (oid), path and mode which map to the tree objects - // that are written out. It also has filesystem properties to help - // determine what to inspect for changes (ctime, mtime, dev, ino, uid, - // gid, file_size and flags) All these properties are exported publicly in - // the `git_index_entry` struct - ecount = git_index_entrycount(index); - for (i = 0; i < ecount; ++i) { - const git_index_entry *e = git_index_get_byindex(index, i); - - printf("path: %s\n", e->path); - printf("mtime: %d\n", (int)e->mtime.seconds); - printf("fs: %d\n", (int)e->file_size); - } - - git_index_free(index); - - // ### References - - // The [reference API][ref] allows you to list, resolve, create and update - // references such as branches, tags and remote references (everything in - // the .git/refs directory). - // - // [ref]: http://libgit2.github.com/libgit2/#HEAD/group/reference - - printf("\n*Reference Listing*\n"); - - // Here we will implement something like `git for-each-ref` simply listing - // out all available references and the object SHA they resolve to. - git_strarray ref_list; - git_reference_list(&ref_list, repo); - - const char *refname; - git_reference *ref; - - // Now that we have the list of reference names, we can lookup each ref - // one at a time and resolve them to the SHA, then print both values out. - for (i = 0; i < ref_list.count; ++i) { - refname = ref_list.strings[i]; - git_reference_lookup(&ref, repo, refname); - - switch (git_reference_type(ref)) { - case GIT_REF_OID: - git_oid_fmt(out, git_reference_target(ref)); - printf("%s [%s]\n", refname, out); - break; - - case GIT_REF_SYMBOLIC: - printf("%s => %s\n", refname, git_reference_symbolic_target(ref)); - break; - default: - fprintf(stderr, "Unexpected reference type\n"); - exit(1); - } - } - - git_strarray_free(&ref_list); - - // ### Config Files - - // The [config API][config] allows you to list and updatee config values - // in any of the accessible config file locations (system, global, local). - // - // [config]: http://libgit2.github.com/libgit2/#HEAD/group/config - - printf("\n*Config Listing*\n"); - - const char *email; - int32_t j; - - git_config *cfg; - - // Open a config object so we can read global values from it. - char config_path[256]; - sprintf(config_path, "%s/config", repo_path); - check_error(git_config_open_ondisk(&cfg, config_path), "opening config"); - - git_config_get_int32(&j, cfg, "help.autocorrect"); - printf("Autocorrect: %d\n", j); - - git_config_get_string(&email, cfg, "user.email"); - printf("Email: %s\n", email); - - // Finally, when you're done with the repository, you can free it as well. - git_repository_free(repo); - - return 0; -} - diff --git a/vendor/libgit2/examples/init.c b/vendor/libgit2/examples/init.c deleted file mode 100644 index fe7a672246..0000000000 --- a/vendor/libgit2/examples/init.c +++ /dev/null @@ -1,253 +0,0 @@ -/* - * libgit2 "init" example - shows how to initialize a new repo - * - * Written by the libgit2 contributors - * - * To the extent possible under law, the author(s) have dedicated all copyright - * and related and neighboring rights to this software to the public domain - * worldwide. This software is distributed without any warranty. - * - * You should have received a copy of the CC0 Public Domain Dedication along - * with this software. If not, see - * . - */ - -#include "common.h" - -/** - * This is a sample program that is similar to "git init". See the - * documentation for that (try "git help init") to understand what this - * program is emulating. - * - * This demonstrates using the libgit2 APIs to initialize a new repository. - * - * This also contains a special additional option that regular "git init" - * does not support which is "--initial-commit" to make a first empty commit. - * That is demonstrated in the "create_initial_commit" helper function. - */ - -/** Forward declarations of helpers */ -struct opts { - int no_options; - int quiet; - int bare; - int initial_commit; - uint32_t shared; - const char *template; - const char *gitdir; - const char *dir; -}; -static void create_initial_commit(git_repository *repo); -static void parse_opts(struct opts *o, int argc, char *argv[]); - - -int main(int argc, char *argv[]) -{ - git_repository *repo = NULL; - struct opts o = { 1, 0, 0, 0, GIT_REPOSITORY_INIT_SHARED_UMASK, 0, 0, 0 }; - - git_libgit2_init(); - - parse_opts(&o, argc, argv); - - /* Initialize repository. */ - - if (o.no_options) { - /** - * No options were specified, so let's demonstrate the default - * simple case of git_repository_init() API usage... - */ - check_lg2(git_repository_init(&repo, o.dir, 0), - "Could not initialize repository", NULL); - } - else { - /** - * Some command line options were specified, so we'll use the - * extended init API to handle them - */ - git_repository_init_options initopts = GIT_REPOSITORY_INIT_OPTIONS_INIT; - initopts.flags = GIT_REPOSITORY_INIT_MKPATH; - - if (o.bare) - initopts.flags |= GIT_REPOSITORY_INIT_BARE; - - if (o.template) { - initopts.flags |= GIT_REPOSITORY_INIT_EXTERNAL_TEMPLATE; - initopts.template_path = o.template; - } - - if (o.gitdir) { - /** - * If you specified a separate git directory, then initialize - * the repository at that path and use the second path as the - * working directory of the repository (with a git-link file) - */ - initopts.workdir_path = o.dir; - o.dir = o.gitdir; - } - - if (o.shared != 0) - initopts.mode = o.shared; - - check_lg2(git_repository_init_ext(&repo, o.dir, &initopts), - "Could not initialize repository", NULL); - } - - /** Print a message to stdout like "git init" does. */ - - if (!o.quiet) { - if (o.bare || o.gitdir) - o.dir = git_repository_path(repo); - else - o.dir = git_repository_workdir(repo); - - printf("Initialized empty Git repository in %s\n", o.dir); - } - - /** - * As an extension to the basic "git init" command, this example - * gives the option to create an empty initial commit. This is - * mostly to demonstrate what it takes to do that, but also some - * people like to have that empty base commit in their repo. - */ - if (o.initial_commit) { - create_initial_commit(repo); - printf("Created empty initial commit\n"); - } - - git_repository_free(repo); - git_libgit2_shutdown(); - - return 0; -} - -/** - * Unlike regular "git init", this example shows how to create an initial - * empty commit in the repository. This is the helper function that does - * that. - */ -static void create_initial_commit(git_repository *repo) -{ - git_signature *sig; - git_index *index; - git_oid tree_id, commit_id; - git_tree *tree; - - /** First use the config to initialize a commit signature for the user. */ - - if (git_signature_default(&sig, repo) < 0) - fatal("Unable to create a commit signature.", - "Perhaps 'user.name' and 'user.email' are not set"); - - /* Now let's create an empty tree for this commit */ - - if (git_repository_index(&index, repo) < 0) - fatal("Could not open repository index", NULL); - - /** - * Outside of this example, you could call git_index_add_bypath() - * here to put actual files into the index. For our purposes, we'll - * leave it empty for now. - */ - - if (git_index_write_tree(&tree_id, index) < 0) - fatal("Unable to write initial tree from index", NULL); - - git_index_free(index); - - if (git_tree_lookup(&tree, repo, &tree_id) < 0) - fatal("Could not look up initial tree", NULL); - - /** - * Ready to create the initial commit. - * - * Normally creating a commit would involve looking up the current - * HEAD commit and making that be the parent of the initial commit, - * but here this is the first commit so there will be no parent. - */ - - if (git_commit_create_v( - &commit_id, repo, "HEAD", sig, sig, - NULL, "Initial commit", tree, 0) < 0) - fatal("Could not create the initial commit", NULL); - - /** Clean up so we don't leak memory. */ - - git_tree_free(tree); - git_signature_free(sig); -} - -static void usage(const char *error, const char *arg) -{ - fprintf(stderr, "error: %s '%s'\n", error, arg); - fprintf(stderr, - "usage: init [-q | --quiet] [--bare] [--template=]\n" - " [--shared[=perms]] [--initial-commit]\n" - " [--separate-git-dir] \n"); - exit(1); -} - -/** Parse the tail of the --shared= argument. */ -static uint32_t parse_shared(const char *shared) -{ - if (!strcmp(shared, "false") || !strcmp(shared, "umask")) - return GIT_REPOSITORY_INIT_SHARED_UMASK; - - else if (!strcmp(shared, "true") || !strcmp(shared, "group")) - return GIT_REPOSITORY_INIT_SHARED_GROUP; - - else if (!strcmp(shared, "all") || !strcmp(shared, "world") || - !strcmp(shared, "everybody")) - return GIT_REPOSITORY_INIT_SHARED_ALL; - - else if (shared[0] == '0') { - long val; - char *end = NULL; - val = strtol(shared + 1, &end, 8); - if (end == shared + 1 || *end != 0) - usage("invalid octal value for --shared", shared); - return (uint32_t)val; - } - - else - usage("unknown value for --shared", shared); - - return 0; -} - -static void parse_opts(struct opts *o, int argc, char *argv[]) -{ - struct args_info args = ARGS_INFO_INIT; - const char *sharedarg; - - /** Process arguments. */ - - for (args.pos = 1; args.pos < argc; ++args.pos) { - char *a = argv[args.pos]; - - if (a[0] == '-') - o->no_options = 0; - - if (a[0] != '-') { - if (o->dir != NULL) - usage("extra argument", a); - o->dir = a; - } - else if (!strcmp(a, "-q") || !strcmp(a, "--quiet")) - o->quiet = 1; - else if (!strcmp(a, "--bare")) - o->bare = 1; - else if (!strcmp(a, "--shared")) - o->shared = GIT_REPOSITORY_INIT_SHARED_GROUP; - else if (!strcmp(a, "--initial-commit")) - o->initial_commit = 1; - else if (match_str_arg(&sharedarg, &args, "--shared")) - o->shared = parse_shared(sharedarg); - else if (!match_str_arg(&o->template, &args, "--template") || - !match_str_arg(&o->gitdir, &args, "--separate-git-dir")) - usage("unknown option", a); - } - - if (!o->dir) - usage("must specify directory to init", NULL); -} diff --git a/vendor/libgit2/examples/log.c b/vendor/libgit2/examples/log.c deleted file mode 100644 index e54eed3cef..0000000000 --- a/vendor/libgit2/examples/log.c +++ /dev/null @@ -1,479 +0,0 @@ -/* - * libgit2 "log" example - shows how to walk history and get commit info - * - * Written by the libgit2 contributors - * - * To the extent possible under law, the author(s) have dedicated all copyright - * and related and neighboring rights to this software to the public domain - * worldwide. This software is distributed without any warranty. - * - * You should have received a copy of the CC0 Public Domain Dedication along - * with this software. If not, see - * . - */ - -#include "common.h" - -/** - * This example demonstrates the libgit2 rev walker APIs to roughly - * simulate the output of `git log` and a few of command line arguments. - * `git log` has many many options and this only shows a few of them. - * - * This does not have: - * - * - Robust error handling - * - Colorized or paginated output formatting - * - Most of the `git log` options - * - * This does have: - * - * - Examples of translating command line arguments to equivalent libgit2 - * revwalker configuration calls - * - Simplified options to apply pathspec limits and to show basic diffs - */ - -/** log_state represents walker being configured while handling options */ -struct log_state { - git_repository *repo; - const char *repodir; - git_revwalk *walker; - int hide; - int sorting; - int revisions; -}; - -/** utility functions that are called to configure the walker */ -static void set_sorting(struct log_state *s, unsigned int sort_mode); -static void push_rev(struct log_state *s, git_object *obj, int hide); -static int add_revision(struct log_state *s, const char *revstr); - -/** log_options holds other command line options that affect log output */ -struct log_options { - int show_diff; - int skip, limit; - int min_parents, max_parents; - git_time_t before; - git_time_t after; - const char *author; - const char *committer; - const char *grep; -}; - -/** utility functions that parse options and help with log output */ -static int parse_options( - struct log_state *s, struct log_options *opt, int argc, char **argv); -static void print_time(const git_time *intime, const char *prefix); -static void print_commit(git_commit *commit); -static int match_with_parent(git_commit *commit, int i, git_diff_options *); - -/** utility functions for filtering */ -static int signature_matches(const git_signature *sig, const char *filter); -static int log_message_matches(const git_commit *commit, const char *filter); - -int main(int argc, char *argv[]) -{ - int i, count = 0, printed = 0, parents, last_arg; - struct log_state s; - struct log_options opt; - git_diff_options diffopts = GIT_DIFF_OPTIONS_INIT; - git_oid oid; - git_commit *commit = NULL; - git_pathspec *ps = NULL; - - git_libgit2_init(); - - /** Parse arguments and set up revwalker. */ - - last_arg = parse_options(&s, &opt, argc, argv); - - diffopts.pathspec.strings = &argv[last_arg]; - diffopts.pathspec.count = argc - last_arg; - if (diffopts.pathspec.count > 0) - check_lg2(git_pathspec_new(&ps, &diffopts.pathspec), - "Building pathspec", NULL); - - if (!s.revisions) - add_revision(&s, NULL); - - /** Use the revwalker to traverse the history. */ - - printed = count = 0; - - for (; !git_revwalk_next(&oid, s.walker); git_commit_free(commit)) { - check_lg2(git_commit_lookup(&commit, s.repo, &oid), - "Failed to look up commit", NULL); - - parents = (int)git_commit_parentcount(commit); - if (parents < opt.min_parents) - continue; - if (opt.max_parents > 0 && parents > opt.max_parents) - continue; - - if (diffopts.pathspec.count > 0) { - int unmatched = parents; - - if (parents == 0) { - git_tree *tree; - check_lg2(git_commit_tree(&tree, commit), "Get tree", NULL); - if (git_pathspec_match_tree( - NULL, tree, GIT_PATHSPEC_NO_MATCH_ERROR, ps) != 0) - unmatched = 1; - git_tree_free(tree); - } else if (parents == 1) { - unmatched = match_with_parent(commit, 0, &diffopts) ? 0 : 1; - } else { - for (i = 0; i < parents; ++i) { - if (match_with_parent(commit, i, &diffopts)) - unmatched--; - } - } - - if (unmatched > 0) - continue; - } - - if (!signature_matches(git_commit_author(commit), opt.author)) - continue; - - if (!signature_matches(git_commit_committer(commit), opt.committer)) - continue; - - if (!log_message_matches(commit, opt.grep)) - continue; - - if (count++ < opt.skip) - continue; - if (opt.limit != -1 && printed++ >= opt.limit) { - git_commit_free(commit); - break; - } - - print_commit(commit); - - if (opt.show_diff) { - git_tree *a = NULL, *b = NULL; - git_diff *diff = NULL; - - if (parents > 1) - continue; - check_lg2(git_commit_tree(&b, commit), "Get tree", NULL); - if (parents == 1) { - git_commit *parent; - check_lg2(git_commit_parent(&parent, commit, 0), "Get parent", NULL); - check_lg2(git_commit_tree(&a, parent), "Tree for parent", NULL); - git_commit_free(parent); - } - - check_lg2(git_diff_tree_to_tree( - &diff, git_commit_owner(commit), a, b, &diffopts), - "Diff commit with parent", NULL); - check_lg2( - git_diff_print(diff, GIT_DIFF_FORMAT_PATCH, diff_output, NULL), - "Displaying diff", NULL); - - git_diff_free(diff); - git_tree_free(a); - git_tree_free(b); - } - } - - git_pathspec_free(ps); - git_revwalk_free(s.walker); - git_repository_free(s.repo); - git_libgit2_shutdown(); - - return 0; -} - -/** Determine if the given git_signature does not contain the filter text. */ -static int signature_matches(const git_signature *sig, const char *filter) { - if (filter == NULL) - return 1; - - if (sig != NULL && - (strstr(sig->name, filter) != NULL || - strstr(sig->email, filter) != NULL)) - return 1; - - return 0; -} - -static int log_message_matches(const git_commit *commit, const char *filter) { - const char *message = NULL; - - if (filter == NULL) - return 1; - - if ((message = git_commit_message(commit)) != NULL && - strstr(message, filter) != NULL) - return 1; - - return 0; -} - -/** Push object (for hide or show) onto revwalker. */ -static void push_rev(struct log_state *s, git_object *obj, int hide) -{ - hide = s->hide ^ hide; - - /** Create revwalker on demand if it doesn't already exist. */ - if (!s->walker) { - check_lg2(git_revwalk_new(&s->walker, s->repo), - "Could not create revision walker", NULL); - git_revwalk_sorting(s->walker, s->sorting); - } - - if (!obj) - check_lg2(git_revwalk_push_head(s->walker), - "Could not find repository HEAD", NULL); - else if (hide) - check_lg2(git_revwalk_hide(s->walker, git_object_id(obj)), - "Reference does not refer to a commit", NULL); - else - check_lg2(git_revwalk_push(s->walker, git_object_id(obj)), - "Reference does not refer to a commit", NULL); - - git_object_free(obj); -} - -/** Parse revision string and add revs to walker. */ -static int add_revision(struct log_state *s, const char *revstr) -{ - git_revspec revs; - int hide = 0; - - /** Open repo on demand if it isn't already open. */ - if (!s->repo) { - if (!s->repodir) s->repodir = "."; - check_lg2(git_repository_open_ext(&s->repo, s->repodir, 0, NULL), - "Could not open repository", s->repodir); - } - - if (!revstr) { - push_rev(s, NULL, hide); - return 0; - } - - if (*revstr == '^') { - revs.flags = GIT_REVPARSE_SINGLE; - hide = !hide; - - if (git_revparse_single(&revs.from, s->repo, revstr + 1) < 0) - return -1; - } else if (git_revparse(&revs, s->repo, revstr) < 0) - return -1; - - if ((revs.flags & GIT_REVPARSE_SINGLE) != 0) - push_rev(s, revs.from, hide); - else { - push_rev(s, revs.to, hide); - - if ((revs.flags & GIT_REVPARSE_MERGE_BASE) != 0) { - git_oid base; - check_lg2(git_merge_base(&base, s->repo, - git_object_id(revs.from), git_object_id(revs.to)), - "Could not find merge base", revstr); - check_lg2( - git_object_lookup(&revs.to, s->repo, &base, GIT_OBJ_COMMIT), - "Could not find merge base commit", NULL); - - push_rev(s, revs.to, hide); - } - - push_rev(s, revs.from, !hide); - } - - return 0; -} - -/** Update revwalker with sorting mode. */ -static void set_sorting(struct log_state *s, unsigned int sort_mode) -{ - /** Open repo on demand if it isn't already open. */ - if (!s->repo) { - if (!s->repodir) s->repodir = "."; - check_lg2(git_repository_open_ext(&s->repo, s->repodir, 0, NULL), - "Could not open repository", s->repodir); - } - - /** Create revwalker on demand if it doesn't already exist. */ - if (!s->walker) - check_lg2(git_revwalk_new(&s->walker, s->repo), - "Could not create revision walker", NULL); - - if (sort_mode == GIT_SORT_REVERSE) - s->sorting = s->sorting ^ GIT_SORT_REVERSE; - else - s->sorting = sort_mode | (s->sorting & GIT_SORT_REVERSE); - - git_revwalk_sorting(s->walker, s->sorting); -} - -/** Helper to format a git_time value like Git. */ -static void print_time(const git_time *intime, const char *prefix) -{ - char sign, out[32]; - struct tm *intm; - int offset, hours, minutes; - time_t t; - - offset = intime->offset; - if (offset < 0) { - sign = '-'; - offset = -offset; - } else { - sign = '+'; - } - - hours = offset / 60; - minutes = offset % 60; - - t = (time_t)intime->time + (intime->offset * 60); - - intm = gmtime(&t); - strftime(out, sizeof(out), "%a %b %e %T %Y", intm); - - printf("%s%s %c%02d%02d\n", prefix, out, sign, hours, minutes); -} - -/** Helper to print a commit object. */ -static void print_commit(git_commit *commit) -{ - char buf[GIT_OID_HEXSZ + 1]; - int i, count; - const git_signature *sig; - const char *scan, *eol; - - git_oid_tostr(buf, sizeof(buf), git_commit_id(commit)); - printf("commit %s\n", buf); - - if ((count = (int)git_commit_parentcount(commit)) > 1) { - printf("Merge:"); - for (i = 0; i < count; ++i) { - git_oid_tostr(buf, 8, git_commit_parent_id(commit, i)); - printf(" %s", buf); - } - printf("\n"); - } - - if ((sig = git_commit_author(commit)) != NULL) { - printf("Author: %s <%s>\n", sig->name, sig->email); - print_time(&sig->when, "Date: "); - } - printf("\n"); - - for (scan = git_commit_message(commit); scan && *scan; ) { - for (eol = scan; *eol && *eol != '\n'; ++eol) /* find eol */; - - printf(" %.*s\n", (int)(eol - scan), scan); - scan = *eol ? eol + 1 : NULL; - } - printf("\n"); -} - -/** Helper to find how many files in a commit changed from its nth parent. */ -static int match_with_parent(git_commit *commit, int i, git_diff_options *opts) -{ - git_commit *parent; - git_tree *a, *b; - git_diff *diff; - int ndeltas; - - check_lg2( - git_commit_parent(&parent, commit, (size_t)i), "Get parent", NULL); - check_lg2(git_commit_tree(&a, parent), "Tree for parent", NULL); - check_lg2(git_commit_tree(&b, commit), "Tree for commit", NULL); - check_lg2( - git_diff_tree_to_tree(&diff, git_commit_owner(commit), a, b, opts), - "Checking diff between parent and commit", NULL); - - ndeltas = (int)git_diff_num_deltas(diff); - - git_diff_free(diff); - git_tree_free(a); - git_tree_free(b); - git_commit_free(parent); - - return ndeltas > 0; -} - -/** Print a usage message for the program. */ -static void usage(const char *message, const char *arg) -{ - if (message && arg) - fprintf(stderr, "%s: %s\n", message, arg); - else if (message) - fprintf(stderr, "%s\n", message); - fprintf(stderr, "usage: log []\n"); - exit(1); -} - -/** Parse some log command line options. */ -static int parse_options( - struct log_state *s, struct log_options *opt, int argc, char **argv) -{ - struct args_info args = ARGS_INFO_INIT; - - memset(s, 0, sizeof(*s)); - s->sorting = GIT_SORT_TIME; - - memset(opt, 0, sizeof(*opt)); - opt->max_parents = -1; - opt->limit = -1; - - for (args.pos = 1; args.pos < argc; ++args.pos) { - const char *a = argv[args.pos]; - - if (a[0] != '-') { - if (!add_revision(s, a)) - s->revisions++; - else - /** Try failed revision parse as filename. */ - break; - } else if (!strcmp(a, "--")) { - ++args.pos; - break; - } - else if (!strcmp(a, "--date-order")) - set_sorting(s, GIT_SORT_TIME); - else if (!strcmp(a, "--topo-order")) - set_sorting(s, GIT_SORT_TOPOLOGICAL); - else if (!strcmp(a, "--reverse")) - set_sorting(s, GIT_SORT_REVERSE); - else if (match_str_arg(&opt->author, &args, "--author")) - /** Found valid --author */; - else if (match_str_arg(&opt->committer, &args, "--committer")) - /** Found valid --committer */; - else if (match_str_arg(&opt->grep, &args, "--grep")) - /** Found valid --grep */; - else if (match_str_arg(&s->repodir, &args, "--git-dir")) - /** Found git-dir. */; - else if (match_int_arg(&opt->skip, &args, "--skip", 0)) - /** Found valid --skip. */; - else if (match_int_arg(&opt->limit, &args, "--max-count", 0)) - /** Found valid --max-count. */; - else if (a[1] >= '0' && a[1] <= '9') - is_integer(&opt->limit, a + 1, 0); - else if (match_int_arg(&opt->limit, &args, "-n", 0)) - /** Found valid -n. */; - else if (!strcmp(a, "--merges")) - opt->min_parents = 2; - else if (!strcmp(a, "--no-merges")) - opt->max_parents = 1; - else if (!strcmp(a, "--no-min-parents")) - opt->min_parents = 0; - else if (!strcmp(a, "--no-max-parents")) - opt->max_parents = -1; - else if (match_int_arg(&opt->max_parents, &args, "--max-parents=", 1)) - /** Found valid --max-parents. */; - else if (match_int_arg(&opt->min_parents, &args, "--min-parents=", 0)) - /** Found valid --min_parents. */; - else if (!strcmp(a, "-p") || !strcmp(a, "-u") || !strcmp(a, "--patch")) - opt->show_diff = 1; - else - usage("Unsupported argument", a); - } - - return args.pos; -} - diff --git a/vendor/libgit2/examples/network/.gitignore b/vendor/libgit2/examples/network/.gitignore deleted file mode 100644 index 1b48e66ed9..0000000000 --- a/vendor/libgit2/examples/network/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/git2 diff --git a/vendor/libgit2/examples/network/Makefile b/vendor/libgit2/examples/network/Makefile deleted file mode 100644 index f65c6cb26d..0000000000 --- a/vendor/libgit2/examples/network/Makefile +++ /dev/null @@ -1,22 +0,0 @@ -default: all - -CC = gcc -CFLAGS += -g -CFLAGS += -I../../include -LDFLAGS += -L../../build -L../.. -LIBRARIES += -lgit2 -lpthread - -OBJECTS = \ - git2.o \ - ls-remote.o \ - fetch.o \ - clone.o \ - index-pack.o \ - common.o - -all: $(OBJECTS) - $(CC) $(CFLAGS) $(LDFLAGS) -o git2 $(OBJECTS) $(LIBRARIES) - -clean: - $(RM) $(OBJECTS) - $(RM) git2 diff --git a/vendor/libgit2/examples/network/clone.c b/vendor/libgit2/examples/network/clone.c deleted file mode 100644 index caf41cca84..0000000000 --- a/vendor/libgit2/examples/network/clone.c +++ /dev/null @@ -1,113 +0,0 @@ -#include "common.h" -#include -#include -#include -#include -#include -#ifndef _WIN32 -# include -# include -#endif - -typedef struct progress_data { - git_transfer_progress fetch_progress; - size_t completed_steps; - size_t total_steps; - const char *path; -} progress_data; - -static void print_progress(const progress_data *pd) -{ - int network_percent = pd->fetch_progress.total_objects > 0 ? - (100*pd->fetch_progress.received_objects) / pd->fetch_progress.total_objects : - 0; - int index_percent = pd->fetch_progress.total_objects > 0 ? - (100*pd->fetch_progress.indexed_objects) / pd->fetch_progress.total_objects : - 0; - - int checkout_percent = pd->total_steps > 0 - ? (100 * pd->completed_steps) / pd->total_steps - : 0; - int kbytes = pd->fetch_progress.received_bytes / 1024; - - if (pd->fetch_progress.total_objects && - pd->fetch_progress.received_objects == pd->fetch_progress.total_objects) { - printf("Resolving deltas %d/%d\r", - pd->fetch_progress.indexed_deltas, - pd->fetch_progress.total_deltas); - } else { - printf("net %3d%% (%4d kb, %5d/%5d) / idx %3d%% (%5d/%5d) / chk %3d%% (%4" PRIuZ "/%4" PRIuZ ") %s\n", - network_percent, kbytes, - pd->fetch_progress.received_objects, pd->fetch_progress.total_objects, - index_percent, pd->fetch_progress.indexed_objects, pd->fetch_progress.total_objects, - checkout_percent, - pd->completed_steps, pd->total_steps, - pd->path); - } -} - -static int sideband_progress(const char *str, int len, void *payload) -{ - (void)payload; // unused - - printf("remote: %*s", len, str); - fflush(stdout); - return 0; -} - -static int fetch_progress(const git_transfer_progress *stats, void *payload) -{ - progress_data *pd = (progress_data*)payload; - pd->fetch_progress = *stats; - print_progress(pd); - return 0; -} -static void checkout_progress(const char *path, size_t cur, size_t tot, void *payload) -{ - progress_data *pd = (progress_data*)payload; - pd->completed_steps = cur; - pd->total_steps = tot; - pd->path = path; - print_progress(pd); -} - - -int do_clone(git_repository *repo, int argc, char **argv) -{ - progress_data pd = {{0}}; - git_repository *cloned_repo = NULL; - git_clone_options clone_opts = GIT_CLONE_OPTIONS_INIT; - git_checkout_options checkout_opts = GIT_CHECKOUT_OPTIONS_INIT; - const char *url = argv[1]; - const char *path = argv[2]; - int error; - - (void)repo; // unused - - // Validate args - if (argc < 3) { - printf ("USAGE: %s \n", argv[0]); - return -1; - } - - // Set up options - checkout_opts.checkout_strategy = GIT_CHECKOUT_SAFE; - checkout_opts.progress_cb = checkout_progress; - checkout_opts.progress_payload = &pd; - clone_opts.checkout_opts = checkout_opts; - clone_opts.fetch_opts.callbacks.sideband_progress = sideband_progress; - clone_opts.fetch_opts.callbacks.transfer_progress = &fetch_progress; - clone_opts.fetch_opts.callbacks.credentials = cred_acquire_cb; - clone_opts.fetch_opts.callbacks.payload = &pd; - - // Do the clone - error = git_clone(&cloned_repo, url, path, &clone_opts); - printf("\n"); - if (error != 0) { - const git_error *err = giterr_last(); - if (err) printf("ERROR %d: %s\n", err->klass, err->message); - else printf("ERROR %d: no detailed info\n", error); - } - else if (cloned_repo) git_repository_free(cloned_repo); - return error; -} diff --git a/vendor/libgit2/examples/network/common.c b/vendor/libgit2/examples/network/common.c deleted file mode 100644 index d123eedbd9..0000000000 --- a/vendor/libgit2/examples/network/common.c +++ /dev/null @@ -1,34 +0,0 @@ -#include "common.h" -#include - -/* Shamelessly borrowed from http://stackoverflow.com/questions/3417837/ - * with permission of the original author, Martin Pool. - * http://sourcefrog.net/weblog/software/languages/C/unused.html - */ -#ifdef UNUSED -#elif defined(__GNUC__) -# define UNUSED(x) UNUSED_ ## x __attribute__((unused)) -#elif defined(__LCLINT__) -# define UNUSED(x) /*@unused@*/ x -#else -# define UNUSED(x) x -#endif - -int cred_acquire_cb(git_cred **out, - const char * UNUSED(url), - const char * UNUSED(username_from_url), - unsigned int UNUSED(allowed_types), - void * UNUSED(payload)) -{ - char username[128] = {0}; - char password[128] = {0}; - - printf("Username: "); - scanf("%s", username); - - /* Yup. Right there on your terminal. Careful where you copy/paste output. */ - printf("Password: "); - scanf("%s", password); - - return git_cred_userpass_plaintext_new(out, username, password); -} diff --git a/vendor/libgit2/examples/network/common.h b/vendor/libgit2/examples/network/common.h deleted file mode 100644 index 1b09caad41..0000000000 --- a/vendor/libgit2/examples/network/common.h +++ /dev/null @@ -1,30 +0,0 @@ -#ifndef __COMMON_H__ -#define __COMMON_H__ - -#include - -typedef int (*git_cb)(git_repository *, int , char **); - -int ls_remote(git_repository *repo, int argc, char **argv); -int parse_pkt_line(git_repository *repo, int argc, char **argv); -int show_remote(git_repository *repo, int argc, char **argv); -int fetch(git_repository *repo, int argc, char **argv); -int index_pack(git_repository *repo, int argc, char **argv); -int do_clone(git_repository *repo, int argc, char **argv); - -int cred_acquire_cb(git_cred **out, - const char * url, - const char * username_from_url, - unsigned int allowed_types, - void *payload); - -#ifndef PRIuZ -/* Define the printf format specifer to use for size_t output */ -#if defined(_MSC_VER) || defined(__MINGW32__) -# define PRIuZ "Iu" -#else -# define PRIuZ "zu" -#endif -#endif - -#endif /* __COMMON_H__ */ diff --git a/vendor/libgit2/examples/network/fetch.c b/vendor/libgit2/examples/network/fetch.c deleted file mode 100644 index 6be12406b8..0000000000 --- a/vendor/libgit2/examples/network/fetch.c +++ /dev/null @@ -1,170 +0,0 @@ -#include "common.h" -#include -#include -#include -#include -#ifndef _WIN32 -# include -# include -#endif - -struct dl_data { - git_remote *remote; - git_fetch_options *fetch_opts; - int ret; - int finished; -}; - -static int progress_cb(const char *str, int len, void *data) -{ - (void)data; - printf("remote: %.*s", len, str); - fflush(stdout); /* We don't have the \n to force the flush */ - return 0; -} - -static void *download(void *ptr) -{ - struct dl_data *data = (struct dl_data *)ptr; - - // Connect to the remote end specifying that we want to fetch - // information from it. - if (git_remote_connect(data->remote, GIT_DIRECTION_FETCH, &data->fetch_opts->callbacks) < 0) { - data->ret = -1; - goto exit; - } - - // Download the packfile and index it. This function updates the - // amount of received data and the indexer stats which lets you - // inform the user about progress. - if (git_remote_download(data->remote, NULL, data->fetch_opts) < 0) { - data->ret = -1; - goto exit; - } - - data->ret = 0; - -exit: - data->finished = 1; - return &data->ret; -} - -/** - * This function gets called for each remote-tracking branch that gets - * updated. The message we output depends on whether it's a new one or - * an update. - */ -static int update_cb(const char *refname, const git_oid *a, const git_oid *b, void *data) -{ - char a_str[GIT_OID_HEXSZ+1], b_str[GIT_OID_HEXSZ+1]; - (void)data; - - git_oid_fmt(b_str, b); - b_str[GIT_OID_HEXSZ] = '\0'; - - if (git_oid_iszero(a)) { - printf("[new] %.20s %s\n", b_str, refname); - } else { - git_oid_fmt(a_str, a); - a_str[GIT_OID_HEXSZ] = '\0'; - printf("[updated] %.10s..%.10s %s\n", a_str, b_str, refname); - } - - return 0; -} - -/** Entry point for this command */ -int fetch(git_repository *repo, int argc, char **argv) -{ - git_remote *remote = NULL; - const git_transfer_progress *stats; - struct dl_data data; - git_fetch_options fetch_opts = GIT_FETCH_OPTIONS_INIT; -#ifndef _WIN32 - pthread_t worker; -#endif - - if (argc < 2) { - fprintf(stderr, "usage: %s fetch \n", argv[-1]); - return EXIT_FAILURE; - } - - // Figure out whether it's a named remote or a URL - printf("Fetching %s for repo %p\n", argv[1], repo); - if (git_remote_lookup(&remote, repo, argv[1]) < 0) { - if (git_remote_create_anonymous(&remote, repo, argv[1]) < 0) - return -1; - } - - // Set up the callbacks (only update_tips for now) - fetch_opts.callbacks.update_tips = &update_cb; - fetch_opts.callbacks.sideband_progress = &progress_cb; - fetch_opts.callbacks.credentials = cred_acquire_cb; - - // Set up the information for the background worker thread - data.remote = remote; - data.fetch_opts = &fetch_opts; - data.ret = 0; - data.finished = 0; - - stats = git_remote_stats(remote); - -#ifdef _WIN32 - download(&data); -#else - pthread_create(&worker, NULL, download, &data); - - // Loop while the worker thread is still running. Here we show processed - // and total objects in the pack and the amount of received - // data. Most frontends will probably want to show a percentage and - // the download rate. - do { - usleep(10000); - - if (stats->received_objects == stats->total_objects) { - printf("Resolving deltas %d/%d\r", - stats->indexed_deltas, stats->total_deltas); - } else if (stats->total_objects > 0) { - printf("Received %d/%d objects (%d) in %" PRIuZ " bytes\r", - stats->received_objects, stats->total_objects, - stats->indexed_objects, stats->received_bytes); - } - } while (!data.finished); - - if (data.ret < 0) - goto on_error; - - pthread_join(worker, NULL); -#endif - - /** - * If there are local objects (we got a thin pack), then tell - * the user how many objects we saved from having to cross the - * network. - */ - if (stats->local_objects > 0) { - printf("\rReceived %d/%d objects in %" PRIuZ " bytes (used %d local objects)\n", - stats->indexed_objects, stats->total_objects, stats->received_bytes, stats->local_objects); - } else{ - printf("\rReceived %d/%d objects in %" PRIuZ "bytes\n", - stats->indexed_objects, stats->total_objects, stats->received_bytes); - } - - // Disconnect the underlying connection to prevent from idling. - git_remote_disconnect(remote); - - // Update the references in the remote's namespace to point to the - // right commits. This may be needed even if there was no packfile - // to download, which can happen e.g. when the branches have been - // changed but all the needed objects are available locally. - if (git_remote_update_tips(remote, &fetch_opts.callbacks, 1, fetch_opts.download_tags, NULL) < 0) - return -1; - - git_remote_free(remote); - - return 0; - - on_error: - git_remote_free(remote); - return -1; -} diff --git a/vendor/libgit2/examples/network/git2.c b/vendor/libgit2/examples/network/git2.c deleted file mode 100644 index 448103c463..0000000000 --- a/vendor/libgit2/examples/network/git2.c +++ /dev/null @@ -1,73 +0,0 @@ -#include -#include -#include - -#include "common.h" - -// This part is not strictly libgit2-dependent, but you can use this -// as a starting point for a git-like tool - -struct { - char *name; - git_cb fn; -} commands[] = { - {"ls-remote", ls_remote}, - {"fetch", fetch}, - {"clone", do_clone}, - {"index-pack", index_pack}, - { NULL, NULL} -}; - -static int run_command(git_cb fn, int argc, char **argv) -{ - int error; - git_repository *repo; - - // Before running the actual command, create an instance of the local - // repository and pass it to the function. - - error = git_repository_open(&repo, ".git"); - if (error < 0) - repo = NULL; - - // Run the command. If something goes wrong, print the error message to stderr - error = fn(repo, argc, argv); - if (error < 0) { - if (giterr_last() == NULL) - fprintf(stderr, "Error without message"); - else - fprintf(stderr, "Bad news:\n %s\n", giterr_last()->message); - } - - if(repo) - git_repository_free(repo); - - return !!error; -} - -int main(int argc, char **argv) -{ - int i; - int return_code = 1; - - if (argc < 2) { - fprintf(stderr, "usage: %s [repo]\n", argv[0]); - exit(EXIT_FAILURE); - } - - git_libgit2_init(); - - for (i = 0; commands[i].name != NULL; ++i) { - if (!strcmp(argv[1], commands[i].name)) { - return_code = run_command(commands[i].fn, --argc, ++argv); - goto shutdown; - } - } - - fprintf(stderr, "Command not found: %s\n", argv[1]); - -shutdown: - git_libgit2_shutdown(); - - return return_code; -} diff --git a/vendor/libgit2/examples/network/index-pack.c b/vendor/libgit2/examples/network/index-pack.c deleted file mode 100644 index 314f211609..0000000000 --- a/vendor/libgit2/examples/network/index-pack.c +++ /dev/null @@ -1,88 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#ifdef _WIN32 -# include -# include - -# define open _open -# define read _read -# define close _close - -#define ssize_t unsigned int -#else -# include -#endif -#include "common.h" - -// This could be run in the main loop whilst the application waits for -// the indexing to finish in a worker thread -static int index_cb(const git_transfer_progress *stats, void *data) -{ - (void)data; - printf("\rProcessing %d of %d", stats->indexed_objects, stats->total_objects); - - return 0; -} - -int index_pack(git_repository *repo, int argc, char **argv) -{ - git_indexer *idx; - git_transfer_progress stats = {0, 0}; - int error; - char hash[GIT_OID_HEXSZ + 1] = {0}; - int fd; - ssize_t read_bytes; - char buf[512]; - - (void)repo; - - if (argc < 2) { - fprintf(stderr, "usage: %s index-pack \n", argv[-1]); - return EXIT_FAILURE; - } - - if (git_indexer_new(&idx, ".", 0, NULL, NULL, NULL) < 0) { - puts("bad idx"); - return -1; - } - - if ((fd = open(argv[1], 0)) < 0) { - perror("open"); - return -1; - } - - do { - read_bytes = read(fd, buf, sizeof(buf)); - if (read_bytes < 0) - break; - - if ((error = git_indexer_append(idx, buf, read_bytes, &stats)) < 0) - goto cleanup; - - index_cb(&stats, NULL); - } while (read_bytes > 0); - - if (read_bytes < 0) { - error = -1; - perror("failed reading"); - goto cleanup; - } - - if ((error = git_indexer_commit(idx, &stats)) < 0) - goto cleanup; - - printf("\rIndexing %d of %d\n", stats.indexed_objects, stats.total_objects); - - git_oid_fmt(hash, git_indexer_hash(idx)); - puts(hash); - - cleanup: - close(fd); - git_indexer_free(idx); - return error; -} diff --git a/vendor/libgit2/examples/network/ls-remote.c b/vendor/libgit2/examples/network/ls-remote.c deleted file mode 100644 index 21026562f6..0000000000 --- a/vendor/libgit2/examples/network/ls-remote.c +++ /dev/null @@ -1,64 +0,0 @@ -#include -#include -#include -#include -#include "common.h" - -static int use_remote(git_repository *repo, char *name) -{ - git_remote *remote = NULL; - int error; - const git_remote_head **refs; - size_t refs_len, i; - git_remote_callbacks callbacks = GIT_REMOTE_CALLBACKS_INIT; - - // Find the remote by name - error = git_remote_lookup(&remote, repo, name); - if (error < 0) { - error = git_remote_create_anonymous(&remote, repo, name); - if (error < 0) - goto cleanup; - } - - /** - * Connect to the remote and call the printing function for - * each of the remote references. - */ - callbacks.credentials = cred_acquire_cb; - - error = git_remote_connect(remote, GIT_DIRECTION_FETCH, &callbacks); - if (error < 0) - goto cleanup; - - /** - * Get the list of references on the remote and print out - * their name next to what they point to. - */ - if (git_remote_ls(&refs, &refs_len, remote) < 0) - goto cleanup; - - for (i = 0; i < refs_len; i++) { - char oid[GIT_OID_HEXSZ + 1] = {0}; - git_oid_fmt(oid, &refs[i]->oid); - printf("%s\t%s\n", oid, refs[i]->name); - } - -cleanup: - git_remote_free(remote); - return error; -} - -/** Entry point for this command */ -int ls_remote(git_repository *repo, int argc, char **argv) -{ - int error; - - if (argc < 2) { - fprintf(stderr, "usage: %s ls-remote \n", argv[-1]); - return EXIT_FAILURE; - } - - error = use_remote(repo, argv[1]); - - return error; -} diff --git a/vendor/libgit2/examples/remote.c b/vendor/libgit2/examples/remote.c deleted file mode 100644 index e0d5a14068..0000000000 --- a/vendor/libgit2/examples/remote.c +++ /dev/null @@ -1,269 +0,0 @@ -/* - * libgit2 "remote" example - shows how to modify remotes for a repo - * - * Written by the libgit2 contributors - * - * To the extent possible under law, the author(s) have dedicated all copyright - * and related and neighboring rights to this software to the public domain - * worldwide. This software is distributed without any warranty. - * - * You should have received a copy of the CC0 Public Domain Dedication along - * with this software. If not, see - * . - */ - -#include "common.h" - -/** - * This is a sample program that is similar to "git remote". See the - * documentation for that (try "git help remote") to understand what this - * program is emulating. - * - * This demonstrates using the libgit2 APIs to modify remotes of a repository. - */ - -enum subcmd { - subcmd_add, - subcmd_remove, - subcmd_rename, - subcmd_seturl, - subcmd_show, -}; - -struct opts { - enum subcmd cmd; - - /* for command-specific args */ - int argc; - char **argv; -}; - -static int cmd_add(git_repository *repo, struct opts *o); -static int cmd_remove(git_repository *repo, struct opts *o); -static int cmd_rename(git_repository *repo, struct opts *o); -static int cmd_seturl(git_repository *repo, struct opts *o); -static int cmd_show(git_repository *repo, struct opts *o); - -static void parse_subcmd( - struct opts *opt, int argc, char **argv); -static void usage(const char *msg, const char *arg); - -int main(int argc, char *argv[]) -{ - int retval = 0; - struct opts opt = {0}; - git_buf buf = GIT_BUF_INIT_CONST(NULL, 0); - git_repository *repo = NULL; - - parse_subcmd(&opt, argc, argv); - - git_libgit2_init(); - - check_lg2(git_repository_discover(&buf, ".", 0, NULL), - "Could not find repository", NULL); - - check_lg2(git_repository_open(&repo, buf.ptr), - "Could not open repository", NULL); - git_buf_free(&buf); - - switch (opt.cmd) - { - case subcmd_add: - retval = cmd_add(repo, &opt); - break; - case subcmd_remove: - retval = cmd_remove(repo, &opt); - break; - case subcmd_rename: - retval = cmd_rename(repo, &opt); - break; - case subcmd_seturl: - retval = cmd_seturl(repo, &opt); - break; - case subcmd_show: - retval = cmd_show(repo, &opt); - break; - } - - git_libgit2_shutdown(); - - return retval; -} - -static int cmd_add(git_repository *repo, struct opts *o) -{ - char *name, *url; - git_remote *remote = {0}; - - if (o->argc != 2) - usage("you need to specify a name and URL", NULL); - - name = o->argv[0]; - url = o->argv[1]; - - check_lg2(git_remote_create(&remote, repo, name, url), - "could not create remote", NULL); - - return 0; -} - -static int cmd_remove(git_repository *repo, struct opts *o) -{ - char *name; - - if (o->argc != 1) - usage("you need to specify a name", NULL); - - name = o->argv[0]; - - check_lg2(git_remote_delete(repo, name), - "could not delete remote", name); - - return 0; -} - -static int cmd_rename(git_repository *repo, struct opts *o) -{ - int i, retval; - char *old, *new; - git_strarray problems = {0}; - - if (o->argc != 2) - usage("you need to specify old and new remote name", NULL); - - old = o->argv[0]; - new = o->argv[1]; - - retval = git_remote_rename(&problems, repo, old, new); - if (!retval) - return 0; - - for (i = 0; i < (int) problems.count; i++) { - puts(problems.strings[0]); - } - - git_strarray_free(&problems); - - return retval; -} - -static int cmd_seturl(git_repository *repo, struct opts *o) -{ - int i, retval, push = 0; - char *name = NULL, *url = NULL; - - for (i = 0; i < o->argc; i++) { - char *arg = o->argv[i]; - - if (!strcmp(arg, "--push")) { - push = 1; - } else if (arg[0] != '-' && name == NULL) { - name = arg; - } else if (arg[0] != '-' && url == NULL) { - url = arg; - } else { - usage("invalid argument to set-url", arg); - } - } - - if (name == NULL || url == NULL) - usage("you need to specify remote and the new URL", NULL); - - if (push) - retval = git_remote_set_pushurl(repo, name, url); - else - retval = git_remote_set_url(repo, name, url); - - check_lg2(retval, "could not set URL", url); - - return 0; -} - -static int cmd_show(git_repository *repo, struct opts *o) -{ - int i; - const char *arg, *name, *fetch, *push; - int verbose = 0; - git_strarray remotes = {0}; - git_remote *remote = {0}; - - for (i = 0; i < o->argc; i++) { - arg = o->argv[i]; - - if (!strcmp(arg, "-v") || !strcmp(arg, "--verbose")) { - verbose = 1; - } - } - - check_lg2(git_remote_list(&remotes, repo), - "could not retrieve remotes", NULL); - - for (i = 0; i < (int) remotes.count; i++) { - name = remotes.strings[i]; - if (!verbose) { - puts(name); - continue; - } - - check_lg2(git_remote_lookup(&remote, repo, name), - "could not look up remote", name); - - fetch = git_remote_url(remote); - if (fetch) - printf("%s\t%s (fetch)\n", name, fetch); - push = git_remote_pushurl(remote); - /* use fetch URL if no distinct push URL has been set */ - push = push ? push : fetch; - if (push) - printf("%s\t%s (push)\n", name, push); - - git_remote_free(remote); - } - - git_strarray_free(&remotes); - - return 0; -} - -static void parse_subcmd( - struct opts *opt, int argc, char **argv) -{ - char *arg = argv[1]; - enum subcmd cmd = 0; - - if (argc < 2) - usage("no command specified", NULL); - - if (!strcmp(arg, "add")) { - cmd = subcmd_add; - } else if (!strcmp(arg, "remove")) { - cmd = subcmd_remove; - } else if (!strcmp(arg, "rename")) { - cmd = subcmd_rename; - } else if (!strcmp(arg, "set-url")) { - cmd = subcmd_seturl; - } else if (!strcmp(arg, "show")) { - cmd = subcmd_show; - } else { - usage("command is not valid", arg); - } - opt->cmd = cmd; - - opt->argc = argc - 2; /* executable and subcommand are removed */ - opt->argv = argv + 2; -} - -static void usage(const char *msg, const char *arg) -{ - fputs("usage: remote add \n", stderr); - fputs(" remote remove \n", stderr); - fputs(" remote rename \n", stderr); - fputs(" remote set-url [--push] \n", stderr); - fputs(" remote show [-v|--verbose]\n", stderr); - - if (msg && !arg) - fprintf(stderr, "\n%s\n", msg); - else if (msg && arg) - fprintf(stderr, "\n%s: %s\n", msg, arg); - exit(1); -} diff --git a/vendor/libgit2/examples/rev-list.c b/vendor/libgit2/examples/rev-list.c deleted file mode 100644 index ee9afc4411..0000000000 --- a/vendor/libgit2/examples/rev-list.c +++ /dev/null @@ -1,121 +0,0 @@ -/* - * libgit2 "rev-list" example - shows how to transform a rev-spec into a list - * of commit ids - * - * Written by the libgit2 contributors - * - * To the extent possible under law, the author(s) have dedicated all copyright - * and related and neighboring rights to this software to the public domain - * worldwide. This software is distributed without any warranty. - * - * You should have received a copy of the CC0 Public Domain Dedication along - * with this software. If not, see - * . - */ - -#include "common.h" - -static int revwalk_parseopts(git_repository *repo, git_revwalk *walk, int nopts, char **opts); - -int main (int argc, char **argv) -{ - git_repository *repo; - git_revwalk *walk; - git_oid oid; - char buf[GIT_OID_HEXSZ+1]; - - git_libgit2_init(); - - check_lg2(git_repository_open_ext(&repo, ".", 0, NULL), "opening repository", NULL); - check_lg2(git_revwalk_new(&walk, repo), "allocating revwalk", NULL); - check_lg2(revwalk_parseopts(repo, walk, argc-1, argv+1), "parsing options", NULL); - - while (!git_revwalk_next(&oid, walk)) { - git_oid_fmt(buf, &oid); - buf[GIT_OID_HEXSZ] = '\0'; - printf("%s\n", buf); - } - - git_libgit2_shutdown(); - return 0; -} - -static int push_commit(git_revwalk *walk, const git_oid *oid, int hide) -{ - if (hide) - return git_revwalk_hide(walk, oid); - else - return git_revwalk_push(walk, oid); -} - -static int push_spec(git_repository *repo, git_revwalk *walk, const char *spec, int hide) -{ - int error; - git_object *obj; - - if ((error = git_revparse_single(&obj, repo, spec)) < 0) - return error; - - error = push_commit(walk, git_object_id(obj), hide); - git_object_free(obj); - return error; -} - -static int push_range(git_repository *repo, git_revwalk *walk, const char *range, int hide) -{ - git_revspec revspec; - int error = 0; - - if ((error = git_revparse(&revspec, repo, range))) - return error; - - if (revspec.flags & GIT_REVPARSE_MERGE_BASE) { - /* TODO: support "..." */ - return GIT_EINVALIDSPEC; - } - - if ((error = push_commit(walk, git_object_id(revspec.from), !hide))) - goto out; - - error = push_commit(walk, git_object_id(revspec.to), hide); - -out: - git_object_free(revspec.from); - git_object_free(revspec.to); - return error; -} - -static int revwalk_parseopts(git_repository *repo, git_revwalk *walk, int nopts, char **opts) -{ - int hide, i, error; - unsigned int sorting = GIT_SORT_NONE; - - hide = 0; - for (i = 0; i < nopts; i++) { - if (!strcmp(opts[i], "--topo-order")) { - sorting = GIT_SORT_TOPOLOGICAL | (sorting & GIT_SORT_REVERSE); - git_revwalk_sorting(walk, sorting); - } else if (!strcmp(opts[i], "--date-order")) { - sorting = GIT_SORT_TIME | (sorting & GIT_SORT_REVERSE); - git_revwalk_sorting(walk, sorting); - } else if (!strcmp(opts[i], "--reverse")) { - sorting = (sorting & ~GIT_SORT_REVERSE) - | ((sorting & GIT_SORT_REVERSE) ? 0 : GIT_SORT_REVERSE); - git_revwalk_sorting(walk, sorting); - } else if (!strcmp(opts[i], "--not")) { - hide = !hide; - } else if (opts[i][0] == '^') { - if ((error = push_spec(repo, walk, opts[i] + 1, !hide))) - return error; - } else if (strstr(opts[i], "..")) { - if ((error = push_range(repo, walk, opts[i], hide))) - return error; - } else { - if ((error = push_spec(repo, walk, opts[i], hide))) - return error; - } - } - - return 0; -} - diff --git a/vendor/libgit2/examples/rev-parse.c b/vendor/libgit2/examples/rev-parse.c deleted file mode 100644 index 483d6e019b..0000000000 --- a/vendor/libgit2/examples/rev-parse.c +++ /dev/null @@ -1,115 +0,0 @@ -/* - * libgit2 "rev-parse" example - shows how to parse revspecs - * - * Written by the libgit2 contributors - * - * To the extent possible under law, the author(s) have dedicated all copyright - * and related and neighboring rights to this software to the public domain - * worldwide. This software is distributed without any warranty. - * - * You should have received a copy of the CC0 Public Domain Dedication along - * with this software. If not, see - * . - */ - -#include "common.h" - -/** Forward declarations for helpers. */ -struct parse_state { - git_repository *repo; - const char *repodir; - const char *spec; - int not; -}; -static void parse_opts(struct parse_state *ps, int argc, char *argv[]); -static int parse_revision(struct parse_state *ps); - - -int main(int argc, char *argv[]) -{ - struct parse_state ps = {0}; - - git_libgit2_init(); - parse_opts(&ps, argc, argv); - - check_lg2(parse_revision(&ps), "Parsing", NULL); - - git_repository_free(ps.repo); - git_libgit2_shutdown(); - - return 0; -} - -static void usage(const char *message, const char *arg) -{ - if (message && arg) - fprintf(stderr, "%s: %s\n", message, arg); - else if (message) - fprintf(stderr, "%s\n", message); - fprintf(stderr, "usage: rev-parse [ --option ] ...\n"); - exit(1); -} - -static void parse_opts(struct parse_state *ps, int argc, char *argv[]) -{ - struct args_info args = ARGS_INFO_INIT; - - for (args.pos=1; args.pos < argc; ++args.pos) { - const char *a = argv[args.pos]; - - if (a[0] != '-') { - if (ps->spec) - usage("Too many specs", a); - ps->spec = a; - } else if (!strcmp(a, "--not")) - ps->not = !ps->not; - else if (!match_str_arg(&ps->repodir, &args, "--git-dir")) - usage("Cannot handle argument", a); - } -} - -static int parse_revision(struct parse_state *ps) -{ - git_revspec rs; - char str[GIT_OID_HEXSZ + 1]; - - if (!ps->repo) { - if (!ps->repodir) - ps->repodir = "."; - check_lg2(git_repository_open_ext(&ps->repo, ps->repodir, 0, NULL), - "Could not open repository from", ps->repodir); - } - - check_lg2(git_revparse(&rs, ps->repo, ps->spec), "Could not parse", ps->spec); - - if ((rs.flags & GIT_REVPARSE_SINGLE) != 0) { - git_oid_tostr(str, sizeof(str), git_object_id(rs.from)); - printf("%s\n", str); - git_object_free(rs.from); - } - else if ((rs.flags & GIT_REVPARSE_RANGE) != 0) { - git_oid_tostr(str, sizeof(str), git_object_id(rs.to)); - printf("%s\n", str); - git_object_free(rs.to); - - if ((rs.flags & GIT_REVPARSE_MERGE_BASE) != 0) { - git_oid base; - check_lg2(git_merge_base(&base, ps->repo, - git_object_id(rs.from), git_object_id(rs.to)), - "Could not find merge base", ps->spec); - - git_oid_tostr(str, sizeof(str), &base); - printf("%s\n", str); - } - - git_oid_tostr(str, sizeof(str), git_object_id(rs.from)); - printf("^%s\n", str); - git_object_free(rs.from); - } - else { - fatal("Invalid results from git_revparse", ps->spec); - } - - return 0; -} - diff --git a/vendor/libgit2/examples/showindex.c b/vendor/libgit2/examples/showindex.c deleted file mode 100644 index 43be5e24cc..0000000000 --- a/vendor/libgit2/examples/showindex.c +++ /dev/null @@ -1,70 +0,0 @@ -/* - * libgit2 "showindex" example - shows how to extract data from the index - * - * Written by the libgit2 contributors - * - * To the extent possible under law, the author(s) have dedicated all copyright - * and related and neighboring rights to this software to the public domain - * worldwide. This software is distributed without any warranty. - * - * You should have received a copy of the CC0 Public Domain Dedication along - * with this software. If not, see - * . - */ - -#include "common.h" - -int main (int argc, char** argv) -{ - git_index *index; - unsigned int i, ecount; - char *dir = "."; - size_t dirlen; - char out[GIT_OID_HEXSZ+1]; - out[GIT_OID_HEXSZ] = '\0'; - - git_libgit2_init(); - - if (argc > 2) - fatal("usage: showindex []", NULL); - if (argc > 1) - dir = argv[1]; - - dirlen = strlen(dir); - if (dirlen > 5 && strcmp(dir + dirlen - 5, "index") == 0) { - check_lg2(git_index_open(&index, dir), "could not open index", dir); - } else { - git_repository *repo; - check_lg2(git_repository_open_ext(&repo, dir, 0, NULL), "could not open repository", dir); - check_lg2(git_repository_index(&index, repo), "could not open repository index", NULL); - git_repository_free(repo); - } - - git_index_read(index, 0); - - ecount = git_index_entrycount(index); - if (!ecount) - printf("Empty index\n"); - - for (i = 0; i < ecount; ++i) { - const git_index_entry *e = git_index_get_byindex(index, i); - - git_oid_fmt(out, &e->id); - - printf("File Path: %s\n", e->path); - printf(" Stage: %d\n", git_index_entry_stage(e)); - printf(" Blob SHA: %s\n", out); - printf("File Mode: %07o\n", e->mode); - printf("File Size: %d bytes\n", (int)e->file_size); - printf("Dev/Inode: %d/%d\n", (int)e->dev, (int)e->ino); - printf(" UID/GID: %d/%d\n", (int)e->uid, (int)e->gid); - printf(" ctime: %d\n", (int)e->ctime.seconds); - printf(" mtime: %d\n", (int)e->mtime.seconds); - printf("\n"); - } - - git_index_free(index); - git_libgit2_shutdown(); - - return 0; -} diff --git a/vendor/libgit2/examples/status.c b/vendor/libgit2/examples/status.c deleted file mode 100644 index 49f006dcc6..0000000000 --- a/vendor/libgit2/examples/status.c +++ /dev/null @@ -1,517 +0,0 @@ -/* - * libgit2 "status" example - shows how to use the status APIs - * - * Written by the libgit2 contributors - * - * To the extent possible under law, the author(s) have dedicated all copyright - * and related and neighboring rights to this software to the public domain - * worldwide. This software is distributed without any warranty. - * - * You should have received a copy of the CC0 Public Domain Dedication along - * with this software. If not, see - * . - */ - -#include "common.h" -#ifdef _WIN32 -# include -# define sleep(a) Sleep(a * 1000) -#else -# include -#endif - -/** - * This example demonstrates the use of the libgit2 status APIs, - * particularly the `git_status_list` object, to roughly simulate the - * output of running `git status`. It serves as a simple example of - * using those APIs to get basic status information. - * - * This does not have: - * - * - Robust error handling - * - Colorized or paginated output formatting - * - * This does have: - * - * - Examples of translating command line arguments to the status - * options settings to mimic `git status` results. - * - A sample status formatter that matches the default "long" format - * from `git status` - * - A sample status formatter that matches the "short" format - */ - -enum { - FORMAT_DEFAULT = 0, - FORMAT_LONG = 1, - FORMAT_SHORT = 2, - FORMAT_PORCELAIN = 3, -}; - -#define MAX_PATHSPEC 8 - -struct opts { - git_status_options statusopt; - char *repodir; - char *pathspec[MAX_PATHSPEC]; - int npaths; - int format; - int zterm; - int showbranch; - int showsubmod; - int repeat; -}; - -static void parse_opts(struct opts *o, int argc, char *argv[]); -static void show_branch(git_repository *repo, int format); -static void print_long(git_status_list *status); -static void print_short(git_repository *repo, git_status_list *status); -static int print_submod(git_submodule *sm, const char *name, void *payload); - -int main(int argc, char *argv[]) -{ - git_repository *repo = NULL; - git_status_list *status; - struct opts o = { GIT_STATUS_OPTIONS_INIT, "." }; - - git_libgit2_init(); - - o.statusopt.show = GIT_STATUS_SHOW_INDEX_AND_WORKDIR; - o.statusopt.flags = GIT_STATUS_OPT_INCLUDE_UNTRACKED | - GIT_STATUS_OPT_RENAMES_HEAD_TO_INDEX | - GIT_STATUS_OPT_SORT_CASE_SENSITIVELY; - - parse_opts(&o, argc, argv); - - /** - * Try to open the repository at the given path (or at the current - * directory if none was given). - */ - check_lg2(git_repository_open_ext(&repo, o.repodir, 0, NULL), - "Could not open repository", o.repodir); - - if (git_repository_is_bare(repo)) - fatal("Cannot report status on bare repository", - git_repository_path(repo)); - -show_status: - if (o.repeat) - printf("\033[H\033[2J"); - - /** - * Run status on the repository - * - * We use `git_status_list_new()` to generate a list of status - * information which lets us iterate over it at our - * convenience and extract the data we want to show out of - * each entry. - * - * You can use `git_status_foreach()` or - * `git_status_foreach_ext()` if you'd prefer to execute a - * callback for each entry. The latter gives you more control - * about what results are presented. - */ - check_lg2(git_status_list_new(&status, repo, &o.statusopt), - "Could not get status", NULL); - - if (o.showbranch) - show_branch(repo, o.format); - - if (o.showsubmod) { - int submod_count = 0; - check_lg2(git_submodule_foreach(repo, print_submod, &submod_count), - "Cannot iterate submodules", o.repodir); - } - - if (o.format == FORMAT_LONG) - print_long(status); - else - print_short(repo, status); - - git_status_list_free(status); - - if (o.repeat) { - sleep(o.repeat); - goto show_status; - } - - git_repository_free(repo); - git_libgit2_shutdown(); - - return 0; -} - -/** - * If the user asked for the branch, let's show the short name of the - * branch. - */ -static void show_branch(git_repository *repo, int format) -{ - int error = 0; - const char *branch = NULL; - git_reference *head = NULL; - - error = git_repository_head(&head, repo); - - if (error == GIT_EUNBORNBRANCH || error == GIT_ENOTFOUND) - branch = NULL; - else if (!error) { - branch = git_reference_shorthand(head); - } else - check_lg2(error, "failed to get current branch", NULL); - - if (format == FORMAT_LONG) - printf("# On branch %s\n", - branch ? branch : "Not currently on any branch."); - else - printf("## %s\n", branch ? branch : "HEAD (no branch)"); - - git_reference_free(head); -} - -/** - * This function print out an output similar to git's status command - * in long form, including the command-line hints. - */ -static void print_long(git_status_list *status) -{ - size_t i, maxi = git_status_list_entrycount(status); - const git_status_entry *s; - int header = 0, changes_in_index = 0; - int changed_in_workdir = 0, rm_in_workdir = 0; - const char *old_path, *new_path; - - /** Print index changes. */ - - for (i = 0; i < maxi; ++i) { - char *istatus = NULL; - - s = git_status_byindex(status, i); - - if (s->status == GIT_STATUS_CURRENT) - continue; - - if (s->status & GIT_STATUS_WT_DELETED) - rm_in_workdir = 1; - - if (s->status & GIT_STATUS_INDEX_NEW) - istatus = "new file: "; - if (s->status & GIT_STATUS_INDEX_MODIFIED) - istatus = "modified: "; - if (s->status & GIT_STATUS_INDEX_DELETED) - istatus = "deleted: "; - if (s->status & GIT_STATUS_INDEX_RENAMED) - istatus = "renamed: "; - if (s->status & GIT_STATUS_INDEX_TYPECHANGE) - istatus = "typechange:"; - - if (istatus == NULL) - continue; - - if (!header) { - printf("# Changes to be committed:\n"); - printf("# (use \"git reset HEAD ...\" to unstage)\n"); - printf("#\n"); - header = 1; - } - - old_path = s->head_to_index->old_file.path; - new_path = s->head_to_index->new_file.path; - - if (old_path && new_path && strcmp(old_path, new_path)) - printf("#\t%s %s -> %s\n", istatus, old_path, new_path); - else - printf("#\t%s %s\n", istatus, old_path ? old_path : new_path); - } - - if (header) { - changes_in_index = 1; - printf("#\n"); - } - header = 0; - - /** Print workdir changes to tracked files. */ - - for (i = 0; i < maxi; ++i) { - char *wstatus = NULL; - - s = git_status_byindex(status, i); - - /** - * With `GIT_STATUS_OPT_INCLUDE_UNMODIFIED` (not used in this example) - * `index_to_workdir` may not be `NULL` even if there are - * no differences, in which case it will be a `GIT_DELTA_UNMODIFIED`. - */ - if (s->status == GIT_STATUS_CURRENT || s->index_to_workdir == NULL) - continue; - - /** Print out the output since we know the file has some changes */ - if (s->status & GIT_STATUS_WT_MODIFIED) - wstatus = "modified: "; - if (s->status & GIT_STATUS_WT_DELETED) - wstatus = "deleted: "; - if (s->status & GIT_STATUS_WT_RENAMED) - wstatus = "renamed: "; - if (s->status & GIT_STATUS_WT_TYPECHANGE) - wstatus = "typechange:"; - - if (wstatus == NULL) - continue; - - if (!header) { - printf("# Changes not staged for commit:\n"); - printf("# (use \"git add%s ...\" to update what will be committed)\n", rm_in_workdir ? "/rm" : ""); - printf("# (use \"git checkout -- ...\" to discard changes in working directory)\n"); - printf("#\n"); - header = 1; - } - - old_path = s->index_to_workdir->old_file.path; - new_path = s->index_to_workdir->new_file.path; - - if (old_path && new_path && strcmp(old_path, new_path)) - printf("#\t%s %s -> %s\n", wstatus, old_path, new_path); - else - printf("#\t%s %s\n", wstatus, old_path ? old_path : new_path); - } - - if (header) { - changed_in_workdir = 1; - printf("#\n"); - } - - /** Print untracked files. */ - - header = 0; - - for (i = 0; i < maxi; ++i) { - s = git_status_byindex(status, i); - - if (s->status == GIT_STATUS_WT_NEW) { - - if (!header) { - printf("# Untracked files:\n"); - printf("# (use \"git add ...\" to include in what will be committed)\n"); - printf("#\n"); - header = 1; - } - - printf("#\t%s\n", s->index_to_workdir->old_file.path); - } - } - - header = 0; - - /** Print ignored files. */ - - for (i = 0; i < maxi; ++i) { - s = git_status_byindex(status, i); - - if (s->status == GIT_STATUS_IGNORED) { - - if (!header) { - printf("# Ignored files:\n"); - printf("# (use \"git add -f ...\" to include in what will be committed)\n"); - printf("#\n"); - header = 1; - } - - printf("#\t%s\n", s->index_to_workdir->old_file.path); - } - } - - if (!changes_in_index && changed_in_workdir) - printf("no changes added to commit (use \"git add\" and/or \"git commit -a\")\n"); -} - -/** - * This version of the output prefixes each path with two status - * columns and shows submodule status information. - */ -static void print_short(git_repository *repo, git_status_list *status) -{ - size_t i, maxi = git_status_list_entrycount(status); - const git_status_entry *s; - char istatus, wstatus; - const char *extra, *a, *b, *c; - - for (i = 0; i < maxi; ++i) { - s = git_status_byindex(status, i); - - if (s->status == GIT_STATUS_CURRENT) - continue; - - a = b = c = NULL; - istatus = wstatus = ' '; - extra = ""; - - if (s->status & GIT_STATUS_INDEX_NEW) - istatus = 'A'; - if (s->status & GIT_STATUS_INDEX_MODIFIED) - istatus = 'M'; - if (s->status & GIT_STATUS_INDEX_DELETED) - istatus = 'D'; - if (s->status & GIT_STATUS_INDEX_RENAMED) - istatus = 'R'; - if (s->status & GIT_STATUS_INDEX_TYPECHANGE) - istatus = 'T'; - - if (s->status & GIT_STATUS_WT_NEW) { - if (istatus == ' ') - istatus = '?'; - wstatus = '?'; - } - if (s->status & GIT_STATUS_WT_MODIFIED) - wstatus = 'M'; - if (s->status & GIT_STATUS_WT_DELETED) - wstatus = 'D'; - if (s->status & GIT_STATUS_WT_RENAMED) - wstatus = 'R'; - if (s->status & GIT_STATUS_WT_TYPECHANGE) - wstatus = 'T'; - - if (s->status & GIT_STATUS_IGNORED) { - istatus = '!'; - wstatus = '!'; - } - - if (istatus == '?' && wstatus == '?') - continue; - - /** - * A commit in a tree is how submodules are stored, so - * let's go take a look at its status. - */ - if (s->index_to_workdir && - s->index_to_workdir->new_file.mode == GIT_FILEMODE_COMMIT) - { - unsigned int smstatus = 0; - - if (!git_submodule_status(&smstatus, repo, s->index_to_workdir->new_file.path, - GIT_SUBMODULE_IGNORE_UNSPECIFIED)) { - if (smstatus & GIT_SUBMODULE_STATUS_WD_MODIFIED) - extra = " (new commits)"; - else if (smstatus & GIT_SUBMODULE_STATUS_WD_INDEX_MODIFIED) - extra = " (modified content)"; - else if (smstatus & GIT_SUBMODULE_STATUS_WD_WD_MODIFIED) - extra = " (modified content)"; - else if (smstatus & GIT_SUBMODULE_STATUS_WD_UNTRACKED) - extra = " (untracked content)"; - } - } - - /** - * Now that we have all the information, format the output. - */ - - if (s->head_to_index) { - a = s->head_to_index->old_file.path; - b = s->head_to_index->new_file.path; - } - if (s->index_to_workdir) { - if (!a) - a = s->index_to_workdir->old_file.path; - if (!b) - b = s->index_to_workdir->old_file.path; - c = s->index_to_workdir->new_file.path; - } - - if (istatus == 'R') { - if (wstatus == 'R') - printf("%c%c %s %s %s%s\n", istatus, wstatus, a, b, c, extra); - else - printf("%c%c %s %s%s\n", istatus, wstatus, a, b, extra); - } else { - if (wstatus == 'R') - printf("%c%c %s %s%s\n", istatus, wstatus, a, c, extra); - else - printf("%c%c %s%s\n", istatus, wstatus, a, extra); - } - } - - for (i = 0; i < maxi; ++i) { - s = git_status_byindex(status, i); - - if (s->status == GIT_STATUS_WT_NEW) - printf("?? %s\n", s->index_to_workdir->old_file.path); - } -} - -static int print_submod(git_submodule *sm, const char *name, void *payload) -{ - int *count = payload; - (void)name; - - if (*count == 0) - printf("# Submodules\n"); - (*count)++; - - printf("# - submodule '%s' at %s\n", - git_submodule_name(sm), git_submodule_path(sm)); - - return 0; -} - -/** - * Parse options that git's status command supports. - */ -static void parse_opts(struct opts *o, int argc, char *argv[]) -{ - struct args_info args = ARGS_INFO_INIT; - - for (args.pos = 1; args.pos < argc; ++args.pos) { - char *a = argv[args.pos]; - - if (a[0] != '-') { - if (o->npaths < MAX_PATHSPEC) - o->pathspec[o->npaths++] = a; - else - fatal("Example only supports a limited pathspec", NULL); - } - else if (!strcmp(a, "-s") || !strcmp(a, "--short")) - o->format = FORMAT_SHORT; - else if (!strcmp(a, "--long")) - o->format = FORMAT_LONG; - else if (!strcmp(a, "--porcelain")) - o->format = FORMAT_PORCELAIN; - else if (!strcmp(a, "-b") || !strcmp(a, "--branch")) - o->showbranch = 1; - else if (!strcmp(a, "-z")) { - o->zterm = 1; - if (o->format == FORMAT_DEFAULT) - o->format = FORMAT_PORCELAIN; - } - else if (!strcmp(a, "--ignored")) - o->statusopt.flags |= GIT_STATUS_OPT_INCLUDE_IGNORED; - else if (!strcmp(a, "-uno") || - !strcmp(a, "--untracked-files=no")) - o->statusopt.flags &= ~GIT_STATUS_OPT_INCLUDE_UNTRACKED; - else if (!strcmp(a, "-unormal") || - !strcmp(a, "--untracked-files=normal")) - o->statusopt.flags |= GIT_STATUS_OPT_INCLUDE_UNTRACKED; - else if (!strcmp(a, "-uall") || - !strcmp(a, "--untracked-files=all")) - o->statusopt.flags |= GIT_STATUS_OPT_INCLUDE_UNTRACKED | - GIT_STATUS_OPT_RECURSE_UNTRACKED_DIRS; - else if (!strcmp(a, "--ignore-submodules=all")) - o->statusopt.flags |= GIT_STATUS_OPT_EXCLUDE_SUBMODULES; - else if (!strncmp(a, "--git-dir=", strlen("--git-dir="))) - o->repodir = a + strlen("--git-dir="); - else if (!strcmp(a, "--repeat")) - o->repeat = 10; - else if (match_int_arg(&o->repeat, &args, "--repeat", 0)) - /* okay */; - else if (!strcmp(a, "--list-submodules")) - o->showsubmod = 1; - else - check_lg2(-1, "Unsupported option", a); - } - - if (o->format == FORMAT_DEFAULT) - o->format = FORMAT_LONG; - if (o->format == FORMAT_LONG) - o->showbranch = 1; - if (o->npaths > 0) { - o->statusopt.pathspec.strings = o->pathspec; - o->statusopt.pathspec.count = o->npaths; - } -} diff --git a/vendor/libgit2/examples/tag.c b/vendor/libgit2/examples/tag.c deleted file mode 100644 index c6a70d90ee..0000000000 --- a/vendor/libgit2/examples/tag.c +++ /dev/null @@ -1,319 +0,0 @@ -/* - * libgit2 "tag" example - shows how to list, create and delete tags - * - * Written by the libgit2 contributors - * - * To the extent possible under law, the author(s) have dedicated all copyright - * and related and neighboring rights to this software to the public domain - * worldwide. This software is distributed without any warranty. - * - * You should have received a copy of the CC0 Public Domain Dedication along - * with this software. If not, see - * . - */ - -#include "common.h" - -/** - * The following example partially reimplements the `git tag` command - * and some of its options. - * - * These commands should work: - - * - Tag name listing (`tag`) - * - Filtered tag listing with messages (`tag -n3 -l "v0.1*"`) - * - Lightweight tag creation (`tag test v0.18.0`) - * - Tag creation (`tag -a -m "Test message" test v0.18.0`) - * - Tag deletion (`tag -d test`) - * - * The command line parsing logic is simplified and doesn't handle - * all of the use cases. - */ - -/** tag_options represents the parsed command line options */ -typedef struct { - const char *message; - const char *pattern; - const char *tag_name; - const char *target; - int num_lines; - int force; -} tag_options; - -/** tag_state represents the current program state for dragging around */ -typedef struct { - git_repository *repo; - tag_options *opts; -} tag_state; - -/** An action to execute based on the command line arguments */ -typedef void (*tag_action)(tag_state *state); -typedef struct args_info args_info; - -static void check(int result, const char *message) -{ - if (result) fatal(message, NULL); -} - -/** Tag listing: Print individual message lines */ -static void print_list_lines(const char *message, const tag_state *state) -{ - const char *msg = message; - int num = state->opts->num_lines - 1; - - if (!msg) return; - - /** first line - headline */ - while(*msg && *msg != '\n') printf("%c", *msg++); - - /** skip over new lines */ - while(*msg && *msg == '\n') msg++; - - printf("\n"); - - /** print just headline? */ - if (num == 0) return; - if (*msg && msg[1]) printf("\n"); - - /** print individual commit/tag lines */ - while (*msg && num-- >= 2) { - printf(" "); - - while (*msg && *msg != '\n') printf("%c", *msg++); - - /** handle consecutive new lines */ - if (*msg && *msg == '\n' && msg[1] == '\n') { - num--; - printf("\n"); - } - while(*msg && *msg == '\n') msg++; - - printf("\n"); - } -} - -/** Tag listing: Print an actual tag object */ -static void print_tag(git_tag *tag, const tag_state *state) -{ - printf("%-16s", git_tag_name(tag)); - - if (state->opts->num_lines) { - const char *msg = git_tag_message(tag); - print_list_lines(msg, state); - } else { - printf("\n"); - } -} - -/** Tag listing: Print a commit (target of a lightweight tag) */ -static void print_commit(git_commit *commit, const char *name, - const tag_state *state) -{ - printf("%-16s", name); - - if (state->opts->num_lines) { - const char *msg = git_commit_message(commit); - print_list_lines(msg, state); - } else { - printf("\n"); - } -} - -/** Tag listing: Fallback, should not happen */ -static void print_name(const char *name) -{ - printf("%s\n", name); -} - -/** Tag listing: Lookup tags based on ref name and dispatch to print */ -static int each_tag(const char *name, tag_state *state) -{ - git_repository *repo = state->repo; - git_object *obj; - - check_lg2(git_revparse_single(&obj, repo, name), - "Failed to lookup rev", name); - - switch (git_object_type(obj)) { - case GIT_OBJ_TAG: - print_tag((git_tag *) obj, state); - break; - case GIT_OBJ_COMMIT: - print_commit((git_commit *) obj, name, state); - break; - default: - print_name(name); - } - - git_object_free(obj); - return 0; -} - -static void action_list_tags(tag_state *state) -{ - const char *pattern = state->opts->pattern; - git_strarray tag_names = {0}; - size_t i; - - check_lg2(git_tag_list_match(&tag_names, pattern ? pattern : "*", state->repo), - "Unable to get list of tags", NULL); - - for(i = 0; i < tag_names.count; i++) { - each_tag(tag_names.strings[i], state); - } - - git_strarray_free(&tag_names); -} - -static void action_delete_tag(tag_state *state) -{ - tag_options *opts = state->opts; - git_object *obj; - git_buf abbrev_oid = {0}; - - check(!opts->tag_name, "Name required"); - - check_lg2(git_revparse_single(&obj, state->repo, opts->tag_name), - "Failed to lookup rev", opts->tag_name); - - check_lg2(git_object_short_id(&abbrev_oid, obj), - "Unable to get abbreviated OID", opts->tag_name); - - check_lg2(git_tag_delete(state->repo, opts->tag_name), - "Unable to delete tag", opts->tag_name); - - printf("Deleted tag '%s' (was %s)\n", opts->tag_name, abbrev_oid.ptr); - - git_buf_free(&abbrev_oid); - git_object_free(obj); -} - -static void action_create_lighweight_tag(tag_state *state) -{ - git_repository *repo = state->repo; - tag_options *opts = state->opts; - git_oid oid; - git_object *target; - - check(!opts->tag_name, "Name required"); - - if (!opts->target) opts->target = "HEAD"; - - check(!opts->target, "Target required"); - - check_lg2(git_revparse_single(&target, repo, opts->target), - "Unable to resolve spec", opts->target); - - check_lg2(git_tag_create_lightweight(&oid, repo, opts->tag_name, - target, opts->force), "Unable to create tag", NULL); - - git_object_free(target); -} - -static void action_create_tag(tag_state *state) -{ - git_repository *repo = state->repo; - tag_options *opts = state->opts; - git_signature *tagger; - git_oid oid; - git_object *target; - - check(!opts->tag_name, "Name required"); - check(!opts->message, "Message required"); - - if (!opts->target) opts->target = "HEAD"; - - check_lg2(git_revparse_single(&target, repo, opts->target), - "Unable to resolve spec", opts->target); - - check_lg2(git_signature_default(&tagger, repo), - "Unable to create signature", NULL); - - check_lg2(git_tag_create(&oid, repo, opts->tag_name, - target, tagger, opts->message, opts->force), "Unable to create tag", NULL); - - git_object_free(target); - git_signature_free(tagger); -} - -static void print_usage(void) -{ - fprintf(stderr, "usage: see `git help tag`\n"); - exit(1); -} - -/** Parse command line arguments and choose action to run when done */ -static void parse_options(tag_action *action, tag_options *opts, int argc, char **argv) -{ - args_info args = ARGS_INFO_INIT; - *action = &action_list_tags; - - for (args.pos = 1; args.pos < argc; ++args.pos) { - const char *curr = argv[args.pos]; - - if (curr[0] != '-') { - if (!opts->tag_name) - opts->tag_name = curr; - else if (!opts->target) - opts->target = curr; - else - print_usage(); - - if (*action != &action_create_tag) - *action = &action_create_lighweight_tag; - } else if (!strcmp(curr, "-n")) { - opts->num_lines = 1; - *action = &action_list_tags; - } else if (!strcmp(curr, "-a")) { - *action = &action_create_tag; - } else if (!strcmp(curr, "-f")) { - opts->force = 1; - } else if (match_int_arg(&opts->num_lines, &args, "-n", 0)) { - *action = &action_list_tags; - } else if (match_str_arg(&opts->pattern, &args, "-l")) { - *action = &action_list_tags; - } else if (match_str_arg(&opts->tag_name, &args, "-d")) { - *action = &action_delete_tag; - } else if (match_str_arg(&opts->message, &args, "-m")) { - *action = &action_create_tag; - } - } -} - -/** Initialize tag_options struct */ -static void tag_options_init(tag_options *opts) -{ - memset(opts, 0, sizeof(*opts)); - - opts->message = NULL; - opts->pattern = NULL; - opts->tag_name = NULL; - opts->target = NULL; - opts->num_lines = 0; - opts->force = 0; -} - -int main(int argc, char **argv) -{ - git_repository *repo; - tag_options opts; - tag_action action; - tag_state state; - - git_libgit2_init(); - - check_lg2(git_repository_open_ext(&repo, ".", 0, NULL), - "Could not open repository", NULL); - - tag_options_init(&opts); - parse_options(&action, &opts, argc, argv); - - state.repo = repo; - state.opts = &opts; - action(&state); - - git_repository_free(repo); - git_libgit2_shutdown(); - - return 0; -} diff --git a/vendor/libgit2/examples/test/test-rev-list.sh b/vendor/libgit2/examples/test/test-rev-list.sh deleted file mode 100755 index aa645be5ec..0000000000 --- a/vendor/libgit2/examples/test/test-rev-list.sh +++ /dev/null @@ -1,95 +0,0 @@ -#!/bin/bash - -THIS_FILE="$(readlink -f "$0")" -ROOT="$(dirname "$(dirname "$(dirname "$THIS_FILE")")")" -PROGRAM="$ROOT"/examples/rev-list -LIBDIR="$ROOT"/build -REPO="$ROOT"/tests/resources/testrepo.git - -cd "$REPO" - -run () { - LD_LIBRARY_PATH="$LIBDIR" "$PROGRAM" "$@" -} - -diff -u - <(run --date-order a4a7dce) </dev/null || -a4a7dce85cf63874e984719f4fdd239f5145052f -c47800c7266a2be04c571c04d5a6614691ea99bd -9fd738e8f7967c078dceed8190330fc8648ee56a -4a202b346bb0fb0db7eff3cffeb3c70babbd2045 -5b5b025afb0b4c913b4c338a42934a3863bf3644 -8496071c1b46c854b31185ea97743be6a8774479 -EOF -diff -u - <(echo "$out") </dev/null || -8496071c1b46c854b31185ea97743be6a8774479 -5b5b025afb0b4c913b4c338a42934a3863bf3644 -4a202b346bb0fb0db7eff3cffeb3c70babbd2045 -9fd738e8f7967c078dceed8190330fc8648ee56a -c47800c7266a2be04c571c04d5a6614691ea99bd -a4a7dce85cf63874e984719f4fdd239f5145052f -EOF -diff -u - <(echo "$out") </dev/null || -a4a7dce85cf63874e984719f4fdd239f5145052f -c47800c7266a2be04c571c04d5a6614691ea99bd -9fd738e8f7967c078dceed8190330fc8648ee56a -4a202b346bb0fb0db7eff3cffeb3c70babbd2045 -5b5b025afb0b4c913b4c338a42934a3863bf3644 -8496071c1b46c854b31185ea97743be6a8774479 -EOF -diff -u - <(echo "$out") <"Author""" -# -# "ok" means the author consents to relicensing all their -# contributed code (possibly with some exceptions) -# "no" means the author does not consent -# "ask" means that the contributor wants to give/withhold -# his/her consent on a patch-by-patch basis. -# "???" means the person is a prominent contributor who has -# not yet made his/her standpoint clear. -# -# Please try to keep the list alphabetically ordered. It will -# help in case we get all 600-ish git.git authors on it. -# -# (Paul Kocher is the author of the mozilla-sha1 implementation -# but has otherwise not contributed to git.) -# -ok Adam Simpkins (http transport) -ok Adrian Johnson -ok Alexey Shumkin -ok Andreas Ericsson -ok Boyd Lynn Gerber -ok Brandon Casey -ok Brian Downing -ok Brian Gernhardt -ok Christian Couder -ok Daniel Barkalow -ok Florian Forster -ok Gustaf Hendeby -ok Holger Weiss -ok Jeff King -ok Johannes Schindelin -ok Johannes Sixt -ask Jonathan Nieder -ok Junio C Hamano -ok Kristian Høgsberg -ok Linus Torvalds -ok Lukas Sandström -ok Matthieu Moy -ok Michael Haggerty -ok Nicolas Pitre -ok Paolo Bonzini -ok Paul Kocher -ok Peter Hagervall -ok Petr Onderka -ok Pierre Habouzit -ok Pieter de Bie -ok RenĂ© Scharfe -ok Sebastian Schuberth -ok Shawn O. Pearce -ok Steffen Prohaska -ok Sven Verdoolaege -ask Thomas Rast (ok before 6-Oct-2013) -ok Torsten Bögershausen diff --git a/vendor/libgit2/include/git2.h b/vendor/libgit2/include/git2.h deleted file mode 100644 index ac4a63160f..0000000000 --- a/vendor/libgit2/include/git2.h +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#ifndef INCLUDE_git_git_h__ -#define INCLUDE_git_git_h__ - -#include "git2/annotated_commit.h" -#include "git2/attr.h" -#include "git2/blob.h" -#include "git2/blame.h" -#include "git2/branch.h" -#include "git2/buffer.h" -#include "git2/checkout.h" -#include "git2/cherrypick.h" -#include "git2/clone.h" -#include "git2/commit.h" -#include "git2/common.h" -#include "git2/config.h" -#include "git2/describe.h" -#include "git2/diff.h" -#include "git2/errors.h" -#include "git2/filter.h" -#include "git2/global.h" -#include "git2/graph.h" -#include "git2/ignore.h" -#include "git2/index.h" -#include "git2/indexer.h" -#include "git2/merge.h" -#include "git2/message.h" -#include "git2/net.h" -#include "git2/notes.h" -#include "git2/object.h" -#include "git2/odb.h" -#include "git2/odb_backend.h" -#include "git2/oid.h" -#include "git2/pack.h" -#include "git2/patch.h" -#include "git2/pathspec.h" -#include "git2/rebase.h" -#include "git2/refdb.h" -#include "git2/reflog.h" -#include "git2/refs.h" -#include "git2/refspec.h" -#include "git2/remote.h" -#include "git2/repository.h" -#include "git2/reset.h" -#include "git2/revert.h" -#include "git2/revparse.h" -#include "git2/revwalk.h" -#include "git2/signature.h" -#include "git2/stash.h" -#include "git2/status.h" -#include "git2/submodule.h" -#include "git2/tag.h" -#include "git2/transport.h" -#include "git2/transaction.h" -#include "git2/tree.h" -#include "git2/types.h" -#include "git2/version.h" - -#endif diff --git a/vendor/libgit2/include/git2/annotated_commit.h b/vendor/libgit2/include/git2/annotated_commit.h deleted file mode 100644 index 7fb896a5fa..0000000000 --- a/vendor/libgit2/include/git2/annotated_commit.h +++ /dev/null @@ -1,116 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_annotated_commit_h__ -#define INCLUDE_git_annotated_commit_h__ - -#include "common.h" -#include "repository.h" -#include "types.h" - -/** - * @file git2/annotated_commit.h - * @brief Git annotated commit routines - * @defgroup git_annotated_commit Git annotated commit routines - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** - * Creates a `git_annotated_commit` from the given reference. - * The resulting git_annotated_commit must be freed with - * `git_annotated_commit_free`. - * - * @param out pointer to store the git_annotated_commit result in - * @param repo repository that contains the given reference - * @param ref reference to use to lookup the git_annotated_commit - * @return 0 on success or error code - */ -GIT_EXTERN(int) git_annotated_commit_from_ref( - git_annotated_commit **out, - git_repository *repo, - const git_reference *ref); - -/** - * Creates a `git_annotated_commit` from the given fetch head data. - * The resulting git_annotated_commit must be freed with - * `git_annotated_commit_free`. - * - * @param out pointer to store the git_annotated_commit result in - * @param repo repository that contains the given commit - * @param branch_name name of the (remote) branch - * @param remote_url url of the remote - * @param id the commit object id of the remote branch - * @return 0 on success or error code - */ -GIT_EXTERN(int) git_annotated_commit_from_fetchhead( - git_annotated_commit **out, - git_repository *repo, - const char *branch_name, - const char *remote_url, - const git_oid *id); - -/** - * Creates a `git_annotated_commit` from the given commit id. - * The resulting git_annotated_commit must be freed with - * `git_annotated_commit_free`. - * - * An annotated commit contains information about how it was - * looked up, which may be useful for functions like merge or - * rebase to provide context to the operation. For example, - * conflict files will include the name of the source or target - * branches being merged. It is therefore preferable to use the - * most specific function (eg `git_annotated_commit_from_ref`) - * instead of this one when that data is known. - * - * @param out pointer to store the git_annotated_commit result in - * @param repo repository that contains the given commit - * @param id the commit object id to lookup - * @return 0 on success or error code - */ -GIT_EXTERN(int) git_annotated_commit_lookup( - git_annotated_commit **out, - git_repository *repo, - const git_oid *id); - -/** - * Creates a `git_annotated_comit` from a revision string. - * - * See `man gitrevisions`, or - * http://git-scm.com/docs/git-rev-parse.html#_specifying_revisions for - * information on the syntax accepted. - * - * @param out pointer to store the git_annotated_commit result in - * @param repo repository that contains the given commit - * @param revspec the extended sha syntax string to use to lookup the commit - * @return 0 on success or error code - */ -GIT_EXTERN(int) git_annotated_commit_from_revspec( - git_annotated_commit **out, - git_repository *repo, - const char *revspec); - -/** - * Gets the commit ID that the given `git_annotated_commit` refers to. - * - * @param commit the given annotated commit - * @return commit id - */ -GIT_EXTERN(const git_oid *) git_annotated_commit_id( - const git_annotated_commit *commit); - -/** - * Frees a `git_annotated_commit`. - * - * @param commit annotated commit to free - */ -GIT_EXTERN(void) git_annotated_commit_free( - git_annotated_commit *commit); - -/** @} */ -GIT_END_DECL -#endif diff --git a/vendor/libgit2/include/git2/attr.h b/vendor/libgit2/include/git2/attr.h deleted file mode 100644 index 0238f3dd70..0000000000 --- a/vendor/libgit2/include/git2/attr.h +++ /dev/null @@ -1,245 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_attr_h__ -#define INCLUDE_git_attr_h__ - -#include "common.h" -#include "types.h" - -/** - * @file git2/attr.h - * @brief Git attribute management routines - * @defgroup git_attr Git attribute management routines - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** - * GIT_ATTR_TRUE checks if an attribute is set on. In core git - * parlance, this the value for "Set" attributes. - * - * For example, if the attribute file contains: - * - * *.c foo - * - * Then for file `xyz.c` looking up attribute "foo" gives a value for - * which `GIT_ATTR_TRUE(value)` is true. - */ -#define GIT_ATTR_TRUE(attr) (git_attr_value(attr) == GIT_ATTR_TRUE_T) - -/** - * GIT_ATTR_FALSE checks if an attribute is set off. In core git - * parlance, this is the value for attributes that are "Unset" (not to - * be confused with values that a "Unspecified"). - * - * For example, if the attribute file contains: - * - * *.h -foo - * - * Then for file `zyx.h` looking up attribute "foo" gives a value for - * which `GIT_ATTR_FALSE(value)` is true. - */ -#define GIT_ATTR_FALSE(attr) (git_attr_value(attr) == GIT_ATTR_FALSE_T) - -/** - * GIT_ATTR_UNSPECIFIED checks if an attribute is unspecified. This - * may be due to the attribute not being mentioned at all or because - * the attribute was explicitly set unspecified via the `!` operator. - * - * For example, if the attribute file contains: - * - * *.c foo - * *.h -foo - * onefile.c !foo - * - * Then for `onefile.c` looking up attribute "foo" yields a value with - * `GIT_ATTR_UNSPECIFIED(value)` of true. Also, looking up "foo" on - * file `onefile.rb` or looking up "bar" on any file will all give - * `GIT_ATTR_UNSPECIFIED(value)` of true. - */ -#define GIT_ATTR_UNSPECIFIED(attr) (git_attr_value(attr) == GIT_ATTR_UNSPECIFIED_T) - -/** - * GIT_ATTR_HAS_VALUE checks if an attribute is set to a value (as - * opposed to TRUE, FALSE or UNSPECIFIED). This would be the case if - * for a file with something like: - * - * *.txt eol=lf - * - * Given this, looking up "eol" for `onefile.txt` will give back the - * string "lf" and `GIT_ATTR_SET_TO_VALUE(attr)` will return true. - */ -#define GIT_ATTR_HAS_VALUE(attr) (git_attr_value(attr) == GIT_ATTR_VALUE_T) - -/** - * Possible states for an attribute - */ -typedef enum { - GIT_ATTR_UNSPECIFIED_T = 0, /**< The attribute has been left unspecified */ - GIT_ATTR_TRUE_T, /**< The attribute has been set */ - GIT_ATTR_FALSE_T, /**< The attribute has been unset */ - GIT_ATTR_VALUE_T, /**< This attribute has a value */ -} git_attr_t; - -/** - * Return the value type for a given attribute. - * - * This can be either `TRUE`, `FALSE`, `UNSPECIFIED` (if the attribute - * was not set at all), or `VALUE`, if the attribute was set to an - * actual string. - * - * If the attribute has a `VALUE` string, it can be accessed normally - * as a NULL-terminated C string. - * - * @param attr The attribute - * @return the value type for the attribute - */ -GIT_EXTERN(git_attr_t) git_attr_value(const char *attr); - -/** - * Check attribute flags: Reading values from index and working directory. - * - * When checking attributes, it is possible to check attribute files - * in both the working directory (if there is one) and the index (if - * there is one). You can explicitly choose where to check and in - * which order using the following flags. - * - * Core git usually checks the working directory then the index, - * except during a checkout when it checks the index first. It will - * use index only for creating archives or for a bare repo (if an - * index has been specified for the bare repo). - */ -#define GIT_ATTR_CHECK_FILE_THEN_INDEX 0 -#define GIT_ATTR_CHECK_INDEX_THEN_FILE 1 -#define GIT_ATTR_CHECK_INDEX_ONLY 2 - -/** - * Check attribute flags: Using the system attributes file. - * - * Normally, attribute checks include looking in the /etc (or system - * equivalent) directory for a `gitattributes` file. Passing this - * flag will cause attribute checks to ignore that file. - */ -#define GIT_ATTR_CHECK_NO_SYSTEM (1 << 2) - -/** - * Look up the value of one git attribute for path. - * - * @param value_out Output of the value of the attribute. Use the GIT_ATTR_... - * macros to test for TRUE, FALSE, UNSPECIFIED, etc. or just - * use the string value for attributes set to a value. You - * should NOT modify or free this value. - * @param repo The repository containing the path. - * @param flags A combination of GIT_ATTR_CHECK... flags. - * @param path The path to check for attributes. Relative paths are - * interpreted relative to the repo root. The file does - * not have to exist, but if it does not, then it will be - * treated as a plain file (not a directory). - * @param name The name of the attribute to look up. - */ -GIT_EXTERN(int) git_attr_get( - const char **value_out, - git_repository *repo, - uint32_t flags, - const char *path, - const char *name); - -/** - * Look up a list of git attributes for path. - * - * Use this if you have a known list of attributes that you want to - * look up in a single call. This is somewhat more efficient than - * calling `git_attr_get()` multiple times. - * - * For example, you might write: - * - * const char *attrs[] = { "crlf", "diff", "foo" }; - * const char **values[3]; - * git_attr_get_many(values, repo, 0, "my/fun/file.c", 3, attrs); - * - * Then you could loop through the 3 values to get the settings for - * the three attributes you asked about. - * - * @param values_out An array of num_attr entries that will have string - * pointers written into it for the values of the attributes. - * You should not modify or free the values that are written - * into this array (although of course, you should free the - * array itself if you allocated it). - * @param repo The repository containing the path. - * @param flags A combination of GIT_ATTR_CHECK... flags. - * @param path The path inside the repo to check attributes. This - * does not have to exist, but if it does not, then - * it will be treated as a plain file (i.e. not a directory). - * @param num_attr The number of attributes being looked up - * @param names An array of num_attr strings containing attribute names. - */ -GIT_EXTERN(int) git_attr_get_many( - const char **values_out, - git_repository *repo, - uint32_t flags, - const char *path, - size_t num_attr, - const char **names); - -typedef int (*git_attr_foreach_cb)(const char *name, const char *value, void *payload); - -/** - * Loop over all the git attributes for a path. - * - * @param repo The repository containing the path. - * @param flags A combination of GIT_ATTR_CHECK... flags. - * @param path Path inside the repo to check attributes. This does not have - * to exist, but if it does not, then it will be treated as a - * plain file (i.e. not a directory). - * @param callback Function to invoke on each attribute name and value. The - * value may be NULL is the attribute is explicitly set to - * UNSPECIFIED using the '!' sign. Callback will be invoked - * only once per attribute name, even if there are multiple - * rules for a given file. The highest priority rule will be - * used. Return a non-zero value from this to stop looping. - * The value will be returned from `git_attr_foreach`. - * @param payload Passed on as extra parameter to callback function. - * @return 0 on success, non-zero callback return value, or error code - */ -GIT_EXTERN(int) git_attr_foreach( - git_repository *repo, - uint32_t flags, - const char *path, - git_attr_foreach_cb callback, - void *payload); - -/** - * Flush the gitattributes cache. - * - * Call this if you have reason to believe that the attributes files on - * disk no longer match the cached contents of memory. This will cause - * the attributes files to be reloaded the next time that an attribute - * access function is called. - */ -GIT_EXTERN(void) git_attr_cache_flush( - git_repository *repo); - -/** - * Add a macro definition. - * - * Macros will automatically be loaded from the top level `.gitattributes` - * file of the repository (plus the build-in "binary" macro). This - * function allows you to add others. For example, to add the default - * macro, you would call: - * - * git_attr_add_macro(repo, "binary", "-diff -crlf"); - */ -GIT_EXTERN(int) git_attr_add_macro( - git_repository *repo, - const char *name, - const char *values); - -/** @} */ -GIT_END_DECL -#endif - diff --git a/vendor/libgit2/include/git2/blame.h b/vendor/libgit2/include/git2/blame.h deleted file mode 100644 index 173e9994bf..0000000000 --- a/vendor/libgit2/include/git2/blame.h +++ /dev/null @@ -1,212 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#ifndef INCLUDE_git_blame_h__ -#define INCLUDE_git_blame_h__ - -#include "common.h" -#include "oid.h" - -/** - * @file git2/blame.h - * @brief Git blame routines - * @defgroup git_blame Git blame routines - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** - * Flags for indicating option behavior for git_blame APIs. - */ -typedef enum { - /** Normal blame, the default */ - GIT_BLAME_NORMAL = 0, - /** Track lines that have moved within a file (like `git blame -M`). - * NOT IMPLEMENTED. */ - GIT_BLAME_TRACK_COPIES_SAME_FILE = (1<<0), - /** Track lines that have moved across files in the same commit (like `git blame -C`). - * NOT IMPLEMENTED. */ - GIT_BLAME_TRACK_COPIES_SAME_COMMIT_MOVES = (1<<1), - /** Track lines that have been copied from another file that exists in the - * same commit (like `git blame -CC`). Implies SAME_FILE. - * NOT IMPLEMENTED. */ - GIT_BLAME_TRACK_COPIES_SAME_COMMIT_COPIES = (1<<2), - /** Track lines that have been copied from another file that exists in *any* - * commit (like `git blame -CCC`). Implies SAME_COMMIT_COPIES. - * NOT IMPLEMENTED. */ - GIT_BLAME_TRACK_COPIES_ANY_COMMIT_COPIES = (1<<3), - /** Restrict the search of commits to those reachable following only the - * first parents. */ - GIT_BLAME_FIRST_PARENT = (1<<4), -} git_blame_flag_t; - -/** - * Blame options structure - * - * Use zeros to indicate default settings. It's easiest to use the - * `GIT_BLAME_OPTIONS_INIT` macro: - * git_blame_options opts = GIT_BLAME_OPTIONS_INIT; - * - * - `flags` is a combination of the `git_blame_flag_t` values above. - * - `min_match_characters` is the lower bound on the number of alphanumeric - * characters that must be detected as moving/copying within a file for it to - * associate those lines with the parent commit. The default value is 20. - * This value only takes effect if any of the `GIT_BLAME_TRACK_COPIES_*` - * flags are specified. - * - `newest_commit` is the id of the newest commit to consider. The default - * is HEAD. - * - `oldest_commit` is the id of the oldest commit to consider. The default - * is the first commit encountered with a NULL parent. - * - `min_line` is the first line in the file to blame. The default is 1 (line - * numbers start with 1). - * - `max_line` is the last line in the file to blame. The default is the last - * line of the file. - */ -typedef struct git_blame_options { - unsigned int version; - - uint32_t flags; - uint16_t min_match_characters; - git_oid newest_commit; - git_oid oldest_commit; - uint32_t min_line; - uint32_t max_line; -} git_blame_options; - -#define GIT_BLAME_OPTIONS_VERSION 1 -#define GIT_BLAME_OPTIONS_INIT {GIT_BLAME_OPTIONS_VERSION} - -/** - * Initializes a `git_blame_options` with default values. Equivalent to - * creating an instance with GIT_BLAME_OPTIONS_INIT. - * - * @param opts The `git_blame_options` struct to initialize - * @param version Version of struct; pass `GIT_BLAME_OPTIONS_VERSION` - * @return Zero on success; -1 on failure. - */ -GIT_EXTERN(int) git_blame_init_options( - git_blame_options *opts, - unsigned int version); - -/** - * Structure that represents a blame hunk. - * - * - `lines_in_hunk` is the number of lines in this hunk - * - `final_commit_id` is the OID of the commit where this line was last - * changed. - * - `final_start_line_number` is the 1-based line number where this hunk - * begins, in the final version of the file - * - `orig_commit_id` is the OID of the commit where this hunk was found. This - * will usually be the same as `final_commit_id`, except when - * `GIT_BLAME_TRACK_COPIES_ANY_COMMIT_COPIES` has been specified. - * - `orig_path` is the path to the file where this hunk originated, as of the - * commit specified by `orig_commit_id`. - * - `orig_start_line_number` is the 1-based line number where this hunk begins - * in the file named by `orig_path` in the commit specified by - * `orig_commit_id`. - * - `boundary` is 1 iff the hunk has been tracked to a boundary commit (the - * root, or the commit specified in git_blame_options.oldest_commit) - */ -typedef struct git_blame_hunk { - uint16_t lines_in_hunk; - - git_oid final_commit_id; - uint16_t final_start_line_number; - git_signature *final_signature; - - git_oid orig_commit_id; - const char *orig_path; - uint16_t orig_start_line_number; - git_signature *orig_signature; - - char boundary; -} git_blame_hunk; - - -/* Opaque structure to hold blame results */ -typedef struct git_blame git_blame; - -/** - * Gets the number of hunks that exist in the blame structure. - */ -GIT_EXTERN(uint32_t) git_blame_get_hunk_count(git_blame *blame); - -/** - * Gets the blame hunk at the given index. - * - * @param blame the blame structure to query - * @param index index of the hunk to retrieve - * @return the hunk at the given index, or NULL on error - */ -GIT_EXTERN(const git_blame_hunk*) git_blame_get_hunk_byindex( - git_blame *blame, - uint32_t index); - -/** - * Gets the hunk that relates to the given line number in the newest commit. - * - * @param blame the blame structure to query - * @param lineno the (1-based) line number to find a hunk for - * @return the hunk that contains the given line, or NULL on error - */ -GIT_EXTERN(const git_blame_hunk*) git_blame_get_hunk_byline( - git_blame *blame, - uint32_t lineno); - -/** - * Get the blame for a single file. - * - * @param out pointer that will receive the blame object - * @param repo repository whose history is to be walked - * @param path path to file to consider - * @param options options for the blame operation. If NULL, this is treated as - * though GIT_BLAME_OPTIONS_INIT were passed. - * @return 0 on success, or an error code. (use giterr_last for information - * about the error.) - */ -GIT_EXTERN(int) git_blame_file( - git_blame **out, - git_repository *repo, - const char *path, - git_blame_options *options); - - -/** - * Get blame data for a file that has been modified in memory. The `reference` - * parameter is a pre-calculated blame for the in-odb history of the file. This - * means that once a file blame is completed (which can be expensive), updating - * the buffer blame is very fast. - * - * Lines that differ between the buffer and the committed version are marked as - * having a zero OID for their final_commit_id. - * - * @param out pointer that will receive the resulting blame data - * @param reference cached blame from the history of the file (usually the output - * from git_blame_file) - * @param buffer the (possibly) modified contents of the file - * @param buffer_len number of valid bytes in the buffer - * @return 0 on success, or an error code. (use giterr_last for information - * about the error) - */ -GIT_EXTERN(int) git_blame_buffer( - git_blame **out, - git_blame *reference, - const char *buffer, - size_t buffer_len); - -/** - * Free memory allocated by git_blame_file or git_blame_buffer. - * - * @param blame the blame structure to free - */ -GIT_EXTERN(void) git_blame_free(git_blame *blame); - -/** @} */ -GIT_END_DECL -#endif - diff --git a/vendor/libgit2/include/git2/blob.h b/vendor/libgit2/include/git2/blob.h deleted file mode 100644 index 4a6d8e50aa..0000000000 --- a/vendor/libgit2/include/git2/blob.h +++ /dev/null @@ -1,221 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_blob_h__ -#define INCLUDE_git_blob_h__ - -#include "common.h" -#include "types.h" -#include "oid.h" -#include "object.h" -#include "buffer.h" - -/** - * @file git2/blob.h - * @brief Git blob load and write routines - * @defgroup git_blob Git blob load and write routines - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** - * Lookup a blob object from a repository. - * - * @param blob pointer to the looked up blob - * @param repo the repo to use when locating the blob. - * @param id identity of the blob to locate. - * @return 0 or an error code - */ -GIT_EXTERN(int) git_blob_lookup(git_blob **blob, git_repository *repo, const git_oid *id); - -/** - * Lookup a blob object from a repository, - * given a prefix of its identifier (short id). - * - * @see git_object_lookup_prefix - * - * @param blob pointer to the looked up blob - * @param repo the repo to use when locating the blob. - * @param id identity of the blob to locate. - * @param len the length of the short identifier - * @return 0 or an error code - */ -GIT_EXTERN(int) git_blob_lookup_prefix(git_blob **blob, git_repository *repo, const git_oid *id, size_t len); - -/** - * Close an open blob - * - * This is a wrapper around git_object_free() - * - * IMPORTANT: - * It *is* necessary to call this method when you stop - * using a blob. Failure to do so will cause a memory leak. - * - * @param blob the blob to close - */ -GIT_EXTERN(void) git_blob_free(git_blob *blob); - -/** - * Get the id of a blob. - * - * @param blob a previously loaded blob. - * @return SHA1 hash for this blob. - */ -GIT_EXTERN(const git_oid *) git_blob_id(const git_blob *blob); - -/** - * Get the repository that contains the blob. - * - * @param blob A previously loaded blob. - * @return Repository that contains this blob. - */ -GIT_EXTERN(git_repository *) git_blob_owner(const git_blob *blob); - -/** - * Get a read-only buffer with the raw content of a blob. - * - * A pointer to the raw content of a blob is returned; - * this pointer is owned internally by the object and shall - * not be free'd. The pointer may be invalidated at a later - * time. - * - * @param blob pointer to the blob - * @return the pointer - */ -GIT_EXTERN(const void *) git_blob_rawcontent(const git_blob *blob); - -/** - * Get the size in bytes of the contents of a blob - * - * @param blob pointer to the blob - * @return size on bytes - */ -GIT_EXTERN(git_off_t) git_blob_rawsize(const git_blob *blob); - -/** - * Get a buffer with the filtered content of a blob. - * - * This applies filters as if the blob was being checked out to the - * working directory under the specified filename. This may apply - * CRLF filtering or other types of changes depending on the file - * attributes set for the blob and the content detected in it. - * - * The output is written into a `git_buf` which the caller must free - * when done (via `git_buf_free`). - * - * If no filters need to be applied, then the `out` buffer will just - * be populated with a pointer to the raw content of the blob. In - * that case, be careful to *not* free the blob until done with the - * buffer or copy it into memory you own. - * - * @param out The git_buf to be filled in - * @param blob Pointer to the blob - * @param as_path Path used for file attribute lookups, etc. - * @param check_for_binary_data Should this test if blob content contains - * NUL bytes / looks like binary data before applying filters? - * @return 0 on success or an error code - */ -GIT_EXTERN(int) git_blob_filtered_content( - git_buf *out, - git_blob *blob, - const char *as_path, - int check_for_binary_data); - -/** - * Read a file from the working folder of a repository - * and write it to the Object Database as a loose blob - * - * @param id return the id of the written blob - * @param repo repository where the blob will be written. - * this repository cannot be bare - * @param relative_path file from which the blob will be created, - * relative to the repository's working dir - * @return 0 or an error code - */ -GIT_EXTERN(int) git_blob_create_fromworkdir(git_oid *id, git_repository *repo, const char *relative_path); - -/** - * Read a file from the filesystem and write its content - * to the Object Database as a loose blob - * - * @param id return the id of the written blob - * @param repo repository where the blob will be written. - * this repository can be bare or not - * @param path file from which the blob will be created - * @return 0 or an error code - */ -GIT_EXTERN(int) git_blob_create_fromdisk(git_oid *id, git_repository *repo, const char *path); - - -typedef int (*git_blob_chunk_cb)(char *content, size_t max_length, void *payload); - -/** - * Write a loose blob to the Object Database from a - * provider of chunks of data. - * - * If the `hintpath` parameter is filled, it will be used to determine - * what git filters should be applied to the object before it is written - * to the object database. - * - * The implementation of the callback MUST respect the following rules: - * - * - `content` must be filled by the callback. The maximum number of - * bytes that the buffer can accept per call is defined by the - * `max_length` parameter. Allocation and freeing of the buffer will - * be taken care of by libgit2. - * - * - The `callback` must return the number of bytes that have been - * written to the `content` buffer. - * - * - When there is no more data to stream, `callback` should return - * 0. This will prevent it from being invoked anymore. - * - * - If an error occurs, the callback should return a negative value. - * This value will be returned to the caller. - * - * @param id Return the id of the written blob - * @param repo Repository where the blob will be written. - * This repository can be bare or not. - * @param hintpath If not NULL, will be used to select data filters - * to apply onto the content of the blob to be created. - * @return 0 or error code (from either libgit2 or callback function) - */ -GIT_EXTERN(int) git_blob_create_fromchunks( - git_oid *id, - git_repository *repo, - const char *hintpath, - git_blob_chunk_cb callback, - void *payload); - -/** - * Write an in-memory buffer to the ODB as a blob - * - * @param id return the id of the written blob - * @param repo repository where to blob will be written - * @param buffer data to be written into the blob - * @param len length of the data - * @return 0 or an error code - */ -GIT_EXTERN(int) git_blob_create_frombuffer( - git_oid *id, git_repository *repo, const void *buffer, size_t len); - -/** - * Determine if the blob content is most certainly binary or not. - * - * The heuristic used to guess if a file is binary is taken from core git: - * Searching for NUL bytes and looking for a reasonable ratio of printable - * to non-printable characters among the first 8000 bytes. - * - * @param blob The blob which content should be analyzed - * @return 1 if the content of the blob is detected - * as binary; 0 otherwise. - */ -GIT_EXTERN(int) git_blob_is_binary(const git_blob *blob); - -/** @} */ -GIT_END_DECL -#endif diff --git a/vendor/libgit2/include/git2/branch.h b/vendor/libgit2/include/git2/branch.h deleted file mode 100644 index 34354f4e57..0000000000 --- a/vendor/libgit2/include/git2/branch.h +++ /dev/null @@ -1,280 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_branch_h__ -#define INCLUDE_git_branch_h__ - -#include "common.h" -#include "oid.h" -#include "types.h" - -/** - * @file git2/branch.h - * @brief Git branch parsing routines - * @defgroup git_branch Git branch management - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** - * Create a new branch pointing at a target commit - * - * A new direct reference will be created pointing to - * this target commit. If `force` is true and a reference - * already exists with the given name, it'll be replaced. - * - * The returned reference must be freed by the user. - * - * The branch name will be checked for validity. - * See `git_tag_create()` for rules about valid names. - * - * @param out Pointer where to store the underlying reference. - * - * @param branch_name Name for the branch; this name is - * validated for consistency. It should also not conflict with - * an already existing branch name. - * - * @param target Commit to which this branch should point. This object - * must belong to the given `repo`. - * - * @param force Overwrite existing branch. - * - * @return 0, GIT_EINVALIDSPEC or an error code. - * A proper reference is written in the refs/heads namespace - * pointing to the provided target commit. - */ -GIT_EXTERN(int) git_branch_create( - git_reference **out, - git_repository *repo, - const char *branch_name, - const git_commit *target, - int force); - -/** - * Create a new branch pointing at a target commit - * - * This behaves like `git_branch_create()` but takes an annotated - * commit, which lets you specify which extended sha syntax string was - * specified by a user, allowing for more exact reflog messages. - * - * See the documentation for `git_branch_create()`. - * - * @see git_branch_create - */ -GIT_EXTERN(int) git_branch_create_from_annotated( - git_reference **ref_out, - git_repository *repository, - const char *branch_name, - const git_annotated_commit *commit, - int force); - -/** - * Delete an existing branch reference. - * - * If the branch is successfully deleted, the passed reference - * object will be invalidated. The reference must be freed manually - * by the user. - * - * @param branch A valid reference representing a branch - * @return 0 on success, or an error code. - */ -GIT_EXTERN(int) git_branch_delete(git_reference *branch); - -/** Iterator type for branches */ -typedef struct git_branch_iterator git_branch_iterator; - -/** - * Create an iterator which loops over the requested branches. - * - * @param out the iterator - * @param repo Repository where to find the branches. - * @param list_flags Filtering flags for the branch - * listing. Valid values are GIT_BRANCH_LOCAL, GIT_BRANCH_REMOTE - * or GIT_BRANCH_ALL. - * - * @return 0 on success or an error code - */ -GIT_EXTERN(int) git_branch_iterator_new( - git_branch_iterator **out, - git_repository *repo, - git_branch_t list_flags); - -/** - * Retrieve the next branch from the iterator - * - * @param out the reference - * @param out_type the type of branch (local or remote-tracking) - * @param iter the branch iterator - * @return 0 on success, GIT_ITEROVER if there are no more branches or an error code. - */ -GIT_EXTERN(int) git_branch_next(git_reference **out, git_branch_t *out_type, git_branch_iterator *iter); - -/** - * Free a branch iterator - * - * @param iter the iterator to free - */ -GIT_EXTERN(void) git_branch_iterator_free(git_branch_iterator *iter); - -/** - * Move/rename an existing local branch reference. - * - * The new branch name will be checked for validity. - * See `git_tag_create()` for rules about valid names. - * - * @param branch Current underlying reference of the branch. - * - * @param new_branch_name Target name of the branch once the move - * is performed; this name is validated for consistency. - * - * @param force Overwrite existing branch. - * - * @return 0 on success, GIT_EINVALIDSPEC or an error code. - */ -GIT_EXTERN(int) git_branch_move( - git_reference **out, - git_reference *branch, - const char *new_branch_name, - int force); - -/** - * Lookup a branch by its name in a repository. - * - * The generated reference must be freed by the user. - * - * The branch name will be checked for validity. - * See `git_tag_create()` for rules about valid names. - * - * @param out pointer to the looked-up branch reference - * - * @param repo the repository to look up the branch - * - * @param branch_name Name of the branch to be looked-up; - * this name is validated for consistency. - * - * @param branch_type Type of the considered branch. This should - * be valued with either GIT_BRANCH_LOCAL or GIT_BRANCH_REMOTE. - * - * @return 0 on success; GIT_ENOTFOUND when no matching branch - * exists, GIT_EINVALIDSPEC, otherwise an error code. - */ -GIT_EXTERN(int) git_branch_lookup( - git_reference **out, - git_repository *repo, - const char *branch_name, - git_branch_t branch_type); - -/** - * Return the name of the given local or remote branch. - * - * The name of the branch matches the definition of the name - * for git_branch_lookup. That is, if the returned name is given - * to git_branch_lookup() then the reference is returned that - * was given to this function. - * - * @param out where the pointer of branch name is stored; - * this is valid as long as the ref is not freed. - * @param ref the reference ideally pointing to a branch - * - * @return 0 on success; otherwise an error code (e.g., if the - * ref is no local or remote branch). - */ -GIT_EXTERN(int) git_branch_name( - const char **out, - const git_reference *ref); - -/** - * Return the reference supporting the remote tracking branch, - * given a local branch reference. - * - * @param out Pointer where to store the retrieved - * reference. - * - * @param branch Current underlying reference of the branch. - * - * @return 0 on success; GIT_ENOTFOUND when no remote tracking - * reference exists, otherwise an error code. - */ -GIT_EXTERN(int) git_branch_upstream( - git_reference **out, - const git_reference *branch); - -/** - * Set the upstream configuration for a given local branch - * - * @param branch the branch to configure - * - * @param upstream_name remote-tracking or local branch to set as - * upstream. Pass NULL to unset. - * - * @return 0 or an error code - */ -GIT_EXTERN(int) git_branch_set_upstream(git_reference *branch, const char *upstream_name); - -/** - * Return the name of the reference supporting the remote tracking branch, - * given the name of a local branch reference. - * - * @param out Pointer to the user-allocated git_buf which will be - * filled with the name of the reference. - * - * @param repo the repository where the branches live - * - * @param refname reference name of the local branch. - * - * @return 0, GIT_ENOTFOUND when no remote tracking reference exists, - * otherwise an error code. - */ -GIT_EXTERN(int) git_branch_upstream_name( - git_buf *out, - git_repository *repo, - const char *refname); - -/** - * Determine if the current local branch is pointed at by HEAD. - * - * @param branch Current underlying reference of the branch. - * - * @return 1 if HEAD points at the branch, 0 if it isn't, - * error code otherwise. - */ -GIT_EXTERN(int) git_branch_is_head( - const git_reference *branch); - -/** - * Return the name of remote that the remote tracking branch belongs to. - * - * @param out Pointer to the user-allocated git_buf which will be filled with the name of the remote. - * - * @param repo The repository where the branch lives. - * - * @param canonical_branch_name name of the remote tracking branch. - * - * @return 0, GIT_ENOTFOUND - * when no remote matching remote was found, - * GIT_EAMBIGUOUS when the branch maps to several remotes, - * otherwise an error code. - */ -GIT_EXTERN(int) git_branch_remote_name( - git_buf *out, - git_repository *repo, - const char *canonical_branch_name); - - -/** - * Retrieve the name fo the upstream remote of a local branch - * - * @param buf the buffer into which to write the name - * @param repo the repository in which to look - * @param refname the full name of the branch - * @return 0 or an error code - */ - GIT_EXTERN(int) git_branch_upstream_remote(git_buf *buf, git_repository *repo, const char *refname); - -/** @} */ -GIT_END_DECL -#endif diff --git a/vendor/libgit2/include/git2/buffer.h b/vendor/libgit2/include/git2/buffer.h deleted file mode 100644 index 9fc6a58055..0000000000 --- a/vendor/libgit2/include/git2/buffer.h +++ /dev/null @@ -1,128 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_buf_h__ -#define INCLUDE_git_buf_h__ - -#include "common.h" - -/** - * @file git2/buffer.h - * @brief Buffer export structure - * - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** - * A data buffer for exporting data from libgit2 - * - * Sometimes libgit2 wants to return an allocated data buffer to the - * caller and have the caller take responsibility for freeing that memory. - * This can be awkward if the caller does not have easy access to the same - * allocation functions that libgit2 is using. In those cases, libgit2 - * will fill in a `git_buf` and the caller can use `git_buf_free()` to - * release it when they are done. - * - * A `git_buf` may also be used for the caller to pass in a reference to - * a block of memory they hold. In this case, libgit2 will not resize or - * free the memory, but will read from it as needed. - * - * A `git_buf` is a public structure with three fields: - * - * - `ptr` points to the start of the allocated memory. If it is NULL, - * then the `git_buf` is considered empty and libgit2 will feel free - * to overwrite it with new data. - * - * - `size` holds the size (in bytes) of the data that is actually used. - * - * - `asize` holds the known total amount of allocated memory if the `ptr` - * was allocated by libgit2. It may be larger than `size`. If `ptr` - * was not allocated by libgit2 and should not be resized and/or freed, - * then `asize` will be set to zero. - * - * Some APIs may occasionally do something slightly unusual with a buffer, - * such as setting `ptr` to a value that was passed in by the user. In - * those cases, the behavior will be clearly documented by the API. - */ -typedef struct { - char *ptr; - size_t asize, size; -} git_buf; - -/** - * Static initializer for git_buf from static buffer - */ -#define GIT_BUF_INIT_CONST(STR,LEN) { (char *)(STR), 0, (size_t)(LEN) } - -/** - * Free the memory referred to by the git_buf. - * - * Note that this does not free the `git_buf` itself, just the memory - * pointed to by `buffer->ptr`. This will not free the memory if it looks - * like it was not allocated internally, but it will clear the buffer back - * to the empty state. - * - * @param buffer The buffer to deallocate - */ -GIT_EXTERN(void) git_buf_free(git_buf *buffer); - -/** - * Resize the buffer allocation to make more space. - * - * This will attempt to grow the buffer to accommodate the target size. - * - * If the buffer refers to memory that was not allocated by libgit2 (i.e. - * the `asize` field is zero), then `ptr` will be replaced with a newly - * allocated block of data. Be careful so that memory allocated by the - * caller is not lost. As a special variant, if you pass `target_size` as - * 0 and the memory is not allocated by libgit2, this will allocate a new - * buffer of size `size` and copy the external data into it. - * - * Currently, this will never shrink a buffer, only expand it. - * - * If the allocation fails, this will return an error and the buffer will be - * marked as invalid for future operations, invaliding the contents. - * - * @param buffer The buffer to be resized; may or may not be allocated yet - * @param target_size The desired available size - * @return 0 on success, -1 on allocation failure - */ -GIT_EXTERN(int) git_buf_grow(git_buf *buffer, size_t target_size); - -/** - * Set buffer to a copy of some raw data. - * - * @param buffer The buffer to set - * @param data The data to copy into the buffer - * @param datalen The length of the data to copy into the buffer - * @return 0 on success, -1 on allocation failure - */ -GIT_EXTERN(int) git_buf_set( - git_buf *buffer, const void *data, size_t datalen); - -/** -* Check quickly if buffer looks like it contains binary data -* -* @param buf Buffer to check -* @return 1 if buffer looks like non-text data -*/ -GIT_EXTERN(int) git_buf_is_binary(const git_buf *buf); - -/** -* Check quickly if buffer contains a NUL byte -* -* @param buf Buffer to check -* @return 1 if buffer contains a NUL byte -*/ -GIT_EXTERN(int) git_buf_contains_nul(const git_buf *buf); - -GIT_END_DECL - -/** @} */ - -#endif diff --git a/vendor/libgit2/include/git2/checkout.h b/vendor/libgit2/include/git2/checkout.h deleted file mode 100644 index 6cf9ed8bd1..0000000000 --- a/vendor/libgit2/include/git2/checkout.h +++ /dev/null @@ -1,358 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_checkout_h__ -#define INCLUDE_git_checkout_h__ - -#include "common.h" -#include "types.h" -#include "diff.h" - -/** - * @file git2/checkout.h - * @brief Git checkout routines - * @defgroup git_checkout Git checkout routines - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** - * Checkout behavior flags - * - * In libgit2, checkout is used to update the working directory and index - * to match a target tree. Unlike git checkout, it does not move the HEAD - * commit for you - use `git_repository_set_head` or the like to do that. - * - * Checkout looks at (up to) four things: the "target" tree you want to - * check out, the "baseline" tree of what was checked out previously, the - * working directory for actual files, and the index for staged changes. - * - * You give checkout one of three strategies for update: - * - * - `GIT_CHECKOUT_NONE` is a dry-run strategy that checks for conflicts, - * etc., but doesn't make any actual changes. - * - * - `GIT_CHECKOUT_FORCE` is at the opposite extreme, taking any action to - * make the working directory match the target (including potentially - * discarding modified files). - * - * - `GIT_CHECKOUT_SAFE` is between these two options, it will only make - * modifications that will not lose changes. - * - * | target == baseline | target != baseline | - * ---------------------|-----------------------|----------------------| - * workdir == baseline | no action | create, update, or | - * | | delete file | - * ---------------------|-----------------------|----------------------| - * workdir exists and | no action | conflict (notify | - * is != baseline | notify dirty MODIFIED | and cancel checkout) | - * ---------------------|-----------------------|----------------------| - * workdir missing, | notify dirty DELETED | create file | - * baseline present | | | - * ---------------------|-----------------------|----------------------| - * - * To emulate `git checkout`, use `GIT_CHECKOUT_SAFE` with a checkout - * notification callback (see below) that displays information about dirty - * files. The default behavior will cancel checkout on conflicts. - * - * To emulate `git checkout-index`, use `GIT_CHECKOUT_SAFE` with a - * notification callback that cancels the operation if a dirty-but-existing - * file is found in the working directory. This core git command isn't - * quite "force" but is sensitive about some types of changes. - * - * To emulate `git checkout -f`, use `GIT_CHECKOUT_FORCE`. - * - * - * There are some additional flags to modified the behavior of checkout: - * - * - GIT_CHECKOUT_ALLOW_CONFLICTS makes SAFE mode apply safe file updates - * even if there are conflicts (instead of cancelling the checkout). - * - * - GIT_CHECKOUT_REMOVE_UNTRACKED means remove untracked files (i.e. not - * in target, baseline, or index, and not ignored) from the working dir. - * - * - GIT_CHECKOUT_REMOVE_IGNORED means remove ignored files (that are also - * untracked) from the working directory as well. - * - * - GIT_CHECKOUT_UPDATE_ONLY means to only update the content of files that - * already exist. Files will not be created nor deleted. This just skips - * applying adds, deletes, and typechanges. - * - * - GIT_CHECKOUT_DONT_UPDATE_INDEX prevents checkout from writing the - * updated files' information to the index. - * - * - Normally, checkout will reload the index and git attributes from disk - * before any operations. GIT_CHECKOUT_NO_REFRESH prevents this reload. - * - * - Unmerged index entries are conflicts. GIT_CHECKOUT_SKIP_UNMERGED skips - * files with unmerged index entries instead. GIT_CHECKOUT_USE_OURS and - * GIT_CHECKOUT_USE_THEIRS to proceed with the checkout using either the - * stage 2 ("ours") or stage 3 ("theirs") version of files in the index. - * - * - GIT_CHECKOUT_DONT_OVERWRITE_IGNORED prevents ignored files from being - * overwritten. Normally, files that are ignored in the working directory - * are not considered "precious" and may be overwritten if the checkout - * target contains that file. - * - * - GIT_CHECKOUT_DONT_REMOVE_EXISTING prevents checkout from removing - * files or folders that fold to the same name on case insensitive - * filesystems. This can cause files to retain their existing names - * and write through existing symbolic links. - */ -typedef enum { - GIT_CHECKOUT_NONE = 0, /**< default is a dry run, no actual updates */ - - /** Allow safe updates that cannot overwrite uncommitted data */ - GIT_CHECKOUT_SAFE = (1u << 0), - - /** Allow all updates to force working directory to look like index */ - GIT_CHECKOUT_FORCE = (1u << 1), - - - /** Allow checkout to recreate missing files */ - GIT_CHECKOUT_RECREATE_MISSING = (1u << 2), - - /** Allow checkout to make safe updates even if conflicts are found */ - GIT_CHECKOUT_ALLOW_CONFLICTS = (1u << 4), - - /** Remove untracked files not in index (that are not ignored) */ - GIT_CHECKOUT_REMOVE_UNTRACKED = (1u << 5), - - /** Remove ignored files not in index */ - GIT_CHECKOUT_REMOVE_IGNORED = (1u << 6), - - /** Only update existing files, don't create new ones */ - GIT_CHECKOUT_UPDATE_ONLY = (1u << 7), - - /** - * Normally checkout updates index entries as it goes; this stops that. - * Implies `GIT_CHECKOUT_DONT_WRITE_INDEX`. - */ - GIT_CHECKOUT_DONT_UPDATE_INDEX = (1u << 8), - - /** Don't refresh index/config/etc before doing checkout */ - GIT_CHECKOUT_NO_REFRESH = (1u << 9), - - /** Allow checkout to skip unmerged files */ - GIT_CHECKOUT_SKIP_UNMERGED = (1u << 10), - /** For unmerged files, checkout stage 2 from index */ - GIT_CHECKOUT_USE_OURS = (1u << 11), - /** For unmerged files, checkout stage 3 from index */ - GIT_CHECKOUT_USE_THEIRS = (1u << 12), - - /** Treat pathspec as simple list of exact match file paths */ - GIT_CHECKOUT_DISABLE_PATHSPEC_MATCH = (1u << 13), - - /** Ignore directories in use, they will be left empty */ - GIT_CHECKOUT_SKIP_LOCKED_DIRECTORIES = (1u << 18), - - /** Don't overwrite ignored files that exist in the checkout target */ - GIT_CHECKOUT_DONT_OVERWRITE_IGNORED = (1u << 19), - - /** Write normal merge files for conflicts */ - GIT_CHECKOUT_CONFLICT_STYLE_MERGE = (1u << 20), - - /** Include common ancestor data in diff3 format files for conflicts */ - GIT_CHECKOUT_CONFLICT_STYLE_DIFF3 = (1u << 21), - - /** Don't overwrite existing files or folders */ - GIT_CHECKOUT_DONT_REMOVE_EXISTING = (1u << 22), - - /** Normally checkout writes the index upon completion; this prevents that. */ - GIT_CHECKOUT_DONT_WRITE_INDEX = (1u << 23), - - /** - * THE FOLLOWING OPTIONS ARE NOT YET IMPLEMENTED - */ - - /** Recursively checkout submodules with same options (NOT IMPLEMENTED) */ - GIT_CHECKOUT_UPDATE_SUBMODULES = (1u << 16), - /** Recursively checkout submodules if HEAD moved in super repo (NOT IMPLEMENTED) */ - GIT_CHECKOUT_UPDATE_SUBMODULES_IF_CHANGED = (1u << 17), - -} git_checkout_strategy_t; - -/** - * Checkout notification flags - * - * Checkout will invoke an options notification callback (`notify_cb`) for - * certain cases - you pick which ones via `notify_flags`: - * - * - GIT_CHECKOUT_NOTIFY_CONFLICT invokes checkout on conflicting paths. - * - * - GIT_CHECKOUT_NOTIFY_DIRTY notifies about "dirty" files, i.e. those that - * do not need an update but no longer match the baseline. Core git - * displays these files when checkout runs, but won't stop the checkout. - * - * - GIT_CHECKOUT_NOTIFY_UPDATED sends notification for any file changed. - * - * - GIT_CHECKOUT_NOTIFY_UNTRACKED notifies about untracked files. - * - * - GIT_CHECKOUT_NOTIFY_IGNORED notifies about ignored files. - * - * Returning a non-zero value from this callback will cancel the checkout. - * The non-zero return value will be propagated back and returned by the - * git_checkout_... call. - * - * Notification callbacks are made prior to modifying any files on disk, - * so canceling on any notification will still happen prior to any files - * being modified. - */ -typedef enum { - GIT_CHECKOUT_NOTIFY_NONE = 0, - GIT_CHECKOUT_NOTIFY_CONFLICT = (1u << 0), - GIT_CHECKOUT_NOTIFY_DIRTY = (1u << 1), - GIT_CHECKOUT_NOTIFY_UPDATED = (1u << 2), - GIT_CHECKOUT_NOTIFY_UNTRACKED = (1u << 3), - GIT_CHECKOUT_NOTIFY_IGNORED = (1u << 4), - - GIT_CHECKOUT_NOTIFY_ALL = 0x0FFFFu -} git_checkout_notify_t; - -typedef struct { - size_t mkdir_calls; - size_t stat_calls; - size_t chmod_calls; -} git_checkout_perfdata; - -/** Checkout notification callback function */ -typedef int (*git_checkout_notify_cb)( - git_checkout_notify_t why, - const char *path, - const git_diff_file *baseline, - const git_diff_file *target, - const git_diff_file *workdir, - void *payload); - -/** Checkout progress notification function */ -typedef void (*git_checkout_progress_cb)( - const char *path, - size_t completed_steps, - size_t total_steps, - void *payload); - -/** Checkout perfdata notification function */ -typedef void (*git_checkout_perfdata_cb)( - const git_checkout_perfdata *perfdata, - void *payload); - -/** - * Checkout options structure - * - * Zero out for defaults. Initialize with `GIT_CHECKOUT_OPTIONS_INIT` macro to - * correctly set the `version` field. E.g. - * - * git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - */ -typedef struct git_checkout_options { - unsigned int version; - - unsigned int checkout_strategy; /**< default will be a dry run */ - - int disable_filters; /**< don't apply filters like CRLF conversion */ - unsigned int dir_mode; /**< default is 0755 */ - unsigned int file_mode; /**< default is 0644 or 0755 as dictated by blob */ - int file_open_flags; /**< default is O_CREAT | O_TRUNC | O_WRONLY */ - - unsigned int notify_flags; /**< see `git_checkout_notify_t` above */ - git_checkout_notify_cb notify_cb; - void *notify_payload; - - /** Optional callback to notify the consumer of checkout progress. */ - git_checkout_progress_cb progress_cb; - void *progress_payload; - - /** When not zeroed out, array of fnmatch patterns specifying which - * paths should be taken into account, otherwise all files. Use - * GIT_CHECKOUT_DISABLE_PATHSPEC_MATCH to treat as simple list. - */ - git_strarray paths; - - /** The expected content of the working directory; defaults to HEAD. - * If the working directory does not match this baseline information, - * that will produce a checkout conflict. - */ - git_tree *baseline; - - /** Like `baseline` above, though expressed as an index. This - * option overrides `baseline`. - */ - git_index *baseline_index; /**< expected content of workdir, expressed as an index. */ - - const char *target_directory; /**< alternative checkout path to workdir */ - - const char *ancestor_label; /**< the name of the common ancestor side of conflicts */ - const char *our_label; /**< the name of the "our" side of conflicts */ - const char *their_label; /**< the name of the "their" side of conflicts */ - - /** Optional callback to notify the consumer of performance data. */ - git_checkout_perfdata_cb perfdata_cb; - void *perfdata_payload; -} git_checkout_options; - -#define GIT_CHECKOUT_OPTIONS_VERSION 1 -#define GIT_CHECKOUT_OPTIONS_INIT {GIT_CHECKOUT_OPTIONS_VERSION} - -/** -* Initializes a `git_checkout_options` with default values. Equivalent to -* creating an instance with GIT_CHECKOUT_OPTIONS_INIT. -* -* @param opts the `git_checkout_options` struct to initialize. -* @param version Version of struct; pass `GIT_CHECKOUT_OPTIONS_VERSION` -* @return Zero on success; -1 on failure. -*/ -GIT_EXTERN(int) git_checkout_init_options( - git_checkout_options *opts, - unsigned int version); - -/** - * Updates files in the index and the working tree to match the content of - * the commit pointed at by HEAD. - * - * @param repo repository to check out (must be non-bare) - * @param opts specifies checkout options (may be NULL) - * @return 0 on success, GIT_EUNBORNBRANCH if HEAD points to a non - * existing branch, non-zero value returned by `notify_cb`, or - * other error code < 0 (use giterr_last for error details) - */ -GIT_EXTERN(int) git_checkout_head( - git_repository *repo, - const git_checkout_options *opts); - -/** - * Updates files in the working tree to match the content of the index. - * - * @param repo repository into which to check out (must be non-bare) - * @param index index to be checked out (or NULL to use repository index) - * @param opts specifies checkout options (may be NULL) - * @return 0 on success, non-zero return value from `notify_cb`, or error - * code < 0 (use giterr_last for error details) - */ -GIT_EXTERN(int) git_checkout_index( - git_repository *repo, - git_index *index, - const git_checkout_options *opts); - -/** - * Updates files in the index and working tree to match the content of the - * tree pointed at by the treeish. - * - * @param repo repository to check out (must be non-bare) - * @param treeish a commit, tag or tree which content will be used to update - * the working directory (or NULL to use HEAD) - * @param opts specifies checkout options (may be NULL) - * @return 0 on success, non-zero return value from `notify_cb`, or error - * code < 0 (use giterr_last for error details) - */ -GIT_EXTERN(int) git_checkout_tree( - git_repository *repo, - const git_object *treeish, - const git_checkout_options *opts); - -/** @} */ -GIT_END_DECL -#endif diff --git a/vendor/libgit2/include/git2/cherrypick.h b/vendor/libgit2/include/git2/cherrypick.h deleted file mode 100644 index edec96a944..0000000000 --- a/vendor/libgit2/include/git2/cherrypick.h +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_cherrypick_h__ -#define INCLUDE_git_cherrypick_h__ - -#include "common.h" -#include "types.h" -#include "merge.h" - -/** - * @file git2/cherrypick.h - * @brief Git cherry-pick routines - * @defgroup git_cherrypick Git cherry-pick routines - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** - * Cherry-pick options - */ -typedef struct { - unsigned int version; - - /** For merge commits, the "mainline" is treated as the parent. */ - unsigned int mainline; - - git_merge_options merge_opts; /**< Options for the merging */ - git_checkout_options checkout_opts; /**< Options for the checkout */ -} git_cherrypick_options; - -#define GIT_CHERRYPICK_OPTIONS_VERSION 1 -#define GIT_CHERRYPICK_OPTIONS_INIT {GIT_CHERRYPICK_OPTIONS_VERSION, 0, GIT_MERGE_OPTIONS_INIT, GIT_CHECKOUT_OPTIONS_INIT} - -/** - * Initializes a `git_cherrypick_options` with default values. Equivalent to - * creating an instance with GIT_CHERRYPICK_OPTIONS_INIT. - * - * @param opts the `git_cherrypick_options` struct to initialize - * @param version Version of struct; pass `GIT_CHERRYPICK_OPTIONS_VERSION` - * @return Zero on success; -1 on failure. - */ -GIT_EXTERN(int) git_cherrypick_init_options( - git_cherrypick_options *opts, - unsigned int version); - -/** - * Cherry-picks the given commit against the given "our" commit, producing an - * index that reflects the result of the cherry-pick. - * - * The returned index must be freed explicitly with `git_index_free`. - * - * @param out pointer to store the index result in - * @param repo the repository that contains the given commits - * @param cherrypick_commit the commit to cherry-pick - * @param our_commit the commit to revert against (eg, HEAD) - * @param mainline the parent of the revert commit, if it is a merge - * @param merge_options the merge options (or null for defaults) - * @return zero on success, -1 on failure. - */ -GIT_EXTERN(int) git_cherrypick_commit( - git_index **out, - git_repository *repo, - git_commit *cherrypick_commit, - git_commit *our_commit, - unsigned int mainline, - const git_merge_options *merge_options); - -/** - * Cherry-pick the given commit, producing changes in the index and working directory. - * - * @param repo the repository to cherry-pick - * @param commit the commit to cherry-pick - * @param cherrypick_options the cherry-pick options (or null for defaults) - * @return zero on success, -1 on failure. - */ -GIT_EXTERN(int) git_cherrypick( - git_repository *repo, - git_commit *commit, - const git_cherrypick_options *cherrypick_options); - -/** @} */ -GIT_END_DECL - -#endif - diff --git a/vendor/libgit2/include/git2/clone.h b/vendor/libgit2/include/git2/clone.h deleted file mode 100644 index 9e23aaccb8..0000000000 --- a/vendor/libgit2/include/git2/clone.h +++ /dev/null @@ -1,207 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_clone_h__ -#define INCLUDE_git_clone_h__ - -#include "common.h" -#include "types.h" -#include "indexer.h" -#include "checkout.h" -#include "remote.h" -#include "transport.h" - - -/** - * @file git2/clone.h - * @brief Git cloning routines - * @defgroup git_clone Git cloning routines - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** - * Options for bypassing the git-aware transport on clone. Bypassing - * it means that instead of a fetch, libgit2 will copy the object - * database directory instead of figuring out what it needs, which is - * faster. If possible, it will hardlink the files to save space. - */ -typedef enum { - /** - * Auto-detect (default), libgit2 will bypass the git-aware - * transport for local paths, but use a normal fetch for - * `file://` urls. - */ - GIT_CLONE_LOCAL_AUTO, - /** - * Bypass the git-aware transport even for a `file://` url. - */ - GIT_CLONE_LOCAL, - /** - * Do no bypass the git-aware transport - */ - GIT_CLONE_NO_LOCAL, - /** - * Bypass the git-aware transport, but do not try to use - * hardlinks. - */ - GIT_CLONE_LOCAL_NO_LINKS, -} git_clone_local_t; - -/** - * The signature of a function matching git_remote_create, with an additional - * void* as a callback payload. - * - * Callers of git_clone may provide a function matching this signature to override - * the remote creation and customization process during a clone operation. - * - * @param out the resulting remote - * @param repo the repository in which to create the remote - * @param name the remote's name - * @param url the remote's url - * @param payload an opaque payload - * @return 0, GIT_EINVALIDSPEC, GIT_EEXISTS or an error code - */ -typedef int (*git_remote_create_cb)( - git_remote **out, - git_repository *repo, - const char *name, - const char *url, - void *payload); - -/** - * The signature of a function matchin git_repository_init, with an - * aditional void * as callback payload. - * - * Callers of git_clone my provide a function matching this signature - * to override the repository creation and customization process - * during a clone operation. - * - * @param out the resulting repository - * @param path path in which to create the repository - * @param bare whether the repository is bare. This is the value from the clone options - * @param payload payload specified by the options - * @return 0, or a negative value to indicate error - */ -typedef int (*git_repository_create_cb)( - git_repository **out, - const char *path, - int bare, - void *payload); - -/** - * Clone options structure - * - * Use the GIT_CLONE_OPTIONS_INIT to get the default settings, like this: - * - * git_clone_options opts = GIT_CLONE_OPTIONS_INIT; - */ -typedef struct git_clone_options { - unsigned int version; - - /** - * These options are passed to the checkout step. To disable - * checkout, set the `checkout_strategy` to - * `GIT_CHECKOUT_NONE`. - */ - git_checkout_options checkout_opts; - - /** - * Options which control the fetch, including callbacks. - * - * The callbacks are used for reporting fetch progress, and for acquiring - * credentials in the event they are needed. - */ - git_fetch_options fetch_opts; - - /** - * Set to zero (false) to create a standard repo, or non-zero - * for a bare repo - */ - int bare; - - /** - * Whether to use a fetch or copy the object database. - */ - git_clone_local_t local; - - /** - * The name of the branch to checkout. NULL means use the - * remote's default branch. - */ - const char* checkout_branch; - - /** - * A callback used to create the new repository into which to - * clone. If NULL, the 'bare' field will be used to determine - * whether to create a bare repository. - */ - git_repository_create_cb repository_cb; - - /** - * An opaque payload to pass to the git_repository creation callback. - * This parameter is ignored unless repository_cb is non-NULL. - */ - void *repository_cb_payload; - - /** - * A callback used to create the git_remote, prior to its being - * used to perform the clone operation. See the documentation for - * git_remote_create_cb for details. This parameter may be NULL, - * indicating that git_clone should provide default behavior. - */ - git_remote_create_cb remote_cb; - - /** - * An opaque payload to pass to the git_remote creation callback. - * This parameter is ignored unless remote_cb is non-NULL. - */ - void *remote_cb_payload; -} git_clone_options; - -#define GIT_CLONE_OPTIONS_VERSION 1 -#define GIT_CLONE_OPTIONS_INIT { GIT_CLONE_OPTIONS_VERSION, \ - { GIT_CHECKOUT_OPTIONS_VERSION, GIT_CHECKOUT_SAFE }, \ - GIT_FETCH_OPTIONS_INIT } - -/** - * Initializes a `git_clone_options` with default values. Equivalent to - * creating an instance with GIT_CLONE_OPTIONS_INIT. - * - * @param opts The `git_clone_options` struct to initialize - * @param version Version of struct; pass `GIT_CLONE_OPTIONS_VERSION` - * @return Zero on success; -1 on failure. - */ -GIT_EXTERN(int) git_clone_init_options( - git_clone_options *opts, - unsigned int version); - -/** - * Clone a remote repository. - * - * By default this creates its repository and initial remote to match - * git's defaults. You can use the options in the callback to - * customize how these are created. - * - * @param out pointer that will receive the resulting repository object - * @param url the remote repository to clone - * @param local_path local directory to clone to - * @param options configuration options for the clone. If NULL, the - * function works as though GIT_OPTIONS_INIT were passed. - * @return 0 on success, any non-zero return value from a callback - * function, or a negative value to indicate an error (use - * `giterr_last` for a detailed error message) - */ -GIT_EXTERN(int) git_clone( - git_repository **out, - const char *url, - const char *local_path, - const git_clone_options *options); - -/** @} */ -GIT_END_DECL -#endif diff --git a/vendor/libgit2/include/git2/commit.h b/vendor/libgit2/include/git2/commit.h deleted file mode 100644 index 04711c1fa5..0000000000 --- a/vendor/libgit2/include/git2/commit.h +++ /dev/null @@ -1,368 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_commit_h__ -#define INCLUDE_git_commit_h__ - -#include "common.h" -#include "types.h" -#include "oid.h" -#include "object.h" - -/** - * @file git2/commit.h - * @brief Git commit parsing, formatting routines - * @defgroup git_commit Git commit parsing, formatting routines - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** - * Lookup a commit object from a repository. - * - * The returned object should be released with `git_commit_free` when no - * longer needed. - * - * @param commit pointer to the looked up commit - * @param repo the repo to use when locating the commit. - * @param id identity of the commit to locate. If the object is - * an annotated tag it will be peeled back to the commit. - * @return 0 or an error code - */ -GIT_EXTERN(int) git_commit_lookup( - git_commit **commit, git_repository *repo, const git_oid *id); - -/** - * Lookup a commit object from a repository, given a prefix of its - * identifier (short id). - * - * The returned object should be released with `git_commit_free` when no - * longer needed. - * - * @see git_object_lookup_prefix - * - * @param commit pointer to the looked up commit - * @param repo the repo to use when locating the commit. - * @param id identity of the commit to locate. If the object is - * an annotated tag it will be peeled back to the commit. - * @param len the length of the short identifier - * @return 0 or an error code - */ -GIT_EXTERN(int) git_commit_lookup_prefix( - git_commit **commit, git_repository *repo, const git_oid *id, size_t len); - -/** - * Close an open commit - * - * This is a wrapper around git_object_free() - * - * IMPORTANT: - * It *is* necessary to call this method when you stop - * using a commit. Failure to do so will cause a memory leak. - * - * @param commit the commit to close - */ - -GIT_EXTERN(void) git_commit_free(git_commit *commit); - -/** - * Get the id of a commit. - * - * @param commit a previously loaded commit. - * @return object identity for the commit. - */ -GIT_EXTERN(const git_oid *) git_commit_id(const git_commit *commit); - -/** - * Get the repository that contains the commit. - * - * @param commit A previously loaded commit. - * @return Repository that contains this commit. - */ -GIT_EXTERN(git_repository *) git_commit_owner(const git_commit *commit); - -/** - * Get the encoding for the message of a commit, - * as a string representing a standard encoding name. - * - * The encoding may be NULL if the `encoding` header - * in the commit is missing; in that case UTF-8 is assumed. - * - * @param commit a previously loaded commit. - * @return NULL, or the encoding - */ -GIT_EXTERN(const char *) git_commit_message_encoding(const git_commit *commit); - -/** - * Get the full message of a commit. - * - * The returned message will be slightly prettified by removing any - * potential leading newlines. - * - * @param commit a previously loaded commit. - * @return the message of a commit - */ -GIT_EXTERN(const char *) git_commit_message(const git_commit *commit); - -/** - * Get the full raw message of a commit. - * - * @param commit a previously loaded commit. - * @return the raw message of a commit - */ -GIT_EXTERN(const char *) git_commit_message_raw(const git_commit *commit); - -/** - * Get the short "summary" of the git commit message. - * - * The returned message is the summary of the commit, comprising the - * first paragraph of the message with whitespace trimmed and squashed. - * - * @param commit a previously loaded commit. - * @return the summary of a commit or NULL on error - */ -GIT_EXTERN(const char *) git_commit_summary(git_commit *commit); - -/** - * Get the commit time (i.e. committer time) of a commit. - * - * @param commit a previously loaded commit. - * @return the time of a commit - */ -GIT_EXTERN(git_time_t) git_commit_time(const git_commit *commit); - -/** - * Get the commit timezone offset (i.e. committer's preferred timezone) of a commit. - * - * @param commit a previously loaded commit. - * @return positive or negative timezone offset, in minutes from UTC - */ -GIT_EXTERN(int) git_commit_time_offset(const git_commit *commit); - -/** - * Get the committer of a commit. - * - * @param commit a previously loaded commit. - * @return the committer of a commit - */ -GIT_EXTERN(const git_signature *) git_commit_committer(const git_commit *commit); - -/** - * Get the author of a commit. - * - * @param commit a previously loaded commit. - * @return the author of a commit - */ -GIT_EXTERN(const git_signature *) git_commit_author(const git_commit *commit); - -/** - * Get the full raw text of the commit header. - * - * @param commit a previously loaded commit - * @return the header text of the commit - */ -GIT_EXTERN(const char *) git_commit_raw_header(const git_commit *commit); - -/** - * Get the tree pointed to by a commit. - * - * @param tree_out pointer where to store the tree object - * @param commit a previously loaded commit. - * @return 0 or an error code - */ -GIT_EXTERN(int) git_commit_tree(git_tree **tree_out, const git_commit *commit); - -/** - * Get the id of the tree pointed to by a commit. This differs from - * `git_commit_tree` in that no attempts are made to fetch an object - * from the ODB. - * - * @param commit a previously loaded commit. - * @return the id of tree pointed to by commit. - */ -GIT_EXTERN(const git_oid *) git_commit_tree_id(const git_commit *commit); - -/** - * Get the number of parents of this commit - * - * @param commit a previously loaded commit. - * @return integer of count of parents - */ -GIT_EXTERN(unsigned int) git_commit_parentcount(const git_commit *commit); - -/** - * Get the specified parent of the commit. - * - * @param out Pointer where to store the parent commit - * @param commit a previously loaded commit. - * @param n the position of the parent (from 0 to `parentcount`) - * @return 0 or an error code - */ -GIT_EXTERN(int) git_commit_parent( - git_commit **out, - const git_commit *commit, - unsigned int n); - -/** - * Get the oid of a specified parent for a commit. This is different from - * `git_commit_parent`, which will attempt to load the parent commit from - * the ODB. - * - * @param commit a previously loaded commit. - * @param n the position of the parent (from 0 to `parentcount`) - * @return the id of the parent, NULL on error. - */ -GIT_EXTERN(const git_oid *) git_commit_parent_id( - const git_commit *commit, - unsigned int n); - -/** - * Get the commit object that is the th generation ancestor - * of the named commit object, following only the first parents. - * The returned commit has to be freed by the caller. - * - * Passing `0` as the generation number returns another instance of the - * base commit itself. - * - * @param ancestor Pointer where to store the ancestor commit - * @param commit a previously loaded commit. - * @param n the requested generation - * @return 0 on success; GIT_ENOTFOUND if no matching ancestor exists - * or an error code - */ -GIT_EXTERN(int) git_commit_nth_gen_ancestor( - git_commit **ancestor, - const git_commit *commit, - unsigned int n); - -/** - * Get an arbitrary header field - * - * @param out the buffer to fill - * @param commit the commit to look in - * @param field the header field to return - * @return 0 on succeess, GIT_ENOTFOUND if the field does not exist, - * or an error code - */ -GIT_EXTERN(int) git_commit_header_field(git_buf *out, const git_commit *commit, const char *field); - -/** - * Create new commit in the repository from a list of `git_object` pointers - * - * The message will **not** be cleaned up automatically. You can do that - * with the `git_message_prettify()` function. - * - * @param id Pointer in which to store the OID of the newly created commit - * - * @param repo Repository where to store the commit - * - * @param update_ref If not NULL, name of the reference that - * will be updated to point to this commit. If the reference - * is not direct, it will be resolved to a direct reference. - * Use "HEAD" to update the HEAD of the current branch and - * make it point to this commit. If the reference doesn't - * exist yet, it will be created. If it does exist, the first - * parent must be the tip of this branch. - * - * @param author Signature with author and author time of commit - * - * @param committer Signature with committer and * commit time of commit - * - * @param message_encoding The encoding for the message in the - * commit, represented with a standard encoding name. - * E.g. "UTF-8". If NULL, no encoding header is written and - * UTF-8 is assumed. - * - * @param message Full message for this commit - * - * @param tree An instance of a `git_tree` object that will - * be used as the tree for the commit. This tree object must - * also be owned by the given `repo`. - * - * @param parent_count Number of parents for this commit - * - * @param parents Array of `parent_count` pointers to `git_commit` - * objects that will be used as the parents for this commit. This - * array may be NULL if `parent_count` is 0 (root commit). All the - * given commits must be owned by the `repo`. - * - * @return 0 or an error code - * The created commit will be written to the Object Database and - * the given reference will be updated to point to it - */ -GIT_EXTERN(int) git_commit_create( - git_oid *id, - git_repository *repo, - const char *update_ref, - const git_signature *author, - const git_signature *committer, - const char *message_encoding, - const char *message, - const git_tree *tree, - size_t parent_count, - const git_commit *parents[]); - -/** - * Create new commit in the repository using a variable argument list. - * - * The message will **not** be cleaned up automatically. You can do that - * with the `git_message_prettify()` function. - * - * The parents for the commit are specified as a variable list of pointers - * to `const git_commit *`. Note that this is a convenience method which may - * not be safe to export for certain languages or compilers - * - * All other parameters remain the same as `git_commit_create()`. - * - * @see git_commit_create - */ -GIT_EXTERN(int) git_commit_create_v( - git_oid *id, - git_repository *repo, - const char *update_ref, - const git_signature *author, - const git_signature *committer, - const char *message_encoding, - const char *message, - const git_tree *tree, - size_t parent_count, - ...); - -/** - * Amend an existing commit by replacing only non-NULL values. - * - * This creates a new commit that is exactly the same as the old commit, - * except that any non-NULL values will be updated. The new commit has - * the same parents as the old commit. - * - * The `update_ref` value works as in the regular `git_commit_create()`, - * updating the ref to point to the newly rewritten commit. If you want - * to amend a commit that is not currently the tip of the branch and then - * rewrite the following commits to reach a ref, pass this as NULL and - * update the rest of the commit chain and ref separately. - * - * Unlike `git_commit_create()`, the `author`, `committer`, `message`, - * `message_encoding`, and `tree` parameters can be NULL in which case this - * will use the values from the original `commit_to_amend`. - * - * All parameters have the same meanings as in `git_commit_create()`. - * - * @see git_commit_create - */ -GIT_EXTERN(int) git_commit_amend( - git_oid *id, - const git_commit *commit_to_amend, - const char *update_ref, - const git_signature *author, - const git_signature *committer, - const char *message_encoding, - const char *message, - const git_tree *tree); - -/** @} */ -GIT_END_DECL -#endif diff --git a/vendor/libgit2/include/git2/common.h b/vendor/libgit2/include/git2/common.h deleted file mode 100644 index d84a765123..0000000000 --- a/vendor/libgit2/include/git2/common.h +++ /dev/null @@ -1,250 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_common_h__ -#define INCLUDE_git_common_h__ - -#include -#include - -#ifdef _MSC_VER -# include "inttypes.h" -#else -# include -#endif - -#ifdef __cplusplus -# define GIT_BEGIN_DECL extern "C" { -# define GIT_END_DECL } -#else - /** Start declarations in C mode */ -# define GIT_BEGIN_DECL /* empty */ - /** End declarations in C mode */ -# define GIT_END_DECL /* empty */ -#endif - -/** Declare a public function exported for application use. */ -#if __GNUC__ >= 4 -# define GIT_EXTERN(type) extern \ - __attribute__((visibility("default"))) \ - type -#elif defined(_MSC_VER) -# define GIT_EXTERN(type) __declspec(dllexport) type -#else -# define GIT_EXTERN(type) extern type -#endif - -/** Declare a function's takes printf style arguments. */ -#ifdef __GNUC__ -# define GIT_FORMAT_PRINTF(a,b) __attribute__((format (printf, a, b))) -#else -# define GIT_FORMAT_PRINTF(a,b) /* empty */ -#endif - -#if (defined(_WIN32)) && !defined(__CYGWIN__) -#define GIT_WIN32 1 -#endif - -#ifdef __amigaos4__ -#include -#endif - -/** - * @file git2/common.h - * @brief Git common platform definitions - * @defgroup git_common Git common platform definitions - * @ingroup Git - * @{ - */ - -GIT_BEGIN_DECL - -/** - * The separator used in path list strings (ie like in the PATH - * environment variable). A semi-colon ";" is used on Windows, and - * a colon ":" for all other systems. - */ -#ifdef GIT_WIN32 -#define GIT_PATH_LIST_SEPARATOR ';' -#else -#define GIT_PATH_LIST_SEPARATOR ':' -#endif - -/** - * The maximum length of a valid git path. - */ -#define GIT_PATH_MAX 4096 - -/** - * The string representation of the null object ID. - */ -#define GIT_OID_HEX_ZERO "0000000000000000000000000000000000000000" - -/** - * Return the version of the libgit2 library - * being currently used. - * - * @param major Store the major version number - * @param minor Store the minor version number - * @param rev Store the revision (patch) number - */ -GIT_EXTERN(void) git_libgit2_version(int *major, int *minor, int *rev); - -/** - * Combinations of these values describe the features with which libgit2 - * was compiled - */ -typedef enum { - GIT_FEATURE_THREADS = (1 << 0), - GIT_FEATURE_HTTPS = (1 << 1), - GIT_FEATURE_SSH = (1 << 2), -} git_feature_t; - -/** - * Query compile time options for libgit2. - * - * @return A combination of GIT_FEATURE_* values. - * - * - GIT_FEATURE_THREADS - * Libgit2 was compiled with thread support. Note that thread support is - * still to be seen as a 'work in progress' - basic object lookups are - * believed to be threadsafe, but other operations may not be. - * - * - GIT_FEATURE_HTTPS - * Libgit2 supports the https:// protocol. This requires the openssl - * library to be found when compiling libgit2. - * - * - GIT_FEATURE_SSH - * Libgit2 supports the SSH protocol for network operations. This requires - * the libssh2 library to be found when compiling libgit2 - */ -GIT_EXTERN(int) git_libgit2_features(void); - -/** - * Global library options - * - * These are used to select which global option to set or get and are - * used in `git_libgit2_opts()`. - */ -typedef enum { - GIT_OPT_GET_MWINDOW_SIZE, - GIT_OPT_SET_MWINDOW_SIZE, - GIT_OPT_GET_MWINDOW_MAPPED_LIMIT, - GIT_OPT_SET_MWINDOW_MAPPED_LIMIT, - GIT_OPT_GET_SEARCH_PATH, - GIT_OPT_SET_SEARCH_PATH, - GIT_OPT_SET_CACHE_OBJECT_LIMIT, - GIT_OPT_SET_CACHE_MAX_SIZE, - GIT_OPT_ENABLE_CACHING, - GIT_OPT_GET_CACHED_MEMORY, - GIT_OPT_GET_TEMPLATE_PATH, - GIT_OPT_SET_TEMPLATE_PATH, - GIT_OPT_SET_SSL_CERT_LOCATIONS, -} git_libgit2_opt_t; - -/** - * Set or query a library global option - * - * Available options: - * - * * opts(GIT_OPT_GET_MWINDOW_SIZE, size_t *): - * - * > Get the maximum mmap window size - * - * * opts(GIT_OPT_SET_MWINDOW_SIZE, size_t): - * - * > Set the maximum mmap window size - * - * * opts(GIT_OPT_GET_MWINDOW_MAPPED_LIMIT, size_t *): - * - * > Get the maximum memory that will be mapped in total by the library - * - * * opts(GIT_OPT_SET_MWINDOW_MAPPED_LIMIT, size_t): - * - * >Set the maximum amount of memory that can be mapped at any time - * by the library - * - * * opts(GIT_OPT_GET_SEARCH_PATH, int level, git_buf *buf) - * - * > Get the search path for a given level of config data. "level" must - * > be one of `GIT_CONFIG_LEVEL_SYSTEM`, `GIT_CONFIG_LEVEL_GLOBAL`, or - * > `GIT_CONFIG_LEVEL_XDG`. The search path is written to the `out` - * > buffer. - * - * * opts(GIT_OPT_SET_SEARCH_PATH, int level, const char *path) - * - * > Set the search path for a level of config data. The search path - * > applied to shared attributes and ignore files, too. - * > - * > - `path` lists directories delimited by GIT_PATH_LIST_SEPARATOR. - * > Pass NULL to reset to the default (generally based on environment - * > variables). Use magic path `$PATH` to include the old value - * > of the path (if you want to prepend or append, for instance). - * > - * > - `level` must be GIT_CONFIG_LEVEL_SYSTEM, GIT_CONFIG_LEVEL_GLOBAL, - * > or GIT_CONFIG_LEVEL_XDG. - * - * * opts(GIT_OPT_SET_CACHE_OBJECT_LIMIT, git_otype type, size_t size) - * - * > Set the maximum data size for the given type of object to be - * > considered eligible for caching in memory. Setting to value to - * > zero means that that type of object will not be cached. - * > Defaults to 0 for GIT_OBJ_BLOB (i.e. won't cache blobs) and 4k - * > for GIT_OBJ_COMMIT, GIT_OBJ_TREE, and GIT_OBJ_TAG. - * - * * opts(GIT_OPT_SET_CACHE_MAX_SIZE, ssize_t max_storage_bytes) - * - * > Set the maximum total data size that will be cached in memory - * > across all repositories before libgit2 starts evicting objects - * > from the cache. This is a soft limit, in that the library might - * > briefly exceed it, but will start aggressively evicting objects - * > from cache when that happens. The default cache size is 256MB. - * - * * opts(GIT_OPT_ENABLE_CACHING, int enabled) - * - * > Enable or disable caching completely. - * > - * > Because caches are repository-specific, disabling the cache - * > cannot immediately clear all cached objects, but each cache will - * > be cleared on the next attempt to update anything in it. - * - * * opts(GIT_OPT_GET_CACHED_MEMORY, ssize_t *current, ssize_t *allowed) - * - * > Get the current bytes in cache and the maximum that would be - * > allowed in the cache. - * - * * opts(GIT_OPT_GET_TEMPLATE_PATH, git_buf *out) - * - * > Get the default template path. - * > The path is written to the `out` buffer. - * - * * opts(GIT_OPT_SET_TEMPLATE_PATH, const char *path) - * - * > Set the default template path. - * > - * > - `path` directory of template. - * - * * opts(GIT_OPT_SET_SSL_CERT_LOCATIONS, const char *file, const char *path) - * - * > Set the SSL certificate-authority locations. - * > - * > - `file` is the location of a file containing several - * > certificates concatenated together. - * > - `path` is the location of a directory holding several - * > certificates, one per file. - * > - * > Either parameter may be `NULL`, but not both. - * - * @param option Option key - * @param ... value to set the option - * @return 0 on success, <0 on failure - */ -GIT_EXTERN(int) git_libgit2_opts(int option, ...); - -/** @} */ -GIT_END_DECL - -#endif diff --git a/vendor/libgit2/include/git2/config.h b/vendor/libgit2/include/git2/config.h deleted file mode 100644 index 6d3fdb0c2e..0000000000 --- a/vendor/libgit2/include/git2/config.h +++ /dev/null @@ -1,694 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_config_h__ -#define INCLUDE_git_config_h__ - -#include "common.h" -#include "types.h" -#include "buffer.h" - -/** - * @file git2/config.h - * @brief Git config management routines - * @defgroup git_config Git config management routines - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** - * Priority level of a config file. - * These priority levels correspond to the natural escalation logic - * (from higher to lower) when searching for config entries in git.git. - * - * git_config_open_default() and git_repository_config() honor those - * priority levels as well. - */ -typedef enum { - /** System-wide configuration file; /etc/gitconfig on Linux systems */ - GIT_CONFIG_LEVEL_SYSTEM = 1, - - /** XDG compatible configuration file; typically ~/.config/git/config */ - GIT_CONFIG_LEVEL_XDG = 2, - - /** User-specific configuration file (also called Global configuration - * file); typically ~/.gitconfig - */ - GIT_CONFIG_LEVEL_GLOBAL = 3, - - /** Repository specific configuration file; $WORK_DIR/.git/config on - * non-bare repos - */ - GIT_CONFIG_LEVEL_LOCAL = 4, - - /** Application specific configuration file; freely defined by applications - */ - GIT_CONFIG_LEVEL_APP = 5, - - /** Represents the highest level available config file (i.e. the most - * specific config file available that actually is loaded) - */ - GIT_CONFIG_HIGHEST_LEVEL = -1, -} git_config_level_t; - -/** - * An entry in a configuration file - */ -typedef struct git_config_entry { - const char *name; /**< Name of the entry (normalised) */ - const char *value; /**< String value of the entry */ - git_config_level_t level; /**< Which config file this was found in */ - void (*free)(struct git_config_entry *entry); /**< Free function for this entry */ - void *payload; /**< Opaque value for the free function. Do not read or write */ -} git_config_entry; - -/** - * Free a config entry - */ -GIT_EXTERN(void) git_config_entry_free(git_config_entry *); - -typedef int (*git_config_foreach_cb)(const git_config_entry *, void *); -typedef struct git_config_iterator git_config_iterator; - -/** - * Config var type - */ -typedef enum { - GIT_CVAR_FALSE = 0, - GIT_CVAR_TRUE = 1, - GIT_CVAR_INT32, - GIT_CVAR_STRING -} git_cvar_t; - -/** - * Mapping from config variables to values. - */ -typedef struct { - git_cvar_t cvar_type; - const char *str_match; - int map_value; -} git_cvar_map; - -/** - * Locate the path to the global configuration file - * - * The user or global configuration file is usually - * located in `$HOME/.gitconfig`. - * - * This method will try to guess the full path to that - * file, if the file exists. The returned path - * may be used on any `git_config` call to load the - * global configuration file. - * - * This method will not guess the path to the xdg compatible - * config file (.config/git/config). - * - * @param out Pointer to a user-allocated git_buf in which to store the path - * @return 0 if a global configuration file has been found. Its path will be stored in `out`. - */ -GIT_EXTERN(int) git_config_find_global(git_buf *out); - -/** - * Locate the path to the global xdg compatible configuration file - * - * The xdg compatible configuration file is usually - * located in `$HOME/.config/git/config`. - * - * This method will try to guess the full path to that - * file, if the file exists. The returned path - * may be used on any `git_config` call to load the - * xdg compatible configuration file. - * - * @param out Pointer to a user-allocated git_buf in which to store the path - * @return 0 if a xdg compatible configuration file has been - * found. Its path will be stored in `out`. - */ -GIT_EXTERN(int) git_config_find_xdg(git_buf *out); - -/** - * Locate the path to the system configuration file - * - * If /etc/gitconfig doesn't exist, it will look for - * %PROGRAMFILES%\Git\etc\gitconfig. - * - * @param out Pointer to a user-allocated git_buf in which to store the path - * @return 0 if a system configuration file has been - * found. Its path will be stored in `out`. - */ -GIT_EXTERN(int) git_config_find_system(git_buf *out); - -/** - * Open the global, XDG and system configuration files - * - * Utility wrapper that finds the global, XDG and system configuration files - * and opens them into a single prioritized config object that can be - * used when accessing default config data outside a repository. - * - * @param out Pointer to store the config instance - * @return 0 or an error code - */ -GIT_EXTERN(int) git_config_open_default(git_config **out); - -/** - * Allocate a new configuration object - * - * This object is empty, so you have to add a file to it before you - * can do anything with it. - * - * @param out pointer to the new configuration - * @return 0 or an error code - */ -GIT_EXTERN(int) git_config_new(git_config **out); - -/** - * Add an on-disk config file instance to an existing config - * - * The on-disk file pointed at by `path` will be opened and - * parsed; it's expected to be a native Git config file following - * the default Git config syntax (see man git-config). - * - * Note that the configuration object will free the file - * automatically. - * - * Further queries on this config object will access each - * of the config file instances in order (instances with - * a higher priority level will be accessed first). - * - * @param cfg the configuration to add the file to - * @param path path to the configuration file to add - * @param level the priority level of the backend - * @param force replace config file at the given priority level - * @return 0 on success, GIT_EEXISTS when adding more than one file - * for a given priority level (and force_replace set to 0), - * GIT_ENOTFOUND when the file doesn't exist or error code - */ -GIT_EXTERN(int) git_config_add_file_ondisk( - git_config *cfg, - const char *path, - git_config_level_t level, - int force); - -/** - * Create a new config instance containing a single on-disk file - * - * This method is a simple utility wrapper for the following sequence - * of calls: - * - git_config_new - * - git_config_add_file_ondisk - * - * @param out The configuration instance to create - * @param path Path to the on-disk file to open - * @return 0 on success, GIT_ENOTFOUND when the file doesn't exist - * or an error code - */ -GIT_EXTERN(int) git_config_open_ondisk(git_config **out, const char *path); - -/** - * Build a single-level focused config object from a multi-level one. - * - * The returned config object can be used to perform get/set/delete operations - * on a single specific level. - * - * Getting several times the same level from the same parent multi-level config - * will return different config instances, but containing the same config_file - * instance. - * - * @param out The configuration instance to create - * @param parent Multi-level config to search for the given level - * @param level Configuration level to search for - * @return 0, GIT_ENOTFOUND if the passed level cannot be found in the - * multi-level parent config, or an error code - */ -GIT_EXTERN(int) git_config_open_level( - git_config **out, - const git_config *parent, - git_config_level_t level); - -/** - * Open the global/XDG configuration file according to git's rules - * - * Git allows you to store your global configuration at - * `$HOME/.config` or `$XDG_CONFIG_HOME/git/config`. For backwards - * compatability, the XDG file shouldn't be used unless the use has - * created it explicitly. With this function you'll open the correct - * one to write to. - * - * @param out pointer in which to store the config object - * @param config the config object in which to look - */ -GIT_EXTERN(int) git_config_open_global(git_config **out, git_config *config); - -/** - * Create a snapshot of the configuration - * - * Create a snapshot of the current state of a configuration, which - * allows you to look into a consistent view of the configuration for - * looking up complex values (e.g. a remote, submodule). - * - * The string returned when querying such a config object is valid - * until it is freed. - * - * @param out pointer in which to store the snapshot config object - * @param config configuration to snapshot - * @return 0 or an error code - */ -GIT_EXTERN(int) git_config_snapshot(git_config **out, git_config *config); - -/** - * Free the configuration and its associated memory and files - * - * @param cfg the configuration to free - */ -GIT_EXTERN(void) git_config_free(git_config *cfg); - -/** - * Get the git_config_entry of a config variable. - * - * Free the git_config_entry after use with `git_config_entry_free()`. - * - * @param out pointer to the variable git_config_entry - * @param cfg where to look for the variable - * @param name the variable's name - * @return 0 or an error code - */ -GIT_EXTERN(int) git_config_get_entry( - git_config_entry **out, - const git_config *cfg, - const char *name); - -/** - * Get the value of an integer config variable. - * - * All config files will be looked into, in the order of their - * defined level. A higher level means a higher priority. The - * first occurrence of the variable will be returned here. - * - * @param out pointer to the variable where the value should be stored - * @param cfg where to look for the variable - * @param name the variable's name - * @return 0 or an error code - */ -GIT_EXTERN(int) git_config_get_int32(int32_t *out, const git_config *cfg, const char *name); - -/** - * Get the value of a long integer config variable. - * - * All config files will be looked into, in the order of their - * defined level. A higher level means a higher priority. The - * first occurrence of the variable will be returned here. - * - * @param out pointer to the variable where the value should be stored - * @param cfg where to look for the variable - * @param name the variable's name - * @return 0 or an error code - */ -GIT_EXTERN(int) git_config_get_int64(int64_t *out, const git_config *cfg, const char *name); - -/** - * Get the value of a boolean config variable. - * - * This function uses the usual C convention of 0 being false and - * anything else true. - * - * All config files will be looked into, in the order of their - * defined level. A higher level means a higher priority. The - * first occurrence of the variable will be returned here. - * - * @param out pointer to the variable where the value should be stored - * @param cfg where to look for the variable - * @param name the variable's name - * @return 0 or an error code - */ -GIT_EXTERN(int) git_config_get_bool(int *out, const git_config *cfg, const char *name); - -/** - * Get the value of a path config variable. - * - * A leading '~' will be expanded to the global search path (which - * defaults to the user's home directory but can be overridden via - * `git_libgit2_opts()`. - * - * All config files will be looked into, in the order of their - * defined level. A higher level means a higher priority. The - * first occurrence of the variable will be returned here. - * - * @param out the buffer in which to store the result - * @param cfg where to look for the variable - * @param name the variable's name - * @return 0 or an error code - */ -GIT_EXTERN(int) git_config_get_path(git_buf *out, const git_config *cfg, const char *name); - -/** - * Get the value of a string config variable. - * - * This function can only be used on snapshot config objects. The - * string is owned by the config and should not be freed by the - * user. The pointer will be valid until the config is freed. - * - * All config files will be looked into, in the order of their - * defined level. A higher level means a higher priority. The - * first occurrence of the variable will be returned here. - * - * @param out pointer to the string - * @param cfg where to look for the variable - * @param name the variable's name - * @return 0 or an error code - */ -GIT_EXTERN(int) git_config_get_string(const char **out, const git_config *cfg, const char *name); - -/** - * Get the value of a string config variable. - * - * The value of the config will be copied into the buffer. - * - * All config files will be looked into, in the order of their - * defined level. A higher level means a higher priority. The - * first occurrence of the variable will be returned here. - * - * @param out buffer in which to store the string - * @param cfg where to look for the variable - * @param name the variable's name - * @return 0 or an error code - */ -GIT_EXTERN(int) git_config_get_string_buf(git_buf *out, const git_config *cfg, const char *name); - -/** - * Get each value of a multivar in a foreach callback - * - * The callback will be called on each variable found - * - * @param cfg where to look for the variable - * @param name the variable's name - * @param regexp regular expression to filter which variables we're - * interested in. Use NULL to indicate all - * @param callback the function to be called on each value of the variable - * @param payload opaque pointer to pass to the callback - */ -GIT_EXTERN(int) git_config_get_multivar_foreach(const git_config *cfg, const char *name, const char *regexp, git_config_foreach_cb callback, void *payload); - -/** - * Get each value of a multivar - * - * @param out pointer to store the iterator - * @param cfg where to look for the variable - * @param name the variable's name - * @param regexp regular expression to filter which variables we're - * interested in. Use NULL to indicate all - */ -GIT_EXTERN(int) git_config_multivar_iterator_new(git_config_iterator **out, const git_config *cfg, const char *name, const char *regexp); - -/** - * Return the current entry and advance the iterator - * - * The pointers returned by this function are valid until the iterator - * is freed. - * - * @param entry pointer to store the entry - * @param iter the iterator - * @return 0 or an error code. GIT_ITEROVER if the iteration has completed - */ -GIT_EXTERN(int) git_config_next(git_config_entry **entry, git_config_iterator *iter); - -/** - * Free a config iterator - * - * @param iter the iterator to free - */ -GIT_EXTERN(void) git_config_iterator_free(git_config_iterator *iter); - -/** - * Set the value of an integer config variable in the config file - * with the highest level (usually the local one). - * - * @param cfg where to look for the variable - * @param name the variable's name - * @param value Integer value for the variable - * @return 0 or an error code - */ -GIT_EXTERN(int) git_config_set_int32(git_config *cfg, const char *name, int32_t value); - -/** - * Set the value of a long integer config variable in the config file - * with the highest level (usually the local one). - * - * @param cfg where to look for the variable - * @param name the variable's name - * @param value Long integer value for the variable - * @return 0 or an error code - */ -GIT_EXTERN(int) git_config_set_int64(git_config *cfg, const char *name, int64_t value); - -/** - * Set the value of a boolean config variable in the config file - * with the highest level (usually the local one). - * - * @param cfg where to look for the variable - * @param name the variable's name - * @param value the value to store - * @return 0 or an error code - */ -GIT_EXTERN(int) git_config_set_bool(git_config *cfg, const char *name, int value); - -/** - * Set the value of a string config variable in the config file - * with the highest level (usually the local one). - * - * A copy of the string is made and the user is free to use it - * afterwards. - * - * @param cfg where to look for the variable - * @param name the variable's name - * @param value the string to store. - * @return 0 or an error code - */ -GIT_EXTERN(int) git_config_set_string(git_config *cfg, const char *name, const char *value); - -/** - * Set a multivar in the local config file. - * - * @param cfg where to look for the variable - * @param name the variable's name - * @param regexp a regular expression to indicate which values to replace - * @param value the new value. - */ -GIT_EXTERN(int) git_config_set_multivar(git_config *cfg, const char *name, const char *regexp, const char *value); - -/** - * Delete a config variable from the config file - * with the highest level (usually the local one). - * - * @param cfg the configuration - * @param name the variable to delete - */ -GIT_EXTERN(int) git_config_delete_entry(git_config *cfg, const char *name); - -/** - * Deletes one or several entries from a multivar in the local config file. - * - * @param cfg where to look for the variables - * @param name the variable's name - * @param regexp a regular expression to indicate which values to delete - * - * @return 0 or an error code - */ -GIT_EXTERN(int) git_config_delete_multivar(git_config *cfg, const char *name, const char *regexp); - -/** - * Perform an operation on each config variable. - * - * The callback receives the normalized name and value of each variable - * in the config backend, and the data pointer passed to this function. - * If the callback returns a non-zero value, the function stops iterating - * and returns that value to the caller. - * - * The pointers passed to the callback are only valid as long as the - * iteration is ongoing. - * - * @param cfg where to get the variables from - * @param callback the function to call on each variable - * @param payload the data to pass to the callback - * @return 0 on success, non-zero callback return value, or error code - */ -GIT_EXTERN(int) git_config_foreach( - const git_config *cfg, - git_config_foreach_cb callback, - void *payload); - -/** - * Iterate over all the config variables - * - * Use `git_config_next` to advance the iteration and - * `git_config_iterator_free` when done. - * - * @param out pointer to store the iterator - * @param cfg where to ge the variables from - */ -GIT_EXTERN(int) git_config_iterator_new(git_config_iterator **out, const git_config *cfg); - -/** - * Iterate over all the config variables whose name matches a pattern - * - * Use `git_config_next` to advance the iteration and - * `git_config_iterator_free` when done. - * - * @param out pointer to store the iterator - * @param cfg where to ge the variables from - * @param regexp regular expression to match the names - */ -GIT_EXTERN(int) git_config_iterator_glob_new(git_config_iterator **out, const git_config *cfg, const char *regexp); - -/** - * Perform an operation on each config variable matching a regular expression. - * - * This behaviors like `git_config_foreach` with an additional filter of a - * regular expression that filters which config keys are passed to the - * callback. - * - * The pointers passed to the callback are only valid as long as the - * iteration is ongoing. - * - * @param cfg where to get the variables from - * @param regexp regular expression to match against config names - * @param callback the function to call on each variable - * @param payload the data to pass to the callback - * @return 0 or the return value of the callback which didn't return 0 - */ -GIT_EXTERN(int) git_config_foreach_match( - const git_config *cfg, - const char *regexp, - git_config_foreach_cb callback, - void *payload); - -/** - * Query the value of a config variable and return it mapped to - * an integer constant. - * - * This is a helper method to easily map different possible values - * to a variable to integer constants that easily identify them. - * - * A mapping array looks as follows: - * - * git_cvar_map autocrlf_mapping[] = { - * {GIT_CVAR_FALSE, NULL, GIT_AUTO_CRLF_FALSE}, - * {GIT_CVAR_TRUE, NULL, GIT_AUTO_CRLF_TRUE}, - * {GIT_CVAR_STRING, "input", GIT_AUTO_CRLF_INPUT}, - * {GIT_CVAR_STRING, "default", GIT_AUTO_CRLF_DEFAULT}}; - * - * On any "false" value for the variable (e.g. "false", "FALSE", "no"), the - * mapping will store `GIT_AUTO_CRLF_FALSE` in the `out` parameter. - * - * The same thing applies for any "true" value such as "true", "yes" or "1", storing - * the `GIT_AUTO_CRLF_TRUE` variable. - * - * Otherwise, if the value matches the string "input" (with case insensitive comparison), - * the given constant will be stored in `out`, and likewise for "default". - * - * If not a single match can be made to store in `out`, an error code will be - * returned. - * - * @param out place to store the result of the mapping - * @param cfg config file to get the variables from - * @param name name of the config variable to lookup - * @param maps array of `git_cvar_map` objects specifying the possible mappings - * @param map_n number of mapping objects in `maps` - * @return 0 on success, error code otherwise - */ -GIT_EXTERN(int) git_config_get_mapped( - int *out, - const git_config *cfg, - const char *name, - const git_cvar_map *maps, - size_t map_n); - -/** - * Maps a string value to an integer constant - * - * @param out place to store the result of the parsing - * @param maps array of `git_cvar_map` objects specifying the possible mappings - * @param map_n number of mapping objects in `maps` - * @param value value to parse - */ -GIT_EXTERN(int) git_config_lookup_map_value( - int *out, - const git_cvar_map *maps, - size_t map_n, - const char *value); - -/** - * Parse a string value as a bool. - * - * Valid values for true are: 'true', 'yes', 'on', 1 or any - * number different from 0 - * Valid values for false are: 'false', 'no', 'off', 0 - * - * @param out place to store the result of the parsing - * @param value value to parse - */ -GIT_EXTERN(int) git_config_parse_bool(int *out, const char *value); - -/** - * Parse a string value as an int32. - * - * An optional value suffix of 'k', 'm', or 'g' will - * cause the value to be multiplied by 1024, 1048576, - * or 1073741824 prior to output. - * - * @param out place to store the result of the parsing - * @param value value to parse - */ -GIT_EXTERN(int) git_config_parse_int32(int32_t *out, const char *value); - -/** - * Parse a string value as an int64. - * - * An optional value suffix of 'k', 'm', or 'g' will - * cause the value to be multiplied by 1024, 1048576, - * or 1073741824 prior to output. - * - * @param out place to store the result of the parsing - * @param value value to parse - */ -GIT_EXTERN(int) git_config_parse_int64(int64_t *out, const char *value); - -/** - * Parse a string value as a path. - * - * A leading '~' will be expanded to the global search path (which - * defaults to the user's home directory but can be overridden via - * `git_libgit2_opts()`. - * - * If the value does not begin with a tilde, the input will be - * returned. - * - * @param out placae to store the result of parsing - * @param value the path to evaluate - */ -GIT_EXTERN(int) git_config_parse_path(git_buf *out, const char *value); - -/** - * Perform an operation on each config variable in given config backend - * matching a regular expression. - * - * This behaviors like `git_config_foreach_match` except instead of all config - * entries it just enumerates through the given backend entry. - * - * @param backend where to get the variables from - * @param regexp regular expression to match against config names (can be NULL) - * @param callback the function to call on each variable - * @param payload the data to pass to the callback - */ -GIT_EXTERN(int) git_config_backend_foreach_match( - git_config_backend *backend, - const char *regexp, - git_config_foreach_cb callback, - void *payload); - - -/** @} */ -GIT_END_DECL -#endif diff --git a/vendor/libgit2/include/git2/cred_helpers.h b/vendor/libgit2/include/git2/cred_helpers.h deleted file mode 100644 index 840c225369..0000000000 --- a/vendor/libgit2/include/git2/cred_helpers.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_cred_helpers_h__ -#define INCLUDE_git_cred_helpers_h__ - -#include "transport.h" - -/** - * @file git2/cred_helpers.h - * @brief Utility functions for credential management - * @defgroup git_cred_helpers credential management helpers - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** - * Payload for git_cred_stock_userpass_plaintext. - */ -typedef struct git_cred_userpass_payload { - const char *username; - const char *password; -} git_cred_userpass_payload; - - -/** - * Stock callback usable as a git_cred_acquire_cb. This calls - * git_cred_userpass_plaintext_new unless the protocol has not specified - * `GIT_CREDTYPE_USERPASS_PLAINTEXT` as an allowed type. - * - * @param cred The newly created credential object. - * @param url The resource for which we are demanding a credential. - * @param user_from_url The username that was embedded in a "user@host" - * remote url, or NULL if not included. - * @param allowed_types A bitmask stating which cred types are OK to return. - * @param payload The payload provided when specifying this callback. (This is - * interpreted as a `git_cred_userpass_payload*`.) - */ -GIT_EXTERN(int) git_cred_userpass( - git_cred **cred, - const char *url, - const char *user_from_url, - unsigned int allowed_types, - void *payload); - - -/** @} */ -GIT_END_DECL -#endif diff --git a/vendor/libgit2/include/git2/describe.h b/vendor/libgit2/include/git2/describe.h deleted file mode 100644 index 3044d91657..0000000000 --- a/vendor/libgit2/include/git2/describe.h +++ /dev/null @@ -1,163 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_describe_h__ -#define INCLUDE_git_describe_h__ - -#include "common.h" -#include "types.h" -#include "buffer.h" - -/** - * @file git2/describe.h - * @brief Git describing routines - * @defgroup git_describe Git describing routines - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** - * Reference lookup strategy - * - * These behave like the --tags and --all optios to git-describe, - * namely they say to look for any reference in either refs/tags/ or - * refs/ respectively. - */ -typedef enum { - GIT_DESCRIBE_DEFAULT, - GIT_DESCRIBE_TAGS, - GIT_DESCRIBE_ALL, -} git_describe_strategy_t; - -/** - * Describe options structure - * - * Initialize with `GIT_DESCRIBE_OPTIONS_INIT` macro to correctly set - * the `version` field. E.g. - * - * git_describe_options opts = GIT_DESCRIBE_OPTIONS_INIT; - */ -typedef struct git_describe_options { - unsigned int version; - - unsigned int max_candidates_tags; /** default: 10 */ - unsigned int describe_strategy; /** default: GIT_DESCRIBE_DEFAULT */ - const char *pattern; - /** - * When calculating the distance from the matching tag or - * reference, only walk down the first-parent ancestry. - */ - int only_follow_first_parent; - /** - * If no matching tag or reference is found, the describe - * operation would normally fail. If this option is set, it - * will instead fall back to showing the full id of the - * commit. - */ - int show_commit_oid_as_fallback; -} git_describe_options; - -#define GIT_DESCRIBE_DEFAULT_MAX_CANDIDATES_TAGS 10 -#define GIT_DESCRIBE_DEFAULT_ABBREVIATED_SIZE 7 - -#define GIT_DESCRIBE_OPTIONS_VERSION 1 -#define GIT_DESCRIBE_OPTIONS_INIT { \ - GIT_DESCRIBE_OPTIONS_VERSION, \ - GIT_DESCRIBE_DEFAULT_MAX_CANDIDATES_TAGS, \ -} - -GIT_EXTERN(int) git_describe_init_options(git_describe_options *opts, unsigned int version); - -/** - * Options for formatting the describe string - */ -typedef struct { - unsigned int version; - - /** - * Size of the abbreviated commit id to use. This value is the - * lower bound for the length of the abbreviated string. The - * default is 7. - */ - unsigned int abbreviated_size; - - /** - * Set to use the long format even when a shorter name could be used. - */ - int always_use_long_format; - - /** - * If the workdir is dirty and this is set, this string will - * be appended to the description string. - */ - const char *dirty_suffix; -} git_describe_format_options; - -#define GIT_DESCRIBE_FORMAT_OPTIONS_VERSION 1 -#define GIT_DESCRIBE_FORMAT_OPTIONS_INIT { \ - GIT_DESCRIBE_FORMAT_OPTIONS_VERSION, \ - GIT_DESCRIBE_DEFAULT_ABBREVIATED_SIZE, \ - } - -GIT_EXTERN(int) git_describe_init_format_options(git_describe_format_options *opts, unsigned int version); - -typedef struct git_describe_result git_describe_result; - -/** - * Describe a commit - * - * Perform the describe operation on the given committish object. - * - * @param result pointer to store the result. You must free this once - * you're done with it. - * @param committish a committish to describe - * @param opts the lookup options - */ -GIT_EXTERN(int) git_describe_commit( - git_describe_result **result, - git_object *committish, - git_describe_options *opts); - -/** - * Describe a commit - * - * Perform the describe operation on the current commit and the - * worktree. After peforming describe on HEAD, a status is run and the - * description is considered to be dirty if there are. - * - * @param out pointer to store the result. You must free this once - * you're done with it. - * @param repo the repository in which to perform the describe - * @param opts the lookup options - */ -GIT_EXTERN(int) git_describe_workdir( - git_describe_result **out, - git_repository *repo, - git_describe_options *opts); - -/** - * Print the describe result to a buffer - * - * @param out The buffer to store the result - * @param result the result from `git_describe_commit()` or - * `git_describe_workdir()`. - * @param opts the formatting options - */ -GIT_EXTERN(int) git_describe_format( - git_buf *out, - const git_describe_result *result, - const git_describe_format_options *opts); - -/** - * Free the describe result. - */ -GIT_EXTERN(void) git_describe_result_free(git_describe_result *result); - -/** @} */ -GIT_END_DECL - -#endif diff --git a/vendor/libgit2/include/git2/diff.h b/vendor/libgit2/include/git2/diff.h deleted file mode 100644 index b3ab5397e2..0000000000 --- a/vendor/libgit2/include/git2/diff.h +++ /dev/null @@ -1,1307 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_diff_h__ -#define INCLUDE_git_diff_h__ - -#include "common.h" -#include "types.h" -#include "oid.h" -#include "tree.h" -#include "refs.h" - -/** - * @file git2/diff.h - * @brief Git tree and file differencing routines. - * - * Overview - * -------- - * - * Calculating diffs is generally done in two phases: building a list of - * diffs then traversing it. This makes is easier to share logic across - * the various types of diffs (tree vs tree, workdir vs index, etc.), and - * also allows you to insert optional diff post-processing phases, - * such as rename detection, in between the steps. When you are done with - * a diff object, it must be freed. - * - * Terminology - * ----------- - * - * To understand the diff APIs, you should know the following terms: - * - * - A `diff` represents the cumulative list of differences between two - * snapshots of a repository (possibly filtered by a set of file name - * patterns). This is the `git_diff` object. - * - * - A `delta` is a file pair with an old and new revision. The old version - * may be absent if the file was just created and the new version may be - * absent if the file was deleted. A diff is mostly just a list of deltas. - * - * - A `binary` file / delta is a file (or pair) for which no text diffs - * should be generated. A diff can contain delta entries that are - * binary, but no diff content will be output for those files. There is - * a base heuristic for binary detection and you can further tune the - * behavior with git attributes or diff flags and option settings. - * - * - A `hunk` is a span of modified lines in a delta along with some stable - * surrounding context. You can configure the amount of context and other - * properties of how hunks are generated. Each hunk also comes with a - * header that described where it starts and ends in both the old and new - * versions in the delta. - * - * - A `line` is a range of characters inside a hunk. It could be a context - * line (i.e. in both old and new versions), an added line (i.e. only in - * the new version), or a removed line (i.e. only in the old version). - * Unfortunately, we don't know anything about the encoding of data in the - * file being diffed, so we cannot tell you much about the line content. - * Line data will not be NUL-byte terminated, however, because it will be - * just a span of bytes inside the larger file. - * - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** - * Flags for diff options. A combination of these flags can be passed - * in via the `flags` value in the `git_diff_options`. - */ -typedef enum { - /** Normal diff, the default */ - GIT_DIFF_NORMAL = 0, - - /* - * Options controlling which files will be in the diff - */ - - /** Reverse the sides of the diff */ - GIT_DIFF_REVERSE = (1u << 0), - - /** Include ignored files in the diff */ - GIT_DIFF_INCLUDE_IGNORED = (1u << 1), - - /** Even with GIT_DIFF_INCLUDE_IGNORED, an entire ignored directory - * will be marked with only a single entry in the diff; this flag - * adds all files under the directory as IGNORED entries, too. - */ - GIT_DIFF_RECURSE_IGNORED_DIRS = (1u << 2), - - /** Include untracked files in the diff */ - GIT_DIFF_INCLUDE_UNTRACKED = (1u << 3), - - /** Even with GIT_DIFF_INCLUDE_UNTRACKED, an entire untracked - * directory will be marked with only a single entry in the diff - * (a la what core Git does in `git status`); this flag adds *all* - * files under untracked directories as UNTRACKED entries, too. - */ - GIT_DIFF_RECURSE_UNTRACKED_DIRS = (1u << 4), - - /** Include unmodified files in the diff */ - GIT_DIFF_INCLUDE_UNMODIFIED = (1u << 5), - - /** Normally, a type change between files will be converted into a - * DELETED record for the old and an ADDED record for the new; this - * options enabled the generation of TYPECHANGE delta records. - */ - GIT_DIFF_INCLUDE_TYPECHANGE = (1u << 6), - - /** Even with GIT_DIFF_INCLUDE_TYPECHANGE, blob->tree changes still - * generally show as a DELETED blob. This flag tries to correctly - * label blob->tree transitions as TYPECHANGE records with new_file's - * mode set to tree. Note: the tree SHA will not be available. - */ - GIT_DIFF_INCLUDE_TYPECHANGE_TREES = (1u << 7), - - /** Ignore file mode changes */ - GIT_DIFF_IGNORE_FILEMODE = (1u << 8), - - /** Treat all submodules as unmodified */ - GIT_DIFF_IGNORE_SUBMODULES = (1u << 9), - - /** Use case insensitive filename comparisons */ - GIT_DIFF_IGNORE_CASE = (1u << 10), - - /** May be combined with `GIT_DIFF_IGNORE_CASE` to specify that a file - * that has changed case will be returned as an add/delete pair. - */ - GIT_DIFF_INCLUDE_CASECHANGE = (1u << 11), - - /** If the pathspec is set in the diff options, this flags means to - * apply it as an exact match instead of as an fnmatch pattern. - */ - GIT_DIFF_DISABLE_PATHSPEC_MATCH = (1u << 12), - - /** Disable updating of the `binary` flag in delta records. This is - * useful when iterating over a diff if you don't need hunk and data - * callbacks and want to avoid having to load file completely. - */ - GIT_DIFF_SKIP_BINARY_CHECK = (1u << 13), - - /** When diff finds an untracked directory, to match the behavior of - * core Git, it scans the contents for IGNORED and UNTRACKED files. - * If *all* contents are IGNORED, then the directory is IGNORED; if - * any contents are not IGNORED, then the directory is UNTRACKED. - * This is extra work that may not matter in many cases. This flag - * turns off that scan and immediately labels an untracked directory - * as UNTRACKED (changing the behavior to not match core Git). - */ - GIT_DIFF_ENABLE_FAST_UNTRACKED_DIRS = (1u << 14), - - /** When diff finds a file in the working directory with stat - * information different from the index, but the OID ends up being the - * same, write the correct stat information into the index. Note: - * without this flag, diff will always leave the index untouched. - */ - GIT_DIFF_UPDATE_INDEX = (1u << 15), - - /** Include unreadable files in the diff */ - GIT_DIFF_INCLUDE_UNREADABLE = (1u << 16), - - /** Include unreadable files in the diff */ - GIT_DIFF_INCLUDE_UNREADABLE_AS_UNTRACKED = (1u << 17), - - /* - * Options controlling how output will be generated - */ - - /** Treat all files as text, disabling binary attributes & detection */ - GIT_DIFF_FORCE_TEXT = (1u << 20), - /** Treat all files as binary, disabling text diffs */ - GIT_DIFF_FORCE_BINARY = (1u << 21), - - /** Ignore all whitespace */ - GIT_DIFF_IGNORE_WHITESPACE = (1u << 22), - /** Ignore changes in amount of whitespace */ - GIT_DIFF_IGNORE_WHITESPACE_CHANGE = (1u << 23), - /** Ignore whitespace at end of line */ - GIT_DIFF_IGNORE_WHITESPACE_EOL = (1u << 24), - - /** When generating patch text, include the content of untracked - * files. This automatically turns on GIT_DIFF_INCLUDE_UNTRACKED but - * it does not turn on GIT_DIFF_RECURSE_UNTRACKED_DIRS. Add that - * flag if you want the content of every single UNTRACKED file. - */ - GIT_DIFF_SHOW_UNTRACKED_CONTENT = (1u << 25), - - /** When generating output, include the names of unmodified files if - * they are included in the git_diff. Normally these are skipped in - * the formats that list files (e.g. name-only, name-status, raw). - * Even with this, these will not be included in patch format. - */ - GIT_DIFF_SHOW_UNMODIFIED = (1u << 26), - - /** Use the "patience diff" algorithm */ - GIT_DIFF_PATIENCE = (1u << 28), - /** Take extra time to find minimal diff */ - GIT_DIFF_MINIMAL = (1 << 29), - - /** Include the necessary deflate / delta information so that `git-apply` - * can apply given diff information to binary files. - */ - GIT_DIFF_SHOW_BINARY = (1 << 30), -} git_diff_option_t; - -/** - * The diff object that contains all individual file deltas. - * - * This is an opaque structure which will be allocated by one of the diff - * generator functions below (such as `git_diff_tree_to_tree`). You are - * responsible for releasing the object memory when done, using the - * `git_diff_free()` function. - */ -typedef struct git_diff git_diff; - -/** - * Flags for the delta object and the file objects on each side. - * - * These flags are used for both the `flags` value of the `git_diff_delta` - * and the flags for the `git_diff_file` objects representing the old and - * new sides of the delta. Values outside of this public range should be - * considered reserved for internal or future use. - */ -typedef enum { - GIT_DIFF_FLAG_BINARY = (1u << 0), /**< file(s) treated as binary data */ - GIT_DIFF_FLAG_NOT_BINARY = (1u << 1), /**< file(s) treated as text data */ - GIT_DIFF_FLAG_VALID_ID = (1u << 2), /**< `id` value is known correct */ - GIT_DIFF_FLAG_EXISTS = (1u << 3), /**< file exists at this side of the delta */ -} git_diff_flag_t; - -/** - * What type of change is described by a git_diff_delta? - * - * `GIT_DELTA_RENAMED` and `GIT_DELTA_COPIED` will only show up if you run - * `git_diff_find_similar()` on the diff object. - * - * `GIT_DELTA_TYPECHANGE` only shows up given `GIT_DIFF_INCLUDE_TYPECHANGE` - * in the option flags (otherwise type changes will be split into ADDED / - * DELETED pairs). - */ -typedef enum { - GIT_DELTA_UNMODIFIED = 0, /**< no changes */ - GIT_DELTA_ADDED = 1, /**< entry does not exist in old version */ - GIT_DELTA_DELETED = 2, /**< entry does not exist in new version */ - GIT_DELTA_MODIFIED = 3, /**< entry content changed between old and new */ - GIT_DELTA_RENAMED = 4, /**< entry was renamed between old and new */ - GIT_DELTA_COPIED = 5, /**< entry was copied from another old entry */ - GIT_DELTA_IGNORED = 6, /**< entry is ignored item in workdir */ - GIT_DELTA_UNTRACKED = 7, /**< entry is untracked item in workdir */ - GIT_DELTA_TYPECHANGE = 8, /**< type of entry changed between old and new */ - GIT_DELTA_UNREADABLE = 9, /**< entry is unreadable */ - GIT_DELTA_CONFLICTED = 10, /**< entry in the index is conflicted */ -} git_delta_t; - -/** - * Description of one side of a delta. - * - * Although this is called a "file", it could represent a file, a symbolic - * link, a submodule commit id, or even a tree (although that only if you - * are tracking type changes or ignored/untracked directories). - * - * The `oid` is the `git_oid` of the item. If the entry represents an - * absent side of a diff (e.g. the `old_file` of a `GIT_DELTA_ADDED` delta), - * then the oid will be zeroes. - * - * `path` is the NUL-terminated path to the entry relative to the working - * directory of the repository. - * - * `size` is the size of the entry in bytes. - * - * `flags` is a combination of the `git_diff_flag_t` types - * - * `mode` is, roughly, the stat() `st_mode` value for the item. This will - * be restricted to one of the `git_filemode_t` values. - */ -typedef struct { - git_oid id; - const char *path; - git_off_t size; - uint32_t flags; - uint16_t mode; -} git_diff_file; - -/** - * Description of changes to one entry. - * - * When iterating over a diff, this will be passed to most callbacks and - * you can use the contents to understand exactly what has changed. - * - * The `old_file` represents the "from" side of the diff and the `new_file` - * represents to "to" side of the diff. What those means depend on the - * function that was used to generate the diff and will be documented below. - * You can also use the `GIT_DIFF_REVERSE` flag to flip it around. - * - * Although the two sides of the delta are named "old_file" and "new_file", - * they actually may correspond to entries that represent a file, a symbolic - * link, a submodule commit id, or even a tree (if you are tracking type - * changes or ignored/untracked directories). - * - * Under some circumstances, in the name of efficiency, not all fields will - * be filled in, but we generally try to fill in as much as possible. One - * example is that the "flags" field may not have either the `BINARY` or the - * `NOT_BINARY` flag set to avoid examining file contents if you do not pass - * in hunk and/or line callbacks to the diff foreach iteration function. It - * will just use the git attributes for those files. - * - * The similarity score is zero unless you call `git_diff_find_similar()` - * which does a similarity analysis of files in the diff. Use that - * function to do rename and copy detection, and to split heavily modified - * files in add/delete pairs. After that call, deltas with a status of - * GIT_DELTA_RENAMED or GIT_DELTA_COPIED will have a similarity score - * between 0 and 100 indicating how similar the old and new sides are. - * - * If you ask `git_diff_find_similar` to find heavily modified files to - * break, but to not *actually* break the records, then GIT_DELTA_MODIFIED - * records may have a non-zero similarity score if the self-similarity is - * below the split threshold. To display this value like core Git, invert - * the score (a la `printf("M%03d", 100 - delta->similarity)`). - */ -typedef struct { - git_delta_t status; - uint32_t flags; /**< git_diff_flag_t values */ - uint16_t similarity; /**< for RENAMED and COPIED, value 0-100 */ - uint16_t nfiles; /**< number of files in this delta */ - git_diff_file old_file; - git_diff_file new_file; -} git_diff_delta; - -/** - * Diff notification callback function. - * - * The callback will be called for each file, just before the `git_delta_t` - * gets inserted into the diff. - * - * When the callback: - * - returns < 0, the diff process will be aborted. - * - returns > 0, the delta will not be inserted into the diff, but the - * diff process continues. - * - returns 0, the delta is inserted into the diff, and the diff process - * continues. - */ -typedef int (*git_diff_notify_cb)( - const git_diff *diff_so_far, - const git_diff_delta *delta_to_add, - const char *matched_pathspec, - void *payload); - -/** - * Structure describing options about how the diff should be executed. - * - * Setting all values of the structure to zero will yield the default - * values. Similarly, passing NULL for the options structure will - * give the defaults. The default values are marked below. - * - * - `flags` is a combination of the `git_diff_option_t` values above - * - `context_lines` is the number of unchanged lines that define the - * boundary of a hunk (and to display before and after) - * - `interhunk_lines` is the maximum number of unchanged lines between - * hunk boundaries before the hunks will be merged into a one. - * - `old_prefix` is the virtual "directory" to prefix to old file names - * in hunk headers (default "a") - * - `new_prefix` is the virtual "directory" to prefix to new file names - * in hunk headers (default "b") - * - `pathspec` is an array of paths / fnmatch patterns to constrain diff - * - `max_size` is a file size (in bytes) above which a blob will be marked - * as binary automatically; pass a negative value to disable. - * - `notify_cb` is an optional callback function, notifying the consumer of - * which files are being examined as the diff is generated - * - `notify_payload` is the payload data to pass to the `notify_cb` function - * - `ignore_submodules` overrides the submodule ignore setting for all - * submodules in the diff. - */ -typedef struct { - unsigned int version; /**< version for the struct */ - uint32_t flags; /**< defaults to GIT_DIFF_NORMAL */ - - /* options controlling which files are in the diff */ - - git_submodule_ignore_t ignore_submodules; /**< submodule ignore rule */ - git_strarray pathspec; /**< defaults to include all paths */ - git_diff_notify_cb notify_cb; - void *notify_payload; - - /* options controlling how to diff text is generated */ - - uint32_t context_lines; /**< defaults to 3 */ - uint32_t interhunk_lines; /**< defaults to 0 */ - uint16_t id_abbrev; /**< default 'core.abbrev' or 7 if unset */ - git_off_t max_size; /**< defaults to 512MB */ - const char *old_prefix; /**< defaults to "a" */ - const char *new_prefix; /**< defaults to "b" */ -} git_diff_options; - -/* The current version of the diff options structure */ -#define GIT_DIFF_OPTIONS_VERSION 1 - -/* Stack initializer for diff options. Alternatively use - * `git_diff_options_init` programmatic initialization. - */ -#define GIT_DIFF_OPTIONS_INIT \ - {GIT_DIFF_OPTIONS_VERSION, 0, GIT_SUBMODULE_IGNORE_UNSPECIFIED, {NULL,0}, NULL, NULL, 3} - -/** - * Initializes a `git_diff_options` with default values. Equivalent to - * creating an instance with GIT_DIFF_OPTIONS_INIT. - * - * @param opts The `git_diff_options` struct to initialize - * @param version Version of struct; pass `GIT_DIFF_OPTIONS_VERSION` - * @return Zero on success; -1 on failure. - */ -GIT_EXTERN(int) git_diff_init_options( - git_diff_options *opts, - unsigned int version); - -/** - * When iterating over a diff, callback that will be made per file. - * - * @param delta A pointer to the delta data for the file - * @param progress Goes from 0 to 1 over the diff - * @param payload User-specified pointer from foreach function - */ -typedef int (*git_diff_file_cb)( - const git_diff_delta *delta, - float progress, - void *payload); - -/** - * When producing a binary diff, the binary data returned will be - * either the deflated full ("literal") contents of the file, or - * the deflated binary delta between the two sides (whichever is - * smaller). - */ -typedef enum { - /** There is no binary delta. */ - GIT_DIFF_BINARY_NONE, - - /** The binary data is the literal contents of the file. */ - GIT_DIFF_BINARY_LITERAL, - - /** The binary data is the delta from one side to the other. */ - GIT_DIFF_BINARY_DELTA, -} git_diff_binary_t; - -/** The contents of one of the files in a binary diff. */ -typedef struct { - /** The type of binary data for this file. */ - git_diff_binary_t type; - - /** The binary data, deflated. */ - const char *data; - - /** The length of the binary data. */ - size_t datalen; - - /** The length of the binary data after inflation. */ - size_t inflatedlen; -} git_diff_binary_file; - -/** Structure describing the binary contents of a diff. */ -typedef struct { - git_diff_binary_file old_file; /**< The contents of the old file. */ - git_diff_binary_file new_file; /**< The contents of the new file. */ -} git_diff_binary; - -/** -* When iterating over a diff, callback that will be made for -* binary content within the diff. -*/ -typedef int(*git_diff_binary_cb)( - const git_diff_delta *delta, - const git_diff_binary *binary, - void *payload); - -/** - * Structure describing a hunk of a diff. - */ -typedef struct { - int old_start; /**< Starting line number in old_file */ - int old_lines; /**< Number of lines in old_file */ - int new_start; /**< Starting line number in new_file */ - int new_lines; /**< Number of lines in new_file */ - size_t header_len; /**< Number of bytes in header text */ - char header[128]; /**< Header text, NUL-byte terminated */ -} git_diff_hunk; - -/** - * When iterating over a diff, callback that will be made per hunk. - */ -typedef int (*git_diff_hunk_cb)( - const git_diff_delta *delta, - const git_diff_hunk *hunk, - void *payload); - -/** - * Line origin constants. - * - * These values describe where a line came from and will be passed to - * the git_diff_line_cb when iterating over a diff. There are some - * special origin constants at the end that are used for the text - * output callbacks to demarcate lines that are actually part of - * the file or hunk headers. - */ -typedef enum { - /* These values will be sent to `git_diff_line_cb` along with the line */ - GIT_DIFF_LINE_CONTEXT = ' ', - GIT_DIFF_LINE_ADDITION = '+', - GIT_DIFF_LINE_DELETION = '-', - - GIT_DIFF_LINE_CONTEXT_EOFNL = '=', /**< Both files have no LF at end */ - GIT_DIFF_LINE_ADD_EOFNL = '>', /**< Old has no LF at end, new does */ - GIT_DIFF_LINE_DEL_EOFNL = '<', /**< Old has LF at end, new does not */ - - /* The following values will only be sent to a `git_diff_line_cb` when - * the content of a diff is being formatted through `git_diff_print`. - */ - GIT_DIFF_LINE_FILE_HDR = 'F', - GIT_DIFF_LINE_HUNK_HDR = 'H', - GIT_DIFF_LINE_BINARY = 'B' /**< For "Binary files x and y differ" */ -} git_diff_line_t; - -/** - * Structure describing a line (or data span) of a diff. - */ -typedef struct { - char origin; /**< A git_diff_line_t value */ - int old_lineno; /**< Line number in old file or -1 for added line */ - int new_lineno; /**< Line number in new file or -1 for deleted line */ - int num_lines; /**< Number of newline characters in content */ - size_t content_len; /**< Number of bytes of data */ - git_off_t content_offset; /**< Offset in the original file to the content */ - const char *content; /**< Pointer to diff text, not NUL-byte terminated */ -} git_diff_line; - -/** - * When iterating over a diff, callback that will be made per text diff - * line. In this context, the provided range will be NULL. - * - * When printing a diff, callback that will be made to output each line - * of text. This uses some extra GIT_DIFF_LINE_... constants for output - * of lines of file and hunk headers. - */ -typedef int (*git_diff_line_cb)( - const git_diff_delta *delta, /**< delta that contains this data */ - const git_diff_hunk *hunk, /**< hunk containing this data */ - const git_diff_line *line, /**< line data */ - void *payload); /**< user reference data */ - -/** - * Flags to control the behavior of diff rename/copy detection. - */ -typedef enum { - /** Obey `diff.renames`. Overridden by any other GIT_DIFF_FIND_... flag. */ - GIT_DIFF_FIND_BY_CONFIG = 0, - - /** Look for renames? (`--find-renames`) */ - GIT_DIFF_FIND_RENAMES = (1u << 0), - - /** Consider old side of MODIFIED for renames? (`--break-rewrites=N`) */ - GIT_DIFF_FIND_RENAMES_FROM_REWRITES = (1u << 1), - - /** Look for copies? (a la `--find-copies`). */ - GIT_DIFF_FIND_COPIES = (1u << 2), - - /** Consider UNMODIFIED as copy sources? (`--find-copies-harder`). - * - * For this to work correctly, use GIT_DIFF_INCLUDE_UNMODIFIED when - * the initial `git_diff` is being generated. - */ - GIT_DIFF_FIND_COPIES_FROM_UNMODIFIED = (1u << 3), - - /** Mark significant rewrites for split (`--break-rewrites=/M`) */ - GIT_DIFF_FIND_REWRITES = (1u << 4), - /** Actually split large rewrites into delete/add pairs */ - GIT_DIFF_BREAK_REWRITES = (1u << 5), - /** Mark rewrites for split and break into delete/add pairs */ - GIT_DIFF_FIND_AND_BREAK_REWRITES = - (GIT_DIFF_FIND_REWRITES | GIT_DIFF_BREAK_REWRITES), - - /** Find renames/copies for UNTRACKED items in working directory. - * - * For this to work correctly, use GIT_DIFF_INCLUDE_UNTRACKED when the - * initial `git_diff` is being generated (and obviously the diff must - * be against the working directory for this to make sense). - */ - GIT_DIFF_FIND_FOR_UNTRACKED = (1u << 6), - - /** Turn on all finding features. */ - GIT_DIFF_FIND_ALL = (0x0ff), - - /** Measure similarity ignoring leading whitespace (default) */ - GIT_DIFF_FIND_IGNORE_LEADING_WHITESPACE = 0, - /** Measure similarity ignoring all whitespace */ - GIT_DIFF_FIND_IGNORE_WHITESPACE = (1u << 12), - /** Measure similarity including all data */ - GIT_DIFF_FIND_DONT_IGNORE_WHITESPACE = (1u << 13), - /** Measure similarity only by comparing SHAs (fast and cheap) */ - GIT_DIFF_FIND_EXACT_MATCH_ONLY = (1u << 14), - - /** Do not break rewrites unless they contribute to a rename. - * - * Normally, GIT_DIFF_FIND_AND_BREAK_REWRITES will measure the self- - * similarity of modified files and split the ones that have changed a - * lot into a DELETE / ADD pair. Then the sides of that pair will be - * considered candidates for rename and copy detection. - * - * If you add this flag in and the split pair is *not* used for an - * actual rename or copy, then the modified record will be restored to - * a regular MODIFIED record instead of being split. - */ - GIT_DIFF_BREAK_REWRITES_FOR_RENAMES_ONLY = (1u << 15), - - /** Remove any UNMODIFIED deltas after find_similar is done. - * - * Using GIT_DIFF_FIND_COPIES_FROM_UNMODIFIED to emulate the - * --find-copies-harder behavior requires building a diff with the - * GIT_DIFF_INCLUDE_UNMODIFIED flag. If you do not want UNMODIFIED - * records in the final result, pass this flag to have them removed. - */ - GIT_DIFF_FIND_REMOVE_UNMODIFIED = (1u << 16), -} git_diff_find_t; - -/** - * Pluggable similarity metric - */ -typedef struct { - int (*file_signature)( - void **out, const git_diff_file *file, - const char *fullpath, void *payload); - int (*buffer_signature)( - void **out, const git_diff_file *file, - const char *buf, size_t buflen, void *payload); - void (*free_signature)(void *sig, void *payload); - int (*similarity)(int *score, void *siga, void *sigb, void *payload); - void *payload; -} git_diff_similarity_metric; - -/** - * Control behavior of rename and copy detection - * - * These options mostly mimic parameters that can be passed to git-diff. - * - * - `rename_threshold` is the same as the -M option with a value - * - `copy_threshold` is the same as the -C option with a value - * - `rename_from_rewrite_threshold` matches the top of the -B option - * - `break_rewrite_threshold` matches the bottom of the -B option - * - `rename_limit` is the maximum number of matches to consider for - * a particular file. This is a little different from the `-l` option - * to regular Git because we will still process up to this many matches - * before abandoning the search. - * - * The `metric` option allows you to plug in a custom similarity metric. - * Set it to NULL for the default internal metric which is based on sampling - * hashes of ranges of data in the file. The default metric is a pretty - * good similarity approximation that should work fairly well for both text - * and binary data, and is pretty fast with fixed memory overhead. - */ -typedef struct { - unsigned int version; - - /** - * Combination of git_diff_find_t values (default GIT_DIFF_FIND_BY_CONFIG). - * NOTE: if you don't explicitly set this, `diff.renames` could be set - * to false, resulting in `git_diff_find_similar` doing nothing. - */ - uint32_t flags; - - /** Similarity to consider a file renamed (default 50) */ - uint16_t rename_threshold; - /** Similarity of modified to be eligible rename source (default 50) */ - uint16_t rename_from_rewrite_threshold; - /** Similarity to consider a file a copy (default 50) */ - uint16_t copy_threshold; - /** Similarity to split modify into delete/add pair (default 60) */ - uint16_t break_rewrite_threshold; - - /** Maximum similarity sources to examine for a file (somewhat like - * git-diff's `-l` option or `diff.renameLimit` config) (default 200) - */ - size_t rename_limit; - - /** Pluggable similarity metric; pass NULL to use internal metric */ - git_diff_similarity_metric *metric; -} git_diff_find_options; - -#define GIT_DIFF_FIND_OPTIONS_VERSION 1 -#define GIT_DIFF_FIND_OPTIONS_INIT {GIT_DIFF_FIND_OPTIONS_VERSION} - -/** - * Initializes a `git_diff_find_options` with default values. Equivalent to - * creating an instance with GIT_DIFF_FIND_OPTIONS_INIT. - * - * @param opts The `git_diff_find_options` struct to initialize - * @param version Version of struct; pass `GIT_DIFF_FIND_OPTIONS_VERSION` - * @return Zero on success; -1 on failure. - */ -GIT_EXTERN(int) git_diff_find_init_options( - git_diff_find_options *opts, - unsigned int version); - -/** @name Diff Generator Functions - * - * These are the functions you would use to create (or destroy) a - * git_diff from various objects in a repository. - */ -/**@{*/ - -/** - * Deallocate a diff. - * - * @param diff The previously created diff; cannot be used after free. - */ -GIT_EXTERN(void) git_diff_free(git_diff *diff); - -/** - * Create a diff with the difference between two tree objects. - * - * This is equivalent to `git diff ` - * - * The first tree will be used for the "old_file" side of the delta and the - * second tree will be used for the "new_file" side of the delta. You can - * pass NULL to indicate an empty tree, although it is an error to pass - * NULL for both the `old_tree` and `new_tree`. - * - * @param diff Output pointer to a git_diff pointer to be allocated. - * @param repo The repository containing the trees. - * @param old_tree A git_tree object to diff from, or NULL for empty tree. - * @param new_tree A git_tree object to diff to, or NULL for empty tree. - * @param opts Structure with options to influence diff or NULL for defaults. - */ -GIT_EXTERN(int) git_diff_tree_to_tree( - git_diff **diff, - git_repository *repo, - git_tree *old_tree, - git_tree *new_tree, - const git_diff_options *opts); /**< can be NULL for defaults */ - -/** - * Create a diff between a tree and repository index. - * - * This is equivalent to `git diff --cached ` or if you pass - * the HEAD tree, then like `git diff --cached`. - * - * The tree you pass will be used for the "old_file" side of the delta, and - * the index will be used for the "new_file" side of the delta. - * - * If you pass NULL for the index, then the existing index of the `repo` - * will be used. In this case, the index will be refreshed from disk - * (if it has changed) before the diff is generated. - * - * @param diff Output pointer to a git_diff pointer to be allocated. - * @param repo The repository containing the tree and index. - * @param old_tree A git_tree object to diff from, or NULL for empty tree. - * @param index The index to diff with; repo index used if NULL. - * @param opts Structure with options to influence diff or NULL for defaults. - */ -GIT_EXTERN(int) git_diff_tree_to_index( - git_diff **diff, - git_repository *repo, - git_tree *old_tree, - git_index *index, - const git_diff_options *opts); /**< can be NULL for defaults */ - -/** - * Create a diff between the repository index and the workdir directory. - * - * This matches the `git diff` command. See the note below on - * `git_diff_tree_to_workdir` for a discussion of the difference between - * `git diff` and `git diff HEAD` and how to emulate a `git diff ` - * using libgit2. - * - * The index will be used for the "old_file" side of the delta, and the - * working directory will be used for the "new_file" side of the delta. - * - * If you pass NULL for the index, then the existing index of the `repo` - * will be used. In this case, the index will be refreshed from disk - * (if it has changed) before the diff is generated. - * - * @param diff Output pointer to a git_diff pointer to be allocated. - * @param repo The repository. - * @param index The index to diff from; repo index used if NULL. - * @param opts Structure with options to influence diff or NULL for defaults. - */ -GIT_EXTERN(int) git_diff_index_to_workdir( - git_diff **diff, - git_repository *repo, - git_index *index, - const git_diff_options *opts); /**< can be NULL for defaults */ - -/** - * Create a diff between a tree and the working directory. - * - * The tree you provide will be used for the "old_file" side of the delta, - * and the working directory will be used for the "new_file" side. - * - * This is not the same as `git diff ` or `git diff-index - * `. Those commands use information from the index, whereas this - * function strictly returns the differences between the tree and the files - * in the working directory, regardless of the state of the index. Use - * `git_diff_tree_to_workdir_with_index` to emulate those commands. - * - * To see difference between this and `git_diff_tree_to_workdir_with_index`, - * consider the example of a staged file deletion where the file has then - * been put back into the working dir and further modified. The - * tree-to-workdir diff for that file is 'modified', but `git diff` would - * show status 'deleted' since there is a staged delete. - * - * @param diff A pointer to a git_diff pointer that will be allocated. - * @param repo The repository containing the tree. - * @param old_tree A git_tree object to diff from, or NULL for empty tree. - * @param opts Structure with options to influence diff or NULL for defaults. - */ -GIT_EXTERN(int) git_diff_tree_to_workdir( - git_diff **diff, - git_repository *repo, - git_tree *old_tree, - const git_diff_options *opts); /**< can be NULL for defaults */ - -/** - * Create a diff between a tree and the working directory using index data - * to account for staged deletes, tracked files, etc. - * - * This emulates `git diff ` by diffing the tree to the index and - * the index to the working directory and blending the results into a - * single diff that includes staged deleted, etc. - * - * @param diff A pointer to a git_diff pointer that will be allocated. - * @param repo The repository containing the tree. - * @param old_tree A git_tree object to diff from, or NULL for empty tree. - * @param opts Structure with options to influence diff or NULL for defaults. - */ -GIT_EXTERN(int) git_diff_tree_to_workdir_with_index( - git_diff **diff, - git_repository *repo, - git_tree *old_tree, - const git_diff_options *opts); /**< can be NULL for defaults */ - -/** - * Merge one diff into another. - * - * This merges items from the "from" list into the "onto" list. The - * resulting diff will have all items that appear in either list. - * If an item appears in both lists, then it will be "merged" to appear - * as if the old version was from the "onto" list and the new version - * is from the "from" list (with the exception that if the item has a - * pending DELETE in the middle, then it will show as deleted). - * - * @param onto Diff to merge into. - * @param from Diff to merge. - */ -GIT_EXTERN(int) git_diff_merge( - git_diff *onto, - const git_diff *from); - -/** - * Transform a diff marking file renames, copies, etc. - * - * This modifies a diff in place, replacing old entries that look - * like renames or copies with new entries reflecting those changes. - * This also will, if requested, break modified files into add/remove - * pairs if the amount of change is above a threshold. - * - * @param diff diff to run detection algorithms on - * @param options Control how detection should be run, NULL for defaults - * @return 0 on success, -1 on failure - */ -GIT_EXTERN(int) git_diff_find_similar( - git_diff *diff, - const git_diff_find_options *options); - -/**@}*/ - - -/** @name Diff Processor Functions - * - * These are the functions you apply to a diff to process it - * or read it in some way. - */ -/**@{*/ - -/** - * Query how many diff records are there in a diff. - * - * @param diff A git_diff generated by one of the above functions - * @return Count of number of deltas in the list - */ -GIT_EXTERN(size_t) git_diff_num_deltas(const git_diff *diff); - -/** - * Query how many diff deltas are there in a diff filtered by type. - * - * This works just like `git_diff_entrycount()` with an extra parameter - * that is a `git_delta_t` and returns just the count of how many deltas - * match that particular type. - * - * @param diff A git_diff generated by one of the above functions - * @param type A git_delta_t value to filter the count - * @return Count of number of deltas matching delta_t type - */ -GIT_EXTERN(size_t) git_diff_num_deltas_of_type( - const git_diff *diff, git_delta_t type); - -/** - * Return the diff delta for an entry in the diff list. - * - * The `git_diff_delta` pointer points to internal data and you do not - * have to release it when you are done with it. It will go away when - * the * `git_diff` (or any associated `git_patch`) goes away. - * - * Note that the flags on the delta related to whether it has binary - * content or not may not be set if there are no attributes set for the - * file and there has been no reason to load the file data at this point. - * For now, if you need those flags to be up to date, your only option is - * to either use `git_diff_foreach` or create a `git_patch`. - * - * @param diff Diff list object - * @param idx Index into diff list - * @return Pointer to git_diff_delta (or NULL if `idx` out of range) - */ -GIT_EXTERN(const git_diff_delta *) git_diff_get_delta( - const git_diff *diff, size_t idx); - -/** - * Check if deltas are sorted case sensitively or insensitively. - * - * @param diff diff to check - * @return 0 if case sensitive, 1 if case is ignored - */ -GIT_EXTERN(int) git_diff_is_sorted_icase(const git_diff *diff); - -/** - * Loop over all deltas in a diff issuing callbacks. - * - * This will iterate through all of the files described in a diff. You - * should provide a file callback to learn about each file. - * - * The "hunk" and "line" callbacks are optional, and the text diff of the - * files will only be calculated if they are not NULL. Of course, these - * callbacks will not be invoked for binary files on the diff or for - * files whose only changed is a file mode change. - * - * Returning a non-zero value from any of the callbacks will terminate - * the iteration and return the value to the user. - * - * @param diff A git_diff generated by one of the above functions. - * @param file_cb Callback function to make per file in the diff. - * @param binary_cb Optional callback to make for binary files. - * @param hunk_cb Optional callback to make per hunk of text diff. This - * callback is called to describe a range of lines in the - * diff. It will not be issued for binary files. - * @param line_cb Optional callback to make per line of diff text. This - * same callback will be made for context lines, added, and - * removed lines, and even for a deleted trailing newline. - * @param payload Reference pointer that will be passed to your callbacks. - * @return 0 on success, non-zero callback return value, or error code - */ -GIT_EXTERN(int) git_diff_foreach( - git_diff *diff, - git_diff_file_cb file_cb, - git_diff_binary_cb binary_cb, - git_diff_hunk_cb hunk_cb, - git_diff_line_cb line_cb, - void *payload); - -/** - * Look up the single character abbreviation for a delta status code. - * - * When you run `git diff --name-status` it uses single letter codes in - * the output such as 'A' for added, 'D' for deleted, 'M' for modified, - * etc. This function converts a git_delta_t value into these letters for - * your own purposes. GIT_DELTA_UNTRACKED will return a space (i.e. ' '). - * - * @param status The git_delta_t value to look up - * @return The single character label for that code - */ -GIT_EXTERN(char) git_diff_status_char(git_delta_t status); - -/** - * Possible output formats for diff data - */ -typedef enum { - GIT_DIFF_FORMAT_PATCH = 1u, /**< full git diff */ - GIT_DIFF_FORMAT_PATCH_HEADER = 2u, /**< just the file headers of patch */ - GIT_DIFF_FORMAT_RAW = 3u, /**< like git diff --raw */ - GIT_DIFF_FORMAT_NAME_ONLY = 4u, /**< like git diff --name-only */ - GIT_DIFF_FORMAT_NAME_STATUS = 5u, /**< like git diff --name-status */ -} git_diff_format_t; - -/** - * Iterate over a diff generating formatted text output. - * - * Returning a non-zero value from the callbacks will terminate the - * iteration and return the non-zero value to the caller. - * - * @param diff A git_diff generated by one of the above functions. - * @param format A git_diff_format_t value to pick the text format. - * @param print_cb Callback to make per line of diff text. - * @param payload Reference pointer that will be passed to your callback. - * @return 0 on success, non-zero callback return value, or error code - */ -GIT_EXTERN(int) git_diff_print( - git_diff *diff, - git_diff_format_t format, - git_diff_line_cb print_cb, - void *payload); - -/**@}*/ - - -/* - * Misc - */ - -/** - * Directly run a diff on two blobs. - * - * Compared to a file, a blob lacks some contextual information. As such, - * the `git_diff_file` given to the callback will have some fake data; i.e. - * `mode` will be 0 and `path` will be NULL. - * - * NULL is allowed for either `old_blob` or `new_blob` and will be treated - * as an empty blob, with the `oid` set to NULL in the `git_diff_file` data. - * Passing NULL for both blobs is a noop; no callbacks will be made at all. - * - * We do run a binary content check on the blob content and if either blob - * looks like binary data, the `git_diff_delta` binary attribute will be set - * to 1 and no call to the hunk_cb nor line_cb will be made (unless you pass - * `GIT_DIFF_FORCE_TEXT` of course). - * - * @param old_blob Blob for old side of diff, or NULL for empty blob - * @param old_as_path Treat old blob as if it had this filename; can be NULL - * @param new_blob Blob for new side of diff, or NULL for empty blob - * @param new_as_path Treat new blob as if it had this filename; can be NULL - * @param options Options for diff, or NULL for default options - * @param file_cb Callback for "file"; made once if there is a diff; can be NULL - * @param binary_cb Callback for binary files; can be NULL - * @param hunk_cb Callback for each hunk in diff; can be NULL - * @param line_cb Callback for each line in diff; can be NULL - * @param payload Payload passed to each callback function - * @return 0 on success, non-zero callback return value, or error code - */ -GIT_EXTERN(int) git_diff_blobs( - const git_blob *old_blob, - const char *old_as_path, - const git_blob *new_blob, - const char *new_as_path, - const git_diff_options *options, - git_diff_file_cb file_cb, - git_diff_binary_cb binary_cb, - git_diff_hunk_cb hunk_cb, - git_diff_line_cb line_cb, - void *payload); - -/** - * Directly run a diff between a blob and a buffer. - * - * As with `git_diff_blobs`, comparing a blob and buffer lacks some context, - * so the `git_diff_file` parameters to the callbacks will be faked a la the - * rules for `git_diff_blobs()`. - * - * Passing NULL for `old_blob` will be treated as an empty blob (i.e. the - * `file_cb` will be invoked with GIT_DELTA_ADDED and the diff will be the - * entire content of the buffer added). Passing NULL to the buffer will do - * the reverse, with GIT_DELTA_REMOVED and blob content removed. - * - * @param old_blob Blob for old side of diff, or NULL for empty blob - * @param old_as_path Treat old blob as if it had this filename; can be NULL - * @param buffer Raw data for new side of diff, or NULL for empty - * @param buffer_len Length of raw data for new side of diff - * @param buffer_as_path Treat buffer as if it had this filename; can be NULL - * @param options Options for diff, or NULL for default options - * @param file_cb Callback for "file"; made once if there is a diff; can be NULL - * @param binary_cb Callback for binary files; can be NULL - * @param hunk_cb Callback for each hunk in diff; can be NULL - * @param line_cb Callback for each line in diff; can be NULL - * @param payload Payload passed to each callback function - * @return 0 on success, non-zero callback return value, or error code - */ -GIT_EXTERN(int) git_diff_blob_to_buffer( - const git_blob *old_blob, - const char *old_as_path, - const char *buffer, - size_t buffer_len, - const char *buffer_as_path, - const git_diff_options *options, - git_diff_file_cb file_cb, - git_diff_binary_cb binary_cb, - git_diff_hunk_cb hunk_cb, - git_diff_line_cb line_cb, - void *payload); - -/** - * Directly run a diff between two buffers. - * - * Even more than with `git_diff_blobs`, comparing two buffer lacks - * context, so the `git_diff_file` parameters to the callbacks will be - * faked a la the rules for `git_diff_blobs()`. - * - * @param old_buffer Raw data for old side of diff, or NULL for empty - * @param old_len Length of the raw data for old side of the diff - * @param old_as_path Treat old buffer as if it had this filename; can be NULL - * @param new_buffer Raw data for new side of diff, or NULL for empty - * @param new_len Length of raw data for new side of diff - * @param new_as_path Treat buffer as if it had this filename; can be NULL - * @param options Options for diff, or NULL for default options - * @param file_cb Callback for "file"; made once if there is a diff; can be NULL - * @param binary_cb Callback for binary files; can be NULL - * @param hunk_cb Callback for each hunk in diff; can be NULL - * @param line_cb Callback for each line in diff; can be NULL - * @param payload Payload passed to each callback function - * @return 0 on success, non-zero callback return value, or error code - */ -GIT_EXTERN(int) git_diff_buffers( - const void *old_buffer, - size_t old_len, - const char *old_as_path, - const void *new_buffer, - size_t new_len, - const char *new_as_path, - const git_diff_options *options, - git_diff_file_cb file_cb, - git_diff_binary_cb binary_cb, - git_diff_hunk_cb hunk_cb, - git_diff_line_cb line_cb, - void *payload); - -/** - * This is an opaque structure which is allocated by `git_diff_get_stats`. - * You are responsible for releasing the object memory when done, using the - * `git_diff_stats_free()` function. - */ -typedef struct git_diff_stats git_diff_stats; - -/** - * Formatting options for diff stats - */ -typedef enum { - /** No stats*/ - GIT_DIFF_STATS_NONE = 0, - - /** Full statistics, equivalent of `--stat` */ - GIT_DIFF_STATS_FULL = (1u << 0), - - /** Short statistics, equivalent of `--shortstat` */ - GIT_DIFF_STATS_SHORT = (1u << 1), - - /** Number statistics, equivalent of `--numstat` */ - GIT_DIFF_STATS_NUMBER = (1u << 2), - - /** Extended header information such as creations, renames and mode changes, equivalent of `--summary` */ - GIT_DIFF_STATS_INCLUDE_SUMMARY = (1u << 3), -} git_diff_stats_format_t; - -/** - * Accumlate diff statistics for all patches. - * - * @param out Structure containg the diff statistics. - * @param diff A git_diff generated by one of the above functions. - * @return 0 on success; non-zero on error - */ -GIT_EXTERN(int) git_diff_get_stats( - git_diff_stats **out, - git_diff *diff); - -/** - * Get the total number of files changed in a diff - * - * @param stats A `git_diff_stats` generated by one of the above functions. - * @return total number of files changed in the diff - */ -GIT_EXTERN(size_t) git_diff_stats_files_changed( - const git_diff_stats *stats); - -/** - * Get the total number of insertions in a diff - * - * @param stats A `git_diff_stats` generated by one of the above functions. - * @return total number of insertions in the diff - */ -GIT_EXTERN(size_t) git_diff_stats_insertions( - const git_diff_stats *stats); - -/** - * Get the total number of deletions in a diff - * - * @param stats A `git_diff_stats` generated by one of the above functions. - * @return total number of deletions in the diff - */ -GIT_EXTERN(size_t) git_diff_stats_deletions( - const git_diff_stats *stats); - -/** - * Print diff statistics to a `git_buf`. - * - * @param out buffer to store the formatted diff statistics in. - * @param stats A `git_diff_stats` generated by one of the above functions. - * @param format Formatting option. - * @param width Target width for output (only affects GIT_DIFF_STATS_FULL) - * @return 0 on success; non-zero on error - */ -GIT_EXTERN(int) git_diff_stats_to_buf( - git_buf *out, - const git_diff_stats *stats, - git_diff_stats_format_t format, - size_t width); - -/** - * Deallocate a `git_diff_stats`. - * - * @param stats The previously created statistics object; - * cannot be used after free. - */ -GIT_EXTERN(void) git_diff_stats_free(git_diff_stats *stats); - -/** - * Formatting options for diff e-mail generation - */ -typedef enum { - /** Normal patch, the default */ - GIT_DIFF_FORMAT_EMAIL_NONE = 0, - - /** Don't insert "[PATCH]" in the subject header*/ - GIT_DIFF_FORMAT_EMAIL_EXCLUDE_SUBJECT_PATCH_MARKER = (1 << 0), - -} git_diff_format_email_flags_t; - -/** - * Options for controlling the formatting of the generated e-mail. - */ -typedef struct { - unsigned int version; - - git_diff_format_email_flags_t flags; - - /** This patch number */ - size_t patch_no; - - /** Total number of patches in this series */ - size_t total_patches; - - /** id to use for the commit */ - const git_oid *id; - - /** Summary of the change */ - const char *summary; - - /** Author of the change */ - const git_signature *author; -} git_diff_format_email_options; - -#define GIT_DIFF_FORMAT_EMAIL_OPTIONS_VERSION 1 -#define GIT_DIFF_FORMAT_EMAIL_OPTIONS_INIT {GIT_DIFF_FORMAT_EMAIL_OPTIONS_VERSION, 0, 1, 1, NULL, NULL, NULL} - -/** - * Create an e-mail ready patch from a diff. - * - * @param out buffer to store the e-mail patch in - * @param diff containing the commit - * @param opts structure with options to influence content and formatting. - * @return 0 or an error code - */ -GIT_EXTERN(int) git_diff_format_email( - git_buf *out, - git_diff *diff, - const git_diff_format_email_options *opts); - -/** - * Create an e-mail ready patch for a commit. - * - * Does not support creating patches for merge commits (yet). - * - * @param out buffer to store the e-mail patch in - * @param repo containing the commit - * @param commit pointer to up commit - * @param patch_no patch number of the commit - * @param total_patches total number of patches in the patch set - * @param flags determines the formatting of the e-mail - * @param diff_opts structure with options to influence diff or NULL for defaults. - * @return 0 or an error code - */ -GIT_EXTERN(int) git_diff_commit_as_email( - git_buf *out, - git_repository *repo, - git_commit *commit, - size_t patch_no, - size_t total_patches, - git_diff_format_email_flags_t flags, - const git_diff_options *diff_opts); - -/** - * Initializes a `git_diff_format_email_options` with default values. - * - * Equivalent to creating an instance with GIT_DIFF_FORMAT_EMAIL_OPTIONS_INIT. - * - * @param opts The `git_diff_format_email_options` struct to initialize - * @param version Version of struct; pass `GIT_DIFF_FORMAT_EMAIL_OPTIONS_VERSION` - * @return Zero on success; -1 on failure. - */ -GIT_EXTERN(int) git_diff_format_email_init_options( - git_diff_format_email_options *opts, - unsigned int version); - -GIT_END_DECL - -/** @} */ - -#endif diff --git a/vendor/libgit2/include/git2/errors.h b/vendor/libgit2/include/git2/errors.h deleted file mode 100644 index e189e55f17..0000000000 --- a/vendor/libgit2/include/git2/errors.h +++ /dev/null @@ -1,164 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_errors_h__ -#define INCLUDE_git_errors_h__ - -#include "common.h" - -/** - * @file git2/errors.h - * @brief Git error handling routines and variables - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** Generic return codes */ -typedef enum { - GIT_OK = 0, /**< No error */ - - GIT_ERROR = -1, /**< Generic error */ - GIT_ENOTFOUND = -3, /**< Requested object could not be found */ - GIT_EEXISTS = -4, /**< Object exists preventing operation */ - GIT_EAMBIGUOUS = -5, /**< More than one object matches */ - GIT_EBUFS = -6, /**< Output buffer too short to hold data */ - - /* GIT_EUSER is a special error that is never generated by libgit2 - * code. You can return it from a callback (e.g to stop an iteration) - * to know that it was generated by the callback and not by libgit2. - */ - GIT_EUSER = -7, - - GIT_EBAREREPO = -8, /**< Operation not allowed on bare repository */ - GIT_EUNBORNBRANCH = -9, /**< HEAD refers to branch with no commits */ - GIT_EUNMERGED = -10, /**< Merge in progress prevented operation */ - GIT_ENONFASTFORWARD = -11, /**< Reference was not fast-forwardable */ - GIT_EINVALIDSPEC = -12, /**< Name/ref spec was not in a valid format */ - GIT_ECONFLICT = -13, /**< Checkout conflicts prevented operation */ - GIT_ELOCKED = -14, /**< Lock file prevented operation */ - GIT_EMODIFIED = -15, /**< Reference value does not match expected */ - GIT_EAUTH = -16, /**< Authentication error */ - GIT_ECERTIFICATE = -17, /**< Server certificate is invalid */ - GIT_EAPPLIED = -18, /**< Patch/merge has already been applied */ - GIT_EPEEL = -19, /**< The requested peel operation is not possible */ - GIT_EEOF = -20, /**< Unexpected EOF */ - GIT_EINVALID = -21, /**< Invalid operation or input */ - GIT_EUNCOMMITTED = -22, /**< Uncommitted changes in index prevented operation */ - GIT_EDIRECTORY = -23, /**< The operation is not valid for a directory */ - - GIT_PASSTHROUGH = -30, /**< Internal only */ - GIT_ITEROVER = -31, /**< Signals end of iteration with iterator */ -} git_error_code; - -/** - * Structure to store extra details of the last error that occurred. - * - * This is kept on a per-thread basis if GIT_THREADS was defined when the - * library was build, otherwise one is kept globally for the library - */ -typedef struct { - char *message; - int klass; -} git_error; - -/** Error classes */ -typedef enum { - GITERR_NONE = 0, - GITERR_NOMEMORY, - GITERR_OS, - GITERR_INVALID, - GITERR_REFERENCE, - GITERR_ZLIB, - GITERR_REPOSITORY, - GITERR_CONFIG, - GITERR_REGEX, - GITERR_ODB, - GITERR_INDEX, - GITERR_OBJECT, - GITERR_NET, - GITERR_TAG, - GITERR_TREE, - GITERR_INDEXER, - GITERR_SSL, - GITERR_SUBMODULE, - GITERR_THREAD, - GITERR_STASH, - GITERR_CHECKOUT, - GITERR_FETCHHEAD, - GITERR_MERGE, - GITERR_SSH, - GITERR_FILTER, - GITERR_REVERT, - GITERR_CALLBACK, - GITERR_CHERRYPICK, - GITERR_DESCRIBE, - GITERR_REBASE, - GITERR_FILESYSTEM -} git_error_t; - -/** - * Return the last `git_error` object that was generated for the - * current thread or NULL if no error has occurred. - * - * @return A git_error object. - */ -GIT_EXTERN(const git_error *) giterr_last(void); - -/** - * Clear the last library error that occurred for this thread. - */ -GIT_EXTERN(void) giterr_clear(void); - -/** - * Get the last error data and clear it. - * - * This copies the last error into the given `git_error` struct - * and returns 0 if the copy was successful, leaving the error - * cleared as if `giterr_clear` had been called. - * - * If there was no existing error in the library, -1 will be returned - * and the contents of `cpy` will be left unmodified. - */ -GIT_EXTERN(int) giterr_detach(git_error *cpy); - -/** - * Set the error message string for this thread. - * - * This function is public so that custom ODB backends and the like can - * relay an error message through libgit2. Most regular users of libgit2 - * will never need to call this function -- actually, calling it in most - * circumstances (for example, calling from within a callback function) - * will just end up having the value overwritten by libgit2 internals. - * - * This error message is stored in thread-local storage and only applies - * to the particular thread that this libgit2 call is made from. - * - * NOTE: Passing the `error_class` as GITERR_OS has a special behavior: we - * attempt to append the system default error message for the last OS error - * that occurred and then clear the last error. The specific implementation - * of looking up and clearing this last OS error will vary by platform. - * - * @param error_class One of the `git_error_t` enum above describing the - * general subsystem that is responsible for the error. - * @param string The formatted error message to keep - */ -GIT_EXTERN(void) giterr_set_str(int error_class, const char *string); - -/** - * Set the error message to a special value for memory allocation failure. - * - * The normal `giterr_set_str()` function attempts to `strdup()` the string - * that is passed in. This is not a good idea when the error in question - * is a memory allocation failure. That circumstance has a special setter - * function that sets the error string to a known and statically allocated - * internal value. - */ -GIT_EXTERN(void) giterr_set_oom(void); - -/** @} */ -GIT_END_DECL -#endif diff --git a/vendor/libgit2/include/git2/filter.h b/vendor/libgit2/include/git2/filter.h deleted file mode 100644 index 436a0f3c87..0000000000 --- a/vendor/libgit2/include/git2/filter.h +++ /dev/null @@ -1,217 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_filter_h__ -#define INCLUDE_git_filter_h__ - -#include "common.h" -#include "types.h" -#include "oid.h" -#include "buffer.h" - -/** - * @file git2/filter.h - * @brief Git filter APIs - * - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** - * Filters are applied in one of two directions: smudging - which is - * exporting a file from the Git object database to the working directory, - * and cleaning - which is importing a file from the working directory to - * the Git object database. These values control which direction of - * change is being applied. - */ -typedef enum { - GIT_FILTER_TO_WORKTREE = 0, - GIT_FILTER_SMUDGE = GIT_FILTER_TO_WORKTREE, - GIT_FILTER_TO_ODB = 1, - GIT_FILTER_CLEAN = GIT_FILTER_TO_ODB, -} git_filter_mode_t; - -/** - * Filter option flags. - */ -typedef enum { - GIT_FILTER_DEFAULT = 0u, - GIT_FILTER_ALLOW_UNSAFE = (1u << 0), -} git_filter_flag_t; - -/** - * A filter that can transform file data - * - * This represents a filter that can be used to transform or even replace - * file data. Libgit2 includes one built in filter and it is possible to - * write your own (see git2/sys/filter.h for information on that). - * - * The two builtin filters are: - * - * * "crlf" which uses the complex rules with the "text", "eol", and - * "crlf" file attributes to decide how to convert between LF and CRLF - * line endings - * * "ident" which replaces "$Id$" in a blob with "$Id: $" upon - * checkout and replaced "$Id: $" with "$Id$" on checkin. - */ -typedef struct git_filter git_filter; - -/** - * List of filters to be applied - * - * This represents a list of filters to be applied to a file / blob. You - * can build the list with one call, apply it with another, and dispose it - * with a third. In typical usage, there are not many occasions where a - * git_filter_list is needed directly since the library will generally - * handle conversions for you, but it can be convenient to be able to - * build and apply the list sometimes. - */ -typedef struct git_filter_list git_filter_list; - -/** - * Load the filter list for a given path. - * - * This will return 0 (success) but set the output git_filter_list to NULL - * if no filters are requested for the given file. - * - * @param filters Output newly created git_filter_list (or NULL) - * @param repo Repository object that contains `path` - * @param blob The blob to which the filter will be applied (if known) - * @param path Relative path of the file to be filtered - * @param mode Filtering direction (WT->ODB or ODB->WT) - * @param flags Combination of `git_filter_flag_t` flags - * @return 0 on success (which could still return NULL if no filters are - * needed for the requested file), <0 on error - */ -GIT_EXTERN(int) git_filter_list_load( - git_filter_list **filters, - git_repository *repo, - git_blob *blob, /* can be NULL */ - const char *path, - git_filter_mode_t mode, - uint32_t flags); - -/** - * Query the filter list to see if a given filter (by name) will run. - * The built-in filters "crlf" and "ident" can be queried, otherwise this - * is the name of the filter specified by the filter attribute. - * - * This will return 0 if the given filter is not in the list, or 1 if - * the filter will be applied. - * - * @param filters A loaded git_filter_list (or NULL) - * @param name The name of the filter to query - * @return 1 if the filter is in the list, 0 otherwise - */ -GIT_EXTERN(int) git_filter_list_contains( - git_filter_list *filters, - const char *name); - -/** - * Apply filter list to a data buffer. - * - * See `git2/buffer.h` for background on `git_buf` objects. - * - * If the `in` buffer holds data allocated by libgit2 (i.e. `in->asize` is - * not zero), then it will be overwritten when applying the filters. If - * not, then it will be left untouched. - * - * If there are no filters to apply (or `filters` is NULL), then the `out` - * buffer will reference the `in` buffer data (with `asize` set to zero) - * instead of allocating data. This keeps allocations to a minimum, but - * it means you have to be careful about freeing the `in` data since `out` - * may be pointing to it! - * - * @param out Buffer to store the result of the filtering - * @param filters A loaded git_filter_list (or NULL) - * @param in Buffer containing the data to filter - * @return 0 on success, an error code otherwise - */ -GIT_EXTERN(int) git_filter_list_apply_to_data( - git_buf *out, - git_filter_list *filters, - git_buf *in); - -/** - * Apply a filter list to the contents of a file on disk - * - * @param out buffer into which to store the filtered file - * @param filters the list of filters to apply - * @param repo the repository in which to perform the filtering - * @param path the path of the file to filter, a relative path will be - * taken as relative to the workdir - */ -GIT_EXTERN(int) git_filter_list_apply_to_file( - git_buf *out, - git_filter_list *filters, - git_repository *repo, - const char *path); - -/** - * Apply a filter list to the contents of a blob - * - * @param out buffer into which to store the filtered file - * @param filters the list of filters to apply - * @param blob the blob to filter - */ -GIT_EXTERN(int) git_filter_list_apply_to_blob( - git_buf *out, - git_filter_list *filters, - git_blob *blob); - -/** - * Apply a filter list to an arbitrary buffer as a stream - * - * @param filters the list of filters to apply - * @param data the buffer to filter - * @param target the stream into which the data will be written - */ -GIT_EXTERN(int) git_filter_list_stream_data( - git_filter_list *filters, - git_buf *data, - git_writestream *target); - -/** - * Apply a filter list to a file as a stream - * - * @param filters the list of filters to apply - * @param repo the repository in which to perform the filtering - * @param path the path of the file to filter, a relative path will be - * taken as relative to the workdir - * @param target the stream into which the data will be written - */ -GIT_EXTERN(int) git_filter_list_stream_file( - git_filter_list *filters, - git_repository *repo, - const char *path, - git_writestream *target); - -/** - * Apply a filter list to a blob as a stream - * - * @param filters the list of filters to apply - * @param blob the blob to filter - * @param target the stream into which the data will be written - */ -GIT_EXTERN(int) git_filter_list_stream_blob( - git_filter_list *filters, - git_blob *blob, - git_writestream *target); - -/** - * Free a git_filter_list - * - * @param filters A git_filter_list created by `git_filter_list_load` - */ -GIT_EXTERN(void) git_filter_list_free(git_filter_list *filters); - - -GIT_END_DECL - -/** @} */ - -#endif diff --git a/vendor/libgit2/include/git2/global.h b/vendor/libgit2/include/git2/global.h deleted file mode 100644 index ce5bdf4440..0000000000 --- a/vendor/libgit2/include/git2/global.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_global_h__ -#define INCLUDE_git_global_h__ - -#include "common.h" - -GIT_BEGIN_DECL - -/** - * Init the global state - * - * This function must the called before any other libgit2 function in - * order to set up global state and threading. - * - * This function may be called multiple times - it will return the number - * of times the initialization has been called (including this one) that have - * not subsequently been shutdown. - * - * @return the number of initializations of the library, or an error code. - */ -GIT_EXTERN(int) git_libgit2_init(void); - -/** - * Shutdown the global state - * - * Clean up the global state and threading context after calling it as - * many times as `git_libgit2_init()` was called - it will return the - * number of remainining initializations that have not been shutdown - * (after this one). - * - * @return the number of remaining initializations of the library, or an - * error code. - */ -GIT_EXTERN(int) git_libgit2_shutdown(void); - -/** @} */ -GIT_END_DECL -#endif - diff --git a/vendor/libgit2/include/git2/graph.h b/vendor/libgit2/include/git2/graph.h deleted file mode 100644 index c997d8ca9d..0000000000 --- a/vendor/libgit2/include/git2/graph.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_graph_h__ -#define INCLUDE_git_graph_h__ - -#include "common.h" -#include "types.h" -#include "oid.h" - -/** - * @file git2/graph.h - * @brief Git graph traversal routines - * @defgroup git_revwalk Git graph traversal routines - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** - * Count the number of unique commits between two commit objects - * - * There is no need for branches containing the commits to have any - * upstream relationship, but it helps to think of one as a branch and - * the other as its upstream, the `ahead` and `behind` values will be - * what git would report for the branches. - * - * @param ahead number of unique from commits in `upstream` - * @param behind number of unique from commits in `local` - * @param repo the repository where the commits exist - * @param local the commit for local - * @param upstream the commit for upstream - */ -GIT_EXTERN(int) git_graph_ahead_behind(size_t *ahead, size_t *behind, git_repository *repo, const git_oid *local, const git_oid *upstream); - - -/** - * Determine if a commit is the descendant of another commit. - * - * @param commit a previously loaded commit. - * @param ancestor a potential ancestor commit. - * @return 1 if the given commit is a descendant of the potential ancestor, - * 0 if not, error code otherwise. - */ -GIT_EXTERN(int) git_graph_descendant_of( - git_repository *repo, - const git_oid *commit, - const git_oid *ancestor); - -/** @} */ -GIT_END_DECL -#endif diff --git a/vendor/libgit2/include/git2/ignore.h b/vendor/libgit2/include/git2/ignore.h deleted file mode 100644 index d0c1877a8b..0000000000 --- a/vendor/libgit2/include/git2/ignore.h +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_ignore_h__ -#define INCLUDE_git_ignore_h__ - -#include "common.h" -#include "types.h" - -GIT_BEGIN_DECL - -/** - * Add ignore rules for a repository. - * - * Excludesfile rules (i.e. .gitignore rules) are generally read from - * .gitignore files in the repository tree or from a shared system file - * only if a "core.excludesfile" config value is set. The library also - * keeps a set of per-repository internal ignores that can be configured - * in-memory and will not persist. This function allows you to add to - * that internal rules list. - * - * Example usage: - * - * error = git_ignore_add_rule(myrepo, "*.c\ndir/\nFile with space\n"); - * - * This would add three rules to the ignores. - * - * @param repo The repository to add ignore rules to. - * @param rules Text of rules, a la the contents of a .gitignore file. - * It is okay to have multiple rules in the text; if so, - * each rule should be terminated with a newline. - * @return 0 on success - */ -GIT_EXTERN(int) git_ignore_add_rule( - git_repository *repo, - const char *rules); - -/** - * Clear ignore rules that were explicitly added. - * - * Resets to the default internal ignore rules. This will not turn off - * rules in .gitignore files that actually exist in the filesystem. - * - * The default internal ignores ignore ".", ".." and ".git" entries. - * - * @param repo The repository to remove ignore rules from. - * @return 0 on success - */ -GIT_EXTERN(int) git_ignore_clear_internal_rules( - git_repository *repo); - -/** - * Test if the ignore rules apply to a given path. - * - * This function checks the ignore rules to see if they would apply to the - * given file. This indicates if the file would be ignored regardless of - * whether the file is already in the index or committed to the repository. - * - * One way to think of this is if you were to do "git add ." on the - * directory containing the file, would it be added or not? - * - * @param ignored boolean returning 0 if the file is not ignored, 1 if it is - * @param repo a repository object - * @param path the file to check ignores for, relative to the repo's workdir. - * @return 0 if ignore rules could be processed for the file (regardless - * of whether it exists or not), or an error < 0 if they could not. - */ -GIT_EXTERN(int) git_ignore_path_is_ignored( - int *ignored, - git_repository *repo, - const char *path); - -GIT_END_DECL - -#endif diff --git a/vendor/libgit2/include/git2/index.h b/vendor/libgit2/include/git2/index.h deleted file mode 100644 index 7caf3ed78e..0000000000 --- a/vendor/libgit2/include/git2/index.h +++ /dev/null @@ -1,761 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_index_h__ -#define INCLUDE_git_index_h__ - -#include "common.h" -#include "indexer.h" -#include "types.h" -#include "oid.h" -#include "strarray.h" - -/** - * @file git2/index.h - * @brief Git index parsing and manipulation routines - * @defgroup git_index Git index parsing and manipulation routines - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** Time structure used in a git index entry */ -typedef struct { - int32_t seconds; - /* nsec should not be stored as time_t compatible */ - uint32_t nanoseconds; -} git_index_time; - -/** - * In-memory representation of a file entry in the index. - * - * This is a public structure that represents a file entry in the index. - * The meaning of the fields corresponds to core Git's documentation (in - * "Documentation/technical/index-format.txt"). - * - * The `flags` field consists of a number of bit fields which can be - * accessed via the first set of `GIT_IDXENTRY_...` bitmasks below. These - * flags are all read from and persisted to disk. - * - * The `flags_extended` field also has a number of bit fields which can be - * accessed via the later `GIT_IDXENTRY_...` bitmasks below. Some of - * these flags are read from and written to disk, but some are set aside - * for in-memory only reference. - * - * Note that the time and size fields are truncated to 32 bits. This - * is enough to detect changes, which is enough for the index to - * function as a cache, but it should not be taken as an authoritative - * source for that data. - */ -typedef struct git_index_entry { - git_index_time ctime; - git_index_time mtime; - - uint32_t dev; - uint32_t ino; - uint32_t mode; - uint32_t uid; - uint32_t gid; - uint32_t file_size; - - git_oid id; - - uint16_t flags; - uint16_t flags_extended; - - const char *path; -} git_index_entry; - -/** - * Bitmasks for on-disk fields of `git_index_entry`'s `flags` - * - * These bitmasks match the four fields in the `git_index_entry` `flags` - * value both in memory and on disk. You can use them to interpret the - * data in the `flags`. - */ -#define GIT_IDXENTRY_NAMEMASK (0x0fff) -#define GIT_IDXENTRY_STAGEMASK (0x3000) -#define GIT_IDXENTRY_STAGESHIFT 12 - -/** - * Flags for index entries - */ -typedef enum { - GIT_IDXENTRY_EXTENDED = (0x4000), - GIT_IDXENTRY_VALID = (0x8000), -} git_indxentry_flag_t; - -#define GIT_IDXENTRY_STAGE(E) \ - (((E)->flags & GIT_IDXENTRY_STAGEMASK) >> GIT_IDXENTRY_STAGESHIFT) - -#define GIT_IDXENTRY_STAGE_SET(E,S) do { \ - (E)->flags = ((E)->flags & ~GIT_IDXENTRY_STAGEMASK) | \ - (((S) & 0x03) << GIT_IDXENTRY_STAGESHIFT); } while (0) - -/** - * Bitmasks for on-disk fields of `git_index_entry`'s `flags_extended` - * - * In memory, the `flags_extended` fields are divided into two parts: the - * fields that are read from and written to disk, and other fields that - * in-memory only and used by libgit2. Only the flags in - * `GIT_IDXENTRY_EXTENDED_FLAGS` will get saved on-disk. - * - * Thee first three bitmasks match the three fields in the - * `git_index_entry` `flags_extended` value that belong on disk. You - * can use them to interpret the data in the `flags_extended`. - * - * The rest of the bitmasks match the other fields in the `git_index_entry` - * `flags_extended` value that are only used in-memory by libgit2. - * You can use them to interpret the data in the `flags_extended`. - * - */ -typedef enum { - - GIT_IDXENTRY_INTENT_TO_ADD = (1 << 13), - GIT_IDXENTRY_SKIP_WORKTREE = (1 << 14), - /** Reserved for future extension */ - GIT_IDXENTRY_EXTENDED2 = (1 << 15), - - GIT_IDXENTRY_EXTENDED_FLAGS = (GIT_IDXENTRY_INTENT_TO_ADD | GIT_IDXENTRY_SKIP_WORKTREE), - GIT_IDXENTRY_UPDATE = (1 << 0), - GIT_IDXENTRY_REMOVE = (1 << 1), - GIT_IDXENTRY_UPTODATE = (1 << 2), - GIT_IDXENTRY_ADDED = (1 << 3), - - GIT_IDXENTRY_HASHED = (1 << 4), - GIT_IDXENTRY_UNHASHED = (1 << 5), - GIT_IDXENTRY_WT_REMOVE = (1 << 6), /**< remove in work directory */ - GIT_IDXENTRY_CONFLICTED = (1 << 7), - - GIT_IDXENTRY_UNPACKED = (1 << 8), - GIT_IDXENTRY_NEW_SKIP_WORKTREE = (1 << 9), -} git_idxentry_extended_flag_t; - -/** Capabilities of system that affect index actions. */ -typedef enum { - GIT_INDEXCAP_IGNORE_CASE = 1, - GIT_INDEXCAP_NO_FILEMODE = 2, - GIT_INDEXCAP_NO_SYMLINKS = 4, - GIT_INDEXCAP_FROM_OWNER = -1, -} git_indexcap_t; - -/** Callback for APIs that add/remove/update files matching pathspec */ -typedef int (*git_index_matched_path_cb)( - const char *path, const char *matched_pathspec, void *payload); - -/** Flags for APIs that add files matching pathspec */ -typedef enum { - GIT_INDEX_ADD_DEFAULT = 0, - GIT_INDEX_ADD_FORCE = (1u << 0), - GIT_INDEX_ADD_DISABLE_PATHSPEC_MATCH = (1u << 1), - GIT_INDEX_ADD_CHECK_PATHSPEC = (1u << 2), -} git_index_add_option_t; - -/** - * Match any index stage. - * - * Some index APIs take a stage to match; pass this value to match - * any entry matching the path regardless of stage. - */ -#define GIT_INDEX_STAGE_ANY -1 - -/** @name Index File Functions - * - * These functions work on the index file itself. - */ -/**@{*/ - -/** - * Create a new bare Git index object as a memory representation - * of the Git index file in 'index_path', without a repository - * to back it. - * - * Since there is no ODB or working directory behind this index, - * any Index methods which rely on these (e.g. index_add_bypath) - * will fail with the GIT_ERROR error code. - * - * If you need to access the index of an actual repository, - * use the `git_repository_index` wrapper. - * - * The index must be freed once it's no longer in use. - * - * @param out the pointer for the new index - * @param index_path the path to the index file in disk - * @return 0 or an error code - */ -GIT_EXTERN(int) git_index_open(git_index **out, const char *index_path); - -/** - * Create an in-memory index object. - * - * This index object cannot be read/written to the filesystem, - * but may be used to perform in-memory index operations. - * - * The index must be freed once it's no longer in use. - * - * @param out the pointer for the new index - * @return 0 or an error code - */ -GIT_EXTERN(int) git_index_new(git_index **out); - -/** - * Free an existing index object. - * - * @param index an existing index object - */ -GIT_EXTERN(void) git_index_free(git_index *index); - -/** - * Get the repository this index relates to - * - * @param index The index - * @return A pointer to the repository - */ -GIT_EXTERN(git_repository *) git_index_owner(const git_index *index); - -/** - * Read index capabilities flags. - * - * @param index An existing index object - * @return A combination of GIT_INDEXCAP values - */ -GIT_EXTERN(int) git_index_caps(const git_index *index); - -/** - * Set index capabilities flags. - * - * If you pass `GIT_INDEXCAP_FROM_OWNER` for the caps, then the - * capabilities will be read from the config of the owner object, - * looking at `core.ignorecase`, `core.filemode`, `core.symlinks`. - * - * @param index An existing index object - * @param caps A combination of GIT_INDEXCAP values - * @return 0 on success, -1 on failure - */ -GIT_EXTERN(int) git_index_set_caps(git_index *index, int caps); - -/** - * Update the contents of an existing index object in memory by reading - * from the hard disk. - * - * If `force` is true, this performs a "hard" read that discards in-memory - * changes and always reloads the on-disk index data. If there is no - * on-disk version, the index will be cleared. - * - * If `force` is false, this does a "soft" read that reloads the index - * data from disk only if it has changed since the last time it was - * loaded. Purely in-memory index data will be untouched. Be aware: if - * there are changes on disk, unwritten in-memory changes are discarded. - * - * @param index an existing index object - * @param force if true, always reload, vs. only read if file has changed - * @return 0 or an error code - */ -GIT_EXTERN(int) git_index_read(git_index *index, int force); - -/** - * Write an existing index object from memory back to disk - * using an atomic file lock. - * - * @param index an existing index object - * @return 0 or an error code - */ -GIT_EXTERN(int) git_index_write(git_index *index); - -/** - * Get the full path to the index file on disk. - * - * @param index an existing index object - * @return path to index file or NULL for in-memory index - */ -GIT_EXTERN(const char *) git_index_path(const git_index *index); - -/** - * Get the checksum of the index - * - * This checksum is the SHA-1 hash over the index file (except the - * last 20 bytes which are the checksum itself). In cases where the - * index does not exist on-disk, it will be zeroed out. - * - * @param index an existing index object - * @return a pointer to the checksum of the index - */ -GIT_EXTERN(const git_oid *) git_index_checksum(git_index *index); - -/** - * Read a tree into the index file with stats - * - * The current index contents will be replaced by the specified tree. - * - * @param index an existing index object - * @param tree tree to read - * @return 0 or an error code - */ -GIT_EXTERN(int) git_index_read_tree(git_index *index, const git_tree *tree); - -/** - * Write the index as a tree - * - * This method will scan the index and write a representation - * of its current state back to disk; it recursively creates - * tree objects for each of the subtrees stored in the index, - * but only returns the OID of the root tree. This is the OID - * that can be used e.g. to create a commit. - * - * The index instance cannot be bare, and needs to be associated - * to an existing repository. - * - * The index must not contain any file in conflict. - * - * @param out Pointer where to store the OID of the written tree - * @param index Index to write - * @return 0 on success, GIT_EUNMERGED when the index is not clean - * or an error code - */ -GIT_EXTERN(int) git_index_write_tree(git_oid *out, git_index *index); - -/** - * Write the index as a tree to the given repository - * - * This method will do the same as `git_index_write_tree`, but - * letting the user choose the repository where the tree will - * be written. - * - * The index must not contain any file in conflict. - * - * @param out Pointer where to store OID of the the written tree - * @param index Index to write - * @param repo Repository where to write the tree - * @return 0 on success, GIT_EUNMERGED when the index is not clean - * or an error code - */ -GIT_EXTERN(int) git_index_write_tree_to(git_oid *out, git_index *index, git_repository *repo); - -/**@}*/ - -/** @name Raw Index Entry Functions - * - * These functions work on index entries, and allow for raw manipulation - * of the entries. - */ -/**@{*/ - -/* Index entry manipulation */ - -/** - * Get the count of entries currently in the index - * - * @param index an existing index object - * @return integer of count of current entries - */ -GIT_EXTERN(size_t) git_index_entrycount(const git_index *index); - -/** - * Clear the contents (all the entries) of an index object. - * - * This clears the index object in memory; changes must be explicitly - * written to disk for them to take effect persistently. - * - * @param index an existing index object - * @return 0 on success, error code < 0 on failure - */ -GIT_EXTERN(int) git_index_clear(git_index *index); - -/** - * Get a pointer to one of the entries in the index - * - * The entry is not modifiable and should not be freed. Because the - * `git_index_entry` struct is a publicly defined struct, you should - * be able to make your own permanent copy of the data if necessary. - * - * @param index an existing index object - * @param n the position of the entry - * @return a pointer to the entry; NULL if out of bounds - */ -GIT_EXTERN(const git_index_entry *) git_index_get_byindex( - git_index *index, size_t n); - -/** - * Get a pointer to one of the entries in the index - * - * The entry is not modifiable and should not be freed. Because the - * `git_index_entry` struct is a publicly defined struct, you should - * be able to make your own permanent copy of the data if necessary. - * - * @param index an existing index object - * @param path path to search - * @param stage stage to search - * @return a pointer to the entry; NULL if it was not found - */ -GIT_EXTERN(const git_index_entry *) git_index_get_bypath( - git_index *index, const char *path, int stage); - -/** - * Remove an entry from the index - * - * @param index an existing index object - * @param path path to search - * @param stage stage to search - * @return 0 or an error code - */ -GIT_EXTERN(int) git_index_remove(git_index *index, const char *path, int stage); - -/** - * Remove all entries from the index under a given directory - * - * @param index an existing index object - * @param dir container directory path - * @param stage stage to search - * @return 0 or an error code - */ -GIT_EXTERN(int) git_index_remove_directory( - git_index *index, const char *dir, int stage); - -/** - * Add or update an index entry from an in-memory struct - * - * If a previous index entry exists that has the same path and stage - * as the given 'source_entry', it will be replaced. Otherwise, the - * 'source_entry' will be added. - * - * A full copy (including the 'path' string) of the given - * 'source_entry' will be inserted on the index. - * - * @param index an existing index object - * @param source_entry new entry object - * @return 0 or an error code - */ -GIT_EXTERN(int) git_index_add(git_index *index, const git_index_entry *source_entry); - -/** - * Return the stage number from a git index entry - * - * This entry is calculated from the entry's flag attribute like this: - * - * (entry->flags & GIT_IDXENTRY_STAGEMASK) >> GIT_IDXENTRY_STAGESHIFT - * - * @param entry The entry - * @return the stage number - */ -GIT_EXTERN(int) git_index_entry_stage(const git_index_entry *entry); - -/** - * Return whether the given index entry is a conflict (has a high stage - * entry). This is simply shorthand for `git_index_entry_stage > 0`. - * - * @param entry The entry - * @return 1 if the entry is a conflict entry, 0 otherwise - */ -GIT_EXTERN(int) git_index_entry_is_conflict(const git_index_entry *entry); - -/**@}*/ - -/** @name Workdir Index Entry Functions - * - * These functions work on index entries specifically in the working - * directory (ie, stage 0). - */ -/**@{*/ - -/** - * Add or update an index entry from a file on disk - * - * The file `path` must be relative to the repository's - * working folder and must be readable. - * - * This method will fail in bare index instances. - * - * This forces the file to be added to the index, not looking - * at gitignore rules. Those rules can be evaluated through - * the git_status APIs (in status.h) before calling this. - * - * If this file currently is the result of a merge conflict, this - * file will no longer be marked as conflicting. The data about - * the conflict will be moved to the "resolve undo" (REUC) section. - * - * @param index an existing index object - * @param path filename to add - * @return 0 or an error code - */ -GIT_EXTERN(int) git_index_add_bypath(git_index *index, const char *path); - -/** - * Add or update an index entry from a buffer in memory - * - * This method will create a blob in the repository that owns the - * index and then add the index entry to the index. The `path` of the - * entry represents the position of the blob relative to the - * repository's root folder. - * - * If a previous index entry exists that has the same path as the - * given 'entry', it will be replaced. Otherwise, the 'entry' will be - * added. The `id` and the `file_size` of the 'entry' are updated with the - * real value of the blob. - * - * This forces the file to be added to the index, not looking - * at gitignore rules. Those rules can be evaluated through - * the git_status APIs (in status.h) before calling this. - * - * If this file currently is the result of a merge conflict, this - * file will no longer be marked as conflicting. The data about - * the conflict will be moved to the "resolve undo" (REUC) section. - * - * @param index an existing index object - * @param entry filename to add - * @param buffer data to be written into the blob - * @param len length of the data - * @return 0 or an error code - */ -GIT_EXTERN(int) git_index_add_frombuffer( - git_index *index, - const git_index_entry *entry, - const void *buffer, size_t len); - -/** - * Remove an index entry corresponding to a file on disk - * - * The file `path` must be relative to the repository's - * working folder. It may exist. - * - * If this file currently is the result of a merge conflict, this - * file will no longer be marked as conflicting. The data about - * the conflict will be moved to the "resolve undo" (REUC) section. - * - * @param index an existing index object - * @param path filename to remove - * @return 0 or an error code - */ -GIT_EXTERN(int) git_index_remove_bypath(git_index *index, const char *path); - -/** - * Add or update index entries matching files in the working directory. - * - * This method will fail in bare index instances. - * - * The `pathspec` is a list of file names or shell glob patterns that will - * matched against files in the repository's working directory. Each file - * that matches will be added to the index (either updating an existing - * entry or adding a new entry). You can disable glob expansion and force - * exact matching with the `GIT_INDEX_ADD_DISABLE_PATHSPEC_MATCH` flag. - * - * Files that are ignored will be skipped (unlike `git_index_add_bypath`). - * If a file is already tracked in the index, then it *will* be updated - * even if it is ignored. Pass the `GIT_INDEX_ADD_FORCE` flag to - * skip the checking of ignore rules. - * - * To emulate `git add -A` and generate an error if the pathspec contains - * the exact path of an ignored file (when not using FORCE), add the - * `GIT_INDEX_ADD_CHECK_PATHSPEC` flag. This checks that each entry - * in the `pathspec` that is an exact match to a filename on disk is - * either not ignored or already in the index. If this check fails, the - * function will return GIT_EINVALIDSPEC. - * - * To emulate `git add -A` with the "dry-run" option, just use a callback - * function that always returns a positive value. See below for details. - * - * If any files are currently the result of a merge conflict, those files - * will no longer be marked as conflicting. The data about the conflicts - * will be moved to the "resolve undo" (REUC) section. - * - * If you provide a callback function, it will be invoked on each matching - * item in the working directory immediately *before* it is added to / - * updated in the index. Returning zero will add the item to the index, - * greater than zero will skip the item, and less than zero will abort the - * scan and return that value to the caller. - * - * @param index an existing index object - * @param pathspec array of path patterns - * @param flags combination of git_index_add_option_t flags - * @param callback notification callback for each added/updated path (also - * gets index of matching pathspec entry); can be NULL; - * return 0 to add, >0 to skip, <0 to abort scan. - * @param payload payload passed through to callback function - * @return 0 on success, negative callback return value, or error code - */ -GIT_EXTERN(int) git_index_add_all( - git_index *index, - const git_strarray *pathspec, - unsigned int flags, - git_index_matched_path_cb callback, - void *payload); - -/** - * Remove all matching index entries. - * - * If you provide a callback function, it will be invoked on each matching - * item in the index immediately *before* it is removed. Return 0 to - * remove the item, > 0 to skip the item, and < 0 to abort the scan. - * - * @param index An existing index object - * @param pathspec array of path patterns - * @param callback notification callback for each removed path (also - * gets index of matching pathspec entry); can be NULL; - * return 0 to add, >0 to skip, <0 to abort scan. - * @param payload payload passed through to callback function - * @return 0 on success, negative callback return value, or error code - */ -GIT_EXTERN(int) git_index_remove_all( - git_index *index, - const git_strarray *pathspec, - git_index_matched_path_cb callback, - void *payload); - -/** - * Update all index entries to match the working directory - * - * This method will fail in bare index instances. - * - * This scans the existing index entries and synchronizes them with the - * working directory, deleting them if the corresponding working directory - * file no longer exists otherwise updating the information (including - * adding the latest version of file to the ODB if needed). - * - * If you provide a callback function, it will be invoked on each matching - * item in the index immediately *before* it is updated (either refreshed - * or removed depending on working directory state). Return 0 to proceed - * with updating the item, > 0 to skip the item, and < 0 to abort the scan. - * - * @param index An existing index object - * @param pathspec array of path patterns - * @param callback notification callback for each updated path (also - * gets index of matching pathspec entry); can be NULL; - * return 0 to add, >0 to skip, <0 to abort scan. - * @param payload payload passed through to callback function - * @return 0 on success, negative callback return value, or error code - */ -GIT_EXTERN(int) git_index_update_all( - git_index *index, - const git_strarray *pathspec, - git_index_matched_path_cb callback, - void *payload); - -/** - * Find the first position of any entries which point to given - * path in the Git index. - * - * @param at_pos the address to which the position of the index entry is written (optional) - * @param index an existing index object - * @param path path to search - * @return a zero-based position in the index if found; GIT_ENOTFOUND otherwise - */ -GIT_EXTERN(int) git_index_find(size_t *at_pos, git_index *index, const char *path); - -/**@}*/ - -/** @name Conflict Index Entry Functions - * - * These functions work on conflict index entries specifically (ie, stages 1-3) - */ -/**@{*/ - -/** - * Add or update index entries to represent a conflict. Any staged - * entries that exist at the given paths will be removed. - * - * The entries are the entries from the tree included in the merge. Any - * entry may be null to indicate that that file was not present in the - * trees during the merge. For example, ancestor_entry may be NULL to - * indicate that a file was added in both branches and must be resolved. - * - * @param index an existing index object - * @param ancestor_entry the entry data for the ancestor of the conflict - * @param our_entry the entry data for our side of the merge conflict - * @param their_entry the entry data for their side of the merge conflict - * @return 0 or an error code - */ -GIT_EXTERN(int) git_index_conflict_add( - git_index *index, - const git_index_entry *ancestor_entry, - const git_index_entry *our_entry, - const git_index_entry *their_entry); - -/** - * Get the index entries that represent a conflict of a single file. - * - * The entries are not modifiable and should not be freed. Because the - * `git_index_entry` struct is a publicly defined struct, you should - * be able to make your own permanent copy of the data if necessary. - * - * @param ancestor_out Pointer to store the ancestor entry - * @param our_out Pointer to store the our entry - * @param their_out Pointer to store the their entry - * @param index an existing index object - * @param path path to search - * @return 0 or an error code - */ -GIT_EXTERN(int) git_index_conflict_get( - const git_index_entry **ancestor_out, - const git_index_entry **our_out, - const git_index_entry **their_out, - git_index *index, - const char *path); - -/** - * Removes the index entries that represent a conflict of a single file. - * - * @param index an existing index object - * @param path path to remove conflicts for - * @return 0 or an error code - */ -GIT_EXTERN(int) git_index_conflict_remove(git_index *index, const char *path); - -/** - * Remove all conflicts in the index (entries with a stage greater than 0). - * - * @param index an existing index object - * @return 0 or an error code - */ -GIT_EXTERN(int) git_index_conflict_cleanup(git_index *index); - -/** - * Determine if the index contains entries representing file conflicts. - * - * @return 1 if at least one conflict is found, 0 otherwise. - */ -GIT_EXTERN(int) git_index_has_conflicts(const git_index *index); - -/** - * Create an iterator for the conflicts in the index. - * - * The index must not be modified while iterating; the results are undefined. - * - * @param iterator_out The newly created conflict iterator - * @param index The index to scan - * @return 0 or an error code - */ -GIT_EXTERN(int) git_index_conflict_iterator_new( - git_index_conflict_iterator **iterator_out, - git_index *index); - -/** - * Returns the current conflict (ancestor, ours and theirs entry) and - * advance the iterator internally to the next value. - * - * @param ancestor_out Pointer to store the ancestor side of the conflict - * @param our_out Pointer to store our side of the conflict - * @param their_out Pointer to store their side of the conflict - * @return 0 (no error), GIT_ITEROVER (iteration is done) or an error code - * (negative value) - */ -GIT_EXTERN(int) git_index_conflict_next( - const git_index_entry **ancestor_out, - const git_index_entry **our_out, - const git_index_entry **their_out, - git_index_conflict_iterator *iterator); - -/** - * Frees a `git_index_conflict_iterator`. - * - * @param iterator pointer to the iterator - */ -GIT_EXTERN(void) git_index_conflict_iterator_free( - git_index_conflict_iterator *iterator); - -/**@}*/ - -/** @} */ -GIT_END_DECL -#endif diff --git a/vendor/libgit2/include/git2/indexer.h b/vendor/libgit2/include/git2/indexer.h deleted file mode 100644 index d2d315e477..0000000000 --- a/vendor/libgit2/include/git2/indexer.h +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef _INCLUDE_git_indexer_h__ -#define _INCLUDE_git_indexer_h__ - -#include "common.h" -#include "types.h" -#include "oid.h" - -GIT_BEGIN_DECL - -typedef struct git_indexer git_indexer; - -/** - * Create a new indexer instance - * - * @param out where to store the indexer instance - * @param path to the directory where the packfile should be stored - * @param mode permissions to use creating packfile or 0 for defaults - * @param odb object database from which to read base objects when - * fixing thin packs. Pass NULL if no thin pack is expected (an error - * will be returned if there are bases missing) - * @param progress_cb function to call with progress information - * @param progress_cb_payload payload for the progress callback - */ -GIT_EXTERN(int) git_indexer_new( - git_indexer **out, - const char *path, - unsigned int mode, - git_odb *odb, - git_transfer_progress_cb progress_cb, - void *progress_cb_payload); - -/** - * Add data to the indexer - * - * @param idx the indexer - * @param data the data to add - * @param size the size of the data in bytes - * @param stats stat storage - */ -GIT_EXTERN(int) git_indexer_append(git_indexer *idx, const void *data, size_t size, git_transfer_progress *stats); - -/** - * Finalize the pack and index - * - * Resolve any pending deltas and write out the index file - * - * @param idx the indexer - */ -GIT_EXTERN(int) git_indexer_commit(git_indexer *idx, git_transfer_progress *stats); - -/** - * Get the packfile's hash - * - * A packfile's name is derived from the sorted hashing of all object - * names. This is only correct after the index has been finalized. - * - * @param idx the indexer instance - */ -GIT_EXTERN(const git_oid *) git_indexer_hash(const git_indexer *idx); - -/** - * Free the indexer and its resources - * - * @param idx the indexer to free - */ -GIT_EXTERN(void) git_indexer_free(git_indexer *idx); - -GIT_END_DECL - -#endif diff --git a/vendor/libgit2/include/git2/inttypes.h b/vendor/libgit2/include/git2/inttypes.h deleted file mode 100644 index 17364c7f8d..0000000000 --- a/vendor/libgit2/include/git2/inttypes.h +++ /dev/null @@ -1,309 +0,0 @@ -// ISO C9x compliant inttypes.h for Microsoft Visual Studio -// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124 -// -// Copyright (c) 2006 Alexander Chemeris -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, -// this list of conditions and the following disclaimer. -// -// 2. 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. -// -// 3. The name of the author may be used to endorse or promote products -// derived from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef _MSC_VER // [ -#error "Use this header only with Microsoft Visual C++ compilers!" -#endif // _MSC_VER ] - -#ifndef _MSC_INTTYPES_H_ // [ -#define _MSC_INTTYPES_H_ - -#if _MSC_VER > 1000 -#pragma once -#endif - -#if _MSC_VER >= 1600 -#include -#else -#include "stdint.h" -#endif - -// 7.8 Format conversion of integer types - -typedef struct { - intmax_t quot; - intmax_t rem; -} imaxdiv_t; - -// 7.8.1 Macros for format specifiers - -#if !defined(__cplusplus) || defined(__STDC_FORMAT_MACROS) // [ See footnote 185 at page 198 - -// The fprintf macros for signed integers are: -#define PRId8 "d" -#define PRIi8 "i" -#define PRIdLEAST8 "d" -#define PRIiLEAST8 "i" -#define PRIdFAST8 "d" -#define PRIiFAST8 "i" - -#define PRId16 "hd" -#define PRIi16 "hi" -#define PRIdLEAST16 "hd" -#define PRIiLEAST16 "hi" -#define PRIdFAST16 "hd" -#define PRIiFAST16 "hi" - -#define PRId32 "I32d" -#define PRIi32 "I32i" -#define PRIdLEAST32 "I32d" -#define PRIiLEAST32 "I32i" -#define PRIdFAST32 "I32d" -#define PRIiFAST32 "I32i" - -#define PRId64 "I64d" -#define PRIi64 "I64i" -#define PRIdLEAST64 "I64d" -#define PRIiLEAST64 "I64i" -#define PRIdFAST64 "I64d" -#define PRIiFAST64 "I64i" - -#define PRIdMAX "I64d" -#define PRIiMAX "I64i" - -#define PRIdPTR "Id" -#define PRIiPTR "Ii" - -// The fprintf macros for unsigned integers are: -#define PRIo8 "o" -#define PRIu8 "u" -#define PRIx8 "x" -#define PRIX8 "X" -#define PRIoLEAST8 "o" -#define PRIuLEAST8 "u" -#define PRIxLEAST8 "x" -#define PRIXLEAST8 "X" -#define PRIoFAST8 "o" -#define PRIuFAST8 "u" -#define PRIxFAST8 "x" -#define PRIXFAST8 "X" - -#define PRIo16 "ho" -#define PRIu16 "hu" -#define PRIx16 "hx" -#define PRIX16 "hX" -#define PRIoLEAST16 "ho" -#define PRIuLEAST16 "hu" -#define PRIxLEAST16 "hx" -#define PRIXLEAST16 "hX" -#define PRIoFAST16 "ho" -#define PRIuFAST16 "hu" -#define PRIxFAST16 "hx" -#define PRIXFAST16 "hX" - -#define PRIo32 "I32o" -#define PRIu32 "I32u" -#define PRIx32 "I32x" -#define PRIX32 "I32X" -#define PRIoLEAST32 "I32o" -#define PRIuLEAST32 "I32u" -#define PRIxLEAST32 "I32x" -#define PRIXLEAST32 "I32X" -#define PRIoFAST32 "I32o" -#define PRIuFAST32 "I32u" -#define PRIxFAST32 "I32x" -#define PRIXFAST32 "I32X" - -#define PRIo64 "I64o" -#define PRIu64 "I64u" -#define PRIx64 "I64x" -#define PRIX64 "I64X" -#define PRIoLEAST64 "I64o" -#define PRIuLEAST64 "I64u" -#define PRIxLEAST64 "I64x" -#define PRIXLEAST64 "I64X" -#define PRIoFAST64 "I64o" -#define PRIuFAST64 "I64u" -#define PRIxFAST64 "I64x" -#define PRIXFAST64 "I64X" - -#define PRIoMAX "I64o" -#define PRIuMAX "I64u" -#define PRIxMAX "I64x" -#define PRIXMAX "I64X" - -#define PRIoPTR "Io" -#define PRIuPTR "Iu" -#define PRIxPTR "Ix" -#define PRIXPTR "IX" - -// The fscanf macros for signed integers are: -#define SCNd8 "d" -#define SCNi8 "i" -#define SCNdLEAST8 "d" -#define SCNiLEAST8 "i" -#define SCNdFAST8 "d" -#define SCNiFAST8 "i" - -#define SCNd16 "hd" -#define SCNi16 "hi" -#define SCNdLEAST16 "hd" -#define SCNiLEAST16 "hi" -#define SCNdFAST16 "hd" -#define SCNiFAST16 "hi" - -#define SCNd32 "ld" -#define SCNi32 "li" -#define SCNdLEAST32 "ld" -#define SCNiLEAST32 "li" -#define SCNdFAST32 "ld" -#define SCNiFAST32 "li" - -#define SCNd64 "I64d" -#define SCNi64 "I64i" -#define SCNdLEAST64 "I64d" -#define SCNiLEAST64 "I64i" -#define SCNdFAST64 "I64d" -#define SCNiFAST64 "I64i" - -#define SCNdMAX "I64d" -#define SCNiMAX "I64i" - -#ifdef _WIN64 // [ -# define SCNdPTR "I64d" -# define SCNiPTR "I64i" -#else // _WIN64 ][ -# define SCNdPTR "ld" -# define SCNiPTR "li" -#endif // _WIN64 ] - -// The fscanf macros for unsigned integers are: -#define SCNo8 "o" -#define SCNu8 "u" -#define SCNx8 "x" -#define SCNX8 "X" -#define SCNoLEAST8 "o" -#define SCNuLEAST8 "u" -#define SCNxLEAST8 "x" -#define SCNXLEAST8 "X" -#define SCNoFAST8 "o" -#define SCNuFAST8 "u" -#define SCNxFAST8 "x" -#define SCNXFAST8 "X" - -#define SCNo16 "ho" -#define SCNu16 "hu" -#define SCNx16 "hx" -#define SCNX16 "hX" -#define SCNoLEAST16 "ho" -#define SCNuLEAST16 "hu" -#define SCNxLEAST16 "hx" -#define SCNXLEAST16 "hX" -#define SCNoFAST16 "ho" -#define SCNuFAST16 "hu" -#define SCNxFAST16 "hx" -#define SCNXFAST16 "hX" - -#define SCNo32 "lo" -#define SCNu32 "lu" -#define SCNx32 "lx" -#define SCNX32 "lX" -#define SCNoLEAST32 "lo" -#define SCNuLEAST32 "lu" -#define SCNxLEAST32 "lx" -#define SCNXLEAST32 "lX" -#define SCNoFAST32 "lo" -#define SCNuFAST32 "lu" -#define SCNxFAST32 "lx" -#define SCNXFAST32 "lX" - -#define SCNo64 "I64o" -#define SCNu64 "I64u" -#define SCNx64 "I64x" -#define SCNX64 "I64X" -#define SCNoLEAST64 "I64o" -#define SCNuLEAST64 "I64u" -#define SCNxLEAST64 "I64x" -#define SCNXLEAST64 "I64X" -#define SCNoFAST64 "I64o" -#define SCNuFAST64 "I64u" -#define SCNxFAST64 "I64x" -#define SCNXFAST64 "I64X" - -#define SCNoMAX "I64o" -#define SCNuMAX "I64u" -#define SCNxMAX "I64x" -#define SCNXMAX "I64X" - -#ifdef _WIN64 // [ -# define SCNoPTR "I64o" -# define SCNuPTR "I64u" -# define SCNxPTR "I64x" -# define SCNXPTR "I64X" -#else // _WIN64 ][ -# define SCNoPTR "lo" -# define SCNuPTR "lu" -# define SCNxPTR "lx" -# define SCNXPTR "lX" -#endif // _WIN64 ] - -#endif // __STDC_FORMAT_MACROS ] - -// 7.8.2 Functions for greatest-width integer types - -// 7.8.2.1 The imaxabs function -#define imaxabs _abs64 - -// 7.8.2.2 The imaxdiv function - -// This is modified version of div() function from Microsoft's div.c found -// in %MSVC.NET%\crt\src\div.c -#ifdef STATIC_IMAXDIV // [ -static -#else // STATIC_IMAXDIV ][ -_inline -#endif // STATIC_IMAXDIV ] -imaxdiv_t __cdecl imaxdiv(intmax_t numer, intmax_t denom) -{ - imaxdiv_t result; - - result.quot = numer / denom; - result.rem = numer % denom; - - if (numer < 0 && result.rem > 0) { - // did division wrong; must fix up - ++result.quot; - result.rem -= denom; - } - - return result; -} - -// 7.8.2.3 The strtoimax and strtoumax functions -#define strtoimax _strtoi64 -#define strtoumax _strtoui64 - -// 7.8.2.4 The wcstoimax and wcstoumax functions -#define wcstoimax _wcstoi64 -#define wcstoumax _wcstoui64 - - -#endif // _MSC_INTTYPES_H_ ] diff --git a/vendor/libgit2/include/git2/merge.h b/vendor/libgit2/include/git2/merge.h deleted file mode 100644 index 5fef452b9f..0000000000 --- a/vendor/libgit2/include/git2/merge.h +++ /dev/null @@ -1,551 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_merge_h__ -#define INCLUDE_git_merge_h__ - -#include "common.h" -#include "types.h" -#include "oid.h" -#include "oidarray.h" -#include "checkout.h" -#include "index.h" -#include "annotated_commit.h" - -/** - * @file git2/merge.h - * @brief Git merge routines - * @defgroup git_merge Git merge routines - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** - * The file inputs to `git_merge_file`. Callers should populate the - * `git_merge_file_input` structure with descriptions of the files in - * each side of the conflict for use in producing the merge file. - */ -typedef struct { - unsigned int version; - - /** Pointer to the contents of the file. */ - const char *ptr; - - /** Size of the contents pointed to in `ptr`. */ - size_t size; - - /** File name of the conflicted file, or `NULL` to not merge the path. */ - const char *path; - - /** File mode of the conflicted file, or `0` to not merge the mode. */ - unsigned int mode; -} git_merge_file_input; - -#define GIT_MERGE_FILE_INPUT_VERSION 1 -#define GIT_MERGE_FILE_INPUT_INIT {GIT_MERGE_FILE_INPUT_VERSION} - -/** - * Initializes a `git_merge_file_input` with default values. Equivalent to - * creating an instance with GIT_MERGE_FILE_INPUT_INIT. - * - * @param opts the `git_merge_file_input` instance to initialize. - * @param version the version of the struct; you should pass - * `GIT_MERGE_FILE_INPUT_VERSION` here. - * @return Zero on success; -1 on failure. - */ -GIT_EXTERN(int) git_merge_file_init_input( - git_merge_file_input *opts, - unsigned int version); - -/** - * Flags for `git_merge_tree` options. A combination of these flags can be - * passed in via the `tree_flags` value in the `git_merge_options`. - */ -typedef enum { - /** - * Detect renames that occur between the common ancestor and the "ours" - * side or the common ancestor and the "theirs" side. This will enable - * the ability to merge between a modified and renamed file. - */ - GIT_MERGE_TREE_FIND_RENAMES = (1 << 0), -} git_merge_tree_flag_t; - -/** - * Merge file favor options for `git_merge_options` instruct the file-level - * merging functionality how to deal with conflicting regions of the files. - */ -typedef enum { - /** - * When a region of a file is changed in both branches, a conflict - * will be recorded in the index so that `git_checkout` can produce - * a merge file with conflict markers in the working directory. - * This is the default. - */ - GIT_MERGE_FILE_FAVOR_NORMAL = 0, - - /** - * When a region of a file is changed in both branches, the file - * created in the index will contain the "ours" side of any conflicting - * region. The index will not record a conflict. - */ - GIT_MERGE_FILE_FAVOR_OURS = 1, - - /** - * When a region of a file is changed in both branches, the file - * created in the index will contain the "theirs" side of any conflicting - * region. The index will not record a conflict. - */ - GIT_MERGE_FILE_FAVOR_THEIRS = 2, - - /** - * When a region of a file is changed in both branches, the file - * created in the index will contain each unique line from each side, - * which has the result of combining both files. The index will not - * record a conflict. - */ - GIT_MERGE_FILE_FAVOR_UNION = 3, -} git_merge_file_favor_t; - -/** - * File merging flags - */ -typedef enum { - /** Defaults */ - GIT_MERGE_FILE_DEFAULT = 0, - - /** Create standard conflicted merge files */ - GIT_MERGE_FILE_STYLE_MERGE = (1 << 0), - - /** Create diff3-style files */ - GIT_MERGE_FILE_STYLE_DIFF3 = (1 << 1), - - /** Condense non-alphanumeric regions for simplified diff file */ - GIT_MERGE_FILE_SIMPLIFY_ALNUM = (1 << 2), - - /** Ignore all whitespace */ - GIT_MERGE_FILE_IGNORE_WHITESPACE = (1 << 3), - - /** Ignore changes in amount of whitespace */ - GIT_MERGE_FILE_IGNORE_WHITESPACE_CHANGE = (1 << 4), - - /** Ignore whitespace at end of line */ - GIT_MERGE_FILE_IGNORE_WHITESPACE_EOL = (1 << 5), - - /** Use the "patience diff" algorithm */ - GIT_MERGE_FILE_DIFF_PATIENCE = (1 << 6), - - /** Take extra time to find minimal diff */ - GIT_MERGE_FILE_DIFF_MINIMAL = (1 << 7), -} git_merge_file_flags_t; - -/** - * Options for merging a file - */ -typedef struct { - unsigned int version; - - /** - * Label for the ancestor file side of the conflict which will be prepended - * to labels in diff3-format merge files. - */ - const char *ancestor_label; - - /** - * Label for our file side of the conflict which will be prepended - * to labels in merge files. - */ - const char *our_label; - - /** - * Label for their file side of the conflict which will be prepended - * to labels in merge files. - */ - const char *their_label; - - /** The file to favor in region conflicts. */ - git_merge_file_favor_t favor; - - /** see `git_merge_file_flags_t` above */ - unsigned int flags; -} git_merge_file_options; - -#define GIT_MERGE_FILE_OPTIONS_VERSION 1 -#define GIT_MERGE_FILE_OPTIONS_INIT {GIT_MERGE_FILE_OPTIONS_VERSION} - -/** - * Initializes a `git_merge_file_options` with default values. Equivalent to - * creating an instance with GIT_MERGE_FILE_OPTIONS_INIT. - * - * @param opts the `git_merge_file_options` instance to initialize. - * @param version the version of the struct; you should pass - * `GIT_MERGE_FILE_OPTIONS_VERSION` here. - * @return Zero on success; -1 on failure. - */ -GIT_EXTERN(int) git_merge_file_init_options( - git_merge_file_options *opts, - unsigned int version); - -/** - * Information about file-level merging - */ -typedef struct { - /** - * True if the output was automerged, false if the output contains - * conflict markers. - */ - unsigned int automergeable; - - /** - * The path that the resultant merge file should use, or NULL if a - * filename conflict would occur. - */ - const char *path; - - /** The mode that the resultant merge file should use. */ - unsigned int mode; - - /** The contents of the merge. */ - const char *ptr; - - /** The length of the merge contents. */ - size_t len; -} git_merge_file_result; - -/** - * Merging options - */ -typedef struct { - unsigned int version; - git_merge_tree_flag_t tree_flags; - - /** - * Similarity to consider a file renamed (default 50). If - * `GIT_MERGE_TREE_FIND_RENAMES` is enabled, added files will be compared - * with deleted files to determine their similarity. Files that are - * more similar than the rename threshold (percentage-wise) will be - * treated as a rename. - */ - unsigned int rename_threshold; - - /** - * Maximum similarity sources to examine for renames (default 200). - * If the number of rename candidates (add / delete pairs) is greater - * than this value, inexact rename detection is aborted. - * - * This setting overrides the `merge.renameLimit` configuration value. - */ - unsigned int target_limit; - - /** Pluggable similarity metric; pass NULL to use internal metric */ - git_diff_similarity_metric *metric; - - /** Flags for handling conflicting content. */ - git_merge_file_favor_t file_favor; - - /** see `git_merge_file_flags_t` above */ - unsigned int file_flags; -} git_merge_options; - -#define GIT_MERGE_OPTIONS_VERSION 1 -#define GIT_MERGE_OPTIONS_INIT {GIT_MERGE_OPTIONS_VERSION} - -/** - * Initializes a `git_merge_options` with default values. Equivalent to - * creating an instance with GIT_MERGE_OPTIONS_INIT. - * - * @param opts the `git_merge_options` instance to initialize. - * @param version the version of the struct; you should pass - * `GIT_MERGE_OPTIONS_VERSION` here. - * @return Zero on success; -1 on failure. - */ -GIT_EXTERN(int) git_merge_init_options( - git_merge_options *opts, - unsigned int version); - -/** - * The results of `git_merge_analysis` indicate the merge opportunities. - */ -typedef enum { - /** No merge is possible. (Unused.) */ - GIT_MERGE_ANALYSIS_NONE = 0, - - /** - * A "normal" merge; both HEAD and the given merge input have diverged - * from their common ancestor. The divergent commits must be merged. - */ - GIT_MERGE_ANALYSIS_NORMAL = (1 << 0), - - /** - * All given merge inputs are reachable from HEAD, meaning the - * repository is up-to-date and no merge needs to be performed. - */ - GIT_MERGE_ANALYSIS_UP_TO_DATE = (1 << 1), - - /** - * The given merge input is a fast-forward from HEAD and no merge - * needs to be performed. Instead, the client can check out the - * given merge input. - */ - GIT_MERGE_ANALYSIS_FASTFORWARD = (1 << 2), - - /** - * The HEAD of the current repository is "unborn" and does not point to - * a valid commit. No merge can be performed, but the caller may wish - * to simply set HEAD to the target commit(s). - */ - GIT_MERGE_ANALYSIS_UNBORN = (1 << 3), -} git_merge_analysis_t; - -/** - * The user's stated preference for merges. - */ -typedef enum { - /** - * No configuration was found that suggests a preferred behavior for - * merge. - */ - GIT_MERGE_PREFERENCE_NONE = 0, - - /** - * There is a `merge.ff=false` configuration setting, suggesting that - * the user does not want to allow a fast-forward merge. - */ - GIT_MERGE_PREFERENCE_NO_FASTFORWARD = (1 << 0), - - /** - * There is a `merge.ff=only` configuration setting, suggesting that - * the user only wants fast-forward merges. - */ - GIT_MERGE_PREFERENCE_FASTFORWARD_ONLY = (1 << 1), -} git_merge_preference_t; - -/** - * Analyzes the given branch(es) and determines the opportunities for - * merging them into the HEAD of the repository. - * - * @param analysis_out analysis enumeration that the result is written into - * @param repo the repository to merge - * @param their_heads the heads to merge into - * @param their_heads_len the number of heads to merge - * @return 0 on success or error code - */ -GIT_EXTERN(int) git_merge_analysis( - git_merge_analysis_t *analysis_out, - git_merge_preference_t *preference_out, - git_repository *repo, - const git_annotated_commit **their_heads, - size_t their_heads_len); - -/** - * Find a merge base between two commits - * - * @param out the OID of a merge base between 'one' and 'two' - * @param repo the repository where the commits exist - * @param one one of the commits - * @param two the other commit - * @return 0 on success, GIT_ENOTFOUND if not found or error code - */ -GIT_EXTERN(int) git_merge_base( - git_oid *out, - git_repository *repo, - const git_oid *one, - const git_oid *two); - -/** - * Find merge bases between two commits - * - * @param out array in which to store the resulting ids - * @param repo the repository where the commits exist - * @param one one of the commits - * @param two the other commit - * @return 0 on success, GIT_ENOTFOUND if not found or error code - */ -GIT_EXTERN(int) git_merge_bases( - git_oidarray *out, - git_repository *repo, - const git_oid *one, - const git_oid *two); - -/** - * Find a merge base given a list of commits - * - * @param out the OID of a merge base considering all the commits - * @param repo the repository where the commits exist - * @param length The number of commits in the provided `input_array` - * @param input_array oids of the commits - * @return Zero on success; GIT_ENOTFOUND or -1 on failure. - */ -GIT_EXTERN(int) git_merge_base_many( - git_oid *out, - git_repository *repo, - size_t length, - const git_oid input_array[]); - -/** - * Find all merge bases given a list of commits - * - * @param out array in which to store the resulting ids - * @param repo the repository where the commits exist - * @param length The number of commits in the provided `input_array` - * @param input_array oids of the commits - * @return Zero on success; GIT_ENOTFOUND or -1 on failure. - */ -GIT_EXTERN(int) git_merge_bases_many( - git_oidarray *out, - git_repository *repo, - size_t length, - const git_oid input_array[]); - -/** - * Find a merge base in preparation for an octopus merge - * - * @param out the OID of a merge base considering all the commits - * @param repo the repository where the commits exist - * @param length The number of commits in the provided `input_array` - * @param input_array oids of the commits - * @return Zero on success; GIT_ENOTFOUND or -1 on failure. - */ -GIT_EXTERN(int) git_merge_base_octopus( - git_oid *out, - git_repository *repo, - size_t length, - const git_oid input_array[]); - -/** - * Merge two files as they exist in the in-memory data structures, using - * the given common ancestor as the baseline, producing a - * `git_merge_file_result` that reflects the merge result. The - * `git_merge_file_result` must be freed with `git_merge_file_result_free`. - * - * Note that this function does not reference a repository and any - * configuration must be passed as `git_merge_file_options`. - * - * @param out The git_merge_file_result to be filled in - * @param ancestor The contents of the ancestor file - * @param ours The contents of the file in "our" side - * @param theirs The contents of the file in "their" side - * @param opts The merge file options or `NULL` for defaults - * @return 0 on success or error code - */ -GIT_EXTERN(int) git_merge_file( - git_merge_file_result *out, - const git_merge_file_input *ancestor, - const git_merge_file_input *ours, - const git_merge_file_input *theirs, - const git_merge_file_options *opts); - -/** - * Merge two files as they exist in the index, using the given common - * ancestor as the baseline, producing a `git_merge_file_result` that - * reflects the merge result. The `git_merge_file_result` must be freed with - * `git_merge_file_result_free`. - * - * @param out The git_merge_file_result to be filled in - * @param repo The repository - * @param ancestor The index entry for the ancestor file (stage level 1) - * @param ours The index entry for our file (stage level 2) - * @param theirs The index entry for their file (stage level 3) - * @param opts The merge file options or NULL - * @return 0 on success or error code - */ -GIT_EXTERN(int) git_merge_file_from_index( - git_merge_file_result *out, - git_repository *repo, - const git_index_entry *ancestor, - const git_index_entry *ours, - const git_index_entry *theirs, - const git_merge_file_options *opts); - -/** - * Frees a `git_merge_file_result`. - * - * @param result The result to free or `NULL` - */ -GIT_EXTERN(void) git_merge_file_result_free(git_merge_file_result *result); - -/** - * Merge two trees, producing a `git_index` that reflects the result of - * the merge. The index may be written as-is to the working directory - * or checked out. If the index is to be converted to a tree, the caller - * should resolve any conflicts that arose as part of the merge. - * - * The returned index must be freed explicitly with `git_index_free`. - * - * @param out pointer to store the index result in - * @param repo repository that contains the given trees - * @param ancestor_tree the common ancestor between the trees (or null if none) - * @param our_tree the tree that reflects the destination tree - * @param their_tree the tree to merge in to `our_tree` - * @param opts the merge tree options (or null for defaults) - * @return 0 on success or error code - */ -GIT_EXTERN(int) git_merge_trees( - git_index **out, - git_repository *repo, - const git_tree *ancestor_tree, - const git_tree *our_tree, - const git_tree *their_tree, - const git_merge_options *opts); - -/** - * Merge two commits, producing a `git_index` that reflects the result of - * the merge. The index may be written as-is to the working directory - * or checked out. If the index is to be converted to a tree, the caller - * should resolve any conflicts that arose as part of the merge. - * - * The merge performed uses the first common ancestor, unlike the - * `git-merge-recursive` strategy, which may produce an artificial common - * ancestor tree when there are multiple ancestors. - * - * The returned index must be freed explicitly with `git_index_free`. - * - * @param out pointer to store the index result in - * @param repo repository that contains the given trees - * @param our_commit the commit that reflects the destination tree - * @param their_commit the commit to merge in to `our_commit` - * @param opts the merge tree options (or null for defaults) - * @return 0 on success or error code - */ -GIT_EXTERN(int) git_merge_commits( - git_index **out, - git_repository *repo, - const git_commit *our_commit, - const git_commit *their_commit, - const git_merge_options *opts); - -/** - * Merges the given commit(s) into HEAD, writing the results into the working - * directory. Any changes are staged for commit and any conflicts are written - * to the index. Callers should inspect the repository's index after this - * completes, resolve any conflicts and prepare a commit. - * - * The merge performed uses the first common ancestor, unlike the - * `git-merge-recursive` strategy, which may produce an artificial common - * ancestor tree when there are multiple ancestors. - * - * For compatibility with git, the repository is put into a merging - * state. Once the commit is done (or if the uses wishes to abort), - * you should clear this state by calling - * `git_repository_state_cleanup()`. - * - * @param repo the repository to merge - * @param their_heads the heads to merge into - * @param their_heads_len the number of heads to merge - * @param merge_opts merge options - * @param checkout_opts checkout options - * @return 0 on success or error code - */ -GIT_EXTERN(int) git_merge( - git_repository *repo, - const git_annotated_commit **their_heads, - size_t their_heads_len, - const git_merge_options *merge_opts, - const git_checkout_options *checkout_opts); - -/** @} */ -GIT_END_DECL -#endif diff --git a/vendor/libgit2/include/git2/message.h b/vendor/libgit2/include/git2/message.h deleted file mode 100644 index d78b1dce55..0000000000 --- a/vendor/libgit2/include/git2/message.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_message_h__ -#define INCLUDE_git_message_h__ - -#include "common.h" -#include "buffer.h" - -/** - * @file git2/message.h - * @brief Git message management routines - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** - * Clean up message from excess whitespace and make sure that the last line - * ends with a '\n'. - * - * Optionally, can remove lines starting with a "#". - * - * @param out The user-allocated git_buf which will be filled with the - * cleaned up message. - * - * @param message The message to be prettified. - * - * @param strip_comments Non-zero to remove comment lines, 0 to leave them in. - * - * @param comment_char Comment character. Lines starting with this character - * are considered to be comments and removed if `strip_comments` is non-zero. - * - * @return 0 or an error code. - */ -GIT_EXTERN(int) git_message_prettify(git_buf *out, const char *message, int strip_comments, char comment_char); - -/** @} */ -GIT_END_DECL - -#endif /* INCLUDE_git_message_h__ */ diff --git a/vendor/libgit2/include/git2/net.h b/vendor/libgit2/include/git2/net.h deleted file mode 100644 index 04dff34bc8..0000000000 --- a/vendor/libgit2/include/git2/net.h +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_net_h__ -#define INCLUDE_git_net_h__ - -#include "common.h" -#include "oid.h" -#include "types.h" - -/** - * @file git2/net.h - * @brief Git networking declarations - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -#define GIT_DEFAULT_PORT "9418" - -/** - * Direction of the connection. - * - * We need this because we need to know whether we should call - * git-upload-pack or git-receive-pack on the remote end when get_refs - * gets called. - */ -typedef enum { - GIT_DIRECTION_FETCH = 0, - GIT_DIRECTION_PUSH = 1 -} git_direction; - -/** - * Description of a reference advertised by a remote server, given out - * on `ls` calls. - */ -struct git_remote_head { - int local; /* available locally */ - git_oid oid; - git_oid loid; - char *name; - /** - * If the server send a symref mapping for this ref, this will - * point to the target. - */ - char *symref_target; -}; - -/** - * Callback for listing the remote heads - */ -typedef int (*git_headlist_cb)(git_remote_head *rhead, void *payload); - -/** @} */ -GIT_END_DECL -#endif diff --git a/vendor/libgit2/include/git2/notes.h b/vendor/libgit2/include/git2/notes.h deleted file mode 100644 index 3a626cafdc..0000000000 --- a/vendor/libgit2/include/git2/notes.h +++ /dev/null @@ -1,217 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_note_h__ -#define INCLUDE_git_note_h__ - -#include "oid.h" - -/** - * @file git2/notes.h - * @brief Git notes management routines - * @defgroup git_note Git notes management routines - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** - * Callback for git_note_foreach. - * - * Receives: - * - blob_id: Oid of the blob containing the message - * - annotated_object_id: Oid of the git object being annotated - * - payload: Payload data passed to `git_note_foreach` - */ -typedef int (*git_note_foreach_cb)( - const git_oid *blob_id, const git_oid *annotated_object_id, void *payload); - -/** - * note iterator - */ -typedef struct git_iterator git_note_iterator; - -/** - * Creates a new iterator for notes - * - * The iterator must be freed manually by the user. - * - * @param out pointer to the iterator - * @param repo repository where to look up the note - * @param notes_ref canonical name of the reference to use (optional); defaults to - * "refs/notes/commits" - * - * @return 0 or an error code - */ -GIT_EXTERN(int) git_note_iterator_new( - git_note_iterator **out, - git_repository *repo, - const char *notes_ref); - -/** - * Frees an git_note_iterator - * - * @param it pointer to the iterator - */ -GIT_EXTERN(void) git_note_iterator_free(git_note_iterator *it); - -/** - * Return the current item (note_id and annotated_id) and advance the iterator - * internally to the next value - * - * @param note_id id of blob containing the message - * @param annotated_id id of the git object being annotated - * @param it pointer to the iterator - * - * @return 0 (no error), GIT_ITEROVER (iteration is done) or an error code - * (negative value) - */ -GIT_EXTERN(int) git_note_next( - git_oid* note_id, - git_oid* annotated_id, - git_note_iterator *it); - - -/** - * Read the note for an object - * - * The note must be freed manually by the user. - * - * @param out pointer to the read note; NULL in case of error - * @param repo repository where to look up the note - * @param notes_ref canonical name of the reference to use (optional); defaults to - * "refs/notes/commits" - * @param oid OID of the git object to read the note from - * - * @return 0 or an error code - */ -GIT_EXTERN(int) git_note_read( - git_note **out, - git_repository *repo, - const char *notes_ref, - const git_oid *oid); - -/** - * Get the note author - * - * @param note the note - * @return the author - */ -GIT_EXTERN(const git_signature *) git_note_author(const git_note *note); - -/** - * Get the note committer - * - * @param note the note - * @return the committer - */ -GIT_EXTERN(const git_signature *) git_note_committer(const git_note *note); - - -/** - * Get the note message - * - * @param note the note - * @return the note message - */ -GIT_EXTERN(const char *) git_note_message(const git_note *note); - - -/** - * Get the note object's id - * - * @param note the note - * @return the note object's id - */ -GIT_EXTERN(const git_oid *) git_note_id(const git_note *note); - -/** - * Add a note for an object - * - * @param out pointer to store the OID (optional); NULL in case of error - * @param repo repository where to store the note - * @param notes_ref canonical name of the reference to use (optional); - * defaults to "refs/notes/commits" - * @param author signature of the notes commit author - * @param committer signature of the notes commit committer - * @param oid OID of the git object to decorate - * @param note Content of the note to add for object oid - * @param force Overwrite existing note - * - * @return 0 or an error code - */ -GIT_EXTERN(int) git_note_create( - git_oid *out, - git_repository *repo, - const char *notes_ref, - const git_signature *author, - const git_signature *committer, - const git_oid *oid, - const char *note, - int force); - - -/** - * Remove the note for an object - * - * @param repo repository where the note lives - * @param notes_ref canonical name of the reference to use (optional); - * defaults to "refs/notes/commits" - * @param author signature of the notes commit author - * @param committer signature of the notes commit committer - * @param oid OID of the git object to remove the note from - * - * @return 0 or an error code - */ -GIT_EXTERN(int) git_note_remove( - git_repository *repo, - const char *notes_ref, - const git_signature *author, - const git_signature *committer, - const git_oid *oid); - -/** - * Free a git_note object - * - * @param note git_note object - */ -GIT_EXTERN(void) git_note_free(git_note *note); - -/** - * Get the default notes reference for a repository - * - * @param out buffer in which to store the name of the default notes reference - * @param repo The Git repository - * - * @return 0 or an error code - */ -GIT_EXTERN(int) git_note_default_ref(git_buf *out, git_repository *repo); - -/** - * Loop over all the notes within a specified namespace - * and issue a callback for each one. - * - * @param repo Repository where to find the notes. - * - * @param notes_ref Reference to read from (optional); defaults to - * "refs/notes/commits". - * - * @param note_cb Callback to invoke per found annotation. Return non-zero - * to stop looping. - * - * @param payload Extra parameter to callback function. - * - * @return 0 on success, non-zero callback return value, or error code - */ -GIT_EXTERN(int) git_note_foreach( - git_repository *repo, - const char *notes_ref, - git_note_foreach_cb note_cb, - void *payload); - -/** @} */ -GIT_END_DECL -#endif diff --git a/vendor/libgit2/include/git2/object.h b/vendor/libgit2/include/git2/object.h deleted file mode 100644 index a798c9dc35..0000000000 --- a/vendor/libgit2/include/git2/object.h +++ /dev/null @@ -1,242 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_object_h__ -#define INCLUDE_git_object_h__ - -#include "common.h" -#include "types.h" -#include "oid.h" -#include "buffer.h" - -/** - * @file git2/object.h - * @brief Git revision object management routines - * @defgroup git_object Git revision object management routines - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** - * Lookup a reference to one of the objects in a repository. - * - * The generated reference is owned by the repository and - * should be closed with the `git_object_free` method - * instead of free'd manually. - * - * The 'type' parameter must match the type of the object - * in the odb; the method will fail otherwise. - * The special value 'GIT_OBJ_ANY' may be passed to let - * the method guess the object's type. - * - * @param object pointer to the looked-up object - * @param repo the repository to look up the object - * @param id the unique identifier for the object - * @param type the type of the object - * @return 0 or an error code - */ -GIT_EXTERN(int) git_object_lookup( - git_object **object, - git_repository *repo, - const git_oid *id, - git_otype type); - -/** - * Lookup a reference to one of the objects in a repository, - * given a prefix of its identifier (short id). - * - * The object obtained will be so that its identifier - * matches the first 'len' hexadecimal characters - * (packets of 4 bits) of the given 'id'. - * 'len' must be at least GIT_OID_MINPREFIXLEN, and - * long enough to identify a unique object matching - * the prefix; otherwise the method will fail. - * - * The generated reference is owned by the repository and - * should be closed with the `git_object_free` method - * instead of free'd manually. - * - * The 'type' parameter must match the type of the object - * in the odb; the method will fail otherwise. - * The special value 'GIT_OBJ_ANY' may be passed to let - * the method guess the object's type. - * - * @param object_out pointer where to store the looked-up object - * @param repo the repository to look up the object - * @param id a short identifier for the object - * @param len the length of the short identifier - * @param type the type of the object - * @return 0 or an error code - */ -GIT_EXTERN(int) git_object_lookup_prefix( - git_object **object_out, - git_repository *repo, - const git_oid *id, - size_t len, - git_otype type); - - -/** - * Lookup an object that represents a tree entry. - * - * @param out buffer that receives a pointer to the object (which must be freed - * by the caller) - * @param treeish root object that can be peeled to a tree - * @param path relative path from the root object to the desired object - * @param type type of object desired - * @return 0 on success, or an error code - */ -GIT_EXTERN(int) git_object_lookup_bypath( - git_object **out, - const git_object *treeish, - const char *path, - git_otype type); - -/** - * Get the id (SHA1) of a repository object - * - * @param obj the repository object - * @return the SHA1 id - */ -GIT_EXTERN(const git_oid *) git_object_id(const git_object *obj); - -/** - * Get a short abbreviated OID string for the object - * - * This starts at the "core.abbrev" length (default 7 characters) and - * iteratively extends to a longer string if that length is ambiguous. - * The result will be unambiguous (at least until new objects are added to - * the repository). - * - * @param out Buffer to write string into - * @param obj The object to get an ID for - * @return 0 on success, <0 for error - */ -GIT_EXTERN(int) git_object_short_id(git_buf *out, const git_object *obj); - -/** - * Get the object type of an object - * - * @param obj the repository object - * @return the object's type - */ -GIT_EXTERN(git_otype) git_object_type(const git_object *obj); - -/** - * Get the repository that owns this object - * - * Freeing or calling `git_repository_close` on the - * returned pointer will invalidate the actual object. - * - * Any other operation may be run on the repository without - * affecting the object. - * - * @param obj the object - * @return the repository who owns this object - */ -GIT_EXTERN(git_repository *) git_object_owner(const git_object *obj); - -/** - * Close an open object - * - * This method instructs the library to close an existing - * object; note that git_objects are owned and cached by the repository - * so the object may or may not be freed after this library call, - * depending on how aggressive is the caching mechanism used - * by the repository. - * - * IMPORTANT: - * It *is* necessary to call this method when you stop using - * an object. Failure to do so will cause a memory leak. - * - * @param object the object to close - */ -GIT_EXTERN(void) git_object_free(git_object *object); - -/** - * Convert an object type to its string representation. - * - * The result is a pointer to a string in static memory and - * should not be free()'ed. - * - * @param type object type to convert. - * @return the corresponding string representation. - */ -GIT_EXTERN(const char *) git_object_type2string(git_otype type); - -/** - * Convert a string object type representation to it's git_otype. - * - * @param str the string to convert. - * @return the corresponding git_otype. - */ -GIT_EXTERN(git_otype) git_object_string2type(const char *str); - -/** - * Determine if the given git_otype is a valid loose object type. - * - * @param type object type to test. - * @return true if the type represents a valid loose object type, - * false otherwise. - */ -GIT_EXTERN(int) git_object_typeisloose(git_otype type); - -/** - * Get the size in bytes for the structure which - * acts as an in-memory representation of any given - * object type. - * - * For all the core types, this would the equivalent - * of calling `sizeof(git_commit)` if the core types - * were not opaque on the external API. - * - * @param type object type to get its size - * @return size in bytes of the object - */ -GIT_EXTERN(size_t) git_object__size(git_otype type); - -/** - * Recursively peel an object until an object of the specified type is met. - * - * If the query cannot be satisfied due to the object model, - * GIT_EINVALIDSPEC will be returned (e.g. trying to peel a blob to a - * tree). - * - * If you pass `GIT_OBJ_ANY` as the target type, then the object will - * be peeled until the type changes. A tag will be peeled until the - * referenced object is no longer a tag, and a commit will be peeled - * to a tree. Any other object type will return GIT_EINVALIDSPEC. - * - * If peeling a tag we discover an object which cannot be peeled to - * the target type due to the object model, GIT_EPEEL will be - * returned. - * - * You must free the returned object. - * - * @param peeled Pointer to the peeled git_object - * @param object The object to be processed - * @param target_type The type of the requested object (a GIT_OBJ_ value) - * @return 0 on success, GIT_EINVALIDSPEC, GIT_EPEEL, or an error code - */ -GIT_EXTERN(int) git_object_peel( - git_object **peeled, - const git_object *object, - git_otype target_type); - -/** - * Create an in-memory copy of a Git object. The copy must be - * explicitly free'd or it will leak. - * - * @param dest Pointer to store the copy of the object - * @param source Original object to copy - */ -GIT_EXTERN(int) git_object_dup(git_object **dest, git_object *source); - -/** @} */ -GIT_END_DECL - -#endif diff --git a/vendor/libgit2/include/git2/odb.h b/vendor/libgit2/include/git2/odb.h deleted file mode 100644 index 4f1e18bc1a..0000000000 --- a/vendor/libgit2/include/git2/odb.h +++ /dev/null @@ -1,495 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_odb_h__ -#define INCLUDE_git_odb_h__ - -#include "common.h" -#include "types.h" -#include "oid.h" - -/** - * @file git2/odb.h - * @brief Git object database routines - * @defgroup git_odb Git object database routines - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** - * Function type for callbacks from git_odb_foreach. - */ -typedef int (*git_odb_foreach_cb)(const git_oid *id, void *payload); - -/** - * Create a new object database with no backends. - * - * Before the ODB can be used for read/writing, a custom database - * backend must be manually added using `git_odb_add_backend()` - * - * @param out location to store the database pointer, if opened. - * Set to NULL if the open failed. - * @return 0 or an error code - */ -GIT_EXTERN(int) git_odb_new(git_odb **out); - -/** - * Create a new object database and automatically add - * the two default backends: - * - * - git_odb_backend_loose: read and write loose object files - * from disk, assuming `objects_dir` as the Objects folder - * - * - git_odb_backend_pack: read objects from packfiles, - * assuming `objects_dir` as the Objects folder which - * contains a 'pack/' folder with the corresponding data - * - * @param out location to store the database pointer, if opened. - * Set to NULL if the open failed. - * @param objects_dir path of the backends' "objects" directory. - * @return 0 or an error code - */ -GIT_EXTERN(int) git_odb_open(git_odb **out, const char *objects_dir); - -/** - * Add an on-disk alternate to an existing Object DB. - * - * Note that the added path must point to an `objects`, not - * to a full repository, to use it as an alternate store. - * - * Alternate backends are always checked for objects *after* - * all the main backends have been exhausted. - * - * Writing is disabled on alternate backends. - * - * @param odb database to add the backend to - * @param path path to the objects folder for the alternate - * @return 0 on success; error code otherwise - */ -GIT_EXTERN(int) git_odb_add_disk_alternate(git_odb *odb, const char *path); - -/** - * Close an open object database. - * - * @param db database pointer to close. If NULL no action is taken. - */ -GIT_EXTERN(void) git_odb_free(git_odb *db); - -/** - * Read an object from the database. - * - * This method queries all available ODB backends - * trying to read the given OID. - * - * The returned object is reference counted and - * internally cached, so it should be closed - * by the user once it's no longer in use. - * - * @param out pointer where to store the read object - * @param db database to search for the object in. - * @param id identity of the object to read. - * @return - * - 0 if the object was read; - * - GIT_ENOTFOUND if the object is not in the database. - */ -GIT_EXTERN(int) git_odb_read(git_odb_object **out, git_odb *db, const git_oid *id); - -/** - * Read an object from the database, given a prefix - * of its identifier. - * - * This method queries all available ODB backends - * trying to match the 'len' first hexadecimal - * characters of the 'short_id'. - * The remaining (GIT_OID_HEXSZ-len)*4 bits of - * 'short_id' must be 0s. - * 'len' must be at least GIT_OID_MINPREFIXLEN, - * and the prefix must be long enough to identify - * a unique object in all the backends; the - * method will fail otherwise. - * - * The returned object is reference counted and - * internally cached, so it should be closed - * by the user once it's no longer in use. - * - * @param out pointer where to store the read object - * @param db database to search for the object in. - * @param short_id a prefix of the id of the object to read. - * @param len the length of the prefix - * @return - * - 0 if the object was read; - * - GIT_ENOTFOUND if the object is not in the database. - * - GIT_EAMBIGUOUS if the prefix is ambiguous (several objects match the prefix) - */ -GIT_EXTERN(int) git_odb_read_prefix(git_odb_object **out, git_odb *db, const git_oid *short_id, size_t len); - -/** - * Read the header of an object from the database, without - * reading its full contents. - * - * The header includes the length and the type of an object. - * - * Note that most backends do not support reading only the header - * of an object, so the whole object will be read and then the - * header will be returned. - * - * @param len_out pointer where to store the length - * @param type_out pointer where to store the type - * @param db database to search for the object in. - * @param id identity of the object to read. - * @return - * - 0 if the object was read; - * - GIT_ENOTFOUND if the object is not in the database. - */ -GIT_EXTERN(int) git_odb_read_header(size_t *len_out, git_otype *type_out, git_odb *db, const git_oid *id); - -/** - * Determine if the given object can be found in the object database. - * - * @param db database to be searched for the given object. - * @param id the object to search for. - * @return - * - 1, if the object was found - * - 0, otherwise - */ -GIT_EXTERN(int) git_odb_exists(git_odb *db, const git_oid *id); - -/** - * Determine if objects can be found in the object database from a short OID. - * - * @param out The full OID of the found object if just one is found. - * @param db The database to be searched for the given object. - * @param short_id A prefix of the id of the object to read. - * @param len The length of the prefix. - * @return 0 if found, GIT_ENOTFOUND if not found, GIT_EAMBIGUOUS if multiple - * matches were found, other value < 0 if there was a read error. - */ -GIT_EXTERN(int) git_odb_exists_prefix( - git_oid *out, git_odb *db, const git_oid *short_id, size_t len); - -/** - * Refresh the object database to load newly added files. - * - * If the object databases have changed on disk while the library - * is running, this function will force a reload of the underlying - * indexes. - * - * Use this function when you're confident that an external - * application has tampered with the ODB. - * - * NOTE that it is not necessary to call this function at all. The - * library will automatically attempt to refresh the ODB - * when a lookup fails, to see if the looked up object exists - * on disk but hasn't been loaded yet. - * - * @param db database to refresh - * @return 0 on success, error code otherwise - */ -GIT_EXTERN(int) git_odb_refresh(struct git_odb *db); - -/** - * List all objects available in the database - * - * The callback will be called for each object available in the - * database. Note that the objects are likely to be returned in the index - * order, which would make accessing the objects in that order inefficient. - * Return a non-zero value from the callback to stop looping. - * - * @param db database to use - * @param cb the callback to call for each object - * @param payload data to pass to the callback - * @return 0 on success, non-zero callback return value, or error code - */ -GIT_EXTERN(int) git_odb_foreach(git_odb *db, git_odb_foreach_cb cb, void *payload); - -/** - * Write an object directly into the ODB - * - * This method writes a full object straight into the ODB. - * For most cases, it is preferred to write objects through a write - * stream, which is both faster and less memory intensive, specially - * for big objects. - * - * This method is provided for compatibility with custom backends - * which are not able to support streaming writes - * - * @param out pointer to store the OID result of the write - * @param odb object database where to store the object - * @param data buffer with the data to store - * @param len size of the buffer - * @param type type of the data to store - * @return 0 or an error code - */ -GIT_EXTERN(int) git_odb_write(git_oid *out, git_odb *odb, const void *data, size_t len, git_otype type); - -/** - * Open a stream to write an object into the ODB - * - * The type and final length of the object must be specified - * when opening the stream. - * - * The returned stream will be of type `GIT_STREAM_WRONLY`, and it - * won't be effective until `git_odb_stream_finalize_write` is called - * and returns without an error - * - * The stream must always be freed when done with `git_odb_stream_free` or - * will leak memory. - * - * @see git_odb_stream - * - * @param out pointer where to store the stream - * @param db object database where the stream will write - * @param size final size of the object that will be written - * @param type type of the object that will be written - * @return 0 if the stream was created; error code otherwise - */ -GIT_EXTERN(int) git_odb_open_wstream(git_odb_stream **out, git_odb *db, git_off_t size, git_otype type); - -/** - * Write to an odb stream - * - * This method will fail if the total number of received bytes exceeds the - * size declared with `git_odb_open_wstream()` - * - * @param stream the stream - * @param buffer the data to write - * @param len the buffer's length - * @return 0 if the write succeeded; error code otherwise - */ -GIT_EXTERN(int) git_odb_stream_write(git_odb_stream *stream, const char *buffer, size_t len); - -/** - * Finish writing to an odb stream - * - * The object will take its final name and will be available to the - * odb. - * - * This method will fail if the total number of received bytes - * differs from the size declared with `git_odb_open_wstream()` - * - * @param out pointer to store the resulting object's id - * @param stream the stream - * @return 0 on success; an error code otherwise - */ -GIT_EXTERN(int) git_odb_stream_finalize_write(git_oid *out, git_odb_stream *stream); - -/** - * Read from an odb stream - * - * Most backends don't implement streaming reads - */ -GIT_EXTERN(int) git_odb_stream_read(git_odb_stream *stream, char *buffer, size_t len); - -/** - * Free an odb stream - * - * @param stream the stream to free - */ -GIT_EXTERN(void) git_odb_stream_free(git_odb_stream *stream); - -/** - * Open a stream to read an object from the ODB - * - * Note that most backends do *not* support streaming reads - * because they store their objects as compressed/delta'ed blobs. - * - * It's recommended to use `git_odb_read` instead, which is - * assured to work on all backends. - * - * The returned stream will be of type `GIT_STREAM_RDONLY` and - * will have the following methods: - * - * - stream->read: read `n` bytes from the stream - * - stream->free: free the stream - * - * The stream must always be free'd or will leak memory. - * - * @see git_odb_stream - * - * @param out pointer where to store the stream - * @param db object database where the stream will read from - * @param oid oid of the object the stream will read from - * @return 0 if the stream was created; error code otherwise - */ -GIT_EXTERN(int) git_odb_open_rstream(git_odb_stream **out, git_odb *db, const git_oid *oid); - -/** - * Open a stream for writing a pack file to the ODB. - * - * If the ODB layer understands pack files, then the given - * packfile will likely be streamed directly to disk (and a - * corresponding index created). If the ODB layer does not - * understand pack files, the objects will be stored in whatever - * format the ODB layer uses. - * - * @see git_odb_writepack - * - * @param out pointer to the writepack functions - * @param db object database where the stream will read from - * @param progress_cb function to call with progress information. - * Be aware that this is called inline with network and indexing operations, - * so performance may be affected. - * @param progress_payload payload for the progress callback - */ -GIT_EXTERN(int) git_odb_write_pack( - git_odb_writepack **out, - git_odb *db, - git_transfer_progress_cb progress_cb, - void *progress_payload); - -/** - * Determine the object-ID (sha1 hash) of a data buffer - * - * The resulting SHA-1 OID will be the identifier for the data - * buffer as if the data buffer it were to written to the ODB. - * - * @param out the resulting object-ID. - * @param data data to hash - * @param len size of the data - * @param type of the data to hash - * @return 0 or an error code - */ -GIT_EXTERN(int) git_odb_hash(git_oid *out, const void *data, size_t len, git_otype type); - -/** - * Read a file from disk and fill a git_oid with the object id - * that the file would have if it were written to the Object - * Database as an object of the given type (w/o applying filters). - * Similar functionality to git.git's `git hash-object` without - * the `-w` flag, however, with the --no-filters flag. - * If you need filters, see git_repository_hashfile. - * - * @param out oid structure the result is written into. - * @param path file to read and determine object id for - * @param type the type of the object that will be hashed - * @return 0 or an error code - */ -GIT_EXTERN(int) git_odb_hashfile(git_oid *out, const char *path, git_otype type); - -/** - * Create a copy of an odb_object - * - * The returned copy must be manually freed with `git_odb_object_free`. - * Note that because of an implementation detail, the returned copy will be - * the same pointer as `source`: the object is internally refcounted, so the - * copy still needs to be freed twice. - * - * @param dest pointer where to store the copy - * @param source object to copy - * @return 0 or an error code - */ -GIT_EXTERN(int) git_odb_object_dup(git_odb_object **dest, git_odb_object *source); - -/** - * Close an ODB object - * - * This method must always be called once a `git_odb_object` is no - * longer needed, otherwise memory will leak. - * - * @param object object to close - */ -GIT_EXTERN(void) git_odb_object_free(git_odb_object *object); - -/** - * Return the OID of an ODB object - * - * This is the OID from which the object was read from - * - * @param object the object - * @return a pointer to the OID - */ -GIT_EXTERN(const git_oid *) git_odb_object_id(git_odb_object *object); - -/** - * Return the data of an ODB object - * - * This is the uncompressed, raw data as read from the ODB, - * without the leading header. - * - * This pointer is owned by the object and shall not be free'd. - * - * @param object the object - * @return a pointer to the data - */ -GIT_EXTERN(const void *) git_odb_object_data(git_odb_object *object); - -/** - * Return the size of an ODB object - * - * This is the real size of the `data` buffer, not the - * actual size of the object. - * - * @param object the object - * @return the size - */ -GIT_EXTERN(size_t) git_odb_object_size(git_odb_object *object); - -/** - * Return the type of an ODB object - * - * @param object the object - * @return the type - */ -GIT_EXTERN(git_otype) git_odb_object_type(git_odb_object *object); - -/** - * Add a custom backend to an existing Object DB - * - * The backends are checked in relative ordering, based on the - * value of the `priority` parameter. - * - * Read for more information. - * - * @param odb database to add the backend to - * @param backend pointer to a git_odb_backend instance - * @param priority Value for ordering the backends queue - * @return 0 on success; error code otherwise - */ -GIT_EXTERN(int) git_odb_add_backend(git_odb *odb, git_odb_backend *backend, int priority); - -/** - * Add a custom backend to an existing Object DB; this - * backend will work as an alternate. - * - * Alternate backends are always checked for objects *after* - * all the main backends have been exhausted. - * - * The backends are checked in relative ordering, based on the - * value of the `priority` parameter. - * - * Writing is disabled on alternate backends. - * - * Read for more information. - * - * @param odb database to add the backend to - * @param backend pointer to a git_odb_backend instance - * @param priority Value for ordering the backends queue - * @return 0 on success; error code otherwise - */ -GIT_EXTERN(int) git_odb_add_alternate(git_odb *odb, git_odb_backend *backend, int priority); - -/** - * Get the number of ODB backend objects - * - * @param odb object database - * @return number of backends in the ODB - */ -GIT_EXTERN(size_t) git_odb_num_backends(git_odb *odb); - -/** - * Lookup an ODB backend object by index - * - * @param out output pointer to ODB backend at pos - * @param odb object database - * @param pos index into object database backend list - * @return 0 on success; GIT_ENOTFOUND if pos is invalid; other errors < 0 - */ -GIT_EXTERN(int) git_odb_get_backend(git_odb_backend **out, git_odb *odb, size_t pos); - -/** @} */ -GIT_END_DECL -#endif diff --git a/vendor/libgit2/include/git2/odb_backend.h b/vendor/libgit2/include/git2/odb_backend.h deleted file mode 100644 index b17cfd8bab..0000000000 --- a/vendor/libgit2/include/git2/odb_backend.h +++ /dev/null @@ -1,134 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_odb_backend_h__ -#define INCLUDE_git_odb_backend_h__ - -#include "common.h" -#include "types.h" - -/** - * @file git2/backend.h - * @brief Git custom backend functions - * @defgroup git_odb Git object database routines - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/* - * Constructors for in-box ODB backends. - */ - -/** - * Create a backend for the packfiles. - * - * @param out location to store the odb backend pointer - * @param objects_dir the Git repository's objects directory - * - * @return 0 or an error code - */ -GIT_EXTERN(int) git_odb_backend_pack(git_odb_backend **out, const char *objects_dir); - -/** - * Create a backend for loose objects - * - * @param out location to store the odb backend pointer - * @param objects_dir the Git repository's objects directory - * @param compression_level zlib compression level to use - * @param do_fsync whether to do an fsync() after writing (currently ignored) - * @param dir_mode permissions to use creating a directory or 0 for defaults - * @param file_mode permissions to use creating a file or 0 for defaults - * - * @return 0 or an error code - */ -GIT_EXTERN(int) git_odb_backend_loose( - git_odb_backend **out, - const char *objects_dir, - int compression_level, - int do_fsync, - unsigned int dir_mode, - unsigned int file_mode); - -/** - * Create a backend out of a single packfile - * - * This can be useful for inspecting the contents of a single - * packfile. - * - * @param out location to store the odb backend pointer - * @param index_file path to the packfile's .idx file - * - * @return 0 or an error code - */ -GIT_EXTERN(int) git_odb_backend_one_pack(git_odb_backend **out, const char *index_file); - -/** Streaming mode */ -typedef enum { - GIT_STREAM_RDONLY = (1 << 1), - GIT_STREAM_WRONLY = (1 << 2), - GIT_STREAM_RW = (GIT_STREAM_RDONLY | GIT_STREAM_WRONLY), -} git_odb_stream_t; - -/** - * A stream to read/write from a backend. - * - * This represents a stream of data being written to or read from a - * backend. When writing, the frontend functions take care of - * calculating the object's id and all `finalize_write` needs to do is - * store the object with the id it is passed. - */ -struct git_odb_stream { - git_odb_backend *backend; - unsigned int mode; - void *hash_ctx; - - git_off_t declared_size; - git_off_t received_bytes; - - /** - * Write at most `len` bytes into `buffer` and advance the stream. - */ - int (*read)(git_odb_stream *stream, char *buffer, size_t len); - - /** - * Write `len` bytes from `buffer` into the stream. - */ - int (*write)(git_odb_stream *stream, const char *buffer, size_t len); - - /** - * Store the contents of the stream as an object with the id - * specified in `oid`. - * - * This method might not be invoked if: - * - an error occurs earlier with the `write` callback, - * - the object referred to by `oid` already exists in any backend, or - * - the final number of received bytes differs from the size declared - * with `git_odb_open_wstream()` - */ - int (*finalize_write)(git_odb_stream *stream, const git_oid *oid); - - /** - * Free the stream's memory. - * - * This method might be called without a call to `finalize_write` if - * an error occurs or if the object is already present in the ODB. - */ - void (*free)(git_odb_stream *stream); -}; - -/** A stream to write a pack file to the ODB */ -struct git_odb_writepack { - git_odb_backend *backend; - - int (*append)(git_odb_writepack *writepack, const void *data, size_t size, git_transfer_progress *stats); - int (*commit)(git_odb_writepack *writepack, git_transfer_progress *stats); - void (*free)(git_odb_writepack *writepack); -}; - -GIT_END_DECL - -#endif diff --git a/vendor/libgit2/include/git2/oid.h b/vendor/libgit2/include/git2/oid.h deleted file mode 100644 index 8ad51c8bad..0000000000 --- a/vendor/libgit2/include/git2/oid.h +++ /dev/null @@ -1,269 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_oid_h__ -#define INCLUDE_git_oid_h__ - -#include "common.h" -#include "types.h" - -/** - * @file git2/oid.h - * @brief Git object id routines - * @defgroup git_oid Git object id routines - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** Size (in bytes) of a raw/binary oid */ -#define GIT_OID_RAWSZ 20 - -/** Size (in bytes) of a hex formatted oid */ -#define GIT_OID_HEXSZ (GIT_OID_RAWSZ * 2) - -/** Minimum length (in number of hex characters, - * i.e. packets of 4 bits) of an oid prefix */ -#define GIT_OID_MINPREFIXLEN 4 - -/** Unique identity of any object (commit, tree, blob, tag). */ -typedef struct git_oid { - /** raw binary formatted id */ - unsigned char id[GIT_OID_RAWSZ]; -} git_oid; - -/** - * Parse a hex formatted object id into a git_oid. - * - * @param out oid structure the result is written into. - * @param str input hex string; must be pointing at the start of - * the hex sequence and have at least the number of bytes - * needed for an oid encoded in hex (40 bytes). - * @return 0 or an error code - */ -GIT_EXTERN(int) git_oid_fromstr(git_oid *out, const char *str); - -/** - * Parse a hex formatted null-terminated string into a git_oid. - * - * @param out oid structure the result is written into. - * @param str input hex string; must be at least 4 characters - * long and null-terminated. - * @return 0 or an error code - */ -GIT_EXTERN(int) git_oid_fromstrp(git_oid *out, const char *str); - -/** - * Parse N characters of a hex formatted object id into a git_oid - * - * If N is odd, N-1 characters will be parsed instead. - * The remaining space in the git_oid will be set to zero. - * - * @param out oid structure the result is written into. - * @param str input hex string of at least size `length` - * @param length length of the input string - * @return 0 or an error code - */ -GIT_EXTERN(int) git_oid_fromstrn(git_oid *out, const char *str, size_t length); - -/** - * Copy an already raw oid into a git_oid structure. - * - * @param out oid structure the result is written into. - * @param raw the raw input bytes to be copied. - */ -GIT_EXTERN(void) git_oid_fromraw(git_oid *out, const unsigned char *raw); - -/** - * Format a git_oid into a hex string. - * - * @param out output hex string; must be pointing at the start of - * the hex sequence and have at least the number of bytes - * needed for an oid encoded in hex (40 bytes). Only the - * oid digits are written; a '\\0' terminator must be added - * by the caller if it is required. - * @param id oid structure to format. - */ -GIT_EXTERN(void) git_oid_fmt(char *out, const git_oid *id); - -/** - * Format a git_oid into a partial hex string. - * - * @param out output hex string; you say how many bytes to write. - * If the number of bytes is > GIT_OID_HEXSZ, extra bytes - * will be zeroed; if not, a '\0' terminator is NOT added. - * @param n number of characters to write into out string - * @param id oid structure to format. - */ -GIT_EXTERN(void) git_oid_nfmt(char *out, size_t n, const git_oid *id); - -/** - * Format a git_oid into a loose-object path string. - * - * The resulting string is "aa/...", where "aa" is the first two - * hex digits of the oid and "..." is the remaining 38 digits. - * - * @param out output hex string; must be pointing at the start of - * the hex sequence and have at least the number of bytes - * needed for an oid encoded in hex (41 bytes). Only the - * oid digits are written; a '\\0' terminator must be added - * by the caller if it is required. - * @param id oid structure to format. - */ -GIT_EXTERN(void) git_oid_pathfmt(char *out, const git_oid *id); - -/** - * Format a git_oid into a statically allocated c-string. - * - * The c-string is owned by the library and should not be freed - * by the user. If libgit2 is built with thread support, the string - * will be stored in TLS (i.e. one buffer per thread) to allow for - * concurrent calls of the function. - * - * @param oid The oid structure to format - * @return the c-string - */ -GIT_EXTERN(char *) git_oid_tostr_s(const git_oid *oid); - -/** - * Format a git_oid into a buffer as a hex format c-string. - * - * If the buffer is smaller than GIT_OID_HEXSZ+1, then the resulting - * oid c-string will be truncated to n-1 characters (but will still be - * NUL-byte terminated). - * - * If there are any input parameter errors (out == NULL, n == 0, oid == - * NULL), then a pointer to an empty string is returned, so that the - * return value can always be printed. - * - * @param out the buffer into which the oid string is output. - * @param n the size of the out buffer. - * @param id the oid structure to format. - * @return the out buffer pointer, assuming no input parameter - * errors, otherwise a pointer to an empty string. - */ -GIT_EXTERN(char *) git_oid_tostr(char *out, size_t n, const git_oid *id); - -/** - * Copy an oid from one structure to another. - * - * @param out oid structure the result is written into. - * @param src oid structure to copy from. - */ -GIT_EXTERN(void) git_oid_cpy(git_oid *out, const git_oid *src); - -/** - * Compare two oid structures. - * - * @param a first oid structure. - * @param b second oid structure. - * @return <0, 0, >0 if a < b, a == b, a > b. - */ -GIT_EXTERN(int) git_oid_cmp(const git_oid *a, const git_oid *b); - -/** - * Compare two oid structures for equality - * - * @param a first oid structure. - * @param b second oid structure. - * @return true if equal, false otherwise - */ -GIT_EXTERN(int) git_oid_equal(const git_oid *a, const git_oid *b); - -/** - * Compare the first 'len' hexadecimal characters (packets of 4 bits) - * of two oid structures. - * - * @param a first oid structure. - * @param b second oid structure. - * @param len the number of hex chars to compare - * @return 0 in case of a match - */ -GIT_EXTERN(int) git_oid_ncmp(const git_oid *a, const git_oid *b, size_t len); - -/** - * Check if an oid equals an hex formatted object id. - * - * @param id oid structure. - * @param str input hex string of an object id. - * @return 0 in case of a match, -1 otherwise. - */ -GIT_EXTERN(int) git_oid_streq(const git_oid *id, const char *str); - -/** - * Compare an oid to an hex formatted object id. - * - * @param id oid structure. - * @param str input hex string of an object id. - * @return -1 if str is not valid, <0 if id sorts before str, - * 0 if id matches str, >0 if id sorts after str. - */ -GIT_EXTERN(int) git_oid_strcmp(const git_oid *id, const char *str); - -/** - * Check is an oid is all zeros. - * - * @return 1 if all zeros, 0 otherwise. - */ -GIT_EXTERN(int) git_oid_iszero(const git_oid *id); - -/** - * OID Shortener object - */ -typedef struct git_oid_shorten git_oid_shorten; - -/** - * Create a new OID shortener. - * - * The OID shortener is used to process a list of OIDs - * in text form and return the shortest length that would - * uniquely identify all of them. - * - * E.g. look at the result of `git log --abbrev`. - * - * @param min_length The minimal length for all identifiers, - * which will be used even if shorter OIDs would still - * be unique. - * @return a `git_oid_shorten` instance, NULL if OOM - */ -GIT_EXTERN(git_oid_shorten *) git_oid_shorten_new(size_t min_length); - -/** - * Add a new OID to set of shortened OIDs and calculate - * the minimal length to uniquely identify all the OIDs in - * the set. - * - * The OID is expected to be a 40-char hexadecimal string. - * The OID is owned by the user and will not be modified - * or freed. - * - * For performance reasons, there is a hard-limit of how many - * OIDs can be added to a single set (around ~32000, assuming - * a mostly randomized distribution), which should be enough - * for any kind of program, and keeps the algorithm fast and - * memory-efficient. - * - * Attempting to add more than those OIDs will result in a - * GITERR_INVALID error - * - * @param os a `git_oid_shorten` instance - * @param text_id an OID in text form - * @return the minimal length to uniquely identify all OIDs - * added so far to the set; or an error code (<0) if an - * error occurs. - */ -GIT_EXTERN(int) git_oid_shorten_add(git_oid_shorten *os, const char *text_id); - -/** - * Free an OID shortener instance - * - * @param os a `git_oid_shorten` instance - */ -GIT_EXTERN(void) git_oid_shorten_free(git_oid_shorten *os); - -/** @} */ -GIT_END_DECL -#endif diff --git a/vendor/libgit2/include/git2/oidarray.h b/vendor/libgit2/include/git2/oidarray.h deleted file mode 100644 index 0b32045978..0000000000 --- a/vendor/libgit2/include/git2/oidarray.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_oidarray_h__ -#define INCLUDE_git_oidarray_h__ - -#include "common.h" -#include "oid.h" - -GIT_BEGIN_DECL - -/** Array of object ids */ -typedef struct git_oidarray { - git_oid *ids; - size_t count; -} git_oidarray; - -/** - * Free the OID array - * - * This method must (and must only) be called on `git_oidarray` - * objects where the array is allocated by the library. Not doing so, - * will result in a memory leak. - * - * This does not free the `git_oidarray` itself, since the library will - * never allocate that object directly itself (it is more commonly embedded - * inside another struct or created on the stack). - * - * @param array git_oidarray from which to free oid data - */ -GIT_EXTERN(void) git_oidarray_free(git_oidarray *array); - -/** @} */ -GIT_END_DECL - -#endif - diff --git a/vendor/libgit2/include/git2/pack.h b/vendor/libgit2/include/git2/pack.h deleted file mode 100644 index 4941998ebf..0000000000 --- a/vendor/libgit2/include/git2/pack.h +++ /dev/null @@ -1,240 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_pack_h__ -#define INCLUDE_git_pack_h__ - -#include "common.h" -#include "oid.h" - -/** - * @file git2/pack.h - * @brief Git pack management routines - * - * Packing objects - * --------------- - * - * Creation of packfiles requires two steps: - * - * - First, insert all the objects you want to put into the packfile - * using `git_packbuilder_insert` and `git_packbuilder_insert_tree`. - * It's important to add the objects in recency order ("in the order - * that they are 'reachable' from head"). - * - * "ANY order will give you a working pack, ... [but it is] the thing - * that gives packs good locality. It keeps the objects close to the - * head (whether they are old or new, but they are _reachable_ from the - * head) at the head of the pack. So packs actually have absolutely - * _wonderful_ IO patterns." - Linus Torvalds - * git.git/Documentation/technical/pack-heuristics.txt - * - * - Second, use `git_packbuilder_write` or `git_packbuilder_foreach` to - * write the resulting packfile. - * - * libgit2 will take care of the delta ordering and generation. - * `git_packbuilder_set_threads` can be used to adjust the number of - * threads used for the process. - * - * See tests/pack/packbuilder.c for an example. - * - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** - * Stages that are reported by the packbuilder progress callback. - */ -typedef enum { - GIT_PACKBUILDER_ADDING_OBJECTS = 0, - GIT_PACKBUILDER_DELTAFICATION = 1, -} git_packbuilder_stage_t; - -/** - * Initialize a new packbuilder - * - * @param out The new packbuilder object - * @param repo The repository - * - * @return 0 or an error code - */ -GIT_EXTERN(int) git_packbuilder_new(git_packbuilder **out, git_repository *repo); - -/** - * Set number of threads to spawn - * - * By default, libgit2 won't spawn any threads at all; - * when set to 0, libgit2 will autodetect the number of - * CPUs. - * - * @param pb The packbuilder - * @param n Number of threads to spawn - * @return number of actual threads to be used - */ -GIT_EXTERN(unsigned int) git_packbuilder_set_threads(git_packbuilder *pb, unsigned int n); - -/** - * Insert a single object - * - * For an optimal pack it's mandatory to insert objects in recency order, - * commits followed by trees and blobs. - * - * @param pb The packbuilder - * @param id The oid of the commit - * @param name The name; might be NULL - * - * @return 0 or an error code - */ -GIT_EXTERN(int) git_packbuilder_insert(git_packbuilder *pb, const git_oid *id, const char *name); - -/** - * Insert a root tree object - * - * This will add the tree as well as all referenced trees and blobs. - * - * @param pb The packbuilder - * @param id The oid of the root tree - * - * @return 0 or an error code - */ -GIT_EXTERN(int) git_packbuilder_insert_tree(git_packbuilder *pb, const git_oid *id); - -/** - * Insert a commit object - * - * This will add a commit as well as the completed referenced tree. - * - * @param pb The packbuilder - * @param id The oid of the commit - * - * @return 0 or an error code - */ -GIT_EXTERN(int) git_packbuilder_insert_commit(git_packbuilder *pb, const git_oid *id); - -/** - * Insert objects as given by the walk - * - * Those commits and all objects they reference will be inserted into - * the packbuilder. - * - * @param pb the packbuilder - * @param walk the revwalk to use to fill the packbuilder - * - * @return 0 or an error code - */ -GIT_EXTERN(int) git_packbuilder_insert_walk(git_packbuilder *pb, git_revwalk *walk); - -/** - * Recursively insert an object and its referenced objects - * - * Insert the object as well as any object it references. - * - * @param pb the packbuilder - * @param id the id of the root object to insert - * @param name optional name for the object - * @return 0 or an error code - */ -GIT_EXTERN(int) git_packbuilder_insert_recur(git_packbuilder *pb, const git_oid *id, const char *name); - -/** - * Write the contents of the packfile to an in-memory buffer - * - * The contents of the buffer will become a valid packfile, even though there - * will be no attached index - * - * @param buf Buffer where to write the packfile - * @param pb The packbuilder - */ -GIT_EXTERN(int) git_packbuilder_write_buf(git_buf *buf, git_packbuilder *pb); - -/** - * Write the new pack and corresponding index file to path. - * - * @param pb The packbuilder - * @param path to the directory where the packfile and index should be stored - * @param mode permissions to use creating a packfile or 0 for defaults - * @param progress_cb function to call with progress information from the indexer (optional) - * @param progress_cb_payload payload for the progress callback (optional) - * - * @return 0 or an error code - */ -GIT_EXTERN(int) git_packbuilder_write( - git_packbuilder *pb, - const char *path, - unsigned int mode, - git_transfer_progress_cb progress_cb, - void *progress_cb_payload); - -/** -* Get the packfile's hash -* -* A packfile's name is derived from the sorted hashing of all object -* names. This is only correct after the packfile has been written. -* -* @param pb The packbuilder object -*/ -GIT_EXTERN(const git_oid *) git_packbuilder_hash(git_packbuilder *pb); - -typedef int (*git_packbuilder_foreach_cb)(void *buf, size_t size, void *payload); - -/** - * Create the new pack and pass each object to the callback - * - * @param pb the packbuilder - * @param cb the callback to call with each packed object's buffer - * @param payload the callback's data - * @return 0 or an error code - */ -GIT_EXTERN(int) git_packbuilder_foreach(git_packbuilder *pb, git_packbuilder_foreach_cb cb, void *payload); - -/** - * Get the total number of objects the packbuilder will write out - * - * @param pb the packbuilder - * @return the number of objects in the packfile - */ -GIT_EXTERN(uint32_t) git_packbuilder_object_count(git_packbuilder *pb); - -/** - * Get the number of objects the packbuilder has already written out - * - * @param pb the packbuilder - * @return the number of objects which have already been written - */ -GIT_EXTERN(uint32_t) git_packbuilder_written(git_packbuilder *pb); - -/** Packbuilder progress notification function */ -typedef int (*git_packbuilder_progress)( - int stage, - unsigned int current, - unsigned int total, - void *payload); - -/** - * Set the callbacks for a packbuilder - * - * @param pb The packbuilder object - * @param progress_cb Function to call with progress information during - * pack building. Be aware that this is called inline with pack building - * operations, so performance may be affected. - * @param progress_cb_payload Payload for progress callback. - * @return 0 or an error code - */ -GIT_EXTERN(int) git_packbuilder_set_callbacks( - git_packbuilder *pb, - git_packbuilder_progress progress_cb, - void *progress_cb_payload); - -/** - * Free the packbuilder and all associated data - * - * @param pb The packbuilder - */ -GIT_EXTERN(void) git_packbuilder_free(git_packbuilder *pb); - -/** @} */ -GIT_END_DECL -#endif diff --git a/vendor/libgit2/include/git2/patch.h b/vendor/libgit2/include/git2/patch.h deleted file mode 100644 index 790cb74fcc..0000000000 --- a/vendor/libgit2/include/git2/patch.h +++ /dev/null @@ -1,274 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_patch_h__ -#define INCLUDE_git_patch_h__ - -#include "common.h" -#include "types.h" -#include "oid.h" -#include "diff.h" - -/** - * @file git2/patch.h - * @brief Patch handling routines. - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** - * The diff patch is used to store all the text diffs for a delta. - * - * You can easily loop over the content of patches and get information about - * them. - */ -typedef struct git_patch git_patch; - -/** - * Return a patch for an entry in the diff list. - * - * The `git_patch` is a newly created object contains the text diffs - * for the delta. You have to call `git_patch_free()` when you are - * done with it. You can use the patch object to loop over all the hunks - * and lines in the diff of the one delta. - * - * For an unchanged file or a binary file, no `git_patch` will be - * created, the output will be set to NULL, and the `binary` flag will be - * set true in the `git_diff_delta` structure. - * - * It is okay to pass NULL for either of the output parameters; if you pass - * NULL for the `git_patch`, then the text diff will not be calculated. - * - * @param out Output parameter for the delta patch object - * @param diff Diff list object - * @param idx Index into diff list - * @return 0 on success, other value < 0 on error - */ -GIT_EXTERN(int) git_patch_from_diff( - git_patch **out, git_diff *diff, size_t idx); - -/** - * Directly generate a patch from the difference between two blobs. - * - * This is just like `git_diff_blobs()` except it generates a patch object - * for the difference instead of directly making callbacks. You can use the - * standard `git_patch` accessor functions to read the patch data, and - * you must call `git_patch_free()` on the patch when done. - * - * @param out The generated patch; NULL on error - * @param old_blob Blob for old side of diff, or NULL for empty blob - * @param old_as_path Treat old blob as if it had this filename; can be NULL - * @param new_blob Blob for new side of diff, or NULL for empty blob - * @param new_as_path Treat new blob as if it had this filename; can be NULL - * @param opts Options for diff, or NULL for default options - * @return 0 on success or error code < 0 - */ -GIT_EXTERN(int) git_patch_from_blobs( - git_patch **out, - const git_blob *old_blob, - const char *old_as_path, - const git_blob *new_blob, - const char *new_as_path, - const git_diff_options *opts); - -/** - * Directly generate a patch from the difference between a blob and a buffer. - * - * This is just like `git_diff_blob_to_buffer()` except it generates a patch - * object for the difference instead of directly making callbacks. You can - * use the standard `git_patch` accessor functions to read the patch - * data, and you must call `git_patch_free()` on the patch when done. - * - * @param out The generated patch; NULL on error - * @param old_blob Blob for old side of diff, or NULL for empty blob - * @param old_as_path Treat old blob as if it had this filename; can be NULL - * @param buffer Raw data for new side of diff, or NULL for empty - * @param buffer_len Length of raw data for new side of diff - * @param buffer_as_path Treat buffer as if it had this filename; can be NULL - * @param opts Options for diff, or NULL for default options - * @return 0 on success or error code < 0 - */ -GIT_EXTERN(int) git_patch_from_blob_and_buffer( - git_patch **out, - const git_blob *old_blob, - const char *old_as_path, - const char *buffer, - size_t buffer_len, - const char *buffer_as_path, - const git_diff_options *opts); - -/** - * Directly generate a patch from the difference between two buffers. - * - * This is just like `git_diff_buffers()` except it generates a patch - * object for the difference instead of directly making callbacks. You can - * use the standard `git_patch` accessor functions to read the patch - * data, and you must call `git_patch_free()` on the patch when done. - * - * @param out The generated patch; NULL on error - * @param old_buffer Raw data for old side of diff, or NULL for empty - * @param old_len Length of the raw data for old side of the diff - * @param old_as_path Treat old buffer as if it had this filename; can be NULL - * @param new_buffer Raw data for new side of diff, or NULL for empty - * @param new_len Length of raw data for new side of diff - * @param new_as_path Treat buffer as if it had this filename; can be NULL - * @param opts Options for diff, or NULL for default options - * @return 0 on success or error code < 0 - */ -GIT_EXTERN(int) git_patch_from_buffers( - git_patch **out, - const void *old_buffer, - size_t old_len, - const char *old_as_path, - const char *new_buffer, - size_t new_len, - const char *new_as_path, - const git_diff_options *opts); - -/** - * Free a git_patch object. - */ -GIT_EXTERN(void) git_patch_free(git_patch *patch); - -/** - * Get the delta associated with a patch. This delta points to internal - * data and you do not have to release it when you are done with it. - */ -GIT_EXTERN(const git_diff_delta *) git_patch_get_delta(const git_patch *patch); - -/** - * Get the number of hunks in a patch - */ -GIT_EXTERN(size_t) git_patch_num_hunks(const git_patch *patch); - -/** - * Get line counts of each type in a patch. - * - * This helps imitate a diff --numstat type of output. For that purpose, - * you only need the `total_additions` and `total_deletions` values, but we - * include the `total_context` line count in case you want the total number - * of lines of diff output that will be generated. - * - * All outputs are optional. Pass NULL if you don't need a particular count. - * - * @param total_context Count of context lines in output, can be NULL. - * @param total_additions Count of addition lines in output, can be NULL. - * @param total_deletions Count of deletion lines in output, can be NULL. - * @param patch The git_patch object - * @return 0 on success, <0 on error - */ -GIT_EXTERN(int) git_patch_line_stats( - size_t *total_context, - size_t *total_additions, - size_t *total_deletions, - const git_patch *patch); - -/** - * Get the information about a hunk in a patch - * - * Given a patch and a hunk index into the patch, this returns detailed - * information about that hunk. Any of the output pointers can be passed - * as NULL if you don't care about that particular piece of information. - * - * @param out Output pointer to git_diff_hunk of hunk - * @param lines_in_hunk Output count of total lines in this hunk - * @param patch Input pointer to patch object - * @param hunk_idx Input index of hunk to get information about - * @return 0 on success, GIT_ENOTFOUND if hunk_idx out of range, <0 on error - */ -GIT_EXTERN(int) git_patch_get_hunk( - const git_diff_hunk **out, - size_t *lines_in_hunk, - git_patch *patch, - size_t hunk_idx); - -/** - * Get the number of lines in a hunk. - * - * @param patch The git_patch object - * @param hunk_idx Index of the hunk - * @return Number of lines in hunk or -1 if invalid hunk index - */ -GIT_EXTERN(int) git_patch_num_lines_in_hunk( - const git_patch *patch, - size_t hunk_idx); - -/** - * Get data about a line in a hunk of a patch. - * - * Given a patch, a hunk index, and a line index in the hunk, this - * will return a lot of details about that line. If you pass a hunk - * index larger than the number of hunks or a line index larger than - * the number of lines in the hunk, this will return -1. - * - * @param out The git_diff_line data for this line - * @param patch The patch to look in - * @param hunk_idx The index of the hunk - * @param line_of_hunk The index of the line in the hunk - * @return 0 on success, <0 on failure - */ -GIT_EXTERN(int) git_patch_get_line_in_hunk( - const git_diff_line **out, - git_patch *patch, - size_t hunk_idx, - size_t line_of_hunk); - -/** - * Look up size of patch diff data in bytes - * - * This returns the raw size of the patch data. This only includes the - * actual data from the lines of the diff, not the file or hunk headers. - * - * If you pass `include_context` as true (non-zero), this will be the size - * of all of the diff output; if you pass it as false (zero), this will - * only include the actual changed lines (as if `context_lines` was 0). - * - * @param patch A git_patch representing changes to one file - * @param include_context Include context lines in size if non-zero - * @param include_hunk_headers Include hunk header lines if non-zero - * @param include_file_headers Include file header lines if non-zero - * @return The number of bytes of data - */ -GIT_EXTERN(size_t) git_patch_size( - git_patch *patch, - int include_context, - int include_hunk_headers, - int include_file_headers); - -/** - * Serialize the patch to text via callback. - * - * Returning a non-zero value from the callback will terminate the iteration - * and return that value to the caller. - * - * @param patch A git_patch representing changes to one file - * @param print_cb Callback function to output lines of the patch. Will be - * called for file headers, hunk headers, and diff lines. - * @param payload Reference pointer that will be passed to your callbacks. - * @return 0 on success, non-zero callback return value, or error code - */ -GIT_EXTERN(int) git_patch_print( - git_patch *patch, - git_diff_line_cb print_cb, - void *payload); - -/** - * Get the content of a patch as a single diff text. - * - * @param out The git_buf to be filled in - * @param patch A git_patch representing changes to one file - * @return 0 on success, <0 on failure. - */ -GIT_EXTERN(int) git_patch_to_buf( - git_buf *out, - git_patch *patch); - -GIT_END_DECL - -/**@}*/ - -#endif diff --git a/vendor/libgit2/include/git2/pathspec.h b/vendor/libgit2/include/git2/pathspec.h deleted file mode 100644 index de6f027c51..0000000000 --- a/vendor/libgit2/include/git2/pathspec.h +++ /dev/null @@ -1,263 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_pathspec_h__ -#define INCLUDE_git_pathspec_h__ - -#include "common.h" -#include "types.h" -#include "strarray.h" -#include "diff.h" - -GIT_BEGIN_DECL - -/** - * Compiled pathspec - */ -typedef struct git_pathspec git_pathspec; - -/** - * List of filenames matching a pathspec - */ -typedef struct git_pathspec_match_list git_pathspec_match_list; - -/** - * Options controlling how pathspec match should be executed - * - * - GIT_PATHSPEC_IGNORE_CASE forces match to ignore case; otherwise - * match will use native case sensitivity of platform filesystem - * - GIT_PATHSPEC_USE_CASE forces case sensitive match; otherwise - * match will use native case sensitivity of platform filesystem - * - GIT_PATHSPEC_NO_GLOB disables glob patterns and just uses simple - * string comparison for matching - * - GIT_PATHSPEC_NO_MATCH_ERROR means the match functions return error - * code GIT_ENOTFOUND if no matches are found; otherwise no matches is - * still success (return 0) but `git_pathspec_match_list_entrycount` - * will indicate 0 matches. - * - GIT_PATHSPEC_FIND_FAILURES means that the `git_pathspec_match_list` - * should track which patterns matched which files so that at the end of - * the match we can identify patterns that did not match any files. - * - GIT_PATHSPEC_FAILURES_ONLY means that the `git_pathspec_match_list` - * does not need to keep the actual matching filenames. Use this to - * just test if there were any matches at all or in combination with - * GIT_PATHSPEC_FIND_FAILURES to validate a pathspec. - */ -typedef enum { - GIT_PATHSPEC_DEFAULT = 0, - GIT_PATHSPEC_IGNORE_CASE = (1u << 0), - GIT_PATHSPEC_USE_CASE = (1u << 1), - GIT_PATHSPEC_NO_GLOB = (1u << 2), - GIT_PATHSPEC_NO_MATCH_ERROR = (1u << 3), - GIT_PATHSPEC_FIND_FAILURES = (1u << 4), - GIT_PATHSPEC_FAILURES_ONLY = (1u << 5), -} git_pathspec_flag_t; - -/** - * Compile a pathspec - * - * @param out Output of the compiled pathspec - * @param pathspec A git_strarray of the paths to match - * @return 0 on success, <0 on failure - */ -GIT_EXTERN(int) git_pathspec_new( - git_pathspec **out, const git_strarray *pathspec); - -/** - * Free a pathspec - * - * @param ps The compiled pathspec - */ -GIT_EXTERN(void) git_pathspec_free(git_pathspec *ps); - -/** - * Try to match a path against a pathspec - * - * Unlike most of the other pathspec matching functions, this will not - * fall back on the native case-sensitivity for your platform. You must - * explicitly pass flags to control case sensitivity or else this will - * fall back on being case sensitive. - * - * @param ps The compiled pathspec - * @param flags Combination of git_pathspec_flag_t options to control match - * @param path The pathname to attempt to match - * @return 1 is path matches spec, 0 if it does not - */ -GIT_EXTERN(int) git_pathspec_matches_path( - const git_pathspec *ps, uint32_t flags, const char *path); - -/** - * Match a pathspec against the working directory of a repository. - * - * This matches the pathspec against the current files in the working - * directory of the repository. It is an error to invoke this on a bare - * repo. This handles git ignores (i.e. ignored files will not be - * considered to match the `pathspec` unless the file is tracked in the - * index). - * - * If `out` is not NULL, this returns a `git_patchspec_match_list`. That - * contains the list of all matched filenames (unless you pass the - * `GIT_PATHSPEC_FAILURES_ONLY` flag) and may also contain the list of - * pathspecs with no match (if you used the `GIT_PATHSPEC_FIND_FAILURES` - * flag). You must call `git_pathspec_match_list_free()` on this object. - * - * @param out Output list of matches; pass NULL to just get return value - * @param repo The repository in which to match; bare repo is an error - * @param flags Combination of git_pathspec_flag_t options to control match - * @param ps Pathspec to be matched - * @return 0 on success, -1 on error, GIT_ENOTFOUND if no matches and - * the GIT_PATHSPEC_NO_MATCH_ERROR flag was given - */ -GIT_EXTERN(int) git_pathspec_match_workdir( - git_pathspec_match_list **out, - git_repository *repo, - uint32_t flags, - git_pathspec *ps); - -/** - * Match a pathspec against entries in an index. - * - * This matches the pathspec against the files in the repository index. - * - * NOTE: At the moment, the case sensitivity of this match is controlled - * by the current case-sensitivity of the index object itself and the - * USE_CASE and IGNORE_CASE flags will have no effect. This behavior will - * be corrected in a future release. - * - * If `out` is not NULL, this returns a `git_patchspec_match_list`. That - * contains the list of all matched filenames (unless you pass the - * `GIT_PATHSPEC_FAILURES_ONLY` flag) and may also contain the list of - * pathspecs with no match (if you used the `GIT_PATHSPEC_FIND_FAILURES` - * flag). You must call `git_pathspec_match_list_free()` on this object. - * - * @param out Output list of matches; pass NULL to just get return value - * @param index The index to match against - * @param flags Combination of git_pathspec_flag_t options to control match - * @param ps Pathspec to be matched - * @return 0 on success, -1 on error, GIT_ENOTFOUND if no matches and - * the GIT_PATHSPEC_NO_MATCH_ERROR flag is used - */ -GIT_EXTERN(int) git_pathspec_match_index( - git_pathspec_match_list **out, - git_index *index, - uint32_t flags, - git_pathspec *ps); - -/** - * Match a pathspec against files in a tree. - * - * This matches the pathspec against the files in the given tree. - * - * If `out` is not NULL, this returns a `git_patchspec_match_list`. That - * contains the list of all matched filenames (unless you pass the - * `GIT_PATHSPEC_FAILURES_ONLY` flag) and may also contain the list of - * pathspecs with no match (if you used the `GIT_PATHSPEC_FIND_FAILURES` - * flag). You must call `git_pathspec_match_list_free()` on this object. - * - * @param out Output list of matches; pass NULL to just get return value - * @param tree The root-level tree to match against - * @param flags Combination of git_pathspec_flag_t options to control match - * @param ps Pathspec to be matched - * @return 0 on success, -1 on error, GIT_ENOTFOUND if no matches and - * the GIT_PATHSPEC_NO_MATCH_ERROR flag is used - */ -GIT_EXTERN(int) git_pathspec_match_tree( - git_pathspec_match_list **out, - git_tree *tree, - uint32_t flags, - git_pathspec *ps); - -/** - * Match a pathspec against files in a diff list. - * - * This matches the pathspec against the files in the given diff list. - * - * If `out` is not NULL, this returns a `git_patchspec_match_list`. That - * contains the list of all matched filenames (unless you pass the - * `GIT_PATHSPEC_FAILURES_ONLY` flag) and may also contain the list of - * pathspecs with no match (if you used the `GIT_PATHSPEC_FIND_FAILURES` - * flag). You must call `git_pathspec_match_list_free()` on this object. - * - * @param out Output list of matches; pass NULL to just get return value - * @param diff A generated diff list - * @param flags Combination of git_pathspec_flag_t options to control match - * @param ps Pathspec to be matched - * @return 0 on success, -1 on error, GIT_ENOTFOUND if no matches and - * the GIT_PATHSPEC_NO_MATCH_ERROR flag is used - */ -GIT_EXTERN(int) git_pathspec_match_diff( - git_pathspec_match_list **out, - git_diff *diff, - uint32_t flags, - git_pathspec *ps); - -/** - * Free memory associates with a git_pathspec_match_list - * - * @param m The git_pathspec_match_list to be freed - */ -GIT_EXTERN(void) git_pathspec_match_list_free(git_pathspec_match_list *m); - -/** - * Get the number of items in a match list. - * - * @param m The git_pathspec_match_list object - * @return Number of items in match list - */ -GIT_EXTERN(size_t) git_pathspec_match_list_entrycount( - const git_pathspec_match_list *m); - -/** - * Get a matching filename by position. - * - * This routine cannot be used if the match list was generated by - * `git_pathspec_match_diff`. If so, it will always return NULL. - * - * @param m The git_pathspec_match_list object - * @param pos The index into the list - * @return The filename of the match - */ -GIT_EXTERN(const char *) git_pathspec_match_list_entry( - const git_pathspec_match_list *m, size_t pos); - -/** - * Get a matching diff delta by position. - * - * This routine can only be used if the match list was generated by - * `git_pathspec_match_diff`. Otherwise it will always return NULL. - * - * @param m The git_pathspec_match_list object - * @param pos The index into the list - * @return The filename of the match - */ -GIT_EXTERN(const git_diff_delta *) git_pathspec_match_list_diff_entry( - const git_pathspec_match_list *m, size_t pos); - -/** - * Get the number of pathspec items that did not match. - * - * This will be zero unless you passed GIT_PATHSPEC_FIND_FAILURES when - * generating the git_pathspec_match_list. - * - * @param m The git_pathspec_match_list object - * @return Number of items in original pathspec that had no matches - */ -GIT_EXTERN(size_t) git_pathspec_match_list_failed_entrycount( - const git_pathspec_match_list *m); - -/** - * Get an original pathspec string that had no matches. - * - * This will be return NULL for positions out of range. - * - * @param m The git_pathspec_match_list object - * @param pos The index into the failed items - * @return The pathspec pattern that didn't match anything - */ -GIT_EXTERN(const char *) git_pathspec_match_list_failed_entry( - const git_pathspec_match_list *m, size_t pos); - -GIT_END_DECL -#endif diff --git a/vendor/libgit2/include/git2/rebase.h b/vendor/libgit2/include/git2/rebase.h deleted file mode 100644 index d9aa175c77..0000000000 --- a/vendor/libgit2/include/git2/rebase.h +++ /dev/null @@ -1,290 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_rebase_h__ -#define INCLUDE_git_rebase_h__ - -#include "common.h" -#include "types.h" -#include "oid.h" -#include "annotated_commit.h" - -/** - * @file git2/rebase.h - * @brief Git rebase routines - * @defgroup git_rebase Git merge routines - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** - * Rebase options - * - * Use to tell the rebase machinery how to operate. - */ -typedef struct { - unsigned int version; - - /** - * Used by `git_rebase_init`, this will instruct other clients working - * on this rebase that you want a quiet rebase experience, which they - * may choose to provide in an application-specific manner. This has no - * effect upon libgit2 directly, but is provided for interoperability - * between Git tools. - */ - int quiet; - - /** - * Used by `git_rebase_finish`, this is the name of the notes reference - * used to rewrite notes for rebased commits when finishing the rebase; - * if NULL, the contents of the coniguration option `notes.rewriteRef` - * is examined, unless the configuration option `notes.rewrite.rebase` - * is set to false. If `notes.rewriteRef` is also NULL, notes will - * not be rewritten. - */ - const char *rewrite_notes_ref; - - /** - * Options to control how files are written during `git_rebase_init`, - * `git_checkout_next` and `git_checkout_abort`. Note that a minimum - * strategy of `GIT_CHECKOUT_SAFE` is defaulted in `init` and `next`, - * and a minimum strategy of `GIT_CHECKOUT_FORCE` is defaulted in - * `abort` to match git semantics. - */ - git_checkout_options checkout_options; -} git_rebase_options; - -/** - * Type of rebase operation in-progress after calling `git_rebase_next`. - */ -typedef enum { - /** - * The given commit is to be cherry-picked. The client should commit - * the changes and continue if there are no conflicts. - */ - GIT_REBASE_OPERATION_PICK = 0, - - /** - * The given commit is to be cherry-picked, but the client should prompt - * the user to provide an updated commit message. - */ - GIT_REBASE_OPERATION_REWORD, - - /** - * The given commit is to be cherry-picked, but the client should stop - * to allow the user to edit the changes before committing them. - */ - GIT_REBASE_OPERATION_EDIT, - - /** - * The given commit is to be squashed into the previous commit. The - * commit message will be merged with the previous message. - */ - GIT_REBASE_OPERATION_SQUASH, - - /** - * The given commit is to be squashed into the previous commit. The - * commit message from this commit will be discarded. - */ - GIT_REBASE_OPERATION_FIXUP, - - /** - * No commit will be cherry-picked. The client should run the given - * command and (if successful) continue. - */ - GIT_REBASE_OPERATION_EXEC, -} git_rebase_operation_t; - -#define GIT_REBASE_OPTIONS_VERSION 1 -#define GIT_REBASE_OPTIONS_INIT \ - {GIT_REBASE_OPTIONS_VERSION, 0, NULL, GIT_CHECKOUT_OPTIONS_INIT} - -/** Indicates that a rebase operation is not (yet) in progress. */ -#define GIT_REBASE_NO_OPERATION SIZE_MAX - -/** - * A rebase operation - * - * Describes a single instruction/operation to be performed during the - * rebase. - */ -typedef struct { - /** The type of rebase operation. */ - git_rebase_operation_t type; - - /** - * The commit ID being cherry-picked. This will be populated for - * all operations except those of type `GIT_REBASE_OPERATION_EXEC`. - */ - const git_oid id; - - /** - * The executable the user has requested be run. This will only - * be populated for operations of type `GIT_REBASE_OPERATION_EXEC`. - */ - const char *exec; -} git_rebase_operation; - -/** - * Initializes a `git_rebase_options` with default values. Equivalent to - * creating an instance with GIT_REBASE_OPTIONS_INIT. - * - * @param opts the `git_rebase_options` instance to initialize. - * @param version the version of the struct; you should pass - * `GIT_REBASE_OPTIONS_VERSION` here. - * @return Zero on success; -1 on failure. - */ -GIT_EXTERN(int) git_rebase_init_options( - git_rebase_options *opts, - unsigned int version); - -/** - * Initializes a rebase operation to rebase the changes in `branch` - * relative to `upstream` onto another branch. To begin the rebase - * process, call `git_rebase_next`. When you have finished with this - * object, call `git_rebase_free`. - * - * @param out Pointer to store the rebase object - * @param repo The repository to perform the rebase - * @param branch The terminal commit to rebase, or NULL to rebase the - * current branch - * @param upstream The commit to begin rebasing from, or NULL to rebase all - * reachable commits - * @param onto The branch to rebase onto, or NULL to rebase onto the given - * upstream - * @param opts Options to specify how rebase is performed, or NULL - * @return Zero on success; -1 on failure. - */ -GIT_EXTERN(int) git_rebase_init( - git_rebase **out, - git_repository *repo, - const git_annotated_commit *branch, - const git_annotated_commit *upstream, - const git_annotated_commit *onto, - const git_rebase_options *opts); - -/** - * Opens an existing rebase that was previously started by either an - * invocation of `git_rebase_init` or by another client. - * - * @param out Pointer to store the rebase object - * @param repo The repository that has a rebase in-progress - * @param opts Options to specify how rebase is performed - * @return Zero on success; -1 on failure. - */ -GIT_EXTERN(int) git_rebase_open( - git_rebase **out, - git_repository *repo, - const git_rebase_options *opts); - -/** - * Gets the count of rebase operations that are to be applied. - * - * @param rebase The in-progress rebase - * @return The number of rebase operations in total - */ -GIT_EXTERN(size_t) git_rebase_operation_entrycount(git_rebase *rebase); - -/** - * Gets the index of the rebase operation that is currently being applied. - * If the first operation has not yet been applied (because you have - * called `init` but not yet `next`) then this returns - * `GIT_REBASE_NO_OPERATION`. - * - * @param rebase The in-progress rebase - * @return The index of the rebase operation currently being applied. - */ -GIT_EXTERN(size_t) git_rebase_operation_current(git_rebase *rebase); - -/** - * Gets the rebase operation specified by the given index. - * - * @param rebase The in-progress rebase - * @param idx The index of the rebase operation to retrieve - * @return The rebase operation or NULL if `idx` was out of bounds - */ -GIT_EXTERN(git_rebase_operation *) git_rebase_operation_byindex( - git_rebase *rebase, - size_t idx); - -/** - * Performs the next rebase operation and returns the information about it. - * If the operation is one that applies a patch (which is any operation except - * GIT_REBASE_OPERATION_EXEC) then the patch will be applied and the index and - * working directory will be updated with the changes. If there are conflicts, - * you will need to address those before committing the changes. - * - * @param operation Pointer to store the rebase operation that is to be performed next - * @param rebase The rebase in progress - * @return Zero on success; -1 on failure. - */ -GIT_EXTERN(int) git_rebase_next( - git_rebase_operation **operation, - git_rebase *rebase); - -/** - * Commits the current patch. You must have resolved any conflicts that - * were introduced during the patch application from the `git_rebase_next` - * invocation. - * - * @param id Pointer in which to store the OID of the newly created commit - * @param rebase The rebase that is in-progress - * @param author The author of the updated commit, or NULL to keep the - * author from the original commit - * @param committer The committer of the rebase - * @param message_encoding The encoding for the message in the commit, - * represented with a standard encoding name. If message is NULL, - * this should also be NULL, and the encoding from the original - * commit will be maintained. If message is specified, this may be - * NULL to indicate that "UTF-8" is to be used. - * @param message The message for this commit, or NULL to use the message - * from the original commit. - * @return Zero on success, GIT_EUNMERGED if there are unmerged changes in - * the index, GIT_EAPPLIED if the current commit has already - * been applied to the upstream and there is nothing to commit, - * -1 on failure. - */ -GIT_EXTERN(int) git_rebase_commit( - git_oid *id, - git_rebase *rebase, - const git_signature *author, - const git_signature *committer, - const char *message_encoding, - const char *message); - -/** - * Aborts a rebase that is currently in progress, resetting the repository - * and working directory to their state before rebase began. - * - * @param rebase The rebase that is in-progress - * @return Zero on success; GIT_ENOTFOUND if a rebase is not in progress, - * -1 on other errors. - */ -GIT_EXTERN(int) git_rebase_abort(git_rebase *rebase); - -/** - * Finishes a rebase that is currently in progress once all patches have - * been applied. - * - * @param rebase The rebase that is in-progress - * @param signature The identity that is finishing the rebase (optional) - * @return Zero on success; -1 on error - */ -GIT_EXTERN(int) git_rebase_finish( - git_rebase *rebase, - const git_signature *signature); - -/** - * Frees the `git_rebase` object. - * - * @param rebase The rebase object - */ -GIT_EXTERN(void) git_rebase_free(git_rebase *rebase); - -/** @} */ -GIT_END_DECL -#endif diff --git a/vendor/libgit2/include/git2/refdb.h b/vendor/libgit2/include/git2/refdb.h deleted file mode 100644 index a315876aef..0000000000 --- a/vendor/libgit2/include/git2/refdb.h +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_refdb_h__ -#define INCLUDE_git_refdb_h__ - -#include "common.h" -#include "types.h" -#include "oid.h" -#include "refs.h" - -/** - * @file git2/refdb.h - * @brief Git custom refs backend functions - * @defgroup git_refdb Git custom refs backend API - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** - * Create a new reference database with no backends. - * - * Before the Ref DB can be used for read/writing, a custom database - * backend must be manually set using `git_refdb_set_backend()` - * - * @param out location to store the database pointer, if opened. - * Set to NULL if the open failed. - * @param repo the repository - * @return 0 or an error code - */ -GIT_EXTERN(int) git_refdb_new(git_refdb **out, git_repository *repo); - -/** - * Create a new reference database and automatically add - * the default backends: - * - * - git_refdb_dir: read and write loose and packed refs - * from disk, assuming the repository dir as the folder - * - * @param out location to store the database pointer, if opened. - * Set to NULL if the open failed. - * @param repo the repository - * @return 0 or an error code - */ -GIT_EXTERN(int) git_refdb_open(git_refdb **out, git_repository *repo); - -/** - * Suggests that the given refdb compress or optimize its references. - * This mechanism is implementation specific. For on-disk reference - * databases, for example, this may pack all loose references. - */ -GIT_EXTERN(int) git_refdb_compress(git_refdb *refdb); - -/** - * Close an open reference database. - * - * @param refdb reference database pointer or NULL - */ -GIT_EXTERN(void) git_refdb_free(git_refdb *refdb); - -/** @} */ -GIT_END_DECL - -#endif diff --git a/vendor/libgit2/include/git2/reflog.h b/vendor/libgit2/include/git2/reflog.h deleted file mode 100644 index c949a28f02..0000000000 --- a/vendor/libgit2/include/git2/reflog.h +++ /dev/null @@ -1,170 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_reflog_h__ -#define INCLUDE_git_reflog_h__ - -#include "common.h" -#include "types.h" -#include "oid.h" - -/** - * @file git2/reflog.h - * @brief Git reflog management routines - * @defgroup git_reflog Git reflog management routines - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** - * Read the reflog for the given reference - * - * If there is no reflog file for the given - * reference yet, an empty reflog object will - * be returned. - * - * The reflog must be freed manually by using - * git_reflog_free(). - * - * @param out pointer to reflog - * @param repo the repostiory - * @param name reference to look up - * @return 0 or an error code - */ -GIT_EXTERN(int) git_reflog_read(git_reflog **out, git_repository *repo, const char *name); - -/** - * Write an existing in-memory reflog object back to disk - * using an atomic file lock. - * - * @param reflog an existing reflog object - * @return 0 or an error code - */ -GIT_EXTERN(int) git_reflog_write(git_reflog *reflog); - -/** - * Add a new entry to the in-memory reflog. - * - * `msg` is optional and can be NULL. - * - * @param reflog an existing reflog object - * @param id the OID the reference is now pointing to - * @param committer the signature of the committer - * @param msg the reflog message - * @return 0 or an error code - */ -GIT_EXTERN(int) git_reflog_append(git_reflog *reflog, const git_oid *id, const git_signature *committer, const char *msg); - -/** - * Rename a reflog - * - * The reflog to be renamed is expected to already exist - * - * The new name will be checked for validity. - * See `git_reference_create_symbolic()` for rules about valid names. - * - * @param repo the repository - * @param old_name the old name of the reference - * @param name the new name of the reference - * @return 0 on success, GIT_EINVALIDSPEC or an error code - */ -GIT_EXTERN(int) git_reflog_rename(git_repository *repo, const char *old_name, const char *name); - -/** - * Delete the reflog for the given reference - * - * @param repo the repository - * @param name the reflog to delete - * @return 0 or an error code - */ -GIT_EXTERN(int) git_reflog_delete(git_repository *repo, const char *name); - -/** - * Get the number of log entries in a reflog - * - * @param reflog the previously loaded reflog - * @return the number of log entries - */ -GIT_EXTERN(size_t) git_reflog_entrycount(git_reflog *reflog); - -/** - * Lookup an entry by its index - * - * Requesting the reflog entry with an index of 0 (zero) will - * return the most recently created entry. - * - * @param reflog a previously loaded reflog - * @param idx the position of the entry to lookup. Should be greater than or - * equal to 0 (zero) and less than `git_reflog_entrycount()`. - * @return the entry; NULL if not found - */ -GIT_EXTERN(const git_reflog_entry *) git_reflog_entry_byindex(const git_reflog *reflog, size_t idx); - -/** - * Remove an entry from the reflog by its index - * - * To ensure there's no gap in the log history, set `rewrite_previous_entry` - * param value to 1. When deleting entry `n`, member old_oid of entry `n-1` - * (if any) will be updated with the value of member new_oid of entry `n+1`. - * - * @param reflog a previously loaded reflog. - * - * @param idx the position of the entry to remove. Should be greater than or - * equal to 0 (zero) and less than `git_reflog_entrycount()`. - * - * @param rewrite_previous_entry 1 to rewrite the history; 0 otherwise. - * - * @return 0 on success, GIT_ENOTFOUND if the entry doesn't exist - * or an error code. - */ -GIT_EXTERN(int) git_reflog_drop( - git_reflog *reflog, - size_t idx, - int rewrite_previous_entry); - -/** - * Get the old oid - * - * @param entry a reflog entry - * @return the old oid - */ -GIT_EXTERN(const git_oid *) git_reflog_entry_id_old(const git_reflog_entry *entry); - -/** - * Get the new oid - * - * @param entry a reflog entry - * @return the new oid at this time - */ -GIT_EXTERN(const git_oid *) git_reflog_entry_id_new(const git_reflog_entry *entry); - -/** - * Get the committer of this entry - * - * @param entry a reflog entry - * @return the committer - */ -GIT_EXTERN(const git_signature *) git_reflog_entry_committer(const git_reflog_entry *entry); - -/** - * Get the log message - * - * @param entry a reflog entry - * @return the log msg - */ -GIT_EXTERN(const char *) git_reflog_entry_message(const git_reflog_entry *entry); - -/** - * Free the reflog - * - * @param reflog reflog to free - */ -GIT_EXTERN(void) git_reflog_free(git_reflog *reflog); - -/** @} */ -GIT_END_DECL -#endif diff --git a/vendor/libgit2/include/git2/refs.h b/vendor/libgit2/include/git2/refs.h deleted file mode 100644 index db84ed03a4..0000000000 --- a/vendor/libgit2/include/git2/refs.h +++ /dev/null @@ -1,735 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_refs_h__ -#define INCLUDE_git_refs_h__ - -#include "common.h" -#include "types.h" -#include "oid.h" -#include "strarray.h" - -/** - * @file git2/refs.h - * @brief Git reference management routines - * @defgroup git_reference Git reference management routines - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** - * Lookup a reference by name in a repository. - * - * The returned reference must be freed by the user. - * - * The name will be checked for validity. - * See `git_reference_symbolic_create()` for rules about valid names. - * - * @param out pointer to the looked-up reference - * @param repo the repository to look up the reference - * @param name the long name for the reference (e.g. HEAD, refs/heads/master, refs/tags/v0.1.0, ...) - * @return 0 on success, GIT_ENOTFOUND, GIT_EINVALIDSPEC or an error code. - */ -GIT_EXTERN(int) git_reference_lookup(git_reference **out, git_repository *repo, const char *name); - -/** - * Lookup a reference by name and resolve immediately to OID. - * - * This function provides a quick way to resolve a reference name straight - * through to the object id that it refers to. This avoids having to - * allocate or free any `git_reference` objects for simple situations. - * - * The name will be checked for validity. - * See `git_reference_symbolic_create()` for rules about valid names. - * - * @param out Pointer to oid to be filled in - * @param repo The repository in which to look up the reference - * @param name The long name for the reference (e.g. HEAD, refs/heads/master, refs/tags/v0.1.0, ...) - * @return 0 on success, GIT_ENOTFOUND, GIT_EINVALIDSPEC or an error code. - */ -GIT_EXTERN(int) git_reference_name_to_id( - git_oid *out, git_repository *repo, const char *name); - -/** - * Lookup a reference by DWIMing its short name - * - * Apply the git precendence rules to the given shorthand to determine - * which reference the user is referring to. - * - * @param out pointer in which to store the reference - * @param repo the repository in which to look - * @param shorthand the short name for the reference - * @return 0 or an error code - */ -GIT_EXTERN(int) git_reference_dwim(git_reference **out, git_repository *repo, const char *shorthand); - -/** - * Conditionally create a new symbolic reference. - * - * A symbolic reference is a reference name that refers to another - * reference name. If the other name moves, the symbolic name will move, - * too. As a simple example, the "HEAD" reference might refer to - * "refs/heads/master" while on the "master" branch of a repository. - * - * The symbolic reference will be created in the repository and written to - * the disk. The generated reference object must be freed by the user. - * - * Valid reference names must follow one of two patterns: - * - * 1. Top-level names must contain only capital letters and underscores, - * and must begin and end with a letter. (e.g. "HEAD", "ORIG_HEAD"). - * 2. Names prefixed with "refs/" can be almost anything. You must avoid - * the characters '~', '^', ':', '\\', '?', '[', and '*', and the - * sequences ".." and "@{" which have special meaning to revparse. - * - * This function will return an error if a reference already exists with the - * given name unless `force` is true, in which case it will be overwritten. - * - * The message for the reflog will be ignored if the reference does - * not belong in the standard set (HEAD, branches and remote-tracking - * branches) and it does not have a reflog. - * - * It will return GIT_EMODIFIED if the reference's value at the time - * of updating does not match the one passed through `current_value` - * (i.e. if the ref has changed since the user read it). - * - * @param out Pointer to the newly created reference - * @param repo Repository where that reference will live - * @param name The name of the reference - * @param target The target of the reference - * @param force Overwrite existing references - * @param current_value The expected value of the reference when updating - * @param log_message The one line long message to be appended to the reflog - * @return 0 on success, GIT_EEXISTS, GIT_EINVALIDSPEC, GIT_EMODIFIED or an error code - */ -GIT_EXTERN(int) git_reference_symbolic_create_matching(git_reference **out, git_repository *repo, const char *name, const char *target, int force, const char *current_value, const char *log_message); - -/** - * Create a new symbolic reference. - * - * A symbolic reference is a reference name that refers to another - * reference name. If the other name moves, the symbolic name will move, - * too. As a simple example, the "HEAD" reference might refer to - * "refs/heads/master" while on the "master" branch of a repository. - * - * The symbolic reference will be created in the repository and written to - * the disk. The generated reference object must be freed by the user. - * - * Valid reference names must follow one of two patterns: - * - * 1. Top-level names must contain only capital letters and underscores, - * and must begin and end with a letter. (e.g. "HEAD", "ORIG_HEAD"). - * 2. Names prefixed with "refs/" can be almost anything. You must avoid - * the characters '~', '^', ':', '\\', '?', '[', and '*', and the - * sequences ".." and "@{" which have special meaning to revparse. - * - * This function will return an error if a reference already exists with the - * given name unless `force` is true, in which case it will be overwritten. - * - * The message for the reflog will be ignored if the reference does - * not belong in the standard set (HEAD, branches and remote-tracking - * branches) and it does not have a reflog. - * - * @param out Pointer to the newly created reference - * @param repo Repository where that reference will live - * @param name The name of the reference - * @param target The target of the reference - * @param force Overwrite existing references - * @param log_message The one line long message to be appended to the reflog - * @return 0 on success, GIT_EEXISTS, GIT_EINVALIDSPEC or an error code - */ -GIT_EXTERN(int) git_reference_symbolic_create(git_reference **out, git_repository *repo, const char *name, const char *target, int force, const char *log_message); - -/** - * Create a new direct reference. - * - * A direct reference (also called an object id reference) refers directly - * to a specific object id (a.k.a. OID or SHA) in the repository. The id - * permanently refers to the object (although the reference itself can be - * moved). For example, in libgit2 the direct ref "refs/tags/v0.17.0" - * refers to OID 5b9fac39d8a76b9139667c26a63e6b3f204b3977. - * - * The direct reference will be created in the repository and written to - * the disk. The generated reference object must be freed by the user. - * - * Valid reference names must follow one of two patterns: - * - * 1. Top-level names must contain only capital letters and underscores, - * and must begin and end with a letter. (e.g. "HEAD", "ORIG_HEAD"). - * 2. Names prefixed with "refs/" can be almost anything. You must avoid - * the characters '~', '^', ':', '\\', '?', '[', and '*', and the - * sequences ".." and "@{" which have special meaning to revparse. - * - * This function will return an error if a reference already exists with the - * given name unless `force` is true, in which case it will be overwritten. - * - * The message for the reflog will be ignored if the reference does - * not belong in the standard set (HEAD, branches and remote-tracking - * branches) and and it does not have a reflog. - * - * @param out Pointer to the newly created reference - * @param repo Repository where that reference will live - * @param name The name of the reference - * @param id The object id pointed to by the reference. - * @param force Overwrite existing references - * @param log_message The one line long message to be appended to the reflog - * @return 0 on success, GIT_EEXISTS, GIT_EINVALIDSPEC or an error code - */ -GIT_EXTERN(int) git_reference_create(git_reference **out, git_repository *repo, const char *name, const git_oid *id, int force, const char *log_message); - -/** - * Conditionally create new direct reference - * - * A direct reference (also called an object id reference) refers directly - * to a specific object id (a.k.a. OID or SHA) in the repository. The id - * permanently refers to the object (although the reference itself can be - * moved). For example, in libgit2 the direct ref "refs/tags/v0.17.0" - * refers to OID 5b9fac39d8a76b9139667c26a63e6b3f204b3977. - * - * The direct reference will be created in the repository and written to - * the disk. The generated reference object must be freed by the user. - * - * Valid reference names must follow one of two patterns: - * - * 1. Top-level names must contain only capital letters and underscores, - * and must begin and end with a letter. (e.g. "HEAD", "ORIG_HEAD"). - * 2. Names prefixed with "refs/" can be almost anything. You must avoid - * the characters '~', '^', ':', '\\', '?', '[', and '*', and the - * sequences ".." and "@{" which have special meaning to revparse. - * - * This function will return an error if a reference already exists with the - * given name unless `force` is true, in which case it will be overwritten. - * - * The message for the reflog will be ignored if the reference does - * not belong in the standard set (HEAD, branches and remote-tracking - * branches) and and it does not have a reflog. - * - * It will return GIT_EMODIFIED if the reference's value at the time - * of updating does not match the one passed through `current_id` - * (i.e. if the ref has changed since the user read it). - * - * @param out Pointer to the newly created reference - * @param repo Repository where that reference will live - * @param name The name of the reference - * @param id The object id pointed to by the reference. - * @param force Overwrite existing references - * @param current_id The expected value of the reference at the time of update - * @param log_message The one line long message to be appended to the reflog - * @return 0 on success, GIT_EMODIFIED if the value of the reference - * has changed, GIT_EEXISTS, GIT_EINVALIDSPEC or an error code - */ -GIT_EXTERN(int) git_reference_create_matching(git_reference **out, git_repository *repo, const char *name, const git_oid *id, int force, const git_oid *current_id, const char *log_message); - -/** - * Get the OID pointed to by a direct reference. - * - * Only available if the reference is direct (i.e. an object id reference, - * not a symbolic one). - * - * To find the OID of a symbolic ref, call `git_reference_resolve()` and - * then this function (or maybe use `git_reference_name_to_id()` to - * directly resolve a reference name all the way through to an OID). - * - * @param ref The reference - * @return a pointer to the oid if available, NULL otherwise - */ -GIT_EXTERN(const git_oid *) git_reference_target(const git_reference *ref); - -/** - * Return the peeled OID target of this reference. - * - * This peeled OID only applies to direct references that point to - * a hard Tag object: it is the result of peeling such Tag. - * - * @param ref The reference - * @return a pointer to the oid if available, NULL otherwise - */ -GIT_EXTERN(const git_oid *) git_reference_target_peel(const git_reference *ref); - -/** - * Get full name to the reference pointed to by a symbolic reference. - * - * Only available if the reference is symbolic. - * - * @param ref The reference - * @return a pointer to the name if available, NULL otherwise - */ -GIT_EXTERN(const char *) git_reference_symbolic_target(const git_reference *ref); - -/** - * Get the type of a reference. - * - * Either direct (GIT_REF_OID) or symbolic (GIT_REF_SYMBOLIC) - * - * @param ref The reference - * @return the type - */ -GIT_EXTERN(git_ref_t) git_reference_type(const git_reference *ref); - -/** - * Get the full name of a reference. - * - * See `git_reference_symbolic_create()` for rules about valid names. - * - * @param ref The reference - * @return the full name for the ref - */ -GIT_EXTERN(const char *) git_reference_name(const git_reference *ref); - -/** - * Resolve a symbolic reference to a direct reference. - * - * This method iteratively peels a symbolic reference until it resolves to - * a direct reference to an OID. - * - * The peeled reference is returned in the `resolved_ref` argument, and - * must be freed manually once it's no longer needed. - * - * If a direct reference is passed as an argument, a copy of that - * reference is returned. This copy must be manually freed too. - * - * @param out Pointer to the peeled reference - * @param ref The reference - * @return 0 or an error code - */ -GIT_EXTERN(int) git_reference_resolve(git_reference **out, const git_reference *ref); - -/** - * Get the repository where a reference resides. - * - * @param ref The reference - * @return a pointer to the repo - */ -GIT_EXTERN(git_repository *) git_reference_owner(const git_reference *ref); - -/** - * Create a new reference with the same name as the given reference but a - * different symbolic target. The reference must be a symbolic reference, - * otherwise this will fail. - * - * The new reference will be written to disk, overwriting the given reference. - * - * The target name will be checked for validity. - * See `git_reference_symbolic_create()` for rules about valid names. - * - * The message for the reflog will be ignored if the reference does - * not belong in the standard set (HEAD, branches and remote-tracking - * branches) and and it does not have a reflog. - * - * @param out Pointer to the newly created reference - * @param ref The reference - * @param target The new target for the reference - * @param log_message The one line long message to be appended to the reflog - * @return 0 on success, GIT_EINVALIDSPEC or an error code - */ -GIT_EXTERN(int) git_reference_symbolic_set_target( - git_reference **out, - git_reference *ref, - const char *target, - const char *log_message); - -/** - * Conditionally create a new reference with the same name as the given reference but a - * different OID target. The reference must be a direct reference, otherwise - * this will fail. - * - * The new reference will be written to disk, overwriting the given reference. - * - * @param out Pointer to the newly created reference - * @param ref The reference - * @param id The new target OID for the reference - * @param log_message The one line long message to be appended to the reflog - * @return 0 on success, GIT_EMODIFIED if the value of the reference - * has changed since it was read, or an error code - */ -GIT_EXTERN(int) git_reference_set_target( - git_reference **out, - git_reference *ref, - const git_oid *id, - const char *log_message); - -/** - * Rename an existing reference. - * - * This method works for both direct and symbolic references. - * - * The new name will be checked for validity. - * See `git_reference_symbolic_create()` for rules about valid names. - * - * If the `force` flag is not enabled, and there's already - * a reference with the given name, the renaming will fail. - * - * IMPORTANT: - * The user needs to write a proper reflog entry if the - * reflog is enabled for the repository. We only rename - * the reflog if it exists. - * - * @param ref The reference to rename - * @param new_name The new name for the reference - * @param force Overwrite an existing reference - * @param log_message The one line long message to be appended to the reflog - * @return 0 on success, GIT_EINVALIDSPEC, GIT_EEXISTS or an error code - * - */ -GIT_EXTERN(int) git_reference_rename( - git_reference **new_ref, - git_reference *ref, - const char *new_name, - int force, - const char *log_message); - -/** - * Delete an existing reference. - * - * This method works for both direct and symbolic references. The reference - * will be immediately removed on disk but the memory will not be freed. - * Callers must call `git_reference_free`. - * - * This function will return an error if the reference has changed - * from the time it was looked up. - * - * @param ref The reference to remove - * @return 0, GIT_EMODIFIED or an error code - */ -GIT_EXTERN(int) git_reference_delete(git_reference *ref); - -/** - * Delete an existing reference by name - * - * This method removes the named reference from the repository without - * looking at its old value. - * - * @param name The reference to remove - * @return 0 or an error code - */ -GIT_EXTERN(int) git_reference_remove(git_repository *repo, const char *name); - -/** - * Fill a list with all the references that can be found in a repository. - * - * The string array will be filled with the names of all references; these - * values are owned by the user and should be free'd manually when no - * longer needed, using `git_strarray_free()`. - * - * @param array Pointer to a git_strarray structure where - * the reference names will be stored - * @param repo Repository where to find the refs - * @return 0 or an error code - */ -GIT_EXTERN(int) git_reference_list(git_strarray *array, git_repository *repo); - -typedef int (*git_reference_foreach_cb)(git_reference *reference, void *payload); -typedef int (*git_reference_foreach_name_cb)(const char *name, void *payload); - -/** - * Perform a callback on each reference in the repository. - * - * The `callback` function will be called for each reference in the - * repository, receiving the reference object and the `payload` value - * passed to this method. Returning a non-zero value from the callback - * will terminate the iteration. - * - * @param repo Repository where to find the refs - * @param callback Function which will be called for every listed ref - * @param payload Additional data to pass to the callback - * @return 0 on success, non-zero callback return value, or error code - */ -GIT_EXTERN(int) git_reference_foreach( - git_repository *repo, - git_reference_foreach_cb callback, - void *payload); - -/** - * Perform a callback on the fully-qualified name of each reference. - * - * The `callback` function will be called for each reference in the - * repository, receiving the name of the reference and the `payload` value - * passed to this method. Returning a non-zero value from the callback - * will terminate the iteration. - * - * @param repo Repository where to find the refs - * @param callback Function which will be called for every listed ref name - * @param payload Additional data to pass to the callback - * @return 0 on success, non-zero callback return value, or error code - */ -GIT_EXTERN(int) git_reference_foreach_name( - git_repository *repo, - git_reference_foreach_name_cb callback, - void *payload); - -/** - * Free the given reference. - * - * @param ref git_reference - */ -GIT_EXTERN(void) git_reference_free(git_reference *ref); - -/** - * Compare two references. - * - * @param ref1 The first git_reference - * @param ref2 The second git_reference - * @return 0 if the same, else a stable but meaningless ordering. - */ -GIT_EXTERN(int) git_reference_cmp( - const git_reference *ref1, - const git_reference *ref2); - -/** - * Create an iterator for the repo's references - * - * @param out pointer in which to store the iterator - * @param repo the repository - * @return 0 or an error code - */ -GIT_EXTERN(int) git_reference_iterator_new( - git_reference_iterator **out, - git_repository *repo); - -/** - * Create an iterator for the repo's references that match the - * specified glob - * - * @param out pointer in which to store the iterator - * @param repo the repository - * @param glob the glob to match against the reference names - * @return 0 or an error code - */ -GIT_EXTERN(int) git_reference_iterator_glob_new( - git_reference_iterator **out, - git_repository *repo, - const char *glob); - -/** - * Get the next reference - * - * @param out pointer in which to store the reference - * @param iter the iterator - * @return 0, GIT_ITEROVER if there are no more; or an error code - */ -GIT_EXTERN(int) git_reference_next(git_reference **out, git_reference_iterator *iter); - -/** - * Get the next reference's name - * - * This function is provided for convenience in case only the names - * are interesting as it avoids the allocation of the `git_reference` - * object which `git_reference_next()` needs. - * - * @param out pointer in which to store the string - * @param iter the iterator - * @return 0, GIT_ITEROVER if there are no more; or an error code - */ -GIT_EXTERN(int) git_reference_next_name(const char **out, git_reference_iterator *iter); - -/** - * Free the iterator and its associated resources - * - * @param iter the iterator to free - */ -GIT_EXTERN(void) git_reference_iterator_free(git_reference_iterator *iter); - -/** - * Perform a callback on each reference in the repository whose name - * matches the given pattern. - * - * This function acts like `git_reference_foreach()` with an additional - * pattern match being applied to the reference name before issuing the - * callback function. See that function for more information. - * - * The pattern is matched using fnmatch or "glob" style where a '*' matches - * any sequence of letters, a '?' matches any letter, and square brackets - * can be used to define character ranges (such as "[0-9]" for digits). - * - * @param repo Repository where to find the refs - * @param glob Pattern to match (fnmatch-style) against reference name. - * @param callback Function which will be called for every listed ref - * @param payload Additional data to pass to the callback - * @return 0 on success, GIT_EUSER on non-zero callback, or error code - */ -GIT_EXTERN(int) git_reference_foreach_glob( - git_repository *repo, - const char *glob, - git_reference_foreach_name_cb callback, - void *payload); - -/** - * Check if a reflog exists for the specified reference. - * - * @param repo the repository - * @param refname the reference's name - * @return 0 when no reflog can be found, 1 when it exists; - * otherwise an error code. - */ -GIT_EXTERN(int) git_reference_has_log(git_repository *repo, const char *refname); - -/** - * Ensure there is a reflog for a particular reference. - * - * Make sure that successive updates to the reference will append to - * its log. - * - * @param repo the repository - * @param refname the reference's name - * @return 0 or an error code. - */ -GIT_EXTERN(int) git_reference_ensure_log(git_repository *repo, const char *refname); - -/** - * Check if a reference is a local branch. - * - * @param ref A git reference - * - * @return 1 when the reference lives in the refs/heads - * namespace; 0 otherwise. - */ -GIT_EXTERN(int) git_reference_is_branch(const git_reference *ref); - -/** - * Check if a reference is a remote tracking branch - * - * @param ref A git reference - * - * @return 1 when the reference lives in the refs/remotes - * namespace; 0 otherwise. - */ -GIT_EXTERN(int) git_reference_is_remote(const git_reference *ref); - -/** - * Check if a reference is a tag - * - * @param ref A git reference - * - * @return 1 when the reference lives in the refs/tags - * namespace; 0 otherwise. - */ -GIT_EXTERN(int) git_reference_is_tag(const git_reference *ref); - -/** - * Check if a reference is a note - * - * @param ref A git reference - * - * @return 1 when the reference lives in the refs/notes - * namespace; 0 otherwise. - */ -GIT_EXTERN(int) git_reference_is_note(const git_reference *ref); - -/** - * Normalization options for reference lookup - */ -typedef enum { - /** - * No particular normalization. - */ - GIT_REF_FORMAT_NORMAL = 0u, - - /** - * Control whether one-level refnames are accepted - * (i.e., refnames that do not contain multiple /-separated - * components). Those are expected to be written only using - * uppercase letters and underscore (FETCH_HEAD, ...) - */ - GIT_REF_FORMAT_ALLOW_ONELEVEL = (1u << 0), - - /** - * Interpret the provided name as a reference pattern for a - * refspec (as used with remote repositories). If this option - * is enabled, the name is allowed to contain a single * () - * in place of a one full pathname component - * (e.g., foo//bar but not foo/bar). - */ - GIT_REF_FORMAT_REFSPEC_PATTERN = (1u << 1), - - /** - * Interpret the name as part of a refspec in shorthand form - * so the `ONELEVEL` naming rules aren't enforced and 'master' - * becomes a valid name. - */ - GIT_REF_FORMAT_REFSPEC_SHORTHAND = (1u << 2), -} git_reference_normalize_t; - -/** - * Normalize reference name and check validity. - * - * This will normalize the reference name by removing any leading slash - * '/' characters and collapsing runs of adjacent slashes between name - * components into a single slash. - * - * Once normalized, if the reference name is valid, it will be returned in - * the user allocated buffer. - * - * See `git_reference_symbolic_create()` for rules about valid names. - * - * @param buffer_out User allocated buffer to store normalized name - * @param buffer_size Size of buffer_out - * @param name Reference name to be checked. - * @param flags Flags to constrain name validation rules - see the - * GIT_REF_FORMAT constants above. - * @return 0 on success, GIT_EBUFS if buffer is too small, GIT_EINVALIDSPEC - * or an error code. - */ -GIT_EXTERN(int) git_reference_normalize_name( - char *buffer_out, - size_t buffer_size, - const char *name, - unsigned int flags); - -/** - * Recursively peel reference until object of the specified type is found. - * - * The retrieved `peeled` object is owned by the repository - * and should be closed with the `git_object_free` method. - * - * If you pass `GIT_OBJ_ANY` as the target type, then the object - * will be peeled until a non-tag object is met. - * - * @param out Pointer to the peeled git_object - * @param ref The reference to be processed - * @param type The type of the requested object (GIT_OBJ_COMMIT, - * GIT_OBJ_TAG, GIT_OBJ_TREE, GIT_OBJ_BLOB or GIT_OBJ_ANY). - * @return 0 on success, GIT_EAMBIGUOUS, GIT_ENOTFOUND or an error code - */ -GIT_EXTERN(int) git_reference_peel( - git_object **out, - git_reference *ref, - git_otype type); - -/** - * Ensure the reference name is well-formed. - * - * Valid reference names must follow one of two patterns: - * - * 1. Top-level names must contain only capital letters and underscores, - * and must begin and end with a letter. (e.g. "HEAD", "ORIG_HEAD"). - * 2. Names prefixed with "refs/" can be almost anything. You must avoid - * the characters '~', '^', ':', '\\', '?', '[', and '*', and the - * sequences ".." and "@{" which have special meaning to revparse. - * - * @param refname name to be checked. - * @return 1 if the reference name is acceptable; 0 if it isn't - */ -GIT_EXTERN(int) git_reference_is_valid_name(const char *refname); - -/** - * Get the reference's short name - * - * This will transform the reference name into a name "human-readable" - * version. If no shortname is appropriate, it will return the full - * name. - * - * The memory is owned by the reference and must not be freed. - * - * @param ref a reference - * @return the human-readable version of the name - */ -GIT_EXTERN(const char *) git_reference_shorthand(const git_reference *ref); - - -/** @} */ -GIT_END_DECL -#endif diff --git a/vendor/libgit2/include/git2/refspec.h b/vendor/libgit2/include/git2/refspec.h deleted file mode 100644 index 9acdc72d52..0000000000 --- a/vendor/libgit2/include/git2/refspec.h +++ /dev/null @@ -1,104 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_refspec_h__ -#define INCLUDE_git_refspec_h__ - -#include "common.h" -#include "types.h" -#include "net.h" -#include "buffer.h" - -/** - * @file git2/refspec.h - * @brief Git refspec attributes - * @defgroup git_refspec Git refspec attributes - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** - * Get the source specifier - * - * @param refspec the refspec - * @return the refspec's source specifier - */ -GIT_EXTERN(const char *) git_refspec_src(const git_refspec *refspec); - -/** - * Get the destination specifier - * - * @param refspec the refspec - * @return the refspec's destination specifier - */ -GIT_EXTERN(const char *) git_refspec_dst(const git_refspec *refspec); - -/** - * Get the refspec's string - * - * @param refspec the refspec - * @returns the refspec's original string - */ -GIT_EXTERN(const char *) git_refspec_string(const git_refspec *refspec); - -/** - * Get the force update setting - * - * @param refspec the refspec - * @return 1 if force update has been set, 0 otherwise - */ -GIT_EXTERN(int) git_refspec_force(const git_refspec *refspec); - -/** - * Get the refspec's direction. - * - * @param spec refspec - * @return GIT_DIRECTION_FETCH or GIT_DIRECTION_PUSH - */ -GIT_EXTERN(git_direction) git_refspec_direction(const git_refspec *spec); - -/** - * Check if a refspec's source descriptor matches a reference - * - * @param refspec the refspec - * @param refname the name of the reference to check - * @return 1 if the refspec matches, 0 otherwise - */ -GIT_EXTERN(int) git_refspec_src_matches(const git_refspec *refspec, const char *refname); - -/** - * Check if a refspec's destination descriptor matches a reference - * - * @param refspec the refspec - * @param refname the name of the reference to check - * @return 1 if the refspec matches, 0 otherwise - */ -GIT_EXTERN(int) git_refspec_dst_matches(const git_refspec *refspec, const char *refname); - -/** - * Transform a reference to its target following the refspec's rules - * - * @param out where to store the target name - * @param spec the refspec - * @param name the name of the reference to transform - * @return 0, GIT_EBUFS or another error - */ -GIT_EXTERN(int) git_refspec_transform(git_buf *out, const git_refspec *spec, const char *name); - -/** - * Transform a target reference to its source reference following the refspec's rules - * - * @param out where to store the source reference name - * @param spec the refspec - * @param name the name of the reference to transform - * @return 0, GIT_EBUFS or another error - */ -GIT_EXTERN(int) git_refspec_rtransform(git_buf *out, const git_refspec *spec, const char *name); - -GIT_END_DECL - -#endif diff --git a/vendor/libgit2/include/git2/remote.h b/vendor/libgit2/include/git2/remote.h deleted file mode 100644 index 444fe5276d..0000000000 --- a/vendor/libgit2/include/git2/remote.h +++ /dev/null @@ -1,800 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_remote_h__ -#define INCLUDE_git_remote_h__ - -#include "common.h" -#include "repository.h" -#include "refspec.h" -#include "net.h" -#include "indexer.h" -#include "strarray.h" -#include "transport.h" -#include "pack.h" - -/** - * @file git2/remote.h - * @brief Git remote management functions - * @defgroup git_remote remote management functions - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -typedef int (*git_remote_rename_problem_cb)(const char *problematic_refspec, void *payload); - -/** - * Add a remote with the default fetch refspec to the repository's configuration. - * - * @param out the resulting remote - * @param repo the repository in which to create the remote - * @param name the remote's name - * @param url the remote's url - * @return 0, GIT_EINVALIDSPEC, GIT_EEXISTS or an error code - */ -GIT_EXTERN(int) git_remote_create( - git_remote **out, - git_repository *repo, - const char *name, - const char *url); - -/** - * Add a remote with the provided fetch refspec (or default if NULL) to the repository's - * configuration. - * - * @param out the resulting remote - * @param repo the repository in which to create the remote - * @param name the remote's name - * @param url the remote's url - * @param fetch the remote fetch value - * @return 0, GIT_EINVALIDSPEC, GIT_EEXISTS or an error code - */ -GIT_EXTERN(int) git_remote_create_with_fetchspec( - git_remote **out, - git_repository *repo, - const char *name, - const char *url, - const char *fetch); - -/** - * Create an anonymous remote - * - * Create a remote with the given url in-memory. You can use this when - * you have a URL instead of a remote's name. - * - * @param out pointer to the new remote objects - * @param repo the associated repository - * @param url the remote repository's URL - * @return 0 or an error code - */ -GIT_EXTERN(int) git_remote_create_anonymous( - git_remote **out, - git_repository *repo, - const char *url); - -/** - * Get the information for a particular remote - * - * The name will be checked for validity. - * See `git_tag_create()` for rules about valid names. - * - * @param out pointer to the new remote object - * @param repo the associated repository - * @param name the remote's name - * @return 0, GIT_ENOTFOUND, GIT_EINVALIDSPEC or an error code - */ -GIT_EXTERN(int) git_remote_lookup(git_remote **out, git_repository *repo, const char *name); - -/** - * Create a copy of an existing remote. All internal strings are also - * duplicated. Callbacks are not duplicated. - * - * Call `git_remote_free` to free the data. - * - * @param dest pointer where to store the copy - * @param source object to copy - * @return 0 or an error code - */ -GIT_EXTERN(int) git_remote_dup(git_remote **dest, git_remote *source); - -/** - * Get the remote's repository - * - * @param remote the remote - * @return a pointer to the repository - */ -GIT_EXTERN(git_repository *) git_remote_owner(const git_remote *remote); - -/** - * Get the remote's name - * - * @param remote the remote - * @return a pointer to the name or NULL for in-memory remotes - */ -GIT_EXTERN(const char *) git_remote_name(const git_remote *remote); - -/** - * Get the remote's url - * - * If url.*.insteadOf has been configured for this URL, it will - * return the modified URL. - * - * @param remote the remote - * @return a pointer to the url - */ -GIT_EXTERN(const char *) git_remote_url(const git_remote *remote); - -/** - * Get the remote's url for pushing - * - * If url.*.pushInsteadOf has been configured for this URL, it - * will return the modified URL. - * - * @param remote the remote - * @return a pointer to the url or NULL if no special url for pushing is set - */ -GIT_EXTERN(const char *) git_remote_pushurl(const git_remote *remote); - -/** - * Set the remote's url in the configuration - * - * Remote objects already in memory will not be affected. This assumes - * the common case of a single-url remote and will otherwise return an error. - * - * @param repo the repository in which to perform the change - * @param remote the remote's name - * @param url the url to set - * @return 0 or an error value - */ -GIT_EXTERN(int) git_remote_set_url(git_repository *repo, const char *remote, const char* url); - -/** - * Set the remote's url for pushing in the configuration. - * - * Remote objects already in memory will not be affected. This assumes - * the common case of a single-url remote and will otherwise return an error. - * - * - * @param repo the repository in which to perform the change - * @param remote the remote's name - * @param url the url to set - */ -GIT_EXTERN(int) git_remote_set_pushurl(git_repository *repo, const char *remote, const char* url); - -/** - * Add a fetch refspec to the remote's configuration - * - * Add the given refspec to the fetch list in the configuration. No - * loaded remote instances will be affected. - * - * @param repo the repository in which to change the configuration - * @param remote the name of the remote to change - * @param refspec the new fetch refspec - * @return 0, GIT_EINVALIDSPEC if refspec is invalid or an error value - */ -GIT_EXTERN(int) git_remote_add_fetch(git_repository *repo, const char *remote, const char *refspec); - -/** - * Get the remote's list of fetch refspecs - * - * The memory is owned by the user and should be freed with - * `git_strarray_free`. - * - * @param array pointer to the array in which to store the strings - * @param remote the remote to query - */ -GIT_EXTERN(int) git_remote_get_fetch_refspecs(git_strarray *array, const git_remote *remote); - -/** - * Add a push refspec to the remote's configuration - * - * Add the given refspec to the push list in the configuration. No - * loaded remote instances will be affected. - * - * @param repo the repository in which to change the configuration - * @param remote the name of the remote to change - * @param refspec the new push refspec - * @return 0, GIT_EINVALIDSPEC if refspec is invalid or an error value - */ -GIT_EXTERN(int) git_remote_add_push(git_repository *repo, const char *remote, const char *refspec); - -/** - * Get the remote's list of push refspecs - * - * The memory is owned by the user and should be freed with - * `git_strarray_free`. - * - * @param array pointer to the array in which to store the strings - * @param remote the remote to query - */ -GIT_EXTERN(int) git_remote_get_push_refspecs(git_strarray *array, const git_remote *remote); - -/** - * Get the number of refspecs for a remote - * - * @param remote the remote - * @return the amount of refspecs configured in this remote - */ -GIT_EXTERN(size_t) git_remote_refspec_count(const git_remote *remote); - -/** - * Get a refspec from the remote - * - * @param remote the remote to query - * @param n the refspec to get - * @return the nth refspec - */ -GIT_EXTERN(const git_refspec *)git_remote_get_refspec(const git_remote *remote, size_t n); - -/** - * Open a connection to a remote - * - * The transport is selected based on the URL. The direction argument - * is due to a limitation of the git protocol (over TCP or SSH) which - * starts up a specific binary which can only do the one or the other. - * - * @param remote the remote to connect to - * @param direction GIT_DIRECTION_FETCH if you want to fetch or - * GIT_DIRECTION_PUSH if you want to push - * @param callbacks the callbacks to use for this connection - * @return 0 or an error code - */ -GIT_EXTERN(int) git_remote_connect(git_remote *remote, git_direction direction, const git_remote_callbacks *callbacks); - -/** - * Get the remote repository's reference advertisement list - * - * Get the list of references with which the server responds to a new - * connection. - * - * The remote (or more exactly its transport) must have connected to - * the remote repository. This list is available as soon as the - * connection to the remote is initiated and it remains available - * after disconnecting. - * - * The memory belongs to the remote. The pointer will be valid as long - * as a new connection is not initiated, but it is recommended that - * you make a copy in order to make use of the data. - * - * @param out pointer to the array - * @param size the number of remote heads - * @param remote the remote - * @return 0 on success, or an error code - */ -GIT_EXTERN(int) git_remote_ls(const git_remote_head ***out, size_t *size, git_remote *remote); - -/** - * Check whether the remote is connected - * - * Check whether the remote's underlying transport is connected to the - * remote host. - * - * @param remote the remote - * @return 1 if it's connected, 0 otherwise. - */ -GIT_EXTERN(int) git_remote_connected(const git_remote *remote); - -/** - * Cancel the operation - * - * At certain points in its operation, the network code checks whether - * the operation has been cancelled and if so stops the operation. - * - * @param remote the remote - */ -GIT_EXTERN(void) git_remote_stop(git_remote *remote); - -/** - * Disconnect from the remote - * - * Close the connection to the remote. - * - * @param remote the remote to disconnect from - */ -GIT_EXTERN(void) git_remote_disconnect(git_remote *remote); - -/** - * Free the memory associated with a remote - * - * This also disconnects from the remote, if the connection - * has not been closed yet (using git_remote_disconnect). - * - * @param remote the remote to free - */ -GIT_EXTERN(void) git_remote_free(git_remote *remote); - -/** - * Get a list of the configured remotes for a repo - * - * The string array must be freed by the user. - * - * @param out a string array which receives the names of the remotes - * @param repo the repository to query - * @return 0 or an error code - */ -GIT_EXTERN(int) git_remote_list(git_strarray *out, git_repository *repo); - -/** - * Argument to the completion callback which tells it which operation - * finished. - */ -typedef enum git_remote_completion_type { - GIT_REMOTE_COMPLETION_DOWNLOAD, - GIT_REMOTE_COMPLETION_INDEXING, - GIT_REMOTE_COMPLETION_ERROR, -} git_remote_completion_type; - -/** Push network progress notification function */ -typedef int (*git_push_transfer_progress)( - unsigned int current, - unsigned int total, - size_t bytes, - void* payload); -/** - * Represents an update which will be performed on the remote during push - */ -typedef struct { - /** - * The source name of the reference - */ - char *src_refname; - /** - * The name of the reference to update on the server - */ - char *dst_refname; - /** - * The current target of the reference - */ - git_oid src; - /** - * The new target for the reference - */ - git_oid dst; -} git_push_update; - -/** - * @param updates an array containing the updates which will be sent - * as commands to the destination. - * @param len number of elements in `updates` - * @param payload Payload provided by the caller - */ -typedef int (*git_push_negotiation)(const git_push_update **updates, size_t len, void *payload); - -/** - * The callback settings structure - * - * Set the callbacks to be called by the remote when informing the user - * about the progress of the network operations. - */ -struct git_remote_callbacks { - unsigned int version; - /** - * Textual progress from the remote. Text send over the - * progress side-band will be passed to this function (this is - * the 'counting objects' output. - */ - git_transport_message_cb sideband_progress; - - /** - * Completion is called when different parts of the download - * process are done (currently unused). - */ - int (*completion)(git_remote_completion_type type, void *data); - - /** - * This will be called if the remote host requires - * authentication in order to connect to it. - * - * Returning GIT_PASSTHROUGH will make libgit2 behave as - * though this field isn't set. - */ - git_cred_acquire_cb credentials; - - /** - * If cert verification fails, this will be called to let the - * user make the final decision of whether to allow the - * connection to proceed. Returns 1 to allow the connection, 0 - * to disallow it or a negative value to indicate an error. - */ - git_transport_certificate_check_cb certificate_check; - - /** - * During the download of new data, this will be regularly - * called with the current count of progress done by the - * indexer. - */ - git_transfer_progress_cb transfer_progress; - - /** - * Each time a reference is updated locally, this function - * will be called with information about it. - */ - int (*update_tips)(const char *refname, const git_oid *a, const git_oid *b, void *data); - - /** - * Function to call with progress information during pack - * building. Be aware that this is called inline with pack - * building operations, so performance may be affected. - */ - git_packbuilder_progress pack_progress; - - /** - * Function to call with progress information during the - * upload portion of a push. Be aware that this is called - * inline with pack building operations, so performance may be - * affected. - */ - git_push_transfer_progress push_transfer_progress; - - /** - * Called for each updated reference on push. If `status` is - * not `NULL`, the update was rejected by the remote server - * and `status` contains the reason given. - */ - int (*push_update_reference)(const char *refname, const char *status, void *data); - - /** - * Called once between the negotiation step and the upload. It - * provides information about what updates will be performed. - */ - git_push_negotiation push_negotiation; - - /** - * Create the transport to use for this operation. Leave NULL - * to auto-detect. - */ - git_transport_cb transport; - - /** - * This will be passed to each of the callbacks in this struct - * as the last parameter. - */ - void *payload; -}; - -#define GIT_REMOTE_CALLBACKS_VERSION 1 -#define GIT_REMOTE_CALLBACKS_INIT {GIT_REMOTE_CALLBACKS_VERSION} - -/** - * Initializes a `git_remote_callbacks` with default values. Equivalent to - * creating an instance with GIT_REMOTE_CALLBACKS_INIT. - * - * @param opts the `git_remote_callbacks` struct to initialize - * @param version Version of struct; pass `GIT_REMOTE_CALLBACKS_VERSION` - * @return Zero on success; -1 on failure. - */ -GIT_EXTERN(int) git_remote_init_callbacks( - git_remote_callbacks *opts, - unsigned int version); - -typedef enum { - /** - * Use the setting from the configuration - */ - GIT_FETCH_PRUNE_UNSPECIFIED, - /** - * Force pruning on - */ - GIT_FETCH_PRUNE, - /** - * Force pruning off - */ - GIT_FETCH_NO_PRUNE, -} git_fetch_prune_t; - -/** - * Automatic tag following option - * - * Lets us select the --tags option to use. - */ -typedef enum { - /** - * Use the setting from the configuration. - */ - GIT_REMOTE_DOWNLOAD_TAGS_UNSPECIFIED = 0, - /** - * Ask the server for tags pointing to objects we're already - * downloading. - */ - GIT_REMOTE_DOWNLOAD_TAGS_AUTO, - /** - * Don't ask for any tags beyond the refspecs. - */ - GIT_REMOTE_DOWNLOAD_TAGS_NONE, - /** - * Ask for the all the tags. - */ - GIT_REMOTE_DOWNLOAD_TAGS_ALL, -} git_remote_autotag_option_t; - -/** - * Fetch options structure. - * - * Zero out for defaults. Initialize with `GIT_FETCH_OPTIONS_INIT` macro to - * correctly set the `version` field. E.g. - * - * git_fetch_options opts = GIT_FETCH_OPTIONS_INIT; - */ -typedef struct { - int version; - - /** - * Callbacks to use for this fetch operation - */ - git_remote_callbacks callbacks; - - /** - * Whether to perform a prune after the fetch - */ - git_fetch_prune_t prune; - - /** - * Whether to write the results to FETCH_HEAD. Defaults to - * on. Leave this default in order to behave like git. - */ - int update_fetchhead; - - /** - * Determines how to behave regarding tags on the remote, such - * as auto-downloading tags for objects we're downloading or - * downloading all of them. - * - * The default is to auto-follow tags. - */ - git_remote_autotag_option_t download_tags; -} git_fetch_options; - -#define GIT_FETCH_OPTIONS_VERSION 1 -#define GIT_FETCH_OPTIONS_INIT { GIT_FETCH_OPTIONS_VERSION, GIT_REMOTE_CALLBACKS_INIT, GIT_FETCH_PRUNE_UNSPECIFIED, 1 } - -/** - * Initializes a `git_fetch_options` with default values. Equivalent to - * creating an instance with GIT_FETCH_OPTIONS_INIT. - * - * @param opts the `git_push_options` instance to initialize. - * @param version the version of the struct; you should pass - * `GIT_FETCH_OPTIONS_VERSION` here. - * @return Zero on success; -1 on failure. - */ -GIT_EXTERN(int) git_fetch_init_options( - git_fetch_options *opts, - unsigned int version); - - -/** - * Controls the behavior of a git_push object. - */ -typedef struct { - unsigned int version; - - /** - * If the transport being used to push to the remote requires the creation - * of a pack file, this controls the number of worker threads used by - * the packbuilder when creating that pack file to be sent to the remote. - * - * If set to 0, the packbuilder will auto-detect the number of threads - * to create. The default value is 1. - */ - unsigned int pb_parallelism; - - /** - * Callbacks to use for this push operation - */ - git_remote_callbacks callbacks; -} git_push_options; - -#define GIT_PUSH_OPTIONS_VERSION 1 -#define GIT_PUSH_OPTIONS_INIT { GIT_PUSH_OPTIONS_VERSION, 0, GIT_REMOTE_CALLBACKS_INIT } - -/** - * Initializes a `git_push_options` with default values. Equivalent to - * creating an instance with GIT_PUSH_OPTIONS_INIT. - * - * @param opts the `git_push_options` instance to initialize. - * @param version the version of the struct; you should pass - * `GIT_PUSH_OPTIONS_VERSION` here. - * @return Zero on success; -1 on failure. - */ -GIT_EXTERN(int) git_push_init_options( - git_push_options *opts, - unsigned int version); - -/** - * Download and index the packfile - * - * Connect to the remote if it hasn't been done yet, negotiate with - * the remote git which objects are missing, download and index the - * packfile. - * - * The .idx file will be created and both it and the packfile with be - * renamed to their final name. - * - * @param remote the remote - * @param refspecs the refspecs to use for this negotiation and - * download. Use NULL or an empty array to use the base refspecs - * @param opts the options to use for this fetch - * @return 0 or an error code - */ - GIT_EXTERN(int) git_remote_download(git_remote *remote, const git_strarray *refspecs, const git_fetch_options *opts); - -/** - * Create a packfile and send it to the server - * - * Connect to the remote if it hasn't been done yet, negotiate with - * the remote git which objects are missing, create a packfile with the missing objects and send it. - * - * @param remote the remote - * @param refspecs the refspecs to use for this negotiation and - * upload. Use NULL or an empty array to use the base refspecs - * @param opts the options to use for this push - * @return 0 or an error code - */ -GIT_EXTERN(int) git_remote_upload(git_remote *remote, const git_strarray *refspecs, const git_push_options *opts); - -/** - * Update the tips to the new state - * - * @param remote the remote to update - * @param reflog_message The message to insert into the reflogs. If - * NULL and fetching, the default is "fetch ", where is - * the name of the remote (or its url, for in-memory remotes). This - * parameter is ignored when pushing. - * @param callbacks pointer to the callback structure to use - * @param update_fetchhead whether to write to FETCH_HEAD. Pass 1 to behave like git. - * @param download_tags what the behaviour for downloading tags is for this fetch. This is - * ignored for push. This must be the same value passed to `git_remote_download()`. - * @return 0 or an error code - */ -GIT_EXTERN(int) git_remote_update_tips( - git_remote *remote, - const git_remote_callbacks *callbacks, - int update_fetchhead, - git_remote_autotag_option_t download_tags, - const char *reflog_message); - -/** - * Download new data and update tips - * - * Convenience function to connect to a remote, download the data, - * disconnect and update the remote-tracking branches. - * - * @param remote the remote to fetch from - * @param refspecs the refspecs to use for this fetch. Pass NULL or an - * empty array to use the base refspecs. - * @param opts options to use for this fetch - * @param reflog_message The message to insert into the reflogs. If NULL, the - * default is "fetch" - * @return 0 or an error code - */ -GIT_EXTERN(int) git_remote_fetch( - git_remote *remote, - const git_strarray *refspecs, - const git_fetch_options *opts, - const char *reflog_message); - -/** - * Prune tracking refs that are no longer present on remote - * - * @param remote the remote to prune - * @param callbacks callbacks to use for this prune - * @return 0 or an error code - */ -GIT_EXTERN(int) git_remote_prune(git_remote *remote, const git_remote_callbacks *callbacks); - -/** - * Perform a push - * - * Peform all the steps from a push. - * - * @param remote the remote to push to - * @param refspecs the refspecs to use for pushing. If none are - * passed, the configured refspecs will be used - * @param opts options to use for this push - */ -GIT_EXTERN(int) git_remote_push(git_remote *remote, - const git_strarray *refspecs, - const git_push_options *opts); - -/** - * Get the statistics structure that is filled in by the fetch operation. - */ -GIT_EXTERN(const git_transfer_progress *) git_remote_stats(git_remote *remote); - -/** - * Retrieve the tag auto-follow setting - * - * @param remote the remote to query - * @return the auto-follow setting - */ -GIT_EXTERN(git_remote_autotag_option_t) git_remote_autotag(const git_remote *remote); - -/** - * Set the remote's tag following setting. - * - * The change will be made in the configuration. No loaded remotes - * will be affected. - * - * @param repo the repository in which to make the change - * @param remote the name of the remote - * @param value the new value to take. - */ -GIT_EXTERN(int) git_remote_set_autotag(git_repository *repo, const char *remote, git_remote_autotag_option_t value); -/** - * Retrieve the ref-prune setting - * - * @param remote the remote to query - * @return the ref-prune setting - */ -GIT_EXTERN(int) git_remote_prune_refs(const git_remote *remote); - -/** - * Give the remote a new name - * - * All remote-tracking branches and configuration settings - * for the remote are updated. - * - * The new name will be checked for validity. - * See `git_tag_create()` for rules about valid names. - * - * No loaded instances of a the remote with the old name will change - * their name or their list of refspecs. - * - * @param problems non-default refspecs cannot be renamed and will be - * stored here for further processing by the caller. Always free this - * strarray on successful return. - * @param repo the repository in which to rename - * @param name the current name of the remote - * @param new_name the new name the remote should bear - * @return 0, GIT_EINVALIDSPEC, GIT_EEXISTS or an error code - */ -GIT_EXTERN(int) git_remote_rename( - git_strarray *problems, - git_repository *repo, - const char *name, - const char *new_name); - -/** - * Ensure the remote name is well-formed. - * - * @param remote_name name to be checked. - * @return 1 if the reference name is acceptable; 0 if it isn't - */ -GIT_EXTERN(int) git_remote_is_valid_name(const char *remote_name); - -/** -* Delete an existing persisted remote. -* -* All remote-tracking branches and configuration settings -* for the remote will be removed. -* -* @param repo the repository in which to act -* @param name the name of the remove to delete -* @return 0 on success, or an error code. -*/ -GIT_EXTERN(int) git_remote_delete(git_repository *repo, const char *name); - -/** - * Retrieve the name of the remote's default branch - * - * The default branch of a repository is the branch which HEAD points - * to. If the remote does not support reporting this information - * directly, it performs the guess as git does; that is, if there are - * multiple branches which point to the same commit, the first one is - * chosen. If the master branch is a candidate, it wins. - * - * This function must only be called after connecting. - * - * @param out the buffern in which to store the reference name - * @param remote the remote - * @return 0, GIT_ENOTFOUND if the remote does not have any references - * or none of them point to HEAD's commit, or an error message. - */ -GIT_EXTERN(int) git_remote_default_branch(git_buf *out, git_remote *remote); - -/** @} */ -GIT_END_DECL -#endif diff --git a/vendor/libgit2/include/git2/repository.h b/vendor/libgit2/include/git2/repository.h deleted file mode 100644 index cf268ef85b..0000000000 --- a/vendor/libgit2/include/git2/repository.h +++ /dev/null @@ -1,754 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_repository_h__ -#define INCLUDE_git_repository_h__ - -#include "common.h" -#include "types.h" -#include "oid.h" -#include "buffer.h" - -/** - * @file git2/repository.h - * @brief Git repository management routines - * @defgroup git_repository Git repository management routines - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** - * Open a git repository. - * - * The 'path' argument must point to either a git repository - * folder, or an existing work dir. - * - * The method will automatically detect if 'path' is a normal - * or bare repository or fail is 'path' is neither. - * - * @param out pointer to the repo which will be opened - * @param path the path to the repository - * @return 0 or an error code - */ -GIT_EXTERN(int) git_repository_open(git_repository **out, const char *path); - -/** - * Create a "fake" repository to wrap an object database - * - * Create a repository object to wrap an object database to be used - * with the API when all you have is an object database. This doesn't - * have any paths associated with it, so use with care. - * - * @param out pointer to the repo - * @param odb the object database to wrap - * @return 0 or an error code - */ -GIT_EXTERN(int) git_repository_wrap_odb(git_repository **out, git_odb *odb); - -/** - * Look for a git repository and copy its path in the given buffer. - * The lookup start from base_path and walk across parent directories - * if nothing has been found. The lookup ends when the first repository - * is found, or when reaching a directory referenced in ceiling_dirs - * or when the filesystem changes (in case across_fs is true). - * - * The method will automatically detect if the repository is bare - * (if there is a repository). - * - * @param out A pointer to a user-allocated git_buf which will contain - * the found path. - * - * @param start_path The base path where the lookup starts. - * - * @param across_fs If true, then the lookup will not stop when a - * filesystem device change is detected while exploring parent directories. - * - * @param ceiling_dirs A GIT_PATH_LIST_SEPARATOR separated list of - * absolute symbolic link free paths. The lookup will stop when any - * of this paths is reached. Note that the lookup always performs on - * start_path no matter start_path appears in ceiling_dirs ceiling_dirs - * might be NULL (which is equivalent to an empty string) - * - * @return 0 or an error code - */ -GIT_EXTERN(int) git_repository_discover( - git_buf *out, - const char *start_path, - int across_fs, - const char *ceiling_dirs); - -/** - * Option flags for `git_repository_open_ext`. - * - * * GIT_REPOSITORY_OPEN_NO_SEARCH - Only open the repository if it can be - * immediately found in the start_path. Do not walk up from the - * start_path looking at parent directories. - * * GIT_REPOSITORY_OPEN_CROSS_FS - Unless this flag is set, open will not - * continue searching across filesystem boundaries (i.e. when `st_dev` - * changes from the `stat` system call). (E.g. Searching in a user's home - * directory "/home/user/source/" will not return "/.git/" as the found - * repo if "/" is a different filesystem than "/home".) - * * GIT_REPOSITORY_OPEN_BARE - Open repository as a bare repo regardless - * of core.bare config, and defer loading config file for faster setup. - * Unlike `git_repository_open_bare`, this can follow gitlinks. - */ -typedef enum { - GIT_REPOSITORY_OPEN_NO_SEARCH = (1 << 0), - GIT_REPOSITORY_OPEN_CROSS_FS = (1 << 1), - GIT_REPOSITORY_OPEN_BARE = (1 << 2), -} git_repository_open_flag_t; - -/** - * Find and open a repository with extended controls. - * - * @param out Pointer to the repo which will be opened. This can - * actually be NULL if you only want to use the error code to - * see if a repo at this path could be opened. - * @param path Path to open as git repository. If the flags - * permit "searching", then this can be a path to a subdirectory - * inside the working directory of the repository. - * @param flags A combination of the GIT_REPOSITORY_OPEN flags above. - * @param ceiling_dirs A GIT_PATH_LIST_SEPARATOR delimited list of path - * prefixes at which the search for a containing repository should - * terminate. - * @return 0 on success, GIT_ENOTFOUND if no repository could be found, - * or -1 if there was a repository but open failed for some reason - * (such as repo corruption or system errors). - */ -GIT_EXTERN(int) git_repository_open_ext( - git_repository **out, - const char *path, - unsigned int flags, - const char *ceiling_dirs); - -/** - * Open a bare repository on the serverside. - * - * This is a fast open for bare repositories that will come in handy - * if you're e.g. hosting git repositories and need to access them - * efficiently - * - * @param out Pointer to the repo which will be opened. - * @param bare_path Direct path to the bare repository - * @return 0 on success, or an error code - */ -GIT_EXTERN(int) git_repository_open_bare(git_repository **out, const char *bare_path); - -/** - * Free a previously allocated repository - * - * Note that after a repository is free'd, all the objects it has spawned - * will still exist until they are manually closed by the user - * with `git_object_free`, but accessing any of the attributes of - * an object without a backing repository will result in undefined - * behavior - * - * @param repo repository handle to close. If NULL nothing occurs. - */ -GIT_EXTERN(void) git_repository_free(git_repository *repo); - -/** - * Creates a new Git repository in the given folder. - * - * TODO: - * - Reinit the repository - * - * @param out pointer to the repo which will be created or reinitialized - * @param path the path to the repository - * @param is_bare if true, a Git repository without a working directory is - * created at the pointed path. If false, provided path will be - * considered as the working directory into which the .git directory - * will be created. - * - * @return 0 or an error code - */ -GIT_EXTERN(int) git_repository_init( - git_repository **out, - const char *path, - unsigned is_bare); - -/** - * Option flags for `git_repository_init_ext`. - * - * These flags configure extra behaviors to `git_repository_init_ext`. - * In every case, the default behavior is the zero value (i.e. flag is - * not set). Just OR the flag values together for the `flags` parameter - * when initializing a new repo. Details of individual values are: - * - * * BARE - Create a bare repository with no working directory. - * * NO_REINIT - Return an GIT_EEXISTS error if the repo_path appears to - * already be an git repository. - * * NO_DOTGIT_DIR - Normally a "/.git/" will be appended to the repo - * path for non-bare repos (if it is not already there), but - * passing this flag prevents that behavior. - * * MKDIR - Make the repo_path (and workdir_path) as needed. Init is - * always willing to create the ".git" directory even without this - * flag. This flag tells init to create the trailing component of - * the repo and workdir paths as needed. - * * MKPATH - Recursively make all components of the repo and workdir - * paths as necessary. - * * EXTERNAL_TEMPLATE - libgit2 normally uses internal templates to - * initialize a new repo. This flags enables external templates, - * looking the "template_path" from the options if set, or the - * `init.templatedir` global config if not, or falling back on - * "/usr/share/git-core/templates" if it exists. - * * GIT_REPOSITORY_INIT_RELATIVE_GITLINK - If an alternate workdir is - * specified, use relative paths for the gitdir and core.worktree. - */ -typedef enum { - GIT_REPOSITORY_INIT_BARE = (1u << 0), - GIT_REPOSITORY_INIT_NO_REINIT = (1u << 1), - GIT_REPOSITORY_INIT_NO_DOTGIT_DIR = (1u << 2), - GIT_REPOSITORY_INIT_MKDIR = (1u << 3), - GIT_REPOSITORY_INIT_MKPATH = (1u << 4), - GIT_REPOSITORY_INIT_EXTERNAL_TEMPLATE = (1u << 5), - GIT_REPOSITORY_INIT_RELATIVE_GITLINK = (1u << 6), -} git_repository_init_flag_t; - -/** - * Mode options for `git_repository_init_ext`. - * - * Set the mode field of the `git_repository_init_options` structure - * either to the custom mode that you would like, or to one of the - * following modes: - * - * * SHARED_UMASK - Use permissions configured by umask - the default. - * * SHARED_GROUP - Use "--shared=group" behavior, chmod'ing the new repo - * to be group writable and "g+sx" for sticky group assignment. - * * SHARED_ALL - Use "--shared=all" behavior, adding world readability. - * * Anything else - Set to custom value. - */ -typedef enum { - GIT_REPOSITORY_INIT_SHARED_UMASK = 0, - GIT_REPOSITORY_INIT_SHARED_GROUP = 0002775, - GIT_REPOSITORY_INIT_SHARED_ALL = 0002777, -} git_repository_init_mode_t; - -/** - * Extended options structure for `git_repository_init_ext`. - * - * This contains extra options for `git_repository_init_ext` that enable - * additional initialization features. The fields are: - * - * * flags - Combination of GIT_REPOSITORY_INIT flags above. - * * mode - Set to one of the standard GIT_REPOSITORY_INIT_SHARED_... - * constants above, or to a custom value that you would like. - * * workdir_path - The path to the working dir or NULL for default (i.e. - * repo_path parent on non-bare repos). IF THIS IS RELATIVE PATH, - * IT WILL BE EVALUATED RELATIVE TO THE REPO_PATH. If this is not - * the "natural" working directory, a .git gitlink file will be - * created here linking to the repo_path. - * * description - If set, this will be used to initialize the "description" - * file in the repository, instead of using the template content. - * * template_path - When GIT_REPOSITORY_INIT_EXTERNAL_TEMPLATE is set, - * this contains the path to use for the template directory. If - * this is NULL, the config or default directory options will be - * used instead. - * * initial_head - The name of the head to point HEAD at. If NULL, then - * this will be treated as "master" and the HEAD ref will be set - * to "refs/heads/master". If this begins with "refs/" it will be - * used verbatim; otherwise "refs/heads/" will be prefixed. - * * origin_url - If this is non-NULL, then after the rest of the - * repository initialization is completed, an "origin" remote - * will be added pointing to this URL. - */ -typedef struct { - unsigned int version; - uint32_t flags; - uint32_t mode; - const char *workdir_path; - const char *description; - const char *template_path; - const char *initial_head; - const char *origin_url; -} git_repository_init_options; - -#define GIT_REPOSITORY_INIT_OPTIONS_VERSION 1 -#define GIT_REPOSITORY_INIT_OPTIONS_INIT {GIT_REPOSITORY_INIT_OPTIONS_VERSION} - -/** - * Initializes a `git_repository_init_options` with default values. Equivalent - * to creating an instance with GIT_REPOSITORY_INIT_OPTIONS_INIT. - * - * @param opts the `git_repository_init_options` struct to initialize - * @param version Version of struct; pass `GIT_REPOSITORY_INIT_OPTIONS_VERSION` - * @return Zero on success; -1 on failure. - */ -GIT_EXTERN(int) git_repository_init_init_options( - git_repository_init_options *opts, - unsigned int version); - -/** - * Create a new Git repository in the given folder with extended controls. - * - * This will initialize a new git repository (creating the repo_path - * if requested by flags) and working directory as needed. It will - * auto-detect the case sensitivity of the file system and if the - * file system supports file mode bits correctly. - * - * @param out Pointer to the repo which will be created or reinitialized. - * @param repo_path The path to the repository. - * @param opts Pointer to git_repository_init_options struct. - * @return 0 or an error code on failure. - */ -GIT_EXTERN(int) git_repository_init_ext( - git_repository **out, - const char *repo_path, - git_repository_init_options *opts); - -/** - * Retrieve and resolve the reference pointed at by HEAD. - * - * The returned `git_reference` will be owned by caller and - * `git_reference_free()` must be called when done with it to release the - * allocated memory and prevent a leak. - * - * @param out pointer to the reference which will be retrieved - * @param repo a repository object - * - * @return 0 on success, GIT_EUNBORNBRANCH when HEAD points to a non existing - * branch, GIT_ENOTFOUND when HEAD is missing; an error code otherwise - */ -GIT_EXTERN(int) git_repository_head(git_reference **out, git_repository *repo); - -/** - * Check if a repository's HEAD is detached - * - * A repository's HEAD is detached when it points directly to a commit - * instead of a branch. - * - * @param repo Repo to test - * @return 1 if HEAD is detached, 0 if it's not; error code if there - * was an error. - */ -GIT_EXTERN(int) git_repository_head_detached(git_repository *repo); - -/** - * Check if the current branch is unborn - * - * An unborn branch is one named from HEAD but which doesn't exist in - * the refs namespace, because it doesn't have any commit to point to. - * - * @param repo Repo to test - * @return 1 if the current branch is unborn, 0 if it's not; error - * code if there was an error - */ -GIT_EXTERN(int) git_repository_head_unborn(git_repository *repo); - -/** - * Check if a repository is empty - * - * An empty repository has just been initialized and contains no references - * apart from HEAD, which must be pointing to the unborn master branch. - * - * @param repo Repo to test - * @return 1 if the repository is empty, 0 if it isn't, error code - * if the repository is corrupted - */ -GIT_EXTERN(int) git_repository_is_empty(git_repository *repo); - -/** - * Get the path of this repository - * - * This is the path of the `.git` folder for normal repositories, - * or of the repository itself for bare repositories. - * - * @param repo A repository object - * @return the path to the repository - */ -GIT_EXTERN(const char *) git_repository_path(git_repository *repo); - -/** - * Get the path of the working directory for this repository - * - * If the repository is bare, this function will always return - * NULL. - * - * @param repo A repository object - * @return the path to the working dir, if it exists - */ -GIT_EXTERN(const char *) git_repository_workdir(git_repository *repo); - -/** - * Set the path to the working directory for this repository - * - * The working directory doesn't need to be the same one - * that contains the `.git` folder for this repository. - * - * If this repository is bare, setting its working directory - * will turn it into a normal repository, capable of performing - * all the common workdir operations (checkout, status, index - * manipulation, etc). - * - * @param repo A repository object - * @param workdir The path to a working directory - * @param update_gitlink Create/update gitlink in workdir and set config - * "core.worktree" (if workdir is not the parent of the .git directory) - * @return 0, or an error code - */ -GIT_EXTERN(int) git_repository_set_workdir( - git_repository *repo, const char *workdir, int update_gitlink); - -/** - * Check if a repository is bare - * - * @param repo Repo to test - * @return 1 if the repository is bare, 0 otherwise. - */ -GIT_EXTERN(int) git_repository_is_bare(git_repository *repo); - -/** - * Get the configuration file for this repository. - * - * If a configuration file has not been set, the default - * config set for the repository will be returned, including - * global and system configurations (if they are available). - * - * The configuration file must be freed once it's no longer - * being used by the user. - * - * @param out Pointer to store the loaded configuration - * @param repo A repository object - * @return 0, or an error code - */ -GIT_EXTERN(int) git_repository_config(git_config **out, git_repository *repo); - -/** - * Get a snapshot of the repository's configuration - * - * Convenience function to take a snapshot from the repository's - * configuration. The contents of this snapshot will not change, - * even if the underlying config files are modified. - * - * The configuration file must be freed once it's no longer - * being used by the user. - * - * @param out Pointer to store the loaded configuration - * @param repo the repository - * @return 0, or an error code - */ -GIT_EXTERN(int) git_repository_config_snapshot(git_config **out, git_repository *repo); - -/** - * Get the Object Database for this repository. - * - * If a custom ODB has not been set, the default - * database for the repository will be returned (the one - * located in `.git/objects`). - * - * The ODB must be freed once it's no longer being used by - * the user. - * - * @param out Pointer to store the loaded ODB - * @param repo A repository object - * @return 0, or an error code - */ -GIT_EXTERN(int) git_repository_odb(git_odb **out, git_repository *repo); - -/** - * Get the Reference Database Backend for this repository. - * - * If a custom refsdb has not been set, the default database for - * the repository will be returned (the one that manipulates loose - * and packed references in the `.git` directory). - * - * The refdb must be freed once it's no longer being used by - * the user. - * - * @param out Pointer to store the loaded refdb - * @param repo A repository object - * @return 0, or an error code - */ -GIT_EXTERN(int) git_repository_refdb(git_refdb **out, git_repository *repo); - -/** - * Get the Index file for this repository. - * - * If a custom index has not been set, the default - * index for the repository will be returned (the one - * located in `.git/index`). - * - * The index must be freed once it's no longer being used by - * the user. - * - * @param out Pointer to store the loaded index - * @param repo A repository object - * @return 0, or an error code - */ -GIT_EXTERN(int) git_repository_index(git_index **out, git_repository *repo); - -/** - * Retrieve git's prepared message - * - * Operations such as git revert/cherry-pick/merge with the -n option - * stop just short of creating a commit with the changes and save - * their prepared message in .git/MERGE_MSG so the next git-commit - * execution can present it to the user for them to amend if they - * wish. - * - * Use this function to get the contents of this file. Don't forget to - * remove the file after you create the commit. - * - * @param out git_buf to write data into - * @param repo Repository to read prepared message from - * @return 0, GIT_ENOTFOUND if no message exists or an error code - */ -GIT_EXTERN(int) git_repository_message(git_buf *out, git_repository *repo); - -/** - * Remove git's prepared message. - * - * Remove the message that `git_repository_message` retrieves. - */ -GIT_EXTERN(int) git_repository_message_remove(git_repository *repo); - -/** - * Remove all the metadata associated with an ongoing command like merge, - * revert, cherry-pick, etc. For example: MERGE_HEAD, MERGE_MSG, etc. - * - * @param repo A repository object - * @return 0 on success, or error - */ -GIT_EXTERN(int) git_repository_state_cleanup(git_repository *repo); - -typedef int (*git_repository_fetchhead_foreach_cb)(const char *ref_name, - const char *remote_url, - const git_oid *oid, - unsigned int is_merge, - void *payload); - -/** - * Invoke 'callback' for each entry in the given FETCH_HEAD file. - * - * Return a non-zero value from the callback to stop the loop. - * - * @param repo A repository object - * @param callback Callback function - * @param payload Pointer to callback data (optional) - * @return 0 on success, non-zero callback return value, GIT_ENOTFOUND if - * there is no FETCH_HEAD file, or other error code. - */ -GIT_EXTERN(int) git_repository_fetchhead_foreach( - git_repository *repo, - git_repository_fetchhead_foreach_cb callback, - void *payload); - -typedef int (*git_repository_mergehead_foreach_cb)(const git_oid *oid, - void *payload); - -/** - * If a merge is in progress, invoke 'callback' for each commit ID in the - * MERGE_HEAD file. - * - * Return a non-zero value from the callback to stop the loop. - * - * @param repo A repository object - * @param callback Callback function - * @param payload Pointer to callback data (optional) - * @return 0 on success, non-zero callback return value, GIT_ENOTFOUND if - * there is no MERGE_HEAD file, or other error code. - */ -GIT_EXTERN(int) git_repository_mergehead_foreach( - git_repository *repo, - git_repository_mergehead_foreach_cb callback, - void *payload); - -/** - * Calculate hash of file using repository filtering rules. - * - * If you simply want to calculate the hash of a file on disk with no filters, - * you can just use the `git_odb_hashfile()` API. However, if you want to - * hash a file in the repository and you want to apply filtering rules (e.g. - * crlf filters) before generating the SHA, then use this function. - * - * Note: if the repository has `core.safecrlf` set to fail and the - * filtering triggers that failure, then this function will return an - * error and not calculate the hash of the file. - * - * @param out Output value of calculated SHA - * @param repo Repository pointer - * @param path Path to file on disk whose contents should be hashed. If the - * repository is not NULL, this can be a relative path. - * @param type The object type to hash as (e.g. GIT_OBJ_BLOB) - * @param as_path The path to use to look up filtering rules. If this is - * NULL, then the `path` parameter will be used instead. If - * this is passed as the empty string, then no filters will be - * applied when calculating the hash. - * @return 0 on success, or an error code - */ -GIT_EXTERN(int) git_repository_hashfile( - git_oid *out, - git_repository *repo, - const char *path, - git_otype type, - const char *as_path); - -/** - * Make the repository HEAD point to the specified reference. - * - * If the provided reference points to a Tree or a Blob, the HEAD is - * unaltered and -1 is returned. - * - * If the provided reference points to a branch, the HEAD will point - * to that branch, staying attached, or become attached if it isn't yet. - * If the branch doesn't exist yet, no error will be return. The HEAD - * will then be attached to an unborn branch. - * - * Otherwise, the HEAD will be detached and will directly point to - * the Commit. - * - * @param repo Repository pointer - * @param refname Canonical name of the reference the HEAD should point at - * @return 0 on success, or an error code - */ -GIT_EXTERN(int) git_repository_set_head( - git_repository* repo, - const char* refname); - -/** - * Make the repository HEAD directly point to the Commit. - * - * If the provided committish cannot be found in the repository, the HEAD - * is unaltered and GIT_ENOTFOUND is returned. - * - * If the provided commitish cannot be peeled into a commit, the HEAD - * is unaltered and -1 is returned. - * - * Otherwise, the HEAD will eventually be detached and will directly point to - * the peeled Commit. - * - * @param repo Repository pointer - * @param commitish Object id of the Commit the HEAD should point to - * @return 0 on success, or an error code - */ -GIT_EXTERN(int) git_repository_set_head_detached( - git_repository* repo, - const git_oid* commitish); - -/** - * Make the repository HEAD directly point to the Commit. - * - * This behaves like `git_repository_set_head_detached()` but takes an - * annotated commit, which lets you specify which extended sha syntax - * string was specified by a user, allowing for more exact reflog - * messages. - * - * See the documentation for `git_repository_set_head_detached()`. - * - * @see git_repository_set_head_detached - */ -GIT_EXTERN(int) git_repository_set_head_detached_from_annotated( - git_repository *repo, - const git_annotated_commit *commitish); - -/** - * Detach the HEAD. - * - * If the HEAD is already detached and points to a Commit, 0 is returned. - * - * If the HEAD is already detached and points to a Tag, the HEAD is - * updated into making it point to the peeled Commit, and 0 is returned. - * - * If the HEAD is already detached and points to a non commitish, the HEAD is - * unaltered, and -1 is returned. - * - * Otherwise, the HEAD will be detached and point to the peeled Commit. - * - * @param repo Repository pointer - * @return 0 on success, GIT_EUNBORNBRANCH when HEAD points to a non existing - * branch or an error code - */ -GIT_EXTERN(int) git_repository_detach_head( - git_repository* repo); - -/** - * Repository state - * - * These values represent possible states for the repository to be in, - * based on the current operation which is ongoing. - */ -typedef enum { - GIT_REPOSITORY_STATE_NONE, - GIT_REPOSITORY_STATE_MERGE, - GIT_REPOSITORY_STATE_REVERT, - GIT_REPOSITORY_STATE_CHERRYPICK, - GIT_REPOSITORY_STATE_BISECT, - GIT_REPOSITORY_STATE_REBASE, - GIT_REPOSITORY_STATE_REBASE_INTERACTIVE, - GIT_REPOSITORY_STATE_REBASE_MERGE, - GIT_REPOSITORY_STATE_APPLY_MAILBOX, - GIT_REPOSITORY_STATE_APPLY_MAILBOX_OR_REBASE, -} git_repository_state_t; - -/** - * Determines the status of a git repository - ie, whether an operation - * (merge, cherry-pick, etc) is in progress. - * - * @param repo Repository pointer - * @return The state of the repository - */ -GIT_EXTERN(int) git_repository_state(git_repository *repo); - -/** - * Sets the active namespace for this Git Repository - * - * This namespace affects all reference operations for the repo. - * See `man gitnamespaces` - * - * @param repo The repo - * @param nmspace The namespace. This should not include the refs - * folder, e.g. to namespace all references under `refs/namespaces/foo/`, - * use `foo` as the namespace. - * @return 0 on success, -1 on error - */ -GIT_EXTERN(int) git_repository_set_namespace(git_repository *repo, const char *nmspace); - -/** - * Get the currently active namespace for this repository - * - * @param repo The repo - * @return the active namespace, or NULL if there isn't one - */ -GIT_EXTERN(const char *) git_repository_get_namespace(git_repository *repo); - - -/** - * Determine if the repository was a shallow clone - * - * @param repo The repository - * @return 1 if shallow, zero if not - */ -GIT_EXTERN(int) git_repository_is_shallow(git_repository *repo); - -/** - * Retrieve the configured identity to use for reflogs - * - * The memory is owned by the repository and must not be freed by the - * user. - * - * @param name where to store the pointer to the name - * @param email where to store the pointer to the email - * @param repo the repository - */ -GIT_EXTERN(int) git_repository_ident(const char **name, const char **email, const git_repository *repo); - -/** - * Set the identity to be used for writing reflogs - * - * If both are set, this name and email will be used to write to the - * reflog. Pass NULL to unset. When unset, the identity will be taken - * from the repository's configuration. - * - * @param repo the repository to configure - * @param name the name to use for the reflog entries - * @param email the email to use for the reflog entries - */ -GIT_EXTERN(int) git_repository_set_ident(git_repository *repo, const char *name, const char *email); - -/** @} */ -GIT_END_DECL -#endif diff --git a/vendor/libgit2/include/git2/reset.h b/vendor/libgit2/include/git2/reset.h deleted file mode 100644 index 79075291f3..0000000000 --- a/vendor/libgit2/include/git2/reset.h +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_reset_h__ -#define INCLUDE_git_reset_h__ - -#include "common.h" -#include "types.h" -#include "strarray.h" -#include "checkout.h" - -/** - * @file git2/reset.h - * @brief Git reset management routines - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** - * Kinds of reset operation - */ -typedef enum { - GIT_RESET_SOFT = 1, /**< Move the head to the given commit */ - GIT_RESET_MIXED = 2, /**< SOFT plus reset index to the commit */ - GIT_RESET_HARD = 3, /**< MIXED plus changes in working tree discarded */ -} git_reset_t; - -/** - * Sets the current head to the specified commit oid and optionally - * resets the index and working tree to match. - * - * SOFT reset means the Head will be moved to the commit. - * - * MIXED reset will trigger a SOFT reset, plus the index will be replaced - * with the content of the commit tree. - * - * HARD reset will trigger a MIXED reset and the working directory will be - * replaced with the content of the index. (Untracked and ignored files - * will be left alone, however.) - * - * TODO: Implement remaining kinds of resets. - * - * @param repo Repository where to perform the reset operation. - * - * @param target Committish to which the Head should be moved to. This object - * must belong to the given `repo` and can either be a git_commit or a - * git_tag. When a git_tag is being passed, it should be dereferencable - * to a git_commit which oid will be used as the target of the branch. - * - * @param reset_type Kind of reset operation to perform. - * - * @param checkout_opts Checkout options to be used for a HARD reset. - * The checkout_strategy field will be overridden (based on reset_type). - * This parameter can be used to propagate notify and progress callbacks. - * - * @return 0 on success or an error code - */ -GIT_EXTERN(int) git_reset( - git_repository *repo, - git_object *target, - git_reset_t reset_type, - const git_checkout_options *checkout_opts); - -/** - * Sets the current head to the specified commit oid and optionally - * resets the index and working tree to match. - * - * This behaves like `git_reset()` but takes an annotated commit, - * which lets you specify which extended sha syntax string was - * specified by a user, allowing for more exact reflog messages. - * - * See the documentation for `git_reset()`. - * - * @see git_reset - */ -GIT_EXTERN(int) git_reset_from_annotated( - git_repository *repo, - git_annotated_commit *commit, - git_reset_t reset_type, - const git_checkout_options *checkout_opts); - -/** - * Updates some entries in the index from the target commit tree. - * - * The scope of the updated entries is determined by the paths - * being passed in the `pathspec` parameters. - * - * Passing a NULL `target` will result in removing - * entries in the index matching the provided pathspecs. - * - * @param repo Repository where to perform the reset operation. - * - * @param target The committish which content will be used to reset the content - * of the index. - * - * @param pathspecs List of pathspecs to operate on. - * - * @return 0 on success or an error code < 0 - */ -GIT_EXTERN(int) git_reset_default( - git_repository *repo, - git_object *target, - git_strarray* pathspecs); - -/** @} */ -GIT_END_DECL -#endif diff --git a/vendor/libgit2/include/git2/revert.h b/vendor/libgit2/include/git2/revert.h deleted file mode 100644 index 2de1942197..0000000000 --- a/vendor/libgit2/include/git2/revert.h +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_revert_h__ -#define INCLUDE_git_revert_h__ - -#include "common.h" -#include "types.h" -#include "merge.h" - -/** - * @file git2/revert.h - * @brief Git revert routines - * @defgroup git_revert Git revert routines - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** - * Options for revert - */ -typedef struct { - unsigned int version; - - /** For merge commits, the "mainline" is treated as the parent. */ - unsigned int mainline; - - git_merge_options merge_opts; /**< Options for the merging */ - git_checkout_options checkout_opts; /**< Options for the checkout */ -} git_revert_options; - -#define GIT_REVERT_OPTIONS_VERSION 1 -#define GIT_REVERT_OPTIONS_INIT {GIT_REVERT_OPTIONS_VERSION, 0, GIT_MERGE_OPTIONS_INIT, GIT_CHECKOUT_OPTIONS_INIT} - -/** - * Initializes a `git_revert_options` with default values. Equivalent to - * creating an instance with GIT_REVERT_OPTIONS_INIT. - * - * @param opts the `git_revert_options` struct to initialize - * @param version Version of struct; pass `GIT_REVERT_OPTIONS_VERSION` - * @return Zero on success; -1 on failure. - */ -GIT_EXTERN(int) git_revert_init_options( - git_revert_options *opts, - unsigned int version); - -/** - * Reverts the given commit against the given "our" commit, producing an - * index that reflects the result of the revert. - * - * The returned index must be freed explicitly with `git_index_free`. - * - * @param out pointer to store the index result in - * @param repo the repository that contains the given commits - * @param revert_commit the commit to revert - * @param our_commit the commit to revert against (eg, HEAD) - * @param mainline the parent of the revert commit, if it is a merge - * @param merge_options the merge options (or null for defaults) - * @return zero on success, -1 on failure. - */ -GIT_EXTERN(int) git_revert_commit( - git_index **out, - git_repository *repo, - git_commit *revert_commit, - git_commit *our_commit, - unsigned int mainline, - const git_merge_options *merge_options); - -/** - * Reverts the given commit, producing changes in the index and working directory. - * - * @param repo the repository to revert - * @param commit the commit to revert - * @param given_opts merge flags - * @return zero on success, -1 on failure. - */ -GIT_EXTERN(int) git_revert( - git_repository *repo, - git_commit *commit, - const git_revert_options *given_opts); - -/** @} */ -GIT_END_DECL -#endif - diff --git a/vendor/libgit2/include/git2/revparse.h b/vendor/libgit2/include/git2/revparse.h deleted file mode 100644 index d170e16218..0000000000 --- a/vendor/libgit2/include/git2/revparse.h +++ /dev/null @@ -1,113 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_revparse_h__ -#define INCLUDE_git_revparse_h__ - -#include "common.h" -#include "types.h" - -/** - * @file git2/revparse.h - * @brief Git revision parsing routines - * @defgroup git_revparse Git revision parsing routines - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** - * Find a single object, as specified by a revision string. - * - * See `man gitrevisions`, or - * http://git-scm.com/docs/git-rev-parse.html#_specifying_revisions for - * information on the syntax accepted. - * - * The returned object should be released with `git_object_free` when no - * longer needed. - * - * @param out pointer to output object - * @param repo the repository to search in - * @param spec the textual specification for an object - * @return 0 on success, GIT_ENOTFOUND, GIT_EAMBIGUOUS, GIT_EINVALIDSPEC or an error code - */ -GIT_EXTERN(int) git_revparse_single( - git_object **out, git_repository *repo, const char *spec); - -/** - * Find a single object and intermediate reference by a revision string. - * - * See `man gitrevisions`, or - * http://git-scm.com/docs/git-rev-parse.html#_specifying_revisions for - * information on the syntax accepted. - * - * In some cases (`@{<-n>}` or `@{upstream}`), the expression may - * point to an intermediate reference. When such expressions are being passed - * in, `reference_out` will be valued as well. - * - * The returned object should be released with `git_object_free` and the - * returned reference with `git_reference_free` when no longer needed. - * - * @param object_out pointer to output object - * @param reference_out pointer to output reference or NULL - * @param repo the repository to search in - * @param spec the textual specification for an object - * @return 0 on success, GIT_ENOTFOUND, GIT_EAMBIGUOUS, GIT_EINVALIDSPEC - * or an error code - */ -GIT_EXTERN(int) git_revparse_ext( - git_object **object_out, - git_reference **reference_out, - git_repository *repo, - const char *spec); - -/** - * Revparse flags. These indicate the intended behavior of the spec passed to - * git_revparse. - */ -typedef enum { - /** The spec targeted a single object. */ - GIT_REVPARSE_SINGLE = 1 << 0, - /** The spec targeted a range of commits. */ - GIT_REVPARSE_RANGE = 1 << 1, - /** The spec used the '...' operator, which invokes special semantics. */ - GIT_REVPARSE_MERGE_BASE = 1 << 2, -} git_revparse_mode_t; - -/** - * Git Revision Spec: output of a `git_revparse` operation - */ -typedef struct { - /** The left element of the revspec; must be freed by the user */ - git_object *from; - /** The right element of the revspec; must be freed by the user */ - git_object *to; - /** The intent of the revspec (i.e. `git_revparse_mode_t` flags) */ - unsigned int flags; -} git_revspec; - -/** - * Parse a revision string for `from`, `to`, and intent. - * - * See `man gitrevisions` or - * http://git-scm.com/docs/git-rev-parse.html#_specifying_revisions for - * information on the syntax accepted. - * - * @param revspec Pointer to an user-allocated git_revspec struct where - * the result of the rev-parse will be stored - * @param repo the repository to search in - * @param spec the rev-parse spec to parse - * @return 0 on success, GIT_INVALIDSPEC, GIT_ENOTFOUND, GIT_EAMBIGUOUS or an error code - */ -GIT_EXTERN(int) git_revparse( - git_revspec *revspec, - git_repository *repo, - const char *spec); - - -/** @} */ -GIT_END_DECL -#endif diff --git a/vendor/libgit2/include/git2/revwalk.h b/vendor/libgit2/include/git2/revwalk.h deleted file mode 100644 index 2cc00536ec..0000000000 --- a/vendor/libgit2/include/git2/revwalk.h +++ /dev/null @@ -1,297 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_revwalk_h__ -#define INCLUDE_git_revwalk_h__ - -#include "common.h" -#include "types.h" -#include "oid.h" - -/** - * @file git2/revwalk.h - * @brief Git revision traversal routines - * @defgroup git_revwalk Git revision traversal routines - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** - * Flags to specify the sorting which a revwalk should perform. - */ -typedef enum { - /** - * Sort the repository contents in no particular ordering; - * this sorting is arbitrary, implementation-specific - * and subject to change at any time. - * This is the default sorting for new walkers. - */ - GIT_SORT_NONE = 0, - - /** - * Sort the repository contents in topological order - * (parents before children); this sorting mode - * can be combined with time sorting. - */ - GIT_SORT_TOPOLOGICAL = 1 << 0, - - /** - * Sort the repository contents by commit time; - * this sorting mode can be combined with - * topological sorting. - */ - GIT_SORT_TIME = 1 << 1, - - /** - * Iterate through the repository contents in reverse - * order; this sorting mode can be combined with - * any of the above. - */ - GIT_SORT_REVERSE = 1 << 2, -} git_sort_t; - -/** - * Allocate a new revision walker to iterate through a repo. - * - * This revision walker uses a custom memory pool and an internal - * commit cache, so it is relatively expensive to allocate. - * - * For maximum performance, this revision walker should be - * reused for different walks. - * - * This revision walker is *not* thread safe: it may only be - * used to walk a repository on a single thread; however, - * it is possible to have several revision walkers in - * several different threads walking the same repository. - * - * @param out pointer to the new revision walker - * @param repo the repo to walk through - * @return 0 or an error code - */ -GIT_EXTERN(int) git_revwalk_new(git_revwalk **out, git_repository *repo); - -/** - * Reset the revision walker for reuse. - * - * This will clear all the pushed and hidden commits, and - * leave the walker in a blank state (just like at - * creation) ready to receive new commit pushes and - * start a new walk. - * - * The revision walk is automatically reset when a walk - * is over. - * - * @param walker handle to reset. - */ -GIT_EXTERN(void) git_revwalk_reset(git_revwalk *walker); - -/** - * Add a new root for the traversal - * - * The pushed commit will be marked as one of the roots from which to - * start the walk. This commit may not be walked if it or a child is - * hidden. - * - * At least one commit must be pushed onto the walker before a walk - * can be started. - * - * The given id must belong to a committish on the walked - * repository. - * - * @param walk the walker being used for the traversal. - * @param id the oid of the commit to start from. - * @return 0 or an error code - */ -GIT_EXTERN(int) git_revwalk_push(git_revwalk *walk, const git_oid *id); - -/** - * Push matching references - * - * The OIDs pointed to by the references that match the given glob - * pattern will be pushed to the revision walker. - * - * A leading 'refs/' is implied if not present as well as a trailing - * '/\*' if the glob lacks '?', '\*' or '['. - * - * Any references matching this glob which do not point to a - * committish will be ignored. - * - * @param walk the walker being used for the traversal - * @param glob the glob pattern references should match - * @return 0 or an error code - */ -GIT_EXTERN(int) git_revwalk_push_glob(git_revwalk *walk, const char *glob); - -/** - * Push the repository's HEAD - * - * @param walk the walker being used for the traversal - * @return 0 or an error code - */ -GIT_EXTERN(int) git_revwalk_push_head(git_revwalk *walk); - -/** - * Mark a commit (and its ancestors) uninteresting for the output. - * - * The given id must belong to a committish on the walked - * repository. - * - * The resolved commit and all its parents will be hidden from the - * output on the revision walk. - * - * @param walk the walker being used for the traversal. - * @param commit_id the oid of commit that will be ignored during the traversal - * @return 0 or an error code - */ -GIT_EXTERN(int) git_revwalk_hide(git_revwalk *walk, const git_oid *commit_id); - -/** - * Hide matching references. - * - * The OIDs pointed to by the references that match the given glob - * pattern and their ancestors will be hidden from the output on the - * revision walk. - * - * A leading 'refs/' is implied if not present as well as a trailing - * '/\*' if the glob lacks '?', '\*' or '['. - * - * Any references matching this glob which do not point to a - * committish will be ignored. - * - * @param walk the walker being used for the traversal - * @param glob the glob pattern references should match - * @return 0 or an error code - */ -GIT_EXTERN(int) git_revwalk_hide_glob(git_revwalk *walk, const char *glob); - -/** - * Hide the repository's HEAD - * - * @param walk the walker being used for the traversal - * @return 0 or an error code - */ -GIT_EXTERN(int) git_revwalk_hide_head(git_revwalk *walk); - -/** - * Push the OID pointed to by a reference - * - * The reference must point to a committish. - * - * @param walk the walker being used for the traversal - * @param refname the reference to push - * @return 0 or an error code - */ -GIT_EXTERN(int) git_revwalk_push_ref(git_revwalk *walk, const char *refname); - -/** - * Hide the OID pointed to by a reference - * - * The reference must point to a committish. - * - * @param walk the walker being used for the traversal - * @param refname the reference to hide - * @return 0 or an error code - */ -GIT_EXTERN(int) git_revwalk_hide_ref(git_revwalk *walk, const char *refname); - -/** - * Get the next commit from the revision walk. - * - * The initial call to this method is *not* blocking when - * iterating through a repo with a time-sorting mode. - * - * Iterating with Topological or inverted modes makes the initial - * call blocking to preprocess the commit list, but this block should be - * mostly unnoticeable on most repositories (topological preprocessing - * times at 0.3s on the git.git repo). - * - * The revision walker is reset when the walk is over. - * - * @param out Pointer where to store the oid of the next commit - * @param walk the walker to pop the commit from. - * @return 0 if the next commit was found; - * GIT_ITEROVER if there are no commits left to iterate - */ -GIT_EXTERN(int) git_revwalk_next(git_oid *out, git_revwalk *walk); - -/** - * Change the sorting mode when iterating through the - * repository's contents. - * - * Changing the sorting mode resets the walker. - * - * @param walk the walker being used for the traversal. - * @param sort_mode combination of GIT_SORT_XXX flags - */ -GIT_EXTERN(void) git_revwalk_sorting(git_revwalk *walk, unsigned int sort_mode); - -/** - * Push and hide the respective endpoints of the given range. - * - * The range should be of the form - * .. - * where each is in the form accepted by 'git_revparse_single'. - * The left-hand commit will be hidden and the right-hand commit pushed. - * - * @param walk the walker being used for the traversal - * @param range the range - * @return 0 or an error code - * - */ -GIT_EXTERN(int) git_revwalk_push_range(git_revwalk *walk, const char *range); - -/** - * Simplify the history by first-parent - * - * No parents other than the first for each commit will be enqueued. - */ -GIT_EXTERN(void) git_revwalk_simplify_first_parent(git_revwalk *walk); - - -/** - * Free a revision walker previously allocated. - * - * @param walk traversal handle to close. If NULL nothing occurs. - */ -GIT_EXTERN(void) git_revwalk_free(git_revwalk *walk); - -/** - * Return the repository on which this walker - * is operating. - * - * @param walk the revision walker - * @return the repository being walked - */ -GIT_EXTERN(git_repository *) git_revwalk_repository(git_revwalk *walk); - -/** - * This is a callback function that user can provide to hide a - * commit and its parents. If the callback function returns non-zero value, - * then this commit and its parents will be hidden. - * - * @param commit_id oid of Commit - * @param payload User-specified pointer to data to be passed as data payload - */ -typedef int(*git_revwalk_hide_cb)( - const git_oid *commit_id, - void *payload); - -/** - * Adds a callback function to hide a commit and its parents - * - * @param walk the revision walker - * @param hide_cb callback function to hide a commit and its parents - * @param payload data payload to be passed to callback function - */ -GIT_EXTERN(int) git_revwalk_add_hide_cb( - git_revwalk *walk, - git_revwalk_hide_cb hide_cb, - void *payload); - -/** @} */ -GIT_END_DECL -#endif diff --git a/vendor/libgit2/include/git2/signature.h b/vendor/libgit2/include/git2/signature.h deleted file mode 100644 index feb1b40732..0000000000 --- a/vendor/libgit2/include/git2/signature.h +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_signature_h__ -#define INCLUDE_git_signature_h__ - -#include "common.h" -#include "types.h" - -/** - * @file git2/signature.h - * @brief Git signature creation - * @defgroup git_signature Git signature creation - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** - * Create a new action signature. - * - * Call `git_signature_free()` to free the data. - * - * Note: angle brackets ('<' and '>') characters are not allowed - * to be used in either the `name` or the `email` parameter. - * - * @param out new signature, in case of error NULL - * @param name name of the person - * @param email email of the person - * @param time time when the action happened - * @param offset timezone offset in minutes for the time - * @return 0 or an error code - */ -GIT_EXTERN(int) git_signature_new(git_signature **out, const char *name, const char *email, git_time_t time, int offset); - -/** - * Create a new action signature with a timestamp of 'now'. - * - * Call `git_signature_free()` to free the data. - * - * @param out new signature, in case of error NULL - * @param name name of the person - * @param email email of the person - * @return 0 or an error code - */ -GIT_EXTERN(int) git_signature_now(git_signature **out, const char *name, const char *email); - -/** - * Create a new action signature with default user and now timestamp. - * - * This looks up the user.name and user.email from the configuration and - * uses the current time as the timestamp, and creates a new signature - * based on that information. It will return GIT_ENOTFOUND if either the - * user.name or user.email are not set. - * - * @param out new signature - * @param repo repository pointer - * @return 0 on success, GIT_ENOTFOUND if config is missing, or error code - */ -GIT_EXTERN(int) git_signature_default(git_signature **out, git_repository *repo); - -/** - * Create a copy of an existing signature. All internal strings are also - * duplicated. - * - * Call `git_signature_free()` to free the data. - * - * @param dest pointer where to store the copy - * @param sig signature to duplicate - * @return 0 or an error code - */ -GIT_EXTERN(int) git_signature_dup(git_signature **dest, const git_signature *sig); - -/** - * Free an existing signature. - * - * Because the signature is not an opaque structure, it is legal to free it - * manually, but be sure to free the "name" and "email" strings in addition - * to the structure itself. - * - * @param sig signature to free - */ -GIT_EXTERN(void) git_signature_free(git_signature *sig); - -/** @} */ -GIT_END_DECL -#endif diff --git a/vendor/libgit2/include/git2/stash.h b/vendor/libgit2/include/git2/stash.h deleted file mode 100644 index 526db0ba25..0000000000 --- a/vendor/libgit2/include/git2/stash.h +++ /dev/null @@ -1,257 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_stash_h__ -#define INCLUDE_git_stash_h__ - -#include "common.h" -#include "types.h" - -/** - * @file git2/stash.h - * @brief Git stash management routines - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** - * Stash flags - */ -typedef enum { - /** - * No option, default - */ - GIT_STASH_DEFAULT = 0, - - /** - * All changes already added to the index are left intact in - * the working directory - */ - GIT_STASH_KEEP_INDEX = (1 << 0), - - /** - * All untracked files are also stashed and then cleaned up - * from the working directory - */ - GIT_STASH_INCLUDE_UNTRACKED = (1 << 1), - - /** - * All ignored files are also stashed and then cleaned up from - * the working directory - */ - GIT_STASH_INCLUDE_IGNORED = (1 << 2), -} git_stash_flags; - -/** - * Save the local modifications to a new stash. - * - * @param out Object id of the commit containing the stashed state. - * This commit is also the target of the direct reference refs/stash. - * - * @param repo The owning repository. - * - * @param stasher The identity of the person performing the stashing. - * - * @param message Optional description along with the stashed state. - * - * @param flags Flags to control the stashing process. (see GIT_STASH_* above) - * - * @return 0 on success, GIT_ENOTFOUND where there's nothing to stash, - * or error code. - */ -GIT_EXTERN(int) git_stash_save( - git_oid *out, - git_repository *repo, - const git_signature *stasher, - const char *message, - unsigned int flags); - -/** Stash application flags. */ -typedef enum { - GIT_STASH_APPLY_DEFAULT = 0, - - /* Try to reinstate not only the working tree's changes, - * but also the index's changes. - */ - GIT_STASH_APPLY_REINSTATE_INDEX = (1 << 0), -} git_stash_apply_flags; - -typedef enum { - GIT_STASH_APPLY_PROGRESS_NONE = 0, - - /** Loading the stashed data from the object database. */ - GIT_STASH_APPLY_PROGRESS_LOADING_STASH, - - /** The stored index is being analyzed. */ - GIT_STASH_APPLY_PROGRESS_ANALYZE_INDEX, - - /** The modified files are being analyzed. */ - GIT_STASH_APPLY_PROGRESS_ANALYZE_MODIFIED, - - /** The untracked and ignored files are being analyzed. */ - GIT_STASH_APPLY_PROGRESS_ANALYZE_UNTRACKED, - - /** The untracked files are being written to disk. */ - GIT_STASH_APPLY_PROGRESS_CHECKOUT_UNTRACKED, - - /** The modified files are being written to disk. */ - GIT_STASH_APPLY_PROGRESS_CHECKOUT_MODIFIED, - - /** The stash was applied successfully. */ - GIT_STASH_APPLY_PROGRESS_DONE, -} git_stash_apply_progress_t; - -/** - * Stash application progress notification function. - * Return 0 to continue processing, or a negative value to - * abort the stash application. - */ -typedef int (*git_stash_apply_progress_cb)( - git_stash_apply_progress_t progress, - void *payload); - -/** Stash application options structure. - * - * Initialize with the `GIT_STASH_APPLY_OPTIONS_INIT` macro to set - * sensible defaults; for example: - * - * git_stash_apply_options opts = GIT_STASH_APPLY_OPTIONS_INIT; - */ -typedef struct git_stash_apply_options { - unsigned int version; - - /** See `git_stash_apply_flags_t`, above. */ - git_stash_apply_flags flags; - - /** Options to use when writing files to the working directory. */ - git_checkout_options checkout_options; - - /** Optional callback to notify the consumer of application progress. */ - git_stash_apply_progress_cb progress_cb; - void *progress_payload; -} git_stash_apply_options; - -#define GIT_STASH_APPLY_OPTIONS_VERSION 1 -#define GIT_STASH_APPLY_OPTIONS_INIT { \ - GIT_STASH_APPLY_OPTIONS_VERSION, \ - GIT_STASH_APPLY_DEFAULT, \ - GIT_CHECKOUT_OPTIONS_INIT } - -/** - * Initializes a `git_stash_apply_options` with default values. Equivalent to - * creating an instance with GIT_STASH_APPLY_OPTIONS_INIT. - * - * @param opts the `git_stash_apply_options` instance to initialize. - * @param version the version of the struct; you should pass - * `GIT_STASH_APPLY_OPTIONS_INIT` here. - * @return Zero on success; -1 on failure. - */ -int git_stash_apply_init_options( - git_stash_apply_options *opts, unsigned int version); - -/** - * Apply a single stashed state from the stash list. - * - * If local changes in the working directory conflict with changes in the - * stash then GIT_EMERGECONFLICT will be returned. In this case, the index - * will always remain unmodified and all files in the working directory will - * remain unmodified. However, if you are restoring untracked files or - * ignored files and there is a conflict when applying the modified files, - * then those files will remain in the working directory. - * - * If passing the GIT_STASH_APPLY_REINSTATE_INDEX flag and there would be - * conflicts when reinstating the index, the function will return - * GIT_EMERGECONFLICT and both the working directory and index will be left - * unmodified. - * - * Note that a minimum checkout strategy of `GIT_CHECKOUT_SAFE` is implied. - * - * @param repo The owning repository. - * @param index The position within the stash list. 0 points to the - * most recent stashed state. - * @param options Options to control how stashes are applied. - * - * @return 0 on success, GIT_ENOTFOUND if there's no stashed state for the - * given index, GIT_EMERGECONFLICT if changes exist in the working - * directory, or an error code - */ -GIT_EXTERN(int) git_stash_apply( - git_repository *repo, - size_t index, - const git_stash_apply_options *options); - -/** - * This is a callback function you can provide to iterate over all the - * stashed states that will be invoked per entry. - * - * @param index The position within the stash list. 0 points to the - * most recent stashed state. - * @param message The stash message. - * @param stash_id The commit oid of the stashed state. - * @param payload Extra parameter to callback function. - * @return 0 to continue iterating or non-zero to stop. - */ -typedef int (*git_stash_cb)( - size_t index, - const char* message, - const git_oid *stash_id, - void *payload); - -/** - * Loop over all the stashed states and issue a callback for each one. - * - * If the callback returns a non-zero value, this will stop looping. - * - * @param repo Repository where to find the stash. - * - * @param callback Callback to invoke per found stashed state. The most - * recent stash state will be enumerated first. - * - * @param payload Extra parameter to callback function. - * - * @return 0 on success, non-zero callback return value, or error code. - */ -GIT_EXTERN(int) git_stash_foreach( - git_repository *repo, - git_stash_cb callback, - void *payload); - -/** - * Remove a single stashed state from the stash list. - * - * @param repo The owning repository. - * - * @param index The position within the stash list. 0 points to the - * most recent stashed state. - * - * @return 0 on success, GIT_ENOTFOUND if there's no stashed state for the given - * index, or error code. - */ -GIT_EXTERN(int) git_stash_drop( - git_repository *repo, - size_t index); - -/** - * Apply a single stashed state from the stash list and remove it from the list - * if successful. - * - * @param repo The owning repository. - * @param index The position within the stash list. 0 points to the - * most recent stashed state. - * @param options Options to control how stashes are applied. - * - * @return 0 on success, GIT_ENOTFOUND if there's no stashed state for the given - * index, or error code. (see git_stash_apply() above for details) -*/ -GIT_EXTERN(int) git_stash_pop( - git_repository *repo, - size_t index, - const git_stash_apply_options *options); - -/** @} */ -GIT_END_DECL -#endif diff --git a/vendor/libgit2/include/git2/status.h b/vendor/libgit2/include/git2/status.h deleted file mode 100644 index 671113955c..0000000000 --- a/vendor/libgit2/include/git2/status.h +++ /dev/null @@ -1,370 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_status_h__ -#define INCLUDE_git_status_h__ - -#include "common.h" -#include "types.h" - -/** - * @file git2/status.h - * @brief Git file status routines - * @defgroup git_status Git file status routines - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** - * Status flags for a single file. - * - * A combination of these values will be returned to indicate the status of - * a file. Status compares the working directory, the index, and the - * current HEAD of the repository. The `GIT_STATUS_INDEX` set of flags - * represents the status of file in the index relative to the HEAD, and the - * `GIT_STATUS_WT` set of flags represent the status of the file in the - * working directory relative to the index. - */ -typedef enum { - GIT_STATUS_CURRENT = 0, - - GIT_STATUS_INDEX_NEW = (1u << 0), - GIT_STATUS_INDEX_MODIFIED = (1u << 1), - GIT_STATUS_INDEX_DELETED = (1u << 2), - GIT_STATUS_INDEX_RENAMED = (1u << 3), - GIT_STATUS_INDEX_TYPECHANGE = (1u << 4), - - GIT_STATUS_WT_NEW = (1u << 7), - GIT_STATUS_WT_MODIFIED = (1u << 8), - GIT_STATUS_WT_DELETED = (1u << 9), - GIT_STATUS_WT_TYPECHANGE = (1u << 10), - GIT_STATUS_WT_RENAMED = (1u << 11), - GIT_STATUS_WT_UNREADABLE = (1u << 12), - - GIT_STATUS_IGNORED = (1u << 14), - GIT_STATUS_CONFLICTED = (1u << 15), -} git_status_t; - -/** - * Function pointer to receive status on individual files - * - * `path` is the relative path to the file from the root of the repository. - * - * `status_flags` is a combination of `git_status_t` values that apply. - * - * `payload` is the value you passed to the foreach function as payload. - */ -typedef int (*git_status_cb)( - const char *path, unsigned int status_flags, void *payload); - -/** - * Select the files on which to report status. - * - * With `git_status_foreach_ext`, this will control which changes get - * callbacks. With `git_status_list_new`, these will control which - * changes are included in the list. - * - * - GIT_STATUS_SHOW_INDEX_AND_WORKDIR is the default. This roughly - * matches `git status --porcelain` regarding which files are - * included and in what order. - * - GIT_STATUS_SHOW_INDEX_ONLY only gives status based on HEAD to index - * comparison, not looking at working directory changes. - * - GIT_STATUS_SHOW_WORKDIR_ONLY only gives status based on index to - * working directory comparison, not comparing the index to the HEAD. - */ -typedef enum { - GIT_STATUS_SHOW_INDEX_AND_WORKDIR = 0, - GIT_STATUS_SHOW_INDEX_ONLY = 1, - GIT_STATUS_SHOW_WORKDIR_ONLY = 2, -} git_status_show_t; - -/** - * Flags to control status callbacks - * - * - GIT_STATUS_OPT_INCLUDE_UNTRACKED says that callbacks should be made - * on untracked files. These will only be made if the workdir files are - * included in the status "show" option. - * - GIT_STATUS_OPT_INCLUDE_IGNORED says that ignored files get callbacks. - * Again, these callbacks will only be made if the workdir files are - * included in the status "show" option. - * - GIT_STATUS_OPT_INCLUDE_UNMODIFIED indicates that callback should be - * made even on unmodified files. - * - GIT_STATUS_OPT_EXCLUDE_SUBMODULES indicates that submodules should be - * skipped. This only applies if there are no pending typechanges to - * the submodule (either from or to another type). - * - GIT_STATUS_OPT_RECURSE_UNTRACKED_DIRS indicates that all files in - * untracked directories should be included. Normally if an entire - * directory is new, then just the top-level directory is included (with - * a trailing slash on the entry name). This flag says to include all - * of the individual files in the directory instead. - * - GIT_STATUS_OPT_DISABLE_PATHSPEC_MATCH indicates that the given path - * should be treated as a literal path, and not as a pathspec pattern. - * - GIT_STATUS_OPT_RECURSE_IGNORED_DIRS indicates that the contents of - * ignored directories should be included in the status. This is like - * doing `git ls-files -o -i --exclude-standard` with core git. - * - GIT_STATUS_OPT_RENAMES_HEAD_TO_INDEX indicates that rename detection - * should be processed between the head and the index and enables - * the GIT_STATUS_INDEX_RENAMED as a possible status flag. - * - GIT_STATUS_OPT_RENAMES_INDEX_TO_WORKDIR indicates that rename - * detection should be run between the index and the working directory - * and enabled GIT_STATUS_WT_RENAMED as a possible status flag. - * - GIT_STATUS_OPT_SORT_CASE_SENSITIVELY overrides the native case - * sensitivity for the file system and forces the output to be in - * case-sensitive order - * - GIT_STATUS_OPT_SORT_CASE_INSENSITIVELY overrides the native case - * sensitivity for the file system and forces the output to be in - * case-insensitive order - * - GIT_STATUS_OPT_RENAMES_FROM_REWRITES indicates that rename detection - * should include rewritten files - * - GIT_STATUS_OPT_NO_REFRESH bypasses the default status behavior of - * doing a "soft" index reload (i.e. reloading the index data if the - * file on disk has been modified outside libgit2). - * - GIT_STATUS_OPT_UPDATE_INDEX tells libgit2 to refresh the stat cache - * in the index for files that are unchanged but have out of date stat - * information in the index. It will result in less work being done on - * subsequent calls to get status. This is mutually exclusive with the - * NO_REFRESH option. - * - * Calling `git_status_foreach()` is like calling the extended version - * with: GIT_STATUS_OPT_INCLUDE_IGNORED, GIT_STATUS_OPT_INCLUDE_UNTRACKED, - * and GIT_STATUS_OPT_RECURSE_UNTRACKED_DIRS. Those options are bundled - * together as `GIT_STATUS_OPT_DEFAULTS` if you want them as a baseline. - */ -typedef enum { - GIT_STATUS_OPT_INCLUDE_UNTRACKED = (1u << 0), - GIT_STATUS_OPT_INCLUDE_IGNORED = (1u << 1), - GIT_STATUS_OPT_INCLUDE_UNMODIFIED = (1u << 2), - GIT_STATUS_OPT_EXCLUDE_SUBMODULES = (1u << 3), - GIT_STATUS_OPT_RECURSE_UNTRACKED_DIRS = (1u << 4), - GIT_STATUS_OPT_DISABLE_PATHSPEC_MATCH = (1u << 5), - GIT_STATUS_OPT_RECURSE_IGNORED_DIRS = (1u << 6), - GIT_STATUS_OPT_RENAMES_HEAD_TO_INDEX = (1u << 7), - GIT_STATUS_OPT_RENAMES_INDEX_TO_WORKDIR = (1u << 8), - GIT_STATUS_OPT_SORT_CASE_SENSITIVELY = (1u << 9), - GIT_STATUS_OPT_SORT_CASE_INSENSITIVELY = (1u << 10), - GIT_STATUS_OPT_RENAMES_FROM_REWRITES = (1u << 11), - GIT_STATUS_OPT_NO_REFRESH = (1u << 12), - GIT_STATUS_OPT_UPDATE_INDEX = (1u << 13), - GIT_STATUS_OPT_INCLUDE_UNREADABLE = (1u << 14), - GIT_STATUS_OPT_INCLUDE_UNREADABLE_AS_UNTRACKED = (1u << 15), -} git_status_opt_t; - -#define GIT_STATUS_OPT_DEFAULTS \ - (GIT_STATUS_OPT_INCLUDE_IGNORED | \ - GIT_STATUS_OPT_INCLUDE_UNTRACKED | \ - GIT_STATUS_OPT_RECURSE_UNTRACKED_DIRS) - -/** - * Options to control how `git_status_foreach_ext()` will issue callbacks. - * - * This structure is set so that zeroing it out will give you relatively - * sane defaults. - * - * The `show` value is one of the `git_status_show_t` constants that - * control which files to scan and in what order. - * - * The `flags` value is an OR'ed combination of the `git_status_opt_t` - * values above. - * - * The `pathspec` is an array of path patterns to match (using - * fnmatch-style matching), or just an array of paths to match exactly if - * `GIT_STATUS_OPT_DISABLE_PATHSPEC_MATCH` is specified in the flags. - */ -typedef struct { - unsigned int version; - git_status_show_t show; - unsigned int flags; - git_strarray pathspec; -} git_status_options; - -#define GIT_STATUS_OPTIONS_VERSION 1 -#define GIT_STATUS_OPTIONS_INIT {GIT_STATUS_OPTIONS_VERSION} - -/** - * Initializes a `git_status_options` with default values. Equivalent to - * creating an instance with GIT_STATUS_OPTIONS_INIT. - * - * @param opts The `git_status_options` instance to initialize. - * @param version Version of struct; pass `GIT_STATUS_OPTIONS_VERSION` - * @return Zero on success; -1 on failure. - */ -GIT_EXTERN(int) git_status_init_options( - git_status_options *opts, - unsigned int version); - -/** - * A status entry, providing the differences between the file as it exists - * in HEAD and the index, and providing the differences between the index - * and the working directory. - * - * The `status` value provides the status flags for this file. - * - * The `head_to_index` value provides detailed information about the - * differences between the file in HEAD and the file in the index. - * - * The `index_to_workdir` value provides detailed information about the - * differences between the file in the index and the file in the - * working directory. - */ -typedef struct { - git_status_t status; - git_diff_delta *head_to_index; - git_diff_delta *index_to_workdir; -} git_status_entry; - - -/** - * Gather file statuses and run a callback for each one. - * - * The callback is passed the path of the file, the status (a combination of - * the `git_status_t` values above) and the `payload` data pointer passed - * into this function. - * - * If the callback returns a non-zero value, this function will stop looping - * and return that value to caller. - * - * @param repo A repository object - * @param callback The function to call on each file - * @param payload Pointer to pass through to callback function - * @return 0 on success, non-zero callback return value, or error code - */ -GIT_EXTERN(int) git_status_foreach( - git_repository *repo, - git_status_cb callback, - void *payload); - -/** - * Gather file status information and run callbacks as requested. - * - * This is an extended version of the `git_status_foreach()` API that - * allows for more granular control over which paths will be processed and - * in what order. See the `git_status_options` structure for details - * about the additional controls that this makes available. - * - * Note that if a `pathspec` is given in the `git_status_options` to filter - * the status, then the results from rename detection (if you enable it) may - * not be accurate. To do rename detection properly, this must be called - * with no `pathspec` so that all files can be considered. - * - * @param repo Repository object - * @param opts Status options structure - * @param callback The function to call on each file - * @param payload Pointer to pass through to callback function - * @return 0 on success, non-zero callback return value, or error code - */ -GIT_EXTERN(int) git_status_foreach_ext( - git_repository *repo, - const git_status_options *opts, - git_status_cb callback, - void *payload); - -/** - * Get file status for a single file. - * - * This tries to get status for the filename that you give. If no files - * match that name (in either the HEAD, index, or working directory), this - * returns GIT_ENOTFOUND. - * - * If the name matches multiple files (for example, if the `path` names a - * directory or if running on a case- insensitive filesystem and yet the - * HEAD has two entries that both match the path), then this returns - * GIT_EAMBIGUOUS because it cannot give correct results. - * - * This does not do any sort of rename detection. Renames require a set of - * targets and because of the path filtering, there is not enough - * information to check renames correctly. To check file status with rename - * detection, there is no choice but to do a full `git_status_list_new` and - * scan through looking for the path that you are interested in. - * - * @param status_flags Output combination of git_status_t values for file - * @param repo A repository object - * @param path The exact path to retrieve status for relative to the - * repository working directory - * @return 0 on success, GIT_ENOTFOUND if the file is not found in the HEAD, - * index, and work tree, GIT_EAMBIGUOUS if `path` matches multiple files - * or if it refers to a folder, and -1 on other errors. - */ -GIT_EXTERN(int) git_status_file( - unsigned int *status_flags, - git_repository *repo, - const char *path); - -/** - * Gather file status information and populate the `git_status_list`. - * - * Note that if a `pathspec` is given in the `git_status_options` to filter - * the status, then the results from rename detection (if you enable it) may - * not be accurate. To do rename detection properly, this must be called - * with no `pathspec` so that all files can be considered. - * - * @param out Pointer to store the status results in - * @param repo Repository object - * @param opts Status options structure - * @return 0 on success or error code - */ -GIT_EXTERN(int) git_status_list_new( - git_status_list **out, - git_repository *repo, - const git_status_options *opts); - -/** - * Gets the count of status entries in this list. - * - * If there are no changes in status (at least according the options given - * when the status list was created), this can return 0. - * - * @param statuslist Existing status list object - * @return the number of status entries - */ -GIT_EXTERN(size_t) git_status_list_entrycount( - git_status_list *statuslist); - -/** - * Get a pointer to one of the entries in the status list. - * - * The entry is not modifiable and should not be freed. - * - * @param statuslist Existing status list object - * @param idx Position of the entry - * @return Pointer to the entry; NULL if out of bounds - */ -GIT_EXTERN(const git_status_entry *) git_status_byindex( - git_status_list *statuslist, - size_t idx); - -/** - * Free an existing status list - * - * @param statuslist Existing status list object - */ -GIT_EXTERN(void) git_status_list_free( - git_status_list *statuslist); - -/** - * Test if the ignore rules apply to a given file. - * - * This function checks the ignore rules to see if they would apply to the - * given file. This indicates if the file would be ignored regardless of - * whether the file is already in the index or committed to the repository. - * - * One way to think of this is if you were to do "git add ." on the - * directory containing the file, would it be added or not? - * - * @param ignored Boolean returning 0 if the file is not ignored, 1 if it is - * @param repo A repository object - * @param path The file to check ignores for, rooted at the repo's workdir. - * @return 0 if ignore rules could be processed for the file (regardless - * of whether it exists or not), or an error < 0 if they could not. - */ -GIT_EXTERN(int) git_status_should_ignore( - int *ignored, - git_repository *repo, - const char *path); - -/** @} */ -GIT_END_DECL -#endif diff --git a/vendor/libgit2/include/git2/stdint.h b/vendor/libgit2/include/git2/stdint.h deleted file mode 100644 index c66fbb817c..0000000000 --- a/vendor/libgit2/include/git2/stdint.h +++ /dev/null @@ -1,247 +0,0 @@ -// ISO C9x compliant stdint.h for Microsoft Visual Studio -// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124 -// -// Copyright (c) 2006-2008 Alexander Chemeris -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, -// this list of conditions and the following disclaimer. -// -// 2. 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. -// -// 3. The name of the author may be used to endorse or promote products -// derived from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef _MSC_VER // [ -#error "Use this header only with Microsoft Visual C++ compilers!" -#endif // _MSC_VER ] - -#ifndef _MSC_STDINT_H_ // [ -#define _MSC_STDINT_H_ - -#if _MSC_VER > 1000 -#pragma once -#endif - -#include - -// For Visual Studio 6 in C++ mode and for many Visual Studio versions when -// compiling for ARM we should wrap include with 'extern "C++" {}' -// or compiler give many errors like this: -// error C2733: second C linkage of overloaded function 'wmemchr' not allowed -#ifdef __cplusplus -extern "C" { -#endif -# include -#ifdef __cplusplus -} -#endif - -// Define _W64 macros to mark types changing their size, like intptr_t. -#ifndef _W64 -# if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && _MSC_VER >= 1300 -# define _W64 __w64 -# else -# define _W64 -# endif -#endif - - -// 7.18.1 Integer types - -// 7.18.1.1 Exact-width integer types - -// Visual Studio 6 and Embedded Visual C++ 4 doesn't -// realize that, e.g. char has the same size as __int8 -// so we give up on __intX for them. -#if (_MSC_VER < 1300) - typedef signed char int8_t; - typedef signed short int16_t; - typedef signed int int32_t; - typedef unsigned char uint8_t; - typedef unsigned short uint16_t; - typedef unsigned int uint32_t; -#else - typedef signed __int8 int8_t; - typedef signed __int16 int16_t; - typedef signed __int32 int32_t; - typedef unsigned __int8 uint8_t; - typedef unsigned __int16 uint16_t; - typedef unsigned __int32 uint32_t; -#endif -typedef signed __int64 int64_t; -typedef unsigned __int64 uint64_t; - - -// 7.18.1.2 Minimum-width integer types -typedef int8_t int_least8_t; -typedef int16_t int_least16_t; -typedef int32_t int_least32_t; -typedef int64_t int_least64_t; -typedef uint8_t uint_least8_t; -typedef uint16_t uint_least16_t; -typedef uint32_t uint_least32_t; -typedef uint64_t uint_least64_t; - -// 7.18.1.3 Fastest minimum-width integer types -typedef int8_t int_fast8_t; -typedef int16_t int_fast16_t; -typedef int32_t int_fast32_t; -typedef int64_t int_fast64_t; -typedef uint8_t uint_fast8_t; -typedef uint16_t uint_fast16_t; -typedef uint32_t uint_fast32_t; -typedef uint64_t uint_fast64_t; - -// 7.18.1.4 Integer types capable of holding object pointers -#ifdef _WIN64 // [ - typedef signed __int64 intptr_t; - typedef unsigned __int64 uintptr_t; -#else // _WIN64 ][ - typedef _W64 signed int intptr_t; - typedef _W64 unsigned int uintptr_t; -#endif // _WIN64 ] - -// 7.18.1.5 Greatest-width integer types -typedef int64_t intmax_t; -typedef uint64_t uintmax_t; - - -// 7.18.2 Limits of specified-width integer types - -#if !defined(__cplusplus) || defined(__STDC_LIMIT_MACROS) // [ See footnote 220 at page 257 and footnote 221 at page 259 - -// 7.18.2.1 Limits of exact-width integer types -#define INT8_MIN ((int8_t)_I8_MIN) -#define INT8_MAX _I8_MAX -#define INT16_MIN ((int16_t)_I16_MIN) -#define INT16_MAX _I16_MAX -#define INT32_MIN ((int32_t)_I32_MIN) -#define INT32_MAX _I32_MAX -#define INT64_MIN ((int64_t)_I64_MIN) -#define INT64_MAX _I64_MAX -#define UINT8_MAX _UI8_MAX -#define UINT16_MAX _UI16_MAX -#define UINT32_MAX _UI32_MAX -#define UINT64_MAX _UI64_MAX - -// 7.18.2.2 Limits of minimum-width integer types -#define INT_LEAST8_MIN INT8_MIN -#define INT_LEAST8_MAX INT8_MAX -#define INT_LEAST16_MIN INT16_MIN -#define INT_LEAST16_MAX INT16_MAX -#define INT_LEAST32_MIN INT32_MIN -#define INT_LEAST32_MAX INT32_MAX -#define INT_LEAST64_MIN INT64_MIN -#define INT_LEAST64_MAX INT64_MAX -#define UINT_LEAST8_MAX UINT8_MAX -#define UINT_LEAST16_MAX UINT16_MAX -#define UINT_LEAST32_MAX UINT32_MAX -#define UINT_LEAST64_MAX UINT64_MAX - -// 7.18.2.3 Limits of fastest minimum-width integer types -#define INT_FAST8_MIN INT8_MIN -#define INT_FAST8_MAX INT8_MAX -#define INT_FAST16_MIN INT16_MIN -#define INT_FAST16_MAX INT16_MAX -#define INT_FAST32_MIN INT32_MIN -#define INT_FAST32_MAX INT32_MAX -#define INT_FAST64_MIN INT64_MIN -#define INT_FAST64_MAX INT64_MAX -#define UINT_FAST8_MAX UINT8_MAX -#define UINT_FAST16_MAX UINT16_MAX -#define UINT_FAST32_MAX UINT32_MAX -#define UINT_FAST64_MAX UINT64_MAX - -// 7.18.2.4 Limits of integer types capable of holding object pointers -#ifdef _WIN64 // [ -# define INTPTR_MIN INT64_MIN -# define INTPTR_MAX INT64_MAX -# define UINTPTR_MAX UINT64_MAX -#else // _WIN64 ][ -# define INTPTR_MIN INT32_MIN -# define INTPTR_MAX INT32_MAX -# define UINTPTR_MAX UINT32_MAX -#endif // _WIN64 ] - -// 7.18.2.5 Limits of greatest-width integer types -#define INTMAX_MIN INT64_MIN -#define INTMAX_MAX INT64_MAX -#define UINTMAX_MAX UINT64_MAX - -// 7.18.3 Limits of other integer types - -#ifdef _WIN64 // [ -# define PTRDIFF_MIN _I64_MIN -# define PTRDIFF_MAX _I64_MAX -#else // _WIN64 ][ -# define PTRDIFF_MIN _I32_MIN -# define PTRDIFF_MAX _I32_MAX -#endif // _WIN64 ] - -#define SIG_ATOMIC_MIN INT_MIN -#define SIG_ATOMIC_MAX INT_MAX - -#ifndef SIZE_MAX // [ -# ifdef _WIN64 // [ -# define SIZE_MAX _UI64_MAX -# else // _WIN64 ][ -# define SIZE_MAX _UI32_MAX -# endif // _WIN64 ] -#endif // SIZE_MAX ] - -// WCHAR_MIN and WCHAR_MAX are also defined in -#ifndef WCHAR_MIN // [ -# define WCHAR_MIN 0 -#endif // WCHAR_MIN ] -#ifndef WCHAR_MAX // [ -# define WCHAR_MAX _UI16_MAX -#endif // WCHAR_MAX ] - -#define WINT_MIN 0 -#define WINT_MAX _UI16_MAX - -#endif // __STDC_LIMIT_MACROS ] - - -// 7.18.4 Limits of other integer types - -#if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS) // [ See footnote 224 at page 260 - -// 7.18.4.1 Macros for minimum-width integer constants - -#define INT8_C(val) val##i8 -#define INT16_C(val) val##i16 -#define INT32_C(val) val##i32 -#define INT64_C(val) val##i64 - -#define UINT8_C(val) val##ui8 -#define UINT16_C(val) val##ui16 -#define UINT32_C(val) val##ui32 -#define UINT64_C(val) val##ui64 - -// 7.18.4.2 Macros for greatest-width integer constants -#define INTMAX_C INT64_C -#define UINTMAX_C UINT64_C - -#endif // __STDC_CONSTANT_MACROS ] - - -#endif // _MSC_STDINT_H_ ] diff --git a/vendor/libgit2/include/git2/strarray.h b/vendor/libgit2/include/git2/strarray.h deleted file mode 100644 index 86fa25f3fb..0000000000 --- a/vendor/libgit2/include/git2/strarray.h +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_strarray_h__ -#define INCLUDE_git_strarray_h__ - -#include "common.h" - -/** - * @file git2/strarray.h - * @brief Git string array routines - * @defgroup git_strarray Git string array routines - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** Array of strings */ -typedef struct git_strarray { - char **strings; - size_t count; -} git_strarray; - -/** - * Close a string array object - * - * This method should be called on `git_strarray` objects where the strings - * array is allocated and contains allocated strings, such as what you - * would get from `git_strarray_copy()`. Not doing so, will result in a - * memory leak. - * - * This does not free the `git_strarray` itself, since the library will - * never allocate that object directly itself (it is more commonly embedded - * inside another struct or created on the stack). - * - * @param array git_strarray from which to free string data - */ -GIT_EXTERN(void) git_strarray_free(git_strarray *array); - -/** - * Copy a string array object from source to target. - * - * Note: target is overwritten and hence should be empty, otherwise its - * contents are leaked. Call git_strarray_free() if necessary. - * - * @param tgt target - * @param src source - * @return 0 on success, < 0 on allocation failure - */ -GIT_EXTERN(int) git_strarray_copy(git_strarray *tgt, const git_strarray *src); - - -/** @} */ -GIT_END_DECL - -#endif - diff --git a/vendor/libgit2/include/git2/submodule.h b/vendor/libgit2/include/git2/submodule.h deleted file mode 100644 index 689fe4b64f..0000000000 --- a/vendor/libgit2/include/git2/submodule.h +++ /dev/null @@ -1,626 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_submodule_h__ -#define INCLUDE_git_submodule_h__ - -#include "common.h" -#include "types.h" -#include "oid.h" -#include "remote.h" -#include "checkout.h" - -/** - * @file git2/submodule.h - * @brief Git submodule management utilities - * - * Submodule support in libgit2 builds a list of known submodules and keeps - * it in the repository. The list is built from the .gitmodules file, the - * .git/config file, the index, and the HEAD tree. Items in the working - * directory that look like submodules (i.e. a git repo) but are not - * mentioned in those places won't be tracked. - * - * @defgroup git_submodule Git submodule management routines - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** - * Return codes for submodule status. - * - * A combination of these flags will be returned to describe the status of a - * submodule. Depending on the "ignore" property of the submodule, some of - * the flags may never be returned because they indicate changes that are - * supposed to be ignored. - * - * Submodule info is contained in 4 places: the HEAD tree, the index, config - * files (both .git/config and .gitmodules), and the working directory. Any - * or all of those places might be missing information about the submodule - * depending on what state the repo is in. We consider all four places to - * build the combination of status flags. - * - * There are four values that are not really status, but give basic info - * about what sources of submodule data are available. These will be - * returned even if ignore is set to "ALL". - * - * * IN_HEAD - superproject head contains submodule - * * IN_INDEX - superproject index contains submodule - * * IN_CONFIG - superproject gitmodules has submodule - * * IN_WD - superproject workdir has submodule - * - * The following values will be returned so long as ignore is not "ALL". - * - * * INDEX_ADDED - in index, not in head - * * INDEX_DELETED - in head, not in index - * * INDEX_MODIFIED - index and head don't match - * * WD_UNINITIALIZED - workdir contains empty directory - * * WD_ADDED - in workdir, not index - * * WD_DELETED - in index, not workdir - * * WD_MODIFIED - index and workdir head don't match - * - * The following can only be returned if ignore is "NONE" or "UNTRACKED". - * - * * WD_INDEX_MODIFIED - submodule workdir index is dirty - * * WD_WD_MODIFIED - submodule workdir has modified files - * - * Lastly, the following will only be returned for ignore "NONE". - * - * * WD_UNTRACKED - wd contains untracked files - */ -typedef enum { - GIT_SUBMODULE_STATUS_IN_HEAD = (1u << 0), - GIT_SUBMODULE_STATUS_IN_INDEX = (1u << 1), - GIT_SUBMODULE_STATUS_IN_CONFIG = (1u << 2), - GIT_SUBMODULE_STATUS_IN_WD = (1u << 3), - GIT_SUBMODULE_STATUS_INDEX_ADDED = (1u << 4), - GIT_SUBMODULE_STATUS_INDEX_DELETED = (1u << 5), - GIT_SUBMODULE_STATUS_INDEX_MODIFIED = (1u << 6), - GIT_SUBMODULE_STATUS_WD_UNINITIALIZED = (1u << 7), - GIT_SUBMODULE_STATUS_WD_ADDED = (1u << 8), - GIT_SUBMODULE_STATUS_WD_DELETED = (1u << 9), - GIT_SUBMODULE_STATUS_WD_MODIFIED = (1u << 10), - GIT_SUBMODULE_STATUS_WD_INDEX_MODIFIED = (1u << 11), - GIT_SUBMODULE_STATUS_WD_WD_MODIFIED = (1u << 12), - GIT_SUBMODULE_STATUS_WD_UNTRACKED = (1u << 13), -} git_submodule_status_t; - -#define GIT_SUBMODULE_STATUS__IN_FLAGS 0x000Fu -#define GIT_SUBMODULE_STATUS__INDEX_FLAGS 0x0070u -#define GIT_SUBMODULE_STATUS__WD_FLAGS 0x3F80u - -#define GIT_SUBMODULE_STATUS_IS_UNMODIFIED(S) \ - (((S) & ~GIT_SUBMODULE_STATUS__IN_FLAGS) == 0) - -#define GIT_SUBMODULE_STATUS_IS_INDEX_UNMODIFIED(S) \ - (((S) & GIT_SUBMODULE_STATUS__INDEX_FLAGS) == 0) - -#define GIT_SUBMODULE_STATUS_IS_WD_UNMODIFIED(S) \ - (((S) & (GIT_SUBMODULE_STATUS__WD_FLAGS & \ - ~GIT_SUBMODULE_STATUS_WD_UNINITIALIZED)) == 0) - -#define GIT_SUBMODULE_STATUS_IS_WD_DIRTY(S) \ - (((S) & (GIT_SUBMODULE_STATUS_WD_INDEX_MODIFIED | \ - GIT_SUBMODULE_STATUS_WD_WD_MODIFIED | \ - GIT_SUBMODULE_STATUS_WD_UNTRACKED)) != 0) - -/** - * Submodule update options structure - * - * Use the GIT_SUBMODULE_UPDATE_OPTIONS_INIT to get the default settings, - * like this: - * - * git_submodule_update_options opts = GIT_SUBMODULE_UPDATE_OPTIONS_INIT; - */ -typedef struct git_submodule_update_options { - unsigned int version; - - /** - * These options are passed to the checkout step. To disable - * checkout, set the `checkout_strategy` to - * `GIT_CHECKOUT_NONE`. Generally you will want the use - * GIT_CHECKOUT_SAFE to update files in the working - * directory. Use the `clone_checkout_strategy` field - * to set the checkout strategy that will be used in - * the case where update needs to clone the repository. - */ - git_checkout_options checkout_opts; - - /** - * Options which control the fetch, including callbacks. - * - * The callbacks to use for reporting fetch progress, and for acquiring - * credentials in the event they are needed. - */ - git_fetch_options fetch_opts; - - /** - * The checkout strategy to use when the sub repository needs to - * be cloned. Use GIT_CHECKOUT_SAFE to create all files - * in the working directory for the newly cloned repository. - */ - unsigned int clone_checkout_strategy; -} git_submodule_update_options; - -#define GIT_SUBMODULE_UPDATE_OPTIONS_VERSION 1 -#define GIT_SUBMODULE_UPDATE_OPTIONS_INIT \ - { GIT_CHECKOUT_OPTIONS_VERSION, \ - { GIT_CHECKOUT_OPTIONS_VERSION, GIT_CHECKOUT_SAFE }, \ - GIT_FETCH_OPTIONS_INIT, GIT_CHECKOUT_SAFE } - -/** - * Initializes a `git_submodule_update_options` with default values. - * Equivalent to creating an instance with GIT_SUBMODULE_UPDATE_OPTIONS_INIT. - * - * @param opts The `git_submodule_update_options` instance to initialize. - * @param version Version of struct; pass `GIT_SUBMODULE_UPDATE_OPTIONS_VERSION` - * @return Zero on success; -1 on failure. - */ -GIT_EXTERN(int) git_submodule_update_init_options( - git_submodule_update_options *opts, unsigned int version); - -/** - * Update a submodule. This will clone a missing submodule and - * checkout the subrepository to the commit specified in the index of - * containing repository. - * - * @param submodule Submodule object - * @param init If the submodule is not initialized, setting this flag to true - * will initialize the submodule before updating. Otherwise, this will - * return an error if attempting to update an uninitialzed repository. - * but setting this to true forces them to be updated. - * @param options configuration options for the update. If NULL, the - * function works as though GIT_SUBMODULE_UPDATE_OPTIONS_INIT was passed. - * @return 0 on success, any non-zero return value from a callback - * function, or a negative value to indicate an error (use - * `giterr_last` for a detailed error message). - */ -GIT_EXTERN(int) git_submodule_update(git_submodule *submodule, int init, git_submodule_update_options *options); - -/** - * Lookup submodule information by name or path. - * - * Given either the submodule name or path (they are usually the same), this - * returns a structure describing the submodule. - * - * There are two expected error scenarios: - * - * - The submodule is not mentioned in the HEAD, the index, and the config, - * but does "exist" in the working directory (i.e. there is a subdirectory - * that appears to be a Git repository). In this case, this function - * returns GIT_EEXISTS to indicate a sub-repository exists but not in a - * state where a git_submodule can be instantiated. - * - The submodule is not mentioned in the HEAD, index, or config and the - * working directory doesn't contain a value git repo at that path. - * There may or may not be anything else at that path, but nothing that - * looks like a submodule. In this case, this returns GIT_ENOTFOUND. - * - * You must call `git_submodule_free` when done with the submodule. - * - * @param out Output ptr to submodule; pass NULL to just get return code - * @param repo The parent repository - * @param name The name of or path to the submodule; trailing slashes okay - * @return 0 on success, GIT_ENOTFOUND if submodule does not exist, - * GIT_EEXISTS if a repository is found in working directory only, - * -1 on other errors. - */ -GIT_EXTERN(int) git_submodule_lookup( - git_submodule **out, - git_repository *repo, - const char *name); - -/** - * Release a submodule - * - * @param submodule Submodule object - */ -GIT_EXTERN(void) git_submodule_free(git_submodule *submodule); - -/** - * Iterate over all tracked submodules of a repository. - * - * See the note on `git_submodule` above. This iterates over the tracked - * submodules as described therein. - * - * If you are concerned about items in the working directory that look like - * submodules but are not tracked, the diff API will generate a diff record - * for workdir items that look like submodules but are not tracked, showing - * them as added in the workdir. Also, the status API will treat the entire - * subdirectory of a contained git repo as a single GIT_STATUS_WT_NEW item. - * - * @param repo The repository - * @param callback Function to be called with the name of each submodule. - * Return a non-zero value to terminate the iteration. - * @param payload Extra data to pass to callback - * @return 0 on success, -1 on error, or non-zero return value of callback - */ -GIT_EXTERN(int) git_submodule_foreach( - git_repository *repo, - int (*callback)(git_submodule *sm, const char *name, void *payload), - void *payload); - -/** - * Set up a new git submodule for checkout. - * - * This does "git submodule add" up to the fetch and checkout of the - * submodule contents. It preps a new submodule, creates an entry in - * .gitmodules and creates an empty initialized repository either at the - * given path in the working directory or in .git/modules with a gitlink - * from the working directory to the new repo. - * - * To fully emulate "git submodule add" call this function, then open the - * submodule repo and perform the clone step as needed. Lastly, call - * `git_submodule_add_finalize()` to wrap up adding the new submodule and - * .gitmodules to the index to be ready to commit. - * - * You must call `git_submodule_free` on the submodule object when done. - * - * @param out The newly created submodule ready to open for clone - * @param repo The repository in which you want to create the submodule - * @param url URL for the submodule's remote - * @param path Path at which the submodule should be created - * @param use_gitlink Should workdir contain a gitlink to the repo in - * .git/modules vs. repo directly in workdir. - * @return 0 on success, GIT_EEXISTS if submodule already exists, - * -1 on other errors. - */ -GIT_EXTERN(int) git_submodule_add_setup( - git_submodule **out, - git_repository *repo, - const char *url, - const char *path, - int use_gitlink); - -/** - * Resolve the setup of a new git submodule. - * - * This should be called on a submodule once you have called add setup - * and done the clone of the submodule. This adds the .gitmodules file - * and the newly cloned submodule to the index to be ready to be committed - * (but doesn't actually do the commit). - * - * @param submodule The submodule to finish adding. - */ -GIT_EXTERN(int) git_submodule_add_finalize(git_submodule *submodule); - -/** - * Add current submodule HEAD commit to index of superproject. - * - * @param submodule The submodule to add to the index - * @param write_index Boolean if this should immediately write the index - * file. If you pass this as false, you will have to get the - * git_index and explicitly call `git_index_write()` on it to - * save the change. - * @return 0 on success, <0 on failure - */ -GIT_EXTERN(int) git_submodule_add_to_index( - git_submodule *submodule, - int write_index); - -/** - * Get the containing repository for a submodule. - * - * This returns a pointer to the repository that contains the submodule. - * This is a just a reference to the repository that was passed to the - * original `git_submodule_lookup()` call, so if that repository has been - * freed, then this may be a dangling reference. - * - * @param submodule Pointer to submodule object - * @return Pointer to `git_repository` - */ -GIT_EXTERN(git_repository *) git_submodule_owner(git_submodule *submodule); - -/** - * Get the name of submodule. - * - * @param submodule Pointer to submodule object - * @return Pointer to the submodule name - */ -GIT_EXTERN(const char *) git_submodule_name(git_submodule *submodule); - -/** - * Get the path to the submodule. - * - * The path is almost always the same as the submodule name, but the - * two are actually not required to match. - * - * @param submodule Pointer to submodule object - * @return Pointer to the submodule path - */ -GIT_EXTERN(const char *) git_submodule_path(git_submodule *submodule); - -/** - * Get the URL for the submodule. - * - * @param submodule Pointer to submodule object - * @return Pointer to the submodule url - */ -GIT_EXTERN(const char *) git_submodule_url(git_submodule *submodule); - -/** - * Resolve a submodule url relative to the given repository. - * - * @param out buffer to store the absolute submodule url in - * @param repo Pointer to repository object - * @param url Relative url - * @return 0 or an error code - */ -GIT_EXTERN(int) git_submodule_resolve_url(git_buf *out, git_repository *repo, const char *url); - -/** -* Get the branch for the submodule. -* -* @param submodule Pointer to submodule object -* @return Pointer to the submodule branch -*/ -GIT_EXTERN(const char *) git_submodule_branch(git_submodule *submodule); - -/** - * Set the branch for the submodule in the configuration - * - * After calling this, you may wish to call `git_submodule_sync()` to - * write the changes to the checked out submodule repository. - * - * @param repo the repository to affect - * @param name the name of the submodule to configure - * @param branch Branch that should be used for the submodule - * @return 0 on success, <0 on failure - */ -GIT_EXTERN(int) git_submodule_set_branch(git_repository *repo, const char *name, const char *branch); - -/** - * Set the URL for the submodule in the configuration - * - * - * After calling this, you may wish to call `git_submodule_sync()` to - * write the changes to the checked out submodule repository. - * - * @param repo the repository to affect - * @param name the name of the submodule to configure - * @param url URL that should be used for the submodule - * @return 0 on success, <0 on failure - */ -GIT_EXTERN(int) git_submodule_set_url(git_repository *repo, const char *name, const char *url); - -/** - * Get the OID for the submodule in the index. - * - * @param submodule Pointer to submodule object - * @return Pointer to git_oid or NULL if submodule is not in index. - */ -GIT_EXTERN(const git_oid *) git_submodule_index_id(git_submodule *submodule); - -/** - * Get the OID for the submodule in the current HEAD tree. - * - * @param submodule Pointer to submodule object - * @return Pointer to git_oid or NULL if submodule is not in the HEAD. - */ -GIT_EXTERN(const git_oid *) git_submodule_head_id(git_submodule *submodule); - -/** - * Get the OID for the submodule in the current working directory. - * - * This returns the OID that corresponds to looking up 'HEAD' in the checked - * out submodule. If there are pending changes in the index or anything - * else, this won't notice that. You should call `git_submodule_status()` - * for a more complete picture about the state of the working directory. - * - * @param submodule Pointer to submodule object - * @return Pointer to git_oid or NULL if submodule is not checked out. - */ -GIT_EXTERN(const git_oid *) git_submodule_wd_id(git_submodule *submodule); - -/** - * Get the ignore rule that will be used for the submodule. - * - * These values control the behavior of `git_submodule_status()` for this - * submodule. There are four ignore values: - * - * - **GIT_SUBMODULE_IGNORE_NONE** will consider any change to the contents - * of the submodule from a clean checkout to be dirty, including the - * addition of untracked files. This is the default if unspecified. - * - **GIT_SUBMODULE_IGNORE_UNTRACKED** examines the contents of the - * working tree (i.e. call `git_status_foreach()` on the submodule) but - * UNTRACKED files will not count as making the submodule dirty. - * - **GIT_SUBMODULE_IGNORE_DIRTY** means to only check if the HEAD of the - * submodule has moved for status. This is fast since it does not need to - * scan the working tree of the submodule at all. - * - **GIT_SUBMODULE_IGNORE_ALL** means not to open the submodule repo. - * The working directory will be consider clean so long as there is a - * checked out version present. - * - * @param submodule The submodule to check - * @return The current git_submodule_ignore_t valyue what will be used for - * this submodule. - */ -GIT_EXTERN(git_submodule_ignore_t) git_submodule_ignore( - git_submodule *submodule); - -/** - * Set the ignore rule for the submodule in the configuration - * - * This does not affect any currently-loaded instances. - * - * @param repo the repository to affect - * @param name the name of the submdule - * @param ignore The new value for the ignore rule - * @return 0 or an error code - */ -GIT_EXTERN(int) git_submodule_set_ignore( - git_repository *repo, - const char *name, - git_submodule_ignore_t ignore); - -/** - * Get the update rule that will be used for the submodule. - * - * This value controls the behavior of the `git submodule update` command. - * There are four useful values documented with `git_submodule_update_t`. - * - * @param submodule The submodule to check - * @return The current git_submodule_update_t value that will be used - * for this submodule. - */ -GIT_EXTERN(git_submodule_update_t) git_submodule_update_strategy( - git_submodule *submodule); - -/** - * Set the update rule for the submodule in the configuration - * - * This setting won't affect any existing instances. - * - * @param repo the repository to affect - * @param name the name of the submodule to configure - * @param update The new value to use - * @return 0 or an error code - */ -GIT_EXTERN(int) git_submodule_set_update( - git_repository *repo, - const char *name, - git_submodule_update_t update); - -/** - * Read the fetchRecurseSubmodules rule for a submodule. - * - * This accesses the submodule..fetchRecurseSubmodules value for - * the submodule that controls fetching behavior for the submodule. - * - * Note that at this time, libgit2 does not honor this setting and the - * fetch functionality current ignores submodules. - * - * @return 0 if fetchRecurseSubmodules is false, 1 if true - */ -GIT_EXTERN(git_submodule_recurse_t) git_submodule_fetch_recurse_submodules( - git_submodule *submodule); - -/** - * Set the fetchRecurseSubmodules rule for a submodule in the configuration - * - * This setting won't affect any existing instances. - * - * @param repo the repository to affect - * @param name the submodule to configure - * @param fetch_recurse_submodules Boolean value - * @return old value for fetchRecurseSubmodules - */ -GIT_EXTERN(int) git_submodule_set_fetch_recurse_submodules( - git_repository *repo, - const char *name, - git_submodule_recurse_t fetch_recurse_submodules); - -/** - * Copy submodule info into ".git/config" file. - * - * Just like "git submodule init", this copies information about the - * submodule into ".git/config". You can use the accessor functions - * above to alter the in-memory git_submodule object and control what - * is written to the config, overriding what is in .gitmodules. - * - * @param submodule The submodule to write into the superproject config - * @param overwrite By default, existing entries will not be overwritten, - * but setting this to true forces them to be updated. - * @return 0 on success, <0 on failure. - */ -GIT_EXTERN(int) git_submodule_init(git_submodule *submodule, int overwrite); - -/** - * Set up the subrepository for a submodule in preparation for clone. - * - * This function can be called to init and set up a submodule - * repository from a submodule in preparation to clone it from - * its remote. - * - * @param out Output pointer to the created git repository. - * @param sm The submodule to create a new subrepository from. - * @param use_gitlink Should the workdir contain a gitlink to - * the repo in .git/modules vs. repo directly in workdir. - * @return 0 on success, <0 on failure. - */ -GIT_EXTERN(int) git_submodule_repo_init( - git_repository **out, - const git_submodule *sm, - int use_gitlink); - -/** - * Copy submodule remote info into submodule repo. - * - * This copies the information about the submodules URL into the checked out - * submodule config, acting like "git submodule sync". This is useful if - * you have altered the URL for the submodule (or it has been altered by a - * fetch of upstream changes) and you need to update your local repo. - */ -GIT_EXTERN(int) git_submodule_sync(git_submodule *submodule); - -/** - * Open the repository for a submodule. - * - * This is a newly opened repository object. The caller is responsible for - * calling `git_repository_free()` on it when done. Multiple calls to this - * function will return distinct `git_repository` objects. This will only - * work if the submodule is checked out into the working directory. - * - * @param repo Pointer to the submodule repo which was opened - * @param submodule Submodule to be opened - * @return 0 on success, <0 if submodule repo could not be opened. - */ -GIT_EXTERN(int) git_submodule_open( - git_repository **repo, - git_submodule *submodule); - -/** - * Reread submodule info from config, index, and HEAD. - * - * Call this to reread cached submodule information for this submodule if - * you have reason to believe that it has changed. - * - * @param submodule The submodule to reload - * @param force Force reload even if the data doesn't seem out of date - * @return 0 on success, <0 on error - */ -GIT_EXTERN(int) git_submodule_reload(git_submodule *submodule, int force); - -/** - * Get the status for a submodule. - * - * This looks at a submodule and tries to determine the status. It - * will return a combination of the `GIT_SUBMODULE_STATUS` values above. - * How deeply it examines the working directory to do this will depend - * on the `git_submodule_ignore_t` value for the submodule. - * - * @param status Combination of `GIT_SUBMODULE_STATUS` flags - * @param repo the repository in which to look - * @param name name of the submodule - * @param ignore the ignore rules to follow - * @return 0 on success, <0 on error - */ -GIT_EXTERN(int) git_submodule_status( - unsigned int *status, - git_repository *repo, - const char *name, - git_submodule_ignore_t ignore); - -/** - * Get the locations of submodule information. - * - * This is a bit like a very lightweight version of `git_submodule_status`. - * It just returns a made of the first four submodule status values (i.e. - * the ones like GIT_SUBMODULE_STATUS_IN_HEAD, etc) that tell you where the - * submodule data comes from (i.e. the HEAD commit, gitmodules file, etc.). - * This can be useful if you want to know if the submodule is present in the - * working directory at this point in time, etc. - * - * @param location_status Combination of first four `GIT_SUBMODULE_STATUS` flags - * @param submodule Submodule for which to get status - * @return 0 on success, <0 on error - */ -GIT_EXTERN(int) git_submodule_location( - unsigned int *location_status, - git_submodule *submodule); - -/** @} */ -GIT_END_DECL -#endif diff --git a/vendor/libgit2/include/git2/sys/commit.h b/vendor/libgit2/include/git2/sys/commit.h deleted file mode 100644 index 627d3ae2eb..0000000000 --- a/vendor/libgit2/include/git2/sys/commit.h +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_sys_git_commit_h__ -#define INCLUDE_sys_git_commit_h__ - -#include "git2/common.h" -#include "git2/types.h" -#include "git2/oid.h" - -/** - * @file git2/sys/commit.h - * @brief Low-level Git commit creation - * @defgroup git_backend Git custom backend APIs - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** - * Create new commit in the repository from a list of `git_oid` values. - * - * See documentation for `git_commit_create()` for information about the - * parameters, as the meaning is identical excepting that `tree` and - * `parents` now take `git_oid`. This is a dangerous API in that nor - * the `tree`, neither the `parents` list of `git_oid`s are checked for - * validity. - * - * @see git_commit_create - */ -GIT_EXTERN(int) git_commit_create_from_ids( - git_oid *id, - git_repository *repo, - const char *update_ref, - const git_signature *author, - const git_signature *committer, - const char *message_encoding, - const char *message, - const git_oid *tree, - size_t parent_count, - const git_oid *parents[]); - -/** - * Callback function to return parents for commit. - * - * This is invoked with the count of the number of parents processed so far - * along with the user supplied payload. This should return a git_oid of - * the next parent or NULL if all parents have been provided. - */ -typedef const git_oid *(*git_commit_parent_callback)(size_t idx, void *payload); - -/** - * Create a new commit in the repository with an callback to supply parents. - * - * See documentation for `git_commit_create()` for information about the - * parameters, as the meaning is identical excepting that `tree` takes a - * `git_oid` and doesn't check for validity, and `parent_cb` is invoked - * with `parent_payload` and should return `git_oid` values or NULL to - * indicate that all parents are accounted for. - * - * @see git_commit_create - */ -GIT_EXTERN(int) git_commit_create_from_callback( - git_oid *id, - git_repository *repo, - const char *update_ref, - const git_signature *author, - const git_signature *committer, - const char *message_encoding, - const char *message, - const git_oid *tree, - git_commit_parent_callback parent_cb, - void *parent_payload); - -/** @} */ -GIT_END_DECL -#endif diff --git a/vendor/libgit2/include/git2/sys/config.h b/vendor/libgit2/include/git2/sys/config.h deleted file mode 100644 index 044e34417e..0000000000 --- a/vendor/libgit2/include/git2/sys/config.h +++ /dev/null @@ -1,113 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_sys_git_config_backend_h__ -#define INCLUDE_sys_git_config_backend_h__ - -#include "git2/common.h" -#include "git2/types.h" -#include "git2/config.h" - -/** - * @file git2/sys/config.h - * @brief Git config backend routines - * @defgroup git_backend Git custom backend APIs - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** - * Every iterator must have this struct as its first element, so the - * API can talk to it. You'd define your iterator as - * - * struct my_iterator { - * git_config_iterator parent; - * ... - * } - * - * and assign `iter->parent.backend` to your `git_config_backend`. - */ -struct git_config_iterator { - git_config_backend *backend; - unsigned int flags; - - /** - * Return the current entry and advance the iterator. The - * memory belongs to the library. - */ - int (*next)(git_config_entry **entry, git_config_iterator *iter); - - /** - * Free the iterator - */ - void (*free)(git_config_iterator *iter); -}; - -/** - * Generic backend that implements the interface to - * access a configuration file - */ -struct git_config_backend { - unsigned int version; - /** True if this backend is for a snapshot */ - int readonly; - struct git_config *cfg; - - /* Open means open the file/database and parse if necessary */ - int (*open)(struct git_config_backend *, git_config_level_t level); - int (*get)(struct git_config_backend *, const char *key, git_config_entry **entry); - int (*set)(struct git_config_backend *, const char *key, const char *value); - int (*set_multivar)(git_config_backend *cfg, const char *name, const char *regexp, const char *value); - int (*del)(struct git_config_backend *, const char *key); - int (*del_multivar)(struct git_config_backend *, const char *key, const char *regexp); - int (*iterator)(git_config_iterator **, struct git_config_backend *); - /** Produce a read-only version of this backend */ - int (*snapshot)(struct git_config_backend **, struct git_config_backend *); - void (*free)(struct git_config_backend *); -}; -#define GIT_CONFIG_BACKEND_VERSION 1 -#define GIT_CONFIG_BACKEND_INIT {GIT_CONFIG_BACKEND_VERSION} - -/** - * Initializes a `git_config_backend` with default values. Equivalent to - * creating an instance with GIT_CONFIG_BACKEND_INIT. - * - * @param backend the `git_config_backend` struct to initialize. - * @param version Version of struct; pass `GIT_CONFIG_BACKEND_VERSION` - * @return Zero on success; -1 on failure. - */ -GIT_EXTERN(int) git_config_init_backend( - git_config_backend *backend, - unsigned int version); - -/** - * Add a generic config file instance to an existing config - * - * Note that the configuration object will free the file - * automatically. - * - * Further queries on this config object will access each - * of the config file instances in order (instances with - * a higher priority level will be accessed first). - * - * @param cfg the configuration to add the file to - * @param file the configuration file (backend) to add - * @param level the priority level of the backend - * @param force if a config file already exists for the given - * priority level, replace it - * @return 0 on success, GIT_EEXISTS when adding more than one file - * for a given priority level (and force_replace set to 0), or error code - */ -GIT_EXTERN(int) git_config_add_backend( - git_config *cfg, - git_config_backend *file, - git_config_level_t level, - int force); - -/** @} */ -GIT_END_DECL -#endif diff --git a/vendor/libgit2/include/git2/sys/diff.h b/vendor/libgit2/include/git2/sys/diff.h deleted file mode 100644 index aefd7b9973..0000000000 --- a/vendor/libgit2/include/git2/sys/diff.h +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_sys_git_diff_h__ -#define INCLUDE_sys_git_diff_h__ - -#include "git2/common.h" -#include "git2/types.h" -#include "git2/oid.h" -#include "git2/diff.h" -#include "git2/status.h" - -/** - * @file git2/sys/diff.h - * @brief Low-level Git diff utilities - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** - * Diff print callback that writes to a git_buf. - * - * This function is provided not for you to call it directly, but instead - * so you can use it as a function pointer to the `git_diff_print` or - * `git_patch_print` APIs. When using those APIs, you specify a callback - * to actually handle the diff and/or patch data. - * - * Use this callback to easily write that data to a `git_buf` buffer. You - * must pass a `git_buf *` value as the payload to the `git_diff_print` - * and/or `git_patch_print` function. The data will be appended to the - * buffer (after any existing content). - */ -GIT_EXTERN(int) git_diff_print_callback__to_buf( - const git_diff_delta *delta, - const git_diff_hunk *hunk, - const git_diff_line *line, - void *payload); /**< payload must be a `git_buf *` */ - -/** - * Diff print callback that writes to stdio FILE handle. - * - * This function is provided not for you to call it directly, but instead - * so you can use it as a function pointer to the `git_diff_print` or - * `git_patch_print` APIs. When using those APIs, you specify a callback - * to actually handle the diff and/or patch data. - * - * Use this callback to easily write that data to a stdio FILE handle. You - * must pass a `FILE *` value (such as `stdout` or `stderr` or the return - * value from `fopen()`) as the payload to the `git_diff_print` - * and/or `git_patch_print` function. If you pass NULL, this will write - * data to `stdout`. - */ -GIT_EXTERN(int) git_diff_print_callback__to_file_handle( - const git_diff_delta *delta, - const git_diff_hunk *hunk, - const git_diff_line *line, - void *payload); /**< payload must be a `FILE *` */ - - -/** - * Performance data from diffing - */ -typedef struct { - unsigned int version; - size_t stat_calls; /**< Number of stat() calls performed */ - size_t oid_calculations; /**< Number of ID calculations */ -} git_diff_perfdata; - -#define GIT_DIFF_PERFDATA_VERSION 1 -#define GIT_DIFF_PERFDATA_INIT {GIT_DIFF_PERFDATA_VERSION,0,0} - -/** - * Get performance data for a diff object. - * - * @param out Structure to be filled with diff performance data - * @param diff Diff to read performance data from - * @return 0 for success, <0 for error - */ -GIT_EXTERN(int) git_diff_get_perfdata( - git_diff_perfdata *out, const git_diff *diff); - -/** - * Get performance data for diffs from a git_status_list - */ -GIT_EXTERN(int) git_status_list_get_perfdata( - git_diff_perfdata *out, const git_status_list *status); - -/** @} */ -GIT_END_DECL -#endif diff --git a/vendor/libgit2/include/git2/sys/filter.h b/vendor/libgit2/include/git2/sys/filter.h deleted file mode 100644 index 5fd8d5566d..0000000000 --- a/vendor/libgit2/include/git2/sys/filter.h +++ /dev/null @@ -1,309 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_sys_git_filter_h__ -#define INCLUDE_sys_git_filter_h__ - -#include "git2/filter.h" - -/** - * @file git2/sys/filter.h - * @brief Git filter backend and plugin routines - * @defgroup git_backend Git custom backend APIs - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** - * Look up a filter by name - * - * @param name The name of the filter - * @return Pointer to the filter object or NULL if not found - */ -GIT_EXTERN(git_filter *) git_filter_lookup(const char *name); - -#define GIT_FILTER_CRLF "crlf" -#define GIT_FILTER_IDENT "ident" - -/** - * This is priority that the internal CRLF filter will be registered with - */ -#define GIT_FILTER_CRLF_PRIORITY 0 - -/** - * This is priority that the internal ident filter will be registered with - */ -#define GIT_FILTER_IDENT_PRIORITY 100 - -/** - * This is priority to use with a custom filter to imitate a core Git - * filter driver, so that it will be run last on checkout and first on - * checkin. You do not have to use this, but it helps compatibility. - */ -#define GIT_FILTER_DRIVER_PRIORITY 200 - -/** - * Create a new empty filter list - * - * Normally you won't use this because `git_filter_list_load` will create - * the filter list for you, but you can use this in combination with the - * `git_filter_lookup` and `git_filter_list_push` functions to assemble - * your own chains of filters. - */ -GIT_EXTERN(int) git_filter_list_new( - git_filter_list **out, - git_repository *repo, - git_filter_mode_t mode, - uint32_t options); - -/** - * Add a filter to a filter list with the given payload. - * - * Normally you won't have to do this because the filter list is created - * by calling the "check" function on registered filters when the filter - * attributes are set, but this does allow more direct manipulation of - * filter lists when desired. - * - * Note that normally the "check" function can set up a payload for the - * filter. Using this function, you can either pass in a payload if you - * know the expected payload format, or you can pass NULL. Some filters - * may fail with a NULL payload. Good luck! - */ -GIT_EXTERN(int) git_filter_list_push( - git_filter_list *fl, git_filter *filter, void *payload); - -/** - * Look up how many filters are in the list - * - * We will attempt to apply all of these filters to any data passed in, - * but note that the filter apply action still has the option of skipping - * data that is passed in (for example, the CRLF filter will skip data - * that appears to be binary). - * - * @param fl A filter list - * @return The number of filters in the list - */ -GIT_EXTERN(size_t) git_filter_list_length(const git_filter_list *fl); - -/** - * A filter source represents a file/blob to be processed - */ -typedef struct git_filter_source git_filter_source; - -/** - * Get the repository that the source data is coming from. - */ -GIT_EXTERN(git_repository *) git_filter_source_repo(const git_filter_source *src); - -/** - * Get the path that the source data is coming from. - */ -GIT_EXTERN(const char *) git_filter_source_path(const git_filter_source *src); - -/** - * Get the file mode of the source file - * If the mode is unknown, this will return 0 - */ -GIT_EXTERN(uint16_t) git_filter_source_filemode(const git_filter_source *src); - -/** - * Get the OID of the source - * If the OID is unknown (often the case with GIT_FILTER_CLEAN) then - * this will return NULL. - */ -GIT_EXTERN(const git_oid *) git_filter_source_id(const git_filter_source *src); - -/** - * Get the git_filter_mode_t to be used - */ -GIT_EXTERN(git_filter_mode_t) git_filter_source_mode(const git_filter_source *src); - -/** - * Get the combination git_filter_flag_t options to be applied - */ -GIT_EXTERN(uint32_t) git_filter_source_flags(const git_filter_source *src); - -/* - * struct git_filter - * - * The filter lifecycle: - * - initialize - first use of filter - * - shutdown - filter removed/unregistered from system - * - check - considering filter for file - * - apply - apply filter to file contents - * - cleanup - done with file - */ - -/** - * Initialize callback on filter - * - * Specified as `filter.initialize`, this is an optional callback invoked - * before a filter is first used. It will be called once at most. - * - * If non-NULL, the filter's `initialize` callback will be invoked right - * before the first use of the filter, so you can defer expensive - * initialization operations (in case libgit2 is being used in a way that - * doesn't need the filter). - */ -typedef int (*git_filter_init_fn)(git_filter *self); - -/** - * Shutdown callback on filter - * - * Specified as `filter.shutdown`, this is an optional callback invoked - * when the filter is unregistered or when libgit2 is shutting down. It - * will be called once at most and should release resources as needed. - * This may be called even if the `initialize` callback was not made. - * - * Typically this function will free the `git_filter` object itself. - */ -typedef void (*git_filter_shutdown_fn)(git_filter *self); - -/** - * Callback to decide if a given source needs this filter - * - * Specified as `filter.check`, this is an optional callback that checks - * if filtering is needed for a given source. - * - * It should return 0 if the filter should be applied (i.e. success), - * GIT_PASSTHROUGH if the filter should not be applied, or an error code - * to fail out of the filter processing pipeline and return to the caller. - * - * The `attr_values` will be set to the values of any attributes given in - * the filter definition. See `git_filter` below for more detail. - * - * The `payload` will be a pointer to a reference payload for the filter. - * This will start as NULL, but `check` can assign to this pointer for - * later use by the `apply` callback. Note that the value should be heap - * allocated (not stack), so that it doesn't go away before the `apply` - * callback can use it. If a filter allocates and assigns a value to the - * `payload`, it will need a `cleanup` callback to free the payload. - */ -typedef int (*git_filter_check_fn)( - git_filter *self, - void **payload, /* points to NULL ptr on entry, may be set */ - const git_filter_source *src, - const char **attr_values); - -/** - * Callback to actually perform the data filtering - * - * Specified as `filter.apply`, this is the callback that actually filters - * data. If it successfully writes the output, it should return 0. Like - * `check`, it can return GIT_PASSTHROUGH to indicate that the filter - * doesn't want to run. Other error codes will stop filter processing and - * return to the caller. - * - * The `payload` value will refer to any payload that was set by the - * `check` callback. It may be read from or written to as needed. - */ -typedef int (*git_filter_apply_fn)( - git_filter *self, - void **payload, /* may be read and/or set */ - git_buf *to, - const git_buf *from, - const git_filter_source *src); - -typedef int (*git_filter_stream_fn)( - git_writestream **out, - git_filter *self, - void **payload, - const git_filter_source *src, - git_writestream *next); - -/** - * Callback to clean up after filtering has been applied - * - * Specified as `filter.cleanup`, this is an optional callback invoked - * after the filter has been applied. If the `check` or `apply` callbacks - * allocated a `payload` to keep per-source filter state, use this - * callback to free that payload and release resources as required. - */ -typedef void (*git_filter_cleanup_fn)( - git_filter *self, - void *payload); - -/** - * Filter structure used to register custom filters. - * - * To associate extra data with a filter, allocate extra data and put the - * `git_filter` struct at the start of your data buffer, then cast the - * `self` pointer to your larger structure when your callback is invoked. - * - * `version` should be set to GIT_FILTER_VERSION - * - * `attributes` is a whitespace-separated list of attribute names to check - * for this filter (e.g. "eol crlf text"). If the attribute name is bare, - * it will be simply loaded and passed to the `check` callback. If it has - * a value (i.e. "name=value"), the attribute must match that value for - * the filter to be applied. - * - * The `initialize`, `shutdown`, `check`, `apply`, and `cleanup` callbacks - * are all documented above with the respective function pointer typedefs. - */ -struct git_filter { - unsigned int version; - - const char *attributes; - - git_filter_init_fn initialize; - git_filter_shutdown_fn shutdown; - git_filter_check_fn check; - git_filter_apply_fn apply; - git_filter_stream_fn stream; - git_filter_cleanup_fn cleanup; -}; - -#define GIT_FILTER_VERSION 1 - -/** - * Register a filter under a given name with a given priority. - * - * As mentioned elsewhere, the initialize callback will not be invoked - * immediately. It is deferred until the filter is used in some way. - * - * A filter's attribute checks and `check` and `apply` callbacks will be - * issued in order of `priority` on smudge (to workdir), and in reverse - * order of `priority` on clean (to odb). - * - * Two filters are preregistered with libgit2: - * - GIT_FILTER_CRLF with priority 0 - * - GIT_FILTER_IDENT with priority 100 - * - * Currently the filter registry is not thread safe, so any registering or - * deregistering of filters must be done outside of any possible usage of - * the filters (i.e. during application setup or shutdown). - * - * @param name A name by which the filter can be referenced. Attempting - * to register with an in-use name will return GIT_EEXISTS. - * @param filter The filter definition. This pointer will be stored as is - * by libgit2 so it must be a durable allocation (either static - * or on the heap). - * @param priority The priority for filter application - * @return 0 on successful registry, error code <0 on failure - */ -GIT_EXTERN(int) git_filter_register( - const char *name, git_filter *filter, int priority); - -/** - * Remove the filter with the given name - * - * Attempting to remove the builtin libgit2 filters is not permitted and - * will return an error. - * - * Currently the filter registry is not thread safe, so any registering or - * deregistering of filters must be done outside of any possible usage of - * the filters (i.e. during application setup or shutdown). - * - * @param name The name under which the filter was registered - * @return 0 on success, error code <0 on failure - */ -GIT_EXTERN(int) git_filter_unregister(const char *name); - -/** @} */ -GIT_END_DECL -#endif diff --git a/vendor/libgit2/include/git2/sys/hashsig.h b/vendor/libgit2/include/git2/sys/hashsig.h deleted file mode 100644 index 09c19aec07..0000000000 --- a/vendor/libgit2/include/git2/sys/hashsig.h +++ /dev/null @@ -1,106 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_sys_hashsig_h__ -#define INCLUDE_sys_hashsig_h__ - -#include "git2/common.h" - -GIT_BEGIN_DECL - -/** - * Similarity signature of arbitrary text content based on line hashes - */ -typedef struct git_hashsig git_hashsig; - -/** - * Options for hashsig computation - * - * The options GIT_HASHSIG_NORMAL, GIT_HASHSIG_IGNORE_WHITESPACE, - * GIT_HASHSIG_SMART_WHITESPACE are exclusive and should not be combined. - */ -typedef enum { - /** - * Use all data - */ - GIT_HASHSIG_NORMAL = 0, - - /** - * Ignore whitespace - */ - GIT_HASHSIG_IGNORE_WHITESPACE = (1 << 0), - - /** - * Ignore \r and all space after \n - */ - GIT_HASHSIG_SMART_WHITESPACE = (1 << 1), - - /** - * Allow hashing of small files - */ - GIT_HASHSIG_ALLOW_SMALL_FILES = (1 << 2) -} git_hashsig_option_t; - -/** - * Compute a similarity signature for a text buffer - * - * If you have passed the option GIT_HASHSIG_IGNORE_WHITESPACE, then the - * whitespace will be removed from the buffer while it is being processed, - * modifying the buffer in place. Sorry about that! - * - * @param out The computed similarity signature. - * @param buf The input buffer. - * @param buflen The input buffer size. - * @param opts The signature computation options (see above). - * @return 0 on success, GIT_EBUFS if the buffer doesn't contain enough data to - * compute a valid signature (unless GIT_HASHSIG_ALLOW_SMALL_FILES is set), or - * error code. - */ -GIT_EXTERN(int) git_hashsig_create( - git_hashsig **out, - const char *buf, - size_t buflen, - git_hashsig_option_t opts); - -/** - * Compute a similarity signature for a text file - * - * This walks through the file, only loading a maximum of 4K of file data at - * a time. Otherwise, it acts just like `git_hashsig_create`. - * - * @param out The computed similarity signature. - * @param path The path to the input file. - * @param opts The signature computation options (see above). - * @return 0 on success, GIT_EBUFS if the buffer doesn't contain enough data to - * compute a valid signature (unless GIT_HASHSIG_ALLOW_SMALL_FILES is set), or - * error code. - */ -GIT_EXTERN(int) git_hashsig_create_fromfile( - git_hashsig **out, - const char *path, - git_hashsig_option_t opts); - -/** - * Release memory for a content similarity signature - * - * @param sig The similarity signature to free. - */ -GIT_EXTERN(void) git_hashsig_free(git_hashsig *sig); - -/** - * Measure similarity score between two similarity signatures - * - * @param a The first similarity signature to compare. - * @param b The second similarity signature to compare. - * @return [0 to 100] on success as the similarity score, or error code. - */ -GIT_EXTERN(int) git_hashsig_compare( - const git_hashsig *a, - const git_hashsig *b); - -GIT_END_DECL - -#endif diff --git a/vendor/libgit2/include/git2/sys/index.h b/vendor/libgit2/include/git2/sys/index.h deleted file mode 100644 index 29a99f798a..0000000000 --- a/vendor/libgit2/include/git2/sys/index.h +++ /dev/null @@ -1,177 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_sys_git_index_h__ -#define INCLUDE_sys_git_index_h__ - -/** - * @file git2/sys/index.h - * @brief Low-level Git index manipulation routines - * @defgroup git_backend Git custom backend APIs - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** Representation of a rename conflict entry in the index. */ -typedef struct git_index_name_entry { - char *ancestor; - char *ours; - char *theirs; -} git_index_name_entry; - -/** Representation of a resolve undo entry in the index. */ -typedef struct git_index_reuc_entry { - unsigned int mode[3]; - git_oid oid[3]; - char *path; -} git_index_reuc_entry; - -/** @name Conflict Name entry functions - * - * These functions work on rename conflict entries. - */ -/**@{*/ - -/** - * Get the count of filename conflict entries currently in the index. - * - * @param index an existing index object - * @return integer of count of current filename conflict entries - */ -GIT_EXTERN(size_t) git_index_name_entrycount(git_index *index); - -/** - * Get a filename conflict entry from the index. - * - * The returned entry is read-only and should not be modified - * or freed by the caller. - * - * @param index an existing index object - * @param n the position of the entry - * @return a pointer to the filename conflict entry; NULL if out of bounds - */ -GIT_EXTERN(const git_index_name_entry *) git_index_name_get_byindex( - git_index *index, size_t n); - -/** - * Record the filenames involved in a rename conflict. - * - * @param index an existing index object - * @param ancestor the path of the file as it existed in the ancestor - * @param ours the path of the file as it existed in our tree - * @param theirs the path of the file as it existed in their tree - */ -GIT_EXTERN(int) git_index_name_add(git_index *index, - const char *ancestor, const char *ours, const char *theirs); - -/** - * Remove all filename conflict entries. - * - * @param index an existing index object - */ -GIT_EXTERN(void) git_index_name_clear(git_index *index); - -/**@}*/ - -/** @name Resolve Undo (REUC) index entry manipulation. - * - * These functions work on the Resolve Undo index extension and contains - * data about the original files that led to a merge conflict. - */ -/**@{*/ - -/** - * Get the count of resolve undo entries currently in the index. - * - * @param index an existing index object - * @return integer of count of current resolve undo entries - */ -GIT_EXTERN(size_t) git_index_reuc_entrycount(git_index *index); - -/** - * Finds the resolve undo entry that points to the given path in the Git - * index. - * - * @param at_pos the address to which the position of the reuc entry is written (optional) - * @param index an existing index object - * @param path path to search - * @return 0 if found, < 0 otherwise (GIT_ENOTFOUND) - */ -GIT_EXTERN(int) git_index_reuc_find(size_t *at_pos, git_index *index, const char *path); - -/** - * Get a resolve undo entry from the index. - * - * The returned entry is read-only and should not be modified - * or freed by the caller. - * - * @param index an existing index object - * @param path path to search - * @return the resolve undo entry; NULL if not found - */ -GIT_EXTERN(const git_index_reuc_entry *) git_index_reuc_get_bypath(git_index *index, const char *path); - -/** - * Get a resolve undo entry from the index. - * - * The returned entry is read-only and should not be modified - * or freed by the caller. - * - * @param index an existing index object - * @param n the position of the entry - * @return a pointer to the resolve undo entry; NULL if out of bounds - */ -GIT_EXTERN(const git_index_reuc_entry *) git_index_reuc_get_byindex(git_index *index, size_t n); - -/** - * Adds a resolve undo entry for a file based on the given parameters. - * - * The resolve undo entry contains the OIDs of files that were involved - * in a merge conflict after the conflict has been resolved. This allows - * conflicts to be re-resolved later. - * - * If there exists a resolve undo entry for the given path in the index, - * it will be removed. - * - * This method will fail in bare index instances. - * - * @param index an existing index object - * @param path filename to add - * @param ancestor_mode mode of the ancestor file - * @param ancestor_id oid of the ancestor file - * @param our_mode mode of our file - * @param our_id oid of our file - * @param their_mode mode of their file - * @param their_id oid of their file - * @return 0 or an error code - */ -GIT_EXTERN(int) git_index_reuc_add(git_index *index, const char *path, - int ancestor_mode, const git_oid *ancestor_id, - int our_mode, const git_oid *our_id, - int their_mode, const git_oid *their_id); - -/** - * Remove an resolve undo entry from the index - * - * @param index an existing index object - * @param n position of the resolve undo entry to remove - * @return 0 or an error code - */ -GIT_EXTERN(int) git_index_reuc_remove(git_index *index, size_t n); - -/** - * Remove all resolve undo entries from the index - * - * @param index an existing index object - */ -GIT_EXTERN(void) git_index_reuc_clear(git_index *index); - -/**@}*/ - -/** @} */ -GIT_END_DECL -#endif diff --git a/vendor/libgit2/include/git2/sys/mempack.h b/vendor/libgit2/include/git2/sys/mempack.h deleted file mode 100644 index 96074fb77c..0000000000 --- a/vendor/libgit2/include/git2/sys/mempack.h +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_sys_git_odb_mempack_h__ -#define INCLUDE_sys_git_odb_mempack_h__ - -#include "git2/common.h" -#include "git2/types.h" -#include "git2/oid.h" -#include "git2/odb.h" - -/** - * @file git2/sys/mempack.h - * @brief Custom ODB backend that permits packing objects in-memory - * @defgroup git_backend Git custom backend APIs - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** - * Instantiate a new mempack backend. - * - * The backend must be added to an existing ODB with the highest - * priority. - * - * git_mempack_new(&mempacker); - * git_repository_odb(&odb, repository); - * git_odb_add_backend(odb, mempacker, 999); - * - * Once the backend has been loaded, all writes to the ODB will - * instead be queued in memory, and can be finalized with - * `git_mempack_dump`. - * - * Subsequent reads will also be served from the in-memory store - * to ensure consistency, until the memory store is dumped. - * - * @param out Poiter where to store the ODB backend - * @return 0 on success; error code otherwise - */ -int git_mempack_new(git_odb_backend **out); - -/** - * Dump all the queued in-memory writes to a packfile. - * - * The contents of the packfile will be stored in the given buffer. - * It is the caller's responsibility to ensure that the generated - * packfile is available to the repository (e.g. by writing it - * to disk, or doing something crazy like distributing it across - * several copies of the repository over a network). - * - * Once the generated packfile is available to the repository, - * call `git_mempack_reset` to cleanup the memory store. - * - * Calling `git_mempack_reset` before the packfile has been - * written to disk will result in an inconsistent repository - * (the objects in the memory store won't be accessible). - * - * @param pack Buffer where to store the raw packfile - * @param repo The active repository where the backend is loaded - * @param backend The mempack backend - * @return 0 on success; error code otherwise - */ -int git_mempack_dump(git_buf *pack, git_repository *repo, git_odb_backend *backend); - -/** - * Reset the memory packer by clearing all the queued objects. - * - * This assumes that `git_mempack_dump` has been called before to - * store all the queued objects into a single packfile. - * - * Alternatively, call `reset` without a previous dump to "undo" - * all the recently written objects, giving transaction-like - * semantics to the Git repository. - * - * @param backend The mempack backend - */ -void git_mempack_reset(git_odb_backend *backend); - -GIT_END_DECL - -#endif diff --git a/vendor/libgit2/include/git2/sys/odb_backend.h b/vendor/libgit2/include/git2/sys/odb_backend.h deleted file mode 100644 index fe102ff3ca..0000000000 --- a/vendor/libgit2/include/git2/sys/odb_backend.h +++ /dev/null @@ -1,108 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_sys_git_odb_backend_h__ -#define INCLUDE_sys_git_odb_backend_h__ - -#include "git2/common.h" -#include "git2/types.h" -#include "git2/oid.h" -#include "git2/odb.h" - -/** - * @file git2/sys/backend.h - * @brief Git custom backend implementors functions - * @defgroup git_backend Git custom backend APIs - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** - * An instance for a custom backend - */ -struct git_odb_backend { - unsigned int version; - git_odb *odb; - - /* read and read_prefix each return to libgit2 a buffer which - * will be freed later. The buffer should be allocated using - * the function git_odb_backend_malloc to ensure that it can - * be safely freed later. */ - int (* read)( - void **, size_t *, git_otype *, git_odb_backend *, const git_oid *); - - /* To find a unique object given a prefix of its oid. The oid given - * must be so that the remaining (GIT_OID_HEXSZ - len)*4 bits are 0s. - */ - int (* read_prefix)( - git_oid *, void **, size_t *, git_otype *, - git_odb_backend *, const git_oid *, size_t); - - int (* read_header)( - size_t *, git_otype *, git_odb_backend *, const git_oid *); - - /** - * Write an object into the backend. The id of the object has - * already been calculated and is passed in. - */ - int (* write)( - git_odb_backend *, const git_oid *, const void *, size_t, git_otype); - - int (* writestream)( - git_odb_stream **, git_odb_backend *, git_off_t, git_otype); - - int (* readstream)( - git_odb_stream **, git_odb_backend *, const git_oid *); - - int (* exists)( - git_odb_backend *, const git_oid *); - - int (* exists_prefix)( - git_oid *, git_odb_backend *, const git_oid *, size_t); - - /** - * If the backend implements a refreshing mechanism, it should be exposed - * through this endpoint. Each call to `git_odb_refresh()` will invoke it. - * - * However, the backend implementation should try to stay up-to-date as much - * as possible by itself as libgit2 will not automatically invoke - * `git_odb_refresh()`. For instance, a potential strategy for the backend - * implementation to achieve this could be to internally invoke this - * endpoint on failed lookups (ie. `exists()`, `read()`, `read_header()`). - */ - int (* refresh)(git_odb_backend *); - - int (* foreach)( - git_odb_backend *, git_odb_foreach_cb cb, void *payload); - - int (* writepack)( - git_odb_writepack **, git_odb_backend *, git_odb *odb, - git_transfer_progress_cb progress_cb, void *progress_payload); - - void (* free)(git_odb_backend *); -}; - -#define GIT_ODB_BACKEND_VERSION 1 -#define GIT_ODB_BACKEND_INIT {GIT_ODB_BACKEND_VERSION} - -/** - * Initializes a `git_odb_backend` with default values. Equivalent to - * creating an instance with GIT_ODB_BACKEND_INIT. - * - * @param backend the `git_odb_backend` struct to initialize. - * @param version Version the struct; pass `GIT_ODB_BACKEND_VERSION` - * @return Zero on success; -1 on failure. - */ -GIT_EXTERN(int) git_odb_init_backend( - git_odb_backend *backend, - unsigned int version); - -GIT_EXTERN(void *) git_odb_backend_malloc(git_odb_backend *backend, size_t len); - -GIT_END_DECL - -#endif diff --git a/vendor/libgit2/include/git2/sys/openssl.h b/vendor/libgit2/include/git2/sys/openssl.h deleted file mode 100644 index b41c55c6d7..0000000000 --- a/vendor/libgit2/include/git2/sys/openssl.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_openssl_h__ -#define INCLUDE_git_openssl_h__ - -#include "git2/common.h" - -GIT_BEGIN_DECL - -/** - * Initialize the OpenSSL locks - * - * OpenSSL requires the application to determine how it performs - * locking. - * - * This is a last-resort convenience function which libgit2 provides for - * allocating and initializing the locks as well as setting the - * locking function to use the system's native locking functions. - * - * The locking function will be cleared and the memory will be freed - * when you call git_threads_sutdown(). - * - * If your programming language has an OpenSSL package/bindings, it - * likely sets up locking. You should very strongly prefer that over - * this function. - * - * @return 0 on success, -1 if there are errors or if libgit2 was not - * built with OpenSSL and threading support. - */ -GIT_EXTERN(int) git_openssl_set_locking(void); - -GIT_END_DECL -#endif - diff --git a/vendor/libgit2/include/git2/sys/refdb_backend.h b/vendor/libgit2/include/git2/sys/refdb_backend.h deleted file mode 100644 index 8b004a7e02..0000000000 --- a/vendor/libgit2/include/git2/sys/refdb_backend.h +++ /dev/null @@ -1,217 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_sys_git_refdb_backend_h__ -#define INCLUDE_sys_git_refdb_backend_h__ - -#include "git2/common.h" -#include "git2/types.h" -#include "git2/oid.h" - -/** - * @file git2/refdb_backend.h - * @brief Git custom refs backend functions - * @defgroup git_refdb_backend Git custom refs backend API - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - - -/** - * Every backend's iterator must have a pointer to itself as the first - * element, so the API can talk to it. You'd define your iterator as - * - * struct my_iterator { - * git_reference_iterator parent; - * ... - * } - * - * and assign `iter->parent.backend` to your `git_refdb_backend`. - */ -struct git_reference_iterator { - git_refdb *db; - - /** - * Return the current reference and advance the iterator. - */ - int (*next)( - git_reference **ref, - git_reference_iterator *iter); - - /** - * Return the name of the current reference and advance the iterator - */ - int (*next_name)( - const char **ref_name, - git_reference_iterator *iter); - - /** - * Free the iterator - */ - void (*free)( - git_reference_iterator *iter); -}; - -/** An instance for a custom backend */ -struct git_refdb_backend { - unsigned int version; - - /** - * Queries the refdb backend to determine if the given ref_name - * exists. A refdb implementation must provide this function. - */ - int (*exists)( - int *exists, - git_refdb_backend *backend, - const char *ref_name); - - /** - * Queries the refdb backend for a given reference. A refdb - * implementation must provide this function. - */ - int (*lookup)( - git_reference **out, - git_refdb_backend *backend, - const char *ref_name); - - /** - * Allocate an iterator object for the backend. - * - * A refdb implementation must provide this function. - */ - int (*iterator)( - git_reference_iterator **iter, - struct git_refdb_backend *backend, - const char *glob); - - /* - * Writes the given reference to the refdb. A refdb implementation - * must provide this function. - */ - int (*write)(git_refdb_backend *backend, - const git_reference *ref, int force, - const git_signature *who, const char *message, - const git_oid *old, const char *old_target); - - int (*rename)( - git_reference **out, git_refdb_backend *backend, - const char *old_name, const char *new_name, int force, - const git_signature *who, const char *message); - - /** - * Deletes the given reference from the refdb. A refdb implementation - * must provide this function. - */ - int (*del)(git_refdb_backend *backend, const char *ref_name, const git_oid *old_id, const char *old_target); - - /** - * Suggests that the given refdb compress or optimize its references. - * This mechanism is implementation specific. (For on-disk reference - * databases, this may pack all loose references.) A refdb - * implementation may provide this function; if it is not provided, - * nothing will be done. - */ - int (*compress)(git_refdb_backend *backend); - - /** - * Query whether a particular reference has a log (may be empty) - */ - int (*has_log)(git_refdb_backend *backend, const char *refname); - - /** - * Make sure a particular reference will have a reflog which - * will be appended to on writes. - */ - int (*ensure_log)(git_refdb_backend *backend, const char *refname); - - /** - * Frees any resources held by the refdb. A refdb implementation may - * provide this function; if it is not provided, nothing will be done. - */ - void (*free)(git_refdb_backend *backend); - - /** - * Read the reflog for the given reference name. - */ - int (*reflog_read)(git_reflog **out, git_refdb_backend *backend, const char *name); - - /** - * Write a reflog to disk. - */ - int (*reflog_write)(git_refdb_backend *backend, git_reflog *reflog); - - /** - * Rename a reflog - */ - int (*reflog_rename)(git_refdb_backend *_backend, const char *old_name, const char *new_name); - - /** - * Remove a reflog. - */ - int (*reflog_delete)(git_refdb_backend *backend, const char *name); - - /** - * Lock a reference. The opaque parameter will be passed to the unlock function - */ - int (*lock)(void **payload_out, git_refdb_backend *backend, const char *refname); - - /** - * Unlock a reference. Only one of target or symbolic_target - * will be set. success indicates whether to update the - * reference or discard the lock (if it's false) - */ - int (*unlock)(git_refdb_backend *backend, void *payload, int success, int update_reflog, - const git_reference *ref, const git_signature *sig, const char *message); -}; - -#define GIT_REFDB_BACKEND_VERSION 1 -#define GIT_REFDB_BACKEND_INIT {GIT_REFDB_BACKEND_VERSION} - -/** - * Initializes a `git_refdb_backend` with default values. Equivalent to - * creating an instance with GIT_REFDB_BACKEND_INIT. - * - * @param backend the `git_refdb_backend` struct to initialize - * @param version Version of struct; pass `GIT_REFDB_BACKEND_VERSION` - * @return Zero on success; -1 on failure. - */ -GIT_EXTERN(int) git_refdb_init_backend( - git_refdb_backend *backend, - unsigned int version); - -/** - * Constructors for default filesystem-based refdb backend - * - * Under normal usage, this is called for you when the repository is - * opened / created, but you can use this to explicitly construct a - * filesystem refdb backend for a repository. - * - * @param backend_out Output pointer to the git_refdb_backend object - * @param repo Git repository to access - * @return 0 on success, <0 error code on failure - */ -GIT_EXTERN(int) git_refdb_backend_fs( - git_refdb_backend **backend_out, - git_repository *repo); - -/** - * Sets the custom backend to an existing reference DB - * - * The `git_refdb` will take ownership of the `git_refdb_backend` so you - * should NOT free it after calling this function. - * - * @param refdb database to add the backend to - * @param backend pointer to a git_refdb_backend instance - * @return 0 on success; error code otherwise - */ -GIT_EXTERN(int) git_refdb_set_backend( - git_refdb *refdb, - git_refdb_backend *backend); - -GIT_END_DECL - -#endif diff --git a/vendor/libgit2/include/git2/sys/reflog.h b/vendor/libgit2/include/git2/sys/reflog.h deleted file mode 100644 index c9d0041b90..0000000000 --- a/vendor/libgit2/include/git2/sys/reflog.h +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_sys_git_reflog_h__ -#define INCLUDE_sys_git_reflog_h__ - -#include "git2/common.h" -#include "git2/types.h" -#include "git2/oid.h" - -GIT_BEGIN_DECL - -GIT_EXTERN(git_reflog_entry *) git_reflog_entry__alloc(void); -GIT_EXTERN(void) git_reflog_entry__free(git_reflog_entry *entry); - -GIT_END_DECL - -#endif diff --git a/vendor/libgit2/include/git2/sys/refs.h b/vendor/libgit2/include/git2/sys/refs.h deleted file mode 100644 index d2ce2e0b91..0000000000 --- a/vendor/libgit2/include/git2/sys/refs.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_sys_git_refdb_h__ -#define INCLUDE_sys_git_refdb_h__ - -#include "git2/common.h" -#include "git2/types.h" -#include "git2/oid.h" - -/** - * @file git2/sys/refs.h - * @brief Low-level Git ref creation - * @defgroup git_backend Git custom backend APIs - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** - * Create a new direct reference from an OID. - * - * @param name the reference name - * @param oid the object id for a direct reference - * @param peel the first non-tag object's OID, or NULL - * @return the created git_reference or NULL on error - */ -GIT_EXTERN(git_reference *) git_reference__alloc( - const char *name, - const git_oid *oid, - const git_oid *peel); - -/** - * Create a new symbolic reference. - * - * @param name the reference name - * @param target the target for a symbolic reference - * @return the created git_reference or NULL on error - */ -GIT_EXTERN(git_reference *) git_reference__alloc_symbolic( - const char *name, - const char *target); - -/** @} */ -GIT_END_DECL -#endif diff --git a/vendor/libgit2/include/git2/sys/repository.h b/vendor/libgit2/include/git2/sys/repository.h deleted file mode 100644 index 800396c867..0000000000 --- a/vendor/libgit2/include/git2/sys/repository.h +++ /dev/null @@ -1,140 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_sys_git_repository_h__ -#define INCLUDE_sys_git_repository_h__ - -#include "git2/common.h" -#include "git2/types.h" - -/** - * @file git2/sys/repository.h - * @brief Git repository custom implementation routines - * @defgroup git_backend Git custom backend APIs - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** - * Create a new repository with neither backends nor config object - * - * Note that this is only useful if you wish to associate the repository - * with a non-filesystem-backed object database and config store. - * - * @param out The blank repository - * @return 0 on success, or an error code - */ -GIT_EXTERN(int) git_repository_new(git_repository **out); - -/** - * Reset all the internal state in a repository. - * - * This will free all the mapped memory and internal objects - * of the repository and leave it in a "blank" state. - * - * There's no need to call this function directly unless you're - * trying to aggressively cleanup the repo before its - * deallocation. `git_repository_free` already performs this operation - * before deallocation the repo. - */ -GIT_EXTERN(void) git_repository__cleanup(git_repository *repo); - -/** - * Update the filesystem config settings for an open repository - * - * When a repository is initialized, config values are set based on the - * properties of the filesystem that the repository is on, such as - * "core.ignorecase", "core.filemode", "core.symlinks", etc. If the - * repository is moved to a new filesystem, these properties may no - * longer be correct and API calls may not behave as expected. This - * call reruns the phase of repository initialization that sets those - * properties to compensate for the current filesystem of the repo. - * - * @param repo A repository object - * @param recurse_submodules Should submodules be updated recursively - * @return 0 on success, < 0 on error - */ -GIT_EXTERN(int) git_repository_reinit_filesystem( - git_repository *repo, - int recurse_submodules); - -/** - * Set the configuration file for this repository - * - * This configuration file will be used for all configuration - * queries involving this repository. - * - * The repository will keep a reference to the config file; - * the user must still free the config after setting it - * to the repository, or it will leak. - * - * @param repo A repository object - * @param config A Config object - */ -GIT_EXTERN(void) git_repository_set_config(git_repository *repo, git_config *config); - -/** - * Set the Object Database for this repository - * - * The ODB will be used for all object-related operations - * involving this repository. - * - * The repository will keep a reference to the ODB; the user - * must still free the ODB object after setting it to the - * repository, or it will leak. - * - * @param repo A repository object - * @param odb An ODB object - */ -GIT_EXTERN(void) git_repository_set_odb(git_repository *repo, git_odb *odb); - -/** - * Set the Reference Database Backend for this repository - * - * The refdb will be used for all reference related operations - * involving this repository. - * - * The repository will keep a reference to the refdb; the user - * must still free the refdb object after setting it to the - * repository, or it will leak. - * - * @param repo A repository object - * @param refdb An refdb object - */ -GIT_EXTERN(void) git_repository_set_refdb(git_repository *repo, git_refdb *refdb); - -/** - * Set the index file for this repository - * - * This index will be used for all index-related operations - * involving this repository. - * - * The repository will keep a reference to the index file; - * the user must still free the index after setting it - * to the repository, or it will leak. - * - * @param repo A repository object - * @param index An index object - */ -GIT_EXTERN(void) git_repository_set_index(git_repository *repo, git_index *index); - -/** - * Set a repository to be bare. - * - * Clear the working directory and set core.bare to true. You may also - * want to call `git_repository_set_index(repo, NULL)` since a bare repo - * typically does not have an index, but this function will not do that - * for you. - * - * @param repo Repo to make bare - * @return 0 on success, <0 on failure - */ -GIT_EXTERN(int) git_repository_set_bare(git_repository *repo); - -/** @} */ -GIT_END_DECL -#endif diff --git a/vendor/libgit2/include/git2/sys/stream.h b/vendor/libgit2/include/git2/sys/stream.h deleted file mode 100644 index 55a714bbb1..0000000000 --- a/vendor/libgit2/include/git2/sys/stream.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_sys_git_stream_h__ -#define INCLUDE_sys_git_stream_h__ - -#include "git2/common.h" -#include "git2/types.h" - -GIT_BEGIN_DECL - -#define GIT_STREAM_VERSION 1 - -/** - * Every stream must have this struct as its first element, so the - * API can talk to it. You'd define your stream as - * - * struct my_stream { - * git_stream parent; - * ... - * } - * - * and fill the functions - */ -typedef struct git_stream { - int version; - - int encrypted; - int proxy_support; - int (*connect)(struct git_stream *); - int (*certificate)(git_cert **, struct git_stream *); - int (*set_proxy)(struct git_stream *, const char *proxy_url); - ssize_t (*read)(struct git_stream *, void *, size_t); - ssize_t (*write)(struct git_stream *, const char *, size_t, int); - int (*close)(struct git_stream *); - void (*free)(struct git_stream *); -} git_stream; - -GIT_END_DECL - -#endif diff --git a/vendor/libgit2/include/git2/sys/transport.h b/vendor/libgit2/include/git2/sys/transport.h deleted file mode 100644 index 867fbcbced..0000000000 --- a/vendor/libgit2/include/git2/sys/transport.h +++ /dev/null @@ -1,353 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#ifndef INCLUDE_sys_git_transport_h -#define INCLUDE_sys_git_transport_h - -#include "git2/net.h" -#include "git2/types.h" - -/** - * @file git2/sys/transport.h - * @brief Git custom transport registration interfaces and functions - * @defgroup git_transport Git custom transport registration - * @ingroup Git - * @{ - */ - -GIT_BEGIN_DECL - -/** - * Flags to pass to transport - * - * Currently unused. - */ -typedef enum { - GIT_TRANSPORTFLAGS_NONE = 0, -} git_transport_flags_t; - -struct git_transport { - unsigned int version; - /* Set progress and error callbacks */ - int (*set_callbacks)( - git_transport *transport, - git_transport_message_cb progress_cb, - git_transport_message_cb error_cb, - git_transport_certificate_check_cb certificate_check_cb, - void *payload); - - /* Connect the transport to the remote repository, using the given - * direction. */ - int (*connect)( - git_transport *transport, - const char *url, - git_cred_acquire_cb cred_acquire_cb, - void *cred_acquire_payload, - int direction, - int flags); - - /* This function may be called after a successful call to - * connect(). The array returned is owned by the transport and - * is guaranteed until the next call of a transport function. */ - int (*ls)( - const git_remote_head ***out, - size_t *size, - git_transport *transport); - - /* Executes the push whose context is in the git_push object. */ - int (*push)(git_transport *transport, git_push *push, const git_remote_callbacks *callbacks); - - /* This function may be called after a successful call to connect(), when - * the direction is FETCH. The function performs a negotiation to calculate - * the wants list for the fetch. */ - int (*negotiate_fetch)( - git_transport *transport, - git_repository *repo, - const git_remote_head * const *refs, - size_t count); - - /* This function may be called after a successful call to negotiate_fetch(), - * when the direction is FETCH. This function retrieves the pack file for - * the fetch from the remote end. */ - int (*download_pack)( - git_transport *transport, - git_repository *repo, - git_transfer_progress *stats, - git_transfer_progress_cb progress_cb, - void *progress_payload); - - /* Checks to see if the transport is connected */ - int (*is_connected)(git_transport *transport); - - /* Reads the flags value previously passed into connect() */ - int (*read_flags)(git_transport *transport, int *flags); - - /* Cancels any outstanding transport operation */ - void (*cancel)(git_transport *transport); - - /* This function is the reverse of connect() -- it terminates the - * connection to the remote end. */ - int (*close)(git_transport *transport); - - /* Frees/destructs the git_transport object. */ - void (*free)(git_transport *transport); -}; - -#define GIT_TRANSPORT_VERSION 1 -#define GIT_TRANSPORT_INIT {GIT_TRANSPORT_VERSION} - -/** - * Initializes a `git_transport` with default values. Equivalent to - * creating an instance with GIT_TRANSPORT_INIT. - * - * @param opts the `git_transport` struct to initialize - * @param version Version of struct; pass `GIT_TRANSPORT_VERSION` - * @return Zero on success; -1 on failure. - */ -GIT_EXTERN(int) git_transport_init( - git_transport *opts, - unsigned int version); - -/** - * Function to use to create a transport from a URL. The transport database - * is scanned to find a transport that implements the scheme of the URI (i.e. - * git:// or http://) and a transport object is returned to the caller. - * - * @param out The newly created transport (out) - * @param owner The git_remote which will own this transport - * @param url The URL to connect to - * @return 0 or an error code - */ -GIT_EXTERN(int) git_transport_new(git_transport **out, git_remote *owner, const char *url); - -/** - * Create an ssh transport with custom git command paths - * - * This is a factory function suitable for setting as the transport - * callback in a remote (or for a clone in the options). - * - * The payload argument must be a strarray pointer with the paths for - * the `git-upload-pack` and `git-receive-pack` at index 0 and 1. - * - * @param out the resulting transport - * @param owner the owning remote - * @param payload a strarray with the paths - * @return 0 or an error code - */ -GIT_EXTERN(int) git_transport_ssh_with_paths(git_transport **out, git_remote *owner, void *payload); - -/** - * Add a custom transport definition, to be used in addition to the built-in - * set of transports that come with libgit2. - * - * The caller is responsible for synchronizing calls to git_transport_register - * and git_transport_unregister with other calls to the library that - * instantiate transports. - * - * @param prefix The scheme (ending in "://") to match, i.e. "git://" - * @param cb The callback used to create an instance of the transport - * @param param A fixed parameter to pass to cb at creation time - * @return 0 or an error code - */ -GIT_EXTERN(int) git_transport_register( - const char *prefix, - git_transport_cb cb, - void *param); - -/** - * - * Unregister a custom transport definition which was previously registered - * with git_transport_register. - * - * @param prefix From the previous call to git_transport_register - * @return 0 or an error code - */ -GIT_EXTERN(int) git_transport_unregister( - const char *prefix); - -/* Transports which come with libgit2 (match git_transport_cb). The expected - * value for "param" is listed in-line below. */ - -/** - * Create an instance of the dummy transport. - * - * @param out The newly created transport (out) - * @param owner The git_remote which will own this transport - * @param payload You must pass NULL for this parameter. - * @return 0 or an error code - */ -GIT_EXTERN(int) git_transport_dummy( - git_transport **out, - git_remote *owner, - /* NULL */ void *payload); - -/** - * Create an instance of the local transport. - * - * @param out The newly created transport (out) - * @param owner The git_remote which will own this transport - * @param payload You must pass NULL for this parameter. - * @return 0 or an error code - */ -GIT_EXTERN(int) git_transport_local( - git_transport **out, - git_remote *owner, - /* NULL */ void *payload); - -/** - * Create an instance of the smart transport. - * - * @param out The newly created transport (out) - * @param owner The git_remote which will own this transport - * @param payload A pointer to a git_smart_subtransport_definition - * @return 0 or an error code - */ -GIT_EXTERN(int) git_transport_smart( - git_transport **out, - git_remote *owner, - /* (git_smart_subtransport_definition *) */ void *payload); - -/* - *** End of base transport interface *** - *** Begin interface for subtransports for the smart transport *** - */ - -/* The smart transport knows how to speak the git protocol, but it has no - * knowledge of how to establish a connection between it and another endpoint, - * or how to move data back and forth. For this, a subtransport interface is - * declared, and the smart transport delegates this work to the subtransports. - * Three subtransports are implemented: git, http, and winhttp. (The http and - * winhttp transports each implement both http and https.) */ - -/* Subtransports can either be RPC = 0 (persistent connection) or RPC = 1 - * (request/response). The smart transport handles the differences in its own - * logic. The git subtransport is RPC = 0, while http and winhttp are both - * RPC = 1. */ - -/* Actions that the smart transport can ask - * a subtransport to perform */ -typedef enum { - GIT_SERVICE_UPLOADPACK_LS = 1, - GIT_SERVICE_UPLOADPACK = 2, - GIT_SERVICE_RECEIVEPACK_LS = 3, - GIT_SERVICE_RECEIVEPACK = 4, -} git_smart_service_t; - -typedef struct git_smart_subtransport git_smart_subtransport; -typedef struct git_smart_subtransport_stream git_smart_subtransport_stream; - -/* A stream used by the smart transport to read and write data - * from a subtransport */ -struct git_smart_subtransport_stream { - /* The owning subtransport */ - git_smart_subtransport *subtransport; - - int (*read)( - git_smart_subtransport_stream *stream, - char *buffer, - size_t buf_size, - size_t *bytes_read); - - int (*write)( - git_smart_subtransport_stream *stream, - const char *buffer, - size_t len); - - void (*free)( - git_smart_subtransport_stream *stream); -}; - -/* An implementation of a subtransport which carries data for the - * smart transport */ -struct git_smart_subtransport { - int (* action)( - git_smart_subtransport_stream **out, - git_smart_subtransport *transport, - const char *url, - git_smart_service_t action); - - /* Subtransports are guaranteed a call to close() between - * calls to action(), except for the following two "natural" progressions - * of actions against a constant URL. - * - * 1. UPLOADPACK_LS -> UPLOADPACK - * 2. RECEIVEPACK_LS -> RECEIVEPACK */ - int (*close)(git_smart_subtransport *transport); - - void (*free)(git_smart_subtransport *transport); -}; - -/* A function which creates a new subtransport for the smart transport */ -typedef int (*git_smart_subtransport_cb)( - git_smart_subtransport **out, - git_transport* owner, - void* param); - -/** - * Definition for a "subtransport" - * - * This is used to let the smart protocol code know about the protocol - * which you are implementing. - */ -typedef struct git_smart_subtransport_definition { - /** The function to use to create the git_smart_subtransport */ - git_smart_subtransport_cb callback; - - /** - * True if the protocol is stateless; false otherwise. For example, - * http:// is stateless, but git:// is not. - */ - unsigned rpc; - - /** Param of the callback - */ - void* param; -} git_smart_subtransport_definition; - -/* Smart transport subtransports that come with libgit2 */ - -/** - * Create an instance of the http subtransport. This subtransport - * also supports https. On Win32, this subtransport may be implemented - * using the WinHTTP library. - * - * @param out The newly created subtransport - * @param owner The smart transport to own this subtransport - * @return 0 or an error code - */ -GIT_EXTERN(int) git_smart_subtransport_http( - git_smart_subtransport **out, - git_transport* owner, - void *param); - -/** - * Create an instance of the git subtransport. - * - * @param out The newly created subtransport - * @param owner The smart transport to own this subtransport - * @return 0 or an error code - */ -GIT_EXTERN(int) git_smart_subtransport_git( - git_smart_subtransport **out, - git_transport* owner, - void *param); - -/** - * Create an instance of the ssh subtransport. - * - * @param out The newly created subtransport - * @param owner The smart transport to own this subtransport - * @return 0 or an error code - */ -GIT_EXTERN(int) git_smart_subtransport_ssh( - git_smart_subtransport **out, - git_transport* owner, - void *param); - -/** @} */ -GIT_END_DECL -#endif diff --git a/vendor/libgit2/include/git2/tag.h b/vendor/libgit2/include/git2/tag.h deleted file mode 100644 index c822cee7cd..0000000000 --- a/vendor/libgit2/include/git2/tag.h +++ /dev/null @@ -1,352 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_tag_h__ -#define INCLUDE_git_tag_h__ - -#include "common.h" -#include "types.h" -#include "oid.h" -#include "object.h" -#include "strarray.h" - -/** - * @file git2/tag.h - * @brief Git tag parsing routines - * @defgroup git_tag Git tag management - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** - * Lookup a tag object from the repository. - * - * @param out pointer to the looked up tag - * @param repo the repo to use when locating the tag. - * @param id identity of the tag to locate. - * @return 0 or an error code - */ -GIT_EXTERN(int) git_tag_lookup( - git_tag **out, git_repository *repo, const git_oid *id); - -/** - * Lookup a tag object from the repository, - * given a prefix of its identifier (short id). - * - * @see git_object_lookup_prefix - * - * @param out pointer to the looked up tag - * @param repo the repo to use when locating the tag. - * @param id identity of the tag to locate. - * @param len the length of the short identifier - * @return 0 or an error code - */ -GIT_EXTERN(int) git_tag_lookup_prefix( - git_tag **out, git_repository *repo, const git_oid *id, size_t len); - -/** - * Close an open tag - * - * You can no longer use the git_tag pointer after this call. - * - * IMPORTANT: You MUST call this method when you are through with a tag to - * release memory. Failure to do so will cause a memory leak. - * - * @param tag the tag to close - */ -GIT_EXTERN(void) git_tag_free(git_tag *tag); - -/** - * Get the id of a tag. - * - * @param tag a previously loaded tag. - * @return object identity for the tag. - */ -GIT_EXTERN(const git_oid *) git_tag_id(const git_tag *tag); - -/** - * Get the repository that contains the tag. - * - * @param tag A previously loaded tag. - * @return Repository that contains this tag. - */ -GIT_EXTERN(git_repository *) git_tag_owner(const git_tag *tag); - -/** - * Get the tagged object of a tag - * - * This method performs a repository lookup for the - * given object and returns it - * - * @param target_out pointer where to store the target - * @param tag a previously loaded tag. - * @return 0 or an error code - */ -GIT_EXTERN(int) git_tag_target(git_object **target_out, const git_tag *tag); - -/** - * Get the OID of the tagged object of a tag - * - * @param tag a previously loaded tag. - * @return pointer to the OID - */ -GIT_EXTERN(const git_oid *) git_tag_target_id(const git_tag *tag); - -/** - * Get the type of a tag's tagged object - * - * @param tag a previously loaded tag. - * @return type of the tagged object - */ -GIT_EXTERN(git_otype) git_tag_target_type(const git_tag *tag); - -/** - * Get the name of a tag - * - * @param tag a previously loaded tag. - * @return name of the tag - */ -GIT_EXTERN(const char *) git_tag_name(const git_tag *tag); - -/** - * Get the tagger (author) of a tag - * - * @param tag a previously loaded tag. - * @return reference to the tag's author or NULL when unspecified - */ -GIT_EXTERN(const git_signature *) git_tag_tagger(const git_tag *tag); - -/** - * Get the message of a tag - * - * @param tag a previously loaded tag. - * @return message of the tag or NULL when unspecified - */ -GIT_EXTERN(const char *) git_tag_message(const git_tag *tag); - - -/** - * Create a new tag in the repository from an object - * - * A new reference will also be created pointing to - * this tag object. If `force` is true and a reference - * already exists with the given name, it'll be replaced. - * - * The message will not be cleaned up. This can be achieved - * through `git_message_prettify()`. - * - * The tag name will be checked for validity. You must avoid - * the characters '~', '^', ':', '\\', '?', '[', and '*', and the - * sequences ".." and "@{" which have special meaning to revparse. - * - * @param oid Pointer where to store the OID of the - * newly created tag. If the tag already exists, this parameter - * will be the oid of the existing tag, and the function will - * return a GIT_EEXISTS error code. - * - * @param repo Repository where to store the tag - * - * @param tag_name Name for the tag; this name is validated - * for consistency. It should also not conflict with an - * already existing tag name - * - * @param target Object to which this tag points. This object - * must belong to the given `repo`. - * - * @param tagger Signature of the tagger for this tag, and - * of the tagging time - * - * @param message Full message for this tag - * - * @param force Overwrite existing references - * - * @return 0 on success, GIT_EINVALIDSPEC or an error code - * A tag object is written to the ODB, and a proper reference - * is written in the /refs/tags folder, pointing to it - */ -GIT_EXTERN(int) git_tag_create( - git_oid *oid, - git_repository *repo, - const char *tag_name, - const git_object *target, - const git_signature *tagger, - const char *message, - int force); - -/** - * Create a new tag in the object database pointing to a git_object - * - * The message will not be cleaned up. This can be achieved - * through `git_message_prettify()`. - * - * @param oid Pointer where to store the OID of the - * newly created tag - * - * @param repo Repository where to store the tag - * - * @param tag_name Name for the tag - * - * @param target Object to which this tag points. This object - * must belong to the given `repo`. - * - * @param tagger Signature of the tagger for this tag, and - * of the tagging time - * - * @param message Full message for this tag - * - * @return 0 on success or an error code - */ -GIT_EXTERN(int) git_tag_annotation_create( - git_oid *oid, - git_repository *repo, - const char *tag_name, - const git_object *target, - const git_signature *tagger, - const char *message); - -/** - * Create a new tag in the repository from a buffer - * - * @param oid Pointer where to store the OID of the newly created tag - * @param repo Repository where to store the tag - * @param buffer Raw tag data - * @param force Overwrite existing tags - * @return 0 on success; error code otherwise - */ -GIT_EXTERN(int) git_tag_create_frombuffer( - git_oid *oid, - git_repository *repo, - const char *buffer, - int force); - -/** - * Create a new lightweight tag pointing at a target object - * - * A new direct reference will be created pointing to - * this target object. If `force` is true and a reference - * already exists with the given name, it'll be replaced. - * - * The tag name will be checked for validity. - * See `git_tag_create()` for rules about valid names. - * - * @param oid Pointer where to store the OID of the provided - * target object. If the tag already exists, this parameter - * will be filled with the oid of the existing pointed object - * and the function will return a GIT_EEXISTS error code. - * - * @param repo Repository where to store the lightweight tag - * - * @param tag_name Name for the tag; this name is validated - * for consistency. It should also not conflict with an - * already existing tag name - * - * @param target Object to which this tag points. This object - * must belong to the given `repo`. - * - * @param force Overwrite existing references - * - * @return 0 on success, GIT_EINVALIDSPEC or an error code - * A proper reference is written in the /refs/tags folder, - * pointing to the provided target object - */ -GIT_EXTERN(int) git_tag_create_lightweight( - git_oid *oid, - git_repository *repo, - const char *tag_name, - const git_object *target, - int force); - -/** - * Delete an existing tag reference. - * - * The tag name will be checked for validity. - * See `git_tag_create()` for rules about valid names. - * - * @param repo Repository where lives the tag - * - * @param tag_name Name of the tag to be deleted; - * this name is validated for consistency. - * - * @return 0 on success, GIT_EINVALIDSPEC or an error code - */ -GIT_EXTERN(int) git_tag_delete( - git_repository *repo, - const char *tag_name); - -/** - * Fill a list with all the tags in the Repository - * - * The string array will be filled with the names of the - * matching tags; these values are owned by the user and - * should be free'd manually when no longer needed, using - * `git_strarray_free`. - * - * @param tag_names Pointer to a git_strarray structure where - * the tag names will be stored - * @param repo Repository where to find the tags - * @return 0 or an error code - */ -GIT_EXTERN(int) git_tag_list( - git_strarray *tag_names, - git_repository *repo); - -/** - * Fill a list with all the tags in the Repository - * which name match a defined pattern - * - * If an empty pattern is provided, all the tags - * will be returned. - * - * The string array will be filled with the names of the - * matching tags; these values are owned by the user and - * should be free'd manually when no longer needed, using - * `git_strarray_free`. - * - * @param tag_names Pointer to a git_strarray structure where - * the tag names will be stored - * @param pattern Standard fnmatch pattern - * @param repo Repository where to find the tags - * @return 0 or an error code - */ -GIT_EXTERN(int) git_tag_list_match( - git_strarray *tag_names, - const char *pattern, - git_repository *repo); - - -typedef int (*git_tag_foreach_cb)(const char *name, git_oid *oid, void *payload); - -/** - * Call callback `cb' for each tag in the repository - * - * @param repo Repository - * @param callback Callback function - * @param payload Pointer to callback data (optional) - */ -GIT_EXTERN(int) git_tag_foreach( - git_repository *repo, - git_tag_foreach_cb callback, - void *payload); - - -/** - * Recursively peel a tag until a non tag git_object is found - * - * The retrieved `tag_target` object is owned by the repository - * and should be closed with the `git_object_free` method. - * - * @param tag_target_out Pointer to the peeled git_object - * @param tag The tag to be processed - * @return 0 or an error code - */ -GIT_EXTERN(int) git_tag_peel( - git_object **tag_target_out, - const git_tag *tag); - -/** @} */ -GIT_END_DECL -#endif diff --git a/vendor/libgit2/include/git2/trace.h b/vendor/libgit2/include/git2/trace.h deleted file mode 100644 index f9b4d6ff67..0000000000 --- a/vendor/libgit2/include/git2/trace.h +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_trace_h__ -#define INCLUDE_git_trace_h__ - -#include "common.h" -#include "types.h" - -/** - * @file git2/trace.h - * @brief Git tracing configuration routines - * @defgroup git_trace Git tracing configuration routines - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** - * Available tracing levels. When tracing is set to a particular level, - * callers will be provided tracing at the given level and all lower levels. - */ -typedef enum { - /** No tracing will be performed. */ - GIT_TRACE_NONE = 0, - - /** Severe errors that may impact the program's execution */ - GIT_TRACE_FATAL = 1, - - /** Errors that do not impact the program's execution */ - GIT_TRACE_ERROR = 2, - - /** Warnings that suggest abnormal data */ - GIT_TRACE_WARN = 3, - - /** Informational messages about program execution */ - GIT_TRACE_INFO = 4, - - /** Detailed data that allows for debugging */ - GIT_TRACE_DEBUG = 5, - - /** Exceptionally detailed debugging data */ - GIT_TRACE_TRACE = 6 -} git_trace_level_t; - -/** - * An instance for a tracing function - */ -typedef void (*git_trace_callback)(git_trace_level_t level, const char *msg); - -/** - * Sets the system tracing configuration to the specified level with the - * specified callback. When system events occur at a level equal to, or - * lower than, the given level they will be reported to the given callback. - * - * @param level Level to set tracing to - * @param cb Function to call with trace data - * @return 0 or an error code - */ -GIT_EXTERN(int) git_trace_set(git_trace_level_t level, git_trace_callback cb); - -/** @} */ -GIT_END_DECL -#endif diff --git a/vendor/libgit2/include/git2/transaction.h b/vendor/libgit2/include/git2/transaction.h deleted file mode 100644 index 64abb0c698..0000000000 --- a/vendor/libgit2/include/git2/transaction.h +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_transaction_h__ -#define INCLUDE_git_transaction_h__ - -#include "common.h" -GIT_BEGIN_DECL - -/** - * Create a new transaction object - * - * This does not lock anything, but sets up the transaction object to - * know from which repository to lock. - * - * @param out the resulting transaction - * @param repo the repository in which to lock - * @return 0 or an error code - */ -GIT_EXTERN(int) git_transaction_new(git_transaction **out, git_repository *repo); - -/** - * Lock a reference - * - * Lock the specified reference. This is the first step to updating a - * reference. - * - * @param tx the transaction - * @param refname the reference to lock - * @return 0 or an error message - */ -GIT_EXTERN(int) git_transaction_lock_ref(git_transaction *tx, const char *refname); - -/** - * Set the target of a reference - * - * Set the target of the specified reference. This reference must be - * locked. - * - * @param tx the transaction - * @param refname reference to update - * @param target target to set the reference to - * @param sig signature to use in the reflog; pass NULL to read the identity from the config - * @param msg message to use in the reflog - * @return 0, GIT_ENOTFOUND if the reference is not among the locked ones, or an error code - */ -GIT_EXTERN(int) git_transaction_set_target(git_transaction *tx, const char *refname, const git_oid *target, const git_signature *sig, const char *msg); - -/** - * Set the target of a reference - * - * Set the target of the specified reference. This reference must be - * locked. - * - * @param tx the transaction - * @param refname reference to update - * @param target target to set the reference to - * @param sig signature to use in the reflog; pass NULL to read the identity from the config - * @param msg message to use in the reflog - * @return 0, GIT_ENOTFOUND if the reference is not among the locked ones, or an error code - */ -GIT_EXTERN(int) git_transaction_set_symbolic_target(git_transaction *tx, const char *refname, const char *target, const git_signature *sig, const char *msg); - -/** - * Set the reflog of a reference - * - * Set the specified reference's reflog. If this is combined with - * setting the target, that update won't be written to the reflog. - * - * @param tx the transaction - * @param refname the reference whose reflog to set - * @param reflog the reflog as it should be written out - * @return 0, GIT_ENOTFOUND if the reference is not among the locked ones, or an error code - */ -GIT_EXTERN(int) git_transaction_set_reflog(git_transaction *tx, const char *refname, const git_reflog *reflog); - -/** - * Remove a reference - * - * @param tx the transaction - * @param refname the reference to remove - * @return 0, GIT_ENOTFOUND if the reference is not among the locked ones, or an error code - */ -GIT_EXTERN(int) git_transaction_remove(git_transaction *tx, const char *refname); - -/** - * Commit the changes from the transaction - * - * Perform the changes that have been queued. The updates will be made - * one by one, and the first failure will stop the processing. - * - * @param tx the transaction - * @return 0 or an error code - */ -GIT_EXTERN(int) git_transaction_commit(git_transaction *tx); - -/** - * Free the resources allocated by this transaction - * - * If any references remain locked, they will be unlocked without any - * changes made to them. - * - * @param tx the transaction - */ -GIT_EXTERN(void) git_transaction_free(git_transaction *tx); - -GIT_END_DECL -#endif diff --git a/vendor/libgit2/include/git2/transport.h b/vendor/libgit2/include/git2/transport.h deleted file mode 100644 index 2eeebd5658..0000000000 --- a/vendor/libgit2/include/git2/transport.h +++ /dev/null @@ -1,338 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_transport_h__ -#define INCLUDE_git_transport_h__ - -#include "indexer.h" -#include "net.h" -#include "types.h" - -/** - * @file git2/transport.h - * @brief Git transport interfaces and functions - * @defgroup git_transport interfaces and functions - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** Signature of a function which creates a transport */ -typedef int (*git_transport_cb)(git_transport **out, git_remote *owner, void *param); - -/** - * Type of SSH host fingerprint - */ -typedef enum { - /** MD5 is available */ - GIT_CERT_SSH_MD5 = (1 << 0), - /** SHA-1 is available */ - GIT_CERT_SSH_SHA1 = (1 << 1), -} git_cert_ssh_t; - -/** - * Hostkey information taken from libssh2 - */ -typedef struct { - /** - * Type of certificate. Here to share the header with - * `git_cert`. - */ - git_cert_t cert_type; - /** - * A hostkey type from libssh2, either - * `GIT_CERT_SSH_MD5` or `GIT_CERT_SSH_SHA1` - */ - git_cert_ssh_t type; - - /** - * Hostkey hash. If type has `GIT_CERT_SSH_MD5` set, this will - * have the MD5 hash of the hostkey. - */ - unsigned char hash_md5[16]; - - /** - * Hostkey hash. If type has `GIT_CERT_SSH_SHA1` set, this will - * have the SHA-1 hash of the hostkey. - */ - unsigned char hash_sha1[20]; -} git_cert_hostkey; - -/** - * X.509 certificate information - */ -typedef struct { - /** - * Type of certificate. Here to share the header with - * `git_cert`. - */ - git_cert_t cert_type; - /** - * Pointer to the X.509 certificate data - */ - void *data; - /** - * Length of the memory block pointed to by `data`. - */ - size_t len; -} git_cert_x509; - -/* - *** Begin interface for credentials acquisition *** - */ - -/** Authentication type requested */ -typedef enum { - /* git_cred_userpass_plaintext */ - GIT_CREDTYPE_USERPASS_PLAINTEXT = (1u << 0), - - /* git_cred_ssh_key */ - GIT_CREDTYPE_SSH_KEY = (1u << 1), - - /* git_cred_ssh_custom */ - GIT_CREDTYPE_SSH_CUSTOM = (1u << 2), - - /* git_cred_default */ - GIT_CREDTYPE_DEFAULT = (1u << 3), - - /* git_cred_ssh_interactive */ - GIT_CREDTYPE_SSH_INTERACTIVE = (1u << 4), - - /** - * Username-only information - * - * If the SSH transport does not know which username to use, - * it will ask via this credential type. - */ - GIT_CREDTYPE_USERNAME = (1u << 5), - - /** - * Credentials read from memory. - * - * Only available for libssh2+OpenSSL for now. - */ - GIT_CREDTYPE_SSH_MEMORY = (1u << 6), -} git_credtype_t; - -/* The base structure for all credential types */ -typedef struct git_cred git_cred; - -struct git_cred { - git_credtype_t credtype; - void (*free)(git_cred *cred); -}; - -/** A plaintext username and password */ -typedef struct { - git_cred parent; - char *username; - char *password; -} git_cred_userpass_plaintext; - - -/* - * If the user hasn't included libssh2.h before git2.h, we need to - * define a few types for the callback signatures. - */ -#ifndef LIBSSH2_VERSION -typedef struct _LIBSSH2_SESSION LIBSSH2_SESSION; -typedef struct _LIBSSH2_USERAUTH_KBDINT_PROMPT LIBSSH2_USERAUTH_KBDINT_PROMPT; -typedef struct _LIBSSH2_USERAUTH_KBDINT_RESPONSE LIBSSH2_USERAUTH_KBDINT_RESPONSE; -#endif - -typedef int (*git_cred_sign_callback)(LIBSSH2_SESSION *session, unsigned char **sig, size_t *sig_len, const unsigned char *data, size_t data_len, void **abstract); -typedef void (*git_cred_ssh_interactive_callback)(const char* name, int name_len, const char* instruction, int instruction_len, int num_prompts, const LIBSSH2_USERAUTH_KBDINT_PROMPT* prompts, LIBSSH2_USERAUTH_KBDINT_RESPONSE* responses, void **abstract); - -/** - * A ssh key from disk - */ -typedef struct git_cred_ssh_key { - git_cred parent; - char *username; - char *publickey; - char *privatekey; - char *passphrase; -} git_cred_ssh_key; - -/** - * Keyboard-interactive based ssh authentication - */ -typedef struct git_cred_ssh_interactive { - git_cred parent; - char *username; - git_cred_ssh_interactive_callback prompt_callback; - void *payload; -} git_cred_ssh_interactive; - -/** - * A key with a custom signature function - */ -typedef struct git_cred_ssh_custom { - git_cred parent; - char *username; - char *publickey; - size_t publickey_len; - git_cred_sign_callback sign_callback; - void *payload; -} git_cred_ssh_custom; - -/** A key for NTLM/Kerberos "default" credentials */ -typedef struct git_cred git_cred_default; - -/** Username-only credential information */ -typedef struct git_cred_username { - git_cred parent; - char username[1]; -} git_cred_username; - -/** - * Check whether a credential object contains username information. - * - * @param cred object to check - * @return 1 if the credential object has non-NULL username, 0 otherwise - */ -GIT_EXTERN(int) git_cred_has_username(git_cred *cred); - -/** - * Create a new plain-text username and password credential object. - * The supplied credential parameter will be internally duplicated. - * - * @param out The newly created credential object. - * @param username The username of the credential. - * @param password The password of the credential. - * @return 0 for success or an error code for failure - */ -GIT_EXTERN(int) git_cred_userpass_plaintext_new( - git_cred **out, - const char *username, - const char *password); - -/** - * Create a new passphrase-protected ssh key credential object. - * The supplied credential parameter will be internally duplicated. - * - * @param out The newly created credential object. - * @param username username to use to authenticate - * @param publickey The path to the public key of the credential. - * @param privatekey The path to the private key of the credential. - * @param passphrase The passphrase of the credential. - * @return 0 for success or an error code for failure - */ -GIT_EXTERN(int) git_cred_ssh_key_new( - git_cred **out, - const char *username, - const char *publickey, - const char *privatekey, - const char *passphrase); - -/** - * Create a new ssh keyboard-interactive based credential object. - * The supplied credential parameter will be internally duplicated. - * - * @param username Username to use to authenticate. - * @param prompt_callback The callback method used for prompts. - * @param payload Additional data to pass to the callback. - * @return 0 for success or an error code for failure. - */ -GIT_EXTERN(int) git_cred_ssh_interactive_new( - git_cred **out, - const char *username, - git_cred_ssh_interactive_callback prompt_callback, - void *payload); - -/** - * Create a new ssh key credential object used for querying an ssh-agent. - * The supplied credential parameter will be internally duplicated. - * - * @param out The newly created credential object. - * @param username username to use to authenticate - * @return 0 for success or an error code for failure - */ -GIT_EXTERN(int) git_cred_ssh_key_from_agent( - git_cred **out, - const char *username); - -/** - * Create an ssh key credential with a custom signing function. - * - * This lets you use your own function to sign the challenge. - * - * This function and its credential type is provided for completeness - * and wraps `libssh2_userauth_publickey()`, which is undocumented. - * - * The supplied credential parameter will be internally duplicated. - * - * @param out The newly created credential object. - * @param username username to use to authenticate - * @param publickey The bytes of the public key. - * @param publickey_len The length of the public key in bytes. - * @param sign_callback The callback method to sign the data during the challenge. - * @param payload Additional data to pass to the callback. - * @return 0 for success or an error code for failure - */ -GIT_EXTERN(int) git_cred_ssh_custom_new( - git_cred **out, - const char *username, - const char *publickey, - size_t publickey_len, - git_cred_sign_callback sign_callback, - void *payload); - -/** - * Create a "default" credential usable for Negotiate mechanisms like NTLM - * or Kerberos authentication. - * - * @return 0 for success or an error code for failure - */ -GIT_EXTERN(int) git_cred_default_new(git_cred **out); - -/** - * Create a credential to specify a username. - * - * This is used with ssh authentication to query for the username if - * none is specified in the url. - */ -GIT_EXTERN(int) git_cred_username_new(git_cred **cred, const char *username); - -/** - * Create a new ssh key credential object reading the keys from memory. - * - * @param out The newly created credential object. - * @param username username to use to authenticate. - * @param publickey The public key of the credential. - * @param privatekey The private key of the credential. - * @param passphrase The passphrase of the credential. - * @return 0 for success or an error code for failure - */ -GIT_EXTERN(int) git_cred_ssh_key_memory_new( - git_cred **out, - const char *username, - const char *publickey, - const char *privatekey, - const char *passphrase); - -/** - * Signature of a function which acquires a credential object. - * - * - cred: The newly created credential object. - * - url: The resource for which we are demanding a credential. - * - username_from_url: The username that was embedded in a "user\@host" - * remote url, or NULL if not included. - * - allowed_types: A bitmask stating which cred types are OK to return. - * - payload: The payload provided when specifying this callback. - * - returns 0 for success, < 0 to indicate an error, > 0 to indicate - * no credential was acquired - */ -typedef int (*git_cred_acquire_cb)( - git_cred **cred, - const char *url, - const char *username_from_url, - unsigned int allowed_types, - void *payload); - -/** @} */ -GIT_END_DECL -#endif diff --git a/vendor/libgit2/include/git2/tree.h b/vendor/libgit2/include/git2/tree.h deleted file mode 100644 index 550a448573..0000000000 --- a/vendor/libgit2/include/git2/tree.h +++ /dev/null @@ -1,415 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_tree_h__ -#define INCLUDE_git_tree_h__ - -#include "common.h" -#include "types.h" -#include "oid.h" -#include "object.h" - -/** - * @file git2/tree.h - * @brief Git tree parsing, loading routines - * @defgroup git_tree Git tree parsing, loading routines - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** - * Lookup a tree object from the repository. - * - * @param out Pointer to the looked up tree - * @param repo The repo to use when locating the tree. - * @param id Identity of the tree to locate. - * @return 0 or an error code - */ -GIT_EXTERN(int) git_tree_lookup( - git_tree **out, git_repository *repo, const git_oid *id); - -/** - * Lookup a tree object from the repository, - * given a prefix of its identifier (short id). - * - * @see git_object_lookup_prefix - * - * @param out pointer to the looked up tree - * @param repo the repo to use when locating the tree. - * @param id identity of the tree to locate. - * @param len the length of the short identifier - * @return 0 or an error code - */ -GIT_EXTERN(int) git_tree_lookup_prefix( - git_tree **out, - git_repository *repo, - const git_oid *id, - size_t len); - -/** - * Close an open tree - * - * You can no longer use the git_tree pointer after this call. - * - * IMPORTANT: You MUST call this method when you stop using a tree to - * release memory. Failure to do so will cause a memory leak. - * - * @param tree The tree to close - */ -GIT_EXTERN(void) git_tree_free(git_tree *tree); - -/** - * Get the id of a tree. - * - * @param tree a previously loaded tree. - * @return object identity for the tree. - */ -GIT_EXTERN(const git_oid *) git_tree_id(const git_tree *tree); - -/** - * Get the repository that contains the tree. - * - * @param tree A previously loaded tree. - * @return Repository that contains this tree. - */ -GIT_EXTERN(git_repository *) git_tree_owner(const git_tree *tree); - -/** - * Get the number of entries listed in a tree - * - * @param tree a previously loaded tree. - * @return the number of entries in the tree - */ -GIT_EXTERN(size_t) git_tree_entrycount(const git_tree *tree); - -/** - * Lookup a tree entry by its filename - * - * This returns a git_tree_entry that is owned by the git_tree. You don't - * have to free it, but you must not use it after the git_tree is released. - * - * @param tree a previously loaded tree. - * @param filename the filename of the desired entry - * @return the tree entry; NULL if not found - */ -GIT_EXTERN(const git_tree_entry *) git_tree_entry_byname( - const git_tree *tree, const char *filename); - -/** - * Lookup a tree entry by its position in the tree - * - * This returns a git_tree_entry that is owned by the git_tree. You don't - * have to free it, but you must not use it after the git_tree is released. - * - * @param tree a previously loaded tree. - * @param idx the position in the entry list - * @return the tree entry; NULL if not found - */ -GIT_EXTERN(const git_tree_entry *) git_tree_entry_byindex( - const git_tree *tree, size_t idx); - -/** - * Lookup a tree entry by SHA value. - * - * This returns a git_tree_entry that is owned by the git_tree. You don't - * have to free it, but you must not use it after the git_tree is released. - * - * Warning: this must examine every entry in the tree, so it is not fast. - * - * @param tree a previously loaded tree. - * @param id the sha being looked for - * @return the tree entry; NULL if not found - */ -GIT_EXTERN(const git_tree_entry *) git_tree_entry_byid( - const git_tree *tree, const git_oid *id); - -/** - * Retrieve a tree entry contained in a tree or in any of its subtrees, - * given its relative path. - * - * Unlike the other lookup functions, the returned tree entry is owned by - * the user and must be freed explicitly with `git_tree_entry_free()`. - * - * @param out Pointer where to store the tree entry - * @param root Previously loaded tree which is the root of the relative path - * @param path Path to the contained entry - * @return 0 on success; GIT_ENOTFOUND if the path does not exist - */ -GIT_EXTERN(int) git_tree_entry_bypath( - git_tree_entry **out, - const git_tree *root, - const char *path); - -/** - * Duplicate a tree entry - * - * Create a copy of a tree entry. The returned copy is owned by the user, - * and must be freed explicitly with `git_tree_entry_free()`. - * - * @param dest pointer where to store the copy - * @param source tree entry to duplicate - * @return 0 or an error code - */ -GIT_EXTERN(int) git_tree_entry_dup(git_tree_entry **dest, const git_tree_entry *source); - -/** - * Free a user-owned tree entry - * - * IMPORTANT: This function is only needed for tree entries owned by the - * user, such as the ones returned by `git_tree_entry_dup()` or - * `git_tree_entry_bypath()`. - * - * @param entry The entry to free - */ -GIT_EXTERN(void) git_tree_entry_free(git_tree_entry *entry); - -/** - * Get the filename of a tree entry - * - * @param entry a tree entry - * @return the name of the file - */ -GIT_EXTERN(const char *) git_tree_entry_name(const git_tree_entry *entry); - -/** - * Get the id of the object pointed by the entry - * - * @param entry a tree entry - * @return the oid of the object - */ -GIT_EXTERN(const git_oid *) git_tree_entry_id(const git_tree_entry *entry); - -/** - * Get the type of the object pointed by the entry - * - * @param entry a tree entry - * @return the type of the pointed object - */ -GIT_EXTERN(git_otype) git_tree_entry_type(const git_tree_entry *entry); - -/** - * Get the UNIX file attributes of a tree entry - * - * @param entry a tree entry - * @return filemode as an integer - */ -GIT_EXTERN(git_filemode_t) git_tree_entry_filemode(const git_tree_entry *entry); - -/** - * Get the raw UNIX file attributes of a tree entry - * - * This function does not perform any normalization and is only useful - * if you need to be able to recreate the original tree object. - * - * @param entry a tree entry - * @return filemode as an integer - */ - -GIT_EXTERN(git_filemode_t) git_tree_entry_filemode_raw(const git_tree_entry *entry); -/** - * Compare two tree entries - * - * @param e1 first tree entry - * @param e2 second tree entry - * @return <0 if e1 is before e2, 0 if e1 == e2, >0 if e1 is after e2 - */ -GIT_EXTERN(int) git_tree_entry_cmp(const git_tree_entry *e1, const git_tree_entry *e2); - -/** - * Convert a tree entry to the git_object it points to. - * - * You must call `git_object_free()` on the object when you are done with it. - * - * @param object_out pointer to the converted object - * @param repo repository where to lookup the pointed object - * @param entry a tree entry - * @return 0 or an error code - */ -GIT_EXTERN(int) git_tree_entry_to_object( - git_object **object_out, - git_repository *repo, - const git_tree_entry *entry); - -/** - * Create a new tree builder. - * - * The tree builder can be used to create or modify trees in memory and - * write them as tree objects to the database. - * - * If the `source` parameter is not NULL, the tree builder will be - * initialized with the entries of the given tree. - * - * If the `source` parameter is NULL, the tree builder will start with no - * entries and will have to be filled manually. - * - * @param out Pointer where to store the tree builder - * @param repo Repository in which to store the object - * @param source Source tree to initialize the builder (optional) - * @return 0 on success; error code otherwise - */ -GIT_EXTERN(int) git_treebuilder_new( - git_treebuilder **out, git_repository *repo, const git_tree *source); - -/** - * Clear all the entires in the builder - * - * @param bld Builder to clear - */ -GIT_EXTERN(void) git_treebuilder_clear(git_treebuilder *bld); - -/** - * Get the number of entries listed in a treebuilder - * - * @param bld a previously loaded treebuilder. - * @return the number of entries in the treebuilder - */ -GIT_EXTERN(unsigned int) git_treebuilder_entrycount(git_treebuilder *bld); - -/** - * Free a tree builder - * - * This will clear all the entries and free to builder. - * Failing to free the builder after you're done using it - * will result in a memory leak - * - * @param bld Builder to free - */ -GIT_EXTERN(void) git_treebuilder_free(git_treebuilder *bld); - -/** - * Get an entry from the builder from its filename - * - * The returned entry is owned by the builder and should - * not be freed manually. - * - * @param bld Tree builder - * @param filename Name of the entry - * @return pointer to the entry; NULL if not found - */ -GIT_EXTERN(const git_tree_entry *) git_treebuilder_get( - git_treebuilder *bld, const char *filename); - -/** - * Add or update an entry to the builder - * - * Insert a new entry for `filename` in the builder with the - * given attributes. - * - * If an entry named `filename` already exists, its attributes - * will be updated with the given ones. - * - * The optional pointer `out` can be used to retrieve a pointer to the - * newly created/updated entry. Pass NULL if you do not need it. The - * pointer may not be valid past the next operation in this - * builder. Duplicate the entry if you want to keep it. - * - * No attempt is being made to ensure that the provided oid points - * to an existing git object in the object database, nor that the - * attributes make sense regarding the type of the pointed at object. - * - * @param out Pointer to store the entry (optional) - * @param bld Tree builder - * @param filename Filename of the entry - * @param id SHA1 oid of the entry - * @param filemode Folder attributes of the entry. This parameter must - * be valued with one of the following entries: 0040000, 0100644, - * 0100755, 0120000 or 0160000. - * @return 0 or an error code - */ -GIT_EXTERN(int) git_treebuilder_insert( - const git_tree_entry **out, - git_treebuilder *bld, - const char *filename, - const git_oid *id, - git_filemode_t filemode); - -/** - * Remove an entry from the builder by its filename - * - * @param bld Tree builder - * @param filename Filename of the entry to remove - */ -GIT_EXTERN(int) git_treebuilder_remove( - git_treebuilder *bld, const char *filename); - -/** - * Callback for git_treebuilder_filter - * - * The return value is treated as a boolean, with zero indicating that the - * entry should be left alone and any non-zero value meaning that the - * entry should be removed from the treebuilder list (i.e. filtered out). - */ -typedef int (*git_treebuilder_filter_cb)( - const git_tree_entry *entry, void *payload); - -/** - * Selectively remove entries in the tree - * - * The `filter` callback will be called for each entry in the tree with a - * pointer to the entry and the provided `payload`; if the callback returns - * non-zero, the entry will be filtered (removed from the builder). - * - * @param bld Tree builder - * @param filter Callback to filter entries - * @param payload Extra data to pass to filter callback - */ -GIT_EXTERN(void) git_treebuilder_filter( - git_treebuilder *bld, - git_treebuilder_filter_cb filter, - void *payload); - -/** - * Write the contents of the tree builder as a tree object - * - * The tree builder will be written to the given `repo`, and its - * identifying SHA1 hash will be stored in the `id` pointer. - * - * @param id Pointer to store the OID of the newly written tree - * @param bld Tree builder to write - * @return 0 or an error code - */ -GIT_EXTERN(int) git_treebuilder_write( - git_oid *id, git_treebuilder *bld); - - -/** Callback for the tree traversal method */ -typedef int (*git_treewalk_cb)( - const char *root, const git_tree_entry *entry, void *payload); - -/** Tree traversal modes */ -typedef enum { - GIT_TREEWALK_PRE = 0, /* Pre-order */ - GIT_TREEWALK_POST = 1, /* Post-order */ -} git_treewalk_mode; - -/** - * Traverse the entries in a tree and its subtrees in post or pre order. - * - * The entries will be traversed in the specified order, children subtrees - * will be automatically loaded as required, and the `callback` will be - * called once per entry with the current (relative) root for the entry and - * the entry data itself. - * - * If the callback returns a positive value, the passed entry will be - * skipped on the traversal (in pre mode). A negative value stops the walk. - * - * @param tree The tree to walk - * @param mode Traversal mode (pre or post-order) - * @param callback Function to call on each tree entry - * @param payload Opaque pointer to be passed on each callback - * @return 0 or an error code - */ -GIT_EXTERN(int) git_tree_walk( - const git_tree *tree, - git_treewalk_mode mode, - git_treewalk_cb callback, - void *payload); - -/** @} */ - -GIT_END_DECL -#endif diff --git a/vendor/libgit2/include/git2/types.h b/vendor/libgit2/include/git2/types.h deleted file mode 100644 index 6f41014b37..0000000000 --- a/vendor/libgit2/include/git2/types.h +++ /dev/null @@ -1,436 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_types_h__ -#define INCLUDE_git_types_h__ - -#include "common.h" - -/** - * @file git2/types.h - * @brief libgit2 base & compatibility types - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** - * Cross-platform compatibility types for off_t / time_t - * - * NOTE: This needs to be in a public header so that both the library - * implementation and client applications both agree on the same types. - * Otherwise we get undefined behavior. - * - * Use the "best" types that each platform provides. Currently we truncate - * these intermediate representations for compatibility with the git ABI, but - * if and when it changes to support 64 bit types, our code will naturally - * adapt. - * NOTE: These types should match those that are returned by our internal - * stat() functions, for all platforms. - */ -#include -#ifdef __amigaos4__ -#include -#endif - -#if defined(_MSC_VER) - -typedef __int64 git_off_t; -typedef __time64_t git_time_t; - -#elif defined(__MINGW32__) - -typedef off64_t git_off_t; -typedef __time64_t git_time_t; - -#elif defined(__HAIKU__) - -typedef __haiku_std_int64 git_off_t; -typedef __haiku_std_int64 git_time_t; - -#else /* POSIX */ - -/* - * Note: Can't use off_t since if a client program includes - * before us (directly or indirectly), they'll get 32 bit off_t in their client - * app, even though /we/ define _FILE_OFFSET_BITS=64. - */ -typedef int64_t git_off_t; -typedef int64_t git_time_t; - -#endif - -/** Basic type (loose or packed) of any Git object. */ -typedef enum { - GIT_OBJ_ANY = -2, /**< Object can be any of the following */ - GIT_OBJ_BAD = -1, /**< Object is invalid. */ - GIT_OBJ__EXT1 = 0, /**< Reserved for future use. */ - GIT_OBJ_COMMIT = 1, /**< A commit object. */ - GIT_OBJ_TREE = 2, /**< A tree (directory listing) object. */ - GIT_OBJ_BLOB = 3, /**< A file revision object. */ - GIT_OBJ_TAG = 4, /**< An annotated tag object. */ - GIT_OBJ__EXT2 = 5, /**< Reserved for future use. */ - GIT_OBJ_OFS_DELTA = 6, /**< A delta, base is given by an offset. */ - GIT_OBJ_REF_DELTA = 7, /**< A delta, base is given by object id. */ -} git_otype; - -/** An open object database handle. */ -typedef struct git_odb git_odb; - -/** A custom backend in an ODB */ -typedef struct git_odb_backend git_odb_backend; - -/** An object read from the ODB */ -typedef struct git_odb_object git_odb_object; - -/** A stream to read/write from the ODB */ -typedef struct git_odb_stream git_odb_stream; - -/** A stream to write a packfile to the ODB */ -typedef struct git_odb_writepack git_odb_writepack; - -/** An open refs database handle. */ -typedef struct git_refdb git_refdb; - -/** A custom backend for refs */ -typedef struct git_refdb_backend git_refdb_backend; - -/** - * Representation of an existing git repository, - * including all its object contents - */ -typedef struct git_repository git_repository; - -/** Representation of a generic object in a repository */ -typedef struct git_object git_object; - -/** Representation of an in-progress walk through the commits in a repo */ -typedef struct git_revwalk git_revwalk; - -/** Parsed representation of a tag object. */ -typedef struct git_tag git_tag; - -/** In-memory representation of a blob object. */ -typedef struct git_blob git_blob; - -/** Parsed representation of a commit object. */ -typedef struct git_commit git_commit; - -/** Representation of each one of the entries in a tree object. */ -typedef struct git_tree_entry git_tree_entry; - -/** Representation of a tree object. */ -typedef struct git_tree git_tree; - -/** Constructor for in-memory trees */ -typedef struct git_treebuilder git_treebuilder; - -/** Memory representation of an index file. */ -typedef struct git_index git_index; - -/** An iterator for conflicts in the index. */ -typedef struct git_index_conflict_iterator git_index_conflict_iterator; - -/** Memory representation of a set of config files */ -typedef struct git_config git_config; - -/** Interface to access a configuration file */ -typedef struct git_config_backend git_config_backend; - -/** Representation of a reference log entry */ -typedef struct git_reflog_entry git_reflog_entry; - -/** Representation of a reference log */ -typedef struct git_reflog git_reflog; - -/** Representation of a git note */ -typedef struct git_note git_note; - -/** Representation of a git packbuilder */ -typedef struct git_packbuilder git_packbuilder; - -/** Time in a signature */ -typedef struct git_time { - git_time_t time; /**< time in seconds from epoch */ - int offset; /**< timezone offset, in minutes */ -} git_time; - -/** An action signature (e.g. for committers, taggers, etc) */ -typedef struct git_signature { - char *name; /**< full name of the author */ - char *email; /**< email of the author */ - git_time when; /**< time when the action happened */ -} git_signature; - -/** In-memory representation of a reference. */ -typedef struct git_reference git_reference; - -/** Iterator for references */ -typedef struct git_reference_iterator git_reference_iterator; - -/** Transactional interface to references */ -typedef struct git_transaction git_transaction; - -/** Annotated commits, the input to merge and rebase. */ -typedef struct git_annotated_commit git_annotated_commit; - -/** Merge result */ -typedef struct git_merge_result git_merge_result; - -/** Representation of a status collection */ -typedef struct git_status_list git_status_list; - -/** Representation of a rebase */ -typedef struct git_rebase git_rebase; - -/** Basic type of any Git reference. */ -typedef enum { - GIT_REF_INVALID = 0, /**< Invalid reference */ - GIT_REF_OID = 1, /**< A reference which points at an object id */ - GIT_REF_SYMBOLIC = 2, /**< A reference which points at another reference */ - GIT_REF_LISTALL = GIT_REF_OID|GIT_REF_SYMBOLIC, -} git_ref_t; - -/** Basic type of any Git branch. */ -typedef enum { - GIT_BRANCH_LOCAL = 1, - GIT_BRANCH_REMOTE = 2, - GIT_BRANCH_ALL = GIT_BRANCH_LOCAL|GIT_BRANCH_REMOTE, -} git_branch_t; - -/** Valid modes for index and tree entries. */ -typedef enum { - GIT_FILEMODE_UNREADABLE = 0000000, - GIT_FILEMODE_TREE = 0040000, - GIT_FILEMODE_BLOB = 0100644, - GIT_FILEMODE_BLOB_EXECUTABLE = 0100755, - GIT_FILEMODE_LINK = 0120000, - GIT_FILEMODE_COMMIT = 0160000, -} git_filemode_t; - -/* - * A refspec specifies the mapping between remote and local reference - * names when fetch or pushing. - */ -typedef struct git_refspec git_refspec; - -/** - * Git's idea of a remote repository. A remote can be anonymous (in - * which case it does not have backing configuration entires). - */ -typedef struct git_remote git_remote; - -/** - * Interface which represents a transport to communicate with a - * remote. - */ -typedef struct git_transport git_transport; - -/** - * Preparation for a push operation. Can be used to configure what to - * push and the level of parallelism of the packfile builder. - */ -typedef struct git_push git_push; - -/* documentation in the definition */ -typedef struct git_remote_head git_remote_head; -typedef struct git_remote_callbacks git_remote_callbacks; - -/** - * This is passed as the first argument to the callback to allow the - * user to see the progress. - * - * - total_objects: number of objects in the packfile being downloaded - * - indexed_objects: received objects that have been hashed - * - received_objects: objects which have been downloaded - * - local_objects: locally-available objects that have been injected - * in order to fix a thin pack. - * - received-bytes: size of the packfile received up to now - */ -typedef struct git_transfer_progress { - unsigned int total_objects; - unsigned int indexed_objects; - unsigned int received_objects; - unsigned int local_objects; - unsigned int total_deltas; - unsigned int indexed_deltas; - size_t received_bytes; -} git_transfer_progress; - -/** - * Type for progress callbacks during indexing. Return a value less than zero - * to cancel the transfer. - * - * @param stats Structure containing information about the state of the transfer - * @param payload Payload provided by caller - */ -typedef int (*git_transfer_progress_cb)(const git_transfer_progress *stats, void *payload); - -/** - * Type for messages delivered by the transport. Return a negative value - * to cancel the network operation. - * - * @param str The message from the transport - * @param len The length of the message - * @param payload Payload provided by the caller - */ -typedef int (*git_transport_message_cb)(const char *str, int len, void *payload); - - -/** - * Type of host certificate structure that is passed to the check callback - */ -typedef enum git_cert_t { - /** - * No information about the certificate is available. This may - * happen when using curl. - */ - GIT_CERT_NONE, - /** - * The `data` argument to the callback will be a pointer to - * the DER-encoded data. - */ - GIT_CERT_X509, - /** - * The `data` argument to the callback will be a pointer to a - * `git_cert_hostkey` structure. - */ - GIT_CERT_HOSTKEY_LIBSSH2, - /** - * The `data` argument to the callback will be a pointer to a - * `git_strarray` with `name:content` strings containing - * information about the certificate. This is used when using - * curl. - */ - GIT_CERT_STRARRAY, -} git_cert_t; - -/** - * Parent type for `git_cert_hostkey` and `git_cert_x509`. - */ -typedef struct { - /** - * Type of certificate. A `GIT_CERT_` value. - */ - git_cert_t cert_type; -} git_cert; - -/** - * Callback for the user's custom certificate checks. - * - * @param cert The host certificate - * @param valid Whether the libgit2 checks (OpenSSL or WinHTTP) think - * this certificate is valid - * @param host Hostname of the host libgit2 connected to - * @param payload Payload provided by the caller - */ -typedef int (*git_transport_certificate_check_cb)(git_cert *cert, int valid, const char *host, void *payload); - -/** - * Opaque structure representing a submodule. - */ -typedef struct git_submodule git_submodule; - -/** - * Submodule update values - * - * These values represent settings for the `submodule.$name.update` - * configuration value which says how to handle `git submodule update` for - * this submodule. The value is usually set in the ".gitmodules" file and - * copied to ".git/config" when the submodule is initialized. - * - * You can override this setting on a per-submodule basis with - * `git_submodule_set_update()` and write the changed value to disk using - * `git_submodule_save()`. If you have overwritten the value, you can - * revert it by passing `GIT_SUBMODULE_UPDATE_RESET` to the set function. - * - * The values are: - * - * - GIT_SUBMODULE_UPDATE_CHECKOUT: the default; when a submodule is - * updated, checkout the new detached HEAD to the submodule directory. - * - GIT_SUBMODULE_UPDATE_REBASE: update by rebasing the current checked - * out branch onto the commit from the superproject. - * - GIT_SUBMODULE_UPDATE_MERGE: update by merging the commit in the - * superproject into the current checkout out branch of the submodule. - * - GIT_SUBMODULE_UPDATE_NONE: do not update this submodule even when - * the commit in the superproject is updated. - * - GIT_SUBMODULE_UPDATE_DEFAULT: not used except as static initializer - * when we don't want any particular update rule to be specified. - */ -typedef enum { - GIT_SUBMODULE_UPDATE_CHECKOUT = 1, - GIT_SUBMODULE_UPDATE_REBASE = 2, - GIT_SUBMODULE_UPDATE_MERGE = 3, - GIT_SUBMODULE_UPDATE_NONE = 4, - - GIT_SUBMODULE_UPDATE_DEFAULT = 0 -} git_submodule_update_t; - -/** - * Submodule ignore values - * - * These values represent settings for the `submodule.$name.ignore` - * configuration value which says how deeply to look at the working - * directory when getting submodule status. - * - * You can override this value in memory on a per-submodule basis with - * `git_submodule_set_ignore()` and can write the changed value to disk - * with `git_submodule_save()`. If you have overwritten the value, you - * can revert to the on disk value by using `GIT_SUBMODULE_IGNORE_RESET`. - * - * The values are: - * - * - GIT_SUBMODULE_IGNORE_UNSPECIFIED: use the submodule's configuration - * - GIT_SUBMODULE_IGNORE_NONE: don't ignore any change - i.e. even an - * untracked file, will mark the submodule as dirty. Ignored files are - * still ignored, of course. - * - GIT_SUBMODULE_IGNORE_UNTRACKED: ignore untracked files; only changes - * to tracked files, or the index or the HEAD commit will matter. - * - GIT_SUBMODULE_IGNORE_DIRTY: ignore changes in the working directory, - * only considering changes if the HEAD of submodule has moved from the - * value in the superproject. - * - GIT_SUBMODULE_IGNORE_ALL: never check if the submodule is dirty - * - GIT_SUBMODULE_IGNORE_DEFAULT: not used except as static initializer - * when we don't want any particular ignore rule to be specified. - */ -typedef enum { - GIT_SUBMODULE_IGNORE_UNSPECIFIED = -1, /**< use the submodule's configuration */ - - GIT_SUBMODULE_IGNORE_NONE = 1, /**< any change or untracked == dirty */ - GIT_SUBMODULE_IGNORE_UNTRACKED = 2, /**< dirty if tracked files change */ - GIT_SUBMODULE_IGNORE_DIRTY = 3, /**< only dirty if HEAD moved */ - GIT_SUBMODULE_IGNORE_ALL = 4, /**< never dirty */ -} git_submodule_ignore_t; - -/** - * Options for submodule recurse. - * - * Represent the value of `submodule.$name.fetchRecurseSubmodules` - * - * * GIT_SUBMODULE_RECURSE_NO - do no recurse into submodules - * * GIT_SUBMODULE_RECURSE_YES - recurse into submodules - * * GIT_SUBMODULE_RECURSE_ONDEMAND - recurse into submodules only when - * commit not already in local clone - */ -typedef enum { - GIT_SUBMODULE_RECURSE_NO = 0, - GIT_SUBMODULE_RECURSE_YES = 1, - GIT_SUBMODULE_RECURSE_ONDEMAND = 2, -} git_submodule_recurse_t; - -/** A type to write in a streaming fashion, for example, for filters. */ -typedef struct git_writestream git_writestream; - -struct git_writestream { - int (*write)(git_writestream *stream, const char *buffer, size_t len); - int (*close)(git_writestream *stream); - void (*free)(git_writestream *stream); -}; - -/** @} */ -GIT_END_DECL - -#endif diff --git a/vendor/libgit2/include/git2/version.h b/vendor/libgit2/include/git2/version.h deleted file mode 100644 index 3a091e7884..0000000000 --- a/vendor/libgit2/include/git2/version.h +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_version_h__ -#define INCLUDE_git_version_h__ - -#define LIBGIT2_VERSION "0.23.1" -#define LIBGIT2_VER_MAJOR 0 -#define LIBGIT2_VER_MINOR 23 -#define LIBGIT2_VER_REVISION 1 -#define LIBGIT2_VER_PATCH 0 - -#define LIBGIT2_SOVERSION 23 - -#endif diff --git a/vendor/libgit2/libgit2.pc.in b/vendor/libgit2/libgit2.pc.in deleted file mode 100644 index 3d825a49fe..0000000000 --- a/vendor/libgit2/libgit2.pc.in +++ /dev/null @@ -1,12 +0,0 @@ -libdir=@CMAKE_INSTALL_PREFIX@/@LIB_INSTALL_DIR@ -includedir=@CMAKE_INSTALL_PREFIX@/@INCLUDE_INSTALL_DIR@ - -Name: libgit2 -Description: The git library, take 2 -Version: @LIBGIT2_VERSION_STRING@ - -Libs: -L${libdir} -lgit2 -Libs.private: @LIBGIT2_PC_LIBS@ -Requires.private: @LIBGIT2_PC_REQUIRES@ - -Cflags: -I${includedir} diff --git a/vendor/libgit2/libgit2_clar.supp b/vendor/libgit2/libgit2_clar.supp deleted file mode 100644 index bd22ada460..0000000000 --- a/vendor/libgit2/libgit2_clar.supp +++ /dev/null @@ -1,49 +0,0 @@ -{ - ignore-zlib-errors-cond - Memcheck:Cond - obj:*libz.so* -} - -{ - ignore-giterr-set-leak - Memcheck:Leak - ... - fun:giterr_set -} - -{ - ignore-git-global-state-leak - Memcheck:Leak - ... - fun:git__global_state -} - -{ - ignore-openssl-ssl-leak - Memcheck:Leak - ... - obj:*libssl.so* - ... -} - -{ - ignore-openssl-crypto-leak - Memcheck:Leak - ... - obj:*libcrypto.so* - ... -} - -{ - ignore-openssl-crypto-cond - Memcheck:Cond - obj:*libcrypto.so* - ... -} - -{ - ignore-glibc-getaddrinfo-cache - Memcheck:Leak - ... - fun:__check_pf -} diff --git a/vendor/libgit2/script/appveyor-mingw.sh b/vendor/libgit2/script/appveyor-mingw.sh deleted file mode 100755 index 48e0bad0a3..0000000000 --- a/vendor/libgit2/script/appveyor-mingw.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/sh -set -e -cd `dirname "$0"`/.. -if [ "$ARCH" = "32" ]; then - echo 'C:\MinGW\ /MinGW' > /etc/fstab -elif [ "$ARCH" = "i686" ]; then - f=i686-4.9.2-release-win32-sjlj-rt_v3-rev1.7z - if ! [ -e $f ]; then - curl -LsSO http://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win32/Personal%20Builds/mingw-builds/4.9.2/threads-win32/sjlj/$f - fi - 7z x $f > /dev/null - mv mingw32 /MinGW -else - f=x86_64-4.9.2-release-win32-seh-rt_v3-rev1.7z - if ! [ -e $f ]; then - curl -LsSO http://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win64/Personal%20Builds/mingw-builds/4.9.2/threads-win32/seh/$f - fi - 7z x $f > /dev/null - mv mingw64 /MinGW -fi -cd build -cmake -D ENABLE_TRACE=ON -D BUILD_CLAR=ON .. -G"$GENERATOR" -cmake --build . --config RelWithDebInfo diff --git a/vendor/libgit2/script/cibuild.sh b/vendor/libgit2/script/cibuild.sh deleted file mode 100755 index de5df9ea89..0000000000 --- a/vendor/libgit2/script/cibuild.sh +++ /dev/null @@ -1,58 +0,0 @@ -#!/bin/sh - -if [ -n "$COVERITY" ]; -then - ./script/coverity.sh; - exit $?; -fi - -mkdir _build -cd _build -# shellcheck disable=SC2086 -cmake .. -DCMAKE_INSTALL_PREFIX=../_install $OPTIONS || exit $? -make -j2 install || exit $? - -# If this platform doesn't support test execution, bail out now -if [ -n "$SKIP_TESTS" ]; -then - exit $?; -fi - -# Create a test repo which we can use for the online::push tests -mkdir "$HOME"/_temp -git init --bare "$HOME"/_temp/test.git -git daemon --listen=localhost --export-all --enable=receive-pack --base-path="$HOME"/_temp "$HOME"/_temp 2>/dev/null & -export GITTEST_REMOTE_URL="git://localhost/test.git" - -# Run the test suite -ctest -V . || exit $? - -# Now that we've tested the raw git protocol, let's set up ssh to we -# can do the push tests over it - -killall git-daemon - -if [ "$TRAVIS_OS_NAME" = "osx" ]; then - echo 'PasswordAuthentication yes' | sudo tee -a /etc/sshd_config -fi - -ssh-keygen -t rsa -f ~/.ssh/id_rsa -N "" -q -cat ~/.ssh/id_rsa.pub >>~/.ssh/authorized_keys -ssh-keyscan -t rsa localhost >>~/.ssh/known_hosts - -# Get the fingerprint for localhost and remove the colons so we can parse it as a hex number -export GITTEST_REMOTE_SSH_FINGERPRINT=$(ssh-keygen -F localhost -l | tail -n 1 | cut -d ' ' -f 2 | tr -d ':') - -export GITTEST_REMOTE_URL="ssh://localhost/$HOME/_temp/test.git" -export GITTEST_REMOTE_USER=$USER -export GITTEST_REMOTE_SSH_KEY="$HOME/.ssh/id_rsa" -export GITTEST_REMOTE_SSH_PUBKEY="$HOME/.ssh/id_rsa.pub" -export GITTEST_REMOTE_SSH_PASSPHRASE="" - -if [ -e ./libgit2_clar ]; then - ./libgit2_clar -sonline::push -sonline::clone::ssh_cert && - ./libgit2_clar -sonline::clone::ssh_with_paths || exit $? - if [ "$TRAVIS_OS_NAME" = "linux" ]; then - ./libgit2_clar -sonline::clone::cred_callback || exit $? - fi -fi diff --git a/vendor/libgit2/script/coverity.sh b/vendor/libgit2/script/coverity.sh deleted file mode 100755 index dcfeffc1db..0000000000 --- a/vendor/libgit2/script/coverity.sh +++ /dev/null @@ -1,57 +0,0 @@ -#!/bin/bash -set -e - -# Environment check -[ -z "$COVERITY_TOKEN" ] && echo "Need to set a coverity token" && exit 1 - -# Only run this on our branches -echo "Pull request: $TRAVIS_PULL_REQUEST | Slug: $TRAVIS_REPO_SLUG" -if [ "$TRAVIS_PULL_REQUEST" != "false" -o "$TRAVIS_REPO_SLUG" != "libgit2/libgit2" ]; -then - echo "Only analyzing 'development' on the main repo." - exit 0 -fi - -COV_VERSION=6.6.1 -case $(uname -m) in - i?86) BITS=32 ;; - amd64|x86_64) BITS=64 ;; -esac -SCAN_TOOL=https://scan.coverity.com/download/linux-${BITS} -TOOL_BASE=$(pwd)/_coverity-scan - -# Install coverity tools -if [ ! -d "$TOOL_BASE" ]; then - echo "Downloading coverity..." - mkdir -p "$TOOL_BASE" - pushd "$TOOL_BASE" - wget -O coverity_tool.tgz $SCAN_TOOL \ - --post-data "project=libgit2&token=$COVERITY_TOKEN" - tar xzf coverity_tool.tgz - popd - TOOL_DIR=$(find "$TOOL_BASE" -type d -name 'cov-analysis*') - ln -s "$TOOL_DIR" "$TOOL_BASE"/cov-analysis -fi - -COV_BUILD="$TOOL_BASE/cov-analysis/bin/cov-build" - -# Configure and build -rm -rf _build -mkdir _build -cd _build -cmake .. -DTHREADSAFE=ON -COVERITY_UNSUPPORTED=1 \ - $COV_BUILD --dir cov-int \ - cmake --build . - -# Upload results -tar czf libgit2.tgz cov-int -SHA=$(git rev-parse --short HEAD) -curl \ - --form project=libgit2 \ - --form token="$COVERITY_TOKEN" \ - --form email=bs@github.com \ - --form file=@libgit2.tgz \ - --form version="$SHA" \ - --form description="Travis build" \ - http://scan5.coverity.com/cgi-bin/upload.py diff --git a/vendor/libgit2/script/install-deps-osx.sh b/vendor/libgit2/script/install-deps-osx.sh deleted file mode 100755 index c2e0162d83..0000000000 --- a/vendor/libgit2/script/install-deps-osx.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/sh - -set -x - -brew install libssh2 cmake diff --git a/vendor/libgit2/src/annotated_commit.c b/vendor/libgit2/src/annotated_commit.c deleted file mode 100644 index 3f2d2ed175..0000000000 --- a/vendor/libgit2/src/annotated_commit.c +++ /dev/null @@ -1,149 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#include "common.h" -#include "annotated_commit.h" - -#include "git2/commit.h" -#include "git2/refs.h" -#include "git2/repository.h" -#include "git2/annotated_commit.h" -#include "git2/revparse.h" - -static int annotated_commit_init( - git_annotated_commit **out, - git_repository *repo, - const git_oid *id, - const char *ref_name, - const char *remote_url) -{ - git_annotated_commit *annotated_commit; - int error = 0; - - assert(out && id); - - *out = NULL; - - annotated_commit = git__calloc(1, sizeof(git_annotated_commit)); - GITERR_CHECK_ALLOC(annotated_commit); - - if (ref_name) { - annotated_commit->ref_name = git__strdup(ref_name); - GITERR_CHECK_ALLOC(annotated_commit->ref_name); - } - - if (remote_url) { - annotated_commit->remote_url = git__strdup(remote_url); - GITERR_CHECK_ALLOC(annotated_commit->remote_url); - } - - git_oid_fmt(annotated_commit->id_str, id); - annotated_commit->id_str[GIT_OID_HEXSZ] = '\0'; - - if ((error = git_commit_lookup(&annotated_commit->commit, repo, id)) < 0) { - git_annotated_commit_free(annotated_commit); - return error; - } - - *out = annotated_commit; - return error; -} - -int git_annotated_commit_from_ref( - git_annotated_commit **out, - git_repository *repo, - const git_reference *ref) -{ - git_reference *resolved; - int error = 0; - - assert(out && repo && ref); - - *out = NULL; - - if ((error = git_reference_resolve(&resolved, ref)) < 0) - return error; - - error = annotated_commit_init(out, repo, git_reference_target(resolved), - git_reference_name(ref), NULL); - - git_reference_free(resolved); - return error; -} - -int git_annotated_commit_lookup( - git_annotated_commit **out, - git_repository *repo, - const git_oid *id) -{ - assert(out && repo && id); - - return annotated_commit_init(out, repo, id, NULL, NULL); -} - -int git_annotated_commit_from_fetchhead( - git_annotated_commit **out, - git_repository *repo, - const char *branch_name, - const char *remote_url, - const git_oid *id) -{ - assert(repo && id && branch_name && remote_url); - - return annotated_commit_init(out, repo, id, branch_name, remote_url); -} - -int git_annotated_commit_from_revspec( - git_annotated_commit **out, - git_repository *repo, - const char *revspec) -{ - git_object *obj, *commit; - int error; - - assert(out && repo && revspec); - - if ((error = git_revparse_single(&obj, repo, revspec)) < 0) - return error; - - if ((error = git_object_peel(&commit, obj, GIT_OBJ_COMMIT))) { - git_object_free(obj); - return error; - } - - error = annotated_commit_init(out, repo, git_object_id(commit), revspec, NULL); - - git_object_free(obj); - git_object_free(commit); - - return error; -} - - -const git_oid *git_annotated_commit_id( - const git_annotated_commit *annotated_commit) -{ - assert(annotated_commit); - return git_commit_id(annotated_commit->commit); -} - -void git_annotated_commit_free(git_annotated_commit *annotated_commit) -{ - if (annotated_commit == NULL) - return; - - if (annotated_commit->commit != NULL) - git_commit_free(annotated_commit->commit); - - if (annotated_commit->ref_name != NULL) - git__free(annotated_commit->ref_name); - - if (annotated_commit->remote_url != NULL) - git__free(annotated_commit->remote_url); - - git__free(annotated_commit); -} diff --git a/vendor/libgit2/src/annotated_commit.h b/vendor/libgit2/src/annotated_commit.h deleted file mode 100644 index e873184ae4..0000000000 --- a/vendor/libgit2/src/annotated_commit.h +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_annotated_commit_h__ -#define INCLUDE_annotated_commit_h__ - -#include "git2/oid.h" - -/** Internal structure for merge inputs */ -struct git_annotated_commit { - git_commit *commit; - - char *ref_name; - char *remote_url; - - char id_str[GIT_OID_HEXSZ+1]; -}; - -#endif diff --git a/vendor/libgit2/src/array.h b/vendor/libgit2/src/array.h deleted file mode 100644 index 7cd9b71536..0000000000 --- a/vendor/libgit2/src/array.h +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_array_h__ -#define INCLUDE_array_h__ - -#include "common.h" - -/* - * Use this to declare a typesafe resizable array of items, a la: - * - * git_array_t(int) my_ints = GIT_ARRAY_INIT; - * ... - * int *i = git_array_alloc(my_ints); - * GITERR_CHECK_ALLOC(i); - * ... - * git_array_clear(my_ints); - * - * You may also want to do things like: - * - * typedef git_array_t(my_struct) my_struct_array_t; - */ -#define git_array_t(type) struct { type *ptr; size_t size, asize; } - -#define GIT_ARRAY_INIT { NULL, 0, 0 } - -#define git_array_init(a) \ - do { (a).size = (a).asize = 0; (a).ptr = NULL; } while (0) - -#define git_array_init_to_size(a, desired) \ - do { (a).size = 0; (a).asize = desired; (a).ptr = git__calloc(desired, sizeof(*(a).ptr)); } while (0) - -#define git_array_clear(a) \ - do { git__free((a).ptr); git_array_init(a); } while (0) - -#define GITERR_CHECK_ARRAY(a) GITERR_CHECK_ALLOC((a).ptr) - - -typedef git_array_t(char) git_array_generic_t; - -/* use a generic array for growth so this can return the new item */ -GIT_INLINE(void *) git_array_grow(void *_a, size_t item_size) -{ - volatile git_array_generic_t *a = _a; - size_t new_size; - char *new_array; - - if (a->size < 8) { - new_size = 8; - } else { - if (GIT_MULTIPLY_SIZET_OVERFLOW(&new_size, a->size, 3)) - goto on_oom; - new_size /= 2; - } - - if ((new_array = git__reallocarray(a->ptr, new_size, item_size)) == NULL) - goto on_oom; - - a->ptr = new_array; a->asize = new_size; a->size++; - return a->ptr + (a->size - 1) * item_size; - -on_oom: - git_array_clear(*a); - return NULL; -} - -#define git_array_alloc(a) \ - (((a).size >= (a).asize) ? \ - git_array_grow(&(a), sizeof(*(a).ptr)) : \ - ((a).ptr ? &(a).ptr[(a).size++] : NULL)) - -#define git_array_last(a) ((a).size ? &(a).ptr[(a).size - 1] : NULL) - -#define git_array_pop(a) ((a).size ? &(a).ptr[--(a).size] : NULL) - -#define git_array_get(a, i) (((i) < (a).size) ? &(a).ptr[(i)] : NULL) - -#define git_array_size(a) (a).size - -#define git_array_valid_index(a, i) ((i) < (a).size) - -#endif diff --git a/vendor/libgit2/src/attr.c b/vendor/libgit2/src/attr.c deleted file mode 100644 index d43a15f503..0000000000 --- a/vendor/libgit2/src/attr.c +++ /dev/null @@ -1,544 +0,0 @@ -#include "common.h" -#include "repository.h" -#include "sysdir.h" -#include "config.h" -#include "attr_file.h" -#include "ignore.h" -#include "git2/oid.h" -#include - -GIT__USE_STRMAP - -const char *git_attr__true = "[internal]__TRUE__"; -const char *git_attr__false = "[internal]__FALSE__"; -const char *git_attr__unset = "[internal]__UNSET__"; - -git_attr_t git_attr_value(const char *attr) -{ - if (attr == NULL || attr == git_attr__unset) - return GIT_ATTR_UNSPECIFIED_T; - - if (attr == git_attr__true) - return GIT_ATTR_TRUE_T; - - if (attr == git_attr__false) - return GIT_ATTR_FALSE_T; - - return GIT_ATTR_VALUE_T; -} - -static int collect_attr_files( - git_repository *repo, - git_attr_session *attr_session, - uint32_t flags, - const char *path, - git_vector *files); - -static void release_attr_files(git_vector *files); - -int git_attr_get( - const char **value, - git_repository *repo, - uint32_t flags, - const char *pathname, - const char *name) -{ - int error; - git_attr_path path; - git_vector files = GIT_VECTOR_INIT; - size_t i, j; - git_attr_file *file; - git_attr_name attr; - git_attr_rule *rule; - - assert(value && repo && name); - - *value = NULL; - - if (git_attr_path__init(&path, pathname, git_repository_workdir(repo), GIT_DIR_FLAG_UNKNOWN) < 0) - return -1; - - if ((error = collect_attr_files(repo, NULL, flags, pathname, &files)) < 0) - goto cleanup; - - memset(&attr, 0, sizeof(attr)); - attr.name = name; - attr.name_hash = git_attr_file__name_hash(name); - - git_vector_foreach(&files, i, file) { - - git_attr_file__foreach_matching_rule(file, &path, j, rule) { - size_t pos; - - if (!git_vector_bsearch(&pos, &rule->assigns, &attr)) { - *value = ((git_attr_assignment *)git_vector_get( - &rule->assigns, pos))->value; - goto cleanup; - } - } - } - -cleanup: - release_attr_files(&files); - git_attr_path__free(&path); - - return error; -} - - -typedef struct { - git_attr_name name; - git_attr_assignment *found; -} attr_get_many_info; - -int git_attr_get_many_with_session( - const char **values, - git_repository *repo, - git_attr_session *attr_session, - uint32_t flags, - const char *pathname, - size_t num_attr, - const char **names) -{ - int error; - git_attr_path path; - git_vector files = GIT_VECTOR_INIT; - size_t i, j, k; - git_attr_file *file; - git_attr_rule *rule; - attr_get_many_info *info = NULL; - size_t num_found = 0; - - if (!num_attr) - return 0; - - assert(values && repo && names); - - if (git_attr_path__init(&path, pathname, git_repository_workdir(repo), GIT_DIR_FLAG_UNKNOWN) < 0) - return -1; - - if ((error = collect_attr_files(repo, attr_session, flags, pathname, &files)) < 0) - goto cleanup; - - info = git__calloc(num_attr, sizeof(attr_get_many_info)); - GITERR_CHECK_ALLOC(info); - - git_vector_foreach(&files, i, file) { - - git_attr_file__foreach_matching_rule(file, &path, j, rule) { - - for (k = 0; k < num_attr; k++) { - size_t pos; - - if (info[k].found != NULL) /* already found assignment */ - continue; - - if (!info[k].name.name) { - info[k].name.name = names[k]; - info[k].name.name_hash = git_attr_file__name_hash(names[k]); - } - - if (!git_vector_bsearch(&pos, &rule->assigns, &info[k].name)) { - info[k].found = (git_attr_assignment *) - git_vector_get(&rule->assigns, pos); - values[k] = info[k].found->value; - - if (++num_found == num_attr) - goto cleanup; - } - } - } - } - - for (k = 0; k < num_attr; k++) { - if (!info[k].found) - values[k] = NULL; - } - -cleanup: - release_attr_files(&files); - git_attr_path__free(&path); - git__free(info); - - return error; -} - -int git_attr_get_many( - const char **values, - git_repository *repo, - uint32_t flags, - const char *pathname, - size_t num_attr, - const char **names) -{ - return git_attr_get_many_with_session( - values, repo, NULL, flags, pathname, num_attr, names); -} - -int git_attr_foreach( - git_repository *repo, - uint32_t flags, - const char *pathname, - int (*callback)(const char *name, const char *value, void *payload), - void *payload) -{ - int error; - git_attr_path path; - git_vector files = GIT_VECTOR_INIT; - size_t i, j, k; - git_attr_file *file; - git_attr_rule *rule; - git_attr_assignment *assign; - git_strmap *seen = NULL; - - assert(repo && callback); - - if (git_attr_path__init(&path, pathname, git_repository_workdir(repo), GIT_DIR_FLAG_UNKNOWN) < 0) - return -1; - - if ((error = collect_attr_files(repo, NULL, flags, pathname, &files)) < 0 || - (error = git_strmap_alloc(&seen)) < 0) - goto cleanup; - - git_vector_foreach(&files, i, file) { - - git_attr_file__foreach_matching_rule(file, &path, j, rule) { - - git_vector_foreach(&rule->assigns, k, assign) { - /* skip if higher priority assignment was already seen */ - if (git_strmap_exists(seen, assign->name)) - continue; - - git_strmap_insert(seen, assign->name, assign, error); - if (error < 0) - goto cleanup; - - error = callback(assign->name, assign->value, payload); - if (error) { - giterr_set_after_callback(error); - goto cleanup; - } - } - } - } - -cleanup: - git_strmap_free(seen); - release_attr_files(&files); - git_attr_path__free(&path); - - return error; -} - -static int preload_attr_file( - git_repository *repo, - git_attr_session *attr_session, - git_attr_file_source source, - const char *base, - const char *file) -{ - int error; - git_attr_file *preload = NULL; - - if (!file) - return 0; - if (!(error = git_attr_cache__get( - &preload, repo, attr_session, source, base, file, git_attr_file__parse_buffer))) - git_attr_file__free(preload); - - return error; -} - -static int system_attr_file( - git_buf *out, - git_attr_session *attr_session) -{ - int error; - - if (!attr_session) { - error = git_sysdir_find_system_file(out, GIT_ATTR_FILE_SYSTEM); - - if (error == GIT_ENOTFOUND) - giterr_clear(); - - return error; - } - - if (!attr_session->init_sysdir) { - error = git_sysdir_find_system_file(&attr_session->sysdir, GIT_ATTR_FILE_SYSTEM); - - if (error == GIT_ENOTFOUND) - giterr_clear(); - else if (error) - return error; - - attr_session->init_sysdir = 1; - } - - if (attr_session->sysdir.size == 0) - return GIT_ENOTFOUND; - - /* We can safely provide a git_buf with no allocation (asize == 0) to - * a consumer. This allows them to treat this as a regular `git_buf`, - * but their call to `git_buf_free` will not attempt to free it. - */ - git_buf_attach_notowned( - out, attr_session->sysdir.ptr, attr_session->sysdir.size); - return 0; -} - -static int attr_setup(git_repository *repo, git_attr_session *attr_session) -{ - int error = 0; - const char *workdir = git_repository_workdir(repo); - git_index *idx = NULL; - git_buf sys = GIT_BUF_INIT; - - if (attr_session && attr_session->init_setup) - return 0; - - if ((error = git_attr_cache__init(repo)) < 0) - return error; - - /* preload attribute files that could contain macros so the - * definitions will be available for later file parsing - */ - - error = system_attr_file(&sys, attr_session); - - if (error == 0) - error = preload_attr_file( - repo, attr_session, GIT_ATTR_FILE__FROM_FILE, NULL, sys.ptr); - - if (error != GIT_ENOTFOUND) - return error; - - git_buf_free(&sys); - - if ((error = preload_attr_file( - repo, attr_session, GIT_ATTR_FILE__FROM_FILE, - NULL, git_repository_attr_cache(repo)->cfg_attr_file)) < 0) - return error; - - if ((error = preload_attr_file( - repo, attr_session, GIT_ATTR_FILE__FROM_FILE, - git_repository_path(repo), GIT_ATTR_FILE_INREPO)) < 0) - return error; - - if (workdir != NULL && - (error = preload_attr_file( - repo, attr_session, GIT_ATTR_FILE__FROM_FILE, workdir, GIT_ATTR_FILE)) < 0) - return error; - - if ((error = git_repository_index__weakptr(&idx, repo)) < 0 || - (error = preload_attr_file( - repo, attr_session, GIT_ATTR_FILE__FROM_INDEX, NULL, GIT_ATTR_FILE)) < 0) - return error; - - if (attr_session) - attr_session->init_setup = 1; - - return error; -} - -int git_attr_add_macro( - git_repository *repo, - const char *name, - const char *values) -{ - int error; - git_attr_rule *macro = NULL; - git_pool *pool; - - if ((error = git_attr_cache__init(repo)) < 0) - return error; - - macro = git__calloc(1, sizeof(git_attr_rule)); - GITERR_CHECK_ALLOC(macro); - - pool = &git_repository_attr_cache(repo)->pool; - - macro->match.pattern = git_pool_strdup(pool, name); - GITERR_CHECK_ALLOC(macro->match.pattern); - - macro->match.length = strlen(macro->match.pattern); - macro->match.flags = GIT_ATTR_FNMATCH_MACRO; - - error = git_attr_assignment__parse(repo, pool, ¯o->assigns, &values); - - if (!error) - error = git_attr_cache__insert_macro(repo, macro); - - if (error < 0) - git_attr_rule__free(macro); - - return error; -} - -typedef struct { - git_repository *repo; - git_attr_session *attr_session; - uint32_t flags; - const char *workdir; - git_index *index; - git_vector *files; -} attr_walk_up_info; - -static int attr_decide_sources( - uint32_t flags, bool has_wd, bool has_index, git_attr_file_source *srcs) -{ - int count = 0; - - switch (flags & 0x03) { - case GIT_ATTR_CHECK_FILE_THEN_INDEX: - if (has_wd) - srcs[count++] = GIT_ATTR_FILE__FROM_FILE; - if (has_index) - srcs[count++] = GIT_ATTR_FILE__FROM_INDEX; - break; - case GIT_ATTR_CHECK_INDEX_THEN_FILE: - if (has_index) - srcs[count++] = GIT_ATTR_FILE__FROM_INDEX; - if (has_wd) - srcs[count++] = GIT_ATTR_FILE__FROM_FILE; - break; - case GIT_ATTR_CHECK_INDEX_ONLY: - if (has_index) - srcs[count++] = GIT_ATTR_FILE__FROM_INDEX; - break; - } - - return count; -} - -static int push_attr_file( - git_repository *repo, - git_attr_session *attr_session, - git_vector *list, - git_attr_file_source source, - const char *base, - const char *filename) -{ - int error = 0; - git_attr_file *file = NULL; - - error = git_attr_cache__get(&file, repo, attr_session, - source, base, filename, git_attr_file__parse_buffer); - - if (error < 0) - return error; - - if (file != NULL) { - if ((error = git_vector_insert(list, file)) < 0) - git_attr_file__free(file); - } - - return error; -} - -static int push_one_attr(void *ref, const char *path) -{ - int error = 0, n_src, i; - attr_walk_up_info *info = (attr_walk_up_info *)ref; - git_attr_file_source src[2]; - - n_src = attr_decide_sources( - info->flags, info->workdir != NULL, info->index != NULL, src); - - for (i = 0; !error && i < n_src; ++i) - error = push_attr_file(info->repo, info->attr_session, - info->files, src[i], path, GIT_ATTR_FILE); - - return error; -} - -static void release_attr_files(git_vector *files) -{ - size_t i; - git_attr_file *file; - - git_vector_foreach(files, i, file) { - git_attr_file__free(file); - files->contents[i] = NULL; - } - git_vector_free(files); -} - -static int collect_attr_files( - git_repository *repo, - git_attr_session *attr_session, - uint32_t flags, - const char *path, - git_vector *files) -{ - int error = 0; - git_buf dir = GIT_BUF_INIT; - const char *workdir = git_repository_workdir(repo); - attr_walk_up_info info = { NULL }; - - if ((error = attr_setup(repo, attr_session)) < 0) - return error; - - /* Resolve path in a non-bare repo */ - if (workdir != NULL) - error = git_path_find_dir(&dir, path, workdir); - else - error = git_path_dirname_r(&dir, path); - if (error < 0) - goto cleanup; - - /* in precendence order highest to lowest: - * - $GIT_DIR/info/attributes - * - path components with .gitattributes - * - config core.attributesfile - * - $GIT_PREFIX/etc/gitattributes - */ - - error = push_attr_file( - repo, attr_session, files, GIT_ATTR_FILE__FROM_FILE, - git_repository_path(repo), GIT_ATTR_FILE_INREPO); - if (error < 0) - goto cleanup; - - info.repo = repo; - info.attr_session = attr_session; - info.flags = flags; - info.workdir = workdir; - if (git_repository_index__weakptr(&info.index, repo) < 0) - giterr_clear(); /* no error even if there is no index */ - info.files = files; - - if (!strcmp(dir.ptr, ".")) - error = push_one_attr(&info, ""); - else - error = git_path_walk_up(&dir, workdir, push_one_attr, &info); - - if (error < 0) - goto cleanup; - - if (git_repository_attr_cache(repo)->cfg_attr_file != NULL) { - error = push_attr_file( - repo, attr_session, files, GIT_ATTR_FILE__FROM_FILE, - NULL, git_repository_attr_cache(repo)->cfg_attr_file); - if (error < 0) - goto cleanup; - } - - if ((flags & GIT_ATTR_CHECK_NO_SYSTEM) == 0) { - error = system_attr_file(&dir, attr_session); - - if (!error) - error = push_attr_file( - repo, attr_session, files, GIT_ATTR_FILE__FROM_FILE, - NULL, dir.ptr); - else if (error == GIT_ENOTFOUND) - error = 0; - } - - cleanup: - if (error < 0) - release_attr_files(files); - git_buf_free(&dir); - - return error; -} diff --git a/vendor/libgit2/src/attr.h b/vendor/libgit2/src/attr.h deleted file mode 100644 index f9f216d077..0000000000 --- a/vendor/libgit2/src/attr.h +++ /dev/null @@ -1,13 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_attr_h__ -#define INCLUDE_attr_h__ - -#include "attr_file.h" -#include "attrcache.h" - -#endif diff --git a/vendor/libgit2/src/attr_file.c b/vendor/libgit2/src/attr_file.c deleted file mode 100644 index 89706865a4..0000000000 --- a/vendor/libgit2/src/attr_file.c +++ /dev/null @@ -1,869 +0,0 @@ -#include "common.h" -#include "repository.h" -#include "filebuf.h" -#include "attr_file.h" -#include "attrcache.h" -#include "git2/blob.h" -#include "git2/tree.h" -#include "index.h" -#include - -static void attr_file_free(git_attr_file *file) -{ - bool unlock = !git_mutex_lock(&file->lock); - git_attr_file__clear_rules(file, false); - git_pool_clear(&file->pool); - if (unlock) - git_mutex_unlock(&file->lock); - git_mutex_free(&file->lock); - - git__memzero(file, sizeof(*file)); - git__free(file); -} - -int git_attr_file__new( - git_attr_file **out, - git_attr_file_entry *entry, - git_attr_file_source source) -{ - git_attr_file *attrs = git__calloc(1, sizeof(git_attr_file)); - GITERR_CHECK_ALLOC(attrs); - - if (git_mutex_init(&attrs->lock) < 0) { - giterr_set(GITERR_OS, "Failed to initialize lock"); - git__free(attrs); - return -1; - } - - if (git_pool_init(&attrs->pool, 1, 0) < 0) { - attr_file_free(attrs); - return -1; - } - - GIT_REFCOUNT_INC(attrs); - attrs->entry = entry; - attrs->source = source; - *out = attrs; - return 0; -} - -int git_attr_file__clear_rules(git_attr_file *file, bool need_lock) -{ - unsigned int i; - git_attr_rule *rule; - - if (need_lock && git_mutex_lock(&file->lock) < 0) { - giterr_set(GITERR_OS, "Failed to lock attribute file"); - return -1; - } - - git_vector_foreach(&file->rules, i, rule) - git_attr_rule__free(rule); - git_vector_free(&file->rules); - - if (need_lock) - git_mutex_unlock(&file->lock); - - return 0; -} - -void git_attr_file__free(git_attr_file *file) -{ - if (!file) - return; - GIT_REFCOUNT_DEC(file, attr_file_free); -} - -static int attr_file_oid_from_index( - git_oid *oid, git_repository *repo, const char *path) -{ - int error; - git_index *idx; - size_t pos; - const git_index_entry *entry; - - if ((error = git_repository_index__weakptr(&idx, repo)) < 0 || - (error = git_index__find_pos(&pos, idx, path, 0, 0)) < 0) - return error; - - if (!(entry = git_index_get_byindex(idx, pos))) - return GIT_ENOTFOUND; - - *oid = entry->id; - return 0; -} - -int git_attr_file__load( - git_attr_file **out, - git_repository *repo, - git_attr_session *attr_session, - git_attr_file_entry *entry, - git_attr_file_source source, - git_attr_file_parser parser) -{ - int error = 0; - git_blob *blob = NULL; - git_buf content = GIT_BUF_INIT; - git_attr_file *file; - struct stat st; - bool nonexistent = false; - - *out = NULL; - - switch (source) { - case GIT_ATTR_FILE__IN_MEMORY: - /* in-memory attribute file doesn't need data */ - break; - case GIT_ATTR_FILE__FROM_INDEX: { - git_oid id; - - if ((error = attr_file_oid_from_index(&id, repo, entry->path)) < 0 || - (error = git_blob_lookup(&blob, repo, &id)) < 0) - return error; - - /* Do not assume that data straight from the ODB is NULL-terminated; - * copy the contents of a file to a buffer to work on */ - git_buf_put(&content, git_blob_rawcontent(blob), git_blob_rawsize(blob)); - break; - } - case GIT_ATTR_FILE__FROM_FILE: { - int fd; - - /* For open or read errors, pretend that we got ENOTFOUND. */ - /* TODO: issue warning when warning API is available */ - - if (p_stat(entry->fullpath, &st) < 0 || - S_ISDIR(st.st_mode) || - (fd = git_futils_open_ro(entry->fullpath)) < 0 || - (error = git_futils_readbuffer_fd(&content, fd, (size_t)st.st_size)) < 0) - nonexistent = true; - else - p_close(fd); - - break; - } - default: - giterr_set(GITERR_INVALID, "Unknown file source %d", source); - return -1; - } - - if ((error = git_attr_file__new(&file, entry, source)) < 0) - goto cleanup; - - /* store the key of the attr_reader; don't bother with cache - * invalidation during the same attr reader session. - */ - if (attr_session) - file->session_key = attr_session->key; - - if (parser && (error = parser(repo, file, git_buf_cstr(&content))) < 0) { - git_attr_file__free(file); - goto cleanup; - } - - /* write cache breakers */ - if (nonexistent) - file->nonexistent = 1; - else if (source == GIT_ATTR_FILE__FROM_INDEX) - git_oid_cpy(&file->cache_data.oid, git_blob_id(blob)); - else if (source == GIT_ATTR_FILE__FROM_FILE) - git_futils_filestamp_set_from_stat(&file->cache_data.stamp, &st); - /* else always cacheable */ - - *out = file; - -cleanup: - git_blob_free(blob); - git_buf_free(&content); - - return error; -} - -int git_attr_file__out_of_date( - git_repository *repo, - git_attr_session *attr_session, - git_attr_file *file) -{ - if (!file) - return 1; - - /* we are never out of date if we just created this data in the same - * attr_session; otherwise, nonexistent files must be invalidated - */ - if (attr_session && attr_session->key == file->session_key) - return 0; - else if (file->nonexistent) - return 1; - - switch (file->source) { - case GIT_ATTR_FILE__IN_MEMORY: - return 0; - - case GIT_ATTR_FILE__FROM_FILE: - return git_futils_filestamp_check( - &file->cache_data.stamp, file->entry->fullpath); - - case GIT_ATTR_FILE__FROM_INDEX: { - int error; - git_oid id; - - if ((error = attr_file_oid_from_index( - &id, repo, file->entry->path)) < 0) - return error; - - return (git_oid__cmp(&file->cache_data.oid, &id) != 0); - } - - default: - giterr_set(GITERR_INVALID, "Invalid file type %d", file->source); - return -1; - } -} - -static int sort_by_hash_and_name(const void *a_raw, const void *b_raw); -static void git_attr_rule__clear(git_attr_rule *rule); -static bool parse_optimized_patterns( - git_attr_fnmatch *spec, - git_pool *pool, - const char *pattern); - -int git_attr_file__parse_buffer( - git_repository *repo, git_attr_file *attrs, const char *data) -{ - int error = 0; - const char *scan = data, *context = NULL; - git_attr_rule *rule = NULL; - - /* if subdir file path, convert context for file paths */ - if (attrs->entry && - git_path_root(attrs->entry->path) < 0 && - !git__suffixcmp(attrs->entry->path, "/" GIT_ATTR_FILE)) - context = attrs->entry->path; - - if (git_mutex_lock(&attrs->lock) < 0) { - giterr_set(GITERR_OS, "Failed to lock attribute file"); - return -1; - } - - while (!error && *scan) { - /* allocate rule if needed */ - if (!rule && !(rule = git__calloc(1, sizeof(*rule)))) { - error = -1; - break; - } - - rule->match.flags = - GIT_ATTR_FNMATCH_ALLOWNEG | GIT_ATTR_FNMATCH_ALLOWMACRO; - - /* parse the next "pattern attr attr attr" line */ - if (!(error = git_attr_fnmatch__parse( - &rule->match, &attrs->pool, context, &scan)) && - !(error = git_attr_assignment__parse( - repo, &attrs->pool, &rule->assigns, &scan))) - { - if (rule->match.flags & GIT_ATTR_FNMATCH_MACRO) - /* TODO: warning if macro found in file below repo root */ - error = git_attr_cache__insert_macro(repo, rule); - else - error = git_vector_insert(&attrs->rules, rule); - } - - /* if the rule wasn't a pattern, on to the next */ - if (error < 0) { - git_attr_rule__clear(rule); /* reset rule contents */ - if (error == GIT_ENOTFOUND) - error = 0; - } else { - rule = NULL; /* vector now "owns" the rule */ - } - } - - git_mutex_unlock(&attrs->lock); - git_attr_rule__free(rule); - - return error; -} - -uint32_t git_attr_file__name_hash(const char *name) -{ - uint32_t h = 5381; - int c; - assert(name); - while ((c = (int)*name++) != 0) - h = ((h << 5) + h) + c; - return h; -} - -int git_attr_file__lookup_one( - git_attr_file *file, - git_attr_path *path, - const char *attr, - const char **value) -{ - size_t i; - git_attr_name name; - git_attr_rule *rule; - - *value = NULL; - - name.name = attr; - name.name_hash = git_attr_file__name_hash(attr); - - git_attr_file__foreach_matching_rule(file, path, i, rule) { - size_t pos; - - if (!git_vector_bsearch(&pos, &rule->assigns, &name)) { - *value = ((git_attr_assignment *) - git_vector_get(&rule->assigns, pos))->value; - break; - } - } - - return 0; -} - -int git_attr_file__load_standalone(git_attr_file **out, const char *path) -{ - int error; - git_attr_file *file; - git_buf content = GIT_BUF_INIT; - - error = git_attr_file__new(&file, NULL, GIT_ATTR_FILE__FROM_FILE); - if (error < 0) - return error; - - error = git_attr_cache__alloc_file_entry( - &file->entry, NULL, path, &file->pool); - if (error < 0) { - git_attr_file__free(file); - return error; - } - /* because the cache entry is allocated from the file's own pool, we - * don't have to free it - freeing file+pool will free cache entry, too. - */ - - if (!(error = git_futils_readbuffer(&content, path))) { - error = git_attr_file__parse_buffer(NULL, file, content.ptr); - git_buf_free(&content); - } - - if (error < 0) - git_attr_file__free(file); - else - *out = file; - - return error; -} - -bool git_attr_fnmatch__match( - git_attr_fnmatch *match, - git_attr_path *path) -{ - const char *relpath = path->path; - const char *filename; - int flags = 0; - - /* - * If the rule was generated in a subdirectory, we must only - * use it for paths inside that directory. We can thus return - * a non-match if the prefixes don't match. - */ - if (match->containing_dir) { - if (match->flags & GIT_ATTR_FNMATCH_ICASE) { - if (git__strncasecmp(path->path, match->containing_dir, match->containing_dir_length)) - return 0; - } else { - if (git__prefixcmp(path->path, match->containing_dir)) - return 0; - } - - relpath += match->containing_dir_length; - } - - if (match->flags & GIT_ATTR_FNMATCH_ICASE) - flags |= FNM_CASEFOLD; - if (match->flags & GIT_ATTR_FNMATCH_LEADINGDIR) - flags |= FNM_LEADING_DIR; - - if (match->flags & GIT_ATTR_FNMATCH_FULLPATH) { - filename = relpath; - flags |= FNM_PATHNAME; - } else { - filename = path->basename; - - if (path->is_dir) - flags |= FNM_LEADING_DIR; - } - - if ((match->flags & GIT_ATTR_FNMATCH_DIRECTORY) && !path->is_dir) { - bool samename; - - /* for attribute checks or root ignore checks, fail match */ - if (!(match->flags & GIT_ATTR_FNMATCH_IGNORE) || - path->basename == path->path) - return false; - - flags |= FNM_LEADING_DIR; - - /* fail match if this is a file with same name as ignored folder */ - samename = (match->flags & GIT_ATTR_FNMATCH_ICASE) ? - !strcasecmp(match->pattern, relpath) : - !strcmp(match->pattern, relpath); - - if (samename) - return false; - - return (p_fnmatch(match->pattern, relpath, flags) != FNM_NOMATCH); - } - - /* if path is a directory prefix of a negated pattern, then match */ - if ((match->flags & GIT_ATTR_FNMATCH_NEGATIVE) && path->is_dir) { - size_t pathlen = strlen(relpath); - bool prefixed = (pathlen <= match->length) && - ((match->flags & GIT_ATTR_FNMATCH_ICASE) ? - !strncasecmp(match->pattern, relpath, pathlen) : - !strncmp(match->pattern, relpath, pathlen)); - - if (prefixed && git_path_at_end_of_segment(&match->pattern[pathlen])) - return true; - } - - return (p_fnmatch(match->pattern, filename, flags) != FNM_NOMATCH); -} - -bool git_attr_rule__match( - git_attr_rule *rule, - git_attr_path *path) -{ - bool matched = git_attr_fnmatch__match(&rule->match, path); - - if (rule->match.flags & GIT_ATTR_FNMATCH_NEGATIVE) - matched = !matched; - - return matched; -} - -git_attr_assignment *git_attr_rule__lookup_assignment( - git_attr_rule *rule, const char *name) -{ - size_t pos; - git_attr_name key; - key.name = name; - key.name_hash = git_attr_file__name_hash(name); - - if (git_vector_bsearch(&pos, &rule->assigns, &key)) - return NULL; - - return git_vector_get(&rule->assigns, pos); -} - -int git_attr_path__init( - git_attr_path *info, const char *path, const char *base, git_dir_flag dir_flag) -{ - ssize_t root; - - /* build full path as best we can */ - git_buf_init(&info->full, 0); - - if (git_path_join_unrooted(&info->full, path, base, &root) < 0) - return -1; - - info->path = info->full.ptr + root; - - /* remove trailing slashes */ - while (info->full.size > 0) { - if (info->full.ptr[info->full.size - 1] != '/') - break; - info->full.size--; - } - info->full.ptr[info->full.size] = '\0'; - - /* skip leading slashes in path */ - while (*info->path == '/') - info->path++; - - /* find trailing basename component */ - info->basename = strrchr(info->path, '/'); - if (info->basename) - info->basename++; - if (!info->basename || !*info->basename) - info->basename = info->path; - - switch (dir_flag) - { - case GIT_DIR_FLAG_FALSE: - info->is_dir = 0; - break; - - case GIT_DIR_FLAG_TRUE: - info->is_dir = 1; - break; - - case GIT_DIR_FLAG_UNKNOWN: - default: - info->is_dir = (int)git_path_isdir(info->full.ptr); - break; - } - - return 0; -} - -void git_attr_path__free(git_attr_path *info) -{ - git_buf_free(&info->full); - info->path = NULL; - info->basename = NULL; -} - -/* - * From gitattributes(5): - * - * Patterns have the following format: - * - * - A blank line matches no files, so it can serve as a separator for - * readability. - * - * - A line starting with # serves as a comment. - * - * - An optional prefix ! which negates the pattern; any matching file - * excluded by a previous pattern will become included again. If a negated - * pattern matches, this will override lower precedence patterns sources. - * - * - If the pattern ends with a slash, it is removed for the purpose of the - * following description, but it would only find a match with a directory. In - * other words, foo/ will match a directory foo and paths underneath it, but - * will not match a regular file or a symbolic link foo (this is consistent - * with the way how pathspec works in general in git). - * - * - If the pattern does not contain a slash /, git treats it as a shell glob - * pattern and checks for a match against the pathname without leading - * directories. - * - * - Otherwise, git treats the pattern as a shell glob suitable for consumption - * by fnmatch(3) with the FNM_PATHNAME flag: wildcards in the pattern will - * not match a / in the pathname. For example, "Documentation/\*.html" matches - * "Documentation/git.html" but not "Documentation/ppc/ppc.html". A leading - * slash matches the beginning of the pathname; for example, "/\*.c" matches - * "cat-file.c" but not "mozilla-sha1/sha1.c". - */ - -/* - * This will return 0 if the spec was filled out, - * GIT_ENOTFOUND if the fnmatch does not require matching, or - * another error code there was an actual problem. - */ -int git_attr_fnmatch__parse( - git_attr_fnmatch *spec, - git_pool *pool, - const char *context, - const char **base) -{ - const char *pattern, *scan; - int slash_count, allow_space; - - assert(spec && base && *base); - - if (parse_optimized_patterns(spec, pool, *base)) - return 0; - - spec->flags = (spec->flags & GIT_ATTR_FNMATCH__INCOMING); - allow_space = ((spec->flags & GIT_ATTR_FNMATCH_ALLOWSPACE) != 0); - - pattern = *base; - - while (git__isspace(*pattern)) pattern++; - if (!*pattern || *pattern == '#') { - *base = git__next_line(pattern); - return GIT_ENOTFOUND; - } - - if (*pattern == '[' && (spec->flags & GIT_ATTR_FNMATCH_ALLOWMACRO) != 0) { - if (strncmp(pattern, "[attr]", 6) == 0) { - spec->flags = spec->flags | GIT_ATTR_FNMATCH_MACRO; - pattern += 6; - } - /* else a character range like [a-e]* which is accepted */ - } - - if (*pattern == '!' && (spec->flags & GIT_ATTR_FNMATCH_ALLOWNEG) != 0) { - spec->flags = spec->flags | - GIT_ATTR_FNMATCH_NEGATIVE | GIT_ATTR_FNMATCH_LEADINGDIR; - pattern++; - } - - slash_count = 0; - for (scan = pattern; *scan != '\0'; ++scan) { - /* scan until (non-escaped) white space */ - if (git__isspace(*scan) && *(scan - 1) != '\\') { - if (!allow_space || (*scan != ' ' && *scan != '\t' && *scan != '\r')) - break; - } - - if (*scan == '/') { - spec->flags = spec->flags | GIT_ATTR_FNMATCH_FULLPATH; - slash_count++; - if (pattern == scan) - pattern++; - } - /* remember if we see an unescaped wildcard in pattern */ - else if (git__iswildcard(*scan) && - (scan == pattern || (*(scan - 1) != '\\'))) - spec->flags = spec->flags | GIT_ATTR_FNMATCH_HASWILD; - } - - *base = scan; - - if ((spec->length = scan - pattern) == 0) - return GIT_ENOTFOUND; - - /* - * Remove one trailing \r in case this is a CRLF delimited - * file, in the case of Icon\r\r\n, we still leave the first - * \r there to match against. - */ - if (pattern[spec->length - 1] == '\r') - if (--spec->length == 0) - return GIT_ENOTFOUND; - - if (pattern[spec->length - 1] == '/') { - spec->length--; - spec->flags = spec->flags | GIT_ATTR_FNMATCH_DIRECTORY; - if (--slash_count <= 0) - spec->flags = spec->flags & ~GIT_ATTR_FNMATCH_FULLPATH; - } - if ((spec->flags & GIT_ATTR_FNMATCH_NOLEADINGDIR) == 0 && - spec->length >= 2 && - pattern[spec->length - 1] == '*' && - pattern[spec->length - 2] == '/') { - spec->length -= 2; - spec->flags = spec->flags | GIT_ATTR_FNMATCH_LEADINGDIR; - /* leave FULLPATH match on, however */ - } - - if (context) { - char *slash = strrchr(context, '/'); - size_t len; - if (slash) { - /* include the slash for easier matching */ - len = slash - context + 1; - spec->containing_dir = git_pool_strndup(pool, context, len); - spec->containing_dir_length = len; - } - } - - spec->pattern = git_pool_strndup(pool, pattern, spec->length); - - if (!spec->pattern) { - *base = git__next_line(pattern); - return -1; - } else { - /* strip '\' that might have be used for internal whitespace */ - spec->length = git__unescape(spec->pattern); - /* TODO: convert remaining '\' into '/' for POSIX ??? */ - } - - return 0; -} - -static bool parse_optimized_patterns( - git_attr_fnmatch *spec, - git_pool *pool, - const char *pattern) -{ - if (!pattern[1] && (pattern[0] == '*' || pattern[0] == '.')) { - spec->flags = GIT_ATTR_FNMATCH_MATCH_ALL; - spec->pattern = git_pool_strndup(pool, pattern, 1); - spec->length = 1; - - return true; - } - - return false; -} - -static int sort_by_hash_and_name(const void *a_raw, const void *b_raw) -{ - const git_attr_name *a = a_raw; - const git_attr_name *b = b_raw; - - if (b->name_hash < a->name_hash) - return 1; - else if (b->name_hash > a->name_hash) - return -1; - else - return strcmp(b->name, a->name); -} - -static void git_attr_assignment__free(git_attr_assignment *assign) -{ - /* name and value are stored in a git_pool associated with the - * git_attr_file, so they do not need to be freed here - */ - assign->name = NULL; - assign->value = NULL; - git__free(assign); -} - -static int merge_assignments(void **old_raw, void *new_raw) -{ - git_attr_assignment **old = (git_attr_assignment **)old_raw; - git_attr_assignment *new = (git_attr_assignment *)new_raw; - - GIT_REFCOUNT_DEC(*old, git_attr_assignment__free); - *old = new; - return GIT_EEXISTS; -} - -int git_attr_assignment__parse( - git_repository *repo, - git_pool *pool, - git_vector *assigns, - const char **base) -{ - int error; - const char *scan = *base; - git_attr_assignment *assign = NULL; - - assert(assigns && !assigns->length); - - git_vector_set_cmp(assigns, sort_by_hash_and_name); - - while (*scan && *scan != '\n') { - const char *name_start, *value_start; - - /* skip leading blanks */ - while (git__isspace(*scan) && *scan != '\n') scan++; - - /* allocate assign if needed */ - if (!assign) { - assign = git__calloc(1, sizeof(git_attr_assignment)); - GITERR_CHECK_ALLOC(assign); - GIT_REFCOUNT_INC(assign); - } - - assign->name_hash = 5381; - assign->value = git_attr__true; - - /* look for magic name prefixes */ - if (*scan == '-') { - assign->value = git_attr__false; - scan++; - } else if (*scan == '!') { - assign->value = git_attr__unset; /* explicit unspecified state */ - scan++; - } else if (*scan == '#') /* comment rest of line */ - break; - - /* find the name */ - name_start = scan; - while (*scan && !git__isspace(*scan) && *scan != '=') { - assign->name_hash = - ((assign->name_hash << 5) + assign->name_hash) + *scan; - scan++; - } - if (scan == name_start) { - /* must have found lone prefix (" - ") or leading = ("=foo") - * or end of buffer -- advance until whitespace and continue - */ - while (*scan && !git__isspace(*scan)) scan++; - continue; - } - - /* allocate permanent storage for name */ - assign->name = git_pool_strndup(pool, name_start, scan - name_start); - GITERR_CHECK_ALLOC(assign->name); - - /* if there is an equals sign, find the value */ - if (*scan == '=') { - for (value_start = ++scan; *scan && !git__isspace(*scan); ++scan); - - /* if we found a value, allocate permanent storage for it */ - if (scan > value_start) { - assign->value = git_pool_strndup(pool, value_start, scan - value_start); - GITERR_CHECK_ALLOC(assign->value); - } - } - - /* expand macros (if given a repo with a macro cache) */ - if (repo != NULL && assign->value == git_attr__true) { - git_attr_rule *macro = - git_attr_cache__lookup_macro(repo, assign->name); - - if (macro != NULL) { - unsigned int i; - git_attr_assignment *massign; - - git_vector_foreach(¯o->assigns, i, massign) { - GIT_REFCOUNT_INC(massign); - - error = git_vector_insert_sorted( - assigns, massign, &merge_assignments); - if (error < 0 && error != GIT_EEXISTS) { - git_attr_assignment__free(assign); - return error; - } - } - } - } - - /* insert allocated assign into vector */ - error = git_vector_insert_sorted(assigns, assign, &merge_assignments); - if (error < 0 && error != GIT_EEXISTS) - return error; - - /* clear assign since it is now "owned" by the vector */ - assign = NULL; - } - - if (assign != NULL) - git_attr_assignment__free(assign); - - *base = git__next_line(scan); - - return (assigns->length == 0) ? GIT_ENOTFOUND : 0; -} - -static void git_attr_rule__clear(git_attr_rule *rule) -{ - unsigned int i; - git_attr_assignment *assign; - - if (!rule) - return; - - if (!(rule->match.flags & GIT_ATTR_FNMATCH_IGNORE)) { - git_vector_foreach(&rule->assigns, i, assign) - GIT_REFCOUNT_DEC(assign, git_attr_assignment__free); - git_vector_free(&rule->assigns); - } - - /* match.pattern is stored in a git_pool, so no need to free */ - rule->match.pattern = NULL; - rule->match.length = 0; -} - -void git_attr_rule__free(git_attr_rule *rule) -{ - git_attr_rule__clear(rule); - git__free(rule); -} - -int git_attr_session__init(git_attr_session *session, git_repository *repo) -{ - assert(repo); - - session->key = git_atomic_inc(&repo->attr_session_key); - - return 0; -} - -void git_attr_session__free(git_attr_session *session) -{ - if (!session) - return; - - git_buf_free(&session->sysdir); - git_buf_free(&session->tmp); - - memset(session, 0, sizeof(git_attr_session)); -} diff --git a/vendor/libgit2/src/attr_file.h b/vendor/libgit2/src/attr_file.h deleted file mode 100644 index 388ecf4c07..0000000000 --- a/vendor/libgit2/src/attr_file.h +++ /dev/null @@ -1,218 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_attr_file_h__ -#define INCLUDE_attr_file_h__ - -#include "git2/oid.h" -#include "git2/attr.h" -#include "vector.h" -#include "pool.h" -#include "buffer.h" -#include "fileops.h" - -#define GIT_ATTR_FILE ".gitattributes" -#define GIT_ATTR_FILE_INREPO "info/attributes" -#define GIT_ATTR_FILE_SYSTEM "gitattributes" -#define GIT_ATTR_FILE_XDG "attributes" - -#define GIT_ATTR_FNMATCH_NEGATIVE (1U << 0) -#define GIT_ATTR_FNMATCH_DIRECTORY (1U << 1) -#define GIT_ATTR_FNMATCH_FULLPATH (1U << 2) -#define GIT_ATTR_FNMATCH_MACRO (1U << 3) -#define GIT_ATTR_FNMATCH_IGNORE (1U << 4) -#define GIT_ATTR_FNMATCH_HASWILD (1U << 5) -#define GIT_ATTR_FNMATCH_ALLOWSPACE (1U << 6) -#define GIT_ATTR_FNMATCH_ICASE (1U << 7) -#define GIT_ATTR_FNMATCH_MATCH_ALL (1U << 8) -#define GIT_ATTR_FNMATCH_ALLOWNEG (1U << 9) -#define GIT_ATTR_FNMATCH_ALLOWMACRO (1U << 10) -#define GIT_ATTR_FNMATCH_LEADINGDIR (1U << 11) -#define GIT_ATTR_FNMATCH_NOLEADINGDIR (1U << 12) - -#define GIT_ATTR_FNMATCH__INCOMING \ - (GIT_ATTR_FNMATCH_ALLOWSPACE | GIT_ATTR_FNMATCH_ALLOWNEG | \ - GIT_ATTR_FNMATCH_ALLOWMACRO | GIT_ATTR_FNMATCH_NOLEADINGDIR) - -typedef enum { - GIT_ATTR_FILE__IN_MEMORY = 0, - GIT_ATTR_FILE__FROM_FILE = 1, - GIT_ATTR_FILE__FROM_INDEX = 2, - - GIT_ATTR_FILE_NUM_SOURCES = 3 -} git_attr_file_source; - -extern const char *git_attr__true; -extern const char *git_attr__false; -extern const char *git_attr__unset; - -typedef struct { - char *pattern; - size_t length; - char *containing_dir; - size_t containing_dir_length; - unsigned int flags; -} git_attr_fnmatch; - -typedef struct { - git_attr_fnmatch match; - git_vector assigns; /* vector of */ -} git_attr_rule; - -typedef struct { - git_refcount unused; - const char *name; - uint32_t name_hash; -} git_attr_name; - -typedef struct { - git_refcount rc; /* for macros */ - char *name; - uint32_t name_hash; - const char *value; -} git_attr_assignment; - -typedef struct git_attr_file_entry git_attr_file_entry; - -typedef struct { - git_refcount rc; - git_mutex lock; - git_attr_file_entry *entry; - git_attr_file_source source; - git_vector rules; /* vector of or */ - git_pool pool; - unsigned int nonexistent:1; - int session_key; - union { - git_oid oid; - git_futils_filestamp stamp; - } cache_data; -} git_attr_file; - -struct git_attr_file_entry { - git_attr_file *file[GIT_ATTR_FILE_NUM_SOURCES]; - const char *path; /* points into fullpath */ - char fullpath[GIT_FLEX_ARRAY]; -}; - -typedef struct { - git_buf full; - char *path; - char *basename; - int is_dir; -} git_attr_path; - -/* A git_attr_session can provide an "instance" of reading, to prevent cache - * invalidation during a single operation instance (like checkout). - */ - -typedef struct { - int key; - unsigned int init_setup:1, - init_sysdir:1; - git_buf sysdir; - git_buf tmp; -} git_attr_session; - -extern int git_attr_session__init(git_attr_session *attr_session, git_repository *repo); -extern void git_attr_session__free(git_attr_session *session); - -extern int git_attr_get_many_with_session( - const char **values_out, - git_repository *repo, - git_attr_session *attr_session, - uint32_t flags, - const char *path, - size_t num_attr, - const char **names); - -typedef int (*git_attr_file_parser)( - git_repository *repo, - git_attr_file *file, - const char *data); - -/* - * git_attr_file API - */ - -int git_attr_file__new( - git_attr_file **out, - git_attr_file_entry *entry, - git_attr_file_source source); - -void git_attr_file__free(git_attr_file *file); - -int git_attr_file__load( - git_attr_file **out, - git_repository *repo, - git_attr_session *attr_session, - git_attr_file_entry *ce, - git_attr_file_source source, - git_attr_file_parser parser); - -int git_attr_file__load_standalone( - git_attr_file **out, const char *path); - -int git_attr_file__out_of_date( - git_repository *repo, git_attr_session *session, git_attr_file *file); - -int git_attr_file__parse_buffer( - git_repository *repo, git_attr_file *attrs, const char *data); - -int git_attr_file__clear_rules( - git_attr_file *file, bool need_lock); - -int git_attr_file__lookup_one( - git_attr_file *file, - git_attr_path *path, - const char *attr, - const char **value); - -/* loop over rules in file from bottom to top */ -#define git_attr_file__foreach_matching_rule(file, path, iter, rule) \ - git_vector_rforeach(&(file)->rules, (iter), (rule)) \ - if (git_attr_rule__match((rule), (path))) - -uint32_t git_attr_file__name_hash(const char *name); - - -/* - * other utilities - */ - -extern int git_attr_fnmatch__parse( - git_attr_fnmatch *spec, - git_pool *pool, - const char *source, - const char **base); - -extern bool git_attr_fnmatch__match( - git_attr_fnmatch *rule, - git_attr_path *path); - -extern void git_attr_rule__free(git_attr_rule *rule); - -extern bool git_attr_rule__match( - git_attr_rule *rule, - git_attr_path *path); - -extern git_attr_assignment *git_attr_rule__lookup_assignment( - git_attr_rule *rule, const char *name); - -typedef enum { GIT_DIR_FLAG_TRUE = 1, GIT_DIR_FLAG_FALSE = 0, GIT_DIR_FLAG_UNKNOWN = -1 } git_dir_flag; - -extern int git_attr_path__init( - git_attr_path *info, const char *path, const char *base, git_dir_flag is_dir); - -extern void git_attr_path__free(git_attr_path *info); - -extern int git_attr_assignment__parse( - git_repository *repo, /* needed to expand macros */ - git_pool *pool, - git_vector *assigns, - const char **scan); - -#endif diff --git a/vendor/libgit2/src/attrcache.c b/vendor/libgit2/src/attrcache.c deleted file mode 100644 index 5bc2604605..0000000000 --- a/vendor/libgit2/src/attrcache.c +++ /dev/null @@ -1,455 +0,0 @@ -#include "common.h" -#include "repository.h" -#include "attr_file.h" -#include "config.h" -#include "sysdir.h" -#include "ignore.h" - -GIT__USE_STRMAP - -GIT_INLINE(int) attr_cache_lock(git_attr_cache *cache) -{ - GIT_UNUSED(cache); /* avoid warning if threading is off */ - - if (git_mutex_lock(&cache->lock) < 0) { - giterr_set(GITERR_OS, "Unable to get attr cache lock"); - return -1; - } - return 0; -} - -GIT_INLINE(void) attr_cache_unlock(git_attr_cache *cache) -{ - GIT_UNUSED(cache); /* avoid warning if threading is off */ - git_mutex_unlock(&cache->lock); -} - -GIT_INLINE(git_attr_file_entry *) attr_cache_lookup_entry( - git_attr_cache *cache, const char *path) -{ - khiter_t pos = git_strmap_lookup_index(cache->files, path); - - if (git_strmap_valid_index(cache->files, pos)) - return git_strmap_value_at(cache->files, pos); - else - return NULL; -} - -int git_attr_cache__alloc_file_entry( - git_attr_file_entry **out, - const char *base, - const char *path, - git_pool *pool) -{ - size_t baselen = 0, pathlen = strlen(path); - size_t cachesize = sizeof(git_attr_file_entry) + pathlen + 1; - git_attr_file_entry *ce; - - if (base != NULL && git_path_root(path) < 0) { - baselen = strlen(base); - cachesize += baselen; - - if (baselen && base[baselen - 1] != '/') - cachesize++; - } - - ce = git_pool_mallocz(pool, (uint32_t)cachesize); - GITERR_CHECK_ALLOC(ce); - - if (baselen) { - memcpy(ce->fullpath, base, baselen); - - if (base[baselen - 1] != '/') - ce->fullpath[baselen++] = '/'; - } - memcpy(&ce->fullpath[baselen], path, pathlen); - - ce->path = &ce->fullpath[baselen]; - *out = ce; - - return 0; -} - -/* call with attrcache locked */ -static int attr_cache_make_entry( - git_attr_file_entry **out, git_repository *repo, const char *path) -{ - int error = 0; - git_attr_cache *cache = git_repository_attr_cache(repo); - git_attr_file_entry *entry = NULL; - - error = git_attr_cache__alloc_file_entry( - &entry, git_repository_workdir(repo), path, &cache->pool); - - if (!error) { - git_strmap_insert(cache->files, entry->path, entry, error); - if (error > 0) - error = 0; - } - - *out = entry; - return error; -} - -/* insert entry or replace existing if we raced with another thread */ -static int attr_cache_upsert(git_attr_cache *cache, git_attr_file *file) -{ - git_attr_file_entry *entry; - git_attr_file *old; - - if (attr_cache_lock(cache) < 0) - return -1; - - entry = attr_cache_lookup_entry(cache, file->entry->path); - - GIT_REFCOUNT_OWN(file, entry); - GIT_REFCOUNT_INC(file); - - old = git__compare_and_swap( - &entry->file[file->source], entry->file[file->source], file); - - if (old) { - GIT_REFCOUNT_OWN(old, NULL); - git_attr_file__free(old); - } - - attr_cache_unlock(cache); - return 0; -} - -static int attr_cache_remove(git_attr_cache *cache, git_attr_file *file) -{ - int error = 0; - git_attr_file_entry *entry; - - if (!file) - return 0; - if ((error = attr_cache_lock(cache)) < 0) - return error; - - if ((entry = attr_cache_lookup_entry(cache, file->entry->path)) != NULL) - file = git__compare_and_swap(&entry->file[file->source], file, NULL); - - attr_cache_unlock(cache); - - if (file) { - GIT_REFCOUNT_OWN(file, NULL); - git_attr_file__free(file); - } - - return error; -} - -/* Look up cache entry and file. - * - If entry is not present, create it while the cache is locked. - * - If file is present, increment refcount before returning it, so the - * cache can be unlocked and it won't go away. - */ -static int attr_cache_lookup( - git_attr_file **out_file, - git_attr_file_entry **out_entry, - git_repository *repo, - git_attr_session *attr_session, - git_attr_file_source source, - const char *base, - const char *filename) -{ - int error = 0; - git_buf path = GIT_BUF_INIT; - const char *wd = git_repository_workdir(repo), *relfile; - git_attr_cache *cache = git_repository_attr_cache(repo); - git_attr_file_entry *entry = NULL; - git_attr_file *file = NULL; - - /* join base and path as needed */ - if (base != NULL && git_path_root(filename) < 0) { - git_buf *p = attr_session ? &attr_session->tmp : &path; - - if (git_buf_joinpath(p, base, filename) < 0) - return -1; - - filename = p->ptr; - } - - relfile = filename; - if (wd && !git__prefixcmp(relfile, wd)) - relfile += strlen(wd); - - /* check cache for existing entry */ - if ((error = attr_cache_lock(cache)) < 0) - goto cleanup; - - entry = attr_cache_lookup_entry(cache, relfile); - if (!entry) - error = attr_cache_make_entry(&entry, repo, relfile); - else if (entry->file[source] != NULL) { - file = entry->file[source]; - GIT_REFCOUNT_INC(file); - } - - attr_cache_unlock(cache); - -cleanup: - *out_file = file; - *out_entry = entry; - - git_buf_free(&path); - return error; -} - -int git_attr_cache__get( - git_attr_file **out, - git_repository *repo, - git_attr_session *attr_session, - git_attr_file_source source, - const char *base, - const char *filename, - git_attr_file_parser parser) -{ - int error = 0; - git_attr_cache *cache = git_repository_attr_cache(repo); - git_attr_file_entry *entry = NULL; - git_attr_file *file = NULL, *updated = NULL; - - if ((error = attr_cache_lookup( - &file, &entry, repo, attr_session, source, base, filename)) < 0) - return error; - - /* load file if we don't have one or if existing one is out of date */ - if (!file || (error = git_attr_file__out_of_date(repo, attr_session, file)) > 0) - error = git_attr_file__load(&updated, repo, attr_session, entry, source, parser); - - /* if we loaded the file, insert into and/or update cache */ - if (updated) { - if ((error = attr_cache_upsert(cache, updated)) < 0) - git_attr_file__free(updated); - else { - git_attr_file__free(file); /* offset incref from lookup */ - file = updated; - } - } - - /* if file could not be loaded */ - if (error < 0) { - /* remove existing entry */ - if (file) { - attr_cache_remove(cache, file); - git_attr_file__free(file); /* offset incref from lookup */ - file = NULL; - } - /* no error if file simply doesn't exist */ - if (error == GIT_ENOTFOUND) { - giterr_clear(); - error = 0; - } - } - - *out = file; - return error; -} - -bool git_attr_cache__is_cached( - git_repository *repo, - git_attr_file_source source, - const char *filename) -{ - git_attr_cache *cache = git_repository_attr_cache(repo); - git_strmap *files; - khiter_t pos; - git_attr_file_entry *entry; - - if (!cache || !(files = cache->files)) - return false; - - pos = git_strmap_lookup_index(files, filename); - if (!git_strmap_valid_index(files, pos)) - return false; - - entry = git_strmap_value_at(files, pos); - - return entry && (entry->file[source] != NULL); -} - - -static int attr_cache__lookup_path( - char **out, git_config *cfg, const char *key, const char *fallback) -{ - git_buf buf = GIT_BUF_INIT; - int error; - git_config_entry *entry = NULL; - - *out = NULL; - - if ((error = git_config__lookup_entry(&entry, cfg, key, false)) < 0) - return error; - - if (entry) { - const char *cfgval = entry->value; - - /* expand leading ~/ as needed */ - if (cfgval && cfgval[0] == '~' && cfgval[1] == '/' && - !git_sysdir_find_global_file(&buf, &cfgval[2])) - *out = git_buf_detach(&buf); - else if (cfgval) - *out = git__strdup(cfgval); - } - else if (!git_sysdir_find_xdg_file(&buf, fallback)) - *out = git_buf_detach(&buf); - - git_config_entry_free(entry); - git_buf_free(&buf); - - return error; -} - -static void attr_cache__free(git_attr_cache *cache) -{ - bool unlock; - - if (!cache) - return; - - unlock = (git_mutex_lock(&cache->lock) == 0); - - if (cache->files != NULL) { - git_attr_file_entry *entry; - git_attr_file *file; - int i; - - git_strmap_foreach_value(cache->files, entry, { - for (i = 0; i < GIT_ATTR_FILE_NUM_SOURCES; ++i) { - if ((file = git__swap(entry->file[i], NULL)) != NULL) { - GIT_REFCOUNT_OWN(file, NULL); - git_attr_file__free(file); - } - } - }); - git_strmap_free(cache->files); - } - - if (cache->macros != NULL) { - git_attr_rule *rule; - - git_strmap_foreach_value(cache->macros, rule, { - git_attr_rule__free(rule); - }); - git_strmap_free(cache->macros); - } - - git_pool_clear(&cache->pool); - - git__free(cache->cfg_attr_file); - cache->cfg_attr_file = NULL; - - git__free(cache->cfg_excl_file); - cache->cfg_excl_file = NULL; - - if (unlock) - git_mutex_unlock(&cache->lock); - git_mutex_free(&cache->lock); - - git__free(cache); -} - -int git_attr_cache__do_init(git_repository *repo) -{ - int ret = 0; - git_attr_cache *cache = git_repository_attr_cache(repo); - git_config *cfg = NULL; - - if (cache) - return 0; - - cache = git__calloc(1, sizeof(git_attr_cache)); - GITERR_CHECK_ALLOC(cache); - - /* set up lock */ - if (git_mutex_init(&cache->lock) < 0) { - giterr_set(GITERR_OS, "Unable to initialize lock for attr cache"); - git__free(cache); - return -1; - } - - if ((ret = git_repository_config_snapshot(&cfg, repo)) < 0) - goto cancel; - - /* cache config settings for attributes and ignores */ - ret = attr_cache__lookup_path( - &cache->cfg_attr_file, cfg, GIT_ATTR_CONFIG, GIT_ATTR_FILE_XDG); - if (ret < 0) - goto cancel; - - ret = attr_cache__lookup_path( - &cache->cfg_excl_file, cfg, GIT_IGNORE_CONFIG, GIT_IGNORE_FILE_XDG); - if (ret < 0) - goto cancel; - - /* allocate hashtable for attribute and ignore file contents, - * hashtable for attribute macros, and string pool - */ - if ((ret = git_strmap_alloc(&cache->files)) < 0 || - (ret = git_strmap_alloc(&cache->macros)) < 0 || - (ret = git_pool_init(&cache->pool, 1, 0)) < 0) - goto cancel; - - cache = git__compare_and_swap(&repo->attrcache, NULL, cache); - if (cache) - goto cancel; /* raced with another thread, free this but no error */ - - git_config_free(cfg); - - /* insert default macros */ - return git_attr_add_macro(repo, "binary", "-diff -crlf -text"); - -cancel: - attr_cache__free(cache); - git_config_free(cfg); - return ret; -} - -void git_attr_cache_flush(git_repository *repo) -{ - git_attr_cache *cache; - - /* this could be done less expensively, but for now, we'll just free - * the entire attrcache and let the next use reinitialize it... - */ - if (repo && (cache = git__swap(repo->attrcache, NULL)) != NULL) - attr_cache__free(cache); -} - -int git_attr_cache__insert_macro(git_repository *repo, git_attr_rule *macro) -{ - git_attr_cache *cache = git_repository_attr_cache(repo); - git_strmap *macros = cache->macros; - int error; - - /* TODO: generate warning log if (macro->assigns.length == 0) */ - if (macro->assigns.length == 0) - return 0; - - if (git_mutex_lock(&cache->lock) < 0) { - giterr_set(GITERR_OS, "Unable to get attr cache lock"); - error = -1; - } else { - git_strmap_insert(macros, macro->match.pattern, macro, error); - git_mutex_unlock(&cache->lock); - } - - return (error < 0) ? -1 : 0; -} - -git_attr_rule *git_attr_cache__lookup_macro( - git_repository *repo, const char *name) -{ - git_strmap *macros = git_repository_attr_cache(repo)->macros; - khiter_t pos; - - pos = git_strmap_lookup_index(macros, name); - - if (!git_strmap_valid_index(macros, pos)) - return NULL; - - return (git_attr_rule *)git_strmap_value_at(macros, pos); -} - diff --git a/vendor/libgit2/src/attrcache.h b/vendor/libgit2/src/attrcache.h deleted file mode 100644 index 44e1ffdce2..0000000000 --- a/vendor/libgit2/src/attrcache.h +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_attrcache_h__ -#define INCLUDE_attrcache_h__ - -#include "attr_file.h" -#include "strmap.h" - -#define GIT_ATTR_CONFIG "core.attributesfile" -#define GIT_IGNORE_CONFIG "core.excludesfile" - -typedef struct { - char *cfg_attr_file; /* cached value of core.attributesfile */ - char *cfg_excl_file; /* cached value of core.excludesfile */ - git_strmap *files; /* hash path to git_attr_cache_entry records */ - git_strmap *macros; /* hash name to vector */ - git_mutex lock; - git_pool pool; -} git_attr_cache; - -extern int git_attr_cache__do_init(git_repository *repo); - -#define git_attr_cache__init(REPO) \ - (git_repository_attr_cache(REPO) ? 0 : git_attr_cache__do_init(REPO)) - -/* get file - loading and reload as needed */ -extern int git_attr_cache__get( - git_attr_file **file, - git_repository *repo, - git_attr_session *attr_session, - git_attr_file_source source, - const char *base, - const char *filename, - git_attr_file_parser parser); - -extern bool git_attr_cache__is_cached( - git_repository *repo, - git_attr_file_source source, - const char *path); - -extern int git_attr_cache__alloc_file_entry( - git_attr_file_entry **out, - const char *base, - const char *path, - git_pool *pool); - -extern int git_attr_cache__insert_macro( - git_repository *repo, git_attr_rule *macro); - -extern git_attr_rule *git_attr_cache__lookup_macro( - git_repository *repo, const char *name); - -#endif diff --git a/vendor/libgit2/src/bitvec.h b/vendor/libgit2/src/bitvec.h deleted file mode 100644 index 544832d952..0000000000 --- a/vendor/libgit2/src/bitvec.h +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_bitvec_h__ -#define INCLUDE_bitvec_h__ - -#include "common.h" - -/* - * This is a silly little fixed length bit vector type that will store - * vectors of 64 bits or less directly in the structure and allocate - * memory for vectors longer than 64 bits. You can use the two versions - * transparently through the API and avoid heap allocation completely when - * using a short bit vector as a result. - */ -typedef struct { - size_t length; - union { - uint64_t *words; - uint64_t bits; - } u; -} git_bitvec; - -GIT_INLINE(int) git_bitvec_init(git_bitvec *bv, size_t capacity) -{ - memset(bv, 0x0, sizeof(*bv)); - - if (capacity >= 64) { - bv->length = (capacity / 64) + 1; - bv->u.words = git__calloc(bv->length, sizeof(uint64_t)); - if (!bv->u.words) - return -1; - } - - return 0; -} - -#define GIT_BITVEC_MASK(BIT) ((uint64_t)1 << (BIT % 64)) -#define GIT_BITVEC_WORD(BV, BIT) (BV->length ? &BV->u.words[BIT / 64] : &BV->u.bits) - -GIT_INLINE(void) git_bitvec_set(git_bitvec *bv, size_t bit, bool on) -{ - uint64_t *word = GIT_BITVEC_WORD(bv, bit); - uint64_t mask = GIT_BITVEC_MASK(bit); - - if (on) - *word |= mask; - else - *word &= ~mask; -} - -GIT_INLINE(bool) git_bitvec_get(git_bitvec *bv, size_t bit) -{ - uint64_t *word = GIT_BITVEC_WORD(bv, bit); - return (*word & GIT_BITVEC_MASK(bit)) != 0; -} - -GIT_INLINE(void) git_bitvec_clear(git_bitvec *bv) -{ - if (!bv->length) - bv->u.bits = 0; - else - memset(bv->u.words, 0x0, bv->length * sizeof(uint64_t)); -} - -GIT_INLINE(void) git_bitvec_free(git_bitvec *bv) -{ - if (bv->length) - git__free(bv->u.words); -} - -#endif diff --git a/vendor/libgit2/src/blame.c b/vendor/libgit2/src/blame.c deleted file mode 100644 index a52f9402b6..0000000000 --- a/vendor/libgit2/src/blame.c +++ /dev/null @@ -1,511 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#include "blame.h" -#include "git2/commit.h" -#include "git2/revparse.h" -#include "git2/revwalk.h" -#include "git2/tree.h" -#include "git2/diff.h" -#include "git2/blob.h" -#include "git2/signature.h" -#include "util.h" -#include "repository.h" -#include "blame_git.h" - - -static int hunk_byfinalline_search_cmp(const void *key, const void *entry) -{ - git_blame_hunk *hunk = (git_blame_hunk*)entry; - - size_t lineno = *(size_t*)key; - size_t lines_in_hunk = (size_t)hunk->lines_in_hunk; - size_t final_start_line_number = (size_t)hunk->final_start_line_number; - - if (lineno < final_start_line_number) - return -1; - if (lineno >= final_start_line_number + lines_in_hunk) - return 1; - return 0; -} - -static int paths_cmp(const void *a, const void *b) { return git__strcmp((char*)a, (char*)b); } -static int hunk_cmp(const void *_a, const void *_b) -{ - git_blame_hunk *a = (git_blame_hunk*)_a, - *b = (git_blame_hunk*)_b; - - return a->final_start_line_number - b->final_start_line_number; -} - -static bool hunk_ends_at_or_before_line(git_blame_hunk *hunk, size_t line) -{ - return line >= (size_t)(hunk->final_start_line_number + hunk->lines_in_hunk - 1); -} - -static bool hunk_starts_at_or_after_line(git_blame_hunk *hunk, size_t line) -{ - return line <= hunk->final_start_line_number; -} - -static git_blame_hunk* new_hunk( - uint16_t start, - uint16_t lines, - uint16_t orig_start, - const char *path) -{ - git_blame_hunk *hunk = git__calloc(1, sizeof(git_blame_hunk)); - if (!hunk) return NULL; - - hunk->lines_in_hunk = lines; - hunk->final_start_line_number = start; - hunk->orig_start_line_number = orig_start; - hunk->orig_path = path ? git__strdup(path) : NULL; - - return hunk; -} - -static git_blame_hunk* dup_hunk(git_blame_hunk *hunk) -{ - git_blame_hunk *newhunk = new_hunk( - hunk->final_start_line_number, - hunk->lines_in_hunk, - hunk->orig_start_line_number, - hunk->orig_path); - - if (!newhunk) - return NULL; - - git_oid_cpy(&newhunk->orig_commit_id, &hunk->orig_commit_id); - git_oid_cpy(&newhunk->final_commit_id, &hunk->final_commit_id); - newhunk->boundary = hunk->boundary; - git_signature_dup(&newhunk->final_signature, hunk->final_signature); - git_signature_dup(&newhunk->orig_signature, hunk->orig_signature); - return newhunk; -} - -static void free_hunk(git_blame_hunk *hunk) -{ - git__free((void*)hunk->orig_path); - git_signature_free(hunk->final_signature); - git_signature_free(hunk->orig_signature); - git__free(hunk); -} - -/* Starting with the hunk that includes start_line, shift all following hunks' - * final_start_line by shift_by lines */ -static void shift_hunks_by(git_vector *v, size_t start_line, int shift_by) -{ - size_t i; - - if (!git_vector_bsearch2(&i, v, hunk_byfinalline_search_cmp, &start_line)) { - for (; i < v->length; i++) { - git_blame_hunk *hunk = (git_blame_hunk*)v->contents[i]; - hunk->final_start_line_number += shift_by; - } - } -} - -git_blame* git_blame__alloc( - git_repository *repo, - git_blame_options opts, - const char *path) -{ - git_blame *gbr = git__calloc(1, sizeof(git_blame)); - if (!gbr) - return NULL; - - gbr->repository = repo; - gbr->options = opts; - - if (git_vector_init(&gbr->hunks, 8, hunk_cmp) < 0 || - git_vector_init(&gbr->paths, 8, paths_cmp) < 0 || - (gbr->path = git__strdup(path)) == NULL || - git_vector_insert(&gbr->paths, git__strdup(path)) < 0) - { - git_blame_free(gbr); - return NULL; - } - - return gbr; -} - -void git_blame_free(git_blame *blame) -{ - size_t i; - git_blame_hunk *hunk; - - if (!blame) return; - - git_vector_foreach(&blame->hunks, i, hunk) - free_hunk(hunk); - git_vector_free(&blame->hunks); - - git_vector_free_deep(&blame->paths); - - git_array_clear(blame->line_index); - - git__free(blame->path); - git_blob_free(blame->final_blob); - git__free(blame); -} - -uint32_t git_blame_get_hunk_count(git_blame *blame) -{ - assert(blame); - return (uint32_t)blame->hunks.length; -} - -const git_blame_hunk *git_blame_get_hunk_byindex(git_blame *blame, uint32_t index) -{ - assert(blame); - return (git_blame_hunk*)git_vector_get(&blame->hunks, index); -} - -const git_blame_hunk *git_blame_get_hunk_byline(git_blame *blame, uint32_t lineno) -{ - size_t i, new_lineno = (size_t)lineno; - assert(blame); - - if (!git_vector_bsearch2(&i, &blame->hunks, hunk_byfinalline_search_cmp, &new_lineno)) { - return git_blame_get_hunk_byindex(blame, (uint32_t)i); - } - - return NULL; -} - -static void normalize_options( - git_blame_options *out, - const git_blame_options *in, - git_repository *repo) -{ - git_blame_options dummy = GIT_BLAME_OPTIONS_INIT; - if (!in) in = &dummy; - - memcpy(out, in, sizeof(git_blame_options)); - - /* No newest_commit => HEAD */ - if (git_oid_iszero(&out->newest_commit)) { - git_reference_name_to_id(&out->newest_commit, repo, "HEAD"); - } - - /* min_line 0 really means 1 */ - if (!out->min_line) out->min_line = 1; - /* max_line 0 really means N, but we don't know N yet */ - - /* Fix up option implications */ - if (out->flags & GIT_BLAME_TRACK_COPIES_ANY_COMMIT_COPIES) - out->flags |= GIT_BLAME_TRACK_COPIES_SAME_COMMIT_COPIES; - if (out->flags & GIT_BLAME_TRACK_COPIES_SAME_COMMIT_COPIES) - out->flags |= GIT_BLAME_TRACK_COPIES_SAME_COMMIT_MOVES; - if (out->flags & GIT_BLAME_TRACK_COPIES_SAME_COMMIT_MOVES) - out->flags |= GIT_BLAME_TRACK_COPIES_SAME_FILE; -} - -static git_blame_hunk *split_hunk_in_vector( - git_vector *vec, - git_blame_hunk *hunk, - size_t rel_line, - bool return_new) -{ - size_t new_line_count; - git_blame_hunk *nh; - - /* Don't split if already at a boundary */ - if (rel_line <= 0 || - rel_line >= hunk->lines_in_hunk) - { - return hunk; - } - - new_line_count = hunk->lines_in_hunk - rel_line; - nh = new_hunk((uint16_t)(hunk->final_start_line_number+rel_line), (uint16_t)new_line_count, - (uint16_t)(hunk->orig_start_line_number+rel_line), hunk->orig_path); - - if (!nh) - return NULL; - - git_oid_cpy(&nh->final_commit_id, &hunk->final_commit_id); - git_oid_cpy(&nh->orig_commit_id, &hunk->orig_commit_id); - - /* Adjust hunk that was split */ - hunk->lines_in_hunk -= (uint16_t)new_line_count; - git_vector_insert_sorted(vec, nh, NULL); - { - git_blame_hunk *ret = return_new ? nh : hunk; - return ret; - } -} - -/* - * Construct a list of char indices for where lines begin - * Adapted from core git: - * https://github.com/gitster/git/blob/be5c9fb9049ed470e7005f159bb923a5f4de1309/builtin/blame.c#L1760-L1789 - */ -static int index_blob_lines(git_blame *blame) -{ - const char *buf = blame->final_buf; - git_off_t len = blame->final_buf_size; - int num = 0, incomplete = 0, bol = 1; - size_t *i; - - if (len && buf[len-1] != '\n') - incomplete++; /* incomplete line at the end */ - while (len--) { - if (bol) { - i = git_array_alloc(blame->line_index); - GITERR_CHECK_ALLOC(i); - *i = buf - blame->final_buf; - bol = 0; - } - if (*buf++ == '\n') { - num++; - bol = 1; - } - } - i = git_array_alloc(blame->line_index); - GITERR_CHECK_ALLOC(i); - *i = buf - blame->final_buf; - blame->num_lines = num + incomplete; - return blame->num_lines; -} - -static git_blame_hunk* hunk_from_entry(git_blame__entry *e) -{ - git_blame_hunk *h = new_hunk( - e->lno+1, e->num_lines, e->s_lno+1, e->suspect->path); - - if (!h) - return NULL; - - git_oid_cpy(&h->final_commit_id, git_commit_id(e->suspect->commit)); - git_oid_cpy(&h->orig_commit_id, git_commit_id(e->suspect->commit)); - git_signature_dup(&h->final_signature, git_commit_author(e->suspect->commit)); - git_signature_dup(&h->orig_signature, git_commit_author(e->suspect->commit)); - h->boundary = e->is_boundary ? 1 : 0; - return h; -} - -static int load_blob(git_blame *blame) -{ - int error; - - if (blame->final_blob) return 0; - - error = git_commit_lookup(&blame->final, blame->repository, &blame->options.newest_commit); - if (error < 0) - goto cleanup; - error = git_object_lookup_bypath((git_object**)&blame->final_blob, - (git_object*)blame->final, blame->path, GIT_OBJ_BLOB); - -cleanup: - return error; -} - -static int blame_internal(git_blame *blame) -{ - int error; - git_blame__entry *ent = NULL; - git_blame__origin *o; - - if ((error = load_blob(blame)) < 0 || - (error = git_blame__get_origin(&o, blame, blame->final, blame->path)) < 0) - goto cleanup; - blame->final_buf = git_blob_rawcontent(blame->final_blob); - blame->final_buf_size = git_blob_rawsize(blame->final_blob); - - ent = git__calloc(1, sizeof(git_blame__entry)); - GITERR_CHECK_ALLOC(ent); - - ent->num_lines = index_blob_lines(blame); - ent->lno = blame->options.min_line - 1; - ent->num_lines = ent->num_lines - blame->options.min_line + 1; - if (blame->options.max_line > 0) - ent->num_lines = blame->options.max_line - blame->options.min_line + 1; - ent->s_lno = ent->lno; - ent->suspect = o; - - blame->ent = ent; - - git_blame__like_git(blame, blame->options.flags); - -cleanup: - for (ent = blame->ent; ent; ) { - git_blame__entry *e = ent->next; - git_blame_hunk *h = hunk_from_entry(ent); - - git_vector_insert(&blame->hunks, h); - - git_blame__free_entry(ent); - ent = e; - } - - return error; -} - -/******************************************************************************* - * File blaming - ******************************************************************************/ - -int git_blame_file( - git_blame **out, - git_repository *repo, - const char *path, - git_blame_options *options) -{ - int error = -1; - git_blame_options normOptions = GIT_BLAME_OPTIONS_INIT; - git_blame *blame = NULL; - - assert(out && repo && path); - normalize_options(&normOptions, options, repo); - - blame = git_blame__alloc(repo, normOptions, path); - GITERR_CHECK_ALLOC(blame); - - if ((error = load_blob(blame)) < 0) - goto on_error; - - if ((error = blame_internal(blame)) < 0) - goto on_error; - - *out = blame; - return 0; - -on_error: - git_blame_free(blame); - return error; -} - -/******************************************************************************* - * Buffer blaming - *******************************************************************************/ - -static bool hunk_is_bufferblame(git_blame_hunk *hunk) -{ - return git_oid_iszero(&hunk->final_commit_id); -} - -static int buffer_hunk_cb( - const git_diff_delta *delta, - const git_diff_hunk *hunk, - void *payload) -{ - git_blame *blame = (git_blame*)payload; - uint32_t wedge_line; - - GIT_UNUSED(delta); - - wedge_line = (hunk->old_lines == 0) ? hunk->new_start : hunk->old_start; - blame->current_diff_line = wedge_line; - - blame->current_hunk = (git_blame_hunk*)git_blame_get_hunk_byline(blame, wedge_line); - if (!blame->current_hunk) { - /* Line added at the end of the file */ - blame->current_hunk = new_hunk(wedge_line, 0, wedge_line, blame->path); - GITERR_CHECK_ALLOC(blame->current_hunk); - - git_vector_insert(&blame->hunks, blame->current_hunk); - } else if (!hunk_starts_at_or_after_line(blame->current_hunk, wedge_line)){ - /* If this hunk doesn't start between existing hunks, split a hunk up so it does */ - blame->current_hunk = split_hunk_in_vector(&blame->hunks, blame->current_hunk, - wedge_line - blame->current_hunk->orig_start_line_number, true); - GITERR_CHECK_ALLOC(blame->current_hunk); - } - - return 0; -} - -static int ptrs_equal_cmp(const void *a, const void *b) { return ab ? 1 : 0; } -static int buffer_line_cb( - const git_diff_delta *delta, - const git_diff_hunk *hunk, - const git_diff_line *line, - void *payload) -{ - git_blame *blame = (git_blame*)payload; - - GIT_UNUSED(delta); - GIT_UNUSED(hunk); - GIT_UNUSED(line); - - if (line->origin == GIT_DIFF_LINE_ADDITION) { - if (hunk_is_bufferblame(blame->current_hunk) && - hunk_ends_at_or_before_line(blame->current_hunk, blame->current_diff_line)) { - /* Append to the current buffer-blame hunk */ - blame->current_hunk->lines_in_hunk++; - shift_hunks_by(&blame->hunks, blame->current_diff_line+1, 1); - } else { - /* Create a new buffer-blame hunk with this line */ - shift_hunks_by(&blame->hunks, blame->current_diff_line, 1); - blame->current_hunk = new_hunk((uint16_t)blame->current_diff_line, 1, 0, blame->path); - GITERR_CHECK_ALLOC(blame->current_hunk); - - git_vector_insert_sorted(&blame->hunks, blame->current_hunk, NULL); - } - blame->current_diff_line++; - } - - if (line->origin == GIT_DIFF_LINE_DELETION) { - /* Trim the line from the current hunk; remove it if it's now empty */ - size_t shift_base = blame->current_diff_line + blame->current_hunk->lines_in_hunk+1; - - if (--(blame->current_hunk->lines_in_hunk) == 0) { - size_t i; - shift_base--; - if (!git_vector_search2(&i, &blame->hunks, ptrs_equal_cmp, blame->current_hunk)) { - git_vector_remove(&blame->hunks, i); - free_hunk(blame->current_hunk); - blame->current_hunk = (git_blame_hunk*)git_blame_get_hunk_byindex(blame, (uint32_t)i); - } - } - shift_hunks_by(&blame->hunks, shift_base, -1); - } - return 0; -} - -int git_blame_buffer( - git_blame **out, - git_blame *reference, - const char *buffer, - size_t buffer_len) -{ - git_blame *blame; - git_diff_options diffopts = GIT_DIFF_OPTIONS_INIT; - size_t i; - git_blame_hunk *hunk; - - diffopts.context_lines = 0; - - assert(out && reference && buffer && buffer_len); - - blame = git_blame__alloc(reference->repository, reference->options, reference->path); - GITERR_CHECK_ALLOC(blame); - - /* Duplicate all of the hunk structures in the reference blame */ - git_vector_foreach(&reference->hunks, i, hunk) { - git_blame_hunk *h = dup_hunk(hunk); - GITERR_CHECK_ALLOC(h); - - git_vector_insert(&blame->hunks, h); - } - - /* Diff to the reference blob */ - git_diff_blob_to_buffer(reference->final_blob, blame->path, - buffer, buffer_len, blame->path, &diffopts, - NULL, NULL, buffer_hunk_cb, buffer_line_cb, blame); - - *out = blame; - return 0; -} - -int git_blame_init_options(git_blame_options *opts, unsigned int version) -{ - GIT_INIT_STRUCTURE_FROM_TEMPLATE( - opts, version, git_blame_options, GIT_BLAME_OPTIONS_INIT); - return 0; -} diff --git a/vendor/libgit2/src/blame.h b/vendor/libgit2/src/blame.h deleted file mode 100644 index 7e23de8087..0000000000 --- a/vendor/libgit2/src/blame.h +++ /dev/null @@ -1,93 +0,0 @@ -#ifndef INCLUDE_blame_h__ -#define INCLUDE_blame_h__ - -#include "git2/blame.h" -#include "common.h" -#include "vector.h" -#include "diff.h" -#include "array.h" -#include "git2/oid.h" - -/* - * One blob in a commit that is being suspected - */ -typedef struct git_blame__origin { - int refcnt; - struct git_blame__origin *previous; - git_commit *commit; - git_blob *blob; - char path[GIT_FLEX_ARRAY]; -} git_blame__origin; - -/* - * Each group of lines is described by a git_blame__entry; it can be split - * as we pass blame to the parents. They form a linked list in the - * scoreboard structure, sorted by the target line number. - */ -typedef struct git_blame__entry { - struct git_blame__entry *prev; - struct git_blame__entry *next; - - /* the first line of this group in the final image; - * internally all line numbers are 0 based. - */ - int lno; - - /* how many lines this group has */ - int num_lines; - - /* the commit that introduced this group into the final image */ - git_blame__origin *suspect; - - /* true if the suspect is truly guilty; false while we have not - * checked if the group came from one of its parents. - */ - bool guilty; - - /* true if the entry has been scanned for copies in the current parent - */ - bool scanned; - - /* the line number of the first line of this group in the - * suspect's file; internally all line numbers are 0 based. - */ - int s_lno; - - /* how significant this entry is -- cached to avoid - * scanning the lines over and over. - */ - unsigned score; - - /* Whether this entry has been tracked to a boundary commit. - */ - bool is_boundary; -} git_blame__entry; - -struct git_blame { - char *path; - git_repository *repository; - git_blame_options options; - - git_vector hunks; - git_vector paths; - - git_blob *final_blob; - git_array_t(size_t) line_index; - - size_t current_diff_line; - git_blame_hunk *current_hunk; - - /* Scoreboard fields */ - git_commit *final; - git_blame__entry *ent; - int num_lines; - const char *final_buf; - git_off_t final_buf_size; -}; - -git_blame *git_blame__alloc( - git_repository *repo, - git_blame_options opts, - const char *path); - -#endif diff --git a/vendor/libgit2/src/blame_git.c b/vendor/libgit2/src/blame_git.c deleted file mode 100644 index f481426aa8..0000000000 --- a/vendor/libgit2/src/blame_git.c +++ /dev/null @@ -1,623 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#include "blame_git.h" -#include "commit.h" -#include "blob.h" -#include "xdiff/xinclude.h" - -/* - * Origin is refcounted and usually we keep the blob contents to be - * reused. - */ -static git_blame__origin *origin_incref(git_blame__origin *o) -{ - if (o) - o->refcnt++; - return o; -} - -static void origin_decref(git_blame__origin *o) -{ - if (o && --o->refcnt <= 0) { - if (o->previous) - origin_decref(o->previous); - git_blob_free(o->blob); - git_commit_free(o->commit); - git__free(o); - } -} - -/* Given a commit and a path in it, create a new origin structure. */ -static int make_origin(git_blame__origin **out, git_commit *commit, const char *path) -{ - git_blame__origin *o; - size_t path_len = strlen(path), alloc_len; - int error = 0; - - GITERR_CHECK_ALLOC_ADD(&alloc_len, sizeof(*o), path_len); - GITERR_CHECK_ALLOC_ADD(&alloc_len, alloc_len, 1); - o = git__calloc(1, alloc_len); - GITERR_CHECK_ALLOC(o); - - o->commit = commit; - o->refcnt = 1; - strcpy(o->path, path); - - if (!(error = git_object_lookup_bypath((git_object**)&o->blob, (git_object*)commit, - path, GIT_OBJ_BLOB))) { - *out = o; - } else { - origin_decref(o); - } - return error; -} - -/* Locate an existing origin or create a new one. */ -int git_blame__get_origin( - git_blame__origin **out, - git_blame *blame, - git_commit *commit, - const char *path) -{ - git_blame__entry *e; - - for (e = blame->ent; e; e = e->next) { - if (e->suspect->commit == commit && !strcmp(e->suspect->path, path)) { - *out = origin_incref(e->suspect); - } - } - return make_origin(out, commit, path); -} - -typedef struct blame_chunk_cb_data { - git_blame *blame; - git_blame__origin *target; - git_blame__origin *parent; - long tlno; - long plno; -}blame_chunk_cb_data; - -static bool same_suspect(git_blame__origin *a, git_blame__origin *b) -{ - if (a == b) - return true; - if (git_oid_cmp(git_commit_id(a->commit), git_commit_id(b->commit))) - return false; - return 0 == strcmp(a->path, b->path); -} - -/* find the line number of the last line the target is suspected for */ -static int find_last_in_target(git_blame *blame, git_blame__origin *target) -{ - git_blame__entry *e; - int last_in_target = -1; - - for (e=blame->ent; e; e=e->next) { - if (e->guilty || !same_suspect(e->suspect, target)) - continue; - if (last_in_target < e->s_lno + e->num_lines) - last_in_target = e->s_lno + e->num_lines; - } - return last_in_target; -} - -/* - * It is known that lines between tlno to same came from parent, and e - * has an overlap with that range. it also is known that parent's - * line plno corresponds to e's line tlno. - * - * <---- e -----> - * <------> (entirely within) - * <------------> (extends past) - * <------------> (starts before) - * <------------------> (entirely encloses) - * - * Split e into potentially three parts; before this chunk, the chunk - * to be blamed for the parent, and after that portion. - */ -static void split_overlap(git_blame__entry *split, git_blame__entry *e, - int tlno, int plno, int same, git_blame__origin *parent) -{ - int chunk_end_lno; - - if (e->s_lno < tlno) { - /* there is a pre-chunk part not blamed on the parent */ - split[0].suspect = origin_incref(e->suspect); - split[0].lno = e->lno; - split[0].s_lno = e->s_lno; - split[0].num_lines = tlno - e->s_lno; - split[1].lno = e->lno + tlno - e->s_lno; - split[1].s_lno = plno; - } else { - split[1].lno = e->lno; - split[1].s_lno = plno + (e->s_lno - tlno); - } - - if (same < e->s_lno + e->num_lines) { - /* there is a post-chunk part not blamed on parent */ - split[2].suspect = origin_incref(e->suspect); - split[2].lno = e->lno + (same - e->s_lno); - split[2].s_lno = e->s_lno + (same - e->s_lno); - split[2].num_lines = e->s_lno + e->num_lines - same; - chunk_end_lno = split[2].lno; - } else { - chunk_end_lno = e->lno + e->num_lines; - } - split[1].num_lines = chunk_end_lno - split[1].lno; - - /* - * if it turns out there is nothing to blame the parent for, forget about - * the splitting. !split[1].suspect signals this. - */ - if (split[1].num_lines < 1) - return; - split[1].suspect = origin_incref(parent); -} - -/* - * Link in a new blame entry to the scoreboard. Entries that cover the same - * line range have been removed from the scoreboard previously. - */ -static void add_blame_entry(git_blame *blame, git_blame__entry *e) -{ - git_blame__entry *ent, *prev = NULL; - - origin_incref(e->suspect); - - for (ent = blame->ent; ent && ent->lno < e->lno; ent = ent->next) - prev = ent; - - /* prev, if not NULL, is the last one that is below e */ - e->prev = prev; - if (prev) { - e->next = prev->next; - prev->next = e; - } else { - e->next = blame->ent; - blame->ent = e; - } - if (e->next) - e->next->prev = e; -} - -/* - * src typically is on-stack; we want to copy the information in it to - * a malloced blame_entry that is already on the linked list of the scoreboard. - * The origin of dst loses a refcnt while the origin of src gains one. - */ -static void dup_entry(git_blame__entry *dst, git_blame__entry *src) -{ - git_blame__entry *p, *n; - - p = dst->prev; - n = dst->next; - origin_incref(src->suspect); - origin_decref(dst->suspect); - memcpy(dst, src, sizeof(*src)); - dst->prev = p; - dst->next = n; - dst->score = 0; -} - -/* - * split_overlap() divided an existing blame e into up to three parts in split. - * Adjust the linked list of blames in the scoreboard to reflect the split. - */ -static void split_blame(git_blame *blame, git_blame__entry *split, git_blame__entry *e) -{ - git_blame__entry *new_entry; - - if (split[0].suspect && split[2].suspect) { - /* The first part (reuse storage for the existing entry e */ - dup_entry(e, &split[0]); - - /* The last part -- me */ - new_entry = git__malloc(sizeof(*new_entry)); - memcpy(new_entry, &(split[2]), sizeof(git_blame__entry)); - add_blame_entry(blame, new_entry); - - /* ... and the middle part -- parent */ - new_entry = git__malloc(sizeof(*new_entry)); - memcpy(new_entry, &(split[1]), sizeof(git_blame__entry)); - add_blame_entry(blame, new_entry); - } else if (!split[0].suspect && !split[2].suspect) { - /* - * The parent covers the entire area; reuse storage for e and replace it - * with the parent - */ - dup_entry(e, &split[1]); - } else if (split[0].suspect) { - /* me and then parent */ - dup_entry(e, &split[0]); - new_entry = git__malloc(sizeof(*new_entry)); - memcpy(new_entry, &(split[1]), sizeof(git_blame__entry)); - add_blame_entry(blame, new_entry); - } else { - /* parent and then me */ - dup_entry(e, &split[1]); - new_entry = git__malloc(sizeof(*new_entry)); - memcpy(new_entry, &(split[2]), sizeof(git_blame__entry)); - add_blame_entry(blame, new_entry); - } -} - -/* - * After splitting the blame, the origins used by the on-stack blame_entry - * should lose one refcnt each. - */ -static void decref_split(git_blame__entry *split) -{ - int i; - for (i=0; i<3; i++) - origin_decref(split[i].suspect); -} - -/* - * Helper for blame_chunk(). blame_entry e is known to overlap with the patch - * hunk; split it and pass blame to the parent. - */ -static void blame_overlap( - git_blame *blame, - git_blame__entry *e, - int tlno, - int plno, - int same, - git_blame__origin *parent) -{ - git_blame__entry split[3] = {{0}}; - - split_overlap(split, e, tlno, plno, same, parent); - if (split[1].suspect) - split_blame(blame, split, e); - decref_split(split); -} - -/* - * Process one hunk from the patch between the current suspect for blame_entry - * e and its parent. Find and split the overlap, and pass blame to the - * overlapping part to the parent. - */ -static void blame_chunk( - git_blame *blame, - int tlno, - int plno, - int same, - git_blame__origin *target, - git_blame__origin *parent) -{ - git_blame__entry *e; - - for (e = blame->ent; e; e = e->next) { - if (e->guilty || !same_suspect(e->suspect, target)) - continue; - if (same <= e->s_lno) - continue; - if (tlno < e->s_lno + e->num_lines) { - blame_overlap(blame, e, tlno, plno, same, parent); - } - } -} - -static int my_emit( - long start_a, long count_a, - long start_b, long count_b, - void *cb_data) -{ - blame_chunk_cb_data *d = (blame_chunk_cb_data *)cb_data; - - blame_chunk(d->blame, d->tlno, d->plno, start_b, d->target, d->parent); - d->plno = start_a + count_a; - d->tlno = start_b + count_b; - - return 0; -} - -static void trim_common_tail(mmfile_t *a, mmfile_t *b, long ctx) -{ - const int blk = 1024; - long trimmed = 0, recovered = 0; - char *ap = a->ptr + a->size; - char *bp = b->ptr + b->size; - long smaller = (long)((a->size < b->size) ? a->size : b->size); - - if (ctx) - return; - - while (blk + trimmed <= smaller && !memcmp(ap - blk, bp - blk, blk)) { - trimmed += blk; - ap -= blk; - bp -= blk; - } - - while (recovered < trimmed) - if (ap[recovered++] == '\n') - break; - a->size -= trimmed - recovered; - b->size -= trimmed - recovered; -} - -static int diff_hunks(mmfile_t file_a, mmfile_t file_b, void *cb_data) -{ - xpparam_t xpp = {0}; - xdemitconf_t xecfg = {0}; - xdemitcb_t ecb = {0}; - - xecfg.hunk_func = my_emit; - ecb.priv = cb_data; - - trim_common_tail(&file_a, &file_b, 0); - return xdl_diff(&file_a, &file_b, &xpp, &xecfg, &ecb); -} - -static void fill_origin_blob(git_blame__origin *o, mmfile_t *file) -{ - memset(file, 0, sizeof(*file)); - if (o->blob) { - file->ptr = (char*)git_blob_rawcontent(o->blob); - file->size = (size_t)git_blob_rawsize(o->blob); - } -} - -static int pass_blame_to_parent( - git_blame *blame, - git_blame__origin *target, - git_blame__origin *parent) -{ - int last_in_target; - mmfile_t file_p, file_o; - blame_chunk_cb_data d = { blame, target, parent, 0, 0 }; - - last_in_target = find_last_in_target(blame, target); - if (last_in_target < 0) - return 1; /* nothing remains for this target */ - - fill_origin_blob(parent, &file_p); - fill_origin_blob(target, &file_o); - - diff_hunks(file_p, file_o, &d); - /* The reset (i.e. anything after tlno) are the same as the parent */ - blame_chunk(blame, d.tlno, d.plno, last_in_target, target, parent); - - return 0; -} - -static int paths_on_dup(void **old, void *new) -{ - GIT_UNUSED(old); - git__free(new); - return -1; -} - -static git_blame__origin* find_origin( - git_blame *blame, - git_commit *parent, - git_blame__origin *origin) -{ - git_blame__origin *porigin = NULL; - git_diff *difflist = NULL; - git_diff_options diffopts = GIT_DIFF_OPTIONS_INIT; - git_tree *otree=NULL, *ptree=NULL; - - /* Get the trees from this commit and its parent */ - if (0 != git_commit_tree(&otree, origin->commit) || - 0 != git_commit_tree(&ptree, parent)) - goto cleanup; - - /* Configure the diff */ - diffopts.context_lines = 0; - diffopts.flags = GIT_DIFF_SKIP_BINARY_CHECK; - - /* Check to see if files we're interested have changed */ - diffopts.pathspec.count = blame->paths.length; - diffopts.pathspec.strings = (char**)blame->paths.contents; - if (0 != git_diff_tree_to_tree(&difflist, blame->repository, ptree, otree, &diffopts)) - goto cleanup; - - if (!git_diff_num_deltas(difflist)) { - /* No changes; copy data */ - git_blame__get_origin(&porigin, blame, parent, origin->path); - } else { - git_diff_find_options findopts = GIT_DIFF_FIND_OPTIONS_INIT; - int i; - - /* Generate a full diff between the two trees */ - git_diff_free(difflist); - diffopts.pathspec.count = 0; - if (0 != git_diff_tree_to_tree(&difflist, blame->repository, ptree, otree, &diffopts)) - goto cleanup; - - /* Let diff find renames */ - findopts.flags = GIT_DIFF_FIND_RENAMES; - if (0 != git_diff_find_similar(difflist, &findopts)) - goto cleanup; - - /* Find one that matches */ - for (i=0; i<(int)git_diff_num_deltas(difflist); i++) { - const git_diff_delta *delta = git_diff_get_delta(difflist, i); - - if (!git_vector_bsearch(NULL, &blame->paths, delta->new_file.path)) - { - git_vector_insert_sorted(&blame->paths, (void*)git__strdup(delta->old_file.path), - paths_on_dup); - make_origin(&porigin, parent, delta->old_file.path); - } - } - } - -cleanup: - git_diff_free(difflist); - git_tree_free(otree); - git_tree_free(ptree); - return porigin; -} - -/* - * The blobs of origin and porigin exactly match, so everything origin is - * suspected for can be blamed on the parent. - */ -static void pass_whole_blame(git_blame *blame, - git_blame__origin *origin, git_blame__origin *porigin) -{ - git_blame__entry *e; - - if (!porigin->blob) - git_object_lookup((git_object**)&porigin->blob, blame->repository, - git_blob_id(origin->blob), GIT_OBJ_BLOB); - for (e=blame->ent; e; e=e->next) { - if (!same_suspect(e->suspect, origin)) - continue; - origin_incref(porigin); - origin_decref(e->suspect); - e->suspect = porigin; - } -} - -static void pass_blame(git_blame *blame, git_blame__origin *origin, uint32_t opt) -{ - git_commit *commit = origin->commit; - int i, num_parents; - git_blame__origin *sg_buf[16]; - git_blame__origin *porigin, **sg_origin = sg_buf; - - num_parents = git_commit_parentcount(commit); - if (!git_oid_cmp(git_commit_id(commit), &blame->options.oldest_commit)) - /* Stop at oldest specified commit */ - num_parents = 0; - else if (opt & GIT_BLAME_FIRST_PARENT && num_parents > 1) - /* Limit search to the first parent */ - num_parents = 1; - - if (!num_parents) { - git_oid_cpy(&blame->options.oldest_commit, git_commit_id(commit)); - goto finish; - } - else if (num_parents < (int)ARRAY_SIZE(sg_buf)) - memset(sg_buf, 0, sizeof(sg_buf)); - else - sg_origin = git__calloc(num_parents, sizeof(*sg_origin)); - - for (i=0; icommit, i); - porigin = find_origin(blame, p, origin); - - if (!porigin) - continue; - if (porigin->blob && origin->blob && - !git_oid_cmp(git_blob_id(porigin->blob), git_blob_id(origin->blob))) { - pass_whole_blame(blame, origin, porigin); - origin_decref(porigin); - goto finish; - } - for (j = same = 0; jblob), git_blob_id(porigin->blob))) { - same = 1; - break; - } - if (!same) - sg_origin[i] = porigin; - else - origin_decref(porigin); - } - - /* Standard blame */ - for (i=0; iprevious) { - origin_incref(porigin); - origin->previous = porigin; - } - if (pass_blame_to_parent(blame, origin, porigin)) - goto finish; - } - - /* TODO: optionally find moves in parents' files */ - - /* TODO: optionally find copies in parents' files */ - -finish: - for (i=0; i pair), - * merge them together. - */ -static void coalesce(git_blame *blame) -{ - git_blame__entry *ent, *next; - - for (ent=blame->ent; ent && (next = ent->next); ent = next) { - if (same_suspect(ent->suspect, next->suspect) && - ent->guilty == next->guilty && - ent->s_lno + ent->num_lines == next->s_lno) - { - ent->num_lines += next->num_lines; - ent->next = next->next; - if (ent->next) - ent->next->prev = ent; - origin_decref(next->suspect); - git__free(next); - ent->score = 0; - next = ent; /* again */ - } - } -} - -void git_blame__like_git(git_blame *blame, uint32_t opt) -{ - while (true) { - git_blame__entry *ent; - git_blame__origin *suspect = NULL; - - /* Find a suspect to break down */ - for (ent = blame->ent; !suspect && ent; ent = ent->next) - if (!ent->guilty) - suspect = ent->suspect; - if (!suspect) - return; /* all done */ - - /* We'll use this suspect later in the loop, so hold on to it for now. */ - origin_incref(suspect); - pass_blame(blame, suspect, opt); - - /* Take responsibility for the remaining entries */ - for (ent = blame->ent; ent; ent = ent->next) { - if (same_suspect(ent->suspect, suspect)) { - ent->guilty = true; - ent->is_boundary = !git_oid_cmp( - git_commit_id(suspect->commit), - &blame->options.oldest_commit); - } - } - origin_decref(suspect); - } - - coalesce(blame); -} - -void git_blame__free_entry(git_blame__entry *ent) -{ - if (!ent) return; - origin_decref(ent->suspect); - git__free(ent); -} diff --git a/vendor/libgit2/src/blame_git.h b/vendor/libgit2/src/blame_git.h deleted file mode 100644 index 3ec2710b80..0000000000 --- a/vendor/libgit2/src/blame_git.h +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_blame_git__ -#define INCLUDE_blame_git__ - -#include "blame.h" - -int git_blame__get_origin( - git_blame__origin **out, - git_blame *sb, - git_commit *commit, - const char *path); -void git_blame__free_entry(git_blame__entry *ent); -void git_blame__like_git(git_blame *sb, uint32_t flags); - -#endif diff --git a/vendor/libgit2/src/blob.c b/vendor/libgit2/src/blob.c deleted file mode 100644 index ad0f4ac62a..0000000000 --- a/vendor/libgit2/src/blob.c +++ /dev/null @@ -1,375 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#include "git2/common.h" -#include "git2/object.h" -#include "git2/repository.h" -#include "git2/odb_backend.h" - -#include "common.h" -#include "filebuf.h" -#include "blob.h" -#include "filter.h" -#include "buf_text.h" - -const void *git_blob_rawcontent(const git_blob *blob) -{ - assert(blob); - return git_odb_object_data(blob->odb_object); -} - -git_off_t git_blob_rawsize(const git_blob *blob) -{ - assert(blob); - return (git_off_t)git_odb_object_size(blob->odb_object); -} - -int git_blob__getbuf(git_buf *buffer, git_blob *blob) -{ - return git_buf_set( - buffer, - git_odb_object_data(blob->odb_object), - git_odb_object_size(blob->odb_object)); -} - -void git_blob__free(void *blob) -{ - git_odb_object_free(((git_blob *)blob)->odb_object); - git__free(blob); -} - -int git_blob__parse(void *blob, git_odb_object *odb_obj) -{ - assert(blob); - git_cached_obj_incref((git_cached_obj *)odb_obj); - ((git_blob *)blob)->odb_object = odb_obj; - return 0; -} - -int git_blob_create_frombuffer( - git_oid *id, git_repository *repo, const void *buffer, size_t len) -{ - int error; - git_odb *odb; - git_odb_stream *stream; - - assert(id && repo); - - if ((error = git_repository_odb__weakptr(&odb, repo)) < 0 || - (error = git_odb_open_wstream(&stream, odb, len, GIT_OBJ_BLOB)) < 0) - return error; - - if ((error = git_odb_stream_write(stream, buffer, len)) == 0) - error = git_odb_stream_finalize_write(id, stream); - - git_odb_stream_free(stream); - return error; -} - -static int write_file_stream( - git_oid *id, git_odb *odb, const char *path, git_off_t file_size) -{ - int fd, error; - char buffer[FILEIO_BUFSIZE]; - git_odb_stream *stream = NULL; - ssize_t read_len = -1; - git_off_t written = 0; - - if ((error = git_odb_open_wstream( - &stream, odb, file_size, GIT_OBJ_BLOB)) < 0) - return error; - - if ((fd = git_futils_open_ro(path)) < 0) { - git_odb_stream_free(stream); - return -1; - } - - while (!error && (read_len = p_read(fd, buffer, sizeof(buffer))) > 0) { - error = git_odb_stream_write(stream, buffer, read_len); - written += read_len; - } - - p_close(fd); - - if (written != file_size || read_len < 0) { - giterr_set(GITERR_OS, "Failed to read file into stream"); - error = -1; - } - - if (!error) - error = git_odb_stream_finalize_write(id, stream); - - git_odb_stream_free(stream); - return error; -} - -static int write_file_filtered( - git_oid *id, - git_off_t *size, - git_odb *odb, - const char *full_path, - git_filter_list *fl) -{ - int error; - git_buf tgt = GIT_BUF_INIT; - - error = git_filter_list_apply_to_file(&tgt, fl, NULL, full_path); - - /* Write the file to disk if it was properly filtered */ - if (!error) { - *size = tgt.size; - - error = git_odb_write(id, odb, tgt.ptr, tgt.size, GIT_OBJ_BLOB); - } - - git_buf_free(&tgt); - return error; -} - -static int write_symlink( - git_oid *id, git_odb *odb, const char *path, size_t link_size) -{ - char *link_data; - ssize_t read_len; - int error; - - link_data = git__malloc(link_size); - GITERR_CHECK_ALLOC(link_data); - - read_len = p_readlink(path, link_data, link_size); - if (read_len != (ssize_t)link_size) { - giterr_set(GITERR_OS, "Failed to create blob. Can't read symlink '%s'", path); - git__free(link_data); - return -1; - } - - error = git_odb_write(id, odb, (void *)link_data, link_size, GIT_OBJ_BLOB); - git__free(link_data); - return error; -} - -int git_blob__create_from_paths( - git_oid *id, - struct stat *out_st, - git_repository *repo, - const char *content_path, - const char *hint_path, - mode_t hint_mode, - bool try_load_filters) -{ - int error; - struct stat st; - git_odb *odb = NULL; - git_off_t size; - mode_t mode; - git_buf path = GIT_BUF_INIT; - - assert(hint_path || !try_load_filters); - - if (!content_path) { - if (git_repository__ensure_not_bare(repo, "create blob from file") < 0) - return GIT_EBAREREPO; - - if (git_buf_joinpath( - &path, git_repository_workdir(repo), hint_path) < 0) - return -1; - - content_path = path.ptr; - } - - if ((error = git_path_lstat(content_path, &st)) < 0 || - (error = git_repository_odb(&odb, repo)) < 0) - goto done; - - if (S_ISDIR(st.st_mode)) { - giterr_set(GITERR_ODB, "cannot create blob from '%s'; it is a directory", content_path); - error = GIT_EDIRECTORY; - goto done; - } - - if (out_st) - memcpy(out_st, &st, sizeof(st)); - - size = st.st_size; - mode = hint_mode ? hint_mode : st.st_mode; - - if (S_ISLNK(mode)) { - error = write_symlink(id, odb, content_path, (size_t)size); - } else { - git_filter_list *fl = NULL; - - if (try_load_filters) - /* Load the filters for writing this file to the ODB */ - error = git_filter_list_load( - &fl, repo, NULL, hint_path, - GIT_FILTER_TO_ODB, GIT_FILTER_DEFAULT); - - if (error < 0) - /* well, that didn't work */; - else if (fl == NULL) - /* No filters need to be applied to the document: we can stream - * directly from disk */ - error = write_file_stream(id, odb, content_path, size); - else { - /* We need to apply one or more filters */ - error = write_file_filtered(id, &size, odb, content_path, fl); - - git_filter_list_free(fl); - } - - /* - * TODO: eventually support streaming filtered files, for files - * which are bigger than a given threshold. This is not a priority - * because applying a filter in streaming mode changes the final - * size of the blob, and without knowing its final size, the blob - * cannot be written in stream mode to the ODB. - * - * The plan is to do streaming writes to a tempfile on disk and then - * opening streaming that file to the ODB, using - * `write_file_stream`. - * - * CAREFULLY DESIGNED APIS YO - */ - } - -done: - git_odb_free(odb); - git_buf_free(&path); - - return error; -} - -int git_blob_create_fromworkdir( - git_oid *id, git_repository *repo, const char *path) -{ - return git_blob__create_from_paths(id, NULL, repo, NULL, path, 0, true); -} - -int git_blob_create_fromdisk( - git_oid *id, git_repository *repo, const char *path) -{ - int error; - git_buf full_path = GIT_BUF_INIT; - const char *workdir, *hintpath; - - if ((error = git_path_prettify(&full_path, path, NULL)) < 0) { - git_buf_free(&full_path); - return error; - } - - hintpath = git_buf_cstr(&full_path); - workdir = git_repository_workdir(repo); - - if (workdir && !git__prefixcmp(hintpath, workdir)) - hintpath += strlen(workdir); - - error = git_blob__create_from_paths( - id, NULL, repo, git_buf_cstr(&full_path), hintpath, 0, true); - - git_buf_free(&full_path); - return error; -} - -#define BUFFER_SIZE 4096 - -int git_blob_create_fromchunks( - git_oid *id, - git_repository *repo, - const char *hintpath, - int (*source_cb)(char *content, size_t max_length, void *payload), - void *payload) -{ - int error; - char *content = NULL; - git_filebuf file = GIT_FILEBUF_INIT; - git_buf path = GIT_BUF_INIT; - - assert(id && repo && source_cb); - - if ((error = git_buf_joinpath( - &path, git_repository_path(repo), GIT_OBJECTS_DIR "streamed")) < 0) - goto cleanup; - - content = git__malloc(BUFFER_SIZE); - GITERR_CHECK_ALLOC(content); - - if ((error = git_filebuf_open( - &file, git_buf_cstr(&path), GIT_FILEBUF_TEMPORARY, 0666)) < 0) - goto cleanup; - - while (1) { - int read_bytes = source_cb(content, BUFFER_SIZE, payload); - - if (!read_bytes) - break; - - if (read_bytes > BUFFER_SIZE) { - giterr_set(GITERR_OBJECT, "Invalid chunk size while creating blob"); - error = GIT_EBUFS; - } else if (read_bytes < 0) { - error = giterr_set_after_callback(read_bytes); - } else { - error = git_filebuf_write(&file, content, read_bytes); - } - - if (error < 0) - goto cleanup; - } - - if ((error = git_filebuf_flush(&file)) < 0) - goto cleanup; - - error = git_blob__create_from_paths( - id, NULL, repo, file.path_lock, hintpath, 0, hintpath != NULL); - -cleanup: - git_buf_free(&path); - git_filebuf_cleanup(&file); - git__free(content); - - return error; -} - -int git_blob_is_binary(const git_blob *blob) -{ - git_buf content = GIT_BUF_INIT; - - assert(blob); - - git_buf_attach_notowned(&content, blob->odb_object->buffer, - min(blob->odb_object->cached.size, - GIT_FILTER_BYTES_TO_CHECK_NUL)); - return git_buf_text_is_binary(&content); -} - -int git_blob_filtered_content( - git_buf *out, - git_blob *blob, - const char *path, - int check_for_binary_data) -{ - int error = 0; - git_filter_list *fl = NULL; - - assert(blob && path && out); - - git_buf_sanitize(out); - - if (check_for_binary_data && git_blob_is_binary(blob)) - return 0; - - if (!(error = git_filter_list_load( - &fl, git_blob_owner(blob), blob, path, - GIT_FILTER_TO_WORKTREE, GIT_FILTER_DEFAULT))) { - - error = git_filter_list_apply_to_blob(out, fl, blob); - - git_filter_list_free(fl); - } - - return error; -} diff --git a/vendor/libgit2/src/blob.h b/vendor/libgit2/src/blob.h deleted file mode 100644 index 4cd9f1e0c1..0000000000 --- a/vendor/libgit2/src/blob.h +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_blob_h__ -#define INCLUDE_blob_h__ - -#include "git2/blob.h" -#include "repository.h" -#include "odb.h" -#include "fileops.h" - -struct git_blob { - git_object object; - git_odb_object *odb_object; -}; - -void git_blob__free(void *blob); -int git_blob__parse(void *blob, git_odb_object *obj); -int git_blob__getbuf(git_buf *buffer, git_blob *blob); - -extern int git_blob__create_from_paths( - git_oid *out_oid, - struct stat *out_st, - git_repository *repo, - const char *full_path, - const char *hint_path, - mode_t hint_mode, - bool apply_filters); - -#endif diff --git a/vendor/libgit2/src/branch.c b/vendor/libgit2/src/branch.c deleted file mode 100644 index 791d551067..0000000000 --- a/vendor/libgit2/src/branch.c +++ /dev/null @@ -1,669 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#include "common.h" -#include "commit.h" -#include "tag.h" -#include "config.h" -#include "refspec.h" -#include "refs.h" -#include "remote.h" -#include "annotated_commit.h" - -#include "git2/branch.h" - -static int retrieve_branch_reference( - git_reference **branch_reference_out, - git_repository *repo, - const char *branch_name, - int is_remote) -{ - git_reference *branch = NULL; - int error = 0; - char *prefix; - git_buf ref_name = GIT_BUF_INIT; - - prefix = is_remote ? GIT_REFS_REMOTES_DIR : GIT_REFS_HEADS_DIR; - - if ((error = git_buf_joinpath(&ref_name, prefix, branch_name)) < 0) - /* OOM */; - else if ((error = git_reference_lookup(&branch, repo, ref_name.ptr)) < 0) - giterr_set( - GITERR_REFERENCE, "Cannot locate %s branch '%s'", - is_remote ? "remote-tracking" : "local", branch_name); - - *branch_reference_out = branch; /* will be NULL on error */ - - git_buf_free(&ref_name); - return error; -} - -static int not_a_local_branch(const char *reference_name) -{ - giterr_set( - GITERR_INVALID, - "Reference '%s' is not a local branch.", reference_name); - return -1; -} - -static int create_branch( - git_reference **ref_out, - git_repository *repository, - const char *branch_name, - const git_commit *commit, - const char *from, - int force) -{ - int is_head = 0; - git_reference *branch = NULL; - git_buf canonical_branch_name = GIT_BUF_INIT, - log_message = GIT_BUF_INIT; - int error = -1; - - assert(branch_name && commit && ref_out); - assert(git_object_owner((const git_object *)commit) == repository); - - if (force && git_branch_lookup(&branch, repository, branch_name, GIT_BRANCH_LOCAL) == 0) { - error = git_branch_is_head(branch); - git_reference_free(branch); - branch = NULL; - - if (error < 0) - goto cleanup; - - is_head = error; - } - - if (is_head && force) { - giterr_set(GITERR_REFERENCE, "Cannot force update branch '%s' as it is " - "the current HEAD of the repository.", branch_name); - error = -1; - goto cleanup; - } - - if (git_buf_joinpath(&canonical_branch_name, GIT_REFS_HEADS_DIR, branch_name) < 0) - goto cleanup; - - if (git_buf_printf(&log_message, "branch: Created from %s", from) < 0) - goto cleanup; - - error = git_reference_create(&branch, repository, - git_buf_cstr(&canonical_branch_name), git_commit_id(commit), force, - git_buf_cstr(&log_message)); - - if (!error) - *ref_out = branch; - -cleanup: - git_buf_free(&canonical_branch_name); - git_buf_free(&log_message); - return error; -} - -int git_branch_create( - git_reference **ref_out, - git_repository *repository, - const char *branch_name, - const git_commit *commit, - int force) -{ - return create_branch(ref_out, repository, branch_name, commit, git_oid_tostr_s(git_commit_id(commit)), force); -} - -int git_branch_create_from_annotated( - git_reference **ref_out, - git_repository *repository, - const char *branch_name, - const git_annotated_commit *commit, - int force) -{ - return create_branch(ref_out, repository, branch_name, commit->commit, commit->ref_name, force); -} - -int git_branch_delete(git_reference *branch) -{ - int is_head; - git_buf config_section = GIT_BUF_INIT; - int error = -1; - - assert(branch); - - if (!git_reference_is_branch(branch) && !git_reference_is_remote(branch)) { - giterr_set(GITERR_INVALID, "Reference '%s' is not a valid branch.", - git_reference_name(branch)); - return GIT_ENOTFOUND; - } - - if ((is_head = git_branch_is_head(branch)) < 0) - return is_head; - - if (is_head) { - giterr_set(GITERR_REFERENCE, "Cannot delete branch '%s' as it is " - "the current HEAD of the repository.", git_reference_name(branch)); - return -1; - } - - if (git_buf_join(&config_section, '.', "branch", - git_reference_name(branch) + strlen(GIT_REFS_HEADS_DIR)) < 0) - goto on_error; - - if (git_config_rename_section( - git_reference_owner(branch), git_buf_cstr(&config_section), NULL) < 0) - goto on_error; - - if (git_reference_delete(branch) < 0) - goto on_error; - - if ((error = git_reflog_delete(git_reference_owner(branch), git_reference_name(branch))) < 0) { - if (error == GIT_ENOTFOUND) { - giterr_clear(); - error = 0; - } - goto on_error; - } - - error = 0; - -on_error: - git_buf_free(&config_section); - return error; -} - -typedef struct { - git_reference_iterator *iter; - unsigned int flags; -} branch_iter; - -int git_branch_next(git_reference **out, git_branch_t *out_type, git_branch_iterator *_iter) -{ - branch_iter *iter = (branch_iter *) _iter; - git_reference *ref; - int error; - - while ((error = git_reference_next(&ref, iter->iter)) == 0) { - if ((iter->flags & GIT_BRANCH_LOCAL) && - !git__prefixcmp(ref->name, GIT_REFS_HEADS_DIR)) { - *out = ref; - *out_type = GIT_BRANCH_LOCAL; - - return 0; - } else if ((iter->flags & GIT_BRANCH_REMOTE) && - !git__prefixcmp(ref->name, GIT_REFS_REMOTES_DIR)) { - *out = ref; - *out_type = GIT_BRANCH_REMOTE; - - return 0; - } else { - git_reference_free(ref); - } - } - - return error; -} - -int git_branch_iterator_new( - git_branch_iterator **out, - git_repository *repo, - git_branch_t list_flags) -{ - branch_iter *iter; - - iter = git__calloc(1, sizeof(branch_iter)); - GITERR_CHECK_ALLOC(iter); - - iter->flags = list_flags; - - if (git_reference_iterator_new(&iter->iter, repo) < 0) { - git__free(iter); - return -1; - } - - *out = (git_branch_iterator *) iter; - - return 0; -} - -void git_branch_iterator_free(git_branch_iterator *_iter) -{ - branch_iter *iter = (branch_iter *) _iter; - - if (iter == NULL) - return; - - git_reference_iterator_free(iter->iter); - git__free(iter); -} - -int git_branch_move( - git_reference **out, - git_reference *branch, - const char *new_branch_name, - int force) -{ - git_buf new_reference_name = GIT_BUF_INIT, - old_config_section = GIT_BUF_INIT, - new_config_section = GIT_BUF_INIT, - log_message = GIT_BUF_INIT; - int error; - - assert(branch && new_branch_name); - - if (!git_reference_is_branch(branch)) - return not_a_local_branch(git_reference_name(branch)); - - if ((error = git_buf_joinpath(&new_reference_name, GIT_REFS_HEADS_DIR, new_branch_name)) < 0) - goto done; - - if ((error = git_buf_printf(&log_message, "branch: renamed %s to %s", - git_reference_name(branch), git_buf_cstr(&new_reference_name))) < 0) - goto done; - - /* first update ref then config so failure won't trash config */ - - error = git_reference_rename( - out, branch, git_buf_cstr(&new_reference_name), force, - git_buf_cstr(&log_message)); - if (error < 0) - goto done; - - git_buf_join(&old_config_section, '.', "branch", - git_reference_name(branch) + strlen(GIT_REFS_HEADS_DIR)); - git_buf_join(&new_config_section, '.', "branch", new_branch_name); - - error = git_config_rename_section( - git_reference_owner(branch), - git_buf_cstr(&old_config_section), - git_buf_cstr(&new_config_section)); - -done: - git_buf_free(&new_reference_name); - git_buf_free(&old_config_section); - git_buf_free(&new_config_section); - git_buf_free(&log_message); - - return error; -} - -int git_branch_lookup( - git_reference **ref_out, - git_repository *repo, - const char *branch_name, - git_branch_t branch_type) -{ - assert(ref_out && repo && branch_name); - - return retrieve_branch_reference(ref_out, repo, branch_name, branch_type == GIT_BRANCH_REMOTE); -} - -int git_branch_name( - const char **out, - const git_reference *ref) -{ - const char *branch_name; - - assert(out && ref); - - branch_name = ref->name; - - if (git_reference_is_branch(ref)) { - branch_name += strlen(GIT_REFS_HEADS_DIR); - } else if (git_reference_is_remote(ref)) { - branch_name += strlen(GIT_REFS_REMOTES_DIR); - } else { - giterr_set(GITERR_INVALID, - "Reference '%s' is neither a local nor a remote branch.", ref->name); - return -1; - } - *out = branch_name; - return 0; -} - -static int retrieve_upstream_configuration( - git_buf *out, - const git_config *config, - const char *canonical_branch_name, - const char *format) -{ - git_buf buf = GIT_BUF_INIT; - int error; - - if (git_buf_printf(&buf, format, - canonical_branch_name + strlen(GIT_REFS_HEADS_DIR)) < 0) - return -1; - - error = git_config_get_string_buf(out, config, git_buf_cstr(&buf)); - git_buf_free(&buf); - return error; -} - -int git_branch_upstream_name( - git_buf *out, - git_repository *repo, - const char *refname) -{ - git_buf remote_name = GIT_BUF_INIT; - git_buf merge_name = GIT_BUF_INIT; - git_buf buf = GIT_BUF_INIT; - int error = -1; - git_remote *remote = NULL; - const git_refspec *refspec; - git_config *config; - - assert(out && refname); - - git_buf_sanitize(out); - - if (!git_reference__is_branch(refname)) - return not_a_local_branch(refname); - - if ((error = git_repository_config_snapshot(&config, repo)) < 0) - return error; - - if ((error = retrieve_upstream_configuration( - &remote_name, config, refname, "branch.%s.remote")) < 0) - goto cleanup; - - if ((error = retrieve_upstream_configuration( - &merge_name, config, refname, "branch.%s.merge")) < 0) - goto cleanup; - - if (git_buf_len(&remote_name) == 0 || git_buf_len(&merge_name) == 0) { - giterr_set(GITERR_REFERENCE, - "branch '%s' does not have an upstream", refname); - error = GIT_ENOTFOUND; - goto cleanup; - } - - if (strcmp(".", git_buf_cstr(&remote_name)) != 0) { - if ((error = git_remote_lookup(&remote, repo, git_buf_cstr(&remote_name))) < 0) - goto cleanup; - - refspec = git_remote__matching_refspec(remote, git_buf_cstr(&merge_name)); - if (!refspec) { - error = GIT_ENOTFOUND; - goto cleanup; - } - - if (git_refspec_transform(&buf, refspec, git_buf_cstr(&merge_name)) < 0) - goto cleanup; - } else - if (git_buf_set(&buf, git_buf_cstr(&merge_name), git_buf_len(&merge_name)) < 0) - goto cleanup; - - error = git_buf_set(out, git_buf_cstr(&buf), git_buf_len(&buf)); - -cleanup: - git_config_free(config); - git_remote_free(remote); - git_buf_free(&remote_name); - git_buf_free(&merge_name); - git_buf_free(&buf); - return error; -} - -int git_branch_upstream_remote(git_buf *buf, git_repository *repo, const char *refname) -{ - int error; - git_config *cfg; - - if (!git_reference__is_branch(refname)) - return not_a_local_branch(refname); - - if ((error = git_repository_config__weakptr(&cfg, repo)) < 0) - return error; - - git_buf_sanitize(buf); - - if ((error = retrieve_upstream_configuration(buf, cfg, refname, "branch.%s.remote")) < 0) - return error; - - if (git_buf_len(buf) == 0) { - giterr_set(GITERR_REFERENCE, "branch '%s' does not have an upstream remote", refname); - error = GIT_ENOTFOUND; - git_buf_clear(buf); - } - - return error; -} - -int git_branch_remote_name(git_buf *buf, git_repository *repo, const char *refname) -{ - git_strarray remote_list = {0}; - size_t i; - git_remote *remote; - const git_refspec *fetchspec; - int error = 0; - char *remote_name = NULL; - - assert(buf && repo && refname); - - git_buf_sanitize(buf); - - /* Verify that this is a remote branch */ - if (!git_reference__is_remote(refname)) { - giterr_set(GITERR_INVALID, "Reference '%s' is not a remote branch.", - refname); - error = GIT_ERROR; - goto cleanup; - } - - /* Get the remotes */ - if ((error = git_remote_list(&remote_list, repo)) < 0) - goto cleanup; - - /* Find matching remotes */ - for (i = 0; i < remote_list.count; i++) { - if ((error = git_remote_lookup(&remote, repo, remote_list.strings[i])) < 0) - continue; - - fetchspec = git_remote__matching_dst_refspec(remote, refname); - if (fetchspec) { - /* If we have not already set out yet, then set - * it to the matching remote name. Otherwise - * multiple remotes match this reference, and it - * is ambiguous. */ - if (!remote_name) { - remote_name = remote_list.strings[i]; - } else { - git_remote_free(remote); - - giterr_set(GITERR_REFERENCE, - "Reference '%s' is ambiguous", refname); - error = GIT_EAMBIGUOUS; - goto cleanup; - } - } - - git_remote_free(remote); - } - - if (remote_name) { - git_buf_clear(buf); - error = git_buf_puts(buf, remote_name); - } else { - giterr_set(GITERR_REFERENCE, - "Could not determine remote for '%s'", refname); - error = GIT_ENOTFOUND; - } - -cleanup: - if (error < 0) - git_buf_free(buf); - - git_strarray_free(&remote_list); - return error; -} - -int git_branch_upstream( - git_reference **tracking_out, - const git_reference *branch) -{ - int error; - git_buf tracking_name = GIT_BUF_INIT; - - if ((error = git_branch_upstream_name(&tracking_name, - git_reference_owner(branch), git_reference_name(branch))) < 0) - return error; - - error = git_reference_lookup( - tracking_out, - git_reference_owner(branch), - git_buf_cstr(&tracking_name)); - - git_buf_free(&tracking_name); - return error; -} - -static int unset_upstream(git_config *config, const char *shortname) -{ - git_buf buf = GIT_BUF_INIT; - - if (git_buf_printf(&buf, "branch.%s.remote", shortname) < 0) - return -1; - - if (git_config_delete_entry(config, git_buf_cstr(&buf)) < 0) - goto on_error; - - git_buf_clear(&buf); - if (git_buf_printf(&buf, "branch.%s.merge", shortname) < 0) - goto on_error; - - if (git_config_delete_entry(config, git_buf_cstr(&buf)) < 0) - goto on_error; - - git_buf_free(&buf); - return 0; - -on_error: - git_buf_free(&buf); - return -1; -} - -int git_branch_set_upstream(git_reference *branch, const char *upstream_name) -{ - git_buf key = GIT_BUF_INIT, value = GIT_BUF_INIT; - git_reference *upstream; - git_repository *repo; - git_remote *remote = NULL; - git_config *config; - const char *name, *shortname; - int local, error; - const git_refspec *fetchspec; - - name = git_reference_name(branch); - if (!git_reference__is_branch(name)) - return not_a_local_branch(name); - - if (git_repository_config__weakptr(&config, git_reference_owner(branch)) < 0) - return -1; - - shortname = name + strlen(GIT_REFS_HEADS_DIR); - - if (upstream_name == NULL) - return unset_upstream(config, shortname); - - repo = git_reference_owner(branch); - - /* First we need to figure out whether it's a branch or remote-tracking */ - if (git_branch_lookup(&upstream, repo, upstream_name, GIT_BRANCH_LOCAL) == 0) - local = 1; - else if (git_branch_lookup(&upstream, repo, upstream_name, GIT_BRANCH_REMOTE) == 0) - local = 0; - else { - giterr_set(GITERR_REFERENCE, - "Cannot set upstream for branch '%s'", shortname); - return GIT_ENOTFOUND; - } - - /* - * If it's local, the remote is "." and the branch name is - * simply the refname. Otherwise we need to figure out what - * the remote-tracking branch's name on the remote is and use - * that. - */ - if (local) - error = git_buf_puts(&value, "."); - else - error = git_branch_remote_name(&value, repo, git_reference_name(upstream)); - - if (error < 0) - goto on_error; - - if (git_buf_printf(&key, "branch.%s.remote", shortname) < 0) - goto on_error; - - if (git_config_set_string(config, git_buf_cstr(&key), git_buf_cstr(&value)) < 0) - goto on_error; - - if (local) { - git_buf_clear(&value); - if (git_buf_puts(&value, git_reference_name(upstream)) < 0) - goto on_error; - } else { - /* Get the remoe-tracking branch's refname in its repo */ - if (git_remote_lookup(&remote, repo, git_buf_cstr(&value)) < 0) - goto on_error; - - fetchspec = git_remote__matching_dst_refspec(remote, git_reference_name(upstream)); - git_buf_clear(&value); - if (!fetchspec || git_refspec_rtransform(&value, fetchspec, git_reference_name(upstream)) < 0) - goto on_error; - - git_remote_free(remote); - remote = NULL; - } - - git_buf_clear(&key); - if (git_buf_printf(&key, "branch.%s.merge", shortname) < 0) - goto on_error; - - if (git_config_set_string(config, git_buf_cstr(&key), git_buf_cstr(&value)) < 0) - goto on_error; - - git_reference_free(upstream); - git_buf_free(&key); - git_buf_free(&value); - - return 0; - -on_error: - git_reference_free(upstream); - git_buf_free(&key); - git_buf_free(&value); - git_remote_free(remote); - - return -1; -} - -int git_branch_is_head( - const git_reference *branch) -{ - git_reference *head; - bool is_same = false; - int error; - - assert(branch); - - if (!git_reference_is_branch(branch)) - return false; - - error = git_repository_head(&head, git_reference_owner(branch)); - - if (error == GIT_EUNBORNBRANCH || error == GIT_ENOTFOUND) - return false; - - if (error < 0) - return -1; - - is_same = strcmp( - git_reference_name(branch), - git_reference_name(head)) == 0; - - git_reference_free(head); - - return is_same; -} diff --git a/vendor/libgit2/src/branch.h b/vendor/libgit2/src/branch.h deleted file mode 100644 index d02f2af0de..0000000000 --- a/vendor/libgit2/src/branch.h +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_branch_h__ -#define INCLUDE_branch_h__ - -#include "buffer.h" - -int git_branch_upstream__name( - git_buf *tracking_name, - git_repository *repo, - const char *canonical_branch_name); - -#endif diff --git a/vendor/libgit2/src/buf_text.c b/vendor/libgit2/src/buf_text.c deleted file mode 100644 index 7e6779d2dc..0000000000 --- a/vendor/libgit2/src/buf_text.c +++ /dev/null @@ -1,315 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#include "buf_text.h" - -int git_buf_text_puts_escaped( - git_buf *buf, - const char *string, - const char *esc_chars, - const char *esc_with) -{ - const char *scan; - size_t total = 0, esc_len = strlen(esc_with), count, alloclen; - - if (!string) - return 0; - - for (scan = string; *scan; ) { - /* count run of non-escaped characters */ - count = strcspn(scan, esc_chars); - total += count; - scan += count; - /* count run of escaped characters */ - count = strspn(scan, esc_chars); - total += count * (esc_len + 1); - scan += count; - } - - GITERR_CHECK_ALLOC_ADD(&alloclen, total, 1); - if (git_buf_grow_by(buf, alloclen) < 0) - return -1; - - for (scan = string; *scan; ) { - count = strcspn(scan, esc_chars); - - memmove(buf->ptr + buf->size, scan, count); - scan += count; - buf->size += count; - - for (count = strspn(scan, esc_chars); count > 0; --count) { - /* copy escape sequence */ - memmove(buf->ptr + buf->size, esc_with, esc_len); - buf->size += esc_len; - /* copy character to be escaped */ - buf->ptr[buf->size] = *scan; - buf->size++; - scan++; - } - } - - buf->ptr[buf->size] = '\0'; - - return 0; -} - -void git_buf_text_unescape(git_buf *buf) -{ - buf->size = git__unescape(buf->ptr); -} - -int git_buf_text_crlf_to_lf(git_buf *tgt, const git_buf *src) -{ - const char *scan = src->ptr; - const char *scan_end = src->ptr + src->size; - const char *next = memchr(scan, '\r', src->size); - size_t new_size; - char *out; - - assert(tgt != src); - - if (!next) - return git_buf_set(tgt, src->ptr, src->size); - - /* reduce reallocs while in the loop */ - GITERR_CHECK_ALLOC_ADD(&new_size, src->size, 1); - if (git_buf_grow(tgt, new_size) < 0) - return -1; - - out = tgt->ptr; - tgt->size = 0; - - /* Find the next \r and copy whole chunk up to there to tgt */ - for (; next; scan = next + 1, next = memchr(scan, '\r', scan_end - scan)) { - if (next > scan) { - size_t copylen = (size_t)(next - scan); - memcpy(out, scan, copylen); - out += copylen; - } - - /* Do not drop \r unless it is followed by \n */ - if (next + 1 == scan_end || next[1] != '\n') - *out++ = '\r'; - } - - /* Copy remaining input into dest */ - if (scan < scan_end) { - size_t remaining = (size_t)(scan_end - scan); - memcpy(out, scan, remaining); - out += remaining; - } - - tgt->size = (size_t)(out - tgt->ptr); - tgt->ptr[tgt->size] = '\0'; - - return 0; -} - -int git_buf_text_lf_to_crlf(git_buf *tgt, const git_buf *src) -{ - const char *start = src->ptr; - const char *end = start + src->size; - const char *scan = start; - const char *next = memchr(scan, '\n', src->size); - size_t alloclen; - - assert(tgt != src); - - if (!next) - return git_buf_set(tgt, src->ptr, src->size); - - /* attempt to reduce reallocs while in the loop */ - GITERR_CHECK_ALLOC_ADD(&alloclen, src->size, src->size >> 4); - GITERR_CHECK_ALLOC_ADD(&alloclen, alloclen, 1); - if (git_buf_grow(tgt, alloclen) < 0) - return -1; - tgt->size = 0; - - for (; next; scan = next + 1, next = memchr(scan, '\n', end - scan)) { - size_t copylen = next - scan; - - /* if we find mixed line endings, carry on */ - if (copylen && next[-1] == '\r') - copylen--; - - GITERR_CHECK_ALLOC_ADD(&alloclen, copylen, 3); - if (git_buf_grow_by(tgt, alloclen) < 0) - return -1; - - if (copylen) { - memcpy(tgt->ptr + tgt->size, scan, copylen); - tgt->size += copylen; - } - - tgt->ptr[tgt->size++] = '\r'; - tgt->ptr[tgt->size++] = '\n'; - } - - tgt->ptr[tgt->size] = '\0'; - return git_buf_put(tgt, scan, end - scan); -} - -int git_buf_text_common_prefix(git_buf *buf, const git_strarray *strings) -{ - size_t i; - const char *str, *pfx; - - git_buf_clear(buf); - - if (!strings || !strings->count) - return 0; - - /* initialize common prefix to first string */ - if (git_buf_sets(buf, strings->strings[0]) < 0) - return -1; - - /* go through the rest of the strings, truncating to shared prefix */ - for (i = 1; i < strings->count; ++i) { - - for (str = strings->strings[i], pfx = buf->ptr; - *str && *str == *pfx; str++, pfx++) - /* scanning */; - - git_buf_truncate(buf, pfx - buf->ptr); - - if (!buf->size) - break; - } - - return 0; -} - -bool git_buf_text_is_binary(const git_buf *buf) -{ - const char *scan = buf->ptr, *end = buf->ptr + buf->size; - git_bom_t bom; - int printable = 0, nonprintable = 0; - - scan += git_buf_text_detect_bom(&bom, buf, 0); - - if (bom > GIT_BOM_UTF8) - return 1; - - while (scan < end) { - unsigned char c = *scan++; - - /* Printable characters are those above SPACE (0x1F) excluding DEL, - * and including BS, ESC and FF. - */ - if ((c > 0x1F && c != 127) || c == '\b' || c == '\033' || c == '\014') - printable++; - else if (c == '\0') - return true; - else if (!git__isspace(c)) - nonprintable++; - } - - return ((printable >> 7) < nonprintable); -} - -bool git_buf_text_contains_nul(const git_buf *buf) -{ - return (memchr(buf->ptr, '\0', buf->size) != NULL); -} - -int git_buf_text_detect_bom(git_bom_t *bom, const git_buf *buf, size_t offset) -{ - const char *ptr; - size_t len; - - *bom = GIT_BOM_NONE; - /* need at least 2 bytes after offset to look for any BOM */ - if (buf->size < offset + 2) - return 0; - - ptr = buf->ptr + offset; - len = buf->size - offset; - - switch (*ptr++) { - case 0: - if (len >= 4 && ptr[0] == 0 && ptr[1] == '\xFE' && ptr[2] == '\xFF') { - *bom = GIT_BOM_UTF32_BE; - return 4; - } - break; - case '\xEF': - if (len >= 3 && ptr[0] == '\xBB' && ptr[1] == '\xBF') { - *bom = GIT_BOM_UTF8; - return 3; - } - break; - case '\xFE': - if (*ptr == '\xFF') { - *bom = GIT_BOM_UTF16_BE; - return 2; - } - break; - case '\xFF': - if (*ptr != '\xFE') - break; - if (len >= 4 && ptr[1] == 0 && ptr[2] == 0) { - *bom = GIT_BOM_UTF32_LE; - return 4; - } else { - *bom = GIT_BOM_UTF16_LE; - return 2; - } - break; - default: - break; - } - - return 0; -} - -bool git_buf_text_gather_stats( - git_buf_text_stats *stats, const git_buf *buf, bool skip_bom) -{ - const char *scan = buf->ptr, *end = buf->ptr + buf->size; - int skip; - - memset(stats, 0, sizeof(*stats)); - - /* BOM detection */ - skip = git_buf_text_detect_bom(&stats->bom, buf, 0); - if (skip_bom) - scan += skip; - - /* Ignore EOF character */ - if (buf->size > 0 && end[-1] == '\032') - end--; - - /* Counting loop */ - while (scan < end) { - unsigned char c = *scan++; - - if (c > 0x1F && c != 0x7F) - stats->printable++; - else switch (c) { - case '\0': - stats->nul++; - stats->nonprintable++; - break; - case '\n': - stats->lf++; - break; - case '\r': - stats->cr++; - if (scan < end && *scan == '\n') - stats->crlf++; - break; - case '\t': case '\f': case '\v': case '\b': case 0x1b: /*ESC*/ - stats->printable++; - break; - default: - stats->nonprintable++; - break; - } - } - - return (stats->nul > 0 || - ((stats->printable >> 7) < stats->nonprintable)); -} diff --git a/vendor/libgit2/src/buf_text.h b/vendor/libgit2/src/buf_text.h deleted file mode 100644 index c9c55af893..0000000000 --- a/vendor/libgit2/src/buf_text.h +++ /dev/null @@ -1,122 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_buf_text_h__ -#define INCLUDE_buf_text_h__ - -#include "buffer.h" - -typedef enum { - GIT_BOM_NONE = 0, - GIT_BOM_UTF8 = 1, - GIT_BOM_UTF16_LE = 2, - GIT_BOM_UTF16_BE = 3, - GIT_BOM_UTF32_LE = 4, - GIT_BOM_UTF32_BE = 5 -} git_bom_t; - -typedef struct { - git_bom_t bom; /* BOM found at head of text */ - unsigned int nul, cr, lf, crlf; /* NUL, CR, LF and CRLF counts */ - unsigned int printable, nonprintable; /* These are just approximations! */ -} git_buf_text_stats; - -/** - * Append string to buffer, prefixing each character from `esc_chars` with - * `esc_with` string. - * - * @param buf Buffer to append data to - * @param string String to escape and append - * @param esc_chars Characters to be escaped - * @param esc_with String to insert in from of each found character - * @return 0 on success, <0 on failure (probably allocation problem) - */ -extern int git_buf_text_puts_escaped( - git_buf *buf, - const char *string, - const char *esc_chars, - const char *esc_with); - -/** - * Append string escaping characters that are regex special - */ -GIT_INLINE(int) git_buf_text_puts_escape_regex(git_buf *buf, const char *string) -{ - return git_buf_text_puts_escaped(buf, string, "^.[]$()|*+?{}\\", "\\"); -} - -/** - * Unescape all characters in a buffer in place - * - * I.e. remove backslashes - */ -extern void git_buf_text_unescape(git_buf *buf); - -/** - * Replace all \r\n with \n. - * - * @return 0 on success, -1 on memory error - */ -extern int git_buf_text_crlf_to_lf(git_buf *tgt, const git_buf *src); - -/** - * Replace all \n with \r\n. Does not modify existing \r\n. - * - * @return 0 on success, -1 on memory error - */ -extern int git_buf_text_lf_to_crlf(git_buf *tgt, const git_buf *src); - -/** - * Fill buffer with the common prefix of a array of strings - * - * Buffer will be set to empty if there is no common prefix - */ -extern int git_buf_text_common_prefix(git_buf *buf, const git_strarray *strs); - -/** - * Check quickly if buffer looks like it contains binary data - * - * @param buf Buffer to check - * @return true if buffer looks like non-text data - */ -extern bool git_buf_text_is_binary(const git_buf *buf); - -/** - * Check quickly if buffer contains a NUL byte - * - * @param buf Buffer to check - * @return true if buffer contains a NUL byte - */ -extern bool git_buf_text_contains_nul(const git_buf *buf); - -/** - * Check if a buffer begins with a UTF BOM - * - * @param bom Set to the type of BOM detected or GIT_BOM_NONE - * @param buf Buffer in which to check the first bytes for a BOM - * @param offset Offset into buffer to look for BOM - * @return Number of bytes of BOM data (or 0 if no BOM found) - */ -extern int git_buf_text_detect_bom( - git_bom_t *bom, const git_buf *buf, size_t offset); - -/** - * Gather stats for a piece of text - * - * Fill the `stats` structure with counts of unreadable characters, carriage - * returns, etc, so it can be used in heuristics. This automatically skips - * a trailing EOF (\032 character). Also it will look for a BOM at the - * start of the text and can be told to skip that as well. - * - * @param stats Structure to be filled in - * @param buf Text to process - * @param skip_bom Exclude leading BOM from stats if true - * @return Does the buffer heuristically look like binary data - */ -extern bool git_buf_text_gather_stats( - git_buf_text_stats *stats, const git_buf *buf, bool skip_bom); - -#endif diff --git a/vendor/libgit2/src/buffer.c b/vendor/libgit2/src/buffer.c deleted file mode 100644 index 1a5809ccad..0000000000 --- a/vendor/libgit2/src/buffer.c +++ /dev/null @@ -1,768 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#include "buffer.h" -#include "posix.h" -#include "git2/buffer.h" -#include "buf_text.h" -#include - -/* Used as default value for git_buf->ptr so that people can always - * assume ptr is non-NULL and zero terminated even for new git_bufs. - */ -char git_buf__initbuf[1]; - -char git_buf__oom[1]; - -#define ENSURE_SIZE(b, d) \ - if ((d) > buf->asize && git_buf_grow(b, (d)) < 0)\ - return -1; - - -void git_buf_init(git_buf *buf, size_t initial_size) -{ - buf->asize = 0; - buf->size = 0; - buf->ptr = git_buf__initbuf; - - if (initial_size) - git_buf_grow(buf, initial_size); -} - -int git_buf_try_grow( - git_buf *buf, size_t target_size, bool mark_oom) -{ - char *new_ptr; - size_t new_size; - - if (buf->ptr == git_buf__oom) - return -1; - - if (buf->asize == 0 && buf->size != 0) { - giterr_set(GITERR_INVALID, "cannot grow a borrowed buffer"); - return GIT_EINVALID; - } - - if (!target_size) - target_size = buf->size; - - if (target_size <= buf->asize) - return 0; - - if (buf->asize == 0) { - new_size = target_size; - new_ptr = NULL; - } else { - new_size = buf->asize; - new_ptr = buf->ptr; - } - - /* grow the buffer size by 1.5, until it's big enough - * to fit our target size */ - while (new_size < target_size) - new_size = (new_size << 1) - (new_size >> 1); - - /* round allocation up to multiple of 8 */ - new_size = (new_size + 7) & ~7; - - if (new_size < buf->size) { - if (mark_oom) - buf->ptr = git_buf__oom; - - giterr_set_oom(); - return -1; - } - - new_ptr = git__realloc(new_ptr, new_size); - - if (!new_ptr) { - if (mark_oom) { - if (buf->ptr && (buf->ptr != git_buf__initbuf)) - git__free(buf->ptr); - buf->ptr = git_buf__oom; - } - return -1; - } - - buf->asize = new_size; - buf->ptr = new_ptr; - - /* truncate the existing buffer size if necessary */ - if (buf->size >= buf->asize) - buf->size = buf->asize - 1; - buf->ptr[buf->size] = '\0'; - - return 0; -} - -int git_buf_grow(git_buf *buffer, size_t target_size) -{ - return git_buf_try_grow(buffer, target_size, true); -} - -int git_buf_grow_by(git_buf *buffer, size_t additional_size) -{ - size_t newsize; - - if (GIT_ADD_SIZET_OVERFLOW(&newsize, buffer->size, additional_size)) { - buffer->ptr = git_buf__oom; - return -1; - } - - return git_buf_try_grow(buffer, newsize, true); -} - -void git_buf_free(git_buf *buf) -{ - if (!buf) return; - - if (buf->asize > 0 && buf->ptr != NULL && buf->ptr != git_buf__oom) - git__free(buf->ptr); - - git_buf_init(buf, 0); -} - -void git_buf_sanitize(git_buf *buf) -{ - if (buf->ptr == NULL) { - assert(buf->size == 0 && buf->asize == 0); - buf->ptr = git_buf__initbuf; - } else if (buf->asize > buf->size) - buf->ptr[buf->size] = '\0'; -} - -void git_buf_clear(git_buf *buf) -{ - buf->size = 0; - - if (!buf->ptr) { - buf->ptr = git_buf__initbuf; - buf->asize = 0; - } - - if (buf->asize > 0) - buf->ptr[0] = '\0'; -} - -int git_buf_set(git_buf *buf, const void *data, size_t len) -{ - size_t alloclen; - - if (len == 0 || data == NULL) { - git_buf_clear(buf); - } else { - if (data != buf->ptr) { - GITERR_CHECK_ALLOC_ADD(&alloclen, len, 1); - ENSURE_SIZE(buf, alloclen); - memmove(buf->ptr, data, len); - } - - buf->size = len; - if (buf->asize > buf->size) - buf->ptr[buf->size] = '\0'; - - } - return 0; -} - -int git_buf_is_binary(const git_buf *buf) -{ - return git_buf_text_is_binary(buf); -} - -int git_buf_contains_nul(const git_buf *buf) -{ - return git_buf_text_contains_nul(buf); -} - -int git_buf_sets(git_buf *buf, const char *string) -{ - return git_buf_set(buf, string, string ? strlen(string) : 0); -} - -int git_buf_putc(git_buf *buf, char c) -{ - size_t new_size; - GITERR_CHECK_ALLOC_ADD(&new_size, buf->size, 2); - ENSURE_SIZE(buf, new_size); - buf->ptr[buf->size++] = c; - buf->ptr[buf->size] = '\0'; - return 0; -} - -int git_buf_putcn(git_buf *buf, char c, size_t len) -{ - size_t new_size; - GITERR_CHECK_ALLOC_ADD(&new_size, buf->size, len); - GITERR_CHECK_ALLOC_ADD(&new_size, new_size, 1); - ENSURE_SIZE(buf, new_size); - memset(buf->ptr + buf->size, c, len); - buf->size += len; - buf->ptr[buf->size] = '\0'; - return 0; -} - -int git_buf_put(git_buf *buf, const char *data, size_t len) -{ - if (len) { - size_t new_size; - - assert(data); - - GITERR_CHECK_ALLOC_ADD(&new_size, buf->size, len); - GITERR_CHECK_ALLOC_ADD(&new_size, new_size, 1); - ENSURE_SIZE(buf, new_size); - memmove(buf->ptr + buf->size, data, len); - buf->size += len; - buf->ptr[buf->size] = '\0'; - } - return 0; -} - -int git_buf_puts(git_buf *buf, const char *string) -{ - assert(string); - return git_buf_put(buf, string, strlen(string)); -} - -static const char base64_encode[] = - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; - -int git_buf_encode_base64(git_buf *buf, const char *data, size_t len) -{ - size_t extra = len % 3; - uint8_t *write, a, b, c; - const uint8_t *read = (const uint8_t *)data; - size_t blocks = (len / 3) + !!extra, alloclen; - - GITERR_CHECK_ALLOC_ADD(&blocks, blocks, 1); - GITERR_CHECK_ALLOC_MULTIPLY(&alloclen, blocks, 4); - GITERR_CHECK_ALLOC_ADD(&alloclen, alloclen, buf->size); - - ENSURE_SIZE(buf, alloclen); - write = (uint8_t *)&buf->ptr[buf->size]; - - /* convert each run of 3 bytes into 4 output bytes */ - for (len -= extra; len > 0; len -= 3) { - a = *read++; - b = *read++; - c = *read++; - - *write++ = base64_encode[a >> 2]; - *write++ = base64_encode[(a & 0x03) << 4 | b >> 4]; - *write++ = base64_encode[(b & 0x0f) << 2 | c >> 6]; - *write++ = base64_encode[c & 0x3f]; - } - - if (extra > 0) { - a = *read++; - b = (extra > 1) ? *read++ : 0; - - *write++ = base64_encode[a >> 2]; - *write++ = base64_encode[(a & 0x03) << 4 | b >> 4]; - *write++ = (extra > 1) ? base64_encode[(b & 0x0f) << 2] : '='; - *write++ = '='; - } - - buf->size = ((char *)write) - buf->ptr; - buf->ptr[buf->size] = '\0'; - - return 0; -} - -/* The inverse of base64_encode, offset by '+' == 43. */ -static const int8_t base64_decode[] = { - 62, - -1, -1, -1, - 63, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, - -1, -1, -1, 0, -1, -1, -1, - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, - 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - -1, -1, -1, -1, -1, -1, - 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51 -}; - -#define BASE64_DECODE_VALUE(c) (((c) < 43 || (c) > 122) ? -1 : base64_decode[c - 43]) - -int git_buf_decode_base64(git_buf *buf, const char *base64, size_t len) -{ - size_t i; - int8_t a, b, c, d; - size_t orig_size = buf->size, new_size; - - assert(len % 4 == 0); - GITERR_CHECK_ALLOC_ADD(&new_size, (len / 4 * 3), buf->size); - GITERR_CHECK_ALLOC_ADD(&new_size, new_size, 1); - ENSURE_SIZE(buf, new_size); - - for (i = 0; i < len; i += 4) { - if ((a = BASE64_DECODE_VALUE(base64[i])) < 0 || - (b = BASE64_DECODE_VALUE(base64[i+1])) < 0 || - (c = BASE64_DECODE_VALUE(base64[i+2])) < 0 || - (d = BASE64_DECODE_VALUE(base64[i+3])) < 0) { - buf->size = orig_size; - buf->ptr[buf->size] = '\0'; - - giterr_set(GITERR_INVALID, "Invalid base64 input"); - return -1; - } - - buf->ptr[buf->size++] = ((a << 2) | (b & 0x30) >> 4); - buf->ptr[buf->size++] = ((b & 0x0f) << 4) | ((c & 0x3c) >> 2); - buf->ptr[buf->size++] = (c & 0x03) << 6 | (d & 0x3f); - } - - buf->ptr[buf->size] = '\0'; - return 0; -} - -static const char b85str[] = - "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!#$%&()*+-;<=>?@^_`{|}~"; - -int git_buf_encode_base85(git_buf *buf, const char *data, size_t len) -{ - size_t blocks = (len / 4) + !!(len % 4), alloclen; - - GITERR_CHECK_ALLOC_MULTIPLY(&alloclen, blocks, 5); - GITERR_CHECK_ALLOC_ADD(&alloclen, alloclen, buf->size); - GITERR_CHECK_ALLOC_ADD(&alloclen, alloclen, 1); - - ENSURE_SIZE(buf, alloclen); - - while (len) { - uint32_t acc = 0; - char b85[5]; - int i; - - for (i = 24; i >= 0; i -= 8) { - uint8_t ch = *data++; - acc |= ch << i; - - if (--len == 0) - break; - } - - for (i = 4; i >= 0; i--) { - int val = acc % 85; - acc /= 85; - - b85[i] = b85str[val]; - } - - for (i = 0; i < 5; i++) - buf->ptr[buf->size++] = b85[i]; - } - - buf->ptr[buf->size] = '\0'; - - return 0; -} - -int git_buf_vprintf(git_buf *buf, const char *format, va_list ap) -{ - size_t expected_size, new_size; - int len; - - GITERR_CHECK_ALLOC_MULTIPLY(&expected_size, strlen(format), 2); - GITERR_CHECK_ALLOC_ADD(&expected_size, expected_size, buf->size); - ENSURE_SIZE(buf, expected_size); - - while (1) { - va_list args; - va_copy(args, ap); - - len = p_vsnprintf( - buf->ptr + buf->size, - buf->asize - buf->size, - format, args - ); - - va_end(args); - - if (len < 0) { - git__free(buf->ptr); - buf->ptr = git_buf__oom; - return -1; - } - - if ((size_t)len + 1 <= buf->asize - buf->size) { - buf->size += len; - break; - } - - GITERR_CHECK_ALLOC_ADD(&new_size, buf->size, len); - GITERR_CHECK_ALLOC_ADD(&new_size, new_size, 1); - ENSURE_SIZE(buf, new_size); - } - - return 0; -} - -int git_buf_printf(git_buf *buf, const char *format, ...) -{ - int r; - va_list ap; - - va_start(ap, format); - r = git_buf_vprintf(buf, format, ap); - va_end(ap); - - return r; -} - -void git_buf_copy_cstr(char *data, size_t datasize, const git_buf *buf) -{ - size_t copylen; - - assert(data && datasize && buf); - - data[0] = '\0'; - - if (buf->size == 0 || buf->asize <= 0) - return; - - copylen = buf->size; - if (copylen > datasize - 1) - copylen = datasize - 1; - memmove(data, buf->ptr, copylen); - data[copylen] = '\0'; -} - -void git_buf_consume(git_buf *buf, const char *end) -{ - if (end > buf->ptr && end <= buf->ptr + buf->size) { - size_t consumed = end - buf->ptr; - memmove(buf->ptr, end, buf->size - consumed); - buf->size -= consumed; - buf->ptr[buf->size] = '\0'; - } -} - -void git_buf_truncate(git_buf *buf, size_t len) -{ - if (len >= buf->size) - return; - - buf->size = len; - if (buf->size < buf->asize) - buf->ptr[buf->size] = '\0'; -} - -void git_buf_shorten(git_buf *buf, size_t amount) -{ - if (buf->size > amount) - git_buf_truncate(buf, buf->size - amount); - else - git_buf_clear(buf); -} - -void git_buf_rtruncate_at_char(git_buf *buf, char separator) -{ - ssize_t idx = git_buf_rfind_next(buf, separator); - git_buf_truncate(buf, idx < 0 ? 0 : (size_t)idx); -} - -void git_buf_swap(git_buf *buf_a, git_buf *buf_b) -{ - git_buf t = *buf_a; - *buf_a = *buf_b; - *buf_b = t; -} - -char *git_buf_detach(git_buf *buf) -{ - char *data = buf->ptr; - - if (buf->asize == 0 || buf->ptr == git_buf__oom) - return NULL; - - git_buf_init(buf, 0); - - return data; -} - -void git_buf_attach(git_buf *buf, char *ptr, size_t asize) -{ - git_buf_free(buf); - - if (ptr) { - buf->ptr = ptr; - buf->size = strlen(ptr); - if (asize) - buf->asize = (asize < buf->size) ? buf->size + 1 : asize; - else /* pass 0 to fall back on strlen + 1 */ - buf->asize = buf->size + 1; - } else { - git_buf_grow(buf, asize); - } -} - -void git_buf_attach_notowned(git_buf *buf, const char *ptr, size_t size) -{ - if (git_buf_is_allocated(buf)) - git_buf_free(buf); - - if (!size) { - git_buf_init(buf, 0); - } else { - buf->ptr = (char *)ptr; - buf->asize = 0; - buf->size = size; - } -} - -int git_buf_join_n(git_buf *buf, char separator, int nbuf, ...) -{ - va_list ap; - int i; - size_t total_size = 0, original_size = buf->size; - char *out, *original = buf->ptr; - - if (buf->size > 0 && buf->ptr[buf->size - 1] != separator) - ++total_size; /* space for initial separator */ - - /* Make two passes to avoid multiple reallocation */ - - va_start(ap, nbuf); - for (i = 0; i < nbuf; ++i) { - const char* segment; - size_t segment_len; - - segment = va_arg(ap, const char *); - if (!segment) - continue; - - segment_len = strlen(segment); - - GITERR_CHECK_ALLOC_ADD(&total_size, total_size, segment_len); - - if (segment_len == 0 || segment[segment_len - 1] != separator) - GITERR_CHECK_ALLOC_ADD(&total_size, total_size, 1); - } - va_end(ap); - - /* expand buffer if needed */ - if (total_size == 0) - return 0; - - GITERR_CHECK_ALLOC_ADD(&total_size, total_size, 1); - if (git_buf_grow_by(buf, total_size) < 0) - return -1; - - out = buf->ptr + buf->size; - - /* append separator to existing buf if needed */ - if (buf->size > 0 && out[-1] != separator) - *out++ = separator; - - va_start(ap, nbuf); - for (i = 0; i < nbuf; ++i) { - const char* segment; - size_t segment_len; - - segment = va_arg(ap, const char *); - if (!segment) - continue; - - /* deal with join that references buffer's original content */ - if (segment >= original && segment < original + original_size) { - size_t offset = (segment - original); - segment = buf->ptr + offset; - segment_len = original_size - offset; - } else { - segment_len = strlen(segment); - } - - /* skip leading separators */ - if (out > buf->ptr && out[-1] == separator) - while (segment_len > 0 && *segment == separator) { - segment++; - segment_len--; - } - - /* copy over next buffer */ - if (segment_len > 0) { - memmove(out, segment, segment_len); - out += segment_len; - } - - /* append trailing separator (except for last item) */ - if (i < nbuf - 1 && out > buf->ptr && out[-1] != separator) - *out++ = separator; - } - va_end(ap); - - /* set size based on num characters actually written */ - buf->size = out - buf->ptr; - buf->ptr[buf->size] = '\0'; - - return 0; -} - -int git_buf_join( - git_buf *buf, - char separator, - const char *str_a, - const char *str_b) -{ - size_t strlen_a = str_a ? strlen(str_a) : 0; - size_t strlen_b = strlen(str_b); - size_t alloc_len; - int need_sep = 0; - ssize_t offset_a = -1; - - /* not safe to have str_b point internally to the buffer */ - assert(str_b < buf->ptr || str_b >= buf->ptr + buf->size); - - /* figure out if we need to insert a separator */ - if (separator && strlen_a) { - while (*str_b == separator) { str_b++; strlen_b--; } - if (str_a[strlen_a - 1] != separator) - need_sep = 1; - } - - /* str_a could be part of the buffer */ - if (str_a >= buf->ptr && str_a < buf->ptr + buf->size) - offset_a = str_a - buf->ptr; - - GITERR_CHECK_ALLOC_ADD(&alloc_len, strlen_a, strlen_b); - GITERR_CHECK_ALLOC_ADD(&alloc_len, alloc_len, need_sep); - GITERR_CHECK_ALLOC_ADD(&alloc_len, alloc_len, 1); - if (git_buf_grow(buf, alloc_len) < 0) - return -1; - assert(buf->ptr); - - /* fix up internal pointers */ - if (offset_a >= 0) - str_a = buf->ptr + offset_a; - - /* do the actual copying */ - if (offset_a != 0 && str_a) - memmove(buf->ptr, str_a, strlen_a); - if (need_sep) - buf->ptr[strlen_a] = separator; - memcpy(buf->ptr + strlen_a + need_sep, str_b, strlen_b); - - buf->size = strlen_a + strlen_b + need_sep; - buf->ptr[buf->size] = '\0'; - - return 0; -} - -int git_buf_join3( - git_buf *buf, - char separator, - const char *str_a, - const char *str_b, - const char *str_c) -{ - size_t len_a = strlen(str_a), - len_b = strlen(str_b), - len_c = strlen(str_c), - len_total; - int sep_a = 0, sep_b = 0; - char *tgt; - - /* for this function, disallow pointers into the existing buffer */ - assert(str_a < buf->ptr || str_a >= buf->ptr + buf->size); - assert(str_b < buf->ptr || str_b >= buf->ptr + buf->size); - assert(str_c < buf->ptr || str_c >= buf->ptr + buf->size); - - if (separator) { - if (len_a > 0) { - while (*str_b == separator) { str_b++; len_b--; } - sep_a = (str_a[len_a - 1] != separator); - } - if (len_a > 0 || len_b > 0) - while (*str_c == separator) { str_c++; len_c--; } - if (len_b > 0) - sep_b = (str_b[len_b - 1] != separator); - } - - GITERR_CHECK_ALLOC_ADD(&len_total, len_a, sep_a); - GITERR_CHECK_ALLOC_ADD(&len_total, len_total, len_b); - GITERR_CHECK_ALLOC_ADD(&len_total, len_total, sep_b); - GITERR_CHECK_ALLOC_ADD(&len_total, len_total, len_c); - GITERR_CHECK_ALLOC_ADD(&len_total, len_total, 1); - if (git_buf_grow(buf, len_total) < 0) - return -1; - - tgt = buf->ptr; - - if (len_a) { - memcpy(tgt, str_a, len_a); - tgt += len_a; - } - if (sep_a) - *tgt++ = separator; - if (len_b) { - memcpy(tgt, str_b, len_b); - tgt += len_b; - } - if (sep_b) - *tgt++ = separator; - if (len_c) - memcpy(tgt, str_c, len_c); - - buf->size = len_a + sep_a + len_b + sep_b + len_c; - buf->ptr[buf->size] = '\0'; - - return 0; -} - -void git_buf_rtrim(git_buf *buf) -{ - while (buf->size > 0) { - if (!git__isspace(buf->ptr[buf->size - 1])) - break; - - buf->size--; - } - - if (buf->asize > buf->size) - buf->ptr[buf->size] = '\0'; -} - -int git_buf_cmp(const git_buf *a, const git_buf *b) -{ - int result = memcmp(a->ptr, b->ptr, min(a->size, b->size)); - return (result != 0) ? result : - (a->size < b->size) ? -1 : (a->size > b->size) ? 1 : 0; -} - -int git_buf_splice( - git_buf *buf, - size_t where, - size_t nb_to_remove, - const char *data, - size_t nb_to_insert) -{ - char *splice_loc; - size_t new_size, alloc_size; - - assert(buf && where <= buf->size && nb_to_remove <= buf->size - where); - - splice_loc = buf->ptr + where; - - /* Ported from git.git - * https://github.com/git/git/blob/16eed7c/strbuf.c#L159-176 - */ - GITERR_CHECK_ALLOC_ADD(&new_size, (buf->size - nb_to_remove), nb_to_insert); - GITERR_CHECK_ALLOC_ADD(&alloc_size, new_size, 1); - ENSURE_SIZE(buf, alloc_size); - - memmove(splice_loc + nb_to_insert, - splice_loc + nb_to_remove, - buf->size - where - nb_to_remove); - - memcpy(splice_loc, data, nb_to_insert); - - buf->size = new_size; - buf->ptr[buf->size] = '\0'; - return 0; -} diff --git a/vendor/libgit2/src/buffer.h b/vendor/libgit2/src/buffer.h deleted file mode 100644 index e46ee5dd74..0000000000 --- a/vendor/libgit2/src/buffer.h +++ /dev/null @@ -1,209 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_buffer_h__ -#define INCLUDE_buffer_h__ - -#include "common.h" -#include "git2/strarray.h" -#include "git2/buffer.h" - -/* typedef struct { - * char *ptr; - * size_t asize, size; - * } git_buf; - */ - -extern char git_buf__initbuf[]; -extern char git_buf__oom[]; - -/* Use to initialize buffer structure when git_buf is on stack */ -#define GIT_BUF_INIT { git_buf__initbuf, 0, 0 } - -GIT_INLINE(bool) git_buf_is_allocated(const git_buf *buf) -{ - return (buf->ptr != NULL && buf->asize > 0); -} - -/** - * Initialize a git_buf structure. - * - * For the cases where GIT_BUF_INIT cannot be used to do static - * initialization. - */ -extern void git_buf_init(git_buf *buf, size_t initial_size); - -/** - * Resize the buffer allocation to make more space. - * - * This will attempt to grow the buffer to accommodate the additional size. - * It is similar to `git_buf_grow`, but performs the new size calculation, - * checking for overflow. - * - * Like `git_buf_grow`, if this is a user-supplied buffer, this will allocate - * a new buffer. - */ -extern int git_buf_grow_by(git_buf *buffer, size_t additional_size); - -/** - * Attempt to grow the buffer to hold at least `target_size` bytes. - * - * If the allocation fails, this will return an error. If `mark_oom` is true, - * this will mark the buffer as invalid for future operations; if false, - * existing buffer content will be preserved, but calling code must handle - * that buffer was not expanded. If `preserve_external` is true, then any - * existing data pointed to be `ptr` even if `asize` is zero will be copied - * into the newly allocated buffer. - */ -extern int git_buf_try_grow( - git_buf *buf, size_t target_size, bool mark_oom); - -/** - * Sanitizes git_buf structures provided from user input. Users of the - * library, when providing git_buf's, may wish to provide a NULL ptr for - * ease of handling. The buffer routines, however, expect a non-NULL ptr - * always. This helper method simply handles NULL input, converting to a - * git_buf__initbuf. - */ -extern void git_buf_sanitize(git_buf *buf); - -extern void git_buf_swap(git_buf *buf_a, git_buf *buf_b); -extern char *git_buf_detach(git_buf *buf); -extern void git_buf_attach(git_buf *buf, char *ptr, size_t asize); - -/* Populates a `git_buf` where the contents are not "owned" by the - * buffer, and calls to `git_buf_free` will not free the given buf. - */ -extern void git_buf_attach_notowned( - git_buf *buf, const char *ptr, size_t size); - -/** - * Test if there have been any reallocation failures with this git_buf. - * - * Any function that writes to a git_buf can fail due to memory allocation - * issues. If one fails, the git_buf will be marked with an OOM error and - * further calls to modify the buffer will fail. Check git_buf_oom() at the - * end of your sequence and it will be true if you ran out of memory at any - * point with that buffer. - * - * @return false if no error, true if allocation error - */ -GIT_INLINE(bool) git_buf_oom(const git_buf *buf) -{ - return (buf->ptr == git_buf__oom); -} - -/* - * Functions below that return int value error codes will return 0 on - * success or -1 on failure (which generally means an allocation failed). - * Using a git_buf where the allocation has failed with result in -1 from - * all further calls using that buffer. As a result, you can ignore the - * return code of these functions and call them in a series then just call - * git_buf_oom at the end. - */ -int git_buf_sets(git_buf *buf, const char *string); -int git_buf_putc(git_buf *buf, char c); -int git_buf_putcn(git_buf *buf, char c, size_t len); -int git_buf_put(git_buf *buf, const char *data, size_t len); -int git_buf_puts(git_buf *buf, const char *string); -int git_buf_printf(git_buf *buf, const char *format, ...) GIT_FORMAT_PRINTF(2, 3); -int git_buf_vprintf(git_buf *buf, const char *format, va_list ap); -void git_buf_clear(git_buf *buf); -void git_buf_consume(git_buf *buf, const char *end); -void git_buf_truncate(git_buf *buf, size_t len); -void git_buf_shorten(git_buf *buf, size_t amount); -void git_buf_rtruncate_at_char(git_buf *path, char separator); - -/** General join with separator */ -int git_buf_join_n(git_buf *buf, char separator, int nbuf, ...); -/** Fast join of two strings - first may legally point into `buf` data */ -int git_buf_join(git_buf *buf, char separator, const char *str_a, const char *str_b); -/** Fast join of three strings - cannot reference `buf` data */ -int git_buf_join3(git_buf *buf, char separator, const char *str_a, const char *str_b, const char *str_c); - -/** - * Join two strings as paths, inserting a slash between as needed. - * @return 0 on success, -1 on failure - */ -GIT_INLINE(int) git_buf_joinpath(git_buf *buf, const char *a, const char *b) -{ - return git_buf_join(buf, '/', a, b); -} - -GIT_INLINE(const char *) git_buf_cstr(const git_buf *buf) -{ - return buf->ptr; -} - -GIT_INLINE(size_t) git_buf_len(const git_buf *buf) -{ - return buf->size; -} - -void git_buf_copy_cstr(char *data, size_t datasize, const git_buf *buf); - -#define git_buf_PUTS(buf, str) git_buf_put(buf, str, sizeof(str) - 1) - -GIT_INLINE(ssize_t) git_buf_rfind_next(const git_buf *buf, char ch) -{ - ssize_t idx = (ssize_t)buf->size - 1; - while (idx >= 0 && buf->ptr[idx] == ch) idx--; - while (idx >= 0 && buf->ptr[idx] != ch) idx--; - return idx; -} - -GIT_INLINE(ssize_t) git_buf_rfind(const git_buf *buf, char ch) -{ - ssize_t idx = (ssize_t)buf->size - 1; - while (idx >= 0 && buf->ptr[idx] != ch) idx--; - return idx; -} - -GIT_INLINE(ssize_t) git_buf_find(const git_buf *buf, char ch) -{ - void *found = memchr(buf->ptr, ch, buf->size); - return found ? (ssize_t)((const char *)found - buf->ptr) : -1; -} - -/* Remove whitespace from the end of the buffer */ -void git_buf_rtrim(git_buf *buf); - -int git_buf_cmp(const git_buf *a, const git_buf *b); - -/* Write data as base64 encoded in buffer */ -int git_buf_encode_base64(git_buf *buf, const char *data, size_t len); -/* Decode the given bas64 and write the result to the buffer */ -int git_buf_decode_base64(git_buf *buf, const char *base64, size_t len); - -/* Write data as "base85" encoded in buffer */ -int git_buf_encode_base85(git_buf *buf, const char *data, size_t len); - -/* - * Insert, remove or replace a portion of the buffer. - * - * @param buf The buffer to work with - * - * @param where The location in the buffer where the transformation - * should be applied. - * - * @param nb_to_remove The number of chars to be removed. 0 to not - * remove any character in the buffer. - * - * @param data A pointer to the data which should be inserted. - * - * @param nb_to_insert The number of chars to be inserted. 0 to not - * insert any character from the buffer. - * - * @return 0 or an error code. - */ -int git_buf_splice( - git_buf *buf, - size_t where, - size_t nb_to_remove, - const char *data, - size_t nb_to_insert); - -#endif diff --git a/vendor/libgit2/src/cache.c b/vendor/libgit2/src/cache.c deleted file mode 100644 index ca5173c0d9..0000000000 --- a/vendor/libgit2/src/cache.c +++ /dev/null @@ -1,281 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#include "common.h" -#include "repository.h" -#include "commit.h" -#include "thread-utils.h" -#include "util.h" -#include "cache.h" -#include "odb.h" -#include "object.h" -#include "git2/oid.h" - -GIT__USE_OIDMAP - -bool git_cache__enabled = true; -ssize_t git_cache__max_storage = (256 * 1024 * 1024); -git_atomic_ssize git_cache__current_storage = {0}; - -static size_t git_cache__max_object_size[8] = { - 0, /* GIT_OBJ__EXT1 */ - 4096, /* GIT_OBJ_COMMIT */ - 4096, /* GIT_OBJ_TREE */ - 0, /* GIT_OBJ_BLOB */ - 4096, /* GIT_OBJ_TAG */ - 0, /* GIT_OBJ__EXT2 */ - 0, /* GIT_OBJ_OFS_DELTA */ - 0 /* GIT_OBJ_REF_DELTA */ -}; - -int git_cache_set_max_object_size(git_otype type, size_t size) -{ - if (type < 0 || (size_t)type >= ARRAY_SIZE(git_cache__max_object_size)) { - giterr_set(GITERR_INVALID, "type out of range"); - return -1; - } - - git_cache__max_object_size[type] = size; - return 0; -} - -void git_cache_dump_stats(git_cache *cache) -{ - git_cached_obj *object; - - if (kh_size(cache->map) == 0) - return; - - printf("Cache %p: %d items cached, %"PRIdZ" bytes\n", - cache, kh_size(cache->map), cache->used_memory); - - kh_foreach_value(cache->map, object, { - char oid_str[9]; - printf(" %s%c %s (%"PRIuZ")\n", - git_object_type2string(object->type), - object->flags == GIT_CACHE_STORE_PARSED ? '*' : ' ', - git_oid_tostr(oid_str, sizeof(oid_str), &object->oid), - object->size - ); - }); -} - -int git_cache_init(git_cache *cache) -{ - memset(cache, 0, sizeof(*cache)); - cache->map = git_oidmap_alloc(); - GITERR_CHECK_ALLOC(cache->map); - if (git_rwlock_init(&cache->lock)) { - giterr_set(GITERR_OS, "Failed to initialize cache rwlock"); - return -1; - } - return 0; -} - -/* called with lock */ -static void clear_cache(git_cache *cache) -{ - git_cached_obj *evict = NULL; - - if (kh_size(cache->map) == 0) - return; - - kh_foreach_value(cache->map, evict, { - git_cached_obj_decref(evict); - }); - - kh_clear(oid, cache->map); - git_atomic_ssize_add(&git_cache__current_storage, -cache->used_memory); - cache->used_memory = 0; -} - -void git_cache_clear(git_cache *cache) -{ - if (git_rwlock_wrlock(&cache->lock) < 0) - return; - - clear_cache(cache); - - git_rwlock_wrunlock(&cache->lock); -} - -void git_cache_free(git_cache *cache) -{ - git_cache_clear(cache); - git_oidmap_free(cache->map); - git_rwlock_free(&cache->lock); - git__memzero(cache, sizeof(*cache)); -} - -/* Called with lock */ -static void cache_evict_entries(git_cache *cache) -{ - uint32_t seed = rand(); - size_t evict_count = 8; - ssize_t evicted_memory = 0; - - /* do not infinite loop if there's not enough entries to evict */ - if (evict_count > kh_size(cache->map)) { - clear_cache(cache); - return; - } - - while (evict_count > 0) { - khiter_t pos = seed++ % kh_end(cache->map); - - if (kh_exist(cache->map, pos)) { - git_cached_obj *evict = kh_val(cache->map, pos); - - evict_count--; - evicted_memory += evict->size; - git_cached_obj_decref(evict); - - kh_del(oid, cache->map, pos); - } - } - - cache->used_memory -= evicted_memory; - git_atomic_ssize_add(&git_cache__current_storage, -evicted_memory); -} - -static bool cache_should_store(git_otype object_type, size_t object_size) -{ - size_t max_size = git_cache__max_object_size[object_type]; - return git_cache__enabled && object_size < max_size; -} - -static void *cache_get(git_cache *cache, const git_oid *oid, unsigned int flags) -{ - khiter_t pos; - git_cached_obj *entry = NULL; - - if (!git_cache__enabled || git_rwlock_rdlock(&cache->lock) < 0) - return NULL; - - pos = kh_get(oid, cache->map, oid); - if (pos != kh_end(cache->map)) { - entry = kh_val(cache->map, pos); - - if (flags && entry->flags != flags) { - entry = NULL; - } else { - git_cached_obj_incref(entry); - } - } - - git_rwlock_rdunlock(&cache->lock); - - return entry; -} - -static void *cache_store(git_cache *cache, git_cached_obj *entry) -{ - khiter_t pos; - - git_cached_obj_incref(entry); - - if (!git_cache__enabled && cache->used_memory > 0) { - git_cache_clear(cache); - return entry; - } - - if (!cache_should_store(entry->type, entry->size)) - return entry; - - if (git_rwlock_wrlock(&cache->lock) < 0) - return entry; - - /* soften the load on the cache */ - if (git_cache__current_storage.val > git_cache__max_storage) - cache_evict_entries(cache); - - pos = kh_get(oid, cache->map, &entry->oid); - - /* not found */ - if (pos == kh_end(cache->map)) { - int rval; - - pos = kh_put(oid, cache->map, &entry->oid, &rval); - if (rval >= 0) { - kh_key(cache->map, pos) = &entry->oid; - kh_val(cache->map, pos) = entry; - git_cached_obj_incref(entry); - cache->used_memory += entry->size; - git_atomic_ssize_add(&git_cache__current_storage, (ssize_t)entry->size); - } - } - /* found */ - else { - git_cached_obj *stored_entry = kh_val(cache->map, pos); - - if (stored_entry->flags == entry->flags) { - git_cached_obj_decref(entry); - git_cached_obj_incref(stored_entry); - entry = stored_entry; - } else if (stored_entry->flags == GIT_CACHE_STORE_RAW && - entry->flags == GIT_CACHE_STORE_PARSED) { - git_cached_obj_decref(stored_entry); - git_cached_obj_incref(entry); - - kh_key(cache->map, pos) = &entry->oid; - kh_val(cache->map, pos) = entry; - } else { - /* NO OP */ - } - } - - git_rwlock_wrunlock(&cache->lock); - return entry; -} - -void *git_cache_store_raw(git_cache *cache, git_odb_object *entry) -{ - entry->cached.flags = GIT_CACHE_STORE_RAW; - return cache_store(cache, (git_cached_obj *)entry); -} - -void *git_cache_store_parsed(git_cache *cache, git_object *entry) -{ - entry->cached.flags = GIT_CACHE_STORE_PARSED; - return cache_store(cache, (git_cached_obj *)entry); -} - -git_odb_object *git_cache_get_raw(git_cache *cache, const git_oid *oid) -{ - return cache_get(cache, oid, GIT_CACHE_STORE_RAW); -} - -git_object *git_cache_get_parsed(git_cache *cache, const git_oid *oid) -{ - return cache_get(cache, oid, GIT_CACHE_STORE_PARSED); -} - -void *git_cache_get_any(git_cache *cache, const git_oid *oid) -{ - return cache_get(cache, oid, GIT_CACHE_STORE_ANY); -} - -void git_cached_obj_decref(void *_obj) -{ - git_cached_obj *obj = _obj; - - if (git_atomic_dec(&obj->refcount) == 0) { - switch (obj->flags) { - case GIT_CACHE_STORE_RAW: - git_odb_object__free(_obj); - break; - - case GIT_CACHE_STORE_PARSED: - git_object__free(_obj); - break; - - default: - git__free(_obj); - break; - } - } -} diff --git a/vendor/libgit2/src/cache.h b/vendor/libgit2/src/cache.h deleted file mode 100644 index 6971237397..0000000000 --- a/vendor/libgit2/src/cache.h +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_cache_h__ -#define INCLUDE_cache_h__ - -#include "git2/common.h" -#include "git2/oid.h" -#include "git2/odb.h" - -#include "thread-utils.h" -#include "oidmap.h" - -enum { - GIT_CACHE_STORE_ANY = 0, - GIT_CACHE_STORE_RAW = 1, - GIT_CACHE_STORE_PARSED = 2 -}; - -typedef struct { - git_oid oid; - int16_t type; /* git_otype value */ - uint16_t flags; /* GIT_CACHE_STORE value */ - size_t size; - git_atomic refcount; -} git_cached_obj; - -typedef struct { - git_oidmap *map; - git_rwlock lock; - ssize_t used_memory; -} git_cache; - -extern bool git_cache__enabled; -extern ssize_t git_cache__max_storage; -extern git_atomic_ssize git_cache__current_storage; - -int git_cache_set_max_object_size(git_otype type, size_t size); - -int git_cache_init(git_cache *cache); -void git_cache_free(git_cache *cache); -void git_cache_clear(git_cache *cache); - -void *git_cache_store_raw(git_cache *cache, git_odb_object *entry); -void *git_cache_store_parsed(git_cache *cache, git_object *entry); - -git_odb_object *git_cache_get_raw(git_cache *cache, const git_oid *oid); -git_object *git_cache_get_parsed(git_cache *cache, const git_oid *oid); -void *git_cache_get_any(git_cache *cache, const git_oid *oid); - -GIT_INLINE(size_t) git_cache_size(git_cache *cache) -{ - return (size_t)kh_size(cache->map); -} - -GIT_INLINE(void) git_cached_obj_incref(void *_obj) -{ - git_cached_obj *obj = _obj; - git_atomic_inc(&obj->refcount); -} - -void git_cached_obj_decref(void *_obj); - -#endif diff --git a/vendor/libgit2/src/cc-compat.h b/vendor/libgit2/src/cc-compat.h deleted file mode 100644 index cefdc928b0..0000000000 --- a/vendor/libgit2/src/cc-compat.h +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_compat_h__ -#define INCLUDE_compat_h__ - -#include - -/* - * See if our compiler is known to support flexible array members. - */ -#ifndef GIT_FLEX_ARRAY -# if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) -# define GIT_FLEX_ARRAY /* empty */ -# elif defined(__GNUC__) -# if (__GNUC__ >= 3) -# define GIT_FLEX_ARRAY /* empty */ -# else -# define GIT_FLEX_ARRAY 0 /* older GNU extension */ -# endif -# endif - -/* Default to safer but a bit wasteful traditional style */ -# ifndef GIT_FLEX_ARRAY -# define GIT_FLEX_ARRAY 1 -# endif -#endif - -#ifdef __GNUC__ -# define GIT_TYPEOF(x) (__typeof__(x)) -#else -# define GIT_TYPEOF(x) -#endif - -#if defined(__GNUC__) -# define GIT_ALIGN(x,size) x __attribute__ ((aligned(size))) -#elif defined(_MSC_VER) -# define GIT_ALIGN(x,size) __declspec(align(size)) x -#else -# define GIT_ALIGN(x,size) x -#endif - -#define GIT_UNUSED(x) ((void)(x)) - -/* Define the printf format specifer to use for size_t output */ -#if defined(_MSC_VER) || defined(__MINGW32__) -# define PRIuZ "Iu" -# define PRIxZ "Ix" -# define PRIdZ "Id" -#else -# define PRIuZ "zu" -# define PRIxZ "zx" -# define PRIdZ "zd" -#endif - -/* Micosoft Visual C/C++ */ -#if defined(_MSC_VER) -/* disable "deprecated function" warnings */ -# pragma warning ( disable : 4996 ) -/* disable "conditional expression is constant" level 4 warnings */ -# pragma warning ( disable : 4127 ) -#endif - -#if defined (_MSC_VER) - typedef unsigned char bool; -# ifndef true -# define true 1 -# endif -# ifndef false -# define false 0 -# endif -#else -# include -#endif - -#ifndef va_copy -# ifdef __va_copy -# define va_copy(dst, src) __va_copy(dst, src) -# else -# define va_copy(dst, src) ((dst) = (src)) -# endif -#endif - -#endif /* INCLUDE_compat_h__ */ diff --git a/vendor/libgit2/src/checkout.c b/vendor/libgit2/src/checkout.c deleted file mode 100644 index 4b3acbcce5..0000000000 --- a/vendor/libgit2/src/checkout.c +++ /dev/null @@ -1,2707 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#include - -#include "checkout.h" - -#include "git2/repository.h" -#include "git2/refs.h" -#include "git2/tree.h" -#include "git2/blob.h" -#include "git2/config.h" -#include "git2/diff.h" -#include "git2/submodule.h" -#include "git2/sys/index.h" -#include "git2/sys/filter.h" - -#include "refs.h" -#include "repository.h" -#include "index.h" -#include "filter.h" -#include "blob.h" -#include "diff.h" -#include "pathspec.h" -#include "buf_text.h" -#include "merge_file.h" -#include "path.h" -#include "attr.h" -#include "pool.h" -#include "strmap.h" - -GIT__USE_STRMAP - -/* See docs/checkout-internals.md for more information */ - -enum { - CHECKOUT_ACTION__NONE = 0, - CHECKOUT_ACTION__REMOVE = 1, - CHECKOUT_ACTION__UPDATE_BLOB = 2, - CHECKOUT_ACTION__UPDATE_SUBMODULE = 4, - CHECKOUT_ACTION__CONFLICT = 8, - CHECKOUT_ACTION__REMOVE_CONFLICT = 16, - CHECKOUT_ACTION__UPDATE_CONFLICT = 32, - CHECKOUT_ACTION__MAX = 32, - CHECKOUT_ACTION__DEFER_REMOVE = 64, - CHECKOUT_ACTION__REMOVE_AND_UPDATE = - (CHECKOUT_ACTION__UPDATE_BLOB | CHECKOUT_ACTION__REMOVE), -}; - -typedef struct { - git_repository *repo; - git_iterator *target; - git_diff *diff; - git_checkout_options opts; - bool opts_free_baseline; - char *pfx; - git_index *index; - git_pool pool; - git_vector removes; - git_vector remove_conflicts; - git_vector update_conflicts; - git_vector *update_reuc; - git_vector *update_names; - git_buf path; - size_t workdir_len; - git_buf tmp; - unsigned int strategy; - int can_symlink; - bool reload_submodules; - size_t total_steps; - size_t completed_steps; - git_checkout_perfdata perfdata; - git_strmap *mkdir_map; - git_attr_session attr_session; -} checkout_data; - -typedef struct { - const git_index_entry *ancestor; - const git_index_entry *ours; - const git_index_entry *theirs; - - int name_collision:1, - directoryfile:1, - one_to_two:1, - binary:1, - submodule:1; -} checkout_conflictdata; - -static int checkout_notify( - checkout_data *data, - git_checkout_notify_t why, - const git_diff_delta *delta, - const git_index_entry *wditem) -{ - git_diff_file wdfile; - const git_diff_file *baseline = NULL, *target = NULL, *workdir = NULL; - const char *path = NULL; - - if (!data->opts.notify_cb || - (why & data->opts.notify_flags) == 0) - return 0; - - if (wditem) { - memset(&wdfile, 0, sizeof(wdfile)); - - git_oid_cpy(&wdfile.id, &wditem->id); - wdfile.path = wditem->path; - wdfile.size = wditem->file_size; - wdfile.flags = GIT_DIFF_FLAG_VALID_ID; - wdfile.mode = wditem->mode; - - workdir = &wdfile; - - path = wditem->path; - } - - if (delta) { - switch (delta->status) { - case GIT_DELTA_UNMODIFIED: - case GIT_DELTA_MODIFIED: - case GIT_DELTA_TYPECHANGE: - default: - baseline = &delta->old_file; - target = &delta->new_file; - break; - case GIT_DELTA_ADDED: - case GIT_DELTA_IGNORED: - case GIT_DELTA_UNTRACKED: - case GIT_DELTA_UNREADABLE: - target = &delta->new_file; - break; - case GIT_DELTA_DELETED: - baseline = &delta->old_file; - break; - } - - path = delta->old_file.path; - } - - { - int error = data->opts.notify_cb( - why, path, baseline, target, workdir, data->opts.notify_payload); - - return giterr_set_after_callback_function( - error, "git_checkout notification"); - } -} - -GIT_INLINE(bool) is_workdir_base_or_new( - const git_oid *workdir_id, - const git_diff_file *baseitem, - const git_diff_file *newitem) -{ - return (git_oid__cmp(&baseitem->id, workdir_id) == 0 || - git_oid__cmp(&newitem->id, workdir_id) == 0); -} - -static bool checkout_is_workdir_modified( - checkout_data *data, - const git_diff_file *baseitem, - const git_diff_file *newitem, - const git_index_entry *wditem) -{ - git_oid oid; - const git_index_entry *ie; - - /* handle "modified" submodule */ - if (wditem->mode == GIT_FILEMODE_COMMIT) { - git_submodule *sm; - unsigned int sm_status = 0; - const git_oid *sm_oid = NULL; - bool rval = false; - - if (git_submodule_lookup(&sm, data->repo, wditem->path) < 0) { - giterr_clear(); - return true; - } - - if (git_submodule_status(&sm_status, data->repo, wditem->path, GIT_SUBMODULE_IGNORE_UNSPECIFIED) < 0 || - GIT_SUBMODULE_STATUS_IS_WD_DIRTY(sm_status)) - rval = true; - else if ((sm_oid = git_submodule_wd_id(sm)) == NULL) - rval = false; - else - rval = (git_oid__cmp(&baseitem->id, sm_oid) != 0); - - git_submodule_free(sm); - return rval; - } - - /* Look at the cache to decide if the workdir is modified. If not, - * we can simply compare the oid in the cache to the baseitem instead - * of hashing the file. If so, we allow the checkout to proceed if the - * oid is identical (ie, the staged item is what we're trying to check - * out.) - */ - if ((ie = git_index_get_bypath(data->index, wditem->path, 0)) != NULL) { - if (wditem->mtime.seconds == ie->mtime.seconds && - wditem->mtime.nanoseconds == ie->mtime.nanoseconds && - wditem->file_size == ie->file_size) - return !is_workdir_base_or_new(&ie->id, baseitem, newitem); - } - - /* depending on where base is coming from, we may or may not know - * the actual size of the data, so we can't rely on this shortcut. - */ - if (baseitem->size && wditem->file_size != baseitem->size) - return true; - - if (git_diff__oid_for_entry(&oid, data->diff, wditem, wditem->mode, NULL) < 0) - return false; - - /* Allow the checkout if the workdir is not modified *or* if the checkout - * target's contents are already in the working directory. - */ - return !is_workdir_base_or_new(&oid, baseitem, newitem); -} - -#define CHECKOUT_ACTION_IF(FLAG,YES,NO) \ - ((data->strategy & GIT_CHECKOUT_##FLAG) ? CHECKOUT_ACTION__##YES : CHECKOUT_ACTION__##NO) - -static int checkout_action_common( - int *action, - checkout_data *data, - const git_diff_delta *delta, - const git_index_entry *wd) -{ - git_checkout_notify_t notify = GIT_CHECKOUT_NOTIFY_NONE; - - if ((data->strategy & GIT_CHECKOUT_UPDATE_ONLY) != 0) - *action = (*action & ~CHECKOUT_ACTION__REMOVE); - - if ((*action & CHECKOUT_ACTION__UPDATE_BLOB) != 0) { - if (S_ISGITLINK(delta->new_file.mode)) - *action = (*action & ~CHECKOUT_ACTION__UPDATE_BLOB) | - CHECKOUT_ACTION__UPDATE_SUBMODULE; - - /* to "update" a symlink, we must remove the old one first */ - if (delta->new_file.mode == GIT_FILEMODE_LINK && wd != NULL) - *action |= CHECKOUT_ACTION__REMOVE; - - notify = GIT_CHECKOUT_NOTIFY_UPDATED; - } - - if ((*action & CHECKOUT_ACTION__CONFLICT) != 0) - notify = GIT_CHECKOUT_NOTIFY_CONFLICT; - - return checkout_notify(data, notify, delta, wd); -} - -static int checkout_action_no_wd( - int *action, - checkout_data *data, - const git_diff_delta *delta) -{ - int error = 0; - - *action = CHECKOUT_ACTION__NONE; - - switch (delta->status) { - case GIT_DELTA_UNMODIFIED: /* case 12 */ - error = checkout_notify(data, GIT_CHECKOUT_NOTIFY_DIRTY, delta, NULL); - if (error) - return error; - *action = CHECKOUT_ACTION_IF(RECREATE_MISSING, UPDATE_BLOB, NONE); - break; - case GIT_DELTA_ADDED: /* case 2 or 28 (and 5 but not really) */ - *action = CHECKOUT_ACTION_IF(SAFE, UPDATE_BLOB, NONE); - break; - case GIT_DELTA_MODIFIED: /* case 13 (and 35 but not really) */ - *action = CHECKOUT_ACTION_IF(RECREATE_MISSING, UPDATE_BLOB, CONFLICT); - break; - case GIT_DELTA_TYPECHANGE: /* case 21 (B->T) and 28 (T->B)*/ - if (delta->new_file.mode == GIT_FILEMODE_TREE) - *action = CHECKOUT_ACTION_IF(SAFE, UPDATE_BLOB, NONE); - break; - case GIT_DELTA_DELETED: /* case 8 or 25 */ - *action = CHECKOUT_ACTION_IF(SAFE, REMOVE, NONE); - break; - default: /* impossible */ - break; - } - - return checkout_action_common(action, data, delta, NULL); -} - -static bool wd_item_is_removable(git_iterator *iter, const git_index_entry *wd) -{ - git_buf *full = NULL; - - if (wd->mode != GIT_FILEMODE_TREE) - return true; - if (git_iterator_current_workdir_path(&full, iter) < 0) - return true; - return !full || !git_path_contains(full, DOT_GIT); -} - -static int checkout_queue_remove(checkout_data *data, const char *path) -{ - char *copy = git_pool_strdup(&data->pool, path); - GITERR_CHECK_ALLOC(copy); - return git_vector_insert(&data->removes, copy); -} - -/* note that this advances the iterator over the wd item */ -static int checkout_action_wd_only( - checkout_data *data, - git_iterator *workdir, - const git_index_entry **wditem, - git_vector *pathspec) -{ - int error = 0; - bool remove = false; - git_checkout_notify_t notify = GIT_CHECKOUT_NOTIFY_NONE; - const git_index_entry *wd = *wditem; - - if (!git_pathspec__match( - pathspec, wd->path, - (data->strategy & GIT_CHECKOUT_DISABLE_PATHSPEC_MATCH) != 0, - git_iterator_ignore_case(workdir), NULL, NULL)) - return git_iterator_advance(wditem, workdir); - - /* check if item is tracked in the index but not in the checkout diff */ - if (data->index != NULL) { - size_t pos; - - error = git_index__find_pos( - &pos, data->index, wd->path, 0, GIT_INDEX_STAGE_ANY); - - if (wd->mode != GIT_FILEMODE_TREE) { - if (!error) { /* found by git_index__find_pos call */ - notify = GIT_CHECKOUT_NOTIFY_DIRTY; - remove = ((data->strategy & GIT_CHECKOUT_FORCE) != 0); - } else if (error != GIT_ENOTFOUND) - return error; - else - error = 0; /* git_index__find_pos does not set error msg */ - } else { - /* for tree entries, we have to see if there are any index - * entries that are contained inside that tree - */ - const git_index_entry *e = git_index_get_byindex(data->index, pos); - - if (e != NULL && data->diff->pfxcomp(e->path, wd->path) == 0) { - notify = GIT_CHECKOUT_NOTIFY_DIRTY; - remove = ((data->strategy & GIT_CHECKOUT_FORCE) != 0); - } - } - } - - if (notify != GIT_CHECKOUT_NOTIFY_NONE) { - /* if we found something in the index, notify and advance */ - if ((error = checkout_notify(data, notify, NULL, wd)) != 0) - return error; - - if (remove && wd_item_is_removable(workdir, wd)) - error = checkout_queue_remove(data, wd->path); - - if (!error) - error = git_iterator_advance(wditem, workdir); - } else { - /* untracked or ignored - can't know which until we advance through */ - bool over = false, removable = wd_item_is_removable(workdir, wd); - git_iterator_status_t untracked_state; - - /* copy the entry for issuing notification callback later */ - git_index_entry saved_wd = *wd; - git_buf_sets(&data->tmp, wd->path); - saved_wd.path = data->tmp.ptr; - - error = git_iterator_advance_over_with_status( - wditem, &untracked_state, workdir); - if (error == GIT_ITEROVER) - over = true; - else if (error < 0) - return error; - - if (untracked_state == GIT_ITERATOR_STATUS_IGNORED) { - notify = GIT_CHECKOUT_NOTIFY_IGNORED; - remove = ((data->strategy & GIT_CHECKOUT_REMOVE_IGNORED) != 0); - } else { - notify = GIT_CHECKOUT_NOTIFY_UNTRACKED; - remove = ((data->strategy & GIT_CHECKOUT_REMOVE_UNTRACKED) != 0); - } - - if ((error = checkout_notify(data, notify, NULL, &saved_wd)) != 0) - return error; - - if (remove && removable) - error = checkout_queue_remove(data, saved_wd.path); - - if (!error && over) /* restore ITEROVER if needed */ - error = GIT_ITEROVER; - } - - return error; -} - -static bool submodule_is_config_only( - checkout_data *data, - const char *path) -{ - git_submodule *sm = NULL; - unsigned int sm_loc = 0; - bool rval = false; - - if (git_submodule_lookup(&sm, data->repo, path) < 0) - return true; - - if (git_submodule_location(&sm_loc, sm) < 0 || - sm_loc == GIT_SUBMODULE_STATUS_IN_CONFIG) - rval = true; - - git_submodule_free(sm); - - return rval; -} - -static bool checkout_is_empty_dir(checkout_data *data, const char *path) -{ - git_buf_truncate(&data->path, data->workdir_len); - if (git_buf_puts(&data->path, path) < 0) - return false; - return git_path_is_empty_dir(data->path.ptr); -} - -static int checkout_action_with_wd( - int *action, - checkout_data *data, - const git_diff_delta *delta, - git_iterator *workdir, - const git_index_entry *wd) -{ - *action = CHECKOUT_ACTION__NONE; - - switch (delta->status) { - case GIT_DELTA_UNMODIFIED: /* case 14/15 or 33 */ - if (checkout_is_workdir_modified(data, &delta->old_file, &delta->new_file, wd)) { - GITERR_CHECK_ERROR( - checkout_notify(data, GIT_CHECKOUT_NOTIFY_DIRTY, delta, wd) ); - *action = CHECKOUT_ACTION_IF(FORCE, UPDATE_BLOB, NONE); - } - break; - case GIT_DELTA_ADDED: /* case 3, 4 or 6 */ - if (git_iterator_current_is_ignored(workdir)) - *action = CHECKOUT_ACTION_IF(DONT_OVERWRITE_IGNORED, CONFLICT, UPDATE_BLOB); - else - *action = CHECKOUT_ACTION_IF(FORCE, UPDATE_BLOB, CONFLICT); - break; - case GIT_DELTA_DELETED: /* case 9 or 10 (or 26 but not really) */ - if (checkout_is_workdir_modified(data, &delta->old_file, &delta->new_file, wd)) - *action = CHECKOUT_ACTION_IF(FORCE, REMOVE, CONFLICT); - else - *action = CHECKOUT_ACTION_IF(SAFE, REMOVE, NONE); - break; - case GIT_DELTA_MODIFIED: /* case 16, 17, 18 (or 36 but not really) */ - if (checkout_is_workdir_modified(data, &delta->old_file, &delta->new_file, wd)) - *action = CHECKOUT_ACTION_IF(FORCE, UPDATE_BLOB, CONFLICT); - else - *action = CHECKOUT_ACTION_IF(SAFE, UPDATE_BLOB, NONE); - break; - case GIT_DELTA_TYPECHANGE: /* case 22, 23, 29, 30 */ - if (delta->old_file.mode == GIT_FILEMODE_TREE) { - if (wd->mode == GIT_FILEMODE_TREE) - /* either deleting items in old tree will delete the wd dir, - * or we'll get a conflict when we attempt blob update... - */ - *action = CHECKOUT_ACTION_IF(SAFE, UPDATE_BLOB, NONE); - else if (wd->mode == GIT_FILEMODE_COMMIT) { - /* workdir is possibly a "phantom" submodule - treat as a - * tree if the only submodule info came from the config - */ - if (submodule_is_config_only(data, wd->path)) - *action = CHECKOUT_ACTION_IF(SAFE, UPDATE_BLOB, NONE); - else - *action = CHECKOUT_ACTION_IF(FORCE, REMOVE_AND_UPDATE, CONFLICT); - } else - *action = CHECKOUT_ACTION_IF(FORCE, REMOVE, CONFLICT); - } - else if (checkout_is_workdir_modified(data, &delta->old_file, &delta->new_file, wd)) - *action = CHECKOUT_ACTION_IF(FORCE, REMOVE_AND_UPDATE, CONFLICT); - else - *action = CHECKOUT_ACTION_IF(SAFE, REMOVE_AND_UPDATE, NONE); - - /* don't update if the typechange is to a tree */ - if (delta->new_file.mode == GIT_FILEMODE_TREE) - *action = (*action & ~CHECKOUT_ACTION__UPDATE_BLOB); - break; - default: /* impossible */ - break; - } - - return checkout_action_common(action, data, delta, wd); -} - -static int checkout_action_with_wd_blocker( - int *action, - checkout_data *data, - const git_diff_delta *delta, - const git_index_entry *wd) -{ - *action = CHECKOUT_ACTION__NONE; - - switch (delta->status) { - case GIT_DELTA_UNMODIFIED: - /* should show delta as dirty / deleted */ - GITERR_CHECK_ERROR( - checkout_notify(data, GIT_CHECKOUT_NOTIFY_DIRTY, delta, wd) ); - *action = CHECKOUT_ACTION_IF(FORCE, REMOVE_AND_UPDATE, NONE); - break; - case GIT_DELTA_ADDED: - case GIT_DELTA_MODIFIED: - *action = CHECKOUT_ACTION_IF(FORCE, REMOVE_AND_UPDATE, CONFLICT); - break; - case GIT_DELTA_DELETED: - *action = CHECKOUT_ACTION_IF(FORCE, REMOVE, CONFLICT); - break; - case GIT_DELTA_TYPECHANGE: - /* not 100% certain about this... */ - *action = CHECKOUT_ACTION_IF(FORCE, REMOVE_AND_UPDATE, CONFLICT); - break; - default: /* impossible */ - break; - } - - return checkout_action_common(action, data, delta, wd); -} - -static int checkout_action_with_wd_dir( - int *action, - checkout_data *data, - const git_diff_delta *delta, - git_iterator *workdir, - const git_index_entry *wd) -{ - *action = CHECKOUT_ACTION__NONE; - - switch (delta->status) { - case GIT_DELTA_UNMODIFIED: /* case 19 or 24 (or 34 but not really) */ - GITERR_CHECK_ERROR( - checkout_notify(data, GIT_CHECKOUT_NOTIFY_DIRTY, delta, NULL)); - GITERR_CHECK_ERROR( - checkout_notify(data, GIT_CHECKOUT_NOTIFY_UNTRACKED, NULL, wd)); - *action = CHECKOUT_ACTION_IF(FORCE, REMOVE_AND_UPDATE, NONE); - break; - case GIT_DELTA_ADDED:/* case 4 (and 7 for dir) */ - case GIT_DELTA_MODIFIED: /* case 20 (or 37 but not really) */ - if (delta->old_file.mode == GIT_FILEMODE_COMMIT) - /* expected submodule (and maybe found one) */; - else if (delta->new_file.mode != GIT_FILEMODE_TREE) - *action = git_iterator_current_is_ignored(workdir) ? - CHECKOUT_ACTION_IF(DONT_OVERWRITE_IGNORED, CONFLICT, REMOVE_AND_UPDATE) : - CHECKOUT_ACTION_IF(FORCE, REMOVE_AND_UPDATE, CONFLICT); - break; - case GIT_DELTA_DELETED: /* case 11 (and 27 for dir) */ - if (delta->old_file.mode != GIT_FILEMODE_TREE) - GITERR_CHECK_ERROR( - checkout_notify(data, GIT_CHECKOUT_NOTIFY_UNTRACKED, NULL, wd)); - break; - case GIT_DELTA_TYPECHANGE: /* case 24 or 31 */ - if (delta->old_file.mode == GIT_FILEMODE_TREE) { - /* For typechange from dir, remove dir and add blob, but it is - * not safe to remove dir if it contains modified files. - * However, safely removing child files will remove the parent - * directory if is it left empty, so we can defer removing the - * dir and it will succeed if no children are left. - */ - *action = CHECKOUT_ACTION_IF(SAFE, UPDATE_BLOB, NONE); - } - else if (delta->new_file.mode != GIT_FILEMODE_TREE) - /* For typechange to dir, dir is already created so no action */ - *action = CHECKOUT_ACTION_IF(FORCE, REMOVE_AND_UPDATE, CONFLICT); - break; - default: /* impossible */ - break; - } - - return checkout_action_common(action, data, delta, wd); -} - -static int checkout_action_with_wd_dir_empty( - int *action, - checkout_data *data, - const git_diff_delta *delta) -{ - int error = checkout_action_no_wd(action, data, delta); - - /* We can always safely remove an empty directory. */ - if (error == 0 && *action != CHECKOUT_ACTION__NONE) - *action |= CHECKOUT_ACTION__REMOVE; - - return error; -} - -static int checkout_action( - int *action, - checkout_data *data, - git_diff_delta *delta, - git_iterator *workdir, - const git_index_entry **wditem, - git_vector *pathspec) -{ - int cmp = -1, error; - int (*strcomp)(const char *, const char *) = data->diff->strcomp; - int (*pfxcomp)(const char *str, const char *pfx) = data->diff->pfxcomp; - int (*advance)(const git_index_entry **, git_iterator *) = NULL; - - /* move workdir iterator to follow along with deltas */ - - while (1) { - const git_index_entry *wd = *wditem; - - if (!wd) - return checkout_action_no_wd(action, data, delta); - - cmp = strcomp(wd->path, delta->old_file.path); - - /* 1. wd before delta ("a/a" before "a/b") - * 2. wd prefixes delta & should expand ("a/" before "a/b") - * 3. wd prefixes delta & cannot expand ("a/b" before "a/b/c") - * 4. wd equals delta ("a/b" and "a/b") - * 5. wd after delta & delta prefixes wd ("a/b/c" after "a/b/" or "a/b") - * 6. wd after delta ("a/c" after "a/b") - */ - - if (cmp < 0) { - cmp = pfxcomp(delta->old_file.path, wd->path); - - if (cmp == 0) { - if (wd->mode == GIT_FILEMODE_TREE) { - /* case 2 - entry prefixed by workdir tree */ - error = git_iterator_advance_into_or_over(wditem, workdir); - if (error < 0 && error != GIT_ITEROVER) - goto done; - continue; - } - - /* case 3 maybe - wd contains non-dir where dir expected */ - if (delta->old_file.path[strlen(wd->path)] == '/') { - error = checkout_action_with_wd_blocker( - action, data, delta, wd); - advance = git_iterator_advance; - goto done; - } - } - - /* case 1 - handle wd item (if it matches pathspec) */ - error = checkout_action_wd_only(data, workdir, wditem, pathspec); - if (error && error != GIT_ITEROVER) - goto done; - continue; - } - - if (cmp == 0) { - /* case 4 */ - error = checkout_action_with_wd(action, data, delta, workdir, wd); - advance = git_iterator_advance; - goto done; - } - - cmp = pfxcomp(wd->path, delta->old_file.path); - - if (cmp == 0) { /* case 5 */ - if (wd->path[strlen(delta->old_file.path)] != '/') - return checkout_action_no_wd(action, data, delta); - - if (delta->status == GIT_DELTA_TYPECHANGE) { - if (delta->old_file.mode == GIT_FILEMODE_TREE) { - error = checkout_action_with_wd(action, data, delta, workdir, wd); - advance = git_iterator_advance_into; - goto done; - } - - if (delta->new_file.mode == GIT_FILEMODE_TREE || - delta->new_file.mode == GIT_FILEMODE_COMMIT || - delta->old_file.mode == GIT_FILEMODE_COMMIT) - { - error = checkout_action_with_wd(action, data, delta, workdir, wd); - advance = git_iterator_advance; - goto done; - } - } - - return checkout_is_empty_dir(data, wd->path) ? - checkout_action_with_wd_dir_empty(action, data, delta) : - checkout_action_with_wd_dir(action, data, delta, workdir, wd); - } - - /* case 6 - wd is after delta */ - return checkout_action_no_wd(action, data, delta); - } - -done: - if (!error && advance != NULL && - (error = advance(wditem, workdir)) < 0) { - *wditem = NULL; - if (error == GIT_ITEROVER) - error = 0; - } - - return error; -} - -static int checkout_remaining_wd_items( - checkout_data *data, - git_iterator *workdir, - const git_index_entry *wd, - git_vector *spec) -{ - int error = 0; - - while (wd && !error) - error = checkout_action_wd_only(data, workdir, &wd, spec); - - if (error == GIT_ITEROVER) - error = 0; - - return error; -} - -GIT_INLINE(int) checkout_idxentry_cmp( - const git_index_entry *a, - const git_index_entry *b) -{ - if (!a && !b) - return 0; - else if (!a && b) - return -1; - else if(a && !b) - return 1; - else - return strcmp(a->path, b->path); -} - -static int checkout_conflictdata_cmp(const void *a, const void *b) -{ - const checkout_conflictdata *ca = a; - const checkout_conflictdata *cb = b; - int diff; - - if ((diff = checkout_idxentry_cmp(ca->ancestor, cb->ancestor)) == 0 && - (diff = checkout_idxentry_cmp(ca->ours, cb->theirs)) == 0) - diff = checkout_idxentry_cmp(ca->theirs, cb->theirs); - - return diff; -} - -int checkout_conflictdata_empty( - const git_vector *conflicts, size_t idx, void *payload) -{ - checkout_conflictdata *conflict; - - GIT_UNUSED(payload); - - if ((conflict = git_vector_get(conflicts, idx)) == NULL) - return -1; - - if (conflict->ancestor || conflict->ours || conflict->theirs) - return 0; - - git__free(conflict); - return 1; -} - -GIT_INLINE(bool) conflict_pathspec_match( - checkout_data *data, - git_iterator *workdir, - git_vector *pathspec, - const git_index_entry *ancestor, - const git_index_entry *ours, - const git_index_entry *theirs) -{ - /* if the pathspec matches ours *or* theirs, proceed */ - if (ours && git_pathspec__match(pathspec, ours->path, - (data->strategy & GIT_CHECKOUT_DISABLE_PATHSPEC_MATCH) != 0, - git_iterator_ignore_case(workdir), NULL, NULL)) - return true; - - if (theirs && git_pathspec__match(pathspec, theirs->path, - (data->strategy & GIT_CHECKOUT_DISABLE_PATHSPEC_MATCH) != 0, - git_iterator_ignore_case(workdir), NULL, NULL)) - return true; - - if (ancestor && git_pathspec__match(pathspec, ancestor->path, - (data->strategy & GIT_CHECKOUT_DISABLE_PATHSPEC_MATCH) != 0, - git_iterator_ignore_case(workdir), NULL, NULL)) - return true; - - return false; -} - -GIT_INLINE(int) checkout_conflict_detect_submodule(checkout_conflictdata *conflict) -{ - conflict->submodule = ((conflict->ancestor && S_ISGITLINK(conflict->ancestor->mode)) || - (conflict->ours && S_ISGITLINK(conflict->ours->mode)) || - (conflict->theirs && S_ISGITLINK(conflict->theirs->mode))); - return 0; -} - -GIT_INLINE(int) checkout_conflict_detect_binary(git_repository *repo, checkout_conflictdata *conflict) -{ - git_blob *ancestor_blob = NULL, *our_blob = NULL, *their_blob = NULL; - int error = 0; - - if (conflict->submodule) - return 0; - - if (conflict->ancestor) { - if ((error = git_blob_lookup(&ancestor_blob, repo, &conflict->ancestor->id)) < 0) - goto done; - - conflict->binary = git_blob_is_binary(ancestor_blob); - } - - if (!conflict->binary && conflict->ours) { - if ((error = git_blob_lookup(&our_blob, repo, &conflict->ours->id)) < 0) - goto done; - - conflict->binary = git_blob_is_binary(our_blob); - } - - if (!conflict->binary && conflict->theirs) { - if ((error = git_blob_lookup(&their_blob, repo, &conflict->theirs->id)) < 0) - goto done; - - conflict->binary = git_blob_is_binary(their_blob); - } - -done: - git_blob_free(ancestor_blob); - git_blob_free(our_blob); - git_blob_free(their_blob); - - return error; -} - -static int checkout_conflict_append_update( - const git_index_entry *ancestor, - const git_index_entry *ours, - const git_index_entry *theirs, - void *payload) -{ - checkout_data *data = payload; - checkout_conflictdata *conflict; - int error; - - conflict = git__calloc(1, sizeof(checkout_conflictdata)); - GITERR_CHECK_ALLOC(conflict); - - conflict->ancestor = ancestor; - conflict->ours = ours; - conflict->theirs = theirs; - - if ((error = checkout_conflict_detect_submodule(conflict)) < 0 || - (error = checkout_conflict_detect_binary(data->repo, conflict)) < 0) - { - git__free(conflict); - return error; - } - - if (git_vector_insert(&data->update_conflicts, conflict)) - return -1; - - return 0; -} - -static int checkout_conflicts_foreach( - checkout_data *data, - git_index *index, - git_iterator *workdir, - git_vector *pathspec, - int (*cb)(const git_index_entry *, const git_index_entry *, const git_index_entry *, void *), - void *payload) -{ - git_index_conflict_iterator *iterator = NULL; - const git_index_entry *ancestor, *ours, *theirs; - int error = 0; - - if ((error = git_index_conflict_iterator_new(&iterator, index)) < 0) - goto done; - - /* Collect the conflicts */ - while ((error = git_index_conflict_next(&ancestor, &ours, &theirs, iterator)) == 0) { - if (!conflict_pathspec_match(data, workdir, pathspec, ancestor, ours, theirs)) - continue; - - if ((error = cb(ancestor, ours, theirs, payload)) < 0) - goto done; - } - - if (error == GIT_ITEROVER) - error = 0; - -done: - git_index_conflict_iterator_free(iterator); - - return error; -} - -static int checkout_conflicts_load(checkout_data *data, git_iterator *workdir, git_vector *pathspec) -{ - git_index *index; - - /* Only write conficts from sources that have them: indexes. */ - if ((index = git_iterator_get_index(data->target)) == NULL) - return 0; - - data->update_conflicts._cmp = checkout_conflictdata_cmp; - - if (checkout_conflicts_foreach(data, index, workdir, pathspec, checkout_conflict_append_update, data) < 0) - return -1; - - /* Collect the REUC and NAME entries */ - data->update_reuc = &index->reuc; - data->update_names = &index->names; - - return 0; -} - -GIT_INLINE(int) checkout_conflicts_cmp_entry( - const char *path, - const git_index_entry *entry) -{ - return strcmp((const char *)path, entry->path); -} - -static int checkout_conflicts_cmp_ancestor(const void *p, const void *c) -{ - const char *path = p; - const checkout_conflictdata *conflict = c; - - if (!conflict->ancestor) - return 1; - - return checkout_conflicts_cmp_entry(path, conflict->ancestor); -} - -static checkout_conflictdata *checkout_conflicts_search_ancestor( - checkout_data *data, - const char *path) -{ - size_t pos; - - if (git_vector_bsearch2(&pos, &data->update_conflicts, checkout_conflicts_cmp_ancestor, path) < 0) - return NULL; - - return git_vector_get(&data->update_conflicts, pos); -} - -static checkout_conflictdata *checkout_conflicts_search_branch( - checkout_data *data, - const char *path) -{ - checkout_conflictdata *conflict; - size_t i; - - git_vector_foreach(&data->update_conflicts, i, conflict) { - int cmp = -1; - - if (conflict->ancestor) - break; - - if (conflict->ours) - cmp = checkout_conflicts_cmp_entry(path, conflict->ours); - else if (conflict->theirs) - cmp = checkout_conflicts_cmp_entry(path, conflict->theirs); - - if (cmp == 0) - return conflict; - } - - return NULL; -} - -static int checkout_conflicts_load_byname_entry( - checkout_conflictdata **ancestor_out, - checkout_conflictdata **ours_out, - checkout_conflictdata **theirs_out, - checkout_data *data, - const git_index_name_entry *name_entry) -{ - checkout_conflictdata *ancestor, *ours = NULL, *theirs = NULL; - int error = 0; - - *ancestor_out = NULL; - *ours_out = NULL; - *theirs_out = NULL; - - if (!name_entry->ancestor) { - giterr_set(GITERR_INDEX, "A NAME entry exists without an ancestor"); - error = -1; - goto done; - } - - if (!name_entry->ours && !name_entry->theirs) { - giterr_set(GITERR_INDEX, "A NAME entry exists without an ours or theirs"); - error = -1; - goto done; - } - - if ((ancestor = checkout_conflicts_search_ancestor(data, - name_entry->ancestor)) == NULL) { - giterr_set(GITERR_INDEX, - "A NAME entry referenced ancestor entry '%s' which does not exist in the main index", - name_entry->ancestor); - error = -1; - goto done; - } - - if (name_entry->ours) { - if (strcmp(name_entry->ancestor, name_entry->ours) == 0) - ours = ancestor; - else if ((ours = checkout_conflicts_search_branch(data, name_entry->ours)) == NULL || - ours->ours == NULL) { - giterr_set(GITERR_INDEX, - "A NAME entry referenced our entry '%s' which does not exist in the main index", - name_entry->ours); - error = -1; - goto done; - } - } - - if (name_entry->theirs) { - if (strcmp(name_entry->ancestor, name_entry->theirs) == 0) - theirs = ancestor; - else if (name_entry->ours && strcmp(name_entry->ours, name_entry->theirs) == 0) - theirs = ours; - else if ((theirs = checkout_conflicts_search_branch(data, name_entry->theirs)) == NULL || - theirs->theirs == NULL) { - giterr_set(GITERR_INDEX, - "A NAME entry referenced their entry '%s' which does not exist in the main index", - name_entry->theirs); - error = -1; - goto done; - } - } - - *ancestor_out = ancestor; - *ours_out = ours; - *theirs_out = theirs; - -done: - return error; -} - -static int checkout_conflicts_coalesce_renames( - checkout_data *data) -{ - git_index *index; - const git_index_name_entry *name_entry; - checkout_conflictdata *ancestor_conflict, *our_conflict, *their_conflict; - size_t i, names; - int error = 0; - - if ((index = git_iterator_get_index(data->target)) == NULL) - return 0; - - /* Juggle entries based on renames */ - names = git_index_name_entrycount(index); - - for (i = 0; i < names; i++) { - name_entry = git_index_name_get_byindex(index, i); - - if ((error = checkout_conflicts_load_byname_entry( - &ancestor_conflict, &our_conflict, &their_conflict, - data, name_entry)) < 0) - goto done; - - if (our_conflict && our_conflict != ancestor_conflict) { - ancestor_conflict->ours = our_conflict->ours; - our_conflict->ours = NULL; - - if (our_conflict->theirs) - our_conflict->name_collision = 1; - - if (our_conflict->name_collision) - ancestor_conflict->name_collision = 1; - } - - if (their_conflict && their_conflict != ancestor_conflict) { - ancestor_conflict->theirs = their_conflict->theirs; - their_conflict->theirs = NULL; - - if (their_conflict->ours) - their_conflict->name_collision = 1; - - if (their_conflict->name_collision) - ancestor_conflict->name_collision = 1; - } - - if (our_conflict && our_conflict != ancestor_conflict && - their_conflict && their_conflict != ancestor_conflict) - ancestor_conflict->one_to_two = 1; - } - - git_vector_remove_matching( - &data->update_conflicts, checkout_conflictdata_empty, NULL); - -done: - return error; -} - -static int checkout_conflicts_mark_directoryfile( - checkout_data *data) -{ - git_index *index; - checkout_conflictdata *conflict; - const git_index_entry *entry; - size_t i, j, len; - const char *path; - int prefixed, error = 0; - - if ((index = git_iterator_get_index(data->target)) == NULL) - return 0; - - len = git_index_entrycount(index); - - /* Find d/f conflicts */ - git_vector_foreach(&data->update_conflicts, i, conflict) { - if ((conflict->ours && conflict->theirs) || - (!conflict->ours && !conflict->theirs)) - continue; - - path = conflict->ours ? - conflict->ours->path : conflict->theirs->path; - - if ((error = git_index_find(&j, index, path)) < 0) { - if (error == GIT_ENOTFOUND) - giterr_set(GITERR_INDEX, - "Index inconsistency, could not find entry for expected conflict '%s'", path); - - goto done; - } - - for (; j < len; j++) { - if ((entry = git_index_get_byindex(index, j)) == NULL) { - giterr_set(GITERR_INDEX, - "Index inconsistency, truncated index while loading expected conflict '%s'", path); - error = -1; - goto done; - } - - prefixed = git_path_equal_or_prefixed(path, entry->path, NULL); - - if (prefixed == GIT_PATH_EQUAL) - continue; - - if (prefixed == GIT_PATH_PREFIX) - conflict->directoryfile = 1; - - break; - } - } - -done: - return error; -} - -static int checkout_get_update_conflicts( - checkout_data *data, - git_iterator *workdir, - git_vector *pathspec) -{ - int error = 0; - - if (data->strategy & GIT_CHECKOUT_SKIP_UNMERGED) - return 0; - - if ((error = checkout_conflicts_load(data, workdir, pathspec)) < 0 || - (error = checkout_conflicts_coalesce_renames(data)) < 0 || - (error = checkout_conflicts_mark_directoryfile(data)) < 0) - goto done; - -done: - return error; -} - -static int checkout_conflict_append_remove( - const git_index_entry *ancestor, - const git_index_entry *ours, - const git_index_entry *theirs, - void *payload) -{ - checkout_data *data = payload; - const char *name; - - assert(ancestor || ours || theirs); - - if (ancestor) - name = git__strdup(ancestor->path); - else if (ours) - name = git__strdup(ours->path); - else if (theirs) - name = git__strdup(theirs->path); - else - abort(); - - GITERR_CHECK_ALLOC(name); - - return git_vector_insert(&data->remove_conflicts, (char *)name); -} - -static int checkout_get_remove_conflicts( - checkout_data *data, - git_iterator *workdir, - git_vector *pathspec) -{ - if ((data->strategy & GIT_CHECKOUT_DONT_UPDATE_INDEX) != 0) - return 0; - - return checkout_conflicts_foreach(data, data->index, workdir, pathspec, checkout_conflict_append_remove, data); -} - -static int checkout_verify_paths( - git_repository *repo, - int action, - git_diff_delta *delta) -{ - unsigned int flags = GIT_PATH_REJECT_DEFAULTS | GIT_PATH_REJECT_DOT_GIT; - - if (action & CHECKOUT_ACTION__REMOVE) { - if (!git_path_isvalid(repo, delta->old_file.path, flags)) { - giterr_set(GITERR_CHECKOUT, "Cannot remove invalid path '%s'", delta->old_file.path); - return -1; - } - } - - if (action & ~CHECKOUT_ACTION__REMOVE) { - if (!git_path_isvalid(repo, delta->new_file.path, flags)) { - giterr_set(GITERR_CHECKOUT, "Cannot checkout to invalid path '%s'", delta->new_file.path); - return -1; - } - } - - return 0; -} - -static int checkout_get_actions( - uint32_t **actions_ptr, - size_t **counts_ptr, - checkout_data *data, - git_iterator *workdir) -{ - int error = 0, act; - const git_index_entry *wditem; - git_vector pathspec = GIT_VECTOR_INIT, *deltas; - git_pool pathpool = GIT_POOL_INIT_STRINGPOOL; - git_diff_delta *delta; - size_t i, *counts = NULL; - uint32_t *actions = NULL; - - if (data->opts.paths.count > 0 && - git_pathspec__vinit(&pathspec, &data->opts.paths, &pathpool) < 0) - return -1; - - if ((error = git_iterator_current(&wditem, workdir)) < 0 && - error != GIT_ITEROVER) - goto fail; - - deltas = &data->diff->deltas; - - *counts_ptr = counts = git__calloc(CHECKOUT_ACTION__MAX+1, sizeof(size_t)); - *actions_ptr = actions = git__calloc( - deltas->length ? deltas->length : 1, sizeof(uint32_t)); - if (!counts || !actions) { - error = -1; - goto fail; - } - - git_vector_foreach(deltas, i, delta) { - if ((error = checkout_action(&act, data, delta, workdir, &wditem, &pathspec)) == 0) - error = checkout_verify_paths(data->repo, act, delta); - - if (error != 0) - goto fail; - - actions[i] = act; - - if (act & CHECKOUT_ACTION__REMOVE) - counts[CHECKOUT_ACTION__REMOVE]++; - if (act & CHECKOUT_ACTION__UPDATE_BLOB) - counts[CHECKOUT_ACTION__UPDATE_BLOB]++; - if (act & CHECKOUT_ACTION__UPDATE_SUBMODULE) - counts[CHECKOUT_ACTION__UPDATE_SUBMODULE]++; - if (act & CHECKOUT_ACTION__CONFLICT) - counts[CHECKOUT_ACTION__CONFLICT]++; - } - - error = checkout_remaining_wd_items(data, workdir, wditem, &pathspec); - if (error) - goto fail; - - counts[CHECKOUT_ACTION__REMOVE] += data->removes.length; - - if (counts[CHECKOUT_ACTION__CONFLICT] > 0 && - (data->strategy & GIT_CHECKOUT_ALLOW_CONFLICTS) == 0) - { - giterr_set(GITERR_CHECKOUT, "%"PRIuZ" %s checkout", - counts[CHECKOUT_ACTION__CONFLICT], - counts[CHECKOUT_ACTION__CONFLICT] == 1 ? - "conflict prevents" : "conflicts prevent"); - error = GIT_ECONFLICT; - goto fail; - } - - - if ((error = checkout_get_remove_conflicts(data, workdir, &pathspec)) < 0 || - (error = checkout_get_update_conflicts(data, workdir, &pathspec)) < 0) - goto fail; - - counts[CHECKOUT_ACTION__REMOVE_CONFLICT] = git_vector_length(&data->remove_conflicts); - counts[CHECKOUT_ACTION__UPDATE_CONFLICT] = git_vector_length(&data->update_conflicts); - - git_pathspec__vfree(&pathspec); - git_pool_clear(&pathpool); - - return 0; - -fail: - *counts_ptr = NULL; - git__free(counts); - *actions_ptr = NULL; - git__free(actions); - - git_pathspec__vfree(&pathspec); - git_pool_clear(&pathpool); - - return error; -} - -static bool should_remove_existing(checkout_data *data) -{ - int ignorecase = 0; - - git_repository__cvar(&ignorecase, data->repo, GIT_CVAR_IGNORECASE); - - return (ignorecase && - (data->strategy & GIT_CHECKOUT_DONT_REMOVE_EXISTING) == 0); -} - -#define MKDIR_NORMAL \ - GIT_MKDIR_PATH | GIT_MKDIR_VERIFY_DIR -#define MKDIR_REMOVE_EXISTING \ - MKDIR_NORMAL | GIT_MKDIR_REMOVE_FILES | GIT_MKDIR_REMOVE_SYMLINKS - -static int checkout_mkdir( - checkout_data *data, - const char *path, - const char *base, - mode_t mode, - unsigned int flags) -{ - struct git_futils_mkdir_options mkdir_opts = {0}; - int error; - - mkdir_opts.dir_map = data->mkdir_map; - mkdir_opts.pool = &data->pool; - - error = git_futils_mkdir_ext( - path, base, mode, flags, &mkdir_opts); - - data->perfdata.mkdir_calls += mkdir_opts.perfdata.mkdir_calls; - data->perfdata.stat_calls += mkdir_opts.perfdata.stat_calls; - data->perfdata.chmod_calls += mkdir_opts.perfdata.chmod_calls; - - return error; -} - -static int mkpath2file( - checkout_data *data, const char *path, unsigned int mode) -{ - struct stat st; - bool remove_existing = should_remove_existing(data); - unsigned int flags = - (remove_existing ? MKDIR_REMOVE_EXISTING : MKDIR_NORMAL) | - GIT_MKDIR_SKIP_LAST; - int error; - - if ((error = checkout_mkdir( - data, path, data->opts.target_directory, mode, flags)) < 0) - return error; - - if (remove_existing) { - data->perfdata.stat_calls++; - - if (p_lstat(path, &st) == 0) { - - /* Some file, symlink or folder already exists at this name. - * We would have removed it in remove_the_old unless we're on - * a case inensitive filesystem (or the user has asked us not - * to). Remove the similarly named file to write the new. - */ - error = git_futils_rmdir_r(path, NULL, GIT_RMDIR_REMOVE_FILES); - } else if (errno != ENOENT) { - giterr_set(GITERR_OS, "Failed to stat file '%s'", path); - return GIT_EEXISTS; - } else { - giterr_clear(); - } - } - - return error; -} - -struct checkout_stream { - git_writestream base; - const char *path; - int fd; - int open; -}; - -static int checkout_stream_write( - git_writestream *s, const char *buffer, size_t len) -{ - struct checkout_stream *stream = (struct checkout_stream *)s; - int ret; - - if ((ret = p_write(stream->fd, buffer, len)) < 0) - giterr_set(GITERR_OS, "Could not write to '%s'", stream->path); - - return ret; -} - -static int checkout_stream_close(git_writestream *s) -{ - struct checkout_stream *stream = (struct checkout_stream *)s; - assert(stream && stream->open); - - stream->open = 0; - return p_close(stream->fd); -} - -static void checkout_stream_free(git_writestream *s) -{ - GIT_UNUSED(s); -} - -static int blob_content_to_file( - checkout_data *data, - struct stat *st, - git_blob *blob, - const char *path, - const char *hint_path, - mode_t entry_filemode) -{ - int flags = data->opts.file_open_flags; - mode_t file_mode = data->opts.file_mode ? - data->opts.file_mode : entry_filemode; - git_filter_options filter_opts = GIT_FILTER_OPTIONS_INIT; - struct checkout_stream writer; - mode_t mode; - git_filter_list *fl = NULL; - int fd; - int error = 0; - - if (hint_path == NULL) - hint_path = path; - - if ((error = mkpath2file(data, path, data->opts.dir_mode)) < 0) - return error; - - if (flags <= 0) - flags = O_CREAT | O_TRUNC | O_WRONLY; - if (!(mode = file_mode)) - mode = GIT_FILEMODE_BLOB; - - if ((fd = p_open(path, flags, mode)) < 0) { - giterr_set(GITERR_OS, "Could not open '%s' for writing", path); - return fd; - } - - filter_opts.attr_session = &data->attr_session; - filter_opts.temp_buf = &data->tmp; - - if (!data->opts.disable_filters && - (error = git_filter_list__load_ext( - &fl, data->repo, blob, hint_path, - GIT_FILTER_TO_WORKTREE, &filter_opts))) - return error; - - /* setup the writer */ - memset(&writer, 0, sizeof(struct checkout_stream)); - writer.base.write = checkout_stream_write; - writer.base.close = checkout_stream_close; - writer.base.free = checkout_stream_free; - writer.path = path; - writer.fd = fd; - writer.open = 1; - - error = git_filter_list_stream_blob(fl, blob, &writer.base); - - assert(writer.open == 0); - - git_filter_list_free(fl); - - if (error < 0) - return error; - - if (GIT_PERMS_IS_EXEC(mode)) { - data->perfdata.chmod_calls++; - - if ((error = p_chmod(path, mode)) < 0) { - giterr_set(GITERR_OS, "Failed to set permissions on '%s'", path); - return error; - } - } - - if (st) { - data->perfdata.stat_calls++; - - if ((error = p_stat(path, st)) < 0) { - giterr_set(GITERR_OS, "Error statting '%s'", path); - return error; - } - - st->st_mode = entry_filemode; - } - - return 0; -} - -static int blob_content_to_link( - checkout_data *data, - struct stat *st, - git_blob *blob, - const char *path) -{ - git_buf linktarget = GIT_BUF_INIT; - int error; - - if ((error = mkpath2file(data, path, data->opts.dir_mode)) < 0) - return error; - - if ((error = git_blob__getbuf(&linktarget, blob)) < 0) - return error; - - if (data->can_symlink) { - if ((error = p_symlink(git_buf_cstr(&linktarget), path)) < 0) - giterr_set(GITERR_OS, "Could not create symlink %s", path); - } else { - error = git_futils_fake_symlink(git_buf_cstr(&linktarget), path); - } - - if (!error) { - data->perfdata.stat_calls++; - - if ((error = p_lstat(path, st)) < 0) - giterr_set(GITERR_CHECKOUT, "Could not stat symlink %s", path); - - st->st_mode = GIT_FILEMODE_LINK; - } - - git_buf_free(&linktarget); - - return error; -} - -static int checkout_update_index( - checkout_data *data, - const git_diff_file *file, - struct stat *st) -{ - git_index_entry entry; - - if (!data->index) - return 0; - - memset(&entry, 0, sizeof(entry)); - entry.path = (char *)file->path; /* cast to prevent warning */ - git_index_entry__init_from_stat(&entry, st, true); - git_oid_cpy(&entry.id, &file->id); - - return git_index_add(data->index, &entry); -} - -static int checkout_submodule_update_index( - checkout_data *data, - const git_diff_file *file) -{ - struct stat st; - - /* update the index unless prevented */ - if ((data->strategy & GIT_CHECKOUT_DONT_UPDATE_INDEX) != 0) - return 0; - - git_buf_truncate(&data->path, data->workdir_len); - if (git_buf_puts(&data->path, file->path) < 0) - return -1; - - data->perfdata.stat_calls++; - if (p_stat(git_buf_cstr(&data->path), &st) < 0) { - giterr_set( - GITERR_CHECKOUT, "Could not stat submodule %s\n", file->path); - return GIT_ENOTFOUND; - } - - st.st_mode = GIT_FILEMODE_COMMIT; - - return checkout_update_index(data, file, &st); -} - -static int checkout_submodule( - checkout_data *data, - const git_diff_file *file) -{ - bool remove_existing = should_remove_existing(data); - int error = 0; - - /* Until submodules are supported, UPDATE_ONLY means do nothing here */ - if ((data->strategy & GIT_CHECKOUT_UPDATE_ONLY) != 0) - return 0; - - if ((error = checkout_mkdir( - data, - file->path, data->opts.target_directory, data->opts.dir_mode, - remove_existing ? MKDIR_REMOVE_EXISTING : MKDIR_NORMAL)) < 0) - return error; - - if ((error = git_submodule_lookup(NULL, data->repo, file->path)) < 0) { - /* I've observed repos with submodules in the tree that do not - * have a .gitmodules - core Git just makes an empty directory - */ - if (error == GIT_ENOTFOUND) { - giterr_clear(); - return checkout_submodule_update_index(data, file); - } - - return error; - } - - /* TODO: Support checkout_strategy options. Two circumstances: - * 1 - submodule already checked out, but we need to move the HEAD - * to the new OID, or - * 2 - submodule not checked out and we should recursively check it out - * - * Checkout will not execute a pull on the submodule, but a clone - * command should probably be able to. Do we need a submodule callback? - */ - - return checkout_submodule_update_index(data, file); -} - -static void report_progress( - checkout_data *data, - const char *path) -{ - if (data->opts.progress_cb) - data->opts.progress_cb( - path, data->completed_steps, data->total_steps, - data->opts.progress_payload); -} - -static int checkout_safe_for_update_only( - checkout_data *data, const char *path, mode_t expected_mode) -{ - struct stat st; - - data->perfdata.stat_calls++; - - if (p_lstat(path, &st) < 0) { - /* if doesn't exist, then no error and no update */ - if (errno == ENOENT || errno == ENOTDIR) - return 0; - - /* otherwise, stat error and no update */ - giterr_set(GITERR_OS, "Failed to stat file '%s'", path); - return -1; - } - - /* only safe for update if this is the same type of file */ - if ((st.st_mode & ~0777) == (expected_mode & ~0777)) - return 1; - - return 0; -} - -static int checkout_write_content( - checkout_data *data, - const git_oid *oid, - const char *full_path, - const char *hint_path, - unsigned int mode, - struct stat *st) -{ - int error = 0; - git_blob *blob; - - if ((error = git_blob_lookup(&blob, data->repo, oid)) < 0) - return error; - - if (S_ISLNK(mode)) - error = blob_content_to_link(data, st, blob, full_path); - else - error = blob_content_to_file(data, st, blob, full_path, hint_path, mode); - - git_blob_free(blob); - - /* if we try to create the blob and an existing directory blocks it from - * being written, then there must have been a typechange conflict in a - * parent directory - suppress the error and try to continue. - */ - if ((data->strategy & GIT_CHECKOUT_ALLOW_CONFLICTS) != 0 && - (error == GIT_ENOTFOUND || error == GIT_EEXISTS)) - { - giterr_clear(); - error = 0; - } - - return error; -} - -static int checkout_blob( - checkout_data *data, - const git_diff_file *file) -{ - int error = 0; - struct stat st; - - git_buf_truncate(&data->path, data->workdir_len); - if (git_buf_puts(&data->path, file->path) < 0) - return -1; - - if ((data->strategy & GIT_CHECKOUT_UPDATE_ONLY) != 0) { - int rval = checkout_safe_for_update_only( - data, git_buf_cstr(&data->path), file->mode); - if (rval <= 0) - return rval; - } - - error = checkout_write_content( - data, &file->id, git_buf_cstr(&data->path), NULL, file->mode, &st); - - /* update the index unless prevented */ - if (!error && (data->strategy & GIT_CHECKOUT_DONT_UPDATE_INDEX) == 0) - error = checkout_update_index(data, file, &st); - - /* update the submodule data if this was a new .gitmodules file */ - if (!error && strcmp(file->path, ".gitmodules") == 0) - data->reload_submodules = true; - - return error; -} - -static int checkout_remove_the_old( - unsigned int *actions, - checkout_data *data) -{ - int error = 0; - git_diff_delta *delta; - const char *str; - size_t i; - const char *workdir = git_buf_cstr(&data->path); - uint32_t flg = GIT_RMDIR_EMPTY_PARENTS | - GIT_RMDIR_REMOVE_FILES | GIT_RMDIR_REMOVE_BLOCKERS; - - if (data->opts.checkout_strategy & GIT_CHECKOUT_SKIP_LOCKED_DIRECTORIES) - flg |= GIT_RMDIR_SKIP_NONEMPTY; - - git_buf_truncate(&data->path, data->workdir_len); - - git_vector_foreach(&data->diff->deltas, i, delta) { - if (actions[i] & CHECKOUT_ACTION__REMOVE) { - error = git_futils_rmdir_r(delta->old_file.path, workdir, flg); - if (error < 0) - return error; - - data->completed_steps++; - report_progress(data, delta->old_file.path); - - if ((actions[i] & CHECKOUT_ACTION__UPDATE_BLOB) == 0 && - (data->strategy & GIT_CHECKOUT_DONT_UPDATE_INDEX) == 0 && - data->index != NULL) - { - (void)git_index_remove(data->index, delta->old_file.path, 0); - } - } - } - - git_vector_foreach(&data->removes, i, str) { - error = git_futils_rmdir_r(str, workdir, flg); - if (error < 0) - return error; - - data->completed_steps++; - report_progress(data, str); - - if ((data->strategy & GIT_CHECKOUT_DONT_UPDATE_INDEX) == 0 && - data->index != NULL) - { - if (str[strlen(str) - 1] == '/') - (void)git_index_remove_directory(data->index, str, 0); - else - (void)git_index_remove(data->index, str, 0); - } - } - - return 0; -} - -static int checkout_deferred_remove(git_repository *repo, const char *path) -{ -#if 0 - int error = git_futils_rmdir_r( - path, data->opts.target_directory, GIT_RMDIR_EMPTY_PARENTS); - - if (error == GIT_ENOTFOUND) { - error = 0; - giterr_clear(); - } - - return error; -#else - GIT_UNUSED(repo); - GIT_UNUSED(path); - assert(false); - return 0; -#endif -} - -static int checkout_create_the_new( - unsigned int *actions, - checkout_data *data) -{ - int error = 0; - git_diff_delta *delta; - size_t i; - - git_vector_foreach(&data->diff->deltas, i, delta) { - if (actions[i] & CHECKOUT_ACTION__DEFER_REMOVE) { - /* this had a blocker directory that should only be removed iff - * all of the contents of the directory were safely removed - */ - if ((error = checkout_deferred_remove( - data->repo, delta->old_file.path)) < 0) - return error; - } - - if (actions[i] & CHECKOUT_ACTION__UPDATE_BLOB) { - error = checkout_blob(data, &delta->new_file); - if (error < 0) - return error; - - data->completed_steps++; - report_progress(data, delta->new_file.path); - } - } - - return 0; -} - -static int checkout_create_submodules( - unsigned int *actions, - checkout_data *data) -{ - int error = 0; - git_diff_delta *delta; - size_t i; - - git_vector_foreach(&data->diff->deltas, i, delta) { - if (actions[i] & CHECKOUT_ACTION__DEFER_REMOVE) { - /* this has a blocker directory that should only be removed iff - * all of the contents of the directory were safely removed - */ - if ((error = checkout_deferred_remove( - data->repo, delta->old_file.path)) < 0) - return error; - } - - if (actions[i] & CHECKOUT_ACTION__UPDATE_SUBMODULE) { - int error = checkout_submodule(data, &delta->new_file); - if (error < 0) - return error; - - data->completed_steps++; - report_progress(data, delta->new_file.path); - } - } - - return 0; -} - -static int checkout_lookup_head_tree(git_tree **out, git_repository *repo) -{ - int error = 0; - git_reference *ref = NULL; - git_object *head; - - if (!(error = git_repository_head(&ref, repo)) && - !(error = git_reference_peel(&head, ref, GIT_OBJ_TREE))) - *out = (git_tree *)head; - - git_reference_free(ref); - - return error; -} - - -static int conflict_entry_name( - git_buf *out, - const char *side_name, - const char *filename) -{ - if (git_buf_puts(out, side_name) < 0 || - git_buf_putc(out, ':') < 0 || - git_buf_puts(out, filename) < 0) - return -1; - - return 0; -} - -static int checkout_path_suffixed(git_buf *path, const char *suffix) -{ - size_t path_len; - int i = 0, error = 0; - - if ((error = git_buf_putc(path, '~')) < 0 || (error = git_buf_puts(path, suffix)) < 0) - return -1; - - path_len = git_buf_len(path); - - while (git_path_exists(git_buf_cstr(path)) && i < INT_MAX) { - git_buf_truncate(path, path_len); - - if ((error = git_buf_putc(path, '_')) < 0 || - (error = git_buf_printf(path, "%d", i)) < 0) - return error; - - i++; - } - - if (i == INT_MAX) { - git_buf_truncate(path, path_len); - - giterr_set(GITERR_CHECKOUT, "Could not write '%s': working directory file exists", path); - return GIT_EEXISTS; - } - - return 0; -} - -static int checkout_write_entry( - checkout_data *data, - checkout_conflictdata *conflict, - const git_index_entry *side) -{ - const char *hint_path = NULL, *suffix; - struct stat st; - int error; - - assert (side == conflict->ours || side == conflict->theirs); - - git_buf_truncate(&data->path, data->workdir_len); - if (git_buf_puts(&data->path, side->path) < 0) - return -1; - - if ((conflict->name_collision || conflict->directoryfile) && - (data->strategy & GIT_CHECKOUT_USE_OURS) == 0 && - (data->strategy & GIT_CHECKOUT_USE_THEIRS) == 0) { - - if (side == conflict->ours) - suffix = data->opts.our_label ? data->opts.our_label : - "ours"; - else - suffix = data->opts.their_label ? data->opts.their_label : - "theirs"; - - if (checkout_path_suffixed(&data->path, suffix) < 0) - return -1; - - hint_path = side->path; - } - - if ((data->strategy & GIT_CHECKOUT_UPDATE_ONLY) != 0 && - (error = checkout_safe_for_update_only(data, git_buf_cstr(&data->path), side->mode)) <= 0) - return error; - - return checkout_write_content(data, - &side->id, git_buf_cstr(&data->path), hint_path, side->mode, &st); -} - -static int checkout_write_entries( - checkout_data *data, - checkout_conflictdata *conflict) -{ - int error = 0; - - if ((error = checkout_write_entry(data, conflict, conflict->ours)) >= 0) - error = checkout_write_entry(data, conflict, conflict->theirs); - - return error; -} - -static int checkout_merge_path( - git_buf *out, - checkout_data *data, - checkout_conflictdata *conflict, - git_merge_file_result *result) -{ - const char *our_label_raw, *their_label_raw, *suffix; - int error = 0; - - if ((error = git_buf_joinpath(out, git_repository_workdir(data->repo), result->path)) < 0) - return error; - - /* Most conflicts simply use the filename in the index */ - if (!conflict->name_collision) - return 0; - - /* Rename 2->1 conflicts need the branch name appended */ - our_label_raw = data->opts.our_label ? data->opts.our_label : "ours"; - their_label_raw = data->opts.their_label ? data->opts.their_label : "theirs"; - suffix = strcmp(result->path, conflict->ours->path) == 0 ? our_label_raw : their_label_raw; - - if ((error = checkout_path_suffixed(out, suffix)) < 0) - return error; - - return 0; -} - -static int checkout_write_merge( - checkout_data *data, - checkout_conflictdata *conflict) -{ - git_buf our_label = GIT_BUF_INIT, their_label = GIT_BUF_INIT, - path_suffixed = GIT_BUF_INIT, path_workdir = GIT_BUF_INIT, - in_data = GIT_BUF_INIT, out_data = GIT_BUF_INIT; - git_merge_file_options opts = GIT_MERGE_FILE_OPTIONS_INIT; - git_merge_file_result result = {0}; - git_filebuf output = GIT_FILEBUF_INIT; - git_filter_list *fl = NULL; - git_filter_options filter_opts = GIT_FILTER_OPTIONS_INIT; - int error = 0; - - if (data->opts.checkout_strategy & GIT_CHECKOUT_CONFLICT_STYLE_DIFF3) - opts.flags |= GIT_MERGE_FILE_STYLE_DIFF3; - - opts.ancestor_label = data->opts.ancestor_label ? - data->opts.ancestor_label : "ancestor"; - opts.our_label = data->opts.our_label ? - data->opts.our_label : "ours"; - opts.their_label = data->opts.their_label ? - data->opts.their_label : "theirs"; - - /* If all the paths are identical, decorate the diff3 file with the branch - * names. Otherwise, append branch_name:path. - */ - if (conflict->ours && conflict->theirs && - strcmp(conflict->ours->path, conflict->theirs->path) != 0) { - - if ((error = conflict_entry_name( - &our_label, opts.our_label, conflict->ours->path)) < 0 || - (error = conflict_entry_name( - &their_label, opts.their_label, conflict->theirs->path)) < 0) - goto done; - - opts.our_label = git_buf_cstr(&our_label); - opts.their_label = git_buf_cstr(&their_label); - } - - if ((error = git_merge_file_from_index(&result, data->repo, - conflict->ancestor, conflict->ours, conflict->theirs, &opts)) < 0) - goto done; - - if (result.path == NULL || result.mode == 0) { - giterr_set(GITERR_CHECKOUT, "Could not merge contents of file"); - error = GIT_ECONFLICT; - goto done; - } - - if ((error = checkout_merge_path(&path_workdir, data, conflict, &result)) < 0) - goto done; - - if ((data->strategy & GIT_CHECKOUT_UPDATE_ONLY) != 0 && - (error = checkout_safe_for_update_only(data, git_buf_cstr(&path_workdir), result.mode)) <= 0) - goto done; - - if (!data->opts.disable_filters) { - in_data.ptr = (char *)result.ptr; - in_data.size = result.len; - - filter_opts.attr_session = &data->attr_session; - filter_opts.temp_buf = &data->tmp; - - if ((error = git_filter_list__load_ext( - &fl, data->repo, NULL, git_buf_cstr(&path_workdir), - GIT_FILTER_TO_WORKTREE, &filter_opts)) < 0 || - (error = git_filter_list_apply_to_data(&out_data, fl, &in_data)) < 0) - goto done; - } else { - out_data.ptr = (char *)result.ptr; - out_data.size = result.len; - } - - if ((error = mkpath2file(data, path_workdir.ptr, data->opts.dir_mode)) < 0 || - (error = git_filebuf_open(&output, git_buf_cstr(&path_workdir), GIT_FILEBUF_DO_NOT_BUFFER, result.mode)) < 0 || - (error = git_filebuf_write(&output, out_data.ptr, out_data.size)) < 0 || - (error = git_filebuf_commit(&output)) < 0) - goto done; - -done: - git_filter_list_free(fl); - - git_buf_free(&out_data); - git_buf_free(&our_label); - git_buf_free(&their_label); - - git_merge_file_result_free(&result); - git_buf_free(&path_workdir); - git_buf_free(&path_suffixed); - - return error; -} - -static int checkout_conflict_add( - checkout_data *data, - const git_index_entry *conflict) -{ - int error = git_index_remove(data->index, conflict->path, 0); - - if (error == GIT_ENOTFOUND) - giterr_clear(); - else if (error < 0) - return error; - - return git_index_add(data->index, conflict); -} - -static int checkout_conflict_update_index( - checkout_data *data, - checkout_conflictdata *conflict) -{ - int error = 0; - - if (conflict->ancestor) - error = checkout_conflict_add(data, conflict->ancestor); - - if (!error && conflict->ours) - error = checkout_conflict_add(data, conflict->ours); - - if (!error && conflict->theirs) - error = checkout_conflict_add(data, conflict->theirs); - - return error; -} - -static int checkout_create_conflicts(checkout_data *data) -{ - checkout_conflictdata *conflict; - size_t i; - int error = 0; - - git_vector_foreach(&data->update_conflicts, i, conflict) { - - /* Both deleted: nothing to do */ - if (conflict->ours == NULL && conflict->theirs == NULL) - error = 0; - - else if ((data->strategy & GIT_CHECKOUT_USE_OURS) && - conflict->ours) - error = checkout_write_entry(data, conflict, conflict->ours); - else if ((data->strategy & GIT_CHECKOUT_USE_THEIRS) && - conflict->theirs) - error = checkout_write_entry(data, conflict, conflict->theirs); - - /* Ignore the other side of name collisions. */ - else if ((data->strategy & GIT_CHECKOUT_USE_OURS) && - !conflict->ours && conflict->name_collision) - error = 0; - else if ((data->strategy & GIT_CHECKOUT_USE_THEIRS) && - !conflict->theirs && conflict->name_collision) - error = 0; - - /* For modify/delete, name collisions and d/f conflicts, write - * the file (potentially with the name mangled. - */ - else if (conflict->ours != NULL && conflict->theirs == NULL) - error = checkout_write_entry(data, conflict, conflict->ours); - else if (conflict->ours == NULL && conflict->theirs != NULL) - error = checkout_write_entry(data, conflict, conflict->theirs); - - /* Add/add conflicts and rename 1->2 conflicts, write the - * ours/theirs sides (potentially name mangled). - */ - else if (conflict->one_to_two) - error = checkout_write_entries(data, conflict); - - /* If all sides are links, write the ours side */ - else if (S_ISLNK(conflict->ours->mode) && - S_ISLNK(conflict->theirs->mode)) - error = checkout_write_entry(data, conflict, conflict->ours); - /* Link/file conflicts, write the file side */ - else if (S_ISLNK(conflict->ours->mode)) - error = checkout_write_entry(data, conflict, conflict->theirs); - else if (S_ISLNK(conflict->theirs->mode)) - error = checkout_write_entry(data, conflict, conflict->ours); - - /* If any side is a gitlink, do nothing. */ - else if (conflict->submodule) - error = 0; - - /* If any side is binary, write the ours side */ - else if (conflict->binary) - error = checkout_write_entry(data, conflict, conflict->ours); - - else if (!error) - error = checkout_write_merge(data, conflict); - - /* Update the index extensions (REUC and NAME) if we're checking - * out a different index. (Otherwise just leave them there.) - */ - if (!error && (data->strategy & GIT_CHECKOUT_DONT_UPDATE_INDEX) == 0) - error = checkout_conflict_update_index(data, conflict); - - if (error) - break; - - data->completed_steps++; - report_progress(data, - conflict->ours ? conflict->ours->path : - (conflict->theirs ? conflict->theirs->path : conflict->ancestor->path)); - } - - return error; -} - -static int checkout_remove_conflicts(checkout_data *data) -{ - const char *conflict; - size_t i; - - git_vector_foreach(&data->remove_conflicts, i, conflict) { - if (git_index_conflict_remove(data->index, conflict) < 0) - return -1; - - data->completed_steps++; - } - - return 0; -} - -static int checkout_extensions_update_index(checkout_data *data) -{ - const git_index_reuc_entry *reuc_entry; - const git_index_name_entry *name_entry; - size_t i; - int error = 0; - - if ((data->strategy & GIT_CHECKOUT_UPDATE_ONLY) != 0) - return 0; - - if (data->update_reuc) { - git_vector_foreach(data->update_reuc, i, reuc_entry) { - if ((error = git_index_reuc_add(data->index, reuc_entry->path, - reuc_entry->mode[0], &reuc_entry->oid[0], - reuc_entry->mode[1], &reuc_entry->oid[1], - reuc_entry->mode[2], &reuc_entry->oid[2])) < 0) - goto done; - } - } - - if (data->update_names) { - git_vector_foreach(data->update_names, i, name_entry) { - if ((error = git_index_name_add(data->index, name_entry->ancestor, - name_entry->ours, name_entry->theirs)) < 0) - goto done; - } - } - -done: - return error; -} - -static void checkout_data_clear(checkout_data *data) -{ - if (data->opts_free_baseline) { - git_tree_free(data->opts.baseline); - data->opts.baseline = NULL; - } - - git_vector_free(&data->removes); - git_pool_clear(&data->pool); - - git_vector_free_deep(&data->remove_conflicts); - git_vector_free_deep(&data->update_conflicts); - - git__free(data->pfx); - data->pfx = NULL; - - git_strmap_free(data->mkdir_map); - - git_buf_free(&data->path); - git_buf_free(&data->tmp); - - git_index_free(data->index); - data->index = NULL; - - git_strmap_free(data->mkdir_map); - - git_attr_session__free(&data->attr_session); -} - -static int checkout_data_init( - checkout_data *data, - git_iterator *target, - const git_checkout_options *proposed) -{ - int error = 0; - git_repository *repo = git_iterator_owner(target); - - memset(data, 0, sizeof(*data)); - - if (!repo) { - giterr_set(GITERR_CHECKOUT, "Cannot checkout nothing"); - return -1; - } - - if ((!proposed || !proposed->target_directory) && - (error = git_repository__ensure_not_bare(repo, "checkout")) < 0) - return error; - - data->repo = repo; - data->target = target; - - GITERR_CHECK_VERSION( - proposed, GIT_CHECKOUT_OPTIONS_VERSION, "git_checkout_options"); - - if (!proposed) - GIT_INIT_STRUCTURE(&data->opts, GIT_CHECKOUT_OPTIONS_VERSION); - else - memmove(&data->opts, proposed, sizeof(git_checkout_options)); - - if (!data->opts.target_directory) - data->opts.target_directory = git_repository_workdir(repo); - else if (!git_path_isdir(data->opts.target_directory) && - (error = checkout_mkdir(data, - data->opts.target_directory, NULL, - GIT_DIR_MODE, GIT_MKDIR_VERIFY_DIR)) < 0) - goto cleanup; - - /* refresh config and index content unless NO_REFRESH is given */ - if ((data->opts.checkout_strategy & GIT_CHECKOUT_NO_REFRESH) == 0) { - git_config *cfg; - - if ((error = git_repository_config__weakptr(&cfg, repo)) < 0) - goto cleanup; - - /* Get the repository index and reload it (unless we're checking - * out the index; then it has the changes we're trying to check - * out and those should not be overwritten.) - */ - if ((error = git_repository_index(&data->index, data->repo)) < 0) - goto cleanup; - - if (data->index != git_iterator_get_index(target)) { - if ((error = git_index_read(data->index, true)) < 0) - goto cleanup; - - /* cannot checkout if unresolved conflicts exist */ - if ((data->opts.checkout_strategy & GIT_CHECKOUT_FORCE) == 0 && - git_index_has_conflicts(data->index)) { - error = GIT_ECONFLICT; - giterr_set(GITERR_CHECKOUT, - "unresolved conflicts exist in the index"); - goto cleanup; - } - - /* clean conflict data in the current index */ - git_index_name_clear(data->index); - git_index_reuc_clear(data->index); - } - } - - /* if you are forcing, allow all safe updates, plus recreate missing */ - if ((data->opts.checkout_strategy & GIT_CHECKOUT_FORCE) != 0) - data->opts.checkout_strategy |= GIT_CHECKOUT_SAFE | - GIT_CHECKOUT_RECREATE_MISSING; - - /* if the repository does not actually have an index file, then this - * is an initial checkout (perhaps from clone), so we allow safe updates - */ - if (!data->index->on_disk && - (data->opts.checkout_strategy & GIT_CHECKOUT_SAFE) != 0) - data->opts.checkout_strategy |= GIT_CHECKOUT_RECREATE_MISSING; - - data->strategy = data->opts.checkout_strategy; - - /* opts->disable_filters is false by default */ - - if (!data->opts.dir_mode) - data->opts.dir_mode = GIT_DIR_MODE; - - if (!data->opts.file_open_flags) - data->opts.file_open_flags = O_CREAT | O_TRUNC | O_WRONLY; - - data->pfx = git_pathspec_prefix(&data->opts.paths); - - if ((error = git_repository__cvar( - &data->can_symlink, repo, GIT_CVAR_SYMLINKS)) < 0) - goto cleanup; - - if (!data->opts.baseline && !data->opts.baseline_index) { - data->opts_free_baseline = true; - - error = checkout_lookup_head_tree(&data->opts.baseline, repo); - - if (error == GIT_EUNBORNBRANCH) { - error = 0; - giterr_clear(); - } - - if (error < 0) - goto cleanup; - } - - if ((data->opts.checkout_strategy & - (GIT_CHECKOUT_CONFLICT_STYLE_MERGE | GIT_CHECKOUT_CONFLICT_STYLE_DIFF3)) == 0) { - git_config_entry *conflict_style = NULL; - git_config *cfg = NULL; - - if ((error = git_repository_config__weakptr(&cfg, repo)) < 0 || - (error = git_config_get_entry(&conflict_style, cfg, "merge.conflictstyle")) < 0 || - error == GIT_ENOTFOUND) - ; - else if (error) - goto cleanup; - else if (strcmp(conflict_style->value, "merge") == 0) - data->opts.checkout_strategy |= GIT_CHECKOUT_CONFLICT_STYLE_MERGE; - else if (strcmp(conflict_style->value, "diff3") == 0) - data->opts.checkout_strategy |= GIT_CHECKOUT_CONFLICT_STYLE_DIFF3; - else { - giterr_set(GITERR_CHECKOUT, "unknown style '%s' given for 'merge.conflictstyle'", - conflict_style); - error = -1; - git_config_entry_free(conflict_style); - goto cleanup; - } - git_config_entry_free(conflict_style); - } - - if ((error = git_vector_init(&data->removes, 0, git__strcmp_cb)) < 0 || - (error = git_vector_init(&data->remove_conflicts, 0, NULL)) < 0 || - (error = git_vector_init(&data->update_conflicts, 0, NULL)) < 0 || - (error = git_pool_init(&data->pool, 1, 0)) < 0 || - (error = git_buf_puts(&data->path, data->opts.target_directory)) < 0 || - (error = git_path_to_dir(&data->path)) < 0 || - (error = git_strmap_alloc(&data->mkdir_map)) < 0) - goto cleanup; - - data->workdir_len = git_buf_len(&data->path); - - git_attr_session__init(&data->attr_session, data->repo); - -cleanup: - if (error < 0) - checkout_data_clear(data); - - return error; -} - -#define CHECKOUT_INDEX_DONT_WRITE_MASK \ - (GIT_CHECKOUT_DONT_UPDATE_INDEX | GIT_CHECKOUT_DONT_WRITE_INDEX) - -int git_checkout_iterator( - git_iterator *target, - git_index *index, - const git_checkout_options *opts) -{ - int error = 0; - git_iterator *baseline = NULL, *workdir = NULL; - checkout_data data = {0}; - git_diff_options diff_opts = GIT_DIFF_OPTIONS_INIT; - uint32_t *actions = NULL; - size_t *counts = NULL; - git_iterator_flag_t iterflags = 0; - - /* initialize structures and options */ - error = checkout_data_init(&data, target, opts); - if (error < 0) - return error; - - diff_opts.flags = - GIT_DIFF_INCLUDE_UNMODIFIED | - GIT_DIFF_INCLUDE_UNREADABLE | - GIT_DIFF_INCLUDE_UNTRACKED | - GIT_DIFF_RECURSE_UNTRACKED_DIRS | /* needed to match baseline */ - GIT_DIFF_INCLUDE_IGNORED | - GIT_DIFF_INCLUDE_TYPECHANGE | - GIT_DIFF_INCLUDE_TYPECHANGE_TREES | - GIT_DIFF_SKIP_BINARY_CHECK | - GIT_DIFF_INCLUDE_CASECHANGE; - if (data.opts.checkout_strategy & GIT_CHECKOUT_DISABLE_PATHSPEC_MATCH) - diff_opts.flags |= GIT_DIFF_DISABLE_PATHSPEC_MATCH; - if (data.opts.paths.count > 0) - diff_opts.pathspec = data.opts.paths; - - /* set up iterators */ - - iterflags = git_iterator_ignore_case(target) ? - GIT_ITERATOR_IGNORE_CASE : GIT_ITERATOR_DONT_IGNORE_CASE; - - if ((error = git_iterator_reset(target, data.pfx, data.pfx)) < 0 || - (error = git_iterator_for_workdir_ext( - &workdir, data.repo, data.opts.target_directory, index, NULL, - iterflags | GIT_ITERATOR_DONT_AUTOEXPAND, - data.pfx, data.pfx)) < 0) - goto cleanup; - - if (data.opts.baseline_index) { - if ((error = git_iterator_for_index( - &baseline, data.opts.baseline_index, - iterflags, data.pfx, data.pfx)) < 0) - goto cleanup; - } else { - if ((error = git_iterator_for_tree( - &baseline, data.opts.baseline, - iterflags, data.pfx, data.pfx)) < 0) - goto cleanup; - } - - /* Should not have case insensitivity mismatch */ - assert(git_iterator_ignore_case(workdir) == git_iterator_ignore_case(baseline)); - - /* Generate baseline-to-target diff which will include an entry for - * every possible update that might need to be made. - */ - if ((error = git_diff__from_iterators( - &data.diff, data.repo, baseline, target, &diff_opts)) < 0) - goto cleanup; - - /* Loop through diff (and working directory iterator) building a list of - * actions to be taken, plus look for conflicts and send notifications, - * then loop through conflicts. - */ - if ((error = checkout_get_actions(&actions, &counts, &data, workdir)) != 0) - goto cleanup; - - data.total_steps = counts[CHECKOUT_ACTION__REMOVE] + - counts[CHECKOUT_ACTION__REMOVE_CONFLICT] + - counts[CHECKOUT_ACTION__UPDATE_BLOB] + - counts[CHECKOUT_ACTION__UPDATE_SUBMODULE] + - counts[CHECKOUT_ACTION__UPDATE_CONFLICT]; - - report_progress(&data, NULL); /* establish 0 baseline */ - - /* To deal with some order dependencies, perform remaining checkout - * in three passes: removes, then update blobs, then update submodules. - */ - if (counts[CHECKOUT_ACTION__REMOVE] > 0 && - (error = checkout_remove_the_old(actions, &data)) < 0) - goto cleanup; - - if (counts[CHECKOUT_ACTION__REMOVE_CONFLICT] > 0 && - (error = checkout_remove_conflicts(&data)) < 0) - goto cleanup; - - if (counts[CHECKOUT_ACTION__UPDATE_BLOB] > 0 && - (error = checkout_create_the_new(actions, &data)) < 0) - goto cleanup; - - if (counts[CHECKOUT_ACTION__UPDATE_SUBMODULE] > 0 && - (error = checkout_create_submodules(actions, &data)) < 0) - goto cleanup; - - if (counts[CHECKOUT_ACTION__UPDATE_CONFLICT] > 0 && - (error = checkout_create_conflicts(&data)) < 0) - goto cleanup; - - if (data.index != git_iterator_get_index(target) && - (error = checkout_extensions_update_index(&data)) < 0) - goto cleanup; - - assert(data.completed_steps == data.total_steps); - - if (data.opts.perfdata_cb) - data.opts.perfdata_cb(&data.perfdata, data.opts.perfdata_payload); - -cleanup: - if (!error && data.index != NULL && - (data.strategy & CHECKOUT_INDEX_DONT_WRITE_MASK) == 0) - error = git_index_write(data.index); - - git_diff_free(data.diff); - git_iterator_free(workdir); - git_iterator_free(baseline); - git__free(actions); - git__free(counts); - checkout_data_clear(&data); - - return error; -} - -int git_checkout_index( - git_repository *repo, - git_index *index, - const git_checkout_options *opts) -{ - int error, owned = 0; - git_iterator *index_i; - - if (!index && !repo) { - giterr_set(GITERR_CHECKOUT, - "Must provide either repository or index to checkout"); - return -1; - } - - if (index && repo && - git_index_owner(index) && - git_index_owner(index) != repo) { - giterr_set(GITERR_CHECKOUT, - "Index to checkout does not match repository"); - return -1; - } else if(index && repo && !git_index_owner(index)) { - GIT_REFCOUNT_OWN(index, repo); - owned = 1; - } - - if (!repo) - repo = git_index_owner(index); - - if (!index && (error = git_repository_index__weakptr(&index, repo)) < 0) - return error; - GIT_REFCOUNT_INC(index); - - if (!(error = git_iterator_for_index(&index_i, index, 0, NULL, NULL))) - error = git_checkout_iterator(index_i, index, opts); - - if (owned) - GIT_REFCOUNT_OWN(index, NULL); - - git_iterator_free(index_i); - git_index_free(index); - - return error; -} - -int git_checkout_tree( - git_repository *repo, - const git_object *treeish, - const git_checkout_options *opts) -{ - int error; - git_index *index; - git_tree *tree = NULL; - git_iterator *tree_i = NULL; - - if (!treeish && !repo) { - giterr_set(GITERR_CHECKOUT, - "Must provide either repository or tree to checkout"); - return -1; - } - if (treeish && repo && git_object_owner(treeish) != repo) { - giterr_set(GITERR_CHECKOUT, - "Object to checkout does not match repository"); - return -1; - } - - if (!repo) - repo = git_object_owner(treeish); - - if (treeish) { - if (git_object_peel((git_object **)&tree, treeish, GIT_OBJ_TREE) < 0) { - giterr_set( - GITERR_CHECKOUT, "Provided object cannot be peeled to a tree"); - return -1; - } - } - else { - if ((error = checkout_lookup_head_tree(&tree, repo)) < 0) { - if (error != GIT_EUNBORNBRANCH) - giterr_set( - GITERR_CHECKOUT, - "HEAD could not be peeled to a tree and no treeish given"); - return error; - } - } - - if ((error = git_repository_index(&index, repo)) < 0) - return error; - - if (!(error = git_iterator_for_tree(&tree_i, tree, 0, NULL, NULL))) - error = git_checkout_iterator(tree_i, index, opts); - - git_iterator_free(tree_i); - git_index_free(index); - git_tree_free(tree); - - return error; -} - -int git_checkout_head( - git_repository *repo, - const git_checkout_options *opts) -{ - assert(repo); - return git_checkout_tree(repo, NULL, opts); -} - -int git_checkout_init_options(git_checkout_options *opts, unsigned int version) -{ - GIT_INIT_STRUCTURE_FROM_TEMPLATE( - opts, version, git_checkout_options, GIT_CHECKOUT_OPTIONS_INIT); - return 0; -} diff --git a/vendor/libgit2/src/checkout.h b/vendor/libgit2/src/checkout.h deleted file mode 100644 index 60aa29b268..0000000000 --- a/vendor/libgit2/src/checkout.h +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_checkout_h__ -#define INCLUDE_checkout_h__ - -#include "git2/checkout.h" -#include "iterator.h" - -#define GIT_CHECKOUT__NOTIFY_CONFLICT_TREE (1u << 12) - -/** - * Update the working directory to match the target iterator. The - * expected baseline value can be passed in via the checkout options - * or else will default to the HEAD commit. - */ -extern int git_checkout_iterator( - git_iterator *target, - git_index *index, - const git_checkout_options *opts); - -#endif diff --git a/vendor/libgit2/src/cherrypick.c b/vendor/libgit2/src/cherrypick.c deleted file mode 100644 index c92975194b..0000000000 --- a/vendor/libgit2/src/cherrypick.c +++ /dev/null @@ -1,229 +0,0 @@ -/* -* Copyright (C) the libgit2 contributors. All rights reserved. -* -* This file is part of libgit2, distributed under the GNU GPL v2 with -* a Linking Exception. For full terms see the included COPYING file. -*/ - -#include "common.h" -#include "repository.h" -#include "filebuf.h" -#include "merge.h" -#include "vector.h" -#include "index.h" - -#include "git2/types.h" -#include "git2/merge.h" -#include "git2/cherrypick.h" -#include "git2/commit.h" -#include "git2/sys/commit.h" - -#define GIT_CHERRYPICK_FILE_MODE 0666 - -static int write_cherrypick_head( - git_repository *repo, - const char *commit_oidstr) -{ - git_filebuf file = GIT_FILEBUF_INIT; - git_buf file_path = GIT_BUF_INIT; - int error = 0; - - if ((error = git_buf_joinpath(&file_path, repo->path_repository, GIT_CHERRYPICK_HEAD_FILE)) >= 0 && - (error = git_filebuf_open(&file, file_path.ptr, GIT_FILEBUF_FORCE, GIT_CHERRYPICK_FILE_MODE)) >= 0 && - (error = git_filebuf_printf(&file, "%s\n", commit_oidstr)) >= 0) - error = git_filebuf_commit(&file); - - if (error < 0) - git_filebuf_cleanup(&file); - - git_buf_free(&file_path); - - return error; -} - -static int write_merge_msg( - git_repository *repo, - const char *commit_msg) -{ - git_filebuf file = GIT_FILEBUF_INIT; - git_buf file_path = GIT_BUF_INIT; - int error = 0; - - if ((error = git_buf_joinpath(&file_path, repo->path_repository, GIT_MERGE_MSG_FILE)) < 0 || - (error = git_filebuf_open(&file, file_path.ptr, GIT_FILEBUF_FORCE, GIT_CHERRYPICK_FILE_MODE)) < 0 || - (error = git_filebuf_printf(&file, "%s", commit_msg)) < 0) - goto cleanup; - - error = git_filebuf_commit(&file); - -cleanup: - if (error < 0) - git_filebuf_cleanup(&file); - - git_buf_free(&file_path); - - return error; -} - -static int cherrypick_normalize_opts( - git_repository *repo, - git_cherrypick_options *opts, - const git_cherrypick_options *given, - const char *their_label) -{ - int error = 0; - unsigned int default_checkout_strategy = GIT_CHECKOUT_SAFE | - GIT_CHECKOUT_ALLOW_CONFLICTS; - - GIT_UNUSED(repo); - - if (given != NULL) - memcpy(opts, given, sizeof(git_cherrypick_options)); - else { - git_cherrypick_options default_opts = GIT_CHERRYPICK_OPTIONS_INIT; - memcpy(opts, &default_opts, sizeof(git_cherrypick_options)); - } - - if (!opts->checkout_opts.checkout_strategy) - opts->checkout_opts.checkout_strategy = default_checkout_strategy; - - if (!opts->checkout_opts.our_label) - opts->checkout_opts.our_label = "HEAD"; - - if (!opts->checkout_opts.their_label) - opts->checkout_opts.their_label = their_label; - - return error; -} - -static int cherrypick_state_cleanup(git_repository *repo) -{ - const char *state_files[] = { GIT_CHERRYPICK_HEAD_FILE, GIT_MERGE_MSG_FILE }; - - return git_repository__cleanup_files(repo, state_files, ARRAY_SIZE(state_files)); -} - -static int cherrypick_seterr(git_commit *commit, const char *fmt) -{ - char commit_oidstr[GIT_OID_HEXSZ + 1]; - - giterr_set(GITERR_CHERRYPICK, fmt, - git_oid_tostr(commit_oidstr, GIT_OID_HEXSZ + 1, git_commit_id(commit))); - - return -1; -} - -int git_cherrypick_commit( - git_index **out, - git_repository *repo, - git_commit *cherrypick_commit, - git_commit *our_commit, - unsigned int mainline, - const git_merge_options *merge_opts) -{ - git_commit *parent_commit = NULL; - git_tree *parent_tree = NULL, *our_tree = NULL, *cherrypick_tree = NULL; - int parent = 0, error = 0; - - assert(out && repo && cherrypick_commit && our_commit); - - if (git_commit_parentcount(cherrypick_commit) > 1) { - if (!mainline) - return cherrypick_seterr(cherrypick_commit, - "Mainline branch is not specified but %s is a merge commit"); - - parent = mainline; - } else { - if (mainline) - return cherrypick_seterr(cherrypick_commit, - "Mainline branch specified but %s is not a merge commit"); - - parent = git_commit_parentcount(cherrypick_commit); - } - - if (parent && - ((error = git_commit_parent(&parent_commit, cherrypick_commit, (parent - 1))) < 0 || - (error = git_commit_tree(&parent_tree, parent_commit)) < 0)) - goto done; - - if ((error = git_commit_tree(&cherrypick_tree, cherrypick_commit)) < 0 || - (error = git_commit_tree(&our_tree, our_commit)) < 0) - goto done; - - error = git_merge_trees(out, repo, parent_tree, our_tree, cherrypick_tree, merge_opts); - -done: - git_tree_free(parent_tree); - git_tree_free(our_tree); - git_tree_free(cherrypick_tree); - git_commit_free(parent_commit); - - return error; -} - -int git_cherrypick( - git_repository *repo, - git_commit *commit, - const git_cherrypick_options *given_opts) -{ - git_cherrypick_options opts; - git_reference *our_ref = NULL; - git_commit *our_commit = NULL; - char commit_oidstr[GIT_OID_HEXSZ + 1]; - const char *commit_msg, *commit_summary; - git_buf their_label = GIT_BUF_INIT; - git_index *index = NULL; - git_indexwriter indexwriter = GIT_INDEXWRITER_INIT; - int error = 0; - - assert(repo && commit); - - GITERR_CHECK_VERSION(given_opts, GIT_CHERRYPICK_OPTIONS_VERSION, "git_cherrypick_options"); - - if ((error = git_repository__ensure_not_bare(repo, "cherry-pick")) < 0) - return error; - - if ((commit_msg = git_commit_message(commit)) == NULL || - (commit_summary = git_commit_summary(commit)) == NULL) { - error = -1; - goto on_error; - } - - git_oid_nfmt(commit_oidstr, sizeof(commit_oidstr), git_commit_id(commit)); - - if ((error = write_merge_msg(repo, commit_msg)) < 0 || - (error = git_buf_printf(&their_label, "%.7s... %s", commit_oidstr, commit_summary)) < 0 || - (error = cherrypick_normalize_opts(repo, &opts, given_opts, git_buf_cstr(&their_label))) < 0 || - (error = git_indexwriter_init_for_operation(&indexwriter, repo, &opts.checkout_opts.checkout_strategy)) < 0 || - (error = write_cherrypick_head(repo, commit_oidstr)) < 0 || - (error = git_repository_head(&our_ref, repo)) < 0 || - (error = git_reference_peel((git_object **)&our_commit, our_ref, GIT_OBJ_COMMIT)) < 0 || - (error = git_cherrypick_commit(&index, repo, commit, our_commit, opts.mainline, &opts.merge_opts)) < 0 || - (error = git_merge__check_result(repo, index)) < 0 || - (error = git_merge__append_conflicts_to_merge_msg(repo, index)) < 0 || - (error = git_checkout_index(repo, index, &opts.checkout_opts)) < 0 || - (error = git_indexwriter_commit(&indexwriter)) < 0) - goto on_error; - - goto done; - -on_error: - cherrypick_state_cleanup(repo); - -done: - git_indexwriter_cleanup(&indexwriter); - git_index_free(index); - git_commit_free(our_commit); - git_reference_free(our_ref); - git_buf_free(&their_label); - - return error; -} - -int git_cherrypick_init_options( - git_cherrypick_options *opts, unsigned int version) -{ - GIT_INIT_STRUCTURE_FROM_TEMPLATE( - opts, version, git_cherrypick_options, GIT_CHERRYPICK_OPTIONS_INIT); - return 0; -} diff --git a/vendor/libgit2/src/clone.c b/vendor/libgit2/src/clone.c deleted file mode 100644 index 070daf94dd..0000000000 --- a/vendor/libgit2/src/clone.c +++ /dev/null @@ -1,566 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#include - -#include "git2/clone.h" -#include "git2/remote.h" -#include "git2/revparse.h" -#include "git2/branch.h" -#include "git2/config.h" -#include "git2/checkout.h" -#include "git2/commit.h" -#include "git2/tree.h" - -#include "common.h" -#include "remote.h" -#include "fileops.h" -#include "refs.h" -#include "path.h" -#include "repository.h" -#include "odb.h" - -static int clone_local_into(git_repository *repo, git_remote *remote, const git_fetch_options *fetch_opts, const git_checkout_options *co_opts, const char *branch, int link); - -static int create_branch( - git_reference **branch, - git_repository *repo, - const git_oid *target, - const char *name, - const char *log_message) -{ - git_commit *head_obj = NULL; - git_reference *branch_ref = NULL; - git_buf refname = GIT_BUF_INIT; - int error; - - /* Find the target commit */ - if ((error = git_commit_lookup(&head_obj, repo, target)) < 0) - return error; - - /* Create the new branch */ - if ((error = git_buf_printf(&refname, GIT_REFS_HEADS_DIR "%s", name)) < 0) - return error; - - error = git_reference_create(&branch_ref, repo, git_buf_cstr(&refname), target, 0, log_message); - git_buf_free(&refname); - git_commit_free(head_obj); - - if (!error) - *branch = branch_ref; - else - git_reference_free(branch_ref); - - return error; -} - -static int setup_tracking_config( - git_repository *repo, - const char *branch_name, - const char *remote_name, - const char *merge_target) -{ - git_config *cfg; - git_buf remote_key = GIT_BUF_INIT, merge_key = GIT_BUF_INIT; - int error = -1; - - if (git_repository_config__weakptr(&cfg, repo) < 0) - return -1; - - if (git_buf_printf(&remote_key, "branch.%s.remote", branch_name) < 0) - goto cleanup; - - if (git_buf_printf(&merge_key, "branch.%s.merge", branch_name) < 0) - goto cleanup; - - if (git_config_set_string(cfg, git_buf_cstr(&remote_key), remote_name) < 0) - goto cleanup; - - if (git_config_set_string(cfg, git_buf_cstr(&merge_key), merge_target) < 0) - goto cleanup; - - error = 0; - -cleanup: - git_buf_free(&remote_key); - git_buf_free(&merge_key); - return error; -} - -static int create_tracking_branch( - git_reference **branch, - git_repository *repo, - const git_oid *target, - const char *branch_name, - const char *log_message) -{ - int error; - - if ((error = create_branch(branch, repo, target, branch_name, log_message)) < 0) - return error; - - return setup_tracking_config( - repo, - branch_name, - GIT_REMOTE_ORIGIN, - git_reference_name(*branch)); -} - -static int update_head_to_new_branch( - git_repository *repo, - const git_oid *target, - const char *name, - const char *reflog_message) -{ - git_reference *tracking_branch = NULL; - int error; - - if (!git__prefixcmp(name, GIT_REFS_HEADS_DIR)) - name += strlen(GIT_REFS_HEADS_DIR); - - error = create_tracking_branch(&tracking_branch, repo, target, name, - reflog_message); - - if (!error) - error = git_repository_set_head( - repo, git_reference_name(tracking_branch)); - - git_reference_free(tracking_branch); - - /* if it already existed, then the user's refspec created it for us, ignore it' */ - if (error == GIT_EEXISTS) - error = 0; - - return error; -} - -static int update_head_to_remote( - git_repository *repo, - git_remote *remote, - const char *reflog_message) -{ - int error = 0; - size_t refs_len; - git_refspec *refspec; - const git_remote_head *remote_head, **refs; - const git_oid *remote_head_id; - git_buf remote_master_name = GIT_BUF_INIT; - git_buf branch = GIT_BUF_INIT; - - if ((error = git_remote_ls(&refs, &refs_len, remote)) < 0) - return error; - - /* We cloned an empty repository or one with an unborn HEAD */ - if (refs_len == 0 || strcmp(refs[0]->name, GIT_HEAD_FILE)) - return setup_tracking_config( - repo, "master", GIT_REMOTE_ORIGIN, GIT_REFS_HEADS_MASTER_FILE); - - /* We know we have HEAD, let's see where it points */ - remote_head = refs[0]; - assert(remote_head); - - remote_head_id = &remote_head->oid; - - error = git_remote_default_branch(&branch, remote); - if (error == GIT_ENOTFOUND) { - error = git_repository_set_head_detached( - repo, remote_head_id); - goto cleanup; - } - - refspec = git_remote__matching_refspec(remote, git_buf_cstr(&branch)); - - if (refspec == NULL) { - giterr_set(GITERR_NET, "the remote's default branch does not fit the refspec configuration"); - error = GIT_EINVALIDSPEC; - goto cleanup; - } - - /* Determine the remote tracking reference name from the local master */ - if ((error = git_refspec_transform( - &remote_master_name, - refspec, - git_buf_cstr(&branch))) < 0) - goto cleanup; - - error = update_head_to_new_branch( - repo, - remote_head_id, - git_buf_cstr(&branch), - reflog_message); - -cleanup: - git_buf_free(&remote_master_name); - git_buf_free(&branch); - - return error; -} - -static int update_head_to_branch( - git_repository *repo, - const char *remote_name, - const char *branch, - const char *reflog_message) -{ - int retcode; - git_buf remote_branch_name = GIT_BUF_INIT; - git_reference* remote_ref = NULL; - - assert(remote_name && branch); - - if ((retcode = git_buf_printf(&remote_branch_name, GIT_REFS_REMOTES_DIR "%s/%s", - remote_name, branch)) < 0 ) - goto cleanup; - - if ((retcode = git_reference_lookup(&remote_ref, repo, git_buf_cstr(&remote_branch_name))) < 0) - goto cleanup; - - retcode = update_head_to_new_branch(repo, git_reference_target(remote_ref), branch, - reflog_message); - -cleanup: - git_reference_free(remote_ref); - git_buf_free(&remote_branch_name); - return retcode; -} - -static int default_repository_create(git_repository **out, const char *path, int bare, void *payload) -{ - GIT_UNUSED(payload); - - return git_repository_init(out, path, bare); -} - -static int default_remote_create( - git_remote **out, - git_repository *repo, - const char *name, - const char *url, - void *payload) -{ - GIT_UNUSED(payload); - - return git_remote_create(out, repo, name, url); -} - -/* - * submodules? - */ - -static int create_and_configure_origin( - git_remote **out, - git_repository *repo, - const char *url, - const git_clone_options *options) -{ - int error; - git_remote *origin = NULL; - char buf[GIT_PATH_MAX]; - git_remote_create_cb remote_create = options->remote_cb; - void *payload = options->remote_cb_payload; - - /* If the path exists and is a dir, the url should be the absolute path */ - if (git_path_root(url) < 0 && git_path_exists(url) && git_path_isdir(url)) { - if (p_realpath(url, buf) == NULL) - return -1; - - url = buf; - } - - if (!remote_create) { - remote_create = default_remote_create; - payload = NULL; - } - - if ((error = remote_create(&origin, repo, "origin", url, payload)) < 0) - goto on_error; - - *out = origin; - return 0; - -on_error: - git_remote_free(origin); - return error; -} - -static bool should_checkout( - git_repository *repo, - bool is_bare, - const git_checkout_options *opts) -{ - if (is_bare) - return false; - - if (!opts) - return false; - - if (opts->checkout_strategy == GIT_CHECKOUT_NONE) - return false; - - return !git_repository_head_unborn(repo); -} - -static int checkout_branch(git_repository *repo, git_remote *remote, const git_checkout_options *co_opts, const char *branch, const char *reflog_message) -{ - int error; - - if (branch) - error = update_head_to_branch(repo, git_remote_name(remote), branch, - reflog_message); - /* Point HEAD to the same ref as the remote's head */ - else - error = update_head_to_remote(repo, remote, reflog_message); - - if (!error && should_checkout(repo, git_repository_is_bare(repo), co_opts)) - error = git_checkout_head(repo, co_opts); - - return error; -} - -static int clone_into(git_repository *repo, git_remote *_remote, const git_fetch_options *opts, const git_checkout_options *co_opts, const char *branch) -{ - int error; - git_buf reflog_message = GIT_BUF_INIT; - git_fetch_options fetch_opts; - git_remote *remote; - - assert(repo && _remote); - - if (!git_repository_is_empty(repo)) { - giterr_set(GITERR_INVALID, "the repository is not empty"); - return -1; - } - - if ((error = git_remote_dup(&remote, _remote)) < 0) - return error; - - memcpy(&fetch_opts, opts, sizeof(git_fetch_options)); - fetch_opts.update_fetchhead = 0; - fetch_opts.download_tags = GIT_REMOTE_DOWNLOAD_TAGS_ALL; - git_buf_printf(&reflog_message, "clone: from %s", git_remote_url(remote)); - - if ((error = git_remote_fetch(remote, NULL, &fetch_opts, git_buf_cstr(&reflog_message))) != 0) - goto cleanup; - - error = checkout_branch(repo, remote, co_opts, branch, git_buf_cstr(&reflog_message)); - -cleanup: - git_remote_free(remote); - git_buf_free(&reflog_message); - - return error; -} - -int git_clone__should_clone_local(const char *url_or_path, git_clone_local_t local) -{ - git_buf fromurl = GIT_BUF_INIT; - const char *path = url_or_path; - bool is_url, is_local; - - if (local == GIT_CLONE_NO_LOCAL) - return 0; - - if ((is_url = git_path_is_local_file_url(url_or_path)) != 0) { - if (git_path_fromurl(&fromurl, url_or_path) < 0) { - is_local = -1; - goto done; - } - - path = fromurl.ptr; - } - - is_local = (!is_url || local != GIT_CLONE_LOCAL_AUTO) && - git_path_isdir(path); - -done: - git_buf_free(&fromurl); - return is_local; -} - -int git_clone( - git_repository **out, - const char *url, - const char *local_path, - const git_clone_options *_options) -{ - int error = 0; - git_repository *repo = NULL; - git_remote *origin; - git_clone_options options = GIT_CLONE_OPTIONS_INIT; - uint32_t rmdir_flags = GIT_RMDIR_REMOVE_FILES; - git_repository_create_cb repository_cb; - - assert(out && url && local_path); - - if (_options) - memcpy(&options, _options, sizeof(git_clone_options)); - - GITERR_CHECK_VERSION(&options, GIT_CLONE_OPTIONS_VERSION, "git_clone_options"); - - /* Only clone to a new directory or an empty directory */ - if (git_path_exists(local_path) && !git_path_is_empty_dir(local_path)) { - giterr_set(GITERR_INVALID, - "'%s' exists and is not an empty directory", local_path); - return GIT_EEXISTS; - } - - /* Only remove the root directory on failure if we create it */ - if (git_path_exists(local_path)) - rmdir_flags |= GIT_RMDIR_SKIP_ROOT; - - if (options.repository_cb) - repository_cb = options.repository_cb; - else - repository_cb = default_repository_create; - - if ((error = repository_cb(&repo, local_path, options.bare, options.repository_cb_payload)) < 0) - return error; - - if (!(error = create_and_configure_origin(&origin, repo, url, &options))) { - int clone_local = git_clone__should_clone_local(url, options.local); - int link = options.local != GIT_CLONE_LOCAL_NO_LINKS; - - if (clone_local == 1) - error = clone_local_into( - repo, origin, &options.fetch_opts, &options.checkout_opts, - options.checkout_branch, link); - else if (clone_local == 0) - error = clone_into( - repo, origin, &options.fetch_opts, &options.checkout_opts, - options.checkout_branch); - else - error = -1; - - git_remote_free(origin); - } - - if (error != 0) { - git_error_state last_error = {0}; - giterr_capture(&last_error, error); - - git_repository_free(repo); - repo = NULL; - - (void)git_futils_rmdir_r(local_path, NULL, rmdir_flags); - - giterr_restore(&last_error); - } - - *out = repo; - return error; -} - -int git_clone_init_options(git_clone_options *opts, unsigned int version) -{ - GIT_INIT_STRUCTURE_FROM_TEMPLATE( - opts, version, git_clone_options, GIT_CLONE_OPTIONS_INIT); - return 0; -} - -static const char *repository_base(git_repository *repo) -{ - if (git_repository_is_bare(repo)) - return git_repository_path(repo); - - return git_repository_workdir(repo); -} - -static bool can_link(const char *src, const char *dst, int link) -{ -#ifdef GIT_WIN32 - GIT_UNUSED(src); - GIT_UNUSED(dst); - GIT_UNUSED(link); - return false; -#else - - struct stat st_src, st_dst; - - if (!link) - return false; - - if (p_stat(src, &st_src) < 0) - return false; - - if (p_stat(dst, &st_dst) < 0) - return false; - - return st_src.st_dev == st_dst.st_dev; -#endif -} - -static int clone_local_into(git_repository *repo, git_remote *remote, const git_fetch_options *fetch_opts, const git_checkout_options *co_opts, const char *branch, int link) -{ - int error, flags; - git_repository *src; - git_buf src_odb = GIT_BUF_INIT, dst_odb = GIT_BUF_INIT, src_path = GIT_BUF_INIT; - git_buf reflog_message = GIT_BUF_INIT; - - assert(repo && remote); - - if (!git_repository_is_empty(repo)) { - giterr_set(GITERR_INVALID, "the repository is not empty"); - return -1; - } - - /* - * Let's figure out what path we should use for the source - * repo, if it's not rooted, the path should be relative to - * the repository's worktree/gitdir. - */ - if ((error = git_path_from_url_or_path(&src_path, git_remote_url(remote))) < 0) - return error; - - /* Copy .git/objects/ from the source to the target */ - if ((error = git_repository_open(&src, git_buf_cstr(&src_path))) < 0) { - git_buf_free(&src_path); - return error; - } - - git_buf_joinpath(&src_odb, git_repository_path(src), GIT_OBJECTS_DIR); - git_buf_joinpath(&dst_odb, git_repository_path(repo), GIT_OBJECTS_DIR); - if (git_buf_oom(&src_odb) || git_buf_oom(&dst_odb)) { - error = -1; - goto cleanup; - } - - flags = 0; - if (can_link(git_repository_path(src), git_repository_path(repo), link)) - flags |= GIT_CPDIR_LINK_FILES; - - error = git_futils_cp_r(git_buf_cstr(&src_odb), git_buf_cstr(&dst_odb), - flags, GIT_OBJECT_DIR_MODE); - - /* - * can_link() doesn't catch all variations, so if we hit an - * error and did want to link, let's try again without trying - * to link. - */ - if (error < 0 && link) { - flags &= ~GIT_CPDIR_LINK_FILES; - error = git_futils_cp_r(git_buf_cstr(&src_odb), git_buf_cstr(&dst_odb), - flags, GIT_OBJECT_DIR_MODE); - } - - if (error < 0) - goto cleanup; - - git_buf_printf(&reflog_message, "clone: from %s", git_remote_url(remote)); - - if ((error = git_remote_fetch(remote, NULL, fetch_opts, git_buf_cstr(&reflog_message))) != 0) - goto cleanup; - - error = checkout_branch(repo, remote, co_opts, branch, git_buf_cstr(&reflog_message)); - -cleanup: - git_buf_free(&reflog_message); - git_buf_free(&src_path); - git_buf_free(&src_odb); - git_buf_free(&dst_odb); - git_repository_free(src); - return error; -} diff --git a/vendor/libgit2/src/clone.h b/vendor/libgit2/src/clone.h deleted file mode 100644 index 14ca5d44c6..0000000000 --- a/vendor/libgit2/src/clone.h +++ /dev/null @@ -1,12 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_clone_h__ -#define INCLUDE_clone_h__ - -extern int git_clone__should_clone_local(const char *url, git_clone_local_t local); - -#endif diff --git a/vendor/libgit2/src/commit.c b/vendor/libgit2/src/commit.c deleted file mode 100644 index 616f947dbb..0000000000 --- a/vendor/libgit2/src/commit.c +++ /dev/null @@ -1,575 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#include "git2/common.h" -#include "git2/object.h" -#include "git2/repository.h" -#include "git2/signature.h" -#include "git2/sys/commit.h" - -#include "common.h" -#include "odb.h" -#include "commit.h" -#include "signature.h" -#include "message.h" -#include "refs.h" - -void git_commit__free(void *_commit) -{ - git_commit *commit = _commit; - - git_array_clear(commit->parent_ids); - - git_signature_free(commit->author); - git_signature_free(commit->committer); - - git__free(commit->raw_header); - git__free(commit->raw_message); - git__free(commit->message_encoding); - git__free(commit->summary); - - git__free(commit); -} - -int git_commit_create_from_callback( - git_oid *id, - git_repository *repo, - const char *update_ref, - const git_signature *author, - const git_signature *committer, - const char *message_encoding, - const char *message, - const git_oid *tree, - git_commit_parent_callback parent_cb, - void *parent_payload) -{ - git_reference *ref = NULL; - int error = 0, matched_parent = 0; - const git_oid *current_id = NULL; - git_buf commit = GIT_BUF_INIT; - size_t i = 0; - git_odb *odb; - const git_oid *parent; - - assert(id && repo && tree && parent_cb); - - if (update_ref) { - error = git_reference_lookup_resolved(&ref, repo, update_ref, 10); - if (error < 0 && error != GIT_ENOTFOUND) - return error; - } - giterr_clear(); - - if (ref) - current_id = git_reference_target(ref); - - git_oid__writebuf(&commit, "tree ", tree); - - while ((parent = parent_cb(i, parent_payload)) != NULL) { - git_oid__writebuf(&commit, "parent ", parent); - if (i == 0 && current_id && git_oid_equal(current_id, parent)) - matched_parent = 1; - i++; - } - - if (ref && !matched_parent) { - git_reference_free(ref); - git_buf_free(&commit); - giterr_set(GITERR_OBJECT, "failed to create commit: current tip is not the first parent"); - return GIT_EMODIFIED; - } - - git_signature__writebuf(&commit, "author ", author); - git_signature__writebuf(&commit, "committer ", committer); - - if (message_encoding != NULL) - git_buf_printf(&commit, "encoding %s\n", message_encoding); - - git_buf_putc(&commit, '\n'); - - if (git_buf_puts(&commit, message) < 0) - goto on_error; - - if (git_repository_odb__weakptr(&odb, repo) < 0) - goto on_error; - - if (git_odb_write(id, odb, commit.ptr, commit.size, GIT_OBJ_COMMIT) < 0) - goto on_error; - - git_buf_free(&commit); - - if (update_ref != NULL) { - error = git_reference__update_for_commit( - repo, ref, update_ref, id, "commit"); - git_reference_free(ref); - return error; - } - - return 0; - -on_error: - git_buf_free(&commit); - giterr_set(GITERR_OBJECT, "Failed to create commit."); - return -1; -} - -typedef struct { - size_t total; - va_list args; -} commit_parent_varargs; - -static const git_oid *commit_parent_from_varargs(size_t curr, void *payload) -{ - commit_parent_varargs *data = payload; - const git_commit *commit; - if (curr >= data->total) - return NULL; - commit = va_arg(data->args, const git_commit *); - return commit ? git_commit_id(commit) : NULL; -} - -int git_commit_create_v( - git_oid *id, - git_repository *repo, - const char *update_ref, - const git_signature *author, - const git_signature *committer, - const char *message_encoding, - const char *message, - const git_tree *tree, - size_t parent_count, - ...) -{ - int error = 0; - commit_parent_varargs data; - - assert(tree && git_tree_owner(tree) == repo); - - data.total = parent_count; - va_start(data.args, parent_count); - - error = git_commit_create_from_callback( - id, repo, update_ref, author, committer, - message_encoding, message, git_tree_id(tree), - commit_parent_from_varargs, &data); - - va_end(data.args); - return error; -} - -typedef struct { - size_t total; - const git_oid **parents; -} commit_parent_oids; - -static const git_oid *commit_parent_from_ids(size_t curr, void *payload) -{ - commit_parent_oids *data = payload; - return (curr < data->total) ? data->parents[curr] : NULL; -} - -int git_commit_create_from_ids( - git_oid *id, - git_repository *repo, - const char *update_ref, - const git_signature *author, - const git_signature *committer, - const char *message_encoding, - const char *message, - const git_oid *tree, - size_t parent_count, - const git_oid *parents[]) -{ - commit_parent_oids data = { parent_count, parents }; - - return git_commit_create_from_callback( - id, repo, update_ref, author, committer, - message_encoding, message, tree, - commit_parent_from_ids, &data); -} - -typedef struct { - size_t total; - const git_commit **parents; - git_repository *repo; -} commit_parent_data; - -static const git_oid *commit_parent_from_array(size_t curr, void *payload) -{ - commit_parent_data *data = payload; - const git_commit *commit; - if (curr >= data->total) - return NULL; - commit = data->parents[curr]; - if (git_commit_owner(commit) != data->repo) - return NULL; - return git_commit_id(commit); -} - -int git_commit_create( - git_oid *id, - git_repository *repo, - const char *update_ref, - const git_signature *author, - const git_signature *committer, - const char *message_encoding, - const char *message, - const git_tree *tree, - size_t parent_count, - const git_commit *parents[]) -{ - commit_parent_data data = { parent_count, parents, repo }; - - assert(tree && git_tree_owner(tree) == repo); - - return git_commit_create_from_callback( - id, repo, update_ref, author, committer, - message_encoding, message, git_tree_id(tree), - commit_parent_from_array, &data); -} - -static const git_oid *commit_parent_for_amend(size_t curr, void *payload) -{ - const git_commit *commit_to_amend = payload; - if (curr >= git_array_size(commit_to_amend->parent_ids)) - return NULL; - return git_array_get(commit_to_amend->parent_ids, curr); -} - -int git_commit_amend( - git_oid *id, - const git_commit *commit_to_amend, - const char *update_ref, - const git_signature *author, - const git_signature *committer, - const char *message_encoding, - const char *message, - const git_tree *tree) -{ - git_repository *repo; - git_oid tree_id; - git_reference *ref; - int error; - - assert(id && commit_to_amend); - - repo = git_commit_owner(commit_to_amend); - - if (!author) - author = git_commit_author(commit_to_amend); - if (!committer) - committer = git_commit_committer(commit_to_amend); - if (!message_encoding) - message_encoding = git_commit_message_encoding(commit_to_amend); - if (!message) - message = git_commit_message(commit_to_amend); - - if (!tree) { - git_tree *old_tree; - GITERR_CHECK_ERROR( git_commit_tree(&old_tree, commit_to_amend) ); - git_oid_cpy(&tree_id, git_tree_id(old_tree)); - git_tree_free(old_tree); - } else { - assert(git_tree_owner(tree) == repo); - git_oid_cpy(&tree_id, git_tree_id(tree)); - } - - if (update_ref) { - if ((error = git_reference_lookup_resolved(&ref, repo, update_ref, 5)) < 0) - return error; - - if (git_oid_cmp(git_commit_id(commit_to_amend), git_reference_target(ref))) { - git_reference_free(ref); - giterr_set(GITERR_REFERENCE, "commit to amend is not the tip of the given branch"); - return -1; - } - } - - error = git_commit_create_from_callback( - id, repo, NULL, author, committer, message_encoding, message, - &tree_id, commit_parent_for_amend, (void *)commit_to_amend); - - if (!error && update_ref) { - error = git_reference__update_for_commit( - repo, ref, NULL, id, "commit"); - git_reference_free(ref); - } - - return error; -} - -int git_commit__parse(void *_commit, git_odb_object *odb_obj) -{ - git_commit *commit = _commit; - const char *buffer_start = git_odb_object_data(odb_obj), *buffer; - const char *buffer_end = buffer_start + git_odb_object_size(odb_obj); - git_oid parent_id; - size_t header_len; - git_signature dummy_sig; - - buffer = buffer_start; - - /* Allocate for one, which will allow not to realloc 90% of the time */ - git_array_init_to_size(commit->parent_ids, 1); - GITERR_CHECK_ARRAY(commit->parent_ids); - - /* The tree is always the first field */ - if (git_oid__parse(&commit->tree_id, &buffer, buffer_end, "tree ") < 0) - goto bad_buffer; - - /* - * TODO: commit grafts! - */ - - while (git_oid__parse(&parent_id, &buffer, buffer_end, "parent ") == 0) { - git_oid *new_id = git_array_alloc(commit->parent_ids); - GITERR_CHECK_ALLOC(new_id); - - git_oid_cpy(new_id, &parent_id); - } - - commit->author = git__malloc(sizeof(git_signature)); - GITERR_CHECK_ALLOC(commit->author); - - if (git_signature__parse(commit->author, &buffer, buffer_end, "author ", '\n') < 0) - return -1; - - /* Some tools create multiple author fields, ignore the extra ones */ - while ((size_t)(buffer_end - buffer) >= strlen("author ") && !git__prefixcmp(buffer, "author ")) { - if (git_signature__parse(&dummy_sig, &buffer, buffer_end, "author ", '\n') < 0) - return -1; - - git__free(dummy_sig.name); - git__free(dummy_sig.email); - } - - /* Always parse the committer; we need the commit time */ - commit->committer = git__malloc(sizeof(git_signature)); - GITERR_CHECK_ALLOC(commit->committer); - - if (git_signature__parse(commit->committer, &buffer, buffer_end, "committer ", '\n') < 0) - return -1; - - /* Parse add'l header entries */ - while (buffer < buffer_end) { - const char *eoln = buffer; - if (buffer[-1] == '\n' && buffer[0] == '\n') - break; - - while (eoln < buffer_end && *eoln != '\n') - ++eoln; - - if (git__prefixcmp(buffer, "encoding ") == 0) { - buffer += strlen("encoding "); - - commit->message_encoding = git__strndup(buffer, eoln - buffer); - GITERR_CHECK_ALLOC(commit->message_encoding); - } - - if (eoln < buffer_end && *eoln == '\n') - ++eoln; - buffer = eoln; - } - - header_len = buffer - buffer_start; - commit->raw_header = git__strndup(buffer_start, header_len); - GITERR_CHECK_ALLOC(commit->raw_header); - - /* point "buffer" to data after header, +1 for the final LF */ - buffer = buffer_start + header_len + 1; - - /* extract commit message */ - if (buffer <= buffer_end) { - commit->raw_message = git__strndup(buffer, buffer_end - buffer); - GITERR_CHECK_ALLOC(commit->raw_message); - } - - return 0; - -bad_buffer: - giterr_set(GITERR_OBJECT, "Failed to parse bad commit object"); - return -1; -} - -#define GIT_COMMIT_GETTER(_rvalue, _name, _return) \ - _rvalue git_commit_##_name(const git_commit *commit) \ - {\ - assert(commit); \ - return _return; \ - } - -GIT_COMMIT_GETTER(const git_signature *, author, commit->author) -GIT_COMMIT_GETTER(const git_signature *, committer, commit->committer) -GIT_COMMIT_GETTER(const char *, message_raw, commit->raw_message) -GIT_COMMIT_GETTER(const char *, message_encoding, commit->message_encoding) -GIT_COMMIT_GETTER(const char *, raw_header, commit->raw_header) -GIT_COMMIT_GETTER(git_time_t, time, commit->committer->when.time) -GIT_COMMIT_GETTER(int, time_offset, commit->committer->when.offset) -GIT_COMMIT_GETTER(unsigned int, parentcount, (unsigned int)git_array_size(commit->parent_ids)) -GIT_COMMIT_GETTER(const git_oid *, tree_id, &commit->tree_id) - -const char *git_commit_message(const git_commit *commit) -{ - const char *message; - - assert(commit); - - message = commit->raw_message; - - /* trim leading newlines from raw message */ - while (*message && *message == '\n') - ++message; - - return message; -} - -const char *git_commit_summary(git_commit *commit) -{ - git_buf summary = GIT_BUF_INIT; - const char *msg, *space; - - assert(commit); - - if (!commit->summary) { - for (msg = git_commit_message(commit), space = NULL; *msg; ++msg) { - if (msg[0] == '\n' && (!msg[1] || msg[1] == '\n')) - break; - else if (msg[0] == '\n') - git_buf_putc(&summary, ' '); - else if (git__isspace(msg[0])) - space = space ? space : msg; - else if (space) { - git_buf_put(&summary, space, (msg - space) + 1); - space = NULL; - } else - git_buf_putc(&summary, *msg); - } - - commit->summary = git_buf_detach(&summary); - if (!commit->summary) - commit->summary = git__strdup(""); - } - - return commit->summary; -} - -int git_commit_tree(git_tree **tree_out, const git_commit *commit) -{ - assert(commit); - return git_tree_lookup(tree_out, commit->object.repo, &commit->tree_id); -} - -const git_oid *git_commit_parent_id( - const git_commit *commit, unsigned int n) -{ - assert(commit); - - return git_array_get(commit->parent_ids, n); -} - -int git_commit_parent( - git_commit **parent, const git_commit *commit, unsigned int n) -{ - const git_oid *parent_id; - assert(commit); - - parent_id = git_commit_parent_id(commit, n); - if (parent_id == NULL) { - giterr_set(GITERR_INVALID, "Parent %u does not exist", n); - return GIT_ENOTFOUND; - } - - return git_commit_lookup(parent, commit->object.repo, parent_id); -} - -int git_commit_nth_gen_ancestor( - git_commit **ancestor, - const git_commit *commit, - unsigned int n) -{ - git_commit *current, *parent = NULL; - int error; - - assert(ancestor && commit); - - if (git_object_dup((git_object **) ¤t, (git_object *) commit) < 0) - return -1; - - if (n == 0) { - *ancestor = current; - return 0; - } - - while (n--) { - error = git_commit_parent(&parent, current, 0); - - git_commit_free(current); - - if (error < 0) - return error; - - current = parent; - } - - *ancestor = parent; - return 0; -} - -int git_commit_header_field(git_buf *out, const git_commit *commit, const char *field) -{ - const char *buf = commit->raw_header; - const char *h, *eol; - - git_buf_sanitize(out); - while ((h = strchr(buf, '\n')) && h[1] != '\0' && h[1] != '\n') { - h++; - if (git__prefixcmp(h, field)) { - buf = h; - continue; - } - - h += strlen(field); - eol = strchr(h, '\n'); - if (h[0] != ' ') { - buf = h; - continue; - } - if (!eol) - goto malformed; - - h++; /* skip the SP */ - - git_buf_put(out, h, eol - h); - if (git_buf_oom(out)) - goto oom; - - /* If the next line starts with SP, it's multi-line, we must continue */ - while (eol[1] == ' ') { - git_buf_putc(out, '\n'); - h = eol + 2; - eol = strchr(h, '\n'); - if (!eol) - goto malformed; - - git_buf_put(out, h, eol - h); - } - - if (git_buf_oom(out)) - goto oom; - - return 0; - } - - return GIT_ENOTFOUND; - -malformed: - giterr_set(GITERR_OBJECT, "malformed header"); - return -1; -oom: - giterr_set_oom(); - return -1; -} diff --git a/vendor/libgit2/src/commit.h b/vendor/libgit2/src/commit.h deleted file mode 100644 index efb080b502..0000000000 --- a/vendor/libgit2/src/commit.h +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_commit_h__ -#define INCLUDE_commit_h__ - -#include "git2/commit.h" -#include "tree.h" -#include "repository.h" -#include "array.h" - -#include - -struct git_commit { - git_object object; - - git_array_t(git_oid) parent_ids; - git_oid tree_id; - - git_signature *author; - git_signature *committer; - - char *message_encoding; - char *raw_message; - char *raw_header; - - char *summary; -}; - -void git_commit__free(void *commit); -int git_commit__parse(void *commit, git_odb_object *obj); - -#endif diff --git a/vendor/libgit2/src/commit_list.c b/vendor/libgit2/src/commit_list.c deleted file mode 100644 index 3054c18dd5..0000000000 --- a/vendor/libgit2/src/commit_list.c +++ /dev/null @@ -1,200 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#include "commit_list.h" -#include "common.h" -#include "revwalk.h" -#include "pool.h" -#include "odb.h" - -int git_commit_list_time_cmp(const void *a, const void *b) -{ - const git_commit_list_node *commit_a = a; - const git_commit_list_node *commit_b = b; - - return (commit_a->time < commit_b->time); -} - -git_commit_list *git_commit_list_insert(git_commit_list_node *item, git_commit_list **list_p) -{ - git_commit_list *new_list = git__malloc(sizeof(git_commit_list)); - if (new_list != NULL) { - new_list->item = item; - new_list->next = *list_p; - } - *list_p = new_list; - return new_list; -} - -git_commit_list *git_commit_list_insert_by_date(git_commit_list_node *item, git_commit_list **list_p) -{ - git_commit_list **pp = list_p; - git_commit_list *p; - - while ((p = *pp) != NULL) { - if (git_commit_list_time_cmp(p->item, item) > 0) - break; - - pp = &p->next; - } - - return git_commit_list_insert(item, pp); -} - -git_commit_list_node *git_commit_list_alloc_node(git_revwalk *walk) -{ - return (git_commit_list_node *)git_pool_malloc(&walk->commit_pool, COMMIT_ALLOC); -} - -static int commit_error(git_commit_list_node *commit, const char *msg) -{ - char commit_oid[GIT_OID_HEXSZ + 1]; - git_oid_fmt(commit_oid, &commit->oid); - commit_oid[GIT_OID_HEXSZ] = '\0'; - - giterr_set(GITERR_ODB, "Failed to parse commit %s - %s", commit_oid, msg); - - return -1; -} - -static git_commit_list_node **alloc_parents( - git_revwalk *walk, git_commit_list_node *commit, size_t n_parents) -{ - if (n_parents <= PARENTS_PER_COMMIT) - return (git_commit_list_node **)((char *)commit + sizeof(git_commit_list_node)); - - return (git_commit_list_node **)git_pool_malloc( - &walk->commit_pool, (uint32_t)(n_parents * sizeof(git_commit_list_node *))); -} - - -void git_commit_list_free(git_commit_list **list_p) -{ - git_commit_list *list = *list_p; - - if (list == NULL) - return; - - while (list) { - git_commit_list *temp = list; - list = temp->next; - git__free(temp); - } - - *list_p = NULL; -} - -git_commit_list_node *git_commit_list_pop(git_commit_list **stack) -{ - git_commit_list *top = *stack; - git_commit_list_node *item = top ? top->item : NULL; - - if (top) { - *stack = top->next; - git__free(top); - } - return item; -} - -static int commit_quick_parse( - git_revwalk *walk, - git_commit_list_node *commit, - const uint8_t *buffer, - size_t buffer_len) -{ - const size_t parent_len = strlen("parent ") + GIT_OID_HEXSZ + 1; - const uint8_t *buffer_end = buffer + buffer_len; - const uint8_t *parents_start, *committer_start; - int i, parents = 0; - int commit_time; - - buffer += strlen("tree ") + GIT_OID_HEXSZ + 1; - - parents_start = buffer; - while (buffer + parent_len < buffer_end && memcmp(buffer, "parent ", strlen("parent ")) == 0) { - parents++; - buffer += parent_len; - } - - commit->parents = alloc_parents(walk, commit, parents); - GITERR_CHECK_ALLOC(commit->parents); - - buffer = parents_start; - for (i = 0; i < parents; ++i) { - git_oid oid; - - if (git_oid_fromstr(&oid, (const char *)buffer + strlen("parent ")) < 0) - return -1; - - commit->parents[i] = git_revwalk__commit_lookup(walk, &oid); - if (commit->parents[i] == NULL) - return -1; - - buffer += parent_len; - } - - commit->out_degree = (unsigned short)parents; - - if ((committer_start = buffer = memchr(buffer, '\n', buffer_end - buffer)) == NULL) - return commit_error(commit, "object is corrupted"); - - buffer++; - - if ((buffer = memchr(buffer, '\n', buffer_end - buffer)) == NULL) - return commit_error(commit, "object is corrupted"); - - /* Skip trailing spaces */ - while (buffer > committer_start && git__isspace(*buffer)) - buffer--; - - /* Seek for the beginning of the pack of digits */ - while (buffer > committer_start && git__isdigit(*buffer)) - buffer--; - - /* Skip potential timezone offset */ - if ((buffer > committer_start) && (*buffer == '+' || *buffer == '-')) { - buffer--; - - while (buffer > committer_start && git__isspace(*buffer)) - buffer--; - - while (buffer > committer_start && git__isdigit(*buffer)) - buffer--; - } - - if ((buffer == committer_start) || (git__strtol32(&commit_time, (char *)(buffer + 1), NULL, 10) < 0)) - return commit_error(commit, "cannot parse commit time"); - - commit->time = (time_t)commit_time; - commit->parsed = 1; - return 0; -} - -int git_commit_list_parse(git_revwalk *walk, git_commit_list_node *commit) -{ - git_odb_object *obj; - int error; - - if (commit->parsed) - return 0; - - if ((error = git_odb_read(&obj, walk->odb, &commit->oid)) < 0) - return error; - - if (obj->cached.type != GIT_OBJ_COMMIT) { - giterr_set(GITERR_INVALID, "Object is no commit object"); - error = -1; - } else - error = commit_quick_parse( - walk, commit, - (const uint8_t *)git_odb_object_data(obj), - git_odb_object_size(obj)); - - git_odb_object_free(obj); - return error; -} - diff --git a/vendor/libgit2/src/commit_list.h b/vendor/libgit2/src/commit_list.h deleted file mode 100644 index 6b3f473d3c..0000000000 --- a/vendor/libgit2/src/commit_list.h +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_commit_list_h__ -#define INCLUDE_commit_list_h__ - -#include "git2/oid.h" - -#define PARENT1 (1 << 0) -#define PARENT2 (1 << 1) -#define RESULT (1 << 2) -#define STALE (1 << 3) - -#define PARENTS_PER_COMMIT 2 -#define COMMIT_ALLOC \ - (sizeof(git_commit_list_node) + PARENTS_PER_COMMIT * sizeof(git_commit_list_node *)) - -#define FLAG_BITS 4 - -typedef struct git_commit_list_node { - git_oid oid; - uint32_t time; - unsigned int seen:1, - uninteresting:1, - topo_delay:1, - parsed:1, - flags : FLAG_BITS; - - unsigned short in_degree; - unsigned short out_degree; - - struct git_commit_list_node **parents; -} git_commit_list_node; - -typedef struct git_commit_list { - git_commit_list_node *item; - struct git_commit_list *next; -} git_commit_list; - -git_commit_list_node *git_commit_list_alloc_node(git_revwalk *walk); -int git_commit_list_time_cmp(const void *a, const void *b); -void git_commit_list_free(git_commit_list **list_p); -git_commit_list *git_commit_list_insert(git_commit_list_node *item, git_commit_list **list_p); -git_commit_list *git_commit_list_insert_by_date(git_commit_list_node *item, git_commit_list **list_p); -int git_commit_list_parse(git_revwalk *walk, git_commit_list_node *commit); -git_commit_list_node *git_commit_list_pop(git_commit_list **stack); - -#endif diff --git a/vendor/libgit2/src/common.h b/vendor/libgit2/src/common.h deleted file mode 100644 index cdb0b514d6..0000000000 --- a/vendor/libgit2/src/common.h +++ /dev/null @@ -1,210 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_common_h__ -#define INCLUDE_common_h__ - -#include "git2/common.h" -#include "cc-compat.h" - -/** Declare a function as always inlined. */ -#if defined(_MSC_VER) -# define GIT_INLINE(type) static __inline type -#else -# define GIT_INLINE(type) static inline type -#endif - -/** Support for gcc/clang __has_builtin intrinsic */ -#ifndef __has_builtin -# define __has_builtin(x) 0 -#endif - -#include -#include -#include -#include -#include -#include - -#include -#include - -#ifdef GIT_WIN32 - -# include -# include -# include -# include -# include -# include "win32/msvc-compat.h" -# include "win32/mingw-compat.h" -# include "win32/error.h" -# include "win32/version.h" -# ifdef GIT_THREADS -# include "win32/pthread.h" -# endif - -#else - -# include -# include -# ifdef GIT_THREADS -# include -# include -# endif -#define GIT_STDLIB_CALL - -# include - -#endif - -#include "git2/types.h" -#include "git2/errors.h" -#include "thread-utils.h" -#include "integer.h" - -#include - -#define DEFAULT_BUFSIZE 65536 -#define FILEIO_BUFSIZE DEFAULT_BUFSIZE -#define FILTERIO_BUFSIZE DEFAULT_BUFSIZE -#define NETIO_BUFSIZE DEFAULT_BUFSIZE - -/** - * Check a pointer allocation result, returning -1 if it failed. - */ -#define GITERR_CHECK_ALLOC(ptr) if (ptr == NULL) { return -1; } - -/** - * Check a return value and propagate result if non-zero. - */ -#define GITERR_CHECK_ERROR(code) \ - do { int _err = (code); if (_err) return _err; } while (0) - -/** - * Set the error message for this thread, formatting as needed. - */ -void giterr_set(int error_class, const char *string, ...); - -/** - * Set the error message for a regex failure, using the internal regex - * error code lookup and return a libgit error code. - */ -int giterr_set_regex(const regex_t *regex, int error_code); - -/** - * Set error message for user callback if needed. - * - * If the error code in non-zero and no error message is set, this - * sets a generic error message. - * - * @return This always returns the `error_code` parameter. - */ -GIT_INLINE(int) giterr_set_after_callback_function( - int error_code, const char *action) -{ - if (error_code) { - const git_error *e = giterr_last(); - if (!e || !e->message) - giterr_set(e ? e->klass : GITERR_CALLBACK, - "%s callback returned %d", action, error_code); - } - return error_code; -} - -#ifdef GIT_WIN32 -#define giterr_set_after_callback(code) \ - giterr_set_after_callback_function((code), __FUNCTION__) -#else -#define giterr_set_after_callback(code) \ - giterr_set_after_callback_function((code), __func__) -#endif - -/** - * Gets the system error code for this thread. - */ -int giterr_system_last(void); - -/** - * Sets the system error code for this thread. - */ -void giterr_system_set(int code); - -/** - * Structure to preserve libgit2 error state - */ -typedef struct { - int error_code; - git_error error_msg; -} git_error_state; - -/** - * Capture current error state to restore later, returning error code. - * If `error_code` is zero, this does nothing and returns zero. - */ -int giterr_capture(git_error_state *state, int error_code); - -/** - * Restore error state to a previous value, returning saved error code. - */ -int giterr_restore(git_error_state *state); - -/** - * Check a versioned structure for validity - */ -GIT_INLINE(int) giterr__check_version(const void *structure, unsigned int expected_max, const char *name) -{ - unsigned int actual; - - if (!structure) - return 0; - - actual = *(const unsigned int*)structure; - if (actual > 0 && actual <= expected_max) - return 0; - - giterr_set(GITERR_INVALID, "Invalid version %d on %s", actual, name); - return -1; -} -#define GITERR_CHECK_VERSION(S,V,N) if (giterr__check_version(S,V,N) < 0) return -1 - -/** - * Initialize a structure with a version. - */ -GIT_INLINE(void) git__init_structure(void *structure, size_t len, unsigned int version) -{ - memset(structure, 0, len); - *((int*)structure) = version; -} -#define GIT_INIT_STRUCTURE(S,V) git__init_structure(S, sizeof(*S), V) - -#define GIT_INIT_STRUCTURE_FROM_TEMPLATE(PTR,VERSION,TYPE,TPL) do { \ - TYPE _tmpl = TPL; \ - GITERR_CHECK_VERSION(&(VERSION), _tmpl.version, #TYPE); \ - memcpy((PTR), &_tmpl, sizeof(_tmpl)); } while (0) - - -/** Check for additive overflow, setting an error if would occur. */ -#define GIT_ADD_SIZET_OVERFLOW(out, one, two) \ - (git__add_sizet_overflow(out, one, two) ? (giterr_set_oom(), 1) : 0) - -/** Check for additive overflow, setting an error if would occur. */ -#define GIT_MULTIPLY_SIZET_OVERFLOW(out, nelem, elsize) \ - (git__multiply_sizet_overflow(out, nelem, elsize) ? (giterr_set_oom(), 1) : 0) - -/** Check for additive overflow, failing if it would occur. */ -#define GITERR_CHECK_ALLOC_ADD(out, one, two) \ - if (GIT_ADD_SIZET_OVERFLOW(out, one, two)) { return -1; } - -/** Check for multiplicative overflow, failing if it would occur. */ -#define GITERR_CHECK_ALLOC_MULTIPLY(out, nelem, elsize) \ - if (GIT_MULTIPLY_SIZET_OVERFLOW(out, nelem, elsize)) { return -1; } - -/* NOTE: other giterr functions are in the public errors.h header file */ - -#include "util.h" - -#endif /* INCLUDE_common_h__ */ diff --git a/vendor/libgit2/src/config.c b/vendor/libgit2/src/config.c deleted file mode 100644 index 77cf573e65..0000000000 --- a/vendor/libgit2/src/config.c +++ /dev/null @@ -1,1437 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#include "common.h" -#include "sysdir.h" -#include "config.h" -#include "git2/config.h" -#include "git2/sys/config.h" -#include "vector.h" -#include "buf_text.h" -#include "config_file.h" -#if GIT_WIN32 -# include -#endif - -#include - -void git_config_entry_free(git_config_entry *entry) -{ - if (!entry) - return; - - entry->free(entry); -} - -typedef struct { - git_refcount rc; - - git_config_backend *file; - git_config_level_t level; -} file_internal; - -static void file_internal_free(file_internal *internal) -{ - git_config_backend *file; - - file = internal->file; - file->free(file); - git__free(internal); -} - -static void config_free(git_config *cfg) -{ - size_t i; - file_internal *internal; - - for (i = 0; i < cfg->files.length; ++i) { - internal = git_vector_get(&cfg->files, i); - GIT_REFCOUNT_DEC(internal, file_internal_free); - } - - git_vector_free(&cfg->files); - - git__memzero(cfg, sizeof(*cfg)); - git__free(cfg); -} - -void git_config_free(git_config *cfg) -{ - if (cfg == NULL) - return; - - GIT_REFCOUNT_DEC(cfg, config_free); -} - -static int config_backend_cmp(const void *a, const void *b) -{ - const file_internal *bk_a = (const file_internal *)(a); - const file_internal *bk_b = (const file_internal *)(b); - - return bk_b->level - bk_a->level; -} - -int git_config_new(git_config **out) -{ - git_config *cfg; - - cfg = git__malloc(sizeof(git_config)); - GITERR_CHECK_ALLOC(cfg); - - memset(cfg, 0x0, sizeof(git_config)); - - if (git_vector_init(&cfg->files, 3, config_backend_cmp) < 0) { - git__free(cfg); - return -1; - } - - *out = cfg; - GIT_REFCOUNT_INC(cfg); - return 0; -} - -int git_config_add_file_ondisk( - git_config *cfg, - const char *path, - git_config_level_t level, - int force) -{ - git_config_backend *file = NULL; - struct stat st; - int res; - - assert(cfg && path); - - res = p_stat(path, &st); - if (res < 0 && errno != ENOENT) { - giterr_set(GITERR_CONFIG, "Error stat'ing config file '%s'", path); - return -1; - } - - if (git_config_file__ondisk(&file, path) < 0) - return -1; - - if ((res = git_config_add_backend(cfg, file, level, force)) < 0) { - /* - * free manually; the file is not owned by the config - * instance yet and will not be freed on cleanup - */ - file->free(file); - return res; - } - - return 0; -} - -int git_config_open_ondisk(git_config **out, const char *path) -{ - int error; - git_config *config; - - *out = NULL; - - if (git_config_new(&config) < 0) - return -1; - - if ((error = git_config_add_file_ondisk(config, path, GIT_CONFIG_LEVEL_LOCAL, 0)) < 0) - git_config_free(config); - else - *out = config; - - return error; -} - -int git_config_snapshot(git_config **out, git_config *in) -{ - int error = 0; - size_t i; - file_internal *internal; - git_config *config; - - *out = NULL; - - if (git_config_new(&config) < 0) - return -1; - - git_vector_foreach(&in->files, i, internal) { - git_config_backend *b; - - if ((error = internal->file->snapshot(&b, internal->file)) < 0) - break; - - if ((error = git_config_add_backend(config, b, internal->level, 0)) < 0) { - b->free(b); - break; - } - } - - if (error < 0) - git_config_free(config); - else - *out = config; - - return error; -} - -static int find_internal_file_by_level( - file_internal **internal_out, - const git_config *cfg, - git_config_level_t level) -{ - int pos = -1; - file_internal *internal; - size_t i; - - /* when passing GIT_CONFIG_HIGHEST_LEVEL, the idea is to get the config file - * which has the highest level. As config files are stored in a vector - * sorted by decreasing order of level, getting the file at position 0 - * will do the job. - */ - if (level == GIT_CONFIG_HIGHEST_LEVEL) { - pos = 0; - } else { - git_vector_foreach(&cfg->files, i, internal) { - if (internal->level == level) - pos = (int)i; - } - } - - if (pos == -1) { - giterr_set(GITERR_CONFIG, - "No config file exists for the given level '%i'", (int)level); - return GIT_ENOTFOUND; - } - - *internal_out = git_vector_get(&cfg->files, pos); - - return 0; -} - -static int duplicate_level(void **old_raw, void *new_raw) -{ - file_internal **old = (file_internal **)old_raw; - - GIT_UNUSED(new_raw); - - giterr_set(GITERR_CONFIG, "A file with the same level (%i) has already been added to the config", (int)(*old)->level); - return GIT_EEXISTS; -} - -static void try_remove_existing_file_internal( - git_config *cfg, - git_config_level_t level) -{ - int pos = -1; - file_internal *internal; - size_t i; - - git_vector_foreach(&cfg->files, i, internal) { - if (internal->level == level) - pos = (int)i; - } - - if (pos == -1) - return; - - internal = git_vector_get(&cfg->files, pos); - - if (git_vector_remove(&cfg->files, pos) < 0) - return; - - GIT_REFCOUNT_DEC(internal, file_internal_free); -} - -static int git_config__add_internal( - git_config *cfg, - file_internal *internal, - git_config_level_t level, - int force) -{ - int result; - - /* delete existing config file for level if it exists */ - if (force) - try_remove_existing_file_internal(cfg, level); - - if ((result = git_vector_insert_sorted(&cfg->files, - internal, &duplicate_level)) < 0) - return result; - - git_vector_sort(&cfg->files); - internal->file->cfg = cfg; - - GIT_REFCOUNT_INC(internal); - - return 0; -} - -int git_config_open_global(git_config **cfg_out, git_config *cfg) -{ - if (!git_config_open_level(cfg_out, cfg, GIT_CONFIG_LEVEL_XDG)) - return 0; - - return git_config_open_level(cfg_out, cfg, GIT_CONFIG_LEVEL_GLOBAL); -} - -int git_config_open_level( - git_config **cfg_out, - const git_config *cfg_parent, - git_config_level_t level) -{ - git_config *cfg; - file_internal *internal; - int res; - - if ((res = find_internal_file_by_level(&internal, cfg_parent, level)) < 0) - return res; - - if ((res = git_config_new(&cfg)) < 0) - return res; - - if ((res = git_config__add_internal(cfg, internal, level, true)) < 0) { - git_config_free(cfg); - return res; - } - - *cfg_out = cfg; - - return 0; -} - -int git_config_add_backend( - git_config *cfg, - git_config_backend *file, - git_config_level_t level, - int force) -{ - file_internal *internal; - int result; - - assert(cfg && file); - - GITERR_CHECK_VERSION(file, GIT_CONFIG_BACKEND_VERSION, "git_config_backend"); - - if ((result = file->open(file, level)) < 0) - return result; - - internal = git__malloc(sizeof(file_internal)); - GITERR_CHECK_ALLOC(internal); - - memset(internal, 0x0, sizeof(file_internal)); - - internal->file = file; - internal->level = level; - - if ((result = git_config__add_internal(cfg, internal, level, force)) < 0) { - git__free(internal); - return result; - } - - return 0; -} - -/* - * Loop over all the variables - */ - -typedef struct { - git_config_iterator parent; - git_config_iterator *current; - const git_config *cfg; - regex_t regex; - size_t i; -} all_iter; - -static int find_next_backend(size_t *out, const git_config *cfg, size_t i) -{ - file_internal *internal; - - for (; i > 0; --i) { - internal = git_vector_get(&cfg->files, i - 1); - if (!internal || !internal->file) - continue; - - *out = i; - return 0; - } - - return -1; -} - -static int all_iter_next(git_config_entry **entry, git_config_iterator *_iter) -{ - all_iter *iter = (all_iter *) _iter; - file_internal *internal; - git_config_backend *backend; - size_t i; - int error = 0; - - if (iter->current != NULL && - (error = iter->current->next(entry, iter->current)) == 0) { - return 0; - } - - if (error < 0 && error != GIT_ITEROVER) - return error; - - do { - if (find_next_backend(&i, iter->cfg, iter->i) < 0) - return GIT_ITEROVER; - - internal = git_vector_get(&iter->cfg->files, i - 1); - backend = internal->file; - iter->i = i - 1; - - if (iter->current) - iter->current->free(iter->current); - - iter->current = NULL; - error = backend->iterator(&iter->current, backend); - if (error == GIT_ENOTFOUND) - continue; - - if (error < 0) - return error; - - error = iter->current->next(entry, iter->current); - /* If this backend is empty, then keep going */ - if (error == GIT_ITEROVER) - continue; - - return error; - - } while(1); - - return GIT_ITEROVER; -} - -static int all_iter_glob_next(git_config_entry **entry, git_config_iterator *_iter) -{ - int error; - all_iter *iter = (all_iter *) _iter; - - /* - * We use the "normal" function to grab the next one across - * backends and then apply the regex - */ - while ((error = all_iter_next(entry, _iter)) == 0) { - /* skip non-matching keys if regexp was provided */ - if (regexec(&iter->regex, (*entry)->name, 0, NULL, 0) != 0) - continue; - - /* and simply return if we like the entry's name */ - return 0; - } - - return error; -} - -static void all_iter_free(git_config_iterator *_iter) -{ - all_iter *iter = (all_iter *) _iter; - - if (iter->current) - iter->current->free(iter->current); - - git__free(iter); -} - -static void all_iter_glob_free(git_config_iterator *_iter) -{ - all_iter *iter = (all_iter *) _iter; - - regfree(&iter->regex); - all_iter_free(_iter); -} - -int git_config_iterator_new(git_config_iterator **out, const git_config *cfg) -{ - all_iter *iter; - - iter = git__calloc(1, sizeof(all_iter)); - GITERR_CHECK_ALLOC(iter); - - iter->parent.free = all_iter_free; - iter->parent.next = all_iter_next; - - iter->i = cfg->files.length; - iter->cfg = cfg; - - *out = (git_config_iterator *) iter; - - return 0; -} - -int git_config_iterator_glob_new(git_config_iterator **out, const git_config *cfg, const char *regexp) -{ - all_iter *iter; - int result; - - if (regexp == NULL) - return git_config_iterator_new(out, cfg); - - iter = git__calloc(1, sizeof(all_iter)); - GITERR_CHECK_ALLOC(iter); - - if ((result = regcomp(&iter->regex, regexp, REG_EXTENDED)) != 0) { - giterr_set_regex(&iter->regex, result); - git__free(iter); - return -1; - } - - iter->parent.next = all_iter_glob_next; - iter->parent.free = all_iter_glob_free; - iter->i = cfg->files.length; - iter->cfg = cfg; - - *out = (git_config_iterator *) iter; - - return 0; -} - -int git_config_foreach( - const git_config *cfg, git_config_foreach_cb cb, void *payload) -{ - return git_config_foreach_match(cfg, NULL, cb, payload); -} - -int git_config_backend_foreach_match( - git_config_backend *backend, - const char *regexp, - git_config_foreach_cb cb, - void *payload) -{ - git_config_entry *entry; - git_config_iterator* iter; - regex_t regex; - int error = 0; - - if (regexp != NULL) { - if ((error = regcomp(®ex, regexp, REG_EXTENDED)) != 0) { - giterr_set_regex(®ex, error); - regfree(®ex); - return -1; - } - } - - if ((error = backend->iterator(&iter, backend)) < 0) { - iter = NULL; - return -1; - } - - while (!(iter->next(&entry, iter) < 0)) { - /* skip non-matching keys if regexp was provided */ - if (regexp && regexec(®ex, entry->name, 0, NULL, 0) != 0) - continue; - - /* abort iterator on non-zero return value */ - if ((error = cb(entry, payload)) != 0) { - giterr_set_after_callback(error); - break; - } - } - - if (regexp != NULL) - regfree(®ex); - - iter->free(iter); - - return error; -} - -int git_config_foreach_match( - const git_config *cfg, - const char *regexp, - git_config_foreach_cb cb, - void *payload) -{ - int error; - git_config_iterator *iter; - git_config_entry *entry; - - if ((error = git_config_iterator_glob_new(&iter, cfg, regexp)) < 0) - return error; - - while (!(error = git_config_next(&entry, iter))) { - if ((error = cb(entry, payload)) != 0) { - giterr_set_after_callback(error); - break; - } - } - - git_config_iterator_free(iter); - - if (error == GIT_ITEROVER) - error = 0; - - return error; -} - -/************** - * Setters - **************/ - -static int config_error_nofiles(const char *name) -{ - giterr_set(GITERR_CONFIG, - "Cannot set value for '%s' when no config files exist", name); - return GIT_ENOTFOUND; -} - -int git_config_delete_entry(git_config *cfg, const char *name) -{ - git_config_backend *file; - file_internal *internal; - - internal = git_vector_get(&cfg->files, 0); - if (!internal || !internal->file) - return config_error_nofiles(name); - file = internal->file; - - return file->del(file, name); -} - -int git_config_set_int64(git_config *cfg, const char *name, int64_t value) -{ - char str_value[32]; /* All numbers should fit in here */ - p_snprintf(str_value, sizeof(str_value), "%" PRId64, value); - return git_config_set_string(cfg, name, str_value); -} - -int git_config_set_int32(git_config *cfg, const char *name, int32_t value) -{ - return git_config_set_int64(cfg, name, (int64_t)value); -} - -int git_config_set_bool(git_config *cfg, const char *name, int value) -{ - return git_config_set_string(cfg, name, value ? "true" : "false"); -} - -int git_config_set_string(git_config *cfg, const char *name, const char *value) -{ - int error; - git_config_backend *file; - file_internal *internal; - - if (!value) { - giterr_set(GITERR_CONFIG, "The value to set cannot be NULL"); - return -1; - } - - internal = git_vector_get(&cfg->files, 0); - if (!internal || !internal->file) - return config_error_nofiles(name); - file = internal->file; - - error = file->set(file, name, value); - - if (!error && GIT_REFCOUNT_OWNER(cfg) != NULL) - git_repository__cvar_cache_clear(GIT_REFCOUNT_OWNER(cfg)); - - return error; -} - -int git_config__update_entry( - git_config *config, - const char *key, - const char *value, - bool overwrite_existing, - bool only_if_existing) -{ - int error = 0; - git_config_entry *ce = NULL; - - if ((error = git_config__lookup_entry(&ce, config, key, false)) < 0) - return error; - - if (!ce && only_if_existing) /* entry doesn't exist */ - return 0; - if (ce && !overwrite_existing) /* entry would be overwritten */ - return 0; - if (value && ce && ce->value && !strcmp(ce->value, value)) /* no change */ - return 0; - if (!value && (!ce || !ce->value)) /* asked to delete absent entry */ - return 0; - - if (!value) - error = git_config_delete_entry(config, key); - else - error = git_config_set_string(config, key, value); - - git_config_entry_free(ce); - return error; -} - -/*********** - * Getters - ***********/ - -static int config_error_notfound(const char *name) -{ - giterr_set(GITERR_CONFIG, "Config value '%s' was not found", name); - return GIT_ENOTFOUND; -} - -enum { - GET_ALL_ERRORS = 0, - GET_NO_MISSING = 1, - GET_NO_ERRORS = 2 -}; - -static int get_entry( - git_config_entry **out, - const git_config *cfg, - const char *name, - bool normalize_name, - int want_errors) -{ - int res = GIT_ENOTFOUND; - const char *key = name; - char *normalized = NULL; - size_t i; - file_internal *internal; - - *out = NULL; - - if (normalize_name) { - if ((res = git_config__normalize_name(name, &normalized)) < 0) - goto cleanup; - key = normalized; - } - - res = GIT_ENOTFOUND; - git_vector_foreach(&cfg->files, i, internal) { - if (!internal || !internal->file) - continue; - - res = internal->file->get(internal->file, key, out); - if (res != GIT_ENOTFOUND) - break; - } - - git__free(normalized); - -cleanup: - if (res == GIT_ENOTFOUND) - res = (want_errors > GET_ALL_ERRORS) ? 0 : config_error_notfound(name); - else if (res && (want_errors == GET_NO_ERRORS)) { - giterr_clear(); - res = 0; - } - - return res; -} - -int git_config_get_entry( - git_config_entry **out, const git_config *cfg, const char *name) -{ - return get_entry(out, cfg, name, true, GET_ALL_ERRORS); -} - -int git_config__lookup_entry( - git_config_entry **out, - const git_config *cfg, - const char *key, - bool no_errors) -{ - return get_entry( - out, cfg, key, false, no_errors ? GET_NO_ERRORS : GET_NO_MISSING); -} - -int git_config_get_mapped( - int *out, - const git_config *cfg, - const char *name, - const git_cvar_map *maps, - size_t map_n) -{ - git_config_entry *entry; - int ret; - - if ((ret = get_entry(&entry, cfg, name, true, GET_ALL_ERRORS)) < 0) - return ret; - - ret = git_config_lookup_map_value(out, maps, map_n, entry->value); - git_config_entry_free(entry); - - return ret; -} - -int git_config_get_int64(int64_t *out, const git_config *cfg, const char *name) -{ - git_config_entry *entry; - int ret; - - if ((ret = get_entry(&entry, cfg, name, true, GET_ALL_ERRORS)) < 0) - return ret; - - ret = git_config_parse_int64(out, entry->value); - git_config_entry_free(entry); - - return ret; -} - -int git_config_get_int32(int32_t *out, const git_config *cfg, const char *name) -{ - git_config_entry *entry; - int ret; - - if ((ret = get_entry(&entry, cfg, name, true, GET_ALL_ERRORS)) < 0) - return ret; - - ret = git_config_parse_int32(out, entry->value); - git_config_entry_free(entry); - - return ret; -} - -int git_config_get_bool(int *out, const git_config *cfg, const char *name) -{ - git_config_entry *entry; - int ret; - - if ((ret = get_entry(&entry, cfg, name, true, GET_ALL_ERRORS)) < 0) - return ret; - - ret = git_config_parse_bool(out, entry->value); - git_config_entry_free(entry); - - return ret; -} - -static int is_readonly(const git_config *cfg) -{ - size_t i; - file_internal *internal; - - git_vector_foreach(&cfg->files, i, internal) { - if (!internal || !internal->file) - continue; - - if (!internal->file->readonly) - return 0; - } - - return 1; -} - -int git_config_get_path(git_buf *out, const git_config *cfg, const char *name) -{ - git_config_entry *entry; - int error; - - if ((error = get_entry(&entry, cfg, name, true, GET_ALL_ERRORS)) < 0) - return error; - - error = git_config_parse_path(out, entry->value); - git_config_entry_free(entry); - - return error; -} - -int git_config_get_string( - const char **out, const git_config *cfg, const char *name) -{ - git_config_entry *entry; - int ret; - - if (!is_readonly(cfg)) { - giterr_set(GITERR_CONFIG, "get_string called on a live config object"); - return -1; - } - - ret = get_entry(&entry, cfg, name, true, GET_ALL_ERRORS); - *out = !ret ? (entry->value ? entry->value : "") : NULL; - - git_config_entry_free(entry); - - return ret; -} - -int git_config_get_string_buf( - git_buf *out, const git_config *cfg, const char *name) -{ - git_config_entry *entry; - int ret; - const char *str; - - git_buf_sanitize(out); - - ret = get_entry(&entry, cfg, name, true, GET_ALL_ERRORS); - str = !ret ? (entry->value ? entry->value : "") : NULL; - - if (str) - ret = git_buf_puts(out, str); - - git_config_entry_free(entry); - - return ret; -} - -char *git_config__get_string_force( - const git_config *cfg, const char *key, const char *fallback_value) -{ - git_config_entry *entry; - char *ret; - - get_entry(&entry, cfg, key, false, GET_NO_ERRORS); - ret = (entry && entry->value) ? git__strdup(entry->value) : fallback_value ? git__strdup(fallback_value) : NULL; - git_config_entry_free(entry); - - return ret; -} - -int git_config__get_bool_force( - const git_config *cfg, const char *key, int fallback_value) -{ - int val = fallback_value; - git_config_entry *entry; - - get_entry(&entry, cfg, key, false, GET_NO_ERRORS); - - if (entry && git_config_parse_bool(&val, entry->value) < 0) - giterr_clear(); - - git_config_entry_free(entry); - return val; -} - -int git_config__get_int_force( - const git_config *cfg, const char *key, int fallback_value) -{ - int32_t val = (int32_t)fallback_value; - git_config_entry *entry; - - get_entry(&entry, cfg, key, false, GET_NO_ERRORS); - - if (entry && git_config_parse_int32(&val, entry->value) < 0) - giterr_clear(); - - git_config_entry_free(entry); - return (int)val; -} - -int git_config_get_multivar_foreach( - const git_config *cfg, const char *name, const char *regexp, - git_config_foreach_cb cb, void *payload) -{ - int err, found; - git_config_iterator *iter; - git_config_entry *entry; - - if ((err = git_config_multivar_iterator_new(&iter, cfg, name, regexp)) < 0) - return err; - - found = 0; - while ((err = iter->next(&entry, iter)) == 0) { - found = 1; - - if ((err = cb(entry, payload)) != 0) { - giterr_set_after_callback(err); - break; - } - } - - iter->free(iter); - if (err == GIT_ITEROVER) - err = 0; - - if (found == 0 && err == 0) - err = config_error_notfound(name); - - return err; -} - -typedef struct { - git_config_iterator parent; - git_config_iterator *iter; - char *name; - regex_t regex; - int have_regex; -} multivar_iter; - -static int multivar_iter_next(git_config_entry **entry, git_config_iterator *_iter) -{ - multivar_iter *iter = (multivar_iter *) _iter; - int error = 0; - - while ((error = iter->iter->next(entry, iter->iter)) == 0) { - if (git__strcmp(iter->name, (*entry)->name)) - continue; - - if (!iter->have_regex) - return 0; - - if (regexec(&iter->regex, (*entry)->value, 0, NULL, 0) == 0) - return 0; - } - - return error; -} - -void multivar_iter_free(git_config_iterator *_iter) -{ - multivar_iter *iter = (multivar_iter *) _iter; - - iter->iter->free(iter->iter); - - git__free(iter->name); - if (iter->have_regex) - regfree(&iter->regex); - git__free(iter); -} - -int git_config_multivar_iterator_new(git_config_iterator **out, const git_config *cfg, const char *name, const char *regexp) -{ - multivar_iter *iter = NULL; - git_config_iterator *inner = NULL; - int error; - - if ((error = git_config_iterator_new(&inner, cfg)) < 0) - return error; - - iter = git__calloc(1, sizeof(multivar_iter)); - GITERR_CHECK_ALLOC(iter); - - if ((error = git_config__normalize_name(name, &iter->name)) < 0) - goto on_error; - - if (regexp != NULL) { - error = regcomp(&iter->regex, regexp, REG_EXTENDED); - if (error != 0) { - giterr_set_regex(&iter->regex, error); - error = -1; - regfree(&iter->regex); - goto on_error; - } - - iter->have_regex = 1; - } - - iter->iter = inner; - iter->parent.free = multivar_iter_free; - iter->parent.next = multivar_iter_next; - - *out = (git_config_iterator *) iter; - - return 0; - -on_error: - - inner->free(inner); - git__free(iter); - return error; -} - -int git_config_set_multivar(git_config *cfg, const char *name, const char *regexp, const char *value) -{ - git_config_backend *file; - file_internal *internal; - - internal = git_vector_get(&cfg->files, 0); - if (!internal || !internal->file) - return config_error_nofiles(name); - file = internal->file; - - return file->set_multivar(file, name, regexp, value); -} - -int git_config_delete_multivar(git_config *cfg, const char *name, const char *regexp) -{ - git_config_backend *file; - file_internal *internal; - - internal = git_vector_get(&cfg->files, 0); - if (!internal || !internal->file) - return config_error_nofiles(name); - file = internal->file; - - return file->del_multivar(file, name, regexp); -} - -int git_config_next(git_config_entry **entry, git_config_iterator *iter) -{ - return iter->next(entry, iter); -} - -void git_config_iterator_free(git_config_iterator *iter) -{ - if (iter == NULL) - return; - - iter->free(iter); -} - -int git_config_find_global(git_buf *path) -{ - git_buf_sanitize(path); - return git_sysdir_find_global_file(path, GIT_CONFIG_FILENAME_GLOBAL); -} - -int git_config_find_xdg(git_buf *path) -{ - git_buf_sanitize(path); - return git_sysdir_find_xdg_file(path, GIT_CONFIG_FILENAME_XDG); -} - -int git_config_find_system(git_buf *path) -{ - git_buf_sanitize(path); - return git_sysdir_find_system_file(path, GIT_CONFIG_FILENAME_SYSTEM); -} - -int git_config__global_location(git_buf *buf) -{ - const git_buf *paths; - const char *sep, *start; - - if (git_sysdir_get(&paths, GIT_SYSDIR_GLOBAL) < 0) - return -1; - - /* no paths, so give up */ - if (!paths || !git_buf_len(paths)) - return -1; - - /* find unescaped separator or end of string */ - for (sep = start = git_buf_cstr(paths); *sep; ++sep) { - if (*sep == GIT_PATH_LIST_SEPARATOR && - (sep <= start || sep[-1] != '\\')) - break; - } - - if (git_buf_set(buf, start, (size_t)(sep - start)) < 0) - return -1; - - return git_buf_joinpath(buf, buf->ptr, GIT_CONFIG_FILENAME_GLOBAL); -} - -int git_config_open_default(git_config **out) -{ - int error; - git_config *cfg = NULL; - git_buf buf = GIT_BUF_INIT; - - if ((error = git_config_new(&cfg)) < 0) - return error; - - if (!git_config_find_global(&buf) || !git_config__global_location(&buf)) { - error = git_config_add_file_ondisk(cfg, buf.ptr, - GIT_CONFIG_LEVEL_GLOBAL, 0); - } - - if (!error && !git_config_find_xdg(&buf)) - error = git_config_add_file_ondisk(cfg, buf.ptr, - GIT_CONFIG_LEVEL_XDG, 0); - - if (!error && !git_config_find_system(&buf)) - error = git_config_add_file_ondisk(cfg, buf.ptr, - GIT_CONFIG_LEVEL_SYSTEM, 0); - - git_buf_free(&buf); - - if (error) { - git_config_free(cfg); - cfg = NULL; - } - - *out = cfg; - - return error; -} - -/*********** - * Parsers - ***********/ - -int git_config_lookup_map_value( - int *out, - const git_cvar_map *maps, - size_t map_n, - const char *value) -{ - size_t i; - - if (!value) - goto fail_parse; - - for (i = 0; i < map_n; ++i) { - const git_cvar_map *m = maps + i; - - switch (m->cvar_type) { - case GIT_CVAR_FALSE: - case GIT_CVAR_TRUE: { - int bool_val; - - if (git__parse_bool(&bool_val, value) == 0 && - bool_val == (int)m->cvar_type) { - *out = m->map_value; - return 0; - } - break; - } - - case GIT_CVAR_INT32: - if (git_config_parse_int32(out, value) == 0) - return 0; - break; - - case GIT_CVAR_STRING: - if (strcasecmp(value, m->str_match) == 0) { - *out = m->map_value; - return 0; - } - break; - } - } - -fail_parse: - giterr_set(GITERR_CONFIG, "Failed to map '%s'", value); - return -1; -} - -int git_config_lookup_map_enum(git_cvar_t *type_out, const char **str_out, - const git_cvar_map *maps, size_t map_n, int enum_val) -{ - size_t i; - - for (i = 0; i < map_n; i++) { - const git_cvar_map *m = &maps[i]; - - if (m->map_value != enum_val) - continue; - - *type_out = m->cvar_type; - *str_out = m->str_match; - return 0; - } - - giterr_set(GITERR_CONFIG, "invalid enum value"); - return GIT_ENOTFOUND; -} - -int git_config_parse_bool(int *out, const char *value) -{ - if (git__parse_bool(out, value) == 0) - return 0; - - if (git_config_parse_int32(out, value) == 0) { - *out = !!(*out); - return 0; - } - - giterr_set(GITERR_CONFIG, "Failed to parse '%s' as a boolean value", value); - return -1; -} - -int git_config_parse_int64(int64_t *out, const char *value) -{ - const char *num_end; - int64_t num; - - if (!value || git__strtol64(&num, value, &num_end, 0) < 0) - goto fail_parse; - - switch (*num_end) { - case 'g': - case 'G': - num *= 1024; - /* fallthrough */ - - case 'm': - case 'M': - num *= 1024; - /* fallthrough */ - - case 'k': - case 'K': - num *= 1024; - - /* check that that there are no more characters after the - * given modifier suffix */ - if (num_end[1] != '\0') - return -1; - - /* fallthrough */ - - case '\0': - *out = num; - return 0; - - default: - goto fail_parse; - } - -fail_parse: - giterr_set(GITERR_CONFIG, "Failed to parse '%s' as an integer", value ? value : "(null)"); - return -1; -} - -int git_config_parse_int32(int32_t *out, const char *value) -{ - int64_t tmp; - int32_t truncate; - - if (git_config_parse_int64(&tmp, value) < 0) - goto fail_parse; - - truncate = tmp & 0xFFFFFFFF; - if (truncate != tmp) - goto fail_parse; - - *out = truncate; - return 0; - -fail_parse: - giterr_set(GITERR_CONFIG, "Failed to parse '%s' as a 32-bit integer", value ? value : "(null)"); - return -1; -} - -int git_config_parse_path(git_buf *out, const char *value) -{ - int error = 0; - const git_buf *home; - - assert(out && value); - - git_buf_sanitize(out); - - if (value[0] == '~') { - if (value[1] != '\0' && value[1] != '/') { - giterr_set(GITERR_CONFIG, "retrieving a homedir by name is not supported"); - return -1; - } - - if ((error = git_sysdir_get(&home, GIT_SYSDIR_GLOBAL)) < 0) - return error; - - git_buf_sets(out, home->ptr); - git_buf_puts(out, value + 1); - - if (git_buf_oom(out)) - return -1; - - return 0; - } - - return git_buf_sets(out, value); -} - -/* Take something the user gave us and make it nice for our hash function */ -int git_config__normalize_name(const char *in, char **out) -{ - char *name, *fdot, *ldot; - - assert(in && out); - - name = git__strdup(in); - GITERR_CHECK_ALLOC(name); - - fdot = strchr(name, '.'); - ldot = strrchr(name, '.'); - - if (fdot == NULL || fdot == name || ldot == NULL || !ldot[1]) - goto invalid; - - /* Validate and downcase up to first dot and after last dot */ - if (git_config_file_normalize_section(name, fdot) < 0 || - git_config_file_normalize_section(ldot + 1, NULL) < 0) - goto invalid; - - /* If there is a middle range, make sure it doesn't have newlines */ - while (fdot < ldot) - if (*fdot++ == '\n') - goto invalid; - - *out = name; - return 0; - -invalid: - git__free(name); - giterr_set(GITERR_CONFIG, "Invalid config item name '%s'", in); - return GIT_EINVALIDSPEC; -} - -struct rename_data { - git_config *config; - git_buf *name; - size_t old_len; -}; - -static int rename_config_entries_cb( - const git_config_entry *entry, - void *payload) -{ - int error = 0; - struct rename_data *data = (struct rename_data *)payload; - size_t base_len = git_buf_len(data->name); - - if (base_len > 0 && - !(error = git_buf_puts(data->name, entry->name + data->old_len))) - { - error = git_config_set_string( - data->config, git_buf_cstr(data->name), entry->value); - - git_buf_truncate(data->name, base_len); - } - - if (!error) - error = git_config_delete_entry(data->config, entry->name); - - return error; -} - -int git_config_rename_section( - git_repository *repo, - const char *old_section_name, - const char *new_section_name) -{ - git_config *config; - git_buf pattern = GIT_BUF_INIT, replace = GIT_BUF_INIT; - int error = 0; - struct rename_data data; - - git_buf_text_puts_escape_regex(&pattern, old_section_name); - - if ((error = git_buf_puts(&pattern, "\\..+")) < 0) - goto cleanup; - - if ((error = git_repository_config__weakptr(&config, repo)) < 0) - goto cleanup; - - data.config = config; - data.name = &replace; - data.old_len = strlen(old_section_name) + 1; - - if ((error = git_buf_join(&replace, '.', new_section_name, "")) < 0) - goto cleanup; - - if (new_section_name != NULL && - (error = git_config_file_normalize_section( - replace.ptr, strchr(replace.ptr, '.'))) < 0) - { - giterr_set( - GITERR_CONFIG, "Invalid config section '%s'", new_section_name); - goto cleanup; - } - - error = git_config_foreach_match( - config, git_buf_cstr(&pattern), rename_config_entries_cb, &data); - -cleanup: - git_buf_free(&pattern); - git_buf_free(&replace); - - return error; -} - -int git_config_init_backend(git_config_backend *backend, unsigned int version) -{ - GIT_INIT_STRUCTURE_FROM_TEMPLATE( - backend, version, git_config_backend, GIT_CONFIG_BACKEND_INIT); - return 0; -} diff --git a/vendor/libgit2/src/config.h b/vendor/libgit2/src/config.h deleted file mode 100644 index f257cc90fa..0000000000 --- a/vendor/libgit2/src/config.h +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_config_h__ -#define INCLUDE_config_h__ - -#include "git2.h" -#include "git2/config.h" -#include "vector.h" -#include "repository.h" - -#define GIT_CONFIG_FILENAME_SYSTEM "gitconfig" -#define GIT_CONFIG_FILENAME_GLOBAL ".gitconfig" -#define GIT_CONFIG_FILENAME_XDG "config" - -#define GIT_CONFIG_FILENAME_INREPO "config" -#define GIT_CONFIG_FILE_MODE 0666 - -struct git_config { - git_refcount rc; - git_vector files; -}; - -extern int git_config__global_location(git_buf *buf); - -extern int git_config_rename_section( - git_repository *repo, - const char *old_section_name, /* eg "branch.dummy" */ - const char *new_section_name); /* NULL to drop the old section */ - -/** - * Create a configuration file backend for ondisk files - * - * These are the normal `.gitconfig` files that Core Git - * processes. Note that you first have to add this file to a - * configuration object before you can query it for configuration - * variables. - * - * @param out the new backend - * @param path where the config file is located - */ -extern int git_config_file__ondisk(git_config_backend **out, const char *path); - -extern int git_config__normalize_name(const char *in, char **out); - -/* internal only: does not normalize key and sets out to NULL if not found */ -extern int git_config__lookup_entry( - git_config_entry **out, - const git_config *cfg, - const char *key, - bool no_errors); - -/* internal only: update and/or delete entry string with constraints */ -extern int git_config__update_entry( - git_config *cfg, - const char *key, - const char *value, - bool overwrite_existing, - bool only_if_existing); - -/* - * Lookup functions that cannot fail. These functions look up a config - * value and return a fallback value if the value is missing or if any - * failures occur while trying to access the value. - */ - -extern char *git_config__get_string_force( - const git_config *cfg, const char *key, const char *fallback_value); - -extern int git_config__get_bool_force( - const git_config *cfg, const char *key, int fallback_value); - -extern int git_config__get_int_force( - const git_config *cfg, const char *key, int fallback_value); - -/* API for repository cvar-style lookups from config - not cached, but - * uses cvar value maps and fallbacks - */ -extern int git_config__cvar( - int *out, git_config *config, git_cvar_cached cvar); - -/** - * The opposite of git_config_lookup_map_value, we take an enum value - * and map it to the string or bool value on the config. - */ -int git_config_lookup_map_enum(git_cvar_t *type_out, const char **str_out, - const git_cvar_map *maps, size_t map_n, int enum_val); -#endif diff --git a/vendor/libgit2/src/config_cache.c b/vendor/libgit2/src/config_cache.c deleted file mode 100644 index c859ec148f..0000000000 --- a/vendor/libgit2/src/config_cache.c +++ /dev/null @@ -1,128 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#include "common.h" -#include "fileops.h" -#include "repository.h" -#include "config.h" -#include "git2/config.h" -#include "vector.h" -#include "filter.h" - -struct map_data { - const char *cvar_name; - git_cvar_map *maps; - size_t map_count; - int default_value; -}; - -/* - * core.eol - * Sets the line ending type to use in the working directory for - * files that have the text property set. Alternatives are lf, crlf - * and native, which uses the platform's native line ending. The default - * value is native. See gitattributes(5) for more information on - * end-of-line conversion. - */ -static git_cvar_map _cvar_map_eol[] = { - {GIT_CVAR_FALSE, NULL, GIT_EOL_UNSET}, - {GIT_CVAR_STRING, "lf", GIT_EOL_LF}, - {GIT_CVAR_STRING, "crlf", GIT_EOL_CRLF}, - {GIT_CVAR_STRING, "native", GIT_EOL_NATIVE} -}; - -/* - * core.autocrlf - * Setting this variable to "true" is almost the same as setting - * the text attribute to "auto" on all files except that text files are - * not guaranteed to be normalized: files that contain CRLF in the - * repository will not be touched. Use this setting if you want to have - * CRLF line endings in your working directory even though the repository - * does not have normalized line endings. This variable can be set to input, - * in which case no output conversion is performed. - */ -static git_cvar_map _cvar_map_autocrlf[] = { - {GIT_CVAR_FALSE, NULL, GIT_AUTO_CRLF_FALSE}, - {GIT_CVAR_TRUE, NULL, GIT_AUTO_CRLF_TRUE}, - {GIT_CVAR_STRING, "input", GIT_AUTO_CRLF_INPUT} -}; - -static git_cvar_map _cvar_map_safecrlf[] = { - {GIT_CVAR_FALSE, NULL, GIT_SAFE_CRLF_FALSE}, - {GIT_CVAR_TRUE, NULL, GIT_SAFE_CRLF_FAIL}, - {GIT_CVAR_STRING, "warn", GIT_SAFE_CRLF_WARN} -}; - -/* - * Generic map for integer values - */ -static git_cvar_map _cvar_map_int[] = { - {GIT_CVAR_INT32, NULL, 0}, -}; - -static struct map_data _cvar_maps[] = { - {"core.autocrlf", _cvar_map_autocrlf, ARRAY_SIZE(_cvar_map_autocrlf), GIT_AUTO_CRLF_DEFAULT}, - {"core.eol", _cvar_map_eol, ARRAY_SIZE(_cvar_map_eol), GIT_EOL_DEFAULT}, - {"core.symlinks", NULL, 0, GIT_SYMLINKS_DEFAULT }, - {"core.ignorecase", NULL, 0, GIT_IGNORECASE_DEFAULT }, - {"core.filemode", NULL, 0, GIT_FILEMODE_DEFAULT }, - {"core.ignorestat", NULL, 0, GIT_IGNORESTAT_DEFAULT }, - {"core.trustctime", NULL, 0, GIT_TRUSTCTIME_DEFAULT }, - {"core.abbrev", _cvar_map_int, 1, GIT_ABBREV_DEFAULT }, - {"core.precomposeunicode", NULL, 0, GIT_PRECOMPOSE_DEFAULT }, - {"core.safecrlf", _cvar_map_safecrlf, ARRAY_SIZE(_cvar_map_safecrlf), GIT_SAFE_CRLF_DEFAULT}, - {"core.logallrefupdates", NULL, 0, GIT_LOGALLREFUPDATES_DEFAULT }, - {"core.protecthfs", NULL, 0, GIT_PROTECTHFS_DEFAULT }, - {"core.protectntfs", NULL, 0, GIT_PROTECTNTFS_DEFAULT }, -}; - -int git_config__cvar(int *out, git_config *config, git_cvar_cached cvar) -{ - int error = 0; - struct map_data *data = &_cvar_maps[(int)cvar]; - git_config_entry *entry; - - git_config__lookup_entry(&entry, config, data->cvar_name, false); - - if (!entry) - *out = data->default_value; - else if (data->maps) - error = git_config_lookup_map_value( - out, data->maps, data->map_count, entry->value); - else - error = git_config_parse_bool(out, entry->value); - - git_config_entry_free(entry); - return error; -} - -int git_repository__cvar(int *out, git_repository *repo, git_cvar_cached cvar) -{ - *out = repo->cvar_cache[(int)cvar]; - - if (*out == GIT_CVAR_NOT_CACHED) { - int error; - git_config *config; - - if ((error = git_repository_config__weakptr(&config, repo)) < 0 || - (error = git_config__cvar(out, config, cvar)) < 0) - return error; - - repo->cvar_cache[(int)cvar] = *out; - } - - return 0; -} - -void git_repository__cvar_cache_clear(git_repository *repo) -{ - int i; - - for (i = 0; i < GIT_CVAR_CACHE_MAX; ++i) - repo->cvar_cache[i] = GIT_CVAR_NOT_CACHED; -} - diff --git a/vendor/libgit2/src/config_file.c b/vendor/libgit2/src/config_file.c deleted file mode 100644 index 52a5376bd9..0000000000 --- a/vendor/libgit2/src/config_file.c +++ /dev/null @@ -1,1856 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#include "common.h" -#include "config.h" -#include "filebuf.h" -#include "sysdir.h" -#include "buffer.h" -#include "buf_text.h" -#include "git2/config.h" -#include "git2/sys/config.h" -#include "git2/types.h" -#include "strmap.h" -#include "array.h" - -#include -#include -#include - -GIT__USE_STRMAP - -typedef struct cvar_t { - struct cvar_t *next; - git_config_entry *entry; - bool included; /* whether this is part of [include] */ -} cvar_t; - -typedef struct git_config_file_iter { - git_config_iterator parent; - git_strmap_iter iter; - cvar_t* next_var; -} git_config_file_iter; - -/* Max depth for [include] directives */ -#define MAX_INCLUDE_DEPTH 10 - -#define CVAR_LIST_HEAD(list) ((list)->head) - -#define CVAR_LIST_TAIL(list) ((list)->tail) - -#define CVAR_LIST_NEXT(var) ((var)->next) - -#define CVAR_LIST_EMPTY(list) ((list)->head == NULL) - -#define CVAR_LIST_APPEND(list, var) do {\ - if (CVAR_LIST_EMPTY(list)) {\ - CVAR_LIST_HEAD(list) = CVAR_LIST_TAIL(list) = var;\ - } else {\ - CVAR_LIST_NEXT(CVAR_LIST_TAIL(list)) = var;\ - CVAR_LIST_TAIL(list) = var;\ - }\ -} while(0) - -#define CVAR_LIST_REMOVE_HEAD(list) do {\ - CVAR_LIST_HEAD(list) = CVAR_LIST_NEXT(CVAR_LIST_HEAD(list));\ -} while(0) - -#define CVAR_LIST_REMOVE_AFTER(var) do {\ - CVAR_LIST_NEXT(var) = CVAR_LIST_NEXT(CVAR_LIST_NEXT(var));\ -} while(0) - -#define CVAR_LIST_FOREACH(list, iter)\ - for ((iter) = CVAR_LIST_HEAD(list);\ - (iter) != NULL;\ - (iter) = CVAR_LIST_NEXT(iter)) - -/* - * Inspired by the FreeBSD functions - */ -#define CVAR_LIST_FOREACH_SAFE(start, iter, tmp)\ - for ((iter) = CVAR_LIST_HEAD(vars);\ - (iter) && (((tmp) = CVAR_LIST_NEXT(iter) || 1));\ - (iter) = (tmp)) - -struct reader { - time_t file_mtime; - size_t file_size; - char *file_path; - git_buf buffer; - char *read_ptr; - int line_number; - int eof; -}; - -typedef struct { - git_atomic refcount; - git_strmap *values; -} refcounted_strmap; - -typedef struct { - git_config_backend parent; - /* mutex to coordinate accessing the values */ - git_mutex values_mutex; - refcounted_strmap *values; -} diskfile_header; - -typedef struct { - diskfile_header header; - - git_config_level_t level; - - git_array_t(struct reader) readers; - - char *file_path; -} diskfile_backend; - -typedef struct { - diskfile_header header; - - diskfile_backend *snapshot_from; -} diskfile_readonly_backend; - -static int config_read(git_strmap *values, diskfile_backend *cfg_file, struct reader *reader, git_config_level_t level, int depth); -static int config_write(diskfile_backend *cfg, const char *key, const regex_t *preg, const char *value); -static char *escape_value(const char *ptr); - -int git_config_file__snapshot(git_config_backend **out, diskfile_backend *in); -static int config_snapshot(git_config_backend **out, git_config_backend *in); - -static void set_parse_error(struct reader *reader, int col, const char *error_str) -{ - giterr_set(GITERR_CONFIG, "Failed to parse config file: %s (in %s:%d, column %d)", - error_str, reader->file_path, reader->line_number, col); -} - -static int config_error_readonly(void) -{ - giterr_set(GITERR_CONFIG, "this backend is read-only"); - return -1; -} - -static void cvar_free(cvar_t *var) -{ - if (var == NULL) - return; - - git__free((char*)var->entry->name); - git__free((char *)var->entry->value); - git__free(var->entry); - git__free(var); -} - -int git_config_file_normalize_section(char *start, char *end) -{ - char *scan; - - if (start == end) - return GIT_EINVALIDSPEC; - - /* Validate and downcase range */ - for (scan = start; *scan; ++scan) { - if (end && scan >= end) - break; - if (isalnum(*scan)) - *scan = (char)git__tolower(*scan); - else if (*scan != '-' || scan == start) - return GIT_EINVALIDSPEC; - } - - if (scan == start) - return GIT_EINVALIDSPEC; - - return 0; -} - -/* Add or append the new config option */ -static int append_entry(git_strmap *values, cvar_t *var) -{ - git_strmap_iter pos; - cvar_t *existing; - int error = 0; - - pos = git_strmap_lookup_index(values, var->entry->name); - if (!git_strmap_valid_index(values, pos)) { - git_strmap_insert(values, var->entry->name, var, error); - } else { - existing = git_strmap_value_at(values, pos); - while (existing->next != NULL) { - existing = existing->next; - } - existing->next = var; - } - - if (error > 0) - error = 0; - - return error; -} - -static void free_vars(git_strmap *values) -{ - cvar_t *var = NULL; - - if (values == NULL) - return; - - git_strmap_foreach_value(values, var, - while (var != NULL) { - cvar_t *next = CVAR_LIST_NEXT(var); - cvar_free(var); - var = next; - }); - - git_strmap_free(values); -} - -static void refcounted_strmap_free(refcounted_strmap *map) -{ - if (!map) - return; - - if (git_atomic_dec(&map->refcount) != 0) - return; - - free_vars(map->values); - git__free(map); -} - -/** - * Take the current values map from the backend and increase its - * refcount. This is its own function to make sure we use the mutex to - * avoid the map pointer from changing under us. - */ -static refcounted_strmap *refcounted_strmap_take(diskfile_header *h) -{ - refcounted_strmap *map; - - git_mutex_lock(&h->values_mutex); - - map = h->values; - git_atomic_inc(&map->refcount); - - git_mutex_unlock(&h->values_mutex); - - return map; -} - -static int refcounted_strmap_alloc(refcounted_strmap **out) -{ - refcounted_strmap *map; - int error; - - map = git__calloc(1, sizeof(refcounted_strmap)); - GITERR_CHECK_ALLOC(map); - - git_atomic_set(&map->refcount, 1); - - if ((error = git_strmap_alloc(&map->values)) < 0) - git__free(map); - else - *out = map; - - return error; -} - -static int config_open(git_config_backend *cfg, git_config_level_t level) -{ - int res; - struct reader *reader; - diskfile_backend *b = (diskfile_backend *)cfg; - - b->level = level; - - if ((res = refcounted_strmap_alloc(&b->header.values)) < 0) - return res; - - git_array_init(b->readers); - reader = git_array_alloc(b->readers); - if (!reader) { - refcounted_strmap_free(b->header.values); - return -1; - } - memset(reader, 0, sizeof(struct reader)); - - reader->file_path = git__strdup(b->file_path); - GITERR_CHECK_ALLOC(reader->file_path); - - git_buf_init(&reader->buffer, 0); - res = git_futils_readbuffer_updated( - &reader->buffer, b->file_path, &reader->file_mtime, &reader->file_size, NULL); - - /* It's fine if the file doesn't exist */ - if (res == GIT_ENOTFOUND) - return 0; - - if (res < 0 || (res = config_read(b->header.values->values, b, reader, level, 0)) < 0) { - refcounted_strmap_free(b->header.values); - b->header.values = NULL; - } - - reader = git_array_get(b->readers, 0); - git_buf_free(&reader->buffer); - - return res; -} - -/* The meat of the refresh, as we want to use it in different places */ -static int config__refresh(git_config_backend *cfg) -{ - refcounted_strmap *values = NULL, *tmp; - diskfile_backend *b = (diskfile_backend *)cfg; - struct reader *reader = NULL; - int error = 0; - - if ((error = refcounted_strmap_alloc(&values)) < 0) - goto out; - - reader = git_array_get(b->readers, git_array_size(b->readers) - 1); - GITERR_CHECK_ALLOC(reader); - - if ((error = config_read(values->values, b, reader, b->level, 0)) < 0) - goto out; - - git_mutex_lock(&b->header.values_mutex); - - tmp = b->header.values; - b->header.values = values; - values = tmp; - - git_mutex_unlock(&b->header.values_mutex); - -out: - refcounted_strmap_free(values); - if (reader) - git_buf_free(&reader->buffer); - return error; -} - -static int config_refresh(git_config_backend *cfg) -{ - int error = 0, updated = 0, any_updated = 0; - diskfile_backend *b = (diskfile_backend *)cfg; - struct reader *reader = NULL; - uint32_t i; - - for (i = 0; i < git_array_size(b->readers); i++) { - reader = git_array_get(b->readers, i); - error = git_futils_readbuffer_updated( - &reader->buffer, reader->file_path, - &reader->file_mtime, &reader->file_size, &updated); - - if (error < 0 && error != GIT_ENOTFOUND) - return error; - - if (updated) - any_updated = 1; - } - - if (!any_updated) - return (error == GIT_ENOTFOUND) ? 0 : error; - - return config__refresh(cfg); -} - -static void backend_free(git_config_backend *_backend) -{ - diskfile_backend *backend = (diskfile_backend *)_backend; - uint32_t i; - - if (backend == NULL) - return; - - for (i = 0; i < git_array_size(backend->readers); i++) { - struct reader *r = git_array_get(backend->readers, i); - git__free(r->file_path); - } - git_array_clear(backend->readers); - - git__free(backend->file_path); - refcounted_strmap_free(backend->header.values); - git_mutex_free(&backend->header.values_mutex); - git__free(backend); -} - -static void config_iterator_free( - git_config_iterator* iter) -{ - iter->backend->free(iter->backend); - git__free(iter); -} - -static int config_iterator_next( - git_config_entry **entry, - git_config_iterator *iter) -{ - git_config_file_iter *it = (git_config_file_iter *) iter; - diskfile_header *h = (diskfile_header *) it->parent.backend; - git_strmap *values = h->values->values; - int err = 0; - cvar_t * var; - - if (it->next_var == NULL) { - err = git_strmap_next((void**) &var, &(it->iter), values); - } else { - var = it->next_var; - } - - if (err < 0) { - it->next_var = NULL; - return err; - } - - *entry = var->entry; - it->next_var = CVAR_LIST_NEXT(var); - - return 0; -} - -static int config_iterator_new( - git_config_iterator **iter, - struct git_config_backend* backend) -{ - diskfile_header *h; - git_config_file_iter *it; - git_config_backend *snapshot; - diskfile_backend *b = (diskfile_backend *) backend; - int error; - - if ((error = config_snapshot(&snapshot, backend)) < 0) - return error; - - if ((error = snapshot->open(snapshot, b->level)) < 0) - return error; - - it = git__calloc(1, sizeof(git_config_file_iter)); - GITERR_CHECK_ALLOC(it); - - h = (diskfile_header *)snapshot; - - /* strmap_begin() is currently a macro returning 0 */ - GIT_UNUSED(h); - - it->parent.backend = snapshot; - it->iter = git_strmap_begin(h->values); - it->next_var = NULL; - - it->parent.next = config_iterator_next; - it->parent.free = config_iterator_free; - *iter = (git_config_iterator *) it; - - return 0; -} - -static int config_set(git_config_backend *cfg, const char *name, const char *value) -{ - diskfile_backend *b = (diskfile_backend *)cfg; - refcounted_strmap *map; - git_strmap *values; - char *key, *esc_value = NULL; - khiter_t pos; - int rval, ret; - - if ((rval = git_config__normalize_name(name, &key)) < 0) - return rval; - - map = refcounted_strmap_take(&b->header); - values = map->values; - - /* - * Try to find it in the existing values and update it if it - * only has one value. - */ - pos = git_strmap_lookup_index(values, key); - if (git_strmap_valid_index(values, pos)) { - cvar_t *existing = git_strmap_value_at(values, pos); - - if (existing->next != NULL) { - giterr_set(GITERR_CONFIG, "Multivar incompatible with simple set"); - ret = -1; - goto out; - } - - /* don't update if old and new values already match */ - if ((!existing->entry->value && !value) || - (existing->entry->value && value && - !strcmp(existing->entry->value, value))) { - ret = 0; - goto out; - } - } - - /* No early returns due to sanity checks, let's write it out and refresh */ - - if (value) { - esc_value = escape_value(value); - GITERR_CHECK_ALLOC(esc_value); - } - - if ((ret = config_write(b, key, NULL, esc_value)) < 0) - goto out; - - ret = config_refresh(cfg); - -out: - refcounted_strmap_free(map); - git__free(esc_value); - git__free(key); - return ret; -} - -/* release the map containing the entry as an equivalent to freeing it */ -static void release_map(git_config_entry *entry) -{ - refcounted_strmap *map = (refcounted_strmap *) entry->payload; - refcounted_strmap_free(map); -} - -/* - * Internal function that actually gets the value in string form - */ -static int config_get(git_config_backend *cfg, const char *key, git_config_entry **out) -{ - diskfile_header *h = (diskfile_header *)cfg; - refcounted_strmap *map; - git_strmap *values; - khiter_t pos; - cvar_t *var; - int error = 0; - - if (!h->parent.readonly && ((error = config_refresh(cfg)) < 0)) - return error; - - map = refcounted_strmap_take(h); - values = map->values; - - pos = git_strmap_lookup_index(values, key); - - /* no error message; the config system will write one */ - if (!git_strmap_valid_index(values, pos)) { - refcounted_strmap_free(map); - return GIT_ENOTFOUND; - } - - var = git_strmap_value_at(values, pos); - while (var->next) - var = var->next; - - *out = var->entry; - (*out)->free = release_map; - (*out)->payload = map; - - return error; -} - -static int config_set_multivar( - git_config_backend *cfg, const char *name, const char *regexp, const char *value) -{ - diskfile_backend *b = (diskfile_backend *)cfg; - refcounted_strmap *map; - git_strmap *values; - char *key; - regex_t preg; - int result; - khiter_t pos; - - assert(regexp); - - if ((result = git_config__normalize_name(name, &key)) < 0) - return result; - - map = refcounted_strmap_take(&b->header); - values = b->header.values->values; - - pos = git_strmap_lookup_index(values, key); - if (!git_strmap_valid_index(values, pos)) { - /* If we don't have it, behave like a normal set */ - result = config_set(cfg, name, value); - refcounted_strmap_free(map); - git__free(key); - return result; - } - - result = regcomp(&preg, regexp, REG_EXTENDED); - if (result != 0) { - giterr_set_regex(&preg, result); - result = -1; - goto out; - } - - /* If we do have it, set call config_write() and reload */ - if ((result = config_write(b, key, &preg, value)) < 0) - goto out; - - result = config_refresh(cfg); - -out: - refcounted_strmap_free(map); - git__free(key); - regfree(&preg); - - return result; -} - -static int config_delete(git_config_backend *cfg, const char *name) -{ - cvar_t *var; - diskfile_backend *b = (diskfile_backend *)cfg; - refcounted_strmap *map; git_strmap *values; - char *key; - int result; - khiter_t pos; - - if ((result = git_config__normalize_name(name, &key)) < 0) - return result; - - map = refcounted_strmap_take(&b->header); - values = b->header.values->values; - - pos = git_strmap_lookup_index(values, key); - git__free(key); - - if (!git_strmap_valid_index(values, pos)) { - refcounted_strmap_free(map); - giterr_set(GITERR_CONFIG, "Could not find key '%s' to delete", name); - return GIT_ENOTFOUND; - } - - var = git_strmap_value_at(values, pos); - refcounted_strmap_free(map); - - if (var->next != NULL) { - giterr_set(GITERR_CONFIG, "Cannot delete multivar with a single delete"); - return -1; - } - - if ((result = config_write(b, var->entry->name, NULL, NULL)) < 0) - return result; - - return config_refresh(cfg); -} - -static int config_delete_multivar(git_config_backend *cfg, const char *name, const char *regexp) -{ - diskfile_backend *b = (diskfile_backend *)cfg; - refcounted_strmap *map; - git_strmap *values; - char *key; - regex_t preg; - int result; - khiter_t pos; - - if ((result = git_config__normalize_name(name, &key)) < 0) - return result; - - map = refcounted_strmap_take(&b->header); - values = b->header.values->values; - - pos = git_strmap_lookup_index(values, key); - - if (!git_strmap_valid_index(values, pos)) { - refcounted_strmap_free(map); - git__free(key); - giterr_set(GITERR_CONFIG, "Could not find key '%s' to delete", name); - return GIT_ENOTFOUND; - } - - refcounted_strmap_free(map); - - result = regcomp(&preg, regexp, REG_EXTENDED); - if (result != 0) { - giterr_set_regex(&preg, result); - result = -1; - goto out; - } - - if ((result = config_write(b, key, &preg, NULL)) < 0) - goto out; - - result = config_refresh(cfg); - -out: - git__free(key); - regfree(&preg); - return result; -} - -static int config_snapshot(git_config_backend **out, git_config_backend *in) -{ - diskfile_backend *b = (diskfile_backend *) in; - - return git_config_file__snapshot(out, b); -} - -int git_config_file__ondisk(git_config_backend **out, const char *path) -{ - diskfile_backend *backend; - - backend = git__calloc(1, sizeof(diskfile_backend)); - GITERR_CHECK_ALLOC(backend); - - backend->header.parent.version = GIT_CONFIG_BACKEND_VERSION; - git_mutex_init(&backend->header.values_mutex); - - backend->file_path = git__strdup(path); - GITERR_CHECK_ALLOC(backend->file_path); - - backend->header.parent.open = config_open; - backend->header.parent.get = config_get; - backend->header.parent.set = config_set; - backend->header.parent.set_multivar = config_set_multivar; - backend->header.parent.del = config_delete; - backend->header.parent.del_multivar = config_delete_multivar; - backend->header.parent.iterator = config_iterator_new; - backend->header.parent.snapshot = config_snapshot; - backend->header.parent.free = backend_free; - - *out = (git_config_backend *)backend; - - return 0; -} - -static int config_set_readonly(git_config_backend *cfg, const char *name, const char *value) -{ - GIT_UNUSED(cfg); - GIT_UNUSED(name); - GIT_UNUSED(value); - - return config_error_readonly(); -} - -static int config_set_multivar_readonly( - git_config_backend *cfg, const char *name, const char *regexp, const char *value) -{ - GIT_UNUSED(cfg); - GIT_UNUSED(name); - GIT_UNUSED(regexp); - GIT_UNUSED(value); - - return config_error_readonly(); -} - -static int config_delete_multivar_readonly(git_config_backend *cfg, const char *name, const char *regexp) -{ - GIT_UNUSED(cfg); - GIT_UNUSED(name); - GIT_UNUSED(regexp); - - return config_error_readonly(); -} - -static int config_delete_readonly(git_config_backend *cfg, const char *name) -{ - GIT_UNUSED(cfg); - GIT_UNUSED(name); - - return config_error_readonly(); -} - -static void backend_readonly_free(git_config_backend *_backend) -{ - diskfile_backend *backend = (diskfile_backend *)_backend; - - if (backend == NULL) - return; - - refcounted_strmap_free(backend->header.values); - git_mutex_free(&backend->header.values_mutex); - git__free(backend); -} - -static int config_readonly_open(git_config_backend *cfg, git_config_level_t level) -{ - diskfile_readonly_backend *b = (diskfile_readonly_backend *) cfg; - diskfile_backend *src = b->snapshot_from; - diskfile_header *src_header = &src->header; - refcounted_strmap *src_map; - int error; - - if (!src_header->parent.readonly && (error = config_refresh(&src_header->parent)) < 0) - return error; - - /* We're just copying data, don't care about the level */ - GIT_UNUSED(level); - - src_map = refcounted_strmap_take(src_header); - b->header.values = src_map; - - return 0; -} - -int git_config_file__snapshot(git_config_backend **out, diskfile_backend *in) -{ - diskfile_readonly_backend *backend; - - backend = git__calloc(1, sizeof(diskfile_readonly_backend)); - GITERR_CHECK_ALLOC(backend); - - backend->header.parent.version = GIT_CONFIG_BACKEND_VERSION; - git_mutex_init(&backend->header.values_mutex); - - backend->snapshot_from = in; - - backend->header.parent.readonly = 1; - backend->header.parent.version = GIT_CONFIG_BACKEND_VERSION; - backend->header.parent.open = config_readonly_open; - backend->header.parent.get = config_get; - backend->header.parent.set = config_set_readonly; - backend->header.parent.set_multivar = config_set_multivar_readonly; - backend->header.parent.del = config_delete_readonly; - backend->header.parent.del_multivar = config_delete_multivar_readonly; - backend->header.parent.iterator = config_iterator_new; - backend->header.parent.free = backend_readonly_free; - - *out = (git_config_backend *)backend; - - return 0; -} - -static int reader_getchar_raw(struct reader *reader) -{ - int c; - - c = *reader->read_ptr++; - - /* - Win 32 line breaks: if we find a \r\n sequence, - return only the \n as a newline - */ - if (c == '\r' && *reader->read_ptr == '\n') { - reader->read_ptr++; - c = '\n'; - } - - if (c == '\n') - reader->line_number++; - - if (c == 0) { - reader->eof = 1; - c = '\0'; - } - - return c; -} - -#define SKIP_WHITESPACE (1 << 1) -#define SKIP_COMMENTS (1 << 2) - -static int reader_getchar(struct reader *reader, int flags) -{ - const int skip_whitespace = (flags & SKIP_WHITESPACE); - const int skip_comments = (flags & SKIP_COMMENTS); - int c; - - assert(reader->read_ptr); - - do { - c = reader_getchar_raw(reader); - } while (c != '\n' && c != '\0' && skip_whitespace && git__isspace(c)); - - if (skip_comments && (c == '#' || c == ';')) { - do { - c = reader_getchar_raw(reader); - } while (c != '\n' && c != '\0'); - } - - return c; -} - -/* - * Read the next char, but don't move the reading pointer. - */ -static int reader_peek(struct reader *reader, int flags) -{ - void *old_read_ptr; - int old_lineno, old_eof; - int ret; - - assert(reader->read_ptr); - - old_read_ptr = reader->read_ptr; - old_lineno = reader->line_number; - old_eof = reader->eof; - - ret = reader_getchar(reader, flags); - - reader->read_ptr = old_read_ptr; - reader->line_number = old_lineno; - reader->eof = old_eof; - - return ret; -} - -/* - * Read and consume a line, returning it in newly-allocated memory. - */ -static char *reader_readline(struct reader *reader, bool skip_whitespace) -{ - char *line = NULL; - char *line_src, *line_end; - size_t line_len, alloc_len; - - line_src = reader->read_ptr; - - if (skip_whitespace) { - /* Skip empty empty lines */ - while (git__isspace(*line_src)) - ++line_src; - } - - line_end = strchr(line_src, '\n'); - - /* no newline at EOF */ - if (line_end == NULL) - line_end = strchr(line_src, 0); - - line_len = line_end - line_src; - - if (GIT_ADD_SIZET_OVERFLOW(&alloc_len, line_len, 1) || - (line = git__malloc(alloc_len)) == NULL) { - return NULL; - } - - memcpy(line, line_src, line_len); - - do line[line_len] = '\0'; - while (line_len-- > 0 && git__isspace(line[line_len])); - - if (*line_end == '\n') - line_end++; - - if (*line_end == '\0') - reader->eof = 1; - - reader->line_number++; - reader->read_ptr = line_end; - - return line; -} - -/* - * Consume a line, without storing it anywhere - */ -static void reader_consume_line(struct reader *reader) -{ - char *line_start, *line_end; - - line_start = reader->read_ptr; - line_end = strchr(line_start, '\n'); - /* No newline at EOF */ - if(line_end == NULL){ - line_end = strchr(line_start, '\0'); - } - - if (*line_end == '\n') - line_end++; - - if (*line_end == '\0') - reader->eof = 1; - - reader->line_number++; - reader->read_ptr = line_end; -} - -GIT_INLINE(int) config_keychar(int c) -{ - return isalnum(c) || c == '-'; -} - -static int parse_section_header_ext(struct reader *reader, const char *line, const char *base_name, char **section_name) -{ - int c, rpos; - char *first_quote, *last_quote; - git_buf buf = GIT_BUF_INIT; - size_t quoted_len, alloc_len, base_name_len = strlen(base_name); - - /* - * base_name is what came before the space. We should be at the - * first quotation mark, except for now, line isn't being kept in - * sync so we only really use it to calculate the length. - */ - - first_quote = strchr(line, '"'); - last_quote = strrchr(line, '"'); - quoted_len = last_quote - first_quote; - - if (quoted_len == 0) { - set_parse_error(reader, 0, "Missing closing quotation mark in section header"); - return -1; - } - - GITERR_CHECK_ALLOC_ADD(&alloc_len, base_name_len, quoted_len); - GITERR_CHECK_ALLOC_ADD(&alloc_len, alloc_len, 2); - - git_buf_grow(&buf, alloc_len); - git_buf_printf(&buf, "%s.", base_name); - - rpos = 0; - - line = first_quote; - c = line[++rpos]; - - /* - * At the end of each iteration, whatever is stored in c will be - * added to the string. In case of error, jump to out - */ - do { - - switch (c) { - case 0: - set_parse_error(reader, 0, "Unexpected end-of-line in section header"); - git_buf_free(&buf); - return -1; - - case '"': - goto end_parse; - - case '\\': - c = line[++rpos]; - - if (c == 0) { - set_parse_error(reader, rpos, "Unexpected end-of-line in section header"); - git_buf_free(&buf); - return -1; - } - - default: - break; - } - - git_buf_putc(&buf, (char)c); - c = line[++rpos]; - } while (line + rpos < last_quote); - -end_parse: - if (line[rpos] != '"' || line[rpos + 1] != ']') { - set_parse_error(reader, rpos, "Unexpected text after closing quotes"); - git_buf_free(&buf); - return -1; - } - - *section_name = git_buf_detach(&buf); - return 0; -} - -static int parse_section_header(struct reader *reader, char **section_out) -{ - char *name, *name_end; - int name_length, c, pos; - int result; - char *line; - size_t line_len; - - line = reader_readline(reader, true); - if (line == NULL) - return -1; - - /* find the end of the variable's name */ - name_end = strrchr(line, ']'); - if (name_end == NULL) { - git__free(line); - set_parse_error(reader, 0, "Missing ']' in section header"); - return -1; - } - - GITERR_CHECK_ALLOC_ADD(&line_len, (size_t)(name_end - line), 1); - name = git__malloc(line_len); - GITERR_CHECK_ALLOC(name); - - name_length = 0; - pos = 0; - - /* Make sure we were given a section header */ - c = line[pos++]; - assert(c == '['); - - c = line[pos++]; - - do { - if (git__isspace(c)){ - name[name_length] = '\0'; - result = parse_section_header_ext(reader, line, name, section_out); - git__free(line); - git__free(name); - return result; - } - - if (!config_keychar(c) && c != '.') { - set_parse_error(reader, pos, "Unexpected character in header"); - goto fail_parse; - } - - name[name_length++] = (char)git__tolower(c); - - } while ((c = line[pos++]) != ']'); - - if (line[pos - 1] != ']') { - set_parse_error(reader, pos, "Unexpected end of file"); - goto fail_parse; - } - - git__free(line); - - name[name_length] = 0; - *section_out = name; - - return 0; - -fail_parse: - git__free(line); - git__free(name); - return -1; -} - -static int skip_bom(struct reader *reader) -{ - git_bom_t bom; - int bom_offset = git_buf_text_detect_bom(&bom, - &reader->buffer, reader->read_ptr - reader->buffer.ptr); - - if (bom == GIT_BOM_UTF8) - reader->read_ptr += bom_offset; - - /* TODO: reference implementation is pretty stupid with BoM */ - - return 0; -} - -/* - (* basic types *) - digit = "0".."9" - integer = digit { digit } - alphabet = "a".."z" + "A" .. "Z" - - section_char = alphabet | "." | "-" - extension_char = (* any character except newline *) - any_char = (* any character *) - variable_char = "alphabet" | "-" - - - (* actual grammar *) - config = { section } - - section = header { definition } - - header = "[" section [subsection | subsection_ext] "]" - - subsection = "." section - subsection_ext = "\"" extension "\"" - - section = section_char { section_char } - extension = extension_char { extension_char } - - definition = variable_name ["=" variable_value] "\n" - - variable_name = variable_char { variable_char } - variable_value = string | boolean | integer - - string = quoted_string | plain_string - quoted_string = "\"" plain_string "\"" - plain_string = { any_char } - - boolean = boolean_true | boolean_false - boolean_true = "yes" | "1" | "true" | "on" - boolean_false = "no" | "0" | "false" | "off" -*/ - -static int strip_comments(char *line, int in_quotes) -{ - int quote_count = in_quotes, backslash_count = 0; - char *ptr; - - for (ptr = line; *ptr; ++ptr) { - if (ptr[0] == '"' && ptr > line && ptr[-1] != '\\') - quote_count++; - - if ((ptr[0] == ';' || ptr[0] == '#') && - (quote_count % 2) == 0 && - (backslash_count % 2) == 0) { - ptr[0] = '\0'; - break; - } - - if (ptr[0] == '\\') - backslash_count++; - else - backslash_count = 0; - } - - /* skip any space at the end */ - while (ptr > line && git__isspace(ptr[-1])) { - ptr--; - } - ptr[0] = '\0'; - - return quote_count; -} - -static int included_path(git_buf *out, const char *dir, const char *path) -{ - /* From the user's home */ - if (path[0] == '~' && path[1] == '/') - return git_sysdir_find_global_file(out, &path[1]); - - return git_path_join_unrooted(out, path, dir, NULL); -} - -static const char *escapes = "ntb\"\\"; -static const char *escaped = "\n\t\b\"\\"; - -/* Escape the values to write them to the file */ -static char *escape_value(const char *ptr) -{ - git_buf buf = GIT_BUF_INIT; - size_t len; - const char *esc; - - assert(ptr); - - len = strlen(ptr); - if (!len) - return git__calloc(1, sizeof(char)); - - git_buf_grow(&buf, len); - - while (*ptr != '\0') { - if ((esc = strchr(escaped, *ptr)) != NULL) { - git_buf_putc(&buf, '\\'); - git_buf_putc(&buf, escapes[esc - escaped]); - } else { - git_buf_putc(&buf, *ptr); - } - ptr++; - } - - if (git_buf_oom(&buf)) { - git_buf_free(&buf); - return NULL; - } - - return git_buf_detach(&buf); -} - -/* '\"' -> '"' etc */ -static int unescape_line( - char **out, bool *is_multi, const char *ptr, int quote_count) -{ - char *str, *fixed, *esc; - size_t ptr_len = strlen(ptr), alloc_len; - - *is_multi = false; - - if (GIT_ADD_SIZET_OVERFLOW(&alloc_len, ptr_len, 1) || - (str = git__malloc(alloc_len)) == NULL) { - return -1; - } - - fixed = str; - - while (*ptr != '\0') { - if (*ptr == '"') { - quote_count++; - } else if (*ptr != '\\') { - *fixed++ = *ptr; - } else { - /* backslash, check the next char */ - ptr++; - /* if we're at the end, it's a multiline, so keep the backslash */ - if (*ptr == '\0') { - *is_multi = true; - goto done; - } - if ((esc = strchr(escapes, *ptr)) != NULL) { - *fixed++ = escaped[esc - escapes]; - } else { - git__free(str); - giterr_set(GITERR_CONFIG, "Invalid escape at %s", ptr); - return -1; - } - } - ptr++; - } - -done: - *fixed = '\0'; - *out = str; - - return 0; -} - -static int parse_multiline_variable(struct reader *reader, git_buf *value, int in_quotes) -{ - char *line = NULL, *proc_line = NULL; - int quote_count; - bool multiline; - - /* Check that the next line exists */ - line = reader_readline(reader, false); - if (line == NULL) - return -1; - - /* We've reached the end of the file, there is no continuation. - * (this is not an error). - */ - if (line[0] == '\0') { - git__free(line); - return 0; - } - - quote_count = strip_comments(line, !!in_quotes); - - /* If it was just a comment, pretend it didn't exist */ - if (line[0] == '\0') { - git__free(line); - return parse_multiline_variable(reader, value, quote_count); - /* TODO: unbounded recursion. This **could** be exploitable */ - } - - if (unescape_line(&proc_line, &multiline, line, in_quotes) < 0) { - git__free(line); - return -1; - } - /* add this line to the multiline var */ - - git_buf_puts(value, proc_line); - git__free(line); - git__free(proc_line); - - /* - * If we need to continue reading the next line, let's just - * keep putting stuff in the buffer - */ - if (multiline) - return parse_multiline_variable(reader, value, quote_count); - - return 0; -} - -GIT_INLINE(bool) is_namechar(char c) -{ - return isalnum(c) || c == '-'; -} - -static int parse_name( - char **name, const char **value, struct reader *reader, const char *line) -{ - const char *name_end = line, *value_start; - - *name = NULL; - *value = NULL; - - while (*name_end && is_namechar(*name_end)) - name_end++; - - if (line == name_end) { - set_parse_error(reader, 0, "Invalid configuration key"); - return -1; - } - - value_start = name_end; - - while (*value_start && git__isspace(*value_start)) - value_start++; - - if (*value_start == '=') { - *value = value_start + 1; - } else if (*value_start) { - set_parse_error(reader, 0, "Invalid configuration key"); - return -1; - } - - if ((*name = git__strndup(line, name_end - line)) == NULL) - return -1; - - return 0; -} - -static int parse_variable(struct reader *reader, char **var_name, char **var_value) -{ - const char *value_start = NULL; - char *line; - int quote_count; - bool multiline; - - line = reader_readline(reader, true); - if (line == NULL) - return -1; - - quote_count = strip_comments(line, 0); - - /* If there is no value, boolean true is assumed */ - *var_value = NULL; - - if (parse_name(var_name, &value_start, reader, line) < 0) - goto on_error; - - /* - * Now, let's try to parse the value - */ - if (value_start != NULL) { - while (git__isspace(value_start[0])) - value_start++; - - if (unescape_line(var_value, &multiline, value_start, 0) < 0) - goto on_error; - - if (multiline) { - git_buf multi_value = GIT_BUF_INIT; - git_buf_attach(&multi_value, *var_value, 0); - - if (parse_multiline_variable(reader, &multi_value, quote_count) < 0 || - git_buf_oom(&multi_value)) { - git_buf_free(&multi_value); - goto on_error; - } - - *var_value = git_buf_detach(&multi_value); - } - } - - git__free(line); - return 0; - -on_error: - git__free(*var_name); - git__free(line); - return -1; -} - -static int config_parse( - struct reader *reader, - int (*on_section)(struct reader **reader, const char *current_section, const char *line, size_t line_len, void *data), - int (*on_variable)(struct reader **reader, const char *current_section, char *var_name, char *var_value, const char *line, size_t line_len, void *data), - int (*on_comment)(struct reader **reader, const char *line, size_t line_len, void *data), - int (*on_eof)(struct reader **reader, void *data), - void *data) -{ - char *current_section = NULL, *var_name, *var_value, *line_start; - char c; - size_t line_len; - int result = 0; - - skip_bom(reader); - - while (result == 0 && !reader->eof) { - line_start = reader->read_ptr; - - c = reader_peek(reader, SKIP_WHITESPACE); - - switch (c) { - case '\0': /* EOF when peeking, set EOF in the reader to exit the loop */ - reader->eof = 1; - break; - - case '[': /* section header, new section begins */ - git__free(current_section); - current_section = NULL; - - if ((result = parse_section_header(reader, ¤t_section)) == 0 && on_section) { - line_len = reader->read_ptr - line_start; - result = on_section(&reader, current_section, line_start, line_len, data); - } - break; - - case '\n': /* comment or whitespace-only */ - case ';': - case '#': - reader_consume_line(reader); - - if (on_comment) { - line_len = reader->read_ptr - line_start; - result = on_comment(&reader, line_start, line_len, data); - } - break; - - default: /* assume variable declaration */ - if ((result = parse_variable(reader, &var_name, &var_value)) == 0 && on_variable) { - line_len = reader->read_ptr - line_start; - result = on_variable(&reader, current_section, var_name, var_value, line_start, line_len, data); - } - break; - } - } - - if (on_eof) - result = on_eof(&reader, data); - - git__free(current_section); - return result; -} - -struct parse_data { - git_strmap *values; - diskfile_backend *cfg_file; - uint32_t reader_idx; - git_config_level_t level; - int depth; -}; - -static int read_on_variable( - struct reader **reader, - const char *current_section, - char *var_name, - char *var_value, - const char *line, - size_t line_len, - void *data) -{ - struct parse_data *parse_data = (struct parse_data *)data; - git_buf buf = GIT_BUF_INIT; - cvar_t *var; - int result = 0; - - GIT_UNUSED(line); - GIT_UNUSED(line_len); - - git__strtolower(var_name); - git_buf_printf(&buf, "%s.%s", current_section, var_name); - git__free(var_name); - - if (git_buf_oom(&buf)) { - git__free(var_value); - return -1; - } - - var = git__calloc(1, sizeof(cvar_t)); - GITERR_CHECK_ALLOC(var); - var->entry = git__calloc(1, sizeof(git_config_entry)); - GITERR_CHECK_ALLOC(var->entry); - - var->entry->name = git_buf_detach(&buf); - var->entry->value = var_value; - var->entry->level = parse_data->level; - var->included = !!parse_data->depth; - - if ((result = append_entry(parse_data->values, var)) < 0) - return result; - - result = 0; - - /* Add or append the new config option */ - if (!git__strcmp(var->entry->name, "include.path")) { - struct reader *r; - git_buf path = GIT_BUF_INIT; - char *dir; - uint32_t index; - - r = git_array_alloc(parse_data->cfg_file->readers); - /* The reader may have been reallocated */ - *reader = git_array_get(parse_data->cfg_file->readers, parse_data->reader_idx); - memset(r, 0, sizeof(struct reader)); - - if ((result = git_path_dirname_r(&path, (*reader)->file_path)) < 0) - return result; - - /* We need to know our index in the array, as the next config_parse call may realloc */ - index = git_array_size(parse_data->cfg_file->readers) - 1; - dir = git_buf_detach(&path); - result = included_path(&path, dir, var->entry->value); - git__free(dir); - - if (result < 0) - return result; - - r->file_path = git_buf_detach(&path); - git_buf_init(&r->buffer, 0); - - result = git_futils_readbuffer_updated( - &r->buffer, r->file_path, &r->file_mtime, &r->file_size, NULL); - - if (result == 0) { - result = config_read(parse_data->values, parse_data->cfg_file, r, parse_data->level, parse_data->depth+1); - r = git_array_get(parse_data->cfg_file->readers, index); - *reader = git_array_get(parse_data->cfg_file->readers, parse_data->reader_idx); - } else if (result == GIT_ENOTFOUND) { - giterr_clear(); - result = 0; - } - - git_buf_free(&r->buffer); - } - - return result; -} - -static int config_read(git_strmap *values, diskfile_backend *cfg_file, struct reader *reader, git_config_level_t level, int depth) -{ - struct parse_data parse_data; - - if (depth >= MAX_INCLUDE_DEPTH) { - giterr_set(GITERR_CONFIG, "Maximum config include depth reached"); - return -1; - } - - /* Initialize the reading position */ - reader->read_ptr = reader->buffer.ptr; - reader->eof = 0; - - /* If the file is empty, there's nothing for us to do */ - if (*reader->read_ptr == '\0') - return 0; - - parse_data.values = values; - parse_data.cfg_file = cfg_file; - parse_data.reader_idx = git_array_size(cfg_file->readers) - 1; - parse_data.level = level; - parse_data.depth = depth; - - return config_parse(reader, NULL, read_on_variable, NULL, NULL, &parse_data); -} - -static int write_section(git_filebuf *file, const char *key) -{ - int result; - const char *dot; - git_buf buf = GIT_BUF_INIT; - - /* All of this just for [section "subsection"] */ - dot = strchr(key, '.'); - git_buf_putc(&buf, '['); - if (dot == NULL) { - git_buf_puts(&buf, key); - } else { - char *escaped; - git_buf_put(&buf, key, dot - key); - escaped = escape_value(dot + 1); - GITERR_CHECK_ALLOC(escaped); - git_buf_printf(&buf, " \"%s\"", escaped); - git__free(escaped); - } - git_buf_puts(&buf, "]\n"); - - if (git_buf_oom(&buf)) - return -1; - - result = git_filebuf_write(file, git_buf_cstr(&buf), buf.size); - git_buf_free(&buf); - - return result; -} - -static const char *quotes_for_value(const char *value) -{ - const char *ptr; - - if (value[0] == ' ' || value[0] == '\0') - return "\""; - - for (ptr = value; *ptr; ++ptr) { - if (*ptr == ';' || *ptr == '#') - return "\""; - } - - if (ptr[-1] == ' ') - return "\""; - - return ""; -} - -struct write_data { - git_filebuf *file; - unsigned int in_section : 1, - preg_replaced : 1; - const char *section; - const char *name; - const regex_t *preg; - const char *value; -}; - -static int write_line(struct write_data *write_data, const char *line, size_t line_len) -{ - int result = git_filebuf_write(write_data->file, line, line_len); - - if (!result && line_len && line[line_len-1] != '\n') - result = git_filebuf_printf(write_data->file, "\n"); - - return result; -} - -static int write_value(struct write_data *write_data) -{ - const char *q; - int result; - - q = quotes_for_value(write_data->value); - result = git_filebuf_printf(write_data->file, - "\t%s = %s%s%s\n", write_data->name, q, write_data->value, q); - - /* If we are updating a single name/value, we're done. Setting `value` - * to `NULL` will prevent us from trying to write it again later (in - * `write_on_section`) if we see the same section repeated. - */ - if (!write_data->preg) - write_data->value = NULL; - - return result; -} - -static int write_on_section( - struct reader **reader, - const char *current_section, - const char *line, - size_t line_len, - void *data) -{ - struct write_data *write_data = (struct write_data *)data; - int result = 0; - - GIT_UNUSED(reader); - - /* If we were previously in the correct section (but aren't anymore) - * and haven't written our value (for a simple name/value set, not - * a multivar), then append it to the end of the section before writing - * the new one. - */ - if (write_data->in_section && !write_data->preg && write_data->value) - result = write_value(write_data); - - write_data->in_section = strcmp(current_section, write_data->section) == 0; - - if (!result) - result = write_line(write_data, line, line_len); - - return result; -} - -static int write_on_variable( - struct reader **reader, - const char *current_section, - char *var_name, - char *var_value, - const char *line, - size_t line_len, - void *data) -{ - struct write_data *write_data = (struct write_data *)data; - bool has_matched = false; - - GIT_UNUSED(reader); - GIT_UNUSED(current_section); - - /* See if we are to update this name/value pair; first examine name */ - if (write_data->in_section && - strcasecmp(write_data->name, var_name) == 0) - has_matched = true; - - /* If we have a regex to match the value, see if it matches */ - if (has_matched && write_data->preg != NULL) - has_matched = (regexec(write_data->preg, var_value, 0, NULL, 0) == 0); - - git__free(var_name); - git__free(var_value); - - /* If this isn't the name/value we're looking for, simply dump the - * existing data back out and continue on. - */ - if (!has_matched) - return write_line(write_data, line, line_len); - - write_data->preg_replaced = 1; - - /* If value is NULL, we are deleting this value; write nothing. */ - if (!write_data->value) - return 0; - - return write_value(write_data); -} - -static int write_on_comment(struct reader **reader, const char *line, size_t line_len, void *data) -{ - struct write_data *write_data; - - GIT_UNUSED(reader); - - write_data = (struct write_data *)data; - return write_line(write_data, line, line_len); -} - -static int write_on_eof(struct reader **reader, void *data) -{ - struct write_data *write_data = (struct write_data *)data; - int result = 0; - - GIT_UNUSED(reader); - - /* If we are at the EOF and have not written our value (again, for a - * simple name/value set, not a multivar) then we have never seen the - * section in question and should create a new section and write the - * value. - */ - if ((!write_data->preg || !write_data->preg_replaced) && write_data->value) { - if ((result = write_section(write_data->file, write_data->section)) == 0) - result = write_value(write_data); - } - - return result; -} - -/* - * This is pretty much the parsing, except we write out anything we don't have - */ -static int config_write(diskfile_backend *cfg, const char *key, const regex_t *preg, const char* value) -{ - int result; - char *section, *name, *ldot; - git_filebuf file = GIT_FILEBUF_INIT; - struct reader *reader = git_array_get(cfg->readers, 0); - struct write_data write_data; - - /* Lock the file */ - if ((result = git_filebuf_open( - &file, cfg->file_path, 0, GIT_CONFIG_FILE_MODE)) < 0) { - git_buf_free(&reader->buffer); - return result; - } - - /* We need to read in our own config file */ - result = git_futils_readbuffer(&reader->buffer, cfg->file_path); - - /* Initialise the reading position */ - if (result == GIT_ENOTFOUND) { - reader->read_ptr = NULL; - reader->eof = 1; - git_buf_clear(&reader->buffer); - } else if (result == 0) { - reader->read_ptr = reader->buffer.ptr; - reader->eof = 0; - } else { - git_filebuf_cleanup(&file); - return -1; /* OS error when reading the file */ - } - - ldot = strrchr(key, '.'); - name = ldot + 1; - section = git__strndup(key, ldot - key); - - write_data.file = &file; - write_data.section = section; - write_data.in_section = 0; - write_data.preg_replaced = 0; - write_data.name = name; - write_data.preg = preg; - write_data.value = value; - - result = config_parse(reader, write_on_section, write_on_variable, write_on_comment, write_on_eof, &write_data); - git__free(section); - - if (result < 0) { - git_filebuf_cleanup(&file); - goto done; - } - - /* refresh stats - if this errors, then commit will error too */ - (void)git_filebuf_stats(&reader->file_mtime, &reader->file_size, &file); - - result = git_filebuf_commit(&file); - git_buf_free(&reader->buffer); - -done: - git_buf_free(&reader->buffer); - return result; -} - diff --git a/vendor/libgit2/src/config_file.h b/vendor/libgit2/src/config_file.h deleted file mode 100644 index 0d8bf740f5..0000000000 --- a/vendor/libgit2/src/config_file.h +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_config_file_h__ -#define INCLUDE_config_file_h__ - -#include "git2/config.h" - -GIT_INLINE(int) git_config_file_open(git_config_backend *cfg, unsigned int level) -{ - return cfg->open(cfg, level); -} - -GIT_INLINE(void) git_config_file_free(git_config_backend *cfg) -{ - if (cfg) - cfg->free(cfg); -} - -GIT_INLINE(int) git_config_file_get_string( - git_config_entry **out, git_config_backend *cfg, const char *name) -{ - return cfg->get(cfg, name, out); -} - -GIT_INLINE(int) git_config_file_set_string( - git_config_backend *cfg, const char *name, const char *value) -{ - return cfg->set(cfg, name, value); -} - -GIT_INLINE(int) git_config_file_delete( - git_config_backend *cfg, const char *name) -{ - return cfg->del(cfg, name); -} - -GIT_INLINE(int) git_config_file_foreach( - git_config_backend *cfg, - int (*fn)(const git_config_entry *entry, void *data), - void *data) -{ - return git_config_backend_foreach_match(cfg, NULL, fn, data); -} - -GIT_INLINE(int) git_config_file_foreach_match( - git_config_backend *cfg, - const char *regexp, - int (*fn)(const git_config_entry *entry, void *data), - void *data) -{ - return git_config_backend_foreach_match(cfg, regexp, fn, data); -} - -extern int git_config_file_normalize_section(char *start, char *end); - -#endif - diff --git a/vendor/libgit2/src/crlf.c b/vendor/libgit2/src/crlf.c deleted file mode 100644 index f391137c1b..0000000000 --- a/vendor/libgit2/src/crlf.c +++ /dev/null @@ -1,382 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#include "git2/attr.h" -#include "git2/blob.h" -#include "git2/index.h" -#include "git2/sys/filter.h" - -#include "common.h" -#include "fileops.h" -#include "hash.h" -#include "filter.h" -#include "buf_text.h" -#include "repository.h" - -struct crlf_attrs { - int crlf_action; - int eol; - int auto_crlf; - int safe_crlf; -}; - -struct crlf_filter { - git_filter f; -}; - -static int check_crlf(const char *value) -{ - if (GIT_ATTR_TRUE(value)) - return GIT_CRLF_TEXT; - - if (GIT_ATTR_FALSE(value)) - return GIT_CRLF_BINARY; - - if (GIT_ATTR_UNSPECIFIED(value)) - return GIT_CRLF_GUESS; - - if (strcmp(value, "input") == 0) - return GIT_CRLF_INPUT; - - if (strcmp(value, "auto") == 0) - return GIT_CRLF_AUTO; - - return GIT_CRLF_GUESS; -} - -static int check_eol(const char *value) -{ - if (GIT_ATTR_UNSPECIFIED(value)) - return GIT_EOL_UNSET; - - if (strcmp(value, "lf") == 0) - return GIT_EOL_LF; - - if (strcmp(value, "crlf") == 0) - return GIT_EOL_CRLF; - - return GIT_EOL_UNSET; -} - -static int crlf_input_action(struct crlf_attrs *ca) -{ - if (ca->crlf_action == GIT_CRLF_BINARY) - return GIT_CRLF_BINARY; - - if (ca->eol == GIT_EOL_LF) - return GIT_CRLF_INPUT; - - if (ca->eol == GIT_EOL_CRLF) - return GIT_CRLF_CRLF; - - return ca->crlf_action; -} - -static int has_cr_in_index(const git_filter_source *src) -{ - git_repository *repo = git_filter_source_repo(src); - const char *path = git_filter_source_path(src); - git_index *index; - const git_index_entry *entry; - git_blob *blob; - const void *blobcontent; - git_off_t blobsize; - bool found_cr; - - if (!path) - return false; - - if (git_repository_index__weakptr(&index, repo) < 0) { - giterr_clear(); - return false; - } - - if (!(entry = git_index_get_bypath(index, path, 0)) && - !(entry = git_index_get_bypath(index, path, 1))) - return false; - - if (!S_ISREG(entry->mode)) /* don't crlf filter non-blobs */ - return true; - - if (git_blob_lookup(&blob, repo, &entry->id) < 0) - return false; - - blobcontent = git_blob_rawcontent(blob); - blobsize = git_blob_rawsize(blob); - if (!git__is_sizet(blobsize)) - blobsize = (size_t)-1; - - found_cr = (blobcontent != NULL && - blobsize > 0 && - memchr(blobcontent, '\r', (size_t)blobsize) != NULL); - - git_blob_free(blob); - return found_cr; -} - -static int crlf_apply_to_odb( - struct crlf_attrs *ca, - git_buf *to, - const git_buf *from, - const git_filter_source *src) -{ - /* Empty file? Nothing to do */ - if (!git_buf_len(from)) - return 0; - - /* Heuristics to see if we can skip the conversion. - * Straight from Core Git. - */ - if (ca->crlf_action == GIT_CRLF_AUTO || ca->crlf_action == GIT_CRLF_GUESS) { - git_buf_text_stats stats; - - /* Check heuristics for binary vs text - returns true if binary */ - if (git_buf_text_gather_stats(&stats, from, false)) - return GIT_PASSTHROUGH; - - /* If there are no CR characters to filter out, then just pass */ - if (!stats.cr) - return GIT_PASSTHROUGH; - - /* If safecrlf is enabled, sanity-check the result. */ - if (stats.cr != stats.crlf || stats.lf != stats.crlf) { - switch (ca->safe_crlf) { - case GIT_SAFE_CRLF_FAIL: - giterr_set( - GITERR_FILTER, "LF would be replaced by CRLF in '%s'", - git_filter_source_path(src)); - return -1; - case GIT_SAFE_CRLF_WARN: - /* TODO: issue warning when warning API is available */; - break; - default: - break; - } - } - - /* - * We're currently not going to even try to convert stuff - * that has bare CR characters. Does anybody do that crazy - * stuff? - */ - if (stats.cr != stats.crlf) - return GIT_PASSTHROUGH; - - if (ca->crlf_action == GIT_CRLF_GUESS) { - /* - * If the file in the index has any CR in it, do not convert. - * This is the new safer autocrlf handling. - */ - if (has_cr_in_index(src)) - return GIT_PASSTHROUGH; - } - - if (!stats.cr) - return GIT_PASSTHROUGH; - } - - /* Actually drop the carriage returns */ - return git_buf_text_crlf_to_lf(to, from); -} - -static const char *line_ending(struct crlf_attrs *ca) -{ - switch (ca->crlf_action) { - case GIT_CRLF_BINARY: - case GIT_CRLF_INPUT: - return "\n"; - - case GIT_CRLF_CRLF: - return "\r\n"; - - case GIT_CRLF_GUESS: - if (ca->auto_crlf == GIT_AUTO_CRLF_FALSE) - return "\n"; - break; - - case GIT_CRLF_AUTO: - case GIT_CRLF_TEXT: - break; - - default: - goto line_ending_error; - } - - if (ca->auto_crlf == GIT_AUTO_CRLF_TRUE) - return "\r\n"; - else if (ca->auto_crlf == GIT_AUTO_CRLF_INPUT) - return "\n"; - else if (ca->eol == GIT_EOL_UNSET) - return GIT_EOL_NATIVE == GIT_EOL_CRLF ? "\r\n" : "\n"; - else if (ca->eol == GIT_EOL_LF) - return "\n"; - else if (ca->eol == GIT_EOL_CRLF) - return "\r\n"; - -line_ending_error: - giterr_set(GITERR_INVALID, "Invalid input to line ending filter"); - return NULL; -} - -static int crlf_apply_to_workdir( - struct crlf_attrs *ca, git_buf *to, const git_buf *from) -{ - git_buf_text_stats stats; - const char *workdir_ending = NULL; - bool is_binary; - - /* Empty file? Nothing to do. */ - if (git_buf_len(from) == 0) - return 0; - - /* Determine proper line ending */ - workdir_ending = line_ending(ca); - if (!workdir_ending) - return -1; - - /* only LF->CRLF conversion is supported, do nothing on LF platforms */ - if (strcmp(workdir_ending, "\r\n") != 0) - return GIT_PASSTHROUGH; - - /* If there are no LFs, or all LFs are part of a CRLF, nothing to do */ - is_binary = git_buf_text_gather_stats(&stats, from, false); - - if (stats.lf == 0 || stats.lf == stats.crlf) - return GIT_PASSTHROUGH; - - if (ca->crlf_action == GIT_CRLF_AUTO || - ca->crlf_action == GIT_CRLF_GUESS) { - - /* If we have any existing CR or CRLF line endings, do nothing */ - if (ca->crlf_action == GIT_CRLF_GUESS && - stats.cr > 0 && stats.crlf > 0) - return GIT_PASSTHROUGH; - - /* If we have bare CR characters, do nothing */ - if (stats.cr != stats.crlf) - return GIT_PASSTHROUGH; - - /* Don't filter binary files */ - if (is_binary) - return GIT_PASSTHROUGH; - } - - return git_buf_text_lf_to_crlf(to, from); -} - -static int crlf_check( - git_filter *self, - void **payload, /* points to NULL ptr on entry, may be set */ - const git_filter_source *src, - const char **attr_values) -{ - int error; - struct crlf_attrs ca; - - GIT_UNUSED(self); - - if (!attr_values) { - ca.crlf_action = GIT_CRLF_GUESS; - ca.eol = GIT_EOL_UNSET; - } else { - ca.crlf_action = check_crlf(attr_values[2]); /* text */ - if (ca.crlf_action == GIT_CRLF_GUESS) - ca.crlf_action = check_crlf(attr_values[0]); /* clrf */ - ca.eol = check_eol(attr_values[1]); /* eol */ - } - ca.auto_crlf = GIT_AUTO_CRLF_DEFAULT; - - /* - * Use the core Git logic to see if we should perform CRLF for this file - * based on its attributes & the value of `core.autocrlf` - */ - ca.crlf_action = crlf_input_action(&ca); - - if (ca.crlf_action == GIT_CRLF_BINARY) - return GIT_PASSTHROUGH; - - if (ca.crlf_action == GIT_CRLF_GUESS || - ((ca.crlf_action == GIT_CRLF_AUTO || ca.crlf_action == GIT_CRLF_TEXT) && - git_filter_source_mode(src) == GIT_FILTER_SMUDGE)) { - - error = git_repository__cvar( - &ca.auto_crlf, git_filter_source_repo(src), GIT_CVAR_AUTO_CRLF); - if (error < 0) - return error; - - if (ca.crlf_action == GIT_CRLF_GUESS && - ca.auto_crlf == GIT_AUTO_CRLF_FALSE) - return GIT_PASSTHROUGH; - - if (ca.auto_crlf == GIT_AUTO_CRLF_INPUT && - git_filter_source_mode(src) == GIT_FILTER_SMUDGE) - return GIT_PASSTHROUGH; - } - - if (git_filter_source_mode(src) == GIT_FILTER_CLEAN) { - error = git_repository__cvar( - &ca.safe_crlf, git_filter_source_repo(src), GIT_CVAR_SAFE_CRLF); - if (error < 0) - return error; - - /* downgrade FAIL to WARN if ALLOW_UNSAFE option is used */ - if ((git_filter_source_flags(src) & GIT_FILTER_ALLOW_UNSAFE) && - ca.safe_crlf == GIT_SAFE_CRLF_FAIL) - ca.safe_crlf = GIT_SAFE_CRLF_WARN; - } - - *payload = git__malloc(sizeof(ca)); - GITERR_CHECK_ALLOC(*payload); - memcpy(*payload, &ca, sizeof(ca)); - - return 0; -} - -static int crlf_apply( - git_filter *self, - void **payload, /* may be read and/or set */ - git_buf *to, - const git_buf *from, - const git_filter_source *src) -{ - /* initialize payload in case `check` was bypassed */ - if (!*payload) { - int error = crlf_check(self, payload, src, NULL); - if (error < 0 && error != GIT_PASSTHROUGH) - return error; - } - - if (git_filter_source_mode(src) == GIT_FILTER_SMUDGE) - return crlf_apply_to_workdir(*payload, to, from); - else - return crlf_apply_to_odb(*payload, to, from, src); -} - -static void crlf_cleanup( - git_filter *self, - void *payload) -{ - GIT_UNUSED(self); - git__free(payload); -} - -git_filter *git_crlf_filter_new(void) -{ - struct crlf_filter *f = git__calloc(1, sizeof(struct crlf_filter)); - if (f == NULL) - return NULL; - - f->f.version = GIT_FILTER_VERSION; - f->f.attributes = "crlf eol text"; - f->f.initialize = NULL; - f->f.shutdown = git_filter_free; - f->f.check = crlf_check; - f->f.apply = crlf_apply; - f->f.cleanup = crlf_cleanup; - - return (git_filter *)f; -} diff --git a/vendor/libgit2/src/curl_stream.c b/vendor/libgit2/src/curl_stream.c deleted file mode 100644 index 6534bdbbe7..0000000000 --- a/vendor/libgit2/src/curl_stream.c +++ /dev/null @@ -1,257 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#ifdef GIT_CURL - -#include - -#include "stream.h" -#include "git2/transport.h" -#include "buffer.h" -#include "vector.h" - -typedef struct { - git_stream parent; - CURL *handle; - curl_socket_t socket; - char curl_error[CURL_ERROR_SIZE + 1]; - git_cert_x509 cert_info; - git_strarray cert_info_strings; -} curl_stream; - -static int seterr_curl(curl_stream *s) -{ - giterr_set(GITERR_NET, "curl error: %s\n", s->curl_error); - return -1; -} - -static int curls_connect(git_stream *stream) -{ - curl_stream *s = (curl_stream *) stream; - long sockextr; - int failed_cert = 0; - CURLcode res; - res = curl_easy_perform(s->handle); - - if (res != CURLE_OK && res != CURLE_PEER_FAILED_VERIFICATION) - return seterr_curl(s); - if (res == CURLE_PEER_FAILED_VERIFICATION) - failed_cert = 1; - - if ((res = curl_easy_getinfo(s->handle, CURLINFO_LASTSOCKET, &sockextr)) != CURLE_OK) - return seterr_curl(s); - - s->socket = sockextr; - - if (s->parent.encrypted && failed_cert) - return GIT_ECERTIFICATE; - - return 0; -} - -static int curls_certificate(git_cert **out, git_stream *stream) -{ - int error; - CURLcode res; - struct curl_slist *slist; - struct curl_certinfo *certinfo; - git_vector strings = GIT_VECTOR_INIT; - curl_stream *s = (curl_stream *) stream; - - if ((res = curl_easy_getinfo(s->handle, CURLINFO_CERTINFO, &certinfo)) != CURLE_OK) - return seterr_curl(s); - - /* No information is available, can happen with SecureTransport */ - if (certinfo->num_of_certs == 0) { - s->cert_info.cert_type = GIT_CERT_NONE; - s->cert_info.data = NULL; - s->cert_info.len = 0; - return 0; - } - - if ((error = git_vector_init(&strings, 8, NULL)) < 0) - return error; - - for (slist = certinfo->certinfo[0]; slist; slist = slist->next) { - char *str = git__strdup(slist->data); - GITERR_CHECK_ALLOC(str); - } - - /* Copy the contents of the vector into a strarray so we can expose them */ - s->cert_info_strings.strings = (char **) strings.contents; - s->cert_info_strings.count = strings.length; - - s->cert_info.cert_type = GIT_CERT_STRARRAY; - s->cert_info.data = &s->cert_info_strings; - s->cert_info.len = strings.length; - - *out = (git_cert *) &s->cert_info; - - return 0; -} - -static int curls_set_proxy(git_stream *stream, const char *proxy_url) -{ - CURLcode res; - curl_stream *s = (curl_stream *) stream; - - if ((res = curl_easy_setopt(s->handle, CURLOPT_PROXY, proxy_url)) != CURLE_OK) - return seterr_curl(s); - - return 0; -} - -static int wait_for(curl_socket_t fd, bool reading) -{ - int ret; - fd_set infd, outfd, errfd; - - FD_ZERO(&infd); - FD_ZERO(&outfd); - FD_ZERO(&errfd); - - FD_SET(fd, &errfd); - if (reading) - FD_SET(fd, &infd); - else - FD_SET(fd, &outfd); - - if ((ret = select(fd + 1, &infd, &outfd, &errfd, NULL)) < 0) { - giterr_set(GITERR_OS, "error in select"); - return -1; - } - - return 0; -} - -static ssize_t curls_write(git_stream *stream, const char *data, size_t len, int flags) -{ - int error; - size_t off = 0, sent; - CURLcode res; - curl_stream *s = (curl_stream *) stream; - - GIT_UNUSED(flags); - - do { - if ((error = wait_for(s->socket, false)) < 0) - return error; - - res = curl_easy_send(s->handle, data + off, len - off, &sent); - if (res == CURLE_OK) - off += sent; - } while ((res == CURLE_OK || res == CURLE_AGAIN) && off < len); - - if (res != CURLE_OK) - return seterr_curl(s); - - return len; -} - -static ssize_t curls_read(git_stream *stream, void *data, size_t len) -{ - int error; - size_t read; - CURLcode res; - curl_stream *s = (curl_stream *) stream; - - do { - if ((error = wait_for(s->socket, true)) < 0) - return error; - - res = curl_easy_recv(s->handle, data, len, &read); - } while (res == CURLE_AGAIN); - - if (res != CURLE_OK) - return seterr_curl(s); - - return read; -} - -static int curls_close(git_stream *stream) -{ - curl_stream *s = (curl_stream *) stream; - - if (!s->handle) - return 0; - - curl_easy_cleanup(s->handle); - s->handle = NULL; - s->socket = 0; - - return 0; -} - -static void curls_free(git_stream *stream) -{ - curl_stream *s = (curl_stream *) stream; - - curls_close(stream); - git_strarray_free(&s->cert_info_strings); - git__free(s); -} - -int git_curl_stream_new(git_stream **out, const char *host, const char *port) -{ - curl_stream *st; - CURL *handle; - int iport = 0, error; - - st = git__calloc(1, sizeof(curl_stream)); - GITERR_CHECK_ALLOC(st); - - handle = curl_easy_init(); - if (handle == NULL) { - giterr_set(GITERR_NET, "failed to create curl handle"); - return -1; - } - - if ((error = git__strtol32(&iport, port, NULL, 10)) < 0) - return error; - - curl_easy_setopt(handle, CURLOPT_URL, host); - curl_easy_setopt(handle, CURLOPT_ERRORBUFFER, st->curl_error); - curl_easy_setopt(handle, CURLOPT_PORT, iport); - curl_easy_setopt(handle, CURLOPT_CONNECT_ONLY, 1); - curl_easy_setopt(handle, CURLOPT_SSL_VERIFYPEER, 1); - curl_easy_setopt(handle, CURLOPT_CERTINFO, 1); - curl_easy_setopt(handle, CURLOPT_HTTPPROXYTUNNEL, 1); - - /* curl_easy_setopt(handle, CURLOPT_VERBOSE, 1); */ - - st->parent.version = GIT_STREAM_VERSION; - st->parent.encrypted = 0; /* we don't encrypt ourselves */ - st->parent.proxy_support = 1; - st->parent.connect = curls_connect; - st->parent.certificate = curls_certificate; - st->parent.set_proxy = curls_set_proxy; - st->parent.read = curls_read; - st->parent.write = curls_write; - st->parent.close = curls_close; - st->parent.free = curls_free; - st->handle = handle; - - *out = (git_stream *) st; - return 0; -} - -#else - -#include "stream.h" - -int git_curl_stream_new(git_stream **out, const char *host, const char *port) -{ - GIT_UNUSED(out); - GIT_UNUSED(host); - GIT_UNUSED(port); - - giterr_set(GITERR_NET, "curl is not supported in this version"); - return -1; -} - - -#endif diff --git a/vendor/libgit2/src/curl_stream.h b/vendor/libgit2/src/curl_stream.h deleted file mode 100644 index 283f0fe40e..0000000000 --- a/vendor/libgit2/src/curl_stream.h +++ /dev/null @@ -1,14 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_curl_stream_h__ -#define INCLUDE_curl_stream_h__ - -#include "git2/sys/stream.h" - -extern int git_curl_stream_new(git_stream **out, const char *host, const char *port); - -#endif diff --git a/vendor/libgit2/src/date.c b/vendor/libgit2/src/date.c deleted file mode 100644 index 0e1b31aeed..0000000000 --- a/vendor/libgit2/src/date.c +++ /dev/null @@ -1,904 +0,0 @@ -/* - * GIT - The information manager from hell - * - * Copyright (C) Linus Torvalds, 2005 - */ - -#include "common.h" - -#ifndef GIT_WIN32 -#include -#endif - -#include "util.h" -#include "cache.h" -#include "posix.h" - -#include -#include - -typedef enum { - DATE_NORMAL = 0, - DATE_RELATIVE, - DATE_SHORT, - DATE_LOCAL, - DATE_ISO8601, - DATE_RFC2822, - DATE_RAW -} date_mode; - -/* - * This is like mktime, but without normalization of tm_wday and tm_yday. - */ -static git_time_t tm_to_time_t(const struct tm *tm) -{ - static const int mdays[] = { - 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 - }; - int year = tm->tm_year - 70; - int month = tm->tm_mon; - int day = tm->tm_mday; - - if (year < 0 || year > 129) /* algo only works for 1970-2099 */ - return -1; - if (month < 0 || month > 11) /* array bounds */ - return -1; - if (month < 2 || (year + 2) % 4) - day--; - if (tm->tm_hour < 0 || tm->tm_min < 0 || tm->tm_sec < 0) - return -1; - return (year * 365 + (year + 1) / 4 + mdays[month] + day) * 24*60*60UL + - tm->tm_hour * 60*60 + tm->tm_min * 60 + tm->tm_sec; -} - -static const char *month_names[] = { - "January", "February", "March", "April", "May", "June", - "July", "August", "September", "October", "November", "December" -}; - -static const char *weekday_names[] = { - "Sundays", "Mondays", "Tuesdays", "Wednesdays", "Thursdays", "Fridays", "Saturdays" -}; - - - -/* - * Check these. And note how it doesn't do the summer-time conversion. - * - * In my world, it's always summer, and things are probably a bit off - * in other ways too. - */ -static const struct { - const char *name; - int offset; - int dst; -} timezone_names[] = { - { "IDLW", -12, 0, }, /* International Date Line West */ - { "NT", -11, 0, }, /* Nome */ - { "CAT", -10, 0, }, /* Central Alaska */ - { "HST", -10, 0, }, /* Hawaii Standard */ - { "HDT", -10, 1, }, /* Hawaii Daylight */ - { "YST", -9, 0, }, /* Yukon Standard */ - { "YDT", -9, 1, }, /* Yukon Daylight */ - { "PST", -8, 0, }, /* Pacific Standard */ - { "PDT", -8, 1, }, /* Pacific Daylight */ - { "MST", -7, 0, }, /* Mountain Standard */ - { "MDT", -7, 1, }, /* Mountain Daylight */ - { "CST", -6, 0, }, /* Central Standard */ - { "CDT", -6, 1, }, /* Central Daylight */ - { "EST", -5, 0, }, /* Eastern Standard */ - { "EDT", -5, 1, }, /* Eastern Daylight */ - { "AST", -3, 0, }, /* Atlantic Standard */ - { "ADT", -3, 1, }, /* Atlantic Daylight */ - { "WAT", -1, 0, }, /* West Africa */ - - { "GMT", 0, 0, }, /* Greenwich Mean */ - { "UTC", 0, 0, }, /* Universal (Coordinated) */ - { "Z", 0, 0, }, /* Zulu, alias for UTC */ - - { "WET", 0, 0, }, /* Western European */ - { "BST", 0, 1, }, /* British Summer */ - { "CET", +1, 0, }, /* Central European */ - { "MET", +1, 0, }, /* Middle European */ - { "MEWT", +1, 0, }, /* Middle European Winter */ - { "MEST", +1, 1, }, /* Middle European Summer */ - { "CEST", +1, 1, }, /* Central European Summer */ - { "MESZ", +1, 1, }, /* Middle European Summer */ - { "FWT", +1, 0, }, /* French Winter */ - { "FST", +1, 1, }, /* French Summer */ - { "EET", +2, 0, }, /* Eastern Europe */ - { "EEST", +2, 1, }, /* Eastern European Daylight */ - { "WAST", +7, 0, }, /* West Australian Standard */ - { "WADT", +7, 1, }, /* West Australian Daylight */ - { "CCT", +8, 0, }, /* China Coast */ - { "JST", +9, 0, }, /* Japan Standard */ - { "EAST", +10, 0, }, /* Eastern Australian Standard */ - { "EADT", +10, 1, }, /* Eastern Australian Daylight */ - { "GST", +10, 0, }, /* Guam Standard */ - { "NZT", +12, 0, }, /* New Zealand */ - { "NZST", +12, 0, }, /* New Zealand Standard */ - { "NZDT", +12, 1, }, /* New Zealand Daylight */ - { "IDLE", +12, 0, }, /* International Date Line East */ -}; - -static size_t match_string(const char *date, const char *str) -{ - size_t i = 0; - - for (i = 0; *date; date++, str++, i++) { - if (*date == *str) - continue; - if (toupper(*date) == toupper(*str)) - continue; - if (!isalnum(*date)) - break; - return 0; - } - return i; -} - -static int skip_alpha(const char *date) -{ - int i = 0; - do { - i++; - } while (isalpha(date[i])); - return i; -} - -/* -* Parse month, weekday, or timezone name -*/ -static size_t match_alpha(const char *date, struct tm *tm, int *offset) -{ - unsigned int i; - - for (i = 0; i < 12; i++) { - size_t match = match_string(date, month_names[i]); - if (match >= 3) { - tm->tm_mon = i; - return match; - } - } - - for (i = 0; i < 7; i++) { - size_t match = match_string(date, weekday_names[i]); - if (match >= 3) { - tm->tm_wday = i; - return match; - } - } - - for (i = 0; i < ARRAY_SIZE(timezone_names); i++) { - size_t match = match_string(date, timezone_names[i].name); - if (match >= 3 || match == strlen(timezone_names[i].name)) { - int off = timezone_names[i].offset; - - /* This is bogus, but we like summer */ - off += timezone_names[i].dst; - - /* Only use the tz name offset if we don't have anything better */ - if (*offset == -1) - *offset = 60*off; - - return match; - } - } - - if (match_string(date, "PM") == 2) { - tm->tm_hour = (tm->tm_hour % 12) + 12; - return 2; - } - - if (match_string(date, "AM") == 2) { - tm->tm_hour = (tm->tm_hour % 12) + 0; - return 2; - } - - /* BAD */ - return skip_alpha(date); -} - -static int is_date(int year, int month, int day, struct tm *now_tm, time_t now, struct tm *tm) -{ - if (month > 0 && month < 13 && day > 0 && day < 32) { - struct tm check = *tm; - struct tm *r = (now_tm ? &check : tm); - time_t specified; - - r->tm_mon = month - 1; - r->tm_mday = day; - if (year == -1) { - if (!now_tm) - return 1; - r->tm_year = now_tm->tm_year; - } - else if (year >= 1970 && year < 2100) - r->tm_year = year - 1900; - else if (year > 70 && year < 100) - r->tm_year = year; - else if (year < 38) - r->tm_year = year + 100; - else - return 0; - if (!now_tm) - return 1; - - specified = tm_to_time_t(r); - - /* Be it commit time or author time, it does not make - * sense to specify timestamp way into the future. Make - * sure it is not later than ten days from now... - */ - if (now + 10*24*3600 < specified) - return 0; - tm->tm_mon = r->tm_mon; - tm->tm_mday = r->tm_mday; - if (year != -1) - tm->tm_year = r->tm_year; - return 1; - } - return 0; -} - -static size_t match_multi_number(unsigned long num, char c, const char *date, char *end, struct tm *tm) -{ - time_t now; - struct tm now_tm; - struct tm *refuse_future; - long num2, num3; - - num2 = strtol(end+1, &end, 10); - num3 = -1; - if (*end == c && isdigit(end[1])) - num3 = strtol(end+1, &end, 10); - - /* Time? Date? */ - switch (c) { - case ':': - if (num3 < 0) - num3 = 0; - if (num < 25 && num2 >= 0 && num2 < 60 && num3 >= 0 && num3 <= 60) { - tm->tm_hour = num; - tm->tm_min = num2; - tm->tm_sec = num3; - break; - } - return 0; - - case '-': - case '/': - case '.': - now = time(NULL); - refuse_future = NULL; - if (p_gmtime_r(&now, &now_tm)) - refuse_future = &now_tm; - - if (num > 70) { - /* yyyy-mm-dd? */ - if (is_date(num, num2, num3, refuse_future, now, tm)) - break; - /* yyyy-dd-mm? */ - if (is_date(num, num3, num2, refuse_future, now, tm)) - break; - } - /* Our eastern European friends say dd.mm.yy[yy] - * is the norm there, so giving precedence to - * mm/dd/yy[yy] form only when separator is not '.' - */ - if (c != '.' && - is_date(num3, num, num2, refuse_future, now, tm)) - break; - /* European dd.mm.yy[yy] or funny US dd/mm/yy[yy] */ - if (is_date(num3, num2, num, refuse_future, now, tm)) - break; - /* Funny European mm.dd.yy */ - if (c == '.' && - is_date(num3, num, num2, refuse_future, now, tm)) - break; - return 0; - } - return end - date; -} - -/* - * Have we filled in any part of the time/date yet? - * We just do a binary 'and' to see if the sign bit - * is set in all the values. - */ -static int nodate(struct tm *tm) -{ - return (tm->tm_year & - tm->tm_mon & - tm->tm_mday & - tm->tm_hour & - tm->tm_min & - tm->tm_sec) < 0; -} - -/* - * We've seen a digit. Time? Year? Date? - */ -static size_t match_digit(const char *date, struct tm *tm, int *offset, int *tm_gmt) -{ - size_t n; - char *end; - unsigned long num; - - num = strtoul(date, &end, 10); - - /* - * Seconds since 1970? We trigger on that for any numbers with - * more than 8 digits. This is because we don't want to rule out - * numbers like 20070606 as a YYYYMMDD date. - */ - if (num >= 100000000 && nodate(tm)) { - time_t time = num; - if (p_gmtime_r(&time, tm)) { - *tm_gmt = 1; - return end - date; - } - } - - /* - * Check for special formats: num[-.:/]num[same]num - */ - switch (*end) { - case ':': - case '.': - case '/': - case '-': - if (isdigit(end[1])) { - size_t match = match_multi_number(num, *end, date, end, tm); - if (match) - return match; - } - } - - /* - * None of the special formats? Try to guess what - * the number meant. We use the number of digits - * to make a more educated guess.. - */ - n = 0; - do { - n++; - } while (isdigit(date[n])); - - /* Four-digit year or a timezone? */ - if (n == 4) { - if (num <= 1400 && *offset == -1) { - unsigned int minutes = num % 100; - unsigned int hours = num / 100; - *offset = hours*60 + minutes; - } else if (num > 1900 && num < 2100) - tm->tm_year = num - 1900; - return n; - } - - /* - * Ignore lots of numerals. We took care of 4-digit years above. - * Days or months must be one or two digits. - */ - if (n > 2) - return n; - - /* - * NOTE! We will give precedence to day-of-month over month or - * year numbers in the 1-12 range. So 05 is always "mday 5", - * unless we already have a mday.. - * - * IOW, 01 Apr 05 parses as "April 1st, 2005". - */ - if (num > 0 && num < 32 && tm->tm_mday < 0) { - tm->tm_mday = num; - return n; - } - - /* Two-digit year? */ - if (n == 2 && tm->tm_year < 0) { - if (num < 10 && tm->tm_mday >= 0) { - tm->tm_year = num + 100; - return n; - } - if (num >= 70) { - tm->tm_year = num; - return n; - } - } - - if (num > 0 && num < 13 && tm->tm_mon < 0) - tm->tm_mon = num-1; - - return n; -} - -static size_t match_tz(const char *date, int *offp) -{ - char *end; - int hour = strtoul(date + 1, &end, 10); - size_t n = end - (date + 1); - int min = 0; - - if (n == 4) { - /* hhmm */ - min = hour % 100; - hour = hour / 100; - } else if (n != 2) { - min = 99; /* random stuff */ - } else if (*end == ':') { - /* hh:mm? */ - min = strtoul(end + 1, &end, 10); - if (end - (date + 1) != 5) - min = 99; /* random stuff */ - } /* otherwise we parsed "hh" */ - - /* - * Don't accept any random stuff. Even though some places have - * offset larger than 12 hours (e.g. Pacific/Kiritimati is at - * UTC+14), there is something wrong if hour part is much - * larger than that. We might also want to check that the - * minutes are divisible by 15 or something too. (Offset of - * Kathmandu, Nepal is UTC+5:45) - */ - if (min < 60 && hour < 24) { - int offset = hour * 60 + min; - if (*date == '-') - offset = -offset; - *offp = offset; - } - return end - date; -} - -/* - * Parse a string like "0 +0000" as ancient timestamp near epoch, but - * only when it appears not as part of any other string. - */ -static int match_object_header_date(const char *date, git_time_t *timestamp, int *offset) -{ - char *end; - unsigned long stamp; - int ofs; - - if (*date < '0' || '9' <= *date) - return -1; - stamp = strtoul(date, &end, 10); - if (*end != ' ' || stamp == ULONG_MAX || (end[1] != '+' && end[1] != '-')) - return -1; - date = end + 2; - ofs = strtol(date, &end, 10); - if ((*end != '\0' && (*end != '\n')) || end != date + 4) - return -1; - ofs = (ofs / 100) * 60 + (ofs % 100); - if (date[-1] == '-') - ofs = -ofs; - *timestamp = stamp; - *offset = ofs; - return 0; -} - -/* Gr. strptime is crap for this; it doesn't have a way to require RFC2822 - (i.e. English) day/month names, and it doesn't work correctly with %z. */ -static int parse_date_basic(const char *date, git_time_t *timestamp, int *offset) -{ - struct tm tm; - int tm_gmt; - git_time_t dummy_timestamp; - int dummy_offset; - - if (!timestamp) - timestamp = &dummy_timestamp; - if (!offset) - offset = &dummy_offset; - - memset(&tm, 0, sizeof(tm)); - tm.tm_year = -1; - tm.tm_mon = -1; - tm.tm_mday = -1; - tm.tm_isdst = -1; - tm.tm_hour = -1; - tm.tm_min = -1; - tm.tm_sec = -1; - *offset = -1; - tm_gmt = 0; - - if (*date == '@' && - !match_object_header_date(date + 1, timestamp, offset)) - return 0; /* success */ - for (;;) { - size_t match = 0; - unsigned char c = *date; - - /* Stop at end of string or newline */ - if (!c || c == '\n') - break; - - if (isalpha(c)) - match = match_alpha(date, &tm, offset); - else if (isdigit(c)) - match = match_digit(date, &tm, offset, &tm_gmt); - else if ((c == '-' || c == '+') && isdigit(date[1])) - match = match_tz(date, offset); - - if (!match) { - /* BAD */ - match = 1; - } - - date += match; - } - - /* mktime uses local timezone */ - *timestamp = tm_to_time_t(&tm); - if (*offset == -1) - *offset = (int)((time_t)*timestamp - mktime(&tm)) / 60; - - if (*timestamp == (git_time_t)-1) - return -1; - - if (!tm_gmt) - *timestamp -= *offset * 60; - return 0; /* success */ -} - - -/* - * Relative time update (eg "2 days ago"). If we haven't set the time - * yet, we need to set it from current time. - */ -static git_time_t update_tm(struct tm *tm, struct tm *now, unsigned long sec) -{ - time_t n; - - if (tm->tm_mday < 0) - tm->tm_mday = now->tm_mday; - if (tm->tm_mon < 0) - tm->tm_mon = now->tm_mon; - if (tm->tm_year < 0) { - tm->tm_year = now->tm_year; - if (tm->tm_mon > now->tm_mon) - tm->tm_year--; - } - - n = mktime(tm) - sec; - p_localtime_r(&n, tm); - return n; -} - -static void date_now(struct tm *tm, struct tm *now, int *num) -{ - GIT_UNUSED(num); - update_tm(tm, now, 0); -} - -static void date_yesterday(struct tm *tm, struct tm *now, int *num) -{ - GIT_UNUSED(num); - update_tm(tm, now, 24*60*60); -} - -static void date_time(struct tm *tm, struct tm *now, int hour) -{ - if (tm->tm_hour < hour) - date_yesterday(tm, now, NULL); - tm->tm_hour = hour; - tm->tm_min = 0; - tm->tm_sec = 0; -} - -static void date_midnight(struct tm *tm, struct tm *now, int *num) -{ - GIT_UNUSED(num); - date_time(tm, now, 0); -} - -static void date_noon(struct tm *tm, struct tm *now, int *num) -{ - GIT_UNUSED(num); - date_time(tm, now, 12); -} - -static void date_tea(struct tm *tm, struct tm *now, int *num) -{ - GIT_UNUSED(num); - date_time(tm, now, 17); -} - -static void date_pm(struct tm *tm, struct tm *now, int *num) -{ - int hour, n = *num; - *num = 0; - GIT_UNUSED(now); - - hour = tm->tm_hour; - if (n) { - hour = n; - tm->tm_min = 0; - tm->tm_sec = 0; - } - tm->tm_hour = (hour % 12) + 12; -} - -static void date_am(struct tm *tm, struct tm *now, int *num) -{ - int hour, n = *num; - *num = 0; - GIT_UNUSED(now); - - hour = tm->tm_hour; - if (n) { - hour = n; - tm->tm_min = 0; - tm->tm_sec = 0; - } - tm->tm_hour = (hour % 12); -} - -static void date_never(struct tm *tm, struct tm *now, int *num) -{ - time_t n = 0; - GIT_UNUSED(now); - GIT_UNUSED(num); - p_localtime_r(&n, tm); -} - -static const struct special { - const char *name; - void (*fn)(struct tm *, struct tm *, int *); -} special[] = { - { "yesterday", date_yesterday }, - { "noon", date_noon }, - { "midnight", date_midnight }, - { "tea", date_tea }, - { "PM", date_pm }, - { "AM", date_am }, - { "never", date_never }, - { "now", date_now }, - { NULL } -}; - -static const char *number_name[] = { - "zero", "one", "two", "three", "four", - "five", "six", "seven", "eight", "nine", "ten", -}; - -static const struct typelen { - const char *type; - int length; -} typelen[] = { - { "seconds", 1 }, - { "minutes", 60 }, - { "hours", 60*60 }, - { "days", 24*60*60 }, - { "weeks", 7*24*60*60 }, - { NULL } -}; - -static const char *approxidate_alpha(const char *date, struct tm *tm, struct tm *now, int *num, int *touched) -{ - const struct typelen *tl; - const struct special *s; - const char *end = date; - int i; - - while (isalpha(*++end)) - /* scan to non-alpha */; - - for (i = 0; i < 12; i++) { - size_t match = match_string(date, month_names[i]); - if (match >= 3) { - tm->tm_mon = i; - *touched = 1; - return end; - } - } - - for (s = special; s->name; s++) { - size_t len = strlen(s->name); - if (match_string(date, s->name) == len) { - s->fn(tm, now, num); - *touched = 1; - return end; - } - } - - if (!*num) { - for (i = 1; i < 11; i++) { - size_t len = strlen(number_name[i]); - if (match_string(date, number_name[i]) == len) { - *num = i; - *touched = 1; - return end; - } - } - if (match_string(date, "last") == 4) { - *num = 1; - *touched = 1; - } - return end; - } - - tl = typelen; - while (tl->type) { - size_t len = strlen(tl->type); - if (match_string(date, tl->type) >= len-1) { - update_tm(tm, now, tl->length * *num); - *num = 0; - *touched = 1; - return end; - } - tl++; - } - - for (i = 0; i < 7; i++) { - size_t match = match_string(date, weekday_names[i]); - if (match >= 3) { - int diff, n = *num -1; - *num = 0; - - diff = tm->tm_wday - i; - if (diff <= 0) - n++; - diff += 7*n; - - update_tm(tm, now, diff * 24 * 60 * 60); - *touched = 1; - return end; - } - } - - if (match_string(date, "months") >= 5) { - int n; - update_tm(tm, now, 0); /* fill in date fields if needed */ - n = tm->tm_mon - *num; - *num = 0; - while (n < 0) { - n += 12; - tm->tm_year--; - } - tm->tm_mon = n; - *touched = 1; - return end; - } - - if (match_string(date, "years") >= 4) { - update_tm(tm, now, 0); /* fill in date fields if needed */ - tm->tm_year -= *num; - *num = 0; - *touched = 1; - return end; - } - - return end; -} - -static const char *approxidate_digit(const char *date, struct tm *tm, int *num) -{ - char *end; - unsigned long number = strtoul(date, &end, 10); - - switch (*end) { - case ':': - case '.': - case '/': - case '-': - if (isdigit(end[1])) { - size_t match = match_multi_number(number, *end, date, end, tm); - if (match) - return date + match; - } - } - - /* Accept zero-padding only for small numbers ("Dec 02", never "Dec 0002") */ - if (date[0] != '0' || end - date <= 2) - *num = number; - return end; -} - -/* - * Do we have a pending number at the end, or when - * we see a new one? Let's assume it's a month day, - * as in "Dec 6, 1992" - */ -static void pending_number(struct tm *tm, int *num) -{ - int number = *num; - - if (number) { - *num = 0; - if (tm->tm_mday < 0 && number < 32) - tm->tm_mday = number; - else if (tm->tm_mon < 0 && number < 13) - tm->tm_mon = number-1; - else if (tm->tm_year < 0) { - if (number > 1969 && number < 2100) - tm->tm_year = number - 1900; - else if (number > 69 && number < 100) - tm->tm_year = number; - else if (number < 38) - tm->tm_year = 100 + number; - /* We mess up for number = 00 ? */ - } - } -} - -static git_time_t approxidate_str(const char *date, - time_t time_sec, - int *error_ret) -{ - int number = 0; - int touched = 0; - struct tm tm = {0}, now; - - p_localtime_r(&time_sec, &tm); - now = tm; - - tm.tm_year = -1; - tm.tm_mon = -1; - tm.tm_mday = -1; - - for (;;) { - unsigned char c = *date; - if (!c) - break; - date++; - if (isdigit(c)) { - pending_number(&tm, &number); - date = approxidate_digit(date-1, &tm, &number); - touched = 1; - continue; - } - if (isalpha(c)) - date = approxidate_alpha(date-1, &tm, &now, &number, &touched); - } - pending_number(&tm, &number); - if (!touched) - *error_ret = 1; - return update_tm(&tm, &now, 0); -} - -int git__date_parse(git_time_t *out, const char *date) -{ - time_t time_sec; - git_time_t timestamp; - int offset, error_ret=0; - - if (!parse_date_basic(date, ×tamp, &offset)) { - *out = timestamp; - return 0; - } - - if (time(&time_sec) == -1) - return -1; - - *out = approxidate_str(date, time_sec, &error_ret); - return error_ret; -} - -int git__date_rfc2822_fmt(char *out, size_t len, const git_time *date) -{ - int written; - struct tm gmt; - time_t t; - - assert(out && date); - - t = (time_t) (date->time + date->offset * 60); - - if (p_gmtime_r (&t, &gmt) == NULL) - return -1; - - written = p_snprintf(out, len, "%.3s, %u %.3s %.4u %02u:%02u:%02u %+03d%02d", - weekday_names[gmt.tm_wday], - gmt.tm_mday, - month_names[gmt.tm_mon], - gmt.tm_year + 1900, - gmt.tm_hour, gmt.tm_min, gmt.tm_sec, - date->offset / 60, date->offset % 60); - - if (written < 0 || (written > (int) len - 1)) - return -1; - - return 0; -} - diff --git a/vendor/libgit2/src/delta-apply.c b/vendor/libgit2/src/delta-apply.c deleted file mode 100644 index 89745faa01..0000000000 --- a/vendor/libgit2/src/delta-apply.c +++ /dev/null @@ -1,135 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#include "common.h" -#include "git2/odb.h" -#include "delta-apply.h" - -/* - * This file was heavily cribbed from BinaryDelta.java in JGit, which - * itself was heavily cribbed from patch-delta.c in the - * GIT project. The original delta patching code was written by - * Nicolas Pitre . - */ - -static int hdr_sz( - size_t *size, - const unsigned char **delta, - const unsigned char *end) -{ - const unsigned char *d = *delta; - size_t r = 0; - unsigned int c, shift = 0; - - do { - if (d == end) - return -1; - c = *d++; - r |= (c & 0x7f) << shift; - shift += 7; - } while (c & 0x80); - *delta = d; - *size = r; - return 0; -} - -int git__delta_read_header( - const unsigned char *delta, - size_t delta_len, - size_t *base_sz, - size_t *res_sz) -{ - const unsigned char *delta_end = delta + delta_len; - if ((hdr_sz(base_sz, &delta, delta_end) < 0) || - (hdr_sz(res_sz, &delta, delta_end) < 0)) - return -1; - return 0; -} - -int git__delta_apply( - git_rawobj *out, - const unsigned char *base, - size_t base_len, - const unsigned char *delta, - size_t delta_len) -{ - const unsigned char *delta_end = delta + delta_len; - size_t base_sz, res_sz, alloc_sz; - unsigned char *res_dp; - - /* Check that the base size matches the data we were given; - * if not we would underflow while accessing data from the - * base object, resulting in data corruption or segfault. - */ - if ((hdr_sz(&base_sz, &delta, delta_end) < 0) || (base_sz != base_len)) { - giterr_set(GITERR_INVALID, "Failed to apply delta. Base size does not match given data"); - return -1; - } - - if (hdr_sz(&res_sz, &delta, delta_end) < 0) { - giterr_set(GITERR_INVALID, "Failed to apply delta. Base size does not match given data"); - return -1; - } - - GITERR_CHECK_ALLOC_ADD(&alloc_sz, res_sz, 1); - res_dp = git__malloc(alloc_sz); - GITERR_CHECK_ALLOC(res_dp); - - res_dp[res_sz] = '\0'; - out->data = res_dp; - out->len = res_sz; - - while (delta < delta_end) { - unsigned char cmd = *delta++; - if (cmd & 0x80) { - /* cmd is a copy instruction; copy from the base. - */ - size_t off = 0, len = 0; - - if (cmd & 0x01) off = *delta++; - if (cmd & 0x02) off |= *delta++ << 8; - if (cmd & 0x04) off |= *delta++ << 16; - if (cmd & 0x08) off |= *delta++ << 24; - - if (cmd & 0x10) len = *delta++; - if (cmd & 0x20) len |= *delta++ << 8; - if (cmd & 0x40) len |= *delta++ << 16; - if (!len) len = 0x10000; - - if (base_len < off + len || res_sz < len) - goto fail; - memcpy(res_dp, base + off, len); - res_dp += len; - res_sz -= len; - - } else if (cmd) { - /* cmd is a literal insert instruction; copy from - * the delta stream itself. - */ - if (delta_end - delta < cmd || res_sz < cmd) - goto fail; - memcpy(res_dp, delta, cmd); - delta += cmd; - res_dp += cmd; - res_sz -= cmd; - - } else { - /* cmd == 0 is reserved for future encodings. - */ - goto fail; - } - } - - if (delta != delta_end || res_sz) - goto fail; - return 0; - -fail: - git__free(out->data); - out->data = NULL; - giterr_set(GITERR_INVALID, "Failed to apply delta"); - return -1; -} diff --git a/vendor/libgit2/src/delta-apply.h b/vendor/libgit2/src/delta-apply.h deleted file mode 100644 index d7d99d04c2..0000000000 --- a/vendor/libgit2/src/delta-apply.h +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_delta_apply_h__ -#define INCLUDE_delta_apply_h__ - -#include "odb.h" - -/** - * Apply a git binary delta to recover the original content. - * - * @param out the output buffer to receive the original data. - * Only out->data and out->len are populated, as this is - * the only information available in the delta. - * @param base the base to copy from during copy instructions. - * @param base_len number of bytes available at base. - * @param delta the delta to execute copy/insert instructions from. - * @param delta_len total number of bytes in the delta. - * @return - * - 0 on a successful delta unpack. - * - GIT_ERROR if the delta is corrupt or doesn't match the base. - */ -extern int git__delta_apply( - git_rawobj *out, - const unsigned char *base, - size_t base_len, - const unsigned char *delta, - size_t delta_len); - -/** - * Read the header of a git binary delta. - * - * @param delta the delta to execute copy/insert instructions from. - * @param delta_len total number of bytes in the delta. - * @param base_sz pointer to store the base size field. - * @param res_sz pointer to store the result size field. - * @return - * - 0 on a successful decoding the header. - * - GIT_ERROR if the delta is corrupt. - */ -extern int git__delta_read_header( - const unsigned char *delta, - size_t delta_len, - size_t *base_sz, - size_t *res_sz); - -#endif diff --git a/vendor/libgit2/src/delta.c b/vendor/libgit2/src/delta.c deleted file mode 100644 index d72d820d84..0000000000 --- a/vendor/libgit2/src/delta.c +++ /dev/null @@ -1,443 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#include "delta.h" - -/* maximum hash entry list for the same hash bucket */ -#define HASH_LIMIT 64 - -#define RABIN_SHIFT 23 -#define RABIN_WINDOW 16 - -static const unsigned int T[256] = { - 0x00000000, 0xab59b4d1, 0x56b369a2, 0xfdeadd73, 0x063f6795, 0xad66d344, - 0x508c0e37, 0xfbd5bae6, 0x0c7ecf2a, 0xa7277bfb, 0x5acda688, 0xf1941259, - 0x0a41a8bf, 0xa1181c6e, 0x5cf2c11d, 0xf7ab75cc, 0x18fd9e54, 0xb3a42a85, - 0x4e4ef7f6, 0xe5174327, 0x1ec2f9c1, 0xb59b4d10, 0x48719063, 0xe32824b2, - 0x1483517e, 0xbfdae5af, 0x423038dc, 0xe9698c0d, 0x12bc36eb, 0xb9e5823a, - 0x440f5f49, 0xef56eb98, 0x31fb3ca8, 0x9aa28879, 0x6748550a, 0xcc11e1db, - 0x37c45b3d, 0x9c9defec, 0x6177329f, 0xca2e864e, 0x3d85f382, 0x96dc4753, - 0x6b369a20, 0xc06f2ef1, 0x3bba9417, 0x90e320c6, 0x6d09fdb5, 0xc6504964, - 0x2906a2fc, 0x825f162d, 0x7fb5cb5e, 0xd4ec7f8f, 0x2f39c569, 0x846071b8, - 0x798aaccb, 0xd2d3181a, 0x25786dd6, 0x8e21d907, 0x73cb0474, 0xd892b0a5, - 0x23470a43, 0x881ebe92, 0x75f463e1, 0xdeadd730, 0x63f67950, 0xc8afcd81, - 0x354510f2, 0x9e1ca423, 0x65c91ec5, 0xce90aa14, 0x337a7767, 0x9823c3b6, - 0x6f88b67a, 0xc4d102ab, 0x393bdfd8, 0x92626b09, 0x69b7d1ef, 0xc2ee653e, - 0x3f04b84d, 0x945d0c9c, 0x7b0be704, 0xd05253d5, 0x2db88ea6, 0x86e13a77, - 0x7d348091, 0xd66d3440, 0x2b87e933, 0x80de5de2, 0x7775282e, 0xdc2c9cff, - 0x21c6418c, 0x8a9ff55d, 0x714a4fbb, 0xda13fb6a, 0x27f92619, 0x8ca092c8, - 0x520d45f8, 0xf954f129, 0x04be2c5a, 0xafe7988b, 0x5432226d, 0xff6b96bc, - 0x02814bcf, 0xa9d8ff1e, 0x5e738ad2, 0xf52a3e03, 0x08c0e370, 0xa39957a1, - 0x584ced47, 0xf3155996, 0x0eff84e5, 0xa5a63034, 0x4af0dbac, 0xe1a96f7d, - 0x1c43b20e, 0xb71a06df, 0x4ccfbc39, 0xe79608e8, 0x1a7cd59b, 0xb125614a, - 0x468e1486, 0xedd7a057, 0x103d7d24, 0xbb64c9f5, 0x40b17313, 0xebe8c7c2, - 0x16021ab1, 0xbd5bae60, 0x6cb54671, 0xc7ecf2a0, 0x3a062fd3, 0x915f9b02, - 0x6a8a21e4, 0xc1d39535, 0x3c394846, 0x9760fc97, 0x60cb895b, 0xcb923d8a, - 0x3678e0f9, 0x9d215428, 0x66f4eece, 0xcdad5a1f, 0x3047876c, 0x9b1e33bd, - 0x7448d825, 0xdf116cf4, 0x22fbb187, 0x89a20556, 0x7277bfb0, 0xd92e0b61, - 0x24c4d612, 0x8f9d62c3, 0x7836170f, 0xd36fa3de, 0x2e857ead, 0x85dcca7c, - 0x7e09709a, 0xd550c44b, 0x28ba1938, 0x83e3ade9, 0x5d4e7ad9, 0xf617ce08, - 0x0bfd137b, 0xa0a4a7aa, 0x5b711d4c, 0xf028a99d, 0x0dc274ee, 0xa69bc03f, - 0x5130b5f3, 0xfa690122, 0x0783dc51, 0xacda6880, 0x570fd266, 0xfc5666b7, - 0x01bcbbc4, 0xaae50f15, 0x45b3e48d, 0xeeea505c, 0x13008d2f, 0xb85939fe, - 0x438c8318, 0xe8d537c9, 0x153feaba, 0xbe665e6b, 0x49cd2ba7, 0xe2949f76, - 0x1f7e4205, 0xb427f6d4, 0x4ff24c32, 0xe4abf8e3, 0x19412590, 0xb2189141, - 0x0f433f21, 0xa41a8bf0, 0x59f05683, 0xf2a9e252, 0x097c58b4, 0xa225ec65, - 0x5fcf3116, 0xf49685c7, 0x033df00b, 0xa86444da, 0x558e99a9, 0xfed72d78, - 0x0502979e, 0xae5b234f, 0x53b1fe3c, 0xf8e84aed, 0x17bea175, 0xbce715a4, - 0x410dc8d7, 0xea547c06, 0x1181c6e0, 0xbad87231, 0x4732af42, 0xec6b1b93, - 0x1bc06e5f, 0xb099da8e, 0x4d7307fd, 0xe62ab32c, 0x1dff09ca, 0xb6a6bd1b, - 0x4b4c6068, 0xe015d4b9, 0x3eb80389, 0x95e1b758, 0x680b6a2b, 0xc352defa, - 0x3887641c, 0x93ded0cd, 0x6e340dbe, 0xc56db96f, 0x32c6cca3, 0x999f7872, - 0x6475a501, 0xcf2c11d0, 0x34f9ab36, 0x9fa01fe7, 0x624ac294, 0xc9137645, - 0x26459ddd, 0x8d1c290c, 0x70f6f47f, 0xdbaf40ae, 0x207afa48, 0x8b234e99, - 0x76c993ea, 0xdd90273b, 0x2a3b52f7, 0x8162e626, 0x7c883b55, 0xd7d18f84, - 0x2c043562, 0x875d81b3, 0x7ab75cc0, 0xd1eee811 -}; - -static const unsigned int U[256] = { - 0x00000000, 0x7eb5200d, 0x5633f4cb, 0x2886d4c6, 0x073e5d47, 0x798b7d4a, - 0x510da98c, 0x2fb88981, 0x0e7cba8e, 0x70c99a83, 0x584f4e45, 0x26fa6e48, - 0x0942e7c9, 0x77f7c7c4, 0x5f711302, 0x21c4330f, 0x1cf9751c, 0x624c5511, - 0x4aca81d7, 0x347fa1da, 0x1bc7285b, 0x65720856, 0x4df4dc90, 0x3341fc9d, - 0x1285cf92, 0x6c30ef9f, 0x44b63b59, 0x3a031b54, 0x15bb92d5, 0x6b0eb2d8, - 0x4388661e, 0x3d3d4613, 0x39f2ea38, 0x4747ca35, 0x6fc11ef3, 0x11743efe, - 0x3eccb77f, 0x40799772, 0x68ff43b4, 0x164a63b9, 0x378e50b6, 0x493b70bb, - 0x61bda47d, 0x1f088470, 0x30b00df1, 0x4e052dfc, 0x6683f93a, 0x1836d937, - 0x250b9f24, 0x5bbebf29, 0x73386bef, 0x0d8d4be2, 0x2235c263, 0x5c80e26e, - 0x740636a8, 0x0ab316a5, 0x2b7725aa, 0x55c205a7, 0x7d44d161, 0x03f1f16c, - 0x2c4978ed, 0x52fc58e0, 0x7a7a8c26, 0x04cfac2b, 0x73e5d470, 0x0d50f47d, - 0x25d620bb, 0x5b6300b6, 0x74db8937, 0x0a6ea93a, 0x22e87dfc, 0x5c5d5df1, - 0x7d996efe, 0x032c4ef3, 0x2baa9a35, 0x551fba38, 0x7aa733b9, 0x041213b4, - 0x2c94c772, 0x5221e77f, 0x6f1ca16c, 0x11a98161, 0x392f55a7, 0x479a75aa, - 0x6822fc2b, 0x1697dc26, 0x3e1108e0, 0x40a428ed, 0x61601be2, 0x1fd53bef, - 0x3753ef29, 0x49e6cf24, 0x665e46a5, 0x18eb66a8, 0x306db26e, 0x4ed89263, - 0x4a173e48, 0x34a21e45, 0x1c24ca83, 0x6291ea8e, 0x4d29630f, 0x339c4302, - 0x1b1a97c4, 0x65afb7c9, 0x446b84c6, 0x3adea4cb, 0x1258700d, 0x6ced5000, - 0x4355d981, 0x3de0f98c, 0x15662d4a, 0x6bd30d47, 0x56ee4b54, 0x285b6b59, - 0x00ddbf9f, 0x7e689f92, 0x51d01613, 0x2f65361e, 0x07e3e2d8, 0x7956c2d5, - 0x5892f1da, 0x2627d1d7, 0x0ea10511, 0x7014251c, 0x5facac9d, 0x21198c90, - 0x099f5856, 0x772a785b, 0x4c921c31, 0x32273c3c, 0x1aa1e8fa, 0x6414c8f7, - 0x4bac4176, 0x3519617b, 0x1d9fb5bd, 0x632a95b0, 0x42eea6bf, 0x3c5b86b2, - 0x14dd5274, 0x6a687279, 0x45d0fbf8, 0x3b65dbf5, 0x13e30f33, 0x6d562f3e, - 0x506b692d, 0x2ede4920, 0x06589de6, 0x78edbdeb, 0x5755346a, 0x29e01467, - 0x0166c0a1, 0x7fd3e0ac, 0x5e17d3a3, 0x20a2f3ae, 0x08242768, 0x76910765, - 0x59298ee4, 0x279caee9, 0x0f1a7a2f, 0x71af5a22, 0x7560f609, 0x0bd5d604, - 0x235302c2, 0x5de622cf, 0x725eab4e, 0x0ceb8b43, 0x246d5f85, 0x5ad87f88, - 0x7b1c4c87, 0x05a96c8a, 0x2d2fb84c, 0x539a9841, 0x7c2211c0, 0x029731cd, - 0x2a11e50b, 0x54a4c506, 0x69998315, 0x172ca318, 0x3faa77de, 0x411f57d3, - 0x6ea7de52, 0x1012fe5f, 0x38942a99, 0x46210a94, 0x67e5399b, 0x19501996, - 0x31d6cd50, 0x4f63ed5d, 0x60db64dc, 0x1e6e44d1, 0x36e89017, 0x485db01a, - 0x3f77c841, 0x41c2e84c, 0x69443c8a, 0x17f11c87, 0x38499506, 0x46fcb50b, - 0x6e7a61cd, 0x10cf41c0, 0x310b72cf, 0x4fbe52c2, 0x67388604, 0x198da609, - 0x36352f88, 0x48800f85, 0x6006db43, 0x1eb3fb4e, 0x238ebd5d, 0x5d3b9d50, - 0x75bd4996, 0x0b08699b, 0x24b0e01a, 0x5a05c017, 0x728314d1, 0x0c3634dc, - 0x2df207d3, 0x534727de, 0x7bc1f318, 0x0574d315, 0x2acc5a94, 0x54797a99, - 0x7cffae5f, 0x024a8e52, 0x06852279, 0x78300274, 0x50b6d6b2, 0x2e03f6bf, - 0x01bb7f3e, 0x7f0e5f33, 0x57888bf5, 0x293dabf8, 0x08f998f7, 0x764cb8fa, - 0x5eca6c3c, 0x207f4c31, 0x0fc7c5b0, 0x7172e5bd, 0x59f4317b, 0x27411176, - 0x1a7c5765, 0x64c97768, 0x4c4fa3ae, 0x32fa83a3, 0x1d420a22, 0x63f72a2f, - 0x4b71fee9, 0x35c4dee4, 0x1400edeb, 0x6ab5cde6, 0x42331920, 0x3c86392d, - 0x133eb0ac, 0x6d8b90a1, 0x450d4467, 0x3bb8646a -}; - -struct index_entry { - const unsigned char *ptr; - unsigned int val; - struct index_entry *next; -}; - -struct git_delta_index { - unsigned long memsize; - const void *src_buf; - unsigned long src_size; - unsigned int hash_mask; - struct index_entry *hash[GIT_FLEX_ARRAY]; -}; - -static int lookup_index_alloc( - void **out, unsigned long *out_len, size_t entries, size_t hash_count) -{ - size_t entries_len, hash_len, index_len; - - GITERR_CHECK_ALLOC_MULTIPLY(&entries_len, entries, sizeof(struct index_entry)); - GITERR_CHECK_ALLOC_MULTIPLY(&hash_len, hash_count, sizeof(struct index_entry *)); - - GITERR_CHECK_ALLOC_ADD(&index_len, sizeof(struct git_delta_index), entries_len); - GITERR_CHECK_ALLOC_ADD(&index_len, index_len, hash_len); - - if (!git__is_ulong(index_len)) { - giterr_set(GITERR_NOMEMORY, "Overly large delta"); - return -1; - } - - *out = git__malloc(index_len); - GITERR_CHECK_ALLOC(*out); - - *out_len = index_len; - return 0; -} - -struct git_delta_index * -git_delta_create_index(const void *buf, unsigned long bufsize) -{ - unsigned int i, hsize, hmask, entries, prev_val, *hash_count; - const unsigned char *data, *buffer = buf; - struct git_delta_index *index; - struct index_entry *entry, **hash; - void *mem; - unsigned long memsize; - - if (!buf || !bufsize) - return NULL; - - /* Determine index hash size. Note that indexing skips the - first byte to allow for optimizing the rabin polynomial - initialization in create_delta(). */ - entries = (unsigned int)(bufsize - 1) / RABIN_WINDOW; - if (bufsize >= 0xffffffffUL) { - /* - * Current delta format can't encode offsets into - * reference buffer with more than 32 bits. - */ - entries = 0xfffffffeU / RABIN_WINDOW; - } - hsize = entries / 4; - for (i = 4; i < 31 && (1u << i) < hsize; i++); - hsize = 1 << i; - hmask = hsize - 1; - - if (lookup_index_alloc(&mem, &memsize, entries, hsize) < 0) - return NULL; - - index = mem; - mem = index->hash; - hash = mem; - mem = hash + hsize; - entry = mem; - - index->memsize = memsize; - index->src_buf = buf; - index->src_size = bufsize; - index->hash_mask = hmask; - memset(hash, 0, hsize * sizeof(*hash)); - - /* allocate an array to count hash entries */ - hash_count = git__calloc(hsize, sizeof(*hash_count)); - if (!hash_count) { - git__free(index); - return NULL; - } - - /* then populate the index */ - prev_val = ~0; - for (data = buffer + entries * RABIN_WINDOW - RABIN_WINDOW; - data >= buffer; - data -= RABIN_WINDOW) { - unsigned int val = 0; - for (i = 1; i <= RABIN_WINDOW; i++) - val = ((val << 8) | data[i]) ^ T[val >> RABIN_SHIFT]; - if (val == prev_val) { - /* keep the lowest of consecutive identical blocks */ - entry[-1].ptr = data + RABIN_WINDOW; - } else { - prev_val = val; - i = val & hmask; - entry->ptr = data + RABIN_WINDOW; - entry->val = val; - entry->next = hash[i]; - hash[i] = entry++; - hash_count[i]++; - } - } - - /* - * Determine a limit on the number of entries in the same hash - * bucket. This guard us against patological data sets causing - * really bad hash distribution with most entries in the same hash - * bucket that would bring us to O(m*n) computing costs (m and n - * corresponding to reference and target buffer sizes). - * - * Make sure none of the hash buckets has more entries than - * we're willing to test. Otherwise we cull the entry list - * uniformly to still preserve a good repartition across - * the reference buffer. - */ - for (i = 0; i < hsize; i++) { - if (hash_count[i] < HASH_LIMIT) - continue; - - entry = hash[i]; - do { - struct index_entry *keep = entry; - int skip = hash_count[i] / HASH_LIMIT / 2; - do { - entry = entry->next; - } while(--skip && entry); - keep->next = entry; - } while (entry); - } - git__free(hash_count); - - return index; -} - -void git_delta_free_index(struct git_delta_index *index) -{ - git__free(index); -} - -unsigned long git_delta_sizeof_index(struct git_delta_index *index) -{ - if (index) - return index->memsize; - else - return 0; -} - -/* - * The maximum size for any opcode sequence, including the initial header - * plus rabin window plus biggest copy. - */ -#define MAX_OP_SIZE (5 + 5 + 1 + RABIN_WINDOW + 7) - -void * -git_delta_create( - const struct git_delta_index *index, - const void *trg_buf, - unsigned long trg_size, - unsigned long *delta_size, - unsigned long max_size) -{ - unsigned int i, outpos, outsize, moff, msize, val; - int inscnt; - const unsigned char *ref_data, *ref_top, *data, *top; - unsigned char *out; - - if (!trg_buf || !trg_size) - return NULL; - - outpos = 0; - outsize = 8192; - if (max_size && outsize >= max_size) - outsize = (unsigned int)(max_size + MAX_OP_SIZE + 1); - out = git__malloc(outsize); - if (!out) - return NULL; - - /* store reference buffer size */ - i = index->src_size; - while (i >= 0x80) { - out[outpos++] = i | 0x80; - i >>= 7; - } - out[outpos++] = i; - - /* store target buffer size */ - i = trg_size; - while (i >= 0x80) { - out[outpos++] = i | 0x80; - i >>= 7; - } - out[outpos++] = i; - - ref_data = index->src_buf; - ref_top = ref_data + index->src_size; - data = trg_buf; - top = (const unsigned char *) trg_buf + trg_size; - - outpos++; - val = 0; - for (i = 0; i < RABIN_WINDOW && data < top; i++, data++) { - out[outpos++] = *data; - val = ((val << 8) | *data) ^ T[val >> RABIN_SHIFT]; - } - inscnt = i; - - moff = 0; - msize = 0; - while (data < top) { - if (msize < 4096) { - struct index_entry *entry; - val ^= U[data[-RABIN_WINDOW]]; - val = ((val << 8) | *data) ^ T[val >> RABIN_SHIFT]; - i = val & index->hash_mask; - for (entry = index->hash[i]; entry; entry = entry->next) { - const unsigned char *ref = entry->ptr; - const unsigned char *src = data; - unsigned int ref_size = (unsigned int)(ref_top - ref); - if (entry->val != val) - continue; - if (ref_size > (unsigned int)(top - src)) - ref_size = (unsigned int)(top - src); - if (ref_size <= msize) - break; - while (ref_size-- && *src++ == *ref) - ref++; - if (msize < (unsigned int)(ref - entry->ptr)) { - /* this is our best match so far */ - msize = (unsigned int)(ref - entry->ptr); - moff = (unsigned int)(entry->ptr - ref_data); - if (msize >= 4096) /* good enough */ - break; - } - } - } - - if (msize < 4) { - if (!inscnt) - outpos++; - out[outpos++] = *data++; - inscnt++; - if (inscnt == 0x7f) { - out[outpos - inscnt - 1] = inscnt; - inscnt = 0; - } - msize = 0; - } else { - unsigned int left; - unsigned char *op; - - if (inscnt) { - while (moff && ref_data[moff-1] == data[-1]) { - /* we can match one byte back */ - msize++; - moff--; - data--; - outpos--; - if (--inscnt) - continue; - outpos--; /* remove count slot */ - inscnt--; /* make it -1 */ - break; - } - out[outpos - inscnt - 1] = inscnt; - inscnt = 0; - } - - /* A copy op is currently limited to 64KB (pack v2) */ - left = (msize < 0x10000) ? 0 : (msize - 0x10000); - msize -= left; - - op = out + outpos++; - i = 0x80; - - if (moff & 0x000000ff) - out[outpos++] = moff >> 0, i |= 0x01; - if (moff & 0x0000ff00) - out[outpos++] = moff >> 8, i |= 0x02; - if (moff & 0x00ff0000) - out[outpos++] = moff >> 16, i |= 0x04; - if (moff & 0xff000000) - out[outpos++] = moff >> 24, i |= 0x08; - - if (msize & 0x00ff) - out[outpos++] = msize >> 0, i |= 0x10; - if (msize & 0xff00) - out[outpos++] = msize >> 8, i |= 0x20; - - *op = i; - - data += msize; - moff += msize; - msize = left; - - if (msize < 4096) { - int j; - val = 0; - for (j = -RABIN_WINDOW; j < 0; j++) - val = ((val << 8) | data[j]) - ^ T[val >> RABIN_SHIFT]; - } - } - - if (outpos >= outsize - MAX_OP_SIZE) { - void *tmp = out; - outsize = outsize * 3 / 2; - if (max_size && outsize >= max_size) - outsize = max_size + MAX_OP_SIZE + 1; - if (max_size && outpos > max_size) - break; - out = git__realloc(out, outsize); - if (!out) { - git__free(tmp); - return NULL; - } - } - } - - if (inscnt) - out[outpos - inscnt - 1] = inscnt; - - if (max_size && outpos > max_size) { - git__free(out); - return NULL; - } - - *delta_size = outpos; - return out; -} diff --git a/vendor/libgit2/src/delta.h b/vendor/libgit2/src/delta.h deleted file mode 100644 index 4ca3279921..0000000000 --- a/vendor/libgit2/src/delta.h +++ /dev/null @@ -1,114 +0,0 @@ -/* - * diff-delta code taken from git.git. See diff-delta.c for details. - * - */ -#ifndef INCLUDE_git_delta_h__ -#define INCLUDE_git_delta_h__ - -#include "common.h" - -/* opaque object for delta index */ -struct git_delta_index; - -/* - * create_delta_index: compute index data from given buffer - * - * This returns a pointer to a struct delta_index that should be passed to - * subsequent create_delta() calls, or to free_delta_index(). A NULL pointer - * is returned on failure. The given buffer must not be freed nor altered - * before free_delta_index() is called. The returned pointer must be freed - * using free_delta_index(). - */ -extern struct git_delta_index * -git_delta_create_index(const void *buf, unsigned long bufsize); - -/* - * free_delta_index: free the index created by create_delta_index() - * - * Given pointer must be what create_delta_index() returned, or NULL. - */ -extern void git_delta_free_index(struct git_delta_index *index); - -/* - * sizeof_delta_index: returns memory usage of delta index - * - * Given pointer must be what create_delta_index() returned, or NULL. - */ -extern unsigned long git_delta_sizeof_index(struct git_delta_index *index); - -/* - * create_delta: create a delta from given index for the given buffer - * - * This function may be called multiple times with different buffers using - * the same delta_index pointer. If max_delta_size is non-zero and the - * resulting delta is to be larger than max_delta_size then NULL is returned. - * On success, a non-NULL pointer to the buffer with the delta data is - * returned and *delta_size is updated with its size. The returned buffer - * must be freed by the caller. - */ -extern void *git_delta_create( - const struct git_delta_index *index, - const void *buf, - unsigned long bufsize, - unsigned long *delta_size, - unsigned long max_delta_size); - -/* - * diff_delta: create a delta from source buffer to target buffer - * - * If max_delta_size is non-zero and the resulting delta is to be larger - * than max_delta_size then NULL is returned. On success, a non-NULL - * pointer to the buffer with the delta data is returned and *delta_size is - * updated with its size. The returned buffer must be freed by the caller. - */ -GIT_INLINE(void *) git_delta( - const void *src_buf, unsigned long src_bufsize, - const void *trg_buf, unsigned long trg_bufsize, - unsigned long *delta_size, - unsigned long max_delta_size) -{ - struct git_delta_index *index = git_delta_create_index(src_buf, src_bufsize); - if (index) { - void *delta = git_delta_create( - index, trg_buf, trg_bufsize, delta_size, max_delta_size); - git_delta_free_index(index); - return delta; - } - return NULL; -} - -/* - * patch_delta: recreate target buffer given source buffer and delta data - * - * On success, a non-NULL pointer to the target buffer is returned and - * *trg_bufsize is updated with its size. On failure a NULL pointer is - * returned. The returned buffer must be freed by the caller. - */ -extern void *git_delta_patch( - const void *src_buf, unsigned long src_size, - const void *delta_buf, unsigned long delta_size, - unsigned long *dst_size); - -/* the smallest possible delta size is 4 bytes */ -#define GIT_DELTA_SIZE_MIN 4 - -/* - * This must be called twice on the delta data buffer, first to get the - * expected source buffer size, and again to get the target buffer size. - */ -GIT_INLINE(unsigned long) git_delta_get_hdr_size( - const unsigned char **datap, const unsigned char *top) -{ - const unsigned char *data = *datap; - unsigned long cmd, size = 0; - int i = 0; - do { - cmd = *data++; - size |= (cmd & 0x7f) << i; - i += 7; - } while (cmd & 0x80 && data < top); - *datap = data; - return size; -} - -#endif diff --git a/vendor/libgit2/src/describe.c b/vendor/libgit2/src/describe.c deleted file mode 100644 index 48f04e8583..0000000000 --- a/vendor/libgit2/src/describe.c +++ /dev/null @@ -1,892 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#include "git2/describe.h" -#include "git2/strarray.h" -#include "git2/diff.h" -#include "git2/status.h" - -#include "common.h" -#include "commit.h" -#include "commit_list.h" -#include "oidmap.h" -#include "refs.h" -#include "revwalk.h" -#include "tag.h" -#include "vector.h" -#include "repository.h" - -GIT__USE_OIDMAP - -/* Ported from https://github.com/git/git/blob/89dde7882f71f846ccd0359756d27bebc31108de/builtin/describe.c */ - -struct commit_name { - git_tag *tag; - unsigned prio:2; /* annotated tag = 2, tag = 1, head = 0 */ - unsigned name_checked:1; - git_oid sha1; - char *path; - - /* Khash workaround. They original key has to still be reachable */ - git_oid peeled; -}; - -static void *oidmap_value_bykey(git_oidmap *map, const git_oid *key) -{ - khint_t pos = git_oidmap_lookup_index(map, key); - - if (!git_oidmap_valid_index(map, pos)) - return NULL; - - return git_oidmap_value_at(map, pos); -} - -static struct commit_name *find_commit_name( - git_oidmap *names, - const git_oid *peeled) -{ - return (struct commit_name *)(oidmap_value_bykey(names, peeled)); -} - -static int replace_name( - git_tag **tag, - git_repository *repo, - struct commit_name *e, - unsigned int prio, - const git_oid *sha1) -{ - git_time_t e_time = 0, t_time = 0; - - if (!e || e->prio < prio) - return 1; - - if (e->prio == 2 && prio == 2) { - /* Multiple annotated tags point to the same commit. - * Select one to keep based upon their tagger date. - */ - git_tag *t = NULL; - - if (!e->tag) { - if (git_tag_lookup(&t, repo, &e->sha1) < 0) - return 1; - e->tag = t; - } - - if (git_tag_lookup(&t, repo, sha1) < 0) - return 0; - - *tag = t; - - if (e->tag->tagger) - e_time = e->tag->tagger->when.time; - - if (t->tagger) - t_time = t->tagger->when.time; - - if (e_time < t_time) - return 1; - } - - return 0; -} - -static int add_to_known_names( - git_repository *repo, - git_oidmap *names, - const char *path, - const git_oid *peeled, - unsigned int prio, - const git_oid *sha1) -{ - struct commit_name *e = find_commit_name(names, peeled); - bool found = (e != NULL); - - git_tag *tag = NULL; - if (replace_name(&tag, repo, e, prio, sha1)) { - if (!found) { - e = git__malloc(sizeof(struct commit_name)); - GITERR_CHECK_ALLOC(e); - - e->path = NULL; - e->tag = NULL; - } - - if (e->tag) - git_tag_free(e->tag); - e->tag = tag; - e->prio = prio; - e->name_checked = 0; - git_oid_cpy(&e->sha1, sha1); - git__free(e->path); - e->path = git__strdup(path); - git_oid_cpy(&e->peeled, peeled); - - if (!found) { - int ret; - - git_oidmap_insert(names, &e->peeled, e, ret); - if (ret < 0) - return -1; - } - } - else - git_tag_free(tag); - - return 0; -} - -static int retrieve_peeled_tag_or_object_oid( - git_oid *peeled_out, - git_oid *ref_target_out, - git_repository *repo, - const char *refname) -{ - git_reference *ref; - git_object *peeled = NULL; - int error; - - if ((error = git_reference_lookup_resolved(&ref, repo, refname, -1)) < 0) - return error; - - if ((error = git_reference_peel(&peeled, ref, GIT_OBJ_ANY)) < 0) - goto cleanup; - - git_oid_cpy(ref_target_out, git_reference_target(ref)); - git_oid_cpy(peeled_out, git_object_id(peeled)); - - if (git_oid_cmp(ref_target_out, peeled_out) != 0) - error = 1; /* The reference was pointing to a annotated tag */ - else - error = 0; /* Any other object */ - -cleanup: - git_reference_free(ref); - git_object_free(peeled); - return error; -} - -struct git_describe_result { - int dirty; - int exact_match; - int fallback_to_id; - git_oid commit_id; - git_repository *repo; - struct commit_name *name; - struct possible_tag *tag; -}; - -struct get_name_data -{ - git_describe_options *opts; - git_repository *repo; - git_oidmap *names; - git_describe_result *result; -}; - -static int commit_name_dup(struct commit_name **out, struct commit_name *in) -{ - struct commit_name *name; - - name = git__malloc(sizeof(struct commit_name)); - GITERR_CHECK_ALLOC(name); - - memcpy(name, in, sizeof(struct commit_name)); - name->tag = NULL; - name->path = NULL; - - if (in->tag && git_object_dup((git_object **) &name->tag, (git_object *) in->tag) < 0) - return -1; - - name->path = git__strdup(in->path); - GITERR_CHECK_ALLOC(name->path); - - *out = name; - return 0; -} - -static int get_name(const char *refname, void *payload) -{ - struct get_name_data *data; - bool is_tag, is_annotated, all; - git_oid peeled, sha1; - unsigned int prio; - int error = 0; - - data = (struct get_name_data *)payload; - is_tag = !git__prefixcmp(refname, GIT_REFS_TAGS_DIR); - all = data->opts->describe_strategy == GIT_DESCRIBE_ALL; - - /* Reject anything outside refs/tags/ unless --all */ - if (!all && !is_tag) - return 0; - - /* Accept only tags that match the pattern, if given */ - if (data->opts->pattern && (!is_tag || p_fnmatch(data->opts->pattern, - refname + strlen(GIT_REFS_TAGS_DIR), 0))) - return 0; - - /* Is it annotated? */ - if ((error = retrieve_peeled_tag_or_object_oid( - &peeled, &sha1, data->repo, refname)) < 0) - return error; - - is_annotated = error; - - /* - * By default, we only use annotated tags, but with --tags - * we fall back to lightweight ones (even without --tags, - * we still remember lightweight ones, only to give hints - * in an error message). --all allows any refs to be used. - */ - if (is_annotated) - prio = 2; - else if (is_tag) - prio = 1; - else - prio = 0; - - add_to_known_names(data->repo, data->names, - all ? refname + strlen(GIT_REFS_DIR) : refname + strlen(GIT_REFS_TAGS_DIR), - &peeled, prio, &sha1); - return 0; -} - -struct possible_tag { - struct commit_name *name; - int depth; - int found_order; - unsigned flag_within; -}; - -static int possible_tag_dup(struct possible_tag **out, struct possible_tag *in) -{ - struct possible_tag *tag; - int error; - - tag = git__malloc(sizeof(struct possible_tag)); - GITERR_CHECK_ALLOC(tag); - - memcpy(tag, in, sizeof(struct possible_tag)); - tag->name = NULL; - - if ((error = commit_name_dup(&tag->name, in->name)) < 0) { - git__free(tag); - *out = NULL; - return error; - } - - *out = tag; - return 0; -} - -static int compare_pt(const void *a_, const void *b_) -{ - struct possible_tag *a = (struct possible_tag *)a_; - struct possible_tag *b = (struct possible_tag *)b_; - if (a->depth != b->depth) - return a->depth - b->depth; - if (a->found_order != b->found_order) - return a->found_order - b->found_order; - return 0; -} - -#define SEEN (1u << 0) - -static unsigned long finish_depth_computation( - git_pqueue *list, - git_revwalk *walk, - struct possible_tag *best) -{ - unsigned long seen_commits = 0; - int error, i; - - while (git_pqueue_size(list) > 0) { - git_commit_list_node *c = git_pqueue_pop(list); - seen_commits++; - if (c->flags & best->flag_within) { - size_t index = 0; - while (git_pqueue_size(list) > index) { - git_commit_list_node *i = git_pqueue_get(list, index); - if (!(i->flags & best->flag_within)) - break; - index++; - } - if (index > git_pqueue_size(list)) - break; - } else - best->depth++; - for (i = 0; i < c->out_degree; i++) { - git_commit_list_node *p = c->parents[i]; - if ((error = git_commit_list_parse(walk, p)) < 0) - return error; - if (!(p->flags & SEEN)) - if ((error = git_pqueue_insert(list, p)) < 0) - return error; - p->flags |= c->flags; - } - } - return seen_commits; -} - -static int display_name(git_buf *buf, git_repository *repo, struct commit_name *n) -{ - if (n->prio == 2 && !n->tag) { - if (git_tag_lookup(&n->tag, repo, &n->sha1) < 0) { - giterr_set(GITERR_TAG, "Annotated tag '%s' not available", n->path); - return -1; - } - } - - if (n->tag && !n->name_checked) { - if (!git_tag_name(n->tag)) { - giterr_set(GITERR_TAG, "Annotated tag '%s' has no embedded name", n->path); - return -1; - } - - /* TODO: Cope with warnings - if (strcmp(n->tag->tag, all ? n->path + 5 : n->path)) - warning(_("tag '%s' is really '%s' here"), n->tag->tag, n->path); - */ - - n->name_checked = 1; - } - - if (n->tag) - git_buf_printf(buf, "%s", git_tag_name(n->tag)); - else - git_buf_printf(buf, "%s", n->path); - - return 0; -} - -static int find_unique_abbrev_size( - int *out, - git_repository *repo, - const git_oid *oid_in, - int abbreviated_size) -{ - size_t size = abbreviated_size; - git_odb *odb; - git_oid dummy; - int error; - - if ((error = git_repository_odb__weakptr(&odb, repo)) < 0) - return error; - - while (size < GIT_OID_HEXSZ) { - if ((error = git_odb_exists_prefix(&dummy, odb, oid_in, size)) == 0) { - *out = (int) size; - return 0; - } - - /* If the error wasn't that it's not unique, then it's a proper error */ - if (error != GIT_EAMBIGUOUS) - return error; - - /* Try again with a larger size */ - size++; - } - - /* If we didn't find any shorter prefix, we have to do the whole thing */ - *out = GIT_OID_HEXSZ; - - return 0; -} - -static int show_suffix( - git_buf *buf, - int depth, - git_repository *repo, - const git_oid* id, - size_t abbrev_size) -{ - int error, size = 0; - - char hex_oid[GIT_OID_HEXSZ]; - - if ((error = find_unique_abbrev_size(&size, repo, id, abbrev_size)) < 0) - return error; - - git_oid_fmt(hex_oid, id); - - git_buf_printf(buf, "-%d-g", depth); - - git_buf_put(buf, hex_oid, size); - - return git_buf_oom(buf) ? -1 : 0; -} - -#define MAX_CANDIDATES_TAGS FLAG_BITS - 1 - -static int describe_not_found(const git_oid *oid, const char *message_format) { - char oid_str[GIT_OID_HEXSZ + 1]; - git_oid_tostr(oid_str, sizeof(oid_str), oid); - - giterr_set(GITERR_DESCRIBE, message_format, oid_str); - return GIT_ENOTFOUND; -} - -static int describe( - struct get_name_data *data, - git_commit *commit) -{ - struct commit_name *n; - struct possible_tag *best; - bool all, tags; - git_revwalk *walk = NULL; - git_pqueue list; - git_commit_list_node *cmit, *gave_up_on = NULL; - git_vector all_matches = GIT_VECTOR_INIT; - unsigned int match_cnt = 0, annotated_cnt = 0, cur_match; - unsigned long seen_commits = 0; /* TODO: Check long */ - unsigned int unannotated_cnt = 0; - int error; - - if (git_vector_init(&all_matches, MAX_CANDIDATES_TAGS, compare_pt) < 0) - return -1; - - if ((error = git_pqueue_init(&list, 0, 2, git_commit_list_time_cmp)) < 0) - goto cleanup; - - all = data->opts->describe_strategy == GIT_DESCRIBE_ALL; - tags = data->opts->describe_strategy == GIT_DESCRIBE_TAGS; - - git_oid_cpy(&data->result->commit_id, git_commit_id(commit)); - - n = find_commit_name(data->names, git_commit_id(commit)); - if (n && (tags || all || n->prio == 2)) { - /* - * Exact match to an existing ref. - */ - data->result->exact_match = 1; - if ((error = commit_name_dup(&data->result->name, n)) < 0) - goto cleanup; - - goto cleanup; - } - - if (!data->opts->max_candidates_tags) { - error = describe_not_found( - git_commit_id(commit), - "Cannot describe - no tag exactly matches '%s'"); - - goto cleanup; - } - - if ((error = git_revwalk_new(&walk, git_commit_owner(commit))) < 0) - goto cleanup; - - if ((cmit = git_revwalk__commit_lookup(walk, git_commit_id(commit))) == NULL) - goto cleanup; - - if ((error = git_commit_list_parse(walk, cmit)) < 0) - goto cleanup; - - cmit->flags = SEEN; - - if ((error = git_pqueue_insert(&list, cmit)) < 0) - goto cleanup; - - while (git_pqueue_size(&list) > 0) - { - int i; - - git_commit_list_node *c = (git_commit_list_node *)git_pqueue_pop(&list); - seen_commits++; - - n = find_commit_name(data->names, &c->oid); - - if (n) { - if (!tags && !all && n->prio < 2) { - unannotated_cnt++; - } else if (match_cnt < data->opts->max_candidates_tags) { - struct possible_tag *t = git__malloc(sizeof(struct commit_name)); - GITERR_CHECK_ALLOC(t); - if ((error = git_vector_insert(&all_matches, t)) < 0) - goto cleanup; - - match_cnt++; - - t->name = n; - t->depth = seen_commits - 1; - t->flag_within = 1u << match_cnt; - t->found_order = match_cnt; - c->flags |= t->flag_within; - if (n->prio == 2) - annotated_cnt++; - } - else { - gave_up_on = c; - break; - } - } - - for (cur_match = 0; cur_match < match_cnt; cur_match++) { - struct possible_tag *t = git_vector_get(&all_matches, cur_match); - if (!(c->flags & t->flag_within)) - t->depth++; - } - - if (annotated_cnt && (git_pqueue_size(&list) == 0)) { - /* - if (debug) { - char oid_str[GIT_OID_HEXSZ + 1]; - git_oid_tostr(oid_str, sizeof(oid_str), &c->oid); - - fprintf(stderr, "finished search at %s\n", oid_str); - } - */ - break; - } - for (i = 0; i < c->out_degree; i++) { - git_commit_list_node *p = c->parents[i]; - if ((error = git_commit_list_parse(walk, p)) < 0) - goto cleanup; - if (!(p->flags & SEEN)) - if ((error = git_pqueue_insert(&list, p)) < 0) - goto cleanup; - p->flags |= c->flags; - - if (data->opts->only_follow_first_parent) - break; - } - } - - if (!match_cnt) { - if (data->opts->show_commit_oid_as_fallback) { - data->result->fallback_to_id = 1; - git_oid_cpy(&data->result->commit_id, &cmit->oid); - - goto cleanup; - } - if (unannotated_cnt) { - error = describe_not_found(git_commit_id(commit), - "Cannot describe - " - "No annotated tags can describe '%s'." - "However, there were unannotated tags."); - goto cleanup; - } - else { - error = describe_not_found(git_commit_id(commit), - "Cannot describe - " - "No tags can describe '%s'."); - goto cleanup; - } - } - - git_vector_sort(&all_matches); - - best = (struct possible_tag *)git_vector_get(&all_matches, 0); - - if (gave_up_on) { - git_pqueue_insert(&list, gave_up_on); - seen_commits--; - } - if ((error = finish_depth_computation( - &list, walk, best)) < 0) - goto cleanup; - - seen_commits += error; - if ((error = possible_tag_dup(&data->result->tag, best)) < 0) - goto cleanup; - - /* - { - static const char *prio_names[] = { - "head", "lightweight", "annotated", - }; - - char oid_str[GIT_OID_HEXSZ + 1]; - - if (debug) { - for (cur_match = 0; cur_match < match_cnt; cur_match++) { - struct possible_tag *t = (struct possible_tag *)git_vector_get(&all_matches, cur_match); - fprintf(stderr, " %-11s %8d %s\n", - prio_names[t->name->prio], - t->depth, t->name->path); - } - fprintf(stderr, "traversed %lu commits\n", seen_commits); - if (gave_up_on) { - git_oid_tostr(oid_str, sizeof(oid_str), &gave_up_on->oid); - fprintf(stderr, - "more than %i tags found; listed %i most recent\n" - "gave up search at %s\n", - data->opts->max_candidates_tags, data->opts->max_candidates_tags, - oid_str); - } - } - } - */ - - git_oid_cpy(&data->result->commit_id, &cmit->oid); - -cleanup: - { - size_t i; - struct possible_tag *match; - git_vector_foreach(&all_matches, i, match) { - git__free(match); - } - } - git_vector_free(&all_matches); - git_pqueue_free(&list); - git_revwalk_free(walk); - return error; -} - -static int normalize_options( - git_describe_options *dst, - const git_describe_options *src) -{ - git_describe_options default_options = GIT_DESCRIBE_OPTIONS_INIT; - if (!src) src = &default_options; - - *dst = *src; - - if (dst->max_candidates_tags > GIT_DESCRIBE_DEFAULT_MAX_CANDIDATES_TAGS) - dst->max_candidates_tags = GIT_DESCRIBE_DEFAULT_MAX_CANDIDATES_TAGS; - - return 0; -} - -int git_describe_commit( - git_describe_result **result, - git_object *committish, - git_describe_options *opts) -{ - struct get_name_data data; - struct commit_name *name; - git_commit *commit; - int error = -1; - git_describe_options normalized; - - assert(committish); - - data.result = git__calloc(1, sizeof(git_describe_result)); - GITERR_CHECK_ALLOC(data.result); - data.result->repo = git_object_owner(committish); - - data.repo = git_object_owner(committish); - - if ((error = normalize_options(&normalized, opts)) < 0) - return error; - - GITERR_CHECK_VERSION( - &normalized, - GIT_DESCRIBE_OPTIONS_VERSION, - "git_describe_options"); - data.opts = &normalized; - - data.names = git_oidmap_alloc(); - GITERR_CHECK_ALLOC(data.names); - - /** TODO: contains to be implemented */ - - if ((error = git_object_peel((git_object **)(&commit), committish, GIT_OBJ_COMMIT)) < 0) - goto cleanup; - - if ((error = git_reference_foreach_name( - git_object_owner(committish), - get_name, &data)) < 0) - goto cleanup; - - if (git_oidmap_size(data.names) == 0 && !opts->show_commit_oid_as_fallback) { - giterr_set(GITERR_DESCRIBE, "Cannot describe - " - "No reference found, cannot describe anything."); - error = -1; - goto cleanup; - } - - if ((error = describe(&data, commit)) < 0) - goto cleanup; - -cleanup: - git_commit_free(commit); - - git_oidmap_foreach_value(data.names, name, { - git_tag_free(name->tag); - git__free(name->path); - git__free(name); - }); - - git_oidmap_free(data.names); - - if (error < 0) - git_describe_result_free(data.result); - else - *result = data.result; - - return error; -} - -int git_describe_workdir( - git_describe_result **out, - git_repository *repo, - git_describe_options *opts) -{ - int error; - git_oid current_id; - git_status_list *status = NULL; - git_status_options status_opts = GIT_STATUS_OPTIONS_INIT; - git_describe_result *result = NULL; - git_object *commit; - - if ((error = git_reference_name_to_id(¤t_id, repo, GIT_HEAD_FILE)) < 0) - return error; - - if ((error = git_object_lookup(&commit, repo, ¤t_id, GIT_OBJ_COMMIT)) < 0) - return error; - - /* The first step is to perform a describe of HEAD, so we can leverage this */ - if ((error = git_describe_commit(&result, commit, opts)) < 0) - goto out; - - if ((error = git_status_list_new(&status, repo, &status_opts)) < 0) - goto out; - - - if (git_status_list_entrycount(status) > 0) - result->dirty = 1; - -out: - git_object_free(commit); - git_status_list_free(status); - - if (error < 0) - git_describe_result_free(result); - else - *out = result; - - return error; -} - -static int normalize_format_options( - git_describe_format_options *dst, - const git_describe_format_options *src) -{ - if (!src) { - git_describe_init_format_options(dst, GIT_DESCRIBE_FORMAT_OPTIONS_VERSION); - return 0; - } - - memcpy(dst, src, sizeof(git_describe_format_options)); - return 0; -} - -int git_describe_format(git_buf *out, const git_describe_result *result, const git_describe_format_options *given) -{ - int error; - git_repository *repo; - struct commit_name *name; - git_describe_format_options opts; - - assert(out && result); - - GITERR_CHECK_VERSION(given, GIT_DESCRIBE_FORMAT_OPTIONS_VERSION, "git_describe_format_options"); - normalize_format_options(&opts, given); - - git_buf_sanitize(out); - - - if (opts.always_use_long_format && opts.abbreviated_size == 0) { - giterr_set(GITERR_DESCRIBE, "Cannot describe - " - "'always_use_long_format' is incompatible with a zero" - "'abbreviated_size'"); - return -1; - } - - - repo = result->repo; - - /* If we did find an exact match, then it's the easier method */ - if (result->exact_match) { - name = result->name; - if ((error = display_name(out, repo, name)) < 0) - return error; - - if (opts.always_use_long_format) { - const git_oid *id = name->tag ? git_tag_target_id(name->tag) : &result->commit_id; - if ((error = show_suffix(out, 0, repo, id, opts.abbreviated_size)) < 0) - return error; - } - - if (result->dirty && opts.dirty_suffix) - git_buf_puts(out, opts.dirty_suffix); - - return git_buf_oom(out) ? -1 : 0; - } - - /* If we didn't find *any* tags, we fall back to the commit's id */ - if (result->fallback_to_id) { - char hex_oid[GIT_OID_HEXSZ + 1] = {0}; - int size = 0; - - if ((error = find_unique_abbrev_size( - &size, repo, &result->commit_id, opts.abbreviated_size)) < 0) - return -1; - - git_oid_fmt(hex_oid, &result->commit_id); - git_buf_put(out, hex_oid, size); - - if (result->dirty && opts.dirty_suffix) - git_buf_puts(out, opts.dirty_suffix); - - return git_buf_oom(out) ? -1 : 0; - } - - /* Lastly, if we found a matching tag, we show that */ - name = result->tag->name; - - if ((error = display_name(out, repo, name)) < 0) - return error; - - if (opts.abbreviated_size) { - if ((error = show_suffix(out, result->tag->depth, repo, - &result->commit_id, opts.abbreviated_size)) < 0) - return error; - } - - if (result->dirty && opts.dirty_suffix) { - git_buf_puts(out, opts.dirty_suffix); - } - - return git_buf_oom(out) ? -1 : 0; -} - -void git_describe_result_free(git_describe_result *result) -{ - if (result == NULL) - return; - - if (result->name) { - git_tag_free(result->name->tag); - git__free(result->name->path); - git__free(result->name); - } - - if (result->tag) { - git_tag_free(result->tag->name->tag); - git__free(result->tag->name->path); - git__free(result->tag->name); - git__free(result->tag); - } - - git__free(result); -} - -int git_describe_init_options(git_describe_options *opts, unsigned int version) -{ - GIT_INIT_STRUCTURE_FROM_TEMPLATE( - opts, version, git_describe_options, GIT_DESCRIBE_OPTIONS_INIT); - return 0; -} - -int git_describe_init_format_options(git_describe_format_options *opts, unsigned int version) -{ - GIT_INIT_STRUCTURE_FROM_TEMPLATE( - opts, version, git_describe_format_options, GIT_DESCRIBE_FORMAT_OPTIONS_INIT); - return 0; -} diff --git a/vendor/libgit2/src/diff.c b/vendor/libgit2/src/diff.c deleted file mode 100644 index c1adcc662c..0000000000 --- a/vendor/libgit2/src/diff.c +++ /dev/null @@ -1,1792 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#include "common.h" -#include "diff.h" -#include "fileops.h" -#include "config.h" -#include "attr_file.h" -#include "filter.h" -#include "pathspec.h" -#include "index.h" -#include "odb.h" -#include "submodule.h" - -#define DIFF_FLAG_IS_SET(DIFF,FLAG) (((DIFF)->opts.flags & (FLAG)) != 0) -#define DIFF_FLAG_ISNT_SET(DIFF,FLAG) (((DIFF)->opts.flags & (FLAG)) == 0) -#define DIFF_FLAG_SET(DIFF,FLAG,VAL) (DIFF)->opts.flags = \ - (VAL) ? ((DIFF)->opts.flags | (FLAG)) : ((DIFF)->opts.flags & ~(VAL)) - -static git_diff_delta *diff_delta__alloc( - git_diff *diff, - git_delta_t status, - const char *path) -{ - git_diff_delta *delta = git__calloc(1, sizeof(git_diff_delta)); - if (!delta) - return NULL; - - delta->old_file.path = git_pool_strdup(&diff->pool, path); - if (delta->old_file.path == NULL) { - git__free(delta); - return NULL; - } - - delta->new_file.path = delta->old_file.path; - - if (DIFF_FLAG_IS_SET(diff, GIT_DIFF_REVERSE)) { - switch (status) { - case GIT_DELTA_ADDED: status = GIT_DELTA_DELETED; break; - case GIT_DELTA_DELETED: status = GIT_DELTA_ADDED; break; - default: break; /* leave other status values alone */ - } - } - delta->status = status; - - return delta; -} - -static int diff_insert_delta( - git_diff *diff, git_diff_delta *delta, const char *matched_pathspec) -{ - int error = 0; - - if (diff->opts.notify_cb) { - error = diff->opts.notify_cb( - diff, delta, matched_pathspec, diff->opts.notify_payload); - - if (error) { - git__free(delta); - - if (error > 0) /* positive value means to skip this delta */ - return 0; - else /* negative value means to cancel diff */ - return giterr_set_after_callback_function(error, "git_diff"); - } - } - - if ((error = git_vector_insert(&diff->deltas, delta)) < 0) - git__free(delta); - - return error; -} - -static int diff_delta__from_one( - git_diff *diff, - git_delta_t status, - const git_index_entry *oitem, - const git_index_entry *nitem) -{ - const git_index_entry *entry = nitem; - bool has_old = false; - git_diff_delta *delta; - const char *matched_pathspec; - - assert((oitem != NULL) ^ (nitem != NULL)); - - if (oitem) { - entry = oitem; - has_old = true; - } - - if (DIFF_FLAG_IS_SET(diff, GIT_DIFF_REVERSE)) - has_old = !has_old; - - if ((entry->flags & GIT_IDXENTRY_VALID) != 0) - return 0; - - if (status == GIT_DELTA_IGNORED && - DIFF_FLAG_ISNT_SET(diff, GIT_DIFF_INCLUDE_IGNORED)) - return 0; - - if (status == GIT_DELTA_UNTRACKED && - DIFF_FLAG_ISNT_SET(diff, GIT_DIFF_INCLUDE_UNTRACKED)) - return 0; - - if (status == GIT_DELTA_UNREADABLE && - DIFF_FLAG_ISNT_SET(diff, GIT_DIFF_INCLUDE_UNREADABLE)) - return 0; - - if (!git_pathspec__match( - &diff->pathspec, entry->path, - DIFF_FLAG_IS_SET(diff, GIT_DIFF_DISABLE_PATHSPEC_MATCH), - DIFF_FLAG_IS_SET(diff, GIT_DIFF_IGNORE_CASE), - &matched_pathspec, NULL)) - return 0; - - delta = diff_delta__alloc(diff, status, entry->path); - GITERR_CHECK_ALLOC(delta); - - /* This fn is just for single-sided diffs */ - assert(status != GIT_DELTA_MODIFIED); - delta->nfiles = 1; - - if (has_old) { - delta->old_file.mode = entry->mode; - delta->old_file.size = entry->file_size; - delta->old_file.flags |= GIT_DIFF_FLAG_EXISTS; - git_oid_cpy(&delta->old_file.id, &entry->id); - } else /* ADDED, IGNORED, UNTRACKED */ { - delta->new_file.mode = entry->mode; - delta->new_file.size = entry->file_size; - delta->new_file.flags |= GIT_DIFF_FLAG_EXISTS; - git_oid_cpy(&delta->new_file.id, &entry->id); - } - - delta->old_file.flags |= GIT_DIFF_FLAG_VALID_ID; - - if (has_old || !git_oid_iszero(&delta->new_file.id)) - delta->new_file.flags |= GIT_DIFF_FLAG_VALID_ID; - - return diff_insert_delta(diff, delta, matched_pathspec); -} - -static int diff_delta__from_two( - git_diff *diff, - git_delta_t status, - const git_index_entry *old_entry, - uint32_t old_mode, - const git_index_entry *new_entry, - uint32_t new_mode, - const git_oid *new_id, - const char *matched_pathspec) -{ - const git_oid *old_id = &old_entry->id; - git_diff_delta *delta; - const char *canonical_path = old_entry->path; - - if (status == GIT_DELTA_UNMODIFIED && - DIFF_FLAG_ISNT_SET(diff, GIT_DIFF_INCLUDE_UNMODIFIED)) - return 0; - - if (!new_id) - new_id = &new_entry->id; - - if (DIFF_FLAG_IS_SET(diff, GIT_DIFF_REVERSE)) { - uint32_t temp_mode = old_mode; - const git_index_entry *temp_entry = old_entry; - const git_oid *temp_id = old_id; - - old_entry = new_entry; - new_entry = temp_entry; - old_mode = new_mode; - new_mode = temp_mode; - old_id = new_id; - new_id = temp_id; - } - - delta = diff_delta__alloc(diff, status, canonical_path); - GITERR_CHECK_ALLOC(delta); - delta->nfiles = 2; - - if (!git_index_entry_is_conflict(old_entry)) { - delta->old_file.size = old_entry->file_size; - delta->old_file.mode = old_mode; - git_oid_cpy(&delta->old_file.id, old_id); - delta->old_file.flags |= GIT_DIFF_FLAG_VALID_ID | - GIT_DIFF_FLAG_EXISTS; - } - - if (!git_index_entry_is_conflict(new_entry)) { - git_oid_cpy(&delta->new_file.id, new_id); - delta->new_file.size = new_entry->file_size; - delta->new_file.mode = new_mode; - delta->old_file.flags |= GIT_DIFF_FLAG_EXISTS; - delta->new_file.flags |= GIT_DIFF_FLAG_EXISTS; - - if (!git_oid_iszero(&new_entry->id)) - delta->new_file.flags |= GIT_DIFF_FLAG_VALID_ID; - } - - return diff_insert_delta(diff, delta, matched_pathspec); -} - -static git_diff_delta *diff_delta__last_for_item( - git_diff *diff, - const git_index_entry *item) -{ - git_diff_delta *delta = git_vector_last(&diff->deltas); - if (!delta) - return NULL; - - switch (delta->status) { - case GIT_DELTA_UNMODIFIED: - case GIT_DELTA_DELETED: - if (git_oid__cmp(&delta->old_file.id, &item->id) == 0) - return delta; - break; - case GIT_DELTA_ADDED: - if (git_oid__cmp(&delta->new_file.id, &item->id) == 0) - return delta; - break; - case GIT_DELTA_UNREADABLE: - case GIT_DELTA_UNTRACKED: - if (diff->strcomp(delta->new_file.path, item->path) == 0 && - git_oid__cmp(&delta->new_file.id, &item->id) == 0) - return delta; - break; - case GIT_DELTA_MODIFIED: - if (git_oid__cmp(&delta->old_file.id, &item->id) == 0 || - git_oid__cmp(&delta->new_file.id, &item->id) == 0) - return delta; - break; - default: - break; - } - - return NULL; -} - -static char *diff_strdup_prefix(git_pool *pool, const char *prefix) -{ - size_t len = strlen(prefix); - - /* append '/' at end if needed */ - if (len > 0 && prefix[len - 1] != '/') - return git_pool_strcat(pool, prefix, "/"); - else - return git_pool_strndup(pool, prefix, len + 1); -} - -GIT_INLINE(const char *) diff_delta__path(const git_diff_delta *delta) -{ - const char *str = delta->old_file.path; - - if (!str || - delta->status == GIT_DELTA_ADDED || - delta->status == GIT_DELTA_RENAMED || - delta->status == GIT_DELTA_COPIED) - str = delta->new_file.path; - - return str; -} - -const char *git_diff_delta__path(const git_diff_delta *delta) -{ - return diff_delta__path(delta); -} - -int git_diff_delta__cmp(const void *a, const void *b) -{ - const git_diff_delta *da = a, *db = b; - int val = strcmp(diff_delta__path(da), diff_delta__path(db)); - return val ? val : ((int)da->status - (int)db->status); -} - -int git_diff_delta__casecmp(const void *a, const void *b) -{ - const git_diff_delta *da = a, *db = b; - int val = strcasecmp(diff_delta__path(da), diff_delta__path(db)); - return val ? val : ((int)da->status - (int)db->status); -} - -GIT_INLINE(const char *) diff_delta__i2w_path(const git_diff_delta *delta) -{ - return delta->old_file.path ? - delta->old_file.path : delta->new_file.path; -} - -int git_diff_delta__i2w_cmp(const void *a, const void *b) -{ - const git_diff_delta *da = a, *db = b; - int val = strcmp(diff_delta__i2w_path(da), diff_delta__i2w_path(db)); - return val ? val : ((int)da->status - (int)db->status); -} - -int git_diff_delta__i2w_casecmp(const void *a, const void *b) -{ - const git_diff_delta *da = a, *db = b; - int val = strcasecmp(diff_delta__i2w_path(da), diff_delta__i2w_path(db)); - return val ? val : ((int)da->status - (int)db->status); -} - -bool git_diff_delta__should_skip( - const git_diff_options *opts, const git_diff_delta *delta) -{ - uint32_t flags = opts ? opts->flags : 0; - - if (delta->status == GIT_DELTA_UNMODIFIED && - (flags & GIT_DIFF_INCLUDE_UNMODIFIED) == 0) - return true; - - if (delta->status == GIT_DELTA_IGNORED && - (flags & GIT_DIFF_INCLUDE_IGNORED) == 0) - return true; - - if (delta->status == GIT_DELTA_UNTRACKED && - (flags & GIT_DIFF_INCLUDE_UNTRACKED) == 0) - return true; - - if (delta->status == GIT_DELTA_UNREADABLE && - (flags & GIT_DIFF_INCLUDE_UNREADABLE) == 0) - return true; - - return false; -} - - -static const char *diff_mnemonic_prefix( - git_iterator_type_t type, bool left_side) -{ - const char *pfx = ""; - - switch (type) { - case GIT_ITERATOR_TYPE_EMPTY: pfx = "c"; break; - case GIT_ITERATOR_TYPE_TREE: pfx = "c"; break; - case GIT_ITERATOR_TYPE_INDEX: pfx = "i"; break; - case GIT_ITERATOR_TYPE_WORKDIR: pfx = "w"; break; - case GIT_ITERATOR_TYPE_FS: pfx = left_side ? "1" : "2"; break; - default: break; - } - - /* note: without a deeper look at pathspecs, there is no easy way - * to get the (o)bject / (w)ork tree mnemonics working... - */ - - return pfx; -} - -static int diff_entry_cmp(const void *a, const void *b) -{ - const git_index_entry *entry_a = a; - const git_index_entry *entry_b = b; - - return strcmp(entry_a->path, entry_b->path); -} - -static int diff_entry_icmp(const void *a, const void *b) -{ - const git_index_entry *entry_a = a; - const git_index_entry *entry_b = b; - - return strcasecmp(entry_a->path, entry_b->path); -} - -static void diff_set_ignore_case(git_diff *diff, bool ignore_case) -{ - if (!ignore_case) { - diff->opts.flags &= ~GIT_DIFF_IGNORE_CASE; - - diff->strcomp = git__strcmp; - diff->strncomp = git__strncmp; - diff->pfxcomp = git__prefixcmp; - diff->entrycomp = diff_entry_cmp; - - git_vector_set_cmp(&diff->deltas, git_diff_delta__cmp); - } else { - diff->opts.flags |= GIT_DIFF_IGNORE_CASE; - - diff->strcomp = git__strcasecmp; - diff->strncomp = git__strncasecmp; - diff->pfxcomp = git__prefixcmp_icase; - diff->entrycomp = diff_entry_icmp; - - git_vector_set_cmp(&diff->deltas, git_diff_delta__casecmp); - } - - git_vector_sort(&diff->deltas); -} - -static git_diff *diff_list_alloc( - git_repository *repo, - git_iterator *old_iter, - git_iterator *new_iter) -{ - git_diff_options dflt = GIT_DIFF_OPTIONS_INIT; - git_diff *diff = git__calloc(1, sizeof(git_diff)); - if (!diff) - return NULL; - - assert(repo && old_iter && new_iter); - - GIT_REFCOUNT_INC(diff); - diff->repo = repo; - diff->old_src = old_iter->type; - diff->new_src = new_iter->type; - memcpy(&diff->opts, &dflt, sizeof(diff->opts)); - - if (git_vector_init(&diff->deltas, 0, git_diff_delta__cmp) < 0 || - git_pool_init(&diff->pool, 1, 0) < 0) { - git_diff_free(diff); - return NULL; - } - - /* Use case-insensitive compare if either iterator has - * the ignore_case bit set */ - diff_set_ignore_case( - diff, - git_iterator_ignore_case(old_iter) || - git_iterator_ignore_case(new_iter)); - - return diff; -} - -static int diff_list_apply_options( - git_diff *diff, - const git_diff_options *opts) -{ - git_config *cfg = NULL; - git_repository *repo = diff->repo; - git_pool *pool = &diff->pool; - int val; - - if (opts) { - /* copy user options (except case sensitivity info from iterators) */ - bool icase = DIFF_FLAG_IS_SET(diff, GIT_DIFF_IGNORE_CASE); - memcpy(&diff->opts, opts, sizeof(diff->opts)); - DIFF_FLAG_SET(diff, GIT_DIFF_IGNORE_CASE, icase); - - /* initialize pathspec from options */ - if (git_pathspec__vinit(&diff->pathspec, &opts->pathspec, pool) < 0) - return -1; - } - - /* flag INCLUDE_TYPECHANGE_TREES implies INCLUDE_TYPECHANGE */ - if (DIFF_FLAG_IS_SET(diff, GIT_DIFF_INCLUDE_TYPECHANGE_TREES)) - diff->opts.flags |= GIT_DIFF_INCLUDE_TYPECHANGE; - - /* flag INCLUDE_UNTRACKED_CONTENT implies INCLUDE_UNTRACKED */ - if (DIFF_FLAG_IS_SET(diff, GIT_DIFF_SHOW_UNTRACKED_CONTENT)) - diff->opts.flags |= GIT_DIFF_INCLUDE_UNTRACKED; - - /* load config values that affect diff behavior */ - if ((val = git_repository_config_snapshot(&cfg, repo)) < 0) - return val; - - if (!git_config__cvar(&val, cfg, GIT_CVAR_SYMLINKS) && val) - diff->diffcaps = diff->diffcaps | GIT_DIFFCAPS_HAS_SYMLINKS; - - if (!git_config__cvar(&val, cfg, GIT_CVAR_IGNORESTAT) && val) - diff->diffcaps = diff->diffcaps | GIT_DIFFCAPS_IGNORE_STAT; - - if ((diff->opts.flags & GIT_DIFF_IGNORE_FILEMODE) == 0 && - !git_config__cvar(&val, cfg, GIT_CVAR_FILEMODE) && val) - diff->diffcaps = diff->diffcaps | GIT_DIFFCAPS_TRUST_MODE_BITS; - - if (!git_config__cvar(&val, cfg, GIT_CVAR_TRUSTCTIME) && val) - diff->diffcaps = diff->diffcaps | GIT_DIFFCAPS_TRUST_CTIME; - - /* Don't set GIT_DIFFCAPS_USE_DEV - compile time option in core git */ - - /* Set GIT_DIFFCAPS_TRUST_NANOSECS on a platform basis */ - diff->diffcaps = diff->diffcaps | GIT_DIFFCAPS_TRUST_NANOSECS; - - /* If not given explicit `opts`, check `diff.xyz` configs */ - if (!opts) { - int context = git_config__get_int_force(cfg, "diff.context", 3); - diff->opts.context_lines = context >= 0 ? (uint32_t)context : 3; - - /* add other defaults here */ - } - - /* Reverse src info if diff is reversed */ - if (DIFF_FLAG_IS_SET(diff, GIT_DIFF_REVERSE)) { - git_iterator_type_t tmp_src = diff->old_src; - diff->old_src = diff->new_src; - diff->new_src = tmp_src; - } - - /* Unset UPDATE_INDEX unless diffing workdir and index */ - if (DIFF_FLAG_IS_SET(diff, GIT_DIFF_UPDATE_INDEX) && - (!(diff->old_src == GIT_ITERATOR_TYPE_WORKDIR || - diff->new_src == GIT_ITERATOR_TYPE_WORKDIR) || - !(diff->old_src == GIT_ITERATOR_TYPE_INDEX || - diff->new_src == GIT_ITERATOR_TYPE_INDEX))) - diff->opts.flags &= ~GIT_DIFF_UPDATE_INDEX; - - /* if ignore_submodules not explicitly set, check diff config */ - if (diff->opts.ignore_submodules <= 0) { - git_config_entry *entry; - git_config__lookup_entry(&entry, cfg, "diff.ignoresubmodules", true); - - if (entry && git_submodule_parse_ignore( - &diff->opts.ignore_submodules, entry->value) < 0) - giterr_clear(); - git_config_entry_free(entry); - } - - /* if either prefix is not set, figure out appropriate value */ - if (!diff->opts.old_prefix || !diff->opts.new_prefix) { - const char *use_old = DIFF_OLD_PREFIX_DEFAULT; - const char *use_new = DIFF_NEW_PREFIX_DEFAULT; - - if (git_config__get_bool_force(cfg, "diff.noprefix", 0)) - use_old = use_new = ""; - else if (git_config__get_bool_force(cfg, "diff.mnemonicprefix", 0)) { - use_old = diff_mnemonic_prefix(diff->old_src, true); - use_new = diff_mnemonic_prefix(diff->new_src, false); - } - - if (!diff->opts.old_prefix) - diff->opts.old_prefix = use_old; - if (!diff->opts.new_prefix) - diff->opts.new_prefix = use_new; - } - - /* strdup prefix from pool so we're not dependent on external data */ - diff->opts.old_prefix = diff_strdup_prefix(pool, diff->opts.old_prefix); - diff->opts.new_prefix = diff_strdup_prefix(pool, diff->opts.new_prefix); - - if (DIFF_FLAG_IS_SET(diff, GIT_DIFF_REVERSE)) { - const char *tmp_prefix = diff->opts.old_prefix; - diff->opts.old_prefix = diff->opts.new_prefix; - diff->opts.new_prefix = tmp_prefix; - } - - git_config_free(cfg); - - /* check strdup results for error */ - return (!diff->opts.old_prefix || !diff->opts.new_prefix) ? -1 : 0; -} - -static void diff_list_free(git_diff *diff) -{ - git_vector_free_deep(&diff->deltas); - - git_pathspec__vfree(&diff->pathspec); - git_pool_clear(&diff->pool); - - git__memzero(diff, sizeof(*diff)); - git__free(diff); -} - -void git_diff_free(git_diff *diff) -{ - if (!diff) - return; - - GIT_REFCOUNT_DEC(diff, diff_list_free); -} - -void git_diff_addref(git_diff *diff) -{ - GIT_REFCOUNT_INC(diff); -} - -int git_diff__oid_for_file( - git_oid *out, - git_diff *diff, - const char *path, - uint16_t mode, - git_off_t size) -{ - git_index_entry entry; - - memset(&entry, 0, sizeof(entry)); - entry.mode = mode; - entry.file_size = size; - entry.path = (char *)path; - - return git_diff__oid_for_entry(out, diff, &entry, mode, NULL); -} - -int git_diff__oid_for_entry( - git_oid *out, - git_diff *diff, - const git_index_entry *src, - uint16_t mode, - const git_oid *update_match) -{ - int error = 0; - git_buf full_path = GIT_BUF_INIT; - git_index_entry entry = *src; - git_filter_list *fl = NULL; - - memset(out, 0, sizeof(*out)); - - if (git_buf_joinpath( - &full_path, git_repository_workdir(diff->repo), entry.path) < 0) - return -1; - - if (!mode) { - struct stat st; - - diff->perf.stat_calls++; - - if (p_stat(full_path.ptr, &st) < 0) { - error = git_path_set_error(errno, entry.path, "stat"); - git_buf_free(&full_path); - return error; - } - - git_index_entry__init_from_stat( - &entry, &st, (diff->diffcaps & GIT_DIFFCAPS_TRUST_MODE_BITS) != 0); - } - - /* calculate OID for file if possible */ - if (S_ISGITLINK(mode)) { - git_submodule *sm; - - if (!git_submodule_lookup(&sm, diff->repo, entry.path)) { - const git_oid *sm_oid = git_submodule_wd_id(sm); - if (sm_oid) - git_oid_cpy(out, sm_oid); - git_submodule_free(sm); - } else { - /* if submodule lookup failed probably just in an intermediate - * state where some init hasn't happened, so ignore the error - */ - giterr_clear(); - } - } else if (S_ISLNK(mode)) { - error = git_odb__hashlink(out, full_path.ptr); - diff->perf.oid_calculations++; - } else if (!git__is_sizet(entry.file_size)) { - giterr_set(GITERR_OS, "File size overflow (for 32-bits) on '%s'", - entry.path); - error = -1; - } else if (!(error = git_filter_list_load( - &fl, diff->repo, NULL, entry.path, - GIT_FILTER_TO_ODB, GIT_FILTER_ALLOW_UNSAFE))) - { - int fd = git_futils_open_ro(full_path.ptr); - if (fd < 0) - error = fd; - else { - error = git_odb__hashfd_filtered( - out, fd, (size_t)entry.file_size, GIT_OBJ_BLOB, fl); - p_close(fd); - diff->perf.oid_calculations++; - } - - git_filter_list_free(fl); - } - - /* update index for entry if requested */ - if (!error && update_match && git_oid_equal(out, update_match)) { - git_index *idx; - git_index_entry updated_entry; - - memcpy(&updated_entry, &entry, sizeof(git_index_entry)); - updated_entry.mode = mode; - git_oid_cpy(&updated_entry.id, out); - - if (!(error = git_repository_index__weakptr(&idx, diff->repo))) { - error = git_index_add(idx, &updated_entry); - diff->index_updated = true; - } - } - - git_buf_free(&full_path); - return error; -} - -static bool diff_time_eq( - const git_index_time *a, const git_index_time *b, bool use_nanos) -{ - return a->seconds == b->seconds && - (!use_nanos || a->nanoseconds == b->nanoseconds); -} - -typedef struct { - git_repository *repo; - git_iterator *old_iter; - git_iterator *new_iter; - const git_index_entry *oitem; - const git_index_entry *nitem; -} diff_in_progress; - -#define MODE_BITS_MASK 0000777 - -static int maybe_modified_submodule( - git_delta_t *status, - git_oid *found_oid, - git_diff *diff, - diff_in_progress *info) -{ - int error = 0; - git_submodule *sub; - unsigned int sm_status = 0; - git_submodule_ignore_t ign = diff->opts.ignore_submodules; - - *status = GIT_DELTA_UNMODIFIED; - - if (DIFF_FLAG_IS_SET(diff, GIT_DIFF_IGNORE_SUBMODULES) || - ign == GIT_SUBMODULE_IGNORE_ALL) - return 0; - - if ((error = git_submodule_lookup( - &sub, diff->repo, info->nitem->path)) < 0) { - - /* GIT_EEXISTS means dir with .git in it was found - ignore it */ - if (error == GIT_EEXISTS) { - giterr_clear(); - error = 0; - } - return error; - } - - if (ign <= 0 && git_submodule_ignore(sub) == GIT_SUBMODULE_IGNORE_ALL) - /* ignore it */; - else if ((error = git_submodule__status( - &sm_status, NULL, NULL, found_oid, sub, ign)) < 0) - /* return error below */; - - /* check IS_WD_UNMODIFIED because this case is only used - * when the new side of the diff is the working directory - */ - else if (!GIT_SUBMODULE_STATUS_IS_WD_UNMODIFIED(sm_status)) - *status = GIT_DELTA_MODIFIED; - - /* now that we have a HEAD OID, check if HEAD moved */ - else if ((sm_status & GIT_SUBMODULE_STATUS_IN_WD) != 0 && - !git_oid_equal(&info->oitem->id, found_oid)) - *status = GIT_DELTA_MODIFIED; - - git_submodule_free(sub); - return error; -} - -static int maybe_modified( - git_diff *diff, - diff_in_progress *info) -{ - git_oid noid; - git_delta_t status = GIT_DELTA_MODIFIED; - const git_index_entry *oitem = info->oitem; - const git_index_entry *nitem = info->nitem; - unsigned int omode = oitem->mode; - unsigned int nmode = nitem->mode; - bool new_is_workdir = (info->new_iter->type == GIT_ITERATOR_TYPE_WORKDIR); - bool modified_uncertain = false; - const char *matched_pathspec; - int error = 0; - - if (!git_pathspec__match( - &diff->pathspec, oitem->path, - DIFF_FLAG_IS_SET(diff, GIT_DIFF_DISABLE_PATHSPEC_MATCH), - DIFF_FLAG_IS_SET(diff, GIT_DIFF_IGNORE_CASE), - &matched_pathspec, NULL)) - return 0; - - memset(&noid, 0, sizeof(noid)); - - /* on platforms with no symlinks, preserve mode of existing symlinks */ - if (S_ISLNK(omode) && S_ISREG(nmode) && new_is_workdir && - !(diff->diffcaps & GIT_DIFFCAPS_HAS_SYMLINKS)) - nmode = omode; - - /* on platforms with no execmode, just preserve old mode */ - if (!(diff->diffcaps & GIT_DIFFCAPS_TRUST_MODE_BITS) && - (nmode & MODE_BITS_MASK) != (omode & MODE_BITS_MASK) && - new_is_workdir) - nmode = (nmode & ~MODE_BITS_MASK) | (omode & MODE_BITS_MASK); - - /* if one side is a conflict, mark the whole delta as conflicted */ - if (git_index_entry_is_conflict(oitem) || - git_index_entry_is_conflict(nitem)) { - status = GIT_DELTA_CONFLICTED; - - /* support "assume unchanged" (poorly, b/c we still stat everything) */ - } else if ((oitem->flags & GIT_IDXENTRY_VALID) != 0) { - status = GIT_DELTA_UNMODIFIED; - - /* support "skip worktree" index bit */ - } else if ((oitem->flags_extended & GIT_IDXENTRY_SKIP_WORKTREE) != 0) { - status = GIT_DELTA_UNMODIFIED; - - /* if basic type of file changed, then split into delete and add */ - } else if (GIT_MODE_TYPE(omode) != GIT_MODE_TYPE(nmode)) { - if (DIFF_FLAG_IS_SET(diff, GIT_DIFF_INCLUDE_TYPECHANGE)) { - status = GIT_DELTA_TYPECHANGE; - } - - else if (nmode == GIT_FILEMODE_UNREADABLE) { - if (!(error = diff_delta__from_one(diff, GIT_DELTA_DELETED, oitem, NULL))) - error = diff_delta__from_one(diff, GIT_DELTA_UNREADABLE, NULL, nitem); - return error; - } - - else { - if (!(error = diff_delta__from_one(diff, GIT_DELTA_DELETED, oitem, NULL))) - error = diff_delta__from_one(diff, GIT_DELTA_ADDED, NULL, nitem); - return error; - } - - /* if oids and modes match (and are valid), then file is unmodified */ - } else if (git_oid_equal(&oitem->id, &nitem->id) && - omode == nmode && - !git_oid_iszero(&oitem->id)) { - status = GIT_DELTA_UNMODIFIED; - - /* if we have an unknown OID and a workdir iterator, then check some - * circumstances that can accelerate things or need special handling - */ - } else if (git_oid_iszero(&nitem->id) && new_is_workdir) { - bool use_ctime = ((diff->diffcaps & GIT_DIFFCAPS_TRUST_CTIME) != 0); - bool use_nanos = ((diff->diffcaps & GIT_DIFFCAPS_TRUST_NANOSECS) != 0); - git_index *index; - git_iterator_index(&index, info->new_iter); - - status = GIT_DELTA_UNMODIFIED; - - if (S_ISGITLINK(nmode)) { - if ((error = maybe_modified_submodule(&status, &noid, diff, info)) < 0) - return error; - } - - /* if the stat data looks different, then mark modified - this just - * means that the OID will be recalculated below to confirm change - */ - else if (omode != nmode || oitem->file_size != nitem->file_size) { - status = GIT_DELTA_MODIFIED; - modified_uncertain = - (oitem->file_size <= 0 && nitem->file_size > 0); - } - else if (!diff_time_eq(&oitem->mtime, &nitem->mtime, use_nanos) || - (use_ctime && - !diff_time_eq(&oitem->ctime, &nitem->ctime, use_nanos)) || - oitem->ino != nitem->ino || - oitem->uid != nitem->uid || - oitem->gid != nitem->gid || - (index && nitem->mtime.seconds >= index->stamp.mtime)) - { - status = GIT_DELTA_MODIFIED; - modified_uncertain = true; - } - - /* if mode is GITLINK and submodules are ignored, then skip */ - } else if (S_ISGITLINK(nmode) && - DIFF_FLAG_IS_SET(diff, GIT_DIFF_IGNORE_SUBMODULES)) { - status = GIT_DELTA_UNMODIFIED; - } - - /* if we got here and decided that the files are modified, but we - * haven't calculated the OID of the new item, then calculate it now - */ - if (modified_uncertain && git_oid_iszero(&nitem->id)) { - const git_oid *update_check = - DIFF_FLAG_IS_SET(diff, GIT_DIFF_UPDATE_INDEX) && omode == nmode ? - &oitem->id : NULL; - - if ((error = git_diff__oid_for_entry( - &noid, diff, nitem, nmode, update_check)) < 0) - return error; - - /* if oid matches, then mark unmodified (except submodules, where - * the filesystem content may be modified even if the oid still - * matches between the index and the workdir HEAD) - */ - if (omode == nmode && !S_ISGITLINK(omode) && - git_oid_equal(&oitem->id, &noid)) - status = GIT_DELTA_UNMODIFIED; - } - - /* If we want case changes, then break this into a delete of the old - * and an add of the new so that consumers can act accordingly (eg, - * checkout will update the case on disk.) - */ - if (DIFF_FLAG_IS_SET(diff, GIT_DIFF_IGNORE_CASE) && - DIFF_FLAG_IS_SET(diff, GIT_DIFF_INCLUDE_CASECHANGE) && - strcmp(oitem->path, nitem->path) != 0) { - - if (!(error = diff_delta__from_one(diff, GIT_DELTA_DELETED, oitem, NULL))) - error = diff_delta__from_one(diff, GIT_DELTA_ADDED, NULL, nitem); - - return error; - } - - return diff_delta__from_two( - diff, status, oitem, omode, nitem, nmode, - git_oid_iszero(&noid) ? NULL : &noid, matched_pathspec); -} - -static bool entry_is_prefixed( - git_diff *diff, - const git_index_entry *item, - const git_index_entry *prefix_item) -{ - size_t pathlen; - - if (!item || diff->pfxcomp(item->path, prefix_item->path) != 0) - return false; - - pathlen = strlen(prefix_item->path); - - return (prefix_item->path[pathlen - 1] == '/' || - item->path[pathlen] == '\0' || - item->path[pathlen] == '/'); -} - -static int iterator_current( - const git_index_entry **entry, - git_iterator *iterator) -{ - int error; - - if ((error = git_iterator_current(entry, iterator)) == GIT_ITEROVER) { - *entry = NULL; - error = 0; - } - - return error; -} - -static int iterator_advance( - const git_index_entry **entry, - git_iterator *iterator) -{ - const git_index_entry *prev_entry = *entry; - int cmp, error; - - /* if we're looking for conflicts, we only want to report - * one conflict for each file, instead of all three sides. - * so if this entry is a conflict for this file, and the - * previous one was a conflict for the same file, skip it. - */ - while ((error = git_iterator_advance(entry, iterator)) == 0) { - if (!(iterator->flags & GIT_ITERATOR_INCLUDE_CONFLICTS) || - !git_index_entry_is_conflict(prev_entry) || - !git_index_entry_is_conflict(*entry)) - break; - - cmp = (iterator->flags & GIT_ITERATOR_IGNORE_CASE) ? - strcasecmp(prev_entry->path, (*entry)->path) : - strcmp(prev_entry->path, (*entry)->path); - - if (cmp) - break; - } - - if (error == GIT_ITEROVER) { - *entry = NULL; - error = 0; - } - - return error; -} - -static int iterator_advance_into( - const git_index_entry **entry, - git_iterator *iterator) -{ - int error; - - if ((error = git_iterator_advance_into(entry, iterator)) == GIT_ITEROVER) { - *entry = NULL; - error = 0; - } - - return error; -} - -static int iterator_advance_over_with_status( - const git_index_entry **entry, - git_iterator_status_t *status, - git_iterator *iterator) -{ - int error; - - if ((error = git_iterator_advance_over_with_status( - entry, status, iterator)) == GIT_ITEROVER) { - *entry = NULL; - error = 0; - } - - return error; -} - -static int handle_unmatched_new_item( - git_diff *diff, diff_in_progress *info) -{ - int error = 0; - const git_index_entry *nitem = info->nitem; - git_delta_t delta_type = GIT_DELTA_UNTRACKED; - bool contains_oitem; - - /* check if this is a prefix of the other side */ - contains_oitem = entry_is_prefixed(diff, info->oitem, nitem); - - /* update delta_type if this item is conflicted */ - if (git_index_entry_is_conflict(nitem)) - delta_type = GIT_DELTA_CONFLICTED; - - /* update delta_type if this item is ignored */ - else if (git_iterator_current_is_ignored(info->new_iter)) - delta_type = GIT_DELTA_IGNORED; - - if (nitem->mode == GIT_FILEMODE_TREE) { - bool recurse_into_dir = contains_oitem; - - /* check if user requests recursion into this type of dir */ - recurse_into_dir = contains_oitem || - (delta_type == GIT_DELTA_UNTRACKED && - DIFF_FLAG_IS_SET(diff, GIT_DIFF_RECURSE_UNTRACKED_DIRS)) || - (delta_type == GIT_DELTA_IGNORED && - DIFF_FLAG_IS_SET(diff, GIT_DIFF_RECURSE_IGNORED_DIRS)); - - /* do not advance into directories that contain a .git file */ - if (recurse_into_dir && !contains_oitem) { - git_buf *full = NULL; - if (git_iterator_current_workdir_path(&full, info->new_iter) < 0) - return -1; - if (full && git_path_contains(full, DOT_GIT)) { - /* TODO: warning if not a valid git repository */ - recurse_into_dir = false; - } - } - - /* still have to look into untracked directories to match core git - - * with no untracked files, directory is treated as ignored - */ - if (!recurse_into_dir && - delta_type == GIT_DELTA_UNTRACKED && - DIFF_FLAG_ISNT_SET(diff, GIT_DIFF_ENABLE_FAST_UNTRACKED_DIRS)) - { - git_diff_delta *last; - git_iterator_status_t untracked_state; - - /* attempt to insert record for this directory */ - if ((error = diff_delta__from_one(diff, delta_type, NULL, nitem)) != 0) - return error; - - /* if delta wasn't created (because of rules), just skip ahead */ - last = diff_delta__last_for_item(diff, nitem); - if (!last) - return iterator_advance(&info->nitem, info->new_iter); - - /* iterate into dir looking for an actual untracked file */ - if ((error = iterator_advance_over_with_status( - &info->nitem, &untracked_state, info->new_iter)) < 0) - return error; - - /* if we found nothing or just ignored items, update the record */ - if (untracked_state == GIT_ITERATOR_STATUS_IGNORED || - untracked_state == GIT_ITERATOR_STATUS_EMPTY) { - last->status = GIT_DELTA_IGNORED; - - /* remove the record if we don't want ignored records */ - if (DIFF_FLAG_ISNT_SET(diff, GIT_DIFF_INCLUDE_IGNORED)) { - git_vector_pop(&diff->deltas); - git__free(last); - } - } - - return 0; - } - - /* try to advance into directory if necessary */ - if (recurse_into_dir) { - error = iterator_advance_into(&info->nitem, info->new_iter); - - /* if real error or no error, proceed with iteration */ - if (error != GIT_ENOTFOUND) - return error; - giterr_clear(); - - /* if directory is empty, can't advance into it, so either skip - * it or ignore it - */ - if (contains_oitem) - return iterator_advance(&info->nitem, info->new_iter); - delta_type = GIT_DELTA_IGNORED; - } - } - - else if (delta_type == GIT_DELTA_IGNORED && - DIFF_FLAG_ISNT_SET(diff, GIT_DIFF_RECURSE_IGNORED_DIRS) && - git_iterator_current_tree_is_ignored(info->new_iter)) - /* item contained in ignored directory, so skip over it */ - return iterator_advance(&info->nitem, info->new_iter); - - else if (info->new_iter->type != GIT_ITERATOR_TYPE_WORKDIR) { - if (delta_type != GIT_DELTA_CONFLICTED) - delta_type = GIT_DELTA_ADDED; - } - - else if (nitem->mode == GIT_FILEMODE_COMMIT) { - /* ignore things that are not actual submodules */ - if (git_submodule_lookup(NULL, info->repo, nitem->path) != 0) { - giterr_clear(); - delta_type = GIT_DELTA_IGNORED; - - /* if this contains a tracked item, treat as normal TREE */ - if (contains_oitem) { - error = iterator_advance_into(&info->nitem, info->new_iter); - if (error != GIT_ENOTFOUND) - return error; - - giterr_clear(); - return iterator_advance(&info->nitem, info->new_iter); - } - } - } - - else if (nitem->mode == GIT_FILEMODE_UNREADABLE) { - if (DIFF_FLAG_IS_SET(diff, GIT_DIFF_INCLUDE_UNREADABLE_AS_UNTRACKED)) - delta_type = GIT_DELTA_UNTRACKED; - else - delta_type = GIT_DELTA_UNREADABLE; - } - - /* Actually create the record for this item if necessary */ - if ((error = diff_delta__from_one(diff, delta_type, NULL, nitem)) != 0) - return error; - - /* If user requested TYPECHANGE records, then check for that instead of - * just generating an ADDED/UNTRACKED record - */ - if (delta_type != GIT_DELTA_IGNORED && - DIFF_FLAG_IS_SET(diff, GIT_DIFF_INCLUDE_TYPECHANGE_TREES) && - contains_oitem) - { - /* this entry was prefixed with a tree - make TYPECHANGE */ - git_diff_delta *last = diff_delta__last_for_item(diff, nitem); - if (last) { - last->status = GIT_DELTA_TYPECHANGE; - last->old_file.mode = GIT_FILEMODE_TREE; - } - } - - return iterator_advance(&info->nitem, info->new_iter); -} - -static int handle_unmatched_old_item( - git_diff *diff, diff_in_progress *info) -{ - git_delta_t delta_type = GIT_DELTA_DELETED; - int error; - - /* update delta_type if this item is conflicted */ - if (git_index_entry_is_conflict(info->oitem)) - delta_type = GIT_DELTA_CONFLICTED; - - if ((error = diff_delta__from_one(diff, delta_type, info->oitem, NULL)) < 0) - return error; - - /* if we are generating TYPECHANGE records then check for that - * instead of just generating a DELETE record - */ - if (DIFF_FLAG_IS_SET(diff, GIT_DIFF_INCLUDE_TYPECHANGE_TREES) && - entry_is_prefixed(diff, info->nitem, info->oitem)) - { - /* this entry has become a tree! convert to TYPECHANGE */ - git_diff_delta *last = diff_delta__last_for_item(diff, info->oitem); - if (last) { - last->status = GIT_DELTA_TYPECHANGE; - last->new_file.mode = GIT_FILEMODE_TREE; - } - - /* If new_iter is a workdir iterator, then this situation - * will certainly be followed by a series of untracked items. - * Unless RECURSE_UNTRACKED_DIRS is set, skip over them... - */ - if (S_ISDIR(info->nitem->mode) && - DIFF_FLAG_ISNT_SET(diff, GIT_DIFF_RECURSE_UNTRACKED_DIRS)) - return iterator_advance(&info->nitem, info->new_iter); - } - - return iterator_advance(&info->oitem, info->old_iter); -} - -static int handle_matched_item( - git_diff *diff, diff_in_progress *info) -{ - int error = 0; - - if ((error = maybe_modified(diff, info)) < 0) - return error; - - if (!(error = iterator_advance(&info->oitem, info->old_iter))) - error = iterator_advance(&info->nitem, info->new_iter); - - return error; -} - -int git_diff__from_iterators( - git_diff **diff_ptr, - git_repository *repo, - git_iterator *old_iter, - git_iterator *new_iter, - const git_diff_options *opts) -{ - int error = 0; - diff_in_progress info; - git_diff *diff; - - *diff_ptr = NULL; - - diff = diff_list_alloc(repo, old_iter, new_iter); - GITERR_CHECK_ALLOC(diff); - - info.repo = repo; - info.old_iter = old_iter; - info.new_iter = new_iter; - - /* make iterators have matching icase behavior */ - if (DIFF_FLAG_IS_SET(diff, GIT_DIFF_IGNORE_CASE)) { - if ((error = git_iterator_set_ignore_case(old_iter, true)) < 0 || - (error = git_iterator_set_ignore_case(new_iter, true)) < 0) - goto cleanup; - } - - /* finish initialization */ - if ((error = diff_list_apply_options(diff, opts)) < 0) - goto cleanup; - - if ((error = iterator_current(&info.oitem, old_iter)) < 0 || - (error = iterator_current(&info.nitem, new_iter)) < 0) - goto cleanup; - - /* run iterators building diffs */ - while (!error && (info.oitem || info.nitem)) { - int cmp = info.oitem ? - (info.nitem ? diff->entrycomp(info.oitem, info.nitem) : -1) : 1; - - /* create DELETED records for old items not matched in new */ - if (cmp < 0) - error = handle_unmatched_old_item(diff, &info); - - /* create ADDED, TRACKED, or IGNORED records for new items not - * matched in old (and/or descend into directories as needed) - */ - else if (cmp > 0) - error = handle_unmatched_new_item(diff, &info); - - /* otherwise item paths match, so create MODIFIED record - * (or ADDED and DELETED pair if type changed) - */ - else - error = handle_matched_item(diff, &info); - } - - diff->perf.stat_calls += old_iter->stat_calls + new_iter->stat_calls; - -cleanup: - if (!error) - *diff_ptr = diff; - else - git_diff_free(diff); - - return error; -} - -#define DIFF_FROM_ITERATORS(MAKE_FIRST, MAKE_SECOND) do { \ - git_iterator *a = NULL, *b = NULL; \ - char *pfx = opts ? git_pathspec_prefix(&opts->pathspec) : NULL; \ - GITERR_CHECK_VERSION(opts, GIT_DIFF_OPTIONS_VERSION, "git_diff_options"); \ - if (!(error = MAKE_FIRST) && !(error = MAKE_SECOND)) \ - error = git_diff__from_iterators(diff, repo, a, b, opts); \ - git__free(pfx); git_iterator_free(a); git_iterator_free(b); \ -} while (0) - -int git_diff_tree_to_tree( - git_diff **diff, - git_repository *repo, - git_tree *old_tree, - git_tree *new_tree, - const git_diff_options *opts) -{ - int error = 0; - git_iterator_flag_t iflag = GIT_ITERATOR_DONT_IGNORE_CASE; - - assert(diff && repo); - - /* for tree to tree diff, be case sensitive even if the index is - * currently case insensitive, unless the user explicitly asked - * for case insensitivity - */ - if (opts && (opts->flags & GIT_DIFF_IGNORE_CASE) != 0) - iflag = GIT_ITERATOR_IGNORE_CASE; - - DIFF_FROM_ITERATORS( - git_iterator_for_tree(&a, old_tree, iflag, pfx, pfx), - git_iterator_for_tree(&b, new_tree, iflag, pfx, pfx) - ); - - return error; -} - -static int diff_load_index(git_index **index, git_repository *repo) -{ - int error = git_repository_index__weakptr(index, repo); - - /* reload the repository index when user did not pass one in */ - if (!error && git_index_read(*index, false) < 0) - giterr_clear(); - - return error; -} - -int git_diff_tree_to_index( - git_diff **diff, - git_repository *repo, - git_tree *old_tree, - git_index *index, - const git_diff_options *opts) -{ - int error = 0; - bool index_ignore_case = false; - git_iterator_flag_t iflag = GIT_ITERATOR_DONT_IGNORE_CASE | - GIT_ITERATOR_INCLUDE_CONFLICTS; - - assert(diff && repo); - - if (!index && (error = diff_load_index(&index, repo)) < 0) - return error; - - index_ignore_case = index->ignore_case; - - DIFF_FROM_ITERATORS( - git_iterator_for_tree(&a, old_tree, iflag, pfx, pfx), - git_iterator_for_index(&b, index, iflag, pfx, pfx) - ); - - /* if index is in case-insensitive order, re-sort deltas to match */ - if (!error && index_ignore_case) - diff_set_ignore_case(*diff, true); - - return error; -} - -int git_diff_index_to_workdir( - git_diff **diff, - git_repository *repo, - git_index *index, - const git_diff_options *opts) -{ - int error = 0; - - assert(diff && repo); - - if (!index && (error = diff_load_index(&index, repo)) < 0) - return error; - - DIFF_FROM_ITERATORS( - git_iterator_for_index( - &a, index, GIT_ITERATOR_INCLUDE_CONFLICTS, pfx, pfx), - git_iterator_for_workdir( - &b, repo, index, NULL, GIT_ITERATOR_DONT_AUTOEXPAND, pfx, pfx) - ); - - if (!error && DIFF_FLAG_IS_SET(*diff, GIT_DIFF_UPDATE_INDEX) && (*diff)->index_updated) - error = git_index_write(index); - - return error; -} - -int git_diff_tree_to_workdir( - git_diff **diff, - git_repository *repo, - git_tree *old_tree, - const git_diff_options *opts) -{ - int error = 0; - git_index *index; - - assert(diff && repo); - - if ((error = git_repository_index__weakptr(&index, repo))) - return error; - - DIFF_FROM_ITERATORS( - git_iterator_for_tree(&a, old_tree, 0, pfx, pfx), - git_iterator_for_workdir( - &b, repo, index, old_tree, GIT_ITERATOR_DONT_AUTOEXPAND, pfx, pfx) - ); - - return error; -} - -int git_diff_tree_to_workdir_with_index( - git_diff **diff, - git_repository *repo, - git_tree *old_tree, - const git_diff_options *opts) -{ - int error = 0; - git_diff *d1 = NULL, *d2 = NULL; - git_index *index = NULL; - - assert(diff && repo); - - if ((error = diff_load_index(&index, repo)) < 0) - return error; - - if (!(error = git_diff_tree_to_index(&d1, repo, old_tree, index, opts)) && - !(error = git_diff_index_to_workdir(&d2, repo, index, opts))) - error = git_diff_merge(d1, d2); - - git_diff_free(d2); - - if (error) { - git_diff_free(d1); - d1 = NULL; - } - - *diff = d1; - return error; -} - -size_t git_diff_num_deltas(const git_diff *diff) -{ - assert(diff); - return diff->deltas.length; -} - -size_t git_diff_num_deltas_of_type(const git_diff *diff, git_delta_t type) -{ - size_t i, count = 0; - const git_diff_delta *delta; - - assert(diff); - - git_vector_foreach(&diff->deltas, i, delta) { - count += (delta->status == type); - } - - return count; -} - -const git_diff_delta *git_diff_get_delta(const git_diff *diff, size_t idx) -{ - assert(diff); - return git_vector_get(&diff->deltas, idx); -} - -int git_diff_is_sorted_icase(const git_diff *diff) -{ - return (diff->opts.flags & GIT_DIFF_IGNORE_CASE) != 0; -} - -int git_diff_get_perfdata(git_diff_perfdata *out, const git_diff *diff) -{ - assert(out); - GITERR_CHECK_VERSION(out, GIT_DIFF_PERFDATA_VERSION, "git_diff_perfdata"); - out->stat_calls = diff->perf.stat_calls; - out->oid_calculations = diff->perf.oid_calculations; - return 0; -} - -int git_diff__paired_foreach( - git_diff *head2idx, - git_diff *idx2wd, - int (*cb)(git_diff_delta *h2i, git_diff_delta *i2w, void *payload), - void *payload) -{ - int cmp, error = 0; - git_diff_delta *h2i, *i2w; - size_t i, j, i_max, j_max; - int (*strcomp)(const char *, const char *) = git__strcmp; - bool h2i_icase, i2w_icase, icase_mismatch; - - i_max = head2idx ? head2idx->deltas.length : 0; - j_max = idx2wd ? idx2wd->deltas.length : 0; - if (!i_max && !j_max) - return 0; - - /* At some point, tree-to-index diffs will probably never ignore case, - * even if that isn't true now. Index-to-workdir diffs may or may not - * ignore case, but the index filename for the idx2wd diff should - * still be using the canonical case-preserving name. - * - * Therefore the main thing we need to do here is make sure the diffs - * are traversed in a compatible order. To do this, we temporarily - * resort a mismatched diff to get the order correct. - * - * In order to traverse renames in the index->workdir, we need to - * ensure that we compare the index name on both sides, so we - * always sort by the old name in the i2w list. - */ - h2i_icase = head2idx != NULL && - (head2idx->opts.flags & GIT_DIFF_IGNORE_CASE) != 0; - - i2w_icase = idx2wd != NULL && - (idx2wd->opts.flags & GIT_DIFF_IGNORE_CASE) != 0; - - icase_mismatch = - (head2idx != NULL && idx2wd != NULL && h2i_icase != i2w_icase); - - if (icase_mismatch && h2i_icase) { - git_vector_set_cmp(&head2idx->deltas, git_diff_delta__cmp); - git_vector_sort(&head2idx->deltas); - } - - if (i2w_icase && !icase_mismatch) { - strcomp = git__strcasecmp; - - git_vector_set_cmp(&idx2wd->deltas, git_diff_delta__i2w_casecmp); - git_vector_sort(&idx2wd->deltas); - } else if (idx2wd != NULL) { - git_vector_set_cmp(&idx2wd->deltas, git_diff_delta__i2w_cmp); - git_vector_sort(&idx2wd->deltas); - } - - for (i = 0, j = 0; i < i_max || j < j_max; ) { - h2i = head2idx ? GIT_VECTOR_GET(&head2idx->deltas, i) : NULL; - i2w = idx2wd ? GIT_VECTOR_GET(&idx2wd->deltas, j) : NULL; - - cmp = !i2w ? -1 : !h2i ? 1 : - strcomp(h2i->new_file.path, i2w->old_file.path); - - if (cmp < 0) { - i++; i2w = NULL; - } else if (cmp > 0) { - j++; h2i = NULL; - } else { - i++; j++; - } - - if ((error = cb(h2i, i2w, payload)) != 0) { - giterr_set_after_callback(error); - break; - } - } - - /* restore case-insensitive delta sort */ - if (icase_mismatch && h2i_icase) { - git_vector_set_cmp(&head2idx->deltas, git_diff_delta__casecmp); - git_vector_sort(&head2idx->deltas); - } - - /* restore idx2wd sort by new path */ - if (idx2wd != NULL) { - git_vector_set_cmp(&idx2wd->deltas, - i2w_icase ? git_diff_delta__casecmp : git_diff_delta__cmp); - git_vector_sort(&idx2wd->deltas); - } - - return error; -} - -int git_diff__commit( - git_diff **diff, - git_repository *repo, - const git_commit *commit, - const git_diff_options *opts) -{ - git_commit *parent = NULL; - git_diff *commit_diff = NULL; - git_tree *old_tree = NULL, *new_tree = NULL; - size_t parents; - int error = 0; - - if ((parents = git_commit_parentcount(commit)) > 1) { - char commit_oidstr[GIT_OID_HEXSZ + 1]; - - error = -1; - giterr_set(GITERR_INVALID, "Commit %s is a merge commit", - git_oid_tostr(commit_oidstr, GIT_OID_HEXSZ + 1, git_commit_id(commit))); - goto on_error; - } - - if (parents > 0) - if ((error = git_commit_parent(&parent, commit, 0)) < 0 || - (error = git_commit_tree(&old_tree, parent)) < 0) - goto on_error; - - if ((error = git_commit_tree(&new_tree, commit)) < 0 || - (error = git_diff_tree_to_tree(&commit_diff, repo, old_tree, new_tree, opts)) < 0) - goto on_error; - - *diff = commit_diff; - -on_error: - git_tree_free(new_tree); - git_tree_free(old_tree); - git_commit_free(parent); - - return error; -} - -int git_diff_format_email__append_header_tobuf( - git_buf *out, - const git_oid *id, - const git_signature *author, - const char *summary, - size_t patch_no, - size_t total_patches, - bool exclude_patchno_marker) -{ - char idstr[GIT_OID_HEXSZ + 1]; - char date_str[GIT_DATE_RFC2822_SZ]; - int error = 0; - - git_oid_fmt(idstr, id); - idstr[GIT_OID_HEXSZ] = '\0'; - - if ((error = git__date_rfc2822_fmt(date_str, sizeof(date_str), &author->when)) < 0) - return error; - - error = git_buf_printf(out, - "From %s Mon Sep 17 00:00:00 2001\n" \ - "From: %s <%s>\n" \ - "Date: %s\n" \ - "Subject: ", - idstr, - author->name, author->email, - date_str); - - if (error < 0) - return error; - - if (!exclude_patchno_marker) { - if (total_patches == 1) { - error = git_buf_puts(out, "[PATCH] "); - } else { - error = git_buf_printf(out, "[PATCH %"PRIuZ"/%"PRIuZ"] ", patch_no, total_patches); - } - - if (error < 0) - return error; - } - - error = git_buf_printf(out, "%s\n\n", summary); - - return error; -} - -int git_diff_format_email__append_patches_tobuf( - git_buf *out, - git_diff *diff) -{ - size_t i, deltas; - int error = 0; - - deltas = git_diff_num_deltas(diff); - - for (i = 0; i < deltas; ++i) { - git_patch *patch = NULL; - - if ((error = git_patch_from_diff(&patch, diff, i)) >= 0) - error = git_patch_to_buf(out, patch); - - git_patch_free(patch); - - if (error < 0) - break; - } - - return error; -} - -int git_diff_format_email( - git_buf *out, - git_diff *diff, - const git_diff_format_email_options *opts) -{ - git_diff_stats *stats = NULL; - char *summary = NULL, *loc = NULL; - bool ignore_marker; - unsigned int format_flags = 0; - size_t allocsize; - int error; - - assert(out && diff && opts); - assert(opts->summary && opts->id && opts->author); - - GITERR_CHECK_VERSION(opts, GIT_DIFF_FORMAT_EMAIL_OPTIONS_VERSION, "git_format_email_options"); - - if ((ignore_marker = opts->flags & GIT_DIFF_FORMAT_EMAIL_EXCLUDE_SUBJECT_PATCH_MARKER) == false) { - if (opts->patch_no > opts->total_patches) { - giterr_set(GITERR_INVALID, "patch %"PRIuZ" out of range. max %"PRIuZ, opts->patch_no, opts->total_patches); - return -1; - } - - if (opts->patch_no == 0) { - giterr_set(GITERR_INVALID, "invalid patch no %"PRIuZ". should be >0", opts->patch_no); - return -1; - } - } - - /* the summary we receive may not be clean. - * it could potentially contain new line characters - * or not be set, sanitize, */ - if ((loc = strpbrk(opts->summary, "\r\n")) != NULL) { - size_t offset = 0; - - if ((offset = (loc - opts->summary)) == 0) { - giterr_set(GITERR_INVALID, "summary is empty"); - error = -1; - goto on_error; - } - - GITERR_CHECK_ALLOC_ADD(&allocsize, offset, 1); - summary = git__calloc(allocsize, sizeof(char)); - GITERR_CHECK_ALLOC(summary); - - strncpy(summary, opts->summary, offset); - } - - error = git_diff_format_email__append_header_tobuf(out, - opts->id, opts->author, summary == NULL ? opts->summary : summary, - opts->patch_no, opts->total_patches, ignore_marker); - - if (error < 0) - goto on_error; - - format_flags = GIT_DIFF_STATS_FULL | GIT_DIFF_STATS_INCLUDE_SUMMARY; - - if ((error = git_buf_puts(out, "---\n")) < 0 || - (error = git_diff_get_stats(&stats, diff)) < 0 || - (error = git_diff_stats_to_buf(out, stats, format_flags, 0)) < 0 || - (error = git_buf_putc(out, '\n')) < 0 || - (error = git_diff_format_email__append_patches_tobuf(out, diff)) < 0) - goto on_error; - - error = git_buf_puts(out, "--\nlibgit2 " LIBGIT2_VERSION "\n\n"); - -on_error: - git__free(summary); - git_diff_stats_free(stats); - - return error; -} - -int git_diff_commit_as_email( - git_buf *out, - git_repository *repo, - git_commit *commit, - size_t patch_no, - size_t total_patches, - git_diff_format_email_flags_t flags, - const git_diff_options *diff_opts) -{ - git_diff *diff = NULL; - git_diff_format_email_options opts = GIT_DIFF_FORMAT_EMAIL_OPTIONS_INIT; - int error; - - assert (out && repo && commit); - - opts.flags = flags; - opts.patch_no = patch_no; - opts.total_patches = total_patches; - opts.id = git_commit_id(commit); - opts.summary = git_commit_summary(commit); - opts.author = git_commit_author(commit); - - if ((error = git_diff__commit(&diff, repo, commit, diff_opts)) < 0) - return error; - - error = git_diff_format_email(out, diff, &opts); - - git_diff_free(diff); - return error; -} - -int git_diff_init_options(git_diff_options *opts, unsigned int version) -{ - GIT_INIT_STRUCTURE_FROM_TEMPLATE( - opts, version, git_diff_options, GIT_DIFF_OPTIONS_INIT); - return 0; -} - -int git_diff_find_init_options( - git_diff_find_options *opts, unsigned int version) -{ - GIT_INIT_STRUCTURE_FROM_TEMPLATE( - opts, version, git_diff_find_options, GIT_DIFF_FIND_OPTIONS_INIT); - return 0; -} - -int git_diff_format_email_init_options( - git_diff_format_email_options *opts, unsigned int version) -{ - GIT_INIT_STRUCTURE_FROM_TEMPLATE( - opts, version, git_diff_format_email_options, - GIT_DIFF_FORMAT_EMAIL_OPTIONS_INIT); - return 0; -} diff --git a/vendor/libgit2/src/diff.h b/vendor/libgit2/src/diff.h deleted file mode 100644 index 2dfc2c6154..0000000000 --- a/vendor/libgit2/src/diff.h +++ /dev/null @@ -1,175 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_diff_h__ -#define INCLUDE_diff_h__ - -#include "git2/diff.h" -#include "git2/sys/diff.h" -#include "git2/oid.h" - -#include -#include "vector.h" -#include "buffer.h" -#include "iterator.h" -#include "repository.h" -#include "pool.h" -#include "odb.h" - -#define DIFF_OLD_PREFIX_DEFAULT "a/" -#define DIFF_NEW_PREFIX_DEFAULT "b/" - -enum { - GIT_DIFFCAPS_HAS_SYMLINKS = (1 << 0), /* symlinks on platform? */ - GIT_DIFFCAPS_IGNORE_STAT = (1 << 1), /* use stat? */ - GIT_DIFFCAPS_TRUST_MODE_BITS = (1 << 2), /* use st_mode? */ - GIT_DIFFCAPS_TRUST_CTIME = (1 << 3), /* use st_ctime? */ - GIT_DIFFCAPS_USE_DEV = (1 << 4), /* use st_dev? */ - GIT_DIFFCAPS_TRUST_NANOSECS = (1 << 5), /* use stat time nanoseconds */ -}; - -#define DIFF_FLAGS_KNOWN_BINARY (GIT_DIFF_FLAG_BINARY|GIT_DIFF_FLAG_NOT_BINARY) -#define DIFF_FLAGS_NOT_BINARY (GIT_DIFF_FLAG_NOT_BINARY|GIT_DIFF_FLAG__NO_DATA) - -enum { - GIT_DIFF_FLAG__FREE_PATH = (1 << 7), /* `path` is allocated memory */ - GIT_DIFF_FLAG__FREE_DATA = (1 << 8), /* internal file data is allocated */ - GIT_DIFF_FLAG__UNMAP_DATA = (1 << 9), /* internal file data is mmap'ed */ - GIT_DIFF_FLAG__NO_DATA = (1 << 10), /* file data should not be loaded */ - GIT_DIFF_FLAG__FREE_BLOB = (1 << 11), /* release the blob when done */ - GIT_DIFF_FLAG__LOADED = (1 << 12), /* file data has been loaded */ - - GIT_DIFF_FLAG__TO_DELETE = (1 << 16), /* delete entry during rename det. */ - GIT_DIFF_FLAG__TO_SPLIT = (1 << 17), /* split entry during rename det. */ - GIT_DIFF_FLAG__IS_RENAME_TARGET = (1 << 18), - GIT_DIFF_FLAG__IS_RENAME_SOURCE = (1 << 19), - GIT_DIFF_FLAG__HAS_SELF_SIMILARITY = (1 << 20), -}; - -#define GIT_DIFF_FLAG__CLEAR_INTERNAL(F) (F) = ((F) & 0x00FFFF) - -#define GIT_DIFF__VERBOSE (1 << 30) - -struct git_diff { - git_refcount rc; - git_repository *repo; - git_diff_options opts; - git_vector pathspec; - git_vector deltas; /* vector of git_diff_delta */ - git_pool pool; - git_iterator_type_t old_src; - git_iterator_type_t new_src; - uint32_t diffcaps; - git_diff_perfdata perf; - bool index_updated; - - int (*strcomp)(const char *, const char *); - int (*strncomp)(const char *, const char *, size_t); - int (*pfxcomp)(const char *str, const char *pfx); - int (*entrycomp)(const void *a, const void *b); -}; - -extern void git_diff__cleanup_modes( - uint32_t diffcaps, uint32_t *omode, uint32_t *nmode); - -extern void git_diff_addref(git_diff *diff); - -extern int git_diff_delta__cmp(const void *a, const void *b); -extern int git_diff_delta__casecmp(const void *a, const void *b); - -extern const char *git_diff_delta__path(const git_diff_delta *delta); - -extern bool git_diff_delta__should_skip( - const git_diff_options *opts, const git_diff_delta *delta); - -extern int git_diff_delta__format_file_header( - git_buf *out, - const git_diff_delta *delta, - const char *oldpfx, - const char *newpfx, - int oid_strlen); - -extern int git_diff__oid_for_file( - git_oid *out, git_diff *, const char *, uint16_t, git_off_t); -extern int git_diff__oid_for_entry( - git_oid *out, git_diff *, const git_index_entry *, uint16_t, const git_oid *update); - -extern int git_diff__from_iterators( - git_diff **diff_ptr, - git_repository *repo, - git_iterator *old_iter, - git_iterator *new_iter, - const git_diff_options *opts); - -extern int git_diff__paired_foreach( - git_diff *idx2head, - git_diff *wd2idx, - int (*cb)(git_diff_delta *i2h, git_diff_delta *w2i, void *payload), - void *payload); - -extern int git_diff_find_similar__hashsig_for_file( - void **out, const git_diff_file *f, const char *path, void *p); - -extern int git_diff_find_similar__hashsig_for_buf( - void **out, const git_diff_file *f, const char *buf, size_t len, void *p); - -extern void git_diff_find_similar__hashsig_free(void *sig, void *payload); - -extern int git_diff_find_similar__calc_similarity( - int *score, void *siga, void *sigb, void *payload); - -extern int git_diff__commit( - git_diff **diff, git_repository *repo, const git_commit *commit, const git_diff_options *opts); - -/* Merge two `git_diff`s according to the callback given by `cb`. */ - -typedef git_diff_delta *(*git_diff__merge_cb)( - const git_diff_delta *left, - const git_diff_delta *right, - git_pool *pool); - -extern int git_diff__merge( - git_diff *onto, const git_diff *from, git_diff__merge_cb cb); - -extern git_diff_delta *git_diff__merge_like_cgit( - const git_diff_delta *a, - const git_diff_delta *b, - git_pool *pool); - -/* Duplicate a `git_diff_delta` out of the `git_pool` */ -extern git_diff_delta *git_diff__delta_dup( - const git_diff_delta *d, git_pool *pool); - -/* - * Sometimes a git_diff_file will have a zero size; this attempts to - * fill in the size without loading the blob if possible. If that is - * not possible, then it will return the git_odb_object that had to be - * loaded and the caller can use it or dispose of it as needed. - */ -GIT_INLINE(int) git_diff_file__resolve_zero_size( - git_diff_file *file, git_odb_object **odb_obj, git_repository *repo) -{ - int error; - git_odb *odb; - size_t len; - git_otype type; - - if ((error = git_repository_odb(&odb, repo)) < 0) - return error; - - error = git_odb__read_header_or_object( - odb_obj, &len, &type, odb, &file->id); - - git_odb_free(odb); - - if (!error) - file->size = (git_off_t)len; - - return error; -} - -#endif - diff --git a/vendor/libgit2/src/diff_driver.c b/vendor/libgit2/src/diff_driver.c deleted file mode 100644 index 9d13371033..0000000000 --- a/vendor/libgit2/src/diff_driver.c +++ /dev/null @@ -1,524 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#include "common.h" - -#include "git2/attr.h" - -#include "diff.h" -#include "diff_patch.h" -#include "diff_driver.h" -#include "strmap.h" -#include "map.h" -#include "buf_text.h" -#include "config.h" -#include "repository.h" - -GIT__USE_STRMAP - -typedef enum { - DIFF_DRIVER_AUTO = 0, - DIFF_DRIVER_BINARY = 1, - DIFF_DRIVER_TEXT = 2, - DIFF_DRIVER_PATTERNLIST = 3, -} git_diff_driver_t; - -typedef struct { - regex_t re; - int flags; -} git_diff_driver_pattern; - -enum { - REG_NEGATE = (1 << 15) /* get out of the way of existing flags */ -}; - -/* data for finding function context for a given file type */ -struct git_diff_driver { - git_diff_driver_t type; - uint32_t binary_flags; - uint32_t other_flags; - git_array_t(git_diff_driver_pattern) fn_patterns; - regex_t word_pattern; - char name[GIT_FLEX_ARRAY]; -}; - -#include "userdiff.h" - -struct git_diff_driver_registry { - git_strmap *drivers; -}; - -#define FORCE_DIFFABLE (GIT_DIFF_FORCE_TEXT | GIT_DIFF_FORCE_BINARY) - -static git_diff_driver global_drivers[3] = { - { DIFF_DRIVER_AUTO, 0, 0, }, - { DIFF_DRIVER_BINARY, GIT_DIFF_FORCE_BINARY, 0 }, - { DIFF_DRIVER_TEXT, GIT_DIFF_FORCE_TEXT, 0 }, -}; - -git_diff_driver_registry *git_diff_driver_registry_new() -{ - git_diff_driver_registry *reg = - git__calloc(1, sizeof(git_diff_driver_registry)); - if (!reg) - return NULL; - - if (git_strmap_alloc(®->drivers) < 0) { - git_diff_driver_registry_free(reg); - return NULL; - } - - return reg; -} - -void git_diff_driver_registry_free(git_diff_driver_registry *reg) -{ - git_diff_driver *drv; - - if (!reg) - return; - - git_strmap_foreach_value(reg->drivers, drv, git_diff_driver_free(drv)); - git_strmap_free(reg->drivers); - git__free(reg); -} - -static int diff_driver_add_patterns( - git_diff_driver *drv, const char *regex_str, int regex_flags) -{ - int error = 0; - const char *scan, *end; - git_diff_driver_pattern *pat = NULL; - git_buf buf = GIT_BUF_INIT; - - for (scan = regex_str; scan; scan = end) { - /* get pattern to fill in */ - if ((pat = git_array_alloc(drv->fn_patterns)) == NULL) { - error = -1; - break; - } - - pat->flags = regex_flags; - if (*scan == '!') { - pat->flags |= REG_NEGATE; - ++scan; - } - - if ((end = strchr(scan, '\n')) != NULL) { - error = git_buf_set(&buf, scan, end - scan); - end++; - } else { - error = git_buf_sets(&buf, scan); - } - if (error < 0) - break; - - if ((error = regcomp(&pat->re, buf.ptr, regex_flags)) != 0) { - /* if regex fails to compile, warn? fail? */ - error = giterr_set_regex(&pat->re, error); - regfree(&pat->re); - break; - } - } - - if (error && pat != NULL) - (void)git_array_pop(drv->fn_patterns); /* release last item */ - git_buf_free(&buf); - - return error; -} - -static int diff_driver_xfuncname(const git_config_entry *entry, void *payload) -{ - return diff_driver_add_patterns(payload, entry->value, REG_EXTENDED); -} - -static int diff_driver_funcname(const git_config_entry *entry, void *payload) -{ - return diff_driver_add_patterns(payload, entry->value, 0); -} - -static git_diff_driver_registry *git_repository_driver_registry( - git_repository *repo) -{ - if (!repo->diff_drivers) { - git_diff_driver_registry *reg = git_diff_driver_registry_new(); - reg = git__compare_and_swap(&repo->diff_drivers, NULL, reg); - - if (reg != NULL) /* if we race, free losing allocation */ - git_diff_driver_registry_free(reg); - } - - if (!repo->diff_drivers) - giterr_set(GITERR_REPOSITORY, "Unable to create diff driver registry"); - - return repo->diff_drivers; -} - -static int diff_driver_alloc( - git_diff_driver **out, size_t *namelen_out, const char *name) -{ - git_diff_driver *driver; - size_t driverlen = sizeof(git_diff_driver), - namelen = strlen(name), - alloclen; - - GITERR_CHECK_ALLOC_ADD(&alloclen, driverlen, namelen); - GITERR_CHECK_ALLOC_ADD(&alloclen, alloclen, 1); - - driver = git__calloc(1, alloclen); - GITERR_CHECK_ALLOC(driver); - - memcpy(driver->name, name, namelen); - - *out = driver; - - if (namelen_out) - *namelen_out = namelen; - - return 0; -} - -static int git_diff_driver_builtin( - git_diff_driver **out, - git_diff_driver_registry *reg, - const char *driver_name) -{ - int error = 0; - git_diff_driver_definition *ddef = NULL; - git_diff_driver *drv = NULL; - size_t idx; - - for (idx = 0; idx < ARRAY_SIZE(builtin_defs); ++idx) { - if (!strcasecmp(driver_name, builtin_defs[idx].name)) { - ddef = &builtin_defs[idx]; - break; - } - } - if (!ddef) - goto done; - - if ((error = diff_driver_alloc(&drv, NULL, ddef->name)) < 0) - goto done; - - drv->type = DIFF_DRIVER_PATTERNLIST; - - if (ddef->fns && - (error = diff_driver_add_patterns( - drv, ddef->fns, ddef->flags | REG_EXTENDED)) < 0) - goto done; - - if (ddef->words && - (error = regcomp( - &drv->word_pattern, ddef->words, ddef->flags | REG_EXTENDED))) - { - error = giterr_set_regex(&drv->word_pattern, error); - goto done; - } - - git_strmap_insert(reg->drivers, drv->name, drv, error); - if (error > 0) - error = 0; - -done: - if (error && drv) - git_diff_driver_free(drv); - else - *out = drv; - - return error; -} - -static int git_diff_driver_load( - git_diff_driver **out, git_repository *repo, const char *driver_name) -{ - int error = 0; - git_diff_driver_registry *reg; - git_diff_driver *drv = NULL; - size_t namelen; - khiter_t pos; - git_config *cfg = NULL; - git_buf name = GIT_BUF_INIT; - git_config_entry *ce = NULL; - bool found_driver = false; - - if ((reg = git_repository_driver_registry(repo)) == NULL) - return -1; - - pos = git_strmap_lookup_index(reg->drivers, driver_name); - if (git_strmap_valid_index(reg->drivers, pos)) { - *out = git_strmap_value_at(reg->drivers, pos); - return 0; - } - - if ((error = diff_driver_alloc(&drv, &namelen, driver_name)) < 0) - goto done; - - drv->type = DIFF_DRIVER_AUTO; - - /* if you can't read config for repo, just use default driver */ - if (git_repository_config_snapshot(&cfg, repo) < 0) { - giterr_clear(); - goto done; - } - - if ((error = git_buf_printf(&name, "diff.%s.binary", driver_name)) < 0) - goto done; - - switch (git_config__get_bool_force(cfg, name.ptr, -1)) { - case true: - /* if diff..binary is true, just return the binary driver */ - *out = &global_drivers[DIFF_DRIVER_BINARY]; - goto done; - case false: - /* if diff..binary is false, force binary checks off */ - /* but still may have custom function context patterns, etc. */ - drv->binary_flags = GIT_DIFF_FORCE_TEXT; - found_driver = true; - break; - default: - /* diff..binary unspecified or "auto", so just continue */ - break; - } - - /* TODO: warn if diff..command or diff..textconv are set */ - - git_buf_truncate(&name, namelen + strlen("diff..")); - git_buf_put(&name, "xfuncname", strlen("xfuncname")); - if ((error = git_config_get_multivar_foreach( - cfg, name.ptr, NULL, diff_driver_xfuncname, drv)) < 0) { - if (error != GIT_ENOTFOUND) - goto done; - giterr_clear(); /* no diff..xfuncname, so just continue */ - } - - git_buf_truncate(&name, namelen + strlen("diff..")); - git_buf_put(&name, "funcname", strlen("funcname")); - if ((error = git_config_get_multivar_foreach( - cfg, name.ptr, NULL, diff_driver_funcname, drv)) < 0) { - if (error != GIT_ENOTFOUND) - goto done; - giterr_clear(); /* no diff..funcname, so just continue */ - } - - /* if we found any patterns, set driver type to use correct callback */ - if (git_array_size(drv->fn_patterns) > 0) { - drv->type = DIFF_DRIVER_PATTERNLIST; - found_driver = true; - } - - git_buf_truncate(&name, namelen + strlen("diff..")); - git_buf_put(&name, "wordregex", strlen("wordregex")); - if ((error = git_config__lookup_entry(&ce, cfg, name.ptr, false)) < 0) - goto done; - if (!ce || !ce->value) - /* no diff..wordregex, so just continue */; - else if (!(error = regcomp(&drv->word_pattern, ce->value, REG_EXTENDED))) - found_driver = true; - else { - /* TODO: warn about bad regex instead of failure */ - error = giterr_set_regex(&drv->word_pattern, error); - goto done; - } - - /* TODO: look up diff..algorithm to turn on minimal / patience - * diff in drv->other_flags - */ - - /* if no driver config found at all, fall back on AUTO driver */ - if (!found_driver) - goto done; - - /* store driver in registry */ - git_strmap_insert(reg->drivers, drv->name, drv, error); - if (error < 0) - goto done; - error = 0; - - *out = drv; - -done: - git_config_entry_free(ce); - git_buf_free(&name); - git_config_free(cfg); - - if (!*out) { - int error2 = git_diff_driver_builtin(out, reg, driver_name); - if (!error) - error = error2; - } - - if (drv && drv != *out) - git_diff_driver_free(drv); - - return error; -} - -int git_diff_driver_lookup( - git_diff_driver **out, git_repository *repo, const char *path) -{ - int error = 0; - const char *value; - - assert(out); - *out = NULL; - - if (!repo || !path || !strlen(path)) - /* just use the auto value */; - else if ((error = git_attr_get(&value, repo, 0, path, "diff")) < 0) - /* return error below */; - else if (GIT_ATTR_UNSPECIFIED(value)) - /* just use the auto value */; - else if (GIT_ATTR_FALSE(value)) - *out = &global_drivers[DIFF_DRIVER_BINARY]; - else if (GIT_ATTR_TRUE(value)) - *out = &global_drivers[DIFF_DRIVER_TEXT]; - - /* otherwise look for driver information in config and build driver */ - else if ((error = git_diff_driver_load(out, repo, value)) < 0) { - if (error == GIT_ENOTFOUND) { - error = 0; - giterr_clear(); - } - } - - if (!*out) - *out = &global_drivers[DIFF_DRIVER_AUTO]; - - return error; -} - -void git_diff_driver_free(git_diff_driver *driver) -{ - size_t i; - - if (!driver) - return; - - for (i = 0; i < git_array_size(driver->fn_patterns); ++i) - regfree(& git_array_get(driver->fn_patterns, i)->re); - git_array_clear(driver->fn_patterns); - - regfree(&driver->word_pattern); - - git__free(driver); -} - -void git_diff_driver_update_options( - uint32_t *option_flags, git_diff_driver *driver) -{ - if ((*option_flags & FORCE_DIFFABLE) == 0) - *option_flags |= driver->binary_flags; - - *option_flags |= driver->other_flags; -} - -int git_diff_driver_content_is_binary( - git_diff_driver *driver, const char *content, size_t content_len) -{ - git_buf search = GIT_BUF_INIT; - - GIT_UNUSED(driver); - - git_buf_attach_notowned(&search, content, - min(content_len, GIT_FILTER_BYTES_TO_CHECK_NUL)); - - /* TODO: provide encoding / binary detection callbacks that can - * be UTF-8 aware, etc. For now, instead of trying to be smart, - * let's just use the simple NUL-byte detection that core git uses. - */ - - /* previously was: if (git_buf_text_is_binary(&search)) */ - if (git_buf_text_contains_nul(&search)) - return 1; - - return 0; -} - -static int diff_context_line__simple( - git_diff_driver *driver, git_buf *line) -{ - char firstch = line->ptr[0]; - GIT_UNUSED(driver); - return (git__isalpha(firstch) || firstch == '_' || firstch == '$'); -} - -static int diff_context_line__pattern_match( - git_diff_driver *driver, git_buf *line) -{ - size_t i, maxi = git_array_size(driver->fn_patterns); - regmatch_t pmatch[2]; - - for (i = 0; i < maxi; ++i) { - git_diff_driver_pattern *pat = git_array_get(driver->fn_patterns, i); - - if (!regexec(&pat->re, line->ptr, 2, pmatch, 0)) { - if (pat->flags & REG_NEGATE) - return false; - - /* use pmatch data to trim line data */ - i = (pmatch[1].rm_so >= 0) ? 1 : 0; - git_buf_consume(line, git_buf_cstr(line) + pmatch[i].rm_so); - git_buf_truncate(line, pmatch[i].rm_eo - pmatch[i].rm_so); - git_buf_rtrim(line); - - return true; - } - } - - return false; -} - -static long diff_context_find( - const char *line, - long line_len, - char *out, - long out_size, - void *payload) -{ - git_diff_find_context_payload *ctxt = payload; - - if (git_buf_set(&ctxt->line, line, (size_t)line_len) < 0) - return -1; - git_buf_rtrim(&ctxt->line); - - if (!ctxt->line.size) - return -1; - - if (!ctxt->match_line || !ctxt->match_line(ctxt->driver, &ctxt->line)) - return -1; - - if (out_size > (long)ctxt->line.size) - out_size = (long)ctxt->line.size; - memcpy(out, ctxt->line.ptr, (size_t)out_size); - - return out_size; -} - -void git_diff_find_context_init( - git_diff_find_context_fn *findfn_out, - git_diff_find_context_payload *payload_out, - git_diff_driver *driver) -{ - *findfn_out = driver ? diff_context_find : NULL; - - memset(payload_out, 0, sizeof(*payload_out)); - if (driver) { - payload_out->driver = driver; - payload_out->match_line = (driver->type == DIFF_DRIVER_PATTERNLIST) ? - diff_context_line__pattern_match : diff_context_line__simple; - git_buf_init(&payload_out->line, 0); - } -} - -void git_diff_find_context_clear(git_diff_find_context_payload *payload) -{ - if (payload) { - git_buf_free(&payload->line); - payload->driver = NULL; - } -} - diff --git a/vendor/libgit2/src/diff_driver.h b/vendor/libgit2/src/diff_driver.h deleted file mode 100644 index 0706dcfc5a..0000000000 --- a/vendor/libgit2/src/diff_driver.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_diff_driver_h__ -#define INCLUDE_diff_driver_h__ - -#include "common.h" -#include "buffer.h" - -typedef struct git_diff_driver_registry git_diff_driver_registry; - -git_diff_driver_registry *git_diff_driver_registry_new(void); -void git_diff_driver_registry_free(git_diff_driver_registry *); - -typedef struct git_diff_driver git_diff_driver; - -int git_diff_driver_lookup(git_diff_driver **, git_repository *, const char *); -void git_diff_driver_free(git_diff_driver *); - -/* diff option flags to force off and on for this driver */ -void git_diff_driver_update_options(uint32_t *option_flags, git_diff_driver *); - -/* returns -1 meaning "unknown", 0 meaning not binary, 1 meaning binary */ -int git_diff_driver_content_is_binary( - git_diff_driver *, const char *content, size_t content_len); - -typedef long (*git_diff_find_context_fn)( - const char *, long, char *, long, void *); - -typedef int (*git_diff_find_context_line)( - git_diff_driver *, git_buf *); - -typedef struct { - git_diff_driver *driver; - git_diff_find_context_line match_line; - git_buf line; -} git_diff_find_context_payload; - -void git_diff_find_context_init( - git_diff_find_context_fn *findfn_out, - git_diff_find_context_payload *payload_out, - git_diff_driver *driver); - -void git_diff_find_context_clear(git_diff_find_context_payload *); - -#endif diff --git a/vendor/libgit2/src/diff_file.c b/vendor/libgit2/src/diff_file.c deleted file mode 100644 index c603628657..0000000000 --- a/vendor/libgit2/src/diff_file.c +++ /dev/null @@ -1,439 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#include "common.h" -#include "git2/blob.h" -#include "git2/submodule.h" -#include "diff.h" -#include "diff_file.h" -#include "odb.h" -#include "fileops.h" -#include "filter.h" - -#define DIFF_MAX_FILESIZE 0x20000000 - -static bool diff_file_content_binary_by_size(git_diff_file_content *fc) -{ - /* if we have diff opts, check max_size vs file size */ - if ((fc->file->flags & DIFF_FLAGS_KNOWN_BINARY) == 0 && - fc->opts_max_size > 0 && - fc->file->size > fc->opts_max_size) - fc->file->flags |= GIT_DIFF_FLAG_BINARY; - - return ((fc->file->flags & GIT_DIFF_FLAG_BINARY) != 0); -} - -static void diff_file_content_binary_by_content(git_diff_file_content *fc) -{ - if ((fc->file->flags & DIFF_FLAGS_KNOWN_BINARY) != 0) - return; - - switch (git_diff_driver_content_is_binary( - fc->driver, fc->map.data, fc->map.len)) { - case 0: fc->file->flags |= GIT_DIFF_FLAG_NOT_BINARY; break; - case 1: fc->file->flags |= GIT_DIFF_FLAG_BINARY; break; - default: break; - } -} - -static int diff_file_content_init_common( - git_diff_file_content *fc, const git_diff_options *opts) -{ - fc->opts_flags = opts ? opts->flags : GIT_DIFF_NORMAL; - - if (opts && opts->max_size >= 0) - fc->opts_max_size = opts->max_size ? - opts->max_size : DIFF_MAX_FILESIZE; - - if (fc->src == GIT_ITERATOR_TYPE_EMPTY) - fc->src = GIT_ITERATOR_TYPE_TREE; - - if (!fc->driver && - git_diff_driver_lookup(&fc->driver, fc->repo, fc->file->path) < 0) - return -1; - - /* give driver a chance to modify options */ - git_diff_driver_update_options(&fc->opts_flags, fc->driver); - - /* make sure file is conceivable mmap-able */ - if ((git_off_t)((size_t)fc->file->size) != fc->file->size) - fc->file->flags |= GIT_DIFF_FLAG_BINARY; - /* check if user is forcing text diff the file */ - else if (fc->opts_flags & GIT_DIFF_FORCE_TEXT) { - fc->file->flags &= ~GIT_DIFF_FLAG_BINARY; - fc->file->flags |= GIT_DIFF_FLAG_NOT_BINARY; - } - /* check if user is forcing binary diff the file */ - else if (fc->opts_flags & GIT_DIFF_FORCE_BINARY) { - fc->file->flags &= ~GIT_DIFF_FLAG_NOT_BINARY; - fc->file->flags |= GIT_DIFF_FLAG_BINARY; - } - - diff_file_content_binary_by_size(fc); - - if ((fc->flags & GIT_DIFF_FLAG__NO_DATA) != 0) { - fc->flags |= GIT_DIFF_FLAG__LOADED; - fc->map.len = 0; - fc->map.data = ""; - } - - if ((fc->flags & GIT_DIFF_FLAG__LOADED) != 0) - diff_file_content_binary_by_content(fc); - - return 0; -} - -int git_diff_file_content__init_from_diff( - git_diff_file_content *fc, - git_diff *diff, - git_diff_delta *delta, - bool use_old) -{ - bool has_data = true; - - memset(fc, 0, sizeof(*fc)); - fc->repo = diff->repo; - fc->file = use_old ? &delta->old_file : &delta->new_file; - fc->src = use_old ? diff->old_src : diff->new_src; - - if (git_diff_driver_lookup(&fc->driver, fc->repo, fc->file->path) < 0) - return -1; - - switch (delta->status) { - case GIT_DELTA_ADDED: - has_data = !use_old; break; - case GIT_DELTA_DELETED: - has_data = use_old; break; - case GIT_DELTA_UNTRACKED: - has_data = !use_old && - (diff->opts.flags & GIT_DIFF_SHOW_UNTRACKED_CONTENT) != 0; - break; - case GIT_DELTA_UNREADABLE: - case GIT_DELTA_MODIFIED: - case GIT_DELTA_COPIED: - case GIT_DELTA_RENAMED: - break; - default: - has_data = false; - break; - } - - if (!has_data) - fc->flags |= GIT_DIFF_FLAG__NO_DATA; - - return diff_file_content_init_common(fc, &diff->opts); -} - -int git_diff_file_content__init_from_src( - git_diff_file_content *fc, - git_repository *repo, - const git_diff_options *opts, - const git_diff_file_content_src *src, - git_diff_file *as_file) -{ - memset(fc, 0, sizeof(*fc)); - fc->repo = repo; - fc->file = as_file; - fc->blob = src->blob; - - if (!src->blob && !src->buf) { - fc->flags |= GIT_DIFF_FLAG__NO_DATA; - } else { - fc->flags |= GIT_DIFF_FLAG__LOADED; - fc->file->flags |= GIT_DIFF_FLAG_VALID_ID; - fc->file->mode = GIT_FILEMODE_BLOB; - - if (src->blob) { - fc->file->size = git_blob_rawsize(src->blob); - git_oid_cpy(&fc->file->id, git_blob_id(src->blob)); - - fc->map.len = (size_t)fc->file->size; - fc->map.data = (char *)git_blob_rawcontent(src->blob); - } else { - fc->file->size = src->buflen; - git_odb_hash(&fc->file->id, src->buf, src->buflen, GIT_OBJ_BLOB); - - fc->map.len = src->buflen; - fc->map.data = (char *)src->buf; - } - } - - return diff_file_content_init_common(fc, opts); -} - -static int diff_file_content_commit_to_str( - git_diff_file_content *fc, bool check_status) -{ - char oid[GIT_OID_HEXSZ+1]; - git_buf content = GIT_BUF_INIT; - const char *status = ""; - - if (check_status) { - int error = 0; - git_submodule *sm = NULL; - unsigned int sm_status = 0; - const git_oid *sm_head; - - if ((error = git_submodule_lookup(&sm, fc->repo, fc->file->path)) < 0) { - /* GIT_EEXISTS means a "submodule" that has not been git added */ - if (error == GIT_EEXISTS) { - giterr_clear(); - error = 0; - } - return error; - } - - if ((error = git_submodule_status(&sm_status, fc->repo, fc->file->path, GIT_SUBMODULE_IGNORE_UNSPECIFIED)) < 0) { - git_submodule_free(sm); - return error; - } - - /* update OID if we didn't have it previously */ - if ((fc->file->flags & GIT_DIFF_FLAG_VALID_ID) == 0 && - ((sm_head = git_submodule_wd_id(sm)) != NULL || - (sm_head = git_submodule_head_id(sm)) != NULL)) - { - git_oid_cpy(&fc->file->id, sm_head); - fc->file->flags |= GIT_DIFF_FLAG_VALID_ID; - } - - if (GIT_SUBMODULE_STATUS_IS_WD_DIRTY(sm_status)) - status = "-dirty"; - - git_submodule_free(sm); - } - - git_oid_tostr(oid, sizeof(oid), &fc->file->id); - if (git_buf_printf(&content, "Subproject commit %s%s\n", oid, status) < 0) - return -1; - - fc->map.len = git_buf_len(&content); - fc->map.data = git_buf_detach(&content); - fc->flags |= GIT_DIFF_FLAG__FREE_DATA; - - return 0; -} - -static int diff_file_content_load_blob( - git_diff_file_content *fc, - git_diff_options *opts) -{ - int error = 0; - git_odb_object *odb_obj = NULL; - - if (git_oid_iszero(&fc->file->id)) - return 0; - - if (fc->file->mode == GIT_FILEMODE_COMMIT) - return diff_file_content_commit_to_str(fc, false); - - /* if we don't know size, try to peek at object header first */ - if (!fc->file->size) { - if ((error = git_diff_file__resolve_zero_size( - fc->file, &odb_obj, fc->repo)) < 0) - return error; - } - - if ((opts->flags & GIT_DIFF_SHOW_BINARY) == 0 && - diff_file_content_binary_by_size(fc)) - return 0; - - if (odb_obj != NULL) { - error = git_object__from_odb_object( - (git_object **)&fc->blob, fc->repo, odb_obj, GIT_OBJ_BLOB); - git_odb_object_free(odb_obj); - } else { - error = git_blob_lookup( - (git_blob **)&fc->blob, fc->repo, &fc->file->id); - } - - if (!error) { - fc->flags |= GIT_DIFF_FLAG__FREE_BLOB; - fc->map.data = (void *)git_blob_rawcontent(fc->blob); - fc->map.len = (size_t)git_blob_rawsize(fc->blob); - } - - return error; -} - -static int diff_file_content_load_workdir_symlink( - git_diff_file_content *fc, git_buf *path) -{ - ssize_t alloc_len, read_len; - - /* link path on disk could be UTF-16, so prepare a buffer that is - * big enough to handle some UTF-8 data expansion - */ - alloc_len = (ssize_t)(fc->file->size * 2) + 1; - - fc->map.data = git__calloc(alloc_len, sizeof(char)); - GITERR_CHECK_ALLOC(fc->map.data); - - fc->flags |= GIT_DIFF_FLAG__FREE_DATA; - - read_len = p_readlink(git_buf_cstr(path), fc->map.data, alloc_len); - if (read_len < 0) { - giterr_set(GITERR_OS, "Failed to read symlink '%s'", fc->file->path); - return -1; - } - - fc->map.len = read_len; - return 0; -} - -static int diff_file_content_load_workdir_file( - git_diff_file_content *fc, - git_buf *path, - git_diff_options *diff_opts) -{ - int error = 0; - git_filter_list *fl = NULL; - git_file fd = git_futils_open_ro(git_buf_cstr(path)); - git_buf raw = GIT_BUF_INIT; - - if (fd < 0) - return fd; - - if (!fc->file->size && - !(fc->file->size = git_futils_filesize(fd))) - goto cleanup; - - if ((diff_opts->flags & GIT_DIFF_SHOW_BINARY) == 0 && - diff_file_content_binary_by_size(fc)) - goto cleanup; - - if ((error = git_filter_list_load( - &fl, fc->repo, NULL, fc->file->path, - GIT_FILTER_TO_ODB, GIT_FILTER_ALLOW_UNSAFE)) < 0) - goto cleanup; - - /* if there are no filters, try to mmap the file */ - if (fl == NULL) { - if (!(error = git_futils_mmap_ro( - &fc->map, fd, 0, (size_t)fc->file->size))) { - fc->flags |= GIT_DIFF_FLAG__UNMAP_DATA; - goto cleanup; - } - - /* if mmap failed, fall through to try readbuffer below */ - giterr_clear(); - } - - if (!(error = git_futils_readbuffer_fd(&raw, fd, (size_t)fc->file->size))) { - git_buf out = GIT_BUF_INIT; - - error = git_filter_list_apply_to_data(&out, fl, &raw); - - if (out.ptr != raw.ptr) - git_buf_free(&raw); - - if (!error) { - fc->map.len = out.size; - fc->map.data = out.ptr; - fc->flags |= GIT_DIFF_FLAG__FREE_DATA; - } - } - -cleanup: - git_filter_list_free(fl); - p_close(fd); - - return error; -} - -static int diff_file_content_load_workdir( - git_diff_file_content *fc, - git_diff_options *diff_opts) -{ - int error = 0; - git_buf path = GIT_BUF_INIT; - - if (fc->file->mode == GIT_FILEMODE_COMMIT) - return diff_file_content_commit_to_str(fc, true); - - if (fc->file->mode == GIT_FILEMODE_TREE) - return 0; - - if (git_buf_joinpath( - &path, git_repository_workdir(fc->repo), fc->file->path) < 0) - return -1; - - if (S_ISLNK(fc->file->mode)) - error = diff_file_content_load_workdir_symlink(fc, &path); - else - error = diff_file_content_load_workdir_file(fc, &path, diff_opts); - - /* once data is loaded, update OID if we didn't have it previously */ - if (!error && (fc->file->flags & GIT_DIFF_FLAG_VALID_ID) == 0) { - error = git_odb_hash( - &fc->file->id, fc->map.data, fc->map.len, GIT_OBJ_BLOB); - fc->file->flags |= GIT_DIFF_FLAG_VALID_ID; - } - - git_buf_free(&path); - return error; -} - -int git_diff_file_content__load( - git_diff_file_content *fc, - git_diff_options *diff_opts) -{ - int error = 0; - - if ((fc->flags & GIT_DIFF_FLAG__LOADED) != 0) - return 0; - - if ((fc->file->flags & GIT_DIFF_FLAG_BINARY) != 0 && - (diff_opts->flags & GIT_DIFF_SHOW_BINARY) == 0) - return 0; - - if (fc->src == GIT_ITERATOR_TYPE_WORKDIR) - error = diff_file_content_load_workdir(fc, diff_opts); - else - error = diff_file_content_load_blob(fc, diff_opts); - if (error) - return error; - - fc->flags |= GIT_DIFF_FLAG__LOADED; - - diff_file_content_binary_by_content(fc); - - return 0; -} - -void git_diff_file_content__unload(git_diff_file_content *fc) -{ - if ((fc->flags & GIT_DIFF_FLAG__LOADED) == 0) - return; - - if (fc->flags & GIT_DIFF_FLAG__FREE_DATA) { - git__free(fc->map.data); - fc->map.data = ""; - fc->map.len = 0; - fc->flags &= ~GIT_DIFF_FLAG__FREE_DATA; - } - else if (fc->flags & GIT_DIFF_FLAG__UNMAP_DATA) { - git_futils_mmap_free(&fc->map); - fc->map.data = ""; - fc->map.len = 0; - fc->flags &= ~GIT_DIFF_FLAG__UNMAP_DATA; - } - - if (fc->flags & GIT_DIFF_FLAG__FREE_BLOB) { - git_blob_free((git_blob *)fc->blob); - fc->blob = NULL; - fc->flags &= ~GIT_DIFF_FLAG__FREE_BLOB; - } - - fc->flags &= ~GIT_DIFF_FLAG__LOADED; -} - -void git_diff_file_content__clear(git_diff_file_content *fc) -{ - git_diff_file_content__unload(fc); - - /* for now, nothing else to do */ -} diff --git a/vendor/libgit2/src/diff_file.h b/vendor/libgit2/src/diff_file.h deleted file mode 100644 index 0d54b6d330..0000000000 --- a/vendor/libgit2/src/diff_file.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_diff_file_h__ -#define INCLUDE_diff_file_h__ - -#include "common.h" -#include "diff.h" -#include "diff_driver.h" -#include "map.h" - -/* expanded information for one side of a delta */ -typedef struct { - git_repository *repo; - git_diff_file *file; - git_diff_driver *driver; - uint32_t flags; - uint32_t opts_flags; - git_off_t opts_max_size; - git_iterator_type_t src; - const git_blob *blob; - git_map map; -} git_diff_file_content; - -extern int git_diff_file_content__init_from_diff( - git_diff_file_content *fc, - git_diff *diff, - git_diff_delta *delta, - bool use_old); - -typedef struct { - const git_blob *blob; - const void *buf; - size_t buflen; - const char *as_path; -} git_diff_file_content_src; - -#define GIT_DIFF_FILE_CONTENT_SRC__BLOB(BLOB,PATH) { (BLOB),NULL,0,(PATH) } -#define GIT_DIFF_FILE_CONTENT_SRC__BUF(BUF,LEN,PATH) { NULL,(BUF),(LEN),(PATH) } - -extern int git_diff_file_content__init_from_src( - git_diff_file_content *fc, - git_repository *repo, - const git_diff_options *opts, - const git_diff_file_content_src *src, - git_diff_file *as_file); - -/* this loads the blob/file-on-disk as needed */ -extern int git_diff_file_content__load( - git_diff_file_content *fc, - git_diff_options *diff_opts); - -/* this releases the blob/file-in-memory */ -extern void git_diff_file_content__unload(git_diff_file_content *fc); - -/* this unloads and also releases any other resources */ -extern void git_diff_file_content__clear(git_diff_file_content *fc); - -#endif diff --git a/vendor/libgit2/src/diff_patch.c b/vendor/libgit2/src/diff_patch.c deleted file mode 100644 index 0628da6f21..0000000000 --- a/vendor/libgit2/src/diff_patch.c +++ /dev/null @@ -1,1138 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#include "common.h" -#include "git2/blob.h" -#include "diff.h" -#include "diff_file.h" -#include "diff_driver.h" -#include "diff_patch.h" -#include "diff_xdiff.h" -#include "delta.h" -#include "zstream.h" -#include "fileops.h" - -static void diff_output_init( - git_diff_output*, const git_diff_options*, git_diff_file_cb, - git_diff_binary_cb, git_diff_hunk_cb, git_diff_line_cb, void*); - -static void diff_output_to_patch(git_diff_output *, git_patch *); - -static void diff_patch_update_binary(git_patch *patch) -{ - if ((patch->delta->flags & DIFF_FLAGS_KNOWN_BINARY) != 0) - return; - - if ((patch->ofile.file->flags & GIT_DIFF_FLAG_BINARY) != 0 || - (patch->nfile.file->flags & GIT_DIFF_FLAG_BINARY) != 0) - patch->delta->flags |= GIT_DIFF_FLAG_BINARY; - - else if ((patch->ofile.file->flags & DIFF_FLAGS_NOT_BINARY) != 0 && - (patch->nfile.file->flags & DIFF_FLAGS_NOT_BINARY) != 0) - patch->delta->flags |= GIT_DIFF_FLAG_NOT_BINARY; -} - -static void diff_patch_init_common(git_patch *patch) -{ - diff_patch_update_binary(patch); - - patch->flags |= GIT_DIFF_PATCH_INITIALIZED; - - if (patch->diff) - git_diff_addref(patch->diff); -} - -static int diff_patch_normalize_options( - git_diff_options *out, - const git_diff_options *opts) -{ - if (opts) { - GITERR_CHECK_VERSION(opts, GIT_DIFF_OPTIONS_VERSION, "git_diff_options"); - memcpy(out, opts, sizeof(git_diff_options)); - } else { - git_diff_options default_opts = GIT_DIFF_OPTIONS_INIT; - memcpy(out, &default_opts, sizeof(git_diff_options)); - } - - out->old_prefix = opts && opts->old_prefix ? - git__strdup(opts->old_prefix) : - git__strdup(DIFF_OLD_PREFIX_DEFAULT); - - out->new_prefix = opts && opts->new_prefix ? - git__strdup(opts->new_prefix) : - git__strdup(DIFF_NEW_PREFIX_DEFAULT); - - GITERR_CHECK_ALLOC(out->old_prefix); - GITERR_CHECK_ALLOC(out->new_prefix); - - return 0; -} - -static int diff_patch_init_from_diff( - git_patch *patch, git_diff *diff, size_t delta_index) -{ - int error = 0; - - memset(patch, 0, sizeof(*patch)); - patch->diff = diff; - patch->delta = git_vector_get(&diff->deltas, delta_index); - patch->delta_index = delta_index; - - if ((error = diff_patch_normalize_options( - &patch->diff_opts, &diff->opts)) < 0 || - (error = git_diff_file_content__init_from_diff( - &patch->ofile, diff, patch->delta, true)) < 0 || - (error = git_diff_file_content__init_from_diff( - &patch->nfile, diff, patch->delta, false)) < 0) - return error; - - diff_patch_init_common(patch); - - return 0; -} - -static int diff_patch_alloc_from_diff( - git_patch **out, git_diff *diff, size_t delta_index) -{ - int error; - git_patch *patch = git__calloc(1, sizeof(git_patch)); - GITERR_CHECK_ALLOC(patch); - - if (!(error = diff_patch_init_from_diff(patch, diff, delta_index))) { - patch->flags |= GIT_DIFF_PATCH_ALLOCATED; - GIT_REFCOUNT_INC(patch); - } else { - git__free(patch); - patch = NULL; - } - - *out = patch; - return error; -} - -GIT_INLINE(bool) should_skip_binary(git_patch *patch, git_diff_file *file) -{ - if ((patch->diff_opts.flags & GIT_DIFF_SHOW_BINARY) != 0) - return false; - - return (file->flags & GIT_DIFF_FLAG_BINARY) != 0; -} - -static bool diff_patch_diffable(git_patch *patch) -{ - size_t olen, nlen; - - if (patch->delta->status == GIT_DELTA_UNMODIFIED) - return false; - - /* if we've determined this to be binary (and we are not showing binary - * data) then we have skipped loading the map data. instead, query the - * file data itself. - */ - if ((patch->delta->flags & GIT_DIFF_FLAG_BINARY) != 0 && - (patch->diff_opts.flags & GIT_DIFF_SHOW_BINARY) == 0) { - olen = (size_t)patch->ofile.file->size; - nlen = (size_t)patch->nfile.file->size; - } else { - olen = patch->ofile.map.len; - nlen = patch->nfile.map.len; - } - - /* if both sides are empty, files are identical */ - if (!olen && !nlen) - return false; - - /* otherwise, check the file sizes and the oid */ - return (olen != nlen || - !git_oid_equal(&patch->ofile.file->id, &patch->nfile.file->id)); -} - -static int diff_patch_load(git_patch *patch, git_diff_output *output) -{ - int error = 0; - bool incomplete_data; - - if ((patch->flags & GIT_DIFF_PATCH_LOADED) != 0) - return 0; - - /* if no hunk and data callbacks and user doesn't care if data looks - * binary, then there is no need to actually load the data - */ - if ((patch->ofile.opts_flags & GIT_DIFF_SKIP_BINARY_CHECK) != 0 && - output && !output->binary_cb && !output->hunk_cb && !output->data_cb) - return 0; - - incomplete_data = - (((patch->ofile.flags & GIT_DIFF_FLAG__NO_DATA) != 0 || - (patch->ofile.file->flags & GIT_DIFF_FLAG_VALID_ID) != 0) && - ((patch->nfile.flags & GIT_DIFF_FLAG__NO_DATA) != 0 || - (patch->nfile.file->flags & GIT_DIFF_FLAG_VALID_ID) != 0)); - - /* always try to load workdir content first because filtering may - * need 2x data size and this minimizes peak memory footprint - */ - if (patch->ofile.src == GIT_ITERATOR_TYPE_WORKDIR) { - if ((error = git_diff_file_content__load( - &patch->ofile, &patch->diff_opts)) < 0 || - should_skip_binary(patch, patch->ofile.file)) - goto cleanup; - } - if (patch->nfile.src == GIT_ITERATOR_TYPE_WORKDIR) { - if ((error = git_diff_file_content__load( - &patch->nfile, &patch->diff_opts)) < 0 || - should_skip_binary(patch, patch->nfile.file)) - goto cleanup; - } - - /* once workdir has been tried, load other data as needed */ - if (patch->ofile.src != GIT_ITERATOR_TYPE_WORKDIR) { - if ((error = git_diff_file_content__load( - &patch->ofile, &patch->diff_opts)) < 0 || - should_skip_binary(patch, patch->ofile.file)) - goto cleanup; - } - if (patch->nfile.src != GIT_ITERATOR_TYPE_WORKDIR) { - if ((error = git_diff_file_content__load( - &patch->nfile, &patch->diff_opts)) < 0 || - should_skip_binary(patch, patch->nfile.file)) - goto cleanup; - } - - /* if previously missing an oid, and now that we have it the two sides - * are the same (and not submodules), update MODIFIED -> UNMODIFIED - */ - if (incomplete_data && - patch->ofile.file->mode == patch->nfile.file->mode && - patch->ofile.file->mode != GIT_FILEMODE_COMMIT && - git_oid_equal(&patch->ofile.file->id, &patch->nfile.file->id) && - patch->delta->status == GIT_DELTA_MODIFIED) /* not RENAMED/COPIED! */ - patch->delta->status = GIT_DELTA_UNMODIFIED; - -cleanup: - diff_patch_update_binary(patch); - - if (!error) { - if (diff_patch_diffable(patch)) - patch->flags |= GIT_DIFF_PATCH_DIFFABLE; - - patch->flags |= GIT_DIFF_PATCH_LOADED; - } - - return error; -} - -static int diff_patch_invoke_file_callback( - git_patch *patch, git_diff_output *output) -{ - float progress = patch->diff ? - ((float)patch->delta_index / patch->diff->deltas.length) : 1.0f; - - if (!output->file_cb) - return 0; - - return giterr_set_after_callback_function( - output->file_cb(patch->delta, progress, output->payload), - "git_patch"); -} - -static int create_binary( - git_diff_binary_t *out_type, - char **out_data, - size_t *out_datalen, - size_t *out_inflatedlen, - const char *a_data, - size_t a_datalen, - const char *b_data, - size_t b_datalen) -{ - git_buf deflate = GIT_BUF_INIT, delta = GIT_BUF_INIT; - unsigned long delta_data_len; - int error; - - /* The git_delta function accepts unsigned long only */ - if (!git__is_ulong(a_datalen) || !git__is_ulong(b_datalen)) - return GIT_EBUFS; - - if ((error = git_zstream_deflatebuf(&deflate, b_data, b_datalen)) < 0) - goto done; - - /* The git_delta function accepts unsigned long only */ - if (!git__is_ulong(deflate.size)) { - error = GIT_EBUFS; - goto done; - } - - if (a_datalen && b_datalen) { - void *delta_data = git_delta( - a_data, (unsigned long)a_datalen, - b_data, (unsigned long)b_datalen, - &delta_data_len, (unsigned long)deflate.size); - - if (delta_data) { - error = git_zstream_deflatebuf( - &delta, delta_data, (size_t)delta_data_len); - - git__free(delta_data); - - if (error < 0) - goto done; - } - } - - if (delta.size && delta.size < deflate.size) { - *out_type = GIT_DIFF_BINARY_DELTA; - *out_datalen = delta.size; - *out_data = git_buf_detach(&delta); - *out_inflatedlen = delta_data_len; - } else { - *out_type = GIT_DIFF_BINARY_LITERAL; - *out_datalen = deflate.size; - *out_data = git_buf_detach(&deflate); - *out_inflatedlen = b_datalen; - } - -done: - git_buf_free(&deflate); - git_buf_free(&delta); - - return error; -} - -static int diff_binary(git_diff_output *output, git_patch *patch) -{ - git_diff_binary binary = {{0}}; - const char *old_data = patch->ofile.map.data; - const char *new_data = patch->nfile.map.data; - size_t old_len = patch->ofile.map.len, - new_len = patch->nfile.map.len; - int error; - - /* Create the old->new delta (as the "new" side of the patch), - * and the new->old delta (as the "old" side) - */ - if ((error = create_binary(&binary.old_file.type, - (char **)&binary.old_file.data, - &binary.old_file.datalen, - &binary.old_file.inflatedlen, - new_data, new_len, old_data, old_len)) < 0 || - (error = create_binary(&binary.new_file.type, - (char **)&binary.new_file.data, - &binary.new_file.datalen, - &binary.new_file.inflatedlen, - old_data, old_len, new_data, new_len)) < 0) - return error; - - error = giterr_set_after_callback_function( - output->binary_cb(patch->delta, &binary, output->payload), - "git_patch"); - - git__free((char *) binary.old_file.data); - git__free((char *) binary.new_file.data); - - return error; -} - -static int diff_patch_generate(git_patch *patch, git_diff_output *output) -{ - int error = 0; - - if ((patch->flags & GIT_DIFF_PATCH_DIFFED) != 0) - return 0; - - /* if we are not looking at the binary or text data, don't do the diff */ - if (!output->binary_cb && !output->hunk_cb && !output->data_cb) - return 0; - - if ((patch->flags & GIT_DIFF_PATCH_LOADED) == 0 && - (error = diff_patch_load(patch, output)) < 0) - return error; - - if ((patch->flags & GIT_DIFF_PATCH_DIFFABLE) == 0) - return 0; - - if ((patch->delta->flags & GIT_DIFF_FLAG_BINARY) != 0) { - if (output->binary_cb) - error = diff_binary(output, patch); - } - else { - if (output->diff_cb) - error = output->diff_cb(output, patch); - } - - patch->flags |= GIT_DIFF_PATCH_DIFFED; - return error; -} - -static void diff_patch_free(git_patch *patch) -{ - git_diff_file_content__clear(&patch->ofile); - git_diff_file_content__clear(&patch->nfile); - - git_array_clear(patch->lines); - git_array_clear(patch->hunks); - - git_diff_free(patch->diff); /* decrements refcount */ - patch->diff = NULL; - - git_pool_clear(&patch->flattened); - - git__free((char *)patch->diff_opts.old_prefix); - git__free((char *)patch->diff_opts.new_prefix); - - git__free((char *)patch->binary.old_file.data); - git__free((char *)patch->binary.new_file.data); - - if (patch->flags & GIT_DIFF_PATCH_ALLOCATED) - git__free(patch); -} - -static int diff_required(git_diff *diff, const char *action) -{ - if (diff) - return 0; - giterr_set(GITERR_INVALID, "Must provide valid diff to %s", action); - return -1; -} - -int git_diff_foreach( - git_diff *diff, - git_diff_file_cb file_cb, - git_diff_binary_cb binary_cb, - git_diff_hunk_cb hunk_cb, - git_diff_line_cb data_cb, - void *payload) -{ - int error = 0; - git_xdiff_output xo; - size_t idx; - git_patch patch; - - if ((error = diff_required(diff, "git_diff_foreach")) < 0) - return error; - - memset(&xo, 0, sizeof(xo)); - memset(&patch, 0, sizeof(patch)); - diff_output_init( - &xo.output, &diff->opts, file_cb, binary_cb, hunk_cb, data_cb, payload); - git_xdiff_init(&xo, &diff->opts); - - git_vector_foreach(&diff->deltas, idx, patch.delta) { - - /* check flags against patch status */ - if (git_diff_delta__should_skip(&diff->opts, patch.delta)) - continue; - - if (binary_cb || hunk_cb || data_cb) { - if ((error = diff_patch_init_from_diff(&patch, diff, idx)) != 0 || - (error = diff_patch_load(&patch, &xo.output)) != 0) - return error; - } - - if ((error = diff_patch_invoke_file_callback(&patch, &xo.output)) == 0) { - if (binary_cb || hunk_cb || data_cb) - error = diff_patch_generate(&patch, &xo.output); - } - - git_patch_free(&patch); - - if (error) - break; - } - - return error; -} - -typedef struct { - git_patch patch; - git_diff_delta delta; - char paths[GIT_FLEX_ARRAY]; -} diff_patch_with_delta; - -static int diff_single_generate(diff_patch_with_delta *pd, git_xdiff_output *xo) -{ - int error = 0; - git_patch *patch = &pd->patch; - bool has_old = ((patch->ofile.flags & GIT_DIFF_FLAG__NO_DATA) == 0); - bool has_new = ((patch->nfile.flags & GIT_DIFF_FLAG__NO_DATA) == 0); - - pd->delta.status = has_new ? - (has_old ? GIT_DELTA_MODIFIED : GIT_DELTA_ADDED) : - (has_old ? GIT_DELTA_DELETED : GIT_DELTA_UNTRACKED); - - if (git_oid_equal(&patch->nfile.file->id, &patch->ofile.file->id)) - pd->delta.status = GIT_DELTA_UNMODIFIED; - - patch->delta = &pd->delta; - - diff_patch_init_common(patch); - - if (pd->delta.status == GIT_DELTA_UNMODIFIED && - !(patch->ofile.opts_flags & GIT_DIFF_INCLUDE_UNMODIFIED)) - return error; - - error = diff_patch_invoke_file_callback(patch, (git_diff_output *)xo); - - if (!error) - error = diff_patch_generate(patch, (git_diff_output *)xo); - - return error; -} - -static int diff_patch_from_sources( - diff_patch_with_delta *pd, - git_xdiff_output *xo, - git_diff_file_content_src *oldsrc, - git_diff_file_content_src *newsrc, - const git_diff_options *opts) -{ - int error = 0; - git_repository *repo = - oldsrc->blob ? git_blob_owner(oldsrc->blob) : - newsrc->blob ? git_blob_owner(newsrc->blob) : NULL; - git_diff_file *lfile = &pd->delta.old_file, *rfile = &pd->delta.new_file; - git_diff_file_content *ldata = &pd->patch.ofile, *rdata = &pd->patch.nfile; - - if ((error = diff_patch_normalize_options(&pd->patch.diff_opts, opts)) < 0) - return error; - - if (opts && (opts->flags & GIT_DIFF_REVERSE) != 0) { - void *tmp = lfile; lfile = rfile; rfile = tmp; - tmp = ldata; ldata = rdata; rdata = tmp; - } - - pd->patch.delta = &pd->delta; - - if (!oldsrc->as_path) { - if (newsrc->as_path) - oldsrc->as_path = newsrc->as_path; - else - oldsrc->as_path = newsrc->as_path = "file"; - } - else if (!newsrc->as_path) - newsrc->as_path = oldsrc->as_path; - - lfile->path = oldsrc->as_path; - rfile->path = newsrc->as_path; - - if ((error = git_diff_file_content__init_from_src( - ldata, repo, opts, oldsrc, lfile)) < 0 || - (error = git_diff_file_content__init_from_src( - rdata, repo, opts, newsrc, rfile)) < 0) - return error; - - return diff_single_generate(pd, xo); -} - -static int diff_patch_with_delta_alloc( - diff_patch_with_delta **out, - const char **old_path, - const char **new_path) -{ - diff_patch_with_delta *pd; - size_t old_len = *old_path ? strlen(*old_path) : 0; - size_t new_len = *new_path ? strlen(*new_path) : 0; - size_t alloc_len; - - GITERR_CHECK_ALLOC_ADD(&alloc_len, sizeof(*pd), old_len); - GITERR_CHECK_ALLOC_ADD(&alloc_len, alloc_len, new_len); - GITERR_CHECK_ALLOC_ADD(&alloc_len, alloc_len, 2); - - *out = pd = git__calloc(1, alloc_len); - GITERR_CHECK_ALLOC(pd); - - pd->patch.flags = GIT_DIFF_PATCH_ALLOCATED; - - if (*old_path) { - memcpy(&pd->paths[0], *old_path, old_len); - *old_path = &pd->paths[0]; - } else if (*new_path) - *old_path = &pd->paths[old_len + 1]; - - if (*new_path) { - memcpy(&pd->paths[old_len + 1], *new_path, new_len); - *new_path = &pd->paths[old_len + 1]; - } else if (*old_path) - *new_path = &pd->paths[0]; - - return 0; -} - -static int diff_from_sources( - git_diff_file_content_src *oldsrc, - git_diff_file_content_src *newsrc, - const git_diff_options *opts, - git_diff_file_cb file_cb, - git_diff_binary_cb binary_cb, - git_diff_hunk_cb hunk_cb, - git_diff_line_cb data_cb, - void *payload) -{ - int error = 0; - diff_patch_with_delta pd; - git_xdiff_output xo; - - memset(&xo, 0, sizeof(xo)); - diff_output_init( - &xo.output, opts, file_cb, binary_cb, hunk_cb, data_cb, payload); - git_xdiff_init(&xo, opts); - - memset(&pd, 0, sizeof(pd)); - - error = diff_patch_from_sources(&pd, &xo, oldsrc, newsrc, opts); - - git_patch_free(&pd.patch); - - return error; -} - -static int patch_from_sources( - git_patch **out, - git_diff_file_content_src *oldsrc, - git_diff_file_content_src *newsrc, - const git_diff_options *opts) -{ - int error = 0; - diff_patch_with_delta *pd; - git_xdiff_output xo; - - assert(out); - *out = NULL; - - if ((error = diff_patch_with_delta_alloc( - &pd, &oldsrc->as_path, &newsrc->as_path)) < 0) - return error; - - memset(&xo, 0, sizeof(xo)); - diff_output_to_patch(&xo.output, &pd->patch); - git_xdiff_init(&xo, opts); - - if (!(error = diff_patch_from_sources(pd, &xo, oldsrc, newsrc, opts))) - *out = (git_patch *)pd; - else - git_patch_free((git_patch *)pd); - - return error; -} - -int git_diff_blobs( - const git_blob *old_blob, - const char *old_path, - const git_blob *new_blob, - const char *new_path, - const git_diff_options *opts, - git_diff_file_cb file_cb, - git_diff_binary_cb binary_cb, - git_diff_hunk_cb hunk_cb, - git_diff_line_cb data_cb, - void *payload) -{ - git_diff_file_content_src osrc = - GIT_DIFF_FILE_CONTENT_SRC__BLOB(old_blob, old_path); - git_diff_file_content_src nsrc = - GIT_DIFF_FILE_CONTENT_SRC__BLOB(new_blob, new_path); - return diff_from_sources( - &osrc, &nsrc, opts, file_cb, binary_cb, hunk_cb, data_cb, payload); -} - -int git_patch_from_blobs( - git_patch **out, - const git_blob *old_blob, - const char *old_path, - const git_blob *new_blob, - const char *new_path, - const git_diff_options *opts) -{ - git_diff_file_content_src osrc = - GIT_DIFF_FILE_CONTENT_SRC__BLOB(old_blob, old_path); - git_diff_file_content_src nsrc = - GIT_DIFF_FILE_CONTENT_SRC__BLOB(new_blob, new_path); - return patch_from_sources(out, &osrc, &nsrc, opts); -} - -int git_diff_blob_to_buffer( - const git_blob *old_blob, - const char *old_path, - const char *buf, - size_t buflen, - const char *buf_path, - const git_diff_options *opts, - git_diff_file_cb file_cb, - git_diff_binary_cb binary_cb, - git_diff_hunk_cb hunk_cb, - git_diff_line_cb data_cb, - void *payload) -{ - git_diff_file_content_src osrc = - GIT_DIFF_FILE_CONTENT_SRC__BLOB(old_blob, old_path); - git_diff_file_content_src nsrc = - GIT_DIFF_FILE_CONTENT_SRC__BUF(buf, buflen, buf_path); - return diff_from_sources( - &osrc, &nsrc, opts, file_cb, binary_cb, hunk_cb, data_cb, payload); -} - -int git_patch_from_blob_and_buffer( - git_patch **out, - const git_blob *old_blob, - const char *old_path, - const char *buf, - size_t buflen, - const char *buf_path, - const git_diff_options *opts) -{ - git_diff_file_content_src osrc = - GIT_DIFF_FILE_CONTENT_SRC__BLOB(old_blob, old_path); - git_diff_file_content_src nsrc = - GIT_DIFF_FILE_CONTENT_SRC__BUF(buf, buflen, buf_path); - return patch_from_sources(out, &osrc, &nsrc, opts); -} - -int git_diff_buffers( - const void *old_buf, - size_t old_len, - const char *old_path, - const void *new_buf, - size_t new_len, - const char *new_path, - const git_diff_options *opts, - git_diff_file_cb file_cb, - git_diff_binary_cb binary_cb, - git_diff_hunk_cb hunk_cb, - git_diff_line_cb data_cb, - void *payload) -{ - git_diff_file_content_src osrc = - GIT_DIFF_FILE_CONTENT_SRC__BUF(old_buf, old_len, old_path); - git_diff_file_content_src nsrc = - GIT_DIFF_FILE_CONTENT_SRC__BUF(new_buf, new_len, new_path); - return diff_from_sources( - &osrc, &nsrc, opts, file_cb, binary_cb, hunk_cb, data_cb, payload); -} - -int git_patch_from_buffers( - git_patch **out, - const void *old_buf, - size_t old_len, - const char *old_path, - const char *new_buf, - size_t new_len, - const char *new_path, - const git_diff_options *opts) -{ - git_diff_file_content_src osrc = - GIT_DIFF_FILE_CONTENT_SRC__BUF(old_buf, old_len, old_path); - git_diff_file_content_src nsrc = - GIT_DIFF_FILE_CONTENT_SRC__BUF(new_buf, new_len, new_path); - return patch_from_sources(out, &osrc, &nsrc, opts); -} - -int git_patch_from_diff( - git_patch **patch_ptr, git_diff *diff, size_t idx) -{ - int error = 0; - git_xdiff_output xo; - git_diff_delta *delta = NULL; - git_patch *patch = NULL; - - if (patch_ptr) *patch_ptr = NULL; - - if (diff_required(diff, "git_patch_from_diff") < 0) - return -1; - - delta = git_vector_get(&diff->deltas, idx); - if (!delta) { - giterr_set(GITERR_INVALID, "Index out of range for delta in diff"); - return GIT_ENOTFOUND; - } - - if (git_diff_delta__should_skip(&diff->opts, delta)) - return 0; - - /* don't load the patch data unless we need it for binary check */ - if (!patch_ptr && - ((delta->flags & DIFF_FLAGS_KNOWN_BINARY) != 0 || - (diff->opts.flags & GIT_DIFF_SKIP_BINARY_CHECK) != 0)) - return 0; - - if ((error = diff_patch_alloc_from_diff(&patch, diff, idx)) < 0) - return error; - - memset(&xo, 0, sizeof(xo)); - diff_output_to_patch(&xo.output, patch); - git_xdiff_init(&xo, &diff->opts); - - error = diff_patch_invoke_file_callback(patch, &xo.output); - - if (!error) - error = diff_patch_generate(patch, &xo.output); - - if (!error) { - /* TODO: if cumulative diff size is < 0.5 total size, flatten patch */ - /* TODO: and unload the file content */ - } - - if (error || !patch_ptr) - git_patch_free(patch); - else - *patch_ptr = patch; - - return error; -} - -void git_patch_free(git_patch *patch) -{ - if (patch) - GIT_REFCOUNT_DEC(patch, diff_patch_free); -} - -const git_diff_delta *git_patch_get_delta(const git_patch *patch) -{ - assert(patch); - return patch->delta; -} - -size_t git_patch_num_hunks(const git_patch *patch) -{ - assert(patch); - return git_array_size(patch->hunks); -} - -int git_patch_line_stats( - size_t *total_ctxt, - size_t *total_adds, - size_t *total_dels, - const git_patch *patch) -{ - size_t totals[3], idx; - - memset(totals, 0, sizeof(totals)); - - for (idx = 0; idx < git_array_size(patch->lines); ++idx) { - git_diff_line *line = git_array_get(patch->lines, idx); - if (!line) - continue; - - switch (line->origin) { - case GIT_DIFF_LINE_CONTEXT: totals[0]++; break; - case GIT_DIFF_LINE_ADDITION: totals[1]++; break; - case GIT_DIFF_LINE_DELETION: totals[2]++; break; - default: - /* diff --stat and --numstat don't count EOFNL marks because - * they will always be paired with a ADDITION or DELETION line. - */ - break; - } - } - - if (total_ctxt) - *total_ctxt = totals[0]; - if (total_adds) - *total_adds = totals[1]; - if (total_dels) - *total_dels = totals[2]; - - return 0; -} - -static int diff_error_outofrange(const char *thing) -{ - giterr_set(GITERR_INVALID, "Diff patch %s index out of range", thing); - return GIT_ENOTFOUND; -} - -int git_patch_get_hunk( - const git_diff_hunk **out, - size_t *lines_in_hunk, - git_patch *patch, - size_t hunk_idx) -{ - diff_patch_hunk *hunk; - assert(patch); - - hunk = git_array_get(patch->hunks, hunk_idx); - - if (!hunk) { - if (out) *out = NULL; - if (lines_in_hunk) *lines_in_hunk = 0; - return diff_error_outofrange("hunk"); - } - - if (out) *out = &hunk->hunk; - if (lines_in_hunk) *lines_in_hunk = hunk->line_count; - return 0; -} - -int git_patch_num_lines_in_hunk(const git_patch *patch, size_t hunk_idx) -{ - diff_patch_hunk *hunk; - assert(patch); - - if (!(hunk = git_array_get(patch->hunks, hunk_idx))) - return diff_error_outofrange("hunk"); - return (int)hunk->line_count; -} - -int git_patch_get_line_in_hunk( - const git_diff_line **out, - git_patch *patch, - size_t hunk_idx, - size_t line_of_hunk) -{ - diff_patch_hunk *hunk; - git_diff_line *line; - - assert(patch); - - if (!(hunk = git_array_get(patch->hunks, hunk_idx))) { - if (out) *out = NULL; - return diff_error_outofrange("hunk"); - } - - if (line_of_hunk >= hunk->line_count || - !(line = git_array_get( - patch->lines, hunk->line_start + line_of_hunk))) { - if (out) *out = NULL; - return diff_error_outofrange("line"); - } - - if (out) *out = line; - return 0; -} - -size_t git_patch_size( - git_patch *patch, - int include_context, - int include_hunk_headers, - int include_file_headers) -{ - size_t out; - - assert(patch); - - out = patch->content_size; - - if (!include_context) - out -= patch->context_size; - - if (include_hunk_headers) - out += patch->header_size; - - if (include_file_headers) { - git_buf file_header = GIT_BUF_INIT; - - if (git_diff_delta__format_file_header( - &file_header, patch->delta, NULL, NULL, 0) < 0) - giterr_clear(); - else - out += git_buf_len(&file_header); - - git_buf_free(&file_header); - } - - return out; -} - -git_diff *git_patch__diff(git_patch *patch) -{ - return patch->diff; -} - -git_diff_driver *git_patch__driver(git_patch *patch) -{ - /* ofile driver is representative for whole patch */ - return patch->ofile.driver; -} - -void git_patch__old_data( - char **ptr, size_t *len, git_patch *patch) -{ - *ptr = patch->ofile.map.data; - *len = patch->ofile.map.len; -} - -void git_patch__new_data( - char **ptr, size_t *len, git_patch *patch) -{ - *ptr = patch->nfile.map.data; - *len = patch->nfile.map.len; -} - -int git_patch__invoke_callbacks( - git_patch *patch, - git_diff_file_cb file_cb, - git_diff_binary_cb binary_cb, - git_diff_hunk_cb hunk_cb, - git_diff_line_cb line_cb, - void *payload) -{ - int error = 0; - uint32_t i, j; - - if (file_cb) - error = file_cb(patch->delta, 0, payload); - - if ((patch->delta->flags & GIT_DIFF_FLAG_BINARY) != 0) { - if (binary_cb) - error = binary_cb(patch->delta, &patch->binary, payload); - - return error; - } - - if (!hunk_cb && !line_cb) - return error; - - for (i = 0; !error && i < git_array_size(patch->hunks); ++i) { - diff_patch_hunk *h = git_array_get(patch->hunks, i); - - if (hunk_cb) - error = hunk_cb(patch->delta, &h->hunk, payload); - - if (!line_cb) - continue; - - for (j = 0; !error && j < h->line_count; ++j) { - git_diff_line *l = - git_array_get(patch->lines, h->line_start + j); - - error = line_cb(patch->delta, &h->hunk, l, payload); - } - } - - return error; -} - - -static int diff_patch_file_cb( - const git_diff_delta *delta, - float progress, - void *payload) -{ - GIT_UNUSED(delta); GIT_UNUSED(progress); GIT_UNUSED(payload); - return 0; -} - -static int diff_patch_binary_cb( - const git_diff_delta *delta, - const git_diff_binary *binary, - void *payload) -{ - git_patch *patch = payload; - - GIT_UNUSED(delta); - - memcpy(&patch->binary, binary, sizeof(git_diff_binary)); - - if (binary->old_file.data) { - patch->binary.old_file.data = git__malloc(binary->old_file.datalen); - GITERR_CHECK_ALLOC(patch->binary.old_file.data); - - memcpy((char *)patch->binary.old_file.data, - binary->old_file.data, binary->old_file.datalen); - } - - if (binary->new_file.data) { - patch->binary.new_file.data = git__malloc(binary->new_file.datalen); - GITERR_CHECK_ALLOC(patch->binary.new_file.data); - - memcpy((char *)patch->binary.new_file.data, - binary->new_file.data, binary->new_file.datalen); - } - - return 0; -} - -static int diff_patch_hunk_cb( - const git_diff_delta *delta, - const git_diff_hunk *hunk_, - void *payload) -{ - git_patch *patch = payload; - diff_patch_hunk *hunk; - - GIT_UNUSED(delta); - - hunk = git_array_alloc(patch->hunks); - GITERR_CHECK_ALLOC(hunk); - - memcpy(&hunk->hunk, hunk_, sizeof(hunk->hunk)); - - patch->header_size += hunk_->header_len; - - hunk->line_start = git_array_size(patch->lines); - hunk->line_count = 0; - - return 0; -} - -static int diff_patch_line_cb( - const git_diff_delta *delta, - const git_diff_hunk *hunk_, - const git_diff_line *line_, - void *payload) -{ - git_patch *patch = payload; - diff_patch_hunk *hunk; - git_diff_line *line; - - GIT_UNUSED(delta); - GIT_UNUSED(hunk_); - - hunk = git_array_last(patch->hunks); - assert(hunk); /* programmer error if no hunk is available */ - - line = git_array_alloc(patch->lines); - GITERR_CHECK_ALLOC(line); - - memcpy(line, line_, sizeof(*line)); - - /* do some bookkeeping so we can provide old/new line numbers */ - - patch->content_size += line->content_len; - - if (line->origin == GIT_DIFF_LINE_ADDITION || - line->origin == GIT_DIFF_LINE_DELETION) - patch->content_size += 1; - else if (line->origin == GIT_DIFF_LINE_CONTEXT) { - patch->content_size += 1; - patch->context_size += line->content_len + 1; - } else if (line->origin == GIT_DIFF_LINE_CONTEXT_EOFNL) - patch->context_size += line->content_len; - - hunk->line_count++; - - return 0; -} - -static void diff_output_init( - git_diff_output *out, - const git_diff_options *opts, - git_diff_file_cb file_cb, - git_diff_binary_cb binary_cb, - git_diff_hunk_cb hunk_cb, - git_diff_line_cb data_cb, - void *payload) -{ - GIT_UNUSED(opts); - - memset(out, 0, sizeof(*out)); - - out->file_cb = file_cb; - out->binary_cb = binary_cb; - out->hunk_cb = hunk_cb; - out->data_cb = data_cb; - out->payload = payload; -} - -static void diff_output_to_patch(git_diff_output *out, git_patch *patch) -{ - diff_output_init( - out, - NULL, - diff_patch_file_cb, - diff_patch_binary_cb, - diff_patch_hunk_cb, - diff_patch_line_cb, - patch); -} diff --git a/vendor/libgit2/src/diff_patch.h b/vendor/libgit2/src/diff_patch.h deleted file mode 100644 index 7b4dacddec..0000000000 --- a/vendor/libgit2/src/diff_patch.h +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_diff_patch_h__ -#define INCLUDE_diff_patch_h__ - -#include "common.h" -#include "diff.h" -#include "diff_file.h" -#include "array.h" -#include "git2/patch.h" - - /* cached information about a hunk in a diff */ -typedef struct diff_patch_hunk { - git_diff_hunk hunk; - size_t line_start; - size_t line_count; -} diff_patch_hunk; - -enum { - GIT_DIFF_PATCH_ALLOCATED = (1 << 0), - GIT_DIFF_PATCH_INITIALIZED = (1 << 1), - GIT_DIFF_PATCH_LOADED = (1 << 2), - /* the two sides are different */ - GIT_DIFF_PATCH_DIFFABLE = (1 << 3), - /* the difference between the two sides has been computed */ - GIT_DIFF_PATCH_DIFFED = (1 << 4), - GIT_DIFF_PATCH_FLATTENED = (1 << 5), -}; - -struct git_patch { - git_refcount rc; - git_diff *diff; /* for refcount purposes, maybe NULL for blob diffs */ - git_diff_options diff_opts; - git_diff_delta *delta; - size_t delta_index; - git_diff_file_content ofile; - git_diff_file_content nfile; - uint32_t flags; - git_diff_binary binary; - git_array_t(diff_patch_hunk) hunks; - git_array_t(git_diff_line) lines; - size_t content_size, context_size, header_size; - git_pool flattened; -}; - -extern git_diff *git_patch__diff(git_patch *); - -extern git_diff_driver *git_patch__driver(git_patch *); - -extern void git_patch__old_data(char **, size_t *, git_patch *); -extern void git_patch__new_data(char **, size_t *, git_patch *); - -extern int git_patch__invoke_callbacks( - git_patch *patch, - git_diff_file_cb file_cb, - git_diff_binary_cb binary_cb, - git_diff_hunk_cb hunk_cb, - git_diff_line_cb line_cb, - void *payload); - -typedef struct git_diff_output git_diff_output; -struct git_diff_output { - /* these callbacks are issued with the diff data */ - git_diff_file_cb file_cb; - git_diff_binary_cb binary_cb; - git_diff_hunk_cb hunk_cb; - git_diff_line_cb data_cb; - void *payload; - - /* this records the actual error in cases where it may be obscured */ - int error; - - /* this callback is used to do the diff and drive the other callbacks. - * see diff_xdiff.h for how to use this in practice for now. - */ - int (*diff_cb)(git_diff_output *output, git_patch *patch); -}; - -#endif diff --git a/vendor/libgit2/src/diff_print.c b/vendor/libgit2/src/diff_print.c deleted file mode 100644 index d406a441a5..0000000000 --- a/vendor/libgit2/src/diff_print.c +++ /dev/null @@ -1,664 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#include "common.h" -#include "diff.h" -#include "diff_patch.h" -#include "fileops.h" -#include "zstream.h" -#include "blob.h" -#include "delta.h" -#include "git2/sys/diff.h" - -typedef struct { - git_diff *diff; - git_diff_format_t format; - git_diff_line_cb print_cb; - void *payload; - git_buf *buf; - uint32_t flags; - int oid_strlen; - git_diff_line line; - unsigned int - content_loaded : 1, - content_allocated : 1; - git_diff_file_content *ofile; - git_diff_file_content *nfile; -} diff_print_info; - -static int diff_print_info_init__common( - diff_print_info *pi, - git_buf *out, - git_repository *repo, - git_diff_format_t format, - git_diff_line_cb cb, - void *payload) -{ - pi->format = format; - pi->print_cb = cb; - pi->payload = payload; - pi->buf = out; - - if (!pi->oid_strlen) { - if (!repo) - pi->oid_strlen = GIT_ABBREV_DEFAULT; - else if (git_repository__cvar(&pi->oid_strlen, repo, GIT_CVAR_ABBREV) < 0) - return -1; - } - - pi->oid_strlen += 1; /* for NUL byte */ - - if (pi->oid_strlen > GIT_OID_HEXSZ + 1) - pi->oid_strlen = GIT_OID_HEXSZ + 1; - - memset(&pi->line, 0, sizeof(pi->line)); - pi->line.old_lineno = -1; - pi->line.new_lineno = -1; - pi->line.num_lines = 1; - - return 0; -} - -static int diff_print_info_init_fromdiff( - diff_print_info *pi, - git_buf *out, - git_diff *diff, - git_diff_format_t format, - git_diff_line_cb cb, - void *payload) -{ - git_repository *repo = diff ? diff->repo : NULL; - - memset(pi, 0, sizeof(diff_print_info)); - - pi->diff = diff; - - if (diff) { - pi->flags = diff->opts.flags; - pi->oid_strlen = diff->opts.id_abbrev; - } - - return diff_print_info_init__common(pi, out, repo, format, cb, payload); -} - -static int diff_print_info_init_frompatch( - diff_print_info *pi, - git_buf *out, - git_patch *patch, - git_diff_format_t format, - git_diff_line_cb cb, - void *payload) -{ - git_repository *repo = patch && patch->diff ? patch->diff->repo : NULL; - - memset(pi, 0, sizeof(diff_print_info)); - - pi->diff = patch->diff; - - pi->flags = patch->diff_opts.flags; - pi->oid_strlen = patch->diff_opts.id_abbrev; - - pi->content_loaded = 1; - pi->ofile = &patch->ofile; - pi->nfile = &patch->nfile; - - return diff_print_info_init__common(pi, out, repo, format, cb, payload); -} - -static char diff_pick_suffix(int mode) -{ - if (S_ISDIR(mode)) - return '/'; - else if (GIT_PERMS_IS_EXEC(mode)) /* -V536 */ - /* in git, modes are very regular, so we must have 0100755 mode */ - return '*'; - else - return ' '; -} - -char git_diff_status_char(git_delta_t status) -{ - char code; - - switch (status) { - case GIT_DELTA_ADDED: code = 'A'; break; - case GIT_DELTA_DELETED: code = 'D'; break; - case GIT_DELTA_MODIFIED: code = 'M'; break; - case GIT_DELTA_RENAMED: code = 'R'; break; - case GIT_DELTA_COPIED: code = 'C'; break; - case GIT_DELTA_IGNORED: code = 'I'; break; - case GIT_DELTA_UNTRACKED: code = '?'; break; - case GIT_DELTA_UNREADABLE: code = 'X'; break; - default: code = ' '; break; - } - - return code; -} - -static int diff_print_one_name_only( - const git_diff_delta *delta, float progress, void *data) -{ - diff_print_info *pi = data; - git_buf *out = pi->buf; - - GIT_UNUSED(progress); - - if ((pi->flags & GIT_DIFF_SHOW_UNMODIFIED) == 0 && - delta->status == GIT_DELTA_UNMODIFIED) - return 0; - - git_buf_clear(out); - git_buf_puts(out, delta->new_file.path); - git_buf_putc(out, '\n'); - if (git_buf_oom(out)) - return -1; - - pi->line.origin = GIT_DIFF_LINE_FILE_HDR; - pi->line.content = git_buf_cstr(out); - pi->line.content_len = git_buf_len(out); - - return pi->print_cb(delta, NULL, &pi->line, pi->payload); -} - -static int diff_print_one_name_status( - const git_diff_delta *delta, float progress, void *data) -{ - diff_print_info *pi = data; - git_buf *out = pi->buf; - char old_suffix, new_suffix, code = git_diff_status_char(delta->status); - int (*strcomp)(const char *, const char *) = - pi->diff ? pi->diff->strcomp : git__strcmp; - - GIT_UNUSED(progress); - - if ((pi->flags & GIT_DIFF_SHOW_UNMODIFIED) == 0 && code == ' ') - return 0; - - old_suffix = diff_pick_suffix(delta->old_file.mode); - new_suffix = diff_pick_suffix(delta->new_file.mode); - - git_buf_clear(out); - - if (delta->old_file.path != delta->new_file.path && - strcomp(delta->old_file.path,delta->new_file.path) != 0) - git_buf_printf(out, "%c\t%s%c %s%c\n", code, - delta->old_file.path, old_suffix, delta->new_file.path, new_suffix); - else if (delta->old_file.mode != delta->new_file.mode && - delta->old_file.mode != 0 && delta->new_file.mode != 0) - git_buf_printf(out, "%c\t%s%c %s%c\n", code, - delta->old_file.path, old_suffix, delta->new_file.path, new_suffix); - else if (old_suffix != ' ') - git_buf_printf(out, "%c\t%s%c\n", code, delta->old_file.path, old_suffix); - else - git_buf_printf(out, "%c\t%s\n", code, delta->old_file.path); - if (git_buf_oom(out)) - return -1; - - pi->line.origin = GIT_DIFF_LINE_FILE_HDR; - pi->line.content = git_buf_cstr(out); - pi->line.content_len = git_buf_len(out); - - return pi->print_cb(delta, NULL, &pi->line, pi->payload); -} - -static int diff_print_one_raw( - const git_diff_delta *delta, float progress, void *data) -{ - diff_print_info *pi = data; - git_buf *out = pi->buf; - char code = git_diff_status_char(delta->status); - char start_oid[GIT_OID_HEXSZ+1], end_oid[GIT_OID_HEXSZ+1]; - - GIT_UNUSED(progress); - - if ((pi->flags & GIT_DIFF_SHOW_UNMODIFIED) == 0 && code == ' ') - return 0; - - git_buf_clear(out); - - git_oid_tostr(start_oid, pi->oid_strlen, &delta->old_file.id); - git_oid_tostr(end_oid, pi->oid_strlen, &delta->new_file.id); - - git_buf_printf( - out, (pi->oid_strlen <= GIT_OID_HEXSZ) ? - ":%06o %06o %s... %s... %c" : ":%06o %06o %s %s %c", - delta->old_file.mode, delta->new_file.mode, start_oid, end_oid, code); - - if (delta->similarity > 0) - git_buf_printf(out, "%03u", delta->similarity); - - if (delta->old_file.path != delta->new_file.path) - git_buf_printf( - out, "\t%s %s\n", delta->old_file.path, delta->new_file.path); - else - git_buf_printf( - out, "\t%s\n", delta->old_file.path ? - delta->old_file.path : delta->new_file.path); - - if (git_buf_oom(out)) - return -1; - - pi->line.origin = GIT_DIFF_LINE_FILE_HDR; - pi->line.content = git_buf_cstr(out); - pi->line.content_len = git_buf_len(out); - - return pi->print_cb(delta, NULL, &pi->line, pi->payload); -} - -static int diff_print_oid_range( - git_buf *out, const git_diff_delta *delta, int oid_strlen) -{ - char start_oid[GIT_OID_HEXSZ+1], end_oid[GIT_OID_HEXSZ+1]; - - git_oid_tostr(start_oid, oid_strlen, &delta->old_file.id); - git_oid_tostr(end_oid, oid_strlen, &delta->new_file.id); - - /* TODO: Match git diff more closely */ - if (delta->old_file.mode == delta->new_file.mode) { - git_buf_printf(out, "index %s..%s %o\n", - start_oid, end_oid, delta->old_file.mode); - } else { - if (delta->old_file.mode == 0) { - git_buf_printf(out, "new file mode %o\n", delta->new_file.mode); - } else if (delta->new_file.mode == 0) { - git_buf_printf(out, "deleted file mode %o\n", delta->old_file.mode); - } else { - git_buf_printf(out, "old mode %o\n", delta->old_file.mode); - git_buf_printf(out, "new mode %o\n", delta->new_file.mode); - } - git_buf_printf(out, "index %s..%s\n", start_oid, end_oid); - } - - return git_buf_oom(out) ? -1 : 0; -} - -static int diff_delta_format_with_paths( - git_buf *out, - const git_diff_delta *delta, - const char *oldpfx, - const char *newpfx, - const char *template) -{ - const char *oldpath = delta->old_file.path; - const char *newpath = delta->new_file.path; - - if (git_oid_iszero(&delta->old_file.id)) { - oldpfx = ""; - oldpath = "/dev/null"; - } - if (git_oid_iszero(&delta->new_file.id)) { - newpfx = ""; - newpath = "/dev/null"; - } - - return git_buf_printf(out, template, oldpfx, oldpath, newpfx, newpath); -} - -int git_diff_delta__format_file_header( - git_buf *out, - const git_diff_delta *delta, - const char *oldpfx, - const char *newpfx, - int oid_strlen) -{ - if (!oldpfx) - oldpfx = DIFF_OLD_PREFIX_DEFAULT; - if (!newpfx) - newpfx = DIFF_NEW_PREFIX_DEFAULT; - if (!oid_strlen) - oid_strlen = GIT_ABBREV_DEFAULT + 1; - - git_buf_clear(out); - - git_buf_printf(out, "diff --git %s%s %s%s\n", - oldpfx, delta->old_file.path, newpfx, delta->new_file.path); - - GITERR_CHECK_ERROR(diff_print_oid_range(out, delta, oid_strlen)); - - if ((delta->flags & GIT_DIFF_FLAG_BINARY) == 0) - diff_delta_format_with_paths( - out, delta, oldpfx, newpfx, "--- %s%s\n+++ %s%s\n"); - - return git_buf_oom(out) ? -1 : 0; -} - -static int format_binary( - diff_print_info *pi, - git_diff_binary_t type, - const char *data, - size_t datalen, - size_t inflatedlen) -{ - const char *typename = type == GIT_DIFF_BINARY_DELTA ? - "delta" : "literal"; - const char *scan, *end; - - git_buf_printf(pi->buf, "%s %" PRIuZ "\n", typename, inflatedlen); - pi->line.num_lines++; - - for (scan = data, end = data + datalen; scan < end; ) { - size_t chunk_len = end - scan; - if (chunk_len > 52) - chunk_len = 52; - - if (chunk_len <= 26) - git_buf_putc(pi->buf, (char)chunk_len + 'A' - 1); - else - git_buf_putc(pi->buf, (char)chunk_len - 26 + 'a' - 1); - - git_buf_encode_base85(pi->buf, scan, chunk_len); - git_buf_putc(pi->buf, '\n'); - - if (git_buf_oom(pi->buf)) - return -1; - - scan += chunk_len; - pi->line.num_lines++; - } - - return 0; -} - -static int diff_print_load_content( - diff_print_info *pi, - git_diff_delta *delta) -{ - git_diff_file_content *ofile, *nfile; - int error; - - assert(pi->diff); - - ofile = git__calloc(1, sizeof(git_diff_file_content)); - nfile = git__calloc(1, sizeof(git_diff_file_content)); - - GITERR_CHECK_ALLOC(ofile); - GITERR_CHECK_ALLOC(nfile); - - if ((error = git_diff_file_content__init_from_diff( - ofile, pi->diff, delta, true)) < 0 || - (error = git_diff_file_content__init_from_diff( - nfile, pi->diff, delta, true)) < 0) { - - git__free(ofile); - git__free(nfile); - return error; - } - - pi->content_loaded = 1; - pi->content_allocated = 1; - pi->ofile = ofile; - pi->nfile = nfile; - - return 0; -} - -static int diff_print_patch_file_binary( - diff_print_info *pi, git_diff_delta *delta, - const char *old_pfx, const char *new_pfx, - const git_diff_binary *binary) -{ - size_t pre_binary_size; - int error; - - if ((pi->flags & GIT_DIFF_SHOW_BINARY) == 0) - goto noshow; - - if (!pi->content_loaded && - (error = diff_print_load_content(pi, delta)) < 0) - return error; - - pre_binary_size = pi->buf->size; - git_buf_printf(pi->buf, "GIT binary patch\n"); - pi->line.num_lines++; - - if ((error = format_binary(pi, binary->new_file.type, binary->new_file.data, - binary->new_file.datalen, binary->new_file.inflatedlen)) < 0 || - (error = git_buf_putc(pi->buf, '\n')) < 0 || - (error = format_binary(pi, binary->old_file.type, binary->old_file.data, - binary->old_file.datalen, binary->old_file.inflatedlen)) < 0) { - - if (error == GIT_EBUFS) { - giterr_clear(); - git_buf_truncate(pi->buf, pre_binary_size); - goto noshow; - } - } - - pi->line.num_lines++; - return error; - -noshow: - pi->line.num_lines = 1; - return diff_delta_format_with_paths( - pi->buf, delta, old_pfx, new_pfx, - "Binary files %s%s and %s%s differ\n"); -} - -static int diff_print_patch_file( - const git_diff_delta *delta, float progress, void *data) -{ - int error; - diff_print_info *pi = data; - const char *oldpfx = - pi->diff ? pi->diff->opts.old_prefix : DIFF_OLD_PREFIX_DEFAULT; - const char *newpfx = - pi->diff ? pi->diff->opts.new_prefix : DIFF_NEW_PREFIX_DEFAULT; - - bool binary = (delta->flags & GIT_DIFF_FLAG_BINARY) || - (pi->flags & GIT_DIFF_FORCE_BINARY); - bool show_binary = !!(pi->flags & GIT_DIFF_SHOW_BINARY); - int oid_strlen = binary && show_binary ? - GIT_OID_HEXSZ + 1 : pi->oid_strlen; - - GIT_UNUSED(progress); - - if (S_ISDIR(delta->new_file.mode) || - delta->status == GIT_DELTA_UNMODIFIED || - delta->status == GIT_DELTA_IGNORED || - delta->status == GIT_DELTA_UNREADABLE || - (delta->status == GIT_DELTA_UNTRACKED && - (pi->flags & GIT_DIFF_SHOW_UNTRACKED_CONTENT) == 0)) - return 0; - - if ((error = git_diff_delta__format_file_header( - pi->buf, delta, oldpfx, newpfx, oid_strlen)) < 0) - return error; - - pi->line.origin = GIT_DIFF_LINE_FILE_HDR; - pi->line.content = git_buf_cstr(pi->buf); - pi->line.content_len = git_buf_len(pi->buf); - - return pi->print_cb(delta, NULL, &pi->line, pi->payload); -} - -static int diff_print_patch_binary( - const git_diff_delta *delta, - const git_diff_binary *binary, - void *data) -{ - diff_print_info *pi = data; - const char *old_pfx = - pi->diff ? pi->diff->opts.old_prefix : DIFF_OLD_PREFIX_DEFAULT; - const char *new_pfx = - pi->diff ? pi->diff->opts.new_prefix : DIFF_NEW_PREFIX_DEFAULT; - int error; - - git_buf_clear(pi->buf); - - if ((error = diff_print_patch_file_binary( - pi, (git_diff_delta *)delta, old_pfx, new_pfx, binary)) < 0) - return error; - - pi->line.origin = GIT_DIFF_LINE_BINARY; - pi->line.content = git_buf_cstr(pi->buf); - pi->line.content_len = git_buf_len(pi->buf); - - return pi->print_cb(delta, NULL, &pi->line, pi->payload); -} - -static int diff_print_patch_hunk( - const git_diff_delta *d, - const git_diff_hunk *h, - void *data) -{ - diff_print_info *pi = data; - - if (S_ISDIR(d->new_file.mode)) - return 0; - - pi->line.origin = GIT_DIFF_LINE_HUNK_HDR; - pi->line.content = h->header; - pi->line.content_len = h->header_len; - - return pi->print_cb(d, h, &pi->line, pi->payload); -} - -static int diff_print_patch_line( - const git_diff_delta *delta, - const git_diff_hunk *hunk, - const git_diff_line *line, - void *data) -{ - diff_print_info *pi = data; - - if (S_ISDIR(delta->new_file.mode)) - return 0; - - return pi->print_cb(delta, hunk, line, pi->payload); -} - -/* print a git_diff to an output callback */ -int git_diff_print( - git_diff *diff, - git_diff_format_t format, - git_diff_line_cb print_cb, - void *payload) -{ - int error; - git_buf buf = GIT_BUF_INIT; - diff_print_info pi; - git_diff_file_cb print_file = NULL; - git_diff_binary_cb print_binary = NULL; - git_diff_hunk_cb print_hunk = NULL; - git_diff_line_cb print_line = NULL; - - switch (format) { - case GIT_DIFF_FORMAT_PATCH: - print_file = diff_print_patch_file; - print_binary = diff_print_patch_binary; - print_hunk = diff_print_patch_hunk; - print_line = diff_print_patch_line; - break; - case GIT_DIFF_FORMAT_PATCH_HEADER: - print_file = diff_print_patch_file; - break; - case GIT_DIFF_FORMAT_RAW: - print_file = diff_print_one_raw; - break; - case GIT_DIFF_FORMAT_NAME_ONLY: - print_file = diff_print_one_name_only; - break; - case GIT_DIFF_FORMAT_NAME_STATUS: - print_file = diff_print_one_name_status; - break; - default: - giterr_set(GITERR_INVALID, "Unknown diff output format (%d)", format); - return -1; - } - - if (!(error = diff_print_info_init_fromdiff( - &pi, &buf, diff, format, print_cb, payload))) { - error = git_diff_foreach( - diff, print_file, print_binary, print_hunk, print_line, &pi); - - if (error) /* make sure error message is set */ - giterr_set_after_callback_function(error, "git_diff_print"); - } - - git__free(pi.nfile); - git__free(pi.ofile); - - git_buf_free(&buf); - - return error; -} - -/* print a git_patch to an output callback */ -int git_patch_print( - git_patch *patch, - git_diff_line_cb print_cb, - void *payload) -{ - int error; - git_buf temp = GIT_BUF_INIT; - diff_print_info pi; - - assert(patch && print_cb); - - if (!(error = diff_print_info_init_frompatch( - &pi, &temp, patch, - GIT_DIFF_FORMAT_PATCH, print_cb, payload))) - { - error = git_patch__invoke_callbacks( - patch, diff_print_patch_file, diff_print_patch_binary, - diff_print_patch_hunk, diff_print_patch_line, &pi); - - if (error) /* make sure error message is set */ - giterr_set_after_callback_function(error, "git_patch_print"); - } - - git_buf_free(&temp); - - return error; -} - -int git_diff_print_callback__to_buf( - const git_diff_delta *delta, - const git_diff_hunk *hunk, - const git_diff_line *line, - void *payload) -{ - git_buf *output = payload; - GIT_UNUSED(delta); GIT_UNUSED(hunk); - - if (!output) { - giterr_set(GITERR_INVALID, "Buffer pointer must be provided"); - return -1; - } - - if (line->origin == GIT_DIFF_LINE_ADDITION || - line->origin == GIT_DIFF_LINE_DELETION || - line->origin == GIT_DIFF_LINE_CONTEXT) - git_buf_putc(output, line->origin); - - return git_buf_put(output, line->content, line->content_len); -} - -int git_diff_print_callback__to_file_handle( - const git_diff_delta *delta, - const git_diff_hunk *hunk, - const git_diff_line *line, - void *payload) -{ - FILE *fp = payload ? payload : stdout; - - GIT_UNUSED(delta); GIT_UNUSED(hunk); - - if (line->origin == GIT_DIFF_LINE_CONTEXT || - line->origin == GIT_DIFF_LINE_ADDITION || - line->origin == GIT_DIFF_LINE_DELETION) - fputc(line->origin, fp); - fwrite(line->content, 1, line->content_len, fp); - return 0; -} - -/* print a git_patch to a git_buf */ -int git_patch_to_buf(git_buf *out, git_patch *patch) -{ - assert(out && patch); - git_buf_sanitize(out); - return git_patch_print(patch, git_diff_print_callback__to_buf, out); -} diff --git a/vendor/libgit2/src/diff_stats.c b/vendor/libgit2/src/diff_stats.c deleted file mode 100644 index 42ccbfb871..0000000000 --- a/vendor/libgit2/src/diff_stats.c +++ /dev/null @@ -1,336 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#include "common.h" -#include "vector.h" -#include "diff.h" -#include "diff_patch.h" - -#define DIFF_RENAME_FILE_SEPARATOR " => " -#define STATS_FULL_MIN_SCALE 7 - -typedef struct { - size_t insertions; - size_t deletions; -} diff_file_stats; - -struct git_diff_stats { - git_diff *diff; - diff_file_stats *filestats; - - size_t files_changed; - size_t insertions; - size_t deletions; - size_t renames; - - size_t max_name; - size_t max_filestat; - int max_digits; -}; - -static int digits_for_value(size_t val) -{ - int count = 1; - size_t placevalue = 10; - - while (val >= placevalue) { - ++count; - placevalue *= 10; - } - - return count; -} - -int git_diff_file_stats__full_to_buf( - git_buf *out, - const git_diff_delta *delta, - const diff_file_stats *filestat, - const git_diff_stats *stats, - size_t width) -{ - const char *old_path = NULL, *new_path = NULL; - size_t padding, old_size, new_size; - - old_path = delta->old_file.path; - new_path = delta->new_file.path; - old_size = delta->old_file.size; - new_size = delta->new_file.size; - - if (git_buf_printf(out, " %s", old_path) < 0) - goto on_error; - - if (strcmp(old_path, new_path) != 0) { - padding = stats->max_name - strlen(old_path) - strlen(new_path); - - if (git_buf_printf(out, DIFF_RENAME_FILE_SEPARATOR "%s", new_path) < 0) - goto on_error; - } else { - padding = stats->max_name - strlen(old_path); - - if (stats->renames > 0) - padding += strlen(DIFF_RENAME_FILE_SEPARATOR); - } - - if (git_buf_putcn(out, ' ', padding) < 0 || - git_buf_puts(out, " | ") < 0) - goto on_error; - - if (delta->flags & GIT_DIFF_FLAG_BINARY) { - if (git_buf_printf(out, - "Bin %" PRIuZ " -> %" PRIuZ " bytes", old_size, new_size) < 0) - goto on_error; - } - else { - if (git_buf_printf(out, - "%*" PRIuZ, stats->max_digits, - filestat->insertions + filestat->deletions) < 0) - goto on_error; - - if (filestat->insertions || filestat->deletions) { - if (git_buf_putc(out, ' ') < 0) - goto on_error; - - if (!width) { - if (git_buf_putcn(out, '+', filestat->insertions) < 0 || - git_buf_putcn(out, '-', filestat->deletions) < 0) - goto on_error; - } else { - size_t total = filestat->insertions + filestat->deletions; - size_t full = (total * width + stats->max_filestat / 2) / - stats->max_filestat; - size_t plus = full * filestat->insertions / total; - size_t minus = full - plus; - - if (git_buf_putcn(out, '+', max(plus, 1)) < 0 || - git_buf_putcn(out, '-', max(minus, 1)) < 0) - goto on_error; - } - } - } - - git_buf_putc(out, '\n'); - -on_error: - return (git_buf_oom(out) ? -1 : 0); -} - -int git_diff_file_stats__number_to_buf( - git_buf *out, - const git_diff_delta *delta, - const diff_file_stats *filestats) -{ - int error; - const char *path = delta->new_file.path; - - if (delta->flags & GIT_DIFF_FLAG_BINARY) - error = git_buf_printf(out, "%-8c" "%-8c" "%s\n", '-', '-', path); - else - error = git_buf_printf(out, "%-8" PRIuZ "%-8" PRIuZ "%s\n", - filestats->insertions, filestats->deletions, path); - - return error; -} - -int git_diff_file_stats__summary_to_buf( - git_buf *out, - const git_diff_delta *delta) -{ - if (delta->old_file.mode != delta->new_file.mode) { - if (delta->old_file.mode == 0) { - git_buf_printf(out, " create mode %06o %s\n", - delta->new_file.mode, delta->new_file.path); - } - else if (delta->new_file.mode == 0) { - git_buf_printf(out, " delete mode %06o %s\n", - delta->old_file.mode, delta->old_file.path); - } - else { - git_buf_printf(out, " mode change %06o => %06o %s\n", - delta->old_file.mode, delta->new_file.mode, delta->new_file.path); - } - } - - return 0; -} - -int git_diff_get_stats( - git_diff_stats **out, - git_diff *diff) -{ - size_t i, deltas; - size_t total_insertions = 0, total_deletions = 0; - git_diff_stats *stats = NULL; - int error = 0; - - assert(out && diff); - - stats = git__calloc(1, sizeof(git_diff_stats)); - GITERR_CHECK_ALLOC(stats); - - deltas = git_diff_num_deltas(diff); - - stats->filestats = git__calloc(deltas, sizeof(diff_file_stats)); - if (!stats->filestats) { - git__free(stats); - return -1; - } - - stats->diff = diff; - GIT_REFCOUNT_INC(diff); - - for (i = 0; i < deltas && !error; ++i) { - git_patch *patch = NULL; - size_t add = 0, remove = 0, namelen; - const git_diff_delta *delta; - - if ((error = git_patch_from_diff(&patch, diff, i)) < 0) - break; - - /* keep a count of renames because it will affect formatting */ - delta = git_patch_get_delta(patch); - - namelen = strlen(delta->new_file.path); - if (strcmp(delta->old_file.path, delta->new_file.path) != 0) { - namelen += strlen(delta->old_file.path); - stats->renames++; - } - - /* and, of course, count the line stats */ - error = git_patch_line_stats(NULL, &add, &remove, patch); - - git_patch_free(patch); - - stats->filestats[i].insertions = add; - stats->filestats[i].deletions = remove; - - total_insertions += add; - total_deletions += remove; - - if (stats->max_name < namelen) - stats->max_name = namelen; - if (stats->max_filestat < add + remove) - stats->max_filestat = add + remove; - } - - stats->files_changed = deltas; - stats->insertions = total_insertions; - stats->deletions = total_deletions; - stats->max_digits = digits_for_value(stats->max_filestat + 1); - - if (error < 0) { - git_diff_stats_free(stats); - stats = NULL; - } - - *out = stats; - return error; -} - -size_t git_diff_stats_files_changed( - const git_diff_stats *stats) -{ - assert(stats); - - return stats->files_changed; -} - -size_t git_diff_stats_insertions( - const git_diff_stats *stats) -{ - assert(stats); - - return stats->insertions; -} - -size_t git_diff_stats_deletions( - const git_diff_stats *stats) -{ - assert(stats); - - return stats->deletions; -} - -int git_diff_stats_to_buf( - git_buf *out, - const git_diff_stats *stats, - git_diff_stats_format_t format, - size_t width) -{ - int error = 0; - size_t i; - const git_diff_delta *delta; - - assert(out && stats); - - if (format & GIT_DIFF_STATS_NUMBER) { - for (i = 0; i < stats->files_changed; ++i) { - if ((delta = git_diff_get_delta(stats->diff, i)) == NULL) - continue; - - error = git_diff_file_stats__number_to_buf( - out, delta, &stats->filestats[i]); - if (error < 0) - return error; - } - } - - if (format & GIT_DIFF_STATS_FULL) { - if (width > 0) { - if (width > stats->max_name + stats->max_digits + 5) - width -= (stats->max_name + stats->max_digits + 5); - if (width < STATS_FULL_MIN_SCALE) - width = STATS_FULL_MIN_SCALE; - } - if (width > stats->max_filestat) - width = 0; - - for (i = 0; i < stats->files_changed; ++i) { - if ((delta = git_diff_get_delta(stats->diff, i)) == NULL) - continue; - - error = git_diff_file_stats__full_to_buf( - out, delta, &stats->filestats[i], stats, width); - if (error < 0) - return error; - } - } - - if (format & GIT_DIFF_STATS_FULL || format & GIT_DIFF_STATS_SHORT) { - error = git_buf_printf( - out, " %" PRIuZ " file%s changed, %" PRIuZ - " insertion%s(+), %" PRIuZ " deletion%s(-)\n", - stats->files_changed, stats->files_changed != 1 ? "s" : "", - stats->insertions, stats->insertions != 1 ? "s" : "", - stats->deletions, stats->deletions != 1 ? "s" : ""); - - if (error < 0) - return error; - } - - if (format & GIT_DIFF_STATS_INCLUDE_SUMMARY) { - for (i = 0; i < stats->files_changed; ++i) { - if ((delta = git_diff_get_delta(stats->diff, i)) == NULL) - continue; - - error = git_diff_file_stats__summary_to_buf(out, delta); - if (error < 0) - return error; - } - } - - return error; -} - -void git_diff_stats_free(git_diff_stats *stats) -{ - if (stats == NULL) - return; - - git_diff_free(stats->diff); /* bumped refcount in constructor */ - git__free(stats->filestats); - git__free(stats); -} - diff --git a/vendor/libgit2/src/diff_tform.c b/vendor/libgit2/src/diff_tform.c deleted file mode 100644 index 92647e3306..0000000000 --- a/vendor/libgit2/src/diff_tform.c +++ /dev/null @@ -1,1107 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#include "common.h" - -#include "git2/config.h" -#include "git2/blob.h" -#include "git2/sys/hashsig.h" - -#include "diff.h" -#include "path.h" -#include "fileops.h" -#include "config.h" - -git_diff_delta *git_diff__delta_dup( - const git_diff_delta *d, git_pool *pool) -{ - git_diff_delta *delta = git__malloc(sizeof(git_diff_delta)); - if (!delta) - return NULL; - - memcpy(delta, d, sizeof(git_diff_delta)); - GIT_DIFF_FLAG__CLEAR_INTERNAL(delta->flags); - - if (d->old_file.path != NULL) { - delta->old_file.path = git_pool_strdup(pool, d->old_file.path); - if (delta->old_file.path == NULL) - goto fail; - } - - if (d->new_file.path != d->old_file.path && d->new_file.path != NULL) { - delta->new_file.path = git_pool_strdup(pool, d->new_file.path); - if (delta->new_file.path == NULL) - goto fail; - } else { - delta->new_file.path = delta->old_file.path; - } - - return delta; - -fail: - git__free(delta); - return NULL; -} - -git_diff_delta *git_diff__merge_like_cgit( - const git_diff_delta *a, - const git_diff_delta *b, - git_pool *pool) -{ - git_diff_delta *dup; - - /* Emulate C git for merging two diffs (a la 'git diff '). - * - * When C git does a diff between the work dir and a tree, it actually - * diffs with the index but uses the workdir contents. This emulates - * those choices so we can emulate the type of diff. - * - * We have three file descriptions here, let's call them: - * f1 = a->old_file - * f2 = a->new_file AND b->old_file - * f3 = b->new_file - */ - - /* If one of the diffs is a conflict, just dup it */ - if (b->status == GIT_DELTA_CONFLICTED) - return git_diff__delta_dup(b, pool); - if (a->status == GIT_DELTA_CONFLICTED) - return git_diff__delta_dup(a, pool); - - /* if f2 == f3 or f2 is deleted, then just dup the 'a' diff */ - if (b->status == GIT_DELTA_UNMODIFIED || a->status == GIT_DELTA_DELETED) - return git_diff__delta_dup(a, pool); - - /* otherwise, base this diff on the 'b' diff */ - if ((dup = git_diff__delta_dup(b, pool)) == NULL) - return NULL; - - /* If 'a' status is uninteresting, then we're done */ - if (a->status == GIT_DELTA_UNMODIFIED || - a->status == GIT_DELTA_UNTRACKED || - a->status == GIT_DELTA_UNREADABLE) - return dup; - - assert(b->status != GIT_DELTA_UNMODIFIED); - - /* A cgit exception is that the diff of a file that is only in the - * index (i.e. not in HEAD nor workdir) is given as empty. - */ - if (dup->status == GIT_DELTA_DELETED) { - if (a->status == GIT_DELTA_ADDED) { - dup->status = GIT_DELTA_UNMODIFIED; - dup->nfiles = 2; - } - /* else don't overwrite DELETE status */ - } else { - dup->status = a->status; - dup->nfiles = a->nfiles; - } - - git_oid_cpy(&dup->old_file.id, &a->old_file.id); - dup->old_file.mode = a->old_file.mode; - dup->old_file.size = a->old_file.size; - dup->old_file.flags = a->old_file.flags; - - return dup; -} - -int git_diff__merge( - git_diff *onto, const git_diff *from, git_diff__merge_cb cb) -{ - int error = 0; - git_pool onto_pool; - git_vector onto_new; - git_diff_delta *delta; - bool ignore_case, reversed; - unsigned int i, j; - - assert(onto && from); - - if (!from->deltas.length) - return 0; - - ignore_case = ((onto->opts.flags & GIT_DIFF_IGNORE_CASE) != 0); - reversed = ((onto->opts.flags & GIT_DIFF_REVERSE) != 0); - - if (ignore_case != ((from->opts.flags & GIT_DIFF_IGNORE_CASE) != 0) || - reversed != ((from->opts.flags & GIT_DIFF_REVERSE) != 0)) { - giterr_set(GITERR_INVALID, - "Attempt to merge diffs created with conflicting options"); - return -1; - } - - if (git_vector_init( - &onto_new, onto->deltas.length, git_diff_delta__cmp) < 0 || - git_pool_init(&onto_pool, 1, 0) < 0) - return -1; - - for (i = 0, j = 0; i < onto->deltas.length || j < from->deltas.length; ) { - git_diff_delta *o = GIT_VECTOR_GET(&onto->deltas, i); - const git_diff_delta *f = GIT_VECTOR_GET(&from->deltas, j); - int cmp = !f ? -1 : !o ? 1 : - STRCMP_CASESELECT(ignore_case, o->old_file.path, f->old_file.path); - - if (cmp < 0) { - delta = git_diff__delta_dup(o, &onto_pool); - i++; - } else if (cmp > 0) { - delta = git_diff__delta_dup(f, &onto_pool); - j++; - } else { - const git_diff_delta *left = reversed ? f : o; - const git_diff_delta *right = reversed ? o : f; - - delta = cb(left, right, &onto_pool); - i++; - j++; - } - - /* the ignore rules for the target may not match the source - * or the result of a merged delta could be skippable... - */ - if (delta && git_diff_delta__should_skip(&onto->opts, delta)) { - git__free(delta); - continue; - } - - if ((error = !delta ? -1 : git_vector_insert(&onto_new, delta)) < 0) - break; - } - - if (!error) { - git_vector_swap(&onto->deltas, &onto_new); - git_pool_swap(&onto->pool, &onto_pool); - - if ((onto->opts.flags & GIT_DIFF_REVERSE) != 0) - onto->old_src = from->old_src; - else - onto->new_src = from->new_src; - - /* prefix strings also come from old pool, so recreate those.*/ - onto->opts.old_prefix = - git_pool_strdup_safe(&onto->pool, onto->opts.old_prefix); - onto->opts.new_prefix = - git_pool_strdup_safe(&onto->pool, onto->opts.new_prefix); - } - - git_vector_free_deep(&onto_new); - git_pool_clear(&onto_pool); - - return error; -} - -int git_diff_merge(git_diff *onto, const git_diff *from) -{ - return git_diff__merge(onto, from, git_diff__merge_like_cgit); -} - -int git_diff_find_similar__hashsig_for_file( - void **out, const git_diff_file *f, const char *path, void *p) -{ - git_hashsig_option_t opt = (git_hashsig_option_t)(intptr_t)p; - - GIT_UNUSED(f); - return git_hashsig_create_fromfile((git_hashsig **)out, path, opt); -} - -int git_diff_find_similar__hashsig_for_buf( - void **out, const git_diff_file *f, const char *buf, size_t len, void *p) -{ - git_hashsig_option_t opt = (git_hashsig_option_t)(intptr_t)p; - - GIT_UNUSED(f); - return git_hashsig_create((git_hashsig **)out, buf, len, opt); -} - -void git_diff_find_similar__hashsig_free(void *sig, void *payload) -{ - GIT_UNUSED(payload); - git_hashsig_free(sig); -} - -int git_diff_find_similar__calc_similarity( - int *score, void *siga, void *sigb, void *payload) -{ - int error; - - GIT_UNUSED(payload); - error = git_hashsig_compare(siga, sigb); - if (error < 0) - return error; - - *score = error; - return 0; -} - -#define DEFAULT_THRESHOLD 50 -#define DEFAULT_BREAK_REWRITE_THRESHOLD 60 -#define DEFAULT_RENAME_LIMIT 200 - -static int normalize_find_opts( - git_diff *diff, - git_diff_find_options *opts, - const git_diff_find_options *given) -{ - git_config *cfg = NULL; - git_hashsig_option_t hashsig_opts; - - GITERR_CHECK_VERSION(given, GIT_DIFF_FIND_OPTIONS_VERSION, "git_diff_find_options"); - - if (diff->repo != NULL && - git_repository_config__weakptr(&cfg, diff->repo) < 0) - return -1; - - if (given) - memcpy(opts, given, sizeof(*opts)); - - if (!given || - (given->flags & GIT_DIFF_FIND_ALL) == GIT_DIFF_FIND_BY_CONFIG) - { - char *rule = - git_config__get_string_force(cfg, "diff.renames", "true"); - int boolval; - - if (!git__parse_bool(&boolval, rule) && !boolval) - /* don't set FIND_RENAMES if bool value is false */; - else if (!strcasecmp(rule, "copies") || !strcasecmp(rule, "copy")) - opts->flags |= GIT_DIFF_FIND_RENAMES | GIT_DIFF_FIND_COPIES; - else - opts->flags |= GIT_DIFF_FIND_RENAMES; - - git__free(rule); - } - - /* some flags imply others */ - - if (opts->flags & GIT_DIFF_FIND_EXACT_MATCH_ONLY) { - /* if we are only looking for exact matches, then don't turn - * MODIFIED items into ADD/DELETE pairs because it's too picky - */ - opts->flags &= ~(GIT_DIFF_FIND_REWRITES | GIT_DIFF_BREAK_REWRITES); - - /* similarly, don't look for self-rewrites to split */ - opts->flags &= ~GIT_DIFF_FIND_RENAMES_FROM_REWRITES; - } - - if (opts->flags & GIT_DIFF_FIND_RENAMES_FROM_REWRITES) - opts->flags |= GIT_DIFF_FIND_RENAMES; - - if (opts->flags & GIT_DIFF_FIND_COPIES_FROM_UNMODIFIED) - opts->flags |= GIT_DIFF_FIND_COPIES; - - if (opts->flags & GIT_DIFF_BREAK_REWRITES) - opts->flags |= GIT_DIFF_FIND_REWRITES; - -#define USE_DEFAULT(X) ((X) == 0 || (X) > 100) - - if (USE_DEFAULT(opts->rename_threshold)) - opts->rename_threshold = DEFAULT_THRESHOLD; - - if (USE_DEFAULT(opts->rename_from_rewrite_threshold)) - opts->rename_from_rewrite_threshold = DEFAULT_THRESHOLD; - - if (USE_DEFAULT(opts->copy_threshold)) - opts->copy_threshold = DEFAULT_THRESHOLD; - - if (USE_DEFAULT(opts->break_rewrite_threshold)) - opts->break_rewrite_threshold = DEFAULT_BREAK_REWRITE_THRESHOLD; - -#undef USE_DEFAULT - - if (!opts->rename_limit) { - opts->rename_limit = git_config__get_int_force( - cfg, "diff.renamelimit", DEFAULT_RENAME_LIMIT); - - if (opts->rename_limit <= 0) - opts->rename_limit = DEFAULT_RENAME_LIMIT; - } - - /* assign the internal metric with whitespace flag as payload */ - if (!opts->metric) { - opts->metric = git__malloc(sizeof(git_diff_similarity_metric)); - GITERR_CHECK_ALLOC(opts->metric); - - opts->metric->file_signature = git_diff_find_similar__hashsig_for_file; - opts->metric->buffer_signature = git_diff_find_similar__hashsig_for_buf; - opts->metric->free_signature = git_diff_find_similar__hashsig_free; - opts->metric->similarity = git_diff_find_similar__calc_similarity; - - if (opts->flags & GIT_DIFF_FIND_IGNORE_WHITESPACE) - hashsig_opts = GIT_HASHSIG_IGNORE_WHITESPACE; - else if (opts->flags & GIT_DIFF_FIND_DONT_IGNORE_WHITESPACE) - hashsig_opts = GIT_HASHSIG_NORMAL; - else - hashsig_opts = GIT_HASHSIG_SMART_WHITESPACE; - hashsig_opts |= GIT_HASHSIG_ALLOW_SMALL_FILES; - opts->metric->payload = (void *)hashsig_opts; - } - - return 0; -} - -static int insert_delete_side_of_split( - git_diff *diff, git_vector *onto, const git_diff_delta *delta) -{ - /* make new record for DELETED side of split */ - git_diff_delta *deleted = git_diff__delta_dup(delta, &diff->pool); - GITERR_CHECK_ALLOC(deleted); - - deleted->status = GIT_DELTA_DELETED; - deleted->nfiles = 1; - memset(&deleted->new_file, 0, sizeof(deleted->new_file)); - deleted->new_file.path = deleted->old_file.path; - deleted->new_file.flags |= GIT_DIFF_FLAG_VALID_ID; - - return git_vector_insert(onto, deleted); -} - -static int apply_splits_and_deletes( - git_diff *diff, size_t expected_size, bool actually_split) -{ - git_vector onto = GIT_VECTOR_INIT; - size_t i; - git_diff_delta *delta; - - if (git_vector_init(&onto, expected_size, git_diff_delta__cmp) < 0) - return -1; - - /* build new delta list without TO_DELETE and splitting TO_SPLIT */ - git_vector_foreach(&diff->deltas, i, delta) { - if ((delta->flags & GIT_DIFF_FLAG__TO_DELETE) != 0) - continue; - - if ((delta->flags & GIT_DIFF_FLAG__TO_SPLIT) != 0 && actually_split) { - delta->similarity = 0; - - if (insert_delete_side_of_split(diff, &onto, delta) < 0) - goto on_error; - - if (diff->new_src == GIT_ITERATOR_TYPE_WORKDIR) - delta->status = GIT_DELTA_UNTRACKED; - else - delta->status = GIT_DELTA_ADDED; - delta->nfiles = 1; - memset(&delta->old_file, 0, sizeof(delta->old_file)); - delta->old_file.path = delta->new_file.path; - delta->old_file.flags |= GIT_DIFF_FLAG_VALID_ID; - } - - /* clean up delta before inserting into new list */ - GIT_DIFF_FLAG__CLEAR_INTERNAL(delta->flags); - - if (delta->status != GIT_DELTA_COPIED && - delta->status != GIT_DELTA_RENAMED && - (delta->status != GIT_DELTA_MODIFIED || actually_split)) - delta->similarity = 0; - - /* insert into new list */ - if (git_vector_insert(&onto, delta) < 0) - goto on_error; - } - - /* cannot return an error past this point */ - - /* free deltas from old list that didn't make it to the new one */ - git_vector_foreach(&diff->deltas, i, delta) { - if ((delta->flags & GIT_DIFF_FLAG__TO_DELETE) != 0) - git__free(delta); - } - - /* swap new delta list into place */ - git_vector_swap(&diff->deltas, &onto); - git_vector_free(&onto); - git_vector_sort(&diff->deltas); - - return 0; - -on_error: - git_vector_free_deep(&onto); - - return -1; -} - -GIT_INLINE(git_diff_file *) similarity_get_file(git_diff *diff, size_t idx) -{ - git_diff_delta *delta = git_vector_get(&diff->deltas, idx / 2); - return (idx & 1) ? &delta->new_file : &delta->old_file; -} - -typedef struct { - size_t idx; - git_iterator_type_t src; - git_repository *repo; - git_diff_file *file; - git_buf data; - git_odb_object *odb_obj; - git_blob *blob; -} similarity_info; - -static int similarity_init( - similarity_info *info, git_diff *diff, size_t file_idx) -{ - info->idx = file_idx; - info->src = (file_idx & 1) ? diff->new_src : diff->old_src; - info->repo = diff->repo; - info->file = similarity_get_file(diff, file_idx); - info->odb_obj = NULL; - info->blob = NULL; - git_buf_init(&info->data, 0); - - if (info->file->size > 0 || info->src == GIT_ITERATOR_TYPE_WORKDIR) - return 0; - - return git_diff_file__resolve_zero_size( - info->file, &info->odb_obj, info->repo); -} - -static int similarity_sig( - similarity_info *info, - const git_diff_find_options *opts, - void **cache) -{ - int error = 0; - git_diff_file *file = info->file; - - if (info->src == GIT_ITERATOR_TYPE_WORKDIR) { - if ((error = git_buf_joinpath( - &info->data, git_repository_workdir(info->repo), file->path)) < 0) - return error; - - /* if path is not a regular file, just skip this item */ - if (!git_path_isfile(info->data.ptr)) - return 0; - - /* TODO: apply wd-to-odb filters to file data if necessary */ - - error = opts->metric->file_signature( - &cache[info->idx], info->file, - info->data.ptr, opts->metric->payload); - } else { - /* if we didn't initially know the size, we might have an odb_obj - * around from earlier, so convert that, otherwise load the blob now - */ - if (info->odb_obj != NULL) - error = git_object__from_odb_object( - (git_object **)&info->blob, info->repo, - info->odb_obj, GIT_OBJ_BLOB); - else - error = git_blob_lookup(&info->blob, info->repo, &file->id); - - if (error < 0) { - /* if lookup fails, just skip this item in similarity calc */ - giterr_clear(); - } else { - size_t sz; - - /* index size may not be actual blob size if filtered */ - if (file->size != git_blob_rawsize(info->blob)) - file->size = git_blob_rawsize(info->blob); - - sz = (size_t)(git__is_sizet(file->size) ? file->size : -1); - - error = opts->metric->buffer_signature( - &cache[info->idx], info->file, - git_blob_rawcontent(info->blob), sz, opts->metric->payload); - } - } - - return error; -} - -static void similarity_unload(similarity_info *info) -{ - if (info->odb_obj) - git_odb_object_free(info->odb_obj); - - if (info->blob) - git_blob_free(info->blob); - else - git_buf_free(&info->data); -} - -#define FLAG_SET(opts,flag_name) (((opts)->flags & flag_name) != 0) - -/* - score < 0 means files cannot be compared - * - score >= 100 means files are exact match - * - score == 0 means files are completely different - */ -static int similarity_measure( - int *score, - git_diff *diff, - const git_diff_find_options *opts, - void **cache, - size_t a_idx, - size_t b_idx) -{ - git_diff_file *a_file = similarity_get_file(diff, a_idx); - git_diff_file *b_file = similarity_get_file(diff, b_idx); - bool exact_match = FLAG_SET(opts, GIT_DIFF_FIND_EXACT_MATCH_ONLY); - int error = 0; - similarity_info a_info, b_info; - - *score = -1; - - /* don't try to compare files of different types */ - if (GIT_MODE_TYPE(a_file->mode) != GIT_MODE_TYPE(b_file->mode)) - return 0; - - /* if exact match is requested, force calculation of missing OIDs now */ - if (exact_match) { - if (git_oid_iszero(&a_file->id) && - diff->old_src == GIT_ITERATOR_TYPE_WORKDIR && - !git_diff__oid_for_file(&a_file->id, - diff, a_file->path, a_file->mode, a_file->size)) - a_file->flags |= GIT_DIFF_FLAG_VALID_ID; - - if (git_oid_iszero(&b_file->id) && - diff->new_src == GIT_ITERATOR_TYPE_WORKDIR && - !git_diff__oid_for_file(&b_file->id, - diff, b_file->path, b_file->mode, b_file->size)) - b_file->flags |= GIT_DIFF_FLAG_VALID_ID; - } - - /* check OID match as a quick test */ - if (git_oid__cmp(&a_file->id, &b_file->id) == 0) { - *score = 100; - return 0; - } - - /* don't calculate signatures if we are doing exact match */ - if (exact_match) { - *score = 0; - return 0; - } - - memset(&a_info, 0, sizeof(a_info)); - memset(&b_info, 0, sizeof(b_info)); - - /* set up similarity data (will try to update missing file sizes) */ - if (!cache[a_idx] && (error = similarity_init(&a_info, diff, a_idx)) < 0) - return error; - if (!cache[b_idx] && (error = similarity_init(&b_info, diff, b_idx)) < 0) - goto cleanup; - - /* check if file sizes are nowhere near each other */ - if (a_file->size > 127 && - b_file->size > 127 && - (a_file->size > (b_file->size << 3) || - b_file->size > (a_file->size << 3))) - goto cleanup; - - /* update signature cache if needed */ - if (!cache[a_idx]) { - if ((error = similarity_sig(&a_info, opts, cache)) < 0) - goto cleanup; - } - if (!cache[b_idx]) { - if ((error = similarity_sig(&b_info, opts, cache)) < 0) - goto cleanup; - } - - /* calculate similarity provided that the metric choose to process - * both the a and b files (some may not if file is too big, etc). - */ - if (cache[a_idx] && cache[b_idx]) - error = opts->metric->similarity( - score, cache[a_idx], cache[b_idx], opts->metric->payload); - -cleanup: - similarity_unload(&a_info); - similarity_unload(&b_info); - - return error; -} - -static int calc_self_similarity( - git_diff *diff, - const git_diff_find_options *opts, - size_t delta_idx, - void **cache) -{ - int error, similarity = -1; - git_diff_delta *delta = GIT_VECTOR_GET(&diff->deltas, delta_idx); - - if ((delta->flags & GIT_DIFF_FLAG__HAS_SELF_SIMILARITY) != 0) - return 0; - - error = similarity_measure( - &similarity, diff, opts, cache, 2 * delta_idx, 2 * delta_idx + 1); - if (error < 0) - return error; - - if (similarity >= 0) { - delta->similarity = (uint16_t)similarity; - delta->flags |= GIT_DIFF_FLAG__HAS_SELF_SIMILARITY; - } - - return 0; -} - -static bool is_rename_target( - git_diff *diff, - const git_diff_find_options *opts, - size_t delta_idx, - void **cache) -{ - git_diff_delta *delta = GIT_VECTOR_GET(&diff->deltas, delta_idx); - - /* skip things that aren't plain blobs */ - if (!GIT_MODE_ISBLOB(delta->new_file.mode)) - return false; - - /* only consider ADDED, RENAMED, COPIED, and split MODIFIED as - * targets; maybe include UNTRACKED if requested. - */ - switch (delta->status) { - case GIT_DELTA_UNMODIFIED: - case GIT_DELTA_DELETED: - case GIT_DELTA_IGNORED: - case GIT_DELTA_CONFLICTED: - return false; - - case GIT_DELTA_MODIFIED: - if (!FLAG_SET(opts, GIT_DIFF_FIND_REWRITES) && - !FLAG_SET(opts, GIT_DIFF_FIND_RENAMES_FROM_REWRITES)) - return false; - - if (calc_self_similarity(diff, opts, delta_idx, cache) < 0) - return false; - - if (FLAG_SET(opts, GIT_DIFF_BREAK_REWRITES) && - delta->similarity < opts->break_rewrite_threshold) { - delta->flags |= GIT_DIFF_FLAG__TO_SPLIT; - break; - } - if (FLAG_SET(opts, GIT_DIFF_FIND_RENAMES_FROM_REWRITES) && - delta->similarity < opts->rename_from_rewrite_threshold) - break; - - return false; - - case GIT_DELTA_UNTRACKED: - if (!FLAG_SET(opts, GIT_DIFF_FIND_FOR_UNTRACKED)) - return false; - break; - - default: /* all other status values should be checked */ - break; - } - - delta->flags |= GIT_DIFF_FLAG__IS_RENAME_TARGET; - return true; -} - -static bool is_rename_source( - git_diff *diff, - const git_diff_find_options *opts, - size_t delta_idx, - void **cache) -{ - git_diff_delta *delta = GIT_VECTOR_GET(&diff->deltas, delta_idx); - - /* skip things that aren't blobs */ - if (!GIT_MODE_ISBLOB(delta->old_file.mode)) - return false; - - switch (delta->status) { - case GIT_DELTA_ADDED: - case GIT_DELTA_UNTRACKED: - case GIT_DELTA_UNREADABLE: - case GIT_DELTA_IGNORED: - case GIT_DELTA_CONFLICTED: - return false; - - case GIT_DELTA_DELETED: - case GIT_DELTA_TYPECHANGE: - break; - - case GIT_DELTA_UNMODIFIED: - if (!FLAG_SET(opts, GIT_DIFF_FIND_COPIES_FROM_UNMODIFIED)) - return false; - if (FLAG_SET(opts, GIT_DIFF_FIND_REMOVE_UNMODIFIED)) - delta->flags |= GIT_DIFF_FLAG__TO_DELETE; - break; - - default: /* MODIFIED, RENAMED, COPIED */ - /* if we're finding copies, this could be a source */ - if (FLAG_SET(opts, GIT_DIFF_FIND_COPIES)) - break; - - /* otherwise, this is only a source if we can split it */ - if (!FLAG_SET(opts, GIT_DIFF_FIND_REWRITES) && - !FLAG_SET(opts, GIT_DIFF_FIND_RENAMES_FROM_REWRITES)) - return false; - - if (calc_self_similarity(diff, opts, delta_idx, cache) < 0) - return false; - - if (FLAG_SET(opts, GIT_DIFF_BREAK_REWRITES) && - delta->similarity < opts->break_rewrite_threshold) { - delta->flags |= GIT_DIFF_FLAG__TO_SPLIT; - break; - } - - if (FLAG_SET(opts, GIT_DIFF_FIND_RENAMES_FROM_REWRITES) && - delta->similarity < opts->rename_from_rewrite_threshold) - break; - - return false; - } - - delta->flags |= GIT_DIFF_FLAG__IS_RENAME_SOURCE; - return true; -} - -GIT_INLINE(bool) delta_is_split(git_diff_delta *delta) -{ - return (delta->status == GIT_DELTA_TYPECHANGE || - (delta->flags & GIT_DIFF_FLAG__TO_SPLIT) != 0); -} - -GIT_INLINE(bool) delta_is_new_only(git_diff_delta *delta) -{ - return (delta->status == GIT_DELTA_ADDED || - delta->status == GIT_DELTA_UNTRACKED || - delta->status == GIT_DELTA_UNREADABLE || - delta->status == GIT_DELTA_IGNORED); -} - -GIT_INLINE(void) delta_make_rename( - git_diff_delta *to, const git_diff_delta *from, uint16_t similarity) -{ - to->status = GIT_DELTA_RENAMED; - to->similarity = similarity; - to->nfiles = 2; - memcpy(&to->old_file, &from->old_file, sizeof(to->old_file)); - to->flags &= ~GIT_DIFF_FLAG__TO_SPLIT; -} - -typedef struct { - size_t idx; - uint16_t similarity; -} diff_find_match; - -int git_diff_find_similar( - git_diff *diff, - const git_diff_find_options *given_opts) -{ - size_t s, t; - int error = 0, result; - uint16_t similarity; - git_diff_delta *src, *tgt; - git_diff_find_options opts = GIT_DIFF_FIND_OPTIONS_INIT; - size_t num_deltas, num_srcs = 0, num_tgts = 0; - size_t tried_srcs = 0, tried_tgts = 0; - size_t num_rewrites = 0, num_updates = 0, num_bumped = 0; - size_t sigcache_size; - void **sigcache = NULL; /* cache of similarity metric file signatures */ - diff_find_match *tgt2src = NULL; - diff_find_match *src2tgt = NULL; - diff_find_match *tgt2src_copy = NULL; - diff_find_match *best_match; - git_diff_file swap; - - if ((error = normalize_find_opts(diff, &opts, given_opts)) < 0) - return error; - - num_deltas = diff->deltas.length; - - /* TODO: maybe abort if deltas.length > rename_limit ??? */ - if (!git__is_uint32(num_deltas)) - goto cleanup; - - /* No flags set; nothing to do */ - if ((opts.flags & GIT_DIFF_FIND_ALL) == 0) - goto cleanup; - - GITERR_CHECK_ALLOC_MULTIPLY(&sigcache_size, num_deltas, 2); - sigcache = git__calloc(sigcache_size, sizeof(void *)); - GITERR_CHECK_ALLOC(sigcache); - - /* Label rename sources and targets - * - * This will also set self-similarity scores for MODIFIED files and - * mark them for splitting if break-rewrites is enabled - */ - git_vector_foreach(&diff->deltas, t, tgt) { - if (is_rename_source(diff, &opts, t, sigcache)) - ++num_srcs; - - if (is_rename_target(diff, &opts, t, sigcache)) - ++num_tgts; - - if ((tgt->flags & GIT_DIFF_FLAG__TO_SPLIT) != 0) - num_rewrites++; - } - - /* if there are no candidate srcs or tgts, we're done */ - if (!num_srcs || !num_tgts) - goto cleanup; - - src2tgt = git__calloc(num_deltas, sizeof(diff_find_match)); - GITERR_CHECK_ALLOC(src2tgt); - tgt2src = git__calloc(num_deltas, sizeof(diff_find_match)); - GITERR_CHECK_ALLOC(tgt2src); - - if (FLAG_SET(&opts, GIT_DIFF_FIND_COPIES)) { - tgt2src_copy = git__calloc(num_deltas, sizeof(diff_find_match)); - GITERR_CHECK_ALLOC(tgt2src_copy); - } - - /* - * Find best-fit matches for rename / copy candidates - */ - -find_best_matches: - tried_tgts = num_bumped = 0; - - git_vector_foreach(&diff->deltas, t, tgt) { - /* skip things that are not rename targets */ - if ((tgt->flags & GIT_DIFF_FLAG__IS_RENAME_TARGET) == 0) - continue; - - tried_srcs = 0; - - git_vector_foreach(&diff->deltas, s, src) { - /* skip things that are not rename sources */ - if ((src->flags & GIT_DIFF_FLAG__IS_RENAME_SOURCE) == 0) - continue; - - /* calculate similarity for this pair and find best match */ - if (s == t) - result = -1; /* don't measure self-similarity here */ - else if ((error = similarity_measure( - &result, diff, &opts, sigcache, 2 * s, 2 * t + 1)) < 0) - goto cleanup; - - if (result < 0) - continue; - similarity = (uint16_t)result; - - /* is this a better rename? */ - if (tgt2src[t].similarity < similarity && - src2tgt[s].similarity < similarity) - { - /* eject old mapping */ - if (src2tgt[s].similarity > 0) { - tgt2src[src2tgt[s].idx].similarity = 0; - num_bumped++; - } - if (tgt2src[t].similarity > 0) { - src2tgt[tgt2src[t].idx].similarity = 0; - num_bumped++; - } - - /* write new mapping */ - tgt2src[t].idx = s; - tgt2src[t].similarity = similarity; - src2tgt[s].idx = t; - src2tgt[s].similarity = similarity; - } - - /* keep best absolute match for copies */ - if (tgt2src_copy != NULL && - tgt2src_copy[t].similarity < similarity) - { - tgt2src_copy[t].idx = s; - tgt2src_copy[t].similarity = similarity; - } - - if (++tried_srcs >= num_srcs) - break; - - /* cap on maximum targets we'll examine (per "tgt" file) */ - if (tried_srcs > opts.rename_limit) - break; - } - - if (++tried_tgts >= num_tgts) - break; - } - - if (num_bumped > 0) /* try again if we bumped some items */ - goto find_best_matches; - - /* - * Rewrite the diffs with renames / copies - */ - - git_vector_foreach(&diff->deltas, t, tgt) { - /* skip things that are not rename targets */ - if ((tgt->flags & GIT_DIFF_FLAG__IS_RENAME_TARGET) == 0) - continue; - - /* check if this delta was the target of a similarity */ - if (tgt2src[t].similarity) - best_match = &tgt2src[t]; - else if (tgt2src_copy && tgt2src_copy[t].similarity) - best_match = &tgt2src_copy[t]; - else - continue; - - s = best_match->idx; - src = GIT_VECTOR_GET(&diff->deltas, s); - - /* possible scenarios: - * 1. from DELETE to ADD/UNTRACK/IGNORE = RENAME - * 2. from DELETE to SPLIT/TYPECHANGE = RENAME + DELETE - * 3. from SPLIT/TYPECHANGE to ADD/UNTRACK/IGNORE = ADD + RENAME - * 4. from SPLIT/TYPECHANGE to SPLIT/TYPECHANGE = RENAME + SPLIT - * 5. from OTHER to ADD/UNTRACK/IGNORE = OTHER + COPY - */ - - if (src->status == GIT_DELTA_DELETED) { - - if (delta_is_new_only(tgt)) { - - if (best_match->similarity < opts.rename_threshold) - continue; - - delta_make_rename(tgt, src, best_match->similarity); - - src->flags |= GIT_DIFF_FLAG__TO_DELETE; - num_rewrites++; - } else { - assert(delta_is_split(tgt)); - - if (best_match->similarity < opts.rename_from_rewrite_threshold) - continue; - - memcpy(&swap, &tgt->old_file, sizeof(swap)); - - delta_make_rename(tgt, src, best_match->similarity); - num_rewrites--; - - assert(src->status == GIT_DELTA_DELETED); - memcpy(&src->old_file, &swap, sizeof(src->old_file)); - memset(&src->new_file, 0, sizeof(src->new_file)); - src->new_file.path = src->old_file.path; - src->new_file.flags |= GIT_DIFF_FLAG_VALID_ID; - - num_updates++; - - if (src2tgt[t].similarity > 0 && src2tgt[t].idx > t) { - /* what used to be at src t is now at src s */ - tgt2src[src2tgt[t].idx].idx = s; - } - } - } - - else if (delta_is_split(src)) { - - if (delta_is_new_only(tgt)) { - - if (best_match->similarity < opts.rename_threshold) - continue; - - delta_make_rename(tgt, src, best_match->similarity); - - src->status = (diff->new_src == GIT_ITERATOR_TYPE_WORKDIR) ? - GIT_DELTA_UNTRACKED : GIT_DELTA_ADDED; - src->nfiles = 1; - memset(&src->old_file, 0, sizeof(src->old_file)); - src->old_file.path = src->new_file.path; - src->old_file.flags |= GIT_DIFF_FLAG_VALID_ID; - - src->flags &= ~GIT_DIFF_FLAG__TO_SPLIT; - num_rewrites--; - - num_updates++; - } else { - assert(delta_is_split(src)); - - if (best_match->similarity < opts.rename_from_rewrite_threshold) - continue; - - memcpy(&swap, &tgt->old_file, sizeof(swap)); - - delta_make_rename(tgt, src, best_match->similarity); - num_rewrites--; - num_updates++; - - memcpy(&src->old_file, &swap, sizeof(src->old_file)); - - /* if we've just swapped the new element into the correct - * place, clear the SPLIT flag - */ - if (tgt2src[s].idx == t && - tgt2src[s].similarity > - opts.rename_from_rewrite_threshold) { - src->status = GIT_DELTA_RENAMED; - src->similarity = tgt2src[s].similarity; - tgt2src[s].similarity = 0; - src->flags &= ~GIT_DIFF_FLAG__TO_SPLIT; - num_rewrites--; - } - /* otherwise, if we just overwrote a source, update mapping */ - else if (src2tgt[t].similarity > 0 && src2tgt[t].idx > t) { - /* what used to be at src t is now at src s */ - tgt2src[src2tgt[t].idx].idx = s; - } - - num_updates++; - } - } - - else if (FLAG_SET(&opts, GIT_DIFF_FIND_COPIES)) { - if (tgt2src_copy[t].similarity < opts.copy_threshold) - continue; - - /* always use best possible source for copy */ - best_match = &tgt2src_copy[t]; - src = GIT_VECTOR_GET(&diff->deltas, best_match->idx); - - if (delta_is_split(tgt)) { - error = insert_delete_side_of_split(diff, &diff->deltas, tgt); - if (error < 0) - goto cleanup; - num_rewrites--; - } - - if (!delta_is_split(tgt) && !delta_is_new_only(tgt)) - continue; - - tgt->status = GIT_DELTA_COPIED; - tgt->similarity = best_match->similarity; - tgt->nfiles = 2; - memcpy(&tgt->old_file, &src->old_file, sizeof(tgt->old_file)); - tgt->flags &= ~GIT_DIFF_FLAG__TO_SPLIT; - - num_updates++; - } - } - - /* - * Actually split and delete entries as needed - */ - - if (num_rewrites > 0 || num_updates > 0) - error = apply_splits_and_deletes( - diff, diff->deltas.length - num_rewrites, - FLAG_SET(&opts, GIT_DIFF_BREAK_REWRITES) && - !FLAG_SET(&opts, GIT_DIFF_BREAK_REWRITES_FOR_RENAMES_ONLY)); - -cleanup: - git__free(tgt2src); - git__free(src2tgt); - git__free(tgt2src_copy); - - if (sigcache) { - for (t = 0; t < num_deltas * 2; ++t) { - if (sigcache[t] != NULL) - opts.metric->free_signature(sigcache[t], opts.metric->payload); - } - git__free(sigcache); - } - - if (!given_opts || !given_opts->metric) - git__free(opts.metric); - - return error; -} - -#undef FLAG_SET diff --git a/vendor/libgit2/src/diff_xdiff.c b/vendor/libgit2/src/diff_xdiff.c deleted file mode 100644 index e5984f1c95..0000000000 --- a/vendor/libgit2/src/diff_xdiff.c +++ /dev/null @@ -1,241 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#include "common.h" -#include "diff.h" -#include "diff_driver.h" -#include "diff_patch.h" -#include "diff_xdiff.h" - -static int git_xdiff_scan_int(const char **str, int *value) -{ - const char *scan = *str; - int v = 0, digits = 0; - /* find next digit */ - for (scan = *str; *scan && !git__isdigit(*scan); scan++); - /* parse next number */ - for (; git__isdigit(*scan); scan++, digits++) - v = (v * 10) + (*scan - '0'); - *str = scan; - *value = v; - return (digits > 0) ? 0 : -1; -} - -static int git_xdiff_parse_hunk(git_diff_hunk *hunk, const char *header) -{ - /* expect something of the form "@@ -%d[,%d] +%d[,%d] @@" */ - if (*header != '@') - goto fail; - if (git_xdiff_scan_int(&header, &hunk->old_start) < 0) - goto fail; - if (*header == ',') { - if (git_xdiff_scan_int(&header, &hunk->old_lines) < 0) - goto fail; - } else - hunk->old_lines = 1; - if (git_xdiff_scan_int(&header, &hunk->new_start) < 0) - goto fail; - if (*header == ',') { - if (git_xdiff_scan_int(&header, &hunk->new_lines) < 0) - goto fail; - } else - hunk->new_lines = 1; - if (hunk->old_start < 0 || hunk->new_start < 0) - goto fail; - - return 0; - -fail: - giterr_set(GITERR_INVALID, "Malformed hunk header from xdiff"); - return -1; -} - -typedef struct { - git_xdiff_output *xo; - git_patch *patch; - git_diff_hunk hunk; - int old_lineno, new_lineno; - mmfile_t xd_old_data, xd_new_data; -} git_xdiff_info; - -static int diff_update_lines( - git_xdiff_info *info, - git_diff_line *line, - const char *content, - size_t content_len) -{ - const char *scan = content, *scan_end = content + content_len; - - for (line->num_lines = 0; scan < scan_end; ++scan) - if (*scan == '\n') - ++line->num_lines; - - line->content = content; - line->content_len = content_len; - - /* expect " "/"-"/"+", then data */ - switch (line->origin) { - case GIT_DIFF_LINE_ADDITION: - case GIT_DIFF_LINE_DEL_EOFNL: - line->old_lineno = -1; - line->new_lineno = info->new_lineno; - info->new_lineno += (int)line->num_lines; - break; - case GIT_DIFF_LINE_DELETION: - case GIT_DIFF_LINE_ADD_EOFNL: - line->old_lineno = info->old_lineno; - line->new_lineno = -1; - info->old_lineno += (int)line->num_lines; - break; - case GIT_DIFF_LINE_CONTEXT: - case GIT_DIFF_LINE_CONTEXT_EOFNL: - line->old_lineno = info->old_lineno; - line->new_lineno = info->new_lineno; - info->old_lineno += (int)line->num_lines; - info->new_lineno += (int)line->num_lines; - break; - default: - giterr_set(GITERR_INVALID, "Unknown diff line origin %02x", - (unsigned int)line->origin); - return -1; - } - - return 0; -} - -static int git_xdiff_cb(void *priv, mmbuffer_t *bufs, int len) -{ - git_xdiff_info *info = priv; - git_patch *patch = info->patch; - const git_diff_delta *delta = git_patch_get_delta(patch); - git_diff_output *output = &info->xo->output; - git_diff_line line; - - if (len == 1) { - output->error = git_xdiff_parse_hunk(&info->hunk, bufs[0].ptr); - if (output->error < 0) - return output->error; - - info->hunk.header_len = bufs[0].size; - if (info->hunk.header_len >= sizeof(info->hunk.header)) - info->hunk.header_len = sizeof(info->hunk.header) - 1; - memcpy(info->hunk.header, bufs[0].ptr, info->hunk.header_len); - info->hunk.header[info->hunk.header_len] = '\0'; - - if (output->hunk_cb != NULL && - (output->error = output->hunk_cb( - delta, &info->hunk, output->payload))) - return output->error; - - info->old_lineno = info->hunk.old_start; - info->new_lineno = info->hunk.new_start; - } - - if (len == 2 || len == 3) { - /* expect " "/"-"/"+", then data */ - line.origin = - (*bufs[0].ptr == '+') ? GIT_DIFF_LINE_ADDITION : - (*bufs[0].ptr == '-') ? GIT_DIFF_LINE_DELETION : - GIT_DIFF_LINE_CONTEXT; - - if (line.origin == GIT_DIFF_LINE_ADDITION) - line.content_offset = bufs[1].ptr - info->xd_new_data.ptr; - else if (line.origin == GIT_DIFF_LINE_DELETION) - line.content_offset = bufs[1].ptr - info->xd_old_data.ptr; - else - line.content_offset = -1; - - output->error = diff_update_lines( - info, &line, bufs[1].ptr, bufs[1].size); - - if (!output->error && output->data_cb != NULL) - output->error = output->data_cb( - delta, &info->hunk, &line, output->payload); - } - - if (len == 3 && !output->error) { - /* If we have a '+' and a third buf, then we have added a line - * without a newline and the old code had one, so DEL_EOFNL. - * If we have a '-' and a third buf, then we have removed a line - * with out a newline but added a blank line, so ADD_EOFNL. - */ - line.origin = - (*bufs[0].ptr == '+') ? GIT_DIFF_LINE_DEL_EOFNL : - (*bufs[0].ptr == '-') ? GIT_DIFF_LINE_ADD_EOFNL : - GIT_DIFF_LINE_CONTEXT_EOFNL; - - line.content_offset = -1; - - output->error = diff_update_lines( - info, &line, bufs[2].ptr, bufs[2].size); - - if (!output->error && output->data_cb != NULL) - output->error = output->data_cb( - delta, &info->hunk, &line, output->payload); - } - - return output->error; -} - -static int git_xdiff(git_diff_output *output, git_patch *patch) -{ - git_xdiff_output *xo = (git_xdiff_output *)output; - git_xdiff_info info; - git_diff_find_context_payload findctxt; - - memset(&info, 0, sizeof(info)); - info.patch = patch; - info.xo = xo; - - xo->callback.priv = &info; - - git_diff_find_context_init( - &xo->config.find_func, &findctxt, git_patch__driver(patch)); - xo->config.find_func_priv = &findctxt; - - if (xo->config.find_func != NULL) - xo->config.flags |= XDL_EMIT_FUNCNAMES; - else - xo->config.flags &= ~XDL_EMIT_FUNCNAMES; - - /* TODO: check ofile.opts_flags to see if driver-specific per-file - * updates are needed to xo->params.flags - */ - - git_patch__old_data(&info.xd_old_data.ptr, &info.xd_old_data.size, patch); - git_patch__new_data(&info.xd_new_data.ptr, &info.xd_new_data.size, patch); - - xdl_diff(&info.xd_old_data, &info.xd_new_data, - &xo->params, &xo->config, &xo->callback); - - git_diff_find_context_clear(&findctxt); - - return xo->output.error; -} - -void git_xdiff_init(git_xdiff_output *xo, const git_diff_options *opts) -{ - uint32_t flags = opts ? opts->flags : 0; - - xo->output.diff_cb = git_xdiff; - - xo->config.ctxlen = opts ? opts->context_lines : 3; - xo->config.interhunkctxlen = opts ? opts->interhunk_lines : 0; - - if (flags & GIT_DIFF_IGNORE_WHITESPACE) - xo->params.flags |= XDF_WHITESPACE_FLAGS; - if (flags & GIT_DIFF_IGNORE_WHITESPACE_CHANGE) - xo->params.flags |= XDF_IGNORE_WHITESPACE_CHANGE; - if (flags & GIT_DIFF_IGNORE_WHITESPACE_EOL) - xo->params.flags |= XDF_IGNORE_WHITESPACE_AT_EOL; - - if (flags & GIT_DIFF_PATIENCE) - xo->params.flags |= XDF_PATIENCE_DIFF; - if (flags & GIT_DIFF_MINIMAL) - xo->params.flags |= XDF_NEED_MINIMAL; - - xo->callback.outf = git_xdiff_cb; -} diff --git a/vendor/libgit2/src/diff_xdiff.h b/vendor/libgit2/src/diff_xdiff.h deleted file mode 100644 index c547b00cf0..0000000000 --- a/vendor/libgit2/src/diff_xdiff.h +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_diff_xdiff_h__ -#define INCLUDE_diff_xdiff_h__ - -#include "diff.h" -#include "diff_patch.h" -#include "xdiff/xdiff.h" - -/* A git_xdiff_output is a git_diff_output with extra fields necessary - * to use libxdiff. Calling git_xdiff_init() will set the diff_cb field - * of the output to use xdiff to generate the diffs. - */ -typedef struct { - git_diff_output output; - - xdemitconf_t config; - xpparam_t params; - xdemitcb_t callback; -} git_xdiff_output; - -void git_xdiff_init(git_xdiff_output *xo, const git_diff_options *opts); - -#endif diff --git a/vendor/libgit2/src/errors.c b/vendor/libgit2/src/errors.c deleted file mode 100644 index 7a26005869..0000000000 --- a/vendor/libgit2/src/errors.c +++ /dev/null @@ -1,176 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#include "common.h" -#include "global.h" -#include "posix.h" -#include "buffer.h" - -/******************************************** - * New error handling - ********************************************/ - -static git_error g_git_oom_error = { - "Out of memory", - GITERR_NOMEMORY -}; - -static void set_error(int error_class, char *string) -{ - git_error *error = &GIT_GLOBAL->error_t; - - if (error->message != string) - git__free(error->message); - - error->message = string; - error->klass = error_class; - - GIT_GLOBAL->last_error = error; -} - -void giterr_set_oom(void) -{ - GIT_GLOBAL->last_error = &g_git_oom_error; -} - -void giterr_set(int error_class, const char *string, ...) -{ - git_buf buf = GIT_BUF_INIT; - va_list arglist; -#ifdef GIT_WIN32 - DWORD win32_error_code = (error_class == GITERR_OS) ? GetLastError() : 0; -#endif - int error_code = (error_class == GITERR_OS) ? errno : 0; - - if (string) { - va_start(arglist, string); - git_buf_vprintf(&buf, string, arglist); - va_end(arglist); - - if (error_class == GITERR_OS) - git_buf_PUTS(&buf, ": "); - } - - if (error_class == GITERR_OS) { -#ifdef GIT_WIN32 - char * win32_error = git_win32_get_error_message(win32_error_code); - if (win32_error) { - git_buf_puts(&buf, win32_error); - git__free(win32_error); - - SetLastError(0); - } - else -#endif - if (error_code) - git_buf_puts(&buf, strerror(error_code)); - - if (error_code) - errno = 0; - } - - if (!git_buf_oom(&buf)) - set_error(error_class, git_buf_detach(&buf)); -} - -void giterr_set_str(int error_class, const char *string) -{ - char *message; - - assert(string); - - message = git__strdup(string); - - if (message) - set_error(error_class, message); -} - -int giterr_set_regex(const regex_t *regex, int error_code) -{ - char error_buf[1024]; - - assert(error_code); - - regerror(error_code, regex, error_buf, sizeof(error_buf)); - giterr_set_str(GITERR_REGEX, error_buf); - - if (error_code == REG_NOMATCH) - return GIT_ENOTFOUND; - - return GIT_EINVALIDSPEC; -} - -void giterr_clear(void) -{ - if (GIT_GLOBAL->last_error != NULL) { - set_error(0, NULL); - GIT_GLOBAL->last_error = NULL; - } - - errno = 0; -#ifdef GIT_WIN32 - SetLastError(0); -#endif -} - -int giterr_detach(git_error *cpy) -{ - git_error *error = GIT_GLOBAL->last_error; - - assert(cpy); - - if (!error) - return -1; - - cpy->message = error->message; - cpy->klass = error->klass; - - error->message = NULL; - giterr_clear(); - - return 0; -} - -const git_error *giterr_last(void) -{ - return GIT_GLOBAL->last_error; -} - -int giterr_capture(git_error_state *state, int error_code) -{ - state->error_code = error_code; - if (error_code) - giterr_detach(&state->error_msg); - return error_code; -} - -int giterr_restore(git_error_state *state) -{ - if (state && state->error_code && state->error_msg.message) - set_error(state->error_msg.klass, state->error_msg.message); - else - giterr_clear(); - - return state ? state->error_code : 0; -} - -int giterr_system_last(void) -{ -#ifdef GIT_WIN32 - return GetLastError(); -#else - return errno; -#endif -} - -void giterr_system_set(int code) -{ -#ifdef GIT_WIN32 - SetLastError(code); -#else - errno = code; -#endif -} diff --git a/vendor/libgit2/src/fetch.c b/vendor/libgit2/src/fetch.c deleted file mode 100644 index 4d895752ca..0000000000 --- a/vendor/libgit2/src/fetch.c +++ /dev/null @@ -1,156 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#include "git2/oid.h" -#include "git2/refs.h" -#include "git2/revwalk.h" -#include "git2/transport.h" - -#include "common.h" -#include "remote.h" -#include "refspec.h" -#include "pack.h" -#include "fetch.h" -#include "netops.h" -#include "repository.h" -#include "refs.h" - -static int maybe_want(git_remote *remote, git_remote_head *head, git_odb *odb, git_refspec *tagspec, git_remote_autotag_option_t tagopt) -{ - int match = 0; - - if (!git_reference_is_valid_name(head->name)) - return 0; - - if (tagopt == GIT_REMOTE_DOWNLOAD_TAGS_ALL) { - /* - * If tagopt is --tags, always request tags - * in addition to the remote's refspecs - */ - if (git_refspec_src_matches(tagspec, head->name)) - match = 1; - } - - if (!match && git_remote__matching_refspec(remote, head->name)) - match = 1; - - if (!match) - return 0; - - /* If we have the object, mark it so we don't ask for it */ - if (git_odb_exists(odb, &head->oid)) { - head->local = 1; - } - else - remote->need_pack = 1; - - return git_vector_insert(&remote->refs, head); -} - -static int filter_wants(git_remote *remote, const git_fetch_options *opts) -{ - git_remote_head **heads; - git_refspec tagspec, head; - int error = 0; - git_odb *odb; - size_t i, heads_len; - git_remote_autotag_option_t tagopt = remote->download_tags; - - if (opts && opts->download_tags != GIT_REMOTE_DOWNLOAD_TAGS_UNSPECIFIED) - tagopt = opts->download_tags; - - git_vector_clear(&remote->refs); - if ((error = git_refspec__parse(&tagspec, GIT_REFSPEC_TAGS, true)) < 0) - return error; - - /* - * The fetch refspec can be NULL, and what this means is that the - * user didn't specify one. This is fine, as it means that we're - * not interested in any particular branch but just the remote's - * HEAD, which will be stored in FETCH_HEAD after the fetch. - */ - if (remote->active_refspecs.length == 0) { - if ((error = git_refspec__parse(&head, "HEAD", true)) < 0) - goto cleanup; - - error = git_refspec__dwim_one(&remote->active_refspecs, &head, &remote->refs); - git_refspec__free(&head); - - if (error < 0) - goto cleanup; - } - - if (git_repository_odb__weakptr(&odb, remote->repo) < 0) - goto cleanup; - - if (git_remote_ls((const git_remote_head ***)&heads, &heads_len, remote) < 0) - goto cleanup; - - for (i = 0; i < heads_len; i++) { - if ((error = maybe_want(remote, heads[i], odb, &tagspec, tagopt)) < 0) - break; - } - -cleanup: - git_refspec__free(&tagspec); - - return error; -} - -/* - * In this first version, we push all our refs in and start sending - * them out. When we get an ACK we hide that commit and continue - * traversing until we're done - */ -int git_fetch_negotiate(git_remote *remote, const git_fetch_options *opts) -{ - git_transport *t = remote->transport; - - remote->need_pack = 0; - - if (filter_wants(remote, opts) < 0) { - giterr_set(GITERR_NET, "Failed to filter the reference list for wants"); - return -1; - } - - /* Don't try to negotiate when we don't want anything */ - if (!remote->need_pack) - return 0; - - /* - * Now we have everything set up so we can start tell the - * server what we want and what we have. - */ - return t->negotiate_fetch(t, - remote->repo, - (const git_remote_head * const *)remote->refs.contents, - remote->refs.length); -} - -int git_fetch_download_pack(git_remote *remote, const git_remote_callbacks *callbacks) -{ - git_transport *t = remote->transport; - git_transfer_progress_cb progress = NULL; - void *payload = NULL; - - if (!remote->need_pack) - return 0; - - if (callbacks) { - progress = callbacks->transfer_progress; - payload = callbacks->payload; - } - - return t->download_pack(t, remote->repo, &remote->stats, progress, payload); -} - -int git_fetch_init_options(git_fetch_options *opts, unsigned int version) -{ - GIT_INIT_STRUCTURE_FROM_TEMPLATE( - opts, version, git_fetch_options, GIT_FETCH_OPTIONS_INIT); - return 0; -} diff --git a/vendor/libgit2/src/fetch.h b/vendor/libgit2/src/fetch.h deleted file mode 100644 index 0412d4e441..0000000000 --- a/vendor/libgit2/src/fetch.h +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_fetch_h__ -#define INCLUDE_fetch_h__ - -#include "netops.h" - -int git_fetch_negotiate(git_remote *remote, const git_fetch_options *opts); - -int git_fetch_download_pack(git_remote *remote, const git_remote_callbacks *callbacks); - -int git_fetch_setup_walk(git_revwalk **out, git_repository *repo); - -#endif diff --git a/vendor/libgit2/src/fetchhead.c b/vendor/libgit2/src/fetchhead.c deleted file mode 100644 index a95ea4ca4e..0000000000 --- a/vendor/libgit2/src/fetchhead.c +++ /dev/null @@ -1,302 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#include "git2/types.h" -#include "git2/oid.h" - -#include "fetchhead.h" -#include "common.h" -#include "buffer.h" -#include "fileops.h" -#include "filebuf.h" -#include "refs.h" -#include "repository.h" - -int git_fetchhead_ref_cmp(const void *a, const void *b) -{ - const git_fetchhead_ref *one = (const git_fetchhead_ref *)a; - const git_fetchhead_ref *two = (const git_fetchhead_ref *)b; - - if (one->is_merge && !two->is_merge) - return -1; - if (two->is_merge && !one->is_merge) - return 1; - - if (one->ref_name && two->ref_name) - return strcmp(one->ref_name, two->ref_name); - else if (one->ref_name) - return -1; - else if (two->ref_name) - return 1; - - return 0; -} - -int git_fetchhead_ref_create( - git_fetchhead_ref **out, - git_oid *oid, - unsigned int is_merge, - const char *ref_name, - const char *remote_url) -{ - git_fetchhead_ref *fetchhead_ref; - - assert(out && oid); - - *out = NULL; - - fetchhead_ref = git__malloc(sizeof(git_fetchhead_ref)); - GITERR_CHECK_ALLOC(fetchhead_ref); - - memset(fetchhead_ref, 0x0, sizeof(git_fetchhead_ref)); - - git_oid_cpy(&fetchhead_ref->oid, oid); - fetchhead_ref->is_merge = is_merge; - - if (ref_name) - fetchhead_ref->ref_name = git__strdup(ref_name); - - if (remote_url) - fetchhead_ref->remote_url = git__strdup(remote_url); - - *out = fetchhead_ref; - - return 0; -} - -static int fetchhead_ref_write( - git_filebuf *file, - git_fetchhead_ref *fetchhead_ref) -{ - char oid[GIT_OID_HEXSZ + 1]; - const char *type, *name; - int head = 0; - - assert(file && fetchhead_ref); - - git_oid_fmt(oid, &fetchhead_ref->oid); - oid[GIT_OID_HEXSZ] = '\0'; - - if (git__prefixcmp(fetchhead_ref->ref_name, GIT_REFS_HEADS_DIR) == 0) { - type = "branch "; - name = fetchhead_ref->ref_name + strlen(GIT_REFS_HEADS_DIR); - } else if(git__prefixcmp(fetchhead_ref->ref_name, - GIT_REFS_TAGS_DIR) == 0) { - type = "tag "; - name = fetchhead_ref->ref_name + strlen(GIT_REFS_TAGS_DIR); - } else if (!git__strcmp(fetchhead_ref->ref_name, GIT_HEAD_FILE)) { - head = 1; - } else { - type = ""; - name = fetchhead_ref->ref_name; - } - - if (head) - return git_filebuf_printf(file, "%s\t\t%s\n", oid, fetchhead_ref->remote_url); - - return git_filebuf_printf(file, "%s\t%s\t%s'%s' of %s\n", - oid, - (fetchhead_ref->is_merge) ? "" : "not-for-merge", - type, - name, - fetchhead_ref->remote_url); -} - -int git_fetchhead_write(git_repository *repo, git_vector *fetchhead_refs) -{ - git_filebuf file = GIT_FILEBUF_INIT; - git_buf path = GIT_BUF_INIT; - unsigned int i; - git_fetchhead_ref *fetchhead_ref; - - assert(repo && fetchhead_refs); - - if (git_buf_joinpath(&path, repo->path_repository, GIT_FETCH_HEAD_FILE) < 0) - return -1; - - if (git_filebuf_open(&file, path.ptr, GIT_FILEBUF_FORCE, GIT_REFS_FILE_MODE) < 0) { - git_buf_free(&path); - return -1; - } - - git_buf_free(&path); - - git_vector_sort(fetchhead_refs); - - git_vector_foreach(fetchhead_refs, i, fetchhead_ref) - fetchhead_ref_write(&file, fetchhead_ref); - - return git_filebuf_commit(&file); -} - -static int fetchhead_ref_parse( - git_oid *oid, - unsigned int *is_merge, - git_buf *ref_name, - const char **remote_url, - char *line, - size_t line_num) -{ - char *oid_str, *is_merge_str, *desc, *name = NULL; - const char *type = NULL; - int error = 0; - - *remote_url = NULL; - - if (!*line) { - giterr_set(GITERR_FETCHHEAD, - "Empty line in FETCH_HEAD line %d", line_num); - return -1; - } - - /* Compat with old git clients that wrote FETCH_HEAD like a loose ref. */ - if ((oid_str = git__strsep(&line, "\t")) == NULL) { - oid_str = line; - line += strlen(line); - - *is_merge = 1; - } - - if (strlen(oid_str) != GIT_OID_HEXSZ) { - giterr_set(GITERR_FETCHHEAD, - "Invalid object ID in FETCH_HEAD line %d", line_num); - return -1; - } - - if (git_oid_fromstr(oid, oid_str) < 0) { - const git_error *oid_err = giterr_last(); - const char *err_msg = oid_err ? oid_err->message : "Invalid object ID"; - - giterr_set(GITERR_FETCHHEAD, "%s in FETCH_HEAD line %d", - err_msg, line_num); - return -1; - } - - /* Parse new data from newer git clients */ - if (*line) { - if ((is_merge_str = git__strsep(&line, "\t")) == NULL) { - giterr_set(GITERR_FETCHHEAD, - "Invalid description data in FETCH_HEAD line %d", line_num); - return -1; - } - - if (*is_merge_str == '\0') - *is_merge = 1; - else if (strcmp(is_merge_str, "not-for-merge") == 0) - *is_merge = 0; - else { - giterr_set(GITERR_FETCHHEAD, - "Invalid for-merge entry in FETCH_HEAD line %d", line_num); - return -1; - } - - if ((desc = line) == NULL) { - giterr_set(GITERR_FETCHHEAD, - "Invalid description in FETCH_HEAD line %d", line_num); - return -1; - } - - if (git__prefixcmp(desc, "branch '") == 0) { - type = GIT_REFS_HEADS_DIR; - name = desc + 8; - } else if (git__prefixcmp(desc, "tag '") == 0) { - type = GIT_REFS_TAGS_DIR; - name = desc + 5; - } else if (git__prefixcmp(desc, "'") == 0) - name = desc + 1; - - if (name) { - if ((desc = strstr(name, "' ")) == NULL || - git__prefixcmp(desc, "' of ") != 0) { - giterr_set(GITERR_FETCHHEAD, - "Invalid description in FETCH_HEAD line %d", line_num); - return -1; - } - - *desc = '\0'; - desc += 5; - } - - *remote_url = desc; - } - - git_buf_clear(ref_name); - - if (type) - git_buf_join(ref_name, '/', type, name); - else if(name) - git_buf_puts(ref_name, name); - - return error; -} - -int git_repository_fetchhead_foreach(git_repository *repo, - git_repository_fetchhead_foreach_cb cb, - void *payload) -{ - git_buf path = GIT_BUF_INIT, file = GIT_BUF_INIT, name = GIT_BUF_INIT; - const char *ref_name; - git_oid oid; - const char *remote_url; - unsigned int is_merge = 0; - char *buffer, *line; - size_t line_num = 0; - int error = 0; - - assert(repo && cb); - - if (git_buf_joinpath(&path, repo->path_repository, GIT_FETCH_HEAD_FILE) < 0) - return -1; - - if ((error = git_futils_readbuffer(&file, git_buf_cstr(&path))) < 0) - goto done; - - buffer = file.ptr; - - while ((line = git__strsep(&buffer, "\n")) != NULL) { - ++line_num; - - if ((error = fetchhead_ref_parse( - &oid, &is_merge, &name, &remote_url, line, line_num)) < 0) - goto done; - - if (git_buf_len(&name) > 0) - ref_name = git_buf_cstr(&name); - else - ref_name = NULL; - - error = cb(ref_name, remote_url, &oid, is_merge, payload); - if (error) { - giterr_set_after_callback(error); - goto done; - } - } - - if (*buffer) { - giterr_set(GITERR_FETCHHEAD, "No EOL at line %d", line_num+1); - error = -1; - goto done; - } - -done: - git_buf_free(&file); - git_buf_free(&path); - git_buf_free(&name); - - return error; -} - -void git_fetchhead_ref_free(git_fetchhead_ref *fetchhead_ref) -{ - if (fetchhead_ref == NULL) - return; - - git__free(fetchhead_ref->remote_url); - git__free(fetchhead_ref->ref_name); - git__free(fetchhead_ref); -} - diff --git a/vendor/libgit2/src/fetchhead.h b/vendor/libgit2/src/fetchhead.h deleted file mode 100644 index b03bd0f745..0000000000 --- a/vendor/libgit2/src/fetchhead.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_fetchhead_h__ -#define INCLUDE_fetchhead_h__ - -#include "vector.h" - -typedef struct git_fetchhead_ref { - git_oid oid; - unsigned int is_merge; - char *ref_name; - char *remote_url; -} git_fetchhead_ref; - -int git_fetchhead_ref_create( - git_fetchhead_ref **fetchhead_ref_out, - git_oid *oid, - unsigned int is_merge, - const char *ref_name, - const char *remote_url); - -int git_fetchhead_ref_cmp(const void *a, const void *b); - -int git_fetchhead_write(git_repository *repo, git_vector *fetchhead_refs); - -void git_fetchhead_ref_free(git_fetchhead_ref *fetchhead_ref); - -#endif diff --git a/vendor/libgit2/src/filebuf.c b/vendor/libgit2/src/filebuf.c deleted file mode 100644 index 838f4b4d26..0000000000 --- a/vendor/libgit2/src/filebuf.c +++ /dev/null @@ -1,491 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#include "common.h" -#include "filebuf.h" -#include "fileops.h" - -static const size_t WRITE_BUFFER_SIZE = (4096 * 2); - -enum buferr_t { - BUFERR_OK = 0, - BUFERR_WRITE, - BUFERR_ZLIB, - BUFERR_MEM -}; - -#define ENSURE_BUF_OK(buf) if ((buf)->last_error != BUFERR_OK) { return -1; } - -static int verify_last_error(git_filebuf *file) -{ - switch (file->last_error) { - case BUFERR_WRITE: - giterr_set(GITERR_OS, "Failed to write out file"); - return -1; - - case BUFERR_MEM: - giterr_set_oom(); - return -1; - - case BUFERR_ZLIB: - giterr_set(GITERR_ZLIB, - "Buffer error when writing out ZLib data"); - return -1; - - default: - return 0; - } -} - -static int lock_file(git_filebuf *file, int flags, mode_t mode) -{ - if (git_path_exists(file->path_lock) == true) { - if (flags & GIT_FILEBUF_FORCE) - p_unlink(file->path_lock); - else { - giterr_clear(); /* actual OS error code just confuses */ - giterr_set(GITERR_OS, - "Failed to lock file '%s' for writing", file->path_lock); - return GIT_ELOCKED; - } - } - - /* create path to the file buffer is required */ - if (flags & GIT_FILEBUF_FORCE) { - /* XXX: Should dirmode here be configurable? Or is 0777 always fine? */ - file->fd = git_futils_creat_locked_withpath(file->path_lock, 0777, mode); - } else { - file->fd = git_futils_creat_locked(file->path_lock, mode); - } - - if (file->fd < 0) - return file->fd; - - file->fd_is_open = true; - - if ((flags & GIT_FILEBUF_APPEND) && git_path_exists(file->path_original) == true) { - git_file source; - char buffer[FILEIO_BUFSIZE]; - ssize_t read_bytes; - - source = p_open(file->path_original, O_RDONLY); - if (source < 0) { - giterr_set(GITERR_OS, - "Failed to open file '%s' for reading", - file->path_original); - return -1; - } - - while ((read_bytes = p_read(source, buffer, sizeof(buffer))) > 0) { - p_write(file->fd, buffer, read_bytes); - if (file->compute_digest) - git_hash_update(&file->digest, buffer, read_bytes); - } - - p_close(source); - - if (read_bytes < 0) { - giterr_set(GITERR_OS, "Failed to read file '%s'", file->path_original); - return -1; - } - } - - return 0; -} - -void git_filebuf_cleanup(git_filebuf *file) -{ - if (file->fd_is_open && file->fd >= 0) - p_close(file->fd); - - if (file->created_lock && !file->did_rename && file->path_lock && git_path_exists(file->path_lock)) - p_unlink(file->path_lock); - - if (file->compute_digest) { - git_hash_ctx_cleanup(&file->digest); - file->compute_digest = 0; - } - - if (file->buffer) - git__free(file->buffer); - - /* use the presence of z_buf to decide if we need to deflateEnd */ - if (file->z_buf) { - git__free(file->z_buf); - deflateEnd(&file->zs); - } - - if (file->path_original) - git__free(file->path_original); - if (file->path_lock) - git__free(file->path_lock); - - memset(file, 0x0, sizeof(git_filebuf)); - file->fd = -1; -} - -GIT_INLINE(int) flush_buffer(git_filebuf *file) -{ - int result = file->write(file, file->buffer, file->buf_pos); - file->buf_pos = 0; - return result; -} - -int git_filebuf_flush(git_filebuf *file) -{ - return flush_buffer(file); -} - -static int write_normal(git_filebuf *file, void *source, size_t len) -{ - if (len > 0) { - if (p_write(file->fd, (void *)source, len) < 0) { - file->last_error = BUFERR_WRITE; - return -1; - } - - if (file->compute_digest) - git_hash_update(&file->digest, source, len); - } - - return 0; -} - -static int write_deflate(git_filebuf *file, void *source, size_t len) -{ - z_stream *zs = &file->zs; - - if (len > 0 || file->flush_mode == Z_FINISH) { - zs->next_in = source; - zs->avail_in = (uInt)len; - - do { - size_t have; - - zs->next_out = file->z_buf; - zs->avail_out = (uInt)file->buf_size; - - if (deflate(zs, file->flush_mode) == Z_STREAM_ERROR) { - file->last_error = BUFERR_ZLIB; - return -1; - } - - have = file->buf_size - (size_t)zs->avail_out; - - if (p_write(file->fd, file->z_buf, have) < 0) { - file->last_error = BUFERR_WRITE; - return -1; - } - - } while (zs->avail_out == 0); - - assert(zs->avail_in == 0); - - if (file->compute_digest) - git_hash_update(&file->digest, source, len); - } - - return 0; -} - -int git_filebuf_open(git_filebuf *file, const char *path, int flags, mode_t mode) -{ - int compression, error = -1; - size_t path_len, alloc_len; - - /* opening an already open buffer is a programming error; - * assert that this never happens instead of returning - * an error code */ - assert(file && path && file->buffer == NULL); - - memset(file, 0x0, sizeof(git_filebuf)); - - if (flags & GIT_FILEBUF_DO_NOT_BUFFER) - file->do_not_buffer = true; - - file->buf_size = WRITE_BUFFER_SIZE; - file->buf_pos = 0; - file->fd = -1; - file->last_error = BUFERR_OK; - - /* Allocate the main cache buffer */ - if (!file->do_not_buffer) { - file->buffer = git__malloc(file->buf_size); - GITERR_CHECK_ALLOC(file->buffer); - } - - /* If we are hashing on-write, allocate a new hash context */ - if (flags & GIT_FILEBUF_HASH_CONTENTS) { - file->compute_digest = 1; - - if (git_hash_ctx_init(&file->digest) < 0) - goto cleanup; - } - - compression = flags >> GIT_FILEBUF_DEFLATE_SHIFT; - - /* If we are deflating on-write, */ - if (compression != 0) { - /* Initialize the ZLib stream */ - if (deflateInit(&file->zs, compression) != Z_OK) { - giterr_set(GITERR_ZLIB, "Failed to initialize zlib"); - goto cleanup; - } - - /* Allocate the Zlib cache buffer */ - file->z_buf = git__malloc(file->buf_size); - GITERR_CHECK_ALLOC(file->z_buf); - - /* Never flush */ - file->flush_mode = Z_NO_FLUSH; - file->write = &write_deflate; - } else { - file->write = &write_normal; - } - - /* If we are writing to a temp file */ - if (flags & GIT_FILEBUF_TEMPORARY) { - git_buf tmp_path = GIT_BUF_INIT; - - /* Open the file as temporary for locking */ - file->fd = git_futils_mktmp(&tmp_path, path, mode); - - if (file->fd < 0) { - git_buf_free(&tmp_path); - goto cleanup; - } - file->fd_is_open = true; - file->created_lock = true; - - /* No original path */ - file->path_original = NULL; - file->path_lock = git_buf_detach(&tmp_path); - GITERR_CHECK_ALLOC(file->path_lock); - } else { - path_len = strlen(path); - - /* Save the original path of the file */ - file->path_original = git__strdup(path); - GITERR_CHECK_ALLOC(file->path_original); - - /* create the locking path by appending ".lock" to the original */ - GITERR_CHECK_ALLOC_ADD(&alloc_len, path_len, GIT_FILELOCK_EXTLENGTH); - file->path_lock = git__malloc(alloc_len); - GITERR_CHECK_ALLOC(file->path_lock); - - memcpy(file->path_lock, file->path_original, path_len); - memcpy(file->path_lock + path_len, GIT_FILELOCK_EXTENSION, GIT_FILELOCK_EXTLENGTH); - - /* open the file for locking */ - if ((error = lock_file(file, flags, mode)) < 0) - goto cleanup; - - file->created_lock = true; - } - - return 0; - -cleanup: - git_filebuf_cleanup(file); - return error; -} - -int git_filebuf_hash(git_oid *oid, git_filebuf *file) -{ - assert(oid && file && file->compute_digest); - - flush_buffer(file); - - if (verify_last_error(file) < 0) - return -1; - - git_hash_final(oid, &file->digest); - git_hash_ctx_cleanup(&file->digest); - file->compute_digest = 0; - - return 0; -} - -int git_filebuf_commit_at(git_filebuf *file, const char *path) -{ - git__free(file->path_original); - file->path_original = git__strdup(path); - GITERR_CHECK_ALLOC(file->path_original); - - return git_filebuf_commit(file); -} - -int git_filebuf_commit(git_filebuf *file) -{ - /* temporary files cannot be committed */ - assert(file && file->path_original); - - file->flush_mode = Z_FINISH; - flush_buffer(file); - - if (verify_last_error(file) < 0) - goto on_error; - - file->fd_is_open = false; - - if (p_close(file->fd) < 0) { - giterr_set(GITERR_OS, "Failed to close file at '%s'", file->path_lock); - goto on_error; - } - - file->fd = -1; - - if (p_rename(file->path_lock, file->path_original) < 0) { - giterr_set(GITERR_OS, "Failed to rename lockfile to '%s'", file->path_original); - goto on_error; - } - - file->did_rename = true; - - git_filebuf_cleanup(file); - return 0; - -on_error: - git_filebuf_cleanup(file); - return -1; -} - -GIT_INLINE(void) add_to_cache(git_filebuf *file, const void *buf, size_t len) -{ - memcpy(file->buffer + file->buf_pos, buf, len); - file->buf_pos += len; -} - -int git_filebuf_write(git_filebuf *file, const void *buff, size_t len) -{ - const unsigned char *buf = buff; - - ENSURE_BUF_OK(file); - - if (file->do_not_buffer) - return file->write(file, (void *)buff, len); - - for (;;) { - size_t space_left = file->buf_size - file->buf_pos; - - /* cache if it's small */ - if (space_left > len) { - add_to_cache(file, buf, len); - return 0; - } - - add_to_cache(file, buf, space_left); - if (flush_buffer(file) < 0) - return -1; - - len -= space_left; - buf += space_left; - } -} - -int git_filebuf_reserve(git_filebuf *file, void **buffer, size_t len) -{ - size_t space_left = file->buf_size - file->buf_pos; - - *buffer = NULL; - - ENSURE_BUF_OK(file); - - if (len > file->buf_size) { - file->last_error = BUFERR_MEM; - return -1; - } - - if (space_left <= len) { - if (flush_buffer(file) < 0) - return -1; - } - - *buffer = (file->buffer + file->buf_pos); - file->buf_pos += len; - - return 0; -} - -int git_filebuf_printf(git_filebuf *file, const char *format, ...) -{ - va_list arglist; - size_t space_left, len, alloclen; - int written, res; - char *tmp_buffer; - - ENSURE_BUF_OK(file); - - space_left = file->buf_size - file->buf_pos; - - do { - va_start(arglist, format); - written = p_vsnprintf((char *)file->buffer + file->buf_pos, space_left, format, arglist); - va_end(arglist); - - if (written < 0) { - file->last_error = BUFERR_MEM; - return -1; - } - - len = written; - if (len + 1 <= space_left) { - file->buf_pos += len; - return 0; - } - - if (flush_buffer(file) < 0) - return -1; - - space_left = file->buf_size - file->buf_pos; - - } while (len + 1 <= space_left); - - if (GIT_ADD_SIZET_OVERFLOW(&alloclen, len, 1) || - !(tmp_buffer = git__malloc(alloclen))) { - file->last_error = BUFERR_MEM; - return -1; - } - - va_start(arglist, format); - written = p_vsnprintf(tmp_buffer, len + 1, format, arglist); - va_end(arglist); - - if (written < 0) { - git__free(tmp_buffer); - file->last_error = BUFERR_MEM; - return -1; - } - - res = git_filebuf_write(file, tmp_buffer, len); - git__free(tmp_buffer); - - return res; -} - -int git_filebuf_stats(time_t *mtime, size_t *size, git_filebuf *file) -{ - int res; - struct stat st; - - if (file->fd_is_open) - res = p_fstat(file->fd, &st); - else - res = p_stat(file->path_original, &st); - - if (res < 0) { - giterr_set(GITERR_OS, "Could not get stat info for '%s'", - file->path_original); - return res; - } - - if (mtime) - *mtime = st.st_mtime; - if (size) - *size = (size_t)st.st_size; - - return 0; -} diff --git a/vendor/libgit2/src/filebuf.h b/vendor/libgit2/src/filebuf.h deleted file mode 100644 index f4d255b0a4..0000000000 --- a/vendor/libgit2/src/filebuf.h +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_filebuf_h__ -#define INCLUDE_filebuf_h__ - -#include "fileops.h" -#include "hash.h" -#include - -#ifdef GIT_THREADS -# define GIT_FILEBUF_THREADS -#endif - -#define GIT_FILEBUF_HASH_CONTENTS (1 << 0) -#define GIT_FILEBUF_APPEND (1 << 2) -#define GIT_FILEBUF_FORCE (1 << 3) -#define GIT_FILEBUF_TEMPORARY (1 << 4) -#define GIT_FILEBUF_DO_NOT_BUFFER (1 << 5) -#define GIT_FILEBUF_DEFLATE_SHIFT (6) - -#define GIT_FILELOCK_EXTENSION ".lock\0" -#define GIT_FILELOCK_EXTLENGTH 6 - -typedef struct git_filebuf git_filebuf; -struct git_filebuf { - char *path_original; - char *path_lock; - - int (*write)(git_filebuf *file, void *source, size_t len); - - bool compute_digest; - git_hash_ctx digest; - - unsigned char *buffer; - unsigned char *z_buf; - - z_stream zs; - int flush_mode; - - size_t buf_size, buf_pos; - git_file fd; - bool fd_is_open; - bool created_lock; - bool did_rename; - bool do_not_buffer; - int last_error; -}; - -#define GIT_FILEBUF_INIT {0} - -/* - * The git_filebuf object lifecycle is: - * - Allocate git_filebuf, preferably using GIT_FILEBUF_INIT. - * - * - Call git_filebuf_open() to initialize the filebuf for use. - * - * - Make as many calls to git_filebuf_write(), git_filebuf_printf(), - * git_filebuf_reserve() as you like. The error codes for these - * functions don't need to be checked. They are stored internally - * by the file buffer. - * - * - While you are writing, you may call git_filebuf_hash() to get - * the hash of all you have written so far. This function will - * fail if any of the previous writes to the buffer failed. - * - * - To close the git_filebuf, you may call git_filebuf_commit() or - * git_filebuf_commit_at() to save the file, or - * git_filebuf_cleanup() to abandon the file. All of these will - * free the git_filebuf object. Likewise, all of these will fail - * if any of the previous writes to the buffer failed, and set - * an error code accordingly. - */ -int git_filebuf_write(git_filebuf *lock, const void *buff, size_t len); -int git_filebuf_reserve(git_filebuf *file, void **buff, size_t len); -int git_filebuf_printf(git_filebuf *file, const char *format, ...) GIT_FORMAT_PRINTF(2, 3); - -int git_filebuf_open(git_filebuf *lock, const char *path, int flags, mode_t mode); -int git_filebuf_commit(git_filebuf *lock); -int git_filebuf_commit_at(git_filebuf *lock, const char *path); -void git_filebuf_cleanup(git_filebuf *lock); -int git_filebuf_hash(git_oid *oid, git_filebuf *file); -int git_filebuf_flush(git_filebuf *file); -int git_filebuf_stats(time_t *mtime, size_t *size, git_filebuf *file); - -#endif diff --git a/vendor/libgit2/src/fileops.c b/vendor/libgit2/src/fileops.c deleted file mode 100644 index b7b55159f0..0000000000 --- a/vendor/libgit2/src/fileops.c +++ /dev/null @@ -1,971 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#include "common.h" -#include "fileops.h" -#include "global.h" -#include "strmap.h" -#include -#if GIT_WIN32 -#include "win32/findfile.h" -#endif - -GIT__USE_STRMAP - -int git_futils_mkpath2file(const char *file_path, const mode_t mode) -{ - return git_futils_mkdir( - file_path, NULL, mode, - GIT_MKDIR_PATH | GIT_MKDIR_SKIP_LAST | GIT_MKDIR_VERIFY_DIR); -} - -int git_futils_mktmp(git_buf *path_out, const char *filename, mode_t mode) -{ - int fd; - mode_t mask; - - p_umask(mask = p_umask(0)); - - git_buf_sets(path_out, filename); - git_buf_puts(path_out, "_git2_XXXXXX"); - - if (git_buf_oom(path_out)) - return -1; - - if ((fd = p_mkstemp(path_out->ptr)) < 0) { - giterr_set(GITERR_OS, - "Failed to create temporary file '%s'", path_out->ptr); - return -1; - } - - if (p_chmod(path_out->ptr, (mode & ~mask))) { - giterr_set(GITERR_OS, - "Failed to set permissions on file '%s'", path_out->ptr); - return -1; - } - - return fd; -} - -int git_futils_creat_withpath(const char *path, const mode_t dirmode, const mode_t mode) -{ - int fd; - - if (git_futils_mkpath2file(path, dirmode) < 0) - return -1; - - fd = p_creat(path, mode); - if (fd < 0) { - giterr_set(GITERR_OS, "Failed to create file '%s'", path); - return -1; - } - - return fd; -} - -int git_futils_creat_locked(const char *path, const mode_t mode) -{ - int fd = p_open(path, O_WRONLY | O_CREAT | O_TRUNC | - O_EXCL | O_BINARY | O_CLOEXEC, mode); - - if (fd < 0) { - giterr_set(GITERR_OS, "Failed to create locked file '%s'", path); - return errno == EEXIST ? GIT_ELOCKED : -1; - } - - return fd; -} - -int git_futils_creat_locked_withpath(const char *path, const mode_t dirmode, const mode_t mode) -{ - if (git_futils_mkpath2file(path, dirmode) < 0) - return -1; - - return git_futils_creat_locked(path, mode); -} - -int git_futils_open_ro(const char *path) -{ - int fd = p_open(path, O_RDONLY); - if (fd < 0) - return git_path_set_error(errno, path, "open"); - return fd; -} - -git_off_t git_futils_filesize(git_file fd) -{ - struct stat sb; - - if (p_fstat(fd, &sb)) { - giterr_set(GITERR_OS, "Failed to stat file descriptor"); - return -1; - } - - return sb.st_size; -} - -mode_t git_futils_canonical_mode(mode_t raw_mode) -{ - if (S_ISREG(raw_mode)) - return S_IFREG | GIT_PERMS_CANONICAL(raw_mode); - else if (S_ISLNK(raw_mode)) - return S_IFLNK; - else if (S_ISGITLINK(raw_mode)) - return S_IFGITLINK; - else if (S_ISDIR(raw_mode)) - return S_IFDIR; - else - return 0; -} - -int git_futils_readbuffer_fd(git_buf *buf, git_file fd, size_t len) -{ - ssize_t read_size = 0; - size_t alloc_len; - - git_buf_clear(buf); - - if (!git__is_ssizet(len)) { - giterr_set(GITERR_INVALID, "Read too large."); - return -1; - } - - GITERR_CHECK_ALLOC_ADD(&alloc_len, len, 1); - if (git_buf_grow(buf, alloc_len) < 0) - return -1; - - /* p_read loops internally to read len bytes */ - read_size = p_read(fd, buf->ptr, len); - - if (read_size != (ssize_t)len) { - giterr_set(GITERR_OS, "Failed to read descriptor"); - git_buf_free(buf); - return -1; - } - - buf->ptr[read_size] = '\0'; - buf->size = read_size; - - return 0; -} - -int git_futils_readbuffer_updated( - git_buf *buf, const char *path, time_t *mtime, size_t *size, int *updated) -{ - git_file fd; - struct stat st; - bool changed = false; - - assert(buf && path && *path); - - if (updated != NULL) - *updated = 0; - - if (p_stat(path, &st) < 0) - return git_path_set_error(errno, path, "stat"); - - - if (S_ISDIR(st.st_mode)) { - giterr_set(GITERR_INVALID, "requested file is a directory"); - return GIT_ENOTFOUND; - } - - if (!git__is_sizet(st.st_size+1)) { - giterr_set(GITERR_OS, "Invalid regular file stat for '%s'", path); - return -1; - } - - /* - * If we were given a time and/or a size, we only want to read the file - * if it has been modified. - */ - if (size && *size != (size_t)st.st_size) - changed = true; - if (mtime && *mtime != (time_t)st.st_mtime) - changed = true; - if (!size && !mtime) - changed = true; - - if (!changed) { - return 0; - } - - if (mtime != NULL) - *mtime = st.st_mtime; - if (size != NULL) - *size = (size_t)st.st_size; - - if ((fd = git_futils_open_ro(path)) < 0) - return fd; - - if (git_futils_readbuffer_fd(buf, fd, (size_t)st.st_size) < 0) { - p_close(fd); - return -1; - } - - p_close(fd); - - if (updated != NULL) - *updated = 1; - - return 0; -} - -int git_futils_readbuffer(git_buf *buf, const char *path) -{ - return git_futils_readbuffer_updated(buf, path, NULL, NULL, NULL); -} - -int git_futils_writebuffer( - const git_buf *buf, const char *path, int flags, mode_t mode) -{ - int fd, error = 0; - - if (flags <= 0) - flags = O_CREAT | O_TRUNC | O_WRONLY; - if (!mode) - mode = GIT_FILEMODE_BLOB; - - if ((fd = p_open(path, flags, mode)) < 0) { - giterr_set(GITERR_OS, "Could not open '%s' for writing", path); - return fd; - } - - if ((error = p_write(fd, git_buf_cstr(buf), git_buf_len(buf))) < 0) { - giterr_set(GITERR_OS, "Could not write to '%s'", path); - (void)p_close(fd); - return error; - } - - if ((error = p_close(fd)) < 0) - giterr_set(GITERR_OS, "Error while closing '%s'", path); - - return error; -} - -int git_futils_mv_withpath(const char *from, const char *to, const mode_t dirmode) -{ - if (git_futils_mkpath2file(to, dirmode) < 0) - return -1; - - if (p_rename(from, to) < 0) { - giterr_set(GITERR_OS, "Failed to rename '%s' to '%s'", from, to); - return -1; - } - - return 0; -} - -int git_futils_mmap_ro(git_map *out, git_file fd, git_off_t begin, size_t len) -{ - return p_mmap(out, len, GIT_PROT_READ, GIT_MAP_SHARED, fd, begin); -} - -int git_futils_mmap_ro_file(git_map *out, const char *path) -{ - git_file fd = git_futils_open_ro(path); - git_off_t len; - int result; - - if (fd < 0) - return fd; - - len = git_futils_filesize(fd); - if (!git__is_sizet(len)) { - giterr_set(GITERR_OS, "File `%s` too large to mmap", path); - return -1; - } - - result = git_futils_mmap_ro(out, fd, 0, (size_t)len); - p_close(fd); - return result; -} - -void git_futils_mmap_free(git_map *out) -{ - p_munmap(out); -} - -GIT_INLINE(int) validate_existing( - const char *make_path, - struct stat *st, - mode_t mode, - uint32_t flags, - struct git_futils_mkdir_perfdata *perfdata) -{ - if ((S_ISREG(st->st_mode) && (flags & GIT_MKDIR_REMOVE_FILES)) || - (S_ISLNK(st->st_mode) && (flags & GIT_MKDIR_REMOVE_SYMLINKS))) { - if (p_unlink(make_path) < 0) { - giterr_set(GITERR_OS, "Failed to remove %s '%s'", - S_ISLNK(st->st_mode) ? "symlink" : "file", make_path); - return GIT_EEXISTS; - } - - perfdata->mkdir_calls++; - - if (p_mkdir(make_path, mode) < 0) { - giterr_set(GITERR_OS, "Failed to make directory '%s'", make_path); - return GIT_EEXISTS; - } - } - - else if (S_ISLNK(st->st_mode)) { - /* Re-stat the target, make sure it's a directory */ - perfdata->stat_calls++; - - if (p_stat(make_path, st) < 0) { - giterr_set(GITERR_OS, "Failed to make directory '%s'", make_path); - return GIT_EEXISTS; - } - } - - else if (!S_ISDIR(st->st_mode)) { - giterr_set(GITERR_FILESYSTEM, - "Failed to make directory '%s': directory exists", make_path); - return GIT_EEXISTS; - } - - return 0; -} - -int git_futils_mkdir_ext( - const char *path, - const char *base, - mode_t mode, - uint32_t flags, - struct git_futils_mkdir_options *opts) -{ - int error = -1; - git_buf make_path = GIT_BUF_INIT; - ssize_t root = 0, min_root_len, root_len; - char lastch = '/', *tail; - struct stat st; - - /* build path and find "root" where we should start calling mkdir */ - if (git_path_join_unrooted(&make_path, path, base, &root) < 0) - return -1; - - if (make_path.size == 0) { - giterr_set(GITERR_OS, "Attempt to create empty path"); - goto done; - } - - /* Trim trailing slashes (except the root) */ - if ((root_len = git_path_root(make_path.ptr)) < 0) - root_len = 0; - else - root_len++; - - while (make_path.size > (size_t)root_len && - make_path.ptr[make_path.size - 1] == '/') - make_path.ptr[--make_path.size] = '\0'; - - /* if we are not supposed to made the last element, truncate it */ - if ((flags & GIT_MKDIR_SKIP_LAST2) != 0) { - git_path_dirname_r(&make_path, make_path.ptr); - flags |= GIT_MKDIR_SKIP_LAST; - } - if ((flags & GIT_MKDIR_SKIP_LAST) != 0) { - git_path_dirname_r(&make_path, make_path.ptr); - } - - /* We were either given the root path (or trimmed it to - * the root), we don't have anything to do. - */ - if (make_path.size <= (size_t)root_len) { - error = 0; - goto done; - } - - /* if we are not supposed to make the whole path, reset root */ - if ((flags & GIT_MKDIR_PATH) == 0) - root = git_buf_rfind(&make_path, '/'); - - /* advance root past drive name or network mount prefix */ - min_root_len = git_path_root(make_path.ptr); - if (root < min_root_len) - root = min_root_len; - while (root >= 0 && make_path.ptr[root] == '/') - ++root; - - /* clip root to make_path length */ - if (root > (ssize_t)make_path.size) - root = (ssize_t)make_path.size; /* i.e. NUL byte of string */ - if (root < 0) - root = 0; - - /* walk down tail of path making each directory */ - for (tail = &make_path.ptr[root]; *tail; *tail = lastch) { - bool mkdir_attempted = false; - - /* advance tail to include next path component */ - while (*tail == '/') - tail++; - while (*tail && *tail != '/') - tail++; - - /* truncate path at next component */ - lastch = *tail; - *tail = '\0'; - st.st_mode = 0; - - if (opts->dir_map && git_strmap_exists(opts->dir_map, make_path.ptr)) - continue; - - /* See what's going on with this path component */ - opts->perfdata.stat_calls++; - -retry_lstat: - if (p_lstat(make_path.ptr, &st) < 0) { - if (mkdir_attempted || errno != ENOENT) { - giterr_set(GITERR_OS, "Cannot access component in path '%s'", make_path.ptr); - error = -1; - goto done; - } - - giterr_clear(); - opts->perfdata.mkdir_calls++; - mkdir_attempted = true; - if (p_mkdir(make_path.ptr, mode) < 0) { - if (errno == EEXIST) - goto retry_lstat; - giterr_set(GITERR_OS, "Failed to make directory '%s'", make_path.ptr); - error = -1; - goto done; - } - } else { - /* with exclusive create, existing dir is an error */ - if ((flags & GIT_MKDIR_EXCL) != 0) { - giterr_set(GITERR_FILESYSTEM, "Failed to make directory '%s': directory exists", make_path.ptr); - error = GIT_EEXISTS; - goto done; - } - - if ((error = validate_existing( - make_path.ptr, &st, mode, flags, &opts->perfdata)) < 0) - goto done; - } - - /* chmod if requested and necessary */ - if (((flags & GIT_MKDIR_CHMOD_PATH) != 0 || - (lastch == '\0' && (flags & GIT_MKDIR_CHMOD) != 0)) && - st.st_mode != mode) { - - opts->perfdata.chmod_calls++; - - if ((error = p_chmod(make_path.ptr, mode)) < 0 && - lastch == '\0') { - giterr_set(GITERR_OS, "Failed to set permissions on '%s'", - make_path.ptr); - goto done; - } - } - - if (opts->dir_map && opts->pool) { - char *cache_path; - size_t alloc_size; - - GITERR_CHECK_ALLOC_ADD(&alloc_size, make_path.size, 1); - if (!git__is_uint32(alloc_size)) - return -1; - cache_path = git_pool_malloc(opts->pool, (uint32_t)alloc_size); - GITERR_CHECK_ALLOC(cache_path); - - memcpy(cache_path, make_path.ptr, make_path.size + 1); - - git_strmap_insert(opts->dir_map, cache_path, cache_path, error); - if (error < 0) - goto done; - } - } - - error = 0; - - /* check that full path really is a directory if requested & needed */ - if ((flags & GIT_MKDIR_VERIFY_DIR) != 0 && - lastch != '\0') { - opts->perfdata.stat_calls++; - - if (p_stat(make_path.ptr, &st) < 0 || !S_ISDIR(st.st_mode)) { - giterr_set(GITERR_OS, "Path is not a directory '%s'", - make_path.ptr); - error = GIT_ENOTFOUND; - } - } - -done: - git_buf_free(&make_path); - return error; -} - -int git_futils_mkdir( - const char *path, - const char *base, - mode_t mode, - uint32_t flags) -{ - struct git_futils_mkdir_options options = {0}; - return git_futils_mkdir_ext(path, base, mode, flags, &options); -} - -int git_futils_mkdir_r(const char *path, const char *base, const mode_t mode) -{ - return git_futils_mkdir(path, base, mode, GIT_MKDIR_PATH); -} - -typedef struct { - const char *base; - size_t baselen; - uint32_t flags; - int depth; -} futils__rmdir_data; - -#define FUTILS_MAX_DEPTH 100 - -static int futils__error_cannot_rmdir(const char *path, const char *filemsg) -{ - if (filemsg) - giterr_set(GITERR_OS, "Could not remove directory. File '%s' %s", - path, filemsg); - else - giterr_set(GITERR_OS, "Could not remove directory '%s'", path); - - return -1; -} - -static int futils__rm_first_parent(git_buf *path, const char *ceiling) -{ - int error = GIT_ENOTFOUND; - struct stat st; - - while (error == GIT_ENOTFOUND) { - git_buf_rtruncate_at_char(path, '/'); - - if (!path->size || git__prefixcmp(path->ptr, ceiling) != 0) - error = 0; - else if (p_lstat_posixly(path->ptr, &st) == 0) { - if (S_ISREG(st.st_mode) || S_ISLNK(st.st_mode)) - error = p_unlink(path->ptr); - else if (!S_ISDIR(st.st_mode)) - error = -1; /* fail to remove non-regular file */ - } else if (errno != ENOTDIR) - error = -1; - } - - if (error) - futils__error_cannot_rmdir(path->ptr, "cannot remove parent"); - - return error; -} - -static int futils__rmdir_recurs_foreach(void *opaque, git_buf *path) -{ - int error = 0; - futils__rmdir_data *data = opaque; - struct stat st; - - if (data->depth > FUTILS_MAX_DEPTH) - error = futils__error_cannot_rmdir( - path->ptr, "directory nesting too deep"); - - else if ((error = p_lstat_posixly(path->ptr, &st)) < 0) { - if (errno == ENOENT) - error = 0; - else if (errno == ENOTDIR) { - /* asked to remove a/b/c/d/e and a/b is a normal file */ - if ((data->flags & GIT_RMDIR_REMOVE_BLOCKERS) != 0) - error = futils__rm_first_parent(path, data->base); - else - futils__error_cannot_rmdir( - path->ptr, "parent is not directory"); - } - else - error = git_path_set_error(errno, path->ptr, "rmdir"); - } - - else if (S_ISDIR(st.st_mode)) { - data->depth++; - - error = git_path_direach(path, 0, futils__rmdir_recurs_foreach, data); - - data->depth--; - - if (error < 0) - return error; - - if (data->depth == 0 && (data->flags & GIT_RMDIR_SKIP_ROOT) != 0) - return error; - - if ((error = p_rmdir(path->ptr)) < 0) { - if ((data->flags & GIT_RMDIR_SKIP_NONEMPTY) != 0 && - (errno == ENOTEMPTY || errno == EEXIST || errno == EBUSY)) - error = 0; - else - error = git_path_set_error(errno, path->ptr, "rmdir"); - } - } - - else if ((data->flags & GIT_RMDIR_REMOVE_FILES) != 0) { - if (p_unlink(path->ptr) < 0) - error = git_path_set_error(errno, path->ptr, "remove"); - } - - else if ((data->flags & GIT_RMDIR_SKIP_NONEMPTY) == 0) - error = futils__error_cannot_rmdir(path->ptr, "still present"); - - return error; -} - -static int futils__rmdir_empty_parent(void *opaque, const char *path) -{ - futils__rmdir_data *data = opaque; - int error = 0; - - if (strlen(path) <= data->baselen) - error = GIT_ITEROVER; - - else if (p_rmdir(path) < 0) { - int en = errno; - - if (en == ENOENT || en == ENOTDIR) { - /* do nothing */ - } else if (en == ENOTEMPTY || en == EEXIST || en == EBUSY) { - error = GIT_ITEROVER; - } else { - error = git_path_set_error(errno, path, "rmdir"); - } - } - - return error; -} - -int git_futils_rmdir_r( - const char *path, const char *base, uint32_t flags) -{ - int error; - git_buf fullpath = GIT_BUF_INIT; - futils__rmdir_data data; - - /* build path and find "root" where we should start calling mkdir */ - if (git_path_join_unrooted(&fullpath, path, base, NULL) < 0) - return -1; - - memset(&data, 0, sizeof(data)); - data.base = base ? base : ""; - data.baselen = base ? strlen(base) : 0; - data.flags = flags; - - error = futils__rmdir_recurs_foreach(&data, &fullpath); - - /* remove now-empty parents if requested */ - if (!error && (flags & GIT_RMDIR_EMPTY_PARENTS) != 0) - error = git_path_walk_up( - &fullpath, base, futils__rmdir_empty_parent, &data); - - if (error == GIT_ITEROVER) { - giterr_clear(); - error = 0; - } - - git_buf_free(&fullpath); - - return error; -} - -int git_futils_fake_symlink(const char *old, const char *new) -{ - int retcode = GIT_ERROR; - int fd = git_futils_creat_withpath(new, 0755, 0644); - if (fd >= 0) { - retcode = p_write(fd, old, strlen(old)); - p_close(fd); - } - return retcode; -} - -static int cp_by_fd(int ifd, int ofd, bool close_fd_when_done) -{ - int error = 0; - char buffer[FILEIO_BUFSIZE]; - ssize_t len = 0; - - while (!error && (len = p_read(ifd, buffer, sizeof(buffer))) > 0) - /* p_write() does not have the same semantics as write(). It loops - * internally and will return 0 when it has completed writing. - */ - error = p_write(ofd, buffer, len); - - if (len < 0) { - giterr_set(GITERR_OS, "Read error while copying file"); - error = (int)len; - } - - if (error < 0) - giterr_set(GITERR_OS, "write error while copying file"); - - if (close_fd_when_done) { - p_close(ifd); - p_close(ofd); - } - - return error; -} - -int git_futils_cp(const char *from, const char *to, mode_t filemode) -{ - int ifd, ofd; - - if ((ifd = git_futils_open_ro(from)) < 0) - return ifd; - - if ((ofd = p_open(to, O_WRONLY | O_CREAT | O_EXCL, filemode)) < 0) { - p_close(ifd); - return git_path_set_error(errno, to, "open for writing"); - } - - return cp_by_fd(ifd, ofd, true); -} - -static int cp_link(const char *from, const char *to, size_t link_size) -{ - int error = 0; - ssize_t read_len; - char *link_data; - size_t alloc_size; - - GITERR_CHECK_ALLOC_ADD(&alloc_size, link_size, 1); - link_data = git__malloc(alloc_size); - GITERR_CHECK_ALLOC(link_data); - - read_len = p_readlink(from, link_data, link_size); - if (read_len != (ssize_t)link_size) { - giterr_set(GITERR_OS, "Failed to read symlink data for '%s'", from); - error = -1; - } - else { - link_data[read_len] = '\0'; - - if (p_symlink(link_data, to) < 0) { - giterr_set(GITERR_OS, "Could not symlink '%s' as '%s'", - link_data, to); - error = -1; - } - } - - git__free(link_data); - return error; -} - -typedef struct { - const char *to_root; - git_buf to; - ssize_t from_prefix; - uint32_t flags; - uint32_t mkdir_flags; - mode_t dirmode; -} cp_r_info; - -#define GIT_CPDIR__MKDIR_DONE_FOR_TO_ROOT (1u << 10) - -static int _cp_r_mkdir(cp_r_info *info, git_buf *from) -{ - int error = 0; - - /* create root directory the first time we need to create a directory */ - if ((info->flags & GIT_CPDIR__MKDIR_DONE_FOR_TO_ROOT) == 0) { - error = git_futils_mkdir( - info->to_root, NULL, info->dirmode, - (info->flags & GIT_CPDIR_CHMOD_DIRS) ? GIT_MKDIR_CHMOD : 0); - - info->flags |= GIT_CPDIR__MKDIR_DONE_FOR_TO_ROOT; - } - - /* create directory with root as base to prevent excess chmods */ - if (!error) - error = git_futils_mkdir( - from->ptr + info->from_prefix, info->to_root, - info->dirmode, info->mkdir_flags); - - return error; -} - -static int _cp_r_callback(void *ref, git_buf *from) -{ - int error = 0; - cp_r_info *info = ref; - struct stat from_st, to_st; - bool exists = false; - - if ((info->flags & GIT_CPDIR_COPY_DOTFILES) == 0 && - from->ptr[git_path_basename_offset(from)] == '.') - return 0; - - if ((error = git_buf_joinpath( - &info->to, info->to_root, from->ptr + info->from_prefix)) < 0) - return error; - - if (!(error = git_path_lstat(info->to.ptr, &to_st))) - exists = true; - else if (error != GIT_ENOTFOUND) - return error; - else { - giterr_clear(); - error = 0; - } - - if ((error = git_path_lstat(from->ptr, &from_st)) < 0) - return error; - - if (S_ISDIR(from_st.st_mode)) { - mode_t oldmode = info->dirmode; - - /* if we are not chmod'ing, then overwrite dirmode */ - if ((info->flags & GIT_CPDIR_CHMOD_DIRS) == 0) - info->dirmode = from_st.st_mode; - - /* make directory now if CREATE_EMPTY_DIRS is requested and needed */ - if (!exists && (info->flags & GIT_CPDIR_CREATE_EMPTY_DIRS) != 0) - error = _cp_r_mkdir(info, from); - - /* recurse onto target directory */ - if (!error && (!exists || S_ISDIR(to_st.st_mode))) - error = git_path_direach(from, 0, _cp_r_callback, info); - - if (oldmode != 0) - info->dirmode = oldmode; - - return error; - } - - if (exists) { - if ((info->flags & GIT_CPDIR_OVERWRITE) == 0) - return 0; - - if (p_unlink(info->to.ptr) < 0) { - giterr_set(GITERR_OS, "Cannot overwrite existing file '%s'", - info->to.ptr); - return GIT_EEXISTS; - } - } - - /* Done if this isn't a regular file or a symlink */ - if (!S_ISREG(from_st.st_mode) && - (!S_ISLNK(from_st.st_mode) || - (info->flags & GIT_CPDIR_COPY_SYMLINKS) == 0)) - return 0; - - /* Make container directory on demand if needed */ - if ((info->flags & GIT_CPDIR_CREATE_EMPTY_DIRS) == 0 && - (error = _cp_r_mkdir(info, from)) < 0) - return error; - - /* make symlink or regular file */ - if (info->flags & GIT_CPDIR_LINK_FILES) { - if ((error = p_link(from->ptr, info->to.ptr)) < 0) - giterr_set(GITERR_OS, "failed to link '%s'", from->ptr); - } else if (S_ISLNK(from_st.st_mode)) { - error = cp_link(from->ptr, info->to.ptr, (size_t)from_st.st_size); - } else { - mode_t usemode = from_st.st_mode; - - if ((info->flags & GIT_CPDIR_SIMPLE_TO_MODE) != 0) - usemode = GIT_PERMS_FOR_WRITE(usemode); - - error = git_futils_cp(from->ptr, info->to.ptr, usemode); - } - - return error; -} - -int git_futils_cp_r( - const char *from, - const char *to, - uint32_t flags, - mode_t dirmode) -{ - int error; - git_buf path = GIT_BUF_INIT; - cp_r_info info; - - if (git_buf_joinpath(&path, from, "") < 0) /* ensure trailing slash */ - return -1; - - memset(&info, 0, sizeof(info)); - info.to_root = to; - info.flags = flags; - info.dirmode = dirmode; - info.from_prefix = path.size; - git_buf_init(&info.to, 0); - - /* precalculate mkdir flags */ - if ((flags & GIT_CPDIR_CREATE_EMPTY_DIRS) == 0) { - /* if not creating empty dirs, then use mkdir to create the path on - * demand right before files are copied. - */ - info.mkdir_flags = GIT_MKDIR_PATH | GIT_MKDIR_SKIP_LAST; - if ((flags & GIT_CPDIR_CHMOD_DIRS) != 0) - info.mkdir_flags |= GIT_MKDIR_CHMOD_PATH; - } else { - /* otherwise, we will do simple mkdir as directories are encountered */ - info.mkdir_flags = - ((flags & GIT_CPDIR_CHMOD_DIRS) != 0) ? GIT_MKDIR_CHMOD : 0; - } - - error = _cp_r_callback(&info, &path); - - git_buf_free(&path); - git_buf_free(&info.to); - - return error; -} - -int git_futils_filestamp_check( - git_futils_filestamp *stamp, const char *path) -{ - struct stat st; - - /* if the stamp is NULL, then always reload */ - if (stamp == NULL) - return 1; - - if (p_stat(path, &st) < 0) - return GIT_ENOTFOUND; - - if (stamp->mtime == (git_time_t)st.st_mtime && - stamp->size == (git_off_t)st.st_size && - stamp->ino == (unsigned int)st.st_ino) - return 0; - - stamp->mtime = (git_time_t)st.st_mtime; - stamp->size = (git_off_t)st.st_size; - stamp->ino = (unsigned int)st.st_ino; - - return 1; -} - -void git_futils_filestamp_set( - git_futils_filestamp *target, const git_futils_filestamp *source) -{ - assert(target); - - if (source) - memcpy(target, source, sizeof(*target)); - else - memset(target, 0, sizeof(*target)); -} - - -void git_futils_filestamp_set_from_stat( - git_futils_filestamp *stamp, struct stat *st) -{ - if (st) { - stamp->mtime = (git_time_t)st->st_mtime; - stamp->size = (git_off_t)st->st_size; - stamp->ino = (unsigned int)st->st_ino; - } else { - memset(stamp, 0, sizeof(*stamp)); - } -} diff --git a/vendor/libgit2/src/fileops.h b/vendor/libgit2/src/fileops.h deleted file mode 100644 index 0f6466c59c..0000000000 --- a/vendor/libgit2/src/fileops.h +++ /dev/null @@ -1,355 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_fileops_h__ -#define INCLUDE_fileops_h__ - -#include "common.h" -#include "map.h" -#include "posix.h" -#include "path.h" -#include "pool.h" -#include "strmap.h" - -/** - * Filebuffer methods - * - * Read whole files into an in-memory buffer for processing - */ -extern int git_futils_readbuffer(git_buf *obj, const char *path); -extern int git_futils_readbuffer_updated( - git_buf *obj, const char *path, time_t *mtime, size_t *size, int *updated); -extern int git_futils_readbuffer_fd(git_buf *obj, git_file fd, size_t len); - -extern int git_futils_writebuffer( - const git_buf *buf, const char *path, int open_flags, mode_t mode); - -/** - * File utils - * - * These are custom filesystem-related helper methods. They are - * rather high level, and wrap the underlying POSIX methods - * - * All these methods return 0 on success, - * or an error code on failure and an error message is set. - */ - -/** - * Create and open a file, while also - * creating all the folders in its path - */ -extern int git_futils_creat_withpath(const char *path, const mode_t dirmode, const mode_t mode); - -/** - * Create an open a process-locked file - */ -extern int git_futils_creat_locked(const char *path, const mode_t mode); - -/** - * Create an open a process-locked file, while - * also creating all the folders in its path - */ -extern int git_futils_creat_locked_withpath(const char *path, const mode_t dirmode, const mode_t mode); - -/** - * Create a path recursively - * - * If a base parameter is being passed, it's expected to be valued with a - * path pointing to an already existing directory. - */ -extern int git_futils_mkdir_r(const char *path, const char *base, const mode_t mode); - -/** - * Flags to pass to `git_futils_mkdir`. - * - * * GIT_MKDIR_EXCL is "exclusive" - i.e. generate an error if dir exists. - * * GIT_MKDIR_PATH says to make all components in the path. - * * GIT_MKDIR_CHMOD says to chmod the final directory entry after creation - * * GIT_MKDIR_CHMOD_PATH says to chmod each directory component in the path - * * GIT_MKDIR_SKIP_LAST says to leave off the last element of the path - * * GIT_MKDIR_SKIP_LAST2 says to leave off the last 2 elements of the path - * * GIT_MKDIR_VERIFY_DIR says confirm final item is a dir, not just EEXIST - * * GIT_MKDIR_REMOVE_FILES says to remove files and recreate dirs - * * GIT_MKDIR_REMOVE_SYMLINKS says to remove symlinks and recreate dirs - * - * Note that the chmod options will be executed even if the directory already - * exists, unless GIT_MKDIR_EXCL is given. - */ -typedef enum { - GIT_MKDIR_EXCL = 1, - GIT_MKDIR_PATH = 2, - GIT_MKDIR_CHMOD = 4, - GIT_MKDIR_CHMOD_PATH = 8, - GIT_MKDIR_SKIP_LAST = 16, - GIT_MKDIR_SKIP_LAST2 = 32, - GIT_MKDIR_VERIFY_DIR = 64, - GIT_MKDIR_REMOVE_FILES = 128, - GIT_MKDIR_REMOVE_SYMLINKS = 256, -} git_futils_mkdir_flags; - -struct git_futils_mkdir_perfdata -{ - size_t stat_calls; - size_t mkdir_calls; - size_t chmod_calls; -}; - -struct git_futils_mkdir_options -{ - git_strmap *dir_map; - git_pool *pool; - struct git_futils_mkdir_perfdata perfdata; -}; - -/** - * Create a directory or entire path. - * - * This makes a directory (and the entire path leading up to it if requested), - * and optionally chmods the directory immediately after (or each part of the - * path if requested). - * - * @param path The path to create. - * @param base Root for relative path. These directories will never be made. - * @param mode The mode to use for created directories. - * @param flags Combination of the mkdir flags above. - * @param opts Extended options, use `git_futils_mkdir` if you are not interested. - * @return 0 on success, else error code - */ -extern int git_futils_mkdir_ext(const char *path, const char *base, mode_t mode, uint32_t flags, struct git_futils_mkdir_options *opts); - -/** - * Create a directory or entire path. Similar to `git_futils_mkdir_withperf` - * without performance data. - */ -extern int git_futils_mkdir(const char *path, const char *base, mode_t mode, uint32_t flags); - -/** - * Create all the folders required to contain - * the full path of a file - */ -extern int git_futils_mkpath2file(const char *path, const mode_t mode); - -/** - * Flags to pass to `git_futils_rmdir_r`. - * - * * GIT_RMDIR_EMPTY_HIERARCHY - the default; remove hierarchy of empty - * dirs and generate error if any files are found. - * * GIT_RMDIR_REMOVE_FILES - attempt to remove files in the hierarchy. - * * GIT_RMDIR_SKIP_NONEMPTY - skip non-empty directories with no error. - * * GIT_RMDIR_EMPTY_PARENTS - remove containing directories up to base - * if removing this item leaves them empty - * * GIT_RMDIR_REMOVE_BLOCKERS - remove blocking file that causes ENOTDIR - * * GIT_RMDIR_SKIP_ROOT - don't remove root directory itself - */ -typedef enum { - GIT_RMDIR_EMPTY_HIERARCHY = 0, - GIT_RMDIR_REMOVE_FILES = (1 << 0), - GIT_RMDIR_SKIP_NONEMPTY = (1 << 1), - GIT_RMDIR_EMPTY_PARENTS = (1 << 2), - GIT_RMDIR_REMOVE_BLOCKERS = (1 << 3), - GIT_RMDIR_SKIP_ROOT = (1 << 4), -} git_futils_rmdir_flags; - -/** - * Remove path and any files and directories beneath it. - * - * @param path Path to the top level directory to process. - * @param base Root for relative path. - * @param flags Combination of git_futils_rmdir_flags values - * @return 0 on success; -1 on error. - */ -extern int git_futils_rmdir_r(const char *path, const char *base, uint32_t flags); - -/** - * Create and open a temporary file with a `_git2_` suffix. - * Writes the filename into path_out. - * @return On success, an open file descriptor, else an error code < 0. - */ -extern int git_futils_mktmp(git_buf *path_out, const char *filename, mode_t mode); - -/** - * Move a file on the filesystem, create the - * destination path if it doesn't exist - */ -extern int git_futils_mv_withpath(const char *from, const char *to, const mode_t dirmode); - -/** - * Copy a file - * - * The filemode will be used for the newly created file. - */ -extern int git_futils_cp( - const char *from, - const char *to, - mode_t filemode); - -/** - * Flags that can be passed to `git_futils_cp_r`. - * - * - GIT_CPDIR_CREATE_EMPTY_DIRS: create directories even if there are no - * files under them (otherwise directories will only be created lazily - * when a file inside them is copied). - * - GIT_CPDIR_COPY_SYMLINKS: copy symlinks, otherwise they are ignored. - * - GIT_CPDIR_COPY_DOTFILES: copy files with leading '.', otherwise ignored. - * - GIT_CPDIR_OVERWRITE: overwrite pre-existing files with source content, - * otherwise they are silently skipped. - * - GIT_CPDIR_CHMOD_DIRS: explicitly chmod directories to `dirmode` - * - GIT_CPDIR_SIMPLE_TO_MODE: default tries to replicate the mode of the - * source file to the target; with this flag, always use 0666 (or 0777 if - * source has exec bits set) for target. - * - GIT_CPDIR_LINK_FILES will try to use hardlinks for the files - */ -typedef enum { - GIT_CPDIR_CREATE_EMPTY_DIRS = (1u << 0), - GIT_CPDIR_COPY_SYMLINKS = (1u << 1), - GIT_CPDIR_COPY_DOTFILES = (1u << 2), - GIT_CPDIR_OVERWRITE = (1u << 3), - GIT_CPDIR_CHMOD_DIRS = (1u << 4), - GIT_CPDIR_SIMPLE_TO_MODE = (1u << 5), - GIT_CPDIR_LINK_FILES = (1u << 6), -} git_futils_cpdir_flags; - -/** - * Copy a directory tree. - * - * This copies directories and files from one root to another. You can - * pass a combinationof GIT_CPDIR flags as defined above. - * - * If you pass the CHMOD flag, then the dirmode will be applied to all - * directories that are created during the copy, overiding the natural - * permissions. If you do not pass the CHMOD flag, then the dirmode - * will actually be copied from the source files and the `dirmode` arg - * will be ignored. - */ -extern int git_futils_cp_r( - const char *from, - const char *to, - uint32_t flags, - mode_t dirmode); - -/** - * Open a file readonly and set error if needed. - */ -extern int git_futils_open_ro(const char *path); - -/** - * Get the filesize in bytes of a file - */ -extern git_off_t git_futils_filesize(git_file fd); - -#define GIT_PERMS_IS_EXEC(MODE) (((MODE) & 0111) != 0) -#define GIT_PERMS_CANONICAL(MODE) (GIT_PERMS_IS_EXEC(MODE) ? 0755 : 0644) -#define GIT_PERMS_FOR_WRITE(MODE) (GIT_PERMS_IS_EXEC(MODE) ? 0777 : 0666) - -#define GIT_MODE_PERMS_MASK 0777 -#define GIT_MODE_TYPE_MASK 0170000 -#define GIT_MODE_TYPE(MODE) ((MODE) & GIT_MODE_TYPE_MASK) -#define GIT_MODE_ISBLOB(MODE) (GIT_MODE_TYPE(MODE) == GIT_MODE_TYPE(GIT_FILEMODE_BLOB)) - -/** - * Convert a mode_t from the OS to a legal git mode_t value. - */ -extern mode_t git_futils_canonical_mode(mode_t raw_mode); - - -/** - * Read-only map all or part of a file into memory. - * When possible this function should favor a virtual memory - * style mapping over some form of malloc()+read(), as the - * data access will be random and is not likely to touch the - * majority of the region requested. - * - * @param out buffer to populate with the mapping information. - * @param fd open descriptor to configure the mapping from. - * @param begin first byte to map, this should be page aligned. - * @param len number of bytes to map. - * @return - * - 0 on success; - * - -1 on error. - */ -extern int git_futils_mmap_ro( - git_map *out, - git_file fd, - git_off_t begin, - size_t len); - -/** - * Read-only map an entire file. - * - * @param out buffer to populate with the mapping information. - * @param path path to file to be opened. - * @return - * - 0 on success; - * - GIT_ENOTFOUND if not found; - * - -1 on an unspecified OS related error. - */ -extern int git_futils_mmap_ro_file( - git_map *out, - const char *path); - -/** - * Release the memory associated with a previous memory mapping. - * @param map the mapping description previously configured. - */ -extern void git_futils_mmap_free(git_map *map); - -/** - * Create a "fake" symlink (text file containing the target path). - * - * @param new symlink file to be created - * @param old original symlink target - * @return 0 on success, -1 on error - */ -extern int git_futils_fake_symlink(const char *new, const char *old); - -/** - * A file stamp represents a snapshot of information about a file that can - * be used to test if the file changes. This portable implementation is - * based on stat data about that file, but it is possible that OS specific - * versions could be implemented in the future. - */ -typedef struct { - git_time_t mtime; - git_off_t size; - unsigned int ino; -} git_futils_filestamp; - -/** - * Compare stat information for file with reference info. - * - * This function updates the file stamp to current data for the given path - * and returns 0 if the file is up-to-date relative to the prior setting, - * 1 if the file has been changed, or GIT_ENOTFOUND if the file doesn't - * exist. This will not call giterr_set, so you must set the error if you - * plan to return an error. - * - * @param stamp File stamp to be checked - * @param path Path to stat and check if changed - * @return 0 if up-to-date, 1 if out-of-date, GIT_ENOTFOUND if cannot stat - */ -extern int git_futils_filestamp_check( - git_futils_filestamp *stamp, const char *path); - -/** - * Set or reset file stamp data - * - * This writes the target file stamp. If the source is NULL, this will set - * the target stamp to values that will definitely be out of date. If the - * source is not NULL, this copies the source values to the target. - * - * @param tgt File stamp to write to - * @param src File stamp to copy from or NULL to clear the target - */ -extern void git_futils_filestamp_set( - git_futils_filestamp *tgt, const git_futils_filestamp *src); - -/** - * Set file stamp data from stat structure - */ -extern void git_futils_filestamp_set_from_stat( - git_futils_filestamp *stamp, struct stat *st); - -#endif /* INCLUDE_fileops_h__ */ diff --git a/vendor/libgit2/src/filter.c b/vendor/libgit2/src/filter.c deleted file mode 100644 index 4006351f8f..0000000000 --- a/vendor/libgit2/src/filter.c +++ /dev/null @@ -1,980 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#include "common.h" -#include "fileops.h" -#include "hash.h" -#include "filter.h" -#include "repository.h" -#include "global.h" -#include "git2/sys/filter.h" -#include "git2/config.h" -#include "blob.h" -#include "attr_file.h" -#include "array.h" - -struct git_filter_source { - git_repository *repo; - const char *path; - git_oid oid; /* zero if unknown (which is likely) */ - uint16_t filemode; /* zero if unknown */ - git_filter_mode_t mode; - uint32_t flags; -}; - -typedef struct { - const char *filter_name; - git_filter *filter; - void *payload; -} git_filter_entry; - -struct git_filter_list { - git_array_t(git_filter_entry) filters; - git_filter_source source; - git_buf *temp_buf; - char path[GIT_FLEX_ARRAY]; -}; - -typedef struct { - char *filter_name; - git_filter *filter; - int priority; - int initialized; - size_t nattrs, nmatches; - char *attrdata; - const char *attrs[GIT_FLEX_ARRAY]; -} git_filter_def; - -static int filter_def_priority_cmp(const void *a, const void *b) -{ - int pa = ((const git_filter_def *)a)->priority; - int pb = ((const git_filter_def *)b)->priority; - return (pa < pb) ? -1 : (pa > pb) ? 1 : 0; -} - -struct filter_registry { - git_vector filters; -}; - -static struct filter_registry *git__filter_registry = NULL; - -static void filter_registry_shutdown(void) -{ - struct filter_registry *reg = NULL; - size_t pos; - git_filter_def *fdef; - - if ((reg = git__swap(git__filter_registry, NULL)) == NULL) - return; - - git_vector_foreach(®->filters, pos, fdef) { - if (fdef->filter && fdef->filter->shutdown) { - fdef->filter->shutdown(fdef->filter); - fdef->initialized = false; - } - - git__free(fdef->filter_name); - git__free(fdef->attrdata); - git__free(fdef); - } - - git_vector_free(®->filters); - git__free(reg); -} - -static int filter_registry_initialize(void) -{ - int error = 0; - struct filter_registry *reg; - - if (git__filter_registry) - return 0; - - reg = git__calloc(1, sizeof(struct filter_registry)); - GITERR_CHECK_ALLOC(reg); - - if ((error = git_vector_init( - ®->filters, 2, filter_def_priority_cmp)) < 0) - goto cleanup; - - reg = git__compare_and_swap(&git__filter_registry, NULL, reg); - if (reg != NULL) - goto cleanup; - - git__on_shutdown(filter_registry_shutdown); - - /* try to register both default filters */ - { - git_filter *crlf = git_crlf_filter_new(); - git_filter *ident = git_ident_filter_new(); - - if (crlf && git_filter_register( - GIT_FILTER_CRLF, crlf, GIT_FILTER_CRLF_PRIORITY) < 0) - crlf = NULL; - if (ident && git_filter_register( - GIT_FILTER_IDENT, ident, GIT_FILTER_IDENT_PRIORITY) < 0) - ident = NULL; - - if (!crlf || !ident) - return -1; - } - - return 0; - -cleanup: - git_vector_free(®->filters); - git__free(reg); - return error; -} - -static int filter_def_scan_attrs( - git_buf *attrs, size_t *nattr, size_t *nmatch, const char *attr_str) -{ - const char *start, *scan = attr_str; - int has_eq; - - *nattr = *nmatch = 0; - - if (!scan) - return 0; - - while (*scan) { - while (git__isspace(*scan)) scan++; - - for (start = scan, has_eq = 0; *scan && !git__isspace(*scan); ++scan) { - if (*scan == '=') - has_eq = 1; - } - - if (scan > start) { - (*nattr)++; - if (has_eq || *start == '-' || *start == '+' || *start == '!') - (*nmatch)++; - - if (has_eq) - git_buf_putc(attrs, '='); - git_buf_put(attrs, start, scan - start); - git_buf_putc(attrs, '\0'); - } - } - - return 0; -} - -static void filter_def_set_attrs(git_filter_def *fdef) -{ - char *scan = fdef->attrdata; - size_t i; - - for (i = 0; i < fdef->nattrs; ++i) { - const char *name, *value; - - switch (*scan) { - case '=': - name = scan + 1; - for (scan++; *scan != '='; scan++) /* find '=' */; - *scan++ = '\0'; - value = scan; - break; - case '-': - name = scan + 1; value = git_attr__false; break; - case '+': - name = scan + 1; value = git_attr__true; break; - case '!': - name = scan + 1; value = git_attr__unset; break; - default: - name = scan; value = NULL; break; - } - - fdef->attrs[i] = name; - fdef->attrs[i + fdef->nattrs] = value; - - scan += strlen(scan) + 1; - } -} - -static int filter_def_name_key_check(const void *key, const void *fdef) -{ - const char *name = - fdef ? ((const git_filter_def *)fdef)->filter_name : NULL; - return name ? git__strcmp(key, name) : -1; -} - -static int filter_def_filter_key_check(const void *key, const void *fdef) -{ - const void *filter = fdef ? ((const git_filter_def *)fdef)->filter : NULL; - return (key == filter) ? 0 : -1; -} - -static int filter_registry_find(size_t *pos, const char *name) -{ - return git_vector_search2( - pos, &git__filter_registry->filters, filter_def_name_key_check, name); -} - -static git_filter_def *filter_registry_lookup(size_t *pos, const char *name) -{ - git_filter_def *fdef = NULL; - - if (!filter_registry_find(pos, name)) - fdef = git_vector_get(&git__filter_registry->filters, *pos); - - return fdef; -} - -int git_filter_register( - const char *name, git_filter *filter, int priority) -{ - git_filter_def *fdef; - size_t nattr = 0, nmatch = 0, alloc_len; - git_buf attrs = GIT_BUF_INIT; - - assert(name && filter); - - if (filter_registry_initialize() < 0) - return -1; - - if (!filter_registry_find(NULL, name)) { - giterr_set( - GITERR_FILTER, "Attempt to reregister existing filter '%s'", name); - return GIT_EEXISTS; - } - - if (filter_def_scan_attrs(&attrs, &nattr, &nmatch, filter->attributes) < 0) - return -1; - - GITERR_CHECK_ALLOC_MULTIPLY(&alloc_len, nattr, 2); - GITERR_CHECK_ALLOC_MULTIPLY(&alloc_len, alloc_len, sizeof(char *)); - GITERR_CHECK_ALLOC_ADD(&alloc_len, alloc_len, sizeof(git_filter_def)); - - fdef = git__calloc(1, alloc_len); - GITERR_CHECK_ALLOC(fdef); - - fdef->filter_name = git__strdup(name); - GITERR_CHECK_ALLOC(fdef->filter_name); - - fdef->filter = filter; - fdef->priority = priority; - fdef->nattrs = nattr; - fdef->nmatches = nmatch; - fdef->attrdata = git_buf_detach(&attrs); - - filter_def_set_attrs(fdef); - - if (git_vector_insert(&git__filter_registry->filters, fdef) < 0) { - git__free(fdef->filter_name); - git__free(fdef->attrdata); - git__free(fdef); - return -1; - } - - git_vector_sort(&git__filter_registry->filters); - return 0; -} - -int git_filter_unregister(const char *name) -{ - size_t pos; - git_filter_def *fdef; - - assert(name); - - /* cannot unregister default filters */ - if (!strcmp(GIT_FILTER_CRLF, name) || !strcmp(GIT_FILTER_IDENT, name)) { - giterr_set(GITERR_FILTER, "Cannot unregister filter '%s'", name); - return -1; - } - - if ((fdef = filter_registry_lookup(&pos, name)) == NULL) { - giterr_set(GITERR_FILTER, "Cannot find filter '%s' to unregister", name); - return GIT_ENOTFOUND; - } - - (void)git_vector_remove(&git__filter_registry->filters, pos); - - if (fdef->initialized && fdef->filter && fdef->filter->shutdown) { - fdef->filter->shutdown(fdef->filter); - fdef->initialized = false; - } - - git__free(fdef->filter_name); - git__free(fdef->attrdata); - git__free(fdef); - - return 0; -} - -static int filter_initialize(git_filter_def *fdef) -{ - int error = 0; - - if (!fdef->initialized && - fdef->filter && - fdef->filter->initialize && - (error = fdef->filter->initialize(fdef->filter)) < 0) - { - /* auto-unregister if initialize fails */ - git_filter_unregister(fdef->filter_name); - return error; - } - - fdef->initialized = true; - return 0; -} - -git_filter *git_filter_lookup(const char *name) -{ - size_t pos; - git_filter_def *fdef; - - if (filter_registry_initialize() < 0) - return NULL; - - if ((fdef = filter_registry_lookup(&pos, name)) == NULL) - return NULL; - - if (!fdef->initialized && filter_initialize(fdef) < 0) - return NULL; - - return fdef->filter; -} - -void git_filter_free(git_filter *filter) -{ - git__free(filter); -} - -git_repository *git_filter_source_repo(const git_filter_source *src) -{ - return src->repo; -} - -const char *git_filter_source_path(const git_filter_source *src) -{ - return src->path; -} - -uint16_t git_filter_source_filemode(const git_filter_source *src) -{ - return src->filemode; -} - -const git_oid *git_filter_source_id(const git_filter_source *src) -{ - return git_oid_iszero(&src->oid) ? NULL : &src->oid; -} - -git_filter_mode_t git_filter_source_mode(const git_filter_source *src) -{ - return src->mode; -} - -uint32_t git_filter_source_flags(const git_filter_source *src) -{ - return src->flags; -} - -static int filter_list_new( - git_filter_list **out, const git_filter_source *src) -{ - git_filter_list *fl = NULL; - size_t pathlen = src->path ? strlen(src->path) : 0, alloclen; - - GITERR_CHECK_ALLOC_ADD(&alloclen, sizeof(git_filter_list), pathlen); - GITERR_CHECK_ALLOC_ADD(&alloclen, alloclen, 1); - - fl = git__calloc(1, alloclen); - GITERR_CHECK_ALLOC(fl); - - if (src->path) - memcpy(fl->path, src->path, pathlen); - fl->source.repo = src->repo; - fl->source.path = fl->path; - fl->source.mode = src->mode; - fl->source.flags = src->flags; - - *out = fl; - return 0; -} - -static int filter_list_check_attributes( - const char ***out, - git_repository *repo, - git_attr_session *attr_session, - git_filter_def *fdef, - const git_filter_source *src) -{ - int error; - size_t i; - const char **strs = git__calloc(fdef->nattrs, sizeof(const char *)); - GITERR_CHECK_ALLOC(strs); - - error = git_attr_get_many_with_session( - strs, repo, attr_session, 0, src->path, fdef->nattrs, fdef->attrs); - - /* if no values were found but no matches are needed, it's okay! */ - if (error == GIT_ENOTFOUND && !fdef->nmatches) { - giterr_clear(); - git__free((void *)strs); - return 0; - } - - for (i = 0; !error && i < fdef->nattrs; ++i) { - const char *want = fdef->attrs[fdef->nattrs + i]; - git_attr_t want_type, found_type; - - if (!want) - continue; - - want_type = git_attr_value(want); - found_type = git_attr_value(strs[i]); - - if (want_type != found_type || - (want_type == GIT_ATTR_VALUE_T && strcmp(want, strs[i]))) - error = GIT_ENOTFOUND; - } - - if (error) - git__free((void *)strs); - else - *out = strs; - - return error; -} - -int git_filter_list_new( - git_filter_list **out, - git_repository *repo, - git_filter_mode_t mode, - uint32_t flags) -{ - git_filter_source src = { 0 }; - src.repo = repo; - src.path = NULL; - src.mode = mode; - src.flags = flags; - return filter_list_new(out, &src); -} - -int git_filter_list__load_ext( - git_filter_list **filters, - git_repository *repo, - git_blob *blob, /* can be NULL */ - const char *path, - git_filter_mode_t mode, - git_filter_options *filter_opts) -{ - int error = 0; - git_filter_list *fl = NULL; - git_filter_source src = { 0 }; - git_filter_entry *fe; - size_t idx; - git_filter_def *fdef; - - if (filter_registry_initialize() < 0) - return -1; - - src.repo = repo; - src.path = path; - src.mode = mode; - src.flags = filter_opts->flags; - - if (blob) - git_oid_cpy(&src.oid, git_blob_id(blob)); - - git_vector_foreach(&git__filter_registry->filters, idx, fdef) { - const char **values = NULL; - void *payload = NULL; - - if (!fdef || !fdef->filter) - continue; - - if (fdef->nattrs > 0) { - error = filter_list_check_attributes( - &values, repo, filter_opts->attr_session, fdef, &src); - - if (error == GIT_ENOTFOUND) { - error = 0; - continue; - } else if (error < 0) - break; - } - - if (!fdef->initialized && (error = filter_initialize(fdef)) < 0) - break; - - if (fdef->filter->check) - error = fdef->filter->check( - fdef->filter, &payload, &src, values); - - git__free((void *)values); - - if (error == GIT_PASSTHROUGH) - error = 0; - else if (error < 0) - break; - else { - if (!fl) { - if ((error = filter_list_new(&fl, &src)) < 0) - return error; - - fl->temp_buf = filter_opts->temp_buf; - } - - fe = git_array_alloc(fl->filters); - GITERR_CHECK_ALLOC(fe); - - fe->filter = fdef->filter; - fe->filter_name = fdef->filter_name; - fe->payload = payload; - } - } - - if (error && fl != NULL) { - git_array_clear(fl->filters); - git__free(fl); - fl = NULL; - } - - *filters = fl; - return error; -} - -int git_filter_list_load( - git_filter_list **filters, - git_repository *repo, - git_blob *blob, /* can be NULL */ - const char *path, - git_filter_mode_t mode, - uint32_t flags) -{ - git_filter_options filter_opts = GIT_FILTER_OPTIONS_INIT; - - filter_opts.flags = flags; - - return git_filter_list__load_ext( - filters, repo, blob, path, mode, &filter_opts); -} - -void git_filter_list_free(git_filter_list *fl) -{ - uint32_t i; - - if (!fl) - return; - - for (i = 0; i < git_array_size(fl->filters); ++i) { - git_filter_entry *fe = git_array_get(fl->filters, i); - if (fe->filter->cleanup) - fe->filter->cleanup(fe->filter, fe->payload); - } - - git_array_clear(fl->filters); - git__free(fl); -} - -int git_filter_list_contains( - git_filter_list *fl, - const char *name) -{ - size_t i; - - assert(name); - - if (!fl) - return 0; - - for (i = 0; i < fl->filters.size; i++) { - if (strcmp(fl->filters.ptr[i].filter_name, name) == 0) - return 1; - } - - return 0; -} - -int git_filter_list_push( - git_filter_list *fl, git_filter *filter, void *payload) -{ - int error = 0; - size_t pos; - git_filter_def *fdef; - git_filter_entry *fe; - - assert(fl && filter); - - if (git_vector_search2( - &pos, &git__filter_registry->filters, - filter_def_filter_key_check, filter) < 0) { - giterr_set(GITERR_FILTER, "Cannot use an unregistered filter"); - return -1; - } - - fdef = git_vector_get(&git__filter_registry->filters, pos); - - if (!fdef->initialized && (error = filter_initialize(fdef)) < 0) - return error; - - fe = git_array_alloc(fl->filters); - GITERR_CHECK_ALLOC(fe); - fe->filter = filter; - fe->payload = payload; - - return 0; -} - -size_t git_filter_list_length(const git_filter_list *fl) -{ - return fl ? git_array_size(fl->filters) : 0; -} - -struct buf_stream { - git_writestream parent; - git_buf *target; - bool complete; -}; - -static int buf_stream_write( - git_writestream *s, const char *buffer, size_t len) -{ - struct buf_stream *buf_stream = (struct buf_stream *)s; - assert(buf_stream); - - assert(buf_stream->complete == 0); - - return git_buf_put(buf_stream->target, buffer, len); -} - -static int buf_stream_close(git_writestream *s) -{ - struct buf_stream *buf_stream = (struct buf_stream *)s; - assert(buf_stream); - - assert(buf_stream->complete == 0); - buf_stream->complete = 1; - - return 0; -} - -static void buf_stream_free(git_writestream *s) -{ - GIT_UNUSED(s); -} - -static void buf_stream_init(struct buf_stream *writer, git_buf *target) -{ - memset(writer, 0, sizeof(struct buf_stream)); - - writer->parent.write = buf_stream_write; - writer->parent.close = buf_stream_close; - writer->parent.free = buf_stream_free; - writer->target = target; - - git_buf_clear(target); -} - -int git_filter_list_apply_to_data( - git_buf *tgt, git_filter_list *filters, git_buf *src) -{ - struct buf_stream writer; - int error; - - git_buf_sanitize(tgt); - git_buf_sanitize(src); - - if (!filters) { - git_buf_attach_notowned(tgt, src->ptr, src->size); - return 0; - } - - buf_stream_init(&writer, tgt); - - if ((error = git_filter_list_stream_data(filters, src, - &writer.parent)) < 0) - return error; - - assert(writer.complete); - return error; -} - -int git_filter_list_apply_to_file( - git_buf *out, - git_filter_list *filters, - git_repository *repo, - const char *path) -{ - struct buf_stream writer; - int error; - - buf_stream_init(&writer, out); - - if ((error = git_filter_list_stream_file( - filters, repo, path, &writer.parent)) < 0) - return error; - - assert(writer.complete); - return error; -} - -static int buf_from_blob(git_buf *out, git_blob *blob) -{ - git_off_t rawsize = git_blob_rawsize(blob); - - if (!git__is_sizet(rawsize)) { - giterr_set(GITERR_OS, "Blob is too large to filter"); - return -1; - } - - git_buf_attach_notowned(out, git_blob_rawcontent(blob), (size_t)rawsize); - return 0; -} - -int git_filter_list_apply_to_blob( - git_buf *out, - git_filter_list *filters, - git_blob *blob) -{ - struct buf_stream writer; - int error; - - buf_stream_init(&writer, out); - - if ((error = git_filter_list_stream_blob( - filters, blob, &writer.parent)) < 0) - return error; - - assert(writer.complete); - return error; -} - -struct proxy_stream { - git_writestream parent; - git_filter *filter; - const git_filter_source *source; - void **payload; - git_buf input; - git_buf temp_buf; - git_buf *output; - git_writestream *target; -}; - -static int proxy_stream_write( - git_writestream *s, const char *buffer, size_t len) -{ - struct proxy_stream *proxy_stream = (struct proxy_stream *)s; - assert(proxy_stream); - - return git_buf_put(&proxy_stream->input, buffer, len); -} - -static int proxy_stream_close(git_writestream *s) -{ - struct proxy_stream *proxy_stream = (struct proxy_stream *)s; - git_buf *writebuf; - int error; - - assert(proxy_stream); - - error = proxy_stream->filter->apply( - proxy_stream->filter, - proxy_stream->payload, - proxy_stream->output, - &proxy_stream->input, - proxy_stream->source); - - if (error == GIT_PASSTHROUGH) { - writebuf = &proxy_stream->input; - } else if (error == 0) { - git_buf_sanitize(proxy_stream->output); - writebuf = proxy_stream->output; - } else { - return error; - } - - if ((error = proxy_stream->target->write( - proxy_stream->target, writebuf->ptr, writebuf->size)) == 0) - error = proxy_stream->target->close(proxy_stream->target); - - return error; -} - -static void proxy_stream_free(git_writestream *s) -{ - struct proxy_stream *proxy_stream = (struct proxy_stream *)s; - assert(proxy_stream); - - git_buf_free(&proxy_stream->input); - git_buf_free(&proxy_stream->temp_buf); - git__free(proxy_stream); -} - -static int proxy_stream_init( - git_writestream **out, - git_filter *filter, - git_buf *temp_buf, - void **payload, - const git_filter_source *source, - git_writestream *target) -{ - struct proxy_stream *proxy_stream = git__calloc(1, sizeof(struct proxy_stream)); - GITERR_CHECK_ALLOC(proxy_stream); - - proxy_stream->parent.write = proxy_stream_write; - proxy_stream->parent.close = proxy_stream_close; - proxy_stream->parent.free = proxy_stream_free; - proxy_stream->filter = filter; - proxy_stream->payload = payload; - proxy_stream->source = source; - proxy_stream->target = target; - proxy_stream->output = temp_buf ? temp_buf : &proxy_stream->temp_buf; - - if (temp_buf) - git_buf_clear(temp_buf); - - *out = (git_writestream *)proxy_stream; - return 0; -} - -static int stream_list_init( - git_writestream **out, - git_vector *streams, - git_filter_list *filters, - git_writestream *target) -{ - git_writestream *last_stream = target; - size_t i; - int error = 0; - - *out = NULL; - - if (!filters) { - *out = target; - return 0; - } - - /* Create filters last to first to get the chaining direction */ - for (i = 0; i < git_array_size(filters->filters); ++i) { - size_t filter_idx = (filters->source.mode == GIT_FILTER_TO_WORKTREE) ? - git_array_size(filters->filters) - 1 - i : i; - git_filter_entry *fe = git_array_get(filters->filters, filter_idx); - git_writestream *filter_stream; - - assert(fe->filter->stream || fe->filter->apply); - - /* If necessary, create a stream that proxies the traditional - * application. - */ - if (fe->filter->stream) - error = fe->filter->stream(&filter_stream, fe->filter, - &fe->payload, &filters->source, last_stream); - else - /* Create a stream that proxies the one-shot apply */ - error = proxy_stream_init(&filter_stream, fe->filter, - filters->temp_buf, &fe->payload, &filters->source, - last_stream); - - if (error < 0) - return error; - - git_vector_insert(streams, filter_stream); - last_stream = filter_stream; - } - - *out = last_stream; - return 0; -} - -void stream_list_free(git_vector *streams) -{ - git_writestream *stream; - size_t i; - - git_vector_foreach(streams, i, stream) - stream->free(stream); - git_vector_free(streams); -} - -int git_filter_list_stream_file( - git_filter_list *filters, - git_repository *repo, - const char *path, - git_writestream *target) -{ - char buf[FILTERIO_BUFSIZE]; - git_buf abspath = GIT_BUF_INIT; - const char *base = repo ? git_repository_workdir(repo) : NULL; - git_vector filter_streams = GIT_VECTOR_INIT; - git_writestream *stream_start; - ssize_t readlen; - int fd = -1, error; - - if ((error = stream_list_init( - &stream_start, &filter_streams, filters, target)) < 0 || - (error = git_path_join_unrooted(&abspath, path, base, NULL)) < 0) - goto done; - - if ((fd = git_futils_open_ro(abspath.ptr)) < 0) { - error = fd; - goto done; - } - - while ((readlen = p_read(fd, buf, sizeof(buf))) > 0) { - if ((error = stream_start->write(stream_start, buf, readlen)) < 0) - goto done; - } - - if (!readlen) - error = stream_start->close(stream_start); - else if (readlen < 0) - error = readlen; - - -done: - if (fd >= 0) - p_close(fd); - stream_list_free(&filter_streams); - git_buf_free(&abspath); - return error; -} - -int git_filter_list_stream_data( - git_filter_list *filters, - git_buf *data, - git_writestream *target) -{ - git_vector filter_streams = GIT_VECTOR_INIT; - git_writestream *stream_start; - int error = 0, close_error; - - git_buf_sanitize(data); - - if ((error = stream_list_init(&stream_start, &filter_streams, filters, target)) < 0) - goto out; - - error = stream_start->write(stream_start, data->ptr, data->size); - -out: - close_error = stream_start->close(stream_start); - stream_list_free(&filter_streams); - /* propagate the stream init or write error */ - return error < 0 ? error : close_error; -} - -int git_filter_list_stream_blob( - git_filter_list *filters, - git_blob *blob, - git_writestream *target) -{ - git_buf in = GIT_BUF_INIT; - - if (buf_from_blob(&in, blob) < 0) - return -1; - - if (filters) - git_oid_cpy(&filters->source.oid, git_blob_id(blob)); - - return git_filter_list_stream_data(filters, &in, target); -} diff --git a/vendor/libgit2/src/filter.h b/vendor/libgit2/src/filter.h deleted file mode 100644 index 5062afba51..0000000000 --- a/vendor/libgit2/src/filter.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_filter_h__ -#define INCLUDE_filter_h__ - -#include "common.h" -#include "attr_file.h" -#include "git2/filter.h" - -/* Amount of file to examine for NUL byte when checking binary-ness */ -#define GIT_FILTER_BYTES_TO_CHECK_NUL 8000 - -/* Possible CRLF values */ -typedef enum { - GIT_CRLF_GUESS = -1, - GIT_CRLF_BINARY = 0, - GIT_CRLF_TEXT, - GIT_CRLF_INPUT, - GIT_CRLF_CRLF, - GIT_CRLF_AUTO, -} git_crlf_t; - -typedef struct { - git_attr_session *attr_session; - git_buf *temp_buf; - uint32_t flags; -} git_filter_options; - -#define GIT_FILTER_OPTIONS_INIT {0} - -extern void git_filter_free(git_filter *filter); - -extern int git_filter_list__load_ext( - git_filter_list **filters, - git_repository *repo, - git_blob *blob, /* can be NULL */ - const char *path, - git_filter_mode_t mode, - git_filter_options *filter_opts); - -/* - * Available filters - */ - -extern git_filter *git_crlf_filter_new(void); -extern git_filter *git_ident_filter_new(void); - -#endif diff --git a/vendor/libgit2/src/fnmatch.c b/vendor/libgit2/src/fnmatch.c deleted file mode 100644 index a2945b8db3..0000000000 --- a/vendor/libgit2/src/fnmatch.c +++ /dev/null @@ -1,235 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -/* - * This file contains code originally derrived from OpenBSD fnmatch.c - * - * Copyright (c) 1989, 1993, 1994 - * The Regents of the University of California. All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * Guido van Rossum. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. 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. - * 3. Neither the name of the University 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 REGENTS 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 REGENTS 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. - */ - -/* - * Function fnmatch() as specified in POSIX 1003.2-1992, section B.6. - * Compares a filename or pathname to a pattern. - */ - -#include -#include -#include - -#include "fnmatch.h" - -#define EOS '\0' - -#define RANGE_MATCH 1 -#define RANGE_NOMATCH 0 -#define RANGE_ERROR (-1) - -static int rangematch(const char *, char, int, char **); - -static int -p_fnmatchx(const char *pattern, const char *string, int flags, size_t recurs) -{ - const char *stringstart; - char *newp; - char c, test; - int recurs_flags = flags & ~FNM_PERIOD; - - if (recurs-- == 0) - return FNM_NORES; - - for (stringstart = string;;) - switch (c = *pattern++) { - case EOS: - if ((flags & FNM_LEADING_DIR) && *string == '/') - return (0); - return (*string == EOS ? 0 : FNM_NOMATCH); - case '?': - if (*string == EOS) - return (FNM_NOMATCH); - if (*string == '/' && (flags & FNM_PATHNAME)) - return (FNM_NOMATCH); - if (*string == '.' && (flags & FNM_PERIOD) && - (string == stringstart || - ((flags & FNM_PATHNAME) && *(string - 1) == '/'))) - return (FNM_NOMATCH); - ++string; - break; - case '*': - c = *pattern; - - /* Let '**' override PATHNAME match for this segment. - * It will be restored if/when we recurse below. - */ - if (c == '*') { - flags &= ~FNM_PATHNAME; - while (c == '*') - c = *++pattern; - if (c == '/') - c = *++pattern; - } - - if (*string == '.' && (flags & FNM_PERIOD) && - (string == stringstart || - ((flags & FNM_PATHNAME) && *(string - 1) == '/'))) - return (FNM_NOMATCH); - - /* Optimize for pattern with * at end or before /. */ - if (c == EOS) { - if (flags & FNM_PATHNAME) - return ((flags & FNM_LEADING_DIR) || - strchr(string, '/') == NULL ? - 0 : FNM_NOMATCH); - else - return (0); - } else if (c == '/' && (flags & FNM_PATHNAME)) { - if ((string = strchr(string, '/')) == NULL) - return (FNM_NOMATCH); - break; - } - - /* General case, use recursion. */ - while ((test = *string) != EOS) { - int e; - - e = p_fnmatchx(pattern, string, recurs_flags, recurs); - if (e != FNM_NOMATCH) - return e; - if (test == '/' && (flags & FNM_PATHNAME)) - break; - ++string; - } - return (FNM_NOMATCH); - case '[': - if (*string == EOS) - return (FNM_NOMATCH); - if (*string == '/' && (flags & FNM_PATHNAME)) - return (FNM_NOMATCH); - if (*string == '.' && (flags & FNM_PERIOD) && - (string == stringstart || - ((flags & FNM_PATHNAME) && *(string - 1) == '/'))) - return (FNM_NOMATCH); - - switch (rangematch(pattern, *string, flags, &newp)) { - case RANGE_ERROR: - /* not a good range, treat as normal text */ - goto normal; - case RANGE_MATCH: - pattern = newp; - break; - case RANGE_NOMATCH: - return (FNM_NOMATCH); - } - ++string; - break; - case '\\': - if (!(flags & FNM_NOESCAPE)) { - if ((c = *pattern++) == EOS) { - c = '\\'; - --pattern; - } - } - /* FALLTHROUGH */ - default: - normal: - if (c != *string && !((flags & FNM_CASEFOLD) && - (git__tolower((unsigned char)c) == - git__tolower((unsigned char)*string)))) - return (FNM_NOMATCH); - ++string; - break; - } - /* NOTREACHED */ -} - -static int -rangematch(const char *pattern, char test, int flags, char **newp) -{ - int negate, ok; - char c, c2; - - /* - * A bracket expression starting with an unquoted circumflex - * character produces unspecified results (IEEE 1003.2-1992, - * 3.13.2). This implementation treats it like '!', for - * consistency with the regular expression syntax. - * J.T. Conklin (conklin@ngai.kaleida.com) - */ - if ((negate = (*pattern == '!' || *pattern == '^')) != 0) - ++pattern; - - if (flags & FNM_CASEFOLD) - test = (char)git__tolower((unsigned char)test); - - /* - * A right bracket shall lose its special meaning and represent - * itself in a bracket expression if it occurs first in the list. - * -- POSIX.2 2.8.3.2 - */ - ok = 0; - c = *pattern++; - do { - if (c == '\\' && !(flags & FNM_NOESCAPE)) - c = *pattern++; - if (c == EOS) - return (RANGE_ERROR); - if (c == '/' && (flags & FNM_PATHNAME)) - return (RANGE_NOMATCH); - if ((flags & FNM_CASEFOLD)) - c = (char)git__tolower((unsigned char)c); - if (*pattern == '-' - && (c2 = *(pattern+1)) != EOS && c2 != ']') { - pattern += 2; - if (c2 == '\\' && !(flags & FNM_NOESCAPE)) - c2 = *pattern++; - if (c2 == EOS) - return (RANGE_ERROR); - if (flags & FNM_CASEFOLD) - c2 = (char)git__tolower((unsigned char)c2); - if (c <= test && test <= c2) - ok = 1; - } else if (c == test) - ok = 1; - } while ((c = *pattern++) != ']'); - - *newp = (char *)pattern; - return (ok == negate ? RANGE_NOMATCH : RANGE_MATCH); -} - -int -p_fnmatch(const char *pattern, const char *string, int flags) -{ - return p_fnmatchx(pattern, string, flags, 64); -} - diff --git a/vendor/libgit2/src/fnmatch.h b/vendor/libgit2/src/fnmatch.h deleted file mode 100644 index 88af459397..0000000000 --- a/vendor/libgit2/src/fnmatch.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (C) 2008 The Android Open Source Project - * 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. - * - * 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. - */ -#ifndef INCLUDE_fnmatch__compat_h__ -#define INCLUDE_fnmatch__compat_h__ - -#include "common.h" - -#define FNM_NOMATCH 1 /* Match failed. */ -#define FNM_NOSYS 2 /* Function not supported (unused). */ -#define FNM_NORES 3 /* Out of resources */ - -#define FNM_NOESCAPE 0x01 /* Disable backslash escaping. */ -#define FNM_PATHNAME 0x02 /* Slash must be matched by slash. */ -#define FNM_PERIOD 0x04 /* Period must be matched by period. */ -#define FNM_LEADING_DIR 0x08 /* Ignore / after Imatch. */ -#define FNM_CASEFOLD 0x10 /* Case insensitive search. */ - -#define FNM_IGNORECASE FNM_CASEFOLD -#define FNM_FILE_NAME FNM_PATHNAME - -extern int p_fnmatch(const char *pattern, const char *string, int flags); - -#endif /* _FNMATCH_H */ - diff --git a/vendor/libgit2/src/global.c b/vendor/libgit2/src/global.c deleted file mode 100644 index 3f20bfd319..0000000000 --- a/vendor/libgit2/src/global.c +++ /dev/null @@ -1,419 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#include "common.h" -#include "global.h" -#include "hash.h" -#include "sysdir.h" -#include "git2/global.h" -#include "git2/sys/openssl.h" -#include "thread-utils.h" - - -git_mutex git__mwindow_mutex; - -#define MAX_SHUTDOWN_CB 8 - -#ifdef GIT_OPENSSL -# include -SSL_CTX *git__ssl_ctx; -# ifdef GIT_THREADS -static git_mutex *openssl_locks; -# endif -#endif - -static git_global_shutdown_fn git__shutdown_callbacks[MAX_SHUTDOWN_CB]; -static git_atomic git__n_shutdown_callbacks; -static git_atomic git__n_inits; - -void git__on_shutdown(git_global_shutdown_fn callback) -{ - int count = git_atomic_inc(&git__n_shutdown_callbacks); - assert(count <= MAX_SHUTDOWN_CB && count > 0); - git__shutdown_callbacks[count - 1] = callback; -} - -static void git__global_state_cleanup(git_global_st *st) -{ - if (!st) - return; - - git__free(st->error_t.message); - st->error_t.message = NULL; -} - -static void git__shutdown(void) -{ - int pos; - - /* Shutdown subsystems that have registered */ - for (pos = git_atomic_get(&git__n_shutdown_callbacks); pos > 0; pos = git_atomic_dec(&git__n_shutdown_callbacks)) { - git_global_shutdown_fn cb = git__swap(git__shutdown_callbacks[pos - 1], NULL); - if (cb != NULL) - cb(); - } -} - -#if defined(GIT_THREADS) && defined(GIT_OPENSSL) -void openssl_locking_function(int mode, int n, const char *file, int line) -{ - int lock; - - GIT_UNUSED(file); - GIT_UNUSED(line); - - lock = mode & CRYPTO_LOCK; - - if (lock) { - git_mutex_lock(&openssl_locks[n]); - } else { - git_mutex_unlock(&openssl_locks[n]); - } -} - -static void shutdown_ssl_locking(void) -{ - int num_locks, i; - - num_locks = CRYPTO_num_locks(); - CRYPTO_set_locking_callback(NULL); - - for (i = 0; i < num_locks; ++i) - git_mutex_free(openssl_locks); - git__free(openssl_locks); -} -#endif - -static void init_ssl(void) -{ -#ifdef GIT_OPENSSL - long ssl_opts = SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3; - - /* Older OpenSSL and MacOS OpenSSL doesn't have this */ -#ifdef SSL_OP_NO_COMPRESSION - ssl_opts |= SSL_OP_NO_COMPRESSION; -#endif - - SSL_load_error_strings(); - OpenSSL_add_ssl_algorithms(); - /* - * Load SSLv{2,3} and TLSv1 so that we can talk with servers - * which use the SSL hellos, which are often used for - * compatibility. We then disable SSL so we only allow OpenSSL - * to speak TLSv1 to perform the encryption itself. - */ - git__ssl_ctx = SSL_CTX_new(SSLv23_method()); - SSL_CTX_set_options(git__ssl_ctx, ssl_opts); - SSL_CTX_set_mode(git__ssl_ctx, SSL_MODE_AUTO_RETRY); - SSL_CTX_set_verify(git__ssl_ctx, SSL_VERIFY_NONE, NULL); - if (!SSL_CTX_set_default_verify_paths(git__ssl_ctx)) { - SSL_CTX_free(git__ssl_ctx); - git__ssl_ctx = NULL; - } -#endif -} - -/** - * This function aims to clean-up the SSL context which - * we allocated. - */ -static void uninit_ssl(void) -{ -#ifdef GIT_OPENSSL - if (git__ssl_ctx) { - SSL_CTX_free(git__ssl_ctx); - git__ssl_ctx = NULL; - } -#endif -} - -int git_openssl_set_locking(void) -{ -#ifdef GIT_OPENSSL -# ifdef GIT_THREADS - int num_locks, i; - - num_locks = CRYPTO_num_locks(); - openssl_locks = git__calloc(num_locks, sizeof(git_mutex)); - GITERR_CHECK_ALLOC(openssl_locks); - - for (i = 0; i < num_locks; i++) { - if (git_mutex_init(&openssl_locks[i]) != 0) { - giterr_set(GITERR_SSL, "failed to initialize openssl locks"); - return -1; - } - } - - CRYPTO_set_locking_callback(openssl_locking_function); - git__on_shutdown(shutdown_ssl_locking); - return 0; -# else - giterr_set(GITERR_THREAD, "libgit2 as not built with threads"); - return -1; -# endif -#else - giterr_set(GITERR_SSL, "libgit2 was not built with OpenSSL support"); - return -1; -#endif -} - -/** - * Handle the global state with TLS - * - * If libgit2 is built with GIT_THREADS enabled, - * the `git_libgit2_init()` function must be called - * before calling any other function of the library. - * - * This function allocates a TLS index (using pthreads - * or the native Win32 API) to store the global state - * on a per-thread basis. - * - * Any internal method that requires global state will - * then call `git__global_state()` which returns a pointer - * to the global state structure; this pointer is lazily - * allocated on each thread. - * - * Before shutting down the library, the - * `git_libgit2_shutdown` method must be called to free - * the previously reserved TLS index. - * - * If libgit2 is built without threading support, the - * `git__global_statestate()` call returns a pointer to a single, - * statically allocated global state. The `git_thread_` - * functions are not available in that case. - */ - -/* - * `git_libgit2_init()` allows subsystems to perform global setup, - * which may take place in the global scope. An explicit memory - * fence exists at the exit of `git_libgit2_init()`. Without this, - * CPU cores are free to reorder cache invalidation of `_tls_init` - * before cache invalidation of the subsystems' newly written global - * state. - */ -#if defined(GIT_THREADS) && defined(GIT_WIN32) - -static DWORD _tls_index; -static volatile LONG _mutex = 0; - -static int synchronized_threads_init(void) -{ - int error; - - _tls_index = TlsAlloc(); - if (git_mutex_init(&git__mwindow_mutex)) - return -1; - - /* Initialize any other subsystems that have global state */ - if ((error = git_hash_global_init()) >= 0) - error = git_sysdir_global_init(); - - win32_pthread_initialize(); - - return error; -} - -int git_libgit2_init(void) -{ - int ret; - - /* Enter the lock */ - while (InterlockedCompareExchange(&_mutex, 1, 0)) { Sleep(0); } - - /* Only do work on a 0 -> 1 transition of the refcount */ - if ((ret = git_atomic_inc(&git__n_inits)) == 1) { - if (synchronized_threads_init() < 0) - ret = -1; - } - - /* Exit the lock */ - InterlockedExchange(&_mutex, 0); - - return ret; -} - -static void synchronized_threads_shutdown(void) -{ - /* Shut down any subsystems that have global state */ - git__shutdown(); - - git__free_tls_data(); - - TlsFree(_tls_index); - git_mutex_free(&git__mwindow_mutex); -} - -int git_libgit2_shutdown(void) -{ - int ret; - - /* Enter the lock */ - while (InterlockedCompareExchange(&_mutex, 1, 0)) { Sleep(0); } - - /* Only do work on a 1 -> 0 transition of the refcount */ - if ((ret = git_atomic_dec(&git__n_inits)) == 0) - synchronized_threads_shutdown(); - - /* Exit the lock */ - InterlockedExchange(&_mutex, 0); - - return ret; -} - -git_global_st *git__global_state(void) -{ - void *ptr; - - assert(git_atomic_get(&git__n_inits) > 0); - - if ((ptr = TlsGetValue(_tls_index)) != NULL) - return ptr; - - ptr = git__malloc(sizeof(git_global_st)); - if (!ptr) - return NULL; - - memset(ptr, 0x0, sizeof(git_global_st)); - TlsSetValue(_tls_index, ptr); - return ptr; -} - -/** - * Free the TLS data associated with this thread. - * This should only be used by the thread as it - * is exiting. - */ -void git__free_tls_data(void) -{ - void *ptr = TlsGetValue(_tls_index); - if (!ptr) - return; - - git__global_state_cleanup(ptr); - git__free(ptr); - TlsSetValue(_tls_index, NULL); -} - -#elif defined(GIT_THREADS) && defined(_POSIX_THREADS) - -static pthread_key_t _tls_key; -static pthread_once_t _once_init = PTHREAD_ONCE_INIT; -int init_error = 0; - -static void cb__free_status(void *st) -{ - git__global_state_cleanup(st); - git__free(st); -} - -static void init_once(void) -{ - if ((init_error = git_mutex_init(&git__mwindow_mutex)) != 0) - return; - pthread_key_create(&_tls_key, &cb__free_status); - - - /* Initialize any other subsystems that have global state */ - if ((init_error = git_hash_global_init()) >= 0) - init_error = git_sysdir_global_init(); - - /* OpenSSL needs to be initialized from the main thread */ - init_ssl(); - - GIT_MEMORY_BARRIER; -} - -int git_libgit2_init(void) -{ - int ret; - - pthread_once(&_once_init, init_once); - ret = git_atomic_inc(&git__n_inits); - - return init_error ? init_error : ret; -} - -int git_libgit2_shutdown(void) -{ - void *ptr = NULL; - pthread_once_t new_once = PTHREAD_ONCE_INIT; - int ret; - - if ((ret = git_atomic_dec(&git__n_inits)) != 0) - return ret; - - /* Shut down any subsystems that have global state */ - git__shutdown(); - uninit_ssl(); - - ptr = pthread_getspecific(_tls_key); - pthread_setspecific(_tls_key, NULL); - - git__global_state_cleanup(ptr); - git__free(ptr); - - pthread_key_delete(_tls_key); - git_mutex_free(&git__mwindow_mutex); - _once_init = new_once; - - return 0; -} - -git_global_st *git__global_state(void) -{ - void *ptr; - - assert(git_atomic_get(&git__n_inits) > 0); - - if ((ptr = pthread_getspecific(_tls_key)) != NULL) - return ptr; - - ptr = git__malloc(sizeof(git_global_st)); - if (!ptr) - return NULL; - - memset(ptr, 0x0, sizeof(git_global_st)); - pthread_setspecific(_tls_key, ptr); - return ptr; -} - -#else - -static git_global_st __state; - -int git_libgit2_init(void) -{ - static int ssl_inited = 0; - - if (!ssl_inited) { - init_ssl(); - ssl_inited = 1; - } - - return git_atomic_inc(&git__n_inits); -} - -int git_libgit2_shutdown(void) -{ - int ret; - - /* Shut down any subsystems that have global state */ - if ((ret = git_atomic_dec(&git__n_inits)) != 0) - return ret; - - git__shutdown(); - git__global_state_cleanup(&__state); - uninit_ssl(); - - return 0; -} - -git_global_st *git__global_state(void) -{ - return &__state; -} - -#endif /* GIT_THREADS */ diff --git a/vendor/libgit2/src/global.h b/vendor/libgit2/src/global.h deleted file mode 100644 index fdad6ba899..0000000000 --- a/vendor/libgit2/src/global.h +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_global_h__ -#define INCLUDE_global_h__ - -#include "common.h" -#include "mwindow.h" -#include "hash.h" - -typedef struct { - git_error *last_error; - git_error error_t; - char oid_fmt[GIT_OID_HEXSZ+1]; -} git_global_st; - -#ifdef GIT_OPENSSL -# include -extern SSL_CTX *git__ssl_ctx; -#endif - -git_global_st *git__global_state(void); - -extern git_mutex git__mwindow_mutex; - -#define GIT_GLOBAL (git__global_state()) - -typedef void (*git_global_shutdown_fn)(void); - -extern void git__on_shutdown(git_global_shutdown_fn callback); - -extern void git__free_tls_data(void); - -#endif diff --git a/vendor/libgit2/src/graph.c b/vendor/libgit2/src/graph.c deleted file mode 100644 index 8accd808c6..0000000000 --- a/vendor/libgit2/src/graph.c +++ /dev/null @@ -1,192 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#include "revwalk.h" -#include "merge.h" -#include "git2/graph.h" - -static int interesting(git_pqueue *list, git_commit_list *roots) -{ - unsigned int i; - - for (i = 0; i < git_pqueue_size(list); i++) { - git_commit_list_node *commit = git_pqueue_get(list, i); - if ((commit->flags & STALE) == 0) - return 1; - } - - while(roots) { - if ((roots->item->flags & STALE) == 0) - return 1; - roots = roots->next; - } - - return 0; -} - -static int mark_parents(git_revwalk *walk, git_commit_list_node *one, - git_commit_list_node *two) -{ - unsigned int i; - git_commit_list *roots = NULL; - git_pqueue list; - - /* if the commit is repeated, we have a our merge base already */ - if (one == two) { - one->flags |= PARENT1 | PARENT2 | RESULT; - return 0; - } - - if (git_pqueue_init(&list, 0, 2, git_commit_list_time_cmp) < 0) - return -1; - - if (git_commit_list_parse(walk, one) < 0) - goto on_error; - one->flags |= PARENT1; - if (git_pqueue_insert(&list, one) < 0) - goto on_error; - - if (git_commit_list_parse(walk, two) < 0) - goto on_error; - two->flags |= PARENT2; - if (git_pqueue_insert(&list, two) < 0) - goto on_error; - - /* as long as there are non-STALE commits */ - while (interesting(&list, roots)) { - git_commit_list_node *commit = git_pqueue_pop(&list); - int flags; - - if (commit == NULL) - break; - - flags = commit->flags & (PARENT1 | PARENT2 | STALE); - if (flags == (PARENT1 | PARENT2)) { - if (!(commit->flags & RESULT)) - commit->flags |= RESULT; - /* we mark the parents of a merge stale */ - flags |= STALE; - } - - for (i = 0; i < commit->out_degree; i++) { - git_commit_list_node *p = commit->parents[i]; - if ((p->flags & flags) == flags) - continue; - - if (git_commit_list_parse(walk, p) < 0) - goto on_error; - - p->flags |= flags; - if (git_pqueue_insert(&list, p) < 0) - goto on_error; - } - - /* Keep track of root commits, to make sure the path gets marked */ - if (commit->out_degree == 0) { - if (git_commit_list_insert(commit, &roots) == NULL) - goto on_error; - } - } - - git_commit_list_free(&roots); - git_pqueue_free(&list); - return 0; - -on_error: - git_commit_list_free(&roots); - git_pqueue_free(&list); - return -1; -} - - -static int ahead_behind(git_commit_list_node *one, git_commit_list_node *two, - size_t *ahead, size_t *behind) -{ - git_commit_list_node *commit; - git_pqueue pq; - int error = 0, i; - *ahead = 0; - *behind = 0; - - if (git_pqueue_init(&pq, 0, 2, git_commit_list_time_cmp) < 0) - return -1; - - if ((error = git_pqueue_insert(&pq, one)) < 0 || - (error = git_pqueue_insert(&pq, two)) < 0) - goto done; - - while ((commit = git_pqueue_pop(&pq)) != NULL) { - if (commit->flags & RESULT || - (commit->flags & (PARENT1 | PARENT2)) == (PARENT1 | PARENT2)) - continue; - else if (commit->flags & PARENT1) - (*ahead)++; - else if (commit->flags & PARENT2) - (*behind)++; - - for (i = 0; i < commit->out_degree; i++) { - git_commit_list_node *p = commit->parents[i]; - if ((error = git_pqueue_insert(&pq, p)) < 0) - goto done; - } - commit->flags |= RESULT; - } - -done: - git_pqueue_free(&pq); - return error; -} - -int git_graph_ahead_behind(size_t *ahead, size_t *behind, git_repository *repo, - const git_oid *local, const git_oid *upstream) -{ - git_revwalk *walk; - git_commit_list_node *commit_u, *commit_l; - - if (git_revwalk_new(&walk, repo) < 0) - return -1; - - commit_u = git_revwalk__commit_lookup(walk, upstream); - if (commit_u == NULL) - goto on_error; - - commit_l = git_revwalk__commit_lookup(walk, local); - if (commit_l == NULL) - goto on_error; - - if (mark_parents(walk, commit_l, commit_u) < 0) - goto on_error; - if (ahead_behind(commit_l, commit_u, ahead, behind) < 0) - goto on_error; - - git_revwalk_free(walk); - - return 0; - -on_error: - git_revwalk_free(walk); - return -1; -} - -int git_graph_descendant_of(git_repository *repo, const git_oid *commit, const git_oid *ancestor) -{ - git_oid merge_base; - int error; - - if (git_oid_equal(commit, ancestor)) - return 0; - - error = git_merge_base(&merge_base, repo, commit, ancestor); - /* No merge-base found, it's not a descendant */ - if (error == GIT_ENOTFOUND) - return 0; - - if (error < 0) - return error; - - return git_oid_equal(&merge_base, ancestor); -} diff --git a/vendor/libgit2/src/hash.c b/vendor/libgit2/src/hash.c deleted file mode 100644 index f3645a9139..0000000000 --- a/vendor/libgit2/src/hash.c +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#include "common.h" -#include "hash.h" - -int git_hash_buf(git_oid *out, const void *data, size_t len) -{ - git_hash_ctx ctx; - int error = 0; - - if (git_hash_ctx_init(&ctx) < 0) - return -1; - - if ((error = git_hash_update(&ctx, data, len)) >= 0) - error = git_hash_final(out, &ctx); - - git_hash_ctx_cleanup(&ctx); - - return error; -} - -int git_hash_vec(git_oid *out, git_buf_vec *vec, size_t n) -{ - git_hash_ctx ctx; - size_t i; - int error = 0; - - if (git_hash_ctx_init(&ctx) < 0) - return -1; - - for (i = 0; i < n; i++) { - if ((error = git_hash_update(&ctx, vec[i].data, vec[i].len)) < 0) - goto done; - } - - error = git_hash_final(out, &ctx); - -done: - git_hash_ctx_cleanup(&ctx); - - return error; -} diff --git a/vendor/libgit2/src/hash.h b/vendor/libgit2/src/hash.h deleted file mode 100644 index 0bc02a8a99..0000000000 --- a/vendor/libgit2/src/hash.h +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_hash_h__ -#define INCLUDE_hash_h__ - -#include "git2/oid.h" - -typedef struct git_hash_prov git_hash_prov; -typedef struct git_hash_ctx git_hash_ctx; - -int git_hash_global_init(void); -int git_hash_ctx_init(git_hash_ctx *ctx); -void git_hash_ctx_cleanup(git_hash_ctx *ctx); - -#if defined(GIT_COMMON_CRYPTO) -# include "hash/hash_common_crypto.h" -#elif defined(OPENSSL_SHA1) -# include "hash/hash_openssl.h" -#elif defined(WIN32_SHA1) -# include "hash/hash_win32.h" -#else -# include "hash/hash_generic.h" -#endif - -typedef struct { - void *data; - size_t len; -} git_buf_vec; - -int git_hash_init(git_hash_ctx *c); -int git_hash_update(git_hash_ctx *c, const void *data, size_t len); -int git_hash_final(git_oid *out, git_hash_ctx *c); - -int git_hash_buf(git_oid *out, const void *data, size_t len); -int git_hash_vec(git_oid *out, git_buf_vec *vec, size_t n); - -#endif /* INCLUDE_hash_h__ */ diff --git a/vendor/libgit2/src/hash/hash_common_crypto.h b/vendor/libgit2/src/hash/hash_common_crypto.h deleted file mode 100644 index eeeddd0ccc..0000000000 --- a/vendor/libgit2/src/hash/hash_common_crypto.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#ifndef INCLUDE_hash_common_crypto_h__ -#define INCLUDE_hash_common_crypto_h__ - -#include "hash.h" - -#include - -struct git_hash_ctx { - CC_SHA1_CTX c; -}; - -#define git_hash_global_init() 0 -#define git_hash_ctx_init(ctx) git_hash_init(ctx) -#define git_hash_ctx_cleanup(ctx) - -GIT_INLINE(int) git_hash_init(git_hash_ctx *ctx) -{ - assert(ctx); - CC_SHA1_Init(&ctx->c); - return 0; -} - -GIT_INLINE(int) git_hash_update(git_hash_ctx *ctx, const void *data, size_t len) -{ - assert(ctx); - CC_SHA1_Update(&ctx->c, data, len); - return 0; -} - -GIT_INLINE(int) git_hash_final(git_oid *out, git_hash_ctx *ctx) -{ - assert(ctx); - CC_SHA1_Final(out->id, &ctx->c); - return 0; -} - -#endif /* INCLUDE_hash_common_crypto_h__ */ diff --git a/vendor/libgit2/src/hash/hash_generic.c b/vendor/libgit2/src/hash/hash_generic.c deleted file mode 100644 index 472a7a6968..0000000000 --- a/vendor/libgit2/src/hash/hash_generic.c +++ /dev/null @@ -1,288 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#include "common.h" -#include "hash.h" -#include "hash/hash_generic.h" - -#if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) - -/* - * Force usage of rol or ror by selecting the one with the smaller constant. - * It _can_ generate slightly smaller code (a constant of 1 is special), but - * perhaps more importantly it's possibly faster on any uarch that does a - * rotate with a loop. - */ - -#define SHA_ASM(op, x, n) (__extension__ ({ unsigned int __res; __asm__(op " %1,%0":"=r" (__res):"i" (n), "0" (x)); __res; })) -#define SHA_ROL(x,n) SHA_ASM("rol", x, n) -#define SHA_ROR(x,n) SHA_ASM("ror", x, n) - -#else - -#define SHA_ROT(X,l,r) (((X) << (l)) | ((X) >> (r))) -#define SHA_ROL(X,n) SHA_ROT(X,n,32-(n)) -#define SHA_ROR(X,n) SHA_ROT(X,32-(n),n) - -#endif - -/* - * If you have 32 registers or more, the compiler can (and should) - * try to change the array[] accesses into registers. However, on - * machines with less than ~25 registers, that won't really work, - * and at least gcc will make an unholy mess of it. - * - * So to avoid that mess which just slows things down, we force - * the stores to memory to actually happen (we might be better off - * with a 'W(t)=(val);asm("":"+m" (W(t))' there instead, as - * suggested by Artur Skawina - that will also make gcc unable to - * try to do the silly "optimize away loads" part because it won't - * see what the value will be). - * - * Ben Herrenschmidt reports that on PPC, the C version comes close - * to the optimized asm with this (ie on PPC you don't want that - * 'volatile', since there are lots of registers). - * - * On ARM we get the best code generation by forcing a full memory barrier - * between each SHA_ROUND, otherwise gcc happily get wild with spilling and - * the stack frame size simply explode and performance goes down the drain. - */ - -#if defined(__i386__) || defined(__x86_64__) - #define setW(x, val) (*(volatile unsigned int *)&W(x) = (val)) -#elif defined(__GNUC__) && defined(__arm__) - #define setW(x, val) do { W(x) = (val); __asm__("":::"memory"); } while (0) -#else - #define setW(x, val) (W(x) = (val)) -#endif - -/* - * Performance might be improved if the CPU architecture is OK with - * unaligned 32-bit loads and a fast ntohl() is available. - * Otherwise fall back to byte loads and shifts which is portable, - * and is faster on architectures with memory alignment issues. - */ - -#if defined(__i386__) || defined(__x86_64__) || \ - defined(_M_IX86) || defined(_M_X64) || \ - defined(__ppc__) || defined(__ppc64__) || \ - defined(__powerpc__) || defined(__powerpc64__) || \ - defined(__s390__) || defined(__s390x__) - -#define get_be32(p) ntohl(*(const unsigned int *)(p)) -#define put_be32(p, v) do { *(unsigned int *)(p) = htonl(v); } while (0) - -#else - -#define get_be32(p) ( \ - (*((const unsigned char *)(p) + 0) << 24) | \ - (*((const unsigned char *)(p) + 1) << 16) | \ - (*((const unsigned char *)(p) + 2) << 8) | \ - (*((const unsigned char *)(p) + 3) << 0) ) -#define put_be32(p, v) do { \ - unsigned int __v = (v); \ - *((unsigned char *)(p) + 0) = __v >> 24; \ - *((unsigned char *)(p) + 1) = __v >> 16; \ - *((unsigned char *)(p) + 2) = __v >> 8; \ - *((unsigned char *)(p) + 3) = __v >> 0; } while (0) - -#endif - -/* This "rolls" over the 512-bit array */ -#define W(x) (array[(x)&15]) - -/* - * Where do we get the source from? The first 16 iterations get it from - * the input data, the next mix it from the 512-bit array. - */ -#define SHA_SRC(t) get_be32(data + t) -#define SHA_MIX(t) SHA_ROL(W(t+13) ^ W(t+8) ^ W(t+2) ^ W(t), 1) - -#define SHA_ROUND(t, input, fn, constant, A, B, C, D, E) do { \ - unsigned int TEMP = input(t); setW(t, TEMP); \ - E += TEMP + SHA_ROL(A,5) + (fn) + (constant); \ - B = SHA_ROR(B, 2); } while (0) - -#define T_0_15(t, A, B, C, D, E) SHA_ROUND(t, SHA_SRC, (((C^D)&B)^D) , 0x5a827999, A, B, C, D, E ) -#define T_16_19(t, A, B, C, D, E) SHA_ROUND(t, SHA_MIX, (((C^D)&B)^D) , 0x5a827999, A, B, C, D, E ) -#define T_20_39(t, A, B, C, D, E) SHA_ROUND(t, SHA_MIX, (B^C^D) , 0x6ed9eba1, A, B, C, D, E ) -#define T_40_59(t, A, B, C, D, E) SHA_ROUND(t, SHA_MIX, ((B&C)+(D&(B^C))) , 0x8f1bbcdc, A, B, C, D, E ) -#define T_60_79(t, A, B, C, D, E) SHA_ROUND(t, SHA_MIX, (B^C^D) , 0xca62c1d6, A, B, C, D, E ) - -static void hash__block(git_hash_ctx *ctx, const unsigned int *data) -{ - unsigned int A,B,C,D,E; - unsigned int array[16]; - - A = ctx->H[0]; - B = ctx->H[1]; - C = ctx->H[2]; - D = ctx->H[3]; - E = ctx->H[4]; - - /* Round 1 - iterations 0-16 take their input from 'data' */ - T_0_15( 0, A, B, C, D, E); - T_0_15( 1, E, A, B, C, D); - T_0_15( 2, D, E, A, B, C); - T_0_15( 3, C, D, E, A, B); - T_0_15( 4, B, C, D, E, A); - T_0_15( 5, A, B, C, D, E); - T_0_15( 6, E, A, B, C, D); - T_0_15( 7, D, E, A, B, C); - T_0_15( 8, C, D, E, A, B); - T_0_15( 9, B, C, D, E, A); - T_0_15(10, A, B, C, D, E); - T_0_15(11, E, A, B, C, D); - T_0_15(12, D, E, A, B, C); - T_0_15(13, C, D, E, A, B); - T_0_15(14, B, C, D, E, A); - T_0_15(15, A, B, C, D, E); - - /* Round 1 - tail. Input from 512-bit mixing array */ - T_16_19(16, E, A, B, C, D); - T_16_19(17, D, E, A, B, C); - T_16_19(18, C, D, E, A, B); - T_16_19(19, B, C, D, E, A); - - /* Round 2 */ - T_20_39(20, A, B, C, D, E); - T_20_39(21, E, A, B, C, D); - T_20_39(22, D, E, A, B, C); - T_20_39(23, C, D, E, A, B); - T_20_39(24, B, C, D, E, A); - T_20_39(25, A, B, C, D, E); - T_20_39(26, E, A, B, C, D); - T_20_39(27, D, E, A, B, C); - T_20_39(28, C, D, E, A, B); - T_20_39(29, B, C, D, E, A); - T_20_39(30, A, B, C, D, E); - T_20_39(31, E, A, B, C, D); - T_20_39(32, D, E, A, B, C); - T_20_39(33, C, D, E, A, B); - T_20_39(34, B, C, D, E, A); - T_20_39(35, A, B, C, D, E); - T_20_39(36, E, A, B, C, D); - T_20_39(37, D, E, A, B, C); - T_20_39(38, C, D, E, A, B); - T_20_39(39, B, C, D, E, A); - - /* Round 3 */ - T_40_59(40, A, B, C, D, E); - T_40_59(41, E, A, B, C, D); - T_40_59(42, D, E, A, B, C); - T_40_59(43, C, D, E, A, B); - T_40_59(44, B, C, D, E, A); - T_40_59(45, A, B, C, D, E); - T_40_59(46, E, A, B, C, D); - T_40_59(47, D, E, A, B, C); - T_40_59(48, C, D, E, A, B); - T_40_59(49, B, C, D, E, A); - T_40_59(50, A, B, C, D, E); - T_40_59(51, E, A, B, C, D); - T_40_59(52, D, E, A, B, C); - T_40_59(53, C, D, E, A, B); - T_40_59(54, B, C, D, E, A); - T_40_59(55, A, B, C, D, E); - T_40_59(56, E, A, B, C, D); - T_40_59(57, D, E, A, B, C); - T_40_59(58, C, D, E, A, B); - T_40_59(59, B, C, D, E, A); - - /* Round 4 */ - T_60_79(60, A, B, C, D, E); - T_60_79(61, E, A, B, C, D); - T_60_79(62, D, E, A, B, C); - T_60_79(63, C, D, E, A, B); - T_60_79(64, B, C, D, E, A); - T_60_79(65, A, B, C, D, E); - T_60_79(66, E, A, B, C, D); - T_60_79(67, D, E, A, B, C); - T_60_79(68, C, D, E, A, B); - T_60_79(69, B, C, D, E, A); - T_60_79(70, A, B, C, D, E); - T_60_79(71, E, A, B, C, D); - T_60_79(72, D, E, A, B, C); - T_60_79(73, C, D, E, A, B); - T_60_79(74, B, C, D, E, A); - T_60_79(75, A, B, C, D, E); - T_60_79(76, E, A, B, C, D); - T_60_79(77, D, E, A, B, C); - T_60_79(78, C, D, E, A, B); - T_60_79(79, B, C, D, E, A); - - ctx->H[0] += A; - ctx->H[1] += B; - ctx->H[2] += C; - ctx->H[3] += D; - ctx->H[4] += E; -} - -int git_hash_init(git_hash_ctx *ctx) -{ - ctx->size = 0; - - /* Initialize H with the magic constants (see FIPS180 for constants) */ - ctx->H[0] = 0x67452301; - ctx->H[1] = 0xefcdab89; - ctx->H[2] = 0x98badcfe; - ctx->H[3] = 0x10325476; - ctx->H[4] = 0xc3d2e1f0; - - return 0; -} - -int git_hash_update(git_hash_ctx *ctx, const void *data, size_t len) -{ - unsigned int lenW = ctx->size & 63; - - ctx->size += len; - - /* Read the data into W and process blocks as they get full */ - if (lenW) { - unsigned int left = 64 - lenW; - if (len < left) - left = (unsigned int)len; - memcpy(lenW + (char *)ctx->W, data, left); - lenW = (lenW + left) & 63; - len -= left; - data = ((const char *)data + left); - if (lenW) - return 0; - hash__block(ctx, ctx->W); - } - while (len >= 64) { - hash__block(ctx, data); - data = ((const char *)data + 64); - len -= 64; - } - if (len) - memcpy(ctx->W, data, len); - - return 0; -} - -int git_hash_final(git_oid *out, git_hash_ctx *ctx) -{ - static const unsigned char pad[64] = { 0x80 }; - unsigned int padlen[2]; - int i; - - /* Pad with a binary 1 (ie 0x80), then zeroes, then length */ - padlen[0] = htonl((uint32_t)(ctx->size >> 29)); - padlen[1] = htonl((uint32_t)(ctx->size << 3)); - - i = ctx->size & 63; - git_hash_update(ctx, pad, 1+ (63 & (55 - i))); - git_hash_update(ctx, padlen, 8); - - /* Output hash */ - for (i = 0; i < 5; i++) - put_be32(out->id + i*4, ctx->H[i]); - - return 0; -} - diff --git a/vendor/libgit2/src/hash/hash_generic.h b/vendor/libgit2/src/hash/hash_generic.h deleted file mode 100644 index daeb1cda8a..0000000000 --- a/vendor/libgit2/src/hash/hash_generic.h +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#ifndef INCLUDE_hash_generic_h__ -#define INCLUDE_hash_generic_h__ - -#include "hash.h" - -struct git_hash_ctx { - unsigned long long size; - unsigned int H[5]; - unsigned int W[16]; -}; - -#define git_hash_global_init() 0 -#define git_hash_ctx_init(ctx) git_hash_init(ctx) -#define git_hash_ctx_cleanup(ctx) - -#endif /* INCLUDE_hash_generic_h__ */ diff --git a/vendor/libgit2/src/hash/hash_openssl.h b/vendor/libgit2/src/hash/hash_openssl.h deleted file mode 100644 index 9a55d472d0..0000000000 --- a/vendor/libgit2/src/hash/hash_openssl.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#ifndef INCLUDE_hash_openssl_h__ -#define INCLUDE_hash_openssl_h__ - -#include "hash.h" - -#include - -struct git_hash_ctx { - SHA_CTX c; -}; - -#define git_hash_global_init() 0 -#define git_hash_ctx_init(ctx) git_hash_init(ctx) -#define git_hash_ctx_cleanup(ctx) - -GIT_INLINE(int) git_hash_init(git_hash_ctx *ctx) -{ - assert(ctx); - SHA1_Init(&ctx->c); - return 0; -} - -GIT_INLINE(int) git_hash_update(git_hash_ctx *ctx, const void *data, size_t len) -{ - assert(ctx); - SHA1_Update(&ctx->c, data, len); - return 0; -} - -GIT_INLINE(int) git_hash_final(git_oid *out, git_hash_ctx *ctx) -{ - assert(ctx); - SHA1_Final(out->id, &ctx->c); - return 0; -} - -#endif /* INCLUDE_hash_openssl_h__ */ diff --git a/vendor/libgit2/src/hash/hash_win32.c b/vendor/libgit2/src/hash/hash_win32.c deleted file mode 100644 index 6bae53e55a..0000000000 --- a/vendor/libgit2/src/hash/hash_win32.c +++ /dev/null @@ -1,276 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#include "common.h" -#include "global.h" -#include "hash.h" -#include "hash/hash_win32.h" - -#include -#include - -static struct git_hash_prov hash_prov = {0}; - -/* Hash initialization */ - -/* Initialize CNG, if available */ -GIT_INLINE(int) hash_cng_prov_init(void) -{ - char dll_path[MAX_PATH]; - DWORD dll_path_len, size_len; - - /* Only use CNG on Windows 2008 / Vista SP1 or better (Windows 6.0 SP1) */ - if (!git_has_win32_version(6, 0, 1)) - return -1; - - /* Load bcrypt.dll explicitly from the system directory */ - if ((dll_path_len = GetSystemDirectory(dll_path, MAX_PATH)) == 0 || - dll_path_len > MAX_PATH || - StringCchCat(dll_path, MAX_PATH, "\\") < 0 || - StringCchCat(dll_path, MAX_PATH, GIT_HASH_CNG_DLL_NAME) < 0 || - (hash_prov.prov.cng.dll = LoadLibrary(dll_path)) == NULL) - return -1; - - /* Load the function addresses */ - if ((hash_prov.prov.cng.open_algorithm_provider = (hash_win32_cng_open_algorithm_provider_fn)GetProcAddress(hash_prov.prov.cng.dll, "BCryptOpenAlgorithmProvider")) == NULL || - (hash_prov.prov.cng.get_property = (hash_win32_cng_get_property_fn)GetProcAddress(hash_prov.prov.cng.dll, "BCryptGetProperty")) == NULL || - (hash_prov.prov.cng.create_hash = (hash_win32_cng_create_hash_fn)GetProcAddress(hash_prov.prov.cng.dll, "BCryptCreateHash")) == NULL || - (hash_prov.prov.cng.finish_hash = (hash_win32_cng_finish_hash_fn)GetProcAddress(hash_prov.prov.cng.dll, "BCryptFinishHash")) == NULL || - (hash_prov.prov.cng.hash_data = (hash_win32_cng_hash_data_fn)GetProcAddress(hash_prov.prov.cng.dll, "BCryptHashData")) == NULL || - (hash_prov.prov.cng.destroy_hash = (hash_win32_cng_destroy_hash_fn)GetProcAddress(hash_prov.prov.cng.dll, "BCryptDestroyHash")) == NULL || - (hash_prov.prov.cng.close_algorithm_provider = (hash_win32_cng_close_algorithm_provider_fn)GetProcAddress(hash_prov.prov.cng.dll, "BCryptCloseAlgorithmProvider")) == NULL) { - FreeLibrary(hash_prov.prov.cng.dll); - return -1; - } - - /* Load the SHA1 algorithm */ - if (hash_prov.prov.cng.open_algorithm_provider(&hash_prov.prov.cng.handle, GIT_HASH_CNG_HASH_TYPE, NULL, GIT_HASH_CNG_HASH_REUSABLE) < 0) { - FreeLibrary(hash_prov.prov.cng.dll); - return -1; - } - - /* Get storage space for the hash object */ - if (hash_prov.prov.cng.get_property(hash_prov.prov.cng.handle, GIT_HASH_CNG_HASH_OBJECT_LEN, (PBYTE)&hash_prov.prov.cng.hash_object_size, sizeof(DWORD), &size_len, 0) < 0) { - hash_prov.prov.cng.close_algorithm_provider(hash_prov.prov.cng.handle, 0); - FreeLibrary(hash_prov.prov.cng.dll); - return -1; - } - - hash_prov.type = CNG; - return 0; -} - -GIT_INLINE(void) hash_cng_prov_shutdown(void) -{ - hash_prov.prov.cng.close_algorithm_provider(hash_prov.prov.cng.handle, 0); - FreeLibrary(hash_prov.prov.cng.dll); - - hash_prov.type = INVALID; -} - -/* Initialize CryptoAPI */ -GIT_INLINE(int) hash_cryptoapi_prov_init() -{ - if (!CryptAcquireContext(&hash_prov.prov.cryptoapi.handle, NULL, 0, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) - return -1; - - hash_prov.type = CRYPTOAPI; - return 0; -} - -GIT_INLINE(void) hash_cryptoapi_prov_shutdown(void) -{ - CryptReleaseContext(hash_prov.prov.cryptoapi.handle, 0); - - hash_prov.type = INVALID; -} - -static void git_hash_global_shutdown(void) -{ - if (hash_prov.type == CNG) - hash_cng_prov_shutdown(); - else if(hash_prov.type == CRYPTOAPI) - hash_cryptoapi_prov_shutdown(); -} - -int git_hash_global_init(void) -{ - int error = 0; - - if (hash_prov.type != INVALID) - return 0; - - if ((error = hash_cng_prov_init()) < 0) - error = hash_cryptoapi_prov_init(); - - git__on_shutdown(git_hash_global_shutdown); - - return error; -} - -/* CryptoAPI: available in Windows XP and newer */ - -GIT_INLINE(int) hash_ctx_cryptoapi_init(git_hash_ctx *ctx) -{ - ctx->type = CRYPTOAPI; - ctx->prov = &hash_prov; - - return git_hash_init(ctx); -} - -GIT_INLINE(int) hash_cryptoapi_init(git_hash_ctx *ctx) -{ - if (ctx->ctx.cryptoapi.valid) - CryptDestroyHash(ctx->ctx.cryptoapi.hash_handle); - - if (!CryptCreateHash(ctx->prov->prov.cryptoapi.handle, CALG_SHA1, 0, 0, &ctx->ctx.cryptoapi.hash_handle)) { - ctx->ctx.cryptoapi.valid = 0; - return -1; - } - - ctx->ctx.cryptoapi.valid = 1; - return 0; -} - -GIT_INLINE(int) hash_cryptoapi_update(git_hash_ctx *ctx, const void *data, size_t len) -{ - assert(ctx->ctx.cryptoapi.valid); - - if (!CryptHashData(ctx->ctx.cryptoapi.hash_handle, (const BYTE *)data, (DWORD)len, 0)) - return -1; - - return 0; -} - -GIT_INLINE(int) hash_cryptoapi_final(git_oid *out, git_hash_ctx *ctx) -{ - DWORD len = 20; - int error = 0; - - assert(ctx->ctx.cryptoapi.valid); - - if (!CryptGetHashParam(ctx->ctx.cryptoapi.hash_handle, HP_HASHVAL, out->id, &len, 0)) - error = -1; - - CryptDestroyHash(ctx->ctx.cryptoapi.hash_handle); - ctx->ctx.cryptoapi.valid = 0; - - return error; -} - -GIT_INLINE(void) hash_ctx_cryptoapi_cleanup(git_hash_ctx *ctx) -{ - if (ctx->ctx.cryptoapi.valid) - CryptDestroyHash(ctx->ctx.cryptoapi.hash_handle); -} - -/* CNG: Available in Windows Server 2008 and newer */ - -GIT_INLINE(int) hash_ctx_cng_init(git_hash_ctx *ctx) -{ - if ((ctx->ctx.cng.hash_object = git__malloc(hash_prov.prov.cng.hash_object_size)) == NULL) - return -1; - - if (hash_prov.prov.cng.create_hash(hash_prov.prov.cng.handle, &ctx->ctx.cng.hash_handle, ctx->ctx.cng.hash_object, hash_prov.prov.cng.hash_object_size, NULL, 0, 0) < 0) { - git__free(ctx->ctx.cng.hash_object); - return -1; - } - - ctx->type = CNG; - ctx->prov = &hash_prov; - - return 0; -} - -GIT_INLINE(int) hash_cng_init(git_hash_ctx *ctx) -{ - BYTE hash[GIT_OID_RAWSZ]; - - if (!ctx->ctx.cng.updated) - return 0; - - /* CNG needs to be finished to restart */ - if (ctx->prov->prov.cng.finish_hash(ctx->ctx.cng.hash_handle, hash, GIT_OID_RAWSZ, 0) < 0) - return -1; - - ctx->ctx.cng.updated = 0; - - return 0; -} - -GIT_INLINE(int) hash_cng_update(git_hash_ctx *ctx, const void *data, size_t len) -{ - if (ctx->prov->prov.cng.hash_data(ctx->ctx.cng.hash_handle, (PBYTE)data, (ULONG)len, 0) < 0) - return -1; - - return 0; -} - -GIT_INLINE(int) hash_cng_final(git_oid *out, git_hash_ctx *ctx) -{ - if (ctx->prov->prov.cng.finish_hash(ctx->ctx.cng.hash_handle, out->id, GIT_OID_RAWSZ, 0) < 0) - return -1; - - ctx->ctx.cng.updated = 0; - - return 0; -} - -GIT_INLINE(void) hash_ctx_cng_cleanup(git_hash_ctx *ctx) -{ - ctx->prov->prov.cng.destroy_hash(ctx->ctx.cng.hash_handle); - git__free(ctx->ctx.cng.hash_object); -} - -/* Indirection between CryptoAPI and CNG */ - -int git_hash_ctx_init(git_hash_ctx *ctx) -{ - int error = 0; - - assert(ctx); - - /* - * When compiled with GIT_THREADS, the global hash_prov data is - * initialized with git_libgit2_init. Otherwise, it must be initialized - * at first use. - */ - if (hash_prov.type == INVALID && (error = git_hash_global_init()) < 0) - return error; - - memset(ctx, 0x0, sizeof(git_hash_ctx)); - - return (hash_prov.type == CNG) ? hash_ctx_cng_init(ctx) : hash_ctx_cryptoapi_init(ctx); -} - -int git_hash_init(git_hash_ctx *ctx) -{ - assert(ctx && ctx->type); - return (ctx->type == CNG) ? hash_cng_init(ctx) : hash_cryptoapi_init(ctx); -} - -int git_hash_update(git_hash_ctx *ctx, const void *data, size_t len) -{ - assert(ctx && ctx->type); - return (ctx->type == CNG) ? hash_cng_update(ctx, data, len) : hash_cryptoapi_update(ctx, data, len); -} - -int git_hash_final(git_oid *out, git_hash_ctx *ctx) -{ - assert(ctx && ctx->type); - return (ctx->type == CNG) ? hash_cng_final(out, ctx) : hash_cryptoapi_final(out, ctx); -} - -void git_hash_ctx_cleanup(git_hash_ctx *ctx) -{ - assert(ctx); - - if (ctx->type == CNG) - hash_ctx_cng_cleanup(ctx); - else if(ctx->type == CRYPTOAPI) - hash_ctx_cryptoapi_cleanup(ctx); -} diff --git a/vendor/libgit2/src/hash/hash_win32.h b/vendor/libgit2/src/hash/hash_win32.h deleted file mode 100644 index 2eee5ca796..0000000000 --- a/vendor/libgit2/src/hash/hash_win32.h +++ /dev/null @@ -1,140 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#ifndef INCLUDE_hash_win32_h__ -#define INCLUDE_hash_win32_h__ - -#include "common.h" -#include "hash.h" - -#include -#include - -enum hash_win32_prov_type { - INVALID = 0, - CRYPTOAPI, - CNG -}; - -/* - * CryptoAPI is available for hashing on Windows XP and newer. - */ - -struct hash_cryptoapi_prov { - HCRYPTPROV handle; -}; - -/* - * CNG (bcrypt.dll) is significantly more performant than CryptoAPI and is - * preferred, however it is only available on Windows 2008 and newer and - * must therefore be dynamically loaded, and we must inline constants that - * would not exist when building in pre-Windows 2008 environments. - */ - -#define GIT_HASH_CNG_DLL_NAME "bcrypt.dll" - -/* BCRYPT_SHA1_ALGORITHM */ -#define GIT_HASH_CNG_HASH_TYPE L"SHA1" - -/* BCRYPT_OBJECT_LENGTH */ -#define GIT_HASH_CNG_HASH_OBJECT_LEN L"ObjectLength" - -/* BCRYPT_HASH_REUSEABLE_FLAGS */ -#define GIT_HASH_CNG_HASH_REUSABLE 0x00000020 - -/* Function declarations for CNG */ -typedef NTSTATUS (WINAPI *hash_win32_cng_open_algorithm_provider_fn)( - HANDLE /* BCRYPT_ALG_HANDLE */ *phAlgorithm, - LPCWSTR pszAlgId, - LPCWSTR pszImplementation, - DWORD dwFlags); - -typedef NTSTATUS (WINAPI *hash_win32_cng_get_property_fn)( - HANDLE /* BCRYPT_HANDLE */ hObject, - LPCWSTR pszProperty, - PUCHAR pbOutput, - ULONG cbOutput, - ULONG *pcbResult, - ULONG dwFlags); - -typedef NTSTATUS (WINAPI *hash_win32_cng_create_hash_fn)( - HANDLE /* BCRYPT_ALG_HANDLE */ hAlgorithm, - HANDLE /* BCRYPT_HASH_HANDLE */ *phHash, - PUCHAR pbHashObject, ULONG cbHashObject, - PUCHAR pbSecret, - ULONG cbSecret, - ULONG dwFlags); - -typedef NTSTATUS (WINAPI *hash_win32_cng_finish_hash_fn)( - HANDLE /* BCRYPT_HASH_HANDLE */ hHash, - PUCHAR pbOutput, - ULONG cbOutput, - ULONG dwFlags); - -typedef NTSTATUS (WINAPI *hash_win32_cng_hash_data_fn)( - HANDLE /* BCRYPT_HASH_HANDLE */ hHash, - PUCHAR pbInput, - ULONG cbInput, - ULONG dwFlags); - -typedef NTSTATUS (WINAPI *hash_win32_cng_destroy_hash_fn)( - HANDLE /* BCRYPT_HASH_HANDLE */ hHash); - -typedef NTSTATUS (WINAPI *hash_win32_cng_close_algorithm_provider_fn)( - HANDLE /* BCRYPT_ALG_HANDLE */ hAlgorithm, - ULONG dwFlags); - -struct hash_cng_prov { - /* DLL for CNG */ - HINSTANCE dll; - - /* Function pointers for CNG */ - hash_win32_cng_open_algorithm_provider_fn open_algorithm_provider; - hash_win32_cng_get_property_fn get_property; - hash_win32_cng_create_hash_fn create_hash; - hash_win32_cng_finish_hash_fn finish_hash; - hash_win32_cng_hash_data_fn hash_data; - hash_win32_cng_destroy_hash_fn destroy_hash; - hash_win32_cng_close_algorithm_provider_fn close_algorithm_provider; - - HANDLE /* BCRYPT_ALG_HANDLE */ handle; - DWORD hash_object_size; -}; - -struct git_hash_prov { - enum hash_win32_prov_type type; - - union { - struct hash_cryptoapi_prov cryptoapi; - struct hash_cng_prov cng; - } prov; -}; - -/* Hash contexts */ - -struct hash_cryptoapi_ctx { - bool valid; - HCRYPTHASH hash_handle; -}; - -struct hash_cng_ctx { - bool updated; - HANDLE /* BCRYPT_HASH_HANDLE */ hash_handle; - PBYTE hash_object; -}; - -struct git_hash_ctx { - enum hash_win32_prov_type type; - git_hash_prov *prov; - - union { - struct hash_cryptoapi_ctx cryptoapi; - struct hash_cng_ctx cng; - } ctx; -}; - -#endif /* INCLUDE_hash_openssl_h__ */ diff --git a/vendor/libgit2/src/hashsig.c b/vendor/libgit2/src/hashsig.c deleted file mode 100644 index e99637d8b5..0000000000 --- a/vendor/libgit2/src/hashsig.c +++ /dev/null @@ -1,359 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#include "git2/sys/hashsig.h" -#include "fileops.h" -#include "util.h" - -typedef uint32_t hashsig_t; -typedef uint64_t hashsig_state; - -#define HASHSIG_SCALE 100 - -#define HASHSIG_MAX_RUN 80 -#define HASHSIG_HASH_START 0x012345678ABCDEF0LL -#define HASHSIG_HASH_SHIFT 5 - -#define HASHSIG_HASH_MIX(S,CH) \ - (S) = ((S) << HASHSIG_HASH_SHIFT) - (S) + (hashsig_state)(CH) - -#define HASHSIG_HEAP_SIZE ((1 << 7) - 1) -#define HASHSIG_HEAP_MIN_SIZE 4 - -typedef int (*hashsig_cmp)(const void *a, const void *b, void *); - -typedef struct { - int size, asize; - hashsig_cmp cmp; - hashsig_t values[HASHSIG_HEAP_SIZE]; -} hashsig_heap; - -struct git_hashsig { - hashsig_heap mins; - hashsig_heap maxs; - size_t lines; - git_hashsig_option_t opt; -}; - -#define HEAP_LCHILD_OF(I) (((I)<<1)+1) -#define HEAP_RCHILD_OF(I) (((I)<<1)+2) -#define HEAP_PARENT_OF(I) (((I)-1)>>1) - -static void hashsig_heap_init(hashsig_heap *h, hashsig_cmp cmp) -{ - h->size = 0; - h->asize = HASHSIG_HEAP_SIZE; - h->cmp = cmp; -} - -static int hashsig_cmp_max(const void *a, const void *b, void *payload) -{ - hashsig_t av = *(const hashsig_t *)a, bv = *(const hashsig_t *)b; - GIT_UNUSED(payload); - return (av < bv) ? -1 : (av > bv) ? 1 : 0; -} - -static int hashsig_cmp_min(const void *a, const void *b, void *payload) -{ - hashsig_t av = *(const hashsig_t *)a, bv = *(const hashsig_t *)b; - GIT_UNUSED(payload); - return (av > bv) ? -1 : (av < bv) ? 1 : 0; -} - -static void hashsig_heap_up(hashsig_heap *h, int el) -{ - int parent_el = HEAP_PARENT_OF(el); - - while (el > 0 && h->cmp(&h->values[parent_el], &h->values[el], NULL) > 0) { - hashsig_t t = h->values[el]; - h->values[el] = h->values[parent_el]; - h->values[parent_el] = t; - - el = parent_el; - parent_el = HEAP_PARENT_OF(el); - } -} - -static void hashsig_heap_down(hashsig_heap *h, int el) -{ - hashsig_t v, lv, rv; - - /* 'el < h->size / 2' tests if el is bottom row of heap */ - - while (el < h->size / 2) { - int lel = HEAP_LCHILD_OF(el), rel = HEAP_RCHILD_OF(el), swapel; - - v = h->values[el]; - lv = h->values[lel]; - rv = h->values[rel]; - - if (h->cmp(&v, &lv, NULL) < 0 && h->cmp(&v, &rv, NULL) < 0) - break; - - swapel = (h->cmp(&lv, &rv, NULL) < 0) ? lel : rel; - - h->values[el] = h->values[swapel]; - h->values[swapel] = v; - - el = swapel; - } -} - -static void hashsig_heap_sort(hashsig_heap *h) -{ - /* only need to do this at the end for signature comparison */ - git__qsort_r(h->values, h->size, sizeof(hashsig_t), h->cmp, NULL); -} - -static void hashsig_heap_insert(hashsig_heap *h, hashsig_t val) -{ - /* if heap is not full, insert new element */ - if (h->size < h->asize) { - h->values[h->size++] = val; - hashsig_heap_up(h, h->size - 1); - } - - /* if heap is full, pop top if new element should replace it */ - else if (h->cmp(&val, &h->values[0], NULL) > 0) { - h->size--; - h->values[0] = h->values[h->size]; - hashsig_heap_down(h, 0); - } - -} - -typedef struct { - int use_ignores; - uint8_t ignore_ch[256]; -} hashsig_in_progress; - -static void hashsig_in_progress_init( - hashsig_in_progress *prog, git_hashsig *sig) -{ - int i; - - /* no more than one can be set */ - assert(!(sig->opt & GIT_HASHSIG_IGNORE_WHITESPACE) || - !(sig->opt & GIT_HASHSIG_SMART_WHITESPACE)); - - if (sig->opt & GIT_HASHSIG_IGNORE_WHITESPACE) { - for (i = 0; i < 256; ++i) - prog->ignore_ch[i] = git__isspace_nonlf(i); - prog->use_ignores = 1; - } else if (sig->opt & GIT_HASHSIG_SMART_WHITESPACE) { - for (i = 0; i < 256; ++i) - prog->ignore_ch[i] = git__isspace(i); - prog->use_ignores = 1; - } else { - memset(prog, 0, sizeof(*prog)); - } -} - -static int hashsig_add_hashes( - git_hashsig *sig, - const uint8_t *data, - size_t size, - hashsig_in_progress *prog) -{ - const uint8_t *scan = data, *end = data + size; - hashsig_state state = HASHSIG_HASH_START; - int use_ignores = prog->use_ignores, len; - uint8_t ch; - - while (scan < end) { - state = HASHSIG_HASH_START; - - for (len = 0; scan < end && len < HASHSIG_MAX_RUN; ) { - ch = *scan; - - if (use_ignores) - for (; scan < end && git__isspace_nonlf(ch); ch = *scan) - ++scan; - else if (sig->opt & - (GIT_HASHSIG_IGNORE_WHITESPACE | GIT_HASHSIG_SMART_WHITESPACE)) - for (; scan < end && ch == '\r'; ch = *scan) - ++scan; - - /* peek at next character to decide what to do next */ - if (sig->opt & GIT_HASHSIG_SMART_WHITESPACE) - use_ignores = (ch == '\n'); - - if (scan >= end) - break; - ++scan; - - /* check run terminator */ - if (ch == '\n' || ch == '\0') { - sig->lines++; - break; - } - - ++len; - HASHSIG_HASH_MIX(state, ch); - } - - if (len > 0) { - hashsig_heap_insert(&sig->mins, (hashsig_t)state); - hashsig_heap_insert(&sig->maxs, (hashsig_t)state); - - while (scan < end && (*scan == '\n' || !*scan)) - ++scan; - } - } - - prog->use_ignores = use_ignores; - - return 0; -} - -static int hashsig_finalize_hashes(git_hashsig *sig) -{ - if (sig->mins.size < HASHSIG_HEAP_MIN_SIZE && - !(sig->opt & GIT_HASHSIG_ALLOW_SMALL_FILES)) { - giterr_set(GITERR_INVALID, - "File too small for similarity signature calculation"); - return GIT_EBUFS; - } - - hashsig_heap_sort(&sig->mins); - hashsig_heap_sort(&sig->maxs); - - return 0; -} - -static git_hashsig *hashsig_alloc(git_hashsig_option_t opts) -{ - git_hashsig *sig = git__calloc(1, sizeof(git_hashsig)); - if (!sig) - return NULL; - - hashsig_heap_init(&sig->mins, hashsig_cmp_min); - hashsig_heap_init(&sig->maxs, hashsig_cmp_max); - sig->opt = opts; - - return sig; -} - -int git_hashsig_create( - git_hashsig **out, - const char *buf, - size_t buflen, - git_hashsig_option_t opts) -{ - int error; - hashsig_in_progress prog; - git_hashsig *sig = hashsig_alloc(opts); - GITERR_CHECK_ALLOC(sig); - - hashsig_in_progress_init(&prog, sig); - - error = hashsig_add_hashes(sig, (const uint8_t *)buf, buflen, &prog); - - if (!error) - error = hashsig_finalize_hashes(sig); - - if (!error) - *out = sig; - else - git_hashsig_free(sig); - - return error; -} - -int git_hashsig_create_fromfile( - git_hashsig **out, - const char *path, - git_hashsig_option_t opts) -{ - uint8_t buf[0x1000]; - ssize_t buflen = 0; - int error = 0, fd; - hashsig_in_progress prog; - git_hashsig *sig = hashsig_alloc(opts); - GITERR_CHECK_ALLOC(sig); - - if ((fd = git_futils_open_ro(path)) < 0) { - git__free(sig); - return fd; - } - - hashsig_in_progress_init(&prog, sig); - - while (!error) { - if ((buflen = p_read(fd, buf, sizeof(buf))) <= 0) { - if ((error = (int)buflen) < 0) - giterr_set(GITERR_OS, - "Read error on '%s' calculating similarity hashes", path); - break; - } - - error = hashsig_add_hashes(sig, buf, buflen, &prog); - } - - p_close(fd); - - if (!error) - error = hashsig_finalize_hashes(sig); - - if (!error) - *out = sig; - else - git_hashsig_free(sig); - - return error; -} - -void git_hashsig_free(git_hashsig *sig) -{ - git__free(sig); -} - -static int hashsig_heap_compare(const hashsig_heap *a, const hashsig_heap *b) -{ - int matches = 0, i, j, cmp; - - assert(a->cmp == b->cmp); - - /* hash heaps are sorted - just look for overlap vs total */ - - for (i = 0, j = 0; i < a->size && j < b->size; ) { - cmp = a->cmp(&a->values[i], &b->values[j], NULL); - - if (cmp < 0) - ++i; - else if (cmp > 0) - ++j; - else { - ++i; ++j; ++matches; - } - } - - return HASHSIG_SCALE * (matches * 2) / (a->size + b->size); -} - -int git_hashsig_compare(const git_hashsig *a, const git_hashsig *b) -{ - /* if we have no elements in either file then each file is either - * empty or blank. if we're ignoring whitespace then the files are - * similar, otherwise they're dissimilar. - */ - if (a->mins.size == 0 && b->mins.size == 0) { - if ((!a->lines && !b->lines) || - (a->opt & GIT_HASHSIG_IGNORE_WHITESPACE)) - return HASHSIG_SCALE; - else - return 0; - } - - /* if we have fewer than the maximum number of elements, then just use - * one array since the two arrays will be the same - */ - if (a->mins.size < HASHSIG_HEAP_SIZE) - return hashsig_heap_compare(&a->mins, &b->mins); - else - return (hashsig_heap_compare(&a->mins, &b->mins) + - hashsig_heap_compare(&a->maxs, &b->maxs)) / 2; -} diff --git a/vendor/libgit2/src/ident.c b/vendor/libgit2/src/ident.c deleted file mode 100644 index 4718ed664c..0000000000 --- a/vendor/libgit2/src/ident.c +++ /dev/null @@ -1,127 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#include "git2/sys/filter.h" -#include "filter.h" -#include "buffer.h" -#include "buf_text.h" - -static int ident_find_id( - const char **id_start, const char **id_end, const char *start, size_t len) -{ - const char *end = start + len, *found = NULL; - - while (len > 3 && (found = memchr(start, '$', len)) != NULL) { - size_t remaining = (size_t)(end - found) - 1; - if (remaining < 3) - return GIT_ENOTFOUND; - - start = found + 1; - len = remaining; - - if (start[0] == 'I' && start[1] == 'd') - break; - } - - if (len < 3 || !found) - return GIT_ENOTFOUND; - *id_start = found; - - if ((found = memchr(start + 2, '$', len - 2)) == NULL) - return GIT_ENOTFOUND; - - *id_end = found + 1; - return 0; -} - -static int ident_insert_id( - git_buf *to, const git_buf *from, const git_filter_source *src) -{ - char oid[GIT_OID_HEXSZ+1]; - const char *id_start, *id_end, *from_end = from->ptr + from->size; - size_t need_size; - - /* replace $Id$ with blob id */ - - if (!git_filter_source_id(src)) - return GIT_PASSTHROUGH; - - git_oid_tostr(oid, sizeof(oid), git_filter_source_id(src)); - - if (ident_find_id(&id_start, &id_end, from->ptr, from->size) < 0) - return GIT_PASSTHROUGH; - - need_size = (size_t)(id_start - from->ptr) + - 5 /* "$Id: " */ + GIT_OID_HEXSZ + 2 /* " $" */ + - (size_t)(from_end - id_end); - - if (git_buf_grow(to, need_size) < 0) - return -1; - - git_buf_set(to, from->ptr, (size_t)(id_start - from->ptr)); - git_buf_put(to, "$Id: ", 5); - git_buf_put(to, oid, GIT_OID_HEXSZ); - git_buf_put(to, " $", 2); - git_buf_put(to, id_end, (size_t)(from_end - id_end)); - - return git_buf_oom(to) ? -1 : 0; -} - -static int ident_remove_id( - git_buf *to, const git_buf *from) -{ - const char *id_start, *id_end, *from_end = from->ptr + from->size; - size_t need_size; - - if (ident_find_id(&id_start, &id_end, from->ptr, from->size) < 0) - return GIT_PASSTHROUGH; - - need_size = (size_t)(id_start - from->ptr) + - 4 /* "$Id$" */ + (size_t)(from_end - id_end); - - if (git_buf_grow(to, need_size) < 0) - return -1; - - git_buf_set(to, from->ptr, (size_t)(id_start - from->ptr)); - git_buf_put(to, "$Id$", 4); - git_buf_put(to, id_end, (size_t)(from_end - id_end)); - - return git_buf_oom(to) ? -1 : 0; -} - -static int ident_apply( - git_filter *self, - void **payload, - git_buf *to, - const git_buf *from, - const git_filter_source *src) -{ - GIT_UNUSED(self); GIT_UNUSED(payload); - - /* Don't filter binary files */ - if (git_buf_text_is_binary(from)) - return GIT_PASSTHROUGH; - - if (git_filter_source_mode(src) == GIT_FILTER_SMUDGE) - return ident_insert_id(to, from, src); - else - return ident_remove_id(to, from); -} - -git_filter *git_ident_filter_new(void) -{ - git_filter *f = git__calloc(1, sizeof(git_filter)); - if (f == NULL) - return NULL; - - f->version = GIT_FILTER_VERSION; - f->attributes = "+ident"; /* apply to files with ident attribute set */ - f->shutdown = git_filter_free; - f->apply = ident_apply; - - return f; -} diff --git a/vendor/libgit2/src/ignore.c b/vendor/libgit2/src/ignore.c deleted file mode 100644 index 0031e4696c..0000000000 --- a/vendor/libgit2/src/ignore.c +++ /dev/null @@ -1,573 +0,0 @@ -#include "git2/ignore.h" -#include "common.h" -#include "ignore.h" -#include "attrcache.h" -#include "path.h" -#include "config.h" -#include "fnmatch.h" - -#define GIT_IGNORE_INTERNAL "[internal]exclude" - -#define GIT_IGNORE_DEFAULT_RULES ".\n..\n.git\n" - -/** - * A negative ignore pattern can match a positive one without - * wildcards if its pattern equals the tail of the positive - * pattern. Thus - * - * foo/bar - * !bar - * - * would result in foo/bar being unignored again. - */ -static int does_negate_pattern(git_attr_fnmatch *rule, git_attr_fnmatch *neg) -{ - char *p; - - if ((rule->flags & GIT_ATTR_FNMATCH_NEGATIVE) == 0 - && (neg->flags & GIT_ATTR_FNMATCH_NEGATIVE) != 0) { - /* - * no chance of matching if rule is shorter than - * the negated one - */ - if (rule->length < neg->length) - return false; - - /* - * shift pattern so its tail aligns with the - * negated pattern - */ - p = rule->pattern + rule->length - neg->length; - if (strcmp(p, neg->pattern) == 0) - return true; - } - - return false; -} - -/** - * A negative ignore can only unignore a file which is given explicitly before, thus - * - * foo - * !foo/bar - * - * does not unignore 'foo/bar' as it's not in the list. However - * - * foo/ - * !foo/bar - * - * does unignore 'foo/bar', as it is contained within the 'foo/' rule. - */ -static int does_negate_rule(int *out, git_vector *rules, git_attr_fnmatch *match) -{ - int error = 0; - size_t i; - git_attr_fnmatch *rule; - char *path; - git_buf buf = GIT_BUF_INIT; - - *out = 0; - - /* path of the file relative to the workdir, so we match the rules in subdirs */ - if (match->containing_dir) { - git_buf_puts(&buf, match->containing_dir); - } - if (git_buf_puts(&buf, match->pattern) < 0) - return -1; - - path = git_buf_detach(&buf); - - git_vector_foreach(rules, i, rule) { - if (!(rule->flags & GIT_ATTR_FNMATCH_HASWILD)) { - if (does_negate_pattern(rule, match)) { - error = 0; - *out = 1; - goto out; - } - else - continue; - } - - /* - * If we're dealing with a directory (which we know via the - * strchr() check) we want to use 'dirname/' as the - * pattern so p_fnmatch() honours FNM_PATHNAME - */ - git_buf_clear(&buf); - if (rule->containing_dir) { - git_buf_puts(&buf, rule->containing_dir); - } - if (!strchr(rule->pattern, '*')) - error = git_buf_printf(&buf, "%s/*", rule->pattern); - else - error = git_buf_puts(&buf, rule->pattern); - - if (error < 0) - goto out; - - if ((error = p_fnmatch(git_buf_cstr(&buf), path, FNM_PATHNAME)) < 0) { - giterr_set(GITERR_INVALID, "error matching pattern"); - goto out; - } - - /* if we found a match, we want to keep this rule */ - if (error != FNM_NOMATCH) { - *out = 1; - error = 0; - goto out; - } - } - - error = 0; - -out: - git__free(path); - git_buf_free(&buf); - return error; -} - -static int parse_ignore_file( - git_repository *repo, git_attr_file *attrs, const char *data) -{ - int error = 0; - int ignore_case = false; - const char *scan = data, *context = NULL; - git_attr_fnmatch *match = NULL; - - if (git_repository__cvar(&ignore_case, repo, GIT_CVAR_IGNORECASE) < 0) - giterr_clear(); - - /* if subdir file path, convert context for file paths */ - if (attrs->entry && - git_path_root(attrs->entry->path) < 0 && - !git__suffixcmp(attrs->entry->path, "/" GIT_IGNORE_FILE)) - context = attrs->entry->path; - - if (git_mutex_lock(&attrs->lock) < 0) { - giterr_set(GITERR_OS, "Failed to lock ignore file"); - return -1; - } - - while (!error && *scan) { - int valid_rule = 1; - - if (!match && !(match = git__calloc(1, sizeof(*match)))) { - error = -1; - break; - } - - match->flags = GIT_ATTR_FNMATCH_ALLOWSPACE | GIT_ATTR_FNMATCH_ALLOWNEG; - - if (!(error = git_attr_fnmatch__parse( - match, &attrs->pool, context, &scan))) - { - match->flags |= GIT_ATTR_FNMATCH_IGNORE; - - if (ignore_case) - match->flags |= GIT_ATTR_FNMATCH_ICASE; - - scan = git__next_line(scan); - - /* if a negative match doesn't actually do anything, throw it away */ - if (match->flags & GIT_ATTR_FNMATCH_NEGATIVE) - error = does_negate_rule(&valid_rule, &attrs->rules, match); - - if (!error && valid_rule) - error = git_vector_insert(&attrs->rules, match); - } - - if (error != 0 || !valid_rule) { - match->pattern = NULL; - - if (error == GIT_ENOTFOUND) - error = 0; - } else { - match = NULL; /* vector now "owns" the match */ - } - } - - git_mutex_unlock(&attrs->lock); - git__free(match); - - return error; -} - -static int push_ignore_file( - git_ignores *ignores, - git_vector *which_list, - const char *base, - const char *filename) -{ - int error = 0; - git_attr_file *file = NULL; - - error = git_attr_cache__get( - &file, ignores->repo, NULL, GIT_ATTR_FILE__FROM_FILE, - base, filename, parse_ignore_file); - if (error < 0) - return error; - - if (file != NULL) { - if ((error = git_vector_insert(which_list, file)) < 0) - git_attr_file__free(file); - } - - return error; -} - -static int push_one_ignore(void *payload, const char *path) -{ - git_ignores *ign = payload; - ign->depth++; - return push_ignore_file(ign, &ign->ign_path, path, GIT_IGNORE_FILE); -} - -static int get_internal_ignores(git_attr_file **out, git_repository *repo) -{ - int error; - - if ((error = git_attr_cache__init(repo)) < 0) - return error; - - error = git_attr_cache__get( - out, repo, NULL, GIT_ATTR_FILE__IN_MEMORY, NULL, GIT_IGNORE_INTERNAL, NULL); - - /* if internal rules list is empty, insert default rules */ - if (!error && !(*out)->rules.length) - error = parse_ignore_file(repo, *out, GIT_IGNORE_DEFAULT_RULES); - - return error; -} - -int git_ignore__for_path( - git_repository *repo, - const char *path, - git_ignores *ignores) -{ - int error = 0; - const char *workdir = git_repository_workdir(repo); - - assert(ignores && path); - - memset(ignores, 0, sizeof(*ignores)); - ignores->repo = repo; - - /* Read the ignore_case flag */ - if ((error = git_repository__cvar( - &ignores->ignore_case, repo, GIT_CVAR_IGNORECASE)) < 0) - goto cleanup; - - if ((error = git_attr_cache__init(repo)) < 0) - goto cleanup; - - /* given a unrooted path in a non-bare repo, resolve it */ - if (workdir && git_path_root(path) < 0) - error = git_path_find_dir(&ignores->dir, path, workdir); - else - error = git_buf_joinpath(&ignores->dir, path, ""); - if (error < 0) - goto cleanup; - - if (workdir && !git__prefixcmp(ignores->dir.ptr, workdir)) - ignores->dir_root = strlen(workdir); - - /* set up internals */ - if ((error = get_internal_ignores(&ignores->ign_internal, repo)) < 0) - goto cleanup; - - /* load .gitignore up the path */ - if (workdir != NULL) { - error = git_path_walk_up( - &ignores->dir, workdir, push_one_ignore, ignores); - if (error < 0) - goto cleanup; - } - - /* load .git/info/exclude */ - error = push_ignore_file( - ignores, &ignores->ign_global, - git_repository_path(repo), GIT_IGNORE_FILE_INREPO); - if (error < 0) - goto cleanup; - - /* load core.excludesfile */ - if (git_repository_attr_cache(repo)->cfg_excl_file != NULL) - error = push_ignore_file( - ignores, &ignores->ign_global, NULL, - git_repository_attr_cache(repo)->cfg_excl_file); - -cleanup: - if (error < 0) - git_ignore__free(ignores); - - return error; -} - -int git_ignore__push_dir(git_ignores *ign, const char *dir) -{ - if (git_buf_joinpath(&ign->dir, ign->dir.ptr, dir) < 0) - return -1; - - ign->depth++; - - return push_ignore_file( - ign, &ign->ign_path, ign->dir.ptr, GIT_IGNORE_FILE); -} - -int git_ignore__pop_dir(git_ignores *ign) -{ - if (ign->ign_path.length > 0) { - git_attr_file *file = git_vector_last(&ign->ign_path); - const char *start = file->entry->path, *end; - - /* - ign->dir looks something like "/home/user/a/b/" (or "a/b/c/d/") - * - file->path looks something like "a/b/.gitignore - * - * We are popping the last directory off ign->dir. We also want - * to remove the file from the vector if the popped directory - * matches the ignore path. We need to test if the "a/b" part of - * the file key matches the path we are about to pop. - */ - - if ((end = strrchr(start, '/')) != NULL) { - size_t dirlen = (end - start) + 1; - const char *relpath = ign->dir.ptr + ign->dir_root; - size_t pathlen = ign->dir.size - ign->dir_root; - - if (pathlen == dirlen && !memcmp(relpath, start, dirlen)) { - git_vector_pop(&ign->ign_path); - git_attr_file__free(file); - } - } - } - - if (--ign->depth > 0) { - git_buf_rtruncate_at_char(&ign->dir, '/'); - git_path_to_dir(&ign->dir); - } - - return 0; -} - -void git_ignore__free(git_ignores *ignores) -{ - unsigned int i; - git_attr_file *file; - - git_attr_file__free(ignores->ign_internal); - - git_vector_foreach(&ignores->ign_path, i, file) { - git_attr_file__free(file); - ignores->ign_path.contents[i] = NULL; - } - git_vector_free(&ignores->ign_path); - - git_vector_foreach(&ignores->ign_global, i, file) { - git_attr_file__free(file); - ignores->ign_global.contents[i] = NULL; - } - git_vector_free(&ignores->ign_global); - - git_buf_free(&ignores->dir); -} - -static bool ignore_lookup_in_rules( - int *ignored, git_attr_file *file, git_attr_path *path) -{ - size_t j; - git_attr_fnmatch *match; - - git_vector_rforeach(&file->rules, j, match) { - if (git_attr_fnmatch__match(match, path)) { - *ignored = ((match->flags & GIT_ATTR_FNMATCH_NEGATIVE) == 0) ? - GIT_IGNORE_TRUE : GIT_IGNORE_FALSE; - return true; - } - } - - return false; -} - -int git_ignore__lookup( - int *out, git_ignores *ignores, const char *pathname, git_dir_flag dir_flag) -{ - unsigned int i; - git_attr_file *file; - git_attr_path path; - - *out = GIT_IGNORE_NOTFOUND; - - if (git_attr_path__init( - &path, pathname, git_repository_workdir(ignores->repo), dir_flag) < 0) - return -1; - - /* first process builtins - success means path was found */ - if (ignore_lookup_in_rules(out, ignores->ign_internal, &path)) - goto cleanup; - - /* next process files in the path */ - git_vector_foreach(&ignores->ign_path, i, file) { - if (ignore_lookup_in_rules(out, file, &path)) - goto cleanup; - } - - /* last process global ignores */ - git_vector_foreach(&ignores->ign_global, i, file) { - if (ignore_lookup_in_rules(out, file, &path)) - goto cleanup; - } - -cleanup: - git_attr_path__free(&path); - return 0; -} - -int git_ignore_add_rule(git_repository *repo, const char *rules) -{ - int error; - git_attr_file *ign_internal = NULL; - - if ((error = get_internal_ignores(&ign_internal, repo)) < 0) - return error; - - error = parse_ignore_file(repo, ign_internal, rules); - git_attr_file__free(ign_internal); - - return error; -} - -int git_ignore_clear_internal_rules(git_repository *repo) -{ - int error; - git_attr_file *ign_internal; - - if ((error = get_internal_ignores(&ign_internal, repo)) < 0) - return error; - - if (!(error = git_attr_file__clear_rules(ign_internal, true))) - error = parse_ignore_file( - repo, ign_internal, GIT_IGNORE_DEFAULT_RULES); - - git_attr_file__free(ign_internal); - return error; -} - -int git_ignore_path_is_ignored( - int *ignored, - git_repository *repo, - const char *pathname) -{ - int error; - const char *workdir; - git_attr_path path; - git_ignores ignores; - unsigned int i; - git_attr_file *file; - - assert(ignored && pathname); - - workdir = repo ? git_repository_workdir(repo) : NULL; - - memset(&path, 0, sizeof(path)); - memset(&ignores, 0, sizeof(ignores)); - - if ((error = git_attr_path__init(&path, pathname, workdir, GIT_DIR_FLAG_UNKNOWN)) < 0 || - (error = git_ignore__for_path(repo, path.path, &ignores)) < 0) - goto cleanup; - - while (1) { - /* first process builtins - success means path was found */ - if (ignore_lookup_in_rules(ignored, ignores.ign_internal, &path)) - goto cleanup; - - /* next process files in the path */ - git_vector_foreach(&ignores.ign_path, i, file) { - if (ignore_lookup_in_rules(ignored, file, &path)) - goto cleanup; - } - - /* last process global ignores */ - git_vector_foreach(&ignores.ign_global, i, file) { - if (ignore_lookup_in_rules(ignored, file, &path)) - goto cleanup; - } - - /* move up one directory */ - if (path.basename == path.path) - break; - path.basename[-1] = '\0'; - while (path.basename > path.path && *path.basename != '/') - path.basename--; - if (path.basename > path.path) - path.basename++; - path.is_dir = 1; - - if ((error = git_ignore__pop_dir(&ignores)) < 0) - break; - } - - *ignored = 0; - -cleanup: - git_attr_path__free(&path); - git_ignore__free(&ignores); - return error; -} - -int git_ignore__check_pathspec_for_exact_ignores( - git_repository *repo, - git_vector *vspec, - bool no_fnmatch) -{ - int error = 0; - size_t i; - git_attr_fnmatch *match; - int ignored; - git_buf path = GIT_BUF_INIT; - const char *wd, *filename; - git_index *idx; - - if ((error = git_repository__ensure_not_bare( - repo, "validate pathspec")) < 0 || - (error = git_repository_index(&idx, repo)) < 0) - return error; - - wd = git_repository_workdir(repo); - - git_vector_foreach(vspec, i, match) { - /* skip wildcard matches (if they are being used) */ - if ((match->flags & GIT_ATTR_FNMATCH_HASWILD) != 0 && - !no_fnmatch) - continue; - - filename = match->pattern; - - /* if file is already in the index, it's fine */ - if (git_index_get_bypath(idx, filename, 0) != NULL) - continue; - - if ((error = git_buf_joinpath(&path, wd, filename)) < 0) - break; - - /* is there a file on disk that matches this exactly? */ - if (!git_path_isfile(path.ptr)) - continue; - - /* is that file ignored? */ - if ((error = git_ignore_path_is_ignored(&ignored, repo, filename)) < 0) - break; - - if (ignored) { - giterr_set(GITERR_INVALID, "pathspec contains ignored file '%s'", - filename); - error = GIT_EINVALIDSPEC; - break; - } - } - - git_index_free(idx); - git_buf_free(&path); - - return error; -} - diff --git a/vendor/libgit2/src/ignore.h b/vendor/libgit2/src/ignore.h deleted file mode 100644 index d40bd60f91..0000000000 --- a/vendor/libgit2/src/ignore.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_ignore_h__ -#define INCLUDE_ignore_h__ - -#include "repository.h" -#include "vector.h" -#include "attr_file.h" - -#define GIT_IGNORE_FILE ".gitignore" -#define GIT_IGNORE_FILE_INREPO "info/exclude" -#define GIT_IGNORE_FILE_XDG "ignore" - -/* The git_ignores structure maintains three sets of ignores: - * - internal ignores - * - per directory ignores - * - global ignores (at lower priority than the others) - * As you traverse from one directory to another, you can push and pop - * directories onto git_ignores list efficiently. - */ -typedef struct { - git_repository *repo; - git_buf dir; /* current directory reflected in ign_path */ - git_attr_file *ign_internal; - git_vector ign_path; - git_vector ign_global; - size_t dir_root; /* offset in dir to repo root */ - int ignore_case; - int depth; -} git_ignores; - -extern int git_ignore__for_path( - git_repository *repo, const char *path, git_ignores *ign); - -extern int git_ignore__push_dir(git_ignores *ign, const char *dir); - -extern int git_ignore__pop_dir(git_ignores *ign); - -extern void git_ignore__free(git_ignores *ign); - -enum { - GIT_IGNORE_UNCHECKED = -2, - GIT_IGNORE_NOTFOUND = -1, - GIT_IGNORE_FALSE = 0, - GIT_IGNORE_TRUE = 1, -}; - -extern int git_ignore__lookup(int *out, git_ignores *ign, const char *path, git_dir_flag dir_flag); - -/* command line Git sometimes generates an error message if given a - * pathspec that contains an exact match to an ignored file (provided - * --force isn't also given). This makes it easy to check it that has - * happened. Returns GIT_EINVALIDSPEC if the pathspec contains ignored - * exact matches (that are not already present in the index). - */ -extern int git_ignore__check_pathspec_for_exact_ignores( - git_repository *repo, git_vector *pathspec, bool no_fnmatch); - -#endif diff --git a/vendor/libgit2/src/index.c b/vendor/libgit2/src/index.c deleted file mode 100644 index 73f0b3d266..0000000000 --- a/vendor/libgit2/src/index.c +++ /dev/null @@ -1,3140 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#include - -#include "common.h" -#include "repository.h" -#include "index.h" -#include "tree.h" -#include "tree-cache.h" -#include "hash.h" -#include "iterator.h" -#include "pathspec.h" -#include "ignore.h" -#include "blob.h" - -#include "git2/odb.h" -#include "git2/oid.h" -#include "git2/blob.h" -#include "git2/config.h" -#include "git2/sys/index.h" - -static int index_apply_to_wd_diff(git_index *index, int action, const git_strarray *paths, - unsigned int flags, - git_index_matched_path_cb cb, void *payload); - -#define entry_size(type,len) ((offsetof(type, path) + (len) + 8) & ~7) -#define short_entry_size(len) entry_size(struct entry_short, len) -#define long_entry_size(len) entry_size(struct entry_long, len) - -#define minimal_entry_size (offsetof(struct entry_short, path)) - -static const size_t INDEX_FOOTER_SIZE = GIT_OID_RAWSZ; -static const size_t INDEX_HEADER_SIZE = 12; - -static const unsigned int INDEX_VERSION_NUMBER = 2; -static const unsigned int INDEX_VERSION_NUMBER_EXT = 3; - -static const unsigned int INDEX_HEADER_SIG = 0x44495243; -static const char INDEX_EXT_TREECACHE_SIG[] = {'T', 'R', 'E', 'E'}; -static const char INDEX_EXT_UNMERGED_SIG[] = {'R', 'E', 'U', 'C'}; -static const char INDEX_EXT_CONFLICT_NAME_SIG[] = {'N', 'A', 'M', 'E'}; - -#define INDEX_OWNER(idx) ((git_repository *)(GIT_REFCOUNT_OWNER(idx))) - -struct index_header { - uint32_t signature; - uint32_t version; - uint32_t entry_count; -}; - -struct index_extension { - char signature[4]; - uint32_t extension_size; -}; - -struct entry_time { - uint32_t seconds; - uint32_t nanoseconds; -}; - -struct entry_short { - struct entry_time ctime; - struct entry_time mtime; - uint32_t dev; - uint32_t ino; - uint32_t mode; - uint32_t uid; - uint32_t gid; - uint32_t file_size; - git_oid oid; - uint16_t flags; - char path[1]; /* arbitrary length */ -}; - -struct entry_long { - struct entry_time ctime; - struct entry_time mtime; - uint32_t dev; - uint32_t ino; - uint32_t mode; - uint32_t uid; - uint32_t gid; - uint32_t file_size; - git_oid oid; - uint16_t flags; - uint16_t flags_extended; - char path[1]; /* arbitrary length */ -}; - -struct entry_srch_key { - const char *path; - size_t pathlen; - int stage; -}; - -struct entry_internal { - git_index_entry entry; - size_t pathlen; - char path[GIT_FLEX_ARRAY]; -}; - -struct reuc_entry_internal { - git_index_reuc_entry entry; - size_t pathlen; - char path[GIT_FLEX_ARRAY]; -}; - -/* local declarations */ -static size_t read_extension(git_index *index, const char *buffer, size_t buffer_size); -static int read_header(struct index_header *dest, const void *buffer); - -static int parse_index(git_index *index, const char *buffer, size_t buffer_size); -static bool is_index_extended(git_index *index); -static int write_index(git_oid *checksum, git_index *index, git_filebuf *file); - -static void index_entry_free(git_index_entry *entry); -static void index_entry_reuc_free(git_index_reuc_entry *reuc); - -int git_index_entry_srch(const void *key, const void *array_member) -{ - const struct entry_srch_key *srch_key = key; - const struct entry_internal *entry = array_member; - int cmp; - size_t len1, len2, len; - - len1 = srch_key->pathlen; - len2 = entry->pathlen; - len = len1 < len2 ? len1 : len2; - - cmp = memcmp(srch_key->path, entry->path, len); - if (cmp) - return cmp; - if (len1 < len2) - return -1; - if (len1 > len2) - return 1; - - if (srch_key->stage != GIT_INDEX_STAGE_ANY) - return srch_key->stage - GIT_IDXENTRY_STAGE(&entry->entry); - - return 0; -} - -int git_index_entry_isrch(const void *key, const void *array_member) -{ - const struct entry_srch_key *srch_key = key; - const struct entry_internal *entry = array_member; - int cmp; - size_t len1, len2, len; - - len1 = srch_key->pathlen; - len2 = entry->pathlen; - len = len1 < len2 ? len1 : len2; - - cmp = strncasecmp(srch_key->path, entry->path, len); - - if (cmp) - return cmp; - if (len1 < len2) - return -1; - if (len1 > len2) - return 1; - - if (srch_key->stage != GIT_INDEX_STAGE_ANY) - return srch_key->stage - GIT_IDXENTRY_STAGE(&entry->entry); - - return 0; -} - -static int index_entry_srch_path(const void *path, const void *array_member) -{ - const git_index_entry *entry = array_member; - - return strcmp((const char *)path, entry->path); -} - -static int index_entry_isrch_path(const void *path, const void *array_member) -{ - const git_index_entry *entry = array_member; - - return strcasecmp((const char *)path, entry->path); -} - -int git_index_entry_cmp(const void *a, const void *b) -{ - int diff; - const git_index_entry *entry_a = a; - const git_index_entry *entry_b = b; - - diff = strcmp(entry_a->path, entry_b->path); - - if (diff == 0) - diff = (GIT_IDXENTRY_STAGE(entry_a) - GIT_IDXENTRY_STAGE(entry_b)); - - return diff; -} - -int git_index_entry_icmp(const void *a, const void *b) -{ - int diff; - const git_index_entry *entry_a = a; - const git_index_entry *entry_b = b; - - diff = strcasecmp(entry_a->path, entry_b->path); - - if (diff == 0) - diff = (GIT_IDXENTRY_STAGE(entry_a) - GIT_IDXENTRY_STAGE(entry_b)); - - return diff; -} - -static int conflict_name_cmp(const void *a, const void *b) -{ - const git_index_name_entry *name_a = a; - const git_index_name_entry *name_b = b; - - if (name_a->ancestor && !name_b->ancestor) - return 1; - - if (!name_a->ancestor && name_b->ancestor) - return -1; - - if (name_a->ancestor) - return strcmp(name_a->ancestor, name_b->ancestor); - - if (!name_a->ours || !name_b->ours) - return 0; - - return strcmp(name_a->ours, name_b->ours); -} - -/** - * TODO: enable this when resolving case insensitive conflicts - */ -#if 0 -static int conflict_name_icmp(const void *a, const void *b) -{ - const git_index_name_entry *name_a = a; - const git_index_name_entry *name_b = b; - - if (name_a->ancestor && !name_b->ancestor) - return 1; - - if (!name_a->ancestor && name_b->ancestor) - return -1; - - if (name_a->ancestor) - return strcasecmp(name_a->ancestor, name_b->ancestor); - - if (!name_a->ours || !name_b->ours) - return 0; - - return strcasecmp(name_a->ours, name_b->ours); -} -#endif - -static int reuc_srch(const void *key, const void *array_member) -{ - const git_index_reuc_entry *reuc = array_member; - - return strcmp(key, reuc->path); -} - -static int reuc_isrch(const void *key, const void *array_member) -{ - const git_index_reuc_entry *reuc = array_member; - - return strcasecmp(key, reuc->path); -} - -static int reuc_cmp(const void *a, const void *b) -{ - const git_index_reuc_entry *info_a = a; - const git_index_reuc_entry *info_b = b; - - return strcmp(info_a->path, info_b->path); -} - -static int reuc_icmp(const void *a, const void *b) -{ - const git_index_reuc_entry *info_a = a; - const git_index_reuc_entry *info_b = b; - - return strcasecmp(info_a->path, info_b->path); -} - -static void index_entry_reuc_free(git_index_reuc_entry *reuc) -{ - git__free(reuc); -} - -static void index_entry_free(git_index_entry *entry) -{ - if (!entry) - return; - - memset(&entry->id, 0, sizeof(entry->id)); - git__free(entry); -} - -unsigned int git_index__create_mode(unsigned int mode) -{ - if (S_ISLNK(mode)) - return S_IFLNK; - - if (S_ISDIR(mode) || (mode & S_IFMT) == (S_IFLNK | S_IFDIR)) - return (S_IFLNK | S_IFDIR); - - return S_IFREG | GIT_PERMS_CANONICAL(mode); -} - -static unsigned int index_merge_mode( - git_index *index, git_index_entry *existing, unsigned int mode) -{ - if (index->no_symlinks && S_ISREG(mode) && - existing && S_ISLNK(existing->mode)) - return existing->mode; - - if (index->distrust_filemode && S_ISREG(mode)) - return (existing && S_ISREG(existing->mode)) ? - existing->mode : git_index__create_mode(0666); - - return git_index__create_mode(mode); -} - -static int index_sort_if_needed(git_index *index, bool need_lock) -{ - /* not truly threadsafe because between when this checks and/or - * sorts the array another thread could come in and unsort it - */ - - if (git_vector_is_sorted(&index->entries)) - return 0; - - if (need_lock && git_mutex_lock(&index->lock) < 0) { - giterr_set(GITERR_OS, "Unable to lock index"); - return -1; - } - - git_vector_sort(&index->entries); - - if (need_lock) - git_mutex_unlock(&index->lock); - - return 0; -} - -GIT_INLINE(int) index_find_in_entries( - size_t *out, git_vector *entries, git_vector_cmp entry_srch, - const char *path, size_t path_len, int stage) -{ - struct entry_srch_key srch_key; - srch_key.path = path; - srch_key.pathlen = !path_len ? strlen(path) : path_len; - srch_key.stage = stage; - return git_vector_bsearch2(out, entries, entry_srch, &srch_key); -} - -GIT_INLINE(int) index_find( - size_t *out, git_index *index, - const char *path, size_t path_len, int stage, bool need_lock) -{ - if (index_sort_if_needed(index, need_lock) < 0) - return -1; - - return index_find_in_entries( - out, &index->entries, index->entries_search, path, path_len, stage); -} - -void git_index__set_ignore_case(git_index *index, bool ignore_case) -{ - index->ignore_case = ignore_case; - - if (ignore_case) { - index->entries_cmp_path = git__strcasecmp_cb; - index->entries_search = git_index_entry_isrch; - index->entries_search_path = index_entry_isrch_path; - index->reuc_search = reuc_isrch; - } else { - index->entries_cmp_path = git__strcmp_cb; - index->entries_search = git_index_entry_srch; - index->entries_search_path = index_entry_srch_path; - index->reuc_search = reuc_srch; - } - - git_vector_set_cmp(&index->entries, - ignore_case ? git_index_entry_icmp : git_index_entry_cmp); - index_sort_if_needed(index, true); - - git_vector_set_cmp(&index->reuc, ignore_case ? reuc_icmp : reuc_cmp); - git_vector_sort(&index->reuc); -} - -int git_index_open(git_index **index_out, const char *index_path) -{ - git_index *index; - int error = -1; - - assert(index_out); - - index = git__calloc(1, sizeof(git_index)); - GITERR_CHECK_ALLOC(index); - - if (git_mutex_init(&index->lock)) { - giterr_set(GITERR_OS, "Failed to initialize lock"); - git__free(index); - return -1; - } - - git_pool_init(&index->tree_pool, 1, 0); - - if (index_path != NULL) { - index->index_file_path = git__strdup(index_path); - if (!index->index_file_path) - goto fail; - - /* Check if index file is stored on disk already */ - if (git_path_exists(index->index_file_path) == true) - index->on_disk = 1; - } - - if (git_vector_init(&index->entries, 32, git_index_entry_cmp) < 0 || - git_vector_init(&index->names, 8, conflict_name_cmp) < 0 || - git_vector_init(&index->reuc, 8, reuc_cmp) < 0 || - git_vector_init(&index->deleted, 8, git_index_entry_cmp) < 0) - goto fail; - - index->entries_cmp_path = git__strcmp_cb; - index->entries_search = git_index_entry_srch; - index->entries_search_path = index_entry_srch_path; - index->reuc_search = reuc_srch; - - if (index_path != NULL && (error = git_index_read(index, true)) < 0) - goto fail; - - *index_out = index; - GIT_REFCOUNT_INC(index); - - return 0; - -fail: - git_pool_clear(&index->tree_pool); - git_index_free(index); - return error; -} - -int git_index_new(git_index **out) -{ - return git_index_open(out, NULL); -} - -static void index_free(git_index *index) -{ - /* index iterators increment the refcount of the index, so if we - * get here then there should be no outstanding iterators. - */ - assert(!git_atomic_get(&index->readers)); - - git_index_clear(index); - git_vector_free(&index->entries); - git_vector_free(&index->names); - git_vector_free(&index->reuc); - git_vector_free(&index->deleted); - - git__free(index->index_file_path); - git_mutex_free(&index->lock); - - git__memzero(index, sizeof(*index)); - git__free(index); -} - -void git_index_free(git_index *index) -{ - if (index == NULL) - return; - - GIT_REFCOUNT_DEC(index, index_free); -} - -/* call with locked index */ -static void index_free_deleted(git_index *index) -{ - int readers = (int)git_atomic_get(&index->readers); - size_t i; - - if (readers > 0 || !index->deleted.length) - return; - - for (i = 0; i < index->deleted.length; ++i) { - git_index_entry *ie = git__swap(index->deleted.contents[i], NULL); - index_entry_free(ie); - } - - git_vector_clear(&index->deleted); -} - -/* call with locked index */ -static int index_remove_entry(git_index *index, size_t pos) -{ - int error = 0; - git_index_entry *entry = git_vector_get(&index->entries, pos); - - if (entry != NULL) - git_tree_cache_invalidate_path(index->tree, entry->path); - - error = git_vector_remove(&index->entries, pos); - - if (!error) { - if (git_atomic_get(&index->readers) > 0) { - error = git_vector_insert(&index->deleted, entry); - } else { - index_entry_free(entry); - } - } - - return error; -} - -int git_index_clear(git_index *index) -{ - int error = 0; - - assert(index); - - index->tree = NULL; - git_pool_clear(&index->tree_pool); - - if (git_mutex_lock(&index->lock) < 0) { - giterr_set(GITERR_OS, "Failed to lock index"); - return -1; - } - - while (!error && index->entries.length > 0) - error = index_remove_entry(index, index->entries.length - 1); - index_free_deleted(index); - - git_index_reuc_clear(index); - git_index_name_clear(index); - - git_futils_filestamp_set(&index->stamp, NULL); - - git_mutex_unlock(&index->lock); - - return error; -} - -static int create_index_error(int error, const char *msg) -{ - giterr_set(GITERR_INDEX, msg); - return error; -} - -int git_index_set_caps(git_index *index, int caps) -{ - unsigned int old_ignore_case; - - assert(index); - - old_ignore_case = index->ignore_case; - - if (caps == GIT_INDEXCAP_FROM_OWNER) { - git_repository *repo = INDEX_OWNER(index); - int val; - - if (!repo) - return create_index_error( - -1, "Cannot access repository to set index caps"); - - if (!git_repository__cvar(&val, repo, GIT_CVAR_IGNORECASE)) - index->ignore_case = (val != 0); - if (!git_repository__cvar(&val, repo, GIT_CVAR_FILEMODE)) - index->distrust_filemode = (val == 0); - if (!git_repository__cvar(&val, repo, GIT_CVAR_SYMLINKS)) - index->no_symlinks = (val == 0); - } - else { - index->ignore_case = ((caps & GIT_INDEXCAP_IGNORE_CASE) != 0); - index->distrust_filemode = ((caps & GIT_INDEXCAP_NO_FILEMODE) != 0); - index->no_symlinks = ((caps & GIT_INDEXCAP_NO_SYMLINKS) != 0); - } - - if (old_ignore_case != index->ignore_case) { - git_index__set_ignore_case(index, (bool)index->ignore_case); - } - - return 0; -} - -int git_index_caps(const git_index *index) -{ - return ((index->ignore_case ? GIT_INDEXCAP_IGNORE_CASE : 0) | - (index->distrust_filemode ? GIT_INDEXCAP_NO_FILEMODE : 0) | - (index->no_symlinks ? GIT_INDEXCAP_NO_SYMLINKS : 0)); -} - -const git_oid *git_index_checksum(git_index *index) -{ - return &index->checksum; -} - -/** - * Returns 1 for changed, 0 for not changed and <0 for errors - */ -static int compare_checksum(git_index *index) -{ - int fd, error; - ssize_t bytes_read; - git_oid checksum = {{ 0 }}; - - if ((fd = p_open(index->index_file_path, O_RDONLY)) < 0) - return fd; - - if ((error = p_lseek(fd, -20, SEEK_END)) < 0) { - p_close(fd); - giterr_set(GITERR_OS, "failed to seek to end of file"); - return -1; - } - - bytes_read = p_read(fd, &checksum, GIT_OID_RAWSZ); - p_close(fd); - - if (bytes_read < 0) - return -1; - - return !!git_oid_cmp(&checksum, &index->checksum); -} - -int git_index_read(git_index *index, int force) -{ - int error = 0, updated; - git_buf buffer = GIT_BUF_INIT; - git_futils_filestamp stamp = index->stamp; - - if (!index->index_file_path) - return create_index_error(-1, - "Failed to read index: The index is in-memory only"); - - index->on_disk = git_path_exists(index->index_file_path); - - if (!index->on_disk) { - if (force) - return git_index_clear(index); - return 0; - } - - if ((updated = git_futils_filestamp_check(&stamp, index->index_file_path) < 0) || - ((updated = compare_checksum(index)) < 0)) { - giterr_set( - GITERR_INDEX, - "Failed to read index: '%s' no longer exists", - index->index_file_path); - return updated; - } - if (!updated && !force) - return 0; - - error = git_futils_readbuffer(&buffer, index->index_file_path); - if (error < 0) - return error; - - index->tree = NULL; - git_pool_clear(&index->tree_pool); - - error = git_index_clear(index); - - if (!error) - error = parse_index(index, buffer.ptr, buffer.size); - - if (!error) - git_futils_filestamp_set(&index->stamp, &stamp); - - git_buf_free(&buffer); - return error; -} - -int git_index__changed_relative_to( - git_index *index, const git_oid *checksum) -{ - /* attempt to update index (ignoring errors) */ - if (git_index_read(index, false) < 0) - giterr_clear(); - - return !!git_oid_cmp(&index->checksum, checksum); -} - -static bool is_racy_timestamp(git_time_t stamp, git_index_entry *entry) -{ - /* Git special-cases submodules in the check */ - if (S_ISGITLINK(entry->mode)) - return false; - - /* If we never read the index, we can't have this race either */ - if (stamp == 0) - return false; - - /* If the timestamp is the same or newer than the index, it's racy */ - return ((int32_t) stamp) <= entry->mtime.seconds; -} - -/* - * Force the next diff to take a look at those entries which have the - * same timestamp as the current index. - */ -static int truncate_racily_clean(git_index *index) -{ - size_t i; - int error; - git_index_entry *entry; - git_time_t ts = index->stamp.mtime; - git_diff_options diff_opts = GIT_DIFF_OPTIONS_INIT; - git_diff *diff; - - /* Nothing to do if there's no repo to talk about */ - if (!INDEX_OWNER(index)) - return 0; - - /* If there's no workdir, we can't know where to even check */ - if (!git_repository_workdir(INDEX_OWNER(index))) - return 0; - - diff_opts.flags |= GIT_DIFF_INCLUDE_TYPECHANGE | GIT_DIFF_IGNORE_SUBMODULES | GIT_DIFF_DISABLE_PATHSPEC_MATCH; - git_vector_foreach(&index->entries, i, entry) { - if (!is_racy_timestamp(ts, entry)) - continue; - - diff_opts.pathspec.count = 1; - diff_opts.pathspec.strings = (char **) &entry->path; - - if ((error = git_diff_index_to_workdir(&diff, INDEX_OWNER(index), index, &diff_opts)) < 0) - return error; - - if (git_diff_num_deltas(diff) > 0) - entry->file_size = 0; - - git_diff_free(diff); - } - - return 0; -} - -int git_index_write(git_index *index) -{ - git_indexwriter writer = GIT_INDEXWRITER_INIT; - int error; - - truncate_racily_clean(index); - - if ((error = git_indexwriter_init(&writer, index)) == 0) - error = git_indexwriter_commit(&writer); - - git_indexwriter_cleanup(&writer); - - return error; -} - -const char * git_index_path(const git_index *index) -{ - assert(index); - return index->index_file_path; -} - -int git_index_write_tree(git_oid *oid, git_index *index) -{ - git_repository *repo; - - assert(oid && index); - - repo = INDEX_OWNER(index); - - if (repo == NULL) - return create_index_error(-1, "Failed to write tree. " - "The index file is not backed up by an existing repository"); - - return git_tree__write_index(oid, index, repo); -} - -int git_index_write_tree_to( - git_oid *oid, git_index *index, git_repository *repo) -{ - assert(oid && index && repo); - return git_tree__write_index(oid, index, repo); -} - -size_t git_index_entrycount(const git_index *index) -{ - assert(index); - return index->entries.length; -} - -const git_index_entry *git_index_get_byindex( - git_index *index, size_t n) -{ - assert(index); - if (index_sort_if_needed(index, true) < 0) - return NULL; - return git_vector_get(&index->entries, n); -} - -const git_index_entry *git_index_get_bypath( - git_index *index, const char *path, int stage) -{ - size_t pos; - - assert(index); - - if (index_find(&pos, index, path, 0, stage, true) < 0) { - giterr_set(GITERR_INDEX, "Index does not contain %s", path); - return NULL; - } - - return git_index_get_byindex(index, pos); -} - -void git_index_entry__init_from_stat( - git_index_entry *entry, struct stat *st, bool trust_mode) -{ - entry->ctime.seconds = (git_time_t)st->st_ctime; - entry->mtime.seconds = (git_time_t)st->st_mtime; - /* entry->mtime.nanoseconds = st->st_mtimensec; */ - /* entry->ctime.nanoseconds = st->st_ctimensec; */ - entry->dev = st->st_rdev; - entry->ino = st->st_ino; - entry->mode = (!trust_mode && S_ISREG(st->st_mode)) ? - git_index__create_mode(0666) : git_index__create_mode(st->st_mode); - entry->uid = st->st_uid; - entry->gid = st->st_gid; - entry->file_size = st->st_size; -} - -static int index_entry_create( - git_index_entry **out, - git_repository *repo, - const char *path) -{ - size_t pathlen = strlen(path), alloclen; - struct entry_internal *entry; - - if (!git_path_isvalid(repo, path, - GIT_PATH_REJECT_DEFAULTS | GIT_PATH_REJECT_DOT_GIT)) { - giterr_set(GITERR_INDEX, "Invalid path: '%s'", path); - return -1; - } - - GITERR_CHECK_ALLOC_ADD(&alloclen, sizeof(struct entry_internal), pathlen); - GITERR_CHECK_ALLOC_ADD(&alloclen, alloclen, 1); - entry = git__calloc(1, alloclen); - GITERR_CHECK_ALLOC(entry); - - entry->pathlen = pathlen; - memcpy(entry->path, path, pathlen); - entry->entry.path = entry->path; - - *out = (git_index_entry *)entry; - return 0; -} - -static int index_entry_init( - git_index_entry **entry_out, - git_index *index, - const char *rel_path) -{ - int error = 0; - git_index_entry *entry = NULL; - struct stat st; - git_oid oid; - - if (INDEX_OWNER(index) == NULL) - return create_index_error(-1, - "Could not initialize index entry. " - "Index is not backed up by an existing repository."); - - if (index_entry_create(&entry, INDEX_OWNER(index), rel_path) < 0) - return -1; - - /* write the blob to disk and get the oid and stat info */ - error = git_blob__create_from_paths( - &oid, &st, INDEX_OWNER(index), NULL, rel_path, 0, true); - - if (error < 0) { - index_entry_free(entry); - return error; - } - - entry->id = oid; - git_index_entry__init_from_stat(entry, &st, !index->distrust_filemode); - - *entry_out = (git_index_entry *)entry; - return 0; -} - -static git_index_reuc_entry *reuc_entry_alloc(const char *path) -{ - size_t pathlen = strlen(path), - structlen = sizeof(struct reuc_entry_internal), - alloclen; - struct reuc_entry_internal *entry; - - if (GIT_ADD_SIZET_OVERFLOW(&alloclen, structlen, pathlen) || - GIT_ADD_SIZET_OVERFLOW(&alloclen, alloclen, 1)) - return NULL; - - entry = git__calloc(1, alloclen); - if (!entry) - return NULL; - - entry->pathlen = pathlen; - memcpy(entry->path, path, pathlen); - entry->entry.path = entry->path; - - return (git_index_reuc_entry *)entry; -} - -static int index_entry_reuc_init(git_index_reuc_entry **reuc_out, - const char *path, - int ancestor_mode, const git_oid *ancestor_oid, - int our_mode, const git_oid *our_oid, - int their_mode, const git_oid *their_oid) -{ - git_index_reuc_entry *reuc = NULL; - - assert(reuc_out && path); - - *reuc_out = reuc = reuc_entry_alloc(path); - GITERR_CHECK_ALLOC(reuc); - - if ((reuc->mode[0] = ancestor_mode) > 0) - git_oid_cpy(&reuc->oid[0], ancestor_oid); - - if ((reuc->mode[1] = our_mode) > 0) - git_oid_cpy(&reuc->oid[1], our_oid); - - if ((reuc->mode[2] = their_mode) > 0) - git_oid_cpy(&reuc->oid[2], their_oid); - - return 0; -} - -static void index_entry_cpy(git_index_entry *tgt, const git_index_entry *src) -{ - const char *tgt_path = tgt->path; - memcpy(tgt, src, sizeof(*tgt)); - tgt->path = tgt_path; /* reset to existing path data */ -} - -static int index_entry_dup( - git_index_entry **out, - git_repository *repo, - const git_index_entry *src) -{ - git_index_entry *entry; - - if (!src) { - *out = NULL; - return 0; - } - - if (index_entry_create(&entry, repo, src->path) < 0) - return -1; - - index_entry_cpy(entry, src); - *out = entry; - return 0; -} - -static int has_file_name(git_index *index, - const git_index_entry *entry, size_t pos, int ok_to_replace) -{ - int retval = 0; - size_t len = strlen(entry->path); - int stage = GIT_IDXENTRY_STAGE(entry); - const char *name = entry->path; - - while (pos < index->entries.length) { - struct entry_internal *p = index->entries.contents[pos++]; - - if (len >= p->pathlen) - break; - if (memcmp(name, p->path, len)) - break; - if (GIT_IDXENTRY_STAGE(&p->entry) != stage) - continue; - if (p->path[len] != '/') - continue; - retval = -1; - if (!ok_to_replace) - break; - - if (index_remove_entry(index, --pos) < 0) - break; - } - return retval; -} - -/* - * Do we have another file with a pathname that is a proper - * subset of the name we're trying to add? - */ -static int has_dir_name(git_index *index, - const git_index_entry *entry, int ok_to_replace) -{ - int retval = 0; - int stage = GIT_IDXENTRY_STAGE(entry); - const char *name = entry->path; - const char *slash = name + strlen(name); - - for (;;) { - size_t len, pos; - - for (;;) { - if (*--slash == '/') - break; - if (slash <= entry->path) - return retval; - } - len = slash - name; - - if (!index_find(&pos, index, name, len, stage, false)) { - retval = -1; - if (!ok_to_replace) - break; - - if (index_remove_entry(index, pos) < 0) - break; - continue; - } - - /* - * Trivial optimization: if we find an entry that - * already matches the sub-directory, then we know - * we're ok, and we can exit. - */ - for (; pos < index->entries.length; ++pos) { - struct entry_internal *p = index->entries.contents[pos]; - - if (p->pathlen <= len || - p->path[len] != '/' || - memcmp(p->path, name, len)) - break; /* not our subdirectory */ - - if (GIT_IDXENTRY_STAGE(&p->entry) == stage) - return retval; - } - } - - return retval; -} - -static int check_file_directory_collision(git_index *index, - git_index_entry *entry, size_t pos, int ok_to_replace) -{ - int retval = has_file_name(index, entry, pos, ok_to_replace); - retval = retval + has_dir_name(index, entry, ok_to_replace); - - if (retval) { - giterr_set(GITERR_INDEX, - "'%s' appears as both a file and a directory", entry->path); - return -1; - } - - return 0; -} - -static int index_no_dups(void **old, void *new) -{ - const git_index_entry *entry = new; - GIT_UNUSED(old); - giterr_set(GITERR_INDEX, "'%s' appears multiple times at stage %d", - entry->path, GIT_IDXENTRY_STAGE(entry)); - return GIT_EEXISTS; -} - -/* index_insert takes ownership of the new entry - if it can't insert - * it, then it will return an error **and also free the entry**. When - * it replaces an existing entry, it will update the entry_ptr with the - * actual entry in the index (and free the passed in one). - * trust_mode is whether we trust the mode in entry_ptr. - */ -static int index_insert( - git_index *index, git_index_entry **entry_ptr, int replace, bool trust_mode) -{ - int error = 0; - size_t path_length, position; - git_index_entry *existing = NULL, *entry; - - assert(index && entry_ptr); - - entry = *entry_ptr; - - /* make sure that the path length flag is correct */ - path_length = ((struct entry_internal *)entry)->pathlen; - - entry->flags &= ~GIT_IDXENTRY_NAMEMASK; - - if (path_length < GIT_IDXENTRY_NAMEMASK) - entry->flags |= path_length & GIT_IDXENTRY_NAMEMASK; - else - entry->flags |= GIT_IDXENTRY_NAMEMASK; - - if (git_mutex_lock(&index->lock) < 0) { - giterr_set(GITERR_OS, "Unable to acquire index lock"); - return -1; - } - - git_vector_sort(&index->entries); - - /* look if an entry with this path already exists */ - if (!index_find( - &position, index, entry->path, 0, GIT_IDXENTRY_STAGE(entry), false)) { - existing = index->entries.contents[position]; - /* update filemode to existing values if stat is not trusted */ - if (trust_mode) - entry->mode = git_index__create_mode(entry->mode); - else - entry->mode = index_merge_mode(index, existing, entry->mode); - } - - /* look for tree / blob name collisions, removing conflicts if requested */ - error = check_file_directory_collision(index, entry, position, replace); - if (error < 0) - /* skip changes */; - - /* if we are replacing an existing item, overwrite the existing entry - * and return it in place of the passed in one. - */ - else if (existing) { - if (replace) - index_entry_cpy(existing, entry); - index_entry_free(entry); - *entry_ptr = entry = existing; - } - else { - /* if replace is not requested or no existing entry exists, insert - * at the sorted position. (Since we re-sort after each insert to - * check for dups, this is actually cheaper in the long run.) - */ - error = git_vector_insert_sorted(&index->entries, entry, index_no_dups); - } - - if (error < 0) { - index_entry_free(*entry_ptr); - *entry_ptr = NULL; - } - - git_mutex_unlock(&index->lock); - - return error; -} - -static int index_conflict_to_reuc(git_index *index, const char *path) -{ - const git_index_entry *conflict_entries[3]; - int ancestor_mode, our_mode, their_mode; - git_oid const *ancestor_oid, *our_oid, *their_oid; - int ret; - - if ((ret = git_index_conflict_get(&conflict_entries[0], - &conflict_entries[1], &conflict_entries[2], index, path)) < 0) - return ret; - - ancestor_mode = conflict_entries[0] == NULL ? 0 : conflict_entries[0]->mode; - our_mode = conflict_entries[1] == NULL ? 0 : conflict_entries[1]->mode; - their_mode = conflict_entries[2] == NULL ? 0 : conflict_entries[2]->mode; - - ancestor_oid = conflict_entries[0] == NULL ? NULL : &conflict_entries[0]->id; - our_oid = conflict_entries[1] == NULL ? NULL : &conflict_entries[1]->id; - their_oid = conflict_entries[2] == NULL ? NULL : &conflict_entries[2]->id; - - if ((ret = git_index_reuc_add(index, path, ancestor_mode, ancestor_oid, - our_mode, our_oid, their_mode, their_oid)) >= 0) - ret = git_index_conflict_remove(index, path); - - return ret; -} - -static bool valid_filemode(const int filemode) -{ - return (filemode == GIT_FILEMODE_BLOB || - filemode == GIT_FILEMODE_BLOB_EXECUTABLE || - filemode == GIT_FILEMODE_LINK || - filemode == GIT_FILEMODE_COMMIT); -} - -int git_index_add_frombuffer( - git_index *index, const git_index_entry *source_entry, - const void *buffer, size_t len) -{ - git_index_entry *entry = NULL; - int error = 0; - git_oid id; - - assert(index && source_entry->path); - - if (INDEX_OWNER(index) == NULL) - return create_index_error(-1, - "Could not initialize index entry. " - "Index is not backed up by an existing repository."); - - if (!valid_filemode(source_entry->mode)) { - giterr_set(GITERR_INDEX, "invalid filemode"); - return -1; - } - - if (index_entry_dup(&entry, INDEX_OWNER(index), source_entry) < 0) - return -1; - - error = git_blob_create_frombuffer(&id, INDEX_OWNER(index), buffer, len); - if (error < 0) { - index_entry_free(entry); - return error; - } - - git_oid_cpy(&entry->id, &id); - entry->file_size = len; - - if ((error = index_insert(index, &entry, 1, true)) < 0) - return error; - - /* Adding implies conflict was resolved, move conflict entries to REUC */ - if ((error = index_conflict_to_reuc(index, entry->path)) < 0 && error != GIT_ENOTFOUND) - return error; - - git_tree_cache_invalidate_path(index->tree, entry->path); - return 0; -} - -static int add_repo_as_submodule(git_index_entry **out, git_index *index, const char *path) -{ - git_repository *sub; - git_buf abspath = GIT_BUF_INIT; - git_repository *repo = INDEX_OWNER(index); - git_reference *head; - git_index_entry *entry; - struct stat st; - int error; - - if (index_entry_create(&entry, INDEX_OWNER(index), path) < 0) - return -1; - - if ((error = git_buf_joinpath(&abspath, git_repository_workdir(repo), path)) < 0) - return error; - - if ((error = p_stat(abspath.ptr, &st)) < 0) { - giterr_set(GITERR_OS, "failed to stat repository dir"); - return -1; - } - - git_index_entry__init_from_stat(entry, &st, !index->distrust_filemode); - - if ((error = git_repository_open(&sub, abspath.ptr)) < 0) - return error; - - if ((error = git_repository_head(&head, sub)) < 0) - return error; - - git_oid_cpy(&entry->id, git_reference_target(head)); - entry->mode = GIT_FILEMODE_COMMIT; - - git_reference_free(head); - git_repository_free(sub); - git_buf_free(&abspath); - - *out = entry; - return 0; -} - -int git_index_add_bypath(git_index *index, const char *path) -{ - git_index_entry *entry = NULL; - int ret; - - assert(index && path); - - if ((ret = index_entry_init(&entry, index, path)) == 0) - ret = index_insert(index, &entry, 1, false); - - /* If we were given a directory, let's see if it's a submodule */ - if (ret < 0 && ret != GIT_EDIRECTORY) - return ret; - - if (ret == GIT_EDIRECTORY) { - git_submodule *sm; - git_error_state err; - - giterr_capture(&err, ret); - - ret = git_submodule_lookup(&sm, INDEX_OWNER(index), path); - if (ret == GIT_ENOTFOUND) - return giterr_restore(&err); - - git__free(err.error_msg.message); - - /* - * EEXISTS means that there is a repository at that path, but it's not known - * as a submodule. We add its HEAD as an entry and don't register it. - */ - if (ret == GIT_EEXISTS) { - if ((ret = add_repo_as_submodule(&entry, index, path)) < 0) - return ret; - - if ((ret = index_insert(index, &entry, 1, false)) < 0) - return ret; - } else if (ret < 0) { - return ret; - } else { - ret = git_submodule_add_to_index(sm, false); - git_submodule_free(sm); - return ret; - } - } - - /* Adding implies conflict was resolved, move conflict entries to REUC */ - if ((ret = index_conflict_to_reuc(index, path)) < 0 && ret != GIT_ENOTFOUND) - return ret; - - git_tree_cache_invalidate_path(index->tree, entry->path); - return 0; -} - -int git_index_remove_bypath(git_index *index, const char *path) -{ - int ret; - - assert(index && path); - - if (((ret = git_index_remove(index, path, 0)) < 0 && - ret != GIT_ENOTFOUND) || - ((ret = index_conflict_to_reuc(index, path)) < 0 && - ret != GIT_ENOTFOUND)) - return ret; - - if (ret == GIT_ENOTFOUND) - giterr_clear(); - - return 0; -} - - -int git_index_add(git_index *index, const git_index_entry *source_entry) -{ - git_index_entry *entry = NULL; - int ret; - - assert(index && source_entry && source_entry->path); - - if (!valid_filemode(source_entry->mode)) { - giterr_set(GITERR_INDEX, "invalid filemode"); - return -1; - } - - if ((ret = index_entry_dup(&entry, INDEX_OWNER(index), source_entry)) < 0 || - (ret = index_insert(index, &entry, 1, true)) < 0) - return ret; - - git_tree_cache_invalidate_path(index->tree, entry->path); - return 0; -} - -int git_index_remove(git_index *index, const char *path, int stage) -{ - int error; - size_t position; - - if (git_mutex_lock(&index->lock) < 0) { - giterr_set(GITERR_OS, "Failed to lock index"); - return -1; - } - - if (index_find(&position, index, path, 0, stage, false) < 0) { - giterr_set( - GITERR_INDEX, "Index does not contain %s at stage %d", path, stage); - error = GIT_ENOTFOUND; - } else { - error = index_remove_entry(index, position); - } - - git_mutex_unlock(&index->lock); - return error; -} - -int git_index_remove_directory(git_index *index, const char *dir, int stage) -{ - git_buf pfx = GIT_BUF_INIT; - int error = 0; - size_t pos; - git_index_entry *entry; - - if (git_mutex_lock(&index->lock) < 0) { - giterr_set(GITERR_OS, "Failed to lock index"); - return -1; - } - - if (!(error = git_buf_sets(&pfx, dir)) && - !(error = git_path_to_dir(&pfx))) - index_find(&pos, index, pfx.ptr, pfx.size, GIT_INDEX_STAGE_ANY, false); - - while (!error) { - entry = git_vector_get(&index->entries, pos); - if (!entry || git__prefixcmp(entry->path, pfx.ptr) != 0) - break; - - if (GIT_IDXENTRY_STAGE(entry) != stage) { - ++pos; - continue; - } - - error = index_remove_entry(index, pos); - - /* removed entry at 'pos' so we don't need to increment */ - } - - git_mutex_unlock(&index->lock); - git_buf_free(&pfx); - - return error; -} - -int git_index__find_pos( - size_t *out, git_index *index, const char *path, size_t path_len, int stage) -{ - assert(index && path); - return index_find(out, index, path, path_len, stage, true); -} - -int git_index_find(size_t *at_pos, git_index *index, const char *path) -{ - size_t pos; - - assert(index && path); - - if (git_mutex_lock(&index->lock) < 0) { - giterr_set(GITERR_OS, "Failed to lock index"); - return -1; - } - - if (git_vector_bsearch2( - &pos, &index->entries, index->entries_search_path, path) < 0) { - git_mutex_unlock(&index->lock); - giterr_set(GITERR_INDEX, "Index does not contain %s", path); - return GIT_ENOTFOUND; - } - - /* Since our binary search only looked at path, we may be in the - * middle of a list of stages. - */ - for (; pos > 0; --pos) { - const git_index_entry *prev = git_vector_get(&index->entries, pos - 1); - - if (index->entries_cmp_path(prev->path, path) != 0) - break; - } - - if (at_pos) - *at_pos = pos; - - git_mutex_unlock(&index->lock); - return 0; -} - -int git_index_conflict_add(git_index *index, - const git_index_entry *ancestor_entry, - const git_index_entry *our_entry, - const git_index_entry *their_entry) -{ - git_index_entry *entries[3] = { 0 }; - unsigned short i; - int ret = 0; - - assert (index); - - if ((ret = index_entry_dup(&entries[0], INDEX_OWNER(index), ancestor_entry)) < 0 || - (ret = index_entry_dup(&entries[1], INDEX_OWNER(index), our_entry)) < 0 || - (ret = index_entry_dup(&entries[2], INDEX_OWNER(index), their_entry)) < 0) - goto on_error; - - /* Validate entries */ - for (i = 0; i < 3; i++) { - if (entries[i] && !valid_filemode(entries[i]->mode)) { - giterr_set(GITERR_INDEX, "invalid filemode for stage %d entry", - i); - return -1; - } - } - - /* Remove existing index entries for each path */ - for (i = 0; i < 3; i++) { - if (entries[i] == NULL) - continue; - - if ((ret = git_index_remove(index, entries[i]->path, 0)) != 0) { - if (ret != GIT_ENOTFOUND) - goto on_error; - - giterr_clear(); - ret = 0; - } - } - - /* Add the conflict entries */ - for (i = 0; i < 3; i++) { - if (entries[i] == NULL) - continue; - - /* Make sure stage is correct */ - GIT_IDXENTRY_STAGE_SET(entries[i], i + 1); - - if ((ret = index_insert(index, &entries[i], 0, true)) < 0) - goto on_error; - - entries[i] = NULL; /* don't free if later entry fails */ - } - - return 0; - -on_error: - for (i = 0; i < 3; i++) { - if (entries[i] != NULL) - index_entry_free(entries[i]); - } - - return ret; -} - -static int index_conflict__get_byindex( - const git_index_entry **ancestor_out, - const git_index_entry **our_out, - const git_index_entry **their_out, - git_index *index, - size_t n) -{ - const git_index_entry *conflict_entry; - const char *path = NULL; - size_t count; - int stage, len = 0; - - assert(ancestor_out && our_out && their_out && index); - - *ancestor_out = NULL; - *our_out = NULL; - *their_out = NULL; - - for (count = git_index_entrycount(index); n < count; ++n) { - conflict_entry = git_vector_get(&index->entries, n); - - if (path && index->entries_cmp_path(conflict_entry->path, path) != 0) - break; - - stage = GIT_IDXENTRY_STAGE(conflict_entry); - path = conflict_entry->path; - - switch (stage) { - case 3: - *their_out = conflict_entry; - len++; - break; - case 2: - *our_out = conflict_entry; - len++; - break; - case 1: - *ancestor_out = conflict_entry; - len++; - break; - default: - break; - }; - } - - return len; -} - -int git_index_conflict_get( - const git_index_entry **ancestor_out, - const git_index_entry **our_out, - const git_index_entry **their_out, - git_index *index, - const char *path) -{ - size_t pos; - int len = 0; - - assert(ancestor_out && our_out && their_out && index && path); - - *ancestor_out = NULL; - *our_out = NULL; - *their_out = NULL; - - if (git_index_find(&pos, index, path) < 0) - return GIT_ENOTFOUND; - - if ((len = index_conflict__get_byindex( - ancestor_out, our_out, their_out, index, pos)) < 0) - return len; - else if (len == 0) - return GIT_ENOTFOUND; - - return 0; -} - -static int index_conflict_remove(git_index *index, const char *path) -{ - size_t pos = 0; - git_index_entry *conflict_entry; - int error = 0; - - if (path != NULL && git_index_find(&pos, index, path) < 0) - return GIT_ENOTFOUND; - - if (git_mutex_lock(&index->lock) < 0) { - giterr_set(GITERR_OS, "Unable to lock index"); - return -1; - } - - while ((conflict_entry = git_vector_get(&index->entries, pos)) != NULL) { - - if (path != NULL && - index->entries_cmp_path(conflict_entry->path, path) != 0) - break; - - if (GIT_IDXENTRY_STAGE(conflict_entry) == 0) { - pos++; - continue; - } - - if ((error = index_remove_entry(index, pos)) < 0) - break; - } - - git_mutex_unlock(&index->lock); - - return error; -} - -int git_index_conflict_remove(git_index *index, const char *path) -{ - assert(index && path); - return index_conflict_remove(index, path); -} - -int git_index_conflict_cleanup(git_index *index) -{ - assert(index); - return index_conflict_remove(index, NULL); -} - -int git_index_has_conflicts(const git_index *index) -{ - size_t i; - git_index_entry *entry; - - assert(index); - - git_vector_foreach(&index->entries, i, entry) { - if (GIT_IDXENTRY_STAGE(entry) > 0) - return 1; - } - - return 0; -} - -int git_index_conflict_iterator_new( - git_index_conflict_iterator **iterator_out, - git_index *index) -{ - git_index_conflict_iterator *it = NULL; - - assert(iterator_out && index); - - it = git__calloc(1, sizeof(git_index_conflict_iterator)); - GITERR_CHECK_ALLOC(it); - - it->index = index; - - *iterator_out = it; - return 0; -} - -int git_index_conflict_next( - const git_index_entry **ancestor_out, - const git_index_entry **our_out, - const git_index_entry **their_out, - git_index_conflict_iterator *iterator) -{ - const git_index_entry *entry; - int len; - - assert(ancestor_out && our_out && their_out && iterator); - - *ancestor_out = NULL; - *our_out = NULL; - *their_out = NULL; - - while (iterator->cur < iterator->index->entries.length) { - entry = git_index_get_byindex(iterator->index, iterator->cur); - - if (git_index_entry_is_conflict(entry)) { - if ((len = index_conflict__get_byindex( - ancestor_out, - our_out, - their_out, - iterator->index, - iterator->cur)) < 0) - return len; - - iterator->cur += len; - return 0; - } - - iterator->cur++; - } - - return GIT_ITEROVER; -} - -void git_index_conflict_iterator_free(git_index_conflict_iterator *iterator) -{ - if (iterator == NULL) - return; - - git__free(iterator); -} - -size_t git_index_name_entrycount(git_index *index) -{ - assert(index); - return index->names.length; -} - -const git_index_name_entry *git_index_name_get_byindex( - git_index *index, size_t n) -{ - assert(index); - - git_vector_sort(&index->names); - return git_vector_get(&index->names, n); -} - -static void index_name_entry_free(git_index_name_entry *ne) -{ - if (!ne) - return; - git__free(ne->ancestor); - git__free(ne->ours); - git__free(ne->theirs); - git__free(ne); -} - -int git_index_name_add(git_index *index, - const char *ancestor, const char *ours, const char *theirs) -{ - git_index_name_entry *conflict_name; - - assert((ancestor && ours) || (ancestor && theirs) || (ours && theirs)); - - conflict_name = git__calloc(1, sizeof(git_index_name_entry)); - GITERR_CHECK_ALLOC(conflict_name); - - if ((ancestor && !(conflict_name->ancestor = git__strdup(ancestor))) || - (ours && !(conflict_name->ours = git__strdup(ours))) || - (theirs && !(conflict_name->theirs = git__strdup(theirs))) || - git_vector_insert(&index->names, conflict_name) < 0) - { - index_name_entry_free(conflict_name); - return -1; - } - - return 0; -} - -void git_index_name_clear(git_index *index) -{ - size_t i; - git_index_name_entry *conflict_name; - - assert(index); - - git_vector_foreach(&index->names, i, conflict_name) - index_name_entry_free(conflict_name); - - git_vector_clear(&index->names); -} - -size_t git_index_reuc_entrycount(git_index *index) -{ - assert(index); - return index->reuc.length; -} - -static int index_reuc_insert( - git_index *index, - git_index_reuc_entry *reuc, - int replace) -{ - git_index_reuc_entry **existing = NULL; - size_t position; - - assert(index && reuc && reuc->path != NULL); - - if (!git_index_reuc_find(&position, index, reuc->path)) - existing = (git_index_reuc_entry **)&index->reuc.contents[position]; - - if (!replace || !existing) - return git_vector_insert(&index->reuc, reuc); - - /* exists, replace it */ - git__free(*existing); - *existing = reuc; - - return 0; -} - -int git_index_reuc_add(git_index *index, const char *path, - int ancestor_mode, const git_oid *ancestor_oid, - int our_mode, const git_oid *our_oid, - int their_mode, const git_oid *their_oid) -{ - git_index_reuc_entry *reuc = NULL; - int error = 0; - - assert(index && path); - - if ((error = index_entry_reuc_init(&reuc, path, ancestor_mode, - ancestor_oid, our_mode, our_oid, their_mode, their_oid)) < 0 || - (error = index_reuc_insert(index, reuc, 1)) < 0) - index_entry_reuc_free(reuc); - - return error; -} - -int git_index_reuc_find(size_t *at_pos, git_index *index, const char *path) -{ - return git_vector_bsearch2(at_pos, &index->reuc, index->reuc_search, path); -} - -const git_index_reuc_entry *git_index_reuc_get_bypath( - git_index *index, const char *path) -{ - size_t pos; - assert(index && path); - - if (!index->reuc.length) - return NULL; - - git_vector_sort(&index->reuc); - - if (git_index_reuc_find(&pos, index, path) < 0) - return NULL; - - return git_vector_get(&index->reuc, pos); -} - -const git_index_reuc_entry *git_index_reuc_get_byindex( - git_index *index, size_t n) -{ - assert(index); - - git_vector_sort(&index->reuc); - return git_vector_get(&index->reuc, n); -} - -int git_index_reuc_remove(git_index *index, size_t position) -{ - int error; - git_index_reuc_entry *reuc; - - git_vector_sort(&index->reuc); - - reuc = git_vector_get(&index->reuc, position); - error = git_vector_remove(&index->reuc, position); - - if (!error) - index_entry_reuc_free(reuc); - - return error; -} - -void git_index_reuc_clear(git_index *index) -{ - size_t i; - - assert(index); - - for (i = 0; i < index->reuc.length; ++i) - index_entry_reuc_free(git__swap(index->reuc.contents[i], NULL)); - - git_vector_clear(&index->reuc); -} - -static int index_error_invalid(const char *message) -{ - giterr_set(GITERR_INDEX, "Invalid data in index - %s", message); - return -1; -} - -static int read_reuc(git_index *index, const char *buffer, size_t size) -{ - const char *endptr; - size_t len; - int i; - - /* If called multiple times, the vector might already be initialized */ - if (index->reuc._alloc_size == 0 && - git_vector_init(&index->reuc, 16, reuc_cmp) < 0) - return -1; - - while (size) { - git_index_reuc_entry *lost; - - len = p_strnlen(buffer, size) + 1; - if (size <= len) - return index_error_invalid("reading reuc entries"); - - lost = reuc_entry_alloc(buffer); - GITERR_CHECK_ALLOC(lost); - - size -= len; - buffer += len; - - /* read 3 ASCII octal numbers for stage entries */ - for (i = 0; i < 3; i++) { - int tmp; - - if (git__strtol32(&tmp, buffer, &endptr, 8) < 0 || - !endptr || endptr == buffer || *endptr || - (unsigned)tmp > UINT_MAX) { - index_entry_reuc_free(lost); - return index_error_invalid("reading reuc entry stage"); - } - - lost->mode[i] = tmp; - - len = (endptr + 1) - buffer; - if (size <= len) { - index_entry_reuc_free(lost); - return index_error_invalid("reading reuc entry stage"); - } - - size -= len; - buffer += len; - } - - /* read up to 3 OIDs for stage entries */ - for (i = 0; i < 3; i++) { - if (!lost->mode[i]) - continue; - if (size < 20) { - index_entry_reuc_free(lost); - return index_error_invalid("reading reuc entry oid"); - } - - git_oid_fromraw(&lost->oid[i], (const unsigned char *) buffer); - size -= 20; - buffer += 20; - } - - /* entry was read successfully - insert into reuc vector */ - if (git_vector_insert(&index->reuc, lost) < 0) - return -1; - } - - /* entries are guaranteed to be sorted on-disk */ - git_vector_set_sorted(&index->reuc, true); - - return 0; -} - - -static int read_conflict_names(git_index *index, const char *buffer, size_t size) -{ - size_t len; - - /* This gets called multiple times, the vector might already be initialized */ - if (index->names._alloc_size == 0 && - git_vector_init(&index->names, 16, conflict_name_cmp) < 0) - return -1; - -#define read_conflict_name(ptr) \ - len = p_strnlen(buffer, size) + 1; \ - if (size < len) \ - return index_error_invalid("reading conflict name entries"); \ - \ - if (len == 1) \ - ptr = NULL; \ - else { \ - ptr = git__malloc(len); \ - GITERR_CHECK_ALLOC(ptr); \ - memcpy(ptr, buffer, len); \ - } \ - \ - buffer += len; \ - size -= len; - - while (size) { - git_index_name_entry *conflict_name = git__calloc(1, sizeof(git_index_name_entry)); - GITERR_CHECK_ALLOC(conflict_name); - - read_conflict_name(conflict_name->ancestor); - read_conflict_name(conflict_name->ours); - read_conflict_name(conflict_name->theirs); - - if (git_vector_insert(&index->names, conflict_name) < 0) - return -1; - } - -#undef read_conflict_name - - /* entries are guaranteed to be sorted on-disk */ - git_vector_set_sorted(&index->names, true); - - return 0; -} - -static size_t read_entry( - git_index_entry **out, - git_index *index, - const void *buffer, - size_t buffer_size) -{ - size_t path_length, entry_size; - const char *path_ptr; - struct entry_short source; - git_index_entry entry = {{0}}; - - if (INDEX_FOOTER_SIZE + minimal_entry_size > buffer_size) - return 0; - - /* buffer is not guaranteed to be aligned */ - memcpy(&source, buffer, sizeof(struct entry_short)); - - entry.ctime.seconds = (git_time_t)ntohl(source.ctime.seconds); - entry.ctime.nanoseconds = ntohl(source.ctime.nanoseconds); - entry.mtime.seconds = (git_time_t)ntohl(source.mtime.seconds); - entry.mtime.nanoseconds = ntohl(source.mtime.nanoseconds); - entry.dev = ntohl(source.dev); - entry.ino = ntohl(source.ino); - entry.mode = ntohl(source.mode); - entry.uid = ntohl(source.uid); - entry.gid = ntohl(source.gid); - entry.file_size = ntohl(source.file_size); - git_oid_cpy(&entry.id, &source.oid); - entry.flags = ntohs(source.flags); - - if (entry.flags & GIT_IDXENTRY_EXTENDED) { - uint16_t flags_raw; - size_t flags_offset; - - flags_offset = offsetof(struct entry_long, flags_extended); - memcpy(&flags_raw, (const char *) buffer + flags_offset, - sizeof(flags_raw)); - flags_raw = ntohs(flags_raw); - - memcpy(&entry.flags_extended, &flags_raw, sizeof(flags_raw)); - path_ptr = (const char *) buffer + offsetof(struct entry_long, path); - } else - path_ptr = (const char *) buffer + offsetof(struct entry_short, path); - - path_length = entry.flags & GIT_IDXENTRY_NAMEMASK; - - /* if this is a very long string, we must find its - * real length without overflowing */ - if (path_length == 0xFFF) { - const char *path_end; - - path_end = memchr(path_ptr, '\0', buffer_size); - if (path_end == NULL) - return 0; - - path_length = path_end - path_ptr; - } - - if (entry.flags & GIT_IDXENTRY_EXTENDED) - entry_size = long_entry_size(path_length); - else - entry_size = short_entry_size(path_length); - - if (INDEX_FOOTER_SIZE + entry_size > buffer_size) - return 0; - - entry.path = (char *)path_ptr; - - if (index_entry_dup(out, INDEX_OWNER(index), &entry) < 0) - return 0; - - return entry_size; -} - -static int read_header(struct index_header *dest, const void *buffer) -{ - const struct index_header *source = buffer; - - dest->signature = ntohl(source->signature); - if (dest->signature != INDEX_HEADER_SIG) - return index_error_invalid("incorrect header signature"); - - dest->version = ntohl(source->version); - if (dest->version != INDEX_VERSION_NUMBER_EXT && - dest->version != INDEX_VERSION_NUMBER) - return index_error_invalid("incorrect header version"); - - dest->entry_count = ntohl(source->entry_count); - return 0; -} - -static size_t read_extension(git_index *index, const char *buffer, size_t buffer_size) -{ - struct index_extension dest; - size_t total_size; - - /* buffer is not guaranteed to be aligned */ - memcpy(&dest, buffer, sizeof(struct index_extension)); - dest.extension_size = ntohl(dest.extension_size); - - total_size = dest.extension_size + sizeof(struct index_extension); - - if (dest.extension_size > total_size || - buffer_size < total_size || - buffer_size - total_size < INDEX_FOOTER_SIZE) - return 0; - - /* optional extension */ - if (dest.signature[0] >= 'A' && dest.signature[0] <= 'Z') { - /* tree cache */ - if (memcmp(dest.signature, INDEX_EXT_TREECACHE_SIG, 4) == 0) { - if (git_tree_cache_read(&index->tree, buffer + 8, dest.extension_size, &index->tree_pool) < 0) - return 0; - } else if (memcmp(dest.signature, INDEX_EXT_UNMERGED_SIG, 4) == 0) { - if (read_reuc(index, buffer + 8, dest.extension_size) < 0) - return 0; - } else if (memcmp(dest.signature, INDEX_EXT_CONFLICT_NAME_SIG, 4) == 0) { - if (read_conflict_names(index, buffer + 8, dest.extension_size) < 0) - return 0; - } - /* else, unsupported extension. We cannot parse this, but we can skip - * it by returning `total_size */ - } else { - /* we cannot handle non-ignorable extensions; - * in fact they aren't even defined in the standard */ - return 0; - } - - return total_size; -} - -static int parse_index(git_index *index, const char *buffer, size_t buffer_size) -{ - int error = 0; - unsigned int i; - struct index_header header = { 0 }; - git_oid checksum_calculated, checksum_expected; - -#define seek_forward(_increase) { \ - if (_increase >= buffer_size) { \ - error = index_error_invalid("ran out of data while parsing"); \ - goto done; } \ - buffer += _increase; \ - buffer_size -= _increase;\ -} - - if (buffer_size < INDEX_HEADER_SIZE + INDEX_FOOTER_SIZE) - return index_error_invalid("insufficient buffer space"); - - /* Precalculate the SHA1 of the files's contents -- we'll match it to - * the provided SHA1 in the footer */ - git_hash_buf(&checksum_calculated, buffer, buffer_size - INDEX_FOOTER_SIZE); - - /* Parse header */ - if ((error = read_header(&header, buffer)) < 0) - return error; - - seek_forward(INDEX_HEADER_SIZE); - - if (git_mutex_lock(&index->lock) < 0) { - giterr_set(GITERR_OS, "Unable to acquire index lock"); - return -1; - } - - assert(!index->entries.length); - - /* Parse all the entries */ - for (i = 0; i < header.entry_count && buffer_size > INDEX_FOOTER_SIZE; ++i) { - git_index_entry *entry; - size_t entry_size = read_entry(&entry, index, buffer, buffer_size); - - /* 0 bytes read means an object corruption */ - if (entry_size == 0) { - error = index_error_invalid("invalid entry"); - goto done; - } - - if ((error = git_vector_insert(&index->entries, entry)) < 0) { - index_entry_free(entry); - goto done; - } - - seek_forward(entry_size); - } - - if (i != header.entry_count) { - error = index_error_invalid("header entries changed while parsing"); - goto done; - } - - /* There's still space for some extensions! */ - while (buffer_size > INDEX_FOOTER_SIZE) { - size_t extension_size; - - extension_size = read_extension(index, buffer, buffer_size); - - /* see if we have read any bytes from the extension */ - if (extension_size == 0) { - error = index_error_invalid("extension is truncated"); - goto done; - } - - seek_forward(extension_size); - } - - if (buffer_size != INDEX_FOOTER_SIZE) { - error = index_error_invalid( - "buffer size does not match index footer size"); - goto done; - } - - /* 160-bit SHA-1 over the content of the index file before this checksum. */ - git_oid_fromraw(&checksum_expected, (const unsigned char *)buffer); - - if (git_oid__cmp(&checksum_calculated, &checksum_expected) != 0) { - error = index_error_invalid( - "calculated checksum does not match expected"); - goto done; - } - - git_oid_cpy(&index->checksum, &checksum_calculated); - -#undef seek_forward - - /* Entries are stored case-sensitively on disk, so re-sort now if - * in-memory index is supposed to be case-insensitive - */ - git_vector_set_sorted(&index->entries, !index->ignore_case); - error = index_sort_if_needed(index, false); - -done: - git_mutex_unlock(&index->lock); - return error; -} - -static bool is_index_extended(git_index *index) -{ - size_t i, extended; - git_index_entry *entry; - - extended = 0; - - git_vector_foreach(&index->entries, i, entry) { - entry->flags &= ~GIT_IDXENTRY_EXTENDED; - if (entry->flags_extended & GIT_IDXENTRY_EXTENDED_FLAGS) { - extended++; - entry->flags |= GIT_IDXENTRY_EXTENDED; - } - } - - return (extended > 0); -} - -static int write_disk_entry(git_filebuf *file, git_index_entry *entry) -{ - void *mem = NULL; - struct entry_short *ondisk; - size_t path_len, disk_size; - char *path; - - path_len = ((struct entry_internal *)entry)->pathlen; - - if (entry->flags & GIT_IDXENTRY_EXTENDED) - disk_size = long_entry_size(path_len); - else - disk_size = short_entry_size(path_len); - - if (git_filebuf_reserve(file, &mem, disk_size) < 0) - return -1; - - ondisk = (struct entry_short *)mem; - - memset(ondisk, 0x0, disk_size); - - /** - * Yes, we have to truncate. - * - * The on-disk format for Index entries clearly defines - * the time and size fields to be 4 bytes each -- so even if - * we store these values with 8 bytes on-memory, they must - * be truncated to 4 bytes before writing to disk. - * - * In 2038 I will be either too dead or too rich to care about this - */ - ondisk->ctime.seconds = htonl((uint32_t)entry->ctime.seconds); - ondisk->mtime.seconds = htonl((uint32_t)entry->mtime.seconds); - ondisk->ctime.nanoseconds = htonl(entry->ctime.nanoseconds); - ondisk->mtime.nanoseconds = htonl(entry->mtime.nanoseconds); - ondisk->dev = htonl(entry->dev); - ondisk->ino = htonl(entry->ino); - ondisk->mode = htonl(entry->mode); - ondisk->uid = htonl(entry->uid); - ondisk->gid = htonl(entry->gid); - ondisk->file_size = htonl((uint32_t)entry->file_size); - - git_oid_cpy(&ondisk->oid, &entry->id); - - ondisk->flags = htons(entry->flags); - - if (entry->flags & GIT_IDXENTRY_EXTENDED) { - struct entry_long *ondisk_ext; - ondisk_ext = (struct entry_long *)ondisk; - ondisk_ext->flags_extended = htons(entry->flags_extended); - path = ondisk_ext->path; - } - else - path = ondisk->path; - - memcpy(path, entry->path, path_len); - - return 0; -} - -static int write_entries(git_index *index, git_filebuf *file) -{ - int error = 0; - size_t i; - git_vector case_sorted, *entries; - git_index_entry *entry; - - if (git_mutex_lock(&index->lock) < 0) { - giterr_set(GITERR_OS, "Failed to lock index"); - return -1; - } - - /* If index->entries is sorted case-insensitively, then we need - * to re-sort it case-sensitively before writing */ - if (index->ignore_case) { - git_vector_dup(&case_sorted, &index->entries, git_index_entry_cmp); - git_vector_sort(&case_sorted); - entries = &case_sorted; - } else { - entries = &index->entries; - } - - git_vector_foreach(entries, i, entry) - if ((error = write_disk_entry(file, entry)) < 0) - break; - - git_mutex_unlock(&index->lock); - - if (index->ignore_case) - git_vector_free(&case_sorted); - - return error; -} - -static int write_extension(git_filebuf *file, struct index_extension *header, git_buf *data) -{ - struct index_extension ondisk; - - memset(&ondisk, 0x0, sizeof(struct index_extension)); - memcpy(&ondisk, header, 4); - ondisk.extension_size = htonl(header->extension_size); - - git_filebuf_write(file, &ondisk, sizeof(struct index_extension)); - return git_filebuf_write(file, data->ptr, data->size); -} - -static int create_name_extension_data(git_buf *name_buf, git_index_name_entry *conflict_name) -{ - int error = 0; - - if (conflict_name->ancestor == NULL) - error = git_buf_put(name_buf, "\0", 1); - else - error = git_buf_put(name_buf, conflict_name->ancestor, strlen(conflict_name->ancestor) + 1); - - if (error != 0) - goto on_error; - - if (conflict_name->ours == NULL) - error = git_buf_put(name_buf, "\0", 1); - else - error = git_buf_put(name_buf, conflict_name->ours, strlen(conflict_name->ours) + 1); - - if (error != 0) - goto on_error; - - if (conflict_name->theirs == NULL) - error = git_buf_put(name_buf, "\0", 1); - else - error = git_buf_put(name_buf, conflict_name->theirs, strlen(conflict_name->theirs) + 1); - -on_error: - return error; -} - -static int write_name_extension(git_index *index, git_filebuf *file) -{ - git_buf name_buf = GIT_BUF_INIT; - git_vector *out = &index->names; - git_index_name_entry *conflict_name; - struct index_extension extension; - size_t i; - int error = 0; - - git_vector_foreach(out, i, conflict_name) { - if ((error = create_name_extension_data(&name_buf, conflict_name)) < 0) - goto done; - } - - memset(&extension, 0x0, sizeof(struct index_extension)); - memcpy(&extension.signature, INDEX_EXT_CONFLICT_NAME_SIG, 4); - extension.extension_size = (uint32_t)name_buf.size; - - error = write_extension(file, &extension, &name_buf); - - git_buf_free(&name_buf); - -done: - return error; -} - -static int create_reuc_extension_data(git_buf *reuc_buf, git_index_reuc_entry *reuc) -{ - int i; - int error = 0; - - if ((error = git_buf_put(reuc_buf, reuc->path, strlen(reuc->path) + 1)) < 0) - return error; - - for (i = 0; i < 3; i++) { - if ((error = git_buf_printf(reuc_buf, "%o", reuc->mode[i])) < 0 || - (error = git_buf_put(reuc_buf, "\0", 1)) < 0) - return error; - } - - for (i = 0; i < 3; i++) { - if (reuc->mode[i] && (error = git_buf_put(reuc_buf, (char *)&reuc->oid[i].id, GIT_OID_RAWSZ)) < 0) - return error; - } - - return 0; -} - -static int write_reuc_extension(git_index *index, git_filebuf *file) -{ - git_buf reuc_buf = GIT_BUF_INIT; - git_vector *out = &index->reuc; - git_index_reuc_entry *reuc; - struct index_extension extension; - size_t i; - int error = 0; - - git_vector_foreach(out, i, reuc) { - if ((error = create_reuc_extension_data(&reuc_buf, reuc)) < 0) - goto done; - } - - memset(&extension, 0x0, sizeof(struct index_extension)); - memcpy(&extension.signature, INDEX_EXT_UNMERGED_SIG, 4); - extension.extension_size = (uint32_t)reuc_buf.size; - - error = write_extension(file, &extension, &reuc_buf); - - git_buf_free(&reuc_buf); - -done: - return error; -} - -static int write_tree_extension(git_index *index, git_filebuf *file) -{ - struct index_extension extension; - git_buf buf = GIT_BUF_INIT; - int error; - - if (index->tree == NULL) - return 0; - - if ((error = git_tree_cache_write(&buf, index->tree)) < 0) - return error; - - memset(&extension, 0x0, sizeof(struct index_extension)); - memcpy(&extension.signature, INDEX_EXT_TREECACHE_SIG, 4); - extension.extension_size = (uint32_t)buf.size; - - error = write_extension(file, &extension, &buf); - - git_buf_free(&buf); - - return error; -} - -static int write_index(git_oid *checksum, git_index *index, git_filebuf *file) -{ - git_oid hash_final; - struct index_header header; - bool is_extended; - uint32_t index_version_number; - - assert(index && file); - - is_extended = is_index_extended(index); - index_version_number = is_extended ? INDEX_VERSION_NUMBER_EXT : INDEX_VERSION_NUMBER; - - header.signature = htonl(INDEX_HEADER_SIG); - header.version = htonl(index_version_number); - header.entry_count = htonl((uint32_t)index->entries.length); - - if (git_filebuf_write(file, &header, sizeof(struct index_header)) < 0) - return -1; - - if (write_entries(index, file) < 0) - return -1; - - /* write the tree cache extension */ - if (index->tree != NULL && write_tree_extension(index, file) < 0) - return -1; - - /* write the rename conflict extension */ - if (index->names.length > 0 && write_name_extension(index, file) < 0) - return -1; - - /* write the reuc extension */ - if (index->reuc.length > 0 && write_reuc_extension(index, file) < 0) - return -1; - - /* get out the hash for all the contents we've appended to the file */ - git_filebuf_hash(&hash_final, file); - git_oid_cpy(checksum, &hash_final); - - /* write it at the end of the file */ - return git_filebuf_write(file, hash_final.id, GIT_OID_RAWSZ); -} - -int git_index_entry_stage(const git_index_entry *entry) -{ - return GIT_IDXENTRY_STAGE(entry); -} - -int git_index_entry_is_conflict(const git_index_entry *entry) -{ - return (GIT_IDXENTRY_STAGE(entry) > 0); -} - -typedef struct read_tree_data { - git_index *index; - git_vector *old_entries; - git_vector *new_entries; - git_vector_cmp entry_cmp; - git_tree_cache *tree; -} read_tree_data; - -static int read_tree_cb( - const char *root, const git_tree_entry *tentry, void *payload) -{ - read_tree_data *data = payload; - git_index_entry *entry = NULL, *old_entry; - git_buf path = GIT_BUF_INIT; - size_t pos; - - if (git_tree_entry__is_tree(tentry)) - return 0; - - if (git_buf_joinpath(&path, root, tentry->filename) < 0) - return -1; - - if (index_entry_create(&entry, INDEX_OWNER(data->index), path.ptr) < 0) - return -1; - - entry->mode = tentry->attr; - entry->id = tentry->oid; - - /* look for corresponding old entry and copy data to new entry */ - if (data->old_entries != NULL && - !index_find_in_entries( - &pos, data->old_entries, data->entry_cmp, path.ptr, 0, 0) && - (old_entry = git_vector_get(data->old_entries, pos)) != NULL && - entry->mode == old_entry->mode && - git_oid_equal(&entry->id, &old_entry->id)) - { - index_entry_cpy(entry, old_entry); - entry->flags_extended = 0; - } - - if (path.size < GIT_IDXENTRY_NAMEMASK) - entry->flags = path.size & GIT_IDXENTRY_NAMEMASK; - else - entry->flags = GIT_IDXENTRY_NAMEMASK; - - git_buf_free(&path); - - if (git_vector_insert(data->new_entries, entry) < 0) { - index_entry_free(entry); - return -1; - } - - return 0; -} - -int git_index_read_tree(git_index *index, const git_tree *tree) -{ - int error = 0; - git_vector entries = GIT_VECTOR_INIT; - read_tree_data data; - - git_vector_set_cmp(&entries, index->entries._cmp); /* match sort */ - - data.index = index; - data.old_entries = &index->entries; - data.new_entries = &entries; - data.entry_cmp = index->entries_search; - - index->tree = NULL; - git_pool_clear(&index->tree_pool); - - if (index_sort_if_needed(index, true) < 0) - return -1; - - error = git_tree_walk(tree, GIT_TREEWALK_POST, read_tree_cb, &data); - - if (!error) { - git_vector_sort(&entries); - - if ((error = git_index_clear(index)) < 0) - /* well, this isn't good */; - else if (git_mutex_lock(&index->lock) < 0) { - giterr_set(GITERR_OS, "Unable to acquire index lock"); - error = -1; - } else { - git_vector_swap(&entries, &index->entries); - git_mutex_unlock(&index->lock); - } - } - - git_vector_free(&entries); - if (error < 0) - return error; - - error = git_tree_cache_read_tree(&index->tree, tree, &index->tree_pool); - - return error; -} - -int git_index_read_index( - git_index *index, - const git_index *new_index) -{ - git_vector new_entries = GIT_VECTOR_INIT, - remove_entries = GIT_VECTOR_INIT; - git_iterator *index_iterator = NULL; - git_iterator *new_iterator = NULL; - const git_index_entry *old_entry, *new_entry; - git_index_entry *entry; - size_t i; - int error; - - if ((error = git_vector_init(&new_entries, new_index->entries.length, index->entries._cmp)) < 0 || - (error = git_vector_init(&remove_entries, index->entries.length, NULL)) < 0) - goto done; - - if ((error = git_iterator_for_index(&index_iterator, - index, GIT_ITERATOR_DONT_IGNORE_CASE, NULL, NULL)) < 0 || - (error = git_iterator_for_index(&new_iterator, - (git_index *)new_index, GIT_ITERATOR_DONT_IGNORE_CASE, NULL, NULL)) < 0) - goto done; - - if (((error = git_iterator_current(&old_entry, index_iterator)) < 0 && - error != GIT_ITEROVER) || - ((error = git_iterator_current(&new_entry, new_iterator)) < 0 && - error != GIT_ITEROVER)) - goto done; - - while (true) { - int diff; - - if (old_entry && new_entry) - diff = git_index_entry_cmp(old_entry, new_entry); - else if (!old_entry && new_entry) - diff = 1; - else if (old_entry && !new_entry) - diff = -1; - else - break; - - if (diff < 0) { - git_vector_insert(&remove_entries, (git_index_entry *)old_entry); - } else if (diff > 0) { - if ((error = index_entry_dup(&entry, git_index_owner(index), new_entry)) < 0) - goto done; - - git_vector_insert(&new_entries, entry); - } else { - /* Path and stage are equal, if the OID is equal, keep it to - * keep the stat cache data. - */ - if (git_oid_equal(&old_entry->id, &new_entry->id)) { - git_vector_insert(&new_entries, (git_index_entry *)old_entry); - } else { - if ((error = index_entry_dup(&entry, git_index_owner(index), new_entry)) < 0) - goto done; - - git_vector_insert(&new_entries, entry); - git_vector_insert(&remove_entries, (git_index_entry *)old_entry); - } - } - - if (diff <= 0) { - if ((error = git_iterator_advance(&old_entry, index_iterator)) < 0 && - error != GIT_ITEROVER) - goto done; - } - - if (diff >= 0) { - if ((error = git_iterator_advance(&new_entry, new_iterator)) < 0 && - error != GIT_ITEROVER) - goto done; - } - } - - git_index_name_clear(index); - git_index_reuc_clear(index); - - git_vector_swap(&new_entries, &index->entries); - - git_vector_foreach(&remove_entries, i, entry) { - if (index->tree) - git_tree_cache_invalidate_path(index->tree, entry->path); - - index_entry_free(entry); - } - - error = 0; - -done: - git_vector_free(&new_entries); - git_vector_free(&remove_entries); - git_iterator_free(index_iterator); - git_iterator_free(new_iterator); - return error; -} - -git_repository *git_index_owner(const git_index *index) -{ - return INDEX_OWNER(index); -} - -enum { - INDEX_ACTION_NONE = 0, - INDEX_ACTION_UPDATE = 1, - INDEX_ACTION_REMOVE = 2, - INDEX_ACTION_ADDALL = 3, -}; - -int git_index_add_all( - git_index *index, - const git_strarray *paths, - unsigned int flags, - git_index_matched_path_cb cb, - void *payload) -{ - int error; - git_repository *repo; - git_iterator *wditer = NULL; - git_pathspec ps; - bool no_fnmatch = (flags & GIT_INDEX_ADD_DISABLE_PATHSPEC_MATCH) != 0; - - assert(index); - - repo = INDEX_OWNER(index); - if ((error = git_repository__ensure_not_bare(repo, "index add all")) < 0) - return error; - - if ((error = git_pathspec__init(&ps, paths)) < 0) - return error; - - /* optionally check that pathspec doesn't mention any ignored files */ - if ((flags & GIT_INDEX_ADD_CHECK_PATHSPEC) != 0 && - (flags & GIT_INDEX_ADD_FORCE) == 0 && - (error = git_ignore__check_pathspec_for_exact_ignores( - repo, &ps.pathspec, no_fnmatch)) < 0) - goto cleanup; - - error = index_apply_to_wd_diff(index, INDEX_ACTION_ADDALL, paths, flags, cb, payload); - - if (error) - giterr_set_after_callback(error); - -cleanup: - git_iterator_free(wditer); - git_pathspec__clear(&ps); - - return error; -} - -struct foreach_diff_data { - git_index *index; - const git_pathspec *pathspec; - unsigned int flags; - git_index_matched_path_cb cb; - void *payload; -}; - -static int apply_each_file(const git_diff_delta *delta, float progress, void *payload) -{ - struct foreach_diff_data *data = payload; - const char *match, *path; - int error = 0; - - GIT_UNUSED(progress); - - path = delta->old_file.path; - - /* We only want those which match the pathspecs */ - if (!git_pathspec__match( - &data->pathspec->pathspec, path, false, (bool)data->index->ignore_case, - &match, NULL)) - return 0; - - if (data->cb) - error = data->cb(path, match, data->payload); - - if (error > 0) /* skip this entry */ - return 0; - if (error < 0) /* actual error */ - return error; - - /* If the workdir item does not exist, remove it from the index. */ - if ((delta->new_file.flags & GIT_DIFF_FLAG_EXISTS) == 0) - error = git_index_remove_bypath(data->index, path); - else - error = git_index_add_bypath(data->index, delta->new_file.path); - - return error; -} - -static int index_apply_to_wd_diff(git_index *index, int action, const git_strarray *paths, - unsigned int flags, - git_index_matched_path_cb cb, void *payload) -{ - int error; - git_diff *diff; - git_pathspec ps; - git_repository *repo; - git_diff_options opts = GIT_DIFF_OPTIONS_INIT; - struct foreach_diff_data data = { - index, - NULL, - flags, - cb, - payload, - }; - - assert(index); - assert(action == INDEX_ACTION_UPDATE || action == INDEX_ACTION_ADDALL); - - repo = INDEX_OWNER(index); - - if (!repo) { - return create_index_error(-1, - "cannot run update; the index is not backed up by a repository."); - } - - /* - * We do the matching ourselves intead of passing the list to - * diff because we want to tell the callback which one - * matched, which we do not know if we ask diff to filter for us. - */ - if ((error = git_pathspec__init(&ps, paths)) < 0) - return error; - - opts.flags = GIT_DIFF_INCLUDE_TYPECHANGE; - if (action == INDEX_ACTION_ADDALL) { - opts.flags |= GIT_DIFF_INCLUDE_UNTRACKED | - GIT_DIFF_RECURSE_UNTRACKED_DIRS; - - if (flags == GIT_INDEX_ADD_FORCE) - opts.flags |= GIT_DIFF_INCLUDE_IGNORED; - } - - if ((error = git_diff_index_to_workdir(&diff, repo, index, &opts)) < 0) - goto cleanup; - - data.pathspec = &ps; - error = git_diff_foreach(diff, apply_each_file, NULL, NULL, NULL, &data); - git_diff_free(diff); - - if (error) /* make sure error is set if callback stopped iteration */ - giterr_set_after_callback(error); - -cleanup: - git_pathspec__clear(&ps); - return error; -} - -static int index_apply_to_all( - git_index *index, - int action, - const git_strarray *paths, - git_index_matched_path_cb cb, - void *payload) -{ - int error = 0; - size_t i; - git_pathspec ps; - const char *match; - git_buf path = GIT_BUF_INIT; - - assert(index); - - if ((error = git_pathspec__init(&ps, paths)) < 0) - return error; - - git_vector_sort(&index->entries); - - for (i = 0; !error && i < index->entries.length; ++i) { - git_index_entry *entry = git_vector_get(&index->entries, i); - - /* check if path actually matches */ - if (!git_pathspec__match( - &ps.pathspec, entry->path, false, (bool)index->ignore_case, - &match, NULL)) - continue; - - /* issue notification callback if requested */ - if (cb && (error = cb(entry->path, match, payload)) != 0) { - if (error > 0) { /* return > 0 means skip this one */ - error = 0; - continue; - } - if (error < 0) /* return < 0 means abort */ - break; - } - - /* index manipulation may alter entry, so don't depend on it */ - if ((error = git_buf_sets(&path, entry->path)) < 0) - break; - - switch (action) { - case INDEX_ACTION_NONE: - break; - case INDEX_ACTION_UPDATE: - error = git_index_add_bypath(index, path.ptr); - - if (error == GIT_ENOTFOUND) { - giterr_clear(); - - error = git_index_remove_bypath(index, path.ptr); - - if (!error) /* back up foreach if we removed this */ - i--; - } - break; - case INDEX_ACTION_REMOVE: - if (!(error = git_index_remove_bypath(index, path.ptr))) - i--; /* back up foreach if we removed this */ - break; - default: - giterr_set(GITERR_INVALID, "Unknown index action %d", action); - error = -1; - break; - } - } - - git_buf_free(&path); - git_pathspec__clear(&ps); - - return error; -} - -int git_index_remove_all( - git_index *index, - const git_strarray *pathspec, - git_index_matched_path_cb cb, - void *payload) -{ - int error = index_apply_to_all( - index, INDEX_ACTION_REMOVE, pathspec, cb, payload); - - if (error) /* make sure error is set if callback stopped iteration */ - giterr_set_after_callback(error); - - return error; -} - -int git_index_update_all( - git_index *index, - const git_strarray *pathspec, - git_index_matched_path_cb cb, - void *payload) -{ - int error = index_apply_to_wd_diff(index, INDEX_ACTION_UPDATE, pathspec, 0, cb, payload); - if (error) /* make sure error is set if callback stopped iteration */ - giterr_set_after_callback(error); - - return error; -} - -int git_index_snapshot_new(git_vector *snap, git_index *index) -{ - int error; - - GIT_REFCOUNT_INC(index); - - if (git_mutex_lock(&index->lock) < 0) { - giterr_set(GITERR_OS, "Failed to lock index"); - return -1; - } - - git_atomic_inc(&index->readers); - git_vector_sort(&index->entries); - - error = git_vector_dup(snap, &index->entries, index->entries._cmp); - - git_mutex_unlock(&index->lock); - - if (error < 0) - git_index_free(index); - - return error; -} - -void git_index_snapshot_release(git_vector *snap, git_index *index) -{ - git_vector_free(snap); - - git_atomic_dec(&index->readers); - - if (!git_mutex_lock(&index->lock)) { - index_free_deleted(index); /* try to free pending deleted items */ - git_mutex_unlock(&index->lock); - } - - git_index_free(index); -} - -int git_index_snapshot_find( - size_t *out, git_vector *entries, git_vector_cmp entry_srch, - const char *path, size_t path_len, int stage) -{ - return index_find_in_entries(out, entries, entry_srch, path, path_len, stage); -} - -int git_indexwriter_init( - git_indexwriter *writer, - git_index *index) -{ - int error; - - GIT_REFCOUNT_INC(index); - - writer->index = index; - - if (!index->index_file_path) - return create_index_error(-1, - "Failed to write index: The index is in-memory only"); - - if ((error = git_filebuf_open( - &writer->file, index->index_file_path, GIT_FILEBUF_HASH_CONTENTS, GIT_INDEX_FILE_MODE)) < 0) { - - if (error == GIT_ELOCKED) - giterr_set(GITERR_INDEX, "The index is locked. This might be due to a concurrent or crashed process"); - - return error; - } - - writer->should_write = 1; - - return 0; -} - -int git_indexwriter_init_for_operation( - git_indexwriter *writer, - git_repository *repo, - unsigned int *checkout_strategy) -{ - git_index *index; - int error; - - if ((error = git_repository_index__weakptr(&index, repo)) < 0 || - (error = git_indexwriter_init(writer, index)) < 0) - return error; - - writer->should_write = (*checkout_strategy & GIT_CHECKOUT_DONT_WRITE_INDEX) == 0; - *checkout_strategy |= GIT_CHECKOUT_DONT_WRITE_INDEX; - - return 0; -} - -int git_indexwriter_commit(git_indexwriter *writer) -{ - int error; - git_oid checksum = {{ 0 }}; - - if (!writer->should_write) - return 0; - - if (index_sort_if_needed(writer->index, true) < 0) - return -1; - - git_vector_sort(&writer->index->reuc); - - if ((error = write_index(&checksum, writer->index, &writer->file)) < 0) { - git_indexwriter_cleanup(writer); - return error; - } - - if ((error = git_filebuf_commit(&writer->file)) < 0) - return error; - - if ((error = git_futils_filestamp_check( - &writer->index->stamp, writer->index->index_file_path)) < 0) { - giterr_set(GITERR_OS, "Could not read index timestamp"); - return -1; - } - - writer->index->on_disk = 1; - git_oid_cpy(&writer->index->checksum, &checksum); - - git_index_free(writer->index); - writer->index = NULL; - - return 0; -} - -void git_indexwriter_cleanup(git_indexwriter *writer) -{ - git_filebuf_cleanup(&writer->file); - - git_index_free(writer->index); - writer->index = NULL; -} diff --git a/vendor/libgit2/src/index.h b/vendor/libgit2/src/index.h deleted file mode 100644 index 9c60b015c5..0000000000 --- a/vendor/libgit2/src/index.h +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_index_h__ -#define INCLUDE_index_h__ - -#include "fileops.h" -#include "filebuf.h" -#include "vector.h" -#include "tree-cache.h" -#include "git2/odb.h" -#include "git2/index.h" - -#define GIT_INDEX_FILE "index" -#define GIT_INDEX_FILE_MODE 0666 - -struct git_index { - git_refcount rc; - - char *index_file_path; - git_futils_filestamp stamp; - git_oid checksum; /* checksum at the end of the file */ - - git_vector entries; - - git_mutex lock; /* lock held while entries is being changed */ - git_vector deleted; /* deleted entries if readers > 0 */ - git_atomic readers; /* number of active iterators */ - - unsigned int on_disk:1; - unsigned int ignore_case:1; - unsigned int distrust_filemode:1; - unsigned int no_symlinks:1; - - git_tree_cache *tree; - git_pool tree_pool; - - git_vector names; - git_vector reuc; - - git_vector_cmp entries_cmp_path; - git_vector_cmp entries_search; - git_vector_cmp entries_search_path; - git_vector_cmp reuc_search; -}; - -struct git_index_conflict_iterator { - git_index *index; - size_t cur; -}; - -extern void git_index_entry__init_from_stat( - git_index_entry *entry, struct stat *st, bool trust_mode); - -/* Index entry comparison functions for array sorting */ -extern int git_index_entry_cmp(const void *a, const void *b); -extern int git_index_entry_icmp(const void *a, const void *b); - -/* Index entry search functions for search using a search spec */ -extern int git_index_entry_srch(const void *a, const void *b); -extern int git_index_entry_isrch(const void *a, const void *b); - -/* Search index for `path`, returning GIT_ENOTFOUND if it does not exist - * (but not setting an error message). - * - * `at_pos` is set to the position where it is or would be inserted. - * Pass `path_len` as strlen of path or 0 to call strlen internally. - */ -extern int git_index__find_pos( - size_t *at_pos, git_index *index, const char *path, size_t path_len, int stage); - -extern void git_index__set_ignore_case(git_index *index, bool ignore_case); - -extern unsigned int git_index__create_mode(unsigned int mode); - -GIT_INLINE(const git_futils_filestamp *) git_index__filestamp(git_index *index) -{ - return &index->stamp; -} - -extern int git_index__changed_relative_to(git_index *index, const git_oid *checksum); - -/* Copy the current entries vector *and* increment the index refcount. - * Call `git_index__release_snapshot` when done. - */ -extern int git_index_snapshot_new(git_vector *snap, git_index *index); -extern void git_index_snapshot_release(git_vector *snap, git_index *index); - -/* Allow searching in a snapshot; entries must already be sorted! */ -extern int git_index_snapshot_find( - size_t *at_pos, git_vector *snap, git_vector_cmp entry_srch, - const char *path, size_t path_len, int stage); - -/* Replace an index with a new index */ -int git_index_read_index(git_index *index, const git_index *new_index); - -typedef struct { - git_index *index; - git_filebuf file; - unsigned int should_write:1; -} git_indexwriter; - -#define GIT_INDEXWRITER_INIT { NULL, GIT_FILEBUF_INIT } - -/* Lock the index for eventual writing. */ -extern int git_indexwriter_init(git_indexwriter *writer, git_index *index); - -/* Lock the index for eventual writing by a repository operation: a merge, - * revert, cherry-pick or a rebase. Note that the given checkout strategy - * will be updated for the operation's use so that checkout will not write - * the index. - */ -extern int git_indexwriter_init_for_operation( - git_indexwriter *writer, - git_repository *repo, - unsigned int *checkout_strategy); - -/* Write the index and unlock it. */ -extern int git_indexwriter_commit(git_indexwriter *writer); - -/* Cleanup an index writing session, unlocking the file (if it is still - * locked and freeing any data structures. - */ -extern void git_indexwriter_cleanup(git_indexwriter *writer); - -#endif diff --git a/vendor/libgit2/src/indexer.c b/vendor/libgit2/src/indexer.c deleted file mode 100644 index 9aa092556b..0000000000 --- a/vendor/libgit2/src/indexer.c +++ /dev/null @@ -1,1091 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#include "git2/indexer.h" -#include "git2/object.h" - -#include "common.h" -#include "pack.h" -#include "mwindow.h" -#include "posix.h" -#include "pack.h" -#include "filebuf.h" -#include "oid.h" -#include "oidmap.h" -#include "zstream.h" - -GIT__USE_OIDMAP - -extern git_mutex git__mwindow_mutex; - -#define UINT31_MAX (0x7FFFFFFF) - -struct entry { - git_oid oid; - uint32_t crc; - uint32_t offset; - uint64_t offset_long; -}; - -struct git_indexer { - unsigned int parsed_header :1, - opened_pack :1, - have_stream :1, - have_delta :1; - struct git_pack_header hdr; - struct git_pack_file *pack; - unsigned int mode; - git_off_t off; - git_off_t entry_start; - git_packfile_stream stream; - size_t nr_objects; - git_vector objects; - git_vector deltas; - unsigned int fanout[256]; - git_hash_ctx hash_ctx; - git_oid hash; - git_transfer_progress_cb progress_cb; - void *progress_payload; - char objbuf[8*1024]; - - /* Needed to look up objects which we want to inject to fix a thin pack */ - git_odb *odb; - - /* Fields for calculating the packfile trailer (hash of everything before it) */ - char inbuf[GIT_OID_RAWSZ]; - size_t inbuf_len; - git_hash_ctx trailer; -}; - -struct delta_info { - git_off_t delta_off; -}; - -const git_oid *git_indexer_hash(const git_indexer *idx) -{ - return &idx->hash; -} - -static int parse_header(struct git_pack_header *hdr, struct git_pack_file *pack) -{ - int error; - git_map map; - - if ((error = p_mmap(&map, sizeof(*hdr), GIT_PROT_READ, GIT_MAP_SHARED, pack->mwf.fd, 0)) < 0) - return error; - - memcpy(hdr, map.data, sizeof(*hdr)); - p_munmap(&map); - - /* Verify we recognize this pack file format. */ - if (hdr->hdr_signature != ntohl(PACK_SIGNATURE)) { - giterr_set(GITERR_INDEXER, "Wrong pack signature"); - return -1; - } - - if (!pack_version_ok(hdr->hdr_version)) { - giterr_set(GITERR_INDEXER, "Wrong pack version"); - return -1; - } - - return 0; -} - -static int objects_cmp(const void *a, const void *b) -{ - const struct entry *entrya = a; - const struct entry *entryb = b; - - return git_oid__cmp(&entrya->oid, &entryb->oid); -} - -int git_indexer_new( - git_indexer **out, - const char *prefix, - unsigned int mode, - git_odb *odb, - git_transfer_progress_cb progress_cb, - void *progress_payload) -{ - git_indexer *idx; - git_buf path = GIT_BUF_INIT, tmp_path = GIT_BUF_INIT; - static const char suff[] = "/pack"; - int error, fd = -1; - - idx = git__calloc(1, sizeof(git_indexer)); - GITERR_CHECK_ALLOC(idx); - idx->odb = odb; - idx->progress_cb = progress_cb; - idx->progress_payload = progress_payload; - idx->mode = mode ? mode : GIT_PACK_FILE_MODE; - git_hash_ctx_init(&idx->hash_ctx); - git_hash_ctx_init(&idx->trailer); - - error = git_buf_joinpath(&path, prefix, suff); - if (error < 0) - goto cleanup; - - fd = git_futils_mktmp(&tmp_path, git_buf_cstr(&path), idx->mode); - git_buf_free(&path); - if (fd < 0) - goto cleanup; - - error = git_packfile_alloc(&idx->pack, git_buf_cstr(&tmp_path)); - git_buf_free(&tmp_path); - - if (error < 0) - goto cleanup; - - idx->pack->mwf.fd = fd; - if ((error = git_mwindow_file_register(&idx->pack->mwf)) < 0) - goto cleanup; - - *out = idx; - return 0; - -cleanup: - if (fd != -1) - p_close(fd); - - git_buf_free(&path); - git_buf_free(&tmp_path); - git__free(idx); - return -1; -} - -/* Try to store the delta so we can try to resolve it later */ -static int store_delta(git_indexer *idx) -{ - struct delta_info *delta; - - delta = git__calloc(1, sizeof(struct delta_info)); - GITERR_CHECK_ALLOC(delta); - delta->delta_off = idx->entry_start; - - if (git_vector_insert(&idx->deltas, delta) < 0) - return -1; - - return 0; -} - -static void hash_header(git_hash_ctx *ctx, git_off_t len, git_otype type) -{ - char buffer[64]; - size_t hdrlen; - - hdrlen = git_odb__format_object_header(buffer, sizeof(buffer), (size_t)len, type); - git_hash_update(ctx, buffer, hdrlen); -} - -static int hash_object_stream(git_indexer*idx, git_packfile_stream *stream) -{ - ssize_t read; - - assert(idx && stream); - - do { - if ((read = git_packfile_stream_read(stream, idx->objbuf, sizeof(idx->objbuf))) < 0) - break; - - git_hash_update(&idx->hash_ctx, idx->objbuf, read); - } while (read > 0); - - if (read < 0) - return (int)read; - - return 0; -} - -/* In order to create the packfile stream, we need to skip over the delta base description */ -static int advance_delta_offset(git_indexer *idx, git_otype type) -{ - git_mwindow *w = NULL; - - assert(type == GIT_OBJ_REF_DELTA || type == GIT_OBJ_OFS_DELTA); - - if (type == GIT_OBJ_REF_DELTA) { - idx->off += GIT_OID_RAWSZ; - } else { - git_off_t base_off = get_delta_base(idx->pack, &w, &idx->off, type, idx->entry_start); - git_mwindow_close(&w); - if (base_off < 0) - return (int)base_off; - } - - return 0; -} - -/* Read from the stream and discard any output */ -static int read_object_stream(git_indexer *idx, git_packfile_stream *stream) -{ - ssize_t read; - - assert(stream); - - do { - read = git_packfile_stream_read(stream, idx->objbuf, sizeof(idx->objbuf)); - } while (read > 0); - - if (read < 0) - return (int)read; - - return 0; -} - -static int crc_object(uint32_t *crc_out, git_mwindow_file *mwf, git_off_t start, git_off_t size) -{ - void *ptr; - uint32_t crc; - unsigned int left, len; - git_mwindow *w = NULL; - - crc = crc32(0L, Z_NULL, 0); - while (size) { - ptr = git_mwindow_open(mwf, &w, start, (size_t)size, &left); - if (ptr == NULL) - return -1; - - len = min(left, (unsigned int)size); - crc = crc32(crc, ptr, len); - size -= len; - start += len; - git_mwindow_close(&w); - } - - *crc_out = htonl(crc); - return 0; -} - -static int store_object(git_indexer *idx) -{ - int i, error; - khiter_t k; - git_oid oid; - struct entry *entry; - git_off_t entry_size; - struct git_pack_entry *pentry; - git_off_t entry_start = idx->entry_start; - - entry = git__calloc(1, sizeof(*entry)); - GITERR_CHECK_ALLOC(entry); - - pentry = git__calloc(1, sizeof(struct git_pack_entry)); - GITERR_CHECK_ALLOC(pentry); - - git_hash_final(&oid, &idx->hash_ctx); - entry_size = idx->off - entry_start; - if (entry_start > UINT31_MAX) { - entry->offset = UINT32_MAX; - entry->offset_long = entry_start; - } else { - entry->offset = (uint32_t)entry_start; - } - - git_oid_cpy(&pentry->sha1, &oid); - pentry->offset = entry_start; - - k = kh_put(oid, idx->pack->idx_cache, &pentry->sha1, &error); - if (error == -1) { - git__free(pentry); - giterr_set_oom(); - goto on_error; - } - - if (error == 0) { - giterr_set(GITERR_INDEXER, "duplicate object %s found in pack", git_oid_tostr_s(&pentry->sha1)); - git__free(pentry); - goto on_error; - } - - - kh_value(idx->pack->idx_cache, k) = pentry; - - git_oid_cpy(&entry->oid, &oid); - - if (crc_object(&entry->crc, &idx->pack->mwf, entry_start, entry_size) < 0) - goto on_error; - - /* Add the object to the list */ - if (git_vector_insert(&idx->objects, entry) < 0) - goto on_error; - - for (i = oid.id[0]; i < 256; ++i) { - idx->fanout[i]++; - } - - return 0; - -on_error: - git__free(entry); - - return -1; -} - -GIT_INLINE(bool) has_entry(git_indexer *idx, git_oid *id) -{ - khiter_t k; - k = kh_get(oid, idx->pack->idx_cache, id); - return (k != kh_end(idx->pack->idx_cache)); -} - -static int save_entry(git_indexer *idx, struct entry *entry, struct git_pack_entry *pentry, git_off_t entry_start) -{ - int i, error; - khiter_t k; - - if (entry_start > UINT31_MAX) { - entry->offset = UINT32_MAX; - entry->offset_long = entry_start; - } else { - entry->offset = (uint32_t)entry_start; - } - - pentry->offset = entry_start; - k = kh_put(oid, idx->pack->idx_cache, &pentry->sha1, &error); - - if (error <= 0) { - giterr_set(GITERR_INDEXER, "cannot insert object into pack"); - return -1; - } - - kh_value(idx->pack->idx_cache, k) = pentry; - - /* Add the object to the list */ - if (git_vector_insert(&idx->objects, entry) < 0) - return -1; - - for (i = entry->oid.id[0]; i < 256; ++i) { - idx->fanout[i]++; - } - - return 0; -} - -static int hash_and_save(git_indexer *idx, git_rawobj *obj, git_off_t entry_start) -{ - git_oid oid; - size_t entry_size; - struct entry *entry; - struct git_pack_entry *pentry = NULL; - - entry = git__calloc(1, sizeof(*entry)); - GITERR_CHECK_ALLOC(entry); - - if (git_odb__hashobj(&oid, obj) < 0) { - giterr_set(GITERR_INDEXER, "Failed to hash object"); - goto on_error; - } - - pentry = git__calloc(1, sizeof(struct git_pack_entry)); - GITERR_CHECK_ALLOC(pentry); - - git_oid_cpy(&pentry->sha1, &oid); - git_oid_cpy(&entry->oid, &oid); - entry->crc = crc32(0L, Z_NULL, 0); - - entry_size = (size_t)(idx->off - entry_start); - if (crc_object(&entry->crc, &idx->pack->mwf, entry_start, entry_size) < 0) - goto on_error; - - return save_entry(idx, entry, pentry, entry_start); - -on_error: - git__free(pentry); - git__free(entry); - git__free(obj->data); - return -1; -} - -static int do_progress_callback(git_indexer *idx, git_transfer_progress *stats) -{ - if (idx->progress_cb) - return giterr_set_after_callback_function( - idx->progress_cb(stats, idx->progress_payload), - "indexer progress"); - return 0; -} - -/* Hash everything but the last 20B of input */ -static void hash_partially(git_indexer *idx, const uint8_t *data, size_t size) -{ - size_t to_expell, to_keep; - - if (size == 0) - return; - - /* Easy case, dump the buffer and the data minus the last 20 bytes */ - if (size >= GIT_OID_RAWSZ) { - git_hash_update(&idx->trailer, idx->inbuf, idx->inbuf_len); - git_hash_update(&idx->trailer, data, size - GIT_OID_RAWSZ); - - data += size - GIT_OID_RAWSZ; - memcpy(idx->inbuf, data, GIT_OID_RAWSZ); - idx->inbuf_len = GIT_OID_RAWSZ; - return; - } - - /* We can just append */ - if (idx->inbuf_len + size <= GIT_OID_RAWSZ) { - memcpy(idx->inbuf + idx->inbuf_len, data, size); - idx->inbuf_len += size; - return; - } - - /* We need to partially drain the buffer and then append */ - to_keep = GIT_OID_RAWSZ - size; - to_expell = idx->inbuf_len - to_keep; - - git_hash_update(&idx->trailer, idx->inbuf, to_expell); - - memmove(idx->inbuf, idx->inbuf + to_expell, to_keep); - memcpy(idx->inbuf + to_keep, data, size); - idx->inbuf_len += size - to_expell; -} - -static int write_at(git_indexer *idx, const void *data, git_off_t offset, size_t size) -{ - git_file fd = idx->pack->mwf.fd; - size_t page_size; - size_t page_offset; - git_off_t page_start; - unsigned char *map_data; - git_map map; - int error; - - assert(data && size); - - if ((error = git__page_size(&page_size)) < 0) - return error; - - /* the offset needs to be at the beginning of the a page boundary */ - page_offset = offset % page_size; - page_start = offset - page_offset; - - if ((error = p_mmap(&map, page_offset + size, GIT_PROT_WRITE, GIT_MAP_SHARED, fd, page_start)) < 0) - return error; - - map_data = (unsigned char *)map.data; - memcpy(map_data + page_offset, data, size); - p_munmap(&map); - - return 0; -} - -static int append_to_pack(git_indexer *idx, const void *data, size_t size) -{ - git_off_t current_size = idx->pack->mwf.size; - int fd = idx->pack->mwf.fd; - - if (!size) - return 0; - - if (p_lseek(fd, current_size + size - 1, SEEK_SET) < 0 || - p_write(idx->pack->mwf.fd, data, 1) < 0) { - giterr_set(GITERR_OS, "cannot extend packfile '%s'", idx->pack->pack_name); - return -1; - } - - return write_at(idx, data, idx->pack->mwf.size, size); -} - -int git_indexer_append(git_indexer *idx, const void *data, size_t size, git_transfer_progress *stats) -{ - int error = -1; - size_t processed; - struct git_pack_header *hdr = &idx->hdr; - git_mwindow_file *mwf = &idx->pack->mwf; - - assert(idx && data && stats); - - processed = stats->indexed_objects; - - if ((error = append_to_pack(idx, data, size)) < 0) - return error; - - hash_partially(idx, data, (int)size); - - /* Make sure we set the new size of the pack */ - idx->pack->mwf.size += size; - - if (!idx->parsed_header) { - unsigned int total_objects; - - if ((unsigned)idx->pack->mwf.size < sizeof(struct git_pack_header)) - return 0; - - if ((error = parse_header(&idx->hdr, idx->pack)) < 0) - return error; - - idx->parsed_header = 1; - idx->nr_objects = ntohl(hdr->hdr_entries); - idx->off = sizeof(struct git_pack_header); - - /* for now, limit to 2^32 objects */ - assert(idx->nr_objects == (size_t)((unsigned int)idx->nr_objects)); - if (idx->nr_objects == (size_t)((unsigned int)idx->nr_objects)) - total_objects = (unsigned int)idx->nr_objects; - else - total_objects = UINT_MAX; - - idx->pack->idx_cache = git_oidmap_alloc(); - GITERR_CHECK_ALLOC(idx->pack->idx_cache); - - idx->pack->has_cache = 1; - if (git_vector_init(&idx->objects, total_objects, objects_cmp) < 0) - return -1; - - if (git_vector_init(&idx->deltas, total_objects / 2, NULL) < 0) - return -1; - - stats->received_objects = 0; - stats->local_objects = 0; - stats->total_deltas = 0; - stats->indexed_deltas = 0; - processed = stats->indexed_objects = 0; - stats->total_objects = total_objects; - - if ((error = do_progress_callback(idx, stats)) != 0) - return error; - } - - /* Now that we have data in the pack, let's try to parse it */ - - /* As the file grows any windows we try to use will be out of date */ - git_mwindow_free_all(mwf); - - while (processed < idx->nr_objects) { - git_packfile_stream *stream = &idx->stream; - git_off_t entry_start = idx->off; - size_t entry_size; - git_otype type; - git_mwindow *w = NULL; - - if (idx->pack->mwf.size <= idx->off + 20) - return 0; - - if (!idx->have_stream) { - error = git_packfile_unpack_header(&entry_size, &type, mwf, &w, &idx->off); - if (error == GIT_EBUFS) { - idx->off = entry_start; - return 0; - } - if (error < 0) - goto on_error; - - git_mwindow_close(&w); - idx->entry_start = entry_start; - git_hash_init(&idx->hash_ctx); - - if (type == GIT_OBJ_REF_DELTA || type == GIT_OBJ_OFS_DELTA) { - error = advance_delta_offset(idx, type); - if (error == GIT_EBUFS) { - idx->off = entry_start; - return 0; - } - if (error < 0) - goto on_error; - - idx->have_delta = 1; - } else { - idx->have_delta = 0; - hash_header(&idx->hash_ctx, entry_size, type); - } - - idx->have_stream = 1; - - error = git_packfile_stream_open(stream, idx->pack, idx->off); - if (error < 0) - goto on_error; - } - - if (idx->have_delta) { - error = read_object_stream(idx, stream); - } else { - error = hash_object_stream(idx, stream); - } - - idx->off = stream->curpos; - if (error == GIT_EBUFS) - return 0; - - /* We want to free the stream reasorces no matter what here */ - idx->have_stream = 0; - git_packfile_stream_free(stream); - - if (error < 0) - goto on_error; - - if (idx->have_delta) { - error = store_delta(idx); - } else { - error = store_object(idx); - } - - if (error < 0) - goto on_error; - - if (!idx->have_delta) { - stats->indexed_objects = (unsigned int)++processed; - } - stats->received_objects++; - - if ((error = do_progress_callback(idx, stats)) != 0) - goto on_error; - } - - return 0; - -on_error: - git_mwindow_free_all(mwf); - return error; -} - -static int index_path(git_buf *path, git_indexer *idx, const char *suffix) -{ - const char prefix[] = "pack-"; - size_t slash = (size_t)path->size; - - /* search backwards for '/' */ - while (slash > 0 && path->ptr[slash - 1] != '/') - slash--; - - if (git_buf_grow(path, slash + 1 + strlen(prefix) + - GIT_OID_HEXSZ + strlen(suffix) + 1) < 0) - return -1; - - git_buf_truncate(path, slash); - git_buf_puts(path, prefix); - git_oid_fmt(path->ptr + git_buf_len(path), &idx->hash); - path->size += GIT_OID_HEXSZ; - git_buf_puts(path, suffix); - - return git_buf_oom(path) ? -1 : 0; -} - -/** - * Rewind the packfile by the trailer, as we might need to fix the - * packfile by injecting objects at the tail and must overwrite it. - */ -static void seek_back_trailer(git_indexer *idx) -{ - idx->pack->mwf.size -= GIT_OID_RAWSZ; - git_mwindow_free_all(&idx->pack->mwf); -} - -static int inject_object(git_indexer *idx, git_oid *id) -{ - git_odb_object *obj; - struct entry *entry; - struct git_pack_entry *pentry = NULL; - git_oid foo = {{0}}; - unsigned char hdr[64]; - git_buf buf = GIT_BUF_INIT; - git_off_t entry_start; - const void *data; - size_t len, hdr_len; - int error; - - seek_back_trailer(idx); - entry_start = idx->pack->mwf.size; - - if (git_odb_read(&obj, idx->odb, id) < 0) { - giterr_set(GITERR_INDEXER, "missing delta bases"); - return -1; - } - - data = git_odb_object_data(obj); - len = git_odb_object_size(obj); - - entry = git__calloc(1, sizeof(*entry)); - GITERR_CHECK_ALLOC(entry); - - entry->crc = crc32(0L, Z_NULL, 0); - - /* Write out the object header */ - hdr_len = git_packfile__object_header(hdr, len, git_odb_object_type(obj)); - if ((error = append_to_pack(idx, hdr, hdr_len)) < 0) - goto cleanup; - - idx->pack->mwf.size += hdr_len; - entry->crc = crc32(entry->crc, hdr, (uInt)hdr_len); - - if ((error = git_zstream_deflatebuf(&buf, data, len)) < 0) - goto cleanup; - - /* And then the compressed object */ - if ((error = append_to_pack(idx, buf.ptr, buf.size)) < 0) - goto cleanup; - - idx->pack->mwf.size += buf.size; - entry->crc = htonl(crc32(entry->crc, (unsigned char *)buf.ptr, (uInt)buf.size)); - git_buf_free(&buf); - - /* Write a fake trailer so the pack functions play ball */ - - if ((error = append_to_pack(idx, &foo, GIT_OID_RAWSZ)) < 0) - goto cleanup; - - idx->pack->mwf.size += GIT_OID_RAWSZ; - - pentry = git__calloc(1, sizeof(struct git_pack_entry)); - GITERR_CHECK_ALLOC(pentry); - - git_oid_cpy(&pentry->sha1, id); - git_oid_cpy(&entry->oid, id); - idx->off = entry_start + hdr_len + len; - - error = save_entry(idx, entry, pentry, entry_start); - -cleanup: - if (error) { - git__free(entry); - git__free(pentry); - } - - git_odb_object_free(obj); - return error; -} - -static int fix_thin_pack(git_indexer *idx, git_transfer_progress *stats) -{ - int error, found_ref_delta = 0; - unsigned int i; - struct delta_info *delta; - size_t size; - git_otype type; - git_mwindow *w = NULL; - git_off_t curpos = 0; - unsigned char *base_info; - unsigned int left = 0; - git_oid base; - - assert(git_vector_length(&idx->deltas) > 0); - - if (idx->odb == NULL) { - giterr_set(GITERR_INDEXER, "cannot fix a thin pack without an ODB"); - return -1; - } - - /* Loop until we find the first REF delta */ - git_vector_foreach(&idx->deltas, i, delta) { - if (!delta) - continue; - - curpos = delta->delta_off; - error = git_packfile_unpack_header(&size, &type, &idx->pack->mwf, &w, &curpos); - git_mwindow_close(&w); - if (error < 0) - return error; - - if (type == GIT_OBJ_REF_DELTA) { - found_ref_delta = 1; - break; - } - } - - if (!found_ref_delta) { - giterr_set(GITERR_INDEXER, "no REF_DELTA found, cannot inject object"); - return -1; - } - - /* curpos now points to the base information, which is an OID */ - base_info = git_mwindow_open(&idx->pack->mwf, &w, curpos, GIT_OID_RAWSZ, &left); - if (base_info == NULL) { - giterr_set(GITERR_INDEXER, "failed to map delta information"); - return -1; - } - - git_oid_fromraw(&base, base_info); - git_mwindow_close(&w); - - if (has_entry(idx, &base)) - return 0; - - if (inject_object(idx, &base) < 0) - return -1; - - stats->local_objects++; - - return 0; -} - -static int resolve_deltas(git_indexer *idx, git_transfer_progress *stats) -{ - unsigned int i; - struct delta_info *delta; - int progressed = 0, non_null = 0, progress_cb_result; - - while (idx->deltas.length > 0) { - progressed = 0; - non_null = 0; - git_vector_foreach(&idx->deltas, i, delta) { - git_rawobj obj = {NULL}; - - if (!delta) - continue; - - non_null = 1; - idx->off = delta->delta_off; - if (git_packfile_unpack(&obj, idx->pack, &idx->off) < 0) - continue; - - if (hash_and_save(idx, &obj, delta->delta_off) < 0) - continue; - - git__free(obj.data); - stats->indexed_objects++; - stats->indexed_deltas++; - progressed = 1; - if ((progress_cb_result = do_progress_callback(idx, stats)) < 0) - return progress_cb_result; - - /* remove from the list */ - git_vector_set(NULL, &idx->deltas, i, NULL); - git__free(delta); - } - - /* if none were actually set, we're done */ - if (!non_null) - break; - - if (!progressed && (fix_thin_pack(idx, stats) < 0)) { - return -1; - } - } - - return 0; -} - -static int update_header_and_rehash(git_indexer *idx, git_transfer_progress *stats) -{ - void *ptr; - size_t chunk = 1024*1024; - git_off_t hashed = 0; - git_mwindow *w = NULL; - git_mwindow_file *mwf; - unsigned int left; - - mwf = &idx->pack->mwf; - - git_hash_init(&idx->trailer); - - - /* Update the header to include the numer of local objects we injected */ - idx->hdr.hdr_entries = htonl(stats->total_objects + stats->local_objects); - if (write_at(idx, &idx->hdr, 0, sizeof(struct git_pack_header)) < 0) - return -1; - - /* - * We now use the same technique as before to determine the - * hash. We keep reading up to the end and let - * hash_partially() keep the existing trailer out of the - * calculation. - */ - git_mwindow_free_all(mwf); - idx->inbuf_len = 0; - while (hashed < mwf->size) { - ptr = git_mwindow_open(mwf, &w, hashed, chunk, &left); - if (ptr == NULL) - return -1; - - hash_partially(idx, ptr, left); - hashed += left; - - git_mwindow_close(&w); - } - - return 0; -} - -int git_indexer_commit(git_indexer *idx, git_transfer_progress *stats) -{ - git_mwindow *w = NULL; - unsigned int i, long_offsets = 0, left; - int error; - struct git_pack_idx_header hdr; - git_buf filename = GIT_BUF_INIT; - struct entry *entry; - git_oid trailer_hash, file_hash; - git_hash_ctx ctx; - git_filebuf index_file = {0}; - void *packfile_trailer; - - if (git_hash_ctx_init(&ctx) < 0) - return -1; - - /* Test for this before resolve_deltas(), as it plays with idx->off */ - if (idx->off < idx->pack->mwf.size - 20) { - giterr_set(GITERR_INDEXER, "Unexpected data at the end of the pack"); - return -1; - } - - packfile_trailer = git_mwindow_open(&idx->pack->mwf, &w, idx->pack->mwf.size - GIT_OID_RAWSZ, GIT_OID_RAWSZ, &left); - if (packfile_trailer == NULL) { - git_mwindow_close(&w); - goto on_error; - } - - /* Compare the packfile trailer as it was sent to us and what we calculated */ - git_oid_fromraw(&file_hash, packfile_trailer); - git_mwindow_close(&w); - - git_hash_final(&trailer_hash, &idx->trailer); - if (git_oid_cmp(&file_hash, &trailer_hash)) { - giterr_set(GITERR_INDEXER, "packfile trailer mismatch"); - return -1; - } - - /* Freeze the number of deltas */ - stats->total_deltas = stats->total_objects - stats->indexed_objects; - - if ((error = resolve_deltas(idx, stats)) < 0) - return error; - - if (stats->indexed_objects != stats->total_objects) { - giterr_set(GITERR_INDEXER, "early EOF"); - return -1; - } - - if (stats->local_objects > 0) { - if (update_header_and_rehash(idx, stats) < 0) - return -1; - - git_hash_final(&trailer_hash, &idx->trailer); - write_at(idx, &trailer_hash, idx->pack->mwf.size - GIT_OID_RAWSZ, GIT_OID_RAWSZ); - } - - git_vector_sort(&idx->objects); - - git_buf_sets(&filename, idx->pack->pack_name); - git_buf_shorten(&filename, strlen("pack")); - git_buf_puts(&filename, "idx"); - if (git_buf_oom(&filename)) - return -1; - - if (git_filebuf_open(&index_file, filename.ptr, - GIT_FILEBUF_HASH_CONTENTS, idx->mode) < 0) - goto on_error; - - /* Write out the header */ - hdr.idx_signature = htonl(PACK_IDX_SIGNATURE); - hdr.idx_version = htonl(2); - git_filebuf_write(&index_file, &hdr, sizeof(hdr)); - - /* Write out the fanout table */ - for (i = 0; i < 256; ++i) { - uint32_t n = htonl(idx->fanout[i]); - git_filebuf_write(&index_file, &n, sizeof(n)); - } - - /* Write out the object names (SHA-1 hashes) */ - git_vector_foreach(&idx->objects, i, entry) { - git_filebuf_write(&index_file, &entry->oid, sizeof(git_oid)); - git_hash_update(&ctx, &entry->oid, GIT_OID_RAWSZ); - } - git_hash_final(&idx->hash, &ctx); - - /* Write out the CRC32 values */ - git_vector_foreach(&idx->objects, i, entry) { - git_filebuf_write(&index_file, &entry->crc, sizeof(uint32_t)); - } - - /* Write out the offsets */ - git_vector_foreach(&idx->objects, i, entry) { - uint32_t n; - - if (entry->offset == UINT32_MAX) - n = htonl(0x80000000 | long_offsets++); - else - n = htonl(entry->offset); - - git_filebuf_write(&index_file, &n, sizeof(uint32_t)); - } - - /* Write out the long offsets */ - git_vector_foreach(&idx->objects, i, entry) { - uint32_t split[2]; - - if (entry->offset != UINT32_MAX) - continue; - - split[0] = htonl(entry->offset_long >> 32); - split[1] = htonl(entry->offset_long & 0xffffffff); - - git_filebuf_write(&index_file, &split, sizeof(uint32_t) * 2); - } - - /* Write out the packfile trailer to the index */ - if (git_filebuf_write(&index_file, &trailer_hash, GIT_OID_RAWSZ) < 0) - goto on_error; - - /* Write out the hash of the idx */ - if (git_filebuf_hash(&trailer_hash, &index_file) < 0) - goto on_error; - - git_filebuf_write(&index_file, &trailer_hash, sizeof(git_oid)); - - /* Figure out what the final name should be */ - if (index_path(&filename, idx, ".idx") < 0) - goto on_error; - - /* Commit file */ - if (git_filebuf_commit_at(&index_file, filename.ptr) < 0) - goto on_error; - - git_mwindow_free_all(&idx->pack->mwf); - /* We need to close the descriptor here so Windows doesn't choke on commit_at */ - if (p_close(idx->pack->mwf.fd) < 0) { - giterr_set(GITERR_OS, "failed to close packfile"); - goto on_error; - } - - idx->pack->mwf.fd = -1; - - if (index_path(&filename, idx, ".pack") < 0) - goto on_error; - - /* And don't forget to rename the packfile to its new place. */ - p_rename(idx->pack->pack_name, git_buf_cstr(&filename)); - - git_buf_free(&filename); - git_hash_ctx_cleanup(&ctx); - return 0; - -on_error: - git_mwindow_free_all(&idx->pack->mwf); - git_filebuf_cleanup(&index_file); - git_buf_free(&filename); - git_hash_ctx_cleanup(&ctx); - return -1; -} - -void git_indexer_free(git_indexer *idx) -{ - if (idx == NULL) - return; - - git_vector_free_deep(&idx->objects); - - if (idx->pack && idx->pack->idx_cache) { - struct git_pack_entry *pentry; - kh_foreach_value( - idx->pack->idx_cache, pentry, { git__free(pentry); }); - - git_oidmap_free(idx->pack->idx_cache); - } - - git_vector_free_deep(&idx->deltas); - - if (!git_mutex_lock(&git__mwindow_mutex)) { - git_packfile_free(idx->pack); - git_mutex_unlock(&git__mwindow_mutex); - } - - git_hash_ctx_cleanup(&idx->trailer); - git_hash_ctx_cleanup(&idx->hash_ctx); - git__free(idx); -} diff --git a/vendor/libgit2/src/integer.h b/vendor/libgit2/src/integer.h deleted file mode 100644 index b08094c2f1..0000000000 --- a/vendor/libgit2/src/integer.h +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_integer_h__ -#define INCLUDE_integer_h__ - -/** @return true if p fits into the range of a size_t */ -GIT_INLINE(int) git__is_sizet(git_off_t p) -{ - size_t r = (size_t)p; - return p == (git_off_t)r; -} - -/** @return true if p fits into the range of an ssize_t */ -GIT_INLINE(int) git__is_ssizet(size_t p) -{ - ssize_t r = (ssize_t)p; - return p == (size_t)r; -} - -/** @return true if p fits into the range of a uint32_t */ -GIT_INLINE(int) git__is_uint32(size_t p) -{ - uint32_t r = (uint32_t)p; - return p == (size_t)r; -} - -/** @return true if p fits into the range of an unsigned long */ -GIT_INLINE(int) git__is_ulong(git_off_t p) -{ - unsigned long r = (unsigned long)p; - return p == (git_off_t)r; -} - -/** @return true if p fits into the range of an int */ -GIT_INLINE(int) git__is_int(long long p) -{ - int r = (int)p; - return p == (long long)r; -} - -/** - * Sets `one + two` into `out`, unless the arithmetic would overflow. - * @return true if the result fits in a `uint64_t`, false on overflow. - */ -GIT_INLINE(bool) git__add_uint64_overflow(uint64_t *out, uint64_t one, uint64_t two) -{ - if (UINT64_MAX - one < two) - return true; - *out = one + two; - return false; -} - -/* Use clang/gcc compiler intrinsics whenever possible */ -#if (SIZE_MAX == UINT_MAX) && __has_builtin(__builtin_uadd_overflow) -# define git__add_sizet_overflow(out, one, two) \ - __builtin_uadd_overflow(one, two, out) -# define git__multiply_sizet_overflow(out, one, two) \ - __builtin_umul_overflow(one, two, out) -#elif (SIZE_MAX == ULONG_MAX) && __has_builtin(__builtin_uaddl_overflow) -# define git__add_sizet_overflow(out, one, two) \ - __builtin_uaddl_overflow(one, two, out) -# define git__multiply_sizet_overflow(out, one, two) \ - __builtin_umull_overflow(one, two, out) -#else - -/** - * Sets `one + two` into `out`, unless the arithmetic would overflow. - * @return true if the result fits in a `size_t`, false on overflow. - */ -GIT_INLINE(bool) git__add_sizet_overflow(size_t *out, size_t one, size_t two) -{ - if (SIZE_MAX - one < two) - return true; - *out = one + two; - return false; -} - -/** - * Sets `one * two` into `out`, unless the arithmetic would overflow. - * @return true if the result fits in a `size_t`, false on overflow. - */ -GIT_INLINE(bool) git__multiply_sizet_overflow(size_t *out, size_t one, size_t two) -{ - if (one && SIZE_MAX / one < two) - return true; - *out = one * two; - return false; -} - -#endif - -#endif /* INCLUDE_integer_h__ */ diff --git a/vendor/libgit2/src/iterator.c b/vendor/libgit2/src/iterator.c deleted file mode 100644 index cf51a340db..0000000000 --- a/vendor/libgit2/src/iterator.c +++ /dev/null @@ -1,1934 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#include "iterator.h" -#include "tree.h" -#include "index.h" -#include "ignore.h" -#include "buffer.h" -#include "submodule.h" -#include - -#define ITERATOR_SET_CB(P,NAME_LC) do { \ - (P)->cb.current = NAME_LC ## _iterator__current; \ - (P)->cb.advance = NAME_LC ## _iterator__advance; \ - (P)->cb.advance_into = NAME_LC ## _iterator__advance_into; \ - (P)->cb.seek = NAME_LC ## _iterator__seek; \ - (P)->cb.reset = NAME_LC ## _iterator__reset; \ - (P)->cb.at_end = NAME_LC ## _iterator__at_end; \ - (P)->cb.free = NAME_LC ## _iterator__free; \ - } while (0) - -#define ITERATOR_CASE_FLAGS \ - (GIT_ITERATOR_IGNORE_CASE | GIT_ITERATOR_DONT_IGNORE_CASE) - -#define ITERATOR_BASE_INIT(P,NAME_LC,NAME_UC,REPO) do { \ - (P)->base.type = GIT_ITERATOR_TYPE_ ## NAME_UC; \ - (P)->base.cb = &(P)->cb; \ - ITERATOR_SET_CB(P,NAME_LC); \ - (P)->base.repo = (REPO); \ - (P)->base.start = start ? git__strdup(start) : NULL; \ - (P)->base.end = end ? git__strdup(end) : NULL; \ - if ((start && !(P)->base.start) || (end && !(P)->base.end)) { \ - git__free(P); return -1; } \ - (P)->base.prefixcomp = git__prefixcmp; \ - (P)->base.flags = flags & ~ITERATOR_CASE_FLAGS; \ - if ((P)->base.flags & GIT_ITERATOR_DONT_AUTOEXPAND) \ - (P)->base.flags |= GIT_ITERATOR_INCLUDE_TREES; \ - } while (0) - -#define iterator__flag(I,F) ((((git_iterator *)(I))->flags & GIT_ITERATOR_ ## F) != 0) -#define iterator__ignore_case(I) iterator__flag(I,IGNORE_CASE) -#define iterator__include_trees(I) iterator__flag(I,INCLUDE_TREES) -#define iterator__dont_autoexpand(I) iterator__flag(I,DONT_AUTOEXPAND) -#define iterator__do_autoexpand(I) !iterator__flag(I,DONT_AUTOEXPAND) -#define iterator__include_conflicts(I) iterator__flag(I, INCLUDE_CONFLICTS) - -#define GIT_ITERATOR_FIRST_ACCESS (1 << 15) -#define iterator__has_been_accessed(I) iterator__flag(I,FIRST_ACCESS) - -#define iterator__end(I) ((git_iterator *)(I))->end -#define iterator__past_end(I,PATH) \ - (iterator__end(I) && ((git_iterator *)(I))->prefixcomp((PATH),iterator__end(I)) > 0) - - -static int iterator__reset_range( - git_iterator *iter, const char *start, const char *end) -{ - if (start) { - if (iter->start) - git__free(iter->start); - iter->start = git__strdup(start); - GITERR_CHECK_ALLOC(iter->start); - } - - if (end) { - if (iter->end) - git__free(iter->end); - iter->end = git__strdup(end); - GITERR_CHECK_ALLOC(iter->end); - } - - iter->flags &= ~GIT_ITERATOR_FIRST_ACCESS; - - return 0; -} - -static int iterator__update_ignore_case( - git_iterator *iter, - git_iterator_flag_t flags) -{ - int error = 0, ignore_case = -1; - - if ((flags & GIT_ITERATOR_IGNORE_CASE) != 0) - ignore_case = true; - else if ((flags & GIT_ITERATOR_DONT_IGNORE_CASE) != 0) - ignore_case = false; - else { - git_index *index; - - if (!(error = git_repository_index__weakptr(&index, iter->repo))) - ignore_case = (index->ignore_case != false); - } - - if (ignore_case > 0) - iter->flags = (iter->flags | GIT_ITERATOR_IGNORE_CASE); - else if (ignore_case == 0) - iter->flags = (iter->flags & ~GIT_ITERATOR_IGNORE_CASE); - - iter->prefixcomp = iterator__ignore_case(iter) ? - git__prefixcmp_icase : git__prefixcmp; - - return error; -} - -GIT_INLINE(void) iterator__clear_entry(const git_index_entry **entry) -{ - if (entry) *entry = NULL; -} - - -static int empty_iterator__noop(const git_index_entry **e, git_iterator *i) -{ - GIT_UNUSED(i); - iterator__clear_entry(e); - return GIT_ITEROVER; -} - -static int empty_iterator__seek(git_iterator *i, const char *p) -{ - GIT_UNUSED(i); GIT_UNUSED(p); - return -1; -} - -static int empty_iterator__reset(git_iterator *i, const char *s, const char *e) -{ - GIT_UNUSED(i); GIT_UNUSED(s); GIT_UNUSED(e); - return 0; -} - -static int empty_iterator__at_end(git_iterator *i) -{ - GIT_UNUSED(i); - return 1; -} - -static void empty_iterator__free(git_iterator *i) -{ - GIT_UNUSED(i); -} - -typedef struct { - git_iterator base; - git_iterator_callbacks cb; -} empty_iterator; - -int git_iterator_for_nothing( - git_iterator **iter, - git_iterator_flag_t flags, - const char *start, - const char *end) -{ - empty_iterator *i = git__calloc(1, sizeof(empty_iterator)); - GITERR_CHECK_ALLOC(i); - -#define empty_iterator__current empty_iterator__noop -#define empty_iterator__advance empty_iterator__noop -#define empty_iterator__advance_into empty_iterator__noop - - ITERATOR_BASE_INIT(i, empty, EMPTY, NULL); - - if ((flags & GIT_ITERATOR_IGNORE_CASE) != 0) - i->base.flags |= GIT_ITERATOR_IGNORE_CASE; - - *iter = (git_iterator *)i; - return 0; -} - - -typedef struct tree_iterator_entry tree_iterator_entry; -struct tree_iterator_entry { - tree_iterator_entry *parent; - const git_tree_entry *te; - git_tree *tree; -}; - -typedef struct tree_iterator_frame tree_iterator_frame; -struct tree_iterator_frame { - tree_iterator_frame *up, *down; - - size_t n_entries; /* items in this frame */ - size_t current; /* start of currently active range in frame */ - size_t next; /* start of next range in frame */ - - const char *start; - size_t startlen; - - tree_iterator_entry *entries[GIT_FLEX_ARRAY]; -}; - -typedef struct { - git_iterator base; - git_iterator_callbacks cb; - tree_iterator_frame *head, *root; - git_pool pool; - git_index_entry entry; - git_buf path; - int path_ambiguities; - bool path_has_filename; - bool entry_is_current; - int (*strncomp)(const char *a, const char *b, size_t sz); -} tree_iterator; - -static char *tree_iterator__current_filename( - tree_iterator *ti, const git_tree_entry *te) -{ - if (!ti->path_has_filename) { - if (git_buf_joinpath(&ti->path, ti->path.ptr, te->filename) < 0) - return NULL; - - if (git_tree_entry__is_tree(te) && git_buf_putc(&ti->path, '/') < 0) - return NULL; - - ti->path_has_filename = true; - } - - return ti->path.ptr; -} - -static void tree_iterator__rewrite_filename(tree_iterator *ti) -{ - tree_iterator_entry *scan = ti->head->entries[ti->head->current]; - ssize_t strpos = ti->path.size; - const git_tree_entry *te; - - if (strpos && ti->path.ptr[strpos - 1] == '/') - strpos--; - - for (; scan && (te = scan->te); scan = scan->parent) { - strpos -= te->filename_len; - memcpy(&ti->path.ptr[strpos], te->filename, te->filename_len); - strpos -= 1; /* separator */ - } -} - -static int tree_iterator__te_cmp( - const git_tree_entry *a, - const git_tree_entry *b, - int (*compare)(const char *, const char *, size_t)) -{ - return git_path_cmp( - a->filename, a->filename_len, a->attr == GIT_FILEMODE_TREE, - b->filename, b->filename_len, b->attr == GIT_FILEMODE_TREE, - compare); -} - -static int tree_iterator__ci_cmp(const void *a, const void *b, void *p) -{ - const tree_iterator_entry *ae = a, *be = b; - int cmp = tree_iterator__te_cmp(ae->te, be->te, git__strncasecmp); - - if (!cmp) { - /* stabilize sort order among equivalent names */ - if (!ae->parent->te || !be->parent->te) - cmp = tree_iterator__te_cmp(ae->te, be->te, git__strncmp); - else - cmp = tree_iterator__ci_cmp(ae->parent, be->parent, p); - } - - return cmp; -} - -static int tree_iterator__search_cmp(const void *key, const void *val, void *p) -{ - const tree_iterator_frame *tf = key; - const git_tree_entry *te = ((tree_iterator_entry *)val)->te; - - return git_path_cmp( - tf->start, tf->startlen, false, - te->filename, te->filename_len, te->attr == GIT_FILEMODE_TREE, - ((tree_iterator *)p)->strncomp); -} - -static bool tree_iterator__move_to_next( - tree_iterator *ti, tree_iterator_frame *tf) -{ - if (tf->next > tf->current + 1) - ti->path_ambiguities--; - - if (!tf->up) { /* at root */ - tf->current = tf->next; - return false; - } - - for (; tf->current < tf->next; tf->current++) { - git_tree_free(tf->entries[tf->current]->tree); - tf->entries[tf->current]->tree = NULL; - } - - return (tf->current < tf->n_entries); -} - -static int tree_iterator__set_next(tree_iterator *ti, tree_iterator_frame *tf) -{ - int error = 0; - const git_tree_entry *te, *last = NULL; - - tf->next = tf->current; - - for (; tf->next < tf->n_entries; tf->next++, last = te) { - te = tf->entries[tf->next]->te; - - if (last && tree_iterator__te_cmp(last, te, ti->strncomp)) - break; - - /* try to load trees for items in [current,next) range */ - if (!error && git_tree_entry__is_tree(te)) - error = git_tree_lookup( - &tf->entries[tf->next]->tree, ti->base.repo, &te->oid); - } - - if (tf->next > tf->current + 1) - ti->path_ambiguities++; - - /* if a tree lookup failed, advance over this span and return failure */ - if (error < 0) { - tree_iterator__move_to_next(ti, tf); - return error; - } - - if (last && !tree_iterator__current_filename(ti, last)) - return -1; /* must have been allocation failure */ - - return 0; -} - -GIT_INLINE(bool) tree_iterator__at_tree(tree_iterator *ti) -{ - return (ti->head->current < ti->head->n_entries && - ti->head->entries[ti->head->current]->tree != NULL); -} - -static int tree_iterator__push_frame(tree_iterator *ti) -{ - int error = 0; - tree_iterator_frame *head = ti->head, *tf = NULL; - size_t i, n_entries = 0, alloclen; - - if (head->current >= head->n_entries || !head->entries[head->current]->tree) - return GIT_ITEROVER; - - for (i = head->current; i < head->next; ++i) - n_entries += git_tree_entrycount(head->entries[i]->tree); - - GITERR_CHECK_ALLOC_MULTIPLY(&alloclen, sizeof(tree_iterator_entry *), n_entries); - GITERR_CHECK_ALLOC_ADD(&alloclen, alloclen, sizeof(tree_iterator_frame)); - - tf = git__calloc(1, alloclen); - GITERR_CHECK_ALLOC(tf); - - tf->n_entries = n_entries; - - tf->up = head; - head->down = tf; - ti->head = tf; - - for (i = head->current, n_entries = 0; i < head->next; ++i) { - git_tree *tree = head->entries[i]->tree; - size_t j, max_j = git_tree_entrycount(tree); - - for (j = 0; j < max_j; ++j) { - tree_iterator_entry *entry = git_pool_malloc(&ti->pool, 1); - GITERR_CHECK_ALLOC(entry); - - entry->parent = head->entries[i]; - entry->te = git_tree_entry_byindex(tree, j); - entry->tree = NULL; - - tf->entries[n_entries++] = entry; - } - } - - /* if ignore_case, sort entries case insensitively */ - if (iterator__ignore_case(ti)) - git__tsort_r( - (void **)tf->entries, tf->n_entries, tree_iterator__ci_cmp, tf); - - /* pick tf->current based on "start" (or start at zero) */ - if (head->startlen > 0) { - git__bsearch_r((void **)tf->entries, tf->n_entries, head, - tree_iterator__search_cmp, ti, &tf->current); - - while (tf->current && - !tree_iterator__search_cmp(head, tf->entries[tf->current-1], ti)) - tf->current--; - - if ((tf->start = strchr(head->start, '/')) != NULL) { - tf->start++; - tf->startlen = strlen(tf->start); - } - } - - ti->path_has_filename = ti->entry_is_current = false; - - if ((error = tree_iterator__set_next(ti, tf)) < 0) - return error; - - /* autoexpand as needed */ - if (!iterator__include_trees(ti) && tree_iterator__at_tree(ti)) - return tree_iterator__push_frame(ti); - - return 0; -} - -static bool tree_iterator__pop_frame(tree_iterator *ti, bool final) -{ - tree_iterator_frame *tf = ti->head; - - if (!tf->up) - return false; - - ti->head = tf->up; - ti->head->down = NULL; - - tree_iterator__move_to_next(ti, tf); - - if (!final) { /* if final, don't bother to clean up */ - git_pool_free_array(&ti->pool, tf->n_entries, (void **)tf->entries); - git_buf_rtruncate_at_char(&ti->path, '/'); - } - - git__free(tf); - - return true; -} - -static void tree_iterator__pop_all(tree_iterator *ti, bool to_end, bool final) -{ - while (tree_iterator__pop_frame(ti, final)) /* pop to root */; - - if (!final) { - ti->head->current = to_end ? ti->head->n_entries : 0; - ti->path_ambiguities = 0; - git_buf_clear(&ti->path); - } -} - -static int tree_iterator__update_entry(tree_iterator *ti) -{ - tree_iterator_frame *tf; - const git_tree_entry *te; - - if (ti->entry_is_current) - return 0; - - tf = ti->head; - te = tf->entries[tf->current]->te; - - ti->entry.mode = te->attr; - git_oid_cpy(&ti->entry.id, &te->oid); - - ti->entry.path = tree_iterator__current_filename(ti, te); - GITERR_CHECK_ALLOC(ti->entry.path); - - if (ti->path_ambiguities > 0) - tree_iterator__rewrite_filename(ti); - - if (iterator__past_end(ti, ti->entry.path)) { - tree_iterator__pop_all(ti, true, false); - return GIT_ITEROVER; - } - - ti->entry_is_current = true; - - return 0; -} - -static int tree_iterator__current( - const git_index_entry **entry, git_iterator *self) -{ - int error; - tree_iterator *ti = (tree_iterator *)self; - tree_iterator_frame *tf = ti->head; - - iterator__clear_entry(entry); - - if (tf->current >= tf->n_entries) - return GIT_ITEROVER; - - if ((error = tree_iterator__update_entry(ti)) < 0) - return error; - - if (entry) - *entry = &ti->entry; - - ti->base.flags |= GIT_ITERATOR_FIRST_ACCESS; - - return 0; -} - -static int tree_iterator__advance_into( - const git_index_entry **entry, git_iterator *self) -{ - int error = 0; - tree_iterator *ti = (tree_iterator *)self; - - iterator__clear_entry(entry); - - if (tree_iterator__at_tree(ti)) - error = tree_iterator__push_frame(ti); - - if (!error && entry) - error = tree_iterator__current(entry, self); - - return error; -} - -static int tree_iterator__advance( - const git_index_entry **entry, git_iterator *self) -{ - int error; - tree_iterator *ti = (tree_iterator *)self; - tree_iterator_frame *tf = ti->head; - - iterator__clear_entry(entry); - - if (tf->current >= tf->n_entries) - return GIT_ITEROVER; - - if (!iterator__has_been_accessed(ti)) - return tree_iterator__current(entry, self); - - if (iterator__do_autoexpand(ti) && iterator__include_trees(ti) && - tree_iterator__at_tree(ti)) - return tree_iterator__advance_into(entry, self); - - if (ti->path_has_filename) { - git_buf_rtruncate_at_char(&ti->path, '/'); - ti->path_has_filename = ti->entry_is_current = false; - } - - /* scan forward and up, advancing in frame or popping frame when done */ - while (!tree_iterator__move_to_next(ti, tf) && - tree_iterator__pop_frame(ti, false)) - tf = ti->head; - - /* find next and load trees */ - if ((error = tree_iterator__set_next(ti, tf)) < 0) - return error; - - /* deal with include_trees / auto_expand as needed */ - if (!iterator__include_trees(ti) && tree_iterator__at_tree(ti)) - return tree_iterator__advance_into(entry, self); - - return tree_iterator__current(entry, self); -} - -static int tree_iterator__seek(git_iterator *self, const char *prefix) -{ - GIT_UNUSED(self); GIT_UNUSED(prefix); - return -1; -} - -static int tree_iterator__reset( - git_iterator *self, const char *start, const char *end) -{ - tree_iterator *ti = (tree_iterator *)self; - - tree_iterator__pop_all(ti, false, false); - - if (iterator__reset_range(self, start, end) < 0) - return -1; - - return tree_iterator__push_frame(ti); /* re-expand root tree */ -} - -static int tree_iterator__at_end(git_iterator *self) -{ - tree_iterator *ti = (tree_iterator *)self; - return (ti->head->current >= ti->head->n_entries); -} - -static void tree_iterator__free(git_iterator *self) -{ - tree_iterator *ti = (tree_iterator *)self; - - tree_iterator__pop_all(ti, true, false); - - git_tree_free(ti->head->entries[0]->tree); - git__free(ti->head); - git_pool_clear(&ti->pool); - git_buf_free(&ti->path); -} - -static int tree_iterator__create_root_frame(tree_iterator *ti, git_tree *tree) -{ - size_t sz = sizeof(tree_iterator_frame) + sizeof(tree_iterator_entry); - tree_iterator_frame *root = git__calloc(sz, sizeof(char)); - GITERR_CHECK_ALLOC(root); - - root->n_entries = 1; - root->next = 1; - root->start = ti->base.start; - root->startlen = root->start ? strlen(root->start) : 0; - root->entries[0] = git_pool_mallocz(&ti->pool, 1); - GITERR_CHECK_ALLOC(root->entries[0]); - root->entries[0]->tree = tree; - - ti->head = ti->root = root; - - return 0; -} - -int git_iterator_for_tree( - git_iterator **iter, - git_tree *tree, - git_iterator_flag_t flags, - const char *start, - const char *end) -{ - int error; - tree_iterator *ti; - - if (tree == NULL) - return git_iterator_for_nothing(iter, flags, start, end); - - if ((error = git_object_dup((git_object **)&tree, (git_object *)tree)) < 0) - return error; - - ti = git__calloc(1, sizeof(tree_iterator)); - GITERR_CHECK_ALLOC(ti); - - ITERATOR_BASE_INIT(ti, tree, TREE, git_tree_owner(tree)); - - if ((error = iterator__update_ignore_case((git_iterator *)ti, flags)) < 0) - goto fail; - ti->strncomp = iterator__ignore_case(ti) ? git__strncasecmp : git__strncmp; - - if ((error = git_pool_init(&ti->pool, sizeof(tree_iterator_entry),0)) < 0 || - (error = tree_iterator__create_root_frame(ti, tree)) < 0 || - (error = tree_iterator__push_frame(ti)) < 0) /* expand root now */ - goto fail; - - *iter = (git_iterator *)ti; - return 0; - -fail: - git_iterator_free((git_iterator *)ti); - return error; -} - - -typedef struct { - git_iterator base; - git_iterator_callbacks cb; - git_index *index; - git_vector entries; - git_vector_cmp entry_srch; - size_t current; - /* when not in autoexpand mode, use these to represent "tree" state */ - git_buf partial; - size_t partial_pos; - char restore_terminator; - git_index_entry tree_entry; -} index_iterator; - -static const git_index_entry *index_iterator__index_entry(index_iterator *ii) -{ - const git_index_entry *ie = git_vector_get(&ii->entries, ii->current); - - if (ie != NULL && iterator__past_end(ii, ie->path)) { - ii->current = git_vector_length(&ii->entries); - ie = NULL; - } - - return ie; -} - -static const git_index_entry *index_iterator__advance_over_conflicts(index_iterator *ii) -{ - const git_index_entry *ie = index_iterator__index_entry(ii); - - if (!iterator__include_conflicts(ii)) { - while (ie && git_index_entry_is_conflict(ie)) { - ii->current++; - ie = index_iterator__index_entry(ii); - } - } - - return ie; -} - -static void index_iterator__next_prefix_tree(index_iterator *ii) -{ - const char *slash; - - if (!iterator__include_trees(ii)) - return; - - slash = strchr(&ii->partial.ptr[ii->partial_pos], '/'); - - if (slash != NULL) { - ii->partial_pos = (slash - ii->partial.ptr) + 1; - ii->restore_terminator = ii->partial.ptr[ii->partial_pos]; - ii->partial.ptr[ii->partial_pos] = '\0'; - } else { - ii->partial_pos = ii->partial.size; - } - - if (index_iterator__index_entry(ii) == NULL) - ii->partial_pos = ii->partial.size; -} - -static int index_iterator__first_prefix_tree(index_iterator *ii) -{ - const git_index_entry *ie = index_iterator__advance_over_conflicts(ii); - const char *scan, *prior, *slash; - - if (!ie || !iterator__include_trees(ii)) - return 0; - - /* find longest common prefix with prior index entry */ - for (scan = slash = ie->path, prior = ii->partial.ptr; - *scan && *scan == *prior; ++scan, ++prior) - if (*scan == '/') - slash = scan; - - if (git_buf_sets(&ii->partial, ie->path) < 0) - return -1; - - ii->partial_pos = (slash - ie->path) + 1; - index_iterator__next_prefix_tree(ii); - - return 0; -} - -#define index_iterator__at_tree(I) \ - (iterator__include_trees(I) && (I)->partial_pos < (I)->partial.size) - -static int index_iterator__current( - const git_index_entry **entry, git_iterator *self) -{ - index_iterator *ii = (index_iterator *)self; - const git_index_entry *ie = git_vector_get(&ii->entries, ii->current); - - if (ie != NULL && index_iterator__at_tree(ii)) { - ii->tree_entry.path = ii->partial.ptr; - ie = &ii->tree_entry; - } - - if (entry) - *entry = ie; - - ii->base.flags |= GIT_ITERATOR_FIRST_ACCESS; - - return (ie != NULL) ? 0 : GIT_ITEROVER; -} - -static int index_iterator__at_end(git_iterator *self) -{ - index_iterator *ii = (index_iterator *)self; - return (ii->current >= git_vector_length(&ii->entries)); -} - -static int index_iterator__advance( - const git_index_entry **entry, git_iterator *self) -{ - index_iterator *ii = (index_iterator *)self; - size_t entrycount = git_vector_length(&ii->entries); - const git_index_entry *ie; - - if (!iterator__has_been_accessed(ii)) - return index_iterator__current(entry, self); - - if (index_iterator__at_tree(ii)) { - if (iterator__do_autoexpand(ii)) { - ii->partial.ptr[ii->partial_pos] = ii->restore_terminator; - index_iterator__next_prefix_tree(ii); - } else { - /* advance to sibling tree (i.e. find entry with new prefix) */ - while (ii->current < entrycount) { - ii->current++; - - if (!(ie = git_vector_get(&ii->entries, ii->current)) || - ii->base.prefixcomp(ie->path, ii->partial.ptr) != 0) - break; - } - - if (index_iterator__first_prefix_tree(ii) < 0) - return -1; - } - } else { - if (ii->current < entrycount) - ii->current++; - - if (index_iterator__first_prefix_tree(ii) < 0) - return -1; - } - - return index_iterator__current(entry, self); -} - -static int index_iterator__advance_into( - const git_index_entry **entry, git_iterator *self) -{ - index_iterator *ii = (index_iterator *)self; - const git_index_entry *ie = git_vector_get(&ii->entries, ii->current); - - if (ie != NULL && index_iterator__at_tree(ii)) { - if (ii->restore_terminator) - ii->partial.ptr[ii->partial_pos] = ii->restore_terminator; - index_iterator__next_prefix_tree(ii); - } - - return index_iterator__current(entry, self); -} - -static int index_iterator__seek(git_iterator *self, const char *prefix) -{ - GIT_UNUSED(self); GIT_UNUSED(prefix); - return -1; -} - -static int index_iterator__reset( - git_iterator *self, const char *start, const char *end) -{ - index_iterator *ii = (index_iterator *)self; - const git_index_entry *ie; - - if (iterator__reset_range(self, start, end) < 0) - return -1; - - ii->current = 0; - - if (ii->base.start) - git_index_snapshot_find( - &ii->current, &ii->entries, ii->entry_srch, ii->base.start, 0, 0); - - if ((ie = index_iterator__advance_over_conflicts(ii)) == NULL) - return 0; - - if (git_buf_sets(&ii->partial, ie->path) < 0) - return -1; - - ii->partial_pos = 0; - - if (ii->base.start) { - size_t startlen = strlen(ii->base.start); - - ii->partial_pos = (startlen > ii->partial.size) ? - ii->partial.size : startlen; - } - - index_iterator__next_prefix_tree(ii); - - return 0; -} - -static void index_iterator__free(git_iterator *self) -{ - index_iterator *ii = (index_iterator *)self; - git_index_snapshot_release(&ii->entries, ii->index); - ii->index = NULL; - git_buf_free(&ii->partial); -} - -int git_iterator_for_index( - git_iterator **iter, - git_index *index, - git_iterator_flag_t flags, - const char *start, - const char *end) -{ - int error = 0; - index_iterator *ii = git__calloc(1, sizeof(index_iterator)); - GITERR_CHECK_ALLOC(ii); - - if ((error = git_index_snapshot_new(&ii->entries, index)) < 0) { - git__free(ii); - return error; - } - ii->index = index; - - ITERATOR_BASE_INIT(ii, index, INDEX, git_index_owner(index)); - - if ((error = iterator__update_ignore_case((git_iterator *)ii, flags)) < 0) { - git_iterator_free((git_iterator *)ii); - return error; - } - - ii->entry_srch = iterator__ignore_case(ii) ? - git_index_entry_isrch : git_index_entry_srch; - - git_vector_set_cmp(&ii->entries, iterator__ignore_case(ii) ? - git_index_entry_icmp : git_index_entry_cmp); - git_vector_sort(&ii->entries); - - git_buf_init(&ii->partial, 0); - ii->tree_entry.mode = GIT_FILEMODE_TREE; - - index_iterator__reset((git_iterator *)ii, NULL, NULL); - - *iter = (git_iterator *)ii; - return 0; -} - - -typedef struct fs_iterator_frame fs_iterator_frame; -struct fs_iterator_frame { - fs_iterator_frame *next; - git_vector entries; - size_t index; - int is_ignored; -}; - -typedef struct fs_iterator fs_iterator; -struct fs_iterator { - git_iterator base; - git_iterator_callbacks cb; - fs_iterator_frame *stack; - git_index_entry entry; - git_buf path; - size_t root_len; - uint32_t dirload_flags; - int depth; - - int (*enter_dir_cb)(fs_iterator *self); - int (*leave_dir_cb)(fs_iterator *self); - int (*update_entry_cb)(fs_iterator *self); -}; - -#define FS_MAX_DEPTH 100 - -typedef struct { - struct stat st; - size_t path_len; - char path[GIT_FLEX_ARRAY]; -} fs_iterator_path_with_stat; - -static int fs_iterator_path_with_stat_cmp(const void *a, const void *b) -{ - const fs_iterator_path_with_stat *psa = a, *psb = b; - return strcmp(psa->path, psb->path); -} - -static int fs_iterator_path_with_stat_cmp_icase(const void *a, const void *b) -{ - const fs_iterator_path_with_stat *psa = a, *psb = b; - return strcasecmp(psa->path, psb->path); -} - -static fs_iterator_frame *fs_iterator__alloc_frame(fs_iterator *fi) -{ - fs_iterator_frame *ff = git__calloc(1, sizeof(fs_iterator_frame)); - git_vector_cmp entry_compare = CASESELECT( - iterator__ignore_case(fi), - fs_iterator_path_with_stat_cmp_icase, - fs_iterator_path_with_stat_cmp); - - if (ff && git_vector_init(&ff->entries, 0, entry_compare) < 0) { - git__free(ff); - ff = NULL; - } - - return ff; -} - -static void fs_iterator__free_frame(fs_iterator_frame *ff) -{ - git_vector_free_deep(&ff->entries); - git__free(ff); -} - -static void fs_iterator__pop_frame( - fs_iterator *fi, fs_iterator_frame *ff, bool pop_last) -{ - if (fi && fi->stack == ff) { - if (!ff->next && !pop_last) { - memset(&fi->entry, 0, sizeof(fi->entry)); - return; - } - - if (fi->leave_dir_cb) - (void)fi->leave_dir_cb(fi); - - fi->stack = ff->next; - fi->depth--; - } - - fs_iterator__free_frame(ff); -} - -static int fs_iterator__update_entry(fs_iterator *fi); -static int fs_iterator__advance_over( - const git_index_entry **entry, git_iterator *self); - -static int fs_iterator__entry_cmp(const void *i, const void *item) -{ - const fs_iterator *fi = (const fs_iterator *)i; - const fs_iterator_path_with_stat *ps = item; - return fi->base.prefixcomp(fi->base.start, ps->path); -} - -static void fs_iterator__seek_frame_start( - fs_iterator *fi, fs_iterator_frame *ff) -{ - if (!ff) - return; - - if (fi->base.start) - git_vector_bsearch2( - &ff->index, &ff->entries, fs_iterator__entry_cmp, fi); - else - ff->index = 0; -} - -static int dirload_with_stat( - const char *dirpath, - size_t prefix_len, - unsigned int flags, - const char *start_stat, - const char *end_stat, - git_vector *contents) -{ - git_path_diriter diriter = GIT_PATH_DIRITER_INIT; - const char *path; - int (*strncomp)(const char *a, const char *b, size_t sz); - size_t start_len = start_stat ? strlen(start_stat) : 0; - size_t end_len = end_stat ? strlen(end_stat) : 0; - fs_iterator_path_with_stat *ps; - size_t path_len, cmp_len, ps_size; - int error; - - strncomp = (flags & GIT_PATH_DIR_IGNORE_CASE) != 0 ? - git__strncasecmp : git__strncmp; - - /* Any error here is equivalent to the dir not existing, skip over it */ - if ((error = git_path_diriter_init(&diriter, dirpath, flags)) < 0) { - error = GIT_ENOTFOUND; - goto done; - } - - while ((error = git_path_diriter_next(&diriter)) == 0) { - if ((error = git_path_diriter_fullpath(&path, &path_len, &diriter)) < 0) - goto done; - - assert(path_len > prefix_len); - - /* remove the prefix if requested */ - path += prefix_len; - path_len -= prefix_len; - - /* skip if before start_stat or after end_stat */ - cmp_len = min(start_len, path_len); - if (cmp_len && strncomp(path, start_stat, cmp_len) < 0) - continue; - cmp_len = min(end_len, path_len); - if (cmp_len && strncomp(path, end_stat, cmp_len) > 0) - continue; - - /* Make sure to append two bytes, one for the path's null - * termination, one for a possible trailing '/' for folders. - */ - GITERR_CHECK_ALLOC_ADD(&ps_size, sizeof(fs_iterator_path_with_stat), path_len); - GITERR_CHECK_ALLOC_ADD(&ps_size, ps_size, 2); - - ps = git__calloc(1, ps_size); - ps->path_len = path_len; - - memcpy(ps->path, path, path_len); - - if ((error = git_path_diriter_stat(&ps->st, &diriter)) < 0) { - if (error == GIT_ENOTFOUND) { - /* file was removed between readdir and lstat */ - git__free(ps); - continue; - } - - /* Treat the file as unreadable if we get any other error */ - memset(&ps->st, 0, sizeof(ps->st)); - ps->st.st_mode = GIT_FILEMODE_UNREADABLE; - - giterr_clear(); - error = 0; - } else if (S_ISDIR(ps->st.st_mode)) { - /* Suffix directory paths with a '/' */ - ps->path[ps->path_len++] = '/'; - ps->path[ps->path_len] = '\0'; - } else if(!S_ISREG(ps->st.st_mode) && !S_ISLNK(ps->st.st_mode)) { - /* Ignore wacky things in the filesystem */ - git__free(ps); - continue; - } - - git_vector_insert(contents, ps); - } - - if (error == GIT_ITEROVER) - error = 0; - - /* sort now that directory suffix is added */ - git_vector_sort(contents); - -done: - git_path_diriter_free(&diriter); - return error; -} - - -static int fs_iterator__expand_dir(fs_iterator *fi) -{ - int error; - fs_iterator_frame *ff; - - if (fi->depth > FS_MAX_DEPTH) { - giterr_set(GITERR_REPOSITORY, - "Directory nesting is too deep (%d)", fi->depth); - return -1; - } - - ff = fs_iterator__alloc_frame(fi); - GITERR_CHECK_ALLOC(ff); - - error = dirload_with_stat( - fi->path.ptr, fi->root_len, fi->dirload_flags, - fi->base.start, fi->base.end, &ff->entries); - - if (error < 0) { - git_error_state last_error = { 0 }; - giterr_capture(&last_error, error); - - /* these callbacks may clear the error message */ - fs_iterator__free_frame(ff); - fs_iterator__advance_over(NULL, (git_iterator *)fi); - /* next time return value we skipped to */ - fi->base.flags &= ~GIT_ITERATOR_FIRST_ACCESS; - - return giterr_restore(&last_error); - } - - if (ff->entries.length == 0) { - fs_iterator__free_frame(ff); - return GIT_ENOTFOUND; - } - fi->base.stat_calls += ff->entries.length; - - fs_iterator__seek_frame_start(fi, ff); - - ff->next = fi->stack; - fi->stack = ff; - fi->depth++; - - if (fi->enter_dir_cb && (error = fi->enter_dir_cb(fi)) < 0) - return error; - - return fs_iterator__update_entry(fi); -} - -static int fs_iterator__current( - const git_index_entry **entry, git_iterator *self) -{ - fs_iterator *fi = (fs_iterator *)self; - const git_index_entry *fe = (fi->entry.path == NULL) ? NULL : &fi->entry; - - if (entry) - *entry = fe; - - fi->base.flags |= GIT_ITERATOR_FIRST_ACCESS; - - return (fe != NULL) ? 0 : GIT_ITEROVER; -} - -static int fs_iterator__at_end(git_iterator *self) -{ - return (((fs_iterator *)self)->entry.path == NULL); -} - -static int fs_iterator__advance_into( - const git_index_entry **entry, git_iterator *iter) -{ - int error = 0; - fs_iterator *fi = (fs_iterator *)iter; - - iterator__clear_entry(entry); - - /* Allow you to explicitly advance into a commit/submodule (as well as a - * tree) to avoid cases where an entry is mislabeled as a submodule in - * the working directory. The fs iterator will never have COMMMIT - * entries on it's own, but a wrapper might add them. - */ - if (fi->entry.path != NULL && - (fi->entry.mode == GIT_FILEMODE_TREE || - fi->entry.mode == GIT_FILEMODE_COMMIT)) - /* returns GIT_ENOTFOUND if the directory is empty */ - error = fs_iterator__expand_dir(fi); - - if (!error && entry) - error = fs_iterator__current(entry, iter); - - if (!error && !fi->entry.path) - error = GIT_ITEROVER; - - return error; -} - -static int fs_iterator__advance_over( - const git_index_entry **entry, git_iterator *self) -{ - int error = 0; - fs_iterator *fi = (fs_iterator *)self; - fs_iterator_frame *ff; - fs_iterator_path_with_stat *next; - - if (entry != NULL) - *entry = NULL; - - while (fi->entry.path != NULL) { - ff = fi->stack; - next = git_vector_get(&ff->entries, ++ff->index); - - if (next != NULL) - break; - - fs_iterator__pop_frame(fi, ff, false); - } - - error = fs_iterator__update_entry(fi); - - if (!error && entry != NULL) - error = fs_iterator__current(entry, self); - - return error; -} - -static int fs_iterator__advance( - const git_index_entry **entry, git_iterator *self) -{ - fs_iterator *fi = (fs_iterator *)self; - - if (!iterator__has_been_accessed(fi)) - return fs_iterator__current(entry, self); - - /* given include_trees & autoexpand, we might have to go into a tree */ - if (iterator__do_autoexpand(fi) && - fi->entry.path != NULL && - fi->entry.mode == GIT_FILEMODE_TREE) - { - int error = fs_iterator__advance_into(entry, self); - if (error != GIT_ENOTFOUND) - return error; - /* continue silently past empty directories if autoexpanding */ - giterr_clear(); - } - - return fs_iterator__advance_over(entry, self); -} - -static int fs_iterator__seek(git_iterator *self, const char *prefix) -{ - GIT_UNUSED(self); - GIT_UNUSED(prefix); - /* pop stack until matching prefix */ - /* find prefix item in current frame */ - /* push subdirectories as deep as possible while matching */ - return 0; -} - -static int fs_iterator__reset( - git_iterator *self, const char *start, const char *end) -{ - int error; - fs_iterator *fi = (fs_iterator *)self; - - while (fi->stack != NULL && fi->stack->next != NULL) - fs_iterator__pop_frame(fi, fi->stack, false); - fi->depth = 0; - - if ((error = iterator__reset_range(self, start, end)) < 0) - return error; - - fs_iterator__seek_frame_start(fi, fi->stack); - - error = fs_iterator__update_entry(fi); - if (error == GIT_ITEROVER) - error = 0; - - return error; -} - -static void fs_iterator__free(git_iterator *self) -{ - fs_iterator *fi = (fs_iterator *)self; - - while (fi->stack != NULL) - fs_iterator__pop_frame(fi, fi->stack, true); - - git_buf_free(&fi->path); -} - -static int fs_iterator__update_entry(fs_iterator *fi) -{ - fs_iterator_path_with_stat *ps; - - memset(&fi->entry, 0, sizeof(fi->entry)); - - if (!fi->stack) - return GIT_ITEROVER; - - ps = git_vector_get(&fi->stack->entries, fi->stack->index); - if (!ps) - return GIT_ITEROVER; - - git_buf_truncate(&fi->path, fi->root_len); - if (git_buf_put(&fi->path, ps->path, ps->path_len) < 0) - return -1; - - if (iterator__past_end(fi, fi->path.ptr + fi->root_len)) - return GIT_ITEROVER; - - fi->entry.path = ps->path; - git_index_entry__init_from_stat(&fi->entry, &ps->st, true); - - /* need different mode here to keep directories during iteration */ - fi->entry.mode = git_futils_canonical_mode(ps->st.st_mode); - - /* allow wrapper to check/update the entry (can force skip) */ - if (fi->update_entry_cb && - fi->update_entry_cb(fi) == GIT_ENOTFOUND) - return fs_iterator__advance_over(NULL, (git_iterator *)fi); - - /* if this is a tree and trees aren't included, then skip */ - if (fi->entry.mode == GIT_FILEMODE_TREE && !iterator__include_trees(fi)) { - int error = fs_iterator__advance_into(NULL, (git_iterator *)fi); - if (error != GIT_ENOTFOUND) - return error; - giterr_clear(); - return fs_iterator__advance_over(NULL, (git_iterator *)fi); - } - - return 0; -} - -static int fs_iterator__initialize( - git_iterator **out, fs_iterator *fi, const char *root) -{ - int error; - - if (git_buf_sets(&fi->path, root) < 0 || git_path_to_dir(&fi->path) < 0) { - git__free(fi); - return -1; - } - fi->root_len = fi->path.size; - - fi->dirload_flags = - (iterator__ignore_case(fi) ? GIT_PATH_DIR_IGNORE_CASE : 0) | - (iterator__flag(fi, PRECOMPOSE_UNICODE) ? - GIT_PATH_DIR_PRECOMPOSE_UNICODE : 0); - - if ((error = fs_iterator__expand_dir(fi)) < 0) { - if (error == GIT_ENOTFOUND || error == GIT_ITEROVER) { - giterr_clear(); - error = 0; - } else { - git_iterator_free((git_iterator *)fi); - fi = NULL; - } - } - - *out = (git_iterator *)fi; - return error; -} - -int git_iterator_for_filesystem( - git_iterator **out, - const char *root, - git_iterator_flag_t flags, - const char *start, - const char *end) -{ - fs_iterator *fi = git__calloc(1, sizeof(fs_iterator)); - GITERR_CHECK_ALLOC(fi); - - ITERATOR_BASE_INIT(fi, fs, FS, NULL); - - if ((flags & GIT_ITERATOR_IGNORE_CASE) != 0) - fi->base.flags |= GIT_ITERATOR_IGNORE_CASE; - - return fs_iterator__initialize(out, fi, root); -} - - -typedef struct { - fs_iterator fi; - git_ignores ignores; - int is_ignored; - - /* - * We may have a tree or the index+snapshot to compare against - * when checking for submodules. - */ - git_tree *tree; - git_index *index; - git_vector index_snapshot; - git_vector_cmp entry_srch; - -} workdir_iterator; - -GIT_INLINE(bool) workdir_path_is_dotgit(const git_buf *path) -{ - size_t len; - - if (!path || (len = path->size) < 4) - return false; - - if (path->ptr[len - 1] == '/') - len--; - - if (git__tolower(path->ptr[len - 1]) != 't' || - git__tolower(path->ptr[len - 2]) != 'i' || - git__tolower(path->ptr[len - 3]) != 'g' || - git__tolower(path->ptr[len - 4]) != '.') - return false; - - return (len == 4 || path->ptr[len - 5] == '/'); -} - -/** - * Figure out if an entry is a submodule. - * - * We consider it a submodule if the path is listed as a submodule in - * either the tree or the index. - */ -static int is_submodule(workdir_iterator *wi, fs_iterator_path_with_stat *ie) -{ - int error, is_submodule = 0; - - if (wi->tree) { - git_tree_entry *e; - - /* remove the trailing slash for finding */ - ie->path[ie->path_len-1] = '\0'; - error = git_tree_entry_bypath(&e, wi->tree, ie->path); - ie->path[ie->path_len-1] = '/'; - if (error < 0 && error != GIT_ENOTFOUND) - return 0; - if (!error) { - is_submodule = e->attr == GIT_FILEMODE_COMMIT; - git_tree_entry_free(e); - } - } - - if (!is_submodule && wi->index) { - git_index_entry *e; - size_t pos; - - error = git_index_snapshot_find(&pos, &wi->index_snapshot, wi->entry_srch, ie->path, ie->path_len-1, 0); - if (error < 0 && error != GIT_ENOTFOUND) - return 0; - - if (!error) { - e = git_vector_get(&wi->index_snapshot, pos); - - is_submodule = e->mode == GIT_FILEMODE_COMMIT; - } - } - - return is_submodule; -} - -GIT_INLINE(git_dir_flag) git_entry__dir_flag(git_index_entry *entry) { -#if defined(GIT_WIN32) && !defined(__MINGW32__) - return (entry && entry->mode) - ? S_ISDIR(entry->mode) ? GIT_DIR_FLAG_TRUE : GIT_DIR_FLAG_FALSE - : GIT_DIR_FLAG_UNKNOWN; -#else - GIT_UNUSED(entry); - return GIT_DIR_FLAG_UNKNOWN; -#endif -} - -static int workdir_iterator__enter_dir(fs_iterator *fi) -{ - workdir_iterator *wi = (workdir_iterator *)fi; - fs_iterator_frame *ff = fi->stack; - size_t pos; - fs_iterator_path_with_stat *entry; - bool found_submodules = false; - - git_dir_flag dir_flag = git_entry__dir_flag(&fi->entry); - - /* check if this directory is ignored */ - if (git_ignore__lookup(&ff->is_ignored, &wi->ignores, fi->path.ptr + fi->root_len, dir_flag) < 0) { - giterr_clear(); - ff->is_ignored = GIT_IGNORE_NOTFOUND; - } - - /* if this is not the top level directory... */ - if (ff->next != NULL) { - ssize_t slash_pos = git_buf_rfind_next(&fi->path, '/'); - - /* inherit ignored from parent if no rule specified */ - if (ff->is_ignored <= GIT_IGNORE_NOTFOUND) - ff->is_ignored = ff->next->is_ignored; - - /* push new ignores for files in this directory */ - (void)git_ignore__push_dir(&wi->ignores, &fi->path.ptr[slash_pos + 1]); - } - - /* convert submodules to GITLINK and remove trailing slashes */ - git_vector_foreach(&ff->entries, pos, entry) { - if (!S_ISDIR(entry->st.st_mode) || !strcmp(GIT_DIR, entry->path)) - continue; - - if (is_submodule(wi, entry)) { - entry->st.st_mode = GIT_FILEMODE_COMMIT; - entry->path_len--; - entry->path[entry->path_len] = '\0'; - found_submodules = true; - } - } - - /* if we renamed submodules, re-sort and re-seek to start */ - if (found_submodules) { - git_vector_set_sorted(&ff->entries, 0); - git_vector_sort(&ff->entries); - fs_iterator__seek_frame_start(fi, ff); - } - - return 0; -} - -static int workdir_iterator__leave_dir(fs_iterator *fi) -{ - workdir_iterator *wi = (workdir_iterator *)fi; - git_ignore__pop_dir(&wi->ignores); - return 0; -} - -static int workdir_iterator__update_entry(fs_iterator *fi) -{ - workdir_iterator *wi = (workdir_iterator *)fi; - - /* skip over .git entries */ - if (workdir_path_is_dotgit(&fi->path)) - return GIT_ENOTFOUND; - - /* reset is_ignored since we haven't checked yet */ - wi->is_ignored = GIT_IGNORE_UNCHECKED; - - return 0; -} - -static void workdir_iterator__free(git_iterator *self) -{ - workdir_iterator *wi = (workdir_iterator *)self; - if (wi->index) - git_index_snapshot_release(&wi->index_snapshot, wi->index); - git_tree_free(wi->tree); - fs_iterator__free(self); - git_ignore__free(&wi->ignores); -} - -int git_iterator_for_workdir_ext( - git_iterator **out, - git_repository *repo, - const char *repo_workdir, - git_index *index, - git_tree *tree, - git_iterator_flag_t flags, - const char *start, - const char *end) -{ - int error, precompose = 0; - workdir_iterator *wi; - - if (!repo_workdir) { - if (git_repository__ensure_not_bare(repo, "scan working directory") < 0) - return GIT_EBAREREPO; - repo_workdir = git_repository_workdir(repo); - } - - /* initialize as an fs iterator then do overrides */ - wi = git__calloc(1, sizeof(workdir_iterator)); - GITERR_CHECK_ALLOC(wi); - ITERATOR_BASE_INIT((&wi->fi), fs, FS, repo); - - wi->fi.base.type = GIT_ITERATOR_TYPE_WORKDIR; - wi->fi.cb.free = workdir_iterator__free; - wi->fi.enter_dir_cb = workdir_iterator__enter_dir; - wi->fi.leave_dir_cb = workdir_iterator__leave_dir; - wi->fi.update_entry_cb = workdir_iterator__update_entry; - - if ((error = iterator__update_ignore_case((git_iterator *)wi, flags)) < 0 || - (error = git_ignore__for_path(repo, ".gitignore", &wi->ignores)) < 0) - { - git_iterator_free((git_iterator *)wi); - return error; - } - - if (tree && (error = git_object_dup((git_object **)&wi->tree, (git_object *)tree)) < 0) - return error; - - wi->index = index; - if (index && (error = git_index_snapshot_new(&wi->index_snapshot, index)) < 0) { - git_iterator_free((git_iterator *)wi); - return error; - } - wi->entry_srch = iterator__ignore_case(wi) ? - git_index_entry_isrch : git_index_entry_srch; - - - /* try to look up precompose and set flag if appropriate */ - if (git_repository__cvar(&precompose, repo, GIT_CVAR_PRECOMPOSE) < 0) - giterr_clear(); - else if (precompose) - wi->fi.base.flags |= GIT_ITERATOR_PRECOMPOSE_UNICODE; - - return fs_iterator__initialize(out, &wi->fi, repo_workdir); -} - -void git_iterator_free(git_iterator *iter) -{ - if (iter == NULL) - return; - - iter->cb->free(iter); - - git__free(iter->start); - git__free(iter->end); - - memset(iter, 0, sizeof(*iter)); - - git__free(iter); -} - -int git_iterator_set_ignore_case(git_iterator *iter, bool ignore_case) -{ - bool desire_ignore_case = (ignore_case != 0); - - if (iterator__ignore_case(iter) == desire_ignore_case) - return 0; - - if (iter->type == GIT_ITERATOR_TYPE_EMPTY) { - if (desire_ignore_case) - iter->flags |= GIT_ITERATOR_IGNORE_CASE; - else - iter->flags &= ~GIT_ITERATOR_IGNORE_CASE; - } else { - giterr_set(GITERR_INVALID, - "Cannot currently set ignore case on non-empty iterators"); - return -1; - } - - return 0; -} - -git_index *git_iterator_get_index(git_iterator *iter) -{ - if (iter->type == GIT_ITERATOR_TYPE_INDEX) - return ((index_iterator *)iter)->index; - return NULL; -} - -int git_iterator_current_tree_entry( - const git_tree_entry **tree_entry, git_iterator *iter) -{ - if (iter->type != GIT_ITERATOR_TYPE_TREE) - *tree_entry = NULL; - else { - tree_iterator_frame *tf = ((tree_iterator *)iter)->head; - *tree_entry = (tf->current < tf->n_entries) ? - tf->entries[tf->current]->te : NULL; - } - - return 0; -} - -int git_iterator_current_parent_tree( - const git_tree **tree_ptr, - git_iterator *iter, - const char *parent_path) -{ - tree_iterator *ti = (tree_iterator *)iter; - tree_iterator_frame *tf; - const char *scan = parent_path; - const git_tree_entry *te; - - *tree_ptr = NULL; - - if (iter->type != GIT_ITERATOR_TYPE_TREE) - return 0; - - for (tf = ti->root; *scan; ) { - if (!(tf = tf->down) || - tf->current >= tf->n_entries || - !(te = tf->entries[tf->current]->te) || - ti->strncomp(scan, te->filename, te->filename_len) != 0) - return 0; - - scan += te->filename_len; - if (*scan == '/') - scan++; - } - - *tree_ptr = tf->entries[tf->current]->tree; - return 0; -} - -static void workdir_iterator_update_is_ignored(workdir_iterator *wi) -{ - git_dir_flag dir_flag = git_entry__dir_flag(&wi->fi.entry); - - if (git_ignore__lookup(&wi->is_ignored, &wi->ignores, wi->fi.entry.path, dir_flag) < 0) { - giterr_clear(); - wi->is_ignored = GIT_IGNORE_NOTFOUND; - } - - /* use ignore from containing frame stack */ - if (wi->is_ignored <= GIT_IGNORE_NOTFOUND) - wi->is_ignored = wi->fi.stack->is_ignored; -} - -bool git_iterator_current_is_ignored(git_iterator *iter) -{ - workdir_iterator *wi = (workdir_iterator *)iter; - - if (iter->type != GIT_ITERATOR_TYPE_WORKDIR) - return false; - - if (wi->is_ignored != GIT_IGNORE_UNCHECKED) - return (bool)(wi->is_ignored == GIT_IGNORE_TRUE); - - workdir_iterator_update_is_ignored(wi); - - return (bool)(wi->is_ignored == GIT_IGNORE_TRUE); -} - -bool git_iterator_current_tree_is_ignored(git_iterator *iter) -{ - workdir_iterator *wi = (workdir_iterator *)iter; - - if (iter->type != GIT_ITERATOR_TYPE_WORKDIR) - return false; - - return (bool)(wi->fi.stack->is_ignored == GIT_IGNORE_TRUE); -} - -int git_iterator_cmp(git_iterator *iter, const char *path_prefix) -{ - const git_index_entry *entry; - - /* a "done" iterator is after every prefix */ - if (git_iterator_current(&entry, iter) < 0 || entry == NULL) - return 1; - - /* a NULL prefix is after any valid iterator */ - if (!path_prefix) - return -1; - - return iter->prefixcomp(entry->path, path_prefix); -} - -int git_iterator_current_workdir_path(git_buf **path, git_iterator *iter) -{ - workdir_iterator *wi = (workdir_iterator *)iter; - - if (iter->type != GIT_ITERATOR_TYPE_WORKDIR || !wi->fi.entry.path) - *path = NULL; - else - *path = &wi->fi.path; - - return 0; -} - -int git_iterator_index(git_index **out, git_iterator *iter) -{ - workdir_iterator *wi = (workdir_iterator *)iter; - - if (iter->type != GIT_ITERATOR_TYPE_WORKDIR) - *out = NULL; - - *out = wi->index; - - return 0; -} - -int git_iterator_advance_over_with_status( - const git_index_entry **entryptr, - git_iterator_status_t *status, - git_iterator *iter) -{ - int error = 0; - workdir_iterator *wi = (workdir_iterator *)iter; - char *base = NULL; - const git_index_entry *entry; - - *status = GIT_ITERATOR_STATUS_NORMAL; - - if (iter->type != GIT_ITERATOR_TYPE_WORKDIR) - return git_iterator_advance(entryptr, iter); - if ((error = git_iterator_current(&entry, iter)) < 0) - return error; - - if (!S_ISDIR(entry->mode)) { - workdir_iterator_update_is_ignored(wi); - if (wi->is_ignored == GIT_IGNORE_TRUE) - *status = GIT_ITERATOR_STATUS_IGNORED; - return git_iterator_advance(entryptr, iter); - } - - *status = GIT_ITERATOR_STATUS_EMPTY; - - base = git__strdup(entry->path); - GITERR_CHECK_ALLOC(base); - - /* scan inside directory looking for a non-ignored item */ - while (entry && !iter->prefixcomp(entry->path, base)) { - workdir_iterator_update_is_ignored(wi); - - /* if we found an explicitly ignored item, then update from - * EMPTY to IGNORED - */ - if (wi->is_ignored == GIT_IGNORE_TRUE) - *status = GIT_ITERATOR_STATUS_IGNORED; - else if (S_ISDIR(entry->mode)) { - error = git_iterator_advance_into(&entry, iter); - - if (!error) - continue; - else if (error == GIT_ENOTFOUND) { - error = 0; - wi->is_ignored = GIT_IGNORE_TRUE; /* mark empty dirs ignored */ - } else - break; /* real error, stop here */ - } else { - /* we found a non-ignored item, treat parent as untracked */ - *status = GIT_ITERATOR_STATUS_NORMAL; - break; - } - - if ((error = git_iterator_advance(&entry, iter)) < 0) - break; - } - - /* wrap up scan back to base directory */ - while (entry && !iter->prefixcomp(entry->path, base)) - if ((error = git_iterator_advance(&entry, iter)) < 0) - break; - - *entryptr = entry; - git__free(base); - - return error; -} - -int git_iterator_walk( - git_iterator **iterators, - size_t cnt, - git_iterator_walk_cb cb, - void *data) -{ - const git_index_entry **iterator_item; /* next in each iterator */ - const git_index_entry **cur_items; /* current path in each iter */ - const git_index_entry *first_match; - size_t i, j; - int error = 0; - - iterator_item = git__calloc(cnt, sizeof(git_index_entry *)); - cur_items = git__calloc(cnt, sizeof(git_index_entry *)); - - GITERR_CHECK_ALLOC(iterator_item); - GITERR_CHECK_ALLOC(cur_items); - - /* Set up the iterators */ - for (i = 0; i < cnt; i++) { - error = git_iterator_current(&iterator_item[i], iterators[i]); - - if (error < 0 && error != GIT_ITEROVER) - goto done; - } - - while (true) { - for (i = 0; i < cnt; i++) - cur_items[i] = NULL; - - first_match = NULL; - - /* Find the next path(s) to consume from each iterator */ - for (i = 0; i < cnt; i++) { - if (iterator_item[i] == NULL) - continue; - - if (first_match == NULL) { - first_match = iterator_item[i]; - cur_items[i] = iterator_item[i]; - } else { - int path_diff = git_index_entry_cmp(iterator_item[i], first_match); - - if (path_diff < 0) { - /* Found an index entry that sorts before the one we're - * looking at. Forget that we've seen the other and - * look at the other iterators for this path. - */ - for (j = 0; j < i; j++) - cur_items[j] = NULL; - - first_match = iterator_item[i]; - cur_items[i] = iterator_item[i]; - } else if (path_diff == 0) { - cur_items[i] = iterator_item[i]; - } - } - } - - if (first_match == NULL) - break; - - if ((error = cb(cur_items, data)) != 0) - goto done; - - /* Advance each iterator that participated */ - for (i = 0; i < cnt; i++) { - if (cur_items[i] == NULL) - continue; - - error = git_iterator_advance(&iterator_item[i], iterators[i]); - - if (error < 0 && error != GIT_ITEROVER) - goto done; - } - } - -done: - git__free((git_index_entry **)iterator_item); - git__free((git_index_entry **)cur_items); - - if (error == GIT_ITEROVER) - error = 0; - - return error; -} diff --git a/vendor/libgit2/src/iterator.h b/vendor/libgit2/src/iterator.h deleted file mode 100644 index 893e5db504..0000000000 --- a/vendor/libgit2/src/iterator.h +++ /dev/null @@ -1,312 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_iterator_h__ -#define INCLUDE_iterator_h__ - -#include "common.h" -#include "git2/index.h" -#include "vector.h" -#include "buffer.h" -#include "ignore.h" - -typedef struct git_iterator git_iterator; - -typedef enum { - GIT_ITERATOR_TYPE_EMPTY = 0, - GIT_ITERATOR_TYPE_TREE = 1, - GIT_ITERATOR_TYPE_INDEX = 2, - GIT_ITERATOR_TYPE_WORKDIR = 3, - GIT_ITERATOR_TYPE_FS = 4, -} git_iterator_type_t; - -typedef enum { - /** ignore case for entry sort order */ - GIT_ITERATOR_IGNORE_CASE = (1u << 0), - /** force case sensitivity for entry sort order */ - GIT_ITERATOR_DONT_IGNORE_CASE = (1u << 1), - /** return tree items in addition to blob items */ - GIT_ITERATOR_INCLUDE_TREES = (1u << 2), - /** don't flatten trees, requiring advance_into (implies INCLUDE_TREES) */ - GIT_ITERATOR_DONT_AUTOEXPAND = (1u << 3), - /** convert precomposed unicode to decomposed unicode */ - GIT_ITERATOR_PRECOMPOSE_UNICODE = (1u << 4), - /** include conflicts */ - GIT_ITERATOR_INCLUDE_CONFLICTS = (1u << 5), -} git_iterator_flag_t; - -typedef struct { - int (*current)(const git_index_entry **, git_iterator *); - int (*advance)(const git_index_entry **, git_iterator *); - int (*advance_into)(const git_index_entry **, git_iterator *); - int (*seek)(git_iterator *, const char *prefix); - int (*reset)(git_iterator *, const char *start, const char *end); - int (*at_end)(git_iterator *); - void (*free)(git_iterator *); -} git_iterator_callbacks; - -struct git_iterator { - git_iterator_type_t type; - git_iterator_callbacks *cb; - git_repository *repo; - char *start; - char *end; - int (*prefixcomp)(const char *str, const char *prefix); - size_t stat_calls; - unsigned int flags; -}; - -extern int git_iterator_for_nothing( - git_iterator **out, - git_iterator_flag_t flags, - const char *start, - const char *end); - -/* tree iterators will match the ignore_case value from the index of the - * repository, unless you override with a non-zero flag value - */ -extern int git_iterator_for_tree( - git_iterator **out, - git_tree *tree, - git_iterator_flag_t flags, - const char *start, - const char *end); - -/* index iterators will take the ignore_case value from the index; the - * ignore_case flags are not used - */ -extern int git_iterator_for_index( - git_iterator **out, - git_index *index, - git_iterator_flag_t flags, - const char *start, - const char *end); - -extern int git_iterator_for_workdir_ext( - git_iterator **out, - git_repository *repo, - const char *repo_workdir, - git_index *index, - git_tree *tree, - git_iterator_flag_t flags, - const char *start, - const char *end); - -/* workdir iterators will match the ignore_case value from the index of the - * repository, unless you override with a non-zero flag value - */ -GIT_INLINE(int) git_iterator_for_workdir( - git_iterator **out, - git_repository *repo, - git_index *index, - git_tree *tree, - git_iterator_flag_t flags, - const char *start, - const char *end) -{ - return git_iterator_for_workdir_ext(out, repo, NULL, index, tree, flags, start, end); -} - -/* for filesystem iterators, you have to explicitly pass in the ignore_case - * behavior that you desire - */ -extern int git_iterator_for_filesystem( - git_iterator **out, - const char *root, - git_iterator_flag_t flags, - const char *start, - const char *end); - -extern void git_iterator_free(git_iterator *iter); - -/* Return a git_index_entry structure for the current value the iterator - * is looking at or NULL if the iterator is at the end. - * - * The entry may noy be fully populated. Tree iterators will only have a - * value mode, OID, and path. Workdir iterators will not have an OID (but - * you can use `git_iterator_current_oid()` to calculate it on demand). - * - * You do not need to free the entry. It is still "owned" by the iterator. - * Once you call `git_iterator_advance()` then the old entry is no longer - * guaranteed to be valid - it may be freed or just overwritten in place. - */ -GIT_INLINE(int) git_iterator_current( - const git_index_entry **entry, git_iterator *iter) -{ - return iter->cb->current(entry, iter); -} - -/** - * Advance to the next item for the iterator. - * - * If GIT_ITERATOR_INCLUDE_TREES is set, this may be a tree item. If - * GIT_ITERATOR_DONT_AUTOEXPAND is set, calling this again when on a tree - * item will skip over all the items under that tree. - */ -GIT_INLINE(int) git_iterator_advance( - const git_index_entry **entry, git_iterator *iter) -{ - return iter->cb->advance(entry, iter); -} - -/** - * Iterate into a tree item (when GIT_ITERATOR_DONT_AUTOEXPAND is set). - * - * git_iterator_advance() steps through all items being iterated over - * (either with or without trees, depending on GIT_ITERATOR_INCLUDE_TREES), - * but if GIT_ITERATOR_DONT_AUTOEXPAND is set, it will skip to the next - * sibling of a tree instead of going to the first child of the tree. In - * that case, use this function to advance to the first child of the tree. - * - * If the current item is not a tree, this is a no-op. - * - * For filesystem and working directory iterators, a tree (i.e. directory) - * can be empty. In that case, this function returns GIT_ENOTFOUND and - * does not advance. That can't happen for tree and index iterators. - */ -GIT_INLINE(int) git_iterator_advance_into( - const git_index_entry **entry, git_iterator *iter) -{ - return iter->cb->advance_into(entry, iter); -} - -/** - * Advance into a tree or skip over it if it is empty. - * - * Because `git_iterator_advance_into` may return GIT_ENOTFOUND if the - * directory is empty (only with filesystem and working directory - * iterators) and a common response is to just call `git_iterator_advance` - * when that happens, this bundles the two into a single simple call. - */ -GIT_INLINE(int) git_iterator_advance_into_or_over( - const git_index_entry **entry, git_iterator *iter) -{ - int error = iter->cb->advance_into(entry, iter); - if (error == GIT_ENOTFOUND) { - giterr_clear(); - error = iter->cb->advance(entry, iter); - } - return error; -} - -/* Seek is currently unimplemented */ -GIT_INLINE(int) git_iterator_seek( - git_iterator *iter, const char *prefix) -{ - return iter->cb->seek(iter, prefix); -} - -/** - * Go back to the start of the iteration. - * - * This resets the iterator to the start of the iteration. It also allows - * you to reset the `start` and `end` pathname boundaries of the iteration - * when doing so. - */ -GIT_INLINE(int) git_iterator_reset( - git_iterator *iter, const char *start, const char *end) -{ - return iter->cb->reset(iter, start, end); -} - -/** - * Check if the iterator is at the end - * - * @return 0 if not at end, >0 if at end - */ -GIT_INLINE(int) git_iterator_at_end(git_iterator *iter) -{ - return iter->cb->at_end(iter); -} - -GIT_INLINE(git_iterator_type_t) git_iterator_type(git_iterator *iter) -{ - return iter->type; -} - -GIT_INLINE(git_repository *) git_iterator_owner(git_iterator *iter) -{ - return iter->repo; -} - -GIT_INLINE(git_iterator_flag_t) git_iterator_flags(git_iterator *iter) -{ - return iter->flags; -} - -GIT_INLINE(bool) git_iterator_ignore_case(git_iterator *iter) -{ - return ((iter->flags & GIT_ITERATOR_IGNORE_CASE) != 0); -} - -extern int git_iterator_set_ignore_case(git_iterator *iter, bool ignore_case); - -extern int git_iterator_current_tree_entry( - const git_tree_entry **entry_out, git_iterator *iter); - -extern int git_iterator_current_parent_tree( - const git_tree **tree_out, git_iterator *iter, const char *parent_path); - -extern bool git_iterator_current_is_ignored(git_iterator *iter); - -extern bool git_iterator_current_tree_is_ignored(git_iterator *iter); - -extern int git_iterator_cmp( - git_iterator *iter, const char *path_prefix); - -/** - * Get full path of the current item from a workdir iterator. This will - * return NULL for a non-workdir iterator. The git_buf is still owned by - * the iterator; this is exposed just for efficiency. - */ -extern int git_iterator_current_workdir_path( - git_buf **path, git_iterator *iter); - -/* Return index pointer if index iterator, else NULL */ -extern git_index *git_iterator_get_index(git_iterator *iter); - -typedef enum { - GIT_ITERATOR_STATUS_NORMAL = 0, - GIT_ITERATOR_STATUS_IGNORED = 1, - GIT_ITERATOR_STATUS_EMPTY = 2 -} git_iterator_status_t; - -/* Advance over a directory and check if it contains no files or just - * ignored files. - * - * In a tree or the index, all directories will contain files, but in the - * working directory it is possible to have an empty directory tree or a - * tree that only contains ignored files. Many Git operations treat these - * cases specially. This advances over a directory (presumably an - * untracked directory) but checks during the scan if there are any files - * and any non-ignored files. - */ -extern int git_iterator_advance_over_with_status( - const git_index_entry **entry, git_iterator_status_t *status, git_iterator *iter); - -/** - * Retrieve the index stored in the iterator. - * - * Only implemented for the workdir iterator - */ -extern int git_iterator_index(git_index **out, git_iterator *iter); - -typedef int (*git_iterator_walk_cb)( - const git_index_entry **entries, - void *data); - -/** - * Walk the given iterators in lock-step. The given callback will be - * called for each unique path, with the index entry in each iterator - * (or NULL if the given iterator does not contain that path). - */ -extern int git_iterator_walk( - git_iterator **iterators, - size_t cnt, - git_iterator_walk_cb cb, - void *data); - -#endif diff --git a/vendor/libgit2/src/khash.h b/vendor/libgit2/src/khash.h deleted file mode 100644 index 71eb583d58..0000000000 --- a/vendor/libgit2/src/khash.h +++ /dev/null @@ -1,622 +0,0 @@ -/* The MIT License - - Copyright (c) 2008, 2009, 2011 by Attractive Chaos - - 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. -*/ - -/* - An example: - -#include "khash.h" -KHASH_MAP_INIT_INT(32, char) -int main() { - int ret, is_missing; - khiter_t k; - khash_t(32) *h = kh_init(32); - k = kh_put(32, h, 5, &ret); - kh_value(h, k) = 10; - k = kh_get(32, h, 10); - is_missing = (k == kh_end(h)); - k = kh_get(32, h, 5); - kh_del(32, h, k); - for (k = kh_begin(h); k != kh_end(h); ++k) - if (kh_exist(h, k)) kh_value(h, k) = 1; - kh_destroy(32, h); - return 0; -} -*/ - -/* - 2013-05-02 (0.2.8): - - * Use quadratic probing. When the capacity is power of 2, stepping function - i*(i+1)/2 guarantees to traverse each bucket. It is better than double - hashing on cache performance and is more robust than linear probing. - - In theory, double hashing should be more robust than quadratic probing. - However, my implementation is probably not for large hash tables, because - the second hash function is closely tied to the first hash function, - which reduce the effectiveness of double hashing. - - Reference: http://research.cs.vt.edu/AVresearch/hashing/quadratic.php - - 2011-12-29 (0.2.7): - - * Minor code clean up; no actual effect. - - 2011-09-16 (0.2.6): - - * The capacity is a power of 2. This seems to dramatically improve the - speed for simple keys. Thank Zilong Tan for the suggestion. Reference: - - - http://code.google.com/p/ulib/ - - http://nothings.org/computer/judy/ - - * Allow to optionally use linear probing which usually has better - performance for random input. Double hashing is still the default as it - is more robust to certain non-random input. - - * Added Wang's integer hash function (not used by default). This hash - function is more robust to certain non-random input. - - 2011-02-14 (0.2.5): - - * Allow to declare global functions. - - 2009-09-26 (0.2.4): - - * Improve portability - - 2008-09-19 (0.2.3): - - * Corrected the example - * Improved interfaces - - 2008-09-11 (0.2.2): - - * Improved speed a little in kh_put() - - 2008-09-10 (0.2.1): - - * Added kh_clear() - * Fixed a compiling error - - 2008-09-02 (0.2.0): - - * Changed to token concatenation which increases flexibility. - - 2008-08-31 (0.1.2): - - * Fixed a bug in kh_get(), which has not been tested previously. - - 2008-08-31 (0.1.1): - - * Added destructor -*/ - - -#ifndef __AC_KHASH_H -#define __AC_KHASH_H - -/*! - @header - - Generic hash table library. - */ - -#define AC_VERSION_KHASH_H "0.2.8" - -#include -#include -#include - -/* compiler specific configuration */ - -#if UINT_MAX == 0xffffffffu -typedef unsigned int khint32_t; -#elif ULONG_MAX == 0xffffffffu -typedef unsigned long khint32_t; -#endif - -#if ULONG_MAX == ULLONG_MAX -typedef unsigned long khint64_t; -#else -typedef unsigned long long khint64_t; -#endif - -#ifndef kh_inline -#ifdef _MSC_VER -#define kh_inline __inline -#else -#define kh_inline inline -#endif -#endif /* kh_inline */ - -typedef khint32_t khint_t; -typedef khint_t khiter_t; - -#define __ac_isempty(flag, i) ((flag[i>>4]>>((i&0xfU)<<1))&2) -#define __ac_isdel(flag, i) ((flag[i>>4]>>((i&0xfU)<<1))&1) -#define __ac_iseither(flag, i) ((flag[i>>4]>>((i&0xfU)<<1))&3) -#define __ac_set_isdel_false(flag, i) (flag[i>>4]&=~(1ul<<((i&0xfU)<<1))) -#define __ac_set_isempty_false(flag, i) (flag[i>>4]&=~(2ul<<((i&0xfU)<<1))) -#define __ac_set_isboth_false(flag, i) (flag[i>>4]&=~(3ul<<((i&0xfU)<<1))) -#define __ac_set_isdel_true(flag, i) (flag[i>>4]|=1ul<<((i&0xfU)<<1)) - -#define __ac_fsize(m) ((m) < 16? 1 : (m)>>4) - -#ifndef kroundup32 -#define kroundup32(x) (--(x), (x)|=(x)>>1, (x)|=(x)>>2, (x)|=(x)>>4, (x)|=(x)>>8, (x)|=(x)>>16, ++(x)) -#endif - -#ifndef kcalloc -#define kcalloc(N,Z) calloc(N,Z) -#endif -#ifndef kmalloc -#define kmalloc(Z) malloc(Z) -#endif -#ifndef krealloc -#define krealloc(P,Z) realloc(P,Z) -#endif -#ifndef kreallocarray -#define kreallocarray(P,N,Z) ((SIZE_MAX - N < Z) ? NULL : krealloc(P, (N*Z))) -#endif -#ifndef kfree -#define kfree(P) free(P) -#endif - -static const double __ac_HASH_UPPER = 0.77; - -#define __KHASH_TYPE(name, khkey_t, khval_t) \ - typedef struct kh_##name##_s { \ - khint_t n_buckets, size, n_occupied, upper_bound; \ - khint32_t *flags; \ - khkey_t *keys; \ - khval_t *vals; \ - } kh_##name##_t; - -#define __KHASH_PROTOTYPES(name, khkey_t, khval_t) \ - extern kh_##name##_t *kh_init_##name(void); \ - extern void kh_destroy_##name(kh_##name##_t *h); \ - extern void kh_clear_##name(kh_##name##_t *h); \ - extern khint_t kh_get_##name(const kh_##name##_t *h, khkey_t key); \ - extern int kh_resize_##name(kh_##name##_t *h, khint_t new_n_buckets); \ - extern khint_t kh_put_##name(kh_##name##_t *h, khkey_t key, int *ret); \ - extern void kh_del_##name(kh_##name##_t *h, khint_t x); - -#define __KHASH_IMPL(name, SCOPE, khkey_t, khval_t, kh_is_map, __hash_func, __hash_equal) \ - SCOPE kh_##name##_t *kh_init_##name(void) { \ - return (kh_##name##_t*)kcalloc(1, sizeof(kh_##name##_t)); \ - } \ - SCOPE void kh_destroy_##name(kh_##name##_t *h) \ - { \ - if (h) { \ - kfree((void *)h->keys); kfree(h->flags); \ - kfree((void *)h->vals); \ - kfree(h); \ - } \ - } \ - SCOPE void kh_clear_##name(kh_##name##_t *h) \ - { \ - if (h && h->flags) { \ - memset(h->flags, 0xaa, __ac_fsize(h->n_buckets) * sizeof(khint32_t)); \ - h->size = h->n_occupied = 0; \ - } \ - } \ - SCOPE khint_t kh_get_##name(const kh_##name##_t *h, khkey_t key) \ - { \ - if (h->n_buckets) { \ - khint_t k, i, last, mask, step = 0; \ - mask = h->n_buckets - 1; \ - k = __hash_func(key); i = k & mask; \ - last = i; \ - while (!__ac_isempty(h->flags, i) && (__ac_isdel(h->flags, i) || !__hash_equal(h->keys[i], key))) { \ - i = (i + (++step)) & mask; \ - if (i == last) return h->n_buckets; \ - } \ - return __ac_iseither(h->flags, i)? h->n_buckets : i; \ - } else return 0; \ - } \ - SCOPE int kh_resize_##name(kh_##name##_t *h, khint_t new_n_buckets) \ - { /* This function uses 0.25*n_buckets bytes of working space instead of [sizeof(key_t+val_t)+.25]*n_buckets. */ \ - khint32_t *new_flags = 0; \ - khint_t j = 1; \ - { \ - kroundup32(new_n_buckets); \ - if (new_n_buckets < 4) new_n_buckets = 4; \ - if (h->size >= (khint_t)(new_n_buckets * __ac_HASH_UPPER + 0.5)) j = 0; /* requested size is too small */ \ - else { /* hash table size to be changed (shrink or expand); rehash */ \ - new_flags = (khint32_t*)kreallocarray(NULL, __ac_fsize(new_n_buckets), sizeof(khint32_t)); \ - if (!new_flags) return -1; \ - memset(new_flags, 0xaa, __ac_fsize(new_n_buckets) * sizeof(khint32_t)); \ - if (h->n_buckets < new_n_buckets) { /* expand */ \ - khkey_t *new_keys = (khkey_t*)kreallocarray((void *)h->keys, new_n_buckets, sizeof(khkey_t)); \ - if (!new_keys) { kfree(new_flags); return -1; } \ - h->keys = new_keys; \ - if (kh_is_map) { \ - khval_t *new_vals = (khval_t*)kreallocarray((void *)h->vals, new_n_buckets, sizeof(khval_t)); \ - if (!new_vals) { kfree(new_flags); return -1; } \ - h->vals = new_vals; \ - } \ - } /* otherwise shrink */ \ - } \ - } \ - if (j) { /* rehashing is needed */ \ - for (j = 0; j != h->n_buckets; ++j) { \ - if (__ac_iseither(h->flags, j) == 0) { \ - khkey_t key = h->keys[j]; \ - khval_t val; \ - khint_t new_mask; \ - new_mask = new_n_buckets - 1; \ - if (kh_is_map) val = h->vals[j]; \ - __ac_set_isdel_true(h->flags, j); \ - while (1) { /* kick-out process; sort of like in Cuckoo hashing */ \ - khint_t k, i, step = 0; \ - k = __hash_func(key); \ - i = k & new_mask; \ - while (!__ac_isempty(new_flags, i)) i = (i + (++step)) & new_mask; \ - __ac_set_isempty_false(new_flags, i); \ - if (i < h->n_buckets && __ac_iseither(h->flags, i) == 0) { /* kick out the existing element */ \ - { khkey_t tmp = h->keys[i]; h->keys[i] = key; key = tmp; } \ - if (kh_is_map) { khval_t tmp = h->vals[i]; h->vals[i] = val; val = tmp; } \ - __ac_set_isdel_true(h->flags, i); /* mark it as deleted in the old hash table */ \ - } else { /* write the element and jump out of the loop */ \ - h->keys[i] = key; \ - if (kh_is_map) h->vals[i] = val; \ - break; \ - } \ - } \ - } \ - } \ - if (h->n_buckets > new_n_buckets) { /* shrink the hash table */ \ - h->keys = (khkey_t*)kreallocarray((void *)h->keys, new_n_buckets, sizeof(khkey_t)); \ - if (kh_is_map) h->vals = (khval_t*)kreallocarray((void *)h->vals, new_n_buckets, sizeof(khval_t)); \ - } \ - kfree(h->flags); /* free the working space */ \ - h->flags = new_flags; \ - h->n_buckets = new_n_buckets; \ - h->n_occupied = h->size; \ - h->upper_bound = (khint_t)(h->n_buckets * __ac_HASH_UPPER + 0.5); \ - } \ - return 0; \ - } \ - SCOPE khint_t kh_put_##name(kh_##name##_t *h, khkey_t key, int *ret) \ - { \ - khint_t x; \ - if (h->n_occupied >= h->upper_bound) { /* update the hash table */ \ - if (h->n_buckets > (h->size<<1)) { \ - if (kh_resize_##name(h, h->n_buckets - 1) < 0) { /* clear "deleted" elements */ \ - *ret = -1; return h->n_buckets; \ - } \ - } else if (kh_resize_##name(h, h->n_buckets + 1) < 0) { /* expand the hash table */ \ - *ret = -1; return h->n_buckets; \ - } \ - } /* TODO: to implement automatically shrinking; resize() already support shrinking */ \ - { \ - khint_t k, i, site, last, mask = h->n_buckets - 1, step = 0; \ - x = site = h->n_buckets; k = __hash_func(key); i = k & mask; \ - if (__ac_isempty(h->flags, i)) x = i; /* for speed up */ \ - else { \ - last = i; \ - while (!__ac_isempty(h->flags, i) && (__ac_isdel(h->flags, i) || !__hash_equal(h->keys[i], key))) { \ - if (__ac_isdel(h->flags, i)) site = i; \ - i = (i + (++step)) & mask; \ - if (i == last) { x = site; break; } \ - } \ - if (x == h->n_buckets) { \ - if (__ac_isempty(h->flags, i) && site != h->n_buckets) x = site; \ - else x = i; \ - } \ - } \ - } \ - if (__ac_isempty(h->flags, x)) { /* not present at all */ \ - h->keys[x] = key; \ - __ac_set_isboth_false(h->flags, x); \ - ++h->size; ++h->n_occupied; \ - *ret = 1; \ - } else if (__ac_isdel(h->flags, x)) { /* deleted */ \ - h->keys[x] = key; \ - __ac_set_isboth_false(h->flags, x); \ - ++h->size; \ - *ret = 2; \ - } else *ret = 0; /* Don't touch h->keys[x] if present and not deleted */ \ - return x; \ - } \ - SCOPE void kh_del_##name(kh_##name##_t *h, khint_t x) \ - { \ - if (x != h->n_buckets && !__ac_iseither(h->flags, x)) { \ - __ac_set_isdel_true(h->flags, x); \ - --h->size; \ - } \ - } - -#define KHASH_DECLARE(name, khkey_t, khval_t) \ - __KHASH_TYPE(name, khkey_t, khval_t) \ - __KHASH_PROTOTYPES(name, khkey_t, khval_t) - -#define KHASH_INIT2(name, SCOPE, khkey_t, khval_t, kh_is_map, __hash_func, __hash_equal) \ - __KHASH_TYPE(name, khkey_t, khval_t) \ - __KHASH_IMPL(name, SCOPE, khkey_t, khval_t, kh_is_map, __hash_func, __hash_equal) - -#define KHASH_INIT(name, khkey_t, khval_t, kh_is_map, __hash_func, __hash_equal) \ - KHASH_INIT2(name, static kh_inline, khkey_t, khval_t, kh_is_map, __hash_func, __hash_equal) - -/* --- BEGIN OF HASH FUNCTIONS --- */ - -/*! @function - @abstract Integer hash function - @param key The integer [khint32_t] - @return The hash value [khint_t] - */ -#define kh_int_hash_func(key) (khint32_t)(key) -/*! @function - @abstract Integer comparison function - */ -#define kh_int_hash_equal(a, b) ((a) == (b)) -/*! @function - @abstract 64-bit integer hash function - @param key The integer [khint64_t] - @return The hash value [khint_t] - */ -#define kh_int64_hash_func(key) (khint32_t)((key)>>33^(key)^(key)<<11) -/*! @function - @abstract 64-bit integer comparison function - */ -#define kh_int64_hash_equal(a, b) ((a) == (b)) -/*! @function - @abstract const char* hash function - @param s Pointer to a null terminated string - @return The hash value - */ -static kh_inline khint_t __ac_X31_hash_string(const char *s) -{ - khint_t h = (khint_t)*s; - if (h) for (++s ; *s; ++s) h = (h << 5) - h + (khint_t)*s; - return h; -} -/*! @function - @abstract Another interface to const char* hash function - @param key Pointer to a null terminated string [const char*] - @return The hash value [khint_t] - */ -#define kh_str_hash_func(key) __ac_X31_hash_string(key) -/*! @function - @abstract Const char* comparison function - */ -#define kh_str_hash_equal(a, b) (strcmp(a, b) == 0) - -static kh_inline khint_t __ac_Wang_hash(khint_t key) -{ - key += ~(key << 15); - key ^= (key >> 10); - key += (key << 3); - key ^= (key >> 6); - key += ~(key << 11); - key ^= (key >> 16); - return key; -} -#define kh_int_hash_func2(k) __ac_Wang_hash((khint_t)key) - -/* --- END OF HASH FUNCTIONS --- */ - -/* Other convenient macros... */ - -/*! - @abstract Type of the hash table. - @param name Name of the hash table [symbol] - */ -#define khash_t(name) kh_##name##_t - -/*! @function - @abstract Initiate a hash table. - @param name Name of the hash table [symbol] - @return Pointer to the hash table [khash_t(name)*] - */ -#define kh_init(name) kh_init_##name() - -/*! @function - @abstract Destroy a hash table. - @param name Name of the hash table [symbol] - @param h Pointer to the hash table [khash_t(name)*] - */ -#define kh_destroy(name, h) kh_destroy_##name(h) - -/*! @function - @abstract Reset a hash table without deallocating memory. - @param name Name of the hash table [symbol] - @param h Pointer to the hash table [khash_t(name)*] - */ -#define kh_clear(name, h) kh_clear_##name(h) - -/*! @function - @abstract Resize a hash table. - @param name Name of the hash table [symbol] - @param h Pointer to the hash table [khash_t(name)*] - @param s New size [khint_t] - */ -#define kh_resize(name, h, s) kh_resize_##name(h, s) - -/*! @function - @abstract Insert a key to the hash table. - @param name Name of the hash table [symbol] - @param h Pointer to the hash table [khash_t(name)*] - @param k Key [type of keys] - @param r Extra return code: -1 if the operation failed; - 0 if the key is present in the hash table; - 1 if the bucket is empty (never used); 2 if the element in - the bucket has been deleted [int*] - @return Iterator to the inserted element [khint_t] - */ -#define kh_put(name, h, k, r) kh_put_##name(h, k, r) - -/*! @function - @abstract Retrieve a key from the hash table. - @param name Name of the hash table [symbol] - @param h Pointer to the hash table [khash_t(name)*] - @param k Key [type of keys] - @return Iterator to the found element, or kh_end(h) if the element is absent [khint_t] - */ -#define kh_get(name, h, k) kh_get_##name(h, k) - -/*! @function - @abstract Remove a key from the hash table. - @param name Name of the hash table [symbol] - @param h Pointer to the hash table [khash_t(name)*] - @param k Iterator to the element to be deleted [khint_t] - */ -#define kh_del(name, h, k) kh_del_##name(h, k) - -/*! @function - @abstract Test whether a bucket contains data. - @param h Pointer to the hash table [khash_t(name)*] - @param x Iterator to the bucket [khint_t] - @return 1 if containing data; 0 otherwise [int] - */ -#define kh_exist(h, x) (!__ac_iseither((h)->flags, (x))) - -/*! @function - @abstract Get key given an iterator - @param h Pointer to the hash table [khash_t(name)*] - @param x Iterator to the bucket [khint_t] - @return Key [type of keys] - */ -#define kh_key(h, x) ((h)->keys[x]) - -/*! @function - @abstract Get value given an iterator - @param h Pointer to the hash table [khash_t(name)*] - @param x Iterator to the bucket [khint_t] - @return Value [type of values] - @discussion For hash sets, calling this results in segfault. - */ -#define kh_val(h, x) ((h)->vals[x]) - -/*! @function - @abstract Alias of kh_val() - */ -#define kh_value(h, x) ((h)->vals[x]) - -/*! @function - @abstract Get the start iterator - @param h Pointer to the hash table [khash_t(name)*] - @return The start iterator [khint_t] - */ -#define kh_begin(h) (khint_t)(0) - -/*! @function - @abstract Get the end iterator - @param h Pointer to the hash table [khash_t(name)*] - @return The end iterator [khint_t] - */ -#define kh_end(h) ((h)->n_buckets) - -/*! @function - @abstract Get the number of elements in the hash table - @param h Pointer to the hash table [khash_t(name)*] - @return Number of elements in the hash table [khint_t] - */ -#define kh_size(h) ((h)->size) - -/*! @function - @abstract Get the number of buckets in the hash table - @param h Pointer to the hash table [khash_t(name)*] - @return Number of buckets in the hash table [khint_t] - */ -#define kh_n_buckets(h) ((h)->n_buckets) - -/*! @function - @abstract Iterate over the entries in the hash table - @param h Pointer to the hash table [khash_t(name)*] - @param kvar Variable to which key will be assigned - @param vvar Variable to which value will be assigned - @param code Block of code to execute - */ -#define kh_foreach(h, kvar, vvar, code) { khint_t __i; \ - for (__i = kh_begin(h); __i != kh_end(h); ++__i) { \ - if (!kh_exist(h,__i)) continue; \ - (kvar) = kh_key(h,__i); \ - (vvar) = kh_val(h,__i); \ - code; \ - } } - -/*! @function - @abstract Iterate over the values in the hash table - @param h Pointer to the hash table [khash_t(name)*] - @param vvar Variable to which value will be assigned - @param code Block of code to execute - */ -#define kh_foreach_value(h, vvar, code) { khint_t __i; \ - for (__i = kh_begin(h); __i != kh_end(h); ++__i) { \ - if (!kh_exist(h,__i)) continue; \ - (vvar) = kh_val(h,__i); \ - code; \ - } } - -/* More conenient interfaces */ - -/*! @function - @abstract Instantiate a hash set containing integer keys - @param name Name of the hash table [symbol] - */ -#define KHASH_SET_INIT_INT(name) \ - KHASH_INIT(name, khint32_t, char, 0, kh_int_hash_func, kh_int_hash_equal) - -/*! @function - @abstract Instantiate a hash map containing integer keys - @param name Name of the hash table [symbol] - @param khval_t Type of values [type] - */ -#define KHASH_MAP_INIT_INT(name, khval_t) \ - KHASH_INIT(name, khint32_t, khval_t, 1, kh_int_hash_func, kh_int_hash_equal) - -/*! @function - @abstract Instantiate a hash map containing 64-bit integer keys - @param name Name of the hash table [symbol] - */ -#define KHASH_SET_INIT_INT64(name) \ - KHASH_INIT(name, khint64_t, char, 0, kh_int64_hash_func, kh_int64_hash_equal) - -/*! @function - @abstract Instantiate a hash map containing 64-bit integer keys - @param name Name of the hash table [symbol] - @param khval_t Type of values [type] - */ -#define KHASH_MAP_INIT_INT64(name, khval_t) \ - KHASH_INIT(name, khint64_t, khval_t, 1, kh_int64_hash_func, kh_int64_hash_equal) - -typedef const char *kh_cstr_t; -/*! @function - @abstract Instantiate a hash map containing const char* keys - @param name Name of the hash table [symbol] - */ -#define KHASH_SET_INIT_STR(name) \ - KHASH_INIT(name, kh_cstr_t, char, 0, kh_str_hash_func, kh_str_hash_equal) - -/*! @function - @abstract Instantiate a hash map containing const char* keys - @param name Name of the hash table [symbol] - @param khval_t Type of values [type] - */ -#define KHASH_MAP_INIT_STR(name, khval_t) \ - KHASH_INIT(name, kh_cstr_t, khval_t, 1, kh_str_hash_func, kh_str_hash_equal) - -#endif /* __AC_KHASH_H */ diff --git a/vendor/libgit2/src/map.h b/vendor/libgit2/src/map.h deleted file mode 100644 index da3d1e19ad..0000000000 --- a/vendor/libgit2/src/map.h +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_map_h__ -#define INCLUDE_map_h__ - -#include "common.h" - - -/* p_mmap() prot values */ -#define GIT_PROT_NONE 0x0 -#define GIT_PROT_READ 0x1 -#define GIT_PROT_WRITE 0x2 -#define GIT_PROT_EXEC 0x4 - -/* git__mmmap() flags values */ -#define GIT_MAP_FILE 0 -#define GIT_MAP_SHARED 1 -#define GIT_MAP_PRIVATE 2 -#define GIT_MAP_TYPE 0xf -#define GIT_MAP_FIXED 0x10 - -#ifdef __amigaos4__ -#define MAP_FAILED 0 -#endif - -typedef struct { /* memory mapped buffer */ - void *data; /* data bytes */ - size_t len; /* data length */ -#ifdef GIT_WIN32 - HANDLE fmh; /* file mapping handle */ -#endif -} git_map; - -#define GIT_MMAP_VALIDATE(out, len, prot, flags) do { \ - assert(out != NULL && len > 0); \ - assert((prot & GIT_PROT_WRITE) || (prot & GIT_PROT_READ)); \ - assert((flags & GIT_MAP_FIXED) == 0); } while (0) - -extern int p_mmap(git_map *out, size_t len, int prot, int flags, int fd, git_off_t offset); -extern int p_munmap(git_map *map); - -#endif /* INCLUDE_map_h__ */ diff --git a/vendor/libgit2/src/merge.c b/vendor/libgit2/src/merge.c deleted file mode 100644 index 863ac8f2d1..0000000000 --- a/vendor/libgit2/src/merge.c +++ /dev/null @@ -1,2752 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#include "common.h" -#include "posix.h" -#include "buffer.h" -#include "repository.h" -#include "revwalk.h" -#include "commit_list.h" -#include "merge.h" -#include "path.h" -#include "refs.h" -#include "object.h" -#include "iterator.h" -#include "refs.h" -#include "diff.h" -#include "checkout.h" -#include "tree.h" -#include "merge_file.h" -#include "blob.h" -#include "oid.h" -#include "index.h" -#include "filebuf.h" -#include "config.h" -#include "oidarray.h" -#include "annotated_commit.h" - -#include "git2/types.h" -#include "git2/repository.h" -#include "git2/object.h" -#include "git2/commit.h" -#include "git2/merge.h" -#include "git2/refs.h" -#include "git2/reset.h" -#include "git2/checkout.h" -#include "git2/signature.h" -#include "git2/config.h" -#include "git2/tree.h" -#include "git2/oidarray.h" -#include "git2/annotated_commit.h" -#include "git2/sys/index.h" -#include "git2/sys/hashsig.h" - -#define GIT_MERGE_INDEX_ENTRY_EXISTS(X) ((X).mode != 0) -#define GIT_MERGE_INDEX_ENTRY_ISFILE(X) S_ISREG((X).mode) - -typedef enum { - TREE_IDX_ANCESTOR = 0, - TREE_IDX_OURS = 1, - TREE_IDX_THEIRS = 2 -} merge_tree_index_t; - -/* Tracks D/F conflicts */ -struct merge_diff_df_data { - const char *df_path; - const char *prev_path; - git_merge_diff *prev_conflict; -}; - -GIT_INLINE(int) merge_diff_detect_binary( - bool *binary_out, - git_repository *repo, - const git_merge_diff *conflict); - - -/* Merge base computation */ - -int merge_bases_many(git_commit_list **out, git_revwalk **walk_out, git_repository *repo, size_t length, const git_oid input_array[]) -{ - git_revwalk *walk = NULL; - git_vector list; - git_commit_list *result = NULL; - git_commit_list_node *commit; - int error = -1; - unsigned int i; - - if (length < 2) { - giterr_set(GITERR_INVALID, "At least two commits are required to find an ancestor. Provided 'length' was %" PRIuZ ".", length); - return -1; - } - - if (git_vector_init(&list, length - 1, NULL) < 0) - return -1; - - if (git_revwalk_new(&walk, repo) < 0) - goto on_error; - - for (i = 1; i < length; i++) { - commit = git_revwalk__commit_lookup(walk, &input_array[i]); - if (commit == NULL) - goto on_error; - - git_vector_insert(&list, commit); - } - - commit = git_revwalk__commit_lookup(walk, &input_array[0]); - if (commit == NULL) - goto on_error; - - if (git_merge__bases_many(&result, walk, commit, &list) < 0) - goto on_error; - - if (!result) { - giterr_set(GITERR_MERGE, "No merge base found"); - error = GIT_ENOTFOUND; - goto on_error; - } - - *out = result; - *walk_out = walk; - - git_vector_free(&list); - return 0; - -on_error: - git_vector_free(&list); - git_revwalk_free(walk); - return error; -} - -int git_merge_base_many(git_oid *out, git_repository *repo, size_t length, const git_oid input_array[]) -{ - git_revwalk *walk; - git_commit_list *result = NULL; - int error = 0; - - assert(out && repo && input_array); - - if ((error = merge_bases_many(&result, &walk, repo, length, input_array)) < 0) - return error; - - git_oid_cpy(out, &result->item->oid); - - git_commit_list_free(&result); - git_revwalk_free(walk); - - return 0; -} - -int git_merge_bases_many(git_oidarray *out, git_repository *repo, size_t length, const git_oid input_array[]) -{ - git_revwalk *walk; - git_commit_list *list, *result = NULL; - int error = 0; - git_array_oid_t array; - - assert(out && repo && input_array); - - if ((error = merge_bases_many(&result, &walk, repo, length, input_array)) < 0) - return error; - - git_array_init(array); - - list = result; - while (list) { - git_oid *id = git_array_alloc(array); - if (id == NULL) { - error = -1; - goto cleanup; - } - - git_oid_cpy(id, &list->item->oid); - list = list->next; - } - - git_oidarray__from_array(out, &array); - -cleanup: - git_commit_list_free(&result); - git_revwalk_free(walk); - - return error; -} - -int git_merge_base_octopus(git_oid *out, git_repository *repo, size_t length, const git_oid input_array[]) -{ - git_oid result; - unsigned int i; - int error = -1; - - assert(out && repo && input_array); - - if (length < 2) { - giterr_set(GITERR_INVALID, "At least two commits are required to find an ancestor. Provided 'length' was %" PRIuZ ".", length); - return -1; - } - - result = input_array[0]; - for (i = 1; i < length; i++) { - error = git_merge_base(&result, repo, &result, &input_array[i]); - if (error < 0) - return error; - } - - *out = result; - - return 0; -} - -static int merge_bases(git_commit_list **out, git_revwalk **walk_out, git_repository *repo, const git_oid *one, const git_oid *two) -{ - git_revwalk *walk; - git_vector list; - git_commit_list *result = NULL; - git_commit_list_node *commit; - void *contents[1]; - - if (git_revwalk_new(&walk, repo) < 0) - return -1; - - commit = git_revwalk__commit_lookup(walk, two); - if (commit == NULL) - goto on_error; - - /* This is just one value, so we can do it on the stack */ - memset(&list, 0x0, sizeof(git_vector)); - contents[0] = commit; - list.length = 1; - list.contents = contents; - - commit = git_revwalk__commit_lookup(walk, one); - if (commit == NULL) - goto on_error; - - if (git_merge__bases_many(&result, walk, commit, &list) < 0) - goto on_error; - - if (!result) { - git_revwalk_free(walk); - giterr_set(GITERR_MERGE, "No merge base found"); - return GIT_ENOTFOUND; - } - - *out = result; - *walk_out = walk; - - return 0; - -on_error: - git_revwalk_free(walk); - return -1; - -} - -int git_merge_base(git_oid *out, git_repository *repo, const git_oid *one, const git_oid *two) -{ - int error; - git_revwalk *walk; - git_commit_list *result; - - if ((error = merge_bases(&result, &walk, repo, one, two)) < 0) - return error; - - git_oid_cpy(out, &result->item->oid); - git_commit_list_free(&result); - git_revwalk_free(walk); - - return 0; -} - -int git_merge_bases(git_oidarray *out, git_repository *repo, const git_oid *one, const git_oid *two) -{ - int error; - git_revwalk *walk; - git_commit_list *result, *list; - git_array_oid_t array; - - git_array_init(array); - - if ((error = merge_bases(&result, &walk, repo, one, two)) < 0) - return error; - - list = result; - while (list) { - git_oid *id = git_array_alloc(array); - if (id == NULL) - goto on_error; - - git_oid_cpy(id, &list->item->oid); - list = list->next; - } - - git_oidarray__from_array(out, &array); - git_commit_list_free(&result); - git_revwalk_free(walk); - - return 0; - -on_error: - git_commit_list_free(&result); - git_revwalk_free(walk); - return -1; -} - -static int interesting(git_pqueue *list) -{ - size_t i; - - for (i = 0; i < git_pqueue_size(list); i++) { - git_commit_list_node *commit = git_pqueue_get(list, i); - if ((commit->flags & STALE) == 0) - return 1; - } - - return 0; -} - -int git_merge__bases_many(git_commit_list **out, git_revwalk *walk, git_commit_list_node *one, git_vector *twos) -{ - int error; - unsigned int i; - git_commit_list_node *two; - git_commit_list *result = NULL, *tmp = NULL; - git_pqueue list; - - /* If there's only the one commit, there can be no merge bases */ - if (twos->length == 0) { - *out = NULL; - return 0; - } - - /* if the commit is repeated, we have a our merge base already */ - git_vector_foreach(twos, i, two) { - if (one == two) - return git_commit_list_insert(one, out) ? 0 : -1; - } - - if (git_pqueue_init(&list, 0, twos->length * 2, git_commit_list_time_cmp) < 0) - return -1; - - if (git_commit_list_parse(walk, one) < 0) - return -1; - - one->flags |= PARENT1; - if (git_pqueue_insert(&list, one) < 0) - return -1; - - git_vector_foreach(twos, i, two) { - if (git_commit_list_parse(walk, two) < 0) - return -1; - - two->flags |= PARENT2; - - if (git_pqueue_insert(&list, two) < 0) - return -1; - } - - /* as long as there are non-STALE commits */ - while (interesting(&list)) { - git_commit_list_node *commit = git_pqueue_pop(&list); - int flags; - - if (commit == NULL) - break; - - flags = commit->flags & (PARENT1 | PARENT2 | STALE); - if (flags == (PARENT1 | PARENT2)) { - if (!(commit->flags & RESULT)) { - commit->flags |= RESULT; - if (git_commit_list_insert(commit, &result) == NULL) - return -1; - } - /* we mark the parents of a merge stale */ - flags |= STALE; - } - - for (i = 0; i < commit->out_degree; i++) { - git_commit_list_node *p = commit->parents[i]; - if ((p->flags & flags) == flags) - continue; - - if ((error = git_commit_list_parse(walk, p)) < 0) - return error; - - p->flags |= flags; - if (git_pqueue_insert(&list, p) < 0) - return -1; - } - } - - git_pqueue_free(&list); - - /* filter out any stale commits in the results */ - tmp = result; - result = NULL; - - while (tmp) { - struct git_commit_list *next = tmp->next; - if (!(tmp->item->flags & STALE)) - if (git_commit_list_insert_by_date(tmp->item, &result) == NULL) - return -1; - - git__free(tmp); - tmp = next; - } - - *out = result; - return 0; -} - -int git_repository_mergehead_foreach( - git_repository *repo, - git_repository_mergehead_foreach_cb cb, - void *payload) -{ - git_buf merge_head_path = GIT_BUF_INIT, merge_head_file = GIT_BUF_INIT; - char *buffer, *line; - size_t line_num = 1; - git_oid oid; - int error = 0; - - assert(repo && cb); - - if ((error = git_buf_joinpath(&merge_head_path, repo->path_repository, - GIT_MERGE_HEAD_FILE)) < 0) - return error; - - if ((error = git_futils_readbuffer(&merge_head_file, - git_buf_cstr(&merge_head_path))) < 0) - goto cleanup; - - buffer = merge_head_file.ptr; - - while ((line = git__strsep(&buffer, "\n")) != NULL) { - if (strlen(line) != GIT_OID_HEXSZ) { - giterr_set(GITERR_INVALID, "Unable to parse OID - invalid length"); - error = -1; - goto cleanup; - } - - if ((error = git_oid_fromstr(&oid, line)) < 0) - goto cleanup; - - if ((error = cb(&oid, payload)) != 0) { - giterr_set_after_callback(error); - goto cleanup; - } - - ++line_num; - } - - if (*buffer) { - giterr_set(GITERR_MERGE, "No EOL at line %d", line_num); - error = -1; - goto cleanup; - } - -cleanup: - git_buf_free(&merge_head_path); - git_buf_free(&merge_head_file); - - return error; -} - -GIT_INLINE(int) index_entry_cmp(const git_index_entry *a, const git_index_entry *b) -{ - int value = 0; - - if (a->path == NULL) - return (b->path == NULL) ? 0 : 1; - - if ((value = a->mode - b->mode) == 0 && - (value = git_oid__cmp(&a->id, &b->id)) == 0) - value = strcmp(a->path, b->path); - - return value; -} - -/* Conflict resolution */ - -static int merge_conflict_resolve_trivial( - int *resolved, - git_merge_diff_list *diff_list, - const git_merge_diff *conflict) -{ - int ours_empty, theirs_empty; - int ours_changed, theirs_changed, ours_theirs_differ; - git_index_entry const *result = NULL; - int error = 0; - - assert(resolved && diff_list && conflict); - - *resolved = 0; - - if (conflict->type == GIT_MERGE_DIFF_DIRECTORY_FILE || - conflict->type == GIT_MERGE_DIFF_RENAMED_ADDED) - return 0; - - if (conflict->our_status == GIT_DELTA_RENAMED || - conflict->their_status == GIT_DELTA_RENAMED) - return 0; - - ours_empty = !GIT_MERGE_INDEX_ENTRY_EXISTS(conflict->our_entry); - theirs_empty = !GIT_MERGE_INDEX_ENTRY_EXISTS(conflict->their_entry); - - ours_changed = (conflict->our_status != GIT_DELTA_UNMODIFIED); - theirs_changed = (conflict->their_status != GIT_DELTA_UNMODIFIED); - ours_theirs_differ = ours_changed && theirs_changed && - index_entry_cmp(&conflict->our_entry, &conflict->their_entry); - - /* - * Note: with only one ancestor, some cases are not distinct: - * - * 16: ancest:anc1/anc2, head:anc1, remote:anc2 = result:no merge - * 3: ancest:(empty)^, head:head, remote:(empty) = result:no merge - * 2: ancest:(empty)^, head:(empty), remote:remote = result:no merge - * - * Note that the two cases that take D/F conflicts into account - * specifically do not need to be explicitly tested, as D/F conflicts - * would fail the *empty* test: - * - * 3ALT: ancest:(empty)+, head:head, remote:*empty* = result:head - * 2ALT: ancest:(empty)+, head:*empty*, remote:remote = result:remote - * - * Note that many of these cases need not be explicitly tested, as - * they simply degrade to "all different" cases (eg, 11): - * - * 4: ancest:(empty)^, head:head, remote:remote = result:no merge - * 7: ancest:ancest+, head:(empty), remote:remote = result:no merge - * 9: ancest:ancest+, head:head, remote:(empty) = result:no merge - * 11: ancest:ancest+, head:head, remote:remote = result:no merge - */ - - /* 5ALT: ancest:*, head:head, remote:head = result:head */ - if (ours_changed && !ours_empty && !ours_theirs_differ) - result = &conflict->our_entry; - /* 6: ancest:ancest+, head:(empty), remote:(empty) = result:no merge */ - else if (ours_changed && ours_empty && theirs_empty) - *resolved = 0; - /* 8: ancest:ancest^, head:(empty), remote:ancest = result:no merge */ - else if (ours_empty && !theirs_changed) - *resolved = 0; - /* 10: ancest:ancest^, head:ancest, remote:(empty) = result:no merge */ - else if (!ours_changed && theirs_empty) - *resolved = 0; - /* 13: ancest:ancest+, head:head, remote:ancest = result:head */ - else if (ours_changed && !theirs_changed) - result = &conflict->our_entry; - /* 14: ancest:ancest+, head:ancest, remote:remote = result:remote */ - else if (!ours_changed && theirs_changed) - result = &conflict->their_entry; - else - *resolved = 0; - - if (result != NULL && - GIT_MERGE_INDEX_ENTRY_EXISTS(*result) && - (error = git_vector_insert(&diff_list->staged, (void *)result)) >= 0) - *resolved = 1; - - /* Note: trivial resolution does not update the REUC. */ - - return error; -} - -static int merge_conflict_resolve_one_removed( - int *resolved, - git_merge_diff_list *diff_list, - const git_merge_diff *conflict) -{ - int ours_empty, theirs_empty; - int ours_changed, theirs_changed; - int error = 0; - - assert(resolved && diff_list && conflict); - - *resolved = 0; - - if (conflict->type == GIT_MERGE_DIFF_DIRECTORY_FILE || - conflict->type == GIT_MERGE_DIFF_RENAMED_ADDED) - return 0; - - ours_empty = !GIT_MERGE_INDEX_ENTRY_EXISTS(conflict->our_entry); - theirs_empty = !GIT_MERGE_INDEX_ENTRY_EXISTS(conflict->their_entry); - - ours_changed = (conflict->our_status != GIT_DELTA_UNMODIFIED); - theirs_changed = (conflict->their_status != GIT_DELTA_UNMODIFIED); - - /* Removed in both */ - if (ours_changed && ours_empty && theirs_empty) - *resolved = 1; - /* Removed in ours */ - else if (ours_empty && !theirs_changed) - *resolved = 1; - /* Removed in theirs */ - else if (!ours_changed && theirs_empty) - *resolved = 1; - - if (*resolved) - git_vector_insert(&diff_list->resolved, (git_merge_diff *)conflict); - - return error; -} - -static int merge_conflict_resolve_one_renamed( - int *resolved, - git_merge_diff_list *diff_list, - const git_merge_diff *conflict) -{ - int ours_renamed, theirs_renamed; - int ours_changed, theirs_changed; - git_index_entry *merged; - int error = 0; - - assert(resolved && diff_list && conflict); - - *resolved = 0; - - if (!GIT_MERGE_INDEX_ENTRY_EXISTS(conflict->our_entry) || - !GIT_MERGE_INDEX_ENTRY_EXISTS(conflict->their_entry)) - return 0; - - ours_renamed = (conflict->our_status == GIT_DELTA_RENAMED); - theirs_renamed = (conflict->their_status == GIT_DELTA_RENAMED); - - if (!ours_renamed && !theirs_renamed) - return 0; - - /* Reject one file in a 2->1 conflict */ - if (conflict->type == GIT_MERGE_DIFF_BOTH_RENAMED_2_TO_1 || - conflict->type == GIT_MERGE_DIFF_BOTH_RENAMED_1_TO_2 || - conflict->type == GIT_MERGE_DIFF_RENAMED_ADDED) - return 0; - - ours_changed = (git_oid__cmp(&conflict->ancestor_entry.id, &conflict->our_entry.id) != 0); - theirs_changed = (git_oid__cmp(&conflict->ancestor_entry.id, &conflict->their_entry.id) != 0); - - /* if both are modified (and not to a common target) require a merge */ - if (ours_changed && theirs_changed && - git_oid__cmp(&conflict->our_entry.id, &conflict->their_entry.id) != 0) - return 0; - - if ((merged = git_pool_malloc(&diff_list->pool, sizeof(git_index_entry))) == NULL) - return -1; - - if (ours_changed) - memcpy(merged, &conflict->our_entry, sizeof(git_index_entry)); - else - memcpy(merged, &conflict->their_entry, sizeof(git_index_entry)); - - if (ours_renamed) - merged->path = conflict->our_entry.path; - else - merged->path = conflict->their_entry.path; - - *resolved = 1; - - git_vector_insert(&diff_list->staged, merged); - git_vector_insert(&diff_list->resolved, (git_merge_diff *)conflict); - - return error; -} - -static int merge_conflict_resolve_automerge( - int *resolved, - git_merge_diff_list *diff_list, - const git_merge_diff *conflict, - unsigned int merge_file_favor, - unsigned int file_flags) -{ - const git_index_entry *ancestor = NULL, *ours = NULL, *theirs = NULL; - git_merge_file_options opts = GIT_MERGE_FILE_OPTIONS_INIT; - git_merge_file_result result = {0}; - git_index_entry *index_entry; - git_odb *odb = NULL; - git_oid automerge_oid; - int error = 0; - bool binary = false; - - assert(resolved && diff_list && conflict); - - *resolved = 0; - - if (!GIT_MERGE_INDEX_ENTRY_EXISTS(conflict->our_entry) || - !GIT_MERGE_INDEX_ENTRY_EXISTS(conflict->their_entry)) - return 0; - - /* Reject D/F conflicts */ - if (conflict->type == GIT_MERGE_DIFF_DIRECTORY_FILE) - return 0; - - /* Reject submodules. */ - if (S_ISGITLINK(conflict->ancestor_entry.mode) || - S_ISGITLINK(conflict->our_entry.mode) || - S_ISGITLINK(conflict->their_entry.mode)) - return 0; - - /* Reject link/file conflicts. */ - if ((S_ISLNK(conflict->ancestor_entry.mode) ^ S_ISLNK(conflict->our_entry.mode)) || - (S_ISLNK(conflict->ancestor_entry.mode) ^ S_ISLNK(conflict->their_entry.mode))) - return 0; - - /* Reject name conflicts */ - if (conflict->type == GIT_MERGE_DIFF_BOTH_RENAMED_2_TO_1 || - conflict->type == GIT_MERGE_DIFF_RENAMED_ADDED) - return 0; - - if ((conflict->our_status & GIT_DELTA_RENAMED) == GIT_DELTA_RENAMED && - (conflict->their_status & GIT_DELTA_RENAMED) == GIT_DELTA_RENAMED && - strcmp(conflict->ancestor_entry.path, conflict->their_entry.path) != 0) - return 0; - - /* Reject binary conflicts */ - if ((error = merge_diff_detect_binary(&binary, diff_list->repo, conflict)) < 0) - return error; - if (binary) - return 0; - - ancestor = GIT_MERGE_INDEX_ENTRY_EXISTS(conflict->ancestor_entry) ? - &conflict->ancestor_entry : NULL; - ours = GIT_MERGE_INDEX_ENTRY_EXISTS(conflict->our_entry) ? - &conflict->our_entry : NULL; - theirs = GIT_MERGE_INDEX_ENTRY_EXISTS(conflict->their_entry) ? - &conflict->their_entry : NULL; - - opts.favor = merge_file_favor; - opts.flags = file_flags; - - if ((error = git_repository_odb(&odb, diff_list->repo)) < 0 || - (error = git_merge_file_from_index(&result, diff_list->repo, ancestor, ours, theirs, &opts)) < 0 || - !result.automergeable || - (error = git_odb_write(&automerge_oid, odb, result.ptr, result.len, GIT_OBJ_BLOB)) < 0) - goto done; - - if ((index_entry = git_pool_malloc(&diff_list->pool, sizeof(git_index_entry))) == NULL) - GITERR_CHECK_ALLOC(index_entry); - - index_entry->path = git_pool_strdup(&diff_list->pool, result.path); - GITERR_CHECK_ALLOC(index_entry->path); - - index_entry->file_size = result.len; - index_entry->mode = result.mode; - git_oid_cpy(&index_entry->id, &automerge_oid); - - git_vector_insert(&diff_list->staged, index_entry); - git_vector_insert(&diff_list->resolved, (git_merge_diff *)conflict); - - *resolved = 1; - -done: - git_merge_file_result_free(&result); - git_odb_free(odb); - - return error; -} - -static int merge_conflict_resolve( - int *out, - git_merge_diff_list *diff_list, - const git_merge_diff *conflict, - unsigned int merge_file_favor, - unsigned int file_flags) -{ - int resolved = 0; - int error = 0; - - *out = 0; - - if ((error = merge_conflict_resolve_trivial(&resolved, diff_list, conflict)) < 0) - goto done; - - if (!resolved && (error = merge_conflict_resolve_one_removed(&resolved, diff_list, conflict)) < 0) - goto done; - - if (!resolved && (error = merge_conflict_resolve_one_renamed(&resolved, diff_list, conflict)) < 0) - goto done; - - if (!resolved && (error = merge_conflict_resolve_automerge(&resolved, diff_list, conflict, - merge_file_favor, file_flags)) < 0) - goto done; - - *out = resolved; - -done: - return error; -} - -/* Rename detection and coalescing */ - -struct merge_diff_similarity { - unsigned char similarity; - size_t other_idx; -}; - -static int index_entry_similarity_exact( - git_repository *repo, - git_index_entry *a, - size_t a_idx, - git_index_entry *b, - size_t b_idx, - void **cache, - const git_merge_options *opts) -{ - GIT_UNUSED(repo); - GIT_UNUSED(a_idx); - GIT_UNUSED(b_idx); - GIT_UNUSED(cache); - GIT_UNUSED(opts); - - if (git_oid__cmp(&a->id, &b->id) == 0) - return 100; - - return 0; -} - -static int index_entry_similarity_calc( - void **out, - git_repository *repo, - git_index_entry *entry, - const git_merge_options *opts) -{ - git_blob *blob; - git_diff_file diff_file = {{{0}}}; - git_off_t blobsize; - int error; - - *out = NULL; - - if ((error = git_blob_lookup(&blob, repo, &entry->id)) < 0) - return error; - - git_oid_cpy(&diff_file.id, &entry->id); - diff_file.path = entry->path; - diff_file.size = entry->file_size; - diff_file.mode = entry->mode; - diff_file.flags = 0; - - blobsize = git_blob_rawsize(blob); - - /* file too big for rename processing */ - if (!git__is_sizet(blobsize)) - return 0; - - error = opts->metric->buffer_signature(out, &diff_file, - git_blob_rawcontent(blob), (size_t)blobsize, - opts->metric->payload); - - git_blob_free(blob); - - return error; -} - -static int index_entry_similarity_inexact( - git_repository *repo, - git_index_entry *a, - size_t a_idx, - git_index_entry *b, - size_t b_idx, - void **cache, - const git_merge_options *opts) -{ - int score = 0; - int error = 0; - - if (GIT_MODE_TYPE(a->mode) != GIT_MODE_TYPE(b->mode)) - return 0; - - /* update signature cache if needed */ - if (!cache[a_idx] && (error = index_entry_similarity_calc(&cache[a_idx], repo, a, opts)) < 0) - return error; - if (!cache[b_idx] && (error = index_entry_similarity_calc(&cache[b_idx], repo, b, opts)) < 0) - return error; - - /* some metrics may not wish to process this file (too big / too small) */ - if (!cache[a_idx] || !cache[b_idx]) - return 0; - - /* compare signatures */ - if (opts->metric->similarity( - &score, cache[a_idx], cache[b_idx], opts->metric->payload) < 0) - return -1; - - /* clip score */ - if (score < 0) - score = 0; - else if (score > 100) - score = 100; - - return score; -} - -static int merge_diff_mark_similarity( - git_repository *repo, - git_merge_diff_list *diff_list, - struct merge_diff_similarity *similarity_ours, - struct merge_diff_similarity *similarity_theirs, - int (*similarity_fn)(git_repository *, git_index_entry *, size_t, git_index_entry *, size_t, void **, const git_merge_options *), - void **cache, - const git_merge_options *opts) -{ - size_t i, j; - git_merge_diff *conflict_src, *conflict_tgt; - int similarity; - - git_vector_foreach(&diff_list->conflicts, i, conflict_src) { - /* Items can be the source of a rename iff they have an item in the - * ancestor slot and lack an item in the ours or theirs slot. */ - if (!GIT_MERGE_INDEX_ENTRY_EXISTS(conflict_src->ancestor_entry) || - (GIT_MERGE_INDEX_ENTRY_EXISTS(conflict_src->our_entry) && - GIT_MERGE_INDEX_ENTRY_EXISTS(conflict_src->their_entry))) - continue; - - git_vector_foreach(&diff_list->conflicts, j, conflict_tgt) { - size_t our_idx = diff_list->conflicts.length + j; - size_t their_idx = (diff_list->conflicts.length * 2) + j; - - if (GIT_MERGE_INDEX_ENTRY_EXISTS(conflict_tgt->ancestor_entry)) - continue; - - if (GIT_MERGE_INDEX_ENTRY_EXISTS(conflict_tgt->our_entry) && - !GIT_MERGE_INDEX_ENTRY_EXISTS(conflict_src->our_entry)) { - similarity = similarity_fn(repo, &conflict_src->ancestor_entry, i, &conflict_tgt->our_entry, our_idx, cache, opts); - - if (similarity == GIT_EBUFS) - continue; - else if (similarity < 0) - return similarity; - - if (similarity > similarity_ours[i].similarity && - similarity > similarity_ours[j].similarity) { - /* Clear previous best similarity */ - if (similarity_ours[i].similarity > 0) - similarity_ours[similarity_ours[i].other_idx].similarity = 0; - - if (similarity_ours[j].similarity > 0) - similarity_ours[similarity_ours[j].other_idx].similarity = 0; - - similarity_ours[i].similarity = similarity; - similarity_ours[i].other_idx = j; - - similarity_ours[j].similarity = similarity; - similarity_ours[j].other_idx = i; - } - } - - if (GIT_MERGE_INDEX_ENTRY_EXISTS(conflict_tgt->their_entry) && - !GIT_MERGE_INDEX_ENTRY_EXISTS(conflict_src->their_entry)) { - similarity = similarity_fn(repo, &conflict_src->ancestor_entry, i, &conflict_tgt->their_entry, their_idx, cache, opts); - - if (similarity > similarity_theirs[i].similarity && - similarity > similarity_theirs[j].similarity) { - /* Clear previous best similarity */ - if (similarity_theirs[i].similarity > 0) - similarity_theirs[similarity_theirs[i].other_idx].similarity = 0; - - if (similarity_theirs[j].similarity > 0) - similarity_theirs[similarity_theirs[j].other_idx].similarity = 0; - - similarity_theirs[i].similarity = similarity; - similarity_theirs[i].other_idx = j; - - similarity_theirs[j].similarity = similarity; - similarity_theirs[j].other_idx = i; - } - } - } - } - - return 0; -} - -/* - * Rename conflicts: - * - * Ancestor Ours Theirs - * - * 0a A A A No rename - * b A A* A No rename (ours was rewritten) - * c A A A* No rename (theirs rewritten) - * 1a A A B[A] Rename or rename/edit - * b A B[A] A (automergeable) - * 2 A B[A] B[A] Both renamed (automergeable) - * 3a A B[A] Rename/delete - * b A B[A] (same) - * 4a A B[A] B Rename/add [B~ours B~theirs] - * b A B B[A] (same) - * 5 A B[A] C[A] Both renamed ("1 -> 2") - * 6 A C[A] Both renamed ("2 -> 1") - * B C[B] [C~ours C~theirs] (automergeable) - */ -static void merge_diff_mark_rename_conflict( - git_merge_diff_list *diff_list, - struct merge_diff_similarity *similarity_ours, - bool ours_renamed, - size_t ours_source_idx, - struct merge_diff_similarity *similarity_theirs, - bool theirs_renamed, - size_t theirs_source_idx, - git_merge_diff *target, - const git_merge_options *opts) -{ - git_merge_diff *ours_source = NULL, *theirs_source = NULL; - - if (ours_renamed) - ours_source = diff_list->conflicts.contents[ours_source_idx]; - - if (theirs_renamed) - theirs_source = diff_list->conflicts.contents[theirs_source_idx]; - - /* Detect 2->1 conflicts */ - if (ours_renamed && theirs_renamed) { - /* Both renamed to the same target name. */ - if (ours_source_idx == theirs_source_idx) - ours_source->type = GIT_MERGE_DIFF_BOTH_RENAMED; - else { - ours_source->type = GIT_MERGE_DIFF_BOTH_RENAMED_2_TO_1; - theirs_source->type = GIT_MERGE_DIFF_BOTH_RENAMED_2_TO_1; - } - } else if (ours_renamed) { - /* If our source was also renamed in theirs, this is a 1->2 */ - if (similarity_theirs[ours_source_idx].similarity >= opts->rename_threshold) - ours_source->type = GIT_MERGE_DIFF_BOTH_RENAMED_1_TO_2; - - else if (GIT_MERGE_INDEX_ENTRY_EXISTS(target->their_entry)) { - ours_source->type = GIT_MERGE_DIFF_RENAMED_ADDED; - target->type = GIT_MERGE_DIFF_RENAMED_ADDED; - } - - else if (!GIT_MERGE_INDEX_ENTRY_EXISTS(ours_source->their_entry)) - ours_source->type = GIT_MERGE_DIFF_RENAMED_DELETED; - - else if (ours_source->type == GIT_MERGE_DIFF_MODIFIED_DELETED) - ours_source->type = GIT_MERGE_DIFF_RENAMED_MODIFIED; - } else if (theirs_renamed) { - /* If their source was also renamed in ours, this is a 1->2 */ - if (similarity_ours[theirs_source_idx].similarity >= opts->rename_threshold) - theirs_source->type = GIT_MERGE_DIFF_BOTH_RENAMED_1_TO_2; - - else if (GIT_MERGE_INDEX_ENTRY_EXISTS(target->our_entry)) { - theirs_source->type = GIT_MERGE_DIFF_RENAMED_ADDED; - target->type = GIT_MERGE_DIFF_RENAMED_ADDED; - } - - else if (!GIT_MERGE_INDEX_ENTRY_EXISTS(theirs_source->our_entry)) - theirs_source->type = GIT_MERGE_DIFF_RENAMED_DELETED; - - else if (theirs_source->type == GIT_MERGE_DIFF_MODIFIED_DELETED) - theirs_source->type = GIT_MERGE_DIFF_RENAMED_MODIFIED; - } -} - -GIT_INLINE(void) merge_diff_coalesce_rename( - git_index_entry *source_entry, - git_delta_t *source_status, - git_index_entry *target_entry, - git_delta_t *target_status) -{ - /* Coalesce the rename target into the rename source. */ - memcpy(source_entry, target_entry, sizeof(git_index_entry)); - *source_status = GIT_DELTA_RENAMED; - - memset(target_entry, 0x0, sizeof(git_index_entry)); - *target_status = GIT_DELTA_UNMODIFIED; -} - -static void merge_diff_list_coalesce_renames( - git_merge_diff_list *diff_list, - struct merge_diff_similarity *similarity_ours, - struct merge_diff_similarity *similarity_theirs, - const git_merge_options *opts) -{ - size_t i; - bool ours_renamed = 0, theirs_renamed = 0; - size_t ours_source_idx = 0, theirs_source_idx = 0; - git_merge_diff *ours_source, *theirs_source, *target; - - for (i = 0; i < diff_list->conflicts.length; i++) { - target = diff_list->conflicts.contents[i]; - - ours_renamed = 0; - theirs_renamed = 0; - - if (GIT_MERGE_INDEX_ENTRY_EXISTS(target->our_entry) && - similarity_ours[i].similarity >= opts->rename_threshold) { - ours_source_idx = similarity_ours[i].other_idx; - - ours_source = diff_list->conflicts.contents[ours_source_idx]; - - merge_diff_coalesce_rename( - &ours_source->our_entry, - &ours_source->our_status, - &target->our_entry, - &target->our_status); - - similarity_ours[ours_source_idx].similarity = 0; - similarity_ours[i].similarity = 0; - - ours_renamed = 1; - } - - /* insufficient to determine direction */ - if (GIT_MERGE_INDEX_ENTRY_EXISTS(target->their_entry) && - similarity_theirs[i].similarity >= opts->rename_threshold) { - theirs_source_idx = similarity_theirs[i].other_idx; - - theirs_source = diff_list->conflicts.contents[theirs_source_idx]; - - merge_diff_coalesce_rename( - &theirs_source->their_entry, - &theirs_source->their_status, - &target->their_entry, - &target->their_status); - - similarity_theirs[theirs_source_idx].similarity = 0; - similarity_theirs[i].similarity = 0; - - theirs_renamed = 1; - } - - merge_diff_mark_rename_conflict(diff_list, - similarity_ours, ours_renamed, ours_source_idx, - similarity_theirs, theirs_renamed, theirs_source_idx, - target, opts); - } -} - -static int merge_diff_empty(const git_vector *conflicts, size_t idx, void *p) -{ - git_merge_diff *conflict = conflicts->contents[idx]; - - GIT_UNUSED(p); - - return (!GIT_MERGE_INDEX_ENTRY_EXISTS(conflict->ancestor_entry) && - !GIT_MERGE_INDEX_ENTRY_EXISTS(conflict->our_entry) && - !GIT_MERGE_INDEX_ENTRY_EXISTS(conflict->their_entry)); -} - -static void merge_diff_list_count_candidates( - git_merge_diff_list *diff_list, - size_t *src_count, - size_t *tgt_count) -{ - git_merge_diff *entry; - size_t i; - - *src_count = 0; - *tgt_count = 0; - - git_vector_foreach(&diff_list->conflicts, i, entry) { - if (GIT_MERGE_INDEX_ENTRY_EXISTS(entry->ancestor_entry) && - (!GIT_MERGE_INDEX_ENTRY_EXISTS(entry->our_entry) || - !GIT_MERGE_INDEX_ENTRY_EXISTS(entry->their_entry))) - (*src_count)++; - else if (!GIT_MERGE_INDEX_ENTRY_EXISTS(entry->ancestor_entry)) - (*tgt_count)++; - } -} - -int git_merge_diff_list__find_renames( - git_repository *repo, - git_merge_diff_list *diff_list, - const git_merge_options *opts) -{ - struct merge_diff_similarity *similarity_ours, *similarity_theirs; - void **cache = NULL; - size_t cache_size = 0; - size_t src_count, tgt_count, i; - int error = 0; - - assert(diff_list && opts); - - if ((opts->tree_flags & GIT_MERGE_TREE_FIND_RENAMES) == 0) - return 0; - - similarity_ours = git__calloc(diff_list->conflicts.length, - sizeof(struct merge_diff_similarity)); - GITERR_CHECK_ALLOC(similarity_ours); - - similarity_theirs = git__calloc(diff_list->conflicts.length, - sizeof(struct merge_diff_similarity)); - GITERR_CHECK_ALLOC(similarity_theirs); - - /* Calculate similarity between items that were deleted from the ancestor - * and added in the other branch. - */ - if ((error = merge_diff_mark_similarity(repo, diff_list, similarity_ours, - similarity_theirs, index_entry_similarity_exact, NULL, opts)) < 0) - goto done; - - if (diff_list->conflicts.length <= opts->target_limit) { - GITERR_CHECK_ALLOC_MULTIPLY(&cache_size, diff_list->conflicts.length, 3); - cache = git__calloc(cache_size, sizeof(void *)); - GITERR_CHECK_ALLOC(cache); - - merge_diff_list_count_candidates(diff_list, &src_count, &tgt_count); - - if (src_count > opts->target_limit || tgt_count > opts->target_limit) { - /* TODO: report! */ - } else { - if ((error = merge_diff_mark_similarity( - repo, diff_list, similarity_ours, similarity_theirs, - index_entry_similarity_inexact, cache, opts)) < 0) - goto done; - } - } - - /* For entries that are appropriately similar, merge the new name's entry - * into the old name. - */ - merge_diff_list_coalesce_renames(diff_list, similarity_ours, similarity_theirs, opts); - - /* And remove any entries that were merged and are now empty. */ - git_vector_remove_matching(&diff_list->conflicts, merge_diff_empty, NULL); - -done: - if (cache != NULL) { - for (i = 0; i < cache_size; ++i) { - if (cache[i] != NULL) - opts->metric->free_signature(cache[i], opts->metric->payload); - } - - git__free(cache); - } - - git__free(similarity_ours); - git__free(similarity_theirs); - - return error; -} - -/* Directory/file conflict handling */ - -GIT_INLINE(const char *) merge_diff_path( - const git_merge_diff *conflict) -{ - if (GIT_MERGE_INDEX_ENTRY_EXISTS(conflict->ancestor_entry)) - return conflict->ancestor_entry.path; - else if (GIT_MERGE_INDEX_ENTRY_EXISTS(conflict->our_entry)) - return conflict->our_entry.path; - else if (GIT_MERGE_INDEX_ENTRY_EXISTS(conflict->their_entry)) - return conflict->their_entry.path; - - return NULL; -} - -GIT_INLINE(bool) merge_diff_any_side_added_or_modified( - const git_merge_diff *conflict) -{ - if (conflict->our_status == GIT_DELTA_ADDED || - conflict->our_status == GIT_DELTA_MODIFIED || - conflict->their_status == GIT_DELTA_ADDED || - conflict->their_status == GIT_DELTA_MODIFIED) - return true; - - return false; -} - -GIT_INLINE(bool) path_is_prefixed(const char *parent, const char *child) -{ - size_t child_len = strlen(child); - size_t parent_len = strlen(parent); - - if (child_len < parent_len || - strncmp(parent, child, parent_len) != 0) - return 0; - - return (child[parent_len] == '/'); -} - -GIT_INLINE(int) merge_diff_detect_df_conflict( - struct merge_diff_df_data *df_data, - git_merge_diff *conflict) -{ - const char *cur_path = merge_diff_path(conflict); - - /* Determine if this is a D/F conflict or the child of one */ - if (df_data->df_path && - path_is_prefixed(df_data->df_path, cur_path)) - conflict->type = GIT_MERGE_DIFF_DF_CHILD; - else if(df_data->df_path) - df_data->df_path = NULL; - else if (df_data->prev_path && - merge_diff_any_side_added_or_modified(df_data->prev_conflict) && - merge_diff_any_side_added_or_modified(conflict) && - path_is_prefixed(df_data->prev_path, cur_path)) { - conflict->type = GIT_MERGE_DIFF_DF_CHILD; - - df_data->prev_conflict->type = GIT_MERGE_DIFF_DIRECTORY_FILE; - df_data->df_path = df_data->prev_path; - } - - df_data->prev_path = cur_path; - df_data->prev_conflict = conflict; - - return 0; -} - -/* Conflict handling */ - -GIT_INLINE(int) merge_diff_detect_type( - git_merge_diff *conflict) -{ - if (conflict->our_status == GIT_DELTA_ADDED && - conflict->their_status == GIT_DELTA_ADDED) - conflict->type = GIT_MERGE_DIFF_BOTH_ADDED; - else if (conflict->our_status == GIT_DELTA_MODIFIED && - conflict->their_status == GIT_DELTA_MODIFIED) - conflict->type = GIT_MERGE_DIFF_BOTH_MODIFIED; - else if (conflict->our_status == GIT_DELTA_DELETED && - conflict->their_status == GIT_DELTA_DELETED) - conflict->type = GIT_MERGE_DIFF_BOTH_DELETED; - else if (conflict->our_status == GIT_DELTA_MODIFIED && - conflict->their_status == GIT_DELTA_DELETED) - conflict->type = GIT_MERGE_DIFF_MODIFIED_DELETED; - else if (conflict->our_status == GIT_DELTA_DELETED && - conflict->their_status == GIT_DELTA_MODIFIED) - conflict->type = GIT_MERGE_DIFF_MODIFIED_DELETED; - else - conflict->type = GIT_MERGE_DIFF_NONE; - - return 0; -} - -GIT_INLINE(int) merge_diff_detect_binary( - bool *binary_out, - git_repository *repo, - const git_merge_diff *conflict) -{ - git_blob *ancestor_blob = NULL, *our_blob = NULL, *their_blob = NULL; - int error = 0; - bool binary = false; - - if (GIT_MERGE_INDEX_ENTRY_ISFILE(conflict->ancestor_entry)) { - if ((error = git_blob_lookup(&ancestor_blob, repo, &conflict->ancestor_entry.id)) < 0) - goto done; - - binary = git_blob_is_binary(ancestor_blob); - } - - if (!binary && - GIT_MERGE_INDEX_ENTRY_ISFILE(conflict->our_entry)) { - if ((error = git_blob_lookup(&our_blob, repo, &conflict->our_entry.id)) < 0) - goto done; - - binary = git_blob_is_binary(our_blob); - } - - if (!binary && - GIT_MERGE_INDEX_ENTRY_ISFILE(conflict->their_entry)) { - if ((error = git_blob_lookup(&their_blob, repo, &conflict->their_entry.id)) < 0) - goto done; - - binary = git_blob_is_binary(their_blob); - } - - *binary_out = binary; - -done: - git_blob_free(ancestor_blob); - git_blob_free(our_blob); - git_blob_free(their_blob); - - return error; -} - -GIT_INLINE(int) index_entry_dup_pool( - git_index_entry *out, - git_pool *pool, - const git_index_entry *src) -{ - if (src != NULL) { - memcpy(out, src, sizeof(git_index_entry)); - - if ((out->path = git_pool_strdup(pool, src->path)) == NULL) - return -1; - } - - return 0; -} - -GIT_INLINE(int) merge_delta_type_from_index_entries( - const git_index_entry *ancestor, - const git_index_entry *other) -{ - if (ancestor == NULL && other == NULL) - return GIT_DELTA_UNMODIFIED; - else if (ancestor == NULL && other != NULL) - return GIT_DELTA_ADDED; - else if (ancestor != NULL && other == NULL) - return GIT_DELTA_DELETED; - else if (S_ISDIR(ancestor->mode) ^ S_ISDIR(other->mode)) - return GIT_DELTA_TYPECHANGE; - else if(S_ISLNK(ancestor->mode) ^ S_ISLNK(other->mode)) - return GIT_DELTA_TYPECHANGE; - else if (git_oid__cmp(&ancestor->id, &other->id) || - ancestor->mode != other->mode) - return GIT_DELTA_MODIFIED; - - return GIT_DELTA_UNMODIFIED; -} - -static git_merge_diff *merge_diff_from_index_entries( - git_merge_diff_list *diff_list, - const git_index_entry **entries) -{ - git_merge_diff *conflict; - git_pool *pool = &diff_list->pool; - - if ((conflict = git_pool_malloc(pool, sizeof(git_merge_diff))) == NULL) - return NULL; - - if (index_entry_dup_pool(&conflict->ancestor_entry, pool, entries[TREE_IDX_ANCESTOR]) < 0 || - index_entry_dup_pool(&conflict->our_entry, pool, entries[TREE_IDX_OURS]) < 0 || - index_entry_dup_pool(&conflict->their_entry, pool, entries[TREE_IDX_THEIRS]) < 0) - return NULL; - - conflict->our_status = merge_delta_type_from_index_entries( - entries[TREE_IDX_ANCESTOR], entries[TREE_IDX_OURS]); - conflict->their_status = merge_delta_type_from_index_entries( - entries[TREE_IDX_ANCESTOR], entries[TREE_IDX_THEIRS]); - - return conflict; -} - -/* Merge trees */ - -static int merge_diff_list_insert_conflict( - git_merge_diff_list *diff_list, - struct merge_diff_df_data *merge_df_data, - const git_index_entry *tree_items[3]) -{ - git_merge_diff *conflict; - - if ((conflict = merge_diff_from_index_entries(diff_list, tree_items)) == NULL || - merge_diff_detect_type(conflict) < 0 || - merge_diff_detect_df_conflict(merge_df_data, conflict) < 0 || - git_vector_insert(&diff_list->conflicts, conflict) < 0) - return -1; - - return 0; -} - -static int merge_diff_list_insert_unmodified( - git_merge_diff_list *diff_list, - const git_index_entry *tree_items[3]) -{ - int error = 0; - git_index_entry *entry; - - entry = git_pool_malloc(&diff_list->pool, sizeof(git_index_entry)); - GITERR_CHECK_ALLOC(entry); - - if ((error = index_entry_dup_pool(entry, &diff_list->pool, tree_items[0])) >= 0) - error = git_vector_insert(&diff_list->staged, entry); - - return error; -} - -struct merge_diff_find_data { - git_merge_diff_list *diff_list; - struct merge_diff_df_data df_data; -}; - -static int queue_difference(const git_index_entry **entries, void *data) -{ - struct merge_diff_find_data *find_data = data; - bool item_modified = false; - size_t i; - - if (!entries[0] || !entries[1] || !entries[2]) { - item_modified = true; - } else { - for (i = 1; i < 3; i++) { - if (index_entry_cmp(entries[0], entries[i]) != 0) { - item_modified = true; - break; - } - } - } - - return item_modified ? - merge_diff_list_insert_conflict( - find_data->diff_list, &find_data->df_data, entries) : - merge_diff_list_insert_unmodified(find_data->diff_list, entries); -} - -int git_merge_diff_list__find_differences( - git_merge_diff_list *diff_list, - git_iterator *ancestor_iter, - git_iterator *our_iter, - git_iterator *their_iter) -{ - git_iterator *iterators[3] = { ancestor_iter, our_iter, their_iter }; - struct merge_diff_find_data find_data = { diff_list }; - - return git_iterator_walk(iterators, 3, queue_difference, &find_data); -} - -git_merge_diff_list *git_merge_diff_list__alloc(git_repository *repo) -{ - git_merge_diff_list *diff_list = git__calloc(1, sizeof(git_merge_diff_list)); - - if (diff_list == NULL) - return NULL; - - diff_list->repo = repo; - - if (git_vector_init(&diff_list->staged, 0, NULL) < 0 || - git_vector_init(&diff_list->conflicts, 0, NULL) < 0 || - git_vector_init(&diff_list->resolved, 0, NULL) < 0 || - git_pool_init(&diff_list->pool, 1, 0) < 0) { - git_merge_diff_list__free(diff_list); - return NULL; - } - - return diff_list; -} - -void git_merge_diff_list__free(git_merge_diff_list *diff_list) -{ - if (!diff_list) - return; - - git_vector_free(&diff_list->staged); - git_vector_free(&diff_list->conflicts); - git_vector_free(&diff_list->resolved); - git_pool_clear(&diff_list->pool); - git__free(diff_list); -} - -static int merge_normalize_opts( - git_repository *repo, - git_merge_options *opts, - const git_merge_options *given) -{ - git_config *cfg = NULL; - int error = 0; - - assert(repo && opts); - - if ((error = git_repository_config__weakptr(&cfg, repo)) < 0) - return error; - - if (given != NULL) - memcpy(opts, given, sizeof(git_merge_options)); - else { - git_merge_options init = GIT_MERGE_OPTIONS_INIT; - memcpy(opts, &init, sizeof(init)); - - opts->tree_flags = GIT_MERGE_TREE_FIND_RENAMES; - opts->rename_threshold = GIT_MERGE_TREE_RENAME_THRESHOLD; - } - - if (!opts->target_limit) { - int limit = git_config__get_int_force(cfg, "merge.renamelimit", 0); - - if (!limit) - limit = git_config__get_int_force(cfg, "diff.renamelimit", 0); - - opts->target_limit = (limit <= 0) ? - GIT_MERGE_TREE_TARGET_LIMIT : (unsigned int)limit; - } - - /* assign the internal metric with whitespace flag as payload */ - if (!opts->metric) { - opts->metric = git__malloc(sizeof(git_diff_similarity_metric)); - GITERR_CHECK_ALLOC(opts->metric); - - opts->metric->file_signature = git_diff_find_similar__hashsig_for_file; - opts->metric->buffer_signature = git_diff_find_similar__hashsig_for_buf; - opts->metric->free_signature = git_diff_find_similar__hashsig_free; - opts->metric->similarity = git_diff_find_similar__calc_similarity; - opts->metric->payload = (void *)GIT_HASHSIG_SMART_WHITESPACE; - } - - return 0; -} - - -static int merge_index_insert_reuc( - git_index *index, - size_t idx, - const git_index_entry *entry) -{ - const git_index_reuc_entry *reuc; - int mode[3] = { 0, 0, 0 }; - git_oid const *oid[3] = { NULL, NULL, NULL }; - size_t i; - - if (!GIT_MERGE_INDEX_ENTRY_EXISTS(*entry)) - return 0; - - if ((reuc = git_index_reuc_get_bypath(index, entry->path)) != NULL) { - for (i = 0; i < 3; i++) { - mode[i] = reuc->mode[i]; - oid[i] = &reuc->oid[i]; - } - } - - mode[idx] = entry->mode; - oid[idx] = &entry->id; - - return git_index_reuc_add(index, entry->path, - mode[0], oid[0], mode[1], oid[1], mode[2], oid[2]); -} - -int index_from_diff_list(git_index **out, git_merge_diff_list *diff_list) -{ - git_index *index; - size_t i; - git_index_entry *entry; - git_merge_diff *conflict; - int error = 0; - - *out = NULL; - - if ((error = git_index_new(&index)) < 0) - return error; - - git_vector_foreach(&diff_list->staged, i, entry) { - if ((error = git_index_add(index, entry)) < 0) - goto on_error; - } - - git_vector_foreach(&diff_list->conflicts, i, conflict) { - const git_index_entry *ancestor = - GIT_MERGE_INDEX_ENTRY_EXISTS(conflict->ancestor_entry) ? - &conflict->ancestor_entry : NULL; - - const git_index_entry *ours = - GIT_MERGE_INDEX_ENTRY_EXISTS(conflict->our_entry) ? - &conflict->our_entry : NULL; - - const git_index_entry *theirs = - GIT_MERGE_INDEX_ENTRY_EXISTS(conflict->their_entry) ? - &conflict->their_entry : NULL; - - if ((error = git_index_conflict_add(index, ancestor, ours, theirs)) < 0) - goto on_error; - } - - /* Add each rename entry to the rename portion of the index. */ - git_vector_foreach(&diff_list->conflicts, i, conflict) { - const char *ancestor_path, *our_path, *their_path; - - if (!GIT_MERGE_INDEX_ENTRY_EXISTS(conflict->ancestor_entry)) - continue; - - ancestor_path = conflict->ancestor_entry.path; - - our_path = - GIT_MERGE_INDEX_ENTRY_EXISTS(conflict->our_entry) ? - conflict->our_entry.path : NULL; - - their_path = - GIT_MERGE_INDEX_ENTRY_EXISTS(conflict->their_entry) ? - conflict->their_entry.path : NULL; - - if ((our_path && strcmp(ancestor_path, our_path) != 0) || - (their_path && strcmp(ancestor_path, their_path) != 0)) { - if ((error = git_index_name_add(index, ancestor_path, our_path, their_path)) < 0) - goto on_error; - } - } - - /* Add each entry in the resolved conflict to the REUC independently, since - * the paths may differ due to renames. */ - git_vector_foreach(&diff_list->resolved, i, conflict) { - const git_index_entry *ancestor = - GIT_MERGE_INDEX_ENTRY_EXISTS(conflict->ancestor_entry) ? - &conflict->ancestor_entry : NULL; - - const git_index_entry *ours = - GIT_MERGE_INDEX_ENTRY_EXISTS(conflict->our_entry) ? - &conflict->our_entry : NULL; - - const git_index_entry *theirs = - GIT_MERGE_INDEX_ENTRY_EXISTS(conflict->their_entry) ? - &conflict->their_entry : NULL; - - if (ancestor != NULL && - (error = merge_index_insert_reuc(index, TREE_IDX_ANCESTOR, ancestor)) < 0) - goto on_error; - - if (ours != NULL && - (error = merge_index_insert_reuc(index, TREE_IDX_OURS, ours)) < 0) - goto on_error; - - if (theirs != NULL && - (error = merge_index_insert_reuc(index, TREE_IDX_THEIRS, theirs)) < 0) - goto on_error; - } - - *out = index; - return 0; - -on_error: - git_index_free(index); - - return error; -} - -static git_iterator *iterator_given_or_empty(git_iterator **empty, git_iterator *given) -{ - if (given) - return given; - - if (git_iterator_for_nothing(empty, GIT_ITERATOR_DONT_IGNORE_CASE, NULL, NULL) < 0) - return NULL; - - return *empty; -} - -int git_merge__iterators( - git_index **out, - git_repository *repo, - git_iterator *ancestor_iter, - git_iterator *our_iter, - git_iterator *theirs_iter, - const git_merge_options *given_opts) -{ - git_iterator *empty_ancestor = NULL, - *empty_ours = NULL, - *empty_theirs = NULL; - git_merge_diff_list *diff_list; - git_merge_options opts; - git_merge_diff *conflict; - git_vector changes; - size_t i; - int error = 0; - - assert(out && repo); - - *out = NULL; - - GITERR_CHECK_VERSION( - given_opts, GIT_MERGE_OPTIONS_VERSION, "git_merge_options"); - - if ((error = merge_normalize_opts(repo, &opts, given_opts)) < 0) - return error; - - diff_list = git_merge_diff_list__alloc(repo); - GITERR_CHECK_ALLOC(diff_list); - - ancestor_iter = iterator_given_or_empty(&empty_ancestor, ancestor_iter); - our_iter = iterator_given_or_empty(&empty_ours, our_iter); - theirs_iter = iterator_given_or_empty(&empty_theirs, theirs_iter); - - if ((error = git_merge_diff_list__find_differences( - diff_list, ancestor_iter, our_iter, theirs_iter)) < 0 || - (error = git_merge_diff_list__find_renames(repo, diff_list, &opts)) < 0) - goto done; - - memcpy(&changes, &diff_list->conflicts, sizeof(git_vector)); - git_vector_clear(&diff_list->conflicts); - - git_vector_foreach(&changes, i, conflict) { - int resolved = 0; - - if ((error = merge_conflict_resolve(&resolved, diff_list, conflict, opts.file_favor, opts.file_flags)) < 0) - goto done; - - if (!resolved) - git_vector_insert(&diff_list->conflicts, conflict); - } - - if (!given_opts || !given_opts->metric) - git__free(opts.metric); - - error = index_from_diff_list(out, diff_list); - -done: - git_merge_diff_list__free(diff_list); - git_iterator_free(empty_ancestor); - git_iterator_free(empty_ours); - git_iterator_free(empty_theirs); - - return error; -} - -int git_merge_trees( - git_index **out, - git_repository *repo, - const git_tree *ancestor_tree, - const git_tree *our_tree, - const git_tree *their_tree, - const git_merge_options *merge_opts) -{ - git_iterator *ancestor_iter = NULL, *our_iter = NULL, *their_iter = NULL; - int error; - - if ((error = git_iterator_for_tree(&ancestor_iter, (git_tree *)ancestor_tree, - GIT_ITERATOR_DONT_IGNORE_CASE, NULL, NULL)) < 0 || - (error = git_iterator_for_tree(&our_iter, (git_tree *)our_tree, - GIT_ITERATOR_DONT_IGNORE_CASE, NULL, NULL)) < 0 || - (error = git_iterator_for_tree(&their_iter, (git_tree *)their_tree, - GIT_ITERATOR_DONT_IGNORE_CASE, NULL, NULL)) < 0) - goto done; - - error = git_merge__iterators( - out, repo, ancestor_iter, our_iter, their_iter, merge_opts); - -done: - git_iterator_free(ancestor_iter); - git_iterator_free(our_iter); - git_iterator_free(their_iter); - - return error; -} - - -int git_merge_commits( - git_index **out, - git_repository *repo, - const git_commit *our_commit, - const git_commit *their_commit, - const git_merge_options *opts) -{ - git_oid ancestor_oid; - git_commit *ancestor_commit = NULL; - git_tree *our_tree = NULL, *their_tree = NULL, *ancestor_tree = NULL; - int error = 0; - - if ((error = git_merge_base(&ancestor_oid, repo, git_commit_id(our_commit), git_commit_id(their_commit))) < 0 && - error == GIT_ENOTFOUND) - giterr_clear(); - else if (error < 0 || - (error = git_commit_lookup(&ancestor_commit, repo, &ancestor_oid)) < 0 || - (error = git_commit_tree(&ancestor_tree, ancestor_commit)) < 0) - goto done; - - if ((error = git_commit_tree(&our_tree, our_commit)) < 0 || - (error = git_commit_tree(&their_tree, their_commit)) < 0 || - (error = git_merge_trees(out, repo, ancestor_tree, our_tree, their_tree, opts)) < 0) - goto done; - -done: - git_commit_free(ancestor_commit); - git_tree_free(our_tree); - git_tree_free(their_tree); - git_tree_free(ancestor_tree); - - return error; -} - -/* Merge setup / cleanup */ - -static int write_merge_head( - git_repository *repo, - const git_annotated_commit *heads[], - size_t heads_len) -{ - git_filebuf file = GIT_FILEBUF_INIT; - git_buf file_path = GIT_BUF_INIT; - size_t i; - int error = 0; - - assert(repo && heads); - - if ((error = git_buf_joinpath(&file_path, repo->path_repository, GIT_MERGE_HEAD_FILE)) < 0 || - (error = git_filebuf_open(&file, file_path.ptr, GIT_FILEBUF_FORCE, GIT_MERGE_FILE_MODE)) < 0) - goto cleanup; - - for (i = 0; i < heads_len; i++) { - if ((error = git_filebuf_printf(&file, "%s\n", heads[i]->id_str)) < 0) - goto cleanup; - } - - error = git_filebuf_commit(&file); - -cleanup: - if (error < 0) - git_filebuf_cleanup(&file); - - git_buf_free(&file_path); - - return error; -} - -static int write_merge_mode(git_repository *repo) -{ - git_filebuf file = GIT_FILEBUF_INIT; - git_buf file_path = GIT_BUF_INIT; - int error = 0; - - assert(repo); - - if ((error = git_buf_joinpath(&file_path, repo->path_repository, GIT_MERGE_MODE_FILE)) < 0 || - (error = git_filebuf_open(&file, file_path.ptr, GIT_FILEBUF_FORCE, GIT_MERGE_FILE_MODE)) < 0) - goto cleanup; - - if ((error = git_filebuf_write(&file, "no-ff", 5)) < 0) - goto cleanup; - - error = git_filebuf_commit(&file); - -cleanup: - if (error < 0) - git_filebuf_cleanup(&file); - - git_buf_free(&file_path); - - return error; -} - -struct merge_msg_entry { - const git_annotated_commit *merge_head; - bool written; -}; - -static int msg_entry_is_branch( - const struct merge_msg_entry *entry, - git_vector *entries) -{ - GIT_UNUSED(entries); - - return (entry->written == 0 && - entry->merge_head->remote_url == NULL && - entry->merge_head->ref_name != NULL && - git__strncmp(GIT_REFS_HEADS_DIR, entry->merge_head->ref_name, strlen(GIT_REFS_HEADS_DIR)) == 0); -} - -static int msg_entry_is_tracking( - const struct merge_msg_entry *entry, - git_vector *entries) -{ - GIT_UNUSED(entries); - - return (entry->written == 0 && - entry->merge_head->remote_url == NULL && - entry->merge_head->ref_name != NULL && - git__strncmp(GIT_REFS_REMOTES_DIR, entry->merge_head->ref_name, strlen(GIT_REFS_REMOTES_DIR)) == 0); -} - -static int msg_entry_is_tag( - const struct merge_msg_entry *entry, - git_vector *entries) -{ - GIT_UNUSED(entries); - - return (entry->written == 0 && - entry->merge_head->remote_url == NULL && - entry->merge_head->ref_name != NULL && - git__strncmp(GIT_REFS_TAGS_DIR, entry->merge_head->ref_name, strlen(GIT_REFS_TAGS_DIR)) == 0); -} - -static int msg_entry_is_remote( - const struct merge_msg_entry *entry, - git_vector *entries) -{ - if (entry->written == 0 && - entry->merge_head->remote_url != NULL && - entry->merge_head->ref_name != NULL && - git__strncmp(GIT_REFS_HEADS_DIR, entry->merge_head->ref_name, strlen(GIT_REFS_HEADS_DIR)) == 0) - { - struct merge_msg_entry *existing; - - /* Match only branches from the same remote */ - if (entries->length == 0) - return 1; - - existing = git_vector_get(entries, 0); - - return (git__strcmp(existing->merge_head->remote_url, - entry->merge_head->remote_url) == 0); - } - - return 0; -} - -static int msg_entry_is_oid( - const struct merge_msg_entry *merge_msg_entry) -{ - return (merge_msg_entry->written == 0 && - merge_msg_entry->merge_head->ref_name == NULL && - merge_msg_entry->merge_head->remote_url == NULL); -} - -static int merge_msg_entry_written( - const struct merge_msg_entry *merge_msg_entry) -{ - return (merge_msg_entry->written == 1); -} - -static int merge_msg_entries( - git_vector *v, - const struct merge_msg_entry *entries, - size_t len, - int (*match)(const struct merge_msg_entry *entry, git_vector *entries)) -{ - size_t i; - int matches, total = 0; - - git_vector_clear(v); - - for (i = 0; i < len; i++) { - if ((matches = match(&entries[i], v)) < 0) - return matches; - else if (!matches) - continue; - - git_vector_insert(v, (struct merge_msg_entry *)&entries[i]); - total++; - } - - return total; -} - -static int merge_msg_write_entries( - git_filebuf *file, - git_vector *entries, - const char *item_name, - const char *item_plural_name, - size_t ref_name_skip, - const char *source, - char sep) -{ - struct merge_msg_entry *entry; - size_t i; - int error = 0; - - if (entries->length == 0) - return 0; - - if (sep && (error = git_filebuf_printf(file, "%c ", sep)) < 0) - goto done; - - if ((error = git_filebuf_printf(file, "%s ", - (entries->length == 1) ? item_name : item_plural_name)) < 0) - goto done; - - git_vector_foreach(entries, i, entry) { - if (i > 0 && - (error = git_filebuf_printf(file, "%s", (i == entries->length - 1) ? " and " : ", ")) < 0) - goto done; - - if ((error = git_filebuf_printf(file, "'%s'", entry->merge_head->ref_name + ref_name_skip)) < 0) - goto done; - - entry->written = 1; - } - - if (source) - error = git_filebuf_printf(file, " of %s", source); - -done: - return error; -} - -static int merge_msg_write_branches( - git_filebuf *file, - git_vector *entries, - char sep) -{ - return merge_msg_write_entries(file, entries, - "branch", "branches", strlen(GIT_REFS_HEADS_DIR), NULL, sep); -} - -static int merge_msg_write_tracking( - git_filebuf *file, - git_vector *entries, - char sep) -{ - return merge_msg_write_entries(file, entries, - "remote-tracking branch", "remote-tracking branches", 0, NULL, sep); -} - -static int merge_msg_write_tags( - git_filebuf *file, - git_vector *entries, - char sep) -{ - return merge_msg_write_entries(file, entries, - "tag", "tags", strlen(GIT_REFS_TAGS_DIR), NULL, sep); -} - -static int merge_msg_write_remotes( - git_filebuf *file, - git_vector *entries, - char sep) -{ - const char *source; - - if (entries->length == 0) - return 0; - - source = ((struct merge_msg_entry *)entries->contents[0])->merge_head->remote_url; - - return merge_msg_write_entries(file, entries, - "branch", "branches", strlen(GIT_REFS_HEADS_DIR), source, sep); -} - -static int write_merge_msg( - git_repository *repo, - const git_annotated_commit *heads[], - size_t heads_len) -{ - git_filebuf file = GIT_FILEBUF_INIT; - git_buf file_path = GIT_BUF_INIT; - struct merge_msg_entry *entries; - git_vector matching = GIT_VECTOR_INIT; - size_t i; - char sep = 0; - int error = 0; - - assert(repo && heads); - - entries = git__calloc(heads_len, sizeof(struct merge_msg_entry)); - GITERR_CHECK_ALLOC(entries); - - if (git_vector_init(&matching, heads_len, NULL) < 0) { - git__free(entries); - return -1; - } - - for (i = 0; i < heads_len; i++) - entries[i].merge_head = heads[i]; - - if ((error = git_buf_joinpath(&file_path, repo->path_repository, GIT_MERGE_MSG_FILE)) < 0 || - (error = git_filebuf_open(&file, file_path.ptr, GIT_FILEBUF_FORCE, GIT_MERGE_FILE_MODE)) < 0 || - (error = git_filebuf_write(&file, "Merge ", 6)) < 0) - goto cleanup; - - /* - * This is to emulate the format of MERGE_MSG by core git. - * - * Core git will write all the commits specified by OID, in the order - * provided, until the first named branch or tag is reached, at which - * point all branches will be written in the order provided, then all - * tags, then all remote tracking branches and finally all commits that - * were specified by OID that were not already written. - * - * Yes. Really. - */ - for (i = 0; i < heads_len; i++) { - if (!msg_entry_is_oid(&entries[i])) - break; - - if ((error = git_filebuf_printf(&file, - "%scommit '%s'", (i > 0) ? "; " : "", - entries[i].merge_head->id_str)) < 0) - goto cleanup; - - entries[i].written = 1; - } - - if (i) - sep = ';'; - - if ((error = merge_msg_entries(&matching, entries, heads_len, msg_entry_is_branch)) < 0 || - (error = merge_msg_write_branches(&file, &matching, sep)) < 0) - goto cleanup; - - if (matching.length) - sep =','; - - if ((error = merge_msg_entries(&matching, entries, heads_len, msg_entry_is_tracking)) < 0 || - (error = merge_msg_write_tracking(&file, &matching, sep)) < 0) - goto cleanup; - - if (matching.length) - sep =','; - - if ((error = merge_msg_entries(&matching, entries, heads_len, msg_entry_is_tag)) < 0 || - (error = merge_msg_write_tags(&file, &matching, sep)) < 0) - goto cleanup; - - if (matching.length) - sep =','; - - /* We should never be called with multiple remote branches, but handle - * it in case we are... */ - while ((error = merge_msg_entries(&matching, entries, heads_len, msg_entry_is_remote)) > 0) { - if ((error = merge_msg_write_remotes(&file, &matching, sep)) < 0) - goto cleanup; - - if (matching.length) - sep =','; - } - - if (error < 0) - goto cleanup; - - for (i = 0; i < heads_len; i++) { - if (merge_msg_entry_written(&entries[i])) - continue; - - if ((error = git_filebuf_printf(&file, "; commit '%s'", - entries[i].merge_head->id_str)) < 0) - goto cleanup; - } - - if ((error = git_filebuf_printf(&file, "\n")) < 0 || - (error = git_filebuf_commit(&file)) < 0) - goto cleanup; - -cleanup: - if (error < 0) - git_filebuf_cleanup(&file); - - git_buf_free(&file_path); - - git_vector_free(&matching); - git__free(entries); - - return error; -} - -int git_merge__setup( - git_repository *repo, - const git_annotated_commit *our_head, - const git_annotated_commit *heads[], - size_t heads_len) -{ - int error = 0; - - assert (repo && our_head && heads); - - if ((error = git_repository__set_orig_head(repo, git_annotated_commit_id(our_head))) == 0 && - (error = write_merge_head(repo, heads, heads_len)) == 0 && - (error = write_merge_mode(repo)) == 0) { - error = write_merge_msg(repo, heads, heads_len); - } - - return error; -} - -/* Merge branches */ - -static int merge_ancestor_head( - git_annotated_commit **ancestor_head, - git_repository *repo, - const git_annotated_commit *our_head, - const git_annotated_commit **their_heads, - size_t their_heads_len) -{ - git_oid *oids, ancestor_oid; - size_t i, alloc_len; - int error = 0; - - assert(repo && our_head && their_heads); - - GITERR_CHECK_ALLOC_ADD(&alloc_len, their_heads_len, 1); - oids = git__calloc(alloc_len, sizeof(git_oid)); - GITERR_CHECK_ALLOC(oids); - - git_oid_cpy(&oids[0], git_commit_id(our_head->commit)); - - for (i = 0; i < their_heads_len; i++) - git_oid_cpy(&oids[i + 1], git_annotated_commit_id(their_heads[i])); - - if ((error = git_merge_base_many(&ancestor_oid, repo, their_heads_len + 1, oids)) < 0) - goto on_error; - - error = git_annotated_commit_lookup(ancestor_head, repo, &ancestor_oid); - -on_error: - git__free(oids); - return error; -} - -const char *merge_their_label(const char *branchname) -{ - const char *slash; - - if ((slash = strrchr(branchname, '/')) == NULL) - return branchname; - - if (*(slash+1) == '\0') - return "theirs"; - - return slash+1; -} - -static int merge_normalize_checkout_opts( - git_repository *repo, - git_checkout_options *checkout_opts, - const git_checkout_options *given_checkout_opts, - const git_annotated_commit *ancestor_head, - const git_annotated_commit *our_head, - size_t their_heads_len, - const git_annotated_commit **their_heads) -{ - int error = 0; - - GIT_UNUSED(repo); - - if (given_checkout_opts != NULL) - memcpy(checkout_opts, given_checkout_opts, sizeof(git_checkout_options)); - else { - git_checkout_options default_checkout_opts = GIT_CHECKOUT_OPTIONS_INIT; - default_checkout_opts.checkout_strategy = GIT_CHECKOUT_SAFE; - - memcpy(checkout_opts, &default_checkout_opts, sizeof(git_checkout_options)); - } - - /* TODO: for multiple ancestors in merge-recursive, this is "merged common ancestors" */ - if (!checkout_opts->ancestor_label) { - if (ancestor_head && ancestor_head->commit) - checkout_opts->ancestor_label = git_commit_summary(ancestor_head->commit); - else - checkout_opts->ancestor_label = "ancestor"; - } - - if (!checkout_opts->our_label) { - if (our_head && our_head->ref_name) - checkout_opts->our_label = our_head->ref_name; - else - checkout_opts->our_label = "ours"; - } - - if (!checkout_opts->their_label) { - if (their_heads_len == 1 && their_heads[0]->ref_name) - checkout_opts->their_label = merge_their_label(their_heads[0]->ref_name); - else if (their_heads_len == 1) - checkout_opts->their_label = their_heads[0]->id_str; - else - checkout_opts->their_label = "theirs"; - } - - return error; -} - -static int merge_check_index(size_t *conflicts, git_repository *repo, git_index *index_new, git_vector *merged_paths) -{ - git_tree *head_tree = NULL; - git_index *index_repo = NULL; - git_iterator *iter_repo = NULL, *iter_new = NULL; - git_diff *staged_diff_list = NULL, *index_diff_list = NULL; - git_diff_delta *delta; - git_diff_options opts = GIT_DIFF_OPTIONS_INIT; - git_vector staged_paths = GIT_VECTOR_INIT; - size_t i; - int error = 0; - - GIT_UNUSED(merged_paths); - - *conflicts = 0; - - /* No staged changes may exist unless the change staged is identical to - * the result of the merge. This allows one to apply to merge manually, - * then run merge. Any other staged change would be overwritten by - * a reset merge. - */ - if ((error = git_repository_head_tree(&head_tree, repo)) < 0 || - (error = git_repository_index(&index_repo, repo)) < 0 || - (error = git_diff_tree_to_index(&staged_diff_list, repo, head_tree, index_repo, &opts)) < 0) - goto done; - - if (staged_diff_list->deltas.length == 0) - goto done; - - git_vector_foreach(&staged_diff_list->deltas, i, delta) { - if ((error = git_vector_insert(&staged_paths, (char *)delta->new_file.path)) < 0) - goto done; - } - - opts.pathspec.count = staged_paths.length; - opts.pathspec.strings = (char **)staged_paths.contents; - - if ((error = git_iterator_for_index(&iter_repo, index_repo, GIT_ITERATOR_DONT_IGNORE_CASE, NULL, NULL)) < 0 || - (error = git_iterator_for_index(&iter_new, index_new, GIT_ITERATOR_DONT_IGNORE_CASE, NULL, NULL)) < 0 || - (error = git_diff__from_iterators(&index_diff_list, repo, iter_repo, iter_new, &opts)) < 0) - goto done; - - *conflicts = index_diff_list->deltas.length; - -done: - git_tree_free(head_tree); - git_index_free(index_repo); - git_iterator_free(iter_repo); - git_iterator_free(iter_new); - git_diff_free(staged_diff_list); - git_diff_free(index_diff_list); - git_vector_free(&staged_paths); - - return error; -} - -static int merge_check_workdir(size_t *conflicts, git_repository *repo, git_index *index_new, git_vector *merged_paths) -{ - git_diff *wd_diff_list = NULL; - git_diff_options opts = GIT_DIFF_OPTIONS_INIT; - int error = 0; - - GIT_UNUSED(index_new); - - *conflicts = 0; - - /* We need to have merged at least 1 file for the possibility to exist to - * have conflicts with the workdir. Passing 0 as the pathspec count paramter - * will consider all files in the working directory, that is, we may detect - * a conflict if there were untracked files in the workdir prior to starting - * the merge. This typically happens when cherry-picking a commmit whose - * changes have already been applied. - */ - if (merged_paths->length == 0) - return 0; - - opts.flags |= GIT_DIFF_INCLUDE_UNTRACKED; - - /* Workdir changes may exist iff they do not conflict with changes that - * will be applied by the merge (including conflicts). Ensure that there - * are no changes in the workdir to these paths. - */ - opts.pathspec.count = merged_paths->length; - opts.pathspec.strings = (char **)merged_paths->contents; - - if ((error = git_diff_index_to_workdir(&wd_diff_list, repo, NULL, &opts)) < 0) - goto done; - - *conflicts = wd_diff_list->deltas.length; - -done: - git_diff_free(wd_diff_list); - - return error; -} - -int git_merge__check_result(git_repository *repo, git_index *index_new) -{ - git_tree *head_tree = NULL; - git_iterator *iter_head = NULL, *iter_new = NULL; - git_diff *merged_list = NULL; - git_diff_options opts = GIT_DIFF_OPTIONS_INIT; - git_diff_delta *delta; - git_vector paths = GIT_VECTOR_INIT; - size_t i, index_conflicts = 0, wd_conflicts = 0, conflicts; - const git_index_entry *e; - int error = 0; - - if ((error = git_repository_head_tree(&head_tree, repo)) < 0 || - (error = git_iterator_for_tree(&iter_head, head_tree, GIT_ITERATOR_DONT_IGNORE_CASE, NULL, NULL)) < 0 || - (error = git_iterator_for_index(&iter_new, index_new, GIT_ITERATOR_DONT_IGNORE_CASE, NULL, NULL)) < 0 || - (error = git_diff__from_iterators(&merged_list, repo, iter_head, iter_new, &opts)) < 0) - goto done; - - git_vector_foreach(&merged_list->deltas, i, delta) { - if ((error = git_vector_insert(&paths, (char *)delta->new_file.path)) < 0) - goto done; - } - - for (i = 0; i < git_index_entrycount(index_new); i++) { - e = git_index_get_byindex(index_new, i); - - if (git_index_entry_is_conflict(e) && - (git_vector_last(&paths) == NULL || - strcmp(git_vector_last(&paths), e->path) != 0)) { - - if ((error = git_vector_insert(&paths, (char *)e->path)) < 0) - goto done; - } - } - - /* Make sure the index and workdir state do not prevent merging */ - if ((error = merge_check_index(&index_conflicts, repo, index_new, &paths)) < 0 || - (error = merge_check_workdir(&wd_conflicts, repo, index_new, &paths)) < 0) - goto done; - - if ((conflicts = index_conflicts + wd_conflicts) > 0) { - giterr_set(GITERR_MERGE, "%" PRIuZ " uncommitted change%s would be overwritten by merge", - conflicts, (conflicts != 1) ? "s" : ""); - error = GIT_ECONFLICT; - } - -done: - git_vector_free(&paths); - git_tree_free(head_tree); - git_iterator_free(iter_head); - git_iterator_free(iter_new); - git_diff_free(merged_list); - - return error; -} - -int git_merge__append_conflicts_to_merge_msg( - git_repository *repo, - git_index *index) -{ - git_filebuf file = GIT_FILEBUF_INIT; - git_buf file_path = GIT_BUF_INIT; - const char *last = NULL; - size_t i; - int error; - - if (!git_index_has_conflicts(index)) - return 0; - - if ((error = git_buf_joinpath(&file_path, repo->path_repository, GIT_MERGE_MSG_FILE)) < 0 || - (error = git_filebuf_open(&file, file_path.ptr, GIT_FILEBUF_APPEND, GIT_MERGE_FILE_MODE)) < 0) - goto cleanup; - - git_filebuf_printf(&file, "\nConflicts:\n"); - - for (i = 0; i < git_index_entrycount(index); i++) { - const git_index_entry *e = git_index_get_byindex(index, i); - - if (!git_index_entry_is_conflict(e)) - continue; - - if (last == NULL || strcmp(e->path, last) != 0) - git_filebuf_printf(&file, "\t%s\n", e->path); - - last = e->path; - } - - error = git_filebuf_commit(&file); - -cleanup: - if (error < 0) - git_filebuf_cleanup(&file); - - git_buf_free(&file_path); - - return error; -} - -static int merge_state_cleanup(git_repository *repo) -{ - const char *state_files[] = { - GIT_MERGE_HEAD_FILE, - GIT_MERGE_MODE_FILE, - GIT_MERGE_MSG_FILE, - }; - - return git_repository__cleanup_files(repo, state_files, ARRAY_SIZE(state_files)); -} - -static int merge_heads( - git_annotated_commit **ancestor_head_out, - git_annotated_commit **our_head_out, - git_repository *repo, - const git_annotated_commit **their_heads, - size_t their_heads_len) -{ - git_annotated_commit *ancestor_head = NULL, *our_head = NULL; - git_reference *our_ref = NULL; - int error = 0; - - *ancestor_head_out = NULL; - *our_head_out = NULL; - - if ((error = git_repository__ensure_not_bare(repo, "merge")) < 0) - goto done; - - if ((error = git_reference_lookup(&our_ref, repo, GIT_HEAD_FILE)) < 0 || - (error = git_annotated_commit_from_ref(&our_head, repo, our_ref)) < 0) - goto done; - - if ((error = merge_ancestor_head(&ancestor_head, repo, our_head, their_heads, their_heads_len)) < 0) { - if (error != GIT_ENOTFOUND) - goto done; - - giterr_clear(); - error = 0; - } - - *ancestor_head_out = ancestor_head; - *our_head_out = our_head; - -done: - if (error < 0) { - git_annotated_commit_free(ancestor_head); - git_annotated_commit_free(our_head); - } - - git_reference_free(our_ref); - - return error; -} - -static int merge_preference(git_merge_preference_t *out, git_repository *repo) -{ - git_config *config; - const char *value; - int bool_value, error = 0; - - *out = GIT_MERGE_PREFERENCE_NONE; - - if ((error = git_repository_config_snapshot(&config, repo)) < 0) - goto done; - - if ((error = git_config_get_string(&value, config, "merge.ff")) < 0) { - if (error == GIT_ENOTFOUND) { - giterr_clear(); - error = 0; - } - - goto done; - } - - if (git_config_parse_bool(&bool_value, value) == 0) { - if (!bool_value) - *out |= GIT_MERGE_PREFERENCE_NO_FASTFORWARD; - } else { - if (strcasecmp(value, "only") == 0) - *out |= GIT_MERGE_PREFERENCE_FASTFORWARD_ONLY; - } - -done: - git_config_free(config); - return error; -} - -int git_merge_analysis( - git_merge_analysis_t *analysis_out, - git_merge_preference_t *preference_out, - git_repository *repo, - const git_annotated_commit **their_heads, - size_t their_heads_len) -{ - git_annotated_commit *ancestor_head = NULL, *our_head = NULL; - int error = 0; - - assert(analysis_out && preference_out && repo && their_heads); - - if (their_heads_len != 1) { - giterr_set(GITERR_MERGE, "Can only merge a single branch"); - error = -1; - goto done; - } - - *analysis_out = GIT_MERGE_ANALYSIS_NONE; - - if ((error = merge_preference(preference_out, repo)) < 0) - goto done; - - if (git_repository_head_unborn(repo)) { - *analysis_out |= GIT_MERGE_ANALYSIS_FASTFORWARD | GIT_MERGE_ANALYSIS_UNBORN; - goto done; - } - - if ((error = merge_heads(&ancestor_head, &our_head, repo, their_heads, their_heads_len)) < 0) - goto done; - - /* We're up-to-date if we're trying to merge our own common ancestor. */ - if (ancestor_head && git_oid_equal( - git_annotated_commit_id(ancestor_head), git_annotated_commit_id(their_heads[0]))) - *analysis_out |= GIT_MERGE_ANALYSIS_UP_TO_DATE; - - /* We're fastforwardable if we're our own common ancestor. */ - else if (ancestor_head && git_oid_equal( - git_annotated_commit_id(ancestor_head), git_annotated_commit_id(our_head))) - *analysis_out |= GIT_MERGE_ANALYSIS_FASTFORWARD | GIT_MERGE_ANALYSIS_NORMAL; - - /* Otherwise, just a normal merge is possible. */ - else - *analysis_out |= GIT_MERGE_ANALYSIS_NORMAL; - -done: - git_annotated_commit_free(ancestor_head); - git_annotated_commit_free(our_head); - return error; -} - -int git_merge( - git_repository *repo, - const git_annotated_commit **their_heads, - size_t their_heads_len, - const git_merge_options *merge_opts, - const git_checkout_options *given_checkout_opts) -{ - git_reference *our_ref = NULL; - git_checkout_options checkout_opts; - git_annotated_commit *ancestor_head = NULL, *our_head = NULL; - git_tree *ancestor_tree = NULL, *our_tree = NULL, **their_trees = NULL; - git_index *index = NULL; - git_indexwriter indexwriter = GIT_INDEXWRITER_INIT; - size_t i; - int error = 0; - - assert(repo && their_heads); - - if (their_heads_len != 1) { - giterr_set(GITERR_MERGE, "Can only merge a single branch"); - return -1; - } - - their_trees = git__calloc(their_heads_len, sizeof(git_tree *)); - GITERR_CHECK_ALLOC(their_trees); - - if ((error = merge_heads(&ancestor_head, &our_head, repo, their_heads, their_heads_len)) < 0 || - (error = merge_normalize_checkout_opts(repo, &checkout_opts, given_checkout_opts, - ancestor_head, our_head, their_heads_len, their_heads)) < 0 || - (error = git_indexwriter_init_for_operation(&indexwriter, repo, &checkout_opts.checkout_strategy)) < 0) - goto on_error; - - /* Write the merge files to the repository. */ - if ((error = git_merge__setup(repo, our_head, their_heads, their_heads_len)) < 0) - goto on_error; - - if (ancestor_head != NULL && - (error = git_commit_tree(&ancestor_tree, ancestor_head->commit)) < 0) - goto on_error; - - if ((error = git_commit_tree(&our_tree, our_head->commit)) < 0) - goto on_error; - - for (i = 0; i < their_heads_len; i++) { - if ((error = git_commit_tree(&their_trees[i], their_heads[i]->commit)) < 0) - goto on_error; - } - - /* TODO: recursive, octopus, etc... */ - - if ((error = git_merge_trees(&index, repo, ancestor_tree, our_tree, their_trees[0], merge_opts)) < 0 || - (error = git_merge__check_result(repo, index)) < 0 || - (error = git_merge__append_conflicts_to_merge_msg(repo, index)) < 0 || - (error = git_checkout_index(repo, index, &checkout_opts)) < 0 || - (error = git_indexwriter_commit(&indexwriter)) < 0) - goto on_error; - - goto done; - -on_error: - merge_state_cleanup(repo); - -done: - git_indexwriter_cleanup(&indexwriter); - - git_index_free(index); - - git_tree_free(ancestor_tree); - git_tree_free(our_tree); - - for (i = 0; i < their_heads_len; i++) - git_tree_free(their_trees[i]); - - git__free(their_trees); - - git_annotated_commit_free(our_head); - git_annotated_commit_free(ancestor_head); - - git_reference_free(our_ref); - - return error; -} - -int git_merge_init_options(git_merge_options *opts, unsigned int version) -{ - GIT_INIT_STRUCTURE_FROM_TEMPLATE( - opts, version, git_merge_options, GIT_MERGE_OPTIONS_INIT); - return 0; -} - -int git_merge_file_init_input(git_merge_file_input *input, unsigned int version) -{ - GIT_INIT_STRUCTURE_FROM_TEMPLATE( - input, version, git_merge_file_input, GIT_MERGE_FILE_INPUT_INIT); - return 0; -} - -int git_merge_file_init_options( - git_merge_file_options *opts, unsigned int version) -{ - GIT_INIT_STRUCTURE_FROM_TEMPLATE( - opts, version, git_merge_file_options, GIT_MERGE_FILE_OPTIONS_INIT); - return 0; -} diff --git a/vendor/libgit2/src/merge.h b/vendor/libgit2/src/merge.h deleted file mode 100644 index 3caf617c63..0000000000 --- a/vendor/libgit2/src/merge.h +++ /dev/null @@ -1,155 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_merge_h__ -#define INCLUDE_merge_h__ - -#include "vector.h" -#include "commit_list.h" -#include "pool.h" -#include "iterator.h" - -#include "git2/merge.h" -#include "git2/types.h" - -#define GIT_MERGE_MSG_FILE "MERGE_MSG" -#define GIT_MERGE_MODE_FILE "MERGE_MODE" -#define GIT_MERGE_FILE_MODE 0666 - -#define GIT_MERGE_TREE_RENAME_THRESHOLD 50 -#define GIT_MERGE_TREE_TARGET_LIMIT 1000 - -/** Types of changes when files are merged from branch to branch. */ -typedef enum { - /* No conflict - a change only occurs in one branch. */ - GIT_MERGE_DIFF_NONE = 0, - - /* Occurs when a file is modified in both branches. */ - GIT_MERGE_DIFF_BOTH_MODIFIED = (1 << 0), - - /* Occurs when a file is added in both branches. */ - GIT_MERGE_DIFF_BOTH_ADDED = (1 << 1), - - /* Occurs when a file is deleted in both branches. */ - GIT_MERGE_DIFF_BOTH_DELETED = (1 << 2), - - /* Occurs when a file is modified in one branch and deleted in the other. */ - GIT_MERGE_DIFF_MODIFIED_DELETED = (1 << 3), - - /* Occurs when a file is renamed in one branch and modified in the other. */ - GIT_MERGE_DIFF_RENAMED_MODIFIED = (1 << 4), - - /* Occurs when a file is renamed in one branch and deleted in the other. */ - GIT_MERGE_DIFF_RENAMED_DELETED = (1 << 5), - - /* Occurs when a file is renamed in one branch and a file with the same - * name is added in the other. Eg, A->B and new file B. Core git calls - * this a "rename/delete". */ - GIT_MERGE_DIFF_RENAMED_ADDED = (1 << 6), - - /* Occurs when both a file is renamed to the same name in the ours and - * theirs branches. Eg, A->B and A->B in both. Automergeable. */ - GIT_MERGE_DIFF_BOTH_RENAMED = (1 << 7), - - /* Occurs when a file is renamed to different names in the ours and theirs - * branches. Eg, A->B and A->C. */ - GIT_MERGE_DIFF_BOTH_RENAMED_1_TO_2 = (1 << 8), - - /* Occurs when two files are renamed to the same name in the ours and - * theirs branches. Eg, A->C and B->C. */ - GIT_MERGE_DIFF_BOTH_RENAMED_2_TO_1 = (1 << 9), - - /* Occurs when an item at a path in one branch is a directory, and an - * item at the same path in a different branch is a file. */ - GIT_MERGE_DIFF_DIRECTORY_FILE = (1 << 10), - - /* The child of a folder that is in a directory/file conflict. */ - GIT_MERGE_DIFF_DF_CHILD = (1 << 11), -} git_merge_diff_type_t; - - -typedef struct { - git_repository *repo; - git_pool pool; - - /* Vector of git_index_entry that represent the merged items that - * have been staged, either because only one side changed, or because - * the two changes were non-conflicting and mergeable. These items - * will be written as staged entries in the main index. - */ - git_vector staged; - - /* Vector of git_merge_diff entries that represent the conflicts that - * have not been automerged. These items will be written to high-stage - * entries in the main index. - */ - git_vector conflicts; - - /* Vector of git_merge_diff that have been automerged. These items - * will be written to the REUC when the index is produced. - */ - git_vector resolved; -} git_merge_diff_list; - -/** - * Description of changes to one file across three trees. - */ -typedef struct { - git_merge_diff_type_t type; - - git_index_entry ancestor_entry; - - git_index_entry our_entry; - git_delta_t our_status; - - git_index_entry their_entry; - git_delta_t their_status; - -} git_merge_diff; - -int git_merge__bases_many( - git_commit_list **out, - git_revwalk *walk, - git_commit_list_node *one, - git_vector *twos); - -/* - * Three-way tree differencing - */ - -git_merge_diff_list *git_merge_diff_list__alloc(git_repository *repo); - -int git_merge_diff_list__find_differences( - git_merge_diff_list *merge_diff_list, - git_iterator *ancestor_iterator, - git_iterator *ours_iter, - git_iterator *theirs_iter); - -int git_merge_diff_list__find_renames(git_repository *repo, git_merge_diff_list *merge_diff_list, const git_merge_options *opts); - -void git_merge_diff_list__free(git_merge_diff_list *diff_list); - -/* Merge metadata setup */ - -int git_merge__setup( - git_repository *repo, - const git_annotated_commit *our_head, - const git_annotated_commit *heads[], - size_t heads_len); - -int git_merge__iterators( - git_index **out, - git_repository *repo, - git_iterator *ancestor_iter, - git_iterator *our_iter, - git_iterator *their_iter, - const git_merge_options *given_opts); - -int git_merge__check_result(git_repository *repo, git_index *index_new); - -int git_merge__append_conflicts_to_merge_msg(git_repository *repo, git_index *index); - -#endif diff --git a/vendor/libgit2/src/merge_file.c b/vendor/libgit2/src/merge_file.c deleted file mode 100644 index 6d89b089df..0000000000 --- a/vendor/libgit2/src/merge_file.c +++ /dev/null @@ -1,292 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#include "common.h" -#include "repository.h" -#include "merge_file.h" -#include "posix.h" -#include "fileops.h" -#include "index.h" - -#include "git2/repository.h" -#include "git2/object.h" -#include "git2/index.h" - -#include "xdiff/xdiff.h" - -#define GIT_MERGE_FILE_SIDE_EXISTS(X) ((X)->mode != 0) - -GIT_INLINE(const char *) merge_file_best_path( - const git_merge_file_input *ancestor, - const git_merge_file_input *ours, - const git_merge_file_input *theirs) -{ - if (!ancestor) { - if (ours && theirs && strcmp(ours->path, theirs->path) == 0) - return ours->path; - - return NULL; - } - - if (ours && strcmp(ancestor->path, ours->path) == 0) - return theirs ? theirs->path : NULL; - else if(theirs && strcmp(ancestor->path, theirs->path) == 0) - return ours ? ours->path : NULL; - - return NULL; -} - -GIT_INLINE(int) merge_file_best_mode( - const git_merge_file_input *ancestor, - const git_merge_file_input *ours, - const git_merge_file_input *theirs) -{ - /* - * If ancestor didn't exist and either ours or theirs is executable, - * assume executable. Otherwise, if any mode changed from the ancestor, - * use that one. - */ - if (!ancestor) { - if ((ours && ours->mode == GIT_FILEMODE_BLOB_EXECUTABLE) || - (theirs && theirs->mode == GIT_FILEMODE_BLOB_EXECUTABLE)) - return GIT_FILEMODE_BLOB_EXECUTABLE; - - return GIT_FILEMODE_BLOB; - } else if (ours && theirs) { - if (ancestor->mode == ours->mode) - return theirs->mode; - - return ours->mode; - } - - return 0; -} - -int git_merge_file__input_from_index( - git_merge_file_input *input_out, - git_odb_object **odb_object_out, - git_odb *odb, - const git_index_entry *entry) -{ - int error = 0; - - assert(input_out && odb_object_out && odb && entry); - - if ((error = git_odb_read(odb_object_out, odb, &entry->id)) < 0) - goto done; - - input_out->path = entry->path; - input_out->mode = entry->mode; - input_out->ptr = (char *)git_odb_object_data(*odb_object_out); - input_out->size = git_odb_object_size(*odb_object_out); - -done: - return error; -} - -static void merge_file_normalize_opts( - git_merge_file_options *out, - const git_merge_file_options *given_opts) -{ - if (given_opts) - memcpy(out, given_opts, sizeof(git_merge_file_options)); - else { - git_merge_file_options default_opts = GIT_MERGE_FILE_OPTIONS_INIT; - memcpy(out, &default_opts, sizeof(git_merge_file_options)); - } -} - -static int git_merge_file__from_inputs( - git_merge_file_result *out, - const git_merge_file_input *ancestor, - const git_merge_file_input *ours, - const git_merge_file_input *theirs, - const git_merge_file_options *given_opts) -{ - xmparam_t xmparam; - mmfile_t ancestor_mmfile = {0}, our_mmfile = {0}, their_mmfile = {0}; - mmbuffer_t mmbuffer; - git_merge_file_options options = GIT_MERGE_FILE_OPTIONS_INIT; - const char *path; - int xdl_result; - int error = 0; - - memset(out, 0x0, sizeof(git_merge_file_result)); - - merge_file_normalize_opts(&options, given_opts); - - memset(&xmparam, 0x0, sizeof(xmparam_t)); - - if (ancestor) { - xmparam.ancestor = (options.ancestor_label) ? - options.ancestor_label : ancestor->path; - ancestor_mmfile.ptr = (char *)ancestor->ptr; - ancestor_mmfile.size = ancestor->size; - } - - xmparam.file1 = (options.our_label) ? - options.our_label : ours->path; - our_mmfile.ptr = (char *)ours->ptr; - our_mmfile.size = ours->size; - - xmparam.file2 = (options.their_label) ? - options.their_label : theirs->path; - their_mmfile.ptr = (char *)theirs->ptr; - their_mmfile.size = theirs->size; - - if (options.favor == GIT_MERGE_FILE_FAVOR_OURS) - xmparam.favor = XDL_MERGE_FAVOR_OURS; - else if (options.favor == GIT_MERGE_FILE_FAVOR_THEIRS) - xmparam.favor = XDL_MERGE_FAVOR_THEIRS; - else if (options.favor == GIT_MERGE_FILE_FAVOR_UNION) - xmparam.favor = XDL_MERGE_FAVOR_UNION; - - xmparam.level = (options.flags & GIT_MERGE_FILE_SIMPLIFY_ALNUM) ? - XDL_MERGE_ZEALOUS_ALNUM : XDL_MERGE_ZEALOUS; - - if (options.flags & GIT_MERGE_FILE_STYLE_DIFF3) - xmparam.style = XDL_MERGE_DIFF3; - - if (options.flags & GIT_MERGE_FILE_IGNORE_WHITESPACE) - xmparam.xpp.flags |= XDF_IGNORE_WHITESPACE; - if (options.flags & GIT_MERGE_FILE_IGNORE_WHITESPACE_CHANGE) - xmparam.xpp.flags |= XDF_IGNORE_WHITESPACE_CHANGE; - if (options.flags & GIT_MERGE_FILE_IGNORE_WHITESPACE_EOL) - xmparam.xpp.flags |= XDF_IGNORE_WHITESPACE_AT_EOL; - - if (options.flags & GIT_MERGE_FILE_DIFF_PATIENCE) - xmparam.xpp.flags |= XDF_PATIENCE_DIFF; - - if (options.flags & GIT_MERGE_FILE_DIFF_MINIMAL) - xmparam.xpp.flags |= XDF_NEED_MINIMAL; - - if ((xdl_result = xdl_merge(&ancestor_mmfile, &our_mmfile, - &their_mmfile, &xmparam, &mmbuffer)) < 0) { - giterr_set(GITERR_MERGE, "Failed to merge files."); - error = -1; - goto done; - } - - if ((path = merge_file_best_path(ancestor, ours, theirs)) != NULL && - (out->path = strdup(path)) == NULL) { - error = -1; - goto done; - } - - out->automergeable = (xdl_result == 0); - out->ptr = (const char *)mmbuffer.ptr; - out->len = mmbuffer.size; - out->mode = merge_file_best_mode(ancestor, ours, theirs); - -done: - if (error < 0) - git_merge_file_result_free(out); - - return error; -} - -static git_merge_file_input *git_merge_file__normalize_inputs( - git_merge_file_input *out, - const git_merge_file_input *given) -{ - memcpy(out, given, sizeof(git_merge_file_input)); - - if (!out->path) - out->path = "file.txt"; - - if (!out->mode) - out->mode = 0100644; - - return out; -} - -int git_merge_file( - git_merge_file_result *out, - const git_merge_file_input *ancestor, - const git_merge_file_input *ours, - const git_merge_file_input *theirs, - const git_merge_file_options *options) -{ - git_merge_file_input inputs[3] = { {0} }; - - assert(out && ours && theirs); - - memset(out, 0x0, sizeof(git_merge_file_result)); - - if (ancestor) - ancestor = git_merge_file__normalize_inputs(&inputs[0], ancestor); - - ours = git_merge_file__normalize_inputs(&inputs[1], ours); - theirs = git_merge_file__normalize_inputs(&inputs[2], theirs); - - return git_merge_file__from_inputs(out, ancestor, ours, theirs, options); -} - -int git_merge_file_from_index( - git_merge_file_result *out, - git_repository *repo, - const git_index_entry *ancestor, - const git_index_entry *ours, - const git_index_entry *theirs, - const git_merge_file_options *options) -{ - git_merge_file_input inputs[3] = { {0} }, - *ancestor_input = NULL, *our_input = NULL, *their_input = NULL; - git_odb *odb = NULL; - git_odb_object *odb_object[3] = { 0 }; - int error = 0; - - assert(out && repo && ours && theirs); - - memset(out, 0x0, sizeof(git_merge_file_result)); - - if ((error = git_repository_odb(&odb, repo)) < 0) - goto done; - - if (ancestor) { - if ((error = git_merge_file__input_from_index( - &inputs[0], &odb_object[0], odb, ancestor)) < 0) - goto done; - - ancestor_input = &inputs[0]; - } - - if ((error = git_merge_file__input_from_index( - &inputs[1], &odb_object[1], odb, ours)) < 0) - goto done; - - our_input = &inputs[1]; - - if ((error = git_merge_file__input_from_index( - &inputs[2], &odb_object[2], odb, theirs)) < 0) - goto done; - - their_input = &inputs[2]; - - if ((error = git_merge_file__from_inputs(out, - ancestor_input, our_input, their_input, options)) < 0) - goto done; - -done: - git_odb_object_free(odb_object[0]); - git_odb_object_free(odb_object[1]); - git_odb_object_free(odb_object[2]); - git_odb_free(odb); - - return error; -} - -void git_merge_file_result_free(git_merge_file_result *result) -{ - if (result == NULL) - return; - - git__free((char *)result->path); - - /* xdiff uses malloc() not git_malloc, so we use free(), not git_free() */ - free((char *)result->ptr); -} diff --git a/vendor/libgit2/src/merge_file.h b/vendor/libgit2/src/merge_file.h deleted file mode 100644 index 263391ee37..0000000000 --- a/vendor/libgit2/src/merge_file.h +++ /dev/null @@ -1,14 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_filediff_h__ -#define INCLUDE_filediff_h__ - -#include "xdiff/xdiff.h" - -#include "git2/merge.h" - -#endif diff --git a/vendor/libgit2/src/message.c b/vendor/libgit2/src/message.c deleted file mode 100644 index 6c5a2379fc..0000000000 --- a/vendor/libgit2/src/message.c +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#include "message.h" - -static size_t line_length_without_trailing_spaces(const char *line, size_t len) -{ - while (len) { - unsigned char c = line[len - 1]; - if (!git__isspace(c)) - break; - len--; - } - - return len; -} - -/* Greatly inspired from git.git "stripspace" */ -/* see https://github.com/git/git/blob/497215d8811ac7b8955693ceaad0899ecd894ed2/builtin/stripspace.c#L4-67 */ -int git_message_prettify(git_buf *message_out, const char *message, int strip_comments, char comment_char) -{ - const size_t message_len = strlen(message); - - int consecutive_empty_lines = 0; - size_t i, line_length, rtrimmed_line_length; - char *next_newline; - - git_buf_sanitize(message_out); - - for (i = 0; i < strlen(message); i += line_length) { - next_newline = memchr(message + i, '\n', message_len - i); - - if (next_newline != NULL) { - line_length = next_newline - (message + i) + 1; - } else { - line_length = message_len - i; - } - - if (strip_comments && line_length && message[i] == comment_char) - continue; - - rtrimmed_line_length = line_length_without_trailing_spaces(message + i, line_length); - - if (!rtrimmed_line_length) { - consecutive_empty_lines++; - continue; - } - - if (consecutive_empty_lines > 0 && message_out->size > 0) - git_buf_putc(message_out, '\n'); - - consecutive_empty_lines = 0; - git_buf_put(message_out, message + i, rtrimmed_line_length); - git_buf_putc(message_out, '\n'); - } - - return git_buf_oom(message_out) ? -1 : 0; -} diff --git a/vendor/libgit2/src/message.h b/vendor/libgit2/src/message.h deleted file mode 100644 index 3c4b8dc455..0000000000 --- a/vendor/libgit2/src/message.h +++ /dev/null @@ -1,15 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_message_h__ -#define INCLUDE_message_h__ - -#include "git2/message.h" -#include "buffer.h" - -int git_message__prettify(git_buf *message_out, const char *message, int strip_comments); - -#endif /* INCLUDE_message_h__ */ diff --git a/vendor/libgit2/src/mwindow.c b/vendor/libgit2/src/mwindow.c deleted file mode 100644 index 55c8d894b5..0000000000 --- a/vendor/libgit2/src/mwindow.c +++ /dev/null @@ -1,430 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#include "common.h" -#include "mwindow.h" -#include "vector.h" -#include "fileops.h" -#include "map.h" -#include "global.h" -#include "strmap.h" -#include "pack.h" - -GIT__USE_STRMAP - -#define DEFAULT_WINDOW_SIZE \ - (sizeof(void*) >= 8 \ - ? 1 * 1024 * 1024 * 1024 \ - : 32 * 1024 * 1024) - -#define DEFAULT_MAPPED_LIMIT \ - ((1024 * 1024) * (sizeof(void*) >= 8 ? 8192ULL : 256UL)) - -size_t git_mwindow__window_size = DEFAULT_WINDOW_SIZE; -size_t git_mwindow__mapped_limit = DEFAULT_MAPPED_LIMIT; - -/* Whenever you want to read or modify this, grab git__mwindow_mutex */ -static git_mwindow_ctl mem_ctl; - -/* Global list of mwindow files, to open packs once across repos */ -git_strmap *git__pack_cache = NULL; - -/** - * Run under mwindow lock - */ -int git_mwindow_files_init(void) -{ - if (git__pack_cache) - return 0; - - git__on_shutdown(git_mwindow_files_free); - - return git_strmap_alloc(&git__pack_cache); -} - -void git_mwindow_files_free(void) -{ - git_strmap *tmp = git__pack_cache; - - git__pack_cache = NULL; - git_strmap_free(tmp); -} - -int git_mwindow_get_pack(struct git_pack_file **out, const char *path) -{ - int error; - char *packname; - git_strmap_iter pos; - struct git_pack_file *pack; - - if ((error = git_packfile__name(&packname, path)) < 0) - return error; - - if (git_mutex_lock(&git__mwindow_mutex) < 0) { - giterr_set(GITERR_OS, "failed to lock mwindow mutex"); - return -1; - } - - if (git_mwindow_files_init() < 0) { - git_mutex_unlock(&git__mwindow_mutex); - git__free(packname); - return -1; - } - - pos = git_strmap_lookup_index(git__pack_cache, packname); - git__free(packname); - - if (git_strmap_valid_index(git__pack_cache, pos)) { - pack = git_strmap_value_at(git__pack_cache, pos); - git_atomic_inc(&pack->refcount); - - git_mutex_unlock(&git__mwindow_mutex); - *out = pack; - return 0; - } - - /* If we didn't find it, we need to create it */ - if ((error = git_packfile_alloc(&pack, path)) < 0) { - git_mutex_unlock(&git__mwindow_mutex); - return error; - } - - git_atomic_inc(&pack->refcount); - - git_strmap_insert(git__pack_cache, pack->pack_name, pack, error); - git_mutex_unlock(&git__mwindow_mutex); - - if (error < 0) { - git_packfile_free(pack); - return -1; - } - - *out = pack; - return 0; -} - -void git_mwindow_put_pack(struct git_pack_file *pack) -{ - int count; - git_strmap_iter pos; - - if (git_mutex_lock(&git__mwindow_mutex) < 0) - return; - - /* put before get would be a corrupted state */ - assert(git__pack_cache); - - pos = git_strmap_lookup_index(git__pack_cache, pack->pack_name); - /* if we cannot find it, the state is corrupted */ - assert(git_strmap_valid_index(git__pack_cache, pos)); - - count = git_atomic_dec(&pack->refcount); - if (count == 0) { - git_strmap_delete_at(git__pack_cache, pos); - git_packfile_free(pack); - } - - git_mutex_unlock(&git__mwindow_mutex); - return; -} - -void git_mwindow_free_all(git_mwindow_file *mwf) -{ - if (git_mutex_lock(&git__mwindow_mutex)) { - giterr_set(GITERR_THREAD, "unable to lock mwindow mutex"); - return; - } - - git_mwindow_free_all_locked(mwf); - - git_mutex_unlock(&git__mwindow_mutex); -} - -/* - * Free all the windows in a sequence, typically because we're done - * with the file - */ -void git_mwindow_free_all_locked(git_mwindow_file *mwf) -{ - git_mwindow_ctl *ctl = &mem_ctl; - size_t i; - - /* - * Remove these windows from the global list - */ - for (i = 0; i < ctl->windowfiles.length; ++i){ - if (git_vector_get(&ctl->windowfiles, i) == mwf) { - git_vector_remove(&ctl->windowfiles, i); - break; - } - } - - if (ctl->windowfiles.length == 0) { - git_vector_free(&ctl->windowfiles); - ctl->windowfiles.contents = NULL; - } - - while (mwf->windows) { - git_mwindow *w = mwf->windows; - assert(w->inuse_cnt == 0); - - ctl->mapped -= w->window_map.len; - ctl->open_windows--; - - git_futils_mmap_free(&w->window_map); - - mwf->windows = w->next; - git__free(w); - } -} - -/* - * Check if a window 'win' contains the address 'offset' - */ -int git_mwindow_contains(git_mwindow *win, git_off_t offset) -{ - git_off_t win_off = win->offset; - return win_off <= offset - && offset <= (git_off_t)(win_off + win->window_map.len); -} - -/* - * Find the least-recently-used window in a file - */ -static void git_mwindow_scan_lru( - git_mwindow_file *mwf, - git_mwindow **lru_w, - git_mwindow **lru_l) -{ - git_mwindow *w, *w_l; - - for (w_l = NULL, w = mwf->windows; w; w = w->next) { - if (!w->inuse_cnt) { - /* - * If the current one is more recent than the last one, - * store it in the output parameter. If lru_w is NULL, - * it's the first loop, so store it as well. - */ - if (!*lru_w || w->last_used < (*lru_w)->last_used) { - *lru_w = w; - *lru_l = w_l; - } - } - w_l = w; - } -} - -/* - * Close the least recently used window. You should check to see if - * the file descriptors need closing from time to time. Called under - * lock from new_window. - */ -static int git_mwindow_close_lru(git_mwindow_file *mwf) -{ - git_mwindow_ctl *ctl = &mem_ctl; - size_t i; - git_mwindow *lru_w = NULL, *lru_l = NULL, **list = &mwf->windows; - - /* FIXME: Does this give us any advantage? */ - if(mwf->windows) - git_mwindow_scan_lru(mwf, &lru_w, &lru_l); - - for (i = 0; i < ctl->windowfiles.length; ++i) { - git_mwindow *last = lru_w; - git_mwindow_file *cur = git_vector_get(&ctl->windowfiles, i); - git_mwindow_scan_lru(cur, &lru_w, &lru_l); - if (lru_w != last) - list = &cur->windows; - } - - if (!lru_w) { - giterr_set(GITERR_OS, "Failed to close memory window. Couldn't find LRU"); - return -1; - } - - ctl->mapped -= lru_w->window_map.len; - git_futils_mmap_free(&lru_w->window_map); - - if (lru_l) - lru_l->next = lru_w->next; - else - *list = lru_w->next; - - git__free(lru_w); - ctl->open_windows--; - - return 0; -} - -/* This gets called under lock from git_mwindow_open */ -static git_mwindow *new_window( - git_mwindow_file *mwf, - git_file fd, - git_off_t size, - git_off_t offset) -{ - git_mwindow_ctl *ctl = &mem_ctl; - size_t walign = git_mwindow__window_size / 2; - git_off_t len; - git_mwindow *w; - - w = git__malloc(sizeof(*w)); - - if (w == NULL) - return NULL; - - memset(w, 0x0, sizeof(*w)); - w->offset = (offset / walign) * walign; - - len = size - w->offset; - if (len > (git_off_t)git_mwindow__window_size) - len = (git_off_t)git_mwindow__window_size; - - ctl->mapped += (size_t)len; - - while (git_mwindow__mapped_limit < ctl->mapped && - git_mwindow_close_lru(mwf) == 0) /* nop */; - - /* - * We treat `mapped_limit` as a soft limit. If we can't find a - * window to close and are above the limit, we still mmap the new - * window. - */ - - if (git_futils_mmap_ro(&w->window_map, fd, w->offset, (size_t)len) < 0) { - git__free(w); - return NULL; - } - - ctl->mmap_calls++; - ctl->open_windows++; - - if (ctl->mapped > ctl->peak_mapped) - ctl->peak_mapped = ctl->mapped; - - if (ctl->open_windows > ctl->peak_open_windows) - ctl->peak_open_windows = ctl->open_windows; - - return w; -} - -/* - * Open a new window, closing the least recenty used until we have - * enough space. Don't forget to add it to your list - */ -unsigned char *git_mwindow_open( - git_mwindow_file *mwf, - git_mwindow **cursor, - git_off_t offset, - size_t extra, - unsigned int *left) -{ - git_mwindow_ctl *ctl = &mem_ctl; - git_mwindow *w = *cursor; - - if (git_mutex_lock(&git__mwindow_mutex)) { - giterr_set(GITERR_THREAD, "unable to lock mwindow mutex"); - return NULL; - } - - if (!w || !(git_mwindow_contains(w, offset) && git_mwindow_contains(w, offset + extra))) { - if (w) { - w->inuse_cnt--; - } - - for (w = mwf->windows; w; w = w->next) { - if (git_mwindow_contains(w, offset) && - git_mwindow_contains(w, offset + extra)) - break; - } - - /* - * If there isn't a suitable window, we need to create a new - * one. - */ - if (!w) { - w = new_window(mwf, mwf->fd, mwf->size, offset); - if (w == NULL) { - git_mutex_unlock(&git__mwindow_mutex); - return NULL; - } - w->next = mwf->windows; - mwf->windows = w; - } - } - - /* If we changed w, store it in the cursor */ - if (w != *cursor) { - w->last_used = ctl->used_ctr++; - w->inuse_cnt++; - *cursor = w; - } - - offset -= w->offset; - - if (left) - *left = (unsigned int)(w->window_map.len - offset); - - git_mutex_unlock(&git__mwindow_mutex); - return (unsigned char *) w->window_map.data + offset; -} - -int git_mwindow_file_register(git_mwindow_file *mwf) -{ - git_mwindow_ctl *ctl = &mem_ctl; - int ret; - - if (git_mutex_lock(&git__mwindow_mutex)) { - giterr_set(GITERR_THREAD, "unable to lock mwindow mutex"); - return -1; - } - - if (ctl->windowfiles.length == 0 && - git_vector_init(&ctl->windowfiles, 8, NULL) < 0) { - git_mutex_unlock(&git__mwindow_mutex); - return -1; - } - - ret = git_vector_insert(&ctl->windowfiles, mwf); - git_mutex_unlock(&git__mwindow_mutex); - - return ret; -} - -void git_mwindow_file_deregister(git_mwindow_file *mwf) -{ - git_mwindow_ctl *ctl = &mem_ctl; - git_mwindow_file *cur; - size_t i; - - if (git_mutex_lock(&git__mwindow_mutex)) - return; - - git_vector_foreach(&ctl->windowfiles, i, cur) { - if (cur == mwf) { - git_vector_remove(&ctl->windowfiles, i); - git_mutex_unlock(&git__mwindow_mutex); - return; - } - } - git_mutex_unlock(&git__mwindow_mutex); -} - -void git_mwindow_close(git_mwindow **window) -{ - git_mwindow *w = *window; - if (w) { - if (git_mutex_lock(&git__mwindow_mutex)) { - giterr_set(GITERR_THREAD, "unable to lock mwindow mutex"); - return; - } - - w->inuse_cnt--; - git_mutex_unlock(&git__mwindow_mutex); - *window = NULL; - } -} diff --git a/vendor/libgit2/src/mwindow.h b/vendor/libgit2/src/mwindow.h deleted file mode 100644 index 63418e4586..0000000000 --- a/vendor/libgit2/src/mwindow.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#ifndef INCLUDE_mwindow__ -#define INCLUDE_mwindow__ - -#include "map.h" -#include "vector.h" - -typedef struct git_mwindow { - struct git_mwindow *next; - git_map window_map; - git_off_t offset; - size_t last_used; - size_t inuse_cnt; -} git_mwindow; - -typedef struct git_mwindow_file { - git_mwindow *windows; - int fd; - git_off_t size; -} git_mwindow_file; - -typedef struct git_mwindow_ctl { - size_t mapped; - unsigned int open_windows; - unsigned int mmap_calls; - unsigned int peak_open_windows; - size_t peak_mapped; - size_t used_ctr; - git_vector windowfiles; -} git_mwindow_ctl; - -int git_mwindow_contains(git_mwindow *win, git_off_t offset); -void git_mwindow_free_all(git_mwindow_file *mwf); /* locks */ -void git_mwindow_free_all_locked(git_mwindow_file *mwf); /* run under lock */ -unsigned char *git_mwindow_open(git_mwindow_file *mwf, git_mwindow **cursor, git_off_t offset, size_t extra, unsigned int *left); -int git_mwindow_file_register(git_mwindow_file *mwf); -void git_mwindow_file_deregister(git_mwindow_file *mwf); -void git_mwindow_close(git_mwindow **w_cursor); - -int git_mwindow_files_init(void); -void git_mwindow_files_free(void); - -struct git_pack_file; /* just declaration to avoid cyclical includes */ -int git_mwindow_get_pack(struct git_pack_file **out, const char *path); -void git_mwindow_put_pack(struct git_pack_file *pack); - -#endif diff --git a/vendor/libgit2/src/netops.c b/vendor/libgit2/src/netops.c deleted file mode 100644 index 5e80755976..0000000000 --- a/vendor/libgit2/src/netops.c +++ /dev/null @@ -1,282 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#include -#include "git2/errors.h" - -#include "common.h" -#include "netops.h" -#include "posix.h" -#include "buffer.h" -#include "http_parser.h" -#include "global.h" - -int gitno_recv(gitno_buffer *buf) -{ - return buf->recv(buf); -} - -void gitno_buffer_setup_callback( - gitno_buffer *buf, - char *data, - size_t len, - int (*recv)(gitno_buffer *buf), void *cb_data) -{ - memset(data, 0x0, len); - buf->data = data; - buf->len = len; - buf->offset = 0; - buf->recv = recv; - buf->cb_data = cb_data; -} - -static int recv_stream(gitno_buffer *buf) -{ - git_stream *io = (git_stream *) buf->cb_data; - int ret; - - ret = git_stream_read(io, buf->data + buf->offset, buf->len - buf->offset); - if (ret < 0) - return -1; - - buf->offset += ret; - return ret; -} - -void gitno_buffer_setup_fromstream(git_stream *st, gitno_buffer *buf, char *data, size_t len) -{ - memset(data, 0x0, len); - buf->data = data; - buf->len = len; - buf->offset = 0; - buf->recv = recv_stream; - buf->cb_data = st; -} - -/* Consume up to ptr and move the rest of the buffer to the beginning */ -void gitno_consume(gitno_buffer *buf, const char *ptr) -{ - size_t consumed; - - assert(ptr - buf->data >= 0); - assert(ptr - buf->data <= (int) buf->len); - - consumed = ptr - buf->data; - - memmove(buf->data, ptr, buf->offset - consumed); - memset(buf->data + buf->offset, 0x0, buf->len - buf->offset); - buf->offset -= consumed; -} - -/* Consume const bytes and move the rest of the buffer to the beginning */ -void gitno_consume_n(gitno_buffer *buf, size_t cons) -{ - memmove(buf->data, buf->data + cons, buf->len - buf->offset); - memset(buf->data + cons, 0x0, buf->len - buf->offset); - buf->offset -= cons; -} - -/* Match host names according to RFC 2818 rules */ -int gitno__match_host(const char *pattern, const char *host) -{ - for (;;) { - char c = git__tolower(*pattern++); - - if (c == '\0') - return *host ? -1 : 0; - - if (c == '*') { - c = *pattern; - /* '*' at the end matches everything left */ - if (c == '\0') - return 0; - - /* - * We've found a pattern, so move towards the next matching - * char. The '.' is handled specially because wildcards aren't - * allowed to cross subdomains. - */ - - while(*host) { - char h = git__tolower(*host); - if (c == h) - return gitno__match_host(pattern, host++); - if (h == '.') - return gitno__match_host(pattern, host); - host++; - } - return -1; - } - - if (c != git__tolower(*host++)) - return -1; - } - - return -1; -} - -static const char *prefix_http = "http://"; -static const char *prefix_https = "https://"; - -int gitno_connection_data_from_url( - gitno_connection_data *data, - const char *url, - const char *service_suffix) -{ - int error = -1; - const char *default_port = NULL, *path_search_start = NULL; - char *original_host = NULL; - - /* service_suffix is optional */ - assert(data && url); - - /* Save these for comparison later */ - original_host = data->host; - data->host = NULL; - gitno_connection_data_free_ptrs(data); - - if (!git__prefixcmp(url, prefix_http)) { - path_search_start = url + strlen(prefix_http); - default_port = "80"; - - if (data->use_ssl) { - giterr_set(GITERR_NET, "Redirect from HTTPS to HTTP is not allowed"); - goto cleanup; - } - } else if (!git__prefixcmp(url, prefix_https)) { - path_search_start = url + strlen(prefix_https); - default_port = "443"; - data->use_ssl = true; - } else if (url[0] == '/') - default_port = data->use_ssl ? "443" : "80"; - - if (!default_port) { - giterr_set(GITERR_NET, "Unrecognized URL prefix"); - goto cleanup; - } - - error = gitno_extract_url_parts( - &data->host, &data->port, &data->path, &data->user, &data->pass, - url, default_port); - - if (url[0] == '/') { - /* Relative redirect; reuse original host name and port */ - path_search_start = url; - git__free(data->host); - data->host = original_host; - original_host = NULL; - } - - if (!error) { - const char *path = strchr(path_search_start, '/'); - size_t pathlen = strlen(path); - size_t suffixlen = service_suffix ? strlen(service_suffix) : 0; - - if (suffixlen && - !memcmp(path + pathlen - suffixlen, service_suffix, suffixlen)) { - git__free(data->path); - data->path = git__strndup(path, pathlen - suffixlen); - } else { - git__free(data->path); - data->path = git__strdup(path); - } - - /* Check for errors in the resulting data */ - if (original_host && url[0] != '/' && strcmp(original_host, data->host)) { - giterr_set(GITERR_NET, "Cross host redirect not allowed"); - error = -1; - } - } - -cleanup: - if (original_host) git__free(original_host); - return error; -} - -void gitno_connection_data_free_ptrs(gitno_connection_data *d) -{ - git__free(d->host); d->host = NULL; - git__free(d->port); d->port = NULL; - git__free(d->path); d->path = NULL; - git__free(d->user); d->user = NULL; - git__free(d->pass); d->pass = NULL; -} - -#define hex2c(c) ((c | 32) % 39 - 9) -static char* unescape(char *str) -{ - int x, y; - int len = (int)strlen(str); - - for (x=y=0; str[y]; ++x, ++y) { - if ((str[x] = str[y]) == '%') { - if (y < len-2 && isxdigit(str[y+1]) && isxdigit(str[y+2])) { - str[x] = (hex2c(str[y+1]) << 4) + hex2c(str[y+2]); - y += 2; - } - } - } - str[x] = '\0'; - return str; -} - -int gitno_extract_url_parts( - char **host, - char **port, - char **path, - char **username, - char **password, - const char *url, - const char *default_port) -{ - struct http_parser_url u = {0}; - const char *_host, *_port, *_path, *_userinfo; - - if (http_parser_parse_url(url, strlen(url), false, &u)) { - giterr_set(GITERR_NET, "Malformed URL '%s'", url); - return GIT_EINVALIDSPEC; - } - - _host = url+u.field_data[UF_HOST].off; - _port = url+u.field_data[UF_PORT].off; - _path = url+u.field_data[UF_PATH].off; - _userinfo = url+u.field_data[UF_USERINFO].off; - - if (u.field_set & (1 << UF_HOST)) { - *host = git__substrdup(_host, u.field_data[UF_HOST].len); - GITERR_CHECK_ALLOC(*host); - } - - if (u.field_set & (1 << UF_PORT)) - *port = git__substrdup(_port, u.field_data[UF_PORT].len); - else - *port = git__strdup(default_port); - GITERR_CHECK_ALLOC(*port); - - if (u.field_set & (1 << UF_PATH)) { - *path = git__substrdup(_path, u.field_data[UF_PATH].len); - GITERR_CHECK_ALLOC(*path); - } else { - giterr_set(GITERR_NET, "invalid url, missing path"); - return GIT_EINVALIDSPEC; - } - - if (u.field_set & (1 << UF_USERINFO)) { - const char *colon = memchr(_userinfo, ':', u.field_data[UF_USERINFO].len); - if (colon) { - *username = unescape(git__substrdup(_userinfo, colon - _userinfo)); - *password = unescape(git__substrdup(colon+1, u.field_data[UF_USERINFO].len - (colon+1-_userinfo))); - GITERR_CHECK_ALLOC(*password); - } else { - *username = git__substrdup(_userinfo, u.field_data[UF_USERINFO].len); - } - GITERR_CHECK_ALLOC(*username); - - } - - return 0; -} diff --git a/vendor/libgit2/src/netops.h b/vendor/libgit2/src/netops.h deleted file mode 100644 index b7170a0f2e..0000000000 --- a/vendor/libgit2/src/netops.h +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_netops_h__ -#define INCLUDE_netops_h__ - -#include "posix.h" -#include "common.h" -#include "stream.h" - -#ifdef GIT_OPENSSL -# include -#endif - -typedef struct gitno_ssl { -#ifdef GIT_OPENSSL - SSL *ssl; -#else - size_t dummy; -#endif -} gitno_ssl; - -/* Represents a socket that may or may not be using SSL */ -typedef struct gitno_socket { - GIT_SOCKET socket; - gitno_ssl ssl; -} gitno_socket; - -typedef struct gitno_buffer { - char *data; - size_t len; - size_t offset; - int (*recv)(struct gitno_buffer *buffer); - void *cb_data; -} gitno_buffer; - -/* Flags to gitno_connect */ -enum { - /* Attempt to create an SSL connection. */ - GITNO_CONNECT_SSL = 1, -}; - -/** - * Check if the name in a cert matches the wanted hostname - * - * Check if a pattern from a certificate matches the hostname we - * wanted to connect to according to RFC2818 rules (which specifies - * HTTP over TLS). Mainly, an asterisk matches anything, but is - * limited to a single url component. - * - * Note that this does not set an error message. It expects the user - * to provide the message for the user. - */ -int gitno__match_host(const char *pattern, const char *host); - -void gitno_buffer_setup_fromstream(git_stream *st, gitno_buffer *buf, char *data, size_t len); -void gitno_buffer_setup_callback(gitno_buffer *buf, char *data, size_t len, int (*recv)(gitno_buffer *buf), void *cb_data); -int gitno_recv(gitno_buffer *buf); - -void gitno_consume(gitno_buffer *buf, const char *ptr); -void gitno_consume_n(gitno_buffer *buf, size_t cons); - -typedef struct gitno_connection_data { - char *host; - char *port; - char *path; - char *user; - char *pass; - bool use_ssl; -} gitno_connection_data; - -/* - * This replaces all the pointers in `data` with freshly-allocated strings, - * that the caller is responsible for freeing. - * `gitno_connection_data_free_ptrs` is good for this. - */ - -int gitno_connection_data_from_url( - gitno_connection_data *data, - const char *url, - const char *service_suffix); - -/* This frees all the pointers IN the struct, but not the struct itself. */ -void gitno_connection_data_free_ptrs(gitno_connection_data *data); - -int gitno_extract_url_parts( - char **host, - char **port, - char **path, - char **username, - char **password, - const char *url, - const char *default_port); - -#endif diff --git a/vendor/libgit2/src/notes.c b/vendor/libgit2/src/notes.c deleted file mode 100644 index ef4b41b316..0000000000 --- a/vendor/libgit2/src/notes.c +++ /dev/null @@ -1,694 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#include "notes.h" - -#include "git2.h" -#include "refs.h" -#include "config.h" -#include "iterator.h" -#include "signature.h" - -static int note_error_notfound(void) -{ - giterr_set(GITERR_INVALID, "Note could not be found"); - return GIT_ENOTFOUND; -} - -static int find_subtree_in_current_level( - git_tree **out, - git_repository *repo, - git_tree *parent, - const char *annotated_object_sha, - int fanout) -{ - size_t i; - const git_tree_entry *entry; - - *out = NULL; - - if (parent == NULL) - return note_error_notfound(); - - for (i = 0; i < git_tree_entrycount(parent); i++) { - entry = git_tree_entry_byindex(parent, i); - - if (!git__ishex(git_tree_entry_name(entry))) - continue; - - if (S_ISDIR(git_tree_entry_filemode(entry)) - && strlen(git_tree_entry_name(entry)) == 2 - && !strncmp(git_tree_entry_name(entry), annotated_object_sha + fanout, 2)) - return git_tree_lookup(out, repo, git_tree_entry_id(entry)); - - /* Not a DIR, so do we have an already existing blob? */ - if (!strcmp(git_tree_entry_name(entry), annotated_object_sha + fanout)) - return GIT_EEXISTS; - } - - return note_error_notfound(); -} - -static int find_subtree_r(git_tree **out, git_tree *root, - git_repository *repo, const char *target, int *fanout) -{ - int error; - git_tree *subtree = NULL; - - *out = NULL; - - error = find_subtree_in_current_level(&subtree, repo, root, target, *fanout); - if (error == GIT_EEXISTS) - return git_tree_lookup(out, repo, git_tree_id(root)); - - if (error < 0) - return error; - - *fanout += 2; - error = find_subtree_r(out, subtree, repo, target, fanout); - git_tree_free(subtree); - - return error; -} - -static int find_blob(git_oid *blob, git_tree *tree, const char *target) -{ - size_t i; - const git_tree_entry *entry; - - for (i=0; iid, note_oid); - - if (git_signature_dup(¬e->author, git_commit_author(commit)) < 0 || - git_signature_dup(¬e->committer, git_commit_committer(commit)) < 0) - return -1; - - note->message = git__strndup(git_blob_rawcontent(blob), git_blob_rawsize(blob)); - GITERR_CHECK_ALLOC(note->message); - - *out = note; - return 0; -} - -static int note_lookup( - git_note **out, - git_repository *repo, - git_commit *commit, - git_tree *tree, - const char *target) -{ - int error, fanout = 0; - git_oid oid; - git_blob *blob = NULL; - git_note *note = NULL; - git_tree *subtree = NULL; - - if ((error = find_subtree_r(&subtree, tree, repo, target, &fanout)) < 0) - goto cleanup; - - if ((error = find_blob(&oid, subtree, target + fanout)) < 0) - goto cleanup; - - if ((error = git_blob_lookup(&blob, repo, &oid)) < 0) - goto cleanup; - - if ((error = note_new(¬e, &oid, commit, blob)) < 0) - goto cleanup; - - *out = note; - -cleanup: - git_tree_free(subtree); - git_blob_free(blob); - return error; -} - -static int note_remove(git_repository *repo, - const git_signature *author, const git_signature *committer, - const char *notes_ref, git_tree *tree, - const char *target, git_commit **parents) -{ - int error; - git_tree *tree_after_removal = NULL; - git_oid oid; - - if ((error = manipulate_note_in_tree_r( - &tree_after_removal, repo, tree, NULL, target, 0, - remove_note_in_tree_eexists_cb, remove_note_in_tree_enotfound_cb)) < 0) - goto cleanup; - - error = git_commit_create(&oid, repo, notes_ref, author, committer, - NULL, GIT_NOTES_DEFAULT_MSG_RM, - tree_after_removal, - *parents == NULL ? 0 : 1, - (const git_commit **) parents); - -cleanup: - git_tree_free(tree_after_removal); - return error; -} - -static int note_get_default_ref(char **out, git_repository *repo) -{ - git_config *cfg; - int ret = git_repository_config__weakptr(&cfg, repo); - - *out = (ret != 0) ? NULL : git_config__get_string_force( - cfg, "core.notesref", GIT_NOTES_DEFAULT_REF); - - return ret; -} - -static int normalize_namespace(char **out, git_repository *repo, const char *notes_ref) -{ - if (notes_ref) { - *out = git__strdup(notes_ref); - GITERR_CHECK_ALLOC(*out); - return 0; - } - - return note_get_default_ref(out, repo); -} - -static int retrieve_note_tree_and_commit( - git_tree **tree_out, - git_commit **commit_out, - char **notes_ref_out, - git_repository *repo, - const char *notes_ref) -{ - int error; - git_oid oid; - - if ((error = normalize_namespace(notes_ref_out, repo, notes_ref)) < 0) - return error; - - if ((error = git_reference_name_to_id(&oid, repo, *notes_ref_out)) < 0) - return error; - - if (git_commit_lookup(commit_out, repo, &oid) < 0) - return error; - - if ((error = git_commit_tree(tree_out, *commit_out)) < 0) - return error; - - return 0; -} - -int git_note_read(git_note **out, git_repository *repo, - const char *notes_ref_in, const git_oid *oid) -{ - int error; - char *target = NULL, *notes_ref = NULL; - git_tree *tree = NULL; - git_commit *commit = NULL; - - target = git_oid_allocfmt(oid); - GITERR_CHECK_ALLOC(target); - - if (!(error = retrieve_note_tree_and_commit( - &tree, &commit, ¬es_ref, repo, notes_ref_in))) - error = note_lookup(out, repo, commit, tree, target); - - git__free(notes_ref); - git__free(target); - git_tree_free(tree); - git_commit_free(commit); - return error; -} - -int git_note_create( - git_oid *out, - git_repository *repo, - const char *notes_ref_in, - const git_signature *author, - const git_signature *committer, - const git_oid *oid, - const char *note, - int allow_note_overwrite) -{ - int error; - char *target = NULL, *notes_ref = NULL; - git_commit *commit = NULL; - git_tree *tree = NULL; - - target = git_oid_allocfmt(oid); - GITERR_CHECK_ALLOC(target); - - error = retrieve_note_tree_and_commit(&tree, &commit, ¬es_ref, repo, notes_ref_in); - - if (error < 0 && error != GIT_ENOTFOUND) - goto cleanup; - - error = note_write(out, repo, author, committer, notes_ref, - note, tree, target, &commit, allow_note_overwrite); - -cleanup: - git__free(notes_ref); - git__free(target); - git_commit_free(commit); - git_tree_free(tree); - return error; -} - -int git_note_remove(git_repository *repo, const char *notes_ref_in, - const git_signature *author, const git_signature *committer, - const git_oid *oid) -{ - int error; - char *target = NULL, *notes_ref; - git_commit *commit = NULL; - git_tree *tree = NULL; - - target = git_oid_allocfmt(oid); - GITERR_CHECK_ALLOC(target); - - if (!(error = retrieve_note_tree_and_commit( - &tree, &commit, ¬es_ref, repo, notes_ref_in))) - error = note_remove( - repo, author, committer, notes_ref, tree, target, &commit); - - git__free(notes_ref); - git__free(target); - git_commit_free(commit); - git_tree_free(tree); - return error; -} - -int git_note_default_ref(git_buf *out, git_repository *repo) -{ - char *default_ref; - int error; - - assert(out && repo); - - git_buf_sanitize(out); - - if ((error = note_get_default_ref(&default_ref, repo)) < 0) - return error; - - git_buf_attach(out, default_ref, strlen(default_ref)); - return 0; -} - -const git_signature *git_note_committer(const git_note *note) -{ - assert(note); - return note->committer; -} - -const git_signature *git_note_author(const git_note *note) -{ - assert(note); - return note->author; -} - -const char * git_note_message(const git_note *note) -{ - assert(note); - return note->message; -} - -const git_oid * git_note_id(const git_note *note) -{ - assert(note); - return ¬e->id; -} - -void git_note_free(git_note *note) -{ - if (note == NULL) - return; - - git_signature_free(note->committer); - git_signature_free(note->author); - git__free(note->message); - git__free(note); -} - -static int process_entry_path( - const char* entry_path, - git_oid *annotated_object_id) -{ - int error = 0; - size_t i = 0, j = 0, len; - git_buf buf = GIT_BUF_INIT; - - if ((error = git_buf_puts(&buf, entry_path)) < 0) - goto cleanup; - - len = git_buf_len(&buf); - - while (i < len) { - if (buf.ptr[i] == '/') { - i++; - continue; - } - - if (git__fromhex(buf.ptr[i]) < 0) { - /* This is not a note entry */ - goto cleanup; - } - - if (i != j) - buf.ptr[j] = buf.ptr[i]; - - i++; - j++; - } - - buf.ptr[j] = '\0'; - buf.size = j; - - if (j != GIT_OID_HEXSZ) { - /* This is not a note entry */ - goto cleanup; - } - - error = git_oid_fromstr(annotated_object_id, buf.ptr); - -cleanup: - git_buf_free(&buf); - return error; -} - -int git_note_foreach( - git_repository *repo, - const char *notes_ref, - git_note_foreach_cb note_cb, - void *payload) -{ - int error; - git_note_iterator *iter = NULL; - git_oid note_id, annotated_id; - - if ((error = git_note_iterator_new(&iter, repo, notes_ref)) < 0) - return error; - - while (!(error = git_note_next(¬e_id, &annotated_id, iter))) { - if ((error = note_cb(¬e_id, &annotated_id, payload)) != 0) { - giterr_set_after_callback(error); - break; - } - } - - if (error == GIT_ITEROVER) - error = 0; - - git_note_iterator_free(iter); - return error; -} - - -void git_note_iterator_free(git_note_iterator *it) -{ - if (it == NULL) - return; - - git_iterator_free(it); -} - - -int git_note_iterator_new( - git_note_iterator **it, - git_repository *repo, - const char *notes_ref_in) -{ - int error; - git_commit *commit = NULL; - git_tree *tree = NULL; - char *notes_ref; - - error = retrieve_note_tree_and_commit(&tree, &commit, ¬es_ref, repo, notes_ref_in); - if (error < 0) - goto cleanup; - - if ((error = git_iterator_for_tree(it, tree, 0, NULL, NULL)) < 0) - git_iterator_free(*it); - -cleanup: - git__free(notes_ref); - git_tree_free(tree); - git_commit_free(commit); - - return error; -} - -int git_note_next( - git_oid* note_id, - git_oid* annotated_id, - git_note_iterator *it) -{ - int error; - const git_index_entry *item; - - if ((error = git_iterator_current(&item, it)) < 0) - return error; - - git_oid_cpy(note_id, &item->id); - - if (!(error = process_entry_path(item->path, annotated_id))) - git_iterator_advance(NULL, it); - - return error; -} diff --git a/vendor/libgit2/src/notes.h b/vendor/libgit2/src/notes.h deleted file mode 100644 index cfc0ca239f..0000000000 --- a/vendor/libgit2/src/notes.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_note_h__ -#define INCLUDE_note_h__ - -#include "common.h" - -#include "git2/oid.h" -#include "git2/types.h" - -#define GIT_NOTES_DEFAULT_REF "refs/notes/commits" - -#define GIT_NOTES_DEFAULT_MSG_ADD \ - "Notes added by 'git_note_create' from libgit2" - -#define GIT_NOTES_DEFAULT_MSG_RM \ - "Notes removed by 'git_note_remove' from libgit2" - -struct git_note { - git_oid id; - - git_signature *author; - git_signature *committer; - - char *message; -}; - -#endif /* INCLUDE_notes_h__ */ diff --git a/vendor/libgit2/src/object.c b/vendor/libgit2/src/object.c deleted file mode 100644 index 1073559fd1..0000000000 --- a/vendor/libgit2/src/object.c +++ /dev/null @@ -1,469 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#include "git2/object.h" - -#include "common.h" -#include "repository.h" - -#include "commit.h" -#include "tree.h" -#include "blob.h" -#include "tag.h" - -static const int OBJECT_BASE_SIZE = 4096; - -typedef struct { - const char *str; /* type name string */ - size_t size; /* size in bytes of the object structure */ - - int (*parse)(void *self, git_odb_object *obj); - void (*free)(void *self); -} git_object_def; - -static git_object_def git_objects_table[] = { - /* 0 = GIT_OBJ__EXT1 */ - { "", 0, NULL, NULL }, - - /* 1 = GIT_OBJ_COMMIT */ - { "commit", sizeof(git_commit), git_commit__parse, git_commit__free }, - - /* 2 = GIT_OBJ_TREE */ - { "tree", sizeof(git_tree), git_tree__parse, git_tree__free }, - - /* 3 = GIT_OBJ_BLOB */ - { "blob", sizeof(git_blob), git_blob__parse, git_blob__free }, - - /* 4 = GIT_OBJ_TAG */ - { "tag", sizeof(git_tag), git_tag__parse, git_tag__free }, - - /* 5 = GIT_OBJ__EXT2 */ - { "", 0, NULL, NULL }, - /* 6 = GIT_OBJ_OFS_DELTA */ - { "OFS_DELTA", 0, NULL, NULL }, - /* 7 = GIT_OBJ_REF_DELTA */ - { "REF_DELTA", 0, NULL, NULL }, -}; - -int git_object__from_odb_object( - git_object **object_out, - git_repository *repo, - git_odb_object *odb_obj, - git_otype type) -{ - int error; - size_t object_size; - git_object_def *def; - git_object *object = NULL; - - assert(object_out); - *object_out = NULL; - - /* Validate type match */ - if (type != GIT_OBJ_ANY && type != odb_obj->cached.type) { - giterr_set(GITERR_INVALID, - "The requested type does not match the type in the ODB"); - return GIT_ENOTFOUND; - } - - if ((object_size = git_object__size(odb_obj->cached.type)) == 0) { - giterr_set(GITERR_INVALID, "The requested type is invalid"); - return GIT_ENOTFOUND; - } - - /* Allocate and initialize base object */ - object = git__calloc(1, object_size); - GITERR_CHECK_ALLOC(object); - - git_oid_cpy(&object->cached.oid, &odb_obj->cached.oid); - object->cached.type = odb_obj->cached.type; - object->cached.size = odb_obj->cached.size; - object->repo = repo; - - /* Parse raw object data */ - def = &git_objects_table[odb_obj->cached.type]; - assert(def->free && def->parse); - - if ((error = def->parse(object, odb_obj)) < 0) - def->free(object); - else - *object_out = git_cache_store_parsed(&repo->objects, object); - - return error; -} - -void git_object__free(void *obj) -{ - git_otype type = ((git_object *)obj)->cached.type; - - if (type < 0 || ((size_t)type) >= ARRAY_SIZE(git_objects_table) || - !git_objects_table[type].free) - git__free(obj); - else - git_objects_table[type].free(obj); -} - -int git_object_lookup_prefix( - git_object **object_out, - git_repository *repo, - const git_oid *id, - size_t len, - git_otype type) -{ - git_object *object = NULL; - git_odb *odb = NULL; - git_odb_object *odb_obj = NULL; - int error = 0; - - assert(repo && object_out && id); - - if (len < GIT_OID_MINPREFIXLEN) { - giterr_set(GITERR_OBJECT, "Ambiguous lookup - OID prefix is too short"); - return GIT_EAMBIGUOUS; - } - - error = git_repository_odb__weakptr(&odb, repo); - if (error < 0) - return error; - - if (len > GIT_OID_HEXSZ) - len = GIT_OID_HEXSZ; - - if (len == GIT_OID_HEXSZ) { - git_cached_obj *cached = NULL; - - /* We want to match the full id : we can first look up in the cache, - * since there is no need to check for non ambiguousity - */ - cached = git_cache_get_any(&repo->objects, id); - if (cached != NULL) { - if (cached->flags == GIT_CACHE_STORE_PARSED) { - object = (git_object *)cached; - - if (type != GIT_OBJ_ANY && type != object->cached.type) { - git_object_free(object); - giterr_set(GITERR_INVALID, - "The requested type does not match the type in ODB"); - return GIT_ENOTFOUND; - } - - *object_out = object; - return 0; - } else if (cached->flags == GIT_CACHE_STORE_RAW) { - odb_obj = (git_odb_object *)cached; - } else { - assert(!"Wrong caching type in the global object cache"); - } - } else { - /* Object was not found in the cache, let's explore the backends. - * We could just use git_odb_read_unique_short_oid, - * it is the same cost for packed and loose object backends, - * but it may be much more costly for sqlite and hiredis. - */ - error = git_odb_read(&odb_obj, odb, id); - } - } else { - git_oid short_oid; - - /* We copy the first len*4 bits from id and fill the remaining with 0s */ - memcpy(short_oid.id, id->id, (len + 1) / 2); - if (len % 2) - short_oid.id[len / 2] &= 0xF0; - memset(short_oid.id + (len + 1) / 2, 0, (GIT_OID_HEXSZ - len) / 2); - - /* If len < GIT_OID_HEXSZ (a strict short oid was given), we have - * 2 options : - * - We always search in the cache first. If we find that short oid is - * ambiguous, we can stop. But in all the other cases, we must then - * explore all the backends (to find an object if there was match, - * or to check that oid is not ambiguous if we have found 1 match in - * the cache) - * - We never explore the cache, go right to exploring the backends - * We chose the latter : we explore directly the backends. - */ - error = git_odb_read_prefix(&odb_obj, odb, &short_oid, len); - } - - if (error < 0) - return error; - - error = git_object__from_odb_object(object_out, repo, odb_obj, type); - - git_odb_object_free(odb_obj); - - return error; -} - -int git_object_lookup(git_object **object_out, git_repository *repo, const git_oid *id, git_otype type) { - return git_object_lookup_prefix(object_out, repo, id, GIT_OID_HEXSZ, type); -} - -void git_object_free(git_object *object) -{ - if (object == NULL) - return; - - git_cached_obj_decref(object); -} - -const git_oid *git_object_id(const git_object *obj) -{ - assert(obj); - return &obj->cached.oid; -} - -git_otype git_object_type(const git_object *obj) -{ - assert(obj); - return obj->cached.type; -} - -git_repository *git_object_owner(const git_object *obj) -{ - assert(obj); - return obj->repo; -} - -const char *git_object_type2string(git_otype type) -{ - if (type < 0 || ((size_t) type) >= ARRAY_SIZE(git_objects_table)) - return ""; - - return git_objects_table[type].str; -} - -git_otype git_object_string2type(const char *str) -{ - size_t i; - - if (!str || !*str) - return GIT_OBJ_BAD; - - for (i = 0; i < ARRAY_SIZE(git_objects_table); i++) - if (!strcmp(str, git_objects_table[i].str)) - return (git_otype)i; - - return GIT_OBJ_BAD; -} - -int git_object_typeisloose(git_otype type) -{ - if (type < 0 || ((size_t) type) >= ARRAY_SIZE(git_objects_table)) - return 0; - - return (git_objects_table[type].size > 0) ? 1 : 0; -} - -size_t git_object__size(git_otype type) -{ - if (type < 0 || ((size_t) type) >= ARRAY_SIZE(git_objects_table)) - return 0; - - return git_objects_table[type].size; -} - -static int dereference_object(git_object **dereferenced, git_object *obj) -{ - git_otype type = git_object_type(obj); - - switch (type) { - case GIT_OBJ_COMMIT: - return git_commit_tree((git_tree **)dereferenced, (git_commit*)obj); - - case GIT_OBJ_TAG: - return git_tag_target(dereferenced, (git_tag*)obj); - - case GIT_OBJ_BLOB: - case GIT_OBJ_TREE: - return GIT_EPEEL; - - default: - return GIT_EINVALIDSPEC; - } -} - -static int peel_error(int error, const git_oid *oid, git_otype type) -{ - const char *type_name; - char hex_oid[GIT_OID_HEXSZ + 1]; - - type_name = git_object_type2string(type); - - git_oid_fmt(hex_oid, oid); - hex_oid[GIT_OID_HEXSZ] = '\0'; - - giterr_set(GITERR_OBJECT, "The git_object of id '%s' can not be " - "successfully peeled into a %s (git_otype=%i).", hex_oid, type_name, type); - - return error; -} - -static int check_type_combination(git_otype type, git_otype target) -{ - if (type == target) - return 0; - - switch (type) { - case GIT_OBJ_BLOB: - case GIT_OBJ_TREE: - /* a blob or tree can never be peeled to anything but themselves */ - return GIT_EINVALIDSPEC; - break; - case GIT_OBJ_COMMIT: - /* a commit can only be peeled to a tree */ - if (target != GIT_OBJ_TREE && target != GIT_OBJ_ANY) - return GIT_EINVALIDSPEC; - break; - case GIT_OBJ_TAG: - /* a tag may point to anything, so we let anything through */ - break; - default: - return GIT_EINVALIDSPEC; - } - - return 0; -} - -int git_object_peel( - git_object **peeled, - const git_object *object, - git_otype target_type) -{ - git_object *source, *deref = NULL; - int error; - - assert(object && peeled); - - assert(target_type == GIT_OBJ_TAG || - target_type == GIT_OBJ_COMMIT || - target_type == GIT_OBJ_TREE || - target_type == GIT_OBJ_BLOB || - target_type == GIT_OBJ_ANY); - - if ((error = check_type_combination(git_object_type(object), target_type)) < 0) - return peel_error(error, git_object_id(object), target_type); - - if (git_object_type(object) == target_type) - return git_object_dup(peeled, (git_object *)object); - - source = (git_object *)object; - - while (!(error = dereference_object(&deref, source))) { - - if (source != object) - git_object_free(source); - - if (git_object_type(deref) == target_type) { - *peeled = deref; - return 0; - } - - if (target_type == GIT_OBJ_ANY && - git_object_type(deref) != git_object_type(object)) - { - *peeled = deref; - return 0; - } - - source = deref; - deref = NULL; - } - - if (source != object) - git_object_free(source); - - git_object_free(deref); - - if (error) - error = peel_error(error, git_object_id(object), target_type); - - return error; -} - -int git_object_dup(git_object **dest, git_object *source) -{ - git_cached_obj_incref(source); - *dest = source; - return 0; -} - -int git_object_lookup_bypath( - git_object **out, - const git_object *treeish, - const char *path, - git_otype type) -{ - int error = -1; - git_tree *tree = NULL; - git_tree_entry *entry = NULL; - - assert(out && treeish && path); - - if ((error = git_object_peel((git_object**)&tree, treeish, GIT_OBJ_TREE)) < 0 || - (error = git_tree_entry_bypath(&entry, tree, path)) < 0) - { - goto cleanup; - } - - if (type != GIT_OBJ_ANY && git_tree_entry_type(entry) != type) - { - giterr_set(GITERR_OBJECT, - "object at path '%s' is not of the asked-for type %d", - path, type); - error = GIT_EINVALIDSPEC; - goto cleanup; - } - - error = git_tree_entry_to_object(out, git_object_owner(treeish), entry); - -cleanup: - git_tree_entry_free(entry); - git_tree_free(tree); - return error; -} - -int git_object_short_id(git_buf *out, const git_object *obj) -{ - git_repository *repo; - int len = GIT_ABBREV_DEFAULT, error; - git_oid id = {{0}}; - git_odb *odb; - - assert(out && obj); - - git_buf_sanitize(out); - repo = git_object_owner(obj); - - if ((error = git_repository__cvar(&len, repo, GIT_CVAR_ABBREV)) < 0) - return error; - - if ((error = git_repository_odb(&odb, repo)) < 0) - return error; - - while (len < GIT_OID_HEXSZ) { - /* set up short oid */ - memcpy(&id.id, &obj->cached.oid.id, (len + 1) / 2); - if (len & 1) - id.id[len / 2] &= 0xf0; - - error = git_odb_exists_prefix(NULL, odb, &id, len); - if (error != GIT_EAMBIGUOUS) - break; - - giterr_clear(); - len++; - } - - if (!error && !(error = git_buf_grow(out, len + 1))) { - git_oid_tostr(out->ptr, len + 1, &id); - out->size = len; - } - - git_odb_free(odb); - - return error; -} - diff --git a/vendor/libgit2/src/object.h b/vendor/libgit2/src/object.h deleted file mode 100644 index d187c55b73..0000000000 --- a/vendor/libgit2/src/object.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_object_h__ -#define INCLUDE_object_h__ - -/** Base git object for inheritance */ -struct git_object { - git_cached_obj cached; - git_repository *repo; -}; - -/* fully free the object; internal method, DO NOT EXPORT */ -void git_object__free(void *object); - -int git_object__from_odb_object( - git_object **object_out, - git_repository *repo, - git_odb_object *odb_obj, - git_otype type); - -int git_object__resolve_to_type(git_object **obj, git_otype type); - -int git_oid__parse(git_oid *oid, const char **buffer_out, const char *buffer_end, const char *header); - -void git_oid__writebuf(git_buf *buf, const char *header, const git_oid *oid); - -#endif diff --git a/vendor/libgit2/src/object_api.c b/vendor/libgit2/src/object_api.c deleted file mode 100644 index 838bba3233..0000000000 --- a/vendor/libgit2/src/object_api.c +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#include "git2/object.h" - -#include "common.h" -#include "repository.h" - -#include "commit.h" -#include "tree.h" -#include "blob.h" -#include "tag.h" - -/** - * Blob - */ -int git_commit_lookup(git_commit **out, git_repository *repo, const git_oid *id) -{ - return git_object_lookup((git_object **)out, repo, id, GIT_OBJ_COMMIT); -} - -int git_commit_lookup_prefix(git_commit **out, git_repository *repo, const git_oid *id, size_t len) -{ - return git_object_lookup_prefix((git_object **)out, repo, id, len, GIT_OBJ_COMMIT); -} - -void git_commit_free(git_commit *obj) -{ - git_object_free((git_object *)obj); -} - -const git_oid *git_commit_id(const git_commit *obj) -{ - return git_object_id((const git_object *)obj); -} - -git_repository *git_commit_owner(const git_commit *obj) -{ - return git_object_owner((const git_object *)obj); -} - - -/** - * Tree - */ -int git_tree_lookup(git_tree **out, git_repository *repo, const git_oid *id) -{ - return git_object_lookup((git_object **)out, repo, id, GIT_OBJ_TREE); -} - -int git_tree_lookup_prefix(git_tree **out, git_repository *repo, const git_oid *id, size_t len) -{ - return git_object_lookup_prefix((git_object **)out, repo, id, len, GIT_OBJ_TREE); -} - -void git_tree_free(git_tree *obj) -{ - git_object_free((git_object *)obj); -} - -const git_oid *git_tree_id(const git_tree *obj) -{ - return git_object_id((const git_object *)obj); -} - -git_repository *git_tree_owner(const git_tree *obj) -{ - return git_object_owner((const git_object *)obj); -} - - -/** - * Tag - */ -int git_tag_lookup(git_tag **out, git_repository *repo, const git_oid *id) -{ - return git_object_lookup((git_object **)out, repo, id, GIT_OBJ_TAG); -} - -int git_tag_lookup_prefix(git_tag **out, git_repository *repo, const git_oid *id, size_t len) -{ - return git_object_lookup_prefix((git_object **)out, repo, id, len, GIT_OBJ_TAG); -} - -void git_tag_free(git_tag *obj) -{ - git_object_free((git_object *)obj); -} - -const git_oid *git_tag_id(const git_tag *obj) -{ - return git_object_id((const git_object *)obj); -} - -git_repository *git_tag_owner(const git_tag *obj) -{ - return git_object_owner((const git_object *)obj); -} - -/** - * Blob - */ -int git_blob_lookup(git_blob **out, git_repository *repo, const git_oid *id) -{ - return git_object_lookup((git_object **)out, repo, id, GIT_OBJ_BLOB); -} - -int git_blob_lookup_prefix(git_blob **out, git_repository *repo, const git_oid *id, size_t len) -{ - return git_object_lookup_prefix((git_object **)out, repo, id, len, GIT_OBJ_BLOB); -} - -void git_blob_free(git_blob *obj) -{ - git_object_free((git_object *)obj); -} - -const git_oid *git_blob_id(const git_blob *obj) -{ - return git_object_id((const git_object *)obj); -} - -git_repository *git_blob_owner(const git_blob *obj) -{ - return git_object_owner((const git_object *)obj); -} diff --git a/vendor/libgit2/src/odb.c b/vendor/libgit2/src/odb.c deleted file mode 100644 index b2d635109c..0000000000 --- a/vendor/libgit2/src/odb.c +++ /dev/null @@ -1,1165 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#include "common.h" -#include -#include "git2/object.h" -#include "git2/sys/odb_backend.h" -#include "fileops.h" -#include "hash.h" -#include "odb.h" -#include "delta-apply.h" -#include "filter.h" -#include "repository.h" - -#include "git2/odb_backend.h" -#include "git2/oid.h" - -#define GIT_ALTERNATES_FILE "info/alternates" - -/* - * We work under the assumption that most objects for long-running - * operations will be packed - */ -#define GIT_LOOSE_PRIORITY 1 -#define GIT_PACKED_PRIORITY 2 - -#define GIT_ALTERNATES_MAX_DEPTH 5 - -typedef struct -{ - git_odb_backend *backend; - int priority; - bool is_alternate; - ino_t disk_inode; -} backend_internal; - -static git_cache *odb_cache(git_odb *odb) -{ - if (odb->rc.owner != NULL) { - git_repository *owner = odb->rc.owner; - return &owner->objects; - } - - return &odb->own_cache; -} - -static int load_alternates(git_odb *odb, const char *objects_dir, int alternate_depth); - -int git_odb__format_object_header(char *hdr, size_t n, git_off_t obj_len, git_otype obj_type) -{ - const char *type_str = git_object_type2string(obj_type); - int len = p_snprintf(hdr, n, "%s %lld", type_str, (long long)obj_len); - assert(len > 0 && len <= (int)n); - return len+1; -} - -int git_odb__hashobj(git_oid *id, git_rawobj *obj) -{ - git_buf_vec vec[2]; - char header[64]; - int hdrlen; - - assert(id && obj); - - if (!git_object_typeisloose(obj->type)) - return -1; - - if (!obj->data && obj->len != 0) - return -1; - - hdrlen = git_odb__format_object_header(header, sizeof(header), obj->len, obj->type); - - vec[0].data = header; - vec[0].len = hdrlen; - vec[1].data = obj->data; - vec[1].len = obj->len; - - git_hash_vec(id, vec, 2); - - return 0; -} - - -static git_odb_object *odb_object__alloc(const git_oid *oid, git_rawobj *source) -{ - git_odb_object *object = git__calloc(1, sizeof(git_odb_object)); - - if (object != NULL) { - git_oid_cpy(&object->cached.oid, oid); - object->cached.type = source->type; - object->cached.size = source->len; - object->buffer = source->data; - } - - return object; -} - -void git_odb_object__free(void *object) -{ - if (object != NULL) { - git__free(((git_odb_object *)object)->buffer); - git__free(object); - } -} - -const git_oid *git_odb_object_id(git_odb_object *object) -{ - return &object->cached.oid; -} - -const void *git_odb_object_data(git_odb_object *object) -{ - return object->buffer; -} - -size_t git_odb_object_size(git_odb_object *object) -{ - return object->cached.size; -} - -git_otype git_odb_object_type(git_odb_object *object) -{ - return object->cached.type; -} - -int git_odb_object_dup(git_odb_object **dest, git_odb_object *source) -{ - git_cached_obj_incref(source); - *dest = source; - return 0; -} - -void git_odb_object_free(git_odb_object *object) -{ - if (object == NULL) - return; - - git_cached_obj_decref(object); -} - -int git_odb__hashfd(git_oid *out, git_file fd, size_t size, git_otype type) -{ - int hdr_len; - char hdr[64], buffer[FILEIO_BUFSIZE]; - git_hash_ctx ctx; - ssize_t read_len = 0; - int error = 0; - - if (!git_object_typeisloose(type)) { - giterr_set(GITERR_INVALID, "Invalid object type for hash"); - return -1; - } - - if ((error = git_hash_ctx_init(&ctx)) < 0) - return -1; - - hdr_len = git_odb__format_object_header(hdr, sizeof(hdr), size, type); - - if ((error = git_hash_update(&ctx, hdr, hdr_len)) < 0) - goto done; - - while (size > 0 && (read_len = p_read(fd, buffer, sizeof(buffer))) > 0) { - if ((error = git_hash_update(&ctx, buffer, read_len)) < 0) - goto done; - - size -= read_len; - } - - /* If p_read returned an error code, the read obviously failed. - * If size is not zero, the file was truncated after we originally - * stat'd it, so we consider this a read failure too */ - if (read_len < 0 || size > 0) { - giterr_set(GITERR_OS, "Error reading file for hashing"); - error = -1; - - goto done; - } - - error = git_hash_final(out, &ctx); - -done: - git_hash_ctx_cleanup(&ctx); - return error; -} - -int git_odb__hashfd_filtered( - git_oid *out, git_file fd, size_t size, git_otype type, git_filter_list *fl) -{ - int error; - git_buf raw = GIT_BUF_INIT; - - if (!fl) - return git_odb__hashfd(out, fd, size, type); - - /* size of data is used in header, so we have to read the whole file - * into memory to apply filters before beginning to calculate the hash - */ - - if (!(error = git_futils_readbuffer_fd(&raw, fd, size))) { - git_buf post = GIT_BUF_INIT; - - error = git_filter_list_apply_to_data(&post, fl, &raw); - - git_buf_free(&raw); - - if (!error) - error = git_odb_hash(out, post.ptr, post.size, type); - - git_buf_free(&post); - } - - return error; -} - -int git_odb__hashlink(git_oid *out, const char *path) -{ - struct stat st; - int size; - int result; - - if (git_path_lstat(path, &st) < 0) - return -1; - - if (!git__is_int(st.st_size) || (int)st.st_size < 0) { - giterr_set(GITERR_FILESYSTEM, "File size overflow for 32-bit systems"); - return -1; - } - - size = (int)st.st_size; - - if (S_ISLNK(st.st_mode)) { - char *link_data; - int read_len; - size_t alloc_size; - - GITERR_CHECK_ALLOC_ADD(&alloc_size, size, 1); - link_data = git__malloc(alloc_size); - GITERR_CHECK_ALLOC(link_data); - - read_len = p_readlink(path, link_data, size); - link_data[size] = '\0'; - if (read_len != size) { - giterr_set(GITERR_OS, "Failed to read symlink data for '%s'", path); - git__free(link_data); - return -1; - } - - result = git_odb_hash(out, link_data, size, GIT_OBJ_BLOB); - git__free(link_data); - } else { - int fd = git_futils_open_ro(path); - if (fd < 0) - return -1; - result = git_odb__hashfd(out, fd, size, GIT_OBJ_BLOB); - p_close(fd); - } - - return result; -} - -int git_odb_hashfile(git_oid *out, const char *path, git_otype type) -{ - git_off_t size; - int result, fd = git_futils_open_ro(path); - if (fd < 0) - return fd; - - if ((size = git_futils_filesize(fd)) < 0 || !git__is_sizet(size)) { - giterr_set(GITERR_OS, "File size overflow for 32-bit systems"); - p_close(fd); - return -1; - } - - result = git_odb__hashfd(out, fd, (size_t)size, type); - p_close(fd); - return result; -} - -int git_odb_hash(git_oid *id, const void *data, size_t len, git_otype type) -{ - git_rawobj raw; - - assert(id); - - raw.data = (void *)data; - raw.len = len; - raw.type = type; - - return git_odb__hashobj(id, &raw); -} - -/** - * FAKE WSTREAM - */ - -typedef struct { - git_odb_stream stream; - char *buffer; - size_t size, written; - git_otype type; -} fake_wstream; - -static int fake_wstream__fwrite(git_odb_stream *_stream, const git_oid *oid) -{ - fake_wstream *stream = (fake_wstream *)_stream; - return _stream->backend->write(_stream->backend, oid, stream->buffer, stream->size, stream->type); -} - -static int fake_wstream__write(git_odb_stream *_stream, const char *data, size_t len) -{ - fake_wstream *stream = (fake_wstream *)_stream; - - if (stream->written + len > stream->size) - return -1; - - memcpy(stream->buffer + stream->written, data, len); - stream->written += len; - return 0; -} - -static void fake_wstream__free(git_odb_stream *_stream) -{ - fake_wstream *stream = (fake_wstream *)_stream; - - git__free(stream->buffer); - git__free(stream); -} - -static int init_fake_wstream(git_odb_stream **stream_p, git_odb_backend *backend, git_off_t size, git_otype type) -{ - fake_wstream *stream; - - if (!git__is_ssizet(size)) { - giterr_set(GITERR_ODB, "object size too large to keep in memory"); - return -1; - } - - stream = git__calloc(1, sizeof(fake_wstream)); - GITERR_CHECK_ALLOC(stream); - - stream->size = size; - stream->type = type; - stream->buffer = git__malloc(size); - if (stream->buffer == NULL) { - git__free(stream); - return -1; - } - - stream->stream.backend = backend; - stream->stream.read = NULL; /* read only */ - stream->stream.write = &fake_wstream__write; - stream->stream.finalize_write = &fake_wstream__fwrite; - stream->stream.free = &fake_wstream__free; - stream->stream.mode = GIT_STREAM_WRONLY; - - *stream_p = (git_odb_stream *)stream; - return 0; -} - -/*********************************************************** - * - * OBJECT DATABASE PUBLIC API - * - * Public calls for the ODB functionality - * - ***********************************************************/ - -static int backend_sort_cmp(const void *a, const void *b) -{ - const backend_internal *backend_a = (const backend_internal *)(a); - const backend_internal *backend_b = (const backend_internal *)(b); - - if (backend_a->is_alternate == backend_b->is_alternate) - return (backend_b->priority - backend_a->priority); - - return backend_a->is_alternate ? 1 : -1; -} - -int git_odb_new(git_odb **out) -{ - git_odb *db = git__calloc(1, sizeof(*db)); - GITERR_CHECK_ALLOC(db); - - if (git_cache_init(&db->own_cache) < 0 || - git_vector_init(&db->backends, 4, backend_sort_cmp) < 0) { - git__free(db); - return -1; - } - - *out = db; - GIT_REFCOUNT_INC(db); - return 0; -} - -static int add_backend_internal( - git_odb *odb, git_odb_backend *backend, - int priority, bool is_alternate, ino_t disk_inode) -{ - backend_internal *internal; - - assert(odb && backend); - - GITERR_CHECK_VERSION(backend, GIT_ODB_BACKEND_VERSION, "git_odb_backend"); - - /* Check if the backend is already owned by another ODB */ - assert(!backend->odb || backend->odb == odb); - - internal = git__malloc(sizeof(backend_internal)); - GITERR_CHECK_ALLOC(internal); - - internal->backend = backend; - internal->priority = priority; - internal->is_alternate = is_alternate; - internal->disk_inode = disk_inode; - - if (git_vector_insert(&odb->backends, internal) < 0) { - git__free(internal); - return -1; - } - - git_vector_sort(&odb->backends); - internal->backend->odb = odb; - return 0; -} - -int git_odb_add_backend(git_odb *odb, git_odb_backend *backend, int priority) -{ - return add_backend_internal(odb, backend, priority, false, 0); -} - -int git_odb_add_alternate(git_odb *odb, git_odb_backend *backend, int priority) -{ - return add_backend_internal(odb, backend, priority, true, 0); -} - -size_t git_odb_num_backends(git_odb *odb) -{ - assert(odb); - return odb->backends.length; -} - -static int git_odb__error_unsupported_in_backend(const char *action) -{ - giterr_set(GITERR_ODB, - "Cannot %s - unsupported in the loaded odb backends", action); - return -1; -} - - -int git_odb_get_backend(git_odb_backend **out, git_odb *odb, size_t pos) -{ - backend_internal *internal; - - assert(out && odb); - internal = git_vector_get(&odb->backends, pos); - - if (internal && internal->backend) { - *out = internal->backend; - return 0; - } - - giterr_set(GITERR_ODB, "No ODB backend loaded at index %" PRIuZ, pos); - return GIT_ENOTFOUND; -} - -static int add_default_backends( - git_odb *db, const char *objects_dir, - bool as_alternates, int alternate_depth) -{ - size_t i; - struct stat st; - ino_t inode; - git_odb_backend *loose, *packed; - - /* TODO: inodes are not really relevant on Win32, so we need to find - * a cross-platform workaround for this */ -#ifdef GIT_WIN32 - GIT_UNUSED(i); - GIT_UNUSED(st); - - inode = 0; -#else - if (p_stat(objects_dir, &st) < 0) { - if (as_alternates) - return 0; - - giterr_set(GITERR_ODB, "Failed to load object database in '%s'", objects_dir); - return -1; - } - - inode = st.st_ino; - - for (i = 0; i < db->backends.length; ++i) { - backend_internal *backend = git_vector_get(&db->backends, i); - if (backend->disk_inode == inode) - return 0; - } -#endif - - /* add the loose object backend */ - if (git_odb_backend_loose(&loose, objects_dir, -1, 0, 0, 0) < 0 || - add_backend_internal(db, loose, GIT_LOOSE_PRIORITY, as_alternates, inode) < 0) - return -1; - - /* add the packed file backend */ - if (git_odb_backend_pack(&packed, objects_dir) < 0 || - add_backend_internal(db, packed, GIT_PACKED_PRIORITY, as_alternates, inode) < 0) - return -1; - - return load_alternates(db, objects_dir, alternate_depth); -} - -static int load_alternates(git_odb *odb, const char *objects_dir, int alternate_depth) -{ - git_buf alternates_path = GIT_BUF_INIT; - git_buf alternates_buf = GIT_BUF_INIT; - char *buffer; - const char *alternate; - int result = 0; - - /* Git reports an error, we just ignore anything deeper */ - if (alternate_depth > GIT_ALTERNATES_MAX_DEPTH) - return 0; - - if (git_buf_joinpath(&alternates_path, objects_dir, GIT_ALTERNATES_FILE) < 0) - return -1; - - if (git_path_exists(alternates_path.ptr) == false) { - git_buf_free(&alternates_path); - return 0; - } - - if (git_futils_readbuffer(&alternates_buf, alternates_path.ptr) < 0) { - git_buf_free(&alternates_path); - return -1; - } - - buffer = (char *)alternates_buf.ptr; - - /* add each alternate as a new backend; one alternate per line */ - while ((alternate = git__strtok(&buffer, "\r\n")) != NULL) { - if (*alternate == '\0' || *alternate == '#') - continue; - - /* - * Relative path: build based on the current `objects` - * folder. However, relative paths are only allowed in - * the current repository. - */ - if (*alternate == '.' && !alternate_depth) { - if ((result = git_buf_joinpath(&alternates_path, objects_dir, alternate)) < 0) - break; - alternate = git_buf_cstr(&alternates_path); - } - - if ((result = add_default_backends(odb, alternate, true, alternate_depth + 1)) < 0) - break; - } - - git_buf_free(&alternates_path); - git_buf_free(&alternates_buf); - - return result; -} - -int git_odb_add_disk_alternate(git_odb *odb, const char *path) -{ - return add_default_backends(odb, path, true, 0); -} - -int git_odb_open(git_odb **out, const char *objects_dir) -{ - git_odb *db; - - assert(out && objects_dir); - - *out = NULL; - - if (git_odb_new(&db) < 0) - return -1; - - if (add_default_backends(db, objects_dir, 0, 0) < 0) { - git_odb_free(db); - return -1; - } - - *out = db; - return 0; -} - -static void odb_free(git_odb *db) -{ - size_t i; - - for (i = 0; i < db->backends.length; ++i) { - backend_internal *internal = git_vector_get(&db->backends, i); - git_odb_backend *backend = internal->backend; - - if (backend->free) backend->free(backend); - else git__free(backend); - - git__free(internal); - } - - git_vector_free(&db->backends); - git_cache_free(&db->own_cache); - - git__memzero(db, sizeof(*db)); - git__free(db); -} - -void git_odb_free(git_odb *db) -{ - if (db == NULL) - return; - - GIT_REFCOUNT_DEC(db, odb_free); -} - -int git_odb_exists(git_odb *db, const git_oid *id) -{ - git_odb_object *object; - size_t i; - bool found = false; - - assert(db && id); - - if ((object = git_cache_get_raw(odb_cache(db), id)) != NULL) { - git_odb_object_free(object); - return (int)true; - } - - for (i = 0; i < db->backends.length && !found; ++i) { - backend_internal *internal = git_vector_get(&db->backends, i); - git_odb_backend *b = internal->backend; - - if (b->exists != NULL) - found = (bool)b->exists(b, id); - } - - return (int)found; -} - -int git_odb_exists_prefix( - git_oid *out, git_odb *db, const git_oid *short_id, size_t len) -{ - int error = GIT_ENOTFOUND, num_found = 0; - size_t i; - git_oid key = {{0}}, last_found = {{0}}, found; - - assert(db && short_id); - - if (len < GIT_OID_MINPREFIXLEN) - return git_odb__error_ambiguous("prefix length too short"); - if (len > GIT_OID_HEXSZ) - len = GIT_OID_HEXSZ; - - if (len == GIT_OID_HEXSZ) { - if (git_odb_exists(db, short_id)) { - if (out) - git_oid_cpy(out, short_id); - return 0; - } else { - return git_odb__error_notfound("no match for id prefix", short_id); - } - } - - /* just copy valid part of short_id */ - memcpy(&key.id, short_id->id, (len + 1) / 2); - if (len & 1) - key.id[len / 2] &= 0xF0; - - for (i = 0; i < db->backends.length; ++i) { - backend_internal *internal = git_vector_get(&db->backends, i); - git_odb_backend *b = internal->backend; - - if (!b->exists_prefix) - continue; - - error = b->exists_prefix(&found, b, &key, len); - if (error == GIT_ENOTFOUND || error == GIT_PASSTHROUGH) - continue; - if (error) - return error; - - /* make sure found item doesn't introduce ambiguity */ - if (num_found) { - if (git_oid__cmp(&last_found, &found)) - return git_odb__error_ambiguous("multiple matches for prefix"); - } else { - git_oid_cpy(&last_found, &found); - num_found++; - } - } - - if (!num_found) - return git_odb__error_notfound("no match for id prefix", &key); - if (out) - git_oid_cpy(out, &last_found); - - return 0; -} - -int git_odb_read_header(size_t *len_p, git_otype *type_p, git_odb *db, const git_oid *id) -{ - int error; - git_odb_object *object; - - error = git_odb__read_header_or_object(&object, len_p, type_p, db, id); - - if (object) - git_odb_object_free(object); - - return error; -} - -int git_odb__read_header_or_object( - git_odb_object **out, size_t *len_p, git_otype *type_p, - git_odb *db, const git_oid *id) -{ - size_t i; - int error = GIT_ENOTFOUND; - git_odb_object *object; - - assert(db && id && out && len_p && type_p); - - if ((object = git_cache_get_raw(odb_cache(db), id)) != NULL) { - *len_p = object->cached.size; - *type_p = object->cached.type; - *out = object; - return 0; - } - - *out = NULL; - - for (i = 0; i < db->backends.length && error < 0; ++i) { - backend_internal *internal = git_vector_get(&db->backends, i); - git_odb_backend *b = internal->backend; - - if (b->read_header != NULL) - error = b->read_header(len_p, type_p, b, id); - } - - if (!error || error == GIT_PASSTHROUGH) - return 0; - - /* - * no backend could read only the header. - * try reading the whole object and freeing the contents - */ - if ((error = git_odb_read(&object, db, id)) < 0) - return error; /* error already set - pass along */ - - *len_p = object->cached.size; - *type_p = object->cached.type; - *out = object; - - return 0; -} - -static git_oid empty_blob = {{ 0xe6, 0x9d, 0xe2, 0x9b, 0xb2, 0xd1, 0xd6, 0x43, 0x4b, 0x8b, - 0x29, 0xae, 0x77, 0x5a, 0xd8, 0xc2, 0xe4, 0x8c, 0x53, 0x91 }}; -static git_oid empty_tree = {{ 0x4b, 0x82, 0x5d, 0xc6, 0x42, 0xcb, 0x6e, 0xb9, 0xa0, 0x60, - 0xe5, 0x4b, 0xf8, 0xd6, 0x92, 0x88, 0xfb, 0xee, 0x49, 0x04 }}; - -static int hardcoded_objects(git_rawobj *raw, const git_oid *id) -{ - if (!git_oid_cmp(id, &empty_blob)) { - raw->type = GIT_OBJ_BLOB; - raw->len = 0; - raw->data = git__calloc(1, sizeof(uint8_t)); - return 0; - } else if (!git_oid_cmp(id, &empty_tree)) { - raw->type = GIT_OBJ_TREE; - raw->len = 0; - raw->data = git__calloc(1, sizeof(uint8_t)); - return 0; - } else { - return GIT_ENOTFOUND; - } -} - -int git_odb_read(git_odb_object **out, git_odb *db, const git_oid *id) -{ - size_t i, reads = 0; - int error; - git_rawobj raw; - git_odb_object *object; - - assert(out && db && id); - - *out = git_cache_get_raw(odb_cache(db), id); - if (*out != NULL) - return 0; - - error = hardcoded_objects(&raw, id); - - for (i = 0; i < db->backends.length && error < 0; ++i) { - backend_internal *internal = git_vector_get(&db->backends, i); - git_odb_backend *b = internal->backend; - - if (b->read != NULL) { - ++reads; - error = b->read(&raw.data, &raw.len, &raw.type, b, id); - } - } - - if (error && error != GIT_PASSTHROUGH) { - if (!reads) - return git_odb__error_notfound("no match for id", id); - return error; - } - - giterr_clear(); - if ((object = odb_object__alloc(id, &raw)) == NULL) - return -1; - - *out = git_cache_store_raw(odb_cache(db), object); - return 0; -} - -int git_odb_read_prefix( - git_odb_object **out, git_odb *db, const git_oid *short_id, size_t len) -{ - size_t i; - int error = GIT_ENOTFOUND; - git_oid key = {{0}}, found_full_oid = {{0}}; - git_rawobj raw; - void *data = NULL; - bool found = false; - git_odb_object *object; - - assert(out && db); - - if (len < GIT_OID_MINPREFIXLEN) - return git_odb__error_ambiguous("prefix length too short"); - if (len > GIT_OID_HEXSZ) - len = GIT_OID_HEXSZ; - - if (len == GIT_OID_HEXSZ) { - *out = git_cache_get_raw(odb_cache(db), short_id); - if (*out != NULL) - return 0; - } - - /* just copy valid part of short_id */ - memcpy(&key.id, short_id->id, (len + 1) / 2); - if (len & 1) - key.id[len / 2] &= 0xF0; - - for (i = 0; i < db->backends.length; ++i) { - backend_internal *internal = git_vector_get(&db->backends, i); - git_odb_backend *b = internal->backend; - - if (b->read_prefix != NULL) { - git_oid full_oid; - error = b->read_prefix(&full_oid, &raw.data, &raw.len, &raw.type, b, &key, len); - if (error == GIT_ENOTFOUND || error == GIT_PASSTHROUGH) - continue; - - if (error) - return error; - - git__free(data); - data = raw.data; - - if (found && git_oid__cmp(&full_oid, &found_full_oid)) { - git__free(raw.data); - return git_odb__error_ambiguous("multiple matches for prefix"); - } - - found_full_oid = full_oid; - found = true; - } - } - - if (!found) - return git_odb__error_notfound("no match for prefix", &key); - - if ((object = odb_object__alloc(&found_full_oid, &raw)) == NULL) - return -1; - - *out = git_cache_store_raw(odb_cache(db), object); - return 0; -} - -int git_odb_foreach(git_odb *db, git_odb_foreach_cb cb, void *payload) -{ - unsigned int i; - backend_internal *internal; - - git_vector_foreach(&db->backends, i, internal) { - git_odb_backend *b = internal->backend; - int error = b->foreach(b, cb, payload); - if (error < 0) - return error; - } - - return 0; -} - -int git_odb_write( - git_oid *oid, git_odb *db, const void *data, size_t len, git_otype type) -{ - size_t i; - int error = GIT_ERROR; - git_odb_stream *stream; - - assert(oid && db); - - git_odb_hash(oid, data, len, type); - if (git_odb_exists(db, oid)) - return 0; - - for (i = 0; i < db->backends.length && error < 0; ++i) { - backend_internal *internal = git_vector_get(&db->backends, i); - git_odb_backend *b = internal->backend; - - /* we don't write in alternates! */ - if (internal->is_alternate) - continue; - - if (b->write != NULL) - error = b->write(b, oid, data, len, type); - } - - if (!error || error == GIT_PASSTHROUGH) - return 0; - - /* if no backends were able to write the object directly, we try a - * streaming write to the backends; just write the whole object into the - * stream in one push - */ - if ((error = git_odb_open_wstream(&stream, db, len, type)) != 0) - return error; - - stream->write(stream, data, len); - error = stream->finalize_write(stream, oid); - git_odb_stream_free(stream); - - return error; -} - -static void hash_header(git_hash_ctx *ctx, git_off_t size, git_otype type) -{ - char header[64]; - int hdrlen; - - hdrlen = git_odb__format_object_header(header, sizeof(header), size, type); - git_hash_update(ctx, header, hdrlen); -} - -int git_odb_open_wstream( - git_odb_stream **stream, git_odb *db, git_off_t size, git_otype type) -{ - size_t i, writes = 0; - int error = GIT_ERROR; - git_hash_ctx *ctx = NULL; - - assert(stream && db); - - for (i = 0; i < db->backends.length && error < 0; ++i) { - backend_internal *internal = git_vector_get(&db->backends, i); - git_odb_backend *b = internal->backend; - - /* we don't write in alternates! */ - if (internal->is_alternate) - continue; - - if (b->writestream != NULL) { - ++writes; - error = b->writestream(stream, b, size, type); - } else if (b->write != NULL) { - ++writes; - error = init_fake_wstream(stream, b, size, type); - } - } - - if (error < 0) { - if (error == GIT_PASSTHROUGH) - error = 0; - else if (!writes) - error = git_odb__error_unsupported_in_backend("write object"); - - goto done; - } - - ctx = git__malloc(sizeof(git_hash_ctx)); - GITERR_CHECK_ALLOC(ctx); - - if ((error = git_hash_ctx_init(ctx)) < 0) - goto done; - - hash_header(ctx, size, type); - (*stream)->hash_ctx = ctx; - - (*stream)->declared_size = size; - (*stream)->received_bytes = 0; - -done: - return error; -} - -static int git_odb_stream__invalid_length( - const git_odb_stream *stream, - const char *action) -{ - giterr_set(GITERR_ODB, - "Cannot %s - " - "Invalid length. %"PRIuZ" was expected. The " - "total size of the received chunks amounts to %"PRIuZ".", - action, stream->declared_size, stream->received_bytes); - - return -1; -} - -int git_odb_stream_write(git_odb_stream *stream, const char *buffer, size_t len) -{ - git_hash_update(stream->hash_ctx, buffer, len); - - stream->received_bytes += len; - - if (stream->received_bytes > stream->declared_size) - return git_odb_stream__invalid_length(stream, - "stream_write()"); - - return stream->write(stream, buffer, len); -} - -int git_odb_stream_finalize_write(git_oid *out, git_odb_stream *stream) -{ - if (stream->received_bytes != stream->declared_size) - return git_odb_stream__invalid_length(stream, - "stream_finalize_write()"); - - git_hash_final(out, stream->hash_ctx); - - if (git_odb_exists(stream->backend->odb, out)) - return 0; - - return stream->finalize_write(stream, out); -} - -int git_odb_stream_read(git_odb_stream *stream, char *buffer, size_t len) -{ - return stream->read(stream, buffer, len); -} - -void git_odb_stream_free(git_odb_stream *stream) -{ - if (stream == NULL) - return; - - git_hash_ctx_cleanup(stream->hash_ctx); - git__free(stream->hash_ctx); - stream->free(stream); -} - -int git_odb_open_rstream(git_odb_stream **stream, git_odb *db, const git_oid *oid) -{ - size_t i, reads = 0; - int error = GIT_ERROR; - - assert(stream && db); - - for (i = 0; i < db->backends.length && error < 0; ++i) { - backend_internal *internal = git_vector_get(&db->backends, i); - git_odb_backend *b = internal->backend; - - if (b->readstream != NULL) { - ++reads; - error = b->readstream(stream, b, oid); - } - } - - if (error == GIT_PASSTHROUGH) - error = 0; - if (error < 0 && !reads) - error = git_odb__error_unsupported_in_backend("read object streamed"); - - return error; -} - -int git_odb_write_pack(struct git_odb_writepack **out, git_odb *db, git_transfer_progress_cb progress_cb, void *progress_payload) -{ - size_t i, writes = 0; - int error = GIT_ERROR; - - assert(out && db); - - for (i = 0; i < db->backends.length && error < 0; ++i) { - backend_internal *internal = git_vector_get(&db->backends, i); - git_odb_backend *b = internal->backend; - - /* we don't write in alternates! */ - if (internal->is_alternate) - continue; - - if (b->writepack != NULL) { - ++writes; - error = b->writepack(out, b, db, progress_cb, progress_payload); - } - } - - if (error == GIT_PASSTHROUGH) - error = 0; - if (error < 0 && !writes) - error = git_odb__error_unsupported_in_backend("write pack"); - - return error; -} - -void *git_odb_backend_malloc(git_odb_backend *backend, size_t len) -{ - GIT_UNUSED(backend); - return git__malloc(len); -} - -int git_odb_refresh(struct git_odb *db) -{ - size_t i; - assert(db); - - for (i = 0; i < db->backends.length; ++i) { - backend_internal *internal = git_vector_get(&db->backends, i); - git_odb_backend *b = internal->backend; - - if (b->refresh != NULL) { - int error = b->refresh(b); - if (error < 0) - return error; - } - } - - return 0; -} - -int git_odb__error_notfound(const char *message, const git_oid *oid) -{ - if (oid != NULL) { - char oid_str[GIT_OID_HEXSZ + 1]; - git_oid_tostr(oid_str, sizeof(oid_str), oid); - giterr_set(GITERR_ODB, "Object not found - %s (%s)", message, oid_str); - } else - giterr_set(GITERR_ODB, "Object not found - %s", message); - - return GIT_ENOTFOUND; -} - -int git_odb__error_ambiguous(const char *message) -{ - giterr_set(GITERR_ODB, "Ambiguous SHA1 prefix - %s", message); - return GIT_EAMBIGUOUS; -} - -int git_odb_init_backend(git_odb_backend *backend, unsigned int version) -{ - GIT_INIT_STRUCTURE_FROM_TEMPLATE( - backend, version, git_odb_backend, GIT_ODB_BACKEND_INIT); - return 0; -} diff --git a/vendor/libgit2/src/odb.h b/vendor/libgit2/src/odb.h deleted file mode 100644 index 281bd3a4d4..0000000000 --- a/vendor/libgit2/src/odb.h +++ /dev/null @@ -1,103 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_odb_h__ -#define INCLUDE_odb_h__ - -#include "git2/odb.h" -#include "git2/oid.h" -#include "git2/types.h" - -#include "vector.h" -#include "cache.h" -#include "posix.h" -#include "filter.h" - -#define GIT_OBJECTS_DIR "objects/" -#define GIT_OBJECT_DIR_MODE 0777 -#define GIT_OBJECT_FILE_MODE 0444 - -/* DO NOT EXPORT */ -typedef struct { - void *data; /**< Raw, decompressed object data. */ - size_t len; /**< Total number of bytes in data. */ - git_otype type; /**< Type of this object. */ -} git_rawobj; - -/* EXPORT */ -struct git_odb_object { - git_cached_obj cached; - void *buffer; -}; - -/* EXPORT */ -struct git_odb { - git_refcount rc; - git_vector backends; - git_cache own_cache; -}; - -/* - * Hash a git_rawobj internally. - * The `git_rawobj` is supposed to be previously initialized - */ -int git_odb__hashobj(git_oid *id, git_rawobj *obj); - -/* - * Format the object header such as it would appear in the on-disk object - */ -int git_odb__format_object_header(char *hdr, size_t n, git_off_t obj_len, git_otype obj_type); -/* - * Hash an open file descriptor. - * This is a performance call when the contents of a fd need to be hashed, - * but the fd is already open and we have the size of the contents. - * - * Saves us some `stat` calls. - * - * The fd is never closed, not even on error. It must be opened and closed - * by the caller - */ -int git_odb__hashfd(git_oid *out, git_file fd, size_t size, git_otype type); - -/* - * Hash an open file descriptor applying an array of filters - * Acts just like git_odb__hashfd with the addition of filters... - */ -int git_odb__hashfd_filtered( - git_oid *out, git_file fd, size_t len, git_otype type, git_filter_list *fl); - -/* - * Hash a `path`, assuming it could be a POSIX symlink: if the path is a - * symlink, then the raw contents of the symlink will be hashed. Otherwise, - * this will fallback to `git_odb__hashfd`. - * - * The hash type for this call is always `GIT_OBJ_BLOB` because symlinks may - * only point to blobs. - */ -int git_odb__hashlink(git_oid *out, const char *path); - -/* - * Generate a GIT_ENOTFOUND error for the ODB. - */ -int git_odb__error_notfound(const char *message, const git_oid *oid); - -/* - * Generate a GIT_EAMBIGUOUS error for the ODB. - */ -int git_odb__error_ambiguous(const char *message); - -/* - * Attempt to read object header or just return whole object if it could - * not be read. - */ -int git_odb__read_header_or_object( - git_odb_object **out, size_t *len_p, git_otype *type_p, - git_odb *db, const git_oid *id); - -/* fully free the object; internal method, DO NOT EXPORT */ -void git_odb_object__free(void *object); - -#endif diff --git a/vendor/libgit2/src/odb_loose.c b/vendor/libgit2/src/odb_loose.c deleted file mode 100644 index 99b8f7c917..0000000000 --- a/vendor/libgit2/src/odb_loose.c +++ /dev/null @@ -1,978 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#include "common.h" -#include -#include "git2/object.h" -#include "git2/sys/odb_backend.h" -#include "fileops.h" -#include "hash.h" -#include "odb.h" -#include "delta-apply.h" -#include "filebuf.h" - -#include "git2/odb_backend.h" -#include "git2/types.h" - -typedef struct { /* object header data */ - git_otype type; /* object type */ - size_t size; /* object size */ -} obj_hdr; - -typedef struct { - git_odb_stream stream; - git_filebuf fbuf; -} loose_writestream; - -typedef struct loose_backend { - git_odb_backend parent; - - int object_zlib_level; /** loose object zlib compression level. */ - int fsync_object_files; /** loose object file fsync flag. */ - mode_t object_file_mode; - mode_t object_dir_mode; - - size_t objects_dirlen; - char objects_dir[GIT_FLEX_ARRAY]; -} loose_backend; - -/* State structure for exploring directories, - * in order to locate objects matching a short oid. - */ -typedef struct { - size_t dir_len; - unsigned char short_oid[GIT_OID_HEXSZ]; /* hex formatted oid to match */ - size_t short_oid_len; - int found; /* number of matching - * objects already found */ - unsigned char res_oid[GIT_OID_HEXSZ]; /* hex formatted oid of - * the object found */ -} loose_locate_object_state; - - -/*********************************************************** - * - * MISCELLANEOUS HELPER FUNCTIONS - * - ***********************************************************/ - -static int object_file_name( - git_buf *name, const loose_backend *be, const git_oid *id) -{ - size_t alloclen; - - /* expand length for object root + 40 hex sha1 chars + 2 * '/' + '\0' */ - GITERR_CHECK_ALLOC_ADD(&alloclen, be->objects_dirlen, GIT_OID_HEXSZ); - GITERR_CHECK_ALLOC_ADD(&alloclen, alloclen, 3); - if (git_buf_grow(name, alloclen) < 0) - return -1; - - git_buf_set(name, be->objects_dir, be->objects_dirlen); - git_path_to_dir(name); - - /* loose object filename: aa/aaa... (41 bytes) */ - git_oid_pathfmt(name->ptr + name->size, id); - name->size += GIT_OID_HEXSZ + 1; - name->ptr[name->size] = '\0'; - - return 0; -} - -static int object_mkdir(const git_buf *name, const loose_backend *be) -{ - return git_futils_mkdir( - name->ptr + be->objects_dirlen, be->objects_dir, be->object_dir_mode, - GIT_MKDIR_PATH | GIT_MKDIR_SKIP_LAST | GIT_MKDIR_VERIFY_DIR); -} - -static size_t get_binary_object_header(obj_hdr *hdr, git_buf *obj) -{ - unsigned char c; - unsigned char *data = (unsigned char *)obj->ptr; - size_t shift, size, used = 0; - - if (git_buf_len(obj) == 0) - return 0; - - c = data[used++]; - hdr->type = (c >> 4) & 7; - - size = c & 15; - shift = 4; - while (c & 0x80) { - if (git_buf_len(obj) <= used) - return 0; - if (sizeof(size_t) * 8 <= shift) - return 0; - c = data[used++]; - size += (c & 0x7f) << shift; - shift += 7; - } - hdr->size = size; - - return used; -} - -static size_t get_object_header(obj_hdr *hdr, unsigned char *data) -{ - char c, typename[10]; - size_t size, used = 0; - - /* - * type name string followed by space. - */ - while ((c = data[used]) != ' ') { - typename[used++] = c; - if (used >= sizeof(typename)) - return 0; - } - typename[used] = 0; - if (used == 0) - return 0; - hdr->type = git_object_string2type(typename); - used++; /* consume the space */ - - /* - * length follows immediately in decimal (without - * leading zeros). - */ - size = data[used++] - '0'; - if (size > 9) - return 0; - if (size) { - while ((c = data[used]) != '\0') { - size_t d = c - '0'; - if (d > 9) - break; - used++; - size = size * 10 + d; - } - } - hdr->size = size; - - /* - * the length must be followed by a zero byte - */ - if (data[used++] != '\0') - return 0; - - return used; -} - - - -/*********************************************************** - * - * ZLIB RELATED FUNCTIONS - * - ***********************************************************/ - -static void init_stream(z_stream *s, void *out, size_t len) -{ - memset(s, 0, sizeof(*s)); - s->next_out = out; - s->avail_out = (uInt)len; -} - -static void set_stream_input(z_stream *s, void *in, size_t len) -{ - s->next_in = in; - s->avail_in = (uInt)len; -} - -static void set_stream_output(z_stream *s, void *out, size_t len) -{ - s->next_out = out; - s->avail_out = (uInt)len; -} - - -static int start_inflate(z_stream *s, git_buf *obj, void *out, size_t len) -{ - int status; - - init_stream(s, out, len); - set_stream_input(s, obj->ptr, git_buf_len(obj)); - - if ((status = inflateInit(s)) < Z_OK) - return status; - - return inflate(s, 0); -} - -static int finish_inflate(z_stream *s) -{ - int status = Z_OK; - - while (status == Z_OK) - status = inflate(s, Z_FINISH); - - inflateEnd(s); - - if ((status != Z_STREAM_END) || (s->avail_in != 0)) { - giterr_set(GITERR_ZLIB, "Failed to finish ZLib inflation. Stream aborted prematurely"); - return -1; - } - - return 0; -} - -static int is_zlib_compressed_data(unsigned char *data) -{ - unsigned int w; - - w = ((unsigned int)(data[0]) << 8) + data[1]; - return (data[0] & 0x8F) == 0x08 && !(w % 31); -} - -static int inflate_buffer(void *in, size_t inlen, void *out, size_t outlen) -{ - z_stream zs; - int status = Z_OK; - - memset(&zs, 0x0, sizeof(zs)); - - zs.next_out = out; - zs.avail_out = (uInt)outlen; - - zs.next_in = in; - zs.avail_in = (uInt)inlen; - - if (inflateInit(&zs) < Z_OK) { - giterr_set(GITERR_ZLIB, "Failed to inflate buffer"); - return -1; - } - - while (status == Z_OK) - status = inflate(&zs, Z_FINISH); - - inflateEnd(&zs); - - if (status != Z_STREAM_END /* || zs.avail_in != 0 */ || - zs.total_out != outlen) - { - giterr_set(GITERR_ZLIB, "Failed to inflate buffer. Stream aborted prematurely"); - return -1; - } - - return 0; -} - -static void *inflate_tail(z_stream *s, void *hb, size_t used, obj_hdr *hdr) -{ - unsigned char *buf, *head = hb; - size_t tail, alloc_size; - - /* - * allocate a buffer to hold the inflated data and copy the - * initial sequence of inflated data from the tail of the - * head buffer, if any. - */ - if (GIT_ADD_SIZET_OVERFLOW(&alloc_size, hdr->size, 1) || - (buf = git__malloc(alloc_size)) == NULL) { - inflateEnd(s); - return NULL; - } - tail = s->total_out - used; - if (used > 0 && tail > 0) { - if (tail > hdr->size) - tail = hdr->size; - memcpy(buf, head + used, tail); - } - used = tail; - - /* - * inflate the remainder of the object data, if any - */ - if (hdr->size < used) - inflateEnd(s); - else { - set_stream_output(s, buf + used, hdr->size - used); - if (finish_inflate(s)) { - git__free(buf); - return NULL; - } - } - - return buf; -} - -/* - * At one point, there was a loose object format that was intended to - * mimic the format used in pack-files. This was to allow easy copying - * of loose object data into packs. This format is no longer used, but - * we must still read it. - */ -static int inflate_packlike_loose_disk_obj(git_rawobj *out, git_buf *obj) -{ - unsigned char *in, *buf; - obj_hdr hdr; - size_t len, used, alloclen; - - /* - * read the object header, which is an (uncompressed) - * binary encoding of the object type and size. - */ - if ((used = get_binary_object_header(&hdr, obj)) == 0 || - !git_object_typeisloose(hdr.type)) { - giterr_set(GITERR_ODB, "Failed to inflate loose object."); - return -1; - } - - /* - * allocate a buffer and inflate the data into it - */ - GITERR_CHECK_ALLOC_ADD(&alloclen, hdr.size, 1); - buf = git__malloc(alloclen); - GITERR_CHECK_ALLOC(buf); - - in = ((unsigned char *)obj->ptr) + used; - len = obj->size - used; - if (inflate_buffer(in, len, buf, hdr.size) < 0) { - git__free(buf); - return -1; - } - buf[hdr.size] = '\0'; - - out->data = buf; - out->len = hdr.size; - out->type = hdr.type; - - return 0; -} - -static int inflate_disk_obj(git_rawobj *out, git_buf *obj) -{ - unsigned char head[64], *buf; - z_stream zs; - obj_hdr hdr; - size_t used; - - /* - * check for a pack-like loose object - */ - if (!is_zlib_compressed_data((unsigned char *)obj->ptr)) - return inflate_packlike_loose_disk_obj(out, obj); - - /* - * inflate the initial part of the io buffer in order - * to parse the object header (type and size). - */ - if (start_inflate(&zs, obj, head, sizeof(head)) < Z_OK || - (used = get_object_header(&hdr, head)) == 0 || - !git_object_typeisloose(hdr.type)) - { - giterr_set(GITERR_ODB, "Failed to inflate disk object."); - return -1; - } - - /* - * allocate a buffer and inflate the object data into it - * (including the initial sequence in the head buffer). - */ - if ((buf = inflate_tail(&zs, head, used, &hdr)) == NULL) - return -1; - buf[hdr.size] = '\0'; - - out->data = buf; - out->len = hdr.size; - out->type = hdr.type; - - return 0; -} - - - - - - -/*********************************************************** - * - * ODB OBJECT READING & WRITING - * - * Backend for the public API; read headers and full objects - * from the ODB. Write raw data to the ODB. - * - ***********************************************************/ - -static int read_loose(git_rawobj *out, git_buf *loc) -{ - int error; - git_buf obj = GIT_BUF_INIT; - - assert(out && loc); - - if (git_buf_oom(loc)) - return -1; - - out->data = NULL; - out->len = 0; - out->type = GIT_OBJ_BAD; - - if (!(error = git_futils_readbuffer(&obj, loc->ptr))) - error = inflate_disk_obj(out, &obj); - - git_buf_free(&obj); - - return error; -} - -static int read_header_loose(git_rawobj *out, git_buf *loc) -{ - int error = 0, z_return = Z_ERRNO, read_bytes; - git_file fd; - z_stream zs; - obj_hdr header_obj; - unsigned char raw_buffer[16], inflated_buffer[64]; - - assert(out && loc); - - if (git_buf_oom(loc)) - return -1; - - out->data = NULL; - - if ((fd = git_futils_open_ro(loc->ptr)) < 0) - return fd; - - init_stream(&zs, inflated_buffer, sizeof(inflated_buffer)); - - z_return = inflateInit(&zs); - - while (z_return == Z_OK) { - if ((read_bytes = p_read(fd, raw_buffer, sizeof(raw_buffer))) > 0) { - set_stream_input(&zs, raw_buffer, read_bytes); - z_return = inflate(&zs, 0); - } else - z_return = Z_STREAM_END; - } - - if ((z_return != Z_STREAM_END && z_return != Z_BUF_ERROR) - || get_object_header(&header_obj, inflated_buffer) == 0 - || git_object_typeisloose(header_obj.type) == 0) - { - giterr_set(GITERR_ZLIB, "Failed to read loose object header"); - error = -1; - } else { - out->len = header_obj.size; - out->type = header_obj.type; - } - - finish_inflate(&zs); - p_close(fd); - - return error; -} - -static int locate_object( - git_buf *object_location, - loose_backend *backend, - const git_oid *oid) -{ - int error = object_file_name(object_location, backend, oid); - - if (!error && !git_path_exists(object_location->ptr)) - return GIT_ENOTFOUND; - - return error; -} - -/* Explore an entry of a directory and see if it matches a short oid */ -static int fn_locate_object_short_oid(void *state, git_buf *pathbuf) { - loose_locate_object_state *sstate = (loose_locate_object_state *)state; - - if (git_buf_len(pathbuf) - sstate->dir_len != GIT_OID_HEXSZ - 2) { - /* Entry cannot be an object. Continue to next entry */ - return 0; - } - - if (git_path_isdir(pathbuf->ptr) == false) { - /* We are already in the directory matching the 2 first hex characters, - * compare the first ncmp characters of the oids */ - if (!memcmp(sstate->short_oid + 2, - (unsigned char *)pathbuf->ptr + sstate->dir_len, - sstate->short_oid_len - 2)) { - - if (!sstate->found) { - sstate->res_oid[0] = sstate->short_oid[0]; - sstate->res_oid[1] = sstate->short_oid[1]; - memcpy(sstate->res_oid+2, pathbuf->ptr+sstate->dir_len, GIT_OID_HEXSZ-2); - } - sstate->found++; - } - } - - if (sstate->found > 1) - return GIT_EAMBIGUOUS; - - return 0; -} - -/* Locate an object matching a given short oid */ -static int locate_object_short_oid( - git_buf *object_location, - git_oid *res_oid, - loose_backend *backend, - const git_oid *short_oid, - size_t len) -{ - char *objects_dir = backend->objects_dir; - size_t dir_len = strlen(objects_dir), alloc_len; - loose_locate_object_state state; - int error; - - /* prealloc memory for OBJ_DIR/xx/xx..38x..xx */ - GITERR_CHECK_ALLOC_ADD(&alloc_len, dir_len, GIT_OID_HEXSZ); - GITERR_CHECK_ALLOC_ADD(&alloc_len, alloc_len, 3); - if (git_buf_grow(object_location, alloc_len) < 0) - return -1; - - git_buf_set(object_location, objects_dir, dir_len); - git_path_to_dir(object_location); - - /* save adjusted position at end of dir so it can be restored later */ - dir_len = git_buf_len(object_location); - - /* Convert raw oid to hex formatted oid */ - git_oid_fmt((char *)state.short_oid, short_oid); - - /* Explore OBJ_DIR/xx/ where xx is the beginning of hex formatted short oid */ - if (git_buf_put(object_location, (char *)state.short_oid, 3) < 0) - return -1; - object_location->ptr[object_location->size - 1] = '/'; - - /* Check that directory exists */ - if (git_path_isdir(object_location->ptr) == false) - return git_odb__error_notfound("no matching loose object for prefix", short_oid); - - state.dir_len = git_buf_len(object_location); - state.short_oid_len = len; - state.found = 0; - - /* Explore directory to find a unique object matching short_oid */ - error = git_path_direach( - object_location, 0, fn_locate_object_short_oid, &state); - if (error < 0 && error != GIT_EAMBIGUOUS) - return error; - - if (!state.found) - return git_odb__error_notfound("no matching loose object for prefix", short_oid); - - if (state.found > 1) - return git_odb__error_ambiguous("multiple matches in loose objects"); - - /* Convert obtained hex formatted oid to raw */ - error = git_oid_fromstr(res_oid, (char *)state.res_oid); - if (error) - return error; - - /* Update the location according to the oid obtained */ - GITERR_CHECK_ALLOC_ADD(&alloc_len, dir_len, GIT_OID_HEXSZ); - GITERR_CHECK_ALLOC_ADD(&alloc_len, alloc_len, 2); - - git_buf_truncate(object_location, dir_len); - if (git_buf_grow(object_location, alloc_len) < 0) - return -1; - - git_oid_pathfmt(object_location->ptr + dir_len, res_oid); - - object_location->size += GIT_OID_HEXSZ + 1; - object_location->ptr[object_location->size] = '\0'; - - return 0; -} - - - - - - - - - -/*********************************************************** - * - * LOOSE BACKEND PUBLIC API - * - * Implement the git_odb_backend API calls - * - ***********************************************************/ - -static int loose_backend__read_header(size_t *len_p, git_otype *type_p, git_odb_backend *backend, const git_oid *oid) -{ - git_buf object_path = GIT_BUF_INIT; - git_rawobj raw; - int error; - - assert(backend && oid); - - raw.len = 0; - raw.type = GIT_OBJ_BAD; - - if (locate_object(&object_path, (loose_backend *)backend, oid) < 0) - error = git_odb__error_notfound("no matching loose object", oid); - else if ((error = read_header_loose(&raw, &object_path)) == 0) { - *len_p = raw.len; - *type_p = raw.type; - } - - git_buf_free(&object_path); - - return error; -} - -static int loose_backend__read(void **buffer_p, size_t *len_p, git_otype *type_p, git_odb_backend *backend, const git_oid *oid) -{ - git_buf object_path = GIT_BUF_INIT; - git_rawobj raw; - int error = 0; - - assert(backend && oid); - - if (locate_object(&object_path, (loose_backend *)backend, oid) < 0) - error = git_odb__error_notfound("no matching loose object", oid); - else if ((error = read_loose(&raw, &object_path)) == 0) { - *buffer_p = raw.data; - *len_p = raw.len; - *type_p = raw.type; - } - - git_buf_free(&object_path); - - return error; -} - -static int loose_backend__read_prefix( - git_oid *out_oid, - void **buffer_p, - size_t *len_p, - git_otype *type_p, - git_odb_backend *backend, - const git_oid *short_oid, - size_t len) -{ - int error = 0; - - assert(len >= GIT_OID_MINPREFIXLEN && len <= GIT_OID_HEXSZ); - - if (len == GIT_OID_HEXSZ) { - /* We can fall back to regular read method */ - error = loose_backend__read(buffer_p, len_p, type_p, backend, short_oid); - if (!error) - git_oid_cpy(out_oid, short_oid); - } else { - git_buf object_path = GIT_BUF_INIT; - git_rawobj raw; - - assert(backend && short_oid); - - if ((error = locate_object_short_oid(&object_path, out_oid, - (loose_backend *)backend, short_oid, len)) == 0 && - (error = read_loose(&raw, &object_path)) == 0) - { - *buffer_p = raw.data; - *len_p = raw.len; - *type_p = raw.type; - } - - git_buf_free(&object_path); - } - - return error; -} - -static int loose_backend__exists(git_odb_backend *backend, const git_oid *oid) -{ - git_buf object_path = GIT_BUF_INIT; - int error; - - assert(backend && oid); - - error = locate_object(&object_path, (loose_backend *)backend, oid); - - git_buf_free(&object_path); - - return !error; -} - -static int loose_backend__exists_prefix( - git_oid *out, git_odb_backend *backend, const git_oid *short_id, size_t len) -{ - git_buf object_path = GIT_BUF_INIT; - int error; - - assert(backend && out && short_id && len >= GIT_OID_MINPREFIXLEN); - - error = locate_object_short_oid( - &object_path, out, (loose_backend *)backend, short_id, len); - - git_buf_free(&object_path); - - return error; -} - -struct foreach_state { - size_t dir_len; - git_odb_foreach_cb cb; - void *data; -}; - -GIT_INLINE(int) filename_to_oid(git_oid *oid, const char *ptr) -{ - int v, i = 0; - if (strlen(ptr) != GIT_OID_HEXSZ+1) - return -1; - - if (ptr[2] != '/') { - return -1; - } - - v = (git__fromhex(ptr[i]) << 4) | git__fromhex(ptr[i+1]); - if (v < 0) - return -1; - - oid->id[0] = (unsigned char) v; - - ptr += 3; - for (i = 0; i < 38; i += 2) { - v = (git__fromhex(ptr[i]) << 4) | git__fromhex(ptr[i + 1]); - if (v < 0) - return -1; - - oid->id[1 + i/2] = (unsigned char) v; - } - - return 0; -} - -static int foreach_object_dir_cb(void *_state, git_buf *path) -{ - git_oid oid; - struct foreach_state *state = (struct foreach_state *) _state; - - if (filename_to_oid(&oid, path->ptr + state->dir_len) < 0) - return 0; - - return giterr_set_after_callback_function( - state->cb(&oid, state->data), "git_odb_foreach"); -} - -static int foreach_cb(void *_state, git_buf *path) -{ - struct foreach_state *state = (struct foreach_state *) _state; - - /* non-dir is some stray file, ignore it */ - if (!git_path_isdir(git_buf_cstr(path))) - return 0; - - return git_path_direach(path, 0, foreach_object_dir_cb, state); -} - -static int loose_backend__foreach(git_odb_backend *_backend, git_odb_foreach_cb cb, void *data) -{ - char *objects_dir; - int error; - git_buf buf = GIT_BUF_INIT; - struct foreach_state state; - loose_backend *backend = (loose_backend *) _backend; - - assert(backend && cb); - - objects_dir = backend->objects_dir; - - git_buf_sets(&buf, objects_dir); - git_path_to_dir(&buf); - if (git_buf_oom(&buf)) - return -1; - - memset(&state, 0, sizeof(state)); - state.cb = cb; - state.data = data; - state.dir_len = git_buf_len(&buf); - - error = git_path_direach(&buf, 0, foreach_cb, &state); - - git_buf_free(&buf); - - return error; -} - -static int loose_backend__stream_fwrite(git_odb_stream *_stream, const git_oid *oid) -{ - loose_writestream *stream = (loose_writestream *)_stream; - loose_backend *backend = (loose_backend *)_stream->backend; - git_buf final_path = GIT_BUF_INIT; - int error = 0; - - if (object_file_name(&final_path, backend, oid) < 0 || - object_mkdir(&final_path, backend) < 0) - error = -1; - else - error = git_filebuf_commit_at( - &stream->fbuf, final_path.ptr); - - git_buf_free(&final_path); - - return error; -} - -static int loose_backend__stream_write(git_odb_stream *_stream, const char *data, size_t len) -{ - loose_writestream *stream = (loose_writestream *)_stream; - return git_filebuf_write(&stream->fbuf, data, len); -} - -static void loose_backend__stream_free(git_odb_stream *_stream) -{ - loose_writestream *stream = (loose_writestream *)_stream; - - git_filebuf_cleanup(&stream->fbuf); - git__free(stream); -} - -static int loose_backend__stream(git_odb_stream **stream_out, git_odb_backend *_backend, git_off_t length, git_otype type) -{ - loose_backend *backend; - loose_writestream *stream = NULL; - char hdr[64]; - git_buf tmp_path = GIT_BUF_INIT; - int hdrlen; - - assert(_backend && length >= 0); - - backend = (loose_backend *)_backend; - *stream_out = NULL; - - hdrlen = git_odb__format_object_header(hdr, sizeof(hdr), length, type); - - stream = git__calloc(1, sizeof(loose_writestream)); - GITERR_CHECK_ALLOC(stream); - - stream->stream.backend = _backend; - stream->stream.read = NULL; /* read only */ - stream->stream.write = &loose_backend__stream_write; - stream->stream.finalize_write = &loose_backend__stream_fwrite; - stream->stream.free = &loose_backend__stream_free; - stream->stream.mode = GIT_STREAM_WRONLY; - - if (git_buf_joinpath(&tmp_path, backend->objects_dir, "tmp_object") < 0 || - git_filebuf_open(&stream->fbuf, tmp_path.ptr, - GIT_FILEBUF_TEMPORARY | - (backend->object_zlib_level << GIT_FILEBUF_DEFLATE_SHIFT), - backend->object_file_mode) < 0 || - stream->stream.write((git_odb_stream *)stream, hdr, hdrlen) < 0) - { - git_filebuf_cleanup(&stream->fbuf); - git__free(stream); - stream = NULL; - } - git_buf_free(&tmp_path); - *stream_out = (git_odb_stream *)stream; - - return !stream ? -1 : 0; -} - -static int loose_backend__write(git_odb_backend *_backend, const git_oid *oid, const void *data, size_t len, git_otype type) -{ - int error = 0, header_len; - git_buf final_path = GIT_BUF_INIT; - char header[64]; - git_filebuf fbuf = GIT_FILEBUF_INIT; - loose_backend *backend; - - backend = (loose_backend *)_backend; - - /* prepare the header for the file */ - header_len = git_odb__format_object_header(header, sizeof(header), len, type); - - if (git_buf_joinpath(&final_path, backend->objects_dir, "tmp_object") < 0 || - git_filebuf_open(&fbuf, final_path.ptr, - GIT_FILEBUF_TEMPORARY | - (backend->object_zlib_level << GIT_FILEBUF_DEFLATE_SHIFT), - backend->object_file_mode) < 0) - { - error = -1; - goto cleanup; - } - - git_filebuf_write(&fbuf, header, header_len); - git_filebuf_write(&fbuf, data, len); - - if (object_file_name(&final_path, backend, oid) < 0 || - object_mkdir(&final_path, backend) < 0 || - git_filebuf_commit_at(&fbuf, final_path.ptr) < 0) - error = -1; - -cleanup: - if (error < 0) - git_filebuf_cleanup(&fbuf); - git_buf_free(&final_path); - return error; -} - -static void loose_backend__free(git_odb_backend *_backend) -{ - loose_backend *backend; - assert(_backend); - backend = (loose_backend *)_backend; - - git__free(backend); -} - -int git_odb_backend_loose( - git_odb_backend **backend_out, - const char *objects_dir, - int compression_level, - int do_fsync, - unsigned int dir_mode, - unsigned int file_mode) -{ - loose_backend *backend; - size_t objects_dirlen, alloclen; - - assert(backend_out && objects_dir); - - objects_dirlen = strlen(objects_dir); - - GITERR_CHECK_ALLOC_ADD(&alloclen, sizeof(loose_backend), objects_dirlen); - GITERR_CHECK_ALLOC_ADD(&alloclen, alloclen, 2); - backend = git__calloc(1, alloclen); - GITERR_CHECK_ALLOC(backend); - - backend->parent.version = GIT_ODB_BACKEND_VERSION; - backend->objects_dirlen = objects_dirlen; - memcpy(backend->objects_dir, objects_dir, objects_dirlen); - if (backend->objects_dir[backend->objects_dirlen - 1] != '/') - backend->objects_dir[backend->objects_dirlen++] = '/'; - - if (compression_level < 0) - compression_level = Z_BEST_SPEED; - - if (dir_mode == 0) - dir_mode = GIT_OBJECT_DIR_MODE; - - if (file_mode == 0) - file_mode = GIT_OBJECT_FILE_MODE; - - backend->object_zlib_level = compression_level; - backend->fsync_object_files = do_fsync; - backend->object_dir_mode = dir_mode; - backend->object_file_mode = file_mode; - - backend->parent.read = &loose_backend__read; - backend->parent.write = &loose_backend__write; - backend->parent.read_prefix = &loose_backend__read_prefix; - backend->parent.read_header = &loose_backend__read_header; - backend->parent.writestream = &loose_backend__stream; - backend->parent.exists = &loose_backend__exists; - backend->parent.exists_prefix = &loose_backend__exists_prefix; - backend->parent.foreach = &loose_backend__foreach; - backend->parent.free = &loose_backend__free; - - *backend_out = (git_odb_backend *)backend; - return 0; -} diff --git a/vendor/libgit2/src/odb_mempack.c b/vendor/libgit2/src/odb_mempack.c deleted file mode 100644 index 34355270f6..0000000000 --- a/vendor/libgit2/src/odb_mempack.c +++ /dev/null @@ -1,184 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#include "common.h" -#include "git2/object.h" -#include "git2/sys/odb_backend.h" -#include "fileops.h" -#include "hash.h" -#include "odb.h" -#include "array.h" -#include "oidmap.h" - -#include "git2/odb_backend.h" -#include "git2/types.h" -#include "git2/pack.h" - -GIT__USE_OIDMAP - -struct memobject { - git_oid oid; - size_t len; - git_otype type; - char data[]; -}; - -struct memory_packer_db { - git_odb_backend parent; - git_oidmap *objects; - git_array_t(struct memobject *) commits; -}; - -static int impl__write(git_odb_backend *_backend, const git_oid *oid, const void *data, size_t len, git_otype type) -{ - struct memory_packer_db *db = (struct memory_packer_db *)_backend; - struct memobject *obj = NULL; - khiter_t pos; - size_t alloc_len; - int rval; - - pos = kh_put(oid, db->objects, oid, &rval); - if (rval < 0) - return -1; - - if (rval == 0) - return 0; - - GITERR_CHECK_ALLOC_ADD(&alloc_len, sizeof(struct memobject), len); - obj = git__malloc(alloc_len); - GITERR_CHECK_ALLOC(obj); - - memcpy(obj->data, data, len); - git_oid_cpy(&obj->oid, oid); - obj->len = len; - obj->type = type; - - kh_key(db->objects, pos) = &obj->oid; - kh_val(db->objects, pos) = obj; - - if (type == GIT_OBJ_COMMIT) { - struct memobject **store = git_array_alloc(db->commits); - GITERR_CHECK_ALLOC(store); - *store = obj; - } - - return 0; -} - -static int impl__exists(git_odb_backend *backend, const git_oid *oid) -{ - struct memory_packer_db *db = (struct memory_packer_db *)backend; - khiter_t pos; - - pos = kh_get(oid, db->objects, oid); - if (pos != kh_end(db->objects)) - return 1; - - return 0; -} - -static int impl__read(void **buffer_p, size_t *len_p, git_otype *type_p, git_odb_backend *backend, const git_oid *oid) -{ - struct memory_packer_db *db = (struct memory_packer_db *)backend; - struct memobject *obj = NULL; - khiter_t pos; - - pos = kh_get(oid, db->objects, oid); - if (pos == kh_end(db->objects)) - return GIT_ENOTFOUND; - - obj = kh_val(db->objects, pos); - - *len_p = obj->len; - *type_p = obj->type; - *buffer_p = git__malloc(obj->len); - GITERR_CHECK_ALLOC(*buffer_p); - - memcpy(*buffer_p, obj->data, obj->len); - return 0; -} - -static int impl__read_header(size_t *len_p, git_otype *type_p, git_odb_backend *backend, const git_oid *oid) -{ - struct memory_packer_db *db = (struct memory_packer_db *)backend; - struct memobject *obj = NULL; - khiter_t pos; - - pos = kh_get(oid, db->objects, oid); - if (pos == kh_end(db->objects)) - return GIT_ENOTFOUND; - - obj = kh_val(db->objects, pos); - - *len_p = obj->len; - *type_p = obj->type; - return 0; -} - -int git_mempack_dump(git_buf *pack, git_repository *repo, git_odb_backend *_backend) -{ - struct memory_packer_db *db = (struct memory_packer_db *)_backend; - git_packbuilder *packbuilder; - uint32_t i; - int err = -1; - - if (git_packbuilder_new(&packbuilder, repo) < 0) - return -1; - - for (i = 0; i < db->commits.size; ++i) { - struct memobject *commit = db->commits.ptr[i]; - - err = git_packbuilder_insert_commit(packbuilder, &commit->oid); - if (err < 0) - goto cleanup; - } - - err = git_packbuilder_write_buf(pack, packbuilder); - -cleanup: - git_packbuilder_free(packbuilder); - return err; -} - -void git_mempack_reset(git_odb_backend *_backend) -{ - struct memory_packer_db *db = (struct memory_packer_db *)_backend; - struct memobject *object = NULL; - - kh_foreach_value(db->objects, object, { - git__free(object); - }); - - git_array_clear(db->commits); -} - -static void impl__free(git_odb_backend *_backend) -{ - git_mempack_reset(_backend); - git__free(_backend); -} - -int git_mempack_new(git_odb_backend **out) -{ - struct memory_packer_db *db; - - assert(out); - - db = git__calloc(1, sizeof(struct memory_packer_db)); - GITERR_CHECK_ALLOC(db); - - db->objects = git_oidmap_alloc(); - - db->parent.read = &impl__read; - db->parent.write = &impl__write; - db->parent.read_header = &impl__read_header; - db->parent.exists = &impl__exists; - db->parent.free = &impl__free; - - *out = (git_odb_backend *)db; - return 0; -} diff --git a/vendor/libgit2/src/odb_pack.c b/vendor/libgit2/src/odb_pack.c deleted file mode 100644 index 735158d960..0000000000 --- a/vendor/libgit2/src/odb_pack.c +++ /dev/null @@ -1,691 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#include "common.h" -#include -#include "git2/repository.h" -#include "git2/indexer.h" -#include "git2/sys/odb_backend.h" -#include "fileops.h" -#include "hash.h" -#include "odb.h" -#include "delta-apply.h" -#include "sha1_lookup.h" -#include "mwindow.h" -#include "pack.h" - -#include "git2/odb_backend.h" - -struct pack_backend { - git_odb_backend parent; - git_vector packs; - struct git_pack_file *last_found; - char *pack_folder; -}; - -struct pack_writepack { - struct git_odb_writepack parent; - git_indexer *indexer; -}; - -/** - * The wonderful tale of a Packed Object lookup query - * =================================================== - * A riveting and epic story of epicness and ASCII - * art, presented by yours truly, - * Sir Vicent of Marti - * - * - * Chapter 1: Once upon a time... - * Initialization of the Pack Backend - * -------------------------------------------------- - * - * # git_odb_backend_pack - * | Creates the pack backend structure, initializes the - * | callback pointers to our default read() and exist() methods, - * | and tries to preload all the known packfiles in the ODB. - * | - * |-# packfile_load_all - * | Tries to find the `pack` folder, if it exists. ODBs without - * | a pack folder are ignored altogether. If there's a `pack` folder - * | we run a `dirent` callback through every file in the pack folder - * | to find our packfiles. The packfiles are then sorted according - * | to a sorting callback. - * | - * |-# packfile_load__cb - * | | This callback is called from `dirent` with every single file - * | | inside the pack folder. We find the packs by actually locating - * | | their index (ends in ".idx"). From that index, we verify that - * | | the corresponding packfile exists and is valid, and if so, we - * | | add it to the pack list. - * | | - * | |-# packfile_check - * | Make sure that there's a packfile to back this index, and store - * | some very basic information regarding the packfile itself, - * | such as the full path, the size, and the modification time. - * | We don't actually open the packfile to check for internal consistency. - * | - * |-# packfile_sort__cb - * Sort all the preloaded packs according to some specific criteria: - * we prioritize the "newer" packs because it's more likely they - * contain the objects we are looking for, and we prioritize local - * packs over remote ones. - * - * - * - * Chapter 2: To be, or not to be... - * A standard packed `exist` query for an OID - * -------------------------------------------------- - * - * # pack_backend__exists - * | Check if the given SHA1 oid exists in any of the packs - * | that have been loaded for our ODB. - * | - * |-# pack_entry_find - * | Iterate through all the packs that have been preloaded - * | (starting by the pack where the latest object was found) - * | to try to find the OID in one of them. - * | - * |-# pack_entry_find1 - * | Check the index of an individual pack to see if the SHA1 - * | OID can be found. If we can find the offset to that SHA1 - * | inside of the index, that means the object is contained - * | inside of the packfile and we can stop searching. - * | Before returning, we verify that the packfile behing the - * | index we are searching still exists on disk. - * | - * |-# pack_entry_find_offset - * | | Mmap the actual index file to disk if it hasn't been opened - * | | yet, and run a binary search through it to find the OID. - * | | See for specifics - * | | on the Packfile Index format and how do we find entries in it. - * | | - * | |-# pack_index_open - * | | Guess the name of the index based on the full path to the - * | | packfile, open it and verify its contents. Only if the index - * | | has not been opened already. - * | | - * | |-# pack_index_check - * | Mmap the index file and do a quick run through the header - * | to guess the index version (right now we support v1 and v2), - * | and to verify that the size of the index makes sense. - * | - * |-# packfile_open - * See `packfile_open` in Chapter 3 - * - * - * - * Chapter 3: The neverending story... - * A standard packed `lookup` query for an OID - * -------------------------------------------------- - * TODO - * - */ - - -/*********************************************************** - * - * FORWARD DECLARATIONS - * - ***********************************************************/ - -static int packfile_sort__cb(const void *a_, const void *b_); - -static int packfile_load__cb(void *_data, git_buf *path); - -static int pack_entry_find(struct git_pack_entry *e, - struct pack_backend *backend, const git_oid *oid); - -/* Can find the offset of an object given - * a prefix of an identifier. - * Sets GIT_EAMBIGUOUS if short oid is ambiguous. - * This method assumes that len is between - * GIT_OID_MINPREFIXLEN and GIT_OID_HEXSZ. - */ -static int pack_entry_find_prefix( - struct git_pack_entry *e, - struct pack_backend *backend, - const git_oid *short_oid, - size_t len); - - - -/*********************************************************** - * - * PACK WINDOW MANAGEMENT - * - ***********************************************************/ - -static int packfile_sort__cb(const void *a_, const void *b_) -{ - const struct git_pack_file *a = a_; - const struct git_pack_file *b = b_; - int st; - - /* - * Local packs tend to contain objects specific to our - * variant of the project than remote ones. In addition, - * remote ones could be on a network mounted filesystem. - * Favor local ones for these reasons. - */ - st = a->pack_local - b->pack_local; - if (st) - return -st; - - /* - * Younger packs tend to contain more recent objects, - * and more recent objects tend to get accessed more - * often. - */ - if (a->mtime < b->mtime) - return 1; - else if (a->mtime == b->mtime) - return 0; - - return -1; -} - - -static int packfile_load__cb(void *data, git_buf *path) -{ - struct pack_backend *backend = data; - struct git_pack_file *pack; - const char *path_str = git_buf_cstr(path); - size_t i, cmp_len = git_buf_len(path); - int error; - - if (cmp_len <= strlen(".idx") || git__suffixcmp(path_str, ".idx") != 0) - return 0; /* not an index */ - - cmp_len -= strlen(".idx"); - - for (i = 0; i < backend->packs.length; ++i) { - struct git_pack_file *p = git_vector_get(&backend->packs, i); - - if (memcmp(p->pack_name, path_str, cmp_len) == 0) - return 0; - } - - error = git_mwindow_get_pack(&pack, path->ptr); - - /* ignore missing .pack file as git does */ - if (error == GIT_ENOTFOUND) { - giterr_clear(); - return 0; - } - - if (!error) - error = git_vector_insert(&backend->packs, pack); - - return error; - -} - -static int pack_entry_find_inner( - struct git_pack_entry *e, - struct pack_backend *backend, - const git_oid *oid, - struct git_pack_file *last_found) -{ - size_t i; - - if (last_found && - git_pack_entry_find(e, last_found, oid, GIT_OID_HEXSZ) == 0) - return 0; - - for (i = 0; i < backend->packs.length; ++i) { - struct git_pack_file *p; - - p = git_vector_get(&backend->packs, i); - if (p == last_found) - continue; - - if (git_pack_entry_find(e, p, oid, GIT_OID_HEXSZ) == 0) { - backend->last_found = p; - return 0; - } - } - - return -1; -} - -static int pack_entry_find(struct git_pack_entry *e, struct pack_backend *backend, const git_oid *oid) -{ - struct git_pack_file *last_found = backend->last_found; - - if (backend->last_found && - git_pack_entry_find(e, backend->last_found, oid, GIT_OID_HEXSZ) == 0) - return 0; - - if (!pack_entry_find_inner(e, backend, oid, last_found)) - return 0; - - return git_odb__error_notfound("failed to find pack entry", oid); -} - -static int pack_entry_find_prefix( - struct git_pack_entry *e, - struct pack_backend *backend, - const git_oid *short_oid, - size_t len) -{ - int error; - size_t i; - git_oid found_full_oid = {{0}}; - bool found = false; - struct git_pack_file *last_found = backend->last_found; - - if (last_found) { - error = git_pack_entry_find(e, last_found, short_oid, len); - if (error == GIT_EAMBIGUOUS) - return error; - if (!error) { - git_oid_cpy(&found_full_oid, &e->sha1); - found = true; - } - } - - for (i = 0; i < backend->packs.length; ++i) { - struct git_pack_file *p; - - p = git_vector_get(&backend->packs, i); - if (p == last_found) - continue; - - error = git_pack_entry_find(e, p, short_oid, len); - if (error == GIT_EAMBIGUOUS) - return error; - if (!error) { - if (found && git_oid_cmp(&e->sha1, &found_full_oid)) - return git_odb__error_ambiguous("found multiple pack entries"); - git_oid_cpy(&found_full_oid, &e->sha1); - found = true; - backend->last_found = p; - } - } - - if (!found) - return git_odb__error_notfound("no matching pack entry for prefix", short_oid); - else - return 0; -} - - -/*********************************************************** - * - * PACKED BACKEND PUBLIC API - * - * Implement the git_odb_backend API calls - * - ***********************************************************/ -static int pack_backend__refresh(git_odb_backend *backend_) -{ - int error; - struct stat st; - git_buf path = GIT_BUF_INIT; - struct pack_backend *backend = (struct pack_backend *)backend_; - - if (backend->pack_folder == NULL) - return 0; - - if (p_stat(backend->pack_folder, &st) < 0 || !S_ISDIR(st.st_mode)) - return git_odb__error_notfound("failed to refresh packfiles", NULL); - - git_buf_sets(&path, backend->pack_folder); - - /* reload all packs */ - error = git_path_direach(&path, 0, packfile_load__cb, backend); - - git_buf_free(&path); - git_vector_sort(&backend->packs); - - return error; -} - -static int pack_backend__read_header_internal( - size_t *len_p, git_otype *type_p, - struct git_odb_backend *backend, const git_oid *oid) -{ - struct git_pack_entry e; - int error; - - assert(len_p && type_p && backend && oid); - - if ((error = pack_entry_find(&e, (struct pack_backend *)backend, oid)) < 0) - return error; - - return git_packfile_resolve_header(len_p, type_p, e.p, e.offset); -} - -static int pack_backend__read_header( - size_t *len_p, git_otype *type_p, - struct git_odb_backend *backend, const git_oid *oid) -{ - int error; - - error = pack_backend__read_header_internal(len_p, type_p, backend, oid); - - if (error != GIT_ENOTFOUND) - return error; - - if ((error = pack_backend__refresh(backend)) < 0) - return error; - - return pack_backend__read_header_internal(len_p, type_p, backend, oid); -} - -static int pack_backend__read_internal( - void **buffer_p, size_t *len_p, git_otype *type_p, - git_odb_backend *backend, const git_oid *oid) -{ - struct git_pack_entry e; - git_rawobj raw = {NULL}; - int error; - - if ((error = pack_entry_find(&e, (struct pack_backend *)backend, oid)) < 0 || - (error = git_packfile_unpack(&raw, e.p, &e.offset)) < 0) - return error; - - *buffer_p = raw.data; - *len_p = raw.len; - *type_p = raw.type; - - return 0; -} - -static int pack_backend__read( - void **buffer_p, size_t *len_p, git_otype *type_p, - git_odb_backend *backend, const git_oid *oid) -{ - int error; - - error = pack_backend__read_internal(buffer_p, len_p, type_p, backend, oid); - - if (error != GIT_ENOTFOUND) - return error; - - if ((error = pack_backend__refresh(backend)) < 0) - return error; - - return pack_backend__read_internal(buffer_p, len_p, type_p, backend, oid); -} - -static int pack_backend__read_prefix_internal( - git_oid *out_oid, - void **buffer_p, - size_t *len_p, - git_otype *type_p, - git_odb_backend *backend, - const git_oid *short_oid, - size_t len) -{ - int error = 0; - - if (len < GIT_OID_MINPREFIXLEN) - error = git_odb__error_ambiguous("prefix length too short"); - - else if (len >= GIT_OID_HEXSZ) { - /* We can fall back to regular read method */ - error = pack_backend__read(buffer_p, len_p, type_p, backend, short_oid); - if (!error) - git_oid_cpy(out_oid, short_oid); - } else { - struct git_pack_entry e; - git_rawobj raw; - - if ((error = pack_entry_find_prefix( - &e, (struct pack_backend *)backend, short_oid, len)) == 0 && - (error = git_packfile_unpack(&raw, e.p, &e.offset)) == 0) - { - *buffer_p = raw.data; - *len_p = raw.len; - *type_p = raw.type; - git_oid_cpy(out_oid, &e.sha1); - } - } - - return error; -} - -static int pack_backend__read_prefix( - git_oid *out_oid, - void **buffer_p, - size_t *len_p, - git_otype *type_p, - git_odb_backend *backend, - const git_oid *short_oid, - size_t len) -{ - int error; - - error = pack_backend__read_prefix_internal( - out_oid, buffer_p, len_p, type_p, backend, short_oid, len); - - if (error != GIT_ENOTFOUND) - return error; - - if ((error = pack_backend__refresh(backend)) < 0) - return error; - - return pack_backend__read_prefix_internal( - out_oid, buffer_p, len_p, type_p, backend, short_oid, len); -} - -static int pack_backend__exists(git_odb_backend *backend, const git_oid *oid) -{ - struct git_pack_entry e; - int error; - - error = pack_entry_find(&e, (struct pack_backend *)backend, oid); - - if (error != GIT_ENOTFOUND) - return error == 0; - - if ((error = pack_backend__refresh(backend)) < 0) { - giterr_clear(); - return (int)false; - } - - return pack_entry_find(&e, (struct pack_backend *)backend, oid) == 0; -} - -static int pack_backend__exists_prefix( - git_oid *out, git_odb_backend *backend, const git_oid *short_id, size_t len) -{ - int error; - struct pack_backend *pb = (struct pack_backend *)backend; - struct git_pack_entry e = {0}; - - error = pack_entry_find_prefix(&e, pb, short_id, len); - - if (error == GIT_ENOTFOUND && !(error = pack_backend__refresh(backend))) - error = pack_entry_find_prefix(&e, pb, short_id, len); - - git_oid_cpy(out, &e.sha1); - - return error; -} - -static int pack_backend__foreach(git_odb_backend *_backend, git_odb_foreach_cb cb, void *data) -{ - int error; - struct git_pack_file *p; - struct pack_backend *backend; - unsigned int i; - - assert(_backend && cb); - backend = (struct pack_backend *)_backend; - - /* Make sure we know about the packfiles */ - if ((error = pack_backend__refresh(_backend)) < 0) - return error; - - git_vector_foreach(&backend->packs, i, p) { - if ((error = git_pack_foreach_entry(p, cb, data)) < 0) - return error; - } - - return 0; -} - -static int pack_backend__writepack_append(struct git_odb_writepack *_writepack, const void *data, size_t size, git_transfer_progress *stats) -{ - struct pack_writepack *writepack = (struct pack_writepack *)_writepack; - - assert(writepack); - - return git_indexer_append(writepack->indexer, data, size, stats); -} - -static int pack_backend__writepack_commit(struct git_odb_writepack *_writepack, git_transfer_progress *stats) -{ - struct pack_writepack *writepack = (struct pack_writepack *)_writepack; - - assert(writepack); - - return git_indexer_commit(writepack->indexer, stats); -} - -static void pack_backend__writepack_free(struct git_odb_writepack *_writepack) -{ - struct pack_writepack *writepack = (struct pack_writepack *)_writepack; - - assert(writepack); - - git_indexer_free(writepack->indexer); - git__free(writepack); -} - -static int pack_backend__writepack(struct git_odb_writepack **out, - git_odb_backend *_backend, - git_odb *odb, - git_transfer_progress_cb progress_cb, - void *progress_payload) -{ - struct pack_backend *backend; - struct pack_writepack *writepack; - - assert(out && _backend); - - *out = NULL; - - backend = (struct pack_backend *)_backend; - - writepack = git__calloc(1, sizeof(struct pack_writepack)); - GITERR_CHECK_ALLOC(writepack); - - if (git_indexer_new(&writepack->indexer, - backend->pack_folder, 0, odb, progress_cb, progress_payload) < 0) { - git__free(writepack); - return -1; - } - - writepack->parent.backend = _backend; - writepack->parent.append = pack_backend__writepack_append; - writepack->parent.commit = pack_backend__writepack_commit; - writepack->parent.free = pack_backend__writepack_free; - - *out = (git_odb_writepack *)writepack; - - return 0; -} - -static void pack_backend__free(git_odb_backend *_backend) -{ - struct pack_backend *backend; - size_t i; - - assert(_backend); - - backend = (struct pack_backend *)_backend; - - for (i = 0; i < backend->packs.length; ++i) { - struct git_pack_file *p = git_vector_get(&backend->packs, i); - git_mwindow_put_pack(p); - } - - git_vector_free(&backend->packs); - git__free(backend->pack_folder); - git__free(backend); -} - -static int pack_backend__alloc(struct pack_backend **out, size_t initial_size) -{ - struct pack_backend *backend = git__calloc(1, sizeof(struct pack_backend)); - GITERR_CHECK_ALLOC(backend); - - if (git_vector_init(&backend->packs, initial_size, packfile_sort__cb) < 0) { - git__free(backend); - return -1; - } - - backend->parent.version = GIT_ODB_BACKEND_VERSION; - - backend->parent.read = &pack_backend__read; - backend->parent.read_prefix = &pack_backend__read_prefix; - backend->parent.read_header = &pack_backend__read_header; - backend->parent.exists = &pack_backend__exists; - backend->parent.exists_prefix = &pack_backend__exists_prefix; - backend->parent.refresh = &pack_backend__refresh; - backend->parent.foreach = &pack_backend__foreach; - backend->parent.writepack = &pack_backend__writepack; - backend->parent.free = &pack_backend__free; - - *out = backend; - return 0; -} - -int git_odb_backend_one_pack(git_odb_backend **backend_out, const char *idx) -{ - struct pack_backend *backend = NULL; - struct git_pack_file *packfile = NULL; - - if (pack_backend__alloc(&backend, 1) < 0) - return -1; - - if (git_mwindow_get_pack(&packfile, idx) < 0 || - git_vector_insert(&backend->packs, packfile) < 0) - { - pack_backend__free((git_odb_backend *)backend); - return -1; - } - - *backend_out = (git_odb_backend *)backend; - return 0; -} - -int git_odb_backend_pack(git_odb_backend **backend_out, const char *objects_dir) -{ - int error = 0; - struct pack_backend *backend = NULL; - git_buf path = GIT_BUF_INIT; - - if (git_mwindow_files_init() < 0) - return -1; - - if (pack_backend__alloc(&backend, 8) < 0) - return -1; - - if (!(error = git_buf_joinpath(&path, objects_dir, "pack")) && - git_path_isdir(git_buf_cstr(&path))) - { - backend->pack_folder = git_buf_detach(&path); - - error = pack_backend__refresh((git_odb_backend *)backend); - } - - if (error < 0) { - pack_backend__free((git_odb_backend *)backend); - backend = NULL; - } - - *backend_out = (git_odb_backend *)backend; - - git_buf_free(&path); - - return error; -} diff --git a/vendor/libgit2/src/offmap.h b/vendor/libgit2/src/offmap.h deleted file mode 100644 index 0d0e51272c..0000000000 --- a/vendor/libgit2/src/offmap.h +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright (C) 2012 the libgit2 contributors - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_offmap_h__ -#define INCLUDE_offmap_h__ - -#include "common.h" -#include "git2/types.h" - -#define kmalloc git__malloc -#define kcalloc git__calloc -#define krealloc git__realloc -#define kreallocarray git__reallocarray -#define kfree git__free -#include "khash.h" - -__KHASH_TYPE(off, git_off_t, void *) -typedef khash_t(off) git_offmap; - -#define GIT__USE_OFFMAP \ - __KHASH_IMPL(off, static kh_inline, git_off_t, void *, 1, kh_int64_hash_func, kh_int64_hash_equal) - -#define git_offmap_alloc() kh_init(off) -#define git_offmap_free(h) kh_destroy(off, h), h = NULL -#define git_offmap_clear(h) kh_clear(off, h) - -#define git_offmap_num_entries(h) kh_size(h) - -#define git_offmap_lookup_index(h, k) kh_get(off, h, k) -#define git_offmap_valid_index(h, idx) (idx != kh_end(h)) - -#define git_offmap_exists(h, k) (kh_get(off, h, k) != kh_end(h)) - -#define git_offmap_value_at(h, idx) kh_val(h, idx) -#define git_offmap_set_value_at(h, idx, v) kh_val(h, idx) = v -#define git_offmap_delete_at(h, idx) kh_del(off, h, idx) - -#define git_offmap_insert(h, key, val, rval) do { \ - khiter_t __pos = kh_put(off, h, key, &rval); \ - if (rval >= 0) { \ - if (rval == 0) kh_key(h, __pos) = key; \ - kh_val(h, __pos) = val; \ - } } while (0) - -#define git_offmap_insert2(h, key, val, oldv, rval) do { \ - khiter_t __pos = kh_put(off, h, key, &rval); \ - if (rval >= 0) { \ - if (rval == 0) { \ - oldv = kh_val(h, __pos); \ - kh_key(h, __pos) = key; \ - } else { oldv = NULL; } \ - kh_val(h, __pos) = val; \ - } } while (0) - -#define git_offmap_delete(h, key) do { \ - khiter_t __pos = git_offmap_lookup_index(h, key); \ - if (git_offmap_valid_index(h, __pos)) \ - git_offmap_delete_at(h, __pos); } while (0) - -#define git_offmap_foreach kh_foreach -#define git_offmap_foreach_value kh_foreach_value - -#endif diff --git a/vendor/libgit2/src/oid.c b/vendor/libgit2/src/oid.c deleted file mode 100644 index 9fe2ebb652..0000000000 --- a/vendor/libgit2/src/oid.c +++ /dev/null @@ -1,441 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#include "common.h" -#include "git2/oid.h" -#include "repository.h" -#include "global.h" -#include -#include - -static char to_hex[] = "0123456789abcdef"; - -static int oid_error_invalid(const char *msg) -{ - giterr_set(GITERR_INVALID, "Unable to parse OID - %s", msg); - return -1; -} - -int git_oid_fromstrn(git_oid *out, const char *str, size_t length) -{ - size_t p; - int v; - - assert(out && str); - - if (!length) - return oid_error_invalid("too short"); - - if (length > GIT_OID_HEXSZ) - return oid_error_invalid("too long"); - - memset(out->id, 0, GIT_OID_RAWSZ); - - for (p = 0; p < length; p++) { - v = git__fromhex(str[p]); - if (v < 0) - return oid_error_invalid("contains invalid characters"); - - out->id[p / 2] |= (unsigned char)(v << (p % 2 ? 0 : 4)); - } - - return 0; -} - -int git_oid_fromstrp(git_oid *out, const char *str) -{ - return git_oid_fromstrn(out, str, strlen(str)); -} - -int git_oid_fromstr(git_oid *out, const char *str) -{ - return git_oid_fromstrn(out, str, GIT_OID_HEXSZ); -} - -GIT_INLINE(char) *fmt_one(char *str, unsigned int val) -{ - *str++ = to_hex[val >> 4]; - *str++ = to_hex[val & 0xf]; - return str; -} - -void git_oid_nfmt(char *str, size_t n, const git_oid *oid) -{ - size_t i, max_i; - - if (!oid) { - memset(str, 0, n); - return; - } - if (n > GIT_OID_HEXSZ) { - memset(&str[GIT_OID_HEXSZ], 0, n - GIT_OID_HEXSZ); - n = GIT_OID_HEXSZ; - } - - max_i = n / 2; - - for (i = 0; i < max_i; i++) - str = fmt_one(str, oid->id[i]); - - if (n & 1) - *str++ = to_hex[oid->id[i] >> 4]; -} - -void git_oid_fmt(char *str, const git_oid *oid) -{ - git_oid_nfmt(str, GIT_OID_HEXSZ, oid); -} - -void git_oid_pathfmt(char *str, const git_oid *oid) -{ - size_t i; - - str = fmt_one(str, oid->id[0]); - *str++ = '/'; - for (i = 1; i < sizeof(oid->id); i++) - str = fmt_one(str, oid->id[i]); -} - -char *git_oid_tostr_s(const git_oid *oid) -{ - char *str = GIT_GLOBAL->oid_fmt; - git_oid_nfmt(str, GIT_OID_HEXSZ + 1, oid); - return str; -} - -char *git_oid_allocfmt(const git_oid *oid) -{ - char *str = git__malloc(GIT_OID_HEXSZ + 1); - if (!str) - return NULL; - git_oid_nfmt(str, GIT_OID_HEXSZ + 1, oid); - return str; -} - -char *git_oid_tostr(char *out, size_t n, const git_oid *oid) -{ - if (!out || n == 0) - return ""; - - if (n > GIT_OID_HEXSZ + 1) - n = GIT_OID_HEXSZ + 1; - - git_oid_nfmt(out, n - 1, oid); /* allow room for terminating NUL */ - out[n - 1] = '\0'; - - return out; -} - -int git_oid__parse( - git_oid *oid, const char **buffer_out, - const char *buffer_end, const char *header) -{ - const size_t sha_len = GIT_OID_HEXSZ; - const size_t header_len = strlen(header); - - const char *buffer = *buffer_out; - - if (buffer + (header_len + sha_len + 1) > buffer_end) - return -1; - - if (memcmp(buffer, header, header_len) != 0) - return -1; - - if (buffer[header_len + sha_len] != '\n') - return -1; - - if (git_oid_fromstr(oid, buffer + header_len) < 0) - return -1; - - *buffer_out = buffer + (header_len + sha_len + 1); - - return 0; -} - -void git_oid__writebuf(git_buf *buf, const char *header, const git_oid *oid) -{ - char hex_oid[GIT_OID_HEXSZ]; - - git_oid_fmt(hex_oid, oid); - git_buf_puts(buf, header); - git_buf_put(buf, hex_oid, GIT_OID_HEXSZ); - git_buf_putc(buf, '\n'); -} - -void git_oid_fromraw(git_oid *out, const unsigned char *raw) -{ - memcpy(out->id, raw, sizeof(out->id)); -} - -void git_oid_cpy(git_oid *out, const git_oid *src) -{ - memcpy(out->id, src->id, sizeof(out->id)); -} - -int git_oid_cmp(const git_oid *a, const git_oid *b) -{ - return git_oid__cmp(a, b); -} - -int git_oid_equal(const git_oid *a, const git_oid *b) -{ - return (git_oid__cmp(a, b) == 0); -} - -int git_oid_ncmp(const git_oid *oid_a, const git_oid *oid_b, size_t len) -{ - const unsigned char *a = oid_a->id; - const unsigned char *b = oid_b->id; - - if (len > GIT_OID_HEXSZ) - len = GIT_OID_HEXSZ; - - while (len > 1) { - if (*a != *b) - return 1; - a++; - b++; - len -= 2; - }; - - if (len) - if ((*a ^ *b) & 0xf0) - return 1; - - return 0; -} - -int git_oid_strcmp(const git_oid *oid_a, const char *str) -{ - const unsigned char *a; - unsigned char strval; - int hexval; - - for (a = oid_a->id; *str && (a - oid_a->id) < GIT_OID_RAWSZ; ++a) { - if ((hexval = git__fromhex(*str++)) < 0) - return -1; - strval = (unsigned char)(hexval << 4); - if (*str) { - if ((hexval = git__fromhex(*str++)) < 0) - return -1; - strval |= hexval; - } - if (*a != strval) - return (*a - strval); - } - - return 0; -} - -int git_oid_streq(const git_oid *oid_a, const char *str) -{ - return git_oid_strcmp(oid_a, str) == 0 ? 0 : -1; -} - -int git_oid_iszero(const git_oid *oid_a) -{ - const unsigned char *a = oid_a->id; - unsigned int i; - for (i = 0; i < GIT_OID_RAWSZ; ++i, ++a) - if (*a != 0) - return 0; - return 1; -} - -typedef short node_index; - -typedef union { - const char *tail; - node_index children[16]; -} trie_node; - -struct git_oid_shorten { - trie_node *nodes; - size_t node_count, size; - int min_length, full; -}; - -static int resize_trie(git_oid_shorten *self, size_t new_size) -{ - self->nodes = git__reallocarray(self->nodes, new_size, sizeof(trie_node)); - GITERR_CHECK_ALLOC(self->nodes); - - if (new_size > self->size) { - memset(&self->nodes[self->size], 0x0, (new_size - self->size) * sizeof(trie_node)); - } - - self->size = new_size; - return 0; -} - -static trie_node *push_leaf(git_oid_shorten *os, node_index idx, int push_at, const char *oid) -{ - trie_node *node, *leaf; - node_index idx_leaf; - - if (os->node_count >= os->size) { - if (resize_trie(os, os->size * 2) < 0) - return NULL; - } - - idx_leaf = (node_index)os->node_count++; - - if (os->node_count == SHRT_MAX) { - os->full = 1; - return NULL; - } - - node = &os->nodes[idx]; - node->children[push_at] = -idx_leaf; - - leaf = &os->nodes[idx_leaf]; - leaf->tail = oid; - - return node; -} - -git_oid_shorten *git_oid_shorten_new(size_t min_length) -{ - git_oid_shorten *os; - - assert((size_t)((int)min_length) == min_length); - - os = git__calloc(1, sizeof(git_oid_shorten)); - if (os == NULL) - return NULL; - - if (resize_trie(os, 16) < 0) { - git__free(os); - return NULL; - } - - os->node_count = 1; - os->min_length = (int)min_length; - - return os; -} - -void git_oid_shorten_free(git_oid_shorten *os) -{ - if (os == NULL) - return; - - git__free(os->nodes); - git__free(os); -} - - -/* - * What wizardry is this? - * - * This is just a memory-optimized trie: basically a very fancy - * 16-ary tree, which is used to store the prefixes of the OID - * strings. - * - * Read more: http://en.wikipedia.org/wiki/Trie - * - * Magic that happens in this method: - * - * - Each node in the trie is an union, so it can work both as - * a normal node, or as a leaf. - * - * - Each normal node points to 16 children (one for each possible - * character in the oid). This is *not* stored in an array of - * pointers, because in a 64-bit arch this would be sucking - * 16*sizeof(void*) = 128 bytes of memory per node, which is - * insane. What we do is store Node Indexes, and use these indexes - * to look up each node in the om->index array. These indexes are - * signed shorts, so this limits the amount of unique OIDs that - * fit in the structure to about 20000 (assuming a more or less uniform - * distribution). - * - * - All the nodes in om->index array are stored contiguously in - * memory, and each of them is 32 bytes, so we fit 2x nodes per - * cache line. Convenient for speed. - * - * - To differentiate the leafs from the normal nodes, we store all - * the indexes towards a leaf as a negative index (indexes to normal - * nodes are positives). When we find that one of the children for - * a node has a negative value, that means it's going to be a leaf. - * This reduces the amount of indexes we have by two, but also reduces - * the size of each node by 1-4 bytes (the amount we would need to - * add a `is_leaf` field): this is good because it allows the nodes - * to fit cleanly in cache lines. - * - * - Once we reach an empty children, instead of continuing to insert - * new nodes for each remaining character of the OID, we store a pointer - * to the tail in the leaf; if the leaf is reached again, we turn it - * into a normal node and use the tail to create a new leaf. - * - * This is a pretty good balance between performance and memory usage. - */ -int git_oid_shorten_add(git_oid_shorten *os, const char *text_oid) -{ - int i; - bool is_leaf; - node_index idx; - - if (os->full) { - giterr_set(GITERR_INVALID, "Unable to shorten OID - OID set full"); - return -1; - } - - if (text_oid == NULL) - return os->min_length; - - idx = 0; - is_leaf = false; - - for (i = 0; i < GIT_OID_HEXSZ; ++i) { - int c = git__fromhex(text_oid[i]); - trie_node *node; - - if (c == -1) { - giterr_set(GITERR_INVALID, "Unable to shorten OID - invalid hex value"); - return -1; - } - - node = &os->nodes[idx]; - - if (is_leaf) { - const char *tail; - - tail = node->tail; - node->tail = NULL; - - node = push_leaf(os, idx, git__fromhex(tail[0]), &tail[1]); - if (node == NULL) { - if (os->full) - giterr_set(GITERR_INVALID, "Unable to shorten OID - OID set full"); - return -1; - } - } - - if (node->children[c] == 0) { - if (push_leaf(os, idx, c, &text_oid[i + 1]) == NULL) { - if (os->full) - giterr_set(GITERR_INVALID, "Unable to shorten OID - OID set full"); - return -1; - } - break; - } - - idx = node->children[c]; - is_leaf = false; - - if (idx < 0) { - node->children[c] = idx = -idx; - is_leaf = true; - } - } - - if (++i > os->min_length) - os->min_length = i; - - return os->min_length; -} - diff --git a/vendor/libgit2/src/oid.h b/vendor/libgit2/src/oid.h deleted file mode 100644 index aa1f0bfdcb..0000000000 --- a/vendor/libgit2/src/oid.h +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_oid_h__ -#define INCLUDE_oid_h__ - -#include "git2/oid.h" - -/** - * Format a git_oid into a newly allocated c-string. - * - * The c-string is owned by the caller and needs to be manually freed. - * - * @param id the oid structure to format - * @return the c-string; NULL if memory is exhausted. Caller must - * deallocate the string with git__free(). - */ -char *git_oid_allocfmt(const git_oid *id); - -GIT_INLINE(int) git_oid__hashcmp(const unsigned char *sha1, const unsigned char *sha2) -{ - int i; - - for (i = 0; i < GIT_OID_RAWSZ; i++, sha1++, sha2++) { - if (*sha1 != *sha2) - return *sha1 - *sha2; - } - - return 0; -} - -/* - * Compare two oid structures. - * - * @param a first oid structure. - * @param b second oid structure. - * @return <0, 0, >0 if a < b, a == b, a > b. - */ -GIT_INLINE(int) git_oid__cmp(const git_oid *a, const git_oid *b) -{ - return git_oid__hashcmp(a->id, b->id); -} - -#endif diff --git a/vendor/libgit2/src/oidarray.c b/vendor/libgit2/src/oidarray.c deleted file mode 100644 index 1d51a29581..0000000000 --- a/vendor/libgit2/src/oidarray.c +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#include "git2/oidarray.h" -#include "oidarray.h" -#include "array.h" - -void git_oidarray_free(git_oidarray *arr) -{ - git__free(arr->ids); -} - -void git_oidarray__from_array(git_oidarray *arr, git_array_oid_t *array) -{ - arr->count = array->size; - arr->ids = array->ptr; -} diff --git a/vendor/libgit2/src/oidarray.h b/vendor/libgit2/src/oidarray.h deleted file mode 100644 index a7215ae6c6..0000000000 --- a/vendor/libgit2/src/oidarray.h +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_oidarray_h__ -#define INCLUDE_oidarray_h__ - -#include "common.h" -#include "git2/oidarray.h" -#include "array.h" - -typedef git_array_t(git_oid) git_array_oid_t; - -extern void git_oidarray__from_array(git_oidarray *arr, git_array_oid_t *array); - -#endif diff --git a/vendor/libgit2/src/oidmap.h b/vendor/libgit2/src/oidmap.h deleted file mode 100644 index d2c451e7fe..0000000000 --- a/vendor/libgit2/src/oidmap.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_oidmap_h__ -#define INCLUDE_oidmap_h__ - -#include "common.h" -#include "git2/oid.h" - -#define kmalloc git__malloc -#define kcalloc git__calloc -#define krealloc git__realloc -#define kreallocarray git__reallocarray -#define kfree git__free -#include "khash.h" - -__KHASH_TYPE(oid, const git_oid *, void *) -typedef khash_t(oid) git_oidmap; - -GIT_INLINE(khint_t) git_oidmap_hash(const git_oid *oid) -{ - khint_t h; - memcpy(&h, oid, sizeof(khint_t)); - return h; -} - -#define GIT__USE_OIDMAP \ - __KHASH_IMPL(oid, static kh_inline, const git_oid *, void *, 1, git_oidmap_hash, git_oid_equal) - -#define git_oidmap_alloc() kh_init(oid) -#define git_oidmap_free(h) kh_destroy(oid,h), h = NULL - -#define git_oidmap_lookup_index(h, k) kh_get(oid, h, k) -#define git_oidmap_valid_index(h, idx) (idx != kh_end(h)) - -#define git_oidmap_value_at(h, idx) kh_val(h, idx) - -#define git_oidmap_insert(h, key, val, rval) do { \ - khiter_t __pos = kh_put(oid, h, key, &rval); \ - if (rval >= 0) { \ - if (rval == 0) kh_key(h, __pos) = key; \ - kh_val(h, __pos) = val; \ - } } while (0) - -#define git_oidmap_foreach_value kh_foreach_value - -#define git_oidmap_size(h) kh_size(h) - -#endif diff --git a/vendor/libgit2/src/openssl_stream.c b/vendor/libgit2/src/openssl_stream.c deleted file mode 100644 index 4df7c6b7c4..0000000000 --- a/vendor/libgit2/src/openssl_stream.c +++ /dev/null @@ -1,479 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#ifdef GIT_OPENSSL - -#include - -#include "global.h" -#include "posix.h" -#include "stream.h" -#include "socket_stream.h" -#include "netops.h" -#include "git2/transport.h" - -#ifdef GIT_CURL -# include "curl_stream.h" -#endif - -#ifndef GIT_WIN32 -# include -# include -# include -#endif - -#include -#include -#include -#include - -static int bio_create(BIO *b) -{ - b->init = 1; - b->num = 0; - b->ptr = NULL; - b->flags = 0; - - return 1; -} - -static int bio_destroy(BIO *b) -{ - if (!b) - return 0; - - b->init = 0; - b->num = 0; - b->ptr = NULL; - b->flags = 0; - - return 1; -} - -static int bio_read(BIO *b, char *buf, int len) -{ - git_stream *io = (git_stream *) b->ptr; - return (int) git_stream_read(io, buf, len); -} - -static int bio_write(BIO *b, const char *buf, int len) -{ - git_stream *io = (git_stream *) b->ptr; - return (int) git_stream_write(io, buf, len, 0); -} - -static long bio_ctrl(BIO *b, int cmd, long num, void *ptr) -{ - GIT_UNUSED(b); - GIT_UNUSED(num); - GIT_UNUSED(ptr); - - if (cmd == BIO_CTRL_FLUSH) - return 1; - - return 0; -} - -static int bio_gets(BIO *b, char *buf, int len) -{ - GIT_UNUSED(b); - GIT_UNUSED(buf); - GIT_UNUSED(len); - return -1; -} - -static int bio_puts(BIO *b, const char *str) -{ - return bio_write(b, str, strlen(str)); -} - -static BIO_METHOD git_stream_bio_method = { - BIO_TYPE_SOURCE_SINK, - "git_stream", - bio_write, - bio_read, - bio_puts, - bio_gets, - bio_ctrl, - bio_create, - bio_destroy -}; - -static int ssl_set_error(SSL *ssl, int error) -{ - int err; - unsigned long e; - - err = SSL_get_error(ssl, error); - - assert(err != SSL_ERROR_WANT_READ); - assert(err != SSL_ERROR_WANT_WRITE); - - switch (err) { - case SSL_ERROR_WANT_CONNECT: - case SSL_ERROR_WANT_ACCEPT: - giterr_set(GITERR_NET, "SSL error: connection failure\n"); - break; - case SSL_ERROR_WANT_X509_LOOKUP: - giterr_set(GITERR_NET, "SSL error: x509 error\n"); - break; - case SSL_ERROR_SYSCALL: - e = ERR_get_error(); - if (e > 0) { - giterr_set(GITERR_NET, "SSL error: %s", - ERR_error_string(e, NULL)); - break; - } else if (error < 0) { - giterr_set(GITERR_OS, "SSL error: syscall failure"); - break; - } - giterr_set(GITERR_NET, "SSL error: received early EOF"); - return GIT_EEOF; - break; - case SSL_ERROR_SSL: - e = ERR_get_error(); - giterr_set(GITERR_NET, "SSL error: %s", - ERR_error_string(e, NULL)); - break; - case SSL_ERROR_NONE: - case SSL_ERROR_ZERO_RETURN: - default: - giterr_set(GITERR_NET, "SSL error: unknown error"); - break; - } - return -1; -} - -static int ssl_teardown(SSL *ssl) -{ - int ret; - - ret = SSL_shutdown(ssl); - if (ret < 0) - ret = ssl_set_error(ssl, ret); - else - ret = 0; - - SSL_free(ssl); - return ret; -} - -static int check_host_name(const char *name, const char *host) -{ - if (!strcasecmp(name, host)) - return 0; - - if (gitno__match_host(name, host) < 0) - return -1; - - return 0; -} - -static int verify_server_cert(SSL *ssl, const char *host) -{ - X509 *cert; - X509_NAME *peer_name; - ASN1_STRING *str; - unsigned char *peer_cn = NULL; - int matched = -1, type = GEN_DNS; - GENERAL_NAMES *alts; - struct in6_addr addr6; - struct in_addr addr4; - void *addr; - int i = -1,j; - - if (SSL_get_verify_result(ssl) != X509_V_OK) { - giterr_set(GITERR_SSL, "The SSL certificate is invalid"); - return GIT_ECERTIFICATE; - } - - /* Try to parse the host as an IP address to see if it is */ - if (p_inet_pton(AF_INET, host, &addr4)) { - type = GEN_IPADD; - addr = &addr4; - } else { - if(p_inet_pton(AF_INET6, host, &addr6)) { - type = GEN_IPADD; - addr = &addr6; - } - } - - - cert = SSL_get_peer_certificate(ssl); - if (!cert) { - giterr_set(GITERR_SSL, "the server did not provide a certificate"); - return -1; - } - - /* Check the alternative names */ - alts = X509_get_ext_d2i(cert, NID_subject_alt_name, NULL, NULL); - if (alts) { - int num; - - num = sk_GENERAL_NAME_num(alts); - for (i = 0; i < num && matched != 1; i++) { - const GENERAL_NAME *gn = sk_GENERAL_NAME_value(alts, i); - const char *name = (char *) ASN1_STRING_data(gn->d.ia5); - size_t namelen = (size_t) ASN1_STRING_length(gn->d.ia5); - - /* Skip any names of a type we're not looking for */ - if (gn->type != type) - continue; - - if (type == GEN_DNS) { - /* If it contains embedded NULs, don't even try */ - if (memchr(name, '\0', namelen)) - continue; - - if (check_host_name(name, host) < 0) - matched = 0; - else - matched = 1; - } else if (type == GEN_IPADD) { - /* Here name isn't so much a name but a binary representation of the IP */ - matched = !!memcmp(name, addr, namelen); - } - } - } - GENERAL_NAMES_free(alts); - - if (matched == 0) - goto cert_fail_name; - - if (matched == 1) - return 0; - - /* If no alternative names are available, check the common name */ - peer_name = X509_get_subject_name(cert); - if (peer_name == NULL) - goto on_error; - - if (peer_name) { - /* Get the index of the last CN entry */ - while ((j = X509_NAME_get_index_by_NID(peer_name, NID_commonName, i)) >= 0) - i = j; - } - - if (i < 0) - goto on_error; - - str = X509_NAME_ENTRY_get_data(X509_NAME_get_entry(peer_name, i)); - if (str == NULL) - goto on_error; - - /* Work around a bug in OpenSSL whereby ASN1_STRING_to_UTF8 fails if it's already in utf-8 */ - if (ASN1_STRING_type(str) == V_ASN1_UTF8STRING) { - int size = ASN1_STRING_length(str); - - if (size > 0) { - peer_cn = OPENSSL_malloc(size + 1); - GITERR_CHECK_ALLOC(peer_cn); - memcpy(peer_cn, ASN1_STRING_data(str), size); - peer_cn[size] = '\0'; - } - } else { - int size = ASN1_STRING_to_UTF8(&peer_cn, str); - GITERR_CHECK_ALLOC(peer_cn); - if (memchr(peer_cn, '\0', size)) - goto cert_fail_name; - } - - if (check_host_name((char *)peer_cn, host) < 0) - goto cert_fail_name; - - OPENSSL_free(peer_cn); - - return 0; - -on_error: - OPENSSL_free(peer_cn); - return ssl_set_error(ssl, 0); - -cert_fail_name: - OPENSSL_free(peer_cn); - giterr_set(GITERR_SSL, "hostname does not match certificate"); - return GIT_ECERTIFICATE; -} - -typedef struct { - git_stream parent; - git_stream *io; - char *host; - SSL *ssl; - git_cert_x509 cert_info; -} openssl_stream; - -int openssl_close(git_stream *stream); - -int openssl_connect(git_stream *stream) -{ - int ret; - BIO *bio; - openssl_stream *st = (openssl_stream *) stream; - - if ((ret = git_stream_connect(st->io)) < 0) - return ret; - - bio = BIO_new(&git_stream_bio_method); - GITERR_CHECK_ALLOC(bio); - bio->ptr = st->io; - - SSL_set_bio(st->ssl, bio, bio); - /* specify the host in case SNI is needed */ -#ifdef SSL_CTRL_SET_TLSEXT_HOSTNAME - SSL_set_tlsext_host_name(st->ssl, st->host); -#endif - - if ((ret = SSL_connect(st->ssl)) <= 0) - return ssl_set_error(st->ssl, ret); - - return verify_server_cert(st->ssl, st->host); -} - -int openssl_certificate(git_cert **out, git_stream *stream) -{ - openssl_stream *st = (openssl_stream *) stream; - int len; - X509 *cert = SSL_get_peer_certificate(st->ssl); - unsigned char *guard, *encoded_cert; - - /* Retrieve the length of the certificate first */ - len = i2d_X509(cert, NULL); - if (len < 0) { - giterr_set(GITERR_NET, "failed to retrieve certificate information"); - return -1; - } - - encoded_cert = git__malloc(len); - GITERR_CHECK_ALLOC(encoded_cert); - /* i2d_X509 makes 'guard' point to just after the data */ - guard = encoded_cert; - - len = i2d_X509(cert, &guard); - if (len < 0) { - git__free(encoded_cert); - giterr_set(GITERR_NET, "failed to retrieve certificate information"); - return -1; - } - - st->cert_info.cert_type = GIT_CERT_X509; - st->cert_info.data = encoded_cert; - st->cert_info.len = len; - - *out = (git_cert *)&st->cert_info; - return 0; -} - -static int openssl_set_proxy(git_stream *stream, const char *proxy_url) -{ - openssl_stream *st = (openssl_stream *) stream; - - return git_stream_set_proxy(st->io, proxy_url); -} - -ssize_t openssl_write(git_stream *stream, const char *data, size_t len, int flags) -{ - openssl_stream *st = (openssl_stream *) stream; - int ret; - - GIT_UNUSED(flags); - - if ((ret = SSL_write(st->ssl, data, len)) <= 0) { - return ssl_set_error(st->ssl, ret); - } - - return ret; -} - -ssize_t openssl_read(git_stream *stream, void *data, size_t len) -{ - openssl_stream *st = (openssl_stream *) stream; - int ret; - - if ((ret = SSL_read(st->ssl, data, len)) <= 0) - ssl_set_error(st->ssl, ret); - - return ret; -} - -int openssl_close(git_stream *stream) -{ - openssl_stream *st = (openssl_stream *) stream; - int ret; - - if ((ret = ssl_teardown(st->ssl)) < 0) - return -1; - - return git_stream_close(st->io); -} - -void openssl_free(git_stream *stream) -{ - openssl_stream *st = (openssl_stream *) stream; - - git__free(st->host); - git__free(st->cert_info.data); - git_stream_free(st->io); - git__free(st); -} - -int git_openssl_stream_new(git_stream **out, const char *host, const char *port) -{ - int error; - openssl_stream *st; - - st = git__calloc(1, sizeof(openssl_stream)); - GITERR_CHECK_ALLOC(st); - -#ifdef GIT_CURL - error = git_curl_stream_new(&st->io, host, port); -#else - error = git_socket_stream_new(&st->io, host, port); -#endif - - if (error < 0) - return error; - - st->ssl = SSL_new(git__ssl_ctx); - if (st->ssl == NULL) { - giterr_set(GITERR_SSL, "failed to create ssl object"); - return -1; - } - - st->host = git__strdup(host); - GITERR_CHECK_ALLOC(st->host); - - st->parent.version = GIT_STREAM_VERSION; - st->parent.encrypted = 1; - st->parent.proxy_support = git_stream_supports_proxy(st->io); - st->parent.connect = openssl_connect; - st->parent.certificate = openssl_certificate; - st->parent.set_proxy = openssl_set_proxy; - st->parent.read = openssl_read; - st->parent.write = openssl_write; - st->parent.close = openssl_close; - st->parent.free = openssl_free; - - *out = (git_stream *) st; - return 0; -} - -#else - -#include "stream.h" - -int git_openssl_stream_new(git_stream **out, const char *host, const char *port) -{ - GIT_UNUSED(out); - GIT_UNUSED(host); - GIT_UNUSED(port); - - giterr_set(GITERR_SSL, "openssl is not supported in this version"); - return -1; -} - -#endif diff --git a/vendor/libgit2/src/openssl_stream.h b/vendor/libgit2/src/openssl_stream.h deleted file mode 100644 index 9ca06489e5..0000000000 --- a/vendor/libgit2/src/openssl_stream.h +++ /dev/null @@ -1,14 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_openssl_stream_h__ -#define INCLUDE_openssl_stream_h__ - -#include "git2/sys/stream.h" - -extern int git_openssl_stream_new(git_stream **out, const char *host, const char *port); - -#endif diff --git a/vendor/libgit2/src/pack-objects.c b/vendor/libgit2/src/pack-objects.c deleted file mode 100644 index c4c061a3a9..0000000000 --- a/vendor/libgit2/src/pack-objects.c +++ /dev/null @@ -1,1750 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#include "pack-objects.h" - -#include "zstream.h" -#include "delta.h" -#include "iterator.h" -#include "netops.h" -#include "pack.h" -#include "thread-utils.h" -#include "tree.h" -#include "util.h" -#include "revwalk.h" -#include "commit_list.h" - -#include "git2/pack.h" -#include "git2/commit.h" -#include "git2/tag.h" -#include "git2/indexer.h" -#include "git2/config.h" - -struct unpacked { - git_pobject *object; - void *data; - struct git_delta_index *index; - int depth; -}; - -struct tree_walk_context { - git_packbuilder *pb; - git_buf buf; -}; - -struct pack_write_context { - git_indexer *indexer; - git_transfer_progress *stats; -}; - -GIT__USE_OIDMAP - -#ifdef GIT_THREADS - -#define GIT_PACKBUILDER__MUTEX_OP(pb, mtx, op) do { \ - int result = git_mutex_##op(&(pb)->mtx); \ - assert(!result); \ - GIT_UNUSED(result); \ - } while (0) - -#else - -#define GIT_PACKBUILDER__MUTEX_OP(pb,mtx,op) GIT_UNUSED(pb) - -#endif /* GIT_THREADS */ - -#define git_packbuilder__cache_lock(pb) GIT_PACKBUILDER__MUTEX_OP(pb, cache_mutex, lock) -#define git_packbuilder__cache_unlock(pb) GIT_PACKBUILDER__MUTEX_OP(pb, cache_mutex, unlock) -#define git_packbuilder__progress_lock(pb) GIT_PACKBUILDER__MUTEX_OP(pb, progress_mutex, lock) -#define git_packbuilder__progress_unlock(pb) GIT_PACKBUILDER__MUTEX_OP(pb, progress_mutex, unlock) - -/* The minimal interval between progress updates (in seconds). */ -#define MIN_PROGRESS_UPDATE_INTERVAL 0.5 - -/* Size of the buffer to feed to zlib */ -#define COMPRESS_BUFLEN (1024 * 1024) - -static unsigned name_hash(const char *name) -{ - unsigned c, hash = 0; - - if (!name) - return 0; - - /* - * This effectively just creates a sortable number from the - * last sixteen non-whitespace characters. Last characters - * count "most", so things that end in ".c" sort together. - */ - while ((c = *name++) != 0) { - if (git__isspace(c)) - continue; - hash = (hash >> 2) + (c << 24); - } - return hash; -} - -static int packbuilder_config(git_packbuilder *pb) -{ - git_config *config; - int ret; - int64_t val; - - if ((ret = git_repository_config_snapshot(&config, pb->repo)) < 0) - return ret; - -#define config_get(KEY,DST,DFLT) do { \ - ret = git_config_get_int64(&val, config, KEY); \ - if (!ret) (DST) = val; \ - else if (ret == GIT_ENOTFOUND) (DST) = (DFLT); \ - else if (ret < 0) return -1; } while (0) - - config_get("pack.deltaCacheSize", pb->max_delta_cache_size, - GIT_PACK_DELTA_CACHE_SIZE); - config_get("pack.deltaCacheLimit", pb->cache_max_small_delta_size, - GIT_PACK_DELTA_CACHE_LIMIT); - config_get("pack.deltaCacheSize", pb->big_file_threshold, - GIT_PACK_BIG_FILE_THRESHOLD); - config_get("pack.windowMemory", pb->window_memory_limit, 0); - -#undef config_get - - git_config_free(config); - - return 0; -} - -int git_packbuilder_new(git_packbuilder **out, git_repository *repo) -{ - git_packbuilder *pb; - - *out = NULL; - - pb = git__calloc(1, sizeof(*pb)); - GITERR_CHECK_ALLOC(pb); - - pb->object_ix = git_oidmap_alloc(); - if (!pb->object_ix) - goto on_error; - - pb->walk_objects = git_oidmap_alloc(); - if (!pb->walk_objects) - goto on_error; - - if (git_pool_init(&pb->object_pool, sizeof(git_walk_object), 0) < 0) - goto on_error; - - pb->repo = repo; - pb->nr_threads = 1; /* do not spawn any thread by default */ - - if (git_hash_ctx_init(&pb->ctx) < 0 || - git_zstream_init(&pb->zstream) < 0 || - git_repository_odb(&pb->odb, repo) < 0 || - packbuilder_config(pb) < 0) - goto on_error; - -#ifdef GIT_THREADS - - if (git_mutex_init(&pb->cache_mutex) || - git_mutex_init(&pb->progress_mutex) || - git_cond_init(&pb->progress_cond)) - { - giterr_set(GITERR_OS, "Failed to initialize packbuilder mutex"); - goto on_error; - } - -#endif - - *out = pb; - return 0; - -on_error: - git_packbuilder_free(pb); - return -1; -} - -unsigned int git_packbuilder_set_threads(git_packbuilder *pb, unsigned int n) -{ - assert(pb); - -#ifdef GIT_THREADS - pb->nr_threads = n; -#else - GIT_UNUSED(n); - assert(1 == pb->nr_threads); -#endif - - return pb->nr_threads; -} - -static void rehash(git_packbuilder *pb) -{ - git_pobject *po; - khiter_t pos; - unsigned int i; - int ret; - - kh_clear(oid, pb->object_ix); - for (i = 0, po = pb->object_list; i < pb->nr_objects; i++, po++) { - pos = kh_put(oid, pb->object_ix, &po->id, &ret); - kh_value(pb->object_ix, pos) = po; - } -} - -int git_packbuilder_insert(git_packbuilder *pb, const git_oid *oid, - const char *name) -{ - git_pobject *po; - khiter_t pos; - size_t newsize; - int ret; - - assert(pb && oid); - - /* If the object already exists in the hash table, then we don't - * have any work to do */ - pos = kh_get(oid, pb->object_ix, oid); - if (pos != kh_end(pb->object_ix)) - return 0; - - if (pb->nr_objects >= pb->nr_alloc) { - GITERR_CHECK_ALLOC_ADD(&newsize, pb->nr_alloc, 1024); - GITERR_CHECK_ALLOC_MULTIPLY(&newsize, newsize, 3 / 2); - - if (!git__is_uint32(newsize)) { - giterr_set(GITERR_NOMEMORY, "Packfile too large to fit in memory."); - return -1; - } - - pb->nr_alloc = (uint32_t)newsize; - - pb->object_list = git__reallocarray(pb->object_list, - pb->nr_alloc, sizeof(*po)); - GITERR_CHECK_ALLOC(pb->object_list); - rehash(pb); - } - - po = pb->object_list + pb->nr_objects; - memset(po, 0x0, sizeof(*po)); - - if ((ret = git_odb_read_header(&po->size, &po->type, pb->odb, oid)) < 0) - return ret; - - pb->nr_objects++; - git_oid_cpy(&po->id, oid); - po->hash = name_hash(name); - - pos = kh_put(oid, pb->object_ix, &po->id, &ret); - if (ret < 0) { - giterr_set_oom(); - return ret; - } - assert(ret != 0); - kh_value(pb->object_ix, pos) = po; - - pb->done = false; - - if (pb->progress_cb) { - double current_time = git__timer(); - double elapsed = current_time - pb->last_progress_report_time; - - if (elapsed >= MIN_PROGRESS_UPDATE_INTERVAL) { - pb->last_progress_report_time = current_time; - - ret = pb->progress_cb( - GIT_PACKBUILDER_ADDING_OBJECTS, - pb->nr_objects, 0, pb->progress_cb_payload); - - if (ret) - return giterr_set_after_callback(ret); - } - } - - return 0; -} - -static int get_delta(void **out, git_odb *odb, git_pobject *po) -{ - git_odb_object *src = NULL, *trg = NULL; - unsigned long delta_size; - void *delta_buf; - - *out = NULL; - - if (git_odb_read(&src, odb, &po->delta->id) < 0 || - git_odb_read(&trg, odb, &po->id) < 0) - goto on_error; - - delta_buf = git_delta( - git_odb_object_data(src), (unsigned long)git_odb_object_size(src), - git_odb_object_data(trg), (unsigned long)git_odb_object_size(trg), - &delta_size, 0); - - if (!delta_buf || delta_size != po->delta_size) { - giterr_set(GITERR_INVALID, "Delta size changed"); - goto on_error; - } - - *out = delta_buf; - - git_odb_object_free(src); - git_odb_object_free(trg); - return 0; - -on_error: - git_odb_object_free(src); - git_odb_object_free(trg); - return -1; -} - -static int write_object( - git_packbuilder *pb, - git_pobject *po, - int (*write_cb)(void *buf, size_t size, void *cb_data), - void *cb_data) -{ - git_odb_object *obj = NULL; - git_otype type; - unsigned char hdr[10], *zbuf = NULL; - void *data = NULL; - size_t hdr_len, zbuf_len = COMPRESS_BUFLEN, data_len; - int error; - - /* - * If we have a delta base, let's use the delta to save space. - * Otherwise load the whole object. 'data' ends up pointing to - * whatever data we want to put into the packfile. - */ - if (po->delta) { - if (po->delta_data) - data = po->delta_data; - else if ((error = get_delta(&data, pb->odb, po)) < 0) - goto done; - - data_len = po->delta_size; - type = GIT_OBJ_REF_DELTA; - } else { - if ((error = git_odb_read(&obj, pb->odb, &po->id)) < 0) - goto done; - - data = (void *)git_odb_object_data(obj); - data_len = git_odb_object_size(obj); - type = git_odb_object_type(obj); - } - - /* Write header */ - hdr_len = git_packfile__object_header(hdr, data_len, type); - - if ((error = write_cb(hdr, hdr_len, cb_data)) < 0 || - (error = git_hash_update(&pb->ctx, hdr, hdr_len)) < 0) - goto done; - - if (type == GIT_OBJ_REF_DELTA) { - if ((error = write_cb(po->delta->id.id, GIT_OID_RAWSZ, cb_data)) < 0 || - (error = git_hash_update(&pb->ctx, po->delta->id.id, GIT_OID_RAWSZ)) < 0) - goto done; - } - - /* Write data */ - if (po->z_delta_size) { - data_len = po->z_delta_size; - - if ((error = write_cb(data, data_len, cb_data)) < 0 || - (error = git_hash_update(&pb->ctx, data, data_len)) < 0) - goto done; - } else { - zbuf = git__malloc(zbuf_len); - GITERR_CHECK_ALLOC(zbuf); - - git_zstream_reset(&pb->zstream); - git_zstream_set_input(&pb->zstream, data, data_len); - - while (!git_zstream_done(&pb->zstream)) { - if ((error = git_zstream_get_output(zbuf, &zbuf_len, &pb->zstream)) < 0 || - (error = write_cb(zbuf, zbuf_len, cb_data)) < 0 || - (error = git_hash_update(&pb->ctx, zbuf, zbuf_len)) < 0) - goto done; - - zbuf_len = COMPRESS_BUFLEN; /* reuse buffer */ - } - } - - /* - * If po->delta is true, data is a delta and it is our - * responsibility to free it (otherwise it's a git_object's - * data). We set po->delta_data to NULL in case we got the - * data from there instead of get_delta(). If we didn't, - * there's no harm. - */ - if (po->delta) { - git__free(data); - po->delta_data = NULL; - } - - pb->nr_written++; - -done: - git__free(zbuf); - git_odb_object_free(obj); - return error; -} - -enum write_one_status { - WRITE_ONE_SKIP = -1, /* already written */ - WRITE_ONE_BREAK = 0, /* writing this will bust the limit; not written */ - WRITE_ONE_WRITTEN = 1, /* normal */ - WRITE_ONE_RECURSIVE = 2 /* already scheduled to be written */ -}; - -static int write_one( - enum write_one_status *status, - git_packbuilder *pb, - git_pobject *po, - int (*write_cb)(void *buf, size_t size, void *cb_data), - void *cb_data) -{ - int error; - - if (po->recursing) { - *status = WRITE_ONE_RECURSIVE; - return 0; - } else if (po->written) { - *status = WRITE_ONE_SKIP; - return 0; - } - - if (po->delta) { - po->recursing = 1; - - if ((error = write_one(status, pb, po->delta, write_cb, cb_data)) < 0) - return error; - - /* we cannot depend on this one */ - if (*status == WRITE_ONE_RECURSIVE) - po->delta = NULL; - } - - *status = WRITE_ONE_WRITTEN; - po->written = 1; - po->recursing = 0; - - return write_object(pb, po, write_cb, cb_data); -} - -GIT_INLINE(void) add_to_write_order(git_pobject **wo, unsigned int *endp, - git_pobject *po) -{ - if (po->filled) - return; - wo[(*endp)++] = po; - po->filled = 1; -} - -static void add_descendants_to_write_order(git_pobject **wo, unsigned int *endp, - git_pobject *po) -{ - int add_to_order = 1; - while (po) { - if (add_to_order) { - git_pobject *s; - /* add this node... */ - add_to_write_order(wo, endp, po); - /* all its siblings... */ - for (s = po->delta_sibling; s; s = s->delta_sibling) { - add_to_write_order(wo, endp, s); - } - } - /* drop down a level to add left subtree nodes if possible */ - if (po->delta_child) { - add_to_order = 1; - po = po->delta_child; - } else { - add_to_order = 0; - /* our sibling might have some children, it is next */ - if (po->delta_sibling) { - po = po->delta_sibling; - continue; - } - /* go back to our parent node */ - po = po->delta; - while (po && !po->delta_sibling) { - /* we're on the right side of a subtree, keep - * going up until we can go right again */ - po = po->delta; - } - if (!po) { - /* done- we hit our original root node */ - return; - } - /* pass it off to sibling at this level */ - po = po->delta_sibling; - } - }; -} - -static void add_family_to_write_order(git_pobject **wo, unsigned int *endp, - git_pobject *po) -{ - git_pobject *root; - - for (root = po; root->delta; root = root->delta) - ; /* nothing */ - add_descendants_to_write_order(wo, endp, root); -} - -static int cb_tag_foreach(const char *name, git_oid *oid, void *data) -{ - git_packbuilder *pb = data; - git_pobject *po; - khiter_t pos; - - GIT_UNUSED(name); - - pos = kh_get(oid, pb->object_ix, oid); - if (pos == kh_end(pb->object_ix)) - return 0; - - po = kh_value(pb->object_ix, pos); - po->tagged = 1; - - /* TODO: peel objects */ - - return 0; -} - -static git_pobject **compute_write_order(git_packbuilder *pb) -{ - unsigned int i, wo_end, last_untagged; - git_pobject **wo; - - if ((wo = git__mallocarray(pb->nr_objects, sizeof(*wo))) == NULL) - return NULL; - - for (i = 0; i < pb->nr_objects; i++) { - git_pobject *po = pb->object_list + i; - po->tagged = 0; - po->filled = 0; - po->delta_child = NULL; - po->delta_sibling = NULL; - } - - /* - * Fully connect delta_child/delta_sibling network. - * Make sure delta_sibling is sorted in the original - * recency order. - */ - for (i = pb->nr_objects; i > 0;) { - git_pobject *po = &pb->object_list[--i]; - if (!po->delta) - continue; - /* Mark me as the first child */ - po->delta_sibling = po->delta->delta_child; - po->delta->delta_child = po; - } - - /* - * Mark objects that are at the tip of tags. - */ - if (git_tag_foreach(pb->repo, &cb_tag_foreach, pb) < 0) { - git__free(wo); - return NULL; - } - - /* - * Give the objects in the original recency order until - * we see a tagged tip. - */ - for (i = wo_end = 0; i < pb->nr_objects; i++) { - git_pobject *po = pb->object_list + i; - if (po->tagged) - break; - add_to_write_order(wo, &wo_end, po); - } - last_untagged = i; - - /* - * Then fill all the tagged tips. - */ - for (; i < pb->nr_objects; i++) { - git_pobject *po = pb->object_list + i; - if (po->tagged) - add_to_write_order(wo, &wo_end, po); - } - - /* - * And then all remaining commits and tags. - */ - for (i = last_untagged; i < pb->nr_objects; i++) { - git_pobject *po = pb->object_list + i; - if (po->type != GIT_OBJ_COMMIT && - po->type != GIT_OBJ_TAG) - continue; - add_to_write_order(wo, &wo_end, po); - } - - /* - * And then all the trees. - */ - for (i = last_untagged; i < pb->nr_objects; i++) { - git_pobject *po = pb->object_list + i; - if (po->type != GIT_OBJ_TREE) - continue; - add_to_write_order(wo, &wo_end, po); - } - - /* - * Finally all the rest in really tight order - */ - for (i = last_untagged; i < pb->nr_objects; i++) { - git_pobject *po = pb->object_list + i; - if (!po->filled) - add_family_to_write_order(wo, &wo_end, po); - } - - if (wo_end != pb->nr_objects) { - giterr_set(GITERR_INVALID, "invalid write order"); - return NULL; - } - - return wo; -} - -static int write_pack(git_packbuilder *pb, - int (*write_cb)(void *buf, size_t size, void *cb_data), - void *cb_data) -{ - git_pobject **write_order; - git_pobject *po; - enum write_one_status status; - struct git_pack_header ph; - git_oid entry_oid; - unsigned int i = 0; - int error = 0; - - write_order = compute_write_order(pb); - if (write_order == NULL) { - error = -1; - goto done; - } - - /* Write pack header */ - ph.hdr_signature = htonl(PACK_SIGNATURE); - ph.hdr_version = htonl(PACK_VERSION); - ph.hdr_entries = htonl(pb->nr_objects); - - if ((error = write_cb(&ph, sizeof(ph), cb_data)) < 0 || - (error = git_hash_update(&pb->ctx, &ph, sizeof(ph))) < 0) - goto done; - - pb->nr_remaining = pb->nr_objects; - do { - pb->nr_written = 0; - for ( ; i < pb->nr_objects; ++i) { - po = write_order[i]; - - if ((error = write_one(&status, pb, po, write_cb, cb_data)) < 0) - goto done; - } - - pb->nr_remaining -= pb->nr_written; - } while (pb->nr_remaining && i < pb->nr_objects); - - if ((error = git_hash_final(&entry_oid, &pb->ctx)) < 0) - goto done; - - error = write_cb(entry_oid.id, GIT_OID_RAWSZ, cb_data); - -done: - /* if callback cancelled writing, we must still free delta_data */ - for ( ; i < pb->nr_objects; ++i) { - po = write_order[i]; - if (po->delta_data) { - git__free(po->delta_data); - po->delta_data = NULL; - } - } - - git__free(write_order); - return error; -} - -static int write_pack_buf(void *buf, size_t size, void *data) -{ - git_buf *b = (git_buf *)data; - return git_buf_put(b, buf, size); -} - -static int type_size_sort(const void *_a, const void *_b) -{ - const git_pobject *a = (git_pobject *)_a; - const git_pobject *b = (git_pobject *)_b; - - if (a->type > b->type) - return -1; - if (a->type < b->type) - return 1; - if (a->hash > b->hash) - return -1; - if (a->hash < b->hash) - return 1; - /* - * TODO - * - if (a->preferred_base > b->preferred_base) - return -1; - if (a->preferred_base < b->preferred_base) - return 1; - */ - if (a->size > b->size) - return -1; - if (a->size < b->size) - return 1; - return a < b ? -1 : (a > b); /* newest first */ -} - -static int delta_cacheable(git_packbuilder *pb, unsigned long src_size, - unsigned long trg_size, unsigned long delta_size) -{ - if (pb->max_delta_cache_size && - pb->delta_cache_size + delta_size > pb->max_delta_cache_size) - return 0; - - if (delta_size < pb->cache_max_small_delta_size) - return 1; - - /* cache delta, if objects are large enough compared to delta size */ - if ((src_size >> 20) + (trg_size >> 21) > (delta_size >> 10)) - return 1; - - return 0; -} - -static int try_delta(git_packbuilder *pb, struct unpacked *trg, - struct unpacked *src, int max_depth, - unsigned long *mem_usage, int *ret) -{ - git_pobject *trg_object = trg->object; - git_pobject *src_object = src->object; - git_odb_object *obj; - unsigned long trg_size, src_size, delta_size, - sizediff, max_size, sz; - unsigned int ref_depth; - void *delta_buf; - - /* Don't bother doing diffs between different types */ - if (trg_object->type != src_object->type) { - *ret = -1; - return 0; - } - - *ret = 0; - - /* TODO: support reuse-delta */ - - /* Let's not bust the allowed depth. */ - if (src->depth >= max_depth) - return 0; - - /* Now some size filtering heuristics. */ - trg_size = (unsigned long)trg_object->size; - if (!trg_object->delta) { - max_size = trg_size/2 - 20; - ref_depth = 1; - } else { - max_size = trg_object->delta_size; - ref_depth = trg->depth; - } - - max_size = (uint64_t)max_size * (max_depth - src->depth) / - (max_depth - ref_depth + 1); - if (max_size == 0) - return 0; - - src_size = (unsigned long)src_object->size; - sizediff = src_size < trg_size ? trg_size - src_size : 0; - if (sizediff >= max_size) - return 0; - if (trg_size < src_size / 32) - return 0; - - /* Load data if not already done */ - if (!trg->data) { - if (git_odb_read(&obj, pb->odb, &trg_object->id) < 0) - return -1; - - sz = (unsigned long)git_odb_object_size(obj); - trg->data = git__malloc(sz); - GITERR_CHECK_ALLOC(trg->data); - memcpy(trg->data, git_odb_object_data(obj), sz); - - git_odb_object_free(obj); - - if (sz != trg_size) { - giterr_set(GITERR_INVALID, - "Inconsistent target object length"); - return -1; - } - - *mem_usage += sz; - } - if (!src->data) { - size_t obj_sz; - - if (git_odb_read(&obj, pb->odb, &src_object->id) < 0 || - !git__is_ulong(obj_sz = git_odb_object_size(obj))) - return -1; - - sz = (unsigned long)obj_sz; - src->data = git__malloc(sz); - GITERR_CHECK_ALLOC(src->data); - memcpy(src->data, git_odb_object_data(obj), sz); - - git_odb_object_free(obj); - - if (sz != src_size) { - giterr_set(GITERR_INVALID, - "Inconsistent source object length"); - return -1; - } - - *mem_usage += sz; - } - if (!src->index) { - src->index = git_delta_create_index(src->data, src_size); - if (!src->index) - return 0; /* suboptimal pack - out of memory */ - - *mem_usage += git_delta_sizeof_index(src->index); - } - - delta_buf = git_delta_create(src->index, trg->data, trg_size, - &delta_size, max_size); - if (!delta_buf) - return 0; - - if (trg_object->delta) { - /* Prefer only shallower same-sized deltas. */ - if (delta_size == trg_object->delta_size && - src->depth + 1 >= trg->depth) { - git__free(delta_buf); - return 0; - } - } - - git_packbuilder__cache_lock(pb); - if (trg_object->delta_data) { - git__free(trg_object->delta_data); - pb->delta_cache_size -= trg_object->delta_size; - trg_object->delta_data = NULL; - } - if (delta_cacheable(pb, src_size, trg_size, delta_size)) { - bool overflow = git__add_uint64_overflow( - &pb->delta_cache_size, pb->delta_cache_size, delta_size); - - git_packbuilder__cache_unlock(pb); - - if (overflow || - !(trg_object->delta_data = git__realloc(delta_buf, delta_size))) - return -1; - } else { - /* create delta when writing the pack */ - git_packbuilder__cache_unlock(pb); - git__free(delta_buf); - } - - trg_object->delta = src_object; - trg_object->delta_size = delta_size; - trg->depth = src->depth + 1; - - *ret = 1; - return 0; -} - -static unsigned int check_delta_limit(git_pobject *me, unsigned int n) -{ - git_pobject *child = me->delta_child; - unsigned int m = n; - - while (child) { - unsigned int c = check_delta_limit(child, n + 1); - if (m < c) - m = c; - child = child->delta_sibling; - } - return m; -} - -static unsigned long free_unpacked(struct unpacked *n) -{ - unsigned long freed_mem = git_delta_sizeof_index(n->index); - git_delta_free_index(n->index); - n->index = NULL; - if (n->data) { - freed_mem += (unsigned long)n->object->size; - git__free(n->data); - n->data = NULL; - } - n->object = NULL; - n->depth = 0; - return freed_mem; -} - -static int report_delta_progress(git_packbuilder *pb, uint32_t count, bool force) -{ - int ret; - - if (pb->progress_cb) { - double current_time = git__timer(); - double elapsed = current_time - pb->last_progress_report_time; - - if (force || elapsed >= MIN_PROGRESS_UPDATE_INTERVAL) { - pb->last_progress_report_time = current_time; - - ret = pb->progress_cb( - GIT_PACKBUILDER_DELTAFICATION, - count, pb->nr_objects, pb->progress_cb_payload); - - if (ret) - return giterr_set_after_callback(ret); - } - } - - return 0; -} - -static int find_deltas(git_packbuilder *pb, git_pobject **list, - unsigned int *list_size, unsigned int window, - int depth) -{ - git_pobject *po; - git_buf zbuf = GIT_BUF_INIT; - struct unpacked *array; - uint32_t idx = 0, count = 0; - unsigned long mem_usage = 0; - unsigned int i; - int error = -1; - - array = git__calloc(window, sizeof(struct unpacked)); - GITERR_CHECK_ALLOC(array); - - for (;;) { - struct unpacked *n = array + idx; - int max_depth, j, best_base = -1; - - git_packbuilder__progress_lock(pb); - if (!*list_size) { - git_packbuilder__progress_unlock(pb); - break; - } - - pb->nr_deltified += 1; - report_delta_progress(pb, pb->nr_deltified, false); - - po = *list++; - (*list_size)--; - git_packbuilder__progress_unlock(pb); - - mem_usage -= free_unpacked(n); - n->object = po; - - while (pb->window_memory_limit && - mem_usage > pb->window_memory_limit && - count > 1) { - uint32_t tail = (idx + window - count) % window; - mem_usage -= free_unpacked(array + tail); - count--; - } - - /* - * If the current object is at pack edge, take the depth the - * objects that depend on the current object into account - * otherwise they would become too deep. - */ - max_depth = depth; - if (po->delta_child) { - max_depth -= check_delta_limit(po, 0); - if (max_depth <= 0) - goto next; - } - - j = window; - while (--j > 0) { - int ret; - uint32_t other_idx = idx + j; - struct unpacked *m; - - if (other_idx >= window) - other_idx -= window; - - m = array + other_idx; - if (!m->object) - break; - - if (try_delta(pb, n, m, max_depth, &mem_usage, &ret) < 0) - goto on_error; - if (ret < 0) - break; - else if (ret > 0) - best_base = other_idx; - } - - /* - * If we decided to cache the delta data, then it is best - * to compress it right away. First because we have to do - * it anyway, and doing it here while we're threaded will - * save a lot of time in the non threaded write phase, - * as well as allow for caching more deltas within - * the same cache size limit. - * ... - * But only if not writing to stdout, since in that case - * the network is most likely throttling writes anyway, - * and therefore it is best to go to the write phase ASAP - * instead, as we can afford spending more time compressing - * between writes at that moment. - */ - if (po->delta_data) { - if (git_zstream_deflatebuf(&zbuf, po->delta_data, po->delta_size) < 0) - goto on_error; - - git__free(po->delta_data); - po->delta_data = git__malloc(zbuf.size); - GITERR_CHECK_ALLOC(po->delta_data); - - memcpy(po->delta_data, zbuf.ptr, zbuf.size); - po->z_delta_size = (unsigned long)zbuf.size; - git_buf_clear(&zbuf); - - git_packbuilder__cache_lock(pb); - pb->delta_cache_size -= po->delta_size; - pb->delta_cache_size += po->z_delta_size; - git_packbuilder__cache_unlock(pb); - } - - /* - * If we made n a delta, and if n is already at max - * depth, leaving it in the window is pointless. we - * should evict it first. - */ - if (po->delta && max_depth <= n->depth) - continue; - - /* - * Move the best delta base up in the window, after the - * currently deltified object, to keep it longer. It will - * be the first base object to be attempted next. - */ - if (po->delta) { - struct unpacked swap = array[best_base]; - int dist = (window + idx - best_base) % window; - int dst = best_base; - while (dist--) { - int src = (dst + 1) % window; - array[dst] = array[src]; - dst = src; - } - array[dst] = swap; - } - - next: - idx++; - if (count + 1 < window) - count++; - if (idx >= window) - idx = 0; - } - error = 0; - -on_error: - for (i = 0; i < window; ++i) { - git__free(array[i].index); - git__free(array[i].data); - } - git__free(array); - git_buf_free(&zbuf); - - return error; -} - -#ifdef GIT_THREADS - -struct thread_params { - git_thread thread; - git_packbuilder *pb; - - git_pobject **list; - - git_cond cond; - git_mutex mutex; - - unsigned int list_size; - unsigned int remaining; - - int window; - int depth; - int working; - int data_ready; -}; - -static void *threaded_find_deltas(void *arg) -{ - struct thread_params *me = arg; - - while (me->remaining) { - if (find_deltas(me->pb, me->list, &me->remaining, - me->window, me->depth) < 0) { - ; /* TODO */ - } - - git_packbuilder__progress_lock(me->pb); - me->working = 0; - git_cond_signal(&me->pb->progress_cond); - git_packbuilder__progress_unlock(me->pb); - - if (git_mutex_lock(&me->mutex)) { - giterr_set(GITERR_THREAD, "unable to lock packfile condition mutex"); - return NULL; - } - - while (!me->data_ready) - git_cond_wait(&me->cond, &me->mutex); - - /* - * We must not set ->data_ready before we wait on the - * condition because the main thread may have set it to 1 - * before we get here. In order to be sure that new - * work is available if we see 1 in ->data_ready, it - * was initialized to 0 before this thread was spawned - * and we reset it to 0 right away. - */ - me->data_ready = 0; - git_mutex_unlock(&me->mutex); - } - /* leave ->working 1 so that this doesn't get more work assigned */ - return NULL; -} - -static int ll_find_deltas(git_packbuilder *pb, git_pobject **list, - unsigned int list_size, unsigned int window, - int depth) -{ - struct thread_params *p; - int i, ret, active_threads = 0; - - if (!pb->nr_threads) - pb->nr_threads = git_online_cpus(); - - if (pb->nr_threads <= 1) { - find_deltas(pb, list, &list_size, window, depth); - return 0; - } - - p = git__mallocarray(pb->nr_threads, sizeof(*p)); - GITERR_CHECK_ALLOC(p); - - /* Partition the work among the threads */ - for (i = 0; i < pb->nr_threads; ++i) { - unsigned sub_size = list_size / (pb->nr_threads - i); - - /* don't use too small segments or no deltas will be found */ - if (sub_size < 2*window && i+1 < pb->nr_threads) - sub_size = 0; - - p[i].pb = pb; - p[i].window = window; - p[i].depth = depth; - p[i].working = 1; - p[i].data_ready = 0; - - /* try to split chunks on "path" boundaries */ - while (sub_size && sub_size < list_size && - list[sub_size]->hash && - list[sub_size]->hash == list[sub_size-1]->hash) - sub_size++; - - p[i].list = list; - p[i].list_size = sub_size; - p[i].remaining = sub_size; - - list += sub_size; - list_size -= sub_size; - } - - /* Start work threads */ - for (i = 0; i < pb->nr_threads; ++i) { - if (!p[i].list_size) - continue; - - git_mutex_init(&p[i].mutex); - git_cond_init(&p[i].cond); - - ret = git_thread_create(&p[i].thread, NULL, - threaded_find_deltas, &p[i]); - if (ret) { - giterr_set(GITERR_THREAD, "unable to create thread"); - return -1; - } - active_threads++; - } - - /* - * Now let's wait for work completion. Each time a thread is done - * with its work, we steal half of the remaining work from the - * thread with the largest number of unprocessed objects and give - * it to that newly idle thread. This ensure good load balancing - * until the remaining object list segments are simply too short - * to be worth splitting anymore. - */ - while (active_threads) { - struct thread_params *target = NULL; - struct thread_params *victim = NULL; - unsigned sub_size = 0; - - /* Start by locating a thread that has transitioned its - * 'working' flag from 1 -> 0. This indicates that it is - * ready to receive more work using our work-stealing - * algorithm. */ - git_packbuilder__progress_lock(pb); - for (;;) { - for (i = 0; !target && i < pb->nr_threads; i++) - if (!p[i].working) - target = &p[i]; - if (target) - break; - git_cond_wait(&pb->progress_cond, &pb->progress_mutex); - } - - /* At this point we hold the progress lock and have located - * a thread to receive more work. We still need to locate a - * thread from which to steal work (the victim). */ - for (i = 0; i < pb->nr_threads; i++) - if (p[i].remaining > 2*window && - (!victim || victim->remaining < p[i].remaining)) - victim = &p[i]; - - if (victim) { - sub_size = victim->remaining / 2; - list = victim->list + victim->list_size - sub_size; - while (sub_size && list[0]->hash && - list[0]->hash == list[-1]->hash) { - list++; - sub_size--; - } - if (!sub_size) { - /* - * It is possible for some "paths" to have - * so many objects that no hash boundary - * might be found. Let's just steal the - * exact half in that case. - */ - sub_size = victim->remaining / 2; - list -= sub_size; - } - target->list = list; - victim->list_size -= sub_size; - victim->remaining -= sub_size; - } - target->list_size = sub_size; - target->remaining = sub_size; - target->working = 1; - git_packbuilder__progress_unlock(pb); - - if (git_mutex_lock(&target->mutex)) { - giterr_set(GITERR_THREAD, "unable to lock packfile condition mutex"); - git__free(p); - return -1; - } - - target->data_ready = 1; - git_cond_signal(&target->cond); - git_mutex_unlock(&target->mutex); - - if (!sub_size) { - git_thread_join(&target->thread, NULL); - git_cond_free(&target->cond); - git_mutex_free(&target->mutex); - active_threads--; - } - } - - git__free(p); - return 0; -} - -#else -#define ll_find_deltas(pb, l, ls, w, d) find_deltas(pb, l, &ls, w, d) -#endif - -static int prepare_pack(git_packbuilder *pb) -{ - git_pobject **delta_list; - unsigned int i, n = 0; - - if (pb->nr_objects == 0 || pb->done) - return 0; /* nothing to do */ - - /* - * Although we do not report progress during deltafication, we - * at least report that we are in the deltafication stage - */ - if (pb->progress_cb) - pb->progress_cb(GIT_PACKBUILDER_DELTAFICATION, 0, pb->nr_objects, pb->progress_cb_payload); - - delta_list = git__mallocarray(pb->nr_objects, sizeof(*delta_list)); - GITERR_CHECK_ALLOC(delta_list); - - for (i = 0; i < pb->nr_objects; ++i) { - git_pobject *po = pb->object_list + i; - - /* Make sure the item is within our size limits */ - if (po->size < 50 || po->size > pb->big_file_threshold) - continue; - - delta_list[n++] = po; - } - - if (n > 1) { - git__tsort((void **)delta_list, n, type_size_sort); - if (ll_find_deltas(pb, delta_list, n, - GIT_PACK_WINDOW + 1, - GIT_PACK_DEPTH) < 0) { - git__free(delta_list); - return -1; - } - } - - report_delta_progress(pb, pb->nr_objects, true); - - pb->done = true; - git__free(delta_list); - return 0; -} - -#define PREPARE_PACK if (prepare_pack(pb) < 0) { return -1; } - -int git_packbuilder_foreach(git_packbuilder *pb, int (*cb)(void *buf, size_t size, void *payload), void *payload) -{ - PREPARE_PACK; - return write_pack(pb, cb, payload); -} - -int git_packbuilder_write_buf(git_buf *buf, git_packbuilder *pb) -{ - PREPARE_PACK; - git_buf_sanitize(buf); - return write_pack(pb, &write_pack_buf, buf); -} - -static int write_cb(void *buf, size_t len, void *payload) -{ - struct pack_write_context *ctx = payload; - return git_indexer_append(ctx->indexer, buf, len, ctx->stats); -} - -int git_packbuilder_write( - git_packbuilder *pb, - const char *path, - unsigned int mode, - git_transfer_progress_cb progress_cb, - void *progress_cb_payload) -{ - git_indexer *indexer; - git_transfer_progress stats; - struct pack_write_context ctx; - - PREPARE_PACK; - - if (git_indexer_new( - &indexer, path, mode, pb->odb, progress_cb, progress_cb_payload) < 0) - return -1; - - ctx.indexer = indexer; - ctx.stats = &stats; - - if (git_packbuilder_foreach(pb, write_cb, &ctx) < 0 || - git_indexer_commit(indexer, &stats) < 0) { - git_indexer_free(indexer); - return -1; - } - - git_oid_cpy(&pb->pack_oid, git_indexer_hash(indexer)); - - git_indexer_free(indexer); - return 0; -} - -#undef PREPARE_PACK - -const git_oid *git_packbuilder_hash(git_packbuilder *pb) -{ - return &pb->pack_oid; -} - - -static int cb_tree_walk( - const char *root, const git_tree_entry *entry, void *payload) -{ - int error; - struct tree_walk_context *ctx = payload; - - /* A commit inside a tree represents a submodule commit and should be skipped. */ - if (git_tree_entry_type(entry) == GIT_OBJ_COMMIT) - return 0; - - if (!(error = git_buf_sets(&ctx->buf, root)) && - !(error = git_buf_puts(&ctx->buf, git_tree_entry_name(entry)))) - error = git_packbuilder_insert( - ctx->pb, git_tree_entry_id(entry), git_buf_cstr(&ctx->buf)); - - return error; -} - -int git_packbuilder_insert_commit(git_packbuilder *pb, const git_oid *oid) -{ - git_commit *commit; - - if (git_commit_lookup(&commit, pb->repo, oid) < 0 || - git_packbuilder_insert(pb, oid, NULL) < 0) - return -1; - - if (git_packbuilder_insert_tree(pb, git_commit_tree_id(commit)) < 0) - return -1; - - git_commit_free(commit); - return 0; -} - -int git_packbuilder_insert_tree(git_packbuilder *pb, const git_oid *oid) -{ - int error; - git_tree *tree = NULL; - struct tree_walk_context context = { pb, GIT_BUF_INIT }; - - if (!(error = git_tree_lookup(&tree, pb->repo, oid)) && - !(error = git_packbuilder_insert(pb, oid, NULL))) - error = git_tree_walk(tree, GIT_TREEWALK_PRE, cb_tree_walk, &context); - - git_tree_free(tree); - git_buf_free(&context.buf); - return error; -} - -int git_packbuilder_insert_recur(git_packbuilder *pb, const git_oid *id, const char *name) -{ - git_object *obj; - int error; - - assert(pb && id); - - if ((error = git_object_lookup(&obj, pb->repo, id, GIT_OBJ_ANY)) < 0) - return error; - - switch (git_object_type(obj)) { - case GIT_OBJ_BLOB: - error = git_packbuilder_insert(pb, id, name); - break; - case GIT_OBJ_TREE: - error = git_packbuilder_insert_tree(pb, id); - break; - case GIT_OBJ_COMMIT: - error = git_packbuilder_insert_commit(pb, id); - break; - case GIT_OBJ_TAG: - if ((error = git_packbuilder_insert(pb, id, name)) < 0) - goto cleanup; - error = git_packbuilder_insert_recur(pb, git_tag_target_id((git_tag *) obj), NULL); - break; - - default: - giterr_set(GITERR_INVALID, "unknown object type"); - error = -1; - } - -cleanup: - git_object_free(obj); - return error; -} - -uint32_t git_packbuilder_object_count(git_packbuilder *pb) -{ - return pb->nr_objects; -} - -uint32_t git_packbuilder_written(git_packbuilder *pb) -{ - return pb->nr_written; -} - -int lookup_walk_object(git_walk_object **out, git_packbuilder *pb, const git_oid *id) -{ - git_walk_object *obj; - - obj = git_pool_mallocz(&pb->object_pool, 1); - if (!obj) { - giterr_set_oom(); - return -1; - } - - git_oid_cpy(&obj->id, id); - - *out = obj; - return 0; -} - -static int retrieve_object(git_walk_object **out, git_packbuilder *pb, const git_oid *id) -{ - int error; - khiter_t pos; - git_walk_object *obj; - - pos = git_oidmap_lookup_index(pb->walk_objects, id); - if (git_oidmap_valid_index(pb->walk_objects, pos)) { - obj = git_oidmap_value_at(pb->walk_objects, pos); - } else { - if ((error = lookup_walk_object(&obj, pb, id)) < 0) - return error; - - git_oidmap_insert(pb->walk_objects, &obj->id, obj, error); - } - - *out = obj; - return 0; -} - -static int mark_blob_uninteresting(git_packbuilder *pb, const git_oid *id) -{ - int error; - git_walk_object *obj; - - if ((error = retrieve_object(&obj, pb, id)) < 0) - return error; - - obj->uninteresting = 1; - - return 0; -} - -static int mark_tree_uninteresting(git_packbuilder *pb, const git_oid *id) -{ - git_walk_object *obj; - git_tree *tree; - int error; - size_t i; - - if ((error = retrieve_object(&obj, pb, id)) < 0) - return error; - - if (obj->uninteresting) - return 0; - - obj->uninteresting = 1; - - if ((error = git_tree_lookup(&tree, pb->repo, id)) < 0) - return error; - - for (i = 0; i < git_tree_entrycount(tree); i++) { - const git_tree_entry *entry = git_tree_entry_byindex(tree, i); - const git_oid *entry_id = git_tree_entry_id(entry); - switch (git_tree_entry_type(entry)) { - case GIT_OBJ_TREE: - if ((error = mark_tree_uninteresting(pb, entry_id)) < 0) - goto cleanup; - break; - case GIT_OBJ_BLOB: - if ((error = mark_blob_uninteresting(pb, entry_id)) < 0) - goto cleanup; - break; - default: - /* it's a submodule or something unknown, we don't want it */ - ; - } - } - -cleanup: - git_tree_free(tree); - return error; -} - -/* - * Mark the edges of the graph uninteresting. Since we start from a - * git_revwalk, the commits are already uninteresting, but we need to - * mark the trees and blobs. - */ -static int mark_edges_uninteresting(git_packbuilder *pb, git_commit_list *commits) -{ - int error; - git_commit_list *list; - git_commit *commit; - - for (list = commits; list; list = list->next) { - if (!list->item->uninteresting) - continue; - - if ((error = git_commit_lookup(&commit, pb->repo, &list->item->oid)) < 0) - return error; - - error = mark_tree_uninteresting(pb, git_commit_tree_id(commit)); - git_commit_free(commit); - - if (error < 0) - return error; - } - - return 0; -} - -int insert_tree(git_packbuilder *pb, git_tree *tree) -{ - size_t i; - int error; - git_tree *subtree; - git_walk_object *obj; - const char *name; - - if ((error = retrieve_object(&obj, pb, git_tree_id(tree))) < 0) - return error; - - if (obj->seen) - return 0; - - obj->seen = 1; - - if ((error = git_packbuilder_insert(pb, &obj->id, NULL))) - return error; - - for (i = 0; i < git_tree_entrycount(tree); i++) { - const git_tree_entry *entry = git_tree_entry_byindex(tree, i); - const git_oid *entry_id = git_tree_entry_id(entry); - switch (git_tree_entry_type(entry)) { - case GIT_OBJ_TREE: - if ((error = git_tree_lookup(&subtree, pb->repo, entry_id)) < 0) - return error; - - error = insert_tree(pb, subtree); - git_tree_free(subtree); - - if (error < 0) - return error; - - break; - case GIT_OBJ_BLOB: - name = git_tree_entry_name(entry); - if ((error = git_packbuilder_insert(pb, entry_id, name)) < 0) - return error; - break; - default: - /* it's a submodule or something unknown, we don't want it */ - ; - } - } - - - return error; -} - -int insert_commit(git_packbuilder *pb, git_walk_object *obj) -{ - int error; - git_commit *commit = NULL; - git_tree *tree = NULL; - - obj->seen = 1; - - if ((error = git_packbuilder_insert(pb, &obj->id, NULL)) < 0) - return error; - - if ((error = git_commit_lookup(&commit, pb->repo, &obj->id)) < 0) - return error; - - if ((error = git_tree_lookup(&tree, pb->repo, git_commit_tree_id(commit))) < 0) - goto cleanup; - - if ((error = insert_tree(pb, tree)) < 0) - goto cleanup; - -cleanup: - git_commit_free(commit); - git_tree_free(tree); - return error; -} - -int git_packbuilder_insert_walk(git_packbuilder *pb, git_revwalk *walk) -{ - int error; - git_oid id; - git_walk_object *obj; - - assert(pb && walk); - - if ((error = mark_edges_uninteresting(pb, walk->user_input)) < 0) - return error; - - /* - * TODO: git marks the parents of the edges - * uninteresting. This may provide a speed advantage, but does - * seem to assume the remote does not have a single-commit - * history on the other end. - */ - - /* walk down each tree up to the blobs and insert them, stopping when uninteresting */ - while ((error = git_revwalk_next(&id, walk)) == 0) { - if ((error = retrieve_object(&obj, pb, &id)) < 0) - return error; - - if (obj->seen || obj->uninteresting) - continue; - - if ((error = insert_commit(pb, obj)) < 0) - return error; - } - - if (error == GIT_ITEROVER) - error = 0; - - return 0; -} - -int git_packbuilder_set_callbacks(git_packbuilder *pb, git_packbuilder_progress progress_cb, void *progress_cb_payload) -{ - if (!pb) - return -1; - - pb->progress_cb = progress_cb; - pb->progress_cb_payload = progress_cb_payload; - - return 0; -} - -void git_packbuilder_free(git_packbuilder *pb) -{ - if (pb == NULL) - return; - -#ifdef GIT_THREADS - - git_mutex_free(&pb->cache_mutex); - git_mutex_free(&pb->progress_mutex); - git_cond_free(&pb->progress_cond); - -#endif - - if (pb->odb) - git_odb_free(pb->odb); - - if (pb->object_ix) - git_oidmap_free(pb->object_ix); - - if (pb->object_list) - git__free(pb->object_list); - - git_oidmap_free(pb->walk_objects); - git_pool_clear(&pb->object_pool); - - git_hash_ctx_cleanup(&pb->ctx); - git_zstream_free(&pb->zstream); - - git__free(pb); -} diff --git a/vendor/libgit2/src/pack-objects.h b/vendor/libgit2/src/pack-objects.h deleted file mode 100644 index 82dea81f53..0000000000 --- a/vendor/libgit2/src/pack-objects.h +++ /dev/null @@ -1,105 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#ifndef INCLUDE_pack_objects_h__ -#define INCLUDE_pack_objects_h__ - -#include "common.h" - -#include "buffer.h" -#include "hash.h" -#include "oidmap.h" -#include "netops.h" -#include "zstream.h" -#include "pool.h" - -#include "git2/oid.h" -#include "git2/pack.h" - -#define GIT_PACK_WINDOW 10 /* number of objects to possibly delta against */ -#define GIT_PACK_DEPTH 50 /* max delta depth */ -#define GIT_PACK_DELTA_CACHE_SIZE (256 * 1024 * 1024) -#define GIT_PACK_DELTA_CACHE_LIMIT 1000 -#define GIT_PACK_BIG_FILE_THRESHOLD (512 * 1024 * 1024) - -typedef struct git_pobject { - git_oid id; - git_otype type; - git_off_t offset; - - size_t size; - - unsigned int hash; /* name hint hash */ - - struct git_pobject *delta; /* delta base object */ - struct git_pobject *delta_child; /* deltified objects who bases me */ - struct git_pobject *delta_sibling; /* other deltified objects - * who uses the same base as - * me */ - - void *delta_data; - unsigned long delta_size; - unsigned long z_delta_size; - - int written:1, - recursing:1, - tagged:1, - filled:1; -} git_pobject; - -typedef struct { - git_oid id; - unsigned int uninteresting:1, - seen:1; -} git_walk_object; - -struct git_packbuilder { - git_repository *repo; /* associated repository */ - git_odb *odb; /* associated object database */ - - git_hash_ctx ctx; - git_zstream zstream; - - uint32_t nr_objects, - nr_deltified, - nr_alloc, - nr_written, - nr_remaining; - - git_pobject *object_list; - - git_oidmap *object_ix; - - git_oidmap *walk_objects; - git_pool object_pool; - - git_oid pack_oid; /* hash of written pack */ - - /* synchronization objects */ - git_mutex cache_mutex; - git_mutex progress_mutex; - git_cond progress_cond; - - /* configs */ - uint64_t delta_cache_size; - uint64_t max_delta_cache_size; - uint64_t cache_max_small_delta_size; - uint64_t big_file_threshold; - uint64_t window_memory_limit; - - int nr_threads; /* nr of threads to use */ - - git_packbuilder_progress progress_cb; - void *progress_cb_payload; - double last_progress_report_time; /* the time progress was last reported */ - - bool done; -}; - -int git_packbuilder_write_buf(git_buf *buf, git_packbuilder *pb); - -#endif /* INCLUDE_pack_objects_h__ */ diff --git a/vendor/libgit2/src/pack.c b/vendor/libgit2/src/pack.c deleted file mode 100644 index 45dd4d5be8..0000000000 --- a/vendor/libgit2/src/pack.c +++ /dev/null @@ -1,1389 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#include "common.h" -#include "odb.h" -#include "pack.h" -#include "delta-apply.h" -#include "sha1_lookup.h" -#include "mwindow.h" -#include "fileops.h" -#include "oid.h" - -#include - -GIT__USE_OFFMAP -GIT__USE_OIDMAP - -static int packfile_open(struct git_pack_file *p); -static git_off_t nth_packed_object_offset(const struct git_pack_file *p, uint32_t n); -int packfile_unpack_compressed( - git_rawobj *obj, - struct git_pack_file *p, - git_mwindow **w_curs, - git_off_t *curpos, - size_t size, - git_otype type); - -/* Can find the offset of an object given - * a prefix of an identifier. - * Throws GIT_EAMBIGUOUSOIDPREFIX if short oid - * is ambiguous within the pack. - * This method assumes that len is between - * GIT_OID_MINPREFIXLEN and GIT_OID_HEXSZ. - */ -static int pack_entry_find_offset( - git_off_t *offset_out, - git_oid *found_oid, - struct git_pack_file *p, - const git_oid *short_oid, - size_t len); - -static int packfile_error(const char *message) -{ - giterr_set(GITERR_ODB, "Invalid pack file - %s", message); - return -1; -} - -/******************** - * Delta base cache - ********************/ - -static git_pack_cache_entry *new_cache_object(git_rawobj *source) -{ - git_pack_cache_entry *e = git__calloc(1, sizeof(git_pack_cache_entry)); - if (!e) - return NULL; - - git_atomic_inc(&e->refcount); - memcpy(&e->raw, source, sizeof(git_rawobj)); - - return e; -} - -static void free_cache_object(void *o) -{ - git_pack_cache_entry *e = (git_pack_cache_entry *)o; - - if (e != NULL) { - assert(e->refcount.val == 0); - git__free(e->raw.data); - git__free(e); - } -} - -static void cache_free(git_pack_cache *cache) -{ - khiter_t k; - - if (cache->entries) { - for (k = kh_begin(cache->entries); k != kh_end(cache->entries); k++) { - if (kh_exist(cache->entries, k)) - free_cache_object(kh_value(cache->entries, k)); - } - - git_offmap_free(cache->entries); - cache->entries = NULL; - } -} - -static int cache_init(git_pack_cache *cache) -{ - cache->entries = git_offmap_alloc(); - GITERR_CHECK_ALLOC(cache->entries); - - cache->memory_limit = GIT_PACK_CACHE_MEMORY_LIMIT; - - if (git_mutex_init(&cache->lock)) { - giterr_set(GITERR_OS, "Failed to initialize pack cache mutex"); - - git__free(cache->entries); - cache->entries = NULL; - - return -1; - } - - return 0; -} - -static git_pack_cache_entry *cache_get(git_pack_cache *cache, git_off_t offset) -{ - khiter_t k; - git_pack_cache_entry *entry = NULL; - - if (git_mutex_lock(&cache->lock) < 0) - return NULL; - - k = kh_get(off, cache->entries, offset); - if (k != kh_end(cache->entries)) { /* found it */ - entry = kh_value(cache->entries, k); - git_atomic_inc(&entry->refcount); - entry->last_usage = cache->use_ctr++; - } - git_mutex_unlock(&cache->lock); - - return entry; -} - -/* Run with the cache lock held */ -static void free_lowest_entry(git_pack_cache *cache) -{ - git_pack_cache_entry *entry; - khiter_t k; - - for (k = kh_begin(cache->entries); k != kh_end(cache->entries); k++) { - if (!kh_exist(cache->entries, k)) - continue; - - entry = kh_value(cache->entries, k); - - if (entry && entry->refcount.val == 0) { - cache->memory_used -= entry->raw.len; - kh_del(off, cache->entries, k); - free_cache_object(entry); - } - } -} - -static int cache_add( - git_pack_cache_entry **cached_out, - git_pack_cache *cache, - git_rawobj *base, - git_off_t offset) -{ - git_pack_cache_entry *entry; - int error, exists = 0; - khiter_t k; - - if (base->len > GIT_PACK_CACHE_SIZE_LIMIT) - return -1; - - entry = new_cache_object(base); - if (entry) { - if (git_mutex_lock(&cache->lock) < 0) { - giterr_set(GITERR_OS, "failed to lock cache"); - git__free(entry); - return -1; - } - /* Add it to the cache if nobody else has */ - exists = kh_get(off, cache->entries, offset) != kh_end(cache->entries); - if (!exists) { - while (cache->memory_used + base->len > cache->memory_limit) - free_lowest_entry(cache); - - k = kh_put(off, cache->entries, offset, &error); - assert(error != 0); - kh_value(cache->entries, k) = entry; - cache->memory_used += entry->raw.len; - - *cached_out = entry; - } - git_mutex_unlock(&cache->lock); - /* Somebody beat us to adding it into the cache */ - if (exists) { - git__free(entry); - return -1; - } - } - - return 0; -} - -/*********************************************************** - * - * PACK INDEX METHODS - * - ***********************************************************/ - -static void pack_index_free(struct git_pack_file *p) -{ - if (p->oids) { - git__free(p->oids); - p->oids = NULL; - } - if (p->index_map.data) { - git_futils_mmap_free(&p->index_map); - p->index_map.data = NULL; - } -} - -static int pack_index_check(const char *path, struct git_pack_file *p) -{ - struct git_pack_idx_header *hdr; - uint32_t version, nr, i, *index; - void *idx_map; - size_t idx_size; - struct stat st; - int error; - /* TODO: properly open the file without access time using O_NOATIME */ - git_file fd = git_futils_open_ro(path); - if (fd < 0) - return fd; - - if (p_fstat(fd, &st) < 0) { - p_close(fd); - giterr_set(GITERR_OS, "Unable to stat pack index '%s'", path); - return -1; - } - - if (!S_ISREG(st.st_mode) || - !git__is_sizet(st.st_size) || - (idx_size = (size_t)st.st_size) < 4 * 256 + 20 + 20) - { - p_close(fd); - giterr_set(GITERR_ODB, "Invalid pack index '%s'", path); - return -1; - } - - error = git_futils_mmap_ro(&p->index_map, fd, 0, idx_size); - - p_close(fd); - - if (error < 0) - return error; - - hdr = idx_map = p->index_map.data; - - if (hdr->idx_signature == htonl(PACK_IDX_SIGNATURE)) { - version = ntohl(hdr->idx_version); - - if (version < 2 || version > 2) { - git_futils_mmap_free(&p->index_map); - return packfile_error("unsupported index version"); - } - - } else - version = 1; - - nr = 0; - index = idx_map; - - if (version > 1) - index += 2; /* skip index header */ - - for (i = 0; i < 256; i++) { - uint32_t n = ntohl(index[i]); - if (n < nr) { - git_futils_mmap_free(&p->index_map); - return packfile_error("index is non-monotonic"); - } - nr = n; - } - - if (version == 1) { - /* - * Total size: - * - 256 index entries 4 bytes each - * - 24-byte entries * nr (20-byte sha1 + 4-byte offset) - * - 20-byte SHA1 of the packfile - * - 20-byte SHA1 file checksum - */ - if (idx_size != 4*256 + nr * 24 + 20 + 20) { - git_futils_mmap_free(&p->index_map); - return packfile_error("index is corrupted"); - } - } else if (version == 2) { - /* - * Minimum size: - * - 8 bytes of header - * - 256 index entries 4 bytes each - * - 20-byte sha1 entry * nr - * - 4-byte crc entry * nr - * - 4-byte offset entry * nr - * - 20-byte SHA1 of the packfile - * - 20-byte SHA1 file checksum - * And after the 4-byte offset table might be a - * variable sized table containing 8-byte entries - * for offsets larger than 2^31. - */ - unsigned long min_size = 8 + 4*256 + nr*(20 + 4 + 4) + 20 + 20; - unsigned long max_size = min_size; - - if (nr) - max_size += (nr - 1)*8; - - if (idx_size < min_size || idx_size > max_size) { - git_futils_mmap_free(&p->index_map); - return packfile_error("wrong index size"); - } - } - - p->num_objects = nr; - p->index_version = version; - return 0; -} - -static int pack_index_open(struct git_pack_file *p) -{ - int error = 0; - size_t name_len; - git_buf idx_name = GIT_BUF_INIT; - - if (p->index_version > -1) - return 0; - - name_len = strlen(p->pack_name); - assert(name_len > strlen(".pack")); /* checked by git_pack_file alloc */ - - git_buf_grow(&idx_name, name_len); - git_buf_put(&idx_name, p->pack_name, name_len - strlen(".pack")); - git_buf_puts(&idx_name, ".idx"); - if (git_buf_oom(&idx_name)) { - giterr_set_oom(); - return -1; - } - - if ((error = git_mutex_lock(&p->lock)) < 0) { - git_buf_free(&idx_name); - return error; - } - - if (p->index_version == -1) - error = pack_index_check(idx_name.ptr, p); - - git_buf_free(&idx_name); - - git_mutex_unlock(&p->lock); - - return error; -} - -static unsigned char *pack_window_open( - struct git_pack_file *p, - git_mwindow **w_cursor, - git_off_t offset, - unsigned int *left) -{ - if (p->mwf.fd == -1 && packfile_open(p) < 0) - return NULL; - - /* Since packfiles end in a hash of their content and it's - * pointless to ask for an offset into the middle of that - * hash, and the pack_window_contains function above wouldn't match - * don't allow an offset too close to the end of the file. - */ - if (offset > (p->mwf.size - 20)) - return NULL; - - return git_mwindow_open(&p->mwf, w_cursor, offset, 20, left); - } - -/* - * The per-object header is a pretty dense thing, which is - * - first byte: low four bits are "size", - * then three bits of "type", - * with the high bit being "size continues". - * - each byte afterwards: low seven bits are size continuation, - * with the high bit being "size continues" - */ -size_t git_packfile__object_header(unsigned char *hdr, size_t size, git_otype type) -{ - unsigned char *hdr_base; - unsigned char c; - - assert(type >= GIT_OBJ_COMMIT && type <= GIT_OBJ_REF_DELTA); - - /* TODO: add support for chunked objects; see git.git 6c0d19b1 */ - - c = (unsigned char)((type << 4) | (size & 15)); - size >>= 4; - hdr_base = hdr; - - while (size) { - *hdr++ = c | 0x80; - c = size & 0x7f; - size >>= 7; - } - *hdr++ = c; - - return (hdr - hdr_base); -} - - -static int packfile_unpack_header1( - unsigned long *usedp, - size_t *sizep, - git_otype *type, - const unsigned char *buf, - unsigned long len) -{ - unsigned shift; - unsigned long size, c; - unsigned long used = 0; - - c = buf[used++]; - *type = (c >> 4) & 7; - size = c & 15; - shift = 4; - while (c & 0x80) { - if (len <= used) { - giterr_set(GITERR_ODB, "buffer too small"); - return GIT_EBUFS; - } - - if (bitsizeof(long) <= shift) { - *usedp = 0; - giterr_set(GITERR_ODB, "packfile corrupted"); - return -1; - } - - c = buf[used++]; - size += (c & 0x7f) << shift; - shift += 7; - } - - *sizep = (size_t)size; - *usedp = used; - return 0; -} - -int git_packfile_unpack_header( - size_t *size_p, - git_otype *type_p, - git_mwindow_file *mwf, - git_mwindow **w_curs, - git_off_t *curpos) -{ - unsigned char *base; - unsigned int left; - unsigned long used; - int ret; - - /* pack_window_open() assures us we have [base, base + 20) available - * as a range that we can look at at. (Its actually the hash - * size that is assured.) With our object header encoding - * the maximum deflated object size is 2^137, which is just - * insane, so we know won't exceed what we have been given. - */ -/* base = pack_window_open(p, w_curs, *curpos, &left); */ - base = git_mwindow_open(mwf, w_curs, *curpos, 20, &left); - if (base == NULL) - return GIT_EBUFS; - - ret = packfile_unpack_header1(&used, size_p, type_p, base, left); - git_mwindow_close(w_curs); - if (ret == GIT_EBUFS) - return ret; - else if (ret < 0) - return packfile_error("header length is zero"); - - *curpos += used; - return 0; -} - -int git_packfile_resolve_header( - size_t *size_p, - git_otype *type_p, - struct git_pack_file *p, - git_off_t offset) -{ - git_mwindow *w_curs = NULL; - git_off_t curpos = offset; - size_t size; - git_otype type; - git_off_t base_offset; - int error; - - error = git_packfile_unpack_header(&size, &type, &p->mwf, &w_curs, &curpos); - git_mwindow_close(&w_curs); - if (error < 0) - return error; - - if (type == GIT_OBJ_OFS_DELTA || type == GIT_OBJ_REF_DELTA) { - size_t base_size; - git_rawobj delta; - base_offset = get_delta_base(p, &w_curs, &curpos, type, offset); - git_mwindow_close(&w_curs); - error = packfile_unpack_compressed(&delta, p, &w_curs, &curpos, size, type); - git_mwindow_close(&w_curs); - if (error < 0) - return error; - error = git__delta_read_header(delta.data, delta.len, &base_size, size_p); - git__free(delta.data); - if (error < 0) - return error; - } else - *size_p = size; - - while (type == GIT_OBJ_OFS_DELTA || type == GIT_OBJ_REF_DELTA) { - curpos = base_offset; - error = git_packfile_unpack_header(&size, &type, &p->mwf, &w_curs, &curpos); - git_mwindow_close(&w_curs); - if (error < 0) - return error; - if (type != GIT_OBJ_OFS_DELTA && type != GIT_OBJ_REF_DELTA) - break; - base_offset = get_delta_base(p, &w_curs, &curpos, type, base_offset); - git_mwindow_close(&w_curs); - } - *type_p = type; - - return error; -} - -#define SMALL_STACK_SIZE 64 - -/** - * Generate the chain of dependencies which we need to get to the - * object at `off`. `chain` is used a stack, popping gives the right - * order to apply deltas on. If an object is found in the pack's base - * cache, we stop calculating there. - */ -static int pack_dependency_chain(git_dependency_chain *chain_out, - git_pack_cache_entry **cached_out, git_off_t *cached_off, - struct pack_chain_elem *small_stack, size_t *stack_sz, - struct git_pack_file *p, git_off_t obj_offset) -{ - git_dependency_chain chain = GIT_ARRAY_INIT; - git_mwindow *w_curs = NULL; - git_off_t curpos = obj_offset, base_offset; - int error = 0, use_heap = 0; - size_t size, elem_pos; - git_otype type; - - elem_pos = 0; - while (true) { - struct pack_chain_elem *elem; - git_pack_cache_entry *cached = NULL; - - /* if we have a base cached, we can stop here instead */ - if ((cached = cache_get(&p->bases, obj_offset)) != NULL) { - *cached_out = cached; - *cached_off = obj_offset; - break; - } - - /* if we run out of space on the small stack, use the array */ - if (elem_pos == SMALL_STACK_SIZE) { - git_array_init_to_size(chain, elem_pos); - GITERR_CHECK_ARRAY(chain); - memcpy(chain.ptr, small_stack, elem_pos * sizeof(struct pack_chain_elem)); - chain.size = elem_pos; - use_heap = 1; - } - - curpos = obj_offset; - if (!use_heap) { - elem = &small_stack[elem_pos]; - } else { - elem = git_array_alloc(chain); - if (!elem) { - error = -1; - goto on_error; - } - } - - elem->base_key = obj_offset; - - error = git_packfile_unpack_header(&size, &type, &p->mwf, &w_curs, &curpos); - git_mwindow_close(&w_curs); - - if (error < 0) - goto on_error; - - elem->offset = curpos; - elem->size = size; - elem->type = type; - elem->base_key = obj_offset; - - if (type != GIT_OBJ_OFS_DELTA && type != GIT_OBJ_REF_DELTA) - break; - - base_offset = get_delta_base(p, &w_curs, &curpos, type, obj_offset); - git_mwindow_close(&w_curs); - - if (base_offset == 0) { - error = packfile_error("delta offset is zero"); - goto on_error; - } - if (base_offset < 0) { /* must actually be an error code */ - error = (int)base_offset; - goto on_error; - } - - /* we need to pass the pos *after* the delta-base bit */ - elem->offset = curpos; - - /* go through the loop again, but with the new object */ - obj_offset = base_offset; - elem_pos++; - } - - - *stack_sz = elem_pos + 1; - *chain_out = chain; - return error; - -on_error: - git_array_clear(chain); - return error; -} - -int git_packfile_unpack( - git_rawobj *obj, - struct git_pack_file *p, - git_off_t *obj_offset) -{ - git_mwindow *w_curs = NULL; - git_off_t curpos = *obj_offset; - int error, free_base = 0; - git_dependency_chain chain = GIT_ARRAY_INIT; - struct pack_chain_elem *elem = NULL, *stack; - git_pack_cache_entry *cached = NULL; - struct pack_chain_elem small_stack[SMALL_STACK_SIZE]; - size_t stack_size = 0, elem_pos, alloclen; - git_otype base_type; - - /* - * TODO: optionally check the CRC on the packfile - */ - - error = pack_dependency_chain(&chain, &cached, obj_offset, small_stack, &stack_size, p, *obj_offset); - if (error < 0) - return error; - - obj->data = NULL; - obj->len = 0; - obj->type = GIT_OBJ_BAD; - - /* let's point to the right stack */ - stack = chain.ptr ? chain.ptr : small_stack; - - elem_pos = stack_size; - if (cached) { - memcpy(obj, &cached->raw, sizeof(git_rawobj)); - base_type = obj->type; - elem_pos--; /* stack_size includes the base, which isn't actually there */ - } else { - elem = &stack[--elem_pos]; - base_type = elem->type; - } - - switch (base_type) { - case GIT_OBJ_COMMIT: - case GIT_OBJ_TREE: - case GIT_OBJ_BLOB: - case GIT_OBJ_TAG: - if (!cached) { - curpos = elem->offset; - error = packfile_unpack_compressed(obj, p, &w_curs, &curpos, elem->size, elem->type); - git_mwindow_close(&w_curs); - base_type = elem->type; - } - if (error < 0) - goto cleanup; - break; - case GIT_OBJ_OFS_DELTA: - case GIT_OBJ_REF_DELTA: - error = packfile_error("dependency chain ends in a delta"); - goto cleanup; - default: - error = packfile_error("invalid packfile type in header"); - goto cleanup; - } - - /* - * Finding the object we want a cached base element is - * problematic, as we need to make sure we don't accidentally - * give the caller the cached object, which it would then feel - * free to free, so we need to copy the data. - */ - if (cached && stack_size == 1) { - void *data = obj->data; - - GITERR_CHECK_ALLOC_ADD(&alloclen, obj->len, 1); - obj->data = git__malloc(alloclen); - GITERR_CHECK_ALLOC(obj->data); - - memcpy(obj->data, data, obj->len + 1); - git_atomic_dec(&cached->refcount); - goto cleanup; - } - - /* we now apply each consecutive delta until we run out */ - while (elem_pos > 0 && !error) { - git_rawobj base, delta; - - /* - * We can now try to add the base to the cache, as - * long as it's not already the cached one. - */ - if (!cached) - free_base = !!cache_add(&cached, &p->bases, obj, elem->base_key); - - elem = &stack[elem_pos - 1]; - curpos = elem->offset; - error = packfile_unpack_compressed(&delta, p, &w_curs, &curpos, elem->size, elem->type); - git_mwindow_close(&w_curs); - - if (error < 0) - break; - - /* the current object becomes the new base, on which we apply the delta */ - base = *obj; - obj->data = NULL; - obj->len = 0; - obj->type = GIT_OBJ_BAD; - - error = git__delta_apply(obj, base.data, base.len, delta.data, delta.len); - obj->type = base_type; - /* - * We usually don't want to free the base at this - * point, as we put it into the cache in the previous - * iteration. free_base lets us know that we got the - * base object directly from the packfile, so we can free it. - */ - git__free(delta.data); - if (free_base) { - free_base = 0; - git__free(base.data); - } - - if (cached) { - git_atomic_dec(&cached->refcount); - cached = NULL; - } - - if (error < 0) - break; - - elem_pos--; - } - -cleanup: - if (error < 0) - git__free(obj->data); - - if (elem) - *obj_offset = curpos; - - git_array_clear(chain); - return error; -} - -static void *use_git_alloc(void *opaq, unsigned int count, unsigned int size) -{ - GIT_UNUSED(opaq); - return git__calloc(count, size); -} - -static void use_git_free(void *opaq, void *ptr) -{ - GIT_UNUSED(opaq); - git__free(ptr); -} - -int git_packfile_stream_open(git_packfile_stream *obj, struct git_pack_file *p, git_off_t curpos) -{ - int st; - - memset(obj, 0, sizeof(git_packfile_stream)); - obj->curpos = curpos; - obj->p = p; - obj->zstream.zalloc = use_git_alloc; - obj->zstream.zfree = use_git_free; - obj->zstream.next_in = Z_NULL; - obj->zstream.next_out = Z_NULL; - st = inflateInit(&obj->zstream); - if (st != Z_OK) { - git__free(obj); - giterr_set(GITERR_ZLIB, "failed to init packfile stream"); - return -1; - } - - return 0; -} - -ssize_t git_packfile_stream_read(git_packfile_stream *obj, void *buffer, size_t len) -{ - unsigned char *in; - size_t written; - int st; - - if (obj->done) - return 0; - - in = pack_window_open(obj->p, &obj->mw, obj->curpos, &obj->zstream.avail_in); - if (in == NULL) - return GIT_EBUFS; - - obj->zstream.next_out = buffer; - obj->zstream.avail_out = (unsigned int)len; - obj->zstream.next_in = in; - - st = inflate(&obj->zstream, Z_SYNC_FLUSH); - git_mwindow_close(&obj->mw); - - obj->curpos += obj->zstream.next_in - in; - written = len - obj->zstream.avail_out; - - if (st != Z_OK && st != Z_STREAM_END) { - giterr_set(GITERR_ZLIB, "error reading from the zlib stream"); - return -1; - } - - if (st == Z_STREAM_END) - obj->done = 1; - - - /* If we didn't write anything out but we're not done, we need more data */ - if (!written && st != Z_STREAM_END) - return GIT_EBUFS; - - return written; - -} - -void git_packfile_stream_free(git_packfile_stream *obj) -{ - inflateEnd(&obj->zstream); -} - -int packfile_unpack_compressed( - git_rawobj *obj, - struct git_pack_file *p, - git_mwindow **w_curs, - git_off_t *curpos, - size_t size, - git_otype type) -{ - size_t buf_size; - int st; - z_stream stream; - unsigned char *buffer, *in; - - GITERR_CHECK_ALLOC_ADD(&buf_size, size, 1); - buffer = git__calloc(1, buf_size); - GITERR_CHECK_ALLOC(buffer); - - memset(&stream, 0, sizeof(stream)); - stream.next_out = buffer; - stream.avail_out = (uInt)buf_size; - stream.zalloc = use_git_alloc; - stream.zfree = use_git_free; - - st = inflateInit(&stream); - if (st != Z_OK) { - git__free(buffer); - giterr_set(GITERR_ZLIB, "failed to init zlib stream on unpack"); - - return -1; - } - - do { - in = pack_window_open(p, w_curs, *curpos, &stream.avail_in); - stream.next_in = in; - st = inflate(&stream, Z_FINISH); - git_mwindow_close(w_curs); - - if (!stream.avail_out) - break; /* the payload is larger than it should be */ - - if (st == Z_BUF_ERROR && in == NULL) { - inflateEnd(&stream); - git__free(buffer); - return GIT_EBUFS; - } - - *curpos += stream.next_in - in; - } while (st == Z_OK || st == Z_BUF_ERROR); - - inflateEnd(&stream); - - if ((st != Z_STREAM_END) || stream.total_out != size) { - git__free(buffer); - giterr_set(GITERR_ZLIB, "error inflating zlib stream"); - return -1; - } - - obj->type = type; - obj->len = size; - obj->data = buffer; - return 0; -} - -/* - * curpos is where the data starts, delta_obj_offset is the where the - * header starts - */ -git_off_t get_delta_base( - struct git_pack_file *p, - git_mwindow **w_curs, - git_off_t *curpos, - git_otype type, - git_off_t delta_obj_offset) -{ - unsigned int left = 0; - unsigned char *base_info; - git_off_t base_offset; - git_oid unused; - - base_info = pack_window_open(p, w_curs, *curpos, &left); - /* Assumption: the only reason this would fail is because the file is too small */ - if (base_info == NULL) - return GIT_EBUFS; - /* pack_window_open() assured us we have [base_info, base_info + 20) - * as a range that we can look at without walking off the - * end of the mapped window. Its actually the hash size - * that is assured. An OFS_DELTA longer than the hash size - * is stupid, as then a REF_DELTA would be smaller to store. - */ - if (type == GIT_OBJ_OFS_DELTA) { - unsigned used = 0; - unsigned char c = base_info[used++]; - base_offset = c & 127; - while (c & 128) { - if (left <= used) - return GIT_EBUFS; - base_offset += 1; - if (!base_offset || MSB(base_offset, 7)) - return 0; /* overflow */ - c = base_info[used++]; - base_offset = (base_offset << 7) + (c & 127); - } - base_offset = delta_obj_offset - base_offset; - if (base_offset <= 0 || base_offset >= delta_obj_offset) - return 0; /* out of bound */ - *curpos += used; - } else if (type == GIT_OBJ_REF_DELTA) { - /* If we have the cooperative cache, search in it first */ - if (p->has_cache) { - khiter_t k; - git_oid oid; - - git_oid_fromraw(&oid, base_info); - k = kh_get(oid, p->idx_cache, &oid); - if (k != kh_end(p->idx_cache)) { - *curpos += 20; - return ((struct git_pack_entry *)kh_value(p->idx_cache, k))->offset; - } else { - /* If we're building an index, don't try to find the pack - * entry; we just haven't seen it yet. We'll make - * progress again in the next loop. - */ - return GIT_PASSTHROUGH; - } - } - - /* The base entry _must_ be in the same pack */ - if (pack_entry_find_offset(&base_offset, &unused, p, (git_oid *)base_info, GIT_OID_HEXSZ) < 0) - return packfile_error("base entry delta is not in the same pack"); - *curpos += 20; - } else - return 0; - - return base_offset; -} - -/*********************************************************** - * - * PACKFILE METHODS - * - ***********************************************************/ - -void git_packfile_free(struct git_pack_file *p) -{ - if (!p) - return; - - cache_free(&p->bases); - - if (p->mwf.fd >= 0) { - git_mwindow_free_all_locked(&p->mwf); - p_close(p->mwf.fd); - } - - pack_index_free(p); - - git__free(p->bad_object_sha1); - - git_mutex_free(&p->lock); - git_mutex_free(&p->bases.lock); - git__free(p); -} - -static int packfile_open(struct git_pack_file *p) -{ - struct stat st; - struct git_pack_header hdr; - git_oid sha1; - unsigned char *idx_sha1; - - if (p->index_version == -1 && pack_index_open(p) < 0) - return git_odb__error_notfound("failed to open packfile", NULL); - - /* if mwf opened by another thread, return now */ - if (git_mutex_lock(&p->lock) < 0) - return packfile_error("failed to get lock for open"); - - if (p->mwf.fd >= 0) { - git_mutex_unlock(&p->lock); - return 0; - } - - /* TODO: open with noatime */ - p->mwf.fd = git_futils_open_ro(p->pack_name); - if (p->mwf.fd < 0) - goto cleanup; - - if (p_fstat(p->mwf.fd, &st) < 0 || - git_mwindow_file_register(&p->mwf) < 0) - goto cleanup; - - /* If we created the struct before we had the pack we lack size. */ - if (!p->mwf.size) { - if (!S_ISREG(st.st_mode)) - goto cleanup; - p->mwf.size = (git_off_t)st.st_size; - } else if (p->mwf.size != st.st_size) - goto cleanup; - -#if 0 - /* We leave these file descriptors open with sliding mmap; - * there is no point keeping them open across exec(), though. - */ - fd_flag = fcntl(p->mwf.fd, F_GETFD, 0); - if (fd_flag < 0) - goto cleanup; - - fd_flag |= FD_CLOEXEC; - if (fcntl(p->pack_fd, F_SETFD, fd_flag) == -1) - goto cleanup; -#endif - - /* Verify we recognize this pack file format. */ - if (p_read(p->mwf.fd, &hdr, sizeof(hdr)) < 0 || - hdr.hdr_signature != htonl(PACK_SIGNATURE) || - !pack_version_ok(hdr.hdr_version)) - goto cleanup; - - /* Verify the pack matches its index. */ - if (p->num_objects != ntohl(hdr.hdr_entries) || - p_lseek(p->mwf.fd, p->mwf.size - GIT_OID_RAWSZ, SEEK_SET) == -1 || - p_read(p->mwf.fd, sha1.id, GIT_OID_RAWSZ) < 0) - goto cleanup; - - idx_sha1 = ((unsigned char *)p->index_map.data) + p->index_map.len - 40; - - if (git_oid__cmp(&sha1, (git_oid *)idx_sha1) != 0) - goto cleanup; - - git_mutex_unlock(&p->lock); - return 0; - -cleanup: - giterr_set(GITERR_OS, "Invalid packfile '%s'", p->pack_name); - - if (p->mwf.fd >= 0) - p_close(p->mwf.fd); - p->mwf.fd = -1; - - git_mutex_unlock(&p->lock); - - return -1; -} - -int git_packfile__name(char **out, const char *path) -{ - size_t path_len; - git_buf buf = GIT_BUF_INIT; - - path_len = strlen(path); - - if (path_len < strlen(".idx")) - return git_odb__error_notfound("invalid packfile path", NULL); - - if (git_buf_printf(&buf, "%.*s.pack", (int)(path_len - strlen(".idx")), path) < 0) - return -1; - - *out = git_buf_detach(&buf); - return 0; -} - -int git_packfile_alloc(struct git_pack_file **pack_out, const char *path) -{ - struct stat st; - struct git_pack_file *p; - size_t path_len = path ? strlen(path) : 0, alloc_len; - - *pack_out = NULL; - - if (path_len < strlen(".idx")) - return git_odb__error_notfound("invalid packfile path", NULL); - - GITERR_CHECK_ALLOC_ADD(&alloc_len, sizeof(*p), path_len); - GITERR_CHECK_ALLOC_ADD(&alloc_len, alloc_len, 2); - - p = git__calloc(1, alloc_len); - GITERR_CHECK_ALLOC(p); - - memcpy(p->pack_name, path, path_len + 1); - - /* - * Make sure a corresponding .pack file exists and that - * the index looks sane. - */ - if (git__suffixcmp(path, ".idx") == 0) { - size_t root_len = path_len - strlen(".idx"); - - memcpy(p->pack_name + root_len, ".keep", sizeof(".keep")); - if (git_path_exists(p->pack_name) == true) - p->pack_keep = 1; - - memcpy(p->pack_name + root_len, ".pack", sizeof(".pack")); - } - - if (p_stat(p->pack_name, &st) < 0 || !S_ISREG(st.st_mode)) { - git__free(p); - return git_odb__error_notfound("packfile not found", NULL); - } - - /* ok, it looks sane as far as we can check without - * actually mapping the pack file. - */ - p->mwf.fd = -1; - p->mwf.size = st.st_size; - p->pack_local = 1; - p->mtime = (git_time_t)st.st_mtime; - p->index_version = -1; - - if (git_mutex_init(&p->lock)) { - giterr_set(GITERR_OS, "Failed to initialize packfile mutex"); - git__free(p); - return -1; - } - - if (cache_init(&p->bases) < 0) { - git__free(p); - return -1; - } - - *pack_out = p; - - return 0; -} - -/*********************************************************** - * - * PACKFILE ENTRY SEARCH INTERNALS - * - ***********************************************************/ - -static git_off_t nth_packed_object_offset(const struct git_pack_file *p, uint32_t n) -{ - const unsigned char *index = p->index_map.data; - index += 4 * 256; - if (p->index_version == 1) { - return ntohl(*((uint32_t *)(index + 24 * n))); - } else { - uint32_t off; - index += 8 + p->num_objects * (20 + 4); - off = ntohl(*((uint32_t *)(index + 4 * n))); - if (!(off & 0x80000000)) - return off; - index += p->num_objects * 4 + (off & 0x7fffffff) * 8; - return (((uint64_t)ntohl(*((uint32_t *)(index + 0)))) << 32) | - ntohl(*((uint32_t *)(index + 4))); - } -} - -static int git__memcmp4(const void *a, const void *b) { - return memcmp(a, b, 4); -} - -int git_pack_foreach_entry( - struct git_pack_file *p, - git_odb_foreach_cb cb, - void *data) -{ - const unsigned char *index = p->index_map.data, *current; - uint32_t i; - int error = 0; - - if (index == NULL) { - if ((error = pack_index_open(p)) < 0) - return error; - - assert(p->index_map.data); - - index = p->index_map.data; - } - - if (p->index_version > 1) { - index += 8; - } - - index += 4 * 256; - - if (p->oids == NULL) { - git_vector offsets, oids; - - if ((error = git_vector_init(&oids, p->num_objects, NULL))) - return error; - - if ((error = git_vector_init(&offsets, p->num_objects, git__memcmp4))) - return error; - - if (p->index_version > 1) { - const unsigned char *off = index + 24 * p->num_objects; - for (i = 0; i < p->num_objects; i++) - git_vector_insert(&offsets, (void*)&off[4 * i]); - git_vector_sort(&offsets); - git_vector_foreach(&offsets, i, current) - git_vector_insert(&oids, (void*)&index[5 * (current - off)]); - } else { - for (i = 0; i < p->num_objects; i++) - git_vector_insert(&offsets, (void*)&index[24 * i]); - git_vector_sort(&offsets); - git_vector_foreach(&offsets, i, current) - git_vector_insert(&oids, (void*)¤t[4]); - } - - git_vector_free(&offsets); - p->oids = (git_oid **)git_vector_detach(NULL, NULL, &oids); - } - - for (i = 0; i < p->num_objects; i++) - if ((error = cb(p->oids[i], data)) != 0) - return giterr_set_after_callback(error); - - return error; -} - -static int pack_entry_find_offset( - git_off_t *offset_out, - git_oid *found_oid, - struct git_pack_file *p, - const git_oid *short_oid, - size_t len) -{ - const uint32_t *level1_ofs = p->index_map.data; - const unsigned char *index = p->index_map.data; - unsigned hi, lo, stride; - int pos, found = 0; - const unsigned char *current = 0; - - *offset_out = 0; - - if (p->index_version == -1) { - int error; - - if ((error = pack_index_open(p)) < 0) - return error; - assert(p->index_map.data); - - index = p->index_map.data; - level1_ofs = p->index_map.data; - } - - if (p->index_version > 1) { - level1_ofs += 2; - index += 8; - } - - index += 4 * 256; - hi = ntohl(level1_ofs[(int)short_oid->id[0]]); - lo = ((short_oid->id[0] == 0x0) ? 0 : ntohl(level1_ofs[(int)short_oid->id[0] - 1])); - - if (p->index_version > 1) { - stride = 20; - } else { - stride = 24; - index += 4; - } - -#ifdef INDEX_DEBUG_LOOKUP - printf("%02x%02x%02x... lo %u hi %u nr %d\n", - short_oid->id[0], short_oid->id[1], short_oid->id[2], lo, hi, p->num_objects); -#endif - -#ifdef GIT_USE_LOOKUP - pos = sha1_entry_pos(index, stride, 0, lo, hi, p->num_objects, short_oid->id); -#else - pos = sha1_position(index, stride, lo, hi, short_oid->id); -#endif - - if (pos >= 0) { - /* An object matching exactly the oid was found */ - found = 1; - current = index + pos * stride; - } else { - /* No object was found */ - /* pos refers to the object with the "closest" oid to short_oid */ - pos = - 1 - pos; - if (pos < (int)p->num_objects) { - current = index + pos * stride; - - if (!git_oid_ncmp(short_oid, (const git_oid *)current, len)) - found = 1; - } - } - - if (found && len != GIT_OID_HEXSZ && pos + 1 < (int)p->num_objects) { - /* Check for ambiguousity */ - const unsigned char *next = current + stride; - - if (!git_oid_ncmp(short_oid, (const git_oid *)next, len)) { - found = 2; - } - } - - if (!found) - return git_odb__error_notfound("failed to find offset for pack entry", short_oid); - if (found > 1) - return git_odb__error_ambiguous("found multiple offsets for pack entry"); - - *offset_out = nth_packed_object_offset(p, pos); - git_oid_fromraw(found_oid, current); - -#ifdef INDEX_DEBUG_LOOKUP - { - unsigned char hex_sha1[GIT_OID_HEXSZ + 1]; - git_oid_fmt(hex_sha1, found_oid); - hex_sha1[GIT_OID_HEXSZ] = '\0'; - printf("found lo=%d %s\n", lo, hex_sha1); - } -#endif - - return 0; -} - -int git_pack_entry_find( - struct git_pack_entry *e, - struct git_pack_file *p, - const git_oid *short_oid, - size_t len) -{ - git_off_t offset; - git_oid found_oid; - int error; - - assert(p); - - if (len == GIT_OID_HEXSZ && p->num_bad_objects) { - unsigned i; - for (i = 0; i < p->num_bad_objects; i++) - if (git_oid__cmp(short_oid, &p->bad_object_sha1[i]) == 0) - return packfile_error("bad object found in packfile"); - } - - error = pack_entry_find_offset(&offset, &found_oid, p, short_oid, len); - if (error < 0) - return error; - - /* we found a unique entry in the index; - * make sure the packfile backing the index - * still exists on disk */ - if (p->mwf.fd == -1 && (error = packfile_open(p)) < 0) - return error; - - e->offset = offset; - e->p = p; - - git_oid_cpy(&e->sha1, &found_oid); - return 0; -} diff --git a/vendor/libgit2/src/pack.h b/vendor/libgit2/src/pack.h deleted file mode 100644 index b3d5b29938..0000000000 --- a/vendor/libgit2/src/pack.h +++ /dev/null @@ -1,170 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#ifndef INCLUDE_pack_h__ -#define INCLUDE_pack_h__ - -#include - -#include "git2/oid.h" - -#include "common.h" -#include "map.h" -#include "mwindow.h" -#include "odb.h" -#include "oidmap.h" -#include "array.h" - -#define GIT_PACK_FILE_MODE 0444 - -#define PACK_SIGNATURE 0x5041434b /* "PACK" */ -#define PACK_VERSION 2 -#define pack_version_ok(v) ((v) == htonl(2) || (v) == htonl(3)) -struct git_pack_header { - uint32_t hdr_signature; - uint32_t hdr_version; - uint32_t hdr_entries; -}; - -/* - * The first four bytes of index formats later than version 1 should - * start with this signature, as all older git binaries would find this - * value illegal and abort reading the file. - * - * This is the case because the number of objects in a packfile - * cannot exceed 1,431,660,000 as every object would need at least - * 3 bytes of data and the overall packfile cannot exceed 4 GiB with - * version 1 of the index file due to the offsets limited to 32 bits. - * Clearly the signature exceeds this maximum. - * - * Very old git binaries will also compare the first 4 bytes to the - * next 4 bytes in the index and abort with a "non-monotonic index" - * error if the second 4 byte word is smaller than the first 4 - * byte word. This would be true in the proposed future index - * format as idx_signature would be greater than idx_version. - */ - -#define PACK_IDX_SIGNATURE 0xff744f63 /* "\377tOc" */ - -struct git_pack_idx_header { - uint32_t idx_signature; - uint32_t idx_version; -}; - -typedef struct git_pack_cache_entry { - size_t last_usage; /* enough? */ - git_atomic refcount; - git_rawobj raw; -} git_pack_cache_entry; - -struct pack_chain_elem { - git_off_t base_key; - git_off_t offset; - size_t size; - git_otype type; -}; - -typedef git_array_t(struct pack_chain_elem) git_dependency_chain; - -#include "offmap.h" -#include "oidmap.h" - -#define GIT_PACK_CACHE_MEMORY_LIMIT 16 * 1024 * 1024 -#define GIT_PACK_CACHE_SIZE_LIMIT 1024 * 1024 /* don't bother caching anything over 1MB */ - -typedef struct { - size_t memory_used; - size_t memory_limit; - size_t use_ctr; - git_mutex lock; - git_offmap *entries; -} git_pack_cache; - -struct git_pack_file { - git_mwindow_file mwf; - git_map index_map; - git_mutex lock; /* protect updates to mwf and index_map */ - git_atomic refcount; - - uint32_t num_objects; - uint32_t num_bad_objects; - git_oid *bad_object_sha1; /* array of git_oid */ - - int index_version; - git_time_t mtime; - unsigned pack_local:1, pack_keep:1, has_cache:1; - git_oidmap *idx_cache; - git_oid **oids; - - git_pack_cache bases; /* delta base cache */ - - /* something like ".git/objects/pack/xxxxx.pack" */ - char pack_name[GIT_FLEX_ARRAY]; /* more */ -}; - -struct git_pack_entry { - git_off_t offset; - git_oid sha1; - struct git_pack_file *p; -}; - -typedef struct git_packfile_stream { - git_off_t curpos; - int done; - z_stream zstream; - struct git_pack_file *p; - git_mwindow *mw; -} git_packfile_stream; - -size_t git_packfile__object_header(unsigned char *hdr, size_t size, git_otype type); - -int git_packfile__name(char **out, const char *path); - -int git_packfile_unpack_header( - size_t *size_p, - git_otype *type_p, - git_mwindow_file *mwf, - git_mwindow **w_curs, - git_off_t *curpos); - -int git_packfile_resolve_header( - size_t *size_p, - git_otype *type_p, - struct git_pack_file *p, - git_off_t offset); - -int git_packfile_unpack(git_rawobj *obj, struct git_pack_file *p, git_off_t *obj_offset); -int packfile_unpack_compressed( - git_rawobj *obj, - struct git_pack_file *p, - git_mwindow **w_curs, - git_off_t *curpos, - size_t size, - git_otype type); - -int git_packfile_stream_open(git_packfile_stream *obj, struct git_pack_file *p, git_off_t curpos); -ssize_t git_packfile_stream_read(git_packfile_stream *obj, void *buffer, size_t len); -void git_packfile_stream_free(git_packfile_stream *obj); - -git_off_t get_delta_base(struct git_pack_file *p, git_mwindow **w_curs, - git_off_t *curpos, git_otype type, - git_off_t delta_obj_offset); - -void git_packfile_free(struct git_pack_file *p); -int git_packfile_alloc(struct git_pack_file **pack_out, const char *path); - -int git_pack_entry_find( - struct git_pack_entry *e, - struct git_pack_file *p, - const git_oid *short_oid, - size_t len); -int git_pack_foreach_entry( - struct git_pack_file *p, - git_odb_foreach_cb cb, - void *data); - -#endif diff --git a/vendor/libgit2/src/path.c b/vendor/libgit2/src/path.c deleted file mode 100644 index d1454846b1..0000000000 --- a/vendor/libgit2/src/path.c +++ /dev/null @@ -1,1678 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#include "common.h" -#include "path.h" -#include "posix.h" -#include "repository.h" -#ifdef GIT_WIN32 -#include "win32/posix.h" -#include "win32/w32_buffer.h" -#include "win32/w32_util.h" -#include "win32/version.h" -#else -#include -#endif -#include -#include - -#define LOOKS_LIKE_DRIVE_PREFIX(S) (git__isalpha((S)[0]) && (S)[1] == ':') - -#ifdef GIT_WIN32 -static bool looks_like_network_computer_name(const char *path, int pos) -{ - if (pos < 3) - return false; - - if (path[0] != '/' || path[1] != '/') - return false; - - while (pos-- > 2) { - if (path[pos] == '/') - return false; - } - - return true; -} -#endif - -/* - * Based on the Android implementation, BSD licensed. - * http://android.git.kernel.org/ - * - * Copyright (C) 2008 The Android Open Source Project - * 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. - * - * 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. - */ -int git_path_basename_r(git_buf *buffer, const char *path) -{ - const char *endp, *startp; - int len, result; - - /* Empty or NULL string gets treated as "." */ - if (path == NULL || *path == '\0') { - startp = "."; - len = 1; - goto Exit; - } - - /* Strip trailing slashes */ - endp = path + strlen(path) - 1; - while (endp > path && *endp == '/') - endp--; - - /* All slashes becomes "/" */ - if (endp == path && *endp == '/') { - startp = "/"; - len = 1; - goto Exit; - } - - /* Find the start of the base */ - startp = endp; - while (startp > path && *(startp - 1) != '/') - startp--; - - /* Cast is safe because max path < max int */ - len = (int)(endp - startp + 1); - -Exit: - result = len; - - if (buffer != NULL && git_buf_set(buffer, startp, len) < 0) - return -1; - - return result; -} - -/* - * Based on the Android implementation, BSD licensed. - * Check http://android.git.kernel.org/ - */ -int git_path_dirname_r(git_buf *buffer, const char *path) -{ - const char *endp; - int result, len; - - /* Empty or NULL string gets treated as "." */ - if (path == NULL || *path == '\0') { - path = "."; - len = 1; - goto Exit; - } - - /* Strip trailing slashes */ - endp = path + strlen(path) - 1; - while (endp > path && *endp == '/') - endp--; - - /* Find the start of the dir */ - while (endp > path && *endp != '/') - endp--; - - /* Either the dir is "/" or there are no slashes */ - if (endp == path) { - path = (*endp == '/') ? "/" : "."; - len = 1; - goto Exit; - } - - do { - endp--; - } while (endp > path && *endp == '/'); - - /* Cast is safe because max path < max int */ - len = (int)(endp - path + 1); - -#ifdef GIT_WIN32 - /* Mimic unix behavior where '/.git' returns '/': 'C:/.git' will return - 'C:/' here */ - - if (len == 2 && LOOKS_LIKE_DRIVE_PREFIX(path)) { - len = 3; - goto Exit; - } - - /* Similarly checks if we're dealing with a network computer name - '//computername/.git' will return '//computername/' */ - - if (looks_like_network_computer_name(path, len)) { - len++; - goto Exit; - } - -#endif - -Exit: - result = len; - - if (buffer != NULL && git_buf_set(buffer, path, len) < 0) - return -1; - - return result; -} - - -char *git_path_dirname(const char *path) -{ - git_buf buf = GIT_BUF_INIT; - char *dirname; - - git_path_dirname_r(&buf, path); - dirname = git_buf_detach(&buf); - git_buf_free(&buf); /* avoid memleak if error occurs */ - - return dirname; -} - -char *git_path_basename(const char *path) -{ - git_buf buf = GIT_BUF_INIT; - char *basename; - - git_path_basename_r(&buf, path); - basename = git_buf_detach(&buf); - git_buf_free(&buf); /* avoid memleak if error occurs */ - - return basename; -} - -size_t git_path_basename_offset(git_buf *buffer) -{ - ssize_t slash; - - if (!buffer || buffer->size <= 0) - return 0; - - slash = git_buf_rfind_next(buffer, '/'); - - if (slash >= 0 && buffer->ptr[slash] == '/') - return (size_t)(slash + 1); - - return 0; -} - -const char *git_path_topdir(const char *path) -{ - size_t len; - ssize_t i; - - assert(path); - len = strlen(path); - - if (!len || path[len - 1] != '/') - return NULL; - - for (i = (ssize_t)len - 2; i >= 0; --i) - if (path[i] == '/') - break; - - return &path[i + 1]; -} - -int git_path_root(const char *path) -{ - int offset = 0; - - /* Does the root of the path look like a windows drive ? */ - if (LOOKS_LIKE_DRIVE_PREFIX(path)) - offset += 2; - -#ifdef GIT_WIN32 - /* Are we dealing with a windows network path? */ - else if ((path[0] == '/' && path[1] == '/' && path[2] != '/') || - (path[0] == '\\' && path[1] == '\\' && path[2] != '\\')) - { - offset += 2; - - /* Skip the computer name segment */ - while (path[offset] && path[offset] != '/' && path[offset] != '\\') - offset++; - } -#endif - - if (path[offset] == '/' || path[offset] == '\\') - return offset; - - return -1; /* Not a real error - signals that path is not rooted */ -} - -void git_path_trim_slashes(git_buf *path) -{ - int ceiling = git_path_root(path->ptr) + 1; - assert(ceiling >= 0); - - while (path->size > (size_t)ceiling) { - if (path->ptr[path->size-1] != '/') - break; - - path->ptr[path->size-1] = '\0'; - path->size--; - } -} - -int git_path_join_unrooted( - git_buf *path_out, const char *path, const char *base, ssize_t *root_at) -{ - ssize_t root; - - assert(path && path_out); - - root = (ssize_t)git_path_root(path); - - if (base != NULL && root < 0) { - if (git_buf_joinpath(path_out, base, path) < 0) - return -1; - - root = (ssize_t)strlen(base); - } else { - if (git_buf_sets(path_out, path) < 0) - return -1; - - if (root < 0) - root = 0; - else if (base) - git_path_equal_or_prefixed(base, path, &root); - } - - if (root_at) - *root_at = root; - - return 0; -} - -int git_path_prettify(git_buf *path_out, const char *path, const char *base) -{ - char buf[GIT_PATH_MAX]; - - assert(path && path_out); - - /* construct path if needed */ - if (base != NULL && git_path_root(path) < 0) { - if (git_buf_joinpath(path_out, base, path) < 0) - return -1; - path = path_out->ptr; - } - - if (p_realpath(path, buf) == NULL) { - /* giterr_set resets the errno when dealing with a GITERR_OS kind of error */ - int error = (errno == ENOENT || errno == ENOTDIR) ? GIT_ENOTFOUND : -1; - giterr_set(GITERR_OS, "Failed to resolve path '%s'", path); - - git_buf_clear(path_out); - - return error; - } - - return git_buf_sets(path_out, buf); -} - -int git_path_prettify_dir(git_buf *path_out, const char *path, const char *base) -{ - int error = git_path_prettify(path_out, path, base); - return (error < 0) ? error : git_path_to_dir(path_out); -} - -int git_path_to_dir(git_buf *path) -{ - if (path->asize > 0 && - git_buf_len(path) > 0 && - path->ptr[git_buf_len(path) - 1] != '/') - git_buf_putc(path, '/'); - - return git_buf_oom(path) ? -1 : 0; -} - -void git_path_string_to_dir(char* path, size_t size) -{ - size_t end = strlen(path); - - if (end && path[end - 1] != '/' && end < size) { - path[end] = '/'; - path[end + 1] = '\0'; - } -} - -int git__percent_decode(git_buf *decoded_out, const char *input) -{ - int len, hi, lo, i; - assert(decoded_out && input); - - len = (int)strlen(input); - git_buf_clear(decoded_out); - - for(i = 0; i < len; i++) - { - char c = input[i]; - - if (c != '%') - goto append; - - if (i >= len - 2) - goto append; - - hi = git__fromhex(input[i + 1]); - lo = git__fromhex(input[i + 2]); - - if (hi < 0 || lo < 0) - goto append; - - c = (char)(hi << 4 | lo); - i += 2; - -append: - if (git_buf_putc(decoded_out, c) < 0) - return -1; - } - - return 0; -} - -static int error_invalid_local_file_uri(const char *uri) -{ - giterr_set(GITERR_CONFIG, "'%s' is not a valid local file URI", uri); - return -1; -} - -static int local_file_url_prefixlen(const char *file_url) -{ - int len = -1; - - if (git__prefixcmp(file_url, "file://") == 0) { - if (file_url[7] == '/') - len = 8; - else if (git__prefixcmp(file_url + 7, "localhost/") == 0) - len = 17; - } - - return len; -} - -bool git_path_is_local_file_url(const char *file_url) -{ - return (local_file_url_prefixlen(file_url) > 0); -} - -int git_path_fromurl(git_buf *local_path_out, const char *file_url) -{ - int offset; - - assert(local_path_out && file_url); - - if ((offset = local_file_url_prefixlen(file_url)) < 0 || - file_url[offset] == '\0' || file_url[offset] == '/') - return error_invalid_local_file_uri(file_url); - -#ifndef GIT_WIN32 - offset--; /* A *nix absolute path starts with a forward slash */ -#endif - - git_buf_clear(local_path_out); - return git__percent_decode(local_path_out, file_url + offset); -} - -int git_path_walk_up( - git_buf *path, - const char *ceiling, - int (*cb)(void *data, const char *), - void *data) -{ - int error = 0; - git_buf iter; - ssize_t stop = 0, scan; - char oldc = '\0'; - - assert(path && cb); - - if (ceiling != NULL) { - if (git__prefixcmp(path->ptr, ceiling) == 0) - stop = (ssize_t)strlen(ceiling); - else - stop = git_buf_len(path); - } - scan = git_buf_len(path); - - /* empty path: yield only once */ - if (!scan) { - error = cb(data, ""); - if (error) - giterr_set_after_callback(error); - return error; - } - - iter.ptr = path->ptr; - iter.size = git_buf_len(path); - iter.asize = path->asize; - - while (scan >= stop) { - error = cb(data, iter.ptr); - iter.ptr[scan] = oldc; - - if (error) { - giterr_set_after_callback(error); - break; - } - - scan = git_buf_rfind_next(&iter, '/'); - if (scan >= 0) { - scan++; - oldc = iter.ptr[scan]; - iter.size = scan; - iter.ptr[scan] = '\0'; - } - } - - if (scan >= 0) - iter.ptr[scan] = oldc; - - /* relative path: yield for the last component */ - if (!error && stop == 0 && iter.ptr[0] != '/') { - error = cb(data, ""); - if (error) - giterr_set_after_callback(error); - } - - return error; -} - -bool git_path_exists(const char *path) -{ - assert(path); - return p_access(path, F_OK) == 0; -} - -bool git_path_isdir(const char *path) -{ - struct stat st; - if (p_stat(path, &st) < 0) - return false; - - return S_ISDIR(st.st_mode) != 0; -} - -bool git_path_isfile(const char *path) -{ - struct stat st; - - assert(path); - if (p_stat(path, &st) < 0) - return false; - - return S_ISREG(st.st_mode) != 0; -} - -#ifdef GIT_WIN32 - -bool git_path_is_empty_dir(const char *path) -{ - git_win32_path filter_w; - bool empty = false; - - if (git_win32__findfirstfile_filter(filter_w, path)) { - WIN32_FIND_DATAW findData; - HANDLE hFind = FindFirstFileW(filter_w, &findData); - - /* FindFirstFile will fail if there are no children to the given - * path, which can happen if the given path is a file (and obviously - * has no children) or if the given path is an empty mount point. - * (Most directories have at least directory entries '.' and '..', - * but ridiculously another volume mounted in another drive letter's - * path space do not, and thus have nothing to enumerate.) If - * FindFirstFile fails, check if this is a directory-like thing - * (a mount point). - */ - if (hFind == INVALID_HANDLE_VALUE) - return git_path_isdir(path); - - /* If the find handle was created successfully, then it's a directory */ - empty = true; - - do { - /* Allow the enumeration to return . and .. and still be considered - * empty. In the special case of drive roots (i.e. C:\) where . and - * .. do not occur, we can still consider the path to be an empty - * directory if there's nothing there. */ - if (!git_path_is_dot_or_dotdotW(findData.cFileName)) { - empty = false; - break; - } - } while (FindNextFileW(hFind, &findData)); - - FindClose(hFind); - } - - return empty; -} - -#else - -static int path_found_entry(void *payload, git_buf *path) -{ - GIT_UNUSED(payload); - return !git_path_is_dot_or_dotdot(path->ptr); -} - -bool git_path_is_empty_dir(const char *path) -{ - int error; - git_buf dir = GIT_BUF_INIT; - - if (!git_path_isdir(path)) - return false; - - if ((error = git_buf_sets(&dir, path)) != 0) - giterr_clear(); - else - error = git_path_direach(&dir, 0, path_found_entry, NULL); - - git_buf_free(&dir); - - return !error; -} - -#endif - -int git_path_set_error(int errno_value, const char *path, const char *action) -{ - switch (errno_value) { - case ENOENT: - case ENOTDIR: - giterr_set(GITERR_OS, "Could not find '%s' to %s", path, action); - return GIT_ENOTFOUND; - - case EINVAL: - case ENAMETOOLONG: - giterr_set(GITERR_OS, "Invalid path for filesystem '%s'", path); - return GIT_EINVALIDSPEC; - - case EEXIST: - giterr_set(GITERR_OS, "Failed %s - '%s' already exists", action, path); - return GIT_EEXISTS; - - default: - giterr_set(GITERR_OS, "Could not %s '%s'", action, path); - return -1; - } -} - -int git_path_lstat(const char *path, struct stat *st) -{ - if (p_lstat(path, st) == 0) - return 0; - - return git_path_set_error(errno, path, "stat"); -} - -static bool _check_dir_contents( - git_buf *dir, - const char *sub, - bool (*predicate)(const char *)) -{ - bool result; - size_t dir_size = git_buf_len(dir); - size_t sub_size = strlen(sub); - size_t alloc_size; - - /* leave base valid even if we could not make space for subdir */ - if (GIT_ADD_SIZET_OVERFLOW(&alloc_size, dir_size, sub_size) || - GIT_ADD_SIZET_OVERFLOW(&alloc_size, alloc_size, 2) || - git_buf_try_grow(dir, alloc_size, false) < 0) - return false; - - /* save excursion */ - git_buf_joinpath(dir, dir->ptr, sub); - - result = predicate(dir->ptr); - - /* restore path */ - git_buf_truncate(dir, dir_size); - return result; -} - -bool git_path_contains(git_buf *dir, const char *item) -{ - return _check_dir_contents(dir, item, &git_path_exists); -} - -bool git_path_contains_dir(git_buf *base, const char *subdir) -{ - return _check_dir_contents(base, subdir, &git_path_isdir); -} - -bool git_path_contains_file(git_buf *base, const char *file) -{ - return _check_dir_contents(base, file, &git_path_isfile); -} - -int git_path_find_dir(git_buf *dir, const char *path, const char *base) -{ - int error = git_path_join_unrooted(dir, path, base, NULL); - - if (!error) { - char buf[GIT_PATH_MAX]; - if (p_realpath(dir->ptr, buf) != NULL) - error = git_buf_sets(dir, buf); - } - - /* call dirname if this is not a directory */ - if (!error) /* && git_path_isdir(dir->ptr) == false) */ - error = (git_path_dirname_r(dir, dir->ptr) < 0) ? -1 : 0; - - if (!error) - error = git_path_to_dir(dir); - - return error; -} - -int git_path_resolve_relative(git_buf *path, size_t ceiling) -{ - char *base, *to, *from, *next; - size_t len; - - if (!path || git_buf_oom(path)) - return -1; - - if (ceiling > path->size) - ceiling = path->size; - - /* recognize drive prefixes, etc. that should not be backed over */ - if (ceiling == 0) - ceiling = git_path_root(path->ptr) + 1; - - /* recognize URL prefixes that should not be backed over */ - if (ceiling == 0) { - for (next = path->ptr; *next && git__isalpha(*next); ++next); - if (next[0] == ':' && next[1] == '/' && next[2] == '/') - ceiling = (next + 3) - path->ptr; - } - - base = to = from = path->ptr + ceiling; - - while (*from) { - for (next = from; *next && *next != '/'; ++next); - - len = next - from; - - if (len == 1 && from[0] == '.') - /* do nothing with singleton dot */; - - else if (len == 2 && from[0] == '.' && from[1] == '.') { - /* error out if trying to up one from a hard base */ - if (to == base && ceiling != 0) { - giterr_set(GITERR_INVALID, - "Cannot strip root component off url"); - return -1; - } - - /* no more path segments to strip, - * use '../' as a new base path */ - if (to == base) { - if (*next == '/') - len++; - - if (to != from) - memmove(to, from, len); - - to += len; - /* this is now the base, can't back up from a - * relative prefix */ - base = to; - } else { - /* back up a path segment */ - while (to > base && to[-1] == '/') to--; - while (to > base && to[-1] != '/') to--; - } - } else { - if (*next == '/' && *from != '/') - len++; - - if (to != from) - memmove(to, from, len); - - to += len; - } - - from += len; - - while (*from == '/') from++; - } - - *to = '\0'; - - path->size = to - path->ptr; - - return 0; -} - -int git_path_apply_relative(git_buf *target, const char *relpath) -{ - git_buf_joinpath(target, git_buf_cstr(target), relpath); - return git_path_resolve_relative(target, 0); -} - -int git_path_cmp( - const char *name1, size_t len1, int isdir1, - const char *name2, size_t len2, int isdir2, - int (*compare)(const char *, const char *, size_t)) -{ - unsigned char c1, c2; - size_t len = len1 < len2 ? len1 : len2; - int cmp; - - cmp = compare(name1, name2, len); - if (cmp) - return cmp; - - c1 = name1[len]; - c2 = name2[len]; - - if (c1 == '\0' && isdir1) - c1 = '/'; - - if (c2 == '\0' && isdir2) - c2 = '/'; - - return (c1 < c2) ? -1 : (c1 > c2) ? 1 : 0; -} - -int git_path_make_relative(git_buf *path, const char *parent) -{ - const char *p, *q, *p_dirsep, *q_dirsep; - size_t plen = path->size, newlen, alloclen, depth = 1, i, offset; - - for (p_dirsep = p = path->ptr, q_dirsep = q = parent; *p && *q; p++, q++) { - if (*p == '/' && *q == '/') { - p_dirsep = p; - q_dirsep = q; - } - else if (*p != *q) - break; - } - - /* need at least 1 common path segment */ - if ((p_dirsep == path->ptr || q_dirsep == parent) && - (*p_dirsep != '/' || *q_dirsep != '/')) { - giterr_set(GITERR_INVALID, - "%s is not a parent of %s", parent, path->ptr); - return GIT_ENOTFOUND; - } - - if (*p == '/' && !*q) - p++; - else if (!*p && *q == '/') - q++; - else if (!*p && !*q) - return git_buf_clear(path), 0; - else { - p = p_dirsep + 1; - q = q_dirsep + 1; - } - - plen -= (p - path->ptr); - - if (!*q) - return git_buf_set(path, p, plen); - - for (; (q = strchr(q, '/')) && *(q + 1); q++) - depth++; - - GITERR_CHECK_ALLOC_MULTIPLY(&newlen, depth, 3); - GITERR_CHECK_ALLOC_ADD(&newlen, newlen, plen); - - GITERR_CHECK_ALLOC_ADD(&alloclen, newlen, 1); - - /* save the offset as we might realllocate the pointer */ - offset = p - path->ptr; - if (git_buf_try_grow(path, alloclen, 1) < 0) - return -1; - p = path->ptr + offset; - - memmove(path->ptr + (depth * 3), p, plen + 1); - - for (i = 0; i < depth; i++) - memcpy(path->ptr + (i * 3), "../", 3); - - path->size = newlen; - return 0; -} - -bool git_path_has_non_ascii(const char *path, size_t pathlen) -{ - const uint8_t *scan = (const uint8_t *)path, *end; - - for (end = scan + pathlen; scan < end; ++scan) - if (*scan & 0x80) - return true; - - return false; -} - -#ifdef GIT_USE_ICONV - -int git_path_iconv_init_precompose(git_path_iconv_t *ic) -{ - git_buf_init(&ic->buf, 0); - ic->map = iconv_open(GIT_PATH_REPO_ENCODING, GIT_PATH_NATIVE_ENCODING); - return 0; -} - -void git_path_iconv_clear(git_path_iconv_t *ic) -{ - if (ic) { - if (ic->map != (iconv_t)-1) - iconv_close(ic->map); - git_buf_free(&ic->buf); - } -} - -int git_path_iconv(git_path_iconv_t *ic, const char **in, size_t *inlen) -{ - char *nfd = (char*)*in, *nfc; - size_t nfdlen = *inlen, nfclen, wantlen = nfdlen, alloclen, rv; - int retry = 1; - - if (!ic || ic->map == (iconv_t)-1 || - !git_path_has_non_ascii(*in, *inlen)) - return 0; - - git_buf_clear(&ic->buf); - - while (1) { - GITERR_CHECK_ALLOC_ADD(&alloclen, wantlen, 1); - if (git_buf_grow(&ic->buf, alloclen) < 0) - return -1; - - nfc = ic->buf.ptr + ic->buf.size; - nfclen = ic->buf.asize - ic->buf.size; - - rv = iconv(ic->map, &nfd, &nfdlen, &nfc, &nfclen); - - ic->buf.size = (nfc - ic->buf.ptr); - - if (rv != (size_t)-1) - break; - - /* if we cannot convert the data (probably because iconv thinks - * it is not valid UTF-8 source data), then use original data - */ - if (errno != E2BIG) - return 0; - - /* make space for 2x the remaining data to be converted - * (with per retry overhead to avoid infinite loops) - */ - wantlen = ic->buf.size + max(nfclen, nfdlen) * 2 + (size_t)(retry * 4); - - if (retry++ > 4) - goto fail; - } - - ic->buf.ptr[ic->buf.size] = '\0'; - - *in = ic->buf.ptr; - *inlen = ic->buf.size; - - return 0; - -fail: - giterr_set(GITERR_OS, "Unable to convert unicode path data"); - return -1; -} - -static const char *nfc_file = "\xC3\x85\x73\x74\x72\xC3\xB6\x6D.XXXXXX"; -static const char *nfd_file = "\x41\xCC\x8A\x73\x74\x72\x6F\xCC\x88\x6D.XXXXXX"; - -/* Check if the platform is decomposing unicode data for us. We will - * emulate core Git and prefer to use precomposed unicode data internally - * on these platforms, composing the decomposed unicode on the fly. - * - * This mainly happens on the Mac where HDFS stores filenames as - * decomposed unicode. Even on VFAT and SAMBA file systems, the Mac will - * return decomposed unicode from readdir() even when the actual - * filesystem is storing precomposed unicode. - */ -bool git_path_does_fs_decompose_unicode(const char *root) -{ - git_buf path = GIT_BUF_INIT; - int fd; - bool found_decomposed = false; - char tmp[6]; - - /* Create a file using a precomposed path and then try to find it - * using the decomposed name. If the lookup fails, then we will mark - * that we should precompose unicode for this repository. - */ - if (git_buf_joinpath(&path, root, nfc_file) < 0 || - (fd = p_mkstemp(path.ptr)) < 0) - goto done; - p_close(fd); - - /* record trailing digits generated by mkstemp */ - memcpy(tmp, path.ptr + path.size - sizeof(tmp), sizeof(tmp)); - - /* try to look up as NFD path */ - if (git_buf_joinpath(&path, root, nfd_file) < 0) - goto done; - memcpy(path.ptr + path.size - sizeof(tmp), tmp, sizeof(tmp)); - - found_decomposed = git_path_exists(path.ptr); - - /* remove temporary file (using original precomposed path) */ - if (git_buf_joinpath(&path, root, nfc_file) < 0) - goto done; - memcpy(path.ptr + path.size - sizeof(tmp), tmp, sizeof(tmp)); - - (void)p_unlink(path.ptr); - -done: - git_buf_free(&path); - return found_decomposed; -} - -#else - -bool git_path_does_fs_decompose_unicode(const char *root) -{ - GIT_UNUSED(root); - return false; -} - -#endif - -#if defined(__sun) || defined(__GNU__) -typedef char path_dirent_data[sizeof(struct dirent) + FILENAME_MAX + 1]; -#else -typedef struct dirent path_dirent_data; -#endif - -int git_path_direach( - git_buf *path, - uint32_t flags, - int (*fn)(void *, git_buf *), - void *arg) -{ - int error = 0; - ssize_t wd_len; - DIR *dir; - struct dirent *de; - -#ifdef GIT_USE_ICONV - git_path_iconv_t ic = GIT_PATH_ICONV_INIT; -#endif - - GIT_UNUSED(flags); - - if (git_path_to_dir(path) < 0) - return -1; - - wd_len = git_buf_len(path); - - if ((dir = opendir(path->ptr)) == NULL) { - giterr_set(GITERR_OS, "Failed to open directory '%s'", path->ptr); - if (errno == ENOENT) - return GIT_ENOTFOUND; - - return -1; - } - -#ifdef GIT_USE_ICONV - if ((flags & GIT_PATH_DIR_PRECOMPOSE_UNICODE) != 0) - (void)git_path_iconv_init_precompose(&ic); -#endif - - while ((de = readdir(dir)) != NULL) { - const char *de_path = de->d_name; - size_t de_len = strlen(de_path); - - if (git_path_is_dot_or_dotdot(de_path)) - continue; - -#ifdef GIT_USE_ICONV - if ((error = git_path_iconv(&ic, &de_path, &de_len)) < 0) - break; -#endif - - if ((error = git_buf_put(path, de_path, de_len)) < 0) - break; - - giterr_clear(); - error = fn(arg, path); - - git_buf_truncate(path, wd_len); /* restore path */ - - /* Only set our own error if the callback did not set one already */ - if (error != 0) { - if (!giterr_last()) - giterr_set_after_callback(error); - - break; - } - } - - closedir(dir); - -#ifdef GIT_USE_ICONV - git_path_iconv_clear(&ic); -#endif - - return error; -} - -#if defined(GIT_WIN32) && !defined(__MINGW32__) - -/* Using _FIND_FIRST_EX_LARGE_FETCH may increase performance in Windows 7 - * and better. - */ -#ifndef FIND_FIRST_EX_LARGE_FETCH -# define FIND_FIRST_EX_LARGE_FETCH 2 -#endif - -int git_path_diriter_init( - git_path_diriter *diriter, - const char *path, - unsigned int flags) -{ - git_win32_path path_filter; - git_buf hack = {0}; - - static int is_win7_or_later = -1; - if (is_win7_or_later < 0) - is_win7_or_later = git_has_win32_version(6, 1, 0); - - assert(diriter && path); - - memset(diriter, 0, sizeof(git_path_diriter)); - diriter->handle = INVALID_HANDLE_VALUE; - - if (git_buf_puts(&diriter->path_utf8, path) < 0) - return -1; - - git_path_trim_slashes(&diriter->path_utf8); - - if (diriter->path_utf8.size == 0) { - giterr_set(GITERR_FILESYSTEM, "Could not open directory '%s'", path); - return -1; - } - - if ((diriter->parent_len = git_win32_path_from_utf8(diriter->path, diriter->path_utf8.ptr)) < 0 || - !git_win32__findfirstfile_filter(path_filter, diriter->path_utf8.ptr)) { - giterr_set(GITERR_OS, "Could not parse the directory path '%s'", path); - return -1; - } - - diriter->handle = FindFirstFileExW( - path_filter, - is_win7_or_later ? FindExInfoBasic : FindExInfoStandard, - &diriter->current, - FindExSearchNameMatch, - NULL, - is_win7_or_later ? FIND_FIRST_EX_LARGE_FETCH : 0); - - if (diriter->handle == INVALID_HANDLE_VALUE) { - giterr_set(GITERR_OS, "Could not open directory '%s'", path); - return -1; - } - - diriter->parent_utf8_len = diriter->path_utf8.size; - diriter->flags = flags; - return 0; -} - -static int diriter_update_paths(git_path_diriter *diriter) -{ - size_t filename_len, path_len; - - filename_len = wcslen(diriter->current.cFileName); - - if (GIT_ADD_SIZET_OVERFLOW(&path_len, diriter->parent_len, filename_len) || - GIT_ADD_SIZET_OVERFLOW(&path_len, path_len, 2)) - return -1; - - if (path_len > GIT_WIN_PATH_UTF16) { - giterr_set(GITERR_FILESYSTEM, - "invalid path '%.*ls\\%ls' (path too long)", - diriter->parent_len, diriter->path, diriter->current.cFileName); - return -1; - } - - diriter->path[diriter->parent_len] = L'\\'; - memcpy(&diriter->path[diriter->parent_len+1], - diriter->current.cFileName, filename_len * sizeof(wchar_t)); - diriter->path[path_len-1] = L'\0'; - - git_buf_truncate(&diriter->path_utf8, diriter->parent_utf8_len); - git_buf_putc(&diriter->path_utf8, '/'); - git_buf_put_w(&diriter->path_utf8, diriter->current.cFileName, filename_len); - - if (git_buf_oom(&diriter->path_utf8)) - return -1; - - return 0; -} - -int git_path_diriter_next(git_path_diriter *diriter) -{ - bool skip_dot = !(diriter->flags & GIT_PATH_DIR_INCLUDE_DOT_AND_DOTDOT); - - do { - /* Our first time through, we already have the data from - * FindFirstFileW. Use it, otherwise get the next file. - */ - if (!diriter->needs_next) - diriter->needs_next = 1; - else if (!FindNextFileW(diriter->handle, &diriter->current)) - return GIT_ITEROVER; - } while (skip_dot && git_path_is_dot_or_dotdotW(diriter->current.cFileName)); - - if (diriter_update_paths(diriter) < 0) - return -1; - - return 0; -} - -int git_path_diriter_filename( - const char **out, - size_t *out_len, - git_path_diriter *diriter) -{ - assert(out && out_len && diriter); - - assert(diriter->path_utf8.size > diriter->parent_utf8_len); - - *out = &diriter->path_utf8.ptr[diriter->parent_utf8_len+1]; - *out_len = diriter->path_utf8.size - diriter->parent_utf8_len - 1; - return 0; -} - -int git_path_diriter_fullpath( - const char **out, - size_t *out_len, - git_path_diriter *diriter) -{ - assert(out && out_len && diriter); - - *out = diriter->path_utf8.ptr; - *out_len = diriter->path_utf8.size; - return 0; -} - -int git_path_diriter_stat(struct stat *out, git_path_diriter *diriter) -{ - assert(out && diriter); - - return git_win32__file_attribute_to_stat(out, - (WIN32_FILE_ATTRIBUTE_DATA *)&diriter->current, - diriter->path); -} - -void git_path_diriter_free(git_path_diriter *diriter) -{ - if (diriter == NULL) - return; - - git_buf_free(&diriter->path_utf8); - - if (diriter->handle != INVALID_HANDLE_VALUE) { - FindClose(diriter->handle); - diriter->handle = INVALID_HANDLE_VALUE; - } -} - -#else - -int git_path_diriter_init( - git_path_diriter *diriter, - const char *path, - unsigned int flags) -{ - assert(diriter && path); - - memset(diriter, 0, sizeof(git_path_diriter)); - - if (git_buf_puts(&diriter->path, path) < 0) - return -1; - - git_path_trim_slashes(&diriter->path); - - if (diriter->path.size == 0) { - giterr_set(GITERR_FILESYSTEM, "Could not open directory '%s'", path); - return -1; - } - - if ((diriter->dir = opendir(diriter->path.ptr)) == NULL) { - git_buf_free(&diriter->path); - - giterr_set(GITERR_OS, "Failed to open directory '%s'", path); - return -1; - } - -#ifdef GIT_USE_ICONV - if ((flags & GIT_PATH_DIR_PRECOMPOSE_UNICODE) != 0) - (void)git_path_iconv_init_precompose(&diriter->ic); -#endif - - diriter->parent_len = diriter->path.size; - diriter->flags = flags; - - return 0; -} - -int git_path_diriter_next(git_path_diriter *diriter) -{ - struct dirent *de; - const char *filename; - size_t filename_len; - bool skip_dot = !(diriter->flags & GIT_PATH_DIR_INCLUDE_DOT_AND_DOTDOT); - int error = 0; - - assert(diriter); - - errno = 0; - - do { - if ((de = readdir(diriter->dir)) == NULL) { - if (!errno) - return GIT_ITEROVER; - - giterr_set(GITERR_OS, - "Could not read directory '%s'", diriter->path); - return -1; - } - } while (skip_dot && git_path_is_dot_or_dotdot(de->d_name)); - - filename = de->d_name; - filename_len = strlen(filename); - -#ifdef GIT_USE_ICONV - if ((diriter->flags & GIT_PATH_DIR_PRECOMPOSE_UNICODE) != 0 && - (error = git_path_iconv(&diriter->ic, &filename, &filename_len)) < 0) - return error; -#endif - - git_buf_truncate(&diriter->path, diriter->parent_len); - git_buf_putc(&diriter->path, '/'); - git_buf_put(&diriter->path, filename, filename_len); - - if (git_buf_oom(&diriter->path)) - return -1; - - return error; -} - -int git_path_diriter_filename( - const char **out, - size_t *out_len, - git_path_diriter *diriter) -{ - assert(out && out_len && diriter); - - assert(diriter->path.size > diriter->parent_len); - - *out = &diriter->path.ptr[diriter->parent_len+1]; - *out_len = diriter->path.size - diriter->parent_len - 1; - return 0; -} - -int git_path_diriter_fullpath( - const char **out, - size_t *out_len, - git_path_diriter *diriter) -{ - assert(out && out_len && diriter); - - *out = diriter->path.ptr; - *out_len = diriter->path.size; - return 0; -} - -int git_path_diriter_stat(struct stat *out, git_path_diriter *diriter) -{ - assert(out && diriter); - - return git_path_lstat(diriter->path.ptr, out); -} - -void git_path_diriter_free(git_path_diriter *diriter) -{ - if (diriter == NULL) - return; - - if (diriter->dir) { - closedir(diriter->dir); - diriter->dir = NULL; - } - -#ifdef GIT_USE_ICONV - git_path_iconv_clear(&diriter->ic); -#endif - - git_buf_free(&diriter->path); -} - -#endif - -int git_path_dirload( - git_vector *contents, - const char *path, - size_t prefix_len, - unsigned int flags) -{ - git_path_diriter iter = GIT_PATH_DIRITER_INIT; - const char *name; - size_t name_len; - char *dup; - int error; - - assert(contents && path); - - if ((error = git_path_diriter_init(&iter, path, flags)) < 0) - return error; - - while ((error = git_path_diriter_next(&iter)) == 0) { - if ((error = git_path_diriter_fullpath(&name, &name_len, &iter)) < 0) - break; - - assert(name_len > prefix_len); - - dup = git__strndup(name + prefix_len, name_len - prefix_len); - GITERR_CHECK_ALLOC(dup); - - if ((error = git_vector_insert(contents, dup)) < 0) - break; - } - - if (error == GIT_ITEROVER) - error = 0; - - git_path_diriter_free(&iter); - return error; -} - -int git_path_from_url_or_path(git_buf *local_path_out, const char *url_or_path) -{ - if (git_path_is_local_file_url(url_or_path)) - return git_path_fromurl(local_path_out, url_or_path); - else - return git_buf_sets(local_path_out, url_or_path); -} - -/* Reject paths like AUX or COM1, or those versions that end in a dot or - * colon. ("AUX." or "AUX:") - */ -GIT_INLINE(bool) verify_dospath( - const char *component, - size_t len, - const char dospath[3], - bool trailing_num) -{ - size_t last = trailing_num ? 4 : 3; - - if (len < last || git__strncasecmp(component, dospath, 3) != 0) - return true; - - if (trailing_num && (component[3] < '1' || component[3] > '9')) - return true; - - return (len > last && - component[last] != '.' && - component[last] != ':'); -} - -static int32_t next_hfs_char(const char **in, size_t *len) -{ - while (*len) { - int32_t codepoint; - int cp_len = git__utf8_iterate((const uint8_t *)(*in), (int)(*len), &codepoint); - if (cp_len < 0) - return -1; - - (*in) += cp_len; - (*len) -= cp_len; - - /* these code points are ignored completely */ - switch (codepoint) { - case 0x200c: /* ZERO WIDTH NON-JOINER */ - case 0x200d: /* ZERO WIDTH JOINER */ - case 0x200e: /* LEFT-TO-RIGHT MARK */ - case 0x200f: /* RIGHT-TO-LEFT MARK */ - case 0x202a: /* LEFT-TO-RIGHT EMBEDDING */ - case 0x202b: /* RIGHT-TO-LEFT EMBEDDING */ - case 0x202c: /* POP DIRECTIONAL FORMATTING */ - case 0x202d: /* LEFT-TO-RIGHT OVERRIDE */ - case 0x202e: /* RIGHT-TO-LEFT OVERRIDE */ - case 0x206a: /* INHIBIT SYMMETRIC SWAPPING */ - case 0x206b: /* ACTIVATE SYMMETRIC SWAPPING */ - case 0x206c: /* INHIBIT ARABIC FORM SHAPING */ - case 0x206d: /* ACTIVATE ARABIC FORM SHAPING */ - case 0x206e: /* NATIONAL DIGIT SHAPES */ - case 0x206f: /* NOMINAL DIGIT SHAPES */ - case 0xfeff: /* ZERO WIDTH NO-BREAK SPACE */ - continue; - } - - /* fold into lowercase -- this will only fold characters in - * the ASCII range, which is perfectly fine, because the - * git folder name can only be composed of ascii characters - */ - return git__tolower(codepoint); - } - return 0; /* NULL byte -- end of string */ -} - -static bool verify_dotgit_hfs(const char *path, size_t len) -{ - if (next_hfs_char(&path, &len) != '.' || - next_hfs_char(&path, &len) != 'g' || - next_hfs_char(&path, &len) != 'i' || - next_hfs_char(&path, &len) != 't' || - next_hfs_char(&path, &len) != 0) - return true; - - return false; -} - -GIT_INLINE(bool) verify_dotgit_ntfs(git_repository *repo, const char *path, size_t len) -{ - git_buf *reserved = git_repository__reserved_names_win32; - size_t reserved_len = git_repository__reserved_names_win32_len; - size_t start = 0, i; - - if (repo) - git_repository__reserved_names(&reserved, &reserved_len, repo, true); - - for (i = 0; i < reserved_len; i++) { - git_buf *r = &reserved[i]; - - if (len >= r->size && - strncasecmp(path, r->ptr, r->size) == 0) { - start = r->size; - break; - } - } - - if (!start) - return true; - - /* Reject paths like ".git\" */ - if (path[start] == '\\') - return false; - - /* Reject paths like '.git ' or '.git.' */ - for (i = start; i < len; i++) { - if (path[i] != ' ' && path[i] != '.') - return true; - } - - return false; -} - -GIT_INLINE(bool) verify_char(unsigned char c, unsigned int flags) -{ - if ((flags & GIT_PATH_REJECT_BACKSLASH) && c == '\\') - return false; - - if ((flags & GIT_PATH_REJECT_SLASH) && c == '/') - return false; - - if (flags & GIT_PATH_REJECT_NT_CHARS) { - if (c < 32) - return false; - - switch (c) { - case '<': - case '>': - case ':': - case '"': - case '|': - case '?': - case '*': - return false; - } - } - - return true; -} - -/* - * We fundamentally don't like some paths when dealing with user-inputted - * strings (in checkout or ref names): we don't want dot or dot-dot - * anywhere, we want to avoid writing weird paths on Windows that can't - * be handled by tools that use the non-\\?\ APIs, we don't want slashes - * or double slashes at the end of paths that can make them ambiguous. - * - * For checkout, we don't want to recurse into ".git" either. - */ -static bool verify_component( - git_repository *repo, - const char *component, - size_t len, - unsigned int flags) -{ - if (len == 0) - return false; - - if ((flags & GIT_PATH_REJECT_TRAVERSAL) && - len == 1 && component[0] == '.') - return false; - - if ((flags & GIT_PATH_REJECT_TRAVERSAL) && - len == 2 && component[0] == '.' && component[1] == '.') - return false; - - if ((flags & GIT_PATH_REJECT_TRAILING_DOT) && component[len-1] == '.') - return false; - - if ((flags & GIT_PATH_REJECT_TRAILING_SPACE) && component[len-1] == ' ') - return false; - - if ((flags & GIT_PATH_REJECT_TRAILING_COLON) && component[len-1] == ':') - return false; - - if (flags & GIT_PATH_REJECT_DOS_PATHS) { - if (!verify_dospath(component, len, "CON", false) || - !verify_dospath(component, len, "PRN", false) || - !verify_dospath(component, len, "AUX", false) || - !verify_dospath(component, len, "NUL", false) || - !verify_dospath(component, len, "COM", true) || - !verify_dospath(component, len, "LPT", true)) - return false; - } - - if (flags & GIT_PATH_REJECT_DOT_GIT_HFS && - !verify_dotgit_hfs(component, len)) - return false; - - if (flags & GIT_PATH_REJECT_DOT_GIT_NTFS && - !verify_dotgit_ntfs(repo, component, len)) - return false; - - if ((flags & GIT_PATH_REJECT_DOT_GIT_HFS) == 0 && - (flags & GIT_PATH_REJECT_DOT_GIT_NTFS) == 0 && - (flags & GIT_PATH_REJECT_DOT_GIT) && - len == 4 && - component[0] == '.' && - (component[1] == 'g' || component[1] == 'G') && - (component[2] == 'i' || component[2] == 'I') && - (component[3] == 't' || component[3] == 'T')) - return false; - - return true; -} - -GIT_INLINE(unsigned int) dotgit_flags( - git_repository *repo, - unsigned int flags) -{ - int protectHFS = 0, protectNTFS = 0; - -#ifdef __APPLE__ - protectHFS = 1; -#endif - -#ifdef GIT_WIN32 - protectNTFS = 1; -#endif - - if (repo && !protectHFS) - git_repository__cvar(&protectHFS, repo, GIT_CVAR_PROTECTHFS); - if (protectHFS) - flags |= GIT_PATH_REJECT_DOT_GIT_HFS; - - if (repo && !protectNTFS) - git_repository__cvar(&protectNTFS, repo, GIT_CVAR_PROTECTNTFS); - if (protectNTFS) - flags |= GIT_PATH_REJECT_DOT_GIT_NTFS; - - return flags; -} - -bool git_path_isvalid( - git_repository *repo, - const char *path, - unsigned int flags) -{ - const char *start, *c; - - /* Upgrade the ".git" checks based on platform */ - if ((flags & GIT_PATH_REJECT_DOT_GIT)) - flags = dotgit_flags(repo, flags); - - for (start = c = path; *c; c++) { - if (!verify_char(*c, flags)) - return false; - - if (*c == '/') { - if (!verify_component(repo, start, (c - start), flags)) - return false; - - start = c+1; - } - } - - return verify_component(repo, start, (c - start), flags); -} diff --git a/vendor/libgit2/src/path.h b/vendor/libgit2/src/path.h deleted file mode 100644 index e6be06faad..0000000000 --- a/vendor/libgit2/src/path.h +++ /dev/null @@ -1,594 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_path_h__ -#define INCLUDE_path_h__ - -#include "common.h" -#include "posix.h" -#include "buffer.h" -#include "vector.h" - -/** - * Path manipulation utils - * - * These are path utilities that munge paths without actually - * looking at the real filesystem. - */ - -/* - * The dirname() function shall take a pointer to a character string - * that contains a pathname, and return a pointer to a string that is a - * pathname of the parent directory of that file. Trailing '/' characters - * in the path are not counted as part of the path. - * - * If path does not contain a '/', then dirname() shall return a pointer to - * the string ".". If path is a null pointer or points to an empty string, - * dirname() shall return a pointer to the string "." . - * - * The `git_path_dirname` implementation is thread safe. The returned - * string must be manually free'd. - * - * The `git_path_dirname_r` implementation writes the dirname to a `git_buf` - * if the buffer pointer is not NULL. - * It returns an error code < 0 if there is an allocation error, otherwise - * the length of the dirname (which will be > 0). - */ -extern char *git_path_dirname(const char *path); -extern int git_path_dirname_r(git_buf *buffer, const char *path); - -/* - * This function returns the basename of the file, which is the last - * part of its full name given by fname, with the drive letter and - * leading directories stripped off. For example, the basename of - * c:/foo/bar/file.ext is file.ext, and the basename of a:foo is foo. - * - * Trailing slashes and backslashes are significant: the basename of - * c:/foo/bar/ is an empty string after the rightmost slash. - * - * The `git_path_basename` implementation is thread safe. The returned - * string must be manually free'd. - * - * The `git_path_basename_r` implementation writes the basename to a `git_buf`. - * It returns an error code < 0 if there is an allocation error, otherwise - * the length of the basename (which will be >= 0). - */ -extern char *git_path_basename(const char *path); -extern int git_path_basename_r(git_buf *buffer, const char *path); - -/* Return the offset of the start of the basename. Unlike the other - * basename functions, this returns 0 if the path is empty. - */ -extern size_t git_path_basename_offset(git_buf *buffer); - -extern const char *git_path_topdir(const char *path); - -/** - * Find offset to root of path if path has one. - * - * This will return a number >= 0 which is the offset to the start of the - * path, if the path is rooted (i.e. "/rooted/path" returns 0 and - * "c:/windows/rooted/path" returns 2). If the path is not rooted, this - * returns < 0. - */ -extern int git_path_root(const char *path); - -/** - * Ensure path has a trailing '/'. - */ -extern int git_path_to_dir(git_buf *path); - -/** - * Ensure string has a trailing '/' if there is space for it. - */ -extern void git_path_string_to_dir(char* path, size_t size); - -/** - * Taken from git.git; returns nonzero if the given path is "." or "..". - */ -GIT_INLINE(int) git_path_is_dot_or_dotdot(const char *name) -{ - return (name[0] == '.' && - (name[1] == '\0' || - (name[1] == '.' && name[2] == '\0'))); -} - -#ifdef GIT_WIN32 -GIT_INLINE(int) git_path_is_dot_or_dotdotW(const wchar_t *name) -{ - return (name[0] == L'.' && - (name[1] == L'\0' || - (name[1] == L'.' && name[2] == L'\0'))); -} - -/** - * Convert backslashes in path to forward slashes. - */ -GIT_INLINE(void) git_path_mkposix(char *path) -{ - while (*path) { - if (*path == '\\') - *path = '/'; - - path++; - } -} -#else -# define git_path_mkposix(p) /* blank */ -#endif - -/** - * Check if string is a relative path (i.e. starts with "./" or "../") - */ -GIT_INLINE(int) git_path_is_relative(const char *p) -{ - return (p[0] == '.' && (p[1] == '/' || (p[1] == '.' && p[2] == '/'))); -} - -/** - * Check if string is at end of path segment (i.e. looking at '/' or '\0') - */ -GIT_INLINE(int) git_path_at_end_of_segment(const char *p) -{ - return !*p || *p == '/'; -} - -extern int git__percent_decode(git_buf *decoded_out, const char *input); - -/** - * Extract path from file:// URL. - */ -extern int git_path_fromurl(git_buf *local_path_out, const char *file_url); - - -/** - * Path filesystem utils - * - * These are path utilities that actually access the filesystem. - */ - -/** - * Check if a file exists and can be accessed. - * @return true or false - */ -extern bool git_path_exists(const char *path); - -/** - * Check if the given path points to a directory. - * @return true or false - */ -extern bool git_path_isdir(const char *path); - -/** - * Check if the given path points to a regular file. - * @return true or false - */ -extern bool git_path_isfile(const char *path); - -/** - * Check if the given path is a directory, and is empty. - */ -extern bool git_path_is_empty_dir(const char *path); - -/** - * Stat a file and/or link and set error if needed. - */ -extern int git_path_lstat(const char *path, struct stat *st); - -/** - * Check if the parent directory contains the item. - * - * @param dir Directory to check. - * @param item Item that might be in the directory. - * @return 0 if item exists in directory, <0 otherwise. - */ -extern bool git_path_contains(git_buf *dir, const char *item); - -/** - * Check if the given path contains the given subdirectory. - * - * @param parent Directory path that might contain subdir - * @param subdir Subdirectory name to look for in parent - * @return true if subdirectory exists, false otherwise. - */ -extern bool git_path_contains_dir(git_buf *parent, const char *subdir); - -/** - * Make the path relative to the given parent path. - * - * @param path The path to make relative - * @param parent The parent path to make path relative to - * @return 0 if path was made relative, GIT_ENOTFOUND - * if there was not common root between the paths, - * or <0. - */ -extern int git_path_make_relative(git_buf *path, const char *parent); - -/** - * Check if the given path contains the given file. - * - * @param dir Directory path that might contain file - * @param file File name to look for in parent - * @return true if file exists, false otherwise. - */ -extern bool git_path_contains_file(git_buf *dir, const char *file); - -/** - * Prepend base to unrooted path or just copy path over. - * - * This will optionally return the index into the path where the "root" - * is, either the end of the base directory prefix or the path root. - */ -extern int git_path_join_unrooted( - git_buf *path_out, const char *path, const char *base, ssize_t *root_at); - -/** - * Clean up path, prepending base if it is not already rooted. - */ -extern int git_path_prettify(git_buf *path_out, const char *path, const char *base); - -/** - * Clean up path, prepending base if it is not already rooted and - * appending a slash. - */ -extern int git_path_prettify_dir(git_buf *path_out, const char *path, const char *base); - -/** - * Get a directory from a path. - * - * If path is a directory, this acts like `git_path_prettify_dir` - * (cleaning up path and appending a '/'). If path is a normal file, - * this prettifies it, then removed the filename a la dirname and - * appends the trailing '/'. If the path does not exist, it is - * treated like a regular filename. - */ -extern int git_path_find_dir(git_buf *dir, const char *path, const char *base); - -/** - * Resolve relative references within a path. - * - * This eliminates "./" and "../" relative references inside a path, - * as well as condensing multiple slashes into single ones. It will - * not touch the path before the "ceiling" length. - * - * Additionally, this will recognize an "c:/" drive prefix or a "xyz://" URL - * prefix and not touch that part of the path. - */ -extern int git_path_resolve_relative(git_buf *path, size_t ceiling); - -/** - * Apply a relative path to base path. - * - * Note that the base path could be a filename or a URL and this - * should still work. The relative path is walked segment by segment - * with three rules: series of slashes will be condensed to a single - * slash, "." will be eaten with no change, and ".." will remove a - * segment from the base path. - */ -extern int git_path_apply_relative(git_buf *target, const char *relpath); - -enum { - GIT_PATH_DIR_IGNORE_CASE = (1u << 0), - GIT_PATH_DIR_PRECOMPOSE_UNICODE = (1u << 1), - GIT_PATH_DIR_INCLUDE_DOT_AND_DOTDOT = (1u << 2), -}; - -/** - * Walk each directory entry, except '.' and '..', calling fn(state). - * - * @param pathbuf Buffer the function reads the initial directory - * path from, and updates with each successive entry's name. - * @param flags Combination of GIT_PATH_DIR flags. - * @param callback Callback for each entry. Passed the `payload` and each - * successive path inside the directory as a full path. This may - * safely append text to the pathbuf if needed. Return non-zero to - * cancel iteration (and return value will be propagated back). - * @param payload Passed to callback as first argument. - * @return 0 on success or error code from OS error or from callback - */ -extern int git_path_direach( - git_buf *pathbuf, - uint32_t flags, - int (*callback)(void *payload, git_buf *path), - void *payload); - -/** - * Sort function to order two paths - */ -extern int git_path_cmp( - const char *name1, size_t len1, int isdir1, - const char *name2, size_t len2, int isdir2, - int (*compare)(const char *, const char *, size_t)); - -/** - * Invoke callback up path directory by directory until the ceiling is - * reached (inclusive of a final call at the root_path). - * - * Returning anything other than 0 from the callback function - * will stop the iteration and propagate the error to the caller. - * - * @param pathbuf Buffer the function reads the directory from and - * and updates with each successive name. - * @param ceiling Prefix of path at which to stop walking up. If NULL, - * this will walk all the way up to the root. If not a prefix of - * pathbuf, the callback will be invoked a single time on the - * original input path. - * @param callback Function to invoke on each path. Passed the `payload` - * and the buffer containing the current path. The path should not - * be modified in any way. Return non-zero to stop iteration. - * @param payload Passed to fn as the first ath. - */ -extern int git_path_walk_up( - git_buf *pathbuf, - const char *ceiling, - int (*callback)(void *payload, const char *path), - void *payload); - - -enum { GIT_PATH_NOTEQUAL = 0, GIT_PATH_EQUAL = 1, GIT_PATH_PREFIX = 2 }; - -/* - * Determines if a path is equal to or potentially a child of another. - * @param parent The possible parent - * @param child The possible child - */ -GIT_INLINE(int) git_path_equal_or_prefixed( - const char *parent, - const char *child, - ssize_t *prefixlen) -{ - const char *p = parent, *c = child; - int lastslash = 0; - - while (*p && *c) { - lastslash = (*p == '/'); - - if (*p++ != *c++) - return GIT_PATH_NOTEQUAL; - } - - if (*p != '\0') - return GIT_PATH_NOTEQUAL; - - if (*c == '\0') { - if (prefixlen) - *prefixlen = p - parent; - - return GIT_PATH_EQUAL; - } - - if (*c == '/' || lastslash) { - if (prefixlen) - *prefixlen = (p - parent) - lastslash; - - return GIT_PATH_PREFIX; - } - - return GIT_PATH_NOTEQUAL; -} - -/* translate errno to libgit2 error code and set error message */ -extern int git_path_set_error( - int errno_value, const char *path, const char *action); - -/* check if non-ascii characters are present in filename */ -extern bool git_path_has_non_ascii(const char *path, size_t pathlen); - -#define GIT_PATH_REPO_ENCODING "UTF-8" - -#ifdef __APPLE__ -#define GIT_PATH_NATIVE_ENCODING "UTF-8-MAC" -#else -#define GIT_PATH_NATIVE_ENCODING "UTF-8" -#endif - -#ifdef GIT_USE_ICONV - -#include - -typedef struct { - iconv_t map; - git_buf buf; -} git_path_iconv_t; - -#define GIT_PATH_ICONV_INIT { (iconv_t)-1, GIT_BUF_INIT } - -/* Init iconv data for converting decomposed UTF-8 to precomposed */ -extern int git_path_iconv_init_precompose(git_path_iconv_t *ic); - -/* Clear allocated iconv data */ -extern void git_path_iconv_clear(git_path_iconv_t *ic); - -/* - * Rewrite `in` buffer using iconv map if necessary, replacing `in` - * pointer internal iconv buffer if rewrite happened. The `in` pointer - * will be left unchanged if no rewrite was needed. - */ -extern int git_path_iconv(git_path_iconv_t *ic, const char **in, size_t *inlen); - -#endif /* GIT_USE_ICONV */ - -extern bool git_path_does_fs_decompose_unicode(const char *root); - - -typedef struct git_path_diriter git_path_diriter; - -#if defined(GIT_WIN32) && !defined(__MINGW32__) - -struct git_path_diriter -{ - git_win32_path path; - size_t parent_len; - - git_buf path_utf8; - size_t parent_utf8_len; - - HANDLE handle; - - unsigned int flags; - - WIN32_FIND_DATAW current; - unsigned int needs_next; -}; - -#define GIT_PATH_DIRITER_INIT { {0}, 0, GIT_BUF_INIT, 0, INVALID_HANDLE_VALUE } - -#else - -struct git_path_diriter -{ - git_buf path; - size_t parent_len; - - unsigned int flags; - - DIR *dir; - -#ifdef GIT_USE_ICONV - git_path_iconv_t ic; -#endif -}; - -#define GIT_PATH_DIRITER_INIT { GIT_BUF_INIT } - -#endif - -/** - * Initialize a directory iterator. - * - * @param diriter Pointer to a diriter structure that will be setup. - * @param path The path that will be iterated over - * @param flags Directory reader flags - * @return 0 or an error code - */ -extern int git_path_diriter_init( - git_path_diriter *diriter, - const char *path, - unsigned int flags); - -/** - * Advance the directory iterator. Will return GIT_ITEROVER when - * the iteration has completed successfully. - * - * @param diriter The directory iterator - * @return 0, GIT_ITEROVER, or an error code - */ -extern int git_path_diriter_next(git_path_diriter *diriter); - -/** - * Returns the file name of the current item in the iterator. - * - * @param out Pointer to store the path in - * @param out_len Pointer to store the length of the path in - * @param diriter The directory iterator - * @return 0 or an error code - */ -extern int git_path_diriter_filename( - const char **out, - size_t *out_len, - git_path_diriter *diriter); - -/** - * Returns the full path of the current item in the iterator; that - * is the current filename plus the path of the directory that the - * iterator was constructed with. - * - * @param out Pointer to store the path in - * @param out_len Pointer to store the length of the path in - * @param diriter The directory iterator - * @return 0 or an error code - */ -extern int git_path_diriter_fullpath( - const char **out, - size_t *out_len, - git_path_diriter *diriter); - -/** - * Performs an `lstat` on the current item in the iterator. - * - * @param out Pointer to store the stat data in - * @param diriter The directory iterator - * @return 0 or an error code - */ -extern int git_path_diriter_stat(struct stat *out, git_path_diriter *diriter); - -/** - * Closes the directory iterator. - * - * @param diriter The directory iterator - */ -extern void git_path_diriter_free(git_path_diriter *diriter); - -/** - * Load all directory entries (except '.' and '..') into a vector. - * - * For cases where `git_path_direach()` is not appropriate, this - * allows you to load the filenames in a directory into a vector - * of strings. That vector can then be sorted, iterated, or whatever. - * Remember to free alloc of the allocated strings when you are done. - * - * @param contents Vector to fill with directory entry names. - * @param path The directory to read from. - * @param prefix_len When inserting entries, the trailing part of path - * will be prefixed after this length. I.e. given path "/a/b" and - * prefix_len 3, the entries will look like "b/e1", "b/e2", etc. - * @param flags Combination of GIT_PATH_DIR flags. - */ -extern int git_path_dirload( - git_vector *contents, - const char *path, - size_t prefix_len, - uint32_t flags); - - -/* Used for paths to repositories on the filesystem */ -extern bool git_path_is_local_file_url(const char *file_url); -extern int git_path_from_url_or_path(git_buf *local_path_out, const char *url_or_path); - -/* Flags to determine path validity in `git_path_isvalid` */ -#define GIT_PATH_REJECT_TRAVERSAL (1 << 0) -#define GIT_PATH_REJECT_DOT_GIT (1 << 1) -#define GIT_PATH_REJECT_SLASH (1 << 2) -#define GIT_PATH_REJECT_BACKSLASH (1 << 3) -#define GIT_PATH_REJECT_TRAILING_DOT (1 << 4) -#define GIT_PATH_REJECT_TRAILING_SPACE (1 << 5) -#define GIT_PATH_REJECT_TRAILING_COLON (1 << 6) -#define GIT_PATH_REJECT_DOS_PATHS (1 << 7) -#define GIT_PATH_REJECT_NT_CHARS (1 << 8) -#define GIT_PATH_REJECT_DOT_GIT_HFS (1 << 9) -#define GIT_PATH_REJECT_DOT_GIT_NTFS (1 << 10) - -/* Default path safety for writing files to disk: since we use the - * Win32 "File Namespace" APIs ("\\?\") we need to protect from - * paths that the normal Win32 APIs would not write. - */ -#ifdef GIT_WIN32 -# define GIT_PATH_REJECT_DEFAULTS \ - GIT_PATH_REJECT_TRAVERSAL | \ - GIT_PATH_REJECT_BACKSLASH | \ - GIT_PATH_REJECT_TRAILING_DOT | \ - GIT_PATH_REJECT_TRAILING_SPACE | \ - GIT_PATH_REJECT_TRAILING_COLON | \ - GIT_PATH_REJECT_DOS_PATHS | \ - GIT_PATH_REJECT_NT_CHARS -#else -# define GIT_PATH_REJECT_DEFAULTS GIT_PATH_REJECT_TRAVERSAL -#endif - -/* - * Determine whether a path is a valid git path or not - this must not contain - * a '.' or '..' component, or a component that is ".git" (in any case). - * - * `repo` is optional. If specified, it will be used to determine the short - * path name to reject (if `GIT_PATH_REJECT_DOS_SHORTNAME` is specified), - * in addition to the default of "git~1". - */ -extern bool git_path_isvalid( - git_repository *repo, - const char *path, - unsigned int flags); - -#endif diff --git a/vendor/libgit2/src/pathspec.c b/vendor/libgit2/src/pathspec.c deleted file mode 100644 index fab6f9a76a..0000000000 --- a/vendor/libgit2/src/pathspec.c +++ /dev/null @@ -1,725 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#include "git2/pathspec.h" -#include "git2/diff.h" -#include "pathspec.h" -#include "buf_text.h" -#include "attr_file.h" -#include "iterator.h" -#include "repository.h" -#include "index.h" -#include "bitvec.h" -#include "diff.h" - -/* what is the common non-wildcard prefix for all items in the pathspec */ -char *git_pathspec_prefix(const git_strarray *pathspec) -{ - git_buf prefix = GIT_BUF_INIT; - const char *scan; - - if (!pathspec || !pathspec->count || - git_buf_text_common_prefix(&prefix, pathspec) < 0) - return NULL; - - /* diff prefix will only be leading non-wildcards */ - for (scan = prefix.ptr; *scan; ++scan) { - if (git__iswildcard(*scan) && - (scan == prefix.ptr || (*(scan - 1) != '\\'))) - break; - } - git_buf_truncate(&prefix, scan - prefix.ptr); - - if (prefix.size <= 0) { - git_buf_free(&prefix); - return NULL; - } - - git_buf_text_unescape(&prefix); - - return git_buf_detach(&prefix); -} - -/* is there anything in the spec that needs to be filtered on */ -bool git_pathspec_is_empty(const git_strarray *pathspec) -{ - size_t i; - - if (pathspec == NULL) - return true; - - for (i = 0; i < pathspec->count; ++i) { - const char *str = pathspec->strings[i]; - - if (str && str[0]) - return false; - } - - return true; -} - -/* build a vector of fnmatch patterns to evaluate efficiently */ -int git_pathspec__vinit( - git_vector *vspec, const git_strarray *strspec, git_pool *strpool) -{ - size_t i; - - memset(vspec, 0, sizeof(*vspec)); - - if (git_pathspec_is_empty(strspec)) - return 0; - - if (git_vector_init(vspec, strspec->count, NULL) < 0) - return -1; - - for (i = 0; i < strspec->count; ++i) { - int ret; - const char *pattern = strspec->strings[i]; - git_attr_fnmatch *match = git__calloc(1, sizeof(git_attr_fnmatch)); - if (!match) - return -1; - - match->flags = GIT_ATTR_FNMATCH_ALLOWSPACE | - GIT_ATTR_FNMATCH_ALLOWNEG | GIT_ATTR_FNMATCH_NOLEADINGDIR; - - ret = git_attr_fnmatch__parse(match, strpool, NULL, &pattern); - if (ret == GIT_ENOTFOUND) { - git__free(match); - continue; - } else if (ret < 0) { - git__free(match); - return ret; - } - - if (git_vector_insert(vspec, match) < 0) - return -1; - } - - return 0; -} - -/* free data from the pathspec vector */ -void git_pathspec__vfree(git_vector *vspec) -{ - git_vector_free_deep(vspec); -} - -struct pathspec_match_context { - int fnmatch_flags; - int (*strcomp)(const char *, const char *); - int (*strncomp)(const char *, const char *, size_t); -}; - -static void pathspec_match_context_init( - struct pathspec_match_context *ctxt, - bool disable_fnmatch, - bool casefold) -{ - if (disable_fnmatch) - ctxt->fnmatch_flags = -1; - else if (casefold) - ctxt->fnmatch_flags = FNM_CASEFOLD; - else - ctxt->fnmatch_flags = 0; - - if (casefold) { - ctxt->strcomp = git__strcasecmp; - ctxt->strncomp = git__strncasecmp; - } else { - ctxt->strcomp = git__strcmp; - ctxt->strncomp = git__strncmp; - } -} - -static int pathspec_match_one( - const git_attr_fnmatch *match, - struct pathspec_match_context *ctxt, - const char *path) -{ - int result = (match->flags & GIT_ATTR_FNMATCH_MATCH_ALL) ? 0 : FNM_NOMATCH; - - if (result == FNM_NOMATCH) - result = ctxt->strcomp(match->pattern, path) ? FNM_NOMATCH : 0; - - if (ctxt->fnmatch_flags >= 0 && result == FNM_NOMATCH) - result = p_fnmatch(match->pattern, path, ctxt->fnmatch_flags); - - /* if we didn't match, look for exact dirname prefix match */ - if (result == FNM_NOMATCH && - (match->flags & GIT_ATTR_FNMATCH_HASWILD) == 0 && - ctxt->strncomp(path, match->pattern, match->length) == 0 && - path[match->length] == '/') - result = 0; - - /* if we didn't match and this is a negative match, check for exact - * match of filename with leading '!' - */ - if (result == FNM_NOMATCH && - (match->flags & GIT_ATTR_FNMATCH_NEGATIVE) != 0 && - *path == '!' && - ctxt->strncomp(path + 1, match->pattern, match->length) == 0 && - (!path[match->length + 1] || path[match->length + 1] == '/')) - return 1; - - if (result == 0) - return (match->flags & GIT_ATTR_FNMATCH_NEGATIVE) ? 0 : 1; - return -1; -} - -static int git_pathspec__match_at( - size_t *matched_at, - const git_vector *vspec, - struct pathspec_match_context *ctxt, - const char *path0, - const char *path1) -{ - int result = GIT_ENOTFOUND; - size_t i = 0; - const git_attr_fnmatch *match; - - git_vector_foreach(vspec, i, match) { - if (path0 && (result = pathspec_match_one(match, ctxt, path0)) >= 0) - break; - if (path1 && (result = pathspec_match_one(match, ctxt, path1)) >= 0) - break; - } - - *matched_at = i; - return result; -} - -/* match a path against the vectorized pathspec */ -bool git_pathspec__match( - const git_vector *vspec, - const char *path, - bool disable_fnmatch, - bool casefold, - const char **matched_pathspec, - size_t *matched_at) -{ - int result; - size_t pos; - struct pathspec_match_context ctxt; - - if (matched_pathspec) - *matched_pathspec = NULL; - if (matched_at) - *matched_at = GIT_PATHSPEC_NOMATCH; - - if (!vspec || !vspec->length) - return true; - - pathspec_match_context_init(&ctxt, disable_fnmatch, casefold); - - result = git_pathspec__match_at(&pos, vspec, &ctxt, path, NULL); - if (result >= 0) { - if (matched_pathspec) { - const git_attr_fnmatch *match = git_vector_get(vspec, pos); - *matched_pathspec = match->pattern; - } - - if (matched_at) - *matched_at = pos; - } - - return (result > 0); -} - - -int git_pathspec__init(git_pathspec *ps, const git_strarray *paths) -{ - int error = 0; - - memset(ps, 0, sizeof(*ps)); - - ps->prefix = git_pathspec_prefix(paths); - - if ((error = git_pool_init(&ps->pool, 1, 0)) < 0 || - (error = git_pathspec__vinit(&ps->pathspec, paths, &ps->pool)) < 0) - git_pathspec__clear(ps); - - return error; -} - -void git_pathspec__clear(git_pathspec *ps) -{ - git__free(ps->prefix); - git_pathspec__vfree(&ps->pathspec); - git_pool_clear(&ps->pool); - memset(ps, 0, sizeof(*ps)); -} - -int git_pathspec_new(git_pathspec **out, const git_strarray *pathspec) -{ - int error = 0; - git_pathspec *ps = git__malloc(sizeof(git_pathspec)); - GITERR_CHECK_ALLOC(ps); - - if ((error = git_pathspec__init(ps, pathspec)) < 0) { - git__free(ps); - return error; - } - - GIT_REFCOUNT_INC(ps); - *out = ps; - return 0; -} - -static void pathspec_free(git_pathspec *ps) -{ - git_pathspec__clear(ps); - git__free(ps); -} - -void git_pathspec_free(git_pathspec *ps) -{ - if (!ps) - return; - GIT_REFCOUNT_DEC(ps, pathspec_free); -} - -int git_pathspec_matches_path( - const git_pathspec *ps, uint32_t flags, const char *path) -{ - bool no_fnmatch = (flags & GIT_PATHSPEC_NO_GLOB) != 0; - bool casefold = (flags & GIT_PATHSPEC_IGNORE_CASE) != 0; - - assert(ps && path); - - return (0 != git_pathspec__match( - &ps->pathspec, path, no_fnmatch, casefold, NULL, NULL)); -} - -static void pathspec_match_free(git_pathspec_match_list *m) -{ - if (!m) - return; - - git_pathspec_free(m->pathspec); - m->pathspec = NULL; - - git_array_clear(m->matches); - git_array_clear(m->failures); - git_pool_clear(&m->pool); - git__free(m); -} - -static git_pathspec_match_list *pathspec_match_alloc( - git_pathspec *ps, int datatype) -{ - git_pathspec_match_list *m = git__calloc(1, sizeof(git_pathspec_match_list)); - - if (m != NULL && git_pool_init(&m->pool, 1, 0) < 0) { - pathspec_match_free(m); - m = NULL; - } - - if (!m) - return NULL; - - /* need to keep reference to pathspec and increment refcount because - * failures array stores pointers to the pattern strings of the - * pathspec that had no matches - */ - GIT_REFCOUNT_INC(ps); - m->pathspec = ps; - m->datatype = datatype; - - return m; -} - -GIT_INLINE(size_t) pathspec_mark_pattern(git_bitvec *used, size_t pos) -{ - if (!git_bitvec_get(used, pos)) { - git_bitvec_set(used, pos, true); - return 1; - } - - return 0; -} - -static size_t pathspec_mark_remaining( - git_bitvec *used, - git_vector *patterns, - struct pathspec_match_context *ctxt, - size_t start, - const char *path0, - const char *path1) -{ - size_t count = 0; - - if (path1 == path0) - path1 = NULL; - - for (; start < patterns->length; ++start) { - const git_attr_fnmatch *pat = git_vector_get(patterns, start); - - if (git_bitvec_get(used, start)) - continue; - - if (path0 && pathspec_match_one(pat, ctxt, path0) > 0) - count += pathspec_mark_pattern(used, start); - else if (path1 && pathspec_match_one(pat, ctxt, path1) > 0) - count += pathspec_mark_pattern(used, start); - } - - return count; -} - -static int pathspec_build_failure_array( - git_pathspec_string_array_t *failures, - git_vector *patterns, - git_bitvec *used, - git_pool *pool) -{ - size_t pos; - char **failed; - const git_attr_fnmatch *pat; - - for (pos = 0; pos < patterns->length; ++pos) { - if (git_bitvec_get(used, pos)) - continue; - - if ((failed = git_array_alloc(*failures)) == NULL) - return -1; - - pat = git_vector_get(patterns, pos); - - if ((*failed = git_pool_strdup(pool, pat->pattern)) == NULL) - return -1; - } - - return 0; -} - -static int pathspec_match_from_iterator( - git_pathspec_match_list **out, - git_iterator *iter, - uint32_t flags, - git_pathspec *ps) -{ - int error = 0; - git_pathspec_match_list *m = NULL; - const git_index_entry *entry = NULL; - struct pathspec_match_context ctxt; - git_vector *patterns = &ps->pathspec; - bool find_failures = out && (flags & GIT_PATHSPEC_FIND_FAILURES) != 0; - bool failures_only = !out || (flags & GIT_PATHSPEC_FAILURES_ONLY) != 0; - size_t pos, used_ct = 0, found_files = 0; - git_index *index = NULL; - git_bitvec used_patterns; - char **file; - - if (git_bitvec_init(&used_patterns, patterns->length) < 0) - return -1; - - if (out) { - *out = m = pathspec_match_alloc(ps, PATHSPEC_DATATYPE_STRINGS); - GITERR_CHECK_ALLOC(m); - } - - if ((error = git_iterator_reset(iter, ps->prefix, ps->prefix)) < 0) - goto done; - - if (git_iterator_type(iter) == GIT_ITERATOR_TYPE_WORKDIR && - (error = git_repository_index__weakptr( - &index, git_iterator_owner(iter))) < 0) - goto done; - - pathspec_match_context_init( - &ctxt, (flags & GIT_PATHSPEC_NO_GLOB) != 0, - git_iterator_ignore_case(iter)); - - while (!(error = git_iterator_advance(&entry, iter))) { - /* search for match with entry->path */ - int result = git_pathspec__match_at( - &pos, patterns, &ctxt, entry->path, NULL); - - /* no matches for this path */ - if (result < 0) - continue; - - /* if result was a negative pattern match, then don't list file */ - if (!result) { - used_ct += pathspec_mark_pattern(&used_patterns, pos); - continue; - } - - /* check if path is ignored and untracked */ - if (index != NULL && - git_iterator_current_is_ignored(iter) && - git_index__find_pos(NULL, index, entry->path, 0, GIT_INDEX_STAGE_ANY) < 0) - continue; - - /* mark the matched pattern as used */ - used_ct += pathspec_mark_pattern(&used_patterns, pos); - ++found_files; - - /* if find_failures is on, check if any later patterns also match */ - if (find_failures && used_ct < patterns->length) - used_ct += pathspec_mark_remaining( - &used_patterns, patterns, &ctxt, pos + 1, entry->path, NULL); - - /* if only looking at failures, exit early or just continue */ - if (failures_only || !out) { - if (used_ct == patterns->length) - break; - continue; - } - - /* insert matched path into matches array */ - if ((file = (char **)git_array_alloc(m->matches)) == NULL || - (*file = git_pool_strdup(&m->pool, entry->path)) == NULL) { - error = -1; - goto done; - } - } - - if (error < 0 && error != GIT_ITEROVER) - goto done; - error = 0; - - /* insert patterns that had no matches into failures array */ - if (find_failures && used_ct < patterns->length && - (error = pathspec_build_failure_array( - &m->failures, patterns, &used_patterns, &m->pool)) < 0) - goto done; - - /* if every pattern failed to match, then we have failed */ - if ((flags & GIT_PATHSPEC_NO_MATCH_ERROR) != 0 && !found_files) { - giterr_set(GITERR_INVALID, "No matching files were found"); - error = GIT_ENOTFOUND; - } - -done: - git_bitvec_free(&used_patterns); - - if (error < 0) { - pathspec_match_free(m); - if (out) *out = NULL; - } - - return error; -} - -static git_iterator_flag_t pathspec_match_iter_flags(uint32_t flags) -{ - git_iterator_flag_t f = 0; - - if ((flags & GIT_PATHSPEC_IGNORE_CASE) != 0) - f |= GIT_ITERATOR_IGNORE_CASE; - else if ((flags & GIT_PATHSPEC_USE_CASE) != 0) - f |= GIT_ITERATOR_DONT_IGNORE_CASE; - - return f; -} - -int git_pathspec_match_workdir( - git_pathspec_match_list **out, - git_repository *repo, - uint32_t flags, - git_pathspec *ps) -{ - int error = 0; - git_iterator *iter; - - assert(repo); - - if (!(error = git_iterator_for_workdir( - &iter, repo, NULL, NULL, pathspec_match_iter_flags(flags), NULL, NULL))) { - - error = pathspec_match_from_iterator(out, iter, flags, ps); - - git_iterator_free(iter); - } - - return error; -} - -int git_pathspec_match_index( - git_pathspec_match_list **out, - git_index *index, - uint32_t flags, - git_pathspec *ps) -{ - int error = 0; - git_iterator *iter; - - assert(index); - - if (!(error = git_iterator_for_index( - &iter, index, pathspec_match_iter_flags(flags), NULL, NULL))) { - - error = pathspec_match_from_iterator(out, iter, flags, ps); - - git_iterator_free(iter); - } - - return error; -} - -int git_pathspec_match_tree( - git_pathspec_match_list **out, - git_tree *tree, - uint32_t flags, - git_pathspec *ps) -{ - int error = 0; - git_iterator *iter; - - assert(tree); - - if (!(error = git_iterator_for_tree( - &iter, tree, pathspec_match_iter_flags(flags), NULL, NULL))) { - - error = pathspec_match_from_iterator(out, iter, flags, ps); - - git_iterator_free(iter); - } - - return error; -} - -int git_pathspec_match_diff( - git_pathspec_match_list **out, - git_diff *diff, - uint32_t flags, - git_pathspec *ps) -{ - int error = 0; - git_pathspec_match_list *m = NULL; - struct pathspec_match_context ctxt; - git_vector *patterns = &ps->pathspec; - bool find_failures = out && (flags & GIT_PATHSPEC_FIND_FAILURES) != 0; - bool failures_only = !out || (flags & GIT_PATHSPEC_FAILURES_ONLY) != 0; - size_t i, pos, used_ct = 0, found_deltas = 0; - const git_diff_delta *delta, **match; - git_bitvec used_patterns; - - assert(diff); - - if (git_bitvec_init(&used_patterns, patterns->length) < 0) - return -1; - - if (out) { - *out = m = pathspec_match_alloc(ps, PATHSPEC_DATATYPE_DIFF); - GITERR_CHECK_ALLOC(m); - } - - pathspec_match_context_init( - &ctxt, (flags & GIT_PATHSPEC_NO_GLOB) != 0, - git_diff_is_sorted_icase(diff)); - - git_vector_foreach(&diff->deltas, i, delta) { - /* search for match with delta */ - int result = git_pathspec__match_at( - &pos, patterns, &ctxt, delta->old_file.path, delta->new_file.path); - - /* no matches for this path */ - if (result < 0) - continue; - - /* mark the matched pattern as used */ - used_ct += pathspec_mark_pattern(&used_patterns, pos); - - /* if result was a negative pattern match, then don't list file */ - if (!result) - continue; - - ++found_deltas; - - /* if find_failures is on, check if any later patterns also match */ - if (find_failures && used_ct < patterns->length) - used_ct += pathspec_mark_remaining( - &used_patterns, patterns, &ctxt, pos + 1, - delta->old_file.path, delta->new_file.path); - - /* if only looking at failures, exit early or just continue */ - if (failures_only || !out) { - if (used_ct == patterns->length) - break; - continue; - } - - /* insert matched delta into matches array */ - if (!(match = (const git_diff_delta **)git_array_alloc(m->matches))) { - error = -1; - goto done; - } else { - *match = delta; - } - } - - /* insert patterns that had no matches into failures array */ - if (find_failures && used_ct < patterns->length && - (error = pathspec_build_failure_array( - &m->failures, patterns, &used_patterns, &m->pool)) < 0) - goto done; - - /* if every pattern failed to match, then we have failed */ - if ((flags & GIT_PATHSPEC_NO_MATCH_ERROR) != 0 && !found_deltas) { - giterr_set(GITERR_INVALID, "No matching deltas were found"); - error = GIT_ENOTFOUND; - } - -done: - git_bitvec_free(&used_patterns); - - if (error < 0) { - pathspec_match_free(m); - if (out) *out = NULL; - } - - return error; -} - -void git_pathspec_match_list_free(git_pathspec_match_list *m) -{ - if (m) - pathspec_match_free(m); -} - -size_t git_pathspec_match_list_entrycount( - const git_pathspec_match_list *m) -{ - return m ? git_array_size(m->matches) : 0; -} - -const char *git_pathspec_match_list_entry( - const git_pathspec_match_list *m, size_t pos) -{ - if (!m || m->datatype != PATHSPEC_DATATYPE_STRINGS || - !git_array_valid_index(m->matches, pos)) - return NULL; - - return *((const char **)git_array_get(m->matches, pos)); -} - -const git_diff_delta *git_pathspec_match_list_diff_entry( - const git_pathspec_match_list *m, size_t pos) -{ - if (!m || m->datatype != PATHSPEC_DATATYPE_DIFF || - !git_array_valid_index(m->matches, pos)) - return NULL; - - return *((const git_diff_delta **)git_array_get(m->matches, pos)); -} - -size_t git_pathspec_match_list_failed_entrycount( - const git_pathspec_match_list *m) -{ - return m ? git_array_size(m->failures) : 0; -} - -const char * git_pathspec_match_list_failed_entry( - const git_pathspec_match_list *m, size_t pos) -{ - char **entry = m ? git_array_get(m->failures, pos) : NULL; - - return entry ? *entry : NULL; -} - diff --git a/vendor/libgit2/src/pathspec.h b/vendor/libgit2/src/pathspec.h deleted file mode 100644 index 40cd21c3f5..0000000000 --- a/vendor/libgit2/src/pathspec.h +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_pathspec_h__ -#define INCLUDE_pathspec_h__ - -#include "common.h" -#include -#include "buffer.h" -#include "vector.h" -#include "pool.h" -#include "array.h" - -/* public compiled pathspec */ -struct git_pathspec { - git_refcount rc; - char *prefix; - git_vector pathspec; - git_pool pool; -}; - -enum { - PATHSPEC_DATATYPE_STRINGS = 0, - PATHSPEC_DATATYPE_DIFF = 1, -}; - -typedef git_array_t(char *) git_pathspec_string_array_t; - -/* public interface to pathspec matching */ -struct git_pathspec_match_list { - git_pathspec *pathspec; - git_array_t(void *) matches; - git_pathspec_string_array_t failures; - git_pool pool; - int datatype; -}; - -/* what is the common non-wildcard prefix for all items in the pathspec */ -extern char *git_pathspec_prefix(const git_strarray *pathspec); - -/* is there anything in the spec that needs to be filtered on */ -extern bool git_pathspec_is_empty(const git_strarray *pathspec); - -/* build a vector of fnmatch patterns to evaluate efficiently */ -extern int git_pathspec__vinit( - git_vector *vspec, const git_strarray *strspec, git_pool *strpool); - -/* free data from the pathspec vector */ -extern void git_pathspec__vfree(git_vector *vspec); - -#define GIT_PATHSPEC_NOMATCH ((size_t)-1) - -/* - * Match a path against the vectorized pathspec. - * The matched pathspec is passed back into the `matched_pathspec` parameter, - * unless it is passed as NULL by the caller. - */ -extern bool git_pathspec__match( - const git_vector *vspec, - const char *path, - bool disable_fnmatch, - bool casefold, - const char **matched_pathspec, - size_t *matched_at); - -/* easy pathspec setup */ - -extern int git_pathspec__init(git_pathspec *ps, const git_strarray *paths); - -extern void git_pathspec__clear(git_pathspec *ps); - -#endif diff --git a/vendor/libgit2/src/pool.c b/vendor/libgit2/src/pool.c deleted file mode 100644 index c93d78182c..0000000000 --- a/vendor/libgit2/src/pool.c +++ /dev/null @@ -1,325 +0,0 @@ -#include "pool.h" -#include "posix.h" -#ifndef GIT_WIN32 -#include -#endif - -struct git_pool_page { - git_pool_page *next; - uint32_t size; - uint32_t avail; - GIT_ALIGN(char data[GIT_FLEX_ARRAY], 8); -}; - -struct pool_freelist { - struct pool_freelist *next; -}; - -#define GIT_POOL_MIN_USABLE 4 -#define GIT_POOL_MIN_PAGESZ 2 * sizeof(void*) - -static void *pool_alloc_page(git_pool *pool, uint32_t size); -static void pool_insert_page(git_pool *pool, git_pool_page *page); - -int git_pool_init( - git_pool *pool, uint32_t item_size, uint32_t items_per_page) -{ - assert(pool); - - if (!item_size) - item_size = 1; - /* round up item_size for decent object alignment */ - if (item_size > 4) - item_size = (item_size + 7) & ~7; - else if (item_size == 3) - item_size = 4; - - if (!items_per_page) - items_per_page = git_pool__suggest_items_per_page(item_size); - if (item_size * items_per_page < GIT_POOL_MIN_PAGESZ) - items_per_page = (GIT_POOL_MIN_PAGESZ + item_size - 1) / item_size; - - memset(pool, 0, sizeof(git_pool)); - pool->item_size = item_size; - pool->page_size = item_size * items_per_page; - - return 0; -} - -void git_pool_clear(git_pool *pool) -{ - git_pool_page *scan, *next; - - for (scan = pool->open; scan != NULL; scan = next) { - next = scan->next; - git__free(scan); - } - pool->open = NULL; - - for (scan = pool->full; scan != NULL; scan = next) { - next = scan->next; - git__free(scan); - } - pool->full = NULL; - - pool->free_list = NULL; - - pool->items = 0; - - pool->has_string_alloc = 0; - pool->has_multi_item_alloc = 0; - pool->has_large_page_alloc = 0; -} - -void git_pool_swap(git_pool *a, git_pool *b) -{ - git_pool temp; - - if (a == b) - return; - - memcpy(&temp, a, sizeof(temp)); - memcpy(a, b, sizeof(temp)); - memcpy(b, &temp, sizeof(temp)); -} - -static void pool_insert_page(git_pool *pool, git_pool_page *page) -{ - git_pool_page *scan; - - /* If there are no open pages or this page has the most open space, - * insert it at the beginning of the list. This is the common case. - */ - if (pool->open == NULL || pool->open->avail < page->avail) { - page->next = pool->open; - pool->open = page; - return; - } - - /* Otherwise insert into sorted position. */ - for (scan = pool->open; - scan->next && scan->next->avail > page->avail; - scan = scan->next); - page->next = scan->next; - scan->next = page; -} - -static void *pool_alloc_page(git_pool *pool, uint32_t size) -{ - git_pool_page *page; - uint32_t new_page_size; - size_t alloc_size; - - if (size <= pool->page_size) - new_page_size = pool->page_size; - else { - new_page_size = size; - pool->has_large_page_alloc = 1; - } - - if (GIT_ADD_SIZET_OVERFLOW(&alloc_size, new_page_size, sizeof(git_pool_page)) || - !(page = git__calloc(1, alloc_size))) - return NULL; - - page->size = new_page_size; - page->avail = new_page_size - size; - - if (page->avail > 0) - pool_insert_page(pool, page); - else { - page->next = pool->full; - pool->full = page; - } - - pool->items++; - - return page->data; -} - -GIT_INLINE(void) pool_remove_page( - git_pool *pool, git_pool_page *page, git_pool_page *prev) -{ - if (prev == NULL) - pool->open = page->next; - else - prev->next = page->next; -} - -void *git_pool_malloc(git_pool *pool, uint32_t items) -{ - git_pool_page *scan = pool->open, *prev; - uint32_t size = ((items * pool->item_size) + 7) & ~7; - void *ptr = NULL; - - pool->has_string_alloc = 0; - if (items > 1) - pool->has_multi_item_alloc = 1; - else if (pool->free_list != NULL) { - ptr = pool->free_list; - pool->free_list = ((struct pool_freelist *)pool->free_list)->next; - return ptr; - } - - /* just add a block if there is no open one to accommodate this */ - if (size >= pool->page_size || !scan || scan->avail < size) - return pool_alloc_page(pool, size); - - pool->items++; - - /* find smallest block in free list with space */ - for (scan = pool->open, prev = NULL; - scan->next && scan->next->avail >= size; - prev = scan, scan = scan->next); - - /* allocate space from the block */ - ptr = &scan->data[scan->size - scan->avail]; - scan->avail -= size; - - /* move to full list if there is almost no space left */ - if (scan->avail < pool->item_size || scan->avail < GIT_POOL_MIN_USABLE) { - pool_remove_page(pool, scan, prev); - scan->next = pool->full; - pool->full = scan; - } - /* reorder list if block is now smaller than the one after it */ - else if (scan->next != NULL && scan->next->avail > scan->avail) { - pool_remove_page(pool, scan, prev); - pool_insert_page(pool, scan); - } - - return ptr; -} - -char *git_pool_strndup(git_pool *pool, const char *str, size_t n) -{ - char *ptr = NULL; - - assert(pool && str && pool->item_size == sizeof(char)); - - if ((uint32_t)(n + 1) < n) - return NULL; - - if ((ptr = git_pool_malloc(pool, (uint32_t)(n + 1))) != NULL) { - memcpy(ptr, str, n); - ptr[n] = '\0'; - } - - pool->has_string_alloc = 1; - - return ptr; -} - -char *git_pool_strdup(git_pool *pool, const char *str) -{ - assert(pool && str && pool->item_size == sizeof(char)); - - return git_pool_strndup(pool, str, strlen(str)); -} - -char *git_pool_strdup_safe(git_pool *pool, const char *str) -{ - return str ? git_pool_strdup(pool, str) : NULL; -} - -char *git_pool_strcat(git_pool *pool, const char *a, const char *b) -{ - void *ptr; - size_t len_a, len_b; - - assert(pool && pool->item_size == sizeof(char)); - - len_a = a ? strlen(a) : 0; - len_b = b ? strlen(b) : 0; - - if ((ptr = git_pool_malloc(pool, (uint32_t)(len_a + len_b + 1))) != NULL) { - if (len_a) - memcpy(ptr, a, len_a); - if (len_b) - memcpy(((char *)ptr) + len_a, b, len_b); - *(((char *)ptr) + len_a + len_b) = '\0'; - } - pool->has_string_alloc = 1; - - return ptr; -} - -void git_pool_free(git_pool *pool, void *ptr) -{ - struct pool_freelist *item = ptr; - - assert(pool && pool->item_size >= sizeof(void*)); - - if (item) { - item->next = pool->free_list; - pool->free_list = item; - } -} - -void git_pool_free_array(git_pool *pool, size_t count, void **ptrs) -{ - struct pool_freelist **items = (struct pool_freelist **)ptrs; - size_t i; - - assert(pool && ptrs && pool->item_size >= sizeof(void*)); - - if (!count) - return; - - for (i = count - 1; i > 0; --i) - items[i]->next = items[i - 1]; - - items[i]->next = pool->free_list; - pool->free_list = items[count - 1]; -} - -uint32_t git_pool__open_pages(git_pool *pool) -{ - uint32_t ct = 0; - git_pool_page *scan; - for (scan = pool->open; scan != NULL; scan = scan->next) ct++; - return ct; -} - -uint32_t git_pool__full_pages(git_pool *pool) -{ - uint32_t ct = 0; - git_pool_page *scan; - for (scan = pool->full; scan != NULL; scan = scan->next) ct++; - return ct; -} - -bool git_pool__ptr_in_pool(git_pool *pool, void *ptr) -{ - git_pool_page *scan; - for (scan = pool->open; scan != NULL; scan = scan->next) - if ((void *)scan->data <= ptr && - (void *)(((char *)scan->data) + scan->size) > ptr) - return true; - for (scan = pool->full; scan != NULL; scan = scan->next) - if ((void *)scan->data <= ptr && - (void *)(((char *)scan->data) + scan->size) > ptr) - return true; - return false; -} - -uint32_t git_pool__system_page_size(void) -{ - static uint32_t size = 0; - - if (!size) { - size_t page_size; - if (git__page_size(&page_size) < 0) - page_size = 4096; - size = page_size - 2 * sizeof(void *); /* allow space for malloc overhead */ - } - - return size; -} - -uint32_t git_pool__suggest_items_per_page(uint32_t item_size) -{ - uint32_t page_bytes = - git_pool__system_page_size() - sizeof(git_pool_page); - return page_bytes / item_size; -} - diff --git a/vendor/libgit2/src/pool.h b/vendor/libgit2/src/pool.h deleted file mode 100644 index b0007f3154..0000000000 --- a/vendor/libgit2/src/pool.h +++ /dev/null @@ -1,148 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_pool_h__ -#define INCLUDE_pool_h__ - -#include "common.h" - -typedef struct git_pool_page git_pool_page; - -/** - * Chunked allocator. - * - * A `git_pool` can be used when you want to cheaply allocate - * multiple items of the same type and are willing to free them - * all together with a single call. The two most common cases - * are a set of fixed size items (such as lots of OIDs) or a - * bunch of strings. - * - * Internally, a `git_pool` allocates pages of memory and then - * deals out blocks from the trailing unused portion of each page. - * The pages guarantee that the number of actual allocations done - * will be much smaller than the number of items needed. - * - * For examples of how to set up a `git_pool` see `git_pool_init`. - */ -typedef struct { - git_pool_page *open; /* pages with space left */ - git_pool_page *full; /* pages with no space left */ - void *free_list; /* optional: list of freed blocks */ - uint32_t item_size; /* size of single alloc unit in bytes */ - uint32_t page_size; /* size of page in bytes */ - uint32_t items; - unsigned has_string_alloc : 1; /* was the strdup function used */ - unsigned has_multi_item_alloc : 1; /* was items ever > 1 in malloc */ - unsigned has_large_page_alloc : 1; /* are any pages > page_size */ -} git_pool; - -#define GIT_POOL_INIT_STRINGPOOL { 0, 0, 0, 1, 4000, 0, 0, 0, 0 } - -/** - * Initialize a pool. - * - * To allocation strings, use like this: - * - * git_pool_init(&string_pool, 1, 0); - * my_string = git_pool_strdup(&string_pool, your_string); - * - * To allocate items of fixed size, use like this: - * - * git_pool_init(&pool, sizeof(item), 0); - * my_item = git_pool_malloc(&pool, 1); - * - * Of course, you can use this in other ways, but those are the - * two most common patterns. - */ -extern int git_pool_init( - git_pool *pool, uint32_t item_size, uint32_t items_per_page); - -/** - * Free all items in pool - */ -extern void git_pool_clear(git_pool *pool); - -/** - * Swap two pools with one another - */ -extern void git_pool_swap(git_pool *a, git_pool *b); - -/** - * Allocate space for one or more items from a pool. - */ -extern void *git_pool_malloc(git_pool *pool, uint32_t items); - -/** - * Allocate space and zero it out. - */ -GIT_INLINE(void *) git_pool_mallocz(git_pool *pool, uint32_t items) -{ - void *ptr = git_pool_malloc(pool, items); - if (ptr) - memset(ptr, 0, (size_t)items * (size_t)pool->item_size); - return ptr; -} - -/** - * Allocate space and duplicate string data into it. - * - * This is allowed only for pools with item_size == sizeof(char) - */ -extern char *git_pool_strndup(git_pool *pool, const char *str, size_t n); - -/** - * Allocate space and duplicate a string into it. - * - * This is allowed only for pools with item_size == sizeof(char) - */ -extern char *git_pool_strdup(git_pool *pool, const char *str); - -/** - * Allocate space and duplicate a string into it, NULL is no error. - * - * This is allowed only for pools with item_size == sizeof(char) - */ -extern char *git_pool_strdup_safe(git_pool *pool, const char *str); - -/** - * Allocate space for the concatenation of two strings. - * - * This is allowed only for pools with item_size == sizeof(char) - */ -extern char *git_pool_strcat(git_pool *pool, const char *a, const char *b); - -/** - * Push a block back onto the free list for the pool. - * - * This is allowed only if the item_size is >= sizeof(void*). - * - * In some cases, it is helpful to "release" an allocated block - * for reuse. Pools don't support a general purpose free, but - * they will keep a simple free blocks linked list provided the - * native block size is large enough to hold a void pointer - */ -extern void git_pool_free(git_pool *pool, void *ptr); - -/** - * Push an array of pool allocated blocks efficiently onto the free list. - * - * This has the same constraints as `git_pool_free()` above. - */ -extern void git_pool_free_array(git_pool *pool, size_t count, void **ptrs); - -/* - * Misc utilities - */ - -extern uint32_t git_pool__open_pages(git_pool *pool); - -extern uint32_t git_pool__full_pages(git_pool *pool); - -extern bool git_pool__ptr_in_pool(git_pool *pool, void *ptr); - -extern uint32_t git_pool__suggest_items_per_page(uint32_t item_size); - -#endif diff --git a/vendor/libgit2/src/posix.c b/vendor/libgit2/src/posix.c deleted file mode 100644 index 8d86aa8bfa..0000000000 --- a/vendor/libgit2/src/posix.c +++ /dev/null @@ -1,259 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#include "common.h" -#include "posix.h" -#include "path.h" -#include -#include - -#ifndef GIT_WIN32 - -#ifdef NO_ADDRINFO - -int p_getaddrinfo( - const char *host, - const char *port, - struct addrinfo *hints, - struct addrinfo **info) -{ - struct addrinfo *ainfo, *ai; - int p = 0; - - GIT_UNUSED(hints); - - if ((ainfo = malloc(sizeof(struct addrinfo))) == NULL) - return -1; - - if ((ainfo->ai_hostent = gethostbyname(host)) == NULL) { - free(ainfo); - return -2; - } - - ainfo->ai_servent = getservbyname(port, 0); - - if (ainfo->ai_servent) - ainfo->ai_port = ainfo->ai_servent->s_port; - else - ainfo->ai_port = atol(port); - - memcpy(&ainfo->ai_addr_in.sin_addr, - ainfo->ai_hostent->h_addr_list[0], - ainfo->ai_hostent->h_length); - - ainfo->ai_protocol = 0; - ainfo->ai_socktype = hints->ai_socktype; - ainfo->ai_family = ainfo->ai_hostent->h_addrtype; - ainfo->ai_addr_in.sin_family = ainfo->ai_family; - ainfo->ai_addr_in.sin_port = ainfo->ai_port; - ainfo->ai_addr = (struct addrinfo *)&ainfo->ai_addr_in; - ainfo->ai_addrlen = sizeof(struct sockaddr_in); - - *info = ainfo; - - if (ainfo->ai_hostent->h_addr_list[1] == NULL) { - ainfo->ai_next = NULL; - return 0; - } - - ai = ainfo; - - for (p = 1; ainfo->ai_hostent->h_addr_list[p] != NULL; p++) { - ai->ai_next = malloc(sizeof(struct addrinfo)); - memcpy(&ai->ai_next, ainfo, sizeof(struct addrinfo)); - memcpy(&ai->ai_next->ai_addr_in.sin_addr, - ainfo->ai_hostent->h_addr_list[p], - ainfo->ai_hostent->h_length); - ai->ai_next->ai_addr = (struct addrinfo *)&ai->ai_next->ai_addr_in; - ai = ai->ai_next; - } - - ai->ai_next = NULL; - return 0; -} - -void p_freeaddrinfo(struct addrinfo *info) -{ - struct addrinfo *p, *next; - - p = info; - - while(p != NULL) { - next = p->ai_next; - free(p); - p = next; - } -} - -const char *p_gai_strerror(int ret) -{ - switch(ret) { - case -1: return "Out of memory"; break; - case -2: return "Address lookup failed"; break; - default: return "Unknown error"; break; - } -} - -#endif /* NO_ADDRINFO */ - -int p_open(const char *path, volatile int flags, ...) -{ - mode_t mode = 0; - - if (flags & O_CREAT) { - va_list arg_list; - - va_start(arg_list, flags); - mode = (mode_t)va_arg(arg_list, int); - va_end(arg_list); - } - - return open(path, flags | O_BINARY | O_CLOEXEC, mode); -} - -int p_creat(const char *path, mode_t mode) -{ - return open(path, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY | O_CLOEXEC, mode); -} - -int p_getcwd(char *buffer_out, size_t size) -{ - char *cwd_buffer; - - assert(buffer_out && size > 0); - - cwd_buffer = getcwd(buffer_out, size); - - if (cwd_buffer == NULL) - return -1; - - git_path_mkposix(buffer_out); - git_path_string_to_dir(buffer_out, size); /* append trailing slash */ - - return 0; -} - -int p_rename(const char *from, const char *to) -{ - if (!link(from, to)) { - p_unlink(from); - return 0; - } - - if (!rename(from, to)) - return 0; - - return -1; -} - -#endif /* GIT_WIN32 */ - -ssize_t p_read(git_file fd, void *buf, size_t cnt) -{ - char *b = buf; - - if (!git__is_ssizet(cnt)) { -#ifdef GIT_WIN32 - SetLastError(ERROR_INVALID_PARAMETER); -#endif - errno = EINVAL; - return -1; - } - - while (cnt) { - ssize_t r; -#ifdef GIT_WIN32 - r = read(fd, b, cnt > INT_MAX ? INT_MAX : (unsigned int)cnt); -#else - r = read(fd, b, cnt); -#endif - if (r < 0) { - if (errno == EINTR || errno == EAGAIN) - continue; - return -1; - } - if (!r) - break; - cnt -= r; - b += r; - } - return (b - (char *)buf); -} - -int p_write(git_file fd, const void *buf, size_t cnt) -{ - const char *b = buf; - - while (cnt) { - ssize_t r; -#ifdef GIT_WIN32 - assert((size_t)((unsigned int)cnt) == cnt); - r = write(fd, b, (unsigned int)cnt); -#else - r = write(fd, b, cnt); -#endif - if (r < 0) { - if (errno == EINTR || GIT_ISBLOCKED(errno)) - continue; - return -1; - } - if (!r) { - errno = EPIPE; - return -1; - } - cnt -= r; - b += r; - } - return 0; -} - -#ifdef NO_MMAP - -#include "map.h" - -int git__page_size(size_t *page_size) -{ - /* dummy; here we don't need any alignment anyway */ - *page_size = 4096; - return 0; -} - - -int p_mmap(git_map *out, size_t len, int prot, int flags, int fd, git_off_t offset) -{ - GIT_MMAP_VALIDATE(out, len, prot, flags); - - out->data = NULL; - out->len = 0; - - if ((prot & GIT_PROT_WRITE) && ((flags & GIT_MAP_TYPE) == GIT_MAP_SHARED)) { - giterr_set(GITERR_OS, "Trying to map shared-writeable"); - return -1; - } - - out->data = malloc(len); - GITERR_CHECK_ALLOC(out->data); - - if (!git__is_ssizet(len) || - (p_lseek(fd, offset, SEEK_SET) < 0) || - (p_read(fd, out->data, len) != (ssize_t)len)) { - giterr_set(GITERR_OS, "mmap emulation failed"); - return -1; - } - - out->len = len; - return 0; -} - -int p_munmap(git_map *map) -{ - assert(map != NULL); - free(map->data); - - return 0; -} - -#endif diff --git a/vendor/libgit2/src/posix.h b/vendor/libgit2/src/posix.h deleted file mode 100644 index 8785a4c997..0000000000 --- a/vendor/libgit2/src/posix.h +++ /dev/null @@ -1,160 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_posix_h__ -#define INCLUDE_posix_h__ - -#include "common.h" -#include -#include -#include "fnmatch.h" - -/* stat: file mode type testing macros */ -#ifndef S_IFGITLINK -#define S_IFGITLINK 0160000 -#define S_ISGITLINK(m) (((m) & S_IFMT) == S_IFGITLINK) -#endif - -#ifndef S_IFLNK -#define S_IFLNK 0120000 -#undef _S_IFLNK -#define _S_IFLNK S_IFLNK -#endif - -#ifndef S_IXUSR -#define S_IXUSR 00100 -#endif - -#ifndef S_ISLNK -#define S_ISLNK(m) (((m) & _S_IFMT) == _S_IFLNK) -#endif - -#ifndef S_ISDIR -#define S_ISDIR(m) (((m) & _S_IFMT) == _S_IFDIR) -#endif - -#ifndef S_ISREG -#define S_ISREG(m) (((m) & _S_IFMT) == _S_IFREG) -#endif - -#ifndef S_ISFIFO -#define S_ISFIFO(m) (((m) & _S_IFMT) == _S_IFIFO) -#endif - -/* if S_ISGID is not defined, then don't try to set it */ -#ifndef S_ISGID -#define S_ISGID 0 -#endif - -#ifndef O_BINARY -#define O_BINARY 0 -#endif -#ifndef O_CLOEXEC -#define O_CLOEXEC 0 -#endif - -/* access() mode parameter #defines */ -#ifndef F_OK -#define F_OK 0 /* existence check */ -#endif -#ifndef W_OK -#define W_OK 2 /* write mode check */ -#endif -#ifndef R_OK -#define R_OK 4 /* read mode check */ -#endif - -/* Determine whether an errno value indicates that a read or write failed - * because the descriptor is blocked. - */ -#if defined(EWOULDBLOCK) -#define GIT_ISBLOCKED(e) ((e) == EAGAIN || (e) == EWOULDBLOCK) -#else -#define GIT_ISBLOCKED(e) ((e) == EAGAIN) -#endif - -/* define some standard errnos that the runtime may be missing. for example, - * mingw lacks EAFNOSUPPORT. */ -#ifndef EAFNOSUPPORT -#define EAFNOSUPPORT (INT_MAX-1) -#endif - -typedef int git_file; - -/** - * Standard POSIX Methods - * - * All the methods starting with the `p_` prefix are - * direct ports of the standard POSIX methods. - * - * Some of the methods are slightly wrapped to provide - * saner defaults. Some of these methods are emulated - * in Windows platforms. - * - * Use your manpages to check the docs on these. - */ - -extern ssize_t p_read(git_file fd, void *buf, size_t cnt); -extern int p_write(git_file fd, const void *buf, size_t cnt); - -#define p_close(fd) close(fd) -#define p_umask(m) umask(m) - -extern int p_open(const char *path, int flags, ...); -extern int p_creat(const char *path, mode_t mode); -extern int p_getcwd(char *buffer_out, size_t size); -extern int p_rename(const char *from, const char *to); - -extern int git__page_size(size_t *page_size); - -/** - * Platform-dependent methods - */ -#ifdef GIT_WIN32 -# include "win32/posix.h" -#else -# include "unix/posix.h" -#endif - -#include "strnlen.h" - -#ifdef NO_READDIR_R -GIT_INLINE(int) p_readdir_r(DIR *dirp, struct dirent *entry, struct dirent **result) -{ - GIT_UNUSED(entry); - *result = readdir(dirp); - return 0; -} -#else /* NO_READDIR_R */ -# define p_readdir_r(d,e,r) readdir_r(d,e,r) -#endif - -#ifdef NO_ADDRINFO -# include -struct addrinfo { - struct hostent *ai_hostent; - struct servent *ai_servent; - struct sockaddr_in ai_addr_in; - struct sockaddr *ai_addr; - size_t ai_addrlen; - int ai_family; - int ai_socktype; - int ai_protocol; - long ai_port; - struct addrinfo *ai_next; -}; - -extern int p_getaddrinfo(const char *host, const char *port, - struct addrinfo *hints, struct addrinfo **info); -extern void p_freeaddrinfo(struct addrinfo *info); -extern const char *p_gai_strerror(int ret); -#else -# define p_getaddrinfo(a, b, c, d) getaddrinfo(a, b, c, d) -# define p_freeaddrinfo(a) freeaddrinfo(a) -# define p_gai_strerror(c) gai_strerror(c) -#endif /* NO_ADDRINFO */ - -#endif diff --git a/vendor/libgit2/src/pqueue.c b/vendor/libgit2/src/pqueue.c deleted file mode 100644 index 54a60ca04b..0000000000 --- a/vendor/libgit2/src/pqueue.c +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#include "pqueue.h" -#include "util.h" - -#define PQUEUE_LCHILD_OF(I) (((I)<<1)+1) -#define PQUEUE_RCHILD_OF(I) (((I)<<1)+2) -#define PQUEUE_PARENT_OF(I) (((I)-1)>>1) - -int git_pqueue_init( - git_pqueue *pq, - uint32_t flags, - size_t init_size, - git_vector_cmp cmp) -{ - int error = git_vector_init(pq, init_size, cmp); - - if (!error) { - /* mix in our flags */ - pq->flags |= flags; - - /* if fixed size heap, pretend vector is exactly init_size elements */ - if ((flags & GIT_PQUEUE_FIXED_SIZE) && init_size > 0) - pq->_alloc_size = init_size; - } - - return error; -} - -static void pqueue_up(git_pqueue *pq, size_t el) -{ - size_t parent_el = PQUEUE_PARENT_OF(el); - void *kid = git_vector_get(pq, el); - - while (el > 0) { - void *parent = pq->contents[parent_el]; - - if (pq->_cmp(parent, kid) <= 0) - break; - - pq->contents[el] = parent; - - el = parent_el; - parent_el = PQUEUE_PARENT_OF(el); - } - - pq->contents[el] = kid; -} - -static void pqueue_down(git_pqueue *pq, size_t el) -{ - void *parent = git_vector_get(pq, el), *kid, *rkid; - - while (1) { - size_t kid_el = PQUEUE_LCHILD_OF(el); - - if ((kid = git_vector_get(pq, kid_el)) == NULL) - break; - - if ((rkid = git_vector_get(pq, kid_el + 1)) != NULL && - pq->_cmp(kid, rkid) > 0) { - kid = rkid; - kid_el += 1; - } - - if (pq->_cmp(parent, kid) <= 0) - break; - - pq->contents[el] = kid; - el = kid_el; - } - - pq->contents[el] = parent; -} - -int git_pqueue_insert(git_pqueue *pq, void *item) -{ - int error = 0; - - /* if heap is full, pop the top element if new one should replace it */ - if ((pq->flags & GIT_PQUEUE_FIXED_SIZE) != 0 && - pq->length >= pq->_alloc_size) - { - /* skip this item if below min item in heap */ - if (pq->_cmp(item, git_vector_get(pq, 0)) <= 0) - return 0; - /* otherwise remove the min item before inserting new */ - (void)git_pqueue_pop(pq); - } - - if (!(error = git_vector_insert(pq, item))) - pqueue_up(pq, pq->length - 1); - - return error; -} - -void *git_pqueue_pop(git_pqueue *pq) -{ - void *rval = git_pqueue_get(pq, 0); - - if (git_pqueue_size(pq) > 1) { - /* move last item to top of heap, shrink, and push item down */ - pq->contents[0] = git_vector_last(pq); - git_vector_pop(pq); - pqueue_down(pq, 0); - } else { - /* all we need to do is shrink the heap in this case */ - git_vector_pop(pq); - } - - return rval; -} diff --git a/vendor/libgit2/src/pqueue.h b/vendor/libgit2/src/pqueue.h deleted file mode 100644 index da7b74edfb..0000000000 --- a/vendor/libgit2/src/pqueue.h +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_pqueue_h__ -#define INCLUDE_pqueue_h__ - -#include "vector.h" - -typedef git_vector git_pqueue; - -enum { - /* flag meaning: don't grow heap, keep highest values only */ - GIT_PQUEUE_FIXED_SIZE = (GIT_VECTOR_FLAG_MAX << 1), -}; - -/** - * Initialize priority queue - * - * @param pq The priority queue struct to initialize - * @param flags Flags (see above) to control queue behavior - * @param init_size The initial queue size - * @param cmp The entry priority comparison function - * @return 0 on success, <0 on error - */ -extern int git_pqueue_init( - git_pqueue *pq, - uint32_t flags, - size_t init_size, - git_vector_cmp cmp); - -#define git_pqueue_free git_vector_free -#define git_pqueue_clear git_vector_clear -#define git_pqueue_size git_vector_length -#define git_pqueue_get git_vector_get - -/** - * Insert a new item into the queue - * - * @param pq The priority queue - * @param item Pointer to the item data - * @return 0 on success, <0 on failure - */ -extern int git_pqueue_insert(git_pqueue *pq, void *item); - -/** - * Remove the top item in the priority queue - * - * @param pq The priority queue - * @return item from heap on success, NULL if queue is empty - */ -extern void *git_pqueue_pop(git_pqueue *pq); - -#endif diff --git a/vendor/libgit2/src/push.c b/vendor/libgit2/src/push.c deleted file mode 100644 index a0d8a05506..0000000000 --- a/vendor/libgit2/src/push.c +++ /dev/null @@ -1,717 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#include "git2.h" - -#include "common.h" -#include "pack.h" -#include "pack-objects.h" -#include "remote.h" -#include "vector.h" -#include "push.h" -#include "tree.h" - -static int push_spec_rref_cmp(const void *a, const void *b) -{ - const push_spec *push_spec_a = a, *push_spec_b = b; - - return strcmp(push_spec_a->refspec.dst, push_spec_b->refspec.dst); -} - -static int push_status_ref_cmp(const void *a, const void *b) -{ - const push_status *push_status_a = a, *push_status_b = b; - - return strcmp(push_status_a->ref, push_status_b->ref); -} - -int git_push_new(git_push **out, git_remote *remote) -{ - git_push *p; - - *out = NULL; - - p = git__calloc(1, sizeof(*p)); - GITERR_CHECK_ALLOC(p); - - p->repo = remote->repo; - p->remote = remote; - p->report_status = 1; - p->pb_parallelism = 1; - - if (git_vector_init(&p->specs, 0, push_spec_rref_cmp) < 0) { - git__free(p); - return -1; - } - - if (git_vector_init(&p->status, 0, push_status_ref_cmp) < 0) { - git_vector_free(&p->specs); - git__free(p); - return -1; - } - - if (git_vector_init(&p->updates, 0, NULL) < 0) { - git_vector_free(&p->status); - git_vector_free(&p->specs); - git__free(p); - return -1; - } - - *out = p; - return 0; -} - -int git_push_set_options(git_push *push, const git_push_options *opts) -{ - if (!push || !opts) - return -1; - - GITERR_CHECK_VERSION(opts, GIT_PUSH_OPTIONS_VERSION, "git_push_options"); - - push->pb_parallelism = opts->pb_parallelism; - - return 0; -} - -static void free_refspec(push_spec *spec) -{ - if (spec == NULL) - return; - - git_refspec__free(&spec->refspec); - git__free(spec); -} - -static int check_rref(char *ref) -{ - if (git__prefixcmp(ref, "refs/")) { - giterr_set(GITERR_INVALID, "Not a valid reference '%s'", ref); - return -1; - } - - return 0; -} - -static int check_lref(git_push *push, char *ref) -{ - /* lref must be resolvable to an existing object */ - git_object *obj; - int error = git_revparse_single(&obj, push->repo, ref); - git_object_free(obj); - - if (!error) - return 0; - - if (error == GIT_ENOTFOUND) - giterr_set(GITERR_REFERENCE, - "src refspec '%s' does not match any existing object", ref); - else - giterr_set(GITERR_INVALID, "Not a valid reference '%s'", ref); - return -1; -} - -static int parse_refspec(git_push *push, push_spec **spec, const char *str) -{ - push_spec *s; - - *spec = NULL; - - s = git__calloc(1, sizeof(*s)); - GITERR_CHECK_ALLOC(s); - - if (git_refspec__parse(&s->refspec, str, false) < 0) { - giterr_set(GITERR_INVALID, "invalid refspec %s", str); - goto on_error; - } - - if (s->refspec.src && s->refspec.src[0] != '\0' && - check_lref(push, s->refspec.src) < 0) { - goto on_error; - } - - if (check_rref(s->refspec.dst) < 0) - goto on_error; - - *spec = s; - return 0; - -on_error: - free_refspec(s); - return -1; -} - -int git_push_add_refspec(git_push *push, const char *refspec) -{ - push_spec *spec; - - if (parse_refspec(push, &spec, refspec) < 0 || - git_vector_insert(&push->specs, spec) < 0) - return -1; - - return 0; -} - -int git_push_update_tips(git_push *push, const git_remote_callbacks *callbacks) -{ - git_buf remote_ref_name = GIT_BUF_INIT; - size_t i, j; - git_refspec *fetch_spec; - push_spec *push_spec = NULL; - git_reference *remote_ref; - push_status *status; - int error = 0; - - git_vector_foreach(&push->status, i, status) { - int fire_callback = 1; - - /* Skip unsuccessful updates which have non-empty messages */ - if (status->msg) - continue; - - /* Find the corresponding remote ref */ - fetch_spec = git_remote__matching_refspec(push->remote, status->ref); - if (!fetch_spec) - continue; - - if ((error = git_refspec_transform(&remote_ref_name, fetch_spec, status->ref)) < 0) - goto on_error; - - /* Find matching push ref spec */ - git_vector_foreach(&push->specs, j, push_spec) { - if (!strcmp(push_spec->refspec.dst, status->ref)) - break; - } - - /* Could not find the corresponding push ref spec for this push update */ - if (j == push->specs.length) - continue; - - /* Update the remote ref */ - if (git_oid_iszero(&push_spec->loid)) { - error = git_reference_lookup(&remote_ref, push->remote->repo, git_buf_cstr(&remote_ref_name)); - - if (error >= 0) { - error = git_reference_delete(remote_ref); - git_reference_free(remote_ref); - } - } else { - error = git_reference_create(NULL, push->remote->repo, - git_buf_cstr(&remote_ref_name), &push_spec->loid, 1, - "update by push"); - } - - if (error < 0) { - if (error != GIT_ENOTFOUND) - goto on_error; - - giterr_clear(); - fire_callback = 0; - } - - if (fire_callback && callbacks && callbacks->update_tips) { - error = callbacks->update_tips(git_buf_cstr(&remote_ref_name), - &push_spec->roid, &push_spec->loid, callbacks->payload); - - if (error < 0) - goto on_error; - } - } - - error = 0; - -on_error: - git_buf_free(&remote_ref_name); - return error; -} - -/** - * Insert all tags until we find a non-tag object, which is returned - * in `out`. - */ -static int enqueue_tag(git_object **out, git_push *push, git_oid *id) -{ - git_object *obj = NULL, *target = NULL; - int error; - - if ((error = git_object_lookup(&obj, push->repo, id, GIT_OBJ_TAG)) < 0) - return error; - - while (git_object_type(obj) == GIT_OBJ_TAG) { - if ((error = git_packbuilder_insert(push->pb, git_object_id(obj), NULL)) < 0) - break; - - if ((error = git_tag_target(&target, (git_tag *) obj)) < 0) - break; - - git_object_free(obj); - obj = target; - } - - if (error < 0) - git_object_free(obj); - else - *out = obj; - - return error; -} - -static int revwalk(git_vector *commits, git_push *push) -{ - git_remote_head *head; - push_spec *spec; - git_revwalk *rw; - git_oid oid; - unsigned int i; - int error = -1; - - if (git_revwalk_new(&rw, push->repo) < 0) - return -1; - - git_revwalk_sorting(rw, GIT_SORT_TIME); - - git_vector_foreach(&push->specs, i, spec) { - git_otype type; - size_t size; - - if (git_oid_iszero(&spec->loid)) - /* - * Delete reference on remote side; - * nothing to do here. - */ - continue; - - if (git_oid_equal(&spec->loid, &spec->roid)) - continue; /* up-to-date */ - - if (git_odb_read_header(&size, &type, push->repo->_odb, &spec->loid) < 0) - goto on_error; - - if (type == GIT_OBJ_TAG) { - git_object *target; - - if ((error = enqueue_tag(&target, push, &spec->loid)) < 0) - goto on_error; - - if (git_object_type(target) == GIT_OBJ_COMMIT) { - if (git_revwalk_push(rw, git_object_id(target)) < 0) { - git_object_free(target); - goto on_error; - } - } else { - if (git_packbuilder_insert( - push->pb, git_object_id(target), NULL) < 0) { - git_object_free(target); - goto on_error; - } - } - git_object_free(target); - } else if (git_revwalk_push(rw, &spec->loid) < 0) - goto on_error; - - if (!spec->refspec.force) { - git_oid base; - - if (git_oid_iszero(&spec->roid)) - continue; - - if (!git_odb_exists(push->repo->_odb, &spec->roid)) { - giterr_set(GITERR_REFERENCE, - "Cannot push because a reference that you are trying to update on the remote contains commits that are not present locally."); - error = GIT_ENONFASTFORWARD; - goto on_error; - } - - error = git_merge_base(&base, push->repo, - &spec->loid, &spec->roid); - - if (error == GIT_ENOTFOUND || - (!error && !git_oid_equal(&base, &spec->roid))) { - giterr_set(GITERR_REFERENCE, - "Cannot push non-fastforwardable reference"); - error = GIT_ENONFASTFORWARD; - goto on_error; - } - - if (error < 0) - goto on_error; - } - } - - git_vector_foreach(&push->remote->refs, i, head) { - if (git_oid_iszero(&head->oid)) - continue; - - /* TODO */ - git_revwalk_hide(rw, &head->oid); - } - - while ((error = git_revwalk_next(&oid, rw)) == 0) { - git_oid *o = git__malloc(GIT_OID_RAWSZ); - if (!o) { - error = -1; - goto on_error; - } - git_oid_cpy(o, &oid); - if ((error = git_vector_insert(commits, o)) < 0) - goto on_error; - } - -on_error: - git_revwalk_free(rw); - return error == GIT_ITEROVER ? 0 : error; -} - -static int enqueue_object( - const git_tree_entry *entry, - git_packbuilder *pb) -{ - switch (git_tree_entry_type(entry)) { - case GIT_OBJ_COMMIT: - return 0; - case GIT_OBJ_TREE: - return git_packbuilder_insert_tree(pb, &entry->oid); - default: - return git_packbuilder_insert(pb, &entry->oid, entry->filename); - } -} - -static int queue_differences( - git_tree *base, - git_tree *delta, - git_packbuilder *pb) -{ - git_tree *b_child = NULL, *d_child = NULL; - size_t b_length = git_tree_entrycount(base); - size_t d_length = git_tree_entrycount(delta); - size_t i = 0, j = 0; - int error; - - while (i < b_length && j < d_length) { - const git_tree_entry *b_entry = git_tree_entry_byindex(base, i); - const git_tree_entry *d_entry = git_tree_entry_byindex(delta, j); - int cmp = 0; - - if (!git_oid__cmp(&b_entry->oid, &d_entry->oid)) - goto loop; - - cmp = strcmp(b_entry->filename, d_entry->filename); - - /* If the entries are both trees and they have the same name but are - * different, then we'll recurse after adding the right-hand entry */ - if (!cmp && - git_tree_entry__is_tree(b_entry) && - git_tree_entry__is_tree(d_entry)) { - /* Add the right-hand entry */ - if ((error = git_packbuilder_insert(pb, &d_entry->oid, - d_entry->filename)) < 0) - goto on_error; - - /* Acquire the subtrees and recurse */ - if ((error = git_tree_lookup(&b_child, - git_tree_owner(base), &b_entry->oid)) < 0 || - (error = git_tree_lookup(&d_child, - git_tree_owner(delta), &d_entry->oid)) < 0 || - (error = queue_differences(b_child, d_child, pb)) < 0) - goto on_error; - - git_tree_free(b_child); b_child = NULL; - git_tree_free(d_child); d_child = NULL; - } - /* If the object is new or different in the right-hand tree, - * then enumerate it */ - else if (cmp >= 0 && - (error = enqueue_object(d_entry, pb)) < 0) - goto on_error; - - loop: - if (cmp <= 0) i++; - if (cmp >= 0) j++; - } - - /* Drain the right-hand tree of entries */ - for (; j < d_length; j++) - if ((error = enqueue_object(git_tree_entry_byindex(delta, j), pb)) < 0) - goto on_error; - - error = 0; - -on_error: - if (b_child) - git_tree_free(b_child); - - if (d_child) - git_tree_free(d_child); - - return error; -} - -static int queue_objects(git_push *push) -{ - git_vector commits = GIT_VECTOR_INIT; - git_oid *oid; - size_t i; - unsigned j; - int error; - - if ((error = revwalk(&commits, push)) < 0) - goto on_error; - - git_vector_foreach(&commits, i, oid) { - git_commit *parent = NULL, *commit; - git_tree *tree = NULL, *ptree = NULL; - size_t parentcount; - - if ((error = git_commit_lookup(&commit, push->repo, oid)) < 0) - goto on_error; - - /* Insert the commit */ - if ((error = git_packbuilder_insert(push->pb, oid, NULL)) < 0) - goto loop_error; - - parentcount = git_commit_parentcount(commit); - - if (!parentcount) { - if ((error = git_packbuilder_insert_tree(push->pb, - git_commit_tree_id(commit))) < 0) - goto loop_error; - } else { - if ((error = git_tree_lookup(&tree, push->repo, - git_commit_tree_id(commit))) < 0 || - (error = git_packbuilder_insert(push->pb, - git_commit_tree_id(commit), NULL)) < 0) - goto loop_error; - - /* For each parent, add the items which are different */ - for (j = 0; j < parentcount; j++) { - if ((error = git_commit_parent(&parent, commit, j)) < 0 || - (error = git_commit_tree(&ptree, parent)) < 0 || - (error = queue_differences(ptree, tree, push->pb)) < 0) - goto loop_error; - - git_tree_free(ptree); ptree = NULL; - git_commit_free(parent); parent = NULL; - } - } - - error = 0; - - loop_error: - if (tree) - git_tree_free(tree); - - if (ptree) - git_tree_free(ptree); - - if (parent) - git_commit_free(parent); - - git_commit_free(commit); - - if (error < 0) - goto on_error; - } - - error = 0; - -on_error: - git_vector_free_deep(&commits); - return error; -} - -static int add_update(git_push *push, push_spec *spec) -{ - git_push_update *u = git__calloc(1, sizeof(git_push_update)); - GITERR_CHECK_ALLOC(u); - - u->src_refname = git__strdup(spec->refspec.src); - GITERR_CHECK_ALLOC(u->src_refname); - - u->dst_refname = git__strdup(spec->refspec.dst); - GITERR_CHECK_ALLOC(u->dst_refname); - - git_oid_cpy(&u->src, &spec->roid); - git_oid_cpy(&u->dst, &spec->loid); - - return git_vector_insert(&push->updates, u); -} - -static int calculate_work(git_push *push) -{ - git_remote_head *head; - push_spec *spec; - unsigned int i, j; - - /* Update local and remote oids*/ - - git_vector_foreach(&push->specs, i, spec) { - if (spec->refspec.src && spec->refspec.src[0]!= '\0') { - /* This is a create or update. Local ref must exist. */ - if (git_reference_name_to_id( - &spec->loid, push->repo, spec->refspec.src) < 0) { - giterr_set(GITERR_REFERENCE, "No such reference '%s'", spec->refspec.src); - return -1; - } - } - - /* Remote ref may or may not (e.g. during create) already exist. */ - git_vector_foreach(&push->remote->refs, j, head) { - if (!strcmp(spec->refspec.dst, head->name)) { - git_oid_cpy(&spec->roid, &head->oid); - break; - } - } - - if (add_update(push, spec) < 0) - return -1; - } - - return 0; -} - -static int do_push(git_push *push, const git_remote_callbacks *callbacks) -{ - int error = 0; - git_transport *transport = push->remote->transport; - - if (!transport->push) { - giterr_set(GITERR_NET, "Remote transport doesn't support push"); - error = -1; - goto on_error; - } - - /* - * A pack-file MUST be sent if either create or update command - * is used, even if the server already has all the necessary - * objects. In this case the client MUST send an empty pack-file. - */ - - if ((error = git_packbuilder_new(&push->pb, push->repo)) < 0) - goto on_error; - - git_packbuilder_set_threads(push->pb, push->pb_parallelism); - - if (callbacks && callbacks->pack_progress) - if ((error = git_packbuilder_set_callbacks(push->pb, callbacks->pack_progress, callbacks->payload)) < 0) - goto on_error; - - if ((error = calculate_work(push)) < 0) - goto on_error; - - if (callbacks && callbacks->push_negotiation && - (error = callbacks->push_negotiation((const git_push_update **) push->updates.contents, - push->updates.length, callbacks->payload)) < 0) - goto on_error; - - if ((error = queue_objects(push)) < 0 || - (error = transport->push(transport, push, callbacks)) < 0) - goto on_error; - -on_error: - git_packbuilder_free(push->pb); - return error; -} - -static int filter_refs(git_remote *remote) -{ - const git_remote_head **heads; - size_t heads_len, i; - - git_vector_clear(&remote->refs); - - if (git_remote_ls(&heads, &heads_len, remote) < 0) - return -1; - - for (i = 0; i < heads_len; i++) { - if (git_vector_insert(&remote->refs, (void *)heads[i]) < 0) - return -1; - } - - return 0; -} - -int git_push_finish(git_push *push, const git_remote_callbacks *callbacks) -{ - int error; - - if (!git_remote_connected(push->remote) && - (error = git_remote_connect(push->remote, GIT_DIRECTION_PUSH, callbacks)) < 0) - return error; - - if ((error = filter_refs(push->remote)) < 0 || - (error = do_push(push, callbacks)) < 0) - return error; - - if (!push->unpack_ok) { - error = -1; - giterr_set(GITERR_NET, "unpacking the sent packfile failed on the remote"); - } - - return error; -} - -int git_push_status_foreach(git_push *push, - int (*cb)(const char *ref, const char *msg, void *data), - void *data) -{ - push_status *status; - unsigned int i; - - git_vector_foreach(&push->status, i, status) { - int error = cb(status->ref, status->msg, data); - if (error) - return giterr_set_after_callback(error); - } - - return 0; -} - -void git_push_status_free(push_status *status) -{ - if (status == NULL) - return; - - git__free(status->msg); - git__free(status->ref); - git__free(status); -} - -void git_push_free(git_push *push) -{ - push_spec *spec; - push_status *status; - git_push_update *update; - unsigned int i; - - if (push == NULL) - return; - - git_vector_foreach(&push->specs, i, spec) { - free_refspec(spec); - } - git_vector_free(&push->specs); - - git_vector_foreach(&push->status, i, status) { - git_push_status_free(status); - } - git_vector_free(&push->status); - - git_vector_foreach(&push->updates, i, update) { - git__free(update->src_refname); - git__free(update->dst_refname); - git__free(update); - } - git_vector_free(&push->updates); - - git__free(push); -} - -int git_push_init_options(git_push_options *opts, unsigned int version) -{ - GIT_INIT_STRUCTURE_FROM_TEMPLATE( - opts, version, git_push_options, GIT_PUSH_OPTIONS_INIT); - return 0; -} diff --git a/vendor/libgit2/src/push.h b/vendor/libgit2/src/push.h deleted file mode 100644 index a847ee0d08..0000000000 --- a/vendor/libgit2/src/push.h +++ /dev/null @@ -1,136 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_push_h__ -#define INCLUDE_push_h__ - -#include "git2.h" -#include "refspec.h" - -typedef struct push_spec { - struct git_refspec refspec; - - git_oid loid; - git_oid roid; -} push_spec; - -typedef struct push_status { - bool ok; - - char *ref; - char *msg; -} push_status; - -struct git_push { - git_repository *repo; - git_packbuilder *pb; - git_remote *remote; - git_vector specs; - git_vector updates; - bool report_status; - - /* report-status */ - bool unpack_ok; - git_vector status; - - /* options */ - unsigned pb_parallelism; -}; - -/** - * Free the given push status object - * - * @param status The push status object - */ -void git_push_status_free(push_status *status); - -/** - * Create a new push object - * - * @param out New push object - * @param remote Remote instance - * - * @return 0 or an error code - */ -int git_push_new(git_push **out, git_remote *remote); - -/** - * Set options on a push object - * - * @param push The push object - * @param opts The options to set on the push object - * - * @return 0 or an error code - */ -int git_push_set_options( - git_push *push, - const git_push_options *opts); - -/** - * Add a refspec to be pushed - * - * @param push The push object - * @param refspec Refspec string - * - * @return 0 or an error code - */ -int git_push_add_refspec(git_push *push, const char *refspec); - -/** - * Update remote tips after a push - * - * @param push The push object - * @param callbacks the callbacks to use for this connection - * - * @return 0 or an error code - */ -int git_push_update_tips(git_push *push, const git_remote_callbacks *callbacks); - -/** - * Perform the push - * - * This function will return an error in case of a protocol error or - * the server being unable to unpack the data we sent. - * - * The return value does not reflect whether the server accepted or - * refused any reference updates. Use `git_push_status_foreach()` in - * order to find out which updates were accepted or rejected. - * - * @param push The push object - * @param callbacks the callbacks to use for this connection - * - * @return 0 or an error code - */ -int git_push_finish(git_push *push, const git_remote_callbacks *callbacks); - -/** - * Invoke callback `cb' on each status entry - * - * For each of the updated references, we receive a status report in the - * form of `ok refs/heads/master` or `ng refs/heads/master `. - * `msg != NULL` means the reference has not been updated for the given - * reason. - * - * Return a non-zero value from the callback to stop the loop. - * - * @param push The push object - * @param cb The callback to call on each object - * @param data The payload passed to the callback - * - * @return 0 on success, non-zero callback return value, or error code - */ -int git_push_status_foreach(git_push *push, - int (*cb)(const char *ref, const char *msg, void *data), - void *data); - -/** - * Free the given push object - * - * @param push The push object - */ -void git_push_free(git_push *push); - -#endif diff --git a/vendor/libgit2/src/rebase.c b/vendor/libgit2/src/rebase.c deleted file mode 100644 index 17536c0305..0000000000 --- a/vendor/libgit2/src/rebase.c +++ /dev/null @@ -1,1191 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#include "common.h" -#include "buffer.h" -#include "repository.h" -#include "posix.h" -#include "filebuf.h" -#include "merge.h" -#include "array.h" -#include "config.h" -#include "annotated_commit.h" -#include "index.h" - -#include -#include -#include -#include -#include -#include -#include - -#define REBASE_APPLY_DIR "rebase-apply" -#define REBASE_MERGE_DIR "rebase-merge" - -#define HEAD_NAME_FILE "head-name" -#define ORIG_HEAD_FILE "orig-head" -#define HEAD_FILE "head" -#define ONTO_FILE "onto" -#define ONTO_NAME_FILE "onto_name" -#define QUIET_FILE "quiet" - -#define MSGNUM_FILE "msgnum" -#define END_FILE "end" -#define CMT_FILE_FMT "cmt.%" PRIuZ -#define CURRENT_FILE "current" -#define REWRITTEN_FILE "rewritten" - -#define ORIG_DETACHED_HEAD "detached HEAD" - -#define NOTES_DEFAULT_REF NULL - -#define REBASE_DIR_MODE 0777 -#define REBASE_FILE_MODE 0666 - -typedef enum { - GIT_REBASE_TYPE_NONE = 0, - GIT_REBASE_TYPE_APPLY = 1, - GIT_REBASE_TYPE_MERGE = 2, - GIT_REBASE_TYPE_INTERACTIVE = 3, -} git_rebase_type_t; - -struct git_rebase { - git_repository *repo; - - git_rebase_options options; - - git_rebase_type_t type; - char *state_path; - - int head_detached : 1, - quiet : 1, - started : 1; - - char *orig_head_name; - git_oid orig_head_id; - - git_oid onto_id; - char *onto_name; - - git_array_t(git_rebase_operation) operations; - size_t current; -}; - -#define GIT_REBASE_STATE_INIT {0} - -static int rebase_state_type( - git_rebase_type_t *type_out, - char **path_out, - git_repository *repo) -{ - git_buf path = GIT_BUF_INIT; - git_rebase_type_t type = GIT_REBASE_TYPE_NONE; - - if (git_buf_joinpath(&path, repo->path_repository, REBASE_APPLY_DIR) < 0) - return -1; - - if (git_path_isdir(git_buf_cstr(&path))) { - type = GIT_REBASE_TYPE_APPLY; - goto done; - } - - git_buf_clear(&path); - if (git_buf_joinpath(&path, repo->path_repository, REBASE_MERGE_DIR) < 0) - return -1; - - if (git_path_isdir(git_buf_cstr(&path))) { - type = GIT_REBASE_TYPE_MERGE; - goto done; - } - -done: - *type_out = type; - - if (type != GIT_REBASE_TYPE_NONE && path_out) - *path_out = git_buf_detach(&path); - - git_buf_free(&path); - - return 0; -} - -GIT_INLINE(int) rebase_readfile( - git_buf *out, - git_buf *state_path, - const char *filename) -{ - size_t state_path_len = state_path->size; - int error; - - git_buf_clear(out); - - if ((error = git_buf_joinpath(state_path, state_path->ptr, filename)) < 0 || - (error = git_futils_readbuffer(out, state_path->ptr)) < 0) - goto done; - - git_buf_rtrim(out); - -done: - git_buf_truncate(state_path, state_path_len); - return error; -} - -GIT_INLINE(int) rebase_readint( - size_t *out, git_buf *asc_out, git_buf *state_path, const char *filename) -{ - int32_t num; - const char *eol; - int error = 0; - - if ((error = rebase_readfile(asc_out, state_path, filename)) < 0) - return error; - - if (git__strtol32(&num, asc_out->ptr, &eol, 10) < 0 || num < 0 || *eol) { - giterr_set(GITERR_REBASE, "The file '%s' contains an invalid numeric value", filename); - return -1; - } - - *out = (size_t) num; - - return 0; -} - -GIT_INLINE(int) rebase_readoid( - git_oid *out, git_buf *str_out, git_buf *state_path, const char *filename) -{ - int error; - - if ((error = rebase_readfile(str_out, state_path, filename)) < 0) - return error; - - if (str_out->size != GIT_OID_HEXSZ || git_oid_fromstr(out, str_out->ptr) < 0) { - giterr_set(GITERR_REBASE, "The file '%s' contains an invalid object ID", filename); - return -1; - } - - return 0; -} - -static git_rebase_operation *rebase_operation_alloc( - git_rebase *rebase, - git_rebase_operation_t type, - git_oid *id, - const char *exec) -{ - git_rebase_operation *operation; - - assert((type == GIT_REBASE_OPERATION_EXEC) == !id); - assert((type == GIT_REBASE_OPERATION_EXEC) == !!exec); - - if ((operation = git_array_alloc(rebase->operations)) == NULL) - return NULL; - - operation->type = type; - git_oid_cpy((git_oid *)&operation->id, id); - operation->exec = exec; - - return operation; -} - -static int rebase_open_merge(git_rebase *rebase) -{ - git_buf state_path = GIT_BUF_INIT, buf = GIT_BUF_INIT, cmt = GIT_BUF_INIT; - git_oid id; - git_rebase_operation *operation; - size_t i, msgnum = 0, end; - int error; - - if ((error = git_buf_puts(&state_path, rebase->state_path)) < 0) - goto done; - - /* Read 'msgnum' if it exists (otherwise, let msgnum = 0) */ - if ((error = rebase_readint(&msgnum, &buf, &state_path, MSGNUM_FILE)) < 0 && - error != GIT_ENOTFOUND) - goto done; - - if (msgnum) { - rebase->started = 1; - rebase->current = msgnum - 1; - } - - /* Read 'end' */ - if ((error = rebase_readint(&end, &buf, &state_path, END_FILE)) < 0) - goto done; - - /* Read 'current' if it exists */ - if ((error = rebase_readoid(&id, &buf, &state_path, CURRENT_FILE)) < 0 && - error != GIT_ENOTFOUND) - goto done; - - /* Read cmt.* */ - git_array_init_to_size(rebase->operations, end); - GITERR_CHECK_ARRAY(rebase->operations); - - for (i = 0; i < end; i++) { - git_buf_clear(&cmt); - - if ((error = git_buf_printf(&cmt, "cmt.%" PRIuZ, (i+1))) < 0 || - (error = rebase_readoid(&id, &buf, &state_path, cmt.ptr)) < 0) - goto done; - - operation = rebase_operation_alloc(rebase, GIT_REBASE_OPERATION_PICK, &id, NULL); - GITERR_CHECK_ALLOC(operation); - } - - /* Read 'onto_name' */ - if ((error = rebase_readfile(&buf, &state_path, ONTO_NAME_FILE)) < 0) - goto done; - - rebase->onto_name = git_buf_detach(&buf); - -done: - git_buf_free(&cmt); - git_buf_free(&state_path); - git_buf_free(&buf); - - return error; -} - -static git_rebase *rebase_alloc(const git_rebase_options *rebase_opts) -{ - git_rebase *rebase = git__calloc(1, sizeof(git_rebase)); - - if (!rebase) - return NULL; - - if (rebase_opts) - memcpy(&rebase->options, rebase_opts, sizeof(git_rebase_options)); - else - git_rebase_init_options(&rebase->options, GIT_REBASE_OPTIONS_VERSION); - - if (rebase_opts && rebase_opts->rewrite_notes_ref) { - if ((rebase->options.rewrite_notes_ref = git__strdup(rebase_opts->rewrite_notes_ref)) == NULL) - return NULL; - } - - if ((rebase->options.checkout_options.checkout_strategy & (GIT_CHECKOUT_SAFE | GIT_CHECKOUT_FORCE)) == 0) - rebase->options.checkout_options.checkout_strategy = GIT_CHECKOUT_SAFE; - - return rebase; -} - -static int rebase_check_versions(const git_rebase_options *given_opts) -{ - GITERR_CHECK_VERSION(given_opts, GIT_REBASE_OPTIONS_VERSION, "git_rebase_options"); - - if (given_opts) - GITERR_CHECK_VERSION(&given_opts->checkout_options, GIT_CHECKOUT_OPTIONS_VERSION, "git_checkout_options"); - - return 0; -} - -int git_rebase_open( - git_rebase **out, - git_repository *repo, - const git_rebase_options *given_opts) -{ - git_rebase *rebase; - git_buf path = GIT_BUF_INIT, orig_head_name = GIT_BUF_INIT, - orig_head_id = GIT_BUF_INIT, onto_id = GIT_BUF_INIT; - int state_path_len, error; - - assert(repo); - - if ((error = rebase_check_versions(given_opts)) < 0) - return error; - - rebase = rebase_alloc(given_opts); - GITERR_CHECK_ALLOC(rebase); - - rebase->repo = repo; - - if ((error = rebase_state_type(&rebase->type, &rebase->state_path, repo)) < 0) - goto done; - - if (rebase->type == GIT_REBASE_TYPE_NONE) { - giterr_set(GITERR_REBASE, "There is no rebase in progress"); - error = GIT_ENOTFOUND; - goto done; - } - - if ((error = git_buf_puts(&path, rebase->state_path)) < 0) - goto done; - - state_path_len = git_buf_len(&path); - - if ((error = git_buf_joinpath(&path, path.ptr, HEAD_NAME_FILE)) < 0 || - (error = git_futils_readbuffer(&orig_head_name, path.ptr)) < 0) - goto done; - - git_buf_rtrim(&orig_head_name); - - if (strcmp(ORIG_DETACHED_HEAD, orig_head_name.ptr) == 0) - rebase->head_detached = 1; - - git_buf_truncate(&path, state_path_len); - - if ((error = git_buf_joinpath(&path, path.ptr, ORIG_HEAD_FILE)) < 0) - goto done; - - if (!git_path_isfile(path.ptr)) { - /* Previous versions of git.git used 'head' here; support that. */ - git_buf_truncate(&path, state_path_len); - - if ((error = git_buf_joinpath(&path, path.ptr, HEAD_FILE)) < 0) - goto done; - } - - if ((error = git_futils_readbuffer(&orig_head_id, path.ptr)) < 0) - goto done; - - git_buf_rtrim(&orig_head_id); - - if ((error = git_oid_fromstr(&rebase->orig_head_id, orig_head_id.ptr)) < 0) - goto done; - - git_buf_truncate(&path, state_path_len); - - if ((error = git_buf_joinpath(&path, path.ptr, ONTO_FILE)) < 0 || - (error = git_futils_readbuffer(&onto_id, path.ptr)) < 0) - goto done; - - git_buf_rtrim(&onto_id); - - if ((error = git_oid_fromstr(&rebase->onto_id, onto_id.ptr)) < 0) - goto done; - - if (!rebase->head_detached) - rebase->orig_head_name = git_buf_detach(&orig_head_name); - - switch (rebase->type) { - case GIT_REBASE_TYPE_INTERACTIVE: - giterr_set(GITERR_REBASE, "Interactive rebase is not supported"); - error = -1; - break; - case GIT_REBASE_TYPE_MERGE: - error = rebase_open_merge(rebase); - break; - case GIT_REBASE_TYPE_APPLY: - giterr_set(GITERR_REBASE, "Patch application rebase is not supported"); - error = -1; - break; - default: - abort(); - } - -done: - if (error == 0) - *out = rebase; - else - git_rebase_free(rebase); - - git_buf_free(&path); - git_buf_free(&orig_head_name); - git_buf_free(&orig_head_id); - git_buf_free(&onto_id); - return error; -} - -static int rebase_cleanup(git_rebase *rebase) -{ - return git_path_isdir(rebase->state_path) ? - git_futils_rmdir_r(rebase->state_path, NULL, GIT_RMDIR_REMOVE_FILES) : - 0; -} - -static int rebase_setupfile(git_rebase *rebase, const char *filename, int flags, const char *fmt, ...) -{ - git_buf path = GIT_BUF_INIT, - contents = GIT_BUF_INIT; - va_list ap; - int error; - - va_start(ap, fmt); - git_buf_vprintf(&contents, fmt, ap); - va_end(ap); - - if ((error = git_buf_joinpath(&path, rebase->state_path, filename)) == 0) - error = git_futils_writebuffer(&contents, path.ptr, flags, REBASE_FILE_MODE); - - git_buf_free(&path); - git_buf_free(&contents); - - return error; -} - -static const char *rebase_onto_name(const git_annotated_commit *onto) -{ - if (onto->ref_name && git__strncmp(onto->ref_name, "refs/heads/", 11) == 0) - return onto->ref_name + 11; - else if (onto->ref_name) - return onto->ref_name; - else - return onto->id_str; -} - -static int rebase_setupfiles_merge(git_rebase *rebase) -{ - git_buf commit_filename = GIT_BUF_INIT; - char id_str[GIT_OID_HEXSZ]; - git_rebase_operation *operation; - size_t i; - int error = 0; - - if ((error = rebase_setupfile(rebase, END_FILE, -1, "%" PRIuZ "\n", git_array_size(rebase->operations))) < 0 || - (error = rebase_setupfile(rebase, ONTO_NAME_FILE, -1, "%s\n", rebase->onto_name)) < 0) - goto done; - - for (i = 0; i < git_array_size(rebase->operations); i++) { - operation = git_array_get(rebase->operations, i); - - git_buf_clear(&commit_filename); - git_buf_printf(&commit_filename, CMT_FILE_FMT, i+1); - - git_oid_fmt(id_str, &operation->id); - - if ((error = rebase_setupfile(rebase, commit_filename.ptr, -1, - "%.*s\n", GIT_OID_HEXSZ, id_str)) < 0) - goto done; - } - -done: - git_buf_free(&commit_filename); - return error; -} - -static int rebase_setupfiles(git_rebase *rebase) -{ - char onto[GIT_OID_HEXSZ], orig_head[GIT_OID_HEXSZ]; - - git_oid_fmt(onto, &rebase->onto_id); - git_oid_fmt(orig_head, &rebase->orig_head_id); - - if (p_mkdir(rebase->state_path, REBASE_DIR_MODE) < 0) { - giterr_set(GITERR_OS, "Failed to create rebase directory '%s'", rebase->state_path); - return -1; - } - - if (git_repository__set_orig_head(rebase->repo, &rebase->orig_head_id) < 0 || - rebase_setupfile(rebase, HEAD_NAME_FILE, -1, "%s\n", rebase->orig_head_name) < 0 || - rebase_setupfile(rebase, ONTO_FILE, -1, "%.*s\n", GIT_OID_HEXSZ, onto) < 0 || - rebase_setupfile(rebase, ORIG_HEAD_FILE, -1, "%.*s\n", GIT_OID_HEXSZ, orig_head) < 0 || - rebase_setupfile(rebase, QUIET_FILE, -1, rebase->quiet ? "t\n" : "\n") < 0) - return -1; - - return rebase_setupfiles_merge(rebase); -} - -int git_rebase_init_options(git_rebase_options *opts, unsigned int version) -{ - GIT_INIT_STRUCTURE_FROM_TEMPLATE( - opts, version, git_rebase_options, GIT_REBASE_OPTIONS_INIT); - return 0; -} - -static int rebase_ensure_not_in_progress(git_repository *repo) -{ - int error; - git_rebase_type_t type; - - if ((error = rebase_state_type(&type, NULL, repo)) < 0) - return error; - - if (type != GIT_REBASE_TYPE_NONE) { - giterr_set(GITERR_REBASE, "There is an existing rebase in progress"); - return -1; - } - - return 0; -} - -static int rebase_ensure_not_dirty( - git_repository *repo, - bool check_index, - bool check_workdir, - int fail_with) -{ - git_tree *head = NULL; - git_index *index = NULL; - git_diff *diff = NULL; - int error = 0; - - if (check_index) { - if ((error = git_repository_head_tree(&head, repo)) < 0 || - (error = git_repository_index(&index, repo)) < 0 || - (error = git_diff_tree_to_index(&diff, repo, head, index, NULL)) < 0) - goto done; - - if (git_diff_num_deltas(diff) > 0) { - giterr_set(GITERR_REBASE, "Uncommitted changes exist in index"); - error = fail_with; - goto done; - } - - git_diff_free(diff); - diff = NULL; - } - - if (check_workdir) { - if ((error = git_diff_index_to_workdir(&diff, repo, index, NULL)) < 0) - goto done; - - if (git_diff_num_deltas(diff) > 0) { - giterr_set(GITERR_REBASE, "Unstaged changes exist in workdir"); - error = fail_with; - goto done; - } - } - -done: - git_diff_free(diff); - git_index_free(index); - git_tree_free(head); - - return error; -} - -static int rebase_init_operations( - git_rebase *rebase, - git_repository *repo, - const git_annotated_commit *branch, - const git_annotated_commit *upstream, - const git_annotated_commit *onto) -{ - git_revwalk *revwalk = NULL; - git_commit *commit; - git_oid id; - bool merge; - git_rebase_operation *operation; - int error; - - if (!upstream) - upstream = onto; - - if ((error = git_revwalk_new(&revwalk, rebase->repo)) < 0 || - (error = git_revwalk_push(revwalk, git_annotated_commit_id(branch))) < 0 || - (error = git_revwalk_hide(revwalk, git_annotated_commit_id(upstream))) < 0) - goto done; - - git_revwalk_sorting(revwalk, GIT_SORT_REVERSE | GIT_SORT_TIME); - - while ((error = git_revwalk_next(&id, revwalk)) == 0) { - if ((error = git_commit_lookup(&commit, repo, &id)) < 0) - goto done; - - merge = (git_commit_parentcount(commit) > 1); - git_commit_free(commit); - - if (merge) - continue; - - operation = rebase_operation_alloc(rebase, GIT_REBASE_OPERATION_PICK, &id, NULL); - GITERR_CHECK_ALLOC(operation); - } - - error = 0; - -done: - git_revwalk_free(revwalk); - return error; -} - -static int rebase_init_merge( - git_rebase *rebase, - git_repository *repo, - const git_annotated_commit *branch, - const git_annotated_commit *upstream, - const git_annotated_commit *onto) -{ - if (rebase_init_operations(rebase, repo, branch, upstream, onto) < 0) - return -1; - - rebase->onto_name = git__strdup(rebase_onto_name(onto)); - GITERR_CHECK_ALLOC(rebase->onto_name); - - return 0; -} - -static int rebase_init( - git_rebase *rebase, - git_repository *repo, - const git_annotated_commit *branch, - const git_annotated_commit *upstream, - const git_annotated_commit *onto) -{ - git_reference *head_ref = NULL; - git_annotated_commit *head_branch = NULL; - git_buf state_path = GIT_BUF_INIT; - int error; - - if ((error = git_buf_joinpath(&state_path, repo->path_repository, REBASE_MERGE_DIR)) < 0) - goto done; - - if (!branch) { - if ((error = git_repository_head(&head_ref, repo)) < 0 || - (error = git_annotated_commit_from_ref(&head_branch, repo, head_ref)) < 0) - goto done; - - branch = head_branch; - } - - rebase->repo = repo; - rebase->type = GIT_REBASE_TYPE_MERGE; - rebase->state_path = git_buf_detach(&state_path); - rebase->orig_head_name = git__strdup(branch->ref_name ? branch->ref_name : ORIG_DETACHED_HEAD); - rebase->quiet = rebase->options.quiet; - - git_oid_cpy(&rebase->orig_head_id, git_annotated_commit_id(branch)); - git_oid_cpy(&rebase->onto_id, git_annotated_commit_id(onto)); - - if (!rebase->orig_head_name || !rebase->state_path) - return -1; - - error = rebase_init_merge(rebase, repo, branch, upstream, onto); - - git_buf_free(&state_path); - -done: - git_reference_free(head_ref); - git_annotated_commit_free(head_branch); - - return error; -} - -int git_rebase_init( - git_rebase **out, - git_repository *repo, - const git_annotated_commit *branch, - const git_annotated_commit *upstream, - const git_annotated_commit *onto, - const git_rebase_options *given_opts) -{ - git_rebase *rebase = NULL; - git_buf reflog = GIT_BUF_INIT; - git_commit *onto_commit = NULL; - git_reference *head_ref = NULL; - int error; - - assert(repo && (upstream || onto)); - - *out = NULL; - - if (!onto) - onto = upstream; - - if ((error = rebase_check_versions(given_opts)) < 0 || - (error = git_repository__ensure_not_bare(repo, "rebase")) < 0 || - (error = rebase_ensure_not_in_progress(repo)) < 0 || - (error = rebase_ensure_not_dirty(repo, true, true, GIT_ERROR)) < 0 || - (error = git_commit_lookup( - &onto_commit, repo, git_annotated_commit_id(onto))) < 0) - return error; - - rebase = rebase_alloc(given_opts); - - if ((error = rebase_init( - rebase, repo, branch, upstream, onto)) < 0 || - (error = rebase_setupfiles(rebase)) < 0 || - (error = git_buf_printf(&reflog, - "rebase: checkout %s", rebase_onto_name(onto))) < 0 || - (error = git_checkout_tree( - repo, (git_object *)onto_commit, &rebase->options.checkout_options)) < 0 || - (error = git_reference_create(&head_ref, repo, GIT_HEAD_FILE, - git_annotated_commit_id(onto), 1, reflog.ptr)) < 0) - goto done; - - *out = rebase; - -done: - git_reference_free(head_ref); - if (error < 0) { - rebase_cleanup(rebase); - git_rebase_free(rebase); - } - - git_commit_free(onto_commit); - git_buf_free(&reflog); - - return error; -} - -static void normalize_checkout_options_for_apply( - git_checkout_options *checkout_opts, - git_rebase *rebase, - git_commit *current_commit) -{ - memcpy(checkout_opts, &rebase->options.checkout_options, sizeof(git_checkout_options)); - - if (!checkout_opts->ancestor_label) - checkout_opts->ancestor_label = "ancestor"; - - if (rebase->type == GIT_REBASE_TYPE_MERGE) { - if (!checkout_opts->our_label) - checkout_opts->our_label = rebase->onto_name; - - if (!checkout_opts->their_label) - checkout_opts->their_label = git_commit_summary(current_commit); - } else { - abort(); - } -} - -GIT_INLINE(int) rebase_movenext(git_rebase *rebase) -{ - size_t next = rebase->started ? rebase->current + 1 : 0; - - if (next == git_array_size(rebase->operations)) - return GIT_ITEROVER; - - rebase->started = 1; - rebase->current = next; - - return 0; -} - -static int rebase_next_merge( - git_rebase_operation **out, - git_rebase *rebase) -{ - git_buf path = GIT_BUF_INIT; - git_commit *current_commit = NULL, *parent_commit = NULL; - git_tree *current_tree = NULL, *head_tree = NULL, *parent_tree = NULL; - git_index *index = NULL; - git_indexwriter indexwriter = GIT_INDEXWRITER_INIT; - git_rebase_operation *operation; - git_checkout_options checkout_opts; - char current_idstr[GIT_OID_HEXSZ]; - unsigned int parent_count; - int error; - - *out = NULL; - - if ((error = rebase_movenext(rebase)) < 0) - goto done; - - operation = git_array_get(rebase->operations, rebase->current); - - if ((error = git_commit_lookup(¤t_commit, rebase->repo, &operation->id)) < 0 || - (error = git_commit_tree(¤t_tree, current_commit)) < 0 || - (error = git_repository_head_tree(&head_tree, rebase->repo)) < 0) - goto done; - - if ((parent_count = git_commit_parentcount(current_commit)) > 1) { - giterr_set(GITERR_REBASE, "Cannot rebase a merge commit"); - error = -1; - goto done; - } else if (parent_count) { - if ((error = git_commit_parent(&parent_commit, current_commit, 0)) < 0 || - (error = git_commit_tree(&parent_tree, parent_commit)) < 0) - goto done; - } - - git_oid_fmt(current_idstr, &operation->id); - - normalize_checkout_options_for_apply(&checkout_opts, rebase, current_commit); - - if ((error = git_indexwriter_init_for_operation(&indexwriter, rebase->repo, &checkout_opts.checkout_strategy)) < 0 || - (error = rebase_setupfile(rebase, MSGNUM_FILE, -1, "%" PRIuZ "\n", rebase->current+1)) < 0 || - (error = rebase_setupfile(rebase, CURRENT_FILE, -1, "%.*s\n", GIT_OID_HEXSZ, current_idstr)) < 0 || - (error = git_merge_trees(&index, rebase->repo, parent_tree, head_tree, current_tree, NULL)) < 0 || - (error = git_merge__check_result(rebase->repo, index)) < 0 || - (error = git_checkout_index(rebase->repo, index, &checkout_opts)) < 0 || - (error = git_indexwriter_commit(&indexwriter)) < 0) - goto done; - - *out = operation; - -done: - git_indexwriter_cleanup(&indexwriter); - git_index_free(index); - git_tree_free(current_tree); - git_tree_free(head_tree); - git_tree_free(parent_tree); - git_commit_free(parent_commit); - git_commit_free(current_commit); - git_buf_free(&path); - - return error; -} - -int git_rebase_next( - git_rebase_operation **out, - git_rebase *rebase) -{ - int error; - - assert(out && rebase); - - switch (rebase->type) { - case GIT_REBASE_TYPE_MERGE: - error = rebase_next_merge(out, rebase); - break; - default: - abort(); - } - - return error; -} - -static int rebase_commit_merge( - git_oid *commit_id, - git_rebase *rebase, - const git_signature *author, - const git_signature *committer, - const char *message_encoding, - const char *message) -{ - git_index *index = NULL; - git_reference *head = NULL; - git_commit *current_commit = NULL, *head_commit = NULL, *commit = NULL; - git_rebase_operation *operation; - git_tree *head_tree = NULL, *tree = NULL; - git_diff *diff = NULL; - git_oid tree_id; - git_buf reflog_msg = GIT_BUF_INIT; - char old_idstr[GIT_OID_HEXSZ], new_idstr[GIT_OID_HEXSZ]; - int error; - - operation = git_array_get(rebase->operations, rebase->current); - assert(operation); - - if ((error = git_repository_index(&index, rebase->repo)) < 0) - goto done; - - if (git_index_has_conflicts(index)) { - giterr_set(GITERR_REBASE, "Conflicts have not been resolved"); - error = GIT_EUNMERGED; - goto done; - } - - if ((error = rebase_ensure_not_dirty(rebase->repo, false, true, GIT_EUNMERGED)) < 0 || - (error = git_commit_lookup(¤t_commit, rebase->repo, &operation->id)) < 0 || - (error = git_repository_head(&head, rebase->repo)) < 0 || - (error = git_reference_peel((git_object **)&head_commit, head, GIT_OBJ_COMMIT)) < 0 || - (error = git_commit_tree(&head_tree, head_commit)) < 0 || - (error = git_diff_tree_to_index(&diff, rebase->repo, head_tree, index, NULL)) < 0) - goto done; - - if (git_diff_num_deltas(diff) == 0) { - giterr_set(GITERR_REBASE, "This patch has already been applied"); - error = GIT_EAPPLIED; - goto done; - } - - if ((error = git_index_write_tree(&tree_id, index)) < 0 || - (error = git_tree_lookup(&tree, rebase->repo, &tree_id)) < 0) - goto done; - - if (!author) - author = git_commit_author(current_commit); - - if (!message) { - message_encoding = git_commit_message_encoding(current_commit); - message = git_commit_message(current_commit); - } - - if ((error = git_commit_create(commit_id, rebase->repo, NULL, author, - committer, message_encoding, message, tree, 1, - (const git_commit **)&head_commit)) < 0 || - (error = git_commit_lookup(&commit, rebase->repo, commit_id)) < 0 || - (error = git_reference__update_for_commit( - rebase->repo, NULL, "HEAD", commit_id, "rebase")) < 0) - goto done; - - git_oid_fmt(old_idstr, git_commit_id(current_commit)); - git_oid_fmt(new_idstr, commit_id); - - error = rebase_setupfile(rebase, REWRITTEN_FILE, O_CREAT|O_WRONLY|O_APPEND, - "%.*s %.*s\n", GIT_OID_HEXSZ, old_idstr, GIT_OID_HEXSZ, new_idstr); - -done: - git_buf_free(&reflog_msg); - git_commit_free(commit); - git_diff_free(diff); - git_tree_free(tree); - git_tree_free(head_tree); - git_commit_free(head_commit); - git_commit_free(current_commit); - git_reference_free(head); - git_index_free(index); - - return error; -} - -int git_rebase_commit( - git_oid *id, - git_rebase *rebase, - const git_signature *author, - const git_signature *committer, - const char *message_encoding, - const char *message) -{ - int error; - - assert(rebase && committer); - - switch (rebase->type) { - case GIT_REBASE_TYPE_MERGE: - error = rebase_commit_merge( - id, rebase, author, committer, message_encoding, message); - break; - default: - abort(); - } - - return error; -} - -int git_rebase_abort(git_rebase *rebase) -{ - git_reference *orig_head_ref = NULL; - git_commit *orig_head_commit = NULL; - int error; - - assert(rebase); - - error = rebase->head_detached ? - git_reference_create(&orig_head_ref, rebase->repo, GIT_HEAD_FILE, - &rebase->orig_head_id, 1, "rebase: aborting") : - git_reference_symbolic_create( - &orig_head_ref, rebase->repo, GIT_HEAD_FILE, rebase->orig_head_name, 1, - "rebase: aborting"); - - if (error < 0) - goto done; - - if ((error = git_commit_lookup( - &orig_head_commit, rebase->repo, &rebase->orig_head_id)) < 0 || - (error = git_reset(rebase->repo, (git_object *)orig_head_commit, - GIT_RESET_HARD, &rebase->options.checkout_options)) < 0) - goto done; - - error = rebase_cleanup(rebase); - -done: - git_commit_free(orig_head_commit); - git_reference_free(orig_head_ref); - - return error; -} - -static int notes_ref_lookup(git_buf *out, git_rebase *rebase) -{ - git_config *config = NULL; - int do_rewrite, error; - - if (rebase->options.rewrite_notes_ref) { - git_buf_attach_notowned(out, - rebase->options.rewrite_notes_ref, - strlen(rebase->options.rewrite_notes_ref)); - return 0; - } - - if ((error = git_repository_config(&config, rebase->repo)) < 0 || - (error = git_config_get_bool(&do_rewrite, config, "notes.rewrite.rebase")) < 0) { - - if (error != GIT_ENOTFOUND) - goto done; - - giterr_clear(); - do_rewrite = 1; - } - - error = do_rewrite ? - git_config_get_string_buf(out, config, "notes.rewriteref") : - GIT_ENOTFOUND; - -done: - git_config_free(config); - return error; -} - -static int rebase_copy_note( - git_rebase *rebase, - const char *notes_ref, - git_oid *from, - git_oid *to, - const git_signature *committer) -{ - git_note *note = NULL; - git_oid note_id; - git_signature *who = NULL; - int error; - - if ((error = git_note_read(¬e, rebase->repo, notes_ref, from)) < 0) { - if (error == GIT_ENOTFOUND) { - giterr_clear(); - error = 0; - } - - goto done; - } - - if (!committer) { - if((error = git_signature_default(&who, rebase->repo)) < 0) { - if (error != GIT_ENOTFOUND || - (error = git_signature_now(&who, "unknown", "unknown")) < 0) - goto done; - - giterr_clear(); - } - - committer = who; - } - - error = git_note_create(¬e_id, rebase->repo, notes_ref, - git_note_author(note), committer, to, git_note_message(note), 0); - -done: - git_note_free(note); - git_signature_free(who); - - return error; -} - -static int rebase_copy_notes( - git_rebase *rebase, - const git_signature *committer) -{ - git_buf path = GIT_BUF_INIT, rewritten = GIT_BUF_INIT, notes_ref = GIT_BUF_INIT; - char *pair_list, *fromstr, *tostr, *end; - git_oid from, to; - unsigned int linenum = 1; - int error = 0; - - if ((error = notes_ref_lookup(¬es_ref, rebase)) < 0) { - if (error == GIT_ENOTFOUND) { - giterr_clear(); - error = 0; - } - - goto done; - } - - if ((error = git_buf_joinpath(&path, rebase->state_path, REWRITTEN_FILE)) < 0 || - (error = git_futils_readbuffer(&rewritten, path.ptr)) < 0) - goto done; - - pair_list = rewritten.ptr; - - while (*pair_list) { - fromstr = pair_list; - - if ((end = strchr(fromstr, '\n')) == NULL) - goto on_error; - - pair_list = end+1; - *end = '\0'; - - if ((end = strchr(fromstr, ' ')) == NULL) - goto on_error; - - tostr = end+1; - *end = '\0'; - - if (strlen(fromstr) != GIT_OID_HEXSZ || - strlen(tostr) != GIT_OID_HEXSZ || - git_oid_fromstr(&from, fromstr) < 0 || - git_oid_fromstr(&to, tostr) < 0) - goto on_error; - - if ((error = rebase_copy_note(rebase, notes_ref.ptr, &from, &to, committer)) < 0) - goto done; - - linenum++; - } - - goto done; - -on_error: - giterr_set(GITERR_REBASE, "Invalid rewritten file at line %d", linenum); - error = -1; - -done: - git_buf_free(&rewritten); - git_buf_free(&path); - git_buf_free(¬es_ref); - - return error; -} - -int git_rebase_finish( - git_rebase *rebase, - const git_signature *signature) -{ - git_reference *terminal_ref = NULL, *branch_ref = NULL, *head_ref = NULL; - git_commit *terminal_commit = NULL; - git_buf branch_msg = GIT_BUF_INIT, head_msg = GIT_BUF_INIT; - char onto[GIT_OID_HEXSZ]; - int error; - - assert(rebase); - - git_oid_fmt(onto, &rebase->onto_id); - - if ((error = git_buf_printf(&branch_msg, "rebase finished: %s onto %.*s", - rebase->orig_head_name, GIT_OID_HEXSZ, onto)) < 0 || - (error = git_buf_printf(&head_msg, "rebase finished: returning to %s", - rebase->orig_head_name)) < 0 || - (error = git_repository_head(&terminal_ref, rebase->repo)) < 0 || - (error = git_reference_peel((git_object **)&terminal_commit, - terminal_ref, GIT_OBJ_COMMIT)) < 0 || - (error = git_reference_create_matching(&branch_ref, - rebase->repo, rebase->orig_head_name, git_commit_id(terminal_commit), 1, - &rebase->orig_head_id, branch_msg.ptr)) < 0 || - (error = git_reference_symbolic_create(&head_ref, - rebase->repo, GIT_HEAD_FILE, rebase->orig_head_name, 1, - head_msg.ptr)) < 0 || - (error = rebase_copy_notes(rebase, signature)) < 0) - goto done; - - error = rebase_cleanup(rebase); - -done: - git_buf_free(&head_msg); - git_buf_free(&branch_msg); - git_commit_free(terminal_commit); - git_reference_free(head_ref); - git_reference_free(branch_ref); - git_reference_free(terminal_ref); - - return error; -} - -size_t git_rebase_operation_entrycount(git_rebase *rebase) -{ - assert(rebase); - - return git_array_size(rebase->operations); -} - -size_t git_rebase_operation_current(git_rebase *rebase) -{ - assert(rebase); - - return rebase->started ? rebase->current : GIT_REBASE_NO_OPERATION; -} - -git_rebase_operation *git_rebase_operation_byindex(git_rebase *rebase, size_t idx) -{ - assert(rebase); - - return git_array_get(rebase->operations, idx); -} - -void git_rebase_free(git_rebase *rebase) -{ - if (rebase == NULL) - return; - - git__free(rebase->onto_name); - git__free(rebase->orig_head_name); - git__free(rebase->state_path); - git_array_clear(rebase->operations); - git__free((char *)rebase->options.rewrite_notes_ref); - git__free(rebase); -} diff --git a/vendor/libgit2/src/refdb.c b/vendor/libgit2/src/refdb.c deleted file mode 100644 index 16fb519a69..0000000000 --- a/vendor/libgit2/src/refdb.c +++ /dev/null @@ -1,263 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#include "common.h" -#include "posix.h" - -#include "git2/object.h" -#include "git2/refs.h" -#include "git2/refdb.h" -#include "git2/sys/refdb_backend.h" - -#include "hash.h" -#include "refdb.h" -#include "refs.h" -#include "reflog.h" - -int git_refdb_new(git_refdb **out, git_repository *repo) -{ - git_refdb *db; - - assert(out && repo); - - db = git__calloc(1, sizeof(*db)); - GITERR_CHECK_ALLOC(db); - - db->repo = repo; - - *out = db; - GIT_REFCOUNT_INC(db); - return 0; -} - -int git_refdb_open(git_refdb **out, git_repository *repo) -{ - git_refdb *db; - git_refdb_backend *dir; - - assert(out && repo); - - *out = NULL; - - if (git_refdb_new(&db, repo) < 0) - return -1; - - /* Add the default (filesystem) backend */ - if (git_refdb_backend_fs(&dir, repo) < 0) { - git_refdb_free(db); - return -1; - } - - db->repo = repo; - db->backend = dir; - - *out = db; - return 0; -} - -static void refdb_free_backend(git_refdb *db) -{ - if (db->backend) { - if (db->backend->free) - db->backend->free(db->backend); - else - git__free(db->backend); - } -} - -int git_refdb_set_backend(git_refdb *db, git_refdb_backend *backend) -{ - refdb_free_backend(db); - db->backend = backend; - - return 0; -} - -int git_refdb_compress(git_refdb *db) -{ - assert(db); - - if (db->backend->compress) - return db->backend->compress(db->backend); - - return 0; -} - -void git_refdb__free(git_refdb *db) -{ - refdb_free_backend(db); - git__memzero(db, sizeof(*db)); - git__free(db); -} - -void git_refdb_free(git_refdb *db) -{ - if (db == NULL) - return; - - GIT_REFCOUNT_DEC(db, git_refdb__free); -} - -int git_refdb_exists(int *exists, git_refdb *refdb, const char *ref_name) -{ - assert(exists && refdb && refdb->backend); - - return refdb->backend->exists(exists, refdb->backend, ref_name); -} - -int git_refdb_lookup(git_reference **out, git_refdb *db, const char *ref_name) -{ - git_reference *ref; - int error; - - assert(db && db->backend && out && ref_name); - - error = db->backend->lookup(&ref, db->backend, ref_name); - if (error < 0) - return error; - - GIT_REFCOUNT_INC(db); - ref->db = db; - - *out = ref; - return 0; -} - -int git_refdb_iterator(git_reference_iterator **out, git_refdb *db, const char *glob) -{ - if (!db->backend || !db->backend->iterator) { - giterr_set(GITERR_REFERENCE, "This backend doesn't support iterators"); - return -1; - } - - if (db->backend->iterator(out, db->backend, glob) < 0) - return -1; - - GIT_REFCOUNT_INC(db); - (*out)->db = db; - - return 0; -} - -int git_refdb_iterator_next(git_reference **out, git_reference_iterator *iter) -{ - int error; - - if ((error = iter->next(out, iter)) < 0) - return error; - - GIT_REFCOUNT_INC(iter->db); - (*out)->db = iter->db; - - return 0; -} - -int git_refdb_iterator_next_name(const char **out, git_reference_iterator *iter) -{ - return iter->next_name(out, iter); -} - -void git_refdb_iterator_free(git_reference_iterator *iter) -{ - GIT_REFCOUNT_DEC(iter->db, git_refdb__free); - iter->free(iter); -} - -int git_refdb_write(git_refdb *db, git_reference *ref, int force, const git_signature *who, const char *message, const git_oid *old_id, const char *old_target) -{ - assert(db && db->backend); - - GIT_REFCOUNT_INC(db); - ref->db = db; - - return db->backend->write(db->backend, ref, force, who, message, old_id, old_target); -} - -int git_refdb_rename( - git_reference **out, - git_refdb *db, - const char *old_name, - const char *new_name, - int force, - const git_signature *who, - const char *message) -{ - int error; - - assert(db && db->backend); - error = db->backend->rename(out, db->backend, old_name, new_name, force, who, message); - if (error < 0) - return error; - - if (out) { - GIT_REFCOUNT_INC(db); - (*out)->db = db; - } - - return 0; -} - -int git_refdb_delete(struct git_refdb *db, const char *ref_name, const git_oid *old_id, const char *old_target) -{ - assert(db && db->backend); - return db->backend->del(db->backend, ref_name, old_id, old_target); -} - -int git_refdb_reflog_read(git_reflog **out, git_refdb *db, const char *name) -{ - int error; - - assert(db && db->backend); - - if ((error = db->backend->reflog_read(out, db->backend, name)) < 0) - return error; - - GIT_REFCOUNT_INC(db); - (*out)->db = db; - - return 0; -} - -int git_refdb_has_log(git_refdb *db, const char *refname) -{ - assert(db && refname); - - return db->backend->has_log(db->backend, refname); -} - -int git_refdb_ensure_log(git_refdb *db, const char *refname) -{ - assert(db && refname); - - return db->backend->ensure_log(db->backend, refname); -} - -int git_refdb_init_backend(git_refdb_backend *backend, unsigned int version) -{ - GIT_INIT_STRUCTURE_FROM_TEMPLATE( - backend, version, git_refdb_backend, GIT_REFDB_BACKEND_INIT); - return 0; -} - -int git_refdb_lock(void **payload, git_refdb *db, const char *refname) -{ - assert(payload && db && refname); - - if (!db->backend->lock) { - giterr_set(GITERR_REFERENCE, "backend does not support locking"); - return -1; - } - - return db->backend->lock(payload, db->backend, refname); -} - -int git_refdb_unlock(git_refdb *db, void *payload, int success, int update_reflog, const git_reference *ref, const git_signature *sig, const char *message) -{ - assert(db); - - return db->backend->unlock(db->backend, payload, success, update_reflog, ref, sig, message); -} diff --git a/vendor/libgit2/src/refdb.h b/vendor/libgit2/src/refdb.h deleted file mode 100644 index 4ee3b8065b..0000000000 --- a/vendor/libgit2/src/refdb.h +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_refdb_h__ -#define INCLUDE_refdb_h__ - -#include "git2/refdb.h" -#include "repository.h" - -struct git_refdb { - git_refcount rc; - git_repository *repo; - git_refdb_backend *backend; -}; - -void git_refdb__free(git_refdb *db); - -int git_refdb_exists( - int *exists, - git_refdb *refdb, - const char *ref_name); - -int git_refdb_lookup( - git_reference **out, - git_refdb *refdb, - const char *ref_name); - -int git_refdb_rename( - git_reference **out, - git_refdb *db, - const char *old_name, - const char *new_name, - int force, - const git_signature *who, - const char *message); - -int git_refdb_iterator(git_reference_iterator **out, git_refdb *db, const char *glob); -int git_refdb_iterator_next(git_reference **out, git_reference_iterator *iter); -int git_refdb_iterator_next_name(const char **out, git_reference_iterator *iter); -void git_refdb_iterator_free(git_reference_iterator *iter); - -int git_refdb_write(git_refdb *refdb, git_reference *ref, int force, const git_signature *who, const char *message, const git_oid *old_id, const char *old_target); -int git_refdb_delete(git_refdb *refdb, const char *ref_name, const git_oid *old_id, const char *old_target); - -int git_refdb_reflog_read(git_reflog **out, git_refdb *db, const char *name); -int git_refdb_reflog_write(git_reflog *reflog); - -int git_refdb_has_log(git_refdb *db, const char *refname); -int git_refdb_ensure_log(git_refdb *refdb, const char *refname); - -int git_refdb_lock(void **payload, git_refdb *db, const char *refname); -int git_refdb_unlock(git_refdb *db, void *payload, int success, int update_reflog, const git_reference *ref, const git_signature *sig, const char *message); - -#endif diff --git a/vendor/libgit2/src/refdb_fs.c b/vendor/libgit2/src/refdb_fs.c deleted file mode 100644 index e1a77f3ff8..0000000000 --- a/vendor/libgit2/src/refdb_fs.c +++ /dev/null @@ -1,1957 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#include "refs.h" -#include "hash.h" -#include "repository.h" -#include "fileops.h" -#include "filebuf.h" -#include "pack.h" -#include "reflog.h" -#include "refdb.h" -#include "refdb_fs.h" -#include "iterator.h" -#include "sortedcache.h" -#include "signature.h" - -#include -#include -#include -#include -#include -#include -#include - -GIT__USE_STRMAP - -#define DEFAULT_NESTING_LEVEL 5 -#define MAX_NESTING_LEVEL 10 - -enum { - PACKREF_HAS_PEEL = 1, - PACKREF_WAS_LOOSE = 2, - PACKREF_CANNOT_PEEL = 4, - PACKREF_SHADOWED = 8, -}; - -enum { - PEELING_NONE = 0, - PEELING_STANDARD, - PEELING_FULL -}; - -struct packref { - git_oid oid; - git_oid peel; - char flags; - char name[GIT_FLEX_ARRAY]; -}; - -typedef struct refdb_fs_backend { - git_refdb_backend parent; - - git_repository *repo; - char *path; - - git_sortedcache *refcache; - int peeling_mode; - git_iterator_flag_t iterator_flags; - uint32_t direach_flags; -} refdb_fs_backend; - -static int packref_cmp(const void *a_, const void *b_) -{ - const struct packref *a = a_, *b = b_; - return strcmp(a->name, b->name); -} - -static int packed_reload(refdb_fs_backend *backend) -{ - int error; - git_buf packedrefs = GIT_BUF_INIT; - char *scan, *eof, *eol; - - if (!backend->path) - return 0; - - error = git_sortedcache_lockandload(backend->refcache, &packedrefs); - - /* - * If we can't find the packed-refs, clear table and return. - * Any other error just gets passed through. - * If no error, and file wasn't changed, just return. - * Anything else means we need to refresh the packed refs. - */ - if (error <= 0) { - if (error == GIT_ENOTFOUND) { - git_sortedcache_clear(backend->refcache, true); - giterr_clear(); - error = 0; - } - return error; - } - - /* At this point, refresh the packed refs from the loaded buffer. */ - - git_sortedcache_clear(backend->refcache, false); - - scan = (char *)packedrefs.ptr; - eof = scan + packedrefs.size; - - backend->peeling_mode = PEELING_NONE; - - if (*scan == '#') { - static const char *traits_header = "# pack-refs with: "; - - if (git__prefixcmp(scan, traits_header) == 0) { - scan += strlen(traits_header); - eol = strchr(scan, '\n'); - - if (!eol) - goto parse_failed; - *eol = '\0'; - - if (strstr(scan, " fully-peeled ") != NULL) { - backend->peeling_mode = PEELING_FULL; - } else if (strstr(scan, " peeled ") != NULL) { - backend->peeling_mode = PEELING_STANDARD; - } - - scan = eol + 1; - } - } - - while (scan < eof && *scan == '#') { - if (!(eol = strchr(scan, '\n'))) - goto parse_failed; - scan = eol + 1; - } - - while (scan < eof) { - struct packref *ref; - git_oid oid; - - /* parse " \n" */ - - if (git_oid_fromstr(&oid, scan) < 0) - goto parse_failed; - scan += GIT_OID_HEXSZ; - - if (*scan++ != ' ') - goto parse_failed; - if (!(eol = strchr(scan, '\n'))) - goto parse_failed; - *eol = '\0'; - if (eol[-1] == '\r') - eol[-1] = '\0'; - - if (git_sortedcache_upsert((void **)&ref, backend->refcache, scan) < 0) - goto parse_failed; - scan = eol + 1; - - git_oid_cpy(&ref->oid, &oid); - - /* look for optional "^\n" */ - - if (*scan == '^') { - if (git_oid_fromstr(&oid, scan + 1) < 0) - goto parse_failed; - scan += GIT_OID_HEXSZ + 1; - - if (scan < eof) { - if (!(eol = strchr(scan, '\n'))) - goto parse_failed; - scan = eol + 1; - } - - git_oid_cpy(&ref->peel, &oid); - ref->flags |= PACKREF_HAS_PEEL; - } - else if (backend->peeling_mode == PEELING_FULL || - (backend->peeling_mode == PEELING_STANDARD && - git__prefixcmp(ref->name, GIT_REFS_TAGS_DIR) == 0)) - ref->flags |= PACKREF_CANNOT_PEEL; - } - - git_sortedcache_wunlock(backend->refcache); - git_buf_free(&packedrefs); - - return 0; - -parse_failed: - giterr_set(GITERR_REFERENCE, "Corrupted packed references file"); - - git_sortedcache_clear(backend->refcache, false); - git_sortedcache_wunlock(backend->refcache); - git_buf_free(&packedrefs); - - return -1; -} - -static int loose_parse_oid( - git_oid *oid, const char *filename, git_buf *file_content) -{ - const char *str = git_buf_cstr(file_content); - - if (git_buf_len(file_content) < GIT_OID_HEXSZ) - goto corrupted; - - /* we need to get 40 OID characters from the file */ - if (git_oid_fromstr(oid, str) < 0) - goto corrupted; - - /* If the file is longer than 40 chars, the 41st must be a space */ - str += GIT_OID_HEXSZ; - if (*str == '\0' || git__isspace(*str)) - return 0; - -corrupted: - giterr_set(GITERR_REFERENCE, "Corrupted loose reference file: %s", filename); - return -1; -} - -static int loose_readbuffer(git_buf *buf, const char *base, const char *path) -{ - int error; - - /* build full path to file */ - if ((error = git_buf_joinpath(buf, base, path)) < 0 || - (error = git_futils_readbuffer(buf, buf->ptr)) < 0) - git_buf_free(buf); - - return error; -} - -static int loose_lookup_to_packfile(refdb_fs_backend *backend, const char *name) -{ - int error = 0; - git_buf ref_file = GIT_BUF_INIT; - struct packref *ref = NULL; - git_oid oid; - - /* if we fail to load the loose reference, assume someone changed - * the filesystem under us and skip it... - */ - if (loose_readbuffer(&ref_file, backend->path, name) < 0) { - giterr_clear(); - goto done; - } - - /* skip symbolic refs */ - if (!git__prefixcmp(git_buf_cstr(&ref_file), GIT_SYMREF)) - goto done; - - /* parse OID from file */ - if ((error = loose_parse_oid(&oid, name, &ref_file)) < 0) - goto done; - - git_sortedcache_wlock(backend->refcache); - - if (!(error = git_sortedcache_upsert( - (void **)&ref, backend->refcache, name))) { - - git_oid_cpy(&ref->oid, &oid); - ref->flags = PACKREF_WAS_LOOSE; - } - - git_sortedcache_wunlock(backend->refcache); - -done: - git_buf_free(&ref_file); - return error; -} - -static int _dirent_loose_load(void *payload, git_buf *full_path) -{ - refdb_fs_backend *backend = payload; - const char *file_path; - - if (git__suffixcmp(full_path->ptr, ".lock") == 0) - return 0; - - if (git_path_isdir(full_path->ptr)) { - int error = git_path_direach( - full_path, backend->direach_flags, _dirent_loose_load, backend); - /* Race with the filesystem, ignore it */ - if (error == GIT_ENOTFOUND) { - giterr_clear(); - return 0; - } - - return error; - } - - file_path = full_path->ptr + strlen(backend->path); - - return loose_lookup_to_packfile(backend, file_path); -} - -/* - * Load all the loose references from the repository - * into the in-memory Packfile, and build a vector with - * all the references so it can be written back to - * disk. - */ -static int packed_loadloose(refdb_fs_backend *backend) -{ - int error; - git_buf refs_path = GIT_BUF_INIT; - - if (git_buf_joinpath(&refs_path, backend->path, GIT_REFS_DIR) < 0) - return -1; - - /* - * Load all the loose files from disk into the Packfile table. - * This will overwrite any old packed entries with their - * updated loose versions - */ - error = git_path_direach( - &refs_path, backend->direach_flags, _dirent_loose_load, backend); - - git_buf_free(&refs_path); - - return error; -} - -static int refdb_fs_backend__exists( - int *exists, - git_refdb_backend *_backend, - const char *ref_name) -{ - refdb_fs_backend *backend = (refdb_fs_backend *)_backend; - git_buf ref_path = GIT_BUF_INIT; - - assert(backend); - - if (packed_reload(backend) < 0 || - git_buf_joinpath(&ref_path, backend->path, ref_name) < 0) - return -1; - - *exists = git_path_isfile(ref_path.ptr) || - (git_sortedcache_lookup(backend->refcache, ref_name) != NULL); - - git_buf_free(&ref_path); - return 0; -} - -static const char *loose_parse_symbolic(git_buf *file_content) -{ - const unsigned int header_len = (unsigned int)strlen(GIT_SYMREF); - const char *refname_start; - - refname_start = (const char *)file_content->ptr; - - if (git_buf_len(file_content) < header_len + 1) { - giterr_set(GITERR_REFERENCE, "Corrupted loose reference file"); - return NULL; - } - - /* - * Assume we have already checked for the header - * before calling this function - */ - refname_start += header_len; - - return refname_start; -} - -static int loose_lookup( - git_reference **out, - refdb_fs_backend *backend, - const char *ref_name) -{ - git_buf ref_file = GIT_BUF_INIT; - int error = 0; - - if (out) - *out = NULL; - - if ((error = loose_readbuffer(&ref_file, backend->path, ref_name)) < 0) - /* cannot read loose ref file - gah */; - else if (git__prefixcmp(git_buf_cstr(&ref_file), GIT_SYMREF) == 0) { - const char *target; - - git_buf_rtrim(&ref_file); - - if (!(target = loose_parse_symbolic(&ref_file))) - error = -1; - else if (out != NULL) - *out = git_reference__alloc_symbolic(ref_name, target); - } else { - git_oid oid; - - if (!(error = loose_parse_oid(&oid, ref_name, &ref_file)) && - out != NULL) - *out = git_reference__alloc(ref_name, &oid, NULL); - } - - git_buf_free(&ref_file); - return error; -} - -static int ref_error_notfound(const char *name) -{ - giterr_set(GITERR_REFERENCE, "Reference '%s' not found", name); - return GIT_ENOTFOUND; -} - -static int packed_lookup( - git_reference **out, - refdb_fs_backend *backend, - const char *ref_name) -{ - int error = 0; - struct packref *entry; - - if (packed_reload(backend) < 0) - return -1; - - if (git_sortedcache_rlock(backend->refcache) < 0) - return -1; - - entry = git_sortedcache_lookup(backend->refcache, ref_name); - if (!entry) { - error = ref_error_notfound(ref_name); - } else { - *out = git_reference__alloc(ref_name, &entry->oid, &entry->peel); - if (!*out) - error = -1; - } - - git_sortedcache_runlock(backend->refcache); - - return error; -} - -static int refdb_fs_backend__lookup( - git_reference **out, - git_refdb_backend *_backend, - const char *ref_name) -{ - refdb_fs_backend *backend = (refdb_fs_backend *)_backend; - int error; - - assert(backend); - - if (!(error = loose_lookup(out, backend, ref_name))) - return 0; - - /* only try to lookup this reference on the packfile if it - * wasn't found on the loose refs; not if there was a critical error */ - if (error == GIT_ENOTFOUND) { - giterr_clear(); - error = packed_lookup(out, backend, ref_name); - } - - return error; -} - -typedef struct { - git_reference_iterator parent; - - char *glob; - - git_pool pool; - git_vector loose; - - git_sortedcache *cache; - size_t loose_pos; - size_t packed_pos; -} refdb_fs_iter; - -static void refdb_fs_backend__iterator_free(git_reference_iterator *_iter) -{ - refdb_fs_iter *iter = (refdb_fs_iter *) _iter; - - git_vector_free(&iter->loose); - git_pool_clear(&iter->pool); - git_sortedcache_free(iter->cache); - git__free(iter); -} - -static int iter_load_loose_paths(refdb_fs_backend *backend, refdb_fs_iter *iter) -{ - int error = 0; - git_buf path = GIT_BUF_INIT; - git_iterator *fsit = NULL; - const git_index_entry *entry = NULL; - - if (!backend->path) /* do nothing if no path for loose refs */ - return 0; - - if ((error = git_buf_printf(&path, "%s/refs", backend->path)) < 0 || - (error = git_iterator_for_filesystem( - &fsit, path.ptr, backend->iterator_flags, NULL, NULL)) < 0) { - git_buf_free(&path); - return error; - } - - error = git_buf_sets(&path, GIT_REFS_DIR); - - while (!error && !git_iterator_advance(&entry, fsit)) { - const char *ref_name; - struct packref *ref; - char *ref_dup; - - git_buf_truncate(&path, strlen(GIT_REFS_DIR)); - git_buf_puts(&path, entry->path); - ref_name = git_buf_cstr(&path); - - if (git__suffixcmp(ref_name, ".lock") == 0 || - (iter->glob && p_fnmatch(iter->glob, ref_name, 0) != 0)) - continue; - - git_sortedcache_rlock(backend->refcache); - ref = git_sortedcache_lookup(backend->refcache, ref_name); - if (ref) - ref->flags |= PACKREF_SHADOWED; - git_sortedcache_runlock(backend->refcache); - - ref_dup = git_pool_strdup(&iter->pool, ref_name); - if (!ref_dup) - error = -1; - else - error = git_vector_insert(&iter->loose, ref_dup); - } - - git_iterator_free(fsit); - git_buf_free(&path); - - return error; -} - -static int refdb_fs_backend__iterator_next( - git_reference **out, git_reference_iterator *_iter) -{ - int error = GIT_ITEROVER; - refdb_fs_iter *iter = (refdb_fs_iter *)_iter; - refdb_fs_backend *backend = (refdb_fs_backend *)iter->parent.db->backend; - struct packref *ref; - - while (iter->loose_pos < iter->loose.length) { - const char *path = git_vector_get(&iter->loose, iter->loose_pos++); - - if (loose_lookup(out, backend, path) == 0) - return 0; - - giterr_clear(); - } - - if (!iter->cache) { - if ((error = git_sortedcache_copy(&iter->cache, backend->refcache, 1, NULL, NULL)) < 0) - return error; - } - - error = GIT_ITEROVER; - while (iter->packed_pos < git_sortedcache_entrycount(iter->cache)) { - ref = git_sortedcache_entry(iter->cache, iter->packed_pos++); - if (!ref) /* stop now if another thread deleted refs and we past end */ - break; - - if (ref->flags & PACKREF_SHADOWED) - continue; - if (iter->glob && p_fnmatch(iter->glob, ref->name, 0) != 0) - continue; - - *out = git_reference__alloc(ref->name, &ref->oid, &ref->peel); - error = (*out != NULL) ? 0 : -1; - break; - } - - return error; -} - -static int refdb_fs_backend__iterator_next_name( - const char **out, git_reference_iterator *_iter) -{ - int error = GIT_ITEROVER; - refdb_fs_iter *iter = (refdb_fs_iter *)_iter; - refdb_fs_backend *backend = (refdb_fs_backend *)iter->parent.db->backend; - struct packref *ref; - - while (iter->loose_pos < iter->loose.length) { - const char *path = git_vector_get(&iter->loose, iter->loose_pos++); - - if (loose_lookup(NULL, backend, path) == 0) { - *out = path; - return 0; - } - - giterr_clear(); - } - - if (!iter->cache) { - if ((error = git_sortedcache_copy(&iter->cache, backend->refcache, 1, NULL, NULL)) < 0) - return error; - } - - error = GIT_ITEROVER; - while (iter->packed_pos < git_sortedcache_entrycount(iter->cache)) { - ref = git_sortedcache_entry(iter->cache, iter->packed_pos++); - if (!ref) /* stop now if another thread deleted refs and we past end */ - break; - - if (ref->flags & PACKREF_SHADOWED) - continue; - if (iter->glob && p_fnmatch(iter->glob, ref->name, 0) != 0) - continue; - - *out = ref->name; - error = 0; - break; - } - - return error; -} - -static int refdb_fs_backend__iterator( - git_reference_iterator **out, git_refdb_backend *_backend, const char *glob) -{ - refdb_fs_iter *iter; - refdb_fs_backend *backend = (refdb_fs_backend *)_backend; - - assert(backend); - - if (packed_reload(backend) < 0) - return -1; - - iter = git__calloc(1, sizeof(refdb_fs_iter)); - GITERR_CHECK_ALLOC(iter); - - if (git_pool_init(&iter->pool, 1, 0) < 0 || - git_vector_init(&iter->loose, 8, NULL) < 0) - goto fail; - - if (glob != NULL && - (iter->glob = git_pool_strdup(&iter->pool, glob)) == NULL) - goto fail; - - iter->parent.next = refdb_fs_backend__iterator_next; - iter->parent.next_name = refdb_fs_backend__iterator_next_name; - iter->parent.free = refdb_fs_backend__iterator_free; - - if (iter_load_loose_paths(backend, iter) < 0) - goto fail; - - *out = (git_reference_iterator *)iter; - return 0; - -fail: - refdb_fs_backend__iterator_free((git_reference_iterator *)iter); - return -1; -} - -static bool ref_is_available( - const char *old_ref, const char *new_ref, const char *this_ref) -{ - if (old_ref == NULL || strcmp(old_ref, this_ref)) { - size_t reflen = strlen(this_ref); - size_t newlen = strlen(new_ref); - size_t cmplen = reflen < newlen ? reflen : newlen; - const char *lead = reflen < newlen ? new_ref : this_ref; - - if (!strncmp(new_ref, this_ref, cmplen) && lead[cmplen] == '/') { - return false; - } - } - - return true; -} - -static int reference_path_available( - refdb_fs_backend *backend, - const char *new_ref, - const char* old_ref, - int force) -{ - size_t i; - - if (packed_reload(backend) < 0) - return -1; - - if (!force) { - int exists; - - if (refdb_fs_backend__exists( - &exists, (git_refdb_backend *)backend, new_ref) < 0) - return -1; - - if (exists) { - giterr_set(GITERR_REFERENCE, - "Failed to write reference '%s': a reference with " - "that name already exists.", new_ref); - return GIT_EEXISTS; - } - } - - git_sortedcache_rlock(backend->refcache); - - for (i = 0; i < git_sortedcache_entrycount(backend->refcache); ++i) { - struct packref *ref = git_sortedcache_entry(backend->refcache, i); - - if (ref && !ref_is_available(old_ref, new_ref, ref->name)) { - git_sortedcache_runlock(backend->refcache); - giterr_set(GITERR_REFERENCE, - "Path to reference '%s' collides with existing one", new_ref); - return -1; - } - } - - git_sortedcache_runlock(backend->refcache); - return 0; -} - -static int loose_lock(git_filebuf *file, refdb_fs_backend *backend, const char *name) -{ - int error; - git_buf ref_path = GIT_BUF_INIT; - - assert(file && backend && name); - - if (!git_path_isvalid(backend->repo, name, GIT_PATH_REJECT_DEFAULTS)) { - giterr_set(GITERR_INVALID, "Invalid reference name '%s'.", name); - return GIT_EINVALIDSPEC; - } - - /* Remove a possibly existing empty directory hierarchy - * which name would collide with the reference name - */ - if (git_futils_rmdir_r(name, backend->path, GIT_RMDIR_SKIP_NONEMPTY) < 0) - return -1; - - if (git_buf_joinpath(&ref_path, backend->path, name) < 0) - return -1; - - error = git_filebuf_open(file, ref_path.ptr, GIT_FILEBUF_FORCE, GIT_REFS_FILE_MODE); - - git_buf_free(&ref_path); - return error; -} - -static int loose_commit(git_filebuf *file, const git_reference *ref) -{ - assert(file && ref); - - if (ref->type == GIT_REF_OID) { - char oid[GIT_OID_HEXSZ + 1]; - git_oid_nfmt(oid, sizeof(oid), &ref->target.oid); - - git_filebuf_printf(file, "%s\n", oid); - } else if (ref->type == GIT_REF_SYMBOLIC) { - git_filebuf_printf(file, GIT_SYMREF "%s\n", ref->target.symbolic); - } else { - assert(0); /* don't let this happen */ - } - - return git_filebuf_commit(file); -} - -static int refdb_fs_backend__lock(void **out, git_refdb_backend *_backend, const char *refname) -{ - int error; - git_filebuf *lock; - refdb_fs_backend *backend = (refdb_fs_backend *) _backend; - - lock = git__calloc(1, sizeof(git_filebuf)); - GITERR_CHECK_ALLOC(lock); - - if ((error = loose_lock(lock, backend, refname)) < 0) { - git__free(lock); - return error; - } - - *out = lock; - return 0; -} - -static int refdb_fs_backend__write_tail( - git_refdb_backend *_backend, - const git_reference *ref, - git_filebuf *file, - int update_reflog, - const git_signature *who, - const char *message, - const git_oid *old_id, - const char *old_target); - -static int refdb_fs_backend__delete_tail( - git_refdb_backend *_backend, - git_filebuf *file, - const char *ref_name, - const git_oid *old_id, const char *old_target); - -static int refdb_fs_backend__unlock(git_refdb_backend *backend, void *payload, int success, int update_reflog, - const git_reference *ref, const git_signature *sig, const char *message) -{ - git_filebuf *lock = (git_filebuf *) payload; - int error = 0; - - if (success == 2) - error = refdb_fs_backend__delete_tail(backend, lock, ref->name, NULL, NULL); - else if (success) - error = refdb_fs_backend__write_tail(backend, ref, lock, update_reflog, sig, message, NULL, NULL); - else - git_filebuf_cleanup(lock); - - git__free(lock); - return error; -} - -/* - * Find out what object this reference resolves to. - * - * For references that point to a 'big' tag (e.g. an - * actual tag object on the repository), we need to - * cache on the packfile the OID of the object to - * which that 'big tag' is pointing to. - */ -static int packed_find_peel(refdb_fs_backend *backend, struct packref *ref) -{ - git_object *object; - - if (ref->flags & PACKREF_HAS_PEEL || ref->flags & PACKREF_CANNOT_PEEL) - return 0; - - /* - * Find the tagged object in the repository - */ - if (git_object_lookup(&object, backend->repo, &ref->oid, GIT_OBJ_ANY) < 0) - return -1; - - /* - * If the tagged object is a Tag object, we need to resolve it; - * if the ref is actually a 'weak' ref, we don't need to resolve - * anything. - */ - if (git_object_type(object) == GIT_OBJ_TAG) { - git_tag *tag = (git_tag *)object; - - /* - * Find the object pointed at by this tag - */ - git_oid_cpy(&ref->peel, git_tag_target_id(tag)); - ref->flags |= PACKREF_HAS_PEEL; - - /* - * The reference has now cached the resolved OID, and is - * marked at such. When written to the packfile, it'll be - * accompanied by this resolved oid - */ - } - - git_object_free(object); - return 0; -} - -/* - * Write a single reference into a packfile - */ -static int packed_write_ref(struct packref *ref, git_filebuf *file) -{ - char oid[GIT_OID_HEXSZ + 1]; - git_oid_nfmt(oid, sizeof(oid), &ref->oid); - - /* - * For references that peel to an object in the repo, we must - * write the resulting peel on a separate line, e.g. - * - * 6fa8a902cc1d18527e1355773c86721945475d37 refs/tags/libgit2-0.4 - * ^2ec0cb7959b0bf965d54f95453f5b4b34e8d3100 - * - * This obviously only applies to tags. - * The required peels have already been loaded into `ref->peel_target`. - */ - if (ref->flags & PACKREF_HAS_PEEL) { - char peel[GIT_OID_HEXSZ + 1]; - git_oid_nfmt(peel, sizeof(peel), &ref->peel); - - if (git_filebuf_printf(file, "%s %s\n^%s\n", oid, ref->name, peel) < 0) - return -1; - } else { - if (git_filebuf_printf(file, "%s %s\n", oid, ref->name) < 0) - return -1; - } - - return 0; -} - -/* - * Remove all loose references - * - * Once we have successfully written a packfile, - * all the loose references that were packed must be - * removed from disk. - * - * This is a dangerous method; make sure the packfile - * is well-written, because we are destructing references - * here otherwise. - */ -static int packed_remove_loose(refdb_fs_backend *backend) -{ - size_t i; - git_buf full_path = GIT_BUF_INIT; - int failed = 0; - - /* backend->refcache is already locked when this is called */ - - for (i = 0; i < git_sortedcache_entrycount(backend->refcache); ++i) { - struct packref *ref = git_sortedcache_entry(backend->refcache, i); - - if (!ref || !(ref->flags & PACKREF_WAS_LOOSE)) - continue; - - if (git_buf_joinpath(&full_path, backend->path, ref->name) < 0) - return -1; /* critical; do not try to recover on oom */ - - if (git_path_exists(full_path.ptr) && p_unlink(full_path.ptr) < 0) { - if (failed) - continue; - - giterr_set(GITERR_REFERENCE, - "Failed to remove loose reference '%s' after packing: %s", - full_path.ptr, strerror(errno)); - failed = 1; - } - - /* - * if we fail to remove a single file, this is *not* good, - * but we should keep going and remove as many as possible. - * After we've removed as many files as possible, we return - * the error code anyway. - */ - } - - git_buf_free(&full_path); - return failed ? -1 : 0; -} - -/* - * Write all the contents in the in-memory packfile to disk. - */ -static int packed_write(refdb_fs_backend *backend) -{ - git_sortedcache *refcache = backend->refcache; - git_filebuf pack_file = GIT_FILEBUF_INIT; - size_t i; - - /* lock the cache to updates while we do this */ - if (git_sortedcache_wlock(refcache) < 0) - return -1; - - /* Open the file! */ - if (git_filebuf_open(&pack_file, git_sortedcache_path(refcache), 0, GIT_PACKEDREFS_FILE_MODE) < 0) - goto fail; - - /* Packfiles have a header... apparently - * This is in fact not required, but we might as well print it - * just for kicks */ - if (git_filebuf_printf(&pack_file, "%s\n", GIT_PACKEDREFS_HEADER) < 0) - goto fail; - - for (i = 0; i < git_sortedcache_entrycount(refcache); ++i) { - struct packref *ref = git_sortedcache_entry(refcache, i); - - if (packed_find_peel(backend, ref) < 0) - goto fail; - - if (packed_write_ref(ref, &pack_file) < 0) - goto fail; - } - - /* if we've written all the references properly, we can commit - * the packfile to make the changes effective */ - if (git_filebuf_commit(&pack_file) < 0) - goto fail; - - /* when and only when the packfile has been properly written, - * we can go ahead and remove the loose refs */ - if (packed_remove_loose(backend) < 0) - goto fail; - - git_sortedcache_updated(refcache); - git_sortedcache_wunlock(refcache); - - /* we're good now */ - return 0; - -fail: - git_filebuf_cleanup(&pack_file); - git_sortedcache_wunlock(refcache); - - return -1; -} - -static int reflog_append(refdb_fs_backend *backend, const git_reference *ref, const git_oid *old, const git_oid *new, const git_signature *author, const char *message); -static int has_reflog(git_repository *repo, const char *name); - -/* We only write if it's under heads/, remotes/ or notes/ or if it already has a log */ -static int should_write_reflog(int *write, git_repository *repo, const char *name) -{ - int error, logall; - - error = git_repository__cvar(&logall, repo, GIT_CVAR_LOGALLREFUPDATES); - if (error < 0) - return error; - - /* Defaults to the opposite of the repo being bare */ - if (logall == GIT_LOGALLREFUPDATES_UNSET) - logall = !git_repository_is_bare(repo); - - if (!logall) { - *write = 0; - } else if (has_reflog(repo, name)) { - *write = 1; - } else if (!git__prefixcmp(name, GIT_REFS_HEADS_DIR) || - !git__strcmp(name, GIT_HEAD_FILE) || - !git__prefixcmp(name, GIT_REFS_REMOTES_DIR) || - !git__prefixcmp(name, GIT_REFS_NOTES_DIR)) { - *write = 1; - } else { - *write = 0; - } - - return 0; -} - -static int cmp_old_ref(int *cmp, git_refdb_backend *backend, const char *name, - const git_oid *old_id, const char *old_target) -{ - int error = 0; - git_reference *old_ref = NULL; - - *cmp = 0; - /* It "matches" if there is no old value to compare against */ - if (!old_id && !old_target) - return 0; - - if ((error = refdb_fs_backend__lookup(&old_ref, backend, name)) < 0) - goto out; - - /* If the types don't match, there's no way the values do */ - if (old_id && old_ref->type != GIT_REF_OID) { - *cmp = -1; - goto out; - } - if (old_target && old_ref->type != GIT_REF_SYMBOLIC) { - *cmp = 1; - goto out; - } - - if (old_id && old_ref->type == GIT_REF_OID) - *cmp = git_oid_cmp(old_id, &old_ref->target.oid); - - if (old_target && old_ref->type == GIT_REF_SYMBOLIC) - *cmp = git__strcmp(old_target, old_ref->target.symbolic); - -out: - git_reference_free(old_ref); - - return error; -} - -/* - * The git.git comment regarding this, for your viewing pleasure: - * - * Special hack: If a branch is updated directly and HEAD - * points to it (may happen on the remote side of a push - * for example) then logically the HEAD reflog should be - * updated too. - * A generic solution implies reverse symref information, - * but finding all symrefs pointing to the given branch - * would be rather costly for this rare event (the direct - * update of a branch) to be worth it. So let's cheat and - * check with HEAD only which should cover 99% of all usage - * scenarios (even 100% of the default ones). - */ -static int maybe_append_head(refdb_fs_backend *backend, const git_reference *ref, const git_signature *who, const char *message) -{ - int error; - git_oid old_id = {{0}}; - git_reference *tmp = NULL, *head = NULL, *peeled = NULL; - const char *name; - - if (ref->type == GIT_REF_SYMBOLIC) - return 0; - - /* if we can't resolve, we use {0}*40 as old id */ - git_reference_name_to_id(&old_id, backend->repo, ref->name); - - if ((error = git_reference_lookup(&head, backend->repo, GIT_HEAD_FILE)) < 0) - return error; - - if (git_reference_type(head) == GIT_REF_OID) - goto cleanup; - - if ((error = git_reference_lookup(&tmp, backend->repo, GIT_HEAD_FILE)) < 0) - goto cleanup; - - /* Go down the symref chain until we find the branch */ - while (git_reference_type(tmp) == GIT_REF_SYMBOLIC) { - error = git_reference_lookup(&peeled, backend->repo, git_reference_symbolic_target(tmp)); - if (error < 0) - break; - - git_reference_free(tmp); - tmp = peeled; - } - - if (error == GIT_ENOTFOUND) { - error = 0; - name = git_reference_symbolic_target(tmp); - } else if (error < 0) { - goto cleanup; - } else { - name = git_reference_name(tmp); - } - - if (strcmp(name, ref->name)) - goto cleanup; - - error = reflog_append(backend, head, &old_id, git_reference_target(ref), who, message); - -cleanup: - git_reference_free(tmp); - git_reference_free(head); - return error; -} - -static int refdb_fs_backend__write( - git_refdb_backend *_backend, - const git_reference *ref, - int force, - const git_signature *who, - const char *message, - const git_oid *old_id, - const char *old_target) -{ - refdb_fs_backend *backend = (refdb_fs_backend *)_backend; - git_filebuf file = GIT_FILEBUF_INIT; - int error = 0; - - assert(backend); - - error = reference_path_available(backend, ref->name, NULL, force); - if (error < 0) - return error; - - /* We need to perform the reflog append and old value check under the ref's lock */ - if ((error = loose_lock(&file, backend, ref->name)) < 0) - return error; - - return refdb_fs_backend__write_tail(_backend, ref, &file, true, who, message, old_id, old_target); -} - -static int refdb_fs_backend__write_tail( - git_refdb_backend *_backend, - const git_reference *ref, - git_filebuf *file, - int update_reflog, - const git_signature *who, - const char *message, - const git_oid *old_id, - const char *old_target) -{ - refdb_fs_backend *backend = (refdb_fs_backend *)_backend; - int error = 0, cmp = 0, should_write; - const char *new_target = NULL; - const git_oid *new_id = NULL; - - if ((error = cmp_old_ref(&cmp, _backend, ref->name, old_id, old_target)) < 0) - goto on_error; - - if (cmp) { - giterr_set(GITERR_REFERENCE, "old reference value does not match"); - error = GIT_EMODIFIED; - goto on_error; - } - - if (ref->type == GIT_REF_SYMBOLIC) - new_target = ref->target.symbolic; - else - new_id = &ref->target.oid; - - error = cmp_old_ref(&cmp, _backend, ref->name, new_id, new_target); - if (error < 0 && error != GIT_ENOTFOUND) - goto on_error; - - /* Don't update if we have the same value */ - if (!error && !cmp) { - error = 0; - goto on_error; /* not really error */ - } - - if (update_reflog) { - if ((error = should_write_reflog(&should_write, backend->repo, ref->name)) < 0) - goto on_error; - - if (should_write) { - if ((error = reflog_append(backend, ref, NULL, NULL, who, message)) < 0) - goto on_error; - if ((error = maybe_append_head(backend, ref, who, message)) < 0) - goto on_error; - } - } - - return loose_commit(file, ref); - -on_error: - git_filebuf_cleanup(file); - return error; -} - -static int refdb_fs_backend__delete( - git_refdb_backend *_backend, - const char *ref_name, - const git_oid *old_id, const char *old_target) -{ - refdb_fs_backend *backend = (refdb_fs_backend *)_backend; - git_filebuf file = GIT_FILEBUF_INIT; - int error = 0; - - assert(backend && ref_name); - - if ((error = loose_lock(&file, backend, ref_name)) < 0) - return error; - - return refdb_fs_backend__delete_tail(_backend, &file, ref_name, old_id, old_target); -} - -static int refdb_fs_backend__delete_tail( - git_refdb_backend *_backend, - git_filebuf *file, - const char *ref_name, - const git_oid *old_id, const char *old_target) -{ - refdb_fs_backend *backend = (refdb_fs_backend *)_backend; - git_buf loose_path = GIT_BUF_INIT; - size_t pack_pos; - int error = 0, cmp = 0; - bool loose_deleted = 0; - - error = cmp_old_ref(&cmp, _backend, ref_name, old_id, old_target); - if (error < 0) - goto cleanup; - - if (cmp) { - giterr_set(GITERR_REFERENCE, "old reference value does not match"); - error = GIT_EMODIFIED; - goto cleanup; - } - - /* If a loose reference exists, remove it from the filesystem */ - if (git_buf_joinpath(&loose_path, backend->path, ref_name) < 0) - return -1; - - if (git_path_isfile(loose_path.ptr)) { - error = p_unlink(loose_path.ptr); - loose_deleted = 1; - } - - git_buf_free(&loose_path); - - if (error != 0) - goto cleanup; - - if ((error = packed_reload(backend)) < 0) - goto cleanup; - - /* If a packed reference exists, remove it from the packfile and repack */ - if ((error = git_sortedcache_wlock(backend->refcache)) < 0) - goto cleanup; - - if (!(error = git_sortedcache_lookup_index( - &pack_pos, backend->refcache, ref_name))) - error = git_sortedcache_remove(backend->refcache, pack_pos); - - git_sortedcache_wunlock(backend->refcache); - - if (error == GIT_ENOTFOUND) { - error = loose_deleted ? 0 : ref_error_notfound(ref_name); - goto cleanup; - } - - error = packed_write(backend); - -cleanup: - git_filebuf_cleanup(file); - - return error; -} - -static int refdb_reflog_fs__rename(git_refdb_backend *_backend, const char *old_name, const char *new_name); - -static int refdb_fs_backend__rename( - git_reference **out, - git_refdb_backend *_backend, - const char *old_name, - const char *new_name, - int force, - const git_signature *who, - const char *message) -{ - refdb_fs_backend *backend = (refdb_fs_backend *)_backend; - git_reference *old, *new; - git_filebuf file = GIT_FILEBUF_INIT; - int error; - - assert(backend); - - if ((error = reference_path_available( - backend, new_name, old_name, force)) < 0 || - (error = refdb_fs_backend__lookup(&old, _backend, old_name)) < 0) - return error; - - if ((error = refdb_fs_backend__delete(_backend, old_name, NULL, NULL)) < 0) { - git_reference_free(old); - return error; - } - - new = git_reference__set_name(old, new_name); - if (!new) { - git_reference_free(old); - return -1; - } - - if ((error = loose_lock(&file, backend, new->name)) < 0) { - git_reference_free(new); - return error; - } - - /* Try to rename the refog; it's ok if the old doesn't exist */ - error = refdb_reflog_fs__rename(_backend, old_name, new_name); - if (((error == 0) || (error == GIT_ENOTFOUND)) && - ((error = reflog_append(backend, new, git_reference_target(new), NULL, who, message)) < 0)) { - git_reference_free(new); - git_filebuf_cleanup(&file); - return error; - } - - if (error < 0) { - git_reference_free(new); - git_filebuf_cleanup(&file); - return error; - } - - - if ((error = loose_commit(&file, new)) < 0 || out == NULL) { - git_reference_free(new); - return error; - } - - *out = new; - return 0; -} - -static int refdb_fs_backend__compress(git_refdb_backend *_backend) -{ - refdb_fs_backend *backend = (refdb_fs_backend *)_backend; - - assert(backend); - - if (packed_reload(backend) < 0 || /* load the existing packfile */ - packed_loadloose(backend) < 0 || /* add all the loose refs */ - packed_write(backend) < 0) /* write back to disk */ - return -1; - - return 0; -} - -static void refdb_fs_backend__free(git_refdb_backend *_backend) -{ - refdb_fs_backend *backend = (refdb_fs_backend *)_backend; - - assert(backend); - - git_sortedcache_free(backend->refcache); - git__free(backend->path); - git__free(backend); -} - -static int setup_namespace(git_buf *path, git_repository *repo) -{ - char *parts, *start, *end; - - /* Not all repositories have a path */ - if (repo->path_repository == NULL) - return 0; - - /* Load the path to the repo first */ - git_buf_puts(path, repo->path_repository); - - /* if the repo is not namespaced, nothing else to do */ - if (repo->namespace == NULL) - return 0; - - parts = end = git__strdup(repo->namespace); - if (parts == NULL) - return -1; - - /* - * From `man gitnamespaces`: - * namespaces which include a / will expand to a hierarchy - * of namespaces; for example, GIT_NAMESPACE=foo/bar will store - * refs under refs/namespaces/foo/refs/namespaces/bar/ - */ - while ((start = git__strsep(&end, "/")) != NULL) { - git_buf_printf(path, "refs/namespaces/%s/", start); - } - - git_buf_printf(path, "refs/namespaces/%s/refs", end); - git__free(parts); - - /* Make sure that the folder with the namespace exists */ - if (git_futils_mkdir_r(git_buf_cstr(path), repo->path_repository, 0777) < 0) - return -1; - - /* Return root of the namespaced path, i.e. without the trailing '/refs' */ - git_buf_rtruncate_at_char(path, '/'); - return 0; -} - -static int reflog_alloc(git_reflog **reflog, const char *name) -{ - git_reflog *log; - - *reflog = NULL; - - log = git__calloc(1, sizeof(git_reflog)); - GITERR_CHECK_ALLOC(log); - - log->ref_name = git__strdup(name); - GITERR_CHECK_ALLOC(log->ref_name); - - if (git_vector_init(&log->entries, 0, NULL) < 0) { - git__free(log->ref_name); - git__free(log); - return -1; - } - - *reflog = log; - - return 0; -} - -static int reflog_parse(git_reflog *log, const char *buf, size_t buf_size) -{ - const char *ptr; - git_reflog_entry *entry; - -#define seek_forward(_increase) do { \ - if (_increase >= buf_size) { \ - giterr_set(GITERR_INVALID, "Ran out of data while parsing reflog"); \ - goto fail; \ - } \ - buf += _increase; \ - buf_size -= _increase; \ - } while (0) - - while (buf_size > GIT_REFLOG_SIZE_MIN) { - entry = git__calloc(1, sizeof(git_reflog_entry)); - GITERR_CHECK_ALLOC(entry); - - entry->committer = git__malloc(sizeof(git_signature)); - GITERR_CHECK_ALLOC(entry->committer); - - if (git_oid_fromstrn(&entry->oid_old, buf, GIT_OID_HEXSZ) < 0) - goto fail; - seek_forward(GIT_OID_HEXSZ + 1); - - if (git_oid_fromstrn(&entry->oid_cur, buf, GIT_OID_HEXSZ) < 0) - goto fail; - seek_forward(GIT_OID_HEXSZ + 1); - - ptr = buf; - - /* Seek forward to the end of the signature. */ - while (*buf && *buf != '\t' && *buf != '\n') - seek_forward(1); - - if (git_signature__parse(entry->committer, &ptr, buf + 1, NULL, *buf) < 0) - goto fail; - - if (*buf == '\t') { - /* We got a message. Read everything till we reach LF. */ - seek_forward(1); - ptr = buf; - - while (*buf && *buf != '\n') - seek_forward(1); - - entry->msg = git__strndup(ptr, buf - ptr); - GITERR_CHECK_ALLOC(entry->msg); - } else - entry->msg = NULL; - - while (*buf && *buf == '\n' && buf_size > 1) - seek_forward(1); - - if (git_vector_insert(&log->entries, entry) < 0) - goto fail; - } - - return 0; - -#undef seek_forward - -fail: - if (entry) - git_reflog_entry__free(entry); - - return -1; -} - -static int create_new_reflog_file(const char *filepath) -{ - int fd, error; - - if ((error = git_futils_mkpath2file(filepath, GIT_REFLOG_DIR_MODE)) < 0) - return error; - - if ((fd = p_open(filepath, - O_WRONLY | O_CREAT, - GIT_REFLOG_FILE_MODE)) < 0) - return -1; - - return p_close(fd); -} - -GIT_INLINE(int) retrieve_reflog_path(git_buf *path, git_repository *repo, const char *name) -{ - return git_buf_join3(path, '/', repo->path_repository, GIT_REFLOG_DIR, name); -} - -static int refdb_reflog_fs__ensure_log(git_refdb_backend *_backend, const char *name) -{ - refdb_fs_backend *backend; - git_repository *repo; - git_buf path = GIT_BUF_INIT; - int error; - - assert(_backend && name); - - backend = (refdb_fs_backend *) _backend; - repo = backend->repo; - - if ((error = retrieve_reflog_path(&path, repo, name)) < 0) - return error; - - error = create_new_reflog_file(git_buf_cstr(&path)); - git_buf_free(&path); - - return error; -} - -static int has_reflog(git_repository *repo, const char *name) -{ - int ret = 0; - git_buf path = GIT_BUF_INIT; - - if (retrieve_reflog_path(&path, repo, name) < 0) - goto cleanup; - - ret = git_path_isfile(git_buf_cstr(&path)); - -cleanup: - git_buf_free(&path); - return ret; -} - -static int refdb_reflog_fs__has_log(git_refdb_backend *_backend, const char *name) -{ - refdb_fs_backend *backend; - - assert(_backend && name); - - backend = (refdb_fs_backend *) _backend; - - return has_reflog(backend->repo, name); -} - -static int refdb_reflog_fs__read(git_reflog **out, git_refdb_backend *_backend, const char *name) -{ - int error = -1; - git_buf log_path = GIT_BUF_INIT; - git_buf log_file = GIT_BUF_INIT; - git_reflog *log = NULL; - git_repository *repo; - refdb_fs_backend *backend; - - assert(out && _backend && name); - - backend = (refdb_fs_backend *) _backend; - repo = backend->repo; - - if (reflog_alloc(&log, name) < 0) - return -1; - - if (retrieve_reflog_path(&log_path, repo, name) < 0) - goto cleanup; - - error = git_futils_readbuffer(&log_file, git_buf_cstr(&log_path)); - if (error < 0 && error != GIT_ENOTFOUND) - goto cleanup; - - if ((error == GIT_ENOTFOUND) && - ((error = create_new_reflog_file(git_buf_cstr(&log_path))) < 0)) - goto cleanup; - - if ((error = reflog_parse(log, - git_buf_cstr(&log_file), git_buf_len(&log_file))) < 0) - goto cleanup; - - *out = log; - goto success; - -cleanup: - git_reflog_free(log); - -success: - git_buf_free(&log_file); - git_buf_free(&log_path); - - return error; -} - -static int serialize_reflog_entry( - git_buf *buf, - const git_oid *oid_old, - const git_oid *oid_new, - const git_signature *committer, - const char *msg) -{ - char raw_old[GIT_OID_HEXSZ+1]; - char raw_new[GIT_OID_HEXSZ+1]; - - git_oid_tostr(raw_old, GIT_OID_HEXSZ+1, oid_old); - git_oid_tostr(raw_new, GIT_OID_HEXSZ+1, oid_new); - - git_buf_clear(buf); - - git_buf_puts(buf, raw_old); - git_buf_putc(buf, ' '); - git_buf_puts(buf, raw_new); - - git_signature__writebuf(buf, " ", committer); - - /* drop trailing LF */ - git_buf_rtrim(buf); - - if (msg) { - git_buf_putc(buf, '\t'); - git_buf_puts(buf, msg); - } - - git_buf_putc(buf, '\n'); - - return git_buf_oom(buf); -} - -static int lock_reflog(git_filebuf *file, refdb_fs_backend *backend, const char *refname) -{ - git_repository *repo; - git_buf log_path = GIT_BUF_INIT; - int error; - - repo = backend->repo; - - if (!git_path_isvalid(backend->repo, refname, GIT_PATH_REJECT_DEFAULTS)) { - giterr_set(GITERR_INVALID, "Invalid reference name '%s'.", refname); - return GIT_EINVALIDSPEC; - } - - if (retrieve_reflog_path(&log_path, repo, refname) < 0) - return -1; - - if (!git_path_isfile(git_buf_cstr(&log_path))) { - giterr_set(GITERR_INVALID, - "Log file for reference '%s' doesn't exist.", refname); - error = -1; - goto cleanup; - } - - error = git_filebuf_open(file, git_buf_cstr(&log_path), 0, GIT_REFLOG_FILE_MODE); - -cleanup: - git_buf_free(&log_path); - - return error; -} - -static int refdb_reflog_fs__write(git_refdb_backend *_backend, git_reflog *reflog) -{ - int error = -1; - unsigned int i; - git_reflog_entry *entry; - refdb_fs_backend *backend; - git_buf log = GIT_BUF_INIT; - git_filebuf fbuf = GIT_FILEBUF_INIT; - - assert(_backend && reflog); - - backend = (refdb_fs_backend *) _backend; - - if ((error = lock_reflog(&fbuf, backend, reflog->ref_name)) < 0) - return -1; - - git_vector_foreach(&reflog->entries, i, entry) { - if (serialize_reflog_entry(&log, &(entry->oid_old), &(entry->oid_cur), entry->committer, entry->msg) < 0) - goto cleanup; - - if ((error = git_filebuf_write(&fbuf, log.ptr, log.size)) < 0) - goto cleanup; - } - - error = git_filebuf_commit(&fbuf); - goto success; - -cleanup: - git_filebuf_cleanup(&fbuf); - -success: - git_buf_free(&log); - - return error; -} - -/* Append to the reflog, must be called under reference lock */ -static int reflog_append(refdb_fs_backend *backend, const git_reference *ref, const git_oid *old, const git_oid *new, const git_signature *who, const char *message) -{ - int error, is_symbolic; - git_oid old_id = {{0}}, new_id = {{0}}; - git_buf buf = GIT_BUF_INIT, path = GIT_BUF_INIT; - git_repository *repo = backend->repo; - - is_symbolic = ref->type == GIT_REF_SYMBOLIC; - - /* "normal" symbolic updates do not write */ - if (is_symbolic && - strcmp(ref->name, GIT_HEAD_FILE) && - !(old && new)) - return 0; - - /* From here on is_symoblic also means that it's HEAD */ - - if (old) { - git_oid_cpy(&old_id, old); - } else { - error = git_reference_name_to_id(&old_id, repo, ref->name); - if (error < 0 && error != GIT_ENOTFOUND) - return error; - } - - if (new) { - git_oid_cpy(&new_id, new); - } else { - if (!is_symbolic) { - git_oid_cpy(&new_id, git_reference_target(ref)); - } else { - error = git_reference_name_to_id(&new_id, repo, git_reference_symbolic_target(ref)); - if (error < 0 && error != GIT_ENOTFOUND) - return error; - /* detaching HEAD does not create an entry */ - if (error == GIT_ENOTFOUND) - return 0; - - giterr_clear(); - } - } - - if ((error = serialize_reflog_entry(&buf, &old_id, &new_id, who, message)) < 0) - goto cleanup; - - if ((error = retrieve_reflog_path(&path, repo, ref->name)) < 0) - goto cleanup; - - if (((error = git_futils_mkpath2file(git_buf_cstr(&path), 0777)) < 0) && - (error != GIT_EEXISTS)) { - goto cleanup; - } - - /* If the new branch matches part of the namespace of a previously deleted branch, - * there maybe an obsolete/unused directory (or directory hierarchy) in the way. - */ - if (git_path_isdir(git_buf_cstr(&path)) && - (git_futils_rmdir_r(git_buf_cstr(&path), NULL, GIT_RMDIR_SKIP_NONEMPTY) < 0)) { - error = -1; - goto cleanup; - } - - error = git_futils_writebuffer(&buf, git_buf_cstr(&path), O_WRONLY|O_CREAT|O_APPEND, GIT_REFLOG_FILE_MODE); - -cleanup: - git_buf_free(&buf); - git_buf_free(&path); - - return error; -} - -static int refdb_reflog_fs__rename(git_refdb_backend *_backend, const char *old_name, const char *new_name) -{ - int error = 0, fd; - git_buf old_path = GIT_BUF_INIT; - git_buf new_path = GIT_BUF_INIT; - git_buf temp_path = GIT_BUF_INIT; - git_buf normalized = GIT_BUF_INIT; - git_repository *repo; - refdb_fs_backend *backend; - - assert(_backend && old_name && new_name); - - backend = (refdb_fs_backend *) _backend; - repo = backend->repo; - - if ((error = git_reference__normalize_name( - &normalized, new_name, GIT_REF_FORMAT_ALLOW_ONELEVEL)) < 0) - return error; - - if (git_buf_joinpath(&temp_path, repo->path_repository, GIT_REFLOG_DIR) < 0) - return -1; - - if (git_buf_joinpath(&old_path, git_buf_cstr(&temp_path), old_name) < 0) - return -1; - - if (git_buf_joinpath(&new_path, git_buf_cstr(&temp_path), git_buf_cstr(&normalized)) < 0) - return -1; - - if (!git_path_exists(git_buf_cstr(&old_path))) { - error = GIT_ENOTFOUND; - goto cleanup; - } - - /* - * Move the reflog to a temporary place. This two-phase renaming is required - * in order to cope with funny renaming use cases when one tries to move a reference - * to a partially colliding namespace: - * - a/b -> a/b/c - * - a/b/c/d -> a/b/c - */ - if (git_buf_joinpath(&temp_path, git_buf_cstr(&temp_path), "temp_reflog") < 0) - return -1; - - if ((fd = git_futils_mktmp(&temp_path, git_buf_cstr(&temp_path), GIT_REFLOG_FILE_MODE)) < 0) { - error = -1; - goto cleanup; - } - - p_close(fd); - - if (p_rename(git_buf_cstr(&old_path), git_buf_cstr(&temp_path)) < 0) { - giterr_set(GITERR_OS, "Failed to rename reflog for %s", new_name); - error = -1; - goto cleanup; - } - - if (git_path_isdir(git_buf_cstr(&new_path)) && - (git_futils_rmdir_r(git_buf_cstr(&new_path), NULL, GIT_RMDIR_SKIP_NONEMPTY) < 0)) { - error = -1; - goto cleanup; - } - - if (git_futils_mkpath2file(git_buf_cstr(&new_path), GIT_REFLOG_DIR_MODE) < 0) { - error = -1; - goto cleanup; - } - - if (p_rename(git_buf_cstr(&temp_path), git_buf_cstr(&new_path)) < 0) { - giterr_set(GITERR_OS, "Failed to rename reflog for %s", new_name); - error = -1; - } - -cleanup: - git_buf_free(&temp_path); - git_buf_free(&old_path); - git_buf_free(&new_path); - git_buf_free(&normalized); - - return error; -} - -static int refdb_reflog_fs__delete(git_refdb_backend *_backend, const char *name) -{ - int error; - git_buf path = GIT_BUF_INIT; - - git_repository *repo; - refdb_fs_backend *backend; - - assert(_backend && name); - - backend = (refdb_fs_backend *) _backend; - repo = backend->repo; - - error = retrieve_reflog_path(&path, repo, name); - - if (!error && git_path_exists(path.ptr)) - error = p_unlink(path.ptr); - - git_buf_free(&path); - - return error; - -} - -int git_refdb_backend_fs( - git_refdb_backend **backend_out, - git_repository *repository) -{ - int t = 0; - git_buf path = GIT_BUF_INIT; - refdb_fs_backend *backend; - - backend = git__calloc(1, sizeof(refdb_fs_backend)); - GITERR_CHECK_ALLOC(backend); - - backend->repo = repository; - - if (setup_namespace(&path, repository) < 0) - goto fail; - - backend->path = git_buf_detach(&path); - - if (git_buf_joinpath(&path, backend->path, GIT_PACKEDREFS_FILE) < 0 || - git_sortedcache_new( - &backend->refcache, offsetof(struct packref, name), - NULL, NULL, packref_cmp, git_buf_cstr(&path)) < 0) - goto fail; - - git_buf_free(&path); - - if (!git_repository__cvar(&t, backend->repo, GIT_CVAR_IGNORECASE) && t) { - backend->iterator_flags |= GIT_ITERATOR_IGNORE_CASE; - backend->direach_flags |= GIT_PATH_DIR_IGNORE_CASE; - } - if (!git_repository__cvar(&t, backend->repo, GIT_CVAR_PRECOMPOSE) && t) { - backend->iterator_flags |= GIT_ITERATOR_PRECOMPOSE_UNICODE; - backend->direach_flags |= GIT_PATH_DIR_PRECOMPOSE_UNICODE; - } - - backend->parent.exists = &refdb_fs_backend__exists; - backend->parent.lookup = &refdb_fs_backend__lookup; - backend->parent.iterator = &refdb_fs_backend__iterator; - backend->parent.write = &refdb_fs_backend__write; - backend->parent.del = &refdb_fs_backend__delete; - backend->parent.rename = &refdb_fs_backend__rename; - backend->parent.compress = &refdb_fs_backend__compress; - backend->parent.lock = &refdb_fs_backend__lock; - backend->parent.unlock = &refdb_fs_backend__unlock; - backend->parent.has_log = &refdb_reflog_fs__has_log; - backend->parent.ensure_log = &refdb_reflog_fs__ensure_log; - backend->parent.free = &refdb_fs_backend__free; - backend->parent.reflog_read = &refdb_reflog_fs__read; - backend->parent.reflog_write = &refdb_reflog_fs__write; - backend->parent.reflog_rename = &refdb_reflog_fs__rename; - backend->parent.reflog_delete = &refdb_reflog_fs__delete; - - *backend_out = (git_refdb_backend *)backend; - return 0; - -fail: - git_buf_free(&path); - git__free(backend->path); - git__free(backend); - return -1; -} diff --git a/vendor/libgit2/src/refdb_fs.h b/vendor/libgit2/src/refdb_fs.h deleted file mode 100644 index 79e2968330..0000000000 --- a/vendor/libgit2/src/refdb_fs.h +++ /dev/null @@ -1,15 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_refdb_fs_h__ -#define INCLUDE_refdb_fs_h__ - -typedef struct { - git_strmap *packfile; - time_t packfile_time; -} git_refcache; - -#endif diff --git a/vendor/libgit2/src/reflog.c b/vendor/libgit2/src/reflog.c deleted file mode 100644 index 9ce9aee6f4..0000000000 --- a/vendor/libgit2/src/reflog.c +++ /dev/null @@ -1,232 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#include "reflog.h" -#include "repository.h" -#include "filebuf.h" -#include "signature.h" -#include "refdb.h" - -#include - -git_reflog_entry *git_reflog_entry__alloc(void) -{ - return git__calloc(1, sizeof(git_reflog_entry)); -} - -void git_reflog_entry__free(git_reflog_entry *entry) -{ - git_signature_free(entry->committer); - - git__free(entry->msg); - git__free(entry); -} - -void git_reflog_free(git_reflog *reflog) -{ - size_t i; - git_reflog_entry *entry; - - if (reflog == NULL) - return; - - if (reflog->db) - GIT_REFCOUNT_DEC(reflog->db, git_refdb__free); - - for (i=0; i < reflog->entries.length; i++) { - entry = git_vector_get(&reflog->entries, i); - - git_reflog_entry__free(entry); - } - - git_vector_free(&reflog->entries); - git__free(reflog->ref_name); - git__free(reflog); -} - -int git_reflog_read(git_reflog **reflog, git_repository *repo, const char *name) -{ - git_refdb *refdb; - int error; - - assert(reflog && repo && name); - - if ((error = git_repository_refdb__weakptr(&refdb, repo)) < 0) - return error; - - return git_refdb_reflog_read(reflog, refdb, name); -} - -int git_reflog_write(git_reflog *reflog) -{ - git_refdb *db; - - assert(reflog && reflog->db); - - db = reflog->db; - return db->backend->reflog_write(db->backend, reflog); -} - -int git_reflog_append(git_reflog *reflog, const git_oid *new_oid, const git_signature *committer, const char *msg) -{ - git_reflog_entry *entry; - const git_reflog_entry *previous; - const char *newline; - - assert(reflog && new_oid && committer); - - entry = git__calloc(1, sizeof(git_reflog_entry)); - GITERR_CHECK_ALLOC(entry); - - if ((git_signature_dup(&entry->committer, committer)) < 0) - goto cleanup; - - if (msg != NULL) { - if ((entry->msg = git__strdup(msg)) == NULL) - goto cleanup; - - newline = strchr(msg, '\n'); - - if (newline) { - if (newline[1] != '\0') { - giterr_set(GITERR_INVALID, "Reflog message cannot contain newline"); - goto cleanup; - } - - entry->msg[newline - msg] = '\0'; - } - } - - previous = git_reflog_entry_byindex(reflog, 0); - - if (previous == NULL) - git_oid_fromstr(&entry->oid_old, GIT_OID_HEX_ZERO); - else - git_oid_cpy(&entry->oid_old, &previous->oid_cur); - - git_oid_cpy(&entry->oid_cur, new_oid); - - if (git_vector_insert(&reflog->entries, entry) < 0) - goto cleanup; - - return 0; - -cleanup: - git_reflog_entry__free(entry); - return -1; -} - -int git_reflog_rename(git_repository *repo, const char *old_name, const char *new_name) -{ - git_refdb *refdb; - int error; - - if ((error = git_repository_refdb__weakptr(&refdb, repo)) < 0) - return -1; - - return refdb->backend->reflog_rename(refdb->backend, old_name, new_name); -} - -int git_reflog_delete(git_repository *repo, const char *name) -{ - git_refdb *refdb; - int error; - - if ((error = git_repository_refdb__weakptr(&refdb, repo)) < 0) - return -1; - - return refdb->backend->reflog_delete(refdb->backend, name); -} - -size_t git_reflog_entrycount(git_reflog *reflog) -{ - assert(reflog); - return reflog->entries.length; -} - -const git_reflog_entry * git_reflog_entry_byindex(const git_reflog *reflog, size_t idx) -{ - assert(reflog); - - if (idx >= reflog->entries.length) - return NULL; - - return git_vector_get( - &reflog->entries, reflog_inverse_index(idx, reflog->entries.length)); -} - -const git_oid * git_reflog_entry_id_old(const git_reflog_entry *entry) -{ - assert(entry); - return &entry->oid_old; -} - -const git_oid * git_reflog_entry_id_new(const git_reflog_entry *entry) -{ - assert(entry); - return &entry->oid_cur; -} - -const git_signature * git_reflog_entry_committer(const git_reflog_entry *entry) -{ - assert(entry); - return entry->committer; -} - -const char * git_reflog_entry_message(const git_reflog_entry *entry) -{ - assert(entry); - return entry->msg; -} - -int git_reflog_drop(git_reflog *reflog, size_t idx, int rewrite_previous_entry) -{ - size_t entrycount; - git_reflog_entry *entry, *previous; - - entrycount = git_reflog_entrycount(reflog); - - entry = (git_reflog_entry *)git_reflog_entry_byindex(reflog, idx); - - if (entry == NULL) { - giterr_set(GITERR_REFERENCE, "No reflog entry at index %"PRIuZ, idx); - return GIT_ENOTFOUND; - } - - git_reflog_entry__free(entry); - - if (git_vector_remove( - &reflog->entries, reflog_inverse_index(idx, entrycount)) < 0) - return -1; - - if (!rewrite_previous_entry) - return 0; - - /* No need to rewrite anything when removing the most recent entry */ - if (idx == 0) - return 0; - - /* Have the latest entry just been dropped? */ - if (entrycount == 1) - return 0; - - entry = (git_reflog_entry *)git_reflog_entry_byindex(reflog, idx - 1); - - /* If the oldest entry has just been removed... */ - if (idx == entrycount - 1) { - /* ...clear the oid_old member of the "new" oldest entry */ - if (git_oid_fromstr(&entry->oid_old, GIT_OID_HEX_ZERO) < 0) - return -1; - - return 0; - } - - previous = (git_reflog_entry *)git_reflog_entry_byindex(reflog, idx); - git_oid_cpy(&entry->oid_old, &previous->oid_cur); - - return 0; -} diff --git a/vendor/libgit2/src/reflog.h b/vendor/libgit2/src/reflog.h deleted file mode 100644 index 2d31ae47d4..0000000000 --- a/vendor/libgit2/src/reflog.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_reflog_h__ -#define INCLUDE_reflog_h__ - -#include "common.h" -#include "git2/reflog.h" -#include "vector.h" - -#define GIT_REFLOG_DIR "logs/" -#define GIT_REFLOG_DIR_MODE 0777 -#define GIT_REFLOG_FILE_MODE 0666 - -#define GIT_REFLOG_SIZE_MIN (2*GIT_OID_HEXSZ+2+17) - -struct git_reflog_entry { - git_oid oid_old; - git_oid oid_cur; - - git_signature *committer; - - char *msg; -}; - -struct git_reflog { - git_refdb *db; - char *ref_name; - git_vector entries; -}; - -GIT_INLINE(size_t) reflog_inverse_index(size_t idx, size_t total) -{ - return (total - 1) - idx; -} - -#endif /* INCLUDE_reflog_h__ */ diff --git a/vendor/libgit2/src/refs.c b/vendor/libgit2/src/refs.c deleted file mode 100644 index 7b538659d9..0000000000 --- a/vendor/libgit2/src/refs.c +++ /dev/null @@ -1,1305 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#include "refs.h" -#include "hash.h" -#include "repository.h" -#include "fileops.h" -#include "filebuf.h" -#include "pack.h" -#include "reflog.h" -#include "refdb.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -GIT__USE_STRMAP - -#define DEFAULT_NESTING_LEVEL 5 -#define MAX_NESTING_LEVEL 10 - -enum { - GIT_PACKREF_HAS_PEEL = 1, - GIT_PACKREF_WAS_LOOSE = 2 -}; - -static git_reference *alloc_ref(const char *name) -{ - git_reference *ref = NULL; - size_t namelen = strlen(name), reflen; - - if (!GIT_ADD_SIZET_OVERFLOW(&reflen, sizeof(git_reference), namelen) && - !GIT_ADD_SIZET_OVERFLOW(&reflen, reflen, 1) && - (ref = git__calloc(1, reflen)) != NULL) - memcpy(ref->name, name, namelen + 1); - - return ref; -} - -git_reference *git_reference__alloc_symbolic( - const char *name, const char *target) -{ - git_reference *ref; - - assert(name && target); - - ref = alloc_ref(name); - if (!ref) - return NULL; - - ref->type = GIT_REF_SYMBOLIC; - - if ((ref->target.symbolic = git__strdup(target)) == NULL) { - git__free(ref); - return NULL; - } - - return ref; -} - -git_reference *git_reference__alloc( - const char *name, - const git_oid *oid, - const git_oid *peel) -{ - git_reference *ref; - - assert(name && oid); - - ref = alloc_ref(name); - if (!ref) - return NULL; - - ref->type = GIT_REF_OID; - git_oid_cpy(&ref->target.oid, oid); - - if (peel != NULL) - git_oid_cpy(&ref->peel, peel); - - return ref; -} - -git_reference *git_reference__set_name( - git_reference *ref, const char *name) -{ - size_t namelen = strlen(name); - size_t reflen; - git_reference *rewrite = NULL; - - if (!GIT_ADD_SIZET_OVERFLOW(&reflen, sizeof(git_reference), namelen) && - !GIT_ADD_SIZET_OVERFLOW(&reflen, reflen, 1) && - (rewrite = git__realloc(ref, reflen)) != NULL) - memcpy(rewrite->name, name, namelen + 1); - - return rewrite; -} - -void git_reference_free(git_reference *reference) -{ - if (reference == NULL) - return; - - if (reference->type == GIT_REF_SYMBOLIC) - git__free(reference->target.symbolic); - - if (reference->db) - GIT_REFCOUNT_DEC(reference->db, git_refdb__free); - - git__free(reference); -} - -int git_reference_delete(git_reference *ref) -{ - const git_oid *old_id = NULL; - const char *old_target = NULL; - - if (ref->type == GIT_REF_OID) - old_id = &ref->target.oid; - else - old_target = ref->target.symbolic; - - return git_refdb_delete(ref->db, ref->name, old_id, old_target); -} - -int git_reference_remove(git_repository *repo, const char *name) -{ - git_refdb *db; - int error; - - if ((error = git_repository_refdb__weakptr(&db, repo)) < 0) - return error; - - return git_refdb_delete(db, name, NULL, NULL); -} - -int git_reference_lookup(git_reference **ref_out, - git_repository *repo, const char *name) -{ - return git_reference_lookup_resolved(ref_out, repo, name, 0); -} - -int git_reference_name_to_id( - git_oid *out, git_repository *repo, const char *name) -{ - int error; - git_reference *ref; - - if ((error = git_reference_lookup_resolved(&ref, repo, name, -1)) < 0) - return error; - - git_oid_cpy(out, git_reference_target(ref)); - git_reference_free(ref); - return 0; -} - -static int reference_normalize_for_repo( - git_refname_t out, - git_repository *repo, - const char *name) -{ - int precompose; - unsigned int flags = GIT_REF_FORMAT_ALLOW_ONELEVEL; - - if (!git_repository__cvar(&precompose, repo, GIT_CVAR_PRECOMPOSE) && - precompose) - flags |= GIT_REF_FORMAT__PRECOMPOSE_UNICODE; - - return git_reference_normalize_name(out, GIT_REFNAME_MAX, name, flags); -} - -int git_reference_lookup_resolved( - git_reference **ref_out, - git_repository *repo, - const char *name, - int max_nesting) -{ - git_refname_t scan_name; - git_ref_t scan_type; - int error = 0, nesting; - git_reference *ref = NULL; - git_refdb *refdb; - - assert(ref_out && repo && name); - - *ref_out = NULL; - - if (max_nesting > MAX_NESTING_LEVEL) - max_nesting = MAX_NESTING_LEVEL; - else if (max_nesting < 0) - max_nesting = DEFAULT_NESTING_LEVEL; - - scan_type = GIT_REF_SYMBOLIC; - - if ((error = reference_normalize_for_repo(scan_name, repo, name)) < 0) - return error; - - if ((error = git_repository_refdb__weakptr(&refdb, repo)) < 0) - return error; - - for (nesting = max_nesting; - nesting >= 0 && scan_type == GIT_REF_SYMBOLIC; - nesting--) - { - if (nesting != max_nesting) { - strncpy(scan_name, ref->target.symbolic, sizeof(scan_name)); - git_reference_free(ref); - } - - if ((error = git_refdb_lookup(&ref, refdb, scan_name)) < 0) - return error; - - scan_type = ref->type; - } - - if (scan_type != GIT_REF_OID && max_nesting != 0) { - giterr_set(GITERR_REFERENCE, - "Cannot resolve reference (>%u levels deep)", max_nesting); - git_reference_free(ref); - return -1; - } - - *ref_out = ref; - return 0; -} - -int git_reference_dwim(git_reference **out, git_repository *repo, const char *refname) -{ - int error = 0, i; - bool fallbackmode = true, foundvalid = false; - git_reference *ref; - git_buf refnamebuf = GIT_BUF_INIT, name = GIT_BUF_INIT; - - static const char* formatters[] = { - "%s", - GIT_REFS_DIR "%s", - GIT_REFS_TAGS_DIR "%s", - GIT_REFS_HEADS_DIR "%s", - GIT_REFS_REMOTES_DIR "%s", - GIT_REFS_REMOTES_DIR "%s/" GIT_HEAD_FILE, - NULL - }; - - if (*refname) - git_buf_puts(&name, refname); - else { - git_buf_puts(&name, GIT_HEAD_FILE); - fallbackmode = false; - } - - for (i = 0; formatters[i] && (fallbackmode || i == 0); i++) { - - git_buf_clear(&refnamebuf); - - if ((error = git_buf_printf(&refnamebuf, formatters[i], git_buf_cstr(&name))) < 0) - goto cleanup; - - if (!git_reference_is_valid_name(git_buf_cstr(&refnamebuf))) { - error = GIT_EINVALIDSPEC; - continue; - } - foundvalid = true; - - error = git_reference_lookup_resolved(&ref, repo, git_buf_cstr(&refnamebuf), -1); - - if (!error) { - *out = ref; - error = 0; - goto cleanup; - } - - if (error != GIT_ENOTFOUND) - goto cleanup; - } - -cleanup: - if (error && !foundvalid) { - /* never found a valid reference name */ - giterr_set(GITERR_REFERENCE, - "Could not use '%s' as valid reference name", git_buf_cstr(&name)); - } - - git_buf_free(&name); - git_buf_free(&refnamebuf); - return error; -} - -/** - * Getters - */ -git_ref_t git_reference_type(const git_reference *ref) -{ - assert(ref); - return ref->type; -} - -const char *git_reference_name(const git_reference *ref) -{ - assert(ref); - return ref->name; -} - -git_repository *git_reference_owner(const git_reference *ref) -{ - assert(ref); - return ref->db->repo; -} - -const git_oid *git_reference_target(const git_reference *ref) -{ - assert(ref); - - if (ref->type != GIT_REF_OID) - return NULL; - - return &ref->target.oid; -} - -const git_oid *git_reference_target_peel(const git_reference *ref) -{ - assert(ref); - - if (ref->type != GIT_REF_OID || git_oid_iszero(&ref->peel)) - return NULL; - - return &ref->peel; -} - -const char *git_reference_symbolic_target(const git_reference *ref) -{ - assert(ref); - - if (ref->type != GIT_REF_SYMBOLIC) - return NULL; - - return ref->target.symbolic; -} - -static int reference__create( - git_reference **ref_out, - git_repository *repo, - const char *name, - const git_oid *oid, - const char *symbolic, - int force, - const git_signature *signature, - const char *log_message, - const git_oid *old_id, - const char *old_target) -{ - git_refname_t normalized; - git_refdb *refdb; - git_reference *ref = NULL; - int error = 0; - - assert(repo && name); - assert(symbolic || signature); - - if (ref_out) - *ref_out = NULL; - - error = reference_normalize_for_repo(normalized, repo, name); - if (error < 0) - return error; - - error = git_repository_refdb__weakptr(&refdb, repo); - if (error < 0) - return error; - - if (oid != NULL) { - git_odb *odb; - - assert(symbolic == NULL); - - /* Sanity check the reference being created - target must exist. */ - if ((error = git_repository_odb__weakptr(&odb, repo)) < 0) - return error; - - if (!git_odb_exists(odb, oid)) { - giterr_set(GITERR_REFERENCE, - "Target OID for the reference doesn't exist on the repository"); - return -1; - } - - ref = git_reference__alloc(normalized, oid, NULL); - } else { - git_refname_t normalized_target; - - if ((error = reference_normalize_for_repo(normalized_target, repo, symbolic)) < 0) - return error; - - ref = git_reference__alloc_symbolic(normalized, normalized_target); - } - - GITERR_CHECK_ALLOC(ref); - - if ((error = git_refdb_write(refdb, ref, force, signature, log_message, old_id, old_target)) < 0) { - git_reference_free(ref); - return error; - } - - if (ref_out == NULL) - git_reference_free(ref); - else - *ref_out = ref; - - return 0; -} - -int configured_ident(git_signature **out, const git_repository *repo) -{ - if (repo->ident_name && repo->ident_email) - return git_signature_now(out, repo->ident_name, repo->ident_email); - - /* if not configured let us fall-through to the next method */ - return -1; -} - -int git_reference__log_signature(git_signature **out, git_repository *repo) -{ - int error; - git_signature *who; - - if(((error = configured_ident(&who, repo)) < 0) && - ((error = git_signature_default(&who, repo)) < 0) && - ((error = git_signature_now(&who, "unknown", "unknown")) < 0)) - return error; - - *out = who; - return 0; -} - -int git_reference_create_matching( - git_reference **ref_out, - git_repository *repo, - const char *name, - const git_oid *id, - int force, - const git_oid *old_id, - const char *log_message) - -{ - int error; - git_signature *who = NULL; - - assert(id); - - if ((error = git_reference__log_signature(&who, repo)) < 0) - return error; - - error = reference__create( - ref_out, repo, name, id, NULL, force, who, log_message, old_id, NULL); - - git_signature_free(who); - return error; -} - -int git_reference_create( - git_reference **ref_out, - git_repository *repo, - const char *name, - const git_oid *id, - int force, - const char *log_message) -{ - return git_reference_create_matching(ref_out, repo, name, id, force, NULL, log_message); -} - -int git_reference_symbolic_create_matching( - git_reference **ref_out, - git_repository *repo, - const char *name, - const char *target, - int force, - const char *old_target, - const char *log_message) -{ - int error; - git_signature *who = NULL; - - assert(target); - - if ((error = git_reference__log_signature(&who, repo)) < 0) - return error; - - error = reference__create( - ref_out, repo, name, NULL, target, force, who, log_message, NULL, old_target); - - git_signature_free(who); - return error; -} - -int git_reference_symbolic_create( - git_reference **ref_out, - git_repository *repo, - const char *name, - const char *target, - int force, - const char *log_message) -{ - return git_reference_symbolic_create_matching(ref_out, repo, name, target, force, NULL, log_message); -} - -static int ensure_is_an_updatable_direct_reference(git_reference *ref) -{ - if (ref->type == GIT_REF_OID) - return 0; - - giterr_set(GITERR_REFERENCE, "Cannot set OID on symbolic reference"); - return -1; -} - -int git_reference_set_target( - git_reference **out, - git_reference *ref, - const git_oid *id, - const char *log_message) -{ - int error; - git_repository *repo; - - assert(out && ref && id); - - repo = ref->db->repo; - - if ((error = ensure_is_an_updatable_direct_reference(ref)) < 0) - return error; - - return git_reference_create_matching(out, repo, ref->name, id, 1, &ref->target.oid, log_message); -} - -static int ensure_is_an_updatable_symbolic_reference(git_reference *ref) -{ - if (ref->type == GIT_REF_SYMBOLIC) - return 0; - - giterr_set(GITERR_REFERENCE, "Cannot set symbolic target on a direct reference"); - return -1; -} - -int git_reference_symbolic_set_target( - git_reference **out, - git_reference *ref, - const char *target, - const char *log_message) -{ - int error; - - assert(out && ref && target); - - if ((error = ensure_is_an_updatable_symbolic_reference(ref)) < 0) - return error; - - return git_reference_symbolic_create_matching( - out, ref->db->repo, ref->name, target, 1, ref->target.symbolic, log_message); -} - -static int reference__rename(git_reference **out, git_reference *ref, const char *new_name, int force, - const git_signature *signature, const char *message) -{ - git_refname_t normalized; - bool should_head_be_updated = false; - int error = 0; - - assert(ref && new_name && signature); - - if ((error = reference_normalize_for_repo( - normalized, git_reference_owner(ref), new_name)) < 0) - return error; - - - /* Check if we have to update HEAD. */ - if ((error = git_branch_is_head(ref)) < 0) - return error; - - should_head_be_updated = (error > 0); - - if ((error = git_refdb_rename(out, ref->db, ref->name, normalized, force, signature, message)) < 0) - return error; - - /* Update HEAD it was pointing to the reference being renamed */ - if (should_head_be_updated && - (error = git_repository_set_head(ref->db->repo, normalized)) < 0) { - giterr_set(GITERR_REFERENCE, "Failed to update HEAD after renaming reference"); - return error; - } - - return 0; -} - - -int git_reference_rename( - git_reference **out, - git_reference *ref, - const char *new_name, - int force, - const char *log_message) -{ - git_signature *who; - int error; - - if ((error = git_reference__log_signature(&who, ref->db->repo)) < 0) - return error; - - error = reference__rename(out, ref, new_name, force, who, log_message); - git_signature_free(who); - - return error; -} - -int git_reference_resolve(git_reference **ref_out, const git_reference *ref) -{ - switch (git_reference_type(ref)) { - case GIT_REF_OID: - return git_reference_lookup(ref_out, ref->db->repo, ref->name); - - case GIT_REF_SYMBOLIC: - return git_reference_lookup_resolved(ref_out, ref->db->repo, ref->target.symbolic, -1); - - default: - giterr_set(GITERR_REFERENCE, "Invalid reference"); - return -1; - } -} - -int git_reference_foreach( - git_repository *repo, - git_reference_foreach_cb callback, - void *payload) -{ - git_reference_iterator *iter; - git_reference *ref; - int error; - - if ((error = git_reference_iterator_new(&iter, repo)) < 0) - return error; - - while (!(error = git_reference_next(&ref, iter))) { - if ((error = callback(ref, payload)) != 0) { - giterr_set_after_callback(error); - break; - } - } - - if (error == GIT_ITEROVER) - error = 0; - - git_reference_iterator_free(iter); - return error; -} - -int git_reference_foreach_name( - git_repository *repo, - git_reference_foreach_name_cb callback, - void *payload) -{ - git_reference_iterator *iter; - const char *refname; - int error; - - if ((error = git_reference_iterator_new(&iter, repo)) < 0) - return error; - - while (!(error = git_reference_next_name(&refname, iter))) { - if ((error = callback(refname, payload)) != 0) { - giterr_set_after_callback(error); - break; - } - } - - if (error == GIT_ITEROVER) - error = 0; - - git_reference_iterator_free(iter); - return error; -} - -int git_reference_foreach_glob( - git_repository *repo, - const char *glob, - git_reference_foreach_name_cb callback, - void *payload) -{ - git_reference_iterator *iter; - const char *refname; - int error; - - if ((error = git_reference_iterator_glob_new(&iter, repo, glob)) < 0) - return error; - - while (!(error = git_reference_next_name(&refname, iter))) { - if ((error = callback(refname, payload)) != 0) { - giterr_set_after_callback(error); - break; - } - } - - if (error == GIT_ITEROVER) - error = 0; - - git_reference_iterator_free(iter); - return error; -} - -int git_reference_iterator_new(git_reference_iterator **out, git_repository *repo) -{ - git_refdb *refdb; - - if (git_repository_refdb__weakptr(&refdb, repo) < 0) - return -1; - - return git_refdb_iterator(out, refdb, NULL); -} - -int git_reference_iterator_glob_new( - git_reference_iterator **out, git_repository *repo, const char *glob) -{ - git_refdb *refdb; - - if (git_repository_refdb__weakptr(&refdb, repo) < 0) - return -1; - - return git_refdb_iterator(out, refdb, glob); -} - -int git_reference_next(git_reference **out, git_reference_iterator *iter) -{ - return git_refdb_iterator_next(out, iter); -} - -int git_reference_next_name(const char **out, git_reference_iterator *iter) -{ - return git_refdb_iterator_next_name(out, iter); -} - -void git_reference_iterator_free(git_reference_iterator *iter) -{ - if (iter == NULL) - return; - - git_refdb_iterator_free(iter); -} - -static int cb__reflist_add(const char *ref, void *data) -{ - char *name = git__strdup(ref); - GITERR_CHECK_ALLOC(name); - return git_vector_insert((git_vector *)data, name); -} - -int git_reference_list( - git_strarray *array, - git_repository *repo) -{ - git_vector ref_list; - - assert(array && repo); - - array->strings = NULL; - array->count = 0; - - if (git_vector_init(&ref_list, 8, NULL) < 0) - return -1; - - if (git_reference_foreach_name( - repo, &cb__reflist_add, (void *)&ref_list) < 0) { - git_vector_free(&ref_list); - return -1; - } - - array->strings = (char **)git_vector_detach(&array->count, NULL, &ref_list); - - return 0; -} - -static int is_valid_ref_char(char ch) -{ - if ((unsigned) ch <= ' ') - return 0; - - switch (ch) { - case '~': - case '^': - case ':': - case '\\': - case '?': - case '[': - case '*': - return 0; - default: - return 1; - } -} - -static int ensure_segment_validity(const char *name) -{ - const char *current = name; - char prev = '\0'; - const int lock_len = (int)strlen(GIT_FILELOCK_EXTENSION); - int segment_len; - - if (*current == '.') - return -1; /* Refname starts with "." */ - - for (current = name; ; current++) { - if (*current == '\0' || *current == '/') - break; - - if (!is_valid_ref_char(*current)) - return -1; /* Illegal character in refname */ - - if (prev == '.' && *current == '.') - return -1; /* Refname contains ".." */ - - if (prev == '@' && *current == '{') - return -1; /* Refname contains "@{" */ - - prev = *current; - } - - segment_len = (int)(current - name); - - /* A refname component can not end with ".lock" */ - if (segment_len >= lock_len && - !memcmp(current - lock_len, GIT_FILELOCK_EXTENSION, lock_len)) - return -1; - - return segment_len; -} - -static bool is_all_caps_and_underscore(const char *name, size_t len) -{ - size_t i; - char c; - - assert(name && len > 0); - - for (i = 0; i < len; i++) - { - c = name[i]; - if ((c < 'A' || c > 'Z') && c != '_') - return false; - } - - if (*name == '_' || name[len - 1] == '_') - return false; - - return true; -} - -/* Inspired from https://github.com/git/git/blob/f06d47e7e0d9db709ee204ed13a8a7486149f494/refs.c#L36-100 */ -int git_reference__normalize_name( - git_buf *buf, - const char *name, - unsigned int flags) -{ - const char *current; - int segment_len, segments_count = 0, error = GIT_EINVALIDSPEC; - unsigned int process_flags; - bool normalize = (buf != NULL); - -#ifdef GIT_USE_ICONV - git_path_iconv_t ic = GIT_PATH_ICONV_INIT; -#endif - - assert(name); - - process_flags = flags; - current = (char *)name; - - if (*current == '/') - goto cleanup; - - if (normalize) - git_buf_clear(buf); - -#ifdef GIT_USE_ICONV - if ((flags & GIT_REF_FORMAT__PRECOMPOSE_UNICODE) != 0) { - size_t namelen = strlen(current); - if ((error = git_path_iconv_init_precompose(&ic)) < 0 || - (error = git_path_iconv(&ic, ¤t, &namelen)) < 0) - goto cleanup; - error = GIT_EINVALIDSPEC; - } -#endif - - while (true) { - segment_len = ensure_segment_validity(current); - if (segment_len < 0) { - if ((process_flags & GIT_REF_FORMAT_REFSPEC_PATTERN) && - current[0] == '*' && - (current[1] == '\0' || current[1] == '/')) { - /* Accept one wildcard as a full refname component. */ - process_flags &= ~GIT_REF_FORMAT_REFSPEC_PATTERN; - segment_len = 1; - } else - goto cleanup; - } - - if (segment_len > 0) { - if (normalize) { - size_t cur_len = git_buf_len(buf); - - git_buf_joinpath(buf, git_buf_cstr(buf), current); - git_buf_truncate(buf, - cur_len + segment_len + (segments_count ? 1 : 0)); - - if (git_buf_oom(buf)) { - error = -1; - goto cleanup; - } - } - - segments_count++; - } - - /* No empty segment is allowed when not normalizing */ - if (segment_len == 0 && !normalize) - goto cleanup; - - if (current[segment_len] == '\0') - break; - - current += segment_len + 1; - } - - /* A refname can not be empty */ - if (segment_len == 0 && segments_count == 0) - goto cleanup; - - /* A refname can not end with "." */ - if (current[segment_len - 1] == '.') - goto cleanup; - - /* A refname can not end with "/" */ - if (current[segment_len - 1] == '/') - goto cleanup; - - if ((segments_count == 1 ) && !(flags & GIT_REF_FORMAT_ALLOW_ONELEVEL)) - goto cleanup; - - if ((segments_count == 1 ) && - !(flags & GIT_REF_FORMAT_REFSPEC_SHORTHAND) && - !(is_all_caps_and_underscore(name, (size_t)segment_len) || - ((flags & GIT_REF_FORMAT_REFSPEC_PATTERN) && !strcmp("*", name)))) - goto cleanup; - - if ((segments_count > 1) - && (is_all_caps_and_underscore(name, strchr(name, '/') - name))) - goto cleanup; - - error = 0; - -cleanup: - if (error == GIT_EINVALIDSPEC) - giterr_set( - GITERR_REFERENCE, - "The given reference name '%s' is not valid", name); - - if (error && normalize) - git_buf_free(buf); - -#ifdef GIT_USE_ICONV - git_path_iconv_clear(&ic); -#endif - - return error; -} - -int git_reference_normalize_name( - char *buffer_out, - size_t buffer_size, - const char *name, - unsigned int flags) -{ - git_buf buf = GIT_BUF_INIT; - int error; - - if ((error = git_reference__normalize_name(&buf, name, flags)) < 0) - goto cleanup; - - if (git_buf_len(&buf) > buffer_size - 1) { - giterr_set( - GITERR_REFERENCE, - "The provided buffer is too short to hold the normalization of '%s'", name); - error = GIT_EBUFS; - goto cleanup; - } - - git_buf_copy_cstr(buffer_out, buffer_size, &buf); - - error = 0; - -cleanup: - git_buf_free(&buf); - return error; -} - -#define GIT_REF_TYPEMASK (GIT_REF_OID | GIT_REF_SYMBOLIC) - -int git_reference_cmp( - const git_reference *ref1, - const git_reference *ref2) -{ - git_ref_t type1, type2; - assert(ref1 && ref2); - - type1 = git_reference_type(ref1); - type2 = git_reference_type(ref2); - - /* let's put symbolic refs before OIDs */ - if (type1 != type2) - return (type1 == GIT_REF_SYMBOLIC) ? -1 : 1; - - if (type1 == GIT_REF_SYMBOLIC) - return strcmp(ref1->target.symbolic, ref2->target.symbolic); - - return git_oid__cmp(&ref1->target.oid, &ref2->target.oid); -} - -/** - * Get the end of a chain of references. If the final one is not - * found, we return the reference just before that. - */ -static int get_terminal(git_reference **out, git_repository *repo, const char *ref_name, int nesting) -{ - git_reference *ref; - int error = 0; - - if (nesting > MAX_NESTING_LEVEL) { - giterr_set(GITERR_REFERENCE, "Reference chain too deep (%d)", nesting); - return GIT_ENOTFOUND; - } - - /* set to NULL to let the caller know that they're at the end of the chain */ - if ((error = git_reference_lookup(&ref, repo, ref_name)) < 0) { - *out = NULL; - return error; - } - - if (git_reference_type(ref) == GIT_REF_OID) { - *out = ref; - error = 0; - } else { - error = get_terminal(out, repo, git_reference_symbolic_target(ref), nesting + 1); - if (error == GIT_ENOTFOUND && !*out) - *out = ref; - else - git_reference_free(ref); - } - - return error; -} - -/* - * Starting with the reference given by `ref_name`, follows symbolic - * references until a direct reference is found and updated the OID - * on that direct reference to `oid`. - */ -int git_reference__update_terminal( - git_repository *repo, - const char *ref_name, - const git_oid *oid, - const git_signature *sig, - const char *log_message) -{ - git_reference *ref = NULL, *ref2 = NULL; - git_signature *who = NULL; - const git_signature *to_use; - int error = 0; - - if (!sig && (error = git_reference__log_signature(&who, repo)) < 0) - return error; - - to_use = sig ? sig : who; - error = get_terminal(&ref, repo, ref_name, 0); - - /* found a dangling symref */ - if (error == GIT_ENOTFOUND && ref) { - assert(git_reference_type(ref) == GIT_REF_SYMBOLIC); - giterr_clear(); - error = reference__create(&ref2, repo, ref->target.symbolic, oid, NULL, 0, to_use, - log_message, NULL, NULL); - } else if (error == GIT_ENOTFOUND) { - giterr_clear(); - error = reference__create(&ref2, repo, ref_name, oid, NULL, 0, to_use, - log_message, NULL, NULL); - } else if (error == 0) { - assert(git_reference_type(ref) == GIT_REF_OID); - error = reference__create(&ref2, repo, ref->name, oid, NULL, 1, to_use, - log_message, &ref->target.oid, NULL); - } - - git_reference_free(ref2); - git_reference_free(ref); - git_signature_free(who); - return error; -} - -int git_reference__update_for_commit( - git_repository *repo, - git_reference *ref, - const char *ref_name, - const git_oid *id, - const char *operation) -{ - git_reference *ref_new = NULL; - git_commit *commit = NULL; - git_buf reflog_msg = GIT_BUF_INIT; - const git_signature *who; - int error; - - if ((error = git_commit_lookup(&commit, repo, id)) < 0 || - (error = git_buf_printf(&reflog_msg, "%s%s: %s", - operation ? operation : "commit", - git_commit_parentcount(commit) == 0 ? " (initial)" : "", - git_commit_summary(commit))) < 0) - goto done; - - who = git_commit_committer(commit); - - if (ref) { - if ((error = ensure_is_an_updatable_direct_reference(ref)) < 0) - return error; - - error = reference__create(&ref_new, repo, ref->name, id, NULL, 1, who, - git_buf_cstr(&reflog_msg), &ref->target.oid, NULL); - } - else - error = git_reference__update_terminal( - repo, ref_name, id, who, git_buf_cstr(&reflog_msg)); - -done: - git_reference_free(ref_new); - git_buf_free(&reflog_msg); - git_commit_free(commit); - return error; -} - -int git_reference_has_log(git_repository *repo, const char *refname) -{ - int error; - git_refdb *refdb; - - assert(repo && refname); - - if ((error = git_repository_refdb__weakptr(&refdb, repo)) < 0) - return error; - - return git_refdb_has_log(refdb, refname); -} - -int git_reference_ensure_log(git_repository *repo, const char *refname) -{ - int error; - git_refdb *refdb; - - assert(repo && refname); - - if ((error = git_repository_refdb__weakptr(&refdb, repo)) < 0) - return error; - - return git_refdb_ensure_log(refdb, refname); -} - -int git_reference__is_branch(const char *ref_name) -{ - return git__prefixcmp(ref_name, GIT_REFS_HEADS_DIR) == 0; -} - -int git_reference_is_branch(const git_reference *ref) -{ - assert(ref); - return git_reference__is_branch(ref->name); -} - -int git_reference__is_remote(const char *ref_name) -{ - return git__prefixcmp(ref_name, GIT_REFS_REMOTES_DIR) == 0; -} - -int git_reference_is_remote(const git_reference *ref) -{ - assert(ref); - return git_reference__is_remote(ref->name); -} - -int git_reference__is_tag(const char *ref_name) -{ - return git__prefixcmp(ref_name, GIT_REFS_TAGS_DIR) == 0; -} - -int git_reference_is_tag(const git_reference *ref) -{ - assert(ref); - return git_reference__is_tag(ref->name); -} - -int git_reference__is_note(const char *ref_name) -{ - return git__prefixcmp(ref_name, GIT_REFS_NOTES_DIR) == 0; -} - -int git_reference_is_note(const git_reference *ref) -{ - assert(ref); - return git_reference__is_note(ref->name); -} - -static int peel_error(int error, git_reference *ref, const char* msg) -{ - giterr_set( - GITERR_INVALID, - "The reference '%s' cannot be peeled - %s", git_reference_name(ref), msg); - return error; -} - -int git_reference_peel( - git_object **peeled, - git_reference *ref, - git_otype target_type) -{ - git_reference *resolved = NULL; - git_object *target = NULL; - int error; - - assert(ref); - - if (ref->type == GIT_REF_OID) { - resolved = ref; - } else { - if ((error = git_reference_resolve(&resolved, ref)) < 0) - return peel_error(error, ref, "Cannot resolve reference"); - } - - if (!git_oid_iszero(&resolved->peel)) { - error = git_object_lookup(&target, - git_reference_owner(ref), &resolved->peel, GIT_OBJ_ANY); - } else { - error = git_object_lookup(&target, - git_reference_owner(ref), &resolved->target.oid, GIT_OBJ_ANY); - } - - if (error < 0) { - peel_error(error, ref, "Cannot retrieve reference target"); - goto cleanup; - } - - if (target_type == GIT_OBJ_ANY && git_object_type(target) != GIT_OBJ_TAG) - error = git_object_dup(peeled, target); - else - error = git_object_peel(peeled, target, target_type); - -cleanup: - git_object_free(target); - - if (resolved != ref) - git_reference_free(resolved); - - return error; -} - -int git_reference__is_valid_name(const char *refname, unsigned int flags) -{ - if (git_reference__normalize_name(NULL, refname, flags) < 0) { - giterr_clear(); - return false; - } - - return true; -} - -int git_reference_is_valid_name(const char *refname) -{ - return git_reference__is_valid_name(refname, GIT_REF_FORMAT_ALLOW_ONELEVEL); -} - -const char *git_reference__shorthand(const char *name) -{ - if (!git__prefixcmp(name, GIT_REFS_HEADS_DIR)) - return name + strlen(GIT_REFS_HEADS_DIR); - else if (!git__prefixcmp(name, GIT_REFS_TAGS_DIR)) - return name + strlen(GIT_REFS_TAGS_DIR); - else if (!git__prefixcmp(name, GIT_REFS_REMOTES_DIR)) - return name + strlen(GIT_REFS_REMOTES_DIR); - else if (!git__prefixcmp(name, GIT_REFS_DIR)) - return name + strlen(GIT_REFS_DIR); - - /* No shorthands are avaiable, so just return the name */ - return name; -} - -const char *git_reference_shorthand(const git_reference *ref) -{ - return git_reference__shorthand(ref->name); -} diff --git a/vendor/libgit2/src/refs.h b/vendor/libgit2/src/refs.h deleted file mode 100644 index f78ea06b07..0000000000 --- a/vendor/libgit2/src/refs.h +++ /dev/null @@ -1,112 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_refs_h__ -#define INCLUDE_refs_h__ - -#include "common.h" -#include "git2/oid.h" -#include "git2/refs.h" -#include "git2/refdb.h" -#include "strmap.h" -#include "buffer.h" -#include "oid.h" - -#define GIT_REFS_DIR "refs/" -#define GIT_REFS_HEADS_DIR GIT_REFS_DIR "heads/" -#define GIT_REFS_TAGS_DIR GIT_REFS_DIR "tags/" -#define GIT_REFS_REMOTES_DIR GIT_REFS_DIR "remotes/" -#define GIT_REFS_NOTES_DIR GIT_REFS_DIR "notes/" -#define GIT_REFS_DIR_MODE 0777 -#define GIT_REFS_FILE_MODE 0666 - -#define GIT_RENAMED_REF_FILE GIT_REFS_DIR "RENAMED-REF" - -#define GIT_SYMREF "ref: " -#define GIT_PACKEDREFS_FILE "packed-refs" -#define GIT_PACKEDREFS_HEADER "# pack-refs with: peeled fully-peeled " -#define GIT_PACKEDREFS_FILE_MODE 0666 - -#define GIT_HEAD_FILE "HEAD" -#define GIT_ORIG_HEAD_FILE "ORIG_HEAD" -#define GIT_FETCH_HEAD_FILE "FETCH_HEAD" -#define GIT_MERGE_HEAD_FILE "MERGE_HEAD" -#define GIT_REVERT_HEAD_FILE "REVERT_HEAD" -#define GIT_CHERRYPICK_HEAD_FILE "CHERRY_PICK_HEAD" -#define GIT_BISECT_LOG_FILE "BISECT_LOG" -#define GIT_REBASE_MERGE_DIR "rebase-merge/" -#define GIT_REBASE_MERGE_INTERACTIVE_FILE GIT_REBASE_MERGE_DIR "interactive" -#define GIT_REBASE_APPLY_DIR "rebase-apply/" -#define GIT_REBASE_APPLY_REBASING_FILE GIT_REBASE_APPLY_DIR "rebasing" -#define GIT_REBASE_APPLY_APPLYING_FILE GIT_REBASE_APPLY_DIR "applying" -#define GIT_REFS_HEADS_MASTER_FILE GIT_REFS_HEADS_DIR "master" - -#define GIT_STASH_FILE "stash" -#define GIT_REFS_STASH_FILE GIT_REFS_DIR GIT_STASH_FILE - -#define GIT_REF_FORMAT__PRECOMPOSE_UNICODE (1u << 16) - -#define GIT_REFNAME_MAX 1024 - -typedef char git_refname_t[GIT_REFNAME_MAX]; - -struct git_reference { - git_refdb *db; - git_ref_t type; - - union { - git_oid oid; - char *symbolic; - } target; - - git_oid peel; - char name[GIT_FLEX_ARRAY]; -}; - -git_reference *git_reference__set_name(git_reference *ref, const char *name); - -int git_reference__normalize_name(git_buf *buf, const char *name, unsigned int flags); -int git_reference__update_terminal(git_repository *repo, const char *ref_name, const git_oid *oid, const git_signature *sig, const char *log_message); -int git_reference__is_valid_name(const char *refname, unsigned int flags); -int git_reference__is_branch(const char *ref_name); -int git_reference__is_remote(const char *ref_name); -int git_reference__is_tag(const char *ref_name); -const char *git_reference__shorthand(const char *name); - -/** - * Lookup a reference by name and try to resolve to an OID. - * - * You can control how many dereferences this will attempt to resolve the - * reference with the `max_deref` parameter, or pass -1 to use a sane - * default. If you pass 0 for `max_deref`, this will not attempt to resolve - * the reference. For any value of `max_deref` other than 0, not - * successfully resolving the reference will be reported as an error. - - * The generated reference must be freed by the user. - * - * @param reference_out Pointer to the looked-up reference - * @param repo The repository to look up the reference - * @param name The long name for the reference (e.g. HEAD, ref/heads/master, refs/tags/v0.1.0, ...) - * @param max_deref Maximum number of dereferences to make of symbolic refs, 0 means simple lookup, < 0 means use default reasonable value - * @return 0 on success or < 0 on error; not being able to resolve the reference is an error unless 0 was passed for max_deref - */ -int git_reference_lookup_resolved( - git_reference **reference_out, - git_repository *repo, - const char *name, - int max_deref); - -int git_reference__log_signature(git_signature **out, git_repository *repo); - -/** Update a reference after a commit. */ -int git_reference__update_for_commit( - git_repository *repo, - git_reference *ref, - const char *ref_name, - const git_oid *id, - const char *operation); - -#endif diff --git a/vendor/libgit2/src/refspec.c b/vendor/libgit2/src/refspec.c deleted file mode 100644 index f92a6d2b61..0000000000 --- a/vendor/libgit2/src/refspec.c +++ /dev/null @@ -1,365 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#include "git2/errors.h" - -#include "common.h" -#include "refspec.h" -#include "util.h" -#include "posix.h" -#include "refs.h" -#include "vector.h" - -int git_refspec__parse(git_refspec *refspec, const char *input, bool is_fetch) -{ - // Ported from https://github.com/git/git/blob/f06d47e7e0d9db709ee204ed13a8a7486149f494/remote.c#L518-636 - - size_t llen; - int is_glob = 0; - const char *lhs, *rhs; - int flags; - - assert(refspec && input); - - memset(refspec, 0x0, sizeof(git_refspec)); - refspec->push = !is_fetch; - - lhs = input; - if (*lhs == '+') { - refspec->force = 1; - lhs++; - } - - rhs = strrchr(lhs, ':'); - - /* - * Before going on, special case ":" (or "+:") as a refspec - * for matching refs. - */ - if (!is_fetch && rhs == lhs && rhs[1] == '\0') { - refspec->matching = 1; - refspec->string = git__strdup(input); - GITERR_CHECK_ALLOC(refspec->string); - refspec->src = git__strdup(""); - GITERR_CHECK_ALLOC(refspec->src); - refspec->dst = git__strdup(""); - GITERR_CHECK_ALLOC(refspec->dst); - return 0; - } - - if (rhs) { - size_t rlen = strlen(++rhs); - is_glob = (1 <= rlen && strchr(rhs, '*')); - refspec->dst = git__strndup(rhs, rlen); - } - - llen = (rhs ? (size_t)(rhs - lhs - 1) : strlen(lhs)); - if (1 <= llen && memchr(lhs, '*', llen)) { - if ((rhs && !is_glob) || (!rhs && is_fetch)) - goto invalid; - is_glob = 1; - } else if (rhs && is_glob) - goto invalid; - - refspec->pattern = is_glob; - refspec->src = git__strndup(lhs, llen); - flags = GIT_REF_FORMAT_ALLOW_ONELEVEL | GIT_REF_FORMAT_REFSPEC_SHORTHAND - | (is_glob ? GIT_REF_FORMAT_REFSPEC_PATTERN : 0); - - if (is_fetch) { - /* - * LHS - * - empty is allowed; it means HEAD. - * - otherwise it must be a valid looking ref. - */ - if (!*refspec->src) - ; /* empty is ok */ - else if (!git_reference__is_valid_name(refspec->src, flags)) - goto invalid; - /* - * RHS - * - missing is ok, and is same as empty. - * - empty is ok; it means not to store. - * - otherwise it must be a valid looking ref. - */ - if (!refspec->dst) - ; /* ok */ - else if (!*refspec->dst) - ; /* ok */ - else if (!git_reference__is_valid_name(refspec->dst, flags)) - goto invalid; - } else { - /* - * LHS - * - empty is allowed; it means delete. - * - when wildcarded, it must be a valid looking ref. - * - otherwise, it must be an extended SHA-1, but - * there is no existing way to validate this. - */ - if (!*refspec->src) - ; /* empty is ok */ - else if (is_glob) { - if (!git_reference__is_valid_name(refspec->src, flags)) - goto invalid; - } - else { - ; /* anything goes, for now */ - } - /* - * RHS - * - missing is allowed, but LHS then must be a - * valid looking ref. - * - empty is not allowed. - * - otherwise it must be a valid looking ref. - */ - if (!refspec->dst) { - if (!git_reference__is_valid_name(refspec->src, flags)) - goto invalid; - } else if (!*refspec->dst) { - goto invalid; - } else { - if (!git_reference__is_valid_name(refspec->dst, flags)) - goto invalid; - } - - /* if the RHS is empty, then it's a copy of the LHS */ - if (!refspec->dst) { - refspec->dst = git__strdup(refspec->src); - GITERR_CHECK_ALLOC(refspec->dst); - } - } - - refspec->string = git__strdup(input); - GITERR_CHECK_ALLOC(refspec->string); - - return 0; - - invalid: - giterr_set( - GITERR_INVALID, - "'%s' is not a valid refspec.", input); - git_refspec__free(refspec); - return -1; -} - -void git_refspec__free(git_refspec *refspec) -{ - if (refspec == NULL) - return; - - git__free(refspec->src); - git__free(refspec->dst); - git__free(refspec->string); - - memset(refspec, 0x0, sizeof(git_refspec)); -} - -const char *git_refspec_src(const git_refspec *refspec) -{ - return refspec == NULL ? NULL : refspec->src; -} - -const char *git_refspec_dst(const git_refspec *refspec) -{ - return refspec == NULL ? NULL : refspec->dst; -} - -const char *git_refspec_string(const git_refspec *refspec) -{ - return refspec == NULL ? NULL : refspec->string; -} - -int git_refspec_force(const git_refspec *refspec) -{ - assert(refspec); - - return refspec->force; -} - -int git_refspec_src_matches(const git_refspec *refspec, const char *refname) -{ - if (refspec == NULL || refspec->src == NULL) - return false; - - return (p_fnmatch(refspec->src, refname, 0) == 0); -} - -int git_refspec_dst_matches(const git_refspec *refspec, const char *refname) -{ - if (refspec == NULL || refspec->dst == NULL) - return false; - - return (p_fnmatch(refspec->dst, refname, 0) == 0); -} - -static int refspec_transform( - git_buf *out, const char *from, const char *to, const char *name) -{ - const char *from_star, *to_star; - const char *name_slash, *from_slash; - size_t replacement_len, star_offset; - - git_buf_sanitize(out); - git_buf_clear(out); - - /* - * There are two parts to each side of a refspec, the bit - * before the star and the bit after it. The star can be in - * the middle of the pattern, so we need to look at each bit - * individually. - */ - from_star = strchr(from, '*'); - to_star = strchr(to, '*'); - - assert(from_star && to_star); - - /* star offset, both in 'from' and in 'name' */ - star_offset = from_star - from; - - /* the first half is copied over */ - git_buf_put(out, to, to_star - to); - - /* then we copy over the replacement, from the star's offset to the next slash in 'name' */ - name_slash = strchr(name + star_offset, '/'); - if (!name_slash) - name_slash = strrchr(name, '\0'); - - /* if there is no slash after the star in 'from', we want to copy everything over */ - from_slash = strchr(from + star_offset, '/'); - if (!from_slash) - name_slash = strrchr(name, '\0'); - - replacement_len = (name_slash - name) - star_offset; - git_buf_put(out, name + star_offset, replacement_len); - - return git_buf_puts(out, to_star + 1); -} - -int git_refspec_transform(git_buf *out, const git_refspec *spec, const char *name) -{ - assert(out && spec && name); - git_buf_sanitize(out); - - if (!git_refspec_src_matches(spec, name)) { - giterr_set(GITERR_INVALID, "ref '%s' doesn't match the source", name); - return -1; - } - - if (!spec->pattern) - return git_buf_puts(out, spec->dst); - - return refspec_transform(out, spec->src, spec->dst, name); -} - -int git_refspec_rtransform(git_buf *out, const git_refspec *spec, const char *name) -{ - assert(out && spec && name); - git_buf_sanitize(out); - - if (!git_refspec_dst_matches(spec, name)) { - giterr_set(GITERR_INVALID, "ref '%s' doesn't match the destination", name); - return -1; - } - - if (!spec->pattern) - return git_buf_puts(out, spec->src); - - return refspec_transform(out, spec->dst, spec->src, name); -} - -int git_refspec__serialize(git_buf *out, const git_refspec *refspec) -{ - if (refspec->force) - git_buf_putc(out, '+'); - - git_buf_printf(out, "%s:%s", - refspec->src != NULL ? refspec->src : "", - refspec->dst != NULL ? refspec->dst : ""); - - return git_buf_oom(out) == false; -} - -int git_refspec_is_wildcard(const git_refspec *spec) -{ - assert(spec && spec->src); - - return (spec->src[strlen(spec->src) - 1] == '*'); -} - -git_direction git_refspec_direction(const git_refspec *spec) -{ - assert(spec); - - return spec->push; -} - -int git_refspec__dwim_one(git_vector *out, git_refspec *spec, git_vector *refs) -{ - git_buf buf = GIT_BUF_INIT; - size_t j, pos; - git_remote_head key; - - const char* formatters[] = { - GIT_REFS_DIR "%s", - GIT_REFS_TAGS_DIR "%s", - GIT_REFS_HEADS_DIR "%s", - NULL - }; - - git_refspec *cur = git__calloc(1, sizeof(git_refspec)); - GITERR_CHECK_ALLOC(cur); - - cur->force = spec->force; - cur->push = spec->push; - cur->pattern = spec->pattern; - cur->matching = spec->matching; - cur->string = git__strdup(spec->string); - - /* shorthand on the lhs */ - if (git__prefixcmp(spec->src, GIT_REFS_DIR)) { - for (j = 0; formatters[j]; j++) { - git_buf_clear(&buf); - if (git_buf_printf(&buf, formatters[j], spec->src) < 0) - return -1; - - key.name = (char *) git_buf_cstr(&buf); - if (!git_vector_search(&pos, refs, &key)) { - /* we found something to match the shorthand, set src to that */ - cur->src = git_buf_detach(&buf); - } - } - } - - /* No shorthands found, copy over the name */ - if (cur->src == NULL && spec->src != NULL) { - cur->src = git__strdup(spec->src); - GITERR_CHECK_ALLOC(cur->src); - } - - if (spec->dst && git__prefixcmp(spec->dst, GIT_REFS_DIR)) { - /* if it starts with "remotes" then we just prepend "refs/" */ - if (!git__prefixcmp(spec->dst, "remotes/")) { - git_buf_puts(&buf, GIT_REFS_DIR); - } else { - git_buf_puts(&buf, GIT_REFS_HEADS_DIR); - } - - if (git_buf_puts(&buf, spec->dst) < 0) - return -1; - - cur->dst = git_buf_detach(&buf); - } - - git_buf_free(&buf); - - if (cur->dst == NULL && spec->dst != NULL) { - cur->dst = git__strdup(spec->dst); - GITERR_CHECK_ALLOC(cur->dst); - } - - return git_vector_insert(out, cur); -} diff --git a/vendor/libgit2/src/refspec.h b/vendor/libgit2/src/refspec.h deleted file mode 100644 index 9a87c97a53..0000000000 --- a/vendor/libgit2/src/refspec.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_refspec_h__ -#define INCLUDE_refspec_h__ - -#include "git2/refspec.h" -#include "buffer.h" -#include "vector.h" - -struct git_refspec { - char *string; - char *src; - char *dst; - unsigned int force :1, - push : 1, - pattern :1, - matching :1; -}; - -#define GIT_REFSPEC_TAGS "refs/tags/*:refs/tags/*" - -int git_refspec__parse( - struct git_refspec *refspec, - const char *str, - bool is_fetch); - -void git_refspec__free(git_refspec *refspec); - -int git_refspec__serialize(git_buf *out, const git_refspec *refspec); - -/** - * Determines if a refspec is a wildcard refspec. - * - * @param spec the refspec - * @return 1 if the refspec is a wildcard, 0 otherwise - */ -int git_refspec_is_wildcard(const git_refspec *spec); - -/** - * DWIM `spec` with `refs` existing on the remote, append the dwim'ed - * result in `out`. - */ -int git_refspec__dwim_one(git_vector *out, git_refspec *spec, git_vector *refs); - -#endif diff --git a/vendor/libgit2/src/remote.c b/vendor/libgit2/src/remote.c deleted file mode 100644 index f31fc150a7..0000000000 --- a/vendor/libgit2/src/remote.c +++ /dev/null @@ -1,2504 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#include "git2/config.h" -#include "git2/types.h" -#include "git2/oid.h" -#include "git2/net.h" - -#include "common.h" -#include "config.h" -#include "repository.h" -#include "remote.h" -#include "fetch.h" -#include "refs.h" -#include "refspec.h" -#include "fetchhead.h" -#include "push.h" - -#define CONFIG_URL_FMT "remote.%s.url" -#define CONFIG_PUSHURL_FMT "remote.%s.pushurl" -#define CONFIG_FETCH_FMT "remote.%s.fetch" -#define CONFIG_PUSH_FMT "remote.%s.push" -#define CONFIG_TAGOPT_FMT "remote.%s.tagopt" - -static int dwim_refspecs(git_vector *out, git_vector *refspecs, git_vector *refs); -static int lookup_remote_prune_config(git_remote *remote, git_config *config, const char *name); -char *apply_insteadof(git_config *config, const char *url, int direction); - -static int add_refspec_to(git_vector *vector, const char *string, bool is_fetch) -{ - git_refspec *spec; - - spec = git__calloc(1, sizeof(git_refspec)); - GITERR_CHECK_ALLOC(spec); - - if (git_refspec__parse(spec, string, is_fetch) < 0) { - git__free(spec); - return -1; - } - - spec->push = !is_fetch; - if (git_vector_insert(vector, spec) < 0) { - git_refspec__free(spec); - git__free(spec); - return -1; - } - - return 0; -} - -static int add_refspec(git_remote *remote, const char *string, bool is_fetch) -{ - return add_refspec_to(&remote->refspecs, string, is_fetch); -} - -static int download_tags_value(git_remote *remote, git_config *cfg) -{ - git_config_entry *ce; - git_buf buf = GIT_BUF_INIT; - int error; - - if (git_buf_printf(&buf, "remote.%s.tagopt", remote->name) < 0) - return -1; - - error = git_config__lookup_entry(&ce, cfg, git_buf_cstr(&buf), false); - git_buf_free(&buf); - - if (!error && ce && ce->value) { - if (!strcmp(ce->value, "--no-tags")) - remote->download_tags = GIT_REMOTE_DOWNLOAD_TAGS_NONE; - else if (!strcmp(ce->value, "--tags")) - remote->download_tags = GIT_REMOTE_DOWNLOAD_TAGS_ALL; - } - - git_config_entry_free(ce); - return error; -} - -static int ensure_remote_name_is_valid(const char *name) -{ - int error = 0; - - if (!git_remote_is_valid_name(name)) { - giterr_set( - GITERR_CONFIG, - "'%s' is not a valid remote name.", name ? name : "(null)"); - error = GIT_EINVALIDSPEC; - } - - return error; -} - -static int write_add_refspec(git_repository *repo, const char *name, const char *refspec, bool fetch) -{ - git_config *cfg; - git_buf var = GIT_BUF_INIT; - git_refspec spec; - const char *fmt; - int error; - - if ((error = git_repository_config__weakptr(&cfg, repo)) < 0) - return error; - - fmt = fetch ? CONFIG_FETCH_FMT : CONFIG_PUSH_FMT; - - if ((error = ensure_remote_name_is_valid(name)) < 0) - return error; - - if ((error = git_refspec__parse(&spec, refspec, fetch)) < 0) { - if (giterr_last()->klass != GITERR_NOMEMORY) - error = GIT_EINVALIDSPEC; - - return error; - } - - git_refspec__free(&spec); - - if ((error = git_buf_printf(&var, fmt, name)) < 0) - return error; - - /* - * "$^" is a unmatcheable regexp: it will not match anything at all, so - * all values will be considered new and we will not replace any - * present value. - */ - if ((error = git_config_set_multivar(cfg, var.ptr, "$^", refspec)) < 0) { - goto cleanup; - } - -cleanup: - git_buf_free(&var); - return 0; -} - -#if 0 -/* We could export this as a helper */ -static int get_check_cert(int *out, git_repository *repo) -{ - git_config *cfg; - const char *val; - int error = 0; - - assert(out && repo); - - /* By default, we *DO* want to verify the certificate. */ - *out = 1; - - /* Go through the possible sources for SSL verification settings, from - * most specific to least specific. */ - - /* GIT_SSL_NO_VERIFY environment variable */ - if ((val = getenv("GIT_SSL_NO_VERIFY")) != NULL) - return git_config_parse_bool(out, val); - - /* http.sslVerify config setting */ - if ((error = git_repository_config__weakptr(&cfg, repo)) < 0) - return error; - - *out = git_config__get_bool_force(cfg, "http.sslverify", 1); - return 0; -} -#endif - -static int canonicalize_url(git_buf *out, const char *in) -{ - if (in == NULL || strlen(in) == 0) { - giterr_set(GITERR_INVALID, "cannot set empty URL"); - return GIT_EINVALIDSPEC; - } - -#ifdef GIT_WIN32 - /* Given a UNC path like \\server\path, we need to convert this - * to //server/path for compatibility with core git. - */ - if (in[0] == '\\' && in[1] == '\\' && - (git__isalpha(in[2]) || git__isdigit(in[2]))) { - const char *c; - for (c = in; *c; c++) - git_buf_putc(out, *c == '\\' ? '/' : *c); - - return git_buf_oom(out) ? -1 : 0; - } -#endif - - return git_buf_puts(out, in); -} - -static int create_internal(git_remote **out, git_repository *repo, const char *name, const char *url, const char *fetch) -{ - git_remote *remote; - git_config *config = NULL; - git_buf canonical_url = GIT_BUF_INIT; - git_buf var = GIT_BUF_INIT; - int error = -1; - - /* name is optional */ - assert(out && repo && url); - - if ((error = git_repository_config__weakptr(&config, repo)) < 0) - return error; - - remote = git__calloc(1, sizeof(git_remote)); - GITERR_CHECK_ALLOC(remote); - - remote->repo = repo; - - if (git_vector_init(&remote->refs, 32, NULL) < 0 || - canonicalize_url(&canonical_url, url) < 0) - goto on_error; - - remote->url = apply_insteadof(repo->_config, canonical_url.ptr, GIT_DIRECTION_FETCH); - - if (name != NULL) { - remote->name = git__strdup(name); - GITERR_CHECK_ALLOC(remote->name); - - if ((error = git_buf_printf(&var, CONFIG_URL_FMT, name)) < 0) - goto on_error; - - if ((error = git_config_set_string(config, var.ptr, canonical_url.ptr)) < 0) - goto on_error; - } - - if (fetch != NULL) { - if ((error = add_refspec(remote, fetch, true)) < 0) - goto on_error; - - /* only write for non-anonymous remotes */ - if (name && (error = write_add_refspec(repo, name, fetch, true)) < 0) - goto on_error; - - if ((error = git_repository_config_snapshot(&config, repo)) < 0) - goto on_error; - - if ((error = lookup_remote_prune_config(remote, config, name)) < 0) - goto on_error; - - /* Move the data over to where the matching functions can find them */ - if ((error = dwim_refspecs(&remote->active_refspecs, &remote->refspecs, &remote->refs)) < 0) - goto on_error; - } - - /* A remote without a name doesn't download tags */ - if (!name) - remote->download_tags = GIT_REMOTE_DOWNLOAD_TAGS_NONE; - else - remote->download_tags = GIT_REMOTE_DOWNLOAD_TAGS_AUTO; - - - git_buf_free(&var); - - *out = remote; - error = 0; - -on_error: - if (error) - git_remote_free(remote); - - git_config_free(config); - git_buf_free(&canonical_url); - git_buf_free(&var); - return error; -} - -static int ensure_remote_doesnot_exist(git_repository *repo, const char *name) -{ - int error; - git_remote *remote; - - error = git_remote_lookup(&remote, repo, name); - - if (error == GIT_ENOTFOUND) - return 0; - - if (error < 0) - return error; - - git_remote_free(remote); - - giterr_set( - GITERR_CONFIG, - "Remote '%s' already exists.", name); - - return GIT_EEXISTS; -} - - -int git_remote_create(git_remote **out, git_repository *repo, const char *name, const char *url) -{ - git_buf buf = GIT_BUF_INIT; - int error; - - if (git_buf_printf(&buf, "+refs/heads/*:refs/remotes/%s/*", name) < 0) - return -1; - - error = git_remote_create_with_fetchspec(out, repo, name, url, git_buf_cstr(&buf)); - git_buf_free(&buf); - - return error; -} - -int git_remote_create_with_fetchspec(git_remote **out, git_repository *repo, const char *name, const char *url, const char *fetch) -{ - git_remote *remote = NULL; - int error; - - if ((error = ensure_remote_name_is_valid(name)) < 0) - return error; - - if ((error = ensure_remote_doesnot_exist(repo, name)) < 0) - return error; - - if (create_internal(&remote, repo, name, url, fetch) < 0) - goto on_error; - - *out = remote; - - return 0; - -on_error: - git_remote_free(remote); - return -1; -} - -int git_remote_create_anonymous(git_remote **out, git_repository *repo, const char *url) -{ - return create_internal(out, repo, NULL, url, NULL); -} - -int git_remote_dup(git_remote **dest, git_remote *source) -{ - size_t i; - int error = 0; - git_refspec *spec; - git_remote *remote = git__calloc(1, sizeof(git_remote)); - GITERR_CHECK_ALLOC(remote); - - if (source->name != NULL) { - remote->name = git__strdup(source->name); - GITERR_CHECK_ALLOC(remote->name); - } - - if (source->url != NULL) { - remote->url = git__strdup(source->url); - GITERR_CHECK_ALLOC(remote->url); - } - - if (source->pushurl != NULL) { - remote->pushurl = git__strdup(source->pushurl); - GITERR_CHECK_ALLOC(remote->pushurl); - } - - remote->repo = source->repo; - remote->download_tags = source->download_tags; - remote->prune_refs = source->prune_refs; - - if (git_vector_init(&remote->refs, 32, NULL) < 0 || - git_vector_init(&remote->refspecs, 2, NULL) < 0 || - git_vector_init(&remote->active_refspecs, 2, NULL) < 0) { - error = -1; - goto cleanup; - } - - git_vector_foreach(&source->refspecs, i, spec) { - if ((error = add_refspec(remote, spec->string, !spec->push)) < 0) - goto cleanup; - } - - *dest = remote; - -cleanup: - - if (error < 0) - git__free(remote); - - return error; -} - -struct refspec_cb_data { - git_remote *remote; - int fetch; -}; - -static int refspec_cb(const git_config_entry *entry, void *payload) -{ - struct refspec_cb_data *data = (struct refspec_cb_data *)payload; - return add_refspec(data->remote, entry->value, data->fetch); -} - -static int get_optional_config( - bool *found, git_config *config, git_buf *buf, - git_config_foreach_cb cb, void *payload) -{ - int error = 0; - const char *key = git_buf_cstr(buf); - - if (git_buf_oom(buf)) - return -1; - - if (cb != NULL) - error = git_config_get_multivar_foreach(config, key, NULL, cb, payload); - else - error = git_config_get_string(payload, config, key); - - if (found) - *found = !error; - - if (error == GIT_ENOTFOUND) { - giterr_clear(); - error = 0; - } - - return error; -} - -int git_remote_lookup(git_remote **out, git_repository *repo, const char *name) -{ - git_remote *remote; - git_buf buf = GIT_BUF_INIT; - const char *val; - int error = 0; - git_config *config; - struct refspec_cb_data data = { NULL }; - bool optional_setting_found = false, found; - - assert(out && repo && name); - - if ((error = ensure_remote_name_is_valid(name)) < 0) - return error; - - if ((error = git_repository_config_snapshot(&config, repo)) < 0) - return error; - - remote = git__calloc(1, sizeof(git_remote)); - GITERR_CHECK_ALLOC(remote); - - remote->name = git__strdup(name); - GITERR_CHECK_ALLOC(remote->name); - - if (git_vector_init(&remote->refs, 32, NULL) < 0 || - git_vector_init(&remote->refspecs, 2, NULL) < 0 || - git_vector_init(&remote->passive_refspecs, 2, NULL) < 0 || - git_vector_init(&remote->active_refspecs, 2, NULL) < 0) { - error = -1; - goto cleanup; - } - - if ((error = git_buf_printf(&buf, "remote.%s.url", name)) < 0) - goto cleanup; - - if ((error = get_optional_config(&found, config, &buf, NULL, (void *)&val)) < 0) - goto cleanup; - - optional_setting_found |= found; - - remote->repo = repo; - remote->download_tags = GIT_REMOTE_DOWNLOAD_TAGS_AUTO; - - if (found && strlen(val) > 0) { - remote->url = apply_insteadof(config, val, GIT_DIRECTION_FETCH); - GITERR_CHECK_ALLOC(remote->url); - } - - val = NULL; - git_buf_clear(&buf); - git_buf_printf(&buf, "remote.%s.pushurl", name); - - if ((error = get_optional_config(&found, config, &buf, NULL, (void *)&val)) < 0) - goto cleanup; - - optional_setting_found |= found; - - if (!optional_setting_found) { - error = GIT_ENOTFOUND; - giterr_set(GITERR_CONFIG, "Remote '%s' does not exist.", name); - goto cleanup; - } - - if (found && strlen(val) > 0) { - remote->pushurl = apply_insteadof(config, val, GIT_DIRECTION_PUSH); - GITERR_CHECK_ALLOC(remote->pushurl); - } - - data.remote = remote; - data.fetch = true; - - git_buf_clear(&buf); - git_buf_printf(&buf, "remote.%s.fetch", name); - - if ((error = get_optional_config(NULL, config, &buf, refspec_cb, &data)) < 0) - goto cleanup; - - data.fetch = false; - git_buf_clear(&buf); - git_buf_printf(&buf, "remote.%s.push", name); - - if ((error = get_optional_config(NULL, config, &buf, refspec_cb, &data)) < 0) - goto cleanup; - - if (download_tags_value(remote, config) < 0) - goto cleanup; - - if ((error = lookup_remote_prune_config(remote, config, name)) < 0) - goto cleanup; - - /* Move the data over to where the matching functions can find them */ - if ((error = dwim_refspecs(&remote->active_refspecs, &remote->refspecs, &remote->refs)) < 0) - goto cleanup; - - *out = remote; - -cleanup: - git_config_free(config); - git_buf_free(&buf); - - if (error < 0) - git_remote_free(remote); - - return error; -} - -static int lookup_remote_prune_config(git_remote *remote, git_config *config, const char *name) -{ - git_buf buf = GIT_BUF_INIT; - int error = 0; - - git_buf_printf(&buf, "remote.%s.prune", name); - - if ((error = git_config_get_bool(&remote->prune_refs, config, git_buf_cstr(&buf))) < 0) { - if (error == GIT_ENOTFOUND) { - giterr_clear(); - - if ((error = git_config_get_bool(&remote->prune_refs, config, "fetch.prune")) < 0) { - if (error == GIT_ENOTFOUND) { - giterr_clear(); - error = 0; - } - } - } - } - - git_buf_free(&buf); - return error; -} - -static int update_config_refspec(const git_remote *remote, git_config *config, int direction) -{ - git_buf name = GIT_BUF_INIT; - unsigned int push; - const char *dir; - size_t i; - int error = 0; - const char *cname; - - push = direction == GIT_DIRECTION_PUSH; - dir = push ? "push" : "fetch"; - - if (git_buf_printf(&name, "remote.%s.%s", remote->name, dir) < 0) - return -1; - cname = git_buf_cstr(&name); - - /* Clear out the existing config */ - while (!error) - error = git_config_delete_multivar(config, cname, ".*"); - - if (error != GIT_ENOTFOUND) - return error; - - for (i = 0; i < remote->refspecs.length; i++) { - git_refspec *spec = git_vector_get(&remote->refspecs, i); - - if (spec->push != push) - continue; - - // "$^" is a unmatcheable regexp: it will not match anything at all, so - // all values will be considered new and we will not replace any - // present value. - if ((error = git_config_set_multivar( - config, cname, "$^", spec->string)) < 0) { - goto cleanup; - } - } - - giterr_clear(); - error = 0; - -cleanup: - git_buf_free(&name); - - return error; -} - -const char *git_remote_name(const git_remote *remote) -{ - assert(remote); - return remote->name; -} - -git_repository *git_remote_owner(const git_remote *remote) -{ - assert(remote); - return remote->repo; -} - -const char *git_remote_url(const git_remote *remote) -{ - assert(remote); - return remote->url; -} - -static int set_url(git_repository *repo, const char *remote, const char *pattern, const char *url) -{ - git_config *cfg; - git_buf buf = GIT_BUF_INIT, canonical_url = GIT_BUF_INIT; - int error; - - assert(repo && remote); - - if ((error = ensure_remote_name_is_valid(remote)) < 0) - return error; - - if ((error = git_repository_config__weakptr(&cfg, repo)) < 0) - return error; - - if ((error = git_buf_printf(&buf, pattern, remote)) < 0) - return error; - - if (url) { - if ((error = canonicalize_url(&canonical_url, url)) < 0) - goto cleanup; - - error = git_config_set_string(cfg, buf.ptr, url); - } else { - error = git_config_delete_entry(cfg, buf.ptr); - } - -cleanup: - git_buf_free(&canonical_url); - git_buf_free(&buf); - - return error; -} - -int git_remote_set_url(git_repository *repo, const char *remote, const char *url) -{ - return set_url(repo, remote, CONFIG_URL_FMT, url); -} - -const char *git_remote_pushurl(const git_remote *remote) -{ - assert(remote); - return remote->pushurl; -} - -int git_remote_set_pushurl(git_repository *repo, const char *remote, const char* url) -{ - return set_url(repo, remote, CONFIG_PUSHURL_FMT, url); -} - -const char* git_remote__urlfordirection(git_remote *remote, int direction) -{ - assert(remote); - - assert(direction == GIT_DIRECTION_FETCH || direction == GIT_DIRECTION_PUSH); - - if (direction == GIT_DIRECTION_FETCH) { - return remote->url; - } - - if (direction == GIT_DIRECTION_PUSH) { - return remote->pushurl ? remote->pushurl : remote->url; - } - - return NULL; -} - -int set_transport_callbacks(git_transport *t, const git_remote_callbacks *cbs) -{ - if (!t->set_callbacks || !cbs) - return 0; - - return t->set_callbacks(t, cbs->sideband_progress, NULL, - cbs->certificate_check, cbs->payload); -} - -int git_remote_connect(git_remote *remote, git_direction direction, const git_remote_callbacks *callbacks) -{ - git_transport *t; - const char *url; - int flags = GIT_TRANSPORTFLAGS_NONE; - int error; - void *payload = NULL; - git_cred_acquire_cb credentials = NULL; - git_transport_cb transport = NULL; - - assert(remote); - - if (callbacks) { - GITERR_CHECK_VERSION(callbacks, GIT_REMOTE_CALLBACKS_VERSION, "git_remote_callbacks"); - credentials = callbacks->credentials; - transport = callbacks->transport; - payload = callbacks->payload; - } - - t = remote->transport; - - url = git_remote__urlfordirection(remote, direction); - if (url == NULL) { - giterr_set(GITERR_INVALID, - "Malformed remote '%s' - missing URL", remote->name); - return -1; - } - - /* If we don't have a transport object yet, and the caller specified a - * custom transport factory, use that */ - if (!t && transport && - (error = transport(&t, remote, payload)) < 0) - return error; - - /* If we still don't have a transport, then use the global - * transport registrations which map URI schemes to transport factories */ - if (!t && (error = git_transport_new(&t, remote, url)) < 0) - return error; - - if ((error = set_transport_callbacks(t, callbacks)) < 0 || - (error = t->connect(t, url, credentials, payload, direction, flags)) != 0) - goto on_error; - - remote->transport = t; - - return 0; - -on_error: - t->free(t); - - if (t == remote->transport) - remote->transport = NULL; - - return error; -} - -int git_remote_ls(const git_remote_head ***out, size_t *size, git_remote *remote) -{ - assert(remote); - - if (!remote->transport) { - giterr_set(GITERR_NET, "this remote has never connected"); - return -1; - } - - return remote->transport->ls(out, size, remote->transport); -} - -int git_remote__get_http_proxy(git_remote *remote, bool use_ssl, char **proxy_url) -{ - git_config *cfg; - git_config_entry *ce = NULL; - const char *val = NULL; - int error; - - assert(remote); - - if (!proxy_url || !remote->repo) - return -1; - - *proxy_url = NULL; - - if ((error = git_repository_config__weakptr(&cfg, remote->repo)) < 0) - return error; - - /* Go through the possible sources for proxy configuration, from most specific - * to least specific. */ - - /* remote..proxy config setting */ - if (remote->name && remote->name[0]) { - git_buf buf = GIT_BUF_INIT; - - if ((error = git_buf_printf(&buf, "remote.%s.proxy", remote->name)) < 0) - return error; - - error = git_config__lookup_entry(&ce, cfg, git_buf_cstr(&buf), false); - git_buf_free(&buf); - - if (error < 0) - return error; - - if (ce && ce->value) { - val = ce->value; - goto found; - } - } - - /* http.proxy config setting */ - if ((error = git_config__lookup_entry(&ce, cfg, "http.proxy", false)) < 0) - return error; - if (ce && ce->value) { - val = ce->value; - goto found; - } - - /* HTTP_PROXY / HTTPS_PROXY environment variables */ - val = use_ssl ? getenv("HTTPS_PROXY") : getenv("HTTP_PROXY"); - -found: - if (val && val[0]) { - *proxy_url = git__strdup(val); - GITERR_CHECK_ALLOC(*proxy_url); - } - git_config_entry_free(ce); - - return 0; -} - -/* DWIM `refspecs` based on `refs` and append the output to `out` */ -static int dwim_refspecs(git_vector *out, git_vector *refspecs, git_vector *refs) -{ - size_t i; - git_refspec *spec; - - git_vector_foreach(refspecs, i, spec) { - if (git_refspec__dwim_one(out, spec, refs) < 0) - return -1; - } - - return 0; -} - -static void free_refspecs(git_vector *vec) -{ - size_t i; - git_refspec *spec; - - git_vector_foreach(vec, i, spec) { - git_refspec__free(spec); - git__free(spec); - } - - git_vector_clear(vec); -} - -static int remote_head_cmp(const void *_a, const void *_b) -{ - const git_remote_head *a = (git_remote_head *) _a; - const git_remote_head *b = (git_remote_head *) _b; - - return git__strcmp_cb(a->name, b->name); -} - -static int ls_to_vector(git_vector *out, git_remote *remote) -{ - git_remote_head **heads; - size_t heads_len, i; - - if (git_remote_ls((const git_remote_head ***)&heads, &heads_len, remote) < 0) - return -1; - - if (git_vector_init(out, heads_len, remote_head_cmp) < 0) - return -1; - - for (i = 0; i < heads_len; i++) { - if (git_vector_insert(out, heads[i]) < 0) - return -1; - } - - return 0; -} - -int git_remote_download(git_remote *remote, const git_strarray *refspecs, const git_fetch_options *opts) -{ - int error = -1; - size_t i; - git_vector *to_active, specs = GIT_VECTOR_INIT, refs = GIT_VECTOR_INIT; - const git_remote_callbacks *cbs = NULL; - - assert(remote); - - if (opts) { - GITERR_CHECK_VERSION(&opts->callbacks, GIT_REMOTE_CALLBACKS_VERSION, "git_remote_callbacks"); - cbs = &opts->callbacks; - } - - if (!git_remote_connected(remote) && - (error = git_remote_connect(remote, GIT_DIRECTION_FETCH, cbs)) < 0) - goto on_error; - - if (ls_to_vector(&refs, remote) < 0) - return -1; - - if ((git_vector_init(&specs, 0, NULL)) < 0) - goto on_error; - - remote->passed_refspecs = 0; - if (!refspecs || !refspecs->count) { - to_active = &remote->refspecs; - } else { - for (i = 0; i < refspecs->count; i++) { - if ((error = add_refspec_to(&specs, refspecs->strings[i], true)) < 0) - goto on_error; - } - - to_active = &specs; - remote->passed_refspecs = 1; - } - - free_refspecs(&remote->passive_refspecs); - if ((error = dwim_refspecs(&remote->passive_refspecs, &remote->refspecs, &refs)) < 0) - goto on_error; - - free_refspecs(&remote->active_refspecs); - error = dwim_refspecs(&remote->active_refspecs, to_active, &refs); - - git_vector_free(&refs); - free_refspecs(&specs); - git_vector_free(&specs); - - if (error < 0) - return error; - - if (remote->push) { - git_push_free(remote->push); - remote->push = NULL; - } - - if ((error = git_fetch_negotiate(remote, opts)) < 0) - return error; - - return git_fetch_download_pack(remote, cbs); - -on_error: - git_vector_free(&refs); - free_refspecs(&specs); - git_vector_free(&specs); - return error; -} - -int git_remote_fetch( - git_remote *remote, - const git_strarray *refspecs, - const git_fetch_options *opts, - const char *reflog_message) -{ - int error, update_fetchhead = 1; - git_remote_autotag_option_t tagopt = remote->download_tags; - bool prune = false; - git_buf reflog_msg_buf = GIT_BUF_INIT; - const git_remote_callbacks *cbs = NULL; - - if (opts) { - GITERR_CHECK_VERSION(&opts->callbacks, GIT_REMOTE_CALLBACKS_VERSION, "git_remote_callbacks"); - cbs = &opts->callbacks; - update_fetchhead = opts->update_fetchhead; - tagopt = opts->download_tags; - } - - /* Connect and download everything */ - if ((error = git_remote_connect(remote, GIT_DIRECTION_FETCH, cbs)) != 0) - return error; - - error = git_remote_download(remote, refspecs, opts); - - /* We don't need to be connected anymore */ - git_remote_disconnect(remote); - - /* If the download failed, return the error */ - if (error != 0) - return error; - - /* Default reflog message */ - if (reflog_message) - git_buf_sets(&reflog_msg_buf, reflog_message); - else { - git_buf_printf(&reflog_msg_buf, "fetch %s", - remote->name ? remote->name : remote->url); - } - - /* Create "remote/foo" branches for all remote branches */ - error = git_remote_update_tips(remote, cbs, update_fetchhead, tagopt, git_buf_cstr(&reflog_msg_buf)); - git_buf_free(&reflog_msg_buf); - if (error < 0) - return error; - - if (opts && opts->prune == GIT_FETCH_PRUNE) - prune = true; - else if (opts && opts->prune == GIT_FETCH_PRUNE_UNSPECIFIED && remote->prune_refs) - prune = true; - else if (opts && opts->prune == GIT_FETCH_NO_PRUNE) - prune = false; - else - prune = remote->prune_refs; - - if (prune) - error = git_remote_prune(remote, cbs); - - return error; -} - -static int remote_head_for_fetchspec_src(git_remote_head **out, git_vector *update_heads, const char *fetchspec_src) -{ - unsigned int i; - git_remote_head *remote_ref; - - assert(update_heads && fetchspec_src); - - *out = NULL; - - git_vector_foreach(update_heads, i, remote_ref) { - if (strcmp(remote_ref->name, fetchspec_src) == 0) { - *out = remote_ref; - break; - } - } - - return 0; -} - -static int ref_to_update(int *update, git_buf *remote_name, git_remote *remote, git_refspec *spec, const char *ref_name) -{ - int error = 0; - git_repository *repo; - git_buf upstream_remote = GIT_BUF_INIT; - git_buf upstream_name = GIT_BUF_INIT; - - repo = git_remote_owner(remote); - - if ((!git_reference__is_branch(ref_name)) || - !git_remote_name(remote) || - (error = git_branch_upstream_remote(&upstream_remote, repo, ref_name) < 0) || - git__strcmp(git_remote_name(remote), git_buf_cstr(&upstream_remote)) || - (error = git_branch_upstream_name(&upstream_name, repo, ref_name)) < 0 || - !git_refspec_dst_matches(spec, git_buf_cstr(&upstream_name)) || - (error = git_refspec_rtransform(remote_name, spec, upstream_name.ptr)) < 0) { - /* Not an error if there is no upstream */ - if (error == GIT_ENOTFOUND) { - giterr_clear(); - error = 0; - } - - *update = 0; - } else { - *update = 1; - } - - git_buf_free(&upstream_remote); - git_buf_free(&upstream_name); - return error; -} - -static int remote_head_for_ref(git_remote_head **out, git_remote *remote, git_refspec *spec, git_vector *update_heads, git_reference *ref) -{ - git_reference *resolved_ref = NULL; - git_buf remote_name = GIT_BUF_INIT; - git_config *config = NULL; - const char *ref_name; - int error = 0, update; - - assert(out && spec && ref); - - *out = NULL; - - error = git_reference_resolve(&resolved_ref, ref); - - /* If we're in an unborn branch, let's pretend nothing happened */ - if (error == GIT_ENOTFOUND && git_reference_type(ref) == GIT_REF_SYMBOLIC) { - ref_name = git_reference_symbolic_target(ref); - error = 0; - } else { - ref_name = git_reference_name(resolved_ref); - } - - if ((error = ref_to_update(&update, &remote_name, remote, spec, ref_name)) < 0) - goto cleanup; - - if (update) - error = remote_head_for_fetchspec_src(out, update_heads, git_buf_cstr(&remote_name)); - -cleanup: - git_buf_free(&remote_name); - git_reference_free(resolved_ref); - git_config_free(config); - return error; -} - -static int git_remote_write_fetchhead(git_remote *remote, git_refspec *spec, git_vector *update_heads) -{ - git_reference *head_ref = NULL; - git_fetchhead_ref *fetchhead_ref; - git_remote_head *remote_ref, *merge_remote_ref; - git_vector fetchhead_refs; - bool include_all_fetchheads; - unsigned int i = 0; - int error = 0; - - assert(remote); - - /* no heads, nothing to do */ - if (update_heads->length == 0) - return 0; - - if (git_vector_init(&fetchhead_refs, update_heads->length, git_fetchhead_ref_cmp) < 0) - return -1; - - /* Iff refspec is * (but not subdir slash star), include tags */ - include_all_fetchheads = (strcmp(GIT_REFS_HEADS_DIR "*", git_refspec_src(spec)) == 0); - - /* Determine what to merge: if refspec was a wildcard, just use HEAD */ - if (git_refspec_is_wildcard(spec)) { - if ((error = git_reference_lookup(&head_ref, remote->repo, GIT_HEAD_FILE)) < 0 || - (error = remote_head_for_ref(&merge_remote_ref, remote, spec, update_heads, head_ref)) < 0) - goto cleanup; - } else { - /* If we're fetching a single refspec, that's the only thing that should be in FETCH_HEAD. */ - if ((error = remote_head_for_fetchspec_src(&merge_remote_ref, update_heads, git_refspec_src(spec))) < 0) - goto cleanup; - } - - /* Create the FETCH_HEAD file */ - git_vector_foreach(update_heads, i, remote_ref) { - int merge_this_fetchhead = (merge_remote_ref == remote_ref); - - if (!include_all_fetchheads && - !git_refspec_src_matches(spec, remote_ref->name) && - !merge_this_fetchhead) - continue; - - if (git_fetchhead_ref_create(&fetchhead_ref, - &remote_ref->oid, - merge_this_fetchhead, - remote_ref->name, - git_remote_url(remote)) < 0) - goto cleanup; - - if (git_vector_insert(&fetchhead_refs, fetchhead_ref) < 0) - goto cleanup; - } - - git_fetchhead_write(remote->repo, &fetchhead_refs); - -cleanup: - for (i = 0; i < fetchhead_refs.length; ++i) - git_fetchhead_ref_free(fetchhead_refs.contents[i]); - - git_vector_free(&fetchhead_refs); - git_reference_free(head_ref); - - return error; -} - -/** - * Generate a list of candidates for pruning by getting a list of - * references which match the rhs of an active refspec. - */ -static int prune_candidates(git_vector *candidates, git_remote *remote) -{ - git_strarray arr = { 0 }; - size_t i; - int error; - - if ((error = git_reference_list(&arr, remote->repo)) < 0) - return error; - - for (i = 0; i < arr.count; i++) { - const char *refname = arr.strings[i]; - char *refname_dup; - - if (!git_remote__matching_dst_refspec(remote, refname)) - continue; - - refname_dup = git__strdup(refname); - GITERR_CHECK_ALLOC(refname_dup); - - if ((error = git_vector_insert(candidates, refname_dup)) < 0) - goto out; - } - -out: - git_strarray_free(&arr); - return error; -} - -static int find_head(const void *_a, const void *_b) -{ - git_remote_head *a = (git_remote_head *) _a; - git_remote_head *b = (git_remote_head *) _b; - - return strcmp(a->name, b->name); -} - -int git_remote_prune(git_remote *remote, const git_remote_callbacks *callbacks) -{ - size_t i, j; - git_vector remote_refs = GIT_VECTOR_INIT; - git_vector candidates = GIT_VECTOR_INIT; - const git_refspec *spec; - const char *refname; - int error; - git_oid zero_id = {{ 0 }}; - - if (callbacks) - GITERR_CHECK_VERSION(callbacks, GIT_REMOTE_CALLBACKS_VERSION, "git_remote_callbacks"); - - if ((error = ls_to_vector(&remote_refs, remote)) < 0) - goto cleanup; - - git_vector_set_cmp(&remote_refs, find_head); - - if ((error = prune_candidates(&candidates, remote)) < 0) - goto cleanup; - - /* - * Remove those entries from the candidate list for which we - * can find a remote reference in at least one refspec. - */ - git_vector_foreach(&candidates, i, refname) { - git_vector_foreach(&remote->active_refspecs, j, spec) { - git_buf buf = GIT_BUF_INIT; - size_t pos; - char *src_name; - git_remote_head key = {0}; - - if (!git_refspec_dst_matches(spec, refname)) - continue; - - if ((error = git_refspec_rtransform(&buf, spec, refname)) < 0) - goto cleanup; - - key.name = (char *) git_buf_cstr(&buf); - error = git_vector_search(&pos, &remote_refs, &key); - git_buf_free(&buf); - - if (error < 0 && error != GIT_ENOTFOUND) - goto cleanup; - - if (error == GIT_ENOTFOUND) - continue; - - /* if we did find a source, remove it from the candiates */ - if ((error = git_vector_set((void **) &src_name, &candidates, i, NULL)) < 0) - goto cleanup; - - git__free(src_name); - break; - } - } - - /* - * For those candidates still left in the list, we need to - * remove them. We do not remove symrefs, as those are for - * stuff like origin/HEAD which will never match, but we do - * not want to remove them. - */ - git_vector_foreach(&candidates, i, refname) { - git_reference *ref; - git_oid id; - - if (refname == NULL) - continue; - - error = git_reference_lookup(&ref, remote->repo, refname); - /* as we want it gone, let's not consider this an error */ - if (error == GIT_ENOTFOUND) - continue; - - if (error < 0) - goto cleanup; - - if (git_reference_type(ref) == GIT_REF_SYMBOLIC) { - git_reference_free(ref); - continue; - } - - git_oid_cpy(&id, git_reference_target(ref)); - error = git_reference_delete(ref); - git_reference_free(ref); - if (error < 0) - goto cleanup; - - if (callbacks && callbacks->update_tips) - error = callbacks->update_tips(refname, &id, &zero_id, callbacks->payload); - - if (error < 0) - goto cleanup; - } - -cleanup: - git_vector_free(&remote_refs); - git_vector_free_deep(&candidates); - return error; -} - -static int update_tips_for_spec( - git_remote *remote, - const git_remote_callbacks *callbacks, - int update_fetchhead, - git_remote_autotag_option_t tagopt, - git_refspec *spec, - git_vector *refs, - const char *log_message) -{ - int error = 0, autotag; - unsigned int i = 0; - git_buf refname = GIT_BUF_INIT; - git_oid old; - git_odb *odb; - git_remote_head *head; - git_reference *ref; - git_refspec tagspec; - git_vector update_heads; - - assert(remote); - - if (git_repository_odb__weakptr(&odb, remote->repo) < 0) - return -1; - - if (git_refspec__parse(&tagspec, GIT_REFSPEC_TAGS, true) < 0) - return -1; - - /* Make a copy of the transport's refs */ - if (git_vector_init(&update_heads, 16, NULL) < 0) - return -1; - - for (; i < refs->length; ++i) { - head = git_vector_get(refs, i); - autotag = 0; - - /* Ignore malformed ref names (which also saves us from tag^{} */ - if (!git_reference_is_valid_name(head->name)) - continue; - - if (git_refspec_src_matches(&tagspec, head->name)) { - if (tagopt != GIT_REMOTE_DOWNLOAD_TAGS_NONE) { - - if (tagopt == GIT_REMOTE_DOWNLOAD_TAGS_AUTO) - autotag = 1; - - git_buf_clear(&refname); - if (git_buf_puts(&refname, head->name) < 0) - goto on_error; - } else { - continue; - } - } else if (git_refspec_src_matches(spec, head->name)) { - if (spec->dst) { - if (git_refspec_transform(&refname, spec, head->name) < 0) - goto on_error; - } else { - /* - * no rhs mans store it in FETCH_HEAD, even if we don't - update anything else. - */ - if ((error = git_vector_insert(&update_heads, head)) < 0) - goto on_error; - - continue; - } - } else { - continue; - } - - /* In autotag mode, only create tags for objects already in db */ - if (autotag && !git_odb_exists(odb, &head->oid)) - continue; - - if (!autotag && git_vector_insert(&update_heads, head) < 0) - goto on_error; - - error = git_reference_name_to_id(&old, remote->repo, refname.ptr); - if (error < 0 && error != GIT_ENOTFOUND) - goto on_error; - - if (error == GIT_ENOTFOUND) { - memset(&old, 0, GIT_OID_RAWSZ); - - if (autotag && git_vector_insert(&update_heads, head) < 0) - goto on_error; - } - - if (!git_oid__cmp(&old, &head->oid)) - continue; - - /* In autotag mode, don't overwrite any locally-existing tags */ - error = git_reference_create(&ref, remote->repo, refname.ptr, &head->oid, !autotag, - log_message); - if (error < 0 && error != GIT_EEXISTS) - goto on_error; - - git_reference_free(ref); - - if (callbacks && callbacks->update_tips != NULL) { - if (callbacks->update_tips(refname.ptr, &old, &head->oid, callbacks->payload) < 0) - goto on_error; - } - } - - if (update_fetchhead && - (error = git_remote_write_fetchhead(remote, spec, &update_heads)) < 0) - goto on_error; - - git_vector_free(&update_heads); - git_refspec__free(&tagspec); - git_buf_free(&refname); - return 0; - -on_error: - git_vector_free(&update_heads); - git_refspec__free(&tagspec); - git_buf_free(&refname); - return -1; - -} - -/** - * Iteration over the three vectors, with a pause whenever we find a match - * - * On each stop, we store the iteration stat in the inout i,j,k - * parameters, and return the currently matching passive refspec as - * well as the head which we matched. - */ -static int next_head(const git_remote *remote, git_vector *refs, - git_refspec **out_spec, git_remote_head **out_head, - size_t *out_i, size_t *out_j, size_t *out_k) -{ - const git_vector *active, *passive; - git_remote_head *head; - git_refspec *spec, *passive_spec; - size_t i, j, k; - - active = &remote->active_refspecs; - passive = &remote->passive_refspecs; - - i = *out_i; - j = *out_j; - k = *out_k; - - for (; i < refs->length; i++) { - head = git_vector_get(refs, i); - - if (!git_reference_is_valid_name(head->name)) - continue; - - for (; j < active->length; j++) { - spec = git_vector_get(active, j); - - if (!git_refspec_src_matches(spec, head->name)) - continue; - - for (; k < passive->length; k++) { - passive_spec = git_vector_get(passive, k); - - if (!git_refspec_src_matches(passive_spec, head->name)) - continue; - - *out_spec = passive_spec; - *out_head = head; - *out_i = i; - *out_j = j; - *out_k = k + 1; - return 0; - - } - k = 0; - } - j = 0; - } - - return GIT_ITEROVER; -} - -static int opportunistic_updates(const git_remote *remote, const git_remote_callbacks *callbacks, - git_vector *refs, const char *msg) -{ - size_t i, j, k; - git_refspec *spec; - git_remote_head *head; - git_reference *ref; - git_buf refname = GIT_BUF_INIT; - int error = 0; - - i = j = k = 0; - - while ((error = next_head(remote, refs, &spec, &head, &i, &j, &k)) == 0) { - git_oid old = {{ 0 }}; - /* - * If we got here, there is a refspec which was used - * for fetching which matches the source of one of the - * passive refspecs, so we should update that - * remote-tracking branch, but not add it to - * FETCH_HEAD - */ - - git_buf_clear(&refname); - if ((error = git_refspec_transform(&refname, spec, head->name)) < 0) - goto cleanup; - - error = git_reference_name_to_id(&old, remote->repo, refname.ptr); - if (error < 0 && error != GIT_ENOTFOUND) - goto cleanup; - - if (!git_oid_cmp(&old, &head->oid)) - continue; - - /* If we did find a current reference, make sure we haven't lost a race */ - if (error) - error = git_reference_create(&ref, remote->repo, refname.ptr, &head->oid, true, msg); - else - error = git_reference_create_matching(&ref, remote->repo, refname.ptr, &head->oid, true, &old, msg); - git_reference_free(ref); - if (error < 0) - goto cleanup; - - if (callbacks && callbacks->update_tips != NULL) { - if (callbacks->update_tips(refname.ptr, &old, &head->oid, callbacks->payload) < 0) - goto cleanup; - } - } - - if (error == GIT_ITEROVER) - error = 0; - -cleanup: - git_buf_free(&refname); - return error; -} - -int git_remote_update_tips( - git_remote *remote, - const git_remote_callbacks *callbacks, - int update_fetchhead, - git_remote_autotag_option_t download_tags, - const char *reflog_message) -{ - git_refspec *spec, tagspec; - git_vector refs = GIT_VECTOR_INIT; - git_remote_autotag_option_t tagopt; - int error; - size_t i; - - /* push has its own logic hidden away in the push object */ - if (remote->push) { - return git_push_update_tips(remote->push, callbacks); - } - - if (git_refspec__parse(&tagspec, GIT_REFSPEC_TAGS, true) < 0) - return -1; - - - if ((error = ls_to_vector(&refs, remote)) < 0) - goto out; - - if (download_tags == GIT_REMOTE_DOWNLOAD_TAGS_UNSPECIFIED) - tagopt = remote->download_tags; - else - tagopt = download_tags; - - if (tagopt == GIT_REMOTE_DOWNLOAD_TAGS_ALL) { - if ((error = update_tips_for_spec(remote, callbacks, update_fetchhead, tagopt, &tagspec, &refs, reflog_message)) < 0) - goto out; - } - - git_vector_foreach(&remote->active_refspecs, i, spec) { - if (spec->push) - continue; - - if ((error = update_tips_for_spec(remote, callbacks, update_fetchhead, tagopt, spec, &refs, reflog_message)) < 0) - goto out; - } - - /* only try to do opportunisitic updates if the refpec lists differ */ - if (remote->passed_refspecs) - error = opportunistic_updates(remote, callbacks, &refs, reflog_message); - -out: - git_vector_free(&refs); - git_refspec__free(&tagspec); - return error; -} - -int git_remote_connected(const git_remote *remote) -{ - assert(remote); - - if (!remote->transport || !remote->transport->is_connected) - return 0; - - /* Ask the transport if it's connected. */ - return remote->transport->is_connected(remote->transport); -} - -void git_remote_stop(git_remote *remote) -{ - assert(remote); - - if (remote->transport && remote->transport->cancel) - remote->transport->cancel(remote->transport); -} - -void git_remote_disconnect(git_remote *remote) -{ - assert(remote); - - if (git_remote_connected(remote)) - remote->transport->close(remote->transport); -} - -void git_remote_free(git_remote *remote) -{ - if (remote == NULL) - return; - - if (remote->transport != NULL) { - git_remote_disconnect(remote); - - remote->transport->free(remote->transport); - remote->transport = NULL; - } - - git_vector_free(&remote->refs); - - free_refspecs(&remote->refspecs); - git_vector_free(&remote->refspecs); - - free_refspecs(&remote->active_refspecs); - git_vector_free(&remote->active_refspecs); - - free_refspecs(&remote->passive_refspecs); - git_vector_free(&remote->passive_refspecs); - - git_push_free(remote->push); - git__free(remote->url); - git__free(remote->pushurl); - git__free(remote->name); - git__free(remote); -} - -static int remote_list_cb(const git_config_entry *entry, void *payload) -{ - git_vector *list = payload; - const char *name = entry->name + strlen("remote."); - size_t namelen = strlen(name); - char *remote_name; - - /* we know name matches "remote..(push)?url" */ - - if (!strcmp(&name[namelen - 4], ".url")) - remote_name = git__strndup(name, namelen - 4); /* strip ".url" */ - else - remote_name = git__strndup(name, namelen - 8); /* strip ".pushurl" */ - GITERR_CHECK_ALLOC(remote_name); - - return git_vector_insert(list, remote_name); -} - -int git_remote_list(git_strarray *remotes_list, git_repository *repo) -{ - int error; - git_config *cfg; - git_vector list = GIT_VECTOR_INIT; - - if ((error = git_repository_config__weakptr(&cfg, repo)) < 0) - return error; - - if ((error = git_vector_init(&list, 4, git__strcmp_cb)) < 0) - return error; - - error = git_config_foreach_match( - cfg, "^remote\\..*\\.(push)?url$", remote_list_cb, &list); - - if (error < 0) { - git_vector_free_deep(&list); - return error; - } - - git_vector_uniq(&list, git__free); - - remotes_list->strings = - (char **)git_vector_detach(&remotes_list->count, NULL, &list); - - return 0; -} - -const git_transfer_progress* git_remote_stats(git_remote *remote) -{ - assert(remote); - return &remote->stats; -} - -git_remote_autotag_option_t git_remote_autotag(const git_remote *remote) -{ - return remote->download_tags; -} - -int git_remote_set_autotag(git_repository *repo, const char *remote, git_remote_autotag_option_t value) -{ - git_buf var = GIT_BUF_INIT; - git_config *config; - int error; - - assert(repo && remote); - - if ((error = ensure_remote_name_is_valid(remote)) < 0) - return error; - - if ((error = git_repository_config__weakptr(&config, repo)) < 0) - return error; - - if ((error = git_buf_printf(&var, CONFIG_TAGOPT_FMT, remote))) - return error; - - switch (value) { - case GIT_REMOTE_DOWNLOAD_TAGS_NONE: - error = git_config_set_string(config, var.ptr, "--no-tags"); - break; - case GIT_REMOTE_DOWNLOAD_TAGS_ALL: - error = git_config_set_string(config, var.ptr, "--tags"); - break; - case GIT_REMOTE_DOWNLOAD_TAGS_AUTO: - error = git_config_delete_entry(config, var.ptr); - if (error == GIT_ENOTFOUND) - error = 0; - break; - default: - giterr_set(GITERR_INVALID, "Invalid value for the tagopt setting"); - error = -1; - } - - git_buf_free(&var); - return error; -} - -int git_remote_prune_refs(const git_remote *remote) -{ - return remote->prune_refs; -} - -static int rename_remote_config_section( - git_repository *repo, - const char *old_name, - const char *new_name) -{ - git_buf old_section_name = GIT_BUF_INIT, - new_section_name = GIT_BUF_INIT; - int error = -1; - - if (git_buf_printf(&old_section_name, "remote.%s", old_name) < 0) - goto cleanup; - - if (new_name && - (git_buf_printf(&new_section_name, "remote.%s", new_name) < 0)) - goto cleanup; - - error = git_config_rename_section( - repo, - git_buf_cstr(&old_section_name), - new_name ? git_buf_cstr(&new_section_name) : NULL); - -cleanup: - git_buf_free(&old_section_name); - git_buf_free(&new_section_name); - - return error; -} - -struct update_data { - git_config *config; - const char *old_remote_name; - const char *new_remote_name; -}; - -static int update_config_entries_cb( - const git_config_entry *entry, - void *payload) -{ - struct update_data *data = (struct update_data *)payload; - - if (strcmp(entry->value, data->old_remote_name)) - return 0; - - return git_config_set_string( - data->config, entry->name, data->new_remote_name); -} - -static int update_branch_remote_config_entry( - git_repository *repo, - const char *old_name, - const char *new_name) -{ - int error; - struct update_data data = { NULL }; - - if ((error = git_repository_config__weakptr(&data.config, repo)) < 0) - return error; - - data.old_remote_name = old_name; - data.new_remote_name = new_name; - - return git_config_foreach_match( - data.config, "branch\\..+\\.remote", update_config_entries_cb, &data); -} - -static int rename_one_remote_reference( - git_reference *reference_in, - const char *old_remote_name, - const char *new_remote_name) -{ - int error; - git_reference *ref = NULL, *dummy = NULL; - git_buf namespace = GIT_BUF_INIT, old_namespace = GIT_BUF_INIT; - git_buf new_name = GIT_BUF_INIT; - git_buf log_message = GIT_BUF_INIT; - size_t pfx_len; - const char *target; - - if ((error = git_buf_printf(&namespace, GIT_REFS_REMOTES_DIR "%s/", new_remote_name)) < 0) - return error; - - pfx_len = strlen(GIT_REFS_REMOTES_DIR) + strlen(old_remote_name) + 1; - git_buf_puts(&new_name, namespace.ptr); - if ((error = git_buf_puts(&new_name, git_reference_name(reference_in) + pfx_len)) < 0) - goto cleanup; - - if ((error = git_buf_printf(&log_message, - "renamed remote %s to %s", - old_remote_name, new_remote_name)) < 0) - goto cleanup; - - if ((error = git_reference_rename(&ref, reference_in, git_buf_cstr(&new_name), 1, - git_buf_cstr(&log_message))) < 0) - goto cleanup; - - if (git_reference_type(ref) != GIT_REF_SYMBOLIC) - goto cleanup; - - /* Handle refs like origin/HEAD -> origin/master */ - target = git_reference_symbolic_target(ref); - if ((error = git_buf_printf(&old_namespace, GIT_REFS_REMOTES_DIR "%s/", old_remote_name)) < 0) - goto cleanup; - - if (git__prefixcmp(target, old_namespace.ptr)) - goto cleanup; - - git_buf_clear(&new_name); - git_buf_puts(&new_name, namespace.ptr); - if ((error = git_buf_puts(&new_name, target + pfx_len)) < 0) - goto cleanup; - - error = git_reference_symbolic_set_target(&dummy, ref, git_buf_cstr(&new_name), - git_buf_cstr(&log_message)); - - git_reference_free(dummy); - -cleanup: - git_reference_free(reference_in); - git_reference_free(ref); - git_buf_free(&namespace); - git_buf_free(&old_namespace); - git_buf_free(&new_name); - git_buf_free(&log_message); - return error; -} - -static int rename_remote_references( - git_repository *repo, - const char *old_name, - const char *new_name) -{ - int error; - git_buf buf = GIT_BUF_INIT; - git_reference *ref; - git_reference_iterator *iter; - - if ((error = git_buf_printf(&buf, GIT_REFS_REMOTES_DIR "%s/*", old_name)) < 0) - return error; - - error = git_reference_iterator_glob_new(&iter, repo, git_buf_cstr(&buf)); - git_buf_free(&buf); - - if (error < 0) - return error; - - while ((error = git_reference_next(&ref, iter)) == 0) { - if ((error = rename_one_remote_reference(ref, old_name, new_name)) < 0) - break; - } - - git_reference_iterator_free(iter); - - return (error == GIT_ITEROVER) ? 0 : error; -} - -static int rename_fetch_refspecs(git_vector *problems, git_remote *remote, const char *new_name) -{ - git_config *config; - git_buf base = GIT_BUF_INIT, var = GIT_BUF_INIT, val = GIT_BUF_INIT; - const git_refspec *spec; - size_t i; - int error = 0; - - if ((error = git_repository_config__weakptr(&config, remote->repo)) < 0) - return error; - - if ((error = git_vector_init(problems, 1, NULL)) < 0) - return error; - - if ((error = git_buf_printf( - &base, "+refs/heads/*:refs/remotes/%s/*", remote->name)) < 0) - return error; - - git_vector_foreach(&remote->refspecs, i, spec) { - if (spec->push) - continue; - - /* Does the dst part of the refspec follow the expected format? */ - if (strcmp(git_buf_cstr(&base), spec->string)) { - char *dup; - - dup = git__strdup(spec->string); - GITERR_CHECK_ALLOC(dup); - - if ((error = git_vector_insert(problems, dup)) < 0) - break; - - continue; - } - - /* If we do want to move it to the new section */ - - git_buf_clear(&val); - git_buf_clear(&var); - - if (git_buf_printf( - &val, "+refs/heads/*:refs/remotes/%s/*", new_name) < 0 || - git_buf_printf(&var, "remote.%s.fetch", new_name) < 0) - { - error = -1; - break; - } - - if ((error = git_config_set_string( - config, git_buf_cstr(&var), git_buf_cstr(&val))) < 0) - break; - } - - git_buf_free(&base); - git_buf_free(&var); - git_buf_free(&val); - - if (error < 0) { - char *str; - git_vector_foreach(problems, i, str) - git__free(str); - - git_vector_free(problems); - } - - return error; -} - -int git_remote_rename(git_strarray *out, git_repository *repo, const char *name, const char *new_name) -{ - int error; - git_vector problem_refspecs = GIT_VECTOR_INIT; - git_remote *remote = NULL; - - assert(out && repo && name && new_name); - - if ((error = git_remote_lookup(&remote, repo, name)) < 0) - return error; - - if ((error = ensure_remote_name_is_valid(new_name)) < 0) - goto cleanup; - - if ((error = ensure_remote_doesnot_exist(repo, new_name)) < 0) - goto cleanup; - - if ((error = rename_remote_config_section(repo, name, new_name)) < 0) - goto cleanup; - - if ((error = update_branch_remote_config_entry(repo, name, new_name)) < 0) - goto cleanup; - - if ((error = rename_remote_references(repo, name, new_name)) < 0) - goto cleanup; - - if ((error = rename_fetch_refspecs(&problem_refspecs, remote, new_name)) < 0) - goto cleanup; - - out->count = problem_refspecs.length; - out->strings = (char **) problem_refspecs.contents; - -cleanup: - if (error < 0) - git_vector_free(&problem_refspecs); - - git_remote_free(remote); - return error; -} - -int git_remote_is_valid_name( - const char *remote_name) -{ - git_buf buf = GIT_BUF_INIT; - git_refspec refspec; - int error = -1; - - if (!remote_name || *remote_name == '\0') - return 0; - - git_buf_printf(&buf, "refs/heads/test:refs/remotes/%s/test", remote_name); - error = git_refspec__parse(&refspec, git_buf_cstr(&buf), true); - - git_buf_free(&buf); - git_refspec__free(&refspec); - - giterr_clear(); - return error == 0; -} - -git_refspec *git_remote__matching_refspec(git_remote *remote, const char *refname) -{ - git_refspec *spec; - size_t i; - - git_vector_foreach(&remote->active_refspecs, i, spec) { - if (spec->push) - continue; - - if (git_refspec_src_matches(spec, refname)) - return spec; - } - - return NULL; -} - -git_refspec *git_remote__matching_dst_refspec(git_remote *remote, const char *refname) -{ - git_refspec *spec; - size_t i; - - git_vector_foreach(&remote->active_refspecs, i, spec) { - if (spec->push) - continue; - - if (git_refspec_dst_matches(spec, refname)) - return spec; - } - - return NULL; -} - -int git_remote_add_fetch(git_repository *repo, const char *remote, const char *refspec) -{ - return write_add_refspec(repo, remote, refspec, true); -} - -int git_remote_add_push(git_repository *repo, const char *remote, const char *refspec) -{ - return write_add_refspec(repo, remote, refspec, false); -} - -static int set_refspecs(git_remote *remote, git_strarray *array, int push) -{ - git_vector *vec = &remote->refspecs; - git_refspec *spec; - size_t i; - - /* Start by removing any refspecs of the same type */ - for (i = 0; i < vec->length; i++) { - spec = git_vector_get(vec, i); - if (spec->push != push) - continue; - - git_refspec__free(spec); - git__free(spec); - git_vector_remove(vec, i); - i--; - } - - /* And now we add the new ones */ - - for (i = 0; i < array->count; i++) { - if (add_refspec(remote, array->strings[i], !push) < 0) - return -1; - } - - return 0; -} - -static int copy_refspecs(git_strarray *array, const git_remote *remote, unsigned int push) -{ - size_t i; - git_vector refspecs; - git_refspec *spec; - char *dup; - - if (git_vector_init(&refspecs, remote->refspecs.length, NULL) < 0) - return -1; - - git_vector_foreach(&remote->refspecs, i, spec) { - if (spec->push != push) - continue; - - if ((dup = git__strdup(spec->string)) == NULL) - goto on_error; - - if (git_vector_insert(&refspecs, dup) < 0) { - git__free(dup); - goto on_error; - } - } - - array->strings = (char **)refspecs.contents; - array->count = refspecs.length; - - return 0; - -on_error: - git_vector_free_deep(&refspecs); - - return -1; -} - -int git_remote_get_fetch_refspecs(git_strarray *array, const git_remote *remote) -{ - return copy_refspecs(array, remote, false); -} - -int git_remote_get_push_refspecs(git_strarray *array, const git_remote *remote) -{ - return copy_refspecs(array, remote, true); -} - -size_t git_remote_refspec_count(const git_remote *remote) -{ - return remote->refspecs.length; -} - -const git_refspec *git_remote_get_refspec(const git_remote *remote, size_t n) -{ - return git_vector_get(&remote->refspecs, n); -} - -int git_remote_init_callbacks(git_remote_callbacks *opts, unsigned int version) -{ - GIT_INIT_STRUCTURE_FROM_TEMPLATE( - opts, version, git_remote_callbacks, GIT_REMOTE_CALLBACKS_INIT); - return 0; -} - -/* asserts a branch..remote format */ -static const char *name_offset(size_t *len_out, const char *name) -{ - size_t prefix_len; - const char *dot; - - prefix_len = strlen("remote."); - dot = strchr(name + prefix_len, '.'); - - assert(dot); - - *len_out = dot - name - prefix_len; - return name + prefix_len; -} - -static int remove_branch_config_related_entries( - git_repository *repo, - const char *remote_name) -{ - int error; - git_config *config; - git_config_entry *entry; - git_config_iterator *iter; - git_buf buf = GIT_BUF_INIT; - - if ((error = git_repository_config__weakptr(&config, repo)) < 0) - return error; - - if ((error = git_config_iterator_glob_new(&iter, config, "branch\\..+\\.remote")) < 0) - return error; - - /* find any branches with us as upstream and remove that config */ - while ((error = git_config_next(&entry, iter)) == 0) { - const char *branch; - size_t branch_len; - - if (strcmp(remote_name, entry->value)) - continue; - - branch = name_offset(&branch_len, entry->name); - - git_buf_clear(&buf); - if (git_buf_printf(&buf, "branch.%.*s.merge", (int)branch_len, branch) < 0) - break; - - if ((error = git_config_delete_entry(config, git_buf_cstr(&buf))) < 0) - break; - - git_buf_clear(&buf); - if (git_buf_printf(&buf, "branch.%.*s.remote", (int)branch_len, branch) < 0) - break; - - if ((error = git_config_delete_entry(config, git_buf_cstr(&buf))) < 0) - break; - } - - if (error == GIT_ITEROVER) - error = 0; - - git_buf_free(&buf); - git_config_iterator_free(iter); - return error; -} - -static int remove_refs(git_repository *repo, const git_refspec *spec) -{ - git_reference_iterator *iter = NULL; - git_vector refs; - const char *name; - char *dup; - int error; - size_t i; - - if ((error = git_vector_init(&refs, 8, NULL)) < 0) - return error; - - if ((error = git_reference_iterator_new(&iter, repo)) < 0) - goto cleanup; - - while ((error = git_reference_next_name(&name, iter)) == 0) { - if (!git_refspec_dst_matches(spec, name)) - continue; - - dup = git__strdup(name); - if (!dup) { - error = -1; - goto cleanup; - } - - if ((error = git_vector_insert(&refs, dup)) < 0) - goto cleanup; - } - if (error == GIT_ITEROVER) - error = 0; - if (error < 0) - goto cleanup; - - git_vector_foreach(&refs, i, name) { - if ((error = git_reference_remove(repo, name)) < 0) - break; - } - -cleanup: - git_reference_iterator_free(iter); - git_vector_foreach(&refs, i, dup) { - git__free(dup); - } - git_vector_free(&refs); - return error; -} - -static int remove_remote_tracking(git_repository *repo, const char *remote_name) -{ - git_remote *remote; - int error; - size_t i, count; - - /* we want to use what's on the config, regardless of changes to the instance in memory */ - if ((error = git_remote_lookup(&remote, repo, remote_name)) < 0) - return error; - - count = git_remote_refspec_count(remote); - for (i = 0; i < count; i++) { - const git_refspec *refspec = git_remote_get_refspec(remote, i); - - /* shouldn't ever actually happen */ - if (refspec == NULL) - continue; - - if ((error = remove_refs(repo, refspec)) < 0) - break; - } - - git_remote_free(remote); - return error; -} - -int git_remote_delete(git_repository *repo, const char *name) -{ - int error; - - assert(repo && name); - - if ((error = remove_branch_config_related_entries(repo, name)) < 0 || - (error = remove_remote_tracking(repo, name)) < 0 || - (error = rename_remote_config_section(repo, name, NULL)) < 0) - return error; - - return 0; -} - -int git_remote_default_branch(git_buf *out, git_remote *remote) -{ - const git_remote_head **heads; - const git_remote_head *guess = NULL; - const git_oid *head_id; - size_t heads_len, i; - int error; - - assert(out); - - if ((error = git_remote_ls(&heads, &heads_len, remote)) < 0) - return error; - - if (heads_len == 0) - return GIT_ENOTFOUND; - - if (strcmp(heads[0]->name, GIT_HEAD_FILE)) - return GIT_ENOTFOUND; - - git_buf_sanitize(out); - /* the first one must be HEAD so if that has the symref info, we're done */ - if (heads[0]->symref_target) - return git_buf_puts(out, heads[0]->symref_target); - - /* - * If there's no symref information, we have to look over them - * and guess. We return the first match unless the master - * branch is a candidate. Then we return the master branch. - */ - head_id = &heads[0]->oid; - - for (i = 1; i < heads_len; i++) { - if (git_oid_cmp(head_id, &heads[i]->oid)) - continue; - - if (git__prefixcmp(heads[i]->name, GIT_REFS_HEADS_DIR)) - continue; - - if (!guess) { - guess = heads[i]; - continue; - } - - if (!git__strcmp(GIT_REFS_HEADS_MASTER_FILE, heads[i]->name)) { - guess = heads[i]; - break; - } - } - - if (!guess) - return GIT_ENOTFOUND; - - return git_buf_puts(out, guess->name); -} - -int git_remote_upload(git_remote *remote, const git_strarray *refspecs, const git_push_options *opts) -{ - size_t i; - int error; - git_push *push; - git_refspec *spec; - const git_remote_callbacks *cbs = NULL; - - assert(remote); - - if (opts) - cbs = &opts->callbacks; - - if (!git_remote_connected(remote) && - (error = git_remote_connect(remote, GIT_DIRECTION_PUSH, cbs)) < 0) - goto cleanup; - - free_refspecs(&remote->active_refspecs); - if ((error = dwim_refspecs(&remote->active_refspecs, &remote->refspecs, &remote->refs)) < 0) - goto cleanup; - - if (remote->push) { - git_push_free(remote->push); - remote->push = NULL; - } - - if ((error = git_push_new(&remote->push, remote)) < 0) - return error; - - push = remote->push; - - if (opts && (error = git_push_set_options(push, opts)) < 0) - goto cleanup; - - if (refspecs && refspecs->count > 0) { - for (i = 0; i < refspecs->count; i++) { - if ((error = git_push_add_refspec(push, refspecs->strings[i])) < 0) - goto cleanup; - } - } else { - git_vector_foreach(&remote->refspecs, i, spec) { - if (!spec->push) - continue; - if ((error = git_push_add_refspec(push, spec->string)) < 0) - goto cleanup; - } - } - - if ((error = git_push_finish(push, cbs)) < 0) - goto cleanup; - - if (cbs && cbs->push_update_reference && - (error = git_push_status_foreach(push, cbs->push_update_reference, cbs->payload)) < 0) - goto cleanup; - -cleanup: - return error; -} - -int git_remote_push(git_remote *remote, const git_strarray *refspecs, const git_push_options *opts) -{ - int error; - const git_remote_callbacks *cbs = NULL; - - if (opts) { - GITERR_CHECK_VERSION(&opts->callbacks, GIT_REMOTE_CALLBACKS_VERSION, "git_remote_callbacks"); - cbs = &opts->callbacks; - } - - assert(remote && refspecs); - - if ((error = git_remote_connect(remote, GIT_DIRECTION_PUSH, cbs)) < 0) - return error; - - if ((error = git_remote_upload(remote, refspecs, opts)) < 0) - return error; - - error = git_remote_update_tips(remote, cbs, 0, 0, NULL); - - git_remote_disconnect(remote); - return error; -} - -#define PREFIX "url" -#define SUFFIX_FETCH "insteadof" -#define SUFFIX_PUSH "pushinsteadof" - -char *apply_insteadof(git_config *config, const char *url, int direction) -{ - size_t match_length, prefix_length, suffix_length; - char *replacement = NULL; - const char *regexp; - - git_buf result = GIT_BUF_INIT; - git_config_entry *entry; - git_config_iterator *iter; - - assert(config); - assert(url); - assert(direction == GIT_DIRECTION_FETCH || direction == GIT_DIRECTION_PUSH); - - /* Add 1 to prefix/suffix length due to the additional escaped dot */ - prefix_length = strlen(PREFIX) + 1; - if (direction == GIT_DIRECTION_FETCH) { - regexp = PREFIX "\\..*\\." SUFFIX_FETCH; - suffix_length = strlen(SUFFIX_FETCH) + 1; - } else { - regexp = PREFIX "\\..*\\." SUFFIX_PUSH; - suffix_length = strlen(SUFFIX_PUSH) + 1; - } - - if (git_config_iterator_glob_new(&iter, config, regexp) < 0) - return NULL; - - match_length = 0; - while (git_config_next(&entry, iter) == 0) { - size_t n, replacement_length; - - /* Check if entry value is a prefix of URL */ - if (git__prefixcmp(url, entry->value)) - continue; - /* Check if entry value is longer than previous - * prefixes */ - if ((n = strlen(entry->value)) <= match_length) - continue; - - git__free(replacement); - match_length = n; - - /* Cut off prefix and suffix of the value */ - replacement_length = - strlen(entry->name) - (prefix_length + suffix_length); - replacement = git__strndup(entry->name + prefix_length, - replacement_length); - } - - git_config_iterator_free(iter); - - if (match_length == 0) - return git__strdup(url); - - git_buf_printf(&result, "%s%s", replacement, url + match_length); - - git__free(replacement); - - return result.ptr; -} diff --git a/vendor/libgit2/src/remote.h b/vendor/libgit2/src/remote.h deleted file mode 100644 index e696997f49..0000000000 --- a/vendor/libgit2/src/remote.h +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_remote_h__ -#define INCLUDE_remote_h__ - -#include "git2/remote.h" -#include "git2/transport.h" -#include "git2/sys/transport.h" - -#include "refspec.h" -#include "vector.h" - -#define GIT_REMOTE_ORIGIN "origin" - -struct git_remote { - char *name; - char *url; - char *pushurl; - git_vector refs; - git_vector refspecs; - git_vector active_refspecs; - git_vector passive_refspecs; - git_transport *transport; - git_repository *repo; - git_push *push; - git_transfer_progress stats; - unsigned int need_pack; - git_remote_autotag_option_t download_tags; - int prune_refs; - int passed_refspecs; -}; - -const char* git_remote__urlfordirection(struct git_remote *remote, int direction); -int git_remote__get_http_proxy(git_remote *remote, bool use_ssl, char **proxy_url); - -git_refspec *git_remote__matching_refspec(git_remote *remote, const char *refname); -git_refspec *git_remote__matching_dst_refspec(git_remote *remote, const char *refname); - -#endif diff --git a/vendor/libgit2/src/repo_template.h b/vendor/libgit2/src/repo_template.h deleted file mode 100644 index 099279aa79..0000000000 --- a/vendor/libgit2/src/repo_template.h +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_repo_template_h__ -#define INCLUDE_repo_template_h__ - -#define GIT_OBJECTS_INFO_DIR GIT_OBJECTS_DIR "info/" -#define GIT_OBJECTS_PACK_DIR GIT_OBJECTS_DIR "pack/" - -#define GIT_HOOKS_DIR "hooks/" -#define GIT_HOOKS_DIR_MODE 0777 - -#define GIT_HOOKS_README_FILE GIT_HOOKS_DIR "README.sample" -#define GIT_HOOKS_README_MODE 0777 -#define GIT_HOOKS_README_CONTENT \ -"#!/bin/sh\n"\ -"#\n"\ -"# Place appropriately named executable hook scripts into this directory\n"\ -"# to intercept various actions that git takes. See `git help hooks` for\n"\ -"# more information.\n" - -#define GIT_INFO_DIR "info/" -#define GIT_INFO_DIR_MODE 0777 - -#define GIT_INFO_EXCLUDE_FILE GIT_INFO_DIR "exclude" -#define GIT_INFO_EXCLUDE_MODE 0666 -#define GIT_INFO_EXCLUDE_CONTENT \ -"# File patterns to ignore; see `git help ignore` for more information.\n"\ -"# Lines that start with '#' are comments.\n" - -#define GIT_DESC_FILE "description" -#define GIT_DESC_MODE 0666 -#define GIT_DESC_CONTENT \ -"Unnamed repository; edit this file 'description' to name the repository.\n" - -typedef struct { - const char *path; - mode_t mode; - const char *content; -} repo_template_item; - -static repo_template_item repo_template[] = { - { GIT_OBJECTS_INFO_DIR, GIT_OBJECT_DIR_MODE, NULL }, /* '/objects/info/' */ - { GIT_OBJECTS_PACK_DIR, GIT_OBJECT_DIR_MODE, NULL }, /* '/objects/pack/' */ - { GIT_REFS_HEADS_DIR, GIT_REFS_DIR_MODE, NULL }, /* '/refs/heads/' */ - { GIT_REFS_TAGS_DIR, GIT_REFS_DIR_MODE, NULL }, /* '/refs/tags/' */ - { GIT_HOOKS_DIR, GIT_HOOKS_DIR_MODE, NULL }, /* '/hooks/' */ - { GIT_INFO_DIR, GIT_INFO_DIR_MODE, NULL }, /* '/info/' */ - { GIT_DESC_FILE, GIT_DESC_MODE, GIT_DESC_CONTENT }, - { GIT_HOOKS_README_FILE, GIT_HOOKS_README_MODE, GIT_HOOKS_README_CONTENT }, - { GIT_INFO_EXCLUDE_FILE, GIT_INFO_EXCLUDE_MODE, GIT_INFO_EXCLUDE_CONTENT }, - { NULL, 0, NULL } -}; - -#endif diff --git a/vendor/libgit2/src/repository.c b/vendor/libgit2/src/repository.c deleted file mode 100644 index 08f4baa20c..0000000000 --- a/vendor/libgit2/src/repository.c +++ /dev/null @@ -1,2316 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#include - -#include "git2/object.h" -#include "git2/refdb.h" -#include "git2/sys/repository.h" - -#include "common.h" -#include "repository.h" -#include "commit.h" -#include "tag.h" -#include "blob.h" -#include "fileops.h" -#include "sysdir.h" -#include "filebuf.h" -#include "index.h" -#include "config.h" -#include "refs.h" -#include "filter.h" -#include "odb.h" -#include "remote.h" -#include "merge.h" -#include "diff_driver.h" -#include "annotated_commit.h" - -#ifdef GIT_WIN32 -# include "win32/w32_util.h" -#endif - -static int check_repositoryformatversion(git_config *config); - -#define GIT_FILE_CONTENT_PREFIX "gitdir:" - -#define GIT_BRANCH_MASTER "master" - -#define GIT_REPO_VERSION 0 - -git_buf git_repository__reserved_names_win32[] = { - { DOT_GIT, 0, CONST_STRLEN(DOT_GIT) }, - { GIT_DIR_SHORTNAME, 0, CONST_STRLEN(GIT_DIR_SHORTNAME) } -}; -size_t git_repository__reserved_names_win32_len = 2; - -git_buf git_repository__reserved_names_posix[] = { - { DOT_GIT, 0, CONST_STRLEN(DOT_GIT) }, -}; -size_t git_repository__reserved_names_posix_len = 1; - -static void set_odb(git_repository *repo, git_odb *odb) -{ - if (odb) { - GIT_REFCOUNT_OWN(odb, repo); - GIT_REFCOUNT_INC(odb); - } - - if ((odb = git__swap(repo->_odb, odb)) != NULL) { - GIT_REFCOUNT_OWN(odb, NULL); - git_odb_free(odb); - } -} - -static void set_refdb(git_repository *repo, git_refdb *refdb) -{ - if (refdb) { - GIT_REFCOUNT_OWN(refdb, repo); - GIT_REFCOUNT_INC(refdb); - } - - if ((refdb = git__swap(repo->_refdb, refdb)) != NULL) { - GIT_REFCOUNT_OWN(refdb, NULL); - git_refdb_free(refdb); - } -} - -static void set_config(git_repository *repo, git_config *config) -{ - if (config) { - GIT_REFCOUNT_OWN(config, repo); - GIT_REFCOUNT_INC(config); - } - - if ((config = git__swap(repo->_config, config)) != NULL) { - GIT_REFCOUNT_OWN(config, NULL); - git_config_free(config); - } - - git_repository__cvar_cache_clear(repo); -} - -static void set_index(git_repository *repo, git_index *index) -{ - if (index) { - GIT_REFCOUNT_OWN(index, repo); - GIT_REFCOUNT_INC(index); - } - - if ((index = git__swap(repo->_index, index)) != NULL) { - GIT_REFCOUNT_OWN(index, NULL); - git_index_free(index); - } -} - -void git_repository__cleanup(git_repository *repo) -{ - assert(repo); - - git_cache_clear(&repo->objects); - git_attr_cache_flush(repo); - - set_config(repo, NULL); - set_index(repo, NULL); - set_odb(repo, NULL); - set_refdb(repo, NULL); -} - -void git_repository_free(git_repository *repo) -{ - size_t i; - - if (repo == NULL) - return; - - git_repository__cleanup(repo); - - git_cache_free(&repo->objects); - - git_diff_driver_registry_free(repo->diff_drivers); - repo->diff_drivers = NULL; - - for (i = 0; i < repo->reserved_names.size; i++) - git_buf_free(git_array_get(repo->reserved_names, i)); - git_array_clear(repo->reserved_names); - - git__free(repo->path_gitlink); - git__free(repo->path_repository); - git__free(repo->workdir); - git__free(repo->namespace); - git__free(repo->ident_name); - git__free(repo->ident_email); - - git__memzero(repo, sizeof(*repo)); - git__free(repo); -} - -/* - * Git repository open methods - * - * Open a repository object from its path - */ -static bool valid_repository_path(git_buf *repository_path) -{ - /* Check OBJECTS_DIR first, since it will generate the longest path name */ - if (git_path_contains_dir(repository_path, GIT_OBJECTS_DIR) == false) - return false; - - /* Ensure HEAD file exists */ - if (git_path_contains_file(repository_path, GIT_HEAD_FILE) == false) - return false; - - if (git_path_contains_dir(repository_path, GIT_REFS_DIR) == false) - return false; - - return true; -} - -static git_repository *repository_alloc(void) -{ - git_repository *repo = git__calloc(1, sizeof(git_repository)); - - if (repo == NULL || - git_cache_init(&repo->objects) < 0) - goto on_error; - - git_array_init_to_size(repo->reserved_names, 4); - if (!repo->reserved_names.ptr) - goto on_error; - - /* set all the entries in the cvar cache to `unset` */ - git_repository__cvar_cache_clear(repo); - - return repo; - -on_error: - if (repo) - git_cache_free(&repo->objects); - - git__free(repo); - return NULL; -} - -int git_repository_new(git_repository **out) -{ - git_repository *repo; - - *out = repo = repository_alloc(); - GITERR_CHECK_ALLOC(repo); - - repo->is_bare = 1; - - return 0; -} - -static int load_config_data(git_repository *repo, const git_config *config) -{ - int is_bare; - - /* Try to figure out if it's bare, default to non-bare if it's not set */ - if (git_config_get_bool(&is_bare, config, "core.bare") < 0) - repo->is_bare = 0; - else - repo->is_bare = is_bare; - - return 0; -} - -static int load_workdir(git_repository *repo, git_config *config, git_buf *parent_path) -{ - int error; - git_config_entry *ce; - git_buf worktree = GIT_BUF_INIT; - - if (repo->is_bare) - return 0; - - if ((error = git_config__lookup_entry( - &ce, config, "core.worktree", false)) < 0) - return error; - - if (ce && ce->value) { - if ((error = git_path_prettify_dir( - &worktree, ce->value, repo->path_repository)) < 0) - goto cleanup; - - repo->workdir = git_buf_detach(&worktree); - } - else if (parent_path && git_path_isdir(parent_path->ptr)) - repo->workdir = git_buf_detach(parent_path); - else { - if (git_path_dirname_r(&worktree, repo->path_repository) < 0 || - git_path_to_dir(&worktree) < 0) { - error = -1; - goto cleanup; - } - - repo->workdir = git_buf_detach(&worktree); - } - - GITERR_CHECK_ALLOC(repo->workdir); -cleanup: - git_config_entry_free(ce); - return error; -} - -/* - * This function returns furthest offset into path where a ceiling dir - * is found, so we can stop processing the path at that point. - * - * Note: converting this to use git_bufs instead of GIT_PATH_MAX buffers on - * the stack could remove directories name limits, but at the cost of doing - * repeated malloc/frees inside the loop below, so let's not do it now. - */ -static int find_ceiling_dir_offset( - const char *path, - const char *ceiling_directories) -{ - char buf[GIT_PATH_MAX + 1]; - char buf2[GIT_PATH_MAX + 1]; - const char *ceil, *sep; - size_t len, max_len = 0, min_len; - - assert(path); - - min_len = (size_t)(git_path_root(path) + 1); - - if (ceiling_directories == NULL || min_len == 0) - return (int)min_len; - - for (sep = ceil = ceiling_directories; *sep; ceil = sep + 1) { - for (sep = ceil; *sep && *sep != GIT_PATH_LIST_SEPARATOR; sep++); - len = sep - ceil; - - if (len == 0 || len >= sizeof(buf) || git_path_root(ceil) == -1) - continue; - - strncpy(buf, ceil, len); - buf[len] = '\0'; - - if (p_realpath(buf, buf2) == NULL) - continue; - - len = strlen(buf2); - if (len > 0 && buf2[len-1] == '/') - buf[--len] = '\0'; - - if (!strncmp(path, buf2, len) && - (path[len] == '/' || !path[len]) && - len > max_len) - { - max_len = len; - } - } - - return (int)(max_len <= min_len ? min_len : max_len); -} - -/* - * Read the contents of `file_path` and set `path_out` to the repo dir that - * it points to. Before calling, set `path_out` to the base directory that - * should be used if the contents of `file_path` are a relative path. - */ -static int read_gitfile(git_buf *path_out, const char *file_path) -{ - int error = 0; - git_buf file = GIT_BUF_INIT; - size_t prefix_len = strlen(GIT_FILE_CONTENT_PREFIX); - - assert(path_out && file_path); - - if (git_futils_readbuffer(&file, file_path) < 0) - return -1; - - git_buf_rtrim(&file); - /* apparently on Windows, some people use backslashes in paths */ - git_path_mkposix(file.ptr); - - if (git_buf_len(&file) <= prefix_len || - memcmp(git_buf_cstr(&file), GIT_FILE_CONTENT_PREFIX, prefix_len) != 0) - { - giterr_set(GITERR_REPOSITORY, - "The `.git` file at '%s' is malformed", file_path); - error = -1; - } - else if ((error = git_path_dirname_r(path_out, file_path)) >= 0) { - const char *gitlink = git_buf_cstr(&file) + prefix_len; - while (*gitlink && git__isspace(*gitlink)) gitlink++; - - error = git_path_prettify_dir( - path_out, gitlink, git_buf_cstr(path_out)); - } - - git_buf_free(&file); - return error; -} - -static int find_repo( - git_buf *repo_path, - git_buf *parent_path, - git_buf *link_path, - const char *start_path, - uint32_t flags, - const char *ceiling_dirs) -{ - int error; - git_buf path = GIT_BUF_INIT; - struct stat st; - dev_t initial_device = 0; - bool try_with_dot_git = ((flags & GIT_REPOSITORY_OPEN_BARE) != 0); - int ceiling_offset; - - git_buf_free(repo_path); - - if ((error = git_path_prettify(&path, start_path, NULL)) < 0) - return error; - - ceiling_offset = find_ceiling_dir_offset(path.ptr, ceiling_dirs); - - if (!try_with_dot_git && - (error = git_buf_joinpath(&path, path.ptr, DOT_GIT)) < 0) - return error; - - while (!error && !git_buf_len(repo_path)) { - if (p_stat(path.ptr, &st) == 0) { - /* check that we have not crossed device boundaries */ - if (initial_device == 0) - initial_device = st.st_dev; - else if (st.st_dev != initial_device && - (flags & GIT_REPOSITORY_OPEN_CROSS_FS) == 0) - break; - - if (S_ISDIR(st.st_mode)) { - if (valid_repository_path(&path)) { - git_path_to_dir(&path); - git_buf_set(repo_path, path.ptr, path.size); - break; - } - } - else if (S_ISREG(st.st_mode)) { - git_buf repo_link = GIT_BUF_INIT; - - if (!(error = read_gitfile(&repo_link, path.ptr))) { - if (valid_repository_path(&repo_link)) { - git_buf_swap(repo_path, &repo_link); - - if (link_path) - error = git_buf_put(link_path, - path.ptr, path.size); - } - - git_buf_free(&repo_link); - break; - } - git_buf_free(&repo_link); - } - } - - /* move up one directory level */ - if (git_path_dirname_r(&path, path.ptr) < 0) { - error = -1; - break; - } - - if (try_with_dot_git) { - /* if we tried original dir with and without .git AND either hit - * directory ceiling or NO_SEARCH was requested, then be done. - */ - if (path.ptr[ceiling_offset] == '\0' || - (flags & GIT_REPOSITORY_OPEN_NO_SEARCH) != 0) - break; - /* otherwise look first for .git item */ - error = git_buf_joinpath(&path, path.ptr, DOT_GIT); - } - try_with_dot_git = !try_with_dot_git; - } - - if (!error && parent_path && !(flags & GIT_REPOSITORY_OPEN_BARE)) { - if (!git_buf_len(repo_path)) - git_buf_clear(parent_path); - else { - git_path_dirname_r(parent_path, path.ptr); - git_path_to_dir(parent_path); - } - if (git_buf_oom(parent_path)) - return -1; - } - - git_buf_free(&path); - - if (!git_buf_len(repo_path) && !error) { - giterr_set(GITERR_REPOSITORY, - "Could not find repository from '%s'", start_path); - error = GIT_ENOTFOUND; - } - - return error; -} - -int git_repository_open_bare( - git_repository **repo_ptr, - const char *bare_path) -{ - int error; - git_buf path = GIT_BUF_INIT; - git_repository *repo = NULL; - - if ((error = git_path_prettify_dir(&path, bare_path, NULL)) < 0) - return error; - - if (!valid_repository_path(&path)) { - git_buf_free(&path); - giterr_set(GITERR_REPOSITORY, "Path is not a repository: %s", bare_path); - return GIT_ENOTFOUND; - } - - repo = repository_alloc(); - GITERR_CHECK_ALLOC(repo); - - repo->path_repository = git_buf_detach(&path); - GITERR_CHECK_ALLOC(repo->path_repository); - - /* of course we're bare! */ - repo->is_bare = 1; - repo->workdir = NULL; - - *repo_ptr = repo; - return 0; -} - -int git_repository_open_ext( - git_repository **repo_ptr, - const char *start_path, - unsigned int flags, - const char *ceiling_dirs) -{ - int error; - git_buf path = GIT_BUF_INIT, parent = GIT_BUF_INIT, - link_path = GIT_BUF_INIT; - git_repository *repo; - git_config *config = NULL; - - if (repo_ptr) - *repo_ptr = NULL; - - error = find_repo( - &path, &parent, &link_path, start_path, flags, ceiling_dirs); - - if (error < 0 || !repo_ptr) - return error; - - repo = repository_alloc(); - GITERR_CHECK_ALLOC(repo); - - repo->path_repository = git_buf_detach(&path); - GITERR_CHECK_ALLOC(repo->path_repository); - - if (link_path.size) { - repo->path_gitlink = git_buf_detach(&link_path); - GITERR_CHECK_ALLOC(repo->path_gitlink); - } - - /* - * We'd like to have the config, but git doesn't particularly - * care if it's not there, so we need to deal with that. - */ - - error = git_repository_config_snapshot(&config, repo); - if (error < 0 && error != GIT_ENOTFOUND) - goto cleanup; - - if (config && (error = check_repositoryformatversion(config)) < 0) - goto cleanup; - - if ((flags & GIT_REPOSITORY_OPEN_BARE) != 0) - repo->is_bare = 1; - else { - - if (config && - ((error = load_config_data(repo, config)) < 0 || - (error = load_workdir(repo, config, &parent)) < 0)) - goto cleanup; - } - -cleanup: - git_buf_free(&parent); - git_config_free(config); - - if (error < 0) - git_repository_free(repo); - else - *repo_ptr = repo; - - return error; -} - -int git_repository_open(git_repository **repo_out, const char *path) -{ - return git_repository_open_ext( - repo_out, path, GIT_REPOSITORY_OPEN_NO_SEARCH, NULL); -} - -int git_repository_wrap_odb(git_repository **repo_out, git_odb *odb) -{ - git_repository *repo; - - repo = repository_alloc(); - GITERR_CHECK_ALLOC(repo); - - git_repository_set_odb(repo, odb); - *repo_out = repo; - - return 0; -} - -int git_repository_discover( - git_buf *out, - const char *start_path, - int across_fs, - const char *ceiling_dirs) -{ - uint32_t flags = across_fs ? GIT_REPOSITORY_OPEN_CROSS_FS : 0; - - assert(start_path); - - git_buf_sanitize(out); - - return find_repo(out, NULL, NULL, start_path, flags, ceiling_dirs); -} - -static int load_config( - git_config **out, - git_repository *repo, - const char *global_config_path, - const char *xdg_config_path, - const char *system_config_path) -{ - int error; - git_buf config_path = GIT_BUF_INIT; - git_config *cfg = NULL; - - assert(repo && out); - - if ((error = git_config_new(&cfg)) < 0) - return error; - - error = git_buf_joinpath( - &config_path, repo->path_repository, GIT_CONFIG_FILENAME_INREPO); - if (error < 0) - goto on_error; - - if ((error = git_config_add_file_ondisk( - cfg, config_path.ptr, GIT_CONFIG_LEVEL_LOCAL, 0)) < 0 && - error != GIT_ENOTFOUND) - goto on_error; - - git_buf_free(&config_path); - - if (global_config_path != NULL && - (error = git_config_add_file_ondisk( - cfg, global_config_path, GIT_CONFIG_LEVEL_GLOBAL, 0)) < 0 && - error != GIT_ENOTFOUND) - goto on_error; - - if (xdg_config_path != NULL && - (error = git_config_add_file_ondisk( - cfg, xdg_config_path, GIT_CONFIG_LEVEL_XDG, 0)) < 0 && - error != GIT_ENOTFOUND) - goto on_error; - - if (system_config_path != NULL && - (error = git_config_add_file_ondisk( - cfg, system_config_path, GIT_CONFIG_LEVEL_SYSTEM, 0)) < 0 && - error != GIT_ENOTFOUND) - goto on_error; - - giterr_clear(); /* clear any lingering ENOTFOUND errors */ - - *out = cfg; - return 0; - -on_error: - git_buf_free(&config_path); - git_config_free(cfg); - *out = NULL; - return error; -} - -static const char *path_unless_empty(git_buf *buf) -{ - return git_buf_len(buf) > 0 ? git_buf_cstr(buf) : NULL; -} - -int git_repository_config__weakptr(git_config **out, git_repository *repo) -{ - int error = 0; - - if (repo->_config == NULL) { - git_buf global_buf = GIT_BUF_INIT; - git_buf xdg_buf = GIT_BUF_INIT; - git_buf system_buf = GIT_BUF_INIT; - git_config *config; - - git_config_find_global(&global_buf); - git_config_find_xdg(&xdg_buf); - git_config_find_system(&system_buf); - - /* If there is no global file, open a backend for it anyway */ - if (git_buf_len(&global_buf) == 0) - git_config__global_location(&global_buf); - - error = load_config( - &config, repo, - path_unless_empty(&global_buf), - path_unless_empty(&xdg_buf), - path_unless_empty(&system_buf)); - if (!error) { - GIT_REFCOUNT_OWN(config, repo); - - config = git__compare_and_swap(&repo->_config, NULL, config); - if (config != NULL) { - GIT_REFCOUNT_OWN(config, NULL); - git_config_free(config); - } - } - - git_buf_free(&global_buf); - git_buf_free(&xdg_buf); - git_buf_free(&system_buf); - } - - *out = repo->_config; - return error; -} - -int git_repository_config(git_config **out, git_repository *repo) -{ - if (git_repository_config__weakptr(out, repo) < 0) - return -1; - - GIT_REFCOUNT_INC(*out); - return 0; -} - -int git_repository_config_snapshot(git_config **out, git_repository *repo) -{ - int error; - git_config *weak; - - if ((error = git_repository_config__weakptr(&weak, repo)) < 0) - return error; - - return git_config_snapshot(out, weak); -} - -void git_repository_set_config(git_repository *repo, git_config *config) -{ - assert(repo && config); - set_config(repo, config); -} - -int git_repository_odb__weakptr(git_odb **out, git_repository *repo) -{ - int error = 0; - - assert(repo && out); - - if (repo->_odb == NULL) { - git_buf odb_path = GIT_BUF_INIT; - git_odb *odb; - - if ((error = git_buf_joinpath(&odb_path, repo->path_repository, GIT_OBJECTS_DIR)) < 0) - return error; - - error = git_odb_open(&odb, odb_path.ptr); - if (!error) { - GIT_REFCOUNT_OWN(odb, repo); - - odb = git__compare_and_swap(&repo->_odb, NULL, odb); - if (odb != NULL) { - GIT_REFCOUNT_OWN(odb, NULL); - git_odb_free(odb); - } - } - - git_buf_free(&odb_path); - } - - *out = repo->_odb; - return error; -} - -int git_repository_odb(git_odb **out, git_repository *repo) -{ - if (git_repository_odb__weakptr(out, repo) < 0) - return -1; - - GIT_REFCOUNT_INC(*out); - return 0; -} - -void git_repository_set_odb(git_repository *repo, git_odb *odb) -{ - assert(repo && odb); - set_odb(repo, odb); -} - -int git_repository_refdb__weakptr(git_refdb **out, git_repository *repo) -{ - int error = 0; - - assert(out && repo); - - if (repo->_refdb == NULL) { - git_refdb *refdb; - - error = git_refdb_open(&refdb, repo); - if (!error) { - GIT_REFCOUNT_OWN(refdb, repo); - - refdb = git__compare_and_swap(&repo->_refdb, NULL, refdb); - if (refdb != NULL) { - GIT_REFCOUNT_OWN(refdb, NULL); - git_refdb_free(refdb); - } - } - } - - *out = repo->_refdb; - return error; -} - -int git_repository_refdb(git_refdb **out, git_repository *repo) -{ - if (git_repository_refdb__weakptr(out, repo) < 0) - return -1; - - GIT_REFCOUNT_INC(*out); - return 0; -} - -void git_repository_set_refdb(git_repository *repo, git_refdb *refdb) -{ - assert(repo && refdb); - set_refdb(repo, refdb); -} - -int git_repository_index__weakptr(git_index **out, git_repository *repo) -{ - int error = 0; - - assert(out && repo); - - if (repo->_index == NULL) { - git_buf index_path = GIT_BUF_INIT; - git_index *index; - - if ((error = git_buf_joinpath(&index_path, repo->path_repository, GIT_INDEX_FILE)) < 0) - return error; - - error = git_index_open(&index, index_path.ptr); - if (!error) { - GIT_REFCOUNT_OWN(index, repo); - - index = git__compare_and_swap(&repo->_index, NULL, index); - if (index != NULL) { - GIT_REFCOUNT_OWN(index, NULL); - git_index_free(index); - } - - error = git_index_set_caps(repo->_index, GIT_INDEXCAP_FROM_OWNER); - } - - git_buf_free(&index_path); - } - - *out = repo->_index; - return error; -} - -int git_repository_index(git_index **out, git_repository *repo) -{ - if (git_repository_index__weakptr(out, repo) < 0) - return -1; - - GIT_REFCOUNT_INC(*out); - return 0; -} - -void git_repository_set_index(git_repository *repo, git_index *index) -{ - assert(repo); - set_index(repo, index); -} - -int git_repository_set_namespace(git_repository *repo, const char *namespace) -{ - git__free(repo->namespace); - - if (namespace == NULL) { - repo->namespace = NULL; - return 0; - } - - return (repo->namespace = git__strdup(namespace)) ? 0 : -1; -} - -const char *git_repository_get_namespace(git_repository *repo) -{ - return repo->namespace; -} - -#ifdef GIT_WIN32 -static int reserved_names_add8dot3(git_repository *repo, const char *path) -{ - char *name = git_win32_path_8dot3_name(path); - const char *def = GIT_DIR_SHORTNAME; - const char *def_dot_git = DOT_GIT; - size_t name_len, def_len = CONST_STRLEN(GIT_DIR_SHORTNAME); - size_t def_dot_git_len = CONST_STRLEN(DOT_GIT); - git_buf *buf; - - if (!name) - return 0; - - name_len = strlen(name); - - if ((name_len == def_len && memcmp(name, def, def_len) == 0) || - (name_len == def_dot_git_len && memcmp(name, def_dot_git, def_dot_git_len) == 0)) { - git__free(name); - return 0; - } - - if ((buf = git_array_alloc(repo->reserved_names)) == NULL) - return -1; - - git_buf_attach(buf, name, name_len); - return true; -} - -bool git_repository__reserved_names( - git_buf **out, size_t *outlen, git_repository *repo, bool include_ntfs) -{ - GIT_UNUSED(include_ntfs); - - if (repo->reserved_names.size == 0) { - git_buf *buf; - size_t i; - - /* Add the static defaults */ - for (i = 0; i < git_repository__reserved_names_win32_len; i++) { - if ((buf = git_array_alloc(repo->reserved_names)) == NULL) - goto on_error; - - buf->ptr = git_repository__reserved_names_win32[i].ptr; - buf->size = git_repository__reserved_names_win32[i].size; - } - - /* Try to add any repo-specific reserved names */ - if (!repo->is_bare) { - const char *reserved_path = repo->path_gitlink ? - repo->path_gitlink : repo->path_repository; - - if (reserved_names_add8dot3(repo, reserved_path) < 0) - goto on_error; - } - } - - *out = repo->reserved_names.ptr; - *outlen = repo->reserved_names.size; - - return true; - - /* Always give good defaults, even on OOM */ -on_error: - *out = git_repository__reserved_names_win32; - *outlen = git_repository__reserved_names_win32_len; - - return false; -} -#else -bool git_repository__reserved_names( - git_buf **out, size_t *outlen, git_repository *repo, bool include_ntfs) -{ - GIT_UNUSED(repo); - - if (include_ntfs) { - *out = git_repository__reserved_names_win32; - *outlen = git_repository__reserved_names_win32_len; - } else { - *out = git_repository__reserved_names_posix; - *outlen = git_repository__reserved_names_posix_len; - } - - return true; -} -#endif - -static int check_repositoryformatversion(git_config *config) -{ - int version, error; - - error = git_config_get_int32(&version, config, "core.repositoryformatversion"); - /* git ignores this if the config variable isn't there */ - if (error == GIT_ENOTFOUND) - return 0; - - if (error < 0) - return -1; - - if (GIT_REPO_VERSION < version) { - giterr_set(GITERR_REPOSITORY, - "Unsupported repository version %d. Only versions up to %d are supported.", - version, GIT_REPO_VERSION); - return -1; - } - - return 0; -} - -static int repo_init_create_head(const char *git_dir, const char *ref_name) -{ - git_buf ref_path = GIT_BUF_INIT; - git_filebuf ref = GIT_FILEBUF_INIT; - const char *fmt; - - if (git_buf_joinpath(&ref_path, git_dir, GIT_HEAD_FILE) < 0 || - git_filebuf_open(&ref, ref_path.ptr, 0, GIT_REFS_FILE_MODE) < 0) - goto fail; - - if (!ref_name) - ref_name = GIT_BRANCH_MASTER; - - if (git__prefixcmp(ref_name, GIT_REFS_DIR) == 0) - fmt = "ref: %s\n"; - else - fmt = "ref: " GIT_REFS_HEADS_DIR "%s\n"; - - if (git_filebuf_printf(&ref, fmt, ref_name) < 0 || - git_filebuf_commit(&ref) < 0) - goto fail; - - git_buf_free(&ref_path); - return 0; - -fail: - git_buf_free(&ref_path); - git_filebuf_cleanup(&ref); - return -1; -} - -static bool is_chmod_supported(const char *file_path) -{ - struct stat st1, st2; - - if (p_stat(file_path, &st1) < 0) - return false; - - if (p_chmod(file_path, st1.st_mode ^ S_IXUSR) < 0) - return false; - - if (p_stat(file_path, &st2) < 0) - return false; - - return (st1.st_mode != st2.st_mode); -} - -static bool is_filesystem_case_insensitive(const char *gitdir_path) -{ - git_buf path = GIT_BUF_INIT; - int is_insensitive = -1; - - if (!git_buf_joinpath(&path, gitdir_path, "CoNfIg")) - is_insensitive = git_path_exists(git_buf_cstr(&path)); - - git_buf_free(&path); - return is_insensitive; -} - -static bool are_symlinks_supported(const char *wd_path) -{ - git_buf path = GIT_BUF_INIT; - int fd; - struct stat st; - int symlinks_supported = -1; - - if ((fd = git_futils_mktmp(&path, wd_path, 0666)) < 0 || - p_close(fd) < 0 || - p_unlink(path.ptr) < 0 || - p_symlink("testing", path.ptr) < 0 || - p_lstat(path.ptr, &st) < 0) - symlinks_supported = false; - else - symlinks_supported = (S_ISLNK(st.st_mode) != 0); - - (void)p_unlink(path.ptr); - git_buf_free(&path); - - return symlinks_supported; -} - -static int create_empty_file(const char *path, mode_t mode) -{ - int fd; - - if ((fd = p_creat(path, mode)) < 0) { - giterr_set(GITERR_OS, "Error while creating '%s'", path); - return -1; - } - - if (p_close(fd) < 0) { - giterr_set(GITERR_OS, "Error while closing '%s'", path); - return -1; - } - - return 0; -} - -static int repo_local_config( - git_config **out, - git_buf *config_dir, - git_repository *repo, - const char *repo_dir) -{ - int error = 0; - git_config *parent; - const char *cfg_path; - - if (git_buf_joinpath(config_dir, repo_dir, GIT_CONFIG_FILENAME_INREPO) < 0) - return -1; - cfg_path = git_buf_cstr(config_dir); - - /* make LOCAL config if missing */ - if (!git_path_isfile(cfg_path) && - (error = create_empty_file(cfg_path, GIT_CONFIG_FILE_MODE)) < 0) - return error; - - /* if no repo, just open that file directly */ - if (!repo) - return git_config_open_ondisk(out, cfg_path); - - /* otherwise, open parent config and get that level */ - if ((error = git_repository_config__weakptr(&parent, repo)) < 0) - return error; - - if (git_config_open_level(out, parent, GIT_CONFIG_LEVEL_LOCAL) < 0) { - giterr_clear(); - - if (!(error = git_config_add_file_ondisk( - parent, cfg_path, GIT_CONFIG_LEVEL_LOCAL, false))) - error = git_config_open_level(out, parent, GIT_CONFIG_LEVEL_LOCAL); - } - - git_config_free(parent); - - return error; -} - -static int repo_init_fs_configs( - git_config *cfg, - const char *cfg_path, - const char *repo_dir, - const char *work_dir, - bool update_ignorecase) -{ - int error = 0; - - if (!work_dir) - work_dir = repo_dir; - - if ((error = git_config_set_bool( - cfg, "core.filemode", is_chmod_supported(cfg_path))) < 0) - return error; - - if (!are_symlinks_supported(work_dir)) { - if ((error = git_config_set_bool(cfg, "core.symlinks", false)) < 0) - return error; - } else if (git_config_delete_entry(cfg, "core.symlinks") < 0) - giterr_clear(); - - if (update_ignorecase) { - if (is_filesystem_case_insensitive(repo_dir)) { - if ((error = git_config_set_bool(cfg, "core.ignorecase", true)) < 0) - return error; - } else if (git_config_delete_entry(cfg, "core.ignorecase") < 0) - giterr_clear(); - } - -#ifdef GIT_USE_ICONV - if ((error = git_config_set_bool( - cfg, "core.precomposeunicode", - git_path_does_fs_decompose_unicode(work_dir))) < 0) - return error; - /* on non-iconv platforms, don't even set core.precomposeunicode */ -#endif - - return 0; -} - -static int repo_init_config( - const char *repo_dir, - const char *work_dir, - uint32_t flags, - uint32_t mode) -{ - int error = 0; - git_buf cfg_path = GIT_BUF_INIT, worktree_path = GIT_BUF_INIT; - git_config *config = NULL; - bool is_bare = ((flags & GIT_REPOSITORY_INIT_BARE) != 0); - bool is_reinit = ((flags & GIT_REPOSITORY_INIT__IS_REINIT) != 0); - - if ((error = repo_local_config(&config, &cfg_path, NULL, repo_dir)) < 0) - goto cleanup; - - if (is_reinit && (error = check_repositoryformatversion(config)) < 0) - goto cleanup; - -#define SET_REPO_CONFIG(TYPE, NAME, VAL) do { \ - if ((error = git_config_set_##TYPE(config, NAME, VAL)) < 0) \ - goto cleanup; } while (0) - - SET_REPO_CONFIG(bool, "core.bare", is_bare); - SET_REPO_CONFIG(int32, "core.repositoryformatversion", GIT_REPO_VERSION); - - if ((error = repo_init_fs_configs( - config, cfg_path.ptr, repo_dir, work_dir, !is_reinit)) < 0) - goto cleanup; - - if (!is_bare) { - SET_REPO_CONFIG(bool, "core.logallrefupdates", true); - - if (!(flags & GIT_REPOSITORY_INIT__NATURAL_WD)) { - if ((error = git_buf_sets(&worktree_path, work_dir)) < 0) - goto cleanup; - - if ((flags & GIT_REPOSITORY_INIT_RELATIVE_GITLINK)) - if ((error = git_path_make_relative(&worktree_path, repo_dir)) < 0) - goto cleanup; - - SET_REPO_CONFIG(string, "core.worktree", worktree_path.ptr); - } else if (is_reinit) { - if (git_config_delete_entry(config, "core.worktree") < 0) - giterr_clear(); - } - } - - if (mode == GIT_REPOSITORY_INIT_SHARED_GROUP) { - SET_REPO_CONFIG(int32, "core.sharedrepository", 1); - SET_REPO_CONFIG(bool, "receive.denyNonFastforwards", true); - } - else if (mode == GIT_REPOSITORY_INIT_SHARED_ALL) { - SET_REPO_CONFIG(int32, "core.sharedrepository", 2); - SET_REPO_CONFIG(bool, "receive.denyNonFastforwards", true); - } - -cleanup: - git_buf_free(&cfg_path); - git_buf_free(&worktree_path); - git_config_free(config); - - return error; -} - -static int repo_reinit_submodule_fs(git_submodule *sm, const char *n, void *p) -{ - git_repository *smrepo = NULL; - GIT_UNUSED(n); GIT_UNUSED(p); - - if (git_submodule_open(&smrepo, sm) < 0 || - git_repository_reinit_filesystem(smrepo, true) < 0) - giterr_clear(); - git_repository_free(smrepo); - - return 0; -} - -int git_repository_reinit_filesystem(git_repository *repo, int recurse) -{ - int error = 0; - git_buf path = GIT_BUF_INIT; - git_config *config = NULL; - const char *repo_dir = git_repository_path(repo); - - if (!(error = repo_local_config(&config, &path, repo, repo_dir))) - error = repo_init_fs_configs( - config, path.ptr, repo_dir, git_repository_workdir(repo), true); - - git_config_free(config); - git_buf_free(&path); - - git_repository__cvar_cache_clear(repo); - - if (!repo->is_bare && recurse) - (void)git_submodule_foreach(repo, repo_reinit_submodule_fs, NULL); - - return error; -} - -static int repo_write_template( - const char *git_dir, - bool allow_overwrite, - const char *file, - mode_t mode, - bool hidden, - const char *content) -{ - git_buf path = GIT_BUF_INIT; - int fd, error = 0, flags; - - if (git_buf_joinpath(&path, git_dir, file) < 0) - return -1; - - if (allow_overwrite) - flags = O_WRONLY | O_CREAT | O_TRUNC; - else - flags = O_WRONLY | O_CREAT | O_EXCL; - - fd = p_open(git_buf_cstr(&path), flags, mode); - - if (fd >= 0) { - error = p_write(fd, content, strlen(content)); - - p_close(fd); - } - else if (errno != EEXIST) - error = fd; - -#ifdef GIT_WIN32 - if (!error && hidden) { - if (git_win32__sethidden(path.ptr) < 0) - error = -1; - } -#else - GIT_UNUSED(hidden); -#endif - - git_buf_free(&path); - - if (error) - giterr_set(GITERR_OS, - "Failed to initialize repository with template '%s'", file); - - return error; -} - -static int repo_write_gitlink( - const char *in_dir, const char *to_repo, bool use_relative_path) -{ - int error; - git_buf buf = GIT_BUF_INIT; - git_buf path_to_repo = GIT_BUF_INIT; - struct stat st; - - git_path_dirname_r(&buf, to_repo); - git_path_to_dir(&buf); - if (git_buf_oom(&buf)) - return -1; - - /* don't write gitlink to natural workdir */ - if (git__suffixcmp(to_repo, "/" DOT_GIT "/") == 0 && - strcmp(in_dir, buf.ptr) == 0) - { - error = GIT_PASSTHROUGH; - goto cleanup; - } - - if ((error = git_buf_joinpath(&buf, in_dir, DOT_GIT)) < 0) - goto cleanup; - - if (!p_stat(buf.ptr, &st) && !S_ISREG(st.st_mode)) { - giterr_set(GITERR_REPOSITORY, - "Cannot overwrite gitlink file into path '%s'", in_dir); - error = GIT_EEXISTS; - goto cleanup; - } - - git_buf_clear(&buf); - - error = git_buf_sets(&path_to_repo, to_repo); - - if (!error && use_relative_path) - error = git_path_make_relative(&path_to_repo, in_dir); - - if (!error) - error = git_buf_join(&buf, ' ', GIT_FILE_CONTENT_PREFIX, path_to_repo.ptr); - - if (!error) - error = repo_write_template(in_dir, true, DOT_GIT, 0666, true, buf.ptr); - -cleanup: - git_buf_free(&buf); - git_buf_free(&path_to_repo); - return error; -} - -static mode_t pick_dir_mode(git_repository_init_options *opts) -{ - if (opts->mode == GIT_REPOSITORY_INIT_SHARED_UMASK) - return 0777; - if (opts->mode == GIT_REPOSITORY_INIT_SHARED_GROUP) - return (0775 | S_ISGID); - if (opts->mode == GIT_REPOSITORY_INIT_SHARED_ALL) - return (0777 | S_ISGID); - return opts->mode; -} - -#include "repo_template.h" - -static int repo_init_structure( - const char *repo_dir, - const char *work_dir, - git_repository_init_options *opts) -{ - int error = 0; - repo_template_item *tpl; - bool external_tpl = - ((opts->flags & GIT_REPOSITORY_INIT_EXTERNAL_TEMPLATE) != 0); - mode_t dmode = pick_dir_mode(opts); - bool chmod = opts->mode != GIT_REPOSITORY_INIT_SHARED_UMASK; - - /* Hide the ".git" directory */ -#ifdef GIT_WIN32 - if ((opts->flags & GIT_REPOSITORY_INIT__HAS_DOTGIT) != 0) { - if (git_win32__sethidden(repo_dir) < 0) { - giterr_set(GITERR_OS, - "Failed to mark Git repository folder as hidden"); - return -1; - } - } -#endif - - /* Create the .git gitlink if appropriate */ - if ((opts->flags & GIT_REPOSITORY_INIT_BARE) == 0 && - (opts->flags & GIT_REPOSITORY_INIT__NATURAL_WD) == 0) - { - if (repo_write_gitlink(work_dir, repo_dir, opts->flags & GIT_REPOSITORY_INIT_RELATIVE_GITLINK) < 0) - return -1; - } - - /* Copy external template if requested */ - if (external_tpl) { - git_config *cfg = NULL; - const char *tdir = NULL; - bool default_template = false; - git_buf template_buf = GIT_BUF_INIT; - - if (opts->template_path) - tdir = opts->template_path; - else if ((error = git_config_open_default(&cfg)) >= 0) { - if (!git_config_get_path(&template_buf, cfg, "init.templatedir")) - tdir = template_buf.ptr; - giterr_clear(); - } - - if (!tdir) { - if (!(error = git_sysdir_find_template_dir(&template_buf))) - tdir = template_buf.ptr; - default_template = true; - } - - if (tdir) { - uint32_t cpflags = GIT_CPDIR_COPY_SYMLINKS | GIT_CPDIR_SIMPLE_TO_MODE; - if (opts->mode != GIT_REPOSITORY_INIT_SHARED_UMASK) - cpflags |= GIT_CPDIR_CHMOD_DIRS; - error = git_futils_cp_r(tdir, repo_dir, cpflags, dmode); - } - - git_buf_free(&template_buf); - git_config_free(cfg); - - if (error < 0) { - if (!default_template) - return error; - - /* if template was default, ignore error and use internal */ - giterr_clear(); - external_tpl = false; - error = 0; - } - } - - /* Copy internal template - * - always ensure existence of dirs - * - only create files if no external template was specified - */ - for (tpl = repo_template; !error && tpl->path; ++tpl) { - if (!tpl->content) { - uint32_t mkdir_flags = GIT_MKDIR_PATH; - if (chmod) - mkdir_flags |= GIT_MKDIR_CHMOD; - - error = git_futils_mkdir( - tpl->path, repo_dir, dmode, mkdir_flags); - } - else if (!external_tpl) { - const char *content = tpl->content; - - if (opts->description && strcmp(tpl->path, GIT_DESC_FILE) == 0) - content = opts->description; - - error = repo_write_template( - repo_dir, false, tpl->path, tpl->mode, false, content); - } - } - - return error; -} - -static int mkdir_parent(git_buf *buf, uint32_t mode, bool skip2) -{ - /* When making parent directories during repository initialization - * don't try to set gid or grant world write access - */ - return git_futils_mkdir( - buf->ptr, NULL, mode & ~(S_ISGID | 0002), - GIT_MKDIR_PATH | GIT_MKDIR_VERIFY_DIR | - (skip2 ? GIT_MKDIR_SKIP_LAST2 : GIT_MKDIR_SKIP_LAST)); -} - -static int repo_init_directories( - git_buf *repo_path, - git_buf *wd_path, - const char *given_repo, - git_repository_init_options *opts) -{ - int error = 0; - bool is_bare, add_dotgit, has_dotgit, natural_wd; - mode_t dirmode; - - /* There are three possible rules for what we are allowed to create: - * - MKPATH means anything we need - * - MKDIR means just the .git directory and its parent and the workdir - * - Neither means only the .git directory can be created - * - * There are 5 "segments" of path that we might need to deal with: - * 1. The .git directory - * 2. The parent of the .git directory - * 3. Everything above the parent of the .git directory - * 4. The working directory (often the same as #2) - * 5. Everything above the working directory (often the same as #3) - * - * For all directories created, we start with the init_mode value for - * permissions and then strip off bits in some cases: - * - * For MKPATH, we create #3 (and #5) paths without S_ISGID or S_IWOTH - * For MKPATH and MKDIR, we create #2 (and #4) without S_ISGID - * For all rules, we create #1 using the untouched init_mode - */ - - /* set up repo path */ - - is_bare = ((opts->flags & GIT_REPOSITORY_INIT_BARE) != 0); - - add_dotgit = - (opts->flags & GIT_REPOSITORY_INIT_NO_DOTGIT_DIR) == 0 && - !is_bare && - git__suffixcmp(given_repo, "/" DOT_GIT) != 0 && - git__suffixcmp(given_repo, "/" GIT_DIR) != 0; - - if (git_buf_joinpath(repo_path, given_repo, add_dotgit ? GIT_DIR : "") < 0) - return -1; - - has_dotgit = (git__suffixcmp(repo_path->ptr, "/" GIT_DIR) == 0); - if (has_dotgit) - opts->flags |= GIT_REPOSITORY_INIT__HAS_DOTGIT; - - /* set up workdir path */ - - if (!is_bare) { - if (opts->workdir_path) { - if (git_path_join_unrooted( - wd_path, opts->workdir_path, repo_path->ptr, NULL) < 0) - return -1; - } else if (has_dotgit) { - if (git_path_dirname_r(wd_path, repo_path->ptr) < 0) - return -1; - } else { - giterr_set(GITERR_REPOSITORY, "Cannot pick working directory" - " for non-bare repository that isn't a '.git' directory"); - return -1; - } - - if (git_path_to_dir(wd_path) < 0) - return -1; - } else { - git_buf_clear(wd_path); - } - - natural_wd = - has_dotgit && - wd_path->size > 0 && - wd_path->size + strlen(GIT_DIR) == repo_path->size && - memcmp(repo_path->ptr, wd_path->ptr, wd_path->size) == 0; - if (natural_wd) - opts->flags |= GIT_REPOSITORY_INIT__NATURAL_WD; - - /* create directories as needed / requested */ - - dirmode = pick_dir_mode(opts); - - if ((opts->flags & GIT_REPOSITORY_INIT_MKPATH) != 0) { - /* create path #5 */ - if (wd_path->size > 0 && - (error = mkdir_parent(wd_path, dirmode, false)) < 0) - return error; - - /* create path #3 (if not the same as #5) */ - if (!natural_wd && - (error = mkdir_parent(repo_path, dirmode, has_dotgit)) < 0) - return error; - } - - if ((opts->flags & GIT_REPOSITORY_INIT_MKDIR) != 0 || - (opts->flags & GIT_REPOSITORY_INIT_MKPATH) != 0) - { - /* create path #4 */ - if (wd_path->size > 0 && - (error = git_futils_mkdir( - wd_path->ptr, NULL, dirmode & ~S_ISGID, - GIT_MKDIR_VERIFY_DIR)) < 0) - return error; - - /* create path #2 (if not the same as #4) */ - if (!natural_wd && - (error = git_futils_mkdir( - repo_path->ptr, NULL, dirmode & ~S_ISGID, - GIT_MKDIR_VERIFY_DIR | GIT_MKDIR_SKIP_LAST)) < 0) - return error; - } - - if ((opts->flags & GIT_REPOSITORY_INIT_MKDIR) != 0 || - (opts->flags & GIT_REPOSITORY_INIT_MKPATH) != 0 || - has_dotgit) - { - /* create path #1 */ - error = git_futils_mkdir(repo_path->ptr, NULL, dirmode, - GIT_MKDIR_VERIFY_DIR | ((dirmode & S_ISGID) ? GIT_MKDIR_CHMOD : 0)); - } - - /* prettify both directories now that they are created */ - - if (!error) { - error = git_path_prettify_dir(repo_path, repo_path->ptr, NULL); - - if (!error && wd_path->size > 0) - error = git_path_prettify_dir(wd_path, wd_path->ptr, NULL); - } - - return error; -} - -static int repo_init_create_origin(git_repository *repo, const char *url) -{ - int error; - git_remote *remote; - - if (!(error = git_remote_create(&remote, repo, GIT_REMOTE_ORIGIN, url))) { - git_remote_free(remote); - } - - return error; -} - -int git_repository_init( - git_repository **repo_out, const char *path, unsigned is_bare) -{ - git_repository_init_options opts = GIT_REPOSITORY_INIT_OPTIONS_INIT; - - opts.flags = GIT_REPOSITORY_INIT_MKPATH; /* don't love this default */ - if (is_bare) - opts.flags |= GIT_REPOSITORY_INIT_BARE; - - return git_repository_init_ext(repo_out, path, &opts); -} - -int git_repository_init_ext( - git_repository **out, - const char *given_repo, - git_repository_init_options *opts) -{ - int error; - git_buf repo_path = GIT_BUF_INIT, wd_path = GIT_BUF_INIT; - const char *wd; - - assert(out && given_repo && opts); - - GITERR_CHECK_VERSION(opts, GIT_REPOSITORY_INIT_OPTIONS_VERSION, "git_repository_init_options"); - - error = repo_init_directories(&repo_path, &wd_path, given_repo, opts); - if (error < 0) - goto cleanup; - - wd = (opts->flags & GIT_REPOSITORY_INIT_BARE) ? NULL : git_buf_cstr(&wd_path); - if (valid_repository_path(&repo_path)) { - - if ((opts->flags & GIT_REPOSITORY_INIT_NO_REINIT) != 0) { - giterr_set(GITERR_REPOSITORY, - "Attempt to reinitialize '%s'", given_repo); - error = GIT_EEXISTS; - goto cleanup; - } - - opts->flags |= GIT_REPOSITORY_INIT__IS_REINIT; - - error = repo_init_config( - repo_path.ptr, wd, opts->flags, opts->mode); - - /* TODO: reinitialize the templates */ - } - else { - if (!(error = repo_init_structure( - repo_path.ptr, wd, opts)) && - !(error = repo_init_config( - repo_path.ptr, wd, opts->flags, opts->mode))) - error = repo_init_create_head( - repo_path.ptr, opts->initial_head); - } - if (error < 0) - goto cleanup; - - error = git_repository_open(out, repo_path.ptr); - - if (!error && opts->origin_url) - error = repo_init_create_origin(*out, opts->origin_url); - -cleanup: - git_buf_free(&repo_path); - git_buf_free(&wd_path); - - return error; -} - -int git_repository_head_detached(git_repository *repo) -{ - git_reference *ref; - git_odb *odb = NULL; - int exists; - - if (git_repository_odb__weakptr(&odb, repo) < 0) - return -1; - - if (git_reference_lookup(&ref, repo, GIT_HEAD_FILE) < 0) - return -1; - - if (git_reference_type(ref) == GIT_REF_SYMBOLIC) { - git_reference_free(ref); - return 0; - } - - exists = git_odb_exists(odb, git_reference_target(ref)); - - git_reference_free(ref); - return exists; -} - -int git_repository_head(git_reference **head_out, git_repository *repo) -{ - git_reference *head; - int error; - - if ((error = git_reference_lookup(&head, repo, GIT_HEAD_FILE)) < 0) - return error; - - if (git_reference_type(head) == GIT_REF_OID) { - *head_out = head; - return 0; - } - - error = git_reference_lookup_resolved(head_out, repo, git_reference_symbolic_target(head), -1); - git_reference_free(head); - - return error == GIT_ENOTFOUND ? GIT_EUNBORNBRANCH : error; -} - -int git_repository_head_unborn(git_repository *repo) -{ - git_reference *ref = NULL; - int error; - - error = git_repository_head(&ref, repo); - git_reference_free(ref); - - if (error == GIT_EUNBORNBRANCH) { - giterr_clear(); - return 1; - } - - if (error < 0) - return -1; - - return 0; -} - -static int at_least_one_cb(const char *refname, void *payload) -{ - GIT_UNUSED(refname); - GIT_UNUSED(payload); - return GIT_PASSTHROUGH; -} - -static int repo_contains_no_reference(git_repository *repo) -{ - int error = git_reference_foreach_name(repo, &at_least_one_cb, NULL); - - if (error == GIT_PASSTHROUGH) - return 0; - - if (!error) - return 1; - - return error; -} - -int git_repository_is_empty(git_repository *repo) -{ - git_reference *head = NULL; - int is_empty = 0; - - if (git_reference_lookup(&head, repo, GIT_HEAD_FILE) < 0) - return -1; - - if (git_reference_type(head) == GIT_REF_SYMBOLIC) - is_empty = - (strcmp(git_reference_symbolic_target(head), - GIT_REFS_HEADS_DIR "master") == 0) && - repo_contains_no_reference(repo); - - git_reference_free(head); - - return is_empty; -} - -const char *git_repository_path(git_repository *repo) -{ - assert(repo); - return repo->path_repository; -} - -const char *git_repository_workdir(git_repository *repo) -{ - assert(repo); - - if (repo->is_bare) - return NULL; - - return repo->workdir; -} - -int git_repository_set_workdir( - git_repository *repo, const char *workdir, int update_gitlink) -{ - int error = 0; - git_buf path = GIT_BUF_INIT; - - assert(repo && workdir); - - if (git_path_prettify_dir(&path, workdir, NULL) < 0) - return -1; - - if (repo->workdir && strcmp(repo->workdir, path.ptr) == 0) - return 0; - - if (update_gitlink) { - git_config *config; - - if (git_repository_config__weakptr(&config, repo) < 0) - return -1; - - error = repo_write_gitlink(path.ptr, git_repository_path(repo), false); - - /* passthrough error means gitlink is unnecessary */ - if (error == GIT_PASSTHROUGH) - error = git_config_delete_entry(config, "core.worktree"); - else if (!error) - error = git_config_set_string(config, "core.worktree", path.ptr); - - if (!error) - error = git_config_set_bool(config, "core.bare", false); - } - - if (!error) { - char *old_workdir = repo->workdir; - - repo->workdir = git_buf_detach(&path); - repo->is_bare = 0; - - git__free(old_workdir); - } - - return error; -} - -int git_repository_is_bare(git_repository *repo) -{ - assert(repo); - return repo->is_bare; -} - -int git_repository_set_bare(git_repository *repo) -{ - int error; - git_config *config; - - assert(repo); - - if (repo->is_bare) - return 0; - - if ((error = git_repository_config__weakptr(&config, repo)) < 0) - return error; - - if ((error = git_config_set_bool(config, "core.bare", true)) < 0) - return error; - - if ((error = git_config__update_entry(config, "core.worktree", NULL, true, true)) < 0) - return error; - - git__free(repo->workdir); - repo->workdir = NULL; - repo->is_bare = 1; - - return 0; -} - -int git_repository_head_tree(git_tree **tree, git_repository *repo) -{ - git_reference *head; - git_object *obj; - int error; - - if ((error = git_repository_head(&head, repo)) < 0) - return error; - - if ((error = git_reference_peel(&obj, head, GIT_OBJ_TREE)) < 0) - goto cleanup; - - *tree = (git_tree *)obj; - -cleanup: - git_reference_free(head); - return error; -} - -int git_repository__set_orig_head(git_repository *repo, const git_oid *orig_head) -{ - git_filebuf file = GIT_FILEBUF_INIT; - git_buf file_path = GIT_BUF_INIT; - char orig_head_str[GIT_OID_HEXSZ]; - int error = 0; - - git_oid_fmt(orig_head_str, orig_head); - - if ((error = git_buf_joinpath(&file_path, repo->path_repository, GIT_ORIG_HEAD_FILE)) == 0 && - (error = git_filebuf_open(&file, file_path.ptr, GIT_FILEBUF_FORCE, GIT_MERGE_FILE_MODE)) == 0 && - (error = git_filebuf_printf(&file, "%.*s\n", GIT_OID_HEXSZ, orig_head_str)) == 0) - error = git_filebuf_commit(&file); - - if (error < 0) - git_filebuf_cleanup(&file); - - git_buf_free(&file_path); - - return error; -} - -int git_repository_message(git_buf *out, git_repository *repo) -{ - git_buf path = GIT_BUF_INIT; - struct stat st; - int error; - - git_buf_sanitize(out); - - if (git_buf_joinpath(&path, repo->path_repository, GIT_MERGE_MSG_FILE) < 0) - return -1; - - if ((error = p_stat(git_buf_cstr(&path), &st)) < 0) { - if (errno == ENOENT) - error = GIT_ENOTFOUND; - giterr_set(GITERR_OS, "Could not access message file"); - } else { - error = git_futils_readbuffer(out, git_buf_cstr(&path)); - } - - git_buf_free(&path); - - return error; -} - -int git_repository_message_remove(git_repository *repo) -{ - git_buf path = GIT_BUF_INIT; - int error; - - if (git_buf_joinpath(&path, repo->path_repository, GIT_MERGE_MSG_FILE) < 0) - return -1; - - error = p_unlink(git_buf_cstr(&path)); - git_buf_free(&path); - - return error; -} - -int git_repository_hashfile( - git_oid *out, - git_repository *repo, - const char *path, - git_otype type, - const char *as_path) -{ - int error; - git_filter_list *fl = NULL; - git_file fd = -1; - git_off_t len; - git_buf full_path = GIT_BUF_INIT; - - assert(out && path && repo); /* as_path can be NULL */ - - /* At some point, it would be nice if repo could be NULL to just - * apply filter rules defined in system and global files, but for - * now that is not possible because git_filters_load() needs it. - */ - - error = git_path_join_unrooted( - &full_path, path, git_repository_workdir(repo), NULL); - if (error < 0) - return error; - - if (!as_path) - as_path = path; - - /* passing empty string for "as_path" indicated --no-filters */ - if (strlen(as_path) > 0) { - error = git_filter_list_load( - &fl, repo, NULL, as_path, - GIT_FILTER_TO_ODB, GIT_FILTER_DEFAULT); - if (error < 0) - return error; - } else { - error = 0; - } - - /* at this point, error is a count of the number of loaded filters */ - - fd = git_futils_open_ro(full_path.ptr); - if (fd < 0) { - error = fd; - goto cleanup; - } - - len = git_futils_filesize(fd); - if (len < 0) { - error = (int)len; - goto cleanup; - } - - if (!git__is_sizet(len)) { - giterr_set(GITERR_OS, "File size overflow for 32-bit systems"); - error = -1; - goto cleanup; - } - - error = git_odb__hashfd_filtered(out, fd, (size_t)len, type, fl); - -cleanup: - if (fd >= 0) - p_close(fd); - git_filter_list_free(fl); - git_buf_free(&full_path); - - return error; -} - -static int checkout_message(git_buf *out, git_reference *old, const char *new) -{ - git_buf_puts(out, "checkout: moving from "); - - if (git_reference_type(old) == GIT_REF_SYMBOLIC) - git_buf_puts(out, git_reference__shorthand(git_reference_symbolic_target(old))); - else - git_buf_puts(out, git_oid_tostr_s(git_reference_target(old))); - - git_buf_puts(out, " to "); - - if (git_reference__is_branch(new)) - git_buf_puts(out, git_reference__shorthand(new)); - else - git_buf_puts(out, new); - - if (git_buf_oom(out)) - return -1; - - return 0; -} - -int git_repository_set_head( - git_repository* repo, - const char* refname) -{ - git_reference *ref = NULL, *current = NULL, *new_head = NULL; - git_buf log_message = GIT_BUF_INIT; - int error; - - assert(repo && refname); - - if ((error = git_reference_lookup(¤t, repo, GIT_HEAD_FILE)) < 0) - return error; - - if ((error = checkout_message(&log_message, current, refname)) < 0) - goto cleanup; - - error = git_reference_lookup(&ref, repo, refname); - if (error < 0 && error != GIT_ENOTFOUND) - goto cleanup; - - if (!error) { - if (git_reference_is_branch(ref)) { - error = git_reference_symbolic_create(&new_head, repo, GIT_HEAD_FILE, - git_reference_name(ref), true, git_buf_cstr(&log_message)); - } else { - error = git_repository_set_head_detached(repo, git_reference_target(ref)); - } - } else if (git_reference__is_branch(refname)) { - error = git_reference_symbolic_create(&new_head, repo, GIT_HEAD_FILE, refname, - true, git_buf_cstr(&log_message)); - } - -cleanup: - git_buf_free(&log_message); - git_reference_free(current); - git_reference_free(ref); - git_reference_free(new_head); - return error; -} - -static int detach(git_repository *repo, const git_oid *id, const char *from) -{ - int error; - git_buf log_message = GIT_BUF_INIT; - git_object *object = NULL, *peeled = NULL; - git_reference *new_head = NULL, *current = NULL; - - assert(repo && id); - - if ((error = git_reference_lookup(¤t, repo, GIT_HEAD_FILE)) < 0) - return error; - - if ((error = git_object_lookup(&object, repo, id, GIT_OBJ_ANY)) < 0) - goto cleanup; - - if ((error = git_object_peel(&peeled, object, GIT_OBJ_COMMIT)) < 0) - goto cleanup; - - if (from == NULL) - from = git_oid_tostr_s(git_object_id(peeled)); - - if ((error = checkout_message(&log_message, current, from)) < 0) - goto cleanup; - - error = git_reference_create(&new_head, repo, GIT_HEAD_FILE, git_object_id(peeled), true, git_buf_cstr(&log_message)); - -cleanup: - git_buf_free(&log_message); - git_object_free(object); - git_object_free(peeled); - git_reference_free(current); - git_reference_free(new_head); - return error; -} - -int git_repository_set_head_detached( - git_repository* repo, - const git_oid* commitish) -{ - return detach(repo, commitish, NULL); -} - -int git_repository_set_head_detached_from_annotated( - git_repository *repo, - const git_annotated_commit *commitish) -{ - assert(repo && commitish); - - return detach(repo, git_annotated_commit_id(commitish), commitish->ref_name); -} - -int git_repository_detach_head(git_repository* repo) -{ - git_reference *old_head = NULL, *new_head = NULL, *current = NULL; - git_object *object = NULL; - git_buf log_message = GIT_BUF_INIT; - int error; - - assert(repo); - - if ((error = git_reference_lookup(¤t, repo, GIT_HEAD_FILE)) < 0) - return error; - - if ((error = git_repository_head(&old_head, repo)) < 0) - goto cleanup; - - if ((error = git_object_lookup(&object, repo, git_reference_target(old_head), GIT_OBJ_COMMIT)) < 0) - goto cleanup; - - if ((error = checkout_message(&log_message, current, git_oid_tostr_s(git_object_id(object)))) < 0) - goto cleanup; - - error = git_reference_create(&new_head, repo, GIT_HEAD_FILE, git_reference_target(old_head), - 1, git_buf_cstr(&log_message)); - -cleanup: - git_buf_free(&log_message); - git_object_free(object); - git_reference_free(old_head); - git_reference_free(new_head); - git_reference_free(current); - return error; -} - -/** - * Loosely ported from git.git - * https://github.com/git/git/blob/master/contrib/completion/git-prompt.sh#L198-289 - */ -int git_repository_state(git_repository *repo) -{ - git_buf repo_path = GIT_BUF_INIT; - int state = GIT_REPOSITORY_STATE_NONE; - - assert(repo); - - if (git_buf_puts(&repo_path, repo->path_repository) < 0) - return -1; - - if (git_path_contains_file(&repo_path, GIT_REBASE_MERGE_INTERACTIVE_FILE)) - state = GIT_REPOSITORY_STATE_REBASE_INTERACTIVE; - else if (git_path_contains_dir(&repo_path, GIT_REBASE_MERGE_DIR)) - state = GIT_REPOSITORY_STATE_REBASE_MERGE; - else if (git_path_contains_file(&repo_path, GIT_REBASE_APPLY_REBASING_FILE)) - state = GIT_REPOSITORY_STATE_REBASE; - else if (git_path_contains_file(&repo_path, GIT_REBASE_APPLY_APPLYING_FILE)) - state = GIT_REPOSITORY_STATE_APPLY_MAILBOX; - else if (git_path_contains_dir(&repo_path, GIT_REBASE_APPLY_DIR)) - state = GIT_REPOSITORY_STATE_APPLY_MAILBOX_OR_REBASE; - else if (git_path_contains_file(&repo_path, GIT_MERGE_HEAD_FILE)) - state = GIT_REPOSITORY_STATE_MERGE; - else if(git_path_contains_file(&repo_path, GIT_REVERT_HEAD_FILE)) - state = GIT_REPOSITORY_STATE_REVERT; - else if(git_path_contains_file(&repo_path, GIT_CHERRYPICK_HEAD_FILE)) - state = GIT_REPOSITORY_STATE_CHERRYPICK; - else if(git_path_contains_file(&repo_path, GIT_BISECT_LOG_FILE)) - state = GIT_REPOSITORY_STATE_BISECT; - - git_buf_free(&repo_path); - return state; -} - -int git_repository__cleanup_files( - git_repository *repo, const char *files[], size_t files_len) -{ - git_buf buf = GIT_BUF_INIT; - size_t i; - int error; - - for (error = 0, i = 0; !error && i < files_len; ++i) { - const char *path; - - if (git_buf_joinpath(&buf, repo->path_repository, files[i]) < 0) - return -1; - - path = git_buf_cstr(&buf); - - if (git_path_isfile(path)) { - error = p_unlink(path); - } else if (git_path_isdir(path)) { - error = git_futils_rmdir_r(path, NULL, - GIT_RMDIR_REMOVE_FILES | GIT_RMDIR_REMOVE_BLOCKERS); - } - - git_buf_clear(&buf); - } - - git_buf_free(&buf); - return error; -} - -static const char *state_files[] = { - GIT_MERGE_HEAD_FILE, - GIT_MERGE_MODE_FILE, - GIT_MERGE_MSG_FILE, - GIT_REVERT_HEAD_FILE, - GIT_CHERRYPICK_HEAD_FILE, - GIT_BISECT_LOG_FILE, - GIT_REBASE_MERGE_DIR, - GIT_REBASE_APPLY_DIR, -}; - -int git_repository_state_cleanup(git_repository *repo) -{ - assert(repo); - - return git_repository__cleanup_files(repo, state_files, ARRAY_SIZE(state_files)); -} - -int git_repository_is_shallow(git_repository *repo) -{ - git_buf path = GIT_BUF_INIT; - struct stat st; - int error; - - if ((error = git_buf_joinpath(&path, repo->path_repository, "shallow")) < 0) - return error; - - error = git_path_lstat(path.ptr, &st); - git_buf_free(&path); - - if (error == GIT_ENOTFOUND) { - giterr_clear(); - return 0; - } - - if (error < 0) - return error; - return st.st_size == 0 ? 0 : 1; -} - -int git_repository_init_init_options( - git_repository_init_options *opts, unsigned int version) -{ - GIT_INIT_STRUCTURE_FROM_TEMPLATE( - opts, version, git_repository_init_options, - GIT_REPOSITORY_INIT_OPTIONS_INIT); - return 0; -} - -int git_repository_ident(const char **name, const char **email, const git_repository *repo) -{ - *name = repo->ident_name; - *email = repo->ident_email; - - return 0; -} - -int git_repository_set_ident(git_repository *repo, const char *name, const char *email) -{ - char *tmp_name = NULL, *tmp_email = NULL; - - if (name) { - tmp_name = git__strdup(name); - GITERR_CHECK_ALLOC(tmp_name); - } - - if (email) { - tmp_email = git__strdup(email); - GITERR_CHECK_ALLOC(tmp_email); - } - - tmp_name = git__swap(repo->ident_name, tmp_name); - tmp_email = git__swap(repo->ident_email, tmp_email); - - git__free(tmp_name); - git__free(tmp_email); - - return 0; -} diff --git a/vendor/libgit2/src/repository.h b/vendor/libgit2/src/repository.h deleted file mode 100644 index fd679b4836..0000000000 --- a/vendor/libgit2/src/repository.h +++ /dev/null @@ -1,215 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_repository_h__ -#define INCLUDE_repository_h__ - -#include "git2/common.h" -#include "git2/oid.h" -#include "git2/odb.h" -#include "git2/repository.h" -#include "git2/object.h" -#include "git2/config.h" - -#include "array.h" -#include "cache.h" -#include "refs.h" -#include "buffer.h" -#include "object.h" -#include "attrcache.h" -#include "submodule.h" -#include "diff_driver.h" - -#define DOT_GIT ".git" -#define GIT_DIR DOT_GIT "/" -#define GIT_DIR_MODE 0755 -#define GIT_BARE_DIR_MODE 0777 - -/* Default DOS-compatible 8.3 "short name" for a git repository, "GIT~1" */ -#define GIT_DIR_SHORTNAME "GIT~1" - -/** Cvar cache identifiers */ -typedef enum { - GIT_CVAR_AUTO_CRLF = 0, /* core.autocrlf */ - GIT_CVAR_EOL, /* core.eol */ - GIT_CVAR_SYMLINKS, /* core.symlinks */ - GIT_CVAR_IGNORECASE, /* core.ignorecase */ - GIT_CVAR_FILEMODE, /* core.filemode */ - GIT_CVAR_IGNORESTAT, /* core.ignorestat */ - GIT_CVAR_TRUSTCTIME, /* core.trustctime */ - GIT_CVAR_ABBREV, /* core.abbrev */ - GIT_CVAR_PRECOMPOSE, /* core.precomposeunicode */ - GIT_CVAR_SAFE_CRLF, /* core.safecrlf */ - GIT_CVAR_LOGALLREFUPDATES, /* core.logallrefupdates */ - GIT_CVAR_PROTECTHFS, /* core.protectHFS */ - GIT_CVAR_PROTECTNTFS, /* core.protectNTFS */ - GIT_CVAR_CACHE_MAX -} git_cvar_cached; - -/** - * CVAR value enumerations - * - * These are the values that are actually stored in the cvar cache, instead - * of their string equivalents. These values are internal and symbolic; - * make sure that none of them is set to `-1`, since that is the unique - * identifier for "not cached" - */ -typedef enum { - /* The value hasn't been loaded from the cache yet */ - GIT_CVAR_NOT_CACHED = -1, - - /* core.safecrlf: false, 'fail', 'warn' */ - GIT_SAFE_CRLF_FALSE = 0, - GIT_SAFE_CRLF_FAIL = 1, - GIT_SAFE_CRLF_WARN = 2, - - /* core.autocrlf: false, true, 'input; */ - GIT_AUTO_CRLF_FALSE = 0, - GIT_AUTO_CRLF_TRUE = 1, - GIT_AUTO_CRLF_INPUT = 2, - GIT_AUTO_CRLF_DEFAULT = GIT_AUTO_CRLF_FALSE, - - /* core.eol: unset, 'crlf', 'lf', 'native' */ - GIT_EOL_UNSET = 0, - GIT_EOL_CRLF = 1, - GIT_EOL_LF = 2, -#ifdef GIT_WIN32 - GIT_EOL_NATIVE = GIT_EOL_CRLF, -#else - GIT_EOL_NATIVE = GIT_EOL_LF, -#endif - GIT_EOL_DEFAULT = GIT_EOL_NATIVE, - - /* core.symlinks: bool */ - GIT_SYMLINKS_DEFAULT = GIT_CVAR_TRUE, - /* core.ignorecase */ - GIT_IGNORECASE_DEFAULT = GIT_CVAR_FALSE, - /* core.filemode */ - GIT_FILEMODE_DEFAULT = GIT_CVAR_TRUE, - /* core.ignorestat */ - GIT_IGNORESTAT_DEFAULT = GIT_CVAR_FALSE, - /* core.trustctime */ - GIT_TRUSTCTIME_DEFAULT = GIT_CVAR_TRUE, - /* core.abbrev */ - GIT_ABBREV_DEFAULT = 7, - /* core.precomposeunicode */ - GIT_PRECOMPOSE_DEFAULT = GIT_CVAR_FALSE, - /* core.safecrlf */ - GIT_SAFE_CRLF_DEFAULT = GIT_CVAR_FALSE, - /* core.logallrefupdates */ - GIT_LOGALLREFUPDATES_UNSET = 2, - GIT_LOGALLREFUPDATES_DEFAULT = GIT_LOGALLREFUPDATES_UNSET, - /* core.protectHFS */ - GIT_PROTECTHFS_DEFAULT = GIT_CVAR_FALSE, - /* core.protectNTFS */ - GIT_PROTECTNTFS_DEFAULT = GIT_CVAR_FALSE, -} git_cvar_value; - -/* internal repository init flags */ -enum { - GIT_REPOSITORY_INIT__HAS_DOTGIT = (1u << 16), - GIT_REPOSITORY_INIT__NATURAL_WD = (1u << 17), - GIT_REPOSITORY_INIT__IS_REINIT = (1u << 18), -}; - -/** Internal structure for repository object */ -struct git_repository { - git_odb *_odb; - git_refdb *_refdb; - git_config *_config; - git_index *_index; - - git_cache objects; - git_attr_cache *attrcache; - git_diff_driver_registry *diff_drivers; - - char *path_repository; - char *path_gitlink; - char *workdir; - char *namespace; - - char *ident_name; - char *ident_email; - - git_array_t(git_buf) reserved_names; - - unsigned is_bare:1; - - unsigned int lru_counter; - - git_atomic attr_session_key; - - git_cvar_value cvar_cache[GIT_CVAR_CACHE_MAX]; -}; - -GIT_INLINE(git_attr_cache *) git_repository_attr_cache(git_repository *repo) -{ - return repo->attrcache; -} - -int git_repository_head_tree(git_tree **tree, git_repository *repo); - -/* - * Weak pointers to repository internals. - * - * The returned pointers do not need to be freed. Do not keep - * permanent references to these (i.e. between API calls), since they may - * become invalidated if the user replaces a repository internal. - */ -int git_repository_config__weakptr(git_config **out, git_repository *repo); -int git_repository_odb__weakptr(git_odb **out, git_repository *repo); -int git_repository_refdb__weakptr(git_refdb **out, git_repository *repo); -int git_repository_index__weakptr(git_index **out, git_repository *repo); - -/* - * CVAR cache - * - * Efficient access to the most used config variables of a repository. - * The cache is cleared every time the config backend is replaced. - */ -int git_repository__cvar(int *out, git_repository *repo, git_cvar_cached cvar); -void git_repository__cvar_cache_clear(git_repository *repo); - -GIT_INLINE(int) git_repository__ensure_not_bare( - git_repository *repo, - const char *operation_name) -{ - if (!git_repository_is_bare(repo)) - return 0; - - giterr_set( - GITERR_REPOSITORY, - "Cannot %s. This operation is not allowed against bare repositories.", - operation_name); - - return GIT_EBAREREPO; -} - -int git_repository__set_orig_head(git_repository *repo, const git_oid *orig_head); - -int git_repository__cleanup_files(git_repository *repo, const char *files[], size_t files_len); - -/* The default "reserved names" for a repository */ -extern git_buf git_repository__reserved_names_win32[]; -extern size_t git_repository__reserved_names_win32_len; - -extern git_buf git_repository__reserved_names_posix[]; -extern size_t git_repository__reserved_names_posix_len; - -/* - * Gets any "reserved names" in the repository. This will return paths - * that should not be allowed in the repository (like ".git") to avoid - * conflicting with the repository path, or with alternate mechanisms to - * the repository path (eg, "GIT~1"). Every attempt will be made to look - * up all possible reserved names - if there was a conflict for the shortname - * GIT~1, for example, this function will try to look up the alternate - * shortname. If that fails, this function returns false, but out and outlen - * will still be populated with good defaults. - */ -bool git_repository__reserved_names( - git_buf **out, size_t *outlen, git_repository *repo, bool include_ntfs); - -#endif diff --git a/vendor/libgit2/src/reset.c b/vendor/libgit2/src/reset.c deleted file mode 100644 index 0ffa51b66a..0000000000 --- a/vendor/libgit2/src/reset.c +++ /dev/null @@ -1,199 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#include "common.h" -#include "commit.h" -#include "tag.h" -#include "merge.h" -#include "diff.h" -#include "annotated_commit.h" -#include "git2/reset.h" -#include "git2/checkout.h" -#include "git2/merge.h" -#include "git2/refs.h" - -#define ERROR_MSG "Cannot perform reset" - -int git_reset_default( - git_repository *repo, - git_object *target, - git_strarray* pathspecs) -{ - git_object *commit = NULL; - git_tree *tree = NULL; - git_diff *diff = NULL; - git_diff_options opts = GIT_DIFF_OPTIONS_INIT; - size_t i, max_i; - git_index_entry entry; - int error; - git_index *index = NULL; - - assert(pathspecs != NULL && pathspecs->count > 0); - - memset(&entry, 0, sizeof(git_index_entry)); - - if ((error = git_repository_index(&index, repo)) < 0) - goto cleanup; - - if (target) { - if (git_object_owner(target) != repo) { - giterr_set(GITERR_OBJECT, - "%s_default - The given target does not belong to this repository.", ERROR_MSG); - return -1; - } - - if ((error = git_object_peel(&commit, target, GIT_OBJ_COMMIT)) < 0 || - (error = git_commit_tree(&tree, (git_commit *)commit)) < 0) - goto cleanup; - } - - opts.pathspec = *pathspecs; - opts.flags = GIT_DIFF_REVERSE; - - if ((error = git_diff_tree_to_index( - &diff, repo, tree, index, &opts)) < 0) - goto cleanup; - - for (i = 0, max_i = git_diff_num_deltas(diff); i < max_i; ++i) { - const git_diff_delta *delta = git_diff_get_delta(diff, i); - - assert(delta->status == GIT_DELTA_ADDED || - delta->status == GIT_DELTA_MODIFIED || - delta->status == GIT_DELTA_CONFLICTED || - delta->status == GIT_DELTA_DELETED); - - error = git_index_conflict_remove(index, delta->old_file.path); - if (error < 0) { - if (delta->status == GIT_DELTA_ADDED && error == GIT_ENOTFOUND) - giterr_clear(); - else - goto cleanup; - } - - if (delta->status == GIT_DELTA_DELETED) { - if ((error = git_index_remove(index, delta->old_file.path, 0)) < 0) - goto cleanup; - } else { - entry.mode = delta->new_file.mode; - git_oid_cpy(&entry.id, &delta->new_file.id); - entry.path = (char *)delta->new_file.path; - - if ((error = git_index_add(index, &entry)) < 0) - goto cleanup; - } - } - - error = git_index_write(index); - -cleanup: - git_object_free(commit); - git_tree_free(tree); - git_index_free(index); - git_diff_free(diff); - - return error; -} - -static int reset( - git_repository *repo, - git_object *target, - const char *to, - git_reset_t reset_type, - const git_checkout_options *checkout_opts) -{ - git_object *commit = NULL; - git_index *index = NULL; - git_tree *tree = NULL; - int error = 0; - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - git_buf log_message = GIT_BUF_INIT; - - assert(repo && target); - - if (checkout_opts) - opts = *checkout_opts; - - if (git_object_owner(target) != repo) { - giterr_set(GITERR_OBJECT, - "%s - The given target does not belong to this repository.", ERROR_MSG); - return -1; - } - - if (reset_type != GIT_RESET_SOFT && - (error = git_repository__ensure_not_bare(repo, - reset_type == GIT_RESET_MIXED ? "reset mixed" : "reset hard")) < 0) - return error; - - if ((error = git_object_peel(&commit, target, GIT_OBJ_COMMIT)) < 0 || - (error = git_repository_index(&index, repo)) < 0 || - (error = git_commit_tree(&tree, (git_commit *)commit)) < 0) - goto cleanup; - - if (reset_type == GIT_RESET_SOFT && - (git_repository_state(repo) == GIT_REPOSITORY_STATE_MERGE || - git_index_has_conflicts(index))) - { - giterr_set(GITERR_OBJECT, "%s (soft) in the middle of a merge.", ERROR_MSG); - error = GIT_EUNMERGED; - goto cleanup; - } - - if ((error = git_buf_printf(&log_message, "reset: moving to %s", to)) < 0) - return error; - - /* move HEAD to the new target */ - if ((error = git_reference__update_terminal(repo, GIT_HEAD_FILE, - git_object_id(commit), NULL, git_buf_cstr(&log_message))) < 0) - goto cleanup; - - if (reset_type == GIT_RESET_HARD) { - /* overwrite working directory with HEAD */ - opts.checkout_strategy = GIT_CHECKOUT_FORCE; - - if ((error = git_checkout_tree(repo, (git_object *)tree, &opts)) < 0) - goto cleanup; - } - - if (reset_type > GIT_RESET_SOFT) { - /* reset index to the target content */ - - if ((error = git_index_read_tree(index, tree)) < 0 || - (error = git_index_write(index)) < 0) - goto cleanup; - - if ((error = git_repository_state_cleanup(repo)) < 0) { - giterr_set(GITERR_INDEX, "%s - failed to clean up merge data", ERROR_MSG); - goto cleanup; - } - } - -cleanup: - git_object_free(commit); - git_index_free(index); - git_tree_free(tree); - git_buf_free(&log_message); - - return error; -} - -int git_reset( - git_repository *repo, - git_object *target, - git_reset_t reset_type, - const git_checkout_options *checkout_opts) -{ - return reset(repo, target, git_oid_tostr_s(git_object_id(target)), reset_type, checkout_opts); -} - -int git_reset_from_annotated( - git_repository *repo, - git_annotated_commit *commit, - git_reset_t reset_type, - const git_checkout_options *checkout_opts) -{ - return reset(repo, (git_object *) commit->commit, commit->ref_name, reset_type, checkout_opts); -} diff --git a/vendor/libgit2/src/revert.c b/vendor/libgit2/src/revert.c deleted file mode 100644 index c481e7dea3..0000000000 --- a/vendor/libgit2/src/revert.c +++ /dev/null @@ -1,231 +0,0 @@ -/* -* Copyright (C) the libgit2 contributors. All rights reserved. -* -* This file is part of libgit2, distributed under the GNU GPL v2 with -* a Linking Exception. For full terms see the included COPYING file. -*/ - -#include "common.h" -#include "repository.h" -#include "filebuf.h" -#include "merge.h" -#include "index.h" - -#include "git2/types.h" -#include "git2/merge.h" -#include "git2/revert.h" -#include "git2/commit.h" -#include "git2/sys/commit.h" - -#define GIT_REVERT_FILE_MODE 0666 - -static int write_revert_head( - git_repository *repo, - const char *commit_oidstr) -{ - git_filebuf file = GIT_FILEBUF_INIT; - git_buf file_path = GIT_BUF_INIT; - int error = 0; - - if ((error = git_buf_joinpath(&file_path, repo->path_repository, GIT_REVERT_HEAD_FILE)) >= 0 && - (error = git_filebuf_open(&file, file_path.ptr, GIT_FILEBUF_FORCE, GIT_REVERT_FILE_MODE)) >= 0 && - (error = git_filebuf_printf(&file, "%s\n", commit_oidstr)) >= 0) - error = git_filebuf_commit(&file); - - if (error < 0) - git_filebuf_cleanup(&file); - - git_buf_free(&file_path); - - return error; -} - -static int write_merge_msg( - git_repository *repo, - const char *commit_oidstr, - const char *commit_msgline) -{ - git_filebuf file = GIT_FILEBUF_INIT; - git_buf file_path = GIT_BUF_INIT; - int error = 0; - - if ((error = git_buf_joinpath(&file_path, repo->path_repository, GIT_MERGE_MSG_FILE)) < 0 || - (error = git_filebuf_open(&file, file_path.ptr, GIT_FILEBUF_FORCE, GIT_REVERT_FILE_MODE)) < 0 || - (error = git_filebuf_printf(&file, "Revert \"%s\"\n\nThis reverts commit %s.\n", - commit_msgline, commit_oidstr)) < 0) - goto cleanup; - - error = git_filebuf_commit(&file); - -cleanup: - if (error < 0) - git_filebuf_cleanup(&file); - - git_buf_free(&file_path); - - return error; -} - -static int revert_normalize_opts( - git_repository *repo, - git_revert_options *opts, - const git_revert_options *given, - const char *their_label) -{ - int error = 0; - unsigned int default_checkout_strategy = GIT_CHECKOUT_SAFE | - GIT_CHECKOUT_ALLOW_CONFLICTS; - - GIT_UNUSED(repo); - - if (given != NULL) - memcpy(opts, given, sizeof(git_revert_options)); - else { - git_revert_options default_opts = GIT_REVERT_OPTIONS_INIT; - memcpy(opts, &default_opts, sizeof(git_revert_options)); - } - - if (!opts->checkout_opts.checkout_strategy) - opts->checkout_opts.checkout_strategy = default_checkout_strategy; - - if (!opts->checkout_opts.our_label) - opts->checkout_opts.our_label = "HEAD"; - - if (!opts->checkout_opts.their_label) - opts->checkout_opts.their_label = their_label; - - return error; -} - -static int revert_state_cleanup(git_repository *repo) -{ - const char *state_files[] = { GIT_REVERT_HEAD_FILE, GIT_MERGE_MSG_FILE }; - - return git_repository__cleanup_files(repo, state_files, ARRAY_SIZE(state_files)); -} - -static int revert_seterr(git_commit *commit, const char *fmt) -{ - char commit_oidstr[GIT_OID_HEXSZ + 1]; - - git_oid_fmt(commit_oidstr, git_commit_id(commit)); - commit_oidstr[GIT_OID_HEXSZ] = '\0'; - - giterr_set(GITERR_REVERT, fmt, commit_oidstr); - - return -1; -} - -int git_revert_commit( - git_index **out, - git_repository *repo, - git_commit *revert_commit, - git_commit *our_commit, - unsigned int mainline, - const git_merge_options *merge_opts) -{ - git_commit *parent_commit = NULL; - git_tree *parent_tree = NULL, *our_tree = NULL, *revert_tree = NULL; - int parent = 0, error = 0; - - assert(out && repo && revert_commit && our_commit); - - if (git_commit_parentcount(revert_commit) > 1) { - if (!mainline) - return revert_seterr(revert_commit, - "Mainline branch is not specified but %s is a merge commit"); - - parent = mainline; - } else { - if (mainline) - return revert_seterr(revert_commit, - "Mainline branch specified but %s is not a merge commit"); - - parent = git_commit_parentcount(revert_commit); - } - - if (parent && - ((error = git_commit_parent(&parent_commit, revert_commit, (parent - 1))) < 0 || - (error = git_commit_tree(&parent_tree, parent_commit)) < 0)) - goto done; - - if ((error = git_commit_tree(&revert_tree, revert_commit)) < 0 || - (error = git_commit_tree(&our_tree, our_commit)) < 0) - goto done; - - error = git_merge_trees(out, repo, revert_tree, our_tree, parent_tree, merge_opts); - -done: - git_tree_free(parent_tree); - git_tree_free(our_tree); - git_tree_free(revert_tree); - git_commit_free(parent_commit); - - return error; -} - -int git_revert( - git_repository *repo, - git_commit *commit, - const git_revert_options *given_opts) -{ - git_revert_options opts; - git_reference *our_ref = NULL; - git_commit *our_commit = NULL; - char commit_oidstr[GIT_OID_HEXSZ + 1]; - const char *commit_msg; - git_buf their_label = GIT_BUF_INIT; - git_index *index = NULL; - git_indexwriter indexwriter = GIT_INDEXWRITER_INIT; - int error; - - assert(repo && commit); - - GITERR_CHECK_VERSION(given_opts, GIT_REVERT_OPTIONS_VERSION, "git_revert_options"); - - if ((error = git_repository__ensure_not_bare(repo, "revert")) < 0) - return error; - - git_oid_fmt(commit_oidstr, git_commit_id(commit)); - commit_oidstr[GIT_OID_HEXSZ] = '\0'; - - if ((commit_msg = git_commit_summary(commit)) == NULL) { - error = -1; - goto on_error; - } - - if ((error = git_buf_printf(&their_label, "parent of %.7s... %s", commit_oidstr, commit_msg)) < 0 || - (error = revert_normalize_opts(repo, &opts, given_opts, git_buf_cstr(&their_label))) < 0 || - (error = git_indexwriter_init_for_operation(&indexwriter, repo, &opts.checkout_opts.checkout_strategy)) < 0 || - (error = write_revert_head(repo, commit_oidstr)) < 0 || - (error = write_merge_msg(repo, commit_oidstr, commit_msg)) < 0 || - (error = git_repository_head(&our_ref, repo)) < 0 || - (error = git_reference_peel((git_object **)&our_commit, our_ref, GIT_OBJ_COMMIT)) < 0 || - (error = git_revert_commit(&index, repo, commit, our_commit, opts.mainline, &opts.merge_opts)) < 0 || - (error = git_merge__check_result(repo, index)) < 0 || - (error = git_merge__append_conflicts_to_merge_msg(repo, index)) < 0 || - (error = git_checkout_index(repo, index, &opts.checkout_opts)) < 0 || - (error = git_indexwriter_commit(&indexwriter)) < 0) - goto on_error; - - goto done; - -on_error: - revert_state_cleanup(repo); - -done: - git_indexwriter_cleanup(&indexwriter); - git_index_free(index); - git_commit_free(our_commit); - git_reference_free(our_ref); - git_buf_free(&their_label); - - return error; -} - -int git_revert_init_options(git_revert_options *opts, unsigned int version) -{ - GIT_INIT_STRUCTURE_FROM_TEMPLATE( - opts, version, git_revert_options, GIT_REVERT_OPTIONS_INIT); - return 0; -} diff --git a/vendor/libgit2/src/revparse.c b/vendor/libgit2/src/revparse.c deleted file mode 100644 index e0ec3941d4..0000000000 --- a/vendor/libgit2/src/revparse.c +++ /dev/null @@ -1,913 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#include - -#include "common.h" -#include "buffer.h" -#include "tree.h" -#include "refdb.h" - -#include "git2.h" - -static int maybe_sha_or_abbrev(git_object** out, git_repository *repo, const char *spec, size_t speclen) -{ - git_oid oid; - - if (git_oid_fromstrn(&oid, spec, speclen) < 0) - return GIT_ENOTFOUND; - - return git_object_lookup_prefix(out, repo, &oid, speclen, GIT_OBJ_ANY); -} - -static int maybe_sha(git_object** out, git_repository *repo, const char *spec) -{ - size_t speclen = strlen(spec); - - if (speclen != GIT_OID_HEXSZ) - return GIT_ENOTFOUND; - - return maybe_sha_or_abbrev(out, repo, spec, speclen); -} - -static int maybe_abbrev(git_object** out, git_repository *repo, const char *spec) -{ - size_t speclen = strlen(spec); - - return maybe_sha_or_abbrev(out, repo, spec, speclen); -} - -static int build_regex(regex_t *regex, const char *pattern) -{ - int error; - - if (*pattern == '\0') { - giterr_set(GITERR_REGEX, "Empty pattern"); - return GIT_EINVALIDSPEC; - } - - error = regcomp(regex, pattern, REG_EXTENDED); - if (!error) - return 0; - - error = giterr_set_regex(regex, error); - - regfree(regex); - - return error; -} - -static int maybe_describe(git_object**out, git_repository *repo, const char *spec) -{ - const char *substr; - int error; - regex_t regex; - - substr = strstr(spec, "-g"); - - if (substr == NULL) - return GIT_ENOTFOUND; - - if (build_regex(®ex, ".+-[0-9]+-g[0-9a-fA-F]+") < 0) - return -1; - - error = regexec(®ex, spec, 0, NULL, 0); - regfree(®ex); - - if (error) - return GIT_ENOTFOUND; - - return maybe_abbrev(out, repo, substr+2); -} - -static int revparse_lookup_object( - git_object **object_out, - git_reference **reference_out, - git_repository *repo, - const char *spec) -{ - int error; - git_reference *ref; - - if ((error = maybe_sha(object_out, repo, spec)) != GIT_ENOTFOUND) - return error; - - error = git_reference_dwim(&ref, repo, spec); - if (!error) { - - error = git_object_lookup( - object_out, repo, git_reference_target(ref), GIT_OBJ_ANY); - - if (!error) - *reference_out = ref; - - return error; - } - - if (error != GIT_ENOTFOUND) - return error; - - if ((strlen(spec) < GIT_OID_HEXSZ) && - ((error = maybe_abbrev(object_out, repo, spec)) != GIT_ENOTFOUND)) - return error; - - if ((error = maybe_describe(object_out, repo, spec)) != GIT_ENOTFOUND) - return error; - - giterr_set(GITERR_REFERENCE, "Revspec '%s' not found.", spec); - return GIT_ENOTFOUND; -} - -static int try_parse_numeric(int *n, const char *curly_braces_content) -{ - int32_t content; - const char *end_ptr; - - if (git__strtol32(&content, curly_braces_content, &end_ptr, 10) < 0) - return -1; - - if (*end_ptr != '\0') - return -1; - - *n = (int)content; - return 0; -} - -static int retrieve_previously_checked_out_branch_or_revision(git_object **out, git_reference **base_ref, git_repository *repo, const char *identifier, size_t position) -{ - git_reference *ref = NULL; - git_reflog *reflog = NULL; - regex_t preg; - int error = -1; - size_t i, numentries, cur; - const git_reflog_entry *entry; - const char *msg; - regmatch_t regexmatches[2]; - git_buf buf = GIT_BUF_INIT; - - cur = position; - - if (*identifier != '\0' || *base_ref != NULL) - return GIT_EINVALIDSPEC; - - if (build_regex(&preg, "checkout: moving from (.*) to .*") < 0) - return -1; - - if (git_reference_lookup(&ref, repo, GIT_HEAD_FILE) < 0) - goto cleanup; - - if (git_reflog_read(&reflog, repo, GIT_HEAD_FILE) < 0) - goto cleanup; - - numentries = git_reflog_entrycount(reflog); - - for (i = 0; i < numentries; i++) { - entry = git_reflog_entry_byindex(reflog, i); - msg = git_reflog_entry_message(entry); - if (!msg) - continue; - - if (regexec(&preg, msg, 2, regexmatches, 0)) - continue; - - cur--; - - if (cur > 0) - continue; - - git_buf_put(&buf, msg+regexmatches[1].rm_so, regexmatches[1].rm_eo - regexmatches[1].rm_so); - - if ((error = git_reference_dwim(base_ref, repo, git_buf_cstr(&buf))) == 0) - goto cleanup; - - if (error < 0 && error != GIT_ENOTFOUND) - goto cleanup; - - error = maybe_abbrev(out, repo, git_buf_cstr(&buf)); - - goto cleanup; - } - - error = GIT_ENOTFOUND; - -cleanup: - git_reference_free(ref); - git_buf_free(&buf); - regfree(&preg); - git_reflog_free(reflog); - return error; -} - -static int retrieve_oid_from_reflog(git_oid *oid, git_reference *ref, size_t identifier) -{ - git_reflog *reflog; - size_t numentries; - const git_reflog_entry *entry; - bool search_by_pos = (identifier <= 100000000); - - if (git_reflog_read(&reflog, git_reference_owner(ref), git_reference_name(ref)) < 0) - return -1; - - numentries = git_reflog_entrycount(reflog); - - if (search_by_pos) { - if (numentries < identifier + 1) - goto notfound; - - entry = git_reflog_entry_byindex(reflog, identifier); - git_oid_cpy(oid, git_reflog_entry_id_new(entry)); - } else { - size_t i; - git_time commit_time; - - for (i = 0; i < numentries; i++) { - entry = git_reflog_entry_byindex(reflog, i); - commit_time = git_reflog_entry_committer(entry)->when; - - if (commit_time.time > (git_time_t)identifier) - continue; - - git_oid_cpy(oid, git_reflog_entry_id_new(entry)); - break; - } - - if (i == numentries) - goto notfound; - } - - git_reflog_free(reflog); - return 0; - -notfound: - giterr_set( - GITERR_REFERENCE, - "Reflog for '%s' has only %"PRIuZ" entries, asked for %"PRIuZ, - git_reference_name(ref), numentries, identifier); - - git_reflog_free(reflog); - return GIT_ENOTFOUND; -} - -static int retrieve_revobject_from_reflog(git_object **out, git_reference **base_ref, git_repository *repo, const char *identifier, size_t position) -{ - git_reference *ref; - git_oid oid; - int error = -1; - - if (*base_ref == NULL) { - if ((error = git_reference_dwim(&ref, repo, identifier)) < 0) - return error; - } else { - ref = *base_ref; - *base_ref = NULL; - } - - if (position == 0) { - error = git_object_lookup(out, repo, git_reference_target(ref), GIT_OBJ_ANY); - goto cleanup; - } - - if ((error = retrieve_oid_from_reflog(&oid, ref, position)) < 0) - goto cleanup; - - error = git_object_lookup(out, repo, &oid, GIT_OBJ_ANY); - -cleanup: - git_reference_free(ref); - return error; -} - -static int retrieve_remote_tracking_reference(git_reference **base_ref, const char *identifier, git_repository *repo) -{ - git_reference *tracking, *ref; - int error = -1; - - if (*base_ref == NULL) { - if ((error = git_reference_dwim(&ref, repo, identifier)) < 0) - return error; - } else { - ref = *base_ref; - *base_ref = NULL; - } - - if (!git_reference_is_branch(ref)) { - error = GIT_EINVALIDSPEC; - goto cleanup; - } - - if ((error = git_branch_upstream(&tracking, ref)) < 0) - goto cleanup; - - *base_ref = tracking; - -cleanup: - git_reference_free(ref); - return error; -} - -static int handle_at_syntax(git_object **out, git_reference **ref, const char *spec, size_t identifier_len, git_repository* repo, const char *curly_braces_content) -{ - bool is_numeric; - int parsed = 0, error = -1; - git_buf identifier = GIT_BUF_INIT; - git_time_t timestamp; - - assert(*out == NULL); - - if (git_buf_put(&identifier, spec, identifier_len) < 0) - return -1; - - is_numeric = !try_parse_numeric(&parsed, curly_braces_content); - - if (*curly_braces_content == '-' && (!is_numeric || parsed == 0)) { - error = GIT_EINVALIDSPEC; - goto cleanup; - } - - if (is_numeric) { - if (parsed < 0) - error = retrieve_previously_checked_out_branch_or_revision(out, ref, repo, git_buf_cstr(&identifier), -parsed); - else - error = retrieve_revobject_from_reflog(out, ref, repo, git_buf_cstr(&identifier), parsed); - - goto cleanup; - } - - if (!strcmp(curly_braces_content, "u") || !strcmp(curly_braces_content, "upstream")) { - error = retrieve_remote_tracking_reference(ref, git_buf_cstr(&identifier), repo); - - goto cleanup; - } - - if (git__date_parse(×tamp, curly_braces_content) < 0) - goto cleanup; - - error = retrieve_revobject_from_reflog(out, ref, repo, git_buf_cstr(&identifier), (size_t)timestamp); - -cleanup: - git_buf_free(&identifier); - return error; -} - -static git_otype parse_obj_type(const char *str) -{ - if (!strcmp(str, "commit")) - return GIT_OBJ_COMMIT; - - if (!strcmp(str, "tree")) - return GIT_OBJ_TREE; - - if (!strcmp(str, "blob")) - return GIT_OBJ_BLOB; - - if (!strcmp(str, "tag")) - return GIT_OBJ_TAG; - - return GIT_OBJ_BAD; -} - -static int dereference_to_non_tag(git_object **out, git_object *obj) -{ - if (git_object_type(obj) == GIT_OBJ_TAG) - return git_tag_peel(out, (git_tag *)obj); - - return git_object_dup(out, obj); -} - -static int handle_caret_parent_syntax(git_object **out, git_object *obj, int n) -{ - git_object *temp_commit = NULL; - int error; - - if ((error = git_object_peel(&temp_commit, obj, GIT_OBJ_COMMIT)) < 0) - return (error == GIT_EAMBIGUOUS || error == GIT_ENOTFOUND) ? - GIT_EINVALIDSPEC : error; - - if (n == 0) { - *out = temp_commit; - return 0; - } - - error = git_commit_parent((git_commit **)out, (git_commit*)temp_commit, n - 1); - - git_object_free(temp_commit); - return error; -} - -static int handle_linear_syntax(git_object **out, git_object *obj, int n) -{ - git_object *temp_commit = NULL; - int error; - - if ((error = git_object_peel(&temp_commit, obj, GIT_OBJ_COMMIT)) < 0) - return (error == GIT_EAMBIGUOUS || error == GIT_ENOTFOUND) ? - GIT_EINVALIDSPEC : error; - - error = git_commit_nth_gen_ancestor((git_commit **)out, (git_commit*)temp_commit, n); - - git_object_free(temp_commit); - return error; -} - -static int handle_colon_syntax( - git_object **out, - git_object *obj, - const char *path) -{ - git_object *tree; - int error = -1; - git_tree_entry *entry = NULL; - - if ((error = git_object_peel(&tree, obj, GIT_OBJ_TREE)) < 0) - return error == GIT_ENOTFOUND ? GIT_EINVALIDSPEC : error; - - if (*path == '\0') { - *out = tree; - return 0; - } - - /* - * TODO: Handle the relative path syntax - * (:./relative/path and :../relative/path) - */ - if ((error = git_tree_entry_bypath(&entry, (git_tree *)tree, path)) < 0) - goto cleanup; - - error = git_tree_entry_to_object(out, git_object_owner(tree), entry); - -cleanup: - git_tree_entry_free(entry); - git_object_free(tree); - - return error; -} - -static int walk_and_search(git_object **out, git_revwalk *walk, regex_t *regex) -{ - int error; - git_oid oid; - git_object *obj; - - while (!(error = git_revwalk_next(&oid, walk))) { - - error = git_object_lookup(&obj, git_revwalk_repository(walk), &oid, GIT_OBJ_COMMIT); - if ((error < 0) && (error != GIT_ENOTFOUND)) - return -1; - - if (!regexec(regex, git_commit_message((git_commit*)obj), 0, NULL, 0)) { - *out = obj; - return 0; - } - - git_object_free(obj); - } - - if (error < 0 && error == GIT_ITEROVER) - error = GIT_ENOTFOUND; - - return error; -} - -static int handle_grep_syntax(git_object **out, git_repository *repo, const git_oid *spec_oid, const char *pattern) -{ - regex_t preg; - git_revwalk *walk = NULL; - int error; - - if ((error = build_regex(&preg, pattern)) < 0) - return error; - - if ((error = git_revwalk_new(&walk, repo)) < 0) - goto cleanup; - - git_revwalk_sorting(walk, GIT_SORT_TIME); - - if (spec_oid == NULL) { - if ((error = git_revwalk_push_glob(walk, "refs/*")) < 0) - goto cleanup; - } else if ((error = git_revwalk_push(walk, spec_oid)) < 0) - goto cleanup; - - error = walk_and_search(out, walk, &preg); - -cleanup: - regfree(&preg); - git_revwalk_free(walk); - - return error; -} - -static int handle_caret_curly_syntax(git_object **out, git_object *obj, const char *curly_braces_content) -{ - git_otype expected_type; - - if (*curly_braces_content == '\0') - return dereference_to_non_tag(out, obj); - - if (*curly_braces_content == '/') - return handle_grep_syntax(out, git_object_owner(obj), git_object_id(obj), curly_braces_content + 1); - - expected_type = parse_obj_type(curly_braces_content); - - if (expected_type == GIT_OBJ_BAD) - return GIT_EINVALIDSPEC; - - return git_object_peel(out, obj, expected_type); -} - -static int extract_curly_braces_content(git_buf *buf, const char *spec, size_t *pos) -{ - git_buf_clear(buf); - - assert(spec[*pos] == '^' || spec[*pos] == '@'); - - (*pos)++; - - if (spec[*pos] == '\0' || spec[*pos] != '{') - return GIT_EINVALIDSPEC; - - (*pos)++; - - while (spec[*pos] != '}') { - if (spec[*pos] == '\0') - return GIT_EINVALIDSPEC; - - git_buf_putc(buf, spec[(*pos)++]); - } - - (*pos)++; - - return 0; -} - -static int extract_path(git_buf *buf, const char *spec, size_t *pos) -{ - git_buf_clear(buf); - - assert(spec[*pos] == ':'); - - (*pos)++; - - if (git_buf_puts(buf, spec + *pos) < 0) - return -1; - - *pos += git_buf_len(buf); - - return 0; -} - -static int extract_how_many(int *n, const char *spec, size_t *pos) -{ - const char *end_ptr; - int parsed, accumulated; - char kind = spec[*pos]; - - assert(spec[*pos] == '^' || spec[*pos] == '~'); - - accumulated = 0; - - do { - do { - (*pos)++; - accumulated++; - } while (spec[(*pos)] == kind && kind == '~'); - - if (git__isdigit(spec[*pos])) { - if (git__strtol32(&parsed, spec + *pos, &end_ptr, 10) < 0) - return GIT_EINVALIDSPEC; - - accumulated += (parsed - 1); - *pos = end_ptr - spec; - } - - } while (spec[(*pos)] == kind && kind == '~'); - - *n = accumulated; - - return 0; -} - -static int object_from_reference(git_object **object, git_reference *reference) -{ - git_reference *resolved = NULL; - int error; - - if (git_reference_resolve(&resolved, reference) < 0) - return -1; - - error = git_object_lookup(object, reference->db->repo, git_reference_target(resolved), GIT_OBJ_ANY); - git_reference_free(resolved); - - return error; -} - -static int ensure_base_rev_loaded(git_object **object, git_reference **reference, const char *spec, size_t identifier_len, git_repository *repo, bool allow_empty_identifier) -{ - int error; - git_buf identifier = GIT_BUF_INIT; - - if (*object != NULL) - return 0; - - if (*reference != NULL) - return object_from_reference(object, *reference); - - if (!allow_empty_identifier && identifier_len == 0) - return GIT_EINVALIDSPEC; - - if (git_buf_put(&identifier, spec, identifier_len) < 0) - return -1; - - error = revparse_lookup_object(object, reference, repo, git_buf_cstr(&identifier)); - git_buf_free(&identifier); - - return error; -} - -static int ensure_base_rev_is_not_known_yet(git_object *object) -{ - if (object == NULL) - return 0; - - return GIT_EINVALIDSPEC; -} - -static bool any_left_hand_identifier(git_object *object, git_reference *reference, size_t identifier_len) -{ - if (object != NULL) - return true; - - if (reference != NULL) - return true; - - if (identifier_len > 0) - return true; - - return false; -} - -static int ensure_left_hand_identifier_is_not_known_yet(git_object *object, git_reference *reference) -{ - if (!ensure_base_rev_is_not_known_yet(object) && reference == NULL) - return 0; - - return GIT_EINVALIDSPEC; -} - -int revparse__ext( - git_object **object_out, - git_reference **reference_out, - size_t *identifier_len_out, - git_repository *repo, - const char *spec) -{ - size_t pos = 0, identifier_len = 0; - int error = -1, n; - git_buf buf = GIT_BUF_INIT; - - git_reference *reference = NULL; - git_object *base_rev = NULL; - - bool should_return_reference = true; - - assert(object_out && reference_out && repo && spec); - - *object_out = NULL; - *reference_out = NULL; - - while (spec[pos]) { - switch (spec[pos]) { - case '^': - should_return_reference = false; - - if ((error = ensure_base_rev_loaded(&base_rev, &reference, spec, identifier_len, repo, false)) < 0) - goto cleanup; - - if (spec[pos+1] == '{') { - git_object *temp_object = NULL; - - if ((error = extract_curly_braces_content(&buf, spec, &pos)) < 0) - goto cleanup; - - if ((error = handle_caret_curly_syntax(&temp_object, base_rev, git_buf_cstr(&buf))) < 0) - goto cleanup; - - git_object_free(base_rev); - base_rev = temp_object; - } else { - git_object *temp_object = NULL; - - if ((error = extract_how_many(&n, spec, &pos)) < 0) - goto cleanup; - - if ((error = handle_caret_parent_syntax(&temp_object, base_rev, n)) < 0) - goto cleanup; - - git_object_free(base_rev); - base_rev = temp_object; - } - break; - - case '~': - { - git_object *temp_object = NULL; - - should_return_reference = false; - - if ((error = extract_how_many(&n, spec, &pos)) < 0) - goto cleanup; - - if ((error = ensure_base_rev_loaded(&base_rev, &reference, spec, identifier_len, repo, false)) < 0) - goto cleanup; - - if ((error = handle_linear_syntax(&temp_object, base_rev, n)) < 0) - goto cleanup; - - git_object_free(base_rev); - base_rev = temp_object; - break; - } - - case ':': - { - git_object *temp_object = NULL; - - should_return_reference = false; - - if ((error = extract_path(&buf, spec, &pos)) < 0) - goto cleanup; - - if (any_left_hand_identifier(base_rev, reference, identifier_len)) { - if ((error = ensure_base_rev_loaded(&base_rev, &reference, spec, identifier_len, repo, true)) < 0) - goto cleanup; - - if ((error = handle_colon_syntax(&temp_object, base_rev, git_buf_cstr(&buf))) < 0) - goto cleanup; - } else { - if (*git_buf_cstr(&buf) == '/') { - if ((error = handle_grep_syntax(&temp_object, repo, NULL, git_buf_cstr(&buf) + 1)) < 0) - goto cleanup; - } else { - - /* - * TODO: support merge-stage path lookup (":2:Makefile") - * and plain index blob lookup (:i-am/a/blob) - */ - giterr_set(GITERR_INVALID, "Unimplemented"); - error = GIT_ERROR; - goto cleanup; - } - } - - git_object_free(base_rev); - base_rev = temp_object; - break; - } - - case '@': - { - if (spec[pos+1] == '{') { - git_object *temp_object = NULL; - - if ((error = extract_curly_braces_content(&buf, spec, &pos)) < 0) - goto cleanup; - - if ((error = ensure_base_rev_is_not_known_yet(base_rev)) < 0) - goto cleanup; - - if ((error = handle_at_syntax(&temp_object, &reference, spec, identifier_len, repo, git_buf_cstr(&buf))) < 0) - goto cleanup; - - if (temp_object != NULL) - base_rev = temp_object; - break; - } else { - /* Fall through */ - } - } - - default: - if ((error = ensure_left_hand_identifier_is_not_known_yet(base_rev, reference)) < 0) - goto cleanup; - - pos++; - identifier_len++; - } - } - - if ((error = ensure_base_rev_loaded(&base_rev, &reference, spec, identifier_len, repo, false)) < 0) - goto cleanup; - - if (!should_return_reference) { - git_reference_free(reference); - reference = NULL; - } - - *object_out = base_rev; - *reference_out = reference; - *identifier_len_out = identifier_len; - error = 0; - -cleanup: - if (error) { - if (error == GIT_EINVALIDSPEC) - giterr_set(GITERR_INVALID, - "Failed to parse revision specifier - Invalid pattern '%s'", spec); - - git_object_free(base_rev); - git_reference_free(reference); - } - - git_buf_free(&buf); - return error; -} - -int git_revparse_ext( - git_object **object_out, - git_reference **reference_out, - git_repository *repo, - const char *spec) -{ - int error; - size_t identifier_len; - git_object *obj = NULL; - git_reference *ref = NULL; - - if ((error = revparse__ext(&obj, &ref, &identifier_len, repo, spec)) < 0) - goto cleanup; - - *object_out = obj; - *reference_out = ref; - GIT_UNUSED(identifier_len); - - return 0; - -cleanup: - git_object_free(obj); - git_reference_free(ref); - return error; -} - -int git_revparse_single(git_object **out, git_repository *repo, const char *spec) -{ - int error; - git_object *obj = NULL; - git_reference *ref = NULL; - - *out = NULL; - - if ((error = git_revparse_ext(&obj, &ref, repo, spec)) < 0) - goto cleanup; - - git_reference_free(ref); - - *out = obj; - - return 0; - -cleanup: - git_object_free(obj); - git_reference_free(ref); - return error; -} - -int git_revparse( - git_revspec *revspec, - git_repository *repo, - const char *spec) -{ - const char *dotdot; - int error = 0; - - assert(revspec && repo && spec); - - memset(revspec, 0x0, sizeof(*revspec)); - - if ((dotdot = strstr(spec, "..")) != NULL) { - char *lstr; - const char *rstr; - revspec->flags = GIT_REVPARSE_RANGE; - - lstr = git__substrdup(spec, dotdot - spec); - rstr = dotdot + 2; - if (dotdot[2] == '.') { - revspec->flags |= GIT_REVPARSE_MERGE_BASE; - rstr++; - } - - error = git_revparse_single(&revspec->from, repo, lstr); - if (!error) - error = git_revparse_single(&revspec->to, repo, rstr); - - git__free((void*)lstr); - } else { - revspec->flags = GIT_REVPARSE_SINGLE; - error = git_revparse_single(&revspec->from, repo, spec); - } - - return error; -} diff --git a/vendor/libgit2/src/revwalk.c b/vendor/libgit2/src/revwalk.c deleted file mode 100644 index dcdd97915a..0000000000 --- a/vendor/libgit2/src/revwalk.c +++ /dev/null @@ -1,672 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#include "common.h" -#include "commit.h" -#include "odb.h" -#include "pool.h" - -#include "revwalk.h" -#include "git2/revparse.h" -#include "merge.h" - -GIT__USE_OIDMAP - -git_commit_list_node *git_revwalk__commit_lookup( - git_revwalk *walk, const git_oid *oid) -{ - git_commit_list_node *commit; - khiter_t pos; - int ret; - - /* lookup and reserve space if not already present */ - pos = kh_get(oid, walk->commits, oid); - if (pos != kh_end(walk->commits)) - return kh_value(walk->commits, pos); - - commit = git_commit_list_alloc_node(walk); - if (commit == NULL) - return NULL; - - git_oid_cpy(&commit->oid, oid); - - pos = kh_put(oid, walk->commits, &commit->oid, &ret); - assert(ret != 0); - kh_value(walk->commits, pos) = commit; - - return commit; -} - -typedef git_array_t(git_commit_list_node*) commit_list_node_array; - -static bool interesting_arr(commit_list_node_array arr) -{ - git_commit_list_node **n; - size_t i = 0, size; - - size = git_array_size(arr); - for (i = 0; i < size; i++) { - n = git_array_get(arr, i); - if (!*n) - break; - - if (!(*n)->uninteresting) - return true; - } - - return false; -} - -static int mark_uninteresting(git_revwalk *walk, git_commit_list_node *commit) -{ - int error; - unsigned short i; - commit_list_node_array pending = GIT_ARRAY_INIT; - git_commit_list_node **tmp; - - assert(commit); - - do { - commit->uninteresting = 1; - - if ((error = git_commit_list_parse(walk, commit)) < 0) - return error; - - for (i = 0; i < commit->out_degree; ++i) - if (!commit->parents[i]->uninteresting) { - git_commit_list_node **node = git_array_alloc(pending); - GITERR_CHECK_ALLOC(node); - *node = commit->parents[i]; - } - - tmp = git_array_pop(pending); - commit = tmp ? *tmp : NULL; - - } while (commit != NULL && !interesting_arr(pending)); - - git_array_clear(pending); - - return 0; -} - -static int process_commit(git_revwalk *walk, git_commit_list_node *commit, int hide) -{ - int error; - - if (!hide && walk->hide_cb) - hide = walk->hide_cb(&commit->oid, walk->hide_cb_payload); - - if (hide && mark_uninteresting(walk, commit) < 0) - return -1; - - if (commit->seen) - return 0; - - commit->seen = 1; - - if ((error = git_commit_list_parse(walk, commit)) < 0) - return error; - - if (!hide) - return walk->enqueue(walk, commit); - - return 0; -} - -static int process_commit_parents(git_revwalk *walk, git_commit_list_node *commit) -{ - unsigned short i, max; - int error = 0; - - max = commit->out_degree; - if (walk->first_parent && commit->out_degree) - max = 1; - - for (i = 0; i < max && !error; ++i) - error = process_commit(walk, commit->parents[i], commit->uninteresting); - - return error; -} - -static int push_commit(git_revwalk *walk, const git_oid *oid, int uninteresting, int from_glob) -{ - git_oid commit_id; - int error; - git_object *obj, *oobj; - git_commit_list_node *commit; - git_commit_list *list; - - if ((error = git_object_lookup(&oobj, walk->repo, oid, GIT_OBJ_ANY)) < 0) - return error; - - error = git_object_peel(&obj, oobj, GIT_OBJ_COMMIT); - git_object_free(oobj); - - if (error == GIT_ENOTFOUND || error == GIT_EINVALIDSPEC || error == GIT_EPEEL) { - /* If this comes from e.g. push_glob("tags"), ignore this */ - if (from_glob) - return 0; - - giterr_set(GITERR_INVALID, "Object is not a committish"); - return -1; - } - if (error < 0) - return error; - - git_oid_cpy(&commit_id, git_object_id(obj)); - git_object_free(obj); - - commit = git_revwalk__commit_lookup(walk, &commit_id); - if (commit == NULL) - return -1; /* error already reported by failed lookup */ - - /* A previous hide already told us we don't want this commit */ - if (commit->uninteresting) - return 0; - - if (uninteresting) - walk->did_hide = 1; - else - walk->did_push = 1; - - commit->uninteresting = uninteresting; - list = walk->user_input; - if (git_commit_list_insert(commit, &list) == NULL) { - giterr_set_oom(); - return -1; - } - - walk->user_input = list; - - return 0; -} - -int git_revwalk_push(git_revwalk *walk, const git_oid *oid) -{ - assert(walk && oid); - return push_commit(walk, oid, 0, false); -} - - -int git_revwalk_hide(git_revwalk *walk, const git_oid *oid) -{ - assert(walk && oid); - return push_commit(walk, oid, 1, false); -} - -static int push_ref(git_revwalk *walk, const char *refname, int hide, int from_glob) -{ - git_oid oid; - - if (git_reference_name_to_id(&oid, walk->repo, refname) < 0) - return -1; - - return push_commit(walk, &oid, hide, from_glob); -} - -static int push_glob(git_revwalk *walk, const char *glob, int hide) -{ - int error = 0; - git_buf buf = GIT_BUF_INIT; - git_reference *ref; - git_reference_iterator *iter; - size_t wildcard; - - assert(walk && glob); - - /* refs/ is implied if not given in the glob */ - if (git__prefixcmp(glob, GIT_REFS_DIR) != 0) - git_buf_joinpath(&buf, GIT_REFS_DIR, glob); - else - git_buf_puts(&buf, glob); - if (git_buf_oom(&buf)) - return -1; - - /* If no '?', '*' or '[' exist, we append '/ *' to the glob */ - wildcard = strcspn(glob, "?*["); - if (!glob[wildcard]) - git_buf_put(&buf, "/*", 2); - - if ((error = git_reference_iterator_glob_new(&iter, walk->repo, buf.ptr)) < 0) - goto out; - - while ((error = git_reference_next(&ref, iter)) == 0) { - error = push_ref(walk, git_reference_name(ref), hide, true); - git_reference_free(ref); - if (error < 0) - break; - } - git_reference_iterator_free(iter); - - if (error == GIT_ITEROVER) - error = 0; -out: - git_buf_free(&buf); - return error; -} - -int git_revwalk_push_glob(git_revwalk *walk, const char *glob) -{ - assert(walk && glob); - return push_glob(walk, glob, 0); -} - -int git_revwalk_hide_glob(git_revwalk *walk, const char *glob) -{ - assert(walk && glob); - return push_glob(walk, glob, 1); -} - -int git_revwalk_push_head(git_revwalk *walk) -{ - assert(walk); - return push_ref(walk, GIT_HEAD_FILE, 0, false); -} - -int git_revwalk_hide_head(git_revwalk *walk) -{ - assert(walk); - return push_ref(walk, GIT_HEAD_FILE, 1, false); -} - -int git_revwalk_push_ref(git_revwalk *walk, const char *refname) -{ - assert(walk && refname); - return push_ref(walk, refname, 0, false); -} - -int git_revwalk_push_range(git_revwalk *walk, const char *range) -{ - git_revspec revspec; - int error = 0; - - if ((error = git_revparse(&revspec, walk->repo, range))) - return error; - - if (revspec.flags & GIT_REVPARSE_MERGE_BASE) { - /* TODO: support "..." */ - giterr_set(GITERR_INVALID, "Symmetric differences not implemented in revwalk"); - return GIT_EINVALIDSPEC; - } - - if ((error = push_commit(walk, git_object_id(revspec.from), 1, false))) - goto out; - - error = push_commit(walk, git_object_id(revspec.to), 0, false); - -out: - git_object_free(revspec.from); - git_object_free(revspec.to); - return error; -} - -int git_revwalk_hide_ref(git_revwalk *walk, const char *refname) -{ - assert(walk && refname); - return push_ref(walk, refname, 1, false); -} - -static int revwalk_enqueue_timesort(git_revwalk *walk, git_commit_list_node *commit) -{ - return git_pqueue_insert(&walk->iterator_time, commit); -} - -static int revwalk_enqueue_unsorted(git_revwalk *walk, git_commit_list_node *commit) -{ - return git_commit_list_insert(commit, &walk->iterator_rand) ? 0 : -1; -} - -static int revwalk_next_timesort(git_commit_list_node **object_out, git_revwalk *walk) -{ - int error; - git_commit_list_node *next; - - while ((next = git_pqueue_pop(&walk->iterator_time)) != NULL) - if (!next->uninteresting) { - if ((error = process_commit_parents(walk, next)) < 0) - return error; - - *object_out = next; - return 0; - } - - giterr_clear(); - return GIT_ITEROVER; -} - -static int revwalk_next_unsorted(git_commit_list_node **object_out, git_revwalk *walk) -{ - int error; - git_commit_list_node *next; - - while ((next = git_commit_list_pop(&walk->iterator_rand)) != NULL) - if (!next->uninteresting) { - if ((error = process_commit_parents(walk, next)) < 0) - return error; - - *object_out = next; - return 0; - } - - giterr_clear(); - return GIT_ITEROVER; -} - -static int revwalk_next_toposort(git_commit_list_node **object_out, git_revwalk *walk) -{ - git_commit_list_node *next; - unsigned short i, max; - - for (;;) { - next = git_commit_list_pop(&walk->iterator_topo); - if (next == NULL) { - giterr_clear(); - return GIT_ITEROVER; - } - - if (next->in_degree > 0) { - next->topo_delay = 1; - continue; - } - - - max = next->out_degree; - if (walk->first_parent && next->out_degree) - max = 1; - - for (i = 0; i < max; ++i) { - git_commit_list_node *parent = next->parents[i]; - - if (--parent->in_degree == 0 && parent->topo_delay) { - parent->topo_delay = 0; - if (git_commit_list_insert(parent, &walk->iterator_topo) == NULL) - return -1; - } - } - - *object_out = next; - return 0; - } -} - -static int revwalk_next_reverse(git_commit_list_node **object_out, git_revwalk *walk) -{ - *object_out = git_commit_list_pop(&walk->iterator_reverse); - return *object_out ? 0 : GIT_ITEROVER; -} - - -static int interesting(git_pqueue *list) -{ - size_t i; - - for (i = 0; i < git_pqueue_size(list); i++) { - git_commit_list_node *commit = git_pqueue_get(list, i); - if (!commit->uninteresting) - return 1; - } - - return 0; -} - -static int contains(git_pqueue *list, git_commit_list_node *node) -{ - size_t i; - - for (i = 0; i < git_pqueue_size(list); i++) { - git_commit_list_node *commit = git_pqueue_get(list, i); - if (commit == node) - return 1; - } - - return 0; -} - -static int premark_uninteresting(git_revwalk *walk) -{ - int error = 0; - unsigned short i; - git_pqueue q; - git_commit_list *list; - git_commit_list_node *commit, *parent; - - if ((error = git_pqueue_init(&q, 0, 8, git_commit_list_time_cmp)) < 0) - return error; - - for (list = walk->user_input; list; list = list->next) { - if ((error = git_commit_list_parse(walk, list->item)) < 0) - goto cleanup; - - if ((error = git_pqueue_insert(&q, list->item)) < 0) - goto cleanup; - } - - while (interesting(&q)) { - commit = git_pqueue_pop(&q); - - for (i = 0; i < commit->out_degree; i++) { - parent = commit->parents[i]; - - if ((error = git_commit_list_parse(walk, parent)) < 0) - goto cleanup; - - if (commit->uninteresting) - parent->uninteresting = 1; - - if (contains(&q, parent)) - continue; - - if ((error = git_pqueue_insert(&q, parent)) < 0) - goto cleanup; - } - } - -cleanup: - git_pqueue_free(&q); - return error; -} - -static int prepare_walk(git_revwalk *walk) -{ - int error; - git_commit_list *list; - git_commit_list_node *next; - - /* If there were no pushes, we know that the walk is already over */ - if (!walk->did_push) { - giterr_clear(); - return GIT_ITEROVER; - } - - if (walk->did_hide && (error = premark_uninteresting(walk)) < 0) - return error; - - for (list = walk->user_input; list; list = list->next) { - if (process_commit(walk, list->item, list->item->uninteresting) < 0) - return -1; - } - - - if (walk->sorting & GIT_SORT_TOPOLOGICAL) { - unsigned short i; - - while ((error = walk->get_next(&next, walk)) == 0) { - for (i = 0; i < next->out_degree; ++i) { - git_commit_list_node *parent = next->parents[i]; - parent->in_degree++; - } - - if (git_commit_list_insert(next, &walk->iterator_topo) == NULL) - return -1; - } - - if (error != GIT_ITEROVER) - return error; - - walk->get_next = &revwalk_next_toposort; - } - - if (walk->sorting & GIT_SORT_REVERSE) { - - while ((error = walk->get_next(&next, walk)) == 0) - if (git_commit_list_insert(next, &walk->iterator_reverse) == NULL) - return -1; - - if (error != GIT_ITEROVER) - return error; - - walk->get_next = &revwalk_next_reverse; - } - - walk->walking = 1; - return 0; -} - - -int git_revwalk_new(git_revwalk **revwalk_out, git_repository *repo) -{ - git_revwalk *walk = git__calloc(1, sizeof(git_revwalk)); - GITERR_CHECK_ALLOC(walk); - - walk->commits = git_oidmap_alloc(); - GITERR_CHECK_ALLOC(walk->commits); - - if (git_pqueue_init( - &walk->iterator_time, 0, 8, git_commit_list_time_cmp) < 0 || - git_pool_init(&walk->commit_pool, 1, - git_pool__suggest_items_per_page(COMMIT_ALLOC) * COMMIT_ALLOC) < 0) - return -1; - - walk->get_next = &revwalk_next_unsorted; - walk->enqueue = &revwalk_enqueue_unsorted; - - walk->repo = repo; - - if (git_repository_odb(&walk->odb, repo) < 0) { - git_revwalk_free(walk); - return -1; - } - - *revwalk_out = walk; - return 0; -} - -void git_revwalk_free(git_revwalk *walk) -{ - if (walk == NULL) - return; - - git_revwalk_reset(walk); - git_odb_free(walk->odb); - - git_oidmap_free(walk->commits); - git_pool_clear(&walk->commit_pool); - git_pqueue_free(&walk->iterator_time); - git__free(walk); -} - -git_repository *git_revwalk_repository(git_revwalk *walk) -{ - assert(walk); - return walk->repo; -} - -void git_revwalk_sorting(git_revwalk *walk, unsigned int sort_mode) -{ - assert(walk); - - if (walk->walking) - git_revwalk_reset(walk); - - walk->sorting = sort_mode; - - if (walk->sorting & GIT_SORT_TIME) { - walk->get_next = &revwalk_next_timesort; - walk->enqueue = &revwalk_enqueue_timesort; - } else { - walk->get_next = &revwalk_next_unsorted; - walk->enqueue = &revwalk_enqueue_unsorted; - } -} - -void git_revwalk_simplify_first_parent(git_revwalk *walk) -{ - walk->first_parent = 1; -} - -int git_revwalk_next(git_oid *oid, git_revwalk *walk) -{ - int error; - git_commit_list_node *next; - - assert(walk && oid); - - if (!walk->walking) { - if ((error = prepare_walk(walk)) < 0) - return error; - } - - error = walk->get_next(&next, walk); - - if (error == GIT_ITEROVER) { - git_revwalk_reset(walk); - giterr_clear(); - return GIT_ITEROVER; - } - - if (!error) - git_oid_cpy(oid, &next->oid); - - return error; -} - -void git_revwalk_reset(git_revwalk *walk) -{ - git_commit_list_node *commit; - - assert(walk); - - kh_foreach_value(walk->commits, commit, { - commit->seen = 0; - commit->in_degree = 0; - commit->topo_delay = 0; - commit->uninteresting = 0; - commit->flags = 0; - }); - - git_pqueue_clear(&walk->iterator_time); - git_commit_list_free(&walk->iterator_topo); - git_commit_list_free(&walk->iterator_rand); - git_commit_list_free(&walk->iterator_reverse); - git_commit_list_free(&walk->user_input); - walk->first_parent = 0; - walk->walking = 0; - walk->did_push = walk->did_hide = 0; -} - -int git_revwalk_add_hide_cb( - git_revwalk *walk, - git_revwalk_hide_cb hide_cb, - void *payload) -{ - assert(walk); - - if (walk->walking) - git_revwalk_reset(walk); - - if (walk->hide_cb) { - /* There is already a callback added */ - giterr_set(GITERR_INVALID, "There is already a callback added to hide commits in revision walker."); - return -1; - } - - walk->hide_cb = hide_cb; - walk->hide_cb_payload = payload; - - return 0; -} - diff --git a/vendor/libgit2/src/revwalk.h b/vendor/libgit2/src/revwalk.h deleted file mode 100644 index 6b363d40f5..0000000000 --- a/vendor/libgit2/src/revwalk.h +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_revwalk_h__ -#define INCLUDE_revwalk_h__ - -#include "git2/revwalk.h" -#include "oidmap.h" -#include "commit_list.h" -#include "pqueue.h" -#include "pool.h" -#include "vector.h" - -#include "oidmap.h" - -struct git_revwalk { - git_repository *repo; - git_odb *odb; - - git_oidmap *commits; - git_pool commit_pool; - - git_commit_list *iterator_topo; - git_commit_list *iterator_rand; - git_commit_list *iterator_reverse; - git_pqueue iterator_time; - - int (*get_next)(git_commit_list_node **, git_revwalk *); - int (*enqueue)(git_revwalk *, git_commit_list_node *); - - unsigned walking:1, - first_parent: 1, - did_hide: 1, - did_push: 1; - unsigned int sorting; - - /* the pushes and hides */ - git_commit_list *user_input; - - /* hide callback */ - git_revwalk_hide_cb hide_cb; - void *hide_cb_payload; -}; - -git_commit_list_node *git_revwalk__commit_lookup(git_revwalk *walk, const git_oid *oid); - -#endif diff --git a/vendor/libgit2/src/settings.c b/vendor/libgit2/src/settings.c deleted file mode 100644 index 2097ca3141..0000000000 --- a/vendor/libgit2/src/settings.c +++ /dev/null @@ -1,162 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#ifdef GIT_OPENSSL -# include -#endif - -#include -#include "common.h" -#include "sysdir.h" -#include "cache.h" -#include "global.h" - -void git_libgit2_version(int *major, int *minor, int *rev) -{ - *major = LIBGIT2_VER_MAJOR; - *minor = LIBGIT2_VER_MINOR; - *rev = LIBGIT2_VER_REVISION; -} - -int git_libgit2_features() -{ - return 0 -#ifdef GIT_THREADS - | GIT_FEATURE_THREADS -#endif -#if defined(GIT_OPENSSL) || defined(GIT_WINHTTP) || defined(GIT_SECURE_TRANSPORT) - | GIT_FEATURE_HTTPS -#endif -#if defined(GIT_SSH) - | GIT_FEATURE_SSH -#endif - ; -} - -/* Declarations for tuneable settings */ -extern size_t git_mwindow__window_size; -extern size_t git_mwindow__mapped_limit; - -static int config_level_to_sysdir(int config_level) -{ - int val = -1; - - switch (config_level) { - case GIT_CONFIG_LEVEL_SYSTEM: val = GIT_SYSDIR_SYSTEM; break; - case GIT_CONFIG_LEVEL_XDG: val = GIT_SYSDIR_XDG; break; - case GIT_CONFIG_LEVEL_GLOBAL: val = GIT_SYSDIR_GLOBAL; break; - default: - giterr_set( - GITERR_INVALID, "Invalid config path selector %d", config_level); - } - - return val; -} - -int git_libgit2_opts(int key, ...) -{ - int error = 0; - va_list ap; - - va_start(ap, key); - - switch (key) { - case GIT_OPT_SET_MWINDOW_SIZE: - git_mwindow__window_size = va_arg(ap, size_t); - break; - - case GIT_OPT_GET_MWINDOW_SIZE: - *(va_arg(ap, size_t *)) = git_mwindow__window_size; - break; - - case GIT_OPT_SET_MWINDOW_MAPPED_LIMIT: - git_mwindow__mapped_limit = va_arg(ap, size_t); - break; - - case GIT_OPT_GET_MWINDOW_MAPPED_LIMIT: - *(va_arg(ap, size_t *)) = git_mwindow__mapped_limit; - break; - - case GIT_OPT_GET_SEARCH_PATH: - if ((error = config_level_to_sysdir(va_arg(ap, int))) >= 0) { - git_buf *out = va_arg(ap, git_buf *); - const git_buf *tmp; - - git_buf_sanitize(out); - if ((error = git_sysdir_get(&tmp, error)) < 0) - break; - - error = git_buf_sets(out, tmp->ptr); - } - break; - - case GIT_OPT_SET_SEARCH_PATH: - if ((error = config_level_to_sysdir(va_arg(ap, int))) >= 0) - error = git_sysdir_set(error, va_arg(ap, const char *)); - break; - - case GIT_OPT_SET_CACHE_OBJECT_LIMIT: - { - git_otype type = (git_otype)va_arg(ap, int); - size_t size = va_arg(ap, size_t); - error = git_cache_set_max_object_size(type, size); - break; - } - - case GIT_OPT_SET_CACHE_MAX_SIZE: - git_cache__max_storage = va_arg(ap, ssize_t); - break; - - case GIT_OPT_ENABLE_CACHING: - git_cache__enabled = (va_arg(ap, int) != 0); - break; - - case GIT_OPT_GET_CACHED_MEMORY: - *(va_arg(ap, ssize_t *)) = git_cache__current_storage.val; - *(va_arg(ap, ssize_t *)) = git_cache__max_storage; - break; - - case GIT_OPT_GET_TEMPLATE_PATH: - { - git_buf *out = va_arg(ap, git_buf *); - const git_buf *tmp; - - git_buf_sanitize(out); - if ((error = git_sysdir_get(&tmp, GIT_SYSDIR_TEMPLATE)) < 0) - break; - - error = git_buf_sets(out, tmp->ptr); - } - break; - - case GIT_OPT_SET_TEMPLATE_PATH: - error = git_sysdir_set(GIT_SYSDIR_TEMPLATE, va_arg(ap, const char *)); - break; - - case GIT_OPT_SET_SSL_CERT_LOCATIONS: -#ifdef GIT_OPENSSL - { - const char *file = va_arg(ap, const char *); - const char *path = va_arg(ap, const char *); - if (!SSL_CTX_load_verify_locations(git__ssl_ctx, file, path)) { - giterr_set(GITERR_NET, "SSL error: %s", - ERR_error_string(ERR_get_error(), NULL)); - error = -1; - } - } -#else - giterr_set(GITERR_NET, "Cannot set certificate locations: OpenSSL is not enabled"); - error = -1; -#endif - break; - } - - va_end(ap); - - return error; -} - diff --git a/vendor/libgit2/src/sha1_lookup.c b/vendor/libgit2/src/sha1_lookup.c deleted file mode 100644 index c6b5613406..0000000000 --- a/vendor/libgit2/src/sha1_lookup.c +++ /dev/null @@ -1,249 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#include - -#include "sha1_lookup.h" -#include "common.h" -#include "oid.h" - -/* - * Conventional binary search loop looks like this: - * - * unsigned lo, hi; - * do { - * unsigned mi = (lo + hi) / 2; - * int cmp = "entry pointed at by mi" minus "target"; - * if (!cmp) - * return (mi is the wanted one) - * if (cmp > 0) - * hi = mi; "mi is larger than target" - * else - * lo = mi+1; "mi is smaller than target" - * } while (lo < hi); - * - * The invariants are: - * - * - When entering the loop, lo points at a slot that is never - * above the target (it could be at the target), hi points at a - * slot that is guaranteed to be above the target (it can never - * be at the target). - * - * - We find a point 'mi' between lo and hi (mi could be the same - * as lo, but never can be as same as hi), and check if it hits - * the target. There are three cases: - * - * - if it is a hit, we are happy. - * - * - if it is strictly higher than the target, we set it to hi, - * and repeat the search. - * - * - if it is strictly lower than the target, we update lo to - * one slot after it, because we allow lo to be at the target. - * - * If the loop exits, there is no matching entry. - * - * When choosing 'mi', we do not have to take the "middle" but - * anywhere in between lo and hi, as long as lo <= mi < hi is - * satisfied. When we somehow know that the distance between the - * target and lo is much shorter than the target and hi, we could - * pick mi that is much closer to lo than the midway. - * - * Now, we can take advantage of the fact that SHA-1 is a good hash - * function, and as long as there are enough entries in the table, we - * can expect uniform distribution. An entry that begins with for - * example "deadbeef..." is much likely to appear much later than in - * the midway of the table. It can reasonably be expected to be near - * 87% (222/256) from the top of the table. - * - * However, we do not want to pick "mi" too precisely. If the entry at - * the 87% in the above example turns out to be higher than the target - * we are looking for, we would end up narrowing the search space down - * only by 13%, instead of 50% we would get if we did a simple binary - * search. So we would want to hedge our bets by being less aggressive. - * - * The table at "table" holds at least "nr" entries of "elem_size" - * bytes each. Each entry has the SHA-1 key at "key_offset". The - * table is sorted by the SHA-1 key of the entries. The caller wants - * to find the entry with "key", and knows that the entry at "lo" is - * not higher than the entry it is looking for, and that the entry at - * "hi" is higher than the entry it is looking for. - */ -int sha1_entry_pos(const void *table, - size_t elem_size, - size_t key_offset, - unsigned lo, unsigned hi, unsigned nr, - const unsigned char *key) -{ - const unsigned char *base = (const unsigned char*)table; - const unsigned char *hi_key, *lo_key; - unsigned ofs_0; - - if (!nr || lo >= hi) - return -1; - - if (nr == hi) - hi_key = NULL; - else - hi_key = base + elem_size * hi + key_offset; - lo_key = base + elem_size * lo + key_offset; - - ofs_0 = 0; - do { - int cmp; - unsigned ofs, mi, range; - unsigned lov, hiv, kyv; - const unsigned char *mi_key; - - range = hi - lo; - if (hi_key) { - for (ofs = ofs_0; ofs < 20; ofs++) - if (lo_key[ofs] != hi_key[ofs]) - break; - ofs_0 = ofs; - /* - * byte 0 thru (ofs-1) are the same between - * lo and hi; ofs is the first byte that is - * different. - * - * If ofs==20, then no bytes are different, - * meaning we have entries with duplicate - * keys. We know that we are in a solid run - * of this entry (because the entries are - * sorted, and our lo and hi are the same, - * there can be nothing but this single key - * in between). So we can stop the search. - * Either one of these entries is it (and - * we do not care which), or we do not have - * it. - * - * Furthermore, we know that one of our - * endpoints must be the edge of the run of - * duplicates. For example, given this - * sequence: - * - * idx 0 1 2 3 4 5 - * key A C C C C D - * - * If we are searching for "B", we might - * hit the duplicate run at lo=1, hi=3 - * (e.g., by first mi=3, then mi=0). But we - * can never have lo > 1, because B < C. - * That is, if our key is less than the - * run, we know that "lo" is the edge, but - * we can say nothing of "hi". Similarly, - * if our key is greater than the run, we - * know that "hi" is the edge, but we can - * say nothing of "lo". - * - * Therefore if we do not find it, we also - * know where it would go if it did exist: - * just on the far side of the edge that we - * know about. - */ - if (ofs == 20) { - mi = lo; - mi_key = base + elem_size * mi + key_offset; - cmp = memcmp(mi_key, key, 20); - if (!cmp) - return mi; - if (cmp < 0) - return -1 - hi; - else - return -1 - lo; - } - - hiv = hi_key[ofs_0]; - if (ofs_0 < 19) - hiv = (hiv << 8) | hi_key[ofs_0+1]; - } else { - hiv = 256; - if (ofs_0 < 19) - hiv <<= 8; - } - lov = lo_key[ofs_0]; - kyv = key[ofs_0]; - if (ofs_0 < 19) { - lov = (lov << 8) | lo_key[ofs_0+1]; - kyv = (kyv << 8) | key[ofs_0+1]; - } - assert(lov < hiv); - - if (kyv < lov) - return -1 - lo; - if (hiv < kyv) - return -1 - hi; - - /* - * Even if we know the target is much closer to 'hi' - * than 'lo', if we pick too precisely and overshoot - * (e.g. when we know 'mi' is closer to 'hi' than to - * 'lo', pick 'mi' that is higher than the target), we - * end up narrowing the search space by a smaller - * amount (i.e. the distance between 'mi' and 'hi') - * than what we would have (i.e. about half of 'lo' - * and 'hi'). Hedge our bets to pick 'mi' less - * aggressively, i.e. make 'mi' a bit closer to the - * middle than we would otherwise pick. - */ - kyv = (kyv * 6 + lov + hiv) / 8; - if (lov < hiv - 1) { - if (kyv == lov) - kyv++; - else if (kyv == hiv) - kyv--; - } - mi = (range - 1) * (kyv - lov) / (hiv - lov) + lo; - -#ifdef INDEX_DEBUG_LOOKUP - printf("lo %u hi %u rg %u mi %u ", lo, hi, range, mi); - printf("ofs %u lov %x, hiv %x, kyv %x\n", - ofs_0, lov, hiv, kyv); -#endif - - if (!(lo <= mi && mi < hi)) { - giterr_set(GITERR_INVALID, "Assertion failure. Binary search invariant is false"); - return -1; - } - - mi_key = base + elem_size * mi + key_offset; - cmp = memcmp(mi_key + ofs_0, key + ofs_0, 20 - ofs_0); - if (!cmp) - return mi; - if (cmp > 0) { - hi = mi; - hi_key = mi_key; - } else { - lo = mi + 1; - lo_key = mi_key + elem_size; - } - } while (lo < hi); - return -((int)lo)-1; -} - -int sha1_position(const void *table, - size_t stride, - unsigned lo, unsigned hi, - const unsigned char *key) -{ - const unsigned char *base = table; - - do { - unsigned mi = (lo + hi) / 2; - int cmp = git_oid__hashcmp(base + mi * stride, key); - - if (!cmp) - return mi; - - if (cmp > 0) - hi = mi; - else - lo = mi+1; - } while (lo < hi); - - return -((int)lo)-1; -} diff --git a/vendor/libgit2/src/sha1_lookup.h b/vendor/libgit2/src/sha1_lookup.h deleted file mode 100644 index 3799620c7c..0000000000 --- a/vendor/libgit2/src/sha1_lookup.h +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_sha1_lookup_h__ -#define INCLUDE_sha1_lookup_h__ - -#include - -int sha1_entry_pos(const void *table, - size_t elem_size, - size_t key_offset, - unsigned lo, unsigned hi, unsigned nr, - const unsigned char *key); - -int sha1_position(const void *table, - size_t stride, - unsigned lo, unsigned hi, - const unsigned char *key); - -#endif diff --git a/vendor/libgit2/src/signature.c b/vendor/libgit2/src/signature.c deleted file mode 100644 index 818cd300ea..0000000000 --- a/vendor/libgit2/src/signature.c +++ /dev/null @@ -1,283 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#include "common.h" -#include "signature.h" -#include "repository.h" -#include "git2/common.h" -#include "posix.h" - -void git_signature_free(git_signature *sig) -{ - if (sig == NULL) - return; - - git__free(sig->name); - sig->name = NULL; - git__free(sig->email); - sig->email = NULL; - git__free(sig); -} - -static int signature_error(const char *msg) -{ - giterr_set(GITERR_INVALID, "Failed to parse signature - %s", msg); - return -1; -} - -static bool contains_angle_brackets(const char *input) -{ - return strchr(input, '<') != NULL || strchr(input, '>') != NULL; -} - -static char *extract_trimmed(const char *ptr, size_t len) -{ - while (len && git__isspace(ptr[0])) { - ptr++; len--; - } - - while (len && git__isspace(ptr[len - 1])) { - len--; - } - - return git__substrdup(ptr, len); -} - -int git_signature_new(git_signature **sig_out, const char *name, const char *email, git_time_t time, int offset) -{ - git_signature *p = NULL; - - assert(name && email); - - *sig_out = NULL; - - if (contains_angle_brackets(name) || - contains_angle_brackets(email)) { - return signature_error( - "Neither `name` nor `email` should contain angle brackets chars."); - } - - p = git__calloc(1, sizeof(git_signature)); - GITERR_CHECK_ALLOC(p); - - p->name = extract_trimmed(name, strlen(name)); - p->email = extract_trimmed(email, strlen(email)); - - if (p->name == NULL || p->email == NULL) - return -1; /* oom */ - - if (p->name[0] == '\0' || p->email[0] == '\0') { - git_signature_free(p); - return signature_error("Signature cannot have an empty name or email"); - } - - p->when.time = time; - p->when.offset = offset; - - *sig_out = p; - return 0; -} - -int git_signature_dup(git_signature **dest, const git_signature *source) -{ - git_signature *signature; - - if (source == NULL) - return 0; - - signature = git__calloc(1, sizeof(git_signature)); - GITERR_CHECK_ALLOC(signature); - - signature->name = git__strdup(source->name); - GITERR_CHECK_ALLOC(signature->name); - - signature->email = git__strdup(source->email); - GITERR_CHECK_ALLOC(signature->email); - - signature->when.time = source->when.time; - signature->when.offset = source->when.offset; - - *dest = signature; - - return 0; -} - -int git_signature__pdup(git_signature **dest, const git_signature *source, git_pool *pool) -{ - git_signature *signature; - - if (source == NULL) - return 0; - - signature = git_pool_mallocz(pool, sizeof(git_signature)); - GITERR_CHECK_ALLOC(signature); - - signature->name = git_pool_strdup(pool, source->name); - GITERR_CHECK_ALLOC(signature->name); - - signature->email = git_pool_strdup(pool, source->email); - GITERR_CHECK_ALLOC(signature->email); - - signature->when.time = source->when.time; - signature->when.offset = source->when.offset; - - *dest = signature; - - return 0; -} - -int git_signature_now(git_signature **sig_out, const char *name, const char *email) -{ - time_t now; - time_t offset; - struct tm *utc_tm; - git_signature *sig; - struct tm _utc; - - *sig_out = NULL; - - /* - * Get the current time as seconds since the epoch and - * transform that into a tm struct containing the time at - * UTC. Give that to mktime which considers it a local time - * (tm_isdst = -1 asks it to take DST into account) and gives - * us that time as seconds since the epoch. The difference - * between its return value and 'now' is our offset to UTC. - */ - time(&now); - utc_tm = p_gmtime_r(&now, &_utc); - utc_tm->tm_isdst = -1; - offset = (time_t)difftime(now, mktime(utc_tm)); - offset /= 60; - - if (git_signature_new(&sig, name, email, now, (int)offset) < 0) - return -1; - - *sig_out = sig; - - return 0; -} - -int git_signature_default(git_signature **out, git_repository *repo) -{ - int error; - git_config *cfg; - const char *user_name, *user_email; - - if ((error = git_repository_config_snapshot(&cfg, repo)) < 0) - return error; - - if (!(error = git_config_get_string(&user_name, cfg, "user.name")) && - !(error = git_config_get_string(&user_email, cfg, "user.email"))) - error = git_signature_now(out, user_name, user_email); - - git_config_free(cfg); - return error; -} - -int git_signature__parse(git_signature *sig, const char **buffer_out, - const char *buffer_end, const char *header, char ender) -{ - const char *buffer = *buffer_out; - const char *email_start, *email_end; - - memset(sig, 0, sizeof(git_signature)); - - if ((buffer_end = memchr(buffer, ender, buffer_end - buffer)) == NULL) - return signature_error("no newline given"); - - if (header) { - const size_t header_len = strlen(header); - - if (buffer + header_len >= buffer_end || memcmp(buffer, header, header_len) != 0) - return signature_error("expected prefix doesn't match actual"); - - buffer += header_len; - } - - email_start = git__memrchr(buffer, '<', buffer_end - buffer); - email_end = git__memrchr(buffer, '>', buffer_end - buffer); - - if (!email_start || !email_end || email_end <= email_start) - return signature_error("malformed e-mail"); - - email_start += 1; - sig->name = extract_trimmed(buffer, email_start - buffer - 1); - sig->email = extract_trimmed(email_start, email_end - email_start); - - /* Do we even have a time at the end of the signature? */ - if (email_end + 2 < buffer_end) { - const char *time_start = email_end + 2; - const char *time_end; - - if (git__strtol64(&sig->when.time, time_start, &time_end, 10) < 0) - return signature_error("invalid Unix timestamp"); - - /* do we have a timezone? */ - if (time_end + 1 < buffer_end) { - int offset, hours, mins; - const char *tz_start, *tz_end; - - tz_start = time_end + 1; - - if ((tz_start[0] != '-' && tz_start[0] != '+') || - git__strtol32(&offset, tz_start + 1, &tz_end, 10) < 0) { - //malformed timezone, just assume it's zero - offset = 0; - } - - hours = offset / 100; - mins = offset % 100; - - /* - * only store timezone if it's not overflowing; - * see http://www.worldtimezone.com/faq.html - */ - if (hours < 14 && mins < 59) { - sig->when.offset = (hours * 60) + mins; - if (tz_start[0] == '-') - sig->when.offset = -sig->when.offset; - } - } - } - - *buffer_out = buffer_end + 1; - return 0; -} - -void git_signature__writebuf(git_buf *buf, const char *header, const git_signature *sig) -{ - int offset, hours, mins; - char sign; - - assert(buf && sig); - - offset = sig->when.offset; - sign = (sig->when.offset < 0) ? '-' : '+'; - - if (offset < 0) - offset = -offset; - - hours = offset / 60; - mins = offset % 60; - - git_buf_printf(buf, "%s%s <%s> %u %c%02d%02d\n", - header ? header : "", sig->name, sig->email, - (unsigned)sig->when.time, sign, hours, mins); -} - -bool git_signature__equal(const git_signature *one, const git_signature *two) -{ - assert(one && two); - - return - git__strcmp(one->name, two->name) == 0 && - git__strcmp(one->email, two->email) == 0 && - one->when.time == two->when.time && - one->when.offset == two->when.offset; -} - diff --git a/vendor/libgit2/src/signature.h b/vendor/libgit2/src/signature.h deleted file mode 100644 index 75265df52f..0000000000 --- a/vendor/libgit2/src/signature.h +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_signature_h__ -#define INCLUDE_signature_h__ - -#include "git2/common.h" -#include "git2/signature.h" -#include "repository.h" -#include - -int git_signature__parse(git_signature *sig, const char **buffer_out, const char *buffer_end, const char *header, char ender); -void git_signature__writebuf(git_buf *buf, const char *header, const git_signature *sig); -bool git_signature__equal(const git_signature *one, const git_signature *two); - -int git_signature__pdup(git_signature **dest, const git_signature *source, git_pool *pool); - -#endif diff --git a/vendor/libgit2/src/socket_stream.c b/vendor/libgit2/src/socket_stream.c deleted file mode 100644 index 71f49118ed..0000000000 --- a/vendor/libgit2/src/socket_stream.c +++ /dev/null @@ -1,212 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#include "common.h" -#include "posix.h" -#include "netops.h" -#include "stream.h" -#include "socket_stream.h" - -#ifndef _WIN32 -# include -# include -# include -# include -# include -# include -# include -#else -# include -# include -# ifdef _MSC_VER -# pragma comment(lib, "ws2_32") -# endif -#endif - -#ifdef GIT_WIN32 -static void net_set_error(const char *str) -{ - int error = WSAGetLastError(); - char * win32_error = git_win32_get_error_message(error); - - if (win32_error) { - giterr_set(GITERR_NET, "%s: %s", str, win32_error); - git__free(win32_error); - } else { - giterr_set(GITERR_NET, str); - } -} -#else -static void net_set_error(const char *str) -{ - giterr_set(GITERR_NET, "%s: %s", str, strerror(errno)); -} -#endif - -static int close_socket(GIT_SOCKET s) -{ - if (s == INVALID_SOCKET) - return 0; - -#ifdef GIT_WIN32 - if (SOCKET_ERROR == closesocket(s)) - return -1; - - if (0 != WSACleanup()) { - giterr_set(GITERR_OS, "Winsock cleanup failed"); - return -1; - } - - return 0; -#else - return close(s); -#endif - -} - -int socket_connect(git_stream *stream) -{ - struct addrinfo *info = NULL, *p; - struct addrinfo hints; - git_socket_stream *st = (git_socket_stream *) stream; - GIT_SOCKET s = INVALID_SOCKET; - int ret; - -#ifdef GIT_WIN32 - /* on win32, the WSA context needs to be initialized - * before any socket calls can be performed */ - WSADATA wsd; - - if (WSAStartup(MAKEWORD(2,2), &wsd) != 0) { - giterr_set(GITERR_OS, "Winsock init failed"); - return -1; - } - - if (LOBYTE(wsd.wVersion) != 2 || HIBYTE(wsd.wVersion) != 2) { - WSACleanup(); - giterr_set(GITERR_OS, "Winsock init failed"); - return -1; - } -#endif - - memset(&hints, 0x0, sizeof(struct addrinfo)); - hints.ai_socktype = SOCK_STREAM; - hints.ai_family = AF_UNSPEC; - - if ((ret = p_getaddrinfo(st->host, st->port, &hints, &info)) != 0) { - giterr_set(GITERR_NET, - "Failed to resolve address for %s: %s", st->host, p_gai_strerror(ret)); - return -1; - } - - for (p = info; p != NULL; p = p->ai_next) { - s = socket(p->ai_family, p->ai_socktype, p->ai_protocol); - - if (s == INVALID_SOCKET) { - net_set_error("error creating socket"); - break; - } - - if (connect(s, p->ai_addr, (socklen_t)p->ai_addrlen) == 0) - break; - - /* If we can't connect, try the next one */ - close_socket(s); - s = INVALID_SOCKET; - } - - /* Oops, we couldn't connect to any address */ - if (s == INVALID_SOCKET && p == NULL) { - giterr_set(GITERR_OS, "Failed to connect to %s", st->host); - p_freeaddrinfo(info); - return -1; - } - - st->s = s; - p_freeaddrinfo(info); - return 0; -} - -ssize_t socket_write(git_stream *stream, const char *data, size_t len, int flags) -{ - ssize_t ret; - size_t off = 0; - git_socket_stream *st = (git_socket_stream *) stream; - - while (off < len) { - errno = 0; - ret = p_send(st->s, data + off, len - off, flags); - if (ret < 0) { - net_set_error("Error sending data"); - return -1; - } - - off += ret; - } - - return off; -} - -ssize_t socket_read(git_stream *stream, void *data, size_t len) -{ - ssize_t ret; - git_socket_stream *st = (git_socket_stream *) stream; - - if ((ret = p_recv(st->s, data, len, 0)) < 0) - net_set_error("Error receiving socket data"); - - return ret; -} - -int socket_close(git_stream *stream) -{ - git_socket_stream *st = (git_socket_stream *) stream; - int error; - - error = close_socket(st->s); - st->s = INVALID_SOCKET; - - return error; -} - -void socket_free(git_stream *stream) -{ - git_socket_stream *st = (git_socket_stream *) stream; - - git__free(st->host); - git__free(st->port); - git__free(st); -} - -int git_socket_stream_new(git_stream **out, const char *host, const char *port) -{ - git_socket_stream *st; - - assert(out && host); - - st = git__calloc(1, sizeof(git_socket_stream)); - GITERR_CHECK_ALLOC(st); - - st->host = git__strdup(host); - GITERR_CHECK_ALLOC(st->host); - - if (port) { - st->port = git__strdup(port); - GITERR_CHECK_ALLOC(st->port); - } - - st->parent.version = GIT_STREAM_VERSION; - st->parent.connect = socket_connect; - st->parent.write = socket_write; - st->parent.read = socket_read; - st->parent.close = socket_close; - st->parent.free = socket_free; - st->s = INVALID_SOCKET; - - *out = (git_stream *) st; - return 0; -} diff --git a/vendor/libgit2/src/socket_stream.h b/vendor/libgit2/src/socket_stream.h deleted file mode 100644 index 8e9949fcd8..0000000000 --- a/vendor/libgit2/src/socket_stream.h +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_socket_stream_h__ -#define INCLUDE_socket_stream_h__ - -#include "netops.h" - -typedef struct { - git_stream parent; - char *host; - char *port; - GIT_SOCKET s; -} git_socket_stream; - -extern int git_socket_stream_new(git_stream **out, const char *host, const char *port); - -#endif diff --git a/vendor/libgit2/src/sortedcache.c b/vendor/libgit2/src/sortedcache.c deleted file mode 100644 index 1151757243..0000000000 --- a/vendor/libgit2/src/sortedcache.c +++ /dev/null @@ -1,380 +0,0 @@ -#include "sortedcache.h" - -GIT__USE_STRMAP - -int git_sortedcache_new( - git_sortedcache **out, - size_t item_path_offset, - git_sortedcache_free_item_fn free_item, - void *free_item_payload, - git_vector_cmp item_cmp, - const char *path) -{ - git_sortedcache *sc; - size_t pathlen, alloclen; - - pathlen = path ? strlen(path) : 0; - - GITERR_CHECK_ALLOC_ADD(&alloclen, sizeof(git_sortedcache), pathlen); - GITERR_CHECK_ALLOC_ADD(&alloclen, alloclen, 1); - sc = git__calloc(1, alloclen); - GITERR_CHECK_ALLOC(sc); - - if (git_pool_init(&sc->pool, 1, 0) < 0 || - git_vector_init(&sc->items, 4, item_cmp) < 0 || - git_strmap_alloc(&sc->map) < 0) - goto fail; - - if (git_rwlock_init(&sc->lock)) { - giterr_set(GITERR_OS, "Failed to initialize lock"); - goto fail; - } - - sc->item_path_offset = item_path_offset; - sc->free_item = free_item; - sc->free_item_payload = free_item_payload; - GIT_REFCOUNT_INC(sc); - if (pathlen) - memcpy(sc->path, path, pathlen); - - *out = sc; - return 0; - -fail: - git_strmap_free(sc->map); - git_vector_free(&sc->items); - git_pool_clear(&sc->pool); - git__free(sc); - return -1; -} - -void git_sortedcache_incref(git_sortedcache *sc) -{ - GIT_REFCOUNT_INC(sc); -} - -const char *git_sortedcache_path(git_sortedcache *sc) -{ - return sc->path; -} - -static void sortedcache_clear(git_sortedcache *sc) -{ - git_strmap_clear(sc->map); - - if (sc->free_item) { - size_t i; - void *item; - - git_vector_foreach(&sc->items, i, item) { - sc->free_item(sc->free_item_payload, item); - } - } - - git_vector_clear(&sc->items); - - git_pool_clear(&sc->pool); -} - -static void sortedcache_free(git_sortedcache *sc) -{ - /* acquire write lock to make sure everyone else is done */ - if (git_sortedcache_wlock(sc) < 0) - return; - - sortedcache_clear(sc); - git_vector_free(&sc->items); - git_strmap_free(sc->map); - - git_sortedcache_wunlock(sc); - - git_rwlock_free(&sc->lock); - git__free(sc); -} - -void git_sortedcache_free(git_sortedcache *sc) -{ - if (!sc) - return; - GIT_REFCOUNT_DEC(sc, sortedcache_free); -} - -static int sortedcache_copy_item(void *payload, void *tgt_item, void *src_item) -{ - git_sortedcache *sc = payload; - /* path will already have been copied by upsert */ - memcpy(tgt_item, src_item, sc->item_path_offset); - return 0; -} - -/* copy a sorted cache */ -int git_sortedcache_copy( - git_sortedcache **out, - git_sortedcache *src, - bool lock, - int (*copy_item)(void *payload, void *tgt_item, void *src_item), - void *payload) -{ - int error = 0; - git_sortedcache *tgt; - size_t i; - void *src_item, *tgt_item; - - /* just use memcpy if no special copy fn is passed in */ - if (!copy_item) { - copy_item = sortedcache_copy_item; - payload = src; - } - - if ((error = git_sortedcache_new( - &tgt, src->item_path_offset, - src->free_item, src->free_item_payload, - src->items._cmp, src->path)) < 0) - return error; - - if (lock && git_sortedcache_rlock(src) < 0) { - git_sortedcache_free(tgt); - return -1; - } - - git_vector_foreach(&src->items, i, src_item) { - char *path = ((char *)src_item) + src->item_path_offset; - - if ((error = git_sortedcache_upsert(&tgt_item, tgt, path)) < 0 || - (error = copy_item(payload, tgt_item, src_item)) < 0) - break; - } - - if (lock) - git_sortedcache_runlock(src); - if (error) - git_sortedcache_free(tgt); - - *out = !error ? tgt : NULL; - - return error; -} - -/* lock sortedcache while making modifications */ -int git_sortedcache_wlock(git_sortedcache *sc) -{ - GIT_UNUSED(sc); /* prevent warning when compiled w/o threads */ - - if (git_rwlock_wrlock(&sc->lock) < 0) { - giterr_set(GITERR_OS, "Unable to acquire write lock on cache"); - return -1; - } - return 0; -} - -/* unlock sorted cache when done with modifications */ -void git_sortedcache_wunlock(git_sortedcache *sc) -{ - git_vector_sort(&sc->items); - git_rwlock_wrunlock(&sc->lock); -} - -/* lock sortedcache for read */ -int git_sortedcache_rlock(git_sortedcache *sc) -{ - GIT_UNUSED(sc); /* prevent warning when compiled w/o threads */ - - if (git_rwlock_rdlock(&sc->lock) < 0) { - giterr_set(GITERR_OS, "Unable to acquire read lock on cache"); - return -1; - } - return 0; -} - -/* unlock sorted cache when done reading */ -void git_sortedcache_runlock(git_sortedcache *sc) -{ - GIT_UNUSED(sc); /* prevent warning when compiled w/o threads */ - git_rwlock_rdunlock(&sc->lock); -} - -/* if the file has changed, lock cache and load file contents into buf; - * returns <0 on error, >0 if file has not changed - */ -int git_sortedcache_lockandload(git_sortedcache *sc, git_buf *buf) -{ - int error, fd; - - if ((error = git_sortedcache_wlock(sc)) < 0) - return error; - - if ((error = git_futils_filestamp_check(&sc->stamp, sc->path)) <= 0) - goto unlock; - - if (!git__is_sizet(sc->stamp.size)) { - giterr_set(GITERR_INVALID, "Unable to load file larger than size_t"); - error = -1; - goto unlock; - } - - if ((fd = git_futils_open_ro(sc->path)) < 0) { - error = fd; - goto unlock; - } - - if (buf) - error = git_futils_readbuffer_fd(buf, fd, (size_t)sc->stamp.size); - - (void)p_close(fd); - - if (error < 0) - goto unlock; - - return 1; /* return 1 -> file needs reload and was successfully loaded */ - -unlock: - git_sortedcache_wunlock(sc); - return error; -} - -void git_sortedcache_updated(git_sortedcache *sc) -{ - /* update filestamp to latest value */ - git_futils_filestamp_check(&sc->stamp, sc->path); -} - -/* release all items in sorted cache */ -int git_sortedcache_clear(git_sortedcache *sc, bool wlock) -{ - if (wlock && git_sortedcache_wlock(sc) < 0) - return -1; - - sortedcache_clear(sc); - - if (wlock) - git_sortedcache_wunlock(sc); - - return 0; -} - -/* find and/or insert item, returning pointer to item data */ -int git_sortedcache_upsert(void **out, git_sortedcache *sc, const char *key) -{ - int error = 0; - khiter_t pos; - void *item; - size_t keylen, itemlen; - char *item_key; - - pos = git_strmap_lookup_index(sc->map, key); - if (git_strmap_valid_index(sc->map, pos)) { - item = git_strmap_value_at(sc->map, pos); - goto done; - } - - keylen = strlen(key); - itemlen = sc->item_path_offset + keylen + 1; - itemlen = (itemlen + 7) & ~7; - - if ((item = git_pool_mallocz(&sc->pool, (uint32_t)itemlen)) == NULL) { - /* don't use GITERR_CHECK_ALLOC b/c of lock */ - error = -1; - goto done; - } - - /* one strange thing is that even if the vector or hash table insert - * fail, there is no way to free the pool item so we just abandon it - */ - - item_key = ((char *)item) + sc->item_path_offset; - memcpy(item_key, key, keylen); - - pos = kh_put(str, sc->map, item_key, &error); - if (error < 0) - goto done; - - if (!error) - kh_key(sc->map, pos) = item_key; - kh_val(sc->map, pos) = item; - - error = git_vector_insert(&sc->items, item); - if (error < 0) - git_strmap_delete_at(sc->map, pos); - -done: - if (out) - *out = !error ? item : NULL; - return error; -} - -/* lookup item by key */ -void *git_sortedcache_lookup(const git_sortedcache *sc, const char *key) -{ - khiter_t pos = git_strmap_lookup_index(sc->map, key); - if (git_strmap_valid_index(sc->map, pos)) - return git_strmap_value_at(sc->map, pos); - return NULL; -} - -/* find out how many items are in the cache */ -size_t git_sortedcache_entrycount(const git_sortedcache *sc) -{ - return git_vector_length(&sc->items); -} - -/* lookup item by index */ -void *git_sortedcache_entry(git_sortedcache *sc, size_t pos) -{ - /* make sure the items are sorted so this gets the correct item */ - if (!git_vector_is_sorted(&sc->items)) - git_vector_sort(&sc->items); - - return git_vector_get(&sc->items, pos); -} - -/* helper struct so bsearch callback can know offset + key value for cmp */ -struct sortedcache_magic_key { - size_t offset; - const char *key; -}; - -static int sortedcache_magic_cmp(const void *key, const void *value) -{ - const struct sortedcache_magic_key *magic = key; - const char *value_key = ((const char *)value) + magic->offset; - return strcmp(magic->key, value_key); -} - -/* lookup index of item by key */ -int git_sortedcache_lookup_index( - size_t *out, git_sortedcache *sc, const char *key) -{ - struct sortedcache_magic_key magic; - - magic.offset = sc->item_path_offset; - magic.key = key; - - return git_vector_bsearch2(out, &sc->items, sortedcache_magic_cmp, &magic); -} - -/* remove entry from cache */ -int git_sortedcache_remove(git_sortedcache *sc, size_t pos) -{ - char *item; - khiter_t mappos; - - /* because of pool allocation, this can't actually remove the item, - * but we can remove it from the items vector and the hash table. - */ - - if ((item = git_vector_get(&sc->items, pos)) == NULL) { - giterr_set(GITERR_INVALID, "Removing item out of range"); - return GIT_ENOTFOUND; - } - - (void)git_vector_remove(&sc->items, pos); - - mappos = git_strmap_lookup_index(sc->map, item + sc->item_path_offset); - git_strmap_delete_at(sc->map, mappos); - - if (sc->free_item) - sc->free_item(sc->free_item_payload, item); - - return 0; -} - diff --git a/vendor/libgit2/src/sortedcache.h b/vendor/libgit2/src/sortedcache.h deleted file mode 100644 index 4cacad62b8..0000000000 --- a/vendor/libgit2/src/sortedcache.h +++ /dev/null @@ -1,178 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_sorted_cache_h__ -#define INCLUDE_sorted_cache_h__ - -#include "util.h" -#include "fileops.h" -#include "vector.h" -#include "thread-utils.h" -#include "pool.h" -#include "strmap.h" - -#include - -/* - * The purpose of this data structure is to cache the parsed contents of a - * file (a.k.a. the backing file) where each item in the file can be - * identified by a key string and you want to both look them up by name - * and traverse them in sorted order. Each item is assumed to itself end - * in a GIT_FLEX_ARRAY. - */ - -typedef void (*git_sortedcache_free_item_fn)(void *payload, void *item); - -typedef struct { - git_refcount rc; - git_rwlock lock; - size_t item_path_offset; - git_sortedcache_free_item_fn free_item; - void *free_item_payload; - git_pool pool; - git_vector items; - git_strmap *map; - git_futils_filestamp stamp; - char path[GIT_FLEX_ARRAY]; -} git_sortedcache; - -/* Create a new sortedcache - * - * Even though every sortedcache stores items with a GIT_FLEX_ARRAY at - * the end containing their key string, you have to provide the item_cmp - * sorting function because the sorting function doesn't get a payload - * and therefore can't know the offset to the item key string. :-( - * - * @param out The allocated git_sortedcache - * @param item_path_offset Offset to the GIT_FLEX_ARRAY item key in the - * struct - use offsetof(struct mine, key-field) to get this - * @param free_item Optional callback to free each item - * @param free_item_payload Optional payload passed to free_item callback - * @param item_cmp Compare the keys of two items - * @param path The path to the backing store file for this cache; this - * may be NULL. The cache makes it easy to load this and check - * if it has been modified since the last load and/or write. - */ -int git_sortedcache_new( - git_sortedcache **out, - size_t item_path_offset, /* use offsetof(struct, path-field) macro */ - git_sortedcache_free_item_fn free_item, - void *free_item_payload, - git_vector_cmp item_cmp, - const char *path); - -/* Copy a sorted cache - * - * - `copy_item` can be NULL to just use memcpy - * - if `lock`, grabs read lock on `src` during copy and releases after - */ -int git_sortedcache_copy( - git_sortedcache **out, - git_sortedcache *src, - bool lock, - int (*copy_item)(void *payload, void *tgt_item, void *src_item), - void *payload); - -/* Free sorted cache (first calling `free_item` callbacks) - * - * Don't call on a locked collection - it may acquire a write lock - */ -void git_sortedcache_free(git_sortedcache *sc); - -/* Increment reference count - balance with call to free */ -void git_sortedcache_incref(git_sortedcache *sc); - -/* Get the pathname associated with this cache at creation time */ -const char *git_sortedcache_path(git_sortedcache *sc); - -/* - * CACHE WRITE FUNCTIONS - * - * The following functions require you to have a writer lock to make the - * modification. Some of the functions take a `wlock` parameter and - * will optionally lock and unlock for you if that is passed as true. - * - */ - -/* Lock sortedcache for write */ -int git_sortedcache_wlock(git_sortedcache *sc); - -/* Unlock sorted cache when done with write */ -void git_sortedcache_wunlock(git_sortedcache *sc); - -/* Lock cache and load backing file into a buffer. - * - * This grabs a write lock on the cache then looks at the modification - * time and size of the file on disk. - * - * If the file appears to have changed, this loads the file contents into - * the buffer and returns a positive value leaving the cache locked - the - * caller should parse the file content, update the cache as needed, then - * release the lock. NOTE: In this case, the caller MUST unlock the cache. - * - * If the file appears to be unchanged, then this automatically releases - * the lock on the cache, clears the buffer, and returns 0. - * - * @return 0 if up-to-date, 1 if out-of-date, <0 on error - */ -int git_sortedcache_lockandload(git_sortedcache *sc, git_buf *buf); - -/* Refresh file timestamp after write completes - * You should already be holding the write lock when you call this. - */ -void git_sortedcache_updated(git_sortedcache *sc); - -/* Release all items in sorted cache - * - * If `wlock` is true, grabs write lock and releases when done, otherwise - * you should already be holding a write lock when you call this. - */ -int git_sortedcache_clear(git_sortedcache *sc, bool wlock); - -/* Find and/or insert item, returning pointer to item data. - * You should already be holding the write lock when you call this. - */ -int git_sortedcache_upsert( - void **out, git_sortedcache *sc, const char *key); - -/* Removes entry at pos from cache - * You should already be holding the write lock when you call this. - */ -int git_sortedcache_remove(git_sortedcache *sc, size_t pos); - -/* - * CACHE READ FUNCTIONS - * - * The following functions access items in the cache. To prevent the - * results from being invalidated before they can be used, you should be - * holding either a read lock or a write lock when using these functions. - * - */ - -/* Lock sortedcache for read */ -int git_sortedcache_rlock(git_sortedcache *sc); - -/* Unlock sorted cache when done with read */ -void git_sortedcache_runlock(git_sortedcache *sc); - -/* Lookup item by key - returns NULL if not found */ -void *git_sortedcache_lookup(const git_sortedcache *sc, const char *key); - -/* Get how many items are in the cache - * - * You can call this function without holding a lock, but be aware - * that it may change before you use it. - */ -size_t git_sortedcache_entrycount(const git_sortedcache *sc); - -/* Lookup item by index - returns NULL if out of range */ -void *git_sortedcache_entry(git_sortedcache *sc, size_t pos); - -/* Lookup index of item by key - returns GIT_ENOTFOUND if not found */ -int git_sortedcache_lookup_index( - size_t *out, git_sortedcache *sc, const char *key); - -#endif diff --git a/vendor/libgit2/src/stash.c b/vendor/libgit2/src/stash.c deleted file mode 100644 index fcb1112acc..0000000000 --- a/vendor/libgit2/src/stash.c +++ /dev/null @@ -1,1074 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#include "common.h" -#include "repository.h" -#include "commit.h" -#include "message.h" -#include "tree.h" -#include "reflog.h" -#include "git2/diff.h" -#include "git2/stash.h" -#include "git2/status.h" -#include "git2/checkout.h" -#include "git2/index.h" -#include "git2/transaction.h" -#include "git2/merge.h" -#include "index.h" -#include "signature.h" -#include "iterator.h" -#include "merge.h" -#include "diff.h" - -static int create_error(int error, const char *msg) -{ - giterr_set(GITERR_STASH, "Cannot stash changes - %s", msg); - return error; -} - -static int retrieve_head(git_reference **out, git_repository *repo) -{ - int error = git_repository_head(out, repo); - - if (error == GIT_EUNBORNBRANCH) - return create_error(error, "You do not have the initial commit yet."); - - return error; -} - -static int append_abbreviated_oid(git_buf *out, const git_oid *b_commit) -{ - char *formatted_oid; - - formatted_oid = git_oid_allocfmt(b_commit); - GITERR_CHECK_ALLOC(formatted_oid); - - git_buf_put(out, formatted_oid, 7); - git__free(formatted_oid); - - return git_buf_oom(out) ? -1 : 0; -} - -static int append_commit_description(git_buf *out, git_commit* commit) -{ - const char *summary = git_commit_summary(commit); - GITERR_CHECK_ALLOC(summary); - - if (append_abbreviated_oid(out, git_commit_id(commit)) < 0) - return -1; - - git_buf_putc(out, ' '); - git_buf_puts(out, summary); - git_buf_putc(out, '\n'); - - return git_buf_oom(out) ? -1 : 0; -} - -static int retrieve_base_commit_and_message( - git_commit **b_commit, - git_buf *stash_message, - git_repository *repo) -{ - git_reference *head = NULL; - int error; - - if ((error = retrieve_head(&head, repo)) < 0) - return error; - - if (strcmp("HEAD", git_reference_name(head)) == 0) - error = git_buf_puts(stash_message, "(no branch): "); - else - error = git_buf_printf( - stash_message, - "%s: ", - git_reference_name(head) + strlen(GIT_REFS_HEADS_DIR)); - if (error < 0) - goto cleanup; - - if ((error = git_commit_lookup( - b_commit, repo, git_reference_target(head))) < 0) - goto cleanup; - - if ((error = append_commit_description(stash_message, *b_commit)) < 0) - goto cleanup; - -cleanup: - git_reference_free(head); - return error; -} - -static int build_tree_from_index(git_tree **out, git_index *index) -{ - int error; - git_oid i_tree_oid; - - if ((error = git_index_write_tree(&i_tree_oid, index)) < 0) - return error; - - return git_tree_lookup(out, git_index_owner(index), &i_tree_oid); -} - -static int commit_index( - git_commit **i_commit, - git_index *index, - const git_signature *stasher, - const char *message, - const git_commit *parent) -{ - git_tree *i_tree = NULL; - git_oid i_commit_oid; - git_buf msg = GIT_BUF_INIT; - int error; - - if ((error = build_tree_from_index(&i_tree, index)) < 0) - goto cleanup; - - if ((error = git_buf_printf(&msg, "index on %s\n", message)) < 0) - goto cleanup; - - if ((error = git_commit_create( - &i_commit_oid, - git_index_owner(index), - NULL, - stasher, - stasher, - NULL, - git_buf_cstr(&msg), - i_tree, - 1, - &parent)) < 0) - goto cleanup; - - error = git_commit_lookup(i_commit, git_index_owner(index), &i_commit_oid); - -cleanup: - git_tree_free(i_tree); - git_buf_free(&msg); - return error; -} - -struct stash_update_rules { - bool include_changed; - bool include_untracked; - bool include_ignored; -}; - -static int stash_update_index_from_diff( - git_index *index, - const git_diff *diff, - struct stash_update_rules *data) -{ - int error = 0; - size_t d, max_d = git_diff_num_deltas(diff); - - for (d = 0; !error && d < max_d; ++d) { - const char *add_path = NULL; - const git_diff_delta *delta = git_diff_get_delta(diff, d); - - switch (delta->status) { - case GIT_DELTA_IGNORED: - if (data->include_ignored) - add_path = delta->new_file.path; - break; - - case GIT_DELTA_UNTRACKED: - if (data->include_untracked && - delta->new_file.mode != GIT_FILEMODE_TREE) - add_path = delta->new_file.path; - break; - - case GIT_DELTA_ADDED: - case GIT_DELTA_MODIFIED: - if (data->include_changed) - add_path = delta->new_file.path; - break; - - case GIT_DELTA_DELETED: - if (data->include_changed && - !git_index_find(NULL, index, delta->old_file.path)) - error = git_index_remove(index, delta->old_file.path, 0); - break; - - default: - /* Unimplemented */ - giterr_set( - GITERR_INVALID, - "Cannot update index. Unimplemented status (%d)", - delta->status); - return -1; - } - - if (add_path != NULL) - error = git_index_add_bypath(index, add_path); - } - - return error; -} - -static int build_untracked_tree( - git_tree **tree_out, - git_index *index, - git_commit *i_commit, - uint32_t flags) -{ - git_tree *i_tree = NULL; - git_diff *diff = NULL; - git_diff_options opts = GIT_DIFF_OPTIONS_INIT; - struct stash_update_rules data = {0}; - int error; - - git_index_clear(index); - - if (flags & GIT_STASH_INCLUDE_UNTRACKED) { - opts.flags |= GIT_DIFF_INCLUDE_UNTRACKED | - GIT_DIFF_RECURSE_UNTRACKED_DIRS; - data.include_untracked = true; - } - - if (flags & GIT_STASH_INCLUDE_IGNORED) { - opts.flags |= GIT_DIFF_INCLUDE_IGNORED | - GIT_DIFF_RECURSE_IGNORED_DIRS; - data.include_ignored = true; - } - - if ((error = git_commit_tree(&i_tree, i_commit)) < 0) - goto cleanup; - - if ((error = git_diff_tree_to_workdir( - &diff, git_index_owner(index), i_tree, &opts)) < 0) - goto cleanup; - - if ((error = stash_update_index_from_diff(index, diff, &data)) < 0) - goto cleanup; - - error = build_tree_from_index(tree_out, index); - -cleanup: - git_diff_free(diff); - git_tree_free(i_tree); - return error; -} - -static int commit_untracked( - git_commit **u_commit, - git_index *index, - const git_signature *stasher, - const char *message, - git_commit *i_commit, - uint32_t flags) -{ - git_tree *u_tree = NULL; - git_oid u_commit_oid; - git_buf msg = GIT_BUF_INIT; - int error; - - if ((error = build_untracked_tree(&u_tree, index, i_commit, flags)) < 0) - goto cleanup; - - if ((error = git_buf_printf(&msg, "untracked files on %s\n", message)) < 0) - goto cleanup; - - if ((error = git_commit_create( - &u_commit_oid, - git_index_owner(index), - NULL, - stasher, - stasher, - NULL, - git_buf_cstr(&msg), - u_tree, - 0, - NULL)) < 0) - goto cleanup; - - error = git_commit_lookup(u_commit, git_index_owner(index), &u_commit_oid); - -cleanup: - git_tree_free(u_tree); - git_buf_free(&msg); - return error; -} - -static git_diff_delta *stash_delta_merge( - const git_diff_delta *a, - const git_diff_delta *b, - git_pool *pool) -{ - /* Special case for stash: if a file is deleted in the index, but exists - * in the working tree, we need to stash the workdir copy for the workdir. - */ - if (a->status == GIT_DELTA_DELETED && b->status == GIT_DELTA_UNTRACKED) { - git_diff_delta *dup = git_diff__delta_dup(b, pool); - - if (dup) - dup->status = GIT_DELTA_MODIFIED; - return dup; - } - - return git_diff__merge_like_cgit(a, b, pool); -} - -static int build_workdir_tree( - git_tree **tree_out, - git_index *index, - git_commit *b_commit) -{ - git_repository *repo = git_index_owner(index); - git_tree *b_tree = NULL; - git_diff *diff = NULL, *idx_to_wd = NULL; - git_diff_options opts = GIT_DIFF_OPTIONS_INIT; - struct stash_update_rules data = {0}; - int error; - - opts.flags = GIT_DIFF_IGNORE_SUBMODULES | GIT_DIFF_INCLUDE_UNTRACKED; - - if ((error = git_commit_tree(&b_tree, b_commit)) < 0) - goto cleanup; - - if ((error = git_diff_tree_to_index(&diff, repo, b_tree, index, &opts)) < 0 || - (error = git_diff_index_to_workdir(&idx_to_wd, repo, index, &opts)) < 0 || - (error = git_diff__merge(diff, idx_to_wd, stash_delta_merge)) < 0) - goto cleanup; - - data.include_changed = true; - - if ((error = stash_update_index_from_diff(index, diff, &data)) < 0) - goto cleanup; - - error = build_tree_from_index(tree_out, index); - -cleanup: - git_diff_free(idx_to_wd); - git_diff_free(diff); - git_tree_free(b_tree); - - return error; -} - -static int commit_worktree( - git_oid *w_commit_oid, - git_index *index, - const git_signature *stasher, - const char *message, - git_commit *i_commit, - git_commit *b_commit, - git_commit *u_commit) -{ - int error = 0; - git_tree *w_tree = NULL, *i_tree = NULL; - const git_commit *parents[] = { NULL, NULL, NULL }; - - parents[0] = b_commit; - parents[1] = i_commit; - parents[2] = u_commit; - - if ((error = git_commit_tree(&i_tree, i_commit)) < 0) - goto cleanup; - - if ((error = git_index_read_tree(index, i_tree)) < 0) - goto cleanup; - - if ((error = build_workdir_tree(&w_tree, index, b_commit)) < 0) - goto cleanup; - - error = git_commit_create( - w_commit_oid, - git_index_owner(index), - NULL, - stasher, - stasher, - NULL, - message, - w_tree, - u_commit ? 3 : 2, - parents); - -cleanup: - git_tree_free(i_tree); - git_tree_free(w_tree); - return error; -} - -static int prepare_worktree_commit_message( - git_buf* msg, - const char *user_message) -{ - git_buf buf = GIT_BUF_INIT; - int error; - - if ((error = git_buf_set(&buf, git_buf_cstr(msg), git_buf_len(msg))) < 0) - return error; - - git_buf_clear(msg); - - if (!user_message) - git_buf_printf(msg, "WIP on %s", git_buf_cstr(&buf)); - else { - const char *colon; - - if ((colon = strchr(git_buf_cstr(&buf), ':')) == NULL) - goto cleanup; - - git_buf_puts(msg, "On "); - git_buf_put(msg, git_buf_cstr(&buf), colon - buf.ptr); - git_buf_printf(msg, ": %s\n", user_message); - } - - error = (git_buf_oom(msg) || git_buf_oom(&buf)) ? -1 : 0; - -cleanup: - git_buf_free(&buf); - - return error; -} - -static int update_reflog( - git_oid *w_commit_oid, - git_repository *repo, - const char *message) -{ - git_reference *stash; - int error; - - if ((error = git_reference_ensure_log(repo, GIT_REFS_STASH_FILE)) < 0) - return error; - - error = git_reference_create(&stash, repo, GIT_REFS_STASH_FILE, w_commit_oid, 1, message); - - git_reference_free(stash); - - return error; -} - -static int is_dirty_cb(const char *path, unsigned int status, void *payload) -{ - GIT_UNUSED(path); - GIT_UNUSED(status); - GIT_UNUSED(payload); - - return GIT_PASSTHROUGH; -} - -static int ensure_there_are_changes_to_stash( - git_repository *repo, - bool include_untracked_files, - bool include_ignored_files) -{ - int error; - git_status_options opts = GIT_STATUS_OPTIONS_INIT; - - opts.show = GIT_STATUS_SHOW_INDEX_AND_WORKDIR; - opts.flags = GIT_STATUS_OPT_EXCLUDE_SUBMODULES; - - if (include_untracked_files) - opts.flags |= GIT_STATUS_OPT_INCLUDE_UNTRACKED | - GIT_STATUS_OPT_RECURSE_UNTRACKED_DIRS; - - if (include_ignored_files) - opts.flags |= GIT_STATUS_OPT_INCLUDE_IGNORED | - GIT_STATUS_OPT_RECURSE_IGNORED_DIRS; - - error = git_status_foreach_ext(repo, &opts, is_dirty_cb, NULL); - - if (error == GIT_PASSTHROUGH) - return 0; - - if (!error) - return create_error(GIT_ENOTFOUND, "There is nothing to stash."); - - return error; -} - -static int reset_index_and_workdir( - git_repository *repo, - git_commit *commit, - bool remove_untracked, - bool remove_ignored) -{ - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - - opts.checkout_strategy = GIT_CHECKOUT_FORCE; - - if (remove_untracked) - opts.checkout_strategy |= GIT_CHECKOUT_REMOVE_UNTRACKED; - - if (remove_ignored) - opts.checkout_strategy |= GIT_CHECKOUT_REMOVE_IGNORED; - - return git_checkout_tree(repo, (git_object *)commit, &opts); -} - -int git_stash_save( - git_oid *out, - git_repository *repo, - const git_signature *stasher, - const char *message, - uint32_t flags) -{ - git_index *index = NULL; - git_commit *b_commit = NULL, *i_commit = NULL, *u_commit = NULL; - git_buf msg = GIT_BUF_INIT; - int error; - - assert(out && repo && stasher); - - if ((error = git_repository__ensure_not_bare(repo, "stash save")) < 0) - return error; - - if ((error = retrieve_base_commit_and_message(&b_commit, &msg, repo)) < 0) - goto cleanup; - - if ((error = ensure_there_are_changes_to_stash( - repo, - (flags & GIT_STASH_INCLUDE_UNTRACKED) != 0, - (flags & GIT_STASH_INCLUDE_IGNORED) != 0)) < 0) - goto cleanup; - - if ((error = git_repository_index(&index, repo)) < 0) - goto cleanup; - - if ((error = commit_index( - &i_commit, index, stasher, git_buf_cstr(&msg), b_commit)) < 0) - goto cleanup; - - if ((flags & (GIT_STASH_INCLUDE_UNTRACKED | GIT_STASH_INCLUDE_IGNORED)) && - (error = commit_untracked( - &u_commit, index, stasher, git_buf_cstr(&msg), - i_commit, flags)) < 0) - goto cleanup; - - if ((error = prepare_worktree_commit_message(&msg, message)) < 0) - goto cleanup; - - if ((error = commit_worktree( - out, index, stasher, git_buf_cstr(&msg), - i_commit, b_commit, u_commit)) < 0) - goto cleanup; - - git_buf_rtrim(&msg); - - if ((error = update_reflog(out, repo, git_buf_cstr(&msg))) < 0) - goto cleanup; - - if ((error = reset_index_and_workdir( - repo, - ((flags & GIT_STASH_KEEP_INDEX) != 0) ? i_commit : b_commit, - (flags & GIT_STASH_INCLUDE_UNTRACKED) != 0, - (flags & GIT_STASH_INCLUDE_IGNORED) != 0)) < 0) - goto cleanup; - -cleanup: - - git_buf_free(&msg); - git_commit_free(i_commit); - git_commit_free(b_commit); - git_commit_free(u_commit); - git_index_free(index); - - return error; -} - -static int retrieve_stash_commit( - git_commit **commit, - git_repository *repo, - size_t index) -{ - git_reference *stash = NULL; - git_reflog *reflog = NULL; - int error; - size_t max; - const git_reflog_entry *entry; - - if ((error = git_reference_lookup(&stash, repo, GIT_REFS_STASH_FILE)) < 0) - goto cleanup; - - if ((error = git_reflog_read(&reflog, repo, GIT_REFS_STASH_FILE)) < 0) - goto cleanup; - - max = git_reflog_entrycount(reflog); - if (!max || index > max - 1) { - error = GIT_ENOTFOUND; - giterr_set(GITERR_STASH, "No stashed state at position %" PRIuZ, index); - goto cleanup; - } - - entry = git_reflog_entry_byindex(reflog, index); - if ((error = git_commit_lookup(commit, repo, git_reflog_entry_id_new(entry))) < 0) - goto cleanup; - -cleanup: - git_reference_free(stash); - git_reflog_free(reflog); - return error; -} - -static int retrieve_stash_trees( - git_tree **out_stash_tree, - git_tree **out_base_tree, - git_tree **out_index_tree, - git_tree **out_index_parent_tree, - git_tree **out_untracked_tree, - git_commit *stash_commit) -{ - git_tree *stash_tree = NULL; - git_commit *base_commit = NULL; - git_tree *base_tree = NULL; - git_commit *index_commit = NULL; - git_tree *index_tree = NULL; - git_commit *index_parent_commit = NULL; - git_tree *index_parent_tree = NULL; - git_commit *untracked_commit = NULL; - git_tree *untracked_tree = NULL; - int error; - - if ((error = git_commit_tree(&stash_tree, stash_commit)) < 0) - goto cleanup; - - if ((error = git_commit_parent(&base_commit, stash_commit, 0)) < 0) - goto cleanup; - if ((error = git_commit_tree(&base_tree, base_commit)) < 0) - goto cleanup; - - if ((error = git_commit_parent(&index_commit, stash_commit, 1)) < 0) - goto cleanup; - if ((error = git_commit_tree(&index_tree, index_commit)) < 0) - goto cleanup; - - if ((error = git_commit_parent(&index_parent_commit, index_commit, 0)) < 0) - goto cleanup; - if ((error = git_commit_tree(&index_parent_tree, index_parent_commit)) < 0) - goto cleanup; - - if (git_commit_parentcount(stash_commit) == 3) { - if ((error = git_commit_parent(&untracked_commit, stash_commit, 2)) < 0) - goto cleanup; - if ((error = git_commit_tree(&untracked_tree, untracked_commit)) < 0) - goto cleanup; - } - - *out_stash_tree = stash_tree; - *out_base_tree = base_tree; - *out_index_tree = index_tree; - *out_index_parent_tree = index_parent_tree; - *out_untracked_tree = untracked_tree; - -cleanup: - git_commit_free(untracked_commit); - git_commit_free(index_parent_commit); - git_commit_free(index_commit); - git_commit_free(base_commit); - if (error < 0) { - git_tree_free(stash_tree); - git_tree_free(base_tree); - git_tree_free(index_tree); - git_tree_free(index_parent_tree); - git_tree_free(untracked_tree); - } - return error; -} - -static int merge_indexes( - git_index **out, - git_repository *repo, - git_tree *ancestor_tree, - git_index *ours_index, - git_index *theirs_index) -{ - git_iterator *ancestor = NULL, *ours = NULL, *theirs = NULL; - const git_iterator_flag_t flags = GIT_ITERATOR_DONT_IGNORE_CASE; - int error; - - if ((error = git_iterator_for_tree(&ancestor, ancestor_tree, flags, NULL, NULL)) < 0 || - (error = git_iterator_for_index(&ours, ours_index, flags, NULL, NULL)) < 0 || - (error = git_iterator_for_index(&theirs, theirs_index, flags, NULL, NULL)) < 0) - goto done; - - error = git_merge__iterators(out, repo, ancestor, ours, theirs, NULL); - -done: - git_iterator_free(ancestor); - git_iterator_free(ours); - git_iterator_free(theirs); - return error; -} - -static int merge_index_and_tree( - git_index **out, - git_repository *repo, - git_tree *ancestor_tree, - git_index *ours_index, - git_tree *theirs_tree) -{ - git_iterator *ancestor = NULL, *ours = NULL, *theirs = NULL; - const git_iterator_flag_t flags = GIT_ITERATOR_DONT_IGNORE_CASE; - int error; - - if ((error = git_iterator_for_tree(&ancestor, ancestor_tree, flags, NULL, NULL)) < 0 || - (error = git_iterator_for_index(&ours, ours_index, flags, NULL, NULL)) < 0 || - (error = git_iterator_for_tree(&theirs, theirs_tree, flags, NULL, NULL)) < 0) - goto done; - - error = git_merge__iterators(out, repo, ancestor, ours, theirs, NULL); - -done: - git_iterator_free(ancestor); - git_iterator_free(ours); - git_iterator_free(theirs); - return error; -} - -static void normalize_apply_options( - git_stash_apply_options *opts, - const git_stash_apply_options *given_apply_opts) -{ - if (given_apply_opts != NULL) { - memcpy(opts, given_apply_opts, sizeof(git_stash_apply_options)); - } else { - git_stash_apply_options default_apply_opts = GIT_STASH_APPLY_OPTIONS_INIT; - memcpy(opts, &default_apply_opts, sizeof(git_stash_apply_options)); - } - - if ((opts->checkout_options.checkout_strategy & (GIT_CHECKOUT_SAFE | GIT_CHECKOUT_FORCE)) == 0) - opts->checkout_options.checkout_strategy = GIT_CHECKOUT_SAFE; - - if (!opts->checkout_options.our_label) - opts->checkout_options.our_label = "Updated upstream"; - - if (!opts->checkout_options.their_label) - opts->checkout_options.their_label = "Stashed changes"; -} - -int git_stash_apply_init_options(git_stash_apply_options *opts, unsigned int version) -{ - GIT_INIT_STRUCTURE_FROM_TEMPLATE( - opts, version, git_stash_apply_options, GIT_STASH_APPLY_OPTIONS_INIT); - return 0; -} - -#define NOTIFY_PROGRESS(opts, progress_type) \ - do { \ - if ((opts).progress_cb && \ - (error = (opts).progress_cb((progress_type), (opts).progress_payload))) { \ - error = (error < 0) ? error : -1; \ - goto cleanup; \ - } \ - } while(false); - -static int ensure_clean_index(git_repository *repo, git_index *index) -{ - git_tree *head_tree = NULL; - git_diff *index_diff = NULL; - int error = 0; - - if ((error = git_repository_head_tree(&head_tree, repo)) < 0 || - (error = git_diff_tree_to_index( - &index_diff, repo, head_tree, index, NULL)) < 0) - goto done; - - if (git_diff_num_deltas(index_diff) > 0) { - giterr_set(GITERR_STASH, "%" PRIuZ " uncommitted changes exist in the index", - git_diff_num_deltas(index_diff)); - error = GIT_EUNCOMMITTED; - } - -done: - git_diff_free(index_diff); - git_tree_free(head_tree); - return error; -} - -static int stage_new_file(const git_index_entry **entries, void *data) -{ - git_index *index = data; - - if(entries[0] == NULL) - return git_index_add(index, entries[1]); - else - return git_index_add(index, entries[0]); -} - -static int stage_new_files( - git_index **out, - git_tree *parent_tree, - git_tree *tree) -{ - git_iterator *iterators[2] = { NULL, NULL }; - git_index *index = NULL; - int error; - - if ((error = git_index_new(&index)) < 0 || - (error = git_iterator_for_tree(&iterators[0], parent_tree, - GIT_ITERATOR_DONT_IGNORE_CASE, NULL, NULL)) < 0 || - (error = git_iterator_for_tree(&iterators[1], tree, - GIT_ITERATOR_DONT_IGNORE_CASE, NULL, NULL)) < 0) - goto done; - - error = git_iterator_walk(iterators, 2, stage_new_file, index); - -done: - if (error < 0) - git_index_free(index); - else - *out = index; - - git_iterator_free(iterators[0]); - git_iterator_free(iterators[1]); - - return error; -} - -int git_stash_apply( - git_repository *repo, - size_t index, - const git_stash_apply_options *given_opts) -{ - git_stash_apply_options opts; - unsigned int checkout_strategy; - git_commit *stash_commit = NULL; - git_tree *stash_tree = NULL; - git_tree *stash_parent_tree = NULL; - git_tree *index_tree = NULL; - git_tree *index_parent_tree = NULL; - git_tree *untracked_tree = NULL; - git_index *stash_adds = NULL; - git_index *repo_index = NULL; - git_index *unstashed_index = NULL; - git_index *modified_index = NULL; - git_index *untracked_index = NULL; - int error; - - GITERR_CHECK_VERSION(given_opts, GIT_STASH_APPLY_OPTIONS_VERSION, "git_stash_apply_options"); - - normalize_apply_options(&opts, given_opts); - checkout_strategy = opts.checkout_options.checkout_strategy; - - NOTIFY_PROGRESS(opts, GIT_STASH_APPLY_PROGRESS_LOADING_STASH); - - /* Retrieve commit corresponding to the given stash */ - if ((error = retrieve_stash_commit(&stash_commit, repo, index)) < 0) - goto cleanup; - - /* Retrieve all trees in the stash */ - if ((error = retrieve_stash_trees( - &stash_tree, &stash_parent_tree, &index_tree, - &index_parent_tree, &untracked_tree, stash_commit)) < 0) - goto cleanup; - - /* Load repo index */ - if ((error = git_repository_index(&repo_index, repo)) < 0) - goto cleanup; - - NOTIFY_PROGRESS(opts, GIT_STASH_APPLY_PROGRESS_ANALYZE_INDEX); - - if ((error = ensure_clean_index(repo, repo_index)) < 0) - goto cleanup; - - /* Restore index if required */ - if ((opts.flags & GIT_STASH_APPLY_REINSTATE_INDEX) && - git_oid_cmp(git_tree_id(stash_parent_tree), git_tree_id(index_tree))) { - - if ((error = merge_index_and_tree( - &unstashed_index, repo, index_parent_tree, repo_index, index_tree)) < 0) - goto cleanup; - - if (git_index_has_conflicts(unstashed_index)) { - error = GIT_ECONFLICT; - goto cleanup; - } - - /* Otherwise, stage any new files in the stash tree. (Note: their - * previously unstaged contents are staged, not the previously staged.) - */ - } else if ((opts.flags & GIT_STASH_APPLY_REINSTATE_INDEX) == 0) { - if ((error = stage_new_files( - &stash_adds, stash_parent_tree, stash_tree)) < 0 || - (error = merge_indexes( - &unstashed_index, repo, stash_parent_tree, repo_index, stash_adds)) < 0) - goto cleanup; - } - - NOTIFY_PROGRESS(opts, GIT_STASH_APPLY_PROGRESS_ANALYZE_MODIFIED); - - /* Restore modified files in workdir */ - if ((error = merge_index_and_tree( - &modified_index, repo, stash_parent_tree, repo_index, stash_tree)) < 0) - goto cleanup; - - /* If applicable, restore untracked / ignored files in workdir */ - if (untracked_tree) { - NOTIFY_PROGRESS(opts, GIT_STASH_APPLY_PROGRESS_ANALYZE_UNTRACKED); - - if ((error = merge_index_and_tree(&untracked_index, repo, NULL, repo_index, untracked_tree)) < 0) - goto cleanup; - } - - if (untracked_index) { - opts.checkout_options.checkout_strategy |= GIT_CHECKOUT_DONT_UPDATE_INDEX; - - NOTIFY_PROGRESS(opts, GIT_STASH_APPLY_PROGRESS_CHECKOUT_UNTRACKED); - - if ((error = git_checkout_index(repo, untracked_index, &opts.checkout_options)) < 0) - goto cleanup; - - opts.checkout_options.checkout_strategy = checkout_strategy; - } - - - /* If there are conflicts in the modified index, then we need to actually - * check that out as the repo's index. Otherwise, we don't update the - * index. - */ - - if (!git_index_has_conflicts(modified_index)) - opts.checkout_options.checkout_strategy |= GIT_CHECKOUT_DONT_UPDATE_INDEX; - - /* Check out the modified index using the existing repo index as baseline, - * so that existing modifications in the index can be rewritten even when - * checking out safely. - */ - opts.checkout_options.baseline_index = repo_index; - - NOTIFY_PROGRESS(opts, GIT_STASH_APPLY_PROGRESS_CHECKOUT_MODIFIED); - - if ((error = git_checkout_index(repo, modified_index, &opts.checkout_options)) < 0) - goto cleanup; - - if (unstashed_index && !git_index_has_conflicts(modified_index)) { - if ((error = git_index_read_index(repo_index, unstashed_index)) < 0) - goto cleanup; - } - - NOTIFY_PROGRESS(opts, GIT_STASH_APPLY_PROGRESS_DONE); - - error = git_index_write(repo_index); - -cleanup: - git_index_free(untracked_index); - git_index_free(modified_index); - git_index_free(unstashed_index); - git_index_free(stash_adds); - git_index_free(repo_index); - git_tree_free(untracked_tree); - git_tree_free(index_parent_tree); - git_tree_free(index_tree); - git_tree_free(stash_parent_tree); - git_tree_free(stash_tree); - git_commit_free(stash_commit); - return error; -} - -int git_stash_foreach( - git_repository *repo, - git_stash_cb callback, - void *payload) -{ - git_reference *stash; - git_reflog *reflog = NULL; - int error; - size_t i, max; - const git_reflog_entry *entry; - - error = git_reference_lookup(&stash, repo, GIT_REFS_STASH_FILE); - if (error == GIT_ENOTFOUND) { - giterr_clear(); - return 0; - } - if (error < 0) - goto cleanup; - - if ((error = git_reflog_read(&reflog, repo, GIT_REFS_STASH_FILE)) < 0) - goto cleanup; - - max = git_reflog_entrycount(reflog); - for (i = 0; i < max; i++) { - entry = git_reflog_entry_byindex(reflog, i); - - error = callback(i, - git_reflog_entry_message(entry), - git_reflog_entry_id_new(entry), - payload); - - if (error) { - giterr_set_after_callback(error); - break; - } - } - -cleanup: - git_reference_free(stash); - git_reflog_free(reflog); - return error; -} - -int git_stash_drop( - git_repository *repo, - size_t index) -{ - git_transaction *tx; - git_reference *stash = NULL; - git_reflog *reflog = NULL; - size_t max; - int error; - - if ((error = git_transaction_new(&tx, repo)) < 0) - return error; - - if ((error = git_transaction_lock_ref(tx, GIT_REFS_STASH_FILE)) < 0) - goto cleanup; - - if ((error = git_reference_lookup(&stash, repo, GIT_REFS_STASH_FILE)) < 0) - goto cleanup; - - if ((error = git_reflog_read(&reflog, repo, GIT_REFS_STASH_FILE)) < 0) - goto cleanup; - - max = git_reflog_entrycount(reflog); - - if (!max || index > max - 1) { - error = GIT_ENOTFOUND; - giterr_set(GITERR_STASH, "No stashed state at position %" PRIuZ, index); - goto cleanup; - } - - if ((error = git_reflog_drop(reflog, index, true)) < 0) - goto cleanup; - - if ((error = git_transaction_set_reflog(tx, GIT_REFS_STASH_FILE, reflog)) < 0) - goto cleanup; - - if (max == 1) { - if ((error = git_transaction_remove(tx, GIT_REFS_STASH_FILE)) < 0) - goto cleanup; - } else if (index == 0) { - const git_reflog_entry *entry; - - entry = git_reflog_entry_byindex(reflog, 0); - if ((error = git_transaction_set_target(tx, GIT_REFS_STASH_FILE, &entry->oid_cur, NULL, NULL)) < 0) - goto cleanup; - } - - error = git_transaction_commit(tx); - -cleanup: - git_reference_free(stash); - git_transaction_free(tx); - git_reflog_free(reflog); - return error; -} - -int git_stash_pop( - git_repository *repo, - size_t index, - const git_stash_apply_options *options) -{ - int error; - - if ((error = git_stash_apply(repo, index, options)) < 0) - return error; - - return git_stash_drop(repo, index); -} diff --git a/vendor/libgit2/src/status.c b/vendor/libgit2/src/status.c deleted file mode 100644 index b206b0e2f5..0000000000 --- a/vendor/libgit2/src/status.c +++ /dev/null @@ -1,564 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#include "common.h" -#include "git2.h" -#include "fileops.h" -#include "hash.h" -#include "vector.h" -#include "tree.h" -#include "status.h" -#include "git2/status.h" -#include "repository.h" -#include "ignore.h" -#include "index.h" - -#include "git2/diff.h" -#include "diff.h" - -static unsigned int index_delta2status(const git_diff_delta *head2idx) -{ - git_status_t st = GIT_STATUS_CURRENT; - - switch (head2idx->status) { - case GIT_DELTA_ADDED: - case GIT_DELTA_COPIED: - st = GIT_STATUS_INDEX_NEW; - break; - case GIT_DELTA_DELETED: - st = GIT_STATUS_INDEX_DELETED; - break; - case GIT_DELTA_MODIFIED: - st = GIT_STATUS_INDEX_MODIFIED; - break; - case GIT_DELTA_RENAMED: - st = GIT_STATUS_INDEX_RENAMED; - - if (!git_oid_equal(&head2idx->old_file.id, &head2idx->new_file.id)) - st |= GIT_STATUS_INDEX_MODIFIED; - break; - case GIT_DELTA_TYPECHANGE: - st = GIT_STATUS_INDEX_TYPECHANGE; - break; - case GIT_DELTA_CONFLICTED: - st = GIT_STATUS_CONFLICTED; - break; - default: - break; - } - - return st; -} - -static unsigned int workdir_delta2status( - git_diff *diff, git_diff_delta *idx2wd) -{ - git_status_t st = GIT_STATUS_CURRENT; - - switch (idx2wd->status) { - case GIT_DELTA_ADDED: - case GIT_DELTA_COPIED: - case GIT_DELTA_UNTRACKED: - st = GIT_STATUS_WT_NEW; - break; - case GIT_DELTA_UNREADABLE: - st = GIT_STATUS_WT_UNREADABLE; - break; - case GIT_DELTA_DELETED: - st = GIT_STATUS_WT_DELETED; - break; - case GIT_DELTA_MODIFIED: - st = GIT_STATUS_WT_MODIFIED; - break; - case GIT_DELTA_IGNORED: - st = GIT_STATUS_IGNORED; - break; - case GIT_DELTA_RENAMED: - st = GIT_STATUS_WT_RENAMED; - - if (!git_oid_equal(&idx2wd->old_file.id, &idx2wd->new_file.id)) { - /* if OIDs don't match, we might need to calculate them now to - * discern between RENAMED vs RENAMED+MODIFED - */ - if (git_oid_iszero(&idx2wd->old_file.id) && - diff->old_src == GIT_ITERATOR_TYPE_WORKDIR && - !git_diff__oid_for_file( - &idx2wd->old_file.id, diff, idx2wd->old_file.path, - idx2wd->old_file.mode, idx2wd->old_file.size)) - idx2wd->old_file.flags |= GIT_DIFF_FLAG_VALID_ID; - - if (git_oid_iszero(&idx2wd->new_file.id) && - diff->new_src == GIT_ITERATOR_TYPE_WORKDIR && - !git_diff__oid_for_file( - &idx2wd->new_file.id, diff, idx2wd->new_file.path, - idx2wd->new_file.mode, idx2wd->new_file.size)) - idx2wd->new_file.flags |= GIT_DIFF_FLAG_VALID_ID; - - if (!git_oid_equal(&idx2wd->old_file.id, &idx2wd->new_file.id)) - st |= GIT_STATUS_WT_MODIFIED; - } - break; - case GIT_DELTA_TYPECHANGE: - st = GIT_STATUS_WT_TYPECHANGE; - break; - case GIT_DELTA_CONFLICTED: - st = GIT_STATUS_CONFLICTED; - break; - default: - break; - } - - return st; -} - -static bool status_is_included( - git_status_list *status, - git_diff_delta *head2idx, - git_diff_delta *idx2wd) -{ - if (!(status->opts.flags & GIT_STATUS_OPT_EXCLUDE_SUBMODULES)) - return 1; - - /* if excluding submodules and this is a submodule everywhere */ - if (head2idx) { - if (head2idx->status != GIT_DELTA_ADDED && - head2idx->old_file.mode != GIT_FILEMODE_COMMIT) - return 1; - if (head2idx->status != GIT_DELTA_DELETED && - head2idx->new_file.mode != GIT_FILEMODE_COMMIT) - return 1; - } - if (idx2wd) { - if (idx2wd->status != GIT_DELTA_ADDED && - idx2wd->old_file.mode != GIT_FILEMODE_COMMIT) - return 1; - if (idx2wd->status != GIT_DELTA_DELETED && - idx2wd->new_file.mode != GIT_FILEMODE_COMMIT) - return 1; - } - - /* only get here if every valid mode is GIT_FILEMODE_COMMIT */ - return 0; -} - -static git_status_t status_compute( - git_status_list *status, - git_diff_delta *head2idx, - git_diff_delta *idx2wd) -{ - git_status_t st = GIT_STATUS_CURRENT; - - if (head2idx) - st |= index_delta2status(head2idx); - - if (idx2wd) - st |= workdir_delta2status(status->idx2wd, idx2wd); - - return st; -} - -static int status_collect( - git_diff_delta *head2idx, - git_diff_delta *idx2wd, - void *payload) -{ - git_status_list *status = payload; - git_status_entry *status_entry; - - if (!status_is_included(status, head2idx, idx2wd)) - return 0; - - status_entry = git__malloc(sizeof(git_status_entry)); - GITERR_CHECK_ALLOC(status_entry); - - status_entry->status = status_compute(status, head2idx, idx2wd); - status_entry->head_to_index = head2idx; - status_entry->index_to_workdir = idx2wd; - - return git_vector_insert(&status->paired, status_entry); -} - -GIT_INLINE(int) status_entry_cmp_base( - const void *a, - const void *b, - int (*strcomp)(const char *a, const char *b)) -{ - const git_status_entry *entry_a = a; - const git_status_entry *entry_b = b; - const git_diff_delta *delta_a, *delta_b; - - delta_a = entry_a->index_to_workdir ? entry_a->index_to_workdir : - entry_a->head_to_index; - delta_b = entry_b->index_to_workdir ? entry_b->index_to_workdir : - entry_b->head_to_index; - - if (!delta_a && delta_b) - return -1; - if (delta_a && !delta_b) - return 1; - if (!delta_a && !delta_b) - return 0; - - return strcomp(delta_a->new_file.path, delta_b->new_file.path); -} - -static int status_entry_icmp(const void *a, const void *b) -{ - return status_entry_cmp_base(a, b, git__strcasecmp); -} - -static int status_entry_cmp(const void *a, const void *b) -{ - return status_entry_cmp_base(a, b, git__strcmp); -} - -static git_status_list *git_status_list_alloc(git_index *index) -{ - git_status_list *status = NULL; - int (*entrycmp)(const void *a, const void *b); - - if (!(status = git__calloc(1, sizeof(git_status_list)))) - return NULL; - - entrycmp = index->ignore_case ? status_entry_icmp : status_entry_cmp; - - if (git_vector_init(&status->paired, 0, entrycmp) < 0) { - git__free(status); - return NULL; - } - - return status; -} - -static int status_validate_options(const git_status_options *opts) -{ - if (!opts) - return 0; - - GITERR_CHECK_VERSION(opts, GIT_STATUS_OPTIONS_VERSION, "git_status_options"); - - if (opts->show > GIT_STATUS_SHOW_WORKDIR_ONLY) { - giterr_set(GITERR_INVALID, "Unknown status 'show' option"); - return -1; - } - - if ((opts->flags & GIT_STATUS_OPT_NO_REFRESH) != 0 && - (opts->flags & GIT_STATUS_OPT_UPDATE_INDEX) != 0) { - giterr_set(GITERR_INVALID, "Updating index from status " - "is not allowed when index refresh is disabled"); - return -1; - } - - return 0; -} - -int git_status_list_new( - git_status_list **out, - git_repository *repo, - const git_status_options *opts) -{ - git_index *index = NULL; - git_status_list *status = NULL; - git_diff_options diffopt = GIT_DIFF_OPTIONS_INIT; - git_diff_find_options findopt = GIT_DIFF_FIND_OPTIONS_INIT; - git_tree *head = NULL; - git_status_show_t show = - opts ? opts->show : GIT_STATUS_SHOW_INDEX_AND_WORKDIR; - int error = 0; - unsigned int flags = opts ? opts->flags : GIT_STATUS_OPT_DEFAULTS; - - *out = NULL; - - if (status_validate_options(opts) < 0) - return -1; - - if ((error = git_repository__ensure_not_bare(repo, "status")) < 0 || - (error = git_repository_index(&index, repo)) < 0) - return error; - - /* if there is no HEAD, that's okay - we'll make an empty iterator */ - if ((error = git_repository_head_tree(&head, repo)) < 0) { - if (error != GIT_ENOTFOUND && error != GIT_EUNBORNBRANCH) - goto done; - giterr_clear(); - } - - /* refresh index from disk unless prevented */ - if ((flags & GIT_STATUS_OPT_NO_REFRESH) == 0 && - git_index_read(index, false) < 0) - giterr_clear(); - - status = git_status_list_alloc(index); - GITERR_CHECK_ALLOC(status); - - if (opts) { - memcpy(&status->opts, opts, sizeof(git_status_options)); - memcpy(&diffopt.pathspec, &opts->pathspec, sizeof(diffopt.pathspec)); - } - - diffopt.flags = GIT_DIFF_INCLUDE_TYPECHANGE; - findopt.flags = GIT_DIFF_FIND_FOR_UNTRACKED; - - if ((flags & GIT_STATUS_OPT_INCLUDE_UNTRACKED) != 0) - diffopt.flags = diffopt.flags | GIT_DIFF_INCLUDE_UNTRACKED; - if ((flags & GIT_STATUS_OPT_INCLUDE_IGNORED) != 0) - diffopt.flags = diffopt.flags | GIT_DIFF_INCLUDE_IGNORED; - if ((flags & GIT_STATUS_OPT_INCLUDE_UNMODIFIED) != 0) - diffopt.flags = diffopt.flags | GIT_DIFF_INCLUDE_UNMODIFIED; - if ((flags & GIT_STATUS_OPT_RECURSE_UNTRACKED_DIRS) != 0) - diffopt.flags = diffopt.flags | GIT_DIFF_RECURSE_UNTRACKED_DIRS; - if ((flags & GIT_STATUS_OPT_DISABLE_PATHSPEC_MATCH) != 0) - diffopt.flags = diffopt.flags | GIT_DIFF_DISABLE_PATHSPEC_MATCH; - if ((flags & GIT_STATUS_OPT_RECURSE_IGNORED_DIRS) != 0) - diffopt.flags = diffopt.flags | GIT_DIFF_RECURSE_IGNORED_DIRS; - if ((flags & GIT_STATUS_OPT_EXCLUDE_SUBMODULES) != 0) - diffopt.flags = diffopt.flags | GIT_DIFF_IGNORE_SUBMODULES; - if ((flags & GIT_STATUS_OPT_UPDATE_INDEX) != 0) - diffopt.flags = diffopt.flags | GIT_DIFF_UPDATE_INDEX; - if ((flags & GIT_STATUS_OPT_INCLUDE_UNREADABLE) != 0) - diffopt.flags = diffopt.flags | GIT_DIFF_INCLUDE_UNREADABLE; - if ((flags & GIT_STATUS_OPT_INCLUDE_UNREADABLE_AS_UNTRACKED) != 0) - diffopt.flags = diffopt.flags | GIT_DIFF_INCLUDE_UNREADABLE_AS_UNTRACKED; - - if ((flags & GIT_STATUS_OPT_RENAMES_FROM_REWRITES) != 0) - findopt.flags = findopt.flags | - GIT_DIFF_FIND_AND_BREAK_REWRITES | - GIT_DIFF_FIND_RENAMES_FROM_REWRITES | - GIT_DIFF_BREAK_REWRITES_FOR_RENAMES_ONLY; - - if (show != GIT_STATUS_SHOW_WORKDIR_ONLY) { - if ((error = git_diff_tree_to_index( - &status->head2idx, repo, head, index, &diffopt)) < 0) - goto done; - - if ((flags & GIT_STATUS_OPT_RENAMES_HEAD_TO_INDEX) != 0 && - (error = git_diff_find_similar(status->head2idx, &findopt)) < 0) - goto done; - } - - if (show != GIT_STATUS_SHOW_INDEX_ONLY) { - if ((error = git_diff_index_to_workdir( - &status->idx2wd, repo, index, &diffopt)) < 0) { - goto done; - } - - if ((flags & GIT_STATUS_OPT_RENAMES_INDEX_TO_WORKDIR) != 0 && - (error = git_diff_find_similar(status->idx2wd, &findopt)) < 0) - goto done; - } - - error = git_diff__paired_foreach( - status->head2idx, status->idx2wd, status_collect, status); - if (error < 0) - goto done; - - if (flags & GIT_STATUS_OPT_SORT_CASE_SENSITIVELY) - git_vector_set_cmp(&status->paired, status_entry_cmp); - if (flags & GIT_STATUS_OPT_SORT_CASE_INSENSITIVELY) - git_vector_set_cmp(&status->paired, status_entry_icmp); - - if ((flags & - (GIT_STATUS_OPT_RENAMES_HEAD_TO_INDEX | - GIT_STATUS_OPT_RENAMES_INDEX_TO_WORKDIR | - GIT_STATUS_OPT_SORT_CASE_SENSITIVELY | - GIT_STATUS_OPT_SORT_CASE_INSENSITIVELY)) != 0) - git_vector_sort(&status->paired); - -done: - if (error < 0) { - git_status_list_free(status); - status = NULL; - } - - *out = status; - - git_tree_free(head); - git_index_free(index); - - return error; -} - -size_t git_status_list_entrycount(git_status_list *status) -{ - assert(status); - - return status->paired.length; -} - -const git_status_entry *git_status_byindex(git_status_list *status, size_t i) -{ - assert(status); - - return git_vector_get(&status->paired, i); -} - -void git_status_list_free(git_status_list *status) -{ - if (status == NULL) - return; - - git_diff_free(status->head2idx); - git_diff_free(status->idx2wd); - - git_vector_free_deep(&status->paired); - - git__memzero(status, sizeof(*status)); - git__free(status); -} - -int git_status_foreach_ext( - git_repository *repo, - const git_status_options *opts, - git_status_cb cb, - void *payload) -{ - git_status_list *status; - const git_status_entry *status_entry; - size_t i; - int error = 0; - - if ((error = git_status_list_new(&status, repo, opts)) < 0) { - return error; - } - - git_vector_foreach(&status->paired, i, status_entry) { - const char *path = status_entry->head_to_index ? - status_entry->head_to_index->old_file.path : - status_entry->index_to_workdir->old_file.path; - - if ((error = cb(path, status_entry->status, payload)) != 0) { - giterr_set_after_callback(error); - break; - } - } - - git_status_list_free(status); - - return error; -} - -int git_status_foreach(git_repository *repo, git_status_cb cb, void *payload) -{ - return git_status_foreach_ext(repo, NULL, cb, payload); -} - -struct status_file_info { - char *expected; - unsigned int count; - unsigned int status; - int fnm_flags; - int ambiguous; -}; - -static int get_one_status(const char *path, unsigned int status, void *data) -{ - struct status_file_info *sfi = data; - int (*strcomp)(const char *a, const char *b); - - sfi->count++; - sfi->status = status; - - strcomp = (sfi->fnm_flags & FNM_CASEFOLD) ? git__strcasecmp : git__strcmp; - - if (sfi->count > 1 || - (strcomp(sfi->expected, path) != 0 && - p_fnmatch(sfi->expected, path, sfi->fnm_flags) != 0)) - { - sfi->ambiguous = true; - return GIT_EAMBIGUOUS; /* giterr_set will be done by caller */ - } - - return 0; -} - -int git_status_file( - unsigned int *status_flags, - git_repository *repo, - const char *path) -{ - int error; - git_status_options opts = GIT_STATUS_OPTIONS_INIT; - struct status_file_info sfi = {0}; - git_index *index; - - assert(status_flags && repo && path); - - if ((error = git_repository_index__weakptr(&index, repo)) < 0) - return error; - - if ((sfi.expected = git__strdup(path)) == NULL) - return -1; - if (index->ignore_case) - sfi.fnm_flags = FNM_CASEFOLD; - - opts.show = GIT_STATUS_SHOW_INDEX_AND_WORKDIR; - opts.flags = GIT_STATUS_OPT_INCLUDE_IGNORED | - GIT_STATUS_OPT_RECURSE_IGNORED_DIRS | - GIT_STATUS_OPT_INCLUDE_UNTRACKED | - GIT_STATUS_OPT_RECURSE_UNTRACKED_DIRS | - GIT_STATUS_OPT_INCLUDE_UNMODIFIED | - GIT_STATUS_OPT_DISABLE_PATHSPEC_MATCH; - opts.pathspec.count = 1; - opts.pathspec.strings = &sfi.expected; - - error = git_status_foreach_ext(repo, &opts, get_one_status, &sfi); - - if (error < 0 && sfi.ambiguous) { - giterr_set(GITERR_INVALID, - "Ambiguous path '%s' given to git_status_file", sfi.expected); - error = GIT_EAMBIGUOUS; - } - - if (!error && !sfi.count) { - giterr_set(GITERR_INVALID, - "Attempt to get status of nonexistent file '%s'", path); - error = GIT_ENOTFOUND; - } - - *status_flags = sfi.status; - - git__free(sfi.expected); - - return error; -} - -int git_status_should_ignore( - int *ignored, - git_repository *repo, - const char *path) -{ - return git_ignore_path_is_ignored(ignored, repo, path); -} - -int git_status_init_options(git_status_options *opts, unsigned int version) -{ - GIT_INIT_STRUCTURE_FROM_TEMPLATE( - opts, version, git_status_options, GIT_STATUS_OPTIONS_INIT); - return 0; -} - -int git_status_list_get_perfdata( - git_diff_perfdata *out, const git_status_list *status) -{ - assert(out); - GITERR_CHECK_VERSION(out, GIT_DIFF_PERFDATA_VERSION, "git_diff_perfdata"); - - out->stat_calls = 0; - out->oid_calculations = 0; - - if (status->head2idx) { - out->stat_calls += status->head2idx->perf.stat_calls; - out->oid_calculations += status->head2idx->perf.oid_calculations; - } - if (status->idx2wd) { - out->stat_calls += status->idx2wd->perf.stat_calls; - out->oid_calculations += status->idx2wd->perf.oid_calculations; - } - - return 0; -} - diff --git a/vendor/libgit2/src/status.h b/vendor/libgit2/src/status.h deleted file mode 100644 index 33008b89ca..0000000000 --- a/vendor/libgit2/src/status.h +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_status_h__ -#define INCLUDE_status_h__ - -#include "diff.h" -#include "git2/status.h" -#include "git2/diff.h" - -struct git_status_list { - git_status_options opts; - - git_diff *head2idx; - git_diff *idx2wd; - - git_vector paired; -}; - -#endif diff --git a/vendor/libgit2/src/stransport_stream.c b/vendor/libgit2/src/stransport_stream.c deleted file mode 100644 index 10e19166cd..0000000000 --- a/vendor/libgit2/src/stransport_stream.c +++ /dev/null @@ -1,286 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#ifdef GIT_SECURE_TRANSPORT - -#include -#include -#include - -#include "git2/transport.h" - -#include "socket_stream.h" -#include "curl_stream.h" - -int stransport_error(OSStatus ret) -{ - CFStringRef message; - - if (ret == noErr || ret == errSSLClosedGraceful) { - giterr_clear(); - return 0; - } - -#if !TARGET_OS_IPHONE - message = SecCopyErrorMessageString(ret, NULL); - GITERR_CHECK_ALLOC(message); - - giterr_set(GITERR_NET, "SecureTransport error: %s", CFStringGetCStringPtr(message, kCFStringEncodingUTF8)); - CFRelease(message); -#else - giterr_set(GITERR_NET, "SecureTransport error: OSStatus %d", (unsigned int)ret); -#endif - - return -1; -} - -typedef struct { - git_stream parent; - git_stream *io; - SSLContextRef ctx; - CFDataRef der_data; - git_cert_x509 cert_info; -} stransport_stream; - -int stransport_connect(git_stream *stream) -{ - stransport_stream *st = (stransport_stream *) stream; - int error; - SecTrustRef trust = NULL; - SecTrustResultType sec_res; - OSStatus ret; - - if ((error = git_stream_connect(st->io)) < 0) - return error; - - ret = SSLHandshake(st->ctx); - if (ret != errSSLServerAuthCompleted) { - giterr_set(GITERR_SSL, "unexpected return value from ssl handshake %d", ret); - return -1; - } - - if ((ret = SSLCopyPeerTrust(st->ctx, &trust)) != noErr) - goto on_error; - - if ((ret = SecTrustEvaluate(trust, &sec_res)) != noErr) - goto on_error; - - CFRelease(trust); - - if (sec_res == kSecTrustResultInvalid || sec_res == kSecTrustResultOtherError) { - giterr_set(GITERR_SSL, "internal security trust error"); - return -1; - } - - if (sec_res == kSecTrustResultDeny || sec_res == kSecTrustResultRecoverableTrustFailure || - sec_res == kSecTrustResultFatalTrustFailure) - return GIT_ECERTIFICATE; - - return 0; - -on_error: - if (trust) - CFRelease(trust); - - return stransport_error(ret); -} - -int stransport_certificate(git_cert **out, git_stream *stream) -{ - stransport_stream *st = (stransport_stream *) stream; - SecTrustRef trust = NULL; - SecCertificateRef sec_cert; - OSStatus ret; - - if ((ret = SSLCopyPeerTrust(st->ctx, &trust)) != noErr) - return stransport_error(ret); - - sec_cert = SecTrustGetCertificateAtIndex(trust, 0); - st->der_data = SecCertificateCopyData(sec_cert); - CFRelease(trust); - - if (st->der_data == NULL) { - giterr_set(GITERR_SSL, "retrieved invalid certificate data"); - return -1; - } - - st->cert_info.cert_type = GIT_CERT_X509; - st->cert_info.data = (void *) CFDataGetBytePtr(st->der_data); - st->cert_info.len = CFDataGetLength(st->der_data); - - *out = (git_cert *)&st->cert_info; - return 0; -} - -int stransport_set_proxy(git_stream *stream, const char *proxy) -{ - stransport_stream *st = (stransport_stream *) stream; - - return git_stream_set_proxy(st->io, proxy); -} - -/* - * Contrary to typical network IO callbacks, Secure Transport write callback is - * expected to write *all* passed data, not just as much as it can, and any - * other case would be considered a failure. - * - * This behavior is actually not specified in the Apple documentation, but is - * required for things to work correctly (and incidentally, that's also how - * Apple implements it in its projects at opensource.apple.com). - * - * Libgit2 streams happen to already have this very behavior so this is just - * passthrough. - */ -static OSStatus write_cb(SSLConnectionRef conn, const void *data, size_t *len) -{ - git_stream *io = (git_stream *) conn; - - if (git_stream_write(io, data, *len, 0) < 0) { - return -36; /* "ioErr" from MacErrors.h which is not available on iOS */ - } - - return noErr; -} - -ssize_t stransport_write(git_stream *stream, const char *data, size_t len, int flags) -{ - stransport_stream *st = (stransport_stream *) stream; - size_t data_len, processed; - OSStatus ret; - - GIT_UNUSED(flags); - - data_len = len; - if ((ret = SSLWrite(st->ctx, data, data_len, &processed)) != noErr) - return stransport_error(ret); - - return processed; -} - -/* - * Contrary to typical network IO callbacks, Secure Transport read callback is - * expected to read *exactly* the requested number of bytes, not just as much - * as it can, and any other case would be considered a failure. - * - * This behavior is actually not specified in the Apple documentation, but is - * required for things to work correctly (and incidentally, that's also how - * Apple implements it in its projects at opensource.apple.com). - */ -static OSStatus read_cb(SSLConnectionRef conn, void *data, size_t *len) -{ - git_stream *io = (git_stream *) conn; - OSStatus error = noErr; - size_t off = 0; - ssize_t ret; - - do { - ret = git_stream_read(io, data + off, *len - off); - if (ret < 0) { - error = -36; /* "ioErr" from MacErrors.h which is not available on iOS */ - break; - } - if (ret == 0) { - error = errSSLClosedGraceful; - break; - } - - off += ret; - } while (off < *len); - - *len = off; - return error; -} - -ssize_t stransport_read(git_stream *stream, void *data, size_t len) -{ - stransport_stream *st = (stransport_stream *) stream; - size_t processed; - OSStatus ret; - - if ((ret = SSLRead(st->ctx, data, len, &processed)) != noErr) - return stransport_error(ret); - - return processed; -} - -int stransport_close(git_stream *stream) -{ - stransport_stream *st = (stransport_stream *) stream; - OSStatus ret; - - ret = SSLClose(st->ctx); - if (ret != noErr && ret != errSSLClosedGraceful) - return stransport_error(ret); - - return git_stream_close(st->io); -} - -void stransport_free(git_stream *stream) -{ - stransport_stream *st = (stransport_stream *) stream; - - git_stream_free(st->io); - CFRelease(st->ctx); - if (st->der_data) - CFRelease(st->der_data); - git__free(st); -} - -int git_stransport_stream_new(git_stream **out, const char *host, const char *port) -{ - stransport_stream *st; - int error; - OSStatus ret; - - assert(out && host); - - st = git__calloc(1, sizeof(stransport_stream)); - GITERR_CHECK_ALLOC(st); - -#ifdef GIT_CURL - error = git_curl_stream_new(&st->io, host, port); -#else - error = git_socket_stream_new(&st->io, host, port); -#endif - - if (error < 0){ - git__free(st); - return error; - } - - st->ctx = SSLCreateContext(NULL, kSSLClientSide, kSSLStreamType); - if (!st->ctx) { - giterr_set(GITERR_NET, "failed to create SSL context"); - return -1; - } - - if ((ret = SSLSetIOFuncs(st->ctx, read_cb, write_cb)) != noErr || - (ret = SSLSetConnection(st->ctx, st->io)) != noErr || - (ret = SSLSetSessionOption(st->ctx, kSSLSessionOptionBreakOnServerAuth, true)) != noErr || - (ret = SSLSetProtocolVersionMin(st->ctx, kTLSProtocol1)) != noErr || - (ret = SSLSetProtocolVersionMax(st->ctx, kTLSProtocol12)) != noErr || - (ret = SSLSetPeerDomainName(st->ctx, host, strlen(host))) != noErr) { - git_stream_free((git_stream *)st); - return stransport_error(ret); - } - - st->parent.version = GIT_STREAM_VERSION; - st->parent.encrypted = 1; - st->parent.proxy_support = git_stream_supports_proxy(st->io); - st->parent.connect = stransport_connect; - st->parent.certificate = stransport_certificate; - st->parent.set_proxy = stransport_set_proxy; - st->parent.read = stransport_read; - st->parent.write = stransport_write; - st->parent.close = stransport_close; - st->parent.free = stransport_free; - - *out = (git_stream *) st; - return 0; -} - -#endif diff --git a/vendor/libgit2/src/stransport_stream.h b/vendor/libgit2/src/stransport_stream.h deleted file mode 100644 index 714f90273b..0000000000 --- a/vendor/libgit2/src/stransport_stream.h +++ /dev/null @@ -1,14 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_stransport_stream_h__ -#define INCLUDE_stransport_stream_h__ - -#include "git2/sys/stream.h" - -extern int git_stransport_stream_new(git_stream **out, const char *host, const char *port); - -#endif diff --git a/vendor/libgit2/src/stream.h b/vendor/libgit2/src/stream.h deleted file mode 100644 index 43fcc3045f..0000000000 --- a/vendor/libgit2/src/stream.h +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_stream_h__ -#define INCLUDE_stream_h__ - -#include "common.h" -#include "git2/sys/stream.h" - -GIT_INLINE(int) git_stream_connect(git_stream *st) -{ - return st->connect(st); -} - -GIT_INLINE(int) git_stream_is_encrypted(git_stream *st) -{ - return st->encrypted; -} - -GIT_INLINE(int) git_stream_certificate(git_cert **out, git_stream *st) -{ - if (!st->encrypted) { - giterr_set(GITERR_INVALID, "an unencrypted stream does not have a certificate"); - return -1; - } - - return st->certificate(out, st); -} - -GIT_INLINE(int) git_stream_supports_proxy(git_stream *st) -{ - return st->proxy_support; -} - -GIT_INLINE(int) git_stream_set_proxy(git_stream *st, const char *proxy_url) -{ - if (!st->proxy_support) { - giterr_set(GITERR_INVALID, "proxy not supported on this stream"); - return -1; - } - - return st->set_proxy(st, proxy_url); -} - -GIT_INLINE(ssize_t) git_stream_read(git_stream *st, void *data, size_t len) -{ - return st->read(st, data, len); -} - -GIT_INLINE(ssize_t) git_stream_write(git_stream *st, const char *data, size_t len, int flags) -{ - return st->write(st, data, len, flags); -} - -GIT_INLINE(int) git_stream_close(git_stream *st) -{ - return st->close(st); -} - -GIT_INLINE(void) git_stream_free(git_stream *st) -{ - st->free(st); -} - -#endif diff --git a/vendor/libgit2/src/strmap.c b/vendor/libgit2/src/strmap.c deleted file mode 100644 index b26a13d1f6..0000000000 --- a/vendor/libgit2/src/strmap.c +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#include "strmap.h" - -int git_strmap_next( - void **data, - git_strmap_iter* iter, - git_strmap *map) -{ - if (!map) - return GIT_ERROR; - - while (*iter != git_strmap_end(map)) { - if (!(git_strmap_has_data(map, *iter))) { - ++(*iter); - continue; - } - - *data = git_strmap_value_at(map, *iter); - - ++(*iter); - - return GIT_OK; - } - - return GIT_ITEROVER; -} diff --git a/vendor/libgit2/src/strmap.h b/vendor/libgit2/src/strmap.h deleted file mode 100644 index 5209847447..0000000000 --- a/vendor/libgit2/src/strmap.h +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_strmap_h__ -#define INCLUDE_strmap_h__ - -#include "common.h" - -#define kmalloc git__malloc -#define kcalloc git__calloc -#define krealloc git__realloc -#define kreallocarray git__reallocarray -#define kfree git__free -#include "khash.h" - -__KHASH_TYPE(str, const char *, void *) -typedef khash_t(str) git_strmap; -typedef khiter_t git_strmap_iter; - -#define GIT__USE_STRMAP \ - __KHASH_IMPL(str, static kh_inline, const char *, void *, 1, kh_str_hash_func, kh_str_hash_equal) - -#define git_strmap_alloc(hp) \ - ((*(hp) = kh_init(str)) == NULL) ? giterr_set_oom(), -1 : 0 - -#define git_strmap_free(h) kh_destroy(str, h), h = NULL -#define git_strmap_clear(h) kh_clear(str, h) - -#define git_strmap_num_entries(h) kh_size(h) - -#define git_strmap_lookup_index(h, k) kh_get(str, h, k) -#define git_strmap_valid_index(h, idx) (idx != kh_end(h)) - -#define git_strmap_exists(h, k) (kh_get(str, h, k) != kh_end(h)) -#define git_strmap_has_data(h, idx) kh_exist(h, idx) - -#define git_strmap_key(h, idx) kh_key(h, idx) -#define git_strmap_value_at(h, idx) kh_val(h, idx) -#define git_strmap_set_value_at(h, idx, v) kh_val(h, idx) = v -#define git_strmap_delete_at(h, idx) kh_del(str, h, idx) - -#define git_strmap_insert(h, key, val, rval) do { \ - khiter_t __pos = kh_put(str, h, key, &rval); \ - if (rval >= 0) { \ - if (rval == 0) kh_key(h, __pos) = key; \ - kh_val(h, __pos) = val; \ - } } while (0) - -#define git_strmap_insert2(h, key, val, oldv, rval) do { \ - khiter_t __pos = kh_put(str, h, key, &rval); \ - if (rval >= 0) { \ - if (rval == 0) { \ - oldv = kh_val(h, __pos); \ - kh_key(h, __pos) = key; \ - } else { oldv = NULL; } \ - kh_val(h, __pos) = val; \ - } } while (0) - -#define git_strmap_delete(h, key) do { \ - khiter_t __pos = git_strmap_lookup_index(h, key); \ - if (git_strmap_valid_index(h, __pos)) \ - git_strmap_delete_at(h, __pos); } while (0) - -#define git_strmap_foreach kh_foreach -#define git_strmap_foreach_value kh_foreach_value - -#define git_strmap_begin kh_begin -#define git_strmap_end kh_end - -int git_strmap_next( - void **data, - git_strmap_iter* iter, - git_strmap *map); - -#endif diff --git a/vendor/libgit2/src/strnlen.h b/vendor/libgit2/src/strnlen.h deleted file mode 100644 index eecfe3c02e..0000000000 --- a/vendor/libgit2/src/strnlen.h +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_strlen_h__ -#define INCLUDE_strlen_h__ - -#if defined(__MINGW32__) || defined(__sun) || defined(__APPLE__) || defined(__MidnightBSD__) ||\ - (defined(_MSC_VER) && _MSC_VER < 1500) -# define NO_STRNLEN -#endif - -#ifdef NO_STRNLEN -GIT_INLINE(size_t) p_strnlen(const char *s, size_t maxlen) { - const char *end = memchr(s, 0, maxlen); - return end ? (size_t)(end - s) : maxlen; -} -#else -# define p_strnlen strnlen -#endif - -#endif diff --git a/vendor/libgit2/src/submodule.c b/vendor/libgit2/src/submodule.c deleted file mode 100644 index 3d028747fe..0000000000 --- a/vendor/libgit2/src/submodule.c +++ /dev/null @@ -1,2001 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#include "common.h" -#include "git2/config.h" -#include "git2/sys/config.h" -#include "git2/types.h" -#include "git2/index.h" -#include "buffer.h" -#include "buf_text.h" -#include "vector.h" -#include "posix.h" -#include "config_file.h" -#include "config.h" -#include "repository.h" -#include "submodule.h" -#include "tree.h" -#include "iterator.h" -#include "path.h" -#include "index.h" - -#define GIT_MODULES_FILE ".gitmodules" - -static git_cvar_map _sm_update_map[] = { - {GIT_CVAR_STRING, "checkout", GIT_SUBMODULE_UPDATE_CHECKOUT}, - {GIT_CVAR_STRING, "rebase", GIT_SUBMODULE_UPDATE_REBASE}, - {GIT_CVAR_STRING, "merge", GIT_SUBMODULE_UPDATE_MERGE}, - {GIT_CVAR_STRING, "none", GIT_SUBMODULE_UPDATE_NONE}, - {GIT_CVAR_FALSE, NULL, GIT_SUBMODULE_UPDATE_NONE}, - {GIT_CVAR_TRUE, NULL, GIT_SUBMODULE_UPDATE_CHECKOUT}, -}; - -static git_cvar_map _sm_ignore_map[] = { - {GIT_CVAR_STRING, "none", GIT_SUBMODULE_IGNORE_NONE}, - {GIT_CVAR_STRING, "untracked", GIT_SUBMODULE_IGNORE_UNTRACKED}, - {GIT_CVAR_STRING, "dirty", GIT_SUBMODULE_IGNORE_DIRTY}, - {GIT_CVAR_STRING, "all", GIT_SUBMODULE_IGNORE_ALL}, - {GIT_CVAR_FALSE, NULL, GIT_SUBMODULE_IGNORE_NONE}, - {GIT_CVAR_TRUE, NULL, GIT_SUBMODULE_IGNORE_ALL}, -}; - -static git_cvar_map _sm_recurse_map[] = { - {GIT_CVAR_STRING, "on-demand", GIT_SUBMODULE_RECURSE_ONDEMAND}, - {GIT_CVAR_FALSE, NULL, GIT_SUBMODULE_RECURSE_NO}, - {GIT_CVAR_TRUE, NULL, GIT_SUBMODULE_RECURSE_YES}, -}; - -enum { - CACHE_OK = 0, - CACHE_REFRESH = 1, - CACHE_FLUSH = 2 -}; -enum { - GITMODULES_EXISTING = 0, - GITMODULES_CREATE = 1, -}; - -static kh_inline khint_t str_hash_no_trailing_slash(const char *s) -{ - khint_t h; - - for (h = 0; *s; ++s) - if (s[1] != '\0' || *s != '/') - h = (h << 5) - h + *s; - - return h; -} - -static kh_inline int str_equal_no_trailing_slash(const char *a, const char *b) -{ - size_t alen = a ? strlen(a) : 0; - size_t blen = b ? strlen(b) : 0; - - if (alen > 0 && a[alen - 1] == '/') - alen--; - if (blen > 0 && b[blen - 1] == '/') - blen--; - - return (alen == blen && strncmp(a, b, alen) == 0); -} - -__KHASH_IMPL( - str, static kh_inline, const char *, void *, 1, - str_hash_no_trailing_slash, str_equal_no_trailing_slash) - -static int submodule_alloc(git_submodule **out, git_repository *repo, const char *name); -static git_config_backend *open_gitmodules(git_repository *repo, int gitmod); -static int get_url_base(git_buf *url, git_repository *repo); -static int lookup_head_remote_key(git_buf *remote_key, git_repository *repo); -static int submodule_load_from_config(const git_config_entry *, void *); -static int submodule_load_from_wd_lite(git_submodule *); -static void submodule_get_index_status(unsigned int *, git_submodule *); -static void submodule_get_wd_status(unsigned int *, git_submodule *, git_repository *, git_submodule_ignore_t); -static void submodule_update_from_index_entry(git_submodule *sm, const git_index_entry *ie); -static void submodule_update_from_head_data(git_submodule *sm, mode_t mode, const git_oid *id); - -static int submodule_cmp(const void *a, const void *b) -{ - return strcmp(((git_submodule *)a)->name, ((git_submodule *)b)->name); -} - -static int submodule_config_key_trunc_puts(git_buf *key, const char *suffix) -{ - ssize_t idx = git_buf_rfind(key, '.'); - git_buf_truncate(key, (size_t)(idx + 1)); - return git_buf_puts(key, suffix); -} - -/* - * PUBLIC APIS - */ - -static void submodule_set_lookup_error(int error, const char *name) -{ - if (!error) - return; - - giterr_set(GITERR_SUBMODULE, (error == GIT_ENOTFOUND) ? - "No submodule named '%s'" : - "Submodule '%s' has not been added yet", name); -} - -typedef struct { - const char *path; - char *name; -} fbp_data; - -static int find_by_path(const git_config_entry *entry, void *payload) -{ - fbp_data *data = payload; - - if (!strcmp(entry->value, data->path)) { - const char *fdot, *ldot; - fdot = strchr(entry->name, '.'); - ldot = strrchr(entry->name, '.'); - data->name = git__strndup(fdot + 1, ldot - fdot - 1); - GITERR_CHECK_ALLOC(data->name); - } - - return 0; -} - -int git_submodule_lookup( - git_submodule **out, /* NULL if user only wants to test existence */ - git_repository *repo, - const char *name) /* trailing slash is allowed */ -{ - int error; - unsigned int location; - git_submodule *sm; - - assert(repo && name); - - if ((error = submodule_alloc(&sm, repo, name)) < 0) - return error; - - if ((error = git_submodule_reload(sm, false)) < 0) { - git_submodule_free(sm); - return error; - } - - if ((error = git_submodule_location(&location, sm)) < 0) { - git_submodule_free(sm); - return error; - } - - /* If it's not configured or we're looking by path */ - if (location == 0 || location == GIT_SUBMODULE_STATUS_IN_WD) { - git_config_backend *mods; - const char *pattern = "submodule\\..*\\.path"; - git_buf path = GIT_BUF_INIT; - fbp_data data = { NULL, NULL }; - - git_buf_puts(&path, name); - while (path.ptr[path.size-1] == '/') { - path.ptr[--path.size] = '\0'; - } - data.path = path.ptr; - - mods = open_gitmodules(repo, GITMODULES_EXISTING); - - if (mods) - error = git_config_file_foreach_match(mods, pattern, find_by_path, &data); - - git_config_file_free(mods); - - if (error < 0) { - git_submodule_free(sm); - return error; - } - - if (data.name) { - git__free(sm->name); - sm->name = data.name; - sm->path = git_buf_detach(&path); - - /* Try to load again with the right name */ - if ((error = git_submodule_reload(sm, false)) < 0) { - git_submodule_free(sm); - return error; - } - } - - git_buf_free(&path); - } - - if ((error = git_submodule_location(&location, sm)) < 0) { - git_submodule_free(sm); - return error; - } - - /* If we still haven't found it, do the WD check */ - if (location == 0 || location == GIT_SUBMODULE_STATUS_IN_WD) { - git_submodule_free(sm); - error = GIT_ENOTFOUND; - - /* If it's not configured, we still check if there's a repo at the path */ - if (git_repository_workdir(repo)) { - git_buf path = GIT_BUF_INIT; - if (git_buf_join3(&path, - '/', git_repository_workdir(repo), name, DOT_GIT) < 0) - return -1; - - if (git_path_exists(path.ptr)) - error = GIT_EEXISTS; - - git_buf_free(&path); - } - - submodule_set_lookup_error(error, name); - return error; - } - - if (out) - *out = sm; - else - git_submodule_free(sm); - - return 0; -} - -static void submodule_free_dup(void *sm) -{ - git_submodule_free(sm); -} - -static int submodule_get_or_create(git_submodule **out, git_repository *repo, git_strmap *map, const char *name) -{ - int error = 0; - khiter_t pos; - git_submodule *sm = NULL; - - pos = git_strmap_lookup_index(map, name); - if (git_strmap_valid_index(map, pos)) { - sm = git_strmap_value_at(map, pos); - goto done; - } - - /* if the submodule doesn't exist yet in the map, create it */ - if ((error = submodule_alloc(&sm, repo, name)) < 0) - return error; - - pos = kh_put(str, map, sm->name, &error); - /* nobody can beat us to adding it */ - assert(error != 0); - if (error < 0) { - git_submodule_free(sm); - return error; - } - - git_strmap_set_value_at(map, pos, sm); - -done: - GIT_REFCOUNT_INC(sm); - *out = sm; - return 0; -} - -static int submodules_from_index(git_strmap *map, git_index *idx) -{ - int error; - git_iterator *i; - const git_index_entry *entry; - - if ((error = git_iterator_for_index(&i, idx, 0, NULL, NULL)) < 0) - return error; - - while (!(error = git_iterator_advance(&entry, i))) { - khiter_t pos = git_strmap_lookup_index(map, entry->path); - git_submodule *sm; - - if (git_strmap_valid_index(map, pos)) { - sm = git_strmap_value_at(map, pos); - - if (S_ISGITLINK(entry->mode)) - submodule_update_from_index_entry(sm, entry); - else - sm->flags |= GIT_SUBMODULE_STATUS__INDEX_NOT_SUBMODULE; - } else if (S_ISGITLINK(entry->mode)) { - if (!submodule_get_or_create(&sm, git_index_owner(idx), map, entry->path)) { - submodule_update_from_index_entry(sm, entry); - git_submodule_free(sm); - } - } - } - - if (error == GIT_ITEROVER) - error = 0; - - git_iterator_free(i); - - return error; -} - -static int submodules_from_head(git_strmap *map, git_tree *head) -{ - int error; - git_iterator *i; - const git_index_entry *entry; - - if ((error = git_iterator_for_tree(&i, head, 0, NULL, NULL)) < 0) - return error; - - while (!(error = git_iterator_advance(&entry, i))) { - khiter_t pos = git_strmap_lookup_index(map, entry->path); - git_submodule *sm; - - if (git_strmap_valid_index(map, pos)) { - sm = git_strmap_value_at(map, pos); - - if (S_ISGITLINK(entry->mode)) - submodule_update_from_head_data(sm, entry->mode, &entry->id); - else - sm->flags |= GIT_SUBMODULE_STATUS__HEAD_NOT_SUBMODULE; - } else if (S_ISGITLINK(entry->mode)) { - if (!submodule_get_or_create(&sm, git_tree_owner(head), map, entry->path)) { - submodule_update_from_head_data( - sm, entry->mode, &entry->id); - git_submodule_free(sm); - } - } - } - - if (error == GIT_ITEROVER) - error = 0; - - git_iterator_free(i); - - return error; -} - -/* If have_sm is true, sm is populated, otherwise map an repo are. */ -typedef struct { - int have_sm; - git_submodule *sm; - git_strmap *map; - git_repository *repo; -} lfc_data; - -static int all_submodules(git_repository *repo, git_strmap *map) -{ - int error = 0; - git_index *idx = NULL; - git_tree *head = NULL; - const char *wd = NULL; - git_buf path = GIT_BUF_INIT; - git_submodule *sm; - git_config_backend *mods = NULL; - uint32_t mask; - - assert(repo && map); - - /* get sources that we will need to check */ - if (git_repository_index(&idx, repo) < 0) - giterr_clear(); - if (git_repository_head_tree(&head, repo) < 0) - giterr_clear(); - - wd = git_repository_workdir(repo); - if (wd && (error = git_buf_joinpath(&path, wd, GIT_MODULES_FILE)) < 0) - goto cleanup; - - /* clear submodule flags that are to be refreshed */ - mask = 0; - mask |= GIT_SUBMODULE_STATUS_IN_INDEX | - GIT_SUBMODULE_STATUS__INDEX_FLAGS | - GIT_SUBMODULE_STATUS__INDEX_OID_VALID | - GIT_SUBMODULE_STATUS__INDEX_MULTIPLE_ENTRIES; - - mask |= GIT_SUBMODULE_STATUS_IN_HEAD | - GIT_SUBMODULE_STATUS__HEAD_OID_VALID; - mask |= GIT_SUBMODULE_STATUS_IN_CONFIG; - if (mask != 0) - mask |= GIT_SUBMODULE_STATUS_IN_WD | - GIT_SUBMODULE_STATUS__WD_SCANNED | - GIT_SUBMODULE_STATUS__WD_FLAGS | - GIT_SUBMODULE_STATUS__WD_OID_VALID; - - /* add back submodule information from index */ - if (idx) { - if ((error = submodules_from_index(map, idx)) < 0) - goto cleanup; - } - /* add submodule information from HEAD */ - if (head) { - if ((error = submodules_from_head(map, head)) < 0) - goto cleanup; - } - /* add submodule information from .gitmodules */ - if (wd) { - lfc_data data = { 0 }; - data.map = map; - data.repo = repo; - if ((mods = open_gitmodules(repo, false)) != NULL && - (error = git_config_file_foreach( - mods, submodule_load_from_config, &data)) < 0) - goto cleanup; - } - /* shallow scan submodules in work tree as needed */ - if (wd && mask != 0) { - git_strmap_foreach_value(map, sm, { - submodule_load_from_wd_lite(sm); - }); - } - -cleanup: - git_config_file_free(mods); - /* TODO: if we got an error, mark submodule config as invalid? */ - git_index_free(idx); - git_tree_free(head); - git_buf_free(&path); - return error; -} - -int git_submodule_foreach( - git_repository *repo, - int (*callback)(git_submodule *sm, const char *name, void *payload), - void *payload) -{ - git_vector snapshot = GIT_VECTOR_INIT; - git_strmap *submodules; - git_submodule *sm; - int error; - size_t i; - - if ((error = git_strmap_alloc(&submodules)) < 0) - return error; - - if ((error = all_submodules(repo, submodules)) < 0) - goto done; - - if (!(error = git_vector_init( - &snapshot, kh_size(submodules), submodule_cmp))) { - - git_strmap_foreach_value(submodules, sm, { - if ((error = git_vector_insert(&snapshot, sm)) < 0) - break; - GIT_REFCOUNT_INC(sm); - }); - } - - if (error < 0) - goto done; - - git_vector_uniq(&snapshot, submodule_free_dup); - - git_vector_foreach(&snapshot, i, sm) { - if ((error = callback(sm, sm->name, payload)) != 0) { - giterr_set_after_callback(error); - break; - } - } - -done: - git_vector_foreach(&snapshot, i, sm) - git_submodule_free(sm); - git_vector_free(&snapshot); - - git_strmap_foreach_value(submodules, sm, { - git_submodule_free(sm); - }); - git_strmap_free(submodules); - - return error; -} - -static int submodule_repo_init( - git_repository **out, - git_repository *parent_repo, - const char *path, - const char *url, - bool use_gitlink) -{ - int error = 0; - git_buf workdir = GIT_BUF_INIT, repodir = GIT_BUF_INIT; - git_repository_init_options initopt = GIT_REPOSITORY_INIT_OPTIONS_INIT; - git_repository *subrepo = NULL; - - error = git_buf_joinpath(&workdir, git_repository_workdir(parent_repo), path); - if (error < 0) - goto cleanup; - - initopt.flags = GIT_REPOSITORY_INIT_MKPATH | GIT_REPOSITORY_INIT_NO_REINIT; - initopt.origin_url = url; - - /* init submodule repository and add origin remote as needed */ - - /* New style: sub-repo goes in /modules// with a - * gitlink in the sub-repo workdir directory to that repository - * - * Old style: sub-repo goes directly into repo//.git/ - */ - if (use_gitlink) { - error = git_buf_join3( - &repodir, '/', git_repository_path(parent_repo), "modules", path); - if (error < 0) - goto cleanup; - - initopt.workdir_path = workdir.ptr; - initopt.flags |= - GIT_REPOSITORY_INIT_NO_DOTGIT_DIR | - GIT_REPOSITORY_INIT_RELATIVE_GITLINK; - - error = git_repository_init_ext(&subrepo, repodir.ptr, &initopt); - } else - error = git_repository_init_ext(&subrepo, workdir.ptr, &initopt); - -cleanup: - git_buf_free(&workdir); - git_buf_free(&repodir); - - *out = subrepo; - - return error; -} - -int git_submodule_add_setup( - git_submodule **out, - git_repository *repo, - const char *url, - const char *path, - int use_gitlink) -{ - int error = 0; - git_config_backend *mods = NULL; - git_submodule *sm = NULL; - git_buf name = GIT_BUF_INIT, real_url = GIT_BUF_INIT; - git_repository *subrepo = NULL; - - assert(repo && url && path); - - /* see if there is already an entry for this submodule */ - - if (git_submodule_lookup(NULL, repo, path) < 0) - giterr_clear(); - else { - giterr_set(GITERR_SUBMODULE, - "Attempt to add submodule '%s' that already exists", path); - return GIT_EEXISTS; - } - - /* validate and normalize path */ - - if (git__prefixcmp(path, git_repository_workdir(repo)) == 0) - path += strlen(git_repository_workdir(repo)); - - if (git_path_root(path) >= 0) { - giterr_set(GITERR_SUBMODULE, "Submodule path must be a relative path"); - error = -1; - goto cleanup; - } - - /* update .gitmodules */ - - if (!(mods = open_gitmodules(repo, GITMODULES_CREATE))) { - giterr_set(GITERR_SUBMODULE, - "Adding submodules to a bare repository is not supported"); - return -1; - } - - if ((error = git_buf_printf(&name, "submodule.%s.path", path)) < 0 || - (error = git_config_file_set_string(mods, name.ptr, path)) < 0) - goto cleanup; - - if ((error = submodule_config_key_trunc_puts(&name, "url")) < 0 || - (error = git_config_file_set_string(mods, name.ptr, url)) < 0) - goto cleanup; - - git_buf_clear(&name); - - /* init submodule repository and add origin remote as needed */ - - error = git_buf_joinpath(&name, git_repository_workdir(repo), path); - if (error < 0) - goto cleanup; - - /* if the repo does not already exist, then init a new repo and add it. - * Otherwise, just add the existing repo. - */ - if (!(git_path_exists(name.ptr) && - git_path_contains(&name, DOT_GIT))) { - - /* resolve the actual URL to use */ - if ((error = git_submodule_resolve_url(&real_url, repo, url)) < 0) - goto cleanup; - - if ((error = submodule_repo_init(&subrepo, repo, path, real_url.ptr, use_gitlink)) < 0) - goto cleanup; - } - - if ((error = git_submodule_lookup(&sm, repo, path)) < 0) - goto cleanup; - - error = git_submodule_init(sm, false); - -cleanup: - if (error && sm) { - git_submodule_free(sm); - sm = NULL; - } - if (out != NULL) - *out = sm; - - git_config_file_free(mods); - git_repository_free(subrepo); - git_buf_free(&real_url); - git_buf_free(&name); - - return error; -} - -int git_submodule_repo_init( - git_repository **out, - const git_submodule *sm, - int use_gitlink) -{ - int error; - git_repository *sub_repo = NULL; - const char *configured_url; - git_config *cfg = NULL; - git_buf buf = GIT_BUF_INIT; - - assert(out && sm); - - /* get the configured remote url of the submodule */ - if ((error = git_buf_printf(&buf, "submodule.%s.url", sm->name)) < 0 || - (error = git_repository_config_snapshot(&cfg, sm->repo)) < 0 || - (error = git_config_get_string(&configured_url, cfg, buf.ptr)) < 0 || - (error = submodule_repo_init(&sub_repo, sm->repo, sm->path, configured_url, use_gitlink)) < 0) - goto done; - - *out = sub_repo; - -done: - git_config_free(cfg); - git_buf_free(&buf); - return error; -} - -int git_submodule_add_finalize(git_submodule *sm) -{ - int error; - git_index *index; - - assert(sm); - - if ((error = git_repository_index__weakptr(&index, sm->repo)) < 0 || - (error = git_index_add_bypath(index, GIT_MODULES_FILE)) < 0) - return error; - - return git_submodule_add_to_index(sm, true); -} - -int git_submodule_add_to_index(git_submodule *sm, int write_index) -{ - int error; - git_repository *sm_repo = NULL; - git_index *index; - git_buf path = GIT_BUF_INIT; - git_commit *head; - git_index_entry entry; - struct stat st; - - assert(sm); - - /* force reload of wd OID by git_submodule_open */ - sm->flags = sm->flags & ~GIT_SUBMODULE_STATUS__WD_OID_VALID; - - if ((error = git_repository_index__weakptr(&index, sm->repo)) < 0 || - (error = git_buf_joinpath( - &path, git_repository_workdir(sm->repo), sm->path)) < 0 || - (error = git_submodule_open(&sm_repo, sm)) < 0) - goto cleanup; - - /* read stat information for submodule working directory */ - if (p_stat(path.ptr, &st) < 0) { - giterr_set(GITERR_SUBMODULE, - "Cannot add submodule without working directory"); - error = -1; - goto cleanup; - } - - memset(&entry, 0, sizeof(entry)); - entry.path = sm->path; - git_index_entry__init_from_stat( - &entry, &st, !(git_index_caps(index) & GIT_INDEXCAP_NO_FILEMODE)); - - /* calling git_submodule_open will have set sm->wd_oid if possible */ - if ((sm->flags & GIT_SUBMODULE_STATUS__WD_OID_VALID) == 0) { - giterr_set(GITERR_SUBMODULE, - "Cannot add submodule without HEAD to index"); - error = -1; - goto cleanup; - } - git_oid_cpy(&entry.id, &sm->wd_oid); - - if ((error = git_commit_lookup(&head, sm_repo, &sm->wd_oid)) < 0) - goto cleanup; - - entry.ctime.seconds = git_commit_time(head); - entry.ctime.nanoseconds = 0; - entry.mtime.seconds = git_commit_time(head); - entry.mtime.nanoseconds = 0; - - git_commit_free(head); - - /* add it */ - error = git_index_add(index, &entry); - - /* write it, if requested */ - if (!error && write_index) { - error = git_index_write(index); - - if (!error) - git_oid_cpy(&sm->index_oid, &sm->wd_oid); - } - -cleanup: - git_repository_free(sm_repo); - git_buf_free(&path); - return error; -} - -const char *git_submodule_update_to_str(git_submodule_update_t update) -{ - int i; - for (i = 0; i < (int)ARRAY_SIZE(_sm_update_map); ++i) - if (_sm_update_map[i].map_value == (int)update) - return _sm_update_map[i].str_match; - return NULL; -} - -git_repository *git_submodule_owner(git_submodule *submodule) -{ - assert(submodule); - return submodule->repo; -} - -const char *git_submodule_name(git_submodule *submodule) -{ - assert(submodule); - return submodule->name; -} - -const char *git_submodule_path(git_submodule *submodule) -{ - assert(submodule); - return submodule->path; -} - -const char *git_submodule_url(git_submodule *submodule) -{ - assert(submodule); - return submodule->url; -} - -int git_submodule_resolve_url(git_buf *out, git_repository *repo, const char *url) -{ - int error = 0; - git_buf normalized = GIT_BUF_INIT; - - assert(out && repo && url); - - git_buf_sanitize(out); - - if (strchr(url, '\\')) { - char *p; - if ((error = git_buf_puts(&normalized, url)) < 0) - return error; - - for (p = normalized.ptr; *p; p++) { - if (*p == '\\') - *p = '/'; - } - - url = normalized.ptr; - } - - if (git_path_is_relative(url)) { - if (!(error = get_url_base(out, repo))) - error = git_path_apply_relative(out, url); - } else if (strchr(url, ':') != NULL || url[0] == '/') { - error = git_buf_sets(out, url); - } else { - giterr_set(GITERR_SUBMODULE, "Invalid format for submodule URL"); - error = -1; - } - - git_buf_free(&normalized); - return error; -} - -static int write_var(git_repository *repo, const char *name, const char *var, const char *val) -{ - git_buf key = GIT_BUF_INIT; - git_config_backend *mods; - int error; - - mods = open_gitmodules(repo, GITMODULES_CREATE); - if (!mods) - return -1; - - if ((error = git_buf_printf(&key, "submodule.%s.%s", name, var)) < 0) - goto cleanup; - - if (val) - error = git_config_file_set_string(mods, key.ptr, val); - else - error = git_config_file_delete(mods, key.ptr); - - git_buf_free(&key); - -cleanup: - git_config_file_free(mods); - return error; -} - -static int write_mapped_var(git_repository *repo, const char *name, git_cvar_map *maps, size_t nmaps, const char *var, int ival) -{ - git_cvar_t type; - const char *val; - - if (git_config_lookup_map_enum(&type, &val, maps, nmaps, ival) < 0) { - giterr_set(GITERR_SUBMODULE, "invalid value for %s", var); - return -1; - } - - if (type == GIT_CVAR_TRUE) - val = "true"; - - return write_var(repo, name, var, val); -} - -const char *git_submodule_branch(git_submodule *submodule) -{ - assert(submodule); - return submodule->branch; -} - -int git_submodule_set_branch(git_repository *repo, const char *name, const char *branch) -{ - - assert(repo && name); - - return write_var(repo, name, "branch", branch); -} - -int git_submodule_set_url(git_repository *repo, const char *name, const char *url) -{ - assert(repo && name && url); - - return write_var(repo, name, "url", url); -} - -const git_oid *git_submodule_index_id(git_submodule *submodule) -{ - assert(submodule); - - if (submodule->flags & GIT_SUBMODULE_STATUS__INDEX_OID_VALID) - return &submodule->index_oid; - else - return NULL; -} - -const git_oid *git_submodule_head_id(git_submodule *submodule) -{ - assert(submodule); - - if (submodule->flags & GIT_SUBMODULE_STATUS__HEAD_OID_VALID) - return &submodule->head_oid; - else - return NULL; -} - -const git_oid *git_submodule_wd_id(git_submodule *submodule) -{ - assert(submodule); - - /* load unless we think we have a valid oid */ - if (!(submodule->flags & GIT_SUBMODULE_STATUS__WD_OID_VALID)) { - git_repository *subrepo; - - /* calling submodule open grabs the HEAD OID if possible */ - if (!git_submodule_open_bare(&subrepo, submodule)) - git_repository_free(subrepo); - else - giterr_clear(); - } - - if (submodule->flags & GIT_SUBMODULE_STATUS__WD_OID_VALID) - return &submodule->wd_oid; - else - return NULL; -} - -git_submodule_ignore_t git_submodule_ignore(git_submodule *submodule) -{ - assert(submodule); - return (submodule->ignore < GIT_SUBMODULE_IGNORE_NONE) ? - GIT_SUBMODULE_IGNORE_NONE : submodule->ignore; -} - -int git_submodule_set_ignore(git_repository *repo, const char *name, git_submodule_ignore_t ignore) -{ - assert(repo && name); - - return write_mapped_var(repo, name, _sm_ignore_map, ARRAY_SIZE(_sm_ignore_map), "ignore", ignore); -} - -git_submodule_update_t git_submodule_update_strategy(git_submodule *submodule) -{ - assert(submodule); - return (submodule->update < GIT_SUBMODULE_UPDATE_CHECKOUT) ? - GIT_SUBMODULE_UPDATE_CHECKOUT : submodule->update; -} - -int git_submodule_set_update(git_repository *repo, const char *name, git_submodule_update_t update) -{ - assert(repo && name); - - return write_mapped_var(repo, name, _sm_update_map, ARRAY_SIZE(_sm_update_map), "update", update); -} - -git_submodule_recurse_t git_submodule_fetch_recurse_submodules( - git_submodule *submodule) -{ - assert(submodule); - return submodule->fetch_recurse; -} - -int git_submodule_set_fetch_recurse_submodules(git_repository *repo, const char *name, git_submodule_recurse_t recurse) -{ - assert(repo && name); - - return write_mapped_var(repo, name, _sm_recurse_map, ARRAY_SIZE(_sm_recurse_map), "fetchRecurseSubmodules", recurse); -} - -static int submodule_repo_create( - git_repository **out, - git_repository *parent_repo, - const char *path) -{ - int error = 0; - git_buf workdir = GIT_BUF_INIT, repodir = GIT_BUF_INIT; - git_repository_init_options initopt = GIT_REPOSITORY_INIT_OPTIONS_INIT; - git_repository *subrepo = NULL; - - initopt.flags = - GIT_REPOSITORY_INIT_MKPATH | - GIT_REPOSITORY_INIT_NO_REINIT | - GIT_REPOSITORY_INIT_NO_DOTGIT_DIR | - GIT_REPOSITORY_INIT_RELATIVE_GITLINK; - - /* Workdir: path to sub-repo working directory */ - error = git_buf_joinpath(&workdir, git_repository_workdir(parent_repo), path); - if (error < 0) - goto cleanup; - - initopt.workdir_path = workdir.ptr; - - /** - * Repodir: path to the sub-repo. sub-repo goes in: - * /modules// with a gitlink in the - * sub-repo workdir directory to that repository. - */ - error = git_buf_join3( - &repodir, '/', git_repository_path(parent_repo), "modules", path); - if (error < 0) - goto cleanup; - - error = git_repository_init_ext(&subrepo, repodir.ptr, &initopt); - -cleanup: - git_buf_free(&workdir); - git_buf_free(&repodir); - - *out = subrepo; - - return error; -} - -/** - * Callback to override sub-repository creation when - * cloning a sub-repository. - */ -static int git_submodule_update_repo_init_cb( - git_repository **out, - const char *path, - int bare, - void *payload) -{ - git_submodule *sm; - - GIT_UNUSED(bare); - - sm = payload; - - return submodule_repo_create(out, sm->repo, path); -} - -int git_submodule_update_init_options(git_submodule_update_options *opts, unsigned int version) -{ - GIT_INIT_STRUCTURE_FROM_TEMPLATE( - opts, version, git_submodule_update_options, GIT_SUBMODULE_UPDATE_OPTIONS_INIT); - return 0; -} - -int git_submodule_update(git_submodule *sm, int init, git_submodule_update_options *_update_options) -{ - int error; - unsigned int submodule_status; - git_config *config = NULL; - const char *submodule_url; - git_repository *sub_repo = NULL; - git_remote *remote = NULL; - git_object *target_commit = NULL; - git_buf buf = GIT_BUF_INIT; - git_submodule_update_options update_options = GIT_SUBMODULE_UPDATE_OPTIONS_INIT; - git_clone_options clone_options = GIT_CLONE_OPTIONS_INIT; - - assert(sm); - - if (_update_options) - memcpy(&update_options, _update_options, sizeof(git_submodule_update_options)); - - GITERR_CHECK_VERSION(&update_options, GIT_SUBMODULE_UPDATE_OPTIONS_VERSION, "git_submodule_update_options"); - - /* Copy over the remote callbacks */ - memcpy(&clone_options.fetch_opts, &update_options.fetch_opts, sizeof(git_fetch_options)); - - /* Get the status of the submodule to determine if it is already initialized */ - if ((error = git_submodule_status(&submodule_status, sm->repo, sm->name, GIT_SUBMODULE_IGNORE_UNSPECIFIED)) < 0) - goto done; - - /* - * If submodule work dir is not already initialized, check to see - * what we need to do (initialize, clone, return error...) - */ - if (submodule_status & GIT_SUBMODULE_STATUS_WD_UNINITIALIZED) { - /* - * Work dir is not initialized, check to see if the submodule - * info has been copied into .git/config - */ - if ((error = git_repository_config_snapshot(&config, sm->repo)) < 0 || - (error = git_buf_printf(&buf, "submodule.%s.url", git_submodule_name(sm))) < 0) - goto done; - - if ((error = git_config_get_string(&submodule_url, config, git_buf_cstr(&buf))) < 0) { - /* - * If the error is not "not found" or if it is "not found" and we are not - * initializing the submodule, then return error. - */ - if (error != GIT_ENOTFOUND) - goto done; - - if (error == GIT_ENOTFOUND && !init) { - giterr_set(GITERR_SUBMODULE, "Submodule is not initialized."); - error = GIT_ERROR; - goto done; - } - - /* The submodule has not been initialized yet - initialize it now.*/ - if ((error = git_submodule_init(sm, 0)) < 0) - goto done; - - git_config_free(config); - config = NULL; - - if ((error = git_repository_config_snapshot(&config, sm->repo)) < 0 || - (error = git_config_get_string(&submodule_url, config, git_buf_cstr(&buf))) < 0) - goto done; - } - - /** submodule is initialized - now clone it **/ - /* override repo creation */ - clone_options.repository_cb = git_submodule_update_repo_init_cb; - clone_options.repository_cb_payload = sm; - - /* - * Do not perform checkout as part of clone, instead we - * will checkout the specific commit manually. - */ - clone_options.checkout_opts.checkout_strategy = GIT_CHECKOUT_NONE; - update_options.checkout_opts.checkout_strategy = update_options.clone_checkout_strategy; - - if ((error = git_clone(&sub_repo, submodule_url, sm->path, &clone_options)) < 0 || - (error = git_repository_set_head_detached(sub_repo, git_submodule_index_id(sm))) < 0 || - (error = git_checkout_head(sub_repo, &update_options.checkout_opts)) != 0) - goto done; - } else { - /** - * Work dir is initialized - look up the commit in the parent repository's index, - * update the workdir contents of the subrepository, and set the subrepository's - * head to the new commit. - */ - if ((error = git_submodule_open(&sub_repo, sm)) < 0 || - (error = git_object_lookup(&target_commit, sub_repo, git_submodule_index_id(sm), GIT_OBJ_COMMIT)) < 0 || - (error = git_checkout_tree(sub_repo, target_commit, &update_options.checkout_opts)) != 0 || - (error = git_repository_set_head_detached(sub_repo, git_submodule_index_id(sm))) < 0) - goto done; - - /* Invalidate the wd flags as the workdir has been updated. */ - sm->flags = sm->flags & - ~(GIT_SUBMODULE_STATUS_IN_WD | - GIT_SUBMODULE_STATUS__WD_OID_VALID | - GIT_SUBMODULE_STATUS__WD_SCANNED); - } - -done: - git_buf_free(&buf); - git_config_free(config); - git_object_free(target_commit); - git_remote_free(remote); - git_repository_free(sub_repo); - - return error; -} - -int git_submodule_init(git_submodule *sm, int overwrite) -{ - int error; - const char *val; - git_buf key = GIT_BUF_INIT, effective_submodule_url = GIT_BUF_INIT; - git_config *cfg = NULL; - - if (!sm->url) { - giterr_set(GITERR_SUBMODULE, - "No URL configured for submodule '%s'", sm->name); - return -1; - } - - if ((error = git_repository_config(&cfg, sm->repo)) < 0) - return error; - - /* write "submodule.NAME.url" */ - - if ((error = git_submodule_resolve_url(&effective_submodule_url, sm->repo, sm->url)) < 0 || - (error = git_buf_printf(&key, "submodule.%s.url", sm->name)) < 0 || - (error = git_config__update_entry( - cfg, key.ptr, effective_submodule_url.ptr, overwrite != 0, false)) < 0) - goto cleanup; - - /* write "submodule.NAME.update" if not default */ - - val = (sm->update == GIT_SUBMODULE_UPDATE_CHECKOUT) ? - NULL : git_submodule_update_to_str(sm->update); - - if ((error = git_buf_printf(&key, "submodule.%s.update", sm->name)) < 0 || - (error = git_config__update_entry( - cfg, key.ptr, val, overwrite != 0, false)) < 0) - goto cleanup; - - /* success */ - -cleanup: - git_config_free(cfg); - git_buf_free(&key); - git_buf_free(&effective_submodule_url); - - return error; -} - -int git_submodule_sync(git_submodule *sm) -{ - int error = 0; - git_config *cfg = NULL; - git_buf key = GIT_BUF_INIT; - git_repository *smrepo = NULL; - - if (!sm->url) { - giterr_set(GITERR_SUBMODULE, - "No URL configured for submodule '%s'", sm->name); - return -1; - } - - /* copy URL over to config only if it already exists */ - - if (!(error = git_repository_config__weakptr(&cfg, sm->repo)) && - !(error = git_buf_printf(&key, "submodule.%s.url", sm->name))) - error = git_config__update_entry(cfg, key.ptr, sm->url, true, true); - - /* if submodule exists in the working directory, update remote url */ - - if (!error && - (sm->flags & GIT_SUBMODULE_STATUS_IN_WD) != 0 && - !(error = git_submodule_open(&smrepo, sm))) - { - git_buf remote_name = GIT_BUF_INIT; - - if ((error = git_repository_config__weakptr(&cfg, smrepo)) < 0) - /* return error from reading submodule config */; - else if ((error = lookup_head_remote_key(&remote_name, smrepo)) < 0) { - giterr_clear(); - error = git_buf_sets(&key, "remote.origin.url"); - } else { - error = git_buf_join3( - &key, '.', "remote", remote_name.ptr, "url"); - git_buf_free(&remote_name); - } - - if (!error) - error = git_config__update_entry(cfg, key.ptr, sm->url, true, false); - - git_repository_free(smrepo); - } - - git_buf_free(&key); - - return error; -} - -static int git_submodule__open( - git_repository **subrepo, git_submodule *sm, bool bare) -{ - int error; - git_buf path = GIT_BUF_INIT; - unsigned int flags = GIT_REPOSITORY_OPEN_NO_SEARCH; - const char *wd; - - assert(sm && subrepo); - - if (git_repository__ensure_not_bare( - sm->repo, "open submodule repository") < 0) - return GIT_EBAREREPO; - - wd = git_repository_workdir(sm->repo); - - if (git_buf_joinpath(&path, wd, sm->path) < 0 || - git_buf_joinpath(&path, path.ptr, DOT_GIT) < 0) - return -1; - - sm->flags = sm->flags & - ~(GIT_SUBMODULE_STATUS_IN_WD | - GIT_SUBMODULE_STATUS__WD_OID_VALID | - GIT_SUBMODULE_STATUS__WD_SCANNED); - - if (bare) - flags |= GIT_REPOSITORY_OPEN_BARE; - - error = git_repository_open_ext(subrepo, path.ptr, flags, wd); - - /* if we opened the submodule successfully, grab HEAD OID, etc. */ - if (!error) { - sm->flags |= GIT_SUBMODULE_STATUS_IN_WD | - GIT_SUBMODULE_STATUS__WD_SCANNED; - - if (!git_reference_name_to_id(&sm->wd_oid, *subrepo, GIT_HEAD_FILE)) - sm->flags |= GIT_SUBMODULE_STATUS__WD_OID_VALID; - else - giterr_clear(); - } else if (git_path_exists(path.ptr)) { - sm->flags |= GIT_SUBMODULE_STATUS__WD_SCANNED | - GIT_SUBMODULE_STATUS_IN_WD; - } else { - git_buf_rtruncate_at_char(&path, '/'); /* remove "/.git" */ - - if (git_path_isdir(path.ptr)) - sm->flags |= GIT_SUBMODULE_STATUS__WD_SCANNED; - } - - git_buf_free(&path); - - return error; -} - -int git_submodule_open_bare(git_repository **subrepo, git_submodule *sm) -{ - return git_submodule__open(subrepo, sm, true); -} - -int git_submodule_open(git_repository **subrepo, git_submodule *sm) -{ - return git_submodule__open(subrepo, sm, false); -} - -static void submodule_update_from_index_entry( - git_submodule *sm, const git_index_entry *ie) -{ - bool already_found = (sm->flags & GIT_SUBMODULE_STATUS_IN_INDEX) != 0; - - if (!S_ISGITLINK(ie->mode)) { - if (!already_found) - sm->flags |= GIT_SUBMODULE_STATUS__INDEX_NOT_SUBMODULE; - } else { - if (already_found) - sm->flags |= GIT_SUBMODULE_STATUS__INDEX_MULTIPLE_ENTRIES; - else - git_oid_cpy(&sm->index_oid, &ie->id); - - sm->flags |= GIT_SUBMODULE_STATUS_IN_INDEX | - GIT_SUBMODULE_STATUS__INDEX_OID_VALID; - } -} - -static int submodule_update_index(git_submodule *sm) -{ - git_index *index; - const git_index_entry *ie; - - if (git_repository_index__weakptr(&index, sm->repo) < 0) - return -1; - - sm->flags = sm->flags & - ~(GIT_SUBMODULE_STATUS_IN_INDEX | - GIT_SUBMODULE_STATUS__INDEX_OID_VALID); - - if (!(ie = git_index_get_bypath(index, sm->path, 0))) - return 0; - - submodule_update_from_index_entry(sm, ie); - - return 0; -} - -static void submodule_update_from_head_data( - git_submodule *sm, mode_t mode, const git_oid *id) -{ - if (!S_ISGITLINK(mode)) - sm->flags |= GIT_SUBMODULE_STATUS__HEAD_NOT_SUBMODULE; - else { - git_oid_cpy(&sm->head_oid, id); - - sm->flags |= GIT_SUBMODULE_STATUS_IN_HEAD | - GIT_SUBMODULE_STATUS__HEAD_OID_VALID; - } -} - -static int submodule_update_head(git_submodule *submodule) -{ - git_tree *head = NULL; - git_tree_entry *te = NULL; - - submodule->flags = submodule->flags & - ~(GIT_SUBMODULE_STATUS_IN_HEAD | - GIT_SUBMODULE_STATUS__HEAD_OID_VALID); - - /* if we can't look up file in current head, then done */ - if (git_repository_head_tree(&head, submodule->repo) < 0 || - git_tree_entry_bypath(&te, head, submodule->path) < 0) - giterr_clear(); - else - submodule_update_from_head_data(submodule, te->attr, &te->oid); - - git_tree_entry_free(te); - git_tree_free(head); - return 0; -} - - -int git_submodule_reload(git_submodule *sm, int force) -{ - int error = 0; - git_config_backend *mods; - lfc_data data = { 0 }; - - GIT_UNUSED(force); - - assert(sm); - - /* refresh index data */ - if ((error = submodule_update_index(sm)) < 0) - return error; - - /* refresh HEAD tree data */ - if ((error = submodule_update_head(sm)) < 0) - return error; - - /* done if bare */ - if (git_repository_is_bare(sm->repo)) - return error; - - /* refresh config data */ - mods = open_gitmodules(sm->repo, GITMODULES_EXISTING); - if (mods != NULL) { - git_buf path = GIT_BUF_INIT; - - git_buf_sets(&path, "submodule\\."); - git_buf_text_puts_escape_regex(&path, sm->name); - git_buf_puts(&path, "\\..*"); - - if (git_buf_oom(&path)) { - error = -1; - } else { - data.have_sm = 1; - data.sm = sm; - error = git_config_file_foreach_match( - mods, path.ptr, submodule_load_from_config, &data); - } - - git_buf_free(&path); - git_config_file_free(mods); - - if (error < 0) - return error; - } - - /* refresh wd data */ - sm->flags &= - ~(GIT_SUBMODULE_STATUS_IN_WD | GIT_SUBMODULE_STATUS__WD_OID_VALID | - GIT_SUBMODULE_STATUS__WD_FLAGS); - - return submodule_load_from_wd_lite(sm); -} - -static void submodule_copy_oid_maybe( - git_oid *tgt, const git_oid *src, bool valid) -{ - if (tgt) { - if (valid) - memcpy(tgt, src, sizeof(*tgt)); - else - memset(tgt, 0, sizeof(*tgt)); - } -} - -int git_submodule__status( - unsigned int *out_status, - git_oid *out_head_id, - git_oid *out_index_id, - git_oid *out_wd_id, - git_submodule *sm, - git_submodule_ignore_t ign) -{ - unsigned int status; - git_repository *smrepo = NULL; - - if (ign == GIT_SUBMODULE_IGNORE_UNSPECIFIED) - ign = sm->ignore; - - /* only return location info if ignore == all */ - if (ign == GIT_SUBMODULE_IGNORE_ALL) { - *out_status = (sm->flags & GIT_SUBMODULE_STATUS__IN_FLAGS); - return 0; - } - - /* refresh the index OID */ - if (submodule_update_index(sm) < 0) - return -1; - - /* refresh the HEAD OID */ - if (submodule_update_head(sm) < 0) - return -1; - - /* for ignore == dirty, don't scan the working directory */ - if (ign == GIT_SUBMODULE_IGNORE_DIRTY) { - /* git_submodule_open_bare will load WD OID data */ - if (git_submodule_open_bare(&smrepo, sm) < 0) - giterr_clear(); - else - git_repository_free(smrepo); - smrepo = NULL; - } else if (git_submodule_open(&smrepo, sm) < 0) { - giterr_clear(); - smrepo = NULL; - } - - status = GIT_SUBMODULE_STATUS__CLEAR_INTERNAL(sm->flags); - - submodule_get_index_status(&status, sm); - submodule_get_wd_status(&status, sm, smrepo, ign); - - git_repository_free(smrepo); - - *out_status = status; - - submodule_copy_oid_maybe(out_head_id, &sm->head_oid, - (sm->flags & GIT_SUBMODULE_STATUS__HEAD_OID_VALID) != 0); - submodule_copy_oid_maybe(out_index_id, &sm->index_oid, - (sm->flags & GIT_SUBMODULE_STATUS__INDEX_OID_VALID) != 0); - submodule_copy_oid_maybe(out_wd_id, &sm->wd_oid, - (sm->flags & GIT_SUBMODULE_STATUS__WD_OID_VALID) != 0); - - return 0; -} - -int git_submodule_status(unsigned int *status, git_repository *repo, const char *name, git_submodule_ignore_t ignore) -{ - git_submodule *sm; - int error; - - assert(status && repo && name); - - if ((error = git_submodule_lookup(&sm, repo, name)) < 0) - return error; - - error = git_submodule__status(status, NULL, NULL, NULL, sm, ignore); - git_submodule_free(sm); - - return error; -} - -int git_submodule_location(unsigned int *location, git_submodule *sm) -{ - assert(location && sm); - - return git_submodule__status( - location, NULL, NULL, NULL, sm, GIT_SUBMODULE_IGNORE_ALL); -} - - -/* - * INTERNAL FUNCTIONS - */ - -static int submodule_alloc( - git_submodule **out, git_repository *repo, const char *name) -{ - size_t namelen; - git_submodule *sm; - - if (!name || !(namelen = strlen(name))) { - giterr_set(GITERR_SUBMODULE, "Invalid submodule name"); - return -1; - } - - sm = git__calloc(1, sizeof(git_submodule)); - GITERR_CHECK_ALLOC(sm); - - sm->name = sm->path = git__strdup(name); - if (!sm->name) { - git__free(sm); - return -1; - } - - GIT_REFCOUNT_INC(sm); - sm->ignore = sm->ignore_default = GIT_SUBMODULE_IGNORE_NONE; - sm->update = sm->update_default = GIT_SUBMODULE_UPDATE_CHECKOUT; - sm->fetch_recurse = sm->fetch_recurse_default = GIT_SUBMODULE_RECURSE_NO; - sm->repo = repo; - sm->branch = NULL; - - *out = sm; - return 0; -} - -static void submodule_release(git_submodule *sm) -{ - if (!sm) - return; - - if (sm->repo) { - sm->repo = NULL; - } - - if (sm->path != sm->name) - git__free(sm->path); - git__free(sm->name); - git__free(sm->url); - git__free(sm->branch); - git__memzero(sm, sizeof(*sm)); - git__free(sm); -} - -void git_submodule_free(git_submodule *sm) -{ - if (!sm) - return; - GIT_REFCOUNT_DEC(sm, submodule_release); -} - -static int submodule_config_error(const char *property, const char *value) -{ - giterr_set(GITERR_INVALID, - "Invalid value for submodule '%s' property: '%s'", property, value); - return -1; -} - -int git_submodule_parse_ignore(git_submodule_ignore_t *out, const char *value) -{ - int val; - - if (git_config_lookup_map_value( - &val, _sm_ignore_map, ARRAY_SIZE(_sm_ignore_map), value) < 0) { - *out = GIT_SUBMODULE_IGNORE_NONE; - return submodule_config_error("ignore", value); - } - - *out = (git_submodule_ignore_t)val; - return 0; -} - -int git_submodule_parse_update(git_submodule_update_t *out, const char *value) -{ - int val; - - if (git_config_lookup_map_value( - &val, _sm_update_map, ARRAY_SIZE(_sm_update_map), value) < 0) { - *out = GIT_SUBMODULE_UPDATE_CHECKOUT; - return submodule_config_error("update", value); - } - - *out = (git_submodule_update_t)val; - return 0; -} - -int git_submodule_parse_recurse(git_submodule_recurse_t *out, const char *value) -{ - int val; - - if (git_config_lookup_map_value( - &val, _sm_recurse_map, ARRAY_SIZE(_sm_recurse_map), value) < 0) { - *out = GIT_SUBMODULE_RECURSE_YES; - return submodule_config_error("recurse", value); - } - - *out = (git_submodule_recurse_t)val; - return 0; -} - -static int submodule_load_from_config( - const git_config_entry *entry, void *payload) -{ - const char *namestart, *property; - const char *key = entry->name, *value = entry->value, *path; - char *alternate = NULL, *replaced = NULL; - git_buf name = GIT_BUF_INIT; - lfc_data *data = payload; - git_submodule *sm; - int error = 0; - - if (git__prefixcmp(key, "submodule.") != 0) - return 0; - - namestart = key + strlen("submodule."); - property = strrchr(namestart, '.'); - - if (!property || (property == namestart)) - return 0; - - property++; - path = !strcasecmp(property, "path") ? value : NULL; - - if ((error = git_buf_set(&name, namestart, property - namestart -1)) < 0) - goto done; - - if (data->have_sm) { - sm = data->sm; - } else { - khiter_t pos; - git_strmap *map = data->map; - pos = git_strmap_lookup_index(map, path ? path : name.ptr); - if (git_strmap_valid_index(map, pos)) { - sm = git_strmap_value_at(map, pos); - } else { - if ((error = submodule_alloc(&sm, data->repo, name.ptr)) < 0) - goto done; - - git_strmap_insert(map, sm->name, sm, error); - assert(error != 0); - if (error < 0) - goto done; - error = 0; - } - } - - sm->flags |= GIT_SUBMODULE_STATUS_IN_CONFIG; - - /* Only from config might we get differing names & paths. If so, then - * update the submodule and insert under the alternative key. - */ - - /* TODO: if case insensitive filesystem, then the following strcmps - * should be strcasecmp - */ - - if (strcmp(sm->name, name.ptr) != 0) { /* name changed */ - if (sm->path && !strcmp(sm->path, name.ptr)) { /* already set as path */ - replaced = sm->name; - sm->name = sm->path; - } else { - if (sm->name != sm->path) - replaced = sm->name; - alternate = sm->name = git_buf_detach(&name); - } - } - else if (path && strcmp(path, sm->path) != 0) { /* path changed */ - if (!strcmp(sm->name, value)) { /* already set as name */ - replaced = sm->path; - sm->path = sm->name; - } else { - if (sm->path != sm->name) - replaced = sm->path; - if ((alternate = git__strdup(value)) == NULL) { - error = -1; - goto done; - } - sm->path = alternate; - } - } - - /* Deregister under name being replaced */ - if (replaced) { - git__free(replaced); - } - - /* TODO: Look up path in index and if it is present but not a GITLINK - * then this should be deleted (at least to match git's behavior) - */ - - if (path) - goto done; - - /* copy other properties into submodule entry */ - if (strcasecmp(property, "url") == 0) { - git__free(sm->url); - sm->url = NULL; - - if (value != NULL && (sm->url = git__strdup(value)) == NULL) { - error = -1; - goto done; - } - } - else if (strcasecmp(property, "branch") == 0) { - git__free(sm->branch); - sm->branch = NULL; - - if (value != NULL && (sm->branch = git__strdup(value)) == NULL) { - error = -1; - goto done; - } - } - else if (strcasecmp(property, "update") == 0) { - if ((error = git_submodule_parse_update(&sm->update, value)) < 0) - goto done; - sm->update_default = sm->update; - } - else if (strcasecmp(property, "fetchRecurseSubmodules") == 0) { - if ((error = git_submodule_parse_recurse(&sm->fetch_recurse, value)) < 0) - goto done; - sm->fetch_recurse_default = sm->fetch_recurse; - } - else if (strcasecmp(property, "ignore") == 0) { - if ((error = git_submodule_parse_ignore(&sm->ignore, value)) < 0) - goto done; - sm->ignore_default = sm->ignore; - } - /* ignore other unknown submodule properties */ - -done: - git_buf_free(&name); - return error; -} - -static int submodule_load_from_wd_lite(git_submodule *sm) -{ - git_buf path = GIT_BUF_INIT; - - if (git_buf_joinpath(&path, git_repository_workdir(sm->repo), sm->path) < 0) - return -1; - - if (git_path_isdir(path.ptr)) - sm->flags |= GIT_SUBMODULE_STATUS__WD_SCANNED; - - if (git_path_contains(&path, DOT_GIT)) - sm->flags |= GIT_SUBMODULE_STATUS_IN_WD; - - git_buf_free(&path); - return 0; -} - -static git_config_backend *open_gitmodules( - git_repository *repo, - int okay_to_create) -{ - const char *workdir = git_repository_workdir(repo); - git_buf path = GIT_BUF_INIT; - git_config_backend *mods = NULL; - - if (workdir != NULL) { - if (git_buf_joinpath(&path, workdir, GIT_MODULES_FILE) != 0) - return NULL; - - if (okay_to_create || git_path_isfile(path.ptr)) { - /* git_config_file__ondisk should only fail if OOM */ - if (git_config_file__ondisk(&mods, path.ptr) < 0) - mods = NULL; - /* open should only fail here if the file is malformed */ - else if (git_config_file_open(mods, GIT_CONFIG_LEVEL_LOCAL) < 0) { - git_config_file_free(mods); - mods = NULL; - } - } - } - - git_buf_free(&path); - - return mods; -} - -/* Lookup name of remote of the local tracking branch HEAD points to */ -static int lookup_head_remote_key(git_buf *remote_name, git_repository *repo) -{ - int error; - git_reference *head = NULL; - git_buf upstream_name = GIT_BUF_INIT; - - /* lookup and dereference HEAD */ - if ((error = git_repository_head(&head, repo)) < 0) - return error; - - /** - * If head does not refer to a branch, then return - * GIT_ENOTFOUND to indicate that we could not find - * a remote key for the local tracking branch HEAD points to. - **/ - if (!git_reference_is_branch(head)) { - giterr_set(GITERR_INVALID, - "HEAD does not refer to a branch."); - error = GIT_ENOTFOUND; - goto done; - } - - /* lookup remote tracking branch of HEAD */ - if ((error = git_branch_upstream_name( - &upstream_name, - repo, - git_reference_name(head))) < 0) - goto done; - - /* lookup remote of remote tracking branch */ - if ((error = git_branch_remote_name(remote_name, repo, upstream_name.ptr)) < 0) - goto done; - -done: - git_buf_free(&upstream_name); - git_reference_free(head); - - return error; -} - -/* Lookup the remote of the local tracking branch HEAD points to */ -static int lookup_head_remote(git_remote **remote, git_repository *repo) -{ - int error; - git_buf remote_name = GIT_BUF_INIT; - - /* lookup remote of remote tracking branch name */ - if (!(error = lookup_head_remote_key(&remote_name, repo))) - error = git_remote_lookup(remote, repo, remote_name.ptr); - - git_buf_free(&remote_name); - - return error; -} - -/* Lookup remote, either from HEAD or fall back on origin */ -static int lookup_default_remote(git_remote **remote, git_repository *repo) -{ - int error = lookup_head_remote(remote, repo); - - /* if that failed, use 'origin' instead */ - if (error == GIT_ENOTFOUND) - error = git_remote_lookup(remote, repo, "origin"); - - if (error == GIT_ENOTFOUND) - giterr_set( - GITERR_SUBMODULE, - "Cannot get default remote for submodule - no local tracking " - "branch for HEAD and origin does not exist"); - - return error; -} - -static int get_url_base(git_buf *url, git_repository *repo) -{ - int error; - git_remote *remote = NULL; - - if (!(error = lookup_default_remote(&remote, repo))) { - error = git_buf_sets(url, git_remote_url(remote)); - git_remote_free(remote); - } - else if (error == GIT_ENOTFOUND) { - /* if repository does not have a default remote, use workdir instead */ - giterr_clear(); - error = git_buf_sets(url, git_repository_workdir(repo)); - } - - return error; -} - -static void submodule_get_index_status(unsigned int *status, git_submodule *sm) -{ - const git_oid *head_oid = git_submodule_head_id(sm); - const git_oid *index_oid = git_submodule_index_id(sm); - - *status = *status & ~GIT_SUBMODULE_STATUS__INDEX_FLAGS; - - if (!head_oid) { - if (index_oid) - *status |= GIT_SUBMODULE_STATUS_INDEX_ADDED; - } - else if (!index_oid) - *status |= GIT_SUBMODULE_STATUS_INDEX_DELETED; - else if (!git_oid_equal(head_oid, index_oid)) - *status |= GIT_SUBMODULE_STATUS_INDEX_MODIFIED; -} - - -static void submodule_get_wd_status( - unsigned int *status, - git_submodule *sm, - git_repository *sm_repo, - git_submodule_ignore_t ign) -{ - const git_oid *index_oid = git_submodule_index_id(sm); - const git_oid *wd_oid = - (sm->flags & GIT_SUBMODULE_STATUS__WD_OID_VALID) ? &sm->wd_oid : NULL; - git_tree *sm_head = NULL; - git_index *index = NULL; - git_diff_options opt = GIT_DIFF_OPTIONS_INIT; - git_diff *diff; - - *status = *status & ~GIT_SUBMODULE_STATUS__WD_FLAGS; - - if (!index_oid) { - if (wd_oid) - *status |= GIT_SUBMODULE_STATUS_WD_ADDED; - } - else if (!wd_oid) { - if ((sm->flags & GIT_SUBMODULE_STATUS__WD_SCANNED) != 0 && - (sm->flags & GIT_SUBMODULE_STATUS_IN_WD) == 0) - *status |= GIT_SUBMODULE_STATUS_WD_UNINITIALIZED; - else - *status |= GIT_SUBMODULE_STATUS_WD_DELETED; - } - else if (!git_oid_equal(index_oid, wd_oid)) - *status |= GIT_SUBMODULE_STATUS_WD_MODIFIED; - - /* if we have no repo, then we're done */ - if (!sm_repo) - return; - - /* the diffs below could be optimized with an early termination - * option to the git_diff functions, but for now this is sufficient - * (and certainly no worse that what core git does). - */ - - if (ign == GIT_SUBMODULE_IGNORE_NONE) - opt.flags |= GIT_DIFF_INCLUDE_UNTRACKED; - - (void)git_repository_index__weakptr(&index, sm_repo); - - /* if we don't have an unborn head, check diff with index */ - if (git_repository_head_tree(&sm_head, sm_repo) < 0) - giterr_clear(); - else { - /* perform head to index diff on submodule */ - if (git_diff_tree_to_index(&diff, sm_repo, sm_head, index, &opt) < 0) - giterr_clear(); - else { - if (git_diff_num_deltas(diff) > 0) - *status |= GIT_SUBMODULE_STATUS_WD_INDEX_MODIFIED; - git_diff_free(diff); - diff = NULL; - } - - git_tree_free(sm_head); - } - - /* perform index-to-workdir diff on submodule */ - if (git_diff_index_to_workdir(&diff, sm_repo, index, &opt) < 0) - giterr_clear(); - else { - size_t untracked = - git_diff_num_deltas_of_type(diff, GIT_DELTA_UNTRACKED); - - if (untracked > 0) - *status |= GIT_SUBMODULE_STATUS_WD_UNTRACKED; - - if (git_diff_num_deltas(diff) != untracked) - *status |= GIT_SUBMODULE_STATUS_WD_WD_MODIFIED; - - git_diff_free(diff); - diff = NULL; - } -} diff --git a/vendor/libgit2/src/submodule.h b/vendor/libgit2/src/submodule.h deleted file mode 100644 index 2ef2031b35..0000000000 --- a/vendor/libgit2/src/submodule.h +++ /dev/null @@ -1,146 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_submodule_h__ -#define INCLUDE_submodule_h__ - -#include "git2/submodule.h" -#include "git2/repository.h" -#include "fileops.h" - -/* Notes: - * - * Submodule information can be in four places: the index, the config files - * (both .git/config and .gitmodules), the HEAD tree, and the working - * directory. - * - * In the index: - * - submodule is found by path - * - may be missing, present, or of the wrong type - * - will have an oid if present - * - * In the HEAD tree: - * - submodule is found by path - * - may be missing, present, or of the wrong type - * - will have an oid if present - * - * In the config files: - * - submodule is found by submodule "name" which is usually the path - * - may be missing or present - * - will have a name, path, url, and other properties - * - * In the working directory: - * - submodule is found by path - * - may be missing, an empty directory, a checked out directory, - * or of the wrong type - * - if checked out, will have a HEAD oid - * - if checked out, will have git history that can be used to compare oids - * - if checked out, may have modified files and/or untracked files - */ - -/** - * Description of submodule - * - * This record describes a submodule found in a repository. There should be - * an entry for every submodule found in the HEAD and index, and for every - * submodule described in .gitmodules. The fields are as follows: - * - * - `rc` tracks the refcount of how many hash table entries in the - * git_submodule_cache there are for this submodule. It only comes into - * play if the name and path of the submodule differ. - * - * - `name` is the name of the submodule from .gitmodules. - * - `path` is the path to the submodule from the repo root. It is almost - * always the same as `name`. - * - `url` is the url for the submodule. - * - `update` is a git_submodule_update_t value - see gitmodules(5) update. - * - `update_default` is the update value from the config - * - `ignore` is a git_submodule_ignore_t value - see gitmodules(5) ignore. - * - `ignore_default` is the ignore value from the config - * - `fetch_recurse` is a git_submodule_recurse_t value - see gitmodules(5) - * fetchRecurseSubmodules. - * - `fetch_recurse_default` is the recurse value from the config - * - * - `repo` is the parent repository that contains this submodule. - * - `flags` after for internal use, tracking where this submodule has been - * found (head, index, config, workdir) and known status info, etc. - * - `head_oid` is the SHA1 for the submodule path in the repo HEAD. - * - `index_oid` is the SHA1 for the submodule recorded in the index. - * - `wd_oid` is the SHA1 for the HEAD of the checked out submodule. - * - * If the submodule has been added to .gitmodules but not yet git added, - * then the `index_oid` will be zero but still marked valid. If the - * submodule has been deleted, but the delete has not been committed yet, - * then the `index_oid` will be set, but the `url` will be NULL. - */ -struct git_submodule { - git_refcount rc; - - /* information from config */ - char *name; - char *path; /* important: may just point to "name" string */ - char *url; - char *branch; - git_submodule_update_t update; - git_submodule_update_t update_default; - git_submodule_ignore_t ignore; - git_submodule_ignore_t ignore_default; - git_submodule_recurse_t fetch_recurse; - git_submodule_recurse_t fetch_recurse_default; - - /* internal information */ - git_repository *repo; - uint32_t flags; - git_oid head_oid; - git_oid index_oid; - git_oid wd_oid; -}; - -/* Force revalidation of submodule data cache (alloc as needed) */ -extern int git_submodule_cache_refresh(git_repository *repo); - -/* Release all submodules */ -extern void git_submodule_cache_free(git_repository *repo); - -/* Additional flags on top of public GIT_SUBMODULE_STATUS values */ -enum { - GIT_SUBMODULE_STATUS__WD_SCANNED = (1u << 20), - GIT_SUBMODULE_STATUS__HEAD_OID_VALID = (1u << 21), - GIT_SUBMODULE_STATUS__INDEX_OID_VALID = (1u << 22), - GIT_SUBMODULE_STATUS__WD_OID_VALID = (1u << 23), - GIT_SUBMODULE_STATUS__HEAD_NOT_SUBMODULE = (1u << 24), - GIT_SUBMODULE_STATUS__INDEX_NOT_SUBMODULE = (1u << 25), - GIT_SUBMODULE_STATUS__WD_NOT_SUBMODULE = (1u << 26), - GIT_SUBMODULE_STATUS__INDEX_MULTIPLE_ENTRIES = (1u << 27), -}; - -#define GIT_SUBMODULE_STATUS__CLEAR_INTERNAL(S) \ - ((S) & ~(0xFFFFFFFFu << 20)) - -/* Internal lookup does not attempt to refresh cached data */ -extern int git_submodule__lookup( - git_submodule **out, git_repository *repo, const char *path); - -/* Internal status fn returns status and optionally the various OIDs */ -extern int git_submodule__status( - unsigned int *out_status, - git_oid *out_head_id, - git_oid *out_index_id, - git_oid *out_wd_id, - git_submodule *sm, - git_submodule_ignore_t ign); - -/* Open submodule repository as bare repo for quick HEAD check, etc. */ -extern int git_submodule_open_bare( - git_repository **repo, - git_submodule *submodule); - -extern int git_submodule_parse_ignore( - git_submodule_ignore_t *out, const char *value); -extern int git_submodule_parse_update( - git_submodule_update_t *out, const char *value); - -#endif diff --git a/vendor/libgit2/src/sysdir.c b/vendor/libgit2/src/sysdir.c deleted file mode 100644 index cd94a8b575..0000000000 --- a/vendor/libgit2/src/sysdir.c +++ /dev/null @@ -1,252 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#include "common.h" -#include "sysdir.h" -#include "global.h" -#include "buffer.h" -#include "path.h" -#include -#if GIT_WIN32 -#include "win32/findfile.h" -#endif - -static int git_sysdir_guess_system_dirs(git_buf *out) -{ -#ifdef GIT_WIN32 - return git_win32__find_system_dirs(out, L"etc\\"); -#else - return git_buf_sets(out, "/etc"); -#endif -} - -static int git_sysdir_guess_global_dirs(git_buf *out) -{ -#ifdef GIT_WIN32 - return git_win32__find_global_dirs(out); -#else - return git_buf_sets(out, getenv("HOME")); -#endif -} - -static int git_sysdir_guess_xdg_dirs(git_buf *out) -{ -#ifdef GIT_WIN32 - return git_win32__find_xdg_dirs(out); -#else - const char *env = NULL; - - if ((env = getenv("XDG_CONFIG_HOME")) != NULL) - return git_buf_joinpath(out, env, "git"); - else if ((env = getenv("HOME")) != NULL) - return git_buf_joinpath(out, env, ".config/git"); - - git_buf_clear(out); - return 0; -#endif -} - -static int git_sysdir_guess_template_dirs(git_buf *out) -{ -#ifdef GIT_WIN32 - return git_win32__find_system_dirs(out, L"share\\git-core\\templates"); -#else - return git_buf_sets(out, "/usr/share/git-core/templates"); -#endif -} - -typedef int (*git_sysdir_guess_cb)(git_buf *out); - -static git_buf git_sysdir__dirs[GIT_SYSDIR__MAX] = - { GIT_BUF_INIT, GIT_BUF_INIT, GIT_BUF_INIT, GIT_BUF_INIT }; - -static git_sysdir_guess_cb git_sysdir__dir_guess[GIT_SYSDIR__MAX] = { - git_sysdir_guess_system_dirs, - git_sysdir_guess_global_dirs, - git_sysdir_guess_xdg_dirs, - git_sysdir_guess_template_dirs, -}; - -static int git_sysdir__dirs_shutdown_set = 0; - -int git_sysdir_global_init(void) -{ - git_sysdir_t i; - const git_buf *path; - int error = 0; - - for (i = 0; !error && i < GIT_SYSDIR__MAX; i++) - error = git_sysdir_get(&path, i); - - return error; -} - -void git_sysdir_global_shutdown(void) -{ - int i; - for (i = 0; i < GIT_SYSDIR__MAX; ++i) - git_buf_free(&git_sysdir__dirs[i]); - - git_sysdir__dirs_shutdown_set = 0; -} - -static int git_sysdir_check_selector(git_sysdir_t which) -{ - if (which < GIT_SYSDIR__MAX) - return 0; - - giterr_set(GITERR_INVALID, "config directory selector out of range"); - return -1; -} - - -int git_sysdir_get(const git_buf **out, git_sysdir_t which) -{ - assert(out); - - *out = NULL; - - GITERR_CHECK_ERROR(git_sysdir_check_selector(which)); - - if (!git_buf_len(&git_sysdir__dirs[which])) { - /* prepare shutdown if we're going to need it */ - if (!git_sysdir__dirs_shutdown_set) { - git__on_shutdown(git_sysdir_global_shutdown); - git_sysdir__dirs_shutdown_set = 1; - } - - GITERR_CHECK_ERROR( - git_sysdir__dir_guess[which](&git_sysdir__dirs[which])); - } - - *out = &git_sysdir__dirs[which]; - return 0; -} - -int git_sysdir_get_str( - char *out, - size_t outlen, - git_sysdir_t which) -{ - const git_buf *path = NULL; - - GITERR_CHECK_ERROR(git_sysdir_check_selector(which)); - GITERR_CHECK_ERROR(git_sysdir_get(&path, which)); - - if (!out || path->size >= outlen) { - giterr_set(GITERR_NOMEMORY, "Buffer is too short for the path"); - return GIT_EBUFS; - } - - git_buf_copy_cstr(out, outlen, path); - return 0; -} - -#define PATH_MAGIC "$PATH" - -int git_sysdir_set(git_sysdir_t which, const char *search_path) -{ - const char *expand_path = NULL; - git_buf merge = GIT_BUF_INIT; - - GITERR_CHECK_ERROR(git_sysdir_check_selector(which)); - - if (search_path != NULL) - expand_path = strstr(search_path, PATH_MAGIC); - - /* init with default if not yet done and needed (ignoring error) */ - if ((!search_path || expand_path) && - !git_buf_len(&git_sysdir__dirs[which])) - git_sysdir__dir_guess[which](&git_sysdir__dirs[which]); - - /* if $PATH is not referenced, then just set the path */ - if (!expand_path) - return git_buf_sets(&git_sysdir__dirs[which], search_path); - - /* otherwise set to join(before $PATH, old value, after $PATH) */ - if (expand_path > search_path) - git_buf_set(&merge, search_path, expand_path - search_path); - - if (git_buf_len(&git_sysdir__dirs[which])) - git_buf_join(&merge, GIT_PATH_LIST_SEPARATOR, - merge.ptr, git_sysdir__dirs[which].ptr); - - expand_path += strlen(PATH_MAGIC); - if (*expand_path) - git_buf_join(&merge, GIT_PATH_LIST_SEPARATOR, merge.ptr, expand_path); - - git_buf_swap(&git_sysdir__dirs[which], &merge); - git_buf_free(&merge); - - return git_buf_oom(&git_sysdir__dirs[which]) ? -1 : 0; -} - -static int git_sysdir_find_in_dirlist( - git_buf *path, - const char *name, - git_sysdir_t which, - const char *label) -{ - size_t len; - const char *scan, *next = NULL; - const git_buf *syspath; - - GITERR_CHECK_ERROR(git_sysdir_get(&syspath, which)); - if (!syspath || !git_buf_len(syspath)) - goto done; - - for (scan = git_buf_cstr(syspath); scan; scan = next) { - /* find unescaped separator or end of string */ - for (next = scan; *next; ++next) { - if (*next == GIT_PATH_LIST_SEPARATOR && - (next <= scan || next[-1] != '\\')) - break; - } - - len = (size_t)(next - scan); - next = (*next ? next + 1 : NULL); - if (!len) - continue; - - GITERR_CHECK_ERROR(git_buf_set(path, scan, len)); - if (name) - GITERR_CHECK_ERROR(git_buf_joinpath(path, path->ptr, name)); - - if (git_path_exists(path->ptr)) - return 0; - } - -done: - git_buf_free(path); - giterr_set(GITERR_OS, "The %s file '%s' doesn't exist", label, name); - return GIT_ENOTFOUND; -} - -int git_sysdir_find_system_file(git_buf *path, const char *filename) -{ - return git_sysdir_find_in_dirlist( - path, filename, GIT_SYSDIR_SYSTEM, "system"); -} - -int git_sysdir_find_global_file(git_buf *path, const char *filename) -{ - return git_sysdir_find_in_dirlist( - path, filename, GIT_SYSDIR_GLOBAL, "global"); -} - -int git_sysdir_find_xdg_file(git_buf *path, const char *filename) -{ - return git_sysdir_find_in_dirlist( - path, filename, GIT_SYSDIR_XDG, "global/xdg"); -} - -int git_sysdir_find_template_dir(git_buf *path) -{ - return git_sysdir_find_in_dirlist( - path, NULL, GIT_SYSDIR_TEMPLATE, "template"); -} - diff --git a/vendor/libgit2/src/sysdir.h b/vendor/libgit2/src/sysdir.h deleted file mode 100644 index f1bbf0baea..0000000000 --- a/vendor/libgit2/src/sysdir.h +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_sysdir_h__ -#define INCLUDE_sysdir_h__ - -#include "common.h" -#include "posix.h" -#include "buffer.h" - -/** - * Find a "global" file (i.e. one in a user's home directory). - * - * @param path buffer to write the full path into - * @param filename name of file to find in the home directory - * @return 0 if found, GIT_ENOTFOUND if not found, or -1 on other OS error - */ -extern int git_sysdir_find_global_file(git_buf *path, const char *filename); - -/** - * Find an "XDG" file (i.e. one in user's XDG config path). - * - * @param path buffer to write the full path into - * @param filename name of file to find in the home directory - * @return 0 if found, GIT_ENOTFOUND if not found, or -1 on other OS error - */ -extern int git_sysdir_find_xdg_file(git_buf *path, const char *filename); - -/** - * Find a "system" file (i.e. one shared for all users of the system). - * - * @param path buffer to write the full path into - * @param filename name of file to find in the home directory - * @return 0 if found, GIT_ENOTFOUND if not found, or -1 on other OS error - */ -extern int git_sysdir_find_system_file(git_buf *path, const char *filename); - -/** - * Find template directory. - * - * @param path buffer to write the full path into - * @return 0 if found, GIT_ENOTFOUND if not found, or -1 on other OS error - */ -extern int git_sysdir_find_template_dir(git_buf *path); - -typedef enum { - GIT_SYSDIR_SYSTEM = 0, - GIT_SYSDIR_GLOBAL = 1, - GIT_SYSDIR_XDG = 2, - GIT_SYSDIR_TEMPLATE = 3, - GIT_SYSDIR__MAX = 4, -} git_sysdir_t; - -/** - * Configures global data for configuration file search paths. - * - * @return 0 on success, <0 on failure - */ -extern int git_sysdir_global_init(void); - -/** - * Get the search path for global/system/xdg files - * - * @param out pointer to git_buf containing search path - * @param which which list of paths to return - * @return 0 on success, <0 on failure - */ -extern int git_sysdir_get(const git_buf **out, git_sysdir_t which); - -/** - * Get search path into a preallocated buffer - * - * @param out String buffer to write into - * @param outlen Size of string buffer - * @param which Which search path to return - * @return 0 on success, GIT_EBUFS if out is too small, <0 on other failure - */ - -extern int git_sysdir_get_str(char *out, size_t outlen, git_sysdir_t which); - -/** - * Set search paths for global/system/xdg files - * - * The first occurrence of the magic string "$PATH" in the new value will - * be replaced with the old value of the search path. - * - * @param which Which search path to modify - * @param paths New search path (separated by GIT_PATH_LIST_SEPARATOR) - * @return 0 on success, <0 on failure (allocation error) - */ -extern int git_sysdir_set(git_sysdir_t which, const char *paths); - -/** - * Free the configuration file search paths. - */ -extern void git_sysdir_global_shutdown(void); - -#endif /* INCLUDE_sysdir_h__ */ diff --git a/vendor/libgit2/src/tag.c b/vendor/libgit2/src/tag.c deleted file mode 100644 index 6e69d760d1..0000000000 --- a/vendor/libgit2/src/tag.c +++ /dev/null @@ -1,511 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#include "common.h" -#include "commit.h" -#include "tag.h" -#include "signature.h" -#include "message.h" -#include "git2/object.h" -#include "git2/repository.h" -#include "git2/signature.h" -#include "git2/odb_backend.h" - -void git_tag__free(void *_tag) -{ - git_tag *tag = _tag; - git_signature_free(tag->tagger); - git__free(tag->message); - git__free(tag->tag_name); - git__free(tag); -} - -int git_tag_target(git_object **target, const git_tag *t) -{ - assert(t); - return git_object_lookup(target, t->object.repo, &t->target, t->type); -} - -const git_oid *git_tag_target_id(const git_tag *t) -{ - assert(t); - return &t->target; -} - -git_otype git_tag_target_type(const git_tag *t) -{ - assert(t); - return t->type; -} - -const char *git_tag_name(const git_tag *t) -{ - assert(t); - return t->tag_name; -} - -const git_signature *git_tag_tagger(const git_tag *t) -{ - return t->tagger; -} - -const char *git_tag_message(const git_tag *t) -{ - assert(t); - return t->message; -} - -static int tag_error(const char *str) -{ - giterr_set(GITERR_TAG, "Failed to parse tag. %s", str); - return -1; -} - -static int tag_parse(git_tag *tag, const char *buffer, const char *buffer_end) -{ - static const char *tag_types[] = { - NULL, "commit\n", "tree\n", "blob\n", "tag\n" - }; - - unsigned int i; - size_t text_len, alloc_len; - char *search; - - if (git_oid__parse(&tag->target, &buffer, buffer_end, "object ") < 0) - return tag_error("Object field invalid"); - - if (buffer + 5 >= buffer_end) - return tag_error("Object too short"); - - if (memcmp(buffer, "type ", 5) != 0) - return tag_error("Type field not found"); - buffer += 5; - - tag->type = GIT_OBJ_BAD; - - for (i = 1; i < ARRAY_SIZE(tag_types); ++i) { - size_t type_length = strlen(tag_types[i]); - - if (buffer + type_length >= buffer_end) - return tag_error("Object too short"); - - if (memcmp(buffer, tag_types[i], type_length) == 0) { - tag->type = i; - buffer += type_length; - break; - } - } - - if (tag->type == GIT_OBJ_BAD) - return tag_error("Invalid object type"); - - if (buffer + 4 >= buffer_end) - return tag_error("Object too short"); - - if (memcmp(buffer, "tag ", 4) != 0) - return tag_error("Tag field not found"); - - buffer += 4; - - search = memchr(buffer, '\n', buffer_end - buffer); - if (search == NULL) - return tag_error("Object too short"); - - text_len = search - buffer; - - GITERR_CHECK_ALLOC_ADD(&alloc_len, text_len, 1); - tag->tag_name = git__malloc(alloc_len); - GITERR_CHECK_ALLOC(tag->tag_name); - - memcpy(tag->tag_name, buffer, text_len); - tag->tag_name[text_len] = '\0'; - - buffer = search + 1; - - tag->tagger = NULL; - if (buffer < buffer_end && *buffer != '\n') { - tag->tagger = git__malloc(sizeof(git_signature)); - GITERR_CHECK_ALLOC(tag->tagger); - - if (git_signature__parse(tag->tagger, &buffer, buffer_end, "tagger ", '\n') < 0) - return -1; - } - - tag->message = NULL; - if (buffer < buffer_end) { - if( *buffer != '\n' ) - return tag_error("No new line before message"); - - text_len = buffer_end - ++buffer; - - GITERR_CHECK_ALLOC_ADD(&alloc_len, text_len, 1); - tag->message = git__malloc(alloc_len); - GITERR_CHECK_ALLOC(tag->message); - - memcpy(tag->message, buffer, text_len); - tag->message[text_len] = '\0'; - } - - return 0; -} - -int git_tag__parse(void *_tag, git_odb_object *odb_obj) -{ - git_tag *tag = _tag; - const char *buffer = git_odb_object_data(odb_obj); - const char *buffer_end = buffer + git_odb_object_size(odb_obj); - - return tag_parse(tag, buffer, buffer_end); -} - -static int retrieve_tag_reference( - git_reference **tag_reference_out, - git_buf *ref_name_out, - git_repository *repo, - const char *tag_name) -{ - git_reference *tag_ref; - int error; - - *tag_reference_out = NULL; - - if (git_buf_joinpath(ref_name_out, GIT_REFS_TAGS_DIR, tag_name) < 0) - return -1; - - error = git_reference_lookup(&tag_ref, repo, ref_name_out->ptr); - if (error < 0) - return error; /* Be it not foundo or corrupted */ - - *tag_reference_out = tag_ref; - - return 0; -} - -static int retrieve_tag_reference_oid( - git_oid *oid, - git_buf *ref_name_out, - git_repository *repo, - const char *tag_name) -{ - if (git_buf_joinpath(ref_name_out, GIT_REFS_TAGS_DIR, tag_name) < 0) - return -1; - - return git_reference_name_to_id(oid, repo, ref_name_out->ptr); -} - -static int write_tag_annotation( - git_oid *oid, - git_repository *repo, - const char *tag_name, - const git_object *target, - const git_signature *tagger, - const char *message) -{ - git_buf tag = GIT_BUF_INIT; - git_odb *odb; - - git_oid__writebuf(&tag, "object ", git_object_id(target)); - git_buf_printf(&tag, "type %s\n", git_object_type2string(git_object_type(target))); - git_buf_printf(&tag, "tag %s\n", tag_name); - git_signature__writebuf(&tag, "tagger ", tagger); - git_buf_putc(&tag, '\n'); - - if (git_buf_puts(&tag, message) < 0) - goto on_error; - - if (git_repository_odb__weakptr(&odb, repo) < 0) - goto on_error; - - if (git_odb_write(oid, odb, tag.ptr, tag.size, GIT_OBJ_TAG) < 0) - goto on_error; - - git_buf_free(&tag); - return 0; - -on_error: - git_buf_free(&tag); - giterr_set(GITERR_OBJECT, "Failed to create tag annotation."); - return -1; -} - -static int git_tag_create__internal( - git_oid *oid, - git_repository *repo, - const char *tag_name, - const git_object *target, - const git_signature *tagger, - const char *message, - int allow_ref_overwrite, - int create_tag_annotation) -{ - git_reference *new_ref = NULL; - git_buf ref_name = GIT_BUF_INIT; - - int error; - - assert(repo && tag_name && target); - assert(!create_tag_annotation || (tagger && message)); - - if (git_object_owner(target) != repo) { - giterr_set(GITERR_INVALID, "The given target does not belong to this repository"); - return -1; - } - - error = retrieve_tag_reference_oid(oid, &ref_name, repo, tag_name); - if (error < 0 && error != GIT_ENOTFOUND) - goto cleanup; - - /** Ensure the tag name doesn't conflict with an already existing - * reference unless overwriting has explicitly been requested **/ - if (error == 0 && !allow_ref_overwrite) { - git_buf_free(&ref_name); - giterr_set(GITERR_TAG, "Tag already exists"); - return GIT_EEXISTS; - } - - if (create_tag_annotation) { - if (write_tag_annotation(oid, repo, tag_name, target, tagger, message) < 0) - return -1; - } else - git_oid_cpy(oid, git_object_id(target)); - - error = git_reference_create(&new_ref, repo, ref_name.ptr, oid, allow_ref_overwrite, NULL); - -cleanup: - git_reference_free(new_ref); - git_buf_free(&ref_name); - return error; -} - -int git_tag_create( - git_oid *oid, - git_repository *repo, - const char *tag_name, - const git_object *target, - const git_signature *tagger, - const char *message, - int allow_ref_overwrite) -{ - return git_tag_create__internal(oid, repo, tag_name, target, tagger, message, allow_ref_overwrite, 1); -} - -int git_tag_annotation_create( - git_oid *oid, - git_repository *repo, - const char *tag_name, - const git_object *target, - const git_signature *tagger, - const char *message) -{ - assert(oid && repo && tag_name && target && tagger && message); - - return write_tag_annotation(oid, repo, tag_name, target, tagger, message); -} - -int git_tag_create_lightweight( - git_oid *oid, - git_repository *repo, - const char *tag_name, - const git_object *target, - int allow_ref_overwrite) -{ - return git_tag_create__internal(oid, repo, tag_name, target, NULL, NULL, allow_ref_overwrite, 0); -} - -int git_tag_create_frombuffer(git_oid *oid, git_repository *repo, const char *buffer, int allow_ref_overwrite) -{ - git_tag tag; - int error; - git_odb *odb; - git_odb_stream *stream; - git_odb_object *target_obj; - - git_reference *new_ref = NULL; - git_buf ref_name = GIT_BUF_INIT; - - assert(oid && buffer); - - memset(&tag, 0, sizeof(tag)); - - if (git_repository_odb__weakptr(&odb, repo) < 0) - return -1; - - /* validate the buffer */ - if (tag_parse(&tag, buffer, buffer + strlen(buffer)) < 0) - return -1; - - /* validate the target */ - if (git_odb_read(&target_obj, odb, &tag.target) < 0) - goto on_error; - - if (tag.type != target_obj->cached.type) { - giterr_set(GITERR_TAG, "The type for the given target is invalid"); - goto on_error; - } - - error = retrieve_tag_reference_oid(oid, &ref_name, repo, tag.tag_name); - if (error < 0 && error != GIT_ENOTFOUND) - goto on_error; - - /* We don't need these objects after this */ - git_signature_free(tag.tagger); - git__free(tag.tag_name); - git__free(tag.message); - git_odb_object_free(target_obj); - - /** Ensure the tag name doesn't conflict with an already existing - * reference unless overwriting has explictly been requested **/ - if (error == 0 && !allow_ref_overwrite) { - giterr_set(GITERR_TAG, "Tag already exists"); - return GIT_EEXISTS; - } - - /* write the buffer */ - if ((error = git_odb_open_wstream( - &stream, odb, strlen(buffer), GIT_OBJ_TAG)) < 0) - return error; - - if (!(error = git_odb_stream_write(stream, buffer, strlen(buffer)))) - error = git_odb_stream_finalize_write(oid, stream); - - git_odb_stream_free(stream); - - if (error < 0) { - git_buf_free(&ref_name); - return error; - } - - error = git_reference_create( - &new_ref, repo, ref_name.ptr, oid, allow_ref_overwrite, NULL); - - git_reference_free(new_ref); - git_buf_free(&ref_name); - - return error; - -on_error: - git_signature_free(tag.tagger); - git__free(tag.tag_name); - git__free(tag.message); - git_odb_object_free(target_obj); - return -1; -} - -int git_tag_delete(git_repository *repo, const char *tag_name) -{ - git_reference *tag_ref; - git_buf ref_name = GIT_BUF_INIT; - int error; - - error = retrieve_tag_reference(&tag_ref, &ref_name, repo, tag_name); - - git_buf_free(&ref_name); - - if (error < 0) - return error; - - error = git_reference_delete(tag_ref); - - git_reference_free(tag_ref); - - return error; -} - -typedef struct { - git_repository *repo; - git_tag_foreach_cb cb; - void *cb_data; -} tag_cb_data; - -static int tags_cb(const char *ref, void *data) -{ - int error; - git_oid oid; - tag_cb_data *d = (tag_cb_data *)data; - - if (git__prefixcmp(ref, GIT_REFS_TAGS_DIR) != 0) - return 0; /* no tag */ - - if (!(error = git_reference_name_to_id(&oid, d->repo, ref))) { - if ((error = d->cb(ref, &oid, d->cb_data)) != 0) - giterr_set_after_callback_function(error, "git_tag_foreach"); - } - - return error; -} - -int git_tag_foreach(git_repository *repo, git_tag_foreach_cb cb, void *cb_data) -{ - tag_cb_data data; - - assert(repo && cb); - - data.cb = cb; - data.cb_data = cb_data; - data.repo = repo; - - return git_reference_foreach_name(repo, &tags_cb, &data); -} - -typedef struct { - git_vector *taglist; - const char *pattern; -} tag_filter_data; - -#define GIT_REFS_TAGS_DIR_LEN strlen(GIT_REFS_TAGS_DIR) - -static int tag_list_cb(const char *tag_name, git_oid *oid, void *data) -{ - tag_filter_data *filter = (tag_filter_data *)data; - GIT_UNUSED(oid); - - if (!*filter->pattern || - p_fnmatch(filter->pattern, tag_name + GIT_REFS_TAGS_DIR_LEN, 0) == 0) - { - char *matched = git__strdup(tag_name + GIT_REFS_TAGS_DIR_LEN); - GITERR_CHECK_ALLOC(matched); - - return git_vector_insert(filter->taglist, matched); - } - - return 0; -} - -int git_tag_list_match(git_strarray *tag_names, const char *pattern, git_repository *repo) -{ - int error; - tag_filter_data filter; - git_vector taglist; - - assert(tag_names && repo && pattern); - - if ((error = git_vector_init(&taglist, 8, NULL)) < 0) - return error; - - filter.taglist = &taglist; - filter.pattern = pattern; - - error = git_tag_foreach(repo, &tag_list_cb, (void *)&filter); - - if (error < 0) - git_vector_free(&taglist); - - tag_names->strings = - (char **)git_vector_detach(&tag_names->count, NULL, &taglist); - - return 0; -} - -int git_tag_list(git_strarray *tag_names, git_repository *repo) -{ - return git_tag_list_match(tag_names, "", repo); -} - -int git_tag_peel(git_object **tag_target, const git_tag *tag) -{ - return git_object_peel(tag_target, (const git_object *)tag, GIT_OBJ_ANY); -} diff --git a/vendor/libgit2/src/tag.h b/vendor/libgit2/src/tag.h deleted file mode 100644 index d0cd393c72..0000000000 --- a/vendor/libgit2/src/tag.h +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_tag_h__ -#define INCLUDE_tag_h__ - -#include "git2/tag.h" -#include "repository.h" -#include "odb.h" - -struct git_tag { - git_object object; - - git_oid target; - git_otype type; - - char *tag_name; - git_signature *tagger; - char *message; -}; - -void git_tag__free(void *tag); -int git_tag__parse(void *tag, git_odb_object *obj); - -#endif diff --git a/vendor/libgit2/src/thread-utils.c b/vendor/libgit2/src/thread-utils.c deleted file mode 100644 index dc9b2f09e9..0000000000 --- a/vendor/libgit2/src/thread-utils.c +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#include "common.h" -#include "thread-utils.h" - -#ifdef _WIN32 -#ifndef WIN32_LEAN_AND_MEAN -# define WIN32_LEAN_AND_MEAN -#endif -# include -#elif defined(hpux) || defined(__hpux) || defined(_hpux) -# include -#endif - -/* - * By doing this in two steps we can at least get - * the function to be somewhat coherent, even - * with this disgusting nest of #ifdefs. - */ -#ifndef _SC_NPROCESSORS_ONLN -# ifdef _SC_NPROC_ONLN -# define _SC_NPROCESSORS_ONLN _SC_NPROC_ONLN -# elif defined _SC_CRAY_NCPU -# define _SC_NPROCESSORS_ONLN _SC_CRAY_NCPU -# endif -#endif - -int git_online_cpus(void) -{ -#ifdef _SC_NPROCESSORS_ONLN - long ncpus; -#endif - -#ifdef _WIN32 - SYSTEM_INFO info; - GetSystemInfo(&info); - - if ((int)info.dwNumberOfProcessors > 0) - return (int)info.dwNumberOfProcessors; -#elif defined(hpux) || defined(__hpux) || defined(_hpux) - struct pst_dynamic psd; - - if (!pstat_getdynamic(&psd, sizeof(psd), (size_t)1, 0)) - return (int)psd.psd_proc_cnt; -#endif - -#ifdef _SC_NPROCESSORS_ONLN - if ((ncpus = (long)sysconf(_SC_NPROCESSORS_ONLN)) > 0) - return (int)ncpus; -#endif - - return 1; -} diff --git a/vendor/libgit2/src/thread-utils.h b/vendor/libgit2/src/thread-utils.h deleted file mode 100644 index dd1136cafe..0000000000 --- a/vendor/libgit2/src/thread-utils.h +++ /dev/null @@ -1,286 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_thread_utils_h__ -#define INCLUDE_thread_utils_h__ - -/* Common operations even if threading has been disabled */ -typedef struct { -#if defined(GIT_WIN32) - volatile long val; -#else - volatile int val; -#endif -} git_atomic; - -#ifdef GIT_ARCH_64 - -typedef struct { -#if defined(GIT_WIN32) - __int64 val; -#else - int64_t val; -#endif -} git_atomic64; - -typedef git_atomic64 git_atomic_ssize; - -#define git_atomic_ssize_add git_atomic64_add - -#else - -typedef git_atomic git_atomic_ssize; - -#define git_atomic_ssize_add git_atomic_add - -#endif - -#ifdef GIT_THREADS - -#if !defined(GIT_WIN32) - -typedef struct { - pthread_t thread; -} git_thread; - -#define git_thread_create(git_thread_ptr, attr, start_routine, arg) \ - pthread_create(&(git_thread_ptr)->thread, attr, start_routine, arg) -#define git_thread_join(git_thread_ptr, status) \ - pthread_join((git_thread_ptr)->thread, status) - -#endif - -/* Pthreads Mutex */ -#define git_mutex pthread_mutex_t -#define git_mutex_init(a) pthread_mutex_init(a, NULL) -#define git_mutex_lock(a) pthread_mutex_lock(a) -#define git_mutex_unlock(a) pthread_mutex_unlock(a) -#define git_mutex_free(a) pthread_mutex_destroy(a) - -/* Pthreads condition vars */ -#define git_cond pthread_cond_t -#define git_cond_init(c) pthread_cond_init(c, NULL) -#define git_cond_free(c) pthread_cond_destroy(c) -#define git_cond_wait(c, l) pthread_cond_wait(c, l) -#define git_cond_signal(c) pthread_cond_signal(c) -#define git_cond_broadcast(c) pthread_cond_broadcast(c) - -/* Pthread (-ish) rwlock - * - * This differs from normal pthreads rwlocks in two ways: - * 1. Separate APIs for releasing read locks and write locks (as - * opposed to the pure POSIX API which only has one unlock fn) - * 2. You should not use recursive read locks (i.e. grabbing a read - * lock in a thread that already holds a read lock) because the - * Windows implementation doesn't support it - */ -#define git_rwlock pthread_rwlock_t -#define git_rwlock_init(a) pthread_rwlock_init(a, NULL) -#define git_rwlock_rdlock(a) pthread_rwlock_rdlock(a) -#define git_rwlock_rdunlock(a) pthread_rwlock_rdunlock(a) -#define git_rwlock_wrlock(a) pthread_rwlock_wrlock(a) -#define git_rwlock_wrunlock(a) pthread_rwlock_wrunlock(a) -#define git_rwlock_free(a) pthread_rwlock_destroy(a) -#define GIT_RWLOCK_STATIC_INIT PTHREAD_RWLOCK_INITIALIZER - -#ifndef GIT_WIN32 -#define pthread_rwlock_rdunlock pthread_rwlock_unlock -#define pthread_rwlock_wrunlock pthread_rwlock_unlock -#endif - - -GIT_INLINE(void) git_atomic_set(git_atomic *a, int val) -{ -#if defined(GIT_WIN32) - InterlockedExchange(&a->val, (LONG)val); -#elif defined(__GNUC__) - __sync_lock_test_and_set(&a->val, val); -#else -# error "Unsupported architecture for atomic operations" -#endif -} - -GIT_INLINE(int) git_atomic_inc(git_atomic *a) -{ -#if defined(GIT_WIN32) - return InterlockedIncrement(&a->val); -#elif defined(__GNUC__) - return __sync_add_and_fetch(&a->val, 1); -#else -# error "Unsupported architecture for atomic operations" -#endif -} - -GIT_INLINE(int) git_atomic_add(git_atomic *a, int32_t addend) -{ -#if defined(GIT_WIN32) - return InterlockedExchangeAdd(&a->val, addend); -#elif defined(__GNUC__) - return __sync_add_and_fetch(&a->val, addend); -#else -# error "Unsupported architecture for atomic operations" -#endif -} - -GIT_INLINE(int) git_atomic_dec(git_atomic *a) -{ -#if defined(GIT_WIN32) - return InterlockedDecrement(&a->val); -#elif defined(__GNUC__) - return __sync_sub_and_fetch(&a->val, 1); -#else -# error "Unsupported architecture for atomic operations" -#endif -} - -GIT_INLINE(void *) git___compare_and_swap( - void * volatile *ptr, void *oldval, void *newval) -{ - volatile void *foundval; -#if defined(GIT_WIN32) - foundval = InterlockedCompareExchangePointer((volatile PVOID *)ptr, newval, oldval); -#elif defined(__GNUC__) - foundval = __sync_val_compare_and_swap(ptr, oldval, newval); -#else -# error "Unsupported architecture for atomic operations" -#endif - return (foundval == oldval) ? oldval : newval; -} - -GIT_INLINE(volatile void *) git___swap( - void * volatile *ptr, void *newval) -{ -#if defined(GIT_WIN32) - return InterlockedExchangePointer(ptr, newval); -#else - return __sync_lock_test_and_set(ptr, newval); -#endif -} - -#ifdef GIT_ARCH_64 - -GIT_INLINE(int64_t) git_atomic64_add(git_atomic64 *a, int64_t addend) -{ -#if defined(GIT_WIN32) - return InterlockedExchangeAdd64(&a->val, addend); -#elif defined(__GNUC__) - return __sync_add_and_fetch(&a->val, addend); -#else -# error "Unsupported architecture for atomic operations" -#endif -} - -#endif - -#else - -#define git_thread unsigned int -#define git_thread_create(thread, attr, start_routine, arg) 0 -#define git_thread_join(id, status) (void)0 - -/* Pthreads Mutex */ -#define git_mutex unsigned int -GIT_INLINE(int) git_mutex_init(git_mutex *mutex) \ - { GIT_UNUSED(mutex); return 0; } -GIT_INLINE(int) git_mutex_lock(git_mutex *mutex) \ - { GIT_UNUSED(mutex); return 0; } -#define git_mutex_unlock(a) (void)0 -#define git_mutex_free(a) (void)0 - -/* Pthreads condition vars */ -#define git_cond unsigned int -#define git_cond_init(c, a) (void)0 -#define git_cond_free(c) (void)0 -#define git_cond_wait(c, l) (void)0 -#define git_cond_signal(c) (void)0 -#define git_cond_broadcast(c) (void)0 - -/* Pthreads rwlock */ -#define git_rwlock unsigned int -#define git_rwlock_init(a) 0 -#define git_rwlock_rdlock(a) 0 -#define git_rwlock_rdunlock(a) (void)0 -#define git_rwlock_wrlock(a) 0 -#define git_rwlock_wrunlock(a) (void)0 -#define git_rwlock_free(a) (void)0 -#define GIT_RWLOCK_STATIC_INIT 0 - - -GIT_INLINE(void) git_atomic_set(git_atomic *a, int val) -{ - a->val = val; -} - -GIT_INLINE(int) git_atomic_inc(git_atomic *a) -{ - return ++a->val; -} - -GIT_INLINE(int) git_atomic_add(git_atomic *a, int32_t addend) -{ - a->val += addend; - return a->val; -} - -GIT_INLINE(int) git_atomic_dec(git_atomic *a) -{ - return --a->val; -} - -GIT_INLINE(void *) git___compare_and_swap( - void * volatile *ptr, void *oldval, void *newval) -{ - if (*ptr == oldval) - *ptr = newval; - else - oldval = newval; - return oldval; -} - -GIT_INLINE(volatile void *) git___swap( - void * volatile *ptr, void *newval) -{ - volatile void *old = *ptr; - *ptr = newval; - return old; -} - -#ifdef GIT_ARCH_64 - -GIT_INLINE(int64_t) git_atomic64_add(git_atomic64 *a, int64_t addend) -{ - a->val += addend; - return a->val; -} - -#endif - -#endif - -GIT_INLINE(int) git_atomic_get(git_atomic *a) -{ - return (int)a->val; -} - -/* Atomically replace oldval with newval - * @return oldval if it was replaced or newval if it was not - */ -#define git__compare_and_swap(P,O,N) \ - git___compare_and_swap((void * volatile *)P, O, N) - -#define git__swap(ptr, val) (void *)git___swap((void * volatile *)&ptr, val) - -extern int git_online_cpus(void); - -#if defined(GIT_THREADS) && defined(GIT_WIN32) -# define GIT_MEMORY_BARRIER MemoryBarrier() -#elif defined(GIT_THREADS) -# define GIT_MEMORY_BARRIER __sync_synchronize() -#else -# define GIT_MEMORY_BARRIER /* noop */ -#endif - -#endif /* INCLUDE_thread_utils_h__ */ diff --git a/vendor/libgit2/src/tls_stream.c b/vendor/libgit2/src/tls_stream.c deleted file mode 100644 index 39a8ce343b..0000000000 --- a/vendor/libgit2/src/tls_stream.c +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#include "git2/errors.h" -#include "common.h" - -#include "openssl_stream.h" -#include "stransport_stream.h" - -int git_tls_stream_new(git_stream **out, const char *host, const char *port) -{ -#ifdef GIT_SECURE_TRANSPORT - return git_stransport_stream_new(out, host, port); -#elif defined(GIT_OPENSSL) - return git_openssl_stream_new(out, host, port); -#else - GIT_UNUSED(out); - GIT_UNUSED(host); - GIT_UNUSED(port); - - giterr_set(GITERR_SSL, "there is no TLS stream available"); - return -1; -#endif -} diff --git a/vendor/libgit2/src/tls_stream.h b/vendor/libgit2/src/tls_stream.h deleted file mode 100644 index 98a704174f..0000000000 --- a/vendor/libgit2/src/tls_stream.h +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_tls_stream_h__ -#define INCLUDE_tls_stream_h__ - -#include "git2/sys/stream.h" - -/** - * Create a TLS stream with the most appropriate backend available for - * the current platform. - * - * This allows us to ask for a SecureTransport or OpenSSL stream - * according to being on general Unix vs OS X. - */ -extern int git_tls_stream_new(git_stream **out, const char *host, const char *port); - -#endif diff --git a/vendor/libgit2/src/trace.c b/vendor/libgit2/src/trace.c deleted file mode 100644 index ee5039f569..0000000000 --- a/vendor/libgit2/src/trace.c +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#include "buffer.h" -#include "common.h" -#include "global.h" -#include "trace.h" -#include "git2/trace.h" - -#ifdef GIT_TRACE - -struct git_trace_data git_trace__data = {0}; - -#endif - -int git_trace_set(git_trace_level_t level, git_trace_callback callback) -{ -#ifdef GIT_TRACE - assert(level == 0 || callback != NULL); - - git_trace__data.level = level; - git_trace__data.callback = callback; - GIT_MEMORY_BARRIER; - - return 0; -#else - GIT_UNUSED(level); - GIT_UNUSED(callback); - - giterr_set(GITERR_INVALID, - "This version of libgit2 was not built with tracing."); - return -1; -#endif -} diff --git a/vendor/libgit2/src/trace.h b/vendor/libgit2/src/trace.h deleted file mode 100644 index 486084d019..0000000000 --- a/vendor/libgit2/src/trace.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_trace_h__ -#define INCLUDE_trace_h__ - -#include -#include "buffer.h" - -#ifdef GIT_TRACE - -struct git_trace_data { - git_trace_level_t level; - git_trace_callback callback; -}; - -extern struct git_trace_data git_trace__data; - -GIT_INLINE(void) git_trace__write_fmt( - git_trace_level_t level, - const char *fmt, ...) -{ - git_trace_callback callback = git_trace__data.callback; - git_buf message = GIT_BUF_INIT; - va_list ap; - - va_start(ap, fmt); - git_buf_vprintf(&message, fmt, ap); - va_end(ap); - - callback(level, git_buf_cstr(&message)); - - git_buf_free(&message); -} - -#define git_trace_level() (git_trace__data.level) -#define git_trace(l, ...) { \ - if (git_trace__data.level >= l && \ - git_trace__data.callback != NULL) { \ - git_trace__write_fmt(l, __VA_ARGS__); \ - } \ - } - -#else - -GIT_INLINE(void) git_trace__null( - git_trace_level_t level, - const char *fmt, ...) -{ - GIT_UNUSED(level); - GIT_UNUSED(fmt); -} - -#define git_trace_level() ((void)0) -#define git_trace git_trace__null - -#endif - -#endif diff --git a/vendor/libgit2/src/transaction.c b/vendor/libgit2/src/transaction.c deleted file mode 100644 index e8331891cb..0000000000 --- a/vendor/libgit2/src/transaction.c +++ /dev/null @@ -1,353 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#include "common.h" -#include "repository.h" -#include "strmap.h" -#include "refdb.h" -#include "pool.h" -#include "reflog.h" -#include "signature.h" - -#include "git2/transaction.h" -#include "git2/signature.h" -#include "git2/sys/refs.h" -#include "git2/sys/refdb_backend.h" - -GIT__USE_STRMAP - -typedef struct { - const char *name; - void *payload; - - git_ref_t ref_type; - union { - git_oid id; - char *symbolic; - } target; - git_reflog *reflog; - - const char *message; - git_signature *sig; - - unsigned int committed :1, - remove :1; -} transaction_node; - -struct git_transaction { - git_repository *repo; - git_refdb *db; - - git_strmap *locks; - git_pool pool; -}; - -int git_transaction_new(git_transaction **out, git_repository *repo) -{ - int error; - git_pool pool; - git_transaction *tx = NULL; - - assert(out && repo); - - if ((error = git_pool_init(&pool, 1, 0)) < 0) - return error; - - tx = git_pool_mallocz(&pool, sizeof(git_transaction)); - if (!tx) { - error = -1; - goto on_error; - } - - if ((error = git_strmap_alloc(&tx->locks)) < 0) { - error = -1; - goto on_error; - } - - if ((error = git_repository_refdb(&tx->db, repo)) < 0) - goto on_error; - - memcpy(&tx->pool, &pool, sizeof(git_pool)); - tx->repo = repo; - *out = tx; - return 0; - -on_error: - git_pool_clear(&pool); - return error; -} - -int git_transaction_lock_ref(git_transaction *tx, const char *refname) -{ - int error; - transaction_node *node; - - assert(tx && refname); - - node = git_pool_mallocz(&tx->pool, sizeof(transaction_node)); - GITERR_CHECK_ALLOC(node); - - node->name = git_pool_strdup(&tx->pool, refname); - GITERR_CHECK_ALLOC(node->name); - - if ((error = git_refdb_lock(&node->payload, tx->db, refname)) < 0) - return error; - - git_strmap_insert(tx->locks, node->name, node, error); - if (error < 0) - goto cleanup; - - return 0; - -cleanup: - git_refdb_unlock(tx->db, node->payload, false, false, NULL, NULL, NULL); - - return error; -} - -static int find_locked(transaction_node **out, git_transaction *tx, const char *refname) -{ - git_strmap_iter pos; - transaction_node *node; - - pos = git_strmap_lookup_index(tx->locks, refname); - if (!git_strmap_valid_index(tx->locks, pos)) { - giterr_set(GITERR_REFERENCE, "the specified reference is not locked"); - return GIT_ENOTFOUND; - } - - node = git_strmap_value_at(tx->locks, pos); - - *out = node; - return 0; -} - -static int copy_common(transaction_node *node, git_transaction *tx, const git_signature *sig, const char *msg) -{ - if (sig && git_signature__pdup(&node->sig, sig, &tx->pool) < 0) - return -1; - - if (!node->sig) { - git_signature *tmp; - int error; - - if (git_reference__log_signature(&tmp, tx->repo) < 0) - return -1; - - /* make sure the sig we use is in our pool */ - error = git_signature__pdup(&node->sig, tmp, &tx->pool); - git_signature_free(tmp); - if (error < 0) - return error; - } - - if (msg) { - node->message = git_pool_strdup(&tx->pool, msg); - GITERR_CHECK_ALLOC(node->message); - } - - return 0; -} - -int git_transaction_set_target(git_transaction *tx, const char *refname, const git_oid *target, const git_signature *sig, const char *msg) -{ - int error; - transaction_node *node; - - assert(tx && refname && target); - - if ((error = find_locked(&node, tx, refname)) < 0) - return error; - - if ((error = copy_common(node, tx, sig, msg)) < 0) - return error; - - git_oid_cpy(&node->target.id, target); - node->ref_type = GIT_REF_OID; - - return 0; -} - -int git_transaction_set_symbolic_target(git_transaction *tx, const char *refname, const char *target, const git_signature *sig, const char *msg) -{ - int error; - transaction_node *node; - - assert(tx && refname && target); - - if ((error = find_locked(&node, tx, refname)) < 0) - return error; - - if ((error = copy_common(node, tx, sig, msg)) < 0) - return error; - - node->target.symbolic = git_pool_strdup(&tx->pool, target); - GITERR_CHECK_ALLOC(node->target.symbolic); - node->ref_type = GIT_REF_SYMBOLIC; - - return 0; -} - -int git_transaction_remove(git_transaction *tx, const char *refname) -{ - int error; - transaction_node *node; - - if ((error = find_locked(&node, tx, refname)) < 0) - return error; - - node->remove = true; - node->ref_type = GIT_REF_OID; /* the id will be ignored */ - - return 0; -} - -static int dup_reflog(git_reflog **out, const git_reflog *in, git_pool *pool) -{ - git_reflog *reflog; - git_reflog_entry *entries; - size_t len, i; - - reflog = git_pool_mallocz(pool, sizeof(git_reflog)); - GITERR_CHECK_ALLOC(reflog); - - reflog->ref_name = git_pool_strdup(pool, in->ref_name); - GITERR_CHECK_ALLOC(reflog->ref_name); - - len = in->entries.length; - reflog->entries.length = len; - reflog->entries.contents = git_pool_mallocz(pool, len * sizeof(void *)); - GITERR_CHECK_ALLOC(reflog->entries.contents); - - entries = git_pool_mallocz(pool, len * sizeof(git_reflog_entry)); - GITERR_CHECK_ALLOC(entries); - - for (i = 0; i < len; i++) { - const git_reflog_entry *src; - git_reflog_entry *tgt; - - tgt = &entries[i]; - reflog->entries.contents[i] = tgt; - - src = git_vector_get(&in->entries, i); - git_oid_cpy(&tgt->oid_old, &src->oid_old); - git_oid_cpy(&tgt->oid_cur, &src->oid_cur); - - tgt->msg = git_pool_strdup(pool, src->msg); - GITERR_CHECK_ALLOC(tgt->msg); - - if (git_signature__pdup(&tgt->committer, src->committer, pool) < 0) - return -1; - } - - - *out = reflog; - return 0; -} - -int git_transaction_set_reflog(git_transaction *tx, const char *refname, const git_reflog *reflog) -{ - int error; - transaction_node *node; - - assert(tx && refname && reflog); - - if ((error = find_locked(&node, tx, refname)) < 0) - return error; - - if ((error = dup_reflog(&node->reflog, reflog, &tx->pool)) < 0) - return error; - - return 0; -} - -static int update_target(git_refdb *db, transaction_node *node) -{ - git_reference *ref; - int error, update_reflog; - - if (node->ref_type == GIT_REF_OID) { - ref = git_reference__alloc(node->name, &node->target.id, NULL); - } else if (node->ref_type == GIT_REF_SYMBOLIC) { - ref = git_reference__alloc_symbolic(node->name, node->target.symbolic); - } else { - abort(); - } - - GITERR_CHECK_ALLOC(ref); - update_reflog = node->reflog == NULL; - - if (node->remove) { - error = git_refdb_unlock(db, node->payload, 2, false, ref, NULL, NULL); - } else if (node->ref_type == GIT_REF_OID) { - error = git_refdb_unlock(db, node->payload, true, update_reflog, ref, node->sig, node->message); - } else if (node->ref_type == GIT_REF_SYMBOLIC) { - error = git_refdb_unlock(db, node->payload, true, update_reflog, ref, node->sig, node->message); - } else { - abort(); - } - - git_reference_free(ref); - node->committed = true; - - return error; -} - -int git_transaction_commit(git_transaction *tx) -{ - transaction_node *node; - git_strmap_iter pos; - int error = 0; - - assert(tx); - - for (pos = kh_begin(tx->locks); pos < kh_end(tx->locks); pos++) { - if (!git_strmap_has_data(tx->locks, pos)) - continue; - - node = git_strmap_value_at(tx->locks, pos); - if (node->reflog) { - if ((error = tx->db->backend->reflog_write(tx->db->backend, node->reflog)) < 0) - return error; - } - - if (node->ref_type != GIT_REF_INVALID) { - if ((error = update_target(tx->db, node)) < 0) - return error; - } - } - - return 0; -} - -void git_transaction_free(git_transaction *tx) -{ - transaction_node *node; - git_pool pool; - git_strmap_iter pos; - - assert(tx); - - /* start by unlocking the ones we've left hanging, if any */ - for (pos = kh_begin(tx->locks); pos < kh_end(tx->locks); pos++) { - if (!git_strmap_has_data(tx->locks, pos)) - continue; - - node = git_strmap_value_at(tx->locks, pos); - if (node->committed) - continue; - - git_refdb_unlock(tx->db, node->payload, false, false, NULL, NULL, NULL); - } - - git_refdb_free(tx->db); - git_strmap_free(tx->locks); - - /* tx is inside the pool, so we need to extract the data */ - memcpy(&pool, &tx->pool, sizeof(git_pool)); - git_pool_clear(&pool); -} diff --git a/vendor/libgit2/src/transport.c b/vendor/libgit2/src/transport.c deleted file mode 100644 index 5c65c7c06c..0000000000 --- a/vendor/libgit2/src/transport.c +++ /dev/null @@ -1,220 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#include "common.h" -#include "git2/types.h" -#include "git2/remote.h" -#include "git2/net.h" -#include "git2/transport.h" -#include "git2/sys/transport.h" -#include "path.h" - -typedef struct transport_definition { - char *prefix; - git_transport_cb fn; - void *param; -} transport_definition; - -static git_smart_subtransport_definition http_subtransport_definition = { git_smart_subtransport_http, 1, NULL }; -static git_smart_subtransport_definition git_subtransport_definition = { git_smart_subtransport_git, 0, NULL }; -#ifdef GIT_SSH -static git_smart_subtransport_definition ssh_subtransport_definition = { git_smart_subtransport_ssh, 0, NULL }; -#endif - -static transport_definition local_transport_definition = { "file://", git_transport_local, NULL }; - -static transport_definition transports[] = { - { "git://", git_transport_smart, &git_subtransport_definition }, - { "http://", git_transport_smart, &http_subtransport_definition }, -#if defined(GIT_OPENSSL) || defined(GIT_WINHTTP) || defined(GIT_SECURE_TRANSPORT) - { "https://", git_transport_smart, &http_subtransport_definition }, -#endif - { "file://", git_transport_local, NULL }, -#ifdef GIT_SSH - { "ssh://", git_transport_smart, &ssh_subtransport_definition }, -#endif - { NULL, 0, 0 } -}; - -static git_vector custom_transports = GIT_VECTOR_INIT; - -#define GIT_TRANSPORT_COUNT (sizeof(transports)/sizeof(transports[0])) - 1 - -static transport_definition * transport_find_by_url(const char *url) -{ - size_t i = 0; - transport_definition *d; - - /* Find a user transport who wants to deal with this URI */ - git_vector_foreach(&custom_transports, i, d) { - if (strncasecmp(url, d->prefix, strlen(d->prefix)) == 0) { - return d; - } - } - - /* Find a system transport for this URI */ - for (i = 0; i < GIT_TRANSPORT_COUNT; ++i) { - d = &transports[i]; - - if (strncasecmp(url, d->prefix, strlen(d->prefix)) == 0) { - return d; - } - } - - return NULL; -} - -static int transport_find_fn( - git_transport_cb *out, - const char *url, - void **param) -{ - transport_definition *definition = transport_find_by_url(url); - -#ifdef GIT_WIN32 - /* On Windows, it might not be possible to discern between absolute local - * and ssh paths - first check if this is a valid local path that points - * to a directory and if so assume local path, else assume SSH */ - - /* Check to see if the path points to a file on the local file system */ - if (!definition && git_path_exists(url) && git_path_isdir(url)) - definition = &local_transport_definition; -#endif - - /* For other systems, perform the SSH check first, to avoid going to the - * filesystem if it is not necessary */ - - /* It could be a SSH remote path. Check to see if there's a : - * SSH is an unsupported transport mechanism in this version of libgit2 */ - if (!definition && strrchr(url, ':')) { - // re-search transports again with ssh:// as url so that we can find a third party ssh transport - definition = transport_find_by_url("ssh://"); - } - -#ifndef GIT_WIN32 - /* Check to see if the path points to a file on the local file system */ - if (!definition && git_path_exists(url) && git_path_isdir(url)) - definition = &local_transport_definition; -#endif - - if (!definition) - return GIT_ENOTFOUND; - - *out = definition->fn; - *param = definition->param; - - return 0; -} - -/************** - * Public API * - **************/ - -int git_transport_new(git_transport **out, git_remote *owner, const char *url) -{ - git_transport_cb fn; - git_transport *transport; - void *param; - int error; - - if ((error = transport_find_fn(&fn, url, ¶m)) == GIT_ENOTFOUND) { - giterr_set(GITERR_NET, "Unsupported URL protocol"); - return -1; - } else if (error < 0) - return error; - - if ((error = fn(&transport, owner, param)) < 0) - return error; - - GITERR_CHECK_VERSION(transport, GIT_TRANSPORT_VERSION, "git_transport"); - - *out = transport; - - return 0; -} - -int git_transport_register( - const char *scheme, - git_transport_cb cb, - void *param) -{ - git_buf prefix = GIT_BUF_INIT; - transport_definition *d, *definition = NULL; - size_t i; - int error = 0; - - assert(scheme); - assert(cb); - - if ((error = git_buf_printf(&prefix, "%s://", scheme)) < 0) - goto on_error; - - git_vector_foreach(&custom_transports, i, d) { - if (strcasecmp(d->prefix, prefix.ptr) == 0) { - error = GIT_EEXISTS; - goto on_error; - } - } - - definition = git__calloc(1, sizeof(transport_definition)); - GITERR_CHECK_ALLOC(definition); - - definition->prefix = git_buf_detach(&prefix); - definition->fn = cb; - definition->param = param; - - if (git_vector_insert(&custom_transports, definition) < 0) - goto on_error; - - return 0; - -on_error: - git_buf_free(&prefix); - git__free(definition); - return error; -} - -int git_transport_unregister(const char *scheme) -{ - git_buf prefix = GIT_BUF_INIT; - transport_definition *d; - size_t i; - int error = 0; - - assert(scheme); - - if ((error = git_buf_printf(&prefix, "%s://", scheme)) < 0) - goto done; - - git_vector_foreach(&custom_transports, i, d) { - if (strcasecmp(d->prefix, prefix.ptr) == 0) { - if ((error = git_vector_remove(&custom_transports, i)) < 0) - goto done; - - git__free(d->prefix); - git__free(d); - - if (!custom_transports.length) - git_vector_free(&custom_transports); - - error = 0; - goto done; - } - } - - error = GIT_ENOTFOUND; - -done: - git_buf_free(&prefix); - return error; -} - -int git_transport_init(git_transport *opts, unsigned int version) -{ - GIT_INIT_STRUCTURE_FROM_TEMPLATE( - opts, version, git_transport, GIT_TRANSPORT_INIT); - return 0; -} diff --git a/vendor/libgit2/src/transports/auth.c b/vendor/libgit2/src/transports/auth.c deleted file mode 100644 index c1154db341..0000000000 --- a/vendor/libgit2/src/transports/auth.c +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#include "git2.h" -#include "buffer.h" -#include "auth.h" - -static int basic_next_token( - git_buf *out, git_http_auth_context *ctx, git_cred *c) -{ - git_cred_userpass_plaintext *cred; - git_buf raw = GIT_BUF_INIT; - int error = -1; - - GIT_UNUSED(ctx); - - if (c->credtype != GIT_CREDTYPE_USERPASS_PLAINTEXT) { - giterr_set(GITERR_INVALID, "invalid credential type for basic auth"); - goto on_error; - } - - cred = (git_cred_userpass_plaintext *)c; - - git_buf_printf(&raw, "%s:%s", cred->username, cred->password); - - if (git_buf_oom(&raw) || - git_buf_puts(out, "Authorization: Basic ") < 0 || - git_buf_encode_base64(out, git_buf_cstr(&raw), raw.size) < 0 || - git_buf_puts(out, "\r\n") < 0) - goto on_error; - - error = 0; - -on_error: - if (raw.size) - git__memzero(raw.ptr, raw.size); - - git_buf_free(&raw); - return error; -} - -static git_http_auth_context basic_context = { - GIT_AUTHTYPE_BASIC, - GIT_CREDTYPE_USERPASS_PLAINTEXT, - NULL, - basic_next_token, - NULL -}; - -int git_http_auth_basic( - git_http_auth_context **out, const gitno_connection_data *connection_data) -{ - GIT_UNUSED(connection_data); - - *out = &basic_context; - return 0; -} - -int git_http_auth_dummy( - git_http_auth_context **out, const gitno_connection_data *connection_data) -{ - GIT_UNUSED(connection_data); - - *out = NULL; - return 0; -} - diff --git a/vendor/libgit2/src/transports/auth.h b/vendor/libgit2/src/transports/auth.h deleted file mode 100644 index 52138cf8fa..0000000000 --- a/vendor/libgit2/src/transports/auth.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#ifndef INCLUDE_http_auth_h__ -#define INCLUDE_http_auth_h__ - -#include "git2.h" -#include "netops.h" - -typedef enum { - GIT_AUTHTYPE_BASIC = 1, - GIT_AUTHTYPE_NEGOTIATE = 2, -} git_http_authtype_t; - -typedef struct git_http_auth_context git_http_auth_context; - -struct git_http_auth_context { - /** Type of scheme */ - git_http_authtype_t type; - - /** Supported credentials */ - git_credtype_t credtypes; - - /** Sets the challenge on the authentication context */ - int (*set_challenge)(git_http_auth_context *ctx, const char *challenge); - - /** Gets the next authentication token from the context */ - int (*next_token)(git_buf *out, git_http_auth_context *ctx, git_cred *cred); - - /** Frees the authentication context */ - void (*free)(git_http_auth_context *ctx); -}; - -typedef struct { - /** Type of scheme */ - git_http_authtype_t type; - - /** Name of the scheme (as used in the Authorization header) */ - const char *name; - - /** Credential types this scheme supports */ - git_credtype_t credtypes; - - /** Function to initialize an authentication context */ - int (*init_context)( - git_http_auth_context **out, - const gitno_connection_data *connection_data); -} git_http_auth_scheme; - -int git_http_auth_dummy( - git_http_auth_context **out, - const gitno_connection_data *connection_data); - -int git_http_auth_basic( - git_http_auth_context **out, - const gitno_connection_data *connection_data); - -#endif - diff --git a/vendor/libgit2/src/transports/auth_negotiate.c b/vendor/libgit2/src/transports/auth_negotiate.c deleted file mode 100644 index 8b99fc735c..0000000000 --- a/vendor/libgit2/src/transports/auth_negotiate.c +++ /dev/null @@ -1,275 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#ifdef GIT_GSSAPI - -#include "git2.h" -#include "common.h" -#include "buffer.h" -#include "auth.h" - -#include -#include - -static gss_OID_desc negotiate_oid_spnego = - { 6, (void *) "\x2b\x06\x01\x05\x05\x02" }; -static gss_OID_desc negotiate_oid_krb5 = - { 9, (void *) "\x2a\x86\x48\x86\xf7\x12\x01\x02\x02" }; - -static gss_OID negotiate_oids[] = - { &negotiate_oid_spnego, &negotiate_oid_krb5, NULL }; - -typedef struct { - git_http_auth_context parent; - unsigned configured : 1, - complete : 1; - git_buf target; - char *challenge; - gss_ctx_id_t gss_context; - gss_OID oid; -} http_auth_negotiate_context; - -static void negotiate_err_set( - OM_uint32 status_major, - OM_uint32 status_minor, - const char *message) -{ - gss_buffer_desc buffer = GSS_C_EMPTY_BUFFER; - OM_uint32 status_display, context = 0; - - if (gss_display_status(&status_display, status_major, GSS_C_GSS_CODE, - GSS_C_NO_OID, &context, &buffer) == GSS_S_COMPLETE) { - giterr_set(GITERR_NET, "%s: %.*s (%d.%d)", - message, (int)buffer.length, (const char *)buffer.value, - status_major, status_minor); - gss_release_buffer(&status_minor, &buffer); - } else { - giterr_set(GITERR_NET, "%s: unknown negotiate error (%d.%d)", - message, status_major, status_minor); - } -} - -static int negotiate_set_challenge( - git_http_auth_context *c, - const char *challenge) -{ - http_auth_negotiate_context *ctx = (http_auth_negotiate_context *)c; - - assert(ctx && ctx->configured && challenge); - - git__free(ctx->challenge); - - ctx->challenge = git__strdup(challenge); - GITERR_CHECK_ALLOC(ctx->challenge); - - return 0; -} - -static int negotiate_next_token( - git_buf *buf, - git_http_auth_context *c, - git_cred *cred) -{ - http_auth_negotiate_context *ctx = (http_auth_negotiate_context *)c; - OM_uint32 status_major, status_minor; - gss_buffer_desc target_buffer = GSS_C_EMPTY_BUFFER, - input_token = GSS_C_EMPTY_BUFFER, - output_token = GSS_C_EMPTY_BUFFER; - gss_buffer_t input_token_ptr = GSS_C_NO_BUFFER; - git_buf input_buf = GIT_BUF_INIT; - gss_name_t server = NULL; - gss_OID mech; - size_t challenge_len; - int error = 0; - - assert(buf && ctx && ctx->configured && cred && cred->credtype == GIT_CREDTYPE_DEFAULT); - - if (ctx->complete) - return 0; - - target_buffer.value = (void *)ctx->target.ptr; - target_buffer.length = ctx->target.size; - - status_major = gss_import_name(&status_minor, &target_buffer, - GSS_C_NT_HOSTBASED_SERVICE, &server); - - if (GSS_ERROR(status_major)) { - negotiate_err_set(status_major, status_minor, - "Could not parse principal"); - error = -1; - goto done; - } - - challenge_len = ctx->challenge ? strlen(ctx->challenge) : 0; - - if (challenge_len < 9) { - giterr_set(GITERR_NET, "No negotiate challenge sent from server"); - error = -1; - goto done; - } else if (challenge_len > 9) { - if (git_buf_decode_base64(&input_buf, - ctx->challenge + 10, challenge_len - 10) < 0) { - giterr_set(GITERR_NET, "Invalid negotiate challenge from server"); - error = -1; - goto done; - } - - input_token.value = input_buf.ptr; - input_token.length = input_buf.size; - input_token_ptr = &input_token; - } else if (ctx->gss_context != GSS_C_NO_CONTEXT) { - giterr_set(GITERR_NET, "Could not restart authentication"); - error = -1; - goto done; - } - - mech = &negotiate_oid_spnego; - - if (GSS_ERROR(status_major = gss_init_sec_context( - &status_minor, - GSS_C_NO_CREDENTIAL, - &ctx->gss_context, - server, - mech, - GSS_C_DELEG_FLAG | GSS_C_MUTUAL_FLAG, - GSS_C_INDEFINITE, - GSS_C_NO_CHANNEL_BINDINGS, - input_token_ptr, - NULL, - &output_token, - NULL, - NULL))) { - negotiate_err_set(status_major, status_minor, "Negotiate failure"); - error = -1; - goto done; - } - - /* This message merely told us auth was complete; we do not respond. */ - if (status_major == GSS_S_COMPLETE) { - ctx->complete = 1; - goto done; - } - - git_buf_puts(buf, "Authorization: Negotiate "); - git_buf_encode_base64(buf, output_token.value, output_token.length); - git_buf_puts(buf, "\r\n"); - - if (git_buf_oom(buf)) - error = -1; - -done: - gss_release_name(&status_minor, &server); - gss_release_buffer(&status_minor, (gss_buffer_t) &output_token); - git_buf_free(&input_buf); - return error; -} - -static void negotiate_context_free(git_http_auth_context *c) -{ - http_auth_negotiate_context *ctx = (http_auth_negotiate_context *)c; - OM_uint32 status_minor; - - if (ctx->gss_context != GSS_C_NO_CONTEXT) { - gss_delete_sec_context( - &status_minor, &ctx->gss_context, GSS_C_NO_BUFFER); - ctx->gss_context = GSS_C_NO_CONTEXT; - } - - git_buf_free(&ctx->target); - - git__free(ctx->challenge); - - ctx->configured = 0; - ctx->complete = 0; - ctx->oid = NULL; - - git__free(ctx); -} - -static int negotiate_init_context( - http_auth_negotiate_context *ctx, - const gitno_connection_data *connection_data) -{ - OM_uint32 status_major, status_minor; - gss_OID item, *oid; - gss_OID_set mechanism_list; - size_t i; - - /* Query supported mechanisms looking for SPNEGO) */ - if (GSS_ERROR(status_major = - gss_indicate_mechs(&status_minor, &mechanism_list))) { - negotiate_err_set(status_major, status_minor, - "could not query mechanisms"); - return -1; - } - - if (mechanism_list) { - for (oid = negotiate_oids; *oid; oid++) { - for (i = 0; i < mechanism_list->count; i++) { - item = &mechanism_list->elements[i]; - - if (item->length == (*oid)->length && - memcmp(item->elements, (*oid)->elements, item->length) == 0) { - ctx->oid = *oid; - break; - } - - } - - if (ctx->oid) - break; - } - } - - gss_release_oid_set(&status_minor, &mechanism_list); - - if (!ctx->oid) { - giterr_set(GITERR_NET, "Negotiate authentication is not supported"); - return -1; - } - - git_buf_puts(&ctx->target, "HTTP@"); - git_buf_puts(&ctx->target, connection_data->host); - - if (git_buf_oom(&ctx->target)) - return -1; - - ctx->gss_context = GSS_C_NO_CONTEXT; - ctx->configured = 1; - - return 0; -} - -int git_http_auth_negotiate( - git_http_auth_context **out, - const gitno_connection_data *connection_data) -{ - http_auth_negotiate_context *ctx; - - *out = NULL; - - ctx = git__calloc(1, sizeof(http_auth_negotiate_context)); - GITERR_CHECK_ALLOC(ctx); - - if (negotiate_init_context(ctx, connection_data) < 0) { - git__free(ctx); - return -1; - } - - ctx->parent.type = GIT_AUTHTYPE_NEGOTIATE; - ctx->parent.credtypes = GIT_CREDTYPE_DEFAULT; - ctx->parent.set_challenge = negotiate_set_challenge; - ctx->parent.next_token = negotiate_next_token; - ctx->parent.free = negotiate_context_free; - - *out = (git_http_auth_context *)ctx; - - return 0; -} - -#endif /* GIT_GSSAPI */ - diff --git a/vendor/libgit2/src/transports/auth_negotiate.h b/vendor/libgit2/src/transports/auth_negotiate.h deleted file mode 100644 index d7270b7aba..0000000000 --- a/vendor/libgit2/src/transports/auth_negotiate.h +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#ifndef INCLUDE_auth_negotiate_h__ -#define INCLUDE_auth_negotiate_h__ - -#include "git2.h" -#include "auth.h" - -#ifdef GIT_GSSAPI - -extern int git_http_auth_negotiate( - git_http_auth_context **out, - const gitno_connection_data *connection_data); - -#else - -#define git_http_auth_negotiate git_http_auth_dummy - -#endif /* GIT_GSSAPI */ - -#endif - diff --git a/vendor/libgit2/src/transports/cred.c b/vendor/libgit2/src/transports/cred.c deleted file mode 100644 index 044b2a262f..0000000000 --- a/vendor/libgit2/src/transports/cred.c +++ /dev/null @@ -1,380 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#include "git2.h" -#include "smart.h" -#include "git2/cred_helpers.h" - -static int git_cred_ssh_key_type_new( - git_cred **cred, - const char *username, - const char *publickey, - const char *privatekey, - const char *passphrase, - git_credtype_t credtype); - -int git_cred_has_username(git_cred *cred) -{ - if (cred->credtype == GIT_CREDTYPE_DEFAULT) - return 0; - - return 1; -} - -const char *git_cred__username(git_cred *cred) -{ - switch (cred->credtype) { - case GIT_CREDTYPE_USERNAME: - { - git_cred_username *c = (git_cred_username *) cred; - return c->username; - } - case GIT_CREDTYPE_USERPASS_PLAINTEXT: - { - git_cred_userpass_plaintext *c = (git_cred_userpass_plaintext *) cred; - return c->username; - } - case GIT_CREDTYPE_SSH_KEY: - case GIT_CREDTYPE_SSH_MEMORY: - { - git_cred_ssh_key *c = (git_cred_ssh_key *) cred; - return c->username; - } - case GIT_CREDTYPE_SSH_CUSTOM: - { - git_cred_ssh_custom *c = (git_cred_ssh_custom *) cred; - return c->username; - } - case GIT_CREDTYPE_SSH_INTERACTIVE: - { - git_cred_ssh_interactive *c = (git_cred_ssh_interactive *) cred; - return c->username; - } - - default: - return NULL; - } -} - -static void plaintext_free(struct git_cred *cred) -{ - git_cred_userpass_plaintext *c = (git_cred_userpass_plaintext *)cred; - - git__free(c->username); - - /* Zero the memory which previously held the password */ - if (c->password) { - size_t pass_len = strlen(c->password); - git__memzero(c->password, pass_len); - git__free(c->password); - } - - git__free(c); -} - -int git_cred_userpass_plaintext_new( - git_cred **cred, - const char *username, - const char *password) -{ - git_cred_userpass_plaintext *c; - - assert(cred && username && password); - - c = git__malloc(sizeof(git_cred_userpass_plaintext)); - GITERR_CHECK_ALLOC(c); - - c->parent.credtype = GIT_CREDTYPE_USERPASS_PLAINTEXT; - c->parent.free = plaintext_free; - c->username = git__strdup(username); - - if (!c->username) { - git__free(c); - return -1; - } - - c->password = git__strdup(password); - - if (!c->password) { - git__free(c->username); - git__free(c); - return -1; - } - - *cred = &c->parent; - return 0; -} - -static void ssh_key_free(struct git_cred *cred) -{ - git_cred_ssh_key *c = - (git_cred_ssh_key *)cred; - - git__free(c->username); - - if (c->privatekey) { - /* Zero the memory which previously held the private key */ - size_t key_len = strlen(c->privatekey); - git__memzero(c->privatekey, key_len); - git__free(c->privatekey); - } - - if (c->passphrase) { - /* Zero the memory which previously held the passphrase */ - size_t pass_len = strlen(c->passphrase); - git__memzero(c->passphrase, pass_len); - git__free(c->passphrase); - } - - if (c->publickey) { - /* Zero the memory which previously held the public key */ - size_t key_len = strlen(c->publickey); - git__memzero(c->publickey, key_len); - git__free(c->publickey); - } - - git__free(c); -} - -static void ssh_interactive_free(struct git_cred *cred) -{ - git_cred_ssh_interactive *c = (git_cred_ssh_interactive *)cred; - - git__free(c->username); - - git__free(c); -} - -static void ssh_custom_free(struct git_cred *cred) -{ - git_cred_ssh_custom *c = (git_cred_ssh_custom *)cred; - - git__free(c->username); - - if (c->publickey) { - /* Zero the memory which previously held the publickey */ - size_t key_len = strlen(c->publickey); - git__memzero(c->publickey, key_len); - git__free(c->publickey); - } - - git__free(c); -} - -static void default_free(struct git_cred *cred) -{ - git_cred_default *c = (git_cred_default *)cred; - - git__free(c); -} - -static void username_free(struct git_cred *cred) -{ - git__free(cred); -} - -int git_cred_ssh_key_new( - git_cred **cred, - const char *username, - const char *publickey, - const char *privatekey, - const char *passphrase) -{ - return git_cred_ssh_key_type_new( - cred, - username, - publickey, - privatekey, - passphrase, - GIT_CREDTYPE_SSH_KEY); -} - -int git_cred_ssh_key_memory_new( - git_cred **cred, - const char *username, - const char *publickey, - const char *privatekey, - const char *passphrase) -{ -#ifdef GIT_SSH_MEMORY_CREDENTIALS - return git_cred_ssh_key_type_new( - cred, - username, - publickey, - privatekey, - passphrase, - GIT_CREDTYPE_SSH_MEMORY); -#else - GIT_UNUSED(cred); - GIT_UNUSED(username); - GIT_UNUSED(publickey); - GIT_UNUSED(privatekey); - GIT_UNUSED(passphrase); - - giterr_set(GITERR_INVALID, - "This version of libgit2 was not built with ssh memory credentials."); - return -1; -#endif -} - -static int git_cred_ssh_key_type_new( - git_cred **cred, - const char *username, - const char *publickey, - const char *privatekey, - const char *passphrase, - git_credtype_t credtype) -{ - git_cred_ssh_key *c; - - assert(username && cred && privatekey); - - c = git__calloc(1, sizeof(git_cred_ssh_key)); - GITERR_CHECK_ALLOC(c); - - c->parent.credtype = credtype; - c->parent.free = ssh_key_free; - - c->username = git__strdup(username); - GITERR_CHECK_ALLOC(c->username); - - c->privatekey = git__strdup(privatekey); - GITERR_CHECK_ALLOC(c->privatekey); - - if (publickey) { - c->publickey = git__strdup(publickey); - GITERR_CHECK_ALLOC(c->publickey); - } - - if (passphrase) { - c->passphrase = git__strdup(passphrase); - GITERR_CHECK_ALLOC(c->passphrase); - } - - *cred = &c->parent; - return 0; -} - -int git_cred_ssh_interactive_new( - git_cred **out, - const char *username, - git_cred_ssh_interactive_callback prompt_callback, - void *payload) -{ - git_cred_ssh_interactive *c; - - assert(out && username && prompt_callback); - - c = git__calloc(1, sizeof(git_cred_ssh_interactive)); - GITERR_CHECK_ALLOC(c); - - c->parent.credtype = GIT_CREDTYPE_SSH_INTERACTIVE; - c->parent.free = ssh_interactive_free; - - c->username = git__strdup(username); - GITERR_CHECK_ALLOC(c->username); - - c->prompt_callback = prompt_callback; - c->payload = payload; - - *out = &c->parent; - return 0; -} - -int git_cred_ssh_key_from_agent(git_cred **cred, const char *username) { - git_cred_ssh_key *c; - - assert(username && cred); - - c = git__calloc(1, sizeof(git_cred_ssh_key)); - GITERR_CHECK_ALLOC(c); - - c->parent.credtype = GIT_CREDTYPE_SSH_KEY; - c->parent.free = ssh_key_free; - - c->username = git__strdup(username); - GITERR_CHECK_ALLOC(c->username); - - c->privatekey = NULL; - - *cred = &c->parent; - return 0; -} - -int git_cred_ssh_custom_new( - git_cred **cred, - const char *username, - const char *publickey, - size_t publickey_len, - git_cred_sign_callback sign_callback, - void *payload) -{ - git_cred_ssh_custom *c; - - assert(username && cred); - - c = git__calloc(1, sizeof(git_cred_ssh_custom)); - GITERR_CHECK_ALLOC(c); - - c->parent.credtype = GIT_CREDTYPE_SSH_CUSTOM; - c->parent.free = ssh_custom_free; - - c->username = git__strdup(username); - GITERR_CHECK_ALLOC(c->username); - - if (publickey_len > 0) { - c->publickey = git__malloc(publickey_len); - GITERR_CHECK_ALLOC(c->publickey); - - memcpy(c->publickey, publickey, publickey_len); - } - - c->publickey_len = publickey_len; - c->sign_callback = sign_callback; - c->payload = payload; - - *cred = &c->parent; - return 0; -} - -int git_cred_default_new(git_cred **cred) -{ - git_cred_default *c; - - assert(cred); - - c = git__calloc(1, sizeof(git_cred_default)); - GITERR_CHECK_ALLOC(c); - - c->credtype = GIT_CREDTYPE_DEFAULT; - c->free = default_free; - - *cred = c; - return 0; -} - -int git_cred_username_new(git_cred **cred, const char *username) -{ - git_cred_username *c; - size_t len, allocsize; - - assert(cred); - - len = strlen(username); - - GITERR_CHECK_ALLOC_ADD(&allocsize, sizeof(git_cred_username), len); - GITERR_CHECK_ALLOC_ADD(&allocsize, allocsize, 1); - c = git__malloc(allocsize); - GITERR_CHECK_ALLOC(c); - - c->parent.credtype = GIT_CREDTYPE_USERNAME; - c->parent.free = username_free; - memcpy(c->username, username, len + 1); - - *cred = (git_cred *) c; - return 0; -} diff --git a/vendor/libgit2/src/transports/cred.h b/vendor/libgit2/src/transports/cred.h deleted file mode 100644 index 2de8deee81..0000000000 --- a/vendor/libgit2/src/transports/cred.h +++ /dev/null @@ -1,14 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_cred_h__ -#define INCLUDE_git_cred_h__ - -#include "git2/transport.h" - -const char *git_cred__username(git_cred *cred); - -#endif diff --git a/vendor/libgit2/src/transports/cred_helpers.c b/vendor/libgit2/src/transports/cred_helpers.c deleted file mode 100644 index 5cc9b08692..0000000000 --- a/vendor/libgit2/src/transports/cred_helpers.c +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#include "common.h" -#include "git2/cred_helpers.h" - -int git_cred_userpass( - git_cred **cred, - const char *url, - const char *user_from_url, - unsigned int allowed_types, - void *payload) -{ - git_cred_userpass_payload *userpass = (git_cred_userpass_payload*)payload; - const char *effective_username = NULL; - - GIT_UNUSED(url); - - if (!userpass || !userpass->password) return -1; - - /* Username resolution: a username can be passed with the URL, the - * credentials payload, or both. Here's what we do. Note that if we get - * this far, we know that any password the url may contain has already - * failed at least once, so we ignore it. - * - * | Payload | URL | Used | - * +-------------+----------+-----------+ - * | yes | no | payload | - * | yes | yes | payload | - * | no | yes | url | - * | no | no | FAIL | - */ - if (userpass->username) - effective_username = userpass->username; - else if (user_from_url) - effective_username = user_from_url; - else - return -1; - - if (GIT_CREDTYPE_USERNAME & allowed_types) - return git_cred_username_new(cred, effective_username); - - if ((GIT_CREDTYPE_USERPASS_PLAINTEXT & allowed_types) == 0 || - git_cred_userpass_plaintext_new(cred, effective_username, userpass->password) < 0) - return -1; - - return 0; -} diff --git a/vendor/libgit2/src/transports/git.c b/vendor/libgit2/src/transports/git.c deleted file mode 100644 index 52de92d096..0000000000 --- a/vendor/libgit2/src/transports/git.c +++ /dev/null @@ -1,365 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#include "git2.h" -#include "buffer.h" -#include "netops.h" -#include "git2/sys/transport.h" -#include "stream.h" -#include "socket_stream.h" - -#define OWNING_SUBTRANSPORT(s) ((git_subtransport *)(s)->parent.subtransport) - -static const char prefix_git[] = "git://"; -static const char cmd_uploadpack[] = "git-upload-pack"; -static const char cmd_receivepack[] = "git-receive-pack"; - -typedef struct { - git_smart_subtransport_stream parent; - git_stream *io; - const char *cmd; - char *url; - unsigned sent_command : 1; -} git_proto_stream; - -typedef struct { - git_smart_subtransport parent; - git_transport *owner; - git_proto_stream *current_stream; -} git_subtransport; - -/* - * Create a git protocol request. - * - * For example: 0035git-upload-pack /libgit2/libgit2\0host=github.com\0 - */ -static int gen_proto(git_buf *request, const char *cmd, const char *url) -{ - char *delim, *repo; - char host[] = "host="; - size_t len; - - delim = strchr(url, '/'); - if (delim == NULL) { - giterr_set(GITERR_NET, "Malformed URL"); - return -1; - } - - repo = delim; - if (repo[1] == '~') - ++repo; - - delim = strchr(url, ':'); - if (delim == NULL) - delim = strchr(url, '/'); - - len = 4 + strlen(cmd) + 1 + strlen(repo) + 1 + strlen(host) + (delim - url) + 1; - - git_buf_grow(request, len); - git_buf_printf(request, "%04x%s %s%c%s", - (unsigned int)(len & 0x0FFFF), cmd, repo, 0, host); - git_buf_put(request, url, delim - url); - git_buf_putc(request, '\0'); - - if (git_buf_oom(request)) - return -1; - - return 0; -} - -static int send_command(git_proto_stream *s) -{ - int error; - git_buf request = GIT_BUF_INIT; - - error = gen_proto(&request, s->cmd, s->url); - if (error < 0) - goto cleanup; - - error = git_stream_write(s->io, request.ptr, request.size, 0); - if (error >= 0) - s->sent_command = 1; - -cleanup: - git_buf_free(&request); - return error; -} - -static int git_proto_stream_read( - git_smart_subtransport_stream *stream, - char *buffer, - size_t buf_size, - size_t *bytes_read) -{ - int error; - git_proto_stream *s = (git_proto_stream *)stream; - gitno_buffer buf; - - *bytes_read = 0; - - if (!s->sent_command && (error = send_command(s)) < 0) - return error; - - gitno_buffer_setup_fromstream(s->io, &buf, buffer, buf_size); - - if ((error = gitno_recv(&buf)) < 0) - return error; - - *bytes_read = buf.offset; - - return 0; -} - -static int git_proto_stream_write( - git_smart_subtransport_stream *stream, - const char *buffer, - size_t len) -{ - int error; - git_proto_stream *s = (git_proto_stream *)stream; - - if (!s->sent_command && (error = send_command(s)) < 0) - return error; - - return git_stream_write(s->io, buffer, len, 0); -} - -static void git_proto_stream_free(git_smart_subtransport_stream *stream) -{ - git_proto_stream *s = (git_proto_stream *)stream; - git_subtransport *t = OWNING_SUBTRANSPORT(s); - int ret; - - GIT_UNUSED(ret); - - t->current_stream = NULL; - - git_stream_close(s->io); - git_stream_free(s->io); - git__free(s->url); - git__free(s); -} - -static int git_proto_stream_alloc( - git_subtransport *t, - const char *url, - const char *cmd, - const char *host, - const char *port, - git_smart_subtransport_stream **stream) -{ - git_proto_stream *s; - - if (!stream) - return -1; - - s = git__calloc(1, sizeof(git_proto_stream)); - GITERR_CHECK_ALLOC(s); - - s->parent.subtransport = &t->parent; - s->parent.read = git_proto_stream_read; - s->parent.write = git_proto_stream_write; - s->parent.free = git_proto_stream_free; - - s->cmd = cmd; - s->url = git__strdup(url); - - if (!s->url) { - git__free(s); - return -1; - } - - if ((git_socket_stream_new(&s->io, host, port)) < 0) - return -1; - - GITERR_CHECK_VERSION(s->io, GIT_STREAM_VERSION, "git_stream"); - - *stream = &s->parent; - return 0; -} - -static int _git_uploadpack_ls( - git_subtransport *t, - const char *url, - git_smart_subtransport_stream **stream) -{ - char *host=NULL, *port=NULL, *path=NULL, *user=NULL, *pass=NULL; - const char *stream_url = url; - git_proto_stream *s; - int error; - - *stream = NULL; - - if (!git__prefixcmp(url, prefix_git)) - stream_url += strlen(prefix_git); - - if ((error = gitno_extract_url_parts(&host, &port, &path, &user, &pass, url, GIT_DEFAULT_PORT)) < 0) - return error; - - error = git_proto_stream_alloc(t, stream_url, cmd_uploadpack, host, port, stream); - - git__free(host); - git__free(port); - git__free(path); - git__free(user); - git__free(pass); - - - if (error < 0) { - git_proto_stream_free(*stream); - return error; - } - - s = (git_proto_stream *) *stream; - if ((error = git_stream_connect(s->io)) < 0) { - git_proto_stream_free(*stream); - return error; - } - - t->current_stream = s; - - return 0; -} - -static int _git_uploadpack( - git_subtransport *t, - const char *url, - git_smart_subtransport_stream **stream) -{ - GIT_UNUSED(url); - - if (t->current_stream) { - *stream = &t->current_stream->parent; - return 0; - } - - giterr_set(GITERR_NET, "Must call UPLOADPACK_LS before UPLOADPACK"); - return -1; -} - -static int _git_receivepack_ls( - git_subtransport *t, - const char *url, - git_smart_subtransport_stream **stream) -{ - char *host=NULL, *port=NULL, *path=NULL, *user=NULL, *pass=NULL; - const char *stream_url = url; - git_proto_stream *s; - int error; - - *stream = NULL; - if (!git__prefixcmp(url, prefix_git)) - stream_url += strlen(prefix_git); - - if ((error = gitno_extract_url_parts(&host, &port, &path, &user, &pass, url, GIT_DEFAULT_PORT)) < 0) - return error; - - error = git_proto_stream_alloc(t, stream_url, cmd_receivepack, host, port, stream); - - git__free(host); - git__free(port); - git__free(path); - git__free(user); - git__free(pass); - - if (error < 0) { - git_proto_stream_free(*stream); - return error; - } - - s = (git_proto_stream *) *stream; - - if ((error = git_stream_connect(s->io)) < 0) - return error; - - t->current_stream = s; - - return 0; -} - -static int _git_receivepack( - git_subtransport *t, - const char *url, - git_smart_subtransport_stream **stream) -{ - GIT_UNUSED(url); - - if (t->current_stream) { - *stream = &t->current_stream->parent; - return 0; - } - - giterr_set(GITERR_NET, "Must call RECEIVEPACK_LS before RECEIVEPACK"); - return -1; -} - -static int _git_action( - git_smart_subtransport_stream **stream, - git_smart_subtransport *subtransport, - const char *url, - git_smart_service_t action) -{ - git_subtransport *t = (git_subtransport *) subtransport; - - switch (action) { - case GIT_SERVICE_UPLOADPACK_LS: - return _git_uploadpack_ls(t, url, stream); - - case GIT_SERVICE_UPLOADPACK: - return _git_uploadpack(t, url, stream); - - case GIT_SERVICE_RECEIVEPACK_LS: - return _git_receivepack_ls(t, url, stream); - - case GIT_SERVICE_RECEIVEPACK: - return _git_receivepack(t, url, stream); - } - - *stream = NULL; - return -1; -} - -static int _git_close(git_smart_subtransport *subtransport) -{ - git_subtransport *t = (git_subtransport *) subtransport; - - assert(!t->current_stream); - - GIT_UNUSED(t); - - return 0; -} - -static void _git_free(git_smart_subtransport *subtransport) -{ - git_subtransport *t = (git_subtransport *) subtransport; - - assert(!t->current_stream); - - git__free(t); -} - -int git_smart_subtransport_git(git_smart_subtransport **out, git_transport *owner, void *param) -{ - git_subtransport *t; - - GIT_UNUSED(param); - - if (!out) - return -1; - - t = git__calloc(1, sizeof(git_subtransport)); - GITERR_CHECK_ALLOC(t); - - t->owner = owner; - t->parent.action = _git_action; - t->parent.close = _git_close; - t->parent.free = _git_free; - - *out = (git_smart_subtransport *) t; - return 0; -} diff --git a/vendor/libgit2/src/transports/http.c b/vendor/libgit2/src/transports/http.c deleted file mode 100644 index e3d90de11a..0000000000 --- a/vendor/libgit2/src/transports/http.c +++ /dev/null @@ -1,1057 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef GIT_WINHTTP - -#include "git2.h" -#include "http_parser.h" -#include "buffer.h" -#include "netops.h" -#include "remote.h" -#include "smart.h" -#include "auth.h" -#include "auth_negotiate.h" -#include "tls_stream.h" -#include "socket_stream.h" -#include "curl_stream.h" - -git_http_auth_scheme auth_schemes[] = { - { GIT_AUTHTYPE_NEGOTIATE, "Negotiate", GIT_CREDTYPE_DEFAULT, git_http_auth_negotiate }, - { GIT_AUTHTYPE_BASIC, "Basic", GIT_CREDTYPE_USERPASS_PLAINTEXT, git_http_auth_basic }, -}; - -static const char *upload_pack_service = "upload-pack"; -static const char *upload_pack_ls_service_url = "/info/refs?service=git-upload-pack"; -static const char *upload_pack_service_url = "/git-upload-pack"; -static const char *receive_pack_service = "receive-pack"; -static const char *receive_pack_ls_service_url = "/info/refs?service=git-receive-pack"; -static const char *receive_pack_service_url = "/git-receive-pack"; -static const char *get_verb = "GET"; -static const char *post_verb = "POST"; - -#define OWNING_SUBTRANSPORT(s) ((http_subtransport *)(s)->parent.subtransport) - -#define PARSE_ERROR_GENERIC -1 -#define PARSE_ERROR_REPLAY -2 - -#define CHUNK_SIZE 4096 - -enum last_cb { - NONE, - FIELD, - VALUE -}; - -typedef struct { - git_smart_subtransport_stream parent; - const char *service; - const char *service_url; - char *redirect_url; - const char *verb; - char *chunk_buffer; - unsigned chunk_buffer_len; - unsigned sent_request : 1, - received_response : 1, - chunked : 1, - redirect_count : 3; -} http_stream; - -typedef struct { - git_smart_subtransport parent; - transport_smart *owner; - git_stream *io; - gitno_connection_data connection_data; - bool connected; - - /* Parser structures */ - http_parser parser; - http_parser_settings settings; - gitno_buffer parse_buffer; - git_buf parse_header_name; - git_buf parse_header_value; - char parse_buffer_data[NETIO_BUFSIZE]; - char *content_type; - char *location; - git_vector www_authenticate; - enum last_cb last_cb; - int parse_error; - unsigned parse_finished : 1; - - /* Authentication */ - git_cred *cred; - git_cred *url_cred; - git_vector auth_contexts; -} http_subtransport; - -typedef struct { - http_stream *s; - http_subtransport *t; - - /* Target buffer details from read() */ - char *buffer; - size_t buf_size; - size_t *bytes_read; -} parser_context; - -static bool credtype_match(git_http_auth_scheme *scheme, void *data) -{ - unsigned int credtype = *(unsigned int *)data; - - return !!(scheme->credtypes & credtype); -} - -static bool challenge_match(git_http_auth_scheme *scheme, void *data) -{ - const char *scheme_name = scheme->name; - const char *challenge = (const char *)data; - size_t scheme_len; - - scheme_len = strlen(scheme_name); - return (strncmp(challenge, scheme_name, scheme_len) == 0 && - (challenge[scheme_len] == '\0' || challenge[scheme_len] == ' ')); -} - -static int auth_context_match( - git_http_auth_context **out, - http_subtransport *t, - bool (*scheme_match)(git_http_auth_scheme *scheme, void *data), - void *data) -{ - git_http_auth_scheme *scheme = NULL; - git_http_auth_context *context = NULL, *c; - size_t i; - - *out = NULL; - - for (i = 0; i < ARRAY_SIZE(auth_schemes); i++) { - if (scheme_match(&auth_schemes[i], data)) { - scheme = &auth_schemes[i]; - break; - } - } - - if (!scheme) - return 0; - - /* See if authentication has already started for this scheme */ - git_vector_foreach(&t->auth_contexts, i, c) { - if (c->type == scheme->type) { - context = c; - break; - } - } - - if (!context) { - if (scheme->init_context(&context, &t->connection_data) < 0) - return -1; - else if (!context) - return 0; - else if (git_vector_insert(&t->auth_contexts, context) < 0) - return -1; - } - - *out = context; - - return 0; -} - -static int apply_credentials(git_buf *buf, http_subtransport *t) -{ - git_cred *cred = t->cred; - git_http_auth_context *context; - - /* Apply the credentials given to us in the URL */ - if (!cred && t->connection_data.user && t->connection_data.pass) { - if (!t->url_cred && - git_cred_userpass_plaintext_new(&t->url_cred, - t->connection_data.user, t->connection_data.pass) < 0) - return -1; - - cred = t->url_cred; - } - - if (!cred) - return 0; - - /* Get or create a context for the best scheme for this cred type */ - if (auth_context_match(&context, t, credtype_match, &cred->credtype) < 0) - return -1; - - return context->next_token(buf, context, cred); -} - -static int gen_request( - git_buf *buf, - http_stream *s, - size_t content_length) -{ - http_subtransport *t = OWNING_SUBTRANSPORT(s); - const char *path = t->connection_data.path ? t->connection_data.path : "/"; - - git_buf_printf(buf, "%s %s%s HTTP/1.1\r\n", s->verb, path, s->service_url); - - git_buf_puts(buf, "User-Agent: git/1.0 (libgit2 " LIBGIT2_VERSION ")\r\n"); - git_buf_printf(buf, "Host: %s\r\n", t->connection_data.host); - - if (s->chunked || content_length > 0) { - git_buf_printf(buf, "Accept: application/x-git-%s-result\r\n", s->service); - git_buf_printf(buf, "Content-Type: application/x-git-%s-request\r\n", s->service); - - if (s->chunked) - git_buf_puts(buf, "Transfer-Encoding: chunked\r\n"); - else - git_buf_printf(buf, "Content-Length: %"PRIuZ "\r\n", content_length); - } else - git_buf_puts(buf, "Accept: */*\r\n"); - - /* Apply credentials to the request */ - if (apply_credentials(buf, t) < 0) - return -1; - - git_buf_puts(buf, "\r\n"); - - if (git_buf_oom(buf)) - return -1; - - return 0; -} - -static int parse_authenticate_response( - git_vector *www_authenticate, - http_subtransport *t, - int *allowed_types) -{ - git_http_auth_context *context; - char *challenge; - size_t i; - - git_vector_foreach(www_authenticate, i, challenge) { - if (auth_context_match(&context, t, challenge_match, challenge) < 0) - return -1; - else if (!context) - continue; - - if (context->set_challenge && - context->set_challenge(context, challenge) < 0) - return -1; - - *allowed_types |= context->credtypes; - } - - return 0; -} - -static int on_header_ready(http_subtransport *t) -{ - git_buf *name = &t->parse_header_name; - git_buf *value = &t->parse_header_value; - - if (!strcasecmp("Content-Type", git_buf_cstr(name))) { - if (!t->content_type) { - t->content_type = git__strdup(git_buf_cstr(value)); - GITERR_CHECK_ALLOC(t->content_type); - } - } - else if (!strcasecmp("WWW-Authenticate", git_buf_cstr(name))) { - char *dup = git__strdup(git_buf_cstr(value)); - GITERR_CHECK_ALLOC(dup); - - git_vector_insert(&t->www_authenticate, dup); - } - else if (!strcasecmp("Location", git_buf_cstr(name))) { - if (!t->location) { - t->location = git__strdup(git_buf_cstr(value)); - GITERR_CHECK_ALLOC(t->location); - } - } - - return 0; -} - -static int on_header_field(http_parser *parser, const char *str, size_t len) -{ - parser_context *ctx = (parser_context *) parser->data; - http_subtransport *t = ctx->t; - - /* Both parse_header_name and parse_header_value are populated - * and ready for consumption */ - if (VALUE == t->last_cb) - if (on_header_ready(t) < 0) - return t->parse_error = PARSE_ERROR_GENERIC; - - if (NONE == t->last_cb || VALUE == t->last_cb) - git_buf_clear(&t->parse_header_name); - - if (git_buf_put(&t->parse_header_name, str, len) < 0) - return t->parse_error = PARSE_ERROR_GENERIC; - - t->last_cb = FIELD; - return 0; -} - -static int on_header_value(http_parser *parser, const char *str, size_t len) -{ - parser_context *ctx = (parser_context *) parser->data; - http_subtransport *t = ctx->t; - - assert(NONE != t->last_cb); - - if (FIELD == t->last_cb) - git_buf_clear(&t->parse_header_value); - - if (git_buf_put(&t->parse_header_value, str, len) < 0) - return t->parse_error = PARSE_ERROR_GENERIC; - - t->last_cb = VALUE; - return 0; -} - -static int on_headers_complete(http_parser *parser) -{ - parser_context *ctx = (parser_context *) parser->data; - http_subtransport *t = ctx->t; - http_stream *s = ctx->s; - git_buf buf = GIT_BUF_INIT; - int error = 0, no_callback = 0, allowed_auth_types = 0; - - /* Both parse_header_name and parse_header_value are populated - * and ready for consumption. */ - if (VALUE == t->last_cb) - if (on_header_ready(t) < 0) - return t->parse_error = PARSE_ERROR_GENERIC; - - /* Capture authentication headers which may be a 401 (authentication - * is not complete) or a 200 (simply informing us that auth *is* - * complete.) - */ - if (parse_authenticate_response(&t->www_authenticate, t, - &allowed_auth_types) < 0) - return t->parse_error = PARSE_ERROR_GENERIC; - - /* Check for an authentication failure. */ - if (parser->status_code == 401 && get_verb == s->verb) { - if (!t->owner->cred_acquire_cb) { - no_callback = 1; - } else { - if (allowed_auth_types) { - if (t->cred) { - t->cred->free(t->cred); - t->cred = NULL; - } - - error = t->owner->cred_acquire_cb(&t->cred, - t->owner->url, - t->connection_data.user, - allowed_auth_types, - t->owner->cred_acquire_payload); - - if (error == GIT_PASSTHROUGH) { - no_callback = 1; - } else if (error < 0) { - return PARSE_ERROR_GENERIC; - } else { - assert(t->cred); - - if (!(t->cred->credtype & allowed_auth_types)) { - giterr_set(GITERR_NET, "credentials callback returned an invalid cred type"); - return t->parse_error = PARSE_ERROR_GENERIC; - } - - /* Successfully acquired a credential. */ - t->parse_error = PARSE_ERROR_REPLAY; - return 0; - } - } - } - - if (no_callback) { - giterr_set(GITERR_NET, "authentication required but no callback set"); - return t->parse_error = PARSE_ERROR_GENERIC; - } - } - - /* Check for a redirect. - * Right now we only permit a redirect to the same hostname. */ - if ((parser->status_code == 301 || - parser->status_code == 302 || - (parser->status_code == 303 && get_verb == s->verb) || - parser->status_code == 307) && - t->location) { - - if (s->redirect_count >= 7) { - giterr_set(GITERR_NET, "Too many redirects"); - return t->parse_error = PARSE_ERROR_GENERIC; - } - - if (gitno_connection_data_from_url(&t->connection_data, t->location, s->service_url) < 0) - return t->parse_error = PARSE_ERROR_GENERIC; - - /* Set the redirect URL on the stream. This is a transfer of - * ownership of the memory. */ - if (s->redirect_url) - git__free(s->redirect_url); - - s->redirect_url = t->location; - t->location = NULL; - - t->connected = 0; - s->redirect_count++; - - t->parse_error = PARSE_ERROR_REPLAY; - return 0; - } - - /* Check for a 200 HTTP status code. */ - if (parser->status_code != 200) { - giterr_set(GITERR_NET, - "Unexpected HTTP status code: %d", - parser->status_code); - return t->parse_error = PARSE_ERROR_GENERIC; - } - - /* The response must contain a Content-Type header. */ - if (!t->content_type) { - giterr_set(GITERR_NET, "No Content-Type header in response"); - return t->parse_error = PARSE_ERROR_GENERIC; - } - - /* The Content-Type header must match our expectation. */ - if (get_verb == s->verb) - git_buf_printf(&buf, - "application/x-git-%s-advertisement", - ctx->s->service); - else - git_buf_printf(&buf, - "application/x-git-%s-result", - ctx->s->service); - - if (git_buf_oom(&buf)) - return t->parse_error = PARSE_ERROR_GENERIC; - - if (strcmp(t->content_type, git_buf_cstr(&buf))) { - git_buf_free(&buf); - giterr_set(GITERR_NET, - "Invalid Content-Type: %s", - t->content_type); - return t->parse_error = PARSE_ERROR_GENERIC; - } - - git_buf_free(&buf); - - return 0; -} - -static int on_message_complete(http_parser *parser) -{ - parser_context *ctx = (parser_context *) parser->data; - http_subtransport *t = ctx->t; - - t->parse_finished = 1; - - return 0; -} - -static int on_body_fill_buffer(http_parser *parser, const char *str, size_t len) -{ - parser_context *ctx = (parser_context *) parser->data; - http_subtransport *t = ctx->t; - - /* If our goal is to replay the request (either an auth failure or - * a redirect) then don't bother buffering since we're ignoring the - * content anyway. - */ - if (t->parse_error == PARSE_ERROR_REPLAY) - return 0; - - if (ctx->buf_size < len) { - giterr_set(GITERR_NET, "Can't fit data in the buffer"); - return t->parse_error = PARSE_ERROR_GENERIC; - } - - memcpy(ctx->buffer, str, len); - *(ctx->bytes_read) += len; - ctx->buffer += len; - ctx->buf_size -= len; - - return 0; -} - -static void clear_parser_state(http_subtransport *t) -{ - http_parser_init(&t->parser, HTTP_RESPONSE); - gitno_buffer_setup_fromstream(t->io, - &t->parse_buffer, - t->parse_buffer_data, - sizeof(t->parse_buffer_data)); - - t->last_cb = NONE; - t->parse_error = 0; - t->parse_finished = 0; - - git_buf_free(&t->parse_header_name); - git_buf_init(&t->parse_header_name, 0); - - git_buf_free(&t->parse_header_value); - git_buf_init(&t->parse_header_value, 0); - - git__free(t->content_type); - t->content_type = NULL; - - git__free(t->location); - t->location = NULL; - - git_vector_free_deep(&t->www_authenticate); -} - -static int write_chunk(git_stream *io, const char *buffer, size_t len) -{ - git_buf buf = GIT_BUF_INIT; - - /* Chunk header */ - git_buf_printf(&buf, "%" PRIxZ "\r\n", len); - - if (git_buf_oom(&buf)) - return -1; - - if (git_stream_write(io, buf.ptr, buf.size, 0) < 0) { - git_buf_free(&buf); - return -1; - } - - git_buf_free(&buf); - - /* Chunk body */ - if (len > 0 && git_stream_write(io, buffer, len, 0) < 0) - return -1; - - /* Chunk footer */ - if (git_stream_write(io, "\r\n", 2, 0) < 0) - return -1; - - return 0; -} - -static int http_connect(http_subtransport *t) -{ - int error; - char *proxy_url; - - if (t->connected && - http_should_keep_alive(&t->parser) && - t->parse_finished) - return 0; - - if (t->io) { - git_stream_close(t->io); - git_stream_free(t->io); - t->io = NULL; - } - - if (t->connection_data.use_ssl) { - error = git_tls_stream_new(&t->io, t->connection_data.host, t->connection_data.port); - } else { -#ifdef GIT_CURL - error = git_curl_stream_new(&t->io, t->connection_data.host, t->connection_data.port); -#else - error = git_socket_stream_new(&t->io, t->connection_data.host, t->connection_data.port); -#endif - } - - if (error < 0) - return error; - - GITERR_CHECK_VERSION(t->io, GIT_STREAM_VERSION, "git_stream"); - - if (git_stream_supports_proxy(t->io) && - !git_remote__get_http_proxy(t->owner->owner, !!t->connection_data.use_ssl, &proxy_url)) { - error = git_stream_set_proxy(t->io, proxy_url); - git__free(proxy_url); - - if (error < 0) - return error; - } - - error = git_stream_connect(t->io); - -#if defined(GIT_OPENSSL) || defined(GIT_SECURE_TRANSPORT) || defined(GIT_CURL) - if ((!error || error == GIT_ECERTIFICATE) && t->owner->certificate_check_cb != NULL && - git_stream_is_encrypted(t->io)) { - git_cert *cert; - int is_valid; - - if ((error = git_stream_certificate(&cert, t->io)) < 0) - return error; - - giterr_clear(); - is_valid = error != GIT_ECERTIFICATE; - error = t->owner->certificate_check_cb(cert, is_valid, t->connection_data.host, t->owner->message_cb_payload); - - if (error < 0) { - if (!giterr_last()) - giterr_set(GITERR_NET, "user cancelled certificate check"); - - return error; - } - } -#endif - if (error < 0) - return error; - - t->connected = 1; - return 0; -} - -static int http_stream_read( - git_smart_subtransport_stream *stream, - char *buffer, - size_t buf_size, - size_t *bytes_read) -{ - http_stream *s = (http_stream *)stream; - http_subtransport *t = OWNING_SUBTRANSPORT(s); - parser_context ctx; - size_t bytes_parsed; - -replay: - *bytes_read = 0; - - assert(t->connected); - - if (!s->sent_request) { - git_buf request = GIT_BUF_INIT; - - clear_parser_state(t); - - if (gen_request(&request, s, 0) < 0) - return -1; - - if (git_stream_write(t->io, request.ptr, request.size, 0) < 0) { - git_buf_free(&request); - return -1; - } - - git_buf_free(&request); - - s->sent_request = 1; - } - - if (!s->received_response) { - if (s->chunked) { - assert(s->verb == post_verb); - - /* Flush, if necessary */ - if (s->chunk_buffer_len > 0 && - write_chunk(t->io, s->chunk_buffer, s->chunk_buffer_len) < 0) - return -1; - - s->chunk_buffer_len = 0; - - /* Write the final chunk. */ - if (git_stream_write(t->io, "0\r\n\r\n", 5, 0) < 0) - return -1; - } - - s->received_response = 1; - } - - while (!*bytes_read && !t->parse_finished) { - size_t data_offset; - int error; - - /* - * Make the parse_buffer think it's as full of data as - * the buffer, so it won't try to recv more data than - * we can put into it. - * - * data_offset is the actual data offset from which we - * should tell the parser to start reading. - */ - if (buf_size >= t->parse_buffer.len) { - t->parse_buffer.offset = 0; - } else { - t->parse_buffer.offset = t->parse_buffer.len - buf_size; - } - - data_offset = t->parse_buffer.offset; - - if (gitno_recv(&t->parse_buffer) < 0) - return -1; - - /* This call to http_parser_execute will result in invocations of the - * on_* family of callbacks. The most interesting of these is - * on_body_fill_buffer, which is called when data is ready to be copied - * into the target buffer. We need to marshal the buffer, buf_size, and - * bytes_read parameters to this callback. */ - ctx.t = t; - ctx.s = s; - ctx.buffer = buffer; - ctx.buf_size = buf_size; - ctx.bytes_read = bytes_read; - - /* Set the context, call the parser, then unset the context. */ - t->parser.data = &ctx; - - bytes_parsed = http_parser_execute(&t->parser, - &t->settings, - t->parse_buffer.data + data_offset, - t->parse_buffer.offset - data_offset); - - t->parser.data = NULL; - - /* If there was a handled authentication failure, then parse_error - * will have signaled us that we should replay the request. */ - if (PARSE_ERROR_REPLAY == t->parse_error) { - s->sent_request = 0; - - if ((error = http_connect(t)) < 0) - return error; - - goto replay; - } - - if (t->parse_error < 0) - return -1; - - if (bytes_parsed != t->parse_buffer.offset - data_offset) { - giterr_set(GITERR_NET, - "HTTP parser error: %s", - http_errno_description((enum http_errno)t->parser.http_errno)); - return -1; - } - } - - return 0; -} - -static int http_stream_write_chunked( - git_smart_subtransport_stream *stream, - const char *buffer, - size_t len) -{ - http_stream *s = (http_stream *)stream; - http_subtransport *t = OWNING_SUBTRANSPORT(s); - - assert(t->connected); - - /* Send the request, if necessary */ - if (!s->sent_request) { - git_buf request = GIT_BUF_INIT; - - clear_parser_state(t); - - if (gen_request(&request, s, 0) < 0) - return -1; - - if (git_stream_write(t->io, request.ptr, request.size, 0) < 0) { - git_buf_free(&request); - return -1; - } - - git_buf_free(&request); - - s->sent_request = 1; - } - - if (len > CHUNK_SIZE) { - /* Flush, if necessary */ - if (s->chunk_buffer_len > 0) { - if (write_chunk(t->io, s->chunk_buffer, s->chunk_buffer_len) < 0) - return -1; - - s->chunk_buffer_len = 0; - } - - /* Write chunk directly */ - if (write_chunk(t->io, buffer, len) < 0) - return -1; - } - else { - /* Append as much to the buffer as we can */ - int count = min(CHUNK_SIZE - s->chunk_buffer_len, len); - - if (!s->chunk_buffer) - s->chunk_buffer = git__malloc(CHUNK_SIZE); - - memcpy(s->chunk_buffer + s->chunk_buffer_len, buffer, count); - s->chunk_buffer_len += count; - buffer += count; - len -= count; - - /* Is the buffer full? If so, then flush */ - if (CHUNK_SIZE == s->chunk_buffer_len) { - if (write_chunk(t->io, s->chunk_buffer, s->chunk_buffer_len) < 0) - return -1; - - s->chunk_buffer_len = 0; - - if (len > 0) { - memcpy(s->chunk_buffer, buffer, len); - s->chunk_buffer_len = len; - } - } - } - - return 0; -} - -static int http_stream_write_single( - git_smart_subtransport_stream *stream, - const char *buffer, - size_t len) -{ - http_stream *s = (http_stream *)stream; - http_subtransport *t = OWNING_SUBTRANSPORT(s); - git_buf request = GIT_BUF_INIT; - - assert(t->connected); - - if (s->sent_request) { - giterr_set(GITERR_NET, "Subtransport configured for only one write"); - return -1; - } - - clear_parser_state(t); - - if (gen_request(&request, s, len) < 0) - return -1; - - if (git_stream_write(t->io, request.ptr, request.size, 0) < 0) - goto on_error; - - if (len && git_stream_write(t->io, buffer, len, 0) < 0) - goto on_error; - - git_buf_free(&request); - s->sent_request = 1; - - return 0; - -on_error: - git_buf_free(&request); - return -1; -} - -static void http_stream_free(git_smart_subtransport_stream *stream) -{ - http_stream *s = (http_stream *)stream; - - if (s->chunk_buffer) - git__free(s->chunk_buffer); - - if (s->redirect_url) - git__free(s->redirect_url); - - git__free(s); -} - -static int http_stream_alloc(http_subtransport *t, - git_smart_subtransport_stream **stream) -{ - http_stream *s; - - if (!stream) - return -1; - - s = git__calloc(sizeof(http_stream), 1); - GITERR_CHECK_ALLOC(s); - - s->parent.subtransport = &t->parent; - s->parent.read = http_stream_read; - s->parent.write = http_stream_write_single; - s->parent.free = http_stream_free; - - *stream = (git_smart_subtransport_stream *)s; - return 0; -} - -static int http_uploadpack_ls( - http_subtransport *t, - git_smart_subtransport_stream **stream) -{ - http_stream *s; - - if (http_stream_alloc(t, stream) < 0) - return -1; - - s = (http_stream *)*stream; - - s->service = upload_pack_service; - s->service_url = upload_pack_ls_service_url; - s->verb = get_verb; - - return 0; -} - -static int http_uploadpack( - http_subtransport *t, - git_smart_subtransport_stream **stream) -{ - http_stream *s; - - if (http_stream_alloc(t, stream) < 0) - return -1; - - s = (http_stream *)*stream; - - s->service = upload_pack_service; - s->service_url = upload_pack_service_url; - s->verb = post_verb; - - return 0; -} - -static int http_receivepack_ls( - http_subtransport *t, - git_smart_subtransport_stream **stream) -{ - http_stream *s; - - if (http_stream_alloc(t, stream) < 0) - return -1; - - s = (http_stream *)*stream; - - s->service = receive_pack_service; - s->service_url = receive_pack_ls_service_url; - s->verb = get_verb; - - return 0; -} - -static int http_receivepack( - http_subtransport *t, - git_smart_subtransport_stream **stream) -{ - http_stream *s; - - if (http_stream_alloc(t, stream) < 0) - return -1; - - s = (http_stream *)*stream; - - /* Use Transfer-Encoding: chunked for this request */ - s->chunked = 1; - s->parent.write = http_stream_write_chunked; - - s->service = receive_pack_service; - s->service_url = receive_pack_service_url; - s->verb = post_verb; - - return 0; -} - -static int http_action( - git_smart_subtransport_stream **stream, - git_smart_subtransport *subtransport, - const char *url, - git_smart_service_t action) -{ - http_subtransport *t = (http_subtransport *)subtransport; - int ret; - - if (!stream) - return -1; - - if ((!t->connection_data.host || !t->connection_data.port || !t->connection_data.path) && - (ret = gitno_connection_data_from_url(&t->connection_data, url, NULL)) < 0) - return ret; - - if ((ret = http_connect(t)) < 0) - return ret; - - switch (action) { - case GIT_SERVICE_UPLOADPACK_LS: - return http_uploadpack_ls(t, stream); - - case GIT_SERVICE_UPLOADPACK: - return http_uploadpack(t, stream); - - case GIT_SERVICE_RECEIVEPACK_LS: - return http_receivepack_ls(t, stream); - - case GIT_SERVICE_RECEIVEPACK: - return http_receivepack(t, stream); - } - - *stream = NULL; - return -1; -} - -static int http_close(git_smart_subtransport *subtransport) -{ - http_subtransport *t = (http_subtransport *) subtransport; - git_http_auth_context *context; - size_t i; - - clear_parser_state(t); - - if (t->io) { - git_stream_close(t->io); - git_stream_free(t->io); - t->io = NULL; - } - - if (t->cred) { - t->cred->free(t->cred); - t->cred = NULL; - } - - if (t->url_cred) { - t->url_cred->free(t->url_cred); - t->url_cred = NULL; - } - - git_vector_foreach(&t->auth_contexts, i, context) { - if (context->free) - context->free(context); - } - - git_vector_clear(&t->auth_contexts); - - gitno_connection_data_free_ptrs(&t->connection_data); - memset(&t->connection_data, 0x0, sizeof(gitno_connection_data)); - - return 0; -} - -static void http_free(git_smart_subtransport *subtransport) -{ - http_subtransport *t = (http_subtransport *) subtransport; - - http_close(subtransport); - - git_vector_free(&t->auth_contexts); - git__free(t); -} - -int git_smart_subtransport_http(git_smart_subtransport **out, git_transport *owner, void *param) -{ - http_subtransport *t; - - GIT_UNUSED(param); - - if (!out) - return -1; - - t = git__calloc(sizeof(http_subtransport), 1); - GITERR_CHECK_ALLOC(t); - - t->owner = (transport_smart *)owner; - t->parent.action = http_action; - t->parent.close = http_close; - t->parent.free = http_free; - - t->settings.on_header_field = on_header_field; - t->settings.on_header_value = on_header_value; - t->settings.on_headers_complete = on_headers_complete; - t->settings.on_body = on_body_fill_buffer; - t->settings.on_message_complete = on_message_complete; - - *out = (git_smart_subtransport *) t; - return 0; -} - -#endif /* !GIT_WINHTTP */ diff --git a/vendor/libgit2/src/transports/local.c b/vendor/libgit2/src/transports/local.c deleted file mode 100644 index 1c6e5f01ed..0000000000 --- a/vendor/libgit2/src/transports/local.c +++ /dev/null @@ -1,718 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#include "common.h" -#include "git2/types.h" -#include "git2/net.h" -#include "git2/repository.h" -#include "git2/object.h" -#include "git2/tag.h" -#include "git2/transport.h" -#include "git2/revwalk.h" -#include "git2/odb_backend.h" -#include "git2/pack.h" -#include "git2/commit.h" -#include "git2/revparse.h" -#include "pack-objects.h" -#include "refs.h" -#include "posix.h" -#include "path.h" -#include "buffer.h" -#include "repository.h" -#include "odb.h" -#include "push.h" -#include "remote.h" - -typedef struct { - git_transport parent; - git_remote *owner; - char *url; - int direction; - int flags; - git_atomic cancelled; - git_repository *repo; - git_transport_message_cb progress_cb; - git_transport_message_cb error_cb; - void *message_cb_payload; - git_vector refs; - unsigned connected : 1, - have_refs : 1; -} transport_local; - -static void free_head(git_remote_head *head) -{ - git__free(head->name); - git__free(head->symref_target); - git__free(head); -} - -static void free_heads(git_vector *heads) -{ - git_remote_head *head; - size_t i; - - git_vector_foreach(heads, i, head) - free_head(head); - - git_vector_free(heads); -} - -static int add_ref(transport_local *t, const char *name) -{ - const char peeled[] = "^{}"; - git_reference *ref, *resolved; - git_remote_head *head; - git_oid obj_id; - git_object *obj = NULL, *target = NULL; - git_buf buf = GIT_BUF_INIT; - int error; - - if ((error = git_reference_lookup(&ref, t->repo, name)) < 0) - return error; - - error = git_reference_resolve(&resolved, ref); - if (error < 0) { - git_reference_free(ref); - if (!strcmp(name, GIT_HEAD_FILE) && error == GIT_ENOTFOUND) { - /* This is actually okay. Empty repos often have a HEAD that - * points to a nonexistent "refs/heads/master". */ - giterr_clear(); - return 0; - } - return error; - } - - git_oid_cpy(&obj_id, git_reference_target(resolved)); - git_reference_free(resolved); - - head = git__calloc(1, sizeof(git_remote_head)); - GITERR_CHECK_ALLOC(head); - - head->name = git__strdup(name); - GITERR_CHECK_ALLOC(head->name); - - git_oid_cpy(&head->oid, &obj_id); - - if (git_reference_type(ref) == GIT_REF_SYMBOLIC) { - head->symref_target = git__strdup(git_reference_symbolic_target(ref)); - GITERR_CHECK_ALLOC(head->symref_target); - } - git_reference_free(ref); - - if ((error = git_vector_insert(&t->refs, head)) < 0) { - free_head(head); - return error; - } - - /* If it's not a tag, we don't need to try to peel it */ - if (git__prefixcmp(name, GIT_REFS_TAGS_DIR)) - return 0; - - if ((error = git_object_lookup(&obj, t->repo, &head->oid, GIT_OBJ_ANY)) < 0) - return error; - - head = NULL; - - /* If it's not an annotated tag, or if we're mocking - * git-receive-pack, just get out */ - if (git_object_type(obj) != GIT_OBJ_TAG || - t->direction != GIT_DIRECTION_FETCH) { - git_object_free(obj); - return 0; - } - - /* And if it's a tag, peel it, and add it to the list */ - head = git__calloc(1, sizeof(git_remote_head)); - GITERR_CHECK_ALLOC(head); - - if (git_buf_join(&buf, 0, name, peeled) < 0) { - free_head(head); - return -1; - } - head->name = git_buf_detach(&buf); - - if (!(error = git_tag_peel(&target, (git_tag *)obj))) { - git_oid_cpy(&head->oid, git_object_id(target)); - - if ((error = git_vector_insert(&t->refs, head)) < 0) { - free_head(head); - } - } - - git_object_free(obj); - git_object_free(target); - - return error; -} - -static int store_refs(transport_local *t) -{ - size_t i; - git_remote_head *head; - git_strarray ref_names = {0}; - - assert(t); - - if (git_reference_list(&ref_names, t->repo) < 0) - goto on_error; - - /* Clear all heads we might have fetched in a previous connect */ - git_vector_foreach(&t->refs, i, head) { - git__free(head->name); - git__free(head); - } - - /* Clear the vector so we can reuse it */ - git_vector_clear(&t->refs); - - /* Sort the references first */ - git__tsort((void **)ref_names.strings, ref_names.count, &git__strcmp_cb); - - /* Add HEAD iff direction is fetch */ - if (t->direction == GIT_DIRECTION_FETCH && add_ref(t, GIT_HEAD_FILE) < 0) - goto on_error; - - for (i = 0; i < ref_names.count; ++i) { - if (add_ref(t, ref_names.strings[i]) < 0) - goto on_error; - } - - t->have_refs = 1; - git_strarray_free(&ref_names); - return 0; - -on_error: - git_vector_free(&t->refs); - git_strarray_free(&ref_names); - return -1; -} - -/* - * Try to open the url as a git directory. The direction doesn't - * matter in this case because we're calculating the heads ourselves. - */ -static int local_connect( - git_transport *transport, - const char *url, - git_cred_acquire_cb cred_acquire_cb, - void *cred_acquire_payload, - int direction, int flags) -{ - git_repository *repo; - int error; - transport_local *t = (transport_local *) transport; - const char *path; - git_buf buf = GIT_BUF_INIT; - - GIT_UNUSED(cred_acquire_cb); - GIT_UNUSED(cred_acquire_payload); - - if (t->connected) - return 0; - - free_heads(&t->refs); - - t->url = git__strdup(url); - GITERR_CHECK_ALLOC(t->url); - t->direction = direction; - t->flags = flags; - - /* 'url' may be a url or path; convert to a path */ - if ((error = git_path_from_url_or_path(&buf, url)) < 0) { - git_buf_free(&buf); - return error; - } - path = git_buf_cstr(&buf); - - error = git_repository_open(&repo, path); - - git_buf_free(&buf); - - if (error < 0) - return -1; - - t->repo = repo; - - if (store_refs(t) < 0) - return -1; - - t->connected = 1; - - return 0; -} - -static int local_ls(const git_remote_head ***out, size_t *size, git_transport *transport) -{ - transport_local *t = (transport_local *)transport; - - if (!t->have_refs) { - giterr_set(GITERR_NET, "The transport has not yet loaded the refs"); - return -1; - } - - *out = (const git_remote_head **)t->refs.contents; - *size = t->refs.length; - - return 0; -} - -static int local_negotiate_fetch( - git_transport *transport, - git_repository *repo, - const git_remote_head * const *refs, - size_t count) -{ - transport_local *t = (transport_local*)transport; - git_remote_head *rhead; - unsigned int i; - - GIT_UNUSED(refs); - GIT_UNUSED(count); - - /* Fill in the loids */ - git_vector_foreach(&t->refs, i, rhead) { - git_object *obj; - - int error = git_revparse_single(&obj, repo, rhead->name); - if (!error) - git_oid_cpy(&rhead->loid, git_object_id(obj)); - else if (error != GIT_ENOTFOUND) - return error; - else - giterr_clear(); - git_object_free(obj); - } - - return 0; -} - -static int local_push_update_remote_ref( - git_repository *remote_repo, - const char *lref, - const char *rref, - git_oid *loid, - git_oid *roid) -{ - int error; - git_reference *remote_ref = NULL; - - /* check for lhs, if it's empty it means to delete */ - if (lref[0] != '\0') { - /* Create or update a ref */ - error = git_reference_create(NULL, remote_repo, rref, loid, - !git_oid_iszero(roid), NULL); - } else { - /* Delete a ref */ - if ((error = git_reference_lookup(&remote_ref, remote_repo, rref)) < 0) { - if (error == GIT_ENOTFOUND) - error = 0; - return error; - } - - error = git_reference_delete(remote_ref); - git_reference_free(remote_ref); - } - - return error; -} - -static int transfer_to_push_transfer(const git_transfer_progress *stats, void *payload) -{ - const git_remote_callbacks *cbs = payload; - - if (!cbs || !cbs->push_transfer_progress) - return 0; - - return cbs->push_transfer_progress(stats->received_objects, stats->total_objects, stats->received_bytes, - cbs->payload); -} - -static int local_push( - git_transport *transport, - git_push *push, - const git_remote_callbacks *cbs) -{ - transport_local *t = (transport_local *)transport; - git_repository *remote_repo = NULL; - push_spec *spec; - char *url = NULL; - const char *path; - git_buf buf = GIT_BUF_INIT, odb_path = GIT_BUF_INIT; - int error; - size_t j; - - GIT_UNUSED(cbs); - - /* 'push->remote->url' may be a url or path; convert to a path */ - if ((error = git_path_from_url_or_path(&buf, push->remote->url)) < 0) { - git_buf_free(&buf); - return error; - } - path = git_buf_cstr(&buf); - - error = git_repository_open(&remote_repo, path); - - git_buf_free(&buf); - - if (error < 0) - return error; - - /* We don't currently support pushing locally to non-bare repos. Proper - non-bare repo push support would require checking configs to see if - we should override the default 'don't let this happen' behavior. - - Note that this is only an issue when pushing to the current branch, - but we forbid all pushes just in case */ - if (!remote_repo->is_bare) { - error = GIT_EBAREREPO; - giterr_set(GITERR_INVALID, "Local push doesn't (yet) support pushing to non-bare repos."); - goto on_error; - } - - if ((error = git_buf_joinpath(&odb_path, git_repository_path(remote_repo), "objects/pack")) < 0) - goto on_error; - - error = git_packbuilder_write(push->pb, odb_path.ptr, 0, transfer_to_push_transfer, (void *) cbs); - git_buf_free(&odb_path); - - if (error < 0) - goto on_error; - - push->unpack_ok = 1; - - git_vector_foreach(&push->specs, j, spec) { - push_status *status; - const git_error *last; - char *ref = spec->refspec.dst; - - status = git__calloc(1, sizeof(push_status)); - if (!status) - goto on_error; - - status->ref = git__strdup(ref); - if (!status->ref) { - git_push_status_free(status); - goto on_error; - } - - error = local_push_update_remote_ref(remote_repo, spec->refspec.src, spec->refspec.dst, - &spec->loid, &spec->roid); - - switch (error) { - case GIT_OK: - break; - case GIT_EINVALIDSPEC: - status->msg = git__strdup("funny refname"); - break; - case GIT_ENOTFOUND: - status->msg = git__strdup("Remote branch not found to delete"); - break; - default: - last = giterr_last(); - - if (last && last->message) - status->msg = git__strdup(last->message); - else - status->msg = git__strdup("Unspecified error encountered"); - break; - } - - /* failed to allocate memory for a status message */ - if (error < 0 && !status->msg) { - git_push_status_free(status); - goto on_error; - } - - /* failed to insert the ref update status */ - if ((error = git_vector_insert(&push->status, status)) < 0) { - git_push_status_free(status); - goto on_error; - } - } - - if (push->specs.length) { - int flags = t->flags; - url = git__strdup(t->url); - - if (!url || t->parent.close(&t->parent) < 0 || - t->parent.connect(&t->parent, url, - NULL, NULL, GIT_DIRECTION_PUSH, flags)) - goto on_error; - } - - error = 0; - -on_error: - git_repository_free(remote_repo); - git__free(url); - - return error; -} - -typedef struct foreach_data { - git_transfer_progress *stats; - git_transfer_progress_cb progress_cb; - void *progress_payload; - git_odb_writepack *writepack; -} foreach_data; - -static int foreach_cb(void *buf, size_t len, void *payload) -{ - foreach_data *data = (foreach_data*)payload; - - data->stats->received_bytes += len; - return data->writepack->append(data->writepack, buf, len, data->stats); -} - -static const char *counting_objects_fmt = "Counting objects %d\r"; -static const char *compressing_objects_fmt = "Compressing objects: %.0f%% (%d/%d)"; - -static int local_counting(int stage, unsigned int current, unsigned int total, void *payload) -{ - git_buf progress_info = GIT_BUF_INIT; - transport_local *t = payload; - int error; - - if (!t->progress_cb) - return 0; - - if (stage == GIT_PACKBUILDER_ADDING_OBJECTS) { - git_buf_printf(&progress_info, counting_objects_fmt, current); - } else if (stage == GIT_PACKBUILDER_DELTAFICATION) { - float perc = (((float) current) / total) * 100; - git_buf_printf(&progress_info, compressing_objects_fmt, perc, current, total); - if (current == total) - git_buf_printf(&progress_info, ", done\n"); - else - git_buf_putc(&progress_info, '\r'); - - } - - if (git_buf_oom(&progress_info)) - return -1; - - error = t->progress_cb(git_buf_cstr(&progress_info), git_buf_len(&progress_info), t->message_cb_payload); - git_buf_free(&progress_info); - - return error; -} - -static int local_download_pack( - git_transport *transport, - git_repository *repo, - git_transfer_progress *stats, - git_transfer_progress_cb progress_cb, - void *progress_payload) -{ - transport_local *t = (transport_local*)transport; - git_revwalk *walk = NULL; - git_remote_head *rhead; - unsigned int i; - int error = -1; - git_packbuilder *pack = NULL; - git_odb_writepack *writepack = NULL; - git_odb *odb = NULL; - git_buf progress_info = GIT_BUF_INIT; - - if ((error = git_revwalk_new(&walk, t->repo)) < 0) - goto cleanup; - git_revwalk_sorting(walk, GIT_SORT_TIME); - - if ((error = git_packbuilder_new(&pack, t->repo)) < 0) - goto cleanup; - - git_packbuilder_set_callbacks(pack, local_counting, t); - - stats->total_objects = 0; - stats->indexed_objects = 0; - stats->received_objects = 0; - stats->received_bytes = 0; - - git_vector_foreach(&t->refs, i, rhead) { - git_object *obj; - if ((error = git_object_lookup(&obj, t->repo, &rhead->oid, GIT_OBJ_ANY)) < 0) - goto cleanup; - - if (git_object_type(obj) == GIT_OBJ_COMMIT) { - /* Revwalker includes only wanted commits */ - error = git_revwalk_push(walk, &rhead->oid); - if (!error && !git_oid_iszero(&rhead->loid)) { - error = git_revwalk_hide(walk, &rhead->loid); - if (error == GIT_ENOTFOUND) - error = 0; - } - } else { - /* Tag or some other wanted object. Add it on its own */ - error = git_packbuilder_insert_recur(pack, &rhead->oid, rhead->name); - } - git_object_free(obj); - if (error < 0) - goto cleanup; - } - - if ((error = git_packbuilder_insert_walk(pack, walk))) - goto cleanup; - - if ((error = git_buf_printf(&progress_info, counting_objects_fmt, git_packbuilder_object_count(pack))) < 0) - goto cleanup; - - if (t->progress_cb && - (error = t->progress_cb(git_buf_cstr(&progress_info), git_buf_len(&progress_info), t->message_cb_payload)) < 0) - goto cleanup; - - /* Walk the objects, building a packfile */ - if ((error = git_repository_odb__weakptr(&odb, repo)) < 0) - goto cleanup; - - /* One last one with the newline */ - git_buf_clear(&progress_info); - git_buf_printf(&progress_info, counting_objects_fmt, git_packbuilder_object_count(pack)); - if ((error = git_buf_putc(&progress_info, '\n')) < 0) - goto cleanup; - - if (t->progress_cb && - (error = t->progress_cb(git_buf_cstr(&progress_info), git_buf_len(&progress_info), t->message_cb_payload)) < 0) - goto cleanup; - - if ((error = git_odb_write_pack(&writepack, odb, progress_cb, progress_payload)) != 0) - goto cleanup; - - /* Write the data to the ODB */ - { - foreach_data data = {0}; - data.stats = stats; - data.progress_cb = progress_cb; - data.progress_payload = progress_payload; - data.writepack = writepack; - - /* autodetect */ - git_packbuilder_set_threads(pack, 0); - - if ((error = git_packbuilder_foreach(pack, foreach_cb, &data)) != 0) - goto cleanup; - } - - error = writepack->commit(writepack, stats); - -cleanup: - if (writepack) writepack->free(writepack); - git_buf_free(&progress_info); - git_packbuilder_free(pack); - git_revwalk_free(walk); - return error; -} - -static int local_set_callbacks( - git_transport *transport, - git_transport_message_cb progress_cb, - git_transport_message_cb error_cb, - git_transport_certificate_check_cb certificate_check_cb, - void *message_cb_payload) -{ - transport_local *t = (transport_local *)transport; - - GIT_UNUSED(certificate_check_cb); - - t->progress_cb = progress_cb; - t->error_cb = error_cb; - t->message_cb_payload = message_cb_payload; - - return 0; -} - -static int local_is_connected(git_transport *transport) -{ - transport_local *t = (transport_local *)transport; - - return t->connected; -} - -static int local_read_flags(git_transport *transport, int *flags) -{ - transport_local *t = (transport_local *)transport; - - *flags = t->flags; - - return 0; -} - -static void local_cancel(git_transport *transport) -{ - transport_local *t = (transport_local *)transport; - - git_atomic_set(&t->cancelled, 1); -} - -static int local_close(git_transport *transport) -{ - transport_local *t = (transport_local *)transport; - - t->connected = 0; - - if (t->repo) { - git_repository_free(t->repo); - t->repo = NULL; - } - - if (t->url) { - git__free(t->url); - t->url = NULL; - } - - return 0; -} - -static void local_free(git_transport *transport) -{ - transport_local *t = (transport_local *)transport; - - free_heads(&t->refs); - - /* Close the transport, if it's still open. */ - local_close(transport); - - /* Free the transport */ - git__free(t); -} - -/************** - * Public API * - **************/ - -int git_transport_local(git_transport **out, git_remote *owner, void *param) -{ - int error; - transport_local *t; - - GIT_UNUSED(param); - - t = git__calloc(1, sizeof(transport_local)); - GITERR_CHECK_ALLOC(t); - - t->parent.version = GIT_TRANSPORT_VERSION; - t->parent.set_callbacks = local_set_callbacks; - t->parent.connect = local_connect; - t->parent.negotiate_fetch = local_negotiate_fetch; - t->parent.download_pack = local_download_pack; - t->parent.push = local_push; - t->parent.close = local_close; - t->parent.free = local_free; - t->parent.ls = local_ls; - t->parent.is_connected = local_is_connected; - t->parent.read_flags = local_read_flags; - t->parent.cancel = local_cancel; - - if ((error = git_vector_init(&t->refs, 0, NULL)) < 0) { - git__free(t); - return error; - } - - t->owner = owner; - - *out = (git_transport *) t; - - return 0; -} diff --git a/vendor/libgit2/src/transports/smart.c b/vendor/libgit2/src/transports/smart.c deleted file mode 100644 index 85a49e5434..0000000000 --- a/vendor/libgit2/src/transports/smart.c +++ /dev/null @@ -1,419 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#include "git2.h" -#include "smart.h" -#include "refs.h" -#include "refspec.h" - -static int git_smart__recv_cb(gitno_buffer *buf) -{ - transport_smart *t = (transport_smart *) buf->cb_data; - size_t old_len, bytes_read; - int error; - - assert(t->current_stream); - - old_len = buf->offset; - - if ((error = t->current_stream->read(t->current_stream, buf->data + buf->offset, buf->len - buf->offset, &bytes_read)) < 0) - return error; - - buf->offset += bytes_read; - - if (t->packetsize_cb && !t->cancelled.val) { - error = t->packetsize_cb(bytes_read, t->packetsize_payload); - if (error) { - git_atomic_set(&t->cancelled, 1); - return GIT_EUSER; - } - } - - return (int)(buf->offset - old_len); -} - -GIT_INLINE(int) git_smart__reset_stream(transport_smart *t, bool close_subtransport) -{ - if (t->current_stream) { - t->current_stream->free(t->current_stream); - t->current_stream = NULL; - } - - if (close_subtransport && - t->wrapped->close(t->wrapped) < 0) - return -1; - - return 0; -} - -static int git_smart__set_callbacks( - git_transport *transport, - git_transport_message_cb progress_cb, - git_transport_message_cb error_cb, - git_transport_certificate_check_cb certificate_check_cb, - void *message_cb_payload) -{ - transport_smart *t = (transport_smart *)transport; - - t->progress_cb = progress_cb; - t->error_cb = error_cb; - t->certificate_check_cb = certificate_check_cb; - t->message_cb_payload = message_cb_payload; - - return 0; -} - -int git_smart__update_heads(transport_smart *t, git_vector *symrefs) -{ - size_t i; - git_pkt *pkt; - - git_vector_clear(&t->heads); - git_vector_foreach(&t->refs, i, pkt) { - git_pkt_ref *ref = (git_pkt_ref *) pkt; - if (pkt->type != GIT_PKT_REF) - continue; - - if (symrefs) { - git_refspec *spec; - git_buf buf = GIT_BUF_INIT; - size_t j; - int error = 0; - - git_vector_foreach(symrefs, j, spec) { - git_buf_clear(&buf); - if (git_refspec_src_matches(spec, ref->head.name) && - !(error = git_refspec_transform(&buf, spec, ref->head.name))) - ref->head.symref_target = git_buf_detach(&buf); - } - - git_buf_free(&buf); - - if (error < 0) - return error; - } - - if (git_vector_insert(&t->heads, &ref->head) < 0) - return -1; - } - - return 0; -} - -static void free_symrefs(git_vector *symrefs) -{ - git_refspec *spec; - size_t i; - - git_vector_foreach(symrefs, i, spec) { - git_refspec__free(spec); - git__free(spec); - } - - git_vector_free(symrefs); -} - -static int git_smart__connect( - git_transport *transport, - const char *url, - git_cred_acquire_cb cred_acquire_cb, - void *cred_acquire_payload, - int direction, - int flags) -{ - transport_smart *t = (transport_smart *)transport; - git_smart_subtransport_stream *stream; - int error; - git_pkt *pkt; - git_pkt_ref *first; - git_vector symrefs; - git_smart_service_t service; - - if (git_smart__reset_stream(t, true) < 0) - return -1; - - t->url = git__strdup(url); - GITERR_CHECK_ALLOC(t->url); - - t->direction = direction; - t->flags = flags; - t->cred_acquire_cb = cred_acquire_cb; - t->cred_acquire_payload = cred_acquire_payload; - - if (GIT_DIRECTION_FETCH == t->direction) - service = GIT_SERVICE_UPLOADPACK_LS; - else if (GIT_DIRECTION_PUSH == t->direction) - service = GIT_SERVICE_RECEIVEPACK_LS; - else { - giterr_set(GITERR_NET, "Invalid direction"); - return -1; - } - - if ((error = t->wrapped->action(&stream, t->wrapped, t->url, service)) < 0) - return error; - - /* Save off the current stream (i.e. socket) that we are working with */ - t->current_stream = stream; - - gitno_buffer_setup_callback(&t->buffer, t->buffer_data, sizeof(t->buffer_data), git_smart__recv_cb, t); - - /* 2 flushes for RPC; 1 for stateful */ - if ((error = git_smart__store_refs(t, t->rpc ? 2 : 1)) < 0) - return error; - - /* Strip the comment packet for RPC */ - if (t->rpc) { - pkt = (git_pkt *)git_vector_get(&t->refs, 0); - - if (!pkt || GIT_PKT_COMMENT != pkt->type) { - giterr_set(GITERR_NET, "Invalid response"); - return -1; - } else { - /* Remove the comment pkt from the list */ - git_vector_remove(&t->refs, 0); - git__free(pkt); - } - } - - /* We now have loaded the refs. */ - t->have_refs = 1; - - first = (git_pkt_ref *)git_vector_get(&t->refs, 0); - - if ((error = git_vector_init(&symrefs, 1, NULL)) < 0) - return error; - - /* Detect capabilities */ - if (git_smart__detect_caps(first, &t->caps, &symrefs) < 0) - return -1; - - /* If the only ref in the list is capabilities^{} with OID_ZERO, remove it */ - if (1 == t->refs.length && !strcmp(first->head.name, "capabilities^{}") && - git_oid_iszero(&first->head.oid)) { - git_vector_clear(&t->refs); - git_pkt_free((git_pkt *)first); - } - - /* Keep a list of heads for _ls */ - git_smart__update_heads(t, &symrefs); - - free_symrefs(&symrefs); - - if (t->rpc && git_smart__reset_stream(t, false) < 0) - return -1; - - /* We're now logically connected. */ - t->connected = 1; - - return 0; -} - -static int git_smart__ls(const git_remote_head ***out, size_t *size, git_transport *transport) -{ - transport_smart *t = (transport_smart *)transport; - - if (!t->have_refs) { - giterr_set(GITERR_NET, "The transport has not yet loaded the refs"); - return -1; - } - - *out = (const git_remote_head **) t->heads.contents; - *size = t->heads.length; - - return 0; -} - -int git_smart__negotiation_step(git_transport *transport, void *data, size_t len) -{ - transport_smart *t = (transport_smart *)transport; - git_smart_subtransport_stream *stream; - int error; - - if (t->rpc && git_smart__reset_stream(t, false) < 0) - return -1; - - if (GIT_DIRECTION_FETCH != t->direction) { - giterr_set(GITERR_NET, "This operation is only valid for fetch"); - return -1; - } - - if ((error = t->wrapped->action(&stream, t->wrapped, t->url, GIT_SERVICE_UPLOADPACK)) < 0) - return error; - - /* If this is a stateful implementation, the stream we get back should be the same */ - assert(t->rpc || t->current_stream == stream); - - /* Save off the current stream (i.e. socket) that we are working with */ - t->current_stream = stream; - - if ((error = stream->write(stream, (const char *)data, len)) < 0) - return error; - - gitno_buffer_setup_callback(&t->buffer, t->buffer_data, sizeof(t->buffer_data), git_smart__recv_cb, t); - - return 0; -} - -int git_smart__get_push_stream(transport_smart *t, git_smart_subtransport_stream **stream) -{ - int error; - - if (t->rpc && git_smart__reset_stream(t, false) < 0) - return -1; - - if (GIT_DIRECTION_PUSH != t->direction) { - giterr_set(GITERR_NET, "This operation is only valid for push"); - return -1; - } - - if ((error = t->wrapped->action(stream, t->wrapped, t->url, GIT_SERVICE_RECEIVEPACK)) < 0) - return error; - - /* If this is a stateful implementation, the stream we get back should be the same */ - assert(t->rpc || t->current_stream == *stream); - - /* Save off the current stream (i.e. socket) that we are working with */ - t->current_stream = *stream; - - gitno_buffer_setup_callback(&t->buffer, t->buffer_data, sizeof(t->buffer_data), git_smart__recv_cb, t); - - return 0; -} - -static void git_smart__cancel(git_transport *transport) -{ - transport_smart *t = (transport_smart *)transport; - - git_atomic_set(&t->cancelled, 1); -} - -static int git_smart__is_connected(git_transport *transport) -{ - transport_smart *t = (transport_smart *)transport; - - return t->connected; -} - -static int git_smart__read_flags(git_transport *transport, int *flags) -{ - transport_smart *t = (transport_smart *)transport; - - *flags = t->flags; - - return 0; -} - -static int git_smart__close(git_transport *transport) -{ - transport_smart *t = (transport_smart *)transport; - git_vector *common = &t->common; - unsigned int i; - git_pkt *p; - int ret; - git_smart_subtransport_stream *stream; - const char flush[] = "0000"; - - /* - * If we're still connected at this point and not using RPC, - * we should say goodbye by sending a flush, or git-daemon - * will complain that we disconnected unexpectedly. - */ - if (t->connected && !t->rpc && - !t->wrapped->action(&stream, t->wrapped, t->url, GIT_SERVICE_UPLOADPACK)) { - t->current_stream->write(t->current_stream, flush, 4); - } - - ret = git_smart__reset_stream(t, true); - - git_vector_foreach(common, i, p) - git_pkt_free(p); - - git_vector_free(common); - - if (t->url) { - git__free(t->url); - t->url = NULL; - } - - t->connected = 0; - - return ret; -} - -static void git_smart__free(git_transport *transport) -{ - transport_smart *t = (transport_smart *)transport; - git_vector *refs = &t->refs; - unsigned int i; - git_pkt *p; - - /* Make sure that the current stream is closed, if we have one. */ - git_smart__close(transport); - - /* Free the subtransport */ - t->wrapped->free(t->wrapped); - - git_vector_free(&t->heads); - git_vector_foreach(refs, i, p) - git_pkt_free(p); - - git_vector_free(refs); - - git__free(t); -} - -static int ref_name_cmp(const void *a, const void *b) -{ - const git_pkt_ref *ref_a = a, *ref_b = b; - - return strcmp(ref_a->head.name, ref_b->head.name); -} - -int git_transport_smart(git_transport **out, git_remote *owner, void *param) -{ - transport_smart *t; - git_smart_subtransport_definition *definition = (git_smart_subtransport_definition *)param; - - if (!param) - return -1; - - t = git__calloc(1, sizeof(transport_smart)); - GITERR_CHECK_ALLOC(t); - - t->parent.version = GIT_TRANSPORT_VERSION; - t->parent.set_callbacks = git_smart__set_callbacks; - t->parent.connect = git_smart__connect; - t->parent.close = git_smart__close; - t->parent.free = git_smart__free; - t->parent.negotiate_fetch = git_smart__negotiate_fetch; - t->parent.download_pack = git_smart__download_pack; - t->parent.push = git_smart__push; - t->parent.ls = git_smart__ls; - t->parent.is_connected = git_smart__is_connected; - t->parent.read_flags = git_smart__read_flags; - t->parent.cancel = git_smart__cancel; - - t->owner = owner; - t->rpc = definition->rpc; - - if (git_vector_init(&t->refs, 16, ref_name_cmp) < 0) { - git__free(t); - return -1; - } - - if (git_vector_init(&t->heads, 16, ref_name_cmp) < 0) { - git__free(t); - return -1; - } - - if (definition->callback(&t->wrapped, &t->parent, definition->param) < 0) { - git__free(t); - return -1; - } - - *out = (git_transport *) t; - return 0; -} diff --git a/vendor/libgit2/src/transports/smart.h b/vendor/libgit2/src/transports/smart.h deleted file mode 100644 index 4c728c7ccf..0000000000 --- a/vendor/libgit2/src/transports/smart.h +++ /dev/null @@ -1,189 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#include "git2.h" -#include "vector.h" -#include "netops.h" -#include "buffer.h" -#include "push.h" -#include "git2/sys/transport.h" - -#define GIT_SIDE_BAND_DATA 1 -#define GIT_SIDE_BAND_PROGRESS 2 -#define GIT_SIDE_BAND_ERROR 3 - -#define GIT_CAP_OFS_DELTA "ofs-delta" -#define GIT_CAP_MULTI_ACK "multi_ack" -#define GIT_CAP_MULTI_ACK_DETAILED "multi_ack_detailed" -#define GIT_CAP_SIDE_BAND "side-band" -#define GIT_CAP_SIDE_BAND_64K "side-band-64k" -#define GIT_CAP_INCLUDE_TAG "include-tag" -#define GIT_CAP_DELETE_REFS "delete-refs" -#define GIT_CAP_REPORT_STATUS "report-status" -#define GIT_CAP_THIN_PACK "thin-pack" -#define GIT_CAP_SYMREF "symref" - -enum git_pkt_type { - GIT_PKT_CMD, - GIT_PKT_FLUSH, - GIT_PKT_REF, - GIT_PKT_HAVE, - GIT_PKT_ACK, - GIT_PKT_NAK, - GIT_PKT_PACK, - GIT_PKT_COMMENT, - GIT_PKT_ERR, - GIT_PKT_DATA, - GIT_PKT_PROGRESS, - GIT_PKT_OK, - GIT_PKT_NG, - GIT_PKT_UNPACK, -}; - -/* Used for multi_ack and mutli_ack_detailed */ -enum git_ack_status { - GIT_ACK_NONE, - GIT_ACK_CONTINUE, - GIT_ACK_COMMON, - GIT_ACK_READY -}; - -/* This would be a flush pkt */ -typedef struct { - enum git_pkt_type type; -} git_pkt; - -struct git_pkt_cmd { - enum git_pkt_type type; - char *cmd; - char *path; - char *host; -}; - -/* This is a pkt-line with some info in it */ -typedef struct { - enum git_pkt_type type; - git_remote_head head; - char *capabilities; -} git_pkt_ref; - -/* Useful later */ -typedef struct { - enum git_pkt_type type; - git_oid oid; - enum git_ack_status status; -} git_pkt_ack; - -typedef struct { - enum git_pkt_type type; - char comment[GIT_FLEX_ARRAY]; -} git_pkt_comment; - -typedef struct { - enum git_pkt_type type; - int len; - char data[GIT_FLEX_ARRAY]; -} git_pkt_data; - -typedef git_pkt_data git_pkt_progress; - -typedef struct { - enum git_pkt_type type; - int len; - char error[GIT_FLEX_ARRAY]; -} git_pkt_err; - -typedef struct { - enum git_pkt_type type; - char *ref; -} git_pkt_ok; - -typedef struct { - enum git_pkt_type type; - char *ref; - char *msg; -} git_pkt_ng; - -typedef struct { - enum git_pkt_type type; - int unpack_ok; -} git_pkt_unpack; - -typedef struct transport_smart_caps { - int common:1, - ofs_delta:1, - multi_ack: 1, - multi_ack_detailed: 1, - side_band:1, - side_band_64k:1, - include_tag:1, - delete_refs:1, - report_status:1, - thin_pack:1; -} transport_smart_caps; - -typedef int (*packetsize_cb)(size_t received, void *payload); - -typedef struct { - git_transport parent; - git_remote *owner; - char *url; - git_cred_acquire_cb cred_acquire_cb; - void *cred_acquire_payload; - int direction; - int flags; - git_transport_message_cb progress_cb; - git_transport_message_cb error_cb; - git_transport_certificate_check_cb certificate_check_cb; - void *message_cb_payload; - git_smart_subtransport *wrapped; - git_smart_subtransport_stream *current_stream; - transport_smart_caps caps; - git_vector refs; - git_vector heads; - git_vector common; - git_atomic cancelled; - packetsize_cb packetsize_cb; - void *packetsize_payload; - unsigned rpc : 1, - have_refs : 1, - connected : 1; - gitno_buffer buffer; - char buffer_data[65536]; -} transport_smart; - -/* smart_protocol.c */ -int git_smart__store_refs(transport_smart *t, int flushes); -int git_smart__detect_caps(git_pkt_ref *pkt, transport_smart_caps *caps, git_vector *symrefs); -int git_smart__push(git_transport *transport, git_push *push, const git_remote_callbacks *cbs); - -int git_smart__negotiate_fetch( - git_transport *transport, - git_repository *repo, - const git_remote_head * const *refs, - size_t count); - -int git_smart__download_pack( - git_transport *transport, - git_repository *repo, - git_transfer_progress *stats, - git_transfer_progress_cb progress_cb, - void *progress_payload); - -/* smart.c */ -int git_smart__negotiation_step(git_transport *transport, void *data, size_t len); -int git_smart__get_push_stream(transport_smart *t, git_smart_subtransport_stream **out); - -int git_smart__update_heads(transport_smart *t, git_vector *symrefs); - -/* smart_pkt.c */ -int git_pkt_parse_line(git_pkt **head, const char *line, const char **out, size_t len); -int git_pkt_buffer_flush(git_buf *buf); -int git_pkt_send_flush(GIT_SOCKET s); -int git_pkt_buffer_done(git_buf *buf); -int git_pkt_buffer_wants(const git_remote_head * const *refs, size_t count, transport_smart_caps *caps, git_buf *buf); -int git_pkt_buffer_have(git_oid *oid, git_buf *buf); -void git_pkt_free(git_pkt *pkt); diff --git a/vendor/libgit2/src/transports/smart_pkt.c b/vendor/libgit2/src/transports/smart_pkt.c deleted file mode 100644 index 9ccbd80852..0000000000 --- a/vendor/libgit2/src/transports/smart_pkt.c +++ /dev/null @@ -1,596 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#include "common.h" - -#include "git2/types.h" -#include "git2/errors.h" -#include "git2/refs.h" -#include "git2/revwalk.h" - -#include "smart.h" -#include "util.h" -#include "netops.h" -#include "posix.h" -#include "buffer.h" - -#include - -#define PKT_LEN_SIZE 4 -static const char pkt_done_str[] = "0009done\n"; -static const char pkt_flush_str[] = "0000"; -static const char pkt_have_prefix[] = "0032have "; -static const char pkt_want_prefix[] = "0032want "; - -static int flush_pkt(git_pkt **out) -{ - git_pkt *pkt; - - pkt = git__malloc(sizeof(git_pkt)); - GITERR_CHECK_ALLOC(pkt); - - pkt->type = GIT_PKT_FLUSH; - *out = pkt; - - return 0; -} - -/* the rest of the line will be useful for multi_ack and multi_ack_detailed */ -static int ack_pkt(git_pkt **out, const char *line, size_t len) -{ - git_pkt_ack *pkt; - GIT_UNUSED(line); - GIT_UNUSED(len); - - pkt = git__calloc(1, sizeof(git_pkt_ack)); - GITERR_CHECK_ALLOC(pkt); - - pkt->type = GIT_PKT_ACK; - line += 3; - len -= 3; - - if (len >= GIT_OID_HEXSZ) { - git_oid_fromstr(&pkt->oid, line + 1); - line += GIT_OID_HEXSZ + 1; - len -= GIT_OID_HEXSZ + 1; - } - - if (len >= 7) { - if (!git__prefixcmp(line + 1, "continue")) - pkt->status = GIT_ACK_CONTINUE; - if (!git__prefixcmp(line + 1, "common")) - pkt->status = GIT_ACK_COMMON; - if (!git__prefixcmp(line + 1, "ready")) - pkt->status = GIT_ACK_READY; - } - - *out = (git_pkt *) pkt; - - return 0; -} - -static int nak_pkt(git_pkt **out) -{ - git_pkt *pkt; - - pkt = git__malloc(sizeof(git_pkt)); - GITERR_CHECK_ALLOC(pkt); - - pkt->type = GIT_PKT_NAK; - *out = pkt; - - return 0; -} - -static int pack_pkt(git_pkt **out) -{ - git_pkt *pkt; - - pkt = git__malloc(sizeof(git_pkt)); - GITERR_CHECK_ALLOC(pkt); - - pkt->type = GIT_PKT_PACK; - *out = pkt; - - return 0; -} - -static int comment_pkt(git_pkt **out, const char *line, size_t len) -{ - git_pkt_comment *pkt; - size_t alloclen; - - GITERR_CHECK_ALLOC_ADD(&alloclen, sizeof(git_pkt_comment), len); - GITERR_CHECK_ALLOC_ADD(&alloclen, alloclen, 1); - pkt = git__malloc(alloclen); - GITERR_CHECK_ALLOC(pkt); - - pkt->type = GIT_PKT_COMMENT; - memcpy(pkt->comment, line, len); - pkt->comment[len] = '\0'; - - *out = (git_pkt *) pkt; - - return 0; -} - -static int err_pkt(git_pkt **out, const char *line, size_t len) -{ - git_pkt_err *pkt; - size_t alloclen; - - /* Remove "ERR " from the line */ - line += 4; - len -= 4; - - GITERR_CHECK_ALLOC_ADD(&alloclen, sizeof(git_pkt_progress), len); - GITERR_CHECK_ALLOC_ADD(&alloclen, alloclen, 1); - pkt = git__malloc(alloclen); - GITERR_CHECK_ALLOC(pkt); - - pkt->type = GIT_PKT_ERR; - pkt->len = (int)len; - memcpy(pkt->error, line, len); - pkt->error[len] = '\0'; - - *out = (git_pkt *) pkt; - - return 0; -} - -static int data_pkt(git_pkt **out, const char *line, size_t len) -{ - git_pkt_data *pkt; - size_t alloclen; - - line++; - len--; - - GITERR_CHECK_ALLOC_ADD(&alloclen, sizeof(git_pkt_progress), len); - pkt = git__malloc(alloclen); - GITERR_CHECK_ALLOC(pkt); - - pkt->type = GIT_PKT_DATA; - pkt->len = (int) len; - memcpy(pkt->data, line, len); - - *out = (git_pkt *) pkt; - - return 0; -} - -static int sideband_progress_pkt(git_pkt **out, const char *line, size_t len) -{ - git_pkt_progress *pkt; - size_t alloclen; - - line++; - len--; - - GITERR_CHECK_ALLOC_ADD(&alloclen, sizeof(git_pkt_progress), len); - pkt = git__malloc(alloclen); - GITERR_CHECK_ALLOC(pkt); - - pkt->type = GIT_PKT_PROGRESS; - pkt->len = (int) len; - memcpy(pkt->data, line, len); - - *out = (git_pkt *) pkt; - - return 0; -} - -static int sideband_error_pkt(git_pkt **out, const char *line, size_t len) -{ - git_pkt_err *pkt; - size_t alloc_len; - - line++; - len--; - - GITERR_CHECK_ALLOC_ADD(&alloc_len, sizeof(git_pkt_err), len); - GITERR_CHECK_ALLOC_ADD(&alloc_len, alloc_len, 1); - pkt = git__malloc(alloc_len); - GITERR_CHECK_ALLOC(pkt); - - pkt->type = GIT_PKT_ERR; - pkt->len = (int)len; - memcpy(pkt->error, line, len); - pkt->error[len] = '\0'; - - *out = (git_pkt *)pkt; - - return 0; -} - -/* - * Parse an other-ref line. - */ -static int ref_pkt(git_pkt **out, const char *line, size_t len) -{ - int error; - git_pkt_ref *pkt; - size_t alloclen; - - pkt = git__malloc(sizeof(git_pkt_ref)); - GITERR_CHECK_ALLOC(pkt); - - memset(pkt, 0x0, sizeof(git_pkt_ref)); - pkt->type = GIT_PKT_REF; - if ((error = git_oid_fromstr(&pkt->head.oid, line)) < 0) - goto error_out; - - /* Check for a bit of consistency */ - if (line[GIT_OID_HEXSZ] != ' ') { - giterr_set(GITERR_NET, "Error parsing pkt-line"); - error = -1; - goto error_out; - } - - /* Jump from the name */ - line += GIT_OID_HEXSZ + 1; - len -= (GIT_OID_HEXSZ + 1); - - if (line[len - 1] == '\n') - --len; - - GITERR_CHECK_ALLOC_ADD(&alloclen, len, 1); - pkt->head.name = git__malloc(alloclen); - GITERR_CHECK_ALLOC(pkt->head.name); - - memcpy(pkt->head.name, line, len); - pkt->head.name[len] = '\0'; - - if (strlen(pkt->head.name) < len) { - pkt->capabilities = strchr(pkt->head.name, '\0') + 1; - } - - *out = (git_pkt *)pkt; - return 0; - -error_out: - git__free(pkt); - return error; -} - -static int ok_pkt(git_pkt **out, const char *line, size_t len) -{ - git_pkt_ok *pkt; - const char *ptr; - size_t alloc_len; - - pkt = git__malloc(sizeof(*pkt)); - GITERR_CHECK_ALLOC(pkt); - - pkt->type = GIT_PKT_OK; - - line += 3; /* skip "ok " */ - if (!(ptr = strchr(line, '\n'))) { - giterr_set(GITERR_NET, "Invalid packet line"); - return -1; - } - len = ptr - line; - - GITERR_CHECK_ALLOC_ADD(&alloc_len, len, 1); - pkt->ref = git__malloc(alloc_len); - GITERR_CHECK_ALLOC(pkt->ref); - - memcpy(pkt->ref, line, len); - pkt->ref[len] = '\0'; - - *out = (git_pkt *)pkt; - return 0; -} - -static int ng_pkt(git_pkt **out, const char *line, size_t len) -{ - git_pkt_ng *pkt; - const char *ptr; - size_t alloclen; - - pkt = git__malloc(sizeof(*pkt)); - GITERR_CHECK_ALLOC(pkt); - - pkt->type = GIT_PKT_NG; - - line += 3; /* skip "ng " */ - if (!(ptr = strchr(line, ' '))) { - giterr_set(GITERR_NET, "Invalid packet line"); - return -1; - } - len = ptr - line; - - GITERR_CHECK_ALLOC_ADD(&alloclen, len, 1); - pkt->ref = git__malloc(alloclen); - GITERR_CHECK_ALLOC(pkt->ref); - - memcpy(pkt->ref, line, len); - pkt->ref[len] = '\0'; - - line = ptr + 1; - if (!(ptr = strchr(line, '\n'))) { - giterr_set(GITERR_NET, "Invalid packet line"); - return -1; - } - len = ptr - line; - - GITERR_CHECK_ALLOC_ADD(&alloclen, len, 1); - pkt->msg = git__malloc(alloclen); - GITERR_CHECK_ALLOC(pkt->msg); - - memcpy(pkt->msg, line, len); - pkt->msg[len] = '\0'; - - *out = (git_pkt *)pkt; - return 0; -} - -static int unpack_pkt(git_pkt **out, const char *line, size_t len) -{ - git_pkt_unpack *pkt; - - GIT_UNUSED(len); - - pkt = git__malloc(sizeof(*pkt)); - GITERR_CHECK_ALLOC(pkt); - - pkt->type = GIT_PKT_UNPACK; - if (!git__prefixcmp(line, "unpack ok")) - pkt->unpack_ok = 1; - else - pkt->unpack_ok = 0; - - *out = (git_pkt *)pkt; - return 0; -} - -static int32_t parse_len(const char *line) -{ - char num[PKT_LEN_SIZE + 1]; - int i, error; - int32_t len; - const char *num_end; - - memcpy(num, line, PKT_LEN_SIZE); - num[PKT_LEN_SIZE] = '\0'; - - for (i = 0; i < PKT_LEN_SIZE; ++i) { - if (!isxdigit(num[i])) { - giterr_set(GITERR_NET, "Found invalid hex digit in length"); - return -1; - } - } - - if ((error = git__strtol32(&len, num, &num_end, 16)) < 0) - return error; - - return len; -} - -/* - * As per the documentation, the syntax is: - * - * pkt-line = data-pkt / flush-pkt - * data-pkt = pkt-len pkt-payload - * pkt-len = 4*(HEXDIG) - * pkt-payload = (pkt-len -4)*(OCTET) - * flush-pkt = "0000" - * - * Which means that the first four bytes are the length of the line, - * in ASCII hexadecimal (including itself) - */ - -int git_pkt_parse_line( - git_pkt **head, const char *line, const char **out, size_t bufflen) -{ - int ret; - int32_t len; - - /* Not even enough for the length */ - if (bufflen > 0 && bufflen < PKT_LEN_SIZE) - return GIT_EBUFS; - - len = parse_len(line); - if (len < 0) { - /* - * If we fail to parse the length, it might be because the - * server is trying to send us the packfile already. - */ - if (bufflen >= 4 && !git__prefixcmp(line, "PACK")) { - giterr_clear(); - *out = line; - return pack_pkt(head); - } - - return (int)len; - } - - /* - * If we were given a buffer length, then make sure there is - * enough in the buffer to satisfy this line - */ - if (bufflen > 0 && bufflen < (size_t)len) - return GIT_EBUFS; - - line += PKT_LEN_SIZE; - /* - * TODO: How do we deal with empty lines? Try again? with the next - * line? - */ - if (len == PKT_LEN_SIZE) { - *out = line; - return 0; - } - - if (len == 0) { /* Flush pkt */ - *out = line; - return flush_pkt(head); - } - - len -= PKT_LEN_SIZE; /* the encoded length includes its own size */ - - if (*line == GIT_SIDE_BAND_DATA) - ret = data_pkt(head, line, len); - else if (*line == GIT_SIDE_BAND_PROGRESS) - ret = sideband_progress_pkt(head, line, len); - else if (*line == GIT_SIDE_BAND_ERROR) - ret = sideband_error_pkt(head, line, len); - else if (!git__prefixcmp(line, "ACK")) - ret = ack_pkt(head, line, len); - else if (!git__prefixcmp(line, "NAK")) - ret = nak_pkt(head); - else if (!git__prefixcmp(line, "ERR ")) - ret = err_pkt(head, line, len); - else if (*line == '#') - ret = comment_pkt(head, line, len); - else if (!git__prefixcmp(line, "ok")) - ret = ok_pkt(head, line, len); - else if (!git__prefixcmp(line, "ng")) - ret = ng_pkt(head, line, len); - else if (!git__prefixcmp(line, "unpack")) - ret = unpack_pkt(head, line, len); - else - ret = ref_pkt(head, line, len); - - *out = line + len; - - return ret; -} - -void git_pkt_free(git_pkt *pkt) -{ - if (pkt->type == GIT_PKT_REF) { - git_pkt_ref *p = (git_pkt_ref *) pkt; - git__free(p->head.name); - git__free(p->head.symref_target); - } - - if (pkt->type == GIT_PKT_OK) { - git_pkt_ok *p = (git_pkt_ok *) pkt; - git__free(p->ref); - } - - if (pkt->type == GIT_PKT_NG) { - git_pkt_ng *p = (git_pkt_ng *) pkt; - git__free(p->ref); - git__free(p->msg); - } - - git__free(pkt); -} - -int git_pkt_buffer_flush(git_buf *buf) -{ - return git_buf_put(buf, pkt_flush_str, strlen(pkt_flush_str)); -} - -static int buffer_want_with_caps(const git_remote_head *head, transport_smart_caps *caps, git_buf *buf) -{ - git_buf str = GIT_BUF_INIT; - char oid[GIT_OID_HEXSZ +1] = {0}; - size_t len; - - /* Prefer multi_ack_detailed */ - if (caps->multi_ack_detailed) - git_buf_puts(&str, GIT_CAP_MULTI_ACK_DETAILED " "); - else if (caps->multi_ack) - git_buf_puts(&str, GIT_CAP_MULTI_ACK " "); - - /* Prefer side-band-64k if the server supports both */ - if (caps->side_band_64k) - git_buf_printf(&str, "%s ", GIT_CAP_SIDE_BAND_64K); - else if (caps->side_band) - git_buf_printf(&str, "%s ", GIT_CAP_SIDE_BAND); - - if (caps->include_tag) - git_buf_puts(&str, GIT_CAP_INCLUDE_TAG " "); - - if (caps->thin_pack) - git_buf_puts(&str, GIT_CAP_THIN_PACK " "); - - if (caps->ofs_delta) - git_buf_puts(&str, GIT_CAP_OFS_DELTA " "); - - if (git_buf_oom(&str)) - return -1; - - len = strlen("XXXXwant ") + GIT_OID_HEXSZ + 1 /* NUL */ + - git_buf_len(&str) + 1 /* LF */; - - if (len > 0xffff) { - giterr_set(GITERR_NET, - "Tried to produce packet with invalid length %" PRIuZ, len); - return -1; - } - - git_buf_grow_by(buf, len); - git_oid_fmt(oid, &head->oid); - git_buf_printf(buf, - "%04xwant %s %s\n", (unsigned int)len, oid, git_buf_cstr(&str)); - git_buf_free(&str); - - return git_buf_oom(buf); -} - -/* - * All "want" packets have the same length and format, so what we do - * is overwrite the OID each time. - */ - -int git_pkt_buffer_wants( - const git_remote_head * const *refs, - size_t count, - transport_smart_caps *caps, - git_buf *buf) -{ - size_t i = 0; - const git_remote_head *head; - - if (caps->common) { - for (; i < count; ++i) { - head = refs[i]; - if (!head->local) - break; - } - - if (buffer_want_with_caps(refs[i], caps, buf) < 0) - return -1; - - i++; - } - - for (; i < count; ++i) { - char oid[GIT_OID_HEXSZ]; - - head = refs[i]; - if (head->local) - continue; - - git_oid_fmt(oid, &head->oid); - git_buf_put(buf, pkt_want_prefix, strlen(pkt_want_prefix)); - git_buf_put(buf, oid, GIT_OID_HEXSZ); - git_buf_putc(buf, '\n'); - if (git_buf_oom(buf)) - return -1; - } - - return git_pkt_buffer_flush(buf); -} - -int git_pkt_buffer_have(git_oid *oid, git_buf *buf) -{ - char oidhex[GIT_OID_HEXSZ + 1]; - - memset(oidhex, 0x0, sizeof(oidhex)); - git_oid_fmt(oidhex, oid); - return git_buf_printf(buf, "%s%s\n", pkt_have_prefix, oidhex); -} - -int git_pkt_buffer_done(git_buf *buf) -{ - return git_buf_puts(buf, pkt_done_str); -} diff --git a/vendor/libgit2/src/transports/smart_protocol.c b/vendor/libgit2/src/transports/smart_protocol.c deleted file mode 100644 index 0920f2eef0..0000000000 --- a/vendor/libgit2/src/transports/smart_protocol.c +++ /dev/null @@ -1,1035 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#include "git2.h" -#include "git2/odb_backend.h" - -#include "smart.h" -#include "refs.h" -#include "repository.h" -#include "push.h" -#include "pack-objects.h" -#include "remote.h" -#include "util.h" - -#define NETWORK_XFER_THRESHOLD (100*1024) -/* The minimal interval between progress updates (in seconds). */ -#define MIN_PROGRESS_UPDATE_INTERVAL 0.5 - -int git_smart__store_refs(transport_smart *t, int flushes) -{ - gitno_buffer *buf = &t->buffer; - git_vector *refs = &t->refs; - int error, flush = 0, recvd; - const char *line_end = NULL; - git_pkt *pkt = NULL; - size_t i; - - /* Clear existing refs in case git_remote_connect() is called again - * after git_remote_disconnect(). - */ - git_vector_foreach(refs, i, pkt) { - git_pkt_free(pkt); - } - git_vector_clear(refs); - pkt = NULL; - - do { - if (buf->offset > 0) - error = git_pkt_parse_line(&pkt, buf->data, &line_end, buf->offset); - else - error = GIT_EBUFS; - - if (error < 0 && error != GIT_EBUFS) - return error; - - if (error == GIT_EBUFS) { - if ((recvd = gitno_recv(buf)) < 0) - return recvd; - - if (recvd == 0 && !flush) { - giterr_set(GITERR_NET, "early EOF"); - return GIT_EEOF; - } - - continue; - } - - gitno_consume(buf, line_end); - if (pkt->type == GIT_PKT_ERR) { - giterr_set(GITERR_NET, "Remote error: %s", ((git_pkt_err *)pkt)->error); - git__free(pkt); - return -1; - } - - if (pkt->type != GIT_PKT_FLUSH && git_vector_insert(refs, pkt) < 0) - return -1; - - if (pkt->type == GIT_PKT_FLUSH) { - flush++; - git_pkt_free(pkt); - } - } while (flush < flushes); - - return flush; -} - -static int append_symref(const char **out, git_vector *symrefs, const char *ptr) -{ - int error; - const char *end; - git_buf buf = GIT_BUF_INIT; - git_refspec *mapping = NULL; - - ptr += strlen(GIT_CAP_SYMREF); - if (*ptr != '=') - goto on_invalid; - - ptr++; - if (!(end = strchr(ptr, ' ')) && - !(end = strchr(ptr, '\0'))) - goto on_invalid; - - if ((error = git_buf_put(&buf, ptr, end - ptr)) < 0) - return error; - - /* symref mapping has refspec format */ - mapping = git__calloc(1, sizeof(git_refspec)); - GITERR_CHECK_ALLOC(mapping); - - error = git_refspec__parse(mapping, git_buf_cstr(&buf), true); - git_buf_free(&buf); - - /* if the error isn't OOM, then it's a parse error; let's use a nicer message */ - if (error < 0) { - if (giterr_last()->klass != GITERR_NOMEMORY) - goto on_invalid; - - return error; - } - - if ((error = git_vector_insert(symrefs, mapping)) < 0) - return error; - - *out = end; - return 0; - -on_invalid: - giterr_set(GITERR_NET, "remote sent invalid symref"); - git_refspec__free(mapping); - return -1; -} - -int git_smart__detect_caps(git_pkt_ref *pkt, transport_smart_caps *caps, git_vector *symrefs) -{ - const char *ptr; - - /* No refs or capabilites, odd but not a problem */ - if (pkt == NULL || pkt->capabilities == NULL) - return 0; - - ptr = pkt->capabilities; - while (ptr != NULL && *ptr != '\0') { - if (*ptr == ' ') - ptr++; - - if (!git__prefixcmp(ptr, GIT_CAP_OFS_DELTA)) { - caps->common = caps->ofs_delta = 1; - ptr += strlen(GIT_CAP_OFS_DELTA); - continue; - } - - /* Keep multi_ack_detailed before multi_ack */ - if (!git__prefixcmp(ptr, GIT_CAP_MULTI_ACK_DETAILED)) { - caps->common = caps->multi_ack_detailed = 1; - ptr += strlen(GIT_CAP_MULTI_ACK_DETAILED); - continue; - } - - if (!git__prefixcmp(ptr, GIT_CAP_MULTI_ACK)) { - caps->common = caps->multi_ack = 1; - ptr += strlen(GIT_CAP_MULTI_ACK); - continue; - } - - if (!git__prefixcmp(ptr, GIT_CAP_INCLUDE_TAG)) { - caps->common = caps->include_tag = 1; - ptr += strlen(GIT_CAP_INCLUDE_TAG); - continue; - } - - /* Keep side-band check after side-band-64k */ - if (!git__prefixcmp(ptr, GIT_CAP_SIDE_BAND_64K)) { - caps->common = caps->side_band_64k = 1; - ptr += strlen(GIT_CAP_SIDE_BAND_64K); - continue; - } - - if (!git__prefixcmp(ptr, GIT_CAP_SIDE_BAND)) { - caps->common = caps->side_band = 1; - ptr += strlen(GIT_CAP_SIDE_BAND); - continue; - } - - if (!git__prefixcmp(ptr, GIT_CAP_DELETE_REFS)) { - caps->common = caps->delete_refs = 1; - ptr += strlen(GIT_CAP_DELETE_REFS); - continue; - } - - if (!git__prefixcmp(ptr, GIT_CAP_THIN_PACK)) { - caps->common = caps->thin_pack = 1; - ptr += strlen(GIT_CAP_THIN_PACK); - continue; - } - - if (!git__prefixcmp(ptr, GIT_CAP_SYMREF)) { - int error; - - if ((error = append_symref(&ptr, symrefs, ptr)) < 0) - return error; - - continue; - } - - /* We don't know this capability, so skip it */ - ptr = strchr(ptr, ' '); - } - - return 0; -} - -static int recv_pkt(git_pkt **out, gitno_buffer *buf) -{ - const char *ptr = buf->data, *line_end = ptr; - git_pkt *pkt = NULL; - int pkt_type, error = 0, ret; - - do { - if (buf->offset > 0) - error = git_pkt_parse_line(&pkt, ptr, &line_end, buf->offset); - else - error = GIT_EBUFS; - - if (error == 0) - break; /* return the pkt */ - - if (error < 0 && error != GIT_EBUFS) - return error; - - if ((ret = gitno_recv(buf)) < 0) - return ret; - } while (error); - - gitno_consume(buf, line_end); - pkt_type = pkt->type; - if (out != NULL) - *out = pkt; - else - git__free(pkt); - - return pkt_type; -} - -static int store_common(transport_smart *t) -{ - git_pkt *pkt = NULL; - gitno_buffer *buf = &t->buffer; - int error; - - do { - if ((error = recv_pkt(&pkt, buf)) < 0) - return error; - - if (pkt->type == GIT_PKT_ACK) { - if (git_vector_insert(&t->common, pkt) < 0) - return -1; - } else { - git__free(pkt); - return 0; - } - - } while (1); - - return 0; -} - -static int fetch_setup_walk(git_revwalk **out, git_repository *repo) -{ - git_revwalk *walk = NULL; - git_strarray refs; - unsigned int i; - git_reference *ref; - int error; - - if ((error = git_reference_list(&refs, repo)) < 0) - return error; - - if ((error = git_revwalk_new(&walk, repo)) < 0) - return error; - - git_revwalk_sorting(walk, GIT_SORT_TIME); - - for (i = 0; i < refs.count; ++i) { - /* No tags */ - if (!git__prefixcmp(refs.strings[i], GIT_REFS_TAGS_DIR)) - continue; - - if ((error = git_reference_lookup(&ref, repo, refs.strings[i])) < 0) - goto on_error; - - if (git_reference_type(ref) == GIT_REF_SYMBOLIC) - continue; - - if ((error = git_revwalk_push(walk, git_reference_target(ref))) < 0) - goto on_error; - - git_reference_free(ref); - } - - git_strarray_free(&refs); - *out = walk; - return 0; - -on_error: - git_revwalk_free(walk); - git_reference_free(ref); - git_strarray_free(&refs); - return error; -} - -static int wait_while_ack(gitno_buffer *buf) -{ - int error; - git_pkt_ack *pkt = NULL; - - while (1) { - git__free(pkt); - - if ((error = recv_pkt((git_pkt **)&pkt, buf)) < 0) - return error; - - if (pkt->type == GIT_PKT_NAK) - break; - - if (pkt->type == GIT_PKT_ACK && - (pkt->status != GIT_ACK_CONTINUE && - pkt->status != GIT_ACK_COMMON)) { - git__free(pkt); - return 0; - } - } - - git__free(pkt); - return 0; -} - -int git_smart__negotiate_fetch(git_transport *transport, git_repository *repo, const git_remote_head * const *wants, size_t count) -{ - transport_smart *t = (transport_smart *)transport; - gitno_buffer *buf = &t->buffer; - git_buf data = GIT_BUF_INIT; - git_revwalk *walk = NULL; - int error = -1, pkt_type; - unsigned int i; - git_oid oid; - - if ((error = git_pkt_buffer_wants(wants, count, &t->caps, &data)) < 0) - return error; - - if ((error = fetch_setup_walk(&walk, repo)) < 0) - goto on_error; - - /* - * Our support for ACK extensions is simply to parse them. On - * the first ACK we will accept that as enough common - * objects. We give up if we haven't found an answer in the - * first 256 we send. - */ - i = 0; - while (i < 256) { - error = git_revwalk_next(&oid, walk); - - if (error < 0) { - if (GIT_ITEROVER == error) - break; - - goto on_error; - } - - git_pkt_buffer_have(&oid, &data); - i++; - if (i % 20 == 0) { - if (t->cancelled.val) { - giterr_set(GITERR_NET, "The fetch was cancelled by the user"); - error = GIT_EUSER; - goto on_error; - } - - git_pkt_buffer_flush(&data); - if (git_buf_oom(&data)) { - error = -1; - goto on_error; - } - - if ((error = git_smart__negotiation_step(&t->parent, data.ptr, data.size)) < 0) - goto on_error; - - git_buf_clear(&data); - if (t->caps.multi_ack || t->caps.multi_ack_detailed) { - if ((error = store_common(t)) < 0) - goto on_error; - } else { - pkt_type = recv_pkt(NULL, buf); - - if (pkt_type == GIT_PKT_ACK) { - break; - } else if (pkt_type == GIT_PKT_NAK) { - continue; - } else if (pkt_type < 0) { - /* recv_pkt returned an error */ - error = pkt_type; - goto on_error; - } else { - giterr_set(GITERR_NET, "Unexpected pkt type"); - error = -1; - goto on_error; - } - } - } - - if (t->common.length > 0) - break; - - if (i % 20 == 0 && t->rpc) { - git_pkt_ack *pkt; - unsigned int i; - - if ((error = git_pkt_buffer_wants(wants, count, &t->caps, &data)) < 0) - goto on_error; - - git_vector_foreach(&t->common, i, pkt) { - if ((error = git_pkt_buffer_have(&pkt->oid, &data)) < 0) - goto on_error; - } - - if (git_buf_oom(&data)) { - error = -1; - goto on_error; - } - } - } - - /* Tell the other end that we're done negotiating */ - if (t->rpc && t->common.length > 0) { - git_pkt_ack *pkt; - unsigned int i; - - if ((error = git_pkt_buffer_wants(wants, count, &t->caps, &data)) < 0) - goto on_error; - - git_vector_foreach(&t->common, i, pkt) { - if ((error = git_pkt_buffer_have(&pkt->oid, &data)) < 0) - goto on_error; - } - - if (git_buf_oom(&data)) { - error = -1; - goto on_error; - } - } - - if ((error = git_pkt_buffer_done(&data)) < 0) - goto on_error; - - if (t->cancelled.val) { - giterr_set(GITERR_NET, "The fetch was cancelled by the user"); - error = GIT_EUSER; - goto on_error; - } - if ((error = git_smart__negotiation_step(&t->parent, data.ptr, data.size)) < 0) - goto on_error; - - git_buf_free(&data); - git_revwalk_free(walk); - - /* Now let's eat up whatever the server gives us */ - if (!t->caps.multi_ack && !t->caps.multi_ack_detailed) { - pkt_type = recv_pkt(NULL, buf); - - if (pkt_type < 0) { - return pkt_type; - } else if (pkt_type != GIT_PKT_ACK && pkt_type != GIT_PKT_NAK) { - giterr_set(GITERR_NET, "Unexpected pkt type"); - return -1; - } - } else { - error = wait_while_ack(buf); - } - - return error; - -on_error: - git_revwalk_free(walk); - git_buf_free(&data); - return error; -} - -static int no_sideband(transport_smart *t, struct git_odb_writepack *writepack, gitno_buffer *buf, git_transfer_progress *stats) -{ - int recvd; - - do { - if (t->cancelled.val) { - giterr_set(GITERR_NET, "The fetch was cancelled by the user"); - return GIT_EUSER; - } - - if (writepack->append(writepack, buf->data, buf->offset, stats) < 0) - return -1; - - gitno_consume_n(buf, buf->offset); - - if ((recvd = gitno_recv(buf)) < 0) - return recvd; - } while(recvd > 0); - - if (writepack->commit(writepack, stats) < 0) - return -1; - - return 0; -} - -struct network_packetsize_payload -{ - git_transfer_progress_cb callback; - void *payload; - git_transfer_progress *stats; - size_t last_fired_bytes; -}; - -static int network_packetsize(size_t received, void *payload) -{ - struct network_packetsize_payload *npp = (struct network_packetsize_payload*)payload; - - /* Accumulate bytes */ - npp->stats->received_bytes += received; - - /* Fire notification if the threshold is reached */ - if ((npp->stats->received_bytes - npp->last_fired_bytes) > NETWORK_XFER_THRESHOLD) { - npp->last_fired_bytes = npp->stats->received_bytes; - - if (npp->callback(npp->stats, npp->payload)) - return GIT_EUSER; - } - - return 0; -} - -int git_smart__download_pack( - git_transport *transport, - git_repository *repo, - git_transfer_progress *stats, - git_transfer_progress_cb transfer_progress_cb, - void *progress_payload) -{ - transport_smart *t = (transport_smart *)transport; - gitno_buffer *buf = &t->buffer; - git_odb *odb; - struct git_odb_writepack *writepack = NULL; - int error = 0; - struct network_packetsize_payload npp = {0}; - - memset(stats, 0, sizeof(git_transfer_progress)); - - if (transfer_progress_cb) { - npp.callback = transfer_progress_cb; - npp.payload = progress_payload; - npp.stats = stats; - t->packetsize_cb = &network_packetsize; - t->packetsize_payload = &npp; - - /* We might have something in the buffer already from negotiate_fetch */ - if (t->buffer.offset > 0 && !t->cancelled.val) - if (t->packetsize_cb(t->buffer.offset, t->packetsize_payload)) - git_atomic_set(&t->cancelled, 1); - } - - if ((error = git_repository_odb__weakptr(&odb, repo)) < 0 || - ((error = git_odb_write_pack(&writepack, odb, transfer_progress_cb, progress_payload)) != 0)) - goto done; - - /* - * If the remote doesn't support the side-band, we can feed - * the data directly to the pack writer. Otherwise, we need to - * check which one belongs there. - */ - if (!t->caps.side_band && !t->caps.side_band_64k) { - error = no_sideband(t, writepack, buf, stats); - goto done; - } - - do { - git_pkt *pkt = NULL; - - /* Check cancellation before network call */ - if (t->cancelled.val) { - giterr_clear(); - error = GIT_EUSER; - goto done; - } - - if ((error = recv_pkt(&pkt, buf)) >= 0) { - /* Check cancellation after network call */ - if (t->cancelled.val) { - giterr_clear(); - error = GIT_EUSER; - } else if (pkt->type == GIT_PKT_PROGRESS) { - if (t->progress_cb) { - git_pkt_progress *p = (git_pkt_progress *) pkt; - error = t->progress_cb(p->data, p->len, t->message_cb_payload); - } - } else if (pkt->type == GIT_PKT_DATA) { - git_pkt_data *p = (git_pkt_data *) pkt; - - if (p->len) - error = writepack->append(writepack, p->data, p->len, stats); - } else if (pkt->type == GIT_PKT_FLUSH) { - /* A flush indicates the end of the packfile */ - git__free(pkt); - break; - } - } - - git__free(pkt); - if (error < 0) - goto done; - - } while (1); - - /* - * Trailing execution of transfer_progress_cb, if necessary... - * Only the callback through the npp datastructure currently - * updates the last_fired_bytes value. It is possible that - * progress has already been reported with the correct - * "received_bytes" value, but until (if?) this is unified - * then we will report progress again to be sure that the - * correct last received_bytes value is reported. - */ - if (npp.callback && npp.stats->received_bytes > npp.last_fired_bytes) { - error = npp.callback(npp.stats, npp.payload); - if (error != 0) - goto done; - } - - error = writepack->commit(writepack, stats); - -done: - if (writepack) - writepack->free(writepack); - if (transfer_progress_cb) { - t->packetsize_cb = NULL; - t->packetsize_payload = NULL; - } - - return error; -} - -static int gen_pktline(git_buf *buf, git_push *push) -{ - push_spec *spec; - size_t i, len; - char old_id[GIT_OID_HEXSZ+1], new_id[GIT_OID_HEXSZ+1]; - - old_id[GIT_OID_HEXSZ] = '\0'; new_id[GIT_OID_HEXSZ] = '\0'; - - git_vector_foreach(&push->specs, i, spec) { - len = 2*GIT_OID_HEXSZ + 7 + strlen(spec->refspec.dst); - - if (i == 0) { - ++len; /* '\0' */ - if (push->report_status) - len += strlen(GIT_CAP_REPORT_STATUS) + 1; - len += strlen(GIT_CAP_SIDE_BAND_64K) + 1; - } - - git_oid_fmt(old_id, &spec->roid); - git_oid_fmt(new_id, &spec->loid); - - git_buf_printf(buf, "%04"PRIxZ"%s %s %s", len, old_id, new_id, spec->refspec.dst); - - if (i == 0) { - git_buf_putc(buf, '\0'); - /* Core git always starts their capabilities string with a space */ - if (push->report_status) { - git_buf_putc(buf, ' '); - git_buf_printf(buf, GIT_CAP_REPORT_STATUS); - } - git_buf_putc(buf, ' '); - git_buf_printf(buf, GIT_CAP_SIDE_BAND_64K); - } - - git_buf_putc(buf, '\n'); - } - - git_buf_puts(buf, "0000"); - return git_buf_oom(buf) ? -1 : 0; -} - -static int add_push_report_pkt(git_push *push, git_pkt *pkt) -{ - push_status *status; - - switch (pkt->type) { - case GIT_PKT_OK: - status = git__calloc(1, sizeof(push_status)); - GITERR_CHECK_ALLOC(status); - status->msg = NULL; - status->ref = git__strdup(((git_pkt_ok *)pkt)->ref); - if (!status->ref || - git_vector_insert(&push->status, status) < 0) { - git_push_status_free(status); - return -1; - } - break; - case GIT_PKT_NG: - status = git__calloc(1, sizeof(push_status)); - GITERR_CHECK_ALLOC(status); - status->ref = git__strdup(((git_pkt_ng *)pkt)->ref); - status->msg = git__strdup(((git_pkt_ng *)pkt)->msg); - if (!status->ref || !status->msg || - git_vector_insert(&push->status, status) < 0) { - git_push_status_free(status); - return -1; - } - break; - case GIT_PKT_UNPACK: - push->unpack_ok = ((git_pkt_unpack *)pkt)->unpack_ok; - break; - case GIT_PKT_FLUSH: - return GIT_ITEROVER; - default: - giterr_set(GITERR_NET, "report-status: protocol error"); - return -1; - } - - return 0; -} - -static int add_push_report_sideband_pkt(git_push *push, git_pkt_data *data_pkt) -{ - git_pkt *pkt; - const char *line = data_pkt->data, *line_end; - size_t line_len = data_pkt->len; - int error; - - while (line_len > 0) { - error = git_pkt_parse_line(&pkt, line, &line_end, line_len); - - if (error < 0) - return error; - - /* Advance in the buffer */ - line_len -= (line_end - line); - line = line_end; - - error = add_push_report_pkt(push, pkt); - - git_pkt_free(pkt); - - if (error < 0 && error != GIT_ITEROVER) - return error; - } - - return 0; -} - -static int parse_report(transport_smart *transport, git_push *push) -{ - git_pkt *pkt = NULL; - const char *line_end = NULL; - gitno_buffer *buf = &transport->buffer; - int error, recvd; - - for (;;) { - if (buf->offset > 0) - error = git_pkt_parse_line(&pkt, buf->data, - &line_end, buf->offset); - else - error = GIT_EBUFS; - - if (error < 0 && error != GIT_EBUFS) - return -1; - - if (error == GIT_EBUFS) { - if ((recvd = gitno_recv(buf)) < 0) - return recvd; - - if (recvd == 0) { - giterr_set(GITERR_NET, "early EOF"); - return GIT_EEOF; - } - continue; - } - - gitno_consume(buf, line_end); - - error = 0; - - switch (pkt->type) { - case GIT_PKT_DATA: - /* This is a sideband packet which contains other packets */ - error = add_push_report_sideband_pkt(push, (git_pkt_data *)pkt); - break; - case GIT_PKT_ERR: - giterr_set(GITERR_NET, "report-status: Error reported: %s", - ((git_pkt_err *)pkt)->error); - error = -1; - break; - case GIT_PKT_PROGRESS: - if (transport->progress_cb) { - git_pkt_progress *p = (git_pkt_progress *) pkt; - error = transport->progress_cb(p->data, p->len, transport->message_cb_payload); - } - break; - default: - error = add_push_report_pkt(push, pkt); - break; - } - - git_pkt_free(pkt); - - /* add_push_report_pkt returns GIT_ITEROVER when it receives a flush */ - if (error == GIT_ITEROVER) - return 0; - - if (error < 0) - return error; - } -} - -static int add_ref_from_push_spec(git_vector *refs, push_spec *push_spec) -{ - git_pkt_ref *added = git__calloc(1, sizeof(git_pkt_ref)); - GITERR_CHECK_ALLOC(added); - - added->type = GIT_PKT_REF; - git_oid_cpy(&added->head.oid, &push_spec->loid); - added->head.name = git__strdup(push_spec->refspec.dst); - - if (!added->head.name || - git_vector_insert(refs, added) < 0) { - git_pkt_free((git_pkt *)added); - return -1; - } - - return 0; -} - -static int update_refs_from_report( - git_vector *refs, - git_vector *push_specs, - git_vector *push_report) -{ - git_pkt_ref *ref; - push_spec *push_spec; - push_status *push_status; - size_t i, j, refs_len; - int cmp; - - /* For each push spec we sent to the server, we should have - * gotten back a status packet in the push report */ - if (push_specs->length != push_report->length) { - giterr_set(GITERR_NET, "report-status: protocol error"); - return -1; - } - - /* We require that push_specs be sorted with push_spec_rref_cmp, - * and that push_report be sorted with push_status_ref_cmp */ - git_vector_sort(push_specs); - git_vector_sort(push_report); - - git_vector_foreach(push_specs, i, push_spec) { - push_status = git_vector_get(push_report, i); - - /* For each push spec we sent to the server, we should have - * gotten back a status packet in the push report which matches */ - if (strcmp(push_spec->refspec.dst, push_status->ref)) { - giterr_set(GITERR_NET, "report-status: protocol error"); - return -1; - } - } - - /* We require that refs be sorted with ref_name_cmp */ - git_vector_sort(refs); - i = j = 0; - refs_len = refs->length; - - /* Merge join push_specs with refs */ - while (i < push_specs->length && j < refs_len) { - push_spec = git_vector_get(push_specs, i); - push_status = git_vector_get(push_report, i); - ref = git_vector_get(refs, j); - - cmp = strcmp(push_spec->refspec.dst, ref->head.name); - - /* Iterate appropriately */ - if (cmp <= 0) i++; - if (cmp >= 0) j++; - - /* Add case */ - if (cmp < 0 && - !push_status->msg && - add_ref_from_push_spec(refs, push_spec) < 0) - return -1; - - /* Update case, delete case */ - if (cmp == 0 && - !push_status->msg) - git_oid_cpy(&ref->head.oid, &push_spec->loid); - } - - for (; i < push_specs->length; i++) { - push_spec = git_vector_get(push_specs, i); - push_status = git_vector_get(push_report, i); - - /* Add case */ - if (!push_status->msg && - add_ref_from_push_spec(refs, push_spec) < 0) - return -1; - } - - /* Remove any refs which we updated to have a zero OID. */ - git_vector_rforeach(refs, i, ref) { - if (git_oid_iszero(&ref->head.oid)) { - git_vector_remove(refs, i); - git_pkt_free((git_pkt *)ref); - } - } - - git_vector_sort(refs); - - return 0; -} - -struct push_packbuilder_payload -{ - git_smart_subtransport_stream *stream; - git_packbuilder *pb; - git_push_transfer_progress cb; - void *cb_payload; - size_t last_bytes; - double last_progress_report_time; -}; - -static int stream_thunk(void *buf, size_t size, void *data) -{ - int error = 0; - struct push_packbuilder_payload *payload = data; - - if ((error = payload->stream->write(payload->stream, (const char *)buf, size)) < 0) - return error; - - if (payload->cb) { - double current_time = git__timer(); - payload->last_bytes += size; - - if ((current_time - payload->last_progress_report_time) >= MIN_PROGRESS_UPDATE_INTERVAL) { - payload->last_progress_report_time = current_time; - error = payload->cb(payload->pb->nr_written, payload->pb->nr_objects, payload->last_bytes, payload->cb_payload); - } - } - - return error; -} - -int git_smart__push(git_transport *transport, git_push *push, const git_remote_callbacks *cbs) -{ - transport_smart *t = (transport_smart *)transport; - struct push_packbuilder_payload packbuilder_payload = {0}; - git_buf pktline = GIT_BUF_INIT; - int error = 0, need_pack = 0; - push_spec *spec; - unsigned int i; - - packbuilder_payload.pb = push->pb; - - if (cbs && cbs->transfer_progress) { - packbuilder_payload.cb = cbs->push_transfer_progress; - packbuilder_payload.cb_payload = cbs->payload; - } - -#ifdef PUSH_DEBUG -{ - git_remote_head *head; - char hex[GIT_OID_HEXSZ+1]; hex[GIT_OID_HEXSZ] = '\0'; - - git_vector_foreach(&push->remote->refs, i, head) { - git_oid_fmt(hex, &head->oid); - fprintf(stderr, "%s (%s)\n", hex, head->name); - } - - git_vector_foreach(&push->specs, i, spec) { - git_oid_fmt(hex, &spec->roid); - fprintf(stderr, "%s (%s) -> ", hex, spec->lref); - git_oid_fmt(hex, &spec->loid); - fprintf(stderr, "%s (%s)\n", hex, spec->rref ? - spec->rref : spec->lref); - } -} -#endif - - /* - * Figure out if we need to send a packfile; which is in all - * cases except when we only send delete commands - */ - git_vector_foreach(&push->specs, i, spec) { - if (spec->refspec.src && spec->refspec.src[0] != '\0') { - need_pack = 1; - break; - } - } - - if ((error = git_smart__get_push_stream(t, &packbuilder_payload.stream)) < 0 || - (error = gen_pktline(&pktline, push)) < 0 || - (error = packbuilder_payload.stream->write(packbuilder_payload.stream, git_buf_cstr(&pktline), git_buf_len(&pktline))) < 0) - goto done; - - if (need_pack && - (error = git_packbuilder_foreach(push->pb, &stream_thunk, &packbuilder_payload)) < 0) - goto done; - - /* If we sent nothing or the server doesn't support report-status, then - * we consider the pack to have been unpacked successfully */ - if (!push->specs.length || !push->report_status) - push->unpack_ok = 1; - else if ((error = parse_report(t, push)) < 0) - goto done; - - /* If progress is being reported write the final report */ - if (cbs && cbs->push_transfer_progress) { - error = cbs->push_transfer_progress( - push->pb->nr_written, - push->pb->nr_objects, - packbuilder_payload.last_bytes, - cbs->payload); - - if (error < 0) - goto done; - } - - if (push->status.length) { - error = update_refs_from_report(&t->refs, &push->specs, &push->status); - if (error < 0) - goto done; - - error = git_smart__update_heads(t, NULL); - } - -done: - git_buf_free(&pktline); - return error; -} diff --git a/vendor/libgit2/src/transports/ssh.c b/vendor/libgit2/src/transports/ssh.c deleted file mode 100644 index e3792ebb3c..0000000000 --- a/vendor/libgit2/src/transports/ssh.c +++ /dev/null @@ -1,871 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#ifdef GIT_SSH -#include -#endif - -#include "git2.h" -#include "buffer.h" -#include "netops.h" -#include "smart.h" -#include "cred.h" -#include "socket_stream.h" - -#ifdef GIT_SSH - -#define OWNING_SUBTRANSPORT(s) ((ssh_subtransport *)(s)->parent.subtransport) - -static const char prefix_ssh[] = "ssh://"; -static const char cmd_uploadpack[] = "git-upload-pack"; -static const char cmd_receivepack[] = "git-receive-pack"; - -typedef struct { - git_smart_subtransport_stream parent; - git_stream *io; - LIBSSH2_SESSION *session; - LIBSSH2_CHANNEL *channel; - const char *cmd; - char *url; - unsigned sent_command : 1; -} ssh_stream; - -typedef struct { - git_smart_subtransport parent; - transport_smart *owner; - ssh_stream *current_stream; - git_cred *cred; - char *cmd_uploadpack; - char *cmd_receivepack; -} ssh_subtransport; - -static int list_auth_methods(int *out, LIBSSH2_SESSION *session, const char *username); - -static void ssh_error(LIBSSH2_SESSION *session, const char *errmsg) -{ - char *ssherr; - libssh2_session_last_error(session, &ssherr, NULL, 0); - - giterr_set(GITERR_SSH, "%s: %s", errmsg, ssherr); -} - -/* - * Create a git protocol request. - * - * For example: git-upload-pack '/libgit2/libgit2' - */ -static int gen_proto(git_buf *request, const char *cmd, const char *url) -{ - char *repo; - int len; - - if (!git__prefixcmp(url, prefix_ssh)) { - url = url + strlen(prefix_ssh); - repo = strchr(url, '/'); - if (repo && repo[1] == '~') - ++repo; - } else { - repo = strchr(url, ':'); - if (repo) repo++; - } - - if (!repo) { - giterr_set(GITERR_NET, "Malformed git protocol URL"); - return -1; - } - - len = strlen(cmd) + 1 /* Space */ + 1 /* Quote */ + strlen(repo) + 1 /* Quote */ + 1; - - git_buf_grow(request, len); - git_buf_printf(request, "%s '%s'", cmd, repo); - git_buf_putc(request, '\0'); - - if (git_buf_oom(request)) - return -1; - - return 0; -} - -static int send_command(ssh_stream *s) -{ - int error; - git_buf request = GIT_BUF_INIT; - - error = gen_proto(&request, s->cmd, s->url); - if (error < 0) - goto cleanup; - - error = libssh2_channel_exec(s->channel, request.ptr); - if (error < LIBSSH2_ERROR_NONE) { - ssh_error(s->session, "SSH could not execute request"); - goto cleanup; - } - - s->sent_command = 1; - -cleanup: - git_buf_free(&request); - return error; -} - -static int ssh_stream_read( - git_smart_subtransport_stream *stream, - char *buffer, - size_t buf_size, - size_t *bytes_read) -{ - int rc; - ssh_stream *s = (ssh_stream *)stream; - - *bytes_read = 0; - - if (!s->sent_command && send_command(s) < 0) - return -1; - - if ((rc = libssh2_channel_read(s->channel, buffer, buf_size)) < LIBSSH2_ERROR_NONE) { - ssh_error(s->session, "SSH could not read data"); - return -1; - } - - /* - * If we can't get anything out of stdout, it's typically a - * not-found error, so read from stderr and signal EOF on - * stderr. - */ - if (rc == 0 && (rc = libssh2_channel_read_stderr(s->channel, buffer, buf_size)) > 0) { - giterr_set(GITERR_SSH, "%*s", rc, buffer); - return GIT_EEOF; - } - - - *bytes_read = rc; - - return 0; -} - -static int ssh_stream_write( - git_smart_subtransport_stream *stream, - const char *buffer, - size_t len) -{ - ssh_stream *s = (ssh_stream *)stream; - size_t off = 0; - ssize_t ret = 0; - - if (!s->sent_command && send_command(s) < 0) - return -1; - - do { - ret = libssh2_channel_write(s->channel, buffer + off, len - off); - if (ret < 0) - break; - - off += ret; - - } while (off < len); - - if (ret < 0) { - ssh_error(s->session, "SSH could not write data"); - return -1; - } - - return 0; -} - -static void ssh_stream_free(git_smart_subtransport_stream *stream) -{ - ssh_stream *s = (ssh_stream *)stream; - ssh_subtransport *t; - - if (!stream) - return; - - t = OWNING_SUBTRANSPORT(s); - t->current_stream = NULL; - - if (s->channel) { - libssh2_channel_close(s->channel); - libssh2_channel_free(s->channel); - s->channel = NULL; - } - - if (s->session) { - libssh2_session_free(s->session); - s->session = NULL; - } - - if (s->io) { - git_stream_close(s->io); - git_stream_free(s->io); - s->io = NULL; - } - - git__free(s->url); - git__free(s); -} - -static int ssh_stream_alloc( - ssh_subtransport *t, - const char *url, - const char *cmd, - git_smart_subtransport_stream **stream) -{ - ssh_stream *s; - - assert(stream); - - s = git__calloc(sizeof(ssh_stream), 1); - GITERR_CHECK_ALLOC(s); - - s->parent.subtransport = &t->parent; - s->parent.read = ssh_stream_read; - s->parent.write = ssh_stream_write; - s->parent.free = ssh_stream_free; - - s->cmd = cmd; - - s->url = git__strdup(url); - if (!s->url) { - git__free(s); - return -1; - } - - *stream = &s->parent; - return 0; -} - -static int git_ssh_extract_url_parts( - char **host, - char **username, - const char *url) -{ - char *colon, *at; - const char *start; - - colon = strchr(url, ':'); - - - at = strchr(url, '@'); - if (at) { - start = at + 1; - *username = git__substrdup(url, at - url); - GITERR_CHECK_ALLOC(*username); - } else { - start = url; - *username = NULL; - } - - if (colon == NULL || (colon < start)) { - giterr_set(GITERR_NET, "Malformed URL"); - return -1; - } - - *host = git__substrdup(start, colon - start); - GITERR_CHECK_ALLOC(*host); - - return 0; -} - -static int ssh_agent_auth(LIBSSH2_SESSION *session, git_cred_ssh_key *c) { - int rc = LIBSSH2_ERROR_NONE; - - struct libssh2_agent_publickey *curr, *prev = NULL; - - LIBSSH2_AGENT *agent = libssh2_agent_init(session); - - if (agent == NULL) - return -1; - - rc = libssh2_agent_connect(agent); - - if (rc != LIBSSH2_ERROR_NONE) - goto shutdown; - - rc = libssh2_agent_list_identities(agent); - - if (rc != LIBSSH2_ERROR_NONE) - goto shutdown; - - while (1) { - rc = libssh2_agent_get_identity(agent, &curr, prev); - - if (rc < 0) - goto shutdown; - - /* rc is set to 1 whenever the ssh agent ran out of keys to check. - * Set the error code to authentication failure rather than erroring - * out with an untranslatable error code. - */ - if (rc == 1) { - rc = LIBSSH2_ERROR_AUTHENTICATION_FAILED; - goto shutdown; - } - - rc = libssh2_agent_userauth(agent, c->username, curr); - - if (rc == 0) - break; - - prev = curr; - } - -shutdown: - - if (rc != LIBSSH2_ERROR_NONE) - ssh_error(session, "error authenticating"); - - libssh2_agent_disconnect(agent); - libssh2_agent_free(agent); - - return rc; -} - -static int _git_ssh_authenticate_session( - LIBSSH2_SESSION* session, - git_cred* cred) -{ - int rc; - - do { - giterr_clear(); - switch (cred->credtype) { - case GIT_CREDTYPE_USERPASS_PLAINTEXT: { - git_cred_userpass_plaintext *c = (git_cred_userpass_plaintext *)cred; - rc = libssh2_userauth_password(session, c->username, c->password); - break; - } - case GIT_CREDTYPE_SSH_KEY: { - git_cred_ssh_key *c = (git_cred_ssh_key *)cred; - - if (c->privatekey) - rc = libssh2_userauth_publickey_fromfile( - session, c->username, c->publickey, - c->privatekey, c->passphrase); - else - rc = ssh_agent_auth(session, c); - - break; - } - case GIT_CREDTYPE_SSH_CUSTOM: { - git_cred_ssh_custom *c = (git_cred_ssh_custom *)cred; - - rc = libssh2_userauth_publickey( - session, c->username, (const unsigned char *)c->publickey, - c->publickey_len, c->sign_callback, &c->payload); - break; - } - case GIT_CREDTYPE_SSH_INTERACTIVE: { - void **abstract = libssh2_session_abstract(session); - git_cred_ssh_interactive *c = (git_cred_ssh_interactive *)cred; - - /* ideally, we should be able to set this by calling - * libssh2_session_init_ex() instead of libssh2_session_init(). - * libssh2's API is inconsistent here i.e. libssh2_userauth_publickey() - * allows you to pass the `abstract` as part of the call, whereas - * libssh2_userauth_keyboard_interactive() does not! - * - * The only way to set the `abstract` pointer is by calling - * libssh2_session_abstract(), which will replace the existing - * pointer as is done below. This is safe for now (at time of writing), - * but may not be valid in future. - */ - *abstract = c->payload; - - rc = libssh2_userauth_keyboard_interactive( - session, c->username, c->prompt_callback); - break; - } -#ifdef GIT_SSH_MEMORY_CREDENTIALS - case GIT_CREDTYPE_SSH_MEMORY: { - git_cred_ssh_key *c = (git_cred_ssh_key *)cred; - - assert(c->username); - assert(c->privatekey); - - rc = libssh2_userauth_publickey_frommemory( - session, - c->username, - strlen(c->username), - c->publickey, - c->publickey ? strlen(c->publickey) : 0, - c->privatekey, - strlen(c->privatekey), - c->passphrase); - break; - } -#endif - default: - rc = LIBSSH2_ERROR_AUTHENTICATION_FAILED; - } - } while (LIBSSH2_ERROR_EAGAIN == rc || LIBSSH2_ERROR_TIMEOUT == rc); - - if (rc == LIBSSH2_ERROR_PASSWORD_EXPIRED || rc == LIBSSH2_ERROR_AUTHENTICATION_FAILED) - return GIT_EAUTH; - - if (rc != LIBSSH2_ERROR_NONE) { - if (!giterr_last()) - ssh_error(session, "Failed to authenticate SSH session"); - return -1; - } - - return 0; -} - -static int request_creds(git_cred **out, ssh_subtransport *t, const char *user, int auth_methods) -{ - int error, no_callback = 0; - git_cred *cred = NULL; - - if (!t->owner->cred_acquire_cb) { - no_callback = 1; - } else { - error = t->owner->cred_acquire_cb(&cred, t->owner->url, user, auth_methods, - t->owner->cred_acquire_payload); - - if (error == GIT_PASSTHROUGH) - no_callback = 1; - else if (error < 0) - return error; - else if (!cred) { - giterr_set(GITERR_SSH, "Callback failed to initialize SSH credentials"); - return -1; - } - } - - if (no_callback) { - giterr_set(GITERR_SSH, "authentication required but no callback set"); - return -1; - } - - if (!(cred->credtype & auth_methods)) { - cred->free(cred); - giterr_set(GITERR_SSH, "callback returned unsupported credentials type"); - return -1; - } - - *out = cred; - - return 0; -} - -static int _git_ssh_session_create( - LIBSSH2_SESSION** session, - git_stream *io) -{ - int rc = 0; - LIBSSH2_SESSION* s; - git_socket_stream *socket = (git_socket_stream *) io; - - assert(session); - - s = libssh2_session_init(); - if (!s) { - giterr_set(GITERR_NET, "Failed to initialize SSH session"); - return -1; - } - - do { - rc = libssh2_session_startup(s, socket->s); - } while (LIBSSH2_ERROR_EAGAIN == rc || LIBSSH2_ERROR_TIMEOUT == rc); - - if (rc != LIBSSH2_ERROR_NONE) { - ssh_error(s, "Failed to start SSH session"); - libssh2_session_free(s); - return -1; - } - - libssh2_session_set_blocking(s, 1); - - *session = s; - - return 0; -} - -static int _git_ssh_setup_conn( - ssh_subtransport *t, - const char *url, - const char *cmd, - git_smart_subtransport_stream **stream) -{ - char *host=NULL, *port=NULL, *path=NULL, *user=NULL, *pass=NULL; - const char *default_port="22"; - int auth_methods, error = 0; - ssh_stream *s; - git_cred *cred = NULL; - LIBSSH2_SESSION* session=NULL; - LIBSSH2_CHANNEL* channel=NULL; - - t->current_stream = NULL; - - *stream = NULL; - if (ssh_stream_alloc(t, url, cmd, stream) < 0) - return -1; - - s = (ssh_stream *)*stream; - s->session = NULL; - s->channel = NULL; - - if (!git__prefixcmp(url, prefix_ssh)) { - if ((error = gitno_extract_url_parts(&host, &port, &path, &user, &pass, url, default_port)) < 0) - goto done; - } else { - if ((error = git_ssh_extract_url_parts(&host, &user, url)) < 0) - goto done; - port = git__strdup(default_port); - GITERR_CHECK_ALLOC(port); - } - - if ((error = git_socket_stream_new(&s->io, host, port)) < 0 || - (error = git_stream_connect(s->io)) < 0) - goto done; - - if ((error = _git_ssh_session_create(&session, s->io)) < 0) - goto done; - - if (t->owner->certificate_check_cb != NULL) { - git_cert_hostkey cert = { 0 }, *cert_ptr; - const char *key; - - cert.cert_type = GIT_CERT_HOSTKEY_LIBSSH2; - - key = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_SHA1); - if (key != NULL) { - cert.type |= GIT_CERT_SSH_SHA1; - memcpy(&cert.hash_sha1, key, 20); - } - - key = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_MD5); - if (key != NULL) { - cert.type |= GIT_CERT_SSH_MD5; - memcpy(&cert.hash_md5, key, 16); - } - - if (cert.type == 0) { - giterr_set(GITERR_SSH, "unable to get the host key"); - error = -1; - goto done; - } - - /* We don't currently trust any hostkeys */ - giterr_clear(); - - cert_ptr = &cert; - - error = t->owner->certificate_check_cb((git_cert *) cert_ptr, 0, host, t->owner->message_cb_payload); - if (error < 0) { - if (!giterr_last()) - giterr_set(GITERR_NET, "user cancelled hostkey check"); - - goto done; - } - } - - /* we need the username to ask for auth methods */ - if (!user) { - if ((error = request_creds(&cred, t, NULL, GIT_CREDTYPE_USERNAME)) < 0) - goto done; - - user = git__strdup(((git_cred_username *) cred)->username); - cred->free(cred); - cred = NULL; - if (!user) - goto done; - } else if (user && pass) { - if ((error = git_cred_userpass_plaintext_new(&cred, user, pass)) < 0) - goto done; - } - - if ((error = list_auth_methods(&auth_methods, session, user)) < 0) - goto done; - - error = GIT_EAUTH; - /* if we already have something to try */ - if (cred && auth_methods & cred->credtype) - error = _git_ssh_authenticate_session(session, cred); - - while (error == GIT_EAUTH) { - if (cred) { - cred->free(cred); - cred = NULL; - } - - if ((error = request_creds(&cred, t, user, auth_methods)) < 0) - goto done; - - if (strcmp(user, git_cred__username(cred))) { - giterr_set(GITERR_SSH, "username does not match previous request"); - error = -1; - goto done; - } - - error = _git_ssh_authenticate_session(session, cred); - } - - if (error < 0) - goto done; - - channel = libssh2_channel_open_session(session); - if (!channel) { - error = -1; - ssh_error(session, "Failed to open SSH channel"); - goto done; - } - - libssh2_channel_set_blocking(channel, 1); - - s->session = session; - s->channel = channel; - - t->current_stream = s; - -done: - if (error < 0) { - ssh_stream_free(*stream); - - if (session) - libssh2_session_free(session); - } - - if (cred) - cred->free(cred); - - git__free(host); - git__free(port); - git__free(path); - git__free(user); - git__free(pass); - - return error; -} - -static int ssh_uploadpack_ls( - ssh_subtransport *t, - const char *url, - git_smart_subtransport_stream **stream) -{ - const char *cmd = t->cmd_uploadpack ? t->cmd_uploadpack : cmd_uploadpack; - - return _git_ssh_setup_conn(t, url, cmd, stream); -} - -static int ssh_uploadpack( - ssh_subtransport *t, - const char *url, - git_smart_subtransport_stream **stream) -{ - GIT_UNUSED(url); - - if (t->current_stream) { - *stream = &t->current_stream->parent; - return 0; - } - - giterr_set(GITERR_NET, "Must call UPLOADPACK_LS before UPLOADPACK"); - return -1; -} - -static int ssh_receivepack_ls( - ssh_subtransport *t, - const char *url, - git_smart_subtransport_stream **stream) -{ - const char *cmd = t->cmd_receivepack ? t->cmd_receivepack : cmd_receivepack; - - - return _git_ssh_setup_conn(t, url, cmd, stream); -} - -static int ssh_receivepack( - ssh_subtransport *t, - const char *url, - git_smart_subtransport_stream **stream) -{ - GIT_UNUSED(url); - - if (t->current_stream) { - *stream = &t->current_stream->parent; - return 0; - } - - giterr_set(GITERR_NET, "Must call RECEIVEPACK_LS before RECEIVEPACK"); - return -1; -} - -static int _ssh_action( - git_smart_subtransport_stream **stream, - git_smart_subtransport *subtransport, - const char *url, - git_smart_service_t action) -{ - ssh_subtransport *t = (ssh_subtransport *) subtransport; - - switch (action) { - case GIT_SERVICE_UPLOADPACK_LS: - return ssh_uploadpack_ls(t, url, stream); - - case GIT_SERVICE_UPLOADPACK: - return ssh_uploadpack(t, url, stream); - - case GIT_SERVICE_RECEIVEPACK_LS: - return ssh_receivepack_ls(t, url, stream); - - case GIT_SERVICE_RECEIVEPACK: - return ssh_receivepack(t, url, stream); - } - - *stream = NULL; - return -1; -} - -static int _ssh_close(git_smart_subtransport *subtransport) -{ - ssh_subtransport *t = (ssh_subtransport *) subtransport; - - assert(!t->current_stream); - - GIT_UNUSED(t); - - return 0; -} - -static void _ssh_free(git_smart_subtransport *subtransport) -{ - ssh_subtransport *t = (ssh_subtransport *) subtransport; - - assert(!t->current_stream); - - git__free(t->cmd_uploadpack); - git__free(t->cmd_receivepack); - git__free(t); -} - -#define SSH_AUTH_PUBLICKEY "publickey" -#define SSH_AUTH_PASSWORD "password" -#define SSH_AUTH_KEYBOARD_INTERACTIVE "keyboard-interactive" - -static int list_auth_methods(int *out, LIBSSH2_SESSION *session, const char *username) -{ - const char *list, *ptr; - - *out = 0; - - list = libssh2_userauth_list(session, username, strlen(username)); - - /* either error, or the remote accepts NONE auth, which is bizarre, let's punt */ - if (list == NULL && !libssh2_userauth_authenticated(session)) - return -1; - - ptr = list; - while (ptr) { - if (*ptr == ',') - ptr++; - - if (!git__prefixcmp(ptr, SSH_AUTH_PUBLICKEY)) { - *out |= GIT_CREDTYPE_SSH_KEY; - *out |= GIT_CREDTYPE_SSH_CUSTOM; -#ifdef GIT_SSH_MEMORY_CREDENTIALS - *out |= GIT_CREDTYPE_SSH_MEMORY; -#endif - ptr += strlen(SSH_AUTH_PUBLICKEY); - continue; - } - - if (!git__prefixcmp(ptr, SSH_AUTH_PASSWORD)) { - *out |= GIT_CREDTYPE_USERPASS_PLAINTEXT; - ptr += strlen(SSH_AUTH_PASSWORD); - continue; - } - - if (!git__prefixcmp(ptr, SSH_AUTH_KEYBOARD_INTERACTIVE)) { - *out |= GIT_CREDTYPE_SSH_INTERACTIVE; - ptr += strlen(SSH_AUTH_KEYBOARD_INTERACTIVE); - continue; - } - - /* Skipt it if we don't know it */ - ptr = strchr(ptr, ','); - } - - return 0; -} -#endif - -int git_smart_subtransport_ssh( - git_smart_subtransport **out, git_transport *owner, void *param) -{ -#ifdef GIT_SSH - ssh_subtransport *t; - - assert(out); - - GIT_UNUSED(param); - - t = git__calloc(sizeof(ssh_subtransport), 1); - GITERR_CHECK_ALLOC(t); - - t->owner = (transport_smart *)owner; - t->parent.action = _ssh_action; - t->parent.close = _ssh_close; - t->parent.free = _ssh_free; - - *out = (git_smart_subtransport *) t; - return 0; -#else - GIT_UNUSED(owner); - GIT_UNUSED(param); - - assert(out); - *out = NULL; - - giterr_set(GITERR_INVALID, "Cannot create SSH transport. Library was built without SSH support"); - return -1; -#endif -} - -int git_transport_ssh_with_paths(git_transport **out, git_remote *owner, void *payload) -{ -#ifdef GIT_SSH - git_strarray *paths = (git_strarray *) payload; - git_transport *transport; - transport_smart *smart; - ssh_subtransport *t; - int error; - git_smart_subtransport_definition ssh_definition = { - git_smart_subtransport_ssh, - 0, /* no RPC */ - NULL, - }; - - if (paths->count != 2) { - giterr_set(GITERR_SSH, "invalid ssh paths, must be two strings"); - return GIT_EINVALIDSPEC; - } - - if ((error = git_transport_smart(&transport, owner, &ssh_definition)) < 0) - return error; - - smart = (transport_smart *) transport; - t = (ssh_subtransport *) smart->wrapped; - - t->cmd_uploadpack = git__strdup(paths->strings[0]); - GITERR_CHECK_ALLOC(t->cmd_uploadpack); - t->cmd_receivepack = git__strdup(paths->strings[1]); - GITERR_CHECK_ALLOC(t->cmd_receivepack); - - *out = transport; - return 0; -#else - GIT_UNUSED(owner); - GIT_UNUSED(payload); - - assert(out); - *out = NULL; - - giterr_set(GITERR_INVALID, "Cannot create SSH transport. Library was built without SSH support"); - return -1; -#endif -} diff --git a/vendor/libgit2/src/transports/winhttp.c b/vendor/libgit2/src/transports/winhttp.c deleted file mode 100644 index da047d690c..0000000000 --- a/vendor/libgit2/src/transports/winhttp.c +++ /dev/null @@ -1,1350 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#ifdef GIT_WINHTTP - -#include "git2.h" -#include "git2/transport.h" -#include "buffer.h" -#include "posix.h" -#include "netops.h" -#include "smart.h" -#include "remote.h" -#include "repository.h" - -#include -#include - -/* For IInternetSecurityManager zone check */ -#include -#include - -#define WIDEN2(s) L ## s -#define WIDEN(s) WIDEN2(s) - -#define MAX_CONTENT_TYPE_LEN 100 -#define WINHTTP_OPTION_PEERDIST_EXTENSION_STATE 109 -#define CACHED_POST_BODY_BUF_SIZE 4096 -#define UUID_LENGTH_CCH 32 -#define TIMEOUT_INFINITE -1 -#define DEFAULT_CONNECT_TIMEOUT 60000 -#ifndef WINHTTP_IGNORE_REQUEST_TOTAL_LENGTH -#define WINHTTP_IGNORE_REQUEST_TOTAL_LENGTH 0 -#endif - -static const char *prefix_https = "https://"; -static const char *upload_pack_service = "upload-pack"; -static const char *upload_pack_ls_service_url = "/info/refs?service=git-upload-pack"; -static const char *upload_pack_service_url = "/git-upload-pack"; -static const char *receive_pack_service = "receive-pack"; -static const char *receive_pack_ls_service_url = "/info/refs?service=git-receive-pack"; -static const char *receive_pack_service_url = "/git-receive-pack"; -static const wchar_t *get_verb = L"GET"; -static const wchar_t *post_verb = L"POST"; -static const wchar_t *pragma_nocache = L"Pragma: no-cache"; -static const wchar_t *transfer_encoding = L"Transfer-Encoding: chunked"; -static const int no_check_cert_flags = SECURITY_FLAG_IGNORE_CERT_CN_INVALID | - SECURITY_FLAG_IGNORE_CERT_DATE_INVALID | - SECURITY_FLAG_IGNORE_UNKNOWN_CA; - -#if defined(__MINGW32__) -const CLSID CLSID_InternetSecurityManager = { 0x7B8A2D94, 0x0AC9, 0x11D1, - { 0x89, 0x6C, 0x00, 0xC0, 0x4F, 0xB6, 0xBF, 0xC4 } }; -const IID IID_IInternetSecurityManager = { 0x79EAC9EE, 0xBAF9, 0x11CE, - { 0x8C, 0x82, 0x00, 0xAA, 0x00, 0x4B, 0xA9, 0x0B } }; -#endif - -#define OWNING_SUBTRANSPORT(s) ((winhttp_subtransport *)(s)->parent.subtransport) - -typedef enum { - GIT_WINHTTP_AUTH_BASIC = 1, - GIT_WINHTTP_AUTH_NEGOTIATE = 2, -} winhttp_authmechanism_t; - -typedef struct { - git_smart_subtransport_stream parent; - const char *service; - const char *service_url; - const wchar_t *verb; - HINTERNET request; - wchar_t *request_uri; - char *chunk_buffer; - unsigned chunk_buffer_len; - HANDLE post_body; - DWORD post_body_len; - unsigned sent_request : 1, - received_response : 1, - chunked : 1; -} winhttp_stream; - -typedef struct { - git_smart_subtransport parent; - transport_smart *owner; - gitno_connection_data connection_data; - git_cred *cred; - git_cred *url_cred; - int auth_mechanism; - HINTERNET session; - HINTERNET connection; -} winhttp_subtransport; - -static int apply_basic_credential(HINTERNET request, git_cred *cred) -{ - git_cred_userpass_plaintext *c = (git_cred_userpass_plaintext *)cred; - git_buf buf = GIT_BUF_INIT, raw = GIT_BUF_INIT; - wchar_t *wide = NULL; - int error = -1, wide_len; - - git_buf_printf(&raw, "%s:%s", c->username, c->password); - - if (git_buf_oom(&raw) || - git_buf_puts(&buf, "Authorization: Basic ") < 0 || - git_buf_encode_base64(&buf, git_buf_cstr(&raw), raw.size) < 0) - goto on_error; - - if ((wide_len = git__utf8_to_16_alloc(&wide, git_buf_cstr(&buf))) < 0) { - giterr_set(GITERR_OS, "Failed to convert string to wide form"); - goto on_error; - } - - if (!WinHttpAddRequestHeaders(request, wide, (ULONG) -1L, WINHTTP_ADDREQ_FLAG_ADD)) { - giterr_set(GITERR_OS, "Failed to add a header to the request"); - goto on_error; - } - - error = 0; - -on_error: - /* We were dealing with plaintext passwords, so clean up after ourselves a bit. */ - if (wide) - memset(wide, 0x0, wide_len * sizeof(wchar_t)); - - if (buf.size) - memset(buf.ptr, 0x0, buf.size); - - if (raw.size) - memset(raw.ptr, 0x0, raw.size); - - git__free(wide); - git_buf_free(&buf); - git_buf_free(&raw); - return error; -} - -static int apply_default_credentials(HINTERNET request) -{ - /* Either the caller explicitly requested that default credentials be passed, - * or our fallback credential callback was invoked and checked that the target - * URI was in the appropriate Internet Explorer security zone. By setting this - * flag, we guarantee that the credentials are delivered by WinHTTP. The default - * is "medium" which applies to the intranet and sounds like it would correspond - * to Internet Explorer security zones, but in fact does not. */ - DWORD data = WINHTTP_AUTOLOGON_SECURITY_LEVEL_LOW; - - if (!WinHttpSetOption(request, WINHTTP_OPTION_AUTOLOGON_POLICY, &data, sizeof(DWORD))) - return -1; - - return 0; -} - -static int fallback_cred_acquire_cb( - git_cred **cred, - const char *url, - const char *username_from_url, - unsigned int allowed_types, - void *payload) -{ - int error = 1; - - GIT_UNUSED(username_from_url); - GIT_UNUSED(payload); - - /* If the target URI supports integrated Windows authentication - * as an authentication mechanism */ - if (GIT_CREDTYPE_DEFAULT & allowed_types) { - wchar_t *wide_url; - - /* Convert URL to wide characters */ - if (git__utf8_to_16_alloc(&wide_url, url) < 0) { - giterr_set(GITERR_OS, "Failed to convert string to wide form"); - return -1; - } - - if (SUCCEEDED(CoInitializeEx(NULL, COINIT_MULTITHREADED))) { - IInternetSecurityManager* pISM; - - /* And if the target URI is in the My Computer, Intranet, or Trusted zones */ - if (SUCCEEDED(CoCreateInstance(&CLSID_InternetSecurityManager, NULL, - CLSCTX_ALL, &IID_IInternetSecurityManager, (void **)&pISM))) { - DWORD dwZone; - - if (SUCCEEDED(pISM->lpVtbl->MapUrlToZone(pISM, wide_url, &dwZone, 0)) && - (URLZONE_LOCAL_MACHINE == dwZone || - URLZONE_INTRANET == dwZone || - URLZONE_TRUSTED == dwZone)) { - git_cred *existing = *cred; - - if (existing) - existing->free(existing); - - /* Then use default Windows credentials to authenticate this request */ - error = git_cred_default_new(cred); - } - - pISM->lpVtbl->Release(pISM); - } - - CoUninitialize(); - } - - git__free(wide_url); - } - - return error; -} - -static int certificate_check(winhttp_stream *s, int valid) -{ - int error; - winhttp_subtransport *t = OWNING_SUBTRANSPORT(s); - PCERT_CONTEXT cert_ctx; - DWORD cert_ctx_size = sizeof(cert_ctx); - git_cert_x509 cert; - - /* If there is no override, we should fail if WinHTTP doesn't think it's fine */ - if (t->owner->certificate_check_cb == NULL && !valid) - return GIT_ECERTIFICATE; - - if (t->owner->certificate_check_cb == NULL || !t->connection_data.use_ssl) - return 0; - - if (!WinHttpQueryOption(s->request, WINHTTP_OPTION_SERVER_CERT_CONTEXT, &cert_ctx, &cert_ctx_size)) { - giterr_set(GITERR_OS, "failed to get server certificate"); - return -1; - } - - giterr_clear(); - cert.cert_type = GIT_CERT_X509; - cert.data = cert_ctx->pbCertEncoded; - cert.len = cert_ctx->cbCertEncoded; - error = t->owner->certificate_check_cb((git_cert *) &cert, valid, t->connection_data.host, t->owner->cred_acquire_payload); - CertFreeCertificateContext(cert_ctx); - - if (error < 0 && !giterr_last()) - giterr_set(GITERR_NET, "user cancelled certificate check"); - - return error; -} - -static void winhttp_stream_close(winhttp_stream *s) -{ - if (s->chunk_buffer) { - git__free(s->chunk_buffer); - s->chunk_buffer = NULL; - } - - if (s->post_body) { - CloseHandle(s->post_body); - s->post_body = NULL; - } - - if (s->request_uri) { - git__free(s->request_uri); - s->request_uri = NULL; - } - - if (s->request) { - WinHttpCloseHandle(s->request); - s->request = NULL; - } - - s->sent_request = 0; -} - -static int winhttp_stream_connect(winhttp_stream *s) -{ - winhttp_subtransport *t = OWNING_SUBTRANSPORT(s); - git_buf buf = GIT_BUF_INIT; - char *proxy_url = NULL; - wchar_t ct[MAX_CONTENT_TYPE_LEN]; - LPCWSTR types[] = { L"*/*", NULL }; - BOOL peerdist = FALSE; - int error = -1; - unsigned long disable_redirects = WINHTTP_DISABLE_REDIRECTS; - int default_timeout = TIMEOUT_INFINITE; - int default_connect_timeout = DEFAULT_CONNECT_TIMEOUT; - - /* Prepare URL */ - git_buf_printf(&buf, "%s%s", t->connection_data.path, s->service_url); - - if (git_buf_oom(&buf)) - return -1; - - /* Convert URL to wide characters */ - if (git__utf8_to_16_alloc(&s->request_uri, git_buf_cstr(&buf)) < 0) { - giterr_set(GITERR_OS, "Failed to convert string to wide form"); - goto on_error; - } - - /* Establish request */ - s->request = WinHttpOpenRequest( - t->connection, - s->verb, - s->request_uri, - NULL, - WINHTTP_NO_REFERER, - types, - t->connection_data.use_ssl ? WINHTTP_FLAG_SECURE : 0); - - if (!s->request) { - giterr_set(GITERR_OS, "Failed to open request"); - goto on_error; - } - - if (!WinHttpSetTimeouts(s->request, default_timeout, default_connect_timeout, default_timeout, default_timeout)) { - giterr_set(GITERR_OS, "Failed to set timeouts for WinHTTP"); - goto on_error; - } - - /* Set proxy if necessary */ - if (git_remote__get_http_proxy(t->owner->owner, !!t->connection_data.use_ssl, &proxy_url) < 0) - goto on_error; - - if (proxy_url) { - WINHTTP_PROXY_INFO proxy_info; - wchar_t *proxy_wide; - - /* Convert URL to wide characters */ - int proxy_wide_len = git__utf8_to_16_alloc(&proxy_wide, proxy_url); - - if (proxy_wide_len < 0) { - giterr_set(GITERR_OS, "Failed to convert string to wide form"); - goto on_error; - } - - /* Strip any trailing forward slash on the proxy URL; - * WinHTTP doesn't like it if one is present */ - if (proxy_wide_len > 1 && L'/' == proxy_wide[proxy_wide_len - 2]) - proxy_wide[proxy_wide_len - 2] = L'\0'; - - proxy_info.dwAccessType = WINHTTP_ACCESS_TYPE_NAMED_PROXY; - proxy_info.lpszProxy = proxy_wide; - proxy_info.lpszProxyBypass = NULL; - - if (!WinHttpSetOption(s->request, - WINHTTP_OPTION_PROXY, - &proxy_info, - sizeof(WINHTTP_PROXY_INFO))) { - giterr_set(GITERR_OS, "Failed to set proxy"); - git__free(proxy_wide); - goto on_error; - } - - git__free(proxy_wide); - } - - /* Disable WinHTTP redirects so we can handle them manually. Why, you ask? - * http://social.msdn.microsoft.com/Forums/windowsdesktop/en-US/b2ff8879-ab9f-4218-8f09-16d25dff87ae - */ - if (!WinHttpSetOption(s->request, - WINHTTP_OPTION_DISABLE_FEATURE, - &disable_redirects, - sizeof(disable_redirects))) { - giterr_set(GITERR_OS, "Failed to disable redirects"); - goto on_error; - } - - /* Strip unwanted headers (X-P2P-PeerDist, X-P2P-PeerDistEx) that WinHTTP - * adds itself. This option may not be supported by the underlying - * platform, so we do not error-check it */ - WinHttpSetOption(s->request, - WINHTTP_OPTION_PEERDIST_EXTENSION_STATE, - &peerdist, - sizeof(peerdist)); - - /* Send Pragma: no-cache header */ - if (!WinHttpAddRequestHeaders(s->request, pragma_nocache, (ULONG) -1L, WINHTTP_ADDREQ_FLAG_ADD)) { - giterr_set(GITERR_OS, "Failed to add a header to the request"); - goto on_error; - } - - if (post_verb == s->verb) { - /* Send Content-Type and Accept headers -- only necessary on a POST */ - git_buf_clear(&buf); - if (git_buf_printf(&buf, - "Content-Type: application/x-git-%s-request", - s->service) < 0) - goto on_error; - - if (git__utf8_to_16(ct, MAX_CONTENT_TYPE_LEN, git_buf_cstr(&buf)) < 0) { - giterr_set(GITERR_OS, "Failed to convert content-type to wide characters"); - goto on_error; - } - - if (!WinHttpAddRequestHeaders(s->request, ct, (ULONG)-1L, - WINHTTP_ADDREQ_FLAG_ADD | WINHTTP_ADDREQ_FLAG_REPLACE)) { - giterr_set(GITERR_OS, "Failed to add a header to the request"); - goto on_error; - } - - git_buf_clear(&buf); - if (git_buf_printf(&buf, - "Accept: application/x-git-%s-result", - s->service) < 0) - goto on_error; - - if (git__utf8_to_16(ct, MAX_CONTENT_TYPE_LEN, git_buf_cstr(&buf)) < 0) { - giterr_set(GITERR_OS, "Failed to convert accept header to wide characters"); - goto on_error; - } - - if (!WinHttpAddRequestHeaders(s->request, ct, (ULONG)-1L, - WINHTTP_ADDREQ_FLAG_ADD | WINHTTP_ADDREQ_FLAG_REPLACE)) { - giterr_set(GITERR_OS, "Failed to add a header to the request"); - goto on_error; - } - } - - /* If requested, disable certificate validation */ - if (t->connection_data.use_ssl) { - int flags; - - if (t->owner->parent.read_flags(&t->owner->parent, &flags) < 0) - goto on_error; - } - - /* If we have a credential on the subtransport, apply it to the request */ - if (t->cred && - t->cred->credtype == GIT_CREDTYPE_USERPASS_PLAINTEXT && - t->auth_mechanism == GIT_WINHTTP_AUTH_BASIC && - apply_basic_credential(s->request, t->cred) < 0) - goto on_error; - else if (t->cred && - t->cred->credtype == GIT_CREDTYPE_DEFAULT && - t->auth_mechanism == GIT_WINHTTP_AUTH_NEGOTIATE && - apply_default_credentials(s->request) < 0) - goto on_error; - - /* If no other credentials have been applied and the URL has username and - * password, use those */ - if (!t->cred && t->connection_data.user && t->connection_data.pass) { - if (!t->url_cred && - git_cred_userpass_plaintext_new(&t->url_cred, t->connection_data.user, t->connection_data.pass) < 0) - goto on_error; - if (apply_basic_credential(s->request, t->url_cred) < 0) - goto on_error; - } - - /* We've done everything up to calling WinHttpSendRequest. */ - - error = 0; - -on_error: - if (error < 0) - winhttp_stream_close(s); - - git__free(proxy_url); - git_buf_free(&buf); - return error; -} - -static int parse_unauthorized_response( - HINTERNET request, - int *allowed_types, - int *auth_mechanism) -{ - DWORD supported, first, target; - - *allowed_types = 0; - *auth_mechanism = 0; - - /* WinHttpQueryHeaders() must be called before WinHttpQueryAuthSchemes(). - * We can assume this was already done, since we know we are unauthorized. - */ - if (!WinHttpQueryAuthSchemes(request, &supported, &first, &target)) { - giterr_set(GITERR_OS, "Failed to parse supported auth schemes"); - return -1; - } - - if (WINHTTP_AUTH_SCHEME_BASIC & supported) { - *allowed_types |= GIT_CREDTYPE_USERPASS_PLAINTEXT; - *auth_mechanism = GIT_WINHTTP_AUTH_BASIC; - } - - if ((WINHTTP_AUTH_SCHEME_NTLM & supported) || - (WINHTTP_AUTH_SCHEME_NEGOTIATE & supported)) { - *allowed_types |= GIT_CREDTYPE_DEFAULT; - *auth_mechanism = GIT_WINHTTP_AUTH_NEGOTIATE; - } - - return 0; -} - -static int write_chunk(HINTERNET request, const char *buffer, size_t len) -{ - DWORD bytes_written; - git_buf buf = GIT_BUF_INIT; - - /* Chunk header */ - git_buf_printf(&buf, "%X\r\n", len); - - if (git_buf_oom(&buf)) - return -1; - - if (!WinHttpWriteData(request, - git_buf_cstr(&buf), (DWORD)git_buf_len(&buf), - &bytes_written)) { - git_buf_free(&buf); - giterr_set(GITERR_OS, "Failed to write chunk header"); - return -1; - } - - git_buf_free(&buf); - - /* Chunk body */ - if (!WinHttpWriteData(request, - buffer, (DWORD)len, - &bytes_written)) { - giterr_set(GITERR_OS, "Failed to write chunk"); - return -1; - } - - /* Chunk footer */ - if (!WinHttpWriteData(request, - "\r\n", 2, - &bytes_written)) { - giterr_set(GITERR_OS, "Failed to write chunk footer"); - return -1; - } - - return 0; -} - -static int winhttp_close_connection(winhttp_subtransport *t) -{ - int ret = 0; - - if (t->connection) { - if (!WinHttpCloseHandle(t->connection)) { - giterr_set(GITERR_OS, "Unable to close connection"); - ret = -1; - } - - t->connection = NULL; - } - - if (t->session) { - if (!WinHttpCloseHandle(t->session)) { - giterr_set(GITERR_OS, "Unable to close session"); - ret = -1; - } - - t->session = NULL; - } - - return ret; -} - -static int winhttp_connect( - winhttp_subtransport *t) -{ - wchar_t *ua = L"git/1.0 (libgit2 " WIDEN(LIBGIT2_VERSION) L")"; - wchar_t *wide_host; - int32_t port; - int error = -1; - int default_timeout = TIMEOUT_INFINITE; - int default_connect_timeout = DEFAULT_CONNECT_TIMEOUT; - - t->session = NULL; - t->connection = NULL; - - /* Prepare port */ - if (git__strtol32(&port, t->connection_data.port, NULL, 10) < 0) - return -1; - - /* Prepare host */ - if (git__utf8_to_16_alloc(&wide_host, t->connection_data.host) < 0) { - giterr_set(GITERR_OS, "Unable to convert host to wide characters"); - return -1; - } - - /* Establish session */ - t->session = WinHttpOpen( - ua, - WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, - WINHTTP_NO_PROXY_NAME, - WINHTTP_NO_PROXY_BYPASS, - 0); - - if (!t->session) { - giterr_set(GITERR_OS, "Failed to init WinHTTP"); - goto on_error; - } - - if (!WinHttpSetTimeouts(t->session, default_timeout, default_connect_timeout, default_timeout, default_timeout)) { - giterr_set(GITERR_OS, "Failed to set timeouts for WinHTTP"); - goto on_error; - } - - - /* Establish connection */ - t->connection = WinHttpConnect( - t->session, - wide_host, - (INTERNET_PORT) port, - 0); - - if (!t->connection) { - giterr_set(GITERR_OS, "Failed to connect to host"); - goto on_error; - } - - error = 0; - -on_error: - if (error < 0) - winhttp_close_connection(t); - - git__free(wide_host); - - return error; -} - -static int do_send_request(winhttp_stream *s, size_t len, int ignore_length) -{ - if (ignore_length) { - if (!WinHttpSendRequest(s->request, - WINHTTP_NO_ADDITIONAL_HEADERS, 0, - WINHTTP_NO_REQUEST_DATA, 0, - WINHTTP_IGNORE_REQUEST_TOTAL_LENGTH, 0)) { - return -1; - } - } else { - if (!WinHttpSendRequest(s->request, - WINHTTP_NO_ADDITIONAL_HEADERS, 0, - WINHTTP_NO_REQUEST_DATA, 0, - len, 0)) { - return -1; - } - } - - return 0; -} - -static int send_request(winhttp_stream *s, size_t len, int ignore_length) -{ - int request_failed = 0, cert_valid = 1, error = 0; - DWORD ignore_flags; - - if ((error = do_send_request(s, len, ignore_length)) < 0) - request_failed = 1; - - if (request_failed) { - if (GetLastError() != ERROR_WINHTTP_SECURE_FAILURE) { - giterr_set(GITERR_OS, "failed to send request"); - return -1; - } else { - cert_valid = 0; - } - } - - giterr_clear(); - if ((error = certificate_check(s, cert_valid)) < 0) { - if (!giterr_last()) - giterr_set(GITERR_OS, "user cancelled certificate check"); - - return error; - } - - /* if neither the request nor the certificate check returned errors, we're done */ - if (!request_failed) - return 0; - - ignore_flags = no_check_cert_flags; - - if (!WinHttpSetOption(s->request, WINHTTP_OPTION_SECURITY_FLAGS, &ignore_flags, sizeof(ignore_flags))) { - giterr_set(GITERR_OS, "failed to set security options"); - return -1; - } - - if ((error = do_send_request(s, len, ignore_length)) < 0) - giterr_set(GITERR_OS, "failed to send request"); - - return error; -} - -static int winhttp_stream_read( - git_smart_subtransport_stream *stream, - char *buffer, - size_t buf_size, - size_t *bytes_read) -{ - winhttp_stream *s = (winhttp_stream *)stream; - winhttp_subtransport *t = OWNING_SUBTRANSPORT(s); - DWORD dw_bytes_read; - char replay_count = 0; - int error; - -replay: - /* Enforce a reasonable cap on the number of replays */ - if (++replay_count >= 7) { - giterr_set(GITERR_NET, "Too many redirects or authentication replays"); - return -1; - } - - /* Connect if necessary */ - if (!s->request && winhttp_stream_connect(s) < 0) - return -1; - - if (!s->received_response) { - DWORD status_code, status_code_length, content_type_length, bytes_written; - char expected_content_type_8[MAX_CONTENT_TYPE_LEN]; - wchar_t expected_content_type[MAX_CONTENT_TYPE_LEN], content_type[MAX_CONTENT_TYPE_LEN]; - - if (!s->sent_request) { - - if ((error = send_request(s, s->post_body_len, 0)) < 0) - return error; - - s->sent_request = 1; - } - - if (s->chunked) { - assert(s->verb == post_verb); - - /* Flush, if necessary */ - if (s->chunk_buffer_len > 0 && - write_chunk(s->request, s->chunk_buffer, s->chunk_buffer_len) < 0) - return -1; - - s->chunk_buffer_len = 0; - - /* Write the final chunk. */ - if (!WinHttpWriteData(s->request, - "0\r\n\r\n", 5, - &bytes_written)) { - giterr_set(GITERR_OS, "Failed to write final chunk"); - return -1; - } - } - else if (s->post_body) { - char *buffer; - DWORD len = s->post_body_len, bytes_read; - - if (INVALID_SET_FILE_POINTER == SetFilePointer(s->post_body, - 0, 0, FILE_BEGIN) && - NO_ERROR != GetLastError()) { - giterr_set(GITERR_OS, "Failed to reset file pointer"); - return -1; - } - - buffer = git__malloc(CACHED_POST_BODY_BUF_SIZE); - - while (len > 0) { - DWORD bytes_written; - - if (!ReadFile(s->post_body, buffer, - min(CACHED_POST_BODY_BUF_SIZE, len), - &bytes_read, NULL) || - !bytes_read) { - git__free(buffer); - giterr_set(GITERR_OS, "Failed to read from temp file"); - return -1; - } - - if (!WinHttpWriteData(s->request, buffer, - bytes_read, &bytes_written)) { - git__free(buffer); - giterr_set(GITERR_OS, "Failed to write data"); - return -1; - } - - len -= bytes_read; - assert(bytes_read == bytes_written); - } - - git__free(buffer); - - /* Eagerly close the temp file */ - CloseHandle(s->post_body); - s->post_body = NULL; - } - - if (!WinHttpReceiveResponse(s->request, 0)) { - giterr_set(GITERR_OS, "Failed to receive response"); - return -1; - } - - /* Verify that we got a 200 back */ - status_code_length = sizeof(status_code); - - if (!WinHttpQueryHeaders(s->request, - WINHTTP_QUERY_STATUS_CODE | WINHTTP_QUERY_FLAG_NUMBER, - WINHTTP_HEADER_NAME_BY_INDEX, - &status_code, &status_code_length, - WINHTTP_NO_HEADER_INDEX)) { - giterr_set(GITERR_OS, "Failed to retrieve status code"); - return -1; - } - - /* The implementation of WinHTTP prior to Windows 7 will not - * redirect to an identical URI. Some Git hosters use self-redirects - * as part of their DoS mitigation strategy. Check first to see if we - * have a redirect status code, and that we haven't already streamed - * a post body. (We can't replay a streamed POST.) */ - if (!s->chunked && - (HTTP_STATUS_MOVED == status_code || - HTTP_STATUS_REDIRECT == status_code || - (HTTP_STATUS_REDIRECT_METHOD == status_code && - get_verb == s->verb) || - HTTP_STATUS_REDIRECT_KEEP_VERB == status_code)) { - - /* Check for Windows 7. This workaround is only necessary on - * Windows Vista and earlier. Windows 7 is version 6.1. */ - wchar_t *location; - DWORD location_length; - char *location8; - - /* OK, fetch the Location header from the redirect. */ - if (WinHttpQueryHeaders(s->request, - WINHTTP_QUERY_LOCATION, - WINHTTP_HEADER_NAME_BY_INDEX, - WINHTTP_NO_OUTPUT_BUFFER, - &location_length, - WINHTTP_NO_HEADER_INDEX) || - GetLastError() != ERROR_INSUFFICIENT_BUFFER) { - giterr_set(GITERR_OS, "Failed to read Location header"); - return -1; - } - - location = git__malloc(location_length); - GITERR_CHECK_ALLOC(location); - - if (!WinHttpQueryHeaders(s->request, - WINHTTP_QUERY_LOCATION, - WINHTTP_HEADER_NAME_BY_INDEX, - location, - &location_length, - WINHTTP_NO_HEADER_INDEX)) { - giterr_set(GITERR_OS, "Failed to read Location header"); - git__free(location); - return -1; - } - - /* Convert the Location header to UTF-8 */ - if (git__utf16_to_8_alloc(&location8, location) < 0) { - giterr_set(GITERR_OS, "Failed to convert Location header to UTF-8"); - git__free(location); - return -1; - } - - git__free(location); - - /* Replay the request */ - winhttp_stream_close(s); - - if (!git__prefixcmp_icase(location8, prefix_https)) { - /* Upgrade to secure connection; disconnect and start over */ - if (gitno_connection_data_from_url(&t->connection_data, location8, s->service_url) < 0) { - git__free(location8); - return -1; - } - - winhttp_close_connection(t); - - if (winhttp_connect(t) < 0) - return -1; - } - - git__free(location8); - goto replay; - } - - /* Handle authentication failures */ - if (HTTP_STATUS_DENIED == status_code && get_verb == s->verb) { - int allowed_types; - - if (parse_unauthorized_response(s->request, &allowed_types, &t->auth_mechanism) < 0) - return -1; - - if (allowed_types && - (!t->cred || 0 == (t->cred->credtype & allowed_types))) { - int cred_error = 1; - - /* Start with the user-supplied credential callback, if present */ - if (t->owner->cred_acquire_cb) { - cred_error = t->owner->cred_acquire_cb(&t->cred, t->owner->url, - t->connection_data.user, allowed_types, t->owner->cred_acquire_payload); - - if (cred_error < 0) - return cred_error; - } - - /* Invoke the fallback credentials acquisition callback if necessary */ - if (cred_error > 0) { - cred_error = fallback_cred_acquire_cb(&t->cred, t->owner->url, - t->connection_data.user, allowed_types, NULL); - - if (cred_error < 0) - return cred_error; - } - - if (!cred_error) { - assert(t->cred); - - winhttp_stream_close(s); - - /* Successfully acquired a credential */ - goto replay; - } - } - } - - if (HTTP_STATUS_OK != status_code) { - giterr_set(GITERR_NET, "Request failed with status code: %d", status_code); - return -1; - } - - /* Verify that we got the correct content-type back */ - if (post_verb == s->verb) - p_snprintf(expected_content_type_8, MAX_CONTENT_TYPE_LEN, "application/x-git-%s-result", s->service); - else - p_snprintf(expected_content_type_8, MAX_CONTENT_TYPE_LEN, "application/x-git-%s-advertisement", s->service); - - if (git__utf8_to_16(expected_content_type, MAX_CONTENT_TYPE_LEN, expected_content_type_8) < 0) { - giterr_set(GITERR_OS, "Failed to convert expected content-type to wide characters"); - return -1; - } - - content_type_length = sizeof(content_type); - - if (!WinHttpQueryHeaders(s->request, - WINHTTP_QUERY_CONTENT_TYPE, - WINHTTP_HEADER_NAME_BY_INDEX, - &content_type, &content_type_length, - WINHTTP_NO_HEADER_INDEX)) { - giterr_set(GITERR_OS, "Failed to retrieve response content-type"); - return -1; - } - - if (wcscmp(expected_content_type, content_type)) { - giterr_set(GITERR_NET, "Received unexpected content-type"); - return -1; - } - - s->received_response = 1; - } - - if (!WinHttpReadData(s->request, - (LPVOID)buffer, - (DWORD)buf_size, - &dw_bytes_read)) - { - giterr_set(GITERR_OS, "Failed to read data"); - return -1; - } - - *bytes_read = dw_bytes_read; - - return 0; -} - -static int winhttp_stream_write_single( - git_smart_subtransport_stream *stream, - const char *buffer, - size_t len) -{ - winhttp_stream *s = (winhttp_stream *)stream; - DWORD bytes_written; - int error; - - if (!s->request && winhttp_stream_connect(s) < 0) - return -1; - - /* This implementation of write permits only a single call. */ - if (s->sent_request) { - giterr_set(GITERR_NET, "Subtransport configured for only one write"); - return -1; - } - - if ((error = send_request(s, len, 0)) < 0) - return error; - - s->sent_request = 1; - - if (!WinHttpWriteData(s->request, - (LPCVOID)buffer, - (DWORD)len, - &bytes_written)) { - giterr_set(GITERR_OS, "Failed to write data"); - return -1; - } - - assert((DWORD)len == bytes_written); - - return 0; -} - -static int put_uuid_string(LPWSTR buffer, size_t buffer_len_cch) -{ - UUID uuid; - RPC_STATUS status = UuidCreate(&uuid); - int result; - - if (RPC_S_OK != status && - RPC_S_UUID_LOCAL_ONLY != status && - RPC_S_UUID_NO_ADDRESS != status) { - giterr_set(GITERR_NET, "Unable to generate name for temp file"); - return -1; - } - - if (buffer_len_cch < UUID_LENGTH_CCH + 1) { - giterr_set(GITERR_NET, "Buffer too small for name of temp file"); - return -1; - } - -#if !defined(__MINGW32__) || defined(MINGW_HAS_SECURE_API) - result = swprintf_s(buffer, buffer_len_cch, -#else - result = wsprintfW(buffer, -#endif - L"%08x%04x%04x%02x%02x%02x%02x%02x%02x%02x%02x", - uuid.Data1, uuid.Data2, uuid.Data3, - uuid.Data4[0], uuid.Data4[1], uuid.Data4[2], uuid.Data4[3], - uuid.Data4[4], uuid.Data4[5], uuid.Data4[6], uuid.Data4[7]); - - if (result < UUID_LENGTH_CCH) { - giterr_set(GITERR_OS, "Unable to generate name for temp file"); - return -1; - } - - return 0; -} - -static int get_temp_file(LPWSTR buffer, DWORD buffer_len_cch) -{ - size_t len; - - if (!GetTempPathW(buffer_len_cch, buffer)) { - giterr_set(GITERR_OS, "Failed to get temp path"); - return -1; - } - - len = wcslen(buffer); - - if (buffer[len - 1] != '\\' && len < buffer_len_cch) - buffer[len++] = '\\'; - - if (put_uuid_string(&buffer[len], (size_t)buffer_len_cch - len) < 0) - return -1; - - return 0; -} - -static int winhttp_stream_write_buffered( - git_smart_subtransport_stream *stream, - const char *buffer, - size_t len) -{ - winhttp_stream *s = (winhttp_stream *)stream; - DWORD bytes_written; - - if (!s->request && winhttp_stream_connect(s) < 0) - return -1; - - /* Buffer the payload, using a temporary file so we delegate - * memory management of the data to the operating system. */ - if (!s->post_body) { - wchar_t temp_path[MAX_PATH + 1]; - - if (get_temp_file(temp_path, MAX_PATH + 1) < 0) - return -1; - - s->post_body = CreateFileW(temp_path, - GENERIC_READ | GENERIC_WRITE, - FILE_SHARE_DELETE, NULL, - CREATE_NEW, - FILE_ATTRIBUTE_TEMPORARY | FILE_FLAG_DELETE_ON_CLOSE | FILE_FLAG_SEQUENTIAL_SCAN, - NULL); - - if (INVALID_HANDLE_VALUE == s->post_body) { - s->post_body = NULL; - giterr_set(GITERR_OS, "Failed to create temporary file"); - return -1; - } - } - - if (!WriteFile(s->post_body, buffer, (DWORD)len, &bytes_written, NULL)) { - giterr_set(GITERR_OS, "Failed to write to temporary file"); - return -1; - } - - assert((DWORD)len == bytes_written); - - s->post_body_len += bytes_written; - - return 0; -} - -static int winhttp_stream_write_chunked( - git_smart_subtransport_stream *stream, - const char *buffer, - size_t len) -{ - winhttp_stream *s = (winhttp_stream *)stream; - int error; - - if (!s->request && winhttp_stream_connect(s) < 0) - return -1; - - if (!s->sent_request) { - /* Send Transfer-Encoding: chunked header */ - if (!WinHttpAddRequestHeaders(s->request, - transfer_encoding, (ULONG) -1L, - WINHTTP_ADDREQ_FLAG_ADD)) { - giterr_set(GITERR_OS, "Failed to add a header to the request"); - return -1; - } - - if ((error = send_request(s, 0, 1)) < 0) - return error; - - s->sent_request = 1; - } - - if (len > CACHED_POST_BODY_BUF_SIZE) { - /* Flush, if necessary */ - if (s->chunk_buffer_len > 0) { - if (write_chunk(s->request, s->chunk_buffer, s->chunk_buffer_len) < 0) - return -1; - - s->chunk_buffer_len = 0; - } - - /* Write chunk directly */ - if (write_chunk(s->request, buffer, len) < 0) - return -1; - } - else { - /* Append as much to the buffer as we can */ - int count = (int)min(CACHED_POST_BODY_BUF_SIZE - s->chunk_buffer_len, len); - - if (!s->chunk_buffer) - s->chunk_buffer = git__malloc(CACHED_POST_BODY_BUF_SIZE); - - memcpy(s->chunk_buffer + s->chunk_buffer_len, buffer, count); - s->chunk_buffer_len += count; - buffer += count; - len -= count; - - /* Is the buffer full? If so, then flush */ - if (CACHED_POST_BODY_BUF_SIZE == s->chunk_buffer_len) { - if (write_chunk(s->request, s->chunk_buffer, s->chunk_buffer_len) < 0) - return -1; - - s->chunk_buffer_len = 0; - - /* Is there any remaining data from the source? */ - if (len > 0) { - memcpy(s->chunk_buffer, buffer, len); - s->chunk_buffer_len = (unsigned int)len; - } - } - } - - return 0; -} - -static void winhttp_stream_free(git_smart_subtransport_stream *stream) -{ - winhttp_stream *s = (winhttp_stream *)stream; - - winhttp_stream_close(s); - git__free(s); -} - -static int winhttp_stream_alloc(winhttp_subtransport *t, winhttp_stream **stream) -{ - winhttp_stream *s; - - if (!stream) - return -1; - - s = git__calloc(1, sizeof(winhttp_stream)); - GITERR_CHECK_ALLOC(s); - - s->parent.subtransport = &t->parent; - s->parent.read = winhttp_stream_read; - s->parent.write = winhttp_stream_write_single; - s->parent.free = winhttp_stream_free; - - *stream = s; - - return 0; -} - -static int winhttp_uploadpack_ls( - winhttp_subtransport *t, - winhttp_stream *s) -{ - GIT_UNUSED(t); - - s->service = upload_pack_service; - s->service_url = upload_pack_ls_service_url; - s->verb = get_verb; - - return 0; -} - -static int winhttp_uploadpack( - winhttp_subtransport *t, - winhttp_stream *s) -{ - GIT_UNUSED(t); - - s->service = upload_pack_service; - s->service_url = upload_pack_service_url; - s->verb = post_verb; - - return 0; -} - -static int winhttp_receivepack_ls( - winhttp_subtransport *t, - winhttp_stream *s) -{ - GIT_UNUSED(t); - - s->service = receive_pack_service; - s->service_url = receive_pack_ls_service_url; - s->verb = get_verb; - - return 0; -} - -static int winhttp_receivepack( - winhttp_subtransport *t, - winhttp_stream *s) -{ - GIT_UNUSED(t); - - /* WinHTTP only supports Transfer-Encoding: chunked - * on Windows Vista (NT 6.0) and higher. */ - s->chunked = git_has_win32_version(6, 0, 0); - - if (s->chunked) - s->parent.write = winhttp_stream_write_chunked; - else - s->parent.write = winhttp_stream_write_buffered; - - s->service = receive_pack_service; - s->service_url = receive_pack_service_url; - s->verb = post_verb; - - return 0; -} - -static int winhttp_action( - git_smart_subtransport_stream **stream, - git_smart_subtransport *subtransport, - const char *url, - git_smart_service_t action) -{ - winhttp_subtransport *t = (winhttp_subtransport *)subtransport; - winhttp_stream *s; - int ret = -1; - - if (!t->connection) - if ((ret = gitno_connection_data_from_url(&t->connection_data, url, NULL)) < 0 || - (ret = winhttp_connect(t)) < 0) - return ret; - - if (winhttp_stream_alloc(t, &s) < 0) - return -1; - - if (!stream) - return -1; - - switch (action) - { - case GIT_SERVICE_UPLOADPACK_LS: - ret = winhttp_uploadpack_ls(t, s); - break; - - case GIT_SERVICE_UPLOADPACK: - ret = winhttp_uploadpack(t, s); - break; - - case GIT_SERVICE_RECEIVEPACK_LS: - ret = winhttp_receivepack_ls(t, s); - break; - - case GIT_SERVICE_RECEIVEPACK: - ret = winhttp_receivepack(t, s); - break; - - default: - assert(0); - } - - if (!ret) - *stream = &s->parent; - - return ret; -} - -static int winhttp_close(git_smart_subtransport *subtransport) -{ - winhttp_subtransport *t = (winhttp_subtransport *)subtransport; - - gitno_connection_data_free_ptrs(&t->connection_data); - memset(&t->connection_data, 0x0, sizeof(gitno_connection_data)); - - if (t->cred) { - t->cred->free(t->cred); - t->cred = NULL; - } - - if (t->url_cred) { - t->url_cred->free(t->url_cred); - t->url_cred = NULL; - } - - return winhttp_close_connection(t); -} - -static void winhttp_free(git_smart_subtransport *subtransport) -{ - winhttp_subtransport *t = (winhttp_subtransport *)subtransport; - - winhttp_close(subtransport); - - git__free(t); -} - -int git_smart_subtransport_http(git_smart_subtransport **out, git_transport *owner, void *param) -{ - winhttp_subtransport *t; - - GIT_UNUSED(param); - - if (!out) - return -1; - - t = git__calloc(1, sizeof(winhttp_subtransport)); - GITERR_CHECK_ALLOC(t); - - t->owner = (transport_smart *)owner; - t->parent.action = winhttp_action; - t->parent.close = winhttp_close; - t->parent.free = winhttp_free; - - *out = (git_smart_subtransport *) t; - return 0; -} - -#endif /* GIT_WINHTTP */ diff --git a/vendor/libgit2/src/tree-cache.c b/vendor/libgit2/src/tree-cache.c deleted file mode 100644 index b37be0f0d4..0000000000 --- a/vendor/libgit2/src/tree-cache.c +++ /dev/null @@ -1,269 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#include "tree-cache.h" -#include "pool.h" -#include "tree.h" - -static git_tree_cache *find_child( - const git_tree_cache *tree, const char *path, const char *end) -{ - size_t i, dirlen = end ? (size_t)(end - path) : strlen(path); - - for (i = 0; i < tree->children_count; ++i) { - git_tree_cache *child = tree->children[i]; - - if (child->namelen == dirlen && !memcmp(path, child->name, dirlen)) - return child; - } - - return NULL; -} - -void git_tree_cache_invalidate_path(git_tree_cache *tree, const char *path) -{ - const char *ptr = path, *end; - - if (tree == NULL) - return; - - tree->entry_count = -1; - - while (ptr != NULL) { - end = strchr(ptr, '/'); - - if (end == NULL) /* End of path */ - break; - - tree = find_child(tree, ptr, end); - if (tree == NULL) /* We don't have that tree */ - return; - - tree->entry_count = -1; - ptr = end + 1; - } -} - -const git_tree_cache *git_tree_cache_get(const git_tree_cache *tree, const char *path) -{ - const char *ptr = path, *end; - - if (tree == NULL) { - return NULL; - } - - while (1) { - end = strchr(ptr, '/'); - - tree = find_child(tree, ptr, end); - if (tree == NULL) /* Can't find it */ - return NULL; - - if (end == NULL || *end + 1 == '\0') - return tree; - - ptr = end + 1; - } -} - -static int read_tree_internal(git_tree_cache **out, - const char **buffer_in, const char *buffer_end, - git_pool *pool) -{ - git_tree_cache *tree = NULL; - const char *name_start, *buffer; - int count; - - buffer = name_start = *buffer_in; - - if ((buffer = memchr(buffer, '\0', buffer_end - buffer)) == NULL) - goto corrupted; - - if (++buffer >= buffer_end) - goto corrupted; - - if (git_tree_cache_new(&tree, name_start, pool) < 0) - return -1; - - /* Blank-terminated ASCII decimal number of entries in this tree */ - if (git__strtol32(&count, buffer, &buffer, 10) < 0) - goto corrupted; - - tree->entry_count = count; - - if (*buffer != ' ' || ++buffer >= buffer_end) - goto corrupted; - - /* Number of children of the tree, newline-terminated */ - if (git__strtol32(&count, buffer, &buffer, 10) < 0 || count < 0) - goto corrupted; - - tree->children_count = count; - - if (*buffer != '\n' || ++buffer > buffer_end) - goto corrupted; - - /* The SHA1 is only there if it's not invalidated */ - if (tree->entry_count >= 0) { - /* 160-bit SHA-1 for this tree and it's children */ - if (buffer + GIT_OID_RAWSZ > buffer_end) - goto corrupted; - - git_oid_fromraw(&tree->oid, (const unsigned char *)buffer); - buffer += GIT_OID_RAWSZ; - } - - /* Parse children: */ - if (tree->children_count > 0) { - unsigned int i; - - tree->children = git_pool_malloc(pool, tree->children_count * sizeof(git_tree_cache *)); - GITERR_CHECK_ALLOC(tree->children); - - memset(tree->children, 0x0, tree->children_count * sizeof(git_tree_cache *)); - - for (i = 0; i < tree->children_count; ++i) { - if (read_tree_internal(&tree->children[i], &buffer, buffer_end, pool) < 0) - goto corrupted; - } - } - - *buffer_in = buffer; - *out = tree; - return 0; - - corrupted: - giterr_set(GITERR_INDEX, "Corrupted TREE extension in index"); - return -1; -} - -int git_tree_cache_read(git_tree_cache **tree, const char *buffer, size_t buffer_size, git_pool *pool) -{ - const char *buffer_end = buffer + buffer_size; - - if (read_tree_internal(tree, &buffer, buffer_end, pool) < 0) - return -1; - - if (buffer < buffer_end) { - giterr_set(GITERR_INDEX, "Corrupted TREE extension in index (unexpected trailing data)"); - return -1; - } - - return 0; -} - -static int read_tree_recursive(git_tree_cache *cache, const git_tree *tree, git_pool *pool) -{ - git_repository *repo; - size_t i, j, nentries, ntrees; - int error; - - repo = git_tree_owner(tree); - - git_oid_cpy(&cache->oid, git_tree_id(tree)); - nentries = git_tree_entrycount(tree); - - /* - * We make sure we know how many trees we need to allocate for - * so we don't have to realloc and change the pointers for the - * parents. - */ - ntrees = 0; - for (i = 0; i < nentries; i++) { - const git_tree_entry *entry; - - entry = git_tree_entry_byindex(tree, i); - if (git_tree_entry_filemode(entry) == GIT_FILEMODE_TREE) - ntrees++; - } - - cache->children_count = ntrees; - cache->children = git_pool_mallocz(pool, ntrees * sizeof(git_tree_cache *)); - GITERR_CHECK_ALLOC(cache->children); - - j = 0; - for (i = 0; i < nentries; i++) { - const git_tree_entry *entry; - git_tree *subtree; - - entry = git_tree_entry_byindex(tree, i); - if (git_tree_entry_filemode(entry) != GIT_FILEMODE_TREE) { - cache->entry_count++; - continue; - } - - if ((error = git_tree_cache_new(&cache->children[j], git_tree_entry_name(entry), pool)) < 0) - return error; - - if ((error = git_tree_lookup(&subtree, repo, git_tree_entry_id(entry))) < 0) - return error; - - error = read_tree_recursive(cache->children[j], subtree, pool); - git_tree_free(subtree); - cache->entry_count += cache->children[j]->entry_count; - j++; - - if (error < 0) - return error; - } - - return 0; -} - -int git_tree_cache_read_tree(git_tree_cache **out, const git_tree *tree, git_pool *pool) -{ - int error; - git_tree_cache *cache; - - if ((error = git_tree_cache_new(&cache, "", pool)) < 0) - return error; - - if ((error = read_tree_recursive(cache, tree, pool)) < 0) - return error; - - *out = cache; - return 0; -} - -int git_tree_cache_new(git_tree_cache **out, const char *name, git_pool *pool) -{ - size_t name_len; - git_tree_cache *tree; - - name_len = strlen(name); - tree = git_pool_malloc(pool, sizeof(git_tree_cache) + name_len + 1); - GITERR_CHECK_ALLOC(tree); - - memset(tree, 0x0, sizeof(git_tree_cache)); - /* NUL-terminated tree name */ - tree->namelen = name_len; - memcpy(tree->name, name, name_len); - tree->name[name_len] = '\0'; - - *out = tree; - return 0; -} - -static void write_tree(git_buf *out, git_tree_cache *tree) -{ - size_t i; - - git_buf_printf(out, "%s%c%"PRIdZ" %"PRIuZ"\n", tree->name, 0, tree->entry_count, tree->children_count); - - if (tree->entry_count != -1) - git_buf_put(out, (const char *) &tree->oid, GIT_OID_RAWSZ); - - for (i = 0; i < tree->children_count; i++) - write_tree(out, tree->children[i]); -} - -int git_tree_cache_write(git_buf *out, git_tree_cache *tree) -{ - write_tree(out, tree); - - return git_buf_oom(out) ? -1 : 0; -} diff --git a/vendor/libgit2/src/tree-cache.h b/vendor/libgit2/src/tree-cache.h deleted file mode 100644 index c44ca7cf5a..0000000000 --- a/vendor/libgit2/src/tree-cache.h +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#ifndef INCLUDE_tree_cache_h__ -#define INCLUDE_tree_cache_h__ - -#include "common.h" -#include "pool.h" -#include "buffer.h" -#include "git2/oid.h" - -typedef struct git_tree_cache { - struct git_tree_cache **children; - size_t children_count; - - ssize_t entry_count; - git_oid oid; - size_t namelen; - char name[GIT_FLEX_ARRAY]; -} git_tree_cache; - -int git_tree_cache_write(git_buf *out, git_tree_cache *tree); -int git_tree_cache_read(git_tree_cache **tree, const char *buffer, size_t buffer_size, git_pool *pool); -void git_tree_cache_invalidate_path(git_tree_cache *tree, const char *path); -const git_tree_cache *git_tree_cache_get(const git_tree_cache *tree, const char *path); -int git_tree_cache_new(git_tree_cache **out, const char *name, git_pool *pool); -/** - * Read a tree as the root of the tree cache (like for `git read-tree`) - */ -int git_tree_cache_read_tree(git_tree_cache **out, const git_tree *tree, git_pool *pool); -void git_tree_cache_free(git_tree_cache *tree); - -#endif diff --git a/vendor/libgit2/src/tree.c b/vendor/libgit2/src/tree.c deleted file mode 100644 index bdd17661b8..0000000000 --- a/vendor/libgit2/src/tree.c +++ /dev/null @@ -1,982 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#include "common.h" -#include "commit.h" -#include "tree.h" -#include "git2/repository.h" -#include "git2/object.h" -#include "fileops.h" -#include "tree-cache.h" -#include "index.h" - -#define DEFAULT_TREE_SIZE 16 -#define MAX_FILEMODE_BYTES 6 - -GIT__USE_STRMAP - -static bool valid_filemode(const int filemode) -{ - return (filemode == GIT_FILEMODE_TREE - || filemode == GIT_FILEMODE_BLOB - || filemode == GIT_FILEMODE_BLOB_EXECUTABLE - || filemode == GIT_FILEMODE_LINK - || filemode == GIT_FILEMODE_COMMIT); -} - -GIT_INLINE(git_filemode_t) normalize_filemode(git_filemode_t filemode) -{ - /* Tree bits set, but it's not a commit */ - if (GIT_MODE_TYPE(filemode) == GIT_FILEMODE_TREE) - return GIT_FILEMODE_TREE; - - /* If any of the x bits are set */ - if (GIT_PERMS_IS_EXEC(filemode)) - return GIT_FILEMODE_BLOB_EXECUTABLE; - - /* 16XXXX means commit */ - if (GIT_MODE_TYPE(filemode) == GIT_FILEMODE_COMMIT) - return GIT_FILEMODE_COMMIT; - - /* 12XXXX means commit */ - if (GIT_MODE_TYPE(filemode) == GIT_FILEMODE_LINK) - return GIT_FILEMODE_LINK; - - /* Otherwise, return a blob */ - return GIT_FILEMODE_BLOB; -} - -static int valid_entry_name(git_repository *repo, const char *filename) -{ - return *filename != '\0' && - git_path_isvalid(repo, filename, - GIT_PATH_REJECT_TRAVERSAL | GIT_PATH_REJECT_DOT_GIT | GIT_PATH_REJECT_SLASH); -} - -static int entry_sort_cmp(const void *a, const void *b) -{ - const git_tree_entry *e1 = (const git_tree_entry *)a; - const git_tree_entry *e2 = (const git_tree_entry *)b; - - return git_path_cmp( - e1->filename, e1->filename_len, git_tree_entry__is_tree(e1), - e2->filename, e2->filename_len, git_tree_entry__is_tree(e2), - git__strncmp); -} - -int git_tree_entry_cmp(const git_tree_entry *e1, const git_tree_entry *e2) -{ - return entry_sort_cmp(e1, e2); -} - -int git_tree_entry_icmp(const git_tree_entry *e1, const git_tree_entry *e2) -{ - return git_path_cmp( - e1->filename, e1->filename_len, git_tree_entry__is_tree(e1), - e2->filename, e2->filename_len, git_tree_entry__is_tree(e2), - git__strncasecmp); -} - -static git_tree_entry *alloc_entry(const char *filename) -{ - git_tree_entry *entry = NULL; - size_t filename_len = strlen(filename), tree_len; - - if (GIT_ADD_SIZET_OVERFLOW(&tree_len, sizeof(git_tree_entry), filename_len) || - GIT_ADD_SIZET_OVERFLOW(&tree_len, tree_len, 1) || - !(entry = git__malloc(tree_len))) - return NULL; - - memset(entry, 0x0, sizeof(git_tree_entry)); - memcpy(entry->filename, filename, filename_len); - entry->filename[filename_len] = 0; - entry->filename_len = filename_len; - - return entry; -} - -struct tree_key_search { - const char *filename; - size_t filename_len; -}; - -static int homing_search_cmp(const void *key, const void *array_member) -{ - const struct tree_key_search *ksearch = key; - const git_tree_entry *entry = array_member; - - const size_t len1 = ksearch->filename_len; - const size_t len2 = entry->filename_len; - - return memcmp( - ksearch->filename, - entry->filename, - len1 < len2 ? len1 : len2 - ); -} - -/* - * Search for an entry in a given tree. - * - * Note that this search is performed in two steps because - * of the way tree entries are sorted internally in git: - * - * Entries in a tree are not sorted alphabetically; two entries - * with the same root prefix will have different positions - * depending on whether they are folders (subtrees) or normal files. - * - * Consequently, it is not possible to find an entry on the tree - * with a binary search if you don't know whether the filename - * you're looking for is a folder or a normal file. - * - * To work around this, we first perform a homing binary search - * on the tree, using the minimal length root prefix of our filename. - * Once the comparisons for this homing search start becoming - * ambiguous because of folder vs file sorting, we look linearly - * around the area for our target file. - */ -static int tree_key_search( - size_t *at_pos, git_vector *entries, const char *filename, size_t filename_len) -{ - struct tree_key_search ksearch; - const git_tree_entry *entry; - size_t homing, i; - - ksearch.filename = filename; - ksearch.filename_len = filename_len; - - /* Initial homing search; find an entry on the tree with - * the same prefix as the filename we're looking for */ - if (git_vector_bsearch2(&homing, entries, &homing_search_cmp, &ksearch) < 0) - return GIT_ENOTFOUND; /* just a signal error; not passed back to user */ - - /* We found a common prefix. Look forward as long as - * there are entries that share the common prefix */ - for (i = homing; i < entries->length; ++i) { - entry = entries->contents[i]; - - if (homing_search_cmp(&ksearch, entry) < 0) - break; - - if (entry->filename_len == filename_len && - memcmp(filename, entry->filename, filename_len) == 0) { - if (at_pos) - *at_pos = i; - - return 0; - } - } - - /* If we haven't found our filename yet, look backwards - * too as long as we have entries with the same prefix */ - if (homing > 0) { - i = homing - 1; - - do { - entry = entries->contents[i]; - - if (homing_search_cmp(&ksearch, entry) > 0) - break; - - if (entry->filename_len == filename_len && - memcmp(filename, entry->filename, filename_len) == 0) { - if (at_pos) - *at_pos = i; - - return 0; - } - } while (i-- > 0); - } - - /* The filename doesn't exist at all */ - return GIT_ENOTFOUND; -} - -void git_tree_entry_free(git_tree_entry *entry) -{ - if (entry == NULL) - return; - - git__free(entry); -} - -int git_tree_entry_dup(git_tree_entry **dest, const git_tree_entry *source) -{ - size_t total_size; - git_tree_entry *copy; - - assert(source); - - GITERR_CHECK_ALLOC_ADD(&total_size, sizeof(git_tree_entry), source->filename_len); - GITERR_CHECK_ALLOC_ADD(&total_size, total_size, 1); - - copy = git__malloc(total_size); - GITERR_CHECK_ALLOC(copy); - - memcpy(copy, source, total_size); - - *dest = copy; - return 0; -} - -void git_tree__free(void *_tree) -{ - git_tree *tree = _tree; - size_t i; - git_tree_entry *e; - - git_vector_foreach(&tree->entries, i, e) - git_tree_entry_free(e); - - git_vector_free(&tree->entries); - git__free(tree); -} - -git_filemode_t git_tree_entry_filemode(const git_tree_entry *entry) -{ - return normalize_filemode(entry->attr); -} - -git_filemode_t git_tree_entry_filemode_raw(const git_tree_entry *entry) -{ - return entry->attr; -} - -const char *git_tree_entry_name(const git_tree_entry *entry) -{ - assert(entry); - return entry->filename; -} - -const git_oid *git_tree_entry_id(const git_tree_entry *entry) -{ - assert(entry); - return &entry->oid; -} - -git_otype git_tree_entry_type(const git_tree_entry *entry) -{ - assert(entry); - - if (S_ISGITLINK(entry->attr)) - return GIT_OBJ_COMMIT; - else if (S_ISDIR(entry->attr)) - return GIT_OBJ_TREE; - else - return GIT_OBJ_BLOB; -} - -int git_tree_entry_to_object( - git_object **object_out, - git_repository *repo, - const git_tree_entry *entry) -{ - assert(entry && object_out); - return git_object_lookup(object_out, repo, &entry->oid, GIT_OBJ_ANY); -} - -static const git_tree_entry *entry_fromname( - const git_tree *tree, const char *name, size_t name_len) -{ - size_t idx; - - /* be safe when we cast away constness - i.e. don't trigger a sort */ - assert(git_vector_is_sorted(&tree->entries)); - - if (tree_key_search(&idx, (git_vector *)&tree->entries, name, name_len) < 0) - return NULL; - - return git_vector_get(&tree->entries, idx); -} - -const git_tree_entry *git_tree_entry_byname( - const git_tree *tree, const char *filename) -{ - assert(tree && filename); - return entry_fromname(tree, filename, strlen(filename)); -} - -const git_tree_entry *git_tree_entry_byindex( - const git_tree *tree, size_t idx) -{ - assert(tree); - return git_vector_get(&tree->entries, idx); -} - -const git_tree_entry *git_tree_entry_byid( - const git_tree *tree, const git_oid *id) -{ - size_t i; - const git_tree_entry *e; - - assert(tree); - - git_vector_foreach(&tree->entries, i, e) { - if (memcmp(&e->oid.id, &id->id, sizeof(id->id)) == 0) - return e; - } - - return NULL; -} - -int git_tree__prefix_position(const git_tree *tree, const char *path) -{ - const git_vector *entries = &tree->entries; - struct tree_key_search ksearch; - size_t at_pos; - - if (!path) - return 0; - - ksearch.filename = path; - ksearch.filename_len = strlen(path); - - /* be safe when we cast away constness - i.e. don't trigger a sort */ - assert(git_vector_is_sorted(&tree->entries)); - - /* Find tree entry with appropriate prefix */ - git_vector_bsearch2( - &at_pos, (git_vector *)entries, &homing_search_cmp, &ksearch); - - for (; at_pos < entries->length; ++at_pos) { - const git_tree_entry *entry = entries->contents[at_pos]; - if (homing_search_cmp(&ksearch, entry) < 0) - break; - } - - for (; at_pos > 0; --at_pos) { - const git_tree_entry *entry = entries->contents[at_pos - 1]; - if (homing_search_cmp(&ksearch, entry) > 0) - break; - } - - return (int)at_pos; -} - -size_t git_tree_entrycount(const git_tree *tree) -{ - assert(tree); - return tree->entries.length; -} - -unsigned int git_treebuilder_entrycount(git_treebuilder *bld) -{ - assert(bld); - - return git_strmap_num_entries(bld->map); -} - -static int tree_error(const char *str, const char *path) -{ - if (path) - giterr_set(GITERR_TREE, "%s - %s", str, path); - else - giterr_set(GITERR_TREE, "%s", str); - return -1; -} - -int git_tree__parse(void *_tree, git_odb_object *odb_obj) -{ - git_tree *tree = _tree; - const char *buffer = git_odb_object_data(odb_obj); - const char *buffer_end = buffer + git_odb_object_size(odb_obj); - - if (git_vector_init(&tree->entries, DEFAULT_TREE_SIZE, entry_sort_cmp) < 0) - return -1; - - while (buffer < buffer_end) { - git_tree_entry *entry; - int attr; - - if (git__strtol32(&attr, buffer, &buffer, 8) < 0 || !buffer) - return tree_error("Failed to parse tree. Can't parse filemode", NULL); - - if (*buffer++ != ' ') - return tree_error("Failed to parse tree. Object is corrupted", NULL); - - if (memchr(buffer, 0, buffer_end - buffer) == NULL) - return tree_error("Failed to parse tree. Object is corrupted", NULL); - - /** Allocate the entry and store it in the entries vector */ - { - entry = alloc_entry(buffer); - GITERR_CHECK_ALLOC(entry); - - if (git_vector_insert(&tree->entries, entry) < 0) { - git__free(entry); - return -1; - } - - entry->attr = attr; - } - - while (buffer < buffer_end && *buffer != 0) - buffer++; - - buffer++; - - git_oid_fromraw(&entry->oid, (const unsigned char *)buffer); - buffer += GIT_OID_RAWSZ; - } - - git_vector_sort(&tree->entries); - - return 0; -} - -static size_t find_next_dir(const char *dirname, git_index *index, size_t start) -{ - size_t dirlen, i, entries = git_index_entrycount(index); - - dirlen = strlen(dirname); - for (i = start; i < entries; ++i) { - const git_index_entry *entry = git_index_get_byindex(index, i); - if (strlen(entry->path) < dirlen || - memcmp(entry->path, dirname, dirlen) || - (dirlen > 0 && entry->path[dirlen] != '/')) { - break; - } - } - - return i; -} - -static int append_entry( - git_treebuilder *bld, - const char *filename, - const git_oid *id, - git_filemode_t filemode) -{ - git_tree_entry *entry; - int error = 0; - - if (!valid_entry_name(bld->repo, filename)) - return tree_error("Failed to insert entry. Invalid name for a tree entry", filename); - - entry = alloc_entry(filename); - GITERR_CHECK_ALLOC(entry); - - git_oid_cpy(&entry->oid, id); - entry->attr = (uint16_t)filemode; - - git_strmap_insert(bld->map, entry->filename, entry, error); - if (error < 0) { - git_tree_entry_free(entry); - giterr_set(GITERR_TREE, "failed to append entry %s to the tree builder", filename); - return -1; - } - - return 0; -} - -static int write_tree( - git_oid *oid, - git_repository *repo, - git_index *index, - const char *dirname, - size_t start) -{ - git_treebuilder *bld = NULL; - size_t i, entries = git_index_entrycount(index); - int error; - size_t dirname_len = strlen(dirname); - const git_tree_cache *cache; - - cache = git_tree_cache_get(index->tree, dirname); - if (cache != NULL && cache->entry_count >= 0){ - git_oid_cpy(oid, &cache->oid); - return (int)find_next_dir(dirname, index, start); - } - - if ((error = git_treebuilder_new(&bld, repo, NULL)) < 0 || bld == NULL) - return -1; - - /* - * This loop is unfortunate, but necessary. The index doesn't have - * any directores, so we need to handle that manually, and we - * need to keep track of the current position. - */ - for (i = start; i < entries; ++i) { - const git_index_entry *entry = git_index_get_byindex(index, i); - const char *filename, *next_slash; - - /* - * If we've left our (sub)tree, exit the loop and return. The - * first check is an early out (and security for the - * third). The second check is a simple prefix comparison. The - * third check catches situations where there is a directory - * win32/sys and a file win32mmap.c. Without it, the following - * code believes there is a file win32/mmap.c - */ - if (strlen(entry->path) < dirname_len || - memcmp(entry->path, dirname, dirname_len) || - (dirname_len > 0 && entry->path[dirname_len] != '/')) { - break; - } - - filename = entry->path + dirname_len; - if (*filename == '/') - filename++; - next_slash = strchr(filename, '/'); - if (next_slash) { - git_oid sub_oid; - int written; - char *subdir, *last_comp; - - subdir = git__strndup(entry->path, next_slash - entry->path); - GITERR_CHECK_ALLOC(subdir); - - /* Write out the subtree */ - written = write_tree(&sub_oid, repo, index, subdir, i); - if (written < 0) { - git__free(subdir); - goto on_error; - } else { - i = written - 1; /* -1 because of the loop increment */ - } - - /* - * We need to figure out what we want toinsert - * into this tree. If we're traversing - * deps/zlib/, then we only want to write - * 'zlib' into the tree. - */ - last_comp = strrchr(subdir, '/'); - if (last_comp) { - last_comp++; /* Get rid of the '/' */ - } else { - last_comp = subdir; - } - - error = append_entry(bld, last_comp, &sub_oid, S_IFDIR); - git__free(subdir); - if (error < 0) - goto on_error; - } else { - error = append_entry(bld, filename, &entry->id, entry->mode); - if (error < 0) - goto on_error; - } - } - - if (git_treebuilder_write(oid, bld) < 0) - goto on_error; - - git_treebuilder_free(bld); - return (int)i; - -on_error: - git_treebuilder_free(bld); - return -1; -} - -int git_tree__write_index( - git_oid *oid, git_index *index, git_repository *repo) -{ - int ret; - git_tree *tree; - bool old_ignore_case = false; - - assert(oid && index && repo); - - if (git_index_has_conflicts(index)) { - giterr_set(GITERR_INDEX, - "Cannot create a tree from a not fully merged index."); - return GIT_EUNMERGED; - } - - if (index->tree != NULL && index->tree->entry_count >= 0) { - git_oid_cpy(oid, &index->tree->oid); - return 0; - } - - /* The tree cache didn't help us; we'll have to write - * out a tree. If the index is ignore_case, we must - * make it case-sensitive for the duration of the tree-write - * operation. */ - - if (index->ignore_case) { - old_ignore_case = true; - git_index__set_ignore_case(index, false); - } - - ret = write_tree(oid, repo, index, "", 0); - - if (old_ignore_case) - git_index__set_ignore_case(index, true); - - index->tree = NULL; - - if (ret < 0) - return ret; - - git_pool_clear(&index->tree_pool); - - if ((ret = git_tree_lookup(&tree, repo, oid)) < 0) - return ret; - - /* Read the tree cache into the index */ - ret = git_tree_cache_read_tree(&index->tree, tree, &index->tree_pool); - git_tree_free(tree); - - return ret; -} - -int git_treebuilder_new( - git_treebuilder **builder_p, - git_repository *repo, - const git_tree *source) -{ - git_treebuilder *bld; - size_t i; - - assert(builder_p && repo); - - bld = git__calloc(1, sizeof(git_treebuilder)); - GITERR_CHECK_ALLOC(bld); - - bld->repo = repo; - - if (git_strmap_alloc(&bld->map) < 0) { - git__free(bld); - return -1; - } - - if (source != NULL) { - git_tree_entry *entry_src; - - git_vector_foreach(&source->entries, i, entry_src) { - if (append_entry( - bld, entry_src->filename, - &entry_src->oid, - entry_src->attr) < 0) - goto on_error; - } - } - - *builder_p = bld; - return 0; - -on_error: - git_treebuilder_free(bld); - return -1; -} - -int git_treebuilder_insert( - const git_tree_entry **entry_out, - git_treebuilder *bld, - const char *filename, - const git_oid *id, - git_filemode_t filemode) -{ - git_tree_entry *entry; - int error; - git_strmap_iter pos; - - assert(bld && id && filename); - - if (!valid_filemode(filemode)) - return tree_error("Failed to insert entry. Invalid filemode for file", filename); - - if (!valid_entry_name(bld->repo, filename)) - return tree_error("Failed to insert entry. Invalid name for a tree entry", filename); - - pos = git_strmap_lookup_index(bld->map, filename); - if (git_strmap_valid_index(bld->map, pos)) { - entry = git_strmap_value_at(bld->map, pos); - } else { - entry = alloc_entry(filename); - GITERR_CHECK_ALLOC(entry); - - git_strmap_insert(bld->map, entry->filename, entry, error); - - if (error < 0) { - git_tree_entry_free(entry); - giterr_set(GITERR_TREE, "failed to insert %s", filename); - return -1; - } - } - - git_oid_cpy(&entry->oid, id); - entry->attr = filemode; - - if (entry_out) - *entry_out = entry; - - return 0; -} - -static git_tree_entry *treebuilder_get(git_treebuilder *bld, const char *filename) -{ - git_tree_entry *entry = NULL; - git_strmap_iter pos; - - assert(bld && filename); - - pos = git_strmap_lookup_index(bld->map, filename); - if (git_strmap_valid_index(bld->map, pos)) - entry = git_strmap_value_at(bld->map, pos); - - return entry; -} - -const git_tree_entry *git_treebuilder_get(git_treebuilder *bld, const char *filename) -{ - return treebuilder_get(bld, filename); -} - -int git_treebuilder_remove(git_treebuilder *bld, const char *filename) -{ - git_tree_entry *entry = treebuilder_get(bld, filename); - - if (entry == NULL) - return tree_error("Failed to remove entry. File isn't in the tree", filename); - - git_strmap_delete(bld->map, filename); - git_tree_entry_free(entry); - - return 0; -} - -int git_treebuilder_write(git_oid *oid, git_treebuilder *bld) -{ - int error = 0; - size_t i, entrycount; - git_buf tree = GIT_BUF_INIT; - git_odb *odb; - git_tree_entry *entry; - git_vector entries; - - assert(bld); - - entrycount = git_strmap_num_entries(bld->map); - if (git_vector_init(&entries, entrycount, entry_sort_cmp) < 0) - return -1; - - git_strmap_foreach_value(bld->map, entry, { - if (git_vector_insert(&entries, entry) < 0) - return -1; - }); - - git_vector_sort(&entries); - - /* Grow the buffer beforehand to an estimated size */ - error = git_buf_grow(&tree, entrycount * 72); - - for (i = 0; i < entries.length && !error; ++i) { - git_tree_entry *entry = git_vector_get(&entries, i); - - git_buf_printf(&tree, "%o ", entry->attr); - git_buf_put(&tree, entry->filename, entry->filename_len + 1); - git_buf_put(&tree, (char *)entry->oid.id, GIT_OID_RAWSZ); - - if (git_buf_oom(&tree)) - error = -1; - } - - git_vector_free(&entries); - - if (!error && - !(error = git_repository_odb__weakptr(&odb, bld->repo))) - error = git_odb_write(oid, odb, tree.ptr, tree.size, GIT_OBJ_TREE); - - git_buf_free(&tree); - return error; -} - -void git_treebuilder_filter( - git_treebuilder *bld, - git_treebuilder_filter_cb filter, - void *payload) -{ - const char *filename; - git_tree_entry *entry; - - assert(bld && filter); - - git_strmap_foreach(bld->map, filename, entry, { - if (filter(entry, payload)) { - git_strmap_delete(bld->map, filename); - git_tree_entry_free(entry); - } - }); -} - -void git_treebuilder_clear(git_treebuilder *bld) -{ - git_tree_entry *e; - - assert(bld); - - git_strmap_foreach_value(bld->map, e, git_tree_entry_free(e)); - git_strmap_clear(bld->map); -} - -void git_treebuilder_free(git_treebuilder *bld) -{ - if (bld == NULL) - return; - - git_treebuilder_clear(bld); - git_strmap_free(bld->map); - git__free(bld); -} - -static size_t subpath_len(const char *path) -{ - const char *slash_pos = strchr(path, '/'); - if (slash_pos == NULL) - return strlen(path); - - return slash_pos - path; -} - -int git_tree_entry_bypath( - git_tree_entry **entry_out, - const git_tree *root, - const char *path) -{ - int error = 0; - git_tree *subtree; - const git_tree_entry *entry; - size_t filename_len; - - /* Find how long is the current path component (i.e. - * the filename between two slashes */ - filename_len = subpath_len(path); - - if (filename_len == 0) { - giterr_set(GITERR_TREE, "Invalid tree path given"); - return GIT_ENOTFOUND; - } - - entry = entry_fromname(root, path, filename_len); - - if (entry == NULL) { - giterr_set(GITERR_TREE, - "the path '%.*s' does not exist in the given tree", filename_len, path); - return GIT_ENOTFOUND; - } - - switch (path[filename_len]) { - case '/': - /* If there are more components in the path... - * then this entry *must* be a tree */ - if (!git_tree_entry__is_tree(entry)) { - giterr_set(GITERR_TREE, - "the path '%.*s' exists but is not a tree", filename_len, path); - return GIT_ENOTFOUND; - } - - /* If there's only a slash left in the path, we - * return the current entry; otherwise, we keep - * walking down the path */ - if (path[filename_len + 1] != '\0') - break; - - case '\0': - /* If there are no more components in the path, return - * this entry */ - return git_tree_entry_dup(entry_out, entry); - } - - if (git_tree_lookup(&subtree, root->object.repo, &entry->oid) < 0) - return -1; - - error = git_tree_entry_bypath( - entry_out, - subtree, - path + filename_len + 1 - ); - - git_tree_free(subtree); - return error; -} - -static int tree_walk( - const git_tree *tree, - git_treewalk_cb callback, - git_buf *path, - void *payload, - bool preorder) -{ - int error = 0; - size_t i; - const git_tree_entry *entry; - - git_vector_foreach(&tree->entries, i, entry) { - if (preorder) { - error = callback(path->ptr, entry, payload); - if (error < 0) { /* negative value stops iteration */ - giterr_set_after_callback_function(error, "git_tree_walk"); - break; - } - if (error > 0) { /* positive value skips this entry */ - error = 0; - continue; - } - } - - if (git_tree_entry__is_tree(entry)) { - git_tree *subtree; - size_t path_len = git_buf_len(path); - - error = git_tree_lookup(&subtree, tree->object.repo, &entry->oid); - if (error < 0) - break; - - /* append the next entry to the path */ - git_buf_puts(path, entry->filename); - git_buf_putc(path, '/'); - - if (git_buf_oom(path)) - error = -1; - else - error = tree_walk(subtree, callback, path, payload, preorder); - - git_tree_free(subtree); - if (error != 0) - break; - - git_buf_truncate(path, path_len); - } - - if (!preorder) { - error = callback(path->ptr, entry, payload); - if (error < 0) { /* negative value stops iteration */ - giterr_set_after_callback_function(error, "git_tree_walk"); - break; - } - error = 0; - } - } - - return error; -} - -int git_tree_walk( - const git_tree *tree, - git_treewalk_mode mode, - git_treewalk_cb callback, - void *payload) -{ - int error = 0; - git_buf root_path = GIT_BUF_INIT; - - if (mode != GIT_TREEWALK_POST && mode != GIT_TREEWALK_PRE) { - giterr_set(GITERR_INVALID, "Invalid walking mode for tree walk"); - return -1; - } - - error = tree_walk( - tree, callback, &root_path, payload, (mode == GIT_TREEWALK_PRE)); - - git_buf_free(&root_path); - - return error; -} - diff --git a/vendor/libgit2/src/tree.h b/vendor/libgit2/src/tree.h deleted file mode 100644 index d01b6fd410..0000000000 --- a/vendor/libgit2/src/tree.h +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_tree_h__ -#define INCLUDE_tree_h__ - -#include "git2/tree.h" -#include "repository.h" -#include "odb.h" -#include "vector.h" -#include "strmap.h" - -struct git_tree_entry { - uint16_t attr; - git_oid oid; - size_t filename_len; - char filename[1]; -}; - -struct git_tree { - git_object object; - git_vector entries; -}; - -struct git_treebuilder { - git_repository *repo; - git_strmap *map; -}; - -GIT_INLINE(bool) git_tree_entry__is_tree(const struct git_tree_entry *e) -{ - return (S_ISDIR(e->attr) && !S_ISGITLINK(e->attr)); -} - -extern int git_tree_entry_icmp(const git_tree_entry *e1, const git_tree_entry *e2); - -void git_tree__free(void *tree); -int git_tree__parse(void *tree, git_odb_object *obj); - -/** - * Lookup the first position in the tree with a given prefix. - * - * @param tree a previously loaded tree. - * @param prefix the beginning of a path to find in the tree. - * @return index of the first item at or after the given prefix. - */ -int git_tree__prefix_position(const git_tree *tree, const char *prefix); - - -/** - * Write a tree to the given repository - */ -int git_tree__write_index( - git_oid *oid, git_index *index, git_repository *repo); - -/** - * Obsolete mode kept for compatibility reasons - */ -#define GIT_FILEMODE_BLOB_GROUP_WRITABLE 0100664 - -#endif diff --git a/vendor/libgit2/src/tsort.c b/vendor/libgit2/src/tsort.c deleted file mode 100644 index e598192042..0000000000 --- a/vendor/libgit2/src/tsort.c +++ /dev/null @@ -1,385 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#include "common.h" - -/** - * An array-of-pointers implementation of Python's Timsort - * Based on code by Christopher Swenson under the MIT license - * - * Copyright (c) 2010 Christopher Swenson - * Copyright (c) 2011 Vicent Marti - */ - -#ifndef MAX -# define MAX(x,y) (((x) > (y) ? (x) : (y))) -#endif - -#ifndef MIN -# define MIN(x,y) (((x) < (y) ? (x) : (y))) -#endif - -static int binsearch( - void **dst, const void *x, size_t size, git__sort_r_cmp cmp, void *payload) -{ - int l, c, r; - void *lx, *cx; - - assert(size > 0); - - l = 0; - r = (int)size - 1; - c = r >> 1; - lx = dst[l]; - - /* check for beginning conditions */ - if (cmp(x, lx, payload) < 0) - return 0; - - else if (cmp(x, lx, payload) == 0) { - int i = 1; - while (cmp(x, dst[i], payload) == 0) - i++; - return i; - } - - /* guaranteed not to be >= rx */ - cx = dst[c]; - while (1) { - const int val = cmp(x, cx, payload); - if (val < 0) { - if (c - l <= 1) return c; - r = c; - } else if (val > 0) { - if (r - c <= 1) return c + 1; - l = c; - lx = cx; - } else { - do { - cx = dst[++c]; - } while (cmp(x, cx, payload) == 0); - return c; - } - c = l + ((r - l) >> 1); - cx = dst[c]; - } -} - -/* Binary insertion sort, but knowing that the first "start" entries are sorted. Used in timsort. */ -static void bisort( - void **dst, size_t start, size_t size, git__sort_r_cmp cmp, void *payload) -{ - size_t i; - void *x; - int location; - - for (i = start; i < size; i++) { - int j; - /* If this entry is already correct, just move along */ - if (cmp(dst[i - 1], dst[i], payload) <= 0) - continue; - - /* Else we need to find the right place, shift everything over, and squeeze in */ - x = dst[i]; - location = binsearch(dst, x, i, cmp, payload); - for (j = (int)i - 1; j >= location; j--) { - dst[j + 1] = dst[j]; - } - dst[location] = x; - } -} - - -/* timsort implementation, based on timsort.txt */ -struct tsort_run { - ssize_t start; - ssize_t length; -}; - -struct tsort_store { - size_t alloc; - git__sort_r_cmp cmp; - void *payload; - void **storage; -}; - -static void reverse_elements(void **dst, ssize_t start, ssize_t end) -{ - while (start < end) { - void *tmp = dst[start]; - dst[start] = dst[end]; - dst[end] = tmp; - - start++; - end--; - } -} - -static ssize_t count_run( - void **dst, ssize_t start, ssize_t size, struct tsort_store *store) -{ - ssize_t curr = start + 2; - - if (size - start == 1) - return 1; - - if (start >= size - 2) { - if (store->cmp(dst[size - 2], dst[size - 1], store->payload) > 0) { - void *tmp = dst[size - 1]; - dst[size - 1] = dst[size - 2]; - dst[size - 2] = tmp; - } - - return 2; - } - - if (store->cmp(dst[start], dst[start + 1], store->payload) <= 0) { - while (curr < size - 1 && - store->cmp(dst[curr - 1], dst[curr], store->payload) <= 0) - curr++; - - return curr - start; - } else { - while (curr < size - 1 && - store->cmp(dst[curr - 1], dst[curr], store->payload) > 0) - curr++; - - /* reverse in-place */ - reverse_elements(dst, start, curr - 1); - return curr - start; - } -} - -static size_t compute_minrun(size_t n) -{ - int r = 0; - while (n >= 64) { - r |= n & 1; - n >>= 1; - } - return n + r; -} - -static int check_invariant(struct tsort_run *stack, ssize_t stack_curr) -{ - if (stack_curr < 2) - return 1; - - else if (stack_curr == 2) { - const ssize_t A = stack[stack_curr - 2].length; - const ssize_t B = stack[stack_curr - 1].length; - return (A > B); - } else { - const ssize_t A = stack[stack_curr - 3].length; - const ssize_t B = stack[stack_curr - 2].length; - const ssize_t C = stack[stack_curr - 1].length; - return !((A <= B + C) || (B <= C)); - } -} - -static int resize(struct tsort_store *store, size_t new_size) -{ - if (store->alloc < new_size) { - void **tempstore; - - tempstore = git__reallocarray(store->storage, new_size, sizeof(void *)); - - /** - * Do not propagate on OOM; this will abort the sort and - * leave the array unsorted, but no error code will be - * raised - */ - if (tempstore == NULL) - return -1; - - store->storage = tempstore; - store->alloc = new_size; - } - - return 0; -} - -static void merge(void **dst, const struct tsort_run *stack, ssize_t stack_curr, struct tsort_store *store) -{ - const ssize_t A = stack[stack_curr - 2].length; - const ssize_t B = stack[stack_curr - 1].length; - const ssize_t curr = stack[stack_curr - 2].start; - - void **storage; - ssize_t i, j, k; - - if (resize(store, MIN(A, B)) < 0) - return; - - storage = store->storage; - - /* left merge */ - if (A < B) { - memcpy(storage, &dst[curr], A * sizeof(void *)); - i = 0; - j = curr + A; - - for (k = curr; k < curr + A + B; k++) { - if ((i < A) && (j < curr + A + B)) { - if (store->cmp(storage[i], dst[j], store->payload) <= 0) - dst[k] = storage[i++]; - else - dst[k] = dst[j++]; - } else if (i < A) { - dst[k] = storage[i++]; - } else - dst[k] = dst[j++]; - } - } else { - memcpy(storage, &dst[curr + A], B * sizeof(void *)); - i = B - 1; - j = curr + A - 1; - - for (k = curr + A + B - 1; k >= curr; k--) { - if ((i >= 0) && (j >= curr)) { - if (store->cmp(dst[j], storage[i], store->payload) > 0) - dst[k] = dst[j--]; - else - dst[k] = storage[i--]; - } else if (i >= 0) - dst[k] = storage[i--]; - else - dst[k] = dst[j--]; - } - } -} - -static ssize_t collapse(void **dst, struct tsort_run *stack, ssize_t stack_curr, struct tsort_store *store, ssize_t size) -{ - ssize_t A, B, C; - - while (1) { - /* if the stack only has one thing on it, we are done with the collapse */ - if (stack_curr <= 1) - break; - - /* if this is the last merge, just do it */ - if ((stack_curr == 2) && (stack[0].length + stack[1].length == size)) { - merge(dst, stack, stack_curr, store); - stack[0].length += stack[1].length; - stack_curr--; - break; - } - - /* check if the invariant is off for a stack of 2 elements */ - else if ((stack_curr == 2) && (stack[0].length <= stack[1].length)) { - merge(dst, stack, stack_curr, store); - stack[0].length += stack[1].length; - stack_curr--; - break; - } - else if (stack_curr == 2) - break; - - A = stack[stack_curr - 3].length; - B = stack[stack_curr - 2].length; - C = stack[stack_curr - 1].length; - - /* check first invariant */ - if (A <= B + C) { - if (A < C) { - merge(dst, stack, stack_curr - 1, store); - stack[stack_curr - 3].length += stack[stack_curr - 2].length; - stack[stack_curr - 2] = stack[stack_curr - 1]; - stack_curr--; - } else { - merge(dst, stack, stack_curr, store); - stack[stack_curr - 2].length += stack[stack_curr - 1].length; - stack_curr--; - } - } else if (B <= C) { - merge(dst, stack, stack_curr, store); - stack[stack_curr - 2].length += stack[stack_curr - 1].length; - stack_curr--; - } else - break; - } - - return stack_curr; -} - -#define PUSH_NEXT() do {\ - len = count_run(dst, curr, size, store);\ - run = minrun;\ - if (run < minrun) run = minrun;\ - if (run > (ssize_t)size - curr) run = size - curr;\ - if (run > len) {\ - bisort(&dst[curr], len, run, cmp, payload);\ - len = run;\ - }\ - run_stack[stack_curr].start = curr;\ - run_stack[stack_curr++].length = len;\ - curr += len;\ - if (curr == (ssize_t)size) {\ - /* finish up */ \ - while (stack_curr > 1) { \ - merge(dst, run_stack, stack_curr, store); \ - run_stack[stack_curr - 2].length += run_stack[stack_curr - 1].length; \ - stack_curr--; \ - } \ - if (store->storage != NULL) {\ - git__free(store->storage);\ - store->storage = NULL;\ - }\ - return;\ - }\ -}\ -while (0) - -void git__tsort_r( - void **dst, size_t size, git__sort_r_cmp cmp, void *payload) -{ - struct tsort_store _store, *store = &_store; - struct tsort_run run_stack[128]; - - ssize_t stack_curr = 0; - ssize_t len, run; - ssize_t curr = 0; - ssize_t minrun; - - if (size < 64) { - bisort(dst, 1, size, cmp, payload); - return; - } - - /* compute the minimum run length */ - minrun = (ssize_t)compute_minrun(size); - - /* temporary storage for merges */ - store->alloc = 0; - store->storage = NULL; - store->cmp = cmp; - store->payload = payload; - - PUSH_NEXT(); - PUSH_NEXT(); - PUSH_NEXT(); - - while (1) { - if (!check_invariant(run_stack, stack_curr)) { - stack_curr = collapse(dst, run_stack, stack_curr, store, size); - continue; - } - - PUSH_NEXT(); - } -} - -static int tsort_r_cmp(const void *a, const void *b, void *payload) -{ - return ((git__tsort_cmp)payload)(a, b); -} - -void git__tsort(void **dst, size_t size, git__tsort_cmp cmp) -{ - git__tsort_r(dst, size, tsort_r_cmp, cmp); -} diff --git a/vendor/libgit2/src/unix/map.c b/vendor/libgit2/src/unix/map.c deleted file mode 100644 index 87ee6594b9..0000000000 --- a/vendor/libgit2/src/unix/map.c +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#include - -#if !defined(GIT_WIN32) && !defined(NO_MMAP) - -#include "map.h" -#include -#include -#include - -int git__page_size(size_t *page_size) -{ - long sc_page_size = sysconf(_SC_PAGE_SIZE); - if (sc_page_size < 0) { - giterr_set_str(GITERR_OS, "Can't determine system page size"); - return -1; - } - *page_size = (size_t) sc_page_size; - return 0; -} - -int p_mmap(git_map *out, size_t len, int prot, int flags, int fd, git_off_t offset) -{ - int mprot = PROT_READ; - int mflag = 0; - - GIT_MMAP_VALIDATE(out, len, prot, flags); - - out->data = NULL; - out->len = 0; - - if (prot & GIT_PROT_WRITE) - mprot |= PROT_WRITE; - - if ((flags & GIT_MAP_TYPE) == GIT_MAP_SHARED) - mflag = MAP_SHARED; - else if ((flags & GIT_MAP_TYPE) == GIT_MAP_PRIVATE) - mflag = MAP_PRIVATE; - else - mflag = MAP_SHARED; - - out->data = mmap(NULL, len, mprot, mflag, fd, offset); - - if (!out->data || out->data == MAP_FAILED) { - giterr_set(GITERR_OS, "Failed to mmap. Could not write data"); - return -1; - } - - out->len = len; - - return 0; -} - -int p_munmap(git_map *map) -{ - assert(map != NULL); - munmap(map->data, map->len); - - return 0; -} - -#endif - diff --git a/vendor/libgit2/src/unix/posix.h b/vendor/libgit2/src/unix/posix.h deleted file mode 100644 index 7773509907..0000000000 --- a/vendor/libgit2/src/unix/posix.h +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_posix__unix_h__ -#define INCLUDE_posix__unix_h__ - -#include -#include -#include -#include -#include - -typedef int GIT_SOCKET; -#define INVALID_SOCKET -1 - -#define p_lseek(f,n,w) lseek(f, n, w) -#define p_fstat(f,b) fstat(f, b) -#define p_lstat(p,b) lstat(p,b) -#define p_stat(p,b) stat(p, b) - -#define p_utimes(f, t) utimes(f, t) -#define p_futimes(f, t) futimes(f, t) - -#define p_readlink(a, b, c) readlink(a, b, c) -#define p_symlink(o,n) symlink(o, n) -#define p_link(o,n) link(o, n) -#define p_unlink(p) unlink(p) -#define p_mkdir(p,m) mkdir(p, m) -#define p_fsync(fd) fsync(fd) -extern char *p_realpath(const char *, char *); - -#define p_recv(s,b,l,f) recv(s,b,l,f) -#define p_send(s,b,l,f) send(s,b,l,f) -#define p_inet_pton(a, b, c) inet_pton(a, b, c) - -#define p_strcasecmp(s1, s2) strcasecmp(s1, s2) -#define p_strncasecmp(s1, s2, c) strncasecmp(s1, s2, c) -#define p_vsnprintf(b, c, f, a) vsnprintf(b, c, f, a) -#define p_snprintf(b, c, f, ...) snprintf(b, c, f, __VA_ARGS__) -#define p_mkstemp(p) mkstemp(p) -#define p_chdir(p) chdir(p) -#define p_chmod(p,m) chmod(p, m) -#define p_rmdir(p) rmdir(p) -#define p_access(p,m) access(p,m) -#define p_ftruncate(fd, sz) ftruncate(fd, sz) - -/* see win32/posix.h for explanation about why this exists */ -#define p_lstat_posixly(p,b) lstat(p,b) - -#define p_localtime_r(c, r) localtime_r(c, r) -#define p_gmtime_r(c, r) gmtime_r(c, r) - -#endif diff --git a/vendor/libgit2/src/unix/realpath.c b/vendor/libgit2/src/unix/realpath.c deleted file mode 100644 index 2e49150c2c..0000000000 --- a/vendor/libgit2/src/unix/realpath.c +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#include - -#ifndef GIT_WIN32 - -#include -#include -#include -#include - -char *p_realpath(const char *pathname, char *resolved) -{ - char *ret; - if ((ret = realpath(pathname, resolved)) == NULL) - return NULL; - -#ifdef __OpenBSD__ - /* The OpenBSD realpath function behaves differently, - * figure out if the file exists */ - if (access(ret, F_OK) < 0) - ret = NULL; -#endif - return ret; -} - -#endif diff --git a/vendor/libgit2/src/userdiff.h b/vendor/libgit2/src/userdiff.h deleted file mode 100644 index 91c1f42dc7..0000000000 --- a/vendor/libgit2/src/userdiff.h +++ /dev/null @@ -1,208 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_userdiff_h__ -#define INCLUDE_userdiff_h__ - -/* - * This file isolates the built in diff driver function name patterns. - * Most of these patterns are taken from Git (with permission from the - * original authors for relicensing to libgit2). - */ - -typedef struct { - const char *name; - const char *fns; - const char *words; - int flags; -} git_diff_driver_definition; - -#define WORD_DEFAULT "|[^[:space:]]|[\xc0-\xff][\x80-\xbf]+" - -/* - * These builtin driver definition macros have same signature as in core - * git userdiff.c so that the data can be extracted verbatim - */ -#define PATTERNS(NAME, FN_PATS, WORD_PAT) \ - { NAME, FN_PATS, WORD_PAT WORD_DEFAULT, 0 } -#define IPATTERN(NAME, FN_PATS, WORD_PAT) \ - { NAME, FN_PATS, WORD_PAT WORD_DEFAULT, REG_ICASE } - -/* - * The table of diff driver patterns - * - * Function name patterns are a list of newline separated patterns that - * match a function declaration (i.e. the line you want in the hunk header), - * or a negative pattern prefixed with a '!' to reject a pattern (such as - * rejecting goto labels in C code). - * - * Word boundary patterns are just a simple pattern that will be OR'ed with - * the default value above (i.e. whitespace or non-ASCII characters). - */ -static git_diff_driver_definition builtin_defs[] = { - -IPATTERN("ada", - "!^(.*[ \t])?(is[ \t]+new|renames|is[ \t]+separate)([ \t].*)?$\n" - "!^[ \t]*with[ \t].*$\n" - "^[ \t]*((procedure|function)[ \t]+.*)$\n" - "^[ \t]*((package|protected|task)[ \t]+.*)$", - /* -- */ - "[a-zA-Z][a-zA-Z0-9_]*" - "|[-+]?[0-9][0-9#_.aAbBcCdDeEfF]*([eE][+-]?[0-9_]+)?" - "|=>|\\.\\.|\\*\\*|:=|/=|>=|<=|<<|>>|<>"), - -IPATTERN("fortran", - "!^([C*]|[ \t]*!)\n" - "!^[ \t]*MODULE[ \t]+PROCEDURE[ \t]\n" - "^[ \t]*((END[ \t]+)?(PROGRAM|MODULE|BLOCK[ \t]+DATA" - "|([^'\" \t]+[ \t]+)*(SUBROUTINE|FUNCTION))[ \t]+[A-Z].*)$", - /* -- */ - "[a-zA-Z][a-zA-Z0-9_]*" - "|\\.([Ee][Qq]|[Nn][Ee]|[Gg][TtEe]|[Ll][TtEe]|[Tt][Rr][Uu][Ee]|[Ff][Aa][Ll][Ss][Ee]|[Aa][Nn][Dd]|[Oo][Rr]|[Nn]?[Ee][Qq][Vv]|[Nn][Oo][Tt])\\." - /* numbers and format statements like 2E14.4, or ES12.6, 9X. - * Don't worry about format statements without leading digits since - * they would have been matched above as a variable anyway. */ - "|[-+]?[0-9.]+([AaIiDdEeFfLlTtXx][Ss]?[-+]?[0-9.]*)?(_[a-zA-Z0-9][a-zA-Z0-9_]*)?" - "|//|\\*\\*|::|[/<>=]="), - -PATTERNS("html", "^[ \t]*(<[Hh][1-6][ \t].*>.*)$", - "[^<>= \t]+"), - -PATTERNS("java", - "!^[ \t]*(catch|do|for|if|instanceof|new|return|switch|throw|while)\n" - "^[ \t]*(([A-Za-z_][A-Za-z_0-9]*[ \t]+)+[A-Za-z_][A-Za-z_0-9]*[ \t]*\\([^;]*)$", - /* -- */ - "[a-zA-Z_][a-zA-Z0-9_]*" - "|[-+0-9.e]+[fFlL]?|0[xXbB]?[0-9a-fA-F]+[lL]?" - "|[-+*/<>%&^|=!]=" - "|--|\\+\\+|<<=?|>>>?=?|&&|\\|\\|"), - -PATTERNS("matlab", - "^[[:space:]]*((classdef|function)[[:space:]].*)$|^%%[[:space:]].*$", - "[a-zA-Z_][a-zA-Z0-9_]*|[-+0-9.e]+|[=~<>]=|\\.[*/\\^']|\\|\\||&&"), - -PATTERNS("objc", - /* Negate C statements that can look like functions */ - "!^[ \t]*(do|for|if|else|return|switch|while)\n" - /* Objective-C methods */ - "^[ \t]*([-+][ \t]*\\([ \t]*[A-Za-z_][A-Za-z_0-9* \t]*\\)[ \t]*[A-Za-z_].*)$\n" - /* C functions */ - "^[ \t]*(([A-Za-z_][A-Za-z_0-9]*[ \t]+)+[A-Za-z_][A-Za-z_0-9]*[ \t]*\\([^;]*)$\n" - /* Objective-C class/protocol definitions */ - "^(@(implementation|interface|protocol)[ \t].*)$", - /* -- */ - "[a-zA-Z_][a-zA-Z0-9_]*" - "|[-+0-9.e]+[fFlL]?|0[xXbB]?[0-9a-fA-F]+[lL]?" - "|[-+*/<>%&^|=!]=|--|\\+\\+|<<=?|>>=?|&&|\\|\\||::|->"), - -PATTERNS("pascal", - "^(((class[ \t]+)?(procedure|function)|constructor|destructor|interface|" - "implementation|initialization|finalization)[ \t]*.*)$" - "\n" - "^(.*=[ \t]*(class|record).*)$", - /* -- */ - "[a-zA-Z_][a-zA-Z0-9_]*" - "|[-+0-9.e]+|0[xXbB]?[0-9a-fA-F]+" - "|<>|<=|>=|:=|\\.\\."), - -PATTERNS("perl", - "^package .*\n" - "^sub [[:alnum:]_':]+[ \t]*" - "(\\([^)]*\\)[ \t]*)?" /* prototype */ - /* - * Attributes. A regex can't count nested parentheses, - * so just slurp up whatever we see, taking care not - * to accept lines like "sub foo; # defined elsewhere". - * - * An attribute could contain a semicolon, but at that - * point it seems reasonable enough to give up. - */ - "(:[^;#]*)?" - "(\\{[ \t]*)?" /* brace can come here or on the next line */ - "(#.*)?$\n" /* comment */ - "^(BEGIN|END|INIT|CHECK|UNITCHECK|AUTOLOAD|DESTROY)[ \t]*" - "(\\{[ \t]*)?" /* brace can come here or on the next line */ - "(#.*)?$\n" - "^=head[0-9] .*", /* POD */ - /* -- */ - "[[:alpha:]_'][[:alnum:]_']*" - "|0[xb]?[0-9a-fA-F_]*" - /* taking care not to interpret 3..5 as (3.)(.5) */ - "|[0-9a-fA-F_]+(\\.[0-9a-fA-F_]+)?([eE][-+]?[0-9_]+)?" - "|=>|-[rwxoRWXOezsfdlpSugkbctTBMAC>]|~~|::" - "|&&=|\\|\\|=|//=|\\*\\*=" - "|&&|\\|\\||//|\\+\\+|--|\\*\\*|\\.\\.\\.?" - "|[-+*/%.^&<>=!|]=" - "|=~|!~" - "|<<|<>|<=>|>>"), - -PATTERNS("python", "^[ \t]*((class|def)[ \t].*)$", - /* -- */ - "[a-zA-Z_][a-zA-Z0-9_]*" - "|[-+0-9.e]+[jJlL]?|0[xX]?[0-9a-fA-F]+[lL]?" - "|[-+*/<>%&^|=!]=|//=?|<<=?|>>=?|\\*\\*=?"), - -PATTERNS("ruby", "^[ \t]*((class|module|def)[ \t].*)$", - /* -- */ - "(@|@@|\\$)?[a-zA-Z_][a-zA-Z0-9_]*" - "|[-+0-9.e]+|0[xXbB]?[0-9a-fA-F]+|\\?(\\\\C-)?(\\\\M-)?." - "|//=?|[-+*/<>%&^|=!]=|<<=?|>>=?|===|\\.{1,3}|::|[!=]~"), - -PATTERNS("bibtex", "(@[a-zA-Z]{1,}[ \t]*\\{{0,1}[ \t]*[^ \t\"@',\\#}{~%]*).*$", - "[={}\"]|[^={}\" \t]+"), - -PATTERNS("tex", "^(\\\\((sub)*section|chapter|part)\\*{0,1}\\{.*)$", - "\\\\[a-zA-Z@]+|\\\\.|[a-zA-Z0-9\x80-\xff]+"), - -PATTERNS("cpp", - /* Jump targets or access declarations */ - "!^[ \t]*[A-Za-z_][A-Za-z_0-9]*:[[:space:]]*($|/[/*])\n" - /* functions/methods, variables, and compounds at top level */ - "^((::[[:space:]]*)?[A-Za-z_].*)$", - /* -- */ - "[a-zA-Z_][a-zA-Z0-9_]*" - "|[-+0-9.e]+[fFlL]?|0[xXbB]?[0-9a-fA-F]+[lLuU]*" - "|[-+*/<>%&^|=!]=|--|\\+\\+|<<=?|>>=?|&&|\\|\\||::|->\\*?|\\.\\*"), - -PATTERNS("csharp", - /* Keywords */ - "!^[ \t]*(do|while|for|if|else|instanceof|new|return|switch|case|throw|catch|using)\n" - /* Methods and constructors */ - "^[ \t]*(((static|public|internal|private|protected|new|virtual|sealed|override|unsafe)[ \t]+)*[][<>@.~_[:alnum:]]+[ \t]+[<>@._[:alnum:]]+[ \t]*\\(.*\\))[ \t]*$\n" - /* Properties */ - "^[ \t]*(((static|public|internal|private|protected|new|virtual|sealed|override|unsafe)[ \t]+)*[][<>@.~_[:alnum:]]+[ \t]+[@._[:alnum:]]+)[ \t]*$\n" - /* Type definitions */ - "^[ \t]*(((static|public|internal|private|protected|new|unsafe|sealed|abstract|partial)[ \t]+)*(class|enum|interface|struct)[ \t]+.*)$\n" - /* Namespace */ - "^[ \t]*(namespace[ \t]+.*)$", - /* -- */ - "[a-zA-Z_][a-zA-Z0-9_]*" - "|[-+0-9.e]+[fFlL]?|0[xXbB]?[0-9a-fA-F]+[lL]?" - "|[-+*/<>%&^|=!]=|--|\\+\\+|<<=?|>>=?|&&|\\|\\||::|->"), - -PATTERNS("php", - "^[ \t]*(((public|private|protected|static|final)[ \t]+)*((class|function)[ \t].*))$", - /* -- */ - "[a-zA-Z_][a-zA-Z0-9_]*" - "|[-+0-9.e]+[fFlL]?|0[xX]?[0-9a-fA-F]+[lL]?" - "|[-+*/<>%&^|=!]=|--|\\+\\+|<<=?|>>=?|&&|\\|\\||::|->"), - -PATTERNS("javascript", - "([a-zA-Z_$][a-zA-Z0-9_$]*(\\.[a-zA-Z0-9_$]+)*[ \t]*=[ \t]*function([ \t][a-zA-Z_$][a-zA-Z0-9_$]*)?[^\\{]*)\n" - "([a-zA-Z_$][a-zA-Z0-9_$]*[ \t]*:[ \t]*function([ \t][a-zA-Z_$][a-zA-Z0-9_$]*)?[^\\{]*)\n" - "[^a-zA-Z0-9_\\$](function([ \t][a-zA-Z_$][a-zA-Z0-9_$]*)?[^\\{]*)", - /* -- */ - "[a-zA-Z_][a-zA-Z0-9_]*" - "|[-+0-9.e]+[fFlL]?|0[xX]?[0-9a-fA-F]+[lL]?" - "|[-+*/<>%&^|=!]=|--|\\+\\+|<<=?|>>=?|&&|\\|\\||::|->"), -}; - -#undef IPATTERN -#undef PATTERNS -#undef WORD_DEFAULT - -#endif - diff --git a/vendor/libgit2/src/util.c b/vendor/libgit2/src/util.c deleted file mode 100644 index c62826420f..0000000000 --- a/vendor/libgit2/src/util.c +++ /dev/null @@ -1,767 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#include -#include "common.h" -#include -#include -#include "posix.h" - -#ifdef _MSC_VER -# include -#endif - -void git_strarray_free(git_strarray *array) -{ - size_t i; - - if (array == NULL) - return; - - for (i = 0; i < array->count; ++i) - git__free(array->strings[i]); - - git__free(array->strings); - - memset(array, 0, sizeof(*array)); -} - -int git_strarray_copy(git_strarray *tgt, const git_strarray *src) -{ - size_t i; - - assert(tgt && src); - - memset(tgt, 0, sizeof(*tgt)); - - if (!src->count) - return 0; - - tgt->strings = git__calloc(src->count, sizeof(char *)); - GITERR_CHECK_ALLOC(tgt->strings); - - for (i = 0; i < src->count; ++i) { - if (!src->strings[i]) - continue; - - tgt->strings[tgt->count] = git__strdup(src->strings[i]); - if (!tgt->strings[tgt->count]) { - git_strarray_free(tgt); - memset(tgt, 0, sizeof(*tgt)); - return -1; - } - - tgt->count++; - } - - return 0; -} - -int git__strtol64(int64_t *result, const char *nptr, const char **endptr, int base) -{ - const char *p; - int64_t n, nn; - int c, ovfl, v, neg, ndig; - - p = nptr; - neg = 0; - n = 0; - ndig = 0; - ovfl = 0; - - /* - * White space - */ - while (git__isspace(*p)) - p++; - - /* - * Sign - */ - if (*p == '-' || *p == '+') - if (*p++ == '-') - neg = 1; - - /* - * Base - */ - if (base == 0) { - if (*p != '0') - base = 10; - else { - base = 8; - if (p[1] == 'x' || p[1] == 'X') { - p += 2; - base = 16; - } - } - } else if (base == 16 && *p == '0') { - if (p[1] == 'x' || p[1] == 'X') - p += 2; - } else if (base < 0 || 36 < base) - goto Return; - - /* - * Non-empty sequence of digits - */ - for (;; p++,ndig++) { - c = *p; - v = base; - if ('0'<=c && c<='9') - v = c - '0'; - else if ('a'<=c && c<='z') - v = c - 'a' + 10; - else if ('A'<=c && c<='Z') - v = c - 'A' + 10; - if (v >= base) - break; - nn = n*base + v; - if (nn < n) - ovfl = 1; - n = nn; - } - -Return: - if (ndig == 0) { - giterr_set(GITERR_INVALID, "Failed to convert string to long. Not a number"); - return -1; - } - - if (endptr) - *endptr = p; - - if (ovfl) { - giterr_set(GITERR_INVALID, "Failed to convert string to long. Overflow error"); - return -1; - } - - *result = neg ? -n : n; - return 0; -} - -int git__strtol32(int32_t *result, const char *nptr, const char **endptr, int base) -{ - int error; - int32_t tmp_int; - int64_t tmp_long; - - if ((error = git__strtol64(&tmp_long, nptr, endptr, base)) < 0) - return error; - - tmp_int = tmp_long & 0xFFFFFFFF; - if (tmp_int != tmp_long) { - giterr_set(GITERR_INVALID, "Failed to convert. '%s' is too large", nptr); - return -1; - } - - *result = tmp_int; - - return error; -} - -int git__strcmp(const char *a, const char *b) -{ - while (*a && *b && *a == *b) - ++a, ++b; - return (int)(*(const unsigned char *)a) - (int)(*(const unsigned char *)b); -} - -int git__strcasecmp(const char *a, const char *b) -{ - while (*a && *b && git__tolower(*a) == git__tolower(*b)) - ++a, ++b; - return ((unsigned char)git__tolower(*a) - (unsigned char)git__tolower(*b)); -} - -int git__strcasesort_cmp(const char *a, const char *b) -{ - int cmp = 0; - - while (*a && *b) { - if (*a != *b) { - if (git__tolower(*a) != git__tolower(*b)) - break; - /* use case in sort order even if not in equivalence */ - if (!cmp) - cmp = (int)(*(const uint8_t *)a) - (int)(*(const uint8_t *)b); - } - - ++a, ++b; - } - - if (*a || *b) - return (unsigned char)git__tolower(*a) - (unsigned char)git__tolower(*b); - - return cmp; -} - -int git__strncmp(const char *a, const char *b, size_t sz) -{ - while (sz && *a && *b && *a == *b) - --sz, ++a, ++b; - if (!sz) - return 0; - return (int)(*(const unsigned char *)a) - (int)(*(const unsigned char *)b); -} - -int git__strncasecmp(const char *a, const char *b, size_t sz) -{ - int al, bl; - - do { - al = (unsigned char)git__tolower(*a); - bl = (unsigned char)git__tolower(*b); - ++a, ++b; - } while (--sz && al && al == bl); - - return al - bl; -} - -void git__strntolower(char *str, size_t len) -{ - size_t i; - - for (i = 0; i < len; ++i) { - str[i] = (char)git__tolower(str[i]); - } -} - -void git__strtolower(char *str) -{ - git__strntolower(str, strlen(str)); -} - -int git__prefixcmp(const char *str, const char *prefix) -{ - for (;;) { - unsigned char p = *(prefix++), s; - if (!p) - return 0; - if ((s = *(str++)) != p) - return s - p; - } -} - -int git__prefixcmp_icase(const char *str, const char *prefix) -{ - return strncasecmp(str, prefix, strlen(prefix)); -} - -int git__prefixncmp_icase(const char *str, size_t str_n, const char *prefix) -{ - int s, p; - - while(str_n--) { - s = (unsigned char)git__tolower(*str++); - p = (unsigned char)git__tolower(*prefix++); - - if (s != p) - return s - p; - } - - return (0 - *prefix); -} - -int git__suffixcmp(const char *str, const char *suffix) -{ - size_t a = strlen(str); - size_t b = strlen(suffix); - if (a < b) - return -1; - return strcmp(str + (a - b), suffix); -} - -char *git__strtok(char **end, const char *sep) -{ - char *ptr = *end; - - while (*ptr && strchr(sep, *ptr)) - ++ptr; - - if (*ptr) { - char *start = ptr; - *end = start + 1; - - while (**end && !strchr(sep, **end)) - ++*end; - - if (**end) { - **end = '\0'; - ++*end; - } - - return start; - } - - return NULL; -} - -/* Similar to strtok, but does not collapse repeated tokens. */ -char *git__strsep(char **end, const char *sep) -{ - char *start = *end, *ptr = *end; - - while (*ptr && !strchr(sep, *ptr)) - ++ptr; - - if (*ptr) { - *end = ptr + 1; - *ptr = '\0'; - - return start; - } - - return NULL; -} - -void git__hexdump(const char *buffer, size_t len) -{ - static const size_t LINE_WIDTH = 16; - - size_t line_count, last_line, i, j; - const char *line; - - line_count = (len / LINE_WIDTH); - last_line = (len % LINE_WIDTH); - - for (i = 0; i < line_count; ++i) { - line = buffer + (i * LINE_WIDTH); - for (j = 0; j < LINE_WIDTH; ++j, ++line) - printf("%02X ", (unsigned char)*line & 0xFF); - - printf("| "); - - line = buffer + (i * LINE_WIDTH); - for (j = 0; j < LINE_WIDTH; ++j, ++line) - printf("%c", (*line >= 32 && *line <= 126) ? *line : '.'); - - printf("\n"); - } - - if (last_line > 0) { - - line = buffer + (line_count * LINE_WIDTH); - for (j = 0; j < last_line; ++j, ++line) - printf("%02X ", (unsigned char)*line & 0xFF); - - for (j = 0; j < (LINE_WIDTH - last_line); ++j) - printf(" "); - - printf("| "); - - line = buffer + (line_count * LINE_WIDTH); - for (j = 0; j < last_line; ++j, ++line) - printf("%c", (*line >= 32 && *line <= 126) ? *line : '.'); - - printf("\n"); - } - - printf("\n"); -} - -#ifdef GIT_LEGACY_HASH -uint32_t git__hash(const void *key, int len, unsigned int seed) -{ - const uint32_t m = 0x5bd1e995; - const int r = 24; - uint32_t h = seed ^ len; - - const unsigned char *data = (const unsigned char *)key; - - while(len >= 4) { - uint32_t k = *(uint32_t *)data; - - k *= m; - k ^= k >> r; - k *= m; - - h *= m; - h ^= k; - - data += 4; - len -= 4; - } - - switch(len) { - case 3: h ^= data[2] << 16; - case 2: h ^= data[1] << 8; - case 1: h ^= data[0]; - h *= m; - }; - - h ^= h >> 13; - h *= m; - h ^= h >> 15; - - return h; -} -#else -/* - Cross-platform version of Murmurhash3 - http://code.google.com/p/smhasher/wiki/MurmurHash3 - by Austin Appleby (aappleby@gmail.com) - - This code is on the public domain. -*/ -uint32_t git__hash(const void *key, int len, uint32_t seed) -{ - -#define MURMUR_BLOCK() {\ - k1 *= c1; \ - k1 = git__rotl(k1,11);\ - k1 *= c2;\ - h1 ^= k1;\ - h1 = h1*3 + 0x52dce729;\ - c1 = c1*5 + 0x7b7d159c;\ - c2 = c2*5 + 0x6bce6396;\ -} - - const uint8_t *data = (const uint8_t*)key; - const int nblocks = len / 4; - - const uint32_t *blocks = (const uint32_t *)(data + nblocks * 4); - const uint8_t *tail = (const uint8_t *)(data + nblocks * 4); - - uint32_t h1 = 0x971e137b ^ seed; - uint32_t k1; - - uint32_t c1 = 0x95543787; - uint32_t c2 = 0x2ad7eb25; - - int i; - - for (i = -nblocks; i; i++) { - k1 = blocks[i]; - MURMUR_BLOCK(); - } - - k1 = 0; - - switch(len & 3) { - case 3: k1 ^= tail[2] << 16; - case 2: k1 ^= tail[1] << 8; - case 1: k1 ^= tail[0]; - MURMUR_BLOCK(); - } - - h1 ^= len; - h1 ^= h1 >> 16; - h1 *= 0x85ebca6b; - h1 ^= h1 >> 13; - h1 *= 0xc2b2ae35; - h1 ^= h1 >> 16; - - return h1; -} -#endif - -/** - * A modified `bsearch` from the BSD glibc. - * - * Copyright (c) 1990 Regents of the University of California. - * All rights reserved. - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. 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. - * 3. [rescinded 22 July 1999] - * 4. Neither the name of the University 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 REGENTS 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 REGENTS 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. - */ -int git__bsearch( - void **array, - size_t array_len, - const void *key, - int (*compare)(const void *, const void *), - size_t *position) -{ - size_t lim; - int cmp = -1; - void **part, **base = array; - - for (lim = array_len; lim != 0; lim >>= 1) { - part = base + (lim >> 1); - cmp = (*compare)(key, *part); - if (cmp == 0) { - base = part; - break; - } - if (cmp > 0) { /* key > p; take right partition */ - base = part + 1; - lim--; - } /* else take left partition */ - } - - if (position) - *position = (base - array); - - return (cmp == 0) ? 0 : GIT_ENOTFOUND; -} - -int git__bsearch_r( - void **array, - size_t array_len, - const void *key, - int (*compare_r)(const void *, const void *, void *), - void *payload, - size_t *position) -{ - size_t lim; - int cmp = -1; - void **part, **base = array; - - for (lim = array_len; lim != 0; lim >>= 1) { - part = base + (lim >> 1); - cmp = (*compare_r)(key, *part, payload); - if (cmp == 0) { - base = part; - break; - } - if (cmp > 0) { /* key > p; take right partition */ - base = part + 1; - lim--; - } /* else take left partition */ - } - - if (position) - *position = (base - array); - - return (cmp == 0) ? 0 : GIT_ENOTFOUND; -} - -/** - * A strcmp wrapper - * - * We don't want direct pointers to the CRT on Windows, we may - * get stdcall conflicts. - */ -int git__strcmp_cb(const void *a, const void *b) -{ - return strcmp((const char *)a, (const char *)b); -} - -int git__strcasecmp_cb(const void *a, const void *b) -{ - return strcasecmp((const char *)a, (const char *)b); -} - -int git__parse_bool(int *out, const char *value) -{ - /* A missing value means true */ - if (value == NULL || - !strcasecmp(value, "true") || - !strcasecmp(value, "yes") || - !strcasecmp(value, "on")) { - *out = 1; - return 0; - } - if (!strcasecmp(value, "false") || - !strcasecmp(value, "no") || - !strcasecmp(value, "off") || - value[0] == '\0') { - *out = 0; - return 0; - } - - return -1; -} - -size_t git__unescape(char *str) -{ - char *scan, *pos = str; - - if (!str) - return 0; - - for (scan = str; *scan; pos++, scan++) { - if (*scan == '\\' && *(scan + 1) != '\0') - scan++; /* skip '\' but include next char */ - if (pos != scan) - *pos = *scan; - } - - if (pos != scan) { - *pos = '\0'; - } - - return (pos - str); -} - -#if defined(GIT_WIN32) || defined(BSD) -typedef struct { - git__sort_r_cmp cmp; - void *payload; -} git__qsort_r_glue; - -static int GIT_STDLIB_CALL git__qsort_r_glue_cmp( - void *payload, const void *a, const void *b) -{ - git__qsort_r_glue *glue = payload; - return glue->cmp(a, b, glue->payload); -} -#endif - -void git__qsort_r( - void *els, size_t nel, size_t elsize, git__sort_r_cmp cmp, void *payload) -{ -#if defined(__MINGW32__) || defined(AMIGA) || \ - defined(__OpenBSD__) || defined(__NetBSD__) || \ - defined(__gnu_hurd__) || defined(__ANDROID_API__) || \ - defined(__sun) || defined(__CYGWIN__) || \ - (__GLIBC__ == 2 && __GLIBC_MINOR__ < 8) || \ - (defined(_MSC_VER) && _MSC_VER < 1500) - git__insertsort_r(els, nel, elsize, NULL, cmp, payload); -#elif defined(GIT_WIN32) - git__qsort_r_glue glue = { cmp, payload }; - qsort_s(els, nel, elsize, git__qsort_r_glue_cmp, &glue); -#elif defined(BSD) - git__qsort_r_glue glue = { cmp, payload }; - qsort_r(els, nel, elsize, &glue, git__qsort_r_glue_cmp); -#else - qsort_r(els, nel, elsize, cmp, payload); -#endif -} - -void git__insertsort_r( - void *els, size_t nel, size_t elsize, void *swapel, - git__sort_r_cmp cmp, void *payload) -{ - uint8_t *base = els; - uint8_t *end = base + nel * elsize; - uint8_t *i, *j; - bool freeswap = !swapel; - - if (freeswap) - swapel = git__malloc(elsize); - - for (i = base + elsize; i < end; i += elsize) - for (j = i; j > base && cmp(j, j - elsize, payload) < 0; j -= elsize) { - memcpy(swapel, j, elsize); - memcpy(j, j - elsize, elsize); - memcpy(j - elsize, swapel, elsize); - } - - if (freeswap) - git__free(swapel); -} - -/* - * git__utf8_iterate is taken from the utf8proc project, - * http://www.public-software-group.org/utf8proc - * - * Copyright (c) 2009 Public Software Group e. V., Berlin, Germany - * - * 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. - */ - -static const int8_t utf8proc_utf8class[256] = { - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0 -}; - -int git__utf8_charlen(const uint8_t *str, int str_len) -{ - int length, i; - - length = utf8proc_utf8class[str[0]]; - if (!length) - return -1; - - if (str_len >= 0 && length > str_len) - return -str_len; - - for (i = 1; i < length; i++) { - if ((str[i] & 0xC0) != 0x80) - return -i; - } - - return length; -} - -int git__utf8_iterate(const uint8_t *str, int str_len, int32_t *dst) -{ - int length; - int32_t uc = -1; - - *dst = -1; - length = git__utf8_charlen(str, str_len); - if (length < 0) - return -1; - - switch (length) { - case 1: - uc = str[0]; - break; - case 2: - uc = ((str[0] & 0x1F) << 6) + (str[1] & 0x3F); - if (uc < 0x80) uc = -1; - break; - case 3: - uc = ((str[0] & 0x0F) << 12) + ((str[1] & 0x3F) << 6) - + (str[2] & 0x3F); - if (uc < 0x800 || (uc >= 0xD800 && uc < 0xE000) || - (uc >= 0xFDD0 && uc < 0xFDF0)) uc = -1; - break; - case 4: - uc = ((str[0] & 0x07) << 18) + ((str[1] & 0x3F) << 12) - + ((str[2] & 0x3F) << 6) + (str[3] & 0x3F); - if (uc < 0x10000 || uc >= 0x110000) uc = -1; - break; - } - - if (uc < 0 || ((uc & 0xFFFF) >= 0xFFFE)) - return -1; - - *dst = uc; - return length; -} diff --git a/vendor/libgit2/src/util.h b/vendor/libgit2/src/util.h deleted file mode 100644 index b2abbe6a65..0000000000 --- a/vendor/libgit2/src/util.h +++ /dev/null @@ -1,599 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_util_h__ -#define INCLUDE_util_h__ - -#if defined(GIT_MSVC_CRTDBG) -/* Enable MSVC CRTDBG memory leak reporting. - * - * We DO NOT use the "_CRTDBG_MAP_ALLOC" macro described in the MSVC - * documentation because all allocs/frees in libgit2 already go through - * the "git__" routines defined in this file. Simply using the normal - * reporting mechanism causes all leaks to be attributed to a routine - * here in util.h (ie, the actual call to calloc()) rather than the - * caller of git__calloc(). - * - * Therefore, we declare a set of "git__crtdbg__" routines to replace - * the corresponding "git__" routines and re-define the "git__" symbols - * as macros. This allows us to get and report the file:line info of - * the real caller. - * - * We DO NOT replace the "git__free" routine because it needs to remain - * a function pointer because it is used as a function argument when - * setting up various structure "destructors". - * - * We also DO NOT use the "_CRTDBG_MAP_ALLOC" macro because it causes - * "free" to be remapped to "_free_dbg" and this causes problems for - * structures which define a field named "free". - * - * Finally, CRTDBG must be explicitly enabled and configured at program - * startup. See tests/main.c for an example. - */ -#include -#include -#endif - -#include "common.h" -#include "strnlen.h" - -#define ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0])) -#define bitsizeof(x) (CHAR_BIT * sizeof(x)) -#define MSB(x, bits) ((x) & (~0ULL << (bitsizeof(x) - (bits)))) -#ifndef min -# define min(a,b) ((a) < (b) ? (a) : (b)) -#endif -#ifndef max -# define max(a,b) ((a) > (b) ? (a) : (b)) -#endif - -#define GIT_DATE_RFC2822_SZ 32 - -/** - * Return the length of a constant string. - * We are aware that `strlen` performs the same task and is usually - * optimized away by the compiler, whilst being safer because it returns - * valid values when passed a pointer instead of a constant string; however - * this macro will transparently work with wide-char and single-char strings. - */ -#define CONST_STRLEN(x) ((sizeof(x)/sizeof(x[0])) - 1) - -#if defined(GIT_MSVC_CRTDBG) -GIT_INLINE(void *) git__crtdbg__malloc(size_t len, const char *file, int line) -{ - void *ptr = _malloc_dbg(len, _NORMAL_BLOCK, file, line); - if (!ptr) giterr_set_oom(); - return ptr; -} - -GIT_INLINE(void *) git__crtdbg__calloc(size_t nelem, size_t elsize, const char *file, int line) -{ - void *ptr = _calloc_dbg(nelem, elsize, _NORMAL_BLOCK, file, line); - if (!ptr) giterr_set_oom(); - return ptr; -} - -GIT_INLINE(char *) git__crtdbg__strdup(const char *str, const char *file, int line) -{ - char *ptr = _strdup_dbg(str, _NORMAL_BLOCK, file, line); - if (!ptr) giterr_set_oom(); - return ptr; -} - -GIT_INLINE(char *) git__crtdbg__strndup(const char *str, size_t n, const char *file, int line) -{ - size_t length = 0, alloclength; - char *ptr; - - length = p_strnlen(str, n); - - if (GIT_ADD_SIZET_OVERFLOW(&alloclength, length, 1) || - !(ptr = git__crtdbg__malloc(alloclength, file, line))) - return NULL; - - if (length) - memcpy(ptr, str, length); - - ptr[length] = '\0'; - - return ptr; -} - -GIT_INLINE(char *) git__crtdbg__substrdup(const char *start, size_t n, const char *file, int line) -{ - char *ptr; - size_t alloclen; - - if (GIT_ADD_SIZET_OVERFLOW(&alloclen, n, 1) || - !(ptr = git__crtdbg__malloc(alloclen, file, line))) - return NULL; - - memcpy(ptr, start, n); - ptr[n] = '\0'; - return ptr; -} - -GIT_INLINE(void *) git__crtdbg__realloc(void *ptr, size_t size, const char *file, int line) -{ - void *new_ptr = _realloc_dbg(ptr, size, _NORMAL_BLOCK, file, line); - if (!new_ptr) giterr_set_oom(); - return new_ptr; -} - -GIT_INLINE(void *) git__crtdbg__reallocarray(void *ptr, size_t nelem, size_t elsize, const char *file, int line) -{ - size_t newsize; - return GIT_MULTIPLY_SIZET_OVERFLOW(&newsize, nelem, elsize) ? - NULL : _realloc_dbg(ptr, newsize, _NORMAL_BLOCK, file, line); -} - -GIT_INLINE(void *) git__crtdbg__mallocarray(size_t nelem, size_t elsize, const char *file, int line) -{ - return git__crtdbg__reallocarray(NULL, nelem, elsize, file, line); -} - -#define git__malloc(len) git__crtdbg__malloc(len, __FILE__, __LINE__) -#define git__calloc(nelem, elsize) git__crtdbg__calloc(nelem, elsize, __FILE__, __LINE__) -#define git__strdup(str) git__crtdbg__strdup(str, __FILE__, __LINE__) -#define git__strndup(str, n) git__crtdbg__strndup(str, n, __FILE__, __LINE__) -#define git__substrdup(str, n) git__crtdbg__substrdup(str, n, __FILE__, __LINE__) -#define git__realloc(ptr, size) git__crtdbg__realloc(ptr, size, __FILE__, __LINE__) -#define git__reallocarray(ptr, nelem, elsize) git__crtdbg__reallocarray(ptr, nelem, elsize, __FILE__, __LINE__) -#define git__mallocarray(nelem, elsize) git__crtdbg__mallocarray(nelem, elsize, __FILE__, __LINE__) - -#else - -/* - * Custom memory allocation wrappers - * that set error code and error message - * on allocation failure - */ -GIT_INLINE(void *) git__malloc(size_t len) -{ - void *ptr = malloc(len); - if (!ptr) giterr_set_oom(); - return ptr; -} - -GIT_INLINE(void *) git__calloc(size_t nelem, size_t elsize) -{ - void *ptr = calloc(nelem, elsize); - if (!ptr) giterr_set_oom(); - return ptr; -} - -GIT_INLINE(char *) git__strdup(const char *str) -{ - char *ptr = strdup(str); - if (!ptr) giterr_set_oom(); - return ptr; -} - -GIT_INLINE(char *) git__strndup(const char *str, size_t n) -{ - size_t length = 0, alloclength; - char *ptr; - - length = p_strnlen(str, n); - - if (GIT_ADD_SIZET_OVERFLOW(&alloclength, length, 1) || - !(ptr = git__malloc(alloclength))) - return NULL; - - if (length) - memcpy(ptr, str, length); - - ptr[length] = '\0'; - - return ptr; -} - -/* NOTE: This doesn't do null or '\0' checking. Watch those boundaries! */ -GIT_INLINE(char *) git__substrdup(const char *start, size_t n) -{ - char *ptr; - size_t alloclen; - - if (GIT_ADD_SIZET_OVERFLOW(&alloclen, n, 1) || - !(ptr = git__malloc(alloclen))) - return NULL; - - memcpy(ptr, start, n); - ptr[n] = '\0'; - return ptr; -} - -GIT_INLINE(void *) git__realloc(void *ptr, size_t size) -{ - void *new_ptr = realloc(ptr, size); - if (!new_ptr) giterr_set_oom(); - return new_ptr; -} - -/** - * Similar to `git__realloc`, except that it is suitable for reallocing an - * array to a new number of elements of `nelem`, each of size `elsize`. - * The total size calculation is checked for overflow. - */ -GIT_INLINE(void *) git__reallocarray(void *ptr, size_t nelem, size_t elsize) -{ - size_t newsize; - return GIT_MULTIPLY_SIZET_OVERFLOW(&newsize, nelem, elsize) ? - NULL : realloc(ptr, newsize); -} - -/** - * Similar to `git__calloc`, except that it does not zero memory. - */ -GIT_INLINE(void *) git__mallocarray(size_t nelem, size_t elsize) -{ - return git__reallocarray(NULL, nelem, elsize); -} - -#endif /* !MSVC_CTRDBG */ - -GIT_INLINE(void) git__free(void *ptr) -{ - free(ptr); -} - -#define STRCMP_CASESELECT(IGNORE_CASE, STR1, STR2) \ - ((IGNORE_CASE) ? strcasecmp((STR1), (STR2)) : strcmp((STR1), (STR2))) - -#define CASESELECT(IGNORE_CASE, ICASE, CASE) \ - ((IGNORE_CASE) ? (ICASE) : (CASE)) - -extern int git__prefixcmp(const char *str, const char *prefix); -extern int git__prefixcmp_icase(const char *str, const char *prefix); -extern int git__prefixncmp_icase(const char *str, size_t str_n, const char *prefix); -extern int git__suffixcmp(const char *str, const char *suffix); - -GIT_INLINE(int) git__signum(int val) -{ - return ((val > 0) - (val < 0)); -} - -extern int git__strtol32(int32_t *n, const char *buff, const char **end_buf, int base); -extern int git__strtol64(int64_t *n, const char *buff, const char **end_buf, int base); - -extern void git__hexdump(const char *buffer, size_t n); -extern uint32_t git__hash(const void *key, int len, uint32_t seed); - -/* 32-bit cross-platform rotl */ -#ifdef _MSC_VER /* use built-in method in MSVC */ -# define git__rotl(v, s) (uint32_t)_rotl(v, s) -#else /* use bitops in GCC; with o2 this gets optimized to a rotl instruction */ -# define git__rotl(v, s) (uint32_t)(((uint32_t)(v) << (s)) | ((uint32_t)(v) >> (32 - (s)))) -#endif - -extern char *git__strtok(char **end, const char *sep); -extern char *git__strsep(char **end, const char *sep); - -extern void git__strntolower(char *str, size_t len); -extern void git__strtolower(char *str); - -#ifdef GIT_WIN32 -GIT_INLINE(int) git__tolower(int c) -{ - return (c >= 'A' && c <= 'Z') ? (c + 32) : c; -} -#else -# define git__tolower(a) tolower(a) -#endif - -GIT_INLINE(const char *) git__next_line(const char *s) -{ - while (*s && *s != '\n') s++; - while (*s == '\n' || *s == '\r') s++; - return s; -} - -GIT_INLINE(const void *) git__memrchr(const void *s, int c, size_t n) -{ - const unsigned char *cp; - - if (n != 0) { - cp = (unsigned char *)s + n; - do { - if (*(--cp) == (unsigned char)c) - return cp; - } while (--n != 0); - } - - return NULL; -} - -typedef int (*git__tsort_cmp)(const void *a, const void *b); - -extern void git__tsort(void **dst, size_t size, git__tsort_cmp cmp); - -typedef int (*git__sort_r_cmp)(const void *a, const void *b, void *payload); - -extern void git__tsort_r( - void **dst, size_t size, git__sort_r_cmp cmp, void *payload); - -extern void git__qsort_r( - void *els, size_t nel, size_t elsize, git__sort_r_cmp cmp, void *payload); - -extern void git__insertsort_r( - void *els, size_t nel, size_t elsize, void *swapel, - git__sort_r_cmp cmp, void *payload); - -/** - * @param position If non-NULL, this will be set to the position where the - * element is or would be inserted if not found. - * @return 0 if found; GIT_ENOTFOUND if not found - */ -extern int git__bsearch( - void **array, - size_t array_len, - const void *key, - int (*compare)(const void *key, const void *element), - size_t *position); - -extern int git__bsearch_r( - void **array, - size_t array_len, - const void *key, - int (*compare_r)(const void *key, const void *element, void *payload), - void *payload, - size_t *position); - -extern int git__strcmp_cb(const void *a, const void *b); -extern int git__strcasecmp_cb(const void *a, const void *b); - -extern int git__strcmp(const char *a, const char *b); -extern int git__strcasecmp(const char *a, const char *b); -extern int git__strncmp(const char *a, const char *b, size_t sz); -extern int git__strncasecmp(const char *a, const char *b, size_t sz); - -extern int git__strcasesort_cmp(const char *a, const char *b); - -#include "thread-utils.h" - -typedef struct { - git_atomic refcount; - void *owner; -} git_refcount; - -typedef void (*git_refcount_freeptr)(void *r); - -#define GIT_REFCOUNT_INC(r) { \ - git_atomic_inc(&((git_refcount *)(r))->refcount); \ -} - -#define GIT_REFCOUNT_DEC(_r, do_free) { \ - git_refcount *r = (git_refcount *)(_r); \ - int val = git_atomic_dec(&r->refcount); \ - if (val <= 0 && r->owner == NULL) { do_free(_r); } \ -} - -#define GIT_REFCOUNT_OWN(r, o) { \ - ((git_refcount *)(r))->owner = o; \ -} - -#define GIT_REFCOUNT_OWNER(r) (((git_refcount *)(r))->owner) - -#define GIT_REFCOUNT_VAL(r) git_atomic_get(&((git_refcount *)(r))->refcount) - - -static signed char from_hex[] = { --1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 00 */ --1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 10 */ --1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 20 */ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, -1, /* 30 */ --1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 40 */ --1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 50 */ --1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 60 */ --1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 70 */ --1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 80 */ --1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 90 */ --1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* a0 */ --1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* b0 */ --1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* c0 */ --1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* d0 */ --1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* e0 */ --1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* f0 */ -}; - -GIT_INLINE(int) git__fromhex(char h) -{ - return from_hex[(unsigned char) h]; -} - -GIT_INLINE(int) git__ishex(const char *str) -{ - unsigned i; - for (i=0; str[i] != '\0'; i++) - if (git__fromhex(str[i]) < 0) - return 0; - return 1; -} - -GIT_INLINE(size_t) git__size_t_bitmask(size_t v) -{ - v--; - v |= v >> 1; - v |= v >> 2; - v |= v >> 4; - v |= v >> 8; - v |= v >> 16; - - return v; -} - -GIT_INLINE(size_t) git__size_t_powerof2(size_t v) -{ - return git__size_t_bitmask(v) + 1; -} - -GIT_INLINE(bool) git__isupper(int c) -{ - return (c >= 'A' && c <= 'Z'); -} - -GIT_INLINE(bool) git__isalpha(int c) -{ - return ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')); -} - -GIT_INLINE(bool) git__isdigit(int c) -{ - return (c >= '0' && c <= '9'); -} - -GIT_INLINE(bool) git__isspace(int c) -{ - return (c == ' ' || c == '\t' || c == '\n' || c == '\f' || c == '\r' || c == '\v'); -} - -GIT_INLINE(bool) git__isspace_nonlf(int c) -{ - return (c == ' ' || c == '\t' || c == '\f' || c == '\r' || c == '\v'); -} - -GIT_INLINE(bool) git__iswildcard(int c) -{ - return (c == '*' || c == '?' || c == '['); -} - -/* - * Parse a string value as a boolean, just like Core Git does. - * - * Valid values for true are: 'true', 'yes', 'on' - * Valid values for false are: 'false', 'no', 'off' - */ -extern int git__parse_bool(int *out, const char *value); - -/* - * Parse a string into a value as a git_time_t. - * - * Sample valid input: - * - "yesterday" - * - "July 17, 2003" - * - "2003-7-17 08:23" - */ -extern int git__date_parse(git_time_t *out, const char *date); - -/* - * Format a git_time as a RFC2822 string - * - * @param out buffer to store formatted date; a '\\0' terminator will automatically be added. - * @param len size of the buffer; should be atleast `GIT_DATE_RFC2822_SZ` in size; - * @param date the date to be formatted - * @return 0 if successful; -1 on error - */ -extern int git__date_rfc2822_fmt(char *out, size_t len, const git_time *date); - -/* - * Unescapes a string in-place. - * - * Edge cases behavior: - * - "jackie\" -> "jacky\" - * - "chan\\" -> "chan\" - */ -extern size_t git__unescape(char *str); - -/* - * Iterate through an UTF-8 string, yielding one - * codepoint at a time. - * - * @param str current position in the string - * @param str_len size left in the string; -1 if the string is NULL-terminated - * @param dst pointer where to store the current codepoint - * @return length in bytes of the read codepoint; -1 if the codepoint was invalid - */ -extern int git__utf8_iterate(const uint8_t *str, int str_len, int32_t *dst); - -/* - * Safely zero-out memory, making sure that the compiler - * doesn't optimize away the operation. - */ -GIT_INLINE(void) git__memzero(void *data, size_t size) -{ -#ifdef _MSC_VER - SecureZeroMemory((PVOID)data, size); -#else - volatile uint8_t *scan = (volatile uint8_t *)data; - - while (size--) - *scan++ = 0x0; -#endif -} - -#ifdef GIT_WIN32 - -GIT_INLINE(double) git__timer(void) -{ - /* We need the initial tick count to detect if the tick - * count has rolled over. */ - static DWORD initial_tick_count = 0; - - /* GetTickCount returns the number of milliseconds that have - * elapsed since the system was started. */ - DWORD count = GetTickCount(); - - if(initial_tick_count == 0) { - initial_tick_count = count; - } else if (count < initial_tick_count) { - /* The tick count has rolled over - adjust for it. */ - count = (0xFFFFFFFF - initial_tick_count) + count; - } - - return (double) count / (double) 1000; -} - -#elif __APPLE__ - -#include - -GIT_INLINE(double) git__timer(void) -{ - uint64_t time = mach_absolute_time(); - static double scaling_factor = 0; - - if (scaling_factor == 0) { - mach_timebase_info_data_t info; - (void)mach_timebase_info(&info); - scaling_factor = (double)info.numer / (double)info.denom; - } - - return (double)time * scaling_factor / 1.0E9; -} - -#elif defined(AMIGA) - -#include - -GIT_INLINE(double) git__timer(void) -{ - struct TimeVal tv; - ITimer->GetUpTime(&tv); - return (double)tv.Seconds + (double)tv.Microseconds / 1.0E6; -} - -#else - -#include - -GIT_INLINE(double) git__timer(void) -{ - struct timespec tp; - - if (clock_gettime(CLOCK_MONOTONIC, &tp) == 0) { - return (double) tp.tv_sec + (double) tp.tv_nsec / 1.0E9; - } else { - /* Fall back to using gettimeofday */ - struct timeval tv; - struct timezone tz; - gettimeofday(&tv, &tz); - return (double)tv.tv_sec + (double)tv.tv_usec / 1.0E6; - } -} - -#endif - -#endif /* INCLUDE_util_h__ */ diff --git a/vendor/libgit2/src/vector.c b/vendor/libgit2/src/vector.c deleted file mode 100644 index 93d09bb5b5..0000000000 --- a/vendor/libgit2/src/vector.c +++ /dev/null @@ -1,354 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#include "common.h" -#include "vector.h" - -/* In elements, not bytes */ -#define MIN_ALLOCSIZE 8 - -GIT_INLINE(size_t) compute_new_size(git_vector *v) -{ - size_t new_size = v->_alloc_size; - - /* Use a resize factor of 1.5, which is quick to compute using integer - * instructions and less than the golden ratio (1.618...) */ - if (new_size < MIN_ALLOCSIZE) - new_size = MIN_ALLOCSIZE; - else if (new_size <= (SIZE_MAX / 3) * 2) - new_size += new_size / 2; - else - new_size = SIZE_MAX; - - return new_size; -} - -GIT_INLINE(int) resize_vector(git_vector *v, size_t new_size) -{ - void *new_contents; - - new_contents = git__reallocarray(v->contents, new_size, sizeof(void *)); - GITERR_CHECK_ALLOC(new_contents); - - v->_alloc_size = new_size; - v->contents = new_contents; - - return 0; -} - -int git_vector_dup(git_vector *v, const git_vector *src, git_vector_cmp cmp) -{ - size_t bytes; - - assert(v && src); - - GITERR_CHECK_ALLOC_MULTIPLY(&bytes, src->length, sizeof(void *)); - - v->_alloc_size = src->length; - v->_cmp = cmp ? cmp : src->_cmp; - v->length = src->length; - v->flags = src->flags; - if (cmp != src->_cmp) - git_vector_set_sorted(v, 0); - v->contents = git__malloc(bytes); - GITERR_CHECK_ALLOC(v->contents); - - memcpy(v->contents, src->contents, bytes); - - return 0; -} - -void git_vector_free(git_vector *v) -{ - assert(v); - - git__free(v->contents); - v->contents = NULL; - - v->length = 0; - v->_alloc_size = 0; -} - -void git_vector_free_deep(git_vector *v) -{ - size_t i; - - assert(v); - - for (i = 0; i < v->length; ++i) { - git__free(v->contents[i]); - v->contents[i] = NULL; - } - - git_vector_free(v); -} - -int git_vector_init(git_vector *v, size_t initial_size, git_vector_cmp cmp) -{ - assert(v); - - v->_alloc_size = 0; - v->_cmp = cmp; - v->length = 0; - v->flags = GIT_VECTOR_SORTED; - v->contents = NULL; - - return resize_vector(v, max(initial_size, MIN_ALLOCSIZE)); -} - -void **git_vector_detach(size_t *size, size_t *asize, git_vector *v) -{ - void **data = v->contents; - - if (size) - *size = v->length; - if (asize) - *asize = v->_alloc_size; - - v->_alloc_size = 0; - v->length = 0; - v->contents = NULL; - - return data; -} - -int git_vector_insert(git_vector *v, void *element) -{ - assert(v); - - if (v->length >= v->_alloc_size && - resize_vector(v, compute_new_size(v)) < 0) - return -1; - - v->contents[v->length++] = element; - - git_vector_set_sorted(v, v->length <= 1); - - return 0; -} - -int git_vector_insert_sorted( - git_vector *v, void *element, int (*on_dup)(void **old, void *new)) -{ - int result; - size_t pos; - - assert(v && v->_cmp); - - if (!git_vector_is_sorted(v)) - git_vector_sort(v); - - if (v->length >= v->_alloc_size && - resize_vector(v, compute_new_size(v)) < 0) - return -1; - - /* If we find the element and have a duplicate handler callback, - * invoke it. If it returns non-zero, then cancel insert, otherwise - * proceed with normal insert. - */ - if (!git__bsearch(v->contents, v->length, element, v->_cmp, &pos) && - on_dup && (result = on_dup(&v->contents[pos], element)) < 0) - return result; - - /* shift elements to the right */ - if (pos < v->length) - memmove(v->contents + pos + 1, v->contents + pos, - (v->length - pos) * sizeof(void *)); - - v->contents[pos] = element; - v->length++; - - return 0; -} - -void git_vector_sort(git_vector *v) -{ - assert(v); - - if (git_vector_is_sorted(v) || !v->_cmp) - return; - - if (v->length > 1) - git__tsort(v->contents, v->length, v->_cmp); - git_vector_set_sorted(v, 1); -} - -int git_vector_bsearch2( - size_t *at_pos, - git_vector *v, - git_vector_cmp key_lookup, - const void *key) -{ - assert(v && key && key_lookup); - - /* need comparison function to sort the vector */ - if (!v->_cmp) - return -1; - - git_vector_sort(v); - - return git__bsearch(v->contents, v->length, key, key_lookup, at_pos); -} - -int git_vector_search2( - size_t *at_pos, const git_vector *v, git_vector_cmp key_lookup, const void *key) -{ - size_t i; - - assert(v && key && key_lookup); - - for (i = 0; i < v->length; ++i) { - if (key_lookup(key, v->contents[i]) == 0) { - if (at_pos) - *at_pos = i; - - return 0; - } - } - - return GIT_ENOTFOUND; -} - -static int strict_comparison(const void *a, const void *b) -{ - return (a == b) ? 0 : -1; -} - -int git_vector_search(size_t *at_pos, const git_vector *v, const void *entry) -{ - return git_vector_search2(at_pos, v, v->_cmp ? v->_cmp : strict_comparison, entry); -} - -int git_vector_remove(git_vector *v, size_t idx) -{ - size_t shift_count; - - assert(v); - - if (idx >= v->length) - return GIT_ENOTFOUND; - - shift_count = v->length - idx - 1; - - if (shift_count) - memmove(&v->contents[idx], &v->contents[idx + 1], - shift_count * sizeof(void *)); - - v->length--; - return 0; -} - -void git_vector_pop(git_vector *v) -{ - if (v->length > 0) - v->length--; -} - -void git_vector_uniq(git_vector *v, void (*git_free_cb)(void *)) -{ - git_vector_cmp cmp; - size_t i, j; - - if (v->length <= 1) - return; - - git_vector_sort(v); - cmp = v->_cmp ? v->_cmp : strict_comparison; - - for (i = 0, j = 1 ; j < v->length; ++j) - if (!cmp(v->contents[i], v->contents[j])) { - if (git_free_cb) - git_free_cb(v->contents[i]); - - v->contents[i] = v->contents[j]; - } else - v->contents[++i] = v->contents[j]; - - v->length -= j - i - 1; -} - -void git_vector_remove_matching( - git_vector *v, - int (*match)(const git_vector *v, size_t idx, void *payload), - void *payload) -{ - size_t i, j; - - for (i = 0, j = 0; j < v->length; ++j) { - v->contents[i] = v->contents[j]; - - if (!match(v, i, payload)) - i++; - } - - v->length = i; -} - -void git_vector_clear(git_vector *v) -{ - assert(v); - v->length = 0; - git_vector_set_sorted(v, 1); -} - -void git_vector_swap(git_vector *a, git_vector *b) -{ - git_vector t; - - assert(a && b); - - if (a != b) { - memcpy(&t, a, sizeof(t)); - memcpy(a, b, sizeof(t)); - memcpy(b, &t, sizeof(t)); - } -} - -int git_vector_resize_to(git_vector *v, size_t new_length) -{ - if (new_length > v->_alloc_size && - resize_vector(v, new_length) < 0) - return -1; - - if (new_length > v->length) - memset(&v->contents[v->length], 0, - sizeof(void *) * (new_length - v->length)); - - v->length = new_length; - - return 0; -} - -int git_vector_set(void **old, git_vector *v, size_t position, void *value) -{ - if (position + 1 > v->length) { - if (git_vector_resize_to(v, position + 1) < 0) - return -1; - } - - if (old != NULL) - *old = v->contents[position]; - - v->contents[position] = value; - - return 0; -} - -int git_vector_verify_sorted(const git_vector *v) -{ - size_t i; - - if (!git_vector_is_sorted(v)) - return -1; - - for (i = 1; i < v->length; ++i) { - if (v->_cmp(v->contents[i - 1], v->contents[i]) > 0) - return -1; - } - - return 0; -} diff --git a/vendor/libgit2/src/vector.h b/vendor/libgit2/src/vector.h deleted file mode 100644 index aac46c4b3f..0000000000 --- a/vendor/libgit2/src/vector.h +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_vector_h__ -#define INCLUDE_vector_h__ - -#include "common.h" - -typedef int (*git_vector_cmp)(const void *, const void *); - -enum { - GIT_VECTOR_SORTED = (1u << 0), - GIT_VECTOR_FLAG_MAX = (1u << 1), -}; - -typedef struct git_vector { - size_t _alloc_size; - git_vector_cmp _cmp; - void **contents; - size_t length; - uint32_t flags; -} git_vector; - -#define GIT_VECTOR_INIT {0} - -int git_vector_init(git_vector *v, size_t initial_size, git_vector_cmp cmp); -void git_vector_free(git_vector *v); -void git_vector_free_deep(git_vector *v); /* free each entry and self */ -void git_vector_clear(git_vector *v); -int git_vector_dup(git_vector *v, const git_vector *src, git_vector_cmp cmp); -void git_vector_swap(git_vector *a, git_vector *b); - -void **git_vector_detach(size_t *size, size_t *asize, git_vector *v); - -void git_vector_sort(git_vector *v); - -/** Linear search for matching entry using internal comparison function */ -int git_vector_search(size_t *at_pos, const git_vector *v, const void *entry); - -/** Linear search for matching entry using explicit comparison function */ -int git_vector_search2(size_t *at_pos, const git_vector *v, git_vector_cmp cmp, const void *key); - -/** - * Binary search for matching entry using explicit comparison function that - * returns position where item would go if not found. - */ -int git_vector_bsearch2( - size_t *at_pos, git_vector *v, git_vector_cmp cmp, const void *key); - -/** Binary search for matching entry using internal comparison function */ -GIT_INLINE(int) git_vector_bsearch(size_t *at_pos, git_vector *v, const void *key) -{ - return git_vector_bsearch2(at_pos, v, v->_cmp, key); -} - -GIT_INLINE(void *) git_vector_get(const git_vector *v, size_t position) -{ - return (position < v->length) ? v->contents[position] : NULL; -} - -#define GIT_VECTOR_GET(V,I) ((I) < (V)->length ? (V)->contents[(I)] : NULL) - -GIT_INLINE(size_t) git_vector_length(const git_vector *v) -{ - return v->length; -} - -GIT_INLINE(void *) git_vector_last(const git_vector *v) -{ - return (v->length > 0) ? git_vector_get(v, v->length - 1) : NULL; -} - -#define git_vector_foreach(v, iter, elem) \ - for ((iter) = 0; (iter) < (v)->length && ((elem) = (v)->contents[(iter)], 1); (iter)++ ) - -#define git_vector_rforeach(v, iter, elem) \ - for ((iter) = (v)->length - 1; (iter) < SIZE_MAX && ((elem) = (v)->contents[(iter)], 1); (iter)-- ) - -int git_vector_insert(git_vector *v, void *element); -int git_vector_insert_sorted(git_vector *v, void *element, - int (*on_dup)(void **old, void *new)); -int git_vector_remove(git_vector *v, size_t idx); -void git_vector_pop(git_vector *v); -void git_vector_uniq(git_vector *v, void (*git_free_cb)(void *)); - -void git_vector_remove_matching( - git_vector *v, - int (*match)(const git_vector *v, size_t idx, void *payload), - void *payload); - -int git_vector_resize_to(git_vector *v, size_t new_length); -int git_vector_set(void **old, git_vector *v, size_t position, void *value); - -/** Check if vector is sorted */ -#define git_vector_is_sorted(V) (((V)->flags & GIT_VECTOR_SORTED) != 0) - -/** Directly set sorted state of vector */ -#define git_vector_set_sorted(V,S) do { \ - (V)->flags = (S) ? ((V)->flags | GIT_VECTOR_SORTED) : \ - ((V)->flags & ~GIT_VECTOR_SORTED); } while (0) - -/** Set the comparison function used for sorting the vector */ -GIT_INLINE(void) git_vector_set_cmp(git_vector *v, git_vector_cmp cmp) -{ - if (cmp != v->_cmp) { - v->_cmp = cmp; - git_vector_set_sorted(v, 0); - } -} - -/* Just use this in tests, not for realz. returns -1 if not sorted */ -int git_vector_verify_sorted(const git_vector *v); - -#endif diff --git a/vendor/libgit2/src/win32/dir.c b/vendor/libgit2/src/win32/dir.c deleted file mode 100644 index c15757085b..0000000000 --- a/vendor/libgit2/src/win32/dir.c +++ /dev/null @@ -1,119 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#define GIT__WIN32_NO_WRAP_DIR -#include "posix.h" - -git__DIR *git__opendir(const char *dir) -{ - git_win32_path filter_w; - git__DIR *new = NULL; - size_t dirlen, alloclen; - - if (!dir || !git_win32__findfirstfile_filter(filter_w, dir)) - return NULL; - - dirlen = strlen(dir); - - if (GIT_ADD_SIZET_OVERFLOW(&alloclen, sizeof(*new), dirlen) || - GIT_ADD_SIZET_OVERFLOW(&alloclen, alloclen, 1) || - !(new = git__calloc(1, alloclen))) - return NULL; - - memcpy(new->dir, dir, dirlen); - - new->h = FindFirstFileW(filter_w, &new->f); - - if (new->h == INVALID_HANDLE_VALUE) { - giterr_set(GITERR_OS, "Could not open directory '%s'", dir); - git__free(new); - return NULL; - } - - new->first = 1; - return new; -} - -int git__readdir_ext( - git__DIR *d, - struct git__dirent *entry, - struct git__dirent **result, - int *is_dir) -{ - if (!d || !entry || !result || d->h == INVALID_HANDLE_VALUE) - return -1; - - *result = NULL; - - if (d->first) - d->first = 0; - else if (!FindNextFileW(d->h, &d->f)) { - if (GetLastError() == ERROR_NO_MORE_FILES) - return 0; - giterr_set(GITERR_OS, "Could not read from directory '%s'", d->dir); - return -1; - } - - /* Convert the path to UTF-8 */ - if (git_win32_path_to_utf8(entry->d_name, d->f.cFileName) < 0) - return -1; - - entry->d_ino = 0; - - *result = entry; - - if (is_dir != NULL) - *is_dir = ((d->f.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0); - - return 0; -} - -struct git__dirent *git__readdir(git__DIR *d) -{ - struct git__dirent *result; - if (git__readdir_ext(d, &d->entry, &result, NULL) < 0) - return NULL; - return result; -} - -void git__rewinddir(git__DIR *d) -{ - git_win32_path filter_w; - - if (!d) - return; - - if (d->h != INVALID_HANDLE_VALUE) { - FindClose(d->h); - d->h = INVALID_HANDLE_VALUE; - d->first = 0; - } - - if (!git_win32__findfirstfile_filter(filter_w, d->dir)) - return; - - d->h = FindFirstFileW(filter_w, &d->f); - - if (d->h == INVALID_HANDLE_VALUE) - giterr_set(GITERR_OS, "Could not open directory '%s'", d->dir); - else - d->first = 1; -} - -int git__closedir(git__DIR *d) -{ - if (!d) - return 0; - - if (d->h != INVALID_HANDLE_VALUE) { - FindClose(d->h); - d->h = INVALID_HANDLE_VALUE; - } - - git__free(d); - return 0; -} - diff --git a/vendor/libgit2/src/win32/dir.h b/vendor/libgit2/src/win32/dir.h deleted file mode 100644 index bef39d7740..0000000000 --- a/vendor/libgit2/src/win32/dir.h +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_dir_h__ -#define INCLUDE_dir_h__ - -#include "common.h" -#include "w32_util.h" - -struct git__dirent { - int d_ino; - git_win32_utf8_path d_name; -}; - -typedef struct { - HANDLE h; - WIN32_FIND_DATAW f; - struct git__dirent entry; - int first; - char dir[GIT_FLEX_ARRAY]; -} git__DIR; - -extern git__DIR *git__opendir(const char *); -extern struct git__dirent *git__readdir(git__DIR *); -extern int git__readdir_ext( - git__DIR *, struct git__dirent *, struct git__dirent **, int *); -extern void git__rewinddir(git__DIR *); -extern int git__closedir(git__DIR *); - -# ifndef GIT__WIN32_NO_WRAP_DIR -# define dirent git__dirent -# define DIR git__DIR -# define opendir git__opendir -# define readdir git__readdir -# define readdir_r(d,e,r) git__readdir_ext((d),(e),(r),NULL) -# define rewinddir git__rewinddir -# define closedir git__closedir -# endif - -#endif /* INCLUDE_dir_h__ */ diff --git a/vendor/libgit2/src/win32/error.c b/vendor/libgit2/src/win32/error.c deleted file mode 100644 index 6b450093f0..0000000000 --- a/vendor/libgit2/src/win32/error.c +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#include "common.h" -#include "error.h" -#include "utf-conv.h" - -#ifdef GIT_WINHTTP -# include -#endif - -char *git_win32_get_error_message(DWORD error_code) -{ - LPWSTR lpMsgBuf = NULL; - HMODULE hModule = NULL; - char *utf8_msg = NULL; - DWORD dwFlags = - FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_IGNORE_INSERTS; - - if (!error_code) - return NULL; - -#ifdef GIT_WINHTTP - /* Errors raised by WinHTTP are not in the system resource table */ - if (error_code >= WINHTTP_ERROR_BASE && - error_code <= WINHTTP_ERROR_LAST) - hModule = GetModuleHandleW(L"winhttp"); -#endif - - GIT_UNUSED(hModule); - - if (hModule) - dwFlags |= FORMAT_MESSAGE_FROM_HMODULE; - else - dwFlags |= FORMAT_MESSAGE_FROM_SYSTEM; - - if (FormatMessageW(dwFlags, hModule, error_code, - MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), - (LPWSTR)&lpMsgBuf, 0, NULL)) { - /* Convert the message to UTF-8. If this fails, we will - * return NULL, which is a condition expected by the caller */ - if (git__utf16_to_8_alloc(&utf8_msg, lpMsgBuf) < 0) - utf8_msg = NULL; - - LocalFree(lpMsgBuf); - } - - return utf8_msg; -} diff --git a/vendor/libgit2/src/win32/error.h b/vendor/libgit2/src/win32/error.h deleted file mode 100644 index 12947a2e67..0000000000 --- a/vendor/libgit2/src/win32/error.h +++ /dev/null @@ -1,13 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#ifndef INCLUDE_git_win32_error_h__ -#define INCLUDE_git_win32_error_h__ - -extern char *git_win32_get_error_message(DWORD error_code); - -#endif diff --git a/vendor/libgit2/src/win32/findfile.c b/vendor/libgit2/src/win32/findfile.c deleted file mode 100644 index de27dd0606..0000000000 --- a/vendor/libgit2/src/win32/findfile.c +++ /dev/null @@ -1,217 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#include "path_w32.h" -#include "utf-conv.h" -#include "path.h" -#include "findfile.h" - -#define REG_MSYSGIT_INSTALL_LOCAL L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\Git_is1" - -#ifndef _WIN64 -#define REG_MSYSGIT_INSTALL REG_MSYSGIT_INSTALL_LOCAL -#else -#define REG_MSYSGIT_INSTALL L"SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\Git_is1" -#endif - -typedef struct { - git_win32_path path; - DWORD len; -} _findfile_path; - -static int git_win32__expand_path(_findfile_path *dest, const wchar_t *src) -{ - dest->len = ExpandEnvironmentStringsW(src, dest->path, ARRAY_SIZE(dest->path)); - - if (!dest->len || dest->len > ARRAY_SIZE(dest->path)) - return -1; - - return 0; -} - -static int win32_path_to_8(git_buf *dest, const wchar_t *src) -{ - git_win32_utf8_path utf8_path; - - if (git_win32_path_to_utf8(utf8_path, src) < 0) { - giterr_set(GITERR_OS, "Unable to convert path to UTF-8"); - return -1; - } - - /* Convert backslashes to forward slashes */ - git_path_mkposix(utf8_path); - - return git_buf_sets(dest, utf8_path); -} - -static wchar_t* win32_walkpath(wchar_t *path, wchar_t *buf, size_t buflen) -{ - wchar_t term, *base = path; - - assert(path && buf && buflen); - - term = (*path == L'"') ? *path++ : L';'; - - for (buflen--; *path && *path != term && buflen; buflen--) - *buf++ = *path++; - - *buf = L'\0'; /* reserved a byte via initial subtract */ - - while (*path == term || *path == L';') - path++; - - return (path != base) ? path : NULL; -} - -static int win32_find_git_in_path(git_buf *buf, const wchar_t *gitexe, const wchar_t *subdir) -{ - wchar_t *env = _wgetenv(L"PATH"), lastch; - _findfile_path root; - size_t gitexe_len = wcslen(gitexe); - - if (!env) - return -1; - - while ((env = win32_walkpath(env, root.path, MAX_PATH-1)) && *root.path) { - root.len = (DWORD)wcslen(root.path); - lastch = root.path[root.len - 1]; - - /* ensure trailing slash (MAX_PATH-1 to walkpath guarantees space) */ - if (lastch != L'/' && lastch != L'\\') { - root.path[root.len++] = L'\\'; - root.path[root.len] = L'\0'; - } - - if (root.len + gitexe_len >= MAX_PATH) - continue; - wcscpy(&root.path[root.len], gitexe); - - if (_waccess(root.path, F_OK) == 0 && root.len > 5) { - /* replace "bin\\" or "cmd\\" with subdir */ - wcscpy(&root.path[root.len - 4], subdir); - - win32_path_to_8(buf, root.path); - return 0; - } - } - - return GIT_ENOTFOUND; -} - -static int win32_find_git_in_registry( - git_buf *buf, const HKEY hive, const wchar_t *key, const wchar_t *subdir) -{ - HKEY hKey; - int error = GIT_ENOTFOUND; - - assert(buf); - - if (!RegOpenKeyExW(hive, key, 0, KEY_READ, &hKey)) { - DWORD dwType, cbData; - git_win32_path path; - - /* Ensure that the buffer is big enough to have the suffix attached - * after we receive the result. */ - cbData = (DWORD)(sizeof(path) - wcslen(subdir) * sizeof(wchar_t)); - - /* InstallLocation points to the root of the git directory */ - if (!RegQueryValueExW(hKey, L"InstallLocation", NULL, &dwType, (LPBYTE)path, &cbData) && - dwType == REG_SZ) { - - /* Append the suffix */ - wcscat(path, subdir); - - /* Convert to UTF-8, with forward slashes, and output the path - * to the provided buffer */ - if (!win32_path_to_8(buf, path)) - error = 0; - } - - RegCloseKey(hKey); - } - - return error; -} - -static int win32_find_existing_dirs( - git_buf *out, const wchar_t *tmpl[]) -{ - _findfile_path path16; - git_buf buf = GIT_BUF_INIT; - - git_buf_clear(out); - - for (; *tmpl != NULL; tmpl++) { - if (!git_win32__expand_path(&path16, *tmpl) && - path16.path[0] != L'%' && - !_waccess(path16.path, F_OK)) - { - win32_path_to_8(&buf, path16.path); - - if (buf.size) - git_buf_join(out, GIT_PATH_LIST_SEPARATOR, out->ptr, buf.ptr); - } - } - - git_buf_free(&buf); - - return (git_buf_oom(out) ? -1 : 0); -} - -int git_win32__find_system_dirs(git_buf *out, const wchar_t *subdir) -{ - git_buf buf = GIT_BUF_INIT; - - /* directories where git.exe & git.cmd are found */ - if (!win32_find_git_in_path(&buf, L"git.exe", subdir) && buf.size) - git_buf_set(out, buf.ptr, buf.size); - else - git_buf_clear(out); - - if (!win32_find_git_in_path(&buf, L"git.cmd", subdir) && buf.size) - git_buf_join(out, GIT_PATH_LIST_SEPARATOR, out->ptr, buf.ptr); - - /* directories where git is installed according to registry */ - if (!win32_find_git_in_registry( - &buf, HKEY_CURRENT_USER, REG_MSYSGIT_INSTALL_LOCAL, subdir) && buf.size) - git_buf_join(out, GIT_PATH_LIST_SEPARATOR, out->ptr, buf.ptr); - - if (!win32_find_git_in_registry( - &buf, HKEY_LOCAL_MACHINE, REG_MSYSGIT_INSTALL, subdir) && buf.size) - git_buf_join(out, GIT_PATH_LIST_SEPARATOR, out->ptr, buf.ptr); - - git_buf_free(&buf); - - return (git_buf_oom(out) ? -1 : 0); -} - -int git_win32__find_global_dirs(git_buf *out) -{ - static const wchar_t *global_tmpls[4] = { - L"%HOME%\\", - L"%HOMEDRIVE%%HOMEPATH%\\", - L"%USERPROFILE%\\", - NULL, - }; - - return win32_find_existing_dirs(out, global_tmpls); -} - -int git_win32__find_xdg_dirs(git_buf *out) -{ - static const wchar_t *global_tmpls[7] = { - L"%XDG_CONFIG_HOME%\\git", - L"%APPDATA%\\git", - L"%LOCALAPPDATA%\\git", - L"%HOME%\\.config\\git", - L"%HOMEDRIVE%%HOMEPATH%\\.config\\git", - L"%USERPROFILE%\\.config\\git", - NULL, - }; - - return win32_find_existing_dirs(out, global_tmpls); -} diff --git a/vendor/libgit2/src/win32/findfile.h b/vendor/libgit2/src/win32/findfile.h deleted file mode 100644 index a50319b9a3..0000000000 --- a/vendor/libgit2/src/win32/findfile.h +++ /dev/null @@ -1,16 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#ifndef INCLUDE_git_findfile_h__ -#define INCLUDE_git_findfile_h__ - -extern int git_win32__find_system_dirs(git_buf *out, const wchar_t *subpath); -extern int git_win32__find_global_dirs(git_buf *out); -extern int git_win32__find_xdg_dirs(git_buf *out); - -#endif - diff --git a/vendor/libgit2/src/win32/git2.rc b/vendor/libgit2/src/win32/git2.rc deleted file mode 100644 index 3571bc6836..0000000000 --- a/vendor/libgit2/src/win32/git2.rc +++ /dev/null @@ -1,44 +0,0 @@ -#include -#include "../../include/git2/version.h" - -#ifndef LIBGIT2_FILENAME -# define LIBGIT2_FILENAME "git2" -#endif - -#ifndef LIBGIT2_COMMENTS -# define LIBGIT2_COMMENTS "For more information visit http://libgit2.github.com/" -#endif - -VS_VERSION_INFO VERSIONINFO MOVEABLE IMPURE LOADONCALL DISCARDABLE - FILEVERSION LIBGIT2_VER_MAJOR,LIBGIT2_VER_MINOR,LIBGIT2_VER_REVISION,LIBGIT2_VER_PATCH - PRODUCTVERSION LIBGIT2_VER_MAJOR,LIBGIT2_VER_MINOR,LIBGIT2_VER_REVISION,LIBGIT2_VER_PATCH - FILEFLAGSMASK VS_FFI_FILEFLAGSMASK -#ifdef _DEBUG - FILEFLAGS VS_FF_DEBUG -#else - FILEFLAGS 0 -#endif - FILEOS VOS_NT_WINDOWS32 - FILETYPE VFT_DLL - FILESUBTYPE VFT2_UNKNOWN -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "040904E4" - //language ID = U.S. English, char set = Windows, Multilingual - BEGIN - VALUE "FileDescription", "libgit2 - the Git linkable library\0" - VALUE "FileVersion", LIBGIT2_VERSION "\0" - VALUE "InternalName", LIBGIT2_FILENAME ".dll\0" - VALUE "LegalCopyright", "Copyright (C) the libgit2 contributors. All rights reserved.\0" - VALUE "OriginalFilename", LIBGIT2_FILENAME ".dll\0" - VALUE "ProductName", "libgit2\0" - VALUE "ProductVersion", LIBGIT2_VERSION "\0" - VALUE "Comments", LIBGIT2_COMMENTS "\0" - END - END - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x0409, 1252 - END -END diff --git a/vendor/libgit2/src/win32/map.c b/vendor/libgit2/src/win32/map.c deleted file mode 100644 index a99c30f7e4..0000000000 --- a/vendor/libgit2/src/win32/map.c +++ /dev/null @@ -1,122 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#include "map.h" -#include - -#ifndef NO_MMAP - -static DWORD get_page_size(void) -{ - static DWORD page_size; - SYSTEM_INFO sys; - - if (!page_size) { - GetSystemInfo(&sys); - page_size = sys.dwAllocationGranularity; - } - - return page_size; -} - -int git__page_size(size_t *page_size) -{ - *page_size = get_page_size(); - return 0; -} - -int p_mmap(git_map *out, size_t len, int prot, int flags, int fd, git_off_t offset) -{ - HANDLE fh = (HANDLE)_get_osfhandle(fd); - DWORD page_size = get_page_size(); - DWORD fmap_prot = 0; - DWORD view_prot = 0; - DWORD off_low = 0; - DWORD off_hi = 0; - git_off_t page_start; - git_off_t page_offset; - - GIT_MMAP_VALIDATE(out, len, prot, flags); - - out->data = NULL; - out->len = 0; - out->fmh = NULL; - - if (fh == INVALID_HANDLE_VALUE) { - errno = EBADF; - giterr_set(GITERR_OS, "Failed to mmap. Invalid handle value"); - return -1; - } - - if (prot & GIT_PROT_WRITE) - fmap_prot |= PAGE_READWRITE; - else if (prot & GIT_PROT_READ) - fmap_prot |= PAGE_READONLY; - - if (prot & GIT_PROT_WRITE) - view_prot |= FILE_MAP_WRITE; - if (prot & GIT_PROT_READ) - view_prot |= FILE_MAP_READ; - - page_start = (offset / page_size) * page_size; - page_offset = offset - page_start; - - if (page_offset != 0) { /* offset must be multiple of page size */ - errno = EINVAL; - giterr_set(GITERR_OS, "Failed to mmap. Offset must be multiple of page size"); - return -1; - } - - out->fmh = CreateFileMapping(fh, NULL, fmap_prot, 0, 0, NULL); - if (!out->fmh || out->fmh == INVALID_HANDLE_VALUE) { - giterr_set(GITERR_OS, "Failed to mmap. Invalid handle value"); - out->fmh = NULL; - return -1; - } - - assert(sizeof(git_off_t) == 8); - - off_low = (DWORD)(page_start); - off_hi = (DWORD)(page_start >> 32); - out->data = MapViewOfFile(out->fmh, view_prot, off_hi, off_low, len); - if (!out->data) { - giterr_set(GITERR_OS, "Failed to mmap. No data written"); - CloseHandle(out->fmh); - out->fmh = NULL; - return -1; - } - out->len = len; - - return 0; -} - -int p_munmap(git_map *map) -{ - int error = 0; - - assert(map != NULL); - - if (map->data) { - if (!UnmapViewOfFile(map->data)) { - giterr_set(GITERR_OS, "Failed to munmap. Could not unmap view of file"); - error = -1; - } - map->data = NULL; - } - - if (map->fmh) { - if (!CloseHandle(map->fmh)) { - giterr_set(GITERR_OS, "Failed to munmap. Could not close handle"); - error = -1; - } - map->fmh = NULL; - } - - return error; -} - -#endif diff --git a/vendor/libgit2/src/win32/mingw-compat.h b/vendor/libgit2/src/win32/mingw-compat.h deleted file mode 100644 index a4a5a31c78..0000000000 --- a/vendor/libgit2/src/win32/mingw-compat.h +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_mingw_compat__ -#define INCLUDE_mingw_compat__ - -#if defined(__MINGW32__) - -#undef stat - -#if _WIN32_WINNT >= 0x0601 -#define stat __stat64 -#else -#define stat _stati64 -#endif - -#if _WIN32_WINNT < 0x0600 && !defined(__MINGW64_VERSION_MAJOR) -#undef MemoryBarrier -void __mingworg_MemoryBarrier(void); -#define MemoryBarrier __mingworg_MemoryBarrier -#define VOLUME_NAME_DOS 0x0 -#endif - -#endif - -#endif /* INCLUDE_mingw_compat__ */ diff --git a/vendor/libgit2/src/win32/msvc-compat.h b/vendor/libgit2/src/win32/msvc-compat.h deleted file mode 100644 index 8004bc1f84..0000000000 --- a/vendor/libgit2/src/win32/msvc-compat.h +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_msvc_compat__ -#define INCLUDE_msvc_compat__ - -#if defined(_MSC_VER) - -/* 64-bit stat information, regardless of USE_32BIT_TIME_T define */ -#define stat __stat64 - -typedef unsigned short mode_t; -typedef SSIZE_T ssize_t; - -#define strcasecmp(s1, s2) _stricmp(s1, s2) -#define strncasecmp(s1, s2, c) _strnicmp(s1, s2, c) - -#endif - -#define GIT_STDLIB_CALL __cdecl - -#endif /* INCLUDE_msvc_compat__ */ diff --git a/vendor/libgit2/src/win32/path_w32.c b/vendor/libgit2/src/win32/path_w32.c deleted file mode 100644 index 118e8bcc56..0000000000 --- a/vendor/libgit2/src/win32/path_w32.c +++ /dev/null @@ -1,380 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#include "common.h" -#include "path.h" -#include "path_w32.h" -#include "utf-conv.h" -#include "posix.h" -#include "reparse.h" -#include "dir.h" - -#define PATH__NT_NAMESPACE L"\\\\?\\" -#define PATH__NT_NAMESPACE_LEN 4 - -#define PATH__ABSOLUTE_LEN 3 - -#define path__is_dirsep(p) ((p) == '/' || (p) == '\\') - -#define path__is_absolute(p) \ - (git__isalpha((p)[0]) && (p)[1] == ':' && ((p)[2] == '\\' || (p)[2] == '/')) - -#define path__is_nt_namespace(p) \ - (((p)[0] == '\\' && (p)[1] == '\\' && (p)[2] == '?' && (p)[3] == '\\') || \ - ((p)[0] == '/' && (p)[1] == '/' && (p)[2] == '?' && (p)[3] == '/')) - -#define path__is_unc(p) \ - (((p)[0] == '\\' && (p)[1] == '\\') || ((p)[0] == '/' && (p)[1] == '/')) - -GIT_INLINE(int) path__cwd(wchar_t *path, int size) -{ - int len; - - if ((len = GetCurrentDirectoryW(size, path)) == 0) { - errno = GetLastError() == ERROR_ACCESS_DENIED ? EACCES : ENOENT; - return -1; - } else if (len > size) { - errno = ENAMETOOLONG; - return -1; - } - - /* The Win32 APIs may return "\\?\" once you've used it first. - * But it may not. What a gloriously predictible API! - */ - if (wcsncmp(path, PATH__NT_NAMESPACE, PATH__NT_NAMESPACE_LEN)) - return len; - - len -= PATH__NT_NAMESPACE_LEN; - - memmove(path, path + PATH__NT_NAMESPACE_LEN, sizeof(wchar_t) * len); - return len; -} - -static wchar_t *path__skip_server(wchar_t *path) -{ - wchar_t *c; - - for (c = path; *c; c++) { - if (path__is_dirsep(*c)) - return c + 1; - } - - return c; -} - -static wchar_t *path__skip_prefix(wchar_t *path) -{ - if (path__is_nt_namespace(path)) { - path += PATH__NT_NAMESPACE_LEN; - - if (wcsncmp(path, L"UNC\\", 4) == 0) - path = path__skip_server(path + 4); - else if (path__is_absolute(path)) - path += PATH__ABSOLUTE_LEN; - } else if (path__is_absolute(path)) { - path += PATH__ABSOLUTE_LEN; - } else if (path__is_unc(path)) { - path = path__skip_server(path + 2); - } - - return path; -} - -int git_win32_path_canonicalize(git_win32_path path) -{ - wchar_t *base, *from, *to, *next; - size_t len; - - base = to = path__skip_prefix(path); - - /* Unposixify if the prefix */ - for (from = path; from < to; from++) { - if (*from == L'/') - *from = L'\\'; - } - - while (*from) { - for (next = from; *next; ++next) { - if (*next == L'/') { - *next = L'\\'; - break; - } - - if (*next == L'\\') - break; - } - - len = next - from; - - if (len == 1 && from[0] == L'.') - /* do nothing with singleton dot */; - - else if (len == 2 && from[0] == L'.' && from[1] == L'.') { - if (to == base) { - /* no more path segments to strip, eat the "../" */ - if (*next == L'\\') - len++; - - base = to; - } else { - /* back up a path segment */ - while (to > base && to[-1] == L'\\') to--; - while (to > base && to[-1] != L'\\') to--; - } - } else { - if (*next == L'\\' && *from != L'\\') - len++; - - if (to != from) - memmove(to, from, sizeof(wchar_t) * len); - - to += len; - } - - from += len; - - while (*from == L'\\') from++; - } - - /* Strip trailing backslashes */ - while (to > base && to[-1] == L'\\') to--; - - *to = L'\0'; - - return (to - path); -} - -int git_win32_path__cwd(wchar_t *out, size_t len) -{ - int cwd_len; - - if ((cwd_len = path__cwd(out, len)) < 0) - return -1; - - /* UNC paths */ - if (wcsncmp(L"\\\\", out, 2) == 0) { - /* Our buffer must be at least 5 characters larger than the - * current working directory: we swallow one of the leading - * '\'s, but we we add a 'UNC' specifier to the path, plus - * a trailing directory separator, plus a NUL. - */ - if (cwd_len > MAX_PATH - 4) { - errno = ENAMETOOLONG; - return -1; - } - - memmove(out+2, out, sizeof(wchar_t) * cwd_len); - out[0] = L'U'; - out[1] = L'N'; - out[2] = L'C'; - - cwd_len += 2; - } - - /* Our buffer must be at least 2 characters larger than the current - * working directory. (One character for the directory separator, - * one for the null. - */ - else if (cwd_len > MAX_PATH - 2) { - errno = ENAMETOOLONG; - return -1; - } - - return cwd_len; -} - -int git_win32_path_from_utf8(git_win32_path out, const char *src) -{ - wchar_t *dest = out; - - /* All win32 paths are in NT-prefixed format, beginning with "\\?\". */ - memcpy(dest, PATH__NT_NAMESPACE, sizeof(wchar_t) * PATH__NT_NAMESPACE_LEN); - dest += PATH__NT_NAMESPACE_LEN; - - /* See if this is an absolute path (beginning with a drive letter) */ - if (path__is_absolute(src)) { - if (git__utf8_to_16(dest, MAX_PATH, src) < 0) - return -1; - } - /* File-prefixed NT-style paths beginning with \\?\ */ - else if (path__is_nt_namespace(src)) { - /* Skip the NT prefix, the destination already contains it */ - if (git__utf8_to_16(dest, MAX_PATH, src + PATH__NT_NAMESPACE_LEN) < 0) - return -1; - } - /* UNC paths */ - else if (path__is_unc(src)) { - memcpy(dest, L"UNC\\", sizeof(wchar_t) * 4); - dest += 4; - - /* Skip the leading "\\" */ - if (git__utf8_to_16(dest, MAX_PATH - 2, src + 2) < 0) - return -1; - } - /* Absolute paths omitting the drive letter */ - else if (src[0] == '\\' || src[0] == '/') { - if (path__cwd(dest, MAX_PATH) < 0) - return -1; - - if (!path__is_absolute(dest)) { - errno = ENOENT; - return -1; - } - - /* Skip the drive letter specification ("C:") */ - if (git__utf8_to_16(dest + 2, MAX_PATH - 2, src) < 0) - return -1; - } - /* Relative paths */ - else { - int cwd_len; - - if ((cwd_len = git_win32_path__cwd(dest, MAX_PATH)) < 0) - return -1; - - dest[cwd_len++] = L'\\'; - - if (git__utf8_to_16(dest + cwd_len, MAX_PATH - cwd_len, src) < 0) - return -1; - } - - return git_win32_path_canonicalize(out); -} - -int git_win32_path_to_utf8(git_win32_utf8_path dest, const wchar_t *src) -{ - char *out = dest; - int len; - - /* Strip NT namespacing "\\?\" */ - if (path__is_nt_namespace(src)) { - src += 4; - - /* "\\?\UNC\server\share" -> "\\server\share" */ - if (wcsncmp(src, L"UNC\\", 4) == 0) { - src += 4; - - memcpy(dest, "\\\\", 2); - out = dest + 2; - } - } - - if ((len = git__utf16_to_8(out, GIT_WIN_PATH_UTF8, src)) < 0) - return len; - - git_path_mkposix(dest); - - return len; -} - -char *git_win32_path_8dot3_name(const char *path) -{ - git_win32_path longpath, shortpath; - wchar_t *start; - char *shortname; - int len, namelen = 1; - - if (git_win32_path_from_utf8(longpath, path) < 0) - return NULL; - - len = GetShortPathNameW(longpath, shortpath, GIT_WIN_PATH_UTF16); - - while (len && shortpath[len-1] == L'\\') - shortpath[--len] = L'\0'; - - if (len == 0 || len >= GIT_WIN_PATH_UTF16) - return NULL; - - for (start = shortpath + (len - 1); - start > shortpath && *(start-1) != '/' && *(start-1) != '\\'; - start--) - namelen++; - - /* We may not have actually been given a short name. But if we have, - * it will be in the ASCII byte range, so we don't need to worry about - * multi-byte sequences and can allocate naively. - */ - if (namelen > 12 || (shortname = git__malloc(namelen + 1)) == NULL) - return NULL; - - if ((len = git__utf16_to_8(shortname, namelen + 1, start)) < 0) - return NULL; - - return shortname; -} - -static bool path_is_volume(wchar_t *target, size_t target_len) -{ - return (target_len && wcsncmp(target, L"\\??\\Volume{", 11) == 0); -} - -/* On success, returns the length, in characters, of the path stored in dest. -* On failure, returns a negative value. */ -int git_win32_path_readlink_w(git_win32_path dest, const git_win32_path path) -{ - BYTE buf[MAXIMUM_REPARSE_DATA_BUFFER_SIZE]; - GIT_REPARSE_DATA_BUFFER *reparse_buf = (GIT_REPARSE_DATA_BUFFER *)buf; - HANDLE handle = NULL; - DWORD ioctl_ret; - wchar_t *target; - size_t target_len; - - int error = -1; - - handle = CreateFileW(path, GENERIC_READ, - FILE_SHARE_READ | FILE_SHARE_DELETE, NULL, OPEN_EXISTING, - FILE_FLAG_OPEN_REPARSE_POINT | FILE_FLAG_BACKUP_SEMANTICS, NULL); - - if (handle == INVALID_HANDLE_VALUE) { - errno = ENOENT; - return -1; - } - - if (!DeviceIoControl(handle, FSCTL_GET_REPARSE_POINT, NULL, 0, - reparse_buf, sizeof(buf), &ioctl_ret, NULL)) { - errno = EINVAL; - goto on_error; - } - - switch (reparse_buf->ReparseTag) { - case IO_REPARSE_TAG_SYMLINK: - target = reparse_buf->SymbolicLinkReparseBuffer.PathBuffer + - (reparse_buf->SymbolicLinkReparseBuffer.SubstituteNameOffset / sizeof(WCHAR)); - target_len = reparse_buf->SymbolicLinkReparseBuffer.SubstituteNameLength / sizeof(WCHAR); - break; - case IO_REPARSE_TAG_MOUNT_POINT: - target = reparse_buf->MountPointReparseBuffer.PathBuffer + - (reparse_buf->MountPointReparseBuffer.SubstituteNameOffset / sizeof(WCHAR)); - target_len = reparse_buf->MountPointReparseBuffer.SubstituteNameLength / sizeof(WCHAR); - break; - default: - errno = EINVAL; - goto on_error; - } - - if (path_is_volume(target, target_len)) { - /* This path is a reparse point that represents another volume mounted - * at this location, it is not a symbolic link our input was canonical. - */ - errno = EINVAL; - error = -1; - } else if (target_len) { - /* The path may need to have a prefix removed. */ - target_len = git_win32__canonicalize_path(target, target_len); - - /* Need one additional character in the target buffer - * for the terminating NULL. */ - if (GIT_WIN_PATH_UTF16 > target_len) { - wcscpy(dest, target); - error = (int)target_len; - } - } - -on_error: - CloseHandle(handle); - return error; -} diff --git a/vendor/libgit2/src/win32/path_w32.h b/vendor/libgit2/src/win32/path_w32.h deleted file mode 100644 index 3d9f828601..0000000000 --- a/vendor/libgit2/src/win32/path_w32.h +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_path_w32_h__ -#define INCLUDE_git_path_w32_h__ - -#include "common.h" -#include "vector.h" - -/* - * Provides a large enough buffer to support Windows paths: MAX_PATH is - * 260, corresponding to a maximum path length of 259 characters plus a - * NULL terminator. Prefixing with "\\?\" adds 4 characters, but if the - * original was a UNC path, then we turn "\\server\share" into - * "\\?\UNC\server\share". So we replace the first two characters with - * 8 characters, a net gain of 6, so the maximum length is MAX_PATH+6. - */ -#define GIT_WIN_PATH_UTF16 MAX_PATH+6 - -/* Maximum size of a UTF-8 Win32 path. We remove the "\\?\" or "\\?\UNC\" - * prefixes for presentation, bringing us back to 259 (non-NULL) - * characters. UTF-8 does have 4-byte sequences, but they are encoded in - * UTF-16 using surrogate pairs, which takes up the space of two characters. - * Two characters in the range U+0800 -> U+FFFF take up more space in UTF-8 - * (6 bytes) than one surrogate pair (4 bytes). - */ -#define GIT_WIN_PATH_UTF8 (259 * 3 + 1) - -/* - * The length of a Windows "shortname", for 8.3 compatibility. - */ -#define GIT_WIN_PATH_SHORTNAME 13 - -/* Win32 path types */ -typedef wchar_t git_win32_path[GIT_WIN_PATH_UTF16]; -typedef char git_win32_utf8_path[GIT_WIN_PATH_UTF8]; - -/** - * Create a Win32 path (in UCS-2 format) from a UTF-8 string. - * - * @param dest The buffer to receive the wide string. - * @param src The UTF-8 string to convert. - * @return The length of the wide string, in characters (not counting the NULL terminator), or < 0 for failure - */ -extern int git_win32_path_from_utf8(git_win32_path dest, const char *src); - -/** - * Canonicalize a Win32 UCS-2 path so that it is suitable for delivery to the - * Win32 APIs: remove multiple directory separators, squashing to a single one, - * strip trailing directory separators, ensure directory separators are all - * canonical (always backslashes, never forward slashes) and process any - * directory entries of '.' or '..'. - * - * This processes the buffer in place. - * - * @param path The buffer to process - * @return The new length of the buffer, in wchar_t's (not counting the NULL terminator) - */ -extern int git_win32_path_canonicalize(git_win32_path path); - -/** - * Create an internal format (posix-style) UTF-8 path from a Win32 UCS-2 path. - * - * @param dest The buffer to receive the UTF-8 string. - * @param src The wide string to convert. - * @return The length of the UTF-8 string, in bytes (not counting the NULL terminator), or < 0 for failure - */ -extern int git_win32_path_to_utf8(git_win32_utf8_path dest, const wchar_t *src); - -/** - * Get the short name for the terminal path component in the given path. - * For example, given "C:\Foo\Bar\Asdf.txt", this will return the short name - * for the file "Asdf.txt". - * - * @param path The given path in UTF-8 - * @return The name of the shortname for the given path - */ -extern char *git_win32_path_8dot3_name(const char *path); - -extern int git_win32_path_readlink_w(git_win32_path dest, const git_win32_path path); - -#endif diff --git a/vendor/libgit2/src/win32/posix.h b/vendor/libgit2/src/win32/posix.h deleted file mode 100644 index ac98fd864e..0000000000 --- a/vendor/libgit2/src/win32/posix.h +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_posix__w32_h__ -#define INCLUDE_posix__w32_h__ - -#include "common.h" -#include "../posix.h" -#include "path_w32.h" -#include "utf-conv.h" -#include "dir.h" - -typedef SOCKET GIT_SOCKET; - -#define p_lseek(f,n,w) _lseeki64(f, n, w) -#define p_fstat(f,b) _fstat64(f, b) -extern int p_lstat(const char *file_name, struct stat *buf); -extern int p_stat(const char* path, struct stat* buf); - -extern int p_utimes(const char *filename, const struct timeval times[2]); -extern int p_futimes(int fd, const struct timeval times[2]); - -extern int p_readlink(const char *path, char *buf, size_t bufsiz); -extern int p_symlink(const char *old, const char *new); -extern int p_link(const char *old, const char *new); -extern int p_unlink(const char *path); -extern int p_mkdir(const char *path, mode_t mode); -extern int p_fsync(int fd); -extern char *p_realpath(const char *orig_path, char *buffer); - -extern int p_recv(GIT_SOCKET socket, void *buffer, size_t length, int flags); -extern int p_send(GIT_SOCKET socket, const void *buffer, size_t length, int flags); -extern int p_inet_pton(int af, const char* src, void* dst); - -extern int p_vsnprintf(char *buffer, size_t count, const char *format, va_list argptr); -extern int p_snprintf(char *buffer, size_t count, const char *format, ...) GIT_FORMAT_PRINTF(3, 4); -extern int p_mkstemp(char *tmp_path); -extern int p_chdir(const char* path); -extern int p_chmod(const char* path, mode_t mode); -extern int p_rmdir(const char* path); -extern int p_access(const char* path, mode_t mode); -extern int p_ftruncate(int fd, git_off_t size); - -/* p_lstat is almost but not quite POSIX correct. Specifically, the use of - * ENOTDIR is wrong, in that it does not mean precisely that a non-directory - * entry was encountered. Making it correct is potentially expensive, - * however, so this is a separate version of p_lstat to use when correct - * POSIX ENOTDIR semantics is required. - */ -extern int p_lstat_posixly(const char *filename, struct stat *buf); - -extern struct tm * p_localtime_r(const time_t *timer, struct tm *result); -extern struct tm * p_gmtime_r(const time_t *timer, struct tm *result); - -#endif diff --git a/vendor/libgit2/src/win32/posix_w32.c b/vendor/libgit2/src/win32/posix_w32.c deleted file mode 100644 index 504562b0e3..0000000000 --- a/vendor/libgit2/src/win32/posix_w32.c +++ /dev/null @@ -1,698 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#include "../posix.h" -#include "../fileops.h" -#include "path.h" -#include "path_w32.h" -#include "utf-conv.h" -#include "repository.h" -#include "reparse.h" -#include -#include -#include -#include - -#ifndef FILE_NAME_NORMALIZED -# define FILE_NAME_NORMALIZED 0 -#endif - -#ifndef IO_REPARSE_TAG_SYMLINK -#define IO_REPARSE_TAG_SYMLINK (0xA000000CL) -#endif - -/* Options which we always provide to _wopen. - * - * _O_BINARY - Raw access; no translation of CR or LF characters - * _O_NOINHERIT - Do not mark the created handle as inheritable by child processes. - * The Windows default is 'not inheritable', but the CRT's default (following - * POSIX convention) is 'inheritable'. We have no desire for our handles to be - * inheritable on Windows, so specify the flag to get default behavior back. */ -#define STANDARD_OPEN_FLAGS (_O_BINARY | _O_NOINHERIT) - -/* Allowable mode bits on Win32. Using mode bits that are not supported on - * Win32 (eg S_IRWXU) is generally ignored, but Wine warns loudly about it - * so we simply remove them. - */ -#define WIN32_MODE_MASK (_S_IREAD | _S_IWRITE) - -/* GetFinalPathNameByHandleW signature */ -typedef DWORD(WINAPI *PFGetFinalPathNameByHandleW)(HANDLE, LPWSTR, DWORD, DWORD); - -/** - * Truncate or extend file. - * - * We now take a "git_off_t" rather than "long" because - * files may be longer than 2Gb. - */ -int p_ftruncate(int fd, git_off_t size) -{ - if (size < 0) { - errno = EINVAL; - return -1; - } - -#if !defined(__MINGW32__) || defined(MINGW_HAS_SECURE_API) - return ((_chsize_s(fd, size) == 0) ? 0 : -1); -#else - /* TODO MINGW32 Find a replacement for _chsize() that handles big files. */ - if (size > INT32_MAX) { - errno = EFBIG; - return -1; - } - return _chsize(fd, (long)size); -#endif -} - -int p_mkdir(const char *path, mode_t mode) -{ - git_win32_path buf; - - GIT_UNUSED(mode); - - if (git_win32_path_from_utf8(buf, path) < 0) - return -1; - - return _wmkdir(buf); -} - -int p_link(const char *old, const char *new) -{ - GIT_UNUSED(old); - GIT_UNUSED(new); - errno = ENOSYS; - return -1; -} - -int p_unlink(const char *path) -{ - git_win32_path buf; - int error; - - if (git_win32_path_from_utf8(buf, path) < 0) - return -1; - - error = _wunlink(buf); - - /* If the file could not be deleted because it was - * read-only, clear the bit and try again */ - if (error == -1 && errno == EACCES) { - _wchmod(buf, 0666); - error = _wunlink(buf); - } - - return error; -} - -int p_fsync(int fd) -{ - HANDLE fh = (HANDLE)_get_osfhandle(fd); - - if (fh == INVALID_HANDLE_VALUE) { - errno = EBADF; - return -1; - } - - if (!FlushFileBuffers(fh)) { - DWORD code = GetLastError(); - - if (code == ERROR_INVALID_HANDLE) - errno = EINVAL; - else - errno = EIO; - - return -1; - } - - return 0; -} - -#define WIN32_IS_WSEP(CH) ((CH) == L'/' || (CH) == L'\\') - -static int lstat_w( - wchar_t *path, - struct stat *buf, - bool posix_enotdir) -{ - WIN32_FILE_ATTRIBUTE_DATA fdata; - - if (GetFileAttributesExW(path, GetFileExInfoStandard, &fdata)) { - if (!buf) - return 0; - - return git_win32__file_attribute_to_stat(buf, &fdata, path); - } - - errno = ENOENT; - - /* To match POSIX behavior, set ENOTDIR when any of the folders in the - * file path is a regular file, otherwise set ENOENT. - */ - if (posix_enotdir) { - size_t path_len = wcslen(path); - - /* scan up path until we find an existing item */ - while (1) { - DWORD attrs; - - /* remove last directory component */ - for (path_len--; path_len > 0 && !WIN32_IS_WSEP(path[path_len]); path_len--); - - if (path_len <= 0) - break; - - path[path_len] = L'\0'; - attrs = GetFileAttributesW(path); - - if (attrs != INVALID_FILE_ATTRIBUTES) { - if (!(attrs & FILE_ATTRIBUTE_DIRECTORY)) - errno = ENOTDIR; - break; - } - } - } - - return -1; -} - -static int do_lstat(const char *path, struct stat *buf, bool posixly_correct) -{ - git_win32_path path_w; - int len; - - if ((len = git_win32_path_from_utf8(path_w, path)) < 0) - return -1; - - git_win32__path_trim_end(path_w, len); - - return lstat_w(path_w, buf, posixly_correct); -} - -int p_lstat(const char *filename, struct stat *buf) -{ - return do_lstat(filename, buf, false); -} - -int p_lstat_posixly(const char *filename, struct stat *buf) -{ - return do_lstat(filename, buf, true); -} - -int p_utimes(const char *filename, const struct timeval times[2]) -{ - int fd, error; - - if ((fd = p_open(filename, O_RDWR)) < 0) - return fd; - - error = p_futimes(fd, times); - - close(fd); - return error; -} - -int p_futimes(int fd, const struct timeval times[2]) -{ - HANDLE handle; - FILETIME atime = {0}, mtime = {0}; - - if (times == NULL) { - SYSTEMTIME st; - - GetSystemTime(&st); - SystemTimeToFileTime(&st, &atime); - SystemTimeToFileTime(&st, &mtime); - } else { - git_win32__timeval_to_filetime(&atime, times[0]); - git_win32__timeval_to_filetime(&mtime, times[1]); - } - - if ((handle = (HANDLE)_get_osfhandle(fd)) == INVALID_HANDLE_VALUE) - return -1; - - if (SetFileTime(handle, NULL, &atime, &mtime) == 0) - return -1; - - return 0; -} - -int p_readlink(const char *path, char *buf, size_t bufsiz) -{ - git_win32_path path_w, target_w; - git_win32_utf8_path target; - int len; - - /* readlink(2) does not NULL-terminate the string written - * to the target buffer. Furthermore, the target buffer need - * not be large enough to hold the entire result. A truncated - * result should be written in this case. Since this truncation - * could occur in the middle of the encoding of a code point, - * we need to buffer the result on the stack. */ - - if (git_win32_path_from_utf8(path_w, path) < 0 || - git_win32_path_readlink_w(target_w, path_w) < 0 || - (len = git_win32_path_to_utf8(target, target_w)) < 0) - return -1; - - bufsiz = min((size_t)len, bufsiz); - memcpy(buf, target, bufsiz); - - return (int)bufsiz; -} - -int p_symlink(const char *old, const char *new) -{ - /* Real symlinks on NTFS require admin privileges. Until this changes, - * libgit2 just creates a text file with the link target in the contents. - */ - return git_futils_fake_symlink(old, new); -} - -int p_open(const char *path, int flags, ...) -{ - git_win32_path buf; - mode_t mode = 0; - - if (git_win32_path_from_utf8(buf, path) < 0) - return -1; - - if (flags & O_CREAT) { - va_list arg_list; - - va_start(arg_list, flags); - mode = (mode_t)va_arg(arg_list, int); - va_end(arg_list); - } - - return _wopen(buf, flags | STANDARD_OPEN_FLAGS, mode & WIN32_MODE_MASK); -} - -int p_creat(const char *path, mode_t mode) -{ - git_win32_path buf; - - if (git_win32_path_from_utf8(buf, path) < 0) - return -1; - - return _wopen(buf, - _O_WRONLY | _O_CREAT | _O_TRUNC | STANDARD_OPEN_FLAGS, - mode & WIN32_MODE_MASK); -} - -int p_getcwd(char *buffer_out, size_t size) -{ - git_win32_path buf; - wchar_t *cwd = _wgetcwd(buf, GIT_WIN_PATH_UTF16); - - if (!cwd) - return -1; - - /* Convert the working directory back to UTF-8 */ - if (git__utf16_to_8(buffer_out, size, cwd) < 0) { - DWORD code = GetLastError(); - - if (code == ERROR_INSUFFICIENT_BUFFER) - errno = ERANGE; - else - errno = EINVAL; - - return -1; - } - - return 0; -} - -/* - * Returns the address of the GetFinalPathNameByHandleW function. - * This function is available on Windows Vista and higher. - */ -static PFGetFinalPathNameByHandleW get_fpnbyhandle(void) -{ - static PFGetFinalPathNameByHandleW pFunc = NULL; - PFGetFinalPathNameByHandleW toReturn = pFunc; - - if (!toReturn) { - HMODULE hModule = GetModuleHandleW(L"kernel32"); - - if (hModule) - toReturn = (PFGetFinalPathNameByHandleW)GetProcAddress(hModule, "GetFinalPathNameByHandleW"); - - pFunc = toReturn; - } - - assert(toReturn); - - return toReturn; -} - -static int getfinalpath_w( - git_win32_path dest, - const wchar_t *path) -{ - PFGetFinalPathNameByHandleW pgfp = get_fpnbyhandle(); - HANDLE hFile; - DWORD dwChars; - - if (!pgfp) - return -1; - - /* Use FILE_FLAG_BACKUP_SEMANTICS so we can open a directory. Do not - * specify FILE_FLAG_OPEN_REPARSE_POINT; we want to open a handle to the - * target of the link. */ - hFile = CreateFileW(path, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_DELETE, - NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL); - - if (INVALID_HANDLE_VALUE == hFile) - return -1; - - /* Call GetFinalPathNameByHandle */ - dwChars = pgfp(hFile, dest, GIT_WIN_PATH_UTF16, FILE_NAME_NORMALIZED); - CloseHandle(hFile); - - if (!dwChars || dwChars >= GIT_WIN_PATH_UTF16) - return -1; - - /* The path may be delivered to us with a prefix; canonicalize */ - return (int)git_win32__canonicalize_path(dest, dwChars); -} - -static int follow_and_lstat_link(git_win32_path path, struct stat* buf) -{ - git_win32_path target_w; - - if (getfinalpath_w(target_w, path) < 0) - return -1; - - return lstat_w(target_w, buf, false); -} - -int p_stat(const char* path, struct stat* buf) -{ - git_win32_path path_w; - int len; - - if ((len = git_win32_path_from_utf8(path_w, path)) < 0 || - lstat_w(path_w, buf, false) < 0) - return -1; - - /* The item is a symbolic link or mount point. No need to iterate - * to follow multiple links; use GetFinalPathNameFromHandle. */ - if (S_ISLNK(buf->st_mode)) - return follow_and_lstat_link(path_w, buf); - - return 0; -} - -int p_chdir(const char* path) -{ - git_win32_path buf; - - if (git_win32_path_from_utf8(buf, path) < 0) - return -1; - - return _wchdir(buf); -} - -int p_chmod(const char* path, mode_t mode) -{ - git_win32_path buf; - - if (git_win32_path_from_utf8(buf, path) < 0) - return -1; - - return _wchmod(buf, mode); -} - -int p_rmdir(const char* path) -{ - git_win32_path buf; - int error; - - if (git_win32_path_from_utf8(buf, path) < 0) - return -1; - - error = _wrmdir(buf); - - if (error == -1) { - switch (GetLastError()) { - /* _wrmdir() is documented to return EACCES if "A program has an open - * handle to the directory." This sounds like what everybody else calls - * EBUSY. Let's convert appropriate error codes. - */ - case ERROR_SHARING_VIOLATION: - errno = EBUSY; - break; - - /* This error can be returned when trying to rmdir an extant file. */ - case ERROR_DIRECTORY: - errno = ENOTDIR; - break; - } - } - - return error; -} - -char *p_realpath(const char *orig_path, char *buffer) -{ - git_win32_path orig_path_w, buffer_w; - - if (git_win32_path_from_utf8(orig_path_w, orig_path) < 0) - return NULL; - - /* Note that if the path provided is a relative path, then the current directory - * is used to resolve the path -- which is a concurrency issue because the current - * directory is a process-wide variable. */ - if (!GetFullPathNameW(orig_path_w, GIT_WIN_PATH_UTF16, buffer_w, NULL)) { - if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) - errno = ENAMETOOLONG; - else - errno = EINVAL; - - return NULL; - } - - /* The path must exist. */ - if (GetFileAttributesW(buffer_w) == INVALID_FILE_ATTRIBUTES) { - errno = ENOENT; - return NULL; - } - - if (!buffer && !(buffer = git__malloc(GIT_WIN_PATH_UTF8))) { - errno = ENOMEM; - return NULL; - } - - /* Convert the path to UTF-8. If the caller provided a buffer, then it - * is assumed to be GIT_WIN_PATH_UTF8 characters in size. If it isn't, - * then we may overflow. */ - if (git_win32_path_to_utf8(buffer, buffer_w) < 0) - return NULL; - - git_path_mkposix(buffer); - - return buffer; -} - -int p_vsnprintf(char *buffer, size_t count, const char *format, va_list argptr) -{ -#if defined(_MSC_VER) - int len; - - if (count == 0) - return _vscprintf(format, argptr); - - #if _MSC_VER >= 1500 - len = _vsnprintf_s(buffer, count, _TRUNCATE, format, argptr); - #else - len = _vsnprintf(buffer, count, format, argptr); - #endif - - if (len < 0) - return _vscprintf(format, argptr); - - return len; -#else /* MinGW */ - return vsnprintf(buffer, count, format, argptr); -#endif -} - -int p_snprintf(char *buffer, size_t count, const char *format, ...) -{ - va_list va; - int r; - - va_start(va, format); - r = p_vsnprintf(buffer, count, format, va); - va_end(va); - - return r; -} - -/* TODO: wut? */ -int p_mkstemp(char *tmp_path) -{ -#if defined(_MSC_VER) && _MSC_VER >= 1500 - if (_mktemp_s(tmp_path, strlen(tmp_path) + 1) != 0) - return -1; -#else - if (_mktemp(tmp_path) == NULL) - return -1; -#endif - - return p_open(tmp_path, O_RDWR | O_CREAT | O_EXCL, 0744); //-V536 -} - -int p_access(const char* path, mode_t mode) -{ - git_win32_path buf; - - if (git_win32_path_from_utf8(buf, path) < 0) - return -1; - - return _waccess(buf, mode & WIN32_MODE_MASK); -} - -static int ensure_writable(wchar_t *fpath) -{ - DWORD attrs; - - attrs = GetFileAttributesW(fpath); - if (attrs == INVALID_FILE_ATTRIBUTES) { - if (GetLastError() == ERROR_FILE_NOT_FOUND) - return 0; - - giterr_set(GITERR_OS, "failed to get attributes"); - return -1; - } - - if (!(attrs & FILE_ATTRIBUTE_READONLY)) - return 0; - - attrs &= ~FILE_ATTRIBUTE_READONLY; - if (!SetFileAttributesW(fpath, attrs)) { - giterr_set(GITERR_OS, "failed to set attributes"); - return -1; - } - - return 0; -} - -int p_rename(const char *from, const char *to) -{ - git_win32_path wfrom; - git_win32_path wto; - int rename_tries; - int rename_succeeded; - int error; - - if (git_win32_path_from_utf8(wfrom, from) < 0 || - git_win32_path_from_utf8(wto, to) < 0) - return -1; - - /* wait up to 50ms if file is locked by another thread or process */ - rename_tries = 0; - rename_succeeded = 0; - while (rename_tries < 10) { - if (ensure_writable(wto) == 0 && - MoveFileExW(wfrom, wto, MOVEFILE_REPLACE_EXISTING | MOVEFILE_COPY_ALLOWED) != 0) { - rename_succeeded = 1; - break; - } - - error = GetLastError(); - if (error == ERROR_SHARING_VIOLATION || error == ERROR_ACCESS_DENIED) { - Sleep(5); - rename_tries++; - } else - break; - } - - return rename_succeeded ? 0 : -1; -} - -int p_recv(GIT_SOCKET socket, void *buffer, size_t length, int flags) -{ - if ((size_t)((int)length) != length) - return -1; /* giterr_set will be done by caller */ - - return recv(socket, buffer, (int)length, flags); -} - -int p_send(GIT_SOCKET socket, const void *buffer, size_t length, int flags) -{ - if ((size_t)((int)length) != length) - return -1; /* giterr_set will be done by caller */ - - return send(socket, buffer, (int)length, flags); -} - -/** - * Borrowed from http://old.nabble.com/Porting-localtime_r-and-gmtime_r-td15282276.html - * On Win32, `gmtime_r` doesn't exist but `gmtime` is threadsafe, so we can use that - */ -struct tm * -p_localtime_r (const time_t *timer, struct tm *result) -{ - struct tm *local_result; - local_result = localtime (timer); - - if (local_result == NULL || result == NULL) - return NULL; - - memcpy (result, local_result, sizeof (struct tm)); - return result; -} -struct tm * -p_gmtime_r (const time_t *timer, struct tm *result) -{ - struct tm *local_result; - local_result = gmtime (timer); - - if (local_result == NULL || result == NULL) - return NULL; - - memcpy (result, local_result, sizeof (struct tm)); - return result; -} - -int p_inet_pton(int af, const char *src, void *dst) -{ - struct sockaddr_storage sin; - void *addr; - int sin_len = sizeof(struct sockaddr_storage), addr_len; - int error = 0; - - if (af == AF_INET) { - addr = &((struct sockaddr_in *)&sin)->sin_addr; - addr_len = sizeof(struct in_addr); - } else if (af == AF_INET6) { - addr = &((struct sockaddr_in6 *)&sin)->sin6_addr; - addr_len = sizeof(struct in6_addr); - } else { - errno = EAFNOSUPPORT; - return -1; - } - - if ((error = WSAStringToAddressA((LPSTR)src, af, NULL, (LPSOCKADDR)&sin, &sin_len)) == 0) { - memcpy(dst, addr, addr_len); - return 1; - } - - switch(WSAGetLastError()) { - case WSAEINVAL: - return 0; - case WSAEFAULT: - errno = ENOSPC; - return -1; - case WSA_NOT_ENOUGH_MEMORY: - errno = ENOMEM; - return -1; - } - - errno = EINVAL; - return -1; -} diff --git a/vendor/libgit2/src/win32/precompiled.c b/vendor/libgit2/src/win32/precompiled.c deleted file mode 100644 index 5f656a45da..0000000000 --- a/vendor/libgit2/src/win32/precompiled.c +++ /dev/null @@ -1 +0,0 @@ -#include "precompiled.h" diff --git a/vendor/libgit2/src/win32/precompiled.h b/vendor/libgit2/src/win32/precompiled.h deleted file mode 100644 index 33ce106d3a..0000000000 --- a/vendor/libgit2/src/win32/precompiled.h +++ /dev/null @@ -1,23 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#include - -#include -#include -#ifdef GIT_THREADS - #include "win32/pthread.h" -#endif - -#include "git2.h" -#include "common.h" diff --git a/vendor/libgit2/src/win32/pthread.c b/vendor/libgit2/src/win32/pthread.c deleted file mode 100644 index a1cc189325..0000000000 --- a/vendor/libgit2/src/win32/pthread.c +++ /dev/null @@ -1,269 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#include "pthread.h" -#include "../global.h" - -#define CLEAN_THREAD_EXIT 0x6F012842 - -/* The thread procedure stub used to invoke the caller's procedure - * and capture the return value for later collection. Windows will - * only hold a DWORD, but we need to be able to store an entire - * void pointer. This requires the indirection. */ -static DWORD WINAPI git_win32__threadproc(LPVOID lpParameter) -{ - git_win32_thread *thread = lpParameter; - - thread->result = thread->proc(thread->param); - - git__free_tls_data(); - - return CLEAN_THREAD_EXIT; -} - -int git_win32__thread_create( - git_win32_thread *GIT_RESTRICT thread, - const pthread_attr_t *GIT_RESTRICT attr, - void *(*start_routine)(void*), - void *GIT_RESTRICT arg) -{ - GIT_UNUSED(attr); - - thread->result = NULL; - thread->param = arg; - thread->proc = start_routine; - thread->thread = CreateThread( - NULL, 0, git_win32__threadproc, thread, 0, NULL); - - return thread->thread ? 0 : -1; -} - -int git_win32__thread_join( - git_win32_thread *thread, - void **value_ptr) -{ - DWORD exit; - - if (WaitForSingleObject(thread->thread, INFINITE) != WAIT_OBJECT_0) - return -1; - - if (!GetExitCodeThread(thread->thread, &exit)) { - CloseHandle(thread->thread); - return -1; - } - - /* Check for the thread having exited uncleanly. If exit was unclean, - * then we don't have a return value to give back to the caller. */ - if (exit != CLEAN_THREAD_EXIT) { - assert(false); - thread->result = NULL; - } - - if (value_ptr) - *value_ptr = thread->result; - - CloseHandle(thread->thread); - return 0; -} - -int pthread_mutex_init( - pthread_mutex_t *GIT_RESTRICT mutex, - const pthread_mutexattr_t *GIT_RESTRICT mutexattr) -{ - GIT_UNUSED(mutexattr); - InitializeCriticalSection(mutex); - return 0; -} - -int pthread_mutex_destroy(pthread_mutex_t *mutex) -{ - DeleteCriticalSection(mutex); - return 0; -} - -int pthread_mutex_lock(pthread_mutex_t *mutex) -{ - EnterCriticalSection(mutex); - return 0; -} - -int pthread_mutex_unlock(pthread_mutex_t *mutex) -{ - LeaveCriticalSection(mutex); - return 0; -} - -int pthread_cond_init(pthread_cond_t *cond, const pthread_condattr_t *attr) -{ - /* We don't support non-default attributes. */ - if (attr) - return EINVAL; - - /* This is an auto-reset event. */ - *cond = CreateEventW(NULL, FALSE, FALSE, NULL); - assert(*cond); - - /* If we can't create the event, claim that the reason was out-of-memory. - * The actual reason can be fetched with GetLastError(). */ - return *cond ? 0 : ENOMEM; -} - -int pthread_cond_destroy(pthread_cond_t *cond) -{ - BOOL closed; - - if (!cond) - return EINVAL; - - closed = CloseHandle(*cond); - assert(closed); - GIT_UNUSED(closed); - - *cond = NULL; - return 0; -} - -int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex) -{ - int error; - DWORD wait_result; - - if (!cond || !mutex) - return EINVAL; - - /* The caller must be holding the mutex. */ - error = pthread_mutex_unlock(mutex); - - if (error) - return error; - - wait_result = WaitForSingleObject(*cond, INFINITE); - assert(WAIT_OBJECT_0 == wait_result); - GIT_UNUSED(wait_result); - - return pthread_mutex_lock(mutex); -} - -int pthread_cond_signal(pthread_cond_t *cond) -{ - BOOL signaled; - - if (!cond) - return EINVAL; - - signaled = SetEvent(*cond); - assert(signaled); - GIT_UNUSED(signaled); - - return 0; -} - -/* pthread_cond_broadcast is not implemented because doing so with just - * Win32 events is quite complicated, and no caller in libgit2 uses it - * yet. - */ -int pthread_num_processors_np(void) -{ - DWORD_PTR p, s; - int n = 0; - - if (GetProcessAffinityMask(GetCurrentProcess(), &p, &s)) - for (; p; p >>= 1) - n += p&1; - - return n ? n : 1; -} - -typedef void (WINAPI *win32_srwlock_fn)(GIT_SRWLOCK *); - -static win32_srwlock_fn win32_srwlock_initialize; -static win32_srwlock_fn win32_srwlock_acquire_shared; -static win32_srwlock_fn win32_srwlock_release_shared; -static win32_srwlock_fn win32_srwlock_acquire_exclusive; -static win32_srwlock_fn win32_srwlock_release_exclusive; - -int pthread_rwlock_init( - pthread_rwlock_t *GIT_RESTRICT lock, - const pthread_rwlockattr_t *GIT_RESTRICT attr) -{ - GIT_UNUSED(attr); - - if (win32_srwlock_initialize) - win32_srwlock_initialize(&lock->native.srwl); - else - InitializeCriticalSection(&lock->native.csec); - - return 0; -} - -int pthread_rwlock_rdlock(pthread_rwlock_t *lock) -{ - if (win32_srwlock_acquire_shared) - win32_srwlock_acquire_shared(&lock->native.srwl); - else - EnterCriticalSection(&lock->native.csec); - - return 0; -} - -int pthread_rwlock_rdunlock(pthread_rwlock_t *lock) -{ - if (win32_srwlock_release_shared) - win32_srwlock_release_shared(&lock->native.srwl); - else - LeaveCriticalSection(&lock->native.csec); - - return 0; -} - -int pthread_rwlock_wrlock(pthread_rwlock_t *lock) -{ - if (win32_srwlock_acquire_exclusive) - win32_srwlock_acquire_exclusive(&lock->native.srwl); - else - EnterCriticalSection(&lock->native.csec); - - return 0; -} - -int pthread_rwlock_wrunlock(pthread_rwlock_t *lock) -{ - if (win32_srwlock_release_exclusive) - win32_srwlock_release_exclusive(&lock->native.srwl); - else - LeaveCriticalSection(&lock->native.csec); - - return 0; -} - -int pthread_rwlock_destroy(pthread_rwlock_t *lock) -{ - if (!win32_srwlock_initialize) - DeleteCriticalSection(&lock->native.csec); - git__memzero(lock, sizeof(*lock)); - return 0; -} - -int win32_pthread_initialize(void) -{ - HMODULE hModule = GetModuleHandleW(L"kernel32"); - - if (hModule) { - win32_srwlock_initialize = (win32_srwlock_fn) - GetProcAddress(hModule, "InitializeSRWLock"); - win32_srwlock_acquire_shared = (win32_srwlock_fn) - GetProcAddress(hModule, "AcquireSRWLockShared"); - win32_srwlock_release_shared = (win32_srwlock_fn) - GetProcAddress(hModule, "ReleaseSRWLockShared"); - win32_srwlock_acquire_exclusive = (win32_srwlock_fn) - GetProcAddress(hModule, "AcquireSRWLockExclusive"); - win32_srwlock_release_exclusive = (win32_srwlock_fn) - GetProcAddress(hModule, "ReleaseSRWLockExclusive"); - } - - return 0; -} diff --git a/vendor/libgit2/src/win32/pthread.h b/vendor/libgit2/src/win32/pthread.h deleted file mode 100644 index e4826ca7f5..0000000000 --- a/vendor/libgit2/src/win32/pthread.h +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#ifndef GIT_PTHREAD_H -#define GIT_PTHREAD_H - -#include "../common.h" - -#if defined (_MSC_VER) -# define GIT_RESTRICT __restrict -#else -# define GIT_RESTRICT __restrict__ -#endif - -typedef struct { - HANDLE thread; - void *(*proc)(void *); - void *param; - void *result; -} git_win32_thread; - -typedef int pthread_mutexattr_t; -typedef int pthread_condattr_t; -typedef int pthread_attr_t; -typedef int pthread_rwlockattr_t; - -typedef CRITICAL_SECTION pthread_mutex_t; -typedef HANDLE pthread_cond_t; - -typedef struct { void *Ptr; } GIT_SRWLOCK; - -typedef struct { - union { - GIT_SRWLOCK srwl; - CRITICAL_SECTION csec; - } native; -} pthread_rwlock_t; - -#define PTHREAD_MUTEX_INITIALIZER {(void*)-1} - -int git_win32__thread_create( - git_win32_thread *GIT_RESTRICT, - const pthread_attr_t *GIT_RESTRICT, - void *(*) (void *), - void *GIT_RESTRICT); - -int git_win32__thread_join( - git_win32_thread *, - void **); - -#ifdef GIT_THREADS - -typedef git_win32_thread git_thread; - -#define git_thread_create(git_thread_ptr, attr, start_routine, arg) \ - git_win32__thread_create(git_thread_ptr, attr, start_routine, arg) -#define git_thread_join(git_thread_ptr, status) \ - git_win32__thread_join(git_thread_ptr, status) - -#endif - -int pthread_mutex_init( - pthread_mutex_t *GIT_RESTRICT mutex, - const pthread_mutexattr_t *GIT_RESTRICT mutexattr); -int pthread_mutex_destroy(pthread_mutex_t *); -int pthread_mutex_lock(pthread_mutex_t *); -int pthread_mutex_unlock(pthread_mutex_t *); - -int pthread_cond_init(pthread_cond_t *, const pthread_condattr_t *); -int pthread_cond_destroy(pthread_cond_t *); -int pthread_cond_wait(pthread_cond_t *, pthread_mutex_t *); -int pthread_cond_signal(pthread_cond_t *); -/* pthread_cond_broadcast is not supported on Win32 yet. */ - -int pthread_num_processors_np(void); - -int pthread_rwlock_init( - pthread_rwlock_t *GIT_RESTRICT lock, - const pthread_rwlockattr_t *GIT_RESTRICT attr); -int pthread_rwlock_rdlock(pthread_rwlock_t *); -int pthread_rwlock_rdunlock(pthread_rwlock_t *); -int pthread_rwlock_wrlock(pthread_rwlock_t *); -int pthread_rwlock_wrunlock(pthread_rwlock_t *); -int pthread_rwlock_destroy(pthread_rwlock_t *); - -extern int win32_pthread_initialize(void); - -#endif diff --git a/vendor/libgit2/src/win32/reparse.h b/vendor/libgit2/src/win32/reparse.h deleted file mode 100644 index 70f9fd6520..0000000000 --- a/vendor/libgit2/src/win32/reparse.h +++ /dev/null @@ -1,57 +0,0 @@ -/* -* Copyright (C) the libgit2 contributors. All rights reserved. -* -* This file is part of libgit2, distributed under the GNU GPL v2 with -* a Linking Exception. For full terms see the included COPYING file. -*/ - -#ifndef INCLUDE_git_win32_reparse_h__ -#define INCLUDE_git_win32_reparse_h__ - -/* This structure is defined on MSDN at -* http://msdn.microsoft.com/en-us/library/windows/hardware/ff552012(v=vs.85).aspx -* -* It was formerly included in the Windows 2000 SDK and remains defined in -* MinGW, so we must define it with a silly name to avoid conflicting. -*/ -typedef struct _GIT_REPARSE_DATA_BUFFER { - ULONG ReparseTag; - USHORT ReparseDataLength; - USHORT Reserved; - union { - struct { - USHORT SubstituteNameOffset; - USHORT SubstituteNameLength; - USHORT PrintNameOffset; - USHORT PrintNameLength; - ULONG Flags; - WCHAR PathBuffer[1]; - } SymbolicLinkReparseBuffer; - struct { - USHORT SubstituteNameOffset; - USHORT SubstituteNameLength; - USHORT PrintNameOffset; - USHORT PrintNameLength; - WCHAR PathBuffer[1]; - } MountPointReparseBuffer; - struct { - UCHAR DataBuffer[1]; - } GenericReparseBuffer; - }; -} GIT_REPARSE_DATA_BUFFER; - -#define REPARSE_DATA_HEADER_SIZE 8 -#define REPARSE_DATA_MOUNTPOINT_HEADER_SIZE 8 -#define REPARSE_DATA_UNION_SIZE 12 - -/* Missing in MinGW */ -#ifndef FSCTL_GET_REPARSE_POINT -# define FSCTL_GET_REPARSE_POINT 0x000900a8 -#endif - -/* Missing in MinGW */ -#ifndef FSCTL_SET_REPARSE_POINT -# define FSCTL_SET_REPARSE_POINT 0x000900a4 -#endif - -#endif diff --git a/vendor/libgit2/src/win32/utf-conv.c b/vendor/libgit2/src/win32/utf-conv.c deleted file mode 100644 index f1b674ea06..0000000000 --- a/vendor/libgit2/src/win32/utf-conv.c +++ /dev/null @@ -1,162 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#include "common.h" -#include "utf-conv.h" - -GIT_INLINE(DWORD) get_wc_flags(void) -{ - static char inited = 0; - static DWORD flags; - - /* Invalid code point check supported on Vista+ only */ - if (!inited) { - flags = git_has_win32_version(6, 0, 0) ? WC_ERR_INVALID_CHARS : 0; - inited = 1; - } - - return flags; -} - -GIT_INLINE(void) git__set_errno(void) -{ - if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) - errno = ENAMETOOLONG; - else - errno = EINVAL; -} - -/** - * Converts a UTF-8 string to wide characters. - * - * @param dest The buffer to receive the wide string. - * @param dest_size The size of the buffer, in characters. - * @param src The UTF-8 string to convert. - * @return The length of the wide string, in characters (not counting the NULL terminator), or < 0 for failure - */ -int git__utf8_to_16(wchar_t *dest, size_t dest_size, const char *src) -{ - int len; - - /* Length of -1 indicates NULL termination of the input string. Subtract 1 from the result to - * turn 0 into -1 (an error code) and to not count the NULL terminator as part of the string's - * length. MultiByteToWideChar never returns int's minvalue, so underflow is not possible */ - if ((len = MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, src, -1, dest, (int)dest_size) - 1) < 0) - git__set_errno(); - - return len; -} - -/** - * Converts a wide string to UTF-8. - * - * @param dest The buffer to receive the UTF-8 string. - * @param dest_size The size of the buffer, in bytes. - * @param src The wide string to convert. - * @return The length of the UTF-8 string, in bytes (not counting the NULL terminator), or < 0 for failure - */ -int git__utf16_to_8(char *dest, size_t dest_size, const wchar_t *src) -{ - int len; - - /* Length of -1 indicates NULL termination of the input string. Subtract 1 from the result to - * turn 0 into -1 (an error code) and to not count the NULL terminator as part of the string's - * length. WideCharToMultiByte never returns int's minvalue, so underflow is not possible */ - if ((len = WideCharToMultiByte(CP_UTF8, get_wc_flags(), src, -1, dest, (int)dest_size, NULL, NULL) - 1) < 0) - git__set_errno(); - - return len; -} - -/** - * Converts a UTF-8 string to wide characters. - * Memory is allocated to hold the converted string. - * The caller is responsible for freeing the string with git__free. - * - * @param dest Receives a pointer to the wide string. - * @param src The UTF-8 string to convert. - * @return The length of the wide string, in characters (not counting the NULL terminator), or < 0 for failure - */ -int git__utf8_to_16_alloc(wchar_t **dest, const char *src) -{ - int utf16_size; - - *dest = NULL; - - /* Length of -1 indicates NULL termination of the input string */ - utf16_size = MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, src, -1, NULL, 0); - - if (!utf16_size) { - git__set_errno(); - return -1; - } - - if (!(*dest = git__mallocarray(utf16_size, sizeof(wchar_t)))) { - errno = ENOMEM; - return -1; - } - - utf16_size = MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, src, -1, *dest, utf16_size); - - if (!utf16_size) { - git__set_errno(); - - git__free(*dest); - *dest = NULL; - } - - /* Subtract 1 from the result to turn 0 into -1 (an error code) and to not count the NULL - * terminator as part of the string's length. MultiByteToWideChar never returns int's minvalue, - * so underflow is not possible */ - return utf16_size - 1; -} - -/** - * Converts a wide string to UTF-8. - * Memory is allocated to hold the converted string. - * The caller is responsible for freeing the string with git__free. - * - * @param dest Receives a pointer to the UTF-8 string. - * @param src The wide string to convert. - * @return The length of the UTF-8 string, in bytes (not counting the NULL terminator), or < 0 for failure - */ -int git__utf16_to_8_alloc(char **dest, const wchar_t *src) -{ - int utf8_size; - DWORD dwFlags = get_wc_flags(); - - *dest = NULL; - - /* Length of -1 indicates NULL termination of the input string */ - utf8_size = WideCharToMultiByte(CP_UTF8, dwFlags, src, -1, NULL, 0, NULL, NULL); - - if (!utf8_size) { - git__set_errno(); - return -1; - } - - *dest = git__malloc(utf8_size); - - if (!*dest) { - errno = ENOMEM; - return -1; - } - - utf8_size = WideCharToMultiByte(CP_UTF8, dwFlags, src, -1, *dest, utf8_size, NULL, NULL); - - if (!utf8_size) { - git__set_errno(); - - git__free(*dest); - *dest = NULL; - } - - /* Subtract 1 from the result to turn 0 into -1 (an error code) and to not count the NULL - * terminator as part of the string's length. MultiByteToWideChar never returns int's minvalue, - * so underflow is not possible */ - return utf8_size - 1; -} diff --git a/vendor/libgit2/src/win32/utf-conv.h b/vendor/libgit2/src/win32/utf-conv.h deleted file mode 100644 index 33b95f59f2..0000000000 --- a/vendor/libgit2/src/win32/utf-conv.h +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_utfconv_h__ -#define INCLUDE_git_utfconv_h__ - -#include -#include "common.h" - -#ifndef WC_ERR_INVALID_CHARS -# define WC_ERR_INVALID_CHARS 0x80 -#endif - -/** - * Converts a UTF-8 string to wide characters. - * - * @param dest The buffer to receive the wide string. - * @param dest_size The size of the buffer, in characters. - * @param src The UTF-8 string to convert. - * @return The length of the wide string, in characters (not counting the NULL terminator), or < 0 for failure - */ -int git__utf8_to_16(wchar_t *dest, size_t dest_size, const char *src); - -/** - * Converts a wide string to UTF-8. - * - * @param dest The buffer to receive the UTF-8 string. - * @param dest_size The size of the buffer, in bytes. - * @param src The wide string to convert. - * @return The length of the UTF-8 string, in bytes (not counting the NULL terminator), or < 0 for failure - */ -int git__utf16_to_8(char *dest, size_t dest_size, const wchar_t *src); - -/** - * Converts a UTF-8 string to wide characters. - * Memory is allocated to hold the converted string. - * The caller is responsible for freeing the string with git__free. - * - * @param dest Receives a pointer to the wide string. - * @param src The UTF-8 string to convert. - * @return The length of the wide string, in characters (not counting the NULL terminator), or < 0 for failure - */ -int git__utf8_to_16_alloc(wchar_t **dest, const char *src); - -/** - * Converts a wide string to UTF-8. - * Memory is allocated to hold the converted string. - * The caller is responsible for freeing the string with git__free. - * - * @param dest Receives a pointer to the UTF-8 string. - * @param src The wide string to convert. - * @return The length of the UTF-8 string, in bytes (not counting the NULL terminator), or < 0 for failure - */ -int git__utf16_to_8_alloc(char **dest, const wchar_t *src); - -#endif diff --git a/vendor/libgit2/src/win32/version.h b/vendor/libgit2/src/win32/version.h deleted file mode 100644 index 79667697f0..0000000000 --- a/vendor/libgit2/src/win32/version.h +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_win32_version_h__ -#define INCLUDE_win32_version_h__ - -#include - -GIT_INLINE(int) git_has_win32_version(int major, int minor, int service_pack) -{ - OSVERSIONINFOEX version_test = {0}; - DWORD version_test_mask; - DWORDLONG version_condition_mask = 0; - - version_test.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); - version_test.dwMajorVersion = major; - version_test.dwMinorVersion = minor; - version_test.wServicePackMajor = (WORD)service_pack; - version_test.wServicePackMinor = 0; - - version_test_mask = (VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR); - - VER_SET_CONDITION(version_condition_mask, VER_MAJORVERSION, VER_GREATER_EQUAL); - VER_SET_CONDITION(version_condition_mask, VER_MINORVERSION, VER_GREATER_EQUAL); - VER_SET_CONDITION(version_condition_mask, VER_SERVICEPACKMAJOR, VER_GREATER_EQUAL); - VER_SET_CONDITION(version_condition_mask, VER_SERVICEPACKMINOR, VER_GREATER_EQUAL); - - if (!VerifyVersionInfo(&version_test, version_test_mask, version_condition_mask)) - return 0; - - return 1; -} - -#endif diff --git a/vendor/libgit2/src/win32/w32_buffer.c b/vendor/libgit2/src/win32/w32_buffer.c deleted file mode 100644 index 9122baaa68..0000000000 --- a/vendor/libgit2/src/win32/w32_buffer.c +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#include "common.h" -#include "w32_buffer.h" -#include "../buffer.h" -#include "utf-conv.h" - -GIT_INLINE(int) handle_wc_error(void) -{ - if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) - errno = ENAMETOOLONG; - else - errno = EINVAL; - - return -1; -} - -int git_buf_put_w(git_buf *buf, const wchar_t *string_w, size_t len_w) -{ - int utf8_len, utf8_write_len; - size_t new_size; - - if (!len_w) - return 0; - - assert(string_w); - - /* Measure the string necessary for conversion */ - if ((utf8_len = WideCharToMultiByte(CP_UTF8, WC_ERR_INVALID_CHARS, string_w, len_w, NULL, 0, NULL, NULL)) == 0) - return 0; - - assert(utf8_len > 0); - - GITERR_CHECK_ALLOC_ADD(&new_size, buf->size, (size_t)utf8_len); - GITERR_CHECK_ALLOC_ADD(&new_size, new_size, 1); - - if (git_buf_grow(buf, new_size) < 0) - return -1; - - if ((utf8_write_len = WideCharToMultiByte( - CP_UTF8, WC_ERR_INVALID_CHARS, string_w, len_w, &buf->ptr[buf->size], utf8_len, NULL, NULL)) == 0) - return handle_wc_error(); - - assert(utf8_write_len == utf8_len); - - buf->size += utf8_write_len; - buf->ptr[buf->size] = '\0'; - return 0; -} diff --git a/vendor/libgit2/src/win32/w32_buffer.h b/vendor/libgit2/src/win32/w32_buffer.h deleted file mode 100644 index 62243986fa..0000000000 --- a/vendor/libgit2/src/win32/w32_buffer.h +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_win32_buffer_h__ -#define INCLUDE_git_win32_buffer_h__ - -#include "../buffer.h" - -/** - * Convert a wide character string to UTF-8 and append the results to the - * buffer. - */ -int git_buf_put_w(git_buf *buf, const wchar_t *string_w, size_t len_w); - -#endif diff --git a/vendor/libgit2/src/win32/w32_util.c b/vendor/libgit2/src/win32/w32_util.c deleted file mode 100644 index 2e52525d5b..0000000000 --- a/vendor/libgit2/src/win32/w32_util.c +++ /dev/null @@ -1,139 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#include "w32_util.h" - -/** - * Creates a FindFirstFile(Ex) filter string from a UTF-8 path. - * The filter string enumerates all items in the directory. - * - * @param dest The buffer to receive the filter string. - * @param src The UTF-8 path of the directory to enumerate. - * @return True if the filter string was created successfully; false otherwise - */ -bool git_win32__findfirstfile_filter(git_win32_path dest, const char *src) -{ - static const wchar_t suffix[] = L"\\*"; - int len = git_win32_path_from_utf8(dest, src); - - /* Ensure the path was converted */ - if (len < 0) - return false; - - /* Ensure that the path does not end with a trailing slash, - * because we're about to add one. Don't rely our trim_end - * helper, because we want to remove the backslash even for - * drive letter paths, in this case. */ - if (len > 0 && - (dest[len - 1] == L'/' || dest[len - 1] == L'\\')) { - dest[len - 1] = L'\0'; - len--; - } - - /* Ensure we have enough room to add the suffix */ - if ((size_t)len >= GIT_WIN_PATH_UTF16 - CONST_STRLEN(suffix)) - return false; - - wcscat(dest, suffix); - return true; -} - -/** - * Ensures the given path (file or folder) has the +H (hidden) attribute set. - * - * @param path The path which should receive the +H bit. - * @return 0 on success; -1 on failure - */ -int git_win32__sethidden(const char *path) -{ - git_win32_path buf; - DWORD attrs; - - if (git_win32_path_from_utf8(buf, path) < 0) - return -1; - - attrs = GetFileAttributesW(buf); - - /* Ensure the path exists */ - if (attrs == INVALID_FILE_ATTRIBUTES) - return -1; - - /* If the item isn't already +H, add the bit */ - if ((attrs & FILE_ATTRIBUTE_HIDDEN) == 0 && - !SetFileAttributesW(buf, attrs | FILE_ATTRIBUTE_HIDDEN)) - return -1; - - return 0; -} - -/** - * Removes any trailing backslashes from a path, except in the case of a drive - * letter path (C:\, D:\, etc.). This function cannot fail. - * - * @param path The path which should be trimmed. - * @return The length of the modified string (<= the input length) - */ -size_t git_win32__path_trim_end(wchar_t *str, size_t len) -{ - while (1) { - if (!len || str[len - 1] != L'\\') - break; - - /* Don't trim backslashes from drive letter paths, which - * are 3 characters long and of the form C:\, D:\, etc. */ - if (len == 3 && git_win32__isalpha(str[0]) && str[1] == ':') - break; - - len--; - } - - str[len] = L'\0'; - - return len; -} - -/** - * Removes any of the following namespace prefixes from a path, - * if found: "\??\", "\\?\", "\\?\UNC\". This function cannot fail. - * - * @param path The path which should be converted. - * @return The length of the modified string (<= the input length) - */ -size_t git_win32__canonicalize_path(wchar_t *str, size_t len) -{ - static const wchar_t dosdevices_prefix[] = L"\\\?\?\\"; - static const wchar_t nt_prefix[] = L"\\\\?\\"; - static const wchar_t unc_prefix[] = L"UNC\\"; - size_t to_advance = 0; - - /* "\??\" -- DOS Devices prefix */ - if (len >= CONST_STRLEN(dosdevices_prefix) && - !wcsncmp(str, dosdevices_prefix, CONST_STRLEN(dosdevices_prefix))) { - to_advance += CONST_STRLEN(dosdevices_prefix); - len -= CONST_STRLEN(dosdevices_prefix); - } - /* "\\?\" -- NT namespace prefix */ - else if (len >= CONST_STRLEN(nt_prefix) && - !wcsncmp(str, nt_prefix, CONST_STRLEN(nt_prefix))) { - to_advance += CONST_STRLEN(nt_prefix); - len -= CONST_STRLEN(nt_prefix); - } - - /* "\??\UNC\", "\\?\UNC\" -- UNC prefix */ - if (to_advance && len >= CONST_STRLEN(unc_prefix) && - !wcsncmp(str + to_advance, unc_prefix, CONST_STRLEN(unc_prefix))) { - to_advance += CONST_STRLEN(unc_prefix); - len -= CONST_STRLEN(unc_prefix); - } - - if (to_advance) { - memmove(str, str + to_advance, len * sizeof(wchar_t)); - str[len] = L'\0'; - } - - return git_win32__path_trim_end(str, len); -} diff --git a/vendor/libgit2/src/win32/w32_util.h b/vendor/libgit2/src/win32/w32_util.h deleted file mode 100644 index 377d651a8d..0000000000 --- a/vendor/libgit2/src/win32/w32_util.h +++ /dev/null @@ -1,137 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#ifndef INCLUDE_w32_util_h__ -#define INCLUDE_w32_util_h__ - -#include "utf-conv.h" -#include "posix.h" -#include "path_w32.h" - -/* - -#include "common.h" -#include "path.h" -#include "path_w32.h" -#include "utf-conv.h" -#include "posix.h" -#include "reparse.h" -#include "dir.h" -*/ - - -GIT_INLINE(bool) git_win32__isalpha(wchar_t c) -{ - return ((c >= L'A' && c <= L'Z') || (c >= L'a' && c <= L'z')); -} - -/** - * Creates a FindFirstFile(Ex) filter string from a UTF-8 path. - * The filter string enumerates all items in the directory. - * - * @param dest The buffer to receive the filter string. - * @param src The UTF-8 path of the directory to enumerate. - * @return True if the filter string was created successfully; false otherwise - */ -bool git_win32__findfirstfile_filter(git_win32_path dest, const char *src); - -/** - * Ensures the given path (file or folder) has the +H (hidden) attribute set. - * - * @param path The path which should receive the +H bit. - * @return 0 on success; -1 on failure - */ -int git_win32__sethidden(const char *path); - -/** - * Removes any trailing backslashes from a path, except in the case of a drive - * letter path (C:\, D:\, etc.). This function cannot fail. - * - * @param path The path which should be trimmed. - * @return The length of the modified string (<= the input length) - */ -size_t git_win32__path_trim_end(wchar_t *str, size_t len); - -/** - * Removes any of the following namespace prefixes from a path, - * if found: "\??\", "\\?\", "\\?\UNC\". This function cannot fail. - * - * @param path The path which should be converted. - * @return The length of the modified string (<= the input length) - */ -size_t git_win32__canonicalize_path(wchar_t *str, size_t len); - -/** - * Converts a FILETIME structure to a time_t. - * - * @param FILETIME A pointer to a FILETIME - * @return A time_t containing the same time - */ -GIT_INLINE(time_t) git_win32__filetime_to_time_t(const FILETIME *ft) -{ - long long winTime = ((long long)ft->dwHighDateTime << 32) + ft->dwLowDateTime; - winTime -= 116444736000000000LL; /* Windows to Unix Epoch conversion */ - winTime /= 10000000; /* Nano to seconds resolution */ - return (time_t)winTime; -} - -GIT_INLINE(void) git_win32__timeval_to_filetime( - FILETIME *ft, const struct timeval tv) -{ - long long ticks = (tv.tv_sec * 10000000LL) + - (tv.tv_usec * 10LL) + 116444736000000000LL; - - ft->dwHighDateTime = ((ticks >> 32) & 0xffffffffLL); - ft->dwLowDateTime = (ticks & 0xffffffffLL); -} - -GIT_INLINE(int) git_win32__file_attribute_to_stat( - struct stat *st, - const WIN32_FILE_ATTRIBUTE_DATA *attrdata, - const wchar_t *path) -{ - mode_t mode = S_IREAD; - - if (attrdata->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) - mode |= S_IFDIR; - else - mode |= S_IFREG; - - if ((attrdata->dwFileAttributes & FILE_ATTRIBUTE_READONLY) == 0) - mode |= S_IWRITE; - - st->st_ino = 0; - st->st_gid = 0; - st->st_uid = 0; - st->st_nlink = 1; - st->st_mode = mode; - st->st_size = ((git_off_t)attrdata->nFileSizeHigh << 32) + attrdata->nFileSizeLow; - st->st_dev = _getdrive() - 1; - st->st_rdev = st->st_dev; - st->st_atime = git_win32__filetime_to_time_t(&(attrdata->ftLastAccessTime)); - st->st_mtime = git_win32__filetime_to_time_t(&(attrdata->ftLastWriteTime)); - st->st_ctime = git_win32__filetime_to_time_t(&(attrdata->ftCreationTime)); - - if (attrdata->dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT && path) { - git_win32_path target; - - if (git_win32_path_readlink_w(target, path) >= 0) { - st->st_mode = (st->st_mode & ~S_IFMT) | S_IFLNK; - - /* st_size gets the UTF-8 length of the target name, in bytes, - * not counting the NULL terminator */ - if ((st->st_size = git__utf16_to_8(NULL, 0, target)) < 0) { - giterr_set(GITERR_OS, "Could not convert reparse point name for '%s'", path); - return -1; - } - } - } - - return 0; -} - -#endif diff --git a/vendor/libgit2/src/xdiff/xdiff.h b/vendor/libgit2/src/xdiff/xdiff.h deleted file mode 100644 index e2f1e892b1..0000000000 --- a/vendor/libgit2/src/xdiff/xdiff.h +++ /dev/null @@ -1,139 +0,0 @@ -/* - * LibXDiff by Davide Libenzi ( File Differential Library ) - * Copyright (C) 2003 Davide Libenzi - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Davide Libenzi - * - */ - -#if !defined(XDIFF_H) -#define XDIFF_H - -#ifdef __cplusplus -extern "C" { -#endif /* #ifdef __cplusplus */ - - -#define XDF_NEED_MINIMAL (1 << 1) -#define XDF_IGNORE_WHITESPACE (1 << 2) -#define XDF_IGNORE_WHITESPACE_CHANGE (1 << 3) -#define XDF_IGNORE_WHITESPACE_AT_EOL (1 << 4) -#define XDF_WHITESPACE_FLAGS (XDF_IGNORE_WHITESPACE | XDF_IGNORE_WHITESPACE_CHANGE | XDF_IGNORE_WHITESPACE_AT_EOL) - -#define XDF_PATIENCE_DIFF (1 << 5) -#define XDF_HISTOGRAM_DIFF (1 << 6) -#define XDF_DIFF_ALGORITHM_MASK (XDF_PATIENCE_DIFF | XDF_HISTOGRAM_DIFF) -#define XDF_DIFF_ALG(x) ((x) & XDF_DIFF_ALGORITHM_MASK) - -#define XDF_IGNORE_BLANK_LINES (1 << 7) - -#define XDL_EMIT_FUNCNAMES (1 << 0) -#define XDL_EMIT_COMMON (1 << 1) -#define XDL_EMIT_FUNCCONTEXT (1 << 2) - -#define XDL_MMB_READONLY (1 << 0) - -#define XDL_MMF_ATOMIC (1 << 0) - -#define XDL_BDOP_INS 1 -#define XDL_BDOP_CPY 2 -#define XDL_BDOP_INSB 3 - -/* merge simplification levels */ -#define XDL_MERGE_MINIMAL 0 -#define XDL_MERGE_EAGER 1 -#define XDL_MERGE_ZEALOUS 2 -#define XDL_MERGE_ZEALOUS_ALNUM 3 - -/* merge favor modes */ -#define XDL_MERGE_FAVOR_OURS 1 -#define XDL_MERGE_FAVOR_THEIRS 2 -#define XDL_MERGE_FAVOR_UNION 3 - -/* merge output styles */ -#define XDL_MERGE_DIFF3 1 - -typedef struct s_mmfile { - char *ptr; - size_t size; -} mmfile_t; - -typedef struct s_mmbuffer { - char *ptr; - size_t size; -} mmbuffer_t; - -typedef struct s_xpparam { - unsigned long flags; -} xpparam_t; - -typedef struct s_xdemitcb { - void *priv; - int (*outf)(void *, mmbuffer_t *, int); -} xdemitcb_t; - -typedef long (*find_func_t)(const char *line, long line_len, char *buffer, long buffer_size, void *priv); - -typedef int (*xdl_emit_hunk_consume_func_t)(long start_a, long count_a, - long start_b, long count_b, - void *cb_data); - -typedef struct s_xdemitconf { - long ctxlen; - long interhunkctxlen; - unsigned long flags; - find_func_t find_func; - void *find_func_priv; - xdl_emit_hunk_consume_func_t hunk_func; -} xdemitconf_t; - -typedef struct s_bdiffparam { - long bsize; -} bdiffparam_t; - - -#define xdl_malloc(x) malloc(x) -#define xdl_free(ptr) free(ptr) -#define xdl_realloc(ptr,x) realloc(ptr,x) - -void *xdl_mmfile_first(mmfile_t *mmf, long *size); -long xdl_mmfile_size(mmfile_t *mmf); - -int xdl_diff(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp, - xdemitconf_t const *xecfg, xdemitcb_t *ecb); - -typedef struct s_xmparam { - xpparam_t xpp; - int marker_size; - int level; - int favor; - int style; - const char *ancestor; /* label for orig */ - const char *file1; /* label for mf1 */ - const char *file2; /* label for mf2 */ -} xmparam_t; - -#define DEFAULT_CONFLICT_MARKER_SIZE 7 - -int xdl_merge(mmfile_t *orig, mmfile_t *mf1, mmfile_t *mf2, - xmparam_t const *xmp, mmbuffer_t *result); - -#ifdef __cplusplus -} -#endif /* #ifdef __cplusplus */ - -#endif /* #if !defined(XDIFF_H) */ diff --git a/vendor/libgit2/src/xdiff/xdiffi.c b/vendor/libgit2/src/xdiff/xdiffi.c deleted file mode 100644 index 0620e5fff4..0000000000 --- a/vendor/libgit2/src/xdiff/xdiffi.c +++ /dev/null @@ -1,614 +0,0 @@ -/* - * LibXDiff by Davide Libenzi ( File Differential Library ) - * Copyright (C) 2003 Davide Libenzi - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Davide Libenzi - * - */ - -#include "xinclude.h" - - - -#define XDL_MAX_COST_MIN 256 -#define XDL_HEUR_MIN_COST 256 -#define XDL_LINE_MAX (long)((1UL << (CHAR_BIT * sizeof(long) - 1)) - 1) -#define XDL_SNAKE_CNT 20 -#define XDL_K_HEUR 4 - - - -typedef struct s_xdpsplit { - long i1, i2; - int min_lo, min_hi; -} xdpsplit_t; - - - - -static long xdl_split(unsigned long const *ha1, long off1, long lim1, - unsigned long const *ha2, long off2, long lim2, - long *kvdf, long *kvdb, int need_min, xdpsplit_t *spl, - xdalgoenv_t *xenv); -static xdchange_t *xdl_add_change(xdchange_t *xscr, long i1, long i2, long chg1, long chg2); - - - - - -/* - * See "An O(ND) Difference Algorithm and its Variations", by Eugene Myers. - * Basically considers a "box" (off1, off2, lim1, lim2) and scan from both - * the forward diagonal starting from (off1, off2) and the backward diagonal - * starting from (lim1, lim2). If the K values on the same diagonal crosses - * returns the furthest point of reach. We might end up having to expensive - * cases using this algorithm is full, so a little bit of heuristic is needed - * to cut the search and to return a suboptimal point. - */ -static long xdl_split(unsigned long const *ha1, long off1, long lim1, - unsigned long const *ha2, long off2, long lim2, - long *kvdf, long *kvdb, int need_min, xdpsplit_t *spl, - xdalgoenv_t *xenv) { - long dmin = off1 - lim2, dmax = lim1 - off2; - long fmid = off1 - off2, bmid = lim1 - lim2; - long odd = (fmid - bmid) & 1; - long fmin = fmid, fmax = fmid; - long bmin = bmid, bmax = bmid; - long ec, d, i1, i2, prev1, best, dd, v, k; - - /* - * Set initial diagonal values for both forward and backward path. - */ - kvdf[fmid] = off1; - kvdb[bmid] = lim1; - - for (ec = 1;; ec++) { - int got_snake = 0; - - /* - * We need to extent the diagonal "domain" by one. If the next - * values exits the box boundaries we need to change it in the - * opposite direction because (max - min) must be a power of two. - * Also we initialize the external K value to -1 so that we can - * avoid extra conditions check inside the core loop. - */ - if (fmin > dmin) - kvdf[--fmin - 1] = -1; - else - ++fmin; - if (fmax < dmax) - kvdf[++fmax + 1] = -1; - else - --fmax; - - for (d = fmax; d >= fmin; d -= 2) { - if (kvdf[d - 1] >= kvdf[d + 1]) - i1 = kvdf[d - 1] + 1; - else - i1 = kvdf[d + 1]; - prev1 = i1; - i2 = i1 - d; - for (; i1 < lim1 && i2 < lim2 && ha1[i1] == ha2[i2]; i1++, i2++); - if (i1 - prev1 > xenv->snake_cnt) - got_snake = 1; - kvdf[d] = i1; - if (odd && bmin <= d && d <= bmax && kvdb[d] <= i1) { - spl->i1 = i1; - spl->i2 = i2; - spl->min_lo = spl->min_hi = 1; - return ec; - } - } - - /* - * We need to extent the diagonal "domain" by one. If the next - * values exits the box boundaries we need to change it in the - * opposite direction because (max - min) must be a power of two. - * Also we initialize the external K value to -1 so that we can - * avoid extra conditions check inside the core loop. - */ - if (bmin > dmin) - kvdb[--bmin - 1] = XDL_LINE_MAX; - else - ++bmin; - if (bmax < dmax) - kvdb[++bmax + 1] = XDL_LINE_MAX; - else - --bmax; - - for (d = bmax; d >= bmin; d -= 2) { - if (kvdb[d - 1] < kvdb[d + 1]) - i1 = kvdb[d - 1]; - else - i1 = kvdb[d + 1] - 1; - prev1 = i1; - i2 = i1 - d; - for (; i1 > off1 && i2 > off2 && ha1[i1 - 1] == ha2[i2 - 1]; i1--, i2--); - if (prev1 - i1 > xenv->snake_cnt) - got_snake = 1; - kvdb[d] = i1; - if (!odd && fmin <= d && d <= fmax && i1 <= kvdf[d]) { - spl->i1 = i1; - spl->i2 = i2; - spl->min_lo = spl->min_hi = 1; - return ec; - } - } - - if (need_min) - continue; - - /* - * If the edit cost is above the heuristic trigger and if - * we got a good snake, we sample current diagonals to see - * if some of the, have reached an "interesting" path. Our - * measure is a function of the distance from the diagonal - * corner (i1 + i2) penalized with the distance from the - * mid diagonal itself. If this value is above the current - * edit cost times a magic factor (XDL_K_HEUR) we consider - * it interesting. - */ - if (got_snake && ec > xenv->heur_min) { - for (best = 0, d = fmax; d >= fmin; d -= 2) { - dd = d > fmid ? d - fmid: fmid - d; - i1 = kvdf[d]; - i2 = i1 - d; - v = (i1 - off1) + (i2 - off2) - dd; - - if (v > XDL_K_HEUR * ec && v > best && - off1 + xenv->snake_cnt <= i1 && i1 < lim1 && - off2 + xenv->snake_cnt <= i2 && i2 < lim2) { - for (k = 1; ha1[i1 - k] == ha2[i2 - k]; k++) - if (k == xenv->snake_cnt) { - best = v; - spl->i1 = i1; - spl->i2 = i2; - break; - } - } - } - if (best > 0) { - spl->min_lo = 1; - spl->min_hi = 0; - return ec; - } - - for (best = 0, d = bmax; d >= bmin; d -= 2) { - dd = d > bmid ? d - bmid: bmid - d; - i1 = kvdb[d]; - i2 = i1 - d; - v = (lim1 - i1) + (lim2 - i2) - dd; - - if (v > XDL_K_HEUR * ec && v > best && - off1 < i1 && i1 <= lim1 - xenv->snake_cnt && - off2 < i2 && i2 <= lim2 - xenv->snake_cnt) { - for (k = 0; ha1[i1 + k] == ha2[i2 + k]; k++) - if (k == xenv->snake_cnt - 1) { - best = v; - spl->i1 = i1; - spl->i2 = i2; - break; - } - } - } - if (best > 0) { - spl->min_lo = 0; - spl->min_hi = 1; - return ec; - } - } - - /* - * Enough is enough. We spent too much time here and now we collect - * the furthest reaching path using the (i1 + i2) measure. - */ - if (ec >= xenv->mxcost) { - long fbest, fbest1, bbest, bbest1; - - fbest = fbest1 = -1; - for (d = fmax; d >= fmin; d -= 2) { - i1 = XDL_MIN(kvdf[d], lim1); - i2 = i1 - d; - if (lim2 < i2) - i1 = lim2 + d, i2 = lim2; - if (fbest < i1 + i2) { - fbest = i1 + i2; - fbest1 = i1; - } - } - - bbest = bbest1 = XDL_LINE_MAX; - for (d = bmax; d >= bmin; d -= 2) { - i1 = XDL_MAX(off1, kvdb[d]); - i2 = i1 - d; - if (i2 < off2) - i1 = off2 + d, i2 = off2; - if (i1 + i2 < bbest) { - bbest = i1 + i2; - bbest1 = i1; - } - } - - if ((lim1 + lim2) - bbest < fbest - (off1 + off2)) { - spl->i1 = fbest1; - spl->i2 = fbest - fbest1; - spl->min_lo = 1; - spl->min_hi = 0; - } else { - spl->i1 = bbest1; - spl->i2 = bbest - bbest1; - spl->min_lo = 0; - spl->min_hi = 1; - } - return ec; - } - } -} - - -/* - * Rule: "Divide et Impera". Recursively split the box in sub-boxes by calling - * the box splitting function. Note that the real job (marking changed lines) - * is done in the two boundary reaching checks. - */ -int xdl_recs_cmp(diffdata_t *dd1, long off1, long lim1, - diffdata_t *dd2, long off2, long lim2, - long *kvdf, long *kvdb, int need_min, xdalgoenv_t *xenv) { - unsigned long const *ha1 = dd1->ha, *ha2 = dd2->ha; - - /* - * Shrink the box by walking through each diagonal snake (SW and NE). - */ - for (; off1 < lim1 && off2 < lim2 && ha1[off1] == ha2[off2]; off1++, off2++); - for (; off1 < lim1 && off2 < lim2 && ha1[lim1 - 1] == ha2[lim2 - 1]; lim1--, lim2--); - - /* - * If one dimension is empty, then all records on the other one must - * be obviously changed. - */ - if (off1 == lim1) { - char *rchg2 = dd2->rchg; - long *rindex2 = dd2->rindex; - - for (; off2 < lim2; off2++) - rchg2[rindex2[off2]] = 1; - } else if (off2 == lim2) { - char *rchg1 = dd1->rchg; - long *rindex1 = dd1->rindex; - - for (; off1 < lim1; off1++) - rchg1[rindex1[off1]] = 1; - } else { - xdpsplit_t spl; - spl.i1 = spl.i2 = 0; - - /* - * Divide ... - */ - if (xdl_split(ha1, off1, lim1, ha2, off2, lim2, kvdf, kvdb, - need_min, &spl, xenv) < 0) { - - return -1; - } - - /* - * ... et Impera. - */ - if (xdl_recs_cmp(dd1, off1, spl.i1, dd2, off2, spl.i2, - kvdf, kvdb, spl.min_lo, xenv) < 0 || - xdl_recs_cmp(dd1, spl.i1, lim1, dd2, spl.i2, lim2, - kvdf, kvdb, spl.min_hi, xenv) < 0) { - - return -1; - } - } - - return 0; -} - - -int xdl_do_diff(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp, - xdfenv_t *xe) { - long ndiags; - long *kvd, *kvdf, *kvdb; - xdalgoenv_t xenv; - diffdata_t dd1, dd2; - - if (XDF_DIFF_ALG(xpp->flags) == XDF_PATIENCE_DIFF) - return xdl_do_patience_diff(mf1, mf2, xpp, xe); - - if (XDF_DIFF_ALG(xpp->flags) == XDF_HISTOGRAM_DIFF) - return xdl_do_histogram_diff(mf1, mf2, xpp, xe); - - if (xdl_prepare_env(mf1, mf2, xpp, xe) < 0) { - - return -1; - } - - /* - * Allocate and setup K vectors to be used by the differential algorithm. - * One is to store the forward path and one to store the backward path. - */ - ndiags = xe->xdf1.nreff + xe->xdf2.nreff + 3; - if (!(kvd = (long *) xdl_malloc((2 * ndiags + 2) * sizeof(long)))) { - - xdl_free_env(xe); - return -1; - } - kvdf = kvd; - kvdb = kvdf + ndiags; - kvdf += xe->xdf2.nreff + 1; - kvdb += xe->xdf2.nreff + 1; - - xenv.mxcost = xdl_bogosqrt(ndiags); - if (xenv.mxcost < XDL_MAX_COST_MIN) - xenv.mxcost = XDL_MAX_COST_MIN; - xenv.snake_cnt = XDL_SNAKE_CNT; - xenv.heur_min = XDL_HEUR_MIN_COST; - - dd1.nrec = xe->xdf1.nreff; - dd1.ha = xe->xdf1.ha; - dd1.rchg = xe->xdf1.rchg; - dd1.rindex = xe->xdf1.rindex; - dd2.nrec = xe->xdf2.nreff; - dd2.ha = xe->xdf2.ha; - dd2.rchg = xe->xdf2.rchg; - dd2.rindex = xe->xdf2.rindex; - - if (xdl_recs_cmp(&dd1, 0, dd1.nrec, &dd2, 0, dd2.nrec, - kvdf, kvdb, (xpp->flags & XDF_NEED_MINIMAL) != 0, &xenv) < 0) { - - xdl_free(kvd); - xdl_free_env(xe); - return -1; - } - - xdl_free(kvd); - - return 0; -} - - -static xdchange_t *xdl_add_change(xdchange_t *xscr, long i1, long i2, long chg1, long chg2) { - xdchange_t *xch; - - if (!(xch = (xdchange_t *) xdl_malloc(sizeof(xdchange_t)))) - return NULL; - - xch->next = xscr; - xch->i1 = i1; - xch->i2 = i2; - xch->chg1 = chg1; - xch->chg2 = chg2; - xch->ignore = 0; - - return xch; -} - - -int xdl_change_compact(xdfile_t *xdf, xdfile_t *xdfo, long flags) { - long ix, ixo, ixs, ixref, grpsiz, nrec = xdf->nrec; - char *rchg = xdf->rchg, *rchgo = xdfo->rchg; - xrecord_t **recs = xdf->recs; - - /* - * This is the same of what GNU diff does. Move back and forward - * change groups for a consistent and pretty diff output. This also - * helps in finding joinable change groups and reduce the diff size. - */ - for (ix = ixo = 0;;) { - /* - * Find the first changed line in the to-be-compacted file. - * We need to keep track of both indexes, so if we find a - * changed lines group on the other file, while scanning the - * to-be-compacted file, we need to skip it properly. Note - * that loops that are testing for changed lines on rchg* do - * not need index bounding since the array is prepared with - * a zero at position -1 and N. - */ - for (; ix < nrec && !rchg[ix]; ix++) - while (rchgo[ixo++]); - if (ix == nrec) - break; - - /* - * Record the start of a changed-group in the to-be-compacted file - * and find the end of it, on both to-be-compacted and other file - * indexes (ix and ixo). - */ - ixs = ix; - for (ix++; rchg[ix]; ix++); - for (; rchgo[ixo]; ixo++); - - do { - grpsiz = ix - ixs; - - /* - * If the line before the current change group, is equal to - * the last line of the current change group, shift backward - * the group. - */ - while (ixs > 0 && recs[ixs - 1]->ha == recs[ix - 1]->ha && - xdl_recmatch(recs[ixs - 1]->ptr, recs[ixs - 1]->size, recs[ix - 1]->ptr, recs[ix - 1]->size, flags)) { - rchg[--ixs] = 1; - rchg[--ix] = 0; - - /* - * This change might have joined two change groups, - * so we try to take this scenario in account by moving - * the start index accordingly (and so the other-file - * end-of-group index). - */ - for (; rchg[ixs - 1]; ixs--); - while (rchgo[--ixo]); - } - - /* - * Record the end-of-group position in case we are matched - * with a group of changes in the other file (that is, the - * change record before the end-of-group index in the other - * file is set). - */ - ixref = rchgo[ixo - 1] ? ix: nrec; - - /* - * If the first line of the current change group, is equal to - * the line next of the current change group, shift forward - * the group. - */ - while (ix < nrec && recs[ixs]->ha == recs[ix]->ha && - xdl_recmatch(recs[ixs]->ptr, recs[ixs]->size, recs[ix]->ptr, recs[ix]->size, flags)) { - rchg[ixs++] = 0; - rchg[ix++] = 1; - - /* - * This change might have joined two change groups, - * so we try to take this scenario in account by moving - * the start index accordingly (and so the other-file - * end-of-group index). Keep tracking the reference - * index in case we are shifting together with a - * corresponding group of changes in the other file. - */ - for (; rchg[ix]; ix++); - while (rchgo[++ixo]) - ixref = ix; - } - } while (grpsiz != ix - ixs); - - /* - * Try to move back the possibly merged group of changes, to match - * the recorded position in the other file. - */ - while (ixref < ix) { - rchg[--ixs] = 1; - rchg[--ix] = 0; - while (rchgo[--ixo]); - } - } - - return 0; -} - - -int xdl_build_script(xdfenv_t *xe, xdchange_t **xscr) { - xdchange_t *cscr = NULL, *xch; - char *rchg1 = xe->xdf1.rchg, *rchg2 = xe->xdf2.rchg; - long i1, i2, l1, l2; - - /* - * Trivial. Collects "groups" of changes and creates an edit script. - */ - for (i1 = xe->xdf1.nrec, i2 = xe->xdf2.nrec; i1 >= 0 || i2 >= 0; i1--, i2--) - if (rchg1[i1 - 1] || rchg2[i2 - 1]) { - for (l1 = i1; rchg1[i1 - 1]; i1--); - for (l2 = i2; rchg2[i2 - 1]; i2--); - - if (!(xch = xdl_add_change(cscr, i1, i2, l1 - i1, l2 - i2))) { - xdl_free_script(cscr); - return -1; - } - cscr = xch; - } - - *xscr = cscr; - - return 0; -} - - -void xdl_free_script(xdchange_t *xscr) { - xdchange_t *xch; - - while ((xch = xscr) != NULL) { - xscr = xscr->next; - xdl_free(xch); - } -} - -static int xdl_call_hunk_func(xdfenv_t *xe, xdchange_t *xscr, xdemitcb_t *ecb, - xdemitconf_t const *xecfg) -{ - xdchange_t *xch, *xche; - - (void)xe; - - for (xch = xscr; xch; xch = xche->next) { - xche = xdl_get_hunk(&xch, xecfg); - if (!xch) - break; - if (xecfg->hunk_func(xch->i1, xche->i1 + xche->chg1 - xch->i1, - xch->i2, xche->i2 + xche->chg2 - xch->i2, - ecb->priv) < 0) - return -1; - } - return 0; -} - -static void xdl_mark_ignorable(xdchange_t *xscr, xdfenv_t *xe, long flags) -{ - xdchange_t *xch; - - for (xch = xscr; xch; xch = xch->next) { - int ignore = 1; - xrecord_t **rec; - long i; - - rec = &xe->xdf1.recs[xch->i1]; - for (i = 0; i < xch->chg1 && ignore; i++) - ignore = xdl_blankline(rec[i]->ptr, rec[i]->size, flags); - - rec = &xe->xdf2.recs[xch->i2]; - for (i = 0; i < xch->chg2 && ignore; i++) - ignore = xdl_blankline(rec[i]->ptr, rec[i]->size, flags); - - xch->ignore = ignore; - } -} - -int xdl_diff(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp, - xdemitconf_t const *xecfg, xdemitcb_t *ecb) { - xdchange_t *xscr; - xdfenv_t xe; - emit_func_t ef = xecfg->hunk_func ? xdl_call_hunk_func : xdl_emit_diff; - - if (xdl_do_diff(mf1, mf2, xpp, &xe) < 0) { - - return -1; - } - if (xdl_change_compact(&xe.xdf1, &xe.xdf2, xpp->flags) < 0 || - xdl_change_compact(&xe.xdf2, &xe.xdf1, xpp->flags) < 0 || - xdl_build_script(&xe, &xscr) < 0) { - - xdl_free_env(&xe); - return -1; - } - if (xscr) { - if (xpp->flags & XDF_IGNORE_BLANK_LINES) - xdl_mark_ignorable(xscr, &xe, xpp->flags); - - if (ef(&xe, xscr, ecb, xecfg) < 0) { - - xdl_free_script(xscr); - xdl_free_env(&xe); - return -1; - } - xdl_free_script(xscr); - } - xdl_free_env(&xe); - - return 0; -} diff --git a/vendor/libgit2/src/xdiff/xdiffi.h b/vendor/libgit2/src/xdiff/xdiffi.h deleted file mode 100644 index 8b81206c9a..0000000000 --- a/vendor/libgit2/src/xdiff/xdiffi.h +++ /dev/null @@ -1,64 +0,0 @@ -/* - * LibXDiff by Davide Libenzi ( File Differential Library ) - * Copyright (C) 2003 Davide Libenzi - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Davide Libenzi - * - */ - -#if !defined(XDIFFI_H) -#define XDIFFI_H - - -typedef struct s_diffdata { - long nrec; - unsigned long const *ha; - long *rindex; - char *rchg; -} diffdata_t; - -typedef struct s_xdalgoenv { - long mxcost; - long snake_cnt; - long heur_min; -} xdalgoenv_t; - -typedef struct s_xdchange { - struct s_xdchange *next; - long i1, i2; - long chg1, chg2; - int ignore; -} xdchange_t; - - - -int xdl_recs_cmp(diffdata_t *dd1, long off1, long lim1, - diffdata_t *dd2, long off2, long lim2, - long *kvdf, long *kvdb, int need_min, xdalgoenv_t *xenv); -int xdl_do_diff(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp, - xdfenv_t *xe); -int xdl_change_compact(xdfile_t *xdf, xdfile_t *xdfo, long flags); -int xdl_build_script(xdfenv_t *xe, xdchange_t **xscr); -void xdl_free_script(xdchange_t *xscr); -int xdl_emit_diff(xdfenv_t *xe, xdchange_t *xscr, xdemitcb_t *ecb, - xdemitconf_t const *xecfg); -int xdl_do_patience_diff(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp, - xdfenv_t *env); -int xdl_do_histogram_diff(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp, - xdfenv_t *env); - -#endif /* #if !defined(XDIFFI_H) */ diff --git a/vendor/libgit2/src/xdiff/xemit.c b/vendor/libgit2/src/xdiff/xemit.c deleted file mode 100644 index 600fd1fddb..0000000000 --- a/vendor/libgit2/src/xdiff/xemit.c +++ /dev/null @@ -1,290 +0,0 @@ -/* - * LibXDiff by Davide Libenzi ( File Differential Library ) - * Copyright (C) 2003 Davide Libenzi - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Davide Libenzi - * - */ - -#include "xinclude.h" - - - - -static long xdl_get_rec(xdfile_t *xdf, long ri, char const **rec); -static int xdl_emit_record(xdfile_t *xdf, long ri, char const *pre, xdemitcb_t *ecb); - - - - -static long xdl_get_rec(xdfile_t *xdf, long ri, char const **rec) { - - *rec = xdf->recs[ri]->ptr; - - return xdf->recs[ri]->size; -} - - -static int xdl_emit_record(xdfile_t *xdf, long ri, char const *pre, xdemitcb_t *ecb) { - long size, psize = (long)strlen(pre); - char const *rec; - - size = xdl_get_rec(xdf, ri, &rec); - if (xdl_emit_diffrec(rec, size, pre, psize, ecb) < 0) { - - return -1; - } - - return 0; -} - - -/* - * Starting at the passed change atom, find the latest change atom to be included - * inside the differential hunk according to the specified configuration. - * Also advance xscr if the first changes must be discarded. - */ -xdchange_t *xdl_get_hunk(xdchange_t **xscr, xdemitconf_t const *xecfg) -{ - xdchange_t *xch, *xchp, *lxch; - long max_common = 2 * xecfg->ctxlen + xecfg->interhunkctxlen; - long max_ignorable = xecfg->ctxlen; - unsigned long ignored = 0; /* number of ignored blank lines */ - - /* remove ignorable changes that are too far before other changes */ - for (xchp = *xscr; xchp && xchp->ignore; xchp = xchp->next) { - xch = xchp->next; - - if (xch == NULL || - xch->i1 - (xchp->i1 + xchp->chg1) >= max_ignorable) - *xscr = xch; - } - - if (*xscr == NULL) - return NULL; - - lxch = *xscr; - - for (xchp = *xscr, xch = xchp->next; xch; xchp = xch, xch = xch->next) { - long distance = xch->i1 - (xchp->i1 + xchp->chg1); - if (distance > max_common) - break; - - if (distance < max_ignorable && (!xch->ignore || lxch == xchp)) { - lxch = xch; - ignored = 0; - } else if (distance < max_ignorable && xch->ignore) { - ignored += xch->chg2; - } else if (lxch != xchp && - xch->i1 + ignored - (lxch->i1 + lxch->chg1) > (unsigned long)max_common) { - break; - } else if (!xch->ignore) { - lxch = xch; - ignored = 0; - } else { - ignored += xch->chg2; - } - } - - return lxch; -} - - -static long def_ff(const char *rec, long len, char *buf, long sz, void *priv) -{ - (void)priv; - - if (len > 0 && - (isalpha((unsigned char)*rec) || /* identifier? */ - *rec == '_' || /* also identifier? */ - *rec == '$')) { /* identifiers from VMS and other esoterico */ - if (len > sz) - len = sz; - while (0 < len && isspace((unsigned char)rec[len - 1])) - len--; - memcpy(buf, rec, len); - return len; - } - return -1; -} - -static int xdl_emit_common(xdfenv_t *xe, xdchange_t *xscr, xdemitcb_t *ecb, - xdemitconf_t const *xecfg) { - xdfile_t *xdf = &xe->xdf2; - const char *rchg = xdf->rchg; - long ix; - - (void)xscr; - (void)xecfg; - - for (ix = 0; ix < xdf->nrec; ix++) { - if (rchg[ix]) - continue; - if (xdl_emit_record(xdf, ix, "", ecb)) - return -1; - } - return 0; -} - -struct func_line { - long len; - char buf[80]; -}; - -static long get_func_line(xdfenv_t *xe, xdemitconf_t const *xecfg, - struct func_line *func_line, long start, long limit) -{ - find_func_t ff = xecfg->find_func ? xecfg->find_func : def_ff; - long l, size, step = (start > limit) ? -1 : 1; - char *buf, dummy[1]; - - buf = func_line ? func_line->buf : dummy; - size = func_line ? sizeof(func_line->buf) : sizeof(dummy); - - for (l = start; l != limit && 0 <= l && l < xe->xdf1.nrec; l += step) { - const char *rec; - long reclen = xdl_get_rec(&xe->xdf1, l, &rec); - long len = ff(rec, reclen, buf, size, xecfg->find_func_priv); - if (len >= 0) { - if (func_line) - func_line->len = len; - return l; - } - } - return -1; -} - -int xdl_emit_diff(xdfenv_t *xe, xdchange_t *xscr, xdemitcb_t *ecb, - xdemitconf_t const *xecfg) { - long s1, s2, e1, e2, lctx; - xdchange_t *xch, *xche; - long funclineprev = -1; - struct func_line func_line = { 0 }; - - if (xecfg->flags & XDL_EMIT_COMMON) - return xdl_emit_common(xe, xscr, ecb, xecfg); - - for (xch = xscr; xch; xch = xche->next) { - xche = xdl_get_hunk(&xch, xecfg); - if (!xch) - break; - - s1 = XDL_MAX(xch->i1 - xecfg->ctxlen, 0); - s2 = XDL_MAX(xch->i2 - xecfg->ctxlen, 0); - - if (xecfg->flags & XDL_EMIT_FUNCCONTEXT) { - long fs1 = get_func_line(xe, xecfg, NULL, xch->i1, -1); - if (fs1 < 0) - fs1 = 0; - if (fs1 < s1) { - s2 -= s1 - fs1; - s1 = fs1; - } - } - - again: - lctx = xecfg->ctxlen; - lctx = XDL_MIN(lctx, xe->xdf1.nrec - (xche->i1 + xche->chg1)); - lctx = XDL_MIN(lctx, xe->xdf2.nrec - (xche->i2 + xche->chg2)); - - e1 = xche->i1 + xche->chg1 + lctx; - e2 = xche->i2 + xche->chg2 + lctx; - - if (xecfg->flags & XDL_EMIT_FUNCCONTEXT) { - long fe1 = get_func_line(xe, xecfg, NULL, - xche->i1 + xche->chg1, - xe->xdf1.nrec); - if (fe1 < 0) - fe1 = xe->xdf1.nrec; - if (fe1 > e1) { - e2 += fe1 - e1; - e1 = fe1; - } - - /* - * Overlap with next change? Then include it - * in the current hunk and start over to find - * its new end. - */ - if (xche->next) { - long l = xche->next->i1; - if (l <= e1 || - get_func_line(xe, xecfg, NULL, l, e1) < 0) { - xche = xche->next; - goto again; - } - } - } - - /* - * Emit current hunk header. - */ - - if (xecfg->flags & XDL_EMIT_FUNCNAMES) { - get_func_line(xe, xecfg, &func_line, - s1 - 1, funclineprev); - funclineprev = s1 - 1; - } - if (xdl_emit_hunk_hdr(s1 + 1, e1 - s1, s2 + 1, e2 - s2, - func_line.buf, func_line.len, ecb) < 0) - return -1; - - /* - * Emit pre-context. - */ - for (; s2 < xch->i2; s2++) - if (xdl_emit_record(&xe->xdf2, s2, " ", ecb) < 0) - return -1; - - for (s1 = xch->i1, s2 = xch->i2;; xch = xch->next) { - /* - * Merge previous with current change atom. - */ - for (; s1 < xch->i1 && s2 < xch->i2; s1++, s2++) - if (xdl_emit_record(&xe->xdf2, s2, " ", ecb) < 0) - return -1; - - /* - * Removes lines from the first file. - */ - for (s1 = xch->i1; s1 < xch->i1 + xch->chg1; s1++) - if (xdl_emit_record(&xe->xdf1, s1, "-", ecb) < 0) - return -1; - - /* - * Adds lines from the second file. - */ - for (s2 = xch->i2; s2 < xch->i2 + xch->chg2; s2++) - if (xdl_emit_record(&xe->xdf2, s2, "+", ecb) < 0) - return -1; - - if (xch == xche) - break; - s1 = xch->i1 + xch->chg1; - s2 = xch->i2 + xch->chg2; - } - - /* - * Emit post-context. - */ - for (s2 = xche->i2 + xche->chg2; s2 < e2; s2++) - if (xdl_emit_record(&xe->xdf2, s2, " ", ecb) < 0) - return -1; - } - - return 0; -} diff --git a/vendor/libgit2/src/xdiff/xemit.h b/vendor/libgit2/src/xdiff/xemit.h deleted file mode 100644 index d29710770c..0000000000 --- a/vendor/libgit2/src/xdiff/xemit.h +++ /dev/null @@ -1,36 +0,0 @@ -/* - * LibXDiff by Davide Libenzi ( File Differential Library ) - * Copyright (C) 2003 Davide Libenzi - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Davide Libenzi - * - */ - -#if !defined(XEMIT_H) -#define XEMIT_H - - -typedef int (*emit_func_t)(xdfenv_t *xe, xdchange_t *xscr, xdemitcb_t *ecb, - xdemitconf_t const *xecfg); - -xdchange_t *xdl_get_hunk(xdchange_t **xscr, xdemitconf_t const *xecfg); -int xdl_emit_diff(xdfenv_t *xe, xdchange_t *xscr, xdemitcb_t *ecb, - xdemitconf_t const *xecfg); - - - -#endif /* #if !defined(XEMIT_H) */ diff --git a/vendor/libgit2/src/xdiff/xhistogram.c b/vendor/libgit2/src/xdiff/xhistogram.c deleted file mode 100644 index 500d8112a9..0000000000 --- a/vendor/libgit2/src/xdiff/xhistogram.c +++ /dev/null @@ -1,371 +0,0 @@ -/* - * Copyright (C) 2010, Google Inc. - * and other copyright owners as documented in JGit's IP log. - * - * This program and the accompanying materials are made available - * under the terms of the Eclipse Distribution License v1.0 which - * accompanies this distribution, is reproduced below, and is - * available at http://www.eclipse.org/org/documents/edl-v10.php - * - * 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 the Eclipse Foundation, 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. - */ - -#include "xinclude.h" -#include "xtypes.h" -#include "xdiff.h" - -#define MAX_PTR UINT_MAX -#define MAX_CNT UINT_MAX - -#define LINE_END(n) (line##n + count##n - 1) -#define LINE_END_PTR(n) (*line##n + *count##n - 1) - -struct histindex { - struct record { - unsigned int ptr, cnt; - struct record *next; - } **records, /* an occurrence */ - **line_map; /* map of line to record chain */ - chastore_t rcha; - unsigned int *next_ptrs; - unsigned int table_bits, - records_size, - line_map_size; - - unsigned int max_chain_length, - key_shift, - ptr_shift; - - unsigned int cnt, - has_common; - - xdfenv_t *env; - xpparam_t const *xpp; -}; - -struct region { - unsigned int begin1, end1; - unsigned int begin2, end2; -}; - -#define LINE_MAP(i, a) (i->line_map[(a) - i->ptr_shift]) - -#define NEXT_PTR(index, ptr) \ - (index->next_ptrs[(ptr) - index->ptr_shift]) - -#define CNT(index, ptr) \ - ((LINE_MAP(index, ptr))->cnt) - -#define REC(env, s, l) \ - (env->xdf##s.recs[l - 1]) - -static int cmp_recs(xpparam_t const *xpp, - xrecord_t *r1, xrecord_t *r2) -{ - return r1->ha == r2->ha && - xdl_recmatch(r1->ptr, r1->size, r2->ptr, r2->size, - xpp->flags); -} - -#define CMP_ENV(xpp, env, s1, l1, s2, l2) \ - (cmp_recs(xpp, REC(env, s1, l1), REC(env, s2, l2))) - -#define CMP(i, s1, l1, s2, l2) \ - (cmp_recs(i->xpp, REC(i->env, s1, l1), REC(i->env, s2, l2))) - -#define TABLE_HASH(index, side, line) \ - XDL_HASHLONG((REC(index->env, side, line))->ha, index->table_bits) - -static int scanA(struct histindex *index, unsigned int line1, unsigned int count1) -{ - unsigned int ptr; - unsigned int tbl_idx; - unsigned int chain_len; - struct record **rec_chain, *rec; - - for (ptr = LINE_END(1); line1 <= ptr; ptr--) { - tbl_idx = TABLE_HASH(index, 1, ptr); - rec_chain = index->records + tbl_idx; - rec = *rec_chain; - - chain_len = 0; - while (rec) { - if (CMP(index, 1, rec->ptr, 1, ptr)) { - /* - * ptr is identical to another element. Insert - * it onto the front of the existing element - * chain. - */ - NEXT_PTR(index, ptr) = rec->ptr; - rec->ptr = ptr; - /* cap rec->cnt at MAX_CNT */ - rec->cnt = XDL_MIN(MAX_CNT, rec->cnt + 1); - LINE_MAP(index, ptr) = rec; - goto continue_scan; - } - - rec = rec->next; - chain_len++; - } - - if (chain_len == index->max_chain_length) - return -1; - - /* - * This is the first time we have ever seen this particular - * element in the sequence. Construct a new chain for it. - */ - if (!(rec = xdl_cha_alloc(&index->rcha))) - return -1; - rec->ptr = ptr; - rec->cnt = 1; - rec->next = *rec_chain; - *rec_chain = rec; - LINE_MAP(index, ptr) = rec; - -continue_scan: - ; /* no op */ - } - - return 0; -} - -static int try_lcs( - struct histindex *index, struct region *lcs, unsigned int b_ptr, - unsigned int line1, unsigned int count1, - unsigned int line2, unsigned int count2) -{ - unsigned int b_next = b_ptr + 1; - struct record *rec = index->records[TABLE_HASH(index, 2, b_ptr)]; - unsigned int as, ae, bs, be, np, rc; - int should_break; - - for (; rec; rec = rec->next) { - if (rec->cnt > index->cnt) { - if (!index->has_common) - index->has_common = CMP(index, 1, rec->ptr, 2, b_ptr); - continue; - } - - as = rec->ptr; - if (!CMP(index, 1, as, 2, b_ptr)) - continue; - - index->has_common = 1; - for (;;) { - should_break = 0; - np = NEXT_PTR(index, as); - bs = b_ptr; - ae = as; - be = bs; - rc = rec->cnt; - - while (line1 < as && line2 < bs - && CMP(index, 1, as - 1, 2, bs - 1)) { - as--; - bs--; - if (1 < rc) - rc = XDL_MIN(rc, CNT(index, as)); - } - while (ae < LINE_END(1) && be < LINE_END(2) - && CMP(index, 1, ae + 1, 2, be + 1)) { - ae++; - be++; - if (1 < rc) - rc = XDL_MIN(rc, CNT(index, ae)); - } - - if (b_next <= be) - b_next = be + 1; - if (lcs->end1 - lcs->begin1 < ae - as || rc < index->cnt) { - lcs->begin1 = as; - lcs->begin2 = bs; - lcs->end1 = ae; - lcs->end2 = be; - index->cnt = rc; - } - - if (np == 0) - break; - - while (np <= ae) { - np = NEXT_PTR(index, np); - if (np == 0) { - should_break = 1; - break; - } - } - - if (should_break) - break; - - as = np; - } - } - return b_next; -} - -static int find_lcs( - struct histindex *index, struct region *lcs, - unsigned int line1, unsigned int count1, - unsigned int line2, unsigned int count2) -{ - unsigned int b_ptr; - - if (scanA(index, line1, count1)) - return -1; - - index->cnt = index->max_chain_length + 1; - - for (b_ptr = line2; b_ptr <= LINE_END(2); ) - b_ptr = try_lcs(index, lcs, b_ptr, line1, count1, line2, count2); - - return index->has_common && index->max_chain_length < index->cnt; -} - -static int fall_back_to_classic_diff(struct histindex *index, - int line1, int count1, int line2, int count2) -{ - xpparam_t xpp; - xpp.flags = index->xpp->flags & ~XDF_DIFF_ALGORITHM_MASK; - - return xdl_fall_back_diff(index->env, &xpp, - line1, count1, line2, count2); -} - -static int histogram_diff( - xpparam_t const *xpp, xdfenv_t *env, - unsigned int line1, unsigned int count1, - unsigned int line2, unsigned int count2) -{ - struct histindex index; - struct region lcs; - unsigned int sz; - int result = -1; - - if (count1 <= 0 && count2 <= 0) - return 0; - - if (LINE_END(1) >= MAX_PTR) - return -1; - - if (!count1) { - while(count2--) - env->xdf2.rchg[line2++ - 1] = 1; - return 0; - } else if (!count2) { - while(count1--) - env->xdf1.rchg[line1++ - 1] = 1; - return 0; - } - - memset(&index, 0, sizeof(index)); - - index.env = env; - index.xpp = xpp; - - index.records = NULL; - index.line_map = NULL; - /* in case of early xdl_cha_free() */ - index.rcha.head = NULL; - - index.table_bits = xdl_hashbits(count1); - sz = index.records_size = 1 << index.table_bits; - sz *= sizeof(struct record *); - if (!(index.records = (struct record **) xdl_malloc(sz))) - goto cleanup; - memset(index.records, 0, sz); - - sz = index.line_map_size = count1; - sz *= sizeof(struct record *); - if (!(index.line_map = (struct record **) xdl_malloc(sz))) - goto cleanup; - memset(index.line_map, 0, sz); - - sz = index.line_map_size; - sz *= sizeof(unsigned int); - if (!(index.next_ptrs = (unsigned int *) xdl_malloc(sz))) - goto cleanup; - memset(index.next_ptrs, 0, sz); - - /* lines / 4 + 1 comes from xprepare.c:xdl_prepare_ctx() */ - if (xdl_cha_init(&index.rcha, sizeof(struct record), count1 / 4 + 1) < 0) - goto cleanup; - - index.ptr_shift = line1; - index.max_chain_length = 64; - - memset(&lcs, 0, sizeof(lcs)); - if (find_lcs(&index, &lcs, line1, count1, line2, count2)) - result = fall_back_to_classic_diff(&index, line1, count1, line2, count2); - else { - if (lcs.begin1 == 0 && lcs.begin2 == 0) { - while (count1--) - env->xdf1.rchg[line1++ - 1] = 1; - while (count2--) - env->xdf2.rchg[line2++ - 1] = 1; - result = 0; - } else { - result = histogram_diff(xpp, env, - line1, lcs.begin1 - line1, - line2, lcs.begin2 - line2); - if (result) - goto cleanup; - result = histogram_diff(xpp, env, - lcs.end1 + 1, LINE_END(1) - lcs.end1, - lcs.end2 + 1, LINE_END(2) - lcs.end2); - if (result) - goto cleanup; - } - } - -cleanup: - xdl_free(index.records); - xdl_free(index.line_map); - xdl_free(index.next_ptrs); - xdl_cha_free(&index.rcha); - - return result; -} - -int xdl_do_histogram_diff(mmfile_t *file1, mmfile_t *file2, - xpparam_t const *xpp, xdfenv_t *env) -{ - if (xdl_prepare_env(file1, file2, xpp, env) < 0) - return -1; - - return histogram_diff(xpp, env, - env->xdf1.dstart + 1, env->xdf1.dend - env->xdf1.dstart + 1, - env->xdf2.dstart + 1, env->xdf2.dend - env->xdf2.dstart + 1); -} diff --git a/vendor/libgit2/src/xdiff/xinclude.h b/vendor/libgit2/src/xdiff/xinclude.h deleted file mode 100644 index 4a1cde9092..0000000000 --- a/vendor/libgit2/src/xdiff/xinclude.h +++ /dev/null @@ -1,46 +0,0 @@ -/* - * LibXDiff by Davide Libenzi ( File Differential Library ) - * Copyright (C) 2003 Davide Libenzi - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Davide Libenzi - * - */ - -#if !defined(XINCLUDE_H) -#define XINCLUDE_H - -#include -#include -#include -#include -#include - -#ifdef _WIN32 -#else -#include -#endif - -#include "xmacros.h" -#include "xdiff.h" -#include "xtypes.h" -#include "xutils.h" -#include "xprepare.h" -#include "xdiffi.h" -#include "xemit.h" - - -#endif /* #if !defined(XINCLUDE_H) */ diff --git a/vendor/libgit2/src/xdiff/xmacros.h b/vendor/libgit2/src/xdiff/xmacros.h deleted file mode 100644 index 165a895a93..0000000000 --- a/vendor/libgit2/src/xdiff/xmacros.h +++ /dev/null @@ -1,54 +0,0 @@ -/* - * LibXDiff by Davide Libenzi ( File Differential Library ) - * Copyright (C) 2003 Davide Libenzi - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Davide Libenzi - * - */ - -#if !defined(XMACROS_H) -#define XMACROS_H - - - - -#define XDL_MIN(a, b) ((a) < (b) ? (a): (b)) -#define XDL_MAX(a, b) ((a) > (b) ? (a): (b)) -#define XDL_ABS(v) ((v) >= 0 ? (v): -(v)) -#define XDL_ISDIGIT(c) ((c) >= '0' && (c) <= '9') -#define XDL_ISSPACE(c) (isspace((unsigned char)(c))) -#define XDL_ADDBITS(v,b) ((v) + ((v) >> (b))) -#define XDL_MASKBITS(b) ((1UL << (b)) - 1) -#define XDL_HASHLONG(v,b) (XDL_ADDBITS((unsigned long)(v), b) & XDL_MASKBITS(b)) -#define XDL_PTRFREE(p) do { if (p) { xdl_free(p); (p) = NULL; } } while (0) -#define XDL_LE32_PUT(p, v) \ -do { \ - unsigned char *__p = (unsigned char *) (p); \ - *__p++ = (unsigned char) (v); \ - *__p++ = (unsigned char) ((v) >> 8); \ - *__p++ = (unsigned char) ((v) >> 16); \ - *__p = (unsigned char) ((v) >> 24); \ -} while (0) -#define XDL_LE32_GET(p, v) \ -do { \ - unsigned char const *__p = (unsigned char const *) (p); \ - (v) = (unsigned long) __p[0] | ((unsigned long) __p[1]) << 8 | \ - ((unsigned long) __p[2]) << 16 | ((unsigned long) __p[3]) << 24; \ -} while (0) - - -#endif /* #if !defined(XMACROS_H) */ diff --git a/vendor/libgit2/src/xdiff/xmerge.c b/vendor/libgit2/src/xdiff/xmerge.c deleted file mode 100644 index b11e598179..0000000000 --- a/vendor/libgit2/src/xdiff/xmerge.c +++ /dev/null @@ -1,619 +0,0 @@ -/* - * LibXDiff by Davide Libenzi ( File Differential Library ) - * Copyright (C) 2003-2006 Davide Libenzi, Johannes E. Schindelin - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Davide Libenzi - * - */ - -#include "xinclude.h" - -typedef struct s_xdmerge { - struct s_xdmerge *next; - /* - * 0 = conflict, - * 1 = no conflict, take first, - * 2 = no conflict, take second. - * 3 = no conflict, take both. - */ - int mode; - /* - * These point at the respective postimages. E.g. is - * how side #1 wants to change the common ancestor; if there is no - * overlap, lines before i1 in the postimage of side #1 appear - * in the merge result as a region touched by neither side. - */ - long i1, i2; - long chg1, chg2; - /* - * These point at the preimage; of course there is just one - * preimage, that is from the shared common ancestor. - */ - long i0; - long chg0; -} xdmerge_t; - -static int xdl_append_merge(xdmerge_t **merge, int mode, - long i0, long chg0, - long i1, long chg1, - long i2, long chg2) -{ - xdmerge_t *m = *merge; - if (m && (i1 <= m->i1 + m->chg1 || i2 <= m->i2 + m->chg2)) { - if (mode != m->mode) - m->mode = 0; - m->chg0 = i0 + chg0 - m->i0; - m->chg1 = i1 + chg1 - m->i1; - m->chg2 = i2 + chg2 - m->i2; - } else { - m = xdl_malloc(sizeof(xdmerge_t)); - if (!m) - return -1; - m->next = NULL; - m->mode = mode; - m->i0 = i0; - m->chg0 = chg0; - m->i1 = i1; - m->chg1 = chg1; - m->i2 = i2; - m->chg2 = chg2; - if (*merge) - (*merge)->next = m; - *merge = m; - } - return 0; -} - -static int xdl_cleanup_merge(xdmerge_t *c) -{ - int count = 0; - xdmerge_t *next_c; - - /* were there conflicts? */ - for (; c; c = next_c) { - if (c->mode == 0) - count++; - next_c = c->next; - free(c); - } - return count; -} - -static int xdl_merge_cmp_lines(xdfenv_t *xe1, int i1, xdfenv_t *xe2, int i2, - int line_count, long flags) -{ - int i; - xrecord_t **rec1 = xe1->xdf2.recs + i1; - xrecord_t **rec2 = xe2->xdf2.recs + i2; - - for (i = 0; i < line_count; i++) { - int result = xdl_recmatch(rec1[i]->ptr, rec1[i]->size, - rec2[i]->ptr, rec2[i]->size, flags); - if (!result) - return -1; - } - return 0; -} - -static int xdl_recs_copy_0(int use_orig, xdfenv_t *xe, int i, int count, int add_nl, char *dest) -{ - xrecord_t **recs; - int size = 0; - - recs = (use_orig ? xe->xdf1.recs : xe->xdf2.recs) + i; - - if (count < 1) - return 0; - - for (i = 0; i < count; size += recs[i++]->size) - if (dest) - memcpy(dest + size, recs[i]->ptr, recs[i]->size); - if (add_nl) { - i = recs[count - 1]->size; - if (i == 0 || recs[count - 1]->ptr[i - 1] != '\n') { - if (dest) - dest[size] = '\n'; - size++; - } - } - return size; -} - -static int xdl_recs_copy(xdfenv_t *xe, int i, int count, int add_nl, char *dest) -{ - return xdl_recs_copy_0(0, xe, i, count, add_nl, dest); -} - -static int xdl_orig_copy(xdfenv_t *xe, int i, int count, int add_nl, char *dest) -{ - return xdl_recs_copy_0(1, xe, i, count, add_nl, dest); -} - -static int fill_conflict_hunk(xdfenv_t *xe1, const char *name1, - xdfenv_t *xe2, const char *name2, - const char *name3, - int size, int i, int style, - xdmerge_t *m, char *dest, int marker_size) -{ - int marker1_size = (name1 ? (int)strlen(name1) + 1 : 0); - int marker2_size = (name2 ? (int)strlen(name2) + 1 : 0); - int marker3_size = (name3 ? (int)strlen(name3) + 1 : 0); - - if (marker_size <= 0) - marker_size = DEFAULT_CONFLICT_MARKER_SIZE; - - /* Before conflicting part */ - size += xdl_recs_copy(xe1, i, m->i1 - i, 0, - dest ? dest + size : NULL); - - if (!dest) { - size += marker_size + 1 + marker1_size; - } else { - memset(dest + size, '<', marker_size); - size += marker_size; - if (marker1_size) { - dest[size] = ' '; - memcpy(dest + size + 1, name1, marker1_size - 1); - size += marker1_size; - } - dest[size++] = '\n'; - } - - /* Postimage from side #1 */ - size += xdl_recs_copy(xe1, m->i1, m->chg1, 1, - dest ? dest + size : NULL); - - if (style == XDL_MERGE_DIFF3) { - /* Shared preimage */ - if (!dest) { - size += marker_size + 1 + marker3_size; - } else { - memset(dest + size, '|', marker_size); - size += marker_size; - if (marker3_size) { - dest[size] = ' '; - memcpy(dest + size + 1, name3, marker3_size - 1); - size += marker3_size; - } - dest[size++] = '\n'; - } - size += xdl_orig_copy(xe1, m->i0, m->chg0, 1, - dest ? dest + size : NULL); - } - - if (!dest) { - size += marker_size + 1; - } else { - memset(dest + size, '=', marker_size); - size += marker_size; - dest[size++] = '\n'; - } - - /* Postimage from side #2 */ - size += xdl_recs_copy(xe2, m->i2, m->chg2, 1, - dest ? dest + size : NULL); - if (!dest) { - size += marker_size + 1 + marker2_size; - } else { - memset(dest + size, '>', marker_size); - size += marker_size; - if (marker2_size) { - dest[size] = ' '; - memcpy(dest + size + 1, name2, marker2_size - 1); - size += marker2_size; - } - dest[size++] = '\n'; - } - return size; -} - -static int xdl_fill_merge_buffer(xdfenv_t *xe1, const char *name1, - xdfenv_t *xe2, const char *name2, - const char *ancestor_name, - int favor, - xdmerge_t *m, char *dest, int style, - int marker_size) -{ - int size, i; - - for (size = i = 0; m; m = m->next) { - if (favor && !m->mode) - m->mode = favor; - - if (m->mode == 0) - size = fill_conflict_hunk(xe1, name1, xe2, name2, - ancestor_name, - size, i, style, m, dest, - marker_size); - else if (m->mode & 3) { - /* Before conflicting part */ - size += xdl_recs_copy(xe1, i, m->i1 - i, 0, - dest ? dest + size : NULL); - /* Postimage from side #1 */ - if (m->mode & 1) - size += xdl_recs_copy(xe1, m->i1, m->chg1, (m->mode & 2), - dest ? dest + size : NULL); - /* Postimage from side #2 */ - if (m->mode & 2) - size += xdl_recs_copy(xe2, m->i2, m->chg2, 0, - dest ? dest + size : NULL); - } else - continue; - i = m->i1 + m->chg1; - } - size += xdl_recs_copy(xe1, i, xe1->xdf2.nrec - i, 0, - dest ? dest + size : NULL); - return size; -} - -/* - * Sometimes, changes are not quite identical, but differ in only a few - * lines. Try hard to show only these few lines as conflicting. - */ -static int xdl_refine_conflicts(xdfenv_t *xe1, xdfenv_t *xe2, xdmerge_t *m, - xpparam_t const *xpp) -{ - for (; m; m = m->next) { - mmfile_t t1, t2; - xdfenv_t xe; - xdchange_t *xscr, *x; - int i1 = m->i1, i2 = m->i2; - - /* let's handle just the conflicts */ - if (m->mode) - continue; - - /* no sense refining a conflict when one side is empty */ - if (m->chg1 == 0 || m->chg2 == 0) - continue; - - /* - * This probably does not work outside git, since - * we have a very simple mmfile structure. - */ - t1.ptr = (char *)xe1->xdf2.recs[m->i1]->ptr; - t1.size = xe1->xdf2.recs[m->i1 + m->chg1 - 1]->ptr - + xe1->xdf2.recs[m->i1 + m->chg1 - 1]->size - t1.ptr; - t2.ptr = (char *)xe2->xdf2.recs[m->i2]->ptr; - t2.size = xe2->xdf2.recs[m->i2 + m->chg2 - 1]->ptr - + xe2->xdf2.recs[m->i2 + m->chg2 - 1]->size - t2.ptr; - if (xdl_do_diff(&t1, &t2, xpp, &xe) < 0) - return -1; - if (xdl_change_compact(&xe.xdf1, &xe.xdf2, xpp->flags) < 0 || - xdl_change_compact(&xe.xdf2, &xe.xdf1, xpp->flags) < 0 || - xdl_build_script(&xe, &xscr) < 0) { - xdl_free_env(&xe); - return -1; - } - if (!xscr) { - /* If this happens, the changes are identical. */ - xdl_free_env(&xe); - m->mode = 4; - continue; - } - x = xscr; - m->i1 = xscr->i1 + i1; - m->chg1 = xscr->chg1; - m->i2 = xscr->i2 + i2; - m->chg2 = xscr->chg2; - while (xscr->next) { - xdmerge_t *m2 = xdl_malloc(sizeof(xdmerge_t)); - if (!m2) { - xdl_free_env(&xe); - xdl_free_script(x); - return -1; - } - xscr = xscr->next; - m2->next = m->next; - m->next = m2; - m = m2; - m->mode = 0; - m->i1 = xscr->i1 + i1; - m->chg1 = xscr->chg1; - m->i2 = xscr->i2 + i2; - m->chg2 = xscr->chg2; - } - xdl_free_env(&xe); - xdl_free_script(x); - } - return 0; -} - -static int line_contains_alnum(const char *ptr, long size) -{ - while (size--) - if (isalnum((unsigned char)*(ptr++))) - return 1; - return 0; -} - -static int lines_contain_alnum(xdfenv_t *xe, int i, int chg) -{ - for (; chg; chg--, i++) - if (line_contains_alnum(xe->xdf2.recs[i]->ptr, - xe->xdf2.recs[i]->size)) - return 1; - return 0; -} - -/* - * This function merges m and m->next, marking everything between those hunks - * as conflicting, too. - */ -static void xdl_merge_two_conflicts(xdmerge_t *m) -{ - xdmerge_t *next_m = m->next; - m->chg1 = next_m->i1 + next_m->chg1 - m->i1; - m->chg2 = next_m->i2 + next_m->chg2 - m->i2; - m->next = next_m->next; - free(next_m); -} - -/* - * If there are less than 3 non-conflicting lines between conflicts, - * it appears simpler -- because it takes up less (or as many) lines -- - * if the lines are moved into the conflicts. - */ -static int xdl_simplify_non_conflicts(xdfenv_t *xe1, xdmerge_t *m, - int simplify_if_no_alnum) -{ - int result = 0; - - if (!m) - return result; - for (;;) { - xdmerge_t *next_m = m->next; - int begin, end; - - if (!next_m) - return result; - - begin = m->i1 + m->chg1; - end = next_m->i1; - - if (m->mode != 0 || next_m->mode != 0 || - (end - begin > 3 && - (!simplify_if_no_alnum || - lines_contain_alnum(xe1, begin, end - begin)))) { - m = next_m; - } else { - result++; - xdl_merge_two_conflicts(m); - } - } -} - -/* - * level == 0: mark all overlapping changes as conflict - * level == 1: mark overlapping changes as conflict only if not identical - * level == 2: analyze non-identical changes for minimal conflict set - * level == 3: analyze non-identical changes for minimal conflict set, but - * treat hunks not containing any letter or number as conflicting - * - * returns < 0 on error, == 0 for no conflicts, else number of conflicts - */ -static int xdl_do_merge(xdfenv_t *xe1, xdchange_t *xscr1, - xdfenv_t *xe2, xdchange_t *xscr2, - xmparam_t const *xmp, mmbuffer_t *result) -{ - xdmerge_t *changes, *c; - xpparam_t const *xpp = &xmp->xpp; - const char *const ancestor_name = xmp->ancestor; - const char *const name1 = xmp->file1; - const char *const name2 = xmp->file2; - int i0, i1, i2, chg0, chg1, chg2; - int level = xmp->level; - int style = xmp->style; - int favor = xmp->favor; - - if (style == XDL_MERGE_DIFF3) { - /* - * "diff3 -m" output does not make sense for anything - * more aggressive than XDL_MERGE_EAGER. - */ - if (XDL_MERGE_EAGER < level) - level = XDL_MERGE_EAGER; - } - - c = changes = NULL; - - while (xscr1 && xscr2) { - if (!changes) - changes = c; - if (xscr1->i1 + xscr1->chg1 < xscr2->i1) { - i0 = xscr1->i1; - i1 = xscr1->i2; - i2 = xscr2->i2 - xscr2->i1 + xscr1->i1; - chg0 = xscr1->chg1; - chg1 = xscr1->chg2; - chg2 = xscr1->chg1; - if (xdl_append_merge(&c, 1, - i0, chg0, i1, chg1, i2, chg2)) { - xdl_cleanup_merge(changes); - return -1; - } - xscr1 = xscr1->next; - continue; - } - if (xscr2->i1 + xscr2->chg1 < xscr1->i1) { - i0 = xscr2->i1; - i1 = xscr1->i2 - xscr1->i1 + xscr2->i1; - i2 = xscr2->i2; - chg0 = xscr2->chg1; - chg1 = xscr2->chg1; - chg2 = xscr2->chg2; - if (xdl_append_merge(&c, 2, - i0, chg0, i1, chg1, i2, chg2)) { - xdl_cleanup_merge(changes); - return -1; - } - xscr2 = xscr2->next; - continue; - } - if (level == XDL_MERGE_MINIMAL || xscr1->i1 != xscr2->i1 || - xscr1->chg1 != xscr2->chg1 || - xscr1->chg2 != xscr2->chg2 || - xdl_merge_cmp_lines(xe1, xscr1->i2, - xe2, xscr2->i2, - xscr1->chg2, xpp->flags)) { - /* conflict */ - int off = xscr1->i1 - xscr2->i1; - int ffo = off + xscr1->chg1 - xscr2->chg1; - - i0 = xscr1->i1; - i1 = xscr1->i2; - i2 = xscr2->i2; - if (off > 0) { - i0 -= off; - i1 -= off; - } - else - i2 += off; - chg0 = xscr1->i1 + xscr1->chg1 - i0; - chg1 = xscr1->i2 + xscr1->chg2 - i1; - chg2 = xscr2->i2 + xscr2->chg2 - i2; - if (ffo < 0) { - chg0 -= ffo; - chg1 -= ffo; - } else - chg2 += ffo; - if (xdl_append_merge(&c, 0, - i0, chg0, i1, chg1, i2, chg2)) { - xdl_cleanup_merge(changes); - return -1; - } - } - - i1 = xscr1->i1 + xscr1->chg1; - i2 = xscr2->i1 + xscr2->chg1; - - if (i1 >= i2) - xscr2 = xscr2->next; - if (i2 >= i1) - xscr1 = xscr1->next; - } - while (xscr1) { - if (!changes) - changes = c; - i0 = xscr1->i1; - i1 = xscr1->i2; - i2 = xscr1->i1 + xe2->xdf2.nrec - xe2->xdf1.nrec; - chg0 = xscr1->chg1; - chg1 = xscr1->chg2; - chg2 = xscr1->chg1; - if (xdl_append_merge(&c, 1, - i0, chg0, i1, chg1, i2, chg2)) { - xdl_cleanup_merge(changes); - return -1; - } - xscr1 = xscr1->next; - } - while (xscr2) { - if (!changes) - changes = c; - i0 = xscr2->i1; - i1 = xscr2->i1 + xe1->xdf2.nrec - xe1->xdf1.nrec; - i2 = xscr2->i2; - chg0 = xscr2->chg1; - chg1 = xscr2->chg1; - chg2 = xscr2->chg2; - if (xdl_append_merge(&c, 2, - i0, chg0, i1, chg1, i2, chg2)) { - xdl_cleanup_merge(changes); - return -1; - } - xscr2 = xscr2->next; - } - if (!changes) - changes = c; - /* refine conflicts */ - if (XDL_MERGE_ZEALOUS <= level && - (xdl_refine_conflicts(xe1, xe2, changes, xpp) < 0 || - xdl_simplify_non_conflicts(xe1, changes, - XDL_MERGE_ZEALOUS < level) < 0)) { - xdl_cleanup_merge(changes); - return -1; - } - /* output */ - if (result) { - int marker_size = xmp->marker_size; - int size = xdl_fill_merge_buffer(xe1, name1, xe2, name2, - ancestor_name, - favor, changes, NULL, style, - marker_size); - result->ptr = xdl_malloc(size); - if (!result->ptr) { - xdl_cleanup_merge(changes); - return -1; - } - result->size = size; - xdl_fill_merge_buffer(xe1, name1, xe2, name2, - ancestor_name, favor, changes, - result->ptr, style, marker_size); - } - return xdl_cleanup_merge(changes); -} - -int xdl_merge(mmfile_t *orig, mmfile_t *mf1, mmfile_t *mf2, - xmparam_t const *xmp, mmbuffer_t *result) -{ - xdchange_t *xscr1, *xscr2; - xdfenv_t xe1, xe2; - int status; - xpparam_t const *xpp = &xmp->xpp; - - result->ptr = NULL; - result->size = 0; - - if (xdl_do_diff(orig, mf1, xpp, &xe1) < 0 || - xdl_do_diff(orig, mf2, xpp, &xe2) < 0) { - return -1; - } - if (xdl_change_compact(&xe1.xdf1, &xe1.xdf2, xpp->flags) < 0 || - xdl_change_compact(&xe1.xdf2, &xe1.xdf1, xpp->flags) < 0 || - xdl_build_script(&xe1, &xscr1) < 0) { - xdl_free_env(&xe1); - return -1; - } - if (xdl_change_compact(&xe2.xdf1, &xe2.xdf2, xpp->flags) < 0 || - xdl_change_compact(&xe2.xdf2, &xe2.xdf1, xpp->flags) < 0 || - xdl_build_script(&xe2, &xscr2) < 0) { - xdl_free_env(&xe2); - return -1; - } - status = 0; - if (!xscr1) { - result->ptr = xdl_malloc(mf2->size); - memcpy(result->ptr, mf2->ptr, mf2->size); - result->size = mf2->size; - } else if (!xscr2) { - result->ptr = xdl_malloc(mf1->size); - memcpy(result->ptr, mf1->ptr, mf1->size); - result->size = mf1->size; - } else { - status = xdl_do_merge(&xe1, xscr1, - &xe2, xscr2, - xmp, result); - } - xdl_free_script(xscr1); - xdl_free_script(xscr2); - - xdl_free_env(&xe1); - xdl_free_env(&xe2); - - return status; -} diff --git a/vendor/libgit2/src/xdiff/xpatience.c b/vendor/libgit2/src/xdiff/xpatience.c deleted file mode 100644 index 04e1a1ab2a..0000000000 --- a/vendor/libgit2/src/xdiff/xpatience.c +++ /dev/null @@ -1,358 +0,0 @@ -/* - * LibXDiff by Davide Libenzi ( File Differential Library ) - * Copyright (C) 2003-2009 Davide Libenzi, Johannes E. Schindelin - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Davide Libenzi - * - */ -#include "xinclude.h" -#include "xtypes.h" -#include "xdiff.h" - -/* - * The basic idea of patience diff is to find lines that are unique in - * both files. These are intuitively the ones that we want to see as - * common lines. - * - * The maximal ordered sequence of such line pairs (where ordered means - * that the order in the sequence agrees with the order of the lines in - * both files) naturally defines an initial set of common lines. - * - * Now, the algorithm tries to extend the set of common lines by growing - * the line ranges where the files have identical lines. - * - * Between those common lines, the patience diff algorithm is applied - * recursively, until no unique line pairs can be found; these line ranges - * are handled by the well-known Myers algorithm. - */ - -#define NON_UNIQUE ULONG_MAX - -/* - * This is a hash mapping from line hash to line numbers in the first and - * second file. - */ -struct hashmap { - int nr, alloc; - struct entry { - unsigned long hash; - /* - * 0 = unused entry, 1 = first line, 2 = second, etc. - * line2 is NON_UNIQUE if the line is not unique - * in either the first or the second file. - */ - unsigned long line1, line2; - /* - * "next" & "previous" are used for the longest common - * sequence; - * initially, "next" reflects only the order in file1. - */ - struct entry *next, *previous; - } *entries, *first, *last; - /* were common records found? */ - unsigned long has_matches; - mmfile_t *file1, *file2; - xdfenv_t *env; - xpparam_t const *xpp; -}; - -/* The argument "pass" is 1 for the first file, 2 for the second. */ -static void insert_record(int line, struct hashmap *map, int pass) -{ - xrecord_t **records = pass == 1 ? - map->env->xdf1.recs : map->env->xdf2.recs; - xrecord_t *record = records[line - 1], *other; - /* - * After xdl_prepare_env() (or more precisely, due to - * xdl_classify_record()), the "ha" member of the records (AKA lines) - * is _not_ the hash anymore, but a linearized version of it. In - * other words, the "ha" member is guaranteed to start with 0 and - * the second record's ha can only be 0 or 1, etc. - * - * So we multiply ha by 2 in the hope that the hashing was - * "unique enough". - */ - int index = (int)((record->ha << 1) % map->alloc); - - while (map->entries[index].line1) { - other = map->env->xdf1.recs[map->entries[index].line1 - 1]; - if (map->entries[index].hash != record->ha || - !xdl_recmatch(record->ptr, record->size, - other->ptr, other->size, - map->xpp->flags)) { - if (++index >= map->alloc) - index = 0; - continue; - } - if (pass == 2) - map->has_matches = 1; - if (pass == 1 || map->entries[index].line2) - map->entries[index].line2 = NON_UNIQUE; - else - map->entries[index].line2 = line; - return; - } - if (pass == 2) - return; - map->entries[index].line1 = line; - map->entries[index].hash = record->ha; - if (!map->first) - map->first = map->entries + index; - if (map->last) { - map->last->next = map->entries + index; - map->entries[index].previous = map->last; - } - map->last = map->entries + index; - map->nr++; -} - -/* - * This function has to be called for each recursion into the inter-hunk - * parts, as previously non-unique lines can become unique when being - * restricted to a smaller part of the files. - * - * It is assumed that env has been prepared using xdl_prepare(). - */ -static int fill_hashmap(mmfile_t *file1, mmfile_t *file2, - xpparam_t const *xpp, xdfenv_t *env, - struct hashmap *result, - int line1, int count1, int line2, int count2) -{ - result->file1 = file1; - result->file2 = file2; - result->xpp = xpp; - result->env = env; - - /* We know exactly how large we want the hash map */ - result->alloc = count1 * 2; - result->entries = (struct entry *) - xdl_malloc(result->alloc * sizeof(struct entry)); - if (!result->entries) - return -1; - memset(result->entries, 0, result->alloc * sizeof(struct entry)); - - /* First, fill with entries from the first file */ - while (count1--) - insert_record(line1++, result, 1); - - /* Then search for matches in the second file */ - while (count2--) - insert_record(line2++, result, 2); - - return 0; -} - -/* - * Find the longest sequence with a smaller last element (meaning a smaller - * line2, as we construct the sequence with entries ordered by line1). - */ -static int binary_search(struct entry **sequence, int longest, - struct entry *entry) -{ - int left = -1, right = longest; - - while (left + 1 < right) { - int middle = (left + right) / 2; - /* by construction, no two entries can be equal */ - if (sequence[middle]->line2 > entry->line2) - right = middle; - else - left = middle; - } - /* return the index in "sequence", _not_ the sequence length */ - return left; -} - -/* - * The idea is to start with the list of common unique lines sorted by - * the order in file1. For each of these pairs, the longest (partial) - * sequence whose last element's line2 is smaller is determined. - * - * For efficiency, the sequences are kept in a list containing exactly one - * item per sequence length: the sequence with the smallest last - * element (in terms of line2). - */ -static struct entry *find_longest_common_sequence(struct hashmap *map) -{ - struct entry **sequence = xdl_malloc(map->nr * sizeof(struct entry *)); - int longest = 0, i; - struct entry *entry; - - for (entry = map->first; entry; entry = entry->next) { - if (!entry->line2 || entry->line2 == NON_UNIQUE) - continue; - i = binary_search(sequence, longest, entry); - entry->previous = i < 0 ? NULL : sequence[i]; - sequence[++i] = entry; - if (i == longest) - longest++; - } - - /* No common unique lines were found */ - if (!longest) { - xdl_free(sequence); - return NULL; - } - - /* Iterate starting at the last element, adjusting the "next" members */ - entry = sequence[longest - 1]; - entry->next = NULL; - while (entry->previous) { - entry->previous->next = entry; - entry = entry->previous; - } - xdl_free(sequence); - return entry; -} - -static int match(struct hashmap *map, int line1, int line2) -{ - xrecord_t *record1 = map->env->xdf1.recs[line1 - 1]; - xrecord_t *record2 = map->env->xdf2.recs[line2 - 1]; - return xdl_recmatch(record1->ptr, record1->size, - record2->ptr, record2->size, map->xpp->flags); -} - -static int patience_diff(mmfile_t *file1, mmfile_t *file2, - xpparam_t const *xpp, xdfenv_t *env, - int line1, int count1, int line2, int count2); - -static int walk_common_sequence(struct hashmap *map, struct entry *first, - int line1, int count1, int line2, int count2) -{ - int end1 = line1 + count1, end2 = line2 + count2; - int next1, next2; - - for (;;) { - /* Try to grow the line ranges of common lines */ - if (first) { - next1 = first->line1; - next2 = first->line2; - while (next1 > line1 && next2 > line2 && - match(map, next1 - 1, next2 - 1)) { - next1--; - next2--; - } - } else { - next1 = end1; - next2 = end2; - } - while (line1 < next1 && line2 < next2 && - match(map, line1, line2)) { - line1++; - line2++; - } - - /* Recurse */ - if (next1 > line1 || next2 > line2) { - struct hashmap submap; - - memset(&submap, 0, sizeof(submap)); - if (patience_diff(map->file1, map->file2, - map->xpp, map->env, - line1, next1 - line1, - line2, next2 - line2)) - return -1; - } - - if (!first) - return 0; - - while (first->next && - first->next->line1 == first->line1 + 1 && - first->next->line2 == first->line2 + 1) - first = first->next; - - line1 = first->line1 + 1; - line2 = first->line2 + 1; - - first = first->next; - } -} - -static int fall_back_to_classic_diff(struct hashmap *map, - int line1, int count1, int line2, int count2) -{ - xpparam_t xpp; - xpp.flags = map->xpp->flags & ~XDF_DIFF_ALGORITHM_MASK; - - return xdl_fall_back_diff(map->env, &xpp, - line1, count1, line2, count2); -} - -/* - * Recursively find the longest common sequence of unique lines, - * and if none was found, ask xdl_do_diff() to do the job. - * - * This function assumes that env was prepared with xdl_prepare_env(). - */ -static int patience_diff(mmfile_t *file1, mmfile_t *file2, - xpparam_t const *xpp, xdfenv_t *env, - int line1, int count1, int line2, int count2) -{ - struct hashmap map; - struct entry *first; - int result = 0; - - /* trivial case: one side is empty */ - if (!count1) { - while(count2--) - env->xdf2.rchg[line2++ - 1] = 1; - return 0; - } else if (!count2) { - while(count1--) - env->xdf1.rchg[line1++ - 1] = 1; - return 0; - } - - memset(&map, 0, sizeof(map)); - if (fill_hashmap(file1, file2, xpp, env, &map, - line1, count1, line2, count2)) - return -1; - - /* are there any matching lines at all? */ - if (!map.has_matches) { - while(count1--) - env->xdf1.rchg[line1++ - 1] = 1; - while(count2--) - env->xdf2.rchg[line2++ - 1] = 1; - xdl_free(map.entries); - return 0; - } - - first = find_longest_common_sequence(&map); - if (first) - result = walk_common_sequence(&map, first, - line1, count1, line2, count2); - else - result = fall_back_to_classic_diff(&map, - line1, count1, line2, count2); - - xdl_free(map.entries); - return result; -} - -int xdl_do_patience_diff(mmfile_t *file1, mmfile_t *file2, - xpparam_t const *xpp, xdfenv_t *env) -{ - if (xdl_prepare_env(file1, file2, xpp, env) < 0) - return -1; - - /* environment is cleaned up in xdl_diff() */ - return patience_diff(file1, file2, xpp, env, - 1, env->xdf1.nrec, 1, env->xdf2.nrec); -} diff --git a/vendor/libgit2/src/xdiff/xprepare.c b/vendor/libgit2/src/xdiff/xprepare.c deleted file mode 100644 index 63a22c630e..0000000000 --- a/vendor/libgit2/src/xdiff/xprepare.c +++ /dev/null @@ -1,482 +0,0 @@ -/* - * LibXDiff by Davide Libenzi ( File Differential Library ) - * Copyright (C) 2003 Davide Libenzi - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Davide Libenzi - * - */ - -#include "xinclude.h" - - -#define XDL_KPDIS_RUN 4 -#define XDL_MAX_EQLIMIT 1024 -#define XDL_SIMSCAN_WINDOW 100 -#define XDL_GUESS_NLINES1 256 -#define XDL_GUESS_NLINES2 20 - - -typedef struct s_xdlclass { - struct s_xdlclass *next; - unsigned long ha; - char const *line; - long size; - long idx; - long len1, len2; -} xdlclass_t; - -typedef struct s_xdlclassifier { - unsigned int hbits; - long hsize; - xdlclass_t **rchash; - chastore_t ncha; - xdlclass_t **rcrecs; - long alloc; - long count; - long flags; -} xdlclassifier_t; - - - - -static int xdl_init_classifier(xdlclassifier_t *cf, long size, long flags); -static void xdl_free_classifier(xdlclassifier_t *cf); -static int xdl_classify_record(unsigned int pass, xdlclassifier_t *cf, xrecord_t **rhash, - unsigned int hbits, xrecord_t *rec); -static int xdl_prepare_ctx(unsigned int pass, mmfile_t *mf, long narec, xpparam_t const *xpp, - xdlclassifier_t *cf, xdfile_t *xdf); -static void xdl_free_ctx(xdfile_t *xdf); -static int xdl_clean_mmatch(char const *dis, long i, long s, long e); -static int xdl_cleanup_records(xdlclassifier_t *cf, xdfile_t *xdf1, xdfile_t *xdf2); -static int xdl_trim_ends(xdfile_t *xdf1, xdfile_t *xdf2); -static int xdl_optimize_ctxs(xdlclassifier_t *cf, xdfile_t *xdf1, xdfile_t *xdf2); - - - - -static int xdl_init_classifier(xdlclassifier_t *cf, long size, long flags) { - cf->flags = flags; - - cf->hbits = xdl_hashbits((unsigned int) size); - cf->hsize = 1 << cf->hbits; - - if (xdl_cha_init(&cf->ncha, sizeof(xdlclass_t), size / 4 + 1) < 0) { - - return -1; - } - if (!(cf->rchash = (xdlclass_t **) xdl_malloc(cf->hsize * sizeof(xdlclass_t *)))) { - - xdl_cha_free(&cf->ncha); - return -1; - } - memset(cf->rchash, 0, cf->hsize * sizeof(xdlclass_t *)); - - cf->alloc = size; - if (!(cf->rcrecs = (xdlclass_t **) xdl_malloc(cf->alloc * sizeof(xdlclass_t *)))) { - - xdl_free(cf->rchash); - xdl_cha_free(&cf->ncha); - return -1; - } - - cf->count = 0; - - return 0; -} - - -static void xdl_free_classifier(xdlclassifier_t *cf) { - - xdl_free(cf->rcrecs); - xdl_free(cf->rchash); - xdl_cha_free(&cf->ncha); -} - - -static int xdl_classify_record(unsigned int pass, xdlclassifier_t *cf, xrecord_t **rhash, - unsigned int hbits, xrecord_t *rec) { - long hi; - char const *line; - xdlclass_t *rcrec; - xdlclass_t **rcrecs; - - line = rec->ptr; - hi = (long) XDL_HASHLONG(rec->ha, cf->hbits); - for (rcrec = cf->rchash[hi]; rcrec; rcrec = rcrec->next) - if (rcrec->ha == rec->ha && - xdl_recmatch(rcrec->line, rcrec->size, - rec->ptr, rec->size, cf->flags)) - break; - - if (!rcrec) { - if (!(rcrec = xdl_cha_alloc(&cf->ncha))) { - - return -1; - } - rcrec->idx = cf->count++; - if (cf->count > cf->alloc) { - cf->alloc *= 2; - if (!(rcrecs = (xdlclass_t **) xdl_realloc(cf->rcrecs, cf->alloc * sizeof(xdlclass_t *)))) { - - return -1; - } - cf->rcrecs = rcrecs; - } - cf->rcrecs[rcrec->idx] = rcrec; - rcrec->line = line; - rcrec->size = rec->size; - rcrec->ha = rec->ha; - rcrec->len1 = rcrec->len2 = 0; - rcrec->next = cf->rchash[hi]; - cf->rchash[hi] = rcrec; - } - - (pass == 1) ? rcrec->len1++ : rcrec->len2++; - - rec->ha = (unsigned long) rcrec->idx; - - hi = (long) XDL_HASHLONG(rec->ha, hbits); - rec->next = rhash[hi]; - rhash[hi] = rec; - - return 0; -} - - -static int xdl_prepare_ctx(unsigned int pass, mmfile_t *mf, long narec, xpparam_t const *xpp, - xdlclassifier_t *cf, xdfile_t *xdf) { - unsigned int hbits; - long nrec, hsize, bsize; - unsigned long hav; - char const *blk, *cur, *top, *prev; - xrecord_t *crec; - xrecord_t **recs, **rrecs; - xrecord_t **rhash; - unsigned long *ha; - char *rchg; - long *rindex; - - ha = NULL; - rindex = NULL; - rchg = NULL; - rhash = NULL; - recs = NULL; - - if (xdl_cha_init(&xdf->rcha, sizeof(xrecord_t), narec / 4 + 1) < 0) - goto abort; - if (!(recs = (xrecord_t **) xdl_malloc(narec * sizeof(xrecord_t *)))) - goto abort; - - if (XDF_DIFF_ALG(xpp->flags) == XDF_HISTOGRAM_DIFF) - hbits = hsize = 0; - else { - hbits = xdl_hashbits((unsigned int) narec); - hsize = 1 << hbits; - if (!(rhash = (xrecord_t **) xdl_malloc(hsize * sizeof(xrecord_t *)))) - goto abort; - memset(rhash, 0, hsize * sizeof(xrecord_t *)); - } - - nrec = 0; - if ((cur = blk = xdl_mmfile_first(mf, &bsize)) != NULL) { - for (top = blk + bsize; cur < top; ) { - prev = cur; - hav = xdl_hash_record(&cur, top, xpp->flags); - if (nrec >= narec) { - narec *= 2; - if (!(rrecs = (xrecord_t **) xdl_realloc(recs, narec * sizeof(xrecord_t *)))) - goto abort; - recs = rrecs; - } - if (!(crec = xdl_cha_alloc(&xdf->rcha))) - goto abort; - crec->ptr = prev; - crec->size = (long) (cur - prev); - crec->ha = hav; - recs[nrec++] = crec; - - if ((XDF_DIFF_ALG(xpp->flags) != XDF_HISTOGRAM_DIFF) && - xdl_classify_record(pass, cf, rhash, hbits, crec) < 0) - goto abort; - } - } - - if (!(rchg = (char *) xdl_malloc((nrec + 2) * sizeof(char)))) - goto abort; - memset(rchg, 0, (nrec + 2) * sizeof(char)); - - if (!(rindex = (long *) xdl_malloc((nrec + 1) * sizeof(long)))) - goto abort; - if (!(ha = (unsigned long *) xdl_malloc((nrec + 1) * sizeof(unsigned long)))) - goto abort; - - xdf->nrec = nrec; - xdf->recs = recs; - xdf->hbits = hbits; - xdf->rhash = rhash; - xdf->rchg = rchg + 1; - xdf->rindex = rindex; - xdf->nreff = 0; - xdf->ha = ha; - xdf->dstart = 0; - xdf->dend = nrec - 1; - - return 0; - -abort: - xdl_free(ha); - xdl_free(rindex); - xdl_free(rchg); - xdl_free(rhash); - xdl_free(recs); - xdl_cha_free(&xdf->rcha); - return -1; -} - - -static void xdl_free_ctx(xdfile_t *xdf) { - - xdl_free(xdf->rhash); - xdl_free(xdf->rindex); - xdl_free(xdf->rchg - 1); - xdl_free(xdf->ha); - xdl_free(xdf->recs); - xdl_cha_free(&xdf->rcha); -} - - -int xdl_prepare_env(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp, - xdfenv_t *xe) { - long enl1, enl2, sample; - xdlclassifier_t cf; - - memset(&cf, 0, sizeof(cf)); - - /* - * For histogram diff, we can afford a smaller sample size and - * thus a poorer estimate of the number of lines, as the hash - * table (rhash) won't be filled up/grown. The number of lines - * (nrecs) will be updated correctly anyway by - * xdl_prepare_ctx(). - */ - sample = (XDF_DIFF_ALG(xpp->flags) == XDF_HISTOGRAM_DIFF - ? XDL_GUESS_NLINES2 : XDL_GUESS_NLINES1); - - enl1 = xdl_guess_lines(mf1, sample) + 1; - enl2 = xdl_guess_lines(mf2, sample) + 1; - - if (XDF_DIFF_ALG(xpp->flags) != XDF_HISTOGRAM_DIFF && - xdl_init_classifier(&cf, enl1 + enl2 + 1, xpp->flags) < 0) - return -1; - - if (xdl_prepare_ctx(1, mf1, enl1, xpp, &cf, &xe->xdf1) < 0) { - - xdl_free_classifier(&cf); - return -1; - } - if (xdl_prepare_ctx(2, mf2, enl2, xpp, &cf, &xe->xdf2) < 0) { - - xdl_free_ctx(&xe->xdf1); - xdl_free_classifier(&cf); - return -1; - } - - if ((XDF_DIFF_ALG(xpp->flags) != XDF_PATIENCE_DIFF) && - (XDF_DIFF_ALG(xpp->flags) != XDF_HISTOGRAM_DIFF) && - xdl_optimize_ctxs(&cf, &xe->xdf1, &xe->xdf2) < 0) { - - xdl_free_ctx(&xe->xdf2); - xdl_free_ctx(&xe->xdf1); - return -1; - } - - if (!(xpp->flags & XDF_HISTOGRAM_DIFF)) - xdl_free_classifier(&cf); - - return 0; -} - - -void xdl_free_env(xdfenv_t *xe) { - - xdl_free_ctx(&xe->xdf2); - xdl_free_ctx(&xe->xdf1); -} - - -static int xdl_clean_mmatch(char const *dis, long i, long s, long e) { - long r, rdis0, rpdis0, rdis1, rpdis1; - - /* - * Limits the window the is examined during the similar-lines - * scan. The loops below stops when dis[i - r] == 1 (line that - * has no match), but there are corner cases where the loop - * proceed all the way to the extremities by causing huge - * performance penalties in case of big files. - */ - if (i - s > XDL_SIMSCAN_WINDOW) - s = i - XDL_SIMSCAN_WINDOW; - if (e - i > XDL_SIMSCAN_WINDOW) - e = i + XDL_SIMSCAN_WINDOW; - - /* - * Scans the lines before 'i' to find a run of lines that either - * have no match (dis[j] == 0) or have multiple matches (dis[j] > 1). - * Note that we always call this function with dis[i] > 1, so the - * current line (i) is already a multimatch line. - */ - for (r = 1, rdis0 = 0, rpdis0 = 1; (i - r) >= s; r++) { - if (!dis[i - r]) - rdis0++; - else if (dis[i - r] == 2) - rpdis0++; - else - break; - } - /* - * If the run before the line 'i' found only multimatch lines, we - * return 0 and hence we don't make the current line (i) discarded. - * We want to discard multimatch lines only when they appear in the - * middle of runs with nomatch lines (dis[j] == 0). - */ - if (rdis0 == 0) - return 0; - for (r = 1, rdis1 = 0, rpdis1 = 1; (i + r) <= e; r++) { - if (!dis[i + r]) - rdis1++; - else if (dis[i + r] == 2) - rpdis1++; - else - break; - } - /* - * If the run after the line 'i' found only multimatch lines, we - * return 0 and hence we don't make the current line (i) discarded. - */ - if (rdis1 == 0) - return 0; - rdis1 += rdis0; - rpdis1 += rpdis0; - - return rpdis1 * XDL_KPDIS_RUN < (rpdis1 + rdis1); -} - - -/* - * Try to reduce the problem complexity, discard records that have no - * matches on the other file. Also, lines that have multiple matches - * might be potentially discarded if they happear in a run of discardable. - */ -static int xdl_cleanup_records(xdlclassifier_t *cf, xdfile_t *xdf1, xdfile_t *xdf2) { - long i, nm, nreff, mlim; - xrecord_t **recs; - xdlclass_t *rcrec; - char *dis, *dis1, *dis2; - - if (!(dis = (char *) xdl_malloc(xdf1->nrec + xdf2->nrec + 2))) { - - return -1; - } - memset(dis, 0, xdf1->nrec + xdf2->nrec + 2); - dis1 = dis; - dis2 = dis1 + xdf1->nrec + 1; - - if ((mlim = xdl_bogosqrt(xdf1->nrec)) > XDL_MAX_EQLIMIT) - mlim = XDL_MAX_EQLIMIT; - for (i = xdf1->dstart, recs = &xdf1->recs[xdf1->dstart]; i <= xdf1->dend; i++, recs++) { - rcrec = cf->rcrecs[(*recs)->ha]; - nm = rcrec ? rcrec->len2 : 0; - dis1[i] = (nm == 0) ? 0: (nm >= mlim) ? 2: 1; - } - - if ((mlim = xdl_bogosqrt(xdf2->nrec)) > XDL_MAX_EQLIMIT) - mlim = XDL_MAX_EQLIMIT; - for (i = xdf2->dstart, recs = &xdf2->recs[xdf2->dstart]; i <= xdf2->dend; i++, recs++) { - rcrec = cf->rcrecs[(*recs)->ha]; - nm = rcrec ? rcrec->len1 : 0; - dis2[i] = (nm == 0) ? 0: (nm >= mlim) ? 2: 1; - } - - for (nreff = 0, i = xdf1->dstart, recs = &xdf1->recs[xdf1->dstart]; - i <= xdf1->dend; i++, recs++) { - if (dis1[i] == 1 || - (dis1[i] == 2 && !xdl_clean_mmatch(dis1, i, xdf1->dstart, xdf1->dend))) { - xdf1->rindex[nreff] = i; - xdf1->ha[nreff] = (*recs)->ha; - nreff++; - } else - xdf1->rchg[i] = 1; - } - xdf1->nreff = nreff; - - for (nreff = 0, i = xdf2->dstart, recs = &xdf2->recs[xdf2->dstart]; - i <= xdf2->dend; i++, recs++) { - if (dis2[i] == 1 || - (dis2[i] == 2 && !xdl_clean_mmatch(dis2, i, xdf2->dstart, xdf2->dend))) { - xdf2->rindex[nreff] = i; - xdf2->ha[nreff] = (*recs)->ha; - nreff++; - } else - xdf2->rchg[i] = 1; - } - xdf2->nreff = nreff; - - xdl_free(dis); - - return 0; -} - - -/* - * Early trim initial and terminal matching records. - */ -static int xdl_trim_ends(xdfile_t *xdf1, xdfile_t *xdf2) { - long i, lim; - xrecord_t **recs1, **recs2; - - recs1 = xdf1->recs; - recs2 = xdf2->recs; - for (i = 0, lim = XDL_MIN(xdf1->nrec, xdf2->nrec); i < lim; - i++, recs1++, recs2++) - if ((*recs1)->ha != (*recs2)->ha) - break; - - xdf1->dstart = xdf2->dstart = i; - - recs1 = xdf1->recs + xdf1->nrec - 1; - recs2 = xdf2->recs + xdf2->nrec - 1; - for (lim -= i, i = 0; i < lim; i++, recs1--, recs2--) - if ((*recs1)->ha != (*recs2)->ha) - break; - - xdf1->dend = xdf1->nrec - i - 1; - xdf2->dend = xdf2->nrec - i - 1; - - return 0; -} - - -static int xdl_optimize_ctxs(xdlclassifier_t *cf, xdfile_t *xdf1, xdfile_t *xdf2) { - - if (xdl_trim_ends(xdf1, xdf2) < 0 || - xdl_cleanup_records(cf, xdf1, xdf2) < 0) { - - return -1; - } - - return 0; -} diff --git a/vendor/libgit2/src/xdiff/xprepare.h b/vendor/libgit2/src/xdiff/xprepare.h deleted file mode 100644 index 8fb06a5374..0000000000 --- a/vendor/libgit2/src/xdiff/xprepare.h +++ /dev/null @@ -1,34 +0,0 @@ -/* - * LibXDiff by Davide Libenzi ( File Differential Library ) - * Copyright (C) 2003 Davide Libenzi - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Davide Libenzi - * - */ - -#if !defined(XPREPARE_H) -#define XPREPARE_H - - - -int xdl_prepare_env(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp, - xdfenv_t *xe); -void xdl_free_env(xdfenv_t *xe); - - - -#endif /* #if !defined(XPREPARE_H) */ diff --git a/vendor/libgit2/src/xdiff/xtypes.h b/vendor/libgit2/src/xdiff/xtypes.h deleted file mode 100644 index 2511aef8d8..0000000000 --- a/vendor/libgit2/src/xdiff/xtypes.h +++ /dev/null @@ -1,67 +0,0 @@ -/* - * LibXDiff by Davide Libenzi ( File Differential Library ) - * Copyright (C) 2003 Davide Libenzi - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Davide Libenzi - * - */ - -#if !defined(XTYPES_H) -#define XTYPES_H - - - -typedef struct s_chanode { - struct s_chanode *next; - long icurr; -} chanode_t; - -typedef struct s_chastore { - chanode_t *head, *tail; - long isize, nsize; - chanode_t *ancur; - chanode_t *sncur; - long scurr; -} chastore_t; - -typedef struct s_xrecord { - struct s_xrecord *next; - char const *ptr; - long size; - unsigned long ha; -} xrecord_t; - -typedef struct s_xdfile { - chastore_t rcha; - long nrec; - unsigned int hbits; - xrecord_t **rhash; - long dstart, dend; - xrecord_t **recs; - char *rchg; - long *rindex; - long nreff; - unsigned long *ha; -} xdfile_t; - -typedef struct s_xdfenv { - xdfile_t xdf1, xdf2; -} xdfenv_t; - - - -#endif /* #if !defined(XTYPES_H) */ diff --git a/vendor/libgit2/src/xdiff/xutils.c b/vendor/libgit2/src/xdiff/xutils.c deleted file mode 100644 index 30f2a30ac7..0000000000 --- a/vendor/libgit2/src/xdiff/xutils.c +++ /dev/null @@ -1,403 +0,0 @@ -/* - * LibXDiff by Davide Libenzi ( File Differential Library ) - * Copyright (C) 2003 Davide Libenzi - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Davide Libenzi - * - */ - -#include "xinclude.h" - - - - -long xdl_bogosqrt(long n) { - long i; - - /* - * Classical integer square root approximation using shifts. - */ - for (i = 1; n > 0; n >>= 2) - i <<= 1; - - return i; -} - - -int xdl_emit_diffrec(char const *rec, long size, char const *pre, long psize, - xdemitcb_t *ecb) { - int i = 2; - mmbuffer_t mb[3]; - - mb[0].ptr = (char *) pre; - mb[0].size = psize; - mb[1].ptr = (char *) rec; - mb[1].size = size; - if (size > 0 && rec[size - 1] != '\n') { - mb[2].ptr = (char *) "\n\\ No newline at end of file\n"; - mb[2].size = strlen(mb[2].ptr); - i++; - } - if (ecb->outf(ecb->priv, mb, i) < 0) { - - return -1; - } - - return 0; -} - -void *xdl_mmfile_first(mmfile_t *mmf, long *size) -{ - *size = (long)mmf->size; - return mmf->ptr; -} - - -long xdl_mmfile_size(mmfile_t *mmf) -{ - return (long)mmf->size; -} - - -int xdl_cha_init(chastore_t *cha, long isize, long icount) { - - cha->head = cha->tail = NULL; - cha->isize = isize; - cha->nsize = icount * isize; - cha->ancur = cha->sncur = NULL; - cha->scurr = 0; - - return 0; -} - - -void xdl_cha_free(chastore_t *cha) { - chanode_t *cur, *tmp; - - for (cur = cha->head; (tmp = cur) != NULL;) { - cur = cur->next; - xdl_free(tmp); - } -} - - -void *xdl_cha_alloc(chastore_t *cha) { - chanode_t *ancur; - void *data; - - if (!(ancur = cha->ancur) || ancur->icurr == cha->nsize) { - if (!(ancur = (chanode_t *) xdl_malloc(sizeof(chanode_t) + cha->nsize))) { - - return NULL; - } - ancur->icurr = 0; - ancur->next = NULL; - if (cha->tail) - cha->tail->next = ancur; - if (!cha->head) - cha->head = ancur; - cha->tail = ancur; - cha->ancur = ancur; - } - - data = (char *) ancur + sizeof(chanode_t) + ancur->icurr; - ancur->icurr += cha->isize; - - return data; -} - -long xdl_guess_lines(mmfile_t *mf, long sample) { - long nl = 0, size, tsize = 0; - char const *data, *cur, *top; - - if ((cur = data = xdl_mmfile_first(mf, &size)) != NULL) { - for (top = data + size; nl < sample && cur < top; ) { - nl++; - if (!(cur = memchr(cur, '\n', top - cur))) - cur = top; - else - cur++; - } - tsize += (long) (cur - data); - } - - if (nl && tsize) - nl = xdl_mmfile_size(mf) / (tsize / nl); - - return nl + 1; -} - -int xdl_blankline(const char *line, long size, long flags) -{ - long i; - - if (!(flags & XDF_WHITESPACE_FLAGS)) - return (size <= 1); - - for (i = 0; i < size && XDL_ISSPACE(line[i]); i++) - ; - - return (i == size); -} - -int xdl_recmatch(const char *l1, long s1, const char *l2, long s2, long flags) -{ - int i1, i2; - - if (s1 == s2 && !memcmp(l1, l2, s1)) - return 1; - if (!(flags & XDF_WHITESPACE_FLAGS)) - return 0; - - i1 = 0; - i2 = 0; - - /* - * -w matches everything that matches with -b, and -b in turn - * matches everything that matches with --ignore-space-at-eol. - * - * Each flavor of ignoring needs different logic to skip whitespaces - * while we have both sides to compare. - */ - if (flags & XDF_IGNORE_WHITESPACE) { - goto skip_ws; - while (i1 < s1 && i2 < s2) { - if (l1[i1++] != l2[i2++]) - return 0; - skip_ws: - while (i1 < s1 && XDL_ISSPACE(l1[i1])) - i1++; - while (i2 < s2 && XDL_ISSPACE(l2[i2])) - i2++; - } - } else if (flags & XDF_IGNORE_WHITESPACE_CHANGE) { - while (i1 < s1 && i2 < s2) { - if (XDL_ISSPACE(l1[i1]) && XDL_ISSPACE(l2[i2])) { - /* Skip matching spaces and try again */ - while (i1 < s1 && XDL_ISSPACE(l1[i1])) - i1++; - while (i2 < s2 && XDL_ISSPACE(l2[i2])) - i2++; - continue; - } - if (l1[i1++] != l2[i2++]) - return 0; - } - } else if (flags & XDF_IGNORE_WHITESPACE_AT_EOL) { - while (i1 < s1 && i2 < s2 && l1[i1++] == l2[i2++]) - ; /* keep going */ - } - - /* - * After running out of one side, the remaining side must have - * nothing but whitespace for the lines to match. Note that - * ignore-whitespace-at-eol case may break out of the loop - * while there still are characters remaining on both lines. - */ - if (i1 < s1) { - while (i1 < s1 && XDL_ISSPACE(l1[i1])) - i1++; - if (s1 != i1) - return 0; - } - if (i2 < s2) { - while (i2 < s2 && XDL_ISSPACE(l2[i2])) - i2++; - return (s2 == i2); - } - return 1; -} - -static unsigned long xdl_hash_record_with_whitespace(char const **data, - char const *top, long flags) { - unsigned long ha = 5381; - char const *ptr = *data; - - for (; ptr < top && *ptr != '\n'; ptr++) { - if (XDL_ISSPACE(*ptr)) { - const char *ptr2 = ptr; - int at_eol; - while (ptr + 1 < top && XDL_ISSPACE(ptr[1]) - && ptr[1] != '\n') - ptr++; - at_eol = (top <= ptr + 1 || ptr[1] == '\n'); - if (flags & XDF_IGNORE_WHITESPACE) - ; /* already handled */ - else if (flags & XDF_IGNORE_WHITESPACE_CHANGE - && !at_eol) { - ha += (ha << 5); - ha ^= (unsigned long) ' '; - } - else if (flags & XDF_IGNORE_WHITESPACE_AT_EOL - && !at_eol) { - while (ptr2 != ptr + 1) { - ha += (ha << 5); - ha ^= (unsigned long) *ptr2; - ptr2++; - } - } - continue; - } - ha += (ha << 5); - ha ^= (unsigned long) *ptr; - } - *data = ptr < top ? ptr + 1: ptr; - - return ha; -} - - -unsigned long xdl_hash_record(char const **data, char const *top, long flags) { - unsigned long ha = 5381; - char const *ptr = *data; - - if (flags & XDF_WHITESPACE_FLAGS) - return xdl_hash_record_with_whitespace(data, top, flags); - - for (; ptr < top && *ptr != '\n'; ptr++) { - ha += (ha << 5); - ha ^= (unsigned long) *ptr; - } - *data = ptr < top ? ptr + 1: ptr; - - return ha; -} - - -unsigned int xdl_hashbits(unsigned int size) { - unsigned int val = 1, bits = 0; - - for (; val < size && bits < CHAR_BIT * sizeof(unsigned int); val <<= 1, bits++); - return bits ? bits: 1; -} - - -int xdl_num_out(char *out, long val) { - char *ptr, *str = out; - char buf[32]; - - ptr = buf + sizeof(buf) - 1; - *ptr = '\0'; - if (val < 0) { - *--ptr = '-'; - val = -val; - } - for (; val && ptr > buf; val /= 10) - *--ptr = "0123456789"[val % 10]; - if (*ptr) - for (; *ptr; ptr++, str++) - *str = *ptr; - else - *str++ = '0'; - *str = '\0'; - - return (int)(str - out); -} - - -long xdl_atol(char const *str, char const **next) { - long val, base; - char const *top; - - for (top = str; XDL_ISDIGIT(*top); top++); - if (next) - *next = top; - for (val = 0, base = 1, top--; top >= str; top--, base *= 10) - val += base * (long)(*top - '0'); - return val; -} - - -int xdl_emit_hunk_hdr(long s1, long c1, long s2, long c2, - const char *func, long funclen, xdemitcb_t *ecb) { - int nb = 0; - mmbuffer_t mb; - char buf[128]; - - memcpy(buf, "@@ -", 4); - nb += 4; - - nb += xdl_num_out(buf + nb, c1 ? s1: s1 - 1); - - if (c1 != 1) { - memcpy(buf + nb, ",", 1); - nb += 1; - - nb += xdl_num_out(buf + nb, c1); - } - - memcpy(buf + nb, " +", 2); - nb += 2; - - nb += xdl_num_out(buf + nb, c2 ? s2: s2 - 1); - - if (c2 != 1) { - memcpy(buf + nb, ",", 1); - nb += 1; - - nb += xdl_num_out(buf + nb, c2); - } - - memcpy(buf + nb, " @@", 3); - nb += 3; - if (func && funclen) { - buf[nb++] = ' '; - if (funclen > (long)sizeof(buf) - nb - 1) - funclen = (long)sizeof(buf) - nb - 1; - memcpy(buf + nb, func, funclen); - nb += funclen; - } - buf[nb++] = '\n'; - - mb.ptr = buf; - mb.size = nb; - if (ecb->outf(ecb->priv, &mb, 1) < 0) - return -1; - - return 0; -} - -int xdl_fall_back_diff(xdfenv_t *diff_env, xpparam_t const *xpp, - int line1, int count1, int line2, int count2) -{ - /* - * This probably does not work outside Git, since - * we have a very simple mmfile structure. - * - * Note: ideally, we would reuse the prepared environment, but - * the libxdiff interface does not (yet) allow for diffing only - * ranges of lines instead of the whole files. - */ - mmfile_t subfile1, subfile2; - xdfenv_t env; - - subfile1.ptr = (char *)diff_env->xdf1.recs[line1 - 1]->ptr; - subfile1.size = diff_env->xdf1.recs[line1 + count1 - 2]->ptr + - diff_env->xdf1.recs[line1 + count1 - 2]->size - subfile1.ptr; - subfile2.ptr = (char *)diff_env->xdf2.recs[line2 - 1]->ptr; - subfile2.size = diff_env->xdf2.recs[line2 + count2 - 2]->ptr + - diff_env->xdf2.recs[line2 + count2 - 2]->size - subfile2.ptr; - if (xdl_do_diff(&subfile1, &subfile2, xpp, &env) < 0) - return -1; - - memcpy(diff_env->xdf1.rchg + line1 - 1, env.xdf1.rchg, count1); - memcpy(diff_env->xdf2.rchg + line2 - 1, env.xdf2.rchg, count2); - - xdl_free_env(&env); - - return 0; -} diff --git a/vendor/libgit2/src/xdiff/xutils.h b/vendor/libgit2/src/xdiff/xutils.h deleted file mode 100644 index 8f952a8e62..0000000000 --- a/vendor/libgit2/src/xdiff/xutils.h +++ /dev/null @@ -1,50 +0,0 @@ -/* - * LibXDiff by Davide Libenzi ( File Differential Library ) - * Copyright (C) 2003 Davide Libenzi - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Davide Libenzi - * - */ - -#if !defined(XUTILS_H) -#define XUTILS_H - - - -long xdl_bogosqrt(long n); -int xdl_emit_diffrec(char const *rec, long size, char const *pre, long psize, - xdemitcb_t *ecb); -int xdl_cha_init(chastore_t *cha, long isize, long icount); -void xdl_cha_free(chastore_t *cha); -void *xdl_cha_alloc(chastore_t *cha); -void *xdl_cha_first(chastore_t *cha); -void *xdl_cha_next(chastore_t *cha); -long xdl_guess_lines(mmfile_t *mf, long sample); -int xdl_blankline(const char *line, long size, long flags); -int xdl_recmatch(const char *l1, long s1, const char *l2, long s2, long flags); -unsigned long xdl_hash_record(char const **data, char const *top, long flags); -unsigned int xdl_hashbits(unsigned int size); -int xdl_num_out(char *out, long val); -long xdl_atol(char const *str, char const **next); -int xdl_emit_hunk_hdr(long s1, long c1, long s2, long c2, - const char *func, long funclen, xdemitcb_t *ecb); -int xdl_fall_back_diff(xdfenv_t *diff_env, xpparam_t const *xpp, - int line1, int count1, int line2, int count2); - - - -#endif /* #if !defined(XUTILS_H) */ diff --git a/vendor/libgit2/src/zstream.c b/vendor/libgit2/src/zstream.c deleted file mode 100644 index 2130bc3ca7..0000000000 --- a/vendor/libgit2/src/zstream.c +++ /dev/null @@ -1,156 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ - -#include - -#include "zstream.h" -#include "buffer.h" - -#define ZSTREAM_BUFFER_SIZE (1024 * 1024) -#define ZSTREAM_BUFFER_MIN_EXTRA 8 - -static int zstream_seterr(git_zstream *zs) -{ - if (zs->zerr == Z_OK || zs->zerr == Z_STREAM_END) - return 0; - - if (zs->zerr == Z_MEM_ERROR) - giterr_set_oom(); - else if (zs->z.msg) - giterr_set(GITERR_ZLIB, zs->z.msg); - else - giterr_set(GITERR_ZLIB, "Unknown compression error"); - - return -1; -} - -int git_zstream_init(git_zstream *zstream) -{ - zstream->zerr = deflateInit(&zstream->z, Z_DEFAULT_COMPRESSION); - return zstream_seterr(zstream); -} - -void git_zstream_free(git_zstream *zstream) -{ - deflateEnd(&zstream->z); -} - -void git_zstream_reset(git_zstream *zstream) -{ - deflateReset(&zstream->z); - zstream->in = NULL; - zstream->in_len = 0; - zstream->zerr = Z_STREAM_END; -} - -int git_zstream_set_input(git_zstream *zstream, const void *in, size_t in_len) -{ - zstream->in = in; - zstream->in_len = in_len; - zstream->zerr = Z_OK; - return 0; -} - -bool git_zstream_done(git_zstream *zstream) -{ - return (!zstream->in_len && zstream->zerr == Z_STREAM_END); -} - -size_t git_zstream_suggest_output_len(git_zstream *zstream) -{ - if (zstream->in_len > ZSTREAM_BUFFER_SIZE) - return ZSTREAM_BUFFER_SIZE; - else if (zstream->in_len > ZSTREAM_BUFFER_MIN_EXTRA) - return zstream->in_len; - else - return ZSTREAM_BUFFER_MIN_EXTRA; -} - -int git_zstream_get_output(void *out, size_t *out_len, git_zstream *zstream) -{ - int zflush = Z_FINISH; - size_t out_remain = *out_len; - - while (out_remain > 0 && zstream->zerr != Z_STREAM_END) { - size_t out_queued, in_queued, out_used, in_used; - - /* set up in data */ - zstream->z.next_in = (Bytef *)zstream->in; - zstream->z.avail_in = (uInt)zstream->in_len; - if ((size_t)zstream->z.avail_in != zstream->in_len) { - zstream->z.avail_in = INT_MAX; - zflush = Z_NO_FLUSH; - } else { - zflush = Z_FINISH; - } - in_queued = (size_t)zstream->z.avail_in; - - /* set up out data */ - zstream->z.next_out = out; - zstream->z.avail_out = (uInt)out_remain; - if ((size_t)zstream->z.avail_out != out_remain) - zstream->z.avail_out = INT_MAX; - out_queued = (size_t)zstream->z.avail_out; - - /* compress next chunk */ - zstream->zerr = deflate(&zstream->z, zflush); - - if (zstream->zerr == Z_STREAM_ERROR) - return zstream_seterr(zstream); - - out_used = (out_queued - zstream->z.avail_out); - out_remain -= out_used; - out = ((char *)out) + out_used; - - in_used = (in_queued - zstream->z.avail_in); - zstream->in_len -= in_used; - zstream->in += in_used; - } - - /* either we finished the input or we did not flush the data */ - assert(zstream->in_len > 0 || zflush == Z_FINISH); - - /* set out_size to number of bytes actually written to output */ - *out_len = *out_len - out_remain; - - return 0; -} - -int git_zstream_deflatebuf(git_buf *out, const void *in, size_t in_len) -{ - git_zstream zs = GIT_ZSTREAM_INIT; - int error = 0; - - if ((error = git_zstream_init(&zs)) < 0) - return error; - - if ((error = git_zstream_set_input(&zs, in, in_len)) < 0) - goto done; - - while (!git_zstream_done(&zs)) { - size_t step = git_zstream_suggest_output_len(&zs), written; - - if ((error = git_buf_grow_by(out, step)) < 0) - goto done; - - written = out->asize - out->size; - - if ((error = git_zstream_get_output( - out->ptr + out->size, &written, &zs)) < 0) - goto done; - - out->size += written; - } - - /* NULL terminate for consistency if possible */ - if (out->size < out->asize) - out->ptr[out->size] = '\0'; - -done: - git_zstream_free(&zs); - return error; -} diff --git a/vendor/libgit2/src/zstream.h b/vendor/libgit2/src/zstream.h deleted file mode 100644 index 9b5bf6acec..0000000000 --- a/vendor/libgit2/src/zstream.h +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_zstream_h__ -#define INCLUDE_zstream_h__ - -#include - -#include "common.h" -#include "buffer.h" - -typedef struct { - z_stream z; - const char *in; - size_t in_len; - int zerr; -} git_zstream; - -#define GIT_ZSTREAM_INIT {{0}} - -int git_zstream_init(git_zstream *zstream); -void git_zstream_free(git_zstream *zstream); - -int git_zstream_set_input(git_zstream *zstream, const void *in, size_t in_len); - -size_t git_zstream_suggest_output_len(git_zstream *zstream); - -int git_zstream_get_output(void *out, size_t *out_len, git_zstream *zstream); - -bool git_zstream_done(git_zstream *zstream); - -void git_zstream_reset(git_zstream *zstream); - -int git_zstream_deflatebuf(git_buf *out, const void *in, size_t in_len); - -#endif /* INCLUDE_zstream_h__ */ diff --git a/vendor/libgit2/tests/README.md b/vendor/libgit2/tests/README.md deleted file mode 100644 index 3aeaaf464c..0000000000 --- a/vendor/libgit2/tests/README.md +++ /dev/null @@ -1,22 +0,0 @@ -Writing Clar tests for libgit2 -============================== - -For information on the Clar testing framework and a detailed introduction -please visit: - -https://github.com/vmg/clar - - -* Write your modules and tests. Use good, meaningful names. - -* Make sure you actually build the tests by setting: - - cmake -DBUILD_CLAR=ON build/ - -* Test: - - ./build/libgit2_clar - -* Make sure everything is fine. - -* Send your pull request. That's it. diff --git a/vendor/libgit2/tests/attr/attr_expect.h b/vendor/libgit2/tests/attr/attr_expect.h deleted file mode 100644 index 70f1ab4f56..0000000000 --- a/vendor/libgit2/tests/attr/attr_expect.h +++ /dev/null @@ -1,43 +0,0 @@ -#ifndef __CLAR_TEST_ATTR_EXPECT__ -#define __CLAR_TEST_ATTR_EXPECT__ - -enum attr_expect_t { - EXPECT_FALSE, - EXPECT_TRUE, - EXPECT_UNDEFINED, - EXPECT_STRING -}; - -struct attr_expected { - const char *path; - const char *attr; - enum attr_expect_t expected; - const char *expected_str; -}; - -GIT_INLINE(void) attr_check_expected( - enum attr_expect_t expected, - const char *expected_str, - const char *name, - const char *value) -{ - switch (expected) { - case EXPECT_TRUE: - cl_assert_(GIT_ATTR_TRUE(value), name); - break; - - case EXPECT_FALSE: - cl_assert_(GIT_ATTR_FALSE(value), name); - break; - - case EXPECT_UNDEFINED: - cl_assert_(GIT_ATTR_UNSPECIFIED(value), name); - break; - - case EXPECT_STRING: - cl_assert_equal_s(expected_str, value); - break; - } -} - -#endif diff --git a/vendor/libgit2/tests/attr/file.c b/vendor/libgit2/tests/attr/file.c deleted file mode 100644 index 1f4108c3c1..0000000000 --- a/vendor/libgit2/tests/attr/file.c +++ /dev/null @@ -1,224 +0,0 @@ -#include "clar_libgit2.h" -#include "attr_file.h" -#include "attr_expect.h" - -#define get_rule(X) ((git_attr_rule *)git_vector_get(&file->rules,(X))) -#define get_assign(R,Y) ((git_attr_assignment *)git_vector_get(&(R)->assigns,(Y))) - -void test_attr_file__simple_read(void) -{ - git_attr_file *file; - git_attr_assignment *assign; - git_attr_rule *rule; - - cl_git_pass(git_attr_file__load_standalone(&file, cl_fixture("attr/attr0"))); - - cl_assert_equal_s(cl_fixture("attr/attr0"), file->entry->path); - cl_assert(file->rules.length == 1); - - rule = get_rule(0); - cl_assert(rule != NULL); - cl_assert_equal_s("*", rule->match.pattern); - cl_assert(rule->match.length == 1); - cl_assert((rule->match.flags & GIT_ATTR_FNMATCH_HASWILD) != 0); - - cl_assert(rule->assigns.length == 1); - assign = get_assign(rule, 0); - cl_assert(assign != NULL); - cl_assert_equal_s("binary", assign->name); - cl_assert(GIT_ATTR_TRUE(assign->value)); - - git_attr_file__free(file); -} - -void test_attr_file__match_variants(void) -{ - git_attr_file *file; - git_attr_rule *rule; - git_attr_assignment *assign; - - cl_git_pass(git_attr_file__load_standalone(&file, cl_fixture("attr/attr1"))); - - cl_assert_equal_s(cl_fixture("attr/attr1"), file->entry->path); - cl_assert(file->rules.length == 10); - - /* let's do a thorough check of this rule, then just verify - * the things that are unique for the later rules - */ - rule = get_rule(0); - cl_assert(rule); - cl_assert_equal_s("pat0", rule->match.pattern); - cl_assert(rule->match.length == strlen("pat0")); - cl_assert(rule->assigns.length == 1); - assign = get_assign(rule,0); - cl_assert_equal_s("attr0", assign->name); - cl_assert(assign->name_hash == git_attr_file__name_hash(assign->name)); - cl_assert(GIT_ATTR_TRUE(assign->value)); - - rule = get_rule(1); - cl_assert_equal_s("pat1", rule->match.pattern); - cl_assert(rule->match.length == strlen("pat1")); - cl_assert((rule->match.flags & GIT_ATTR_FNMATCH_NEGATIVE) != 0); - - rule = get_rule(2); - cl_assert_equal_s("pat2", rule->match.pattern); - cl_assert(rule->match.length == strlen("pat2")); - cl_assert((rule->match.flags & GIT_ATTR_FNMATCH_DIRECTORY) != 0); - - rule = get_rule(3); - cl_assert_equal_s("pat3dir/pat3file", rule->match.pattern); - cl_assert((rule->match.flags & GIT_ATTR_FNMATCH_FULLPATH) != 0); - - rule = get_rule(4); - cl_assert_equal_s("pat4.*", rule->match.pattern); - cl_assert((rule->match.flags & GIT_ATTR_FNMATCH_HASWILD) != 0); - - rule = get_rule(5); - cl_assert_equal_s("*.pat5", rule->match.pattern); - cl_assert((rule->match.flags & GIT_ATTR_FNMATCH_HASWILD) != 0); - - rule = get_rule(7); - cl_assert_equal_s("pat7[a-e]??[xyz]", rule->match.pattern); - cl_assert(rule->assigns.length == 1); - cl_assert((rule->match.flags & GIT_ATTR_FNMATCH_HASWILD) != 0); - assign = get_assign(rule,0); - cl_assert_equal_s("attr7", assign->name); - cl_assert(GIT_ATTR_TRUE(assign->value)); - - rule = get_rule(8); - cl_assert_equal_s("pat8 with spaces", rule->match.pattern); - cl_assert(rule->match.length == strlen("pat8 with spaces")); - - rule = get_rule(9); - cl_assert_equal_s("pat9", rule->match.pattern); - - git_attr_file__free(file); -} - -static void check_one_assign( - git_attr_file *file, - int rule_idx, - int assign_idx, - const char *pattern, - const char *name, - enum attr_expect_t expected, - const char *expected_str) -{ - git_attr_rule *rule = get_rule(rule_idx); - git_attr_assignment *assign = get_assign(rule, assign_idx); - - cl_assert_equal_s(pattern, rule->match.pattern); - cl_assert(rule->assigns.length == 1); - cl_assert_equal_s(name, assign->name); - cl_assert(assign->name_hash == git_attr_file__name_hash(assign->name)); - - attr_check_expected(expected, expected_str, assign->name, assign->value); -} - -void test_attr_file__assign_variants(void) -{ - git_attr_file *file; - git_attr_rule *rule; - git_attr_assignment *assign; - - cl_git_pass(git_attr_file__load_standalone(&file, cl_fixture("attr/attr2"))); - - cl_assert_equal_s(cl_fixture("attr/attr2"), file->entry->path); - cl_assert(file->rules.length == 11); - - check_one_assign(file, 0, 0, "pat0", "simple", EXPECT_TRUE, NULL); - check_one_assign(file, 1, 0, "pat1", "neg", EXPECT_FALSE, NULL); - check_one_assign(file, 2, 0, "*", "notundef", EXPECT_TRUE, NULL); - check_one_assign(file, 3, 0, "pat2", "notundef", EXPECT_UNDEFINED, NULL); - check_one_assign(file, 4, 0, "pat3", "assigned", EXPECT_STRING, "test-value"); - check_one_assign(file, 5, 0, "pat4", "rule-with-more-chars", EXPECT_STRING, "value-with-more-chars"); - check_one_assign(file, 6, 0, "pat5", "empty", EXPECT_TRUE, NULL); - check_one_assign(file, 7, 0, "pat6", "negempty", EXPECT_FALSE, NULL); - - rule = get_rule(8); - cl_assert_equal_s("pat7", rule->match.pattern); - cl_assert(rule->assigns.length == 5); - /* assignments will be sorted by hash value, so we have to do - * lookups by search instead of by position - */ - assign = git_attr_rule__lookup_assignment(rule, "multiple"); - cl_assert(assign); - cl_assert_equal_s("multiple", assign->name); - cl_assert(GIT_ATTR_TRUE(assign->value)); - assign = git_attr_rule__lookup_assignment(rule, "single"); - cl_assert(assign); - cl_assert_equal_s("single", assign->name); - cl_assert(GIT_ATTR_FALSE(assign->value)); - assign = git_attr_rule__lookup_assignment(rule, "values"); - cl_assert(assign); - cl_assert_equal_s("values", assign->name); - cl_assert_equal_s("1", assign->value); - assign = git_attr_rule__lookup_assignment(rule, "also"); - cl_assert(assign); - cl_assert_equal_s("also", assign->name); - cl_assert_equal_s("a-really-long-value/*", assign->value); - assign = git_attr_rule__lookup_assignment(rule, "happy"); - cl_assert(assign); - cl_assert_equal_s("happy", assign->name); - cl_assert_equal_s("yes!", assign->value); - assign = git_attr_rule__lookup_assignment(rule, "other"); - cl_assert(!assign); - - rule = get_rule(9); - cl_assert_equal_s("pat8", rule->match.pattern); - cl_assert(rule->assigns.length == 2); - assign = git_attr_rule__lookup_assignment(rule, "again"); - cl_assert(assign); - cl_assert_equal_s("again", assign->name); - cl_assert(GIT_ATTR_TRUE(assign->value)); - assign = git_attr_rule__lookup_assignment(rule, "another"); - cl_assert(assign); - cl_assert_equal_s("another", assign->name); - cl_assert_equal_s("12321", assign->value); - - check_one_assign(file, 10, 0, "pat9", "at-eof", EXPECT_FALSE, NULL); - - git_attr_file__free(file); -} - -void test_attr_file__check_attr_examples(void) -{ - git_attr_file *file; - git_attr_rule *rule; - git_attr_assignment *assign; - - cl_git_pass(git_attr_file__load_standalone(&file, cl_fixture("attr/attr3"))); - cl_assert_equal_s(cl_fixture("attr/attr3"), file->entry->path); - cl_assert(file->rules.length == 3); - - rule = get_rule(0); - cl_assert_equal_s("*.java", rule->match.pattern); - cl_assert(rule->assigns.length == 3); - assign = git_attr_rule__lookup_assignment(rule, "diff"); - cl_assert_equal_s("diff", assign->name); - cl_assert_equal_s("java", assign->value); - assign = git_attr_rule__lookup_assignment(rule, "crlf"); - cl_assert_equal_s("crlf", assign->name); - cl_assert(GIT_ATTR_FALSE(assign->value)); - assign = git_attr_rule__lookup_assignment(rule, "myAttr"); - cl_assert_equal_s("myAttr", assign->name); - cl_assert(GIT_ATTR_TRUE(assign->value)); - assign = git_attr_rule__lookup_assignment(rule, "missing"); - cl_assert(assign == NULL); - - rule = get_rule(1); - cl_assert_equal_s("NoMyAttr.java", rule->match.pattern); - cl_assert(rule->assigns.length == 1); - assign = get_assign(rule, 0); - cl_assert_equal_s("myAttr", assign->name); - cl_assert(GIT_ATTR_UNSPECIFIED(assign->value)); - - rule = get_rule(2); - cl_assert_equal_s("README", rule->match.pattern); - cl_assert(rule->assigns.length == 1); - assign = get_assign(rule, 0); - cl_assert_equal_s("caveat", assign->name); - cl_assert_equal_s("unspecified", assign->value); - - git_attr_file__free(file); -} diff --git a/vendor/libgit2/tests/attr/flags.c b/vendor/libgit2/tests/attr/flags.c deleted file mode 100644 index 80c6e11715..0000000000 --- a/vendor/libgit2/tests/attr/flags.c +++ /dev/null @@ -1,108 +0,0 @@ -#include "clar_libgit2.h" -#include "git2/attr.h" - -void test_attr_flags__cleanup(void) -{ - cl_git_sandbox_cleanup(); -} - -void test_attr_flags__bare(void) -{ - git_repository *repo = cl_git_sandbox_init("testrepo.git"); - const char *value; - - cl_assert(git_repository_is_bare(repo)); - - cl_git_pass(git_attr_get( - &value, repo, GIT_ATTR_CHECK_NO_SYSTEM, "README.md", "diff")); - cl_assert(GIT_ATTR_UNSPECIFIED(value)); -} - -void test_attr_flags__index_vs_workdir(void) -{ - git_repository *repo = cl_git_sandbox_init("attr_index"); - const char *value; - - cl_assert(!git_repository_is_bare(repo)); - - /* wd then index */ - cl_git_pass(git_attr_get( - &value, repo, GIT_ATTR_CHECK_NO_SYSTEM | GIT_ATTR_CHECK_FILE_THEN_INDEX, - "README.md", "bar")); - cl_assert(GIT_ATTR_FALSE(value)); - - cl_git_pass(git_attr_get( - &value, repo, GIT_ATTR_CHECK_NO_SYSTEM | GIT_ATTR_CHECK_FILE_THEN_INDEX, - "README.md", "blargh")); - cl_assert_equal_s(value, "goop"); - - cl_git_pass(git_attr_get( - &value, repo, GIT_ATTR_CHECK_NO_SYSTEM | GIT_ATTR_CHECK_FILE_THEN_INDEX, - "README.txt", "foo")); - cl_assert(GIT_ATTR_FALSE(value)); - - /* index then wd */ - cl_git_pass(git_attr_get( - &value, repo, GIT_ATTR_CHECK_NO_SYSTEM | GIT_ATTR_CHECK_INDEX_THEN_FILE, - "README.md", "bar")); - cl_assert(GIT_ATTR_TRUE(value)); - - cl_git_pass(git_attr_get( - &value, repo, GIT_ATTR_CHECK_NO_SYSTEM | GIT_ATTR_CHECK_INDEX_THEN_FILE, - "README.md", "blargh")); - cl_assert_equal_s(value, "garble"); - - cl_git_pass(git_attr_get( - &value, repo, GIT_ATTR_CHECK_NO_SYSTEM | GIT_ATTR_CHECK_INDEX_THEN_FILE, - "README.txt", "foo")); - cl_assert(GIT_ATTR_TRUE(value)); -} - -void test_attr_flags__subdir(void) -{ - git_repository *repo = cl_git_sandbox_init("attr_index"); - const char *value; - - /* wd then index */ - cl_git_pass(git_attr_get( - &value, repo, GIT_ATTR_CHECK_NO_SYSTEM | GIT_ATTR_CHECK_FILE_THEN_INDEX, - "sub/sub/README.md", "bar")); - cl_assert_equal_s(value, "1234"); - - cl_git_pass(git_attr_get( - &value, repo, GIT_ATTR_CHECK_NO_SYSTEM | GIT_ATTR_CHECK_FILE_THEN_INDEX, - "sub/sub/README.txt", "another")); - cl_assert_equal_s(value, "one"); - - cl_git_pass(git_attr_get( - &value, repo, GIT_ATTR_CHECK_NO_SYSTEM | GIT_ATTR_CHECK_FILE_THEN_INDEX, - "sub/sub/README.txt", "again")); - cl_assert(GIT_ATTR_TRUE(value)); - - cl_git_pass(git_attr_get( - &value, repo, GIT_ATTR_CHECK_NO_SYSTEM | GIT_ATTR_CHECK_FILE_THEN_INDEX, - "sub/sub/README.txt", "beep")); - cl_assert_equal_s(value, "10"); - - /* index then wd */ - cl_git_pass(git_attr_get( - &value, repo, GIT_ATTR_CHECK_NO_SYSTEM | GIT_ATTR_CHECK_INDEX_THEN_FILE, - "sub/sub/README.md", "bar")); - cl_assert_equal_s(value, "1337"); - - cl_git_pass(git_attr_get( - &value, repo, GIT_ATTR_CHECK_NO_SYSTEM | GIT_ATTR_CHECK_INDEX_THEN_FILE, - "sub/sub/README.txt", "another")); - cl_assert_equal_s(value, "one"); - - cl_git_pass(git_attr_get( - &value, repo, GIT_ATTR_CHECK_NO_SYSTEM | GIT_ATTR_CHECK_INDEX_THEN_FILE, - "sub/sub/README.txt", "again")); - cl_assert(GIT_ATTR_TRUE(value)); - - cl_git_pass(git_attr_get( - &value, repo, GIT_ATTR_CHECK_NO_SYSTEM | GIT_ATTR_CHECK_INDEX_THEN_FILE, - "sub/sub/README.txt", "beep")); - cl_assert_equal_s(value, "5"); -} - diff --git a/vendor/libgit2/tests/attr/ignore.c b/vendor/libgit2/tests/attr/ignore.c deleted file mode 100644 index 27fed25391..0000000000 --- a/vendor/libgit2/tests/attr/ignore.c +++ /dev/null @@ -1,254 +0,0 @@ -#include "clar_libgit2.h" -#include "posix.h" -#include "path.h" -#include "fileops.h" - -static git_repository *g_repo = NULL; - -void test_attr_ignore__initialize(void) -{ - g_repo = cl_git_sandbox_init("attr"); -} - -void test_attr_ignore__cleanup(void) -{ - cl_git_sandbox_cleanup(); - g_repo = NULL; -} - -static void assert_is_ignored_( - bool expected, const char *filepath, const char *file, int line) -{ - int is_ignored = 0; - - cl_git_pass_( - git_ignore_path_is_ignored(&is_ignored, g_repo, filepath), file, line); - - clar__assert_equal( - file, line, "expected != is_ignored", 1, "%d", - (int)(expected != 0), (int)(is_ignored != 0)); -} -#define assert_is_ignored(expected, filepath) \ - assert_is_ignored_(expected, filepath, __FILE__, __LINE__) - -void test_attr_ignore__honor_temporary_rules(void) -{ - cl_git_rewritefile("attr/.gitignore", "/NewFolder\n/NewFolder/NewFolder"); - - assert_is_ignored(false, "File.txt"); - assert_is_ignored(true, "NewFolder"); - assert_is_ignored(true, "NewFolder/NewFolder"); - assert_is_ignored(true, "NewFolder/NewFolder/File.txt"); -} - -void test_attr_ignore__allow_root(void) -{ - cl_git_rewritefile("attr/.gitignore", "/"); - - assert_is_ignored(false, "File.txt"); - assert_is_ignored(false, "NewFolder"); - assert_is_ignored(false, "NewFolder/NewFolder"); - assert_is_ignored(false, "NewFolder/NewFolder/File.txt"); -} - -void test_attr_ignore__ignore_root(void) -{ - cl_git_rewritefile("attr/.gitignore", "/\n\n/NewFolder\n/NewFolder/NewFolder"); - - assert_is_ignored(false, "File.txt"); - assert_is_ignored(true, "NewFolder"); - assert_is_ignored(true, "NewFolder/NewFolder"); - assert_is_ignored(true, "NewFolder/NewFolder/File.txt"); -} - -void test_attr_ignore__full_paths(void) -{ - cl_git_rewritefile("attr/.gitignore", "Folder/*/Contained"); - - assert_is_ignored(true, "Folder/Middle/Contained"); - assert_is_ignored(false, "Folder/Middle/More/More/Contained"); - - cl_git_rewritefile("attr/.gitignore", "Folder/**/Contained"); - - assert_is_ignored(true, "Folder/Middle/Contained"); - assert_is_ignored(true, "Folder/Middle/More/More/Contained"); - - cl_git_rewritefile("attr/.gitignore", "Folder/**/Contained/*/Child"); - - assert_is_ignored(true, "Folder/Middle/Contained/Happy/Child"); - assert_is_ignored(false, "Folder/Middle/Contained/Not/Happy/Child"); - assert_is_ignored(true, "Folder/Middle/More/More/Contained/Happy/Child"); - assert_is_ignored(false, "Folder/Middle/More/More/Contained/Not/Happy/Child"); -} - -void test_attr_ignore__more_starstar_cases(void) -{ - cl_must_pass(p_unlink("attr/.gitignore")); - cl_git_mkfile( - "attr/dir/.gitignore", - "sub/**/*.html\n"); - - assert_is_ignored(false, "aaa.html"); - assert_is_ignored(false, "dir"); - assert_is_ignored(false, "dir/sub"); - assert_is_ignored(true, "dir/sub/sub2/aaa.html"); - assert_is_ignored(true, "dir/sub/aaa.html"); - assert_is_ignored(false, "dir/aaa.html"); - assert_is_ignored(false, "sub"); - assert_is_ignored(false, "sub/aaa.html"); - assert_is_ignored(false, "sub/sub2/aaa.html"); -} - -void test_attr_ignore__leading_stars(void) -{ - cl_git_rewritefile( - "attr/.gitignore", - "*/onestar\n" - "**/twostars\n" - "*/parent1/kid1/*\n" - "**/parent2/kid2/*\n"); - - assert_is_ignored(true, "dir1/onestar"); - assert_is_ignored(true, "dir1/onestar/child"); /* in ignored dir */ - assert_is_ignored(false, "dir1/dir2/onestar"); - - assert_is_ignored(true, "dir1/twostars"); - assert_is_ignored(true, "dir1/twostars/child"); /* in ignored dir */ - assert_is_ignored(true, "dir1/dir2/twostars"); - assert_is_ignored(true, "dir1/dir2/twostars/child"); /* in ignored dir */ - assert_is_ignored(true, "dir1/dir2/dir3/twostars"); - - assert_is_ignored(true, "dir1/parent1/kid1/file"); - assert_is_ignored(true, "dir1/parent1/kid1/file/inside/parent"); - assert_is_ignored(false, "dir1/dir2/parent1/kid1/file"); - assert_is_ignored(false, "dir1/parent1/file"); - assert_is_ignored(false, "dir1/kid1/file"); - - assert_is_ignored(true, "dir1/parent2/kid2/file"); - assert_is_ignored(true, "dir1/parent2/kid2/file/inside/parent"); - assert_is_ignored(true, "dir1/dir2/parent2/kid2/file"); - assert_is_ignored(true, "dir1/dir2/dir3/parent2/kid2/file"); - assert_is_ignored(false, "dir1/parent2/file"); - assert_is_ignored(false, "dir1/kid2/file"); -} - -void test_attr_ignore__skip_gitignore_directory(void) -{ - cl_git_rewritefile("attr/.git/info/exclude", "/NewFolder\n/NewFolder/NewFolder"); - p_unlink("attr/.gitignore"); - cl_assert(!git_path_exists("attr/.gitignore")); - p_mkdir("attr/.gitignore", 0777); - cl_git_mkfile("attr/.gitignore/garbage.txt", "new_file\n"); - - assert_is_ignored(false, "File.txt"); - assert_is_ignored(true, "NewFolder"); - assert_is_ignored(true, "NewFolder/NewFolder"); - assert_is_ignored(true, "NewFolder/NewFolder/File.txt"); -} - -void test_attr_ignore__subdirectory_gitignore(void) -{ - p_unlink("attr/.gitignore"); - cl_assert(!git_path_exists("attr/.gitignore")); - cl_git_mkfile( - "attr/.gitignore", - "file1\n"); - p_mkdir("attr/dir", 0777); - cl_git_mkfile( - "attr/dir/.gitignore", - "file2/\n"); - - assert_is_ignored(true, "file1"); - assert_is_ignored(true, "dir/file1"); - assert_is_ignored(true, "dir/file2/actual_file"); /* in ignored dir */ - assert_is_ignored(false, "dir/file3"); -} - -void test_attr_ignore__expand_tilde_to_homedir(void) -{ - git_config *cfg; - - assert_is_ignored(false, "example.global_with_tilde"); - - cl_fake_home(); - - /* construct fake home with fake global excludes */ - cl_git_mkfile("home/globalexclude", "# found me\n*.global_with_tilde\n"); - - cl_git_pass(git_repository_config(&cfg, g_repo)); - cl_git_pass(git_config_set_string(cfg, "core.excludesfile", "~/globalexclude")); - git_config_free(cfg); - - git_attr_cache_flush(g_repo); /* must reset to pick up change */ - - assert_is_ignored(true, "example.global_with_tilde"); - - cl_git_pass(git_futils_rmdir_r("home", NULL, GIT_RMDIR_REMOVE_FILES)); - - cl_fake_home_cleanup(NULL); - - git_attr_cache_flush(g_repo); /* must reset to pick up change */ - - assert_is_ignored(false, "example.global_with_tilde"); -} - -/* Ensure that the .gitignore in the subdirectory only affects - * items in the subdirectory. */ -void test_attr_ignore__gitignore_in_subdir(void) -{ - cl_git_rmfile("attr/.gitignore"); - - cl_must_pass(p_mkdir("attr/dir1", 0777)); - cl_must_pass(p_mkdir("attr/dir1/dir2", 0777)); - cl_must_pass(p_mkdir("attr/dir1/dir2/dir3", 0777)); - - cl_git_mkfile("attr/dir1/dir2/dir3/.gitignore", "dir1/\ndir1/subdir/"); - - assert_is_ignored(false, "dir1/file"); - assert_is_ignored(false, "dir1/dir2/file"); - assert_is_ignored(false, "dir1/dir2/dir3/file"); - assert_is_ignored(true, "dir1/dir2/dir3/dir1/file"); - assert_is_ignored(true, "dir1/dir2/dir3/dir1/subdir/foo"); - - if (cl_repo_get_bool(g_repo, "core.ignorecase")) { - cl_git_mkfile("attr/dir1/dir2/dir3/.gitignore", "DiR1/\nDiR1/subdir/\n"); - - assert_is_ignored(false, "dir1/file"); - assert_is_ignored(false, "dir1/dir2/file"); - assert_is_ignored(false, "dir1/dir2/dir3/file"); - assert_is_ignored(true, "dir1/dir2/dir3/dir1/file"); - assert_is_ignored(true, "dir1/dir2/dir3/dir1/subdir/foo"); - } -} - -/* Ensure that files do not match folder cases */ -void test_attr_ignore__dont_ignore_files_for_folder(void) -{ - cl_git_rmfile("attr/.gitignore"); - - cl_git_mkfile("attr/dir/.gitignore", "test/\n"); - - /* Create "test" as a file; ensure it is not ignored. */ - cl_git_mkfile("attr/dir/test", "This is a file."); - - assert_is_ignored(false, "dir/test"); - if (cl_repo_get_bool(g_repo, "core.ignorecase")) - assert_is_ignored(false, "dir/TeSt"); - - /* Create "test" as a directory; ensure it is ignored. */ - cl_git_rmfile("attr/dir/test"); - cl_must_pass(p_mkdir("attr/dir/test", 0777)); - - assert_is_ignored(true, "dir/test"); - if (cl_repo_get_bool(g_repo, "core.ignorecase")) - assert_is_ignored(true, "dir/TeSt"); - - /* Remove "test" entirely; ensure it is not ignored. - * (As it doesn't exist, it is not a directory.) - */ - cl_must_pass(p_rmdir("attr/dir/test")); - - assert_is_ignored(false, "dir/test"); - if (cl_repo_get_bool(g_repo, "core.ignorecase")) - assert_is_ignored(false, "dir/TeSt"); -} diff --git a/vendor/libgit2/tests/attr/lookup.c b/vendor/libgit2/tests/attr/lookup.c deleted file mode 100644 index 71e87cbae5..0000000000 --- a/vendor/libgit2/tests/attr/lookup.c +++ /dev/null @@ -1,262 +0,0 @@ -#include "clar_libgit2.h" -#include "attr_file.h" - -#include "attr_expect.h" - -void test_attr_lookup__simple(void) -{ - git_attr_file *file; - git_attr_path path; - const char *value = NULL; - - cl_git_pass(git_attr_file__load_standalone(&file, cl_fixture("attr/attr0"))); - cl_assert_equal_s(cl_fixture("attr/attr0"), file->entry->path); - cl_assert(file->rules.length == 1); - - cl_git_pass(git_attr_path__init(&path, "test", NULL, GIT_DIR_FLAG_UNKNOWN)); - cl_assert_equal_s("test", path.path); - cl_assert_equal_s("test", path.basename); - cl_assert(!path.is_dir); - - cl_git_pass(git_attr_file__lookup_one(file,&path,"binary",&value)); - cl_assert(GIT_ATTR_TRUE(value)); - - cl_git_pass(git_attr_file__lookup_one(file,&path,"missing",&value)); - cl_assert(!value); - - git_attr_path__free(&path); - git_attr_file__free(file); -} - -static void run_test_cases(git_attr_file *file, struct attr_expected *cases, int force_dir) -{ - git_attr_path path; - const char *value = NULL; - struct attr_expected *c; - int error; - - for (c = cases; c->path != NULL; c++) { - cl_git_pass(git_attr_path__init(&path, c->path, NULL, GIT_DIR_FLAG_UNKNOWN)); - - if (force_dir) - path.is_dir = 1; - - error = git_attr_file__lookup_one(file,&path,c->attr,&value); - cl_git_pass(error); - - attr_check_expected(c->expected, c->expected_str, c->attr, value); - - git_attr_path__free(&path); - } -} - -void test_attr_lookup__match_variants(void) -{ - git_attr_file *file; - git_attr_path path; - - struct attr_expected dir_cases[] = { - { "pat2", "attr2", EXPECT_TRUE, NULL }, - { "/testing/for/pat2", "attr2", EXPECT_TRUE, NULL }, - { "/not/pat2/yousee", "attr2", EXPECT_UNDEFINED, NULL }, - { "/fun/fun/fun/pat4.dir", "attr4", EXPECT_TRUE, NULL }, - { "foo.pat5", "attr5", EXPECT_TRUE, NULL }, - { NULL, NULL, 0, NULL } - }; - - struct attr_expected cases[] = { - /* pat0 -> simple match */ - { "pat0", "attr0", EXPECT_TRUE, NULL }, - { "/testing/for/pat0", "attr0", EXPECT_TRUE, NULL }, - { "relative/to/pat0", "attr0", EXPECT_TRUE, NULL }, - { "this-contains-pat0-inside", "attr0", EXPECT_UNDEFINED, NULL }, - { "this-aint-right", "attr0", EXPECT_UNDEFINED, NULL }, - { "/this/pat0/dont/match", "attr0", EXPECT_UNDEFINED, NULL }, - /* negative match */ - { "pat0", "attr1", EXPECT_TRUE, NULL }, - { "pat1", "attr1", EXPECT_UNDEFINED, NULL }, - { "/testing/for/pat1", "attr1", EXPECT_UNDEFINED, NULL }, - { "/testing/for/pat0", "attr1", EXPECT_TRUE, NULL }, - { "/testing/for/pat1/inside", "attr1", EXPECT_TRUE, NULL }, - { "misc", "attr1", EXPECT_TRUE, NULL }, - /* dir match */ - { "pat2", "attr2", EXPECT_UNDEFINED, NULL }, - { "/testing/for/pat2", "attr2", EXPECT_UNDEFINED, NULL }, - { "/not/pat2/yousee", "attr2", EXPECT_UNDEFINED, NULL }, - /* path match */ - { "pat3file", "attr3", EXPECT_UNDEFINED, NULL }, - { "/pat3dir/pat3file", "attr3", EXPECT_TRUE, NULL }, - { "pat3dir/pat3file", "attr3", EXPECT_TRUE, NULL }, - /* pattern* match */ - { "pat4.txt", "attr4", EXPECT_TRUE, NULL }, - { "/fun/fun/fun/pat4.c", "attr4", EXPECT_TRUE, NULL }, - { "pat4.", "attr4", EXPECT_TRUE, NULL }, - { "pat4", "attr4", EXPECT_UNDEFINED, NULL }, - /* *pattern match */ - { "foo.pat5", "attr5", EXPECT_TRUE, NULL }, - { "/this/is/ok.pat5", "attr5", EXPECT_TRUE, NULL }, - { "/this/is/bad.pat5/yousee.txt", "attr5", EXPECT_UNDEFINED, NULL }, - { "foo.pat5", "attr100", EXPECT_UNDEFINED, NULL }, - /* glob match with slashes */ - { "foo.pat6", "attr6", EXPECT_UNDEFINED, NULL }, - { "pat6/pat6/foobar.pat6", "attr6", EXPECT_TRUE, NULL }, - { "pat6/pat6/.pat6", "attr6", EXPECT_TRUE, NULL }, - { "pat6/pat6/extra/foobar.pat6", "attr6", EXPECT_UNDEFINED, NULL }, - { "/prefix/pat6/pat6/foobar.pat6", "attr6", EXPECT_UNDEFINED, NULL }, - { "/pat6/pat6/foobar.pat6", "attr6", EXPECT_TRUE, NULL }, - /* complex pattern */ - { "pat7a12z", "attr7", EXPECT_TRUE, NULL }, - { "pat7e__x", "attr7", EXPECT_TRUE, NULL }, - { "pat7b/1y", "attr7", EXPECT_UNDEFINED, NULL }, /* ? does not match / */ - { "pat7e_x", "attr7", EXPECT_UNDEFINED, NULL }, - { "pat7aaaa", "attr7", EXPECT_UNDEFINED, NULL }, - { "pat7zzzz", "attr7", EXPECT_UNDEFINED, NULL }, - { "/this/can/be/anything/pat7a12z", "attr7", EXPECT_TRUE, NULL }, - { "but/it/still/must/match/pat7aaaa", "attr7", EXPECT_UNDEFINED, NULL }, - { "pat7aaay.fail", "attr7", EXPECT_UNDEFINED, NULL }, - /* pattern with spaces */ - { "pat8 with spaces", "attr8", EXPECT_TRUE, NULL }, - { "/gotta love/pat8 with spaces", "attr8", EXPECT_TRUE, NULL }, - { "failing pat8 with spaces", "attr8", EXPECT_UNDEFINED, NULL }, - { "spaces", "attr8", EXPECT_UNDEFINED, NULL }, - /* pattern at eof */ - { "pat9", "attr9", EXPECT_TRUE, NULL }, - { "/eof/pat9", "attr9", EXPECT_TRUE, NULL }, - { "pat", "attr9", EXPECT_UNDEFINED, NULL }, - { "at9", "attr9", EXPECT_UNDEFINED, NULL }, - { "pat9.fail", "attr9", EXPECT_UNDEFINED, NULL }, - /* sentinel at end */ - { NULL, NULL, 0, NULL } - }; - - cl_git_pass(git_attr_file__load_standalone(&file, cl_fixture("attr/attr1"))); - cl_assert_equal_s(cl_fixture("attr/attr1"), file->entry->path); - cl_assert(file->rules.length == 10); - - cl_git_pass(git_attr_path__init(&path, "/testing/for/pat0", NULL, GIT_DIR_FLAG_UNKNOWN)); - cl_assert_equal_s("pat0", path.basename); - - run_test_cases(file, cases, 0); - run_test_cases(file, dir_cases, 1); - - git_attr_file__free(file); - git_attr_path__free(&path); -} - -void test_attr_lookup__assign_variants(void) -{ - git_attr_file *file; - - struct attr_expected cases[] = { - /* pat0 -> simple assign */ - { "pat0", "simple", EXPECT_TRUE, NULL }, - { "/testing/pat0", "simple", EXPECT_TRUE, NULL }, - { "pat0", "fail", EXPECT_UNDEFINED, NULL }, - { "/testing/pat0", "fail", EXPECT_UNDEFINED, NULL }, - /* negative assign */ - { "pat1", "neg", EXPECT_FALSE, NULL }, - { "/testing/pat1", "neg", EXPECT_FALSE, NULL }, - { "pat1", "fail", EXPECT_UNDEFINED, NULL }, - { "/testing/pat1", "fail", EXPECT_UNDEFINED, NULL }, - /* forced undef */ - { "pat1", "notundef", EXPECT_TRUE, NULL }, - { "pat2", "notundef", EXPECT_UNDEFINED, NULL }, - { "/lead/in/pat1", "notundef", EXPECT_TRUE, NULL }, - { "/lead/in/pat2", "notundef", EXPECT_UNDEFINED, NULL }, - /* assign value */ - { "pat3", "assigned", EXPECT_STRING, "test-value" }, - { "pat3", "notassigned", EXPECT_UNDEFINED, NULL }, - /* assign value */ - { "pat4", "rule-with-more-chars", EXPECT_STRING, "value-with-more-chars" }, - { "pat4", "notassigned-rule-with-more-chars", EXPECT_UNDEFINED, NULL }, - /* empty assignments */ - { "pat5", "empty", EXPECT_TRUE, NULL }, - { "pat6", "negempty", EXPECT_FALSE, NULL }, - /* multiple assignment */ - { "pat7", "multiple", EXPECT_TRUE, NULL }, - { "pat7", "single", EXPECT_FALSE, NULL }, - { "pat7", "values", EXPECT_STRING, "1" }, - { "pat7", "also", EXPECT_STRING, "a-really-long-value/*" }, - { "pat7", "happy", EXPECT_STRING, "yes!" }, - { "pat8", "again", EXPECT_TRUE, NULL }, - { "pat8", "another", EXPECT_STRING, "12321" }, - /* bad assignment */ - { "patbad0", "simple", EXPECT_UNDEFINED, NULL }, - { "patbad0", "notundef", EXPECT_TRUE, NULL }, - { "patbad1", "simple", EXPECT_UNDEFINED, NULL }, - /* eof assignment */ - { "pat9", "at-eof", EXPECT_FALSE, NULL }, - /* sentinel at end */ - { NULL, NULL, 0, NULL } - }; - - cl_git_pass(git_attr_file__load_standalone(&file, cl_fixture("attr/attr2"))); - cl_assert(file->rules.length == 11); - - run_test_cases(file, cases, 0); - - git_attr_file__free(file); -} - -void test_attr_lookup__check_attr_examples(void) -{ - git_attr_file *file; - - struct attr_expected cases[] = { - { "foo.java", "diff", EXPECT_STRING, "java" }, - { "foo.java", "crlf", EXPECT_FALSE, NULL }, - { "foo.java", "myAttr", EXPECT_TRUE, NULL }, - { "foo.java", "other", EXPECT_UNDEFINED, NULL }, - { "/prefix/dir/foo.java", "diff", EXPECT_STRING, "java" }, - { "/prefix/dir/foo.java", "crlf", EXPECT_FALSE, NULL }, - { "/prefix/dir/foo.java", "myAttr", EXPECT_TRUE, NULL }, - { "/prefix/dir/foo.java", "other", EXPECT_UNDEFINED, NULL }, - { "NoMyAttr.java", "crlf", EXPECT_FALSE, NULL }, - { "NoMyAttr.java", "myAttr", EXPECT_UNDEFINED, NULL }, - { "NoMyAttr.java", "other", EXPECT_UNDEFINED, NULL }, - { "/prefix/dir/NoMyAttr.java", "crlf", EXPECT_FALSE, NULL }, - { "/prefix/dir/NoMyAttr.java", "myAttr", EXPECT_UNDEFINED, NULL }, - { "/prefix/dir/NoMyAttr.java", "other", EXPECT_UNDEFINED, NULL }, - { "README", "caveat", EXPECT_STRING, "unspecified" }, - { "/specific/path/README", "caveat", EXPECT_STRING, "unspecified" }, - { "README", "missing", EXPECT_UNDEFINED, NULL }, - { "/specific/path/README", "missing", EXPECT_UNDEFINED, NULL }, - /* sentinel at end */ - { NULL, NULL, 0, NULL } - }; - - cl_git_pass(git_attr_file__load_standalone(&file, cl_fixture("attr/attr3"))); - cl_assert(file->rules.length == 3); - - run_test_cases(file, cases, 0); - - git_attr_file__free(file); -} - -void test_attr_lookup__from_buffer(void) -{ - git_attr_file *file; - - struct attr_expected cases[] = { - { "abc", "foo", EXPECT_TRUE, NULL }, - { "abc", "bar", EXPECT_TRUE, NULL }, - { "abc", "baz", EXPECT_TRUE, NULL }, - { "aaa", "foo", EXPECT_TRUE, NULL }, - { "aaa", "bar", EXPECT_UNDEFINED, NULL }, - { "aaa", "baz", EXPECT_TRUE, NULL }, - { "qqq", "foo", EXPECT_UNDEFINED, NULL }, - { "qqq", "bar", EXPECT_UNDEFINED, NULL }, - { "qqq", "baz", EXPECT_TRUE, NULL }, - { NULL, NULL, 0, NULL } - }; - - cl_git_pass(git_attr_file__new(&file, NULL, 0)); - - cl_git_pass(git_attr_file__parse_buffer(NULL, file, "a* foo\nabc bar\n* baz")); - - cl_assert(file->rules.length == 3); - - run_test_cases(file, cases, 0); - - git_attr_file__free(file); -} diff --git a/vendor/libgit2/tests/attr/repo.c b/vendor/libgit2/tests/attr/repo.c deleted file mode 100644 index 8baf506227..0000000000 --- a/vendor/libgit2/tests/attr/repo.c +++ /dev/null @@ -1,378 +0,0 @@ -#include "clar_libgit2.h" -#include "fileops.h" -#include "git2/attr.h" -#include "attr.h" - -#include "attr_expect.h" -#include "git2/sys/repository.h" - -static git_repository *g_repo = NULL; - -void test_attr_repo__initialize(void) -{ - g_repo = cl_git_sandbox_init("attr"); -} - -void test_attr_repo__cleanup(void) -{ - cl_git_sandbox_cleanup(); - g_repo = NULL; -} - -static struct attr_expected get_one_test_cases[] = { - { "root_test1", "repoattr", EXPECT_TRUE, NULL }, - { "root_test1", "rootattr", EXPECT_TRUE, NULL }, - { "root_test1", "missingattr", EXPECT_UNDEFINED, NULL }, - { "root_test1", "subattr", EXPECT_UNDEFINED, NULL }, - { "root_test1", "negattr", EXPECT_UNDEFINED, NULL }, - { "root_test2", "repoattr", EXPECT_TRUE, NULL }, - { "root_test2", "rootattr", EXPECT_FALSE, NULL }, - { "root_test2", "missingattr", EXPECT_UNDEFINED, NULL }, - { "root_test2", "multiattr", EXPECT_FALSE, NULL }, - { "root_test3", "repoattr", EXPECT_TRUE, NULL }, - { "root_test3", "rootattr", EXPECT_UNDEFINED, NULL }, - { "root_test3", "multiattr", EXPECT_STRING, "3" }, - { "root_test3", "multi2", EXPECT_UNDEFINED, NULL }, - { "sub/subdir_test1", "repoattr", EXPECT_TRUE, NULL }, - { "sub/subdir_test1", "rootattr", EXPECT_TRUE, NULL }, - { "sub/subdir_test1", "missingattr", EXPECT_UNDEFINED, NULL }, - { "sub/subdir_test1", "subattr", EXPECT_STRING, "yes" }, - { "sub/subdir_test1", "negattr", EXPECT_FALSE, NULL }, - { "sub/subdir_test1", "another", EXPECT_UNDEFINED, NULL }, - { "sub/subdir_test2.txt", "repoattr", EXPECT_TRUE, NULL }, - { "sub/subdir_test2.txt", "rootattr", EXPECT_TRUE, NULL }, - { "sub/subdir_test2.txt", "missingattr", EXPECT_UNDEFINED, NULL }, - { "sub/subdir_test2.txt", "subattr", EXPECT_STRING, "yes" }, - { "sub/subdir_test2.txt", "negattr", EXPECT_FALSE, NULL }, - { "sub/subdir_test2.txt", "another", EXPECT_STRING, "zero" }, - { "sub/subdir_test2.txt", "reposub", EXPECT_TRUE, NULL }, - { "sub/sub/subdir.txt", "another", EXPECT_STRING, "one" }, - { "sub/sub/subdir.txt", "reposubsub", EXPECT_TRUE, NULL }, - { "sub/sub/subdir.txt", "reposub", EXPECT_UNDEFINED, NULL }, - { "does-not-exist", "foo", EXPECT_STRING, "yes" }, - { "sub/deep/file", "deepdeep", EXPECT_TRUE, NULL }, - { "sub/sub/d/no", "test", EXPECT_STRING, "a/b/d/*" }, - { "sub/sub/d/yes", "test", EXPECT_UNDEFINED, NULL }, -}; - -void test_attr_repo__get_one(void) -{ - int i; - - for (i = 0; i < (int)ARRAY_SIZE(get_one_test_cases); ++i) { - struct attr_expected *scan = &get_one_test_cases[i]; - const char *value; - - cl_git_pass(git_attr_get(&value, g_repo, 0, scan->path, scan->attr)); - attr_check_expected( - scan->expected, scan->expected_str, scan->attr, value); - } - - cl_assert(git_attr_cache__is_cached( - g_repo, GIT_ATTR_FILE__FROM_FILE, ".git/info/attributes")); - cl_assert(git_attr_cache__is_cached( - g_repo, GIT_ATTR_FILE__FROM_FILE, ".gitattributes")); - cl_assert(git_attr_cache__is_cached( - g_repo, GIT_ATTR_FILE__FROM_FILE, "sub/.gitattributes")); -} - -void test_attr_repo__get_one_start_deep(void) -{ - int i; - - for (i = (int)ARRAY_SIZE(get_one_test_cases) - 1; i >= 0; --i) { - struct attr_expected *scan = &get_one_test_cases[i]; - const char *value; - - cl_git_pass(git_attr_get(&value, g_repo, 0, scan->path, scan->attr)); - attr_check_expected( - scan->expected, scan->expected_str, scan->attr, value); - } - - cl_assert(git_attr_cache__is_cached( - g_repo, GIT_ATTR_FILE__FROM_FILE, ".git/info/attributes")); - cl_assert(git_attr_cache__is_cached( - g_repo, GIT_ATTR_FILE__FROM_FILE, ".gitattributes")); - cl_assert(git_attr_cache__is_cached( - g_repo, GIT_ATTR_FILE__FROM_FILE, "sub/.gitattributes")); -} - -void test_attr_repo__get_many(void) -{ - const char *names[4] = { "repoattr", "rootattr", "missingattr", "subattr" }; - const char *values[4]; - - cl_git_pass(git_attr_get_many(values, g_repo, 0, "root_test1", 4, names)); - - cl_assert(GIT_ATTR_TRUE(values[0])); - cl_assert(GIT_ATTR_TRUE(values[1])); - cl_assert(GIT_ATTR_UNSPECIFIED(values[2])); - cl_assert(GIT_ATTR_UNSPECIFIED(values[3])); - - cl_git_pass(git_attr_get_many(values, g_repo, 0, "root_test2", 4, names)); - - cl_assert(GIT_ATTR_TRUE(values[0])); - cl_assert(GIT_ATTR_FALSE(values[1])); - cl_assert(GIT_ATTR_UNSPECIFIED(values[2])); - cl_assert(GIT_ATTR_UNSPECIFIED(values[3])); - - cl_git_pass(git_attr_get_many(values, g_repo, 0, "sub/subdir_test1", 4, names)); - - cl_assert(GIT_ATTR_TRUE(values[0])); - cl_assert(GIT_ATTR_TRUE(values[1])); - cl_assert(GIT_ATTR_UNSPECIFIED(values[2])); - cl_assert_equal_s("yes", values[3]); -} - -void test_attr_repo__get_many_in_place(void) -{ - const char *vals[4] = { "repoattr", "rootattr", "missingattr", "subattr" }; - - /* it should be legal to look up values into the same array that has - * the attribute names, overwriting each name as the value is found. - */ - - cl_git_pass(git_attr_get_many(vals, g_repo, 0, "sub/subdir_test1", 4, vals)); - - cl_assert(GIT_ATTR_TRUE(vals[0])); - cl_assert(GIT_ATTR_TRUE(vals[1])); - cl_assert(GIT_ATTR_UNSPECIFIED(vals[2])); - cl_assert_equal_s("yes", vals[3]); -} - -static int count_attrs( - const char *name, - const char *value, - void *payload) -{ - GIT_UNUSED(name); - GIT_UNUSED(value); - - *((int *)payload) += 1; - - return 0; -} - -#define CANCEL_VALUE 12345 - -static int cancel_iteration( - const char *name, - const char *value, - void *payload) -{ - GIT_UNUSED(name); - GIT_UNUSED(value); - - *((int *)payload) -= 1; - - if (*((int *)payload) < 0) - return CANCEL_VALUE; - - return 0; -} - -void test_attr_repo__foreach(void) -{ - int count; - - count = 0; - cl_git_pass(git_attr_foreach( - g_repo, 0, "root_test1", &count_attrs, &count)); - cl_assert(count == 2); - - count = 0; - cl_git_pass(git_attr_foreach(g_repo, 0, "sub/subdir_test1", - &count_attrs, &count)); - cl_assert(count == 4); /* repoattr, rootattr, subattr, negattr */ - - count = 0; - cl_git_pass(git_attr_foreach(g_repo, 0, "sub/subdir_test2.txt", - &count_attrs, &count)); - cl_assert(count == 6); /* repoattr, rootattr, subattr, reposub, negattr, another */ - - count = 2; - cl_assert_equal_i( - CANCEL_VALUE, git_attr_foreach( - g_repo, 0, "sub/subdir_test1", &cancel_iteration, &count) - ); -} - -void test_attr_repo__manpage_example(void) -{ - const char *value; - - cl_git_pass(git_attr_get(&value, g_repo, 0, "sub/abc", "foo")); - cl_assert(GIT_ATTR_TRUE(value)); - - cl_git_pass(git_attr_get(&value, g_repo, 0, "sub/abc", "bar")); - cl_assert(GIT_ATTR_UNSPECIFIED(value)); - - cl_git_pass(git_attr_get(&value, g_repo, 0, "sub/abc", "baz")); - cl_assert(GIT_ATTR_FALSE(value)); - - cl_git_pass(git_attr_get(&value, g_repo, 0, "sub/abc", "merge")); - cl_assert_equal_s("filfre", value); - - cl_git_pass(git_attr_get(&value, g_repo, 0, "sub/abc", "frotz")); - cl_assert(GIT_ATTR_UNSPECIFIED(value)); -} - -void test_attr_repo__macros(void) -{ - const char *names[5] = { "rootattr", "binary", "diff", "crlf", "frotz" }; - const char *names2[5] = { "mymacro", "positive", "negative", "rootattr", "another" }; - const char *names3[3] = { "macro2", "multi2", "multi3" }; - const char *values[5]; - - cl_git_pass(git_attr_get_many(values, g_repo, 0, "binfile", 5, names)); - - cl_assert(GIT_ATTR_TRUE(values[0])); - cl_assert(GIT_ATTR_TRUE(values[1])); - cl_assert(GIT_ATTR_FALSE(values[2])); - cl_assert(GIT_ATTR_FALSE(values[3])); - cl_assert(GIT_ATTR_UNSPECIFIED(values[4])); - - cl_git_pass(git_attr_get_many(values, g_repo, 0, "macro_test", 5, names2)); - - cl_assert(GIT_ATTR_TRUE(values[0])); - cl_assert(GIT_ATTR_TRUE(values[1])); - cl_assert(GIT_ATTR_FALSE(values[2])); - cl_assert(GIT_ATTR_UNSPECIFIED(values[3])); - cl_assert_equal_s("77", values[4]); - - cl_git_pass(git_attr_get_many(values, g_repo, 0, "macro_test", 3, names3)); - - cl_assert(GIT_ATTR_TRUE(values[0])); - cl_assert(GIT_ATTR_FALSE(values[1])); - cl_assert_equal_s("answer", values[2]); -} - -void test_attr_repo__bad_macros(void) -{ - const char *names[6] = { "rootattr", "positive", "negative", - "firstmacro", "secondmacro", "thirdmacro" }; - const char *values[6]; - - cl_git_pass(git_attr_get_many(values, g_repo, 0, "macro_bad", 6, names)); - - /* these three just confirm that the "mymacro" rule ran */ - cl_assert(GIT_ATTR_UNSPECIFIED(values[0])); - cl_assert(GIT_ATTR_TRUE(values[1])); - cl_assert(GIT_ATTR_FALSE(values[2])); - - /* file contains: - * # let's try some malicious macro defs - * [attr]firstmacro -thirdmacro -secondmacro - * [attr]secondmacro firstmacro -firstmacro - * [attr]thirdmacro secondmacro=hahaha -firstmacro - * macro_bad firstmacro secondmacro thirdmacro - * - * firstmacro assignment list ends up with: - * -thirdmacro -secondmacro - * secondmacro assignment list expands "firstmacro" and ends up with: - * -thirdmacro -secondmacro -firstmacro - * thirdmacro assignment don't expand so list ends up with: - * secondmacro="hahaha" - * - * macro_bad assignment list ends up with: - * -thirdmacro -secondmacro firstmacro && - * -thirdmacro -secondmacro -firstmacro secondmacro && - * secondmacro="hahaha" thirdmacro - * - * so summary results should be: - * -firstmacro secondmacro="hahaha" thirdmacro - */ - cl_assert(GIT_ATTR_FALSE(values[3])); - cl_assert_equal_s("hahaha", values[4]); - cl_assert(GIT_ATTR_TRUE(values[5])); -} - -#define CONTENT "I'm going to be dynamically processed\r\n" \ - "And my line endings...\r\n" \ - "...are going to be\n" \ - "normalized!\r\n" - -#define GITATTR "* text=auto\n" \ - "*.txt text\n" \ - "*.data binary\n" - -static void add_to_workdir(const char *filename, const char *content) -{ - git_buf buf = GIT_BUF_INIT; - - cl_git_pass(git_buf_joinpath(&buf, "attr", filename)); - cl_git_rewritefile(git_buf_cstr(&buf), content); - - git_buf_free(&buf); -} - -static void assert_proper_normalization(git_index *index, const char *filename, const char *expected_sha) -{ - size_t index_pos; - const git_index_entry *entry; - - add_to_workdir(filename, CONTENT); - cl_git_pass(git_index_add_bypath(index, filename)); - - cl_assert(!git_index_find(&index_pos, index, filename)); - - entry = git_index_get_byindex(index, index_pos); - cl_assert_equal_i(0, git_oid_streq(&entry->id, expected_sha)); -} - -void test_attr_repo__staging_properly_normalizes_line_endings_according_to_gitattributes_directives(void) -{ - git_index* index; - - cl_git_pass(git_repository_index(&index, g_repo)); - - add_to_workdir(".gitattributes", GITATTR); - - assert_proper_normalization(index, "text.txt", "22c74203bace3c2e950278c7ab08da0fca9f4e9b"); - assert_proper_normalization(index, "huh.dunno", "22c74203bace3c2e950278c7ab08da0fca9f4e9b"); - assert_proper_normalization(index, "binary.data", "66eeff1fcbacf589e6d70aa70edd3fce5be2b37c"); - - git_index_free(index); -} - -void test_attr_repo__bare_repo_with_index(void) -{ - const char *names[4] = { "test1", "test2", "test3", "test4" }; - const char *values[4]; - git_index *index; - - cl_git_pass(git_repository_index(&index, g_repo)); - - cl_git_mkfile( - "attr/.gitattributes", - "*.txt test1 test2=foobar -test3\n" - "trial.txt -test1 test2=barfoo !test3 test4\n"); - cl_git_pass(git_index_add_bypath(index, ".gitattributes")); - git_index_free(index); - - cl_must_pass(p_unlink("attr/.gitattributes")); - cl_assert(!git_path_exists("attr/.gitattributes")); - - cl_git_pass(git_repository_set_bare(g_repo)); - - cl_git_pass(git_attr_get_many(values, g_repo, 0, "file.txt", 4, names)); - - cl_assert(GIT_ATTR_TRUE(values[0])); - cl_assert_equal_s("foobar", values[1]); - cl_assert(GIT_ATTR_FALSE(values[2])); - cl_assert(GIT_ATTR_UNSPECIFIED(values[3])); - - cl_git_pass(git_attr_get_many(values, g_repo, 0, "trial.txt", 4, names)); - - cl_assert(GIT_ATTR_FALSE(values[0])); - cl_assert_equal_s("barfoo", values[1]); - cl_assert(GIT_ATTR_UNSPECIFIED(values[2])); - cl_assert(GIT_ATTR_TRUE(values[3])); - - cl_git_pass(git_attr_get_many(values, g_repo, 0, "sub/sub/subdir.txt", 4, names)); - - cl_assert(GIT_ATTR_TRUE(values[0])); - cl_assert_equal_s("foobar", values[1]); - cl_assert(GIT_ATTR_FALSE(values[2])); - cl_assert(GIT_ATTR_UNSPECIFIED(values[3])); -} diff --git a/vendor/libgit2/tests/blame/blame_helpers.c b/vendor/libgit2/tests/blame/blame_helpers.c deleted file mode 100644 index b305ba1e31..0000000000 --- a/vendor/libgit2/tests/blame/blame_helpers.c +++ /dev/null @@ -1,67 +0,0 @@ -#include "blame_helpers.h" - -void hunk_message(size_t idx, const git_blame_hunk *hunk, const char *fmt, ...) -{ - va_list arglist; - - printf("Hunk %"PRIuZ" (line %d +%d): ", idx, - hunk->final_start_line_number, hunk->lines_in_hunk-1); - - va_start(arglist, fmt); - vprintf(fmt, arglist); - va_end(arglist); - - printf("\n"); -} - -void check_blame_hunk_index(git_repository *repo, git_blame *blame, int idx, - int start_line, int len, char boundary, const char *commit_id, const char *orig_path) -{ - char expected[GIT_OID_HEXSZ+1] = {0}, actual[GIT_OID_HEXSZ+1] = {0}; - const git_blame_hunk *hunk = git_blame_get_hunk_byindex(blame, idx); - cl_assert(hunk); - - if (!strncmp(commit_id, "0000", 4)) { - strcpy(expected, "0000000000000000000000000000000000000000"); - } else { - git_object *obj; - cl_git_pass(git_revparse_single(&obj, repo, commit_id)); - git_oid_fmt(expected, git_object_id(obj)); - git_object_free(obj); - } - - if (hunk->final_start_line_number != start_line) { - hunk_message(idx, hunk, "mismatched start line number: expected %d, got %d", - start_line, hunk->final_start_line_number); - } - cl_assert_equal_i(hunk->final_start_line_number, start_line); - - if (hunk->lines_in_hunk != len) { - hunk_message(idx, hunk, "mismatched line count: expected %d, got %d", - len, hunk->lines_in_hunk); - } - cl_assert_equal_i(hunk->lines_in_hunk, len); - - git_oid_fmt(actual, &hunk->final_commit_id); - if (strcmp(expected, actual)) { - hunk_message(idx, hunk, "has mismatched original id (got %s, expected %s)\n", - actual, expected); - } - cl_assert_equal_s(actual, expected); - cl_assert_equal_oid(&hunk->final_commit_id, &hunk->orig_commit_id); - - - if (strcmp(hunk->orig_path, orig_path)) { - hunk_message(idx, hunk, "has mismatched original path (got '%s', expected '%s')\n", - hunk->orig_path, orig_path); - } - cl_assert_equal_s(hunk->orig_path, orig_path); - - if (hunk->boundary != boundary) { - hunk_message(idx, hunk, "doesn't match boundary flag (got %d, expected %d)\n", - hunk->boundary, boundary); - } - cl_assert_equal_i(boundary, hunk->boundary); -} - - diff --git a/vendor/libgit2/tests/blame/blame_helpers.h b/vendor/libgit2/tests/blame/blame_helpers.h deleted file mode 100644 index 94321a5b50..0000000000 --- a/vendor/libgit2/tests/blame/blame_helpers.h +++ /dev/null @@ -1,16 +0,0 @@ -#include "clar_libgit2.h" -#include "blame.h" - -void hunk_message(size_t idx, const git_blame_hunk *hunk, const char *fmt, ...); - -void check_blame_hunk_index( - git_repository *repo, - git_blame *blame, - int idx, - int start_line, - int len, - char boundary, - const char *commit_id, - const char *orig_path); - - diff --git a/vendor/libgit2/tests/blame/buffer.c b/vendor/libgit2/tests/blame/buffer.c deleted file mode 100644 index 340b1dcede..0000000000 --- a/vendor/libgit2/tests/blame/buffer.c +++ /dev/null @@ -1,166 +0,0 @@ -#include "blame_helpers.h" - -static git_repository *g_repo; -static git_blame *g_fileblame, *g_bufferblame; - -void test_blame_buffer__initialize(void) -{ - cl_git_pass(git_repository_open(&g_repo, cl_fixture("blametest.git"))); - cl_git_pass(git_blame_file(&g_fileblame, g_repo, "b.txt", NULL)); - g_bufferblame = NULL; -} - -void test_blame_buffer__cleanup(void) -{ - git_blame_free(g_fileblame); - git_blame_free(g_bufferblame); - git_repository_free(g_repo); -} - -void test_blame_buffer__added_line(void) -{ - const git_blame_hunk *hunk; - - const char *buffer = "\ -EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE\n\ -EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE\n\ -EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE\n\ -EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE\n\ -\n\ -abcdefg\n\ -BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\n\ -BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\n\ -BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\n\ -BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\n\ -\n\ -CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC\n\ -CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC\n\ -CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC\n\ -CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC\n\n"; - - cl_git_pass(git_blame_buffer(&g_bufferblame, g_fileblame, buffer, strlen(buffer))); - cl_assert_equal_i(5, git_blame_get_hunk_count(g_bufferblame)); - check_blame_hunk_index(g_repo, g_bufferblame, 2, 6, 1, 0, "000000", "b.txt"); - - hunk = git_blame_get_hunk_byline(g_bufferblame, 16); - cl_assert(hunk); - cl_assert_equal_s("Ben Straub", hunk->final_signature->name); -} - -void test_blame_buffer__deleted_line(void) -{ - const char *buffer = "\ -EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE\n\ -EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE\n\ -EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE\n\ -EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE\n\ -\n\ -BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\n\ -BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\n\ -BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\n\ -\n\ -CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC\n\ -CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC\n\ -CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC\n\ -CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC\n\n"; - - cl_git_pass(git_blame_buffer(&g_bufferblame, g_fileblame, buffer, strlen(buffer))); - check_blame_hunk_index(g_repo, g_bufferblame, 2, 6, 3, 0, "63d671eb", "b.txt"); - check_blame_hunk_index(g_repo, g_bufferblame, 3, 9, 1, 0, "63d671eb", "b.txt"); - check_blame_hunk_index(g_repo, g_bufferblame, 4, 10, 5, 0, "aa06ecca", "b.txt"); -} - -void test_blame_buffer__add_splits_hunk(void) -{ - const char *buffer = "\ -EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE\n\ -EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE\n\ -EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE\n\ -EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE\n\ -\n\ -BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\n\ -BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\n\ -abc\n\ -BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\n\ -BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\n\ -\n\ -CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC\n\ -CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC\n\ -CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC\n\ -CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC\n\n"; - - cl_git_pass(git_blame_buffer(&g_bufferblame, g_fileblame, buffer, strlen(buffer))); - check_blame_hunk_index(g_repo, g_bufferblame, 2, 6, 2, 0, "63d671eb", "b.txt"); - check_blame_hunk_index(g_repo, g_bufferblame, 3, 8, 1, 0, "00000000", "b.txt"); - check_blame_hunk_index(g_repo, g_bufferblame, 4, 9, 3, 0, "63d671eb", "b.txt"); -} - -void test_blame_buffer__delete_crosses_hunk_boundary(void) -{ - const char *buffer = "\ -EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE\n\ -EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE\n\ -EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE\n\ -EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE\n\ -\n\ -BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\n\ -CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC\n\n"; - - cl_git_pass(git_blame_buffer(&g_bufferblame, g_fileblame, buffer, strlen(buffer))); - check_blame_hunk_index(g_repo, g_bufferblame, 2, 6, 1, 0, "63d671eb", "b.txt"); - check_blame_hunk_index(g_repo, g_bufferblame, 3, 7, 2, 0, "aa06ecca", "b.txt"); -} - -void test_blame_buffer__replace_line(void) -{ - const char *buffer = "\ -EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE\n\ -EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE\n\ -EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE\n\ -EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE\n\ -\n\ -BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\n\ -abc\n\ -BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\n\ -BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\n\ -\n\ -CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC\n\ -CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC\n\ -CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC\n\ -CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC\n\n"; - - cl_git_pass(git_blame_buffer(&g_bufferblame, g_fileblame, buffer, strlen(buffer))); - check_blame_hunk_index(g_repo, g_bufferblame, 2, 6, 1, 0, "63d671eb", "b.txt"); - check_blame_hunk_index(g_repo, g_bufferblame, 3, 7, 1, 0, "00000000", "b.txt"); - check_blame_hunk_index(g_repo, g_bufferblame, 4, 8, 3, 0, "63d671eb", "b.txt"); -} - -void test_blame_buffer__add_lines_at_end(void) -{ - const char *buffer = "\ -EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE\n\ -EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE\n\ -EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE\n\ -EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE\n\ -\n\ -BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\n\ -BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\n\ -BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\n\ -BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\n\ -\n\ -CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC\n\ -CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC\n\ -CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC\n\ -CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC\n\ -\n\ -abc\n\ -def\n"; - cl_git_pass(git_blame_buffer(&g_bufferblame, g_fileblame, buffer, strlen(buffer))); - - cl_assert_equal_i(5, git_blame_get_hunk_count(g_bufferblame)); - check_blame_hunk_index(g_repo, g_bufferblame, 0, 1, 4, 0, "da237394", "b.txt"); - check_blame_hunk_index(g_repo, g_bufferblame, 1, 5, 1, 1, "b99f7ac0", "b.txt"); - check_blame_hunk_index(g_repo, g_bufferblame, 2, 6, 5, 0, "63d671eb", "b.txt"); - check_blame_hunk_index(g_repo, g_bufferblame, 3, 11, 5, 0, "aa06ecca", "b.txt"); - check_blame_hunk_index(g_repo, g_bufferblame, 4, 16, 2, 0, "00000000", "b.txt"); -} diff --git a/vendor/libgit2/tests/blame/getters.c b/vendor/libgit2/tests/blame/getters.c deleted file mode 100644 index 66eaeecf97..0000000000 --- a/vendor/libgit2/tests/blame/getters.c +++ /dev/null @@ -1,56 +0,0 @@ -#include "clar_libgit2.h" - -#include "blame.h" - -git_blame *g_blame; - -void test_blame_getters__initialize(void) -{ - size_t i; - git_blame_options opts = GIT_BLAME_OPTIONS_INIT; - - git_blame_hunk hunks[] = { - { 3, {{0}}, 1, NULL, {{0}}, "a", 0}, - { 3, {{0}}, 4, NULL, {{0}}, "b", 0}, - { 3, {{0}}, 7, NULL, {{0}}, "c", 0}, - { 3, {{0}}, 10, NULL, {{0}}, "d", 0}, - { 3, {{0}}, 13, NULL, {{0}}, "e", 0}, - }; - - g_blame = git_blame__alloc(NULL, opts, ""); - - for (i=0; i<5; i++) { - git_blame_hunk *h = git__calloc(1, sizeof(git_blame_hunk)); - h->final_start_line_number = hunks[i].final_start_line_number; - h->orig_path = git__strdup(hunks[i].orig_path); - h->lines_in_hunk = hunks[i].lines_in_hunk; - - git_vector_insert(&g_blame->hunks, h); - } -} - -void test_blame_getters__cleanup(void) -{ - git_blame_free(g_blame); -} - - -void test_blame_getters__byindex(void) -{ - const git_blame_hunk *h = git_blame_get_hunk_byindex(g_blame, 2); - cl_assert(h); - cl_assert_equal_s(h->orig_path, "c"); - - h = git_blame_get_hunk_byindex(g_blame, 95); - cl_assert_equal_p(h, NULL); -} - -void test_blame_getters__byline(void) -{ - const git_blame_hunk *h = git_blame_get_hunk_byline(g_blame, 5); - cl_assert(h); - cl_assert_equal_s(h->orig_path, "b"); - - h = git_blame_get_hunk_byline(g_blame, 95); - cl_assert_equal_p(h, NULL); -} diff --git a/vendor/libgit2/tests/blame/harder.c b/vendor/libgit2/tests/blame/harder.c deleted file mode 100644 index e777417205..0000000000 --- a/vendor/libgit2/tests/blame/harder.c +++ /dev/null @@ -1,79 +0,0 @@ -#include "clar_libgit2.h" - -#include "blame.h" - - -/** - * The test repo has a history that looks like this: - * - * * (A) bc7c5ac - * |\ - * | * (B) aa06ecc - * * | (C) 63d671e - * |/ - * * (D) da23739 - * * (E) b99f7ac - * - */ - -static git_repository *g_repo = NULL; - -void test_blame_harder__initialize(void) -{ - cl_git_pass(git_repository_open(&g_repo, cl_fixture("blametest.git"))); -} - -void test_blame_harder__cleanup(void) -{ - git_repository_free(g_repo); - g_repo = NULL; -} - - - -void test_blame_harder__m(void) -{ - /* TODO */ - git_blame_options opts = GIT_BLAME_OPTIONS_INIT; - - GIT_UNUSED(opts); - - opts.flags = GIT_BLAME_TRACK_COPIES_SAME_FILE; -} - - -void test_blame_harder__c(void) -{ - git_blame_options opts = GIT_BLAME_OPTIONS_INIT; - - GIT_UNUSED(opts); - - /* Attribute the first hunk in b.txt to (E), since it was cut/pasted from - * a.txt in (D). - */ - opts.flags = GIT_BLAME_TRACK_COPIES_SAME_COMMIT_MOVES; -} - -void test_blame_harder__cc(void) -{ - git_blame_options opts = GIT_BLAME_OPTIONS_INIT; - - GIT_UNUSED(opts); - - /* Attribute the second hunk in b.txt to (E), since it was copy/pasted from - * a.txt in (C). - */ - opts.flags = GIT_BLAME_TRACK_COPIES_SAME_COMMIT_COPIES; -} - -void test_blame_harder__ccc(void) -{ - git_blame_options opts = GIT_BLAME_OPTIONS_INIT; - - GIT_UNUSED(opts); - - /* Attribute the third hunk in b.txt to (E). This hunk was deleted from - * a.txt in (D), but reintroduced in (B). - */ - opts.flags = GIT_BLAME_TRACK_COPIES_ANY_COMMIT_COPIES; -} diff --git a/vendor/libgit2/tests/blame/simple.c b/vendor/libgit2/tests/blame/simple.c deleted file mode 100644 index 83e5e056b9..0000000000 --- a/vendor/libgit2/tests/blame/simple.c +++ /dev/null @@ -1,324 +0,0 @@ -#include "blame_helpers.h" - -static git_repository *g_repo; -static git_blame *g_blame; - -void test_blame_simple__initialize(void) -{ - g_repo = NULL; - g_blame = NULL; -} - -void test_blame_simple__cleanup(void) -{ - git_blame_free(g_blame); - git_repository_free(g_repo); -} - -/* - * $ git blame -s branch_file.txt - * orig line no final line no - * commit V author timestamp V - * c47800c7 1 (Scott Chacon 2010-05-25 11:58:14 -0700 1 - * a65fedf3 2 (Scott Chacon 2011-08-09 19:33:46 -0700 2 - */ -void test_blame_simple__trivial_testrepo(void) -{ - cl_git_pass(git_repository_open(&g_repo, cl_fixture("testrepo/.gitted"))); - cl_git_pass(git_blame_file(&g_blame, g_repo, "branch_file.txt", NULL)); - - cl_assert_equal_i(2, git_blame_get_hunk_count(g_blame)); - check_blame_hunk_index(g_repo, g_blame, 0, 1, 1, 0, "c47800c7", "branch_file.txt"); - check_blame_hunk_index(g_repo, g_blame, 1, 2, 1, 0, "a65fedf3", "branch_file.txt"); -} - -/* - * $ git blame -n b.txt - * orig line no final line no - * commit V author timestamp V - * da237394 1 (Ben Straub 2013-02-12 15:11:30 -0800 1 - * da237394 2 (Ben Straub 2013-02-12 15:11:30 -0800 2 - * da237394 3 (Ben Straub 2013-02-12 15:11:30 -0800 3 - * da237394 4 (Ben Straub 2013-02-12 15:11:30 -0800 4 - * ^b99f7ac 1 (Ben Straub 2013-02-12 15:10:12 -0800 5 - * 63d671eb 6 (Ben Straub 2013-02-12 15:13:04 -0800 6 - * 63d671eb 7 (Ben Straub 2013-02-12 15:13:04 -0800 7 - * 63d671eb 8 (Ben Straub 2013-02-12 15:13:04 -0800 8 - * 63d671eb 9 (Ben Straub 2013-02-12 15:13:04 -0800 9 - * 63d671eb 10 (Ben Straub 2013-02-12 15:13:04 -0800 10 - * aa06ecca 6 (Ben Straub 2013-02-12 15:14:46 -0800 11 - * aa06ecca 7 (Ben Straub 2013-02-12 15:14:46 -0800 12 - * aa06ecca 8 (Ben Straub 2013-02-12 15:14:46 -0800 13 - * aa06ecca 9 (Ben Straub 2013-02-12 15:14:46 -0800 14 - * aa06ecca 10 (Ben Straub 2013-02-12 15:14:46 -0800 15 - */ -void test_blame_simple__trivial_blamerepo(void) -{ - cl_git_pass(git_repository_open(&g_repo, cl_fixture("blametest.git"))); - cl_git_pass(git_blame_file(&g_blame, g_repo, "b.txt", NULL)); - - cl_assert_equal_i(4, git_blame_get_hunk_count(g_blame)); - check_blame_hunk_index(g_repo, g_blame, 0, 1, 4, 0, "da237394", "b.txt"); - check_blame_hunk_index(g_repo, g_blame, 1, 5, 1, 1, "b99f7ac0", "b.txt"); - check_blame_hunk_index(g_repo, g_blame, 2, 6, 5, 0, "63d671eb", "b.txt"); - check_blame_hunk_index(g_repo, g_blame, 3, 11, 5, 0, "aa06ecca", "b.txt"); -} - - -/* - * $ git blame -n 359fc2d -- include/git2.h - * orig line no final line no - * commit orig path V author timestamp V - * d12299fe src/git.h 1 (Vicent MartĂ­ 2010-12-03 22:22:10 +0200 1 - * 359fc2d2 include/git2.h 2 (Edward Thomson 2013-01-08 17:07:25 -0600 2 - * d12299fe src/git.h 5 (Vicent MartĂ­ 2010-12-03 22:22:10 +0200 3 - * bb742ede include/git2.h 4 (Vicent MartĂ­ 2011-09-19 01:54:32 +0300 4 - * bb742ede include/git2.h 5 (Vicent MartĂ­ 2011-09-19 01:54:32 +0300 5 - * d12299fe src/git.h 24 (Vicent MartĂ­ 2010-12-03 22:22:10 +0200 6 - * d12299fe src/git.h 25 (Vicent MartĂ­ 2010-12-03 22:22:10 +0200 7 - * d12299fe src/git.h 26 (Vicent MartĂ­ 2010-12-03 22:22:10 +0200 8 - * d12299fe src/git.h 27 (Vicent MartĂ­ 2010-12-03 22:22:10 +0200 9 - * d12299fe src/git.h 28 (Vicent MartĂ­ 2010-12-03 22:22:10 +0200 10 - * 96fab093 include/git2.h 11 (Sven Strickroth 2011-10-09 18:37:41 +0200 11 - * 9d1dcca2 src/git2.h 33 (Vicent MartĂ­ 2011-02-07 10:35:58 +0200 12 - * 44908fe7 src/git2.h 29 (Vicent MartĂ­ 2010-12-06 23:03:16 +0200 13 - * a15c550d include/git2.h 14 (Vicent MartĂ­ 2011-11-16 14:09:44 +0100 14 - * 44908fe7 src/git2.h 30 (Vicent MartĂ­ 2010-12-06 23:03:16 +0200 15 - * d12299fe src/git.h 32 (Vicent MartĂ­ 2010-12-03 22:22:10 +0200 16 - * 44908fe7 src/git2.h 33 (Vicent MartĂ­ 2010-12-06 23:03:16 +0200 17 - * d12299fe src/git.h 34 (Vicent MartĂ­ 2010-12-03 22:22:10 +0200 18 - * 44908fe7 src/git2.h 35 (Vicent MartĂ­ 2010-12-06 23:03:16 +0200 19 - * 638c2ca4 src/git2.h 36 (Vicent MartĂ­ 2010-12-18 02:10:25 +0200 20 - * 44908fe7 src/git2.h 36 (Vicent MartĂ­ 2010-12-06 23:03:16 +0200 21 - * d12299fe src/git.h 37 (Vicent MartĂ­ 2010-12-03 22:22:10 +0200 22 - * 44908fe7 src/git2.h 38 (Vicent MartĂ­ 2010-12-06 23:03:16 +0200 23 - * 44908fe7 src/git2.h 39 (Vicent MartĂ­ 2010-12-06 23:03:16 +0200 24 - * bf787bd8 include/git2.h 25 (Carlos MartĂ­n Nieto 2012-04-08 18:56:50 +0200 25 - * 0984c876 include/git2.h 26 (Scott J. Goldman 2012-11-28 18:27:43 -0800 26 - * 2f8a8ab2 src/git2.h 41 (Vicent MartĂ­ 2011-01-29 01:56:25 +0200 27 - * 27df4275 include/git2.h 47 (Michael Schubert 2011-06-28 14:13:12 +0200 28 - * a346992f include/git2.h 28 (Ben Straub 2012-05-10 09:47:14 -0700 29 - * d12299fe src/git.h 40 (Vicent MartĂ­ 2010-12-03 22:22:10 +0200 30 - * 44908fe7 src/git2.h 41 (Vicent MartĂ­ 2010-12-06 23:03:16 +0200 31 - * 44908fe7 src/git2.h 42 (Vicent MartĂ­ 2010-12-06 23:03:16 +0200 32 - * 44908fe7 src/git2.h 43 (Vicent MartĂ­ 2010-12-06 23:03:16 +0200 33 - * 44908fe7 src/git2.h 44 (Vicent MartĂ­ 2010-12-06 23:03:16 +0200 34 - * 44908fe7 src/git2.h 45 (Vicent MartĂ­ 2010-12-06 23:03:16 +0200 35 - * 65b09b1d include/git2.h 33 (Russell Belfer 2012-02-02 18:03:43 -0800 36 - * d12299fe src/git.h 46 (Vicent MartĂ­ 2010-12-03 22:22:10 +0200 37 - * 44908fe7 src/git2.h 47 (Vicent MartĂ­ 2010-12-06 23:03:16 +0200 38 - * 5d4cd003 include/git2.h 55 (Carlos MartĂ­n Nieto 2011-03-28 17:02:45 +0200 39 - * 41fb1ca0 include/git2.h 39 (Philip Kelley 2012-10-29 13:41:14 -0400 40 - * 2dc31040 include/git2.h 56 (Carlos MartĂ­n Nieto 2011-06-20 18:58:57 +0200 41 - * 764df57e include/git2.h 40 (Ben Straub 2012-06-15 13:14:43 -0700 42 - * 5280f4e6 include/git2.h 41 (Ben Straub 2012-07-31 19:39:06 -0700 43 - * 613d5eb9 include/git2.h 43 (Philip Kelley 2012-11-28 11:42:37 -0500 44 - * d12299fe src/git.h 48 (Vicent MartĂ­ 2010-12-03 22:22:10 +0200 45 - * 111ee3fe include/git2.h 41 (Vicent MartĂ­ 2012-07-11 14:37:26 +0200 46 - * f004c4a8 include/git2.h 44 (Russell Belfer 2012-08-21 17:26:39 -0700 47 - * 111ee3fe include/git2.h 42 (Vicent MartĂ­ 2012-07-11 14:37:26 +0200 48 - * 9c82357b include/git2.h 58 (Carlos MartĂ­n Nieto 2011-06-17 18:13:14 +0200 49 - * d6258deb include/git2.h 61 (Carlos MartĂ­n Nieto 2011-06-25 15:10:09 +0200 50 - * b311e313 include/git2.h 63 (Julien Miotte 2011-07-27 18:31:13 +0200 51 - * 3412391d include/git2.h 63 (Carlos MartĂ­n Nieto 2011-07-07 11:47:31 +0200 52 - * bfc9ca59 include/git2.h 43 (Russell Belfer 2012-03-28 16:45:36 -0700 53 - * bf477ed4 include/git2.h 44 (Michael Schubert 2012-02-15 00:33:38 +0100 54 - * edebceff include/git2.h 46 (nulltoken 2012-05-01 13:57:45 +0200 55 - * 743a4b3b include/git2.h 48 (nulltoken 2012-06-15 22:24:59 +0200 56 - * 0a32dca5 include/git2.h 54 (Michael Schubert 2012-08-19 22:26:32 +0200 57 - * 590fb68b include/git2.h 55 (nulltoken 2012-10-04 13:47:45 +0200 58 - * bf477ed4 include/git2.h 45 (Michael Schubert 2012-02-15 00:33:38 +0100 59 - * d12299fe src/git.h 49 (Vicent MartĂ­ 2010-12-03 22:22:10 +0200 60 - */ -void test_blame_simple__trivial_libgit2(void) -{ - git_blame_options opts = GIT_BLAME_OPTIONS_INIT; - git_object *obj; - - /* If we can't open the libgit2 repo or if it isn't a full repo - * with proper history, just skip this test */ - if (git_repository_open(&g_repo, cl_fixture("../..")) < 0) - cl_skip(); - - if (git_repository_is_shallow(g_repo)) - cl_skip(); - - if (git_revparse_single(&obj, g_repo, "359fc2d") < 0) - cl_skip(); - - git_oid_cpy(&opts.newest_commit, git_object_id(obj)); - git_object_free(obj); - - cl_git_pass(git_blame_file(&g_blame, g_repo, "include/git2.h", &opts)); - - check_blame_hunk_index(g_repo, g_blame, 0, 1, 1, 0, "d12299fe", "src/git.h"); - check_blame_hunk_index(g_repo, g_blame, 1, 2, 1, 0, "359fc2d2", "include/git2.h"); - check_blame_hunk_index(g_repo, g_blame, 2, 3, 1, 0, "d12299fe", "src/git.h"); - check_blame_hunk_index(g_repo, g_blame, 3, 4, 2, 0, "bb742ede", "include/git2.h"); - check_blame_hunk_index(g_repo, g_blame, 4, 6, 5, 0, "d12299fe", "src/git.h"); - check_blame_hunk_index(g_repo, g_blame, 5, 11, 1, 0, "96fab093", "include/git2.h"); - check_blame_hunk_index(g_repo, g_blame, 6, 12, 1, 0, "9d1dcca2", "src/git2.h"); - check_blame_hunk_index(g_repo, g_blame, 7, 13, 1, 0, "44908fe7", "src/git2.h"); - check_blame_hunk_index(g_repo, g_blame, 8, 14, 1, 0, "a15c550d", "include/git2.h"); - check_blame_hunk_index(g_repo, g_blame, 9, 15, 1, 0, "44908fe7", "src/git2.h"); - check_blame_hunk_index(g_repo, g_blame, 10, 16, 1, 0, "d12299fe", "src/git.h"); - check_blame_hunk_index(g_repo, g_blame, 11, 17, 1, 0, "44908fe7", "src/git2.h"); - check_blame_hunk_index(g_repo, g_blame, 12, 18, 1, 0, "d12299fe", "src/git.h"); - check_blame_hunk_index(g_repo, g_blame, 13, 19, 1, 0, "44908fe7", "src/git2.h"); - check_blame_hunk_index(g_repo, g_blame, 14, 20, 1, 0, "638c2ca4", "src/git2.h"); - check_blame_hunk_index(g_repo, g_blame, 15, 21, 1, 0, "44908fe7", "src/git2.h"); - check_blame_hunk_index(g_repo, g_blame, 16, 22, 1, 0, "d12299fe", "src/git.h"); - check_blame_hunk_index(g_repo, g_blame, 17, 23, 2, 0, "44908fe7", "src/git2.h"); - check_blame_hunk_index(g_repo, g_blame, 18, 25, 1, 0, "bf787bd8", "include/git2.h"); - check_blame_hunk_index(g_repo, g_blame, 19, 26, 1, 0, "0984c876", "include/git2.h"); - check_blame_hunk_index(g_repo, g_blame, 20, 27, 1, 0, "2f8a8ab2", "src/git2.h"); - check_blame_hunk_index(g_repo, g_blame, 21, 28, 1, 0, "27df4275", "include/git2.h"); - check_blame_hunk_index(g_repo, g_blame, 22, 29, 1, 0, "a346992f", "include/git2.h"); - check_blame_hunk_index(g_repo, g_blame, 23, 30, 1, 0, "d12299fe", "src/git.h"); - check_blame_hunk_index(g_repo, g_blame, 24, 31, 5, 0, "44908fe7", "src/git2.h"); - check_blame_hunk_index(g_repo, g_blame, 25, 36, 1, 0, "65b09b1d", "include/git2.h"); - check_blame_hunk_index(g_repo, g_blame, 26, 37, 1, 0, "d12299fe", "src/git.h"); - check_blame_hunk_index(g_repo, g_blame, 27, 38, 1, 0, "44908fe7", "src/git2.h"); - check_blame_hunk_index(g_repo, g_blame, 28, 39, 1, 0, "5d4cd003", "include/git2.h"); - check_blame_hunk_index(g_repo, g_blame, 29, 40, 1, 0, "41fb1ca0", "include/git2.h"); - check_blame_hunk_index(g_repo, g_blame, 30, 41, 1, 0, "2dc31040", "include/git2.h"); - check_blame_hunk_index(g_repo, g_blame, 31, 42, 1, 0, "764df57e", "include/git2.h"); - check_blame_hunk_index(g_repo, g_blame, 32, 43, 1, 0, "5280f4e6", "include/git2.h"); - check_blame_hunk_index(g_repo, g_blame, 33, 44, 1, 0, "613d5eb9", "include/git2.h"); - check_blame_hunk_index(g_repo, g_blame, 34, 45, 1, 0, "d12299fe", "src/git.h"); - check_blame_hunk_index(g_repo, g_blame, 35, 46, 1, 0, "111ee3fe", "include/git2.h"); - check_blame_hunk_index(g_repo, g_blame, 36, 47, 1, 0, "f004c4a8", "include/git2.h"); - check_blame_hunk_index(g_repo, g_blame, 37, 48, 1, 0, "111ee3fe", "include/git2.h"); - check_blame_hunk_index(g_repo, g_blame, 38, 49, 1, 0, "9c82357b", "include/git2.h"); - check_blame_hunk_index(g_repo, g_blame, 39, 50, 1, 0, "d6258deb", "include/git2.h"); - check_blame_hunk_index(g_repo, g_blame, 40, 51, 1, 0, "b311e313", "include/git2.h"); - check_blame_hunk_index(g_repo, g_blame, 41, 52, 1, 0, "3412391d", "include/git2.h"); - check_blame_hunk_index(g_repo, g_blame, 42, 53, 1, 0, "bfc9ca59", "include/git2.h"); - check_blame_hunk_index(g_repo, g_blame, 43, 54, 1, 0, "bf477ed4", "include/git2.h"); - check_blame_hunk_index(g_repo, g_blame, 44, 55, 1, 0, "edebceff", "include/git2.h"); - check_blame_hunk_index(g_repo, g_blame, 45, 56, 1, 0, "743a4b3b", "include/git2.h"); - check_blame_hunk_index(g_repo, g_blame, 46, 57, 1, 0, "0a32dca5", "include/git2.h"); - check_blame_hunk_index(g_repo, g_blame, 47, 58, 1, 0, "590fb68b", "include/git2.h"); - check_blame_hunk_index(g_repo, g_blame, 48, 59, 1, 0, "bf477ed4", "include/git2.h"); - check_blame_hunk_index(g_repo, g_blame, 49, 60, 1, 0, "d12299fe", "src/git.h"); -} - - -/* - * $ git blame -n b.txt -L 8 - * orig line no final line no - * commit V author timestamp V - * 63d671eb 8 (Ben Straub 2013-02-12 15:13:04 -0800 8 - * 63d671eb 9 (Ben Straub 2013-02-12 15:13:04 -0800 9 - * 63d671eb 10 (Ben Straub 2013-02-12 15:13:04 -0800 10 - * aa06ecca 6 (Ben Straub 2013-02-12 15:14:46 -0800 11 - * aa06ecca 7 (Ben Straub 2013-02-12 15:14:46 -0800 12 - * aa06ecca 8 (Ben Straub 2013-02-12 15:14:46 -0800 13 - * aa06ecca 9 (Ben Straub 2013-02-12 15:14:46 -0800 14 - * aa06ecca 10 (Ben Straub 2013-02-12 15:14:46 -0800 15 - */ -void test_blame_simple__can_restrict_lines_min(void) -{ - git_blame_options opts = GIT_BLAME_OPTIONS_INIT; - - cl_git_pass(git_repository_open(&g_repo, cl_fixture("blametest.git"))); - - opts.min_line = 8; - cl_git_pass(git_blame_file(&g_blame, g_repo, "b.txt", &opts)); - cl_assert_equal_i(2, git_blame_get_hunk_count(g_blame)); - check_blame_hunk_index(g_repo, g_blame, 0, 8, 3, 0, "63d671eb", "b.txt"); - check_blame_hunk_index(g_repo, g_blame, 1, 11, 5, 0, "aa06ecca", "b.txt"); -} - -/* - * $ git blame -n b.txt -L ,6 - * orig line no final line no - * commit V author timestamp V - * da237394 1 (Ben Straub 2013-02-12 15:11:30 -0800 1 - * da237394 2 (Ben Straub 2013-02-12 15:11:30 -0800 2 - * da237394 3 (Ben Straub 2013-02-12 15:11:30 -0800 3 - * da237394 4 (Ben Straub 2013-02-12 15:11:30 -0800 4 - * ^b99f7ac 1 (Ben Straub 2013-02-12 15:10:12 -0800 5 - * 63d671eb 6 (Ben Straub 2013-02-12 15:13:04 -0800 6 - */ -void test_blame_simple__can_restrict_lines_max(void) -{ - git_blame_options opts = GIT_BLAME_OPTIONS_INIT; - - cl_git_pass(git_repository_open(&g_repo, cl_fixture("blametest.git"))); - - opts.max_line = 6; - cl_git_pass(git_blame_file(&g_blame, g_repo, "b.txt", &opts)); - cl_assert_equal_i(3, git_blame_get_hunk_count(g_blame)); - check_blame_hunk_index(g_repo, g_blame, 0, 1, 4, 0, "da237394", "b.txt"); - check_blame_hunk_index(g_repo, g_blame, 1, 5, 1, 1, "b99f7ac0", "b.txt"); - check_blame_hunk_index(g_repo, g_blame, 2, 6, 1, 0, "63d671eb", "b.txt"); -} - -/* - * $ git blame -n b.txt -L 2,7 - * orig line no final line no - * commit V author timestamp V - * da237394 2 (Ben Straub 2013-02-12 15:11:30 -0800 2 - * da237394 3 (Ben Straub 2013-02-12 15:11:30 -0800 3 - * da237394 4 (Ben Straub 2013-02-12 15:11:30 -0800 4 - * ^b99f7ac 1 (Ben Straub 2013-02-12 15:10:12 -0800 5 - * 63d671eb 6 (Ben Straub 2013-02-12 15:13:04 -0800 6 - * 63d671eb 7 (Ben Straub 2013-02-12 15:13:04 -0800 7 - */ -void test_blame_simple__can_restrict_lines_both(void) -{ - git_blame_options opts = GIT_BLAME_OPTIONS_INIT; - - cl_git_pass(git_repository_open(&g_repo, cl_fixture("blametest.git"))); - - opts.min_line = 2; - opts.max_line = 7; - cl_git_pass(git_blame_file(&g_blame, g_repo, "b.txt", &opts)); - cl_assert_equal_i(3, git_blame_get_hunk_count(g_blame)); - check_blame_hunk_index(g_repo, g_blame, 0, 2, 3, 0, "da237394", "b.txt"); - check_blame_hunk_index(g_repo, g_blame, 1, 5, 1, 1, "b99f7ac0", "b.txt"); - check_blame_hunk_index(g_repo, g_blame, 2, 6, 2, 0, "63d671eb", "b.txt"); -} - -/* - * $ git blame -n branch_file.txt be3563a..HEAD - * orig line no final line no - * commit V author timestamp V - * ^be3563a 1 (Scott Chacon 2010-05-25 11:58:27 -0700 1) hi - * a65fedf3 2 (Scott Chacon 2011-08-09 19:33:46 -0700 2) bye! - */ -void test_blame_simple__can_restrict_to_newish_commits(void) -{ - git_blame_options opts = GIT_BLAME_OPTIONS_INIT; - - cl_git_pass(git_repository_open(&g_repo, cl_fixture("testrepo.git"))); - - { - git_object *obj; - cl_git_pass(git_revparse_single(&obj, g_repo, "be3563a")); - git_oid_cpy(&opts.oldest_commit, git_object_id(obj)); - git_object_free(obj); - } - - cl_git_pass(git_blame_file(&g_blame, g_repo, "branch_file.txt", &opts)); - - cl_assert_equal_i(2, git_blame_get_hunk_count(g_blame)); - check_blame_hunk_index(g_repo, g_blame, 0, 1, 1, 1, "be3563a", "branch_file.txt"); - check_blame_hunk_index(g_repo, g_blame, 1, 2, 1, 0, "a65fedf", "branch_file.txt"); -} - -void test_blame_simple__can_restrict_to_first_parent_commits(void) -{ - git_blame_options opts = GIT_BLAME_OPTIONS_INIT; - opts.flags |= GIT_BLAME_FIRST_PARENT; - - cl_git_pass(git_repository_open(&g_repo, cl_fixture("blametest.git"))); - - cl_git_pass(git_blame_file(&g_blame, g_repo, "b.txt", &opts)); - cl_assert_equal_i(4, git_blame_get_hunk_count(g_blame)); - check_blame_hunk_index(g_repo, g_blame, 0, 1, 4, 0, "da237394", "b.txt"); - check_blame_hunk_index(g_repo, g_blame, 1, 5, 1, 1, "b99f7ac0", "b.txt"); - check_blame_hunk_index(g_repo, g_blame, 2, 6, 5, 0, "63d671eb", "b.txt"); - check_blame_hunk_index(g_repo, g_blame, 3, 11, 5, 0, "bc7c5ac2", "b.txt"); -} diff --git a/vendor/libgit2/tests/buf/basic.c b/vendor/libgit2/tests/buf/basic.c deleted file mode 100644 index 14ea3e7ce8..0000000000 --- a/vendor/libgit2/tests/buf/basic.c +++ /dev/null @@ -1,51 +0,0 @@ -#include "clar_libgit2.h" -#include "buffer.h" - -static const char *test_string = "Have you seen that? Have you seeeen that??"; - -void test_buf_basic__resize(void) -{ - git_buf buf1 = GIT_BUF_INIT; - git_buf_puts(&buf1, test_string); - cl_assert(git_buf_oom(&buf1) == 0); - cl_assert_equal_s(git_buf_cstr(&buf1), test_string); - - git_buf_puts(&buf1, test_string); - cl_assert(strlen(git_buf_cstr(&buf1)) == strlen(test_string) * 2); - git_buf_free(&buf1); -} - -void test_buf_basic__resize_incremental(void) -{ - git_buf buf1 = GIT_BUF_INIT; - - /* Presently, asking for 6 bytes will round up to 8. */ - cl_git_pass(git_buf_puts(&buf1, "Hello")); - cl_assert_equal_i(5, buf1.size); - cl_assert_equal_i(8, buf1.asize); - - /* Ensure an additional byte does not realloc. */ - cl_git_pass(git_buf_grow_by(&buf1, 1)); - cl_assert_equal_i(5, buf1.size); - cl_assert_equal_i(8, buf1.asize); - - /* But requesting many does. */ - cl_git_pass(git_buf_grow_by(&buf1, 16)); - cl_assert_equal_i(5, buf1.size); - cl_assert(buf1.asize > 8); - - git_buf_free(&buf1); -} - -void test_buf_basic__printf(void) -{ - git_buf buf2 = GIT_BUF_INIT; - git_buf_printf(&buf2, "%s %s %d ", "shoop", "da", 23); - cl_assert(git_buf_oom(&buf2) == 0); - cl_assert_equal_s(git_buf_cstr(&buf2), "shoop da 23 "); - - git_buf_printf(&buf2, "%s %d", "woop", 42); - cl_assert(git_buf_oom(&buf2) == 0); - cl_assert_equal_s(git_buf_cstr(&buf2), "shoop da 23 woop 42"); - git_buf_free(&buf2); -} diff --git a/vendor/libgit2/tests/buf/oom.c b/vendor/libgit2/tests/buf/oom.c deleted file mode 100644 index b9fd29cbb0..0000000000 --- a/vendor/libgit2/tests/buf/oom.c +++ /dev/null @@ -1,41 +0,0 @@ -#include "clar_libgit2.h" -#include "buffer.h" - -#if defined(GIT_ARCH_64) -#define TOOBIG 0xffffffffffffff00 -#else -#define TOOBIG 0xffffff00 -#endif - -/** - * If we make a ridiculously large request the first time we - * actually allocate some space in the git_buf, the realloc() - * will fail. And because the git_buf_grow() wrapper always - * sets mark_oom, the code in git_buf_try_grow() will free - * the internal buffer and set it to git_buf__oom. - * - * We initialized the internal buffer to (the static variable) - * git_buf__initbuf. The purpose of this test is to make sure - * that we don't try to free the static buffer. - */ -void test_buf_oom__grow(void) -{ - git_buf buf = GIT_BUF_INIT; - - git_buf_clear(&buf); - - cl_assert(git_buf_grow(&buf, TOOBIG) == -1); - cl_assert(git_buf_oom(&buf)); - - git_buf_free(&buf); -} - -void test_buf_oom__grow_by(void) -{ - git_buf buf = GIT_BUF_INIT; - - buf.size = SIZE_MAX-10; - - cl_assert(git_buf_grow_by(&buf, 50) == -1); - cl_assert(git_buf_oom(&buf)); -} diff --git a/vendor/libgit2/tests/buf/splice.c b/vendor/libgit2/tests/buf/splice.c deleted file mode 100644 index e80c93105b..0000000000 --- a/vendor/libgit2/tests/buf/splice.c +++ /dev/null @@ -1,93 +0,0 @@ -#include "clar_libgit2.h" -#include "buffer.h" - -static git_buf _buf; - -void test_buf_splice__initialize(void) { - git_buf_init(&_buf, 16); -} - -void test_buf_splice__cleanup(void) { - git_buf_free(&_buf); -} - -void test_buf_splice__preprend(void) -{ - git_buf_sets(&_buf, "world!"); - - cl_git_pass(git_buf_splice(&_buf, 0, 0, "Hello Dolly", strlen("Hello "))); - - cl_assert_equal_s("Hello world!", git_buf_cstr(&_buf)); -} - -void test_buf_splice__append(void) -{ - git_buf_sets(&_buf, "Hello"); - - cl_git_pass(git_buf_splice(&_buf, git_buf_len(&_buf), 0, " world!", strlen(" world!"))); - - cl_assert_equal_s("Hello world!", git_buf_cstr(&_buf)); -} - -void test_buf_splice__insert_at(void) -{ - git_buf_sets(&_buf, "Hell world!"); - - cl_git_pass(git_buf_splice(&_buf, strlen("Hell"), 0, "o", strlen("o"))); - - cl_assert_equal_s("Hello world!", git_buf_cstr(&_buf)); -} - -void test_buf_splice__remove_at(void) -{ - git_buf_sets(&_buf, "Hello world of warcraft!"); - - cl_git_pass(git_buf_splice(&_buf, strlen("Hello world"), strlen(" of warcraft"), "", 0)); - - cl_assert_equal_s("Hello world!", git_buf_cstr(&_buf)); -} - -void test_buf_splice__replace(void) -{ - git_buf_sets(&_buf, "Hell0 w0rld!"); - - cl_git_pass(git_buf_splice(&_buf, strlen("Hell"), strlen("0 w0"), "o wo", strlen("o wo"))); - - cl_assert_equal_s("Hello world!", git_buf_cstr(&_buf)); -} - -void test_buf_splice__replace_with_longer(void) -{ - git_buf_sets(&_buf, "Hello you!"); - - cl_git_pass(git_buf_splice(&_buf, strlen("Hello "), strlen("you"), "world", strlen("world"))); - - cl_assert_equal_s("Hello world!", git_buf_cstr(&_buf)); -} - -void test_buf_splice__replace_with_shorter(void) -{ - git_buf_sets(&_buf, "Brave new world!"); - - cl_git_pass(git_buf_splice(&_buf, 0, strlen("Brave new"), "Hello", strlen("Hello"))); - - cl_assert_equal_s("Hello world!", git_buf_cstr(&_buf)); -} - -void test_buf_splice__truncate(void) -{ - git_buf_sets(&_buf, "Hello world!!"); - - cl_git_pass(git_buf_splice(&_buf, strlen("Hello world!"), strlen("!"), "", 0)); - - cl_assert_equal_s("Hello world!", git_buf_cstr(&_buf)); -} - -void test_buf_splice__dont_do_anything(void) -{ - git_buf_sets(&_buf, "Hello world!"); - - cl_git_pass(git_buf_splice(&_buf, 3, 0, "Hello", 0)); - - cl_assert_equal_s("Hello world!", git_buf_cstr(&_buf)); -} diff --git a/vendor/libgit2/tests/checkout/binaryunicode.c b/vendor/libgit2/tests/checkout/binaryunicode.c deleted file mode 100644 index 27e70d3f10..0000000000 --- a/vendor/libgit2/tests/checkout/binaryunicode.c +++ /dev/null @@ -1,58 +0,0 @@ -#include "clar_libgit2.h" -#include "refs.h" -#include "repo/repo_helpers.h" -#include "path.h" -#include "fileops.h" - -static git_repository *g_repo; - -void test_checkout_binaryunicode__initialize(void) -{ - g_repo = cl_git_sandbox_init("binaryunicode"); -} - -void test_checkout_binaryunicode__cleanup(void) -{ - cl_git_sandbox_cleanup(); -} - -static void execute_test(void) -{ - git_oid oid, check; - git_commit *commit; - git_tree *tree; - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - - cl_git_pass(git_reference_name_to_id(&oid, g_repo, "refs/heads/branch1")); - cl_git_pass(git_commit_lookup(&commit, g_repo, &oid)); - cl_git_pass(git_commit_tree(&tree, commit)); - - opts.checkout_strategy = GIT_CHECKOUT_SAFE; - - cl_git_pass(git_checkout_tree(g_repo, (git_object *)tree, &opts)); - - git_tree_free(tree); - git_commit_free(commit); - - /* Verify that the lenna.jpg file was checked out correctly */ - cl_git_pass(git_oid_fromstr(&check, "8ab005d890fe53f65eda14b23672f60d9f4ec5a1")); - cl_git_pass(git_odb_hashfile(&oid, "binaryunicode/lenna.jpg", GIT_OBJ_BLOB)); - cl_assert_equal_oid(&oid, &check); - - /* Verify that the text file was checked out correctly */ - cl_git_pass(git_oid_fromstr(&check, "965b223880dd4249e2c66a0cc0b4cffe1dc40f5a")); - cl_git_pass(git_odb_hashfile(&oid, "binaryunicode/utf16_withbom_noeol_crlf.txt", GIT_OBJ_BLOB)); - cl_assert_equal_oid(&oid, &check); -} - -void test_checkout_binaryunicode__noautocrlf(void) -{ - cl_repo_set_bool(g_repo, "core.autocrlf", false); - execute_test(); -} - -void test_checkout_binaryunicode__autocrlf(void) -{ - cl_repo_set_bool(g_repo, "core.autocrlf", true); - execute_test(); -} diff --git a/vendor/libgit2/tests/checkout/checkout_helpers.c b/vendor/libgit2/tests/checkout/checkout_helpers.c deleted file mode 100644 index 92a454d129..0000000000 --- a/vendor/libgit2/tests/checkout/checkout_helpers.c +++ /dev/null @@ -1,151 +0,0 @@ -#include "clar_libgit2.h" -#include "checkout_helpers.h" -#include "refs.h" -#include "fileops.h" -#include "index.h" - -void assert_on_branch(git_repository *repo, const char *branch) -{ - git_reference *head; - git_buf bname = GIT_BUF_INIT; - - cl_git_pass(git_reference_lookup(&head, repo, GIT_HEAD_FILE)); - cl_assert_(git_reference_type(head) == GIT_REF_SYMBOLIC, branch); - - cl_git_pass(git_buf_joinpath(&bname, "refs/heads", branch)); - cl_assert_equal_s(bname.ptr, git_reference_symbolic_target(head)); - - git_reference_free(head); - git_buf_free(&bname); -} - -void reset_index_to_treeish(git_object *treeish) -{ - git_object *tree; - git_index *index; - git_repository *repo = git_object_owner(treeish); - - cl_git_pass(git_object_peel(&tree, treeish, GIT_OBJ_TREE)); - - cl_git_pass(git_repository_index(&index, repo)); - cl_git_pass(git_index_read_tree(index, (git_tree *)tree)); - cl_git_pass(git_index_write(index)); - - git_object_free(tree); - git_index_free(index); -} - -int checkout_count_callback( - git_checkout_notify_t why, - const char *path, - const git_diff_file *baseline, - const git_diff_file *target, - const git_diff_file *workdir, - void *payload) -{ - checkout_counts *ct = payload; - - GIT_UNUSED(baseline); GIT_UNUSED(target); GIT_UNUSED(workdir); - - if (why & GIT_CHECKOUT_NOTIFY_CONFLICT) { - ct->n_conflicts++; - - if (ct->debug) { - if (workdir) { - if (baseline) { - if (target) - fprintf(stderr, "M %s (conflicts with M %s)\n", - workdir->path, target->path); - else - fprintf(stderr, "M %s (conflicts with D %s)\n", - workdir->path, baseline->path); - } else { - if (target) - fprintf(stderr, "Existing %s (conflicts with A %s)\n", - workdir->path, target->path); - else - fprintf(stderr, "How can an untracked file be a conflict (%s)\n", workdir->path); - } - } else { - if (baseline) { - if (target) - fprintf(stderr, "D %s (conflicts with M %s)\n", - target->path, baseline->path); - else - fprintf(stderr, "D %s (conflicts with D %s)\n", - baseline->path, baseline->path); - } else { - if (target) - fprintf(stderr, "How can an added file with no workdir be a conflict (%s)\n", target->path); - else - fprintf(stderr, "How can a nonexistent file be a conflict (%s)\n", path); - } - } - } - } - - if (why & GIT_CHECKOUT_NOTIFY_DIRTY) { - ct->n_dirty++; - - if (ct->debug) { - if (workdir) - fprintf(stderr, "M %s\n", workdir->path); - else - fprintf(stderr, "D %s\n", baseline->path); - } - } - - if (why & GIT_CHECKOUT_NOTIFY_UPDATED) { - ct->n_updates++; - - if (ct->debug) { - if (baseline) { - if (target) - fprintf(stderr, "update: M %s\n", path); - else - fprintf(stderr, "update: D %s\n", path); - } else { - if (target) - fprintf(stderr, "update: A %s\n", path); - else - fprintf(stderr, "update: this makes no sense %s\n", path); - } - } - } - - if (why & GIT_CHECKOUT_NOTIFY_UNTRACKED) { - ct->n_untracked++; - - if (ct->debug) - fprintf(stderr, "? %s\n", path); - } - - if (why & GIT_CHECKOUT_NOTIFY_IGNORED) { - ct->n_ignored++; - - if (ct->debug) - fprintf(stderr, "I %s\n", path); - } - - return 0; -} - -void tick_index(git_index *index) -{ - git_time_t ts; - struct timeval times[2]; - - cl_assert(index->on_disk); - cl_assert(git_index_path(index)); - - cl_git_pass(git_index_read(index, true)); - ts = index->stamp.mtime; - - times[0].tv_sec = ts; - times[0].tv_usec = 0; - times[1].tv_sec = ts + 5; - times[1].tv_usec = 0; - - cl_git_pass(p_utimes(git_index_path(index), times)); - cl_git_pass(git_index_read(index, true)); -} diff --git a/vendor/libgit2/tests/checkout/checkout_helpers.h b/vendor/libgit2/tests/checkout/checkout_helpers.h deleted file mode 100644 index 6058a196c7..0000000000 --- a/vendor/libgit2/tests/checkout/checkout_helpers.h +++ /dev/null @@ -1,31 +0,0 @@ -#include "buffer.h" -#include "git2/object.h" -#include "git2/repository.h" - -extern void assert_on_branch(git_repository *repo, const char *branch); -extern void reset_index_to_treeish(git_object *treeish); - -#define check_file_contents(PATH,EXP) \ - cl_assert_equal_file(EXP,0,PATH) - -#define check_file_contents_nocr(PATH,EXP) \ - cl_assert_equal_file_ignore_cr(EXP,0,PATH) - -typedef struct { - int n_conflicts; - int n_dirty; - int n_updates; - int n_untracked; - int n_ignored; - int debug; -} checkout_counts; - -extern int checkout_count_callback( - git_checkout_notify_t why, - const char *path, - const git_diff_file *baseline, - const git_diff_file *target, - const git_diff_file *workdir, - void *payload); - -extern void tick_index(git_index *index); diff --git a/vendor/libgit2/tests/checkout/conflict.c b/vendor/libgit2/tests/checkout/conflict.c deleted file mode 100644 index dd2dd3131d..0000000000 --- a/vendor/libgit2/tests/checkout/conflict.c +++ /dev/null @@ -1,1137 +0,0 @@ -#include "clar_libgit2.h" -#include "git2/repository.h" -#include "git2/sys/index.h" -#include "fileops.h" - -static git_repository *g_repo; -static git_index *g_index; - -#define TEST_REPO_PATH "merge-resolve" - -#define CONFLICTING_ANCESTOR_OID "d427e0b2e138501a3d15cc376077a3631e15bd46" -#define CONFLICTING_OURS_OID "4e886e602529caa9ab11d71f86634bd1b6e0de10" -#define CONFLICTING_THEIRS_OID "2bd0a343aeef7a2cf0d158478966a6e587ff3863" - -#define AUTOMERGEABLE_ANCESTOR_OID "6212c31dab5e482247d7977e4f0dd3601decf13b" -#define AUTOMERGEABLE_OURS_OID "ee3fa1b8c00aff7fe02065fdb50864bb0d932ccf" -#define AUTOMERGEABLE_THEIRS_OID "058541fc37114bfc1dddf6bd6bffc7fae5c2e6fe" - -#define LINK_ANCESTOR_OID "1a010b1c0f081b2e8901d55307a15c29ff30af0e" -#define LINK_OURS_OID "72ea499e108df5ff0a4a913e7655bbeeb1fb69f2" -#define LINK_THEIRS_OID "8bfb012a6d809e499bd8d3e194a3929bc8995b93" - -#define LINK_ANCESTOR_TARGET "file" -#define LINK_OURS_TARGET "other-file" -#define LINK_THEIRS_TARGET "still-another-file" - -#define CONFLICTING_OURS_FILE \ - "this file is changed in master and branch\n" -#define CONFLICTING_THEIRS_FILE \ - "this file is changed in branch and master\n" -#define CONFLICTING_DIFF3_FILE \ - "<<<<<<< ours\n" \ - "this file is changed in master and branch\n" \ - "=======\n" \ - "this file is changed in branch and master\n" \ - ">>>>>>> theirs\n" - -#define AUTOMERGEABLE_MERGED_FILE \ - "this file is changed in master\n" \ - "this file is automergeable\n" \ - "this file is automergeable\n" \ - "this file is automergeable\n" \ - "this file is automergeable\n" \ - "this file is automergeable\n" \ - "this file is automergeable\n" \ - "this file is automergeable\n" \ - "this file is changed in branch\n" - -struct checkout_index_entry { - uint16_t mode; - char oid_str[GIT_OID_HEXSZ+1]; - int stage; - char path[128]; -}; - -struct checkout_name_entry { - char ancestor[64]; - char ours[64]; - char theirs[64]; -}; - -void test_checkout_conflict__initialize(void) -{ - git_config *cfg; - - g_repo = cl_git_sandbox_init(TEST_REPO_PATH); - git_repository_index(&g_index, g_repo); - - cl_git_rewritefile( - TEST_REPO_PATH "/.gitattributes", - "* text eol=lf\n"); - - /* Ensure that the user's merge.conflictstyle doesn't interfere */ - cl_git_pass(git_repository_config(&cfg, g_repo)); - cl_git_pass(git_config_set_string(cfg, "merge.conflictstyle", "merge")); - git_config_free(cfg); -} - -void test_checkout_conflict__cleanup(void) -{ - git_index_free(g_index); - cl_git_sandbox_cleanup(); -} - -static void create_index(struct checkout_index_entry *entries, size_t entries_len) -{ - git_buf path = GIT_BUF_INIT; - size_t i; - - for (i = 0; i < entries_len; i++) { - git_buf_joinpath(&path, TEST_REPO_PATH, entries[i].path); - - if (entries[i].stage == 3 && (i == 0 || strcmp(entries[i-1].path, entries[i].path) != 0 || entries[i-1].stage != 2)) - p_unlink(git_buf_cstr(&path)); - - git_index_remove_bypath(g_index, entries[i].path); - } - - for (i = 0; i < entries_len; i++) { - git_index_entry entry; - - memset(&entry, 0x0, sizeof(git_index_entry)); - - entry.mode = entries[i].mode; - GIT_IDXENTRY_STAGE_SET(&entry, entries[i].stage); - git_oid_fromstr(&entry.id, entries[i].oid_str); - entry.path = entries[i].path; - - cl_git_pass(git_index_add(g_index, &entry)); - } - - git_buf_free(&path); -} - -static void create_index_names(struct checkout_name_entry *entries, size_t entries_len) -{ - size_t i; - - for (i = 0; i < entries_len; i++) { - cl_git_pass(git_index_name_add(g_index, - strlen(entries[i].ancestor) == 0 ? NULL : entries[i].ancestor, - strlen(entries[i].ours) == 0 ? NULL : entries[i].ours, - strlen(entries[i].theirs) == 0 ? NULL : entries[i].theirs)); - } -} - -static void create_conflicting_index(void) -{ - struct checkout_index_entry checkout_index_entries[] = { - { 0100644, CONFLICTING_ANCESTOR_OID, 1, "conflicting.txt" }, - { 0100644, CONFLICTING_OURS_OID, 2, "conflicting.txt" }, - { 0100644, CONFLICTING_THEIRS_OID, 3, "conflicting.txt" }, - }; - - create_index(checkout_index_entries, 3); - git_index_write(g_index); -} - -static void ensure_workdir_contents(const char *path, const char *contents) -{ - git_buf fullpath = GIT_BUF_INIT, data_buf = GIT_BUF_INIT; - - cl_git_pass( - git_buf_joinpath(&fullpath, git_repository_workdir(g_repo), path)); - - cl_git_pass(git_futils_readbuffer(&data_buf, git_buf_cstr(&fullpath))); - cl_assert(strcmp(git_buf_cstr(&data_buf), contents) == 0); - - git_buf_free(&fullpath); - git_buf_free(&data_buf); -} - -static void ensure_workdir_oid(const char *path, const char *oid_str) -{ - git_oid expected, actual; - - cl_git_pass(git_oid_fromstr(&expected, oid_str)); - cl_git_pass(git_repository_hashfile(&actual, g_repo, path, GIT_OBJ_BLOB, NULL)); - cl_assert_equal_oid(&expected, &actual); -} - -static void ensure_workdir_mode(const char *path, int mode) -{ -#ifdef GIT_WIN32 - GIT_UNUSED(path); - GIT_UNUSED(mode); -#else - git_buf fullpath = GIT_BUF_INIT; - struct stat st; - - cl_git_pass( - git_buf_joinpath(&fullpath, git_repository_workdir(g_repo), path)); - - cl_git_pass(p_stat(git_buf_cstr(&fullpath), &st)); - cl_assert_equal_i((mode & S_IRWXU), (st.st_mode & S_IRWXU)); - - git_buf_free(&fullpath); -#endif -} - -static void ensure_workdir(const char *path, int mode, const char *oid_str) -{ - ensure_workdir_mode(path, mode); - ensure_workdir_oid(path, oid_str); -} - -static void ensure_workdir_link(const char *path, const char *target) -{ -#ifdef GIT_WIN32 - ensure_workdir_contents(path, target); -#else - git_buf fullpath = GIT_BUF_INIT; - char actual[1024]; - struct stat st; - int len; - - cl_git_pass( - git_buf_joinpath(&fullpath, git_repository_workdir(g_repo), path)); - - cl_git_pass(p_lstat(git_buf_cstr(&fullpath), &st)); - cl_assert(S_ISLNK(st.st_mode)); - - cl_assert((len = p_readlink(git_buf_cstr(&fullpath), actual, 1024)) > 0); - actual[len] = '\0'; - cl_assert(strcmp(actual, target) == 0); - - git_buf_free(&fullpath); -#endif -} - -void test_checkout_conflict__ignored(void) -{ - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - - opts.checkout_strategy |= GIT_CHECKOUT_SKIP_UNMERGED; - - create_conflicting_index(); - cl_git_pass(p_unlink(TEST_REPO_PATH "/conflicting.txt")); - - cl_git_pass(git_checkout_index(g_repo, g_index, &opts)); - - cl_assert(!git_path_exists(TEST_REPO_PATH "/conflicting.txt")); -} - -void test_checkout_conflict__ours(void) -{ - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - - opts.checkout_strategy |= GIT_CHECKOUT_USE_OURS; - - create_conflicting_index(); - - cl_git_pass(git_checkout_index(g_repo, g_index, &opts)); - - ensure_workdir_contents("conflicting.txt", CONFLICTING_OURS_FILE); -} - -void test_checkout_conflict__theirs(void) -{ - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - - opts.checkout_strategy |= GIT_CHECKOUT_USE_THEIRS; - - create_conflicting_index(); - - cl_git_pass(git_checkout_index(g_repo, g_index, &opts)); - - ensure_workdir_contents("conflicting.txt", CONFLICTING_THEIRS_FILE); - -} - -void test_checkout_conflict__diff3(void) -{ - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - - create_conflicting_index(); - - cl_git_pass(git_checkout_index(g_repo, g_index, &opts)); - - ensure_workdir_contents("conflicting.txt", CONFLICTING_DIFF3_FILE); -} - -void test_checkout_conflict__automerge(void) -{ - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - - struct checkout_index_entry checkout_index_entries[] = { - { 0100644, AUTOMERGEABLE_ANCESTOR_OID, 1, "automergeable.txt" }, - { 0100644, AUTOMERGEABLE_OURS_OID, 2, "automergeable.txt" }, - { 0100644, AUTOMERGEABLE_THEIRS_OID, 3, "automergeable.txt" }, - }; - - create_index(checkout_index_entries, 3); - git_index_write(g_index); - - cl_git_pass(git_checkout_index(g_repo, g_index, &opts)); - - ensure_workdir_contents("automergeable.txt", AUTOMERGEABLE_MERGED_FILE); -} - -void test_checkout_conflict__directory_file(void) -{ - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - - struct checkout_index_entry checkout_index_entries[] = { - { 0100644, CONFLICTING_ANCESTOR_OID, 1, "df-1" }, - { 0100644, CONFLICTING_OURS_OID, 2, "df-1" }, - { 0100644, CONFLICTING_THEIRS_OID, 0, "df-1/file" }, - - { 0100644, CONFLICTING_ANCESTOR_OID, 1, "df-2" }, - { 0100644, CONFLICTING_THEIRS_OID, 3, "df-2" }, - { 0100644, CONFLICTING_OURS_OID, 0, "df-2/file" }, - - { 0100644, CONFLICTING_THEIRS_OID, 3, "df-3" }, - { 0100644, CONFLICTING_ANCESTOR_OID, 1, "df-3/file" }, - { 0100644, CONFLICTING_OURS_OID, 2, "df-3/file" }, - - { 0100644, CONFLICTING_OURS_OID, 2, "df-4" }, - { 0100644, CONFLICTING_ANCESTOR_OID, 1, "df-4/file" }, - { 0100644, CONFLICTING_THEIRS_OID, 3, "df-4/file" }, - }; - - opts.checkout_strategy |= GIT_CHECKOUT_SAFE; - - create_index(checkout_index_entries, 12); - git_index_write(g_index); - - cl_git_pass(git_checkout_index(g_repo, g_index, &opts)); - - ensure_workdir_oid("df-1/file", CONFLICTING_THEIRS_OID); - ensure_workdir_oid("df-1~ours", CONFLICTING_OURS_OID); - ensure_workdir_oid("df-2/file", CONFLICTING_OURS_OID); - ensure_workdir_oid("df-2~theirs", CONFLICTING_THEIRS_OID); - ensure_workdir_oid("df-3/file", CONFLICTING_OURS_OID); - ensure_workdir_oid("df-3~theirs", CONFLICTING_THEIRS_OID); - ensure_workdir_oid("df-4~ours", CONFLICTING_OURS_OID); - ensure_workdir_oid("df-4/file", CONFLICTING_THEIRS_OID); -} - -void test_checkout_conflict__directory_file_with_custom_labels(void) -{ - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - - struct checkout_index_entry checkout_index_entries[] = { - { 0100644, CONFLICTING_ANCESTOR_OID, 1, "df-1" }, - { 0100644, CONFLICTING_OURS_OID, 2, "df-1" }, - { 0100644, CONFLICTING_THEIRS_OID, 0, "df-1/file" }, - - { 0100644, CONFLICTING_ANCESTOR_OID, 1, "df-2" }, - { 0100644, CONFLICTING_THEIRS_OID, 3, "df-2" }, - { 0100644, CONFLICTING_OURS_OID, 0, "df-2/file" }, - - { 0100644, CONFLICTING_THEIRS_OID, 3, "df-3" }, - { 0100644, CONFLICTING_ANCESTOR_OID, 1, "df-3/file" }, - { 0100644, CONFLICTING_OURS_OID, 2, "df-3/file" }, - - { 0100644, CONFLICTING_OURS_OID, 2, "df-4" }, - { 0100644, CONFLICTING_ANCESTOR_OID, 1, "df-4/file" }, - { 0100644, CONFLICTING_THEIRS_OID, 3, "df-4/file" }, - }; - - opts.checkout_strategy |= GIT_CHECKOUT_SAFE; - opts.our_label = "HEAD"; - opts.their_label = "branch"; - - create_index(checkout_index_entries, 12); - git_index_write(g_index); - - cl_git_pass(git_checkout_index(g_repo, g_index, &opts)); - - ensure_workdir_oid("df-1/file", CONFLICTING_THEIRS_OID); - ensure_workdir_oid("df-1~HEAD", CONFLICTING_OURS_OID); - ensure_workdir_oid("df-2/file", CONFLICTING_OURS_OID); - ensure_workdir_oid("df-2~branch", CONFLICTING_THEIRS_OID); - ensure_workdir_oid("df-3/file", CONFLICTING_OURS_OID); - ensure_workdir_oid("df-3~branch", CONFLICTING_THEIRS_OID); - ensure_workdir_oid("df-4~HEAD", CONFLICTING_OURS_OID); - ensure_workdir_oid("df-4/file", CONFLICTING_THEIRS_OID); -} - -void test_checkout_conflict__link_file(void) -{ - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - - struct checkout_index_entry checkout_index_entries[] = { - { 0100644, CONFLICTING_ANCESTOR_OID, 1, "link-1" }, - { 0100644, CONFLICTING_OURS_OID, 2, "link-1" }, - { 0120000, LINK_THEIRS_OID, 3, "link-1" }, - - { 0100644, CONFLICTING_ANCESTOR_OID, 1, "link-2" }, - { 0120000, LINK_OURS_OID, 2, "link-2" }, - { 0100644, CONFLICTING_THEIRS_OID, 3, "link-2" }, - - { 0120000, LINK_ANCESTOR_OID, 1, "link-3" }, - { 0100644, CONFLICTING_OURS_OID, 2, "link-3" }, - { 0120000, LINK_THEIRS_OID, 3, "link-3" }, - - { 0120000, LINK_ANCESTOR_OID, 1, "link-4" }, - { 0120000, LINK_OURS_OID, 2, "link-4" }, - { 0100644, CONFLICTING_THEIRS_OID, 3, "link-4" }, - }; - - opts.checkout_strategy |= GIT_CHECKOUT_SAFE; - - create_index(checkout_index_entries, 12); - git_index_write(g_index); - - cl_git_pass(git_checkout_index(g_repo, g_index, &opts)); - - /* Typechange conflicts always keep the file in the workdir */ - ensure_workdir_oid("link-1", CONFLICTING_OURS_OID); - ensure_workdir_oid("link-2", CONFLICTING_THEIRS_OID); - ensure_workdir_oid("link-3", CONFLICTING_OURS_OID); - ensure_workdir_oid("link-4", CONFLICTING_THEIRS_OID); -} - -void test_checkout_conflict__links(void) -{ - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - - struct checkout_index_entry checkout_index_entries[] = { - { 0120000, LINK_ANCESTOR_OID, 1, "link-1" }, - { 0120000, LINK_OURS_OID, 2, "link-1" }, - { 0120000, LINK_THEIRS_OID, 3, "link-1" }, - - { 0120000, LINK_OURS_OID, 2, "link-2" }, - { 0120000, LINK_THEIRS_OID, 3, "link-2" }, - }; - - opts.checkout_strategy |= GIT_CHECKOUT_SAFE; - - create_index(checkout_index_entries, 5); - git_index_write(g_index); - - cl_git_pass(git_checkout_index(g_repo, g_index, &opts)); - - /* Conflicts with links always keep the ours side (even with -Xtheirs) */ - ensure_workdir_link("link-1", LINK_OURS_TARGET); - ensure_workdir_link("link-2", LINK_OURS_TARGET); -} - -void test_checkout_conflict__add_add(void) -{ - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - - struct checkout_index_entry checkout_index_entries[] = { - { 0100644, CONFLICTING_OURS_OID, 2, "conflicting.txt" }, - { 0100644, CONFLICTING_THEIRS_OID, 3, "conflicting.txt" }, - }; - - opts.checkout_strategy |= GIT_CHECKOUT_SAFE; - - create_index(checkout_index_entries, 2); - git_index_write(g_index); - - cl_git_pass(git_checkout_index(g_repo, g_index, &opts)); - - /* Add/add writes diff3 files */ - ensure_workdir_contents("conflicting.txt", CONFLICTING_DIFF3_FILE); -} - -void test_checkout_conflict__mode_change(void) -{ - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - - struct checkout_index_entry checkout_index_entries[] = { - { 0100644, CONFLICTING_ANCESTOR_OID, 1, "executable-1" }, - { 0100755, CONFLICTING_ANCESTOR_OID, 2, "executable-1" }, - { 0100644, CONFLICTING_THEIRS_OID, 3, "executable-1" }, - - { 0100644, CONFLICTING_ANCESTOR_OID, 1, "executable-2" }, - { 0100644, CONFLICTING_OURS_OID, 2, "executable-2" }, - { 0100755, CONFLICTING_ANCESTOR_OID, 3, "executable-2" }, - - { 0100755, CONFLICTING_ANCESTOR_OID, 1, "executable-3" }, - { 0100644, CONFLICTING_ANCESTOR_OID, 2, "executable-3" }, - { 0100755, CONFLICTING_THEIRS_OID, 3, "executable-3" }, - - { 0100755, CONFLICTING_ANCESTOR_OID, 1, "executable-4" }, - { 0100755, CONFLICTING_OURS_OID, 2, "executable-4" }, - { 0100644, CONFLICTING_ANCESTOR_OID, 3, "executable-4" }, - - { 0100644, CONFLICTING_ANCESTOR_OID, 1, "executable-5" }, - { 0100755, CONFLICTING_OURS_OID, 2, "executable-5" }, - { 0100644, CONFLICTING_THEIRS_OID, 3, "executable-5" }, - - { 0100755, CONFLICTING_ANCESTOR_OID, 1, "executable-6" }, - { 0100644, CONFLICTING_OURS_OID, 2, "executable-6" }, - { 0100755, CONFLICTING_THEIRS_OID, 3, "executable-6" }, - }; - - opts.checkout_strategy |= GIT_CHECKOUT_SAFE; - - create_index(checkout_index_entries, 18); - git_index_write(g_index); - - cl_git_pass(git_checkout_index(g_repo, g_index, &opts)); - - /* Keep the modified mode */ - ensure_workdir_oid("executable-1", CONFLICTING_THEIRS_OID); - ensure_workdir_mode("executable-1", 0100755); - - ensure_workdir_oid("executable-2", CONFLICTING_OURS_OID); - ensure_workdir_mode("executable-2", 0100755); - - ensure_workdir_oid("executable-3", CONFLICTING_THEIRS_OID); - ensure_workdir_mode("executable-3", 0100644); - - ensure_workdir_oid("executable-4", CONFLICTING_OURS_OID); - ensure_workdir_mode("executable-4", 0100644); - - ensure_workdir_contents("executable-5", CONFLICTING_DIFF3_FILE); - ensure_workdir_mode("executable-5", 0100755); - - ensure_workdir_contents("executable-6", CONFLICTING_DIFF3_FILE); - ensure_workdir_mode("executable-6", 0100644); -} - -void test_checkout_conflict__renames(void) -{ - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - - struct checkout_index_entry checkout_index_entries[] = { - { 0100644, "68c6c84b091926c7d90aa6a79b2bc3bb6adccd8e", 0, "0a-no-change.txt" }, - { 0100644, "f0ce2b8e4986084d9b308fb72709e414c23eb5e6", 0, "0b-duplicated-in-ours.txt" }, - { 0100644, "f0ce2b8e4986084d9b308fb72709e414c23eb5e6", 1, "0b-rewritten-in-ours.txt" }, - { 0100644, "e376fbdd06ebf021c92724da9f26f44212734e3e", 2, "0b-rewritten-in-ours.txt" }, - { 0100644, "b2d399ae15224e1d58066e3c8df70ce37de7a656", 3, "0b-rewritten-in-ours.txt" }, - { 0100644, "2f56120107d680129a5d9791b521cb1e73a2ed31", 0, "0c-duplicated-in-theirs.txt" }, - { 0100644, "2f56120107d680129a5d9791b521cb1e73a2ed31", 1, "0c-rewritten-in-theirs.txt" }, - { 0100644, "efc9121fdedaf08ba180b53ebfbcf71bd488ed09", 2, "0c-rewritten-in-theirs.txt" }, - { 0100644, "712ebba6669ea847d9829e4f1059d6c830c8b531", 3, "0c-rewritten-in-theirs.txt" }, - { 0100644, "0d872f8e871a30208305978ecbf9e66d864f1638", 0, "1a-newname-in-ours-edited-in-theirs.txt" }, - { 0100644, "d0d4594e16f2e19107e3fa7ea63e7aaaff305ffb", 0, "1a-newname-in-ours.txt" }, - { 0100644, "ed9523e62e453e50dd9be1606af19399b96e397a", 0, "1b-newname-in-theirs-edited-in-ours.txt" }, - { 0100644, "2b5f1f181ee3b58ea751f5dd5d8f9b445520a136", 0, "1b-newname-in-theirs.txt" }, - { 0100644, "178940b450f238a56c0d75b7955cb57b38191982", 0, "2-newname-in-both.txt" }, - { 0100644, "18cb316b1cefa0f8a6946f0e201a8e1a6f845ab9", 2, "3a-newname-in-ours-deleted-in-theirs.txt" }, - { 0100644, "18cb316b1cefa0f8a6946f0e201a8e1a6f845ab9", 1, "3a-renamed-in-ours-deleted-in-theirs.txt" }, - { 0100644, "36219b49367146cb2e6a1555b5a9ebd4d0328495", 3, "3b-newname-in-theirs-deleted-in-ours.txt" }, - { 0100644, "36219b49367146cb2e6a1555b5a9ebd4d0328495", 1, "3b-renamed-in-theirs-deleted-in-ours.txt" }, - { 0100644, "227792b52aaa0b238bea00ec7e509b02623f168c", 2, "4a-newname-in-ours-added-in-theirs.txt" }, - { 0100644, "8b5b53cb2aa9ceb1139f5312fcfa3cc3c5a47c9a", 3, "4a-newname-in-ours-added-in-theirs.txt" }, - { 0100644, "227792b52aaa0b238bea00ec7e509b02623f168c", 1, "4a-renamed-in-ours-added-in-theirs.txt" }, - { 0100644, "de872ee3618b894992e9d1e18ba2ebe256a112f9", 2, "4b-newname-in-theirs-added-in-ours.txt" }, - { 0100644, "98d52d07c0b0bbf2b46548f6aa521295c2cb55db", 3, "4b-newname-in-theirs-added-in-ours.txt" }, - { 0100644, "98d52d07c0b0bbf2b46548f6aa521295c2cb55db", 1, "4b-renamed-in-theirs-added-in-ours.txt" }, - { 0100644, "d3719a5ae8e4d92276b5313ce976f6ee5af2b436", 2, "5a-newname-in-ours-added-in-theirs.txt" }, - { 0100644, "98ba4205fcf31f5dd93c916d35fe3f3b3d0e6714", 3, "5a-newname-in-ours-added-in-theirs.txt" }, - { 0100644, "d3719a5ae8e4d92276b5313ce976f6ee5af2b436", 1, "5a-renamed-in-ours-added-in-theirs.txt" }, - { 0100644, "d3719a5ae8e4d92276b5313ce976f6ee5af2b436", 3, "5a-renamed-in-ours-added-in-theirs.txt" }, - { 0100644, "385c8a0f26ddf79e9041e15e17dc352ed2c4cced", 2, "5b-newname-in-theirs-added-in-ours.txt" }, - { 0100644, "63247125386de9ec90a27ad36169307bf8a11a38", 3, "5b-newname-in-theirs-added-in-ours.txt" }, - { 0100644, "63247125386de9ec90a27ad36169307bf8a11a38", 1, "5b-renamed-in-theirs-added-in-ours.txt" }, - { 0100644, "63247125386de9ec90a27ad36169307bf8a11a38", 2, "5b-renamed-in-theirs-added-in-ours.txt" }, - { 0100644, "d8fa77b6833082c1ea36b7828a582d4c43882450", 2, "6-both-renamed-1-to-2-ours.txt" }, - { 0100644, "d8fa77b6833082c1ea36b7828a582d4c43882450", 3, "6-both-renamed-1-to-2-theirs.txt" }, - { 0100644, "d8fa77b6833082c1ea36b7828a582d4c43882450", 1, "6-both-renamed-1-to-2.txt" }, - { 0100644, "b42712cfe99a1a500b2a51fe984e0b8a7702ba11", 1, "7-both-renamed-side-1.txt" }, - { 0100644, "b42712cfe99a1a500b2a51fe984e0b8a7702ba11", 3, "7-both-renamed-side-1.txt" }, - { 0100644, "b69fe837e4cecfd4c9a40cdca7c138468687df07", 1, "7-both-renamed-side-2.txt" }, - { 0100644, "b69fe837e4cecfd4c9a40cdca7c138468687df07", 2, "7-both-renamed-side-2.txt" }, - { 0100644, "b42712cfe99a1a500b2a51fe984e0b8a7702ba11", 2, "7-both-renamed.txt" }, - { 0100644, "b69fe837e4cecfd4c9a40cdca7c138468687df07", 3, "7-both-renamed.txt" } - }; - - struct checkout_name_entry checkout_name_entries[] = { - { - "3a-renamed-in-ours-deleted-in-theirs.txt", - "3a-newname-in-ours-deleted-in-theirs.txt", - "" - }, - - { - "3b-renamed-in-theirs-deleted-in-ours.txt", - "", - "3b-newname-in-theirs-deleted-in-ours.txt" - }, - - { - "4a-renamed-in-ours-added-in-theirs.txt", - "4a-newname-in-ours-added-in-theirs.txt", - "" - }, - - { - "4b-renamed-in-theirs-added-in-ours.txt", - "", - "4b-newname-in-theirs-added-in-ours.txt" - }, - - { - "5a-renamed-in-ours-added-in-theirs.txt", - "5a-newname-in-ours-added-in-theirs.txt", - "5a-renamed-in-ours-added-in-theirs.txt" - }, - - { - "5b-renamed-in-theirs-added-in-ours.txt", - "5b-renamed-in-theirs-added-in-ours.txt", - "5b-newname-in-theirs-added-in-ours.txt" - }, - - { - "6-both-renamed-1-to-2.txt", - "6-both-renamed-1-to-2-ours.txt", - "6-both-renamed-1-to-2-theirs.txt" - }, - - { - "7-both-renamed-side-1.txt", - "7-both-renamed.txt", - "7-both-renamed-side-1.txt" - }, - - { - "7-both-renamed-side-2.txt", - "7-both-renamed-side-2.txt", - "7-both-renamed.txt" - } - }; - - opts.checkout_strategy |= GIT_CHECKOUT_SAFE; - - create_index(checkout_index_entries, 41); - create_index_names(checkout_name_entries, 9); - git_index_write(g_index); - - cl_git_pass(git_checkout_index(g_repo, g_index, &opts)); - - ensure_workdir("0a-no-change.txt", - 0100644, "68c6c84b091926c7d90aa6a79b2bc3bb6adccd8e"); - - ensure_workdir("0b-duplicated-in-ours.txt", - 0100644, "f0ce2b8e4986084d9b308fb72709e414c23eb5e6"); - - ensure_workdir("0b-rewritten-in-ours.txt", - 0100644, "4c7e515d6d52d820496858f2f059ece69e99e2e3"); - - ensure_workdir("0c-duplicated-in-theirs.txt", - 0100644, "2f56120107d680129a5d9791b521cb1e73a2ed31"); - - ensure_workdir("0c-rewritten-in-theirs.txt", - 0100644, "4648d658682d1155c2a3db5b0c53305e26884ea5"); - - ensure_workdir("1a-newname-in-ours-edited-in-theirs.txt", - 0100644, "0d872f8e871a30208305978ecbf9e66d864f1638"); - - ensure_workdir("1a-newname-in-ours.txt", - 0100644, "d0d4594e16f2e19107e3fa7ea63e7aaaff305ffb"); - - ensure_workdir("1b-newname-in-theirs-edited-in-ours.txt", - 0100644, "ed9523e62e453e50dd9be1606af19399b96e397a"); - - ensure_workdir("1b-newname-in-theirs.txt", - 0100644, "2b5f1f181ee3b58ea751f5dd5d8f9b445520a136"); - - ensure_workdir("2-newname-in-both.txt", - 0100644, "178940b450f238a56c0d75b7955cb57b38191982"); - - ensure_workdir("3a-newname-in-ours-deleted-in-theirs.txt", - 0100644, "18cb316b1cefa0f8a6946f0e201a8e1a6f845ab9"); - - ensure_workdir("3b-newname-in-theirs-deleted-in-ours.txt", - 0100644, "36219b49367146cb2e6a1555b5a9ebd4d0328495"); - - ensure_workdir("4a-newname-in-ours-added-in-theirs.txt~ours", - 0100644, "227792b52aaa0b238bea00ec7e509b02623f168c"); - - ensure_workdir("4a-newname-in-ours-added-in-theirs.txt~theirs", - 0100644, "8b5b53cb2aa9ceb1139f5312fcfa3cc3c5a47c9a"); - - ensure_workdir("4b-newname-in-theirs-added-in-ours.txt~ours", - 0100644, "de872ee3618b894992e9d1e18ba2ebe256a112f9"); - - ensure_workdir("4b-newname-in-theirs-added-in-ours.txt~theirs", - 0100644, "98d52d07c0b0bbf2b46548f6aa521295c2cb55db"); - - ensure_workdir("5a-newname-in-ours-added-in-theirs.txt~ours", - 0100644, "d3719a5ae8e4d92276b5313ce976f6ee5af2b436"); - - ensure_workdir("5a-newname-in-ours-added-in-theirs.txt~theirs", - 0100644, "98ba4205fcf31f5dd93c916d35fe3f3b3d0e6714"); - - ensure_workdir("5b-newname-in-theirs-added-in-ours.txt~ours", - 0100644, "385c8a0f26ddf79e9041e15e17dc352ed2c4cced"); - - ensure_workdir("5b-newname-in-theirs-added-in-ours.txt~theirs", - 0100644, "63247125386de9ec90a27ad36169307bf8a11a38"); - - ensure_workdir("6-both-renamed-1-to-2-ours.txt", - 0100644, "d8fa77b6833082c1ea36b7828a582d4c43882450"); - - ensure_workdir("6-both-renamed-1-to-2-theirs.txt", - 0100644, "d8fa77b6833082c1ea36b7828a582d4c43882450"); - - ensure_workdir("7-both-renamed.txt~ours", - 0100644, "b42712cfe99a1a500b2a51fe984e0b8a7702ba11"); - - ensure_workdir("7-both-renamed.txt~theirs", - 0100644, "b69fe837e4cecfd4c9a40cdca7c138468687df07"); -} - -void test_checkout_conflict__rename_keep_ours(void) -{ - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - - struct checkout_index_entry checkout_index_entries[] = { - { 0100644, "68c6c84b091926c7d90aa6a79b2bc3bb6adccd8e", 0, "0a-no-change.txt" }, - { 0100644, "f0ce2b8e4986084d9b308fb72709e414c23eb5e6", 0, "0b-duplicated-in-ours.txt" }, - { 0100644, "f0ce2b8e4986084d9b308fb72709e414c23eb5e6", 1, "0b-rewritten-in-ours.txt" }, - { 0100644, "e376fbdd06ebf021c92724da9f26f44212734e3e", 2, "0b-rewritten-in-ours.txt" }, - { 0100644, "b2d399ae15224e1d58066e3c8df70ce37de7a656", 3, "0b-rewritten-in-ours.txt" }, - { 0100644, "2f56120107d680129a5d9791b521cb1e73a2ed31", 0, "0c-duplicated-in-theirs.txt" }, - { 0100644, "2f56120107d680129a5d9791b521cb1e73a2ed31", 1, "0c-rewritten-in-theirs.txt" }, - { 0100644, "efc9121fdedaf08ba180b53ebfbcf71bd488ed09", 2, "0c-rewritten-in-theirs.txt" }, - { 0100644, "712ebba6669ea847d9829e4f1059d6c830c8b531", 3, "0c-rewritten-in-theirs.txt" }, - { 0100644, "0d872f8e871a30208305978ecbf9e66d864f1638", 0, "1a-newname-in-ours-edited-in-theirs.txt" }, - { 0100644, "d0d4594e16f2e19107e3fa7ea63e7aaaff305ffb", 0, "1a-newname-in-ours.txt" }, - { 0100644, "ed9523e62e453e50dd9be1606af19399b96e397a", 0, "1b-newname-in-theirs-edited-in-ours.txt" }, - { 0100644, "2b5f1f181ee3b58ea751f5dd5d8f9b445520a136", 0, "1b-newname-in-theirs.txt" }, - { 0100644, "178940b450f238a56c0d75b7955cb57b38191982", 0, "2-newname-in-both.txt" }, - { 0100644, "18cb316b1cefa0f8a6946f0e201a8e1a6f845ab9", 2, "3a-newname-in-ours-deleted-in-theirs.txt" }, - { 0100644, "18cb316b1cefa0f8a6946f0e201a8e1a6f845ab9", 1, "3a-renamed-in-ours-deleted-in-theirs.txt" }, - { 0100644, "36219b49367146cb2e6a1555b5a9ebd4d0328495", 3, "3b-newname-in-theirs-deleted-in-ours.txt" }, - { 0100644, "36219b49367146cb2e6a1555b5a9ebd4d0328495", 1, "3b-renamed-in-theirs-deleted-in-ours.txt" }, - { 0100644, "227792b52aaa0b238bea00ec7e509b02623f168c", 2, "4a-newname-in-ours-added-in-theirs.txt" }, - { 0100644, "8b5b53cb2aa9ceb1139f5312fcfa3cc3c5a47c9a", 3, "4a-newname-in-ours-added-in-theirs.txt" }, - { 0100644, "227792b52aaa0b238bea00ec7e509b02623f168c", 1, "4a-renamed-in-ours-added-in-theirs.txt" }, - { 0100644, "de872ee3618b894992e9d1e18ba2ebe256a112f9", 2, "4b-newname-in-theirs-added-in-ours.txt" }, - { 0100644, "98d52d07c0b0bbf2b46548f6aa521295c2cb55db", 3, "4b-newname-in-theirs-added-in-ours.txt" }, - { 0100644, "98d52d07c0b0bbf2b46548f6aa521295c2cb55db", 1, "4b-renamed-in-theirs-added-in-ours.txt" }, - { 0100644, "d3719a5ae8e4d92276b5313ce976f6ee5af2b436", 2, "5a-newname-in-ours-added-in-theirs.txt" }, - { 0100644, "98ba4205fcf31f5dd93c916d35fe3f3b3d0e6714", 3, "5a-newname-in-ours-added-in-theirs.txt" }, - { 0100644, "d3719a5ae8e4d92276b5313ce976f6ee5af2b436", 1, "5a-renamed-in-ours-added-in-theirs.txt" }, - { 0100644, "d3719a5ae8e4d92276b5313ce976f6ee5af2b436", 3, "5a-renamed-in-ours-added-in-theirs.txt" }, - { 0100644, "385c8a0f26ddf79e9041e15e17dc352ed2c4cced", 2, "5b-newname-in-theirs-added-in-ours.txt" }, - { 0100644, "63247125386de9ec90a27ad36169307bf8a11a38", 3, "5b-newname-in-theirs-added-in-ours.txt" }, - { 0100644, "63247125386de9ec90a27ad36169307bf8a11a38", 1, "5b-renamed-in-theirs-added-in-ours.txt" }, - { 0100644, "63247125386de9ec90a27ad36169307bf8a11a38", 2, "5b-renamed-in-theirs-added-in-ours.txt" }, - { 0100644, "d8fa77b6833082c1ea36b7828a582d4c43882450", 2, "6-both-renamed-1-to-2-ours.txt" }, - { 0100644, "d8fa77b6833082c1ea36b7828a582d4c43882450", 3, "6-both-renamed-1-to-2-theirs.txt" }, - { 0100644, "d8fa77b6833082c1ea36b7828a582d4c43882450", 1, "6-both-renamed-1-to-2.txt" }, - { 0100644, "b42712cfe99a1a500b2a51fe984e0b8a7702ba11", 1, "7-both-renamed-side-1.txt" }, - { 0100644, "b42712cfe99a1a500b2a51fe984e0b8a7702ba11", 3, "7-both-renamed-side-1.txt" }, - { 0100644, "b69fe837e4cecfd4c9a40cdca7c138468687df07", 1, "7-both-renamed-side-2.txt" }, - { 0100644, "b69fe837e4cecfd4c9a40cdca7c138468687df07", 2, "7-both-renamed-side-2.txt" }, - { 0100644, "b42712cfe99a1a500b2a51fe984e0b8a7702ba11", 2, "7-both-renamed.txt" }, - { 0100644, "b69fe837e4cecfd4c9a40cdca7c138468687df07", 3, "7-both-renamed.txt" } - }; - - struct checkout_name_entry checkout_name_entries[] = { - { - "3a-renamed-in-ours-deleted-in-theirs.txt", - "3a-newname-in-ours-deleted-in-theirs.txt", - "" - }, - - { - "3b-renamed-in-theirs-deleted-in-ours.txt", - "", - "3b-newname-in-theirs-deleted-in-ours.txt" - }, - - { - "4a-renamed-in-ours-added-in-theirs.txt", - "4a-newname-in-ours-added-in-theirs.txt", - "" - }, - - { - "4b-renamed-in-theirs-added-in-ours.txt", - "", - "4b-newname-in-theirs-added-in-ours.txt" - }, - - { - "5a-renamed-in-ours-added-in-theirs.txt", - "5a-newname-in-ours-added-in-theirs.txt", - "5a-renamed-in-ours-added-in-theirs.txt" - }, - - { - "5b-renamed-in-theirs-added-in-ours.txt", - "5b-renamed-in-theirs-added-in-ours.txt", - "5b-newname-in-theirs-added-in-ours.txt" - }, - - { - "6-both-renamed-1-to-2.txt", - "6-both-renamed-1-to-2-ours.txt", - "6-both-renamed-1-to-2-theirs.txt" - }, - - { - "7-both-renamed-side-1.txt", - "7-both-renamed.txt", - "7-both-renamed-side-1.txt" - }, - - { - "7-both-renamed-side-2.txt", - "7-both-renamed-side-2.txt", - "7-both-renamed.txt" - } - }; - - opts.checkout_strategy |= GIT_CHECKOUT_SAFE | GIT_CHECKOUT_USE_OURS; - - create_index(checkout_index_entries, 41); - create_index_names(checkout_name_entries, 9); - git_index_write(g_index); - - cl_git_pass(git_checkout_index(g_repo, g_index, &opts)); - - ensure_workdir("0a-no-change.txt", - 0100644, "68c6c84b091926c7d90aa6a79b2bc3bb6adccd8e"); - - ensure_workdir("0b-duplicated-in-ours.txt", - 0100644, "f0ce2b8e4986084d9b308fb72709e414c23eb5e6"); - - ensure_workdir("0b-rewritten-in-ours.txt", - 0100644, "e376fbdd06ebf021c92724da9f26f44212734e3e"); - - ensure_workdir("0c-duplicated-in-theirs.txt", - 0100644, "2f56120107d680129a5d9791b521cb1e73a2ed31"); - - ensure_workdir("0c-rewritten-in-theirs.txt", - 0100644, "efc9121fdedaf08ba180b53ebfbcf71bd488ed09"); - - ensure_workdir("1a-newname-in-ours-edited-in-theirs.txt", - 0100644, "0d872f8e871a30208305978ecbf9e66d864f1638"); - - ensure_workdir("1a-newname-in-ours.txt", - 0100644, "d0d4594e16f2e19107e3fa7ea63e7aaaff305ffb"); - - ensure_workdir("1b-newname-in-theirs-edited-in-ours.txt", - 0100644, "ed9523e62e453e50dd9be1606af19399b96e397a"); - - ensure_workdir("1b-newname-in-theirs.txt", - 0100644, "2b5f1f181ee3b58ea751f5dd5d8f9b445520a136"); - - ensure_workdir("2-newname-in-both.txt", - 0100644, "178940b450f238a56c0d75b7955cb57b38191982"); - - ensure_workdir("3a-newname-in-ours-deleted-in-theirs.txt", - 0100644, "18cb316b1cefa0f8a6946f0e201a8e1a6f845ab9"); - - ensure_workdir("3b-newname-in-theirs-deleted-in-ours.txt", - 0100644, "36219b49367146cb2e6a1555b5a9ebd4d0328495"); - - ensure_workdir("4a-newname-in-ours-added-in-theirs.txt", - 0100644, "227792b52aaa0b238bea00ec7e509b02623f168c"); - - ensure_workdir("4b-newname-in-theirs-added-in-ours.txt", - 0100644, "de872ee3618b894992e9d1e18ba2ebe256a112f9"); - - ensure_workdir("5a-newname-in-ours-added-in-theirs.txt", - 0100644, "d3719a5ae8e4d92276b5313ce976f6ee5af2b436"); - - ensure_workdir("5b-newname-in-theirs-added-in-ours.txt", - 0100644, "385c8a0f26ddf79e9041e15e17dc352ed2c4cced"); - - ensure_workdir("6-both-renamed-1-to-2-ours.txt", - 0100644, "d8fa77b6833082c1ea36b7828a582d4c43882450"); - - ensure_workdir("7-both-renamed.txt", - 0100644, "b42712cfe99a1a500b2a51fe984e0b8a7702ba11"); -} - -void test_checkout_conflict__name_mangled_file_exists_in_workdir(void) -{ - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - - struct checkout_index_entry checkout_index_entries[] = { - { 0100644, "b42712cfe99a1a500b2a51fe984e0b8a7702ba11", 1, "test-one-side-one.txt" }, - { 0100644, "b42712cfe99a1a500b2a51fe984e0b8a7702ba11", 3, "test-one-side-one.txt" }, - { 0100644, "b69fe837e4cecfd4c9a40cdca7c138468687df07", 1, "test-one-side-two.txt" }, - { 0100644, "b69fe837e4cecfd4c9a40cdca7c138468687df07", 2, "test-one-side-two.txt" }, - { 0100644, "b42712cfe99a1a500b2a51fe984e0b8a7702ba11", 2, "test-one.txt" }, - { 0100644, "b69fe837e4cecfd4c9a40cdca7c138468687df07", 3, "test-one.txt" }, - - { 0100644, "b42712cfe99a1a500b2a51fe984e0b8a7702ba11", 1, "test-two-side-one.txt" }, - { 0100644, "b42712cfe99a1a500b2a51fe984e0b8a7702ba11", 3, "test-two-side-one.txt" }, - { 0100644, "b69fe837e4cecfd4c9a40cdca7c138468687df07", 1, "test-two-side-two.txt" }, - { 0100644, "b69fe837e4cecfd4c9a40cdca7c138468687df07", 2, "test-two-side-two.txt" }, - { 0100644, "b42712cfe99a1a500b2a51fe984e0b8a7702ba11", 2, "test-two.txt" }, - { 0100644, "b69fe837e4cecfd4c9a40cdca7c138468687df07", 3, "test-two.txt" }, - - { 0100644, "b42712cfe99a1a500b2a51fe984e0b8a7702ba11", 1, "test-three-side-one.txt" }, - { 0100644, "b42712cfe99a1a500b2a51fe984e0b8a7702ba11", 3, "test-three-side-one.txt" }, - { 0100644, "b69fe837e4cecfd4c9a40cdca7c138468687df07", 1, "test-three-side-two.txt" }, - { 0100644, "b69fe837e4cecfd4c9a40cdca7c138468687df07", 2, "test-three-side-two.txt" }, - { 0100644, "b42712cfe99a1a500b2a51fe984e0b8a7702ba11", 2, "test-three.txt" }, - { 0100644, "b69fe837e4cecfd4c9a40cdca7c138468687df07", 3, "test-three.txt" }, - - { 0100644, CONFLICTING_ANCESTOR_OID, 1, "directory_file-one" }, - { 0100644, CONFLICTING_OURS_OID, 2, "directory_file-one" }, - { 0100644, CONFLICTING_THEIRS_OID, 0, "directory_file-one/file" }, - - { 0100644, CONFLICTING_ANCESTOR_OID, 1, "directory_file-two" }, - { 0100644, CONFLICTING_OURS_OID, 0, "directory_file-two/file" }, - { 0100644, CONFLICTING_THEIRS_OID, 3, "directory_file-two" }, - }; - - struct checkout_name_entry checkout_name_entries[] = { - { - "test-one-side-one.txt", - "test-one.txt", - "test-one-side-one.txt" - }, - { - "test-one-side-two.txt", - "test-one-side-two.txt", - "test-one.txt" - }, - - { - "test-two-side-one.txt", - "test-two.txt", - "test-two-side-one.txt" - }, - { - "test-two-side-two.txt", - "test-two-side-two.txt", - "test-two.txt" - }, - - { - "test-three-side-one.txt", - "test-three.txt", - "test-three-side-one.txt" - }, - { - "test-three-side-two.txt", - "test-three-side-two.txt", - "test-three.txt" - } - }; - - opts.checkout_strategy |= GIT_CHECKOUT_SAFE; - - create_index(checkout_index_entries, 24); - create_index_names(checkout_name_entries, 6); - git_index_write(g_index); - - /* Add some files on disk that conflict with the names that would be chosen - * for the files written for each side. */ - - cl_git_rewritefile("merge-resolve/test-one.txt~ours", - "Expect index contents to be written to ~ours_0"); - cl_git_rewritefile("merge-resolve/test-one.txt~theirs", - "Expect index contents to be written to ~theirs_0"); - - cl_git_rewritefile("merge-resolve/test-two.txt~ours", - "Expect index contents to be written to ~ours_3"); - cl_git_rewritefile("merge-resolve/test-two.txt~theirs", - "Expect index contents to be written to ~theirs_3"); - cl_git_rewritefile("merge-resolve/test-two.txt~ours_0", - "Expect index contents to be written to ~ours_3"); - cl_git_rewritefile("merge-resolve/test-two.txt~theirs_0", - "Expect index contents to be written to ~theirs_3"); - cl_git_rewritefile("merge-resolve/test-two.txt~ours_1", - "Expect index contents to be written to ~ours_3"); - cl_git_rewritefile("merge-resolve/test-two.txt~theirs_1", - "Expect index contents to be written to ~theirs_3"); - cl_git_rewritefile("merge-resolve/test-two.txt~ours_2", - "Expect index contents to be written to ~ours_3"); - cl_git_rewritefile("merge-resolve/test-two.txt~theirs_2", - "Expect index contents to be written to ~theirs_3"); - - cl_git_rewritefile("merge-resolve/test-three.txt~Ours", - "Expect case insensitive filesystems to create ~ours_0"); - cl_git_rewritefile("merge-resolve/test-three.txt~THEIRS", - "Expect case insensitive filesystems to create ~theirs_0"); - - cl_git_rewritefile("merge-resolve/directory_file-one~ours", - "Index contents written to ~ours_0 in this D/F conflict"); - cl_git_rewritefile("merge-resolve/directory_file-two~theirs", - "Index contents written to ~theirs_0 in this D/F conflict"); - - cl_git_pass(git_checkout_index(g_repo, g_index, &opts)); - - ensure_workdir("test-one.txt~ours_0", - 0100644, "b42712cfe99a1a500b2a51fe984e0b8a7702ba11"); - ensure_workdir("test-one.txt~theirs_0", - 0100644, "b69fe837e4cecfd4c9a40cdca7c138468687df07"); - - ensure_workdir("test-two.txt~ours_3", - 0100644, "b42712cfe99a1a500b2a51fe984e0b8a7702ba11"); - ensure_workdir("test-two.txt~theirs_3", - 0100644, "b69fe837e4cecfd4c9a40cdca7c138468687df07"); - - /* Name is mangled on case insensitive only */ -#if defined(GIT_WIN32) || defined(__APPLE__) - ensure_workdir("test-three.txt~ours_0", - 0100644, "b42712cfe99a1a500b2a51fe984e0b8a7702ba11"); - ensure_workdir("test-three.txt~theirs_0", - 0100644, "b69fe837e4cecfd4c9a40cdca7c138468687df07"); -#else - ensure_workdir("test-three.txt~ours", - 0100644, "b42712cfe99a1a500b2a51fe984e0b8a7702ba11"); - ensure_workdir("test-three.txt~theirs", - 0100644, "b69fe837e4cecfd4c9a40cdca7c138468687df07"); -#endif - - ensure_workdir("directory_file-one~ours_0", 0100644, CONFLICTING_OURS_OID); - ensure_workdir("directory_file-two~theirs_0", 0100644, CONFLICTING_THEIRS_OID); -} - -void test_checkout_conflict__update_only(void) -{ - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - - struct checkout_index_entry checkout_index_entries[] = { - { 0100644, AUTOMERGEABLE_ANCESTOR_OID, 1, "automergeable.txt" }, - { 0100644, AUTOMERGEABLE_OURS_OID, 2, "automergeable.txt" }, - { 0100644, AUTOMERGEABLE_THEIRS_OID, 3, "automergeable.txt" }, - - { 0100644, CONFLICTING_ANCESTOR_OID, 1, "modify-delete" }, - { 0100644, CONFLICTING_THEIRS_OID, 3, "modify-delete" }, - - { 0100644, CONFLICTING_ANCESTOR_OID, 1, "directory_file-one" }, - { 0100644, CONFLICTING_OURS_OID, 2, "directory_file-one" }, - { 0100644, CONFLICTING_THEIRS_OID, 0, "directory_file-one/file" }, - - { 0100644, CONFLICTING_ANCESTOR_OID, 1, "directory_file-two" }, - { 0100644, CONFLICTING_OURS_OID, 0, "directory_file-two/file" }, - { 0100644, CONFLICTING_THEIRS_OID, 3, "directory_file-two" }, - }; - - opts.checkout_strategy |= GIT_CHECKOUT_UPDATE_ONLY; - - create_index(checkout_index_entries, 3); - git_index_write(g_index); - - cl_git_pass(p_mkdir("merge-resolve/directory_file-two", 0777)); - cl_git_rewritefile("merge-resolve/directory_file-two/file", CONFLICTING_OURS_FILE); - - cl_git_pass(git_checkout_index(g_repo, g_index, &opts)); - - ensure_workdir_contents("automergeable.txt", AUTOMERGEABLE_MERGED_FILE); - ensure_workdir("directory_file-two/file", 0100644, CONFLICTING_OURS_OID); - - cl_assert(!git_path_exists("merge-resolve/modify-delete")); - cl_assert(!git_path_exists("merge-resolve/test-one.txt")); - cl_assert(!git_path_exists("merge-resolve/test-one-side-one.txt")); - cl_assert(!git_path_exists("merge-resolve/test-one-side-two.txt")); - cl_assert(!git_path_exists("merge-resolve/test-one.txt~ours")); - cl_assert(!git_path_exists("merge-resolve/test-one.txt~theirs")); - cl_assert(!git_path_exists("merge-resolve/directory_file-one/file")); - cl_assert(!git_path_exists("merge-resolve/directory_file-one~ours")); - cl_assert(!git_path_exists("merge-resolve/directory_file-two~theirs")); -} - -void test_checkout_conflict__path_filters(void) -{ - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - char *paths[] = { "conflicting-1.txt", "conflicting-3.txt" }; - git_strarray patharray = {0}; - - struct checkout_index_entry checkout_index_entries[] = { - { 0100644, CONFLICTING_ANCESTOR_OID, 1, "conflicting-1.txt" }, - { 0100644, CONFLICTING_OURS_OID, 2, "conflicting-1.txt" }, - { 0100644, CONFLICTING_THEIRS_OID, 3, "conflicting-1.txt" }, - - { 0100644, CONFLICTING_ANCESTOR_OID, 1, "conflicting-2.txt" }, - { 0100644, CONFLICTING_OURS_OID, 2, "conflicting-2.txt" }, - { 0100644, CONFLICTING_THEIRS_OID, 3, "conflicting-2.txt" }, - - { 0100644, AUTOMERGEABLE_ANCESTOR_OID, 1, "conflicting-3.txt" }, - { 0100644, AUTOMERGEABLE_OURS_OID, 2, "conflicting-3.txt" }, - { 0100644, AUTOMERGEABLE_THEIRS_OID, 3, "conflicting-3.txt" }, - - { 0100644, AUTOMERGEABLE_ANCESTOR_OID, 1, "conflicting-4.txt" }, - { 0100644, AUTOMERGEABLE_OURS_OID, 2, "conflicting-4.txt" }, - { 0100644, AUTOMERGEABLE_THEIRS_OID, 3, "conflicting-4.txt" }, - }; - - patharray.count = 2; - patharray.strings = paths; - - opts.paths = patharray; - - create_index(checkout_index_entries, 12); - git_index_write(g_index); - - cl_git_pass(git_checkout_index(g_repo, g_index, &opts)); - - ensure_workdir_contents("conflicting-1.txt", CONFLICTING_DIFF3_FILE); - cl_assert(!git_path_exists("merge-resolve/conflicting-2.txt")); - ensure_workdir_contents("conflicting-3.txt", AUTOMERGEABLE_MERGED_FILE); - cl_assert(!git_path_exists("merge-resolve/conflicting-4.txt")); -} - -static void collect_progress( - const char *path, - size_t completed_steps, - size_t total_steps, - void *payload) -{ - git_vector *paths = payload; - - GIT_UNUSED(completed_steps); - GIT_UNUSED(total_steps); - - if (path == NULL) - return; - - git_vector_insert(paths, strdup(path)); -} - -void test_checkout_conflict__report_progress(void) -{ - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - git_vector paths = GIT_VECTOR_INIT; - char *path; - size_t i; - - struct checkout_index_entry checkout_index_entries[] = { - { 0100644, CONFLICTING_ANCESTOR_OID, 1, "conflicting-1.txt" }, - { 0100644, CONFLICTING_OURS_OID, 2, "conflicting-1.txt" }, - { 0100644, CONFLICTING_THEIRS_OID, 3, "conflicting-1.txt" }, - - { 0100644, CONFLICTING_ANCESTOR_OID, 1, "conflicting-2.txt" }, - { 0100644, CONFLICTING_OURS_OID, 2, "conflicting-2.txt" }, - { 0100644, CONFLICTING_THEIRS_OID, 3, "conflicting-2.txt" }, - - { 0100644, AUTOMERGEABLE_ANCESTOR_OID, 1, "conflicting-3.txt" }, - { 0100644, AUTOMERGEABLE_OURS_OID, 2, "conflicting-3.txt" }, - { 0100644, AUTOMERGEABLE_THEIRS_OID, 3, "conflicting-3.txt" }, - - { 0100644, AUTOMERGEABLE_ANCESTOR_OID, 1, "conflicting-4.txt" }, - { 0100644, AUTOMERGEABLE_OURS_OID, 2, "conflicting-4.txt" }, - { 0100644, AUTOMERGEABLE_THEIRS_OID, 3, "conflicting-4.txt" }, - }; - - opts.progress_cb = collect_progress; - opts.progress_payload = &paths; - - - create_index(checkout_index_entries, 12); - git_index_write(g_index); - - cl_git_pass(git_checkout_index(g_repo, g_index, &opts)); - - cl_assert_equal_i(4, git_vector_length(&paths)); - cl_assert_equal_s("conflicting-1.txt", git_vector_get(&paths, 0)); - cl_assert_equal_s("conflicting-2.txt", git_vector_get(&paths, 1)); - cl_assert_equal_s("conflicting-3.txt", git_vector_get(&paths, 2)); - cl_assert_equal_s("conflicting-4.txt", git_vector_get(&paths, 3)); - - git_vector_foreach(&paths, i, path) - git__free(path); - - git_vector_free(&paths); -} diff --git a/vendor/libgit2/tests/checkout/crlf.c b/vendor/libgit2/tests/checkout/crlf.c deleted file mode 100644 index 8e77d08454..0000000000 --- a/vendor/libgit2/tests/checkout/crlf.c +++ /dev/null @@ -1,463 +0,0 @@ -#include "clar_libgit2.h" -#include "checkout_helpers.h" -#include "../filter/crlf.h" -#include "fileops.h" - -#include "git2/checkout.h" -#include "repository.h" -#include "index.h" -#include "posix.h" - -static git_repository *g_repo; - -static const char *systype; -static git_buf expected_fixture = GIT_BUF_INIT; - -void test_checkout_crlf__initialize(void) -{ - g_repo = cl_git_sandbox_init("crlf"); - - if (GIT_EOL_NATIVE == GIT_EOL_CRLF) - systype = "windows"; - else - systype = "posix"; -} - -void test_checkout_crlf__cleanup(void) -{ - cl_git_sandbox_cleanup(); - - if (expected_fixture.size) { - cl_fixture_cleanup(expected_fixture.ptr); - git_buf_free(&expected_fixture); - } -} - -struct compare_data -{ - const char *dirname; - const char *autocrlf; - const char *attrs; -}; - -static int compare_file(void *payload, git_buf *actual_path) -{ - git_buf expected_path = GIT_BUF_INIT; - git_buf actual_contents = GIT_BUF_INIT; - git_buf expected_contents = GIT_BUF_INIT; - struct compare_data *cd = payload; - bool failed = true; - int cmp_git, cmp_gitattributes; - char *basename; - - basename = git_path_basename(actual_path->ptr); - cmp_git = strcmp(basename, ".git"); - cmp_gitattributes = strcmp(basename, ".gitattributes"); - - if (cmp_git == 0 || cmp_gitattributes == 0) { - failed = false; - goto done; - } - - cl_git_pass(git_buf_joinpath(&expected_path, cd->dirname, basename)); - - if (!git_path_isfile(expected_path.ptr) || - !git_path_isfile(actual_path->ptr)) - goto done; - - if (git_futils_readbuffer(&actual_contents, actual_path->ptr) < 0 || - git_futils_readbuffer(&expected_contents, expected_path.ptr) < 0) - goto done; - - if (actual_contents.size != expected_contents.size) - goto done; - - if (memcmp(actual_contents.ptr, expected_contents.ptr, expected_contents.size) != 0) - goto done; - - failed = false; - -done: - if (failed) { - git_buf details = GIT_BUF_INIT; - git_buf_printf(&details, "filename=%s, system=%s, autocrlf=%s, attrs={%s}", - git_path_basename(actual_path->ptr), systype, cd->autocrlf, cd->attrs); - clar__fail(__FILE__, __LINE__, - "checked out contents did not match expected", details.ptr, 0); - git_buf_free(&details); - } - - git__free(basename); - git_buf_free(&expected_contents); - git_buf_free(&actual_contents); - git_buf_free(&expected_path); - - return 0; -} - -static void test_checkout(const char *autocrlf, const char *attrs) -{ - git_buf attrbuf = GIT_BUF_INIT; - git_buf expected_dirname = GIT_BUF_INIT; - git_buf sandboxname = GIT_BUF_INIT; - git_buf reponame = GIT_BUF_INIT; - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - struct compare_data compare_data = { NULL, autocrlf, attrs }; - const char *c; - - git_buf_puts(&reponame, "crlf"); - - git_buf_puts(&sandboxname, "autocrlf_"); - git_buf_puts(&sandboxname, autocrlf); - - if (*attrs) { - git_buf_puts(&sandboxname, ","); - - for (c = attrs; *c; c++) { - if (*c == ' ') - git_buf_putc(&sandboxname, ','); - else if (*c == '=') - git_buf_putc(&sandboxname, '_'); - else - git_buf_putc(&sandboxname, *c); - } - - git_buf_printf(&attrbuf, "* %s\n", attrs); - cl_git_mkfile("crlf/.gitattributes", attrbuf.ptr); - } - - cl_repo_set_string(g_repo, "core.autocrlf", autocrlf); - - git_buf_joinpath(&expected_dirname, systype, sandboxname.ptr); - git_buf_joinpath(&expected_fixture, "crlf_data", expected_dirname.ptr); - cl_fixture_sandbox(expected_fixture.ptr); - - opts.checkout_strategy = GIT_CHECKOUT_FORCE; - git_checkout_head(g_repo, &opts); - - compare_data.dirname = sandboxname.ptr; - cl_git_pass(git_path_direach(&reponame, 0, compare_file, &compare_data)); - - cl_fixture_cleanup(expected_fixture.ptr); - git_buf_free(&expected_fixture); - - git_buf_free(&attrbuf); - git_buf_free(&expected_fixture); - git_buf_free(&expected_dirname); - git_buf_free(&sandboxname); - git_buf_free(&reponame); -} - -static void empty_workdir(const char *name) -{ - git_vector contents = GIT_VECTOR_INIT; - size_t i; - const char *fn; - - git_path_dirload(&contents, name, 0, 0); - git_vector_foreach(&contents, i, fn) { - char *basename = git_path_basename(fn); - int cmp = strncasecmp(basename, ".git", 4); - - git__free(basename); - - if (cmp == 0) - continue; - p_unlink(fn); - } - git_vector_free_deep(&contents); -} - -void test_checkout_crlf__matches_core_git(void) -{ - const char *autocrlf[] = { "true", "false", "input", NULL }; - const char *attrs[] = { "", "-crlf", "-text", "eol=crlf", "eol=lf", - "text", "text eol=crlf", "text eol=lf", - "text=auto", "text=auto eol=crlf", "text=auto eol=lf", - NULL }; - const char **a, **b; - - for (a = autocrlf; *a; a++) { - for (b = attrs; *b; b++) { - empty_workdir("crlf"); - test_checkout(*a, *b); - } - } -} - -void test_checkout_crlf__detect_crlf_autocrlf_false(void) -{ - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - opts.checkout_strategy = GIT_CHECKOUT_FORCE; - - cl_repo_set_bool(g_repo, "core.autocrlf", false); - - git_checkout_head(g_repo, &opts); - - check_file_contents("./crlf/all-lf", ALL_LF_TEXT_RAW); - check_file_contents("./crlf/all-crlf", ALL_CRLF_TEXT_RAW); -} - -void test_checkout_crlf__autocrlf_false_index_size_is_unfiltered_size(void) -{ - git_index *index; - const git_index_entry *entry; - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - opts.checkout_strategy = GIT_CHECKOUT_FORCE; - - cl_repo_set_bool(g_repo, "core.autocrlf", false); - - git_repository_index(&index, g_repo); - tick_index(index); - - git_checkout_head(g_repo, &opts); - - cl_assert((entry = git_index_get_bypath(index, "all-lf", 0)) != NULL); - cl_assert(entry->file_size == strlen(ALL_LF_TEXT_RAW)); - - cl_assert((entry = git_index_get_bypath(index, "all-crlf", 0)) != NULL); - cl_assert(entry->file_size == strlen(ALL_CRLF_TEXT_RAW)); - - git_index_free(index); -} - -void test_checkout_crlf__detect_crlf_autocrlf_true(void) -{ - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - opts.checkout_strategy = GIT_CHECKOUT_FORCE; - - cl_repo_set_bool(g_repo, "core.autocrlf", true); - - git_checkout_head(g_repo, &opts); - - check_file_contents("./crlf/all-lf", ALL_LF_TEXT_AS_CRLF); - check_file_contents("./crlf/all-crlf", ALL_CRLF_TEXT_RAW); -} - -void test_checkout_crlf__detect_crlf_autocrlf_true_utf8(void) -{ - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - opts.checkout_strategy = GIT_CHECKOUT_FORCE; - - cl_repo_set_bool(g_repo, "core.autocrlf", true); - - git_repository_set_head(g_repo, "refs/heads/master"); - git_checkout_head(g_repo, &opts); - - check_file_contents("./crlf/few-utf8-chars-lf", FEW_UTF8_CRLF_RAW); - check_file_contents("./crlf/many-utf8-chars-lf", MANY_UTF8_CRLF_RAW); - - check_file_contents("./crlf/few-utf8-chars-crlf", FEW_UTF8_CRLF_RAW); - check_file_contents("./crlf/many-utf8-chars-crlf", MANY_UTF8_CRLF_RAW); -} - -void test_checkout_crlf__autocrlf_true_index_size_is_filtered_size(void) -{ - git_index *index; - const git_index_entry *entry; - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - opts.checkout_strategy = GIT_CHECKOUT_FORCE; - - cl_repo_set_bool(g_repo, "core.autocrlf", true); - - git_repository_index(&index, g_repo); - tick_index(index); - - git_checkout_head(g_repo, &opts); - - cl_assert((entry = git_index_get_bypath(index, "all-lf", 0)) != NULL); - - cl_assert_equal_sz(strlen(ALL_LF_TEXT_AS_CRLF), entry->file_size); - - cl_assert((entry = git_index_get_bypath(index, "all-crlf", 0)) != NULL); - cl_assert_equal_sz(strlen(ALL_CRLF_TEXT_RAW), entry->file_size); - - git_index_free(index); -} - -void test_checkout_crlf__with_ident(void) -{ - git_index *index; - git_blob *blob; - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - opts.checkout_strategy = GIT_CHECKOUT_FORCE; - - cl_git_mkfile("crlf/.gitattributes", - "*.txt text\n*.bin binary\n" - "*.crlf text eol=crlf\n" - "*.lf text eol=lf\n" - "*.ident text ident\n" - "*.identcrlf ident text eol=crlf\n" - "*.identlf ident text eol=lf\n"); - - cl_repo_set_bool(g_repo, "core.autocrlf", true); - - /* add files with $Id$ */ - - cl_git_mkfile("crlf/lf.ident", ALL_LF_TEXT_RAW "\n$Id: initial content$\n"); - cl_git_mkfile("crlf/crlf.ident", ALL_CRLF_TEXT_RAW "\r\n$Id$\r\n\r\n"); - cl_git_mkfile("crlf/more1.identlf", "$Id$\n" MORE_LF_TEXT_RAW); - cl_git_mkfile("crlf/more2.identcrlf", "\r\n$Id: $\r\n" MORE_CRLF_TEXT_RAW); - - cl_git_pass(git_repository_index(&index, g_repo)); - cl_git_pass(git_index_add_bypath(index, "lf.ident")); - cl_git_pass(git_index_add_bypath(index, "crlf.ident")); - cl_git_pass(git_index_add_bypath(index, "more1.identlf")); - cl_git_pass(git_index_add_bypath(index, "more2.identcrlf")); - cl_repo_commit_from_index(NULL, g_repo, NULL, 0, "Some ident files\n"); - - git_checkout_head(g_repo, &opts); - - /* check that blobs have $Id$ */ - - cl_git_pass(git_blob_lookup(&blob, g_repo, - & git_index_get_bypath(index, "lf.ident", 0)->id)); - cl_assert_equal_s( - ALL_LF_TEXT_RAW "\n$Id$\n", git_blob_rawcontent(blob)); - git_blob_free(blob); - - cl_git_pass(git_blob_lookup(&blob, g_repo, - & git_index_get_bypath(index, "more2.identcrlf", 0)->id)); - cl_assert_equal_s( - "\n$Id$\n" MORE_CRLF_TEXT_AS_LF, git_blob_rawcontent(blob)); - git_blob_free(blob); - - /* check that filesystem is initially untouched - matching core Git */ - - cl_assert_equal_file( - ALL_LF_TEXT_RAW "\n$Id: initial content$\n", 0, "crlf/lf.ident"); - - /* check that forced checkout rewrites correctly */ - - p_unlink("crlf/lf.ident"); - p_unlink("crlf/crlf.ident"); - p_unlink("crlf/more1.identlf"); - p_unlink("crlf/more2.identcrlf"); - - git_checkout_head(g_repo, &opts); - - cl_assert_equal_file( - ALL_LF_TEXT_AS_CRLF - "\r\n$Id: fcf6d4d9c212dc66563b1171b1cd99953c756467 $\r\n", - 0, "crlf/lf.ident"); - cl_assert_equal_file( - ALL_CRLF_TEXT_RAW - "\r\n$Id: f2c66ad9b2b5a734d9bf00d5000cc10a62b8a857 $\r\n\r\n", - 0, "crlf/crlf.ident"); - - cl_assert_equal_file( - "$Id: f7830382dac1f1583422be5530fdfbd26289431b $\n" - MORE_LF_TEXT_AS_LF, 0, "crlf/more1.identlf"); - - cl_assert_equal_file( - "\r\n$Id: 74677a68413012ce8d7e7cfc3f12603df3a3eac4 $\r\n" - MORE_CRLF_TEXT_AS_CRLF, 0, "crlf/more2.identcrlf"); - - git_index_free(index); -} - -void test_checkout_crlf__autocrlf_false_no_attrs(void) -{ - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - opts.checkout_strategy = GIT_CHECKOUT_FORCE; - - cl_repo_set_bool(g_repo, "core.autocrlf", false); - - git_checkout_head(g_repo, &opts); - - check_file_contents("./crlf/all-lf", ALL_LF_TEXT_RAW); - check_file_contents("./crlf/all-crlf", ALL_CRLF_TEXT_RAW); -} - -void test_checkout_crlf__autocrlf_true_no_attrs(void) -{ - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - opts.checkout_strategy = GIT_CHECKOUT_FORCE; - - cl_repo_set_bool(g_repo, "core.autocrlf", true); - - git_checkout_head(g_repo, &opts); - - check_file_contents("./crlf/all-lf", ALL_LF_TEXT_AS_CRLF); - check_file_contents("./crlf/all-crlf", ALL_CRLF_TEXT_AS_CRLF); -} - -void test_checkout_crlf__autocrlf_input_no_attrs(void) -{ - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - opts.checkout_strategy = GIT_CHECKOUT_FORCE; - - cl_repo_set_string(g_repo, "core.autocrlf", "input"); - - git_checkout_head(g_repo, &opts); - - check_file_contents("./crlf/all-lf", ALL_LF_TEXT_RAW); - check_file_contents("./crlf/all-crlf", ALL_CRLF_TEXT_RAW); -} - -void test_checkout_crlf__autocrlf_false_text_auto_attr(void) -{ - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - opts.checkout_strategy = GIT_CHECKOUT_FORCE; - - cl_git_mkfile("./crlf/.gitattributes", "* text=auto\n"); - - cl_repo_set_bool(g_repo, "core.autocrlf", false); - - git_checkout_head(g_repo, &opts); - - if (GIT_EOL_NATIVE == GIT_EOL_CRLF) { - check_file_contents("./crlf/all-lf", ALL_LF_TEXT_AS_CRLF); - check_file_contents("./crlf/all-crlf", ALL_CRLF_TEXT_AS_CRLF); - } else { - check_file_contents("./crlf/all-lf", ALL_LF_TEXT_RAW); - check_file_contents("./crlf/all-crlf", ALL_CRLF_TEXT_RAW); - } -} - -void test_checkout_crlf__autocrlf_true_text_auto_attr(void) -{ - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - opts.checkout_strategy = GIT_CHECKOUT_FORCE; - - cl_git_mkfile("./crlf/.gitattributes", "* text=auto\n"); - - cl_repo_set_bool(g_repo, "core.autocrlf", true); - - git_checkout_head(g_repo, &opts); - - check_file_contents("./crlf/all-lf", ALL_LF_TEXT_AS_CRLF); - check_file_contents("./crlf/all-crlf", ALL_CRLF_TEXT_AS_CRLF); -} - -void test_checkout_crlf__autocrlf_input_text_auto_attr(void) -{ - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - opts.checkout_strategy = GIT_CHECKOUT_FORCE; - - cl_git_mkfile("./crlf/.gitattributes", "* text=auto\n"); - - cl_repo_set_string(g_repo, "core.autocrlf", "input"); - - git_checkout_head(g_repo, &opts); - - check_file_contents("./crlf/all-lf", ALL_LF_TEXT_RAW); - check_file_contents("./crlf/all-crlf", ALL_CRLF_TEXT_RAW); -} - -void test_checkout_crlf__can_write_empty_file(void) -{ - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - opts.checkout_strategy = GIT_CHECKOUT_FORCE; - - cl_repo_set_bool(g_repo, "core.autocrlf", true); - - git_repository_set_head(g_repo, "refs/heads/empty-files"); - git_checkout_head(g_repo, &opts); - - check_file_contents("./crlf/test1.txt", ""); - - check_file_contents("./crlf/test2.txt", "test2.txt's content\r\n"); - - check_file_contents("./crlf/test3.txt", ""); -} diff --git a/vendor/libgit2/tests/checkout/head.c b/vendor/libgit2/tests/checkout/head.c deleted file mode 100644 index 07cc1d2098..0000000000 --- a/vendor/libgit2/tests/checkout/head.c +++ /dev/null @@ -1,62 +0,0 @@ -#include "clar_libgit2.h" -#include "refs.h" -#include "repo/repo_helpers.h" -#include "path.h" -#include "fileops.h" - -static git_repository *g_repo; - -void test_checkout_head__initialize(void) -{ - g_repo = cl_git_sandbox_init("testrepo"); -} - -void test_checkout_head__cleanup(void) -{ - cl_git_sandbox_cleanup(); -} - -void test_checkout_head__unborn_head_returns_GIT_EUNBORNBRANCH(void) -{ - make_head_unborn(g_repo, NON_EXISTING_HEAD); - - cl_assert_equal_i(GIT_EUNBORNBRANCH, git_checkout_head(g_repo, NULL)); -} - -void test_checkout_head__with_index_only_tree(void) -{ - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - git_index *index; - - /* let's start by getting things into a known state */ - - opts.checkout_strategy = GIT_CHECKOUT_FORCE; - cl_git_pass(git_checkout_head(g_repo, &opts)); - - /* now let's stage some new stuff including a new directory */ - - cl_git_pass(git_repository_index(&index, g_repo)); - - p_mkdir("testrepo/newdir", 0777); - cl_git_mkfile("testrepo/newdir/newfile.txt", "new file\n"); - - cl_git_pass(git_index_add_bypath(index, "newdir/newfile.txt")); - cl_git_pass(git_index_write(index)); - - cl_assert(git_path_isfile("testrepo/newdir/newfile.txt")); - cl_assert(git_index_get_bypath(index, "newdir/newfile.txt", 0) != NULL); - - git_index_free(index); - - /* okay, so now we have staged this new file; let's see if we can remove */ - - opts.checkout_strategy = GIT_CHECKOUT_FORCE | GIT_CHECKOUT_REMOVE_UNTRACKED; - cl_git_pass(git_checkout_head(g_repo, &opts)); - - cl_git_pass(git_repository_index(&index, g_repo)); - - cl_assert(!git_path_isfile("testrepo/newdir/newfile.txt")); - cl_assert(git_index_get_bypath(index, "newdir/newfile.txt", 0) == NULL); - - git_index_free(index); -} diff --git a/vendor/libgit2/tests/checkout/icase.c b/vendor/libgit2/tests/checkout/icase.c deleted file mode 100644 index 55ab3ab24b..0000000000 --- a/vendor/libgit2/tests/checkout/icase.c +++ /dev/null @@ -1,303 +0,0 @@ -#include "clar_libgit2.h" - -#include "git2/checkout.h" -#include "refs.h" -#include "path.h" - -#ifdef GIT_WIN32 -# include -#else -# include -#endif - -static git_repository *repo; -static git_object *obj; -static git_checkout_options checkout_opts; - -void test_checkout_icase__initialize(void) -{ - git_oid id; - git_config *cfg; - int icase = 0; - - repo = cl_git_sandbox_init("testrepo"); - - cl_git_pass(git_repository_config_snapshot(&cfg, repo)); - git_config_get_bool(&icase, cfg, "core.ignorecase"); - git_config_free(cfg); - - if (!icase) - cl_skip(); - - cl_git_pass(git_reference_name_to_id(&id, repo, "refs/heads/dir")); - cl_git_pass(git_object_lookup(&obj, repo, &id, GIT_OBJ_ANY)); - - git_checkout_init_options(&checkout_opts, GIT_CHECKOUT_OPTIONS_VERSION); - checkout_opts.checkout_strategy = GIT_CHECKOUT_NONE; -} - -void test_checkout_icase__cleanup(void) -{ - git_object_free(obj); - cl_git_sandbox_cleanup(); -} - -static char *get_filename(const char *in) -{ -#ifdef GIT_WIN32 - HANDLE fh; - HMODULE kerneldll; - char *filename; - - typedef DWORD (__stdcall *getfinalpathname)(HANDLE, LPSTR, DWORD, DWORD); - getfinalpathname getfinalpathfn; - - cl_assert(filename = malloc(MAX_PATH)); - cl_assert(kerneldll = LoadLibrary("kernel32.dll")); - cl_assert(getfinalpathfn = (getfinalpathname)GetProcAddress(kerneldll, "GetFinalPathNameByHandleA")); - - cl_assert(fh = CreateFileA(in, FILE_READ_ATTRIBUTES | STANDARD_RIGHTS_READ, FILE_SHARE_READ, - NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL)); - - cl_win32_pass(getfinalpathfn(fh, filename, MAX_PATH, VOLUME_NAME_DOS)); - - CloseHandle(fh); - - git_path_mkposix(filename); - - return filename; -#else - char *search_dirname, *search_filename, *filename = NULL; - git_buf out = GIT_BUF_INIT; - DIR *dir; - struct dirent *de; - - cl_assert(search_dirname = git_path_dirname(in)); - cl_assert(search_filename = git_path_basename(in)); - - cl_assert(dir = opendir(search_dirname)); - - while ((de = readdir(dir))) { - if (strcasecmp(de->d_name, search_filename) == 0) { - git_buf_join(&out, '/', search_dirname, de->d_name); - filename = git_buf_detach(&out); - break; - } - } - - closedir(dir); - - git__free(search_dirname); - git__free(search_filename); - git_buf_free(&out); - - return filename; -#endif -} - -static void assert_name_is(const char *expected) -{ - char *actual; - size_t actual_len, expected_len, start; - - cl_assert(actual = get_filename(expected)); - - expected_len = strlen(expected); - actual_len = strlen(actual); - cl_assert(actual_len >= expected_len); - - start = actual_len - expected_len; - cl_assert_equal_s(expected, actual + start); - - if (start) - cl_assert_equal_strn("/", actual + (start - 1), 1); - - free(actual); -} - -void test_checkout_icase__refuses_to_overwrite_files_for_files(void) -{ - checkout_opts.checkout_strategy = GIT_CHECKOUT_SAFE|GIT_CHECKOUT_RECREATE_MISSING; - - cl_git_write2file("testrepo/BRANCH_FILE.txt", "neue file\n", 10, \ - O_WRONLY | O_CREAT | O_TRUNC, 0644); - - cl_git_fail(git_checkout_tree(repo, obj, &checkout_opts)); - assert_name_is("testrepo/BRANCH_FILE.txt"); -} - -void test_checkout_icase__overwrites_files_for_files_when_forced(void) -{ - checkout_opts.checkout_strategy = GIT_CHECKOUT_FORCE; - - cl_git_write2file("testrepo/NEW.txt", "neue file\n", 10, \ - O_WRONLY | O_CREAT | O_TRUNC, 0644); - - cl_git_pass(git_checkout_tree(repo, obj, &checkout_opts)); - assert_name_is("testrepo/new.txt"); -} - -void test_checkout_icase__refuses_to_overwrite_links_for_files(void) -{ - checkout_opts.checkout_strategy = GIT_CHECKOUT_SAFE|GIT_CHECKOUT_RECREATE_MISSING; - - cl_must_pass(p_symlink("../tmp", "testrepo/BRANCH_FILE.txt")); - - cl_git_fail(git_checkout_tree(repo, obj, &checkout_opts)); - - cl_assert(!git_path_exists("tmp")); - assert_name_is("testrepo/BRANCH_FILE.txt"); -} - -void test_checkout_icase__overwrites_links_for_files_when_forced(void) -{ - checkout_opts.checkout_strategy = GIT_CHECKOUT_FORCE; - - cl_must_pass(p_symlink("../tmp", "testrepo/NEW.txt")); - - cl_git_pass(git_checkout_tree(repo, obj, &checkout_opts)); - - cl_assert(!git_path_exists("tmp")); - assert_name_is("testrepo/new.txt"); -} - -void test_checkout_icase__overwrites_empty_folders_for_files(void) -{ - checkout_opts.checkout_strategy = GIT_CHECKOUT_SAFE|GIT_CHECKOUT_RECREATE_MISSING; - - cl_must_pass(p_mkdir("testrepo/NEW.txt", 0777)); - - cl_git_pass(git_checkout_tree(repo, obj, &checkout_opts)); - - assert_name_is("testrepo/new.txt"); - cl_assert(!git_path_isdir("testrepo/new.txt")); -} - -void test_checkout_icase__refuses_to_overwrite_populated_folders_for_files(void) -{ - checkout_opts.checkout_strategy = GIT_CHECKOUT_SAFE|GIT_CHECKOUT_RECREATE_MISSING; - - cl_must_pass(p_mkdir("testrepo/BRANCH_FILE.txt", 0777)); - cl_git_write2file("testrepo/BRANCH_FILE.txt/foobar", "neue file\n", 10, \ - O_WRONLY | O_CREAT | O_TRUNC, 0644); - - cl_git_fail(git_checkout_tree(repo, obj, &checkout_opts)); - - assert_name_is("testrepo/BRANCH_FILE.txt"); - cl_assert(git_path_isdir("testrepo/BRANCH_FILE.txt")); -} - -void test_checkout_icase__overwrites_folders_for_files_when_forced(void) -{ - checkout_opts.checkout_strategy = GIT_CHECKOUT_FORCE; - - cl_must_pass(p_mkdir("testrepo/NEW.txt", 0777)); - cl_git_write2file("testrepo/NEW.txt/foobar", "neue file\n", 10, \ - O_WRONLY | O_CREAT | O_TRUNC, 0644); - - cl_git_pass(git_checkout_tree(repo, obj, &checkout_opts)); - - assert_name_is("testrepo/new.txt"); - cl_assert(!git_path_isdir("testrepo/new.txt")); -} - -void test_checkout_icase__refuses_to_overwrite_files_for_folders(void) -{ - checkout_opts.checkout_strategy = GIT_CHECKOUT_SAFE|GIT_CHECKOUT_RECREATE_MISSING; - - cl_git_write2file("testrepo/A", "neue file\n", 10, \ - O_WRONLY | O_CREAT | O_TRUNC, 0644); - - cl_git_fail(git_checkout_tree(repo, obj, &checkout_opts)); - assert_name_is("testrepo/A"); - cl_assert(!git_path_isdir("testrepo/A")); -} - -void test_checkout_icase__overwrites_files_for_folders_when_forced(void) -{ - checkout_opts.checkout_strategy = GIT_CHECKOUT_FORCE; - - cl_git_write2file("testrepo/A", "neue file\n", 10, \ - O_WRONLY | O_CREAT | O_TRUNC, 0644); - - cl_git_pass(git_checkout_tree(repo, obj, &checkout_opts)); - assert_name_is("testrepo/a"); - cl_assert(git_path_isdir("testrepo/a")); -} - -void test_checkout_icase__refuses_to_overwrite_links_for_folders(void) -{ - checkout_opts.checkout_strategy = GIT_CHECKOUT_SAFE|GIT_CHECKOUT_RECREATE_MISSING; - - cl_must_pass(p_symlink("..", "testrepo/A")); - - cl_git_fail(git_checkout_tree(repo, obj, &checkout_opts)); - - cl_assert(!git_path_exists("b.txt")); - assert_name_is("testrepo/A"); -} - -void test_checkout_icase__overwrites_links_for_folders_when_forced(void) -{ - checkout_opts.checkout_strategy = GIT_CHECKOUT_FORCE; - - cl_must_pass(p_symlink("..", "testrepo/A")); - - cl_git_pass(git_checkout_tree(repo, obj, &checkout_opts)); - - cl_assert(!git_path_exists("b.txt")); - assert_name_is("testrepo/a"); -} - -void test_checkout_icase__ignores_unstaged_casechange(void) -{ - git_reference *orig_ref, *br2_ref; - git_commit *orig, *br2; - git_checkout_options checkout_opts = GIT_CHECKOUT_OPTIONS_INIT; - - checkout_opts.checkout_strategy = GIT_CHECKOUT_SAFE; - - cl_git_pass(git_reference_lookup_resolved(&orig_ref, repo, "HEAD", 100)); - cl_git_pass(git_commit_lookup(&orig, repo, git_reference_target(orig_ref))); - cl_git_pass(git_reset(repo, (git_object *)orig, GIT_RESET_HARD, NULL)); - - cl_rename("testrepo/branch_file.txt", "testrepo/Branch_File.txt"); - - cl_git_pass(git_reference_lookup_resolved(&br2_ref, repo, "refs/heads/br2", 100)); - cl_git_pass(git_commit_lookup(&br2, repo, git_reference_target(br2_ref))); - - cl_git_pass(git_checkout_tree(repo, (const git_object *)br2, &checkout_opts)); - - git_commit_free(orig); - git_commit_free(br2); - git_reference_free(orig_ref); - git_reference_free(br2_ref); -} - -void test_checkout_icase__conflicts_with_casechanged_subtrees(void) -{ - git_reference *orig_ref; - git_object *orig, *subtrees; - git_oid oid; - git_checkout_options checkout_opts = GIT_CHECKOUT_OPTIONS_INIT; - - checkout_opts.checkout_strategy = GIT_CHECKOUT_SAFE; - - cl_git_pass(git_reference_lookup_resolved(&orig_ref, repo, "HEAD", 100)); - cl_git_pass(git_object_lookup(&orig, repo, git_reference_target(orig_ref), GIT_OBJ_COMMIT)); - cl_git_pass(git_reset(repo, (git_object *)orig, GIT_RESET_HARD, NULL)); - - cl_must_pass(p_mkdir("testrepo/AB", 0777)); - cl_must_pass(p_mkdir("testrepo/AB/C", 0777)); - cl_git_write2file("testrepo/AB/C/3.txt", "Foobar!\n", 8, O_RDWR|O_CREAT, 0666); - - cl_git_pass(git_reference_name_to_id(&oid, repo, "refs/heads/subtrees")); - cl_git_pass(git_object_lookup(&subtrees, repo, &oid, GIT_OBJ_ANY)); - - cl_git_fail(git_checkout_tree(repo, subtrees, &checkout_opts)); - - git_object_free(orig); - git_object_free(subtrees); - git_reference_free(orig_ref); -} - diff --git a/vendor/libgit2/tests/checkout/index.c b/vendor/libgit2/tests/checkout/index.c deleted file mode 100644 index 0d220e1414..0000000000 --- a/vendor/libgit2/tests/checkout/index.c +++ /dev/null @@ -1,774 +0,0 @@ -#include "clar_libgit2.h" -#include "checkout_helpers.h" - -#include "git2/checkout.h" -#include "fileops.h" -#include "repository.h" -#include "remote.h" - -static git_repository *g_repo; - -void test_checkout_index__initialize(void) -{ - git_tree *tree; - - g_repo = cl_git_sandbox_init("testrepo"); - - cl_git_pass(git_repository_head_tree(&tree, g_repo)); - - reset_index_to_treeish((git_object *)tree); - git_tree_free(tree); - - cl_git_rewritefile( - "./testrepo/.gitattributes", - "* text eol=lf\n"); -} - -void test_checkout_index__cleanup(void) -{ - cl_git_sandbox_cleanup(); - - /* try to remove alternative dir */ - if (git_path_isdir("alternative")) - git_futils_rmdir_r("alternative", NULL, GIT_RMDIR_REMOVE_FILES); -} - -void test_checkout_index__cannot_checkout_a_bare_repository(void) -{ - test_checkout_index__cleanup(); - - g_repo = cl_git_sandbox_init("testrepo.git"); - - cl_git_fail(git_checkout_index(g_repo, NULL, NULL)); -} - -void test_checkout_index__can_create_missing_files(void) -{ - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - - cl_assert_equal_i(false, git_path_isfile("./testrepo/README")); - cl_assert_equal_i(false, git_path_isfile("./testrepo/branch_file.txt")); - cl_assert_equal_i(false, git_path_isfile("./testrepo/new.txt")); - - opts.checkout_strategy = GIT_CHECKOUT_SAFE | GIT_CHECKOUT_RECREATE_MISSING; - - cl_git_pass(git_checkout_index(g_repo, NULL, &opts)); - - check_file_contents("./testrepo/README", "hey there\n"); - check_file_contents("./testrepo/branch_file.txt", "hi\nbye!\n"); - check_file_contents("./testrepo/new.txt", "my new file\n"); -} - -void test_checkout_index__can_remove_untracked_files(void) -{ - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - - git_futils_mkdir("./testrepo/dir/subdir/subsubdir", NULL, 0755, GIT_MKDIR_PATH); - cl_git_mkfile("./testrepo/dir/one", "one\n"); - cl_git_mkfile("./testrepo/dir/subdir/two", "two\n"); - - cl_assert_equal_i(true, git_path_isdir("./testrepo/dir/subdir/subsubdir")); - - opts.checkout_strategy = - GIT_CHECKOUT_SAFE | - GIT_CHECKOUT_RECREATE_MISSING | - GIT_CHECKOUT_REMOVE_UNTRACKED; - - cl_git_pass(git_checkout_index(g_repo, NULL, &opts)); - - cl_assert_equal_i(false, git_path_isdir("./testrepo/dir")); -} - -void test_checkout_index__honor_the_specified_pathspecs(void) -{ - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - char *entries[] = { "*.txt" }; - - opts.paths.strings = entries; - opts.paths.count = 1; - - cl_assert_equal_i(false, git_path_isfile("./testrepo/README")); - cl_assert_equal_i(false, git_path_isfile("./testrepo/branch_file.txt")); - cl_assert_equal_i(false, git_path_isfile("./testrepo/new.txt")); - - opts.checkout_strategy = GIT_CHECKOUT_SAFE | GIT_CHECKOUT_RECREATE_MISSING; - - cl_git_pass(git_checkout_index(g_repo, NULL, &opts)); - - cl_assert_equal_i(false, git_path_isfile("./testrepo/README")); - check_file_contents("./testrepo/branch_file.txt", "hi\nbye!\n"); - check_file_contents("./testrepo/new.txt", "my new file\n"); -} - -void test_checkout_index__honor_the_gitattributes_directives(void) -{ - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - const char *attributes = - "branch_file.txt text eol=crlf\n" - "new.txt text eol=lf\n"; - - cl_git_mkfile("./testrepo/.gitattributes", attributes); - cl_repo_set_bool(g_repo, "core.autocrlf", false); - - opts.checkout_strategy = GIT_CHECKOUT_SAFE | GIT_CHECKOUT_RECREATE_MISSING; - - cl_git_pass(git_checkout_index(g_repo, NULL, &opts)); - - check_file_contents("./testrepo/README", "hey there\n"); - check_file_contents("./testrepo/new.txt", "my new file\n"); - check_file_contents("./testrepo/branch_file.txt", "hi\r\nbye!\r\n"); -} - -void test_checkout_index__honor_coreautocrlf_setting_set_to_true(void) -{ -#ifdef GIT_WIN32 - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - const char *expected_readme_text = "hey there\r\n"; - - cl_git_pass(p_unlink("./testrepo/.gitattributes")); - cl_repo_set_bool(g_repo, "core.autocrlf", true); - - opts.checkout_strategy = GIT_CHECKOUT_SAFE | GIT_CHECKOUT_RECREATE_MISSING; - - cl_git_pass(git_checkout_index(g_repo, NULL, &opts)); - - check_file_contents("./testrepo/README", expected_readme_text); -#endif -} - -void test_checkout_index__honor_coresymlinks_default(void) -{ - git_repository *repo; - git_remote *origin; - git_object *target; - char cwd[GIT_PATH_MAX]; - - const char *url = git_repository_path(g_repo); - - cl_assert(getcwd(cwd, sizeof(cwd)) != NULL); - cl_assert_equal_i(0, p_mkdir("readonly", 0555)); // Read-only directory - cl_assert_equal_i(0, chdir("readonly")); - cl_git_pass(git_repository_init(&repo, "../symlink.git", true)); - cl_assert_equal_i(0, chdir(cwd)); - cl_assert_equal_i(0, p_mkdir("symlink", 0777)); - cl_git_pass(git_repository_set_workdir(repo, "symlink", 1)); - - cl_git_pass(git_remote_create(&origin, repo, GIT_REMOTE_ORIGIN, url)); - cl_git_pass(git_remote_fetch(origin, NULL, NULL, NULL)); - git_remote_free(origin); - - cl_git_pass(git_revparse_single(&target, repo, "remotes/origin/master")); - cl_git_pass(git_reset(repo, target, GIT_RESET_HARD, NULL)); - git_object_free(target); - git_repository_free(repo); - -#ifdef GIT_WIN32 - check_file_contents("./symlink/link_to_new.txt", "new.txt"); -#else - { - char link_data[1024]; - size_t link_size = 1024; - - link_size = p_readlink("./symlink/link_to_new.txt", link_data, link_size); - link_data[link_size] = '\0'; - cl_assert_equal_i(link_size, strlen("new.txt")); - cl_assert_equal_s(link_data, "new.txt"); - check_file_contents("./symlink/link_to_new.txt", "my new file\n"); - } -#endif - - cl_fixture_cleanup("symlink"); -} - -void test_checkout_index__honor_coresymlinks_setting_set_to_true(void) -{ - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - - cl_repo_set_bool(g_repo, "core.symlinks", true); - - opts.checkout_strategy = GIT_CHECKOUT_SAFE | GIT_CHECKOUT_RECREATE_MISSING; - - cl_git_pass(git_checkout_index(g_repo, NULL, &opts)); - -#ifdef GIT_WIN32 - check_file_contents("./testrepo/link_to_new.txt", "new.txt"); -#else - { - char link_data[1024]; - size_t link_size = 1024; - - link_size = p_readlink("./testrepo/link_to_new.txt", link_data, link_size); - link_data[link_size] = '\0'; - cl_assert_equal_i(link_size, strlen("new.txt")); - cl_assert_equal_s(link_data, "new.txt"); - check_file_contents("./testrepo/link_to_new.txt", "my new file\n"); - } -#endif -} - -void test_checkout_index__honor_coresymlinks_setting_set_to_false(void) -{ - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - - cl_repo_set_bool(g_repo, "core.symlinks", false); - - opts.checkout_strategy = GIT_CHECKOUT_SAFE | GIT_CHECKOUT_RECREATE_MISSING; - - cl_git_pass(git_checkout_index(g_repo, NULL, &opts)); - - check_file_contents("./testrepo/link_to_new.txt", "new.txt"); -} - -void test_checkout_index__donot_overwrite_modified_file_by_default(void) -{ - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - - cl_git_mkfile("./testrepo/new.txt", "This isn't what's stored!"); - - /* set this up to not return an error code on conflicts, but it - * still will not have permission to overwrite anything... - */ - opts.checkout_strategy = GIT_CHECKOUT_SAFE | GIT_CHECKOUT_ALLOW_CONFLICTS; - - cl_git_pass(git_checkout_index(g_repo, NULL, &opts)); - - check_file_contents("./testrepo/new.txt", "This isn't what's stored!"); -} - -void test_checkout_index__can_overwrite_modified_file(void) -{ - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - - cl_git_mkfile("./testrepo/new.txt", "This isn't what's stored!"); - - opts.checkout_strategy = GIT_CHECKOUT_FORCE; - - cl_git_pass(git_checkout_index(g_repo, NULL, &opts)); - - check_file_contents("./testrepo/new.txt", "my new file\n"); -} - -void test_checkout_index__options_disable_filters(void) -{ - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - - cl_git_mkfile("./testrepo/.gitattributes", "*.txt text eol=crlf\n"); - - opts.checkout_strategy = GIT_CHECKOUT_SAFE | GIT_CHECKOUT_RECREATE_MISSING; - opts.disable_filters = false; - - cl_git_pass(git_checkout_index(g_repo, NULL, &opts)); - - check_file_contents("./testrepo/new.txt", "my new file\r\n"); - - p_unlink("./testrepo/new.txt"); - - opts.disable_filters = true; - cl_git_pass(git_checkout_index(g_repo, NULL, &opts)); - - check_file_contents("./testrepo/new.txt", "my new file\n"); -} - -void test_checkout_index__options_dir_modes(void) -{ - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - struct stat st; - git_oid oid; - git_commit *commit; - mode_t um; - - if (!cl_is_chmod_supported()) - return; - - cl_git_pass(git_reference_name_to_id(&oid, g_repo, "refs/heads/dir")); - cl_git_pass(git_commit_lookup(&commit, g_repo, &oid)); - - reset_index_to_treeish((git_object *)commit); - - opts.checkout_strategy = GIT_CHECKOUT_SAFE | GIT_CHECKOUT_RECREATE_MISSING; - opts.dir_mode = 0701; - - cl_git_pass(git_checkout_index(g_repo, NULL, &opts)); - - /* umask will influence actual directory creation mode */ - (void)p_umask(um = p_umask(022)); - - cl_git_pass(p_stat("./testrepo/a", &st)); - cl_assert_equal_i_fmt(st.st_mode, (GIT_FILEMODE_TREE | 0701) & ~um, "%07o"); - - /* File-mode test, since we're on the 'dir' branch */ - cl_git_pass(p_stat("./testrepo/a/b.txt", &st)); - cl_assert_equal_i_fmt(st.st_mode, GIT_FILEMODE_BLOB_EXECUTABLE, "%07o"); - - git_commit_free(commit); -} - -void test_checkout_index__options_override_file_modes(void) -{ - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - struct stat st; - - if (!cl_is_chmod_supported()) - return; - - opts.checkout_strategy = GIT_CHECKOUT_SAFE | GIT_CHECKOUT_RECREATE_MISSING; - opts.file_mode = 0700; - - cl_git_pass(git_checkout_index(g_repo, NULL, &opts)); - - cl_git_pass(p_stat("./testrepo/new.txt", &st)); - cl_assert_equal_i_fmt(st.st_mode & GIT_MODE_PERMS_MASK, 0700, "%07o"); -} - -void test_checkout_index__options_open_flags(void) -{ - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - - cl_git_mkfile("./testrepo/new.txt", "hi\n"); - - opts.checkout_strategy = - GIT_CHECKOUT_FORCE | GIT_CHECKOUT_DONT_REMOVE_EXISTING; - opts.file_open_flags = O_CREAT | O_RDWR | O_APPEND; - - cl_git_pass(git_checkout_index(g_repo, NULL, &opts)); - - check_file_contents("./testrepo/new.txt", "hi\nmy new file\n"); -} - -struct notify_data { - const char *file; - const char *sha; -}; - -static int test_checkout_notify_cb( - git_checkout_notify_t why, - const char *path, - const git_diff_file *baseline, - const git_diff_file *target, - const git_diff_file *workdir, - void *payload) -{ - struct notify_data *expectations = (struct notify_data *)payload; - - GIT_UNUSED(workdir); - - cl_assert_equal_i(GIT_CHECKOUT_NOTIFY_CONFLICT, why); - cl_assert_equal_s(expectations->file, path); - cl_assert_equal_i(0, git_oid_streq(&baseline->id, expectations->sha)); - cl_assert_equal_i(0, git_oid_streq(&target->id, expectations->sha)); - - return 0; -} - -void test_checkout_index__can_notify_of_skipped_files(void) -{ - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - struct notify_data data; - - cl_git_mkfile("./testrepo/new.txt", "This isn't what's stored!"); - - /* - * $ git ls-tree HEAD - * 100644 blob a8233120f6ad708f843d861ce2b7228ec4e3dec6 README - * 100644 blob 3697d64be941a53d4ae8f6a271e4e3fa56b022cc branch_file.txt - * 100644 blob a71586c1dfe8a71c6cbf6c129f404c5642ff31bd new.txt - */ - data.file = "new.txt"; - data.sha = "a71586c1dfe8a71c6cbf6c129f404c5642ff31bd"; - - opts.checkout_strategy = GIT_CHECKOUT_SAFE | - GIT_CHECKOUT_RECREATE_MISSING | - GIT_CHECKOUT_ALLOW_CONFLICTS; - opts.notify_flags = GIT_CHECKOUT_NOTIFY_CONFLICT; - opts.notify_cb = test_checkout_notify_cb; - opts.notify_payload = &data; - - cl_git_pass(git_checkout_index(g_repo, NULL, &opts)); -} - -static int dont_notify_cb( - git_checkout_notify_t why, - const char *path, - const git_diff_file *baseline, - const git_diff_file *target, - const git_diff_file *workdir, - void *payload) -{ - GIT_UNUSED(why); - GIT_UNUSED(path); - GIT_UNUSED(baseline); - GIT_UNUSED(target); - GIT_UNUSED(workdir); - GIT_UNUSED(payload); - - cl_assert(false); - - return 0; -} - -void test_checkout_index__wont_notify_of_expected_line_ending_changes(void) -{ - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - - cl_git_pass(p_unlink("./testrepo/.gitattributes")); - cl_repo_set_bool(g_repo, "core.autocrlf", true); - - cl_git_mkfile("./testrepo/new.txt", "my new file\r\n"); - - opts.checkout_strategy = - GIT_CHECKOUT_SAFE | - GIT_CHECKOUT_RECREATE_MISSING | - GIT_CHECKOUT_ALLOW_CONFLICTS; - opts.notify_flags = GIT_CHECKOUT_NOTIFY_CONFLICT; - opts.notify_cb = dont_notify_cb; - opts.notify_payload = NULL; - - cl_git_pass(git_checkout_index(g_repo, NULL, &opts)); -} - -static void checkout_progress_counter( - const char *path, size_t cur, size_t tot, void *payload) -{ - GIT_UNUSED(path); GIT_UNUSED(cur); GIT_UNUSED(tot); - (*(int *)payload)++; -} - -void test_checkout_index__calls_progress_callback(void) -{ - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - int calls = 0; - - opts.checkout_strategy = GIT_CHECKOUT_SAFE | GIT_CHECKOUT_RECREATE_MISSING; - opts.progress_cb = checkout_progress_counter; - opts.progress_payload = &calls; - - cl_git_pass(git_checkout_index(g_repo, NULL, &opts)); - cl_assert(calls > 0); -} - -void test_checkout_index__can_overcome_name_clashes(void) -{ - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - git_index *index; - - cl_git_pass(git_repository_index(&index, g_repo)); - git_index_clear(index); - - cl_git_mkfile("./testrepo/path0", "content\r\n"); - cl_git_pass(p_mkdir("./testrepo/path1", 0777)); - cl_git_mkfile("./testrepo/path1/file1", "content\r\n"); - - cl_git_pass(git_index_add_bypath(index, "path0")); - cl_git_pass(git_index_add_bypath(index, "path1/file1")); - - cl_git_pass(p_unlink("./testrepo/path0")); - cl_git_pass(git_futils_rmdir_r( - "./testrepo/path1", NULL, GIT_RMDIR_REMOVE_FILES)); - - cl_git_mkfile("./testrepo/path1", "content\r\n"); - cl_git_pass(p_mkdir("./testrepo/path0", 0777)); - cl_git_mkfile("./testrepo/path0/file0", "content\r\n"); - - cl_assert(git_path_isfile("./testrepo/path1")); - cl_assert(git_path_isfile("./testrepo/path0/file0")); - - opts.checkout_strategy = - GIT_CHECKOUT_SAFE | - GIT_CHECKOUT_RECREATE_MISSING | - GIT_CHECKOUT_ALLOW_CONFLICTS; - cl_git_pass(git_checkout_index(g_repo, index, &opts)); - - cl_assert(git_path_isfile("./testrepo/path1")); - cl_assert(git_path_isfile("./testrepo/path0/file0")); - - opts.checkout_strategy = GIT_CHECKOUT_FORCE; - cl_git_pass(git_checkout_index(g_repo, index, &opts)); - - cl_assert(git_path_isfile("./testrepo/path0")); - cl_assert(git_path_isfile("./testrepo/path1/file1")); - - git_index_free(index); -} - -void test_checkout_index__validates_struct_version(void) -{ - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - const git_error *err; - - opts.version = 1024; - cl_git_fail(git_checkout_index(g_repo, NULL, &opts)); - - err = giterr_last(); - cl_assert_equal_i(err->klass, GITERR_INVALID); - - opts.version = 0; - giterr_clear(); - cl_git_fail(git_checkout_index(g_repo, NULL, &opts)); - - err = giterr_last(); - cl_assert_equal_i(err->klass, GITERR_INVALID); -} - -void test_checkout_index__can_update_prefixed_files(void) -{ - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - - cl_assert_equal_i(false, git_path_isfile("./testrepo/README")); - cl_assert_equal_i(false, git_path_isfile("./testrepo/branch_file.txt")); - cl_assert_equal_i(false, git_path_isfile("./testrepo/new.txt")); - - cl_git_mkfile("./testrepo/READ", "content\n"); - cl_git_mkfile("./testrepo/README.after", "content\n"); - cl_git_pass(p_mkdir("./testrepo/branch_file", 0777)); - cl_git_pass(p_mkdir("./testrepo/branch_file/contained_dir", 0777)); - cl_git_mkfile("./testrepo/branch_file/contained_file", "content\n"); - cl_git_pass(p_mkdir("./testrepo/branch_file.txt.after", 0777)); - - opts.checkout_strategy = - GIT_CHECKOUT_SAFE | - GIT_CHECKOUT_RECREATE_MISSING | - GIT_CHECKOUT_REMOVE_UNTRACKED; - - cl_git_pass(git_checkout_index(g_repo, NULL, &opts)); - - /* remove untracked will remove the .gitattributes file before the blobs - * were created, so they will have had crlf filtering applied on Windows - */ - check_file_contents_nocr("./testrepo/README", "hey there\n"); - check_file_contents_nocr("./testrepo/branch_file.txt", "hi\nbye!\n"); - check_file_contents_nocr("./testrepo/new.txt", "my new file\n"); - - cl_assert(!git_path_exists("testrepo/READ")); - cl_assert(!git_path_exists("testrepo/README.after")); - cl_assert(!git_path_exists("testrepo/branch_file")); - cl_assert(!git_path_exists("testrepo/branch_file.txt.after")); -} - -void test_checkout_index__can_checkout_a_newly_initialized_repository(void) -{ - test_checkout_index__cleanup(); - - g_repo = cl_git_sandbox_init("empty_standard_repo"); - cl_git_remove_placeholders(git_repository_path(g_repo), "dummy-marker.txt"); - - cl_git_pass(git_checkout_index(g_repo, NULL, NULL)); -} - -void test_checkout_index__issue_1397(void) -{ - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - - test_checkout_index__cleanup(); - - g_repo = cl_git_sandbox_init("issue_1397"); - - cl_repo_set_bool(g_repo, "core.autocrlf", true); - - opts.checkout_strategy = GIT_CHECKOUT_FORCE; - - cl_git_pass(git_checkout_index(g_repo, NULL, &opts)); - - check_file_contents("./issue_1397/crlf_file.txt", "first line\r\nsecond line\r\nboth with crlf"); -} - -void test_checkout_index__target_directory(void) -{ - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - checkout_counts cts; - memset(&cts, 0, sizeof(cts)); - - opts.checkout_strategy = GIT_CHECKOUT_SAFE | - GIT_CHECKOUT_RECREATE_MISSING; - opts.target_directory = "alternative"; - cl_assert(!git_path_isdir("alternative")); - - opts.notify_flags = GIT_CHECKOUT_NOTIFY_ALL; - opts.notify_cb = checkout_count_callback; - opts.notify_payload = &cts; - - /* create some files that *would* conflict if we were using the wd */ - cl_git_mkfile("testrepo/README", "I'm in the way!\n"); - cl_git_mkfile("testrepo/new.txt", "my new file\n"); - - cl_git_pass(git_checkout_index(g_repo, NULL, &opts)); - - cl_assert_equal_i(0, cts.n_untracked); - cl_assert_equal_i(0, cts.n_ignored); - cl_assert_equal_i(4, cts.n_updates); - - check_file_contents("./alternative/README", "hey there\n"); - check_file_contents("./alternative/branch_file.txt", "hi\nbye!\n"); - check_file_contents("./alternative/new.txt", "my new file\n"); - - cl_git_pass(git_futils_rmdir_r( - "alternative", NULL, GIT_RMDIR_REMOVE_FILES)); -} - -void test_checkout_index__target_directory_from_bare(void) -{ - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - git_index *index; - git_object *head = NULL; - checkout_counts cts; - memset(&cts, 0, sizeof(cts)); - - test_checkout_index__cleanup(); - - g_repo = cl_git_sandbox_init("testrepo.git"); - cl_assert(git_repository_is_bare(g_repo)); - - cl_git_pass(git_repository_index(&index, g_repo)); - cl_git_pass(git_revparse_single(&head, g_repo, "HEAD^{tree}")); - cl_git_pass(git_index_read_tree(index, (const git_tree *)head)); - cl_git_pass(git_index_write(index)); - git_index_free(index); - - opts.checkout_strategy = GIT_CHECKOUT_SAFE | - GIT_CHECKOUT_RECREATE_MISSING; - - opts.notify_flags = GIT_CHECKOUT_NOTIFY_ALL; - opts.notify_cb = checkout_count_callback; - opts.notify_payload = &cts; - - /* fail to checkout a bare repo */ - cl_git_fail(git_checkout_index(g_repo, NULL, &opts)); - - opts.target_directory = "alternative"; - cl_assert(!git_path_isdir("alternative")); - - cl_git_pass(git_checkout_index(g_repo, NULL, &opts)); - - cl_assert_equal_i(0, cts.n_untracked); - cl_assert_equal_i(0, cts.n_ignored); - cl_assert_equal_i(3, cts.n_updates); - - /* files will have been filtered if needed, so strip CR */ - check_file_contents_nocr("./alternative/README", "hey there\n"); - check_file_contents_nocr("./alternative/branch_file.txt", "hi\nbye!\n"); - check_file_contents_nocr("./alternative/new.txt", "my new file\n"); - - cl_git_pass(git_futils_rmdir_r( - "alternative", NULL, GIT_RMDIR_REMOVE_FILES)); - - git_object_free(head); -} - -void test_checkout_index__can_get_repo_from_index(void) -{ - git_index *index; - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - - cl_assert_equal_i(false, git_path_isfile("./testrepo/README")); - cl_assert_equal_i(false, git_path_isfile("./testrepo/branch_file.txt")); - cl_assert_equal_i(false, git_path_isfile("./testrepo/new.txt")); - - opts.checkout_strategy = GIT_CHECKOUT_SAFE | GIT_CHECKOUT_RECREATE_MISSING; - - cl_git_pass(git_repository_index(&index, g_repo)); - - cl_git_pass(git_checkout_index(NULL, index, &opts)); - - check_file_contents("./testrepo/README", "hey there\n"); - check_file_contents("./testrepo/branch_file.txt", "hi\nbye!\n"); - check_file_contents("./testrepo/new.txt", "my new file\n"); - - git_index_free(index); -} - -static void add_conflict(git_index *index, const char *path) -{ - git_index_entry entry; - - memset(&entry, 0, sizeof(git_index_entry)); - - entry.mode = 0100644; - entry.path = path; - - git_oid_fromstr(&entry.id, "d427e0b2e138501a3d15cc376077a3631e15bd46"); - GIT_IDXENTRY_STAGE_SET(&entry, 1); - cl_git_pass(git_index_add(index, &entry)); - - git_oid_fromstr(&entry.id, "4e886e602529caa9ab11d71f86634bd1b6e0de10"); - GIT_IDXENTRY_STAGE_SET(&entry, 2); - cl_git_pass(git_index_add(index, &entry)); - - git_oid_fromstr(&entry.id, "2bd0a343aeef7a2cf0d158478966a6e587ff3863"); - GIT_IDXENTRY_STAGE_SET(&entry, 3); - cl_git_pass(git_index_add(index, &entry)); -} - -void test_checkout_index__writes_conflict_file(void) -{ - git_index *index; - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - git_buf conflicting_buf = GIT_BUF_INIT; - - cl_git_pass(git_repository_index(&index, g_repo)); - - add_conflict(index, "conflicting.txt"); - cl_git_pass(git_index_write(index)); - - cl_git_pass(git_checkout_index(g_repo, NULL, &opts)); - - cl_git_pass(git_futils_readbuffer(&conflicting_buf, "testrepo/conflicting.txt")); - cl_assert(strcmp(conflicting_buf.ptr, - "<<<<<<< ours\n" - "this file is changed in master and branch\n" - "=======\n" - "this file is changed in branch and master\n" - ">>>>>>> theirs\n") == 0); - git_buf_free(&conflicting_buf); - - git_index_free(index); -} - -void test_checkout_index__adding_conflict_removes_stage_0(void) -{ - git_index *new_index, *index; - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - - cl_git_pass(git_index_new(&new_index)); - - add_conflict(new_index, "new.txt"); - cl_git_pass(git_checkout_index(g_repo, new_index, &opts)); - - cl_git_pass(git_repository_index(&index, g_repo)); - - cl_assert(git_index_get_bypath(index, "new.txt", 0) == NULL); - cl_assert(git_index_get_bypath(index, "new.txt", 1) != NULL); - cl_assert(git_index_get_bypath(index, "new.txt", 2) != NULL); - cl_assert(git_index_get_bypath(index, "new.txt", 3) != NULL); - - git_index_free(index); - git_index_free(new_index); -} - -void test_checkout_index__conflicts_honor_coreautocrlf(void) -{ -#ifdef GIT_WIN32 - git_index *index; - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - git_buf conflicting_buf = GIT_BUF_INIT; - - cl_git_pass(p_unlink("./testrepo/.gitattributes")); - cl_repo_set_bool(g_repo, "core.autocrlf", true); - - cl_git_pass(git_repository_index(&index, g_repo)); - - add_conflict(index, "conflicting.txt"); - cl_git_pass(git_index_write(index)); - - cl_git_pass(git_checkout_index(g_repo, NULL, &opts)); - - cl_git_pass(git_futils_readbuffer(&conflicting_buf, "testrepo/conflicting.txt")); - cl_assert(strcmp(conflicting_buf.ptr, - "<<<<<<< ours\r\n" - "this file is changed in master and branch\r\n" - "=======\r\n" - "this file is changed in branch and master\r\n" - ">>>>>>> theirs\r\n") == 0); - git_buf_free(&conflicting_buf); - - git_index_free(index); -#endif -} diff --git a/vendor/libgit2/tests/checkout/nasty.c b/vendor/libgit2/tests/checkout/nasty.c deleted file mode 100644 index 952a6a1127..0000000000 --- a/vendor/libgit2/tests/checkout/nasty.c +++ /dev/null @@ -1,366 +0,0 @@ -#include "clar_libgit2.h" -#include "checkout_helpers.h" - -#include "git2/checkout.h" -#include "repository.h" -#include "buffer.h" -#include "fileops.h" - -static const char *repo_name = "nasty"; -static git_repository *repo; -static git_checkout_options checkout_opts; - -void test_checkout_nasty__initialize(void) -{ - repo = cl_git_sandbox_init(repo_name); - - GIT_INIT_STRUCTURE(&checkout_opts, GIT_CHECKOUT_OPTIONS_VERSION); - checkout_opts.checkout_strategy = GIT_CHECKOUT_FORCE; -} - -void test_checkout_nasty__cleanup(void) -{ - cl_git_sandbox_cleanup(); -} - -static void test_checkout_passes(const char *refname, const char *filename) -{ - git_oid commit_id; - git_commit *commit; - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - git_buf path = GIT_BUF_INIT; - - cl_git_pass(git_buf_joinpath(&path, repo_name, filename)); - - cl_git_pass(git_reference_name_to_id(&commit_id, repo, refname)); - cl_git_pass(git_commit_lookup(&commit, repo, &commit_id)); - - opts.checkout_strategy = GIT_CHECKOUT_FORCE | - GIT_CHECKOUT_DONT_UPDATE_INDEX; - - cl_git_pass(git_checkout_tree(repo, (const git_object *)commit, &opts)); - cl_assert(!git_path_exists(path.ptr)); - - git_commit_free(commit); - git_buf_free(&path); -} - -static void test_checkout_fails(const char *refname, const char *filename) -{ - git_oid commit_id; - git_commit *commit; - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - git_buf path = GIT_BUF_INIT; - - cl_git_pass(git_buf_joinpath(&path, repo_name, filename)); - - cl_git_pass(git_reference_name_to_id(&commit_id, repo, refname)); - cl_git_pass(git_commit_lookup(&commit, repo, &commit_id)); - - opts.checkout_strategy = GIT_CHECKOUT_FORCE; - - cl_git_fail(git_checkout_tree(repo, (const git_object *)commit, &opts)); - cl_assert(!git_path_exists(path.ptr)); - - git_commit_free(commit); - git_buf_free(&path); -} - -/* A tree that contains ".git" as a tree, with a blob inside - * (".git/foobar"). - */ -void test_checkout_nasty__dotgit_tree(void) -{ - test_checkout_fails("refs/heads/dotgit_tree", ".git/foobar"); -} - -/* A tree that contains ".GIT" as a tree, with a blob inside - * (".GIT/foobar"). - */ -void test_checkout_nasty__dotcapitalgit_tree(void) -{ - test_checkout_fails("refs/heads/dotcapitalgit_tree", ".GIT/foobar"); -} - -/* A tree that contains a tree ".", with a blob inside ("./foobar"). - */ -void test_checkout_nasty__dot_tree(void) -{ - test_checkout_fails("refs/heads/dot_tree", "foobar"); -} - -/* A tree that contains a tree ".", with a tree ".git", with a blob - * inside ("./.git/foobar"). - */ -void test_checkout_nasty__dot_dotgit_tree(void) -{ - test_checkout_fails("refs/heads/dot_dotgit_tree", ".git/foobar"); -} - -/* A tree that contains a tree, with a tree "..", with a tree ".git", with a - * blob inside ("foo/../.git/foobar"). - */ -void test_checkout_nasty__dotdot_dotgit_tree(void) -{ - test_checkout_fails("refs/heads/dotdot_dotgit_tree", ".git/foobar"); -} - -/* A tree that contains a tree, with a tree "..", with a blob inside - * ("foo/../foobar"). - */ -void test_checkout_nasty__dotdot_tree(void) -{ - test_checkout_fails("refs/heads/dotdot_tree", "foobar"); -} - -/* A tree that contains a blob with the rogue name ".git/foobar" */ -void test_checkout_nasty__dotgit_path(void) -{ - test_checkout_fails("refs/heads/dotgit_path", ".git/foobar"); -} - -/* A tree that contains a blob with the rogue name ".GIT/foobar" */ -void test_checkout_nasty__dotcapitalgit_path(void) -{ - test_checkout_fails("refs/heads/dotcapitalgit_path", ".GIT/foobar"); -} - -/* A tree that contains a blob with the rogue name "./.git/foobar" */ -void test_checkout_nasty__dot_dotgit_path(void) -{ - test_checkout_fails("refs/heads/dot_dotgit_path", ".git/foobar"); -} - -/* A tree that contains a blob with the rogue name "./.GIT/foobar" */ -void test_checkout_nasty__dot_dotcapitalgit_path(void) -{ - test_checkout_fails("refs/heads/dot_dotcapitalgit_path", ".GIT/foobar"); -} - -/* A tree that contains a blob with the rogue name "foo/../.git/foobar" */ -void test_checkout_nasty__dotdot_dotgit_path(void) -{ - test_checkout_fails("refs/heads/dotdot_dotgit_path", ".git/foobar"); -} - -/* A tree that contains a blob with the rogue name "foo/../.GIT/foobar" */ -void test_checkout_nasty__dotdot_dotcapitalgit_path(void) -{ - test_checkout_fails("refs/heads/dotdot_dotcapitalgit_path", ".GIT/foobar"); -} - -/* A tree that contains a blob with the rogue name "foo/." */ -void test_checkout_nasty__dot_path(void) -{ - test_checkout_fails("refs/heads/dot_path", "./foobar"); -} - -/* A tree that contains a blob with the rogue name "foo/." */ -void test_checkout_nasty__dot_path_two(void) -{ - test_checkout_fails("refs/heads/dot_path_two", "foo/."); -} - -/* A tree that contains a blob with the rogue name "foo/../foobar" */ -void test_checkout_nasty__dotdot_path(void) -{ - test_checkout_fails("refs/heads/dotdot_path", "foobar"); -} - -/* A tree that contains an entry with a backslash ".git\foobar" */ -void test_checkout_nasty__dotgit_backslash_path(void) -{ -#ifdef GIT_WIN32 - test_checkout_fails("refs/heads/dotgit_backslash_path", ".git/foobar"); -#endif -} - -/* A tree that contains an entry with a backslash ".GIT\foobar" */ -void test_checkout_nasty__dotcapitalgit_backslash_path(void) -{ -#ifdef GIT_WIN32 - test_checkout_fails("refs/heads/dotcapitalgit_backslash_path", ".GIT/foobar"); -#endif -} - -/* A tree that contains an entry with a backslash ".\.GIT\foobar" */ -void test_checkout_nasty__dot_backslash_dotcapitalgit_path(void) -{ -#ifdef GIT_WIN32 - test_checkout_fails("refs/heads/dot_backslash_dotcapitalgit_path", ".GIT/foobar"); -#endif -} - -/* A tree that contains an entry ".git.", because Win32 APIs will drop the - * trailing slash. - */ -void test_checkout_nasty__dot_git_dot(void) -{ -#ifdef GIT_WIN32 - test_checkout_fails("refs/heads/dot_git_dot", ".git/foobar"); -#endif -} - -/* A tree that contains an entry "git~1", because that is typically the - * short name for ".git". - */ -void test_checkout_nasty__git_tilde1(void) -{ -#ifdef GIT_WIN32 - test_checkout_fails("refs/heads/git_tilde1", ".git/foobar"); -#endif -} - -/* A tree that contains an entry "git~2", when we have forced the short - * name for ".git" into "GIT~2". - */ -void test_checkout_nasty__git_custom_shortname(void) -{ -#ifdef GIT_WIN32 - if (!cl_sandbox_supports_8dot3()) - clar__skip(); - - cl_must_pass(p_rename("nasty/.git", "nasty/_temp")); - cl_git_write2file("nasty/git~1", "", 0, O_RDWR|O_CREAT, 0666); - cl_must_pass(p_rename("nasty/_temp", "nasty/.git")); - test_checkout_fails("refs/heads/git_tilde2", ".git/foobar"); -#endif -} - -/* A tree that contains an entry "git~3", which should be allowed, since - * it is not the typical short name ("GIT~1") or the actual short name - * ("GIT~2") for ".git". - */ -void test_checkout_nasty__only_looks_like_a_git_shortname(void) -{ -#ifdef GIT_WIN32 - git_oid commit_id; - git_commit *commit; - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - - cl_must_pass(p_rename("nasty/.git", "nasty/_temp")); - cl_git_write2file("nasty/git~1", "", 0, O_RDWR|O_CREAT, 0666); - cl_must_pass(p_rename("nasty/_temp", "nasty/.git")); - - cl_git_pass(git_reference_name_to_id(&commit_id, repo, "refs/heads/git_tilde3")); - cl_git_pass(git_commit_lookup(&commit, repo, &commit_id)); - - opts.checkout_strategy = GIT_CHECKOUT_FORCE; - - cl_git_pass(git_checkout_tree(repo, (const git_object *)commit, &opts)); - cl_assert(git_path_exists("nasty/git~3/foobar")); - - git_commit_free(commit); -#endif -} - -/* A tree that contains an entry "git:", because Win32 APIs will reject - * that as looking too similar to a drive letter. - */ -void test_checkout_nasty__dot_git_colon(void) -{ -#ifdef GIT_WIN32 - test_checkout_fails("refs/heads/dot_git_colon", ".git/foobar"); -#endif -} - -/* A tree that contains an entry "git:foo", because Win32 APIs will turn - * that into ".git". - */ -void test_checkout_nasty__dot_git_colon_stuff(void) -{ -#ifdef GIT_WIN32 - test_checkout_fails("refs/heads/dot_git_colon_stuff", ".git/foobar"); -#endif -} - -/* Trees that contains entries with a tree ".git" that contain - * byte sequences: - * { 0xe2, 0x80, 0x8c } - * { 0xe2, 0x80, 0x8d } - * { 0xe2, 0x80, 0x8e } - * { 0xe2, 0x80, 0x8f } - * { 0xe2, 0x80, 0xaa } - * { 0xe2, 0x80, 0xab } - * { 0xe2, 0x80, 0xac } - * { 0xe2, 0x80, 0xad } - * { 0xe2, 0x81, 0xae } - * { 0xe2, 0x81, 0xaa } - * { 0xe2, 0x81, 0xab } - * { 0xe2, 0x81, 0xac } - * { 0xe2, 0x81, 0xad } - * { 0xe2, 0x81, 0xae } - * { 0xe2, 0x81, 0xaf } - * { 0xef, 0xbb, 0xbf } - * Because these map to characters that HFS filesystems "ignore". Thus - * ".git" will map to ".git". - */ -void test_checkout_nasty__dot_git_hfs_ignorable(void) -{ -#ifdef __APPLE__ - test_checkout_fails("refs/heads/dotgit_hfs_ignorable_1", ".git/foobar"); - test_checkout_fails("refs/heads/dotgit_hfs_ignorable_2", ".git/foobar"); - test_checkout_fails("refs/heads/dotgit_hfs_ignorable_3", ".git/foobar"); - test_checkout_fails("refs/heads/dotgit_hfs_ignorable_4", ".git/foobar"); - test_checkout_fails("refs/heads/dotgit_hfs_ignorable_5", ".git/foobar"); - test_checkout_fails("refs/heads/dotgit_hfs_ignorable_6", ".git/foobar"); - test_checkout_fails("refs/heads/dotgit_hfs_ignorable_7", ".git/foobar"); - test_checkout_fails("refs/heads/dotgit_hfs_ignorable_8", ".git/foobar"); - test_checkout_fails("refs/heads/dotgit_hfs_ignorable_9", ".git/foobar"); - test_checkout_fails("refs/heads/dotgit_hfs_ignorable_10", ".git/foobar"); - test_checkout_fails("refs/heads/dotgit_hfs_ignorable_11", ".git/foobar"); - test_checkout_fails("refs/heads/dotgit_hfs_ignorable_12", ".git/foobar"); - test_checkout_fails("refs/heads/dotgit_hfs_ignorable_13", ".git/foobar"); - test_checkout_fails("refs/heads/dotgit_hfs_ignorable_14", ".git/foobar"); - test_checkout_fails("refs/heads/dotgit_hfs_ignorable_15", ".git/foobar"); - test_checkout_fails("refs/heads/dotgit_hfs_ignorable_16", ".git/foobar"); -#endif -} - -void test_checkout_nasty__honors_core_protecthfs(void) -{ - cl_repo_set_bool(repo, "core.protectHFS", true); - - test_checkout_fails("refs/heads/dotgit_hfs_ignorable_1", ".git/foobar"); - test_checkout_fails("refs/heads/dotgit_hfs_ignorable_2", ".git/foobar"); - test_checkout_fails("refs/heads/dotgit_hfs_ignorable_3", ".git/foobar"); - test_checkout_fails("refs/heads/dotgit_hfs_ignorable_4", ".git/foobar"); - test_checkout_fails("refs/heads/dotgit_hfs_ignorable_5", ".git/foobar"); - test_checkout_fails("refs/heads/dotgit_hfs_ignorable_6", ".git/foobar"); - test_checkout_fails("refs/heads/dotgit_hfs_ignorable_7", ".git/foobar"); - test_checkout_fails("refs/heads/dotgit_hfs_ignorable_8", ".git/foobar"); - test_checkout_fails("refs/heads/dotgit_hfs_ignorable_9", ".git/foobar"); - test_checkout_fails("refs/heads/dotgit_hfs_ignorable_10", ".git/foobar"); - test_checkout_fails("refs/heads/dotgit_hfs_ignorable_11", ".git/foobar"); - test_checkout_fails("refs/heads/dotgit_hfs_ignorable_12", ".git/foobar"); - test_checkout_fails("refs/heads/dotgit_hfs_ignorable_13", ".git/foobar"); - test_checkout_fails("refs/heads/dotgit_hfs_ignorable_14", ".git/foobar"); - test_checkout_fails("refs/heads/dotgit_hfs_ignorable_15", ".git/foobar"); - test_checkout_fails("refs/heads/dotgit_hfs_ignorable_16", ".git/foobar"); -} - -void test_checkout_nasty__honors_core_protectntfs(void) -{ - cl_repo_set_bool(repo, "core.protectNTFS", true); - - test_checkout_fails("refs/heads/dotgit_backslash_path", ".git/foobar"); - test_checkout_fails("refs/heads/dotcapitalgit_backslash_path", ".GIT/foobar"); - test_checkout_fails("refs/heads/dot_git_dot", ".git/foobar"); - test_checkout_fails("refs/heads/git_tilde1", ".git/foobar"); -} - -void test_checkout_nasty__symlink1(void) -{ - test_checkout_passes("refs/heads/symlink1", ".git/foobar"); -} - -void test_checkout_nasty__symlink2(void) -{ - test_checkout_passes("refs/heads/symlink2", ".git/foobar"); -} - -void test_checkout_nasty__symlink3(void) -{ - test_checkout_passes("refs/heads/symlink3", ".git/foobar"); -} - diff --git a/vendor/libgit2/tests/checkout/tree.c b/vendor/libgit2/tests/checkout/tree.c deleted file mode 100644 index be4019822f..0000000000 --- a/vendor/libgit2/tests/checkout/tree.c +++ /dev/null @@ -1,1340 +0,0 @@ -#include "clar_libgit2.h" -#include "checkout_helpers.h" - -#include "git2/checkout.h" -#include "repository.h" -#include "buffer.h" -#include "fileops.h" - -static git_repository *g_repo; -static git_checkout_options g_opts; -static git_object *g_object; - -void test_checkout_tree__initialize(void) -{ - g_repo = cl_git_sandbox_init("testrepo"); - - GIT_INIT_STRUCTURE(&g_opts, GIT_CHECKOUT_OPTIONS_VERSION); - g_opts.checkout_strategy = GIT_CHECKOUT_FORCE; -} - -void test_checkout_tree__cleanup(void) -{ - git_object_free(g_object); - g_object = NULL; - - cl_git_sandbox_cleanup(); - - if (git_path_isdir("alternative")) - git_futils_rmdir_r("alternative", NULL, GIT_RMDIR_REMOVE_FILES); -} - -void test_checkout_tree__cannot_checkout_a_non_treeish(void) -{ - /* blob */ - cl_git_pass(git_revparse_single(&g_object, g_repo, "a71586c1dfe8a71c6cbf6c129f404c5642ff31bd")); - cl_git_fail(git_checkout_tree(g_repo, g_object, NULL)); -} - -void test_checkout_tree__can_checkout_a_subdirectory_from_a_commit(void) -{ - char *entries[] = { "ab/de/" }; - - g_opts.paths.strings = entries; - g_opts.paths.count = 1; - - cl_git_pass(git_revparse_single(&g_object, g_repo, "subtrees")); - - cl_assert_equal_i(false, git_path_isdir("./testrepo/ab/")); - - cl_git_pass(git_checkout_tree(g_repo, g_object, &g_opts)); - - cl_assert_equal_i(true, git_path_isfile("./testrepo/ab/de/2.txt")); - cl_assert_equal_i(true, git_path_isfile("./testrepo/ab/de/fgh/1.txt")); -} - -void test_checkout_tree__can_checkout_and_remove_directory(void) -{ - cl_assert_equal_i(false, git_path_isdir("./testrepo/ab/")); - - /* Checkout brach "subtrees" and update HEAD, so that HEAD matches the - * current working tree - */ - cl_git_pass(git_revparse_single(&g_object, g_repo, "subtrees")); - cl_git_pass(git_checkout_tree(g_repo, g_object, &g_opts)); - - cl_git_pass(git_repository_set_head(g_repo, "refs/heads/subtrees")); - - cl_assert_equal_i(true, git_path_isdir("./testrepo/ab/")); - cl_assert_equal_i(true, git_path_isfile("./testrepo/ab/de/2.txt")); - cl_assert_equal_i(true, git_path_isfile("./testrepo/ab/de/fgh/1.txt")); - - git_object_free(g_object); - g_object = NULL; - - /* Checkout brach "master" and update HEAD, so that HEAD matches the - * current working tree - */ - cl_git_pass(git_revparse_single(&g_object, g_repo, "master")); - cl_git_pass(git_checkout_tree(g_repo, g_object, &g_opts)); - - cl_git_pass(git_repository_set_head(g_repo, "refs/heads/master")); - - /* This directory should no longer exist */ - cl_assert_equal_i(false, git_path_isdir("./testrepo/ab/")); -} - -void test_checkout_tree__can_checkout_a_subdirectory_from_a_subtree(void) -{ - char *entries[] = { "de/" }; - - g_opts.paths.strings = entries; - g_opts.paths.count = 1; - - cl_git_pass(git_revparse_single(&g_object, g_repo, "subtrees:ab")); - - cl_assert_equal_i(false, git_path_isdir("./testrepo/de/")); - - cl_git_pass(git_checkout_tree(g_repo, g_object, &g_opts)); - - cl_assert_equal_i(true, git_path_isfile("./testrepo/de/2.txt")); - cl_assert_equal_i(true, git_path_isfile("./testrepo/de/fgh/1.txt")); -} - -static void progress(const char *path, size_t cur, size_t tot, void *payload) -{ - bool *was_called = (bool*)payload; - GIT_UNUSED(path); GIT_UNUSED(cur); GIT_UNUSED(tot); - *was_called = true; -} - -void test_checkout_tree__calls_progress_callback(void) -{ - bool was_called = 0; - - g_opts.progress_cb = progress; - g_opts.progress_payload = &was_called; - - cl_git_pass(git_revparse_single(&g_object, g_repo, "master")); - - cl_git_pass(git_checkout_tree(g_repo, g_object, &g_opts)); - - cl_assert_equal_i(was_called, true); -} - -void test_checkout_tree__doesnt_write_unrequested_files_to_worktree(void) -{ - git_oid master_oid; - git_oid chomped_oid; - git_commit* p_master_commit; - git_commit* p_chomped_commit; - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - - git_oid_fromstr(&master_oid, "a65fedf39aefe402d3bb6e24df4d4f5fe4547750"); - git_oid_fromstr(&chomped_oid, "e90810b8df3e80c413d903f631643c716887138d"); - cl_git_pass(git_commit_lookup(&p_master_commit, g_repo, &master_oid)); - cl_git_pass(git_commit_lookup(&p_chomped_commit, g_repo, &chomped_oid)); - - /* GIT_CHECKOUT_NONE should not add any file to the working tree from the - * index as it is supposed to be a dry run. - */ - opts.checkout_strategy = GIT_CHECKOUT_NONE; - git_checkout_tree(g_repo, (git_object*)p_chomped_commit, &opts); - cl_assert_equal_i(false, git_path_isfile("testrepo/readme.txt")); - - git_commit_free(p_master_commit); - git_commit_free(p_chomped_commit); -} - -void test_checkout_tree__can_switch_branches(void) -{ - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - git_oid oid; - git_object *obj = NULL; - - assert_on_branch(g_repo, "master"); - - /* do first checkout with FORCE because we don't know if testrepo - * base data is clean for a checkout or not - */ - opts.checkout_strategy = GIT_CHECKOUT_FORCE; - - cl_git_pass(git_reference_name_to_id(&oid, g_repo, "refs/heads/dir")); - cl_git_pass(git_object_lookup(&obj, g_repo, &oid, GIT_OBJ_ANY)); - - cl_git_pass(git_checkout_tree(g_repo, obj, &opts)); - cl_git_pass(git_repository_set_head(g_repo, "refs/heads/dir")); - - cl_assert(git_path_isfile("testrepo/README")); - cl_assert(git_path_isfile("testrepo/branch_file.txt")); - cl_assert(git_path_isfile("testrepo/new.txt")); - cl_assert(git_path_isfile("testrepo/a/b.txt")); - - cl_assert(!git_path_isdir("testrepo/ab")); - - assert_on_branch(g_repo, "dir"); - - git_object_free(obj); - - /* do second checkout safe because we should be clean after first */ - opts.checkout_strategy = GIT_CHECKOUT_SAFE; - - cl_git_pass(git_reference_name_to_id(&oid, g_repo, "refs/heads/subtrees")); - cl_git_pass(git_object_lookup(&obj, g_repo, &oid, GIT_OBJ_ANY)); - - cl_git_pass(git_checkout_tree(g_repo, obj, &opts)); - cl_git_pass(git_repository_set_head(g_repo, "refs/heads/subtrees")); - - cl_assert(git_path_isfile("testrepo/README")); - cl_assert(git_path_isfile("testrepo/branch_file.txt")); - cl_assert(git_path_isfile("testrepo/new.txt")); - cl_assert(git_path_isfile("testrepo/ab/4.txt")); - cl_assert(git_path_isfile("testrepo/ab/c/3.txt")); - cl_assert(git_path_isfile("testrepo/ab/de/2.txt")); - cl_assert(git_path_isfile("testrepo/ab/de/fgh/1.txt")); - - cl_assert(!git_path_isdir("testrepo/a")); - - assert_on_branch(g_repo, "subtrees"); - - git_object_free(obj); -} - -void test_checkout_tree__can_remove_untracked(void) -{ - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - - opts.checkout_strategy = GIT_CHECKOUT_SAFE | GIT_CHECKOUT_REMOVE_UNTRACKED; - - cl_git_mkfile("testrepo/untracked_file", "as you wish"); - cl_assert(git_path_isfile("testrepo/untracked_file")); - - cl_git_pass(git_checkout_head(g_repo, &opts)); - - cl_assert(!git_path_isfile("testrepo/untracked_file")); -} - -void test_checkout_tree__can_remove_ignored(void) -{ - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - int ignored = 0; - - opts.checkout_strategy = GIT_CHECKOUT_SAFE | GIT_CHECKOUT_REMOVE_IGNORED; - - cl_git_mkfile("testrepo/ignored_file", "as you wish"); - - cl_git_pass(git_ignore_add_rule(g_repo, "ignored_file\n")); - - cl_git_pass(git_ignore_path_is_ignored(&ignored, g_repo, "ignored_file")); - cl_assert_equal_i(1, ignored); - - cl_assert(git_path_isfile("testrepo/ignored_file")); - - cl_git_pass(git_checkout_head(g_repo, &opts)); - - cl_assert(!git_path_isfile("testrepo/ignored_file")); -} - -static int checkout_tree_with_blob_ignored_in_workdir(int strategy, bool isdir) -{ - git_oid oid; - git_object *obj = NULL; - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - int ignored = 0, error; - - assert_on_branch(g_repo, "master"); - - /* do first checkout with FORCE because we don't know if testrepo - * base data is clean for a checkout or not - */ - opts.checkout_strategy = GIT_CHECKOUT_FORCE; - - cl_git_pass(git_reference_name_to_id(&oid, g_repo, "refs/heads/dir")); - cl_git_pass(git_object_lookup(&obj, g_repo, &oid, GIT_OBJ_ANY)); - - cl_git_pass(git_checkout_tree(g_repo, obj, &opts)); - cl_git_pass(git_repository_set_head(g_repo, "refs/heads/dir")); - - cl_assert(git_path_isfile("testrepo/README")); - cl_assert(git_path_isfile("testrepo/branch_file.txt")); - cl_assert(git_path_isfile("testrepo/new.txt")); - cl_assert(git_path_isfile("testrepo/a/b.txt")); - - cl_assert(!git_path_isdir("testrepo/ab")); - - assert_on_branch(g_repo, "dir"); - - git_object_free(obj); - - opts.checkout_strategy = strategy; - - if (isdir) { - cl_must_pass(p_mkdir("testrepo/ab", 0777)); - cl_must_pass(p_mkdir("testrepo/ab/4.txt", 0777)); - - cl_git_mkfile("testrepo/ab/4.txt/file1.txt", "as you wish"); - cl_git_mkfile("testrepo/ab/4.txt/file2.txt", "foo bar foo"); - cl_git_mkfile("testrepo/ab/4.txt/file3.txt", "inky blinky pinky clyde"); - - cl_assert(git_path_isdir("testrepo/ab/4.txt")); - } else { - cl_must_pass(p_mkdir("testrepo/ab", 0777)); - cl_git_mkfile("testrepo/ab/4.txt", "as you wish"); - - cl_assert(git_path_isfile("testrepo/ab/4.txt")); - } - - cl_git_pass(git_ignore_add_rule(g_repo, "ab/4.txt\n")); - - cl_git_pass(git_ignore_path_is_ignored(&ignored, g_repo, "ab/4.txt")); - cl_assert_equal_i(1, ignored); - - cl_git_pass(git_reference_name_to_id(&oid, g_repo, "refs/heads/subtrees")); - cl_git_pass(git_object_lookup(&obj, g_repo, &oid, GIT_OBJ_ANY)); - - error = git_checkout_tree(g_repo, obj, &opts); - - git_object_free(obj); - - return error; -} - -void test_checkout_tree__conflict_on_ignored_when_not_overwriting(void) -{ - int error; - - cl_git_fail(error = checkout_tree_with_blob_ignored_in_workdir( - GIT_CHECKOUT_SAFE | GIT_CHECKOUT_DONT_OVERWRITE_IGNORED, false)); - - cl_assert_equal_i(GIT_ECONFLICT, error); -} - -void test_checkout_tree__can_overwrite_ignored_by_default(void) -{ - cl_git_pass(checkout_tree_with_blob_ignored_in_workdir(GIT_CHECKOUT_SAFE, false)); - - cl_git_pass(git_repository_set_head(g_repo, "refs/heads/subtrees")); - - cl_assert(git_path_isfile("testrepo/ab/4.txt")); - - assert_on_branch(g_repo, "subtrees"); -} - -void test_checkout_tree__conflict_on_ignored_folder_when_not_overwriting(void) -{ - int error; - - cl_git_fail(error = checkout_tree_with_blob_ignored_in_workdir( - GIT_CHECKOUT_SAFE | GIT_CHECKOUT_DONT_OVERWRITE_IGNORED, true)); - - cl_assert_equal_i(GIT_ECONFLICT, error); -} - -void test_checkout_tree__can_overwrite_ignored_folder_by_default(void) -{ - cl_git_pass(checkout_tree_with_blob_ignored_in_workdir(GIT_CHECKOUT_SAFE, true)); - - cl_git_pass(git_repository_set_head(g_repo, "refs/heads/subtrees")); - - cl_assert(git_path_isfile("testrepo/ab/4.txt")); - - assert_on_branch(g_repo, "subtrees"); - -} - -void test_checkout_tree__can_update_only(void) -{ - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - git_oid oid; - git_object *obj = NULL; - - /* first let's get things into a known state - by checkout out the HEAD */ - - assert_on_branch(g_repo, "master"); - - opts.checkout_strategy = GIT_CHECKOUT_FORCE; - cl_git_pass(git_checkout_head(g_repo, &opts)); - - cl_assert(!git_path_isdir("testrepo/a")); - - check_file_contents_nocr("testrepo/branch_file.txt", "hi\nbye!\n"); - - /* now checkout branch but with update only */ - - opts.checkout_strategy = GIT_CHECKOUT_SAFE | GIT_CHECKOUT_UPDATE_ONLY; - - cl_git_pass(git_reference_name_to_id(&oid, g_repo, "refs/heads/dir")); - cl_git_pass(git_object_lookup(&obj, g_repo, &oid, GIT_OBJ_ANY)); - - cl_git_pass(git_checkout_tree(g_repo, obj, &opts)); - cl_git_pass(git_repository_set_head(g_repo, "refs/heads/dir")); - - assert_on_branch(g_repo, "dir"); - - /* this normally would have been created (which was tested separately in - * the test_checkout_tree__can_switch_branches test), but with - * UPDATE_ONLY it will not have been created. - */ - cl_assert(!git_path_isdir("testrepo/a")); - - /* but this file still should have been updated */ - check_file_contents_nocr("testrepo/branch_file.txt", "hi\n"); - - git_object_free(obj); -} - -void test_checkout_tree__can_checkout_with_pattern(void) -{ - char *entries[] = { "[l-z]*.txt" }; - - /* reset to beginning of history (i.e. just a README file) */ - - g_opts.checkout_strategy = - GIT_CHECKOUT_FORCE | GIT_CHECKOUT_REMOVE_UNTRACKED; - - cl_git_pass(git_revparse_single(&g_object, g_repo, "8496071c1b46c854b31185ea97743be6a8774479")); - - cl_git_pass(git_checkout_tree(g_repo, g_object, &g_opts)); - cl_git_pass( - git_repository_set_head_detached(g_repo, git_object_id(g_object))); - - git_object_free(g_object); - g_object = NULL; - - cl_assert(git_path_exists("testrepo/README")); - cl_assert(!git_path_exists("testrepo/branch_file.txt")); - cl_assert(!git_path_exists("testrepo/link_to_new.txt")); - cl_assert(!git_path_exists("testrepo/new.txt")); - - /* now to a narrow patterned checkout */ - - g_opts.checkout_strategy = GIT_CHECKOUT_SAFE; - g_opts.paths.strings = entries; - g_opts.paths.count = 1; - - cl_git_pass(git_revparse_single(&g_object, g_repo, "refs/heads/master")); - - cl_git_pass(git_checkout_tree(g_repo, g_object, &g_opts)); - - cl_assert(git_path_exists("testrepo/README")); - cl_assert(!git_path_exists("testrepo/branch_file.txt")); - cl_assert(git_path_exists("testrepo/link_to_new.txt")); - cl_assert(git_path_exists("testrepo/new.txt")); -} - -void test_checkout_tree__can_disable_pattern_match(void) -{ - char *entries[] = { "b*.txt" }; - - /* reset to beginning of history (i.e. just a README file) */ - - g_opts.checkout_strategy = - GIT_CHECKOUT_FORCE | GIT_CHECKOUT_REMOVE_UNTRACKED; - - cl_git_pass(git_revparse_single(&g_object, g_repo, "8496071c1b46c854b31185ea97743be6a8774479")); - - cl_git_pass(git_checkout_tree(g_repo, g_object, &g_opts)); - cl_git_pass( - git_repository_set_head_detached(g_repo, git_object_id(g_object))); - - git_object_free(g_object); - g_object = NULL; - - cl_assert(!git_path_isfile("testrepo/branch_file.txt")); - - /* now to a narrow patterned checkout, but disable pattern */ - - g_opts.checkout_strategy = - GIT_CHECKOUT_SAFE | - GIT_CHECKOUT_DISABLE_PATHSPEC_MATCH; - g_opts.paths.strings = entries; - g_opts.paths.count = 1; - - cl_git_pass(git_revparse_single(&g_object, g_repo, "refs/heads/master")); - - cl_git_pass(git_checkout_tree(g_repo, g_object, &g_opts)); - - cl_assert(!git_path_isfile("testrepo/branch_file.txt")); - - /* let's try that again, but allow the pattern match */ - - g_opts.checkout_strategy = GIT_CHECKOUT_SAFE; - - cl_git_pass(git_checkout_tree(g_repo, g_object, &g_opts)); - - cl_assert(git_path_isfile("testrepo/branch_file.txt")); -} - -void assert_conflict( - const char *entry_path, - const char *new_content, - const char *parent_sha, - const char *commit_sha) -{ - git_index *index; - git_object *hack_tree; - git_reference *branch, *head; - git_buf file_path = GIT_BUF_INIT; - - cl_git_pass(git_repository_index(&index, g_repo)); - - /* Create a branch pointing at the parent */ - cl_git_pass(git_revparse_single(&g_object, g_repo, parent_sha)); - cl_git_pass(git_branch_create(&branch, g_repo, - "potential_conflict", (git_commit *)g_object, 0)); - - /* Make HEAD point to this branch */ - cl_git_pass(git_reference_symbolic_create( - &head, g_repo, "HEAD", git_reference_name(branch), 1, NULL)); - git_reference_free(head); - git_reference_free(branch); - - /* Checkout the parent */ - g_opts.checkout_strategy = GIT_CHECKOUT_FORCE; - cl_git_pass(git_checkout_tree(g_repo, g_object, &g_opts)); - - /* Hack-ishy workaound to ensure *all* the index entries - * match the content of the tree - */ - cl_git_pass(git_object_peel(&hack_tree, g_object, GIT_OBJ_TREE)); - cl_git_pass(git_index_read_tree(index, (git_tree *)hack_tree)); - git_object_free(hack_tree); - git_object_free(g_object); - g_object = NULL; - - /* Create a conflicting file */ - cl_git_pass(git_buf_joinpath(&file_path, "./testrepo", entry_path)); - cl_git_mkfile(git_buf_cstr(&file_path), new_content); - git_buf_free(&file_path); - - /* Trying to checkout the original commit */ - cl_git_pass(git_revparse_single(&g_object, g_repo, commit_sha)); - - g_opts.checkout_strategy = GIT_CHECKOUT_SAFE; - cl_assert_equal_i( - GIT_ECONFLICT, git_checkout_tree(g_repo, g_object, &g_opts)); - - /* Stage the conflicting change */ - cl_git_pass(git_index_add_bypath(index, entry_path)); - cl_git_pass(git_index_write(index)); - git_index_free(index); - - cl_assert_equal_i( - GIT_ECONFLICT, git_checkout_tree(g_repo, g_object, &g_opts)); -} - -void test_checkout_tree__checking_out_a_conflicting_type_change_returns_ECONFLICT(void) -{ - /* - * 099faba adds a symlink named 'link_to_new.txt' - * a65fedf is the parent of 099faba - */ - - assert_conflict("link_to_new.txt", "old.txt", "a65fedf", "099faba"); -} - -void test_checkout_tree__checking_out_a_conflicting_type_change_returns_ECONFLICT_2(void) -{ - /* - * cf80f8d adds a directory named 'a/' - * a4a7dce is the parent of cf80f8d - */ - - assert_conflict("a", "hello\n", "a4a7dce", "cf80f8d"); -} - -void test_checkout_tree__checking_out_a_conflicting_content_change_returns_ECONFLICT(void) -{ - /* - * c47800c adds a symlink named 'branch_file.txt' - * 5b5b025 is the parent of 763d71a - */ - - assert_conflict("branch_file.txt", "hello\n", "5b5b025", "c47800c"); -} - -void test_checkout_tree__donot_update_deleted_file_by_default(void) -{ - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - git_oid old_id, new_id; - git_commit *old_commit = NULL, *new_commit = NULL; - git_index *index = NULL; - checkout_counts ct; - - opts.checkout_strategy = GIT_CHECKOUT_SAFE; - - memset(&ct, 0, sizeof(ct)); - opts.notify_flags = GIT_CHECKOUT_NOTIFY_ALL; - opts.notify_cb = checkout_count_callback; - opts.notify_payload = &ct; - - cl_git_pass(git_repository_index(&index, g_repo)); - - cl_git_pass(git_oid_fromstr(&old_id, "be3563ae3f795b2b4353bcce3a527ad0a4f7f644")); - cl_git_pass(git_commit_lookup(&old_commit, g_repo, &old_id)); - cl_git_pass(git_reset(g_repo, (git_object *)old_commit, GIT_RESET_HARD, NULL)); - - cl_git_pass(p_unlink("testrepo/branch_file.txt")); - cl_git_pass(git_index_remove_bypath(index ,"branch_file.txt")); - cl_git_pass(git_index_write(index)); - - cl_assert(!git_path_exists("testrepo/branch_file.txt")); - - cl_git_pass(git_oid_fromstr(&new_id, "099fabac3a9ea935598528c27f866e34089c2eff")); - cl_git_pass(git_commit_lookup(&new_commit, g_repo, &new_id)); - - - cl_git_fail(git_checkout_tree(g_repo, (git_object *)new_commit, &opts)); - - cl_assert_equal_i(1, ct.n_conflicts); - cl_assert_equal_i(1, ct.n_updates); - - git_commit_free(old_commit); - git_commit_free(new_commit); - git_index_free(index); -} - -struct checkout_cancel_at { - const char *filename; - int error; - int count; -}; - -static int checkout_cancel_cb( - git_checkout_notify_t why, - const char *path, - const git_diff_file *b, - const git_diff_file *t, - const git_diff_file *w, - void *payload) -{ - struct checkout_cancel_at *ca = payload; - - GIT_UNUSED(why); GIT_UNUSED(b); GIT_UNUSED(t); GIT_UNUSED(w); - - ca->count++; - - if (!strcmp(path, ca->filename)) - return ca->error; - - return 0; -} - -void test_checkout_tree__can_cancel_checkout_from_notify(void) -{ - struct checkout_cancel_at ca; - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - git_oid oid; - git_object *obj = NULL; - - assert_on_branch(g_repo, "master"); - - cl_git_pass(git_reference_name_to_id(&oid, g_repo, "refs/heads/dir")); - cl_git_pass(git_object_lookup(&obj, g_repo, &oid, GIT_OBJ_ANY)); - - ca.filename = "new.txt"; - ca.error = -5555; - ca.count = 0; - - opts.notify_flags = GIT_CHECKOUT_NOTIFY_UPDATED; - opts.notify_cb = checkout_cancel_cb; - opts.notify_payload = &ca; - opts.checkout_strategy = GIT_CHECKOUT_FORCE; - - cl_assert(!git_path_exists("testrepo/new.txt")); - - cl_git_fail_with(git_checkout_tree(g_repo, obj, &opts), -5555); - - cl_assert(!git_path_exists("testrepo/new.txt")); - - /* on case-insensitive FS = a/b.txt, branch_file.txt, new.txt */ - /* on case-sensitive FS = README, then above */ - - if (git_path_exists("testrepo/.git/CoNfIg")) /* case insensitive */ - cl_assert_equal_i(3, ca.count); - else - cl_assert_equal_i(4, ca.count); - - /* and again with a different stopping point and return code */ - ca.filename = "README"; - ca.error = 123; - ca.count = 0; - - cl_git_fail_with(git_checkout_tree(g_repo, obj, &opts), 123); - - cl_assert(!git_path_exists("testrepo/new.txt")); - - if (git_path_exists("testrepo/.git/CoNfIg")) /* case insensitive */ - cl_assert_equal_i(4, ca.count); - else - cl_assert_equal_i(1, ca.count); - - git_object_free(obj); -} - -void test_checkout_tree__can_checkout_with_last_workdir_item_missing(void) -{ - git_index *index = NULL; - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - git_oid tree_id, commit_id; - git_tree *tree = NULL; - git_commit *commit = NULL; - - git_repository_index(&index, g_repo); - - opts.checkout_strategy = GIT_CHECKOUT_FORCE; - - cl_git_pass(git_reference_name_to_id(&commit_id, g_repo, "refs/heads/master")); - cl_git_pass(git_commit_lookup(&commit, g_repo, &commit_id)); - - cl_git_pass(git_checkout_tree(g_repo, (git_object *)commit, &opts)); - cl_git_pass(git_repository_set_head(g_repo, "refs/heads/master")); - - cl_git_pass(p_mkdir("./testrepo/this-is-dir", 0777)); - cl_git_mkfile("./testrepo/this-is-dir/contained_file", "content\n"); - - cl_git_pass(git_index_add_bypath(index, "this-is-dir/contained_file")); - git_index_write_tree(&tree_id, index); - cl_git_pass(git_tree_lookup(&tree, g_repo, &tree_id)); - - cl_git_pass(p_unlink("./testrepo/this-is-dir/contained_file")); - - opts.checkout_strategy = GIT_CHECKOUT_SAFE; - - opts.checkout_strategy = 1; - git_checkout_tree(g_repo, (git_object *)tree, &opts); - - git_tree_free(tree); - git_commit_free(commit); - git_index_free(index); -} - -void test_checkout_tree__issue_1397(void) -{ - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - const char *partial_oid = "8a7ef04"; - git_object *tree = NULL; - - test_checkout_tree__cleanup(); /* cleanup default checkout */ - - g_repo = cl_git_sandbox_init("issue_1397"); - - cl_repo_set_bool(g_repo, "core.autocrlf", true); - - cl_git_pass(git_revparse_single(&tree, g_repo, partial_oid)); - - opts.checkout_strategy = GIT_CHECKOUT_FORCE; - - cl_git_pass(git_checkout_tree(g_repo, tree, &opts)); - - check_file_contents("./issue_1397/crlf_file.txt", "first line\r\nsecond line\r\nboth with crlf"); - - git_object_free(tree); -} - -void test_checkout_tree__can_write_to_empty_dirs(void) -{ - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - git_oid oid; - git_object *obj = NULL; - - assert_on_branch(g_repo, "master"); - - cl_git_pass(p_mkdir("testrepo/a", 0777)); - - /* do first checkout with FORCE because we don't know if testrepo - * base data is clean for a checkout or not - */ - opts.checkout_strategy = GIT_CHECKOUT_FORCE; - - cl_git_pass(git_reference_name_to_id(&oid, g_repo, "refs/heads/dir")); - cl_git_pass(git_object_lookup(&obj, g_repo, &oid, GIT_OBJ_ANY)); - - cl_git_pass(git_checkout_tree(g_repo, obj, &opts)); - - cl_assert(git_path_isfile("testrepo/a/b.txt")); - - git_object_free(obj); -} - -void test_checkout_tree__fails_when_dir_in_use(void) -{ -#ifdef GIT_WIN32 - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - git_oid oid; - git_object *obj = NULL; - - opts.checkout_strategy = GIT_CHECKOUT_FORCE; - - cl_git_pass(git_reference_name_to_id(&oid, g_repo, "refs/heads/dir")); - cl_git_pass(git_object_lookup(&obj, g_repo, &oid, GIT_OBJ_ANY)); - - cl_git_pass(git_checkout_tree(g_repo, obj, &opts)); - - cl_assert(git_path_isfile("testrepo/a/b.txt")); - - git_object_free(obj); - - cl_git_pass(p_chdir("testrepo/a")); - - cl_git_pass(git_reference_name_to_id(&oid, g_repo, "refs/heads/master")); - cl_git_pass(git_object_lookup(&obj, g_repo, &oid, GIT_OBJ_ANY)); - - cl_git_fail(git_checkout_tree(g_repo, obj, &opts)); - - cl_git_pass(p_chdir("../..")); - - cl_assert(git_path_is_empty_dir("testrepo/a")); - - git_object_free(obj); -#endif -} - -void test_checkout_tree__can_continue_when_dir_in_use(void) -{ -#ifdef GIT_WIN32 - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - git_oid oid; - git_object *obj = NULL; - - opts.checkout_strategy = GIT_CHECKOUT_FORCE | - GIT_CHECKOUT_SKIP_LOCKED_DIRECTORIES; - - cl_git_pass(git_reference_name_to_id(&oid, g_repo, "refs/heads/dir")); - cl_git_pass(git_object_lookup(&obj, g_repo, &oid, GIT_OBJ_ANY)); - - cl_git_pass(git_checkout_tree(g_repo, obj, &opts)); - - cl_assert(git_path_isfile("testrepo/a/b.txt")); - - git_object_free(obj); - - cl_git_pass(p_chdir("testrepo/a")); - - cl_git_pass(git_reference_name_to_id(&oid, g_repo, "refs/heads/master")); - cl_git_pass(git_object_lookup(&obj, g_repo, &oid, GIT_OBJ_ANY)); - - cl_git_pass(git_checkout_tree(g_repo, obj, &opts)); - - cl_git_pass(p_chdir("../..")); - - cl_assert(git_path_is_empty_dir("testrepo/a")); - - git_object_free(obj); -#endif -} - -void test_checkout_tree__target_directory_from_bare(void) -{ - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - git_oid oid; - checkout_counts cts; - memset(&cts, 0, sizeof(cts)); - - test_checkout_tree__cleanup(); /* cleanup default checkout */ - - g_repo = cl_git_sandbox_init("testrepo.git"); - cl_assert(git_repository_is_bare(g_repo)); - - opts.checkout_strategy = GIT_CHECKOUT_SAFE | - GIT_CHECKOUT_RECREATE_MISSING; - - opts.notify_flags = GIT_CHECKOUT_NOTIFY_ALL; - opts.notify_cb = checkout_count_callback; - opts.notify_payload = &cts; - - cl_git_pass(git_reference_name_to_id(&oid, g_repo, "HEAD")); - cl_git_pass(git_object_lookup(&g_object, g_repo, &oid, GIT_OBJ_ANY)); - - cl_git_fail(git_checkout_tree(g_repo, g_object, &opts)); - - opts.target_directory = "alternative"; - cl_assert(!git_path_isdir("alternative")); - - cl_git_pass(git_checkout_tree(g_repo, g_object, &opts)); - - cl_assert_equal_i(0, cts.n_untracked); - cl_assert_equal_i(0, cts.n_ignored); - cl_assert_equal_i(3, cts.n_updates); - - check_file_contents_nocr("./alternative/README", "hey there\n"); - check_file_contents_nocr("./alternative/branch_file.txt", "hi\nbye!\n"); - check_file_contents_nocr("./alternative/new.txt", "my new file\n"); - - cl_git_pass(git_futils_rmdir_r( - "alternative", NULL, GIT_RMDIR_REMOVE_FILES)); -} - -void test_checkout_tree__extremely_long_file_name(void) -{ - // A utf-8 string with 83 characters, but 249 bytes. - const char *longname = "\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97"; - char path[1024]; - - g_opts.checkout_strategy = GIT_CHECKOUT_FORCE; - cl_git_pass(git_revparse_single(&g_object, g_repo, "long-file-name")); - cl_git_pass(git_checkout_tree(g_repo, g_object, &g_opts)); - - sprintf(path, "testrepo/%s.txt", longname); - cl_assert(git_path_exists(path)); - - git_object_free(g_object); - cl_git_pass(git_revparse_single(&g_object, g_repo, "master")); - cl_git_pass(git_checkout_tree(g_repo, g_object, &g_opts)); - cl_assert(!git_path_exists(path)); -} - -static void create_conflict(const char *path) -{ - git_index *index; - git_index_entry entry; - - cl_git_pass(git_repository_index(&index, g_repo)); - - memset(&entry, 0x0, sizeof(git_index_entry)); - entry.mode = 0100644; - GIT_IDXENTRY_STAGE_SET(&entry, 1); - git_oid_fromstr(&entry.id, "d427e0b2e138501a3d15cc376077a3631e15bd46"); - entry.path = path; - cl_git_pass(git_index_add(index, &entry)); - - GIT_IDXENTRY_STAGE_SET(&entry, 2); - git_oid_fromstr(&entry.id, "ee3fa1b8c00aff7fe02065fdb50864bb0d932ccf"); - cl_git_pass(git_index_add(index, &entry)); - - GIT_IDXENTRY_STAGE_SET(&entry, 3); - git_oid_fromstr(&entry.id, "2bd0a343aeef7a2cf0d158478966a6e587ff3863"); - cl_git_pass(git_index_add(index, &entry)); - - git_index_write(index); - git_index_free(index); -} - -void test_checkout_tree__fails_when_conflicts_exist_in_index(void) -{ - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - git_oid oid; - git_object *obj = NULL; - - opts.checkout_strategy = GIT_CHECKOUT_SAFE; - - cl_git_pass(git_reference_name_to_id(&oid, g_repo, "HEAD")); - cl_git_pass(git_object_lookup(&obj, g_repo, &oid, GIT_OBJ_ANY)); - - create_conflict("conflicts.txt"); - - cl_git_fail(git_checkout_tree(g_repo, obj, &opts)); - - git_object_free(obj); -} - -void test_checkout_tree__filemode_preserved_in_index(void) -{ - git_oid executable_oid; - git_commit *commit; - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - git_index *index; - const git_index_entry *entry; - - opts.checkout_strategy = GIT_CHECKOUT_FORCE; - - cl_git_pass(git_repository_index(&index, g_repo)); - - /* test a freshly added executable */ - cl_git_pass(git_oid_fromstr(&executable_oid, "afe4393b2b2a965f06acf2ca9658eaa01e0cd6b6")); - cl_git_pass(git_commit_lookup(&commit, g_repo, &executable_oid)); - - cl_git_pass(git_checkout_tree(g_repo, (const git_object *)commit, &opts)); - cl_assert(entry = git_index_get_bypath(index, "executable.txt", 0)); - cl_assert_equal_i(0100755, entry->mode); - - git_commit_free(commit); - - - /* Now start with a commit which has a text file */ - cl_git_pass(git_oid_fromstr(&executable_oid, "cf80f8de9f1185bf3a05f993f6121880dd0cfbc9")); - cl_git_pass(git_commit_lookup(&commit, g_repo, &executable_oid)); - - cl_git_pass(git_checkout_tree(g_repo, (const git_object *)commit, &opts)); - cl_assert(entry = git_index_get_bypath(index, "a/b.txt", 0)); - cl_assert_equal_i(0100644, entry->mode); - - git_commit_free(commit); - - - /* And then check out to a commit which converts the text file to an executable */ - cl_git_pass(git_oid_fromstr(&executable_oid, "144344043ba4d4a405da03de3844aa829ae8be0e")); - cl_git_pass(git_commit_lookup(&commit, g_repo, &executable_oid)); - - cl_git_pass(git_checkout_tree(g_repo, (const git_object *)commit, &opts)); - cl_assert(entry = git_index_get_bypath(index, "a/b.txt", 0)); - cl_assert_equal_i(0100755, entry->mode); - - git_commit_free(commit); - - - git_index_free(index); -} - -void test_checkout_tree__removes_conflicts(void) -{ - git_oid commit_id; - git_commit *commit; - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - git_index *index; - - cl_git_pass(git_oid_fromstr(&commit_id, "afe4393b2b2a965f06acf2ca9658eaa01e0cd6b6")); - cl_git_pass(git_commit_lookup(&commit, g_repo, &commit_id)); - - opts.checkout_strategy = GIT_CHECKOUT_FORCE; - - cl_git_pass(git_checkout_tree(g_repo, (const git_object *)commit, &opts)); - - cl_git_pass(git_repository_index(&index, g_repo)); - cl_git_pass(git_index_remove(index, "executable.txt", 0)); - - create_conflict("executable.txt"); - cl_git_mkfile("testrepo/executable.txt", "This is the conflict file.\n"); - - create_conflict("other.txt"); - cl_git_mkfile("testrepo/other.txt", "This is another conflict file.\n"); - - git_index_write(index); - - cl_git_pass(git_checkout_tree(g_repo, (const git_object *)commit, &opts)); - - cl_assert_equal_p(NULL, git_index_get_bypath(index, "executable.txt", 1)); - cl_assert_equal_p(NULL, git_index_get_bypath(index, "executable.txt", 2)); - cl_assert_equal_p(NULL, git_index_get_bypath(index, "executable.txt", 3)); - - cl_assert_equal_p(NULL, git_index_get_bypath(index, "other.txt", 1)); - cl_assert_equal_p(NULL, git_index_get_bypath(index, "other.txt", 2)); - cl_assert_equal_p(NULL, git_index_get_bypath(index, "other.txt", 3)); - - cl_assert(!git_path_exists("testrepo/other.txt")); - - git_commit_free(commit); - git_index_free(index); -} - - -void test_checkout_tree__removes_conflicts_only_by_pathscope(void) -{ - git_oid commit_id; - git_commit *commit; - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - git_index *index; - const char *path = "executable.txt"; - - cl_git_pass(git_oid_fromstr(&commit_id, "afe4393b2b2a965f06acf2ca9658eaa01e0cd6b6")); - cl_git_pass(git_commit_lookup(&commit, g_repo, &commit_id)); - - opts.checkout_strategy = GIT_CHECKOUT_FORCE; - opts.paths.count = 1; - opts.paths.strings = (char **)&path; - - cl_git_pass(git_checkout_tree(g_repo, (const git_object *)commit, &opts)); - - cl_git_pass(git_repository_index(&index, g_repo)); - cl_git_pass(git_index_remove(index, "executable.txt", 0)); - - create_conflict("executable.txt"); - cl_git_mkfile("testrepo/executable.txt", "This is the conflict file.\n"); - - create_conflict("other.txt"); - cl_git_mkfile("testrepo/other.txt", "This is another conflict file.\n"); - - git_index_write(index); - - cl_git_pass(git_checkout_tree(g_repo, (const git_object *)commit, &opts)); - - cl_assert_equal_p(NULL, git_index_get_bypath(index, "executable.txt", 1)); - cl_assert_equal_p(NULL, git_index_get_bypath(index, "executable.txt", 2)); - cl_assert_equal_p(NULL, git_index_get_bypath(index, "executable.txt", 3)); - - cl_assert(git_index_get_bypath(index, "other.txt", 1) != NULL); - cl_assert(git_index_get_bypath(index, "other.txt", 2) != NULL); - cl_assert(git_index_get_bypath(index, "other.txt", 3) != NULL); - - cl_assert(git_path_exists("testrepo/other.txt")); - - git_commit_free(commit); - git_index_free(index); -} - -void test_checkout_tree__case_changing_rename(void) -{ - git_index *index; - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - git_oid master_id, dir_commit_id, tree_id, commit_id; - git_commit *master_commit, *dir_commit; - git_tree *tree; - git_signature *signature; - const git_index_entry *index_entry; - bool case_sensitive; - - assert_on_branch(g_repo, "master"); - - cl_git_pass(git_repository_index(&index, g_repo)); - - /* Switch branches and perform a case-changing rename */ - - opts.checkout_strategy = GIT_CHECKOUT_FORCE; - - cl_git_pass(git_reference_name_to_id(&dir_commit_id, g_repo, "refs/heads/dir")); - cl_git_pass(git_commit_lookup(&dir_commit, g_repo, &dir_commit_id)); - - cl_git_pass(git_checkout_tree(g_repo, (git_object *)dir_commit, &opts)); - cl_git_pass(git_repository_set_head(g_repo, "refs/heads/dir")); - - cl_assert(git_path_isfile("testrepo/README")); - case_sensitive = !git_path_isfile("testrepo/readme"); - - cl_assert(index_entry = git_index_get_bypath(index, "README", 0)); - cl_assert_equal_s("README", index_entry->path); - - cl_git_pass(git_index_remove_bypath(index, "README")); - cl_git_pass(p_rename("testrepo/README", "testrepo/__readme__")); - cl_git_pass(p_rename("testrepo/__readme__", "testrepo/readme")); - cl_git_append2file("testrepo/readme", "An addendum..."); - cl_git_pass(git_index_add_bypath(index, "readme")); - - cl_git_pass(git_index_write(index)); - - cl_git_pass(git_index_write_tree(&tree_id, index)); - cl_git_pass(git_tree_lookup(&tree, g_repo, &tree_id)); - - cl_git_pass(git_signature_new(&signature, "Renamer", "rename@contoso.com", time(NULL), 0)); - - cl_git_pass(git_commit_create(&commit_id, g_repo, "refs/heads/dir", signature, signature, NULL, "case-changing rename", tree, 1, (const git_commit **)&dir_commit)); - - cl_assert(git_path_isfile("testrepo/readme")); - if (case_sensitive) - cl_assert(!git_path_isfile("testrepo/README")); - - cl_assert(index_entry = git_index_get_bypath(index, "readme", 0)); - cl_assert_equal_s("readme", index_entry->path); - - /* Switching back to master should rename readme -> README */ - opts.checkout_strategy = GIT_CHECKOUT_SAFE; - - cl_git_pass(git_reference_name_to_id(&master_id, g_repo, "refs/heads/master")); - cl_git_pass(git_commit_lookup(&master_commit, g_repo, &master_id)); - - cl_git_pass(git_checkout_tree(g_repo, (git_object *)master_commit, &opts)); - cl_git_pass(git_repository_set_head(g_repo, "refs/heads/master")); - - assert_on_branch(g_repo, "master"); - - cl_assert(git_path_isfile("testrepo/README")); - if (case_sensitive) - cl_assert(!git_path_isfile("testrepo/readme")); - - cl_assert(index_entry = git_index_get_bypath(index, "README", 0)); - cl_assert_equal_s("README", index_entry->path); - - git_index_free(index); - git_signature_free(signature); - git_tree_free(tree); - git_commit_free(dir_commit); - git_commit_free(master_commit); -} - -void perfdata_cb(const git_checkout_perfdata *in, void *payload) -{ - memcpy(payload, in, sizeof(git_checkout_perfdata)); -} - -void test_checkout_tree__can_collect_perfdata(void) -{ - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - git_oid oid; - git_object *obj = NULL; - git_checkout_perfdata perfdata = {0}; - - opts.perfdata_cb = perfdata_cb; - opts.perfdata_payload = &perfdata; - - assert_on_branch(g_repo, "master"); - opts.checkout_strategy = GIT_CHECKOUT_FORCE; - - cl_git_pass(git_reference_name_to_id(&oid, g_repo, "refs/heads/dir")); - cl_git_pass(git_object_lookup(&obj, g_repo, &oid, GIT_OBJ_ANY)); - - cl_git_pass(git_checkout_tree(g_repo, obj, &opts)); - - cl_assert(perfdata.mkdir_calls > 0); - cl_assert(perfdata.stat_calls > 0); - - git_object_free(obj); -} - -void update_attr_callback( - const char *path, - size_t completed_steps, - size_t total_steps, - void *payload) -{ - GIT_UNUSED(completed_steps); - GIT_UNUSED(total_steps); - GIT_UNUSED(payload); - - if (path && strcmp(path, "ident1.txt") == 0) - cl_git_write2file("testrepo/.gitattributes", - "*.txt ident\n", 12, O_RDWR|O_CREAT, 0666); -} - -void test_checkout_tree__caches_attributes_during_checkout(void) -{ - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - git_oid oid; - git_object *obj = NULL; - git_buf ident1 = GIT_BUF_INIT, ident2 = GIT_BUF_INIT; - char *ident_paths[] = { "ident1.txt", "ident2.txt" }; - - opts.progress_cb = update_attr_callback; - - assert_on_branch(g_repo, "master"); - opts.checkout_strategy = GIT_CHECKOUT_FORCE; - opts.paths.strings = ident_paths; - opts.paths.count = 2; - - cl_git_pass(git_reference_name_to_id(&oid, g_repo, "refs/heads/ident")); - cl_git_pass(git_object_lookup(&obj, g_repo, &oid, GIT_OBJ_ANY)); - - cl_git_pass(git_checkout_tree(g_repo, obj, &opts)); - - cl_git_pass(git_futils_readbuffer(&ident1, "testrepo/ident1.txt")); - cl_git_pass(git_futils_readbuffer(&ident2, "testrepo/ident2.txt")); - - cl_assert_equal_strn(ident1.ptr, "# $Id$", 6); - cl_assert_equal_strn(ident2.ptr, "# $Id$", 6); - - cl_git_pass(git_checkout_tree(g_repo, obj, &opts)); - - cl_git_pass(git_futils_readbuffer(&ident1, "testrepo/ident1.txt")); - cl_git_pass(git_futils_readbuffer(&ident2, "testrepo/ident2.txt")); - - cl_assert_equal_strn(ident1.ptr, "# $Id: ", 7); - cl_assert_equal_strn(ident2.ptr, "# $Id: ", 7); - - git_buf_free(&ident1); - git_buf_free(&ident2); - git_object_free(obj); -} - -void test_checkout_tree__can_not_update_index(void) -{ - git_oid oid; - git_object *head; - unsigned int status; - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - git_index *index; - - opts.checkout_strategy |= - GIT_CHECKOUT_FORCE | GIT_CHECKOUT_DONT_UPDATE_INDEX; - - cl_git_pass(git_reference_name_to_id(&oid, g_repo, "HEAD")); - cl_git_pass(git_object_lookup(&head, g_repo, &oid, GIT_OBJ_ANY)); - - cl_git_pass(git_reset(g_repo, head, GIT_RESET_HARD, &g_opts)); - - cl_assert_equal_i(false, git_path_isdir("./testrepo/ab/")); - - cl_git_pass(git_revparse_single(&g_object, g_repo, "subtrees")); - - cl_git_pass(git_checkout_tree(g_repo, g_object, &opts)); - - cl_assert_equal_i(true, git_path_isfile("./testrepo/ab/de/2.txt")); - cl_git_pass(git_status_file(&status, g_repo, "ab/de/2.txt")); - cl_assert_equal_i(GIT_STATUS_WT_NEW, status); - - cl_git_pass(git_repository_index(&index, g_repo)); - cl_git_pass(git_index_write(index)); - - cl_git_pass(git_status_file(&status, g_repo, "ab/de/2.txt")); - cl_assert_equal_i(GIT_STATUS_WT_NEW, status); - - git_object_free(head); - git_index_free(index); -} - -void test_checkout_tree__can_update_but_not_write_index(void) -{ - git_oid oid; - git_object *head; - unsigned int status; - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - git_index *index; - git_repository *other; - - opts.checkout_strategy |= - GIT_CHECKOUT_FORCE | GIT_CHECKOUT_DONT_WRITE_INDEX; - - cl_git_pass(git_reference_name_to_id(&oid, g_repo, "HEAD")); - cl_git_pass(git_object_lookup(&head, g_repo, &oid, GIT_OBJ_ANY)); - - cl_git_pass(git_reset(g_repo, head, GIT_RESET_HARD, &g_opts)); - - cl_assert_equal_i(false, git_path_isdir("./testrepo/ab/")); - - cl_git_pass(git_revparse_single(&g_object, g_repo, "subtrees")); - - cl_git_pass(git_checkout_tree(g_repo, g_object, &opts)); - - cl_assert_equal_i(true, git_path_isfile("./testrepo/ab/de/2.txt")); - cl_git_pass(git_status_file(&status, g_repo, "ab/de/2.txt")); - cl_assert_equal_i(GIT_STATUS_INDEX_NEW, status); - - cl_git_pass(git_repository_open(&other, "testrepo")); - cl_git_pass(git_status_file(&status, other, "ab/de/2.txt")); - cl_assert_equal_i(GIT_STATUS_WT_NEW, status); - git_repository_free(other); - - cl_git_pass(git_repository_index(&index, g_repo)); - cl_git_pass(git_index_write(index)); - - cl_git_pass(git_repository_open(&other, "testrepo")); - cl_git_pass(git_status_file(&status, other, "ab/de/2.txt")); - cl_assert_equal_i(GIT_STATUS_INDEX_NEW, status); - git_repository_free(other); - - git_object_free(head); - git_index_free(index); -} - -/* Emulate checking out in a repo created by clone --no-checkout, - * which would not have written an index. */ -void test_checkout_tree__safe_proceeds_if_no_index(void) -{ - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - git_oid oid; - git_object *obj = NULL; - - assert_on_branch(g_repo, "master"); - cl_must_pass(p_unlink("testrepo/.git/index")); - - /* do second checkout safe because we should be clean after first */ - opts.checkout_strategy = GIT_CHECKOUT_SAFE; - - cl_git_pass(git_reference_name_to_id(&oid, g_repo, "refs/heads/subtrees")); - cl_git_pass(git_object_lookup(&obj, g_repo, &oid, GIT_OBJ_ANY)); - - cl_git_pass(git_checkout_tree(g_repo, obj, &opts)); - cl_git_pass(git_repository_set_head(g_repo, "refs/heads/subtrees")); - - cl_assert(git_path_isfile("testrepo/README")); - cl_assert(git_path_isfile("testrepo/branch_file.txt")); - cl_assert(git_path_isfile("testrepo/new.txt")); - cl_assert(git_path_isfile("testrepo/ab/4.txt")); - cl_assert(git_path_isfile("testrepo/ab/c/3.txt")); - cl_assert(git_path_isfile("testrepo/ab/de/2.txt")); - cl_assert(git_path_isfile("testrepo/ab/de/fgh/1.txt")); - - cl_assert(!git_path_isdir("testrepo/a")); - - assert_on_branch(g_repo, "subtrees"); - - git_object_free(obj); -} - diff --git a/vendor/libgit2/tests/checkout/typechange.c b/vendor/libgit2/tests/checkout/typechange.c deleted file mode 100644 index b4959a351a..0000000000 --- a/vendor/libgit2/tests/checkout/typechange.c +++ /dev/null @@ -1,240 +0,0 @@ -#include "clar_libgit2.h" -#include "git2/checkout.h" -#include "path.h" -#include "posix.h" -#include "fileops.h" - -static git_repository *g_repo = NULL; - -static const char *g_typechange_oids[] = { - "79b9f23e85f55ea36a472a902e875bc1121a94cb", - "9bdb75b73836a99e3dbeea640a81de81031fdc29", - "0e7ed140b514b8cae23254cb8656fe1674403aff", - "9d0235c7a7edc0889a18f97a42ee6db9fe688447", - "9b19edf33a03a0c59cdfc113bfa5c06179bf9b1a", - "1b63caae4a5ca96f78e8dfefc376c6a39a142475", - "6eae26c90e8ccc4d16208972119c40635489c6f0", - NULL -}; - -static bool g_typechange_empty[] = { - true, false, false, false, false, false, true, true -}; - -void test_checkout_typechange__initialize(void) -{ - g_repo = cl_git_sandbox_init("typechanges"); - - cl_fixture_sandbox("submod2_target"); - p_rename("submod2_target/.gitted", "submod2_target/.git"); -} - -void test_checkout_typechange__cleanup(void) -{ - cl_git_sandbox_cleanup(); - cl_fixture_cleanup("submod2_target"); -} - -static void assert_file_exists(const char *path) -{ - cl_assert_(git_path_isfile(path), path); -} - -static void assert_dir_exists(const char *path) -{ - cl_assert_(git_path_isdir(path), path); -} - -static void assert_workdir_matches_tree( - git_repository *repo, const git_oid *id, const char *root, bool recurse) -{ - git_object *obj; - git_tree *tree; - size_t i, max_i; - git_buf path = GIT_BUF_INIT; - - if (!root) - root = git_repository_workdir(repo); - cl_assert(root); - - cl_git_pass(git_object_lookup(&obj, repo, id, GIT_OBJ_ANY)); - cl_git_pass(git_object_peel((git_object **)&tree, obj, GIT_OBJ_TREE)); - git_object_free(obj); - - max_i = git_tree_entrycount(tree); - - for (i = 0; i < max_i; ++i) { - const git_tree_entry *te = git_tree_entry_byindex(tree, i); - cl_assert(te); - - cl_git_pass(git_buf_joinpath(&path, root, git_tree_entry_name(te))); - - switch (git_tree_entry_type(te)) { - case GIT_OBJ_COMMIT: - assert_dir_exists(path.ptr); - break; - case GIT_OBJ_TREE: - assert_dir_exists(path.ptr); - if (recurse) - assert_workdir_matches_tree( - repo, git_tree_entry_id(te), path.ptr, true); - break; - case GIT_OBJ_BLOB: - switch (git_tree_entry_filemode(te)) { - case GIT_FILEMODE_BLOB: - case GIT_FILEMODE_BLOB_EXECUTABLE: - assert_file_exists(path.ptr); - /* because of cross-platform, don't confirm exec bit yet */ - break; - case GIT_FILEMODE_LINK: - cl_assert_(git_path_exists(path.ptr), path.ptr); - /* because of cross-platform, don't confirm link yet */ - break; - default: - cl_assert(false); /* really?! */ - } - break; - default: - cl_assert(false); /* really?!! */ - } - } - - git_tree_free(tree); - git_buf_free(&path); -} - -void test_checkout_typechange__checkout_typechanges_safe(void) -{ - int i; - git_object *obj; - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - - for (i = 0; g_typechange_oids[i] != NULL; ++i) { - cl_git_pass(git_revparse_single(&obj, g_repo, g_typechange_oids[i])); - - opts.checkout_strategy = GIT_CHECKOUT_FORCE; - - /* There are bugs in some submodule->tree changes that prevent - * SAFE from passing here, even though the following should work: - */ - /* !i ? GIT_CHECKOUT_FORCE : GIT_CHECKOUT_SAFE; */ - - cl_git_pass(git_checkout_tree(g_repo, obj, &opts)); - - cl_git_pass( - git_repository_set_head_detached(g_repo, git_object_id(obj))); - - assert_workdir_matches_tree(g_repo, git_object_id(obj), NULL, true); - - git_object_free(obj); - - if (!g_typechange_empty[i]) { - cl_assert(git_path_isdir("typechanges")); - cl_assert(git_path_exists("typechanges/a")); - cl_assert(git_path_exists("typechanges/b")); - cl_assert(git_path_exists("typechanges/c")); - cl_assert(git_path_exists("typechanges/d")); - cl_assert(git_path_exists("typechanges/e")); - } else { - cl_assert(git_path_isdir("typechanges")); - cl_assert(!git_path_exists("typechanges/a")); - cl_assert(!git_path_exists("typechanges/b")); - cl_assert(!git_path_exists("typechanges/c")); - cl_assert(!git_path_exists("typechanges/d")); - cl_assert(!git_path_exists("typechanges/e")); - } - } -} - -typedef struct { - int conflicts; - int dirty; - int updates; - int untracked; - int ignored; -} notify_counts; - -static int notify_counter( - git_checkout_notify_t why, - const char *path, - const git_diff_file *baseline, - const git_diff_file *target, - const git_diff_file *workdir, - void *payload) -{ - notify_counts *cts = payload; - - GIT_UNUSED(path); - GIT_UNUSED(baseline); - GIT_UNUSED(target); - GIT_UNUSED(workdir); - - switch (why) { - case GIT_CHECKOUT_NOTIFY_CONFLICT: cts->conflicts++; break; - case GIT_CHECKOUT_NOTIFY_DIRTY: cts->dirty++; break; - case GIT_CHECKOUT_NOTIFY_UPDATED: cts->updates++; break; - case GIT_CHECKOUT_NOTIFY_UNTRACKED: cts->untracked++; break; - case GIT_CHECKOUT_NOTIFY_IGNORED: cts->ignored++; break; - default: break; - } - - return 0; -} - -static void force_create_file(const char *file) -{ - int error = git_futils_rmdir_r(file, NULL, - GIT_RMDIR_REMOVE_FILES | GIT_RMDIR_REMOVE_BLOCKERS); - cl_assert(!error || error == GIT_ENOTFOUND); - cl_git_pass(git_futils_mkpath2file(file, 0777)); - cl_git_rewritefile(file, "yowza!!"); -} - -void test_checkout_typechange__checkout_with_conflicts(void) -{ - int i; - git_object *obj; - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - notify_counts cts = {0}; - - opts.notify_flags = - GIT_CHECKOUT_NOTIFY_CONFLICT | GIT_CHECKOUT_NOTIFY_UNTRACKED; - opts.notify_cb = notify_counter; - opts.notify_payload = &cts; - - for (i = 0; g_typechange_oids[i] != NULL; ++i) { - cl_git_pass(git_revparse_single(&obj, g_repo, g_typechange_oids[i])); - - force_create_file("typechanges/a/blocker"); - force_create_file("typechanges/b"); - force_create_file("typechanges/c/sub/sub/file"); - git_futils_rmdir_r("typechanges/d", NULL, GIT_RMDIR_REMOVE_FILES); - p_mkdir("typechanges/d", 0777); /* intentionally empty dir */ - force_create_file("typechanges/untracked"); - - opts.checkout_strategy = GIT_CHECKOUT_SAFE; - memset(&cts, 0, sizeof(cts)); - - cl_git_fail(git_checkout_tree(g_repo, obj, &opts)); - cl_assert(cts.conflicts > 0); - cl_assert(cts.untracked > 0); - - opts.checkout_strategy = - GIT_CHECKOUT_FORCE | GIT_CHECKOUT_REMOVE_UNTRACKED; - memset(&cts, 0, sizeof(cts)); - - cl_assert(git_path_exists("typechanges/untracked")); - - cl_git_pass(git_checkout_tree(g_repo, obj, &opts)); - cl_assert_equal_i(0, cts.conflicts); - - cl_assert(!git_path_exists("typechanges/untracked")); - - cl_git_pass( - git_repository_set_head_detached(g_repo, git_object_id(obj))); - - assert_workdir_matches_tree(g_repo, git_object_id(obj), NULL, true); - - git_object_free(obj); - } -} diff --git a/vendor/libgit2/tests/cherrypick/bare.c b/vendor/libgit2/tests/cherrypick/bare.c deleted file mode 100644 index 1353365075..0000000000 --- a/vendor/libgit2/tests/cherrypick/bare.c +++ /dev/null @@ -1,106 +0,0 @@ -#include "clar.h" -#include "clar_libgit2.h" - -#include "buffer.h" -#include "fileops.h" -#include "git2/cherrypick.h" - -#include "../merge/merge_helpers.h" - -#define TEST_REPO_PATH "cherrypick" - -static git_repository *repo; - -void test_cherrypick_bare__initialize(void) -{ - repo = cl_git_sandbox_init(TEST_REPO_PATH); -} - -void test_cherrypick_bare__cleanup(void) -{ - cl_git_sandbox_cleanup(); -} - -void test_cherrypick_bare__automerge(void) -{ - git_commit *head = NULL, *commit = NULL; - git_index *index = NULL; - git_oid head_oid, cherry_oid; - - struct merge_index_entry merge_index_entries[] = { - { 0100644, "38c05a857e831a7e759d83778bfc85d003e21c45", 0, "file1.txt" }, - { 0100644, "a661b5dec1004e2c62654ded3762370c27cf266b", 0, "file2.txt" }, - { 0100644, "df6b290e0bd6a89b01d69f66687e8abf385283ca", 0, "file3.txt" }, - }; - - git_oid_fromstr(&head_oid, "d3d77487660ee3c0194ee01dc5eaf478782b1c7e"); - cl_git_pass(git_commit_lookup(&head, repo, &head_oid)); - - git_oid_fromstr(&cherry_oid, "cfc4f0999a8367568e049af4f72e452d40828a15"); - cl_git_pass(git_commit_lookup(&commit, repo, &cherry_oid)); - - cl_git_pass(git_cherrypick_commit(&index, repo, commit, head, 0, NULL)); - cl_assert(merge_test_index(index, merge_index_entries, 3)); - - git_index_free(index); - git_commit_free(head); - git_commit_free(commit); -} - -void test_cherrypick_bare__conflicts(void) -{ - git_commit *head = NULL, *commit = NULL; - git_index *index = NULL; - git_oid head_oid, cherry_oid; - - struct merge_index_entry merge_index_entries[] = { - { 0100644, "242e7977ba73637822ffb265b46004b9b0e5153b", 0, "file1.txt" }, - { 0100644, "a58ca3fee5eb68b11adc2703e5843f968c9dad1e", 1, "file2.txt" }, - { 0100644, "bd6ffc8c6c41f0f85ff9e3d61c9479516bac0024", 2, "file2.txt" }, - { 0100644, "563f6473a3858f99b80e5f93c660512ed38e1e6f", 3, "file2.txt" }, - { 0100644, "28d9eb4208074ad1cc84e71ccc908b34573f05d2", 1, "file3.txt" }, - { 0100644, "1124c2c1ae07b26fded662d6c3f3631d9dc16f88", 2, "file3.txt" }, - { 0100644, "e233b9ed408a95e9d4b65fec7fc34943a556deb2", 3, "file3.txt" }, - }; - - git_oid_fromstr(&head_oid, "bafbf6912c09505ac60575cd43d3f2aba3bd84d8"); - cl_git_pass(git_commit_lookup(&head, repo, &head_oid)); - - git_oid_fromstr(&cherry_oid, "e9b63f3655b2ad80c0ff587389b5a9589a3a7110"); - cl_git_pass(git_commit_lookup(&commit, repo, &cherry_oid)); - - cl_git_pass(git_cherrypick_commit(&index, repo, commit, head, 0, NULL)); - cl_assert(merge_test_index(index, merge_index_entries, 7)); - - git_index_free(index); - git_commit_free(head); - git_commit_free(commit); -} - -void test_cherrypick_bare__orphan(void) -{ - git_commit *head = NULL, *commit = NULL; - git_index *index = NULL; - git_oid head_oid, cherry_oid; - - struct merge_index_entry merge_index_entries[] = { - { 0100644, "38c05a857e831a7e759d83778bfc85d003e21c45", 0, "file1.txt" }, - { 0100644, "a661b5dec1004e2c62654ded3762370c27cf266b", 0, "file2.txt" }, - { 0100644, "85a4a1d791973644f24c72f5e89420d3064cc452", 0, "file3.txt" }, - { 0100644, "9ccb9bf50c011fd58dcbaa65df917bf79539717f", 0, "orphan.txt" }, - }; - - git_oid_fromstr(&head_oid, "d3d77487660ee3c0194ee01dc5eaf478782b1c7e"); - cl_git_pass(git_commit_lookup(&head, repo, &head_oid)); - - git_oid_fromstr(&cherry_oid, "74f06b5bfec6d33d7264f73606b57a7c0b963819"); - cl_git_pass(git_commit_lookup(&commit, repo, &cherry_oid)); - - cl_git_pass(git_cherrypick_commit(&index, repo, commit, head, 0, NULL)); - cl_assert(merge_test_index(index, merge_index_entries, 4)); - - git_index_free(index); - git_commit_free(head); - git_commit_free(commit); -} - diff --git a/vendor/libgit2/tests/cherrypick/workdir.c b/vendor/libgit2/tests/cherrypick/workdir.c deleted file mode 100644 index 787f1f4d45..0000000000 --- a/vendor/libgit2/tests/cherrypick/workdir.c +++ /dev/null @@ -1,470 +0,0 @@ -#include "clar.h" -#include "clar_libgit2.h" - -#include "buffer.h" -#include "fileops.h" -#include "git2/cherrypick.h" - -#include "../merge/merge_helpers.h" - -#define TEST_REPO_PATH "cherrypick" - -static git_repository *repo; -static git_index *repo_index; - -// Fixture setup and teardown -void test_cherrypick_workdir__initialize(void) -{ - repo = cl_git_sandbox_init(TEST_REPO_PATH); - git_repository_index(&repo_index, repo); -} - -void test_cherrypick_workdir__cleanup(void) -{ - git_index_free(repo_index); - cl_git_sandbox_cleanup(); -} - -/* git reset --hard d3d77487660ee3c0194ee01dc5eaf478782b1c7e - * git cherry-pick cfc4f0999a8367568e049af4f72e452d40828a15 - * git cherry-pick 964ea3da044d9083181a88ba6701de9e35778bf4 - * git cherry-pick a43a050c588d4e92f11a6b139680923e9728477d - */ -void test_cherrypick_workdir__automerge(void) -{ - git_oid head_oid; - git_signature *signature = NULL; - size_t i; - - const char *cherrypick_oids[] = { - "cfc4f0999a8367568e049af4f72e452d40828a15", - "964ea3da044d9083181a88ba6701de9e35778bf4", - "a43a050c588d4e92f11a6b139680923e9728477d", - }; - - struct merge_index_entry merge_index_entries[] = { - { 0100644, "38c05a857e831a7e759d83778bfc85d003e21c45", 0, "file1.txt" }, - { 0100644, "a661b5dec1004e2c62654ded3762370c27cf266b", 0, "file2.txt" }, - { 0100644, "df6b290e0bd6a89b01d69f66687e8abf385283ca", 0, "file3.txt" }, - - { 0100644, "38c05a857e831a7e759d83778bfc85d003e21c45", 0, "file1.txt" }, - { 0100644, "bd8fc3c59fb52d3c8b5907ace7defa5803f82419", 0, "file2.txt" }, - { 0100644, "df6b290e0bd6a89b01d69f66687e8abf385283ca", 0, "file3.txt" }, - - { 0100644, "f06427bee380364bc7e0cb26a9245158e4726ce0", 0, "file1.txt" }, - { 0100644, "bd8fc3c59fb52d3c8b5907ace7defa5803f82419", 0, "file2.txt" }, - { 0100644, "df6b290e0bd6a89b01d69f66687e8abf385283ca", 0, "file3.txt" }, - }; - - cl_git_pass(git_signature_new(&signature, "Picker", "picker@example.org", time(NULL), 0)); - - git_oid_fromstr(&head_oid, "d3d77487660ee3c0194ee01dc5eaf478782b1c7e"); - - for (i = 0; i < 3; ++i) { - git_commit *head = NULL, *commit = NULL; - git_oid cherry_oid, cherrypicked_oid, cherrypicked_tree_oid; - git_tree *cherrypicked_tree = NULL; - - cl_git_pass(git_commit_lookup(&head, repo, &head_oid)); - cl_git_pass(git_reset(repo, (git_object *)head, GIT_RESET_HARD, NULL)); - - git_oid_fromstr(&cherry_oid, cherrypick_oids[i]); - cl_git_pass(git_commit_lookup(&commit, repo, &cherry_oid)); - cl_git_pass(git_cherrypick(repo, commit, NULL)); - - cl_assert(git_path_exists(TEST_REPO_PATH "/.git/CHERRY_PICK_HEAD")); - cl_assert(git_path_exists(TEST_REPO_PATH "/.git/MERGE_MSG")); - - cl_git_pass(git_index_write_tree(&cherrypicked_tree_oid, repo_index)); - cl_git_pass(git_tree_lookup(&cherrypicked_tree, repo, &cherrypicked_tree_oid)); - cl_git_pass(git_commit_create(&cherrypicked_oid, repo, "HEAD", signature, signature, NULL, - "Cherry picked!", cherrypicked_tree, 1, (const git_commit **)&head)); - - cl_assert(merge_test_index(repo_index, merge_index_entries + i * 3, 3)); - - git_oid_cpy(&head_oid, &cherrypicked_oid); - - git_tree_free(cherrypicked_tree); - git_commit_free(head); - git_commit_free(commit); - } - - git_signature_free(signature); -} - -/* git reset --hard cfc4f0999a8367568e049af4f72e452d40828a15 - * git cherry-pick a43a050c588d4e92f11a6b139680923e9728477d*/ -void test_cherrypick_workdir__empty_result(void) -{ - git_oid head_oid; - git_signature *signature = NULL; - git_commit *head = NULL, *commit = NULL; - git_oid cherry_oid; - - const char *cherrypick_oid = "a43a050c588d4e92f11a6b139680923e9728477d"; - - struct merge_index_entry merge_index_entries[] = { - { 0100644, "19c5c7207054604b69c84d08a7571ef9672bb5c2", 0, "file1.txt" }, - { 0100644, "a58ca3fee5eb68b11adc2703e5843f968c9dad1e", 0, "file2.txt" }, - { 0100644, "28d9eb4208074ad1cc84e71ccc908b34573f05d2", 0, "file3.txt" }, - }; - - cl_git_pass(git_signature_new(&signature, "Picker", "picker@example.org", time(NULL), 0)); - - git_oid_fromstr(&head_oid, "cfc4f0999a8367568e049af4f72e452d40828a15"); - - /* Create an untracked file that should not conflict */ - cl_git_mkfile(TEST_REPO_PATH "/file4.txt", ""); - cl_assert(git_path_exists(TEST_REPO_PATH "/file4.txt")); - - cl_git_pass(git_commit_lookup(&head, repo, &head_oid)); - cl_git_pass(git_reset(repo, (git_object *)head, GIT_RESET_HARD, NULL)); - - git_oid_fromstr(&cherry_oid, cherrypick_oid); - cl_git_pass(git_commit_lookup(&commit, repo, &cherry_oid)); - cl_git_pass(git_cherrypick(repo, commit, NULL)); - - /* The resulting tree should not have changed, the change was already on HEAD */ - cl_assert(merge_test_index(repo_index, merge_index_entries, 3)); - - git_commit_free(head); - git_commit_free(commit); - - git_signature_free(signature); -} - -/* git reset --hard bafbf6912c09505ac60575cd43d3f2aba3bd84d8 - * git cherry-pick e9b63f3655b2ad80c0ff587389b5a9589a3a7110 - */ -void test_cherrypick_workdir__conflicts(void) -{ - git_commit *head = NULL, *commit = NULL; - git_oid head_oid, cherry_oid; - git_buf conflicting_buf = GIT_BUF_INIT, mergemsg_buf = GIT_BUF_INIT; - - struct merge_index_entry merge_index_entries[] = { - { 0100644, "242e7977ba73637822ffb265b46004b9b0e5153b", 0, "file1.txt" }, - { 0100644, "a58ca3fee5eb68b11adc2703e5843f968c9dad1e", 1, "file2.txt" }, - { 0100644, "bd6ffc8c6c41f0f85ff9e3d61c9479516bac0024", 2, "file2.txt" }, - { 0100644, "563f6473a3858f99b80e5f93c660512ed38e1e6f", 3, "file2.txt" }, - { 0100644, "28d9eb4208074ad1cc84e71ccc908b34573f05d2", 1, "file3.txt" }, - { 0100644, "1124c2c1ae07b26fded662d6c3f3631d9dc16f88", 2, "file3.txt" }, - { 0100644, "e233b9ed408a95e9d4b65fec7fc34943a556deb2", 3, "file3.txt" }, - }; - - git_oid_fromstr(&head_oid, "bafbf6912c09505ac60575cd43d3f2aba3bd84d8"); - - cl_git_pass(git_commit_lookup(&head, repo, &head_oid)); - cl_git_pass(git_reset(repo, (git_object *)head, GIT_RESET_HARD, NULL)); - - git_oid_fromstr(&cherry_oid, "e9b63f3655b2ad80c0ff587389b5a9589a3a7110"); - cl_git_pass(git_commit_lookup(&commit, repo, &cherry_oid)); - cl_git_pass(git_cherrypick(repo, commit, NULL)); - - cl_assert(git_path_exists(TEST_REPO_PATH "/.git/CHERRY_PICK_HEAD")); - cl_assert(git_path_exists(TEST_REPO_PATH "/.git/MERGE_MSG")); - - cl_assert(merge_test_index(repo_index, merge_index_entries, 7)); - - cl_git_pass(git_futils_readbuffer(&mergemsg_buf, - TEST_REPO_PATH "/.git/MERGE_MSG")); - cl_assert(strcmp(git_buf_cstr(&mergemsg_buf), - "Change all files\n" \ - "\n" \ - "Conflicts:\n" \ - "\tfile2.txt\n" \ - "\tfile3.txt\n") == 0); - - cl_git_pass(git_futils_readbuffer(&conflicting_buf, - TEST_REPO_PATH "/file2.txt")); - - cl_assert(strcmp(git_buf_cstr(&conflicting_buf), - "!File 2\n" \ - "File 2\n" \ - "File 2\n" \ - "File 2\n" \ - "File 2\n" \ - "File 2\n" \ - "File 2\n" \ - "File 2\n" \ - "File 2\n" \ - "File 2\n" \ - "File 2!!\n" \ - "File 2\n" \ - "File 2\n" \ - "File 2\n" \ - "<<<<<<< HEAD\n" \ - "File 2\n" \ - "=======\n" \ - "File 2!\n" \ - "File 2\n" \ - "File 2!\n" \ - ">>>>>>> e9b63f3... Change all files\n") == 0); - - cl_git_pass(git_futils_readbuffer(&conflicting_buf, - TEST_REPO_PATH "/file3.txt")); - - cl_assert(strcmp(git_buf_cstr(&conflicting_buf), - "!File 3\n" \ - "File 3\n" \ - "File 3\n" \ - "File 3\n" \ - "File 3\n" \ - "File 3\n" \ - "File 3\n" \ - "File 3\n" \ - "File 3\n" \ - "File 3\n" \ - "File 3\n" \ - "File 3!!\n" \ - "File 3\n" \ - "File 3\n" \ - "File 3\n" \ - "<<<<<<< HEAD\n" \ - "=======\n" \ - "File 3!\n" \ - "File 3!\n" \ - ">>>>>>> e9b63f3... Change all files\n") == 0); - - git_commit_free(commit); - git_commit_free(head); - git_buf_free(&mergemsg_buf); - git_buf_free(&conflicting_buf); -} - -/* git reset --hard bafbf6912c09505ac60575cd43d3f2aba3bd84d8 - * git cherry-pick -X ours e9b63f3655b2ad80c0ff587389b5a9589a3a7110 - */ -void test_cherrypick_workdir__conflict_use_ours(void) -{ - git_commit *head = NULL, *commit = NULL; - git_oid head_oid, cherry_oid; - git_cherrypick_options opts = GIT_CHERRYPICK_OPTIONS_INIT; - - struct merge_index_entry merge_index_entries[] = { - { 0100644, "242e7977ba73637822ffb265b46004b9b0e5153b", 0, "file1.txt" }, - { 0100644, "a58ca3fee5eb68b11adc2703e5843f968c9dad1e", 1, "file2.txt" }, - { 0100644, "bd6ffc8c6c41f0f85ff9e3d61c9479516bac0024", 2, "file2.txt" }, - { 0100644, "563f6473a3858f99b80e5f93c660512ed38e1e6f", 3, "file2.txt" }, - { 0100644, "28d9eb4208074ad1cc84e71ccc908b34573f05d2", 1, "file3.txt" }, - { 0100644, "1124c2c1ae07b26fded662d6c3f3631d9dc16f88", 2, "file3.txt" }, - { 0100644, "e233b9ed408a95e9d4b65fec7fc34943a556deb2", 3, "file3.txt" }, - }; - - struct merge_index_entry merge_filesystem_entries[] = { - { 0100644, "242e7977ba73637822ffb265b46004b9b0e5153b", 0, "file1.txt" }, - { 0100644, "bd6ffc8c6c41f0f85ff9e3d61c9479516bac0024", 0, "file2.txt" }, - { 0100644, "1124c2c1ae07b26fded662d6c3f3631d9dc16f88", 0, "file3.txt" }, - }; - - /* leave the index in a conflicted state, but checkout "ours" to the workdir */ - opts.checkout_opts.checkout_strategy = GIT_CHECKOUT_SAFE | GIT_CHECKOUT_USE_OURS; - - git_oid_fromstr(&head_oid, "bafbf6912c09505ac60575cd43d3f2aba3bd84d8"); - - cl_git_pass(git_commit_lookup(&head, repo, &head_oid)); - cl_git_pass(git_reset(repo, (git_object *)head, GIT_RESET_HARD, NULL)); - - git_oid_fromstr(&cherry_oid, "e9b63f3655b2ad80c0ff587389b5a9589a3a7110"); - cl_git_pass(git_commit_lookup(&commit, repo, &cherry_oid)); - cl_git_pass(git_cherrypick(repo, commit, &opts)); - - cl_assert(merge_test_index(repo_index, merge_index_entries, 7)); - cl_assert(merge_test_workdir(repo, merge_filesystem_entries, 3)); - - /* resolve conflicts in the index by taking "ours" */ - opts.merge_opts.file_favor = GIT_MERGE_FILE_FAVOR_OURS; - - cl_git_pass(git_reset(repo, (git_object *)head, GIT_RESET_HARD, NULL)); - cl_git_pass(git_cherrypick(repo, commit, &opts)); - - cl_assert(merge_test_index(repo_index, merge_filesystem_entries, 3)); - cl_assert(merge_test_workdir(repo, merge_filesystem_entries, 3)); - - git_commit_free(commit); - git_commit_free(head); -} - -/* git reset --hard cfc4f0999a8367568e049af4f72e452d40828a15 - * git cherry-pick 2a26c7e88b285613b302ba76712bc998863f3cbc - */ -void test_cherrypick_workdir__rename(void) -{ - git_commit *head, *commit; - git_oid head_oid, cherry_oid; - git_cherrypick_options opts = GIT_CHERRYPICK_OPTIONS_INIT; - - struct merge_index_entry merge_index_entries[] = { - { 0100644, "19c5c7207054604b69c84d08a7571ef9672bb5c2", 0, "file1.txt" }, - { 0100644, "a58ca3fee5eb68b11adc2703e5843f968c9dad1e", 0, "file2.txt" }, - { 0100644, "28d9eb4208074ad1cc84e71ccc908b34573f05d2", 0, "file3.txt.renamed" }, - }; - - opts.merge_opts.tree_flags |= GIT_MERGE_TREE_FIND_RENAMES; - opts.merge_opts.rename_threshold = 50; - - git_oid_fromstr(&head_oid, "cfc4f0999a8367568e049af4f72e452d40828a15"); - cl_git_pass(git_commit_lookup(&head, repo, &head_oid)); - cl_git_pass(git_reset(repo, (git_object *)head, GIT_RESET_HARD, NULL)); - - git_oid_fromstr(&cherry_oid, "2a26c7e88b285613b302ba76712bc998863f3cbc"); - cl_git_pass(git_commit_lookup(&commit, repo, &cherry_oid)); - cl_git_pass(git_cherrypick(repo, commit, &opts)); - - cl_assert(merge_test_index(repo_index, merge_index_entries, 3)); - - git_commit_free(commit); - git_commit_free(head); -} - -/* git reset --hard 44cd2ed2052c9c68f9a439d208e9614dc2a55c70 - * git cherry-pick 2a26c7e88b285613b302ba76712bc998863f3cbc - */ -void test_cherrypick_workdir__both_renamed(void) -{ - git_commit *head, *commit; - git_oid head_oid, cherry_oid; - git_buf mergemsg_buf = GIT_BUF_INIT; - git_cherrypick_options opts = GIT_CHERRYPICK_OPTIONS_INIT; - - struct merge_index_entry merge_index_entries[] = { - { 0100644, "19c5c7207054604b69c84d08a7571ef9672bb5c2", 0, "file1.txt" }, - { 0100644, "a58ca3fee5eb68b11adc2703e5843f968c9dad1e", 0, "file2.txt" }, - { 0100644, "e233b9ed408a95e9d4b65fec7fc34943a556deb2", 1, "file3.txt" }, - { 0100644, "e233b9ed408a95e9d4b65fec7fc34943a556deb2", 3, "file3.txt.renamed" }, - { 0100644, "28d9eb4208074ad1cc84e71ccc908b34573f05d2", 2, "file3.txt.renamed_on_branch" }, - }; - - opts.merge_opts.tree_flags |= GIT_MERGE_TREE_FIND_RENAMES; - opts.merge_opts.rename_threshold = 50; - - git_oid_fromstr(&head_oid, "44cd2ed2052c9c68f9a439d208e9614dc2a55c70"); - cl_git_pass(git_commit_lookup(&head, repo, &head_oid)); - cl_git_pass(git_reset(repo, (git_object *)head, GIT_RESET_HARD, NULL)); - - git_oid_fromstr(&cherry_oid, "2a26c7e88b285613b302ba76712bc998863f3cbc"); - cl_git_pass(git_commit_lookup(&commit, repo, &cherry_oid)); - cl_git_pass(git_cherrypick(repo, commit, &opts)); - - cl_assert(merge_test_index(repo_index, merge_index_entries, 5)); - - cl_git_pass(git_futils_readbuffer(&mergemsg_buf, - TEST_REPO_PATH "/.git/MERGE_MSG")); - cl_assert(strcmp(git_buf_cstr(&mergemsg_buf), - "Renamed file3.txt -> file3.txt.renamed\n" \ - "\n" \ - "Conflicts:\n" \ - "\tfile3.txt\n" \ - "\tfile3.txt.renamed\n" \ - "\tfile3.txt.renamed_on_branch\n") == 0); - - git_buf_free(&mergemsg_buf); - git_commit_free(commit); - git_commit_free(head); -} - -void test_cherrypick_workdir__nonmerge_fails_mainline_specified(void) -{ - git_reference *head; - git_commit *commit; - git_cherrypick_options opts = GIT_CHERRYPICK_OPTIONS_INIT; - - cl_git_pass(git_repository_head(&head, repo)); - cl_git_pass(git_reference_peel((git_object **)&commit, head, GIT_OBJ_COMMIT)); - - opts.mainline = 1; - cl_must_fail(git_cherrypick(repo, commit, &opts)); - cl_assert(!git_path_exists(TEST_REPO_PATH "/.git/CHERRY_PICK_HEAD")); - cl_assert(!git_path_exists(TEST_REPO_PATH "/.git/MERGE_MSG")); - - git_reference_free(head); - git_commit_free(commit); -} - -/* git reset --hard cfc4f0999a8367568e049af4f72e452d40828a15 - * git cherry-pick abe4603bc7cd5b8167a267e0e2418fd2348f8cff - */ -void test_cherrypick_workdir__merge_fails_without_mainline_specified(void) -{ - git_commit *head, *commit; - git_oid head_oid, cherry_oid; - - git_oid_fromstr(&head_oid, "cfc4f0999a8367568e049af4f72e452d40828a15"); - cl_git_pass(git_commit_lookup(&head, repo, &head_oid)); - cl_git_pass(git_reset(repo, (git_object *)head, GIT_RESET_HARD, NULL)); - - git_oid_fromstr(&cherry_oid, "abe4603bc7cd5b8167a267e0e2418fd2348f8cff"); - cl_git_pass(git_commit_lookup(&commit, repo, &cherry_oid)); - - cl_must_fail(git_cherrypick(repo, commit, NULL)); - cl_assert(!git_path_exists(TEST_REPO_PATH "/.git/CHERRY_PICK_HEAD")); - cl_assert(!git_path_exists(TEST_REPO_PATH "/.git/MERGE_MSG")); - - git_commit_free(commit); - git_commit_free(head); -} - -/* git reset --hard cfc4f0999a8367568e049af4f72e452d40828a15 - * git cherry-pick -m1 abe4603bc7cd5b8167a267e0e2418fd2348f8cff - */ -void test_cherrypick_workdir__merge_first_parent(void) -{ - git_commit *head, *commit; - git_oid head_oid, cherry_oid; - git_cherrypick_options opts = GIT_CHERRYPICK_OPTIONS_INIT; - - struct merge_index_entry merge_index_entries[] = { - { 0100644, "f90f9dcbdac2cce5cc166346160e19cb693ef4e8", 0, "file1.txt" }, - { 0100644, "563f6473a3858f99b80e5f93c660512ed38e1e6f", 0, "file2.txt" }, - { 0100644, "e233b9ed408a95e9d4b65fec7fc34943a556deb2", 0, "file3.txt" }, - }; - - opts.mainline = 1; - - git_oid_fromstr(&head_oid, "cfc4f0999a8367568e049af4f72e452d40828a15"); - cl_git_pass(git_commit_lookup(&head, repo, &head_oid)); - cl_git_pass(git_reset(repo, (git_object *)head, GIT_RESET_HARD, NULL)); - - git_oid_fromstr(&cherry_oid, "abe4603bc7cd5b8167a267e0e2418fd2348f8cff"); - cl_git_pass(git_commit_lookup(&commit, repo, &cherry_oid)); - - cl_git_pass(git_cherrypick(repo, commit, &opts)); - - cl_assert(merge_test_index(repo_index, merge_index_entries, 3)); - - git_commit_free(commit); - git_commit_free(head); -} - -/* git reset --hard cfc4f0999a8367568e049af4f72e452d40828a15 - * git cherry-pick -m2 abe4603bc7cd5b8167a267e0e2418fd2348f8cff - */ -void test_cherrypick_workdir__merge_second_parent(void) -{ - git_commit *head, *commit; - git_oid head_oid, cherry_oid; - git_cherrypick_options opts = GIT_CHERRYPICK_OPTIONS_INIT; - - struct merge_index_entry merge_index_entries[] = { - { 0100644, "487434cace79238a7091e2220611d4f20a765690", 0, "file1.txt" }, - { 0100644, "e5183bfd18e3a0a691fadde2f0d5610b73282d31", 0, "file2.txt" }, - { 0100644, "409a1bec58bf35348e8b62b72bb9c1f45cf5a587", 0, "file3.txt" }, - }; - - opts.mainline = 2; - - git_oid_fromstr(&head_oid, "cfc4f0999a8367568e049af4f72e452d40828a15"); - cl_git_pass(git_commit_lookup(&head, repo, &head_oid)); - cl_git_pass(git_reset(repo, (git_object *)head, GIT_RESET_HARD, NULL)); - - git_oid_fromstr(&cherry_oid, "abe4603bc7cd5b8167a267e0e2418fd2348f8cff"); - cl_git_pass(git_commit_lookup(&commit, repo, &cherry_oid)); - - cl_git_pass(git_cherrypick(repo, commit, &opts)); - - cl_assert(merge_test_index(repo_index, merge_index_entries, 3)); - - git_commit_free(commit); - git_commit_free(head); -} - diff --git a/vendor/libgit2/tests/clar.c b/vendor/libgit2/tests/clar.c deleted file mode 100644 index 2caa871d23..0000000000 --- a/vendor/libgit2/tests/clar.c +++ /dev/null @@ -1,642 +0,0 @@ -/* - * Copyright (c) Vicent Marti. All rights reserved. - * - * This file is part of clar, distributed under the ISC license. - * For full terms see the included COPYING file. - */ -#include -#include -#include -#include -#include -#include -#include -#include - -/* required for sandboxing */ -#include -#include - -#ifdef _WIN32 -# include -# include -# include -# include - -# define _MAIN_CC __cdecl - -# ifndef stat -# define stat(path, st) _stat(path, st) -# endif -# ifndef mkdir -# define mkdir(path, mode) _mkdir(path) -# endif -# ifndef chdir -# define chdir(path) _chdir(path) -# endif -# ifndef access -# define access(path, mode) _access(path, mode) -# endif -# ifndef strdup -# define strdup(str) _strdup(str) -# endif -# ifndef strcasecmp -# define strcasecmp(a,b) _stricmp(a,b) -# endif - -# ifndef __MINGW32__ -# pragma comment(lib, "shell32") -# ifndef strncpy -# define strncpy(to, from, to_size) strncpy_s(to, to_size, from, _TRUNCATE) -# endif -# ifndef W_OK -# define W_OK 02 -# endif -# ifndef S_ISDIR -# define S_ISDIR(x) ((x & _S_IFDIR) != 0) -# endif -# define p_snprintf(buf,sz,fmt,...) _snprintf_s(buf,sz,_TRUNCATE,fmt,__VA_ARGS__) -# else -# define p_snprintf snprintf -# endif - -# ifndef PRIuZ -# define PRIuZ "Iu" -# endif -# ifndef PRIxZ -# define PRIxZ "Ix" -# endif - -# ifdef _MSC_VER - typedef struct stat STAT_T; -# else - typedef struct _stat STAT_T; -# endif -#else -# include /* waitpid(2) */ -# include -# define _MAIN_CC -# define p_snprintf snprintf -# ifndef PRIuZ -# define PRIuZ "zu" -# endif -# ifndef PRIxZ -# define PRIxZ "zx" -# endif - typedef struct stat STAT_T; -#endif - -#include "clar.h" - -static void fs_rm(const char *_source); -static void fs_copy(const char *_source, const char *dest); - -static const char * -fixture_path(const char *base, const char *fixture_name); - -struct clar_error { - const char *test; - int test_number; - const char *suite; - const char *file; - int line_number; - const char *error_msg; - char *description; - - struct clar_error *next; -}; - -static struct { - int argc; - char **argv; - - enum cl_test_status test_status; - const char *active_test; - const char *active_suite; - - int total_skipped; - int total_errors; - - int tests_ran; - int suites_ran; - - int report_errors_only; - int exit_on_error; - int report_suite_names; - - struct clar_error *errors; - struct clar_error *last_error; - - void (*local_cleanup)(void *); - void *local_cleanup_payload; - - jmp_buf trampoline; - int trampoline_enabled; - - cl_trace_cb *pfn_trace_cb; - void *trace_payload; - -} _clar; - -struct clar_func { - const char *name; - void (*ptr)(void); -}; - -struct clar_suite { - const char *name; - struct clar_func initialize; - struct clar_func cleanup; - const struct clar_func *tests; - size_t test_count; - int enabled; -}; - -/* From clar_print_*.c */ -static void clar_print_init(int test_count, int suite_count, const char *suite_names); -static void clar_print_shutdown(int test_count, int suite_count, int error_count); -static void clar_print_error(int num, const struct clar_error *error); -static void clar_print_ontest(const char *test_name, int test_number, enum cl_test_status failed); -static void clar_print_onsuite(const char *suite_name, int suite_index); -static void clar_print_onabort(const char *msg, ...); - -/* From clar_sandbox.c */ -static void clar_unsandbox(void); -static int clar_sandbox(void); - -/* Load the declarations for the test suite */ -#include "clar.suite" - - -#define CL_TRACE(ev) \ - do { \ - if (_clar.pfn_trace_cb) \ - _clar.pfn_trace_cb(ev, \ - _clar.active_suite, \ - _clar.active_test, \ - _clar.trace_payload); \ - } while (0) - -void cl_trace_register(cl_trace_cb *cb, void *payload) -{ - _clar.pfn_trace_cb = cb; - _clar.trace_payload = payload; -} - - -/* Core test functions */ -static void -clar_report_errors(void) -{ - int i = 1; - struct clar_error *error, *next; - - error = _clar.errors; - while (error != NULL) { - next = error->next; - clar_print_error(i++, error); - free(error->description); - free(error); - error = next; - } - - _clar.errors = _clar.last_error = NULL; -} - -static void -clar_run_test( - const struct clar_func *test, - const struct clar_func *initialize, - const struct clar_func *cleanup) -{ - _clar.test_status = CL_TEST_OK; - _clar.trampoline_enabled = 1; - - CL_TRACE(CL_TRACE__TEST__BEGIN); - - if (setjmp(_clar.trampoline) == 0) { - if (initialize->ptr != NULL) - initialize->ptr(); - - CL_TRACE(CL_TRACE__TEST__RUN_BEGIN); - test->ptr(); - CL_TRACE(CL_TRACE__TEST__RUN_END); - } - - _clar.trampoline_enabled = 0; - - if (_clar.local_cleanup != NULL) - _clar.local_cleanup(_clar.local_cleanup_payload); - - if (cleanup->ptr != NULL) - cleanup->ptr(); - - CL_TRACE(CL_TRACE__TEST__END); - - _clar.tests_ran++; - - /* remove any local-set cleanup methods */ - _clar.local_cleanup = NULL; - _clar.local_cleanup_payload = NULL; - - if (_clar.report_errors_only) { - clar_report_errors(); - } else { - clar_print_ontest(test->name, _clar.tests_ran, _clar.test_status); - } -} - -static void -clar_run_suite(const struct clar_suite *suite, const char *filter) -{ - const struct clar_func *test = suite->tests; - size_t i, matchlen; - - if (!suite->enabled) - return; - - if (_clar.exit_on_error && _clar.total_errors) - return; - - if (!_clar.report_errors_only) - clar_print_onsuite(suite->name, ++_clar.suites_ran); - - _clar.active_suite = suite->name; - _clar.active_test = NULL; - CL_TRACE(CL_TRACE__SUITE_BEGIN); - - if (filter) { - size_t suitelen = strlen(suite->name); - matchlen = strlen(filter); - if (matchlen <= suitelen) { - filter = NULL; - } else { - filter += suitelen; - while (*filter == ':') - ++filter; - matchlen = strlen(filter); - } - } - - for (i = 0; i < suite->test_count; ++i) { - if (filter && strncmp(test[i].name, filter, matchlen)) - continue; - - _clar.active_test = test[i].name; - clar_run_test(&test[i], &suite->initialize, &suite->cleanup); - - if (_clar.exit_on_error && _clar.total_errors) - return; - } - - _clar.active_test = NULL; - CL_TRACE(CL_TRACE__SUITE_END); -} - -static void -clar_usage(const char *arg) -{ - printf("Usage: %s [options]\n\n", arg); - printf("Options:\n"); - printf(" -sname\tRun only the suite with `name` (can go to individual test name)\n"); - printf(" -iname\tInclude the suite with `name`\n"); - printf(" -xname\tExclude the suite with `name`\n"); - printf(" -v \tIncrease verbosity (show suite names)\n"); - printf(" -q \tOnly report tests that had an error\n"); - printf(" -Q \tQuit as soon as a test fails\n"); - printf(" -l \tPrint suite names\n"); - exit(-1); -} - -static void -clar_parse_args(int argc, char **argv) -{ - int i; - - for (i = 1; i < argc; ++i) { - char *argument = argv[i]; - - if (argument[0] != '-') - clar_usage(argv[0]); - - switch (argument[1]) { - case 's': - case 'i': - case 'x': { /* given suite name */ - int offset = (argument[2] == '=') ? 3 : 2, found = 0; - char action = argument[1]; - size_t j, arglen, suitelen, cmplen; - - argument += offset; - arglen = strlen(argument); - - if (arglen == 0) - clar_usage(argv[0]); - - for (j = 0; j < _clar_suite_count; ++j) { - suitelen = strlen(_clar_suites[j].name); - cmplen = (arglen < suitelen) ? arglen : suitelen; - - if (strncmp(argument, _clar_suites[j].name, cmplen) == 0) { - int exact = (arglen >= suitelen); - - ++found; - - if (!exact) - _clar.report_suite_names = 1; - - switch (action) { - case 's': _clar_suites[j].enabled = 1; clar_run_suite(&_clar_suites[j], argument); break; - case 'i': _clar_suites[j].enabled = 1; break; - case 'x': _clar_suites[j].enabled = 0; break; - } - - if (exact) - break; - } - } - - if (!found) { - clar_print_onabort("No suite matching '%s' found.\n", argument); - exit(-1); - } - break; - } - - case 'q': - _clar.report_errors_only = 1; - break; - - case 'Q': - _clar.exit_on_error = 1; - break; - - case 'l': { - size_t j; - printf("Test suites (use -s to run just one):\n"); - for (j = 0; j < _clar_suite_count; ++j) - printf(" %3d: %s\n", (int)j, _clar_suites[j].name); - - exit(0); - } - - case 'v': - _clar.report_suite_names = 1; - break; - - default: - clar_usage(argv[0]); - } - } -} - -void -clar_test_init(int argc, char **argv) -{ - clar_print_init( - (int)_clar_callback_count, - (int)_clar_suite_count, - "" - ); - - if (clar_sandbox() < 0) { - clar_print_onabort("Failed to sandbox the test runner.\n"); - exit(-1); - } - - _clar.argc = argc; - _clar.argv = argv; -} - -int -clar_test_run() -{ - if (_clar.argc > 1) - clar_parse_args(_clar.argc, _clar.argv); - - if (!_clar.suites_ran) { - size_t i; - for (i = 0; i < _clar_suite_count; ++i) - clar_run_suite(&_clar_suites[i], NULL); - } - - return _clar.total_errors; -} - -void -clar_test_shutdown() -{ - clar_print_shutdown( - _clar.tests_ran, - (int)_clar_suite_count, - _clar.total_errors - ); - - clar_unsandbox(); -} - -int -clar_test(int argc, char **argv) -{ - int errors; - - clar_test_init(argc, argv); - errors = clar_test_run(); - clar_test_shutdown(); - - return errors; -} - -static void abort_test(void) -{ - if (!_clar.trampoline_enabled) { - clar_print_onabort( - "Fatal error: a cleanup method raised an exception."); - clar_report_errors(); - exit(-1); - } - - CL_TRACE(CL_TRACE__TEST__LONGJMP); - longjmp(_clar.trampoline, -1); -} - -void clar__skip(void) -{ - _clar.test_status = CL_TEST_SKIP; - _clar.total_skipped++; - abort_test(); -} - -void clar__fail( - const char *file, - int line, - const char *error_msg, - const char *description, - int should_abort) -{ - struct clar_error *error = calloc(1, sizeof(struct clar_error)); - - if (_clar.errors == NULL) - _clar.errors = error; - - if (_clar.last_error != NULL) - _clar.last_error->next = error; - - _clar.last_error = error; - - error->test = _clar.active_test; - error->test_number = _clar.tests_ran; - error->suite = _clar.active_suite; - error->file = file; - error->line_number = line; - error->error_msg = error_msg; - - if (description != NULL) - error->description = strdup(description); - - _clar.total_errors++; - _clar.test_status = CL_TEST_FAILURE; - - if (should_abort) - abort_test(); -} - -void clar__assert( - int condition, - const char *file, - int line, - const char *error_msg, - const char *description, - int should_abort) -{ - if (condition) - return; - - clar__fail(file, line, error_msg, description, should_abort); -} - -void clar__assert_equal( - const char *file, - int line, - const char *err, - int should_abort, - const char *fmt, - ...) -{ - va_list args; - char buf[4096]; - int is_equal = 1; - - va_start(args, fmt); - - if (!strcmp("%s", fmt)) { - const char *s1 = va_arg(args, const char *); - const char *s2 = va_arg(args, const char *); - is_equal = (!s1 || !s2) ? (s1 == s2) : !strcmp(s1, s2); - - if (!is_equal) { - if (s1 && s2) { - int pos; - for (pos = 0; s1[pos] == s2[pos] && s1[pos] && s2[pos]; ++pos) - /* find differing byte offset */; - p_snprintf(buf, sizeof(buf), "'%s' != '%s' (at byte %d)", - s1, s2, pos); - } else { - p_snprintf(buf, sizeof(buf), "'%s' != '%s'", s1, s2); - } - } - } - else if(!strcmp("%.*s", fmt)) { - const char *s1 = va_arg(args, const char *); - const char *s2 = va_arg(args, const char *); - int len = va_arg(args, int); - is_equal = (!s1 || !s2) ? (s1 == s2) : !strncmp(s1, s2, len); - - if (!is_equal) { - if (s1 && s2) { - int pos; - for (pos = 0; s1[pos] == s2[pos] && pos < len; ++pos) - /* find differing byte offset */; - p_snprintf(buf, sizeof(buf), "'%.*s' != '%.*s' (at byte %d)", - len, s1, len, s2, pos); - } else { - p_snprintf(buf, sizeof(buf), "'%.*s' != '%.*s'", len, s1, len, s2); - } - } - } - else if (!strcmp("%ls", fmt)) { - const wchar_t *wcs1 = va_arg(args, const wchar_t *); - const wchar_t *wcs2 = va_arg(args, const wchar_t *); - is_equal = (!wcs1 || !wcs2) ? (wcs1 == wcs2) : !wcscmp(wcs1, wcs2); - - if (!is_equal) { - if (wcs1 && wcs2) { - int pos; - for (pos = 0; wcs1[pos] == wcs2[pos] && wcs1[pos] && wcs2[pos]; ++pos) - /* find differing byte offset */; - p_snprintf(buf, sizeof(buf), "'%ls' != '%ls' (at byte %d)", - wcs1, wcs2, pos); - } else { - p_snprintf(buf, sizeof(buf), "'%ls' != '%ls'", wcs1, wcs2); - } - } - } - else if(!strcmp("%.*ls", fmt)) { - const wchar_t *wcs1 = va_arg(args, const wchar_t *); - const wchar_t *wcs2 = va_arg(args, const wchar_t *); - int len = va_arg(args, int); - is_equal = (!wcs1 || !wcs2) ? (wcs1 == wcs2) : !wcsncmp(wcs1, wcs2, len); - - if (!is_equal) { - if (wcs1 && wcs2) { - int pos; - for (pos = 0; wcs1[pos] == wcs2[pos] && pos < len; ++pos) - /* find differing byte offset */; - p_snprintf(buf, sizeof(buf), "'%.*ls' != '%.*ls' (at byte %d)", - len, wcs1, len, wcs2, pos); - } else { - p_snprintf(buf, sizeof(buf), "'%.*ls' != '%.*ls'", len, wcs1, len, wcs2); - } - } - } - else if (!strcmp("%"PRIuZ, fmt) || !strcmp("%"PRIxZ, fmt)) { - size_t sz1 = va_arg(args, size_t), sz2 = va_arg(args, size_t); - is_equal = (sz1 == sz2); - if (!is_equal) { - int offset = p_snprintf(buf, sizeof(buf), fmt, sz1); - strncat(buf, " != ", sizeof(buf) - offset); - p_snprintf(buf + offset + 4, sizeof(buf) - offset - 4, fmt, sz2); - } - } - else if (!strcmp("%p", fmt)) { - void *p1 = va_arg(args, void *), *p2 = va_arg(args, void *); - is_equal = (p1 == p2); - if (!is_equal) - p_snprintf(buf, sizeof(buf), "%p != %p", p1, p2); - } - else { - int i1 = va_arg(args, int), i2 = va_arg(args, int); - is_equal = (i1 == i2); - if (!is_equal) { - int offset = p_snprintf(buf, sizeof(buf), fmt, i1); - strncat(buf, " != ", sizeof(buf) - offset); - p_snprintf(buf + offset + 4, sizeof(buf) - offset - 4, fmt, i2); - } - } - - va_end(args); - - if (!is_equal) - clar__fail(file, line, err, buf, should_abort); -} - -void cl_set_cleanup(void (*cleanup)(void *), void *opaque) -{ - _clar.local_cleanup = cleanup; - _clar.local_cleanup_payload = opaque; -} - -#include "clar/sandbox.h" -#include "clar/fixtures.h" -#include "clar/fs.h" -#include "clar/print.h" diff --git a/vendor/libgit2/tests/clar.h b/vendor/libgit2/tests/clar.h deleted file mode 100644 index 5c674d70f8..0000000000 --- a/vendor/libgit2/tests/clar.h +++ /dev/null @@ -1,161 +0,0 @@ -/* - * Copyright (c) Vicent Marti. All rights reserved. - * - * This file is part of clar, distributed under the ISC license. - * For full terms see the included COPYING file. - */ -#ifndef __CLAR_TEST_H__ -#define __CLAR_TEST_H__ - -#include - -enum cl_test_status { - CL_TEST_OK, - CL_TEST_FAILURE, - CL_TEST_SKIP -}; - -void clar_test_init(int argc, char *argv[]); -int clar_test_run(void); -void clar_test_shutdown(void); - -int clar_test(int argc, char *argv[]); - -const char *clar_sandbox_path(void); - -void cl_set_cleanup(void (*cleanup)(void *), void *opaque); -void cl_fs_cleanup(void); - -/** - * cl_trace_* is a hook to provide a simple global tracing - * mechanism. - * - * The goal here is to let main() provide clar-proper - * with a callback to optionally write log info for - * test operations into the same stream used by their - * actual tests. This would let them print test names - * and maybe performance data as they choose. - * - * The goal is NOT to alter the flow of control or to - * override test selection/skipping. (So the callback - * does not return a value.) - * - * The goal is NOT to duplicate the existing - * pass/fail/skip reporting. (So the callback - * does not accept a status/errorcode argument.) - * - */ -typedef enum cl_trace_event { - CL_TRACE__SUITE_BEGIN, - CL_TRACE__SUITE_END, - CL_TRACE__TEST__BEGIN, - CL_TRACE__TEST__END, - CL_TRACE__TEST__RUN_BEGIN, - CL_TRACE__TEST__RUN_END, - CL_TRACE__TEST__LONGJMP, -} cl_trace_event; - -typedef void (cl_trace_cb)( - cl_trace_event ev, - const char *suite_name, - const char *test_name, - void *payload); - -/** - * Register a callback into CLAR to send global trace events. - * Pass NULL to disable. - */ -void cl_trace_register(cl_trace_cb *cb, void *payload); - - -#ifdef CLAR_FIXTURE_PATH -const char *cl_fixture(const char *fixture_name); -void cl_fixture_sandbox(const char *fixture_name); -void cl_fixture_cleanup(const char *fixture_name); -#endif - -/** - * Assertion macros with explicit error message - */ -#define cl_must_pass_(expr, desc) clar__assert((expr) >= 0, __FILE__, __LINE__, "Function call failed: " #expr, desc, 1) -#define cl_must_fail_(expr, desc) clar__assert((expr) < 0, __FILE__, __LINE__, "Expected function call to fail: " #expr, desc, 1) -#define cl_assert_(expr, desc) clar__assert((expr) != 0, __FILE__, __LINE__, "Expression is not true: " #expr, desc, 1) - -/** - * Check macros with explicit error message - */ -#define cl_check_pass_(expr, desc) clar__assert((expr) >= 0, __FILE__, __LINE__, "Function call failed: " #expr, desc, 0) -#define cl_check_fail_(expr, desc) clar__assert((expr) < 0, __FILE__, __LINE__, "Expected function call to fail: " #expr, desc, 0) -#define cl_check_(expr, desc) clar__assert((expr) != 0, __FILE__, __LINE__, "Expression is not true: " #expr, desc, 0) - -/** - * Assertion macros with no error message - */ -#define cl_must_pass(expr) cl_must_pass_(expr, NULL) -#define cl_must_fail(expr) cl_must_fail_(expr, NULL) -#define cl_assert(expr) cl_assert_(expr, NULL) - -/** - * Check macros with no error message - */ -#define cl_check_pass(expr) cl_check_pass_(expr, NULL) -#define cl_check_fail(expr) cl_check_fail_(expr, NULL) -#define cl_check(expr) cl_check_(expr, NULL) - -/** - * Forced failure/warning - */ -#define cl_fail(desc) clar__fail(__FILE__, __LINE__, "Test failed.", desc, 1) -#define cl_warning(desc) clar__fail(__FILE__, __LINE__, "Warning during test execution:", desc, 0) - -#define cl_skip() clar__skip() - -/** - * Typed assertion macros - */ -#define cl_assert_equal_s(s1,s2) clar__assert_equal(__FILE__,__LINE__,"String mismatch: " #s1 " != " #s2, 1, "%s", (s1), (s2)) -#define cl_assert_equal_s_(s1,s2,note) clar__assert_equal(__FILE__,__LINE__,"String mismatch: " #s1 " != " #s2 " (" #note ")", 1, "%s", (s1), (s2)) - -#define cl_assert_equal_wcs(wcs1,wcs2) clar__assert_equal(__FILE__,__LINE__,"String mismatch: " #wcs1 " != " #wcs2, 1, "%ls", (wcs1), (wcs2)) -#define cl_assert_equal_wcs_(wcs1,wcs2,note) clar__assert_equal(__FILE__,__LINE__,"String mismatch: " #wcs1 " != " #wcs2 " (" #note ")", 1, "%ls", (wcs1), (wcs2)) - -#define cl_assert_equal_strn(s1,s2,len) clar__assert_equal(__FILE__,__LINE__,"String mismatch: " #s1 " != " #s2, 1, "%.*s", (s1), (s2), (int)(len)) -#define cl_assert_equal_strn_(s1,s2,len,note) clar__assert_equal(__FILE__,__LINE__,"String mismatch: " #s1 " != " #s2 " (" #note ")", 1, "%.*s", (s1), (s2), (int)(len)) - -#define cl_assert_equal_wcsn(wcs1,wcs2,len) clar__assert_equal(__FILE__,__LINE__,"String mismatch: " #wcs1 " != " #wcs2, 1, "%.*ls", (wcs1), (wcs2), (int)(len)) -#define cl_assert_equal_wcsn_(wcs1,wcs2,len,note) clar__assert_equal(__FILE__,__LINE__,"String mismatch: " #wcs1 " != " #wcs2 " (" #note ")", 1, "%.*ls", (wcs1), (wcs2), (int)(len)) - -#define cl_assert_equal_i(i1,i2) clar__assert_equal(__FILE__,__LINE__,#i1 " != " #i2, 1, "%d", (int)(i1), (int)(i2)) -#define cl_assert_equal_i_(i1,i2,note) clar__assert_equal(__FILE__,__LINE__,#i1 " != " #i2 " (" #note ")", 1, "%d", (i1), (i2)) -#define cl_assert_equal_i_fmt(i1,i2,fmt) clar__assert_equal(__FILE__,__LINE__,#i1 " != " #i2, 1, (fmt), (int)(i1), (int)(i2)) - -#define cl_assert_equal_b(b1,b2) clar__assert_equal(__FILE__,__LINE__,#b1 " != " #b2, 1, "%d", (int)((b1) != 0),(int)((b2) != 0)) - -#define cl_assert_equal_p(p1,p2) clar__assert_equal(__FILE__,__LINE__,"Pointer mismatch: " #p1 " != " #p2, 1, "%p", (p1), (p2)) - -void clar__skip(void); - -void clar__fail( - const char *file, - int line, - const char *error, - const char *description, - int should_abort); - -void clar__assert( - int condition, - const char *file, - int line, - const char *error, - const char *description, - int should_abort); - -void clar__assert_equal( - const char *file, - int line, - const char *err, - int should_abort, - const char *fmt, - ...); - -#endif diff --git a/vendor/libgit2/tests/clar/fixtures.h b/vendor/libgit2/tests/clar/fixtures.h deleted file mode 100644 index f7b8d96af8..0000000000 --- a/vendor/libgit2/tests/clar/fixtures.h +++ /dev/null @@ -1,51 +0,0 @@ -static const char * -fixture_path(const char *base, const char *fixture_name) -{ - static char _path[4096]; - size_t root_len; - - root_len = strlen(base); - strncpy(_path, base, sizeof(_path)); - - if (_path[root_len - 1] != '/') - _path[root_len++] = '/'; - - if (fixture_name[0] == '/') - fixture_name++; - - strncpy(_path + root_len, - fixture_name, - sizeof(_path) - root_len); - - return _path; -} - -static const char * -fixture_basename(const char *fixture_name) -{ - const char *p; - - for (p = fixture_name; *p; p++) { - if (p[0] == '/' && p[1] && p[1] != '/') - fixture_name = p+1; - } - - return fixture_name; -} - -#ifdef CLAR_FIXTURE_PATH -const char *cl_fixture(const char *fixture_name) -{ - return fixture_path(CLAR_FIXTURE_PATH, fixture_name); -} - -void cl_fixture_sandbox(const char *fixture_name) -{ - fs_copy(cl_fixture(fixture_name), _clar_path); -} - -void cl_fixture_cleanup(const char *fixture_name) -{ - fs_rm(fixture_path(_clar_path, fixture_basename(fixture_name))); -} -#endif diff --git a/vendor/libgit2/tests/clar/fs.h b/vendor/libgit2/tests/clar/fs.h deleted file mode 100644 index 7c7dde6fca..0000000000 --- a/vendor/libgit2/tests/clar/fs.h +++ /dev/null @@ -1,333 +0,0 @@ -#ifdef _WIN32 - -#define RM_RETRY_COUNT 5 -#define RM_RETRY_DELAY 10 - -#ifdef __MINGW32__ - -/* These security-enhanced functions are not available - * in MinGW, so just use the vanilla ones */ -#define wcscpy_s(a, b, c) wcscpy((a), (c)) -#define wcscat_s(a, b, c) wcscat((a), (c)) - -#endif /* __MINGW32__ */ - -static int -fs__dotordotdot(WCHAR *_tocheck) -{ - return _tocheck[0] == '.' && - (_tocheck[1] == '\0' || - (_tocheck[1] == '.' && _tocheck[2] == '\0')); -} - -static int -fs_rmdir_rmdir(WCHAR *_wpath) -{ - unsigned retries = 1; - - while (!RemoveDirectoryW(_wpath)) { - /* Only retry when we have retries remaining, and the - * error was ERROR_DIR_NOT_EMPTY. */ - if (retries++ > RM_RETRY_COUNT || - ERROR_DIR_NOT_EMPTY != GetLastError()) - return -1; - - /* Give whatever has a handle to a child item some time - * to release it before trying again */ - Sleep(RM_RETRY_DELAY * retries * retries); - } - - return 0; -} - -static void -fs_rmdir_helper(WCHAR *_wsource) -{ - WCHAR buffer[MAX_PATH]; - HANDLE find_handle; - WIN32_FIND_DATAW find_data; - size_t buffer_prefix_len; - - /* Set up the buffer and capture the length */ - wcscpy_s(buffer, MAX_PATH, _wsource); - wcscat_s(buffer, MAX_PATH, L"\\"); - buffer_prefix_len = wcslen(buffer); - - /* FindFirstFile needs a wildcard to match multiple items */ - wcscat_s(buffer, MAX_PATH, L"*"); - find_handle = FindFirstFileW(buffer, &find_data); - cl_assert(INVALID_HANDLE_VALUE != find_handle); - - do { - /* FindFirstFile/FindNextFile gives back . and .. - * entries at the beginning */ - if (fs__dotordotdot(find_data.cFileName)) - continue; - - wcscpy_s(buffer + buffer_prefix_len, MAX_PATH - buffer_prefix_len, find_data.cFileName); - - if (FILE_ATTRIBUTE_DIRECTORY & find_data.dwFileAttributes) - fs_rmdir_helper(buffer); - else { - /* If set, the +R bit must be cleared before deleting */ - if (FILE_ATTRIBUTE_READONLY & find_data.dwFileAttributes) - cl_assert(SetFileAttributesW(buffer, find_data.dwFileAttributes & ~FILE_ATTRIBUTE_READONLY)); - - cl_assert(DeleteFileW(buffer)); - } - } - while (FindNextFileW(find_handle, &find_data)); - - /* Ensure that we successfully completed the enumeration */ - cl_assert(ERROR_NO_MORE_FILES == GetLastError()); - - /* Close the find handle */ - FindClose(find_handle); - - /* Now that the directory is empty, remove it */ - cl_assert(0 == fs_rmdir_rmdir(_wsource)); -} - -static int -fs_rm_wait(WCHAR *_wpath) -{ - unsigned retries = 1; - DWORD last_error; - - do { - if (INVALID_FILE_ATTRIBUTES == GetFileAttributesW(_wpath)) - last_error = GetLastError(); - else - last_error = ERROR_SUCCESS; - - /* Is the item gone? */ - if (ERROR_FILE_NOT_FOUND == last_error || - ERROR_PATH_NOT_FOUND == last_error) - return 0; - - Sleep(RM_RETRY_DELAY * retries * retries); - } - while (retries++ <= RM_RETRY_COUNT); - - return -1; -} - -static void -fs_rm(const char *_source) -{ - WCHAR wsource[MAX_PATH]; - DWORD attrs; - - /* The input path is UTF-8. Convert it to wide characters - * for use with the Windows API */ - cl_assert(MultiByteToWideChar(CP_UTF8, - MB_ERR_INVALID_CHARS, - _source, - -1, /* Indicates NULL termination */ - wsource, - MAX_PATH)); - - /* Does the item exist? If not, we have no work to do */ - attrs = GetFileAttributesW(wsource); - - if (INVALID_FILE_ATTRIBUTES == attrs) - return; - - if (FILE_ATTRIBUTE_DIRECTORY & attrs) - fs_rmdir_helper(wsource); - else { - /* The item is a file. Strip the +R bit */ - if (FILE_ATTRIBUTE_READONLY & attrs) - cl_assert(SetFileAttributesW(wsource, attrs & ~FILE_ATTRIBUTE_READONLY)); - - cl_assert(DeleteFileW(wsource)); - } - - /* Wait for the DeleteFile or RemoveDirectory call to complete */ - cl_assert(0 == fs_rm_wait(wsource)); -} - -static void -fs_copydir_helper(WCHAR *_wsource, WCHAR *_wdest) -{ - WCHAR buf_source[MAX_PATH], buf_dest[MAX_PATH]; - HANDLE find_handle; - WIN32_FIND_DATAW find_data; - size_t buf_source_prefix_len, buf_dest_prefix_len; - - wcscpy_s(buf_source, MAX_PATH, _wsource); - wcscat_s(buf_source, MAX_PATH, L"\\"); - buf_source_prefix_len = wcslen(buf_source); - - wcscpy_s(buf_dest, MAX_PATH, _wdest); - wcscat_s(buf_dest, MAX_PATH, L"\\"); - buf_dest_prefix_len = wcslen(buf_dest); - - /* Get an enumerator for the items in the source. */ - wcscat_s(buf_source, MAX_PATH, L"*"); - find_handle = FindFirstFileW(buf_source, &find_data); - cl_assert(INVALID_HANDLE_VALUE != find_handle); - - /* Create the target directory. */ - cl_assert(CreateDirectoryW(_wdest, NULL)); - - do { - /* FindFirstFile/FindNextFile gives back . and .. - * entries at the beginning */ - if (fs__dotordotdot(find_data.cFileName)) - continue; - - wcscpy_s(buf_source + buf_source_prefix_len, MAX_PATH - buf_source_prefix_len, find_data.cFileName); - wcscpy_s(buf_dest + buf_dest_prefix_len, MAX_PATH - buf_dest_prefix_len, find_data.cFileName); - - if (FILE_ATTRIBUTE_DIRECTORY & find_data.dwFileAttributes) - fs_copydir_helper(buf_source, buf_dest); - else - cl_assert(CopyFileW(buf_source, buf_dest, TRUE)); - } - while (FindNextFileW(find_handle, &find_data)); - - /* Ensure that we successfully completed the enumeration */ - cl_assert(ERROR_NO_MORE_FILES == GetLastError()); - - /* Close the find handle */ - FindClose(find_handle); -} - -static void -fs_copy(const char *_source, const char *_dest) -{ - WCHAR wsource[MAX_PATH], wdest[MAX_PATH]; - DWORD source_attrs, dest_attrs; - HANDLE find_handle; - WIN32_FIND_DATAW find_data; - - /* The input paths are UTF-8. Convert them to wide characters - * for use with the Windows API. */ - cl_assert(MultiByteToWideChar(CP_UTF8, - MB_ERR_INVALID_CHARS, - _source, - -1, - wsource, - MAX_PATH)); - - cl_assert(MultiByteToWideChar(CP_UTF8, - MB_ERR_INVALID_CHARS, - _dest, - -1, - wdest, - MAX_PATH)); - - /* Check the source for existence */ - source_attrs = GetFileAttributesW(wsource); - cl_assert(INVALID_FILE_ATTRIBUTES != source_attrs); - - /* Check the target for existence */ - dest_attrs = GetFileAttributesW(wdest); - - if (INVALID_FILE_ATTRIBUTES != dest_attrs) { - /* Target exists; append last path part of source to target. - * Use FindFirstFile to parse the path */ - find_handle = FindFirstFileW(wsource, &find_data); - cl_assert(INVALID_HANDLE_VALUE != find_handle); - wcscat_s(wdest, MAX_PATH, L"\\"); - wcscat_s(wdest, MAX_PATH, find_data.cFileName); - FindClose(find_handle); - - /* Check the new target for existence */ - cl_assert(INVALID_FILE_ATTRIBUTES == GetFileAttributesW(wdest)); - } - - if (FILE_ATTRIBUTE_DIRECTORY & source_attrs) - fs_copydir_helper(wsource, wdest); - else - cl_assert(CopyFileW(wsource, wdest, TRUE)); -} - -void -cl_fs_cleanup(void) -{ - fs_rm(fixture_path(_clar_path, "*")); -} - -#else - -#include -#include - -static int -shell_out(char * const argv[]) -{ - int status, piderr; - pid_t pid; - - pid = fork(); - - if (pid < 0) { - fprintf(stderr, - "System error: `fork()` call failed (%d) - %s\n", - errno, strerror(errno)); - exit(-1); - } - - if (pid == 0) { - execv(argv[0], argv); - } - - do { - piderr = waitpid(pid, &status, WUNTRACED); - } while (piderr < 0 && (errno == EAGAIN || errno == EINTR)); - - return WEXITSTATUS(status); -} - -static void -fs_copy(const char *_source, const char *dest) -{ - char *argv[5]; - char *source; - size_t source_len; - - source = strdup(_source); - source_len = strlen(source); - - if (source[source_len - 1] == '/') - source[source_len - 1] = 0; - - argv[0] = "/bin/cp"; - argv[1] = "-R"; - argv[2] = source; - argv[3] = (char *)dest; - argv[4] = NULL; - - cl_must_pass_( - shell_out(argv), - "Failed to copy test fixtures to sandbox" - ); - - free(source); -} - -static void -fs_rm(const char *source) -{ - char *argv[4]; - - argv[0] = "/bin/rm"; - argv[1] = "-Rf"; - argv[2] = (char *)source; - argv[3] = NULL; - - cl_must_pass_( - shell_out(argv), - "Failed to cleanup the sandbox" - ); -} - -void -cl_fs_cleanup(void) -{ - clar_unsandbox(); - clar_sandbox(); -} -#endif diff --git a/vendor/libgit2/tests/clar/print.h b/vendor/libgit2/tests/clar/print.h deleted file mode 100644 index 6529b6b4c8..0000000000 --- a/vendor/libgit2/tests/clar/print.h +++ /dev/null @@ -1,66 +0,0 @@ - -static void clar_print_init(int test_count, int suite_count, const char *suite_names) -{ - (void)test_count; - printf("Loaded %d suites: %s\n", (int)suite_count, suite_names); - printf("Started\n"); -} - -static void clar_print_shutdown(int test_count, int suite_count, int error_count) -{ - (void)test_count; - (void)suite_count; - (void)error_count; - - printf("\n\n"); - clar_report_errors(); -} - -static void clar_print_error(int num, const struct clar_error *error) -{ - printf(" %d) Failure:\n", num); - - printf("%s::%s [%s:%d]\n", - error->suite, - error->test, - error->file, - error->line_number); - - printf(" %s\n", error->error_msg); - - if (error->description != NULL) - printf(" %s\n", error->description); - - printf("\n"); - fflush(stdout); -} - -static void clar_print_ontest(const char *test_name, int test_number, enum cl_test_status status) -{ - (void)test_name; - (void)test_number; - - switch(status) { - case CL_TEST_OK: printf("."); break; - case CL_TEST_FAILURE: printf("F"); break; - case CL_TEST_SKIP: printf("S"); break; - } - - fflush(stdout); -} - -static void clar_print_onsuite(const char *suite_name, int suite_index) -{ - if (_clar.report_suite_names) - printf("\n%s", suite_name); - - (void)suite_index; -} - -static void clar_print_onabort(const char *msg, ...) -{ - va_list argp; - va_start(argp, msg); - vfprintf(stderr, msg, argp); - va_end(argp); -} diff --git a/vendor/libgit2/tests/clar/sandbox.h b/vendor/libgit2/tests/clar/sandbox.h deleted file mode 100644 index 4b83bf31d8..0000000000 --- a/vendor/libgit2/tests/clar/sandbox.h +++ /dev/null @@ -1,139 +0,0 @@ -static char _clar_path[4096]; - -static int -is_valid_tmp_path(const char *path) -{ - STAT_T st; - - if (stat(path, &st) != 0) - return 0; - - if (!S_ISDIR(st.st_mode)) - return 0; - - return (access(path, W_OK) == 0); -} - -static int -find_tmp_path(char *buffer, size_t length) -{ -#ifndef _WIN32 - static const size_t var_count = 5; - static const char *env_vars[] = { - "CLAR_TMP", "TMPDIR", "TMP", "TEMP", "USERPROFILE" - }; - - size_t i; - - for (i = 0; i < var_count; ++i) { - const char *env = getenv(env_vars[i]); - if (!env) - continue; - - if (is_valid_tmp_path(env)) { - strncpy(buffer, env, length); - return 0; - } - } - - /* If the environment doesn't say anything, try to use /tmp */ - if (is_valid_tmp_path("/tmp")) { - strncpy(buffer, "/tmp", length); - return 0; - } - -#else - DWORD env_len = GetEnvironmentVariable("CLAR_TMP", buffer, (DWORD)length); - if (env_len > 0 && env_len < (DWORD)length) - return 0; - - if (GetTempPath((DWORD)length, buffer)) - return 0; -#endif - - /* This system doesn't like us, try to use the current directory */ - if (is_valid_tmp_path(".")) { - strncpy(buffer, ".", length); - return 0; - } - - return -1; -} - -static void clar_unsandbox(void) -{ - if (_clar_path[0] == '\0') - return; - - cl_must_pass(chdir("..")); - - fs_rm(_clar_path); -} - -static int build_sandbox_path(void) -{ -#ifdef CLAR_TMPDIR - const char path_tail[] = CLAR_TMPDIR "_XXXXXX"; -#else - const char path_tail[] = "clar_tmp_XXXXXX"; -#endif - - size_t len; - - if (find_tmp_path(_clar_path, sizeof(_clar_path)) < 0) - return -1; - - len = strlen(_clar_path); - -#ifdef _WIN32 - { /* normalize path to POSIX forward slashes */ - size_t i; - for (i = 0; i < len; ++i) { - if (_clar_path[i] == '\\') - _clar_path[i] = '/'; - } - } -#endif - - if (_clar_path[len - 1] != '/') { - _clar_path[len++] = '/'; - } - - strncpy(_clar_path + len, path_tail, sizeof(_clar_path) - len); - -#if defined(__MINGW32__) - if (_mktemp(_clar_path) == NULL) - return -1; - - if (mkdir(_clar_path, 0700) != 0) - return -1; -#elif defined(_WIN32) - if (_mktemp_s(_clar_path, sizeof(_clar_path)) != 0) - return -1; - - if (mkdir(_clar_path, 0700) != 0) - return -1; -#else - if (mkdtemp(_clar_path) == NULL) - return -1; -#endif - - return 0; -} - -static int clar_sandbox(void) -{ - if (_clar_path[0] == '\0' && build_sandbox_path() < 0) - return -1; - - if (chdir(_clar_path) != 0) - return -1; - - return 0; -} - -const char *clar_sandbox_path(void) -{ - return _clar_path; -} - diff --git a/vendor/libgit2/tests/clar_libgit2.c b/vendor/libgit2/tests/clar_libgit2.c deleted file mode 100644 index b14af44a97..0000000000 --- a/vendor/libgit2/tests/clar_libgit2.c +++ /dev/null @@ -1,570 +0,0 @@ -#include "clar_libgit2.h" -#include "posix.h" -#include "path.h" -#include "git2/sys/repository.h" - -void cl_git_report_failure( - int error, const char *file, int line, const char *fncall) -{ - char msg[4096]; - const git_error *last = giterr_last(); - p_snprintf(msg, 4096, "error %d - %s", - error, last ? last->message : ""); - clar__assert(0, file, line, fncall, msg, 1); -} - -void cl_git_mkfile(const char *filename, const char *content) -{ - int fd; - - fd = p_creat(filename, 0666); - cl_assert(fd != -1); - - if (content) { - cl_must_pass(p_write(fd, content, strlen(content))); - } else { - cl_must_pass(p_write(fd, filename, strlen(filename))); - cl_must_pass(p_write(fd, "\n", 1)); - } - - cl_must_pass(p_close(fd)); -} - -void cl_git_write2file( - const char *path, const char *content, size_t content_len, - int flags, unsigned int mode) -{ - int fd; - cl_assert(path && content); - cl_assert((fd = p_open(path, flags, mode)) >= 0); - if (!content_len) - content_len = strlen(content); - cl_must_pass(p_write(fd, content, content_len)); - cl_must_pass(p_close(fd)); -} - -void cl_git_append2file(const char *path, const char *content) -{ - cl_git_write2file(path, content, 0, O_WRONLY | O_CREAT | O_APPEND, 0644); -} - -void cl_git_rewritefile(const char *path, const char *content) -{ - cl_git_write2file(path, content, 0, O_WRONLY | O_CREAT | O_TRUNC, 0644); -} - -void cl_git_rmfile(const char *filename) -{ - cl_must_pass(p_unlink(filename)); -} - -#ifdef GIT_WIN32 - -#include "win32/utf-conv.h" - -char *cl_getenv(const char *name) -{ - wchar_t *wide_name, *wide_value; - char *utf8_value = NULL; - DWORD value_len; - - cl_assert(git__utf8_to_16_alloc(&wide_name, name) >= 0); - - value_len = GetEnvironmentVariableW(wide_name, NULL, 0); - - if (value_len) { - cl_assert(wide_value = git__malloc(value_len * sizeof(wchar_t))); - cl_assert(GetEnvironmentVariableW(wide_name, wide_value, value_len)); - cl_assert(git__utf16_to_8_alloc(&utf8_value, wide_value) >= 0); - git__free(wide_value); - } - - git__free(wide_name); - return utf8_value; -} - -int cl_setenv(const char *name, const char *value) -{ - wchar_t *wide_name, *wide_value = NULL; - - cl_assert(git__utf8_to_16_alloc(&wide_name, name) >= 0); - - if (value) { - cl_assert(git__utf8_to_16_alloc(&wide_value, value) >= 0); - cl_assert(SetEnvironmentVariableW(wide_name, wide_value)); - } else { - /* Windows XP returns 0 (failed) when passing NULL for lpValue when - * lpName does not exist in the environment block. This behavior - * seems to have changed in later versions. Don't check the return value - * of SetEnvironmentVariable when passing NULL for lpValue. */ - SetEnvironmentVariableW(wide_name, NULL); - } - - git__free(wide_name); - git__free(wide_value); - return 0; -} - -/* This function performs retries on calls to MoveFile in order - * to provide enhanced reliability in the face of antivirus - * agents that may be scanning the source (or in the case that - * the source is a directory, a child of the source). */ -int cl_rename(const char *source, const char *dest) -{ - git_win32_path source_utf16; - git_win32_path dest_utf16; - unsigned retries = 1; - - cl_assert(git_win32_path_from_utf8(source_utf16, source) >= 0); - cl_assert(git_win32_path_from_utf8(dest_utf16, dest) >= 0); - - while (!MoveFileW(source_utf16, dest_utf16)) { - /* Only retry if the error is ERROR_ACCESS_DENIED; - * this may indicate that an antivirus agent is - * preventing the rename from source to target */ - if (retries > 5 || - ERROR_ACCESS_DENIED != GetLastError()) - return -1; - - /* With 5 retries and a coefficient of 10ms, the maximum - * delay here is 550 ms */ - Sleep(10 * retries * retries); - retries++; - } - - return 0; -} - -#else - -#include -char *cl_getenv(const char *name) -{ - return getenv(name); -} - -int cl_setenv(const char *name, const char *value) -{ - return (value == NULL) ? unsetenv(name) : setenv(name, value, 1); -} - -int cl_rename(const char *source, const char *dest) -{ - return p_rename(source, dest); -} - -#endif - -static const char *_cl_sandbox = NULL; -static git_repository *_cl_repo = NULL; - -git_repository *cl_git_sandbox_init(const char *sandbox) -{ - /* Copy the whole sandbox folder from our fixtures to our test sandbox - * area. After this it can be accessed with `./sandbox` - */ - cl_fixture_sandbox(sandbox); - _cl_sandbox = sandbox; - - cl_git_pass(p_chdir(sandbox)); - - /* If this is not a bare repo, then rename `sandbox/.gitted` to - * `sandbox/.git` which must be done since we cannot store a folder - * named `.git` inside the fixtures folder of our libgit2 repo. - */ - if (p_access(".gitted", F_OK) == 0) - cl_git_pass(cl_rename(".gitted", ".git")); - - /* If we have `gitattributes`, rename to `.gitattributes`. This may - * be necessary if we don't want the attributes to be applied in the - * libgit2 repo, but just during testing. - */ - if (p_access("gitattributes", F_OK) == 0) - cl_git_pass(cl_rename("gitattributes", ".gitattributes")); - - /* As with `gitattributes`, we may need `gitignore` just for testing. */ - if (p_access("gitignore", F_OK) == 0) - cl_git_pass(cl_rename("gitignore", ".gitignore")); - - cl_git_pass(p_chdir("..")); - - /* Now open the sandbox repository and make it available for tests */ - cl_git_pass(git_repository_open(&_cl_repo, sandbox)); - - /* Adjust configs after copying to new filesystem */ - cl_git_pass(git_repository_reinit_filesystem(_cl_repo, 0)); - - return _cl_repo; -} - -git_repository *cl_git_sandbox_init_new(const char *sandbox) -{ - cl_git_pass(git_repository_init(&_cl_repo, sandbox, false)); - _cl_sandbox = sandbox; - - return _cl_repo; -} - -git_repository *cl_git_sandbox_reopen(void) -{ - if (_cl_repo) { - git_repository_free(_cl_repo); - _cl_repo = NULL; - - cl_git_pass(git_repository_open(&_cl_repo, _cl_sandbox)); - } - - return _cl_repo; -} - -void cl_git_sandbox_cleanup(void) -{ - if (_cl_repo) { - git_repository_free(_cl_repo); - _cl_repo = NULL; - } - if (_cl_sandbox) { - cl_fixture_cleanup(_cl_sandbox); - _cl_sandbox = NULL; - } -} - -bool cl_toggle_filemode(const char *filename) -{ - struct stat st1, st2; - - cl_must_pass(p_stat(filename, &st1)); - cl_must_pass(p_chmod(filename, st1.st_mode ^ 0100)); - cl_must_pass(p_stat(filename, &st2)); - - return (st1.st_mode != st2.st_mode); -} - -bool cl_is_chmod_supported(void) -{ - static int _is_supported = -1; - - if (_is_supported < 0) { - cl_git_mkfile("filemode.t", "Test if filemode can be modified"); - _is_supported = cl_toggle_filemode("filemode.t"); - cl_must_pass(p_unlink("filemode.t")); - } - - return _is_supported; -} - -const char* cl_git_fixture_url(const char *fixturename) -{ - return cl_git_path_url(cl_fixture(fixturename)); -} - -const char* cl_git_path_url(const char *path) -{ - static char url[4096]; - - const char *in_buf; - git_buf path_buf = GIT_BUF_INIT; - git_buf url_buf = GIT_BUF_INIT; - - cl_git_pass(git_path_prettify_dir(&path_buf, path, NULL)); - cl_git_pass(git_buf_puts(&url_buf, "file://")); - -#ifdef GIT_WIN32 - /* - * A FILE uri matches the following format: file://[host]/path - * where "host" can be empty and "path" is an absolute path to the resource. - * - * In this test, no hostname is used, but we have to ensure the leading triple slashes: - * - * *nix: file:///usr/home/... - * Windows: file:///C:/Users/... - */ - cl_git_pass(git_buf_putc(&url_buf, '/')); -#endif - - in_buf = git_buf_cstr(&path_buf); - - /* - * A very hacky Url encoding that only takes care of escaping the spaces - */ - while (*in_buf) { - if (*in_buf == ' ') - cl_git_pass(git_buf_puts(&url_buf, "%20")); - else - cl_git_pass(git_buf_putc(&url_buf, *in_buf)); - - in_buf++; - } - - strncpy(url, git_buf_cstr(&url_buf), 4096); - git_buf_free(&url_buf); - git_buf_free(&path_buf); - return url; -} - -typedef struct { - const char *filename; - size_t filename_len; -} remove_data; - -static int remove_placeholders_recurs(void *_data, git_buf *path) -{ - remove_data *data = (remove_data *)_data; - size_t pathlen; - - if (git_path_isdir(path->ptr) == true) - return git_path_direach(path, 0, remove_placeholders_recurs, data); - - pathlen = path->size; - - if (pathlen < data->filename_len) - return 0; - - /* if path ends in '/'+filename (or equals filename) */ - if (!strcmp(data->filename, path->ptr + pathlen - data->filename_len) && - (pathlen == data->filename_len || - path->ptr[pathlen - data->filename_len - 1] == '/')) - return p_unlink(path->ptr); - - return 0; -} - -int cl_git_remove_placeholders(const char *directory_path, const char *filename) -{ - int error; - remove_data data; - git_buf buffer = GIT_BUF_INIT; - - if (git_path_isdir(directory_path) == false) - return -1; - - if (git_buf_sets(&buffer, directory_path) < 0) - return -1; - - data.filename = filename; - data.filename_len = strlen(filename); - - error = remove_placeholders_recurs(&data, &buffer); - - git_buf_free(&buffer); - - return error; -} - -#define CL_COMMIT_NAME "Libgit2 Tester" -#define CL_COMMIT_EMAIL "libgit2-test@github.com" -#define CL_COMMIT_MSG "Test commit of tree " - -void cl_repo_commit_from_index( - git_oid *out, - git_repository *repo, - git_signature *sig, - git_time_t time, - const char *msg) -{ - git_index *index; - git_oid commit_id, tree_id; - git_object *parent = NULL; - git_reference *ref = NULL; - git_tree *tree = NULL; - char buf[128]; - int free_sig = (sig == NULL); - - /* it is fine if looking up HEAD fails - we make this the first commit */ - git_revparse_ext(&parent, &ref, repo, "HEAD"); - - /* write the index content as a tree */ - cl_git_pass(git_repository_index(&index, repo)); - cl_git_pass(git_index_write_tree(&tree_id, index)); - cl_git_pass(git_index_write(index)); - git_index_free(index); - - cl_git_pass(git_tree_lookup(&tree, repo, &tree_id)); - - if (sig) - cl_assert(sig->name && sig->email); - else if (!time) - cl_git_pass(git_signature_now(&sig, CL_COMMIT_NAME, CL_COMMIT_EMAIL)); - else - cl_git_pass(git_signature_new( - &sig, CL_COMMIT_NAME, CL_COMMIT_EMAIL, time, 0)); - - if (!msg) { - strcpy(buf, CL_COMMIT_MSG); - git_oid_tostr(buf + strlen(CL_COMMIT_MSG), - sizeof(buf) - strlen(CL_COMMIT_MSG), &tree_id); - msg = buf; - } - - cl_git_pass(git_commit_create_v( - &commit_id, repo, ref ? git_reference_name(ref) : "HEAD", - sig, sig, NULL, msg, tree, parent ? 1 : 0, parent)); - - if (out) - git_oid_cpy(out, &commit_id); - - git_object_free(parent); - git_reference_free(ref); - if (free_sig) - git_signature_free(sig); - git_tree_free(tree); -} - -void cl_repo_set_bool(git_repository *repo, const char *cfg, int value) -{ - git_config *config; - cl_git_pass(git_repository_config(&config, repo)); - cl_git_pass(git_config_set_bool(config, cfg, value != 0)); - git_config_free(config); -} - -int cl_repo_get_bool(git_repository *repo, const char *cfg) -{ - int val = 0; - git_config *config; - cl_git_pass(git_repository_config(&config, repo)); - if (git_config_get_bool(&val, config, cfg) < 0) - giterr_clear(); - git_config_free(config); - return val; -} - -void cl_repo_set_string(git_repository *repo, const char *cfg, const char *value) -{ - git_config *config; - cl_git_pass(git_repository_config(&config, repo)); - cl_git_pass(git_config_set_string(config, cfg, value)); - git_config_free(config); -} - -/* this is essentially the code from git__unescape modified slightly */ -static size_t strip_cr_from_buf(char *start, size_t len) -{ - char *scan, *trail, *end = start + len; - - for (scan = trail = start; scan < end; trail++, scan++) { - while (*scan == '\r') - scan++; /* skip '\r' */ - - if (trail != scan) - *trail = *scan; - } - - *trail = '\0'; - - return (trail - start); -} - -void clar__assert_equal_file( - const char *expected_data, - size_t expected_bytes, - int ignore_cr, - const char *path, - const char *file, - int line) -{ - char buf[4000]; - ssize_t bytes, total_bytes = 0; - int fd = p_open(path, O_RDONLY | O_BINARY); - cl_assert(fd >= 0); - - if (expected_data && !expected_bytes) - expected_bytes = strlen(expected_data); - - while ((bytes = p_read(fd, buf, sizeof(buf))) != 0) { - clar__assert( - bytes > 0, file, line, "error reading from file", path, 1); - - if (ignore_cr) - bytes = strip_cr_from_buf(buf, bytes); - - if (memcmp(expected_data, buf, bytes) != 0) { - int pos; - for (pos = 0; pos < bytes && expected_data[pos] == buf[pos]; ++pos) - /* find differing byte offset */; - p_snprintf( - buf, sizeof(buf), "file content mismatch at byte %"PRIdZ, - (ssize_t)(total_bytes + pos)); - p_close(fd); - clar__fail(file, line, path, buf, 1); - } - - expected_data += bytes; - total_bytes += bytes; - } - - p_close(fd); - - clar__assert(!bytes, file, line, "error reading from file", path, 1); - clar__assert_equal(file, line, "mismatched file length", 1, "%"PRIuZ, - (size_t)expected_bytes, (size_t)total_bytes); -} - -static char *_cl_restore_home = NULL; - -void cl_fake_home_cleanup(void *payload) -{ - char *restore = _cl_restore_home; - _cl_restore_home = NULL; - - GIT_UNUSED(payload); - - if (restore) { - cl_git_pass(git_libgit2_opts( - GIT_OPT_SET_SEARCH_PATH, GIT_CONFIG_LEVEL_GLOBAL, restore)); - git__free(restore); - } -} - -void cl_fake_home(void) -{ - git_buf path = GIT_BUF_INIT; - - cl_git_pass(git_libgit2_opts( - GIT_OPT_GET_SEARCH_PATH, GIT_CONFIG_LEVEL_GLOBAL, &path)); - - _cl_restore_home = git_buf_detach(&path); - cl_set_cleanup(cl_fake_home_cleanup, NULL); - - if (!git_path_exists("home")) - cl_must_pass(p_mkdir("home", 0777)); - cl_git_pass(git_path_prettify(&path, "home", NULL)); - cl_git_pass(git_libgit2_opts( - GIT_OPT_SET_SEARCH_PATH, GIT_CONFIG_LEVEL_GLOBAL, path.ptr)); - git_buf_free(&path); -} - -void cl_sandbox_set_search_path_defaults(void) -{ - const char *sandbox_path = clar_sandbox_path(); - - git_libgit2_opts( - GIT_OPT_SET_SEARCH_PATH, GIT_CONFIG_LEVEL_GLOBAL, sandbox_path); - git_libgit2_opts( - GIT_OPT_SET_SEARCH_PATH, GIT_CONFIG_LEVEL_XDG, sandbox_path); - git_libgit2_opts( - GIT_OPT_SET_SEARCH_PATH, GIT_CONFIG_LEVEL_SYSTEM, sandbox_path); -} - -#ifdef GIT_WIN32 -bool cl_sandbox_supports_8dot3(void) -{ - git_buf longpath = GIT_BUF_INIT; - char *shortname; - bool supported; - - cl_git_pass( - git_buf_joinpath(&longpath, clar_sandbox_path(), "longer_than_8dot3")); - - cl_git_write2file(longpath.ptr, "", 0, O_RDWR|O_CREAT, 0666); - shortname = git_win32_path_8dot3_name(longpath.ptr); - - supported = (shortname != NULL); - - git__free(shortname); - git_buf_free(&longpath); - - return supported; -} -#endif - diff --git a/vendor/libgit2/tests/clar_libgit2.h b/vendor/libgit2/tests/clar_libgit2.h deleted file mode 100644 index 9ab0da4f60..0000000000 --- a/vendor/libgit2/tests/clar_libgit2.h +++ /dev/null @@ -1,169 +0,0 @@ -#ifndef __CLAR_LIBGIT2__ -#define __CLAR_LIBGIT2__ - -#include "clar.h" -#include -#include -#include "common.h" - -/** - * Replace for `clar_must_pass` that passes the last library error as the - * test failure message. - * - * Use this wrapper around all `git_` library calls that return error codes! - */ -#define cl_git_pass(expr) cl_git_pass_((expr), __FILE__, __LINE__) - -#define cl_git_pass_(expr, file, line) do { \ - int _lg2_error; \ - giterr_clear(); \ - if ((_lg2_error = (expr)) != 0) \ - cl_git_report_failure(_lg2_error, file, line, "Function call failed: " #expr); \ - } while (0) - -/** - * Wrapper for `clar_must_fail` -- this one is - * just for consistency. Use with `git_` library - * calls that are supposed to fail! - */ -#define cl_git_fail(expr) cl_must_fail(expr) - -#define cl_git_fail_with(expr, error) cl_assert_equal_i(error,expr) - -/** - * Like cl_git_pass, only for Win32 error code conventions - */ -#define cl_win32_pass(expr) do { \ - int _win32_res; \ - if ((_win32_res = (expr)) == 0) { \ - giterr_set(GITERR_OS, "Returned: %d, system error code: %d", _win32_res, GetLastError()); \ - cl_git_report_failure(_win32_res, __FILE__, __LINE__, "System call failed: " #expr); \ - } \ - } while(0) - -void cl_git_report_failure(int, const char *, int, const char *); - -#define cl_assert_at_line(expr,file,line) \ - clar__assert((expr) != 0, file, line, "Expression is not true: " #expr, NULL, 1) - -GIT_INLINE(void) clar__assert_in_range( - int lo, int val, int hi, - const char *file, int line, const char *err, int should_abort) -{ - if (lo > val || hi < val) { - char buf[128]; - p_snprintf(buf, sizeof(buf), "%d not in [%d,%d]", val, lo, hi); - clar__fail(file, line, err, buf, should_abort); - } -} - -#define cl_assert_equal_sz(sz1,sz2) do { \ - size_t __sz1 = (size_t)(sz1), __sz2 = (size_t)(sz2); \ - clar__assert_equal(__FILE__,__LINE__,#sz1 " != " #sz2, 1, "%"PRIuZ, __sz1, __sz2); \ -} while (0) - -#define cl_assert_in_range(L,V,H) \ - clar__assert_in_range((L),(V),(H),__FILE__,__LINE__,"Range check: " #V " in [" #L "," #H "]", 1) - -#define cl_assert_equal_file(DATA,SIZE,PATH) \ - clar__assert_equal_file(DATA,SIZE,0,PATH,__FILE__,(int)__LINE__) - -#define cl_assert_equal_file_ignore_cr(DATA,SIZE,PATH) \ - clar__assert_equal_file(DATA,SIZE,1,PATH,__FILE__,(int)__LINE__) - -void clar__assert_equal_file( - const char *expected_data, - size_t expected_size, - int ignore_cr, - const char *path, - const char *file, - int line); - -GIT_INLINE(void) clar__assert_equal_oid( - const char *file, int line, const char *desc, - const git_oid *one, const git_oid *two) -{ - if (git_oid_cmp(one, two)) { - char err[] = "\"........................................\" != \"........................................\""; - - git_oid_fmt(&err[1], one); - git_oid_fmt(&err[47], two); - - clar__fail(file, line, desc, err, 1); - } -} - -#define cl_assert_equal_oid(one, two) \ - clar__assert_equal_oid(__FILE__, __LINE__, \ - "OID mismatch: " #one " != " #two, (one), (two)) - -/* - * Some utility macros for building long strings - */ -#define REP4(STR) STR STR STR STR -#define REP15(STR) REP4(STR) REP4(STR) REP4(STR) STR STR STR -#define REP16(STR) REP4(REP4(STR)) -#define REP256(STR) REP16(REP16(STR)) -#define REP1024(STR) REP4(REP256(STR)) - -/* Write the contents of a buffer to disk */ -void cl_git_mkfile(const char *filename, const char *content); -void cl_git_append2file(const char *filename, const char *new_content); -void cl_git_rewritefile(const char *filename, const char *new_content); -void cl_git_write2file(const char *path, const char *data, - size_t datalen, int flags, unsigned int mode); -void cl_git_rmfile(const char *filename); - -bool cl_toggle_filemode(const char *filename); -bool cl_is_chmod_supported(void); - -/* Environment wrappers */ -char *cl_getenv(const char *name); -int cl_setenv(const char *name, const char *value); - -/* Reliable rename */ -int cl_rename(const char *source, const char *dest); - -/* Git sandbox setup helpers */ - -git_repository *cl_git_sandbox_init(const char *sandbox); -git_repository *cl_git_sandbox_init_new(const char *name); -void cl_git_sandbox_cleanup(void); -git_repository *cl_git_sandbox_reopen(void); - -/* Local-repo url helpers */ -const char* cl_git_fixture_url(const char *fixturename); -const char* cl_git_path_url(const char *path); - -/* Test repository cleaner */ -int cl_git_remove_placeholders(const char *directory_path, const char *filename); - -/* commit creation helpers */ -void cl_repo_commit_from_index( - git_oid *out, - git_repository *repo, - git_signature *sig, - git_time_t time, - const char *msg); - -/* config setting helpers */ -void cl_repo_set_bool(git_repository *repo, const char *cfg, int value); -int cl_repo_get_bool(git_repository *repo, const char *cfg); - -void cl_repo_set_string(git_repository *repo, const char *cfg, const char *value); - -/* set up a fake "home" directory and set libgit2 GLOBAL search path. - * - * automatically configures cleanup function to restore the regular search - * path, although you can call it explicitly if you wish (with NULL). - */ -void cl_fake_home(void); -void cl_fake_home_cleanup(void *); - -void cl_sandbox_set_search_path_defaults(void); - -#ifdef GIT_WIN32 -bool cl_sandbox_supports_8dot3(void); -#endif - -#endif diff --git a/vendor/libgit2/tests/clar_libgit2_timer.c b/vendor/libgit2/tests/clar_libgit2_timer.c deleted file mode 100644 index 737506da2c..0000000000 --- a/vendor/libgit2/tests/clar_libgit2_timer.c +++ /dev/null @@ -1,31 +0,0 @@ -#include "clar_libgit2.h" -#include "clar_libgit2_timer.h" -#include "buffer.h" - -void cl_perf_timer__init(cl_perf_timer *t) -{ - memset(t, 0, sizeof(cl_perf_timer)); -} - -void cl_perf_timer__start(cl_perf_timer *t) -{ - t->time_started = git__timer(); -} - -void cl_perf_timer__stop(cl_perf_timer *t) -{ - double time_now = git__timer(); - - t->last = time_now - t->time_started; - t->sum += t->last; -} - -double cl_perf_timer__last(const cl_perf_timer *t) -{ - return t->last; -} - -double cl_perf_timer__sum(const cl_perf_timer *t) -{ - return t->sum; -} diff --git a/vendor/libgit2/tests/clar_libgit2_timer.h b/vendor/libgit2/tests/clar_libgit2_timer.h deleted file mode 100644 index 0d150e0189..0000000000 --- a/vendor/libgit2/tests/clar_libgit2_timer.h +++ /dev/null @@ -1,35 +0,0 @@ -#ifndef __CLAR_LIBGIT2_TIMER__ -#define __CLAR_LIBGIT2_TIMER__ - -struct cl_perf_timer -{ - /* cummulative running time across all start..stop intervals */ - double sum; - - /* value of last start..stop interval */ - double last; - - /* clock value at start */ - double time_started; -}; - -#define CL_PERF_TIMER_INIT {0} - -typedef struct cl_perf_timer cl_perf_timer; - -void cl_perf_timer__init(cl_perf_timer *t); -void cl_perf_timer__start(cl_perf_timer *t); -void cl_perf_timer__stop(cl_perf_timer *t); - -/** - * return value of last start..stop interval in seconds. - */ -double cl_perf_timer__last(const cl_perf_timer *t); - -/** - * return cummulative running time across all start..stop - * intervals in seconds. - */ -double cl_perf_timer__sum(const cl_perf_timer *t); - -#endif /* __CLAR_LIBGIT2_TIMER__ */ diff --git a/vendor/libgit2/tests/clar_libgit2_trace.c b/vendor/libgit2/tests/clar_libgit2_trace.c deleted file mode 100644 index ae582d1cb4..0000000000 --- a/vendor/libgit2/tests/clar_libgit2_trace.c +++ /dev/null @@ -1,229 +0,0 @@ -#include "clar_libgit2.h" -#include "clar_libgit2_trace.h" -#include "clar_libgit2_timer.h" -#include "trace.h" - - -struct method { - const char *name; - void (*git_trace_cb)(git_trace_level_t level, const char *msg); - void (*close)(void); -}; - - -#if defined(GIT_TRACE) -static void _git_trace_cb__printf(git_trace_level_t level, const char *msg) -{ - /* TODO Use level to print a per-message prefix. */ - GIT_UNUSED(level); - - printf("%s\n", msg); -} - -#if defined(GIT_WIN32) -static void _git_trace_cb__debug(git_trace_level_t level, const char *msg) -{ - /* TODO Use level to print a per-message prefix. */ - GIT_UNUSED(level); - - OutputDebugString(msg); - OutputDebugString("\n"); - - printf("%s\n", msg); -} -#else -#define _git_trace_cb__debug _git_trace_cb__printf -#endif - - -static void _trace_printf_close(void) -{ - fflush(stdout); -} - -#define _trace_debug_close _trace_printf_close - - -static struct method s_methods[] = { - { "printf", _git_trace_cb__printf, _trace_printf_close }, - { "debug", _git_trace_cb__debug, _trace_debug_close }, - /* TODO add file method */ - {0}, -}; - - -static int s_trace_loaded = 0; -static int s_trace_level = GIT_TRACE_NONE; -static struct method *s_trace_method = NULL; - - -static int set_method(const char *name) -{ - int k; - - if (!name || !*name) - name = "printf"; - - for (k=0; (s_methods[k].name); k++) { - if (strcmp(name, s_methods[k].name) == 0) { - s_trace_method = &s_methods[k]; - return 0; - } - } - fprintf(stderr, "Unknown CLAR_TRACE_METHOD: '%s'\n", name); - return -1; -} - - -/** - * Lookup CLAR_TRACE_LEVEL and CLAR_TRACE_METHOD from - * the environment and set the above s_trace_* fields. - * - * If CLAR_TRACE_LEVEL is not set, we disable tracing. - * - * TODO If set, we assume GIT_TRACE_TRACE level, which - * logs everything. Later, we may want to parse the - * value of the environment variable and set a specific - * level. - * - * We assume the "printf" method. This can be changed - * with the CLAR_TRACE_METHOD environment variable. - * Currently, this is only needed on Windows for a "debug" - * version which also writes to the debug output window - * in Visual Studio. - * - * TODO add a "file" method that would open and write - * to a well-known file. This would help keep trace - * output and clar output separate. - * - */ -static void _load_trace_params(void) -{ - char *sz_level; - char *sz_method; - - s_trace_loaded = 1; - - sz_level = cl_getenv("CLAR_TRACE_LEVEL"); - if (!sz_level || !*sz_level) { - s_trace_level = GIT_TRACE_NONE; - s_trace_method = NULL; - return; - } - - /* TODO Parse sz_level and set s_trace_level. */ - s_trace_level = GIT_TRACE_TRACE; - - sz_method = cl_getenv("CLAR_TRACE_METHOD"); - if (set_method(sz_method) < 0) - set_method(NULL); -} - -#define HR "================================================================" - -/** - * Timer to report the take spend in a test's run() method. - */ -static cl_perf_timer s_timer_run = CL_PERF_TIMER_INIT; - -/** - * Timer to report total time in a test (init, run, cleanup). - */ -static cl_perf_timer s_timer_test = CL_PERF_TIMER_INIT; - -void _cl_trace_cb__event_handler( - cl_trace_event ev, - const char *suite_name, - const char *test_name, - void *payload) -{ - GIT_UNUSED(payload); - - switch (ev) { - case CL_TRACE__SUITE_BEGIN: - git_trace(GIT_TRACE_TRACE, "\n\n%s\n%s: Begin Suite", HR, suite_name); - break; - - case CL_TRACE__SUITE_END: - git_trace(GIT_TRACE_TRACE, "\n\n%s: End Suite\n%s", suite_name, HR); - break; - - case CL_TRACE__TEST__BEGIN: - git_trace(GIT_TRACE_TRACE, "\n%s::%s: Begin Test", suite_name, test_name); - cl_perf_timer__init(&s_timer_test); - cl_perf_timer__start(&s_timer_test); - break; - - case CL_TRACE__TEST__END: - cl_perf_timer__stop(&s_timer_test); - git_trace(GIT_TRACE_TRACE, "%s::%s: End Test (%.3f %.3f)", suite_name, test_name, - cl_perf_timer__last(&s_timer_run), - cl_perf_timer__last(&s_timer_test)); - break; - - case CL_TRACE__TEST__RUN_BEGIN: - git_trace(GIT_TRACE_TRACE, "%s::%s: Begin Run", suite_name, test_name); - cl_perf_timer__init(&s_timer_run); - cl_perf_timer__start(&s_timer_run); - break; - - case CL_TRACE__TEST__RUN_END: - cl_perf_timer__stop(&s_timer_run); - git_trace(GIT_TRACE_TRACE, "%s::%s: End Run", suite_name, test_name); - break; - - case CL_TRACE__TEST__LONGJMP: - cl_perf_timer__stop(&s_timer_run); - git_trace(GIT_TRACE_TRACE, "%s::%s: Aborted", suite_name, test_name); - break; - - default: - break; - } -} - -#endif /*GIT_TRACE*/ - -/** - * Setup/Enable git_trace() based upon settings user's environment. - * - */ -void cl_global_trace_register(void) -{ -#if defined(GIT_TRACE) - if (!s_trace_loaded) - _load_trace_params(); - - if (s_trace_level == GIT_TRACE_NONE) - return; - if (s_trace_method == NULL) - return; - if (s_trace_method->git_trace_cb == NULL) - return; - - git_trace_set(s_trace_level, s_trace_method->git_trace_cb); - cl_trace_register(_cl_trace_cb__event_handler, NULL); -#endif -} - -/** - * If we turned on git_trace() earlier, turn it off. - * - * This is intended to let us close/flush any buffered - * IO if necessary. - * - */ -void cl_global_trace_disable(void) -{ -#if defined(GIT_TRACE) - cl_trace_register(NULL, NULL); - git_trace_set(GIT_TRACE_NONE, NULL); - if (s_trace_method && s_trace_method->close) - s_trace_method->close(); - - /* Leave s_trace_ vars set so they can restart tracing - * since we only want to hit the environment variables - * once. - */ -#endif -} diff --git a/vendor/libgit2/tests/clar_libgit2_trace.h b/vendor/libgit2/tests/clar_libgit2_trace.h deleted file mode 100644 index 09d1e050f8..0000000000 --- a/vendor/libgit2/tests/clar_libgit2_trace.h +++ /dev/null @@ -1,7 +0,0 @@ -#ifndef __CLAR_LIBGIT2_TRACE__ -#define __CLAR_LIBGIT2_TRACE__ - -void cl_global_trace_register(void); -void cl_global_trace_disable(void); - -#endif diff --git a/vendor/libgit2/tests/clone/empty.c b/vendor/libgit2/tests/clone/empty.c deleted file mode 100644 index 2a62175804..0000000000 --- a/vendor/libgit2/tests/clone/empty.c +++ /dev/null @@ -1,85 +0,0 @@ -#include "clar_libgit2.h" - -#include "git2/clone.h" -#include "repository.h" - -static git_clone_options g_options; -static git_repository *g_repo; -static git_repository *g_repo_cloned; - -void test_clone_empty__initialize(void) -{ - git_repository *sandbox = cl_git_sandbox_init("empty_bare.git"); - git_fetch_options dummy_options = GIT_FETCH_OPTIONS_INIT; - cl_git_remove_placeholders(git_repository_path(sandbox), "dummy-marker.txt"); - - g_repo = NULL; - - memset(&g_options, 0, sizeof(git_clone_options)); - g_options.version = GIT_CLONE_OPTIONS_VERSION; - g_options.fetch_opts = dummy_options; -} - -void test_clone_empty__cleanup(void) -{ - cl_git_sandbox_cleanup(); -} - -static void cleanup_repository(void *path) -{ - cl_fixture_cleanup((const char *)path); - - git_repository_free(g_repo_cloned); - g_repo_cloned = NULL; -} - -void test_clone_empty__can_clone_an_empty_local_repo_barely(void) -{ - char *local_name = "refs/heads/master"; - const char *expected_tracked_branch_name = "refs/remotes/origin/master"; - const char *expected_remote_name = "origin"; - git_buf buf = GIT_BUF_INIT; - git_reference *ref; - - cl_set_cleanup(&cleanup_repository, "./empty"); - - g_options.bare = true; - cl_git_pass(git_clone(&g_repo_cloned, "./empty_bare.git", "./empty", &g_options)); - - /* Although the HEAD is unborn... */ - cl_assert_equal_i(GIT_ENOTFOUND, git_reference_lookup(&ref, g_repo_cloned, local_name)); - - /* ...one can still retrieve the name of the remote tracking reference */ - cl_git_pass(git_branch_upstream_name(&buf, g_repo_cloned, local_name)); - - cl_assert_equal_s(expected_tracked_branch_name, buf.ptr); - git_buf_free(&buf); - - /* ...and the name of the remote... */ - cl_git_pass(git_branch_remote_name(&buf, g_repo_cloned, expected_tracked_branch_name)); - - cl_assert_equal_s(expected_remote_name, buf.ptr); - git_buf_free(&buf); - - /* ...even when the remote HEAD is unborn as well */ - cl_assert_equal_i(GIT_ENOTFOUND, git_reference_lookup(&ref, g_repo_cloned, - expected_tracked_branch_name)); -} - -void test_clone_empty__can_clone_an_empty_local_repo(void) -{ - cl_set_cleanup(&cleanup_repository, "./empty"); - - cl_git_pass(git_clone(&g_repo_cloned, "./empty_bare.git", "./empty", &g_options)); -} - -void test_clone_empty__can_clone_an_empty_standard_repo(void) -{ - cl_git_sandbox_cleanup(); - g_repo = cl_git_sandbox_init("empty_standard_repo"); - cl_git_remove_placeholders(git_repository_path(g_repo), "dummy-marker.txt"); - - cl_set_cleanup(&cleanup_repository, "./empty"); - - cl_git_pass(git_clone(&g_repo_cloned, "./empty_standard_repo", "./empty", &g_options)); -} diff --git a/vendor/libgit2/tests/clone/local.c b/vendor/libgit2/tests/clone/local.c deleted file mode 100644 index 91a0a1c2a8..0000000000 --- a/vendor/libgit2/tests/clone/local.c +++ /dev/null @@ -1,211 +0,0 @@ -#include "clar_libgit2.h" - -#include "git2/clone.h" -#include "clone.h" -#include "buffer.h" -#include "path.h" -#include "posix.h" -#include "fileops.h" - -static int file_url(git_buf *buf, const char *host, const char *path) -{ - if (path[0] == '/') - path++; - - git_buf_clear(buf); - return git_buf_printf(buf, "file://%s/%s", host, path); -} - -static int git_style_unc_path(git_buf *buf, const char *host, const char *path) -{ - git_buf_clear(buf); - - if (host) - git_buf_printf(buf, "//%s/", host); - - if (path[0] == '/') - path++; - - if (git__isalpha(path[0]) && path[1] == ':' && path[2] == '/') { - git_buf_printf(buf, "%c$/", path[0]); - path += 3; - } - - git_buf_puts(buf, path); - - return git_buf_oom(buf) ? -1 : 0; -} - -static int unc_path(git_buf *buf, const char *host, const char *path) -{ - char *c; - - if (git_style_unc_path(buf, host, path) < 0) - return -1; - - for (c = buf->ptr; *c; c++) - if (*c == '/') - *c = '\\'; - - return 0; -} - -void test_clone_local__should_clone_local(void) -{ - git_buf buf = GIT_BUF_INIT; - - /* we use a fixture path because it needs to exist for us to want to clone */ - const char *path = cl_fixture("testrepo.git"); - - cl_git_pass(file_url(&buf, "", path)); - cl_assert_equal_i(0, git_clone__should_clone_local(buf.ptr, GIT_CLONE_LOCAL_AUTO)); - cl_assert_equal_i(1, git_clone__should_clone_local(buf.ptr, GIT_CLONE_LOCAL)); - cl_assert_equal_i(1, git_clone__should_clone_local(buf.ptr, GIT_CLONE_LOCAL_NO_LINKS)); - cl_assert_equal_i(0, git_clone__should_clone_local(buf.ptr, GIT_CLONE_NO_LOCAL)); - - cl_git_pass(file_url(&buf, "localhost", path)); - cl_assert_equal_i(0, git_clone__should_clone_local(buf.ptr, GIT_CLONE_LOCAL_AUTO)); - cl_assert_equal_i(1, git_clone__should_clone_local(buf.ptr, GIT_CLONE_LOCAL)); - cl_assert_equal_i(1, git_clone__should_clone_local(buf.ptr, GIT_CLONE_LOCAL_NO_LINKS)); - cl_assert_equal_i(0, git_clone__should_clone_local(buf.ptr, GIT_CLONE_NO_LOCAL)); - - cl_git_pass(file_url(&buf, "other-host.mycompany.com", path)); - cl_assert_equal_i(0, git_clone__should_clone_local(buf.ptr, GIT_CLONE_LOCAL_AUTO)); - cl_assert_equal_i(0, git_clone__should_clone_local(buf.ptr, GIT_CLONE_LOCAL)); - cl_assert_equal_i(0, git_clone__should_clone_local(buf.ptr, GIT_CLONE_LOCAL_NO_LINKS)); - cl_assert_equal_i(0, git_clone__should_clone_local(buf.ptr, GIT_CLONE_NO_LOCAL)); - - /* Ensure that file:/// urls are percent decoded: .git == %2e%67%69%74 */ - cl_git_pass(file_url(&buf, "", path)); - git_buf_shorten(&buf, 4); - cl_git_pass(git_buf_puts(&buf, "%2e%67%69%74")); - cl_assert_equal_i(0, git_clone__should_clone_local(buf.ptr, GIT_CLONE_LOCAL_AUTO)); - cl_assert_equal_i(1, git_clone__should_clone_local(buf.ptr, GIT_CLONE_LOCAL)); - cl_assert_equal_i(1, git_clone__should_clone_local(buf.ptr, GIT_CLONE_LOCAL_NO_LINKS)); - cl_assert_equal_i(0, git_clone__should_clone_local(buf.ptr, GIT_CLONE_NO_LOCAL)); - - cl_assert_equal_i(1, git_clone__should_clone_local(path, GIT_CLONE_LOCAL_AUTO)); - cl_assert_equal_i(1, git_clone__should_clone_local(path, GIT_CLONE_LOCAL)); - cl_assert_equal_i(1, git_clone__should_clone_local(path, GIT_CLONE_LOCAL_NO_LINKS)); - cl_assert_equal_i(0, git_clone__should_clone_local(path, GIT_CLONE_NO_LOCAL)); - - git_buf_free(&buf); -} - -void test_clone_local__hardlinks(void) -{ - git_repository *repo; - git_clone_options opts = GIT_CLONE_OPTIONS_INIT; - git_buf buf = GIT_BUF_INIT; - struct stat st; - - /* - * In this first clone, we just copy over, since the temp dir - * will often be in a different filesystem, so we cannot - * link. It also allows us to control the number of links - */ - opts.bare = true; - opts.local = GIT_CLONE_LOCAL_NO_LINKS; - cl_git_pass(git_clone(&repo, cl_fixture("testrepo.git"), "./clone.git", &opts)); - git_repository_free(repo); - - /* This second clone is in the same filesystem, so we can hardlink */ - - opts.local = GIT_CLONE_LOCAL; - cl_git_pass(git_clone(&repo, cl_git_path_url("clone.git"), "./clone2.git", &opts)); - -#ifndef GIT_WIN32 - git_buf_clear(&buf); - cl_git_pass(git_buf_join_n(&buf, '/', 4, git_repository_path(repo), "objects", "08", "b041783f40edfe12bb406c9c9a8a040177c125")); - - cl_git_pass(p_stat(buf.ptr, &st)); - cl_assert_equal_i(2, st.st_nlink); -#endif - - git_repository_free(repo); - git_buf_clear(&buf); - - opts.local = GIT_CLONE_LOCAL_NO_LINKS; - cl_git_pass(git_clone(&repo, cl_git_path_url("clone.git"), "./clone3.git", &opts)); - - git_buf_clear(&buf); - cl_git_pass(git_buf_join_n(&buf, '/', 4, git_repository_path(repo), "objects", "08", "b041783f40edfe12bb406c9c9a8a040177c125")); - - cl_git_pass(p_stat(buf.ptr, &st)); - cl_assert_equal_i(1, st.st_nlink); - - git_repository_free(repo); - - /* this one should automatically use links */ - cl_git_pass(git_clone(&repo, "./clone.git", "./clone4.git", NULL)); - -#ifndef GIT_WIN32 - git_buf_clear(&buf); - cl_git_pass(git_buf_join_n(&buf, '/', 4, git_repository_path(repo), "objects", "08", "b041783f40edfe12bb406c9c9a8a040177c125")); - - cl_git_pass(p_stat(buf.ptr, &st)); - cl_assert_equal_i(3, st.st_nlink); -#endif - - git_buf_free(&buf); - git_repository_free(repo); - - cl_git_pass(git_futils_rmdir_r("./clone.git", NULL, GIT_RMDIR_REMOVE_FILES)); - cl_git_pass(git_futils_rmdir_r("./clone2.git", NULL, GIT_RMDIR_REMOVE_FILES)); - cl_git_pass(git_futils_rmdir_r("./clone3.git", NULL, GIT_RMDIR_REMOVE_FILES)); - cl_git_pass(git_futils_rmdir_r("./clone4.git", NULL, GIT_RMDIR_REMOVE_FILES)); -} - -void test_clone_local__standard_unc_paths_are_written_git_style(void) -{ -#ifdef GIT_WIN32 - git_repository *repo; - git_remote *remote; - git_clone_options opts = GIT_CLONE_OPTIONS_INIT; - git_buf unc = GIT_BUF_INIT, git_unc = GIT_BUF_INIT; - - /* we use a fixture path because it needs to exist for us to want to clone */ - const char *path = cl_fixture("testrepo.git"); - - cl_git_pass(unc_path(&unc, "localhost", path)); - cl_git_pass(git_style_unc_path(&git_unc, "localhost", path)); - - cl_git_pass(git_clone(&repo, unc.ptr, "./clone.git", &opts)); - cl_git_pass(git_remote_lookup(&remote, repo, "origin")); - - cl_assert_equal_s(git_unc.ptr, git_remote_url(remote)); - - git_remote_free(remote); - git_repository_free(repo); - git_buf_free(&unc); - git_buf_free(&git_unc); - - cl_git_pass(git_futils_rmdir_r("./clone.git", NULL, GIT_RMDIR_REMOVE_FILES)); -#endif -} - -void test_clone_local__git_style_unc_paths(void) -{ -#ifdef GIT_WIN32 - git_repository *repo; - git_remote *remote; - git_clone_options opts = GIT_CLONE_OPTIONS_INIT; - git_buf git_unc = GIT_BUF_INIT; - - /* we use a fixture path because it needs to exist for us to want to clone */ - const char *path = cl_fixture("testrepo.git"); - - cl_git_pass(git_style_unc_path(&git_unc, "localhost", path)); - - cl_git_pass(git_clone(&repo, git_unc.ptr, "./clone.git", &opts)); - cl_git_pass(git_remote_lookup(&remote, repo, "origin")); - - cl_assert_equal_s(git_unc.ptr, git_remote_url(remote)); - - git_remote_free(remote); - git_repository_free(repo); - git_buf_free(&git_unc); - - cl_git_pass(git_futils_rmdir_r("./clone.git", NULL, GIT_RMDIR_REMOVE_FILES)); -#endif -} diff --git a/vendor/libgit2/tests/clone/nonetwork.c b/vendor/libgit2/tests/clone/nonetwork.c deleted file mode 100644 index 44a503818d..0000000000 --- a/vendor/libgit2/tests/clone/nonetwork.c +++ /dev/null @@ -1,404 +0,0 @@ -#include "clar_libgit2.h" - -#include "git2/clone.h" -#include "git2/sys/commit.h" -#include "../submodule/submodule_helpers.h" -#include "remote.h" -#include "fileops.h" -#include "repository.h" - -#define LIVE_REPO_URL "git://github.com/libgit2/TestGitRepository" - -static git_clone_options g_options; -static git_repository *g_repo; -static git_reference* g_ref; -static git_remote* g_remote; - -void test_clone_nonetwork__initialize(void) -{ - git_checkout_options dummy_opts = GIT_CHECKOUT_OPTIONS_INIT; - git_fetch_options dummy_fetch = GIT_FETCH_OPTIONS_INIT; - - g_repo = NULL; - - memset(&g_options, 0, sizeof(git_clone_options)); - g_options.version = GIT_CLONE_OPTIONS_VERSION; - g_options.checkout_opts = dummy_opts; - g_options.checkout_opts.checkout_strategy = GIT_CHECKOUT_SAFE; - g_options.fetch_opts = dummy_fetch; -} - -void test_clone_nonetwork__cleanup(void) -{ - if (g_repo) { - git_repository_free(g_repo); - g_repo = NULL; - } - - if (g_ref) { - git_reference_free(g_ref); - g_ref = NULL; - } - - if (g_remote) { - git_remote_free(g_remote); - g_remote = NULL; - } - - cl_fixture_cleanup("./foo"); -} - -void test_clone_nonetwork__bad_urls(void) -{ - /* Clone should clean up the mess if the URL isn't a git repository */ - cl_git_fail(git_clone(&g_repo, "not_a_repo", "./foo", &g_options)); - cl_assert(!git_path_exists("./foo")); - g_options.bare = true; - cl_git_fail(git_clone(&g_repo, "not_a_repo", "./foo", &g_options)); - cl_assert(!git_path_exists("./foo")); - - cl_git_fail(git_clone(&g_repo, "git://example.com:asdf", "./foo", &g_options)); - cl_git_fail(git_clone(&g_repo, "https://example.com:asdf/foo", "./foo", &g_options)); - cl_git_fail(git_clone(&g_repo, "git://github.com/git://github.com/foo/bar.git.git", - "./foo", &g_options)); - cl_git_fail(git_clone(&g_repo, "arrbee:my/bad:password@github.com:1111/strange:words.git", - "./foo", &g_options)); -} - -void test_clone_nonetwork__do_not_clean_existing_directory(void) -{ - /* Clone should not remove the directory if it already exists, but - * Should clean up entries it creates. */ - p_mkdir("./foo", GIT_DIR_MODE); - cl_git_fail(git_clone(&g_repo, "not_a_repo", "./foo", &g_options)); - cl_assert(git_path_is_empty_dir("./foo")); - - /* Try again with a bare repository. */ - g_options.bare = true; - cl_git_fail(git_clone(&g_repo, "not_a_repo", "./foo", &g_options)); - cl_assert(git_path_is_empty_dir("./foo")); -} - -void test_clone_nonetwork__local(void) -{ - cl_git_pass(git_clone(&g_repo, cl_git_fixture_url("testrepo.git"), "./foo", &g_options)); -} - -void test_clone_nonetwork__local_absolute_path(void) -{ - const char *local_src; - local_src = cl_fixture("testrepo.git"); - cl_git_pass(git_clone(&g_repo, local_src, "./foo", &g_options)); -} - -void test_clone_nonetwork__local_bare(void) -{ - g_options.bare = true; - cl_git_pass(git_clone(&g_repo, cl_git_fixture_url("testrepo.git"), "./foo", &g_options)); -} - -void test_clone_nonetwork__fail_when_the_target_is_a_file(void) -{ - cl_git_mkfile("./foo", "Bar!"); - cl_git_fail(git_clone(&g_repo, cl_git_fixture_url("testrepo.git"), "./foo", &g_options)); -} - -void test_clone_nonetwork__fail_with_already_existing_but_non_empty_directory(void) -{ - p_mkdir("./foo", GIT_DIR_MODE); - cl_git_mkfile("./foo/bar", "Baz!"); - cl_git_fail(git_clone(&g_repo, cl_git_fixture_url("testrepo.git"), "./foo", &g_options)); -} - -int custom_origin_name_remote_create( - git_remote **out, - git_repository *repo, - const char *name, - const char *url, - void *payload) -{ - GIT_UNUSED(name); - GIT_UNUSED(payload); - - return git_remote_create(out, repo, "my_origin", url); -} - -void test_clone_nonetwork__custom_origin_name(void) -{ - g_options.remote_cb = custom_origin_name_remote_create; - cl_git_pass(git_clone(&g_repo, cl_git_fixture_url("testrepo.git"), "./foo", &g_options)); - - cl_git_pass(git_remote_lookup(&g_remote, g_repo, "my_origin")); -} - -void test_clone_nonetwork__defaults(void) -{ - cl_git_pass(git_clone(&g_repo, cl_git_fixture_url("testrepo.git"), "./foo", NULL)); - cl_assert(g_repo); - cl_git_pass(git_remote_lookup(&g_remote, g_repo, "origin")); -} - -void test_clone_nonetwork__cope_with_already_existing_directory(void) -{ - p_mkdir("./foo", GIT_DIR_MODE); - cl_git_pass(git_clone(&g_repo, cl_git_fixture_url("testrepo.git"), "./foo", &g_options)); -} - -void test_clone_nonetwork__can_prevent_the_checkout_of_a_standard_repo(void) -{ - git_buf path = GIT_BUF_INIT; - - g_options.checkout_opts.checkout_strategy = 0; - cl_git_pass(git_clone(&g_repo, cl_git_fixture_url("testrepo.git"), "./foo", &g_options)); - - cl_git_pass(git_buf_joinpath(&path, git_repository_workdir(g_repo), "master.txt")); - cl_assert_equal_i(false, git_path_isfile(git_buf_cstr(&path))); - - git_buf_free(&path); -} - -void test_clone_nonetwork__can_checkout_given_branch(void) -{ - g_options.checkout_branch = "test"; - cl_git_pass(git_clone(&g_repo, cl_git_fixture_url("testrepo.git"), "./foo", &g_options)); - - cl_assert_equal_i(0, git_repository_head_unborn(g_repo)); - - cl_git_pass(git_repository_head(&g_ref, g_repo)); - cl_assert_equal_s(git_reference_name(g_ref), "refs/heads/test"); - - cl_assert(git_path_exists("foo/readme.txt")); -} - -static int clone_cancel_fetch_transfer_progress_cb( - const git_transfer_progress *stats, void *data) -{ - GIT_UNUSED(stats); GIT_UNUSED(data); - return -54321; -} - -void test_clone_nonetwork__can_cancel_clone_in_fetch(void) -{ - g_options.checkout_branch = "test"; - - g_options.fetch_opts.callbacks.transfer_progress = - clone_cancel_fetch_transfer_progress_cb; - - cl_git_fail_with(git_clone( - &g_repo, cl_git_fixture_url("testrepo.git"), "./foo", &g_options), - -54321); - - cl_assert(!g_repo); - cl_assert(!git_path_exists("foo/readme.txt")); -} - -static int clone_cancel_checkout_cb( - git_checkout_notify_t why, - const char *path, - const git_diff_file *b, - const git_diff_file *t, - const git_diff_file *w, - void *payload) -{ - const char *at_file = payload; - GIT_UNUSED(why); GIT_UNUSED(b); GIT_UNUSED(t); GIT_UNUSED(w); - if (!strcmp(path, at_file)) - return -12345; - return 0; -} - -void test_clone_nonetwork__can_cancel_clone_in_checkout(void) -{ - g_options.checkout_branch = "test"; - - g_options.checkout_opts.notify_flags = GIT_CHECKOUT_NOTIFY_UPDATED; - g_options.checkout_opts.notify_cb = clone_cancel_checkout_cb; - g_options.checkout_opts.notify_payload = "readme.txt"; - - cl_git_fail_with(git_clone( - &g_repo, cl_git_fixture_url("testrepo.git"), "./foo", &g_options), - -12345); - - cl_assert(!g_repo); - cl_assert(!git_path_exists("foo/readme.txt")); -} - -void test_clone_nonetwork__can_detached_head(void) -{ - git_object *obj; - git_repository *cloned; - git_reference *cloned_head; - - cl_git_pass(git_clone(&g_repo, cl_git_fixture_url("testrepo.git"), "./foo", &g_options)); - - cl_git_pass(git_revparse_single(&obj, g_repo, "master~1")); - cl_git_pass(git_repository_set_head_detached(g_repo, git_object_id(obj))); - - cl_git_pass(git_clone(&cloned, "./foo", "./foo1", &g_options)); - - cl_assert(git_repository_head_detached(cloned)); - - cl_git_pass(git_repository_head(&cloned_head, cloned)); - cl_assert_equal_oid(git_object_id(obj), git_reference_target(cloned_head)); - - git_object_free(obj); - git_reference_free(cloned_head); - git_repository_free(cloned); - - cl_fixture_cleanup("./foo1"); -} - -void test_clone_nonetwork__clone_tag_to_tree(void) -{ - git_repository *stage; - git_index_entry entry; - git_index *index; - git_odb *odb; - git_oid tree_id; - git_tree *tree; - git_reference *tag; - git_tree_entry *tentry; - const char *file_path = "some/deep/path.txt"; - const char *file_content = "some content\n"; - const char *tag_name = "refs/tags/tree-tag"; - - stage = cl_git_sandbox_init("testrepo.git"); - cl_git_pass(git_repository_odb(&odb, stage)); - cl_git_pass(git_index_new(&index)); - - memset(&entry, 0, sizeof(git_index_entry)); - entry.path = file_path; - entry.mode = GIT_FILEMODE_BLOB; - cl_git_pass(git_odb_write(&entry.id, odb, file_content, strlen(file_content), GIT_OBJ_BLOB)); - - cl_git_pass(git_index_add(index, &entry)); - cl_git_pass(git_index_write_tree_to(&tree_id, index, stage)); - cl_git_pass(git_reference_create(&tag, stage, tag_name, &tree_id, 0, NULL)); - git_reference_free(tag); - git_odb_free(odb); - git_index_free(index); - - g_options.local = GIT_CLONE_NO_LOCAL; - cl_git_pass(git_clone(&g_repo, cl_git_path_url(git_repository_path(stage)), "./foo", &g_options)); - git_repository_free(stage); - - cl_git_pass(git_reference_lookup(&tag, g_repo, tag_name)); - cl_git_pass(git_tree_lookup(&tree, g_repo, git_reference_target(tag))); - git_reference_free(tag); - - cl_git_pass(git_tree_entry_bypath(&tentry, tree, file_path)); - git_tree_entry_free(tentry); - git_tree_free(tree); - - cl_fixture_cleanup("testrepo.git"); -} - -static void assert_correct_reflog(const char *name) -{ - git_reflog *log; - const git_reflog_entry *entry; - char expected_log_message[128] = {0}; - - sprintf(expected_log_message, "clone: from %s", cl_git_fixture_url("testrepo.git")); - - cl_git_pass(git_reflog_read(&log, g_repo, name)); - cl_assert_equal_i(1, git_reflog_entrycount(log)); - entry = git_reflog_entry_byindex(log, 0); - cl_assert_equal_s(expected_log_message, git_reflog_entry_message(entry)); - - git_reflog_free(log); -} - -void test_clone_nonetwork__clone_updates_reflog_properly(void) -{ - cl_git_pass(git_clone(&g_repo, cl_git_fixture_url("testrepo.git"), "./foo", &g_options)); - assert_correct_reflog("HEAD"); - assert_correct_reflog("refs/heads/master"); -} - -static void cleanup_repository(void *path) -{ - if (g_repo) { - git_repository_free(g_repo); - g_repo = NULL; - } - - cl_fixture_cleanup((const char *)path); -} - -void test_clone_nonetwork__clone_from_empty_sets_upstream(void) -{ - git_config *config; - git_repository *repo; - const char *str; - - /* Create an empty repo to clone from */ - cl_set_cleanup(&cleanup_repository, "./test1"); - cl_git_pass(git_repository_init(&g_repo, "./test1", 0)); - cl_set_cleanup(&cleanup_repository, "./repowithunborn"); - cl_git_pass(git_clone(&repo, "./test1", "./repowithunborn", NULL)); - - cl_git_pass(git_repository_config_snapshot(&config, repo)); - - cl_git_pass(git_config_get_string(&str, config, "branch.master.remote")); - cl_assert_equal_s("origin", str); - cl_git_pass(git_config_get_string(&str, config, "branch.master.merge")); - cl_assert_equal_s("refs/heads/master", str); - - git_config_free(config); - git_repository_free(repo); - cl_fixture_cleanup("./repowithunborn"); -} - -static int just_return_origin(git_remote **out, git_repository *repo, const char *name, const char *url, void *payload) -{ - GIT_UNUSED(url); GIT_UNUSED(payload); - - return git_remote_lookup(out, repo, name); -} - -static int just_return_repo(git_repository **out, const char *path, int bare, void *payload) -{ - git_submodule *sm = payload; - - GIT_UNUSED(path); GIT_UNUSED(bare); - - return git_submodule_open(out, sm); -} - -void test_clone_nonetwork__clone_submodule(void) -{ - git_clone_options clone_opts = GIT_CLONE_OPTIONS_INIT; - git_index *index; - git_oid tree_id, commit_id; - git_submodule *sm; - git_signature *sig; - git_repository *sm_repo; - - cl_git_pass(git_repository_init(&g_repo, "willaddsubmodule", false)); - - - /* Create the submodule structure, clone into it and finalize */ - cl_git_pass(git_submodule_add_setup(&sm, g_repo, cl_fixture("testrepo.git"), "testrepo", true)); - - clone_opts.repository_cb = just_return_repo; - clone_opts.repository_cb_payload = sm; - clone_opts.remote_cb = just_return_origin; - clone_opts.remote_cb_payload = sm; - cl_git_pass(git_clone(&sm_repo, cl_fixture("testrepo.git"), "testrepo", &clone_opts)); - cl_git_pass(git_submodule_add_finalize(sm)); - git_repository_free(sm_repo); - git_submodule_free(sm); - - cl_git_pass(git_repository_index(&index, g_repo)); - cl_git_pass(git_index_write_tree(&tree_id, index)); - git_index_free(index); - - cl_git_pass(git_signature_now(&sig, "Submoduler", "submoduler@local")); - cl_git_pass(git_commit_create_from_ids(&commit_id, g_repo, "HEAD", sig, sig, NULL, "A submodule\n", - &tree_id, 0, NULL)); - - git_signature_free(sig); - - assert_submodule_exists(g_repo, "testrepo"); -} diff --git a/vendor/libgit2/tests/clone/transport.c b/vendor/libgit2/tests/clone/transport.c deleted file mode 100644 index cccaae219b..0000000000 --- a/vendor/libgit2/tests/clone/transport.c +++ /dev/null @@ -1,51 +0,0 @@ -#include "clar_libgit2.h" - -#include "git2/clone.h" -#include "git2/transport.h" -#include "git2/sys/transport.h" -#include "fileops.h" - -static int custom_transport( - git_transport **out, - git_remote *owner, - void *payload) -{ - *((int*)payload) = 1; - - return git_transport_local(out, owner, payload); -} - -static int custom_transport_remote_create( - git_remote **out, - git_repository *repo, - const char *name, - const char *url, - void *payload) -{ - int error; - - GIT_UNUSED(payload); - - if ((error = git_remote_create(out, repo, name, url)) < 0) - return error; - - return 0; -} - -void test_clone_transport__custom_transport(void) -{ - git_repository *repo; - git_clone_options clone_opts = GIT_CLONE_OPTIONS_INIT; - int custom_transport_used = 0; - - clone_opts.remote_cb = custom_transport_remote_create; - clone_opts.fetch_opts.callbacks.transport = custom_transport; - clone_opts.fetch_opts.callbacks.payload = &custom_transport_used; - - cl_git_pass(git_clone(&repo, cl_fixture("testrepo.git"), "./custom_transport.git", &clone_opts)); - git_repository_free(repo); - - cl_git_pass(git_futils_rmdir_r("./custom_transport.git", NULL, GIT_RMDIR_REMOVE_FILES)); - - cl_assert(custom_transport_used == 1); -} diff --git a/vendor/libgit2/tests/commit/commit.c b/vendor/libgit2/tests/commit/commit.c deleted file mode 100644 index f5461cfd38..0000000000 --- a/vendor/libgit2/tests/commit/commit.c +++ /dev/null @@ -1,83 +0,0 @@ -#include "clar_libgit2.h" -#include "commit.h" -#include "git2/commit.h" - -static git_repository *_repo; - -void test_commit_commit__initialize(void) -{ - cl_fixture_sandbox("testrepo.git"); - cl_git_pass(git_repository_open(&_repo, "testrepo.git")); -} - -void test_commit_commit__cleanup(void) -{ - git_repository_free(_repo); - _repo = NULL; - - cl_fixture_cleanup("testrepo.git"); -} - -void test_commit_commit__create_unexisting_update_ref(void) -{ - git_oid oid; - git_tree *tree; - git_commit *commit; - git_signature *s; - git_reference *ref; - - git_oid_fromstr(&oid, "a65fedf39aefe402d3bb6e24df4d4f5fe4547750"); - cl_git_pass(git_commit_lookup(&commit, _repo, &oid)); - - git_oid_fromstr(&oid, "944c0f6e4dfa41595e6eb3ceecdb14f50fe18162"); - cl_git_pass(git_tree_lookup(&tree, _repo, &oid)); - - cl_git_pass(git_signature_now(&s, "alice", "alice@example.com")); - - cl_git_fail(git_reference_lookup(&ref, _repo, "refs/heads/foo/bar")); - cl_git_pass(git_commit_create(&oid, _repo, "refs/heads/foo/bar", s, s, - NULL, "some msg", tree, 1, (const git_commit **) &commit)); - - /* fail because the parent isn't the tip of the branch anymore */ - cl_git_fail(git_commit_create(&oid, _repo, "refs/heads/foo/bar", s, s, - NULL, "some msg", tree, 1, (const git_commit **) &commit)); - - cl_git_pass(git_reference_lookup(&ref, _repo, "refs/heads/foo/bar")); - cl_assert_equal_oid(&oid, git_reference_target(ref)); - - git_tree_free(tree); - git_commit_free(commit); - git_signature_free(s); - git_reference_free(ref); -} - -void assert_commit_summary(const char *expected, const char *given) -{ - git_commit *dummy; - - cl_assert(dummy = git__calloc(1, sizeof(struct git_commit))); - - dummy->raw_message = git__strdup(given); - cl_assert_equal_s(expected, git_commit_summary(dummy)); - - git_commit__free(dummy); -} - -void test_commit_commit__summary(void) -{ - assert_commit_summary("One-liner with no trailing newline", "One-liner with no trailing newline"); - assert_commit_summary("One-liner with trailing newline", "One-liner with trailing newline\n"); - assert_commit_summary("Trimmed leading&trailing newlines", "\n\nTrimmed leading&trailing newlines\n\n"); - assert_commit_summary("First paragraph only", "\nFirst paragraph only\n\n(There are more!)"); - assert_commit_summary("First paragraph with unwrapped trailing\tlines", "\nFirst paragraph\nwith unwrapped\ntrailing\tlines\n\n(Yes, unwrapped!)"); - assert_commit_summary("\tLeading \ttabs", "\tLeading\n\ttabs\n\nis preserved"); - assert_commit_summary(" Leading Spaces", " Leading\n Spaces\n\nare preserved"); - assert_commit_summary("Trailing tabs\tare removed", "Trailing tabs\tare removed\t\t"); - assert_commit_summary("Trailing spaces are removed", "Trailing spaces are removed "); - assert_commit_summary("Trailing tabs", "Trailing tabs\t\n\nare removed"); - assert_commit_summary("Trailing spaces", "Trailing spaces \n\nare removed"); - assert_commit_summary("", ""); - assert_commit_summary("", " "); - assert_commit_summary("", "\n"); - assert_commit_summary("", "\n \n"); -} diff --git a/vendor/libgit2/tests/commit/parent.c b/vendor/libgit2/tests/commit/parent.c deleted file mode 100644 index 18ce0bba60..0000000000 --- a/vendor/libgit2/tests/commit/parent.c +++ /dev/null @@ -1,60 +0,0 @@ -#include "clar_libgit2.h" - -static git_repository *_repo; -static git_commit *commit; - -void test_commit_parent__initialize(void) -{ - git_oid oid; - - cl_git_pass(git_repository_open(&_repo, cl_fixture("testrepo.git"))); - - git_oid_fromstr(&oid, "be3563ae3f795b2b4353bcce3a527ad0a4f7f644"); - cl_git_pass(git_commit_lookup(&commit, _repo, &oid)); -} - -void test_commit_parent__cleanup(void) -{ - git_commit_free(commit); - commit = NULL; - - git_repository_free(_repo); - _repo = NULL; -} - -static void assert_nth_gen_parent(unsigned int gen, const char *expected_oid) -{ - git_commit *parent = NULL; - int error; - - error = git_commit_nth_gen_ancestor(&parent, commit, gen); - - if (expected_oid != NULL) { - cl_assert_equal_i(0, error); - cl_assert_equal_i(0, git_oid_streq(git_commit_id(parent), expected_oid)); - } else - cl_assert_equal_i(GIT_ENOTFOUND, error); - - git_commit_free(parent); -} - -/* - * $ git show be35~0 - * commit be3563ae3f795b2b4353bcce3a527ad0a4f7f644 - * - * $ git show be35~1 - * commit 9fd738e8f7967c078dceed8190330fc8648ee56a - * - * $ git show be35~3 - * commit 5b5b025afb0b4c913b4c338a42934a3863bf3644 - * - * $ git show be35~42 - * fatal: ambiguous argument 'be35~42': unknown revision or path not in the working tree. - */ -void test_commit_parent__can_retrieve_nth_generation_parent(void) -{ - assert_nth_gen_parent(0, "be3563ae3f795b2b4353bcce3a527ad0a4f7f644"); - assert_nth_gen_parent(1, "9fd738e8f7967c078dceed8190330fc8648ee56a"); - assert_nth_gen_parent(3, "5b5b025afb0b4c913b4c338a42934a3863bf3644"); - assert_nth_gen_parent(42, NULL); -} diff --git a/vendor/libgit2/tests/commit/parse.c b/vendor/libgit2/tests/commit/parse.c deleted file mode 100644 index 388da078a7..0000000000 --- a/vendor/libgit2/tests/commit/parse.c +++ /dev/null @@ -1,458 +0,0 @@ -#include "clar_libgit2.h" -#include -#include "commit.h" -#include "signature.h" - -// Fixture setup -static git_repository *g_repo; -void test_commit_parse__initialize(void) -{ - g_repo = cl_git_sandbox_init("testrepo"); -} -void test_commit_parse__cleanup(void) -{ - cl_git_sandbox_cleanup(); -} - - -// Header parsing -typedef struct { - const char *line; - const char *header; -} parse_test_case; - -static parse_test_case passing_header_cases[] = { - { "parent 05452d6349abcd67aa396dfb28660d765d8b2a36\n", "parent " }, - { "tree 05452d6349abcd67aa396dfb28660d765d8b2a36\n", "tree " }, - { "random_heading 05452d6349abcd67aa396dfb28660d765d8b2a36\n", "random_heading " }, - { "stuck_heading05452d6349abcd67aa396dfb28660d765d8b2a36\n", "stuck_heading" }, - { "tree 5F4BEFFC0759261D015AA63A3A85613FF2F235DE\n", "tree " }, - { "tree 1A669B8AB81B5EB7D9DB69562D34952A38A9B504\n", "tree " }, - { "tree 5B20DCC6110FCC75D31C6CEDEBD7F43ECA65B503\n", "tree " }, - { "tree 173E7BF00EA5C33447E99E6C1255954A13026BE4\n", "tree " }, - { NULL, NULL } -}; - -static parse_test_case failing_header_cases[] = { - { "parent 05452d6349abcd67aa396dfb28660d765d8b2a36", "parent " }, - { "05452d6349abcd67aa396dfb28660d765d8b2a36\n", "tree " }, - { "parent05452d6349abcd67aa396dfb28660d765d8b2a6a\n", "parent " }, - { "parent 05452d6349abcd67aa396dfb280d765d8b2a6\n", "parent " }, - { "tree 05452d6349abcd67aa396dfb28660d765d8b2a36\n", "tree " }, - { "parent 0545xd6349abcd67aa396dfb28660d765d8b2a36\n", "parent " }, - { "parent 0545xd6349abcd67aa396dfb28660d765d8b2a36FF\n", "parent " }, - { "", "tree " }, - { "", "" }, - { NULL, NULL } -}; - -void test_commit_parse__header(void) -{ - git_oid oid; - - parse_test_case *testcase; - for (testcase = passing_header_cases; testcase->line != NULL; testcase++) - { - const char *line = testcase->line; - const char *line_end = line + strlen(line); - - cl_git_pass(git_oid__parse(&oid, &line, line_end, testcase->header)); - cl_assert(line == line_end); - } - - for (testcase = failing_header_cases; testcase->line != NULL; testcase++) - { - const char *line = testcase->line; - const char *line_end = line + strlen(line); - - cl_git_fail(git_oid__parse(&oid, &line, line_end, testcase->header)); - } -} - - -// Signature parsing -typedef struct { - const char *string; - const char *header; - const char *name; - const char *email; - git_time_t time; - int offset; -} passing_signature_test_case; - -passing_signature_test_case passing_signature_cases[] = { - {"author Vicent Marti 12345 \n", "author ", "Vicent Marti", "tanoku@gmail.com", 12345, 0}, - {"author Vicent Marti <> 12345 \n", "author ", "Vicent Marti", "", 12345, 0}, - {"author Vicent Marti 231301 +1020\n", "author ", "Vicent Marti", "tanoku@gmail.com", 231301, 620}, - {"author Vicent Marti with an outrageously long name which will probably overflow the buffer 12345 \n", "author ", "Vicent Marti with an outrageously long name which will probably overflow the buffer", "tanoku@gmail.com", 12345, 0}, - {"author Vicent Marti 12345 \n", "author ", "Vicent Marti", "tanokuwithaveryveryverylongemailwhichwillprobablyvoverflowtheemailbuffer@gmail.com", 12345, 0}, - {"committer Vicent Marti 123456 +0000 \n", "committer ", "Vicent Marti", "tanoku@gmail.com", 123456, 0}, - {"committer Vicent Marti 123456 +0100 \n", "committer ", "Vicent Marti", "tanoku@gmail.com", 123456, 60}, - {"committer Vicent Marti 123456 -0100 \n", "committer ", "Vicent Marti", "tanoku@gmail.com", 123456, -60}, - // Parse a signature without an author field - {"committer 123456 -0100 \n", "committer ", "", "tanoku@gmail.com", 123456, -60}, - // Parse a signature without an author field - {"committer 123456 -0100 \n", "committer ", "", "tanoku@gmail.com", 123456, -60}, - // Parse a signature with an empty author field - {"committer 123456 -0100 \n", "committer ", "", "tanoku@gmail.com", 123456, -60}, - // Parse a signature with an empty email field - {"committer Vicent Marti <> 123456 -0100 \n", "committer ", "Vicent Marti", "", 123456, -60}, - // Parse a signature with an empty email field - {"committer Vicent Marti < > 123456 -0100 \n", "committer ", "Vicent Marti", "", 123456, -60}, - // Parse a signature with empty name and email - {"committer <> 123456 -0100 \n", "committer ", "", "", 123456, -60}, - // Parse a signature with empty name and email - {"committer <> 123456 -0100 \n", "committer ", "", "", 123456, -60}, - // Parse a signature with empty name and email - {"committer < > 123456 -0100 \n", "committer ", "", "", 123456, -60}, - // Parse an obviously invalid signature - {"committer foo<@bar> 123456 -0100 \n", "committer ", "foo", "@bar", 123456, -60}, - // Parse an obviously invalid signature - {"committer foo<@bar> 123456 -0100 \n", "committer ", "foo", "@bar", 123456, -60}, - // Parse an obviously invalid signature - {"committer <>\n", "committer ", "", "", 0, 0}, - {"committer Vicent Marti 123456 -1500 \n", "committer ", "Vicent Marti", "tanoku@gmail.com", 123456, 0}, - {"committer Vicent Marti 123456 +0163 \n", "committer ", "Vicent Marti", "tanoku@gmail.com", 123456, 0}, - {"author Vicent Marti \n", "author ", "Vicent Marti", "tanoku@gmail.com", 0, 0}, - /* a variety of dates */ - {"author Vicent Marti 0 \n", "author ", "Vicent Marti", "tanoku@gmail.com", 0, 0}, - {"author Vicent Marti 1234567890 \n", "author ", "Vicent Marti", "tanoku@gmail.com", 1234567890, 0}, - {"author Vicent Marti 2147483647 \n", "author ", "Vicent Marti", "tanoku@gmail.com", 0x7fffffff, 0}, - {"author Vicent Marti 4294967295 \n", "author ", "Vicent Marti", "tanoku@gmail.com", 0xffffffff, 0}, - {"author Vicent Marti 4294967296 \n", "author ", "Vicent Marti", "tanoku@gmail.com", 4294967296, 0}, - {"author Vicent Marti 8589934592 \n", "author ", "Vicent Marti", "tanoku@gmail.com", 8589934592, 0}, - - {NULL,NULL,NULL,NULL,0,0} -}; - -typedef struct { - const char *string; - const char *header; -} failing_signature_test_case; - -failing_signature_test_case failing_signature_cases[] = { - {"committer Vicent Marti tanoku@gmail.com> 123456 -0100 \n", "committer "}, - {"author Vicent Marti 12345 \n", "author "}, - {"author Vicent Marti 12345 \n", "committer "}, - {"author Vicent Marti 12345 \n", "author "}, - {"author Vicent Marti <\n", "committer "}, - {"author ", "author "}, - {NULL, NULL,} -}; - -void test_commit_parse__signature(void) -{ - passing_signature_test_case *passcase; - failing_signature_test_case *failcase; - - for (passcase = passing_signature_cases; passcase->string != NULL; passcase++) - { - const char *str = passcase->string; - size_t len = strlen(passcase->string); - struct git_signature person = {0}; - - cl_git_pass(git_signature__parse(&person, &str, str + len, passcase->header, '\n')); - cl_assert_equal_s(passcase->name, person.name); - cl_assert_equal_s(passcase->email, person.email); - cl_assert_equal_i((int)passcase->time, (int)person.when.time); - cl_assert_equal_i(passcase->offset, person.when.offset); - git__free(person.name); git__free(person.email); - } - - for (failcase = failing_signature_cases; failcase->string != NULL; failcase++) - { - const char *str = failcase->string; - size_t len = strlen(failcase->string); - git_signature person = {0}; - cl_git_fail(git_signature__parse(&person, &str, str + len, failcase->header, '\n')); - git__free(person.name); git__free(person.email); - } -} - - - -static char *failing_commit_cases[] = { -// empty commit -"", -// random garbage -"asd97sa9du902e9a0jdsuusad09as9du098709aweu8987sd\n", -// broken endlines 1 -"tree f6c0dad3c7b3481caa9d73db21f91964894a945b\r\n\ -parent 05452d6349abcd67aa396dfb28660d765d8b2a36\r\n\ -author Vicent Marti 1273848544 +0200\r\n\ -committer Vicent Marti 1273848544 +0200\r\n\ -\r\n\ -a test commit with broken endlines\r\n", -// broken endlines 2 -"tree f6c0dad3c7b3481caa9d73db21f91964894a945b\ -parent 05452d6349abcd67aa396dfb28660d765d8b2a36\ -author Vicent Marti 1273848544 +0200\ -committer Vicent Marti 1273848544 +0200\ -\ -another test commit with broken endlines", -// starting endlines -"\ntree f6c0dad3c7b3481caa9d73db21f91964894a945b\n\ -parent 05452d6349abcd67aa396dfb28660d765d8b2a36\n\ -author Vicent Marti 1273848544 +0200\n\ -committer Vicent Marti 1273848544 +0200\n\ -\n\ -a test commit with a starting endline\n", -// corrupted commit 1 -"tree f6c0dad3c7b3481caa9d73db21f91964894a945b\n\ -parent 05452d6349abcd67aa396df", -// corrupted commit 2 -"tree f6c0dad3c7b3481caa9d73db21f91964894a945b\n\ -parent ", -// corrupted commit 3 -"tree f6c0dad3c7b3481caa9d73db21f91964894a945b\n\ -parent ", -// corrupted commit 4 -"tree f6c0dad3c7b3481caa9d73db21f91964894a945b\n\ -par", -}; - - -static char *passing_commit_cases[] = { -// simple commit with no message -"tree 1810dff58d8a660512d4832e740f692884338ccd\n\ -author Vicent Marti 1273848544 +0200\n\ -committer Vicent Marti 1273848544 +0200\n\ -\n", -// simple commit, no parent -"tree 1810dff58d8a660512d4832e740f692884338ccd\n\ -author Vicent Marti 1273848544 +0200\n\ -committer Vicent Marti 1273848544 +0200\n\ -\n\ -a simple commit which works\n", -// simple commit, no parent, no newline in message -"tree 1810dff58d8a660512d4832e740f692884338ccd\n\ -author Vicent Marti 1273848544 +0200\n\ -committer Vicent Marti 1273848544 +0200\n\ -\n\ -a simple commit which works", -// simple commit, 1 parent -"tree 1810dff58d8a660512d4832e740f692884338ccd\n\ -parent e90810b8df3e80c413d903f631643c716887138d\n\ -author Vicent Marti 1273848544 +0200\n\ -committer Vicent Marti 1273848544 +0200\n\ -\n\ -a simple commit which works\n", -/* simple commit with GPG signature */ -"tree 6b79e22d69bf46e289df0345a14ca059dfc9bdf6\n\ -parent 34734e478d6cf50c27c9d69026d93974d052c454\n\ -author Ben Burkert 1358451456 -0800\n\ -committer Ben Burkert 1358451456 -0800\n\ -gpgsig -----BEGIN PGP SIGNATURE-----\n\ - Version: GnuPG v1.4.12 (Darwin)\n\ - \n\ - iQIcBAABAgAGBQJQ+FMIAAoJEH+LfPdZDSs1e3EQAJMjhqjWF+WkGLHju7pTw2al\n\ - o6IoMAhv0Z/LHlWhzBd9e7JeCnanRt12bAU7yvYp9+Z+z+dbwqLwDoFp8LVuigl8\n\ - JGLcnwiUW3rSvhjdCp9irdb4+bhKUnKUzSdsR2CK4/hC0N2i/HOvMYX+BRsvqweq\n\ - AsAkA6dAWh+gAfedrBUkCTGhlNYoetjdakWqlGL1TiKAefEZrtA1TpPkGn92vbLq\n\ - SphFRUY9hVn1ZBWrT3hEpvAIcZag3rTOiRVT1X1flj8B2vGCEr3RrcwOIZikpdaW\n\ - who/X3xh/DGbI2RbuxmmJpxxP/8dsVchRJJzBwG+yhwU/iN3MlV2c5D69tls/Dok\n\ - 6VbyU4lm/ae0y3yR83D9dUlkycOnmmlBAHKIZ9qUts9X7mWJf0+yy2QxJVpjaTGG\n\ - cmnQKKPeNIhGJk2ENnnnzjEve7L7YJQF6itbx5VCOcsGh3Ocb3YR7DMdWjt7f8pu\n\ - c6j+q1rP7EpE2afUN/geSlp5i3x8aXZPDj67jImbVCE/Q1X9voCtyzGJH7MXR0N9\n\ - ZpRF8yzveRfMH8bwAJjSOGAFF5XkcR/RNY95o+J+QcgBLdX48h+ZdNmUf6jqlu3J\n\ - 7KmTXXQcOVpN6dD3CmRFsbjq+x6RHwa8u1iGn+oIkX908r97ckfB/kHKH7ZdXIJc\n\ - cpxtDQQMGYFpXK/71stq\n\ - =ozeK\n\ - -----END PGP SIGNATURE-----\n\ -\n\ -a simple commit which works\n", -/* some tools create two author entries */ -"tree 1810dff58d8a660512d4832e740f692884338ccd\n\ -author Vicent Marti 1273848544 +0200\n\ -author Helpful Coworker 1273848544 +0200\n\ -committer Vicent Marti 1273848544 +0200\n\ -\n\ -a simple commit which works", -}; - -static int parse_commit(git_commit **out, const char *buffer) -{ - git_commit *commit; - git_odb_object fake_odb_object; - int error; - - commit = (git_commit*)git__malloc(sizeof(git_commit)); - memset(commit, 0x0, sizeof(git_commit)); - commit->object.repo = g_repo; - - memset(&fake_odb_object, 0x0, sizeof(git_odb_object)); - fake_odb_object.buffer = (char *)buffer; - fake_odb_object.cached.size = strlen(fake_odb_object.buffer); - - error = git_commit__parse(commit, &fake_odb_object); - - *out = commit; - return error; -} - -void test_commit_parse__entire_commit(void) -{ - const int failing_commit_count = ARRAY_SIZE(failing_commit_cases); - const int passing_commit_count = ARRAY_SIZE(passing_commit_cases); - int i; - git_commit *commit; - - for (i = 0; i < failing_commit_count; ++i) { - cl_git_fail(parse_commit(&commit, failing_commit_cases[i])); - git_commit__free(commit); - } - - for (i = 0; i < passing_commit_count; ++i) { - cl_git_pass(parse_commit(&commit, passing_commit_cases[i])); - - if (!i) - cl_assert_equal_s("", git_commit_message(commit)); - else - cl_assert(git__prefixcmp( - git_commit_message(commit), "a simple commit which works") == 0); - - git_commit__free(commit); - } -} - - -// query the details on a parsed commit -void test_commit_parse__details0(void) { - static const char *commit_ids[] = { - "a4a7dce85cf63874e984719f4fdd239f5145052f", /* 0 */ - "9fd738e8f7967c078dceed8190330fc8648ee56a", /* 1 */ - "4a202b346bb0fb0db7eff3cffeb3c70babbd2045", /* 2 */ - "c47800c7266a2be04c571c04d5a6614691ea99bd", /* 3 */ - "8496071c1b46c854b31185ea97743be6a8774479", /* 4 */ - "5b5b025afb0b4c913b4c338a42934a3863bf3644", /* 5 */ - "a65fedf39aefe402d3bb6e24df4d4f5fe4547750", /* 6 */ - }; - const size_t commit_count = sizeof(commit_ids) / sizeof(const char *); - unsigned int i; - - for (i = 0; i < commit_count; ++i) { - git_oid id; - git_commit *commit; - - const git_signature *author, *committer; - const char *message; - git_time_t commit_time; - unsigned int parents, p; - git_commit *parent = NULL, *old_parent = NULL; - - git_oid_fromstr(&id, commit_ids[i]); - - cl_git_pass(git_commit_lookup(&commit, g_repo, &id)); - - message = git_commit_message(commit); - author = git_commit_author(commit); - committer = git_commit_committer(commit); - commit_time = git_commit_time(commit); - parents = git_commit_parentcount(commit); - - cl_assert_equal_s("Scott Chacon", author->name); - cl_assert_equal_s("schacon@gmail.com", author->email); - cl_assert_equal_s("Scott Chacon", committer->name); - cl_assert_equal_s("schacon@gmail.com", committer->email); - cl_assert(message != NULL); - cl_assert(commit_time > 0); - cl_assert(parents <= 2); - for (p = 0;p < parents;p++) { - if (old_parent != NULL) - git_commit_free(old_parent); - - old_parent = parent; - cl_git_pass(git_commit_parent(&parent, commit, p)); - cl_assert(parent != NULL); - cl_assert(git_commit_author(parent) != NULL); // is it really a commit? - } - git_commit_free(old_parent); - git_commit_free(parent); - - cl_git_fail(git_commit_parent(&parent, commit, parents)); - git_commit_free(commit); - } -} - -void test_commit_parse__leading_lf(void) -{ - git_commit *commit; - const char *buffer = -"tree 1810dff58d8a660512d4832e740f692884338ccd\n\ -parent e90810b8df3e80c413d903f631643c716887138d\n\ -author Vicent Marti 1273848544 +0200\n\ -committer Vicent Marti 1273848544 +0200\n\ -\n\ -\n\ -\n\ -This commit has a few LF at the start of the commit message"; - const char *message = -"This commit has a few LF at the start of the commit message"; - const char *raw_message = -"\n\ -\n\ -This commit has a few LF at the start of the commit message"; - cl_git_pass(parse_commit(&commit, buffer)); - cl_assert_equal_s(message, git_commit_message(commit)); - cl_assert_equal_s(raw_message, git_commit_message_raw(commit)); - git_commit__free(commit); -} - -void test_commit_parse__only_lf(void) -{ - git_commit *commit; - const char *buffer = -"tree 1810dff58d8a660512d4832e740f692884338ccd\n\ -parent e90810b8df3e80c413d903f631643c716887138d\n\ -author Vicent Marti 1273848544 +0200\n\ -committer Vicent Marti 1273848544 +0200\n\ -\n\ -\n\ -\n"; - const char *message = ""; - const char *raw_message = "\n\n"; - - cl_git_pass(parse_commit(&commit, buffer)); - cl_assert_equal_s(message, git_commit_message(commit)); - cl_assert_equal_s(raw_message, git_commit_message_raw(commit)); - git_commit__free(commit); -} - -void test_commit_parse__arbitrary_field(void) -{ - git_commit *commit; - git_buf buf = GIT_BUF_INIT; - const char *gpgsig = "-----BEGIN PGP SIGNATURE-----\n\ -Version: GnuPG v1.4.12 (Darwin)\n\ -\n\ -iQIcBAABAgAGBQJQ+FMIAAoJEH+LfPdZDSs1e3EQAJMjhqjWF+WkGLHju7pTw2al\n\ -o6IoMAhv0Z/LHlWhzBd9e7JeCnanRt12bAU7yvYp9+Z+z+dbwqLwDoFp8LVuigl8\n\ -JGLcnwiUW3rSvhjdCp9irdb4+bhKUnKUzSdsR2CK4/hC0N2i/HOvMYX+BRsvqweq\n\ -AsAkA6dAWh+gAfedrBUkCTGhlNYoetjdakWqlGL1TiKAefEZrtA1TpPkGn92vbLq\n\ -SphFRUY9hVn1ZBWrT3hEpvAIcZag3rTOiRVT1X1flj8B2vGCEr3RrcwOIZikpdaW\n\ -who/X3xh/DGbI2RbuxmmJpxxP/8dsVchRJJzBwG+yhwU/iN3MlV2c5D69tls/Dok\n\ -6VbyU4lm/ae0y3yR83D9dUlkycOnmmlBAHKIZ9qUts9X7mWJf0+yy2QxJVpjaTGG\n\ -cmnQKKPeNIhGJk2ENnnnzjEve7L7YJQF6itbx5VCOcsGh3Ocb3YR7DMdWjt7f8pu\n\ -c6j+q1rP7EpE2afUN/geSlp5i3x8aXZPDj67jImbVCE/Q1X9voCtyzGJH7MXR0N9\n\ -ZpRF8yzveRfMH8bwAJjSOGAFF5XkcR/RNY95o+J+QcgBLdX48h+ZdNmUf6jqlu3J\n\ -7KmTXXQcOVpN6dD3CmRFsbjq+x6RHwa8u1iGn+oIkX908r97ckfB/kHKH7ZdXIJc\n\ -cpxtDQQMGYFpXK/71stq\n\ -=ozeK\n\ ------END PGP SIGNATURE-----"; - - cl_git_pass(parse_commit(&commit, passing_commit_cases[4])); - - cl_git_pass(git_commit_header_field(&buf, commit, "parent")); - cl_assert_equal_s("34734e478d6cf50c27c9d69026d93974d052c454", buf.ptr); - git_buf_clear(&buf); - - cl_git_pass(git_commit_header_field(&buf, commit, "gpgsig")); - cl_assert_equal_s(gpgsig, buf.ptr); - - cl_git_fail_with(GIT_ENOTFOUND, git_commit_header_field(&buf, commit, "awesomeness")); - cl_git_fail_with(GIT_ENOTFOUND, git_commit_header_field(&buf, commit, "par")); - - git_buf_free(&buf); - git_commit__free(commit); -} diff --git a/vendor/libgit2/tests/commit/signature.c b/vendor/libgit2/tests/commit/signature.c deleted file mode 100644 index 41a74b999d..0000000000 --- a/vendor/libgit2/tests/commit/signature.c +++ /dev/null @@ -1,81 +0,0 @@ -#include "clar_libgit2.h" - -static int try_build_signature(const char *name, const char *email, git_time_t time, int offset) -{ - git_signature *sign; - int error = 0; - - if ((error = git_signature_new(&sign, name, email, time, offset)) < 0) - return error; - - git_signature_free((git_signature *)sign); - - return error; -} - -static void assert_name_and_email( - const char *expected_name, - const char *expected_email, - const char *name, - const char *email) -{ - git_signature *sign; - - cl_git_pass(git_signature_new(&sign, name, email, 1234567890, 60)); - cl_assert_equal_s(expected_name, sign->name); - cl_assert_equal_s(expected_email, sign->email); - - git_signature_free(sign); -} - -void test_commit_signature__leading_and_trailing_spaces_are_trimmed(void) -{ - assert_name_and_email("nulltoken", "emeric.fermas@gmail.com", " nulltoken ", " emeric.fermas@gmail.com "); - assert_name_and_email("nulltoken", "emeric.fermas@gmail.com", " nulltoken ", " emeric.fermas@gmail.com \n"); - assert_name_and_email("nulltoken", "emeric.fermas@gmail.com", " \t nulltoken \n", " \n emeric.fermas@gmail.com \n"); -} - -void test_commit_signature__angle_brackets_in_names_are_not_supported(void) -{ - cl_git_fail(try_build_signature("Haack", "phil@haack", 1234567890, 60)); - cl_git_fail(try_build_signature("", "phil@haack", 1234567890, 60)); -} - -void test_commit_signature__angle_brackets_in_email_are_not_supported(void) -{ - cl_git_fail(try_build_signature("Phil Haack", ">phil@haack", 1234567890, 60)); - cl_git_fail(try_build_signature("Phil Haack", "phil@>haack", 1234567890, 60)); - cl_git_fail(try_build_signature("Phil Haack", "", 1234567890, 60)); -} - -void test_commit_signature__create_empties(void) -{ - // can not create a signature with empty name or email - cl_git_pass(try_build_signature("nulltoken", "emeric.fermas@gmail.com", 1234567890, 60)); - - cl_git_fail(try_build_signature("", "emeric.fermas@gmail.com", 1234567890, 60)); - cl_git_fail(try_build_signature(" ", "emeric.fermas@gmail.com", 1234567890, 60)); - cl_git_fail(try_build_signature("nulltoken", "", 1234567890, 60)); - cl_git_fail(try_build_signature("nulltoken", " ", 1234567890, 60)); -} - -void test_commit_signature__create_one_char(void) -{ - // creating a one character signature - assert_name_and_email("x", "foo@bar.baz", "x", "foo@bar.baz"); -} - -void test_commit_signature__create_two_char(void) -{ - // creating a two character signature - assert_name_and_email("xx", "foo@bar.baz", "xx", "foo@bar.baz"); -} - -void test_commit_signature__create_zero_char(void) -{ - // creating a zero character signature - git_signature *sign; - cl_git_fail(git_signature_new(&sign, "", "x@y.z", 1234567890, 60)); - cl_assert(sign == NULL); -} diff --git a/vendor/libgit2/tests/commit/write.c b/vendor/libgit2/tests/commit/write.c deleted file mode 100644 index ee9eb82372..0000000000 --- a/vendor/libgit2/tests/commit/write.c +++ /dev/null @@ -1,160 +0,0 @@ -#include "clar_libgit2.h" - -static const char *committer_name = "Vicent Marti"; -static const char *committer_email = "vicent@github.com"; -static const char *commit_message = "This commit has been created in memory\n\ - This is a commit created in memory and it will be written back to disk\n"; -static const char *tree_oid = "1810dff58d8a660512d4832e740f692884338ccd"; -static const char *root_commit_message = "This is a root commit\n\ - This is a root commit and should be the only one in this branch\n"; -static const char *root_reflog_message = "commit (initial): This is a root commit \ - This is a root commit and should be the only one in this branch"; -static char *head_old; -static git_reference *head, *branch; -static git_commit *commit; - -// Fixture setup -static git_repository *g_repo; -void test_commit_write__initialize(void) -{ - g_repo = cl_git_sandbox_init("testrepo"); -} - -void test_commit_write__cleanup(void) -{ - git_reference_free(head); - head = NULL; - - git_reference_free(branch); - branch = NULL; - - git_commit_free(commit); - commit = NULL; - - git__free(head_old); - head_old = NULL; - - cl_git_sandbox_cleanup(); -} - - -// write a new commit object from memory to disk -void test_commit_write__from_memory(void) -{ - git_oid tree_id, parent_id, commit_id; - git_signature *author, *committer; - const git_signature *author1, *committer1; - git_commit *parent; - git_tree *tree; - const char *commit_id_str = "8496071c1b46c854b31185ea97743be6a8774479"; - - git_oid_fromstr(&tree_id, tree_oid); - cl_git_pass(git_tree_lookup(&tree, g_repo, &tree_id)); - - git_oid_fromstr(&parent_id, commit_id_str); - cl_git_pass(git_commit_lookup(&parent, g_repo, &parent_id)); - - /* create signatures */ - cl_git_pass(git_signature_new(&committer, committer_name, committer_email, 123456789, 60)); - cl_git_pass(git_signature_new(&author, committer_name, committer_email, 987654321, 90)); - - cl_git_pass(git_commit_create_v( - &commit_id, /* out id */ - g_repo, - NULL, /* do not update the HEAD */ - author, - committer, - NULL, - commit_message, - tree, - 1, parent)); - - git_object_free((git_object *)parent); - git_object_free((git_object *)tree); - - git_signature_free(committer); - git_signature_free(author); - - cl_git_pass(git_commit_lookup(&commit, g_repo, &commit_id)); - - /* Check attributes were set correctly */ - author1 = git_commit_author(commit); - cl_assert(author1 != NULL); - cl_assert_equal_s(committer_name, author1->name); - cl_assert_equal_s(committer_email, author1->email); - cl_assert(author1->when.time == 987654321); - cl_assert(author1->when.offset == 90); - - committer1 = git_commit_committer(commit); - cl_assert(committer1 != NULL); - cl_assert_equal_s(committer_name, committer1->name); - cl_assert_equal_s(committer_email, committer1->email); - cl_assert(committer1->when.time == 123456789); - cl_assert(committer1->when.offset == 60); - - cl_assert_equal_s(commit_message, git_commit_message(commit)); -} - -// create a root commit -void test_commit_write__root(void) -{ - git_oid tree_id, commit_id; - const git_oid *branch_oid; - git_signature *author, *committer; - const char *branch_name = "refs/heads/root-commit-branch"; - git_tree *tree; - git_reflog *log; - const git_reflog_entry *entry; - - git_oid_fromstr(&tree_id, tree_oid); - cl_git_pass(git_tree_lookup(&tree, g_repo, &tree_id)); - - /* create signatures */ - cl_git_pass(git_signature_new(&committer, committer_name, committer_email, 123456789, 60)); - cl_git_pass(git_signature_new(&author, committer_name, committer_email, 987654321, 90)); - - /* First we need to update HEAD so it points to our non-existant branch */ - cl_git_pass(git_reference_lookup(&head, g_repo, "HEAD")); - cl_assert(git_reference_type(head) == GIT_REF_SYMBOLIC); - head_old = git__strdup(git_reference_symbolic_target(head)); - cl_assert(head_old != NULL); - git_reference_free(head); - - cl_git_pass(git_reference_symbolic_create(&head, g_repo, "HEAD", branch_name, 1, NULL)); - - cl_git_pass(git_commit_create_v( - &commit_id, /* out id */ - g_repo, - "HEAD", - author, - committer, - NULL, - root_commit_message, - tree, - 0)); - - git_object_free((git_object *)tree); - git_signature_free(author); - - /* - * The fact that creating a commit works has already been - * tested. Here we just make sure it's our commit and that it was - * written as a root commit. - */ - cl_git_pass(git_commit_lookup(&commit, g_repo, &commit_id)); - cl_assert(git_commit_parentcount(commit) == 0); - cl_git_pass(git_reference_lookup(&branch, g_repo, branch_name)); - branch_oid = git_reference_target(branch); - cl_assert_equal_oid(branch_oid, &commit_id); - cl_assert_equal_s(root_commit_message, git_commit_message(commit)); - - cl_git_pass(git_reflog_read(&log, g_repo, branch_name)); - cl_assert_equal_i(1, git_reflog_entrycount(log)); - entry = git_reflog_entry_byindex(log, 0); - cl_assert_equal_s(committer->email, git_reflog_entry_committer(entry)->email); - cl_assert_equal_s(committer->name, git_reflog_entry_committer(entry)->name); - cl_assert_equal_s(root_reflog_message, git_reflog_entry_message(entry)); - - git_signature_free(committer); - git_reflog_free(log); -} diff --git a/vendor/libgit2/tests/config/add.c b/vendor/libgit2/tests/config/add.c deleted file mode 100644 index 405f1e2c92..0000000000 --- a/vendor/libgit2/tests/config/add.c +++ /dev/null @@ -1,37 +0,0 @@ -#include "clar_libgit2.h" - -void test_config_add__initialize(void) -{ - cl_fixture_sandbox("config/config10"); -} - -void test_config_add__cleanup(void) -{ - cl_fixture_cleanup("config10"); -} - -void test_config_add__to_existing_section(void) -{ - git_config *cfg; - int32_t i; - - cl_git_pass(git_config_open_ondisk(&cfg, "config10")); - cl_git_pass(git_config_set_int32(cfg, "empty.tmp", 5)); - cl_git_pass(git_config_get_int32(&i, cfg, "empty.tmp")); - cl_assert(i == 5); - cl_git_pass(git_config_delete_entry(cfg, "empty.tmp")); - git_config_free(cfg); -} - -void test_config_add__to_new_section(void) -{ - git_config *cfg; - int32_t i; - - cl_git_pass(git_config_open_ondisk(&cfg, "config10")); - cl_git_pass(git_config_set_int32(cfg, "section.tmp", 5)); - cl_git_pass(git_config_get_int32(&i, cfg, "section.tmp")); - cl_assert(i == 5); - cl_git_pass(git_config_delete_entry(cfg, "section.tmp")); - git_config_free(cfg); -} diff --git a/vendor/libgit2/tests/config/backend.c b/vendor/libgit2/tests/config/backend.c deleted file mode 100644 index 3fd6eb1147..0000000000 --- a/vendor/libgit2/tests/config/backend.c +++ /dev/null @@ -1,24 +0,0 @@ -#include "clar_libgit2.h" -#include "git2/sys/config.h" - -void test_config_backend__checks_version(void) -{ - git_config *cfg; - git_config_backend backend = GIT_CONFIG_BACKEND_INIT; - const git_error *err; - - backend.version = 1024; - - cl_git_pass(git_config_new(&cfg)); - cl_git_fail(git_config_add_backend(cfg, &backend, 0, false)); - err = giterr_last(); - cl_assert_equal_i(GITERR_INVALID, err->klass); - - giterr_clear(); - backend.version = 1024; - cl_git_fail(git_config_add_backend(cfg, &backend, 0, false)); - err = giterr_last(); - cl_assert_equal_i(GITERR_INVALID, err->klass); - - git_config_free(cfg); -} diff --git a/vendor/libgit2/tests/config/config_helpers.c b/vendor/libgit2/tests/config/config_helpers.c deleted file mode 100644 index 025838ad7e..0000000000 --- a/vendor/libgit2/tests/config/config_helpers.c +++ /dev/null @@ -1,68 +0,0 @@ -#include "clar_libgit2.h" -#include "config_helpers.h" -#include "repository.h" -#include "buffer.h" - -void assert_config_entry_existence( - git_repository *repo, - const char *name, - bool is_supposed_to_exist) -{ - git_config *config; - git_config_entry *entry = NULL; - int result; - - cl_git_pass(git_repository_config__weakptr(&config, repo)); - - result = git_config_get_entry(&entry, config, name); - git_config_entry_free(entry); - - if (is_supposed_to_exist) - cl_git_pass(result); - else - cl_assert_equal_i(GIT_ENOTFOUND, result); -} - -void assert_config_entry_value( - git_repository *repo, - const char *name, - const char *expected_value) -{ - git_config *config; - git_buf buf = GIT_BUF_INIT; - - cl_git_pass(git_repository_config__weakptr(&config, repo)); - - cl_git_pass(git_config_get_string_buf(&buf, config, name)); - - cl_assert_equal_s(expected_value, git_buf_cstr(&buf)); - git_buf_free(&buf); -} - -static int count_config_entries_cb( - const git_config_entry *entry, - void *payload) -{ - int *how_many = (int *)payload; - - GIT_UNUSED(entry); - - (*how_many)++; - - return 0; -} - -int count_config_entries_match(git_repository *repo, const char *pattern) -{ - git_config *config; - int how_many = 0; - - cl_git_pass(git_repository_config(&config, repo)); - - cl_assert_equal_i(0, git_config_foreach_match( - config, pattern, count_config_entries_cb, &how_many)); - - git_config_free(config); - - return how_many; -} diff --git a/vendor/libgit2/tests/config/config_helpers.h b/vendor/libgit2/tests/config/config_helpers.h deleted file mode 100644 index 4406457301..0000000000 --- a/vendor/libgit2/tests/config/config_helpers.h +++ /dev/null @@ -1,13 +0,0 @@ -extern void assert_config_entry_existence( - git_repository *repo, - const char *name, - bool is_supposed_to_exist); - -extern void assert_config_entry_value( - git_repository *repo, - const char *name, - const char *expected_value); - -extern int count_config_entries_match( - git_repository *repo, - const char *pattern); diff --git a/vendor/libgit2/tests/config/configlevel.c b/vendor/libgit2/tests/config/configlevel.c deleted file mode 100644 index ca478b1a53..0000000000 --- a/vendor/libgit2/tests/config/configlevel.c +++ /dev/null @@ -1,73 +0,0 @@ -#include "clar_libgit2.h" - -void test_config_configlevel__adding_the_same_level_twice_returns_EEXISTS(void) -{ - int error; - git_config *cfg; - - cl_git_pass(git_config_new(&cfg)); - cl_git_pass(git_config_add_file_ondisk(cfg, cl_fixture("config/config9"), - GIT_CONFIG_LEVEL_LOCAL, 0)); - cl_git_pass(git_config_add_file_ondisk(cfg, cl_fixture("config/config15"), - GIT_CONFIG_LEVEL_GLOBAL, 0)); - error = git_config_add_file_ondisk(cfg, cl_fixture("config/config16"), - GIT_CONFIG_LEVEL_GLOBAL, 0); - - cl_git_fail(error); - cl_assert_equal_i(GIT_EEXISTS, error); - - git_config_free(cfg); -} - -void test_config_configlevel__can_replace_a_config_file_at_an_existing_level(void) -{ - git_config *cfg; - git_buf buf = {0}; - - cl_git_pass(git_config_new(&cfg)); - cl_git_pass(git_config_add_file_ondisk(cfg, cl_fixture("config/config18"), - GIT_CONFIG_LEVEL_LOCAL, 1)); - cl_git_pass(git_config_add_file_ondisk(cfg, cl_fixture("config/config19"), - GIT_CONFIG_LEVEL_LOCAL, 1)); - - cl_git_pass(git_config_get_string_buf(&buf, cfg, "core.stringglobal")); - cl_assert_equal_s("don't find me!", buf.ptr); - - git_buf_free(&buf); - git_config_free(cfg); -} - -void test_config_configlevel__can_read_from_a_single_level_focused_file_after_parent_config_has_been_freed(void) -{ - git_config *cfg; - git_config *single_level_cfg; - git_buf buf = {0}; - - cl_git_pass(git_config_new(&cfg)); - cl_git_pass(git_config_add_file_ondisk(cfg, cl_fixture("config/config18"), - GIT_CONFIG_LEVEL_GLOBAL, 0)); - cl_git_pass(git_config_add_file_ondisk(cfg, cl_fixture("config/config19"), - GIT_CONFIG_LEVEL_LOCAL, 0)); - - cl_git_pass(git_config_open_level(&single_level_cfg, cfg, GIT_CONFIG_LEVEL_LOCAL)); - - git_config_free(cfg); - - cl_git_pass(git_config_get_string_buf(&buf, single_level_cfg, "core.stringglobal")); - cl_assert_equal_s("don't find me!", buf.ptr); - - git_buf_free(&buf); - git_config_free(single_level_cfg); -} - -void test_config_configlevel__fetching_a_level_from_an_empty_compound_config_returns_ENOTFOUND(void) -{ - git_config *cfg; - git_config *local_cfg; - - cl_git_pass(git_config_new(&cfg)); - - cl_assert_equal_i(GIT_ENOTFOUND, git_config_open_level(&local_cfg, cfg, GIT_CONFIG_LEVEL_LOCAL)); - - git_config_free(cfg); -} diff --git a/vendor/libgit2/tests/config/global.c b/vendor/libgit2/tests/config/global.c deleted file mode 100644 index 4481308d64..0000000000 --- a/vendor/libgit2/tests/config/global.c +++ /dev/null @@ -1,67 +0,0 @@ -#include "clar_libgit2.h" -#include "buffer.h" -#include "fileops.h" - -void test_config_global__initialize(void) -{ - git_buf path = GIT_BUF_INIT; - - cl_git_pass(git_futils_mkdir_r("home", NULL, 0777)); - cl_git_pass(git_path_prettify(&path, "home", NULL)); - cl_git_pass(git_libgit2_opts( - GIT_OPT_SET_SEARCH_PATH, GIT_CONFIG_LEVEL_GLOBAL, path.ptr)); - - cl_git_pass(git_futils_mkdir_r("xdg/git", NULL, 0777)); - cl_git_pass(git_path_prettify(&path, "xdg/git", NULL)); - cl_git_pass(git_libgit2_opts( - GIT_OPT_SET_SEARCH_PATH, GIT_CONFIG_LEVEL_XDG, path.ptr)); - - cl_git_pass(git_futils_mkdir_r("etc", NULL, 0777)); - cl_git_pass(git_path_prettify(&path, "etc", NULL)); - cl_git_pass(git_libgit2_opts( - GIT_OPT_SET_SEARCH_PATH, GIT_CONFIG_LEVEL_SYSTEM, path.ptr)); - - git_buf_free(&path); -} - -void test_config_global__cleanup(void) -{ - cl_sandbox_set_search_path_defaults(); -} - -void test_config_global__open_global(void) -{ - git_config *cfg, *global, *selected, *dummy; - - cl_git_pass(git_config_open_default(&cfg)); - cl_git_pass(git_config_open_level(&global, cfg, GIT_CONFIG_LEVEL_GLOBAL)); - cl_git_fail(git_config_open_level(&dummy, cfg, GIT_CONFIG_LEVEL_XDG)); - cl_git_pass(git_config_open_global(&selected, cfg)); - - git_config_free(selected); - git_config_free(global); - git_config_free(cfg); -} - -void test_config_global__open_xdg(void) -{ - git_config *cfg, *xdg, *selected; - const char *str = "teststring"; - const char *key = "this.variable"; - git_buf buf = {0}; - - cl_git_mkfile("xdg/git/config", "# XDG config\n[core]\n test = 1\n"); - - cl_git_pass(git_config_open_default(&cfg)); - cl_git_pass(git_config_open_level(&xdg, cfg, GIT_CONFIG_LEVEL_XDG)); - cl_git_pass(git_config_open_global(&selected, cfg)); - - cl_git_pass(git_config_set_string(xdg, key, str)); - cl_git_pass(git_config_get_string_buf(&buf, selected, key)); - cl_assert_equal_s(str, buf.ptr); - - git_buf_free(&buf); - git_config_free(selected); - git_config_free(xdg); - git_config_free(cfg); -} diff --git a/vendor/libgit2/tests/config/include.c b/vendor/libgit2/tests/config/include.c deleted file mode 100644 index 882b89b16b..0000000000 --- a/vendor/libgit2/tests/config/include.c +++ /dev/null @@ -1,133 +0,0 @@ -#include "clar_libgit2.h" -#include "buffer.h" -#include "fileops.h" - -void test_config_include__relative(void) -{ - git_config *cfg; - git_buf buf = GIT_BUF_INIT; - - cl_git_pass(git_config_open_ondisk(&cfg, cl_fixture("config/config-include"))); - - cl_git_pass(git_config_get_string_buf(&buf, cfg, "foo.bar.baz")); - cl_assert_equal_s("huzzah", git_buf_cstr(&buf)); - - git_buf_free(&buf); - git_config_free(cfg); -} - -void test_config_include__absolute(void) -{ - git_config *cfg; - git_buf buf = GIT_BUF_INIT; - - cl_git_pass(git_buf_printf(&buf, "[include]\npath = %s/config-included", cl_fixture("config"))); - - cl_git_mkfile("config-include-absolute", git_buf_cstr(&buf)); - git_buf_free(&buf); - cl_git_pass(git_config_open_ondisk(&cfg, "config-include-absolute")); - - cl_git_pass(git_config_get_string_buf(&buf, cfg, "foo.bar.baz")); - cl_assert_equal_s("huzzah", git_buf_cstr(&buf)); - - git_buf_free(&buf); - git_config_free(cfg); -} - -void test_config_include__homedir(void) -{ - git_config *cfg; - git_buf buf = GIT_BUF_INIT; - - cl_git_pass(git_libgit2_opts(GIT_OPT_SET_SEARCH_PATH, GIT_CONFIG_LEVEL_GLOBAL, cl_fixture("config"))); - cl_git_mkfile("config-include-homedir", "[include]\npath = ~/config-included"); - - cl_git_pass(git_config_open_ondisk(&cfg, "config-include-homedir")); - - cl_git_pass(git_config_get_string_buf(&buf, cfg, "foo.bar.baz")); - cl_assert_equal_s("huzzah", git_buf_cstr(&buf)); - - git_buf_free(&buf); - git_config_free(cfg); - - cl_sandbox_set_search_path_defaults(); -} - -/* We need to pretend that the variables were defined where the file was included */ -void test_config_include__ordering(void) -{ - git_config *cfg; - git_buf buf = GIT_BUF_INIT; - - cl_git_mkfile("included", "[foo \"bar\"]\nbaz = hurrah\nfrotz = hiya"); - cl_git_mkfile("including", - "[foo \"bar\"]\nfrotz = hello\n" - "[include]\npath = included\n" - "[foo \"bar\"]\nbaz = huzzah\n"); - - cl_git_pass(git_config_open_ondisk(&cfg, "including")); - - cl_git_pass(git_config_get_string_buf(&buf, cfg, "foo.bar.frotz")); - cl_assert_equal_s("hiya", git_buf_cstr(&buf)); - git_buf_clear(&buf); - cl_git_pass(git_config_get_string_buf(&buf, cfg, "foo.bar.baz")); - cl_assert_equal_s("huzzah", git_buf_cstr(&buf)); - - git_buf_free(&buf); - git_config_free(cfg); -} - -/* We need to pretend that the variables were defined where the file was included */ -void test_config_include__depth(void) -{ - git_config *cfg; - - cl_git_mkfile("a", "[include]\npath = b"); - cl_git_mkfile("b", "[include]\npath = a"); - - cl_git_fail(git_config_open_ondisk(&cfg, "a")); - - p_unlink("a"); - p_unlink("b"); -} - -void test_config_include__missing(void) -{ - git_config *cfg; - git_buf buf = GIT_BUF_INIT; - - cl_git_mkfile("including", "[include]\npath = nonexistentfile\n[foo]\nbar = baz"); - - giterr_clear(); - cl_git_pass(git_config_open_ondisk(&cfg, "including")); - cl_assert(giterr_last() == NULL); - cl_git_pass(git_config_get_string_buf(&buf, cfg, "foo.bar")); - cl_assert_equal_s("baz", git_buf_cstr(&buf)); - - git_buf_free(&buf); - git_config_free(cfg); -} - -#define replicate10(s) s s s s s s s s s s -void test_config_include__depth2(void) -{ - git_config *cfg; - git_buf buf = GIT_BUF_INIT; - const char *content = "[include]\n" replicate10(replicate10("path=bottom\n")); - - cl_git_mkfile("top-level", "[include]\npath = middle\n[foo]\nbar = baz"); - cl_git_mkfile("middle", content); - cl_git_mkfile("bottom", "[foo]\nbar2 = baz2"); - - cl_git_pass(git_config_open_ondisk(&cfg, "top-level")); - - cl_git_pass(git_config_get_string_buf(&buf, cfg, "foo.bar")); - cl_assert_equal_s("baz", git_buf_cstr(&buf)); - - git_buf_clear(&buf); - cl_git_pass(git_config_get_string_buf(&buf, cfg, "foo.bar2")); - cl_assert_equal_s("baz2", git_buf_cstr(&buf)); - - git_buf_free(&buf); - git_config_free(cfg); -} diff --git a/vendor/libgit2/tests/config/multivar.c b/vendor/libgit2/tests/config/multivar.c deleted file mode 100644 index 0150089923..0000000000 --- a/vendor/libgit2/tests/config/multivar.c +++ /dev/null @@ -1,288 +0,0 @@ -#include "clar_libgit2.h" - -static const char *_name = "remote.ab.url"; - -void test_config_multivar__initialize(void) -{ - cl_fixture_sandbox("config"); -} - -void test_config_multivar__cleanup(void) -{ - cl_fixture_cleanup("config"); -} - -static int mv_read_cb(const git_config_entry *entry, void *data) -{ - int *n = (int *) data; - - if (!strcmp(entry->name, _name)) - (*n)++; - - return 0; -} - -void test_config_multivar__foreach(void) -{ - git_config *cfg; - int n = 0; - - cl_git_pass(git_config_open_ondisk(&cfg, cl_fixture("config/config11"))); - - cl_git_pass(git_config_foreach(cfg, mv_read_cb, &n)); - cl_assert(n == 2); - - git_config_free(cfg); -} - -static int cb(const git_config_entry *entry, void *data) -{ - int *n = (int *) data; - - GIT_UNUSED(entry); - - (*n)++; - - return 0; -} - -static void check_get_multivar_foreach( - git_config *cfg, int expected, int expected_patterned) -{ - int n = 0; - - if (expected > 0) { - cl_git_pass(git_config_get_multivar_foreach(cfg, _name, NULL, cb, &n)); - cl_assert_equal_i(expected, n); - } else { - cl_assert_equal_i(GIT_ENOTFOUND, - git_config_get_multivar_foreach(cfg, _name, NULL, cb, &n)); - } - - n = 0; - - if (expected_patterned > 0) { - cl_git_pass(git_config_get_multivar_foreach(cfg, _name, "example", cb, &n)); - cl_assert_equal_i(expected_patterned, n); - } else { - cl_assert_equal_i(GIT_ENOTFOUND, - git_config_get_multivar_foreach(cfg, _name, "example", cb, &n)); - } -} - -static void check_get_multivar(git_config *cfg, int expected) -{ - git_config_iterator *iter; - git_config_entry *entry; - int n = 0; - - cl_git_pass(git_config_multivar_iterator_new(&iter, cfg, _name, NULL)); - - while (git_config_next(&entry, iter) == 0) - n++; - - cl_assert_equal_i(expected, n); - git_config_iterator_free(iter); - -} - -void test_config_multivar__get(void) -{ - git_config *cfg; - - cl_git_pass(git_config_open_ondisk(&cfg, "config/config11")); - check_get_multivar_foreach(cfg, 2, 1); - - /* add another that has the _name entry */ - cl_git_pass(git_config_add_file_ondisk(cfg, "config/config9", GIT_CONFIG_LEVEL_SYSTEM, 1)); - check_get_multivar_foreach(cfg, 3, 2); - - /* add another that does not have the _name entry */ - cl_git_pass(git_config_add_file_ondisk(cfg, "config/config0", GIT_CONFIG_LEVEL_GLOBAL, 1)); - check_get_multivar_foreach(cfg, 3, 2); - - /* add another that does not have the _name entry at the end */ - cl_git_pass(git_config_add_file_ondisk(cfg, "config/config1", GIT_CONFIG_LEVEL_APP, 1)); - check_get_multivar_foreach(cfg, 3, 2); - - /* drop original file */ - cl_git_pass(git_config_add_file_ondisk(cfg, "config/config2", GIT_CONFIG_LEVEL_LOCAL, 1)); - check_get_multivar_foreach(cfg, 1, 1); - - /* drop other file with match */ - cl_git_pass(git_config_add_file_ondisk(cfg, "config/config3", GIT_CONFIG_LEVEL_SYSTEM, 1)); - check_get_multivar_foreach(cfg, 0, 0); - - /* reload original file (add different place in order) */ - cl_git_pass(git_config_add_file_ondisk(cfg, "config/config11", GIT_CONFIG_LEVEL_SYSTEM, 1)); - check_get_multivar_foreach(cfg, 2, 1); - - check_get_multivar(cfg, 2); - - git_config_free(cfg); -} - -void test_config_multivar__add(void) -{ - git_config *cfg; - int n; - - cl_git_pass(git_config_open_ondisk(&cfg, "config/config11")); - cl_git_pass(git_config_set_multivar(cfg, _name, "nonexistant", "git://git.otherplace.org/libgit2")); - - n = 0; - cl_git_pass(git_config_get_multivar_foreach(cfg, _name, NULL, cb, &n)); - cl_assert_equal_i(n, 3); - - n = 0; - cl_git_pass(git_config_get_multivar_foreach(cfg, _name, "otherplace", cb, &n)); - cl_assert_equal_i(n, 1); - - git_config_free(cfg); - - /* We know it works in memory, let's see if the file is written correctly */ - - cl_git_pass(git_config_open_ondisk(&cfg, "config/config11")); - - n = 0; - cl_git_pass(git_config_get_multivar_foreach(cfg, _name, NULL, cb, &n)); - cl_assert_equal_i(n, 3); - - n = 0; - cl_git_pass(git_config_get_multivar_foreach(cfg, _name, "otherplace", cb, &n)); - cl_assert_equal_i(n, 1); - - git_config_free(cfg); -} - -void test_config_multivar__add_new(void) -{ - const char *var = "a.brand.new"; - git_config *cfg; - int n; - - cl_git_pass(git_config_open_ondisk(&cfg, "config/config11")); - - cl_git_pass(git_config_set_multivar(cfg, var, "", "variable")); - n = 0; - cl_git_pass(git_config_get_multivar_foreach(cfg, var, NULL, cb, &n)); - cl_assert_equal_i(n, 1); - - git_config_free(cfg); -} - -void test_config_multivar__replace(void) -{ - git_config *cfg; - int n; - - cl_git_pass(git_config_open_ondisk(&cfg, "config/config11")); - - n = 0; - cl_git_pass(git_config_get_multivar_foreach(cfg, _name, NULL, cb, &n)); - cl_assert(n == 2); - - cl_git_pass(git_config_set_multivar(cfg, _name, "github", "git://git.otherplace.org/libgit2")); - - n = 0; - cl_git_pass(git_config_get_multivar_foreach(cfg, _name, NULL, cb, &n)); - cl_assert(n == 2); - - git_config_free(cfg); - - cl_git_pass(git_config_open_ondisk(&cfg, "config/config11")); - - n = 0; - cl_git_pass(git_config_get_multivar_foreach(cfg, _name, NULL, cb, &n)); - cl_assert(n == 2); - - git_config_free(cfg); -} - -void test_config_multivar__replace_multiple(void) -{ - git_config *cfg; - int n; - - cl_git_pass(git_config_open_ondisk(&cfg, "config/config11")); - cl_git_pass(git_config_set_multivar(cfg, _name, "git://", "git://git.otherplace.org/libgit2")); - - n = 0; - cl_git_pass(git_config_get_multivar_foreach(cfg, _name, "otherplace", cb, &n)); - cl_assert_equal_i(n, 2); - - git_config_free(cfg); - - cl_git_pass(git_config_open_ondisk(&cfg, "config/config11")); - - n = 0; - cl_git_pass(git_config_get_multivar_foreach(cfg, _name, "otherplace", cb, &n)); - cl_assert_equal_i(n, 2); - - git_config_free(cfg); -} - -void test_config_multivar__delete(void) -{ - git_config *cfg; - int n; - - cl_git_pass(git_config_open_ondisk(&cfg, "config/config11")); - - n = 0; - cl_git_pass(git_config_get_multivar_foreach(cfg, _name, NULL, cb, &n)); - cl_assert_equal_i(2, n); - - cl_git_pass(git_config_delete_multivar(cfg, _name, "github")); - - n = 0; - cl_git_pass(git_config_get_multivar_foreach(cfg, _name, NULL, cb, &n)); - cl_assert_equal_i(1, n); - - git_config_free(cfg); - - cl_git_pass(git_config_open_ondisk(&cfg, "config/config11")); - - n = 0; - cl_git_pass(git_config_get_multivar_foreach(cfg, _name, NULL, cb, &n)); - cl_assert_equal_i(1, n); - - git_config_free(cfg); -} - -void test_config_multivar__delete_multiple(void) -{ - git_config *cfg; - int n; - - cl_git_pass(git_config_open_ondisk(&cfg, "config/config11")); - - n = 0; - cl_git_pass(git_config_get_multivar_foreach(cfg, _name, NULL, cb, &n)); - cl_assert(n == 2); - - cl_git_pass(git_config_delete_multivar(cfg, _name, "git")); - - n = 0; - cl_git_fail_with(git_config_get_multivar_foreach(cfg, _name, NULL, cb, &n), GIT_ENOTFOUND); - - git_config_free(cfg); - - cl_git_pass(git_config_open_ondisk(&cfg, "config/config11")); - - n = 0; - cl_git_fail_with(git_config_get_multivar_foreach(cfg, _name, NULL, cb, &n), GIT_ENOTFOUND); - - git_config_free(cfg); -} - -void test_config_multivar__delete_notfound(void) -{ - git_config *cfg; - - cl_git_pass(git_config_open_ondisk(&cfg, "config/config11")); - - cl_git_fail_with(git_config_delete_multivar(cfg, "remote.ab.noturl", "git"), GIT_ENOTFOUND); - - git_config_free(cfg); -} diff --git a/vendor/libgit2/tests/config/new.c b/vendor/libgit2/tests/config/new.c deleted file mode 100644 index b39baa0a59..0000000000 --- a/vendor/libgit2/tests/config/new.c +++ /dev/null @@ -1,34 +0,0 @@ -#include "clar_libgit2.h" - -#include "filebuf.h" -#include "fileops.h" -#include "posix.h" - -#define TEST_CONFIG "git-new-config" - -void test_config_new__write_new_config(void) -{ - git_config *config; - git_buf buf = GIT_BUF_INIT; - - cl_git_mkfile(TEST_CONFIG, ""); - cl_git_pass(git_config_open_ondisk(&config, TEST_CONFIG)); - - cl_git_pass(git_config_set_string(config, "color.ui", "auto")); - cl_git_pass(git_config_set_string(config, "core.editor", "ed")); - - git_config_free(config); - - cl_git_pass(git_config_open_ondisk(&config, TEST_CONFIG)); - - cl_git_pass(git_config_get_string_buf(&buf, config, "color.ui")); - cl_assert_equal_s("auto", git_buf_cstr(&buf)); - git_buf_clear(&buf); - cl_git_pass(git_config_get_string_buf(&buf, config, "core.editor")); - cl_assert_equal_s("ed", git_buf_cstr(&buf)); - - git_buf_free(&buf); - git_config_free(config); - - p_unlink(TEST_CONFIG); -} diff --git a/vendor/libgit2/tests/config/read.c b/vendor/libgit2/tests/config/read.c deleted file mode 100644 index f86b2d79e7..0000000000 --- a/vendor/libgit2/tests/config/read.c +++ /dev/null @@ -1,705 +0,0 @@ -#include "clar_libgit2.h" -#include "buffer.h" -#include "path.h" - -static git_buf buf = GIT_BUF_INIT; - -void test_config_read__cleanup(void) -{ - git_buf_free(&buf); -} - -void test_config_read__simple_read(void) -{ - git_config *cfg; - int32_t i; - - cl_git_pass(git_config_open_ondisk(&cfg, cl_fixture("config/config0"))); - - cl_git_pass(git_config_get_int32(&i, cfg, "core.repositoryformatversion")); - cl_assert(i == 0); - cl_git_pass(git_config_get_bool(&i, cfg, "core.filemode")); - cl_assert(i == 1); - cl_git_pass(git_config_get_bool(&i, cfg, "core.bare")); - cl_assert(i == 0); - cl_git_pass(git_config_get_bool(&i, cfg, "core.logallrefupdates")); - cl_assert(i == 1); - - git_config_free(cfg); -} - -void test_config_read__case_sensitive(void) -{ - git_config *cfg; - int i; - - cl_git_pass(git_config_open_ondisk(&cfg, cl_fixture("config/config1"))); - - cl_git_pass(git_config_get_string_buf(&buf, cfg, "this.that.other")); - cl_assert_equal_s("true", git_buf_cstr(&buf)); - git_buf_clear(&buf); - - cl_git_pass(git_config_get_string_buf(&buf, cfg, "this.That.other")); - cl_assert_equal_s("yes", git_buf_cstr(&buf)); - - cl_git_pass(git_config_get_bool(&i, cfg, "this.that.other")); - cl_assert(i == 1); - cl_git_pass(git_config_get_bool(&i, cfg, "this.That.other")); - cl_assert(i == 1); - - /* This one doesn't exist */ - cl_must_fail(git_config_get_bool(&i, cfg, "this.thaT.other")); - - git_config_free(cfg); -} - -/* - * If \ is the last non-space character on the line, we read the next - * one, separating each line with SP. - */ -void test_config_read__multiline_value(void) -{ - git_config *cfg; - - cl_git_pass(git_config_open_ondisk(&cfg, cl_fixture("config/config2"))); - - cl_git_pass(git_config_get_string_buf(&buf, cfg, "this.That.and")); - cl_assert_equal_s("one one one two two three three", git_buf_cstr(&buf)); - - git_config_free(cfg); -} - -static void clean_test_config(void *unused) -{ - GIT_UNUSED(unused); - cl_fixture_cleanup("./testconfig"); -} - -void test_config_read__multiline_value_and_eof(void) -{ - git_config *cfg; - - cl_set_cleanup(&clean_test_config, NULL); - cl_git_mkfile("./testconfig", "[header]\n key1 = foo\\\n"); - cl_git_pass(git_config_open_ondisk(&cfg, "./testconfig")); - - cl_git_pass(git_config_get_string_buf(&buf, cfg, "header.key1")); - cl_assert_equal_s("foo", git_buf_cstr(&buf)); - - git_config_free(cfg); -} - -void test_config_read__multiline_eof(void) -{ - git_config *cfg; - - cl_set_cleanup(&clean_test_config, NULL); - cl_git_mkfile("./testconfig", "[header]\n key1 = \\\n"); - cl_git_pass(git_config_open_ondisk(&cfg, "./testconfig")); - - cl_git_pass(git_config_get_string_buf(&buf, cfg, "header.key1")); - cl_assert_equal_s("", git_buf_cstr(&buf)); - - git_config_free(cfg); -} - -/* - * This kind of subsection declaration is case-insensitive - */ -void test_config_read__subsection_header(void) -{ - git_config *cfg; - - cl_git_pass(git_config_open_ondisk(&cfg, cl_fixture("config/config3"))); - - cl_git_pass(git_config_get_string_buf(&buf, cfg, "section.subsection.var")); - cl_assert_equal_s("hello", git_buf_cstr(&buf)); - - /* The subsection is transformed to lower-case */ - cl_must_fail(git_config_get_string_buf(&buf, cfg, "section.subSectIon.var")); - - git_config_free(cfg); -} - -void test_config_read__lone_variable(void) -{ - git_config *cfg; - int i; - - cl_git_pass(git_config_open_ondisk(&cfg, cl_fixture("config/config4"))); - - cl_git_fail(git_config_get_int32(&i, cfg, "some.section.variable")); - - cl_git_pass(git_config_get_string_buf(&buf, cfg, "some.section.variable")); - cl_assert_equal_s("", git_buf_cstr(&buf)); - git_buf_clear(&buf); - - cl_git_pass(git_config_get_bool(&i, cfg, "some.section.variable")); - cl_assert(i == 1); - - cl_git_pass(git_config_get_string_buf(&buf, cfg, "some.section.variableeq")); - cl_assert_equal_s("", git_buf_cstr(&buf)); - - cl_git_pass(git_config_get_bool(&i, cfg, "some.section.variableeq")); - cl_assert(i == 0); - - git_config_free(cfg); -} - -void test_config_read__number_suffixes(void) -{ - git_config *cfg; - int64_t i; - - cl_git_pass(git_config_open_ondisk(&cfg, cl_fixture("config/config5"))); - - cl_git_pass(git_config_get_int64(&i, cfg, "number.simple")); - cl_assert(i == 1); - - cl_git_pass(git_config_get_int64(&i, cfg, "number.k")); - cl_assert(i == 1 * 1024); - - cl_git_pass(git_config_get_int64(&i, cfg, "number.kk")); - cl_assert(i == 1 * 1024); - - cl_git_pass(git_config_get_int64(&i, cfg, "number.m")); - cl_assert(i == 1 * 1024 * 1024); - - cl_git_pass(git_config_get_int64(&i, cfg, "number.mm")); - cl_assert(i == 1 * 1024 * 1024); - - cl_git_pass(git_config_get_int64(&i, cfg, "number.g")); - cl_assert(i == 1 * 1024 * 1024 * 1024); - - cl_git_pass(git_config_get_int64(&i, cfg, "number.gg")); - cl_assert(i == 1 * 1024 * 1024 * 1024); - - git_config_free(cfg); -} - -void test_config_read__blank_lines(void) -{ - git_config *cfg; - int i; - - cl_git_pass(git_config_open_ondisk(&cfg, cl_fixture("config/config6"))); - - cl_git_pass(git_config_get_bool(&i, cfg, "valid.subsection.something")); - cl_assert(i == 1); - - cl_git_pass(git_config_get_bool(&i, cfg, "something.else.something")); - cl_assert(i == 0); - - git_config_free(cfg); -} - -void test_config_read__invalid_ext_headers(void) -{ - git_config *cfg; - cl_must_fail(git_config_open_ondisk(&cfg, cl_fixture("config/config7"))); -} - -void test_config_read__empty_files(void) -{ - git_config *cfg; - cl_git_pass(git_config_open_ondisk(&cfg, cl_fixture("config/config8"))); - git_config_free(cfg); -} - -void test_config_read__symbol_headers(void) -{ - git_config *cfg; - cl_git_pass(git_config_open_ondisk(&cfg, cl_fixture("config/config20"))); - git_config_free(cfg); -} - -void test_config_read__header_in_last_line(void) -{ - git_config *cfg; - - cl_git_pass(git_config_open_ondisk(&cfg, cl_fixture("config/config10"))); - git_config_free(cfg); -} - -void test_config_read__prefixes(void) -{ - git_config *cfg; - - cl_git_pass(git_config_open_ondisk(&cfg, cl_fixture("config/config9"))); - cl_git_pass(git_config_get_string_buf(&buf, cfg, "remote.ab.url")); - cl_assert_equal_s("http://example.com/git/ab", git_buf_cstr(&buf)); - git_buf_clear(&buf); - - cl_git_pass(git_config_get_string_buf(&buf, cfg, "remote.abba.url")); - cl_assert_equal_s("http://example.com/git/abba", git_buf_cstr(&buf)); - - git_config_free(cfg); -} - -void test_config_read__escaping_quotes(void) -{ - git_config *cfg; - - cl_git_pass(git_config_open_ondisk(&cfg, cl_fixture("config/config13"))); - cl_git_pass(git_config_get_string_buf(&buf, cfg, "core.editor")); - cl_assert_equal_s("\"C:/Program Files/Nonsense/bah.exe\" \"--some option\"", git_buf_cstr(&buf)); - - git_config_free(cfg); -} - -void test_config_read__invalid_escape_sequence(void) -{ - git_config *cfg; - - cl_set_cleanup(&clean_test_config, NULL); - cl_git_mkfile("./testconfig", "[header]\n key1 = \\\\\\;\n key2 = value2\n"); - cl_git_fail(git_config_open_ondisk(&cfg, "./testconfig")); - - git_config_free(cfg); -} - -static int count_cfg_entries_and_compare_levels( - const git_config_entry *entry, void *payload) -{ - int *count = payload; - - if (!strcmp(entry->value, "7") || !strcmp(entry->value, "17")) - cl_assert(entry->level == GIT_CONFIG_LEVEL_GLOBAL); - else - cl_assert(entry->level == GIT_CONFIG_LEVEL_SYSTEM); - - (*count)++; - return 0; -} - -static int cfg_callback_countdown(const git_config_entry *entry, void *payload) -{ - int *count = payload; - GIT_UNUSED(entry); - (*count)--; - if (*count == 0) - return -100; - return 0; -} - -void test_config_read__foreach(void) -{ - git_config *cfg; - int count, ret; - - cl_git_pass(git_config_new(&cfg)); - cl_git_pass(git_config_add_file_ondisk(cfg, cl_fixture("config/config9"), - GIT_CONFIG_LEVEL_SYSTEM, 0)); - cl_git_pass(git_config_add_file_ondisk(cfg, cl_fixture("config/config15"), - GIT_CONFIG_LEVEL_GLOBAL, 0)); - - count = 0; - cl_git_pass(git_config_foreach(cfg, count_cfg_entries_and_compare_levels, &count)); - cl_assert_equal_i(7, count); - - count = 3; - cl_git_fail(ret = git_config_foreach(cfg, cfg_callback_countdown, &count)); - cl_assert_equal_i(-100, ret); - - git_config_free(cfg); -} - -void test_config_read__iterator(void) -{ - git_config *cfg; - git_config_iterator *iter; - git_config_entry *entry; - int count, ret; - - cl_git_pass(git_config_new(&cfg)); - cl_git_pass(git_config_add_file_ondisk(cfg, cl_fixture("config/config9"), - GIT_CONFIG_LEVEL_SYSTEM, 0)); - cl_git_pass(git_config_add_file_ondisk(cfg, cl_fixture("config/config15"), - GIT_CONFIG_LEVEL_GLOBAL, 0)); - - count = 0; - cl_git_pass(git_config_iterator_new(&iter, cfg)); - - while ((ret = git_config_next(&entry, iter)) == 0) { - count++; - } - - git_config_iterator_free(iter); - cl_assert_equal_i(GIT_ITEROVER, ret); - cl_assert_equal_i(7, count); - - count = 3; - cl_git_pass(git_config_iterator_new(&iter, cfg)); - - git_config_iterator_free(iter); - git_config_free(cfg); -} - -static int count_cfg_entries(const git_config_entry *entry, void *payload) -{ - int *count = payload; - GIT_UNUSED(entry); - (*count)++; - return 0; -} - -void test_config_read__foreach_match(void) -{ - git_config *cfg; - int count; - - cl_git_pass(git_config_open_ondisk(&cfg, cl_fixture("config/config9"))); - - count = 0; - cl_git_pass( - git_config_foreach_match(cfg, "core.*", count_cfg_entries, &count)); - cl_assert_equal_i(3, count); - - count = 0; - cl_git_pass( - git_config_foreach_match(cfg, "remote\\.ab.*", count_cfg_entries, &count)); - cl_assert_equal_i(2, count); - - count = 0; - cl_git_pass( - git_config_foreach_match(cfg, ".*url$", count_cfg_entries, &count)); - cl_assert_equal_i(2, count); - - count = 0; - cl_git_pass( - git_config_foreach_match(cfg, ".*dummy.*", count_cfg_entries, &count)); - cl_assert_equal_i(2, count); - - count = 0; - cl_git_pass( - git_config_foreach_match(cfg, ".*nomatch.*", count_cfg_entries, &count)); - cl_assert_equal_i(0, count); - - git_config_free(cfg); -} - -static void check_glob_iter(git_config *cfg, const char *regexp, int expected) -{ - git_config_iterator *iter; - git_config_entry *entry; - int count, error; - - cl_git_pass(git_config_iterator_glob_new(&iter, cfg, regexp)); - - count = 0; - while ((error = git_config_next(&entry, iter)) == 0) - count++; - - cl_assert_equal_i(GIT_ITEROVER, error); - cl_assert_equal_i(expected, count); - git_config_iterator_free(iter); -} - -void test_config_read__iterator_invalid_glob(void) -{ - git_config *cfg; - git_config_iterator *iter; - - cl_git_pass(git_config_open_ondisk(&cfg, cl_fixture("config/config9"))); - - cl_git_fail(git_config_iterator_glob_new(&iter, cfg, "*")); - - git_config_free(cfg); -} - -void test_config_read__iterator_glob(void) -{ - git_config *cfg; - - cl_git_pass(git_config_open_ondisk(&cfg, cl_fixture("config/config9"))); - - check_glob_iter(cfg, "core.*", 3); - check_glob_iter(cfg, "remote\\.ab.*", 2); - check_glob_iter(cfg, ".*url$", 2); - check_glob_iter(cfg, ".*dummy.*", 2); - check_glob_iter(cfg, ".*nomatch.*", 0); - - git_config_free(cfg); -} - -void test_config_read__whitespace_not_required_around_assignment(void) -{ - git_config *cfg; - - cl_git_pass(git_config_open_ondisk(&cfg, cl_fixture("config/config14"))); - - cl_git_pass(git_config_get_string_buf(&buf, cfg, "a.b")); - cl_assert_equal_s("c", git_buf_cstr(&buf)); - git_buf_clear(&buf); - - cl_git_pass(git_config_get_string_buf(&buf, cfg, "d.e")); - cl_assert_equal_s("f", git_buf_cstr(&buf)); - - git_config_free(cfg); -} - -void test_config_read__read_git_config_entry(void) -{ - git_config *cfg; - git_config_entry *entry; - - cl_git_pass(git_config_new(&cfg)); - cl_git_pass(git_config_add_file_ondisk(cfg, cl_fixture("config/config9"), - GIT_CONFIG_LEVEL_SYSTEM, 0)); - - cl_git_pass(git_config_get_entry(&entry, cfg, "core.dummy2")); - cl_assert_equal_s("core.dummy2", entry->name); - cl_assert_equal_s("42", entry->value); - cl_assert_equal_i(GIT_CONFIG_LEVEL_SYSTEM, entry->level); - - git_config_entry_free(entry); - git_config_free(cfg); -} - -/* - * At the beginning of the test: - * - config9 has: core.dummy2=42 - * - config15 has: core.dummy2=7 - * - config16 has: core.dummy2=28 - */ -void test_config_read__local_config_overrides_global_config_overrides_system_config(void) -{ - git_config *cfg; - int32_t i; - - cl_git_pass(git_config_new(&cfg)); - cl_git_pass(git_config_add_file_ondisk(cfg, cl_fixture("config/config9"), - GIT_CONFIG_LEVEL_SYSTEM, 0)); - cl_git_pass(git_config_add_file_ondisk(cfg, cl_fixture("config/config15"), - GIT_CONFIG_LEVEL_GLOBAL, 0)); - cl_git_pass(git_config_add_file_ondisk(cfg, cl_fixture("config/config16"), - GIT_CONFIG_LEVEL_LOCAL, 0)); - - cl_git_pass(git_config_get_int32(&i, cfg, "core.dummy2")); - cl_assert_equal_i(28, i); - - git_config_free(cfg); - - cl_git_pass(git_config_new(&cfg)); - cl_git_pass(git_config_add_file_ondisk(cfg, cl_fixture("config/config9"), - GIT_CONFIG_LEVEL_SYSTEM, 0)); - cl_git_pass(git_config_add_file_ondisk(cfg, cl_fixture("config/config15"), - GIT_CONFIG_LEVEL_GLOBAL, 0)); - - cl_git_pass(git_config_get_int32(&i, cfg, "core.dummy2")); - cl_assert_equal_i(7, i); - - git_config_free(cfg); -} - -/* - * At the beginning of the test: - * - config9 has: core.global does not exist - * - config15 has: core.global=17 - * - config16 has: core.global=29 - * - * And also: - * - config9 has: core.system does not exist - * - config15 has: core.system does not exist - * - config16 has: core.system=11 - */ -void test_config_read__fallback_from_local_to_global_and_from_global_to_system(void) -{ - git_config *cfg; - int32_t i; - - cl_git_pass(git_config_new(&cfg)); - cl_git_pass(git_config_add_file_ondisk(cfg, cl_fixture("config/config9"), - GIT_CONFIG_LEVEL_SYSTEM, 0)); - cl_git_pass(git_config_add_file_ondisk(cfg, cl_fixture("config/config15"), - GIT_CONFIG_LEVEL_GLOBAL, 0)); - cl_git_pass(git_config_add_file_ondisk(cfg, cl_fixture("config/config16"), - GIT_CONFIG_LEVEL_LOCAL, 0)); - - cl_git_pass(git_config_get_int32(&i, cfg, "core.global")); - cl_assert_equal_i(17, i); - cl_git_pass(git_config_get_int32(&i, cfg, "core.system")); - cl_assert_equal_i(11, i); - - git_config_free(cfg); -} - -/* - * At the beginning of the test, config18 has: - * int32global = 28 - * int64global = 9223372036854775803 - * boolglobal = true - * stringglobal = I'm a global config value! - * - * And config19 has: - * int32global = -1 - * int64global = -2 - * boolglobal = false - * stringglobal = don't find me! - * - */ -void test_config_read__simple_read_from_specific_level(void) -{ - git_config *cfg, *cfg_specific; - int i; - int64_t l, expected = +9223372036854775803; - - cl_git_pass(git_config_new(&cfg)); - cl_git_pass(git_config_add_file_ondisk(cfg, cl_fixture("config/config18"), - GIT_CONFIG_LEVEL_GLOBAL, 0)); - cl_git_pass(git_config_add_file_ondisk(cfg, cl_fixture("config/config19"), - GIT_CONFIG_LEVEL_SYSTEM, 0)); - - cl_git_pass(git_config_open_level(&cfg_specific, cfg, GIT_CONFIG_LEVEL_GLOBAL)); - - cl_git_pass(git_config_get_int32(&i, cfg_specific, "core.int32global")); - cl_assert_equal_i(28, i); - cl_git_pass(git_config_get_int64(&l, cfg_specific, "core.int64global")); - cl_assert(l == expected); - cl_git_pass(git_config_get_bool(&i, cfg_specific, "core.boolglobal")); - cl_assert_equal_b(true, i); - cl_git_pass(git_config_get_string_buf(&buf, cfg_specific, "core.stringglobal")); - cl_assert_equal_s("I'm a global config value!", git_buf_cstr(&buf)); - - git_config_free(cfg_specific); - git_config_free(cfg); -} - -void test_config_read__can_load_and_parse_an_empty_config_file(void) -{ - git_config *cfg; - int i; - - cl_set_cleanup(&clean_test_config, NULL); - cl_git_mkfile("./testconfig", ""); - cl_git_pass(git_config_open_ondisk(&cfg, "./testconfig")); - cl_assert_equal_i(GIT_ENOTFOUND, git_config_get_int32(&i, cfg, "nope.neither")); - - git_config_free(cfg); -} - -void test_config_read__corrupt_header(void) -{ - git_config *cfg; - - cl_set_cleanup(&clean_test_config, NULL); - cl_git_mkfile("./testconfig", "[sneaky ] \"quoted closing quote mark\\\""); - cl_git_fail(git_config_open_ondisk(&cfg, "./testconfig")); - - git_config_free(cfg); -} - -void test_config_read__corrupt_header2(void) -{ - git_config *cfg; - - cl_set_cleanup(&clean_test_config, NULL); - cl_git_mkfile("./testconfig", "[unclosed \"bracket\"\n lib = git2\n"); - cl_git_fail(git_config_open_ondisk(&cfg, "./testconfig")); - - git_config_free(cfg); -} - -void test_config_read__corrupt_header3(void) -{ - git_config *cfg; - - cl_set_cleanup(&clean_test_config, NULL); - cl_git_mkfile("./testconfig", "[unclosed \"slash\\\"]\n lib = git2\n"); - cl_git_fail(git_config_open_ondisk(&cfg, "./testconfig")); - - git_config_free(cfg); -} - -void test_config_read__invalid_key_chars(void) -{ - git_config *cfg; - - cl_set_cleanup(&clean_test_config, NULL); - cl_git_mkfile("./testconfig", "[foo]\n has_underscore = git2\n"); - cl_git_fail(git_config_open_ondisk(&cfg, "./testconfig")); - - cl_git_rewritefile("./testconfig", "[foo]\n has/slash = git2\n"); - cl_git_fail(git_config_open_ondisk(&cfg, "./testconfig")); - - cl_git_rewritefile("./testconfig", "[foo]\n has+plus = git2\n"); - cl_git_fail(git_config_open_ondisk(&cfg, "./testconfig")); - - cl_git_rewritefile("./testconfig", "[no_key]\n = git2\n"); - cl_git_fail(git_config_open_ondisk(&cfg, "./testconfig")); - - git_config_free(cfg); -} - -void test_config_read__lone_variable_with_trailing_whitespace(void) -{ - git_config *cfg; - int b; - - cl_set_cleanup(&clean_test_config, NULL); - cl_git_mkfile("./testconfig", "[foo]\n lonevariable \n"); - cl_git_pass(git_config_open_ondisk(&cfg, "./testconfig")); - - cl_git_pass(git_config_get_bool(&b, cfg, "foo.lonevariable")); - cl_assert_equal_b(true, b); - - git_config_free(cfg); -} - -void test_config_read__override_variable(void) -{ - git_config *cfg; - - cl_set_cleanup(&clean_test_config, NULL); - cl_git_mkfile("./testconfig", "[some] var = one\nvar = two"); - cl_git_pass(git_config_open_ondisk(&cfg, "./testconfig")); - - cl_git_pass(git_config_get_string_buf(&buf, cfg, "some.var")); - cl_assert_equal_s("two", git_buf_cstr(&buf)); - - git_config_free(cfg); -} - -void test_config_read__path(void) -{ - git_config *cfg; - git_buf path = GIT_BUF_INIT; - git_buf old_path = GIT_BUF_INIT; - git_buf home_path = GIT_BUF_INIT; - git_buf expected_path = GIT_BUF_INIT; - - cl_git_pass(p_mkdir("fakehome", 0777)); - cl_git_pass(git_path_prettify(&home_path, "fakehome", NULL)); - cl_git_pass(git_libgit2_opts(GIT_OPT_GET_SEARCH_PATH, GIT_CONFIG_LEVEL_GLOBAL, &old_path)); - cl_git_pass(git_libgit2_opts(GIT_OPT_SET_SEARCH_PATH, GIT_CONFIG_LEVEL_GLOBAL, home_path.ptr)); - cl_git_mkfile("./testconfig", "[some]\n path = ~/somefile"); - cl_git_pass(git_path_join_unrooted(&expected_path, "somefile", home_path.ptr, NULL)); - - cl_git_pass(git_config_open_ondisk(&cfg, "./testconfig")); - cl_git_pass(git_config_get_path(&path, cfg, "some.path")); - cl_assert_equal_s(expected_path.ptr, path.ptr); - git_buf_free(&path); - - cl_git_mkfile("./testconfig", "[some]\n path = ~/"); - cl_git_pass(git_path_join_unrooted(&expected_path, "", home_path.ptr, NULL)); - - cl_git_pass(git_config_get_path(&path, cfg, "some.path")); - cl_assert_equal_s(expected_path.ptr, path.ptr); - git_buf_free(&path); - - cl_git_mkfile("./testconfig", "[some]\n path = ~"); - cl_git_pass(git_buf_sets(&expected_path, home_path.ptr)); - - cl_git_pass(git_config_get_path(&path, cfg, "some.path")); - cl_assert_equal_s(expected_path.ptr, path.ptr); - git_buf_free(&path); - - cl_git_mkfile("./testconfig", "[some]\n path = ~user/foo"); - cl_git_fail(git_config_get_path(&path, cfg, "some.path")); - - cl_git_pass(git_libgit2_opts(GIT_OPT_SET_SEARCH_PATH, GIT_CONFIG_LEVEL_GLOBAL, old_path.ptr)); - git_buf_free(&old_path); - git_buf_free(&home_path); - git_buf_free(&expected_path); - git_config_free(cfg); -} diff --git a/vendor/libgit2/tests/config/rename.c b/vendor/libgit2/tests/config/rename.c deleted file mode 100644 index a4614158a4..0000000000 --- a/vendor/libgit2/tests/config/rename.c +++ /dev/null @@ -1,89 +0,0 @@ -#include "clar_libgit2.h" -#include "config.h" - -static git_repository *g_repo = NULL; -static git_config *g_config = NULL; - -void test_config_rename__initialize(void) -{ - g_repo = cl_git_sandbox_init("testrepo.git"); - cl_git_pass(git_repository_config(&g_config, g_repo)); -} - -void test_config_rename__cleanup(void) -{ - git_config_free(g_config); - g_config = NULL; - - cl_git_sandbox_cleanup(); - g_repo = NULL; -} - -void test_config_rename__can_rename(void) -{ - git_config_entry *ce; - - cl_git_pass(git_config_get_entry( - &ce, g_config, "branch.track-local.remote")); - cl_assert_equal_s(".", ce->value); - git_config_entry_free(ce); - - cl_git_fail(git_config_get_entry( - &ce, g_config, "branch.local-track.remote")); - - cl_git_pass(git_config_rename_section( - g_repo, "branch.track-local", "branch.local-track")); - - cl_git_pass(git_config_get_entry( - &ce, g_config, "branch.local-track.remote")); - cl_assert_equal_s(".", ce->value); - git_config_entry_free(ce); - - cl_git_fail(git_config_get_entry( - &ce, g_config, "branch.track-local.remote")); -} - -void test_config_rename__prevent_overwrite(void) -{ - git_config_entry *ce; - - cl_git_pass(git_config_set_string( - g_config, "branch.local-track.remote", "yellow")); - - cl_git_pass(git_config_get_entry( - &ce, g_config, "branch.local-track.remote")); - cl_assert_equal_s("yellow", ce->value); - git_config_entry_free(ce); - - cl_git_pass(git_config_rename_section( - g_repo, "branch.track-local", "branch.local-track")); - - cl_git_pass(git_config_get_entry( - &ce, g_config, "branch.local-track.remote")); - cl_assert_equal_s(".", ce->value); - git_config_entry_free(ce); - - /* so, we don't currently prevent overwrite... */ - /* { - const git_error *err; - cl_assert((err = giterr_last()) != NULL); - cl_assert(err->message != NULL); - } */ -} - -static void assert_invalid_config_section_name( - git_repository *repo, const char *name) -{ - cl_git_fail_with( - git_config_rename_section(repo, "branch.remoteless", name), - GIT_EINVALIDSPEC); -} - -void test_config_rename__require_a_valid_new_name(void) -{ - assert_invalid_config_section_name(g_repo, ""); - assert_invalid_config_section_name(g_repo, "bra\nch"); - assert_invalid_config_section_name(g_repo, "branc#"); - assert_invalid_config_section_name(g_repo, "bra\nch.duh"); - assert_invalid_config_section_name(g_repo, "branc#.duh"); -} diff --git a/vendor/libgit2/tests/config/snapshot.c b/vendor/libgit2/tests/config/snapshot.c deleted file mode 100644 index 3ea07c1184..0000000000 --- a/vendor/libgit2/tests/config/snapshot.c +++ /dev/null @@ -1,78 +0,0 @@ -#include "clar_libgit2.h" - -void test_config_snapshot__create_snapshot(void) -{ - int32_t tmp; - git_config *cfg, *snapshot, *new_snapshot; - const char *filename = "config-ext-change"; - - cl_git_mkfile(filename, "[old]\nvalue = 5\n"); - - cl_git_pass(git_config_open_ondisk(&cfg, filename)); - - cl_git_pass(git_config_get_int32(&tmp, cfg, "old.value")); - cl_assert_equal_i(5, tmp); - - cl_git_pass(git_config_snapshot(&snapshot, cfg)); - - /* Change the value on the file itself (simulate external process) */ - cl_git_mkfile(filename, "[old]\nvalue = 56\n"); - - cl_git_pass(git_config_get_int32(&tmp, cfg, "old.value")); - cl_assert_equal_i(56, tmp); - - cl_git_pass(git_config_get_int32(&tmp, snapshot, "old.value")); - cl_assert_equal_i(5, tmp); - - /* Change the value on the file itself (simulate external process) */ - cl_git_mkfile(filename, "[old]\nvalue = 999\n"); - - cl_git_pass(git_config_snapshot(&new_snapshot, cfg)); - - /* New snapshot should see new value */ - cl_git_pass(git_config_get_int32(&tmp, new_snapshot, "old.value")); - cl_assert_equal_i(999, tmp); - - /* Old snapshot should still have the old value */ - cl_git_pass(git_config_get_int32(&tmp, snapshot, "old.value")); - cl_assert_equal_i(5, tmp); - - git_config_free(new_snapshot); - git_config_free(snapshot); - git_config_free(cfg); -} - -static int count_me(const git_config_entry *entry, void *payload) -{ - int *n = (int *) payload; - - GIT_UNUSED(entry); - - (*n)++; - - return 0; -} - -void test_config_snapshot__multivar(void) -{ - int count = 0; - git_config *cfg, *snapshot; - const char *filename = "config-file"; - - cl_git_mkfile(filename, "[old]\nvalue = 5\nvalue = 6\n"); - - cl_git_pass(git_config_open_ondisk(&cfg, filename)); - cl_git_pass(git_config_get_multivar_foreach(cfg, "old.value", NULL, count_me, &count)); - - cl_assert_equal_i(2, count); - - cl_git_pass(git_config_snapshot(&snapshot, cfg)); - git_config_free(cfg); - - count = 0; - cl_git_pass(git_config_get_multivar_foreach(snapshot, "old.value", NULL, count_me, &count)); - - cl_assert_equal_i(2, count); - - git_config_free(snapshot); -} diff --git a/vendor/libgit2/tests/config/stress.c b/vendor/libgit2/tests/config/stress.c deleted file mode 100644 index 503f44f033..0000000000 --- a/vendor/libgit2/tests/config/stress.c +++ /dev/null @@ -1,109 +0,0 @@ -#include "clar_libgit2.h" - -#include "filebuf.h" -#include "fileops.h" -#include "posix.h" - -#define TEST_CONFIG "git-test-config" - -static git_buf buf = GIT_BUF_INIT; - -void test_config_stress__initialize(void) -{ - git_filebuf file = GIT_FILEBUF_INIT; - - cl_git_pass(git_filebuf_open(&file, TEST_CONFIG, 0, 0666)); - - git_filebuf_printf(&file, "[color]\n\tui = auto\n"); - git_filebuf_printf(&file, "[core]\n\teditor = \n"); - - cl_git_pass(git_filebuf_commit(&file)); -} - -void test_config_stress__cleanup(void) -{ - git_buf_free(&buf); - p_unlink(TEST_CONFIG); -} - -void test_config_stress__dont_break_on_invalid_input(void) -{ - git_config *config; - - cl_assert(git_path_exists(TEST_CONFIG)); - cl_git_pass(git_config_open_ondisk(&config, TEST_CONFIG)); - - cl_git_pass(git_config_get_string_buf(&buf, config, "color.ui")); - cl_git_pass(git_config_get_string_buf(&buf, config, "core.editor")); - - git_config_free(config); -} - -void assert_config_value(git_config *config, const char *key, const char *value) -{ - git_buf_clear(&buf); - cl_git_pass(git_config_get_string_buf(&buf, config, key)); - cl_assert_equal_s(value, git_buf_cstr(&buf)); -} - -void test_config_stress__comments(void) -{ - git_config *config; - - cl_git_pass(git_config_open_ondisk(&config, cl_fixture("config/config12"))); - - assert_config_value(config, "some.section.test2", "hello"); - assert_config_value(config, "some.section.test3", "welcome"); - assert_config_value(config, "some.section.other", "hello! \" ; ; ; "); - assert_config_value(config, "some.section.other2", "cool! \" # # # "); - assert_config_value(config, "some.section.multi", "hi, this is a ; multiline comment # with ;\n special chars and other stuff !@#"); - assert_config_value(config, "some.section.multi2", "good, this is a ; multiline comment # with ;\n special chars and other stuff !@#"); - assert_config_value(config, "some.section.back", "this is \ba phrase"); - - git_config_free(config); -} - -void test_config_stress__escape_subsection_names(void) -{ - git_config *config; - - cl_assert(git_path_exists("git-test-config")); - cl_git_pass(git_config_open_ondisk(&config, TEST_CONFIG)); - - cl_git_pass(git_config_set_string(config, "some.sec\\tion.other", "foo")); - git_config_free(config); - - cl_git_pass(git_config_open_ondisk(&config, TEST_CONFIG)); - - assert_config_value(config, "some.sec\\tion.other", "foo"); - - git_config_free(config); -} - -void test_config_stress__trailing_backslash(void) -{ - git_config *config; - const char *path = "C:\\iam\\some\\windows\\path\\"; - - cl_assert(git_path_exists("git-test-config")); - cl_git_pass(git_config_open_ondisk(&config, TEST_CONFIG)); - cl_git_pass(git_config_set_string(config, "windows.path", path)); - git_config_free(config); - - cl_git_pass(git_config_open_ondisk(&config, TEST_CONFIG)); - assert_config_value(config, "windows.path", path); - - git_config_free(config); -} - -void test_config_stress__complex(void) -{ - git_config *config; - const char *path = "./config-immediate-multiline"; - - cl_git_mkfile(path, "[imm]\n multi = \"\\\nfoo\""); - cl_git_pass(git_config_open_ondisk(&config, path)); - assert_config_value(config, "imm.multi", "foo"); - - git_config_free(config); -} diff --git a/vendor/libgit2/tests/config/validkeyname.c b/vendor/libgit2/tests/config/validkeyname.c deleted file mode 100644 index 4b36509afe..0000000000 --- a/vendor/libgit2/tests/config/validkeyname.c +++ /dev/null @@ -1,49 +0,0 @@ -#include "clar_libgit2.h" - -#include "config.h" - -static git_config *cfg; - -void test_config_validkeyname__initialize(void) -{ - cl_fixture_sandbox("config/config10"); - - cl_git_pass(git_config_open_ondisk(&cfg, "config10")); -} - -void test_config_validkeyname__cleanup(void) -{ - git_config_free(cfg); - cfg = NULL; - - cl_fixture_cleanup("config10"); -} - -static void assert_invalid_config_key_name(const char *name) -{ - git_buf buf = GIT_BUF_INIT; - - cl_git_fail_with(git_config_get_string_buf(&buf, cfg, name), - GIT_EINVALIDSPEC); - cl_git_fail_with(git_config_set_string(cfg, name, "42"), - GIT_EINVALIDSPEC); - cl_git_fail_with(git_config_delete_entry(cfg, name), - GIT_EINVALIDSPEC); - cl_git_fail_with(git_config_get_multivar_foreach(cfg, name, "*", NULL, NULL), - GIT_EINVALIDSPEC); - cl_git_fail_with(git_config_set_multivar(cfg, name, "*", "42"), - GIT_EINVALIDSPEC); -} - -void test_config_validkeyname__accessing_requires_a_valid_name(void) -{ - assert_invalid_config_key_name(""); - assert_invalid_config_key_name("."); - assert_invalid_config_key_name(".."); - assert_invalid_config_key_name("core."); - assert_invalid_config_key_name("d#ff.dirstat.lines"); - assert_invalid_config_key_name("diff.dirstat.lines#"); - assert_invalid_config_key_name("dif\nf.dirstat.lines"); - assert_invalid_config_key_name("dif.dir\nstat.lines"); - assert_invalid_config_key_name("dif.dirstat.li\nes"); -} diff --git a/vendor/libgit2/tests/config/write.c b/vendor/libgit2/tests/config/write.c deleted file mode 100644 index 2e7b8182ac..0000000000 --- a/vendor/libgit2/tests/config/write.c +++ /dev/null @@ -1,632 +0,0 @@ -#include "clar_libgit2.h" -#include "buffer.h" -#include "fileops.h" - -void test_config_write__initialize(void) -{ - cl_fixture_sandbox("config/config9"); - cl_fixture_sandbox("config/config15"); - cl_fixture_sandbox("config/config17"); -} - -void test_config_write__cleanup(void) -{ - cl_fixture_cleanup("config9"); - cl_fixture_cleanup("config15"); - cl_fixture_cleanup("config17"); -} - -void test_config_write__replace_value(void) -{ - git_config *cfg; - int i; - int64_t l, expected = +9223372036854775803; - - /* By freeing the config, we make sure we flush the values */ - cl_git_pass(git_config_open_ondisk(&cfg, "config9")); - cl_git_pass(git_config_set_int32(cfg, "core.dummy", 5)); - git_config_free(cfg); - - cl_git_pass(git_config_open_ondisk(&cfg, "config9")); - cl_git_pass(git_config_get_int32(&i, cfg, "core.dummy")); - cl_assert(i == 5); - git_config_free(cfg); - - cl_git_pass(git_config_open_ondisk(&cfg, "config9")); - cl_git_pass(git_config_set_int32(cfg, "core.dummy", 1)); - git_config_free(cfg); - - cl_git_pass(git_config_open_ondisk(&cfg, "config9")); - cl_git_pass(git_config_set_int64(cfg, "core.verylong", expected)); - git_config_free(cfg); - - cl_git_pass(git_config_open_ondisk(&cfg, "config9")); - cl_git_pass(git_config_get_int64(&l, cfg, "core.verylong")); - cl_assert(l == expected); - git_config_free(cfg); - - cl_git_pass(git_config_open_ondisk(&cfg, "config9")); - cl_must_fail(git_config_get_int32(&i, cfg, "core.verylong")); - git_config_free(cfg); - - cl_git_pass(git_config_open_ondisk(&cfg, "config9")); - cl_git_pass(git_config_set_int64(cfg, "core.verylong", 1)); - git_config_free(cfg); -} - -void test_config_write__delete_value(void) -{ - git_config *cfg; - int32_t i; - - cl_git_pass(git_config_open_ondisk(&cfg, "config9")); - cl_git_pass(git_config_set_int32(cfg, "core.dummy", 5)); - git_config_free(cfg); - - cl_git_pass(git_config_open_ondisk(&cfg, "config9")); - cl_git_pass(git_config_delete_entry(cfg, "core.dummy")); - git_config_free(cfg); - - cl_git_pass(git_config_open_ondisk(&cfg, "config9")); - cl_assert(git_config_get_int32(&i, cfg, "core.dummy") == GIT_ENOTFOUND); - cl_git_pass(git_config_set_int32(cfg, "core.dummy", 1)); - git_config_free(cfg); -} - -/* - * At the beginning of the test: - * - config9 has: core.dummy2=42 - * - config15 has: core.dummy2=7 - */ -void test_config_write__delete_value_at_specific_level(void) -{ - git_config *cfg, *cfg_specific; - int32_t i; - - cl_git_pass(git_config_open_ondisk(&cfg, "config15")); - cl_git_pass(git_config_get_int32(&i, cfg, "core.dummy2")); - cl_assert(i == 7); - git_config_free(cfg); - - cl_git_pass(git_config_new(&cfg)); - cl_git_pass(git_config_add_file_ondisk(cfg, "config9", - GIT_CONFIG_LEVEL_LOCAL, 0)); - cl_git_pass(git_config_add_file_ondisk(cfg, "config15", - GIT_CONFIG_LEVEL_GLOBAL, 0)); - - cl_git_pass(git_config_open_level(&cfg_specific, cfg, GIT_CONFIG_LEVEL_GLOBAL)); - - cl_git_pass(git_config_delete_entry(cfg_specific, "core.dummy2")); - git_config_free(cfg); - - cl_git_pass(git_config_open_ondisk(&cfg, "config15")); - cl_assert(git_config_get_int32(&i, cfg, "core.dummy2") == GIT_ENOTFOUND); - cl_git_pass(git_config_set_int32(cfg, "core.dummy2", 7)); - - git_config_free(cfg_specific); - git_config_free(cfg); -} - -/* - * This test exposes a bug where duplicate empty section headers could prevent - * deletion of config entries. - */ -void test_config_write__delete_value_with_duplicate_header(void) -{ - const char *file_name = "config-duplicate-header"; - const char *entry_name = "remote.origin.url"; - git_config *cfg; - git_config_entry *entry; - - /* This config can occur after removing and re-adding the origin remote */ - const char *file_content = - "[remote \"origin\"]\n" \ - "[branch \"master\"]\n" \ - " remote = \"origin\"\n" \ - "[remote \"origin\"]\n" \ - " url = \"foo\"\n"; - - /* Write the test config and make sure the expected entry exists */ - cl_git_mkfile(file_name, file_content); - cl_git_pass(git_config_open_ondisk(&cfg, file_name)); - cl_git_pass(git_config_get_entry(&entry, cfg, entry_name)); - - /* Delete that entry */ - cl_git_pass(git_config_delete_entry(cfg, entry_name)); - - /* Reopen the file and make sure the entry no longer exists */ - git_config_entry_free(entry); - git_config_free(cfg); - cl_git_pass(git_config_open_ondisk(&cfg, file_name)); - cl_git_fail(git_config_get_entry(&entry, cfg, entry_name)); - - /* Cleanup */ - git_config_entry_free(entry); - git_config_free(cfg); -} - -/* - * This test exposes a bug where duplicate section headers could cause - * config_write to add a new entry when one already exists. - */ -void test_config_write__add_value_with_duplicate_header(void) -{ - const char *file_name = "config-duplicate-insert"; - const char *entry_name = "foo.c"; - const char *old_val = "old"; - const char *new_val = "new"; - const char *str; - git_config *cfg, *snapshot; - - /* c = old should be replaced by c = new. - * The bug causes c = new to be inserted under the first 'foo' header. - */ - const char *file_content = - "[foo]\n" \ - " a = b\n" \ - "[other]\n" \ - " a = b\n" \ - "[foo]\n" \ - " c = old\n"; - - /* Write the test config */ - cl_git_mkfile(file_name, file_content); - cl_git_pass(git_config_open_ondisk(&cfg, file_name)); - - /* make sure the expected entry (foo.c) exists */ - cl_git_pass(git_config_snapshot(&snapshot, cfg)); - cl_git_pass(git_config_get_string(&str, snapshot, entry_name)); - cl_assert_equal_s(old_val, str); - git_config_free(snapshot); - - /* Try setting foo.c to something else */ - cl_git_pass(git_config_set_string(cfg, entry_name, new_val)); - git_config_free(cfg); - - /* Reopen the file and make sure the new value was set */ - cl_git_pass(git_config_open_ondisk(&cfg, file_name)); - cl_git_pass(git_config_snapshot(&snapshot, cfg)); - cl_git_pass(git_config_get_string(&str, snapshot, entry_name)); - cl_assert_equal_s(new_val, str); - - /* Cleanup */ - git_config_free(snapshot); - git_config_free(cfg); -} - -void test_config_write__overwrite_value_with_duplicate_header(void) -{ - const char *file_name = "config-duplicate-header"; - const char *entry_name = "remote.origin.url"; - git_config *cfg; - git_config_entry *entry; - - /* This config can occur after removing and re-adding the origin remote */ - const char *file_content = - "[remote \"origin\"]\n" \ - "[branch \"master\"]\n" \ - " remote = \"origin\"\n" \ - "[remote \"origin\"]\n" \ - " url = \"foo\"\n"; - - /* Write the test config and make sure the expected entry exists */ - cl_git_mkfile(file_name, file_content); - cl_git_pass(git_config_open_ondisk(&cfg, file_name)); - cl_git_pass(git_config_get_entry(&entry, cfg, entry_name)); - - /* Update that entry */ - cl_git_pass(git_config_set_string(cfg, entry_name, "newurl")); - - /* Reopen the file and make sure the entry was updated */ - git_config_entry_free(entry); - git_config_free(cfg); - cl_git_pass(git_config_open_ondisk(&cfg, file_name)); - cl_git_pass(git_config_get_entry(&entry, cfg, entry_name)); - - cl_assert_equal_s("newurl", entry->value); - - /* Cleanup */ - git_config_entry_free(entry); - git_config_free(cfg); -} - -static int multivar_cb(const git_config_entry *entry, void *data) -{ - int *n = (int *)data; - - cl_assert_equal_s(entry->value, "newurl"); - - (*n)++; - - return 0; -} - -void test_config_write__overwrite_multivar_within_duplicate_header(void) -{ - const char *file_name = "config-duplicate-header"; - const char *entry_name = "remote.origin.url"; - git_config *cfg; - git_config_entry *entry; - int n = 0; - - /* This config can occur after removing and re-adding the origin remote */ - const char *file_content = - "[remote \"origin\"]\n" \ - " url = \"bar\"\n" \ - "[branch \"master\"]\n" \ - " remote = \"origin\"\n" \ - "[remote \"origin\"]\n" \ - " url = \"foo\"\n"; - - /* Write the test config and make sure the expected entry exists */ - cl_git_mkfile(file_name, file_content); - cl_git_pass(git_config_open_ondisk(&cfg, file_name)); - cl_git_pass(git_config_get_entry(&entry, cfg, entry_name)); - - /* Update that entry */ - cl_git_pass(git_config_set_multivar(cfg, entry_name, ".*", "newurl")); - git_config_entry_free(entry); - git_config_free(cfg); - - /* Reopen the file and make sure the entry was updated */ - cl_git_pass(git_config_open_ondisk(&cfg, file_name)); - cl_git_pass(git_config_get_multivar_foreach(cfg, entry_name, NULL, multivar_cb, &n)); - cl_assert_equal_i(2, n); - - /* Cleanup */ - git_config_free(cfg); -} - -void test_config_write__write_subsection(void) -{ - git_config *cfg; - git_buf buf = GIT_BUF_INIT; - - cl_git_pass(git_config_open_ondisk(&cfg, "config9")); - cl_git_pass(git_config_set_string(cfg, "my.own.var", "works")); - git_config_free(cfg); - - cl_git_pass(git_config_open_ondisk(&cfg, "config9")); - cl_git_pass(git_config_get_string_buf(&buf, cfg, "my.own.var")); - cl_assert_equal_s("works", git_buf_cstr(&buf)); - - git_buf_free(&buf); - git_config_free(cfg); -} - -void test_config_write__delete_inexistent(void) -{ - git_config *cfg; - - cl_git_pass(git_config_open_ondisk(&cfg, "config9")); - cl_assert(git_config_delete_entry(cfg, "core.imaginary") == GIT_ENOTFOUND); - git_config_free(cfg); -} - -void test_config_write__value_containing_quotes(void) -{ - git_config *cfg; - git_buf buf = GIT_BUF_INIT; - - cl_git_pass(git_config_open_ondisk(&cfg, "config9")); - cl_git_pass(git_config_set_string(cfg, "core.somevar", "this \"has\" quotes")); - cl_git_pass(git_config_get_string_buf(&buf, cfg, "core.somevar")); - cl_assert_equal_s("this \"has\" quotes", git_buf_cstr(&buf)); - git_buf_clear(&buf); - git_config_free(cfg); - - cl_git_pass(git_config_open_ondisk(&cfg, "config9")); - cl_git_pass(git_config_get_string_buf(&buf, cfg, "core.somevar")); - cl_assert_equal_s("this \"has\" quotes", git_buf_cstr(&buf)); - git_buf_clear(&buf); - git_config_free(cfg); - - /* The code path for values that already exist is different, check that one as well */ - cl_git_pass(git_config_open_ondisk(&cfg, "config9")); - cl_git_pass(git_config_set_string(cfg, "core.somevar", "this also \"has\" quotes")); - cl_git_pass(git_config_get_string_buf(&buf, cfg, "core.somevar")); - cl_assert_equal_s("this also \"has\" quotes", git_buf_cstr(&buf)); - git_buf_clear(&buf); - git_config_free(cfg); - - cl_git_pass(git_config_open_ondisk(&cfg, "config9")); - cl_git_pass(git_config_get_string_buf(&buf, cfg, "core.somevar")); - cl_assert_equal_s("this also \"has\" quotes", git_buf_cstr(&buf)); - git_buf_free(&buf); - git_config_free(cfg); -} - -void test_config_write__escape_value(void) -{ - git_config *cfg; - git_buf buf = GIT_BUF_INIT; - - cl_git_pass(git_config_open_ondisk(&cfg, "config9")); - cl_git_pass(git_config_set_string(cfg, "core.somevar", "this \"has\" quotes and \t")); - cl_git_pass(git_config_get_string_buf(&buf, cfg, "core.somevar")); - cl_assert_equal_s("this \"has\" quotes and \t", git_buf_cstr(&buf)); - git_buf_clear(&buf); - git_config_free(cfg); - - cl_git_pass(git_config_open_ondisk(&cfg, "config9")); - cl_git_pass(git_config_get_string_buf(&buf, cfg, "core.somevar")); - cl_assert_equal_s("this \"has\" quotes and \t", git_buf_cstr(&buf)); - git_buf_free(&buf); - git_config_free(cfg); -} - -void test_config_write__add_value_at_specific_level(void) -{ - git_config *cfg, *cfg_specific; - int i; - int64_t l, expected = +9223372036854775803; - git_buf buf = GIT_BUF_INIT; - - // open config15 as global level config file - cl_git_pass(git_config_new(&cfg)); - cl_git_pass(git_config_add_file_ondisk(cfg, "config9", - GIT_CONFIG_LEVEL_LOCAL, 0)); - cl_git_pass(git_config_add_file_ondisk(cfg, "config15", - GIT_CONFIG_LEVEL_GLOBAL, 0)); - - cl_git_pass(git_config_open_level(&cfg_specific, cfg, GIT_CONFIG_LEVEL_GLOBAL)); - - cl_git_pass(git_config_set_int32(cfg_specific, "core.int32global", 28)); - cl_git_pass(git_config_set_int64(cfg_specific, "core.int64global", expected)); - cl_git_pass(git_config_set_bool(cfg_specific, "core.boolglobal", true)); - cl_git_pass(git_config_set_string(cfg_specific, "core.stringglobal", "I'm a global config value!")); - git_config_free(cfg_specific); - git_config_free(cfg); - - // open config15 as local level config file - cl_git_pass(git_config_open_ondisk(&cfg, "config15")); - - cl_git_pass(git_config_get_int32(&i, cfg, "core.int32global")); - cl_assert_equal_i(28, i); - cl_git_pass(git_config_get_int64(&l, cfg, "core.int64global")); - cl_assert(l == expected); - cl_git_pass(git_config_get_bool(&i, cfg, "core.boolglobal")); - cl_assert_equal_b(true, i); - cl_git_pass(git_config_get_string_buf(&buf, cfg, "core.stringglobal")); - cl_assert_equal_s("I'm a global config value!", git_buf_cstr(&buf)); - - git_buf_free(&buf); - git_config_free(cfg); -} - -void test_config_write__add_value_at_file_with_no_clrf_at_the_end(void) -{ - git_config *cfg; - int i; - - cl_git_pass(git_config_open_ondisk(&cfg, "config17")); - cl_git_pass(git_config_set_int32(cfg, "core.newline", 7)); - git_config_free(cfg); - - cl_git_pass(git_config_open_ondisk(&cfg, "config17")); - cl_git_pass(git_config_get_int32(&i, cfg, "core.newline")); - cl_assert_equal_i(7, i); - - git_config_free(cfg); -} - -void test_config_write__add_section_at_file_with_no_clrf_at_the_end(void) -{ - git_config *cfg; - int i; - - cl_git_pass(git_config_open_ondisk(&cfg, "config17")); - cl_git_pass(git_config_set_int32(cfg, "diff.context", 10)); - git_config_free(cfg); - - cl_git_pass(git_config_open_ondisk(&cfg, "config17")); - cl_git_pass(git_config_get_int32(&i, cfg, "diff.context")); - cl_assert_equal_i(10, i); - - git_config_free(cfg); -} - -void test_config_write__add_value_which_needs_quotes(void) -{ - git_config *cfg, *base; - const char* str1; - const char* str2; - const char* str3; - const char* str4; - const char* str5; - - cl_git_pass(git_config_open_ondisk(&cfg, "config17")); - cl_git_pass(git_config_set_string(cfg, "core.startwithspace", " Something")); - cl_git_pass(git_config_set_string(cfg, "core.endwithspace", "Something ")); - cl_git_pass(git_config_set_string(cfg, "core.containscommentchar1", "some#thing")); - cl_git_pass(git_config_set_string(cfg, "core.containscommentchar2", "some;thing")); - cl_git_pass(git_config_set_string(cfg, "core.startwhithsapceandcontainsdoublequote", " some\"thing")); - git_config_free(cfg); - - cl_git_pass(git_config_open_ondisk(&base, "config17")); - cl_git_pass(git_config_snapshot(&cfg, base)); - cl_git_pass(git_config_get_string(&str1, cfg, "core.startwithspace")); - cl_assert_equal_s(" Something", str1); - cl_git_pass(git_config_get_string(&str2, cfg, "core.endwithspace")); - cl_assert_equal_s("Something ", str2); - cl_git_pass(git_config_get_string(&str3, cfg, "core.containscommentchar1")); - cl_assert_equal_s("some#thing", str3); - cl_git_pass(git_config_get_string(&str4, cfg, "core.containscommentchar2")); - cl_assert_equal_s("some;thing", str4); - cl_git_pass(git_config_get_string(&str5, cfg, "core.startwhithsapceandcontainsdoublequote")); - cl_assert_equal_s(" some\"thing", str5); - git_config_free(cfg); - git_config_free(base); -} - -void test_config_write__can_set_a_value_to_NULL(void) -{ - git_repository *repository; - git_config *config; - - repository = cl_git_sandbox_init("testrepo.git"); - - cl_git_pass(git_repository_config(&config, repository)); - cl_git_fail(git_config_set_string(config, "a.b.c", NULL)); - git_config_free(config); - - cl_git_sandbox_cleanup(); -} - -void test_config_write__can_set_an_empty_value(void) -{ - git_repository *repository; - git_config *config; - git_buf buf = {0}; - - repository = cl_git_sandbox_init("testrepo.git"); - cl_git_pass(git_repository_config(&config, repository)); - - cl_git_pass(git_config_set_string(config, "core.somevar", "")); - cl_git_pass(git_config_get_string_buf(&buf, config, "core.somevar")); - cl_assert_equal_s("", buf.ptr); - - git_buf_free(&buf); - git_config_free(config); - cl_git_sandbox_cleanup(); -} - -void test_config_write__updating_a_locked_config_file_returns_ELOCKED(void) -{ - git_config *cfg; - - cl_git_pass(git_config_open_ondisk(&cfg, "config9")); - - cl_git_mkfile("config9.lock", "[core]\n"); - - cl_git_fail_with(git_config_set_string(cfg, "core.dump", "boom"), GIT_ELOCKED); - - git_config_free(cfg); -} - -void test_config_write__outside_change(void) -{ - int32_t tmp; - git_config *cfg; - const char *filename = "config-ext-change"; - - cl_git_mkfile(filename, "[old]\nvalue = 5\n"); - - cl_git_pass(git_config_open_ondisk(&cfg, filename)); - - cl_git_pass(git_config_get_int32(&tmp, cfg, "old.value")); - - /* Change the value on the file itself (simulate external process) */ - cl_git_mkfile(filename, "[old]\nvalue = 6\n"); - - cl_git_pass(git_config_set_int32(cfg, "new.value", 7)); - - cl_git_pass(git_config_get_int32(&tmp, cfg, "old.value")); - cl_assert_equal_i(6, tmp); - - git_config_free(cfg); -} - -#define SECTION_FOO \ - "\n" \ - " \n" \ - " [section \"foo\"] \n" \ - " # here's a comment\n" \ - "\tname = \"value\"\n" \ - " name2 = \"value2\"\n" \ - "; another comment!\n" - -#define SECTION_BAR \ - "[section \"bar\"]\t\n" \ - "\t \n" \ - " barname=\"value\"\n" - - -void test_config_write__preserves_whitespace_and_comments(void) -{ - const char *file_name = "config-duplicate-header"; - const char *n; - git_config *cfg; - git_buf newfile = GIT_BUF_INIT; - - /* This config can occur after removing and re-adding the origin remote */ - const char *file_content = SECTION_FOO SECTION_BAR; - - /* Write the test config and make sure the expected entry exists */ - cl_git_mkfile(file_name, file_content); - cl_git_pass(git_config_open_ondisk(&cfg, file_name)); - cl_git_pass(git_config_set_string(cfg, "section.foo.other", "otherval")); - cl_git_pass(git_config_set_string(cfg, "newsection.newname", "new_value")); - - /* Ensure that we didn't needlessly mangle the config file */ - cl_git_pass(git_futils_readbuffer(&newfile, file_name)); - n = newfile.ptr; - - cl_assert_equal_strn(SECTION_FOO, n, strlen(SECTION_FOO)); - n += strlen(SECTION_FOO); - - cl_assert_equal_strn("\tother = otherval\n", n, strlen("\tother = otherval\n")); - n += strlen("\tother = otherval\n"); - - cl_assert_equal_strn(SECTION_BAR, n, strlen(SECTION_BAR)); - n += strlen(SECTION_BAR); - - cl_assert_equal_s("[newsection]\n\tnewname = new_value\n", n); - - git_buf_free(&newfile); - git_config_free(cfg); -} - -void test_config_write__preserves_entry_with_name_only(void) -{ - const char *file_name = "config-empty-value"; - git_config *cfg; - git_buf newfile = GIT_BUF_INIT; - - /* Write the test config and make sure the expected entry exists */ - cl_git_mkfile(file_name, "[section \"foo\"]\n\tname\n"); - cl_git_pass(git_config_open_ondisk(&cfg, file_name)); - cl_git_pass(git_config_set_string(cfg, "newsection.newname", "new_value")); - cl_git_pass(git_config_set_string(cfg, "section.foo.other", "otherval")); - - cl_git_pass(git_futils_readbuffer(&newfile, file_name)); - cl_assert_equal_s("[section \"foo\"]\n\tname\n\tother = otherval\n[newsection]\n\tnewname = new_value\n", newfile.ptr); - - git_buf_free(&newfile); - git_config_free(cfg); -} - -void test_config_write__to_empty_file(void) -{ - git_config *cfg; - const char *filename = "config-file"; - git_buf result = GIT_BUF_INIT; - - cl_git_mkfile(filename, ""); - cl_git_pass(git_config_open_ondisk(&cfg, filename)); - cl_git_pass(git_config_set_string(cfg, "section.name", "value")); - git_config_free(cfg); - - cl_git_pass(git_futils_readbuffer(&result, "config-file")); - cl_assert_equal_s("[section]\n\tname = value\n", result.ptr); - - git_buf_free(&result); -} - -void test_config_write__to_file_with_only_comment(void) -{ - git_config *cfg; - const char *filename = "config-file"; - git_buf result = GIT_BUF_INIT; - - cl_git_mkfile(filename, "\n\n"); - cl_git_pass(git_config_open_ondisk(&cfg, filename)); - cl_git_pass(git_config_set_string(cfg, "section.name", "value")); - git_config_free(cfg); - - cl_git_pass(git_futils_readbuffer(&result, "config-file")); - cl_assert_equal_s("\n\n[section]\n\tname = value\n", result.ptr); - - git_buf_free(&result); -} - diff --git a/vendor/libgit2/tests/core/bitvec.c b/vendor/libgit2/tests/core/bitvec.c deleted file mode 100644 index 48d7b99f09..0000000000 --- a/vendor/libgit2/tests/core/bitvec.c +++ /dev/null @@ -1,64 +0,0 @@ -#include "clar_libgit2.h" -#include "bitvec.h" - -#if 0 -static void print_bitvec(git_bitvec *bv) -{ - int b; - - if (!bv->length) { - for (b = 63; b >= 0; --b) - fprintf(stderr, "%d", (bv->u.bits & (1ul << b)) ? 1 : 0); - } else { - for (b = bv->length * 8; b >= 0; --b) - fprintf(stderr, "%d", (bv->u.ptr[b >> 3] & (b & 0x0ff)) ? 1 : 0); - } - fprintf(stderr, "\n"); -} -#endif - -static void set_some_bits(git_bitvec *bv, size_t length) -{ - size_t i; - - for (i = 0; i < length; ++i) { - if (i % 3 == 0 || i % 7 == 0) - git_bitvec_set(bv, i, true); - } -} - -static void check_some_bits(git_bitvec *bv, size_t length) -{ - size_t i; - - for (i = 0; i < length; ++i) - cl_assert_equal_b(i % 3 == 0 || i % 7 == 0, git_bitvec_get(bv, i)); -} - -void test_core_bitvec__0(void) -{ - git_bitvec bv; - - cl_git_pass(git_bitvec_init(&bv, 32)); - set_some_bits(&bv, 16); - check_some_bits(&bv, 16); - git_bitvec_clear(&bv); - set_some_bits(&bv, 32); - check_some_bits(&bv, 32); - git_bitvec_clear(&bv); - set_some_bits(&bv, 64); - check_some_bits(&bv, 64); - git_bitvec_free(&bv); - - cl_git_pass(git_bitvec_init(&bv, 128)); - set_some_bits(&bv, 32); - check_some_bits(&bv, 32); - set_some_bits(&bv, 128); - check_some_bits(&bv, 128); - git_bitvec_free(&bv); - - cl_git_pass(git_bitvec_init(&bv, 4000)); - set_some_bits(&bv, 4000); - check_some_bits(&bv, 4000); - git_bitvec_free(&bv); -} diff --git a/vendor/libgit2/tests/core/buffer.c b/vendor/libgit2/tests/core/buffer.c deleted file mode 100644 index 0e7026a9c1..0000000000 --- a/vendor/libgit2/tests/core/buffer.c +++ /dev/null @@ -1,1168 +0,0 @@ -#include "clar_libgit2.h" -#include "buffer.h" -#include "buf_text.h" -#include "git2/sys/hashsig.h" -#include "fileops.h" - -#define TESTSTR "Have you seen that? Have you seeeen that??" -const char *test_string = TESTSTR; -const char *test_string_x2 = TESTSTR TESTSTR; - -#define TESTSTR_4096 REP1024("1234") -#define TESTSTR_8192 REP1024("12341234") -const char *test_4096 = TESTSTR_4096; -const char *test_8192 = TESTSTR_8192; - -/* test basic data concatenation */ -void test_core_buffer__0(void) -{ - git_buf buf = GIT_BUF_INIT; - - cl_assert(buf.size == 0); - - git_buf_puts(&buf, test_string); - cl_assert(git_buf_oom(&buf) == 0); - cl_assert_equal_s(test_string, git_buf_cstr(&buf)); - - git_buf_puts(&buf, test_string); - cl_assert(git_buf_oom(&buf) == 0); - cl_assert_equal_s(test_string_x2, git_buf_cstr(&buf)); - - git_buf_free(&buf); -} - -/* test git_buf_printf */ -void test_core_buffer__1(void) -{ - git_buf buf = GIT_BUF_INIT; - - git_buf_printf(&buf, "%s %s %d ", "shoop", "da", 23); - cl_assert(git_buf_oom(&buf) == 0); - cl_assert_equal_s("shoop da 23 ", git_buf_cstr(&buf)); - - git_buf_printf(&buf, "%s %d", "woop", 42); - cl_assert(git_buf_oom(&buf) == 0); - cl_assert_equal_s("shoop da 23 woop 42", git_buf_cstr(&buf)); - - git_buf_free(&buf); -} - -/* more thorough test of concatenation options */ -void test_core_buffer__2(void) -{ - git_buf buf = GIT_BUF_INIT; - int i; - char data[128]; - - cl_assert(buf.size == 0); - - /* this must be safe to do */ - git_buf_free(&buf); - cl_assert(buf.size == 0); - cl_assert(buf.asize == 0); - - /* empty buffer should be empty string */ - cl_assert_equal_s("", git_buf_cstr(&buf)); - cl_assert(buf.size == 0); - /* cl_assert(buf.asize == 0); -- should not assume what git_buf does */ - - /* free should set us back to the beginning */ - git_buf_free(&buf); - cl_assert(buf.size == 0); - cl_assert(buf.asize == 0); - - /* add letter */ - git_buf_putc(&buf, '+'); - cl_assert(git_buf_oom(&buf) == 0); - cl_assert_equal_s("+", git_buf_cstr(&buf)); - - /* add letter again */ - git_buf_putc(&buf, '+'); - cl_assert(git_buf_oom(&buf) == 0); - cl_assert_equal_s("++", git_buf_cstr(&buf)); - - /* let's try that a few times */ - for (i = 0; i < 16; ++i) { - git_buf_putc(&buf, '+'); - cl_assert(git_buf_oom(&buf) == 0); - } - cl_assert_equal_s("++++++++++++++++++", git_buf_cstr(&buf)); - - git_buf_free(&buf); - - /* add data */ - git_buf_put(&buf, "xo", 2); - cl_assert(git_buf_oom(&buf) == 0); - cl_assert_equal_s("xo", git_buf_cstr(&buf)); - - /* add letter again */ - git_buf_put(&buf, "xo", 2); - cl_assert(git_buf_oom(&buf) == 0); - cl_assert_equal_s("xoxo", git_buf_cstr(&buf)); - - /* let's try that a few times */ - for (i = 0; i < 16; ++i) { - git_buf_put(&buf, "xo", 2); - cl_assert(git_buf_oom(&buf) == 0); - } - cl_assert_equal_s("xoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxo", - git_buf_cstr(&buf)); - - git_buf_free(&buf); - - /* set to string */ - git_buf_sets(&buf, test_string); - cl_assert(git_buf_oom(&buf) == 0); - cl_assert_equal_s(test_string, git_buf_cstr(&buf)); - - /* append string */ - git_buf_puts(&buf, test_string); - cl_assert(git_buf_oom(&buf) == 0); - cl_assert_equal_s(test_string_x2, git_buf_cstr(&buf)); - - /* set to string again (should overwrite - not append) */ - git_buf_sets(&buf, test_string); - cl_assert(git_buf_oom(&buf) == 0); - cl_assert_equal_s(test_string, git_buf_cstr(&buf)); - - /* test clear */ - git_buf_clear(&buf); - cl_assert_equal_s("", git_buf_cstr(&buf)); - - git_buf_free(&buf); - - /* test extracting data into buffer */ - git_buf_puts(&buf, REP4("0123456789")); - cl_assert(git_buf_oom(&buf) == 0); - - git_buf_copy_cstr(data, sizeof(data), &buf); - cl_assert_equal_s(REP4("0123456789"), data); - git_buf_copy_cstr(data, 11, &buf); - cl_assert_equal_s("0123456789", data); - git_buf_copy_cstr(data, 3, &buf); - cl_assert_equal_s("01", data); - git_buf_copy_cstr(data, 1, &buf); - cl_assert_equal_s("", data); - - git_buf_copy_cstr(data, sizeof(data), &buf); - cl_assert_equal_s(REP4("0123456789"), data); - - git_buf_sets(&buf, REP256("x")); - git_buf_copy_cstr(data, sizeof(data), &buf); - /* since sizeof(data) == 128, only 127 bytes should be copied */ - cl_assert_equal_s(REP4(REP16("x")) REP16("x") REP16("x") - REP16("x") "xxxxxxxxxxxxxxx", data); - - git_buf_free(&buf); - - git_buf_copy_cstr(data, sizeof(data), &buf); - cl_assert_equal_s("", data); -} - -/* let's do some tests with larger buffers to push our limits */ -void test_core_buffer__3(void) -{ - git_buf buf = GIT_BUF_INIT; - - /* set to string */ - git_buf_set(&buf, test_4096, 4096); - cl_assert(git_buf_oom(&buf) == 0); - cl_assert_equal_s(test_4096, git_buf_cstr(&buf)); - - /* append string */ - git_buf_puts(&buf, test_4096); - cl_assert(git_buf_oom(&buf) == 0); - cl_assert_equal_s(test_8192, git_buf_cstr(&buf)); - - /* set to string again (should overwrite - not append) */ - git_buf_set(&buf, test_4096, 4096); - cl_assert(git_buf_oom(&buf) == 0); - cl_assert_equal_s(test_4096, git_buf_cstr(&buf)); - - git_buf_free(&buf); -} - -/* let's try some producer/consumer tests */ -void test_core_buffer__4(void) -{ - git_buf buf = GIT_BUF_INIT; - int i; - - for (i = 0; i < 10; ++i) { - git_buf_puts(&buf, "1234"); /* add 4 */ - cl_assert(git_buf_oom(&buf) == 0); - git_buf_consume(&buf, buf.ptr + 2); /* eat the first two */ - cl_assert(strlen(git_buf_cstr(&buf)) == (size_t)((i + 1) * 2)); - } - /* we have appended 1234 10x and removed the first 20 letters */ - cl_assert_equal_s("12341234123412341234", git_buf_cstr(&buf)); - - git_buf_consume(&buf, NULL); - cl_assert_equal_s("12341234123412341234", git_buf_cstr(&buf)); - - git_buf_consume(&buf, "invalid pointer"); - cl_assert_equal_s("12341234123412341234", git_buf_cstr(&buf)); - - git_buf_consume(&buf, buf.ptr); - cl_assert_equal_s("12341234123412341234", git_buf_cstr(&buf)); - - git_buf_consume(&buf, buf.ptr + 1); - cl_assert_equal_s("2341234123412341234", git_buf_cstr(&buf)); - - git_buf_consume(&buf, buf.ptr + buf.size); - cl_assert_equal_s("", git_buf_cstr(&buf)); - - git_buf_free(&buf); -} - - -static void -check_buf_append( - const char* data_a, - const char* data_b, - const char* expected_data, - size_t expected_size, - size_t expected_asize) -{ - git_buf tgt = GIT_BUF_INIT; - - git_buf_sets(&tgt, data_a); - cl_assert(git_buf_oom(&tgt) == 0); - git_buf_puts(&tgt, data_b); - cl_assert(git_buf_oom(&tgt) == 0); - cl_assert_equal_s(expected_data, git_buf_cstr(&tgt)); - cl_assert(tgt.size == expected_size); - if (expected_asize > 0) - cl_assert(tgt.asize == expected_asize); - - git_buf_free(&tgt); -} - -static void -check_buf_append_abc( - const char* buf_a, - const char* buf_b, - const char* buf_c, - const char* expected_ab, - const char* expected_abc, - const char* expected_abca, - const char* expected_abcab, - const char* expected_abcabc) -{ - git_buf buf = GIT_BUF_INIT; - - git_buf_sets(&buf, buf_a); - cl_assert(git_buf_oom(&buf) == 0); - cl_assert_equal_s(buf_a, git_buf_cstr(&buf)); - - git_buf_puts(&buf, buf_b); - cl_assert(git_buf_oom(&buf) == 0); - cl_assert_equal_s(expected_ab, git_buf_cstr(&buf)); - - git_buf_puts(&buf, buf_c); - cl_assert(git_buf_oom(&buf) == 0); - cl_assert_equal_s(expected_abc, git_buf_cstr(&buf)); - - git_buf_puts(&buf, buf_a); - cl_assert(git_buf_oom(&buf) == 0); - cl_assert_equal_s(expected_abca, git_buf_cstr(&buf)); - - git_buf_puts(&buf, buf_b); - cl_assert(git_buf_oom(&buf) == 0); - cl_assert_equal_s(expected_abcab, git_buf_cstr(&buf)); - - git_buf_puts(&buf, buf_c); - cl_assert(git_buf_oom(&buf) == 0); - cl_assert_equal_s(expected_abcabc, git_buf_cstr(&buf)); - - git_buf_free(&buf); -} - -/* more variations on append tests */ -void test_core_buffer__5(void) -{ - check_buf_append("", "", "", 0, 0); - check_buf_append("a", "", "a", 1, 0); - check_buf_append("", "a", "a", 1, 8); - check_buf_append("", "a", "a", 1, 8); - check_buf_append("a", "b", "ab", 2, 8); - check_buf_append("", "abcdefgh", "abcdefgh", 8, 16); - check_buf_append("abcdefgh", "", "abcdefgh", 8, 16); - - /* buffer with starting asize will grow to: - * 1 -> 2, 2 -> 3, 3 -> 5, 4 -> 6, 5 -> 8, 6 -> 9, - * 7 -> 11, 8 -> 12, 9 -> 14, 10 -> 15, 11 -> 17, 12 -> 18, - * 13 -> 20, 14 -> 21, 15 -> 23, 16 -> 24, 17 -> 26, 18 -> 27, - * 19 -> 29, 20 -> 30, 21 -> 32, 22 -> 33, 23 -> 35, 24 -> 36, - * ... - * follow sequence until value > target size, - * then round up to nearest multiple of 8. - */ - - check_buf_append("abcdefgh", "/", "abcdefgh/", 9, 16); - check_buf_append("abcdefgh", "ijklmno", "abcdefghijklmno", 15, 16); - check_buf_append("abcdefgh", "ijklmnop", "abcdefghijklmnop", 16, 24); - check_buf_append("0123456789", "0123456789", - "01234567890123456789", 20, 24); - check_buf_append(REP16("x"), REP16("o"), - REP16("x") REP16("o"), 32, 40); - - check_buf_append(test_4096, "", test_4096, 4096, 4104); - check_buf_append(test_4096, test_4096, test_8192, 8192, 9240); - - /* check sequences of appends */ - check_buf_append_abc("a", "b", "c", - "ab", "abc", "abca", "abcab", "abcabc"); - check_buf_append_abc("a1", "b2", "c3", - "a1b2", "a1b2c3", "a1b2c3a1", - "a1b2c3a1b2", "a1b2c3a1b2c3"); - check_buf_append_abc("a1/", "b2/", "c3/", - "a1/b2/", "a1/b2/c3/", "a1/b2/c3/a1/", - "a1/b2/c3/a1/b2/", "a1/b2/c3/a1/b2/c3/"); -} - -/* test swap */ -void test_core_buffer__6(void) -{ - git_buf a = GIT_BUF_INIT; - git_buf b = GIT_BUF_INIT; - - git_buf_sets(&a, "foo"); - cl_assert(git_buf_oom(&a) == 0); - git_buf_sets(&b, "bar"); - cl_assert(git_buf_oom(&b) == 0); - - cl_assert_equal_s("foo", git_buf_cstr(&a)); - cl_assert_equal_s("bar", git_buf_cstr(&b)); - - git_buf_swap(&a, &b); - - cl_assert_equal_s("bar", git_buf_cstr(&a)); - cl_assert_equal_s("foo", git_buf_cstr(&b)); - - git_buf_free(&a); - git_buf_free(&b); -} - - -/* test detach/attach data */ -void test_core_buffer__7(void) -{ - const char *fun = "This is fun"; - git_buf a = GIT_BUF_INIT; - char *b = NULL; - - git_buf_sets(&a, "foo"); - cl_assert(git_buf_oom(&a) == 0); - cl_assert_equal_s("foo", git_buf_cstr(&a)); - - b = git_buf_detach(&a); - - cl_assert_equal_s("foo", b); - cl_assert_equal_s("", a.ptr); - git__free(b); - - b = git_buf_detach(&a); - - cl_assert_equal_s(NULL, b); - cl_assert_equal_s("", a.ptr); - - git_buf_free(&a); - - b = git__strdup(fun); - git_buf_attach(&a, b, 0); - - cl_assert_equal_s(fun, a.ptr); - cl_assert(a.size == strlen(fun)); - cl_assert(a.asize == strlen(fun) + 1); - - git_buf_free(&a); - - b = git__strdup(fun); - git_buf_attach(&a, b, strlen(fun) + 1); - - cl_assert_equal_s(fun, a.ptr); - cl_assert(a.size == strlen(fun)); - cl_assert(a.asize == strlen(fun) + 1); - - git_buf_free(&a); -} - - -static void -check_joinbuf_2( - const char *a, - const char *b, - const char *expected) -{ - char sep = '/'; - git_buf buf = GIT_BUF_INIT; - - git_buf_join(&buf, sep, a, b); - cl_assert(git_buf_oom(&buf) == 0); - cl_assert_equal_s(expected, git_buf_cstr(&buf)); - git_buf_free(&buf); -} - -static void -check_joinbuf_overlapped( - const char *oldval, - int ofs_a, - const char *b, - const char *expected) -{ - char sep = '/'; - git_buf buf = GIT_BUF_INIT; - - git_buf_sets(&buf, oldval); - git_buf_join(&buf, sep, buf.ptr + ofs_a, b); - cl_assert(git_buf_oom(&buf) == 0); - cl_assert_equal_s(expected, git_buf_cstr(&buf)); - git_buf_free(&buf); -} - -static void -check_joinbuf_n_2( - const char *a, - const char *b, - const char *expected) -{ - char sep = '/'; - git_buf buf = GIT_BUF_INIT; - - git_buf_sets(&buf, a); - cl_assert(git_buf_oom(&buf) == 0); - - git_buf_join_n(&buf, sep, 1, b); - cl_assert(git_buf_oom(&buf) == 0); - cl_assert_equal_s(expected, git_buf_cstr(&buf)); - - git_buf_free(&buf); -} - -static void -check_joinbuf_n_4( - const char *a, - const char *b, - const char *c, - const char *d, - const char *expected) -{ - char sep = ';'; - git_buf buf = GIT_BUF_INIT; - git_buf_join_n(&buf, sep, 4, a, b, c, d); - cl_assert(git_buf_oom(&buf) == 0); - cl_assert_equal_s(expected, git_buf_cstr(&buf)); - git_buf_free(&buf); -} - -/* test join */ -void test_core_buffer__8(void) -{ - git_buf a = GIT_BUF_INIT; - - git_buf_join_n(&a, '/', 1, "foo"); - cl_assert(git_buf_oom(&a) == 0); - cl_assert_equal_s("foo", git_buf_cstr(&a)); - - git_buf_join_n(&a, '/', 1, "bar"); - cl_assert(git_buf_oom(&a) == 0); - cl_assert_equal_s("foo/bar", git_buf_cstr(&a)); - - git_buf_join_n(&a, '/', 1, "baz"); - cl_assert(git_buf_oom(&a) == 0); - cl_assert_equal_s("foo/bar/baz", git_buf_cstr(&a)); - - git_buf_free(&a); - - check_joinbuf_2(NULL, "", ""); - check_joinbuf_2(NULL, "a", "a"); - check_joinbuf_2(NULL, "/a", "/a"); - check_joinbuf_2("", "", ""); - check_joinbuf_2("", "a", "a"); - check_joinbuf_2("", "/a", "/a"); - check_joinbuf_2("a", "", "a/"); - check_joinbuf_2("a", "/", "a/"); - check_joinbuf_2("a", "b", "a/b"); - check_joinbuf_2("/", "a", "/a"); - check_joinbuf_2("/", "", "/"); - check_joinbuf_2("/a", "/b", "/a/b"); - check_joinbuf_2("/a", "/b/", "/a/b/"); - check_joinbuf_2("/a/", "b/", "/a/b/"); - check_joinbuf_2("/a/", "/b/", "/a/b/"); - check_joinbuf_2("/a/", "//b/", "/a/b/"); - check_joinbuf_2("/abcd", "/defg", "/abcd/defg"); - check_joinbuf_2("/abcd", "/defg/", "/abcd/defg/"); - check_joinbuf_2("/abcd/", "defg/", "/abcd/defg/"); - check_joinbuf_2("/abcd/", "/defg/", "/abcd/defg/"); - - check_joinbuf_overlapped("abcd", 0, "efg", "abcd/efg"); - check_joinbuf_overlapped("abcd", 1, "efg", "bcd/efg"); - check_joinbuf_overlapped("abcd", 2, "efg", "cd/efg"); - check_joinbuf_overlapped("abcd", 3, "efg", "d/efg"); - check_joinbuf_overlapped("abcd", 4, "efg", "efg"); - check_joinbuf_overlapped("abc/", 2, "efg", "c/efg"); - check_joinbuf_overlapped("abc/", 3, "efg", "/efg"); - check_joinbuf_overlapped("abc/", 4, "efg", "efg"); - check_joinbuf_overlapped("abcd", 3, "", "d/"); - check_joinbuf_overlapped("abcd", 4, "", ""); - check_joinbuf_overlapped("abc/", 2, "", "c/"); - check_joinbuf_overlapped("abc/", 3, "", "/"); - check_joinbuf_overlapped("abc/", 4, "", ""); - - check_joinbuf_n_2("", "", ""); - check_joinbuf_n_2("", "a", "a"); - check_joinbuf_n_2("", "/a", "/a"); - check_joinbuf_n_2("a", "", "a/"); - check_joinbuf_n_2("a", "/", "a/"); - check_joinbuf_n_2("a", "b", "a/b"); - check_joinbuf_n_2("/", "a", "/a"); - check_joinbuf_n_2("/", "", "/"); - check_joinbuf_n_2("/a", "/b", "/a/b"); - check_joinbuf_n_2("/a", "/b/", "/a/b/"); - check_joinbuf_n_2("/a/", "b/", "/a/b/"); - check_joinbuf_n_2("/a/", "/b/", "/a/b/"); - check_joinbuf_n_2("/abcd", "/defg", "/abcd/defg"); - check_joinbuf_n_2("/abcd", "/defg/", "/abcd/defg/"); - check_joinbuf_n_2("/abcd/", "defg/", "/abcd/defg/"); - check_joinbuf_n_2("/abcd/", "/defg/", "/abcd/defg/"); - - check_joinbuf_n_4("", "", "", "", ""); - check_joinbuf_n_4("", "a", "", "", "a;"); - check_joinbuf_n_4("a", "", "", "", "a;"); - check_joinbuf_n_4("", "", "", "a", "a"); - check_joinbuf_n_4("a", "b", "", ";c;d;", "a;b;c;d;"); - check_joinbuf_n_4("a", "b", "", ";c;d", "a;b;c;d"); - check_joinbuf_n_4("abcd", "efgh", "ijkl", "mnop", "abcd;efgh;ijkl;mnop"); - check_joinbuf_n_4("abcd;", "efgh;", "ijkl;", "mnop;", "abcd;efgh;ijkl;mnop;"); - check_joinbuf_n_4(";abcd;", ";efgh;", ";ijkl;", ";mnop;", ";abcd;efgh;ijkl;mnop;"); -} - -void test_core_buffer__9(void) -{ - git_buf buf = GIT_BUF_INIT; - - /* just some exhaustive tests of various separator placement */ - char *a[] = { "", "-", "a-", "-a", "-a-" }; - char *b[] = { "", "-", "b-", "-b", "-b-" }; - char sep[] = { 0, '-', '/' }; - char *expect_null[] = { "", "-", "a-", "-a", "-a-", - "-", "--", "a--", "-a-", "-a--", - "b-", "-b-", "a-b-", "-ab-", "-a-b-", - "-b", "--b", "a--b", "-a-b", "-a--b", - "-b-", "--b-", "a--b-", "-a-b-", "-a--b-" }; - char *expect_dash[] = { "", "-", "a-", "-a-", "-a-", - "-", "-", "a-", "-a-", "-a-", - "b-", "-b-", "a-b-", "-a-b-", "-a-b-", - "-b", "-b", "a-b", "-a-b", "-a-b", - "-b-", "-b-", "a-b-", "-a-b-", "-a-b-" }; - char *expect_slas[] = { "", "-/", "a-/", "-a/", "-a-/", - "-", "-/-", "a-/-", "-a/-", "-a-/-", - "b-", "-/b-", "a-/b-", "-a/b-", "-a-/b-", - "-b", "-/-b", "a-/-b", "-a/-b", "-a-/-b", - "-b-", "-/-b-", "a-/-b-", "-a/-b-", "-a-/-b-" }; - char **expect_values[] = { expect_null, expect_dash, expect_slas }; - char separator, **expect; - unsigned int s, i, j; - - for (s = 0; s < sizeof(sep) / sizeof(char); ++s) { - separator = sep[s]; - expect = expect_values[s]; - - for (j = 0; j < sizeof(b) / sizeof(char*); ++j) { - for (i = 0; i < sizeof(a) / sizeof(char*); ++i) { - git_buf_join(&buf, separator, a[i], b[j]); - cl_assert_equal_s(*expect, buf.ptr); - expect++; - } - } - } - - git_buf_free(&buf); -} - -void test_core_buffer__10(void) -{ - git_buf a = GIT_BUF_INIT; - - cl_git_pass(git_buf_join_n(&a, '/', 1, "test")); - cl_assert_equal_s(a.ptr, "test"); - cl_git_pass(git_buf_join_n(&a, '/', 1, "string")); - cl_assert_equal_s(a.ptr, "test/string"); - git_buf_clear(&a); - cl_git_pass(git_buf_join_n(&a, '/', 3, "test", "string", "join")); - cl_assert_equal_s(a.ptr, "test/string/join"); - cl_git_pass(git_buf_join_n(&a, '/', 2, a.ptr, "more")); - cl_assert_equal_s(a.ptr, "test/string/join/test/string/join/more"); - - git_buf_free(&a); -} - -void test_core_buffer__join3(void) -{ - git_buf a = GIT_BUF_INIT; - - cl_git_pass(git_buf_join3(&a, '/', "test", "string", "join")); - cl_assert_equal_s("test/string/join", a.ptr); - cl_git_pass(git_buf_join3(&a, '/', "test/", "string", "join")); - cl_assert_equal_s("test/string/join", a.ptr); - cl_git_pass(git_buf_join3(&a, '/', "test/", "/string", "join")); - cl_assert_equal_s("test/string/join", a.ptr); - cl_git_pass(git_buf_join3(&a, '/', "test/", "/string/", "join")); - cl_assert_equal_s("test/string/join", a.ptr); - cl_git_pass(git_buf_join3(&a, '/', "test/", "/string/", "/join")); - cl_assert_equal_s("test/string/join", a.ptr); - - cl_git_pass(git_buf_join3(&a, '/', "", "string", "join")); - cl_assert_equal_s("string/join", a.ptr); - cl_git_pass(git_buf_join3(&a, '/', "", "string/", "join")); - cl_assert_equal_s("string/join", a.ptr); - cl_git_pass(git_buf_join3(&a, '/', "", "string/", "/join")); - cl_assert_equal_s("string/join", a.ptr); - - cl_git_pass(git_buf_join3(&a, '/', "string", "", "join")); - cl_assert_equal_s("string/join", a.ptr); - cl_git_pass(git_buf_join3(&a, '/', "string/", "", "join")); - cl_assert_equal_s("string/join", a.ptr); - cl_git_pass(git_buf_join3(&a, '/', "string/", "", "/join")); - cl_assert_equal_s("string/join", a.ptr); - - git_buf_free(&a); -} - -void test_core_buffer__11(void) -{ - git_buf a = GIT_BUF_INIT; - git_strarray t; - char *t1[] = { "nothing", "in", "common" }; - char *t2[] = { "something", "something else", "some other" }; - char *t3[] = { "something", "some fun", "no fun" }; - char *t4[] = { "happy", "happier", "happiest" }; - char *t5[] = { "happiest", "happier", "happy" }; - char *t6[] = { "no", "nope", "" }; - char *t7[] = { "", "doesn't matter" }; - - t.strings = t1; - t.count = 3; - cl_git_pass(git_buf_text_common_prefix(&a, &t)); - cl_assert_equal_s(a.ptr, ""); - - t.strings = t2; - t.count = 3; - cl_git_pass(git_buf_text_common_prefix(&a, &t)); - cl_assert_equal_s(a.ptr, "some"); - - t.strings = t3; - t.count = 3; - cl_git_pass(git_buf_text_common_prefix(&a, &t)); - cl_assert_equal_s(a.ptr, ""); - - t.strings = t4; - t.count = 3; - cl_git_pass(git_buf_text_common_prefix(&a, &t)); - cl_assert_equal_s(a.ptr, "happ"); - - t.strings = t5; - t.count = 3; - cl_git_pass(git_buf_text_common_prefix(&a, &t)); - cl_assert_equal_s(a.ptr, "happ"); - - t.strings = t6; - t.count = 3; - cl_git_pass(git_buf_text_common_prefix(&a, &t)); - cl_assert_equal_s(a.ptr, ""); - - t.strings = t7; - t.count = 3; - cl_git_pass(git_buf_text_common_prefix(&a, &t)); - cl_assert_equal_s(a.ptr, ""); - - git_buf_free(&a); -} - -void test_core_buffer__rfind_variants(void) -{ - git_buf a = GIT_BUF_INIT; - ssize_t len; - - cl_git_pass(git_buf_sets(&a, "/this/is/it/")); - - len = (ssize_t)git_buf_len(&a); - - cl_assert(git_buf_rfind(&a, '/') == len - 1); - cl_assert(git_buf_rfind_next(&a, '/') == len - 4); - - cl_assert(git_buf_rfind(&a, 'i') == len - 3); - cl_assert(git_buf_rfind_next(&a, 'i') == len - 3); - - cl_assert(git_buf_rfind(&a, 'h') == 2); - cl_assert(git_buf_rfind_next(&a, 'h') == 2); - - cl_assert(git_buf_rfind(&a, 'q') == -1); - cl_assert(git_buf_rfind_next(&a, 'q') == -1); - - git_buf_free(&a); -} - -void test_core_buffer__puts_escaped(void) -{ - git_buf a = GIT_BUF_INIT; - - git_buf_clear(&a); - cl_git_pass(git_buf_text_puts_escaped(&a, "this is a test", "", "")); - cl_assert_equal_s("this is a test", a.ptr); - - git_buf_clear(&a); - cl_git_pass(git_buf_text_puts_escaped(&a, "this is a test", "t", "\\")); - cl_assert_equal_s("\\this is a \\tes\\t", a.ptr); - - git_buf_clear(&a); - cl_git_pass(git_buf_text_puts_escaped(&a, "this is a test", "i ", "__")); - cl_assert_equal_s("th__is__ __is__ a__ test", a.ptr); - - git_buf_clear(&a); - cl_git_pass(git_buf_text_puts_escape_regex(&a, "^match\\s*[A-Z]+.*")); - cl_assert_equal_s("\\^match\\\\s\\*\\[A-Z\\]\\+\\.\\*", a.ptr); - - git_buf_free(&a); -} - -static void assert_unescape(char *expected, char *to_unescape) { - git_buf buf = GIT_BUF_INIT; - - cl_git_pass(git_buf_sets(&buf, to_unescape)); - git_buf_text_unescape(&buf); - cl_assert_equal_s(expected, buf.ptr); - cl_assert_equal_sz(strlen(expected), buf.size); - - git_buf_free(&buf); -} - -void test_core_buffer__unescape(void) -{ - assert_unescape("Escaped\\", "Es\\ca\\ped\\"); - assert_unescape("Es\\caped\\", "Es\\\\ca\\ped\\\\"); - assert_unescape("\\", "\\"); - assert_unescape("\\", "\\\\"); - assert_unescape("", ""); -} - -void test_core_buffer__encode_base64(void) -{ - git_buf buf = GIT_BUF_INIT; - - /* t h i s - * 0x 74 68 69 73 - * 0b 01110100 01101000 01101001 01110011 - * 0b 011101 000110 100001 101001 011100 110000 - * 0x 1d 06 21 29 1c 30 - * d G h p c w - */ - cl_git_pass(git_buf_encode_base64(&buf, "this", 4)); - cl_assert_equal_s("dGhpcw==", buf.ptr); - - git_buf_clear(&buf); - cl_git_pass(git_buf_encode_base64(&buf, "this!", 5)); - cl_assert_equal_s("dGhpcyE=", buf.ptr); - - git_buf_clear(&buf); - cl_git_pass(git_buf_encode_base64(&buf, "this!\n", 6)); - cl_assert_equal_s("dGhpcyEK", buf.ptr); - - git_buf_free(&buf); -} - -void test_core_buffer__decode_base64(void) -{ - git_buf buf = GIT_BUF_INIT; - - cl_git_pass(git_buf_decode_base64(&buf, "dGhpcw==", 8)); - cl_assert_equal_s("this", buf.ptr); - - git_buf_clear(&buf); - cl_git_pass(git_buf_decode_base64(&buf, "dGhpcyE=", 8)); - cl_assert_equal_s("this!", buf.ptr); - - git_buf_clear(&buf); - cl_git_pass(git_buf_decode_base64(&buf, "dGhpcyEK", 8)); - cl_assert_equal_s("this!\n", buf.ptr); - - cl_git_fail(git_buf_decode_base64(&buf, "This is not a valid base64 string!!!", 36)); - cl_assert_equal_s("this!\n", buf.ptr); - - git_buf_free(&buf); -} - -void test_core_buffer__encode_base85(void) -{ - git_buf buf = GIT_BUF_INIT; - - cl_git_pass(git_buf_encode_base85(&buf, "this", 4)); - cl_assert_equal_s("bZBXF", buf.ptr); - git_buf_clear(&buf); - - cl_git_pass(git_buf_encode_base85(&buf, "two rnds", 8)); - cl_assert_equal_s("ba!tca&BaE", buf.ptr); - git_buf_clear(&buf); - - cl_git_pass(git_buf_encode_base85(&buf, "this is base 85 encoded", - strlen("this is base 85 encoded"))); - cl_assert_equal_s("bZBXFAZc?TVqtS-AUHK3Wo~0{WMyOk", buf.ptr); - git_buf_clear(&buf); - - git_buf_free(&buf); -} - -void test_core_buffer__classify_with_utf8(void) -{ - char *data0 = "Simple text\n"; - size_t data0len = 12; - char *data1 = "Is that UTF-8 data I see…\nYep!\n"; - size_t data1len = 31; - char *data2 = "Internal NUL!!!\000\n\nI see you!\n"; - size_t data2len = 29; - char *data3 = "\xef\xbb\xbfThis is UTF-8 with a BOM.\n"; - size_t data3len = 20; - git_buf b; - - b.ptr = data0; b.size = b.asize = data0len; - cl_assert(!git_buf_text_is_binary(&b)); - cl_assert(!git_buf_text_contains_nul(&b)); - - b.ptr = data1; b.size = b.asize = data1len; - cl_assert(!git_buf_text_is_binary(&b)); - cl_assert(!git_buf_text_contains_nul(&b)); - - b.ptr = data2; b.size = b.asize = data2len; - cl_assert(git_buf_text_is_binary(&b)); - cl_assert(git_buf_text_contains_nul(&b)); - - b.ptr = data3; b.size = b.asize = data3len; - cl_assert(!git_buf_text_is_binary(&b)); - cl_assert(!git_buf_text_contains_nul(&b)); -} - -#define SIMILARITY_TEST_DATA_1 \ - "000\n001\n002\n003\n004\n005\n006\n007\n008\n009\n" \ - "010\n011\n012\n013\n014\n015\n016\n017\n018\n019\n" \ - "020\n021\n022\n023\n024\n025\n026\n027\n028\n029\n" \ - "030\n031\n032\n033\n034\n035\n036\n037\n038\n039\n" \ - "040\n041\n042\n043\n044\n045\n046\n047\n048\n049\n" - -void test_core_buffer__similarity_metric(void) -{ - git_hashsig *a, *b; - git_buf buf = GIT_BUF_INIT; - int sim; - - /* in the first case, we compare data to itself and expect 100% match */ - - cl_git_pass(git_buf_sets(&buf, SIMILARITY_TEST_DATA_1)); - cl_git_pass(git_hashsig_create(&a, buf.ptr, buf.size, GIT_HASHSIG_NORMAL)); - cl_git_pass(git_hashsig_create(&b, buf.ptr, buf.size, GIT_HASHSIG_NORMAL)); - - cl_assert_equal_i(100, git_hashsig_compare(a, b)); - - git_hashsig_free(a); - git_hashsig_free(b); - - /* if we change just a single byte, how much does that change magnify? */ - - cl_git_pass(git_buf_sets(&buf, SIMILARITY_TEST_DATA_1)); - cl_git_pass(git_hashsig_create(&a, buf.ptr, buf.size, GIT_HASHSIG_NORMAL)); - cl_git_pass(git_buf_sets(&buf, - "000\n001\n002\n003\n004\n005\n006\n007\n008\n009\n" \ - "010\n011\n012\n013\n014\n015\n016\n017\n018\n019\n" \ - "x020x\n021\n022\n023\n024\n025\n026\n027\n028\n029\n" \ - "030\n031\n032\n033\n034\n035\n036\n037\n038\n039\n" \ - "040\n041\n042\n043\n044\n045\n046\n047\n048\n049\n" - )); - cl_git_pass(git_hashsig_create(&b, buf.ptr, buf.size, GIT_HASHSIG_NORMAL)); - - sim = git_hashsig_compare(a, b); - - cl_assert_in_range(95, sim, 100); /* expect >95% similarity */ - - git_hashsig_free(a); - git_hashsig_free(b); - - /* let's try comparing data to a superset of itself */ - - cl_git_pass(git_buf_sets(&buf, SIMILARITY_TEST_DATA_1)); - cl_git_pass(git_hashsig_create(&a, buf.ptr, buf.size, GIT_HASHSIG_NORMAL)); - cl_git_pass(git_buf_sets(&buf, SIMILARITY_TEST_DATA_1 - "050\n051\n052\n053\n054\n055\n056\n057\n058\n059\n")); - cl_git_pass(git_hashsig_create(&b, buf.ptr, buf.size, GIT_HASHSIG_NORMAL)); - - sim = git_hashsig_compare(a, b); - /* 20% lines added ~= 10% lines changed */ - - cl_assert_in_range(85, sim, 95); /* expect similarity around 90% */ - - git_hashsig_free(a); - git_hashsig_free(b); - - /* what if we keep about half the original data and add half new */ - - cl_git_pass(git_buf_sets(&buf, SIMILARITY_TEST_DATA_1)); - cl_git_pass(git_hashsig_create(&a, buf.ptr, buf.size, GIT_HASHSIG_NORMAL)); - cl_git_pass(git_buf_sets(&buf, - "000\n001\n002\n003\n004\n005\n006\n007\n008\n009\n" \ - "010\n011\n012\n013\n014\n015\n016\n017\n018\n019\n" \ - "020x\n021\n022\n023\n024\n" \ - "x25\nx26\nx27\nx28\nx29\n" \ - "x30\nx31\nx32\nx33\nx34\nx35\nx36\nx37\nx38\nx39\n" \ - "x40\nx41\nx42\nx43\nx44\nx45\nx46\nx47\nx48\nx49\n" - )); - cl_git_pass(git_hashsig_create(&b, buf.ptr, buf.size, GIT_HASHSIG_NORMAL)); - - sim = git_hashsig_compare(a, b); - /* 50% lines changed */ - - cl_assert_in_range(40, sim, 60); /* expect in the 40-60% similarity range */ - - git_hashsig_free(a); - git_hashsig_free(b); - - /* lastly, let's check that we can hash file content as well */ - - cl_git_pass(git_buf_sets(&buf, SIMILARITY_TEST_DATA_1)); - cl_git_pass(git_hashsig_create(&a, buf.ptr, buf.size, GIT_HASHSIG_NORMAL)); - - cl_git_pass(git_futils_mkdir("scratch", NULL, 0755, GIT_MKDIR_PATH)); - cl_git_mkfile("scratch/testdata", SIMILARITY_TEST_DATA_1); - cl_git_pass(git_hashsig_create_fromfile( - &b, "scratch/testdata", GIT_HASHSIG_NORMAL)); - - cl_assert_equal_i(100, git_hashsig_compare(a, b)); - - git_hashsig_free(a); - git_hashsig_free(b); - - git_buf_free(&buf); - git_futils_rmdir_r("scratch", NULL, GIT_RMDIR_REMOVE_FILES); -} - - -void test_core_buffer__similarity_metric_whitespace(void) -{ - git_hashsig *a, *b; - git_buf buf = GIT_BUF_INIT; - int sim, i, j; - git_hashsig_option_t opt; - const char *tabbed = - " for (s = 0; s < sizeof(sep) / sizeof(char); ++s) {\n" - " separator = sep[s];\n" - " expect = expect_values[s];\n" - "\n" - " for (j = 0; j < sizeof(b) / sizeof(char*); ++j) {\n" - " for (i = 0; i < sizeof(a) / sizeof(char*); ++i) {\n" - " git_buf_join(&buf, separator, a[i], b[j]);\n" - " cl_assert_equal_s(*expect, buf.ptr);\n" - " expect++;\n" - " }\n" - " }\n" - " }\n"; - const char *spaced = - " for (s = 0; s < sizeof(sep) / sizeof(char); ++s) {\n" - " separator = sep[s];\n" - " expect = expect_values[s];\n" - "\n" - " for (j = 0; j < sizeof(b) / sizeof(char*); ++j) {\n" - " for (i = 0; i < sizeof(a) / sizeof(char*); ++i) {\n" - " git_buf_join(&buf, separator, a[i], b[j]);\n" - " cl_assert_equal_s(*expect, buf.ptr);\n" - " expect++;\n" - " }\n" - " }\n" - " }\n"; - const char *crlf_spaced2 = - " for (s = 0; s < sizeof(sep) / sizeof(char); ++s) {\r\n" - " separator = sep[s];\r\n" - " expect = expect_values[s];\r\n" - "\r\n" - " for (j = 0; j < sizeof(b) / sizeof(char*); ++j) {\r\n" - " for (i = 0; i < sizeof(a) / sizeof(char*); ++i) {\r\n" - " git_buf_join(&buf, separator, a[i], b[j]);\r\n" - " cl_assert_equal_s(*expect, buf.ptr);\r\n" - " expect++;\r\n" - " }\r\n" - " }\r\n" - " }\r\n"; - const char *text[3] = { tabbed, spaced, crlf_spaced2 }; - - /* let's try variations of our own code with whitespace changes */ - - for (opt = GIT_HASHSIG_NORMAL; opt <= GIT_HASHSIG_SMART_WHITESPACE; ++opt) { - for (i = 0; i < 3; ++i) { - for (j = 0; j < 3; ++j) { - cl_git_pass(git_buf_sets(&buf, text[i])); - cl_git_pass(git_hashsig_create(&a, buf.ptr, buf.size, opt)); - - cl_git_pass(git_buf_sets(&buf, text[j])); - cl_git_pass(git_hashsig_create(&b, buf.ptr, buf.size, opt)); - - sim = git_hashsig_compare(a, b); - - if (opt == GIT_HASHSIG_NORMAL) { - if (i == j) - cl_assert_equal_i(100, sim); - else - cl_assert_in_range(0, sim, 30); /* pretty different */ - } else { - cl_assert_equal_i(100, sim); - } - - git_hashsig_free(a); - git_hashsig_free(b); - } - } - } - - git_buf_free(&buf); -} - -#include "../filter/crlf.h" - -#define check_buf(expected,buf) do { \ - cl_assert_equal_s(expected, buf.ptr); \ - cl_assert_equal_sz(strlen(expected), buf.size); } while (0) - -void test_core_buffer__lf_and_crlf_conversions(void) -{ - git_buf src = GIT_BUF_INIT, tgt = GIT_BUF_INIT; - - /* LF source */ - - git_buf_sets(&src, "lf\nlf\nlf\nlf\n"); - - cl_git_pass(git_buf_text_lf_to_crlf(&tgt, &src)); - check_buf("lf\r\nlf\r\nlf\r\nlf\r\n", tgt); - - cl_git_pass(git_buf_text_crlf_to_lf(&tgt, &src)); - check_buf(src.ptr, tgt); - - git_buf_sets(&src, "\nlf\nlf\nlf\nlf\nlf"); - - cl_git_pass(git_buf_text_lf_to_crlf(&tgt, &src)); - check_buf("\r\nlf\r\nlf\r\nlf\r\nlf\r\nlf", tgt); - - cl_git_pass(git_buf_text_crlf_to_lf(&tgt, &src)); - check_buf(src.ptr, tgt); - - /* CRLF source */ - - git_buf_sets(&src, "crlf\r\ncrlf\r\ncrlf\r\ncrlf\r\n"); - - cl_git_pass(git_buf_text_lf_to_crlf(&tgt, &src)); - check_buf("crlf\r\ncrlf\r\ncrlf\r\ncrlf\r\n", tgt); - - git_buf_sets(&src, "crlf\r\ncrlf\r\ncrlf\r\ncrlf\r\n"); - - cl_git_pass(git_buf_text_crlf_to_lf(&tgt, &src)); - check_buf("crlf\ncrlf\ncrlf\ncrlf\n", tgt); - - git_buf_sets(&src, "\r\ncrlf\r\ncrlf\r\ncrlf\r\ncrlf\r\ncrlf"); - - cl_git_pass(git_buf_text_lf_to_crlf(&tgt, &src)); - check_buf("\r\ncrlf\r\ncrlf\r\ncrlf\r\ncrlf\r\ncrlf", tgt); - - git_buf_sets(&src, "\r\ncrlf\r\ncrlf\r\ncrlf\r\ncrlf\r\ncrlf"); - - cl_git_pass(git_buf_text_crlf_to_lf(&tgt, &src)); - check_buf("\ncrlf\ncrlf\ncrlf\ncrlf\ncrlf", tgt); - - /* CRLF in LF text */ - - git_buf_sets(&src, "\nlf\nlf\ncrlf\r\nlf\nlf\ncrlf\r\n"); - - cl_git_pass(git_buf_text_lf_to_crlf(&tgt, &src)); - check_buf("\r\nlf\r\nlf\r\ncrlf\r\nlf\r\nlf\r\ncrlf\r\n", tgt); - - git_buf_sets(&src, "\nlf\nlf\ncrlf\r\nlf\nlf\ncrlf\r\n"); - - cl_git_pass(git_buf_text_crlf_to_lf(&tgt, &src)); - check_buf("\nlf\nlf\ncrlf\nlf\nlf\ncrlf\n", tgt); - - /* LF in CRLF text */ - - git_buf_sets(&src, "\ncrlf\r\ncrlf\r\nlf\ncrlf\r\ncrlf"); - - cl_git_pass(git_buf_text_lf_to_crlf(&tgt, &src)); - check_buf("\r\ncrlf\r\ncrlf\r\nlf\r\ncrlf\r\ncrlf", tgt); - - cl_git_pass(git_buf_text_crlf_to_lf(&tgt, &src)); - check_buf("\ncrlf\ncrlf\nlf\ncrlf\ncrlf", tgt); - - /* bare CR test */ - - git_buf_sets(&src, "\rcrlf\r\nlf\nlf\ncr\rcrlf\r\nlf\ncr\r"); - - cl_git_pass(git_buf_text_lf_to_crlf(&tgt, &src)); - check_buf("\rcrlf\r\nlf\r\nlf\r\ncr\rcrlf\r\nlf\r\ncr\r", tgt); - - git_buf_sets(&src, "\rcrlf\r\nlf\nlf\ncr\rcrlf\r\nlf\ncr\r"); - - cl_git_pass(git_buf_text_crlf_to_lf(&tgt, &src)); - check_buf("\rcrlf\nlf\nlf\ncr\rcrlf\nlf\ncr\r", tgt); - - git_buf_sets(&src, "\rcr\r"); - cl_git_pass(git_buf_text_lf_to_crlf(&tgt, &src)); - check_buf(src.ptr, tgt); - cl_git_pass(git_buf_text_crlf_to_lf(&tgt, &src)); - check_buf("\rcr\r", tgt); - - git_buf_free(&src); - git_buf_free(&tgt); - - /* blob correspondence tests */ - - git_buf_sets(&src, ALL_CRLF_TEXT_RAW); - cl_git_pass(git_buf_text_lf_to_crlf(&tgt, &src)); - check_buf(ALL_CRLF_TEXT_AS_CRLF, tgt); - git_buf_sets(&src, ALL_CRLF_TEXT_RAW); - cl_git_pass(git_buf_text_crlf_to_lf(&tgt, &src)); - check_buf(ALL_CRLF_TEXT_AS_LF, tgt); - git_buf_free(&src); - git_buf_free(&tgt); - - git_buf_sets(&src, ALL_LF_TEXT_RAW); - cl_git_pass(git_buf_text_lf_to_crlf(&tgt, &src)); - check_buf(ALL_LF_TEXT_AS_CRLF, tgt); - git_buf_sets(&src, ALL_LF_TEXT_RAW); - cl_git_pass(git_buf_text_crlf_to_lf(&tgt, &src)); - check_buf(ALL_LF_TEXT_AS_LF, tgt); - git_buf_free(&src); - git_buf_free(&tgt); - - git_buf_sets(&src, MORE_CRLF_TEXT_RAW); - cl_git_pass(git_buf_text_lf_to_crlf(&tgt, &src)); - check_buf(MORE_CRLF_TEXT_AS_CRLF, tgt); - git_buf_sets(&src, MORE_CRLF_TEXT_RAW); - cl_git_pass(git_buf_text_crlf_to_lf(&tgt, &src)); - check_buf(MORE_CRLF_TEXT_AS_LF, tgt); - git_buf_free(&src); - git_buf_free(&tgt); - - git_buf_sets(&src, MORE_LF_TEXT_RAW); - cl_git_pass(git_buf_text_lf_to_crlf(&tgt, &src)); - check_buf(MORE_LF_TEXT_AS_CRLF, tgt); - git_buf_sets(&src, MORE_LF_TEXT_RAW); - cl_git_pass(git_buf_text_crlf_to_lf(&tgt, &src)); - check_buf(MORE_LF_TEXT_AS_LF, tgt); - git_buf_free(&src); - git_buf_free(&tgt); -} - -void test_core_buffer__dont_grow_borrowed(void) -{ - const char *somestring = "blah blah"; - git_buf buf = GIT_BUF_INIT; - - git_buf_attach_notowned(&buf, somestring, strlen(somestring) + 1); - cl_assert_equal_p(somestring, buf.ptr); - cl_assert_equal_i(0, buf.asize); - cl_assert_equal_i(strlen(somestring) + 1, buf.size); - - cl_git_fail_with(GIT_EINVALID, git_buf_grow(&buf, 1024)); -} diff --git a/vendor/libgit2/tests/core/copy.c b/vendor/libgit2/tests/core/copy.c deleted file mode 100644 index 04b2dfab5e..0000000000 --- a/vendor/libgit2/tests/core/copy.c +++ /dev/null @@ -1,152 +0,0 @@ -#include "clar_libgit2.h" -#include "fileops.h" -#include "path.h" -#include "posix.h" - -void test_core_copy__file(void) -{ - struct stat st; - const char *content = "This is some stuff to copy\n"; - - cl_git_mkfile("copy_me", content); - - cl_git_pass(git_futils_cp("copy_me", "copy_me_two", 0664)); - - cl_git_pass(git_path_lstat("copy_me_two", &st)); - cl_assert(S_ISREG(st.st_mode)); - cl_assert(strlen(content) == (size_t)st.st_size); - - cl_git_pass(p_unlink("copy_me_two")); - cl_git_pass(p_unlink("copy_me")); -} - -void test_core_copy__file_in_dir(void) -{ - struct stat st; - const char *content = "This is some other stuff to copy\n"; - - cl_git_pass(git_futils_mkdir("an_dir/in_a_dir", NULL, 0775, GIT_MKDIR_PATH)); - cl_git_mkfile("an_dir/in_a_dir/copy_me", content); - cl_assert(git_path_isdir("an_dir")); - - cl_git_pass(git_futils_mkpath2file - ("an_dir/second_dir/and_more/copy_me_two", 0775)); - - cl_git_pass(git_futils_cp - ("an_dir/in_a_dir/copy_me", - "an_dir/second_dir/and_more/copy_me_two", - 0664)); - - cl_git_pass(git_path_lstat("an_dir/second_dir/and_more/copy_me_two", &st)); - cl_assert(S_ISREG(st.st_mode)); - cl_assert(strlen(content) == (size_t)st.st_size); - - cl_git_pass(git_futils_rmdir_r("an_dir", NULL, GIT_RMDIR_REMOVE_FILES)); - cl_assert(!git_path_isdir("an_dir")); -} - -void assert_hard_link(const char *path) -{ - /* we assert this by checking that there's more than one link to the file */ - struct stat st; - - cl_assert(git_path_isfile(path)); - cl_git_pass(p_stat(path, &st)); - cl_assert(st.st_nlink > 1); -} - -void test_core_copy__tree(void) -{ - struct stat st; - const char *content = "File content\n"; - - cl_git_pass(git_futils_mkdir("src/b", NULL, 0775, GIT_MKDIR_PATH)); - cl_git_pass(git_futils_mkdir("src/c/d", NULL, 0775, GIT_MKDIR_PATH)); - cl_git_pass(git_futils_mkdir("src/c/e", NULL, 0775, GIT_MKDIR_PATH)); - - cl_git_mkfile("src/f1", content); - cl_git_mkfile("src/b/f2", content); - cl_git_mkfile("src/c/f3", content); - cl_git_mkfile("src/c/d/f4", content); - cl_git_mkfile("src/c/d/.f5", content); - -#ifndef GIT_WIN32 - cl_assert(p_symlink("../../b/f2", "src/c/d/l1") == 0); -#endif - - cl_assert(git_path_isdir("src")); - cl_assert(git_path_isdir("src/b")); - cl_assert(git_path_isdir("src/c/d")); - cl_assert(git_path_isfile("src/c/d/f4")); - - /* copy with no empty dirs, yes links, no dotfiles, no overwrite */ - - cl_git_pass( - git_futils_cp_r("src", "t1", GIT_CPDIR_COPY_SYMLINKS, 0) ); - - cl_assert(git_path_isdir("t1")); - cl_assert(git_path_isdir("t1/b")); - cl_assert(git_path_isdir("t1/c")); - cl_assert(git_path_isdir("t1/c/d")); - cl_assert(!git_path_isdir("t1/c/e")); - - cl_assert(git_path_isfile("t1/f1")); - cl_assert(git_path_isfile("t1/b/f2")); - cl_assert(git_path_isfile("t1/c/f3")); - cl_assert(git_path_isfile("t1/c/d/f4")); - cl_assert(!git_path_isfile("t1/c/d/.f5")); - - cl_git_pass(git_path_lstat("t1/c/f3", &st)); - cl_assert(S_ISREG(st.st_mode)); - cl_assert(strlen(content) == (size_t)st.st_size); - -#ifndef GIT_WIN32 - cl_git_pass(git_path_lstat("t1/c/d/l1", &st)); - cl_assert(S_ISLNK(st.st_mode)); -#endif - - cl_git_pass(git_futils_rmdir_r("t1", NULL, GIT_RMDIR_REMOVE_FILES)); - cl_assert(!git_path_isdir("t1")); - - /* copy with empty dirs, no links, yes dotfiles, no overwrite */ - - cl_git_pass( - git_futils_cp_r("src", "t2", GIT_CPDIR_CREATE_EMPTY_DIRS | GIT_CPDIR_COPY_DOTFILES, 0) ); - - cl_assert(git_path_isdir("t2")); - cl_assert(git_path_isdir("t2/b")); - cl_assert(git_path_isdir("t2/c")); - cl_assert(git_path_isdir("t2/c/d")); - cl_assert(git_path_isdir("t2/c/e")); - - cl_assert(git_path_isfile("t2/f1")); - cl_assert(git_path_isfile("t2/b/f2")); - cl_assert(git_path_isfile("t2/c/f3")); - cl_assert(git_path_isfile("t2/c/d/f4")); - cl_assert(git_path_isfile("t2/c/d/.f5")); - -#ifndef GIT_WIN32 - cl_git_fail(git_path_lstat("t2/c/d/l1", &st)); -#endif - - cl_git_pass(git_futils_rmdir_r("t2", NULL, GIT_RMDIR_REMOVE_FILES)); - cl_assert(!git_path_isdir("t2")); - -#ifndef GIT_WIN32 - cl_git_pass(git_futils_cp_r("src", "t3", GIT_CPDIR_CREATE_EMPTY_DIRS | GIT_CPDIR_LINK_FILES, 0)); - cl_assert(git_path_isdir("t3")); - - cl_assert(git_path_isdir("t3")); - cl_assert(git_path_isdir("t3/b")); - cl_assert(git_path_isdir("t3/c")); - cl_assert(git_path_isdir("t3/c/d")); - cl_assert(git_path_isdir("t3/c/e")); - - assert_hard_link("t3/f1"); - assert_hard_link("t3/b/f2"); - assert_hard_link("t3/c/f3"); - assert_hard_link("t3/c/d/f4"); -#endif - - cl_git_pass(git_futils_rmdir_r("src", NULL, GIT_RMDIR_REMOVE_FILES)); -} diff --git a/vendor/libgit2/tests/core/dirent.c b/vendor/libgit2/tests/core/dirent.c deleted file mode 100644 index d95e44196d..0000000000 --- a/vendor/libgit2/tests/core/dirent.c +++ /dev/null @@ -1,277 +0,0 @@ -#include "clar_libgit2.h" -#include "fileops.h" - -typedef struct name_data { - int count; /* return count */ - char *name; /* filename */ -} name_data; - -typedef struct walk_data { - char *sub; /* sub-directory name */ - name_data *names; /* name state data */ - git_buf path; -} walk_data; - - -static char *top_dir = "dir-walk"; -static walk_data *state_loc; - -static void setup(walk_data *d) -{ - name_data *n; - - cl_must_pass(p_mkdir(top_dir, 0777)); - - cl_must_pass(p_chdir(top_dir)); - - if (strcmp(d->sub, ".") != 0) - cl_must_pass(p_mkdir(d->sub, 0777)); - - cl_git_pass(git_buf_sets(&d->path, d->sub)); - - state_loc = d; - - for (n = d->names; n->name; n++) { - git_file fd = p_creat(n->name, 0666); - cl_assert(fd >= 0); - p_close(fd); - n->count = 0; - } -} - -static void dirent_cleanup__cb(void *_d) -{ - walk_data *d = _d; - name_data *n; - - for (n = d->names; n->name; n++) { - cl_must_pass(p_unlink(n->name)); - } - - if (strcmp(d->sub, ".") != 0) - cl_must_pass(p_rmdir(d->sub)); - - cl_must_pass(p_chdir("..")); - - cl_must_pass(p_rmdir(top_dir)); - - git_buf_free(&d->path); -} - -static void check_counts(walk_data *d) -{ - name_data *n; - - for (n = d->names; n->name; n++) { - cl_assert(n->count == 1); - } -} - -static int update_count(name_data *data, const char *name) -{ - name_data *n; - - for (n = data; n->name; n++) { - if (!strcmp(n->name, name)) { - n->count++; - return 0; - } - } - - return GIT_ERROR; -} - -static int one_entry(void *state, git_buf *path) -{ - walk_data *d = (walk_data *) state; - - if (state != state_loc) - return GIT_ERROR; - - if (path != &d->path) - return GIT_ERROR; - - return update_count(d->names, path->ptr); -} - - -static name_data dot_names[] = { - { 0, "./a" }, - { 0, "./asdf" }, - { 0, "./pack-foo.pack" }, - { 0, NULL } -}; -static walk_data dot = { - ".", - dot_names, - GIT_BUF_INIT -}; - -/* make sure that the '.' folder is not traversed */ -void test_core_dirent__dont_traverse_dot(void) -{ - cl_set_cleanup(&dirent_cleanup__cb, &dot); - setup(&dot); - - cl_git_pass(git_path_direach(&dot.path, 0, one_entry, &dot)); - - check_counts(&dot); -} - - -static name_data sub_names[] = { - { 0, "sub/a" }, - { 0, "sub/asdf" }, - { 0, "sub/pack-foo.pack" }, - { 0, NULL } -}; -static walk_data sub = { - "sub", - sub_names, - GIT_BUF_INIT -}; - -/* traverse a subfolder */ -void test_core_dirent__traverse_subfolder(void) -{ - cl_set_cleanup(&dirent_cleanup__cb, &sub); - setup(&sub); - - cl_git_pass(git_path_direach(&sub.path, 0, one_entry, &sub)); - - check_counts(&sub); -} - - -static walk_data sub_slash = { - "sub/", - sub_names, - GIT_BUF_INIT -}; - -/* traverse a slash-terminated subfolder */ -void test_core_dirent__traverse_slash_terminated_folder(void) -{ - cl_set_cleanup(&dirent_cleanup__cb, &sub_slash); - setup(&sub_slash); - - cl_git_pass(git_path_direach(&sub_slash.path, 0, one_entry, &sub_slash)); - - check_counts(&sub_slash); -} - - -static name_data empty_names[] = { - { 0, NULL } -}; -static walk_data empty = { - "empty", - empty_names, - GIT_BUF_INIT -}; - -/* make sure that empty folders are not traversed */ -void test_core_dirent__dont_traverse_empty_folders(void) -{ - cl_set_cleanup(&dirent_cleanup__cb, &empty); - setup(&empty); - - cl_git_pass(git_path_direach(&empty.path, 0, one_entry, &empty)); - - check_counts(&empty); - - /* make sure callback not called */ - cl_assert(git_path_is_empty_dir(empty.path.ptr)); -} - -static name_data odd_names[] = { - { 0, "odd/.a" }, - { 0, "odd/..c" }, - /* the following don't work on cygwin/win32 */ - /* { 0, "odd/.b." }, */ - /* { 0, "odd/..d.." }, */ - { 0, NULL } -}; -static walk_data odd = { - "odd", - odd_names, - GIT_BUF_INIT -}; - -/* make sure that strange looking filenames ('..c') are traversed */ -void test_core_dirent__traverse_weird_filenames(void) -{ - cl_set_cleanup(&dirent_cleanup__cb, &odd); - setup(&odd); - - cl_git_pass(git_path_direach(&odd.path, 0, one_entry, &odd)); - - check_counts(&odd); -} - -/* test filename length limits */ -void test_core_dirent__length_limits(void) -{ - char *big_filename = (char *)git__malloc(FILENAME_MAX + 1); - memset(big_filename, 'a', FILENAME_MAX + 1); - big_filename[FILENAME_MAX] = 0; - - cl_must_fail(p_creat(big_filename, 0666)); - - git__free(big_filename); -} - -void test_core_dirent__empty_dir(void) -{ - cl_must_pass(p_mkdir("empty_dir", 0777)); - cl_assert(git_path_is_empty_dir("empty_dir")); - - cl_git_mkfile("empty_dir/content", "whatever\n"); - cl_assert(!git_path_is_empty_dir("empty_dir")); - cl_assert(!git_path_is_empty_dir("empty_dir/content")); - - cl_must_pass(p_unlink("empty_dir/content")); - - cl_must_pass(p_mkdir("empty_dir/content", 0777)); - cl_assert(!git_path_is_empty_dir("empty_dir")); - cl_assert(git_path_is_empty_dir("empty_dir/content")); - - cl_must_pass(p_rmdir("empty_dir/content")); - - cl_must_pass(p_rmdir("empty_dir")); -} - -static void handle_next(git_path_diriter *diriter, walk_data *walk) -{ - const char *fullpath, *filename; - size_t fullpath_len, filename_len; - - cl_git_pass(git_path_diriter_fullpath(&fullpath, &fullpath_len, diriter)); - cl_git_pass(git_path_diriter_filename(&filename, &filename_len, diriter)); - - cl_assert_equal_strn(fullpath, "sub/", 4); - cl_assert_equal_s(fullpath+4, filename); - - update_count(walk->names, fullpath); -} - -/* test directory iterator */ -void test_core_dirent__diriter_with_fullname(void) -{ - git_path_diriter diriter = GIT_PATH_DIRITER_INIT; - int error; - - cl_set_cleanup(&dirent_cleanup__cb, &sub); - setup(&sub); - - cl_git_pass(git_path_diriter_init(&diriter, sub.path.ptr, 0)); - - while ((error = git_path_diriter_next(&diriter)) == 0) - handle_next(&diriter, &sub); - - cl_assert_equal_i(error, GIT_ITEROVER); - - git_path_diriter_free(&diriter); - - check_counts(&sub); -} diff --git a/vendor/libgit2/tests/core/env.c b/vendor/libgit2/tests/core/env.c deleted file mode 100644 index 293b786db1..0000000000 --- a/vendor/libgit2/tests/core/env.c +++ /dev/null @@ -1,304 +0,0 @@ -#include "clar_libgit2.h" -#include "fileops.h" -#include "sysdir.h" -#include "path.h" - -#ifdef GIT_WIN32 -#define NUM_VARS 5 -static const char *env_vars[NUM_VARS] = { - "HOME", "HOMEDRIVE", "HOMEPATH", "USERPROFILE", "PROGRAMFILES" -}; -#else -#define NUM_VARS 1 -static const char *env_vars[NUM_VARS] = { "HOME" }; -#endif - -static char *env_save[NUM_VARS]; - -static char *home_values[] = { - "fake_home", - "f\xc3\xa1ke_h\xc3\xb5me", /* all in latin-1 supplement */ - "f\xc4\x80ke_\xc4\xa4ome", /* latin extended */ - "f\xce\xb1\xce\xba\xce\xb5_h\xce\xbfm\xce\xad", /* having fun with greek */ - "fa\xe0" "\xb8" "\x87" "e_\xe0" "\xb8" "\x99" "ome", /* thai characters */ - "f\xe1\x9c\x80ke_\xe1\x9c\x91ome", /* tagalog characters */ - "\xe1\xb8\x9f\xe1\xba\xa2" "ke_ho" "\xe1" "\xb9" "\x81" "e", /* latin extended additional */ - "\xf0\x9f\x98\x98\xf0\x9f\x98\x82", /* emoticons */ - NULL -}; - -void test_core_env__initialize(void) -{ - int i; - for (i = 0; i < NUM_VARS; ++i) { - const char *original = cl_getenv(env_vars[i]); -#ifdef GIT_WIN32 - env_save[i] = (char *)original; -#else - env_save[i] = original ? git__strdup(original) : NULL; -#endif - } -} - -static void set_global_search_path_from_env(void) -{ - cl_git_pass(git_sysdir_set(GIT_SYSDIR_GLOBAL, NULL)); -} - -static void set_system_search_path_from_env(void) -{ - cl_git_pass(git_sysdir_set(GIT_SYSDIR_SYSTEM, NULL)); -} - -void test_core_env__cleanup(void) -{ - int i; - char **val; - - for (i = 0; i < NUM_VARS; ++i) { - cl_setenv(env_vars[i], env_save[i]); - git__free(env_save[i]); - env_save[i] = NULL; - } - - /* these will probably have already been cleaned up, but if a test - * fails, then it's probably good to try and clear out these dirs - */ - for (val = home_values; *val != NULL; val++) { - if (**val != '\0') - (void)p_rmdir(*val); - } - - cl_sandbox_set_search_path_defaults(); -} - -static void setenv_and_check(const char *name, const char *value) -{ - char *check; - - cl_git_pass(cl_setenv(name, value)); - - check = cl_getenv(name); - cl_assert_equal_s(value, check); -#ifdef GIT_WIN32 - git__free(check); -#endif -} - -void test_core_env__0(void) -{ - git_buf path = GIT_BUF_INIT, found = GIT_BUF_INIT; - char testfile[16], tidx = '0'; - char **val; - const char *testname = "testfile"; - size_t testlen = strlen(testname); - - strncpy(testfile, testname, sizeof(testfile)); - cl_assert_equal_s(testname, testfile); - - for (val = home_values; *val != NULL; val++) { - - /* if we can't make the directory, let's just assume - * we are on a filesystem that doesn't support the - * characters in question and skip this test... - */ - if (p_mkdir(*val, 0777) != 0) { - *val = ""; /* mark as not created */ - continue; - } - - cl_git_pass(git_path_prettify(&path, *val, NULL)); - - /* vary testfile name in each directory so accidentally leaving - * an environment variable set from a previous iteration won't - * accidentally make this test pass... - */ - testfile[testlen] = tidx++; - cl_git_pass(git_buf_joinpath(&path, path.ptr, testfile)); - cl_git_mkfile(path.ptr, "find me"); - git_buf_rtruncate_at_char(&path, '/'); - - cl_assert_equal_i( - GIT_ENOTFOUND, git_sysdir_find_global_file(&found, testfile)); - - setenv_and_check("HOME", path.ptr); - set_global_search_path_from_env(); - - cl_git_pass(git_sysdir_find_global_file(&found, testfile)); - - cl_setenv("HOME", env_save[0]); - set_global_search_path_from_env(); - - cl_assert_equal_i( - GIT_ENOTFOUND, git_sysdir_find_global_file(&found, testfile)); - -#ifdef GIT_WIN32 - setenv_and_check("HOMEDRIVE", NULL); - setenv_and_check("HOMEPATH", NULL); - setenv_and_check("USERPROFILE", path.ptr); - set_global_search_path_from_env(); - - cl_git_pass(git_sysdir_find_global_file(&found, testfile)); - - { - int root = git_path_root(path.ptr); - char old; - - if (root >= 0) { - setenv_and_check("USERPROFILE", NULL); - set_global_search_path_from_env(); - - cl_assert_equal_i( - GIT_ENOTFOUND, git_sysdir_find_global_file(&found, testfile)); - - old = path.ptr[root]; - path.ptr[root] = '\0'; - setenv_and_check("HOMEDRIVE", path.ptr); - path.ptr[root] = old; - setenv_and_check("HOMEPATH", &path.ptr[root]); - set_global_search_path_from_env(); - - cl_git_pass(git_sysdir_find_global_file(&found, testfile)); - } - } -#endif - - (void)p_rmdir(*val); - } - - git_buf_free(&path); - git_buf_free(&found); -} - - -void test_core_env__1(void) -{ - git_buf path = GIT_BUF_INIT; - - cl_assert_equal_i( - GIT_ENOTFOUND, git_sysdir_find_global_file(&path, "nonexistentfile")); - - cl_git_pass(cl_setenv("HOME", "doesnotexist")); -#ifdef GIT_WIN32 - cl_git_pass(cl_setenv("HOMEPATH", "doesnotexist")); - cl_git_pass(cl_setenv("USERPROFILE", "doesnotexist")); -#endif - set_global_search_path_from_env(); - - cl_assert_equal_i( - GIT_ENOTFOUND, git_sysdir_find_global_file(&path, "nonexistentfile")); - - cl_git_pass(cl_setenv("HOME", NULL)); -#ifdef GIT_WIN32 - cl_git_pass(cl_setenv("HOMEPATH", NULL)); - cl_git_pass(cl_setenv("USERPROFILE", NULL)); -#endif - set_global_search_path_from_env(); - set_system_search_path_from_env(); - - cl_assert_equal_i( - GIT_ENOTFOUND, git_sysdir_find_global_file(&path, "nonexistentfile")); - - cl_assert_equal_i( - GIT_ENOTFOUND, git_sysdir_find_system_file(&path, "nonexistentfile")); - -#ifdef GIT_WIN32 - cl_git_pass(cl_setenv("PROGRAMFILES", NULL)); - set_system_search_path_from_env(); - - cl_assert_equal_i( - GIT_ENOTFOUND, git_sysdir_find_system_file(&path, "nonexistentfile")); -#endif - - git_buf_free(&path); -} - -static void check_global_searchpath( - const char *path, int position, const char *file, git_buf *temp) -{ - git_buf out = GIT_BUF_INIT; - - /* build and set new path */ - if (position < 0) - cl_git_pass(git_buf_join(temp, GIT_PATH_LIST_SEPARATOR, path, "$PATH")); - else if (position > 0) - cl_git_pass(git_buf_join(temp, GIT_PATH_LIST_SEPARATOR, "$PATH", path)); - else - cl_git_pass(git_buf_sets(temp, path)); - - cl_git_pass(git_libgit2_opts( - GIT_OPT_SET_SEARCH_PATH, GIT_CONFIG_LEVEL_GLOBAL, temp->ptr)); - - /* get path and make sure $PATH expansion worked */ - cl_git_pass(git_libgit2_opts( - GIT_OPT_GET_SEARCH_PATH, GIT_CONFIG_LEVEL_GLOBAL, &out)); - - if (position < 0) - cl_assert(git__prefixcmp(out.ptr, path) == 0); - else if (position > 0) - cl_assert(git__suffixcmp(out.ptr, path) == 0); - else - cl_assert_equal_s(out.ptr, path); - - /* find file using new path */ - cl_git_pass(git_sysdir_find_global_file(temp, file)); - - /* reset path and confirm file not found */ - cl_git_pass(git_libgit2_opts( - GIT_OPT_SET_SEARCH_PATH, GIT_CONFIG_LEVEL_GLOBAL, NULL)); - cl_assert_equal_i( - GIT_ENOTFOUND, git_sysdir_find_global_file(temp, file)); - - git_buf_free(&out); -} - -void test_core_env__2(void) -{ - git_buf path = GIT_BUF_INIT, found = GIT_BUF_INIT; - char testfile[16], tidx = '0'; - char **val; - const char *testname = "alternate"; - size_t testlen = strlen(testname); - - strncpy(testfile, testname, sizeof(testfile)); - cl_assert_equal_s(testname, testfile); - - for (val = home_values; *val != NULL; val++) { - - /* if we can't make the directory, let's just assume - * we are on a filesystem that doesn't support the - * characters in question and skip this test... - */ - if (p_mkdir(*val, 0777) != 0 && errno != EEXIST) { - *val = ""; /* mark as not created */ - continue; - } - - cl_git_pass(git_path_prettify(&path, *val, NULL)); - - /* vary testfile name so any sloppiness is resetting variables or - * deleting files won't accidentally make a test pass. - */ - testfile[testlen] = tidx++; - cl_git_pass(git_buf_joinpath(&path, path.ptr, testfile)); - cl_git_mkfile(path.ptr, "find me"); - git_buf_rtruncate_at_char(&path, '/'); - - /* default should be NOTFOUND */ - cl_assert_equal_i( - GIT_ENOTFOUND, git_sysdir_find_global_file(&found, testfile)); - - /* try plain, append $PATH, and prepend $PATH */ - check_global_searchpath(path.ptr, 0, testfile, &found); - check_global_searchpath(path.ptr, -1, testfile, &found); - check_global_searchpath(path.ptr, 1, testfile, &found); - - /* cleanup */ - cl_git_pass(git_buf_joinpath(&path, path.ptr, testfile)); - (void)p_unlink(path.ptr); - (void)p_rmdir(*val); - } - - git_buf_free(&path); - git_buf_free(&found); -} diff --git a/vendor/libgit2/tests/core/errors.c b/vendor/libgit2/tests/core/errors.c deleted file mode 100644 index a06ec4abc4..0000000000 --- a/vendor/libgit2/tests/core/errors.c +++ /dev/null @@ -1,176 +0,0 @@ -#include "clar_libgit2.h" - -void test_core_errors__public_api(void) -{ - char *str_in_error; - - giterr_clear(); - cl_assert(giterr_last() == NULL); - - giterr_set_oom(); - - cl_assert(giterr_last() != NULL); - cl_assert(giterr_last()->klass == GITERR_NOMEMORY); - str_in_error = strstr(giterr_last()->message, "memory"); - cl_assert(str_in_error != NULL); - - giterr_clear(); - - giterr_set_str(GITERR_REPOSITORY, "This is a test"); - - cl_assert(giterr_last() != NULL); - str_in_error = strstr(giterr_last()->message, "This is a test"); - cl_assert(str_in_error != NULL); - - giterr_clear(); - cl_assert(giterr_last() == NULL); -} - -#include "common.h" -#include "util.h" -#include "posix.h" - -void test_core_errors__new_school(void) -{ - char *str_in_error; - - giterr_clear(); - cl_assert(giterr_last() == NULL); - - giterr_set_oom(); /* internal fn */ - - cl_assert(giterr_last() != NULL); - cl_assert(giterr_last()->klass == GITERR_NOMEMORY); - str_in_error = strstr(giterr_last()->message, "memory"); - cl_assert(str_in_error != NULL); - - giterr_clear(); - - giterr_set(GITERR_REPOSITORY, "This is a test"); /* internal fn */ - - cl_assert(giterr_last() != NULL); - str_in_error = strstr(giterr_last()->message, "This is a test"); - cl_assert(str_in_error != NULL); - - giterr_clear(); - cl_assert(giterr_last() == NULL); - - do { - struct stat st; - memset(&st, 0, sizeof(st)); - cl_assert(p_lstat("this_file_does_not_exist", &st) < 0); - GIT_UNUSED(st); - } while (false); - giterr_set(GITERR_OS, "stat failed"); /* internal fn */ - - cl_assert(giterr_last() != NULL); - str_in_error = strstr(giterr_last()->message, "stat failed"); - cl_assert(str_in_error != NULL); - cl_assert(git__prefixcmp(str_in_error, "stat failed: ") == 0); - cl_assert(strlen(str_in_error) > strlen("stat failed: ")); - -#ifdef GIT_WIN32 - giterr_clear(); - - /* The MSDN docs use this to generate a sample error */ - cl_assert(GetProcessId(NULL) == 0); - giterr_set(GITERR_OS, "GetProcessId failed"); /* internal fn */ - - cl_assert(giterr_last() != NULL); - str_in_error = strstr(giterr_last()->message, "GetProcessId failed"); - cl_assert(str_in_error != NULL); - cl_assert(git__prefixcmp(str_in_error, "GetProcessId failed: ") == 0); - cl_assert(strlen(str_in_error) > strlen("GetProcessId failed: ")); -#endif - - giterr_clear(); -} - -void test_core_errors__restore(void) -{ - git_error_state err_state = {0}; - - giterr_clear(); - cl_assert(giterr_last() == NULL); - - cl_assert_equal_i(0, giterr_capture(&err_state, 0)); - - memset(&err_state, 0x0, sizeof(git_error_state)); - - giterr_set(42, "Foo: %s", "bar"); - cl_assert_equal_i(-1, giterr_capture(&err_state, -1)); - - cl_assert(giterr_last() == NULL); - - giterr_set(99, "Bar: %s", "foo"); - - giterr_restore(&err_state); - - cl_assert_equal_i(42, giterr_last()->klass); - cl_assert_equal_s("Foo: bar", giterr_last()->message); -} - -static int test_arraysize_multiply(size_t nelem, size_t size) -{ - size_t out; - GITERR_CHECK_ALLOC_MULTIPLY(&out, nelem, size); - return 0; -} - -void test_core_errors__integer_overflow_alloc_multiply(void) -{ - cl_git_pass(test_arraysize_multiply(10, 10)); - cl_git_pass(test_arraysize_multiply(1000, 1000)); - cl_git_pass(test_arraysize_multiply(SIZE_MAX/sizeof(void *), sizeof(void *))); - cl_git_pass(test_arraysize_multiply(0, 10)); - cl_git_pass(test_arraysize_multiply(10, 0)); - - cl_git_fail(test_arraysize_multiply(SIZE_MAX-1, sizeof(void *))); - cl_git_fail(test_arraysize_multiply((SIZE_MAX/sizeof(void *))+1, sizeof(void *))); - - cl_assert_equal_i(GITERR_NOMEMORY, giterr_last()->klass); - cl_assert_equal_s("Out of memory", giterr_last()->message); -} - -static int test_arraysize_add(size_t one, size_t two) -{ - size_t out; - GITERR_CHECK_ALLOC_ADD(&out, one, two); - return 0; -} - -void test_core_errors__integer_overflow_alloc_add(void) -{ - cl_git_pass(test_arraysize_add(10, 10)); - cl_git_pass(test_arraysize_add(1000, 1000)); - cl_git_pass(test_arraysize_add(SIZE_MAX-10, 10)); - - cl_git_fail(test_arraysize_multiply(SIZE_MAX-1, 2)); - cl_git_fail(test_arraysize_multiply(SIZE_MAX, SIZE_MAX)); - - cl_assert_equal_i(GITERR_NOMEMORY, giterr_last()->klass); - cl_assert_equal_s("Out of memory", giterr_last()->message); -} - -void test_core_errors__integer_overflow_sets_oom(void) -{ - size_t out; - - giterr_clear(); - cl_assert(!GIT_ADD_SIZET_OVERFLOW(&out, SIZE_MAX-1, 1)); - cl_assert_equal_p(NULL, giterr_last()); - - giterr_clear(); - cl_assert(!GIT_ADD_SIZET_OVERFLOW(&out, 42, 69)); - cl_assert_equal_p(NULL, giterr_last()); - - giterr_clear(); - cl_assert(GIT_ADD_SIZET_OVERFLOW(&out, SIZE_MAX, SIZE_MAX)); - cl_assert_equal_i(GITERR_NOMEMORY, giterr_last()->klass); - cl_assert_equal_s("Out of memory", giterr_last()->message); - - giterr_clear(); - cl_assert(GIT_ADD_SIZET_OVERFLOW(&out, SIZE_MAX, SIZE_MAX)); - cl_assert_equal_i(GITERR_NOMEMORY, giterr_last()->klass); - cl_assert_equal_s("Out of memory", giterr_last()->message); -} diff --git a/vendor/libgit2/tests/core/features.c b/vendor/libgit2/tests/core/features.c deleted file mode 100644 index 5eeb05e810..0000000000 --- a/vendor/libgit2/tests/core/features.c +++ /dev/null @@ -1,31 +0,0 @@ -#include "clar_libgit2.h" - -void test_core_features__0(void) -{ - int major, minor, rev, caps; - - git_libgit2_version(&major, &minor, &rev); - cl_assert_equal_i(LIBGIT2_VER_MAJOR, major); - cl_assert_equal_i(LIBGIT2_VER_MINOR, minor); - cl_assert_equal_i(LIBGIT2_VER_REVISION, rev); - - caps = git_libgit2_features(); - -#ifdef GIT_THREADS - cl_assert((caps & GIT_FEATURE_THREADS) != 0); -#else - cl_assert((caps & GIT_FEATURE_THREADS) == 0); -#endif - -#if defined(GIT_OPENSSL) || defined(GIT_WINHTTP) || defined(GIT_SECURE_TRANSPORT) - cl_assert((caps & GIT_FEATURE_HTTPS) != 0); -#else - cl_assert((caps & GIT_FEATURE_HTTPS) == 0); -#endif - -#if defined(GIT_SSH) - cl_assert((caps & GIT_FEATURE_SSH) != 0); -#else - cl_assert((caps & GIT_FEATURE_SSH) == 0); -#endif -} diff --git a/vendor/libgit2/tests/core/filebuf.c b/vendor/libgit2/tests/core/filebuf.c deleted file mode 100644 index 3f7dc85691..0000000000 --- a/vendor/libgit2/tests/core/filebuf.c +++ /dev/null @@ -1,153 +0,0 @@ -#include "clar_libgit2.h" -#include "filebuf.h" - -/* make sure git_filebuf_open doesn't delete an existing lock */ -void test_core_filebuf__0(void) -{ - git_filebuf file = GIT_FILEBUF_INIT; - int fd; - char test[] = "test", testlock[] = "test.lock"; - - fd = p_creat(testlock, 0744); //-V536 - - cl_must_pass(fd); - cl_must_pass(p_close(fd)); - - cl_git_fail(git_filebuf_open(&file, test, 0, 0666)); - cl_assert(git_path_exists(testlock)); - - cl_must_pass(p_unlink(testlock)); -} - - -/* make sure GIT_FILEBUF_APPEND works as expected */ -void test_core_filebuf__1(void) -{ - git_filebuf file = GIT_FILEBUF_INIT; - char test[] = "test"; - - cl_git_mkfile(test, "libgit2 rocks\n"); - - cl_git_pass(git_filebuf_open(&file, test, GIT_FILEBUF_APPEND, 0666)); - cl_git_pass(git_filebuf_printf(&file, "%s\n", "libgit2 rocks")); - cl_git_pass(git_filebuf_commit(&file)); - - cl_assert_equal_file("libgit2 rocks\nlibgit2 rocks\n", 0, test); - - cl_must_pass(p_unlink(test)); -} - - -/* make sure git_filebuf_write writes large buffer correctly */ -void test_core_filebuf__2(void) -{ - git_filebuf file = GIT_FILEBUF_INIT; - char test[] = "test"; - unsigned char buf[4096 * 4]; /* 2 * WRITE_BUFFER_SIZE */ - - memset(buf, 0xfe, sizeof(buf)); - - cl_git_pass(git_filebuf_open(&file, test, 0, 0666)); - cl_git_pass(git_filebuf_write(&file, buf, sizeof(buf))); - cl_git_pass(git_filebuf_commit(&file)); - - cl_assert_equal_file((char *)buf, sizeof(buf), test); - - cl_must_pass(p_unlink(test)); -} - -/* make sure git_filebuf_cleanup clears the buffer */ -void test_core_filebuf__4(void) -{ - git_filebuf file = GIT_FILEBUF_INIT; - char test[] = "test"; - - cl_assert(file.buffer == NULL); - - cl_git_pass(git_filebuf_open(&file, test, 0, 0666)); - cl_assert(file.buffer != NULL); - - git_filebuf_cleanup(&file); - cl_assert(file.buffer == NULL); -} - - -/* make sure git_filebuf_commit clears the buffer */ -void test_core_filebuf__5(void) -{ - git_filebuf file = GIT_FILEBUF_INIT; - char test[] = "test"; - - cl_assert(file.buffer == NULL); - - cl_git_pass(git_filebuf_open(&file, test, 0, 0666)); - cl_assert(file.buffer != NULL); - cl_git_pass(git_filebuf_printf(&file, "%s\n", "libgit2 rocks")); - cl_assert(file.buffer != NULL); - - cl_git_pass(git_filebuf_commit(&file)); - cl_assert(file.buffer == NULL); - - cl_must_pass(p_unlink(test)); -} - - -/* make sure git_filebuf_commit takes umask into account */ -void test_core_filebuf__umask(void) -{ - git_filebuf file = GIT_FILEBUF_INIT; - char test[] = "test"; - struct stat statbuf; - mode_t mask, os_mask; - -#ifdef GIT_WIN32 - os_mask = 0600; -#else - os_mask = 0777; -#endif - - p_umask(mask = p_umask(0)); - - cl_assert(file.buffer == NULL); - - cl_git_pass(git_filebuf_open(&file, test, 0, 0666)); - cl_assert(file.buffer != NULL); - cl_git_pass(git_filebuf_printf(&file, "%s\n", "libgit2 rocks")); - cl_assert(file.buffer != NULL); - - cl_git_pass(git_filebuf_commit(&file)); - cl_assert(file.buffer == NULL); - - cl_must_pass(p_stat("test", &statbuf)); - cl_assert_equal_i(statbuf.st_mode & os_mask, (0666 & ~mask) & os_mask); - - cl_must_pass(p_unlink(test)); -} - -void test_core_filebuf__rename_error(void) -{ - git_filebuf file = GIT_FILEBUF_INIT; - char *dir = "subdir", *test = "subdir/test", *test_lock = "subdir/test.lock"; - int fd; - -#ifndef GIT_WIN32 - cl_skip(); -#endif - - cl_git_pass(p_mkdir(dir, 0666)); - cl_git_mkfile(test, "dummy content"); - fd = p_open(test, O_RDONLY); - cl_assert(fd > 0); - cl_git_pass(git_filebuf_open(&file, test, 0, 0666)); - - cl_git_pass(git_filebuf_printf(&file, "%s\n", "libgit2 rocks")); - - cl_assert_equal_i(true, git_path_exists(test_lock)); - - cl_git_fail(git_filebuf_commit(&file)); - p_close(fd); - - git_filebuf_cleanup(&file); - - cl_assert_equal_i(false, git_path_exists(test_lock)); -} diff --git a/vendor/libgit2/tests/core/ftruncate.c b/vendor/libgit2/tests/core/ftruncate.c deleted file mode 100644 index 21981d677b..0000000000 --- a/vendor/libgit2/tests/core/ftruncate.c +++ /dev/null @@ -1,48 +0,0 @@ -/** - * Some tests for p_ftruncate() to ensure that - * properly handles large (2Gb+) files. - */ - -#include "clar_libgit2.h" - -static const char *filename = "core_ftruncate.txt"; -static int fd = -1; - -void test_core_ftruncate__initialize(void) -{ - if (!cl_getenv("GITTEST_INVASIVE_FS_SIZE")) - cl_skip(); - - cl_must_pass((fd = p_open(filename, O_CREAT | O_RDWR, 0644))); -} - -void test_core_ftruncate__cleanup(void) -{ - if (fd < 0) - return; - - p_close(fd); - fd = 0; - - p_unlink(filename); -} - -static void _extend(git_off_t i64len) -{ - struct stat st; - int error; - - cl_assert((error = p_ftruncate(fd, i64len)) == 0); - cl_assert((error = p_fstat(fd, &st)) == 0); - cl_assert(st.st_size == i64len); -} - -void test_core_ftruncate__2gb(void) -{ - _extend(0x80000001); -} - -void test_core_ftruncate__4gb(void) -{ - _extend(0x100000001); -} diff --git a/vendor/libgit2/tests/core/hex.c b/vendor/libgit2/tests/core/hex.c deleted file mode 100644 index 930af16706..0000000000 --- a/vendor/libgit2/tests/core/hex.c +++ /dev/null @@ -1,22 +0,0 @@ -#include "clar_libgit2.h" -#include "util.h" - -void test_core_hex__fromhex(void) -{ - /* Passing cases */ - cl_assert(git__fromhex('0') == 0x0); - cl_assert(git__fromhex('1') == 0x1); - cl_assert(git__fromhex('3') == 0x3); - cl_assert(git__fromhex('9') == 0x9); - cl_assert(git__fromhex('A') == 0xa); - cl_assert(git__fromhex('C') == 0xc); - cl_assert(git__fromhex('F') == 0xf); - cl_assert(git__fromhex('a') == 0xa); - cl_assert(git__fromhex('c') == 0xc); - cl_assert(git__fromhex('f') == 0xf); - - /* Failing cases */ - cl_assert(git__fromhex('g') == -1); - cl_assert(git__fromhex('z') == -1); - cl_assert(git__fromhex('X') == -1); -} diff --git a/vendor/libgit2/tests/core/iconv.c b/vendor/libgit2/tests/core/iconv.c deleted file mode 100644 index 498094bdbb..0000000000 --- a/vendor/libgit2/tests/core/iconv.c +++ /dev/null @@ -1,78 +0,0 @@ -#include "clar_libgit2.h" -#include "path.h" - -#ifdef GIT_USE_ICONV -static git_path_iconv_t ic; -static char *nfc = "\xC3\x85\x73\x74\x72\xC3\xB6\x6D"; -static char *nfd = "\x41\xCC\x8A\x73\x74\x72\x6F\xCC\x88\x6D"; -#endif - -void test_core_iconv__initialize(void) -{ -#ifdef GIT_USE_ICONV - cl_git_pass(git_path_iconv_init_precompose(&ic)); -#endif -} - -void test_core_iconv__cleanup(void) -{ -#ifdef GIT_USE_ICONV - git_path_iconv_clear(&ic); -#endif -} - -void test_core_iconv__unchanged(void) -{ -#ifdef GIT_USE_ICONV - const char *data = "Ascii data", *original = data; - size_t datalen = strlen(data); - - cl_git_pass(git_path_iconv(&ic, &data, &datalen)); - GIT_UNUSED(datalen); - - /* There are no high bits set, so this should leave data untouched */ - cl_assert(data == original); -#endif -} - -void test_core_iconv__decomposed_to_precomposed(void) -{ -#ifdef GIT_USE_ICONV - const char *data = nfd; - size_t datalen, nfdlen = strlen(nfd); - - datalen = nfdlen; - cl_git_pass(git_path_iconv(&ic, &data, &datalen)); - GIT_UNUSED(datalen); - - /* The decomposed nfd string should be transformed to the nfc form - * (on platforms where iconv is enabled, of course). - */ - cl_assert_equal_s(nfc, data); - - /* should be able to do it multiple times with the same git_path_iconv_t */ - data = nfd; datalen = nfdlen; - cl_git_pass(git_path_iconv(&ic, &data, &datalen)); - cl_assert_equal_s(nfc, data); - - data = nfd; datalen = nfdlen; - cl_git_pass(git_path_iconv(&ic, &data, &datalen)); - cl_assert_equal_s(nfc, data); -#endif -} - -void test_core_iconv__precomposed_is_unmodified(void) -{ -#ifdef GIT_USE_ICONV - const char *data = nfc; - size_t datalen = strlen(nfc); - - cl_git_pass(git_path_iconv(&ic, &data, &datalen)); - GIT_UNUSED(datalen); - - /* data is already in precomposed form, so even though some bytes have - * the high-bit set, the iconv transform should result in no change. - */ - cl_assert_equal_s(nfc, data); -#endif -} diff --git a/vendor/libgit2/tests/core/init.c b/vendor/libgit2/tests/core/init.c deleted file mode 100644 index e17b7845f2..0000000000 --- a/vendor/libgit2/tests/core/init.c +++ /dev/null @@ -1,14 +0,0 @@ -#include "clar_libgit2.h" - -void test_core_init__returns_count(void) -{ - /* libgit2_clar initializes us first, so we have an existing - * initialization. - */ - cl_assert_equal_i(2, git_libgit2_init()); - cl_assert_equal_i(3, git_libgit2_init()); - - cl_assert_equal_i(2, git_libgit2_shutdown()); - cl_assert_equal_i(1, git_libgit2_shutdown()); -} - diff --git a/vendor/libgit2/tests/core/link.c b/vendor/libgit2/tests/core/link.c deleted file mode 100644 index ec85ec4e0b..0000000000 --- a/vendor/libgit2/tests/core/link.c +++ /dev/null @@ -1,632 +0,0 @@ -#include "clar_libgit2.h" -#include "posix.h" -#include "buffer.h" -#include "path.h" - -#ifdef GIT_WIN32 -# include "win32/reparse.h" -#endif - -void test_core_link__cleanup(void) -{ -#ifdef GIT_WIN32 - RemoveDirectory("lstat_junction"); - RemoveDirectory("lstat_dangling"); - RemoveDirectory("lstat_dangling_dir"); - RemoveDirectory("lstat_dangling_junction"); - - RemoveDirectory("stat_junction"); - RemoveDirectory("stat_dangling"); - RemoveDirectory("stat_dangling_dir"); - RemoveDirectory("stat_dangling_junction"); -#endif -} - -#ifdef GIT_WIN32 -static bool should_run(void) -{ - static SID_IDENTIFIER_AUTHORITY authority = { SECURITY_NT_AUTHORITY }; - PSID admin_sid; - BOOL is_admin; - - cl_win32_pass(AllocateAndInitializeSid(&authority, 2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, &admin_sid)); - cl_win32_pass(CheckTokenMembership(NULL, admin_sid, &is_admin)); - FreeSid(admin_sid); - - return is_admin ? true : false; -} -#else -static bool should_run(void) -{ - return true; -} -#endif - -static void do_symlink(const char *old, const char *new, int is_dir) -{ -#ifndef GIT_WIN32 - GIT_UNUSED(is_dir); - - cl_must_pass(symlink(old, new)); -#else - typedef DWORD (WINAPI *create_symlink_func)(LPCTSTR, LPCTSTR, DWORD); - HMODULE module; - create_symlink_func pCreateSymbolicLink; - - cl_assert(module = GetModuleHandle("kernel32")); - cl_assert(pCreateSymbolicLink = (create_symlink_func)GetProcAddress(module, "CreateSymbolicLinkA")); - - cl_win32_pass(pCreateSymbolicLink(new, old, is_dir)); -#endif -} - -static void do_hardlink(const char *old, const char *new) -{ -#ifndef GIT_WIN32 - cl_must_pass(link(old, new)); -#else - typedef DWORD (WINAPI *create_hardlink_func)(LPCTSTR, LPCTSTR, LPSECURITY_ATTRIBUTES); - HMODULE module; - create_hardlink_func pCreateHardLink; - - cl_assert(module = GetModuleHandle("kernel32")); - cl_assert(pCreateHardLink = (create_hardlink_func)GetProcAddress(module, "CreateHardLinkA")); - - cl_win32_pass(pCreateHardLink(new, old, 0)); -#endif -} - -#ifdef GIT_WIN32 - -static void do_junction(const char *old, const char *new) -{ - GIT_REPARSE_DATA_BUFFER *reparse_buf; - HANDLE handle; - git_buf unparsed_buf = GIT_BUF_INIT; - wchar_t *subst_utf16, *print_utf16; - DWORD ioctl_ret; - int subst_utf16_len, subst_byte_len, print_utf16_len, print_byte_len, ret; - USHORT reparse_buflen; - size_t i; - - /* Junction targets must be the unparsed name, starting with \??\, using - * backslashes instead of forward, and end in a trailing backslash. - * eg: \??\C:\Foo\ - */ - git_buf_puts(&unparsed_buf, "\\??\\"); - - for (i = 0; i < strlen(old); i++) - git_buf_putc(&unparsed_buf, old[i] == '/' ? '\\' : old[i]); - - git_buf_putc(&unparsed_buf, '\\'); - - subst_utf16_len = git__utf8_to_16(NULL, 0, git_buf_cstr(&unparsed_buf)); - subst_byte_len = subst_utf16_len * sizeof(WCHAR); - - print_utf16_len = subst_utf16_len - 4; - print_byte_len = subst_byte_len - (4 * sizeof(WCHAR)); - - /* The junction must be an empty directory before the junction attribute - * can be added. - */ - cl_win32_pass(CreateDirectoryA(new, NULL)); - - handle = CreateFileA(new, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, - FILE_FLAG_OPEN_REPARSE_POINT | FILE_FLAG_BACKUP_SEMANTICS, NULL); - cl_win32_pass(handle != INVALID_HANDLE_VALUE); - - reparse_buflen = (USHORT)(REPARSE_DATA_HEADER_SIZE + - REPARSE_DATA_MOUNTPOINT_HEADER_SIZE + - subst_byte_len + sizeof(WCHAR) + - print_byte_len + sizeof(WCHAR)); - - reparse_buf = LocalAlloc(LMEM_FIXED|LMEM_ZEROINIT, reparse_buflen); - cl_assert(reparse_buf); - - subst_utf16 = reparse_buf->MountPointReparseBuffer.PathBuffer; - print_utf16 = subst_utf16 + subst_utf16_len + 1; - - ret = git__utf8_to_16(subst_utf16, subst_utf16_len + 1, - git_buf_cstr(&unparsed_buf)); - cl_assert_equal_i(subst_utf16_len, ret); - - ret = git__utf8_to_16(print_utf16, - print_utf16_len + 1, git_buf_cstr(&unparsed_buf) + 4); - cl_assert_equal_i(print_utf16_len, ret); - - reparse_buf->ReparseTag = IO_REPARSE_TAG_MOUNT_POINT; - reparse_buf->MountPointReparseBuffer.SubstituteNameOffset = 0; - reparse_buf->MountPointReparseBuffer.SubstituteNameLength = subst_byte_len; - reparse_buf->MountPointReparseBuffer.PrintNameOffset = (USHORT)(subst_byte_len + sizeof(WCHAR)); - reparse_buf->MountPointReparseBuffer.PrintNameLength = print_byte_len; - reparse_buf->ReparseDataLength = reparse_buflen - REPARSE_DATA_HEADER_SIZE; - - cl_win32_pass(DeviceIoControl(handle, FSCTL_SET_REPARSE_POINT, - reparse_buf, reparse_buflen, NULL, 0, &ioctl_ret, NULL)); - - CloseHandle(handle); - LocalFree(reparse_buf); - - git_buf_free(&unparsed_buf); -} - -static void do_custom_reparse(const char *path) -{ - REPARSE_GUID_DATA_BUFFER *reparse_buf; - HANDLE handle; - DWORD ioctl_ret; - - const char *reparse_data = "Reparse points are silly."; - size_t reparse_buflen = REPARSE_GUID_DATA_BUFFER_HEADER_SIZE + - strlen(reparse_data) + 1; - - reparse_buf = LocalAlloc(LMEM_FIXED|LMEM_ZEROINIT, reparse_buflen); - cl_assert(reparse_buf); - - reparse_buf->ReparseTag = 42; - reparse_buf->ReparseDataLength = (WORD)(strlen(reparse_data) + 1); - - reparse_buf->ReparseGuid.Data1 = 0xdeadbeef; - reparse_buf->ReparseGuid.Data2 = 0xdead; - reparse_buf->ReparseGuid.Data3 = 0xbeef; - reparse_buf->ReparseGuid.Data4[0] = 42; - reparse_buf->ReparseGuid.Data4[1] = 42; - reparse_buf->ReparseGuid.Data4[2] = 42; - reparse_buf->ReparseGuid.Data4[3] = 42; - reparse_buf->ReparseGuid.Data4[4] = 42; - reparse_buf->ReparseGuid.Data4[5] = 42; - reparse_buf->ReparseGuid.Data4[6] = 42; - reparse_buf->ReparseGuid.Data4[7] = 42; - reparse_buf->ReparseGuid.Data4[8] = 42; - - memcpy(reparse_buf->GenericReparseBuffer.DataBuffer, - reparse_data, strlen(reparse_data) + 1); - - handle = CreateFileA(path, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, - FILE_FLAG_OPEN_REPARSE_POINT | FILE_FLAG_BACKUP_SEMANTICS, NULL); - cl_win32_pass(handle != INVALID_HANDLE_VALUE); - - cl_win32_pass(DeviceIoControl(handle, FSCTL_SET_REPARSE_POINT, - reparse_buf, - reparse_buf->ReparseDataLength + REPARSE_GUID_DATA_BUFFER_HEADER_SIZE, - NULL, 0, &ioctl_ret, NULL)); - - CloseHandle(handle); - LocalFree(reparse_buf); -} - -#endif - -void test_core_link__stat_regular_file(void) -{ - struct stat st; - - cl_git_rewritefile("stat_regfile", "This is a regular file!\n"); - - cl_must_pass(p_stat("stat_regfile", &st)); - cl_assert(S_ISREG(st.st_mode)); - cl_assert_equal_i(24, st.st_size); -} - -void test_core_link__lstat_regular_file(void) -{ - struct stat st; - - cl_git_rewritefile("lstat_regfile", "This is a regular file!\n"); - - cl_must_pass(p_stat("lstat_regfile", &st)); - cl_assert(S_ISREG(st.st_mode)); - cl_assert_equal_i(24, st.st_size); -} - -void test_core_link__stat_symlink(void) -{ - struct stat st; - - if (!should_run()) - clar__skip(); - - cl_git_rewritefile("stat_target", "This is the target of a symbolic link.\n"); - do_symlink("stat_target", "stat_symlink", 0); - - cl_must_pass(p_stat("stat_target", &st)); - cl_assert(S_ISREG(st.st_mode)); - cl_assert_equal_i(39, st.st_size); - - cl_must_pass(p_stat("stat_symlink", &st)); - cl_assert(S_ISREG(st.st_mode)); - cl_assert_equal_i(39, st.st_size); -} - -void test_core_link__stat_symlink_directory(void) -{ - struct stat st; - - if (!should_run()) - clar__skip(); - - p_mkdir("stat_dirtarget", 0777); - do_symlink("stat_dirtarget", "stat_dirlink", 1); - - cl_must_pass(p_stat("stat_dirtarget", &st)); - cl_assert(S_ISDIR(st.st_mode)); - - cl_must_pass(p_stat("stat_dirlink", &st)); - cl_assert(S_ISDIR(st.st_mode)); -} - -void test_core_link__stat_symlink_chain(void) -{ - struct stat st; - - if (!should_run()) - clar__skip(); - - cl_git_rewritefile("stat_final_target", "Final target of some symbolic links...\n"); - do_symlink("stat_final_target", "stat_chain_3", 0); - do_symlink("stat_chain_3", "stat_chain_2", 0); - do_symlink("stat_chain_2", "stat_chain_1", 0); - - cl_must_pass(p_stat("stat_chain_1", &st)); - cl_assert(S_ISREG(st.st_mode)); - cl_assert_equal_i(39, st.st_size); -} - -void test_core_link__stat_dangling_symlink(void) -{ - struct stat st; - - if (!should_run()) - clar__skip(); - - do_symlink("stat_nonexistent", "stat_dangling", 0); - - cl_must_fail(p_stat("stat_nonexistent", &st)); - cl_must_fail(p_stat("stat_dangling", &st)); -} - -void test_core_link__stat_dangling_symlink_directory(void) -{ - struct stat st; - - if (!should_run()) - clar__skip(); - - do_symlink("stat_nonexistent", "stat_dangling_dir", 1); - - cl_must_fail(p_stat("stat_nonexistent_dir", &st)); - cl_must_fail(p_stat("stat_dangling", &st)); -} - -void test_core_link__lstat_symlink(void) -{ - git_buf target_path = GIT_BUF_INIT; - struct stat st; - - if (!should_run()) - clar__skip(); - - /* Windows always writes the canonical path as the link target, so - * write the full path on all platforms. - */ - git_buf_join(&target_path, '/', clar_sandbox_path(), "lstat_target"); - - cl_git_rewritefile("lstat_target", "This is the target of a symbolic link.\n"); - do_symlink(git_buf_cstr(&target_path), "lstat_symlink", 0); - - cl_must_pass(p_lstat("lstat_target", &st)); - cl_assert(S_ISREG(st.st_mode)); - cl_assert_equal_i(39, st.st_size); - - cl_must_pass(p_lstat("lstat_symlink", &st)); - cl_assert(S_ISLNK(st.st_mode)); - cl_assert_equal_i(git_buf_len(&target_path), st.st_size); - - git_buf_free(&target_path); -} - -void test_core_link__lstat_symlink_directory(void) -{ - git_buf target_path = GIT_BUF_INIT; - struct stat st; - - if (!should_run()) - clar__skip(); - - git_buf_join(&target_path, '/', clar_sandbox_path(), "lstat_dirtarget"); - - p_mkdir("lstat_dirtarget", 0777); - do_symlink(git_buf_cstr(&target_path), "lstat_dirlink", 1); - - cl_must_pass(p_lstat("lstat_dirtarget", &st)); - cl_assert(S_ISDIR(st.st_mode)); - - cl_must_pass(p_lstat("lstat_dirlink", &st)); - cl_assert(S_ISLNK(st.st_mode)); - cl_assert_equal_i(git_buf_len(&target_path), st.st_size); - - git_buf_free(&target_path); -} - -void test_core_link__lstat_dangling_symlink(void) -{ - struct stat st; - - if (!should_run()) - clar__skip(); - - do_symlink("lstat_nonexistent", "lstat_dangling", 0); - - cl_must_fail(p_lstat("lstat_nonexistent", &st)); - - cl_must_pass(p_lstat("lstat_dangling", &st)); - cl_assert(S_ISLNK(st.st_mode)); - cl_assert_equal_i(strlen("lstat_nonexistent"), st.st_size); -} - -void test_core_link__lstat_dangling_symlink_directory(void) -{ - struct stat st; - - if (!should_run()) - clar__skip(); - - do_symlink("lstat_nonexistent", "lstat_dangling_dir", 1); - - cl_must_fail(p_lstat("lstat_nonexistent", &st)); - - cl_must_pass(p_lstat("lstat_dangling_dir", &st)); - cl_assert(S_ISLNK(st.st_mode)); - cl_assert_equal_i(strlen("lstat_nonexistent"), st.st_size); -} - -void test_core_link__stat_junction(void) -{ -#ifdef GIT_WIN32 - git_buf target_path = GIT_BUF_INIT; - struct stat st; - - git_buf_join(&target_path, '/', clar_sandbox_path(), "stat_junctarget"); - - p_mkdir("stat_junctarget", 0777); - do_junction(git_buf_cstr(&target_path), "stat_junction"); - - cl_must_pass(p_stat("stat_junctarget", &st)); - cl_assert(S_ISDIR(st.st_mode)); - - cl_must_pass(p_stat("stat_junction", &st)); - cl_assert(S_ISDIR(st.st_mode)); - - git_buf_free(&target_path); -#endif -} - -void test_core_link__stat_dangling_junction(void) -{ -#ifdef GIT_WIN32 - git_buf target_path = GIT_BUF_INIT; - struct stat st; - - git_buf_join(&target_path, '/', clar_sandbox_path(), "stat_nonexistent_junctarget"); - - p_mkdir("stat_nonexistent_junctarget", 0777); - do_junction(git_buf_cstr(&target_path), "stat_dangling_junction"); - - RemoveDirectory("stat_nonexistent_junctarget"); - - cl_must_fail(p_stat("stat_nonexistent_junctarget", &st)); - cl_must_fail(p_stat("stat_dangling_junction", &st)); - - git_buf_free(&target_path); -#endif -} - -void test_core_link__lstat_junction(void) -{ -#ifdef GIT_WIN32 - git_buf target_path = GIT_BUF_INIT; - struct stat st; - - git_buf_join(&target_path, '/', clar_sandbox_path(), "lstat_junctarget"); - - p_mkdir("lstat_junctarget", 0777); - do_junction(git_buf_cstr(&target_path), "lstat_junction"); - - cl_must_pass(p_lstat("lstat_junctarget", &st)); - cl_assert(S_ISDIR(st.st_mode)); - - cl_must_pass(p_lstat("lstat_junction", &st)); - cl_assert(S_ISLNK(st.st_mode)); - - git_buf_free(&target_path); -#endif -} - -void test_core_link__lstat_dangling_junction(void) -{ -#ifdef GIT_WIN32 - git_buf target_path = GIT_BUF_INIT; - struct stat st; - - git_buf_join(&target_path, '/', clar_sandbox_path(), "lstat_nonexistent_junctarget"); - - p_mkdir("lstat_nonexistent_junctarget", 0777); - do_junction(git_buf_cstr(&target_path), "lstat_dangling_junction"); - - RemoveDirectory("lstat_nonexistent_junctarget"); - - cl_must_fail(p_lstat("lstat_nonexistent_junctarget", &st)); - - cl_must_pass(p_lstat("lstat_dangling_junction", &st)); - cl_assert(S_ISLNK(st.st_mode)); - cl_assert_equal_i(git_buf_len(&target_path), st.st_size); - - git_buf_free(&target_path); -#endif -} - -void test_core_link__stat_hardlink(void) -{ - struct stat st; - - if (!should_run()) - clar__skip(); - - cl_git_rewritefile("stat_hardlink1", "This file has many names!\n"); - do_hardlink("stat_hardlink1", "stat_hardlink2"); - - cl_must_pass(p_stat("stat_hardlink1", &st)); - cl_assert(S_ISREG(st.st_mode)); - cl_assert_equal_i(26, st.st_size); - - cl_must_pass(p_stat("stat_hardlink2", &st)); - cl_assert(S_ISREG(st.st_mode)); - cl_assert_equal_i(26, st.st_size); -} - -void test_core_link__lstat_hardlink(void) -{ - struct stat st; - - if (!should_run()) - clar__skip(); - - cl_git_rewritefile("lstat_hardlink1", "This file has many names!\n"); - do_hardlink("lstat_hardlink1", "lstat_hardlink2"); - - cl_must_pass(p_lstat("lstat_hardlink1", &st)); - cl_assert(S_ISREG(st.st_mode)); - cl_assert_equal_i(26, st.st_size); - - cl_must_pass(p_lstat("lstat_hardlink2", &st)); - cl_assert(S_ISREG(st.st_mode)); - cl_assert_equal_i(26, st.st_size); -} - -void test_core_link__stat_reparse_point(void) -{ -#ifdef GIT_WIN32 - struct stat st; - - /* Generic reparse points should be treated as regular files, only - * symlinks and junctions should be treated as links. - */ - - cl_git_rewritefile("stat_reparse", "This is a reparse point!\n"); - do_custom_reparse("stat_reparse"); - - cl_must_pass(p_lstat("stat_reparse", &st)); - cl_assert(S_ISREG(st.st_mode)); - cl_assert_equal_i(25, st.st_size); -#endif -} - -void test_core_link__lstat_reparse_point(void) -{ -#ifdef GIT_WIN32 - struct stat st; - - cl_git_rewritefile("lstat_reparse", "This is a reparse point!\n"); - do_custom_reparse("lstat_reparse"); - - cl_must_pass(p_lstat("lstat_reparse", &st)); - cl_assert(S_ISREG(st.st_mode)); - cl_assert_equal_i(25, st.st_size); -#endif -} - -void test_core_link__readlink_nonexistent_file(void) -{ - char buf[2048]; - - cl_must_fail(p_readlink("readlink_nonexistent", buf, 2048)); - cl_assert_equal_i(ENOENT, errno); -} - -void test_core_link__readlink_normal_file(void) -{ - char buf[2048]; - - cl_git_rewritefile("readlink_regfile", "This is a regular file!\n"); - cl_must_fail(p_readlink("readlink_regfile", buf, 2048)); - cl_assert_equal_i(EINVAL, errno); -} - -void test_core_link__readlink_symlink(void) -{ - git_buf target_path = GIT_BUF_INIT; - int len; - char buf[2048]; - - if (!should_run()) - clar__skip(); - - git_buf_join(&target_path, '/', clar_sandbox_path(), "readlink_target"); - - cl_git_rewritefile("readlink_target", "This is the target of a symlink\n"); - do_symlink(git_buf_cstr(&target_path), "readlink_link", 0); - - len = p_readlink("readlink_link", buf, 2048); - cl_must_pass(len); - - buf[len] = 0; - - cl_assert_equal_s(git_buf_cstr(&target_path), buf); - - git_buf_free(&target_path); -} - -void test_core_link__readlink_dangling(void) -{ - git_buf target_path = GIT_BUF_INIT; - int len; - char buf[2048]; - - if (!should_run()) - clar__skip(); - - git_buf_join(&target_path, '/', clar_sandbox_path(), "readlink_nonexistent"); - - do_symlink(git_buf_cstr(&target_path), "readlink_dangling", 0); - - len = p_readlink("readlink_dangling", buf, 2048); - cl_must_pass(len); - - buf[len] = 0; - - cl_assert_equal_s(git_buf_cstr(&target_path), buf); - - git_buf_free(&target_path); -} - -void test_core_link__readlink_multiple(void) -{ - git_buf target_path = GIT_BUF_INIT, - path3 = GIT_BUF_INIT, path2 = GIT_BUF_INIT, path1 = GIT_BUF_INIT; - int len; - char buf[2048]; - - if (!should_run()) - clar__skip(); - - git_buf_join(&target_path, '/', clar_sandbox_path(), "readlink_final"); - git_buf_join(&path3, '/', clar_sandbox_path(), "readlink_3"); - git_buf_join(&path2, '/', clar_sandbox_path(), "readlink_2"); - git_buf_join(&path1, '/', clar_sandbox_path(), "readlink_1"); - - do_symlink(git_buf_cstr(&target_path), git_buf_cstr(&path3), 0); - do_symlink(git_buf_cstr(&path3), git_buf_cstr(&path2), 0); - do_symlink(git_buf_cstr(&path2), git_buf_cstr(&path1), 0); - - len = p_readlink("readlink_1", buf, 2048); - cl_must_pass(len); - - buf[len] = 0; - - cl_assert_equal_s(git_buf_cstr(&path2), buf); - - git_buf_free(&path1); - git_buf_free(&path2); - git_buf_free(&path3); - git_buf_free(&target_path); -} diff --git a/vendor/libgit2/tests/core/mkdir.c b/vendor/libgit2/tests/core/mkdir.c deleted file mode 100644 index f76fe1da9f..0000000000 --- a/vendor/libgit2/tests/core/mkdir.c +++ /dev/null @@ -1,219 +0,0 @@ -#include "clar_libgit2.h" -#include "fileops.h" -#include "path.h" -#include "posix.h" - -static void cleanup_basic_dirs(void *ref) -{ - GIT_UNUSED(ref); - git_futils_rmdir_r("d0", NULL, GIT_RMDIR_EMPTY_HIERARCHY); - git_futils_rmdir_r("d1", NULL, GIT_RMDIR_EMPTY_HIERARCHY); - git_futils_rmdir_r("d2", NULL, GIT_RMDIR_EMPTY_HIERARCHY); - git_futils_rmdir_r("d3", NULL, GIT_RMDIR_EMPTY_HIERARCHY); - git_futils_rmdir_r("d4", NULL, GIT_RMDIR_EMPTY_HIERARCHY); -} - -void test_core_mkdir__basic(void) -{ - cl_set_cleanup(cleanup_basic_dirs, NULL); - - /* make a directory */ - cl_assert(!git_path_isdir("d0")); - cl_git_pass(git_futils_mkdir("d0", NULL, 0755, 0)); - cl_assert(git_path_isdir("d0")); - - /* make a path */ - cl_assert(!git_path_isdir("d1")); - cl_git_pass(git_futils_mkdir("d1/d1.1/d1.2", NULL, 0755, GIT_MKDIR_PATH)); - cl_assert(git_path_isdir("d1")); - cl_assert(git_path_isdir("d1/d1.1")); - cl_assert(git_path_isdir("d1/d1.1/d1.2")); - - /* make a dir exclusively */ - cl_assert(!git_path_isdir("d2")); - cl_git_pass(git_futils_mkdir("d2", NULL, 0755, GIT_MKDIR_EXCL)); - cl_assert(git_path_isdir("d2")); - - /* make exclusive failure */ - cl_git_fail(git_futils_mkdir("d2", NULL, 0755, GIT_MKDIR_EXCL)); - - /* make a path exclusively */ - cl_assert(!git_path_isdir("d3")); - cl_git_pass(git_futils_mkdir("d3/d3.1/d3.2", NULL, 0755, GIT_MKDIR_PATH | GIT_MKDIR_EXCL)); - cl_assert(git_path_isdir("d3")); - cl_assert(git_path_isdir("d3/d3.1/d3.2")); - - /* make exclusive path failure */ - cl_git_fail(git_futils_mkdir("d3/d3.1/d3.2", NULL, 0755, GIT_MKDIR_PATH | GIT_MKDIR_EXCL)); - /* ??? Should EXCL only apply to the last item in the path? */ - - /* path with trailing slash? */ - cl_assert(!git_path_isdir("d4")); - cl_git_pass(git_futils_mkdir("d4/d4.1/", NULL, 0755, GIT_MKDIR_PATH)); - cl_assert(git_path_isdir("d4/d4.1")); -} - -static void cleanup_basedir(void *ref) -{ - GIT_UNUSED(ref); - git_futils_rmdir_r("base", NULL, GIT_RMDIR_EMPTY_HIERARCHY); -} - -void test_core_mkdir__with_base(void) -{ -#define BASEDIR "base/dir/here" - - cl_set_cleanup(cleanup_basedir, NULL); - - cl_git_pass(git_futils_mkdir(BASEDIR, NULL, 0755, GIT_MKDIR_PATH)); - - cl_git_pass(git_futils_mkdir("a", BASEDIR, 0755, 0)); - cl_assert(git_path_isdir(BASEDIR "/a")); - - cl_git_pass(git_futils_mkdir("b/b1/b2", BASEDIR, 0755, GIT_MKDIR_PATH)); - cl_assert(git_path_isdir(BASEDIR "/b/b1/b2")); - - /* exclusive with existing base */ - cl_git_pass(git_futils_mkdir("c/c1/c2", BASEDIR, 0755, GIT_MKDIR_PATH | GIT_MKDIR_EXCL)); - - /* fail: exclusive with duplicated suffix */ - cl_git_fail(git_futils_mkdir("c/c1/c3", BASEDIR, 0755, GIT_MKDIR_PATH | GIT_MKDIR_EXCL)); - - /* fail: exclusive with any duplicated component */ - cl_git_fail(git_futils_mkdir("c/cz/cz", BASEDIR, 0755, GIT_MKDIR_PATH | GIT_MKDIR_EXCL)); - - /* success: exclusive without path */ - cl_git_pass(git_futils_mkdir("c/c1/c3", BASEDIR, 0755, GIT_MKDIR_EXCL)); - - /* path with shorter base and existing dirs */ - cl_git_pass(git_futils_mkdir("dir/here/d/", "base", 0755, GIT_MKDIR_PATH)); - cl_assert(git_path_isdir("base/dir/here/d")); - - /* fail: path with shorter base and existing dirs */ - cl_git_fail(git_futils_mkdir("dir/here/e/", "base", 0755, GIT_MKDIR_PATH | GIT_MKDIR_EXCL)); - - /* fail: base with missing components */ - cl_git_fail(git_futils_mkdir("f/", "base/missing", 0755, GIT_MKDIR_PATH)); - - /* success: shift missing component to path */ - cl_git_pass(git_futils_mkdir("missing/f/", "base/", 0755, GIT_MKDIR_PATH)); -} - -static void cleanup_chmod_root(void *ref) -{ - mode_t *mode = ref; - - if (mode != NULL) { - (void)p_umask(*mode); - git__free(mode); - } - - git_futils_rmdir_r("r", NULL, GIT_RMDIR_EMPTY_HIERARCHY); -} - -#define check_mode(X,A) check_mode_at_line((X), (A), __FILE__, __LINE__) - -static void check_mode_at_line( - mode_t expected, mode_t actual, const char *file, int line) -{ - /* FAT filesystems don't support exec bit, nor group/world bits */ - if (!cl_is_chmod_supported()) { - expected &= 0600; - actual &= 0600; - } - - clar__assert_equal( - file, line, "expected_mode != actual_mode", 1, - "%07o", (int)expected, (int)(actual & 0777)); -} - -void test_core_mkdir__chmods(void) -{ - struct stat st; - mode_t *old = git__malloc(sizeof(mode_t)); - *old = p_umask(022); - - cl_set_cleanup(cleanup_chmod_root, old); - - cl_git_pass(git_futils_mkdir("r", NULL, 0777, 0)); - - cl_git_pass(git_futils_mkdir("mode/is/important", "r", 0777, GIT_MKDIR_PATH)); - - cl_git_pass(git_path_lstat("r/mode", &st)); - check_mode(0755, st.st_mode); - cl_git_pass(git_path_lstat("r/mode/is", &st)); - check_mode(0755, st.st_mode); - cl_git_pass(git_path_lstat("r/mode/is/important", &st)); - check_mode(0755, st.st_mode); - - cl_git_pass(git_futils_mkdir("mode2/is2/important2", "r", 0777, GIT_MKDIR_PATH | GIT_MKDIR_CHMOD)); - - cl_git_pass(git_path_lstat("r/mode2", &st)); - check_mode(0755, st.st_mode); - cl_git_pass(git_path_lstat("r/mode2/is2", &st)); - check_mode(0755, st.st_mode); - cl_git_pass(git_path_lstat("r/mode2/is2/important2", &st)); - check_mode(0777, st.st_mode); - - cl_git_pass(git_futils_mkdir("mode3/is3/important3", "r", 0777, GIT_MKDIR_PATH | GIT_MKDIR_CHMOD_PATH)); - - cl_git_pass(git_path_lstat("r/mode3", &st)); - check_mode(0777, st.st_mode); - cl_git_pass(git_path_lstat("r/mode3/is3", &st)); - check_mode(0777, st.st_mode); - cl_git_pass(git_path_lstat("r/mode3/is3/important3", &st)); - check_mode(0777, st.st_mode); - - /* test that we chmod existing dir */ - - cl_git_pass(git_futils_mkdir("mode/is/important", "r", 0777, GIT_MKDIR_PATH | GIT_MKDIR_CHMOD)); - - cl_git_pass(git_path_lstat("r/mode", &st)); - check_mode(0755, st.st_mode); - cl_git_pass(git_path_lstat("r/mode/is", &st)); - check_mode(0755, st.st_mode); - cl_git_pass(git_path_lstat("r/mode/is/important", &st)); - check_mode(0777, st.st_mode); - - /* test that we chmod even existing dirs if CHMOD_PATH is set */ - - cl_git_pass(git_futils_mkdir("mode2/is2/important2.1", "r", 0777, GIT_MKDIR_PATH | GIT_MKDIR_CHMOD_PATH)); - - cl_git_pass(git_path_lstat("r/mode2", &st)); - check_mode(0777, st.st_mode); - cl_git_pass(git_path_lstat("r/mode2/is2", &st)); - check_mode(0777, st.st_mode); - cl_git_pass(git_path_lstat("r/mode2/is2/important2.1", &st)); - check_mode(0777, st.st_mode); -} - -void test_core_mkdir__mkdir_path_inside_unwriteable_parent(void) -{ - struct stat st; - mode_t *old; - - /* FAT filesystems don't support exec bit, nor group/world bits */ - if (!cl_is_chmod_supported()) - return; - - cl_assert((old = git__malloc(sizeof(mode_t))) != NULL); - *old = p_umask(022); - cl_set_cleanup(cleanup_chmod_root, old); - - cl_git_pass(git_futils_mkdir("r", NULL, 0777, 0)); - cl_git_pass(git_futils_mkdir("mode/is/important", "r", 0777, GIT_MKDIR_PATH)); - cl_git_pass(git_path_lstat("r/mode", &st)); - check_mode(0755, st.st_mode); - - cl_must_pass(p_chmod("r/mode", 0111)); - cl_git_pass(git_path_lstat("r/mode", &st)); - check_mode(0111, st.st_mode); - - cl_git_pass( - git_futils_mkdir("mode/is/okay/inside", "r", 0777, GIT_MKDIR_PATH)); - cl_git_pass(git_path_lstat("r/mode/is/okay/inside", &st)); - check_mode(0755, st.st_mode); - - cl_must_pass(p_chmod("r/mode", 0777)); -} - diff --git a/vendor/libgit2/tests/core/oid.c b/vendor/libgit2/tests/core/oid.c deleted file mode 100644 index 7ee6fb67da..0000000000 --- a/vendor/libgit2/tests/core/oid.c +++ /dev/null @@ -1,70 +0,0 @@ -#include "clar_libgit2.h" - -static git_oid id; -static git_oid idp; -static git_oid idm; -const char *str_oid = "ae90f12eea699729ed24555e40b9fd669da12a12"; -const char *str_oid_p = "ae90f12eea699729ed"; -const char *str_oid_m = "ae90f12eea699729ed24555e40b9fd669da12a12THIS IS EXTRA TEXT THAT SHOULD GET IGNORED"; - -void test_core_oid__initialize(void) -{ - cl_git_pass(git_oid_fromstr(&id, str_oid)); - cl_git_pass(git_oid_fromstrp(&idp, str_oid_p)); - cl_git_fail(git_oid_fromstrp(&idm, str_oid_m)); -} - -void test_core_oid__streq(void) -{ - cl_assert_equal_i(0, git_oid_streq(&id, str_oid)); - cl_assert_equal_i(-1, git_oid_streq(&id, "deadbeefdeadbeefdeadbeefdeadbeefdeadbeef")); - - cl_assert_equal_i(-1, git_oid_streq(&id, "deadbeef")); - cl_assert_equal_i(-1, git_oid_streq(&id, "I'm not an oid.... :)")); - - cl_assert_equal_i(0, git_oid_streq(&idp, "ae90f12eea699729ed0000000000000000000000")); - cl_assert_equal_i(0, git_oid_streq(&idp, "ae90f12eea699729ed")); - cl_assert_equal_i(-1, git_oid_streq(&idp, "ae90f12eea699729ed1")); - cl_assert_equal_i(-1, git_oid_streq(&idp, "ae90f12eea699729ec")); - cl_assert_equal_i(-1, git_oid_streq(&idp, "deadbeefdeadbeefdeadbeefdeadbeefdeadbeef")); - - cl_assert_equal_i(-1, git_oid_streq(&idp, "deadbeef")); - cl_assert_equal_i(-1, git_oid_streq(&idp, "I'm not an oid.... :)")); -} - -void test_core_oid__strcmp(void) -{ - cl_assert_equal_i(0, git_oid_strcmp(&id, str_oid)); - cl_assert(git_oid_strcmp(&id, "deadbeefdeadbeefdeadbeefdeadbeefdeadbeef") < 0); - - cl_assert(git_oid_strcmp(&id, "deadbeef") < 0); - cl_assert_equal_i(-1, git_oid_strcmp(&id, "I'm not an oid.... :)")); - - cl_assert_equal_i(0, git_oid_strcmp(&idp, "ae90f12eea699729ed0000000000000000000000")); - cl_assert_equal_i(0, git_oid_strcmp(&idp, "ae90f12eea699729ed")); - cl_assert(git_oid_strcmp(&idp, "ae90f12eea699729ed1") < 0); - cl_assert(git_oid_strcmp(&idp, "ae90f12eea699729ec") > 0); - cl_assert(git_oid_strcmp(&idp, "deadbeefdeadbeefdeadbeefdeadbeefdeadbeef") < 0); - - cl_assert(git_oid_strcmp(&idp, "deadbeef") < 0); - cl_assert_equal_i(-1, git_oid_strcmp(&idp, "I'm not an oid.... :)")); -} - -void test_core_oid__ncmp(void) -{ - cl_assert(!git_oid_ncmp(&id, &idp, 0)); - cl_assert(!git_oid_ncmp(&id, &idp, 1)); - cl_assert(!git_oid_ncmp(&id, &idp, 2)); - cl_assert(!git_oid_ncmp(&id, &idp, 17)); - cl_assert(!git_oid_ncmp(&id, &idp, 18)); - cl_assert(git_oid_ncmp(&id, &idp, 19)); - cl_assert(git_oid_ncmp(&id, &idp, 40)); - cl_assert(git_oid_ncmp(&id, &idp, 41)); - cl_assert(git_oid_ncmp(&id, &idp, 42)); - - cl_assert(!git_oid_ncmp(&id, &id, 0)); - cl_assert(!git_oid_ncmp(&id, &id, 1)); - cl_assert(!git_oid_ncmp(&id, &id, 39)); - cl_assert(!git_oid_ncmp(&id, &id, 40)); - cl_assert(!git_oid_ncmp(&id, &id, 41)); -} diff --git a/vendor/libgit2/tests/core/oidmap.c b/vendor/libgit2/tests/core/oidmap.c deleted file mode 100644 index 556a6ca4ac..0000000000 --- a/vendor/libgit2/tests/core/oidmap.c +++ /dev/null @@ -1,110 +0,0 @@ -#include "clar_libgit2.h" -#include "oidmap.h" - -GIT__USE_OIDMAP - -typedef struct { - git_oid oid; - size_t extra; -} oidmap_item; - -#define NITEMS 0x0fff - -void test_core_oidmap__basic(void) -{ - git_oidmap *map; - oidmap_item items[NITEMS]; - uint32_t i, j; - - for (i = 0; i < NITEMS; ++i) { - items[i].extra = i; - for (j = 0; j < GIT_OID_RAWSZ / 4; ++j) { - items[i].oid.id[j * 4 ] = (unsigned char)i; - items[i].oid.id[j * 4 + 1] = (unsigned char)(i >> 8); - items[i].oid.id[j * 4 + 2] = (unsigned char)(i >> 16); - items[i].oid.id[j * 4 + 3] = (unsigned char)(i >> 24); - } - } - - map = git_oidmap_alloc(); - cl_assert(map != NULL); - - for (i = 0; i < NITEMS; ++i) { - khiter_t pos; - int ret; - - pos = kh_get(oid, map, &items[i].oid); - cl_assert(pos == kh_end(map)); - - pos = kh_put(oid, map, &items[i].oid, &ret); - cl_assert(ret != 0); - - kh_val(map, pos) = &items[i]; - } - - - for (i = 0; i < NITEMS; ++i) { - khiter_t pos; - - pos = kh_get(oid, map, &items[i].oid); - cl_assert(pos != kh_end(map)); - - cl_assert_equal_p(kh_val(map, pos), &items[i]); - } - - git_oidmap_free(map); -} - -void test_core_oidmap__hash_collision(void) -{ - git_oidmap *map; - oidmap_item items[NITEMS]; - uint32_t i, j; - - for (i = 0; i < NITEMS; ++i) { - uint32_t segment = i / 8; - int modi = i - (segment * 8); - - items[i].extra = i; - - for (j = 0; j < GIT_OID_RAWSZ / 4; ++j) { - items[i].oid.id[j * 4 ] = (unsigned char)modi; - items[i].oid.id[j * 4 + 1] = (unsigned char)(modi >> 8); - items[i].oid.id[j * 4 + 2] = (unsigned char)(modi >> 16); - items[i].oid.id[j * 4 + 3] = (unsigned char)(modi >> 24); - } - - items[i].oid.id[ 8] = (unsigned char)i; - items[i].oid.id[ 9] = (unsigned char)(i >> 8); - items[i].oid.id[10] = (unsigned char)(i >> 16); - items[i].oid.id[11] = (unsigned char)(i >> 24); - } - - map = git_oidmap_alloc(); - cl_assert(map != NULL); - - for (i = 0; i < NITEMS; ++i) { - khiter_t pos; - int ret; - - pos = kh_get(oid, map, &items[i].oid); - cl_assert(pos == kh_end(map)); - - pos = kh_put(oid, map, &items[i].oid, &ret); - cl_assert(ret != 0); - - kh_val(map, pos) = &items[i]; - } - - - for (i = 0; i < NITEMS; ++i) { - khiter_t pos; - - pos = kh_get(oid, map, &items[i].oid); - cl_assert(pos != kh_end(map)); - - cl_assert_equal_p(kh_val(map, pos), &items[i]); - } - - git_oidmap_free(map); -} diff --git a/vendor/libgit2/tests/core/opts.c b/vendor/libgit2/tests/core/opts.c deleted file mode 100644 index 3173c648b2..0000000000 --- a/vendor/libgit2/tests/core/opts.c +++ /dev/null @@ -1,19 +0,0 @@ -#include "clar_libgit2.h" -#include "cache.h" - -void test_core_opts__readwrite(void) -{ - size_t old_val = 0; - size_t new_val = 0; - - git_libgit2_opts(GIT_OPT_GET_MWINDOW_SIZE, &old_val); - git_libgit2_opts(GIT_OPT_SET_MWINDOW_SIZE, (size_t)1234); - git_libgit2_opts(GIT_OPT_GET_MWINDOW_SIZE, &new_val); - - cl_assert(new_val == 1234); - - git_libgit2_opts(GIT_OPT_SET_MWINDOW_SIZE, old_val); - git_libgit2_opts(GIT_OPT_GET_MWINDOW_SIZE, &new_val); - - cl_assert(new_val == old_val); -} diff --git a/vendor/libgit2/tests/core/path.c b/vendor/libgit2/tests/core/path.c deleted file mode 100644 index c3e622f022..0000000000 --- a/vendor/libgit2/tests/core/path.c +++ /dev/null @@ -1,654 +0,0 @@ -#include "clar_libgit2.h" -#include "fileops.h" - -static void -check_dirname(const char *A, const char *B) -{ - git_buf dir = GIT_BUF_INIT; - char *dir2; - - cl_assert(git_path_dirname_r(&dir, A) >= 0); - cl_assert_equal_s(B, dir.ptr); - git_buf_free(&dir); - - cl_assert((dir2 = git_path_dirname(A)) != NULL); - cl_assert_equal_s(B, dir2); - git__free(dir2); -} - -static void -check_basename(const char *A, const char *B) -{ - git_buf base = GIT_BUF_INIT; - char *base2; - - cl_assert(git_path_basename_r(&base, A) >= 0); - cl_assert_equal_s(B, base.ptr); - git_buf_free(&base); - - cl_assert((base2 = git_path_basename(A)) != NULL); - cl_assert_equal_s(B, base2); - git__free(base2); -} - -static void -check_topdir(const char *A, const char *B) -{ - const char *dir; - - cl_assert((dir = git_path_topdir(A)) != NULL); - cl_assert_equal_s(B, dir); -} - -static void -check_joinpath(const char *path_a, const char *path_b, const char *expected_path) -{ - git_buf joined_path = GIT_BUF_INIT; - - cl_git_pass(git_buf_joinpath(&joined_path, path_a, path_b)); - cl_assert_equal_s(expected_path, joined_path.ptr); - - git_buf_free(&joined_path); -} - -static void -check_joinpath_n( - const char *path_a, - const char *path_b, - const char *path_c, - const char *path_d, - const char *expected_path) -{ - git_buf joined_path = GIT_BUF_INIT; - - cl_git_pass(git_buf_join_n(&joined_path, '/', 4, - path_a, path_b, path_c, path_d)); - cl_assert_equal_s(expected_path, joined_path.ptr); - - git_buf_free(&joined_path); -} - - -/* get the dirname of a path */ -void test_core_path__00_dirname(void) -{ - check_dirname(NULL, "."); - check_dirname("", "."); - check_dirname("a", "."); - check_dirname("/", "/"); - check_dirname("/usr", "/"); - check_dirname("/usr/", "/"); - check_dirname("/usr/lib", "/usr"); - check_dirname("/usr/lib/", "/usr"); - check_dirname("/usr/lib//", "/usr"); - check_dirname("usr/lib", "usr"); - check_dirname("usr/lib/", "usr"); - check_dirname("usr/lib//", "usr"); - check_dirname(".git/", "."); - - check_dirname(REP16("/abc"), REP15("/abc")); - -#ifdef GIT_WIN32 - check_dirname("C:/path/", "C:/"); - check_dirname("C:/path", "C:/"); - check_dirname("//computername/path/", "//computername/"); - check_dirname("//computername/path", "//computername/"); - check_dirname("//computername/sub/path/", "//computername/sub"); - check_dirname("//computername/sub/path", "//computername/sub"); -#endif -} - -/* get the base name of a path */ -void test_core_path__01_basename(void) -{ - check_basename(NULL, "."); - check_basename("", "."); - check_basename("a", "a"); - check_basename("/", "/"); - check_basename("/usr", "usr"); - check_basename("/usr/", "usr"); - check_basename("/usr/lib", "lib"); - check_basename("/usr/lib//", "lib"); - check_basename("usr/lib", "lib"); - - check_basename(REP16("/abc"), "abc"); - check_basename(REP1024("/abc"), "abc"); -} - -/* get the latest component in a path */ -void test_core_path__02_topdir(void) -{ - check_topdir(".git/", ".git/"); - check_topdir("/.git/", ".git/"); - check_topdir("usr/local/.git/", ".git/"); - check_topdir("./.git/", ".git/"); - check_topdir("/usr/.git/", ".git/"); - check_topdir("/", "/"); - check_topdir("a/", "a/"); - - cl_assert(git_path_topdir("/usr/.git") == NULL); - cl_assert(git_path_topdir(".") == NULL); - cl_assert(git_path_topdir("") == NULL); - cl_assert(git_path_topdir("a") == NULL); -} - -/* properly join path components */ -void test_core_path__05_joins(void) -{ - check_joinpath("", "", ""); - check_joinpath("", "a", "a"); - check_joinpath("", "/a", "/a"); - check_joinpath("a", "", "a/"); - check_joinpath("a", "/", "a/"); - check_joinpath("a", "b", "a/b"); - check_joinpath("/", "a", "/a"); - check_joinpath("/", "", "/"); - check_joinpath("/a", "/b", "/a/b"); - check_joinpath("/a", "/b/", "/a/b/"); - check_joinpath("/a/", "b/", "/a/b/"); - check_joinpath("/a/", "/b/", "/a/b/"); - - check_joinpath("/abcd", "/defg", "/abcd/defg"); - check_joinpath("/abcd", "/defg/", "/abcd/defg/"); - check_joinpath("/abcd/", "defg/", "/abcd/defg/"); - check_joinpath("/abcd/", "/defg/", "/abcd/defg/"); - - check_joinpath("/abcdefgh", "/12345678", "/abcdefgh/12345678"); - check_joinpath("/abcdefgh", "/12345678/", "/abcdefgh/12345678/"); - check_joinpath("/abcdefgh/", "12345678/", "/abcdefgh/12345678/"); - - check_joinpath(REP1024("aaaa"), "", REP1024("aaaa") "/"); - check_joinpath(REP1024("aaaa/"), "", REP1024("aaaa/")); - check_joinpath(REP1024("/aaaa"), "", REP1024("/aaaa") "/"); - - check_joinpath(REP1024("aaaa"), REP1024("bbbb"), - REP1024("aaaa") "/" REP1024("bbbb")); - check_joinpath(REP1024("/aaaa"), REP1024("/bbbb"), - REP1024("/aaaa") REP1024("/bbbb")); -} - -/* properly join path components for more than one path */ -void test_core_path__06_long_joins(void) -{ - check_joinpath_n("", "", "", "", ""); - check_joinpath_n("", "a", "", "", "a/"); - check_joinpath_n("a", "", "", "", "a/"); - check_joinpath_n("", "", "", "a", "a"); - check_joinpath_n("a", "b", "", "/c/d/", "a/b/c/d/"); - check_joinpath_n("a", "b", "", "/c/d", "a/b/c/d"); - check_joinpath_n("abcd", "efgh", "ijkl", "mnop", "abcd/efgh/ijkl/mnop"); - check_joinpath_n("abcd/", "efgh/", "ijkl/", "mnop/", "abcd/efgh/ijkl/mnop/"); - check_joinpath_n("/abcd/", "/efgh/", "/ijkl/", "/mnop/", "/abcd/efgh/ijkl/mnop/"); - - check_joinpath_n(REP1024("a"), REP1024("b"), REP1024("c"), REP1024("d"), - REP1024("a") "/" REP1024("b") "/" - REP1024("c") "/" REP1024("d")); - check_joinpath_n(REP1024("/a"), REP1024("/b"), REP1024("/c"), REP1024("/d"), - REP1024("/a") REP1024("/b") - REP1024("/c") REP1024("/d")); -} - - -static void -check_path_to_dir( - const char* path, - const char* expected) -{ - git_buf tgt = GIT_BUF_INIT; - - git_buf_sets(&tgt, path); - cl_git_pass(git_path_to_dir(&tgt)); - cl_assert_equal_s(expected, tgt.ptr); - - git_buf_free(&tgt); -} - -static void -check_string_to_dir( - const char* path, - size_t maxlen, - const char* expected) -{ - size_t len = strlen(path); - char *buf = git__malloc(len + 2); - cl_assert(buf); - - strncpy(buf, path, len + 2); - - git_path_string_to_dir(buf, maxlen); - - cl_assert_equal_s(expected, buf); - - git__free(buf); -} - -/* convert paths to dirs */ -void test_core_path__07_path_to_dir(void) -{ - check_path_to_dir("", ""); - check_path_to_dir(".", "./"); - check_path_to_dir("./", "./"); - check_path_to_dir("a/", "a/"); - check_path_to_dir("ab", "ab/"); - /* make sure we try just under and just over an expansion that will - * require a realloc - */ - check_path_to_dir("abcdef", "abcdef/"); - check_path_to_dir("abcdefg", "abcdefg/"); - check_path_to_dir("abcdefgh", "abcdefgh/"); - check_path_to_dir("abcdefghi", "abcdefghi/"); - check_path_to_dir(REP1024("abcd") "/", REP1024("abcd") "/"); - check_path_to_dir(REP1024("abcd"), REP1024("abcd") "/"); - - check_string_to_dir("", 1, ""); - check_string_to_dir(".", 1, "."); - check_string_to_dir(".", 2, "./"); - check_string_to_dir(".", 3, "./"); - check_string_to_dir("abcd", 3, "abcd"); - check_string_to_dir("abcd", 4, "abcd"); - check_string_to_dir("abcd", 5, "abcd/"); - check_string_to_dir("abcd", 6, "abcd/"); -} - -/* join path to itself */ -void test_core_path__08_self_join(void) -{ - git_buf path = GIT_BUF_INIT; - size_t asize = 0; - - asize = path.asize; - cl_git_pass(git_buf_sets(&path, "/foo")); - cl_assert_equal_s(path.ptr, "/foo"); - cl_assert(asize < path.asize); - - asize = path.asize; - cl_git_pass(git_buf_joinpath(&path, path.ptr, "this is a new string")); - cl_assert_equal_s(path.ptr, "/foo/this is a new string"); - cl_assert(asize < path.asize); - - asize = path.asize; - cl_git_pass(git_buf_joinpath(&path, path.ptr, "/grow the buffer, grow the buffer, grow the buffer")); - cl_assert_equal_s(path.ptr, "/foo/this is a new string/grow the buffer, grow the buffer, grow the buffer"); - cl_assert(asize < path.asize); - - git_buf_free(&path); - cl_git_pass(git_buf_sets(&path, "/foo/bar")); - - cl_git_pass(git_buf_joinpath(&path, path.ptr + 4, "baz")); - cl_assert_equal_s(path.ptr, "/bar/baz"); - - asize = path.asize; - cl_git_pass(git_buf_joinpath(&path, path.ptr + 4, "somethinglongenoughtorealloc")); - cl_assert_equal_s(path.ptr, "/baz/somethinglongenoughtorealloc"); - cl_assert(asize < path.asize); - - git_buf_free(&path); -} - -static void check_percent_decoding(const char *expected_result, const char *input) -{ - git_buf buf = GIT_BUF_INIT; - - cl_git_pass(git__percent_decode(&buf, input)); - cl_assert_equal_s(expected_result, git_buf_cstr(&buf)); - - git_buf_free(&buf); -} - -void test_core_path__09_percent_decode(void) -{ - check_percent_decoding("abcd", "abcd"); - check_percent_decoding("a2%", "a2%"); - check_percent_decoding("a2%3", "a2%3"); - check_percent_decoding("a2%%3", "a2%%3"); - check_percent_decoding("a2%3z", "a2%3z"); - check_percent_decoding("a,", "a%2c"); - check_percent_decoding("a21", "a2%31"); - check_percent_decoding("a2%1", "a2%%31"); - check_percent_decoding("a bc ", "a%20bc%20"); - check_percent_decoding("Vicent Mart" "\355", "Vicent%20Mart%ED"); -} - -static void check_fromurl(const char *expected_result, const char *input, int should_fail) -{ - git_buf buf = GIT_BUF_INIT; - - assert(should_fail || expected_result); - - if (!should_fail) { - cl_git_pass(git_path_fromurl(&buf, input)); - cl_assert_equal_s(expected_result, git_buf_cstr(&buf)); - } else - cl_git_fail(git_path_fromurl(&buf, input)); - - git_buf_free(&buf); -} - -#ifdef GIT_WIN32 -#define ABS_PATH_MARKER "" -#else -#define ABS_PATH_MARKER "/" -#endif - -void test_core_path__10_fromurl(void) -{ - /* Failing cases */ - check_fromurl(NULL, "a", 1); - check_fromurl(NULL, "http:///c:/Temp%20folder/note.txt", 1); - check_fromurl(NULL, "file://c:/Temp%20folder/note.txt", 1); - check_fromurl(NULL, "file:////c:/Temp%20folder/note.txt", 1); - check_fromurl(NULL, "file:///", 1); - check_fromurl(NULL, "file:////", 1); - check_fromurl(NULL, "file://servername/c:/Temp%20folder/note.txt", 1); - - /* Passing cases */ - check_fromurl(ABS_PATH_MARKER "c:/Temp folder/note.txt", "file:///c:/Temp%20folder/note.txt", 0); - check_fromurl(ABS_PATH_MARKER "c:/Temp folder/note.txt", "file://localhost/c:/Temp%20folder/note.txt", 0); - check_fromurl(ABS_PATH_MARKER "c:/Temp+folder/note.txt", "file:///c:/Temp+folder/note.txt", 0); - check_fromurl(ABS_PATH_MARKER "a", "file:///a", 0); -} - -typedef struct { - int expect_idx; - int cancel_after; - char **expect; -} check_walkup_info; - -#define CANCEL_VALUE 1234 - -static int check_one_walkup_step(void *ref, const char *path) -{ - check_walkup_info *info = (check_walkup_info *)ref; - - if (!info->cancel_after) { - cl_assert_equal_s(info->expect[info->expect_idx], "[CANCEL]"); - return CANCEL_VALUE; - } - info->cancel_after--; - - cl_assert(info->expect[info->expect_idx] != NULL); - cl_assert_equal_s(info->expect[info->expect_idx], path); - info->expect_idx++; - - return 0; -} - -void test_core_path__11_walkup(void) -{ - git_buf p = GIT_BUF_INIT; - - char *expect[] = { - /* 1 */ "/a/b/c/d/e/", "/a/b/c/d/", "/a/b/c/", "/a/b/", "/a/", "/", NULL, - /* 2 */ "/a/b/c/d/e", "/a/b/c/d/", "/a/b/c/", "/a/b/", "/a/", "/", NULL, - /* 3 */ "/a/b/c/d/e", "/a/b/c/d/", "/a/b/c/", "/a/b/", "/a/", "/", NULL, - /* 4 */ "/a/b/c/d/e", "/a/b/c/d/", "/a/b/c/", "/a/b/", "/a/", "/", NULL, - /* 5 */ "/a/b/c/d/e", "/a/b/c/d/", "/a/b/c/", "/a/b/", NULL, - /* 6 */ "/a/b/c/d/e", "/a/b/c/d/", "/a/b/c/", "/a/b/", NULL, - /* 7 */ "this_is_a_path", "", NULL, - /* 8 */ "this_is_a_path/", "", NULL, - /* 9 */ "///a///b///c///d///e///", "///a///b///c///d///", "///a///b///c///", "///a///b///", "///a///", "///", NULL, - /* 10 */ "a/b/c/", "a/b/", "a/", "", NULL, - /* 11 */ "a/b/c", "a/b/", "a/", "", NULL, - /* 12 */ "a/b/c/", "a/b/", "a/", NULL, - /* 13 */ "", NULL, - /* 14 */ "/", NULL, - /* 15 */ NULL - }; - - char *root[] = { - /* 1 */ NULL, - /* 2 */ NULL, - /* 3 */ "/", - /* 4 */ "", - /* 5 */ "/a/b", - /* 6 */ "/a/b/", - /* 7 */ NULL, - /* 8 */ NULL, - /* 9 */ NULL, - /* 10 */ NULL, - /* 11 */ NULL, - /* 12 */ "a/", - /* 13 */ NULL, - /* 14 */ NULL, - }; - - int i, j; - check_walkup_info info; - - info.expect = expect; - info.cancel_after = -1; - - for (i = 0, j = 0; expect[i] != NULL; i++, j++) { - - git_buf_sets(&p, expect[i]); - - info.expect_idx = i; - cl_git_pass( - git_path_walk_up(&p, root[j], check_one_walkup_step, &info) - ); - - cl_assert_equal_s(p.ptr, expect[i]); - cl_assert(expect[info.expect_idx] == NULL); - i = info.expect_idx; - } - - git_buf_free(&p); -} - -void test_core_path__11a_walkup_cancel(void) -{ - git_buf p = GIT_BUF_INIT; - int cancel[] = { 3, 2, 1, 0 }; - char *expect[] = { - "/a/b/c/d/e/", "/a/b/c/d/", "/a/b/c/", "[CANCEL]", NULL, - "/a/b/c/d/e", "/a/b/c/d/", "[CANCEL]", NULL, - "/a/b/c/d/e", "[CANCEL]", NULL, - "[CANCEL]", NULL, - NULL - }; - char *root[] = { NULL, NULL, "/", "", NULL }; - int i, j; - check_walkup_info info; - - info.expect = expect; - - for (i = 0, j = 0; expect[i] != NULL; i++, j++) { - - git_buf_sets(&p, expect[i]); - - info.cancel_after = cancel[j]; - info.expect_idx = i; - - cl_assert_equal_i( - CANCEL_VALUE, - git_path_walk_up(&p, root[j], check_one_walkup_step, &info) - ); - - /* skip to next run of expectations */ - while (expect[i] != NULL) i++; - } - - git_buf_free(&p); -} - -void test_core_path__12_offset_to_path_root(void) -{ - cl_assert(git_path_root("non/rooted/path") == -1); - cl_assert(git_path_root("/rooted/path") == 0); - -#ifdef GIT_WIN32 - /* Windows specific tests */ - cl_assert(git_path_root("C:non/rooted/path") == -1); - cl_assert(git_path_root("C:/rooted/path") == 2); - cl_assert(git_path_root("//computername/sharefolder/resource") == 14); - cl_assert(git_path_root("//computername/sharefolder") == 14); - cl_assert(git_path_root("//computername") == -1); -#endif -} - -#define NON_EXISTING_FILEPATH "i_hope_i_do_not_exist" - -void test_core_path__13_cannot_prettify_a_non_existing_file(void) -{ - git_buf p = GIT_BUF_INIT; - - cl_assert_equal_b(git_path_exists(NON_EXISTING_FILEPATH), false); - cl_assert_equal_i(GIT_ENOTFOUND, git_path_prettify(&p, NON_EXISTING_FILEPATH, NULL)); - cl_assert_equal_i(GIT_ENOTFOUND, git_path_prettify(&p, NON_EXISTING_FILEPATH "/so-do-i", NULL)); - - git_buf_free(&p); -} - -void test_core_path__14_apply_relative(void) -{ - git_buf p = GIT_BUF_INIT; - - cl_git_pass(git_buf_sets(&p, "/this/is/a/base")); - - cl_git_pass(git_path_apply_relative(&p, "../test")); - cl_assert_equal_s("/this/is/a/test", p.ptr); - - cl_git_pass(git_path_apply_relative(&p, "../../the/./end")); - cl_assert_equal_s("/this/is/the/end", p.ptr); - - cl_git_pass(git_path_apply_relative(&p, "./of/this/../the/string")); - cl_assert_equal_s("/this/is/the/end/of/the/string", p.ptr); - - cl_git_pass(git_path_apply_relative(&p, "../../../../../..")); - cl_assert_equal_s("/this/", p.ptr); - - cl_git_pass(git_path_apply_relative(&p, "../")); - cl_assert_equal_s("/", p.ptr); - - cl_git_fail(git_path_apply_relative(&p, "../../..")); - - - cl_git_pass(git_buf_sets(&p, "d:/another/test")); - - cl_git_pass(git_path_apply_relative(&p, "../..")); - cl_assert_equal_s("d:/", p.ptr); - - cl_git_pass(git_path_apply_relative(&p, "from/here/to/../and/./back/.")); - cl_assert_equal_s("d:/from/here/and/back/", p.ptr); - - - cl_git_pass(git_buf_sets(&p, "https://my.url.com/test.git")); - - cl_git_pass(git_path_apply_relative(&p, "../another.git")); - cl_assert_equal_s("https://my.url.com/another.git", p.ptr); - - cl_git_pass(git_path_apply_relative(&p, "../full/path/url.patch")); - cl_assert_equal_s("https://my.url.com/full/path/url.patch", p.ptr); - - cl_git_pass(git_path_apply_relative(&p, "..")); - cl_assert_equal_s("https://my.url.com/full/path/", p.ptr); - - cl_git_pass(git_path_apply_relative(&p, "../../../")); - cl_assert_equal_s("https://", p.ptr); - - - cl_git_pass(git_buf_sets(&p, "../../this/is/relative")); - - cl_git_pass(git_path_apply_relative(&p, "../../preserves/the/prefix")); - cl_assert_equal_s("../../this/preserves/the/prefix", p.ptr); - - cl_git_pass(git_path_apply_relative(&p, "../../../../that")); - cl_assert_equal_s("../../that", p.ptr); - - cl_git_pass(git_path_apply_relative(&p, "../there")); - cl_assert_equal_s("../../there", p.ptr); - git_buf_free(&p); -} - -static void assert_resolve_relative( - git_buf *buf, const char *expected, const char *path) -{ - cl_git_pass(git_buf_sets(buf, path)); - cl_git_pass(git_path_resolve_relative(buf, 0)); - cl_assert_equal_s(expected, buf->ptr); -} - -void test_core_path__15_resolve_relative(void) -{ - git_buf buf = GIT_BUF_INIT; - - assert_resolve_relative(&buf, "", ""); - assert_resolve_relative(&buf, "", "."); - assert_resolve_relative(&buf, "", "./"); - assert_resolve_relative(&buf, "..", ".."); - assert_resolve_relative(&buf, "../", "../"); - assert_resolve_relative(&buf, "..", "./.."); - assert_resolve_relative(&buf, "../", "./../"); - assert_resolve_relative(&buf, "../", "../."); - assert_resolve_relative(&buf, "../", ".././"); - assert_resolve_relative(&buf, "../..", "../.."); - assert_resolve_relative(&buf, "../../", "../../"); - - assert_resolve_relative(&buf, "/", "/"); - assert_resolve_relative(&buf, "/", "/."); - - assert_resolve_relative(&buf, "", "a/.."); - assert_resolve_relative(&buf, "", "a/../"); - assert_resolve_relative(&buf, "", "a/../."); - - assert_resolve_relative(&buf, "/a", "/a"); - assert_resolve_relative(&buf, "/a/", "/a/."); - assert_resolve_relative(&buf, "/", "/a/../"); - assert_resolve_relative(&buf, "/", "/a/../."); - assert_resolve_relative(&buf, "/", "/a/.././"); - - assert_resolve_relative(&buf, "a", "a"); - assert_resolve_relative(&buf, "a/", "a/"); - assert_resolve_relative(&buf, "a/", "a/."); - assert_resolve_relative(&buf, "a/", "a/./"); - - assert_resolve_relative(&buf, "a/b", "a//b"); - assert_resolve_relative(&buf, "a/b/c", "a/b/c"); - assert_resolve_relative(&buf, "b/c", "./b/c"); - assert_resolve_relative(&buf, "a/c", "a/./c"); - assert_resolve_relative(&buf, "a/b/", "a/b/."); - - assert_resolve_relative(&buf, "/a/b/c", "///a/b/c"); - assert_resolve_relative(&buf, "/", "////"); - assert_resolve_relative(&buf, "/a", "///a"); - assert_resolve_relative(&buf, "/", "///."); - assert_resolve_relative(&buf, "/", "///a/.."); - - assert_resolve_relative(&buf, "../../path", "../../test//../././path"); - assert_resolve_relative(&buf, "../d", "a/b/../../../c/../d"); - - cl_git_pass(git_buf_sets(&buf, "/..")); - cl_git_fail(git_path_resolve_relative(&buf, 0)); - - cl_git_pass(git_buf_sets(&buf, "/./..")); - cl_git_fail(git_path_resolve_relative(&buf, 0)); - - cl_git_pass(git_buf_sets(&buf, "/.//..")); - cl_git_fail(git_path_resolve_relative(&buf, 0)); - - cl_git_pass(git_buf_sets(&buf, "/../.")); - cl_git_fail(git_path_resolve_relative(&buf, 0)); - - cl_git_pass(git_buf_sets(&buf, "/../.././../a")); - cl_git_fail(git_path_resolve_relative(&buf, 0)); - - cl_git_pass(git_buf_sets(&buf, "////..")); - cl_git_fail(git_path_resolve_relative(&buf, 0)); - - /* things that start with Windows network paths */ -#ifdef GIT_WIN32 - assert_resolve_relative(&buf, "//a/b/c", "//a/b/c"); - assert_resolve_relative(&buf, "//a/", "//a/b/.."); - assert_resolve_relative(&buf, "//a/b/c", "//a/Q/../b/x/y/../../c"); - - cl_git_pass(git_buf_sets(&buf, "//a/b/../..")); - cl_git_fail(git_path_resolve_relative(&buf, 0)); -#else - assert_resolve_relative(&buf, "/a/b/c", "//a/b/c"); - assert_resolve_relative(&buf, "/a/", "//a/b/.."); - assert_resolve_relative(&buf, "/a/b/c", "//a/Q/../b/x/y/../../c"); - assert_resolve_relative(&buf, "/", "//a/b/../.."); -#endif - - git_buf_free(&buf); -} diff --git a/vendor/libgit2/tests/core/pool.c b/vendor/libgit2/tests/core/pool.c deleted file mode 100644 index a7ec8801bd..0000000000 --- a/vendor/libgit2/tests/core/pool.c +++ /dev/null @@ -1,146 +0,0 @@ -#include "clar_libgit2.h" -#include "pool.h" -#include "git2/oid.h" - -void test_core_pool__0(void) -{ - int i; - git_pool p; - void *ptr; - - cl_git_pass(git_pool_init(&p, 1, 4000)); - - for (i = 1; i < 10000; i *= 2) { - ptr = git_pool_malloc(&p, i); - cl_assert(ptr != NULL); - cl_assert(git_pool__ptr_in_pool(&p, ptr)); - cl_assert(!git_pool__ptr_in_pool(&p, &i)); - } - - /* 1+2+4+8+16+32+64+128+256+512+1024 -> original block */ - /* 2048 -> 1 block */ - /* 4096 -> 1 block */ - /* 8192 -> 1 block */ - - cl_assert(git_pool__open_pages(&p) + git_pool__full_pages(&p) == 4); - - git_pool_clear(&p); -} - -void test_core_pool__1(void) -{ - int i; - git_pool p; - - cl_git_pass(git_pool_init(&p, 1, 4000)); - - for (i = 2010; i > 0; i--) - cl_assert(git_pool_malloc(&p, i) != NULL); - - /* with fixed page size, allocation must end up with these values */ - cl_assert_equal_i(1, git_pool__open_pages(&p)); - cl_assert_equal_i(507, git_pool__full_pages(&p)); - - git_pool_clear(&p); - - cl_git_pass(git_pool_init(&p, 1, 4120)); - - for (i = 2010; i > 0; i--) - cl_assert(git_pool_malloc(&p, i) != NULL); - - /* with fixed page size, allocation must end up with these values */ - cl_assert_equal_i(1, git_pool__open_pages(&p)); - cl_assert_equal_i(492, git_pool__full_pages(&p)); - - git_pool_clear(&p); -} - -static char to_hex[] = "0123456789abcdef"; - -void test_core_pool__2(void) -{ - git_pool p; - char oid_hex[GIT_OID_HEXSZ]; - git_oid *oid; - int i, j; - - memset(oid_hex, '0', sizeof(oid_hex)); - - cl_git_pass(git_pool_init(&p, sizeof(git_oid), 100)); - - for (i = 1000; i < 10000; i++) { - oid = git_pool_malloc(&p, 1); - cl_assert(oid != NULL); - - for (j = 0; j < 8; j++) - oid_hex[j] = to_hex[(i >> (4 * j)) & 0x0f]; - cl_git_pass(git_oid_fromstr(oid, oid_hex)); - } - - /* with fixed page size, allocation must end up with these values */ - cl_assert(git_pool__open_pages(&p) == 0); - cl_assert(git_pool__full_pages(&p) == 90); - - git_pool_clear(&p); -} - -void test_core_pool__free_list(void) -{ - int i; - git_pool p; - void *ptr, *ptrs[50]; - - cl_git_pass(git_pool_init(&p, 100, 100)); - - for (i = 0; i < 10; ++i) { - ptr = git_pool_malloc(&p, 1); - cl_assert(ptr != NULL); - } - cl_assert_equal_i(10, (int)p.items); - - for (i = 0; i < 50; ++i) { - ptrs[i] = git_pool_malloc(&p, 1); - cl_assert(ptrs[i] != NULL); - } - cl_assert_equal_i(60, (int)p.items); - - git_pool_free(&p, ptr); - cl_assert_equal_i(60, (int)p.items); - - git_pool_free_array(&p, 50, ptrs); - cl_assert_equal_i(60, (int)p.items); - - for (i = 0; i < 50; ++i) { - ptrs[i] = git_pool_malloc(&p, 1); - cl_assert(ptrs[i] != NULL); - } - cl_assert_equal_i(60, (int)p.items); - - for (i = 0; i < 111; ++i) { - ptr = git_pool_malloc(&p, 1); - cl_assert(ptr != NULL); - } - cl_assert_equal_i(170, (int)p.items); - - git_pool_free_array(&p, 50, ptrs); - cl_assert_equal_i(170, (int)p.items); - - for (i = 0; i < 50; ++i) { - ptrs[i] = git_pool_malloc(&p, 1); - cl_assert(ptrs[i] != NULL); - } - cl_assert_equal_i(170, (int)p.items); - - git_pool_clear(&p); -} - -void test_core_pool__strndup_limit(void) -{ - git_pool p; - - cl_git_pass(git_pool_init(&p, 1, 100)); - /* ensure 64 bit doesn't overflow */ - cl_assert(git_pool_strndup(&p, "foo", (size_t)-1) == NULL); - git_pool_clear(&p); -} - diff --git a/vendor/libgit2/tests/core/posix.c b/vendor/libgit2/tests/core/posix.c deleted file mode 100644 index 5a9e24899f..0000000000 --- a/vendor/libgit2/tests/core/posix.c +++ /dev/null @@ -1,148 +0,0 @@ -#ifndef _WIN32 -# include -# include -# include -#else -# include -# ifdef _MSC_VER -# pragma comment(lib, "ws2_32") -# endif -#endif - -#include "clar_libgit2.h" -#include "posix.h" - -void test_core_posix__initialize(void) -{ -#ifdef GIT_WIN32 - /* on win32, the WSA context needs to be initialized - * before any socket calls can be performed */ - WSADATA wsd; - - cl_git_pass(WSAStartup(MAKEWORD(2,2), &wsd)); - cl_assert(LOBYTE(wsd.wVersion) == 2 && HIBYTE(wsd.wVersion) == 2); -#endif -} - -static bool supports_ipv6(void) -{ -#ifdef GIT_WIN32 - /* IPv6 is supported on Vista and newer */ - return git_has_win32_version(6, 0, 0); -#else - return 1; -#endif -} - -void test_core_posix__inet_pton(void) -{ - struct in_addr addr; - struct in6_addr addr6; - size_t i; - - struct in_addr_data { - const char *p; - const uint8_t n[4]; - }; - - struct in6_addr_data { - const char *p; - const uint8_t n[16]; - }; - - static struct in_addr_data in_addr_data[] = { - { "0.0.0.0", { 0, 0, 0, 0 } }, - { "10.42.101.8", { 10, 42, 101, 8 } }, - { "127.0.0.1", { 127, 0, 0, 1 } }, - { "140.177.10.12", { 140, 177, 10, 12 } }, - { "204.232.175.90", { 204, 232, 175, 90 } }, - { "255.255.255.255", { 255, 255, 255, 255 } }, - }; - - static struct in6_addr_data in6_addr_data[] = { - { "::", { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, - { "::1", { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 } }, - { "0:0:0:0:0:0:0:1", { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 } }, - { "2001:db8:8714:3a90::12", { 0x20, 0x01, 0x0d, 0xb8, 0x87, 0x14, 0x3a, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12 } }, - { "fe80::f8ba:c2d6:86be:3645", { 0xfe, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xba, 0xc2, 0xd6, 0x86, 0xbe, 0x36, 0x45 } }, - { "::ffff:204.152.189.116", { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xcc, 0x98, 0xbd, 0x74 } }, - }; - - /* Test some ipv4 addresses */ - for (i = 0; i < 6; i++) { - cl_assert(p_inet_pton(AF_INET, in_addr_data[i].p, &addr) == 1); - cl_assert(memcmp(&addr, in_addr_data[i].n, sizeof(struct in_addr)) == 0); - } - - /* Test some ipv6 addresses */ - if (supports_ipv6()) - { - for (i = 0; i < 6; i++) { - cl_assert(p_inet_pton(AF_INET6, in6_addr_data[i].p, &addr6) == 1); - cl_assert(memcmp(&addr6, in6_addr_data[i].n, sizeof(struct in6_addr)) == 0); - } - } - - /* Test some invalid strings */ - cl_assert(p_inet_pton(AF_INET, "", &addr) == 0); - cl_assert(p_inet_pton(AF_INET, "foo", &addr) == 0); - cl_assert(p_inet_pton(AF_INET, " 127.0.0.1", &addr) == 0); - cl_assert(p_inet_pton(AF_INET, "bar", &addr) == 0); - cl_assert(p_inet_pton(AF_INET, "10.foo.bar.1", &addr) == 0); - - /* Test unsupported address families */ - cl_git_fail(p_inet_pton(12, "52.472", NULL)); /* AF_DECnet */ - cl_assert_equal_i(EAFNOSUPPORT, errno); - - cl_git_fail(p_inet_pton(5, "315.124", NULL)); /* AF_CHAOS */ - cl_assert_equal_i(EAFNOSUPPORT, errno); -} - -void test_core_posix__utimes(void) -{ - struct timeval times[2]; - struct stat st; - time_t curtime; - int fd; - - /* test p_utimes */ - times[0].tv_sec = 1234567890; - times[0].tv_usec = 0; - times[1].tv_sec = 1234567890; - times[1].tv_usec = 0; - - cl_git_mkfile("foo", "Dummy file."); - cl_must_pass(p_utimes("foo", times)); - - p_stat("foo", &st); - cl_assert_equal_i(1234567890, st.st_atime); - cl_assert_equal_i(1234567890, st.st_mtime); - - - /* test p_futimes */ - times[0].tv_sec = 1414141414; - times[0].tv_usec = 0; - times[1].tv_sec = 1414141414; - times[1].tv_usec = 0; - - cl_must_pass(fd = p_open("foo", O_RDWR)); - cl_must_pass(p_futimes(fd, times)); - p_close(fd); - - p_stat("foo", &st); - cl_assert_equal_i(1414141414, st.st_atime); - cl_assert_equal_i(1414141414, st.st_mtime); - - - /* test p_utimes with current time, assume that - * it takes < 5 seconds to get the time...! - */ - cl_must_pass(p_utimes("foo", NULL)); - - curtime = time(NULL); - p_stat("foo", &st); - cl_assert((st.st_atime - curtime) < 5); - cl_assert((st.st_mtime - curtime) < 5); - - p_unlink("foo"); -} diff --git a/vendor/libgit2/tests/core/pqueue.c b/vendor/libgit2/tests/core/pqueue.c deleted file mode 100644 index bcd4eea9f2..0000000000 --- a/vendor/libgit2/tests/core/pqueue.c +++ /dev/null @@ -1,128 +0,0 @@ -#include "clar_libgit2.h" -#include "pqueue.h" - -static int cmp_ints(const void *v1, const void *v2) -{ - int i1 = *(int *)v1, i2 = *(int *)v2; - return (i1 < i2) ? -1 : (i1 > i2) ? 1 : 0; -} - -void test_core_pqueue__items_are_put_in_order(void) -{ - git_pqueue pq; - int i, vals[20]; - - cl_git_pass(git_pqueue_init(&pq, 0, 20, cmp_ints)); - - for (i = 0; i < 20; ++i) { - if (i < 10) - vals[i] = 10 - i; /* 10 down to 1 */ - else - vals[i] = i + 1; /* 11 up to 20 */ - - cl_git_pass(git_pqueue_insert(&pq, &vals[i])); - } - - cl_assert_equal_i(20, git_pqueue_size(&pq)); - - for (i = 1; i <= 20; ++i) { - void *p = git_pqueue_pop(&pq); - cl_assert(p); - cl_assert_equal_i(i, *(int *)p); - } - - cl_assert_equal_i(0, git_pqueue_size(&pq)); - - git_pqueue_free(&pq); -} - -void test_core_pqueue__interleave_inserts_and_pops(void) -{ - git_pqueue pq; - int chunk, v, i, vals[200]; - - cl_git_pass(git_pqueue_init(&pq, 0, 20, cmp_ints)); - - for (v = 0, chunk = 20; chunk <= 200; chunk += 20) { - /* push the next 20 */ - for (; v < chunk; ++v) { - vals[v] = (v & 1) ? 200 - v : v; - cl_git_pass(git_pqueue_insert(&pq, &vals[v])); - } - - /* pop the lowest 10 */ - for (i = 0; i < 10; ++i) - (void)git_pqueue_pop(&pq); - } - - cl_assert_equal_i(100, git_pqueue_size(&pq)); - - /* at this point, we've popped 0-99 */ - - for (v = 100; v < 200; ++v) { - void *p = git_pqueue_pop(&pq); - cl_assert(p); - cl_assert_equal_i(v, *(int *)p); - } - - cl_assert_equal_i(0, git_pqueue_size(&pq)); - - git_pqueue_free(&pq); -} - -void test_core_pqueue__max_heap_size(void) -{ - git_pqueue pq; - int i, vals[100]; - - cl_git_pass(git_pqueue_init(&pq, GIT_PQUEUE_FIXED_SIZE, 50, cmp_ints)); - - for (i = 0; i < 100; ++i) { - vals[i] = (i & 1) ? 100 - i : i; - cl_git_pass(git_pqueue_insert(&pq, &vals[i])); - } - - cl_assert_equal_i(50, git_pqueue_size(&pq)); - - for (i = 50; i < 100; ++i) { - void *p = git_pqueue_pop(&pq); - cl_assert(p); - cl_assert_equal_i(i, *(int *)p); - } - - cl_assert_equal_i(0, git_pqueue_size(&pq)); - - git_pqueue_free(&pq); - -} - -static int cmp_ints_like_commit_time(const void *a, const void *b) -{ - return *((const int *)a) < *((const int *)b); -} - -void test_core_pqueue__interleaved_pushes_and_pops(void) -{ - git_pqueue pq; - int i, j, *val; - static int commands[] = - { 6, 9, 8, 0, 5, 0, 7, 0, 4, 3, 0, 0, 0, 4, 0, 2, 0, 1, 0, 0, -1 }; - static int expected[] = - { 9, 8, 7, 6, 5, 4, 4, 3, 2, 1, -1 }; - - cl_git_pass(git_pqueue_init(&pq, 0, 10, cmp_ints_like_commit_time)); - - for (i = 0, j = 0; commands[i] >= 0; ++i) { - if (!commands[i]) { - cl_assert((val = git_pqueue_pop(&pq)) != NULL); - cl_assert_equal_i(expected[j], *val); - ++j; - } else { - cl_git_pass(git_pqueue_insert(&pq, &commands[i])); - } - } - - cl_assert_equal_i(0, git_pqueue_size(&pq)); - git_pqueue_free(&pq); -} - diff --git a/vendor/libgit2/tests/core/rmdir.c b/vendor/libgit2/tests/core/rmdir.c deleted file mode 100644 index f0b0bfa429..0000000000 --- a/vendor/libgit2/tests/core/rmdir.c +++ /dev/null @@ -1,98 +0,0 @@ -#include "clar_libgit2.h" -#include "fileops.h" - -static const char *empty_tmp_dir = "test_gitfo_rmdir_recurs_test"; - -void test_core_rmdir__initialize(void) -{ - git_buf path = GIT_BUF_INIT; - - cl_must_pass(p_mkdir(empty_tmp_dir, 0777)); - - cl_git_pass(git_buf_joinpath(&path, empty_tmp_dir, "/one")); - cl_must_pass(p_mkdir(path.ptr, 0777)); - - cl_git_pass(git_buf_joinpath(&path, empty_tmp_dir, "/one/two_one")); - cl_must_pass(p_mkdir(path.ptr, 0777)); - - cl_git_pass(git_buf_joinpath(&path, empty_tmp_dir, "/one/two_two")); - cl_must_pass(p_mkdir(path.ptr, 0777)); - - cl_git_pass(git_buf_joinpath(&path, empty_tmp_dir, "/one/two_two/three")); - cl_must_pass(p_mkdir(path.ptr, 0777)); - - cl_git_pass(git_buf_joinpath(&path, empty_tmp_dir, "/two")); - cl_must_pass(p_mkdir(path.ptr, 0777)); - - git_buf_free(&path); -} - -/* make sure empty dir can be deleted recusively */ -void test_core_rmdir__delete_recursive(void) -{ - cl_git_pass(git_futils_rmdir_r(empty_tmp_dir, NULL, GIT_RMDIR_EMPTY_HIERARCHY)); -} - -/* make sure non-empty dir cannot be deleted recusively */ -void test_core_rmdir__fail_to_delete_non_empty_dir(void) -{ - git_buf file = GIT_BUF_INIT; - - cl_git_pass(git_buf_joinpath(&file, empty_tmp_dir, "/two/file.txt")); - - cl_git_mkfile(git_buf_cstr(&file), "dummy"); - - cl_git_fail(git_futils_rmdir_r(empty_tmp_dir, NULL, GIT_RMDIR_EMPTY_HIERARCHY)); - - cl_must_pass(p_unlink(file.ptr)); - cl_git_pass(git_futils_rmdir_r(empty_tmp_dir, NULL, GIT_RMDIR_EMPTY_HIERARCHY)); - - git_buf_free(&file); -} - -void test_core_rmdir__can_skip_non_empty_dir(void) -{ - git_buf file = GIT_BUF_INIT; - - cl_git_pass(git_buf_joinpath(&file, empty_tmp_dir, "/two/file.txt")); - - cl_git_mkfile(git_buf_cstr(&file), "dummy"); - - cl_git_pass(git_futils_rmdir_r(empty_tmp_dir, NULL, GIT_RMDIR_SKIP_NONEMPTY)); - cl_assert(git_path_exists(git_buf_cstr(&file)) == true); - - cl_git_pass(git_futils_rmdir_r(empty_tmp_dir, NULL, GIT_RMDIR_REMOVE_FILES)); - cl_assert(git_path_exists(empty_tmp_dir) == false); - - git_buf_free(&file); -} - -void test_core_rmdir__can_remove_empty_parents(void) -{ - git_buf file = GIT_BUF_INIT; - - cl_git_pass( - git_buf_joinpath(&file, empty_tmp_dir, "/one/two_two/three/file.txt")); - cl_git_mkfile(git_buf_cstr(&file), "dummy"); - cl_assert(git_path_isfile(git_buf_cstr(&file))); - - cl_git_pass(git_futils_rmdir_r("one/two_two/three/file.txt", empty_tmp_dir, - GIT_RMDIR_REMOVE_FILES | GIT_RMDIR_EMPTY_PARENTS)); - - cl_assert(!git_path_exists(git_buf_cstr(&file))); - - git_buf_rtruncate_at_char(&file, '/'); /* three (only contained file.txt) */ - cl_assert(!git_path_exists(git_buf_cstr(&file))); - - git_buf_rtruncate_at_char(&file, '/'); /* two_two (only contained three) */ - cl_assert(!git_path_exists(git_buf_cstr(&file))); - - git_buf_rtruncate_at_char(&file, '/'); /* one (contained two_one also) */ - cl_assert(git_path_exists(git_buf_cstr(&file))); - - cl_assert(git_path_exists(empty_tmp_dir) == true); - - git_buf_free(&file); - - cl_git_pass(git_futils_rmdir_r(empty_tmp_dir, NULL, GIT_RMDIR_EMPTY_HIERARCHY)); -} diff --git a/vendor/libgit2/tests/core/sortedcache.c b/vendor/libgit2/tests/core/sortedcache.c deleted file mode 100644 index c1869bee06..0000000000 --- a/vendor/libgit2/tests/core/sortedcache.c +++ /dev/null @@ -1,363 +0,0 @@ -#include "clar_libgit2.h" -#include "sortedcache.h" - -static int name_only_cmp(const void *a, const void *b) -{ - return strcmp(a, b); -} - -void test_core_sortedcache__name_only(void) -{ - git_sortedcache *sc; - void *item; - size_t pos; - - cl_git_pass(git_sortedcache_new( - &sc, 0, NULL, NULL, name_only_cmp, NULL)); - - cl_git_pass(git_sortedcache_wlock(sc)); - cl_git_pass(git_sortedcache_upsert(&item, sc, "aaa")); - cl_git_pass(git_sortedcache_upsert(&item, sc, "bbb")); - cl_git_pass(git_sortedcache_upsert(&item, sc, "zzz")); - cl_git_pass(git_sortedcache_upsert(&item, sc, "mmm")); - cl_git_pass(git_sortedcache_upsert(&item, sc, "iii")); - git_sortedcache_wunlock(sc); - - cl_assert_equal_sz(5, git_sortedcache_entrycount(sc)); - - cl_assert((item = git_sortedcache_lookup(sc, "aaa")) != NULL); - cl_assert_equal_s("aaa", item); - cl_assert((item = git_sortedcache_lookup(sc, "mmm")) != NULL); - cl_assert_equal_s("mmm", item); - cl_assert((item = git_sortedcache_lookup(sc, "zzz")) != NULL); - cl_assert_equal_s("zzz", item); - cl_assert(git_sortedcache_lookup(sc, "qqq") == NULL); - - cl_assert((item = git_sortedcache_entry(sc, 0)) != NULL); - cl_assert_equal_s("aaa", item); - cl_assert((item = git_sortedcache_entry(sc, 1)) != NULL); - cl_assert_equal_s("bbb", item); - cl_assert((item = git_sortedcache_entry(sc, 2)) != NULL); - cl_assert_equal_s("iii", item); - cl_assert((item = git_sortedcache_entry(sc, 3)) != NULL); - cl_assert_equal_s("mmm", item); - cl_assert((item = git_sortedcache_entry(sc, 4)) != NULL); - cl_assert_equal_s("zzz", item); - cl_assert(git_sortedcache_entry(sc, 5) == NULL); - - cl_git_pass(git_sortedcache_lookup_index(&pos, sc, "aaa")); - cl_assert_equal_sz(0, pos); - cl_git_pass(git_sortedcache_lookup_index(&pos, sc, "iii")); - cl_assert_equal_sz(2, pos); - cl_git_pass(git_sortedcache_lookup_index(&pos, sc, "zzz")); - cl_assert_equal_sz(4, pos); - cl_assert_equal_i( - GIT_ENOTFOUND, git_sortedcache_lookup_index(&pos, sc, "abc")); - - git_sortedcache_clear(sc, true); - - cl_assert_equal_sz(0, git_sortedcache_entrycount(sc)); - cl_assert(git_sortedcache_entry(sc, 0) == NULL); - cl_assert(git_sortedcache_lookup(sc, "aaa") == NULL); - cl_assert(git_sortedcache_entry(sc, 0) == NULL); - - git_sortedcache_free(sc); -} - -typedef struct { - int value; - char smaller_value; - char path[GIT_FLEX_ARRAY]; -} sortedcache_test_struct; - -static int sortedcache_test_struct_cmp(const void *a_, const void *b_) -{ - const sortedcache_test_struct *a = a_, *b = b_; - return strcmp(a->path, b->path); -} - -static void sortedcache_test_struct_free(void *payload, void *item_) -{ - sortedcache_test_struct *item = item_; - int *count = payload; - (*count)++; - item->smaller_value = 0; -} - -void test_core_sortedcache__in_memory(void) -{ - git_sortedcache *sc; - sortedcache_test_struct *item; - int free_count = 0; - - cl_git_pass(git_sortedcache_new( - &sc, offsetof(sortedcache_test_struct, path), - sortedcache_test_struct_free, &free_count, - sortedcache_test_struct_cmp, NULL)); - - cl_git_pass(git_sortedcache_wlock(sc)); - cl_git_pass(git_sortedcache_upsert((void **)&item, sc, "aaa")); - item->value = 10; - item->smaller_value = 1; - cl_git_pass(git_sortedcache_upsert((void **)&item, sc, "bbb")); - item->value = 20; - item->smaller_value = 2; - cl_git_pass(git_sortedcache_upsert((void **)&item, sc, "zzz")); - item->value = 30; - item->smaller_value = 26; - cl_git_pass(git_sortedcache_upsert((void **)&item, sc, "mmm")); - item->value = 40; - item->smaller_value = 14; - cl_git_pass(git_sortedcache_upsert((void **)&item, sc, "iii")); - item->value = 50; - item->smaller_value = 9; - git_sortedcache_wunlock(sc); - - cl_assert_equal_sz(5, git_sortedcache_entrycount(sc)); - - cl_git_pass(git_sortedcache_rlock(sc)); - - cl_assert((item = git_sortedcache_lookup(sc, "aaa")) != NULL); - cl_assert_equal_s("aaa", item->path); - cl_assert_equal_i(10, item->value); - cl_assert((item = git_sortedcache_lookup(sc, "mmm")) != NULL); - cl_assert_equal_s("mmm", item->path); - cl_assert_equal_i(40, item->value); - cl_assert((item = git_sortedcache_lookup(sc, "zzz")) != NULL); - cl_assert_equal_s("zzz", item->path); - cl_assert_equal_i(30, item->value); - cl_assert(git_sortedcache_lookup(sc, "abc") == NULL); - - /* not on Windows: - * cl_git_pass(git_sortedcache_rlock(sc)); -- grab more than one - */ - - cl_assert((item = git_sortedcache_entry(sc, 0)) != NULL); - cl_assert_equal_s("aaa", item->path); - cl_assert_equal_i(10, item->value); - cl_assert((item = git_sortedcache_entry(sc, 1)) != NULL); - cl_assert_equal_s("bbb", item->path); - cl_assert_equal_i(20, item->value); - cl_assert((item = git_sortedcache_entry(sc, 2)) != NULL); - cl_assert_equal_s("iii", item->path); - cl_assert_equal_i(50, item->value); - cl_assert((item = git_sortedcache_entry(sc, 3)) != NULL); - cl_assert_equal_s("mmm", item->path); - cl_assert_equal_i(40, item->value); - cl_assert((item = git_sortedcache_entry(sc, 4)) != NULL); - cl_assert_equal_s("zzz", item->path); - cl_assert_equal_i(30, item->value); - cl_assert(git_sortedcache_entry(sc, 5) == NULL); - - git_sortedcache_runlock(sc); - /* git_sortedcache_runlock(sc); */ - - cl_assert_equal_i(0, free_count); - - git_sortedcache_clear(sc, true); - - cl_assert_equal_i(5, free_count); - - cl_assert_equal_sz(0, git_sortedcache_entrycount(sc)); - cl_assert(git_sortedcache_entry(sc, 0) == NULL); - cl_assert(git_sortedcache_lookup(sc, "aaa") == NULL); - cl_assert(git_sortedcache_entry(sc, 0) == NULL); - - free_count = 0; - - cl_git_pass(git_sortedcache_wlock(sc)); - cl_git_pass(git_sortedcache_upsert((void **)&item, sc, "testing")); - item->value = 10; - item->smaller_value = 3; - cl_git_pass(git_sortedcache_upsert((void **)&item, sc, "again")); - item->value = 20; - item->smaller_value = 1; - cl_git_pass(git_sortedcache_upsert((void **)&item, sc, "final")); - item->value = 30; - item->smaller_value = 2; - git_sortedcache_wunlock(sc); - - cl_assert_equal_sz(3, git_sortedcache_entrycount(sc)); - - cl_assert((item = git_sortedcache_lookup(sc, "testing")) != NULL); - cl_assert_equal_s("testing", item->path); - cl_assert_equal_i(10, item->value); - cl_assert((item = git_sortedcache_lookup(sc, "again")) != NULL); - cl_assert_equal_s("again", item->path); - cl_assert_equal_i(20, item->value); - cl_assert((item = git_sortedcache_lookup(sc, "final")) != NULL); - cl_assert_equal_s("final", item->path); - cl_assert_equal_i(30, item->value); - cl_assert(git_sortedcache_lookup(sc, "zzz") == NULL); - - cl_assert((item = git_sortedcache_entry(sc, 0)) != NULL); - cl_assert_equal_s("again", item->path); - cl_assert_equal_i(20, item->value); - cl_assert((item = git_sortedcache_entry(sc, 1)) != NULL); - cl_assert_equal_s("final", item->path); - cl_assert_equal_i(30, item->value); - cl_assert((item = git_sortedcache_entry(sc, 2)) != NULL); - cl_assert_equal_s("testing", item->path); - cl_assert_equal_i(10, item->value); - cl_assert(git_sortedcache_entry(sc, 3) == NULL); - - { - size_t pos; - - cl_git_pass(git_sortedcache_wlock(sc)); - - cl_git_pass(git_sortedcache_lookup_index(&pos, sc, "again")); - cl_assert_equal_sz(0, pos); - cl_git_pass(git_sortedcache_remove(sc, pos)); - cl_assert_equal_i( - GIT_ENOTFOUND, git_sortedcache_lookup_index(&pos, sc, "again")); - - cl_assert_equal_sz(2, git_sortedcache_entrycount(sc)); - - cl_git_pass(git_sortedcache_lookup_index(&pos, sc, "testing")); - cl_assert_equal_sz(1, pos); - cl_git_pass(git_sortedcache_remove(sc, pos)); - cl_assert_equal_i( - GIT_ENOTFOUND, git_sortedcache_lookup_index(&pos, sc, "testing")); - - cl_assert_equal_sz(1, git_sortedcache_entrycount(sc)); - - cl_git_pass(git_sortedcache_lookup_index(&pos, sc, "final")); - cl_assert_equal_sz(0, pos); - cl_git_pass(git_sortedcache_remove(sc, pos)); - cl_assert_equal_i( - GIT_ENOTFOUND, git_sortedcache_lookup_index(&pos, sc, "final")); - - cl_assert_equal_sz(0, git_sortedcache_entrycount(sc)); - - git_sortedcache_wunlock(sc); - } - - git_sortedcache_free(sc); - - cl_assert_equal_i(3, free_count); -} - -static void sortedcache_test_reload(git_sortedcache *sc) -{ - int count = 0; - git_buf buf = GIT_BUF_INIT; - char *scan, *after; - sortedcache_test_struct *item; - - cl_assert(git_sortedcache_lockandload(sc, &buf) > 0); - - git_sortedcache_clear(sc, false); /* clear once we already have lock */ - - for (scan = buf.ptr; *scan; scan = after + 1) { - int val = strtol(scan, &after, 0); - cl_assert(after > scan); - scan = after; - - for (scan = after; git__isspace(*scan); ++scan) /* find start */; - for (after = scan; *after && *after != '\n'; ++after) /* find eol */; - *after = '\0'; - - cl_git_pass(git_sortedcache_upsert((void **)&item, sc, scan)); - - item->value = val; - item->smaller_value = (char)(count++); - } - - git_sortedcache_wunlock(sc); - - git_buf_free(&buf); -} - -void test_core_sortedcache__on_disk(void) -{ - git_sortedcache *sc; - sortedcache_test_struct *item; - int free_count = 0; - size_t pos; - - cl_git_mkfile("cacheitems.txt", "10 abc\n20 bcd\n30 cde\n"); - - cl_git_pass(git_sortedcache_new( - &sc, offsetof(sortedcache_test_struct, path), - sortedcache_test_struct_free, &free_count, - sortedcache_test_struct_cmp, "cacheitems.txt")); - - /* should need to reload the first time */ - - sortedcache_test_reload(sc); - - /* test what we loaded */ - - cl_assert_equal_sz(3, git_sortedcache_entrycount(sc)); - - cl_assert((item = git_sortedcache_lookup(sc, "abc")) != NULL); - cl_assert_equal_s("abc", item->path); - cl_assert_equal_i(10, item->value); - cl_assert((item = git_sortedcache_lookup(sc, "cde")) != NULL); - cl_assert_equal_s("cde", item->path); - cl_assert_equal_i(30, item->value); - cl_assert(git_sortedcache_lookup(sc, "aaa") == NULL); - - cl_assert((item = git_sortedcache_entry(sc, 0)) != NULL); - cl_assert_equal_s("abc", item->path); - cl_assert_equal_i(10, item->value); - cl_assert((item = git_sortedcache_entry(sc, 1)) != NULL); - cl_assert_equal_s("bcd", item->path); - cl_assert_equal_i(20, item->value); - cl_assert(git_sortedcache_entry(sc, 3) == NULL); - - /* should not need to reload this time */ - - cl_assert_equal_i(0, git_sortedcache_lockandload(sc, NULL)); - - /* rewrite ondisk file and reload */ - - cl_assert_equal_i(0, free_count); - - cl_git_rewritefile( - "cacheitems.txt", "100 abc\n200 zzz\n500 aaa\n10 final\n"); - sortedcache_test_reload(sc); - - cl_assert_equal_i(3, free_count); - - /* test what we loaded */ - - cl_assert_equal_sz(4, git_sortedcache_entrycount(sc)); - - cl_assert((item = git_sortedcache_lookup(sc, "abc")) != NULL); - cl_assert_equal_s("abc", item->path); - cl_assert_equal_i(100, item->value); - cl_assert((item = git_sortedcache_lookup(sc, "final")) != NULL); - cl_assert_equal_s("final", item->path); - cl_assert_equal_i(10, item->value); - cl_assert(git_sortedcache_lookup(sc, "cde") == NULL); - - cl_assert((item = git_sortedcache_entry(sc, 0)) != NULL); - cl_assert_equal_s("aaa", item->path); - cl_assert_equal_i(500, item->value); - cl_assert((item = git_sortedcache_entry(sc, 2)) != NULL); - cl_assert_equal_s("final", item->path); - cl_assert_equal_i(10, item->value); - cl_assert((item = git_sortedcache_entry(sc, 3)) != NULL); - cl_assert_equal_s("zzz", item->path); - cl_assert_equal_i(200, item->value); - - cl_git_pass(git_sortedcache_lookup_index(&pos, sc, "aaa")); - cl_assert_equal_sz(0, pos); - cl_git_pass(git_sortedcache_lookup_index(&pos, sc, "abc")); - cl_assert_equal_sz(1, pos); - cl_git_pass(git_sortedcache_lookup_index(&pos, sc, "final")); - cl_assert_equal_sz(2, pos); - cl_git_pass(git_sortedcache_lookup_index(&pos, sc, "zzz")); - cl_assert_equal_sz(3, pos); - cl_assert_equal_i( - GIT_ENOTFOUND, git_sortedcache_lookup_index(&pos, sc, "missing")); - cl_assert_equal_i( - GIT_ENOTFOUND, git_sortedcache_lookup_index(&pos, sc, "cde")); - - git_sortedcache_free(sc); - - cl_assert_equal_i(7, free_count); -} - diff --git a/vendor/libgit2/tests/core/stat.c b/vendor/libgit2/tests/core/stat.c deleted file mode 100644 index bd9b990e32..0000000000 --- a/vendor/libgit2/tests/core/stat.c +++ /dev/null @@ -1,114 +0,0 @@ -#include "clar_libgit2.h" -#include "fileops.h" -#include "path.h" -#include "posix.h" - -void test_core_stat__initialize(void) -{ - cl_git_pass(git_futils_mkdir("root/d1/d2", NULL, 0755, GIT_MKDIR_PATH)); - cl_git_mkfile("root/file", "whatever\n"); - cl_git_mkfile("root/d1/file", "whatever\n"); -} - -void test_core_stat__cleanup(void) -{ - git_futils_rmdir_r("root", NULL, GIT_RMDIR_REMOVE_FILES); -} - -#define cl_assert_error(val) \ - do { err = errno; cl_assert_equal_i((val), err); } while (0) - -void test_core_stat__0(void) -{ - struct stat st; - int err; - - cl_assert_equal_i(0, p_lstat("root", &st)); - cl_assert(S_ISDIR(st.st_mode)); - cl_assert_error(0); - - cl_assert_equal_i(0, p_lstat("root/", &st)); - cl_assert(S_ISDIR(st.st_mode)); - cl_assert_error(0); - - cl_assert_equal_i(0, p_lstat("root/file", &st)); - cl_assert(S_ISREG(st.st_mode)); - cl_assert_error(0); - - cl_assert_equal_i(0, p_lstat("root/d1", &st)); - cl_assert(S_ISDIR(st.st_mode)); - cl_assert_error(0); - - cl_assert_equal_i(0, p_lstat("root/d1/", &st)); - cl_assert(S_ISDIR(st.st_mode)); - cl_assert_error(0); - - cl_assert_equal_i(0, p_lstat("root/d1/file", &st)); - cl_assert(S_ISREG(st.st_mode)); - cl_assert_error(0); - - cl_assert(p_lstat("root/missing", &st) < 0); - cl_assert_error(ENOENT); - - cl_assert(p_lstat("root/missing/but/could/be/created", &st) < 0); - cl_assert_error(ENOENT); - - cl_assert(p_lstat_posixly("root/missing/but/could/be/created", &st) < 0); - cl_assert_error(ENOENT); - - cl_assert(p_lstat("root/d1/missing", &st) < 0); - cl_assert_error(ENOENT); - - cl_assert(p_lstat("root/d1/missing/deeper/path", &st) < 0); - cl_assert_error(ENOENT); - - cl_assert(p_lstat_posixly("root/d1/missing/deeper/path", &st) < 0); - cl_assert_error(ENOENT); - - cl_assert(p_lstat_posixly("root/d1/file/deeper/path", &st) < 0); - cl_assert_error(ENOTDIR); - - cl_assert(p_lstat("root/file/invalid", &st) < 0); -#ifdef GIT_WIN32 - cl_assert_error(ENOENT); -#else - cl_assert_error(ENOTDIR); -#endif - - cl_assert(p_lstat_posixly("root/file/invalid", &st) < 0); - cl_assert_error(ENOTDIR); - - cl_assert(p_lstat("root/file/invalid/deeper_path", &st) < 0); -#ifdef GIT_WIN32 - cl_assert_error(ENOENT); -#else - cl_assert_error(ENOTDIR); -#endif - - cl_assert(p_lstat_posixly("root/file/invalid/deeper_path", &st) < 0); - cl_assert_error(ENOTDIR); - - cl_assert(p_lstat_posixly("root/d1/file/extra", &st) < 0); - cl_assert_error(ENOTDIR); - - cl_assert(p_lstat_posixly("root/d1/file/further/invalid/items", &st) < 0); - cl_assert_error(ENOTDIR); -} - -void test_core_stat__root(void) -{ - const char *sandbox = clar_sandbox_path(); - git_buf root = GIT_BUF_INIT; - int root_len; - struct stat st; - - root_len = git_path_root(sandbox); - cl_assert(root_len >= 0); - - git_buf_set(&root, sandbox, root_len+1); - - cl_must_pass(p_stat(root.ptr, &st)); - cl_assert(S_ISDIR(st.st_mode)); - - git_buf_free(&root); -} diff --git a/vendor/libgit2/tests/core/string.c b/vendor/libgit2/tests/core/string.c deleted file mode 100644 index 90e8fa027c..0000000000 --- a/vendor/libgit2/tests/core/string.c +++ /dev/null @@ -1,83 +0,0 @@ -#include "clar_libgit2.h" - -/* compare prefixes */ -void test_core_string__0(void) -{ - cl_assert(git__prefixcmp("", "") == 0); - cl_assert(git__prefixcmp("a", "") == 0); - cl_assert(git__prefixcmp("", "a") < 0); - cl_assert(git__prefixcmp("a", "b") < 0); - cl_assert(git__prefixcmp("b", "a") > 0); - cl_assert(git__prefixcmp("ab", "a") == 0); - cl_assert(git__prefixcmp("ab", "ac") < 0); - cl_assert(git__prefixcmp("ab", "aa") > 0); -} - -/* compare suffixes */ -void test_core_string__1(void) -{ - cl_assert(git__suffixcmp("", "") == 0); - cl_assert(git__suffixcmp("a", "") == 0); - cl_assert(git__suffixcmp("", "a") < 0); - cl_assert(git__suffixcmp("a", "b") < 0); - cl_assert(git__suffixcmp("b", "a") > 0); - cl_assert(git__suffixcmp("ba", "a") == 0); - cl_assert(git__suffixcmp("zaa", "ac") < 0); - cl_assert(git__suffixcmp("zaz", "ac") > 0); -} - -/* compare icase sorting with case equality */ -void test_core_string__2(void) -{ - cl_assert(git__strcasesort_cmp("", "") == 0); - cl_assert(git__strcasesort_cmp("foo", "foo") == 0); - cl_assert(git__strcasesort_cmp("foo", "bar") > 0); - cl_assert(git__strcasesort_cmp("bar", "foo") < 0); - cl_assert(git__strcasesort_cmp("foo", "FOO") > 0); - cl_assert(git__strcasesort_cmp("FOO", "foo") < 0); - cl_assert(git__strcasesort_cmp("foo", "BAR") > 0); - cl_assert(git__strcasesort_cmp("BAR", "foo") < 0); - cl_assert(git__strcasesort_cmp("fooBar", "foobar") < 0); -} - -void test_core_string__strcmp(void) -{ - cl_assert(git__strcmp("", "") == 0); - cl_assert(git__strcmp("foo", "foo") == 0); - cl_assert(git__strcmp("Foo", "foo") < 0); - cl_assert(git__strcmp("foo", "FOO") > 0); - cl_assert(git__strcmp("foo", "fOO") > 0); - - cl_assert(strcmp("rt\303\202of", "rt dev\302\266h") > 0); - cl_assert(strcmp("e\342\202\254ghi=", "et") > 0); - cl_assert(strcmp("rt dev\302\266h", "rt\303\202of") < 0); - cl_assert(strcmp("et", "e\342\202\254ghi=") < 0); - cl_assert(strcmp("\303\215", "\303\255") < 0); - - cl_assert(git__strcmp("rt\303\202of", "rt dev\302\266h") > 0); - cl_assert(git__strcmp("e\342\202\254ghi=", "et") > 0); - cl_assert(git__strcmp("rt dev\302\266h", "rt\303\202of") < 0); - cl_assert(git__strcmp("et", "e\342\202\254ghi=") < 0); - cl_assert(git__strcmp("\303\215", "\303\255") < 0); -} - -void test_core_string__strcasecmp(void) -{ - cl_assert(git__strcasecmp("", "") == 0); - cl_assert(git__strcasecmp("foo", "foo") == 0); - cl_assert(git__strcasecmp("foo", "Foo") == 0); - cl_assert(git__strcasecmp("foo", "FOO") == 0); - cl_assert(git__strcasecmp("foo", "fOO") == 0); - - cl_assert(strcasecmp("rt\303\202of", "rt dev\302\266h") > 0); - cl_assert(strcasecmp("e\342\202\254ghi=", "et") > 0); - cl_assert(strcasecmp("rt dev\302\266h", "rt\303\202of") < 0); - cl_assert(strcasecmp("et", "e\342\202\254ghi=") < 0); - cl_assert(strcasecmp("\303\215", "\303\255") < 0); - - cl_assert(git__strcasecmp("rt\303\202of", "rt dev\302\266h") > 0); - cl_assert(git__strcasecmp("e\342\202\254ghi=", "et") > 0); - cl_assert(git__strcasecmp("rt dev\302\266h", "rt\303\202of") < 0); - cl_assert(git__strcasecmp("et", "e\342\202\254ghi=") < 0); - cl_assert(git__strcasecmp("\303\215", "\303\255") < 0); -} diff --git a/vendor/libgit2/tests/core/strmap.c b/vendor/libgit2/tests/core/strmap.c deleted file mode 100644 index 3b4276aea7..0000000000 --- a/vendor/libgit2/tests/core/strmap.c +++ /dev/null @@ -1,100 +0,0 @@ -#include "clar_libgit2.h" -#include "strmap.h" - -GIT__USE_STRMAP - -git_strmap *g_table; - -void test_core_strmap__initialize(void) -{ - cl_git_pass(git_strmap_alloc(&g_table)); - cl_assert(g_table != NULL); -} - -void test_core_strmap__cleanup(void) -{ - git_strmap_free(g_table); -} - -void test_core_strmap__0(void) -{ - cl_assert(git_strmap_num_entries(g_table) == 0); -} - -static void insert_strings(git_strmap *table, int count) -{ - int i, j, over, err; - char *str; - - for (i = 0; i < count; ++i) { - str = malloc(10); - for (j = 0; j < 10; ++j) - str[j] = 'a' + (i % 26); - str[9] = '\0'; - - /* if > 26, then encode larger value in first letters */ - for (j = 0, over = i / 26; over > 0; j++, over = over / 26) - str[j] = 'A' + (over % 26); - - git_strmap_insert(table, str, str, err); - cl_assert(err >= 0); - } - - cl_assert((int)git_strmap_num_entries(table) == count); -} - -void test_core_strmap__1(void) -{ - int i; - char *str; - - insert_strings(g_table, 20); - - cl_assert(git_strmap_exists(g_table, "aaaaaaaaa")); - cl_assert(git_strmap_exists(g_table, "ggggggggg")); - cl_assert(!git_strmap_exists(g_table, "aaaaaaaab")); - cl_assert(!git_strmap_exists(g_table, "abcdefghi")); - - i = 0; - git_strmap_foreach_value(g_table, str, { i++; free(str); }); - cl_assert(i == 20); -} - -void test_core_strmap__2(void) -{ - khiter_t pos; - int i; - char *str; - - insert_strings(g_table, 20); - - cl_assert(git_strmap_exists(g_table, "aaaaaaaaa")); - cl_assert(git_strmap_exists(g_table, "ggggggggg")); - cl_assert(!git_strmap_exists(g_table, "aaaaaaaab")); - cl_assert(!git_strmap_exists(g_table, "abcdefghi")); - - cl_assert(git_strmap_exists(g_table, "bbbbbbbbb")); - pos = git_strmap_lookup_index(g_table, "bbbbbbbbb"); - cl_assert(git_strmap_valid_index(g_table, pos)); - cl_assert_equal_s(git_strmap_value_at(g_table, pos), "bbbbbbbbb"); - free(git_strmap_value_at(g_table, pos)); - git_strmap_delete_at(g_table, pos); - - cl_assert(!git_strmap_exists(g_table, "bbbbbbbbb")); - - i = 0; - git_strmap_foreach_value(g_table, str, { i++; free(str); }); - cl_assert(i == 19); -} - -void test_core_strmap__3(void) -{ - int i; - char *str; - - insert_strings(g_table, 10000); - - i = 0; - git_strmap_foreach_value(g_table, str, { i++; free(str); }); - cl_assert(i == 10000); -} diff --git a/vendor/libgit2/tests/core/strtol.c b/vendor/libgit2/tests/core/strtol.c deleted file mode 100644 index 8765e042b1..0000000000 --- a/vendor/libgit2/tests/core/strtol.c +++ /dev/null @@ -1,37 +0,0 @@ -#include "clar_libgit2.h" - -void test_core_strtol__int32(void) -{ - int32_t i; - - cl_git_pass(git__strtol32(&i, "123", NULL, 10)); - cl_assert(i == 123); - cl_git_pass(git__strtol32(&i, " +123 ", NULL, 10)); - cl_assert(i == 123); - cl_git_pass(git__strtol32(&i, " +2147483647 ", NULL, 10)); - cl_assert(i == 2147483647); - cl_git_pass(git__strtol32(&i, " -2147483648 ", NULL, 10)); - cl_assert(i == -2147483648LL); - - cl_git_fail(git__strtol32(&i, " 2147483657 ", NULL, 10)); - cl_git_fail(git__strtol32(&i, " -2147483657 ", NULL, 10)); -} - -void test_core_strtol__int64(void) -{ - int64_t i; - - cl_git_pass(git__strtol64(&i, "123", NULL, 10)); - cl_assert(i == 123); - cl_git_pass(git__strtol64(&i, " +123 ", NULL, 10)); - cl_assert(i == 123); - cl_git_pass(git__strtol64(&i, " +2147483647 ", NULL, 10)); - cl_assert(i == 2147483647); - cl_git_pass(git__strtol64(&i, " -2147483648 ", NULL, 10)); - cl_assert(i == -2147483648LL); - cl_git_pass(git__strtol64(&i, " 2147483657 ", NULL, 10)); - cl_assert(i == 2147483657LL); - cl_git_pass(git__strtol64(&i, " -2147483657 ", NULL, 10)); - cl_assert(i == -2147483657LL); -} - diff --git a/vendor/libgit2/tests/core/structinit.c b/vendor/libgit2/tests/core/structinit.c deleted file mode 100644 index e9f7b4a746..0000000000 --- a/vendor/libgit2/tests/core/structinit.c +++ /dev/null @@ -1,168 +0,0 @@ -#include "clar_libgit2.h" -#include -#include -#include -#include - -#define STRINGIFY(s) #s - -/* Checks two conditions for the specified structure: - * 1. That the initializers for the latest version produces the same - * in-memory representation. - * 2. That the function-based initializer supports all versions from 1...n, - * where n is the latest version (often represented by GIT_*_VERSION). - * - * Parameters: - * structname: The name of the structure to test, e.g. git_blame_options. - * structver: The latest version of the specified structure. - * macroinit: The macro that initializes the latest version of the structure. - * funcinitname: The function that initializes the structure. Must have the - * signature "int (structname* instance, int version)". - */ -#define CHECK_MACRO_FUNC_INIT_EQUAL(structname, structver, macroinit, funcinitname) \ -do { \ - structname structname##_macro_latest = macroinit; \ - structname structname##_func_latest; \ - int structname##_curr_ver = structver - 1; \ - memset(&structname##_func_latest, 0, sizeof(structname##_func_latest)); \ - cl_git_pass(funcinitname(&structname##_func_latest, structver)); \ - options_cmp(&structname##_macro_latest, &structname##_func_latest, \ - sizeof(structname), STRINGIFY(structname)); \ - \ - while (structname##_curr_ver > 0) \ - { \ - structname macro; \ - cl_git_pass(funcinitname(¯o, structname##_curr_ver)); \ - structname##_curr_ver--; \ - }\ -} while(0) - -static void options_cmp(void *one, void *two, size_t size, const char *name) -{ - size_t i; - - for (i = 0; i < size; i++) { - if (((char *)one)[i] != ((char *)two)[i]) { - char desc[1024]; - - p_snprintf(desc, 1024, "Difference in %s at byte %" PRIuZ ": macro=%u / func=%u", - name, i, ((char *)one)[i], ((char *)two)[i]); - clar__fail(__FILE__, __LINE__, - "Difference between macro and function options initializer", - desc, 0); - return; - } - } -} - -void test_core_structinit__compare(void) -{ - /* These tests assume that they can memcmp() two structures that were - * initialized with the same static initializer. Eg, - * git_blame_options = GIT_BLAME_OPTIONS_INIT; - * - * This assumption fails when there is padding between structure members, - * which is not guaranteed to be initialized to anything sane at all. - * - * Assume most compilers, in a debug build, will clear that memory for - * us or set it to sentinal markers. Etc. - */ -#if !defined(DEBUG) && !defined(_DEBUG) - clar__skip(); -#endif - - /* blame */ - CHECK_MACRO_FUNC_INIT_EQUAL( \ - git_blame_options, GIT_BLAME_OPTIONS_VERSION, \ - GIT_BLAME_OPTIONS_INIT, git_blame_init_options); - - /* checkout */ - CHECK_MACRO_FUNC_INIT_EQUAL( \ - git_checkout_options, GIT_CHECKOUT_OPTIONS_VERSION, \ - GIT_CHECKOUT_OPTIONS_INIT, git_checkout_init_options); - - /* clone */ - CHECK_MACRO_FUNC_INIT_EQUAL( \ - git_clone_options, GIT_CLONE_OPTIONS_VERSION, \ - GIT_CLONE_OPTIONS_INIT, git_clone_init_options); - - /* diff */ - CHECK_MACRO_FUNC_INIT_EQUAL( \ - git_diff_options, GIT_DIFF_OPTIONS_VERSION, \ - GIT_DIFF_OPTIONS_INIT, git_diff_init_options); - - /* diff_find */ - CHECK_MACRO_FUNC_INIT_EQUAL( \ - git_diff_find_options, GIT_DIFF_FIND_OPTIONS_VERSION, \ - GIT_DIFF_FIND_OPTIONS_INIT, git_diff_find_init_options); - - /* merge_file_input */ - CHECK_MACRO_FUNC_INIT_EQUAL( \ - git_merge_file_input, GIT_MERGE_FILE_INPUT_VERSION, \ - GIT_MERGE_FILE_INPUT_INIT, git_merge_file_init_input); - - /* merge_file */ - CHECK_MACRO_FUNC_INIT_EQUAL( \ - git_merge_file_options, GIT_MERGE_FILE_OPTIONS_VERSION, \ - GIT_MERGE_FILE_OPTIONS_INIT, git_merge_file_init_options); - - /* merge_tree */ - CHECK_MACRO_FUNC_INIT_EQUAL( \ - git_merge_options, GIT_MERGE_OPTIONS_VERSION, \ - GIT_MERGE_OPTIONS_INIT, git_merge_init_options); - - /* push */ - CHECK_MACRO_FUNC_INIT_EQUAL( \ - git_push_options, GIT_PUSH_OPTIONS_VERSION, \ - GIT_PUSH_OPTIONS_INIT, git_push_init_options); - - /* remote */ - CHECK_MACRO_FUNC_INIT_EQUAL( \ - git_remote_callbacks, GIT_REMOTE_CALLBACKS_VERSION, \ - GIT_REMOTE_CALLBACKS_INIT, git_remote_init_callbacks); - - /* repository_init */ - CHECK_MACRO_FUNC_INIT_EQUAL( \ - git_repository_init_options, GIT_REPOSITORY_INIT_OPTIONS_VERSION, \ - GIT_REPOSITORY_INIT_OPTIONS_INIT, git_repository_init_init_options); - - /* revert */ - CHECK_MACRO_FUNC_INIT_EQUAL( \ - git_revert_options, GIT_REVERT_OPTIONS_VERSION, \ - GIT_REVERT_OPTIONS_INIT, git_revert_init_options); - - /* stash apply */ - CHECK_MACRO_FUNC_INIT_EQUAL( \ - git_stash_apply_options, GIT_STASH_APPLY_OPTIONS_VERSION, \ - GIT_STASH_APPLY_OPTIONS_INIT, git_stash_apply_init_options); - - /* status */ - CHECK_MACRO_FUNC_INIT_EQUAL( \ - git_status_options, GIT_STATUS_OPTIONS_VERSION, \ - GIT_STATUS_OPTIONS_INIT, git_status_init_options); - - /* transport */ - CHECK_MACRO_FUNC_INIT_EQUAL( \ - git_transport, GIT_TRANSPORT_VERSION, \ - GIT_TRANSPORT_INIT, git_transport_init); - - /* config_backend */ - CHECK_MACRO_FUNC_INIT_EQUAL( \ - git_config_backend, GIT_CONFIG_BACKEND_VERSION, \ - GIT_CONFIG_BACKEND_INIT, git_config_init_backend); - - /* odb_backend */ - CHECK_MACRO_FUNC_INIT_EQUAL( \ - git_odb_backend, GIT_ODB_BACKEND_VERSION, \ - GIT_ODB_BACKEND_INIT, git_odb_init_backend); - - /* refdb_backend */ - CHECK_MACRO_FUNC_INIT_EQUAL( \ - git_refdb_backend, GIT_REFDB_BACKEND_VERSION, \ - GIT_REFDB_BACKEND_INIT, git_refdb_init_backend); - - /* submodule update */ - CHECK_MACRO_FUNC_INIT_EQUAL( \ - git_submodule_update_options, GIT_SUBMODULE_UPDATE_OPTIONS_VERSION, \ - GIT_SUBMODULE_UPDATE_OPTIONS_INIT, git_submodule_update_init_options); -} diff --git a/vendor/libgit2/tests/core/vector.c b/vendor/libgit2/tests/core/vector.c deleted file mode 100644 index 66f90b82b6..0000000000 --- a/vendor/libgit2/tests/core/vector.c +++ /dev/null @@ -1,276 +0,0 @@ -#include "clar_libgit2.h" -#include "vector.h" - -/* initial size of 1 would cause writing past array bounds */ -void test_core_vector__0(void) -{ - git_vector x; - int i; - git_vector_init(&x, 1, NULL); - for (i = 0; i < 10; ++i) { - git_vector_insert(&x, (void*) 0xabc); - } - git_vector_free(&x); -} - - -/* don't read past array bounds on remove() */ -void test_core_vector__1(void) -{ - git_vector x; - // make initial capacity exact for our insertions. - git_vector_init(&x, 3, NULL); - git_vector_insert(&x, (void*) 0xabc); - git_vector_insert(&x, (void*) 0xdef); - git_vector_insert(&x, (void*) 0x123); - - git_vector_remove(&x, 0); // used to read past array bounds. - git_vector_free(&x); -} - - -static int test_cmp(const void *a, const void *b) -{ - return *(const int *)a - *(const int *)b; -} - -/* remove duplicates */ -void test_core_vector__2(void) -{ - git_vector x; - int *ptrs[2]; - - ptrs[0] = git__malloc(sizeof(int)); - ptrs[1] = git__malloc(sizeof(int)); - - *ptrs[0] = 2; - *ptrs[1] = 1; - - cl_git_pass(git_vector_init(&x, 5, test_cmp)); - cl_git_pass(git_vector_insert(&x, ptrs[0])); - cl_git_pass(git_vector_insert(&x, ptrs[1])); - cl_git_pass(git_vector_insert(&x, ptrs[1])); - cl_git_pass(git_vector_insert(&x, ptrs[0])); - cl_git_pass(git_vector_insert(&x, ptrs[1])); - cl_assert(x.length == 5); - - git_vector_uniq(&x, NULL); - cl_assert(x.length == 2); - - git_vector_free(&x); - - git__free(ptrs[0]); - git__free(ptrs[1]); -} - - -static int compare_them(const void *a, const void *b) -{ - return (int)((long)a - (long)b); -} - -/* insert_sorted */ -void test_core_vector__3(void) -{ - git_vector x; - long i; - git_vector_init(&x, 1, &compare_them); - - for (i = 0; i < 10; i += 2) { - git_vector_insert_sorted(&x, (void*)(i + 1), NULL); - } - - for (i = 9; i > 0; i -= 2) { - git_vector_insert_sorted(&x, (void*)(i + 1), NULL); - } - - cl_assert(x.length == 10); - for (i = 0; i < 10; ++i) { - cl_assert(git_vector_get(&x, i) == (void*)(i + 1)); - } - - git_vector_free(&x); -} - -/* insert_sorted with duplicates */ -void test_core_vector__4(void) -{ - git_vector x; - long i; - git_vector_init(&x, 1, &compare_them); - - for (i = 0; i < 10; i += 2) { - git_vector_insert_sorted(&x, (void*)(i + 1), NULL); - } - - for (i = 9; i > 0; i -= 2) { - git_vector_insert_sorted(&x, (void*)(i + 1), NULL); - } - - for (i = 0; i < 10; i += 2) { - git_vector_insert_sorted(&x, (void*)(i + 1), NULL); - } - - for (i = 9; i > 0; i -= 2) { - git_vector_insert_sorted(&x, (void*)(i + 1), NULL); - } - - cl_assert(x.length == 20); - for (i = 0; i < 20; ++i) { - cl_assert(git_vector_get(&x, i) == (void*)(i / 2 + 1)); - } - - git_vector_free(&x); -} - -typedef struct { - int content; - int count; -} my_struct; - -static int _struct_count = 0; - -static int compare_structs(const void *a, const void *b) -{ - return ((const my_struct *)a)->content - - ((const my_struct *)b)->content; -} - -static int merge_structs(void **old_raw, void *new) -{ - my_struct *old = *(my_struct **)old_raw; - cl_assert(((my_struct *)old)->content == ((my_struct *)new)->content); - ((my_struct *)old)->count += 1; - git__free(new); - _struct_count--; - return GIT_EEXISTS; -} - -static my_struct *alloc_struct(int value) -{ - my_struct *st = git__malloc(sizeof(my_struct)); - st->content = value; - st->count = 0; - _struct_count++; - return st; -} - -/* insert_sorted with duplicates and special handling */ -void test_core_vector__5(void) -{ - git_vector x; - int i; - - git_vector_init(&x, 1, &compare_structs); - - for (i = 0; i < 10; i += 2) - git_vector_insert_sorted(&x, alloc_struct(i), &merge_structs); - - for (i = 9; i > 0; i -= 2) - git_vector_insert_sorted(&x, alloc_struct(i), &merge_structs); - - cl_assert(x.length == 10); - cl_assert(_struct_count == 10); - - for (i = 0; i < 10; i += 2) - git_vector_insert_sorted(&x, alloc_struct(i), &merge_structs); - - for (i = 9; i > 0; i -= 2) - git_vector_insert_sorted(&x, alloc_struct(i), &merge_structs); - - cl_assert(x.length == 10); - cl_assert(_struct_count == 10); - - for (i = 0; i < 10; ++i) { - cl_assert(((my_struct *)git_vector_get(&x, i))->content == i); - git__free(git_vector_get(&x, i)); - _struct_count--; - } - - git_vector_free(&x); -} - -static int remove_ones(const git_vector *v, size_t idx, void *p) -{ - GIT_UNUSED(p); - return (git_vector_get(v, idx) == (void *)0x001); -} - -/* Test removal based on callback */ -void test_core_vector__remove_matching(void) -{ - git_vector x; - size_t i; - void *compare; - - git_vector_init(&x, 1, NULL); - git_vector_insert(&x, (void*) 0x001); - - cl_assert(x.length == 1); - git_vector_remove_matching(&x, remove_ones, NULL); - cl_assert(x.length == 0); - - git_vector_insert(&x, (void*) 0x001); - git_vector_insert(&x, (void*) 0x001); - git_vector_insert(&x, (void*) 0x001); - - cl_assert(x.length == 3); - git_vector_remove_matching(&x, remove_ones, NULL); - cl_assert(x.length == 0); - - git_vector_insert(&x, (void*) 0x002); - git_vector_insert(&x, (void*) 0x001); - git_vector_insert(&x, (void*) 0x002); - git_vector_insert(&x, (void*) 0x001); - - cl_assert(x.length == 4); - git_vector_remove_matching(&x, remove_ones, NULL); - cl_assert(x.length == 2); - - git_vector_foreach(&x, i, compare) { - cl_assert(compare != (void *)0x001); - } - - git_vector_clear(&x); - - git_vector_insert(&x, (void*) 0x001); - git_vector_insert(&x, (void*) 0x002); - git_vector_insert(&x, (void*) 0x002); - git_vector_insert(&x, (void*) 0x001); - - cl_assert(x.length == 4); - git_vector_remove_matching(&x, remove_ones, NULL); - cl_assert(x.length == 2); - - git_vector_foreach(&x, i, compare) { - cl_assert(compare != (void *)0x001); - } - - git_vector_clear(&x); - - git_vector_insert(&x, (void*) 0x002); - git_vector_insert(&x, (void*) 0x001); - git_vector_insert(&x, (void*) 0x002); - git_vector_insert(&x, (void*) 0x001); - - cl_assert(x.length == 4); - git_vector_remove_matching(&x, remove_ones, NULL); - cl_assert(x.length == 2); - - git_vector_foreach(&x, i, compare) { - cl_assert(compare != (void *)0x001); - } - - git_vector_clear(&x); - - git_vector_insert(&x, (void*) 0x002); - git_vector_insert(&x, (void*) 0x003); - git_vector_insert(&x, (void*) 0x002); - git_vector_insert(&x, (void*) 0x003); - - cl_assert(x.length == 4); - git_vector_remove_matching(&x, remove_ones, NULL); - cl_assert(x.length == 4); - - git_vector_free(&x); -} diff --git a/vendor/libgit2/tests/core/zstream.c b/vendor/libgit2/tests/core/zstream.c deleted file mode 100644 index 7ba9424ba3..0000000000 --- a/vendor/libgit2/tests/core/zstream.c +++ /dev/null @@ -1,143 +0,0 @@ -#include "clar_libgit2.h" -#include "buffer.h" -#include "zstream.h" - -static const char *data = "This is a test test test of This is a test"; - -#define INFLATE_EXTRA 2 - -static void assert_zlib_equal_( - const void *expected, size_t e_len, - const void *compressed, size_t c_len, - const char *msg, const char *file, int line) -{ - z_stream stream; - char *expanded = git__calloc(1, e_len + INFLATE_EXTRA); - cl_assert(expanded); - - memset(&stream, 0, sizeof(stream)); - stream.next_out = (Bytef *)expanded; - stream.avail_out = (uInt)(e_len + INFLATE_EXTRA); - stream.next_in = (Bytef *)compressed; - stream.avail_in = (uInt)c_len; - - cl_assert(inflateInit(&stream) == Z_OK); - cl_assert(inflate(&stream, Z_FINISH)); - inflateEnd(&stream); - - clar__assert_equal( - file, line, msg, 1, - "%d", (int)stream.total_out, (int)e_len); - clar__assert_equal( - file, line, "Buffer len was not exact match", 1, - "%d", (int)stream.avail_out, (int)INFLATE_EXTRA); - - clar__assert( - memcmp(expanded, expected, e_len) == 0, - file, line, "uncompressed data did not match", NULL, 1); - - git__free(expanded); -} - -#define assert_zlib_equal(E,EL,C,CL) \ - assert_zlib_equal_(E, EL, C, CL, #EL " != " #CL, __FILE__, (int)__LINE__) - -void test_core_zstream__basic(void) -{ - git_zstream z = GIT_ZSTREAM_INIT; - char out[128]; - size_t outlen = sizeof(out); - - cl_git_pass(git_zstream_init(&z)); - cl_git_pass(git_zstream_set_input(&z, data, strlen(data) + 1)); - cl_git_pass(git_zstream_get_output(out, &outlen, &z)); - cl_assert(git_zstream_done(&z)); - cl_assert(outlen > 0); - git_zstream_free(&z); - - assert_zlib_equal(data, strlen(data) + 1, out, outlen); -} - -void test_core_zstream__buffer(void) -{ - git_buf out = GIT_BUF_INIT; - cl_git_pass(git_zstream_deflatebuf(&out, data, strlen(data) + 1)); - assert_zlib_equal(data, strlen(data) + 1, out.ptr, out.size); - git_buf_free(&out); -} - -#define BIG_STRING_PART "Big Data IS Big - Long Data IS Long - We need a buffer larger than 1024 x 1024 to make sure we trigger chunked compression - Big Big Data IS Bigger than Big - Long Long Data IS Longer than Long" - -static void compress_input_various_ways(git_buf *input) -{ - git_buf out1 = GIT_BUF_INIT, out2 = GIT_BUF_INIT; - size_t i, fixed_size = max(input->size / 2, 256); - char *fixed = git__malloc(fixed_size); - cl_assert(fixed); - - /* compress with deflatebuf */ - - cl_git_pass(git_zstream_deflatebuf(&out1, input->ptr, input->size)); - assert_zlib_equal(input->ptr, input->size, out1.ptr, out1.size); - - /* compress with various fixed size buffer (accumulating the output) */ - - for (i = 0; i < 3; ++i) { - git_zstream zs = GIT_ZSTREAM_INIT; - size_t use_fixed_size; - - switch (i) { - case 0: use_fixed_size = 256; break; - case 1: use_fixed_size = fixed_size / 2; break; - case 2: use_fixed_size = fixed_size; break; - } - cl_assert(use_fixed_size <= fixed_size); - - cl_git_pass(git_zstream_init(&zs)); - cl_git_pass(git_zstream_set_input(&zs, input->ptr, input->size)); - - while (!git_zstream_done(&zs)) { - size_t written = use_fixed_size; - cl_git_pass(git_zstream_get_output(fixed, &written, &zs)); - cl_git_pass(git_buf_put(&out2, fixed, written)); - } - - git_zstream_free(&zs); - assert_zlib_equal(input->ptr, input->size, out2.ptr, out2.size); - - /* did both approaches give the same data? */ - cl_assert_equal_sz(out1.size, out2.size); - cl_assert(!memcmp(out1.ptr, out2.ptr, out1.size)); - - git_buf_free(&out2); - } - - git_buf_free(&out1); - git__free(fixed); -} - -void test_core_zstream__big_data(void) -{ - git_buf in = GIT_BUF_INIT; - size_t scan, target; - - for (target = 1024; target <= 1024 * 1024 * 4; target *= 8) { - - /* make a big string that's easy to compress */ - git_buf_clear(&in); - while (in.size < target) - cl_git_pass( - git_buf_put(&in, BIG_STRING_PART, strlen(BIG_STRING_PART))); - - compress_input_various_ways(&in); - - /* make a big string that's hard to compress */ - srand(0xabad1dea); - for (scan = 0; scan < in.size; ++scan) - in.ptr[scan] = (char)rand(); - - compress_input_various_ways(&in); - } - - git_buf_free(&in); -} diff --git a/vendor/libgit2/tests/date/date.c b/vendor/libgit2/tests/date/date.c deleted file mode 100644 index 88881d1e13..0000000000 --- a/vendor/libgit2/tests/date/date.c +++ /dev/null @@ -1,15 +0,0 @@ -#include "clar_libgit2.h" - -#include "util.h" - -void test_date_date__overflow(void) -{ -#ifdef __LP64__ - git_time_t d2038, d2039; - - /* This is expected to fail on a 32-bit machine. */ - cl_git_pass(git__date_parse(&d2038, "2038-1-1")); - cl_git_pass(git__date_parse(&d2039, "2039-1-1")); - cl_assert(d2038 < d2039); -#endif -} diff --git a/vendor/libgit2/tests/date/rfc2822.c b/vendor/libgit2/tests/date/rfc2822.c deleted file mode 100644 index eda475ac98..0000000000 --- a/vendor/libgit2/tests/date/rfc2822.c +++ /dev/null @@ -1,40 +0,0 @@ -#include "clar_libgit2.h" - -#include "util.h" - -void test_date_rfc2822__format_rfc2822_no_offset(void) -{ - git_time t = {1397031663, 0}; - char buf[GIT_DATE_RFC2822_SZ]; - - cl_git_pass(git__date_rfc2822_fmt(buf, sizeof(buf), &t)); - cl_assert(strcmp(buf, "Wed, 9 Apr 2014 08:21:03 +0000") == 0); -} - -void test_date_rfc2822__format_rfc2822_positive_offset(void) -{ - git_time t = {1397031663, 120}; - char buf[GIT_DATE_RFC2822_SZ]; - - cl_git_pass(git__date_rfc2822_fmt(buf, sizeof(buf), &t)); - cl_assert(strcmp(buf, "Wed, 9 Apr 2014 10:21:03 +0200") == 0); -} - -void test_date_rfc2822__format_rfc2822_negative_offset(void) -{ - git_time t = {1397031663, -120}; - char buf[GIT_DATE_RFC2822_SZ]; - - cl_git_pass(git__date_rfc2822_fmt(buf, sizeof(buf), &t)); - cl_assert(strcmp(buf, "Wed, 9 Apr 2014 06:21:03 -0200") == 0); -} - -void test_date_rfc2822__format_rfc2822_buffer_too_small(void) -{ - // "Wed, 10 Apr 2014 08:21:03 +0000" - git_time t = {1397031663 + 86400, 0}; - char buf[GIT_DATE_RFC2822_SZ-1]; - - cl_git_fail(git__date_rfc2822_fmt(buf, sizeof(buf), &t)); -} - diff --git a/vendor/libgit2/tests/describe/describe.c b/vendor/libgit2/tests/describe/describe.c deleted file mode 100644 index a8c57d8741..0000000000 --- a/vendor/libgit2/tests/describe/describe.c +++ /dev/null @@ -1,55 +0,0 @@ -#include "clar_libgit2.h" -#include "describe_helpers.h" - -void test_describe_describe__can_describe_against_a_bare_repo(void) -{ - git_repository *repo; - git_describe_options opts = GIT_DESCRIBE_OPTIONS_INIT; - git_describe_format_options fmt_opts = GIT_DESCRIBE_FORMAT_OPTIONS_INIT; - - cl_git_pass(git_repository_open(&repo, cl_fixture("testrepo.git"))); - - assert_describe("hard_tag", "HEAD", repo, &opts, &fmt_opts); - - opts.show_commit_oid_as_fallback = 1; - - assert_describe("be3563a*", "HEAD^", repo, &opts, &fmt_opts); - - git_repository_free(repo); -} - -static int delete_cb(git_reference *ref, void *payload) -{ - GIT_UNUSED(payload); - - cl_git_pass(git_reference_delete(ref)); - git_reference_free(ref); - - return 0; -} - -void test_describe_describe__describe_a_repo_with_no_refs(void) -{ - git_repository *repo; - git_describe_options opts = GIT_DESCRIBE_OPTIONS_INIT; - git_buf buf = GIT_BUF_INIT; - git_object *object; - git_describe_result *result = NULL; - - repo = cl_git_sandbox_init("testrepo.git"); - cl_git_pass(git_revparse_single(&object, repo, "HEAD")); - - cl_git_pass(git_reference_foreach(repo, delete_cb, NULL)); - - /* Impossible to describe without falling back to OIDs */ - cl_git_fail(git_describe_commit(&result, object, &opts)); - - /* Try again with OID fallbacks */ - opts.show_commit_oid_as_fallback = 1; - cl_git_pass(git_describe_commit(&result, object, &opts)); - - git_describe_result_free(result); - git_object_free(object); - git_buf_free(&buf); - cl_git_sandbox_cleanup(); -} diff --git a/vendor/libgit2/tests/describe/describe_helpers.c b/vendor/libgit2/tests/describe/describe_helpers.c deleted file mode 100644 index ad9c945c7d..0000000000 --- a/vendor/libgit2/tests/describe/describe_helpers.c +++ /dev/null @@ -1,42 +0,0 @@ -#include "describe_helpers.h" - -void assert_describe( - const char *expected_output, - const char *revparse_spec, - git_repository *repo, - git_describe_options *opts, - git_describe_format_options *fmt_opts) -{ - git_object *object; - git_buf label = GIT_BUF_INIT; - git_describe_result *result; - - cl_git_pass(git_revparse_single(&object, repo, revparse_spec)); - - cl_git_pass(git_describe_commit(&result, object, opts)); - cl_git_pass(git_describe_format(&label, result, fmt_opts)); - - cl_must_pass(p_fnmatch(expected_output, git_buf_cstr(&label), 0)); - - git_describe_result_free(result); - git_object_free(object); - git_buf_free(&label); -} - -void assert_describe_workdir( - const char *expected_output, - git_repository *repo, - git_describe_options *opts, - git_describe_format_options *fmt_opts) -{ - git_buf label = GIT_BUF_INIT; - git_describe_result *result; - - cl_git_pass(git_describe_workdir(&result, repo, opts)); - cl_git_pass(git_describe_format(&label, result, fmt_opts)); - - cl_must_pass(p_fnmatch(expected_output, git_buf_cstr(&label), 0)); - - git_describe_result_free(result); - git_buf_free(&label); -} diff --git a/vendor/libgit2/tests/describe/describe_helpers.h b/vendor/libgit2/tests/describe/describe_helpers.h deleted file mode 100644 index 16a0638e39..0000000000 --- a/vendor/libgit2/tests/describe/describe_helpers.h +++ /dev/null @@ -1,15 +0,0 @@ -#include "clar_libgit2.h" -#include "buffer.h" - -extern void assert_describe( - const char *expected_output, - const char *revparse_spec, - git_repository *repo, - git_describe_options *opts, - git_describe_format_options *fmt_opts); - -extern void assert_describe_workdir( - const char *expected_output, - git_repository *repo, - git_describe_options *opts, - git_describe_format_options *fmt_opts); diff --git a/vendor/libgit2/tests/describe/t6120.c b/vendor/libgit2/tests/describe/t6120.c deleted file mode 100644 index 6df397ec61..0000000000 --- a/vendor/libgit2/tests/describe/t6120.c +++ /dev/null @@ -1,156 +0,0 @@ -#include "clar_libgit2.h" -#include "describe_helpers.h" -#include "repository.h" - -// Ported from https://github.com/git/git/blob/adfc1857bdb090786fd9d22c1acec39371c76048/t/t6120-describe.sh - -static git_repository *repo; - -void test_describe_t6120__initialize(void) -{ - repo = cl_git_sandbox_init("describe"); -} - -void test_describe_t6120__cleanup(void) -{ - cl_git_sandbox_cleanup(); -} - -void test_describe_t6120__default(void) -{ - git_describe_options opts = GIT_DESCRIBE_OPTIONS_INIT; - git_describe_format_options fmt_opts = GIT_DESCRIBE_FORMAT_OPTIONS_INIT; - - assert_describe("A-*", "HEAD", repo, &opts, &fmt_opts); - assert_describe("A-*", "HEAD^", repo, &opts, &fmt_opts); - assert_describe("R-*", "HEAD^^", repo, &opts, &fmt_opts); - assert_describe("A-*", "HEAD^^2", repo, &opts, &fmt_opts); - assert_describe("B", "HEAD^^2^", repo, &opts, &fmt_opts); - assert_describe("R-*", "HEAD^^^", repo, &opts, &fmt_opts); -} - -void test_describe_t6120__tags(void) -{ - git_describe_options opts = GIT_DESCRIBE_OPTIONS_INIT; - git_describe_format_options fmt_opts = GIT_DESCRIBE_FORMAT_OPTIONS_INIT; - opts.describe_strategy = GIT_DESCRIBE_TAGS; - - assert_describe("c-*", "HEAD", repo, &opts, &fmt_opts); - assert_describe("c-*", "HEAD^", repo, &opts, &fmt_opts); - assert_describe("e-*", "HEAD^^", repo, &opts, &fmt_opts); - assert_describe("c-*", "HEAD^^2", repo, &opts, &fmt_opts); - assert_describe("B", "HEAD^^2^", repo, &opts, &fmt_opts); - assert_describe("e", "HEAD^^^", repo, &opts, &fmt_opts); -} - -void test_describe_t6120__all(void) -{ - git_describe_options opts = GIT_DESCRIBE_OPTIONS_INIT; - git_describe_format_options fmt_opts = GIT_DESCRIBE_FORMAT_OPTIONS_INIT; - opts.describe_strategy = GIT_DESCRIBE_ALL; - - assert_describe("heads/master", "HEAD", repo, &opts, &fmt_opts); - assert_describe("tags/c-*", "HEAD^", repo, &opts, &fmt_opts); - assert_describe("tags/e", "HEAD^^^", repo, &opts, &fmt_opts); -} - -void test_describe_t6120__longformat(void) -{ - git_describe_options opts = GIT_DESCRIBE_OPTIONS_INIT; - git_describe_format_options fmt_opts = GIT_DESCRIBE_FORMAT_OPTIONS_INIT; - - fmt_opts.always_use_long_format = 1; - - assert_describe("B-0-*", "HEAD^^2^", repo, &opts, &fmt_opts); - assert_describe("A-3-*", "HEAD^^2", repo, &opts, &fmt_opts); -} - -void test_describe_t6120__firstparent(void) -{ - git_describe_options opts = GIT_DESCRIBE_OPTIONS_INIT; - git_describe_format_options fmt_opts = GIT_DESCRIBE_FORMAT_OPTIONS_INIT; - opts.describe_strategy = GIT_DESCRIBE_TAGS; - - assert_describe("c-7-*", "HEAD", repo, &opts, &fmt_opts); - - opts.only_follow_first_parent = 1; - assert_describe("e-3-*", "HEAD", repo, &opts, &fmt_opts); -} - -void test_describe_t6120__workdir(void) -{ - git_describe_options opts = GIT_DESCRIBE_OPTIONS_INIT; - git_describe_format_options fmt_opts = GIT_DESCRIBE_FORMAT_OPTIONS_INIT; - - assert_describe_workdir("A-*[0-9a-f]", repo, &opts, &fmt_opts); - cl_git_mkfile("describe/file", "something different"); - - fmt_opts.dirty_suffix = "-dirty"; - assert_describe_workdir("A-*[0-9a-f]-dirty", repo, &opts, &fmt_opts); - fmt_opts.dirty_suffix = ".mod"; - assert_describe_workdir("A-*[0-9a-f].mod", repo, &opts, &fmt_opts); -} - -static void commit_and_tag( - git_time_t *time, - const char *commit_msg, - const char *tag_name) -{ - git_index *index; - git_oid commit_id; - git_reference *ref; - - cl_git_pass(git_repository_index__weakptr(&index, repo)); - - cl_git_append2file("describe/file", "\n"); - - git_index_add_bypath(index, "describe/file"); - git_index_write(index); - - *time += 10; - cl_repo_commit_from_index(&commit_id, repo, NULL, *time, commit_msg); - - if (tag_name == NULL) - return; - - cl_git_pass(git_reference_create(&ref, repo, tag_name, &commit_id, 0, NULL)); - git_reference_free(ref); -} - -void test_describe_t6120__pattern(void) -{ - git_describe_options opts = GIT_DESCRIBE_OPTIONS_INIT; - git_describe_format_options fmt_opts = GIT_DESCRIBE_FORMAT_OPTIONS_INIT; - git_oid tag_id; - git_object *head; - git_signature *tagger; - git_time_t time; - - /* set-up matching pattern tests */ - cl_git_pass(git_revparse_single(&head, repo, "HEAD")); - - time = 1380553019; - cl_git_pass(git_signature_new(&tagger, "tagger", "tagger@libgit2.org", time, 0)); - cl_git_pass(git_tag_create(&tag_id, repo, "test-annotated", head, tagger, "test-annotated", 0)); - git_signature_free(tagger); - git_object_free(head); - - commit_and_tag(&time, "one more", "refs/tags/test1-lightweight"); - commit_and_tag(&time, "yet another", "refs/tags/test2-lightweight"); - commit_and_tag(&time, "even more", NULL); - - - /* Exercize */ - opts.pattern = "test-*"; - assert_describe("test-annotated-*", "HEAD", repo, &opts, &fmt_opts); - - opts.describe_strategy = GIT_DESCRIBE_TAGS; - opts.pattern = "test1-*"; - assert_describe("test1-lightweight-*", "HEAD", repo, &opts, &fmt_opts); - - opts.pattern = "test2-*"; - assert_describe("test2-lightweight-*", "HEAD", repo, &opts, &fmt_opts); - - fmt_opts.always_use_long_format = 1; - assert_describe("test2-lightweight-*", "HEAD^", repo, &opts, &fmt_opts); -} diff --git a/vendor/libgit2/tests/diff/binary.c b/vendor/libgit2/tests/diff/binary.c deleted file mode 100644 index 5298e9ebbd..0000000000 --- a/vendor/libgit2/tests/diff/binary.c +++ /dev/null @@ -1,538 +0,0 @@ -#include "clar_libgit2.h" - -#include "git2/sys/diff.h" - -#include "buffer.h" -#include "filebuf.h" -#include "repository.h" - -static git_repository *repo; - -void test_diff_binary__initialize(void) -{ -} - -void test_diff_binary__cleanup(void) -{ - cl_git_sandbox_cleanup(); -} - -void test_patch( - const char *one, - const char *two, - const git_diff_options *opts, - const char *expected) -{ - git_oid id_one, id_two; - git_index *index = NULL; - git_commit *commit_one, *commit_two = NULL; - git_tree *tree_one, *tree_two; - git_diff *diff; - git_patch *patch; - git_buf actual = GIT_BUF_INIT; - - cl_git_pass(git_oid_fromstr(&id_one, one)); - cl_git_pass(git_commit_lookup(&commit_one, repo, &id_one)); - cl_git_pass(git_commit_tree(&tree_one, commit_one)); - - if (two) { - cl_git_pass(git_oid_fromstr(&id_two, two)); - cl_git_pass(git_commit_lookup(&commit_two, repo, &id_two)); - cl_git_pass(git_commit_tree(&tree_two, commit_two)); - } else { - cl_git_pass(git_repository_index(&index, repo)); - cl_git_pass(git_index_write_tree(&id_two, index)); - cl_git_pass(git_tree_lookup(&tree_two, repo, &id_two)); - } - - cl_git_pass(git_diff_tree_to_tree(&diff, repo, tree_one, tree_two, opts)); - - cl_git_pass(git_patch_from_diff(&patch, diff, 0)); - cl_git_pass(git_patch_to_buf(&actual, patch)); - - cl_assert_equal_s(expected, actual.ptr); - - git_buf_clear(&actual); - cl_git_pass(git_diff_print(diff, GIT_DIFF_FORMAT_PATCH, git_diff_print_callback__to_buf, &actual)); - - cl_assert_equal_s(expected, actual.ptr); - - git_buf_free(&actual); - git_patch_free(patch); - git_diff_free(diff); - git_tree_free(tree_one); - git_tree_free(tree_two); - git_commit_free(commit_one); - git_commit_free(commit_two); - git_index_free(index); -} - -void test_diff_binary__add_normal(void) -{ - git_diff_options opts = GIT_DIFF_OPTIONS_INIT; - const char *expected = - "diff --git a/binary.bin b/binary.bin\n" \ - "new file mode 100644\n" \ - "index 0000000..bd474b2\n" \ - "Binary files /dev/null and b/binary.bin differ\n"; - - repo = cl_git_sandbox_init("diff_format_email"); - test_patch( - "873806f6f27e631eb0b23e4b56bea2bfac14a373", - "897d3af16ca9e420cd071b1c4541bd2b91d04c8c", - &opts, - expected); -} - -void test_diff_binary__add(void) -{ - git_diff_options opts = GIT_DIFF_OPTIONS_INIT; - const char *expected = - "diff --git a/binary.bin b/binary.bin\n" \ - "new file mode 100644\n" \ - "index 0000000000000000000000000000000000000000..bd474b2519cc15eab801ff851cc7d50f0dee49a1\n" \ - "GIT binary patch\n" \ - "literal 3\n" \ - "Kc${Nk-~s>u4FC%O\n" - "\n" \ - "literal 0\n" \ - "Hc$@u4FC%O\n"; - - opts.flags = GIT_DIFF_SHOW_BINARY; - - repo = cl_git_sandbox_init("diff_format_email"); - test_patch( - "897d3af16ca9e420cd071b1c4541bd2b91d04c8c", - "8d7523f6fcb2404257889abe0d96f093d9f524f9", - &opts, - expected); -} - -void test_diff_binary__delete_normal(void) -{ - git_diff_options opts = GIT_DIFF_OPTIONS_INIT; - const char *expected = - "diff --git a/binary.bin b/binary.bin\n" \ - "deleted file mode 100644\n" \ - "index bd474b2..0000000\n" \ - "Binary files a/binary.bin and /dev/null differ\n"; - - repo = cl_git_sandbox_init("diff_format_email"); - test_patch( - "897d3af16ca9e420cd071b1c4541bd2b91d04c8c", - "873806f6f27e631eb0b23e4b56bea2bfac14a373", - &opts, - expected); -} - -void test_diff_binary__delete(void) -{ - git_diff_options opts = GIT_DIFF_OPTIONS_INIT; - const char *expected = - "diff --git a/binary.bin b/binary.bin\n" \ - "deleted file mode 100644\n" \ - "index bd474b2519cc15eab801ff851cc7d50f0dee49a1..0000000000000000000000000000000000000000\n" \ - "GIT binary patch\n" \ - "literal 0\n" \ - "Hc$@u4FC%O\n"; - - opts.flags = GIT_DIFF_SHOW_BINARY; - opts.id_abbrev = GIT_OID_HEXSZ; - - repo = cl_git_sandbox_init("diff_format_email"); - test_patch( - "897d3af16ca9e420cd071b1c4541bd2b91d04c8c", - "873806f6f27e631eb0b23e4b56bea2bfac14a373", - &opts, - expected); -} - -void test_diff_binary__delta(void) -{ - git_index *index; - git_buf contents = GIT_BUF_INIT; - size_t i; - git_diff_options opts = GIT_DIFF_OPTIONS_INIT; - const char *expected = - "diff --git a/songof7cities.txt b/songof7cities.txt\n" \ - "index 4210ffd5c390b21dd5483375e75288dea9ede512..cc84ec183351c9944ed90a619ca08911924055b5 100644\n" \ - "GIT binary patch\n" \ - "delta 198\n" \ - "zc$}LmI8{(0BqLQJI6p64AwNwaIJGP_Pa)Ye#M3o+qJ$PQ;Y(X&QMK*C5^Br3bjG4d=XI^5@\n" \ - "JfH567LIG)KJdFSV\n" \ - "\n" \ - "delta 198\n" \ - "zc$}LmI8{(0BqLQJI6p64AwNwaIJGP_Pr*5}Br~;mqJ$PQ;Y(X&QMK*C5^Br3bjG4d=XI^5@\n" \ - "JfH567LIF3FM2!Fd\n"; - - opts.flags = GIT_DIFF_SHOW_BINARY | GIT_DIFF_FORCE_BINARY; - opts.id_abbrev = GIT_OID_HEXSZ; - - repo = cl_git_sandbox_init("renames"); - cl_git_pass(git_repository_index(&index, repo)); - - cl_git_pass(git_futils_readbuffer(&contents, "renames/songof7cities.txt")); - - for (i = 0; i < contents.size - 6; i++) { - if (strncmp(&contents.ptr[i], "Cities", 6) == 0) - memcpy(&contents.ptr[i], "cITIES", 6); - } - - cl_git_rewritefile("renames/songof7cities.txt", contents.ptr); - cl_git_pass(git_index_add_bypath(index, "songof7cities.txt")); - cl_git_pass(git_index_write(index)); - - test_patch( - "19dd32dfb1520a64e5bbaae8dce6ef423dfa2f13", - NULL, - &opts, - expected); - - git_index_free(index); - git_buf_free(&contents); -} - -void test_diff_binary__delta_append(void) -{ - git_index *index; - git_diff_options opts = GIT_DIFF_OPTIONS_INIT; - const char *expected = - "diff --git a/untimely.txt b/untimely.txt\n" \ - "index 9a69d960ae94b060f56c2a8702545e2bb1abb935..1111d4f11f4b35bf6759e0fb714fe09731ef0840 100644\n" \ - "GIT binary patch\n" \ - "delta 32\n" \ - "nc%1vf+QYWt3zLL@hC)e3Vu?a>QDRl4f_G*?PG(-ZA}<#J$+QbW\n" \ - "\n" \ - "delta 7\n" \ - "Oc%18D`@*{63ljhg(E~C7\n"; - - opts.flags = GIT_DIFF_SHOW_BINARY | GIT_DIFF_FORCE_BINARY; - opts.id_abbrev = GIT_OID_HEXSZ; - - repo = cl_git_sandbox_init("renames"); - cl_git_pass(git_repository_index(&index, repo)); - - cl_git_append2file("renames/untimely.txt", "Oh that crazy Kipling!\r\n"); - cl_git_pass(git_index_add_bypath(index, "untimely.txt")); - cl_git_pass(git_index_write(index)); - - test_patch( - "19dd32dfb1520a64e5bbaae8dce6ef423dfa2f13", - NULL, - &opts, - expected); - - git_index_free(index); -} - -void test_diff_binary__empty_for_no_diff(void) -{ - git_diff_options opts = GIT_DIFF_OPTIONS_INIT; - git_oid id; - git_commit *commit; - git_tree *tree; - git_diff *diff; - git_buf actual = GIT_BUF_INIT; - - opts.flags = GIT_DIFF_SHOW_BINARY | GIT_DIFF_FORCE_BINARY; - opts.id_abbrev = GIT_OID_HEXSZ; - - repo = cl_git_sandbox_init("renames"); - - cl_git_pass(git_oid_fromstr(&id, "19dd32dfb1520a64e5bbaae8dce6ef423dfa2f13")); - cl_git_pass(git_commit_lookup(&commit, repo, &id)); - cl_git_pass(git_commit_tree(&tree, commit)); - - cl_git_pass(git_diff_tree_to_tree(&diff, repo, tree, tree, &opts)); - cl_git_pass(git_diff_print(diff, GIT_DIFF_FORMAT_PATCH, git_diff_print_callback__to_buf, &actual)); - - cl_assert_equal_s("", actual.ptr); - - git_buf_free(&actual); - git_diff_free(diff); - git_commit_free(commit); - git_tree_free(tree); -} - -void test_diff_binary__index_to_workdir(void) -{ - git_index *index; - git_diff *diff; - git_patch *patch; - git_buf actual = GIT_BUF_INIT; - git_diff_options opts = GIT_DIFF_OPTIONS_INIT; - const char *expected = - "diff --git a/untimely.txt b/untimely.txt\n" \ - "index 9a69d960ae94b060f56c2a8702545e2bb1abb935..1111d4f11f4b35bf6759e0fb714fe09731ef0840 100644\n" \ - "GIT binary patch\n" \ - "delta 32\n" \ - "nc%1vf+QYWt3zLL@hC)e3Vu?a>QDRl4f_G*?PG(-ZA}<#J$+QbW\n" \ - "\n" \ - "delta 7\n" \ - "Oc%18D`@*{63ljhg(E~C7\n"; - - opts.flags = GIT_DIFF_SHOW_BINARY | GIT_DIFF_FORCE_BINARY; - opts.id_abbrev = GIT_OID_HEXSZ; - - repo = cl_git_sandbox_init("renames"); - cl_git_pass(git_repository_index(&index, repo)); - - cl_git_append2file("renames/untimely.txt", "Oh that crazy Kipling!\r\n"); - - cl_git_pass(git_diff_index_to_workdir(&diff, repo, index, &opts)); - - cl_git_pass(git_patch_from_diff(&patch, diff, 0)); - cl_git_pass(git_patch_to_buf(&actual, patch)); - - cl_assert_equal_s(expected, actual.ptr); - - cl_git_pass(git_index_add_bypath(index, "untimely.txt")); - cl_git_pass(git_index_write(index)); - - test_patch( - "19dd32dfb1520a64e5bbaae8dce6ef423dfa2f13", - NULL, - &opts, - expected); - - git_buf_free(&actual); - git_patch_free(patch); - git_diff_free(diff); - git_index_free(index); -} - -static int print_cb( - const git_diff_delta *delta, - const git_diff_hunk *hunk, - const git_diff_line *line, - void *payload) -{ - git_buf *buf = (git_buf *)payload; - - GIT_UNUSED(delta); - - if (hunk) - git_buf_put(buf, hunk->header, hunk->header_len); - - if (line) - git_buf_put(buf, line->content, line->content_len); - - return git_buf_oom(buf) ? -1 : 0; -} - -void test_diff_binary__print_patch_from_diff(void) -{ - git_index *index; - git_diff *diff; - git_buf actual = GIT_BUF_INIT; - git_diff_options opts = GIT_DIFF_OPTIONS_INIT; - const char *expected = - "diff --git a/untimely.txt b/untimely.txt\n" \ - "index 9a69d960ae94b060f56c2a8702545e2bb1abb935..1111d4f11f4b35bf6759e0fb714fe09731ef0840 100644\n" \ - "GIT binary patch\n" \ - "delta 32\n" \ - "nc%1vf+QYWt3zLL@hC)e3Vu?a>QDRl4f_G*?PG(-ZA}<#J$+QbW\n" \ - "\n" \ - "delta 7\n" \ - "Oc%18D`@*{63ljhg(E~C7\n"; - - opts.flags = GIT_DIFF_SHOW_BINARY | GIT_DIFF_FORCE_BINARY; - opts.id_abbrev = GIT_OID_HEXSZ; - - repo = cl_git_sandbox_init("renames"); - cl_git_pass(git_repository_index(&index, repo)); - - cl_git_append2file("renames/untimely.txt", "Oh that crazy Kipling!\r\n"); - - cl_git_pass(git_diff_index_to_workdir(&diff, repo, index, &opts)); - - cl_git_pass(git_diff_print(diff, GIT_DIFF_FORMAT_PATCH, print_cb, &actual)); - - cl_assert_equal_s(expected, actual.ptr); - - git_buf_free(&actual); - git_diff_free(diff); - git_index_free(index); -} - -struct diff_data { - char *old_path; - git_oid old_id; - git_buf old_binary_base85; - size_t old_binary_inflatedlen; - git_diff_binary_t old_binary_type; - - char *new_path; - git_oid new_id; - git_buf new_binary_base85; - size_t new_binary_inflatedlen; - git_diff_binary_t new_binary_type; -}; - -static int file_cb( - const git_diff_delta *delta, - float progress, - void *payload) -{ - struct diff_data *diff_data = payload; - - GIT_UNUSED(progress); - - if (delta->old_file.path) - diff_data->old_path = git__strdup(delta->old_file.path); - - if (delta->new_file.path) - diff_data->new_path = git__strdup(delta->new_file.path); - - git_oid_cpy(&diff_data->old_id, &delta->old_file.id); - git_oid_cpy(&diff_data->new_id, &delta->new_file.id); - - return 0; -} - -static int binary_cb( - const git_diff_delta *delta, - const git_diff_binary *binary, - void *payload) -{ - struct diff_data *diff_data = payload; - - GIT_UNUSED(delta); - - git_buf_encode_base85(&diff_data->old_binary_base85, - binary->old_file.data, binary->old_file.datalen); - diff_data->old_binary_inflatedlen = binary->old_file.inflatedlen; - diff_data->old_binary_type = binary->old_file.type; - - git_buf_encode_base85(&diff_data->new_binary_base85, - binary->new_file.data, binary->new_file.datalen); - diff_data->new_binary_inflatedlen = binary->new_file.inflatedlen; - diff_data->new_binary_type = binary->new_file.type; - - return 0; -} - -static int hunk_cb( - const git_diff_delta *delta, - const git_diff_hunk *hunk, - void *payload) -{ - GIT_UNUSED(delta); - GIT_UNUSED(hunk); - GIT_UNUSED(payload); - - cl_fail("did not expect hunk callback"); - return 0; -} - -static int line_cb( - const git_diff_delta *delta, - const git_diff_hunk *hunk, - const git_diff_line *line, - void *payload) -{ - GIT_UNUSED(delta); - GIT_UNUSED(hunk); - GIT_UNUSED(line); - GIT_UNUSED(payload); - - cl_fail("did not expect line callback"); - return 0; -} - -void test_diff_binary__blob_to_blob(void) -{ - git_index *index; - git_diff_options opts = GIT_DIFF_OPTIONS_INIT; - git_blob *old_blob, *new_blob; - git_oid old_id, new_id; - struct diff_data diff_data = {0}; - - opts.flags = GIT_DIFF_SHOW_BINARY | GIT_DIFF_FORCE_BINARY; - opts.id_abbrev = GIT_OID_HEXSZ; - - repo = cl_git_sandbox_init("renames"); - cl_git_pass(git_repository_index__weakptr(&index, repo)); - - cl_git_append2file("renames/untimely.txt", "Oh that crazy Kipling!\r\n"); - cl_git_pass(git_index_add_bypath(index, "untimely.txt")); - cl_git_pass(git_index_write(index)); - - git_oid_fromstr(&old_id, "9a69d960ae94b060f56c2a8702545e2bb1abb935"); - git_oid_fromstr(&new_id, "1111d4f11f4b35bf6759e0fb714fe09731ef0840"); - - cl_git_pass(git_blob_lookup(&old_blob, repo, &old_id)); - cl_git_pass(git_blob_lookup(&new_blob, repo, &new_id)); - - cl_git_pass(git_diff_blobs(old_blob, - "untimely.txt", new_blob, "untimely.txt", &opts, - file_cb, binary_cb, hunk_cb, line_cb, &diff_data)); - - cl_assert_equal_s("untimely.txt", diff_data.old_path); - cl_assert_equal_oid(&old_id, &diff_data.old_id); - cl_assert_equal_i(GIT_DIFF_BINARY_DELTA, diff_data.old_binary_type); - cl_assert_equal_i(7, diff_data.old_binary_inflatedlen); - cl_assert_equal_s("c%18D`@*{63ljhg(E~C7", - diff_data.old_binary_base85.ptr); - - cl_assert_equal_s("untimely.txt", diff_data.new_path); - cl_assert_equal_oid(&new_id, &diff_data.new_id); - cl_assert_equal_i(GIT_DIFF_BINARY_DELTA, diff_data.new_binary_type); - cl_assert_equal_i(32, diff_data.new_binary_inflatedlen); - cl_assert_equal_s("c%1vf+QYWt3zLL@hC)e3Vu?a>QDRl4f_G*?PG(-ZA}<#J$+QbW", - diff_data.new_binary_base85.ptr); - - git_blob_free(old_blob); - git_blob_free(new_blob); - - git__free(diff_data.old_path); - git__free(diff_data.new_path); - - git_buf_free(&diff_data.old_binary_base85); - git_buf_free(&diff_data.new_binary_base85); -} diff --git a/vendor/libgit2/tests/diff/blob.c b/vendor/libgit2/tests/diff/blob.c deleted file mode 100644 index c3933c3134..0000000000 --- a/vendor/libgit2/tests/diff/blob.c +++ /dev/null @@ -1,1008 +0,0 @@ -#include "clar_libgit2.h" -#include "diff_helpers.h" - -static git_repository *g_repo = NULL; -static diff_expects expected; -static git_diff_options opts; -static git_blob *d, *alien; - -static void quick_diff_blob_to_str( - const git_blob *blob, const char *blob_path, - const char *str, size_t len, const char *str_path) -{ - memset(&expected, 0, sizeof(expected)); - - if (str && !len) - len = strlen(str); - - cl_git_pass(git_diff_blob_to_buffer( - blob, blob_path, str, len, str_path, - &opts, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &expected)); -} - -void test_diff_blob__initialize(void) -{ - git_oid oid; - - g_repo = cl_git_sandbox_init("attr"); - - cl_git_pass(git_diff_init_options(&opts, GIT_DIFF_OPTIONS_VERSION)); - opts.context_lines = 1; - - memset(&expected, 0, sizeof(expected)); - - /* tests/resources/attr/root_test4.txt */ - cl_git_pass(git_oid_fromstrn(&oid, "a0f7217a", 8)); - cl_git_pass(git_blob_lookup_prefix(&d, g_repo, &oid, 8)); - - /* alien.png */ - cl_git_pass(git_oid_fromstrn(&oid, "edf3dcee", 8)); - cl_git_pass(git_blob_lookup_prefix(&alien, g_repo, &oid, 8)); -} - -void test_diff_blob__cleanup(void) -{ - git_blob_free(d); - d = NULL; - - git_blob_free(alien); - alien = NULL; - - cl_git_sandbox_cleanup(); -} - -static void assert_one_modified( - int hunks, int lines, int ctxt, int adds, int dels, diff_expects *exp) -{ - cl_assert_equal_i(1, exp->files); - cl_assert_equal_i(1, exp->file_status[GIT_DELTA_MODIFIED]); - cl_assert_equal_i(0, exp->files_binary); - - cl_assert_equal_i(hunks, exp->hunks); - cl_assert_equal_i(lines, exp->lines); - cl_assert_equal_i(ctxt, exp->line_ctxt); - cl_assert_equal_i(adds, exp->line_adds); - cl_assert_equal_i(dels, exp->line_dels); -} - -void test_diff_blob__can_compare_text_blobs(void) -{ - git_blob *a, *b, *c; - git_oid a_oid, b_oid, c_oid; - - /* tests/resources/attr/root_test1 */ - cl_git_pass(git_oid_fromstrn(&a_oid, "45141a79", 8)); - cl_git_pass(git_blob_lookup_prefix(&a, g_repo, &a_oid, 4)); - - /* tests/resources/attr/root_test2 */ - cl_git_pass(git_oid_fromstrn(&b_oid, "4d713dc4", 8)); - cl_git_pass(git_blob_lookup_prefix(&b, g_repo, &b_oid, 4)); - - /* tests/resources/attr/root_test3 */ - cl_git_pass(git_oid_fromstrn(&c_oid, "c96bbb2c2557a832", 16)); - cl_git_pass(git_blob_lookup_prefix(&c, g_repo, &c_oid, 16)); - - /* Doing the equivalent of a `git diff -U1` on these files */ - - /* diff on tests/resources/attr/root_test1 */ - memset(&expected, 0, sizeof(expected)); - cl_git_pass(git_diff_blobs( - a, NULL, b, NULL, &opts, - diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &expected)); - assert_one_modified(1, 6, 1, 5, 0, &expected); - - /* same diff but use direct buffers */ - memset(&expected, 0, sizeof(expected)); - cl_git_pass(git_diff_buffers( - git_blob_rawcontent(a), (size_t)git_blob_rawsize(a), NULL, - git_blob_rawcontent(b), (size_t)git_blob_rawsize(b), NULL, &opts, - diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &expected)); - assert_one_modified(1, 6, 1, 5, 0, &expected); - - /* diff on tests/resources/attr/root_test2 */ - memset(&expected, 0, sizeof(expected)); - cl_git_pass(git_diff_blobs( - b, NULL, c, NULL, &opts, - diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &expected)); - assert_one_modified(1, 15, 3, 9, 3, &expected); - - /* diff on tests/resources/attr/root_test3 */ - memset(&expected, 0, sizeof(expected)); - cl_git_pass(git_diff_blobs( - a, NULL, c, NULL, &opts, - diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &expected)); - assert_one_modified(1, 13, 0, 12, 1, &expected); - - memset(&expected, 0, sizeof(expected)); - cl_git_pass(git_diff_blobs( - c, NULL, d, NULL, &opts, - diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &expected)); - assert_one_modified(2, 14, 4, 6, 4, &expected); - - git_blob_free(a); - git_blob_free(b); - git_blob_free(c); -} - -static void assert_patch_matches_blobs( - git_patch *p, git_blob *a, git_blob *b, - int hunks, int l0, int l1, int ctxt, int adds, int dels) -{ - const git_diff_delta *delta; - size_t tc, ta, td; - - cl_assert(p != NULL); - - delta = git_patch_get_delta(p); - cl_assert(delta != NULL); - - cl_assert_equal_i(GIT_DELTA_MODIFIED, delta->status); - cl_assert_equal_oid(git_blob_id(a), &delta->old_file.id); - cl_assert_equal_sz(git_blob_rawsize(a), delta->old_file.size); - cl_assert_equal_oid(git_blob_id(b), &delta->new_file.id); - cl_assert_equal_sz(git_blob_rawsize(b), delta->new_file.size); - - cl_assert_equal_i(hunks, (int)git_patch_num_hunks(p)); - - if (hunks > 0) - cl_assert_equal_i(l0, git_patch_num_lines_in_hunk(p, 0)); - if (hunks > 1) - cl_assert_equal_i(l1, git_patch_num_lines_in_hunk(p, 1)); - - cl_git_pass(git_patch_line_stats(&tc, &ta, &td, p)); - cl_assert_equal_i(ctxt, (int)tc); - cl_assert_equal_i(adds, (int)ta); - cl_assert_equal_i(dels, (int)td); -} - -void test_diff_blob__can_compare_text_blobs_with_patch(void) -{ - git_blob *a, *b, *c; - git_oid a_oid, b_oid, c_oid; - git_patch *p; - - /* tests/resources/attr/root_test1 */ - cl_git_pass(git_oid_fromstrn(&a_oid, "45141a79", 8)); - cl_git_pass(git_blob_lookup_prefix(&a, g_repo, &a_oid, 8)); - - /* tests/resources/attr/root_test2 */ - cl_git_pass(git_oid_fromstrn(&b_oid, "4d713dc4", 8)); - cl_git_pass(git_blob_lookup_prefix(&b, g_repo, &b_oid, 8)); - - /* tests/resources/attr/root_test3 */ - cl_git_pass(git_oid_fromstrn(&c_oid, "c96bbb2c2557a832", 16)); - cl_git_pass(git_blob_lookup_prefix(&c, g_repo, &c_oid, 16)); - - /* Doing the equivalent of a `git diff -U1` on these files */ - - /* diff on tests/resources/attr/root_test1 */ - cl_git_pass(git_patch_from_blobs(&p, a, NULL, b, NULL, &opts)); - assert_patch_matches_blobs(p, a, b, 1, 6, 0, 1, 5, 0); - git_patch_free(p); - - /* diff on tests/resources/attr/root_test2 */ - cl_git_pass(git_patch_from_blobs(&p, b, NULL, c, NULL, &opts)); - assert_patch_matches_blobs(p, b, c, 1, 15, 0, 3, 9, 3); - git_patch_free(p); - - /* diff on tests/resources/attr/root_test3 */ - cl_git_pass(git_patch_from_blobs(&p, a, NULL, c, NULL, &opts)); - assert_patch_matches_blobs(p, a, c, 1, 13, 0, 0, 12, 1); - git_patch_free(p); - - /* one more */ - cl_git_pass(git_patch_from_blobs(&p, c, NULL, d, NULL, &opts)); - assert_patch_matches_blobs(p, c, d, 2, 5, 9, 4, 6, 4); - git_patch_free(p); - - git_blob_free(a); - git_blob_free(b); - git_blob_free(c); -} - -void test_diff_blob__can_compare_against_null_blobs(void) -{ - git_blob *e = NULL; - - cl_git_pass(git_diff_blobs( - d, NULL, e, NULL, &opts, - diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &expected)); - - cl_assert_equal_i(1, expected.files); - cl_assert_equal_i(1, expected.file_status[GIT_DELTA_DELETED]); - cl_assert_equal_i(0, expected.files_binary); - - cl_assert_equal_i(1, expected.hunks); - cl_assert_equal_i(14, expected.hunk_old_lines); - cl_assert_equal_i(14, expected.lines); - cl_assert_equal_i(14, expected.line_dels); - - opts.flags |= GIT_DIFF_REVERSE; - memset(&expected, 0, sizeof(expected)); - - cl_git_pass(git_diff_blobs( - d, NULL, e, NULL, &opts, - diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &expected)); - - cl_assert_equal_i(1, expected.files); - cl_assert_equal_i(1, expected.file_status[GIT_DELTA_ADDED]); - cl_assert_equal_i(0, expected.files_binary); - - cl_assert_equal_i(1, expected.hunks); - cl_assert_equal_i(14, expected.hunk_new_lines); - cl_assert_equal_i(14, expected.lines); - cl_assert_equal_i(14, expected.line_adds); - - opts.flags ^= GIT_DIFF_REVERSE; - memset(&expected, 0, sizeof(expected)); - - cl_git_pass(git_diff_blobs( - alien, NULL, NULL, NULL, &opts, - diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &expected)); - - cl_assert_equal_i(1, expected.files); - cl_assert_equal_i(1, expected.files_binary); - cl_assert_equal_i(1, expected.file_status[GIT_DELTA_DELETED]); - cl_assert_equal_i(0, expected.hunks); - cl_assert_equal_i(0, expected.lines); - - memset(&expected, 0, sizeof(expected)); - - cl_git_pass(git_diff_blobs( - NULL, NULL, alien, NULL, &opts, - diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &expected)); - - cl_assert_equal_i(1, expected.files); - cl_assert_equal_i(1, expected.files_binary); - cl_assert_equal_i(1, expected.file_status[GIT_DELTA_ADDED]); - cl_assert_equal_i(0, expected.hunks); - cl_assert_equal_i(0, expected.lines); -} - -void test_diff_blob__can_compare_against_null_blobs_with_patch(void) -{ - git_blob *e = NULL; - git_patch *p; - const git_diff_delta *delta; - const git_diff_line *line; - int l, max_l; - - cl_git_pass(git_patch_from_blobs(&p, d, NULL, e, NULL, &opts)); - - cl_assert(p != NULL); - - delta = git_patch_get_delta(p); - cl_assert(delta != NULL); - cl_assert_equal_i(GIT_DELTA_DELETED, delta->status); - cl_assert_equal_oid(git_blob_id(d), &delta->old_file.id); - cl_assert_equal_sz(git_blob_rawsize(d), delta->old_file.size); - cl_assert(git_oid_iszero(&delta->new_file.id)); - cl_assert_equal_sz(0, delta->new_file.size); - - cl_assert_equal_i(1, (int)git_patch_num_hunks(p)); - cl_assert_equal_i(14, git_patch_num_lines_in_hunk(p, 0)); - - max_l = git_patch_num_lines_in_hunk(p, 0); - for (l = 0; l < max_l; ++l) { - cl_git_pass(git_patch_get_line_in_hunk(&line, p, 0, l)); - cl_assert_equal_i(GIT_DIFF_LINE_DELETION, (int)line->origin); - } - - git_patch_free(p); - - opts.flags |= GIT_DIFF_REVERSE; - - cl_git_pass(git_patch_from_blobs(&p, d, NULL, e, NULL, &opts)); - - cl_assert(p != NULL); - - delta = git_patch_get_delta(p); - cl_assert(delta != NULL); - cl_assert_equal_i(GIT_DELTA_ADDED, delta->status); - cl_assert(git_oid_iszero(&delta->old_file.id)); - cl_assert_equal_sz(0, delta->old_file.size); - cl_assert_equal_oid(git_blob_id(d), &delta->new_file.id); - cl_assert_equal_sz(git_blob_rawsize(d), delta->new_file.size); - - cl_assert_equal_i(1, (int)git_patch_num_hunks(p)); - cl_assert_equal_i(14, git_patch_num_lines_in_hunk(p, 0)); - - max_l = git_patch_num_lines_in_hunk(p, 0); - for (l = 0; l < max_l; ++l) { - cl_git_pass(git_patch_get_line_in_hunk(&line, p, 0, l)); - cl_assert_equal_i(GIT_DIFF_LINE_ADDITION, (int)line->origin); - } - - git_patch_free(p); - - opts.flags ^= GIT_DIFF_REVERSE; - - cl_git_pass(git_patch_from_blobs(&p, alien, NULL, NULL, NULL, &opts)); - - cl_assert(p != NULL); - - delta = git_patch_get_delta(p); - cl_assert(delta != NULL); - cl_assert_equal_i(GIT_DELTA_DELETED, delta->status); - cl_assert((delta->flags & GIT_DIFF_FLAG_BINARY) != 0); - - cl_assert_equal_i(0, (int)git_patch_num_hunks(p)); - - git_patch_free(p); - - cl_git_pass(git_patch_from_blobs(&p, NULL, NULL, alien, NULL, &opts)); - - cl_assert(p != NULL); - - delta = git_patch_get_delta(p); - cl_assert(delta != NULL); - cl_assert_equal_i(GIT_DELTA_ADDED, delta->status); - cl_assert((delta->flags & GIT_DIFF_FLAG_BINARY) != 0); - - cl_assert_equal_i(0, (int)git_patch_num_hunks(p)); - - git_patch_free(p); -} - -static void assert_identical_blobs_comparison(diff_expects *expected) -{ - cl_assert_equal_i(1, expected->files); - cl_assert_equal_i(1, expected->file_status[GIT_DELTA_UNMODIFIED]); - cl_assert_equal_i(0, expected->hunks); - cl_assert_equal_i(0, expected->lines); -} - -void test_diff_blob__can_compare_identical_blobs(void) -{ - opts.flags |= GIT_DIFF_INCLUDE_UNMODIFIED; - - cl_git_pass(git_diff_blobs( - d, NULL, d, NULL, &opts, - diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &expected)); - - assert_identical_blobs_comparison(&expected); - cl_assert_equal_i(0, expected.files_binary); - - memset(&expected, 0, sizeof(expected)); - cl_git_pass(git_diff_blobs( - NULL, NULL, NULL, NULL, &opts, - diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &expected)); - - assert_identical_blobs_comparison(&expected); - cl_assert_equal_i(0, expected.files_binary); - - memset(&expected, 0, sizeof(expected)); - cl_git_pass(git_diff_blobs( - alien, NULL, alien, NULL, &opts, - diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &expected)); - - assert_identical_blobs_comparison(&expected); - cl_assert(expected.files_binary > 0); -} - -void test_diff_blob__can_compare_identical_blobs_with_patch(void) -{ - git_patch *p; - const git_diff_delta *delta; - - cl_git_pass(git_patch_from_blobs(&p, d, NULL, d, NULL, &opts)); - cl_assert(p != NULL); - - delta = git_patch_get_delta(p); - cl_assert(delta != NULL); - cl_assert_equal_i(GIT_DELTA_UNMODIFIED, delta->status); - cl_assert_equal_sz(delta->old_file.size, git_blob_rawsize(d)); - cl_assert_equal_oid(git_blob_id(d), &delta->old_file.id); - cl_assert_equal_sz(delta->new_file.size, git_blob_rawsize(d)); - cl_assert_equal_oid(git_blob_id(d), &delta->new_file.id); - - cl_assert_equal_i(0, (int)git_patch_num_hunks(p)); - git_patch_free(p); - - cl_git_pass(git_patch_from_blobs(&p, NULL, NULL, NULL, NULL, &opts)); - cl_assert(p != NULL); - - delta = git_patch_get_delta(p); - cl_assert(delta != NULL); - cl_assert_equal_i(GIT_DELTA_UNMODIFIED, delta->status); - cl_assert_equal_sz(0, delta->old_file.size); - cl_assert(git_oid_iszero(&delta->old_file.id)); - cl_assert_equal_sz(0, delta->new_file.size); - cl_assert(git_oid_iszero(&delta->new_file.id)); - - cl_assert_equal_i(0, (int)git_patch_num_hunks(p)); - git_patch_free(p); - - cl_git_pass(git_patch_from_blobs(&p, alien, NULL, alien, NULL, &opts)); - cl_assert(p != NULL); - cl_assert_equal_i(GIT_DELTA_UNMODIFIED, git_patch_get_delta(p)->status); - cl_assert_equal_i(0, (int)git_patch_num_hunks(p)); - git_patch_free(p); -} - -static void assert_binary_blobs_comparison(diff_expects *expected) -{ - cl_assert(expected->files_binary > 0); - - cl_assert_equal_i(1, expected->files); - cl_assert_equal_i(1, expected->file_status[GIT_DELTA_MODIFIED]); - cl_assert_equal_i(0, expected->hunks); - cl_assert_equal_i(0, expected->lines); -} - -void test_diff_blob__can_compare_two_binary_blobs(void) -{ - git_blob *heart; - git_oid h_oid; - - /* heart.png */ - cl_git_pass(git_oid_fromstrn(&h_oid, "de863bff", 8)); - cl_git_pass(git_blob_lookup_prefix(&heart, g_repo, &h_oid, 8)); - - cl_git_pass(git_diff_blobs( - alien, NULL, heart, NULL, &opts, - diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &expected)); - - assert_binary_blobs_comparison(&expected); - - memset(&expected, 0, sizeof(expected)); - - cl_git_pass(git_diff_blobs( - heart, NULL, alien, NULL, &opts, - diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &expected)); - - assert_binary_blobs_comparison(&expected); - - git_blob_free(heart); -} - -void test_diff_blob__can_compare_a_binary_blob_and_a_text_blob(void) -{ - cl_git_pass(git_diff_blobs( - alien, NULL, d, NULL, &opts, - diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &expected)); - - assert_binary_blobs_comparison(&expected); - - memset(&expected, 0, sizeof(expected)); - - cl_git_pass(git_diff_blobs( - d, NULL, alien, NULL, &opts, - diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &expected)); - - assert_binary_blobs_comparison(&expected); -} - -/* - * $ git diff fe773770 a0f7217 - * diff --git a/fe773770 b/a0f7217 - * index fe77377..a0f7217 100644 - * --- a/fe773770 - * +++ b/a0f7217 - * @@ -1,6 +1,6 @@ - * Here is some stuff at the start - * - * -This should go in one hunk - * +This should go in one hunk (first) - * - * Some additional lines - * - * @@ -8,7 +8,7 @@ Down here below the other lines - * - * With even more at the end - * - * -Followed by a second hunk of stuff - * +Followed by a second hunk of stuff (second) - * - * That happens down here - */ -void test_diff_blob__comparing_two_text_blobs_honors_interhunkcontext(void) -{ - git_blob *old_d; - git_oid old_d_oid; - - opts.context_lines = 3; - - /* tests/resources/attr/root_test1 from commit f5b0af1 */ - cl_git_pass(git_oid_fromstrn(&old_d_oid, "fe773770", 8)); - cl_git_pass(git_blob_lookup_prefix(&old_d, g_repo, &old_d_oid, 8)); - - /* Test with default inter-hunk-context (not set) => default is 0 */ - cl_git_pass(git_diff_blobs( - old_d, NULL, d, NULL, &opts, - diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &expected)); - - cl_assert_equal_i(2, expected.hunks); - - /* Test with inter-hunk-context explicitly set to 0 */ - opts.interhunk_lines = 0; - memset(&expected, 0, sizeof(expected)); - cl_git_pass(git_diff_blobs( - old_d, NULL, d, NULL, &opts, - diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &expected)); - - cl_assert_equal_i(2, expected.hunks); - - /* Test with inter-hunk-context explicitly set to 1 */ - opts.interhunk_lines = 1; - memset(&expected, 0, sizeof(expected)); - cl_git_pass(git_diff_blobs( - old_d, NULL, d, NULL, &opts, - diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &expected)); - - cl_assert_equal_i(1, expected.hunks); - - git_blob_free(old_d); -} - -void test_diff_blob__checks_options_version_too_low(void) -{ - const git_error *err; - - opts.version = 0; - cl_git_fail(git_diff_blobs( - d, NULL, alien, NULL, &opts, - diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &expected)); - err = giterr_last(); - cl_assert_equal_i(GITERR_INVALID, err->klass); -} - -void test_diff_blob__checks_options_version_too_high(void) -{ - const git_error *err; - - opts.version = 1024; - cl_git_fail(git_diff_blobs( - d, NULL, alien, NULL, &opts, - diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &expected)); - err = giterr_last(); - cl_assert_equal_i(GITERR_INVALID, err->klass); -} - -void test_diff_blob__can_correctly_detect_a_binary_blob_as_binary(void) -{ - /* alien.png */ - cl_assert_equal_i(true, git_blob_is_binary(alien)); -} - -void test_diff_blob__can_correctly_detect_a_textual_blob_as_non_binary(void) -{ - /* tests/resources/attr/root_test4.txt */ - cl_assert_equal_i(false, git_blob_is_binary(d)); -} - -/* - * git_diff_blob_to_buffer tests - */ - -static void assert_changed_single_one_line_file( - diff_expects *expected, git_delta_t mod) -{ - cl_assert_equal_i(1, expected->files); - cl_assert_equal_i(1, expected->file_status[mod]); - cl_assert_equal_i(1, expected->hunks); - cl_assert_equal_i(1, expected->lines); - - if (mod == GIT_DELTA_ADDED) - cl_assert_equal_i(1, expected->line_adds); - else if (mod == GIT_DELTA_DELETED) - cl_assert_equal_i(1, expected->line_dels); -} - -void test_diff_blob__can_compare_blob_to_buffer(void) -{ - git_blob *a; - git_oid a_oid; - const char *a_content = "Hello from the root\n"; - const char *b_content = "Hello from the root\n\nSome additional lines\n\nDown here below\n\n"; - - /* tests/resources/attr/root_test1 */ - cl_git_pass(git_oid_fromstrn(&a_oid, "45141a79", 8)); - cl_git_pass(git_blob_lookup_prefix(&a, g_repo, &a_oid, 8)); - - /* diff from blob a to content of b */ - quick_diff_blob_to_str(a, NULL, b_content, 0, NULL); - assert_one_modified(1, 6, 1, 5, 0, &expected); - - /* diff from blob a to content of a */ - opts.flags |= GIT_DIFF_INCLUDE_UNMODIFIED; - quick_diff_blob_to_str(a, NULL, a_content, 0, NULL); - assert_identical_blobs_comparison(&expected); - - /* diff from NULL blob to content of a */ - memset(&expected, 0, sizeof(expected)); - quick_diff_blob_to_str(NULL, NULL, a_content, 0, NULL); - assert_changed_single_one_line_file(&expected, GIT_DELTA_ADDED); - - /* diff from blob a to NULL buffer */ - memset(&expected, 0, sizeof(expected)); - quick_diff_blob_to_str(a, NULL, NULL, 0, NULL); - assert_changed_single_one_line_file(&expected, GIT_DELTA_DELETED); - - /* diff with reverse */ - opts.flags ^= GIT_DIFF_REVERSE; - - memset(&expected, 0, sizeof(expected)); - quick_diff_blob_to_str(a, NULL, NULL, 0, NULL); - assert_changed_single_one_line_file(&expected, GIT_DELTA_ADDED); - - git_blob_free(a); -} - -void test_diff_blob__can_compare_blob_to_buffer_with_patch(void) -{ - git_patch *p; - git_blob *a; - git_oid a_oid; - const char *a_content = "Hello from the root\n"; - const char *b_content = "Hello from the root\n\nSome additional lines\n\nDown here below\n\n"; - size_t tc, ta, td; - - /* tests/resources/attr/root_test1 */ - cl_git_pass(git_oid_fromstrn(&a_oid, "45141a79", 8)); - cl_git_pass(git_blob_lookup_prefix(&a, g_repo, &a_oid, 8)); - - /* diff from blob a to content of b */ - cl_git_pass(git_patch_from_blob_and_buffer( - &p, a, NULL, b_content, strlen(b_content), NULL, &opts)); - - cl_assert(p != NULL); - cl_assert_equal_i(GIT_DELTA_MODIFIED, git_patch_get_delta(p)->status); - cl_assert_equal_i(1, (int)git_patch_num_hunks(p)); - cl_assert_equal_i(6, git_patch_num_lines_in_hunk(p, 0)); - - cl_git_pass(git_patch_line_stats(&tc, &ta, &td, p)); - cl_assert_equal_i(1, (int)tc); - cl_assert_equal_i(5, (int)ta); - cl_assert_equal_i(0, (int)td); - - git_patch_free(p); - - /* diff from blob a to content of a */ - opts.flags |= GIT_DIFF_INCLUDE_UNMODIFIED; - cl_git_pass(git_patch_from_blob_and_buffer( - &p, a, NULL, a_content, strlen(a_content), NULL, &opts)); - cl_assert(p != NULL); - cl_assert_equal_i(GIT_DELTA_UNMODIFIED, git_patch_get_delta(p)->status); - cl_assert_equal_i(0, (int)git_patch_num_hunks(p)); - git_patch_free(p); - - /* diff from NULL blob to content of a */ - cl_git_pass(git_patch_from_blob_and_buffer( - &p, NULL, NULL, a_content, strlen(a_content), NULL, &opts)); - cl_assert(p != NULL); - cl_assert_equal_i(GIT_DELTA_ADDED, git_patch_get_delta(p)->status); - cl_assert_equal_i(1, (int)git_patch_num_hunks(p)); - cl_assert_equal_i(1, git_patch_num_lines_in_hunk(p, 0)); - git_patch_free(p); - - /* diff from blob a to NULL buffer */ - cl_git_pass(git_patch_from_blob_and_buffer( - &p, a, NULL, NULL, 0, NULL, &opts)); - cl_assert(p != NULL); - cl_assert_equal_i(GIT_DELTA_DELETED, git_patch_get_delta(p)->status); - cl_assert_equal_i(1, (int)git_patch_num_hunks(p)); - cl_assert_equal_i(1, git_patch_num_lines_in_hunk(p, 0)); - git_patch_free(p); - - /* diff with reverse */ - opts.flags ^= GIT_DIFF_REVERSE; - - cl_git_pass(git_patch_from_blob_and_buffer( - &p, a, NULL, NULL, 0, NULL, &opts)); - cl_assert(p != NULL); - cl_assert_equal_i(GIT_DELTA_ADDED, git_patch_get_delta(p)->status); - cl_assert_equal_i(1, (int)git_patch_num_hunks(p)); - cl_assert_equal_i(1, git_patch_num_lines_in_hunk(p, 0)); - git_patch_free(p); - - git_blob_free(a); -} - -static void assert_one_modified_with_lines(diff_expects *expected, int lines) -{ - cl_assert_equal_i(1, expected->files); - cl_assert_equal_i(1, expected->file_status[GIT_DELTA_MODIFIED]); - cl_assert_equal_i(0, expected->files_binary); - cl_assert_equal_i(lines, expected->lines); -} - -void test_diff_blob__binary_data_comparisons(void) -{ - git_blob *bin, *nonbin; - git_oid oid; - const char *nonbin_content = "Hello from the root\n"; - size_t nonbin_len = 20; - const char *bin_content = "0123456789\n\x01\x02\x03\x04\x05\x06\x07\x08\x09\x00\n0123456789\n"; - size_t bin_len = 33; - - opts.flags |= GIT_DIFF_INCLUDE_UNMODIFIED; - - cl_git_pass(git_oid_fromstrn(&oid, "45141a79", 8)); - cl_git_pass(git_blob_lookup_prefix(&nonbin, g_repo, &oid, 8)); - - cl_git_pass(git_oid_fromstrn(&oid, "b435cd56", 8)); - cl_git_pass(git_blob_lookup_prefix(&bin, g_repo, &oid, 8)); - - /* non-binary to reference content */ - - quick_diff_blob_to_str(nonbin, NULL, nonbin_content, nonbin_len, NULL); - assert_identical_blobs_comparison(&expected); - cl_assert_equal_i(0, expected.files_binary); - - /* binary to reference content */ - - quick_diff_blob_to_str(bin, NULL, bin_content, bin_len, NULL); - assert_identical_blobs_comparison(&expected); - - cl_assert_equal_i(1, expected.files_binary); - - /* non-binary to binary content */ - - quick_diff_blob_to_str(nonbin, NULL, bin_content, bin_len, NULL); - assert_binary_blobs_comparison(&expected); - - /* binary to non-binary content */ - - quick_diff_blob_to_str(bin, NULL, nonbin_content, nonbin_len, NULL); - assert_binary_blobs_comparison(&expected); - - /* non-binary to binary blob */ - - memset(&expected, 0, sizeof(expected)); - cl_git_pass(git_diff_blobs( - bin, NULL, nonbin, NULL, &opts, - diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &expected)); - assert_binary_blobs_comparison(&expected); - - /* - * repeat with FORCE_TEXT - */ - - opts.flags |= GIT_DIFF_FORCE_TEXT; - - quick_diff_blob_to_str(bin, NULL, bin_content, bin_len, NULL); - assert_identical_blobs_comparison(&expected); - - quick_diff_blob_to_str(nonbin, NULL, bin_content, bin_len, NULL); - assert_one_modified_with_lines(&expected, 4); - - quick_diff_blob_to_str(bin, NULL, nonbin_content, nonbin_len, NULL); - assert_one_modified_with_lines(&expected, 4); - - memset(&expected, 0, sizeof(expected)); - cl_git_pass(git_diff_blobs( - bin, NULL, nonbin, NULL, &opts, - diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &expected)); - assert_one_modified_with_lines(&expected, 4); - - /* cleanup */ - git_blob_free(bin); - git_blob_free(nonbin); -} - -void test_diff_blob__using_path_and_attributes(void) -{ - git_config *cfg; - git_blob *bin, *nonbin; - git_oid oid; - const char *nonbin_content = "Hello from the root\n"; - const char *bin_content = - "0123456789\n\x01\x02\x03\x04\x05\x06\x07\x08\x09\x00\n0123456789\n"; - size_t bin_len = 33; - const char *changed; - git_patch *p; - git_buf buf = GIT_BUF_INIT; - - /* set up custom diff drivers and 'diff' attribute mappings for them */ - - cl_git_pass(git_repository_config(&cfg, g_repo)); - cl_git_pass(git_config_set_bool(cfg, "diff.iam_binary.binary", 1)); - cl_git_pass(git_config_set_bool(cfg, "diff.iam_text.binary", 0)); - cl_git_pass(git_config_set_string( - cfg, "diff.iam_alphactx.xfuncname", "^[A-Za-z].*$")); - cl_git_pass(git_config_set_bool(cfg, "diff.iam_textalpha.binary", 0)); - cl_git_pass(git_config_set_string( - cfg, "diff.iam_textalpha.xfuncname", "^[A-Za-z].*$")); - cl_git_pass(git_config_set_string( - cfg, "diff.iam_numctx.funcname", "^[0-9][0-9]*")); - cl_git_pass(git_config_set_bool(cfg, "diff.iam_textnum.binary", 0)); - cl_git_pass(git_config_set_string( - cfg, "diff.iam_textnum.funcname", "^[0-9][0-9]*")); - git_config_free(cfg); - - cl_git_append2file( - "attr/.gitattributes", - "\n\n# test_diff_blob__using_path_and_attributes extra\n\n" - "*.binary diff=iam_binary\n" - "*.textary diff=iam_text\n" - "*.alphary diff=iam_alphactx\n" - "*.textalphary diff=iam_textalpha\n" - "*.textnumary diff=iam_textnum\n" - "*.numary diff=iam_numctx\n\n"); - - opts.context_lines = 0; - opts.flags |= GIT_DIFF_INCLUDE_UNMODIFIED; - - cl_git_pass(git_oid_fromstrn(&oid, "45141a79", 8)); - cl_git_pass(git_blob_lookup_prefix(&nonbin, g_repo, &oid, 8)); - /* 20b: "Hello from the root\n" */ - - cl_git_pass(git_oid_fromstrn(&oid, "b435cd56", 8)); - cl_git_pass(git_blob_lookup_prefix(&bin, g_repo, &oid, 8)); - /* 33b: "0123456789\n\x01\x02\x03\x04\x05\x06\x07\x08\x09\n0123456789\n" */ - - /* non-binary to reference content */ - - quick_diff_blob_to_str(nonbin, NULL, nonbin_content, 0, NULL); - assert_identical_blobs_comparison(&expected); - cl_assert_equal_i(0, expected.files_binary); - - /* binary to reference content */ - - quick_diff_blob_to_str(bin, NULL, bin_content, bin_len, NULL); - assert_identical_blobs_comparison(&expected); - cl_assert_equal_i(1, expected.files_binary); - - /* add some text */ - - changed = "Hello from the root\nMore lines\nAnd more\nGo here\n"; - - quick_diff_blob_to_str(nonbin, NULL, changed, 0, NULL); - assert_one_modified(1, 3, 0, 3, 0, &expected); - - quick_diff_blob_to_str(nonbin, "foo/bar.binary", changed, 0, NULL); - cl_assert_equal_i(1, expected.files); - cl_assert_equal_i(1, expected.file_status[GIT_DELTA_MODIFIED]); - cl_assert_equal_i(1, expected.files_binary); - cl_assert_equal_i(0, expected.hunks); - cl_assert_equal_i(0, expected.lines); - - quick_diff_blob_to_str(nonbin, "foo/bar.textary", changed, 0, NULL); - assert_one_modified(1, 3, 0, 3, 0, &expected); - - quick_diff_blob_to_str(nonbin, "foo/bar.alphary", changed, 0, NULL); - assert_one_modified(1, 3, 0, 3, 0, &expected); - - cl_git_pass(git_patch_from_blob_and_buffer( - &p, nonbin, "zzz.normal", changed, strlen(changed), NULL, &opts)); - cl_git_pass(git_patch_to_buf(&buf, p)); - cl_assert_equal_s( - "diff --git a/zzz.normal b/zzz.normal\n" - "index 45141a7..75b0dbb 100644\n" - "--- a/zzz.normal\n" - "+++ b/zzz.normal\n" - "@@ -1,0 +2,3 @@ Hello from the root\n" - "+More lines\n" - "+And more\n" - "+Go here\n", buf.ptr); - git_buf_clear(&buf); - git_patch_free(p); - - cl_git_pass(git_patch_from_blob_and_buffer( - &p, nonbin, "zzz.binary", changed, strlen(changed), NULL, &opts)); - cl_git_pass(git_patch_to_buf(&buf, p)); - cl_assert_equal_s( - "diff --git a/zzz.binary b/zzz.binary\n" - "index 45141a7..75b0dbb 100644\n" - "Binary files a/zzz.binary and b/zzz.binary differ\n", buf.ptr); - git_buf_clear(&buf); - git_patch_free(p); - - cl_git_pass(git_patch_from_blob_and_buffer( - &p, nonbin, "zzz.alphary", changed, strlen(changed), NULL, &opts)); - cl_git_pass(git_patch_to_buf(&buf, p)); - cl_assert_equal_s( - "diff --git a/zzz.alphary b/zzz.alphary\n" - "index 45141a7..75b0dbb 100644\n" - "--- a/zzz.alphary\n" - "+++ b/zzz.alphary\n" - "@@ -1,0 +2,3 @@ Hello from the root\n" - "+More lines\n" - "+And more\n" - "+Go here\n", buf.ptr); - git_buf_clear(&buf); - git_patch_free(p); - - cl_git_pass(git_patch_from_blob_and_buffer( - &p, nonbin, "zzz.numary", changed, strlen(changed), NULL, &opts)); - cl_git_pass(git_patch_to_buf(&buf, p)); - cl_assert_equal_s( - "diff --git a/zzz.numary b/zzz.numary\n" - "index 45141a7..75b0dbb 100644\n" - "--- a/zzz.numary\n" - "+++ b/zzz.numary\n" - "@@ -1,0 +2,3 @@\n" - "+More lines\n" - "+And more\n" - "+Go here\n", buf.ptr); - git_buf_clear(&buf); - git_patch_free(p); - - /* "0123456789\n\x01\x02\x03\x04\x05\x06\x07\x08\x09\x00\n0123456789\n" - * 33 bytes - */ - - changed = "0123456789\n\x01\x02\x03\x04\x05\x06\x07\x08\x09\x00\nreplace a line\n"; - - cl_git_pass(git_patch_from_blob_and_buffer( - &p, bin, "zzz.normal", changed, 37, NULL, &opts)); - cl_git_pass(git_patch_to_buf(&buf, p)); - cl_assert_equal_s( - "diff --git a/zzz.normal b/zzz.normal\n" - "index b435cd5..1604519 100644\n" - "Binary files a/zzz.normal and b/zzz.normal differ\n", buf.ptr); - git_buf_clear(&buf); - git_patch_free(p); - - cl_git_pass(git_patch_from_blob_and_buffer( - &p, bin, "zzz.textary", changed, 37, NULL, &opts)); - cl_git_pass(git_patch_to_buf(&buf, p)); - cl_assert_equal_s( - "diff --git a/zzz.textary b/zzz.textary\n" - "index b435cd5..1604519 100644\n" - "--- a/zzz.textary\n" - "+++ b/zzz.textary\n" - "@@ -3 +3 @@\n" - "-0123456789\n" - "+replace a line\n", buf.ptr); - git_buf_clear(&buf); - git_patch_free(p); - - cl_git_pass(git_patch_from_blob_and_buffer( - &p, bin, "zzz.textalphary", changed, 37, NULL, &opts)); - cl_git_pass(git_patch_to_buf(&buf, p)); - cl_assert_equal_s( - "diff --git a/zzz.textalphary b/zzz.textalphary\n" - "index b435cd5..1604519 100644\n" - "--- a/zzz.textalphary\n" - "+++ b/zzz.textalphary\n" - "@@ -3 +3 @@\n" - "-0123456789\n" - "+replace a line\n", buf.ptr); - git_buf_clear(&buf); - git_patch_free(p); - - cl_git_pass(git_patch_from_blob_and_buffer( - &p, bin, "zzz.textnumary", changed, 37, NULL, &opts)); - cl_git_pass(git_patch_to_buf(&buf, p)); - cl_assert_equal_s( - "diff --git a/zzz.textnumary b/zzz.textnumary\n" - "index b435cd5..1604519 100644\n" - "--- a/zzz.textnumary\n" - "+++ b/zzz.textnumary\n" - "@@ -3 +3 @@ 0123456789\n" - "-0123456789\n" - "+replace a line\n", buf.ptr); - git_buf_clear(&buf); - git_patch_free(p); - - git_buf_free(&buf); - git_blob_free(nonbin); - git_blob_free(bin); -} - -void test_diff_blob__can_compare_buffer_to_buffer(void) -{ - const char *a = "a\nb\nc\nd\ne\nf\ng\nh\ni\nj\n"; - const char *b = "a\nB\nc\nd\nE\nF\nh\nj\nk\n"; - - opts.interhunk_lines = 0; - opts.context_lines = 0; - - memset(&expected, 0, sizeof(expected)); - - cl_git_pass(git_diff_buffers( - a, strlen(a), NULL, b, strlen(b), NULL, &opts, - diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &expected)); - assert_one_modified(4, 9, 0, 4, 5, &expected); - - opts.flags ^= GIT_DIFF_REVERSE; - - memset(&expected, 0, sizeof(expected)); - - cl_git_pass(git_diff_buffers( - a, strlen(a), NULL, b, strlen(b), NULL, &opts, - diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &expected)); - assert_one_modified(4, 9, 0, 5, 4, &expected); -} diff --git a/vendor/libgit2/tests/diff/diff_helpers.c b/vendor/libgit2/tests/diff/diff_helpers.c deleted file mode 100644 index c6cdf803fc..0000000000 --- a/vendor/libgit2/tests/diff/diff_helpers.c +++ /dev/null @@ -1,243 +0,0 @@ -#include "clar_libgit2.h" -#include "diff_helpers.h" -#include "git2/sys/diff.h" - -git_tree *resolve_commit_oid_to_tree( - git_repository *repo, - const char *partial_oid) -{ - size_t len = strlen(partial_oid); - git_oid oid; - git_object *obj = NULL; - git_tree *tree = NULL; - - if (git_oid_fromstrn(&oid, partial_oid, len) == 0) - cl_git_pass(git_object_lookup_prefix(&obj, repo, &oid, len, GIT_OBJ_ANY)); - - cl_git_pass(git_object_peel((git_object **) &tree, obj, GIT_OBJ_TREE)); - git_object_free(obj); - return tree; -} - -static char diff_pick_suffix(int mode) -{ - if (S_ISDIR(mode)) - return '/'; - else if (GIT_PERMS_IS_EXEC(mode)) - return '*'; - else - return ' '; -} - -static void fprintf_delta(FILE *fp, const git_diff_delta *delta, float progress) -{ - char code = git_diff_status_char(delta->status); - char old_suffix = diff_pick_suffix(delta->old_file.mode); - char new_suffix = diff_pick_suffix(delta->new_file.mode); - - fprintf(fp, "%c\t%s", code, delta->old_file.path); - - if ((delta->old_file.path != delta->new_file.path && - strcmp(delta->old_file.path, delta->new_file.path) != 0) || - (delta->old_file.mode != delta->new_file.mode && - delta->old_file.mode != 0 && delta->new_file.mode != 0)) - fprintf(fp, "%c %s%c", old_suffix, delta->new_file.path, new_suffix); - else if (old_suffix != ' ') - fprintf(fp, "%c", old_suffix); - - fprintf(fp, "\t[%.2f]\n", progress); -} - -int diff_file_cb( - const git_diff_delta *delta, - float progress, - void *payload) -{ - diff_expects *e = payload; - - if (e->debug) - fprintf_delta(stderr, delta, progress); - - if (e->names) - cl_assert_equal_s(e->names[e->files], delta->old_file.path); - if (e->statuses) - cl_assert_equal_i(e->statuses[e->files], (int)delta->status); - - e->files++; - - if ((delta->flags & GIT_DIFF_FLAG_BINARY) != 0) - e->files_binary++; - - cl_assert(delta->status <= GIT_DELTA_CONFLICTED); - - e->file_status[delta->status] += 1; - - return 0; -} - -int diff_print_file_cb( - const git_diff_delta *delta, - float progress, - void *payload) -{ - if (!payload) { - fprintf_delta(stderr, delta, progress); - return 0; - } - - if (!((diff_expects *)payload)->debug) - fprintf_delta(stderr, delta, progress); - - return diff_file_cb(delta, progress, payload); -} - -int diff_binary_cb( - const git_diff_delta *delta, - const git_diff_binary *binary, - void *payload) -{ - GIT_UNUSED(delta); - GIT_UNUSED(binary); - GIT_UNUSED(payload); - - return 0; -} - -int diff_hunk_cb( - const git_diff_delta *delta, - const git_diff_hunk *hunk, - void *payload) -{ - diff_expects *e = payload; - const char *scan = hunk->header, *scan_end = scan + hunk->header_len; - - GIT_UNUSED(delta); - - /* confirm no NUL bytes in header text */ - while (scan < scan_end) - cl_assert('\0' != *scan++); - - e->hunks++; - e->hunk_old_lines += hunk->old_lines; - e->hunk_new_lines += hunk->new_lines; - return 0; -} - -int diff_line_cb( - const git_diff_delta *delta, - const git_diff_hunk *hunk, - const git_diff_line *line, - void *payload) -{ - diff_expects *e = payload; - - GIT_UNUSED(delta); - GIT_UNUSED(hunk); - - e->lines++; - switch (line->origin) { - case GIT_DIFF_LINE_CONTEXT: - case GIT_DIFF_LINE_CONTEXT_EOFNL: /* techically not a line */ - e->line_ctxt++; - break; - case GIT_DIFF_LINE_ADDITION: - case GIT_DIFF_LINE_ADD_EOFNL: /* technically not a line add */ - e->line_adds++; - break; - case GIT_DIFF_LINE_DELETION: - case GIT_DIFF_LINE_DEL_EOFNL: /* technically not a line delete */ - e->line_dels++; - break; - default: - break; - } - return 0; -} - -int diff_foreach_via_iterator( - git_diff *diff, - git_diff_file_cb file_cb, - git_diff_binary_cb binary_cb, - git_diff_hunk_cb hunk_cb, - git_diff_line_cb line_cb, - void *data) -{ - size_t d, num_d = git_diff_num_deltas(diff); - - GIT_UNUSED(binary_cb); - - for (d = 0; d < num_d; ++d) { - git_patch *patch; - const git_diff_delta *delta; - size_t h, num_h; - - cl_git_pass(git_patch_from_diff(&patch, diff, d)); - cl_assert((delta = git_patch_get_delta(patch)) != NULL); - - /* call file_cb for this file */ - if (file_cb != NULL && file_cb(delta, (float)d / num_d, data) != 0) { - git_patch_free(patch); - goto abort; - } - - /* if there are no changes, then the patch will be NULL */ - if (!patch) { - cl_assert(delta->status == GIT_DELTA_UNMODIFIED || - (delta->flags & GIT_DIFF_FLAG_BINARY) != 0); - continue; - } - - if (!hunk_cb && !line_cb) { - git_patch_free(patch); - continue; - } - - num_h = git_patch_num_hunks(patch); - - for (h = 0; h < num_h; h++) { - const git_diff_hunk *hunk; - size_t l, num_l; - - cl_git_pass(git_patch_get_hunk(&hunk, &num_l, patch, h)); - - if (hunk_cb && hunk_cb(delta, hunk, data) != 0) { - git_patch_free(patch); - goto abort; - } - - for (l = 0; l < num_l; ++l) { - const git_diff_line *line; - - cl_git_pass(git_patch_get_line_in_hunk(&line, patch, h, l)); - - if (line_cb && - line_cb(delta, hunk, line, data) != 0) { - git_patch_free(patch); - goto abort; - } - } - } - - git_patch_free(patch); - } - - return 0; - -abort: - giterr_clear(); - return GIT_EUSER; -} - -void diff_print(FILE *fp, git_diff *diff) -{ - cl_git_pass( - git_diff_print(diff, GIT_DIFF_FORMAT_PATCH, - git_diff_print_callback__to_file_handle, fp ? fp : stderr)); -} - -void diff_print_raw(FILE *fp, git_diff *diff) -{ - cl_git_pass( - git_diff_print(diff, GIT_DIFF_FORMAT_RAW, - git_diff_print_callback__to_file_handle, fp ? fp : stderr)); -} diff --git a/vendor/libgit2/tests/diff/diff_helpers.h b/vendor/libgit2/tests/diff/diff_helpers.h deleted file mode 100644 index 4d3cd34744..0000000000 --- a/vendor/libgit2/tests/diff/diff_helpers.h +++ /dev/null @@ -1,70 +0,0 @@ -#include "fileops.h" -#include "git2/diff.h" - -extern git_tree *resolve_commit_oid_to_tree( - git_repository *repo, const char *partial_oid); - -typedef struct { - int files; - int files_binary; - - int file_status[11]; /* indexed by git_delta_t value */ - - int hunks; - int hunk_new_lines; - int hunk_old_lines; - - int lines; - int line_ctxt; - int line_adds; - int line_dels; - - /* optional arrays of expected specific values */ - const char **names; - int *statuses; - - int debug; - -} diff_expects; - -typedef struct { - const char *path; - const char *matched_pathspec; -} notify_expected; - -extern int diff_file_cb( - const git_diff_delta *delta, - float progress, - void *cb_data); - -extern int diff_print_file_cb( - const git_diff_delta *delta, - float progress, - void *cb_data); - -extern int diff_binary_cb( - const git_diff_delta *delta, - const git_diff_binary *binary, - void *cb_data); - -extern int diff_hunk_cb( - const git_diff_delta *delta, - const git_diff_hunk *hunk, - void *cb_data); - -extern int diff_line_cb( - const git_diff_delta *delta, - const git_diff_hunk *hunk, - const git_diff_line *line, - void *cb_data); - -extern int diff_foreach_via_iterator( - git_diff *diff, - git_diff_file_cb file_cb, - git_diff_binary_cb binary_cb, - git_diff_hunk_cb hunk_cb, - git_diff_line_cb line_cb, - void *data); - -extern void diff_print(FILE *fp, git_diff *diff); -extern void diff_print_raw(FILE *fp, git_diff *diff); diff --git a/vendor/libgit2/tests/diff/diffiter.c b/vendor/libgit2/tests/diff/diffiter.c deleted file mode 100644 index c976e30e29..0000000000 --- a/vendor/libgit2/tests/diff/diffiter.c +++ /dev/null @@ -1,453 +0,0 @@ -#include "clar_libgit2.h" -#include "diff_helpers.h" - -void test_diff_diffiter__initialize(void) -{ -} - -void test_diff_diffiter__cleanup(void) -{ - cl_git_sandbox_cleanup(); -} - -void test_diff_diffiter__create(void) -{ - git_repository *repo = cl_git_sandbox_init("attr"); - git_diff *diff; - size_t d, num_d; - - cl_git_pass(git_diff_index_to_workdir(&diff, repo, NULL, NULL)); - - num_d = git_diff_num_deltas(diff); - for (d = 0; d < num_d; ++d) { - const git_diff_delta *delta = git_diff_get_delta(diff, d); - cl_assert(delta != NULL); - } - - cl_assert(!git_diff_get_delta(diff, num_d)); - - git_diff_free(diff); -} - -void test_diff_diffiter__iterate_files_1(void) -{ - git_repository *repo = cl_git_sandbox_init("attr"); - git_diff *diff; - size_t d, num_d; - diff_expects exp = { 0 }; - - cl_git_pass(git_diff_index_to_workdir(&diff, repo, NULL, NULL)); - - num_d = git_diff_num_deltas(diff); - - for (d = 0; d < num_d; ++d) { - const git_diff_delta *delta = git_diff_get_delta(diff, d); - cl_assert(delta != NULL); - - diff_file_cb(delta, (float)d / (float)num_d, &exp); - } - cl_assert_equal_sz(6, exp.files); - - git_diff_free(diff); -} - -void test_diff_diffiter__iterate_files_2(void) -{ - git_repository *repo = cl_git_sandbox_init("status"); - git_diff *diff; - size_t d, num_d; - int count = 0; - - cl_git_pass(git_diff_index_to_workdir(&diff, repo, NULL, NULL)); - - num_d = git_diff_num_deltas(diff); - cl_assert_equal_i(8, (int)num_d); - - for (d = 0; d < num_d; ++d) { - const git_diff_delta *delta = git_diff_get_delta(diff, d); - cl_assert(delta != NULL); - count++; - } - cl_assert_equal_i(8, count); - - git_diff_free(diff); -} - -void test_diff_diffiter__iterate_files_and_hunks(void) -{ - git_repository *repo = cl_git_sandbox_init("status"); - git_diff_options opts = GIT_DIFF_OPTIONS_INIT; - git_diff *diff = NULL; - size_t d, num_d; - int file_count = 0, hunk_count = 0; - - opts.context_lines = 3; - opts.interhunk_lines = 1; - opts.flags |= GIT_DIFF_INCLUDE_IGNORED | GIT_DIFF_INCLUDE_UNTRACKED; - - cl_git_pass(git_diff_index_to_workdir(&diff, repo, NULL, &opts)); - - num_d = git_diff_num_deltas(diff); - - for (d = 0; d < num_d; ++d) { - git_patch *patch; - size_t h, num_h; - - cl_git_pass(git_patch_from_diff(&patch, diff, d)); - cl_assert(patch); - - file_count++; - - num_h = git_patch_num_hunks(patch); - - for (h = 0; h < num_h; h++) { - const git_diff_hunk *hunk; - - cl_git_pass(git_patch_get_hunk(&hunk, NULL, patch, h)); - cl_assert(hunk); - - hunk_count++; - } - - git_patch_free(patch); - } - - cl_assert_equal_i(13, file_count); - cl_assert_equal_i(8, hunk_count); - - git_diff_free(diff); -} - -void test_diff_diffiter__max_size_threshold(void) -{ - git_repository *repo = cl_git_sandbox_init("status"); - git_diff_options opts = GIT_DIFF_OPTIONS_INIT; - git_diff *diff = NULL; - int file_count = 0, binary_count = 0, hunk_count = 0; - size_t d, num_d; - - opts.context_lines = 3; - opts.interhunk_lines = 1; - opts.flags |= GIT_DIFF_INCLUDE_IGNORED | GIT_DIFF_INCLUDE_UNTRACKED; - - cl_git_pass(git_diff_index_to_workdir(&diff, repo, NULL, &opts)); - num_d = git_diff_num_deltas(diff); - - for (d = 0; d < num_d; ++d) { - git_patch *patch; - const git_diff_delta *delta; - - cl_git_pass(git_patch_from_diff(&patch, diff, d)); - cl_assert(patch); - delta = git_patch_get_delta(patch); - cl_assert(delta); - - file_count++; - hunk_count += (int)git_patch_num_hunks(patch); - - assert((delta->flags & (GIT_DIFF_FLAG_BINARY|GIT_DIFF_FLAG_NOT_BINARY)) != 0); - binary_count += ((delta->flags & GIT_DIFF_FLAG_BINARY) != 0); - - git_patch_free(patch); - } - - cl_assert_equal_i(13, file_count); - cl_assert_equal_i(0, binary_count); - cl_assert_equal_i(8, hunk_count); - - git_diff_free(diff); - - /* try again with low file size threshold */ - - file_count = binary_count = hunk_count = 0; - - opts.context_lines = 3; - opts.interhunk_lines = 1; - opts.flags |= GIT_DIFF_INCLUDE_IGNORED | GIT_DIFF_INCLUDE_UNTRACKED; - opts.max_size = 50; /* treat anything over 50 bytes as binary! */ - - cl_git_pass(git_diff_index_to_workdir(&diff, repo, NULL, &opts)); - num_d = git_diff_num_deltas(diff); - - for (d = 0; d < num_d; ++d) { - git_patch *patch; - const git_diff_delta *delta; - - cl_git_pass(git_patch_from_diff(&patch, diff, d)); - delta = git_patch_get_delta(patch); - - file_count++; - hunk_count += (int)git_patch_num_hunks(patch); - - assert((delta->flags & (GIT_DIFF_FLAG_BINARY|GIT_DIFF_FLAG_NOT_BINARY)) != 0); - binary_count += ((delta->flags & GIT_DIFF_FLAG_BINARY) != 0); - - git_patch_free(patch); - } - - cl_assert_equal_i(13, file_count); - /* Three files are over the 50 byte threshold: - * - staged_changes_file_deleted - * - staged_changes_modified_file - * - staged_new_file_modified_file - */ - cl_assert_equal_i(3, binary_count); - cl_assert_equal_i(5, hunk_count); - - git_diff_free(diff); -} - - -void test_diff_diffiter__iterate_all(void) -{ - git_repository *repo = cl_git_sandbox_init("status"); - git_diff_options opts = GIT_DIFF_OPTIONS_INIT; - git_diff *diff = NULL; - diff_expects exp = {0}; - size_t d, num_d; - - opts.context_lines = 3; - opts.interhunk_lines = 1; - opts.flags |= GIT_DIFF_INCLUDE_IGNORED | GIT_DIFF_INCLUDE_UNTRACKED; - - cl_git_pass(git_diff_index_to_workdir(&diff, repo, NULL, &opts)); - - num_d = git_diff_num_deltas(diff); - for (d = 0; d < num_d; ++d) { - git_patch *patch; - size_t h, num_h; - - cl_git_pass(git_patch_from_diff(&patch, diff, d)); - cl_assert(patch); - exp.files++; - - num_h = git_patch_num_hunks(patch); - for (h = 0; h < num_h; h++) { - const git_diff_hunk *range; - size_t l, num_l; - - cl_git_pass(git_patch_get_hunk(&range, &num_l, patch, h)); - cl_assert(range); - exp.hunks++; - - for (l = 0; l < num_l; ++l) { - const git_diff_line *line; - - cl_git_pass(git_patch_get_line_in_hunk(&line, patch, h, l)); - cl_assert(line && line->content); - exp.lines++; - } - } - - git_patch_free(patch); - } - - cl_assert_equal_i(13, exp.files); - cl_assert_equal_i(8, exp.hunks); - cl_assert_equal_i(14, exp.lines); - - git_diff_free(diff); -} - -static void iterate_over_patch(git_patch *patch, diff_expects *exp) -{ - size_t h, num_h = git_patch_num_hunks(patch), num_l; - - exp->files++; - exp->hunks += (int)num_h; - - /* let's iterate in reverse, just because we can! */ - for (h = 1, num_l = 0; h <= num_h; ++h) - num_l += git_patch_num_lines_in_hunk(patch, num_h - h); - - exp->lines += (int)num_l; -} - -#define PATCH_CACHE 5 - -void test_diff_diffiter__iterate_randomly_while_saving_state(void) -{ - git_repository *repo = cl_git_sandbox_init("status"); - git_diff_options opts = GIT_DIFF_OPTIONS_INIT; - git_diff *diff = NULL; - diff_expects exp = {0}; - git_patch *patches[PATCH_CACHE]; - size_t p, d, num_d; - - memset(patches, 0, sizeof(patches)); - - opts.context_lines = 3; - opts.interhunk_lines = 1; - opts.flags |= GIT_DIFF_INCLUDE_IGNORED | GIT_DIFF_INCLUDE_UNTRACKED; - - cl_git_pass(git_diff_index_to_workdir(&diff, repo, NULL, &opts)); - - num_d = git_diff_num_deltas(diff); - - /* To make sure that references counts work for diff and patch objects, - * this generates patches and randomly caches them. Only when the patch - * is removed from the cache are hunks and lines counted. At the end, - * there are still patches in the cache, so free the diff and try to - * process remaining patches after the diff is freed. - */ - - srand(121212); - p = rand() % PATCH_CACHE; - - for (d = 0; d < num_d; ++d) { - /* take old patch */ - git_patch *patch = patches[p]; - patches[p] = NULL; - - /* cache new patch */ - cl_git_pass(git_patch_from_diff(&patches[p], diff, d)); - cl_assert(patches[p] != NULL); - - /* process old patch if non-NULL */ - if (patch != NULL) { - iterate_over_patch(patch, &exp); - git_patch_free(patch); - } - - p = rand() % PATCH_CACHE; - } - - /* free diff list now - refcounts should keep things safe */ - git_diff_free(diff); - - /* process remaining unprocessed patches */ - for (p = 0; p < PATCH_CACHE; p++) { - git_patch *patch = patches[p]; - - if (patch != NULL) { - iterate_over_patch(patch, &exp); - git_patch_free(patch); - } - } - - /* hopefully it all still added up right */ - cl_assert_equal_i(13, exp.files); - cl_assert_equal_i(8, exp.hunks); - cl_assert_equal_i(14, exp.lines); -} - -/* This output is taken directly from `git diff` on the status test data */ -static const char *expected_patch_text[8] = { - /* 0 */ - "diff --git a/file_deleted b/file_deleted\n" - "deleted file mode 100644\n" - "index 5452d32..0000000\n" - "--- a/file_deleted\n" - "+++ /dev/null\n" - "@@ -1 +0,0 @@\n" - "-file_deleted\n", - /* 1 */ - "diff --git a/modified_file b/modified_file\n" - "index 452e424..0a53963 100644\n" - "--- a/modified_file\n" - "+++ b/modified_file\n" - "@@ -1 +1,2 @@\n" - " modified_file\n" - "+modified_file\n", - /* 2 */ - "diff --git a/staged_changes_file_deleted b/staged_changes_file_deleted\n" - "deleted file mode 100644\n" - "index a6be623..0000000\n" - "--- a/staged_changes_file_deleted\n" - "+++ /dev/null\n" - "@@ -1,2 +0,0 @@\n" - "-staged_changes_file_deleted\n" - "-staged_changes_file_deleted\n", - /* 3 */ - "diff --git a/staged_changes_modified_file b/staged_changes_modified_file\n" - "index 906ee77..011c344 100644\n" - "--- a/staged_changes_modified_file\n" - "+++ b/staged_changes_modified_file\n" - "@@ -1,2 +1,3 @@\n" - " staged_changes_modified_file\n" - " staged_changes_modified_file\n" - "+staged_changes_modified_file\n", - /* 4 */ - "diff --git a/staged_new_file_deleted_file b/staged_new_file_deleted_file\n" - "deleted file mode 100644\n" - "index 90b8c29..0000000\n" - "--- a/staged_new_file_deleted_file\n" - "+++ /dev/null\n" - "@@ -1 +0,0 @@\n" - "-staged_new_file_deleted_file\n", - /* 5 */ - "diff --git a/staged_new_file_modified_file b/staged_new_file_modified_file\n" - "index ed06290..8b090c0 100644\n" - "--- a/staged_new_file_modified_file\n" - "+++ b/staged_new_file_modified_file\n" - "@@ -1 +1,2 @@\n" - " staged_new_file_modified_file\n" - "+staged_new_file_modified_file\n", - /* 6 */ - "diff --git a/subdir/deleted_file b/subdir/deleted_file\n" - "deleted file mode 100644\n" - "index 1888c80..0000000\n" - "--- a/subdir/deleted_file\n" - "+++ /dev/null\n" - "@@ -1 +0,0 @@\n" - "-subdir/deleted_file\n", - /* 7 */ - "diff --git a/subdir/modified_file b/subdir/modified_file\n" - "index a619198..57274b7 100644\n" - "--- a/subdir/modified_file\n" - "+++ b/subdir/modified_file\n" - "@@ -1 +1,2 @@\n" - " subdir/modified_file\n" - "+subdir/modified_file\n" -}; - -void test_diff_diffiter__iterate_and_generate_patch_text(void) -{ - git_repository *repo = cl_git_sandbox_init("status"); - git_diff *diff; - size_t d, num_d; - - cl_git_pass(git_diff_index_to_workdir(&diff, repo, NULL, NULL)); - - num_d = git_diff_num_deltas(diff); - cl_assert_equal_i(8, (int)num_d); - - for (d = 0; d < num_d; ++d) { - git_patch *patch; - git_buf buf = GIT_BUF_INIT; - - cl_git_pass(git_patch_from_diff(&patch, diff, d)); - cl_assert(patch != NULL); - - cl_git_pass(git_patch_to_buf(&buf, patch)); - - cl_assert_equal_s(expected_patch_text[d], buf.ptr); - - git_buf_free(&buf); - git_patch_free(patch); - } - - git_diff_free(diff); -} - -void test_diff_diffiter__checks_options_version(void) -{ - git_repository *repo = cl_git_sandbox_init("status"); - git_diff_options opts = GIT_DIFF_OPTIONS_INIT; - git_diff *diff = NULL; - const git_error *err; - - opts.version = 0; - opts.flags |= GIT_DIFF_INCLUDE_IGNORED | GIT_DIFF_INCLUDE_UNTRACKED; - - cl_git_fail(git_diff_index_to_workdir(&diff, repo, NULL, &opts)); - err = giterr_last(); - cl_assert_equal_i(GITERR_INVALID, err->klass); - - giterr_clear(); - opts.version = 1024; - cl_git_fail(git_diff_index_to_workdir(&diff, repo, NULL, &opts)); - err = giterr_last(); - cl_assert_equal_i(GITERR_INVALID, err->klass); -} - diff --git a/vendor/libgit2/tests/diff/drivers.c b/vendor/libgit2/tests/diff/drivers.c deleted file mode 100644 index e3a0014dbe..0000000000 --- a/vendor/libgit2/tests/diff/drivers.c +++ /dev/null @@ -1,252 +0,0 @@ -#include "clar_libgit2.h" -#include "diff_helpers.h" -#include "repository.h" -#include "diff_driver.h" - -static git_repository *g_repo = NULL; - -void test_diff_drivers__initialize(void) -{ -} - -void test_diff_drivers__cleanup(void) -{ - cl_git_sandbox_cleanup(); - g_repo = NULL; -} - -static void overwrite_filemode(const char *expected, git_buf *actual) -{ - size_t offset; - char *found; - - found = strstr(expected, "100644"); - if (!found) - return; - - offset = ((const char *)found) - expected; - if (actual->size < offset + 6) - return; - - if (memcmp(&actual->ptr[offset], "100644", 6) != 0) - memcpy(&actual->ptr[offset], "100644", 6); -} - -void test_diff_drivers__patterns(void) -{ - git_config *cfg; - const char *one_sha = "19dd32dfb1520a64e5bbaae8dce6ef423dfa2f13"; - git_tree *one; - git_diff *diff; - git_patch *patch; - git_buf actual = GIT_BUF_INIT; - const char *expected0 = "diff --git a/untimely.txt b/untimely.txt\nindex 9a69d96..57fd0cf 100644\n--- a/untimely.txt\n+++ b/untimely.txt\n@@ -22,3 +22,5 @@ Comes through the blood of the vanguards who\n dreamed--too soon--it had sounded.\r\n \r\n -- Rudyard Kipling\r\n+\r\n+Some new stuff\r\n"; - const char *expected1 = "diff --git a/untimely.txt b/untimely.txt\nindex 9a69d96..57fd0cf 100644\nBinary files a/untimely.txt and b/untimely.txt differ\n"; - const char *expected2 = "diff --git a/untimely.txt b/untimely.txt\nindex 9a69d96..57fd0cf 100644\n--- a/untimely.txt\n+++ b/untimely.txt\n@@ -22,3 +22,5 @@ Heaven delivers on earth the Hour that cannot be\n dreamed--too soon--it had sounded.\r\n \r\n -- Rudyard Kipling\r\n+\r\n+Some new stuff\r\n"; - - g_repo = cl_git_sandbox_init("renames"); - - one = resolve_commit_oid_to_tree(g_repo, one_sha); - - /* no diff */ - - cl_git_pass(git_diff_tree_to_workdir(&diff, g_repo, one, NULL)); - cl_assert_equal_i(0, (int)git_diff_num_deltas(diff)); - git_diff_free(diff); - - /* default diff */ - - cl_git_append2file("renames/untimely.txt", "\r\nSome new stuff\r\n"); - - cl_git_pass(git_diff_tree_to_workdir(&diff, g_repo, one, NULL)); - cl_assert_equal_i(1, (int)git_diff_num_deltas(diff)); - - cl_git_pass(git_patch_from_diff(&patch, diff, 0)); - cl_git_pass(git_patch_to_buf(&actual, patch)); - cl_assert_equal_s(expected0, actual.ptr); - - git_buf_free(&actual); - git_patch_free(patch); - git_diff_free(diff); - - /* attribute diff set to false */ - - cl_git_rewritefile("renames/.gitattributes", "untimely.txt -diff\n"); - - cl_git_pass(git_diff_tree_to_workdir(&diff, g_repo, one, NULL)); - cl_assert_equal_i(1, (int)git_diff_num_deltas(diff)); - - cl_git_pass(git_patch_from_diff(&patch, diff, 0)); - cl_git_pass(git_patch_to_buf(&actual, patch)); - cl_assert_equal_s(expected1, actual.ptr); - - git_buf_free(&actual); - git_patch_free(patch); - git_diff_free(diff); - - /* attribute diff set to unconfigured value (should use default) */ - - cl_git_rewritefile("renames/.gitattributes", "untimely.txt diff=kipling0\n"); - - cl_git_pass(git_diff_tree_to_workdir(&diff, g_repo, one, NULL)); - cl_assert_equal_i(1, (int)git_diff_num_deltas(diff)); - - cl_git_pass(git_patch_from_diff(&patch, diff, 0)); - cl_git_pass(git_patch_to_buf(&actual, patch)); - cl_assert_equal_s(expected0, actual.ptr); - - git_buf_free(&actual); - git_patch_free(patch); - git_diff_free(diff); - - /* let's define that driver */ - - cl_git_pass(git_repository_config(&cfg, g_repo)); - cl_git_pass(git_config_set_bool(cfg, "diff.kipling0.binary", 1)); - git_config_free(cfg); - - cl_git_pass(git_diff_tree_to_workdir(&diff, g_repo, one, NULL)); - cl_assert_equal_i(1, (int)git_diff_num_deltas(diff)); - - cl_git_pass(git_patch_from_diff(&patch, diff, 0)); - cl_git_pass(git_patch_to_buf(&actual, patch)); - cl_assert_equal_s(expected1, actual.ptr); - - git_buf_free(&actual); - git_patch_free(patch); - git_diff_free(diff); - - /* let's use a real driver with some regular expressions */ - - git_diff_driver_registry_free(g_repo->diff_drivers); - g_repo->diff_drivers = NULL; - - cl_git_pass(git_repository_config(&cfg, g_repo)); - cl_git_pass(git_config_set_bool(cfg, "diff.kipling0.binary", 0)); - cl_git_pass(git_config_set_string(cfg, "diff.kipling0.xfuncname", "^H.*$")); - git_config_free(cfg); - - cl_git_pass(git_diff_tree_to_workdir(&diff, g_repo, one, NULL)); - cl_assert_equal_i(1, (int)git_diff_num_deltas(diff)); - - cl_git_pass(git_patch_from_diff(&patch, diff, 0)); - cl_git_pass(git_patch_to_buf(&actual, patch)); - cl_assert_equal_s(expected2, actual.ptr); - - git_buf_free(&actual); - git_patch_free(patch); - git_diff_free(diff); - - git_tree_free(one); -} - -void test_diff_drivers__long_lines(void) -{ - const char *base = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed non nisi ligula. Ut viverra enim sed lobortis suscipit.\nPhasellus eget erat odio. Praesent at est iaculis, ultricies augue vel, dignissim risus. Suspendisse at nisi quis turpis fringilla rutrum id sit amet nulla.\nNam eget dolor fermentum, aliquet nisl at, convallis tellus. Pellentesque rhoncus erat enim, id porttitor elit euismod quis.\nMauris sollicitudin magna odio, non egestas libero vehicula ut. Etiam et quam velit. Fusce eget libero rhoncus, ultricies felis sit amet, egestas purus.\nAliquam in semper tellus. Pellentesque adipiscing rutrum velit, quis malesuada lacus consequat eget.\n"; - git_index *idx; - git_diff *diff; - git_patch *patch; - git_buf actual = GIT_BUF_INIT; - const char *expected = "diff --git a/longlines.txt b/longlines.txt\nindex c1ce6ef..0134431 100644\n--- a/longlines.txt\n+++ b/longlines.txt\n@@ -3,3 +3,5 @@ Phasellus eget erat odio. Praesent at est iaculis, ultricies augue vel, dignissi\n Nam eget dolor fermentum, aliquet nisl at, convallis tellus. Pellentesque rhoncus erat enim, id porttitor elit euismod quis.\n Mauris sollicitudin magna odio, non egestas libero vehicula ut. Etiam et quam velit. Fusce eget libero rhoncus, ultricies felis sit amet, egestas purus.\n Aliquam in semper tellus. Pellentesque adipiscing rutrum velit, quis malesuada lacus consequat eget.\n+newline\n+newline\n"; - - g_repo = cl_git_sandbox_init("empty_standard_repo"); - - cl_git_mkfile("empty_standard_repo/longlines.txt", base); - cl_git_pass(git_repository_index(&idx, g_repo)); - cl_git_pass(git_index_add_bypath(idx, "longlines.txt")); - cl_git_pass(git_index_write(idx)); - git_index_free(idx); - - cl_git_append2file("empty_standard_repo/longlines.txt", "newline\nnewline\n"); - - cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, NULL, NULL)); - cl_assert_equal_sz(1, git_diff_num_deltas(diff)); - cl_git_pass(git_patch_from_diff(&patch, diff, 0)); - cl_git_pass(git_patch_to_buf(&actual, patch)); - - /* if chmod not supported, overwrite mode bits since anything is possible */ - overwrite_filemode(expected, &actual); - - cl_assert_equal_s(expected, actual.ptr); - - git_buf_free(&actual); - git_patch_free(patch); - git_diff_free(diff); -} - -void test_diff_drivers__builtins(void) -{ - git_diff *diff; - git_patch *patch; - git_buf file = GIT_BUF_INIT, actual = GIT_BUF_INIT, expected = GIT_BUF_INIT; - git_diff_options opts = GIT_DIFF_OPTIONS_INIT; - git_vector files = GIT_VECTOR_INIT; - size_t i; - char *path, *extension; - - g_repo = cl_git_sandbox_init("userdiff"); - - cl_git_pass(git_path_dirload(&files, "userdiff/files", 9, 0)); - - opts.interhunk_lines = 1; - opts.context_lines = 1; - opts.pathspec.count = 1; - - git_vector_foreach(&files, i, path) { - if (git__prefixcmp(path, "files/file.")) - continue; - extension = path + strlen("files/file."); - opts.pathspec.strings = &path; - - /* do diff with no special driver */ - - cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, NULL, &opts)); - cl_assert_equal_sz(1, git_diff_num_deltas(diff)); - cl_git_pass(git_patch_from_diff(&patch, diff, 0)); - cl_git_pass(git_patch_to_buf(&actual, patch)); - - git_buf_sets(&expected, "userdiff/expected/nodriver/diff."); - git_buf_puts(&expected, extension); - cl_git_pass(git_futils_readbuffer(&expected, expected.ptr)); - - overwrite_filemode(expected.ptr, &actual); - - cl_assert_equal_s(expected.ptr, actual.ptr); - - git_buf_clear(&actual); - git_patch_free(patch); - git_diff_free(diff); - - /* do diff with driver */ - - { - FILE *fp = fopen("userdiff/.gitattributes", "w"); - fprintf(fp, "*.%s diff=%s\n", extension, extension); - fclose(fp); - } - - cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, NULL, &opts)); - cl_assert_equal_sz(1, git_diff_num_deltas(diff)); - cl_git_pass(git_patch_from_diff(&patch, diff, 0)); - cl_git_pass(git_patch_to_buf(&actual, patch)); - - git_buf_sets(&expected, "userdiff/expected/driver/diff."); - git_buf_puts(&expected, extension); - cl_git_pass(git_futils_readbuffer(&expected, expected.ptr)); - - overwrite_filemode(expected.ptr, &actual); - - cl_assert_equal_s(expected.ptr, actual.ptr); - - git_buf_clear(&actual); - git_patch_free(patch); - git_diff_free(diff); - - git__free(path); - } - - git_buf_free(&file); - git_buf_free(&actual); - git_buf_free(&expected); - git_vector_free(&files); -} diff --git a/vendor/libgit2/tests/diff/format_email.c b/vendor/libgit2/tests/diff/format_email.c deleted file mode 100644 index 18ad99bd56..0000000000 --- a/vendor/libgit2/tests/diff/format_email.c +++ /dev/null @@ -1,467 +0,0 @@ -#include "clar.h" -#include "clar_libgit2.h" - -#include "buffer.h" -#include "commit.h" -#include "diff.h" - -static git_repository *repo; - -void test_diff_format_email__initialize(void) -{ - repo = cl_git_sandbox_init("diff_format_email"); -} - -void test_diff_format_email__cleanup(void) -{ - cl_git_sandbox_cleanup(); -} - -static void assert_email_match( - const char *expected, - const char *oidstr, - git_diff_format_email_options *opts) -{ - git_oid oid; - git_commit *commit = NULL; - git_diff *diff = NULL; - git_buf buf = GIT_BUF_INIT; - - git_oid_fromstr(&oid, oidstr); - - cl_git_pass(git_commit_lookup(&commit, repo, &oid)); - - opts->id = git_commit_id(commit); - opts->author = git_commit_author(commit); - if (!opts->summary) - opts->summary = git_commit_summary(commit); - - cl_git_pass(git_diff__commit(&diff, repo, commit, NULL)); - cl_git_pass(git_diff_format_email(&buf, diff, opts)); - - cl_assert_equal_s(expected, git_buf_cstr(&buf)); - git_buf_clear(&buf); - - cl_git_pass(git_diff_commit_as_email( - &buf, repo, commit, 1, 1, opts->flags, NULL)); - cl_assert_equal_s(expected, git_buf_cstr(&buf)); - - git_diff_free(diff); - git_commit_free(commit); - git_buf_free(&buf); -} - -void test_diff_format_email__simple(void) -{ - git_diff_format_email_options opts = GIT_DIFF_FORMAT_EMAIL_OPTIONS_INIT; - const char *email = - "From 9264b96c6d104d0e07ae33d3007b6a48246c6f92 Mon Sep 17 00:00:00 2001\n" \ - "From: Jacques Germishuys \n" \ - "Date: Wed, 9 Apr 2014 20:57:01 +0200\n" \ - "Subject: [PATCH] Modify some content\n" \ - "\n" \ - "---\n" \ - " file1.txt | 8 +++++---\n" \ - " 1 file changed, 5 insertions(+), 3 deletions(-)\n" \ - "\n" \ - "diff --git a/file1.txt b/file1.txt\n" \ - "index 94aaae8..af8f41d 100644\n" \ - "--- a/file1.txt\n" \ - "+++ b/file1.txt\n" \ - "@@ -1,15 +1,17 @@\n" \ - " file1.txt\n" \ - " file1.txt\n" \ - "+_file1.txt_\n" \ - " file1.txt\n" \ - " file1.txt\n" \ - " file1.txt\n" \ - " file1.txt\n" \ - "+\n" \ - "+\n" \ - " file1.txt\n" \ - " file1.txt\n" \ - " file1.txt\n" \ - " file1.txt\n" \ - " file1.txt\n" \ - "-file1.txt\n" \ - "-file1.txt\n" \ - "-file1.txt\n" \ - "+_file1.txt_\n" \ - "+_file1.txt_\n" \ - " file1.txt\n" \ - "--\n" \ - "libgit2 " LIBGIT2_VERSION "\n" \ - "\n"; - - assert_email_match( - email, "9264b96c6d104d0e07ae33d3007b6a48246c6f92", &opts); -} - -void test_diff_format_email__multiple(void) -{ - git_oid oid; - git_commit *commit = NULL; - git_diff *diff = NULL; - git_diff_format_email_options opts = GIT_DIFF_FORMAT_EMAIL_OPTIONS_INIT; - git_buf buf = GIT_BUF_INIT; - - const char *email = - "From 10808fe9c9be5a190c0ba68d1a002233fb363508 Mon Sep 17 00:00:00 2001\n" \ - "From: Jacques Germishuys \n" \ - "Date: Thu, 10 Apr 2014 19:37:05 +0200\n" \ - "Subject: [PATCH 1/2] Added file2.txt file3.txt\n" \ - "\n" \ - "---\n" \ - " file2.txt | 5 +++++\n" \ - " file3.txt | 5 +++++\n" \ - " 2 files changed, 10 insertions(+), 0 deletions(-)\n" \ - " create mode 100644 file2.txt\n" \ - " create mode 100644 file3.txt\n" \ - "\n" \ - "diff --git a/file2.txt b/file2.txt\n" \ - "new file mode 100644\n" \ - "index 0000000..e909123\n" \ - "--- /dev/null\n" \ - "+++ b/file2.txt\n" \ - "@@ -0,0 +1,5 @@\n" \ - "+file2\n" \ - "+file2\n" \ - "+file2\n" \ - "+file2\n" \ - "+file2\n" \ - "diff --git a/file3.txt b/file3.txt\n" \ - "new file mode 100644\n" \ - "index 0000000..9435022\n" \ - "--- /dev/null\n" \ - "+++ b/file3.txt\n" \ - "@@ -0,0 +1,5 @@\n" \ - "+file3\n" \ - "+file3\n" \ - "+file3\n" \ - "+file3\n" \ - "+file3\n" \ - "--\n" \ - "libgit2 " LIBGIT2_VERSION "\n" \ - "\n" \ - "From 873806f6f27e631eb0b23e4b56bea2bfac14a373 Mon Sep 17 00:00:00 2001\n" \ - "From: Jacques Germishuys \n" \ - "Date: Thu, 10 Apr 2014 19:37:36 +0200\n" \ - "Subject: [PATCH 2/2] Modified file2.txt, file3.txt\n" \ - "\n" \ - "---\n" \ - " file2.txt | 2 +-\n" \ - " file3.txt | 2 +-\n" \ - " 2 files changed, 2 insertions(+), 2 deletions(-)\n" \ - "\n" \ - "diff --git a/file2.txt b/file2.txt\n" \ - "index e909123..7aff11d 100644\n" \ - "--- a/file2.txt\n" \ - "+++ b/file2.txt\n" \ - "@@ -1,5 +1,5 @@\n" \ - " file2\n" \ - " file2\n" \ - " file2\n" \ - "-file2\n" \ - "+file2!\n" \ - " file2\n" \ - "diff --git a/file3.txt b/file3.txt\n" \ - "index 9435022..9a2d780 100644\n" \ - "--- a/file3.txt\n" \ - "+++ b/file3.txt\n" \ - "@@ -1,5 +1,5 @@\n" \ - " file3\n" \ - "-file3\n" \ - "+file3!\n" \ - " file3\n" \ - " file3\n" \ - " file3\n" \ - "--\n" \ - "libgit2 " LIBGIT2_VERSION "\n" \ - "\n"; - - - git_oid_fromstr(&oid, "10808fe9c9be5a190c0ba68d1a002233fb363508"); - cl_git_pass(git_commit_lookup(&commit, repo, &oid)); - - opts.id = git_commit_id(commit); - opts.author = git_commit_author(commit); - opts.summary = git_commit_summary(commit); - opts.patch_no = 1; - opts.total_patches = 2; - - cl_git_pass(git_diff__commit(&diff, repo, commit, NULL)); - cl_git_pass(git_diff_format_email(&buf, diff, &opts)); - - git_diff_free(diff); - git_commit_free(commit); - diff = NULL; - commit = NULL; - - git_oid_fromstr(&oid, "873806f6f27e631eb0b23e4b56bea2bfac14a373"); - cl_git_pass(git_commit_lookup(&commit, repo, &oid)); - - opts.id = git_commit_id(commit); - opts.author = git_commit_author(commit); - opts.summary = git_commit_summary(commit); - opts.patch_no = 2; - opts.total_patches = 2; - - cl_git_pass(git_diff__commit(&diff, repo, commit, NULL)); - cl_git_pass(git_diff_format_email(&buf, diff, &opts)); - - cl_assert_equal_s(email, git_buf_cstr(&buf)); - - git_diff_free(diff); - git_commit_free(commit); - git_buf_free(&buf); -} - -void test_diff_format_email__exclude_marker(void) -{ - git_diff_format_email_options opts = GIT_DIFF_FORMAT_EMAIL_OPTIONS_INIT; - const char *email = - "From 9264b96c6d104d0e07ae33d3007b6a48246c6f92 Mon Sep 17 00:00:00 2001\n" \ - "From: Jacques Germishuys \n" \ - "Date: Wed, 9 Apr 2014 20:57:01 +0200\n" \ - "Subject: Modify some content\n" \ - "\n" \ - "---\n" \ - " file1.txt | 8 +++++---\n" \ - " 1 file changed, 5 insertions(+), 3 deletions(-)\n" \ - "\n" \ - "diff --git a/file1.txt b/file1.txt\n" \ - "index 94aaae8..af8f41d 100644\n" \ - "--- a/file1.txt\n" \ - "+++ b/file1.txt\n" \ - "@@ -1,15 +1,17 @@\n" \ - " file1.txt\n" \ - " file1.txt\n" \ - "+_file1.txt_\n" \ - " file1.txt\n" \ - " file1.txt\n" \ - " file1.txt\n" \ - " file1.txt\n" \ - "+\n" \ - "+\n" \ - " file1.txt\n" \ - " file1.txt\n" \ - " file1.txt\n" \ - " file1.txt\n" \ - " file1.txt\n" \ - "-file1.txt\n" \ - "-file1.txt\n" \ - "-file1.txt\n" \ - "+_file1.txt_\n" \ - "+_file1.txt_\n" \ - " file1.txt\n" \ - "--\n" \ - "libgit2 " LIBGIT2_VERSION "\n" \ - "\n"; - - opts.flags |= GIT_DIFF_FORMAT_EMAIL_EXCLUDE_SUBJECT_PATCH_MARKER; - - assert_email_match( - email, "9264b96c6d104d0e07ae33d3007b6a48246c6f92", &opts); -} - -void test_diff_format_email__invalid_no(void) -{ - git_oid oid; - git_commit *commit = NULL; - git_diff *diff = NULL; - git_diff_format_email_options opts = GIT_DIFF_FORMAT_EMAIL_OPTIONS_INIT; - git_buf buf = GIT_BUF_INIT; - - git_oid_fromstr(&oid, "9264b96c6d104d0e07ae33d3007b6a48246c6f92"); - - cl_git_pass(git_commit_lookup(&commit, repo, &oid)); - - opts.id = git_commit_id(commit); - opts.author = git_commit_author(commit); - opts.summary = git_commit_summary(commit); - opts.patch_no = 2; - opts.total_patches = 1; - - cl_git_pass(git_diff__commit(&diff, repo, commit, NULL)); - cl_git_fail(git_diff_format_email(&buf, diff, &opts)); - cl_git_fail(git_diff_commit_as_email(&buf, repo, commit, 2, 1, 0, NULL)); - cl_git_fail(git_diff_commit_as_email(&buf, repo, commit, 0, 0, 0, NULL)); - - git_diff_free(diff); - git_commit_free(commit); - git_buf_free(&buf); -} - -void test_diff_format_email__mode_change(void) -{ - git_diff_format_email_options opts = GIT_DIFF_FORMAT_EMAIL_OPTIONS_INIT; - const char *email = - "From 7ade76dd34bba4733cf9878079f9fd4a456a9189 Mon Sep 17 00:00:00 2001\n" \ - "From: Jacques Germishuys \n" \ - "Date: Thu, 10 Apr 2014 10:05:03 +0200\n" \ - "Subject: [PATCH] Update permissions\n" \ - "\n" \ - "---\n" \ - " file1.txt.renamed | 0\n" \ - " 1 file changed, 0 insertions(+), 0 deletions(-)\n" \ - " mode change 100644 => 100755 file1.txt.renamed\n" \ - "\n" \ - "diff --git a/file1.txt.renamed b/file1.txt.renamed\n" \ - "old mode 100644\n" \ - "new mode 100755\n" \ - "index a97157a..a97157a\n" \ - "--- a/file1.txt.renamed\n" \ - "+++ b/file1.txt.renamed\n" \ - "--\n" \ - "libgit2 " LIBGIT2_VERSION "\n" \ - "\n"; - - assert_email_match( - email, "7ade76dd34bba4733cf9878079f9fd4a456a9189", &opts); -} - -void test_diff_format_email__rename_add_remove(void) -{ - git_diff_format_email_options opts = GIT_DIFF_FORMAT_EMAIL_OPTIONS_INIT; - const char *email = - "From 6e05acc5a5dab507d91a0a0cc0fb05a3dd98892d Mon Sep 17 00:00:00 2001\n" \ - "From: Jacques Germishuys \n" \ - "Date: Wed, 9 Apr 2014 21:15:56 +0200\n" \ - "Subject: [PATCH] Renamed file1.txt -> file1.txt.renamed\n" \ - "\n" \ - "---\n" \ - " file1.txt | 17 -----------------\n" \ - " file1.txt.renamed | 17 +++++++++++++++++\n" \ - " 2 files changed, 17 insertions(+), 17 deletions(-)\n" \ - " delete mode 100644 file1.txt\n" \ - " create mode 100644 file1.txt.renamed\n" \ - "\n" \ - "diff --git a/file1.txt b/file1.txt\n" \ - "deleted file mode 100644\n" \ - "index af8f41d..0000000\n" \ - "--- a/file1.txt\n" \ - "+++ /dev/null\n" \ - "@@ -1,17 +0,0 @@\n" \ - "-file1.txt\n" \ - "-file1.txt\n" \ - "-_file1.txt_\n" \ - "-file1.txt\n" \ - "-file1.txt\n" \ - "-file1.txt\n" \ - "-file1.txt\n" \ - "-\n" \ - "-\n" \ - "-file1.txt\n" \ - "-file1.txt\n" \ - "-file1.txt\n" \ - "-file1.txt\n" \ - "-file1.txt\n" \ - "-_file1.txt_\n" \ - "-_file1.txt_\n" \ - "-file1.txt\n" \ - "diff --git a/file1.txt.renamed b/file1.txt.renamed\n" \ - "new file mode 100644\n" \ - "index 0000000..a97157a\n" \ - "--- /dev/null\n" \ - "+++ b/file1.txt.renamed\n" \ - "@@ -0,0 +1,17 @@\n" \ - "+file1.txt\n" \ - "+file1.txt\n" \ - "+_file1.txt_\n" \ - "+file1.txt\n" \ - "+file1.txt\n" \ - "+file1.txt_renamed\n" \ - "+file1.txt\n" \ - "+\n" \ - "+\n" \ - "+file1.txt\n" \ - "+file1.txt\n" \ - "+file1.txt_renamed\n" \ - "+file1.txt\n" \ - "+file1.txt\n" \ - "+_file1.txt_\n" \ - "+_file1.txt_\n" \ - "+file1.txt\n" \ - "--\n" \ - "libgit2 " LIBGIT2_VERSION "\n" \ - "\n"; - - assert_email_match( - email, "6e05acc5a5dab507d91a0a0cc0fb05a3dd98892d", &opts); -} - -void test_diff_format_email__multiline_summary(void) -{ - git_diff_format_email_options opts = GIT_DIFF_FORMAT_EMAIL_OPTIONS_INIT; - const char *email = - "From 9264b96c6d104d0e07ae33d3007b6a48246c6f92 Mon Sep 17 00:00:00 2001\n" \ - "From: Jacques Germishuys \n" \ - "Date: Wed, 9 Apr 2014 20:57:01 +0200\n" \ - "Subject: [PATCH] Modify some content\n" \ - "\n" \ - "---\n" \ - " file1.txt | 8 +++++---\n" \ - " 1 file changed, 5 insertions(+), 3 deletions(-)\n" \ - "\n" \ - "diff --git a/file1.txt b/file1.txt\n" \ - "index 94aaae8..af8f41d 100644\n" \ - "--- a/file1.txt\n" \ - "+++ b/file1.txt\n" \ - "@@ -1,15 +1,17 @@\n" \ - " file1.txt\n" \ - " file1.txt\n" \ - "+_file1.txt_\n" \ - " file1.txt\n" \ - " file1.txt\n" \ - " file1.txt\n" \ - " file1.txt\n" \ - "+\n" \ - "+\n" \ - " file1.txt\n" \ - " file1.txt\n" \ - " file1.txt\n" \ - " file1.txt\n" \ - " file1.txt\n" \ - "-file1.txt\n" \ - "-file1.txt\n" \ - "-file1.txt\n" \ - "+_file1.txt_\n" \ - "+_file1.txt_\n" \ - " file1.txt\n" \ - "--\n" \ - "libgit2 " LIBGIT2_VERSION "\n" \ - "\n"; - - opts.summary = "Modify some content\nSome extra stuff here"; - - assert_email_match( - email, "9264b96c6d104d0e07ae33d3007b6a48246c6f92", &opts); -} - -void test_diff_format_email__binary(void) -{ - git_diff_format_email_options opts = GIT_DIFF_FORMAT_EMAIL_OPTIONS_INIT; - const char *email = - "From 8d7523f6fcb2404257889abe0d96f093d9f524f9 Mon Sep 17 00:00:00 2001\n" \ - "From: Jacques Germishuys \n" \ - "Date: Sun, 13 Apr 2014 18:10:18 +0200\n" \ - "Subject: [PATCH] Modified binary file\n" \ - "\n" \ - "---\n" \ - " binary.bin | Bin 3 -> 0 bytes\n" \ - " 1 file changed, 0 insertions(+), 0 deletions(-)\n" \ - "\n" \ - "diff --git a/binary.bin b/binary.bin\n" \ - "index bd474b2..9ac35ff 100644\n" \ - "Binary files a/binary.bin and b/binary.bin differ\n" \ - "--\n" \ - "libgit2 " LIBGIT2_VERSION "\n" \ - "\n"; - /* TODO: Actually 0 bytes here should be 5!. Seems like we don't load the new content for binary files? */ - - opts.summary = "Modified binary file"; - - assert_email_match( - email, "8d7523f6fcb2404257889abe0d96f093d9f524f9", &opts); -} - diff --git a/vendor/libgit2/tests/diff/index.c b/vendor/libgit2/tests/diff/index.c deleted file mode 100644 index f702568bfb..0000000000 --- a/vendor/libgit2/tests/diff/index.c +++ /dev/null @@ -1,270 +0,0 @@ -#include "clar_libgit2.h" -#include "diff_helpers.h" - -static git_repository *g_repo = NULL; - -void test_diff_index__initialize(void) -{ - g_repo = cl_git_sandbox_init("status"); -} - -void test_diff_index__cleanup(void) -{ - cl_git_sandbox_cleanup(); -} - -void test_diff_index__0(void) -{ - /* grabbed a couple of commit oids from the history of the attr repo */ - const char *a_commit = "26a125ee1bf"; /* the current HEAD */ - const char *b_commit = "0017bd4ab1ec3"; /* the start */ - git_tree *a = resolve_commit_oid_to_tree(g_repo, a_commit); - git_tree *b = resolve_commit_oid_to_tree(g_repo, b_commit); - git_diff_options opts = GIT_DIFF_OPTIONS_INIT; - git_diff *diff = NULL; - diff_expects exp; - - cl_assert(a); - cl_assert(b); - - opts.context_lines = 1; - opts.interhunk_lines = 1; - - memset(&exp, 0, sizeof(exp)); - - cl_git_pass(git_diff_tree_to_index(&diff, g_repo, a, NULL, &opts)); - - cl_git_pass(git_diff_foreach( - diff, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &exp)); - - /* to generate these values: - * - cd to tests/resources/status, - * - mv .gitted .git - * - git diff --name-status --cached 26a125ee1bf - * - git diff -U1 --cached 26a125ee1bf - * - mv .git .gitted - */ - cl_assert_equal_i(8, exp.files); - cl_assert_equal_i(3, exp.file_status[GIT_DELTA_ADDED]); - cl_assert_equal_i(2, exp.file_status[GIT_DELTA_DELETED]); - cl_assert_equal_i(3, exp.file_status[GIT_DELTA_MODIFIED]); - - cl_assert_equal_i(8, exp.hunks); - - cl_assert_equal_i(11, exp.lines); - cl_assert_equal_i(3, exp.line_ctxt); - cl_assert_equal_i(6, exp.line_adds); - cl_assert_equal_i(2, exp.line_dels); - - git_diff_free(diff); - diff = NULL; - memset(&exp, 0, sizeof(exp)); - - cl_git_pass(git_diff_tree_to_index(&diff, g_repo, b, NULL, &opts)); - - cl_git_pass(git_diff_foreach( - diff, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &exp)); - - /* to generate these values: - * - cd to tests/resources/status, - * - mv .gitted .git - * - git diff --name-status --cached 0017bd4ab1ec3 - * - git diff -U1 --cached 0017bd4ab1ec3 - * - mv .git .gitted - */ - cl_assert_equal_i(12, exp.files); - cl_assert_equal_i(7, exp.file_status[GIT_DELTA_ADDED]); - cl_assert_equal_i(2, exp.file_status[GIT_DELTA_DELETED]); - cl_assert_equal_i(3, exp.file_status[GIT_DELTA_MODIFIED]); - - cl_assert_equal_i(12, exp.hunks); - - cl_assert_equal_i(16, exp.lines); - cl_assert_equal_i(3, exp.line_ctxt); - cl_assert_equal_i(11, exp.line_adds); - cl_assert_equal_i(2, exp.line_dels); - - git_diff_free(diff); - diff = NULL; - - git_tree_free(a); - git_tree_free(b); -} - -static int diff_stop_after_2_files( - const git_diff_delta *delta, - float progress, - void *payload) -{ - diff_expects *e = payload; - - GIT_UNUSED(progress); - GIT_UNUSED(delta); - - e->files++; - - return (e->files == 2); -} - -void test_diff_index__1(void) -{ - /* grabbed a couple of commit oids from the history of the attr repo */ - const char *a_commit = "26a125ee1bf"; /* the current HEAD */ - const char *b_commit = "0017bd4ab1ec3"; /* the start */ - git_tree *a = resolve_commit_oid_to_tree(g_repo, a_commit); - git_tree *b = resolve_commit_oid_to_tree(g_repo, b_commit); - git_diff_options opts = GIT_DIFF_OPTIONS_INIT; - git_diff *diff = NULL; - diff_expects exp; - - cl_assert(a); - cl_assert(b); - - opts.context_lines = 1; - opts.interhunk_lines = 1; - - memset(&exp, 0, sizeof(exp)); - - cl_git_pass(git_diff_tree_to_index(&diff, g_repo, a, NULL, &opts)); - - cl_assert_equal_i(1, git_diff_foreach( - diff, diff_stop_after_2_files, NULL, NULL, NULL, &exp) ); - - cl_assert_equal_i(2, exp.files); - - git_diff_free(diff); - diff = NULL; - - git_tree_free(a); - git_tree_free(b); -} - -void test_diff_index__checks_options_version(void) -{ - const char *a_commit = "26a125ee1bf"; - git_tree *a = resolve_commit_oid_to_tree(g_repo, a_commit); - git_diff_options opts = GIT_DIFF_OPTIONS_INIT; - git_diff *diff = NULL; - const git_error *err; - - opts.version = 0; - cl_git_fail(git_diff_tree_to_index(&diff, g_repo, a, NULL, &opts)); - err = giterr_last(); - cl_assert_equal_i(GITERR_INVALID, err->klass); - cl_assert_equal_p(diff, NULL); - - giterr_clear(); - opts.version = 1024; - cl_git_fail(git_diff_tree_to_index(&diff, g_repo, a, NULL, &opts)); - err = giterr_last(); - cl_assert_equal_i(GITERR_INVALID, err->klass); - cl_assert_equal_p(diff, NULL); - - git_tree_free(a); -} - -static void do_conflicted_diff(diff_expects *exp, unsigned long flags) -{ - const char *a_commit = "26a125ee1bf"; /* the current HEAD */ - git_tree *a = resolve_commit_oid_to_tree(g_repo, a_commit); - git_diff_options opts = GIT_DIFF_OPTIONS_INIT; - git_index_entry ancestor = {{0}}, ours = {{0}}, theirs = {{0}}; - git_diff *diff = NULL; - git_index *index; - - cl_assert(a); - - opts.context_lines = 1; - opts.interhunk_lines = 1; - opts.flags |= flags; - - memset(exp, 0, sizeof(diff_expects)); - - cl_git_pass(git_repository_index(&index, g_repo)); - - ancestor.path = ours.path = theirs.path = "staged_changes"; - ancestor.mode = ours.mode = theirs.mode = GIT_FILEMODE_BLOB; - - git_oid_fromstr(&ancestor.id, "deadbeefdeadbeefdeadbeefdeadbeefdeadbeef"); - git_oid_fromstr(&ours.id, "deadbeefdeadbeefdeadbeefdeadbeefdeadbeef"); - git_oid_fromstr(&theirs.id, "deadbeefdeadbeefdeadbeefdeadbeefdeadbeef"); - - cl_git_pass(git_index_conflict_add(index, &ancestor, &ours, &theirs)); - cl_git_pass(git_diff_tree_to_index(&diff, g_repo, a, index, &opts)); - - cl_git_pass(git_diff_foreach( - diff, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, exp)); - - git_diff_free(diff); - git_tree_free(a); - git_index_free(index); -} - -void test_diff_index__reports_conflicts(void) -{ - diff_expects exp; - - do_conflicted_diff(&exp, 0); - - cl_assert_equal_i(8, exp.files); - cl_assert_equal_i(3, exp.file_status[GIT_DELTA_ADDED]); - cl_assert_equal_i(2, exp.file_status[GIT_DELTA_DELETED]); - cl_assert_equal_i(2, exp.file_status[GIT_DELTA_MODIFIED]); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_CONFLICTED]); - - cl_assert_equal_i(7, exp.hunks); - - cl_assert_equal_i(9, exp.lines); - cl_assert_equal_i(2, exp.line_ctxt); - cl_assert_equal_i(5, exp.line_adds); - cl_assert_equal_i(2, exp.line_dels); -} - -void test_diff_index__reports_conflicts_when_reversed(void) -{ - diff_expects exp; - - do_conflicted_diff(&exp, GIT_DIFF_REVERSE); - - cl_assert_equal_i(8, exp.files); - cl_assert_equal_i(2, exp.file_status[GIT_DELTA_ADDED]); - cl_assert_equal_i(3, exp.file_status[GIT_DELTA_DELETED]); - cl_assert_equal_i(2, exp.file_status[GIT_DELTA_MODIFIED]); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_CONFLICTED]); - - cl_assert_equal_i(7, exp.hunks); - - cl_assert_equal_i(9, exp.lines); - cl_assert_equal_i(2, exp.line_ctxt); - cl_assert_equal_i(2, exp.line_adds); - cl_assert_equal_i(5, exp.line_dels); -} - -void test_diff_index__not_in_head_conflicted(void) -{ - const char *a_commit = "26a125ee1bf"; /* the current HEAD */ - git_index_entry theirs = {{0}}; - git_index *index; - git_diff *diff; - const git_diff_delta *delta; - - git_tree *a = resolve_commit_oid_to_tree(g_repo, a_commit); - - cl_git_pass(git_repository_index(&index, g_repo)); - cl_git_pass(git_index_read_tree(index, a)); - - theirs.path = "file_not_in_head"; - theirs.mode = GIT_FILEMODE_BLOB; - git_oid_fromstr(&theirs.id, "deadbeefdeadbeefdeadbeefdeadbeefdeadbeef"); - cl_git_pass(git_index_conflict_add(index, NULL, NULL, &theirs)); - - cl_git_pass(git_diff_tree_to_index(&diff, g_repo, a, index, NULL)); - - cl_assert_equal_i(git_diff_num_deltas(diff), 1); - delta = git_diff_get_delta(diff, 0); - cl_assert_equal_i(delta->status, GIT_DELTA_CONFLICTED); - - git_diff_free(diff); - git_index_free(index); - git_tree_free(a); -} diff --git a/vendor/libgit2/tests/diff/iterator.c b/vendor/libgit2/tests/diff/iterator.c deleted file mode 100644 index 6011c6a9b7..0000000000 --- a/vendor/libgit2/tests/diff/iterator.c +++ /dev/null @@ -1,980 +0,0 @@ -#include "clar_libgit2.h" -#include "diff_helpers.h" -#include "iterator.h" -#include "tree.h" - -void test_diff_iterator__initialize(void) -{ - /* since we are doing tests with different sandboxes, defer setup - * to the actual tests. cleanup will still be done in the global - * cleanup function so that assertion failures don't result in a - * missed cleanup. - */ -} - -void test_diff_iterator__cleanup(void) -{ - cl_git_sandbox_cleanup(); -} - - -/* -- TREE ITERATOR TESTS -- */ - -static void tree_iterator_test( - const char *sandbox, - const char *treeish, - const char *start, - const char *end, - int expected_count, - const char **expected_values) -{ - git_tree *t; - git_iterator *i; - const git_index_entry *entry; - int error, count = 0, count_post_reset = 0; - git_repository *repo = cl_git_sandbox_init(sandbox); - - cl_assert(t = resolve_commit_oid_to_tree(repo, treeish)); - cl_git_pass(git_iterator_for_tree( - &i, t, GIT_ITERATOR_DONT_IGNORE_CASE, start, end)); - - /* test loop */ - while (!(error = git_iterator_advance(&entry, i))) { - cl_assert(entry); - if (expected_values != NULL) - cl_assert_equal_s(expected_values[count], entry->path); - count++; - } - cl_assert_equal_i(GIT_ITEROVER, error); - cl_assert(!entry); - cl_assert_equal_i(expected_count, count); - - /* test reset */ - cl_git_pass(git_iterator_reset(i, NULL, NULL)); - - while (!(error = git_iterator_advance(&entry, i))) { - cl_assert(entry); - if (expected_values != NULL) - cl_assert_equal_s(expected_values[count_post_reset], entry->path); - count_post_reset++; - } - cl_assert_equal_i(GIT_ITEROVER, error); - cl_assert(!entry); - cl_assert_equal_i(count, count_post_reset); - - git_iterator_free(i); - git_tree_free(t); -} - -/* results of: git ls-tree -r --name-only 605812a */ -const char *expected_tree_0[] = { - ".gitattributes", - "attr0", - "attr1", - "attr2", - "attr3", - "binfile", - "macro_test", - "root_test1", - "root_test2", - "root_test3", - "root_test4.txt", - "subdir/.gitattributes", - "subdir/abc", - "subdir/subdir_test1", - "subdir/subdir_test2.txt", - "subdir2/subdir2_test1", - NULL -}; - -void test_diff_iterator__tree_0(void) -{ - tree_iterator_test("attr", "605812a", NULL, NULL, 16, expected_tree_0); -} - -/* results of: git ls-tree -r --name-only 6bab5c79 */ -const char *expected_tree_1[] = { - ".gitattributes", - "attr0", - "attr1", - "attr2", - "attr3", - "root_test1", - "root_test2", - "root_test3", - "root_test4.txt", - "subdir/.gitattributes", - "subdir/subdir_test1", - "subdir/subdir_test2.txt", - "subdir2/subdir2_test1", - NULL -}; - -void test_diff_iterator__tree_1(void) -{ - tree_iterator_test("attr", "6bab5c79cd5", NULL, NULL, 13, expected_tree_1); -} - -/* results of: git ls-tree -r --name-only 26a125ee1 */ -const char *expected_tree_2[] = { - "current_file", - "file_deleted", - "modified_file", - "staged_changes", - "staged_changes_file_deleted", - "staged_changes_modified_file", - "staged_delete_file_deleted", - "staged_delete_modified_file", - "subdir.txt", - "subdir/current_file", - "subdir/deleted_file", - "subdir/modified_file", - NULL -}; - -void test_diff_iterator__tree_2(void) -{ - tree_iterator_test("status", "26a125ee1", NULL, NULL, 12, expected_tree_2); -} - -/* $ git ls-tree -r --name-only 0017bd4ab1e */ -const char *expected_tree_3[] = { - "current_file", - "file_deleted", - "modified_file", - "staged_changes", - "staged_changes_file_deleted", - "staged_changes_modified_file", - "staged_delete_file_deleted", - "staged_delete_modified_file" -}; - -void test_diff_iterator__tree_3(void) -{ - tree_iterator_test("status", "0017bd4ab1e", NULL, NULL, 8, expected_tree_3); -} - -/* $ git ls-tree -r --name-only 24fa9a9fc4e202313e24b648087495441dab432b */ -const char *expected_tree_4[] = { - "attr0", - "attr1", - "attr2", - "attr3", - "binfile", - "gitattributes", - "macro_bad", - "macro_test", - "root_test1", - "root_test2", - "root_test3", - "root_test4.txt", - "sub/abc", - "sub/file", - "sub/sub/file", - "sub/sub/subsub.txt", - "sub/subdir_test1", - "sub/subdir_test2.txt", - "subdir/.gitattributes", - "subdir/abc", - "subdir/subdir_test1", - "subdir/subdir_test2.txt", - "subdir2/subdir2_test1", - NULL -}; - -void test_diff_iterator__tree_4(void) -{ - tree_iterator_test( - "attr", "24fa9a9fc4e202313e24b648087495441dab432b", NULL, NULL, - 23, expected_tree_4); -} - -void test_diff_iterator__tree_4_ranged(void) -{ - tree_iterator_test( - "attr", "24fa9a9fc4e202313e24b648087495441dab432b", - "sub", "sub", - 11, &expected_tree_4[12]); -} - -const char *expected_tree_ranged_0[] = { - "gitattributes", - "macro_bad", - "macro_test", - "root_test1", - "root_test2", - "root_test3", - "root_test4.txt", - NULL -}; - -void test_diff_iterator__tree_ranged_0(void) -{ - tree_iterator_test( - "attr", "24fa9a9fc4e202313e24b648087495441dab432b", - "git", "root", - 7, expected_tree_ranged_0); -} - -const char *expected_tree_ranged_1[] = { - "sub/subdir_test2.txt", - NULL -}; - -void test_diff_iterator__tree_ranged_1(void) -{ - tree_iterator_test( - "attr", "24fa9a9fc4e202313e24b648087495441dab432b", - "sub/subdir_test2.txt", "sub/subdir_test2.txt", - 1, expected_tree_ranged_1); -} - -void test_diff_iterator__tree_range_empty_0(void) -{ - tree_iterator_test( - "attr", "24fa9a9fc4e202313e24b648087495441dab432b", - "empty", "empty", 0, NULL); -} - -void test_diff_iterator__tree_range_empty_1(void) -{ - tree_iterator_test( - "attr", "24fa9a9fc4e202313e24b648087495441dab432b", - "z_empty_after", NULL, 0, NULL); -} - -void test_diff_iterator__tree_range_empty_2(void) -{ - tree_iterator_test( - "attr", "24fa9a9fc4e202313e24b648087495441dab432b", - NULL, ".aaa_empty_before", 0, NULL); -} - -static void check_tree_entry( - git_iterator *i, - const char *oid, - const char *oid_p, - const char *oid_pp, - const char *oid_ppp) -{ - const git_index_entry *ie; - const git_tree_entry *te; - const git_tree *tree; - git_buf path = GIT_BUF_INIT; - - cl_git_pass(git_iterator_current_tree_entry(&te, i)); - cl_assert(te); - cl_assert(git_oid_streq(&te->oid, oid) == 0); - - cl_git_pass(git_iterator_current(&ie, i)); - cl_git_pass(git_buf_sets(&path, ie->path)); - - if (oid_p) { - git_buf_rtruncate_at_char(&path, '/'); - cl_git_pass(git_iterator_current_parent_tree(&tree, i, path.ptr)); - cl_assert(tree); - cl_assert(git_oid_streq(git_tree_id(tree), oid_p) == 0); - } - - if (oid_pp) { - git_buf_rtruncate_at_char(&path, '/'); - cl_git_pass(git_iterator_current_parent_tree(&tree, i, path.ptr)); - cl_assert(tree); - cl_assert(git_oid_streq(git_tree_id(tree), oid_pp) == 0); - } - - if (oid_ppp) { - git_buf_rtruncate_at_char(&path, '/'); - cl_git_pass(git_iterator_current_parent_tree(&tree, i, path.ptr)); - cl_assert(tree); - cl_assert(git_oid_streq(git_tree_id(tree), oid_ppp) == 0); - } - - git_buf_free(&path); -} - -void test_diff_iterator__tree_special_functions(void) -{ - git_tree *t; - git_iterator *i; - const git_index_entry *entry; - git_repository *repo = cl_git_sandbox_init("attr"); - int error, cases = 0; - const char *rootoid = "ce39a97a7fb1fa90bcf5e711249c1e507476ae0e"; - - t = resolve_commit_oid_to_tree( - repo, "24fa9a9fc4e202313e24b648087495441dab432b"); - cl_assert(t != NULL); - - cl_git_pass(git_iterator_for_tree( - &i, t, GIT_ITERATOR_DONT_IGNORE_CASE, NULL, NULL)); - - while (!(error = git_iterator_advance(&entry, i))) { - cl_assert(entry); - - if (strcmp(entry->path, "sub/file") == 0) { - cases++; - check_tree_entry( - i, "45b983be36b73c0788dc9cbcb76cbb80fc7bb057", - "ecb97df2a174987475ac816e3847fc8e9f6c596b", - rootoid, NULL); - } - else if (strcmp(entry->path, "sub/sub/subsub.txt") == 0) { - cases++; - check_tree_entry( - i, "9e5bdc47d6a80f2be0ea3049ad74231b94609242", - "4e49ba8c5b6c32ff28cd9dcb60be34df50fcc485", - "ecb97df2a174987475ac816e3847fc8e9f6c596b", rootoid); - } - else if (strcmp(entry->path, "subdir/.gitattributes") == 0) { - cases++; - check_tree_entry( - i, "99eae476896f4907224978b88e5ecaa6c5bb67a9", - "9fb40b6675dde60b5697afceae91b66d908c02d9", - rootoid, NULL); - } - else if (strcmp(entry->path, "subdir2/subdir2_test1") == 0) { - cases++; - check_tree_entry( - i, "dccada462d3df8ac6de596fb8c896aba9344f941", - "2929de282ce999e95183aedac6451d3384559c4b", - rootoid, NULL); - } - } - cl_assert_equal_i(GIT_ITEROVER, error); - cl_assert(!entry); - cl_assert_equal_i(4, cases); - - git_iterator_free(i); - git_tree_free(t); -} - -/* -- INDEX ITERATOR TESTS -- */ - -static void index_iterator_test( - const char *sandbox, - const char *start, - const char *end, - git_iterator_flag_t flags, - int expected_count, - const char **expected_names, - const char **expected_oids) -{ - git_index *index; - git_iterator *i; - const git_index_entry *entry; - int error, count = 0, caps; - git_repository *repo = cl_git_sandbox_init(sandbox); - - cl_git_pass(git_repository_index(&index, repo)); - caps = git_index_caps(index); - - cl_git_pass(git_iterator_for_index(&i, index, flags, start, end)); - - while (!(error = git_iterator_advance(&entry, i))) { - cl_assert(entry); - - if (expected_names != NULL) - cl_assert_equal_s(expected_names[count], entry->path); - - if (expected_oids != NULL) { - git_oid oid; - cl_git_pass(git_oid_fromstr(&oid, expected_oids[count])); - cl_assert_equal_oid(&oid, &entry->id); - } - - count++; - } - - cl_assert_equal_i(GIT_ITEROVER, error); - cl_assert(!entry); - cl_assert_equal_i(expected_count, count); - - git_iterator_free(i); - - cl_assert(caps == git_index_caps(index)); - git_index_free(index); -} - -static const char *expected_index_0[] = { - "attr0", - "attr1", - "attr2", - "attr3", - "binfile", - "gitattributes", - "macro_bad", - "macro_test", - "root_test1", - "root_test2", - "root_test3", - "root_test4.txt", - "sub/abc", - "sub/file", - "sub/sub/file", - "sub/sub/subsub.txt", - "sub/subdir_test1", - "sub/subdir_test2.txt", - "subdir/.gitattributes", - "subdir/abc", - "subdir/subdir_test1", - "subdir/subdir_test2.txt", - "subdir2/subdir2_test1", -}; - -static const char *expected_index_oids_0[] = { - "556f8c827b8e4a02ad5cab77dca2bcb3e226b0b3", - "3b74db7ab381105dc0d28f8295a77f6a82989292", - "2c66e14f77196ea763fb1e41612c1aa2bc2d8ed2", - "c485abe35abd4aa6fd83b076a78bbea9e2e7e06c", - "d800886d9c86731ae5c4a62b0b77c437015e00d2", - "2b40c5aca159b04ea8d20ffe36cdf8b09369b14a", - "5819a185d77b03325aaf87cafc771db36f6ddca7", - "ff69f8639ce2e6010b3f33a74160aad98b48da2b", - "45141a79a77842c59a63229403220a4e4be74e3d", - "4d713dc48e6b1bd75b0d61ad078ba9ca3a56745d", - "108bb4e7fd7b16490dc33ff7d972151e73d7166e", - "a0f7217ae99f5ac3e88534f5cea267febc5fa85b", - "3e42ffc54a663f9401cc25843d6c0e71a33e4249", - "45b983be36b73c0788dc9cbcb76cbb80fc7bb057", - "45b983be36b73c0788dc9cbcb76cbb80fc7bb057", - "9e5bdc47d6a80f2be0ea3049ad74231b94609242", - "e563cf4758f0d646f1b14b76016aa17fa9e549a4", - "fb5067b1aef3ac1ada4b379dbcb7d17255df7d78", - "99eae476896f4907224978b88e5ecaa6c5bb67a9", - "3e42ffc54a663f9401cc25843d6c0e71a33e4249", - "e563cf4758f0d646f1b14b76016aa17fa9e549a4", - "fb5067b1aef3ac1ada4b379dbcb7d17255df7d78", - "dccada462d3df8ac6de596fb8c896aba9344f941" -}; - -void test_diff_iterator__index_0(void) -{ - index_iterator_test( - "attr", NULL, NULL, 0, ARRAY_SIZE(expected_index_0), - expected_index_0, expected_index_oids_0); -} - -static const char *expected_index_range[] = { - "root_test1", - "root_test2", - "root_test3", - "root_test4.txt", -}; - -static const char *expected_index_oids_range[] = { - "45141a79a77842c59a63229403220a4e4be74e3d", - "4d713dc48e6b1bd75b0d61ad078ba9ca3a56745d", - "108bb4e7fd7b16490dc33ff7d972151e73d7166e", - "a0f7217ae99f5ac3e88534f5cea267febc5fa85b", -}; - -void test_diff_iterator__index_range(void) -{ - index_iterator_test( - "attr", "root", "root", 0, ARRAY_SIZE(expected_index_range), - expected_index_range, expected_index_oids_range); -} - -void test_diff_iterator__index_range_empty_0(void) -{ - index_iterator_test( - "attr", "empty", "empty", 0, 0, NULL, NULL); -} - -void test_diff_iterator__index_range_empty_1(void) -{ - index_iterator_test( - "attr", "z_empty_after", NULL, 0, 0, NULL, NULL); -} - -void test_diff_iterator__index_range_empty_2(void) -{ - index_iterator_test( - "attr", NULL, ".aaa_empty_before", 0, 0, NULL, NULL); -} - -static const char *expected_index_1[] = { - "current_file", - "file_deleted", - "modified_file", - "staged_changes", - "staged_changes_file_deleted", - "staged_changes_modified_file", - "staged_new_file", - "staged_new_file_deleted_file", - "staged_new_file_modified_file", - "subdir.txt", - "subdir/current_file", - "subdir/deleted_file", - "subdir/modified_file", -}; - -static const char* expected_index_oids_1[] = { - "a0de7e0ac200c489c41c59dfa910154a70264e6e", - "5452d32f1dd538eb0405e8a83cc185f79e25e80f", - "452e4244b5d083ddf0460acf1ecc74db9dcfa11a", - "55d316c9ba708999f1918e9677d01dfcae69c6b9", - "a6be623522ce87a1d862128ac42672604f7b468b", - "906ee7711f4f4928ddcb2a5f8fbc500deba0d2a8", - "529a16e8e762d4acb7b9636ff540a00831f9155a", - "90b8c29d8ba39434d1c63e1b093daaa26e5bd972", - "ed062903b8f6f3dccb2fa81117ba6590944ef9bd", - "e8ee89e15bbe9b20137715232387b3de5b28972e", - "53ace0d1cc1145a5f4fe4f78a186a60263190733", - "1888c805345ba265b0ee9449b8877b6064592058", - "a6191982709b746d5650e93c2acf34ef74e11504" -}; - -void test_diff_iterator__index_1(void) -{ - index_iterator_test( - "status", NULL, NULL, 0, ARRAY_SIZE(expected_index_1), - expected_index_1, expected_index_oids_1); -} - -static const char *expected_index_cs[] = { - "B", "D", "F", "H", "J", "L/1", "L/B", "L/D", "L/a", "L/c", - "a", "c", "e", "g", "i", "k/1", "k/B", "k/D", "k/a", "k/c", -}; - -static const char *expected_index_ci[] = { - "a", "B", "c", "D", "e", "F", "g", "H", "i", "J", - "k/1", "k/a", "k/B", "k/c", "k/D", "L/1", "L/a", "L/B", "L/c", "L/D", -}; - -void test_diff_iterator__index_case_folding(void) -{ - git_buf path = GIT_BUF_INIT; - int fs_is_ci = 0; - - cl_git_pass(git_buf_joinpath(&path, cl_fixture("icase"), ".gitted/CoNfIg")); - fs_is_ci = git_path_exists(path.ptr); - git_buf_free(&path); - - index_iterator_test( - "icase", NULL, NULL, 0, ARRAY_SIZE(expected_index_cs), - fs_is_ci ? expected_index_ci : expected_index_cs, NULL); - - cl_git_sandbox_cleanup(); - - index_iterator_test( - "icase", NULL, NULL, GIT_ITERATOR_IGNORE_CASE, - ARRAY_SIZE(expected_index_ci), expected_index_ci, NULL); - - cl_git_sandbox_cleanup(); - - index_iterator_test( - "icase", NULL, NULL, GIT_ITERATOR_DONT_IGNORE_CASE, - ARRAY_SIZE(expected_index_cs), expected_index_cs, NULL); -} - -/* -- WORKDIR ITERATOR TESTS -- */ - -static void workdir_iterator_test( - const char *sandbox, - const char *start, - const char *end, - int expected_count, - int expected_ignores, - const char **expected_names, - const char *an_ignored_name) -{ - git_iterator *i; - const git_index_entry *entry; - int error, count = 0, count_all = 0, count_all_post_reset = 0; - git_repository *repo = cl_git_sandbox_init(sandbox); - - cl_git_pass(git_iterator_for_workdir( - &i, repo, NULL, NULL, GIT_ITERATOR_DONT_AUTOEXPAND, start, end)); - - error = git_iterator_current(&entry, i); - cl_assert((error == 0 && entry != NULL) || - (error == GIT_ITEROVER && entry == NULL)); - - while (entry != NULL) { - int ignored = git_iterator_current_is_ignored(i); - - if (S_ISDIR(entry->mode)) { - cl_git_pass(git_iterator_advance_into(&entry, i)); - continue; - } - - if (expected_names != NULL) - cl_assert_equal_s(expected_names[count_all], entry->path); - - if (an_ignored_name && strcmp(an_ignored_name,entry->path)==0) - cl_assert(ignored); - - if (!ignored) - count++; - count_all++; - - error = git_iterator_advance(&entry, i); - - cl_assert((error == 0 && entry != NULL) || - (error == GIT_ITEROVER && entry == NULL)); - } - - cl_assert_equal_i(expected_count, count); - cl_assert_equal_i(expected_count + expected_ignores, count_all); - - cl_git_pass(git_iterator_reset(i, NULL, NULL)); - - error = git_iterator_current(&entry, i); - cl_assert((error == 0 && entry != NULL) || - (error == GIT_ITEROVER && entry == NULL)); - - while (entry != NULL) { - if (S_ISDIR(entry->mode)) { - cl_git_pass(git_iterator_advance_into(&entry, i)); - continue; - } - - if (expected_names != NULL) - cl_assert_equal_s( - expected_names[count_all_post_reset], entry->path); - count_all_post_reset++; - - error = git_iterator_advance(&entry, i); - cl_assert(error == 0 || error == GIT_ITEROVER); - } - - cl_assert_equal_i(count_all, count_all_post_reset); - - git_iterator_free(i); -} - -void test_diff_iterator__workdir_0(void) -{ - workdir_iterator_test("attr", NULL, NULL, 23, 5, NULL, "ign"); -} - -static const char *status_paths[] = { - "current_file", - "ignored_file", - "modified_file", - "new_file", - "staged_changes", - "staged_changes_modified_file", - "staged_delete_modified_file", - "staged_new_file", - "staged_new_file_modified_file", - "subdir.txt", - "subdir/current_file", - "subdir/modified_file", - "subdir/new_file", - "\xe8\xbf\x99", - NULL -}; - -void test_diff_iterator__workdir_1(void) -{ - workdir_iterator_test( - "status", NULL, NULL, 13, 1, status_paths, "ignored_file"); -} - -static const char *status_paths_range_0[] = { - "staged_changes", - "staged_changes_modified_file", - "staged_delete_modified_file", - "staged_new_file", - "staged_new_file_modified_file", - NULL -}; - -void test_diff_iterator__workdir_1_ranged_0(void) -{ - workdir_iterator_test( - "status", "staged", "staged", 5, 0, status_paths_range_0, NULL); -} - -static const char *status_paths_range_1[] = { - "modified_file", NULL -}; - -void test_diff_iterator__workdir_1_ranged_1(void) -{ - workdir_iterator_test( - "status", "modified_file", "modified_file", - 1, 0, status_paths_range_1, NULL); -} - -static const char *status_paths_range_3[] = { - "subdir.txt", - "subdir/current_file", - "subdir/modified_file", - NULL -}; - -void test_diff_iterator__workdir_1_ranged_3(void) -{ - workdir_iterator_test( - "status", "subdir", "subdir/modified_file", - 3, 0, status_paths_range_3, NULL); -} - -static const char *status_paths_range_4[] = { - "subdir/current_file", - "subdir/modified_file", - "subdir/new_file", - "\xe8\xbf\x99", - NULL -}; - -void test_diff_iterator__workdir_1_ranged_4(void) -{ - workdir_iterator_test( - "status", "subdir/", NULL, 4, 0, status_paths_range_4, NULL); -} - -static const char *status_paths_range_5[] = { - "subdir/modified_file", - NULL -}; - -void test_diff_iterator__workdir_1_ranged_5(void) -{ - workdir_iterator_test( - "status", "subdir/modified_file", "subdir/modified_file", - 1, 0, status_paths_range_5, NULL); -} - -void test_diff_iterator__workdir_1_ranged_empty_0(void) -{ - workdir_iterator_test( - "status", "\xff_does_not_exist", NULL, - 0, 0, NULL, NULL); -} - -void test_diff_iterator__workdir_1_ranged_empty_1(void) -{ - workdir_iterator_test( - "status", "empty", "empty", - 0, 0, NULL, NULL); -} - -void test_diff_iterator__workdir_1_ranged_empty_2(void) -{ - workdir_iterator_test( - "status", NULL, "aaaa_empty_before", - 0, 0, NULL, NULL); -} - -void test_diff_iterator__workdir_builtin_ignores(void) -{ - git_repository *repo = cl_git_sandbox_init("attr"); - git_iterator *i; - const git_index_entry *entry; - int idx; - static struct { - const char *path; - bool ignored; - } expected[] = { - { "dir/", true }, - { "file", false }, - { "ign", true }, - { "macro_bad", false }, - { "macro_test", false }, - { "root_test1", false }, - { "root_test2", false }, - { "root_test3", false }, - { "root_test4.txt", false }, - { "sub/", false }, - { "sub/.gitattributes", false }, - { "sub/abc", false }, - { "sub/dir/", true }, - { "sub/file", false }, - { "sub/ign/", true }, - { "sub/sub/", false }, - { "sub/sub/.gitattributes", false }, - { "sub/sub/dir", false }, /* file is not actually a dir */ - { "sub/sub/file", false }, - { NULL, false } - }; - - cl_git_pass(p_mkdir("attr/sub/sub/.git", 0777)); - cl_git_mkfile("attr/sub/.git", "whatever"); - - cl_git_pass(git_iterator_for_workdir( - &i, repo, NULL, NULL, GIT_ITERATOR_DONT_AUTOEXPAND, "dir", "sub/sub/file")); - cl_git_pass(git_iterator_current(&entry, i)); - - for (idx = 0; entry != NULL; ++idx) { - int ignored = git_iterator_current_is_ignored(i); - - cl_assert_equal_s(expected[idx].path, entry->path); - cl_assert_(ignored == expected[idx].ignored, expected[idx].path); - - if (!ignored && - (entry->mode == GIT_FILEMODE_TREE || - entry->mode == GIT_FILEMODE_COMMIT)) - { - /* it is possible to advance "into" a submodule */ - cl_git_pass(git_iterator_advance_into(&entry, i)); - } else { - int error = git_iterator_advance(&entry, i); - cl_assert(!error || error == GIT_ITEROVER); - } - } - - cl_assert(expected[idx].path == NULL); - - git_iterator_free(i); -} - -static void check_wd_first_through_third_range( - git_repository *repo, const char *start, const char *end) -{ - git_iterator *i; - const git_index_entry *entry; - int error, idx; - static const char *expected[] = { "FIRST", "second", "THIRD", NULL }; - - cl_git_pass(git_iterator_for_workdir( - &i, repo, NULL, NULL, GIT_ITERATOR_IGNORE_CASE, start, end)); - cl_git_pass(git_iterator_current(&entry, i)); - - for (idx = 0; entry != NULL; ++idx) { - cl_assert_equal_s(expected[idx], entry->path); - - error = git_iterator_advance(&entry, i); - cl_assert(!error || error == GIT_ITEROVER); - } - - cl_assert(expected[idx] == NULL); - - git_iterator_free(i); -} - -void test_diff_iterator__workdir_handles_icase_range(void) -{ - git_repository *repo; - - repo = cl_git_sandbox_init("empty_standard_repo"); - cl_git_remove_placeholders(git_repository_path(repo), "dummy-marker.txt"); - - cl_git_mkfile("empty_standard_repo/before", "whatever\n"); - cl_git_mkfile("empty_standard_repo/FIRST", "whatever\n"); - cl_git_mkfile("empty_standard_repo/second", "whatever\n"); - cl_git_mkfile("empty_standard_repo/THIRD", "whatever\n"); - cl_git_mkfile("empty_standard_repo/zafter", "whatever\n"); - cl_git_mkfile("empty_standard_repo/Zlast", "whatever\n"); - - check_wd_first_through_third_range(repo, "first", "third"); - check_wd_first_through_third_range(repo, "FIRST", "THIRD"); - check_wd_first_through_third_range(repo, "first", "THIRD"); - check_wd_first_through_third_range(repo, "FIRST", "third"); - check_wd_first_through_third_range(repo, "FirSt", "tHiRd"); -} - -static void check_tree_range( - git_repository *repo, - const char *start, - const char *end, - bool ignore_case, - int expected_count) -{ - git_tree *head; - git_iterator *i; - int error, count; - - cl_git_pass(git_repository_head_tree(&head, repo)); - - cl_git_pass(git_iterator_for_tree( - &i, head, - ignore_case ? GIT_ITERATOR_IGNORE_CASE : GIT_ITERATOR_DONT_IGNORE_CASE, - start, end)); - - for (count = 0; !(error = git_iterator_advance(NULL, i)); ++count) - /* count em up */; - - cl_assert_equal_i(GIT_ITEROVER, error); - cl_assert_equal_i(expected_count, count); - - git_iterator_free(i); - git_tree_free(head); -} - -void test_diff_iterator__tree_handles_icase_range(void) -{ - git_repository *repo; - - repo = cl_git_sandbox_init("testrepo"); - - check_tree_range(repo, "B", "C", false, 0); - check_tree_range(repo, "B", "C", true, 1); - check_tree_range(repo, "b", "c", false, 1); - check_tree_range(repo, "b", "c", true, 1); - - check_tree_range(repo, "a", "z", false, 3); - check_tree_range(repo, "a", "z", true, 4); - check_tree_range(repo, "A", "Z", false, 1); - check_tree_range(repo, "A", "Z", true, 4); - check_tree_range(repo, "a", "Z", false, 0); - check_tree_range(repo, "a", "Z", true, 4); - check_tree_range(repo, "A", "z", false, 4); - check_tree_range(repo, "A", "z", true, 4); - - check_tree_range(repo, "new.txt", "new.txt", true, 1); - check_tree_range(repo, "new.txt", "new.txt", false, 1); - check_tree_range(repo, "README", "README", true, 1); - check_tree_range(repo, "README", "README", false, 1); -} - -static void check_index_range( - git_repository *repo, - const char *start, - const char *end, - bool ignore_case, - int expected_count) -{ - git_index *index; - git_iterator *i; - int error, count, caps; - bool is_ignoring_case; - - cl_git_pass(git_repository_index(&index, repo)); - - caps = git_index_caps(index); - is_ignoring_case = ((caps & GIT_INDEXCAP_IGNORE_CASE) != 0); - - if (ignore_case != is_ignoring_case) - cl_git_pass(git_index_set_caps(index, caps ^ GIT_INDEXCAP_IGNORE_CASE)); - - cl_git_pass(git_iterator_for_index(&i, index, 0, start, end)); - - cl_assert(git_iterator_ignore_case(i) == ignore_case); - - for (count = 0; !(error = git_iterator_advance(NULL, i)); ++count) - /* count em up */; - - cl_assert_equal_i(GIT_ITEROVER, error); - cl_assert_equal_i(expected_count, count); - - git_iterator_free(i); - git_index_free(index); -} - -void test_diff_iterator__index_handles_icase_range(void) -{ - git_repository *repo; - git_index *index; - git_tree *head; - - repo = cl_git_sandbox_init("testrepo"); - - /* reset index to match HEAD */ - cl_git_pass(git_repository_head_tree(&head, repo)); - cl_git_pass(git_repository_index(&index, repo)); - cl_git_pass(git_index_read_tree(index, head)); - cl_git_pass(git_index_write(index)); - git_tree_free(head); - git_index_free(index); - - /* do some ranged iterator checks toggling case sensitivity */ - check_index_range(repo, "B", "C", false, 0); - check_index_range(repo, "B", "C", true, 1); - check_index_range(repo, "a", "z", false, 3); - check_index_range(repo, "a", "z", true, 4); -} diff --git a/vendor/libgit2/tests/diff/notify.c b/vendor/libgit2/tests/diff/notify.c deleted file mode 100644 index 6ef4af5731..0000000000 --- a/vendor/libgit2/tests/diff/notify.c +++ /dev/null @@ -1,230 +0,0 @@ -#include "clar_libgit2.h" -#include "diff_helpers.h" - -static git_repository *g_repo = NULL; - -void test_diff_notify__initialize(void) -{ -} - -void test_diff_notify__cleanup(void) -{ - cl_git_sandbox_cleanup(); -} - -static int assert_called_notifications( - const git_diff *diff_so_far, - const git_diff_delta *delta_to_add, - const char *matched_pathspec, - void *payload) -{ - bool found = false; - notify_expected *exp = (notify_expected*)payload; - notify_expected *e; - - GIT_UNUSED(diff_so_far); - - for (e = exp; e->path != NULL; e++) { - if (strcmp(e->path, delta_to_add->new_file.path)) - continue; - - cl_assert_equal_s(e->matched_pathspec, matched_pathspec); - - found = true; - break; - } - - cl_assert(found); - return 0; -} - -static void test_notify( - char **searched_pathspecs, - int pathspecs_count, - notify_expected *expected_matched_pathspecs, - int expected_diffed_files_count) -{ - git_diff_options opts = GIT_DIFF_OPTIONS_INIT; - git_diff *diff = NULL; - diff_expects exp; - - g_repo = cl_git_sandbox_init("status"); - - opts.flags |= GIT_DIFF_INCLUDE_IGNORED | GIT_DIFF_INCLUDE_UNTRACKED; - opts.notify_cb = assert_called_notifications; - opts.pathspec.strings = searched_pathspecs; - opts.pathspec.count = pathspecs_count; - - opts.notify_payload = expected_matched_pathspecs; - memset(&exp, 0, sizeof(exp)); - - cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, NULL, &opts)); - cl_git_pass(git_diff_foreach(diff, diff_file_cb, NULL, NULL, NULL, &exp)); - - cl_assert_equal_i(expected_diffed_files_count, exp.files); - - git_diff_free(diff); -} - -void test_diff_notify__notify_single_pathspec(void) -{ - char *searched_pathspecs[] = { - "*_deleted", - }; - notify_expected expected_matched_pathspecs[] = { - { "file_deleted", "*_deleted" }, - { "staged_changes_file_deleted", "*_deleted" }, - { NULL, NULL } - }; - - test_notify(searched_pathspecs, 1, expected_matched_pathspecs, 2); -} - -void test_diff_notify__notify_multiple_pathspec(void) -{ - char *searched_pathspecs[] = { - "staged_changes_cant_find_me", - "subdir/modified_cant_find_me", - "subdir/*", - "staged*" - }; - notify_expected expected_matched_pathspecs[] = { - { "staged_changes_file_deleted", "staged*" }, - { "staged_changes_modified_file", "staged*" }, - { "staged_delete_modified_file", "staged*" }, - { "staged_new_file_deleted_file", "staged*" }, - { "staged_new_file_modified_file", "staged*" }, - { "subdir/deleted_file", "subdir/*" }, - { "subdir/modified_file", "subdir/*" }, - { "subdir/new_file", "subdir/*" }, - { NULL, NULL } - }; - - test_notify(searched_pathspecs, 4, expected_matched_pathspecs, 8); -} - -void test_diff_notify__notify_catchall_with_empty_pathspecs(void) -{ - char *searched_pathspecs[] = { - "", - "" - }; - notify_expected expected_matched_pathspecs[] = { - { "file_deleted", NULL }, - { "ignored_file", NULL }, - { "modified_file", NULL }, - { "new_file", NULL }, - { "\xe8\xbf\x99", NULL }, - { "staged_changes_file_deleted", NULL }, - { "staged_changes_modified_file", NULL }, - { "staged_delete_modified_file", NULL }, - { "staged_new_file_deleted_file", NULL }, - { "staged_new_file_modified_file", NULL }, - { "subdir/deleted_file", NULL }, - { "subdir/modified_file", NULL }, - { "subdir/new_file", NULL }, - { NULL, NULL } - }; - - test_notify(searched_pathspecs, 1, expected_matched_pathspecs, 13); -} - -void test_diff_notify__notify_catchall(void) -{ - char *searched_pathspecs[] = { - "*", - }; - notify_expected expected_matched_pathspecs[] = { - { "file_deleted", "*" }, - { "ignored_file", "*" }, - { "modified_file", "*" }, - { "new_file", "*" }, - { "\xe8\xbf\x99", "*" }, - { "staged_changes_file_deleted", "*" }, - { "staged_changes_modified_file", "*" }, - { "staged_delete_modified_file", "*" }, - { "staged_new_file_deleted_file", "*" }, - { "staged_new_file_modified_file", "*" }, - { "subdir/deleted_file", "*" }, - { "subdir/modified_file", "*" }, - { "subdir/new_file", "*" }, - { NULL, NULL } - }; - - test_notify(searched_pathspecs, 1, expected_matched_pathspecs, 13); -} - -static int abort_diff( - const git_diff *diff_so_far, - const git_diff_delta *delta_to_add, - const char *matched_pathspec, - void *payload) -{ - GIT_UNUSED(diff_so_far); - GIT_UNUSED(delta_to_add); - GIT_UNUSED(matched_pathspec); - GIT_UNUSED(payload); - - return -42; -} - -void test_diff_notify__notify_cb_can_abort_diff(void) -{ - git_diff_options opts = GIT_DIFF_OPTIONS_INIT; - git_diff *diff = NULL; - char *pathspec = NULL; - - g_repo = cl_git_sandbox_init("status"); - - opts.flags |= GIT_DIFF_INCLUDE_IGNORED | GIT_DIFF_INCLUDE_UNTRACKED; - opts.notify_cb = abort_diff; - opts.pathspec.strings = &pathspec; - opts.pathspec.count = 1; - - pathspec = "file_deleted"; - cl_git_fail_with( - git_diff_index_to_workdir(&diff, g_repo, NULL, &opts), -42); - - pathspec = "staged_changes_modified_file"; - cl_git_fail_with( - git_diff_index_to_workdir(&diff, g_repo, NULL, &opts), -42); -} - -static int filter_all( - const git_diff *diff_so_far, - const git_diff_delta *delta_to_add, - const char *matched_pathspec, - void *payload) -{ - GIT_UNUSED(diff_so_far); - GIT_UNUSED(delta_to_add); - GIT_UNUSED(matched_pathspec); - GIT_UNUSED(payload); - - return 42; -} - -void test_diff_notify__notify_cb_can_be_used_as_filtering_function(void) -{ - git_diff_options opts = GIT_DIFF_OPTIONS_INIT; - git_diff *diff = NULL; - char *pathspec = NULL; - diff_expects exp; - - g_repo = cl_git_sandbox_init("status"); - - opts.flags |= GIT_DIFF_INCLUDE_IGNORED | GIT_DIFF_INCLUDE_UNTRACKED; - opts.notify_cb = filter_all; - opts.pathspec.strings = &pathspec; - opts.pathspec.count = 1; - - pathspec = "*_deleted"; - memset(&exp, 0, sizeof(exp)); - - cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, NULL, &opts)); - cl_git_pass(git_diff_foreach(diff, diff_file_cb, NULL, NULL, NULL, &exp)); - - cl_assert_equal_i(0, exp.files); - - git_diff_free(diff); -} diff --git a/vendor/libgit2/tests/diff/patch.c b/vendor/libgit2/tests/diff/patch.c deleted file mode 100644 index 1184d19687..0000000000 --- a/vendor/libgit2/tests/diff/patch.c +++ /dev/null @@ -1,612 +0,0 @@ -#include "clar_libgit2.h" -#include "git2/sys/repository.h" - -#include "diff_helpers.h" -#include "diff.h" -#include "repository.h" -#include "buf_text.h" - -static git_repository *g_repo = NULL; - -void test_diff_patch__initialize(void) -{ -} - -void test_diff_patch__cleanup(void) -{ - cl_git_sandbox_cleanup(); -} - -#define EXPECTED_HEADER "diff --git a/subdir.txt b/subdir.txt\n" \ - "deleted file mode 100644\n" \ - "index e8ee89e..0000000\n" \ - "--- a/subdir.txt\n" \ - "+++ /dev/null\n" - -#define EXPECTED_HUNK "@@ -1,2 +0,0 @@\n" - -static int check_removal_cb( - const git_diff_delta *delta, - const git_diff_hunk *hunk, - const git_diff_line *line, - void *payload) -{ - switch (line->origin) { - case GIT_DIFF_LINE_FILE_HDR: - cl_assert_equal_s(EXPECTED_HEADER, line->content); - cl_assert(hunk == NULL); - goto check_delta; - - case GIT_DIFF_LINE_HUNK_HDR: - cl_assert_equal_s(EXPECTED_HUNK, line->content); - goto check_hunk; - - case GIT_DIFF_LINE_CONTEXT: - case GIT_DIFF_LINE_DELETION: - if (payload != NULL) - return *(int *)payload; - goto check_hunk; - - default: - /* unexpected code path */ - return -1; - } - -check_hunk: - cl_assert(hunk != NULL); - cl_assert_equal_i(1, hunk->old_start); - cl_assert_equal_i(2, hunk->old_lines); - cl_assert_equal_i(0, hunk->new_start); - cl_assert_equal_i(0, hunk->new_lines); - -check_delta: - cl_assert_equal_s("subdir.txt", delta->old_file.path); - cl_assert_equal_s("subdir.txt", delta->new_file.path); - cl_assert_equal_i(GIT_DELTA_DELETED, delta->status); - - return 0; -} - -void test_diff_patch__can_properly_display_the_removal_of_a_file(void) -{ - /* - * $ git diff 26a125e..735b6a2 - * diff --git a/subdir.txt b/subdir.txt - * deleted file mode 100644 - * index e8ee89e..0000000 - * --- a/subdir.txt - * +++ /dev/null - * @@ -1,2 +0,0 @@ - * -Is it a bird? - * -Is it a plane? - */ - - const char *one_sha = "26a125e"; - const char *another_sha = "735b6a2"; - git_tree *one, *another; - git_diff *diff; - - g_repo = cl_git_sandbox_init("status"); - - one = resolve_commit_oid_to_tree(g_repo, one_sha); - another = resolve_commit_oid_to_tree(g_repo, another_sha); - - cl_git_pass(git_diff_tree_to_tree(&diff, g_repo, one, another, NULL)); - - cl_git_pass(git_diff_print( - diff, GIT_DIFF_FORMAT_PATCH, check_removal_cb, NULL)); - - git_diff_free(diff); - - git_tree_free(another); - git_tree_free(one); -} - -void test_diff_patch__can_cancel_diff_print(void) -{ - const char *one_sha = "26a125e"; - const char *another_sha = "735b6a2"; - git_tree *one, *another; - git_diff *diff; - int fail_with; - - g_repo = cl_git_sandbox_init("status"); - - one = resolve_commit_oid_to_tree(g_repo, one_sha); - another = resolve_commit_oid_to_tree(g_repo, another_sha); - - cl_git_pass(git_diff_tree_to_tree(&diff, g_repo, one, another, NULL)); - - fail_with = -2323; - - cl_git_fail_with(git_diff_print( - diff, GIT_DIFF_FORMAT_PATCH, check_removal_cb, &fail_with), - fail_with); - - fail_with = 45; - - cl_git_fail_with(git_diff_print( - diff, GIT_DIFF_FORMAT_PATCH, check_removal_cb, &fail_with), - fail_with); - - git_diff_free(diff); - - git_tree_free(another); - git_tree_free(one); -} - -void test_diff_patch__to_string(void) -{ - const char *one_sha = "26a125e"; - const char *another_sha = "735b6a2"; - git_tree *one, *another; - git_diff *diff; - git_patch *patch; - git_buf buf = GIT_BUF_INIT; - const char *expected = "diff --git a/subdir.txt b/subdir.txt\ndeleted file mode 100644\nindex e8ee89e..0000000\n--- a/subdir.txt\n+++ /dev/null\n@@ -1,2 +0,0 @@\n-Is it a bird?\n-Is it a plane?\n"; - - g_repo = cl_git_sandbox_init("status"); - - one = resolve_commit_oid_to_tree(g_repo, one_sha); - another = resolve_commit_oid_to_tree(g_repo, another_sha); - - cl_git_pass(git_diff_tree_to_tree(&diff, g_repo, one, another, NULL)); - - cl_assert_equal_i(1, (int)git_diff_num_deltas(diff)); - - cl_git_pass(git_patch_from_diff(&patch, diff, 0)); - - cl_git_pass(git_patch_to_buf(&buf, patch)); - - cl_assert_equal_s(expected, buf.ptr); - - cl_assert_equal_sz(31, git_patch_size(patch, 0, 0, 0)); - cl_assert_equal_sz(31, git_patch_size(patch, 1, 0, 0)); - cl_assert_equal_sz(31 + 16, git_patch_size(patch, 1, 1, 0)); - cl_assert_equal_sz(strlen(expected), git_patch_size(patch, 1, 1, 1)); - - git_buf_free(&buf); - git_patch_free(patch); - git_diff_free(diff); - git_tree_free(another); - git_tree_free(one); -} - -void test_diff_patch__config_options(void) -{ - const char *one_sha = "26a125e"; /* current HEAD */ - git_tree *one; - git_config *cfg; - git_diff *diff; - git_patch *patch; - git_buf buf = GIT_BUF_INIT; - git_diff_options opts = GIT_DIFF_OPTIONS_INIT; - char *onefile = "staged_changes_modified_file"; - const char *expected1 = "diff --git c/staged_changes_modified_file i/staged_changes_modified_file\nindex 70bd944..906ee77 100644\n--- c/staged_changes_modified_file\n+++ i/staged_changes_modified_file\n@@ -1 +1,2 @@\n staged_changes_modified_file\n+staged_changes_modified_file\n"; - const char *expected2 = "diff --git i/staged_changes_modified_file w/staged_changes_modified_file\nindex 906ee77..011c344 100644\n--- i/staged_changes_modified_file\n+++ w/staged_changes_modified_file\n@@ -1,2 +1,3 @@\n staged_changes_modified_file\n staged_changes_modified_file\n+staged_changes_modified_file\n"; - const char *expected3 = "diff --git staged_changes_modified_file staged_changes_modified_file\nindex 906ee77..011c344 100644\n--- staged_changes_modified_file\n+++ staged_changes_modified_file\n@@ -1,2 +1,3 @@\n staged_changes_modified_file\n staged_changes_modified_file\n+staged_changes_modified_file\n"; - const char *expected4 = "diff --git staged_changes_modified_file staged_changes_modified_file\nindex 70bd9443ada0..906ee7711f4f 100644\n--- staged_changes_modified_file\n+++ staged_changes_modified_file\n@@ -1 +1,2 @@\n staged_changes_modified_file\n+staged_changes_modified_file\n"; - - g_repo = cl_git_sandbox_init("status"); - cl_git_pass(git_repository_config(&cfg, g_repo)); - one = resolve_commit_oid_to_tree(g_repo, one_sha); - opts.pathspec.count = 1; - opts.pathspec.strings = &onefile; - - - cl_git_pass(git_config_set_string(cfg, "diff.mnemonicprefix", "true")); - - cl_git_pass(git_diff_tree_to_index(&diff, g_repo, one, NULL, &opts)); - - cl_assert_equal_i(1, (int)git_diff_num_deltas(diff)); - cl_git_pass(git_patch_from_diff(&patch, diff, 0)); - cl_git_pass(git_patch_to_buf(&buf, patch)); - cl_assert_equal_s(expected1, buf.ptr); - - git_buf_clear(&buf); - git_patch_free(patch); - git_diff_free(diff); - - cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, NULL, &opts)); - - cl_assert_equal_i(1, (int)git_diff_num_deltas(diff)); - cl_git_pass(git_patch_from_diff(&patch, diff, 0)); - cl_git_pass(git_patch_to_buf(&buf, patch)); - cl_assert_equal_s(expected2, buf.ptr); - - git_buf_clear(&buf); - git_patch_free(patch); - git_diff_free(diff); - - - cl_git_pass(git_config_set_string(cfg, "diff.noprefix", "true")); - - cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, NULL, &opts)); - - cl_assert_equal_i(1, (int)git_diff_num_deltas(diff)); - cl_git_pass(git_patch_from_diff(&patch, diff, 0)); - cl_git_pass(git_patch_to_buf(&buf, patch)); - cl_assert_equal_s(expected3, buf.ptr); - - git_buf_clear(&buf); - git_patch_free(patch); - git_diff_free(diff); - - - cl_git_pass(git_config_set_int32(cfg, "core.abbrev", 12)); - - cl_git_pass(git_diff_tree_to_index(&diff, g_repo, one, NULL, &opts)); - - cl_assert_equal_i(1, (int)git_diff_num_deltas(diff)); - cl_git_pass(git_patch_from_diff(&patch, diff, 0)); - cl_git_pass(git_patch_to_buf(&buf, patch)); - cl_assert_equal_s(expected4, buf.ptr); - - git_buf_clear(&buf); - git_patch_free(patch); - git_diff_free(diff); - - git_buf_free(&buf); - git_tree_free(one); - git_config_free(cfg); -} - -void test_diff_patch__hunks_have_correct_line_numbers(void) -{ - git_config *cfg; - git_tree *head; - git_diff_options opt = GIT_DIFF_OPTIONS_INIT; - git_diff *diff; - git_patch *patch; - const git_diff_delta *delta; - const git_diff_hunk *hunk; - const git_diff_line *line; - size_t hunklen; - git_buf old_content = GIT_BUF_INIT, actual = GIT_BUF_INIT; - const char *new_content = "The Song of Seven Cities\n------------------------\n\nI WAS Lord of Cities very sumptuously builded.\nSeven roaring Cities paid me tribute from afar.\nIvory their outposts were--the guardrooms of them gilded,\nAnd garrisoned with Amazons invincible in war.\n\nThis is some new text;\nNot as good as the old text;\nBut here it is.\n\nSo they warred and trafficked only yesterday, my Cities.\nTo-day there is no mark or mound of where my Cities stood.\nFor the River rose at midnight and it washed away my Cities.\nThey are evened with Atlantis and the towns before the Flood.\n\nRain on rain-gorged channels raised the water-levels round them,\nFreshet backed on freshet swelled and swept their world from sight,\nTill the emboldened floods linked arms and, flashing forward, drowned them--\nDrowned my Seven Cities and their peoples in one night!\n\nLow among the alders lie their derelict foundations,\nThe beams wherein they trusted and the plinths whereon they built--\nMy rulers and their treasure and their unborn populations,\nDead, destroyed, aborted, and defiled with mud and silt!\n\nAnother replacement;\nBreaking up the poem;\nGenerating some hunks.\n\nTo the sound of trumpets shall their seed restore my Cities\nWealthy and well-weaponed, that once more may I behold\nAll the world go softly when it walks before my Cities,\nAnd the horses and the chariots fleeing from them as of old!\n\n -- Rudyard Kipling\n"; - - g_repo = cl_git_sandbox_init("renames"); - - cl_git_pass(git_config_new(&cfg)); - git_repository_set_config(g_repo, cfg); - git_config_free(cfg); - - git_repository_reinit_filesystem(g_repo, false); - - cl_git_pass( - git_futils_readbuffer(&old_content, "renames/songof7cities.txt")); - - cl_git_rewritefile("renames/songof7cities.txt", new_content); - - cl_git_pass(git_repository_head_tree(&head, g_repo)); - - cl_git_pass(git_diff_tree_to_workdir(&diff, g_repo, head, &opt)); - - cl_assert_equal_i(1, (int)git_diff_num_deltas(diff)); - - cl_git_pass(git_patch_from_diff(&patch, diff, 0)); - cl_assert((delta = git_patch_get_delta(patch)) != NULL); - - cl_assert_equal_i(GIT_DELTA_MODIFIED, (int)delta->status); - cl_assert_equal_i(2, (int)git_patch_num_hunks(patch)); - - /* check hunk 0 */ - - cl_git_pass( - git_patch_get_hunk(&hunk, &hunklen, patch, 0)); - - cl_assert_equal_i(18, (int)hunklen); - - cl_assert_equal_i(6, (int)hunk->old_start); - cl_assert_equal_i(15, (int)hunk->old_lines); - cl_assert_equal_i(6, (int)hunk->new_start); - cl_assert_equal_i(9, (int)hunk->new_lines); - - cl_assert_equal_i(18, (int)git_patch_num_lines_in_hunk(patch, 0)); - - cl_git_pass(git_patch_get_line_in_hunk(&line, patch, 0, 0)); - cl_assert_equal_i(GIT_DIFF_LINE_CONTEXT, (int)line->origin); - cl_git_pass(git_buf_set(&actual, line->content, line->content_len)); - cl_assert_equal_s("Ivory their outposts were--the guardrooms of them gilded,\n", actual.ptr); - cl_assert_equal_i(6, line->old_lineno); - cl_assert_equal_i(6, line->new_lineno); - cl_assert_equal_i(-1, line->content_offset); - - cl_git_pass(git_patch_get_line_in_hunk(&line, patch, 0, 3)); - cl_assert_equal_i(GIT_DIFF_LINE_DELETION, (int)line->origin); - cl_git_pass(git_buf_set(&actual, line->content, line->content_len)); - cl_assert_equal_s("All the world went softly when it walked before my Cities--\n", actual.ptr); - cl_assert_equal_i(9, line->old_lineno); - cl_assert_equal_i(-1, line->new_lineno); - cl_assert_equal_i(252, line->content_offset); - - cl_git_pass(git_patch_get_line_in_hunk(&line, patch, 0, 12)); - cl_assert_equal_i(GIT_DIFF_LINE_ADDITION, (int)line->origin); - cl_git_pass(git_buf_set(&actual, line->content, line->content_len)); - cl_assert_equal_s("This is some new text;\n", actual.ptr); - cl_assert_equal_i(-1, line->old_lineno); - cl_assert_equal_i(9, line->new_lineno); - cl_assert_equal_i(252, line->content_offset); - - /* check hunk 1 */ - - cl_git_pass(git_patch_get_hunk(&hunk, &hunklen, patch, 1)); - - cl_assert_equal_i(18, (int)hunklen); - - cl_assert_equal_i(31, (int)hunk->old_start); - cl_assert_equal_i(15, (int)hunk->old_lines); - cl_assert_equal_i(25, (int)hunk->new_start); - cl_assert_equal_i(9, (int)hunk->new_lines); - - cl_assert_equal_i(18, (int)git_patch_num_lines_in_hunk(patch, 1)); - - cl_git_pass(git_patch_get_line_in_hunk(&line, patch, 1, 0)); - cl_assert_equal_i(GIT_DIFF_LINE_CONTEXT, (int)line->origin); - cl_git_pass(git_buf_set(&actual, line->content, line->content_len)); - cl_assert_equal_s("My rulers and their treasure and their unborn populations,\n", actual.ptr); - cl_assert_equal_i(31, line->old_lineno); - cl_assert_equal_i(25, line->new_lineno); - cl_assert_equal_i(-1, line->content_offset); - - cl_git_pass(git_patch_get_line_in_hunk(&line, patch, 1, 3)); - cl_assert_equal_i(GIT_DIFF_LINE_DELETION, (int)line->origin); - cl_git_pass(git_buf_set(&actual, line->content, line->content_len)); - cl_assert_equal_s("The Daughters of the Palace whom they cherished in my Cities,\n", actual.ptr); - cl_assert_equal_i(34, line->old_lineno); - cl_assert_equal_i(-1, line->new_lineno); - cl_assert_equal_i(1468, line->content_offset); - - cl_git_pass(git_patch_get_line_in_hunk(&line, patch, 1, 12)); - cl_assert_equal_i(GIT_DIFF_LINE_ADDITION, (int)line->origin); - cl_git_pass(git_buf_set(&actual, line->content, line->content_len)); - cl_assert_equal_s("Another replacement;\n", actual.ptr); - cl_assert_equal_i(-1, line->old_lineno); - cl_assert_equal_i(28, line->new_lineno); - cl_assert_equal_i(1066, line->content_offset); - - git_patch_free(patch); - git_diff_free(diff); - - /* Let's check line numbers when there is no newline */ - - git_buf_rtrim(&old_content); - cl_git_rewritefile("renames/songof7cities.txt", old_content.ptr); - - cl_git_pass(git_diff_tree_to_workdir(&diff, g_repo, head, &opt)); - - cl_assert_equal_i(1, (int)git_diff_num_deltas(diff)); - - cl_git_pass(git_patch_from_diff(&patch, diff, 0)); - cl_assert((delta = git_patch_get_delta(patch)) != NULL); - - cl_assert_equal_i(GIT_DELTA_MODIFIED, (int)delta->status); - cl_assert_equal_i(1, (int)git_patch_num_hunks(patch)); - - /* check hunk 0 */ - - cl_git_pass(git_patch_get_hunk(&hunk, &hunklen, patch, 0)); - - cl_assert_equal_i(6, (int)hunklen); - - cl_assert_equal_i(46, (int)hunk->old_start); - cl_assert_equal_i(4, (int)hunk->old_lines); - cl_assert_equal_i(46, (int)hunk->new_start); - cl_assert_equal_i(4, (int)hunk->new_lines); - - cl_assert_equal_i(6, (int)git_patch_num_lines_in_hunk(patch, 0)); - - cl_git_pass(git_patch_get_line_in_hunk(&line, patch, 0, 1)); - cl_assert_equal_i(GIT_DIFF_LINE_CONTEXT, (int)line->origin); - cl_git_pass(git_buf_set(&actual, line->content, line->content_len)); - cl_assert_equal_s("And the horses and the chariots fleeing from them as of old!\n", actual.ptr); - cl_assert_equal_i(47, line->old_lineno); - cl_assert_equal_i(47, line->new_lineno); - - cl_git_pass(git_patch_get_line_in_hunk(&line, patch, 0, 2)); - cl_assert_equal_i(GIT_DIFF_LINE_CONTEXT, (int)line->origin); - cl_git_pass(git_buf_set(&actual, line->content, line->content_len)); - cl_assert_equal_s("\n", actual.ptr); - cl_assert_equal_i(48, line->old_lineno); - cl_assert_equal_i(48, line->new_lineno); - - cl_git_pass(git_patch_get_line_in_hunk(&line, patch, 0, 3)); - cl_assert_equal_i(GIT_DIFF_LINE_DELETION, (int)line->origin); - cl_git_pass(git_buf_set(&actual, line->content, line->content_len)); - cl_assert_equal_s(" -- Rudyard Kipling\n", actual.ptr); - cl_assert_equal_i(49, line->old_lineno); - cl_assert_equal_i(-1, line->new_lineno); - - cl_git_pass(git_patch_get_line_in_hunk(&line, patch, 0, 4)); - cl_assert_equal_i(GIT_DIFF_LINE_ADDITION, (int)line->origin); - cl_git_pass(git_buf_set(&actual, line->content, line->content_len)); - cl_assert_equal_s(" -- Rudyard Kipling", actual.ptr); - cl_assert_equal_i(-1, line->old_lineno); - cl_assert_equal_i(49, line->new_lineno); - - cl_git_pass(git_patch_get_line_in_hunk(&line, patch, 0, 5)); - cl_assert_equal_i(GIT_DIFF_LINE_DEL_EOFNL, (int)line->origin); - cl_git_pass(git_buf_set(&actual, line->content, line->content_len)); - cl_assert_equal_s("\n\\ No newline at end of file\n", actual.ptr); - cl_assert_equal_i(-1, line->old_lineno); - cl_assert_equal_i(49, line->new_lineno); - - git_patch_free(patch); - git_diff_free(diff); - - git_buf_free(&actual); - git_buf_free(&old_content); - git_tree_free(head); -} - -static void check_single_patch_stats( - git_repository *repo, size_t hunks, - size_t adds, size_t dels, size_t ctxt, size_t *sizes, - const char *expected) -{ - git_diff *diff; - git_patch *patch; - const git_diff_delta *delta; - size_t actual_ctxt, actual_adds, actual_dels; - - cl_git_pass(git_diff_index_to_workdir(&diff, repo, NULL, NULL)); - - cl_assert_equal_i(1, (int)git_diff_num_deltas(diff)); - - cl_git_pass(git_patch_from_diff(&patch, diff, 0)); - cl_assert((delta = git_patch_get_delta(patch)) != NULL); - cl_assert_equal_i(GIT_DELTA_MODIFIED, (int)delta->status); - - cl_assert_equal_i((int)hunks, (int)git_patch_num_hunks(patch)); - - cl_git_pass( git_patch_line_stats( - &actual_ctxt, &actual_adds, &actual_dels, patch) ); - - cl_assert_equal_sz(ctxt, actual_ctxt); - cl_assert_equal_sz(adds, actual_adds); - cl_assert_equal_sz(dels, actual_dels); - - if (expected != NULL) { - git_buf buf = GIT_BUF_INIT; - cl_git_pass(git_patch_to_buf(&buf, patch)); - cl_assert_equal_s(expected, buf.ptr); - git_buf_free(&buf); - - cl_assert_equal_sz( - strlen(expected), git_patch_size(patch, 1, 1, 1)); - } - - if (sizes) { - if (sizes[0]) - cl_assert_equal_sz(sizes[0], git_patch_size(patch, 0, 0, 0)); - if (sizes[1]) - cl_assert_equal_sz(sizes[1], git_patch_size(patch, 1, 0, 0)); - if (sizes[2]) - cl_assert_equal_sz(sizes[2], git_patch_size(patch, 1, 1, 0)); - } - - /* walk lines in hunk with basic sanity checks */ - for (; hunks > 0; --hunks) { - size_t i, max_i; - const git_diff_line *line; - int last_new_lineno = -1, last_old_lineno = -1; - - max_i = git_patch_num_lines_in_hunk(patch, hunks - 1); - - for (i = 0; i < max_i; ++i) { - int expected = 1; - - cl_git_pass( - git_patch_get_line_in_hunk(&line, patch, hunks - 1, i)); - - if (line->origin == GIT_DIFF_LINE_ADD_EOFNL || - line->origin == GIT_DIFF_LINE_DEL_EOFNL || - line->origin == GIT_DIFF_LINE_CONTEXT_EOFNL) - expected = 0; - - if (line->old_lineno >= 0) { - if (last_old_lineno >= 0) - cl_assert_equal_i( - expected, line->old_lineno - last_old_lineno); - last_old_lineno = line->old_lineno; - } - - if (line->new_lineno >= 0) { - if (last_new_lineno >= 0) - cl_assert_equal_i( - expected, line->new_lineno - last_new_lineno); - last_new_lineno = line->new_lineno; - } - } - } - - git_patch_free(patch); - git_diff_free(diff); -} - -void test_diff_patch__line_counts_with_eofnl(void) -{ - git_config *cfg; - git_buf content = GIT_BUF_INIT; - const char *end; - git_index *index; - const char *expected = - /* below is pasted output of 'git diff' with fn context removed */ - "diff --git a/songof7cities.txt b/songof7cities.txt\n" - "index 378a7d9..3d0154e 100644\n" - "--- a/songof7cities.txt\n" - "+++ b/songof7cities.txt\n" - "@@ -42,7 +42,7 @@ With peoples undefeated of the dark, enduring blood.\n" - " \n" - " To the sound of trumpets shall their seed restore my Cities\n" - " Wealthy and well-weaponed, that once more may I behold\n" - "-All the world go softly when it walks before my Cities,\n" - "+#All the world go softly when it walks before my Cities,\n" - " And the horses and the chariots fleeing from them as of old!\n" - " \n" - " -- Rudyard Kipling\n" - "\\ No newline at end of file\n"; - size_t expected_sizes[3] = { 115, 119 + 115 + 114, 119 + 115 + 114 + 71 }; - - g_repo = cl_git_sandbox_init("renames"); - - cl_git_pass(git_config_new(&cfg)); - git_repository_set_config(g_repo, cfg); - git_config_free(cfg); - - git_repository_reinit_filesystem(g_repo, false); - - cl_git_pass(git_futils_readbuffer(&content, "renames/songof7cities.txt")); - - /* remove first line */ - - end = git_buf_cstr(&content) + git_buf_find(&content, '\n') + 1; - git_buf_consume(&content, end); - cl_git_rewritefile("renames/songof7cities.txt", content.ptr); - - check_single_patch_stats(g_repo, 1, 0, 1, 3, NULL, NULL); - - /* remove trailing whitespace */ - - git_buf_rtrim(&content); - cl_git_rewritefile("renames/songof7cities.txt", content.ptr); - - check_single_patch_stats(g_repo, 2, 1, 2, 6, NULL, NULL); - - /* add trailing whitespace */ - - cl_git_pass(git_repository_index(&index, g_repo)); - cl_git_pass(git_index_add_bypath(index, "songof7cities.txt")); - cl_git_pass(git_index_write(index)); - git_index_free(index); - - cl_git_pass(git_buf_putc(&content, '\n')); - cl_git_rewritefile("renames/songof7cities.txt", content.ptr); - - check_single_patch_stats(g_repo, 1, 1, 1, 3, NULL, NULL); - - /* no trailing whitespace as context line */ - - { - /* walk back a couple lines, make space and insert char */ - char *scan = content.ptr + content.size; - int i; - - for (i = 0; i < 5; ++i) { - for (--scan; scan > content.ptr && *scan != '\n'; --scan) - /* seek to prev \n */; - } - cl_assert(scan > content.ptr); - - /* overwrite trailing \n with right-shifted content */ - memmove(scan + 1, scan, content.size - (scan - content.ptr) - 1); - /* insert '#' char into space we created */ - scan[1] = '#'; - } - cl_git_rewritefile("renames/songof7cities.txt", content.ptr); - - check_single_patch_stats( - g_repo, 1, 1, 1, 6, expected_sizes, expected); - - git_buf_free(&content); -} diff --git a/vendor/libgit2/tests/diff/pathspec.c b/vendor/libgit2/tests/diff/pathspec.c deleted file mode 100644 index 5761d2d2be..0000000000 --- a/vendor/libgit2/tests/diff/pathspec.c +++ /dev/null @@ -1,93 +0,0 @@ -#include "clar_libgit2.h" -#include "diff_helpers.h" - -static git_repository *g_repo = NULL; - -void test_diff_pathspec__initialize(void) -{ - g_repo = cl_git_sandbox_init("status"); -} - -void test_diff_pathspec__cleanup(void) -{ - cl_git_sandbox_cleanup(); -} - -void test_diff_pathspec__0(void) -{ - const char *a_commit = "26a125ee"; /* the current HEAD */ - const char *b_commit = "0017bd4a"; /* the start */ - git_tree *a = resolve_commit_oid_to_tree(g_repo, a_commit); - git_tree *b = resolve_commit_oid_to_tree(g_repo, b_commit); - git_diff_options opts = GIT_DIFF_OPTIONS_INIT; - git_diff *diff = NULL; - git_strarray paths = { NULL, 1 }; - char *path; - git_pathspec *ps; - git_pathspec_match_list *matches; - - cl_assert(a); - cl_assert(b); - - path = "*_file"; - paths.strings = &path; - cl_git_pass(git_pathspec_new(&ps, &paths)); - - cl_git_pass(git_pathspec_match_tree(&matches, a, GIT_PATHSPEC_DEFAULT, ps)); - cl_assert_equal_i(7, (int)git_pathspec_match_list_entrycount(matches)); - cl_assert_equal_s("current_file", git_pathspec_match_list_entry(matches,0)); - cl_assert(git_pathspec_match_list_diff_entry(matches,0) == NULL); - git_pathspec_match_list_free(matches); - - cl_git_pass(git_diff_tree_to_tree(&diff, g_repo, NULL, a, &opts)); - - cl_git_pass(git_pathspec_match_diff( - &matches, diff, GIT_PATHSPEC_DEFAULT, ps)); - cl_assert_equal_i(7, (int)git_pathspec_match_list_entrycount(matches)); - cl_assert(git_pathspec_match_list_diff_entry(matches, 0) != NULL); - cl_assert(git_pathspec_match_list_entry(matches, 0) == NULL); - cl_assert_equal_s("current_file", - git_pathspec_match_list_diff_entry(matches,0)->new_file.path); - cl_assert_equal_i(GIT_DELTA_ADDED, - (int)git_pathspec_match_list_diff_entry(matches,0)->status); - git_pathspec_match_list_free(matches); - - git_diff_free(diff); - diff = NULL; - - cl_git_pass(git_diff_tree_to_tree(&diff, g_repo, a, b, &opts)); - - cl_git_pass(git_pathspec_match_diff( - &matches, diff, GIT_PATHSPEC_DEFAULT, ps)); - cl_assert_equal_i(3, (int)git_pathspec_match_list_entrycount(matches)); - cl_assert(git_pathspec_match_list_diff_entry(matches, 0) != NULL); - cl_assert(git_pathspec_match_list_entry(matches, 0) == NULL); - cl_assert_equal_s("subdir/current_file", - git_pathspec_match_list_diff_entry(matches,0)->new_file.path); - cl_assert_equal_i(GIT_DELTA_DELETED, - (int)git_pathspec_match_list_diff_entry(matches,0)->status); - git_pathspec_match_list_free(matches); - - git_diff_free(diff); - diff = NULL; - - cl_git_pass(git_diff_tree_to_workdir(&diff, g_repo, a, &opts)); - - cl_git_pass(git_pathspec_match_diff( - &matches, diff, GIT_PATHSPEC_DEFAULT, ps)); - cl_assert_equal_i(4, (int)git_pathspec_match_list_entrycount(matches)); - cl_assert(git_pathspec_match_list_diff_entry(matches, 0) != NULL); - cl_assert(git_pathspec_match_list_entry(matches, 0) == NULL); - cl_assert_equal_s("modified_file", - git_pathspec_match_list_diff_entry(matches,0)->new_file.path); - cl_assert_equal_i(GIT_DELTA_MODIFIED, - (int)git_pathspec_match_list_diff_entry(matches,0)->status); - git_pathspec_match_list_free(matches); - - git_diff_free(diff); - diff = NULL; - - git_tree_free(a); - git_tree_free(b); - git_pathspec_free(ps); -} diff --git a/vendor/libgit2/tests/diff/rename.c b/vendor/libgit2/tests/diff/rename.c deleted file mode 100644 index 5cfd8e2356..0000000000 --- a/vendor/libgit2/tests/diff/rename.c +++ /dev/null @@ -1,1704 +0,0 @@ -#include "clar_libgit2.h" -#include "diff_helpers.h" -#include "buf_text.h" - -static git_repository *g_repo = NULL; - -void test_diff_rename__initialize(void) -{ - g_repo = cl_git_sandbox_init("renames"); - - cl_repo_set_bool(g_repo, "core.autocrlf", false); -} - -void test_diff_rename__cleanup(void) -{ - cl_git_sandbox_cleanup(); -} - -/* - * Renames repo has: - * - * commit 31e47d8c1fa36d7f8d537b96158e3f024de0a9f2 - - * serving.txt (25 lines) - * sevencities.txt (50 lines) - * commit 2bc7f351d20b53f1c72c16c4b036e491c478c49a - - * serving.txt -> sixserving.txt (rename, no change, 100% match) - * sevencities.txt -> sevencities.txt (no change) - * sevencities.txt -> songofseven.txt (copy, no change, 100% match) - * commit 1c068dee5790ef1580cfc4cd670915b48d790084 - * songofseven.txt -> songofseven.txt (major rewrite, <20% match - split) - * sixserving.txt -> sixserving.txt (indentation change) - * sixserving.txt -> ikeepsix.txt (copy, add title, >80% match) - * sevencities.txt (no change) - * commit 19dd32dfb1520a64e5bbaae8dce6ef423dfa2f13 - * songofseven.txt -> untimely.txt (rename, convert to crlf) - * ikeepsix.txt -> ikeepsix.txt (reorder sections in file) - * sixserving.txt -> sixserving.txt (whitespace change - not just indent) - * sevencities.txt -> songof7cities.txt (rename, small text changes) - */ - -void test_diff_rename__match_oid(void) -{ - const char *old_sha = "31e47d8c1fa36d7f8d537b96158e3f024de0a9f2"; - const char *new_sha = "2bc7f351d20b53f1c72c16c4b036e491c478c49a"; - git_tree *old_tree, *new_tree; - git_diff *diff; - git_diff_options diffopts = GIT_DIFF_OPTIONS_INIT; - git_diff_find_options opts = GIT_DIFF_FIND_OPTIONS_INIT; - diff_expects exp; - - old_tree = resolve_commit_oid_to_tree(g_repo, old_sha); - new_tree = resolve_commit_oid_to_tree(g_repo, new_sha); - - /* Must pass GIT_DIFF_INCLUDE_UNMODIFIED if you expect to emulate - * --find-copies-harder during rename transformion... - */ - diffopts.flags |= GIT_DIFF_INCLUDE_UNMODIFIED; - - cl_git_pass(git_diff_tree_to_tree( - &diff, g_repo, old_tree, new_tree, &diffopts)); - - /* git diff --no-renames \ - * 31e47d8c1fa36d7f8d537b96158e3f024de0a9f2 \ - * 2bc7f351d20b53f1c72c16c4b036e491c478c49a - */ - memset(&exp, 0, sizeof(exp)); - cl_git_pass(git_diff_foreach( - diff, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &exp)); - - cl_assert_equal_i(4, exp.files); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_UNMODIFIED]); - cl_assert_equal_i(2, exp.file_status[GIT_DELTA_ADDED]); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_DELETED]); - - /* git diff 31e47d8c1fa36d7f8d537b96158e3f024de0a9f2 \ - * 2bc7f351d20b53f1c72c16c4b036e491c478c49a - * don't use NULL opts to avoid config `diff.renames` contamination - */ - opts.flags = GIT_DIFF_FIND_RENAMES; - cl_git_pass(git_diff_find_similar(diff, &opts)); - - memset(&exp, 0, sizeof(exp)); - cl_git_pass(git_diff_foreach( - diff, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &exp)); - - cl_assert_equal_i(3, exp.files); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_UNMODIFIED]); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_ADDED]); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_RENAMED]); - - git_diff_free(diff); - - cl_git_pass(git_diff_tree_to_tree( - &diff, g_repo, old_tree, new_tree, &diffopts)); - - /* git diff --find-copies-harder \ - * 31e47d8c1fa36d7f8d537b96158e3f024de0a9f2 \ - * 2bc7f351d20b53f1c72c16c4b036e491c478c49a - */ - opts.flags = GIT_DIFF_FIND_COPIES_FROM_UNMODIFIED; - cl_git_pass(git_diff_find_similar(diff, &opts)); - - memset(&exp, 0, sizeof(exp)); - cl_git_pass(git_diff_foreach( - diff, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &exp)); - - cl_assert_equal_i(3, exp.files); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_UNMODIFIED]); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_COPIED]); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_RENAMED]); - - git_diff_free(diff); - - cl_git_pass(git_diff_tree_to_tree( - &diff, g_repo, old_tree, new_tree, &diffopts)); - - /* git diff --find-copies-harder -M100 -B100 \ - * 31e47d8c1fa36d7f8d537b96158e3f024de0a9f2 \ - * 2bc7f351d20b53f1c72c16c4b036e491c478c49a - */ - opts.flags = GIT_DIFF_FIND_COPIES_FROM_UNMODIFIED | - GIT_DIFF_FIND_EXACT_MATCH_ONLY; - cl_git_pass(git_diff_find_similar(diff, &opts)); - - memset(&exp, 0, sizeof(exp)); - cl_git_pass(git_diff_foreach( - diff, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &exp)); - - cl_assert_equal_i(3, exp.files); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_UNMODIFIED]); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_COPIED]); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_RENAMED]); - - git_diff_free(diff); - - git_tree_free(old_tree); - git_tree_free(new_tree); -} - -void test_diff_rename__checks_options_version(void) -{ - const char *old_sha = "31e47d8c1fa36d7f8d537b96158e3f024de0a9f2"; - const char *new_sha = "2bc7f351d20b53f1c72c16c4b036e491c478c49a"; - git_tree *old_tree, *new_tree; - git_diff *diff; - git_diff_options diffopts = GIT_DIFF_OPTIONS_INIT; - git_diff_find_options opts = GIT_DIFF_FIND_OPTIONS_INIT; - const git_error *err; - - old_tree = resolve_commit_oid_to_tree(g_repo, old_sha); - new_tree = resolve_commit_oid_to_tree(g_repo, new_sha); - diffopts.flags |= GIT_DIFF_INCLUDE_UNMODIFIED; - cl_git_pass(git_diff_tree_to_tree( - &diff, g_repo, old_tree, new_tree, &diffopts)); - - opts.version = 0; - cl_git_fail(git_diff_find_similar(diff, &opts)); - err = giterr_last(); - cl_assert_equal_i(GITERR_INVALID, err->klass); - - giterr_clear(); - opts.version = 1024; - cl_git_fail(git_diff_find_similar(diff, &opts)); - err = giterr_last(); - cl_assert_equal_i(GITERR_INVALID, err->klass); - - git_diff_free(diff); - git_tree_free(old_tree); - git_tree_free(new_tree); -} - -void test_diff_rename__not_exact_match(void) -{ - const char *sha0 = "2bc7f351d20b53f1c72c16c4b036e491c478c49a"; - const char *sha1 = "1c068dee5790ef1580cfc4cd670915b48d790084"; - const char *sha2 = "19dd32dfb1520a64e5bbaae8dce6ef423dfa2f13"; - git_tree *old_tree, *new_tree; - git_diff *diff; - git_diff_options diffopts = GIT_DIFF_OPTIONS_INIT; - git_diff_find_options opts = GIT_DIFF_FIND_OPTIONS_INIT; - diff_expects exp; - - /* == Changes ===================================================== - * songofseven.txt -> songofseven.txt (major rewrite, <20% match - split) - * sixserving.txt -> sixserving.txt (indentation change) - * sixserving.txt -> ikeepsix.txt (copy, add title, >80% match) - * sevencities.txt (no change) - */ - - old_tree = resolve_commit_oid_to_tree(g_repo, sha0); - new_tree = resolve_commit_oid_to_tree(g_repo, sha1); - - /* Must pass GIT_DIFF_INCLUDE_UNMODIFIED if you expect to emulate - * --find-copies-harder during rename transformion... - */ - diffopts.flags |= GIT_DIFF_INCLUDE_UNMODIFIED; - - cl_git_pass(git_diff_tree_to_tree( - &diff, g_repo, old_tree, new_tree, &diffopts)); - - /* git diff --no-renames \ - * 2bc7f351d20b53f1c72c16c4b036e491c478c49a \ - * 1c068dee5790ef1580cfc4cd670915b48d790084 - */ - memset(&exp, 0, sizeof(exp)); - cl_git_pass(git_diff_foreach( - diff, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &exp)); - - cl_assert_equal_i(4, exp.files); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_UNMODIFIED]); - cl_assert_equal_i(2, exp.file_status[GIT_DELTA_MODIFIED]); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_ADDED]); - - /* git diff -M 2bc7f351d20b53f1c72c16c4b036e491c478c49a \ - * 1c068dee5790ef1580cfc4cd670915b48d790084 - * - * must not pass NULL for opts because it will pick up environment - * values for "diff.renames" and test won't be consistent. - */ - opts.flags = GIT_DIFF_FIND_RENAMES; - cl_git_pass(git_diff_find_similar(diff, &opts)); - - memset(&exp, 0, sizeof(exp)); - cl_git_pass(git_diff_foreach( - diff, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &exp)); - - cl_assert_equal_i(4, exp.files); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_UNMODIFIED]); - cl_assert_equal_i(2, exp.file_status[GIT_DELTA_MODIFIED]); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_ADDED]); - - git_diff_free(diff); - - /* git diff -M -C \ - * 2bc7f351d20b53f1c72c16c4b036e491c478c49a \ - * 1c068dee5790ef1580cfc4cd670915b48d790084 - */ - cl_git_pass(git_diff_tree_to_tree( - &diff, g_repo, old_tree, new_tree, &diffopts)); - - opts.flags = GIT_DIFF_FIND_RENAMES | GIT_DIFF_FIND_COPIES; - cl_git_pass(git_diff_find_similar(diff, &opts)); - - memset(&exp, 0, sizeof(exp)); - cl_git_pass(git_diff_foreach( - diff, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &exp)); - - cl_assert_equal_i(4, exp.files); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_UNMODIFIED]); - cl_assert_equal_i(2, exp.file_status[GIT_DELTA_MODIFIED]); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_COPIED]); - - git_diff_free(diff); - - /* git diff -M -C --find-copies-harder --break-rewrites \ - * 2bc7f351d20b53f1c72c16c4b036e491c478c49a \ - * 1c068dee5790ef1580cfc4cd670915b48d790084 - */ - cl_git_pass(git_diff_tree_to_tree( - &diff, g_repo, old_tree, new_tree, &diffopts)); - - opts.flags = GIT_DIFF_FIND_ALL; - opts.break_rewrite_threshold = 70; - - cl_git_pass(git_diff_find_similar(diff, &opts)); - - memset(&exp, 0, sizeof(exp)); - cl_git_pass(git_diff_foreach( - diff, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &exp)); - - cl_assert_equal_i(5, exp.files); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_UNMODIFIED]); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_MODIFIED]); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_ADDED]); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_DELETED]); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_COPIED]); - - git_diff_free(diff); - - /* == Changes ===================================================== - * songofseven.txt -> untimely.txt (rename, convert to crlf) - * ikeepsix.txt -> ikeepsix.txt (reorder sections in file) - * sixserving.txt -> sixserving.txt (whitespace - not just indent) - * sevencities.txt -> songof7cities.txt (rename, small text changes) - */ - - git_tree_free(old_tree); - old_tree = new_tree; - new_tree = resolve_commit_oid_to_tree(g_repo, sha2); - - cl_git_pass(git_diff_tree_to_tree( - &diff, g_repo, old_tree, new_tree, &diffopts)); - - /* git diff --no-renames \ - * 1c068dee5790ef1580cfc4cd670915b48d790084 \ - * 19dd32dfb1520a64e5bbaae8dce6ef423dfa2f13 - */ - memset(&exp, 0, sizeof(exp)); - cl_git_pass(git_diff_foreach( - diff, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &exp)); - - cl_assert_equal_i(6, exp.files); - cl_assert_equal_i(2, exp.file_status[GIT_DELTA_MODIFIED]); - cl_assert_equal_i(2, exp.file_status[GIT_DELTA_ADDED]); - cl_assert_equal_i(2, exp.file_status[GIT_DELTA_DELETED]); - git_diff_free(diff); - - /* git diff -M -C \ - * 1c068dee5790ef1580cfc4cd670915b48d790084 \ - * 19dd32dfb1520a64e5bbaae8dce6ef423dfa2f13 - */ - cl_git_pass(git_diff_tree_to_tree( - &diff, g_repo, old_tree, new_tree, &diffopts)); - - opts.flags = GIT_DIFF_FIND_RENAMES | GIT_DIFF_FIND_COPIES; - cl_git_pass(git_diff_find_similar(diff, &opts)); - - memset(&exp, 0, sizeof(exp)); - cl_git_pass(git_diff_foreach( - diff, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &exp)); - - cl_assert_equal_i(4, exp.files); - cl_assert_equal_i(2, exp.file_status[GIT_DELTA_MODIFIED]); - cl_assert_equal_i(2, exp.file_status[GIT_DELTA_RENAMED]); - - git_diff_free(diff); - - /* git diff -M -C --find-copies-harder --break-rewrites \ - * 1c068dee5790ef1580cfc4cd670915b48d790084 \ - * 19dd32dfb1520a64e5bbaae8dce6ef423dfa2f13 - * with libgit2 default similarity comparison... - */ - cl_git_pass(git_diff_tree_to_tree( - &diff, g_repo, old_tree, new_tree, &diffopts)); - - opts.flags = GIT_DIFF_FIND_ALL; - cl_git_pass(git_diff_find_similar(diff, &opts)); - - /* the default match algorithm is going to find the internal - * whitespace differences in the lines of sixserving.txt to be - * significant enough that this will decide to split it into an ADD - * and a DELETE - */ - - memset(&exp, 0, sizeof(exp)); - cl_git_pass(git_diff_foreach( - diff, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &exp)); - - cl_assert_equal_i(5, exp.files); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_MODIFIED]); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_ADDED]); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_DELETED]); - cl_assert_equal_i(2, exp.file_status[GIT_DELTA_RENAMED]); - - git_diff_free(diff); - - /* git diff -M -C --find-copies-harder --break-rewrites \ - * 1c068dee5790ef1580cfc4cd670915b48d790084 \ - * 19dd32dfb1520a64e5bbaae8dce6ef423dfa2f13 - * with ignore_space whitespace comparision - */ - cl_git_pass(git_diff_tree_to_tree( - &diff, g_repo, old_tree, new_tree, &diffopts)); - - opts.flags = GIT_DIFF_FIND_ALL | GIT_DIFF_FIND_IGNORE_WHITESPACE; - cl_git_pass(git_diff_find_similar(diff, &opts)); - - /* Ignoring whitespace, this should no longer split sixserver.txt */ - - memset(&exp, 0, sizeof(exp)); - cl_git_pass(git_diff_foreach( - diff, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &exp)); - - cl_assert_equal_i(4, exp.files); - cl_assert_equal_i(2, exp.file_status[GIT_DELTA_MODIFIED]); - cl_assert_equal_i(2, exp.file_status[GIT_DELTA_RENAMED]); - - git_diff_free(diff); - - git_tree_free(old_tree); - git_tree_free(new_tree); -} - -void test_diff_rename__test_small_files(void) -{ - git_index *index; - git_reference *head_reference; - git_commit *head_commit; - git_tree *head_tree; - git_tree *commit_tree; - git_signature *signature; - git_diff *diff; - git_oid oid; - const git_diff_delta *delta; - git_diff_options diff_options = GIT_DIFF_OPTIONS_INIT; - git_diff_find_options find_options = GIT_DIFF_FIND_OPTIONS_INIT; - - cl_git_pass(git_repository_index(&index, g_repo)); - - cl_git_mkfile("renames/small.txt", "Hello World!\n"); - cl_git_pass(git_index_add_bypath(index, "small.txt")); - - cl_git_pass(git_repository_head(&head_reference, g_repo)); - cl_git_pass(git_reference_peel((git_object**)&head_commit, head_reference, GIT_OBJ_COMMIT)); - cl_git_pass(git_commit_tree(&head_tree, head_commit)); - cl_git_pass(git_index_write_tree(&oid, index)); - cl_git_pass(git_tree_lookup(&commit_tree, g_repo, &oid)); - cl_git_pass(git_signature_new(&signature, "Rename", "rename@example.com", 1404157834, 0)); - cl_git_pass(git_commit_create(&oid, g_repo, "HEAD", signature, signature, NULL, "Test commit", commit_tree, 1, (const git_commit**)&head_commit)); - - cl_git_mkfile("renames/copy.txt", "Hello World!\n"); - cl_git_rmfile("renames/small.txt"); - - diff_options.flags = GIT_DIFF_INCLUDE_UNTRACKED; - cl_git_pass(git_diff_tree_to_workdir(&diff, g_repo, commit_tree, &diff_options)); - find_options.flags = GIT_DIFF_FIND_RENAMES | GIT_DIFF_FIND_FOR_UNTRACKED; - cl_git_pass(git_diff_find_similar(diff, &find_options)); - - cl_assert_equal_i(git_diff_num_deltas(diff), 1); - delta = git_diff_get_delta(diff, 0); - cl_assert_equal_i(delta->status, GIT_DELTA_RENAMED); - cl_assert_equal_s(delta->old_file.path, "small.txt"); - cl_assert_equal_s(delta->new_file.path, "copy.txt"); - - git_diff_free(diff); - git_signature_free(signature); - git_tree_free(commit_tree); - git_tree_free(head_tree); - git_commit_free(head_commit); - git_reference_free(head_reference); - git_index_free(index); -} - -void test_diff_rename__working_directory_changes(void) -{ - const char *sha0 = "2bc7f351d20b53f1c72c16c4b036e491c478c49a"; - const char *blobsha = "66311f5cfbe7836c27510a3ba2f43e282e2c8bba"; - git_oid id; - git_tree *tree; - git_blob *blob; - git_diff *diff; - git_diff_options diffopts = GIT_DIFF_OPTIONS_INIT; - git_diff_find_options opts = GIT_DIFF_FIND_OPTIONS_INIT; - diff_expects exp; - git_buf old_content = GIT_BUF_INIT, content = GIT_BUF_INIT;; - - tree = resolve_commit_oid_to_tree(g_repo, sha0); - diffopts.flags |= GIT_DIFF_INCLUDE_UNMODIFIED | GIT_DIFF_INCLUDE_UNTRACKED; - - /* - $ git cat-file -p 2bc7f351d20b53f1c72c16c4b036e491c478c49a^{tree} - - 100644 blob 66311f5cfbe7836c27510a3ba2f43e282e2c8bba sevencities.txt - 100644 blob ad0a8e55a104ac54a8a29ed4b84b49e76837a113 sixserving.txt - 100644 blob 66311f5cfbe7836c27510a3ba2f43e282e2c8bba songofseven.txt - - $ for f in *.txt; do - echo `git hash-object -t blob $f` $f - done - - eaf4a3e3bfe68585e90cada20736ace491cd100b ikeepsix.txt - f90d4fc20ecddf21eebe6a37e9225d244339d2b5 sixserving.txt - 4210ffd5c390b21dd5483375e75288dea9ede512 songof7cities.txt - 9a69d960ae94b060f56c2a8702545e2bb1abb935 untimely.txt - */ - - cl_git_pass(git_diff_tree_to_workdir(&diff, g_repo, tree, &diffopts)); - - /* git diff --no-renames 2bc7f351d20b53f1c72c16c4b036e491c478c49a */ - memset(&exp, 0, sizeof(exp)); - cl_git_pass(git_diff_foreach( - diff, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &exp)); - - cl_assert_equal_i(6, exp.files); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_MODIFIED]); - cl_assert_equal_i(2, exp.file_status[GIT_DELTA_DELETED]); - cl_assert_equal_i(3, exp.file_status[GIT_DELTA_UNTRACKED]); - - /* git diff -M 2bc7f351d20b53f1c72c16c4b036e491c478c49a */ - opts.flags = GIT_DIFF_FIND_ALL; - cl_git_pass(git_diff_find_similar(diff, &opts)); - - memset(&exp, 0, sizeof(exp)); - cl_git_pass(git_diff_foreach( - diff, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &exp)); - - cl_assert_equal_i(5, exp.files); - cl_assert_equal_i(2, exp.file_status[GIT_DELTA_RENAMED]); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_DELETED]); - cl_assert_equal_i(2, exp.file_status[GIT_DELTA_UNTRACKED]); - - git_diff_free(diff); - - /* rewrite files in the working directory with / without CRLF changes */ - - cl_git_pass( - git_futils_readbuffer(&old_content, "renames/songof7cities.txt")); - cl_git_pass( - git_buf_text_lf_to_crlf(&content, &old_content)); - cl_git_pass( - git_futils_writebuffer(&content, "renames/songof7cities.txt", 0, 0)); - - cl_git_pass(git_diff_tree_to_workdir(&diff, g_repo, tree, &diffopts)); - - /* git diff -M 2bc7f351d20b53f1c72c16c4b036e491c478c49a */ - opts.flags = GIT_DIFF_FIND_ALL; - cl_git_pass(git_diff_find_similar(diff, &opts)); - - memset(&exp, 0, sizeof(exp)); - cl_git_pass(git_diff_foreach( - diff, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &exp)); - - cl_assert_equal_i(5, exp.files); - cl_assert_equal_i(2, exp.file_status[GIT_DELTA_RENAMED]); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_DELETED]); - cl_assert_equal_i(2, exp.file_status[GIT_DELTA_UNTRACKED]); - - git_diff_free(diff); - - /* try a different whitespace option */ - - cl_git_pass(git_diff_tree_to_workdir(&diff, g_repo, tree, &diffopts)); - - opts.flags = GIT_DIFF_FIND_ALL | GIT_DIFF_FIND_DONT_IGNORE_WHITESPACE; - opts.rename_threshold = 70; - cl_git_pass(git_diff_find_similar(diff, &opts)); - - memset(&exp, 0, sizeof(exp)); - cl_git_pass(git_diff_foreach( - diff, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &exp)); - - cl_assert_equal_i(6, exp.files); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_RENAMED]); - cl_assert_equal_i(2, exp.file_status[GIT_DELTA_DELETED]); - cl_assert_equal_i(3, exp.file_status[GIT_DELTA_UNTRACKED]); - - git_diff_free(diff); - - /* try a different matching option */ - - cl_git_pass(git_diff_tree_to_workdir(&diff, g_repo, tree, &diffopts)); - - opts.flags = GIT_DIFF_FIND_ALL | GIT_DIFF_FIND_EXACT_MATCH_ONLY; - cl_git_pass(git_diff_find_similar(diff, &opts)); - - memset(&exp, 0, sizeof(exp)); - cl_git_pass(git_diff_foreach( - diff, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &exp)); - - cl_assert_equal_i(6, exp.files); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_MODIFIED]); - cl_assert_equal_i(3, exp.file_status[GIT_DELTA_UNTRACKED]); - cl_assert_equal_i(2, exp.file_status[GIT_DELTA_DELETED]); - - git_diff_free(diff); - - /* again with exact match blob */ - - cl_git_pass(git_oid_fromstr(&id, blobsha)); - cl_git_pass(git_blob_lookup(&blob, g_repo, &id)); - cl_git_pass(git_buf_set( - &content, git_blob_rawcontent(blob), (size_t)git_blob_rawsize(blob))); - cl_git_rewritefile("renames/songof7cities.txt", content.ptr); - git_blob_free(blob); - - cl_git_pass(git_diff_tree_to_workdir(&diff, g_repo, tree, &diffopts)); - - opts.flags = GIT_DIFF_FIND_ALL | GIT_DIFF_FIND_EXACT_MATCH_ONLY; - cl_git_pass(git_diff_find_similar(diff, &opts)); - - /* - fprintf(stderr, "\n\n"); - diff_print_raw(stderr, diff); - */ - - memset(&exp, 0, sizeof(exp)); - cl_git_pass(git_diff_foreach( - diff, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &exp)); - - cl_assert_equal_i(5, exp.files); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_MODIFIED]); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_DELETED]); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_RENAMED]); - cl_assert_equal_i(2, exp.file_status[GIT_DELTA_UNTRACKED]); - - git_diff_free(diff); - - git_tree_free(tree); - git_buf_free(&content); - git_buf_free(&old_content); -} - -void test_diff_rename__patch(void) -{ - const char *sha0 = "2bc7f351d20b53f1c72c16c4b036e491c478c49a"; - const char *sha1 = "1c068dee5790ef1580cfc4cd670915b48d790084"; - git_tree *old_tree, *new_tree; - git_diff *diff; - git_diff_options diffopts = GIT_DIFF_OPTIONS_INIT; - git_diff_find_options opts = GIT_DIFF_FIND_OPTIONS_INIT; - git_patch *patch; - const git_diff_delta *delta; - git_buf buf = GIT_BUF_INIT; - const char *expected = "diff --git a/sixserving.txt b/ikeepsix.txt\nindex ad0a8e5..36020db 100644\n--- a/sixserving.txt\n+++ b/ikeepsix.txt\n@@ -1,3 +1,6 @@\n+I Keep Six Honest Serving-Men\n+=============================\n+\n I KEEP six honest serving-men\n (They taught me all I knew);\n Their names are What and Why and When\n@@ -21,4 +24,4 @@ She sends'em abroad on her own affairs,\n One million Hows, two million Wheres,\n And seven million Whys!\n \n- -- Rudyard Kipling\n+ -- Rudyard Kipling\n"; - - old_tree = resolve_commit_oid_to_tree(g_repo, sha0); - new_tree = resolve_commit_oid_to_tree(g_repo, sha1); - - diffopts.flags |= GIT_DIFF_INCLUDE_UNMODIFIED; - cl_git_pass(git_diff_tree_to_tree( - &diff, g_repo, old_tree, new_tree, &diffopts)); - - opts.flags = GIT_DIFF_FIND_RENAMES | GIT_DIFF_FIND_COPIES; - cl_git_pass(git_diff_find_similar(diff, &opts)); - - /* == Changes ===================================================== - * sixserving.txt -> ikeepsix.txt (copy, add title, >80% match) - * sevencities.txt (no change) - * sixserving.txt -> sixserving.txt (indentation change) - * songofseven.txt -> songofseven.txt (major rewrite, <20% match - split) - */ - - cl_assert_equal_i(4, (int)git_diff_num_deltas(diff)); - - cl_git_pass(git_patch_from_diff(&patch, diff, 0)); - cl_assert((delta = git_patch_get_delta(patch)) != NULL); - cl_assert_equal_i(GIT_DELTA_COPIED, (int)delta->status); - - cl_git_pass(git_patch_to_buf(&buf, patch)); - cl_assert_equal_s(expected, buf.ptr); - git_buf_free(&buf); - - git_patch_free(patch); - - cl_assert((delta = git_diff_get_delta(diff, 1)) != NULL); - cl_assert_equal_i(GIT_DELTA_UNMODIFIED, (int)delta->status); - - cl_assert((delta = git_diff_get_delta(diff, 2)) != NULL); - cl_assert_equal_i(GIT_DELTA_MODIFIED, (int)delta->status); - - cl_assert((delta = git_diff_get_delta(diff, 3)) != NULL); - cl_assert_equal_i(GIT_DELTA_MODIFIED, (int)delta->status); - - git_diff_free(diff); - git_tree_free(old_tree); - git_tree_free(new_tree); -} - -void test_diff_rename__file_exchange(void) -{ - git_buf c1 = GIT_BUF_INIT, c2 = GIT_BUF_INIT; - git_index *index; - git_tree *tree; - git_diff *diff; - git_diff_options diffopts = GIT_DIFF_OPTIONS_INIT; - git_diff_find_options opts = GIT_DIFF_FIND_OPTIONS_INIT; - diff_expects exp; - - cl_git_pass(git_futils_readbuffer(&c1, "renames/untimely.txt")); - cl_git_pass(git_futils_readbuffer(&c2, "renames/songof7cities.txt")); - cl_git_pass(git_futils_writebuffer(&c1, "renames/songof7cities.txt", 0, 0)); - cl_git_pass(git_futils_writebuffer(&c2, "renames/untimely.txt", 0, 0)); - - cl_git_pass( - git_revparse_single((git_object **)&tree, g_repo, "HEAD^{tree}")); - - cl_git_pass(git_repository_index(&index, g_repo)); - cl_git_pass(git_index_read_tree(index, tree)); - cl_git_pass(git_index_add_bypath(index, "songof7cities.txt")); - cl_git_pass(git_index_add_bypath(index, "untimely.txt")); - - cl_git_pass(git_diff_tree_to_index(&diff, g_repo, tree, index, &diffopts)); - - memset(&exp, 0, sizeof(exp)); - cl_git_pass(git_diff_foreach( - diff, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &exp)); - cl_assert_equal_i(2, exp.files); - cl_assert_equal_i(2, exp.file_status[GIT_DELTA_MODIFIED]); - - opts.flags = GIT_DIFF_FIND_ALL; - cl_git_pass(git_diff_find_similar(diff, &opts)); - - memset(&exp, 0, sizeof(exp)); - cl_git_pass(git_diff_foreach( - diff, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &exp)); - cl_assert_equal_i(2, exp.files); - cl_assert_equal_i(2, exp.file_status[GIT_DELTA_RENAMED]); - - git_diff_free(diff); - git_tree_free(tree); - git_index_free(index); - - git_buf_free(&c1); - git_buf_free(&c2); -} - -void test_diff_rename__file_exchange_three(void) -{ - git_buf c1 = GIT_BUF_INIT, c2 = GIT_BUF_INIT, c3 = GIT_BUF_INIT; - git_index *index; - git_tree *tree; - git_diff *diff; - git_diff_options diffopts = GIT_DIFF_OPTIONS_INIT; - git_diff_find_options opts = GIT_DIFF_FIND_OPTIONS_INIT; - diff_expects exp; - - cl_git_pass(git_futils_readbuffer(&c1, "renames/untimely.txt")); - cl_git_pass(git_futils_readbuffer(&c2, "renames/songof7cities.txt")); - cl_git_pass(git_futils_readbuffer(&c3, "renames/ikeepsix.txt")); - - cl_git_pass(git_futils_writebuffer(&c1, "renames/ikeepsix.txt", 0, 0)); - cl_git_pass(git_futils_writebuffer(&c2, "renames/untimely.txt", 0, 0)); - cl_git_pass(git_futils_writebuffer(&c3, "renames/songof7cities.txt", 0, 0)); - - cl_git_pass( - git_revparse_single((git_object **)&tree, g_repo, "HEAD^{tree}")); - - cl_git_pass(git_repository_index(&index, g_repo)); - cl_git_pass(git_index_read_tree(index, tree)); - cl_git_pass(git_index_add_bypath(index, "songof7cities.txt")); - cl_git_pass(git_index_add_bypath(index, "untimely.txt")); - cl_git_pass(git_index_add_bypath(index, "ikeepsix.txt")); - - cl_git_pass(git_diff_tree_to_index(&diff, g_repo, tree, index, &diffopts)); - - memset(&exp, 0, sizeof(exp)); - cl_git_pass(git_diff_foreach( - diff, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &exp)); - cl_assert_equal_i(3, exp.files); - cl_assert_equal_i(3, exp.file_status[GIT_DELTA_MODIFIED]); - - opts.flags = GIT_DIFF_FIND_ALL; - cl_git_pass(git_diff_find_similar(diff, &opts)); - - memset(&exp, 0, sizeof(exp)); - cl_git_pass(git_diff_foreach( - diff, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &exp)); - cl_assert_equal_i(3, exp.files); - cl_assert_equal_i(3, exp.file_status[GIT_DELTA_RENAMED]); - - git_diff_free(diff); - git_tree_free(tree); - git_index_free(index); - - git_buf_free(&c1); - git_buf_free(&c2); - git_buf_free(&c3); -} - -void test_diff_rename__file_partial_exchange(void) -{ - git_buf c1 = GIT_BUF_INIT, c2 = GIT_BUF_INIT; - git_index *index; - git_tree *tree; - git_diff *diff; - git_diff_options diffopts = GIT_DIFF_OPTIONS_INIT; - git_diff_find_options opts = GIT_DIFF_FIND_OPTIONS_INIT; - diff_expects exp; - int i; - - cl_git_pass(git_futils_readbuffer(&c1, "renames/untimely.txt")); - cl_git_pass(git_futils_writebuffer(&c1, "renames/songof7cities.txt", 0, 0)); - for (i = 0; i < 100; ++i) - cl_git_pass(git_buf_puts(&c2, "this is not the content you are looking for\n")); - cl_git_pass(git_futils_writebuffer(&c2, "renames/untimely.txt", 0, 0)); - - cl_git_pass( - git_revparse_single((git_object **)&tree, g_repo, "HEAD^{tree}")); - - cl_git_pass(git_repository_index(&index, g_repo)); - cl_git_pass(git_index_read_tree(index, tree)); - cl_git_pass(git_index_add_bypath(index, "songof7cities.txt")); - cl_git_pass(git_index_add_bypath(index, "untimely.txt")); - - cl_git_pass(git_diff_tree_to_index(&diff, g_repo, tree, index, &diffopts)); - - memset(&exp, 0, sizeof(exp)); - cl_git_pass(git_diff_foreach( - diff, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &exp)); - cl_assert_equal_i(2, exp.files); - cl_assert_equal_i(2, exp.file_status[GIT_DELTA_MODIFIED]); - - opts.flags = GIT_DIFF_FIND_ALL; - cl_git_pass(git_diff_find_similar(diff, &opts)); - - memset(&exp, 0, sizeof(exp)); - cl_git_pass(git_diff_foreach( - diff, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &exp)); - cl_assert_equal_i(3, exp.files); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_RENAMED]); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_ADDED]); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_DELETED]); - - git_diff_free(diff); - git_tree_free(tree); - git_index_free(index); - - git_buf_free(&c1); - git_buf_free(&c2); -} - -void test_diff_rename__rename_and_copy_from_same_source(void) -{ - git_buf c1 = GIT_BUF_INIT, c2 = GIT_BUF_INIT; - git_index *index; - git_tree *tree; - git_diff *diff; - git_diff_options diffopts = GIT_DIFF_OPTIONS_INIT; - git_diff_find_options opts = GIT_DIFF_FIND_OPTIONS_INIT; - diff_expects exp; - - /* put the first 2/3 of file into one new place - * and the second 2/3 of file into another new place - */ - cl_git_pass(git_futils_readbuffer(&c1, "renames/songof7cities.txt")); - cl_git_pass(git_buf_set(&c2, c1.ptr, c1.size)); - git_buf_truncate(&c1, c1.size * 2 / 3); - git_buf_consume(&c2, ((char *)c2.ptr) + (c2.size / 3)); - cl_git_pass(git_futils_writebuffer(&c1, "renames/song_a.txt", 0, 0)); - cl_git_pass(git_futils_writebuffer(&c2, "renames/song_b.txt", 0, 0)); - - cl_git_pass( - git_revparse_single((git_object **)&tree, g_repo, "HEAD^{tree}")); - - cl_git_pass(git_repository_index(&index, g_repo)); - cl_git_pass(git_index_read_tree(index, tree)); - cl_git_pass(git_index_add_bypath(index, "song_a.txt")); - cl_git_pass(git_index_add_bypath(index, "song_b.txt")); - - diffopts.flags = GIT_DIFF_INCLUDE_UNMODIFIED; - - cl_git_pass(git_diff_tree_to_index(&diff, g_repo, tree, index, &diffopts)); - - memset(&exp, 0, sizeof(exp)); - cl_git_pass(git_diff_foreach( - diff, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &exp)); - cl_assert_equal_i(6, exp.files); - cl_assert_equal_i(2, exp.file_status[GIT_DELTA_ADDED]); - cl_assert_equal_i(4, exp.file_status[GIT_DELTA_UNMODIFIED]); - - opts.flags = GIT_DIFF_FIND_ALL; - cl_git_pass(git_diff_find_similar(diff, &opts)); - - memset(&exp, 0, sizeof(exp)); - cl_git_pass(git_diff_foreach( - diff, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &exp)); - cl_assert_equal_i(6, exp.files); - cl_assert_equal_i(2, exp.file_status[GIT_DELTA_COPIED]); - cl_assert_equal_i(4, exp.file_status[GIT_DELTA_UNMODIFIED]); - - git_diff_free(diff); - git_tree_free(tree); - git_index_free(index); - - git_buf_free(&c1); - git_buf_free(&c2); -} - -void test_diff_rename__from_deleted_to_split(void) -{ - git_buf c1 = GIT_BUF_INIT; - git_index *index; - git_tree *tree; - git_diff *diff; - git_diff_options diffopts = GIT_DIFF_OPTIONS_INIT; - git_diff_find_options opts = GIT_DIFF_FIND_OPTIONS_INIT; - diff_expects exp; - - /* old file is missing, new file is actually old file renamed */ - - cl_git_pass(git_futils_readbuffer(&c1, "renames/songof7cities.txt")); - cl_git_pass(git_futils_writebuffer(&c1, "renames/untimely.txt", 0, 0)); - - cl_git_pass( - git_revparse_single((git_object **)&tree, g_repo, "HEAD^{tree}")); - - cl_git_pass(git_repository_index(&index, g_repo)); - cl_git_pass(git_index_read_tree(index, tree)); - cl_git_pass(git_index_remove_bypath(index, "songof7cities.txt")); - cl_git_pass(git_index_add_bypath(index, "untimely.txt")); - - diffopts.flags = GIT_DIFF_INCLUDE_UNMODIFIED; - - cl_git_pass(git_diff_tree_to_index(&diff, g_repo, tree, index, &diffopts)); - - memset(&exp, 0, sizeof(exp)); - cl_git_pass(git_diff_foreach( - diff, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &exp)); - cl_assert_equal_i(4, exp.files); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_DELETED]); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_MODIFIED]); - cl_assert_equal_i(2, exp.file_status[GIT_DELTA_UNMODIFIED]); - - opts.flags = GIT_DIFF_FIND_ALL; - cl_git_pass(git_diff_find_similar(diff, &opts)); - - memset(&exp, 0, sizeof(exp)); - cl_git_pass(git_diff_foreach( - diff, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &exp)); - cl_assert_equal_i(4, exp.files); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_DELETED]); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_RENAMED]); - cl_assert_equal_i(2, exp.file_status[GIT_DELTA_UNMODIFIED]); - - git_diff_free(diff); - git_tree_free(tree); - git_index_free(index); - - git_buf_free(&c1); -} - -struct rename_expected -{ - size_t len; - - unsigned int *status; - const char **sources; - const char **targets; - - size_t idx; -}; - -int test_names_expected(const git_diff_delta *delta, float progress, void *p) -{ - struct rename_expected *expected = p; - - GIT_UNUSED(progress); - - cl_assert(expected->idx < expected->len); - - cl_assert_equal_i(delta->status, expected->status[expected->idx]); - - cl_assert(git__strcmp(expected->sources[expected->idx], - delta->old_file.path) == 0); - cl_assert(git__strcmp(expected->targets[expected->idx], - delta->new_file.path) == 0); - - expected->idx++; - - return 0; -} - -void test_diff_rename__rejected_match_can_match_others(void) -{ - git_reference *head, *selfsimilar; - git_index *index; - git_tree *tree; - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - git_diff *diff; - git_diff_options diffopts = GIT_DIFF_OPTIONS_INIT; - git_diff_find_options findopts = GIT_DIFF_FIND_OPTIONS_INIT; - git_buf one = GIT_BUF_INIT, two = GIT_BUF_INIT; - unsigned int status[] = { GIT_DELTA_RENAMED, GIT_DELTA_RENAMED }; - const char *sources[] = { "Class1.cs", "Class2.cs" }; - const char *targets[] = { "ClassA.cs", "ClassB.cs" }; - struct rename_expected expect = { 2, status, sources, targets }; - char *ptr; - - opts.checkout_strategy = GIT_CHECKOUT_FORCE; - findopts.flags = GIT_DIFF_FIND_RENAMES; - - cl_git_pass(git_reference_lookup(&head, g_repo, "HEAD")); - cl_git_pass(git_reference_symbolic_set_target( - &selfsimilar, head, "refs/heads/renames_similar", NULL)); - cl_git_pass(git_checkout_head(g_repo, &opts)); - cl_git_pass(git_repository_index(&index, g_repo)); - - cl_git_pass(git_futils_readbuffer(&one, "renames/Class1.cs")); - cl_git_pass(git_futils_readbuffer(&two, "renames/Class2.cs")); - - cl_git_pass(p_unlink("renames/Class1.cs")); - cl_git_pass(p_unlink("renames/Class2.cs")); - - cl_git_pass(git_index_remove_bypath(index, "Class1.cs")); - cl_git_pass(git_index_remove_bypath(index, "Class2.cs")); - - cl_assert(ptr = strstr(one.ptr, "Class1")); - ptr[5] = 'A'; - - cl_assert(ptr = strstr(two.ptr, "Class2")); - ptr[5] = 'B'; - - cl_git_pass( - git_futils_writebuffer(&one, "renames/ClassA.cs", O_RDWR|O_CREAT, 0777)); - cl_git_pass( - git_futils_writebuffer(&two, "renames/ClassB.cs", O_RDWR|O_CREAT, 0777)); - - cl_git_pass(git_index_add_bypath(index, "ClassA.cs")); - cl_git_pass(git_index_add_bypath(index, "ClassB.cs")); - - cl_git_pass(git_index_write(index)); - - cl_git_pass( - git_revparse_single((git_object **)&tree, g_repo, "HEAD^{tree}")); - - cl_git_pass( - git_diff_tree_to_index(&diff, g_repo, tree, index, &diffopts)); - - cl_git_pass(git_diff_find_similar(diff, &findopts)); - - cl_git_pass(git_diff_foreach( - diff, test_names_expected, NULL, NULL, NULL, &expect)); - - git_diff_free(diff); - git_tree_free(tree); - git_index_free(index); - git_reference_free(head); - git_reference_free(selfsimilar); - git_buf_free(&one); - git_buf_free(&two); -} - -static void write_similarity_file_two(const char *filename, size_t b_lines) -{ - git_buf contents = GIT_BUF_INIT; - size_t i; - - for (i = 0; i < b_lines; i++) - git_buf_printf(&contents, "%02d - bbbbb\r\n", (int)(i+1)); - - for (i = b_lines; i < 50; i++) - git_buf_printf(&contents, "%02d - aaaaa%s", (int)(i+1), (i == 49 ? "" : "\r\n")); - - cl_git_pass( - git_futils_writebuffer(&contents, filename, O_RDWR|O_CREAT, 0777)); - - git_buf_free(&contents); -} - -void test_diff_rename__rejected_match_can_match_others_two(void) -{ - git_reference *head, *selfsimilar; - git_index *index; - git_tree *tree; - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - git_diff *diff; - git_diff_options diffopts = GIT_DIFF_OPTIONS_INIT; - git_diff_find_options findopts = GIT_DIFF_FIND_OPTIONS_INIT; - unsigned int status[] = { GIT_DELTA_RENAMED, GIT_DELTA_RENAMED }; - const char *sources[] = { "a.txt", "b.txt" }; - const char *targets[] = { "c.txt", "d.txt" }; - struct rename_expected expect = { 2, status, sources, targets }; - - opts.checkout_strategy = GIT_CHECKOUT_FORCE; - findopts.flags = GIT_DIFF_FIND_RENAMES; - - cl_git_pass(git_reference_lookup(&head, g_repo, "HEAD")); - cl_git_pass(git_reference_symbolic_set_target( - &selfsimilar, head, "refs/heads/renames_similar_two", NULL)); - cl_git_pass(git_checkout_head(g_repo, &opts)); - cl_git_pass(git_repository_index(&index, g_repo)); - - cl_git_pass(p_unlink("renames/a.txt")); - cl_git_pass(p_unlink("renames/b.txt")); - - cl_git_pass(git_index_remove_bypath(index, "a.txt")); - cl_git_pass(git_index_remove_bypath(index, "b.txt")); - - write_similarity_file_two("renames/c.txt", 7); - write_similarity_file_two("renames/d.txt", 8); - - cl_git_pass(git_index_add_bypath(index, "c.txt")); - cl_git_pass(git_index_add_bypath(index, "d.txt")); - - cl_git_pass(git_index_write(index)); - - cl_git_pass( - git_revparse_single((git_object **)&tree, g_repo, "HEAD^{tree}")); - - cl_git_pass( - git_diff_tree_to_index(&diff, g_repo, tree, index, &diffopts)); - - cl_git_pass(git_diff_find_similar(diff, &findopts)); - - cl_git_pass(git_diff_foreach( - diff, test_names_expected, NULL, NULL, NULL, &expect)); - cl_assert(expect.idx > 0); - - git_diff_free(diff); - git_tree_free(tree); - git_index_free(index); - git_reference_free(head); - git_reference_free(selfsimilar); -} - -void test_diff_rename__rejected_match_can_match_others_three(void) -{ - git_reference *head, *selfsimilar; - git_index *index; - git_tree *tree; - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - git_diff *diff; - git_diff_options diffopts = GIT_DIFF_OPTIONS_INIT; - git_diff_find_options findopts = GIT_DIFF_FIND_OPTIONS_INIT; - - /* Both cannot be renames from a.txt */ - unsigned int status[] = { GIT_DELTA_ADDED, GIT_DELTA_RENAMED }; - const char *sources[] = { "0001.txt", "a.txt" }; - const char *targets[] = { "0001.txt", "0002.txt" }; - struct rename_expected expect = { 2, status, sources, targets }; - - opts.checkout_strategy = GIT_CHECKOUT_FORCE; - findopts.flags = GIT_DIFF_FIND_RENAMES; - - cl_git_pass(git_reference_lookup(&head, g_repo, "HEAD")); - cl_git_pass(git_reference_symbolic_set_target( - &selfsimilar, head, "refs/heads/renames_similar_two", NULL)); - cl_git_pass(git_checkout_head(g_repo, &opts)); - cl_git_pass(git_repository_index(&index, g_repo)); - - cl_git_pass(p_unlink("renames/a.txt")); - - cl_git_pass(git_index_remove_bypath(index, "a.txt")); - - write_similarity_file_two("renames/0001.txt", 7); - write_similarity_file_two("renames/0002.txt", 0); - - cl_git_pass(git_index_add_bypath(index, "0001.txt")); - cl_git_pass(git_index_add_bypath(index, "0002.txt")); - - cl_git_pass(git_index_write(index)); - - cl_git_pass( - git_revparse_single((git_object **)&tree, g_repo, "HEAD^{tree}")); - - cl_git_pass( - git_diff_tree_to_index(&diff, g_repo, tree, index, &diffopts)); - - cl_git_pass(git_diff_find_similar(diff, &findopts)); - - cl_git_pass(git_diff_foreach( - diff, test_names_expected, NULL, NULL, NULL, &expect)); - - cl_assert(expect.idx == expect.len); - - git_diff_free(diff); - git_tree_free(tree); - git_index_free(index); - git_reference_free(head); - git_reference_free(selfsimilar); -} - -void test_diff_rename__can_rename_from_rewrite(void) -{ - git_index *index; - git_tree *tree; - git_diff *diff; - git_diff_options diffopts = GIT_DIFF_OPTIONS_INIT; - git_diff_find_options findopts = GIT_DIFF_FIND_OPTIONS_INIT; - - unsigned int status[] = { GIT_DELTA_RENAMED, GIT_DELTA_RENAMED }; - const char *sources[] = { "ikeepsix.txt", "songof7cities.txt" }; - const char *targets[] = { "songof7cities.txt", "this-is-a-rename.txt" }; - struct rename_expected expect = { 2, status, sources, targets }; - - cl_git_pass(git_repository_index(&index, g_repo)); - - cl_git_pass(p_rename("renames/songof7cities.txt", "renames/this-is-a-rename.txt")); - cl_git_pass(p_rename("renames/ikeepsix.txt", "renames/songof7cities.txt")); - - cl_git_pass(git_index_remove_bypath(index, "ikeepsix.txt")); - - cl_git_pass(git_index_add_bypath(index, "songof7cities.txt")); - cl_git_pass(git_index_add_bypath(index, "this-is-a-rename.txt")); - - cl_git_pass(git_index_write(index)); - - cl_git_pass( - git_revparse_single((git_object **)&tree, g_repo, "HEAD^{tree}")); - - cl_git_pass( - git_diff_tree_to_index(&diff, g_repo, tree, index, &diffopts)); - - findopts.flags |= GIT_DIFF_FIND_AND_BREAK_REWRITES | - GIT_DIFF_FIND_REWRITES | - GIT_DIFF_FIND_RENAMES_FROM_REWRITES; - - cl_git_pass(git_diff_find_similar(diff, &findopts)); - - cl_git_pass(git_diff_foreach( - diff, test_names_expected, NULL, NULL, NULL, &expect)); - - cl_assert(expect.idx == expect.len); - - git_diff_free(diff); - git_tree_free(tree); - git_index_free(index); -} - -void test_diff_rename__case_changes_are_split(void) -{ - git_index *index; - git_tree *tree; - git_diff *diff = NULL; - diff_expects exp; - git_diff_find_options opts = GIT_DIFF_FIND_OPTIONS_INIT; - - cl_git_pass(git_repository_index(&index, g_repo)); - - cl_git_pass( - git_revparse_single((git_object **)&tree, g_repo, "HEAD^{tree}")); - - cl_git_pass(p_rename("renames/ikeepsix.txt", "renames/IKEEPSIX.txt")); - - cl_git_pass(git_index_remove_bypath(index, "ikeepsix.txt")); - cl_git_pass(git_index_add_bypath(index, "IKEEPSIX.txt")); - cl_git_pass(git_index_write(index)); - - cl_git_pass(git_diff_tree_to_index(&diff, g_repo, tree, index, NULL)); - - memset(&exp, 0, sizeof(exp)); - cl_git_pass(git_diff_foreach( - diff, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &exp)); - cl_assert_equal_i(2, exp.files); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_DELETED]); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_ADDED]); - - opts.flags = GIT_DIFF_FIND_ALL; - cl_git_pass(git_diff_find_similar(diff, &opts)); - - memset(&exp, 0, sizeof(exp)); - cl_git_pass(git_diff_foreach( - diff, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &exp)); - cl_assert_equal_i(1, exp.files); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_RENAMED]); - - git_diff_free(diff); - git_index_free(index); - git_tree_free(tree); -} - -void test_diff_rename__unmodified_can_be_renamed(void) -{ - git_index *index; - git_tree *tree; - git_diff *diff = NULL; - diff_expects exp; - git_diff_options diffopts = GIT_DIFF_OPTIONS_INIT; - git_diff_find_options opts = GIT_DIFF_FIND_OPTIONS_INIT; - - cl_git_pass(git_repository_index(&index, g_repo)); - cl_git_pass( - git_revparse_single((git_object **)&tree, g_repo, "HEAD^{tree}")); - - cl_git_pass(p_rename("renames/ikeepsix.txt", "renames/ikeepsix2.txt")); - - cl_git_pass(git_index_remove_bypath(index, "ikeepsix.txt")); - cl_git_pass(git_index_add_bypath(index, "ikeepsix2.txt")); - cl_git_pass(git_index_write(index)); - - cl_git_pass(git_diff_tree_to_index(&diff, g_repo, tree, index, &diffopts)); - - memset(&exp, 0, sizeof(exp)); - cl_git_pass(git_diff_foreach( - diff, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &exp)); - cl_assert_equal_i(2, exp.files); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_DELETED]); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_ADDED]); - - opts.flags = GIT_DIFF_FIND_ALL; - cl_git_pass(git_diff_find_similar(diff, &opts)); - - memset(&exp, 0, sizeof(exp)); - cl_git_pass(git_diff_foreach( - diff, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &exp)); - cl_assert_equal_i(1, exp.files); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_RENAMED]); - - memset(&exp, 0, sizeof(exp)); - cl_git_pass(git_diff_foreach( - diff, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &exp)); - cl_assert_equal_i(1, exp.files); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_RENAMED]); - - git_diff_free(diff); - git_index_free(index); - git_tree_free(tree); -} - -void test_diff_rename__rewrite_on_single_file(void) -{ - git_index *index; - git_diff *diff = NULL; - diff_expects exp; - git_diff_options diffopts = GIT_DIFF_OPTIONS_INIT; - git_diff_find_options findopts = GIT_DIFF_FIND_OPTIONS_INIT; - - diffopts.flags = GIT_DIFF_INCLUDE_UNTRACKED; - - findopts.flags = GIT_DIFF_FIND_FOR_UNTRACKED | - GIT_DIFF_FIND_AND_BREAK_REWRITES | - GIT_DIFF_FIND_RENAMES_FROM_REWRITES; - - cl_git_pass(git_repository_index(&index, g_repo)); - - cl_git_rewritefile("renames/ikeepsix.txt", - "This is enough content for the file to be rewritten.\n" \ - "This is enough content for the file to be rewritten.\n" \ - "This is enough content for the file to be rewritten.\n" \ - "This is enough content for the file to be rewritten.\n" \ - "This is enough content for the file to be rewritten.\n" \ - "This is enough content for the file to be rewritten.\n" \ - "This is enough content for the file to be rewritten.\n" \ - "This is enough content for the file to be rewritten.\n" \ - "This is enough content for the file to be rewritten.\n" \ - "This is enough content for the file to be rewritten.\n" \ - "This is enough content for the file to be rewritten.\n" \ - "This is enough content for the file to be rewritten.\n" \ - "This is enough content for the file to be rewritten.\n" \ - "This is enough content for the file to be rewritten.\n" \ - "This is enough content for the file to be rewritten.\n" \ - "This is enough content for the file to be rewritten.\n"); - - cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, index, &diffopts)); - cl_git_pass(git_diff_find_similar(diff, &findopts)); - - memset(&exp, 0, sizeof(exp)); - - cl_git_pass(git_diff_foreach( - diff, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &exp)); - cl_assert_equal_i(2, exp.files); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_DELETED]); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_UNTRACKED]); - - git_diff_free(diff); - git_index_free(index); -} - -void test_diff_rename__can_find_copy_to_split(void) -{ - git_buf c1 = GIT_BUF_INIT; - git_index *index; - git_tree *tree; - git_diff *diff; - git_diff_options diffopts = GIT_DIFF_OPTIONS_INIT; - git_diff_find_options opts = GIT_DIFF_FIND_OPTIONS_INIT; - diff_expects exp; - - cl_git_pass(git_futils_readbuffer(&c1, "renames/songof7cities.txt")); - cl_git_pass(git_futils_writebuffer(&c1, "renames/untimely.txt", 0, 0)); - - cl_git_pass( - git_revparse_single((git_object **)&tree, g_repo, "HEAD^{tree}")); - - cl_git_pass(git_repository_index(&index, g_repo)); - cl_git_pass(git_index_read_tree(index, tree)); - cl_git_pass(git_index_add_bypath(index, "untimely.txt")); - - diffopts.flags = GIT_DIFF_INCLUDE_UNMODIFIED; - - cl_git_pass(git_diff_tree_to_index(&diff, g_repo, tree, index, &diffopts)); - - memset(&exp, 0, sizeof(exp)); - cl_git_pass(git_diff_foreach( - diff, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &exp)); - cl_assert_equal_i(4, exp.files); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_MODIFIED]); - cl_assert_equal_i(3, exp.file_status[GIT_DELTA_UNMODIFIED]); - - opts.flags = GIT_DIFF_FIND_ALL; - cl_git_pass(git_diff_find_similar(diff, &opts)); - - memset(&exp, 0, sizeof(exp)); - cl_git_pass(git_diff_foreach( - diff, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &exp)); - cl_assert_equal_i(5, exp.files); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_DELETED]); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_COPIED]); - cl_assert_equal_i(3, exp.file_status[GIT_DELTA_UNMODIFIED]); - - git_diff_free(diff); - git_tree_free(tree); - git_index_free(index); - - git_buf_free(&c1); -} - -void test_diff_rename__can_delete_unmodified_deltas(void) -{ - git_buf c1 = GIT_BUF_INIT; - git_index *index; - git_tree *tree; - git_diff *diff; - git_diff_options diffopts = GIT_DIFF_OPTIONS_INIT; - git_diff_find_options opts = GIT_DIFF_FIND_OPTIONS_INIT; - diff_expects exp; - - cl_git_pass(git_futils_readbuffer(&c1, "renames/songof7cities.txt")); - cl_git_pass(git_futils_writebuffer(&c1, "renames/untimely.txt", 0, 0)); - - cl_git_pass( - git_revparse_single((git_object **)&tree, g_repo, "HEAD^{tree}")); - - cl_git_pass(git_repository_index(&index, g_repo)); - cl_git_pass(git_index_read_tree(index, tree)); - cl_git_pass(git_index_add_bypath(index, "untimely.txt")); - - diffopts.flags = GIT_DIFF_INCLUDE_UNMODIFIED; - - cl_git_pass(git_diff_tree_to_index(&diff, g_repo, tree, index, &diffopts)); - - memset(&exp, 0, sizeof(exp)); - cl_git_pass(git_diff_foreach( - diff, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &exp)); - cl_assert_equal_i(4, exp.files); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_MODIFIED]); - cl_assert_equal_i(3, exp.file_status[GIT_DELTA_UNMODIFIED]); - - opts.flags = GIT_DIFF_FIND_ALL | GIT_DIFF_FIND_REMOVE_UNMODIFIED; - cl_git_pass(git_diff_find_similar(diff, &opts)); - - memset(&exp, 0, sizeof(exp)); - cl_git_pass(git_diff_foreach( - diff, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &exp)); - cl_assert_equal_i(2, exp.files); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_DELETED]); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_COPIED]); - - git_diff_free(diff); - git_tree_free(tree); - git_index_free(index); - - git_buf_free(&c1); -} - -void test_diff_rename__matches_config_behavior(void) -{ - const char *sha0 = "31e47d8c1fa36d7f8d537b96158e3f024de0a9f2"; - const char *sha1 = "2bc7f351d20b53f1c72c16c4b036e491c478c49a"; - const char *sha2 = "1c068dee5790ef1580cfc4cd670915b48d790084"; - - git_tree *tree0, *tree1, *tree2; - git_config *cfg; - git_diff *diff; - git_diff_options diffopts = GIT_DIFF_OPTIONS_INIT; - git_diff_find_options opts = GIT_DIFF_FIND_OPTIONS_INIT; - diff_expects exp; - - opts.flags = GIT_DIFF_FIND_BY_CONFIG; - tree0 = resolve_commit_oid_to_tree(g_repo, sha0); - tree1 = resolve_commit_oid_to_tree(g_repo, sha1); - tree2 = resolve_commit_oid_to_tree(g_repo, sha2); - - diffopts.flags |= GIT_DIFF_INCLUDE_UNMODIFIED; - cl_git_pass(git_repository_config(&cfg, g_repo)); - - /* diff.renames = false; no rename detection should happen */ - cl_git_pass(git_config_set_bool(cfg, "diff.renames", false)); - cl_git_pass(git_diff_tree_to_tree( - &diff, g_repo, tree0, tree1, &diffopts)); - memset(&exp, 0, sizeof(exp)); - cl_git_pass(git_diff_find_similar(diff, &opts)); - cl_git_pass(git_diff_foreach(diff, - diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &exp)); - cl_assert_equal_i(4, exp.files); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_UNMODIFIED]); - cl_assert_equal_i(2, exp.file_status[GIT_DELTA_ADDED]); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_DELETED]); - git_diff_free(diff); - - /* diff.renames = true; should act like -M */ - cl_git_pass(git_config_set_bool(cfg, "diff.renames", true)); - cl_git_pass(git_diff_tree_to_tree( - &diff, g_repo, tree0, tree1, &diffopts)); - memset(&exp, 0, sizeof(exp)); - cl_git_pass(git_diff_find_similar(diff, &opts)); - cl_git_pass(git_diff_foreach(diff, - diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &exp)); - cl_assert_equal_i(3, exp.files); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_UNMODIFIED]); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_ADDED]); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_RENAMED]); - git_diff_free(diff); - - /* diff.renames = copies; should act like -M -C */ - cl_git_pass(git_config_set_string(cfg, "diff.renames", "copies")); - cl_git_pass(git_diff_tree_to_tree( - &diff, g_repo, tree1, tree2, &diffopts)); - memset(&exp, 0, sizeof(exp)); - cl_git_pass(git_diff_find_similar(diff, &opts)); - cl_git_pass(git_diff_foreach(diff, - diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &exp)); - cl_assert_equal_i(4, exp.files); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_UNMODIFIED]); - cl_assert_equal_i(2, exp.file_status[GIT_DELTA_MODIFIED]); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_COPIED]); - git_diff_free(diff); - - /* NULL find options is the same as GIT_DIFF_FIND_BY_CONFIG */ - cl_git_pass(git_diff_tree_to_tree( - &diff, g_repo, tree1, tree2, &diffopts)); - memset(&exp, 0, sizeof(exp)); - cl_git_pass(git_diff_find_similar(diff, NULL)); - cl_git_pass(git_diff_foreach(diff, - diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &exp)); - cl_assert_equal_i(4, exp.files); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_UNMODIFIED]); - cl_assert_equal_i(2, exp.file_status[GIT_DELTA_MODIFIED]); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_COPIED]); - git_diff_free(diff); - - /* Cleanup */ - git_tree_free(tree0); - git_tree_free(tree1); - git_tree_free(tree2); - git_config_free(cfg); -} - -void test_diff_rename__can_override_thresholds_when_obeying_config(void) -{ - const char *sha1 = "2bc7f351d20b53f1c72c16c4b036e491c478c49a"; - const char *sha2 = "1c068dee5790ef1580cfc4cd670915b48d790084"; - - git_tree *tree1, *tree2; - git_config *cfg; - git_diff *diff; - git_diff_options diffopts = GIT_DIFF_OPTIONS_INIT; - git_diff_find_options opts = GIT_DIFF_FIND_OPTIONS_INIT; - diff_expects exp; - - tree1 = resolve_commit_oid_to_tree(g_repo, sha1); - tree2 = resolve_commit_oid_to_tree(g_repo, sha2); - - diffopts.flags |= GIT_DIFF_INCLUDE_UNMODIFIED; - opts.flags = GIT_DIFF_FIND_BY_CONFIG; - - cl_git_pass(git_repository_config(&cfg, g_repo)); - cl_git_pass(git_config_set_string(cfg, "diff.renames", "copies")); - git_config_free(cfg); - - /* copy threshold = 96%, should see creation of ikeepsix.txt */ - opts.copy_threshold = 96; - cl_git_pass(git_diff_tree_to_tree( - &diff, g_repo, tree1, tree2, &diffopts)); - memset(&exp, 0, sizeof(exp)); - cl_git_pass(git_diff_find_similar(diff, &opts)); - cl_git_pass(git_diff_foreach(diff, - diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &exp)); - cl_assert_equal_i(4, exp.files); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_UNMODIFIED]); - cl_assert_equal_i(2, exp.file_status[GIT_DELTA_MODIFIED]); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_ADDED]); - git_diff_free(diff); - - /* copy threshold = 20%, should see sixserving.txt => ikeepsix.txt */ - opts.copy_threshold = 20; - cl_git_pass(git_diff_tree_to_tree( - &diff, g_repo, tree1, tree2, &diffopts)); - memset(&exp, 0, sizeof(exp)); - cl_git_pass(git_diff_find_similar(diff, &opts)); - cl_git_pass(git_diff_foreach(diff, - diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &exp)); - cl_assert_equal_i(4, exp.files); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_UNMODIFIED]); - cl_assert_equal_i(2, exp.file_status[GIT_DELTA_MODIFIED]); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_COPIED]); - git_diff_free(diff); - - /* Cleanup */ - git_tree_free(tree1); - git_tree_free(tree2); -} - -void test_diff_rename__by_config_doesnt_mess_with_whitespace_settings(void) -{ - const char *sha1 = "1c068dee5790ef1580cfc4cd670915b48d790084"; - const char *sha2 = "19dd32dfb1520a64e5bbaae8dce6ef423dfa2f13"; - - git_tree *tree1, *tree2; - git_config *cfg; - git_diff *diff; - git_diff_options diffopts = GIT_DIFF_OPTIONS_INIT; - git_diff_find_options opts = GIT_DIFF_FIND_OPTIONS_INIT; - diff_expects exp; - - tree1 = resolve_commit_oid_to_tree(g_repo, sha1); - tree2 = resolve_commit_oid_to_tree(g_repo, sha2); - - diffopts.flags |= GIT_DIFF_INCLUDE_UNMODIFIED; - opts.flags = GIT_DIFF_FIND_BY_CONFIG; - - cl_git_pass(git_repository_config(&cfg, g_repo)); - cl_git_pass(git_config_set_string(cfg, "diff.renames", "copies")); - git_config_free(cfg); - - /* Don't ignore whitespace; this should find a change in sixserving.txt */ - opts.flags |= 0 | GIT_DIFF_FIND_DONT_IGNORE_WHITESPACE; - cl_git_pass(git_diff_tree_to_tree( - &diff, g_repo, tree1, tree2, &diffopts)); - memset(&exp, 0, sizeof(exp)); - cl_git_pass(git_diff_find_similar(diff, &opts)); - cl_git_pass(git_diff_foreach(diff, - diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &exp)); - cl_assert_equal_i(5, exp.files); - cl_assert_equal_i(2, exp.file_status[GIT_DELTA_MODIFIED]); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_RENAMED]); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_DELETED]); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_ADDED]); - git_diff_free(diff); - - /* Cleanup */ - git_tree_free(tree1); - git_tree_free(tree2); -} - -static void expect_files_renamed(const char *one, const char *two, uint32_t whitespace_flags) -{ - git_index *index; - git_diff *diff = NULL; - diff_expects exp; - git_diff_options diffopts = GIT_DIFF_OPTIONS_INIT; - git_diff_find_options findopts = GIT_DIFF_FIND_OPTIONS_INIT; - - diffopts.flags = GIT_DIFF_INCLUDE_UNTRACKED; - findopts.flags = GIT_DIFF_FIND_FOR_UNTRACKED | - GIT_DIFF_FIND_AND_BREAK_REWRITES | - GIT_DIFF_FIND_RENAMES_FROM_REWRITES | - whitespace_flags; - - cl_git_pass(git_repository_index(&index, g_repo)); - - cl_git_rewritefile("renames/ikeepsix.txt", one); - cl_git_pass(git_index_add_bypath(index, "ikeepsix.txt")); - - cl_git_rmfile("renames/ikeepsix.txt"); - cl_git_rewritefile("renames/ikeepsix2.txt", two); - - cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, index, &diffopts)); - cl_git_pass(git_diff_find_similar(diff, &findopts)); - - memset(&exp, 0, sizeof(exp)); - - cl_git_pass(git_diff_foreach( - diff, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &exp)); - cl_assert_equal_i(1, exp.files); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_RENAMED]); - - git_diff_free(diff); - git_index_free(index); -} - -/* test some variations on empty and blank files */ -void test_diff_rename__empty_files_renamed(void) -{ - /* empty files are identical when ignoring whitespace or not */ - expect_files_renamed("", "", GIT_DIFF_FIND_DONT_IGNORE_WHITESPACE); - expect_files_renamed("", "", GIT_DIFF_FIND_IGNORE_WHITESPACE); -} - -/* test that blank files are similar when ignoring whitespace */ -void test_diff_rename__blank_files_renamed_when_ignoring_whitespace(void) -{ - expect_files_renamed("", "\n\n", GIT_DIFF_FIND_IGNORE_WHITESPACE); - expect_files_renamed("", "\r\n\r\n", GIT_DIFF_FIND_IGNORE_WHITESPACE); - expect_files_renamed("\r\n\r\n", "\n\n\n", GIT_DIFF_FIND_IGNORE_WHITESPACE); - - expect_files_renamed(" ", "\n\n", GIT_DIFF_FIND_IGNORE_WHITESPACE); - expect_files_renamed(" \n \n", "\n\n", GIT_DIFF_FIND_IGNORE_WHITESPACE); -} - -/* blank files are not similar when whitespace is not ignored */ -static void expect_files_not_renamed(const char *one, const char *two, uint32_t whitespace_flags) -{ - git_index *index; - git_diff *diff = NULL; - diff_expects exp; - git_diff_options diffopts = GIT_DIFF_OPTIONS_INIT; - git_diff_find_options findopts = GIT_DIFF_FIND_OPTIONS_INIT; - - diffopts.flags = GIT_DIFF_INCLUDE_UNTRACKED; - - findopts.flags = GIT_DIFF_FIND_FOR_UNTRACKED | - whitespace_flags; - - cl_git_pass(git_repository_index(&index, g_repo)); - - cl_git_rewritefile("renames/ikeepsix.txt", one); - cl_git_pass(git_index_add_bypath(index, "ikeepsix.txt")); - - cl_git_rmfile("renames/ikeepsix.txt"); - cl_git_rewritefile("renames/ikeepsix2.txt", two); - - cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, index, &diffopts)); - cl_git_pass(git_diff_find_similar(diff, &findopts)); - - memset(&exp, 0, sizeof(exp)); - - cl_git_pass(git_diff_foreach( - diff, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &exp)); - cl_assert_equal_i(2, exp.files); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_DELETED]); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_UNTRACKED]); - - git_diff_free(diff); - git_index_free(index); -} - -/* test that blank files are similar when ignoring renames */ -void test_diff_rename__blank_files_not_renamed_when_not_ignoring_whitespace(void) -{ - expect_files_not_renamed("", "\r\n\r\n\r\n", GIT_DIFF_FIND_DONT_IGNORE_WHITESPACE); - expect_files_not_renamed("", "\n\n\n\n", GIT_DIFF_FIND_DONT_IGNORE_WHITESPACE); - expect_files_not_renamed("\n\n\n\n", "\r\n\r\n\r\n", GIT_DIFF_FIND_DONT_IGNORE_WHITESPACE); -} diff --git a/vendor/libgit2/tests/diff/stats.c b/vendor/libgit2/tests/diff/stats.c deleted file mode 100644 index f731997dae..0000000000 --- a/vendor/libgit2/tests/diff/stats.c +++ /dev/null @@ -1,289 +0,0 @@ -#include "clar.h" -#include "clar_libgit2.h" - -#include "buffer.h" -#include "commit.h" -#include "diff.h" - -static git_repository *_repo; -static git_diff_stats *_stats; - -void test_diff_stats__initialize(void) -{ - _repo = cl_git_sandbox_init("diff_format_email"); -} - -void test_diff_stats__cleanup(void) -{ - git_diff_stats_free(_stats); _stats = NULL; - cl_git_sandbox_cleanup(); -} - -static void diff_stats_from_commit_oid( - git_diff_stats **stats, const char *oidstr, bool rename) -{ - git_oid oid; - git_commit *commit; - git_diff *diff; - - git_oid_fromstr(&oid, oidstr); - cl_git_pass(git_commit_lookup(&commit, _repo, &oid)); - cl_git_pass(git_diff__commit(&diff, _repo, commit, NULL)); - if (rename) - cl_git_pass(git_diff_find_similar(diff, NULL)); - cl_git_pass(git_diff_get_stats(stats, diff)); - - git_diff_free(diff); - git_commit_free(commit); -} - -void test_diff_stats__stat(void) -{ - git_buf buf = GIT_BUF_INIT; - const char *stat = - " file1.txt | 8 +++++---\n" \ - " 1 file changed, 5 insertions(+), 3 deletions(-)\n"; - - diff_stats_from_commit_oid( - &_stats, "9264b96c6d104d0e07ae33d3007b6a48246c6f92", false); - - cl_assert_equal_sz(1, git_diff_stats_files_changed(_stats)); - cl_assert_equal_sz(5, git_diff_stats_insertions(_stats)); - cl_assert_equal_sz(3, git_diff_stats_deletions(_stats)); - - cl_git_pass(git_diff_stats_to_buf(&buf, _stats, GIT_DIFF_STATS_FULL, 0)); - cl_assert(strcmp(git_buf_cstr(&buf), stat) == 0); - git_buf_free(&buf); - - cl_git_pass(git_diff_stats_to_buf(&buf, _stats, GIT_DIFF_STATS_FULL, 80)); - cl_assert(strcmp(git_buf_cstr(&buf), stat) == 0); - git_buf_free(&buf); -} - -void test_diff_stats__multiple_hunks(void) -{ - git_buf buf = GIT_BUF_INIT; - const char *stat = - " file2.txt | 5 +++--\n" \ - " file3.txt | 6 ++++--\n" \ - " 2 files changed, 7 insertions(+), 4 deletions(-)\n"; - - diff_stats_from_commit_oid( - &_stats, "cd471f0d8770371e1bc78bcbb38db4c7e4106bd2", false); - - cl_assert_equal_sz(2, git_diff_stats_files_changed(_stats)); - cl_assert_equal_sz(7, git_diff_stats_insertions(_stats)); - cl_assert_equal_sz(4, git_diff_stats_deletions(_stats)); - - cl_git_pass(git_diff_stats_to_buf(&buf, _stats, GIT_DIFF_STATS_FULL, 0)); - cl_assert_equal_s(stat, git_buf_cstr(&buf)); - git_buf_free(&buf); -} - -void test_diff_stats__numstat(void) -{ - git_buf buf = GIT_BUF_INIT; - const char *stat = - "3 2 file2.txt\n" - "4 2 file3.txt\n"; - - diff_stats_from_commit_oid( - &_stats, "cd471f0d8770371e1bc78bcbb38db4c7e4106bd2", false); - - cl_git_pass(git_diff_stats_to_buf(&buf, _stats, GIT_DIFF_STATS_NUMBER, 0)); - cl_assert_equal_s(stat, git_buf_cstr(&buf)); - git_buf_free(&buf); -} - -void test_diff_stats__shortstat(void) -{ - git_buf buf = GIT_BUF_INIT; - const char *stat = - " 1 file changed, 5 insertions(+), 3 deletions(-)\n"; - - diff_stats_from_commit_oid( - &_stats, "9264b96c6d104d0e07ae33d3007b6a48246c6f92", false); - - cl_assert_equal_sz(1, git_diff_stats_files_changed(_stats)); - cl_assert_equal_sz(5, git_diff_stats_insertions(_stats)); - cl_assert_equal_sz(3, git_diff_stats_deletions(_stats)); - - cl_git_pass(git_diff_stats_to_buf(&buf, _stats, GIT_DIFF_STATS_SHORT, 0)); - cl_assert_equal_s(stat, git_buf_cstr(&buf)); - git_buf_free(&buf); -} - -void test_diff_stats__rename(void) -{ - git_buf buf = GIT_BUF_INIT; - const char *stat = - " file2.txt => file2.txt.renamed | 1 +\n" - " file3.txt => file3.txt.renamed | 4 +++-\n" - " 2 files changed, 4 insertions(+), 1 deletion(-)\n"; - - diff_stats_from_commit_oid( - &_stats, "8947a46e2097638ca6040ad4877246f4186ec3bd", true); - - cl_assert_equal_sz(2, git_diff_stats_files_changed(_stats)); - cl_assert_equal_sz(4, git_diff_stats_insertions(_stats)); - cl_assert_equal_sz(1, git_diff_stats_deletions(_stats)); - - cl_git_pass(git_diff_stats_to_buf(&buf, _stats, GIT_DIFF_STATS_FULL, 0)); - cl_assert_equal_s(stat, git_buf_cstr(&buf)); - git_buf_free(&buf); -} - -void test_diff_stats__rename_nochanges(void) -{ - git_buf buf = GIT_BUF_INIT; - const char *stat = - " file2.txt.renamed => file2.txt.renamed2 | 0\n" - " file3.txt.renamed => file3.txt.renamed2 | 0\n" - " 2 files changed, 0 insertions(+), 0 deletions(-)\n"; - - diff_stats_from_commit_oid( - &_stats, "3991dce9e71a0641ca49a6a4eea6c9e7ff402ed4", true); - - cl_assert_equal_sz(2, git_diff_stats_files_changed(_stats)); - cl_assert_equal_sz(0, git_diff_stats_insertions(_stats)); - cl_assert_equal_sz(0, git_diff_stats_deletions(_stats)); - - cl_git_pass(git_diff_stats_to_buf(&buf, _stats, GIT_DIFF_STATS_FULL, 0)); - cl_assert_equal_s(stat, git_buf_cstr(&buf)); - git_buf_free(&buf); -} - -void test_diff_stats__rename_and_modifiy(void) -{ - git_buf buf = GIT_BUF_INIT; - const char *stat = - " file2.txt.renamed2 | 2 +-\n" - " file3.txt.renamed2 => file3.txt.renamed | 0\n" - " 2 files changed, 1 insertion(+), 1 deletion(-)\n"; - - diff_stats_from_commit_oid( - &_stats, "4ca10087e696d2ba78d07b146a118e9a7096ed4f", true); - - cl_assert_equal_sz(2, git_diff_stats_files_changed(_stats)); - cl_assert_equal_sz(1, git_diff_stats_insertions(_stats)); - cl_assert_equal_sz(1, git_diff_stats_deletions(_stats)); - - cl_git_pass(git_diff_stats_to_buf(&buf, _stats, GIT_DIFF_STATS_FULL, 0)); - cl_assert_equal_s(stat, git_buf_cstr(&buf)); - git_buf_free(&buf); -} - -void test_diff_stats__rename_no_find(void) -{ - git_buf buf = GIT_BUF_INIT; - const char *stat = - " file2.txt | 5 -----\n" - " file2.txt.renamed | 6 ++++++\n" - " file3.txt | 5 -----\n" - " file3.txt.renamed | 7 +++++++\n" - " 4 files changed, 13 insertions(+), 10 deletions(-)\n"; - - diff_stats_from_commit_oid( - &_stats, "8947a46e2097638ca6040ad4877246f4186ec3bd", false); - - cl_assert_equal_sz(4, git_diff_stats_files_changed(_stats)); - cl_assert_equal_sz(13, git_diff_stats_insertions(_stats)); - cl_assert_equal_sz(10, git_diff_stats_deletions(_stats)); - - cl_git_pass(git_diff_stats_to_buf(&buf, _stats, GIT_DIFF_STATS_FULL, 0)); - cl_assert_equal_s(stat, git_buf_cstr(&buf)); - git_buf_free(&buf); -} - -void test_diff_stats__rename_nochanges_no_find(void) -{ - git_buf buf = GIT_BUF_INIT; - const char *stat = - " file2.txt.renamed | 6 ------\n" - " file2.txt.renamed2 | 6 ++++++\n" - " file3.txt.renamed | 7 -------\n" - " file3.txt.renamed2 | 7 +++++++\n" - " 4 files changed, 13 insertions(+), 13 deletions(-)\n"; - - diff_stats_from_commit_oid( - &_stats, "3991dce9e71a0641ca49a6a4eea6c9e7ff402ed4", false); - - cl_assert_equal_sz(4, git_diff_stats_files_changed(_stats)); - cl_assert_equal_sz(13, git_diff_stats_insertions(_stats)); - cl_assert_equal_sz(13, git_diff_stats_deletions(_stats)); - - cl_git_pass(git_diff_stats_to_buf(&buf, _stats, GIT_DIFF_STATS_FULL, 0)); - cl_assert_equal_s(stat, git_buf_cstr(&buf)); - git_buf_free(&buf); -} - -void test_diff_stats__rename_and_modifiy_no_find(void) -{ - git_buf buf = GIT_BUF_INIT; - const char *stat = - " file2.txt.renamed2 | 2 +-\n" - " file3.txt.renamed | 7 +++++++\n" - " file3.txt.renamed2 | 7 -------\n" - " 3 files changed, 8 insertions(+), 8 deletions(-)\n"; - - diff_stats_from_commit_oid( - &_stats, "4ca10087e696d2ba78d07b146a118e9a7096ed4f", false); - - cl_assert_equal_sz(3, git_diff_stats_files_changed(_stats)); - cl_assert_equal_sz(8, git_diff_stats_insertions(_stats)); - cl_assert_equal_sz(8, git_diff_stats_deletions(_stats)); - - cl_git_pass(git_diff_stats_to_buf(&buf, _stats, GIT_DIFF_STATS_FULL, 0)); - cl_assert_equal_s(stat, git_buf_cstr(&buf)); - git_buf_free(&buf); -} - -void test_diff_stats__binary(void) -{ - git_buf buf = GIT_BUF_INIT; - const char *stat = - " binary.bin | Bin 3 -> 0 bytes\n" - " 1 file changed, 0 insertions(+), 0 deletions(-)\n"; - /* TODO: Actually 0 bytes here should be 5!. Seems like we don't load the new content for binary files? */ - - diff_stats_from_commit_oid( - &_stats, "8d7523f6fcb2404257889abe0d96f093d9f524f9", false); - - cl_assert_equal_sz(1, git_diff_stats_files_changed(_stats)); - cl_assert_equal_sz(0, git_diff_stats_insertions(_stats)); - cl_assert_equal_sz(0, git_diff_stats_deletions(_stats)); - - cl_git_pass(git_diff_stats_to_buf(&buf, _stats, GIT_DIFF_STATS_FULL, 0)); - cl_assert_equal_s(stat, git_buf_cstr(&buf)); - git_buf_free(&buf); -} - -void test_diff_stats__binary_numstat(void) -{ - git_buf buf = GIT_BUF_INIT; - const char *stat = - "- - binary.bin\n"; - - diff_stats_from_commit_oid( - &_stats, "8d7523f6fcb2404257889abe0d96f093d9f524f9", false); - - cl_git_pass(git_diff_stats_to_buf(&buf, _stats, GIT_DIFF_STATS_NUMBER, 0)); - cl_assert_equal_s(stat, git_buf_cstr(&buf)); - git_buf_free(&buf); -} - -void test_diff_stats__mode_change(void) -{ - git_buf buf = GIT_BUF_INIT; - const char *stat = - " file1.txt.renamed | 0\n" \ - " 1 file changed, 0 insertions(+), 0 deletions(-)\n" \ - " mode change 100644 => 100755 file1.txt.renamed\n"; - - diff_stats_from_commit_oid( - &_stats, "7ade76dd34bba4733cf9878079f9fd4a456a9189", false); - - cl_git_pass(git_diff_stats_to_buf(&buf, _stats, GIT_DIFF_STATS_FULL | GIT_DIFF_STATS_INCLUDE_SUMMARY, 0)); - cl_assert_equal_s(stat, git_buf_cstr(&buf)); - git_buf_free(&buf); -} diff --git a/vendor/libgit2/tests/diff/submodules.c b/vendor/libgit2/tests/diff/submodules.c deleted file mode 100644 index 08682cd4b3..0000000000 --- a/vendor/libgit2/tests/diff/submodules.c +++ /dev/null @@ -1,495 +0,0 @@ -#include "clar_libgit2.h" -#include "repository.h" -#include "posix.h" -#include "diff_helpers.h" -#include "../submodule/submodule_helpers.h" - -static git_repository *g_repo = NULL; - -void test_diff_submodules__initialize(void) -{ -} - -void test_diff_submodules__cleanup(void) -{ - cl_git_sandbox_cleanup(); -} - -#define get_buf_ptr(buf) ((buf)->asize ? (buf)->ptr : NULL) - -static void check_diff_patches_at_line( - git_diff *diff, const char **expected, const char *file, int line) -{ - const git_diff_delta *delta; - git_patch *patch = NULL; - size_t d, num_d = git_diff_num_deltas(diff); - git_buf buf = GIT_BUF_INIT; - - for (d = 0; d < num_d; ++d, git_patch_free(patch)) { - cl_git_pass(git_patch_from_diff(&patch, diff, d)); - cl_assert((delta = git_patch_get_delta(patch)) != NULL); - - if (delta->status == GIT_DELTA_UNMODIFIED) { - cl_assert_at_line(expected[d] == NULL, file, line); - continue; - } - - if (expected[d] && !strcmp(expected[d], "")) - continue; - if (expected[d] && !strcmp(expected[d], "")) { - cl_assert_at_line(delta->status == GIT_DELTA_UNTRACKED, file, line); - continue; - } - if (expected[d] && !strcmp(expected[d], "")) { - cl_git_pass(git_patch_to_buf(&buf, patch)); - cl_assert_at_line(!strcmp(expected[d], ""), file, line); - } - - cl_git_pass(git_patch_to_buf(&buf, patch)); - - clar__assert_equal( - file, line, "expected diff did not match actual diff", 1, - "%s", expected[d], get_buf_ptr(&buf)); - git_buf_free(&buf); - } - - cl_assert_at_line(expected[d] && !strcmp(expected[d], ""), file, line); -} - -#define check_diff_patches(diff, exp) \ - check_diff_patches_at_line(diff, exp, __FILE__, __LINE__) - -void test_diff_submodules__unmodified_submodule(void) -{ - git_diff_options opts = GIT_DIFF_OPTIONS_INIT; - git_diff *diff = NULL; - static const char *expected[] = { - "", /* .gitmodules */ - NULL, /* added */ - NULL, /* ignored */ - "diff --git a/modified b/modified\nindex 092bfb9..452216e 100644\n--- a/modified\n+++ b/modified\n@@ -1 +1,2 @@\n-yo\n+changed\n+\n", /* modified */ - NULL, /* testrepo.git */ - NULL, /* unmodified */ - NULL, /* untracked */ - "" - }; - - g_repo = setup_fixture_submodules(); - - opts.flags = GIT_DIFF_INCLUDE_IGNORED | - GIT_DIFF_INCLUDE_UNTRACKED | - GIT_DIFF_INCLUDE_UNMODIFIED; - opts.old_prefix = "a"; opts.new_prefix = "b"; - - cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, NULL, &opts)); - check_diff_patches(diff, expected); - git_diff_free(diff); -} - -void test_diff_submodules__dirty_submodule(void) -{ - git_diff_options opts = GIT_DIFF_OPTIONS_INIT; - git_diff *diff = NULL; - static const char *expected[] = { - "", /* .gitmodules */ - NULL, /* added */ - NULL, /* ignored */ - "diff --git a/modified b/modified\nindex 092bfb9..452216e 100644\n--- a/modified\n+++ b/modified\n@@ -1 +1,2 @@\n-yo\n+changed\n+\n", /* modified */ - "diff --git a/testrepo b/testrepo\nindex a65fedf..a65fedf 160000\n--- a/testrepo\n+++ b/testrepo\n@@ -1 +1 @@\n-Subproject commit a65fedf39aefe402d3bb6e24df4d4f5fe4547750\n+Subproject commit a65fedf39aefe402d3bb6e24df4d4f5fe4547750-dirty\n", /* testrepo.git */ - NULL, /* unmodified */ - NULL, /* untracked */ - "" - }; - - g_repo = setup_fixture_submodules(); - - cl_git_rewritefile("submodules/testrepo/README", "heyheyhey"); - cl_git_mkfile("submodules/testrepo/all_new.txt", "never seen before"); - - opts.flags = GIT_DIFF_INCLUDE_IGNORED | - GIT_DIFF_INCLUDE_UNTRACKED | - GIT_DIFF_INCLUDE_UNMODIFIED; - opts.old_prefix = "a"; opts.new_prefix = "b"; - - cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, NULL, &opts)); - check_diff_patches(diff, expected); - git_diff_free(diff); -} - -void test_diff_submodules__dirty_submodule_2(void) -{ - git_diff_options opts = GIT_DIFF_OPTIONS_INIT; - git_diff *diff = NULL, *diff2 = NULL; - char *smpath = "testrepo"; - static const char *expected_none[] = { - "" - }; - static const char *expected_dirty[] = { - "diff --git a/testrepo b/testrepo\nindex a65fedf..a65fedf 160000\n--- a/testrepo\n+++ b/testrepo\n@@ -1 +1 @@\n-Subproject commit a65fedf39aefe402d3bb6e24df4d4f5fe4547750\n+Subproject commit a65fedf39aefe402d3bb6e24df4d4f5fe4547750-dirty\n", /* testrepo.git */ - "" - }; - - g_repo = setup_fixture_submodules(); - - opts.flags = GIT_DIFF_INCLUDE_UNTRACKED | - GIT_DIFF_SHOW_UNTRACKED_CONTENT | - GIT_DIFF_RECURSE_UNTRACKED_DIRS | - GIT_DIFF_DISABLE_PATHSPEC_MATCH; - opts.old_prefix = "a"; opts.new_prefix = "b"; - opts.pathspec.count = 1; - opts.pathspec.strings = &smpath; - - cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, NULL, &opts)); - check_diff_patches(diff, expected_none); - git_diff_free(diff); - - cl_git_rewritefile("submodules/testrepo/README", "heyheyhey"); - cl_git_mkfile("submodules/testrepo/all_new.txt", "never seen before"); - - cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, NULL, &opts)); - check_diff_patches(diff, expected_dirty); - - { - git_tree *head; - - cl_git_pass(git_repository_head_tree(&head, g_repo)); - cl_git_pass(git_diff_tree_to_index(&diff2, g_repo, head, NULL, &opts)); - cl_git_pass(git_diff_merge(diff, diff2)); - git_diff_free(diff2); - git_tree_free(head); - - check_diff_patches(diff, expected_dirty); - } - - git_diff_free(diff); - - cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, NULL, &opts)); - check_diff_patches(diff, expected_dirty); - git_diff_free(diff); -} - -void test_diff_submodules__submod2_index_to_wd(void) -{ - git_diff_options opts = GIT_DIFF_OPTIONS_INIT; - git_diff *diff = NULL; - static const char *expected[] = { - "", /* .gitmodules */ - "", /* not-submodule */ - "", /* not */ - "diff --git a/sm_changed_file b/sm_changed_file\nindex 4800958..4800958 160000\n--- a/sm_changed_file\n+++ b/sm_changed_file\n@@ -1 +1 @@\n-Subproject commit 480095882d281ed676fe5b863569520e54a7d5c0\n+Subproject commit 480095882d281ed676fe5b863569520e54a7d5c0-dirty\n", /* sm_changed_file */ - "diff --git a/sm_changed_head b/sm_changed_head\nindex 4800958..3d9386c 160000\n--- a/sm_changed_head\n+++ b/sm_changed_head\n@@ -1 +1 @@\n-Subproject commit 480095882d281ed676fe5b863569520e54a7d5c0\n+Subproject commit 3d9386c507f6b093471a3e324085657a3c2b4247\n", /* sm_changed_head */ - "", /* sm_changed_head- */ - "", /* sm_changed_head_ */ - "diff --git a/sm_changed_index b/sm_changed_index\nindex 4800958..4800958 160000\n--- a/sm_changed_index\n+++ b/sm_changed_index\n@@ -1 +1 @@\n-Subproject commit 480095882d281ed676fe5b863569520e54a7d5c0\n+Subproject commit 480095882d281ed676fe5b863569520e54a7d5c0-dirty\n", /* sm_changed_index */ - "diff --git a/sm_changed_untracked_file b/sm_changed_untracked_file\nindex 4800958..4800958 160000\n--- a/sm_changed_untracked_file\n+++ b/sm_changed_untracked_file\n@@ -1 +1 @@\n-Subproject commit 480095882d281ed676fe5b863569520e54a7d5c0\n+Subproject commit 480095882d281ed676fe5b863569520e54a7d5c0-dirty\n", /* sm_changed_untracked_file */ - "diff --git a/sm_missing_commits b/sm_missing_commits\nindex 4800958..5e49635 160000\n--- a/sm_missing_commits\n+++ b/sm_missing_commits\n@@ -1 +1 @@\n-Subproject commit 480095882d281ed676fe5b863569520e54a7d5c0\n+Subproject commit 5e4963595a9774b90524d35a807169049de8ccad\n", /* sm_missing_commits */ - "" - }; - - g_repo = setup_fixture_submod2(); - - /* bracket existing submodule with similarly named items */ - cl_git_mkfile("submod2/sm_changed_head-", "hello"); - cl_git_mkfile("submod2/sm_changed_head_", "hello"); - - opts.flags = GIT_DIFF_INCLUDE_UNTRACKED; - opts.old_prefix = "a"; opts.new_prefix = "b"; - - cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, NULL, &opts)); - check_diff_patches(diff, expected); - git_diff_free(diff); -} - -void test_diff_submodules__submod2_head_to_index(void) -{ - git_diff_options opts = GIT_DIFF_OPTIONS_INIT; - git_tree *head; - git_diff *diff = NULL; - static const char *expected[] = { - "", /* .gitmodules */ - "diff --git a/sm_added_and_uncommited b/sm_added_and_uncommited\nnew file mode 160000\nindex 0000000..4800958\n--- /dev/null\n+++ b/sm_added_and_uncommited\n@@ -0,0 +1 @@\n+Subproject commit 480095882d281ed676fe5b863569520e54a7d5c0\n", /* sm_added_and_uncommited */ - "" - }; - - g_repo = setup_fixture_submod2(); - - cl_git_pass(git_repository_head_tree(&head, g_repo)); - - opts.flags = GIT_DIFF_INCLUDE_UNTRACKED; - opts.old_prefix = "a"; opts.new_prefix = "b"; - - cl_git_pass(git_diff_tree_to_index(&diff, g_repo, head, NULL, &opts)); - check_diff_patches(diff, expected); - git_diff_free(diff); - - git_tree_free(head); -} - -void test_diff_submodules__invalid_cache(void) -{ - git_diff_options opts = GIT_DIFF_OPTIONS_INIT; - git_diff *diff = NULL; - git_submodule *sm; - char *smpath = "sm_changed_head"; - git_repository *smrepo; - git_index *smindex; - static const char *expected_baseline[] = { - "diff --git a/sm_changed_head b/sm_changed_head\nindex 4800958..3d9386c 160000\n--- a/sm_changed_head\n+++ b/sm_changed_head\n@@ -1 +1 @@\n-Subproject commit 480095882d281ed676fe5b863569520e54a7d5c0\n+Subproject commit 3d9386c507f6b093471a3e324085657a3c2b4247\n", /* sm_changed_head */ - "" - }; - static const char *expected_unchanged[] = { "" }; - static const char *expected_dirty[] = { - "diff --git a/sm_changed_head b/sm_changed_head\nindex 3d9386c..3d9386c 160000\n--- a/sm_changed_head\n+++ b/sm_changed_head\n@@ -1 +1 @@\n-Subproject commit 3d9386c507f6b093471a3e324085657a3c2b4247\n+Subproject commit 3d9386c507f6b093471a3e324085657a3c2b4247-dirty\n", - "" - }; - static const char *expected_moved[] = { - "diff --git a/sm_changed_head b/sm_changed_head\nindex 3d9386c..7002348 160000\n--- a/sm_changed_head\n+++ b/sm_changed_head\n@@ -1 +1 @@\n-Subproject commit 3d9386c507f6b093471a3e324085657a3c2b4247\n+Subproject commit 700234833f6ccc20d744b238612646be071acaae\n", - "" - }; - static const char *expected_moved_dirty[] = { - "diff --git a/sm_changed_head b/sm_changed_head\nindex 3d9386c..7002348 160000\n--- a/sm_changed_head\n+++ b/sm_changed_head\n@@ -1 +1 @@\n-Subproject commit 3d9386c507f6b093471a3e324085657a3c2b4247\n+Subproject commit 700234833f6ccc20d744b238612646be071acaae-dirty\n", - "" - }; - - g_repo = setup_fixture_submod2(); - - opts.flags = GIT_DIFF_INCLUDE_UNTRACKED; - opts.old_prefix = "a"; opts.new_prefix = "b"; - opts.pathspec.count = 1; - opts.pathspec.strings = &smpath; - - /* baseline */ - cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, NULL, &opts)); - check_diff_patches(diff, expected_baseline); - git_diff_free(diff); - - /* update index with new HEAD */ - cl_git_pass(git_submodule_lookup(&sm, g_repo, smpath)); - cl_git_pass(git_submodule_add_to_index(sm, 1)); - - cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, NULL, &opts)); - check_diff_patches(diff, expected_unchanged); - git_diff_free(diff); - - /* create untracked file in submodule working directory */ - cl_git_mkfile("submod2/sm_changed_head/new_around_here", "hello"); - git_submodule_set_ignore(g_repo, git_submodule_name(sm), GIT_SUBMODULE_IGNORE_NONE); - - cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, NULL, &opts)); - check_diff_patches(diff, expected_dirty); - git_diff_free(diff); - - git_submodule_set_ignore(g_repo, git_submodule_name(sm), GIT_SUBMODULE_IGNORE_UNTRACKED); - - cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, NULL, &opts)); - check_diff_patches(diff, expected_unchanged); - git_diff_free(diff); - - /* modify tracked file in submodule working directory */ - cl_git_append2file( - "submod2/sm_changed_head/file_to_modify", "\nmore stuff\n"); - - cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, NULL, &opts)); - check_diff_patches(diff, expected_dirty); - git_diff_free(diff); - - git_submodule_free(sm); - - cl_git_pass(git_submodule_lookup(&sm, g_repo, smpath)); - - cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, NULL, &opts)); - check_diff_patches(diff, expected_dirty); - git_diff_free(diff); - - git_submodule_set_ignore(g_repo, git_submodule_name(sm), GIT_SUBMODULE_IGNORE_DIRTY); - - cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, NULL, &opts)); - check_diff_patches(diff, expected_unchanged); - git_diff_free(diff); - - /* add file to index in submodule */ - cl_git_pass(git_submodule_open(&smrepo, sm)); - cl_git_pass(git_repository_index(&smindex, smrepo)); - cl_git_pass(git_index_add_bypath(smindex, "file_to_modify")); - - git_submodule_set_ignore(g_repo, git_submodule_name(sm), GIT_SUBMODULE_IGNORE_UNTRACKED); - - cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, NULL, &opts)); - check_diff_patches(diff, expected_dirty); - git_diff_free(diff); - - git_submodule_set_ignore(g_repo, git_submodule_name(sm), GIT_SUBMODULE_IGNORE_DIRTY); - - cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, NULL, &opts)); - check_diff_patches(diff, expected_unchanged); - git_diff_free(diff); - - /* commit changed index of submodule */ - cl_repo_commit_from_index(NULL, smrepo, NULL, 1372350000, "Move it"); - - git_submodule_set_ignore(g_repo, git_submodule_name(sm), GIT_SUBMODULE_IGNORE_DIRTY); - - cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, NULL, &opts)); - check_diff_patches(diff, expected_moved); - git_diff_free(diff); - - git_submodule_set_ignore(g_repo, git_submodule_name(sm), GIT_SUBMODULE_IGNORE_ALL); - - cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, NULL, &opts)); - check_diff_patches(diff, expected_unchanged); - git_diff_free(diff); - - git_submodule_set_ignore(g_repo, git_submodule_name(sm), GIT_SUBMODULE_IGNORE_NONE); - - cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, NULL, &opts)); - check_diff_patches(diff, expected_moved_dirty); - git_diff_free(diff); - - p_unlink("submod2/sm_changed_head/new_around_here"); - - git_submodule_free(sm); - - cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, NULL, &opts)); - check_diff_patches(diff, expected_moved); - git_diff_free(diff); - - git_index_free(smindex); - git_repository_free(smrepo); -} - -void test_diff_submodules__diff_ignore_options(void) -{ - git_diff_options opts = GIT_DIFF_OPTIONS_INIT; - git_diff *diff = NULL; - git_config *cfg; - static const char *expected_normal[] = { - "", /* .gitmodules */ - "", /* not-submodule */ - "", /* not */ - "diff --git a/sm_changed_file b/sm_changed_file\nindex 4800958..4800958 160000\n--- a/sm_changed_file\n+++ b/sm_changed_file\n@@ -1 +1 @@\n-Subproject commit 480095882d281ed676fe5b863569520e54a7d5c0\n+Subproject commit 480095882d281ed676fe5b863569520e54a7d5c0-dirty\n", /* sm_changed_file */ - "diff --git a/sm_changed_head b/sm_changed_head\nindex 4800958..3d9386c 160000\n--- a/sm_changed_head\n+++ b/sm_changed_head\n@@ -1 +1 @@\n-Subproject commit 480095882d281ed676fe5b863569520e54a7d5c0\n+Subproject commit 3d9386c507f6b093471a3e324085657a3c2b4247\n", /* sm_changed_head */ - "diff --git a/sm_changed_index b/sm_changed_index\nindex 4800958..4800958 160000\n--- a/sm_changed_index\n+++ b/sm_changed_index\n@@ -1 +1 @@\n-Subproject commit 480095882d281ed676fe5b863569520e54a7d5c0\n+Subproject commit 480095882d281ed676fe5b863569520e54a7d5c0-dirty\n", /* sm_changed_index */ - "diff --git a/sm_changed_untracked_file b/sm_changed_untracked_file\nindex 4800958..4800958 160000\n--- a/sm_changed_untracked_file\n+++ b/sm_changed_untracked_file\n@@ -1 +1 @@\n-Subproject commit 480095882d281ed676fe5b863569520e54a7d5c0\n+Subproject commit 480095882d281ed676fe5b863569520e54a7d5c0-dirty\n", /* sm_changed_untracked_file */ - "diff --git a/sm_missing_commits b/sm_missing_commits\nindex 4800958..5e49635 160000\n--- a/sm_missing_commits\n+++ b/sm_missing_commits\n@@ -1 +1 @@\n-Subproject commit 480095882d281ed676fe5b863569520e54a7d5c0\n+Subproject commit 5e4963595a9774b90524d35a807169049de8ccad\n", /* sm_missing_commits */ - "" - }; - static const char *expected_ignore_all[] = { - "", /* .gitmodules */ - "", /* not-submodule */ - "", /* not */ - "" - }; - static const char *expected_ignore_dirty[] = { - "", /* .gitmodules */ - "", /* not-submodule */ - "", /* not */ - "diff --git a/sm_changed_head b/sm_changed_head\nindex 4800958..3d9386c 160000\n--- a/sm_changed_head\n+++ b/sm_changed_head\n@@ -1 +1 @@\n-Subproject commit 480095882d281ed676fe5b863569520e54a7d5c0\n+Subproject commit 3d9386c507f6b093471a3e324085657a3c2b4247\n", /* sm_changed_head */ - "diff --git a/sm_missing_commits b/sm_missing_commits\nindex 4800958..5e49635 160000\n--- a/sm_missing_commits\n+++ b/sm_missing_commits\n@@ -1 +1 @@\n-Subproject commit 480095882d281ed676fe5b863569520e54a7d5c0\n+Subproject commit 5e4963595a9774b90524d35a807169049de8ccad\n", /* sm_missing_commits */ - "" - }; - - g_repo = setup_fixture_submod2(); - - opts.flags = GIT_DIFF_INCLUDE_UNTRACKED; - opts.old_prefix = "a"; opts.new_prefix = "b"; - - cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, NULL, &opts)); - check_diff_patches(diff, expected_normal); - git_diff_free(diff); - - opts.flags |= GIT_DIFF_IGNORE_SUBMODULES; - - cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, NULL, &opts)); - check_diff_patches(diff, expected_ignore_all); - git_diff_free(diff); - - opts.flags &= ~GIT_DIFF_IGNORE_SUBMODULES; - opts.ignore_submodules = GIT_SUBMODULE_IGNORE_ALL; - - cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, NULL, &opts)); - check_diff_patches(diff, expected_ignore_all); - git_diff_free(diff); - - opts.ignore_submodules = GIT_SUBMODULE_IGNORE_DIRTY; - - cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, NULL, &opts)); - check_diff_patches(diff, expected_ignore_dirty); - git_diff_free(diff); - - opts.ignore_submodules = 0; - cl_git_pass(git_repository_config(&cfg, g_repo)); - cl_git_pass(git_config_set_bool(cfg, "diff.ignoreSubmodules", false)); - - cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, NULL, &opts)); - check_diff_patches(diff, expected_normal); - git_diff_free(diff); - - cl_git_pass(git_config_set_bool(cfg, "diff.ignoreSubmodules", true)); - - cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, NULL, &opts)); - check_diff_patches(diff, expected_ignore_all); - git_diff_free(diff); - - cl_git_pass(git_config_set_string(cfg, "diff.ignoreSubmodules", "none")); - - cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, NULL, &opts)); - check_diff_patches(diff, expected_normal); - git_diff_free(diff); - - cl_git_pass(git_config_set_string(cfg, "diff.ignoreSubmodules", "dirty")); - - cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, NULL, &opts)); - check_diff_patches(diff, expected_ignore_dirty); - git_diff_free(diff); - - git_config_free(cfg); -} - -void test_diff_submodules__skips_empty_includes_used(void) -{ - git_diff_options opts = GIT_DIFF_OPTIONS_INIT; - git_diff *diff = NULL; - diff_expects exp; - - /* A side effect of of Git's handling of untracked directories and - * auto-ignoring of ".git" entries is that a newly initialized Git - * repo inside another repo will be skipped by diff, but one that - * actually has a commit it in will show as an untracked directory. - * Let's make sure that works. - */ - - g_repo = cl_git_sandbox_init("empty_standard_repo"); - - opts.flags |= GIT_DIFF_INCLUDE_IGNORED | GIT_DIFF_INCLUDE_UNTRACKED; - - cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, NULL, &opts)); - memset(&exp, 0, sizeof(exp)); - cl_git_pass(git_diff_foreach( - diff, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &exp)); - cl_assert_equal_i(0, exp.files); - git_diff_free(diff); - - { - git_repository *r2; - cl_git_pass(git_repository_init(&r2, "empty_standard_repo/subrepo", 0)); - git_repository_free(r2); - } - - cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, NULL, &opts)); - memset(&exp, 0, sizeof(exp)); - cl_git_pass(git_diff_foreach( - diff, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &exp)); - cl_assert_equal_i(1, exp.files); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_IGNORED]); - git_diff_free(diff); - - cl_git_mkfile("empty_standard_repo/subrepo/README.txt", "hello\n"); - - cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, NULL, &opts)); - memset(&exp, 0, sizeof(exp)); - cl_git_pass(git_diff_foreach( - diff, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &exp)); - cl_assert_equal_i(1, exp.files); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_UNTRACKED]); - git_diff_free(diff); -} diff --git a/vendor/libgit2/tests/diff/tree.c b/vendor/libgit2/tests/diff/tree.c deleted file mode 100644 index 2bc9e6a554..0000000000 --- a/vendor/libgit2/tests/diff/tree.c +++ /dev/null @@ -1,526 +0,0 @@ -#include "clar_libgit2.h" -#include "diff_helpers.h" - -static git_repository *g_repo = NULL; -static git_diff_options opts; -static git_diff *diff; -static git_tree *a, *b; -static diff_expects expect; - -void test_diff_tree__initialize(void) -{ - cl_git_pass(git_diff_init_options(&opts, GIT_DIFF_OPTIONS_VERSION)); - - memset(&expect, 0, sizeof(expect)); - - diff = NULL; - a = NULL; - b = NULL; -} - -void test_diff_tree__cleanup(void) -{ - git_diff_free(diff); - git_tree_free(a); - git_tree_free(b); - - cl_git_sandbox_cleanup(); - -} - -void test_diff_tree__0(void) -{ - /* grabbed a couple of commit oids from the history of the attr repo */ - const char *a_commit = "605812a"; - const char *b_commit = "370fe9ec22"; - const char *c_commit = "f5b0af1fb4f5c"; - git_tree *c; - - g_repo = cl_git_sandbox_init("attr"); - - cl_assert((a = resolve_commit_oid_to_tree(g_repo, a_commit)) != NULL); - cl_assert((b = resolve_commit_oid_to_tree(g_repo, b_commit)) != NULL); - cl_assert((c = resolve_commit_oid_to_tree(g_repo, c_commit)) != NULL); - - opts.context_lines = 1; - opts.interhunk_lines = 1; - - - cl_git_pass(git_diff_tree_to_tree(&diff, g_repo, a, b, &opts)); - - cl_git_pass(git_diff_foreach( - diff, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &expect)); - - cl_assert_equal_i(5, expect.files); - cl_assert_equal_i(2, expect.file_status[GIT_DELTA_ADDED]); - cl_assert_equal_i(1, expect.file_status[GIT_DELTA_DELETED]); - cl_assert_equal_i(2, expect.file_status[GIT_DELTA_MODIFIED]); - - cl_assert_equal_i(5, expect.hunks); - - cl_assert_equal_i(7 + 24 + 1 + 6 + 6, expect.lines); - cl_assert_equal_i(1, expect.line_ctxt); - cl_assert_equal_i(24 + 1 + 5 + 5, expect.line_adds); - cl_assert_equal_i(7 + 1, expect.line_dels); - - git_diff_free(diff); - diff = NULL; - - memset(&expect, 0, sizeof(expect)); - - cl_git_pass(git_diff_tree_to_tree(&diff, g_repo, c, b, &opts)); - - cl_git_pass(git_diff_foreach( - diff, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &expect)); - - cl_assert_equal_i(2, expect.files); - cl_assert_equal_i(0, expect.file_status[GIT_DELTA_ADDED]); - cl_assert_equal_i(0, expect.file_status[GIT_DELTA_DELETED]); - cl_assert_equal_i(2, expect.file_status[GIT_DELTA_MODIFIED]); - - cl_assert_equal_i(2, expect.hunks); - - cl_assert_equal_i(8 + 15, expect.lines); - cl_assert_equal_i(1, expect.line_ctxt); - cl_assert_equal_i(1, expect.line_adds); - cl_assert_equal_i(7 + 14, expect.line_dels); - - git_tree_free(c); -} - -#define DIFF_OPTS(FLAGS, CTXT) \ - {GIT_DIFF_OPTIONS_VERSION, (FLAGS), GIT_SUBMODULE_IGNORE_UNSPECIFIED, \ - {NULL,0}, NULL, NULL, (CTXT), 1} - -void test_diff_tree__options(void) -{ - /* grabbed a couple of commit oids from the history of the attr repo */ - const char *a_commit = "6bab5c79cd5140d0"; - const char *b_commit = "605812ab7fe421fdd"; - const char *c_commit = "f5b0af1fb4f5"; - const char *d_commit = "a97cc019851"; - git_tree *c, *d; - diff_expects actual; - int test_ab_or_cd[] = { 0, 0, 0, 0, 1, 1, 1, 1, 1 }; - git_diff_options test_options[] = { - /* a vs b tests */ - DIFF_OPTS(GIT_DIFF_NORMAL, 1), - DIFF_OPTS(GIT_DIFF_NORMAL, 3), - DIFF_OPTS(GIT_DIFF_REVERSE, 2), - DIFF_OPTS(GIT_DIFF_FORCE_TEXT, 2), - /* c vs d tests */ - DIFF_OPTS(GIT_DIFF_NORMAL, 3), - DIFF_OPTS(GIT_DIFF_IGNORE_WHITESPACE, 3), - DIFF_OPTS(GIT_DIFF_IGNORE_WHITESPACE_CHANGE, 3), - DIFF_OPTS(GIT_DIFF_IGNORE_WHITESPACE_EOL, 3), - DIFF_OPTS(GIT_DIFF_IGNORE_WHITESPACE | GIT_DIFF_REVERSE, 1), - }; - - /* to generate these values: - * - cd to tests/resources/attr, - * - mv .gitted .git - * - git diff [options] 6bab5c79cd5140d0 605812ab7fe421fdd - * - mv .git .gitted - */ -#define EXPECT_STATUS_ADM(ADDS,DELS,MODS) { 0, ADDS, DELS, MODS, 0, 0, 0, 0, 0 } - - diff_expects test_expects[] = { - /* a vs b tests */ - { 5, 0, EXPECT_STATUS_ADM(3, 0, 2), 4, 0, 0, 51, 2, 46, 3 }, - { 5, 0, EXPECT_STATUS_ADM(3, 0, 2), 4, 0, 0, 53, 4, 46, 3 }, - { 5, 0, EXPECT_STATUS_ADM(0, 3, 2), 4, 0, 0, 52, 3, 3, 46 }, - { 5, 0, EXPECT_STATUS_ADM(3, 0, 2), 5, 0, 0, 54, 3, 47, 4 }, - /* c vs d tests */ - { 1, 0, EXPECT_STATUS_ADM(0, 0, 1), 1, 0, 0, 22, 9, 10, 3 }, - { 1, 0, EXPECT_STATUS_ADM(0, 0, 1), 1, 0, 0, 19, 12, 7, 0 }, - { 1, 0, EXPECT_STATUS_ADM(0, 0, 1), 1, 0, 0, 20, 11, 8, 1 }, - { 1, 0, EXPECT_STATUS_ADM(0, 0, 1), 1, 0, 0, 20, 11, 8, 1 }, - { 1, 0, EXPECT_STATUS_ADM(0, 0, 1), 1, 0, 0, 18, 11, 0, 7 }, - { 0 }, - }; - diff_expects *expected; - int i, j; - - g_repo = cl_git_sandbox_init("attr"); - - cl_assert((a = resolve_commit_oid_to_tree(g_repo, a_commit)) != NULL); - cl_assert((b = resolve_commit_oid_to_tree(g_repo, b_commit)) != NULL); - cl_assert((c = resolve_commit_oid_to_tree(g_repo, c_commit)) != NULL); - cl_assert((d = resolve_commit_oid_to_tree(g_repo, d_commit)) != NULL); - - for (i = 0; test_expects[i].files > 0; i++) { - memset(&actual, 0, sizeof(actual)); /* clear accumulator */ - opts = test_options[i]; - - if (test_ab_or_cd[i] == 0) - cl_git_pass(git_diff_tree_to_tree(&diff, g_repo, a, b, &opts)); - else - cl_git_pass(git_diff_tree_to_tree(&diff, g_repo, c, d, &opts)); - - cl_git_pass(git_diff_foreach( - diff, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &actual)); - - expected = &test_expects[i]; - cl_assert_equal_i(actual.files, expected->files); - for (j = GIT_DELTA_UNMODIFIED; j <= GIT_DELTA_TYPECHANGE; ++j) - cl_assert_equal_i(expected->file_status[j], actual.file_status[j]); - cl_assert_equal_i(actual.hunks, expected->hunks); - cl_assert_equal_i(actual.lines, expected->lines); - cl_assert_equal_i(actual.line_ctxt, expected->line_ctxt); - cl_assert_equal_i(actual.line_adds, expected->line_adds); - cl_assert_equal_i(actual.line_dels, expected->line_dels); - - git_diff_free(diff); - diff = NULL; - } - - git_tree_free(c); - git_tree_free(d); -} - -void test_diff_tree__bare(void) -{ - const char *a_commit = "8496071c1b46c85"; - const char *b_commit = "be3563ae3f79"; - - g_repo = cl_git_sandbox_init("testrepo.git"); - - cl_assert((a = resolve_commit_oid_to_tree(g_repo, a_commit)) != NULL); - cl_assert((b = resolve_commit_oid_to_tree(g_repo, b_commit)) != NULL); - - opts.context_lines = 1; - opts.interhunk_lines = 1; - - cl_git_pass(git_diff_tree_to_tree(&diff, g_repo, a, b, &opts)); - - cl_git_pass(git_diff_foreach( - diff, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &expect)); - - cl_assert_equal_i(3, expect.files); - cl_assert_equal_i(2, expect.file_status[GIT_DELTA_ADDED]); - cl_assert_equal_i(0, expect.file_status[GIT_DELTA_DELETED]); - cl_assert_equal_i(1, expect.file_status[GIT_DELTA_MODIFIED]); - - cl_assert_equal_i(3, expect.hunks); - - cl_assert_equal_i(4, expect.lines); - cl_assert_equal_i(0, expect.line_ctxt); - cl_assert_equal_i(3, expect.line_adds); - cl_assert_equal_i(1, expect.line_dels); -} - -void test_diff_tree__merge(void) -{ - /* grabbed a couple of commit oids from the history of the attr repo */ - const char *a_commit = "605812a"; - const char *b_commit = "370fe9ec22"; - const char *c_commit = "f5b0af1fb4f5c"; - git_tree *c; - git_diff *diff1 = NULL, *diff2 = NULL; - - g_repo = cl_git_sandbox_init("attr"); - - cl_assert((a = resolve_commit_oid_to_tree(g_repo, a_commit)) != NULL); - cl_assert((b = resolve_commit_oid_to_tree(g_repo, b_commit)) != NULL); - cl_assert((c = resolve_commit_oid_to_tree(g_repo, c_commit)) != NULL); - - cl_git_pass(git_diff_tree_to_tree(&diff1, g_repo, a, b, NULL)); - - cl_git_pass(git_diff_tree_to_tree(&diff2, g_repo, c, b, NULL)); - - git_tree_free(c); - - cl_git_pass(git_diff_merge(diff1, diff2)); - - git_diff_free(diff2); - - cl_git_pass(git_diff_foreach( - diff1, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &expect)); - - cl_assert_equal_i(6, expect.files); - cl_assert_equal_i(2, expect.file_status[GIT_DELTA_ADDED]); - cl_assert_equal_i(1, expect.file_status[GIT_DELTA_DELETED]); - cl_assert_equal_i(3, expect.file_status[GIT_DELTA_MODIFIED]); - - cl_assert_equal_i(6, expect.hunks); - - cl_assert_equal_i(59, expect.lines); - cl_assert_equal_i(1, expect.line_ctxt); - cl_assert_equal_i(36, expect.line_adds); - cl_assert_equal_i(22, expect.line_dels); - - git_diff_free(diff1); -} - -void test_diff_tree__larger_hunks(void) -{ - const char *a_commit = "d70d245ed97ed2aa596dd1af6536e4bfdb047b69"; - const char *b_commit = "7a9e0b02e63179929fed24f0a3e0f19168114d10"; - size_t d, num_d, h, num_h, l, num_l; - git_patch *patch; - const git_diff_hunk *hunk; - const git_diff_line *line; - - g_repo = cl_git_sandbox_init("diff"); - - cl_assert((a = resolve_commit_oid_to_tree(g_repo, a_commit)) != NULL); - cl_assert((b = resolve_commit_oid_to_tree(g_repo, b_commit)) != NULL); - - opts.context_lines = 1; - opts.interhunk_lines = 0; - - cl_git_pass(git_diff_tree_to_tree(&diff, g_repo, a, b, &opts)); - - num_d = git_diff_num_deltas(diff); - for (d = 0; d < num_d; ++d) { - cl_git_pass(git_patch_from_diff(&patch, diff, d)); - cl_assert(patch); - - num_h = git_patch_num_hunks(patch); - for (h = 0; h < num_h; h++) { - cl_git_pass(git_patch_get_hunk(&hunk, &num_l, patch, h)); - - for (l = 0; l < num_l; ++l) { - cl_git_pass(git_patch_get_line_in_hunk(&line, patch, h, l)); - cl_assert(line); - } - - cl_git_fail(git_patch_get_line_in_hunk(&line, patch, h, num_l)); - } - - cl_git_fail(git_patch_get_hunk(&hunk, &num_l, patch, num_h)); - - git_patch_free(patch); - } - - cl_git_fail(git_patch_from_diff(&patch, diff, num_d)); - - cl_assert_equal_i(2, (int)num_d); -} - -void test_diff_tree__checks_options_version(void) -{ - const char *a_commit = "8496071c1b46c85"; - const char *b_commit = "be3563ae3f79"; - const git_error *err; - - g_repo = cl_git_sandbox_init("testrepo.git"); - - cl_assert((a = resolve_commit_oid_to_tree(g_repo, a_commit)) != NULL); - cl_assert((b = resolve_commit_oid_to_tree(g_repo, b_commit)) != NULL); - - opts.version = 0; - cl_git_fail(git_diff_tree_to_tree(&diff, g_repo, a, b, &opts)); - err = giterr_last(); - cl_assert_equal_i(GITERR_INVALID, err->klass); - - giterr_clear(); - opts.version = 1024; - cl_git_fail(git_diff_tree_to_tree(&diff, g_repo, a, b, &opts)); - err = giterr_last(); -} - -void process_tree_to_tree_diffing( - const char *old_commit, - const char *new_commit) -{ - g_repo = cl_git_sandbox_init("unsymlinked.git"); - - cl_assert((a = resolve_commit_oid_to_tree(g_repo, old_commit)) != NULL); - cl_assert((b = resolve_commit_oid_to_tree(g_repo, new_commit)) != NULL); - - cl_git_pass(git_diff_tree_to_tree(&diff, g_repo, a, b, &opts)); - - cl_git_pass(git_diff_foreach( - diff, diff_file_cb, NULL, NULL, NULL, &expect)); -} - -void test_diff_tree__symlink_blob_mode_changed_to_regular_file(void) -{ - /* - * $ git diff 7fccd7..806999 - * diff --git a/include/Nu/Nu.h b/include/Nu/Nu.h - * deleted file mode 120000 - * index 19bf568..0000000 - * --- a/include/Nu/Nu.h - * +++ /dev/null - * @@ -1 +0,0 @@ - * -../../objc/Nu.h - * \ No newline at end of file - * diff --git a/include/Nu/Nu.h b/include/Nu/Nu.h - * new file mode 100644 - * index 0000000..f9e6561 - * --- /dev/null - * +++ b/include/Nu/Nu.h - * @@ -0,0 +1 @@ - * +awesome content - * diff --git a/objc/Nu.h b/objc/Nu.h - * deleted file mode 100644 - * index f9e6561..0000000 - * --- a/objc/Nu.h - * +++ /dev/null - * @@ -1 +0,0 @@ - * -awesome content - */ - - process_tree_to_tree_diffing("7fccd7", "806999"); - - cl_assert_equal_i(3, expect.files); - cl_assert_equal_i(2, expect.file_status[GIT_DELTA_DELETED]); - cl_assert_equal_i(0, expect.file_status[GIT_DELTA_MODIFIED]); - cl_assert_equal_i(1, expect.file_status[GIT_DELTA_ADDED]); - cl_assert_equal_i(0, expect.file_status[GIT_DELTA_TYPECHANGE]); -} - -void test_diff_tree__symlink_blob_mode_changed_to_regular_file_as_typechange(void) -{ - /* - * $ git diff 7fccd7..a8595c - * diff --git a/include/Nu/Nu.h b/include/Nu/Nu.h - * deleted file mode 120000 - * index 19bf568..0000000 - * --- a/include/Nu/Nu.h - * +++ /dev/null - * @@ -1 +0,0 @@ - * -../../objc/Nu.h - * \ No newline at end of file - * diff --git a/include/Nu/Nu.h b/include/Nu/Nu.h - * new file mode 100755 - * index 0000000..f9e6561 - * --- /dev/null - * +++ b/include/Nu/Nu.h - * @@ -0,0 +1 @@ - * +awesome content - * diff --git a/objc/Nu.h b/objc/Nu.h - * deleted file mode 100644 - * index f9e6561..0000000 - * --- a/objc/Nu.h - * +++ /dev/null - * @@ -1 +0,0 @@ - * -awesome content - */ - - opts.flags = GIT_DIFF_INCLUDE_TYPECHANGE; - process_tree_to_tree_diffing("7fccd7", "a8595c"); - - cl_assert_equal_i(2, expect.files); - cl_assert_equal_i(1, expect.file_status[GIT_DELTA_DELETED]); - cl_assert_equal_i(0, expect.file_status[GIT_DELTA_MODIFIED]); - cl_assert_equal_i(0, expect.file_status[GIT_DELTA_ADDED]); - cl_assert_equal_i(1, expect.file_status[GIT_DELTA_TYPECHANGE]); -} - -void test_diff_tree__regular_blob_mode_changed_to_executable_file(void) -{ - /* - * $ git diff 806999..a8595c - * diff --git a/include/Nu/Nu.h b/include/Nu/Nu.h - * old mode 100644 - * new mode 100755 - */ - - process_tree_to_tree_diffing("806999", "a8595c"); - - cl_assert_equal_i(1, expect.files); - cl_assert_equal_i(0, expect.file_status[GIT_DELTA_DELETED]); - cl_assert_equal_i(1, expect.file_status[GIT_DELTA_MODIFIED]); - cl_assert_equal_i(0, expect.file_status[GIT_DELTA_ADDED]); - cl_assert_equal_i(0, expect.file_status[GIT_DELTA_TYPECHANGE]); -} - -void test_diff_tree__issue_1397(void) -{ - /* this test shows that it is not needed */ - - g_repo = cl_git_sandbox_init("issue_1397"); - - cl_repo_set_bool(g_repo, "core.autocrlf", true); - - cl_assert((a = resolve_commit_oid_to_tree(g_repo, "8a7ef04")) != NULL); - cl_assert((b = resolve_commit_oid_to_tree(g_repo, "7f483a7")) != NULL); - - cl_git_pass(git_diff_tree_to_tree(&diff, g_repo, a, b, &opts)); - - cl_git_pass(git_diff_foreach(diff, - diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &expect)); - - cl_assert_equal_i(1, expect.files); - cl_assert_equal_i(0, expect.file_status[GIT_DELTA_DELETED]); - cl_assert_equal_i(1, expect.file_status[GIT_DELTA_MODIFIED]); - cl_assert_equal_i(0, expect.file_status[GIT_DELTA_ADDED]); - cl_assert_equal_i(0, expect.file_status[GIT_DELTA_TYPECHANGE]); -} - -static void set_config_int(git_repository *repo, const char *name, int value) -{ - git_config *cfg; - - cl_git_pass(git_repository_config(&cfg, repo)); - cl_git_pass(git_config_set_int32(cfg, name, value)); - git_config_free(cfg); -} - -void test_diff_tree__diff_configs(void) -{ - const char *a_commit = "d70d245e"; - const char *b_commit = "7a9e0b02"; - - g_repo = cl_git_sandbox_init("diff"); - - cl_assert((a = resolve_commit_oid_to_tree(g_repo, a_commit)) != NULL); - cl_assert((b = resolve_commit_oid_to_tree(g_repo, b_commit)) != NULL); - - cl_git_pass(git_diff_tree_to_tree(&diff, g_repo, a, b, NULL)); - - cl_git_pass(git_diff_foreach(diff, - diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &expect)); - - cl_assert_equal_i(2, expect.files); - cl_assert_equal_i(2, expect.file_status[GIT_DELTA_MODIFIED]); - cl_assert_equal_i(6, expect.hunks); - cl_assert_equal_i(55, expect.lines); - cl_assert_equal_i(33, expect.line_ctxt); - cl_assert_equal_i(7, expect.line_adds); - cl_assert_equal_i(15, expect.line_dels); - - git_diff_free(diff); - diff = NULL; - - set_config_int(g_repo, "diff.context", 1); - - memset(&expect, 0, sizeof(expect)); - - cl_git_pass(git_diff_tree_to_tree(&diff, g_repo, a, b, NULL)); - - cl_git_pass(git_diff_foreach(diff, - diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &expect)); - - cl_assert_equal_i(2, expect.files); - cl_assert_equal_i(2, expect.file_status[GIT_DELTA_MODIFIED]); - cl_assert_equal_i(7, expect.hunks); - cl_assert_equal_i(34, expect.lines); - cl_assert_equal_i(12, expect.line_ctxt); - cl_assert_equal_i(7, expect.line_adds); - cl_assert_equal_i(15, expect.line_dels); - - git_diff_free(diff); - diff = NULL; - - set_config_int(g_repo, "diff.context", 0); - set_config_int(g_repo, "diff.noprefix", 1); - - memset(&expect, 0, sizeof(expect)); - - cl_git_pass(git_diff_tree_to_tree(&diff, g_repo, a, b, NULL)); - - cl_git_pass(git_diff_foreach(diff, - diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &expect)); - - cl_assert_equal_i(2, expect.files); - cl_assert_equal_i(2, expect.file_status[GIT_DELTA_MODIFIED]); - cl_assert_equal_i(7, expect.hunks); - cl_assert_equal_i(22, expect.lines); - cl_assert_equal_i(0, expect.line_ctxt); - cl_assert_equal_i(7, expect.line_adds); - cl_assert_equal_i(15, expect.line_dels); -} diff --git a/vendor/libgit2/tests/diff/workdir.c b/vendor/libgit2/tests/diff/workdir.c deleted file mode 100644 index 8a23f53ae7..0000000000 --- a/vendor/libgit2/tests/diff/workdir.c +++ /dev/null @@ -1,1846 +0,0 @@ -#include "clar_libgit2.h" -#include "diff_helpers.h" -#include "repository.h" -#include "git2/sys/diff.h" -#include "../checkout/checkout_helpers.h" - -static git_repository *g_repo = NULL; - -void test_diff_workdir__cleanup(void) -{ - cl_git_sandbox_cleanup(); -} - -void test_diff_workdir__to_index(void) -{ - git_diff_options opts = GIT_DIFF_OPTIONS_INIT; - git_diff *diff = NULL; - diff_expects exp; - int use_iterator; - - g_repo = cl_git_sandbox_init("status"); - - opts.context_lines = 3; - opts.interhunk_lines = 1; - opts.flags |= GIT_DIFF_INCLUDE_IGNORED | GIT_DIFF_INCLUDE_UNTRACKED; - - cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, NULL, &opts)); - - for (use_iterator = 0; use_iterator <= 1; use_iterator++) { - memset(&exp, 0, sizeof(exp)); - - if (use_iterator) - cl_git_pass(diff_foreach_via_iterator( - diff, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &exp)); - else - cl_git_pass(git_diff_foreach( - diff, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &exp)); - - /* to generate these values: - * - cd to tests/resources/status, - * - mv .gitted .git - * - git diff --name-status - * - git diff - * - mv .git .gitted - */ - cl_assert_equal_i(13, exp.files); - cl_assert_equal_i(0, exp.file_status[GIT_DELTA_ADDED]); - cl_assert_equal_i(4, exp.file_status[GIT_DELTA_DELETED]); - cl_assert_equal_i(4, exp.file_status[GIT_DELTA_MODIFIED]); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_IGNORED]); - cl_assert_equal_i(4, exp.file_status[GIT_DELTA_UNTRACKED]); - - cl_assert_equal_i(8, exp.hunks); - - cl_assert_equal_i(14, exp.lines); - cl_assert_equal_i(5, exp.line_ctxt); - cl_assert_equal_i(4, exp.line_adds); - cl_assert_equal_i(5, exp.line_dels); - } - - { - git_diff_perfdata perf = GIT_DIFF_PERFDATA_INIT; - cl_git_pass(git_diff_get_perfdata(&perf, diff)); - cl_assert_equal_sz( - 13 /* in root */ + 3 /* in subdir */, perf.stat_calls); - cl_assert_equal_sz(5, perf.oid_calculations); - } - - git_diff_free(diff); -} - -void test_diff_workdir__to_index_with_conflicts(void) -{ - git_diff_options opts = GIT_DIFF_OPTIONS_INIT; - git_diff *diff = NULL; - git_index *index; - git_index_entry our_entry = {{0}}, their_entry = {{0}}; - diff_expects exp = {0}; - - g_repo = cl_git_sandbox_init("status"); - - opts.context_lines = 3; - opts.interhunk_lines = 1; - - /* Adding an entry that represents a rename gets two files in conflict */ - our_entry.path = "subdir/modified_file"; - our_entry.mode = 0100644; - - their_entry.path = "subdir/rename_conflict"; - their_entry.mode = 0100644; - - cl_git_pass(git_repository_index(&index, g_repo)); - cl_git_pass(git_index_conflict_add(index, NULL, &our_entry, &their_entry)); - - cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, index, &opts)); - - cl_git_pass(diff_foreach_via_iterator( - diff, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &exp)); - - cl_assert_equal_i(9, exp.files); - cl_assert_equal_i(0, exp.file_status[GIT_DELTA_ADDED]); - cl_assert_equal_i(4, exp.file_status[GIT_DELTA_DELETED]); - cl_assert_equal_i(3, exp.file_status[GIT_DELTA_MODIFIED]); - cl_assert_equal_i(2, exp.file_status[GIT_DELTA_CONFLICTED]); - - cl_assert_equal_i(7, exp.hunks); - - cl_assert_equal_i(12, exp.lines); - cl_assert_equal_i(4, exp.line_ctxt); - cl_assert_equal_i(3, exp.line_adds); - cl_assert_equal_i(5, exp.line_dels); - - git_diff_free(diff); - git_index_free(index); -} - -void test_diff_workdir__to_index_with_assume_unchanged(void) -{ - git_diff_options opts = GIT_DIFF_OPTIONS_INIT; - git_diff *diff = NULL; - git_index *idx = NULL; - diff_expects exp; - const git_index_entry *iep; - git_index_entry ie; - - g_repo = cl_git_sandbox_init("status"); - - /* do initial diff */ - - cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, NULL, &opts)); - memset(&exp, 0, sizeof(exp)); - cl_git_pass(git_diff_foreach( - diff, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &exp)); - cl_assert_equal_i(8, exp.files); - cl_assert_equal_i(0, exp.file_status[GIT_DELTA_ADDED]); - cl_assert_equal_i(4, exp.file_status[GIT_DELTA_DELETED]); - cl_assert_equal_i(4, exp.file_status[GIT_DELTA_MODIFIED]); - git_diff_free(diff); - - /* mark a couple of entries with ASSUME_UNCHANGED */ - - cl_git_pass(git_repository_index(&idx, g_repo)); - - cl_assert((iep = git_index_get_bypath(idx, "modified_file", 0)) != NULL); - memcpy(&ie, iep, sizeof(ie)); - ie.flags |= GIT_IDXENTRY_VALID; - cl_git_pass(git_index_add(idx, &ie)); - - cl_assert((iep = git_index_get_bypath(idx, "file_deleted", 0)) != NULL); - memcpy(&ie, iep, sizeof(ie)); - ie.flags |= GIT_IDXENTRY_VALID; - cl_git_pass(git_index_add(idx, &ie)); - - cl_git_pass(git_index_write(idx)); - git_index_free(idx); - - /* redo diff and see that entries are skipped */ - - cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, NULL, &opts)); - memset(&exp, 0, sizeof(exp)); - cl_git_pass(git_diff_foreach( - diff, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &exp)); - cl_assert_equal_i(6, exp.files); - cl_assert_equal_i(0, exp.file_status[GIT_DELTA_ADDED]); - cl_assert_equal_i(3, exp.file_status[GIT_DELTA_DELETED]); - cl_assert_equal_i(3, exp.file_status[GIT_DELTA_MODIFIED]); - git_diff_free(diff); - -} - -void test_diff_workdir__to_tree(void) -{ - /* grabbed a couple of commit oids from the history of the attr repo */ - const char *a_commit = "26a125ee1bf"; /* the current HEAD */ - const char *b_commit = "0017bd4ab1ec3"; /* the start */ - git_tree *a, *b; - git_diff_options opts = GIT_DIFF_OPTIONS_INIT; - git_diff *diff = NULL; - git_diff *diff2 = NULL; - diff_expects exp; - int use_iterator; - - g_repo = cl_git_sandbox_init("status"); - - a = resolve_commit_oid_to_tree(g_repo, a_commit); - b = resolve_commit_oid_to_tree(g_repo, b_commit); - - opts.context_lines = 3; - opts.interhunk_lines = 1; - opts.flags |= GIT_DIFF_INCLUDE_IGNORED | GIT_DIFF_INCLUDE_UNTRACKED; - - /* You can't really generate the equivalent of git_diff_tree_to_workdir() - * using C git. It really wants to interpose the index into the diff. - * - * To validate the following results with command line git, I ran the - * following: - * - git ls-tree 26a125 - * - find . ! -path ./.git/\* -a -type f | git hash-object --stdin-paths - * The results are documented at the bottom of this file in the - * long comment entitled "PREPARATION OF TEST DATA". - */ - cl_git_pass(git_diff_tree_to_workdir(&diff, g_repo, a, &opts)); - - for (use_iterator = 0; use_iterator <= 1; use_iterator++) { - memset(&exp, 0, sizeof(exp)); - - if (use_iterator) - cl_git_pass(diff_foreach_via_iterator( - diff, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &exp)); - else - cl_git_pass(git_diff_foreach( - diff, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &exp)); - - cl_assert_equal_i(14, exp.files); - cl_assert_equal_i(0, exp.file_status[GIT_DELTA_ADDED]); - cl_assert_equal_i(4, exp.file_status[GIT_DELTA_DELETED]); - cl_assert_equal_i(4, exp.file_status[GIT_DELTA_MODIFIED]); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_IGNORED]); - cl_assert_equal_i(5, exp.file_status[GIT_DELTA_UNTRACKED]); - } - - /* Since there is no git diff equivalent, let's just assume that the - * text diffs produced by git_diff_foreach are accurate here. We will - * do more apples-to-apples test comparison below. - */ - - git_diff_free(diff); - diff = NULL; - memset(&exp, 0, sizeof(exp)); - - /* This is a compatible emulation of "git diff " which looks like - * a workdir to tree diff (even though it is not really). This is what - * you would get from "git diff --name-status 26a125ee1bf" - */ - cl_git_pass(git_diff_tree_to_index(&diff, g_repo, a, NULL, &opts)); - cl_git_pass(git_diff_index_to_workdir(&diff2, g_repo, NULL, &opts)); - cl_git_pass(git_diff_merge(diff, diff2)); - git_diff_free(diff2); - - for (use_iterator = 0; use_iterator <= 1; use_iterator++) { - memset(&exp, 0, sizeof(exp)); - - if (use_iterator) - cl_git_pass(diff_foreach_via_iterator( - diff, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &exp)); - else - cl_git_pass(git_diff_foreach( - diff, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &exp)); - - cl_assert_equal_i(15, exp.files); - cl_assert_equal_i(2, exp.file_status[GIT_DELTA_ADDED]); - cl_assert_equal_i(5, exp.file_status[GIT_DELTA_DELETED]); - cl_assert_equal_i(4, exp.file_status[GIT_DELTA_MODIFIED]); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_IGNORED]); - cl_assert_equal_i(3, exp.file_status[GIT_DELTA_UNTRACKED]); - - cl_assert_equal_i(11, exp.hunks); - - cl_assert_equal_i(17, exp.lines); - cl_assert_equal_i(4, exp.line_ctxt); - cl_assert_equal_i(8, exp.line_adds); - cl_assert_equal_i(5, exp.line_dels); - } - - git_diff_free(diff); - diff = NULL; - memset(&exp, 0, sizeof(exp)); - - /* Again, emulating "git diff " for testing purposes using - * "git diff --name-status 0017bd4ab1ec3" instead. - */ - cl_git_pass(git_diff_tree_to_index(&diff, g_repo, b, NULL, &opts)); - cl_git_pass(git_diff_index_to_workdir(&diff2, g_repo, NULL, &opts)); - cl_git_pass(git_diff_merge(diff, diff2)); - git_diff_free(diff2); - - for (use_iterator = 0; use_iterator <= 1; use_iterator++) { - memset(&exp, 0, sizeof(exp)); - - if (use_iterator) - cl_git_pass(diff_foreach_via_iterator( - diff, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &exp)); - else - cl_git_pass(git_diff_foreach( - diff, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &exp)); - - cl_assert_equal_i(16, exp.files); - cl_assert_equal_i(5, exp.file_status[GIT_DELTA_ADDED]); - cl_assert_equal_i(4, exp.file_status[GIT_DELTA_DELETED]); - cl_assert_equal_i(3, exp.file_status[GIT_DELTA_MODIFIED]); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_IGNORED]); - cl_assert_equal_i(3, exp.file_status[GIT_DELTA_UNTRACKED]); - - cl_assert_equal_i(12, exp.hunks); - - cl_assert_equal_i(19, exp.lines); - cl_assert_equal_i(3, exp.line_ctxt); - cl_assert_equal_i(12, exp.line_adds); - cl_assert_equal_i(4, exp.line_dels); - } - - git_diff_free(diff); - - /* Let's try that once more with a reversed diff */ - - opts.flags |= GIT_DIFF_REVERSE; - - cl_git_pass(git_diff_tree_to_index(&diff, g_repo, b, NULL, &opts)); - cl_git_pass(git_diff_index_to_workdir(&diff2, g_repo, NULL, &opts)); - cl_git_pass(git_diff_merge(diff, diff2)); - git_diff_free(diff2); - - memset(&exp, 0, sizeof(exp)); - - cl_git_pass(git_diff_foreach( - diff, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &exp)); - - cl_assert_equal_i(16, exp.files); - cl_assert_equal_i(5, exp.file_status[GIT_DELTA_DELETED]); - cl_assert_equal_i(4, exp.file_status[GIT_DELTA_ADDED]); - cl_assert_equal_i(3, exp.file_status[GIT_DELTA_MODIFIED]); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_IGNORED]); - cl_assert_equal_i(3, exp.file_status[GIT_DELTA_UNTRACKED]); - - cl_assert_equal_i(12, exp.hunks); - - cl_assert_equal_i(19, exp.lines); - cl_assert_equal_i(3, exp.line_ctxt); - cl_assert_equal_i(12, exp.line_dels); - cl_assert_equal_i(4, exp.line_adds); - - git_diff_free(diff); - - /* all done now */ - - git_tree_free(a); - git_tree_free(b); -} - -void test_diff_workdir__to_index_with_pathspec(void) -{ - git_diff_options opts = GIT_DIFF_OPTIONS_INIT; - git_diff *diff = NULL; - diff_expects exp; - char *pathspec = NULL; - int use_iterator; - - g_repo = cl_git_sandbox_init("status"); - - opts.context_lines = 3; - opts.interhunk_lines = 1; - opts.flags |= GIT_DIFF_INCLUDE_IGNORED | GIT_DIFF_INCLUDE_UNTRACKED; - opts.pathspec.strings = &pathspec; - opts.pathspec.count = 1; - - cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, NULL, &opts)); - - for (use_iterator = 0; use_iterator <= 1; use_iterator++) { - memset(&exp, 0, sizeof(exp)); - - if (use_iterator) - cl_git_pass(diff_foreach_via_iterator( - diff, diff_file_cb, NULL, NULL, NULL, &exp)); - else - cl_git_pass(git_diff_foreach(diff, diff_file_cb, NULL, NULL, NULL, &exp)); - - cl_assert_equal_i(13, exp.files); - cl_assert_equal_i(0, exp.file_status[GIT_DELTA_ADDED]); - cl_assert_equal_i(4, exp.file_status[GIT_DELTA_DELETED]); - cl_assert_equal_i(4, exp.file_status[GIT_DELTA_MODIFIED]); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_IGNORED]); - cl_assert_equal_i(4, exp.file_status[GIT_DELTA_UNTRACKED]); - } - - git_diff_free(diff); - - pathspec = "modified_file"; - - cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, NULL, &opts)); - - for (use_iterator = 0; use_iterator <= 1; use_iterator++) { - memset(&exp, 0, sizeof(exp)); - - if (use_iterator) - cl_git_pass(diff_foreach_via_iterator( - diff, diff_file_cb, NULL, NULL, NULL, &exp)); - else - cl_git_pass(git_diff_foreach(diff, diff_file_cb, NULL, NULL, NULL, &exp)); - - cl_assert_equal_i(1, exp.files); - cl_assert_equal_i(0, exp.file_status[GIT_DELTA_ADDED]); - cl_assert_equal_i(0, exp.file_status[GIT_DELTA_DELETED]); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_MODIFIED]); - cl_assert_equal_i(0, exp.file_status[GIT_DELTA_IGNORED]); - cl_assert_equal_i(0, exp.file_status[GIT_DELTA_UNTRACKED]); - } - - git_diff_free(diff); - - pathspec = "subdir"; - - cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, NULL, &opts)); - - for (use_iterator = 0; use_iterator <= 1; use_iterator++) { - memset(&exp, 0, sizeof(exp)); - - if (use_iterator) - cl_git_pass(diff_foreach_via_iterator( - diff, diff_file_cb, NULL, NULL, NULL, &exp)); - else - cl_git_pass(git_diff_foreach(diff, diff_file_cb, NULL, NULL, NULL, &exp)); - - cl_assert_equal_i(3, exp.files); - cl_assert_equal_i(0, exp.file_status[GIT_DELTA_ADDED]); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_DELETED]); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_MODIFIED]); - cl_assert_equal_i(0, exp.file_status[GIT_DELTA_IGNORED]); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_UNTRACKED]); - } - - git_diff_free(diff); - - pathspec = "*_deleted"; - - cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, NULL, &opts)); - - for (use_iterator = 0; use_iterator <= 1; use_iterator++) { - memset(&exp, 0, sizeof(exp)); - - if (use_iterator) - cl_git_pass(diff_foreach_via_iterator( - diff, diff_file_cb, NULL, NULL, NULL, &exp)); - else - cl_git_pass(git_diff_foreach(diff, diff_file_cb, NULL, NULL, NULL, &exp)); - - cl_assert_equal_i(2, exp.files); - cl_assert_equal_i(0, exp.file_status[GIT_DELTA_ADDED]); - cl_assert_equal_i(2, exp.file_status[GIT_DELTA_DELETED]); - cl_assert_equal_i(0, exp.file_status[GIT_DELTA_MODIFIED]); - cl_assert_equal_i(0, exp.file_status[GIT_DELTA_IGNORED]); - cl_assert_equal_i(0, exp.file_status[GIT_DELTA_UNTRACKED]); - } - - git_diff_free(diff); -} - -void test_diff_workdir__filemode_changes(void) -{ - git_diff *diff = NULL; - diff_expects exp; - int use_iterator; - - if (!cl_is_chmod_supported()) - return; - - g_repo = cl_git_sandbox_init("issue_592"); - - cl_repo_set_bool(g_repo, "core.filemode", true); - - /* test once with no mods */ - - cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, NULL, NULL)); - - for (use_iterator = 0; use_iterator <= 1; use_iterator++) { - memset(&exp, 0, sizeof(exp)); - - if (use_iterator) - cl_git_pass(diff_foreach_via_iterator( - diff, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &exp)); - else - cl_git_pass(git_diff_foreach( - diff, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &exp)); - - cl_assert_equal_i(0, exp.files); - cl_assert_equal_i(0, exp.file_status[GIT_DELTA_MODIFIED]); - cl_assert_equal_i(0, exp.hunks); - } - - git_diff_free(diff); - - /* chmod file and test again */ - - cl_assert(cl_toggle_filemode("issue_592/a.txt")); - - cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, NULL, NULL)); - - for (use_iterator = 0; use_iterator <= 1; use_iterator++) { - memset(&exp, 0, sizeof(exp)); - - if (use_iterator) - cl_git_pass(diff_foreach_via_iterator( - diff, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &exp)); - else - cl_git_pass(git_diff_foreach( - diff, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &exp)); - - cl_assert_equal_i(1, exp.files); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_MODIFIED]); - cl_assert_equal_i(0, exp.hunks); - } - - git_diff_free(diff); - - cl_assert(cl_toggle_filemode("issue_592/a.txt")); -} - -void test_diff_workdir__filemode_changes_with_filemode_false(void) -{ - git_diff *diff = NULL; - diff_expects exp; - - if (!cl_is_chmod_supported()) - return; - - g_repo = cl_git_sandbox_init("issue_592"); - - cl_repo_set_bool(g_repo, "core.filemode", false); - - /* test once with no mods */ - - cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, NULL, NULL)); - - memset(&exp, 0, sizeof(exp)); - cl_git_pass(git_diff_foreach( - diff, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &exp)); - - cl_assert_equal_i(0, exp.files); - cl_assert_equal_i(0, exp.file_status[GIT_DELTA_MODIFIED]); - cl_assert_equal_i(0, exp.hunks); - - git_diff_free(diff); - - /* chmod file and test again */ - - cl_assert(cl_toggle_filemode("issue_592/a.txt")); - - cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, NULL, NULL)); - - memset(&exp, 0, sizeof(exp)); - cl_git_pass(git_diff_foreach(diff, - diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &exp)); - - cl_assert_equal_i(0, exp.files); - cl_assert_equal_i(0, exp.file_status[GIT_DELTA_MODIFIED]); - cl_assert_equal_i(0, exp.hunks); - - git_diff_free(diff); - - cl_assert(cl_toggle_filemode("issue_592/a.txt")); -} - -void test_diff_workdir__head_index_and_workdir_all_differ(void) -{ - git_diff_options opts = GIT_DIFF_OPTIONS_INIT; - git_diff *diff_i2t = NULL, *diff_w2i = NULL; - diff_expects exp; - char *pathspec = "staged_changes_modified_file"; - git_tree *tree; - int use_iterator; - - /* For this file, - * - head->index diff has 1 line of context, 1 line of diff - * - index->workdir diff has 2 lines of context, 1 line of diff - * but - * - head->workdir diff has 1 line of context, 2 lines of diff - * Let's make sure the right one is returned from each fn. - */ - - g_repo = cl_git_sandbox_init("status"); - - tree = resolve_commit_oid_to_tree(g_repo, "26a125ee1bfc5df1e1b2e9441bbe63c8a7ae989f"); - - opts.pathspec.strings = &pathspec; - opts.pathspec.count = 1; - - cl_git_pass(git_diff_tree_to_index(&diff_i2t, g_repo, tree, NULL, &opts)); - cl_git_pass(git_diff_index_to_workdir(&diff_w2i, g_repo, NULL, &opts)); - - for (use_iterator = 0; use_iterator <= 1; use_iterator++) { - memset(&exp, 0, sizeof(exp)); - - if (use_iterator) - cl_git_pass(diff_foreach_via_iterator( - diff_i2t, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &exp)); - else - cl_git_pass(git_diff_foreach( - diff_i2t, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &exp)); - - cl_assert_equal_i(1, exp.files); - cl_assert_equal_i(0, exp.file_status[GIT_DELTA_ADDED]); - cl_assert_equal_i(0, exp.file_status[GIT_DELTA_DELETED]); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_MODIFIED]); - cl_assert_equal_i(1, exp.hunks); - cl_assert_equal_i(2, exp.lines); - cl_assert_equal_i(1, exp.line_ctxt); - cl_assert_equal_i(1, exp.line_adds); - cl_assert_equal_i(0, exp.line_dels); - } - - for (use_iterator = 0; use_iterator <= 1; use_iterator++) { - memset(&exp, 0, sizeof(exp)); - - if (use_iterator) - cl_git_pass(diff_foreach_via_iterator( - diff_w2i, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &exp)); - else - cl_git_pass(git_diff_foreach( - diff_w2i, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &exp)); - - cl_assert_equal_i(1, exp.files); - cl_assert_equal_i(0, exp.file_status[GIT_DELTA_ADDED]); - cl_assert_equal_i(0, exp.file_status[GIT_DELTA_DELETED]); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_MODIFIED]); - cl_assert_equal_i(1, exp.hunks); - cl_assert_equal_i(3, exp.lines); - cl_assert_equal_i(2, exp.line_ctxt); - cl_assert_equal_i(1, exp.line_adds); - cl_assert_equal_i(0, exp.line_dels); - } - - cl_git_pass(git_diff_merge(diff_i2t, diff_w2i)); - - for (use_iterator = 0; use_iterator <= 1; use_iterator++) { - memset(&exp, 0, sizeof(exp)); - - if (use_iterator) - cl_git_pass(diff_foreach_via_iterator( - diff_i2t, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &exp)); - else - cl_git_pass(git_diff_foreach( - diff_i2t, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &exp)); - - cl_assert_equal_i(1, exp.files); - cl_assert_equal_i(0, exp.file_status[GIT_DELTA_ADDED]); - cl_assert_equal_i(0, exp.file_status[GIT_DELTA_DELETED]); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_MODIFIED]); - cl_assert_equal_i(1, exp.hunks); - cl_assert_equal_i(3, exp.lines); - cl_assert_equal_i(1, exp.line_ctxt); - cl_assert_equal_i(2, exp.line_adds); - cl_assert_equal_i(0, exp.line_dels); - } - - git_diff_free(diff_i2t); - git_diff_free(diff_w2i); - - git_tree_free(tree); -} - -void test_diff_workdir__eof_newline_changes(void) -{ - git_diff_options opts = GIT_DIFF_OPTIONS_INIT; - git_diff *diff = NULL; - diff_expects exp; - char *pathspec = "current_file"; - int use_iterator; - - g_repo = cl_git_sandbox_init("status"); - - opts.pathspec.strings = &pathspec; - opts.pathspec.count = 1; - - cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, NULL, &opts)); - - for (use_iterator = 0; use_iterator <= 1; use_iterator++) { - memset(&exp, 0, sizeof(exp)); - - if (use_iterator) - cl_git_pass(diff_foreach_via_iterator( - diff, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &exp)); - else - cl_git_pass(git_diff_foreach( - diff, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &exp)); - - cl_assert_equal_i(0, exp.files); - cl_assert_equal_i(0, exp.file_status[GIT_DELTA_ADDED]); - cl_assert_equal_i(0, exp.file_status[GIT_DELTA_DELETED]); - cl_assert_equal_i(0, exp.file_status[GIT_DELTA_MODIFIED]); - cl_assert_equal_i(0, exp.hunks); - cl_assert_equal_i(0, exp.lines); - cl_assert_equal_i(0, exp.line_ctxt); - cl_assert_equal_i(0, exp.line_adds); - cl_assert_equal_i(0, exp.line_dels); - } - - git_diff_free(diff); - - cl_git_append2file("status/current_file", "\n"); - - cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, NULL, &opts)); - - for (use_iterator = 0; use_iterator <= 1; use_iterator++) { - memset(&exp, 0, sizeof(exp)); - - if (use_iterator) - cl_git_pass(diff_foreach_via_iterator( - diff, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &exp)); - else - cl_git_pass(git_diff_foreach( - diff, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &exp)); - - cl_assert_equal_i(1, exp.files); - cl_assert_equal_i(0, exp.file_status[GIT_DELTA_ADDED]); - cl_assert_equal_i(0, exp.file_status[GIT_DELTA_DELETED]); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_MODIFIED]); - cl_assert_equal_i(1, exp.hunks); - cl_assert_equal_i(2, exp.lines); - cl_assert_equal_i(1, exp.line_ctxt); - cl_assert_equal_i(1, exp.line_adds); - cl_assert_equal_i(0, exp.line_dels); - } - - git_diff_free(diff); - - cl_git_rewritefile("status/current_file", "current_file"); - - cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, NULL, &opts)); - - for (use_iterator = 0; use_iterator <= 1; use_iterator++) { - memset(&exp, 0, sizeof(exp)); - - if (use_iterator) - cl_git_pass(diff_foreach_via_iterator( - diff, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &exp)); - else - cl_git_pass(git_diff_foreach( - diff, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &exp)); - - cl_assert_equal_i(1, exp.files); - cl_assert_equal_i(0, exp.file_status[GIT_DELTA_ADDED]); - cl_assert_equal_i(0, exp.file_status[GIT_DELTA_DELETED]); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_MODIFIED]); - cl_assert_equal_i(1, exp.hunks); - cl_assert_equal_i(3, exp.lines); - cl_assert_equal_i(0, exp.line_ctxt); - cl_assert_equal_i(1, exp.line_adds); - cl_assert_equal_i(2, exp.line_dels); - } - - git_diff_free(diff); -} - -/* PREPARATION OF TEST DATA - * - * Since there is no command line equivalent of git_diff_tree_to_workdir, - * it was a bit of a pain to confirm that I was getting the expected - * results in the first part of this tests. Here is what I ended up - * doing to set my expectation for the file counts and results: - * - * Running "git ls-tree 26a125" and "git ls-tree aa27a6" shows: - * - * A a0de7e0ac200c489c41c59dfa910154a70264e6e current_file - * B 5452d32f1dd538eb0405e8a83cc185f79e25e80f file_deleted - * C 452e4244b5d083ddf0460acf1ecc74db9dcfa11a modified_file - * D 32504b727382542f9f089e24fddac5e78533e96c staged_changes - * E 061d42a44cacde5726057b67558821d95db96f19 staged_changes_file_deleted - * F 70bd9443ada07063e7fbf0b3ff5c13f7494d89c2 staged_changes_modified_file - * G e9b9107f290627c04d097733a10055af941f6bca staged_delete_file_deleted - * H dabc8af9bd6e9f5bbe96a176f1a24baf3d1f8916 staged_delete_modified_file - * I 53ace0d1cc1145a5f4fe4f78a186a60263190733 subdir/current_file - * J 1888c805345ba265b0ee9449b8877b6064592058 subdir/deleted_file - * K a6191982709b746d5650e93c2acf34ef74e11504 subdir/modified_file - * L e8ee89e15bbe9b20137715232387b3de5b28972e subdir.txt - * - * -------- - * - * find . ! -path ./.git/\* -a -type f | git hash-object --stdin-paths - * - * A a0de7e0ac200c489c41c59dfa910154a70264e6e current_file - * M 6a79f808a9c6bc9531ac726c184bbcd9351ccf11 ignored_file - * C 0a539630525aca2e7bc84975958f92f10a64c9b6 modified_file - * N d4fa8600b4f37d7516bef4816ae2c64dbf029e3a new_file - * D 55d316c9ba708999f1918e9677d01dfcae69c6b9 staged_changes - * F 011c3440d5c596e21d836aa6d7b10eb581f68c49 staged_changes_modified_file - * H dabc8af9bd6e9f5bbe96a176f1a24baf3d1f8916 staged_delete_modified_file - * O 529a16e8e762d4acb7b9636ff540a00831f9155a staged_new_file - * P 8b090c06d14ffa09c4e880088ebad33893f921d1 staged_new_file_modified_file - * I 53ace0d1cc1145a5f4fe4f78a186a60263190733 subdir/current_file - * K 57274b75eeb5f36fd55527806d567b2240a20c57 subdir/modified_file - * Q 80a86a6931b91bc01c2dbf5ca55bdd24ad1ef466 subdir/new_file - * L e8ee89e15bbe9b20137715232387b3de5b28972e subdir.txt - * - * -------- - * - * A - current_file (UNMODIFIED) -> not in results - * B D file_deleted - * M I ignored_file (IGNORED) - * C M modified_file - * N U new_file (UNTRACKED) - * D M staged_changes - * E D staged_changes_file_deleted - * F M staged_changes_modified_file - * G D staged_delete_file_deleted - * H - staged_delete_modified_file (UNMODIFIED) -> not in results - * O U staged_new_file - * P U staged_new_file_modified_file - * I - subdir/current_file (UNMODIFIED) -> not in results - * J D subdir/deleted_file - * K M subdir/modified_file - * Q U subdir/new_file - * L - subdir.txt (UNMODIFIED) -> not in results - * - * Expect 13 files, 0 ADD, 4 DEL, 4 MOD, 1 IGN, 4 UNTR - */ - - -void test_diff_workdir__larger_hunks(void) -{ - const char *a_commit = "d70d245ed97ed2aa596dd1af6536e4bfdb047b69"; - const char *b_commit = "7a9e0b02e63179929fed24f0a3e0f19168114d10"; - git_tree *a, *b; - git_diff_options opts = GIT_DIFF_OPTIONS_INIT; - size_t i, d, num_d, h, num_h, l, num_l; - - g_repo = cl_git_sandbox_init("diff"); - - cl_assert((a = resolve_commit_oid_to_tree(g_repo, a_commit)) != NULL); - cl_assert((b = resolve_commit_oid_to_tree(g_repo, b_commit)) != NULL); - - opts.context_lines = 1; - opts.interhunk_lines = 0; - - for (i = 0; i <= 2; ++i) { - git_diff *diff = NULL; - git_patch *patch; - const git_diff_hunk *hunk; - const git_diff_line *line; - - /* okay, this is a bit silly, but oh well */ - switch (i) { - case 0: - cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, NULL, &opts)); - break; - case 1: - cl_git_pass(git_diff_tree_to_workdir(&diff, g_repo, a, &opts)); - break; - case 2: - cl_git_pass(git_diff_tree_to_workdir(&diff, g_repo, b, &opts)); - break; - } - - num_d = git_diff_num_deltas(diff); - cl_assert_equal_i(2, (int)num_d); - - for (d = 0; d < num_d; ++d) { - cl_git_pass(git_patch_from_diff(&patch, diff, d)); - cl_assert(patch); - - num_h = git_patch_num_hunks(patch); - for (h = 0; h < num_h; h++) { - cl_git_pass(git_patch_get_hunk(&hunk, &num_l, patch, h)); - - for (l = 0; l < num_l; ++l) { - cl_git_pass( - git_patch_get_line_in_hunk(&line, patch, h, l)); - cl_assert(line); - } - - /* confirm fail after the last item */ - cl_git_fail( - git_patch_get_line_in_hunk(&line, patch, h, num_l)); - } - - /* confirm fail after the last item */ - cl_git_fail(git_patch_get_hunk(&hunk, &num_l, patch, num_h)); - - git_patch_free(patch); - } - - git_diff_free(diff); - } - - git_tree_free(a); - git_tree_free(b); -} - -/* Set up a test that exercises this code. The easiest test using existing - * test data is probably to create a sandbox of submod2 and then run a - * git_diff_tree_to_workdir against tree - * 873585b94bdeabccea991ea5e3ec1a277895b698. As for what you should actually - * test, you can start by just checking that the number of lines of diff - * content matches the actual output of git diff. That will at least - * demonstrate that the submodule content is being used to generate somewhat - * comparable outputs. It is a test that would fail without this code and - * will succeed with it. - */ - -#include "../submodule/submodule_helpers.h" - -void test_diff_workdir__submodules(void) -{ - const char *a_commit = "873585b94bdeabccea991ea5e3ec1a277895b698"; - git_tree *a; - git_diff_options opts = GIT_DIFF_OPTIONS_INIT; - git_diff *diff = NULL; - diff_expects exp; - - g_repo = setup_fixture_submod2(); - - a = resolve_commit_oid_to_tree(g_repo, a_commit); - - opts.flags = - GIT_DIFF_INCLUDE_UNTRACKED | - GIT_DIFF_INCLUDE_IGNORED | - GIT_DIFF_RECURSE_UNTRACKED_DIRS | - GIT_DIFF_SHOW_UNTRACKED_CONTENT; - - cl_git_pass(git_diff_tree_to_workdir(&diff, g_repo, a, &opts)); - - /* diff_print(stderr, diff); */ - - /* essentially doing: git diff 873585b94bdeabccea991ea5e3ec1a277895b698 */ - - memset(&exp, 0, sizeof(exp)); - - cl_git_pass(git_diff_foreach( - diff, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &exp)); - - /* so "git diff 873585" returns: - * M .gitmodules - * A just_a_dir/contents - * A just_a_file - * A sm_added_and_uncommited - * A sm_changed_file - * A sm_changed_head - * A sm_changed_index - * A sm_changed_untracked_file - * M sm_missing_commits - * A sm_unchanged - * which is a little deceptive because of the difference between the - * "git diff " results from "git_diff_tree_to_workdir". The - * only significant difference is that those Added items will show up - * as Untracked items in the pure libgit2 diff. - * - * Then add in the two extra untracked items "not" and "not-submodule" - * to get the 12 files reported here. - */ - - cl_assert_equal_i(12, exp.files); - - cl_assert_equal_i(0, exp.file_status[GIT_DELTA_ADDED]); - cl_assert_equal_i(0, exp.file_status[GIT_DELTA_DELETED]); - cl_assert_equal_i(2, exp.file_status[GIT_DELTA_MODIFIED]); - cl_assert_equal_i(0, exp.file_status[GIT_DELTA_IGNORED]); - cl_assert_equal_i(10, exp.file_status[GIT_DELTA_UNTRACKED]); - - /* the following numbers match "git diff 873585" exactly */ - - cl_assert_equal_i(9, exp.hunks); - - cl_assert_equal_i(33, exp.lines); - cl_assert_equal_i(2, exp.line_ctxt); - cl_assert_equal_i(30, exp.line_adds); - cl_assert_equal_i(1, exp.line_dels); - - git_diff_free(diff); - git_tree_free(a); -} - -void test_diff_workdir__cannot_diff_against_a_bare_repository(void) -{ - git_diff_options opts = GIT_DIFF_OPTIONS_INIT; - git_diff *diff = NULL; - git_tree *tree; - - g_repo = cl_git_sandbox_init("testrepo.git"); - - cl_assert_equal_i( - GIT_EBAREREPO, git_diff_index_to_workdir(&diff, g_repo, NULL, &opts)); - - cl_git_pass(git_repository_head_tree(&tree, g_repo)); - - cl_assert_equal_i( - GIT_EBAREREPO, git_diff_tree_to_workdir(&diff, g_repo, tree, &opts)); - - git_tree_free(tree); -} - -void test_diff_workdir__to_null_tree(void) -{ - git_diff *diff; - diff_expects exp; - git_diff_options opts = GIT_DIFF_OPTIONS_INIT; - - opts.flags = GIT_DIFF_INCLUDE_UNTRACKED | - GIT_DIFF_RECURSE_UNTRACKED_DIRS; - - g_repo = cl_git_sandbox_init("status"); - - cl_git_pass(git_diff_tree_to_workdir(&diff, g_repo, NULL, &opts)); - - memset(&exp, 0, sizeof(exp)); - - cl_git_pass(git_diff_foreach( - diff, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &exp)); - - cl_assert_equal_i(exp.files, exp.file_status[GIT_DELTA_UNTRACKED]); - - git_diff_free(diff); -} - -void test_diff_workdir__checks_options_version(void) -{ - git_diff *diff; - git_diff_options opts = GIT_DIFF_OPTIONS_INIT; - const git_error *err; - - g_repo = cl_git_sandbox_init("status"); - - opts.version = 0; - cl_git_fail(git_diff_tree_to_workdir(&diff, g_repo, NULL, &opts)); - err = giterr_last(); - cl_assert_equal_i(GITERR_INVALID, err->klass); - - giterr_clear(); - opts.version = 1024; - cl_git_fail(git_diff_tree_to_workdir(&diff, g_repo, NULL, &opts)); - err = giterr_last(); - cl_assert_equal_i(GITERR_INVALID, err->klass); -} - -void test_diff_workdir__can_diff_empty_file(void) -{ - git_diff *diff; - git_tree *tree; - git_diff_options opts = GIT_DIFF_OPTIONS_INIT; - struct stat st; - git_patch *patch; - - g_repo = cl_git_sandbox_init("attr_index"); - - tree = resolve_commit_oid_to_tree(g_repo, "3812cfef3661"); /* HEAD */ - - /* baseline - make sure there are no outstanding diffs */ - - cl_git_pass(git_diff_tree_to_workdir(&diff, g_repo, tree, &opts)); - cl_assert_equal_i(2, (int)git_diff_num_deltas(diff)); - git_diff_free(diff); - - /* empty contents of file */ - - cl_git_rewritefile("attr_index/README.txt", ""); - cl_git_pass(git_path_lstat("attr_index/README.txt", &st)); - cl_assert_equal_i(0, (int)st.st_size); - - cl_git_pass(git_diff_tree_to_workdir(&diff, g_repo, tree, &opts)); - cl_assert_equal_i(3, (int)git_diff_num_deltas(diff)); - /* diffs are: .gitattributes, README.txt, sub/sub/.gitattributes */ - cl_git_pass(git_patch_from_diff(&patch, diff, 1)); - git_patch_free(patch); - git_diff_free(diff); - - /* remove a file altogether */ - - cl_git_pass(p_unlink("attr_index/README.txt")); - cl_assert(!git_path_exists("attr_index/README.txt")); - - cl_git_pass(git_diff_tree_to_workdir(&diff, g_repo, tree, &opts)); - cl_assert_equal_i(3, (int)git_diff_num_deltas(diff)); - cl_git_pass(git_patch_from_diff(&patch, diff, 1)); - git_patch_free(patch); - git_diff_free(diff); - - git_tree_free(tree); -} - -void test_diff_workdir__to_index_issue_1397(void) -{ - git_diff_options opts = GIT_DIFF_OPTIONS_INIT; - git_diff *diff = NULL; - diff_expects exp; - - g_repo = cl_git_sandbox_init("issue_1397"); - - cl_repo_set_bool(g_repo, "core.autocrlf", true); - - opts.context_lines = 3; - opts.interhunk_lines = 1; - - cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, NULL, &opts)); - - memset(&exp, 0, sizeof(exp)); - cl_git_pass(git_diff_foreach( - diff, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &exp)); - - cl_assert_equal_i(0, exp.files); - cl_assert_equal_i(0, exp.hunks); - cl_assert_equal_i(0, exp.lines); - - git_diff_free(diff); - diff = NULL; - - cl_git_rewritefile("issue_1397/crlf_file.txt", - "first line\r\nsecond line modified\r\nboth with crlf"); - - cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, NULL, &opts)); - - memset(&exp, 0, sizeof(exp)); - cl_git_pass(git_diff_foreach( - diff, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &exp)); - - cl_assert_equal_i(1, exp.files); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_MODIFIED]); - - cl_assert_equal_i(1, exp.hunks); - - cl_assert_equal_i(5, exp.lines); - cl_assert_equal_i(3, exp.line_ctxt); - cl_assert_equal_i(1, exp.line_adds); - cl_assert_equal_i(1, exp.line_dels); - - git_diff_free(diff); -} - -void test_diff_workdir__to_tree_issue_1397(void) -{ - const char *a_commit = "7f483a738"; /* the current HEAD */ - git_tree *a; - git_diff_options opts = GIT_DIFF_OPTIONS_INIT; - git_diff *diff = NULL; - git_diff *diff2 = NULL; - diff_expects exp; - - g_repo = cl_git_sandbox_init("issue_1397"); - - cl_repo_set_bool(g_repo, "core.autocrlf", true); - - a = resolve_commit_oid_to_tree(g_repo, a_commit); - - opts.context_lines = 3; - opts.interhunk_lines = 1; - - cl_git_pass(git_diff_tree_to_workdir(&diff, g_repo, a, &opts)); - - memset(&exp, 0, sizeof(exp)); - cl_git_pass(git_diff_foreach( - diff, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &exp)); - - cl_assert_equal_i(0, exp.files); - cl_assert_equal_i(0, exp.hunks); - cl_assert_equal_i(0, exp.lines); - - git_diff_free(diff); - diff = NULL; - - cl_git_pass(git_diff_tree_to_index(&diff, g_repo, a, NULL, &opts)); - cl_git_pass(git_diff_index_to_workdir(&diff2, g_repo, NULL, &opts)); - cl_git_pass(git_diff_merge(diff, diff2)); - git_diff_free(diff2); - - memset(&exp, 0, sizeof(exp)); - cl_git_pass(git_diff_foreach( - diff, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &exp)); - - cl_assert_equal_i(0, exp.files); - cl_assert_equal_i(0, exp.hunks); - cl_assert_equal_i(0, exp.lines); - - git_diff_free(diff); - git_tree_free(a); -} - -void test_diff_workdir__untracked_directory_scenarios(void) -{ - git_diff_options opts = GIT_DIFF_OPTIONS_INIT; - git_diff *diff = NULL; - diff_expects exp; - char *pathspec = NULL; - static const char *files0[] = { - "subdir/deleted_file", - "subdir/modified_file", - "subdir/new_file", - NULL - }; - static const char *files1[] = { - "subdir/deleted_file", - "subdir/directory/", - "subdir/modified_file", - "subdir/new_file", - NULL - }; - static const char *files2[] = { - "subdir/deleted_file", - "subdir/directory/more/notignored", - "subdir/modified_file", - "subdir/new_file", - NULL - }; - - g_repo = cl_git_sandbox_init("status"); - cl_git_mkfile("status/.gitignore", "ignored\n"); - - opts.context_lines = 3; - opts.interhunk_lines = 1; - opts.flags |= GIT_DIFF_INCLUDE_IGNORED | GIT_DIFF_INCLUDE_UNTRACKED; - opts.pathspec.strings = &pathspec; - opts.pathspec.count = 1; - pathspec = "subdir"; - - /* baseline for "subdir" pathspec */ - - memset(&exp, 0, sizeof(exp)); - exp.names = files0; - - cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, NULL, &opts)); - - cl_git_pass(git_diff_foreach(diff, diff_file_cb, NULL, NULL, NULL, &exp)); - - cl_assert_equal_i(3, exp.files); - cl_assert_equal_i(0, exp.file_status[GIT_DELTA_ADDED]); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_DELETED]); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_MODIFIED]); - cl_assert_equal_i(0, exp.file_status[GIT_DELTA_IGNORED]); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_UNTRACKED]); - - git_diff_free(diff); - - /* empty directory */ - - cl_git_pass(p_mkdir("status/subdir/directory", 0777)); - - memset(&exp, 0, sizeof(exp)); - exp.names = files1; - - cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, NULL, &opts)); - - cl_git_pass(git_diff_foreach(diff, diff_file_cb, NULL, NULL, NULL, &exp)); - - cl_assert_equal_i(4, exp.files); - cl_assert_equal_i(0, exp.file_status[GIT_DELTA_ADDED]); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_DELETED]); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_MODIFIED]); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_IGNORED]); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_UNTRACKED]); - - git_diff_free(diff); - - /* empty directory in empty directory */ - - cl_git_pass(p_mkdir("status/subdir/directory/empty", 0777)); - - memset(&exp, 0, sizeof(exp)); - exp.names = files1; - - cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, NULL, &opts)); - - cl_git_pass(git_diff_foreach(diff, diff_file_cb, NULL, NULL, NULL, &exp)); - - cl_assert_equal_i(4, exp.files); - cl_assert_equal_i(0, exp.file_status[GIT_DELTA_ADDED]); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_DELETED]); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_MODIFIED]); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_IGNORED]); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_UNTRACKED]); - - git_diff_free(diff); - - /* directory with only ignored files */ - - cl_git_pass(p_mkdir("status/subdir/directory/deeper", 0777)); - cl_git_mkfile("status/subdir/directory/deeper/ignored", "ignore me\n"); - - cl_git_pass(p_mkdir("status/subdir/directory/another", 0777)); - cl_git_mkfile("status/subdir/directory/another/ignored", "ignore me\n"); - - memset(&exp, 0, sizeof(exp)); - exp.names = files1; - - cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, NULL, &opts)); - - cl_git_pass(git_diff_foreach(diff, diff_file_cb, NULL, NULL, NULL, &exp)); - - cl_assert_equal_i(4, exp.files); - cl_assert_equal_i(0, exp.file_status[GIT_DELTA_ADDED]); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_DELETED]); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_MODIFIED]); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_IGNORED]); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_UNTRACKED]); - - git_diff_free(diff); - - /* directory with ignored directory (contents irrelevant) */ - - cl_git_pass(p_mkdir("status/subdir/directory/more", 0777)); - cl_git_pass(p_mkdir("status/subdir/directory/more/ignored", 0777)); - cl_git_mkfile("status/subdir/directory/more/ignored/notignored", - "inside ignored dir\n"); - - memset(&exp, 0, sizeof(exp)); - exp.names = files1; - - cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, NULL, &opts)); - - cl_git_pass(git_diff_foreach(diff, diff_file_cb, NULL, NULL, NULL, &exp)); - - cl_assert_equal_i(4, exp.files); - cl_assert_equal_i(0, exp.file_status[GIT_DELTA_ADDED]); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_DELETED]); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_MODIFIED]); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_IGNORED]); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_UNTRACKED]); - - git_diff_free(diff); - - /* quick version avoids directory scan */ - - opts.flags = opts.flags | GIT_DIFF_ENABLE_FAST_UNTRACKED_DIRS; - - memset(&exp, 0, sizeof(exp)); - exp.names = files1; - - cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, NULL, &opts)); - - cl_git_pass(git_diff_foreach(diff, diff_file_cb, NULL, NULL, NULL, &exp)); - - cl_assert_equal_i(4, exp.files); - cl_assert_equal_i(0, exp.file_status[GIT_DELTA_ADDED]); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_DELETED]); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_MODIFIED]); - cl_assert_equal_i(0, exp.file_status[GIT_DELTA_IGNORED]); - cl_assert_equal_i(2, exp.file_status[GIT_DELTA_UNTRACKED]); - - git_diff_free(diff); - - /* directory with nested non-ignored content */ - - opts.flags = opts.flags & ~GIT_DIFF_ENABLE_FAST_UNTRACKED_DIRS; - - cl_git_mkfile("status/subdir/directory/more/notignored", - "not ignored deep under untracked\n"); - - memset(&exp, 0, sizeof(exp)); - exp.names = files1; - - cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, NULL, &opts)); - - cl_git_pass(git_diff_foreach(diff, diff_file_cb, NULL, NULL, NULL, &exp)); - - cl_assert_equal_i(4, exp.files); - cl_assert_equal_i(0, exp.file_status[GIT_DELTA_ADDED]); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_DELETED]); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_MODIFIED]); - cl_assert_equal_i(0, exp.file_status[GIT_DELTA_IGNORED]); - cl_assert_equal_i(2, exp.file_status[GIT_DELTA_UNTRACKED]); - - git_diff_free(diff); - - /* use RECURSE_UNTRACKED_DIRS to get actual untracked files (no ignores) */ - - opts.flags = opts.flags & ~GIT_DIFF_INCLUDE_IGNORED; - opts.flags = opts.flags | GIT_DIFF_RECURSE_UNTRACKED_DIRS; - - memset(&exp, 0, sizeof(exp)); - exp.names = files2; - - cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, NULL, &opts)); - - cl_git_pass(git_diff_foreach(diff, diff_file_cb, NULL, NULL, NULL, &exp)); - - cl_assert_equal_i(4, exp.files); - cl_assert_equal_i(0, exp.file_status[GIT_DELTA_ADDED]); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_DELETED]); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_MODIFIED]); - cl_assert_equal_i(0, exp.file_status[GIT_DELTA_IGNORED]); - cl_assert_equal_i(2, exp.file_status[GIT_DELTA_UNTRACKED]); - - git_diff_free(diff); -} - - -void test_diff_workdir__untracked_directory_comes_last(void) -{ - git_diff_options opts = GIT_DIFF_OPTIONS_INIT; - git_diff *diff = NULL; - - g_repo = cl_git_sandbox_init("renames"); - - cl_git_mkfile("renames/.gitignore", "*.ign\n"); - cl_git_pass(p_mkdir("renames/zzz_untracked", 0777)); - cl_git_mkfile("renames/zzz_untracked/an.ign", "ignore me please"); - cl_git_mkfile("renames/zzz_untracked/skip.ign", "ignore me really"); - cl_git_mkfile("renames/zzz_untracked/test.ign", "ignore me now"); - - opts.context_lines = 3; - opts.interhunk_lines = 1; - opts.flags |= GIT_DIFF_INCLUDE_IGNORED | GIT_DIFF_INCLUDE_UNTRACKED; - - cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, NULL, &opts)); - - cl_assert(diff != NULL); - - git_diff_free(diff); -} - -void test_diff_workdir__untracked_with_bom(void) -{ - git_diff_options opts = GIT_DIFF_OPTIONS_INIT; - git_diff *diff = NULL; - const git_diff_delta *delta; - - g_repo = cl_git_sandbox_init("empty_standard_repo"); - cl_repo_set_bool(g_repo, "core.autocrlf", true); - - cl_git_write2file("empty_standard_repo/bom.txt", - "\xFF\xFE\x31\x00\x32\x00\x33\x00\x34\x00", 10, O_WRONLY|O_CREAT, 0664); - - opts.flags = - GIT_DIFF_INCLUDE_UNTRACKED | GIT_DIFF_SHOW_UNTRACKED_CONTENT; - - cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, NULL, &opts)); - - cl_assert_equal_i(1, git_diff_num_deltas(diff)); - cl_assert((delta = git_diff_get_delta(diff, 0)) != NULL); - cl_assert_equal_i(GIT_DELTA_UNTRACKED, delta->status); - - /* not known at this point - * cl_assert((delta->flags & GIT_DIFF_FLAG_BINARY) != 0); - */ - - git_diff_free(diff); -} - -void test_diff_workdir__patience_diff(void) -{ - git_index *index; - git_diff_options opts = GIT_DIFF_OPTIONS_INIT; - git_diff *diff = NULL; - git_patch *patch = NULL; - git_buf buf = GIT_BUF_INIT; - const char *expected_normal = "diff --git a/test.txt b/test.txt\nindex 34a5acc..d52725f 100644\n--- a/test.txt\n+++ b/test.txt\n@@ -1,10 +1,7 @@\n When I wrote this\n I did not know\n-how to create\n-a patience diff\n I did not know\n how to create\n+a patience diff\n another problem\n-I did not know\n-how to create\n a minimal diff\n"; - const char *expected_patience = "diff --git a/test.txt b/test.txt\nindex 34a5acc..d52725f 100644\n--- a/test.txt\n+++ b/test.txt\n@@ -1,10 +1,7 @@\n When I wrote this\n I did not know\n+I did not know\n how to create\n a patience diff\n-I did not know\n-how to create\n another problem\n-I did not know\n-how to create\n a minimal diff\n"; - - g_repo = cl_git_sandbox_init("empty_standard_repo"); - cl_repo_set_bool(g_repo, "core.autocrlf", true); - cl_git_pass(git_repository_index(&index, g_repo)); - - cl_git_mkfile( - "empty_standard_repo/test.txt", - "When I wrote this\nI did not know\nhow to create\na patience diff\nI did not know\nhow to create\nanother problem\nI did not know\nhow to create\na minimal diff\n"); - cl_git_pass(git_index_add_bypath(index, "test.txt")); - cl_repo_commit_from_index(NULL, g_repo, NULL, 1372350000, "Base"); - git_index_free(index); - - cl_git_rewritefile( - "empty_standard_repo/test.txt", - "When I wrote this\nI did not know\nI did not know\nhow to create\na patience diff\nanother problem\na minimal diff\n"); - - cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, NULL, &opts)); - cl_assert_equal_i(1, git_diff_num_deltas(diff)); - cl_git_pass(git_patch_from_diff(&patch, diff, 0)); - cl_git_pass(git_patch_to_buf(&buf, patch)); - - cl_assert_equal_s(expected_normal, buf.ptr); - git_buf_clear(&buf); - git_patch_free(patch); - git_diff_free(diff); - - opts.flags |= GIT_DIFF_PATIENCE; - - cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, NULL, &opts)); - cl_assert_equal_i(1, git_diff_num_deltas(diff)); - cl_git_pass(git_patch_from_diff(&patch, diff, 0)); - cl_git_pass(git_patch_to_buf(&buf, patch)); - - cl_assert_equal_s(expected_patience, buf.ptr); - git_buf_clear(&buf); - - git_buf_free(&buf); - git_patch_free(patch); - git_diff_free(diff); -} - -void test_diff_workdir__with_stale_index(void) -{ - git_diff_options opts = GIT_DIFF_OPTIONS_INIT; - git_diff *diff = NULL; - git_index *idx = NULL; - diff_expects exp; - - g_repo = cl_git_sandbox_init("status"); - cl_git_pass(git_repository_index(&idx, g_repo)); - - /* make the in-memory index invalid */ - { - git_repository *r2; - git_index *idx2; - cl_git_pass(git_repository_open(&r2, "status")); - cl_git_pass(git_repository_index(&idx2, r2)); - cl_git_pass(git_index_add_bypath(idx2, "new_file")); - cl_git_pass(git_index_add_bypath(idx2, "subdir/new_file")); - cl_git_pass(git_index_remove_bypath(idx2, "staged_new_file")); - cl_git_pass(git_index_remove_bypath(idx2, "staged_changes_file_deleted")); - cl_git_pass(git_index_write(idx2)); - git_index_free(idx2); - git_repository_free(r2); - } - - opts.context_lines = 3; - opts.interhunk_lines = 1; - opts.flags |= GIT_DIFF_INCLUDE_UNTRACKED | GIT_DIFF_INCLUDE_UNMODIFIED; - - /* first try with index pointer which should prevent reload */ - - cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, idx, &opts)); - - memset(&exp, 0, sizeof(exp)); - - cl_git_pass(git_diff_foreach( - diff, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &exp)); - - cl_assert_equal_i(17, exp.files); - cl_assert_equal_i(0, exp.file_status[GIT_DELTA_ADDED]); - cl_assert_equal_i(4, exp.file_status[GIT_DELTA_DELETED]); - cl_assert_equal_i(4, exp.file_status[GIT_DELTA_MODIFIED]); - cl_assert_equal_i(4, exp.file_status[GIT_DELTA_UNTRACKED]); - cl_assert_equal_i(5, exp.file_status[GIT_DELTA_UNMODIFIED]); - - git_diff_free(diff); - - /* now let's try without the index pointer which should trigger reload */ - - /* two files that were UNTRACKED should have become UNMODIFIED */ - /* one file that was UNMODIFIED should now have become UNTRACKED */ - /* one file that was DELETED should now be gone completely */ - - cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, NULL, &opts)); - - memset(&exp, 0, sizeof(exp)); - - cl_git_pass(git_diff_foreach( - diff, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &exp)); - - git_diff_free(diff); - - cl_assert_equal_i(16, exp.files); - cl_assert_equal_i(0, exp.file_status[GIT_DELTA_ADDED]); - cl_assert_equal_i(3, exp.file_status[GIT_DELTA_DELETED]); - cl_assert_equal_i(4, exp.file_status[GIT_DELTA_MODIFIED]); - cl_assert_equal_i(3, exp.file_status[GIT_DELTA_UNTRACKED]); - cl_assert_equal_i(6, exp.file_status[GIT_DELTA_UNMODIFIED]); - - git_index_free(idx); -} - -static int touch_file(void *payload, git_buf *path) -{ - struct stat st; - struct timeval times[2]; - - GIT_UNUSED(payload); - if (git_path_isdir(path->ptr)) - return 0; - - cl_must_pass(p_stat(path->ptr, &st)); - - times[0].tv_sec = st.st_mtime + 3; - times[0].tv_usec = 0; - times[1].tv_sec = st.st_mtime + 3; - times[1].tv_usec = 0; - - cl_must_pass(p_utimes(path->ptr, times)); - return 0; -} - -static void basic_diff_status(git_diff **out, const git_diff_options *opts) -{ - diff_expects exp; - - cl_git_pass(git_diff_index_to_workdir(out, g_repo, NULL, opts)); - - memset(&exp, 0, sizeof(exp)); - - cl_git_pass(git_diff_foreach( - *out, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &exp)); - - cl_assert_equal_i(13, exp.files); - cl_assert_equal_i(0, exp.file_status[GIT_DELTA_ADDED]); - cl_assert_equal_i(4, exp.file_status[GIT_DELTA_DELETED]); - cl_assert_equal_i(4, exp.file_status[GIT_DELTA_MODIFIED]); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_IGNORED]); - cl_assert_equal_i(4, exp.file_status[GIT_DELTA_UNTRACKED]); -} - -void test_diff_workdir__can_update_index(void) -{ - git_diff_options opts = GIT_DIFF_OPTIONS_INIT; - git_diff *diff = NULL; - git_diff_perfdata perf = GIT_DIFF_PERFDATA_INIT; - git_index *index; - - g_repo = cl_git_sandbox_init("status"); - - /* touch all the files so stat times are different */ - { - git_buf path = GIT_BUF_INIT; - cl_git_pass(git_buf_sets(&path, "status")); - cl_git_pass(git_path_direach(&path, 0, touch_file, NULL)); - git_buf_free(&path); - } - - opts.flags |= GIT_DIFF_INCLUDE_IGNORED | GIT_DIFF_INCLUDE_UNTRACKED; - - basic_diff_status(&diff, &opts); - - cl_git_pass(git_diff_get_perfdata(&perf, diff)); - cl_assert_equal_sz(13 + 3, perf.stat_calls); - cl_assert_equal_sz(5, perf.oid_calculations); - - git_diff_free(diff); - - /* now allow diff to update stat cache */ - opts.flags |= GIT_DIFF_UPDATE_INDEX; - - /* advance a tick for the index so we don't re-calculate racily-clean entries */ - cl_git_pass(git_repository_index__weakptr(&index, g_repo)); - tick_index(index); - - basic_diff_status(&diff, &opts); - - cl_git_pass(git_diff_get_perfdata(&perf, diff)); - cl_assert_equal_sz(13 + 3, perf.stat_calls); - cl_assert_equal_sz(5, perf.oid_calculations); - - git_diff_free(diff); - - /* now if we do it again, we should see fewer OID calculations */ - - /* tick again as the index updating from the previous diff might have reset the timestamp */ - tick_index(index); - basic_diff_status(&diff, &opts); - - cl_git_pass(git_diff_get_perfdata(&perf, diff)); - cl_assert_equal_sz(13 + 3, perf.stat_calls); - cl_assert_equal_sz(0, perf.oid_calculations); - - git_diff_free(diff); -} - -#define STR7 "0123456" -#define STR8 "01234567" -#define STR40 STR8 STR8 STR8 STR8 STR8 -#define STR200 STR40 STR40 STR40 STR40 STR40 -#define STR999Z STR200 STR200 STR200 STR200 STR40 STR40 STR40 STR40 \ - STR8 STR8 STR8 STR8 STR7 "\0" -#define STR1000 STR200 STR200 STR200 STR200 STR200 -#define STR3999Z STR1000 STR1000 STR1000 STR999Z -#define STR4000 STR1000 STR1000 STR1000 STR1000 - -static void assert_delta_binary(git_diff *diff, size_t idx, int is_binary) -{ - git_patch *patch; - const git_diff_delta *delta; - - cl_git_pass(git_patch_from_diff(&patch, diff, idx)); - delta = git_patch_get_delta(patch); - cl_assert_equal_b((delta->flags & GIT_DIFF_FLAG_BINARY), is_binary); - git_patch_free(patch); -} - -void test_diff_workdir__binary_detection(void) -{ - git_index *idx; - git_diff *diff = NULL; - git_buf b = GIT_BUF_INIT; - int i; - git_buf data[10] = { - { "1234567890", 0, 0 }, /* 0 - all ascii text control */ - { "\xC3\x85\xC3\xBC\xE2\x80\xA0\x48\xC3\xB8\xCF\x80\xCE\xA9", 0, 0 }, /* 1 - UTF-8 multibyte text */ - { "\xEF\xBB\xBF\xC3\x9C\xE2\xA4\x92\xC6\x92\x38\xC2\xA3\xE2\x82\xAC", 0, 0 }, /* 2 - UTF-8 with BOM */ - { STR999Z, 0, 1000 }, /* 3 - ASCII with NUL at 1000 */ - { STR3999Z, 0, 4000 }, /* 4 - ASCII with NUL at 4000 */ - { STR4000 STR3999Z "x", 0, 8001 }, /* 5 - ASCII with NUL at 8000 */ - { STR4000 STR4000 "\0", 0, 8001 }, /* 6 - ASCII with NUL at 8001 */ - { "\x00\xDC\x00\x6E\x21\x39\xFE\x0E\x00\x63\x00\xF8" - "\x00\x64\x00\x65\x20\x48", 0, 18 }, /* 7 - UTF-16 text */ - { "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d" - "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d", - 0, 26 }, /* 8 - All non-printable characters (no NUL) */ - { "Hello \x01\x02\x03\x04\x05\x06 World!\x01\x02\x03\x04" - "\x05\x06\x07", 0, 26 }, /* 9 - 50-50 non-printable (no NUL) */ - }; - - g_repo = cl_git_sandbox_init("empty_standard_repo"); - cl_git_pass(git_repository_index(&idx, g_repo)); - - /* We start with ASCII in index and test data in workdir, - * then we will try with test data in index and ASCII in workdir. - */ - - cl_git_pass(git_buf_sets(&b, "empty_standard_repo/0")); - for (i = 0; i < 10; ++i) { - b.ptr[b.size - 1] = '0' + i; - cl_git_mkfile(b.ptr, "baseline"); - cl_git_pass(git_index_add_bypath(idx, &b.ptr[b.size - 1])); - - if (data[i].size == 0) - data[i].size = strlen(data[i].ptr); - cl_git_write2file( - b.ptr, data[i].ptr, data[i].size, O_WRONLY|O_TRUNC, 0664); - } - git_index_write(idx); - - cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, NULL, NULL)); - - cl_assert_equal_i(10, git_diff_num_deltas(diff)); - - /* using diff binary detection (i.e. looking for NUL byte) */ - assert_delta_binary(diff, 0, false); - assert_delta_binary(diff, 1, false); - assert_delta_binary(diff, 2, false); - assert_delta_binary(diff, 3, true); - assert_delta_binary(diff, 4, true); - assert_delta_binary(diff, 5, true); - assert_delta_binary(diff, 6, false); - assert_delta_binary(diff, 7, true); - assert_delta_binary(diff, 8, false); - assert_delta_binary(diff, 9, false); - /* The above have been checked to match command-line Git */ - - git_diff_free(diff); - - cl_git_pass(git_buf_sets(&b, "empty_standard_repo/0")); - for (i = 0; i < 10; ++i) { - b.ptr[b.size - 1] = '0' + i; - cl_git_pass(git_index_add_bypath(idx, &b.ptr[b.size - 1])); - - cl_git_write2file(b.ptr, "baseline\n", 9, O_WRONLY|O_TRUNC, 0664); - } - git_index_write(idx); - - cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, NULL, NULL)); - - cl_assert_equal_i(10, git_diff_num_deltas(diff)); - - /* using diff binary detection (i.e. looking for NUL byte) */ - assert_delta_binary(diff, 0, false); - assert_delta_binary(diff, 1, false); - assert_delta_binary(diff, 2, false); - assert_delta_binary(diff, 3, true); - assert_delta_binary(diff, 4, true); - assert_delta_binary(diff, 5, true); - assert_delta_binary(diff, 6, false); - assert_delta_binary(diff, 7, true); - assert_delta_binary(diff, 8, false); - assert_delta_binary(diff, 9, false); - - git_diff_free(diff); - - git_index_free(idx); - git_buf_free(&b); -} - -void test_diff_workdir__to_index_conflicted(void) { - const char *a_commit = "26a125ee1bf"; /* the current HEAD */ - git_index_entry ancestor = {{0}}, ours = {{0}}, theirs = {{0}}; - git_tree *a; - git_index *index; - git_diff *diff1, *diff2; - const git_diff_delta *delta; - - g_repo = cl_git_sandbox_init("status"); - a = resolve_commit_oid_to_tree(g_repo, a_commit); - - cl_git_pass(git_repository_index(&index, g_repo)); - - ancestor.path = ours.path = theirs.path = "_file"; - ancestor.mode = ours.mode = theirs.mode = 0100644; - git_oid_fromstr(&ancestor.id, "deadbeefdeadbeefdeadbeefdeadbeefdeadbeef"); - git_oid_fromstr(&ours.id, "deadbeefdeadbeefdeadbeefdeadbeefdeadbeef"); - git_oid_fromstr(&theirs.id, "deadbeefdeadbeefdeadbeefdeadbeefdeadbeef"); - cl_git_pass(git_index_conflict_add(index, &ancestor, &ours, &theirs)); - - cl_git_pass(git_diff_tree_to_index(&diff1, g_repo, a, index, NULL)); - cl_git_pass(git_diff_index_to_workdir(&diff2, g_repo, index, NULL)); - cl_git_pass(git_diff_merge(diff1, diff2)); - - cl_assert_equal_i(git_diff_num_deltas(diff1), 12); - delta = git_diff_get_delta(diff1, 0); - cl_assert_equal_s(delta->old_file.path, "_file"); - cl_assert_equal_i(delta->nfiles, 1); - cl_assert_equal_i(delta->status, GIT_DELTA_CONFLICTED); - - git_diff_free(diff2); - git_diff_free(diff1); - git_index_free(index); - git_tree_free(a); -} - -void test_diff_workdir__only_writes_index_when_necessary(void) -{ - git_index *index; - git_diff_options opts = GIT_DIFF_OPTIONS_INIT; - git_diff *diff = NULL; - git_reference *head; - git_object *head_object; - git_oid initial, first, second; - git_buf path = GIT_BUF_INIT; - struct stat st; - struct timeval times[2]; - - opts.flags |= GIT_DIFF_INCLUDE_UNTRACKED | GIT_DIFF_UPDATE_INDEX; - - g_repo = cl_git_sandbox_init("status"); - - cl_git_pass(git_repository_index(&index, g_repo)); - cl_git_pass(git_repository_head(&head, g_repo)); - cl_git_pass(git_reference_peel(&head_object, head, GIT_OBJ_COMMIT)); - - cl_git_pass(git_reset(g_repo, head_object, GIT_RESET_HARD, NULL)); - - git_oid_cpy(&initial, git_index_checksum(index)); - - /* update the index timestamp to avoid raciness */ - cl_must_pass(p_stat("status/.git/index", &st)); - - times[0].tv_sec = st.st_mtime + 5; - times[0].tv_usec = 0; - times[1].tv_sec = st.st_mtime + 5; - times[1].tv_usec = 0; - - cl_must_pass(p_utimes("status/.git/index", times)); - - /* ensure diff doesn't touch the index */ - cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, NULL, &opts)); - git_diff_free(diff); - - git_oid_cpy(&first, git_index_checksum(index)); - cl_assert(!git_oid_equal(&initial, &first)); - - /* touch all the files so stat times are different */ - cl_git_pass(git_buf_sets(&path, "status")); - cl_git_pass(git_path_direach(&path, 0, touch_file, NULL)); - - cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, NULL, &opts)); - git_diff_free(diff); - - /* ensure the second diff did update the index */ - git_oid_cpy(&second, git_index_checksum(index)); - cl_assert(!git_oid_equal(&first, &second)); - - git_buf_free(&path); - git_object_free(head_object); - git_reference_free(head); - git_index_free(index); -} - diff --git a/vendor/libgit2/tests/fetchhead/fetchhead_data.h b/vendor/libgit2/tests/fetchhead/fetchhead_data.h deleted file mode 100644 index c75b65b90f..0000000000 --- a/vendor/libgit2/tests/fetchhead/fetchhead_data.h +++ /dev/null @@ -1,48 +0,0 @@ - -#define FETCH_HEAD_WILDCARD_DATA_LOCAL \ - "49322bb17d3acc9146f98c97d078513228bbf3c0\t\tbranch 'master' of git://github.com/libgit2/TestGitRepository\n" \ - "0966a434eb1a025db6b71485ab63a3bfbea520b6\tnot-for-merge\tbranch 'first-merge' of git://github.com/libgit2/TestGitRepository\n" \ - "42e4e7c5e507e113ebbb7801b16b52cf867b7ce1\tnot-for-merge\tbranch 'no-parent' of git://github.com/libgit2/TestGitRepository\n" \ - "d96c4e80345534eccee5ac7b07fc7603b56124cb\tnot-for-merge\ttag 'annotated_tag' of git://github.com/libgit2/TestGitRepository\n" \ - "55a1a760df4b86a02094a904dfa511deb5655905\tnot-for-merge\ttag 'blob' of git://github.com/libgit2/TestGitRepository\n" \ - "8f50ba15d49353813cc6e20298002c0d17b0a9ee\tnot-for-merge\ttag 'commit_tree' of git://github.com/libgit2/TestGitRepository\n" - -#define FETCH_HEAD_WILDCARD_DATA \ - "49322bb17d3acc9146f98c97d078513228bbf3c0\t\tbranch 'master' of git://github.com/libgit2/TestGitRepository\n" \ - "0966a434eb1a025db6b71485ab63a3bfbea520b6\tnot-for-merge\tbranch 'first-merge' of git://github.com/libgit2/TestGitRepository\n" \ - "42e4e7c5e507e113ebbb7801b16b52cf867b7ce1\tnot-for-merge\tbranch 'no-parent' of git://github.com/libgit2/TestGitRepository\n" \ - "d96c4e80345534eccee5ac7b07fc7603b56124cb\tnot-for-merge\ttag 'annotated_tag' of git://github.com/libgit2/TestGitRepository\n" \ - "55a1a760df4b86a02094a904dfa511deb5655905\tnot-for-merge\ttag 'blob' of git://github.com/libgit2/TestGitRepository\n" \ - "8f50ba15d49353813cc6e20298002c0d17b0a9ee\tnot-for-merge\ttag 'commit_tree' of git://github.com/libgit2/TestGitRepository\n" \ - "6e0c7bdb9b4ed93212491ee778ca1c65047cab4e\tnot-for-merge\ttag 'nearly-dangling' of git://github.com/libgit2/TestGitRepository\n" - -#define FETCH_HEAD_WILDCARD_DATA2 \ - "49322bb17d3acc9146f98c97d078513228bbf3c0\t\tbranch 'master' of git://github.com/libgit2/TestGitRepository\n" \ - "0966a434eb1a025db6b71485ab63a3bfbea520b6\tnot-for-merge\tbranch 'first-merge' of git://github.com/libgit2/TestGitRepository\n" \ - "42e4e7c5e507e113ebbb7801b16b52cf867b7ce1\tnot-for-merge\tbranch 'no-parent' of git://github.com/libgit2/TestGitRepository\n" \ - -#define FETCH_HEAD_NO_MERGE_DATA \ - "0966a434eb1a025db6b71485ab63a3bfbea520b6\tnot-for-merge\tbranch 'first-merge' of git://github.com/libgit2/TestGitRepository\n" \ - "49322bb17d3acc9146f98c97d078513228bbf3c0\tnot-for-merge\tbranch 'master' of git://github.com/libgit2/TestGitRepository\n" \ - "42e4e7c5e507e113ebbb7801b16b52cf867b7ce1\tnot-for-merge\tbranch 'no-parent' of git://github.com/libgit2/TestGitRepository\n" \ - "d96c4e80345534eccee5ac7b07fc7603b56124cb\tnot-for-merge\ttag 'annotated_tag' of git://github.com/libgit2/TestGitRepository\n" \ - "55a1a760df4b86a02094a904dfa511deb5655905\tnot-for-merge\ttag 'blob' of git://github.com/libgit2/TestGitRepository\n" \ - "8f50ba15d49353813cc6e20298002c0d17b0a9ee\tnot-for-merge\ttag 'commit_tree' of git://github.com/libgit2/TestGitRepository\n" \ - "6e0c7bdb9b4ed93212491ee778ca1c65047cab4e\tnot-for-merge\ttag 'nearly-dangling' of git://github.com/libgit2/TestGitRepository\n" - -#define FETCH_HEAD_NO_MERGE_DATA2 \ - "0966a434eb1a025db6b71485ab63a3bfbea520b6\tnot-for-merge\tbranch 'first-merge' of git://github.com/libgit2/TestGitRepository\n" \ - "49322bb17d3acc9146f98c97d078513228bbf3c0\tnot-for-merge\tbranch 'master' of git://github.com/libgit2/TestGitRepository\n" \ - "42e4e7c5e507e113ebbb7801b16b52cf867b7ce1\tnot-for-merge\tbranch 'no-parent' of git://github.com/libgit2/TestGitRepository\n" \ - -#define FETCH_HEAD_NO_MERGE_DATA3 \ - "0966a434eb1a025db6b71485ab63a3bfbea520b6\tnot-for-merge\tbranch 'first-merge' of git://github.com/libgit2/TestGitRepository\n" \ - "49322bb17d3acc9146f98c97d078513228bbf3c0\tnot-for-merge\tbranch 'master' of git://github.com/libgit2/TestGitRepository\n" \ - "42e4e7c5e507e113ebbb7801b16b52cf867b7ce1\tnot-for-merge\tbranch 'no-parent' of git://github.com/libgit2/TestGitRepository\n" \ - "8f50ba15d49353813cc6e20298002c0d17b0a9ee\tnot-for-merge\ttag 'commit_tree' of git://github.com/libgit2/TestGitRepository\n" \ - -#define FETCH_HEAD_EXPLICIT_DATA \ - "0966a434eb1a025db6b71485ab63a3bfbea520b6\t\tbranch 'first-merge' of git://github.com/libgit2/TestGitRepository\n" - -#define FETCH_HEAD_QUOTE_DATA \ - "0966a434eb1a025db6b71485ab63a3bfbea520b6\t\tbranch 'first's-merge' of git://github.com/libgit2/TestGitRepository\n" diff --git a/vendor/libgit2/tests/fetchhead/nonetwork.c b/vendor/libgit2/tests/fetchhead/nonetwork.c deleted file mode 100644 index 3b750af5e3..0000000000 --- a/vendor/libgit2/tests/fetchhead/nonetwork.c +++ /dev/null @@ -1,400 +0,0 @@ -#include "clar_libgit2.h" - -#include "fileops.h" -#include "fetchhead.h" - -#include "fetchhead_data.h" - -#define DO_LOCAL_TEST 0 - -static git_repository *g_repo; - -void test_fetchhead_nonetwork__initialize(void) -{ - g_repo = NULL; -} - -static void cleanup_repository(void *path) -{ - if (g_repo) { - git_repository_free(g_repo); - g_repo = NULL; - } - - cl_fixture_cleanup((const char *)path); -} - -static void populate_fetchhead(git_vector *out, git_repository *repo) -{ - git_fetchhead_ref *fetchhead_ref; - git_oid oid; - - cl_git_pass(git_oid_fromstr(&oid, - "49322bb17d3acc9146f98c97d078513228bbf3c0")); - cl_git_pass(git_fetchhead_ref_create(&fetchhead_ref, &oid, 1, - "refs/heads/master", - "git://github.com/libgit2/TestGitRepository")); - cl_git_pass(git_vector_insert(out, fetchhead_ref)); - - cl_git_pass(git_oid_fromstr(&oid, - "0966a434eb1a025db6b71485ab63a3bfbea520b6")); - cl_git_pass(git_fetchhead_ref_create(&fetchhead_ref, &oid, 0, - "refs/heads/first-merge", - "git://github.com/libgit2/TestGitRepository")); - cl_git_pass(git_vector_insert(out, fetchhead_ref)); - - cl_git_pass(git_oid_fromstr(&oid, - "42e4e7c5e507e113ebbb7801b16b52cf867b7ce1")); - cl_git_pass(git_fetchhead_ref_create(&fetchhead_ref, &oid, 0, - "refs/heads/no-parent", - "git://github.com/libgit2/TestGitRepository")); - cl_git_pass(git_vector_insert(out, fetchhead_ref)); - - cl_git_pass(git_oid_fromstr(&oid, - "d96c4e80345534eccee5ac7b07fc7603b56124cb")); - cl_git_pass(git_fetchhead_ref_create(&fetchhead_ref, &oid, 0, - "refs/tags/annotated_tag", - "git://github.com/libgit2/TestGitRepository")); - cl_git_pass(git_vector_insert(out, fetchhead_ref)); - - cl_git_pass(git_oid_fromstr(&oid, - "55a1a760df4b86a02094a904dfa511deb5655905")); - cl_git_pass(git_fetchhead_ref_create(&fetchhead_ref, &oid, 0, - "refs/tags/blob", - "git://github.com/libgit2/TestGitRepository")); - cl_git_pass(git_vector_insert(out, fetchhead_ref)); - - cl_git_pass(git_oid_fromstr(&oid, - "8f50ba15d49353813cc6e20298002c0d17b0a9ee")); - cl_git_pass(git_fetchhead_ref_create(&fetchhead_ref, &oid, 0, - "refs/tags/commit_tree", - "git://github.com/libgit2/TestGitRepository")); - cl_git_pass(git_vector_insert(out, fetchhead_ref)); - - cl_git_pass(git_fetchhead_write(repo, out)); -} - -void test_fetchhead_nonetwork__write(void) -{ - git_vector fetchhead_vector = GIT_VECTOR_INIT; - git_fetchhead_ref *fetchhead_ref; - git_buf fetchhead_buf = GIT_BUF_INIT; - int equals = 0; - size_t i; - - git_vector_init(&fetchhead_vector, 6, NULL); - - cl_set_cleanup(&cleanup_repository, "./test1"); - cl_git_pass(git_repository_init(&g_repo, "./test1", 0)); - - populate_fetchhead(&fetchhead_vector, g_repo); - - cl_git_pass(git_futils_readbuffer(&fetchhead_buf, - "./test1/.git/FETCH_HEAD")); - - equals = (strcmp(fetchhead_buf.ptr, FETCH_HEAD_WILDCARD_DATA_LOCAL) == 0); - - git_buf_free(&fetchhead_buf); - - git_vector_foreach(&fetchhead_vector, i, fetchhead_ref) { - git_fetchhead_ref_free(fetchhead_ref); - } - - git_vector_free(&fetchhead_vector); - - cl_assert(equals); -} - -typedef struct { - git_vector *fetchhead_vector; - size_t idx; -} fetchhead_ref_cb_data; - -static int fetchhead_ref_cb(const char *name, const char *url, - const git_oid *oid, unsigned int is_merge, void *payload) -{ - fetchhead_ref_cb_data *cb_data = payload; - git_fetchhead_ref *expected; - - cl_assert(payload); - - expected = git_vector_get(cb_data->fetchhead_vector, cb_data->idx); - - cl_assert_equal_oid(&expected->oid, oid); - cl_assert(expected->is_merge == is_merge); - - if (expected->ref_name) - cl_assert_equal_s(expected->ref_name, name); - else - cl_assert(name == NULL); - - if (expected->remote_url) - cl_assert_equal_s(expected->remote_url, url); - else - cl_assert(url == NULL); - - cb_data->idx++; - - return 0; -} - -void test_fetchhead_nonetwork__read(void) -{ - git_vector fetchhead_vector = GIT_VECTOR_INIT; - git_fetchhead_ref *fetchhead_ref; - fetchhead_ref_cb_data cb_data; - size_t i; - - memset(&cb_data, 0x0, sizeof(fetchhead_ref_cb_data)); - - cl_set_cleanup(&cleanup_repository, "./test1"); - cl_git_pass(git_repository_init(&g_repo, "./test1", 0)); - - populate_fetchhead(&fetchhead_vector, g_repo); - - cb_data.fetchhead_vector = &fetchhead_vector; - - cl_git_pass(git_repository_fetchhead_foreach(g_repo, fetchhead_ref_cb, &cb_data)); - - git_vector_foreach(&fetchhead_vector, i, fetchhead_ref) { - git_fetchhead_ref_free(fetchhead_ref); - } - - git_vector_free(&fetchhead_vector); -} - -static int read_old_style_cb(const char *name, const char *url, - const git_oid *oid, unsigned int is_merge, void *payload) -{ - git_oid expected; - - GIT_UNUSED(payload); - - git_oid_fromstr(&expected, "49322bb17d3acc9146f98c97d078513228bbf3c0"); - - cl_assert(name == NULL); - cl_assert(url == NULL); - cl_assert_equal_oid(&expected, oid); - cl_assert(is_merge == 1); - - return 0; -} - -void test_fetchhead_nonetwork__read_old_style(void) -{ - cl_set_cleanup(&cleanup_repository, "./test1"); - cl_git_pass(git_repository_init(&g_repo, "./test1", 0)); - - cl_git_rewritefile("./test1/.git/FETCH_HEAD", "49322bb17d3acc9146f98c97d078513228bbf3c0\n"); - - cl_git_pass(git_repository_fetchhead_foreach(g_repo, read_old_style_cb, NULL)); -} - -static int read_type_missing(const char *ref_name, const char *remote_url, - const git_oid *oid, unsigned int is_merge, void *payload) -{ - git_oid expected; - - GIT_UNUSED(payload); - - git_oid_fromstr(&expected, "49322bb17d3acc9146f98c97d078513228bbf3c0"); - - cl_assert_equal_s("name", ref_name); - cl_assert_equal_s("remote_url", remote_url); - cl_assert_equal_oid(&expected, oid); - cl_assert(is_merge == 0); - - return 0; -} - -void test_fetchhead_nonetwork__type_missing(void) -{ - cl_set_cleanup(&cleanup_repository, "./test1"); - cl_git_pass(git_repository_init(&g_repo, "./test1", 0)); - - cl_git_rewritefile("./test1/.git/FETCH_HEAD", "49322bb17d3acc9146f98c97d078513228bbf3c0\tnot-for-merge\t'name' of remote_url\n"); - - cl_git_pass(git_repository_fetchhead_foreach(g_repo, read_type_missing, NULL)); -} - -static int read_name_missing(const char *ref_name, const char *remote_url, - const git_oid *oid, unsigned int is_merge, void *payload) -{ - git_oid expected; - - GIT_UNUSED(payload); - - git_oid_fromstr(&expected, "49322bb17d3acc9146f98c97d078513228bbf3c0"); - - cl_assert(ref_name == NULL); - cl_assert_equal_s("remote_url", remote_url); - cl_assert_equal_oid(&expected, oid); - cl_assert(is_merge == 0); - - return 0; -} - -void test_fetchhead_nonetwork__name_missing(void) -{ - cl_set_cleanup(&cleanup_repository, "./test1"); - cl_git_pass(git_repository_init(&g_repo, "./test1", 0)); - - cl_git_rewritefile("./test1/.git/FETCH_HEAD", "49322bb17d3acc9146f98c97d078513228bbf3c0\tnot-for-merge\tremote_url\n"); - - cl_git_pass(git_repository_fetchhead_foreach(g_repo, read_name_missing, NULL)); -} - -static int read_noop(const char *ref_name, const char *remote_url, - const git_oid *oid, unsigned int is_merge, void *payload) -{ - GIT_UNUSED(ref_name); - GIT_UNUSED(remote_url); - GIT_UNUSED(oid); - GIT_UNUSED(is_merge); - GIT_UNUSED(payload); - - return 0; -} - -void test_fetchhead_nonetwork__nonexistent(void) -{ - int error; - - cl_set_cleanup(&cleanup_repository, "./test1"); - cl_git_pass(git_repository_init(&g_repo, "./test1", 0)); - - cl_git_fail((error = git_repository_fetchhead_foreach(g_repo, read_noop, NULL))); - cl_assert(error == GIT_ENOTFOUND); -} - -void test_fetchhead_nonetwork__invalid_unterminated_last_line(void) -{ - cl_set_cleanup(&cleanup_repository, "./test1"); - cl_git_pass(git_repository_init(&g_repo, "./test1", 0)); - - cl_git_rewritefile("./test1/.git/FETCH_HEAD", "unterminated"); - cl_git_fail(git_repository_fetchhead_foreach(g_repo, read_noop, NULL)); -} - -void test_fetchhead_nonetwork__invalid_oid(void) -{ - cl_set_cleanup(&cleanup_repository, "./test1"); - cl_git_pass(git_repository_init(&g_repo, "./test1", 0)); - - cl_git_rewritefile("./test1/.git/FETCH_HEAD", "shortoid\n"); - cl_git_fail(git_repository_fetchhead_foreach(g_repo, read_noop, NULL)); -} - -void test_fetchhead_nonetwork__invalid_for_merge(void) -{ - cl_set_cleanup(&cleanup_repository, "./test1"); - cl_git_pass(git_repository_init(&g_repo, "./test1", 0)); - - cl_git_rewritefile("./test1/.git/FETCH_HEAD", "49322bb17d3acc9146f98c97d078513228bbf3c0\tinvalid-merge\t\n"); - cl_git_fail(git_repository_fetchhead_foreach(g_repo, read_noop, NULL)); - - cl_assert(git__prefixcmp(giterr_last()->message, "Invalid for-merge") == 0); -} - -void test_fetchhead_nonetwork__invalid_description(void) -{ - cl_set_cleanup(&cleanup_repository, "./test1"); - cl_git_pass(git_repository_init(&g_repo, "./test1", 0)); - - cl_git_rewritefile("./test1/.git/FETCH_HEAD", "49322bb17d3acc9146f98c97d078513228bbf3c0\tnot-for-merge\n"); - cl_git_fail(git_repository_fetchhead_foreach(g_repo, read_noop, NULL)); - - cl_assert(git__prefixcmp(giterr_last()->message, "Invalid description") == 0); -} - -static int assert_master_for_merge(const char *ref, const char *url, const git_oid *id, unsigned int is_merge, void *data) -{ - GIT_UNUSED(url); - GIT_UNUSED(id); - GIT_UNUSED(data); - - if (!strcmp("refs/heads/master", ref) && !is_merge) - return -1; - - return 0; -} - -void test_fetchhead_nonetwork__unborn_with_upstream(void) -{ - git_repository *repo; - git_remote *remote; - - /* Create an empty repo to clone from */ - cl_set_cleanup(&cleanup_repository, "./test1"); - cl_git_pass(git_repository_init(&g_repo, "./test1", 0)); - cl_set_cleanup(&cleanup_repository, "./repowithunborn"); - cl_git_pass(git_clone(&repo, "./test1", "./repowithunborn", NULL)); - - /* Simulate someone pushing to it by changing to one that has stuff */ - cl_git_pass(git_remote_set_url(repo, "origin", cl_fixture("testrepo.git"))); - cl_git_pass(git_remote_lookup(&remote, repo, "origin")); - - cl_git_pass(git_remote_fetch(remote, NULL, NULL, NULL)); - git_remote_free(remote); - - cl_git_pass(git_repository_fetchhead_foreach(repo, assert_master_for_merge, NULL)); - - git_repository_free(repo); - cl_fixture_cleanup("./repowithunborn"); -} - -void test_fetchhead_nonetwork__quote_in_branch_name(void) -{ - cl_set_cleanup(&cleanup_repository, "./test1"); - cl_git_pass(git_repository_init(&g_repo, "./test1", 0)); - - cl_git_rewritefile("./test1/.git/FETCH_HEAD", FETCH_HEAD_QUOTE_DATA); - cl_git_pass(git_repository_fetchhead_foreach(g_repo, read_noop, NULL)); -} - -static bool found_master; -static bool find_master_called; - -int find_master(const char *ref_name, const char *remote_url, const git_oid *oid, unsigned int is_merge, void *payload) -{ - GIT_UNUSED(remote_url); - GIT_UNUSED(oid); - GIT_UNUSED(payload); - - find_master_called = true; - - if (!strcmp("refs/heads/master", ref_name)) { - cl_assert(is_merge); - found_master = true; - } - - return 0; -} - -void test_fetchhead_nonetwork__create_when_refpecs_given(void) -{ - git_remote *remote; - git_buf path = GIT_BUF_INIT; - char *refspec = "refs/heads/master"; - git_strarray specs = { - &refspec, - 1, - }; - - cl_set_cleanup(&cleanup_repository, "./test1"); - cl_git_pass(git_repository_init(&g_repo, "./test1", 0)); - - cl_git_pass(git_buf_joinpath(&path, git_repository_path(g_repo), "FETCH_HEAD")); - cl_git_pass(git_remote_create(&remote, g_repo, "origin", cl_fixture("testrepo.git"))); - - cl_assert(!git_path_exists(path.ptr)); - cl_git_pass(git_remote_fetch(remote, &specs, NULL, NULL)); - cl_assert(git_path_exists(path.ptr)); - - cl_git_pass(git_repository_fetchhead_foreach(g_repo, find_master, NULL)); - cl_assert(find_master_called); - cl_assert(found_master); - - git_remote_free(remote); - git_buf_free(&path); -} diff --git a/vendor/libgit2/tests/filter/blob.c b/vendor/libgit2/tests/filter/blob.c deleted file mode 100644 index bb2528d39d..0000000000 --- a/vendor/libgit2/tests/filter/blob.c +++ /dev/null @@ -1,117 +0,0 @@ -#include "clar_libgit2.h" -#include "crlf.h" - -static git_repository *g_repo = NULL; - -void test_filter_blob__initialize(void) -{ - g_repo = cl_git_sandbox_init("crlf"); - cl_git_mkfile("crlf/.gitattributes", - "*.txt text\n*.bin binary\n" - "*.crlf text eol=crlf\n" - "*.lf text eol=lf\n" - "*.ident text ident\n" - "*.identcrlf ident text eol=crlf\n" - "*.identlf ident text eol=lf\n"); -} - -void test_filter_blob__cleanup(void) -{ - cl_git_sandbox_cleanup(); -} - -void test_filter_blob__all_crlf(void) -{ - git_blob *blob; - git_buf buf = { 0 }; - - cl_git_pass(git_revparse_single( - (git_object **)&blob, g_repo, "a9a2e891")); /* all-crlf */ - - cl_assert_equal_s(ALL_CRLF_TEXT_RAW, git_blob_rawcontent(blob)); - - cl_git_pass(git_blob_filtered_content(&buf, blob, "file.bin", 1)); - - cl_assert_equal_s(ALL_CRLF_TEXT_RAW, buf.ptr); - - cl_git_pass(git_blob_filtered_content(&buf, blob, "file.crlf", 1)); - - /* in this case, raw content has crlf in it already */ - cl_assert_equal_s(ALL_CRLF_TEXT_AS_CRLF, buf.ptr); - - cl_git_pass(git_blob_filtered_content(&buf, blob, "file.lf", 1)); - - /* we never convert CRLF -> LF on platforms that have LF */ - cl_assert_equal_s(ALL_CRLF_TEXT_AS_CRLF, buf.ptr); - - git_buf_free(&buf); - git_blob_free(blob); -} - -void test_filter_blob__sanitizes(void) -{ - git_blob *blob; - git_buf buf; - - cl_git_pass(git_revparse_single( - (git_object **)&blob, g_repo, "e69de29")); /* zero-byte */ - - cl_assert_equal_i(0, git_blob_rawsize(blob)); - cl_assert_equal_s("", git_blob_rawcontent(blob)); - - memset(&buf, 0, sizeof(git_buf)); - cl_git_pass(git_blob_filtered_content(&buf, blob, "file.bin", 1)); - cl_assert_equal_sz(0, buf.size); - cl_assert_equal_s("", buf.ptr); - git_buf_free(&buf); - - memset(&buf, 0, sizeof(git_buf)); - cl_git_pass(git_blob_filtered_content(&buf, blob, "file.crlf", 1)); - cl_assert_equal_sz(0, buf.size); - cl_assert_equal_s("", buf.ptr); - git_buf_free(&buf); - - memset(&buf, 0, sizeof(git_buf)); - cl_git_pass(git_blob_filtered_content(&buf, blob, "file.lf", 1)); - cl_assert_equal_sz(0, buf.size); - cl_assert_equal_s("", buf.ptr); - git_buf_free(&buf); - - git_blob_free(blob); -} - -void test_filter_blob__ident(void) -{ - git_oid id; - git_blob *blob; - git_buf buf = { 0 }; - - cl_git_mkfile("crlf/test.ident", "Some text\n$Id$\nGoes there\n"); - cl_git_pass(git_blob_create_fromworkdir(&id, g_repo, "test.ident")); - cl_git_pass(git_blob_lookup(&blob, g_repo, &id)); - cl_assert_equal_s( - "Some text\n$Id$\nGoes there\n", git_blob_rawcontent(blob)); - git_blob_free(blob); - - cl_git_mkfile("crlf/test.ident", "Some text\n$Id: Any old just you want$\nGoes there\n"); - cl_git_pass(git_blob_create_fromworkdir(&id, g_repo, "test.ident")); - cl_git_pass(git_blob_lookup(&blob, g_repo, &id)); - cl_assert_equal_s( - "Some text\n$Id$\nGoes there\n", git_blob_rawcontent(blob)); - - cl_git_pass(git_blob_filtered_content(&buf, blob, "filter.bin", 1)); - cl_assert_equal_s( - "Some text\n$Id$\nGoes there\n", buf.ptr); - - cl_git_pass(git_blob_filtered_content(&buf, blob, "filter.identcrlf", 1)); - cl_assert_equal_s( - "Some text\r\n$Id: 3164f585d548ac68027d22b104f2d8100b2b6845 $\r\nGoes there\r\n", buf.ptr); - - cl_git_pass(git_blob_filtered_content(&buf, blob, "filter.identlf", 1)); - cl_assert_equal_s( - "Some text\n$Id: 3164f585d548ac68027d22b104f2d8100b2b6845 $\nGoes there\n", buf.ptr); - - git_buf_free(&buf); - git_blob_free(blob); - -} diff --git a/vendor/libgit2/tests/filter/crlf.c b/vendor/libgit2/tests/filter/crlf.c deleted file mode 100644 index a8ebd949f3..0000000000 --- a/vendor/libgit2/tests/filter/crlf.c +++ /dev/null @@ -1,235 +0,0 @@ -#include "clar_libgit2.h" -#include "git2/sys/filter.h" -#include "buffer.h" - -static git_repository *g_repo = NULL; - -void test_filter_crlf__initialize(void) -{ - g_repo = cl_git_sandbox_init("crlf"); - - cl_git_mkfile("crlf/.gitattributes", - "*.txt text\n*.bin binary\n*.crlf text eol=crlf\n*.lf text eol=lf\n"); - - cl_repo_set_bool(g_repo, "core.autocrlf", true); -} - -void test_filter_crlf__cleanup(void) -{ - cl_git_sandbox_cleanup(); -} - -void test_filter_crlf__to_worktree(void) -{ - git_filter_list *fl; - git_filter *crlf; - git_buf in = { 0 }, out = { 0 }; - - cl_git_pass(git_filter_list_new( - &fl, g_repo, GIT_FILTER_TO_WORKTREE, 0)); - - crlf = git_filter_lookup(GIT_FILTER_CRLF); - cl_assert(crlf != NULL); - - cl_git_pass(git_filter_list_push(fl, crlf, NULL)); - - in.ptr = "Some text\nRight here\n"; - in.size = strlen(in.ptr); - - cl_git_pass(git_filter_list_apply_to_data(&out, fl, &in)); - - cl_assert_equal_s("Some text\r\nRight here\r\n", out.ptr); - - git_filter_list_free(fl); - git_buf_free(&out); -} - -void test_filter_crlf__to_odb(void) -{ - git_filter_list *fl; - git_filter *crlf; - git_buf in = { 0 }, out = { 0 }; - - cl_git_pass(git_filter_list_new( - &fl, g_repo, GIT_FILTER_TO_ODB, 0)); - - crlf = git_filter_lookup(GIT_FILTER_CRLF); - cl_assert(crlf != NULL); - - cl_git_pass(git_filter_list_push(fl, crlf, NULL)); - - in.ptr = "Some text\r\nRight here\r\n"; - in.size = strlen(in.ptr); - - cl_git_pass(git_filter_list_apply_to_data(&out, fl, &in)); - - cl_assert_equal_s("Some text\nRight here\n", out.ptr); - - git_filter_list_free(fl); - git_buf_free(&out); -} - -void test_filter_crlf__with_safecrlf(void) -{ - git_filter_list *fl; - git_filter *crlf; - git_buf in = {0}, out = GIT_BUF_INIT; - - cl_repo_set_bool(g_repo, "core.safecrlf", true); - - cl_git_pass(git_filter_list_new( - &fl, g_repo, GIT_FILTER_TO_ODB, 0)); - - crlf = git_filter_lookup(GIT_FILTER_CRLF); - cl_assert(crlf != NULL); - - cl_git_pass(git_filter_list_push(fl, crlf, NULL)); - - /* Normalized \r\n succeeds with safecrlf */ - in.ptr = "Normal\r\nCRLF\r\nline-endings.\r\n"; - in.size = strlen(in.ptr); - - cl_git_pass(git_filter_list_apply_to_data(&out, fl, &in)); - cl_assert_equal_s("Normal\nCRLF\nline-endings.\n", out.ptr); - - /* Mix of line endings fails with safecrlf */ - in.ptr = "Mixed\nup\r\nLF\nand\r\nCRLF\nline-endings.\r\n"; - in.size = strlen(in.ptr); - - cl_git_fail(git_filter_list_apply_to_data(&out, fl, &in)); - cl_assert_equal_i(giterr_last()->klass, GITERR_FILTER); - - /* Normalized \n is reversible, so does not fail with safecrlf */ - in.ptr = "Normal\nLF\nonly\nline-endings.\n"; - in.size = strlen(in.ptr); - - cl_git_pass(git_filter_list_apply_to_data(&out, fl, &in)); - cl_assert_equal_s(in.ptr, out.ptr); - - git_filter_list_free(fl); - git_buf_free(&out); -} - -void test_filter_crlf__with_safecrlf_and_unsafe_allowed(void) -{ - git_filter_list *fl; - git_filter *crlf; - git_buf in = {0}, out = GIT_BUF_INIT; - - cl_repo_set_bool(g_repo, "core.safecrlf", true); - - cl_git_pass(git_filter_list_new( - &fl, g_repo, GIT_FILTER_TO_ODB, GIT_FILTER_ALLOW_UNSAFE)); - - crlf = git_filter_lookup(GIT_FILTER_CRLF); - cl_assert(crlf != NULL); - - cl_git_pass(git_filter_list_push(fl, crlf, NULL)); - - /* Normalized \r\n succeeds with safecrlf */ - in.ptr = "Normal\r\nCRLF\r\nline-endings.\r\n"; - in.size = strlen(in.ptr); - - cl_git_pass(git_filter_list_apply_to_data(&out, fl, &in)); - cl_assert_equal_s("Normal\nCRLF\nline-endings.\n", out.ptr); - - /* Mix of line endings fails with safecrlf, but allowed to pass */ - in.ptr = "Mixed\nup\r\nLF\nand\r\nCRLF\nline-endings.\r\n"; - in.size = strlen(in.ptr); - - cl_git_pass(git_filter_list_apply_to_data(&out, fl, &in)); - /* TODO: check for warning */ - cl_assert_equal_s("Mixed\nup\nLF\nand\nCRLF\nline-endings.\n", out.ptr); - - /* Normalized \n fails with safecrlf, but allowed to pass */ - in.ptr = "Normal\nLF\nonly\nline-endings.\n"; - in.size = strlen(in.ptr); - - cl_git_pass(git_filter_list_apply_to_data(&out, fl, &in)); - /* TODO: check for warning */ - cl_assert_equal_s("Normal\nLF\nonly\nline-endings.\n", out.ptr); - - git_filter_list_free(fl); - git_buf_free(&out); -} - -void test_filter_crlf__no_safecrlf(void) -{ - git_filter_list *fl; - git_filter *crlf; - git_buf in = {0}, out = GIT_BUF_INIT; - - cl_git_pass(git_filter_list_new( - &fl, g_repo, GIT_FILTER_TO_ODB, 0)); - - crlf = git_filter_lookup(GIT_FILTER_CRLF); - cl_assert(crlf != NULL); - - cl_git_pass(git_filter_list_push(fl, crlf, NULL)); - - /* Normalized \r\n succeeds with safecrlf */ - in.ptr = "Normal\r\nCRLF\r\nline-endings.\r\n"; - in.size = strlen(in.ptr); - - cl_git_pass(git_filter_list_apply_to_data(&out, fl, &in)); - cl_assert_equal_s("Normal\nCRLF\nline-endings.\n", out.ptr); - - /* Mix of line endings fails with safecrlf */ - in.ptr = "Mixed\nup\r\nLF\nand\r\nCRLF\nline-endings.\r\n"; - in.size = strlen(in.ptr); - - cl_git_pass(git_filter_list_apply_to_data(&out, fl, &in)); - cl_assert_equal_s("Mixed\nup\nLF\nand\nCRLF\nline-endings.\n", out.ptr); - - /* Normalized \n fails with safecrlf */ - in.ptr = "Normal\nLF\nonly\nline-endings.\n"; - in.size = strlen(in.ptr); - - cl_git_pass(git_filter_list_apply_to_data(&out, fl, &in)); - cl_assert_equal_s("Normal\nLF\nonly\nline-endings.\n", out.ptr); - - git_filter_list_free(fl); - git_buf_free(&out); -} - -void test_filter_crlf__safecrlf_warn(void) -{ - git_filter_list *fl; - git_filter *crlf; - git_buf in = {0}, out = GIT_BUF_INIT; - - cl_repo_set_string(g_repo, "core.safecrlf", "warn"); - - cl_git_pass(git_filter_list_new( - &fl, g_repo, GIT_FILTER_TO_ODB, 0)); - - crlf = git_filter_lookup(GIT_FILTER_CRLF); - cl_assert(crlf != NULL); - - cl_git_pass(git_filter_list_push(fl, crlf, NULL)); - - /* Normalized \r\n succeeds with safecrlf=warn */ - in.ptr = "Normal\r\nCRLF\r\nline-endings.\r\n"; - in.size = strlen(in.ptr); - - cl_git_pass(git_filter_list_apply_to_data(&out, fl, &in)); - cl_assert_equal_s("Normal\nCRLF\nline-endings.\n", out.ptr); - - /* Mix of line endings succeeds with safecrlf=warn */ - in.ptr = "Mixed\nup\r\nLF\nand\r\nCRLF\nline-endings.\r\n"; - in.size = strlen(in.ptr); - - cl_git_pass(git_filter_list_apply_to_data(&out, fl, &in)); - /* TODO: check for warning */ - cl_assert_equal_s("Mixed\nup\nLF\nand\nCRLF\nline-endings.\n", out.ptr); - - /* Normalized \n is reversible, so does not fail with safecrlf=warn */ - in.ptr = "Normal\nLF\nonly\nline-endings.\n"; - in.size = strlen(in.ptr); - - cl_git_pass(git_filter_list_apply_to_data(&out, fl, &in)); - cl_assert_equal_s(in.ptr, out.ptr); - - git_filter_list_free(fl); - git_buf_free(&out); -} diff --git a/vendor/libgit2/tests/filter/crlf.h b/vendor/libgit2/tests/filter/crlf.h deleted file mode 100644 index 786edfc96f..0000000000 --- a/vendor/libgit2/tests/filter/crlf.h +++ /dev/null @@ -1,30 +0,0 @@ -#ifndef INCLUDE_filter_crlf_h__ -#define INCLUDE_filter_crlf_h__ - -/* - * file content for files in the resources/crlf repository - */ - -#define UTF8_BOM "\xEF\xBB\xBF" - -#define ALL_CRLF_TEXT_RAW "crlf\r\ncrlf\r\ncrlf\r\ncrlf\r\n" -#define ALL_LF_TEXT_RAW "lf\nlf\nlf\nlf\nlf\n" -#define MORE_CRLF_TEXT_RAW "crlf\r\ncrlf\r\nlf\ncrlf\r\ncrlf\r\n" -#define MORE_LF_TEXT_RAW "lf\nlf\ncrlf\r\nlf\nlf\n" - -#define ALL_CRLF_TEXT_AS_CRLF ALL_CRLF_TEXT_RAW -#define ALL_LF_TEXT_AS_CRLF "lf\r\nlf\r\nlf\r\nlf\r\nlf\r\n" -#define MORE_CRLF_TEXT_AS_CRLF "crlf\r\ncrlf\r\nlf\r\ncrlf\r\ncrlf\r\n" -#define MORE_LF_TEXT_AS_CRLF "lf\r\nlf\r\ncrlf\r\nlf\r\nlf\r\n" - -#define ALL_CRLF_TEXT_AS_LF "crlf\ncrlf\ncrlf\ncrlf\n" -#define ALL_LF_TEXT_AS_LF ALL_LF_TEXT_RAW -#define MORE_CRLF_TEXT_AS_LF "crlf\ncrlf\nlf\ncrlf\ncrlf\n" -#define MORE_LF_TEXT_AS_LF "lf\nlf\ncrlf\nlf\nlf\n" - -#define FEW_UTF8_CRLF_RAW "\xe2\x9a\xbdThe rest is ASCII01.\r\nThe rest is ASCII02.\r\nThe rest is ASCII03.\r\nThe rest is ASCII04.\r\nThe rest is ASCII05.\r\nThe rest is ASCII06.\r\nThe rest is ASCII07.\r\nThe rest is ASCII08.\r\nThe rest is ASCII09.\r\nThe rest is ASCII10.\r\nThe rest is ASCII11.\r\nThe rest is ASCII12.\r\nThe rest is ASCII13.\r\nThe rest is ASCII14.\r\nThe rest is ASCII15.\r\nThe rest is ASCII16.\r\nThe rest is ASCII17.\r\nThe rest is ASCII18.\r\nThe rest is ASCII19.\r\nThe rest is ASCII20.\r\nThe rest is ASCII21.\r\nThe rest is ASCII22.\r\n" -#define FEW_UTF8_LF_RAW "\xe2\x9a\xbdThe rest is ASCII01.\nThe rest is ASCII02.\nThe rest is ASCII03.\nThe rest is ASCII04.\nThe rest is ASCII05.\nThe rest is ASCII06.\nThe rest is ASCII07.\nThe rest is ASCII08.\nThe rest is ASCII09.\nThe rest is ASCII10.\nThe rest is ASCII11.\nThe rest is ASCII12.\nThe rest is ASCII13.\nThe rest is ASCII14.\nThe rest is ASCII15.\nThe rest is ASCII16.\nThe rest is ASCII17.\nThe rest is ASCII18.\nThe rest is ASCII19.\nThe rest is ASCII20.\nThe rest is ASCII21.\nThe rest is ASCII22.\n" -#define MANY_UTF8_CRLF_RAW "Lets sing!\r\n\xe2\x99\xab\xe2\x99\xaa\xe2\x99\xac\xe2\x99\xa9\r\nEat food\r\n\xf0\x9f\x8d\x85\xf0\x9f\x8d\x95\r\n" -#define MANY_UTF8_LF_RAW "Lets sing!\n\xe2\x99\xab\xe2\x99\xaa\xe2\x99\xac\xe2\x99\xa9\nEat food\n\xf0\x9f\x8d\x85\xf0\x9f\x8d\x95\n" - -#endif diff --git a/vendor/libgit2/tests/filter/custom.c b/vendor/libgit2/tests/filter/custom.c deleted file mode 100644 index 493d26c80c..0000000000 --- a/vendor/libgit2/tests/filter/custom.c +++ /dev/null @@ -1,338 +0,0 @@ -#include "clar_libgit2.h" -#include "posix.h" -#include "blob.h" -#include "filter.h" -#include "buf_text.h" -#include "git2/sys/filter.h" -#include "git2/sys/repository.h" - -/* going TO_WORKDIR, filters are executed low to high - * going TO_ODB, filters are executed high to low - */ -#define BITFLIP_FILTER_PRIORITY -1 -#define REVERSE_FILTER_PRIORITY -2 - -#define VERY_SECURE_ENCRYPTION(b) ((b) ^ 0xff) - -#ifdef GIT_WIN32 -# define NEWLINE "\r\n" -#else -# define NEWLINE "\n" -#endif - -static char workdir_data[] = - "some simple" NEWLINE - "data" NEWLINE - "that will be" NEWLINE - "trivially" NEWLINE - "scrambled." NEWLINE; - -/* Represents the data above scrambled (bits flipped) after \r\n -> \n - * conversion, then bytewise reversed - */ -static unsigned char bitflipped_and_reversed_data[] = - { 0xf5, 0xd1, 0x9b, 0x9a, 0x93, 0x9d, 0x92, 0x9e, 0x8d, 0x9c, 0x8c, - 0xf5, 0x86, 0x93, 0x93, 0x9e, 0x96, 0x89, 0x96, 0x8d, 0x8b, 0xf5, - 0x9a, 0x9d, 0xdf, 0x93, 0x93, 0x96, 0x88, 0xdf, 0x8b, 0x9e, 0x97, - 0x8b, 0xf5, 0x9e, 0x8b, 0x9e, 0x9b, 0xf5, 0x9a, 0x93, 0x8f, 0x92, - 0x96, 0x8c, 0xdf, 0x9a, 0x92, 0x90, 0x8c }; - -#define BITFLIPPED_AND_REVERSED_DATA_LEN 51 - -static git_repository *g_repo = NULL; - -static void register_custom_filters(void); - -void test_filter_custom__initialize(void) -{ - register_custom_filters(); - - g_repo = cl_git_sandbox_init("empty_standard_repo"); - - cl_git_mkfile( - "empty_standard_repo/.gitattributes", - "hero* bitflip reverse\n" - "herofile text\n" - "heroflip -reverse binary\n" - "*.bin binary\n"); -} - -void test_filter_custom__cleanup(void) -{ - cl_git_sandbox_cleanup(); - g_repo = NULL; -} - -static int bitflip_filter_apply( - git_filter *self, - void **payload, - git_buf *to, - const git_buf *from, - const git_filter_source *source) -{ - const unsigned char *src = (const unsigned char *)from->ptr; - unsigned char *dst; - size_t i; - - GIT_UNUSED(self); GIT_UNUSED(payload); - - /* verify that attribute path match worked as expected */ - cl_assert_equal_i( - 0, git__strncmp("hero", git_filter_source_path(source), 4)); - - if (!from->size) - return 0; - - cl_git_pass(git_buf_grow(to, from->size)); - - dst = (unsigned char *)to->ptr; - - for (i = 0; i < from->size; i++) - dst[i] = VERY_SECURE_ENCRYPTION(src[i]); - - to->size = from->size; - - return 0; -} - -static void bitflip_filter_free(git_filter *f) -{ - git__free(f); -} - -static git_filter *create_bitflip_filter(void) -{ - git_filter *filter = git__calloc(1, sizeof(git_filter)); - cl_assert(filter); - - filter->version = GIT_FILTER_VERSION; - filter->attributes = "+bitflip"; - filter->shutdown = bitflip_filter_free; - filter->apply = bitflip_filter_apply; - - return filter; -} - - -static int reverse_filter_apply( - git_filter *self, - void **payload, - git_buf *to, - const git_buf *from, - const git_filter_source *source) -{ - const unsigned char *src = (const unsigned char *)from->ptr; - const unsigned char *end = src + from->size; - unsigned char *dst; - - GIT_UNUSED(self); GIT_UNUSED(payload); GIT_UNUSED(source); - - /* verify that attribute path match worked as expected */ - cl_assert_equal_i( - 0, git__strncmp("hero", git_filter_source_path(source), 4)); - - if (!from->size) - return 0; - - cl_git_pass(git_buf_grow(to, from->size)); - - dst = (unsigned char *)to->ptr + from->size - 1; - - while (src < end) - *dst-- = *src++; - - to->size = from->size; - - return 0; -} - -static void reverse_filter_free(git_filter *f) -{ - git__free(f); -} - -static git_filter *create_reverse_filter(const char *attrs) -{ - git_filter *filter = git__calloc(1, sizeof(git_filter)); - cl_assert(filter); - - filter->version = GIT_FILTER_VERSION; - filter->attributes = attrs; - filter->shutdown = reverse_filter_free; - filter->apply = reverse_filter_apply; - - return filter; -} - -static void register_custom_filters(void) -{ - static int filters_registered = 0; - - if (!filters_registered) { - cl_git_pass(git_filter_register( - "bitflip", create_bitflip_filter(), BITFLIP_FILTER_PRIORITY)); - - cl_git_pass(git_filter_register( - "reverse", create_reverse_filter("+reverse"), - REVERSE_FILTER_PRIORITY)); - - /* re-register reverse filter with standard filter=xyz priority */ - cl_git_pass(git_filter_register( - "pre-reverse", - create_reverse_filter("+prereverse"), - GIT_FILTER_DRIVER_PRIORITY)); - - filters_registered = 1; - } -} - - -void test_filter_custom__to_odb(void) -{ - git_filter_list *fl; - git_buf out = { 0 }; - git_buf in = GIT_BUF_INIT_CONST(workdir_data, strlen(workdir_data)); - - cl_git_pass(git_filter_list_load( - &fl, g_repo, NULL, "herofile", GIT_FILTER_TO_ODB, 0)); - - cl_git_pass(git_filter_list_apply_to_data(&out, fl, &in)); - - cl_assert_equal_i(BITFLIPPED_AND_REVERSED_DATA_LEN, out.size); - - cl_assert_equal_i( - 0, memcmp(bitflipped_and_reversed_data, out.ptr, out.size)); - - git_filter_list_free(fl); - git_buf_free(&out); -} - -void test_filter_custom__to_workdir(void) -{ - git_filter_list *fl; - git_buf out = { 0 }; - git_buf in = GIT_BUF_INIT_CONST( - bitflipped_and_reversed_data, BITFLIPPED_AND_REVERSED_DATA_LEN); - - cl_git_pass(git_filter_list_load( - &fl, g_repo, NULL, "herofile", GIT_FILTER_TO_WORKTREE, 0)); - - cl_git_pass(git_filter_list_apply_to_data(&out, fl, &in)); - - cl_assert_equal_i(strlen(workdir_data), out.size); - - cl_assert_equal_i( - 0, memcmp(workdir_data, out.ptr, out.size)); - - git_filter_list_free(fl); - git_buf_free(&out); -} - -void test_filter_custom__can_register_a_custom_filter_in_the_repository(void) -{ - git_filter_list *fl; - - cl_git_pass(git_filter_list_load( - &fl, g_repo, NULL, "herofile", GIT_FILTER_TO_WORKTREE, 0)); - /* expect: bitflip, reverse, crlf */ - cl_assert_equal_sz(3, git_filter_list_length(fl)); - git_filter_list_free(fl); - - cl_git_pass(git_filter_list_load( - &fl, g_repo, NULL, "herocorp", GIT_FILTER_TO_WORKTREE, 0)); - /* expect: bitflip, reverse - possibly crlf depending on global config */ - { - size_t flen = git_filter_list_length(fl); - cl_assert(flen == 2 || flen == 3); - } - git_filter_list_free(fl); - - cl_git_pass(git_filter_list_load( - &fl, g_repo, NULL, "hero.bin", GIT_FILTER_TO_WORKTREE, 0)); - /* expect: bitflip, reverse */ - cl_assert_equal_sz(2, git_filter_list_length(fl)); - git_filter_list_free(fl); - - cl_git_pass(git_filter_list_load( - &fl, g_repo, NULL, "heroflip", GIT_FILTER_TO_WORKTREE, 0)); - /* expect: bitflip (because of -reverse) */ - cl_assert_equal_sz(1, git_filter_list_length(fl)); - git_filter_list_free(fl); - - cl_git_pass(git_filter_list_load( - &fl, g_repo, NULL, "doesntapplytome.bin", - GIT_FILTER_TO_WORKTREE, 0)); - /* expect: none */ - cl_assert_equal_sz(0, git_filter_list_length(fl)); - git_filter_list_free(fl); -} - -void test_filter_custom__order_dependency(void) -{ - git_index *index; - git_blob *blob; - git_buf buf = { 0 }; - - /* so if ident and reverse are used together, an interesting thing - * happens - a reversed "$Id$" string is no longer going to trigger - * ident correctly. When checking out, the filters should be applied - * in order CLRF, then ident, then reverse, so ident expansion should - * work correctly. On check in, the content should be reversed, then - * ident, then CRLF filtered. Let's make sure that works... - */ - - cl_git_mkfile( - "empty_standard_repo/.gitattributes", - "hero.*.rev-ident text ident prereverse eol=lf\n"); - - cl_git_mkfile( - "empty_standard_repo/hero.1.rev-ident", - "This is a test\n$Id$\nHave fun!\n"); - - cl_git_mkfile( - "empty_standard_repo/hero.2.rev-ident", - "Another test\n$dI$\nCrazy!\n"); - - cl_git_pass(git_repository_index(&index, g_repo)); - cl_git_pass(git_index_add_bypath(index, "hero.1.rev-ident")); - cl_git_pass(git_index_add_bypath(index, "hero.2.rev-ident")); - cl_repo_commit_from_index(NULL, g_repo, NULL, 0, "Filter chains\n"); - git_index_free(index); - - cl_git_pass(git_blob_lookup(&blob, g_repo, - & git_index_get_bypath(index, "hero.1.rev-ident", 0)->id)); - cl_assert_equal_s( - "\n!nuf evaH\n$dI$\ntset a si sihT", git_blob_rawcontent(blob)); - cl_git_pass(git_blob_filtered_content(&buf, blob, "hero.1.rev-ident", 0)); - /* no expansion because id was reversed at checkin and now at ident - * time, reverse is not applied yet */ - cl_assert_equal_s( - "This is a test\n$Id$\nHave fun!\n", buf.ptr); - git_blob_free(blob); - - cl_git_pass(git_blob_lookup(&blob, g_repo, - & git_index_get_bypath(index, "hero.2.rev-ident", 0)->id)); - cl_assert_equal_s( - "\n!yzarC\n$Id$\ntset rehtonA", git_blob_rawcontent(blob)); - cl_git_pass(git_blob_filtered_content(&buf, blob, "hero.2.rev-ident", 0)); - /* expansion because reverse was applied at checkin and at ident time, - * reverse is not applied yet */ - cl_assert_equal_s( - "Another test\n$ 59001fe193103b1016b27027c0c827d036fd0ac8 :dI$\nCrazy!\n", buf.ptr); - cl_assert_equal_i(0, git_oid_strcmp( - git_blob_id(blob), "8ca0df630d728c0c72072b6101b301391ef10095")); - git_blob_free(blob); - - git_buf_free(&buf); -} - -void test_filter_custom__filter_registry_failure_cases(void) -{ - git_filter fake = { GIT_FILTER_VERSION, 0 }; - - cl_assert_equal_i(GIT_EEXISTS, git_filter_register("bitflip", &fake, 0)); - - cl_git_fail(git_filter_unregister(GIT_FILTER_CRLF)); - cl_git_fail(git_filter_unregister(GIT_FILTER_IDENT)); - cl_assert_equal_i(GIT_ENOTFOUND, git_filter_unregister("not-a-filter")); -} diff --git a/vendor/libgit2/tests/filter/file.c b/vendor/libgit2/tests/filter/file.c deleted file mode 100644 index 599f4e54b5..0000000000 --- a/vendor/libgit2/tests/filter/file.c +++ /dev/null @@ -1,99 +0,0 @@ -#include "clar_libgit2.h" -#include "git2/sys/filter.h" -#include "crlf.h" -#include "buffer.h" - -static git_repository *g_repo = NULL; - -void test_filter_file__initialize(void) -{ - git_reference *head_ref; - git_commit *head; - - g_repo = cl_git_sandbox_init("crlf"); - - cl_git_mkfile("crlf/.gitattributes", - "*.txt text\n*.bin binary\n*.crlf text eol=crlf\n*.lf text eol=lf\n"); - - cl_repo_set_bool(g_repo, "core.autocrlf", true); - - cl_git_pass(git_repository_head(&head_ref, g_repo)); - cl_git_pass(git_reference_peel((git_object **)&head, head_ref, GIT_OBJ_COMMIT)); - cl_git_pass(git_reset(g_repo, (git_object *)head, GIT_RESET_HARD, NULL)); - - git_commit_free(head); - git_reference_free(head_ref); -} - -void test_filter_file__cleanup(void) -{ - cl_git_sandbox_cleanup(); -} - -void test_filter_file__apply(void) -{ - git_filter_list *fl; - git_filter *crlf; - git_buf buf = GIT_BUF_INIT; - - cl_git_pass(git_filter_list_new( - &fl, g_repo, GIT_FILTER_TO_ODB, 0)); - - crlf = git_filter_lookup(GIT_FILTER_CRLF); - cl_assert(crlf != NULL); - - cl_git_pass(git_filter_list_push(fl, crlf, NULL)); - - cl_git_pass(git_filter_list_apply_to_file(&buf, fl, g_repo, "all-crlf")); - cl_assert_equal_s("crlf\ncrlf\ncrlf\ncrlf\n", buf.ptr); - - git_buf_free(&buf); - git_filter_list_free(fl); -} - -struct buf_writestream { - git_writestream base; - git_buf buf; -}; - -int buf_writestream_write(git_writestream *s, const char *buf, size_t len) -{ - struct buf_writestream *stream = (struct buf_writestream *)s; - return git_buf_put(&stream->buf, buf, len); -} - -int buf_writestream_close(git_writestream *s) -{ - GIT_UNUSED(s); - return 0; -} - -void buf_writestream_free(git_writestream *s) -{ - struct buf_writestream *stream = (struct buf_writestream *)s; - git_buf_free(&stream->buf); -} - -void test_filter_file__apply_stream(void) -{ - git_filter_list *fl; - git_filter *crlf; - struct buf_writestream write_target = { { - buf_writestream_write, - buf_writestream_close, - buf_writestream_free } }; - - cl_git_pass(git_filter_list_new( - &fl, g_repo, GIT_FILTER_TO_ODB, 0)); - - crlf = git_filter_lookup(GIT_FILTER_CRLF); - cl_assert(crlf != NULL); - - cl_git_pass(git_filter_list_push(fl, crlf, NULL)); - - cl_git_pass(git_filter_list_stream_file(fl, g_repo, "all-crlf", &write_target.base)); - cl_assert_equal_s("crlf\ncrlf\ncrlf\ncrlf\n", write_target.buf.ptr); - - git_filter_list_free(fl); - write_target.base.free(&write_target.base); -} diff --git a/vendor/libgit2/tests/filter/ident.c b/vendor/libgit2/tests/filter/ident.c deleted file mode 100644 index c54b6214cc..0000000000 --- a/vendor/libgit2/tests/filter/ident.c +++ /dev/null @@ -1,133 +0,0 @@ -#include "clar_libgit2.h" -#include "git2/sys/filter.h" - -static git_repository *g_repo = NULL; - -void test_filter_ident__initialize(void) -{ - g_repo = cl_git_sandbox_init("crlf"); -} - -void test_filter_ident__cleanup(void) -{ - cl_git_sandbox_cleanup(); -} - -static void add_blob_and_filter( - const char *data, - git_filter_list *fl, - const char *expected) -{ - git_oid id; - git_blob *blob; - git_buf out = { 0 }; - - cl_git_mkfile("crlf/identtest", data); - cl_git_pass(git_blob_create_fromworkdir(&id, g_repo, "identtest")); - cl_git_pass(git_blob_lookup(&blob, g_repo, &id)); - - cl_git_pass(git_filter_list_apply_to_blob(&out, fl, blob)); - - cl_assert_equal_s(expected, out.ptr); - - git_blob_free(blob); - git_buf_free(&out); -} - -void test_filter_ident__to_worktree(void) -{ - git_filter_list *fl; - git_filter *ident; - - cl_git_pass(git_filter_list_new( - &fl, g_repo, GIT_FILTER_TO_WORKTREE, 0)); - - ident = git_filter_lookup(GIT_FILTER_IDENT); - cl_assert(ident != NULL); - - cl_git_pass(git_filter_list_push(fl, ident, NULL)); - - add_blob_and_filter( - "Hello\n$Id$\nFun stuff\n", fl, - "Hello\n$Id: b69e2387aafcaf73c4de5b9ab59abe27fdadee30 $\nFun stuff\n"); - add_blob_and_filter( - "Hello\n$Id: Junky$\nFun stuff\n", fl, - "Hello\n$Id: 45cd107a7102911cb2a7df08404674327fa050b9 $\nFun stuff\n"); - add_blob_and_filter( - "$Id$\nAt the start\n", fl, - "$Id: b13415c767abc196fb95bd17070e8c1113e32160 $\nAt the start\n"); - add_blob_and_filter( - "At the end\n$Id$", fl, - "At the end\n$Id: 1344925c6bc65b34c5a7b50f86bf688e48e9a272 $"); - add_blob_and_filter( - "$Id$", fl, - "$Id: b3f5ebfb5843bc43ceecff6d4f26bb37c615beb1 $"); - add_blob_and_filter( - "$Id: Some sort of junk goes here$", fl, - "$Id: ab2dd3853c7c9a4bff55aca2bea077a73c32ac06 $"); - - add_blob_and_filter("$Id: ", fl, "$Id: "); - add_blob_and_filter("$Id", fl, "$Id"); - add_blob_and_filter("$I", fl, "$I"); - add_blob_and_filter("Id$", fl, "Id$"); - - git_filter_list_free(fl); -} - -void test_filter_ident__to_odb(void) -{ - git_filter_list *fl; - git_filter *ident; - - cl_git_pass(git_filter_list_new( - &fl, g_repo, GIT_FILTER_TO_ODB, 0)); - - ident = git_filter_lookup(GIT_FILTER_IDENT); - cl_assert(ident != NULL); - - cl_git_pass(git_filter_list_push(fl, ident, NULL)); - - add_blob_and_filter( - "Hello\n$Id$\nFun stuff\n", - fl, "Hello\n$Id$\nFun stuff\n"); - add_blob_and_filter( - "Hello\n$Id: b69e2387aafcaf73c4de5b9ab59abe27fdadee30$\nFun stuff\n", - fl, "Hello\n$Id$\nFun stuff\n"); - add_blob_and_filter( - "Hello\n$Id: Any junk you may have left here$\nFun stuff\n", - fl, "Hello\n$Id$\nFun stuff\n"); - add_blob_and_filter( - "Hello\n$Id:$\nFun stuff\n", - fl, "Hello\n$Id$\nFun stuff\n"); - add_blob_and_filter( - "Hello\n$Id:x$\nFun stuff\n", - fl, "Hello\n$Id$\nFun stuff\n"); - - add_blob_and_filter( - "$Id$\nAt the start\n", fl, "$Id$\nAt the start\n"); - add_blob_and_filter( - "$Id: lots of random text that should be removed from here$\nAt the start\n", fl, "$Id$\nAt the start\n"); - add_blob_and_filter( - "$Id: lots of random text that should not be removed without a terminator\nAt the start\n", fl, "$Id: lots of random text that should not be removed without a terminator\nAt the start\n"); - - add_blob_and_filter( - "At the end\n$Id$", fl, "At the end\n$Id$"); - add_blob_and_filter( - "At the end\n$Id:$", fl, "At the end\n$Id$"); - add_blob_and_filter( - "At the end\n$Id:asdfasdf$", fl, "At the end\n$Id$"); - add_blob_and_filter( - "At the end\n$Id", fl, "At the end\n$Id"); - add_blob_and_filter( - "At the end\n$IddI", fl, "At the end\n$IddI"); - - add_blob_and_filter("$Id$", fl, "$Id$"); - add_blob_and_filter("$Id: any$", fl, "$Id$"); - add_blob_and_filter("$Id: any long stuff goes here you see$", fl, "$Id$"); - add_blob_and_filter("$Id: ", fl, "$Id: "); - add_blob_and_filter("$Id", fl, "$Id"); - add_blob_and_filter("$I", fl, "$I"); - add_blob_and_filter("Id$", fl, "Id$"); - - git_filter_list_free(fl); -} diff --git a/vendor/libgit2/tests/filter/query.c b/vendor/libgit2/tests/filter/query.c deleted file mode 100644 index 6889d715bb..0000000000 --- a/vendor/libgit2/tests/filter/query.c +++ /dev/null @@ -1,91 +0,0 @@ -#include "clar_libgit2.h" -#include "git2/sys/filter.h" -#include "crlf.h" -#include "buffer.h" - -static git_repository *g_repo = NULL; - -void test_filter_query__initialize(void) -{ - g_repo = cl_git_sandbox_init("crlf"); - - cl_git_mkfile("crlf/.gitattributes", - "*.txt text\n" - "*.bin binary\n" - "*.crlf text eol=crlf\n" - "*.lf text eol=lf\n" - "*.binident binary ident\n" - "*.ident text ident\n" - "*.identcrlf ident text eol=crlf\n" - "*.identlf ident text eol=lf\n" - "*.custom custom ident text\n"); -} - -void test_filter_query__cleanup(void) -{ - cl_git_sandbox_cleanup(); -} - -static int filter_for(const char *filename, const char *filter) -{ - git_filter_list *fl; - int filtered; - - cl_git_pass(git_filter_list_load( - &fl, g_repo, NULL, filename, GIT_FILTER_TO_WORKTREE, 0)); - filtered = git_filter_list_contains(fl, filter); - git_filter_list_free(fl); - - return filtered; -} - -void test_filter_query__filters(void) -{ - cl_assert_equal_i(1, filter_for("text.txt", "crlf")); - cl_assert_equal_i(0, filter_for("binary.bin", "crlf")); - - cl_assert_equal_i(1, filter_for("foo.lf", "crlf")); - cl_assert_equal_i(0, filter_for("foo.lf", "ident")); - - cl_assert_equal_i(1, filter_for("id.ident", "crlf")); - cl_assert_equal_i(1, filter_for("id.ident", "ident")); - - cl_assert_equal_i(0, filter_for("id.binident", "crlf")); - cl_assert_equal_i(1, filter_for("id.binident", "ident")); -} - -void test_filter_query__autocrlf_true_implies_crlf(void) -{ - cl_repo_set_bool(g_repo, "core.autocrlf", true); - cl_assert_equal_i(1, filter_for("not_in_gitattributes", "crlf")); - cl_assert_equal_i(1, filter_for("foo.txt", "crlf")); - cl_assert_equal_i(0, filter_for("foo.bin", "crlf")); - cl_assert_equal_i(1, filter_for("foo.lf", "crlf")); - - cl_repo_set_bool(g_repo, "core.autocrlf", false); - cl_assert_equal_i(0, filter_for("not_in_gitattributes", "crlf")); - cl_assert_equal_i(1, filter_for("foo.txt", "crlf")); - cl_assert_equal_i(0, filter_for("foo.bin", "crlf")); - cl_assert_equal_i(1, filter_for("foo.lf", "crlf")); -} - -void test_filter_query__unknown(void) -{ - cl_assert_equal_i(1, filter_for("foo.custom", "crlf")); - cl_assert_equal_i(1, filter_for("foo.custom", "ident")); - cl_assert_equal_i(0, filter_for("foo.custom", "custom")); -} - -void test_filter_query__custom(void) -{ - git_filter custom = { GIT_FILTER_VERSION }; - - cl_git_pass(git_filter_register( - "custom", &custom, 42)); - - cl_assert_equal_i(1, filter_for("foo.custom", "crlf")); - cl_assert_equal_i(1, filter_for("foo.custom", "ident")); - cl_assert_equal_i(1, filter_for("foo.custom", "custom")); - - git_filter_unregister("custom"); -} diff --git a/vendor/libgit2/tests/filter/stream.c b/vendor/libgit2/tests/filter/stream.c deleted file mode 100644 index 6bf540ce77..0000000000 --- a/vendor/libgit2/tests/filter/stream.c +++ /dev/null @@ -1,216 +0,0 @@ -#include "clar_libgit2.h" -#include "posix.h" -#include "blob.h" -#include "filter.h" -#include "buf_text.h" -#include "git2/sys/filter.h" -#include "git2/sys/repository.h" - -static git_repository *g_repo = NULL; - -static git_filter *create_compress_filter(void); -static git_filter *compress_filter; - -void test_filter_stream__initialize(void) -{ - compress_filter = create_compress_filter(); - - cl_git_pass(git_filter_register("compress", compress_filter, 50)); - g_repo = cl_git_sandbox_init("empty_standard_repo"); -} - -void test_filter_stream__cleanup(void) -{ - cl_git_sandbox_cleanup(); - g_repo = NULL; - - git_filter_unregister("compress"); - git__free(compress_filter); -} - -#define CHUNKSIZE 10240 - -struct compress_stream { - git_writestream parent; - git_writestream *next; - git_filter_mode_t mode; - char current; - size_t current_chunk; -}; - -static int compress_stream_write__deflated(struct compress_stream *stream, const char *buffer, size_t len) -{ - size_t idx = 0; - - while (len > 0) { - size_t chunkremain, chunksize; - - if (stream->current_chunk == 0) - stream->current = buffer[idx]; - - chunkremain = CHUNKSIZE - stream->current_chunk; - chunksize = min(chunkremain, len); - - stream->current_chunk += chunksize; - len -= chunksize; - idx += chunksize; - - if (stream->current_chunk == CHUNKSIZE) { - cl_git_pass(stream->next->write(stream->next, &stream->current, 1)); - stream->current_chunk = 0; - } - } - - return 0; -} - -static int compress_stream_write__inflated(struct compress_stream *stream, const char *buffer, size_t len) -{ - char inflated[CHUNKSIZE]; - size_t i, j; - - for (i = 0; i < len; i++) { - for (j = 0; j < CHUNKSIZE; j++) - inflated[j] = buffer[i]; - - cl_git_pass(stream->next->write(stream->next, inflated, CHUNKSIZE)); - } - - return 0; -} - -static int compress_stream_write(git_writestream *s, const char *buffer, size_t len) -{ - struct compress_stream *stream = (struct compress_stream *)s; - - return (stream->mode == GIT_FILTER_TO_ODB) ? - compress_stream_write__deflated(stream, buffer, len) : - compress_stream_write__inflated(stream, buffer, len); -} - -static int compress_stream_close(git_writestream *s) -{ - struct compress_stream *stream = (struct compress_stream *)s; - cl_assert_equal_i(0, stream->current_chunk); - stream->next->close(stream->next); - return 0; -} - -static void compress_stream_free(git_writestream *stream) -{ - git__free(stream); -} - -static int compress_filter_stream_init( - git_writestream **out, - git_filter *self, - void **payload, - const git_filter_source *src, - git_writestream *next) -{ - struct compress_stream *stream = git__calloc(1, sizeof(struct compress_stream)); - cl_assert(stream); - - GIT_UNUSED(self); - GIT_UNUSED(payload); - - stream->parent.write = compress_stream_write; - stream->parent.close = compress_stream_close; - stream->parent.free = compress_stream_free; - stream->next = next; - stream->mode = git_filter_source_mode(src); - - *out = (git_writestream *)stream; - return 0; -} - -git_filter *create_compress_filter(void) -{ - git_filter *filter = git__calloc(1, sizeof(git_filter)); - cl_assert(filter); - - filter->version = GIT_FILTER_VERSION; - filter->attributes = "+compress"; - filter->stream = compress_filter_stream_init; - - return filter; -} - -static void writefile(const char *filename, size_t numchunks) -{ - git_buf path = GIT_BUF_INIT; - char buf[CHUNKSIZE]; - size_t i = 0, j = 0; - int fd; - - cl_git_pass(git_buf_joinpath(&path, "empty_standard_repo", filename)); - - fd = p_open(path.ptr, O_RDWR|O_CREAT, 0666); - cl_assert(fd >= 0); - - for (i = 0; i < numchunks; i++) { - for (j = 0; j < CHUNKSIZE; j++) { - buf[j] = i % 256; - } - - cl_git_pass(p_write(fd, buf, CHUNKSIZE)); - } - p_close(fd); - - git_buf_free(&path); -} - -static void test_stream(size_t numchunks) -{ - git_index *index; - const git_index_entry *entry; - git_blob *blob; - struct stat st; - git_checkout_options checkout_opts = GIT_CHECKOUT_OPTIONS_INIT; - - checkout_opts.checkout_strategy = GIT_CHECKOUT_FORCE; - - cl_git_mkfile( - "empty_standard_repo/.gitattributes", - "* compress\n"); - - /* write a file to disk */ - writefile("streamed_file", numchunks); - - /* place it in the index */ - cl_git_pass(git_repository_index(&index, g_repo)); - cl_git_pass(git_index_add_bypath(index, "streamed_file")); - cl_git_pass(git_index_write(index)); - - /* ensure it was appropriately compressed */ - cl_assert(entry = git_index_get_bypath(index, "streamed_file", 0)); - - cl_git_pass(git_blob_lookup(&blob, g_repo, &entry->id)); - cl_assert_equal_i(numchunks, git_blob_rawsize(blob)); - - /* check the file back out */ - cl_must_pass(p_unlink("empty_standard_repo/streamed_file")); - cl_git_pass(git_checkout_index(g_repo, index, &checkout_opts)); - - /* ensure it was decompressed */ - cl_must_pass(p_stat("empty_standard_repo/streamed_file", &st)); - cl_assert_equal_sz((numchunks * CHUNKSIZE), st.st_size); - - git_index_free(index); - git_blob_free(blob); -} - -/* write a 50KB file through the "compression" stream */ -void test_filter_stream__smallfile(void) -{ - test_stream(5); -} - -/* optionally write a 500 MB file through the compression stream */ -void test_filter_stream__bigfile(void) -{ - if (!cl_getenv("GITTEST_INVASIVE_FS_SIZE")) - cl_skip(); - - test_stream(51200); -} diff --git a/vendor/libgit2/tests/generate.py b/vendor/libgit2/tests/generate.py deleted file mode 100644 index 587efb519c..0000000000 --- a/vendor/libgit2/tests/generate.py +++ /dev/null @@ -1,244 +0,0 @@ -#!/usr/bin/env python -# -# Copyright (c) Vicent Marti. All rights reserved. -# -# This file is part of clar, distributed under the ISC license. -# For full terms see the included COPYING file. -# - -from __future__ import with_statement -from string import Template -import re, fnmatch, os, codecs, pickle - -class Module(object): - class Template(object): - def __init__(self, module): - self.module = module - - def _render_callback(self, cb): - if not cb: - return ' { NULL, NULL }' - return ' { "%s", &%s }' % (cb['short_name'], cb['symbol']) - - class DeclarationTemplate(Template): - def render(self): - out = "\n".join("extern %s;" % cb['declaration'] for cb in self.module.callbacks) + "\n" - - if self.module.initialize: - out += "extern %s;\n" % self.module.initialize['declaration'] - - if self.module.cleanup: - out += "extern %s;\n" % self.module.cleanup['declaration'] - - return out - - class CallbacksTemplate(Template): - def render(self): - out = "static const struct clar_func _clar_cb_%s[] = {\n" % self.module.name - out += ",\n".join(self._render_callback(cb) for cb in self.module.callbacks) - out += "\n};\n" - return out - - class InfoTemplate(Template): - def render(self): - return Template( - r""" - { - "${clean_name}", - ${initialize}, - ${cleanup}, - ${cb_ptr}, ${cb_count}, ${enabled} - }""" - ).substitute( - clean_name = self.module.clean_name(), - initialize = self._render_callback(self.module.initialize), - cleanup = self._render_callback(self.module.cleanup), - cb_ptr = "_clar_cb_%s" % self.module.name, - cb_count = len(self.module.callbacks), - enabled = int(self.module.enabled) - ) - - def __init__(self, name): - self.name = name - - self.mtime = 0 - self.enabled = True - self.modified = False - - def clean_name(self): - return self.name.replace("_", "::") - - def _skip_comments(self, text): - SKIP_COMMENTS_REGEX = re.compile( - r'//.*?$|/\*.*?\*/|\'(?:\\.|[^\\\'])*\'|"(?:\\.|[^\\"])*"', - re.DOTALL | re.MULTILINE) - - def _replacer(match): - s = match.group(0) - return "" if s.startswith('/') else s - - return re.sub(SKIP_COMMENTS_REGEX, _replacer, text) - - def parse(self, contents): - TEST_FUNC_REGEX = r"^(void\s+(test_%s__(\w+))\s*\(\s*void\s*\))\s*\{" - - contents = self._skip_comments(contents) - regex = re.compile(TEST_FUNC_REGEX % self.name, re.MULTILINE) - - self.callbacks = [] - self.initialize = None - self.cleanup = None - - for (declaration, symbol, short_name) in regex.findall(contents): - data = { - "short_name" : short_name, - "declaration" : declaration, - "symbol" : symbol - } - - if short_name == 'initialize': - self.initialize = data - elif short_name == 'cleanup': - self.cleanup = data - else: - self.callbacks.append(data) - - return self.callbacks != [] - - def refresh(self, path): - self.modified = False - - try: - st = os.stat(path) - - # Not modified - if st.st_mtime == self.mtime: - return True - - self.modified = True - self.mtime = st.st_mtime - - with codecs.open(path, encoding='utf-8') as fp: - raw_content = fp.read() - - except IOError: - return False - - return self.parse(raw_content) - -class TestSuite(object): - - def __init__(self, path): - self.path = path - - def should_generate(self, path): - if not os.path.isfile(path): - return True - - if any(module.modified for module in self.modules.values()): - return True - - return False - - def find_modules(self): - modules = [] - for root, _, files in os.walk(self.path): - module_root = root[len(self.path):] - module_root = [c for c in module_root.split(os.sep) if c] - - tests_in_module = fnmatch.filter(files, "*.c") - - for test_file in tests_in_module: - full_path = os.path.join(root, test_file) - module_name = "_".join(module_root + [test_file[:-2]]).replace("-", "_") - - modules.append((full_path, module_name)) - - return modules - - def load_cache(self): - path = os.path.join(self.path, '.clarcache') - cache = {} - - try: - fp = open(path, 'rb') - cache = pickle.load(fp) - fp.close() - except (IOError, ValueError): - pass - - return cache - - def save_cache(self): - path = os.path.join(self.path, '.clarcache') - with open(path, 'wb') as cache: - pickle.dump(self.modules, cache) - - def load(self, force = False): - module_data = self.find_modules() - self.modules = {} if force else self.load_cache() - - for path, name in module_data: - if name not in self.modules: - self.modules[name] = Module(name) - - if not self.modules[name].refresh(path): - del self.modules[name] - - def disable(self, excluded): - for exclude in excluded: - for module in self.modules.values(): - name = module.clean_name() - if name.startswith(exclude): - module.enabled = False - module.modified = True - - def suite_count(self): - return len(self.modules) - - def callback_count(self): - return sum(len(module.callbacks) for module in self.modules.values()) - - def write(self): - output = os.path.join(self.path, 'clar.suite') - - if not self.should_generate(output): - return False - - with open(output, 'w') as data: - for module in self.modules.values(): - t = Module.DeclarationTemplate(module) - data.write(t.render()) - - for module in self.modules.values(): - t = Module.CallbacksTemplate(module) - data.write(t.render()) - - suites = "static struct clar_suite _clar_suites[] = {" + ','.join( - Module.InfoTemplate(module).render() for module in sorted(self.modules.values(), key=lambda module: module.name) - ) + "\n};\n" - - data.write(suites) - - data.write("static const size_t _clar_suite_count = %d;\n" % self.suite_count()) - data.write("static const size_t _clar_callback_count = %d;\n" % self.callback_count()) - - self.save_cache() - return True - -if __name__ == '__main__': - from optparse import OptionParser - - parser = OptionParser() - parser.add_option('-f', '--force', action="store_true", dest='force', default=False) - parser.add_option('-x', '--exclude', dest='excluded', action='append', default=[]) - - options, args = parser.parse_args() - - for path in args or ['.']: - suite = TestSuite(path) - suite.load(options.force) - suite.disable(options.excluded) - if suite.write(): - print("Written `clar.suite` (%d tests in %d suites)" % (suite.callback_count(), suite.suite_count())) - diff --git a/vendor/libgit2/tests/generate_crlf.sh b/vendor/libgit2/tests/generate_crlf.sh deleted file mode 100644 index d3fd1bb9a5..0000000000 --- a/vendor/libgit2/tests/generate_crlf.sh +++ /dev/null @@ -1,73 +0,0 @@ -#!/usr/bin/env bash - -set -e - -if [ "$1" == "" -o "$2" == "" ]; then - echo "usage: $0 crlfrepo directory [tempdir]" - exit 1 -fi - -input=$1 -output=$2 -tempdir=$3 - -set -u - -create_repo() { - local input=$1 - local output=$2 - local tempdir=$3 - local systype=$4 - local autocrlf=$5 - local attr=$6 - - local worktree="${output}/${systype}/autocrlf_${autocrlf}" - - if [ "$attr" != "" ]; then - local attrdir=`echo $attr | sed -e "s/ /,/g" | sed -e "s/=/_/g"` - worktree="${worktree},${attrdir}" - fi - - if [ "$tempdir" = "" ]; then - local gitdir="${worktree}/.git" - else - local gitdir="${tempdir}/generate_crlf_${RANDOM}" - fi - - echo "Creating ${worktree}" - mkdir -p "${worktree}" - - git clone --no-checkout --quiet --bare "${input}/.gitted" "${gitdir}" - git --work-tree="${worktree}" --git-dir="${gitdir}" config core.autocrlf ${autocrlf} - - if [ "$attr" != "" ]; then - echo "* ${attr}" >> "${worktree}/.gitattributes" - fi - - git --work-tree="${worktree}" --git-dir="${gitdir}" checkout HEAD - - if [ "$attr" != "" ]; then - rm "${worktree}/.gitattributes" - fi - - if [ "$tempdir" != "" ]; then - rm -rf "${gitdir}" - fi -} - -if [[ `uname -s` == MINGW* ]]; then - systype="windows" -else - systype="posix" -fi - -for autocrlf in true false input; do - for attr in "" text text=auto -text crlf -crlf eol=lf eol=crlf \ - "text eol=lf" "text eol=crlf" \ - "text=auto eol=lf" "text=auto eol=crlf"; do - - create_repo "${input}" "${output}" "${tempdir}" \ - "${systype}" "${autocrlf}" "${attr}" - done -done - diff --git a/vendor/libgit2/tests/graph/descendant_of.c b/vendor/libgit2/tests/graph/descendant_of.c deleted file mode 100644 index 8e9952a093..0000000000 --- a/vendor/libgit2/tests/graph/descendant_of.c +++ /dev/null @@ -1,55 +0,0 @@ -#include "clar_libgit2.h" - -static git_repository *_repo; -static git_commit *commit; - -void test_graph_descendant_of__initialize(void) -{ - git_oid oid; - - cl_git_pass(git_repository_open(&_repo, cl_fixture("testrepo.git"))); - - git_oid_fromstr(&oid, "be3563ae3f795b2b4353bcce3a527ad0a4f7f644"); - cl_git_pass(git_commit_lookup(&commit, _repo, &oid)); -} - -void test_graph_descendant_of__cleanup(void) -{ - git_commit_free(commit); - commit = NULL; - - git_repository_free(_repo); - _repo = NULL; -} - -void test_graph_descendant_of__returns_correct_result(void) -{ - git_commit *other; - - cl_assert_equal_i(0, git_graph_descendant_of(_repo, git_commit_id(commit), git_commit_id(commit))); - - - cl_git_pass(git_commit_nth_gen_ancestor(&other, commit, 1)); - - cl_assert_equal_i(1, git_graph_descendant_of(_repo, git_commit_id(commit), git_commit_id(other))); - cl_assert_equal_i(0, git_graph_descendant_of(_repo, git_commit_id(other), git_commit_id(commit))); - - git_commit_free(other); - - - cl_git_pass(git_commit_nth_gen_ancestor(&other, commit, 3)); - - cl_assert_equal_i(1, git_graph_descendant_of(_repo, git_commit_id(commit), git_commit_id(other))); - cl_assert_equal_i(0, git_graph_descendant_of(_repo, git_commit_id(other), git_commit_id(commit))); - - git_commit_free(other); - -} - -void test_graph_descendant_of__nopath(void) -{ - git_oid oid; - - git_oid_fromstr(&oid, "e90810b8df3e80c413d903f631643c716887138d"); - cl_assert_equal_i(0, git_graph_descendant_of(_repo, git_commit_id(commit), &oid)); -} diff --git a/vendor/libgit2/tests/index/addall.c b/vendor/libgit2/tests/index/addall.c deleted file mode 100644 index 9ddb27f95f..0000000000 --- a/vendor/libgit2/tests/index/addall.c +++ /dev/null @@ -1,446 +0,0 @@ -#include "clar_libgit2.h" -#include "../status/status_helpers.h" -#include "posix.h" -#include "fileops.h" - -static git_repository *g_repo = NULL; -#define TEST_DIR "addall" - -void test_index_addall__initialize(void) -{ -} - -void test_index_addall__cleanup(void) -{ - cl_git_sandbox_cleanup(); -} - -#define STATUS_INDEX_FLAGS \ - (GIT_STATUS_INDEX_NEW | GIT_STATUS_INDEX_MODIFIED | \ - GIT_STATUS_INDEX_DELETED | GIT_STATUS_INDEX_RENAMED | \ - GIT_STATUS_INDEX_TYPECHANGE) - -#define STATUS_WT_FLAGS \ - (GIT_STATUS_WT_NEW | GIT_STATUS_WT_MODIFIED | \ - GIT_STATUS_WT_DELETED | GIT_STATUS_WT_TYPECHANGE | \ - GIT_STATUS_WT_RENAMED) - -typedef struct { - size_t index_adds; - size_t index_dels; - size_t index_mods; - size_t wt_adds; - size_t wt_dels; - size_t wt_mods; - size_t ignores; - size_t conflicts; -} index_status_counts; - -static int index_status_cb( - const char *path, unsigned int status_flags, void *payload) -{ - index_status_counts *vals = payload; - - /* cb_status__print(path, status_flags, NULL); */ - - GIT_UNUSED(path); - - if (status_flags & GIT_STATUS_INDEX_NEW) - vals->index_adds++; - if (status_flags & GIT_STATUS_INDEX_MODIFIED) - vals->index_mods++; - if (status_flags & GIT_STATUS_INDEX_DELETED) - vals->index_dels++; - if (status_flags & GIT_STATUS_INDEX_TYPECHANGE) - vals->index_mods++; - - if (status_flags & GIT_STATUS_WT_NEW) - vals->wt_adds++; - if (status_flags & GIT_STATUS_WT_MODIFIED) - vals->wt_mods++; - if (status_flags & GIT_STATUS_WT_DELETED) - vals->wt_dels++; - if (status_flags & GIT_STATUS_WT_TYPECHANGE) - vals->wt_mods++; - - if (status_flags & GIT_STATUS_IGNORED) - vals->ignores++; - if (status_flags & GIT_STATUS_CONFLICTED) - vals->conflicts++; - - return 0; -} - -static void check_status_at_line( - git_repository *repo, - size_t index_adds, size_t index_dels, size_t index_mods, - size_t wt_adds, size_t wt_dels, size_t wt_mods, size_t ignores, - size_t conflicts, const char *file, int line) -{ - index_status_counts vals; - - memset(&vals, 0, sizeof(vals)); - - cl_git_pass(git_status_foreach(repo, index_status_cb, &vals)); - - clar__assert_equal( - file,line,"wrong index adds", 1, "%"PRIuZ, index_adds, vals.index_adds); - clar__assert_equal( - file,line,"wrong index dels", 1, "%"PRIuZ, index_dels, vals.index_dels); - clar__assert_equal( - file,line,"wrong index mods", 1, "%"PRIuZ, index_mods, vals.index_mods); - clar__assert_equal( - file,line,"wrong workdir adds", 1, "%"PRIuZ, wt_adds, vals.wt_adds); - clar__assert_equal( - file,line,"wrong workdir dels", 1, "%"PRIuZ, wt_dels, vals.wt_dels); - clar__assert_equal( - file,line,"wrong workdir mods", 1, "%"PRIuZ, wt_mods, vals.wt_mods); - clar__assert_equal( - file,line,"wrong ignores", 1, "%"PRIuZ, ignores, vals.ignores); - clar__assert_equal( - file,line,"wrong conflicts", 1, "%"PRIuZ, conflicts, vals.conflicts); -} - -#define check_status(R,IA,ID,IM,WA,WD,WM,IG,C) \ - check_status_at_line(R,IA,ID,IM,WA,WD,WM,IG,C,__FILE__,__LINE__) - -static void check_stat_data(git_index *index, const char *path, bool match) -{ - const git_index_entry *entry; - struct stat st; - - cl_must_pass(p_lstat(path, &st)); - - /* skip repo base dir name */ - while (*path != '/') - ++path; - ++path; - - entry = git_index_get_bypath(index, path, 0); - cl_assert(entry); - - if (match) { - cl_assert(st.st_ctime == entry->ctime.seconds); - cl_assert(st.st_mtime == entry->mtime.seconds); - cl_assert(st.st_size == entry->file_size); - cl_assert(st.st_uid == entry->uid); - cl_assert(st.st_gid == entry->gid); - cl_assert_equal_i_fmt( - GIT_MODE_TYPE(st.st_mode), GIT_MODE_TYPE(entry->mode), "%07o"); - if (cl_is_chmod_supported()) - cl_assert_equal_b( - GIT_PERMS_IS_EXEC(st.st_mode), GIT_PERMS_IS_EXEC(entry->mode)); - } else { - /* most things will still match */ - cl_assert(st.st_size != entry->file_size); - /* would check mtime, but with second resolution it won't work :( */ - } -} - -static void addall_create_test_repo(bool check_every_step) -{ - g_repo = cl_git_sandbox_init_new(TEST_DIR); - - if (check_every_step) - check_status(g_repo, 0, 0, 0, 0, 0, 0, 0, 0); - - cl_git_mkfile(TEST_DIR "/file.foo", "a file"); - if (check_every_step) - check_status(g_repo, 0, 0, 0, 1, 0, 0, 0, 0); - - cl_git_mkfile(TEST_DIR "/.gitignore", "*.foo\n"); - if (check_every_step) - check_status(g_repo, 0, 0, 0, 1, 0, 0, 1, 0); - - cl_git_mkfile(TEST_DIR "/file.bar", "another file"); - if (check_every_step) - check_status(g_repo, 0, 0, 0, 2, 0, 0, 1, 0); -} - -void test_index_addall__repo_lifecycle(void) -{ - int error; - git_index *index; - git_strarray paths = { NULL, 0 }; - char *strs[1]; - - addall_create_test_repo(true); - - cl_git_pass(git_repository_index(&index, g_repo)); - - strs[0] = "file.*"; - paths.strings = strs; - paths.count = 1; - - cl_git_pass(git_index_add_all(index, &paths, 0, NULL, NULL)); - check_stat_data(index, TEST_DIR "/file.bar", true); - check_status(g_repo, 1, 0, 0, 1, 0, 0, 1, 0); - - cl_git_rewritefile(TEST_DIR "/file.bar", "new content for file"); - check_stat_data(index, TEST_DIR "/file.bar", false); - check_status(g_repo, 1, 0, 0, 1, 0, 1, 1, 0); - - cl_git_mkfile(TEST_DIR "/file.zzz", "yet another one"); - cl_git_mkfile(TEST_DIR "/other.zzz", "yet another one"); - cl_git_mkfile(TEST_DIR "/more.zzz", "yet another one"); - check_status(g_repo, 1, 0, 0, 4, 0, 1, 1, 0); - - cl_git_pass(git_index_update_all(index, NULL, NULL, NULL)); - check_stat_data(index, TEST_DIR "/file.bar", true); - check_status(g_repo, 1, 0, 0, 4, 0, 0, 1, 0); - - cl_git_pass(git_index_add_all(index, &paths, 0, NULL, NULL)); - check_stat_data(index, TEST_DIR "/file.zzz", true); - check_status(g_repo, 2, 0, 0, 3, 0, 0, 1, 0); - - cl_repo_commit_from_index(NULL, g_repo, NULL, 0, "first commit"); - check_status(g_repo, 0, 0, 0, 3, 0, 0, 1, 0); - - if (cl_repo_get_bool(g_repo, "core.filemode")) { - cl_git_pass(git_index_update_all(index, NULL, NULL, NULL)); - cl_must_pass(p_chmod(TEST_DIR "/file.zzz", 0777)); - cl_git_pass(git_index_update_all(index, NULL, NULL, NULL)); - check_status(g_repo, 0, 0, 1, 3, 0, 0, 1, 0); - - /* go back to what we had before */ - cl_must_pass(p_chmod(TEST_DIR "/file.zzz", 0666)); - cl_git_pass(git_index_update_all(index, NULL, NULL, NULL)); - check_status(g_repo, 0, 0, 0, 3, 0, 0, 1, 0); - } - - - /* attempt to add an ignored file - does nothing */ - strs[0] = "file.foo"; - cl_git_pass(git_index_add_all(index, &paths, 0, NULL, NULL)); - check_status(g_repo, 0, 0, 0, 3, 0, 0, 1, 0); - - /* add with check - should generate error */ - error = git_index_add_all( - index, &paths, GIT_INDEX_ADD_CHECK_PATHSPEC, NULL, NULL); - cl_assert_equal_i(GIT_EINVALIDSPEC, error); - check_status(g_repo, 0, 0, 0, 3, 0, 0, 1, 0); - - /* add with force - should allow */ - cl_git_pass(git_index_add_all( - index, &paths, GIT_INDEX_ADD_FORCE, NULL, NULL)); - check_stat_data(index, TEST_DIR "/file.foo", true); - check_status(g_repo, 1, 0, 0, 3, 0, 0, 0, 0); - - /* now it's in the index, so regular add should work */ - cl_git_rewritefile(TEST_DIR "/file.foo", "new content for file"); - check_stat_data(index, TEST_DIR "/file.foo", false); - check_status(g_repo, 1, 0, 0, 3, 0, 1, 0, 0); - - cl_git_pass(git_index_add_all(index, &paths, 0, NULL, NULL)); - check_stat_data(index, TEST_DIR "/file.foo", true); - check_status(g_repo, 1, 0, 0, 3, 0, 0, 0, 0); - - cl_git_pass(git_index_add_bypath(index, "more.zzz")); - check_stat_data(index, TEST_DIR "/more.zzz", true); - check_status(g_repo, 2, 0, 0, 2, 0, 0, 0, 0); - - cl_git_rewritefile(TEST_DIR "/file.zzz", "new content for file"); - check_status(g_repo, 2, 0, 0, 2, 0, 1, 0, 0); - - cl_git_pass(git_index_add_bypath(index, "file.zzz")); - check_stat_data(index, TEST_DIR "/file.zzz", true); - check_status(g_repo, 2, 0, 1, 2, 0, 0, 0, 0); - - strs[0] = "*.zzz"; - cl_git_pass(git_index_remove_all(index, &paths, NULL, NULL)); - check_status(g_repo, 1, 1, 0, 4, 0, 0, 0, 0); - - cl_git_pass(git_index_add_bypath(index, "file.zzz")); - check_status(g_repo, 1, 0, 1, 3, 0, 0, 0, 0); - - cl_repo_commit_from_index(NULL, g_repo, NULL, 0, "second commit"); - check_status(g_repo, 0, 0, 0, 3, 0, 0, 0, 0); - - cl_must_pass(p_unlink(TEST_DIR "/file.zzz")); - check_status(g_repo, 0, 0, 0, 3, 1, 0, 0, 0); - - /* update_all should be able to remove entries */ - cl_git_pass(git_index_update_all(index, NULL, NULL, NULL)); - check_status(g_repo, 0, 1, 0, 3, 0, 0, 0, 0); - - strs[0] = "*"; - cl_git_pass(git_index_add_all(index, &paths, 0, NULL, NULL)); - check_status(g_repo, 3, 1, 0, 0, 0, 0, 0, 0); - - /* must be able to remove at any position while still updating other files */ - cl_must_pass(p_unlink(TEST_DIR "/.gitignore")); - cl_git_rewritefile(TEST_DIR "/file.zzz", "reconstructed file"); - cl_git_rewritefile(TEST_DIR "/more.zzz", "altered file reality"); - check_status(g_repo, 3, 1, 0, 1, 1, 1, 0, 0); - - cl_git_pass(git_index_update_all(index, NULL, NULL, NULL)); - check_status(g_repo, 2, 1, 0, 1, 0, 0, 0, 0); - /* this behavior actually matches 'git add -u' where "file.zzz" has - * been removed from the index, so when you go to update, even though - * it exists in the HEAD, it is not re-added to the index, leaving it - * as a DELETE when comparing HEAD to index and as an ADD comparing - * index to worktree - */ - - git_index_free(index); -} - -void test_index_addall__files_in_folders(void) -{ - git_index *index; - - addall_create_test_repo(true); - - cl_git_pass(git_repository_index(&index, g_repo)); - - cl_git_pass(git_index_add_all(index, NULL, 0, NULL, NULL)); - check_stat_data(index, TEST_DIR "/file.bar", true); - check_status(g_repo, 2, 0, 0, 0, 0, 0, 1, 0); - - cl_must_pass(p_mkdir(TEST_DIR "/subdir", 0777)); - cl_git_mkfile(TEST_DIR "/subdir/file", "hello!\n"); - check_status(g_repo, 2, 0, 0, 1, 0, 0, 1, 0); - - cl_git_pass(git_index_add_all(index, NULL, 0, NULL, NULL)); - check_status(g_repo, 3, 0, 0, 0, 0, 0, 1, 0); - - git_index_free(index); -} - -static int addall_match_prefix( - const char *path, const char *matched_pathspec, void *payload) -{ - GIT_UNUSED(matched_pathspec); - return !git__prefixcmp(path, payload) ? 0 : 1; -} - -static int addall_match_suffix( - const char *path, const char *matched_pathspec, void *payload) -{ - GIT_UNUSED(matched_pathspec); - return !git__suffixcmp(path, payload) ? 0 : 1; -} - -static int addall_cancel_at( - const char *path, const char *matched_pathspec, void *payload) -{ - GIT_UNUSED(matched_pathspec); - return !strcmp(path, payload) ? -123 : 0; -} - -void test_index_addall__callback_filtering(void) -{ - git_index *index; - - addall_create_test_repo(false); - - cl_git_pass(git_repository_index(&index, g_repo)); - - cl_git_pass( - git_index_add_all(index, NULL, 0, addall_match_prefix, "file.")); - check_stat_data(index, TEST_DIR "/file.bar", true); - check_status(g_repo, 1, 0, 0, 1, 0, 0, 1, 0); - - cl_git_mkfile(TEST_DIR "/file.zzz", "yet another one"); - cl_git_mkfile(TEST_DIR "/more.zzz", "yet another one"); - cl_git_mkfile(TEST_DIR "/other.zzz", "yet another one"); - - cl_git_pass(git_index_update_all(index, NULL, NULL, NULL)); - check_stat_data(index, TEST_DIR "/file.bar", true); - check_status(g_repo, 1, 0, 0, 4, 0, 0, 1, 0); - - cl_git_pass( - git_index_add_all(index, NULL, 0, addall_match_prefix, "other")); - check_stat_data(index, TEST_DIR "/other.zzz", true); - check_status(g_repo, 2, 0, 0, 3, 0, 0, 1, 0); - - cl_git_pass( - git_index_add_all(index, NULL, 0, addall_match_suffix, ".zzz")); - check_status(g_repo, 4, 0, 0, 1, 0, 0, 1, 0); - - cl_git_pass( - git_index_remove_all(index, NULL, addall_match_suffix, ".zzz")); - check_status(g_repo, 1, 0, 0, 4, 0, 0, 1, 0); - - cl_git_fail_with( - git_index_add_all(index, NULL, 0, addall_cancel_at, "more.zzz"), -123); - check_status(g_repo, 3, 0, 0, 2, 0, 0, 1, 0); - - cl_git_fail_with( - git_index_add_all(index, NULL, 0, addall_cancel_at, "other.zzz"), -123); - check_status(g_repo, 4, 0, 0, 1, 0, 0, 1, 0); - - cl_git_pass( - git_index_add_all(index, NULL, 0, addall_match_suffix, ".zzz")); - check_status(g_repo, 5, 0, 0, 0, 0, 0, 1, 0); - - cl_must_pass(p_unlink(TEST_DIR "/file.zzz")); - cl_must_pass(p_unlink(TEST_DIR "/more.zzz")); - cl_must_pass(p_unlink(TEST_DIR "/other.zzz")); - - cl_git_fail_with( - git_index_update_all(index, NULL, addall_cancel_at, "more.zzz"), -123); - /* file.zzz removed from index (so Index Adds 5 -> 4) and - * more.zzz + other.zzz removed (so Worktree Dels 0 -> 2) */ - check_status(g_repo, 4, 0, 0, 0, 2, 0, 1, 0); - - cl_git_fail_with( - git_index_update_all(index, NULL, addall_cancel_at, "other.zzz"), -123); - /* more.zzz removed from index (so Index Adds 4 -> 3) and - * Just other.zzz removed (so Worktree Dels 2 -> 1) */ - check_status(g_repo, 3, 0, 0, 0, 1, 0, 1, 0); - - git_index_free(index); -} - -void test_index_addall__adds_conflicts(void) -{ - git_index *index; - git_reference *ref; - git_annotated_commit *annotated; - - g_repo = cl_git_sandbox_init("merge-resolve"); - cl_git_pass(git_repository_index(&index, g_repo)); - - check_status(g_repo, 0, 0, 0, 0, 0, 0, 0, 0); - - cl_git_pass(git_reference_lookup(&ref, g_repo, "refs/heads/branch")); - cl_git_pass(git_annotated_commit_from_ref(&annotated, g_repo, ref)); - - cl_git_pass(git_merge(g_repo, (const git_annotated_commit**)&annotated, 1, NULL, NULL)); - check_status(g_repo, 0, 1, 2, 0, 0, 0, 0, 1); - - cl_git_pass(git_index_add_all(index, NULL, 0, NULL, NULL)); - check_status(g_repo, 0, 1, 3, 0, 0, 0, 0, 0); - - git_annotated_commit_free(annotated); - git_reference_free(ref); - git_index_free(index); -} - -void test_index_addall__removes_deleted_conflicted_files(void) -{ - git_index *index; - git_reference *ref; - git_annotated_commit *annotated; - - g_repo = cl_git_sandbox_init("merge-resolve"); - cl_git_pass(git_repository_index(&index, g_repo)); - - check_status(g_repo, 0, 0, 0, 0, 0, 0, 0, 0); - - cl_git_pass(git_reference_lookup(&ref, g_repo, "refs/heads/branch")); - cl_git_pass(git_annotated_commit_from_ref(&annotated, g_repo, ref)); - - cl_git_pass(git_merge(g_repo, (const git_annotated_commit**)&annotated, 1, NULL, NULL)); - check_status(g_repo, 0, 1, 2, 0, 0, 0, 0, 1); - - cl_git_rmfile("merge-resolve/conflicting.txt"); - - cl_git_pass(git_index_add_all(index, NULL, 0, NULL, NULL)); - check_status(g_repo, 0, 2, 2, 0, 0, 0, 0, 0); - - git_annotated_commit_free(annotated); - git_reference_free(ref); - git_index_free(index); -} diff --git a/vendor/libgit2/tests/index/bypath.c b/vendor/libgit2/tests/index/bypath.c deleted file mode 100644 index 9706a8833e..0000000000 --- a/vendor/libgit2/tests/index/bypath.c +++ /dev/null @@ -1,48 +0,0 @@ -#include "clar_libgit2.h" -#include "repository.h" -#include "../submodule/submodule_helpers.h" - -static git_repository *g_repo; -static git_index *g_idx; - -void test_index_bypath__initialize(void) -{ - g_repo = setup_fixture_submod2(); - cl_git_pass(git_repository_index__weakptr(&g_idx, g_repo)); -} - -void test_index_bypath__cleanup(void) -{ - g_repo = NULL; - g_idx = NULL; -} - -void test_index_bypath__add_directory(void) -{ - cl_git_fail_with(GIT_EDIRECTORY, git_index_add_bypath(g_idx, "just_a_dir")); -} - -void test_index_bypath__add_submodule(void) -{ - unsigned int status; - const char *sm_name = "sm_changed_head"; - - cl_git_pass(git_submodule_status(&status, g_repo, sm_name, 0)); - cl_assert_equal_i(GIT_SUBMODULE_STATUS_WD_MODIFIED, status & GIT_SUBMODULE_STATUS_WD_MODIFIED); - cl_git_pass(git_index_add_bypath(g_idx, sm_name)); - cl_git_pass(git_submodule_status(&status, g_repo, sm_name, 0)); - cl_assert_equal_i(0, status & GIT_SUBMODULE_STATUS_WD_MODIFIED); -} - -void test_index_bypath__add_submodule_unregistered(void) -{ - const char *sm_name = "not-submodule"; - const char *sm_head = "68e92c611b80ee1ed8f38314ff9577f0d15b2444"; - const git_index_entry *entry; - - cl_git_pass(git_index_add_bypath(g_idx, sm_name)); - - cl_assert(entry = git_index_get_bypath(g_idx, sm_name, 0)); - cl_assert_equal_s(sm_head, git_oid_tostr_s(&entry->id)); - cl_assert_equal_s(sm_name, entry->path); -} diff --git a/vendor/libgit2/tests/index/cache.c b/vendor/libgit2/tests/index/cache.c deleted file mode 100644 index 3982bf1836..0000000000 --- a/vendor/libgit2/tests/index/cache.c +++ /dev/null @@ -1,238 +0,0 @@ -#include "clar_libgit2.h" -#include "git2.h" -#include "index.h" -#include "tree-cache.h" - -static git_repository *g_repo; - -void test_index_cache__initialize(void) -{ - g_repo = cl_git_sandbox_init("testrepo"); -} - -void test_index_cache__cleanup(void) -{ - cl_git_sandbox_cleanup(); - g_repo = NULL; -} - -void test_index_cache__write_extension_at_root(void) -{ - git_index *index; - git_tree *tree; - git_oid id; - const char *tree_id_str = "45dd856fdd4d89b884c340ba0e047752d9b085d6"; - const char *index_file = "index-tree"; - - cl_git_pass(git_index_open(&index, index_file)); - cl_assert(index->tree == NULL); - cl_git_pass(git_oid_fromstr(&id, tree_id_str)); - cl_git_pass(git_tree_lookup(&tree, g_repo, &id)); - cl_git_pass(git_index_read_tree(index, tree)); - git_tree_free(tree); - - cl_assert(index->tree); - cl_git_pass(git_index_write(index)); - git_index_free(index); - - cl_git_pass(git_index_open(&index, index_file)); - cl_assert(index->tree); - - cl_assert_equal_i(git_index_entrycount(index), index->tree->entry_count); - cl_assert_equal_i(0, index->tree->children_count); - - cl_assert(git_oid_equal(&id, &index->tree->oid)); - - cl_git_pass(p_unlink(index_file)); - git_index_free(index); -} - -void test_index_cache__write_extension_invalidated_root(void) -{ - git_index *index; - git_tree *tree; - git_oid id; - const char *tree_id_str = "45dd856fdd4d89b884c340ba0e047752d9b085d6"; - const char *index_file = "index-tree-invalidated"; - git_index_entry entry; - - cl_git_pass(git_index_open(&index, index_file)); - cl_assert(index->tree == NULL); - cl_git_pass(git_oid_fromstr(&id, tree_id_str)); - cl_git_pass(git_tree_lookup(&tree, g_repo, &id)); - cl_git_pass(git_index_read_tree(index, tree)); - git_tree_free(tree); - - cl_assert(index->tree); - - memset(&entry, 0x0, sizeof(git_index_entry)); - git_oid_cpy(&entry.id, &git_index_get_byindex(index, 0)->id); - entry.mode = GIT_FILEMODE_BLOB; - entry.path = "some-new-file.txt"; - - cl_git_pass(git_index_add(index, &entry)); - - cl_assert_equal_i(-1, index->tree->entry_count); - - cl_git_pass(git_index_write(index)); - git_index_free(index); - - cl_git_pass(git_index_open(&index, index_file)); - cl_assert(index->tree); - - cl_assert_equal_i(-1, index->tree->entry_count); - cl_assert_equal_i(0, index->tree->children_count); - - cl_assert(git_oid_cmp(&id, &index->tree->oid)); - - cl_git_pass(p_unlink(index_file)); - git_index_free(index); -} - -void test_index_cache__read_tree_no_children(void) -{ - git_index *index; - git_index_entry entry; - git_tree *tree; - git_oid id; - - cl_git_pass(git_index_new(&index)); - cl_assert(index->tree == NULL); - cl_git_pass(git_oid_fromstr(&id, "45dd856fdd4d89b884c340ba0e047752d9b085d6")); - cl_git_pass(git_tree_lookup(&tree, g_repo, &id)); - cl_git_pass(git_index_read_tree(index, tree)); - git_tree_free(tree); - - cl_assert(index->tree); - cl_assert(git_oid_equal(&id, &index->tree->oid)); - cl_assert_equal_i(0, index->tree->children_count); - cl_assert_equal_i(git_index_entrycount(index), index->tree->entry_count); - - memset(&entry, 0x0, sizeof(git_index_entry)); - entry.path = "new.txt"; - entry.mode = GIT_FILEMODE_BLOB; - git_oid_fromstr(&entry.id, "45b983be36b73c0788dc9cbcb76cbb80fc7bb057"); - - cl_git_pass(git_index_add(index, &entry)); - cl_assert_equal_i(-1, index->tree->entry_count); - - git_index_free(index); -} - -void test_index_cache__two_levels(void) -{ - git_tree *tree; - git_oid tree_id; - git_index *index; - git_index_entry entry; - const git_tree_cache *tree_cache; - - cl_git_pass(git_repository_index(&index, g_repo)); - cl_git_pass(git_index_clear(index)); - - memset(&entry, 0x0, sizeof(entry)); - entry.mode = GIT_FILEMODE_BLOB; - cl_git_pass(git_oid_fromstr(&entry.id, "a8233120f6ad708f843d861ce2b7228ec4e3dec6")); - entry.path = "top-level.txt"; - cl_git_pass(git_index_add(index, &entry)); - - entry.path = "subdir/file.txt"; - cl_git_pass(git_index_add(index, &entry)); - - /* the read-tree fills the tree cache */ - cl_git_pass(git_index_write_tree(&tree_id, index)); - cl_git_pass(git_tree_lookup(&tree, g_repo, &tree_id)); - cl_git_pass(git_index_read_tree(index, tree)); - git_tree_free(tree); - cl_git_pass(git_index_write(index)); - - /* we now must have cache entries for "" and "subdir" */ - cl_assert(index->tree); - cl_assert(git_tree_cache_get(index->tree, "subdir")); - - cl_git_pass(git_index_read(index, true)); - /* we must still have cache entries for "" and "subdir", since we wrote it out */ - cl_assert(index->tree); - cl_assert(git_tree_cache_get(index->tree, "subdir")); - - entry.path = "top-level.txt"; - cl_git_pass(git_oid_fromstr(&entry.id, "3697d64be941a53d4ae8f6a271e4e3fa56b022cc")); - cl_git_pass(git_index_add(index, &entry)); - - /* writ out the index after we invalidate the root */ - cl_git_pass(git_index_write(index)); - cl_git_pass(git_index_read(index, true)); - - /* the cache for the subtree must still be valid, even if the root isn't */ - cl_assert(index->tree); - cl_assert_equal_i(-1, index->tree->entry_count); - cl_assert_equal_i(1, index->tree->children_count); - tree_cache = git_tree_cache_get(index->tree, "subdir"); - cl_assert(tree_cache); - cl_assert_equal_i(1, tree_cache->entry_count); - - git_index_free(index); -} - -void test_index_cache__read_tree_children(void) -{ - git_index *index; - git_index_entry entry; - git_tree *tree; - const git_tree_cache *cache; - git_oid tree_id; - - cl_git_pass(git_repository_index(&index, g_repo)); - cl_git_pass(git_index_clear(index)); - cl_assert(index->tree == NULL); - - - /* add a bunch of entries at different levels */ - memset(&entry, 0x0, sizeof(git_index_entry)); - entry.path = "top-level"; - entry.mode = GIT_FILEMODE_BLOB; - git_oid_fromstr(&entry.id, "45b983be36b73c0788dc9cbcb76cbb80fc7bb057"); - cl_git_pass(git_index_add(index, &entry)); - - - entry.path = "subdir/some-file"; - cl_git_pass(git_index_add(index, &entry)); - - entry.path = "subdir/even-deeper/some-file"; - cl_git_pass(git_index_add(index, &entry)); - - entry.path = "subdir2/some-file"; - cl_git_pass(git_index_add(index, &entry)); - - cl_git_pass(git_index_write_tree(&tree_id, index)); - cl_git_pass(git_index_clear(index)); - cl_assert(index->tree == NULL); - - cl_git_pass(git_tree_lookup(&tree, g_repo, &tree_id)); - cl_git_pass(git_index_read_tree(index, tree)); - git_tree_free(tree); - - cl_assert(index->tree); - cl_assert_equal_i(2, index->tree->children_count); - - /* override with a slightly different id, also dummy */ - entry.path = "subdir/some-file"; - git_oid_fromstr(&entry.id, "45b983be36b73c0788dc9cbcb76cbb80fc7bb058"); - cl_git_pass(git_index_add(index, &entry)); - - cl_assert_equal_i(-1, index->tree->entry_count); - - cache = git_tree_cache_get(index->tree, "subdir"); - cl_assert(cache); - cl_assert_equal_i(-1, cache->entry_count); - - cache = git_tree_cache_get(index->tree, "subdir/even-deeper"); - cl_assert(cache); - cl_assert_equal_i(1, cache->entry_count); - - cache = git_tree_cache_get(index->tree, "subdir2"); - cl_assert(cache); - cl_assert_equal_i(1, cache->entry_count); - - git_index_free(index); -} diff --git a/vendor/libgit2/tests/index/collision.c b/vendor/libgit2/tests/index/collision.c deleted file mode 100644 index 19c1548e91..0000000000 --- a/vendor/libgit2/tests/index/collision.c +++ /dev/null @@ -1,106 +0,0 @@ -#include "clar_libgit2.h" -#include "git2/repository.h" -#include "git2/index.h" - -git_repository *repo = NULL; - -void test_index_collision__cleanup(void) -{ - cl_git_sandbox_cleanup(); - repo = NULL; -} - -void test_index_collision__add(void) -{ - git_index *index; - git_index_entry entry; - git_oid tree_id; - git_tree *tree; - - repo = cl_git_sandbox_init("empty_standard_repo"); - cl_git_pass(git_repository_index(&index, repo)); - - memset(&entry, 0, sizeof(entry)); - entry.ctime.seconds = 12346789; - entry.mtime.seconds = 12346789; - entry.mode = 0100644; - entry.file_size = 0; - git_oid_fromstr(&entry.id, "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391"); - - entry.path = "a/b"; - cl_git_pass(git_index_add(index, &entry)); - - /* create a tree/blob collision */ - entry.path = "a/b/c"; - cl_git_fail(git_index_add(index, &entry)); - - cl_git_pass(git_index_write_tree(&tree_id, index)); - cl_git_pass(git_tree_lookup(&tree, repo, &tree_id)); - - git_tree_free(tree); - git_index_free(index); -} - -void test_index_collision__add_with_highstage_1(void) -{ - git_index *index; - git_index_entry entry; - - repo = cl_git_sandbox_init("empty_standard_repo"); - cl_git_pass(git_repository_index(&index, repo)); - - memset(&entry, 0, sizeof(entry)); - entry.ctime.seconds = 12346789; - entry.mtime.seconds = 12346789; - entry.mode = 0100644; - entry.file_size = 0; - git_oid_fromstr(&entry.id, "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391"); - - entry.path = "a/b"; - GIT_IDXENTRY_STAGE_SET(&entry, 2); - cl_git_pass(git_index_add(index, &entry)); - - /* create a blob beneath the previous tree entry */ - entry.path = "a/b/c"; - entry.flags = 0; - cl_git_pass(git_index_add(index, &entry)); - - /* create another tree entry above the blob */ - entry.path = "a/b"; - GIT_IDXENTRY_STAGE_SET(&entry, 1); - cl_git_pass(git_index_add(index, &entry)); - - git_index_free(index); -} - -void test_index_collision__add_with_highstage_2(void) -{ - git_index *index; - git_index_entry entry; - - repo = cl_git_sandbox_init("empty_standard_repo"); - cl_git_pass(git_repository_index(&index, repo)); - - memset(&entry, 0, sizeof(entry)); - entry.ctime.seconds = 12346789; - entry.mtime.seconds = 12346789; - entry.mode = 0100644; - entry.file_size = 0; - git_oid_fromstr(&entry.id, "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391"); - - entry.path = "a/b/c"; - GIT_IDXENTRY_STAGE_SET(&entry, 1); - cl_git_pass(git_index_add(index, &entry)); - - /* create a blob beneath the previous tree entry */ - entry.path = "a/b/c"; - GIT_IDXENTRY_STAGE_SET(&entry, 2); - cl_git_pass(git_index_add(index, &entry)); - - /* create another tree entry above the blob */ - entry.path = "a/b"; - GIT_IDXENTRY_STAGE_SET(&entry, 3); - cl_git_pass(git_index_add(index, &entry)); - - git_index_free(index); -} diff --git a/vendor/libgit2/tests/index/conflicts.c b/vendor/libgit2/tests/index/conflicts.c deleted file mode 100644 index b7a2456eba..0000000000 --- a/vendor/libgit2/tests/index/conflicts.c +++ /dev/null @@ -1,344 +0,0 @@ -#include "clar_libgit2.h" -#include "index.h" -#include "git2/repository.h" - -static git_repository *repo; -static git_index *repo_index; - -#define TEST_REPO_PATH "mergedrepo" -#define TEST_INDEX_PATH TEST_REPO_PATH "/.git/index" - -#define CONFLICTS_ONE_ANCESTOR_OID "1f85ca51b8e0aac893a621b61a9c2661d6aa6d81" -#define CONFLICTS_ONE_OUR_OID "6aea5f295304c36144ad6e9247a291b7f8112399" -#define CONFLICTS_ONE_THEIR_OID "516bd85f78061e09ccc714561d7b504672cb52da" - -#define CONFLICTS_TWO_ANCESTOR_OID "84af62840be1b1c47b778a8a249f3ff45155038c" -#define CONFLICTS_TWO_OUR_OID "8b3f43d2402825c200f835ca1762413e386fd0b2" -#define CONFLICTS_TWO_THEIR_OID "220bd62631c8cf7a83ef39c6b94595f00517211e" - -#define TEST_STAGED_OID "beefdadafeedabedcafedeedbabedeadbeaddeaf" -#define TEST_ANCESTOR_OID "f00ff00ff00ff00ff00ff00ff00ff00ff00ff00f" -#define TEST_OUR_OID "b44bb44bb44bb44bb44bb44bb44bb44bb44bb44b" -#define TEST_THEIR_OID "0123456789abcdef0123456789abcdef01234567" - -// Fixture setup and teardown -void test_index_conflicts__initialize(void) -{ - repo = cl_git_sandbox_init("mergedrepo"); - git_repository_index(&repo_index, repo); -} - -void test_index_conflicts__cleanup(void) -{ - git_index_free(repo_index); - repo_index = NULL; - - cl_git_sandbox_cleanup(); -} - -void test_index_conflicts__add(void) -{ - git_index_entry ancestor_entry, our_entry, their_entry; - - cl_assert(git_index_entrycount(repo_index) == 8); - - memset(&ancestor_entry, 0x0, sizeof(git_index_entry)); - memset(&our_entry, 0x0, sizeof(git_index_entry)); - memset(&their_entry, 0x0, sizeof(git_index_entry)); - - ancestor_entry.path = "test-one.txt"; - ancestor_entry.mode = 0100644; - GIT_IDXENTRY_STAGE_SET(&ancestor_entry, 1); - git_oid_fromstr(&ancestor_entry.id, TEST_ANCESTOR_OID); - - our_entry.path = "test-one.txt"; - our_entry.mode = 0100644; - GIT_IDXENTRY_STAGE_SET(&our_entry, 2); - git_oid_fromstr(&our_entry.id, TEST_OUR_OID); - - their_entry.path = "test-one.txt"; - their_entry.mode = 0100644; - GIT_IDXENTRY_STAGE_SET(&ancestor_entry, 2); - git_oid_fromstr(&their_entry.id, TEST_THEIR_OID); - - cl_git_pass(git_index_conflict_add(repo_index, &ancestor_entry, &our_entry, &their_entry)); - - cl_assert(git_index_entrycount(repo_index) == 11); -} - -void test_index_conflicts__add_fixes_incorrect_stage(void) -{ - git_index_entry ancestor_entry, our_entry, their_entry; - const git_index_entry *conflict_entry[3]; - - cl_assert(git_index_entrycount(repo_index) == 8); - - memset(&ancestor_entry, 0x0, sizeof(git_index_entry)); - memset(&our_entry, 0x0, sizeof(git_index_entry)); - memset(&their_entry, 0x0, sizeof(git_index_entry)); - - ancestor_entry.path = "test-one.txt"; - ancestor_entry.mode = 0100644; - GIT_IDXENTRY_STAGE_SET(&ancestor_entry, 3); - git_oid_fromstr(&ancestor_entry.id, TEST_ANCESTOR_OID); - - our_entry.path = "test-one.txt"; - our_entry.mode = 0100644; - GIT_IDXENTRY_STAGE_SET(&our_entry, 1); - git_oid_fromstr(&our_entry.id, TEST_OUR_OID); - - their_entry.path = "test-one.txt"; - their_entry.mode = 0100644; - GIT_IDXENTRY_STAGE_SET(&their_entry, 2); - git_oid_fromstr(&their_entry.id, TEST_THEIR_OID); - - cl_git_pass(git_index_conflict_add(repo_index, &ancestor_entry, &our_entry, &their_entry)); - - cl_assert(git_index_entrycount(repo_index) == 11); - - cl_git_pass(git_index_conflict_get(&conflict_entry[0], &conflict_entry[1], &conflict_entry[2], repo_index, "test-one.txt")); - - cl_assert(git_index_entry_stage(conflict_entry[0]) == 1); - cl_assert(git_index_entry_stage(conflict_entry[1]) == 2); - cl_assert(git_index_entry_stage(conflict_entry[2]) == 3); -} - -void test_index_conflicts__add_removes_stage_zero(void) -{ - git_index_entry staged, ancestor_entry, our_entry, their_entry; - const git_index_entry *conflict_entry[3]; - - cl_assert(git_index_entrycount(repo_index) == 8); - - memset(&staged, 0x0, sizeof(git_index_entry)); - memset(&ancestor_entry, 0x0, sizeof(git_index_entry)); - memset(&our_entry, 0x0, sizeof(git_index_entry)); - memset(&their_entry, 0x0, sizeof(git_index_entry)); - - staged.path = "test-one.txt"; - staged.mode = 0100644; - git_oid_fromstr(&staged.id, TEST_STAGED_OID); - cl_git_pass(git_index_add(repo_index, &staged)); - cl_assert(git_index_entrycount(repo_index) == 9); - - ancestor_entry.path = "test-one.txt"; - ancestor_entry.mode = 0100644; - GIT_IDXENTRY_STAGE_SET(&ancestor_entry, 3); - git_oid_fromstr(&ancestor_entry.id, TEST_ANCESTOR_OID); - - our_entry.path = "test-one.txt"; - our_entry.mode = 0100644; - GIT_IDXENTRY_STAGE_SET(&our_entry, 1); - git_oid_fromstr(&our_entry.id, TEST_OUR_OID); - - their_entry.path = "test-one.txt"; - their_entry.mode = 0100644; - GIT_IDXENTRY_STAGE_SET(&their_entry, 2); - git_oid_fromstr(&their_entry.id, TEST_THEIR_OID); - - cl_git_pass(git_index_conflict_add(repo_index, &ancestor_entry, &our_entry, &their_entry)); - - cl_assert(git_index_entrycount(repo_index) == 11); - - cl_assert_equal_p(NULL, git_index_get_bypath(repo_index, "test-one.txt", 0)); - - cl_git_pass(git_index_conflict_get(&conflict_entry[0], &conflict_entry[1], &conflict_entry[2], repo_index, "test-one.txt")); - - cl_assert_equal_oid(&ancestor_entry.id, &conflict_entry[0]->id); - cl_assert_equal_i(1, git_index_entry_stage(conflict_entry[0])); - cl_assert_equal_oid(&our_entry.id, &conflict_entry[1]->id); - cl_assert_equal_i(2, git_index_entry_stage(conflict_entry[1])); - cl_assert_equal_oid(&their_entry.id, &conflict_entry[2]->id); - cl_assert_equal_i(3, git_index_entry_stage(conflict_entry[2])); -} - -void test_index_conflicts__get(void) -{ - const git_index_entry *conflict_entry[3]; - git_oid oid; - - cl_git_pass(git_index_conflict_get(&conflict_entry[0], &conflict_entry[1], - &conflict_entry[2], repo_index, "conflicts-one.txt")); - - cl_assert_equal_s("conflicts-one.txt", conflict_entry[0]->path); - - git_oid_fromstr(&oid, CONFLICTS_ONE_ANCESTOR_OID); - cl_assert_equal_oid(&oid, &conflict_entry[0]->id); - - git_oid_fromstr(&oid, CONFLICTS_ONE_OUR_OID); - cl_assert_equal_oid(&oid, &conflict_entry[1]->id); - - git_oid_fromstr(&oid, CONFLICTS_ONE_THEIR_OID); - cl_assert_equal_oid(&oid, &conflict_entry[2]->id); - - cl_git_pass(git_index_conflict_get(&conflict_entry[0], &conflict_entry[1], - &conflict_entry[2], repo_index, "conflicts-two.txt")); - - cl_assert_equal_s("conflicts-two.txt", conflict_entry[0]->path); - - git_oid_fromstr(&oid, CONFLICTS_TWO_ANCESTOR_OID); - cl_assert_equal_oid(&oid, &conflict_entry[0]->id); - - git_oid_fromstr(&oid, CONFLICTS_TWO_OUR_OID); - cl_assert_equal_oid(&oid, &conflict_entry[1]->id); - - git_oid_fromstr(&oid, CONFLICTS_TWO_THEIR_OID); - cl_assert_equal_oid(&oid, &conflict_entry[2]->id); -} - -void test_index_conflicts__iterate(void) -{ - git_index_conflict_iterator *iterator; - const git_index_entry *conflict_entry[3]; - git_oid oid; - - cl_git_pass(git_index_conflict_iterator_new(&iterator, repo_index)); - - cl_git_pass(git_index_conflict_next(&conflict_entry[0], &conflict_entry[1], &conflict_entry[2], iterator)); - - git_oid_fromstr(&oid, CONFLICTS_ONE_ANCESTOR_OID); - cl_assert_equal_oid(&oid, &conflict_entry[0]->id); - cl_assert(git__strcmp(conflict_entry[0]->path, "conflicts-one.txt") == 0); - - git_oid_fromstr(&oid, CONFLICTS_ONE_OUR_OID); - cl_assert_equal_oid(&oid, &conflict_entry[1]->id); - cl_assert(git__strcmp(conflict_entry[0]->path, "conflicts-one.txt") == 0); - - git_oid_fromstr(&oid, CONFLICTS_ONE_THEIR_OID); - cl_assert_equal_oid(&oid, &conflict_entry[2]->id); - cl_assert(git__strcmp(conflict_entry[0]->path, "conflicts-one.txt") == 0); - - cl_git_pass(git_index_conflict_next(&conflict_entry[0], &conflict_entry[1], &conflict_entry[2], iterator)); - - git_oid_fromstr(&oid, CONFLICTS_TWO_ANCESTOR_OID); - cl_assert_equal_oid(&oid, &conflict_entry[0]->id); - cl_assert(git__strcmp(conflict_entry[0]->path, "conflicts-two.txt") == 0); - - git_oid_fromstr(&oid, CONFLICTS_TWO_OUR_OID); - cl_assert_equal_oid(&oid, &conflict_entry[1]->id); - cl_assert(git__strcmp(conflict_entry[0]->path, "conflicts-two.txt") == 0); - - git_oid_fromstr(&oid, CONFLICTS_TWO_THEIR_OID); - cl_assert_equal_oid(&oid, &conflict_entry[2]->id); - cl_assert(git__strcmp(conflict_entry[0]->path, "conflicts-two.txt") == 0); - - cl_assert(git_index_conflict_next(&conflict_entry[0], &conflict_entry[1], &conflict_entry[2], iterator) == GIT_ITEROVER); - - cl_assert(conflict_entry[0] == NULL); - cl_assert(conflict_entry[2] == NULL); - cl_assert(conflict_entry[2] == NULL); - - git_index_conflict_iterator_free(iterator); -} - -void test_index_conflicts__remove(void) -{ - const git_index_entry *entry; - size_t i; - - cl_assert(git_index_entrycount(repo_index) == 8); - - cl_git_pass(git_index_conflict_remove(repo_index, "conflicts-one.txt")); - cl_assert(git_index_entrycount(repo_index) == 5); - - for (i = 0; i < git_index_entrycount(repo_index); i++) { - cl_assert(entry = git_index_get_byindex(repo_index, i)); - cl_assert(strcmp(entry->path, "conflicts-one.txt") != 0); - } - - cl_git_pass(git_index_conflict_remove(repo_index, "conflicts-two.txt")); - cl_assert(git_index_entrycount(repo_index) == 2); - - for (i = 0; i < git_index_entrycount(repo_index); i++) { - cl_assert(entry = git_index_get_byindex(repo_index, i)); - cl_assert(strcmp(entry->path, "conflicts-two.txt") != 0); - } -} - -void test_index_conflicts__moved_to_reuc_on_add(void) -{ - const git_index_entry *entry; - size_t i; - - cl_assert(git_index_entrycount(repo_index) == 8); - - cl_git_mkfile("./mergedrepo/conflicts-one.txt", "new-file\n"); - - cl_git_pass(git_index_add_bypath(repo_index, "conflicts-one.txt")); - - cl_assert(git_index_entrycount(repo_index) == 6); - - for (i = 0; i < git_index_entrycount(repo_index); i++) { - cl_assert(entry = git_index_get_byindex(repo_index, i)); - - if (strcmp(entry->path, "conflicts-one.txt") == 0) - cl_assert(!git_index_entry_is_conflict(entry)); - } -} - -void test_index_conflicts__moved_to_reuc_on_remove(void) -{ - const git_index_entry *entry; - size_t i; - - cl_assert(git_index_entrycount(repo_index) == 8); - - cl_git_pass(p_unlink("./mergedrepo/conflicts-one.txt")); - - cl_git_pass(git_index_remove_bypath(repo_index, "conflicts-one.txt")); - - cl_assert(git_index_entrycount(repo_index) == 5); - - for (i = 0; i < git_index_entrycount(repo_index); i++) { - cl_assert(entry = git_index_get_byindex(repo_index, i)); - cl_assert(strcmp(entry->path, "conflicts-one.txt") != 0); - } -} - -void test_index_conflicts__remove_all_conflicts(void) -{ - size_t i; - const git_index_entry *entry; - - cl_assert(git_index_entrycount(repo_index) == 8); - - cl_assert_equal_i(true, git_index_has_conflicts(repo_index)); - - git_index_conflict_cleanup(repo_index); - - cl_assert_equal_i(false, git_index_has_conflicts(repo_index)); - - cl_assert(git_index_entrycount(repo_index) == 2); - - for (i = 0; i < git_index_entrycount(repo_index); i++) { - cl_assert(entry = git_index_get_byindex(repo_index, i)); - cl_assert(!git_index_entry_is_conflict(entry)); - } -} - -void test_index_conflicts__partial(void) -{ - git_index_entry ancestor_entry, our_entry, their_entry; - const git_index_entry *conflict_entry[3]; - - cl_assert(git_index_entrycount(repo_index) == 8); - - memset(&ancestor_entry, 0x0, sizeof(git_index_entry)); - memset(&our_entry, 0x0, sizeof(git_index_entry)); - memset(&their_entry, 0x0, sizeof(git_index_entry)); - - ancestor_entry.path = "test-one.txt"; - ancestor_entry.mode = 0100644; - GIT_IDXENTRY_STAGE_SET(&ancestor_entry, 1); - git_oid_fromstr(&ancestor_entry.id, TEST_ANCESTOR_OID); - - cl_git_pass(git_index_conflict_add(repo_index, &ancestor_entry, NULL, NULL)); - cl_assert(git_index_entrycount(repo_index) == 9); - - cl_git_pass(git_index_conflict_get(&conflict_entry[0], &conflict_entry[1], - &conflict_entry[2], repo_index, "test-one.txt")); - - cl_assert_equal_oid(&ancestor_entry.id, &conflict_entry[0]->id); - cl_assert(conflict_entry[1] == NULL); - cl_assert(conflict_entry[2] == NULL); -} diff --git a/vendor/libgit2/tests/index/crlf.c b/vendor/libgit2/tests/index/crlf.c deleted file mode 100644 index 23f47932f7..0000000000 --- a/vendor/libgit2/tests/index/crlf.c +++ /dev/null @@ -1,154 +0,0 @@ -#include "clar_libgit2.h" -#include "../filter/crlf.h" - -#include "git2/checkout.h" -#include "repository.h" -#include "posix.h" - -#define FILE_CONTENTS_LF "one\ntwo\nthree\nfour\n" -#define FILE_CONTENTS_CRLF "one\r\ntwo\r\nthree\r\nfour\r\n" - -#define FILE_OID_LF "f384549cbeb481e437091320de6d1f2e15e11b4a" -#define FILE_OID_CRLF "7fbf4d847b191141d80f30c8ab03d2ad4cd543a9" - -static git_repository *g_repo; -static git_index *g_index; - -void test_index_crlf__initialize(void) -{ - g_repo = cl_git_sandbox_init("crlf"); - cl_git_pass(git_repository_index(&g_index, g_repo)); -} - -void test_index_crlf__cleanup(void) -{ - git_index_free(g_index); - cl_git_sandbox_cleanup(); -} - -void test_index_crlf__autocrlf_false_no_attrs(void) -{ - const git_index_entry *entry; - git_oid oid; - - cl_repo_set_bool(g_repo, "core.autocrlf", false); - - cl_git_mkfile("./crlf/newfile.txt", - (GIT_EOL_NATIVE == GIT_EOL_CRLF) ? FILE_CONTENTS_CRLF : FILE_CONTENTS_LF); - - cl_git_pass(git_index_add_bypath(g_index, "newfile.txt")); - entry = git_index_get_bypath(g_index, "newfile.txt", 0); - - cl_git_pass(git_oid_fromstr(&oid, - (GIT_EOL_NATIVE == GIT_EOL_CRLF) ? FILE_OID_CRLF : FILE_OID_LF)); - cl_assert_equal_oid(&oid, &entry->id); -} - -void test_index_crlf__autocrlf_true_no_attrs(void) -{ - const git_index_entry *entry; - git_oid oid; - - cl_repo_set_bool(g_repo, "core.autocrlf", true); - - cl_git_mkfile("./crlf/newfile.txt", - (GIT_EOL_NATIVE == GIT_EOL_CRLF) ? FILE_CONTENTS_CRLF : FILE_CONTENTS_LF); - - cl_git_pass(git_index_add_bypath(g_index, "newfile.txt")); - entry = git_index_get_bypath(g_index, "newfile.txt", 0); - - cl_git_pass(git_oid_fromstr(&oid, FILE_OID_LF)); - cl_assert_equal_oid(&oid, &entry->id); -} - -void test_index_crlf__autocrlf_input_no_attrs(void) -{ - const git_index_entry *entry; - git_oid oid; - - cl_repo_set_string(g_repo, "core.autocrlf", "input"); - - cl_git_mkfile("./crlf/newfile.txt", - (GIT_EOL_NATIVE == GIT_EOL_CRLF) ? FILE_CONTENTS_CRLF : FILE_CONTENTS_LF); - - cl_git_pass(git_index_add_bypath(g_index, "newfile.txt")); - entry = git_index_get_bypath(g_index, "newfile.txt", 0); - - cl_git_pass(git_oid_fromstr(&oid, FILE_OID_LF)); - cl_assert_equal_oid(&oid, &entry->id); -} - -void test_index_crlf__autocrlf_false_text_auto_attr(void) -{ - const git_index_entry *entry; - git_oid oid; - - cl_git_mkfile("./crlf/.gitattributes", "* text=auto\n"); - - cl_repo_set_bool(g_repo, "core.autocrlf", false); - - cl_git_mkfile("./crlf/newfile.txt", - (GIT_EOL_NATIVE == GIT_EOL_CRLF) ? FILE_CONTENTS_CRLF : FILE_CONTENTS_LF); - - cl_git_pass(git_index_add_bypath(g_index, "newfile.txt")); - entry = git_index_get_bypath(g_index, "newfile.txt", 0); - - cl_git_pass(git_oid_fromstr(&oid, FILE_OID_LF)); - cl_assert_equal_oid(&oid, &entry->id); -} - -void test_index_crlf__autocrlf_true_text_auto_attr(void) -{ - const git_index_entry *entry; - git_oid oid; - - cl_git_mkfile("./crlf/.gitattributes", "* text=auto\n"); - - cl_repo_set_bool(g_repo, "core.autocrlf", false); - - cl_git_mkfile("./crlf/newfile.txt", - (GIT_EOL_NATIVE == GIT_EOL_CRLF) ? FILE_CONTENTS_CRLF : FILE_CONTENTS_LF); - - cl_git_pass(git_index_add_bypath(g_index, "newfile.txt")); - entry = git_index_get_bypath(g_index, "newfile.txt", 0); - - cl_git_pass(git_oid_fromstr(&oid, FILE_OID_LF)); - cl_assert_equal_oid(&oid, &entry->id); -} - -void test_index_crlf__autocrlf_input_text_auto_attr(void) -{ - const git_index_entry *entry; - git_oid oid; - - cl_git_mkfile("./crlf/.gitattributes", "* text=auto\n"); - - cl_repo_set_string(g_repo, "core.autocrlf", "input"); - - cl_git_mkfile("./crlf/newfile.txt", - (GIT_EOL_NATIVE == GIT_EOL_CRLF) ? FILE_CONTENTS_CRLF : FILE_CONTENTS_LF); - - cl_git_pass(git_index_add_bypath(g_index, "newfile.txt")); - entry = git_index_get_bypath(g_index, "newfile.txt", 0); - - cl_git_pass(git_oid_fromstr(&oid, FILE_OID_LF)); - cl_assert_equal_oid(&oid, &entry->id); -} - -void test_index_crlf__safecrlf_true_no_attrs(void) -{ - cl_repo_set_bool(g_repo, "core.autocrlf", true); - cl_repo_set_bool(g_repo, "core.safecrlf", true); - - cl_git_mkfile("crlf/newfile.txt", ALL_LF_TEXT_RAW); - cl_git_pass(git_index_add_bypath(g_index, "newfile.txt")); - - cl_git_mkfile("crlf/newfile.txt", ALL_CRLF_TEXT_RAW); - cl_git_pass(git_index_add_bypath(g_index, "newfile.txt")); - - cl_git_mkfile("crlf/newfile.txt", MORE_CRLF_TEXT_RAW); - cl_git_fail(git_index_add_bypath(g_index, "newfile.txt")); - - cl_git_mkfile("crlf/newfile.txt", MORE_LF_TEXT_RAW); - cl_git_fail(git_index_add_bypath(g_index, "newfile.txt")); -} diff --git a/vendor/libgit2/tests/index/filemodes.c b/vendor/libgit2/tests/index/filemodes.c deleted file mode 100644 index b3907996b4..0000000000 --- a/vendor/libgit2/tests/index/filemodes.c +++ /dev/null @@ -1,250 +0,0 @@ -#include "clar_libgit2.h" -#include "buffer.h" -#include "posix.h" -#include "index.h" - -static git_repository *g_repo = NULL; - -void test_index_filemodes__initialize(void) -{ - g_repo = cl_git_sandbox_init("filemodes"); -} - -void test_index_filemodes__cleanup(void) -{ - cl_git_sandbox_cleanup(); -} - -void test_index_filemodes__read(void) -{ - git_index *index; - unsigned int i; - static bool expected[6] = { 0, 1, 0, 1, 0, 1 }; - - cl_git_pass(git_repository_index(&index, g_repo)); - cl_assert_equal_i(6, (int)git_index_entrycount(index)); - - for (i = 0; i < 6; ++i) { - const git_index_entry *entry = git_index_get_byindex(index, i); - cl_assert(entry != NULL); - cl_assert(((entry->mode & 0100) ? 1 : 0) == expected[i]); - } - - git_index_free(index); -} - -static void replace_file_with_mode( - const char *filename, const char *backup, unsigned int create_mode) -{ - git_buf path = GIT_BUF_INIT, content = GIT_BUF_INIT; - - cl_git_pass(git_buf_joinpath(&path, "filemodes", filename)); - cl_git_pass(git_buf_printf(&content, "%s as %08u (%d)", - filename, create_mode, rand())); - - cl_git_pass(p_rename(path.ptr, backup)); - cl_git_write2file( - path.ptr, content.ptr, content.size, - O_WRONLY|O_CREAT|O_TRUNC, create_mode); - - git_buf_free(&path); - git_buf_free(&content); -} - -#define add_and_check_mode(I,F,X) add_and_check_mode_(I,F,X,__FILE__,__LINE__) - -static void add_and_check_mode_( - git_index *index, const char *filename, unsigned int expect_mode, - const char *file, int line) -{ - size_t pos; - const git_index_entry *entry; - - cl_git_pass(git_index_add_bypath(index, filename)); - - clar__assert(!git_index_find(&pos, index, filename), - file, line, "Cannot find index entry", NULL, 1); - - entry = git_index_get_byindex(index, pos); - - clar__assert_equal(file, line, "Expected mode does not match index", - 1, "%07o", (unsigned int)entry->mode, (unsigned int)expect_mode); -} - -void test_index_filemodes__untrusted(void) -{ - git_index *index; - - cl_repo_set_bool(g_repo, "core.filemode", false); - - cl_git_pass(git_repository_index(&index, g_repo)); - cl_assert((git_index_caps(index) & GIT_INDEXCAP_NO_FILEMODE) != 0); - - /* 1 - add 0644 over existing 0644 -> expect 0644 */ - replace_file_with_mode("exec_off", "filemodes/exec_off.0", 0644); - add_and_check_mode(index, "exec_off", GIT_FILEMODE_BLOB); - - /* 2 - add 0644 over existing 0755 -> expect 0755 */ - replace_file_with_mode("exec_on", "filemodes/exec_on.0", 0644); - add_and_check_mode(index, "exec_on", GIT_FILEMODE_BLOB_EXECUTABLE); - - /* 3 - add 0755 over existing 0644 -> expect 0644 */ - replace_file_with_mode("exec_off", "filemodes/exec_off.1", 0755); - add_and_check_mode(index, "exec_off", GIT_FILEMODE_BLOB); - - /* 4 - add 0755 over existing 0755 -> expect 0755 */ - replace_file_with_mode("exec_on", "filemodes/exec_on.1", 0755); - add_and_check_mode(index, "exec_on", GIT_FILEMODE_BLOB_EXECUTABLE); - - /* 5 - add new 0644 -> expect 0644 */ - cl_git_write2file("filemodes/new_off", "blah", 0, - O_WRONLY | O_CREAT | O_TRUNC, 0644); - add_and_check_mode(index, "new_off", GIT_FILEMODE_BLOB); - - /* 6 - add new 0755 -> expect 0644 if core.filemode == false */ - cl_git_write2file("filemodes/new_on", "blah", 0, - O_WRONLY | O_CREAT | O_TRUNC, 0755); - add_and_check_mode(index, "new_on", GIT_FILEMODE_BLOB); - - git_index_free(index); -} - -void test_index_filemodes__trusted(void) -{ - git_index *index; - - /* Only run these tests on platforms where I can actually - * chmod a file and get the stat results I expect! - */ - if (!cl_is_chmod_supported()) - return; - - cl_repo_set_bool(g_repo, "core.filemode", true); - - cl_git_pass(git_repository_index(&index, g_repo)); - cl_assert((git_index_caps(index) & GIT_INDEXCAP_NO_FILEMODE) == 0); - - /* 1 - add 0644 over existing 0644 -> expect 0644 */ - replace_file_with_mode("exec_off", "filemodes/exec_off.0", 0644); - add_and_check_mode(index, "exec_off", GIT_FILEMODE_BLOB); - - /* 2 - add 0644 over existing 0755 -> expect 0644 */ - replace_file_with_mode("exec_on", "filemodes/exec_on.0", 0644); - add_and_check_mode(index, "exec_on", GIT_FILEMODE_BLOB); - - /* 3 - add 0755 over existing 0644 -> expect 0755 */ - replace_file_with_mode("exec_off", "filemodes/exec_off.1", 0755); - add_and_check_mode(index, "exec_off", GIT_FILEMODE_BLOB_EXECUTABLE); - - /* 4 - add 0755 over existing 0755 -> expect 0755 */ - replace_file_with_mode("exec_on", "filemodes/exec_on.1", 0755); - add_and_check_mode(index, "exec_on", GIT_FILEMODE_BLOB_EXECUTABLE); - - /* 5 - add new 0644 -> expect 0644 */ - cl_git_write2file("filemodes/new_off", "blah", 0, - O_WRONLY | O_CREAT | O_TRUNC, 0644); - add_and_check_mode(index, "new_off", GIT_FILEMODE_BLOB); - - /* 6 - add 0755 -> expect 0755 */ - cl_git_write2file("filemodes/new_on", "blah", 0, - O_WRONLY | O_CREAT | O_TRUNC, 0755); - add_and_check_mode(index, "new_on", GIT_FILEMODE_BLOB_EXECUTABLE); - - git_index_free(index); -} - -#define add_entry_and_check_mode(I,FF,X) add_entry_and_check_mode_(I,FF,X,__FILE__,__LINE__) - -static void add_entry_and_check_mode_( - git_index *index, bool from_file, git_filemode_t mode, - const char *file, int line) -{ - size_t pos; - const git_index_entry* entry; - git_index_entry new_entry; - - /* If old_filename exists, we copy that to the new file, and test - * git_index_add(), otherwise create a new entry testing git_index_add_frombuffer - */ - if (from_file) - { - clar__assert(!git_index_find(&pos, index, "exec_off"), - file, line, "Cannot find original index entry", NULL, 1); - - entry = git_index_get_byindex(index, pos); - - memcpy(&new_entry, entry, sizeof(new_entry)); - } - else - memset(&new_entry, 0x0, sizeof(git_index_entry)); - - new_entry.path = "filemodes/explicit_test"; - new_entry.mode = mode; - - if (from_file) - { - clar__assert(!git_index_add(index, &new_entry), - file, line, "Cannot add index entry", NULL, 1); - } - else - { - const char *content = "hey there\n"; - clar__assert(!git_index_add_frombuffer(index, &new_entry, content, strlen(content)), - file, line, "Cannot add index entry from buffer", NULL, 1); - } - - clar__assert(!git_index_find(&pos, index, "filemodes/explicit_test"), - file, line, "Cannot find new index entry", NULL, 1); - - entry = git_index_get_byindex(index, pos); - - clar__assert_equal(file, line, "Expected mode does not match index", - 1, "%07o", (unsigned int)entry->mode, (unsigned int)mode); -} - -void test_index_filemodes__explicit(void) -{ - git_index *index; - - /* These tests should run and work everywhere, as the filemode is - * given explicitly to git_index_add or git_index_add_frombuffer - */ - cl_repo_set_bool(g_repo, "core.filemode", false); - - cl_git_pass(git_repository_index(&index, g_repo)); - - /* Each of these tests keeps overwriting the same file in the index. */ - /* 1 - add new 0644 entry */ - add_entry_and_check_mode(index, true, GIT_FILEMODE_BLOB); - - /* 2 - add 0755 entry over existing 0644 */ - add_entry_and_check_mode(index, true, GIT_FILEMODE_BLOB_EXECUTABLE); - - /* 3 - add 0644 entry over existing 0755 */ - add_entry_and_check_mode(index, true, GIT_FILEMODE_BLOB); - - /* 4 - add 0755 buffer entry over existing 0644 */ - add_entry_and_check_mode(index, false, GIT_FILEMODE_BLOB_EXECUTABLE); - - /* 5 - add 0644 buffer entry over existing 0755 */ - add_entry_and_check_mode(index, false, GIT_FILEMODE_BLOB); - - git_index_free(index); -} - -void test_index_filemodes__invalid(void) -{ - git_index *index; - git_index_entry entry; - - cl_git_pass(git_repository_index(&index, g_repo)); - - entry.path = "foo"; - entry.mode = GIT_OBJ_BLOB; - cl_git_fail(git_index_add(index, &entry)); - - entry.mode = GIT_FILEMODE_BLOB; - cl_git_pass(git_index_add(index, &entry)); - - git_index_free(index); -} diff --git a/vendor/libgit2/tests/index/inmemory.c b/vendor/libgit2/tests/index/inmemory.c deleted file mode 100644 index 38e91e0fd9..0000000000 --- a/vendor/libgit2/tests/index/inmemory.c +++ /dev/null @@ -1,22 +0,0 @@ -#include "clar_libgit2.h" - -void test_index_inmemory__can_create_an_inmemory_index(void) -{ - git_index *index; - - cl_git_pass(git_index_new(&index)); - cl_assert_equal_i(0, (int)git_index_entrycount(index)); - - git_index_free(index); -} - -void test_index_inmemory__cannot_add_bypath_to_an_inmemory_index(void) -{ - git_index *index; - - cl_git_pass(git_index_new(&index)); - - cl_assert_equal_i(GIT_ERROR, git_index_add_bypath(index, "test.txt")); - - git_index_free(index); -} diff --git a/vendor/libgit2/tests/index/names.c b/vendor/libgit2/tests/index/names.c deleted file mode 100644 index d462088b28..0000000000 --- a/vendor/libgit2/tests/index/names.c +++ /dev/null @@ -1,148 +0,0 @@ -#include "clar_libgit2.h" -#include "index.h" -#include "git2/sys/index.h" -#include "git2/repository.h" -#include "../reset/reset_helpers.h" - -static git_repository *repo; -static git_index *repo_index; - -#define TEST_REPO_PATH "mergedrepo" -#define TEST_INDEX_PATH TEST_REPO_PATH "/.git/index" - -// Fixture setup and teardown -void test_index_names__initialize(void) -{ - repo = cl_git_sandbox_init("mergedrepo"); - git_repository_index(&repo_index, repo); -} - -void test_index_names__cleanup(void) -{ - git_index_free(repo_index); - repo_index = NULL; - - cl_git_sandbox_cleanup(); -} - -void test_index_names__add(void) -{ - const git_index_name_entry *conflict_name; - - cl_git_pass(git_index_name_add(repo_index, "ancestor", "ours", "theirs")); - cl_git_pass(git_index_name_add(repo_index, "ancestor2", "ours2", NULL)); - cl_git_pass(git_index_name_add(repo_index, "ancestor3", NULL, "theirs3")); - - cl_assert(git_index_name_entrycount(repo_index) == 3); - - conflict_name = git_index_name_get_byindex(repo_index, 0); - cl_assert(strcmp(conflict_name->ancestor, "ancestor") == 0); - cl_assert(strcmp(conflict_name->ours, "ours") == 0); - cl_assert(strcmp(conflict_name->theirs, "theirs") == 0); - - conflict_name = git_index_name_get_byindex(repo_index, 1); - cl_assert(strcmp(conflict_name->ancestor, "ancestor2") == 0); - cl_assert(strcmp(conflict_name->ours, "ours2") == 0); - cl_assert(conflict_name->theirs == NULL); - - conflict_name = git_index_name_get_byindex(repo_index, 2); - cl_assert(strcmp(conflict_name->ancestor, "ancestor3") == 0); - cl_assert(conflict_name->ours == NULL); - cl_assert(strcmp(conflict_name->theirs, "theirs3") == 0); -} - -void test_index_names__roundtrip(void) -{ - const git_index_name_entry *conflict_name; - - cl_git_pass(git_index_name_add(repo_index, "ancestor", "ours", "theirs")); - cl_git_pass(git_index_name_add(repo_index, "ancestor2", "ours2", NULL)); - cl_git_pass(git_index_name_add(repo_index, "ancestor3", NULL, "theirs3")); - - cl_git_pass(git_index_write(repo_index)); - git_index_clear(repo_index); - cl_assert(git_index_name_entrycount(repo_index) == 0); - - cl_git_pass(git_index_read(repo_index, true)); - cl_assert(git_index_name_entrycount(repo_index) == 3); - - conflict_name = git_index_name_get_byindex(repo_index, 0); - cl_assert(strcmp(conflict_name->ancestor, "ancestor") == 0); - cl_assert(strcmp(conflict_name->ours, "ours") == 0); - cl_assert(strcmp(conflict_name->theirs, "theirs") == 0); - - conflict_name = git_index_name_get_byindex(repo_index, 1); - cl_assert(strcmp(conflict_name->ancestor, "ancestor2") == 0); - cl_assert(strcmp(conflict_name->ours, "ours2") == 0); - cl_assert(conflict_name->theirs == NULL); - - conflict_name = git_index_name_get_byindex(repo_index, 2); - cl_assert(strcmp(conflict_name->ancestor, "ancestor3") == 0); - cl_assert(conflict_name->ours == NULL); - cl_assert(strcmp(conflict_name->theirs, "theirs3") == 0); -} - -void test_index_names__cleaned_on_reset_hard(void) -{ - git_object *target; - - cl_git_pass(git_revparse_single(&target, repo, "3a34580")); - - test_index_names__add(); - cl_git_pass(git_reset(repo, target, GIT_RESET_HARD, NULL)); - cl_assert(git_index_name_entrycount(repo_index) == 0); - - git_object_free(target); -} - -void test_index_names__cleaned_on_reset_mixed(void) -{ - git_object *target; - - cl_git_pass(git_revparse_single(&target, repo, "3a34580")); - - test_index_names__add(); - cl_git_pass(git_reset(repo, target, GIT_RESET_MIXED, NULL)); - cl_assert(git_index_name_entrycount(repo_index) == 0); - - git_object_free(target); -} - -void test_index_names__cleaned_on_checkout_tree(void) -{ - git_oid oid; - git_object *obj; - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - - opts.checkout_strategy = GIT_CHECKOUT_SAFE | GIT_CHECKOUT_UPDATE_ONLY; - - test_index_names__add(); - git_reference_name_to_id(&oid, repo, "refs/heads/master"); - git_object_lookup(&obj, repo, &oid, GIT_OBJ_ANY); - git_checkout_tree(repo, obj, &opts); - cl_assert_equal_sz(0, git_index_name_entrycount(repo_index)); - - git_object_free(obj); -} - -void test_index_names__cleaned_on_checkout_head(void) -{ - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - - opts.checkout_strategy = GIT_CHECKOUT_SAFE | GIT_CHECKOUT_UPDATE_ONLY; - - test_index_names__add(); - git_checkout_head(repo, &opts); - cl_assert_equal_sz(0, git_index_name_entrycount(repo_index)); -} - -void test_index_names__retained_on_checkout_index(void) -{ - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - - opts.checkout_strategy = GIT_CHECKOUT_SAFE | GIT_CHECKOUT_UPDATE_ONLY; - - test_index_names__add(); - git_checkout_index(repo, repo_index, &opts); - cl_assert(git_index_name_entrycount(repo_index) > 0); -} diff --git a/vendor/libgit2/tests/index/racy.c b/vendor/libgit2/tests/index/racy.c deleted file mode 100644 index 3b26aabf44..0000000000 --- a/vendor/libgit2/tests/index/racy.c +++ /dev/null @@ -1,147 +0,0 @@ -#include "clar_libgit2.h" -#include "../checkout/checkout_helpers.h" - -#include "buffer.h" -#include "index.h" -#include "repository.h" - -static git_repository *g_repo; - -void test_index_racy__initialize(void) -{ - cl_git_pass(git_repository_init(&g_repo, "diff_racy", false)); -} - -void test_index_racy__cleanup(void) -{ - git_repository_free(g_repo); - g_repo = NULL; - - cl_fixture_cleanup("diff_racy"); -} - -void test_index_racy__diff(void) -{ - git_index *index; - git_diff *diff; - git_buf path = GIT_BUF_INIT; - - cl_git_pass(git_buf_joinpath(&path, git_repository_workdir(g_repo), "A")); - cl_git_mkfile(path.ptr, "A"); - - /* Put 'A' into the index */ - cl_git_pass(git_repository_index(&index, g_repo)); - cl_git_pass(git_index_add_bypath(index, "A")); - cl_git_pass(git_index_write(index)); - - cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, index, NULL)); - cl_assert_equal_i(0, git_diff_num_deltas(diff)); - git_diff_free(diff); - - /* Change its contents quickly, so we get the same timestamp */ - cl_git_mkfile(path.ptr, "B"); - - cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, index, NULL)); - cl_assert_equal_i(1, git_diff_num_deltas(diff)); - - git_index_free(index); - git_diff_free(diff); - git_buf_free(&path); -} - -void test_index_racy__write_index_just_after_file(void) -{ - git_index *index; - git_diff *diff; - git_buf path = GIT_BUF_INIT; - struct timeval times[2]; - - /* Make sure we do have a timestamp */ - cl_git_pass(git_repository_index(&index, g_repo)); - cl_git_pass(git_index_write(index)); - - cl_git_pass(git_buf_joinpath(&path, git_repository_workdir(g_repo), "A")); - cl_git_mkfile(path.ptr, "A"); - /* Force the file's timestamp to be a second after we wrote the index */ - times[0].tv_sec = index->stamp.mtime + 1; - times[0].tv_usec = 0; - times[1].tv_sec = index->stamp.mtime + 1; - times[1].tv_usec = 0; - cl_git_pass(p_utimes(path.ptr, times)); - - /* - * Put 'A' into the index, the size field will be filled, - * because the index' on-disk timestamp does not match the - * file's timestamp. - */ - cl_git_pass(git_index_add_bypath(index, "A")); - cl_git_pass(git_index_write(index)); - - cl_git_mkfile(path.ptr, "B"); - /* - * Pretend this index' modification happend a second after the - * file update, and rewrite the file in that same second. - */ - times[0].tv_sec = index->stamp.mtime + 2; - times[0].tv_usec = 0; - times[1].tv_sec = index->stamp.mtime + 2; - times[0].tv_usec = 0; - - cl_git_pass(p_utimes(git_index_path(index), times)); - cl_git_pass(p_utimes(path.ptr, times)); - - cl_git_pass(git_index_read(index, true)); - - cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, index, NULL)); - cl_assert_equal_i(1, git_diff_num_deltas(diff)); - - git_buf_free(&path); - git_diff_free(diff); - git_index_free(index); -} - -void test_index_racy__empty_file_after_smudge(void) -{ - git_index *index; - git_diff *diff; - git_buf path = GIT_BUF_INIT; - int i, found_race = 0; - const git_index_entry *entry; - - /* Make sure we do have a timestamp */ - cl_git_pass(git_repository_index__weakptr(&index, g_repo)); - cl_git_pass(git_index_write(index)); - - cl_git_pass(git_buf_joinpath(&path, git_repository_workdir(g_repo), "A")); - - /* Make sure writing the file, adding and rewriting happen in the same second */ - for (i = 0; i < 10; i++) { - struct stat st; - cl_git_mkfile(path.ptr, "A"); - - cl_git_pass(git_index_add_bypath(index, "A")); - cl_git_mkfile(path.ptr, "B"); - cl_git_pass(git_index_write(index)); - - cl_git_mkfile(path.ptr, ""); - - cl_git_pass(p_stat(path.ptr, &st)); - cl_assert(entry = git_index_get_bypath(index, "A", 0)); - if (entry->mtime.seconds == (int32_t) st.st_mtime) { - found_race = 1; - break; - } - - } - - if (!found_race) - cl_fail("failed to find race after 10 attempts"); - - cl_assert_equal_i(0, entry->file_size); - - cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, index, NULL)); - cl_assert_equal_i(1, git_diff_num_deltas(diff)); - - git_buf_free(&path); - git_diff_free(diff); -} diff --git a/vendor/libgit2/tests/index/read_index.c b/vendor/libgit2/tests/index/read_index.c deleted file mode 100644 index 82a771d54f..0000000000 --- a/vendor/libgit2/tests/index/read_index.c +++ /dev/null @@ -1,73 +0,0 @@ -#include "clar_libgit2.h" -#include "posix.h" -#include "index.h" - -static git_repository *_repo; -static git_index *_index; - -void test_index_read_index__initialize(void) -{ - git_object *head; - git_reference *head_ref; - - _repo = cl_git_sandbox_init("testrepo"); - cl_git_pass(git_revparse_ext(&head, &head_ref, _repo, "HEAD")); - cl_git_pass(git_reset(_repo, head, GIT_RESET_HARD, NULL)); - cl_git_pass(git_repository_index(&_index, _repo)); - - git_reference_free(head_ref); - git_object_free(head); -} - -void test_index_read_index__cleanup(void) -{ - git_index_free(_index); - cl_git_sandbox_cleanup(); -} - -void test_index_read_index__maintains_stat_cache(void) -{ - git_index *new_index; - git_oid index_id; - git_index_entry new_entry; - const git_index_entry *e; - git_tree *tree; - size_t i; - - cl_assert_equal_i(4, git_index_entrycount(_index)); - - /* write-tree */ - cl_git_pass(git_index_write_tree(&index_id, _index)); - - /* read-tree, then read index */ - git_tree_lookup(&tree, _repo, &index_id); - cl_git_pass(git_index_new(&new_index)); - cl_git_pass(git_index_read_tree(new_index, tree)); - git_tree_free(tree); - - /* add a new entry that will not have stat data */ - memset(&new_entry, 0, sizeof(git_index_entry)); - new_entry.path = "Hello"; - git_oid_fromstr(&new_entry.id, "0123456789012345678901234567890123456789"); - new_entry.file_size = 1234; - new_entry.mode = 0100644; - cl_git_pass(git_index_add(new_index, &new_entry)); - cl_assert_equal_i(5, git_index_entrycount(new_index)); - - cl_git_pass(git_index_read_index(_index, new_index)); - git_index_free(new_index); - - cl_assert_equal_i(5, git_index_entrycount(_index)); - - for (i = 0; i < git_index_entrycount(_index); i++) { - e = git_index_get_byindex(_index, i); - - if (strcmp(e->path, "Hello") == 0) { - cl_assert_equal_i(0, e->ctime.seconds); - cl_assert_equal_i(0, e->mtime.seconds); - } else { - cl_assert(0 != e->ctime.seconds); - cl_assert(0 != e->mtime.seconds); - } - } -} diff --git a/vendor/libgit2/tests/index/read_tree.c b/vendor/libgit2/tests/index/read_tree.c deleted file mode 100644 index 0e18828189..0000000000 --- a/vendor/libgit2/tests/index/read_tree.c +++ /dev/null @@ -1,46 +0,0 @@ -#include "clar_libgit2.h" -#include "posix.h" - -/* Test that reading and writing a tree is a no-op */ -void test_index_read_tree__read_write_involution(void) -{ - git_repository *repo; - git_index *index; - git_oid tree_oid; - git_tree *tree; - git_oid expected; - - p_mkdir("read_tree", 0700); - - cl_git_pass(git_repository_init(&repo, "./read_tree", 0)); - cl_git_pass(git_repository_index(&index, repo)); - - cl_assert(git_index_entrycount(index) == 0); - - p_mkdir("./read_tree/abc", 0700); - - /* Sort order: '-' < '/' < '_' */ - cl_git_mkfile("./read_tree/abc-d", NULL); - cl_git_mkfile("./read_tree/abc/d", NULL); - cl_git_mkfile("./read_tree/abc_d", NULL); - - cl_git_pass(git_index_add_bypath(index, "abc-d")); - cl_git_pass(git_index_add_bypath(index, "abc_d")); - cl_git_pass(git_index_add_bypath(index, "abc/d")); - - /* write-tree */ - cl_git_pass(git_index_write_tree(&expected, index)); - - /* read-tree */ - git_tree_lookup(&tree, repo, &expected); - cl_git_pass(git_index_read_tree(index, tree)); - git_tree_free(tree); - - cl_git_pass(git_index_write_tree(&tree_oid, index)); - cl_assert_equal_oid(&expected, &tree_oid); - - git_index_free(index); - git_repository_free(repo); - - cl_fixture_cleanup("read_tree"); -} diff --git a/vendor/libgit2/tests/index/rename.c b/vendor/libgit2/tests/index/rename.c deleted file mode 100644 index dd3cfa7329..0000000000 --- a/vendor/libgit2/tests/index/rename.c +++ /dev/null @@ -1,50 +0,0 @@ -#include "clar_libgit2.h" -#include "posix.h" - -void test_index_rename__single_file(void) -{ - git_repository *repo; - git_index *index; - size_t position; - git_oid expected; - const git_index_entry *entry; - - p_mkdir("rename", 0700); - - cl_git_pass(git_repository_init(&repo, "./rename", 0)); - cl_git_pass(git_repository_index(&index, repo)); - - cl_assert(git_index_entrycount(index) == 0); - - cl_git_mkfile("./rename/lame.name.txt", "new_file\n"); - - /* This should add a new blob to the object database in 'd4/fa8600b4f37d7516bef4816ae2c64dbf029e3a' */ - cl_git_pass(git_index_add_bypath(index, "lame.name.txt")); - cl_assert(git_index_entrycount(index) == 1); - - cl_git_pass(git_oid_fromstr(&expected, "d4fa8600b4f37d7516bef4816ae2c64dbf029e3a")); - - cl_assert(!git_index_find(&position, index, "lame.name.txt")); - - entry = git_index_get_byindex(index, position); - cl_assert_equal_oid(&expected, &entry->id); - - /* This removes the entry from the index, but not from the object database */ - cl_git_pass(git_index_remove(index, "lame.name.txt", 0)); - cl_assert(git_index_entrycount(index) == 0); - - p_rename("./rename/lame.name.txt", "./rename/fancy.name.txt"); - - cl_git_pass(git_index_add_bypath(index, "fancy.name.txt")); - cl_assert(git_index_entrycount(index) == 1); - - cl_assert(!git_index_find(&position, index, "fancy.name.txt")); - - entry = git_index_get_byindex(index, position); - cl_assert_equal_oid(&expected, &entry->id); - - git_index_free(index); - git_repository_free(repo); - - cl_fixture_cleanup("rename"); -} diff --git a/vendor/libgit2/tests/index/reuc.c b/vendor/libgit2/tests/index/reuc.c deleted file mode 100644 index e57facc0c9..0000000000 --- a/vendor/libgit2/tests/index/reuc.c +++ /dev/null @@ -1,372 +0,0 @@ -#include "clar_libgit2.h" -#include "index.h" -#include "git2/sys/index.h" -#include "git2/repository.h" -#include "../reset/reset_helpers.h" - -static git_repository *repo; -static git_index *repo_index; - -#define TEST_REPO_PATH "mergedrepo" -#define TEST_INDEX_PATH TEST_REPO_PATH "/.git/index" - -#define ONE_ANCESTOR_OID "478871385b9cd03908c5383acfd568bef023c6b3" -#define ONE_OUR_OID "4458b8bc9e72b6c8755ae456f60e9844d0538d8c" -#define ONE_THEIR_OID "8b72416545c7e761b64cecad4f1686eae4078aa8" - -#define TWO_ANCESTOR_OID "9d81f82fccc7dcd7de7a1ffead1815294c2e092c" -#define TWO_OUR_OID "8f3c06cff9a83757cec40c80bc9bf31a2582bde9" -#define TWO_THEIR_OID "887b153b165d32409c70163e0f734c090f12f673" - -// Fixture setup and teardown -void test_index_reuc__initialize(void) -{ - repo = cl_git_sandbox_init("mergedrepo"); - git_repository_index(&repo_index, repo); -} - -void test_index_reuc__cleanup(void) -{ - git_index_free(repo_index); - repo_index = NULL; - - cl_git_sandbox_cleanup(); -} - -void test_index_reuc__add(void) -{ - git_oid ancestor_oid, our_oid, their_oid; - const git_index_reuc_entry *reuc; - - git_oid_fromstr(&ancestor_oid, ONE_ANCESTOR_OID); - git_oid_fromstr(&our_oid, ONE_OUR_OID); - git_oid_fromstr(&their_oid, ONE_THEIR_OID); - - cl_git_pass(git_index_reuc_add(repo_index, "newfile.txt", - 0100644, &ancestor_oid, - 0100644, &our_oid, - 0100644, &their_oid)); - - cl_assert(reuc = git_index_reuc_get_bypath(repo_index, "newfile.txt")); - - cl_assert_equal_s("newfile.txt", reuc->path); - cl_assert(reuc->mode[0] == 0100644); - cl_assert(reuc->mode[1] == 0100644); - cl_assert(reuc->mode[2] == 0100644); - cl_assert_equal_oid(&reuc->oid[0], &ancestor_oid); - cl_assert_equal_oid(&reuc->oid[1], &our_oid); - cl_assert_equal_oid(&reuc->oid[2], &their_oid); -} - -void test_index_reuc__add_no_ancestor(void) -{ - git_oid ancestor_oid, our_oid, their_oid; - const git_index_reuc_entry *reuc; - - memset(&ancestor_oid, 0x0, sizeof(git_oid)); - git_oid_fromstr(&our_oid, ONE_OUR_OID); - git_oid_fromstr(&their_oid, ONE_THEIR_OID); - - cl_git_pass(git_index_reuc_add(repo_index, "newfile.txt", - 0, NULL, - 0100644, &our_oid, - 0100644, &their_oid)); - - cl_assert(reuc = git_index_reuc_get_bypath(repo_index, "newfile.txt")); - - cl_assert_equal_s("newfile.txt", reuc->path); - cl_assert(reuc->mode[0] == 0); - cl_assert(reuc->mode[1] == 0100644); - cl_assert(reuc->mode[2] == 0100644); - cl_assert_equal_oid(&reuc->oid[0], &ancestor_oid); - cl_assert_equal_oid(&reuc->oid[1], &our_oid); - cl_assert_equal_oid(&reuc->oid[2], &their_oid); -} - -void test_index_reuc__read_bypath(void) -{ - const git_index_reuc_entry *reuc; - git_oid oid; - - cl_assert_equal_i(2, git_index_reuc_entrycount(repo_index)); - - cl_assert(reuc = git_index_reuc_get_bypath(repo_index, "two.txt")); - - cl_assert_equal_s("two.txt", reuc->path); - cl_assert(reuc->mode[0] == 0100644); - cl_assert(reuc->mode[1] == 0100644); - cl_assert(reuc->mode[2] == 0100644); - git_oid_fromstr(&oid, TWO_ANCESTOR_OID); - cl_assert_equal_oid(&reuc->oid[0], &oid); - git_oid_fromstr(&oid, TWO_OUR_OID); - cl_assert_equal_oid(&reuc->oid[1], &oid); - git_oid_fromstr(&oid, TWO_THEIR_OID); - cl_assert_equal_oid(&reuc->oid[2], &oid); - - cl_assert(reuc = git_index_reuc_get_bypath(repo_index, "one.txt")); - - cl_assert_equal_s("one.txt", reuc->path); - cl_assert(reuc->mode[0] == 0100644); - cl_assert(reuc->mode[1] == 0100644); - cl_assert(reuc->mode[2] == 0100644); - git_oid_fromstr(&oid, ONE_ANCESTOR_OID); - cl_assert_equal_oid(&reuc->oid[0], &oid); - git_oid_fromstr(&oid, ONE_OUR_OID); - cl_assert_equal_oid(&reuc->oid[1], &oid); - git_oid_fromstr(&oid, ONE_THEIR_OID); - cl_assert_equal_oid(&reuc->oid[2], &oid); -} - -void test_index_reuc__ignore_case(void) -{ - const git_index_reuc_entry *reuc; - git_oid oid; - int index_caps; - - index_caps = git_index_caps(repo_index); - - index_caps &= ~GIT_INDEXCAP_IGNORE_CASE; - cl_git_pass(git_index_set_caps(repo_index, index_caps)); - - cl_assert(!git_index_reuc_get_bypath(repo_index, "TWO.txt")); - - index_caps |= GIT_INDEXCAP_IGNORE_CASE; - cl_git_pass(git_index_set_caps(repo_index, index_caps)); - - cl_assert_equal_i(2, git_index_reuc_entrycount(repo_index)); - - cl_assert(reuc = git_index_reuc_get_bypath(repo_index, "TWO.txt")); - - cl_assert_equal_s("two.txt", reuc->path); - cl_assert(reuc->mode[0] == 0100644); - cl_assert(reuc->mode[1] == 0100644); - cl_assert(reuc->mode[2] == 0100644); - git_oid_fromstr(&oid, TWO_ANCESTOR_OID); - cl_assert_equal_oid(&reuc->oid[0], &oid); - git_oid_fromstr(&oid, TWO_OUR_OID); - cl_assert_equal_oid(&reuc->oid[1], &oid); - git_oid_fromstr(&oid, TWO_THEIR_OID); - cl_assert_equal_oid(&reuc->oid[2], &oid); -} - -void test_index_reuc__read_byindex(void) -{ - const git_index_reuc_entry *reuc; - git_oid oid; - - cl_assert_equal_i(2, git_index_reuc_entrycount(repo_index)); - - cl_assert(reuc = git_index_reuc_get_byindex(repo_index, 0)); - - cl_assert_equal_s("one.txt", reuc->path); - cl_assert(reuc->mode[0] == 0100644); - cl_assert(reuc->mode[1] == 0100644); - cl_assert(reuc->mode[2] == 0100644); - git_oid_fromstr(&oid, ONE_ANCESTOR_OID); - cl_assert_equal_oid(&reuc->oid[0], &oid); - git_oid_fromstr(&oid, ONE_OUR_OID); - cl_assert_equal_oid(&reuc->oid[1], &oid); - git_oid_fromstr(&oid, ONE_THEIR_OID); - cl_assert_equal_oid(&reuc->oid[2], &oid); - - cl_assert(reuc = git_index_reuc_get_byindex(repo_index, 1)); - - cl_assert_equal_s("two.txt", reuc->path); - cl_assert(reuc->mode[0] == 0100644); - cl_assert(reuc->mode[1] == 0100644); - cl_assert(reuc->mode[2] == 0100644); - git_oid_fromstr(&oid, TWO_ANCESTOR_OID); - cl_assert_equal_oid(&reuc->oid[0], &oid); - git_oid_fromstr(&oid, TWO_OUR_OID); - cl_assert_equal_oid(&reuc->oid[1], &oid); - git_oid_fromstr(&oid, TWO_THEIR_OID); - cl_assert_equal_oid(&reuc->oid[2], &oid); -} - -void test_index_reuc__updates_existing(void) -{ - const git_index_reuc_entry *reuc; - git_oid ancestor_oid, our_oid, their_oid, oid; - int index_caps; - - git_index_clear(repo_index); - - index_caps = git_index_caps(repo_index); - - index_caps |= GIT_INDEXCAP_IGNORE_CASE; - cl_git_pass(git_index_set_caps(repo_index, index_caps)); - - git_oid_fromstr(&ancestor_oid, TWO_ANCESTOR_OID); - git_oid_fromstr(&our_oid, TWO_OUR_OID); - git_oid_fromstr(&their_oid, TWO_THEIR_OID); - - cl_git_pass(git_index_reuc_add(repo_index, "two.txt", - 0100644, &ancestor_oid, - 0100644, &our_oid, - 0100644, &their_oid)); - - cl_git_pass(git_index_reuc_add(repo_index, "TWO.txt", - 0100644, &our_oid, - 0100644, &their_oid, - 0100644, &ancestor_oid)); - - cl_assert_equal_i(1, git_index_reuc_entrycount(repo_index)); - - cl_assert(reuc = git_index_reuc_get_byindex(repo_index, 0)); - - cl_assert_equal_s("TWO.txt", reuc->path); - git_oid_fromstr(&oid, TWO_OUR_OID); - cl_assert_equal_oid(&reuc->oid[0], &oid); - git_oid_fromstr(&oid, TWO_THEIR_OID); - cl_assert_equal_oid(&reuc->oid[1], &oid); - git_oid_fromstr(&oid, TWO_ANCESTOR_OID); - cl_assert_equal_oid(&reuc->oid[2], &oid); -} - -void test_index_reuc__remove(void) -{ - git_oid oid; - const git_index_reuc_entry *reuc; - - cl_assert_equal_i(2, git_index_reuc_entrycount(repo_index)); - - cl_git_pass(git_index_reuc_remove(repo_index, 0)); - cl_git_fail(git_index_reuc_remove(repo_index, 1)); - - cl_assert_equal_i(1, git_index_reuc_entrycount(repo_index)); - - cl_assert(reuc = git_index_reuc_get_byindex(repo_index, 0)); - - cl_assert_equal_s("two.txt", reuc->path); - cl_assert(reuc->mode[0] == 0100644); - cl_assert(reuc->mode[1] == 0100644); - cl_assert(reuc->mode[2] == 0100644); - git_oid_fromstr(&oid, TWO_ANCESTOR_OID); - cl_assert_equal_oid(&reuc->oid[0], &oid); - git_oid_fromstr(&oid, TWO_OUR_OID); - cl_assert_equal_oid(&reuc->oid[1], &oid); - git_oid_fromstr(&oid, TWO_THEIR_OID); - cl_assert_equal_oid(&reuc->oid[2], &oid); -} - -void test_index_reuc__write(void) -{ - git_oid ancestor_oid, our_oid, their_oid; - const git_index_reuc_entry *reuc; - - git_index_clear(repo_index); - - /* Write out of order to ensure sorting is correct */ - git_oid_fromstr(&ancestor_oid, TWO_ANCESTOR_OID); - git_oid_fromstr(&our_oid, TWO_OUR_OID); - git_oid_fromstr(&their_oid, TWO_THEIR_OID); - - cl_git_pass(git_index_reuc_add(repo_index, "two.txt", - 0100644, &ancestor_oid, - 0100644, &our_oid, - 0100644, &their_oid)); - - git_oid_fromstr(&ancestor_oid, ONE_ANCESTOR_OID); - git_oid_fromstr(&our_oid, ONE_OUR_OID); - git_oid_fromstr(&their_oid, ONE_THEIR_OID); - - cl_git_pass(git_index_reuc_add(repo_index, "one.txt", - 0100644, &ancestor_oid, - 0100644, &our_oid, - 0100644, &their_oid)); - - cl_git_pass(git_index_write(repo_index)); - cl_assert_equal_i(2, git_index_reuc_entrycount(repo_index)); - - /* ensure sort order was round-tripped correct */ - cl_assert(reuc = git_index_reuc_get_byindex(repo_index, 0)); - cl_assert_equal_s("one.txt", reuc->path); - - cl_assert(reuc = git_index_reuc_get_byindex(repo_index, 1)); - cl_assert_equal_s("two.txt", reuc->path); -} - -static int reuc_entry_exists(void) -{ - return (git_index_reuc_get_bypath(repo_index, "newfile.txt") != NULL); -} - -void test_index_reuc__cleaned_on_reset_hard(void) -{ - git_object *target; - - cl_git_pass(git_revparse_single(&target, repo, "3a34580")); - - test_index_reuc__add(); - cl_git_pass(git_reset(repo, target, GIT_RESET_HARD, NULL)); - cl_assert(reuc_entry_exists() == false); - - git_object_free(target); -} - -void test_index_reuc__cleaned_on_reset_mixed(void) -{ - git_object *target; - - cl_git_pass(git_revparse_single(&target, repo, "3a34580")); - - test_index_reuc__add(); - cl_git_pass(git_reset(repo, target, GIT_RESET_MIXED, NULL)); - cl_assert(reuc_entry_exists() == false); - - git_object_free(target); -} - -void test_index_reuc__retained_on_reset_soft(void) -{ - git_object *target; - - cl_git_pass(git_revparse_single(&target, repo, "3a34580")); - - cl_git_pass(git_reset(repo, target, GIT_RESET_HARD, NULL)); - - test_index_reuc__add(); - cl_git_pass(git_reset(repo, target, GIT_RESET_SOFT, NULL)); - cl_assert(reuc_entry_exists() == true); - - git_object_free(target); -} - -void test_index_reuc__cleaned_on_checkout_tree(void) -{ - git_oid oid; - git_object *obj; - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - - opts.checkout_strategy = GIT_CHECKOUT_SAFE | GIT_CHECKOUT_UPDATE_ONLY; - - test_index_reuc__add(); - git_reference_name_to_id(&oid, repo, "refs/heads/master"); - git_object_lookup(&obj, repo, &oid, GIT_OBJ_ANY); - git_checkout_tree(repo, obj, &opts); - cl_assert(reuc_entry_exists() == false); - - git_object_free(obj); -} - -void test_index_reuc__cleaned_on_checkout_head(void) -{ - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - - opts.checkout_strategy = GIT_CHECKOUT_SAFE | GIT_CHECKOUT_UPDATE_ONLY; - - test_index_reuc__add(); - git_checkout_head(repo, &opts); - cl_assert(reuc_entry_exists() == false); -} - -void test_index_reuc__retained_on_checkout_index(void) -{ - git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; - - opts.checkout_strategy = GIT_CHECKOUT_SAFE | GIT_CHECKOUT_UPDATE_ONLY; - - test_index_reuc__add(); - git_checkout_index(repo, repo_index, &opts); - cl_assert(reuc_entry_exists() == true); -} diff --git a/vendor/libgit2/tests/index/stage.c b/vendor/libgit2/tests/index/stage.c deleted file mode 100644 index 58dc1fb5ee..0000000000 --- a/vendor/libgit2/tests/index/stage.c +++ /dev/null @@ -1,62 +0,0 @@ -#include "clar_libgit2.h" -#include "index.h" -#include "git2/repository.h" - -static git_repository *repo; -static git_index *repo_index; - -#define TEST_REPO_PATH "mergedrepo" -#define TEST_INDEX_PATH TEST_REPO_PATH "/.git/index" - -// Fixture setup and teardown -void test_index_stage__initialize(void) -{ - repo = cl_git_sandbox_init("mergedrepo"); - git_repository_index(&repo_index, repo); -} - -void test_index_stage__cleanup(void) -{ - git_index_free(repo_index); - repo_index = NULL; - - cl_git_sandbox_cleanup(); -} - - -void test_index_stage__add_always_adds_stage_0(void) -{ - size_t entry_idx; - const git_index_entry *entry; - - cl_git_mkfile("./mergedrepo/new-file.txt", "new-file\n"); - - cl_git_pass(git_index_add_bypath(repo_index, "new-file.txt")); - - cl_assert(!git_index_find(&entry_idx, repo_index, "new-file.txt")); - cl_assert((entry = git_index_get_byindex(repo_index, entry_idx)) != NULL); - cl_assert(git_index_entry_stage(entry) == 0); -} - -void test_index_stage__find_gets_first_stage(void) -{ - size_t entry_idx; - const git_index_entry *entry; - - cl_assert(!git_index_find(&entry_idx, repo_index, "one.txt")); - cl_assert((entry = git_index_get_byindex(repo_index, entry_idx)) != NULL); - cl_assert(git_index_entry_stage(entry) == 0); - - cl_assert(!git_index_find(&entry_idx, repo_index, "two.txt")); - cl_assert((entry = git_index_get_byindex(repo_index, entry_idx)) != NULL); - cl_assert(git_index_entry_stage(entry) == 0); - - cl_assert(!git_index_find(&entry_idx, repo_index, "conflicts-one.txt")); - cl_assert((entry = git_index_get_byindex(repo_index, entry_idx)) != NULL); - cl_assert(git_index_entry_stage(entry) == 1); - - cl_assert(!git_index_find(&entry_idx, repo_index, "conflicts-two.txt")); - cl_assert((entry = git_index_get_byindex(repo_index, entry_idx)) != NULL); - cl_assert(git_index_entry_stage(entry) == 1); -} - diff --git a/vendor/libgit2/tests/index/tests.c b/vendor/libgit2/tests/index/tests.c deleted file mode 100644 index e1ff12ad0f..0000000000 --- a/vendor/libgit2/tests/index/tests.c +++ /dev/null @@ -1,822 +0,0 @@ -#include "clar_libgit2.h" -#include "index.h" - -static const size_t index_entry_count = 109; -static const size_t index_entry_count_2 = 1437; -#define TEST_INDEX_PATH cl_fixture("testrepo.git/index") -#define TEST_INDEX2_PATH cl_fixture("gitgit.index") -#define TEST_INDEXBIG_PATH cl_fixture("big.index") -#define TEST_INDEXBAD_PATH cl_fixture("bad.index") - - -/* Suite data */ -struct test_entry { - size_t index; - char path[128]; - git_off_t file_size; - git_time_t mtime; -}; - -static struct test_entry test_entries[] = { - {4, "Makefile", 5064, 0x4C3F7F33}, - {62, "tests/Makefile", 2631, 0x4C3F7F33}, - {36, "src/index.c", 10014, 0x4C43368D}, - {6, "git.git-authors", 2709, 0x4C3F7F33}, - {48, "src/revobject.h", 1448, 0x4C3F7FE2} -}; - -/* Helpers */ -static void copy_file(const char *src, const char *dst) -{ - git_buf source_buf = GIT_BUF_INIT; - git_file dst_fd; - - cl_git_pass(git_futils_readbuffer(&source_buf, src)); - - dst_fd = git_futils_creat_withpath(dst, 0777, 0666); /* -V536 */ - if (dst_fd < 0) - goto cleanup; - - cl_git_pass(p_write(dst_fd, source_buf.ptr, source_buf.size)); - -cleanup: - git_buf_free(&source_buf); - p_close(dst_fd); -} - -static void files_are_equal(const char *a, const char *b) -{ - git_buf buf_a = GIT_BUF_INIT; - git_buf buf_b = GIT_BUF_INIT; - int pass; - - if (git_futils_readbuffer(&buf_a, a) < 0) - cl_assert(0); - - if (git_futils_readbuffer(&buf_b, b) < 0) { - git_buf_free(&buf_a); - cl_assert(0); - } - - pass = (buf_a.size == buf_b.size && !memcmp(buf_a.ptr, buf_b.ptr, buf_a.size)); - - git_buf_free(&buf_a); - git_buf_free(&buf_b); - - cl_assert(pass); -} - - -/* Fixture setup and teardown */ -void test_index_tests__initialize(void) -{ -} - -void test_index_tests__empty_index(void) -{ - git_index *index; - - cl_git_pass(git_index_open(&index, "in-memory-index")); - cl_assert(index->on_disk == 0); - - cl_assert(git_index_entrycount(index) == 0); - cl_assert(git_vector_is_sorted(&index->entries)); - - git_index_free(index); -} - -void test_index_tests__default_test_index(void) -{ - git_index *index; - unsigned int i; - git_index_entry **entries; - - cl_git_pass(git_index_open(&index, TEST_INDEX_PATH)); - cl_assert(index->on_disk); - - cl_assert(git_index_entrycount(index) == index_entry_count); - cl_assert(git_vector_is_sorted(&index->entries)); - - entries = (git_index_entry **)index->entries.contents; - - for (i = 0; i < ARRAY_SIZE(test_entries); ++i) { - git_index_entry *e = entries[test_entries[i].index]; - - cl_assert_equal_s(e->path, test_entries[i].path); - cl_assert_equal_i(e->mtime.seconds, test_entries[i].mtime); - cl_assert_equal_i(e->file_size, test_entries[i].file_size); - } - - git_index_free(index); -} - -void test_index_tests__gitgit_index(void) -{ - git_index *index; - - cl_git_pass(git_index_open(&index, TEST_INDEX2_PATH)); - cl_assert(index->on_disk); - - cl_assert(git_index_entrycount(index) == index_entry_count_2); - cl_assert(git_vector_is_sorted(&index->entries)); - cl_assert(index->tree != NULL); - - git_index_free(index); -} - -void test_index_tests__find_in_existing(void) -{ - git_index *index; - unsigned int i; - - cl_git_pass(git_index_open(&index, TEST_INDEX_PATH)); - - for (i = 0; i < ARRAY_SIZE(test_entries); ++i) { - size_t idx; - - cl_assert(!git_index_find(&idx, index, test_entries[i].path)); - cl_assert(idx == test_entries[i].index); - } - - git_index_free(index); -} - -void test_index_tests__find_in_empty(void) -{ - git_index *index; - unsigned int i; - - cl_git_pass(git_index_open(&index, "fake-index")); - - for (i = 0; i < ARRAY_SIZE(test_entries); ++i) { - cl_assert(GIT_ENOTFOUND == git_index_find(NULL, index, test_entries[i].path)); - } - - git_index_free(index); -} - -void test_index_tests__write(void) -{ - git_index *index; - - copy_file(TEST_INDEXBIG_PATH, "index_rewrite"); - - cl_git_pass(git_index_open(&index, "index_rewrite")); - cl_assert(index->on_disk); - - cl_git_pass(git_index_write(index)); - files_are_equal(TEST_INDEXBIG_PATH, "index_rewrite"); - - git_index_free(index); - - p_unlink("index_rewrite"); -} - -void test_index_tests__sort0(void) -{ - /* sort the entires in an index */ - - /* - * TODO: This no longer applies: - * index sorting in Git uses some specific changes to the way - * directories are sorted. - * - * We need to specificially check for this by creating a new - * index, adding entries in random order and then - * checking for consistency - */ -} - -void test_index_tests__sort1(void) -{ - /* sort the entires in an empty index */ - git_index *index; - - cl_git_pass(git_index_open(&index, "fake-index")); - - /* FIXME: this test is slightly dumb */ - cl_assert(git_vector_is_sorted(&index->entries)); - - git_index_free(index); -} - -static void cleanup_myrepo(void *opaque) -{ - GIT_UNUSED(opaque); - cl_fixture_cleanup("myrepo"); -} - -void test_index_tests__add(void) -{ - git_index *index; - git_filebuf file = GIT_FILEBUF_INIT; - git_repository *repo; - const git_index_entry *entry; - git_oid id1; - - cl_set_cleanup(&cleanup_myrepo, NULL); - - /* Intialize a new repository */ - cl_git_pass(git_repository_init(&repo, "./myrepo", 0)); - - /* Ensure we're the only guy in the room */ - cl_git_pass(git_repository_index(&index, repo)); - cl_assert(git_index_entrycount(index) == 0); - - /* Create a new file in the working directory */ - cl_git_pass(git_futils_mkpath2file("myrepo/test.txt", 0777)); - cl_git_pass(git_filebuf_open(&file, "myrepo/test.txt", 0, 0666)); - cl_git_pass(git_filebuf_write(&file, "hey there\n", 10)); - cl_git_pass(git_filebuf_commit(&file)); - - /* Store the expected hash of the file/blob - * This has been generated by executing the following - * $ echo "hey there" | git hash-object --stdin - */ - cl_git_pass(git_oid_fromstr(&id1, "a8233120f6ad708f843d861ce2b7228ec4e3dec6")); - - /* Add the new file to the index */ - cl_git_pass(git_index_add_bypath(index, "test.txt")); - - /* Wow... it worked! */ - cl_assert(git_index_entrycount(index) == 1); - entry = git_index_get_byindex(index, 0); - - /* And the built-in hashing mechanism worked as expected */ - cl_assert_equal_oid(&id1, &entry->id); - - /* Test access by path instead of index */ - cl_assert((entry = git_index_get_bypath(index, "test.txt", 0)) != NULL); - cl_assert_equal_oid(&id1, &entry->id); - - git_index_free(index); - git_repository_free(repo); -} - -void test_index_tests__add_frombuffer(void) -{ - git_index *index; - git_repository *repo; - git_index_entry entry; - const git_index_entry *returned_entry; - - git_oid id1; - git_blob *blob; - - const char *content = "hey there\n"; - - cl_set_cleanup(&cleanup_myrepo, NULL); - - /* Intialize a new repository */ - cl_git_pass(git_repository_init(&repo, "./myrepo", 0)); - - /* Ensure we're the only guy in the room */ - cl_git_pass(git_repository_index(&index, repo)); - cl_assert(git_index_entrycount(index) == 0); - - /* Store the expected hash of the file/blob - * This has been generated by executing the following - * $ echo "hey there" | git hash-object --stdin - */ - cl_git_pass(git_oid_fromstr(&id1, "a8233120f6ad708f843d861ce2b7228ec4e3dec6")); - - /* Add the new file to the index */ - memset(&entry, 0x0, sizeof(git_index_entry)); - entry.mode = GIT_FILEMODE_BLOB; - entry.path = "test.txt"; - cl_git_pass(git_index_add_frombuffer(index, &entry, - content, strlen(content))); - - /* Wow... it worked! */ - cl_assert(git_index_entrycount(index) == 1); - returned_entry = git_index_get_byindex(index, 0); - - /* And the built-in hashing mechanism worked as expected */ - cl_assert_equal_oid(&id1, &returned_entry->id); - /* And mode is the one asked */ - cl_assert_equal_i(GIT_FILEMODE_BLOB, returned_entry->mode); - - /* Test access by path instead of index */ - cl_assert((returned_entry = git_index_get_bypath(index, "test.txt", 0)) != NULL); - cl_assert_equal_oid(&id1, &returned_entry->id); - - /* Test the blob is in the repository */ - cl_git_pass(git_blob_lookup(&blob, repo, &id1)); - cl_assert_equal_s( - content, git_blob_rawcontent(blob)); - git_blob_free(blob); - - git_index_free(index); - git_repository_free(repo); -} - -void test_index_tests__add_frombuffer_reset_entry(void) -{ - git_index *index; - git_repository *repo; - git_index_entry entry; - const git_index_entry *returned_entry; - git_filebuf file = GIT_FILEBUF_INIT; - - git_oid id1; - git_blob *blob; - const char *old_content = "here\n"; - const char *content = "hey there\n"; - - cl_set_cleanup(&cleanup_myrepo, NULL); - - /* Intialize a new repository */ - cl_git_pass(git_repository_init(&repo, "./myrepo", 0)); - cl_git_pass(git_repository_index(&index, repo)); - cl_git_pass(git_futils_mkpath2file("myrepo/test.txt", 0777)); - cl_git_pass(git_filebuf_open(&file, "myrepo/test.txt", 0, 0666)); - cl_git_pass(git_filebuf_write(&file, old_content, strlen(old_content))); - cl_git_pass(git_filebuf_commit(&file)); - - /* Store the expected hash of the file/blob - * This has been generated by executing the following - * $ echo "hey there" | git hash-object --stdin - */ - cl_git_pass(git_oid_fromstr(&id1, "a8233120f6ad708f843d861ce2b7228ec4e3dec6")); - - cl_git_pass(git_index_add_bypath(index, "test.txt")); - - /* Add the new file to the index */ - memset(&entry, 0x0, sizeof(git_index_entry)); - entry.mode = GIT_FILEMODE_BLOB; - entry.path = "test.txt"; - cl_git_pass(git_index_add_frombuffer(index, &entry, - content, strlen(content))); - - /* Wow... it worked! */ - cl_assert(git_index_entrycount(index) == 1); - returned_entry = git_index_get_byindex(index, 0); - - /* And the built-in hashing mechanism worked as expected */ - cl_assert_equal_oid(&id1, &returned_entry->id); - /* And mode is the one asked */ - cl_assert_equal_i(GIT_FILEMODE_BLOB, returned_entry->mode); - - /* Test access by path instead of index */ - cl_assert((returned_entry = git_index_get_bypath(index, "test.txt", 0)) != NULL); - cl_assert_equal_oid(&id1, &returned_entry->id); - cl_assert_equal_i(0, returned_entry->dev); - cl_assert_equal_i(0, returned_entry->ino); - cl_assert_equal_i(0, returned_entry->uid); - cl_assert_equal_i(0, returned_entry->uid); - cl_assert_equal_i(10, returned_entry->file_size); - - /* Test the blob is in the repository */ - cl_git_pass(git_blob_lookup(&blob, repo, &id1)); - cl_assert_equal_s(content, git_blob_rawcontent(blob)); - git_blob_free(blob); - - git_index_free(index); - git_repository_free(repo); -} - -static void cleanup_1397(void *opaque) -{ - GIT_UNUSED(opaque); - cl_git_sandbox_cleanup(); -} - -void test_index_tests__add_issue_1397(void) -{ - git_index *index; - git_repository *repo; - const git_index_entry *entry; - git_oid id1; - - cl_set_cleanup(&cleanup_1397, NULL); - - repo = cl_git_sandbox_init("issue_1397"); - - cl_repo_set_bool(repo, "core.autocrlf", true); - - /* Ensure we're the only guy in the room */ - cl_git_pass(git_repository_index(&index, repo)); - - /* Store the expected hash of the file/blob - * This has been generated by executing the following - * $ git hash-object crlf_file.txt - */ - cl_git_pass(git_oid_fromstr(&id1, "8312e0889a9cbab77c732b6bc39b51a683e3a318")); - - /* Make sure the initial SHA-1 is correct */ - cl_assert((entry = git_index_get_bypath(index, "crlf_file.txt", 0)) != NULL); - cl_assert_equal_oid(&id1, &entry->id); - - /* Update the index */ - cl_git_pass(git_index_add_bypath(index, "crlf_file.txt")); - - /* Check the new SHA-1 */ - cl_assert((entry = git_index_get_bypath(index, "crlf_file.txt", 0)) != NULL); - cl_assert_equal_oid(&id1, &entry->id); - - git_index_free(index); -} - -void test_index_tests__add_bypath_to_a_bare_repository_returns_EBAREPO(void) -{ - git_repository *bare_repo; - git_index *index; - - cl_git_pass(git_repository_open(&bare_repo, cl_fixture("testrepo.git"))); - cl_git_pass(git_repository_index(&index, bare_repo)); - - cl_assert_equal_i(GIT_EBAREREPO, git_index_add_bypath(index, "test.txt")); - - git_index_free(index); - git_repository_free(bare_repo); -} - -static void add_invalid_filename(git_repository *repo, const char *fn) -{ - git_index *index; - git_buf path = GIT_BUF_INIT; - - cl_git_pass(git_repository_index(&index, repo)); - cl_assert(git_index_entrycount(index) == 0); - - git_buf_joinpath(&path, "./invalid", fn); - - cl_git_mkfile(path.ptr, NULL); - cl_git_fail(git_index_add_bypath(index, fn)); - cl_must_pass(p_unlink(path.ptr)); - - cl_assert(git_index_entrycount(index) == 0); - - git_buf_free(&path); - git_index_free(index); -} - -/* Test that writing an invalid filename fails */ -void test_index_tests__add_invalid_filename(void) -{ - git_repository *repo; - - p_mkdir("invalid", 0700); - - cl_git_pass(git_repository_init(&repo, "./invalid", 0)); - cl_must_pass(p_mkdir("./invalid/subdir", 0777)); - - /* cl_git_mkfile() needs the dir to exist */ - if (!git_path_exists("./invalid/.GIT")) - cl_must_pass(p_mkdir("./invalid/.GIT", 0777)); - if (!git_path_exists("./invalid/.GiT")) - cl_must_pass(p_mkdir("./invalid/.GiT", 0777)); - - add_invalid_filename(repo, ".git/hello"); - add_invalid_filename(repo, ".GIT/hello"); - add_invalid_filename(repo, ".GiT/hello"); - add_invalid_filename(repo, "./.git/hello"); - add_invalid_filename(repo, "./foo"); - add_invalid_filename(repo, "./bar"); - add_invalid_filename(repo, "subdir/../bar"); - - git_repository_free(repo); - - cl_fixture_cleanup("invalid"); -} - -static void replace_char(char *str, char in, char out) -{ - char *c = str; - - while (*c++) - if (*c == in) - *c = out; -} - -static void write_invalid_filename(git_repository *repo, const char *fn_orig) -{ - git_index *index; - git_oid expected; - const git_index_entry *entry; - git_buf path = GIT_BUF_INIT; - char *fn; - - cl_git_pass(git_repository_index(&index, repo)); - cl_assert(git_index_entrycount(index) == 0); - - /* - * Sneak a valid path into the index, we'll update it - * to an invalid path when we try to write the index. - */ - fn = git__strdup(fn_orig); - replace_char(fn, '/', '_'); - - git_buf_joinpath(&path, "./invalid", fn); - - cl_git_mkfile(path.ptr, NULL); - - cl_git_pass(git_index_add_bypath(index, fn)); - - cl_assert(entry = git_index_get_bypath(index, fn, 0)); - - /* kids, don't try this at home */ - replace_char((char *)entry->path, '_', '/'); - - /* write-tree */ - cl_git_fail(git_index_write_tree(&expected, index)); - - p_unlink(path.ptr); - - cl_git_pass(git_index_remove_all(index, NULL, NULL, NULL)); - git_buf_free(&path); - git_index_free(index); - git__free(fn); -} - -/* Test that writing an invalid filename fails */ -void test_index_tests__write_invalid_filename(void) -{ - git_repository *repo; - - p_mkdir("invalid", 0700); - - cl_git_pass(git_repository_init(&repo, "./invalid", 0)); - - write_invalid_filename(repo, ".git/hello"); - write_invalid_filename(repo, ".GIT/hello"); - write_invalid_filename(repo, ".GiT/hello"); - write_invalid_filename(repo, "./.git/hello"); - write_invalid_filename(repo, "./foo"); - write_invalid_filename(repo, "./bar"); - write_invalid_filename(repo, "foo/../bar"); - - git_repository_free(repo); - - cl_fixture_cleanup("invalid"); -} - -void test_index_tests__honors_protect_filesystems(void) -{ - git_repository *repo; - - p_mkdir("invalid", 0700); - - cl_git_pass(git_repository_init(&repo, "./invalid", 0)); - - cl_repo_set_bool(repo, "core.protectHFS", true); - cl_repo_set_bool(repo, "core.protectNTFS", true); - - write_invalid_filename(repo, ".git./hello"); - write_invalid_filename(repo, ".git\xe2\x80\xad/hello"); - write_invalid_filename(repo, "git~1/hello"); - write_invalid_filename(repo, ".git\xe2\x81\xaf/hello"); - - git_repository_free(repo); - - cl_fixture_cleanup("invalid"); -} - -void test_index_tests__remove_entry(void) -{ - git_repository *repo; - git_index *index; - - p_mkdir("index_test", 0770); - - cl_git_pass(git_repository_init(&repo, "index_test", 0)); - cl_git_pass(git_repository_index(&index, repo)); - cl_assert(git_index_entrycount(index) == 0); - - cl_git_mkfile("index_test/hello", NULL); - cl_git_pass(git_index_add_bypath(index, "hello")); - cl_git_pass(git_index_write(index)); - - cl_git_pass(git_index_read(index, true)); /* reload */ - cl_assert(git_index_entrycount(index) == 1); - cl_assert(git_index_get_bypath(index, "hello", 0) != NULL); - - cl_git_pass(git_index_remove(index, "hello", 0)); - cl_git_pass(git_index_write(index)); - - cl_git_pass(git_index_read(index, true)); /* reload */ - cl_assert(git_index_entrycount(index) == 0); - cl_assert(git_index_get_bypath(index, "hello", 0) == NULL); - - git_index_free(index); - git_repository_free(repo); - cl_fixture_cleanup("index_test"); -} - -void test_index_tests__remove_directory(void) -{ - git_repository *repo; - git_index *index; - - p_mkdir("index_test", 0770); - - cl_git_pass(git_repository_init(&repo, "index_test", 0)); - cl_git_pass(git_repository_index(&index, repo)); - cl_assert_equal_i(0, (int)git_index_entrycount(index)); - - p_mkdir("index_test/a", 0770); - cl_git_mkfile("index_test/a/1.txt", NULL); - cl_git_mkfile("index_test/a/2.txt", NULL); - cl_git_mkfile("index_test/a/3.txt", NULL); - cl_git_mkfile("index_test/b.txt", NULL); - - cl_git_pass(git_index_add_bypath(index, "a/1.txt")); - cl_git_pass(git_index_add_bypath(index, "a/2.txt")); - cl_git_pass(git_index_add_bypath(index, "a/3.txt")); - cl_git_pass(git_index_add_bypath(index, "b.txt")); - cl_git_pass(git_index_write(index)); - - cl_git_pass(git_index_read(index, true)); /* reload */ - cl_assert_equal_i(4, (int)git_index_entrycount(index)); - cl_assert(git_index_get_bypath(index, "a/1.txt", 0) != NULL); - cl_assert(git_index_get_bypath(index, "a/2.txt", 0) != NULL); - cl_assert(git_index_get_bypath(index, "b.txt", 0) != NULL); - - cl_git_pass(git_index_remove(index, "a/1.txt", 0)); - cl_git_pass(git_index_write(index)); - - cl_git_pass(git_index_read(index, true)); /* reload */ - cl_assert_equal_i(3, (int)git_index_entrycount(index)); - cl_assert(git_index_get_bypath(index, "a/1.txt", 0) == NULL); - cl_assert(git_index_get_bypath(index, "a/2.txt", 0) != NULL); - cl_assert(git_index_get_bypath(index, "b.txt", 0) != NULL); - - cl_git_pass(git_index_remove_directory(index, "a", 0)); - cl_git_pass(git_index_write(index)); - - cl_git_pass(git_index_read(index, true)); /* reload */ - cl_assert_equal_i(1, (int)git_index_entrycount(index)); - cl_assert(git_index_get_bypath(index, "a/1.txt", 0) == NULL); - cl_assert(git_index_get_bypath(index, "a/2.txt", 0) == NULL); - cl_assert(git_index_get_bypath(index, "b.txt", 0) != NULL); - - git_index_free(index); - git_repository_free(repo); - cl_fixture_cleanup("index_test"); -} - -void test_index_tests__preserves_case(void) -{ - git_repository *repo; - git_index *index; - const git_index_entry *entry; - int index_caps; - - cl_set_cleanup(&cleanup_myrepo, NULL); - - cl_git_pass(git_repository_init(&repo, "./myrepo", 0)); - cl_git_pass(git_repository_index(&index, repo)); - - index_caps = git_index_caps(index); - - cl_git_rewritefile("myrepo/test.txt", "hey there\n"); - cl_git_pass(git_index_add_bypath(index, "test.txt")); - - cl_git_pass(p_rename("myrepo/test.txt", "myrepo/TEST.txt")); - cl_git_rewritefile("myrepo/TEST.txt", "hello again\n"); - cl_git_pass(git_index_add_bypath(index, "TEST.txt")); - - if (index_caps & GIT_INDEXCAP_IGNORE_CASE) - cl_assert_equal_i(1, (int)git_index_entrycount(index)); - else - cl_assert_equal_i(2, (int)git_index_entrycount(index)); - - /* Test access by path instead of index */ - cl_assert((entry = git_index_get_bypath(index, "test.txt", 0)) != NULL); - /* The path should *not* have changed without an explicit remove */ - cl_assert(git__strcmp(entry->path, "test.txt") == 0); - - cl_assert((entry = git_index_get_bypath(index, "TEST.txt", 0)) != NULL); - if (index_caps & GIT_INDEXCAP_IGNORE_CASE) - /* The path should *not* have changed without an explicit remove */ - cl_assert(git__strcmp(entry->path, "test.txt") == 0); - else - cl_assert(git__strcmp(entry->path, "TEST.txt") == 0); - - git_index_free(index); - git_repository_free(repo); -} - -void test_index_tests__elocked(void) -{ - git_repository *repo; - git_index *index; - git_filebuf file = GIT_FILEBUF_INIT; - const git_error *err; - int error; - - cl_set_cleanup(&cleanup_myrepo, NULL); - - cl_git_pass(git_repository_init(&repo, "./myrepo", 0)); - cl_git_pass(git_repository_index(&index, repo)); - - /* Lock the index file so we fail to lock it */ - cl_git_pass(git_filebuf_open(&file, index->index_file_path, 0, 0666)); - error = git_index_write(index); - cl_assert_equal_i(GIT_ELOCKED, error); - - err = giterr_last(); - cl_assert_equal_i(err->klass, GITERR_INDEX); - - git_filebuf_cleanup(&file); - git_index_free(index); - git_repository_free(repo); -} - -void test_index_tests__reload_from_disk(void) -{ - git_repository *repo; - git_index *read_index; - git_index *write_index; - - cl_set_cleanup(&cleanup_myrepo, NULL); - - cl_git_pass(git_futils_mkdir("./myrepo", NULL, 0777, GIT_MKDIR_PATH)); - cl_git_mkfile("./myrepo/a.txt", "a\n"); - cl_git_mkfile("./myrepo/b.txt", "b\n"); - - cl_git_pass(git_repository_init(&repo, "./myrepo", 0)); - cl_git_pass(git_repository_index(&write_index, repo)); - cl_assert_equal_i(false, write_index->on_disk); - - cl_git_pass(git_index_open(&read_index, write_index->index_file_path)); - cl_assert_equal_i(false, read_index->on_disk); - - /* Stage two new files against the write_index */ - cl_git_pass(git_index_add_bypath(write_index, "a.txt")); - cl_git_pass(git_index_add_bypath(write_index, "b.txt")); - - cl_assert_equal_sz(2, git_index_entrycount(write_index)); - - /* Persist the index changes to disk */ - cl_git_pass(git_index_write(write_index)); - cl_assert_equal_i(true, write_index->on_disk); - - /* Sync the changes back into the read_index */ - cl_assert_equal_sz(0, git_index_entrycount(read_index)); - - cl_git_pass(git_index_read(read_index, true)); - cl_assert_equal_i(true, read_index->on_disk); - - cl_assert_equal_sz(2, git_index_entrycount(read_index)); - - /* Remove the index file from the filesystem */ - cl_git_pass(p_unlink(write_index->index_file_path)); - - /* Sync the changes back into the read_index */ - cl_git_pass(git_index_read(read_index, true)); - cl_assert_equal_i(false, read_index->on_disk); - cl_assert_equal_sz(0, git_index_entrycount(read_index)); - - git_index_free(read_index); - git_index_free(write_index); - git_repository_free(repo); -} - -void test_index_tests__corrupted_extension(void) -{ - git_index *index; - - cl_git_fail_with(git_index_open(&index, TEST_INDEXBAD_PATH), GIT_ERROR); -} - -void test_index_tests__reload_while_ignoring_case(void) -{ - git_index *index; - unsigned int caps; - - cl_git_pass(git_index_open(&index, TEST_INDEX_PATH)); - cl_git_pass(git_vector_verify_sorted(&index->entries)); - - caps = git_index_caps(index); - cl_git_pass(git_index_set_caps(index, caps &= ~GIT_INDEXCAP_IGNORE_CASE)); - cl_git_pass(git_index_read(index, true)); - cl_git_pass(git_vector_verify_sorted(&index->entries)); - - cl_git_pass(git_index_set_caps(index, caps | GIT_INDEXCAP_IGNORE_CASE)); - cl_git_pass(git_index_read(index, true)); - cl_git_pass(git_vector_verify_sorted(&index->entries)); - - git_index_free(index); -} - -void test_index_tests__can_lock_index(void) -{ - git_index *index; - git_indexwriter one = GIT_INDEXWRITER_INIT, - two = GIT_INDEXWRITER_INIT; - - cl_git_pass(git_index_open(&index, TEST_INDEX_PATH)); - cl_git_pass(git_indexwriter_init(&one, index)); - - cl_git_fail_with(GIT_ELOCKED, git_indexwriter_init(&two, index)); - cl_git_fail_with(GIT_ELOCKED, git_index_write(index)); - - cl_git_pass(git_indexwriter_commit(&one)); - - cl_git_pass(git_index_write(index)); - - git_indexwriter_cleanup(&one); - git_indexwriter_cleanup(&two); - git_index_free(index); -} diff --git a/vendor/libgit2/tests/main.c b/vendor/libgit2/tests/main.c deleted file mode 100644 index 56326da1c1..0000000000 --- a/vendor/libgit2/tests/main.c +++ /dev/null @@ -1,46 +0,0 @@ - -#if defined(GIT_MSVC_CRTDBG) -/* Enable MSVC CRTDBG memory leak reporting. See src/util.h for details. */ -#include -#include -#endif - -#include "clar_libgit2.h" -#include "clar_libgit2_trace.h" - -#ifdef _WIN32 -int __cdecl main(int argc, char *argv[]) -#else -int main(int argc, char *argv[]) -#endif -{ - int res; - -#if defined(GIT_MSVC_CRTDBG) - _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); - - _CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_DEBUG | _CRTDBG_MODE_FILE); - _CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_DEBUG | _CRTDBG_MODE_FILE); - _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_DEBUG | _CRTDBG_MODE_FILE); - - _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR); - _CrtSetReportFile(_CRT_ERROR, _CRTDBG_FILE_STDERR); - _CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDERR); -#endif - - clar_test_init(argc, argv); - - git_libgit2_init(); - cl_global_trace_register(); - cl_sandbox_set_search_path_defaults(); - - /* Run the test suite */ - res = clar_test_run(); - - clar_test_shutdown(); - - cl_global_trace_disable(); - git_libgit2_shutdown(); - - return res; -} diff --git a/vendor/libgit2/tests/merge/files.c b/vendor/libgit2/tests/merge/files.c deleted file mode 100644 index 2fd90d0666..0000000000 --- a/vendor/libgit2/tests/merge/files.c +++ /dev/null @@ -1,290 +0,0 @@ -#include "clar_libgit2.h" -#include "git2/repository.h" -#include "git2/merge.h" -#include "buffer.h" -#include "merge.h" -#include "merge_helpers.h" -#include "refs.h" -#include "fileops.h" - -#define TEST_REPO_PATH "merge-resolve" -#define TEST_INDEX_PATH TEST_REPO_PATH "/.git/index" - -static git_repository *repo; -static git_index *repo_index; - -// Fixture setup and teardown -void test_merge_files__initialize(void) -{ - git_config *cfg; - - repo = cl_git_sandbox_init(TEST_REPO_PATH); - git_repository_index(&repo_index, repo); - - /* Ensure that the user's merge.conflictstyle doesn't interfere */ - cl_git_pass(git_repository_config(&cfg, repo)); - cl_git_pass(git_config_set_string(cfg, "merge.conflictstyle", "merge")); - git_config_free(cfg); -} - -void test_merge_files__cleanup(void) -{ - git_index_free(repo_index); - cl_git_sandbox_cleanup(); -} - -void test_merge_files__automerge_from_bufs(void) -{ - git_merge_file_input ancestor = GIT_MERGE_FILE_INPUT_INIT, - ours = GIT_MERGE_FILE_INPUT_INIT, - theirs = GIT_MERGE_FILE_INPUT_INIT; - git_merge_file_result result = {0}; - const char *expected = "Zero\n1\n2\n3\n4\n5\n6\n7\n8\n9\nTen\n"; - - ancestor.ptr = "0\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n"; - ancestor.size = strlen(ancestor.ptr); - ancestor.path = "testfile.txt"; - ancestor.mode = 0100755; - - ours.ptr = "Zero\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n"; - ours.size = strlen(ours.ptr); - ours.path = "testfile.txt"; - ours.mode = 0100755; - - theirs.ptr = "0\n1\n2\n3\n4\n5\n6\n7\n8\n9\nTen\n"; - theirs.size = strlen(theirs.ptr); - theirs.path = "testfile.txt"; - theirs.mode = 0100755; - - cl_git_pass(git_merge_file(&result, &ancestor, &ours, &theirs, 0)); - - cl_assert_equal_i(1, result.automergeable); - - cl_assert_equal_s("testfile.txt", result.path); - cl_assert_equal_i(0100755, result.mode); - - cl_assert_equal_i(strlen(expected), result.len); - cl_assert_equal_strn(expected, result.ptr, result.len); - - git_merge_file_result_free(&result); -} - -void test_merge_files__automerge_use_best_path_and_mode(void) -{ - git_merge_file_input ancestor = GIT_MERGE_FILE_INPUT_INIT, - ours = GIT_MERGE_FILE_INPUT_INIT, - theirs = GIT_MERGE_FILE_INPUT_INIT; - git_merge_file_result result = {0}; - const char *expected = "Zero\n1\n2\n3\n4\n5\n6\n7\n8\n9\nTen\n"; - - ancestor.ptr = "0\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n"; - ancestor.size = strlen(ancestor.ptr); - ancestor.path = "testfile.txt"; - ancestor.mode = 0100755; - - ours.ptr = "Zero\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n"; - ours.size = strlen(ours.ptr); - ours.path = "testfile.txt"; - ours.mode = 0100644; - - theirs.ptr = "0\n1\n2\n3\n4\n5\n6\n7\n8\n9\nTen\n"; - theirs.size = strlen(theirs.ptr); - theirs.path = "theirs.txt"; - theirs.mode = 0100755; - - cl_git_pass(git_merge_file(&result, &ancestor, &ours, &theirs, 0)); - - cl_assert_equal_i(1, result.automergeable); - - cl_assert_equal_s("theirs.txt", result.path); - cl_assert_equal_i(0100644, result.mode); - - cl_assert_equal_i(strlen(expected), result.len); - cl_assert_equal_strn(expected, result.ptr, result.len); - - git_merge_file_result_free(&result); -} - -void test_merge_files__conflict_from_bufs(void) -{ - git_merge_file_input ancestor = GIT_MERGE_FILE_INPUT_INIT, - ours = GIT_MERGE_FILE_INPUT_INIT, - theirs = GIT_MERGE_FILE_INPUT_INIT; - git_merge_file_result result = {0}; - - const char *expected = "<<<<<<< testfile.txt\nAloha!\nOurs.\n=======\nHi!\nTheirs.\n>>>>>>> theirs.txt\n"; - size_t expected_len = strlen(expected); - - ancestor.ptr = "Hello!\nAncestor!\n"; - ancestor.size = strlen(ancestor.ptr); - ancestor.path = "testfile.txt"; - ancestor.mode = 0100755; - - ours.ptr = "Aloha!\nOurs.\n"; - ours.size = strlen(ours.ptr); - ours.path = "testfile.txt"; - ours.mode = 0100644; - - theirs.ptr = "Hi!\nTheirs.\n"; - theirs.size = strlen(theirs.ptr); - theirs.path = "theirs.txt"; - theirs.mode = 0100755; - - cl_git_pass(git_merge_file(&result, &ancestor, &ours, &theirs, NULL)); - - cl_assert_equal_i(0, result.automergeable); - - cl_assert_equal_s("theirs.txt", result.path); - cl_assert_equal_i(0100644, result.mode); - - cl_assert_equal_i(expected_len, result.len); - cl_assert_equal_strn(expected, result.ptr, expected_len); - - git_merge_file_result_free(&result); -} - -void test_merge_files__automerge_from_index(void) -{ - git_merge_file_result result = {0}; - git_index_entry ancestor, ours, theirs; - - git_oid_fromstr(&ancestor.id, "6212c31dab5e482247d7977e4f0dd3601decf13b"); - ancestor.path = "automergeable.txt"; - ancestor.mode = 0100644; - - git_oid_fromstr(&ours.id, "ee3fa1b8c00aff7fe02065fdb50864bb0d932ccf"); - ours.path = "automergeable.txt"; - ours.mode = 0100755; - - git_oid_fromstr(&theirs.id, "058541fc37114bfc1dddf6bd6bffc7fae5c2e6fe"); - theirs.path = "newname.txt"; - theirs.mode = 0100644; - - cl_git_pass(git_merge_file_from_index(&result, repo, - &ancestor, &ours, &theirs, 0)); - - cl_assert_equal_i(1, result.automergeable); - - cl_assert_equal_s("newname.txt", result.path); - cl_assert_equal_i(0100755, result.mode); - - cl_assert_equal_i(strlen(AUTOMERGEABLE_MERGED_FILE), result.len); - cl_assert_equal_strn(AUTOMERGEABLE_MERGED_FILE, result.ptr, result.len); - - git_merge_file_result_free(&result); -} - -void test_merge_files__automerge_whitespace_eol(void) -{ - git_merge_file_input ancestor = GIT_MERGE_FILE_INPUT_INIT, - ours = GIT_MERGE_FILE_INPUT_INIT, - theirs = GIT_MERGE_FILE_INPUT_INIT; - git_merge_file_options opts = GIT_MERGE_FILE_OPTIONS_INIT; - git_merge_file_result result = {0}; - const char *expected = "Zero\n1\n2\n3\n4\n5\n6\n7\n8\n9\nTen\n"; - - ancestor.ptr = "0 \n1\n2\n3\n4\n5\n6\n7\n8\n9\n10 \n"; - ancestor.size = strlen(ancestor.ptr); - ancestor.path = "testfile.txt"; - ancestor.mode = 0100755; - - ours.ptr = "Zero\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n"; - ours.size = strlen(ours.ptr); - ours.path = "testfile.txt"; - ours.mode = 0100755; - - theirs.ptr = "0\n1\n2\n3\n4\n5\n6\n7\n8\n9\nTen\n"; - theirs.size = strlen(theirs.ptr); - theirs.path = "testfile.txt"; - theirs.mode = 0100755; - - opts.flags |= GIT_MERGE_FILE_IGNORE_WHITESPACE_EOL; - cl_git_pass(git_merge_file(&result, &ancestor, &ours, &theirs, &opts)); - - cl_assert_equal_i(1, result.automergeable); - - cl_assert_equal_s("testfile.txt", result.path); - cl_assert_equal_i(0100755, result.mode); - - cl_assert_equal_i(strlen(expected), result.len); - cl_assert_equal_strn(expected, result.ptr, result.len); - - git_merge_file_result_free(&result); -} - -void test_merge_files__automerge_whitespace_change(void) -{ - git_merge_file_input ancestor = GIT_MERGE_FILE_INPUT_INIT, - ours = GIT_MERGE_FILE_INPUT_INIT, - theirs = GIT_MERGE_FILE_INPUT_INIT; - git_merge_file_options opts = GIT_MERGE_FILE_OPTIONS_INIT; - git_merge_file_result result = {0}; - const char *expected = "Zero\n1\n2\n3\n4\n5 XXX\n6 YYY\n7\n8\n9\nTen\n"; - - ancestor.ptr = "0\n1\n2\n3\n4\n5 XXX\n6YYY\n7\n8\n9\n10\n"; - ancestor.size = strlen(ancestor.ptr); - ancestor.path = "testfile.txt"; - ancestor.mode = 0100755; - - ours.ptr = "Zero\n1\n2\n3\n4\n5 XXX\n6 YYY\n7\n8\n9\n10\n"; - ours.size = strlen(ours.ptr); - ours.path = "testfile.txt"; - ours.mode = 0100755; - - theirs.ptr = "0\n1\n2\n3\n4\n5 XXX\n6 YYY\n7\n8\n9\nTen\n"; - theirs.size = strlen(theirs.ptr); - theirs.path = "testfile.txt"; - theirs.mode = 0100755; - - opts.flags |= GIT_MERGE_FILE_IGNORE_WHITESPACE_CHANGE; - cl_git_pass(git_merge_file(&result, &ancestor, &ours, &theirs, &opts)); - - cl_assert_equal_i(1, result.automergeable); - - cl_assert_equal_s("testfile.txt", result.path); - cl_assert_equal_i(0100755, result.mode); - - cl_assert_equal_i(strlen(expected), result.len); - cl_assert_equal_strn(expected, result.ptr, result.len); - - git_merge_file_result_free(&result); -} - -void test_merge_files__doesnt_add_newline(void) -{ - git_merge_file_input ancestor = GIT_MERGE_FILE_INPUT_INIT, - ours = GIT_MERGE_FILE_INPUT_INIT, - theirs = GIT_MERGE_FILE_INPUT_INIT; - git_merge_file_options opts = GIT_MERGE_FILE_OPTIONS_INIT; - git_merge_file_result result = {0}; - const char *expected = "Zero\n1\n2\n3\n4\n5 XXX\n6 YYY\n7\n8\n9\nTen"; - - ancestor.ptr = "0\n1\n2\n3\n4\n5 XXX\n6YYY\n7\n8\n9\n10"; - ancestor.size = strlen(ancestor.ptr); - ancestor.path = "testfile.txt"; - ancestor.mode = 0100755; - - ours.ptr = "Zero\n1\n2\n3\n4\n5 XXX\n6 YYY\n7\n8\n9\n10"; - ours.size = strlen(ours.ptr); - ours.path = "testfile.txt"; - ours.mode = 0100755; - - theirs.ptr = "0\n1\n2\n3\n4\n5 XXX\n6 YYY\n7\n8\n9\nTen"; - theirs.size = strlen(theirs.ptr); - theirs.path = "testfile.txt"; - theirs.mode = 0100755; - - opts.flags |= GIT_MERGE_FILE_IGNORE_WHITESPACE_CHANGE; - cl_git_pass(git_merge_file(&result, &ancestor, &ours, &theirs, &opts)); - - cl_assert_equal_i(1, result.automergeable); - - cl_assert_equal_s("testfile.txt", result.path); - cl_assert_equal_i(0100755, result.mode); - - cl_assert_equal_i(strlen(expected), result.len); - cl_assert_equal_strn(expected, result.ptr, result.len); - - git_merge_file_result_free(&result); -} - diff --git a/vendor/libgit2/tests/merge/merge_helpers.c b/vendor/libgit2/tests/merge/merge_helpers.c deleted file mode 100644 index f814714241..0000000000 --- a/vendor/libgit2/tests/merge/merge_helpers.c +++ /dev/null @@ -1,363 +0,0 @@ -#include "clar_libgit2.h" -#include "fileops.h" -#include "refs.h" -#include "tree.h" -#include "merge_helpers.h" -#include "merge.h" -#include "git2/merge.h" -#include "git2/sys/index.h" -#include "git2/annotated_commit.h" - -int merge_trees_from_branches( - git_index **index, git_repository *repo, - const char *ours_name, const char *theirs_name, - git_merge_options *opts) -{ - git_commit *our_commit, *their_commit, *ancestor_commit = NULL; - git_tree *our_tree, *their_tree, *ancestor_tree = NULL; - git_oid our_oid, their_oid, ancestor_oid; - git_buf branch_buf = GIT_BUF_INIT; - int error; - - git_buf_printf(&branch_buf, "%s%s", GIT_REFS_HEADS_DIR, ours_name); - cl_git_pass(git_reference_name_to_id(&our_oid, repo, branch_buf.ptr)); - cl_git_pass(git_commit_lookup(&our_commit, repo, &our_oid)); - - git_buf_clear(&branch_buf); - git_buf_printf(&branch_buf, "%s%s", GIT_REFS_HEADS_DIR, theirs_name); - cl_git_pass(git_reference_name_to_id(&their_oid, repo, branch_buf.ptr)); - cl_git_pass(git_commit_lookup(&their_commit, repo, &their_oid)); - - error = git_merge_base(&ancestor_oid, repo, git_commit_id(our_commit), git_commit_id(their_commit)); - - if (error != GIT_ENOTFOUND) { - cl_git_pass(error); - - cl_git_pass(git_commit_lookup(&ancestor_commit, repo, &ancestor_oid)); - cl_git_pass(git_commit_tree(&ancestor_tree, ancestor_commit)); - } - - cl_git_pass(git_commit_tree(&our_tree, our_commit)); - cl_git_pass(git_commit_tree(&their_tree, their_commit)); - - cl_git_pass(git_merge_trees(index, repo, ancestor_tree, our_tree, their_tree, opts)); - - git_buf_free(&branch_buf); - git_tree_free(our_tree); - git_tree_free(their_tree); - git_tree_free(ancestor_tree); - git_commit_free(our_commit); - git_commit_free(their_commit); - git_commit_free(ancestor_commit); - - return 0; -} - -int merge_commits_from_branches( - git_index **index, git_repository *repo, - const char *ours_name, const char *theirs_name, - git_merge_options *opts) -{ - git_commit *our_commit, *their_commit; - git_oid our_oid, their_oid; - git_buf branch_buf = GIT_BUF_INIT; - - git_buf_printf(&branch_buf, "%s%s", GIT_REFS_HEADS_DIR, ours_name); - cl_git_pass(git_reference_name_to_id(&our_oid, repo, branch_buf.ptr)); - cl_git_pass(git_commit_lookup(&our_commit, repo, &our_oid)); - - git_buf_clear(&branch_buf); - git_buf_printf(&branch_buf, "%s%s", GIT_REFS_HEADS_DIR, theirs_name); - cl_git_pass(git_reference_name_to_id(&their_oid, repo, branch_buf.ptr)); - cl_git_pass(git_commit_lookup(&their_commit, repo, &their_oid)); - - cl_git_pass(git_merge_commits(index, repo, our_commit, their_commit, opts)); - - git_buf_free(&branch_buf); - git_commit_free(our_commit); - git_commit_free(their_commit); - - return 0; -} - -int merge_branches(git_repository *repo, - const char *ours_branch, const char *theirs_branch, - git_merge_options *merge_opts, git_checkout_options *checkout_opts) -{ - git_reference *head_ref, *theirs_ref; - git_annotated_commit *theirs_head; - git_checkout_options head_checkout_opts = GIT_CHECKOUT_OPTIONS_INIT; - - head_checkout_opts.checkout_strategy = GIT_CHECKOUT_FORCE; - - cl_git_pass(git_reference_symbolic_create(&head_ref, repo, "HEAD", ours_branch, 1, NULL)); - cl_git_pass(git_checkout_head(repo, &head_checkout_opts)); - - cl_git_pass(git_reference_lookup(&theirs_ref, repo, theirs_branch)); - cl_git_pass(git_annotated_commit_from_ref(&theirs_head, repo, theirs_ref)); - - cl_git_pass(git_merge(repo, (const git_annotated_commit **)&theirs_head, 1, merge_opts, checkout_opts)); - - git_reference_free(head_ref); - git_reference_free(theirs_ref); - git_annotated_commit_free(theirs_head); - - return 0; -} - -void merge__dump_index_entries(git_vector *index_entries) -{ - size_t i; - const git_index_entry *index_entry; - - printf ("\nINDEX [%"PRIuZ"]:\n", index_entries->length); - for (i = 0; i < index_entries->length; i++) { - index_entry = index_entries->contents[i]; - - printf("%o ", index_entry->mode); - printf("%s ", git_oid_allocfmt(&index_entry->id)); - printf("%d ", git_index_entry_stage(index_entry)); - printf("%s ", index_entry->path); - printf("\n"); - } - printf("\n"); -} - -void merge__dump_names(git_index *index) -{ - size_t i; - const git_index_name_entry *conflict_name; - - for (i = 0; i < git_index_name_entrycount(index); i++) { - conflict_name = git_index_name_get_byindex(index, i); - - printf("%s %s %s\n", conflict_name->ancestor, conflict_name->ours, conflict_name->theirs); - } - printf("\n"); -} - -void merge__dump_reuc(git_index *index) -{ - size_t i; - const git_index_reuc_entry *reuc; - - printf ("\nREUC:\n"); - for (i = 0; i < git_index_reuc_entrycount(index); i++) { - reuc = git_index_reuc_get_byindex(index, i); - - printf("%s ", reuc->path); - printf("%o ", reuc->mode[0]); - printf("%s\n", git_oid_allocfmt(&reuc->oid[0])); - printf(" %o ", reuc->mode[1]); - printf(" %s\n", git_oid_allocfmt(&reuc->oid[1])); - printf(" %o ", reuc->mode[2]); - printf(" %s ", git_oid_allocfmt(&reuc->oid[2])); - printf("\n"); - } - printf("\n"); -} - -static int index_entry_eq_merge_index_entry(const struct merge_index_entry *expected, const git_index_entry *actual) -{ - git_oid expected_oid; - bool test_oid; - - if (strlen(expected->oid_str) != 0) { - cl_git_pass(git_oid_fromstr(&expected_oid, expected->oid_str)); - test_oid = 1; - } else - test_oid = 0; - - if (actual->mode != expected->mode || - (test_oid && git_oid_cmp(&actual->id, &expected_oid) != 0) || - git_index_entry_stage(actual) != expected->stage) - return 0; - - if (actual->mode == 0 && (actual->path != NULL || strlen(expected->path) > 0)) - return 0; - - if (actual->mode != 0 && (strcmp(actual->path, expected->path) != 0)) - return 0; - - return 1; -} - -static int name_entry_eq(const char *expected, const char *actual) -{ - if (strlen(expected) == 0) - return (actual == NULL) ? 1 : 0; - - return (strcmp(expected, actual) == 0) ? 1 : 0; -} - -static int name_entry_eq_merge_name_entry(const struct merge_name_entry *expected, const git_index_name_entry *actual) -{ - if (name_entry_eq(expected->ancestor_path, actual->ancestor) == 0 || - name_entry_eq(expected->our_path, actual->ours) == 0 || - name_entry_eq(expected->their_path, actual->theirs) == 0) - return 0; - - return 1; -} - -static int index_conflict_data_eq_merge_diff(const struct merge_index_conflict_data *expected, git_merge_diff *actual) -{ - if (!index_entry_eq_merge_index_entry(&expected->ancestor.entry, &actual->ancestor_entry) || - !index_entry_eq_merge_index_entry(&expected->ours.entry, &actual->our_entry) || - !index_entry_eq_merge_index_entry(&expected->theirs.entry, &actual->their_entry)) - return 0; - - if (expected->ours.status != actual->our_status || - expected->theirs.status != actual->their_status) - return 0; - - return 1; -} - -int merge_test_merge_conflicts(git_vector *conflicts, const struct merge_index_conflict_data expected[], size_t expected_len) -{ - git_merge_diff *actual; - size_t i; - - if (conflicts->length != expected_len) - return 0; - - for (i = 0; i < expected_len; i++) { - actual = conflicts->contents[i]; - - if (!index_conflict_data_eq_merge_diff(&expected[i], actual)) - return 0; - } - - return 1; -} - -int merge_test_index(git_index *index, const struct merge_index_entry expected[], size_t expected_len) -{ - size_t i; - const git_index_entry *index_entry; - - /* - dump_index_entries(&index->entries); - */ - - if (git_index_entrycount(index) != expected_len) - return 0; - - for (i = 0; i < expected_len; i++) { - if ((index_entry = git_index_get_byindex(index, i)) == NULL) - return 0; - - if (!index_entry_eq_merge_index_entry(&expected[i], index_entry)) - return 0; - } - - return 1; -} - -int merge_test_names(git_index *index, const struct merge_name_entry expected[], size_t expected_len) -{ - size_t i; - const git_index_name_entry *name_entry; - - /* - dump_names(index); - */ - - if (git_index_name_entrycount(index) != expected_len) - return 0; - - for (i = 0; i < expected_len; i++) { - if ((name_entry = git_index_name_get_byindex(index, i)) == NULL) - return 0; - - if (! name_entry_eq_merge_name_entry(&expected[i], name_entry)) - return 0; - } - - return 1; -} - -int merge_test_reuc(git_index *index, const struct merge_reuc_entry expected[], size_t expected_len) -{ - size_t i; - const git_index_reuc_entry *reuc_entry; - git_oid expected_oid; - - /* - dump_reuc(index); - */ - - if (git_index_reuc_entrycount(index) != expected_len) - return 0; - - for (i = 0; i < expected_len; i++) { - if ((reuc_entry = git_index_reuc_get_byindex(index, i)) == NULL) - return 0; - - if (strcmp(reuc_entry->path, expected[i].path) != 0 || - reuc_entry->mode[0] != expected[i].ancestor_mode || - reuc_entry->mode[1] != expected[i].our_mode || - reuc_entry->mode[2] != expected[i].their_mode) - return 0; - - if (expected[i].ancestor_mode > 0) { - cl_git_pass(git_oid_fromstr(&expected_oid, expected[i].ancestor_oid_str)); - - if (git_oid_cmp(&reuc_entry->oid[0], &expected_oid) != 0) - return 0; - } - - if (expected[i].our_mode > 0) { - cl_git_pass(git_oid_fromstr(&expected_oid, expected[i].our_oid_str)); - - if (git_oid_cmp(&reuc_entry->oid[1], &expected_oid) != 0) - return 0; - } - - if (expected[i].their_mode > 0) { - cl_git_pass(git_oid_fromstr(&expected_oid, expected[i].their_oid_str)); - - if (git_oid_cmp(&reuc_entry->oid[2], &expected_oid) != 0) - return 0; - } - } - - return 1; -} - -int dircount(void *payload, git_buf *pathbuf) -{ - size_t *entries = payload; - size_t len = git_buf_len(pathbuf); - - if (len < 5 || strcmp(pathbuf->ptr + (git_buf_len(pathbuf) - 5), "/.git") != 0) - (*entries)++; - - return 0; -} - -int merge_test_workdir(git_repository *repo, const struct merge_index_entry expected[], size_t expected_len) -{ - size_t actual_len = 0, i; - git_oid actual_oid, expected_oid; - git_buf wd = GIT_BUF_INIT; - - git_buf_puts(&wd, repo->workdir); - git_path_direach(&wd, 0, dircount, &actual_len); - - if (actual_len != expected_len) - return 0; - - for (i = 0; i < expected_len; i++) { - git_blob_create_fromworkdir(&actual_oid, repo, expected[i].path); - git_oid_fromstr(&expected_oid, expected[i].oid_str); - - if (git_oid_cmp(&actual_oid, &expected_oid) != 0) - return 0; - } - - git_buf_free(&wd); - - return 1; -} diff --git a/vendor/libgit2/tests/merge/merge_helpers.h b/vendor/libgit2/tests/merge/merge_helpers.h deleted file mode 100644 index 554c24b7cd..0000000000 --- a/vendor/libgit2/tests/merge/merge_helpers.h +++ /dev/null @@ -1,111 +0,0 @@ -#ifndef INCLUDE_cl_merge_helpers_h__ -#define INCLUDE_cl_merge_helpers_h__ - -#include "merge.h" -#include "git2/merge.h" - -#define AUTOMERGEABLE_MERGED_FILE \ - "this file is changed in master\n" \ - "this file is automergeable\n" \ - "this file is automergeable\n" \ - "this file is automergeable\n" \ - "this file is automergeable\n" \ - "this file is automergeable\n" \ - "this file is automergeable\n" \ - "this file is automergeable\n" \ - "this file is changed in branch\n" - -#define AUTOMERGEABLE_MERGED_FILE_CRLF \ - "this file is changed in master\r\n" \ - "this file is automergeable\r\n" \ - "this file is automergeable\r\n" \ - "this file is automergeable\r\n" \ - "this file is automergeable\r\n" \ - "this file is automergeable\r\n" \ - "this file is automergeable\r\n" \ - "this file is automergeable\r\n" \ - "this file is changed in branch\r\n" - -#define CONFLICTING_MERGE_FILE \ - "<<<<<<< HEAD\n" \ - "this file is changed in master and branch\n" \ - "=======\n" \ - "this file is changed in branch and master\n" \ - ">>>>>>> 7cb63eed597130ba4abb87b3e544b85021905520\n" - -#define CONFLICTING_DIFF3_FILE \ - "<<<<<<< HEAD\n" \ - "this file is changed in master and branch\n" \ - "||||||| initial\n" \ - "this file is a conflict\n" \ - "=======\n" \ - "this file is changed in branch and master\n" \ - ">>>>>>> 7cb63eed597130ba4abb87b3e544b85021905520\n" - -#define CONFLICTING_UNION_FILE \ - "this file is changed in master and branch\n" \ - "this file is changed in branch and master\n" - - -struct merge_index_entry { - uint16_t mode; - char oid_str[GIT_OID_HEXSZ+1]; - int stage; - char path[128]; -}; - -struct merge_name_entry { - char ancestor_path[128]; - char our_path[128]; - char their_path[128]; -}; - -struct merge_index_with_status { - struct merge_index_entry entry; - unsigned int status; -}; - -struct merge_reuc_entry { - char path[128]; - unsigned int ancestor_mode; - unsigned int our_mode; - unsigned int their_mode; - char ancestor_oid_str[GIT_OID_HEXSZ+1]; - char our_oid_str[GIT_OID_HEXSZ+1]; - char their_oid_str[GIT_OID_HEXSZ+1]; -}; - -struct merge_index_conflict_data { - struct merge_index_with_status ancestor; - struct merge_index_with_status ours; - struct merge_index_with_status theirs; - git_merge_diff_type_t change_type; -}; - -int merge_trees_from_branches( - git_index **index, git_repository *repo, - const char *ours_name, const char *theirs_name, - git_merge_options *opts); - -int merge_commits_from_branches( - git_index **index, git_repository *repo, - const char *ours_name, const char *theirs_name, - git_merge_options *opts); - -int merge_branches(git_repository *repo, - const char *ours_branch, const char *theirs_branch, - git_merge_options *merge_opts, git_checkout_options *checkout_opts); - -int merge_test_diff_list(git_merge_diff_list *diff_list, const struct merge_index_entry expected[], size_t expected_len); - -int merge_test_merge_conflicts(git_vector *conflicts, const struct merge_index_conflict_data expected[], size_t expected_len); - -int merge_test_index(git_index *index, const struct merge_index_entry expected[], size_t expected_len); - -int merge_test_names(git_index *index, const struct merge_name_entry expected[], size_t expected_len); - -int merge_test_reuc(git_index *index, const struct merge_reuc_entry expected[], size_t expected_len); - -int merge_test_workdir(git_repository *repo, const struct merge_index_entry expected[], size_t expected_len); - -#endif diff --git a/vendor/libgit2/tests/merge/trees/automerge.c b/vendor/libgit2/tests/merge/trees/automerge.c deleted file mode 100644 index c18881d7c5..0000000000 --- a/vendor/libgit2/tests/merge/trees/automerge.c +++ /dev/null @@ -1,195 +0,0 @@ -#include "clar_libgit2.h" -#include "git2/repository.h" -#include "git2/merge.h" -#include "buffer.h" -#include "merge.h" -#include "../merge_helpers.h" -#include "fileops.h" - -static git_repository *repo; - -#define TEST_REPO_PATH "merge-resolve" -#define TEST_INDEX_PATH TEST_REPO_PATH "/.git/index" - -#define THEIRS_AUTOMERGE_BRANCH "branch" - -#define THEIRS_UNRELATED_BRANCH "unrelated" -#define THEIRS_UNRELATED_OID "55b4e4687e7a0d9ca367016ed930f385d4022e6f" -#define THEIRS_UNRELATED_PARENT "d6cf6c7741b3316826af1314042550c97ded1d50" - -#define OURS_DIRECTORY_FILE "df_side1" -#define THEIRS_DIRECTORY_FILE "df_side2" - -/* Non-conflicting files, index entries are common to every merge operation */ -#define ADDED_IN_MASTER_INDEX_ENTRY \ - { 0100644, "233c0919c998ed110a4b6ff36f353aec8b713487", 0, "added-in-master.txt" } -#define AUTOMERGEABLE_INDEX_ENTRY \ - { 0100644, "f2e1550a0c9e53d5811175864a29536642ae3821", 0, "automergeable.txt" } -#define CHANGED_IN_BRANCH_INDEX_ENTRY \ - { 0100644, "4eb04c9e79e88f6640d01ff5b25ca2a60764f216", 0, "changed-in-branch.txt" } -#define CHANGED_IN_MASTER_INDEX_ENTRY \ - { 0100644, "11deab00b2d3a6f5a3073988ac050c2d7b6655e2", 0, "changed-in-master.txt" } -#define UNCHANGED_INDEX_ENTRY \ - { 0100644, "c8f06f2e3bb2964174677e91f0abead0e43c9e5d", 0, "unchanged.txt" } - -/* Expected REUC entries */ -#define AUTOMERGEABLE_REUC_ENTRY \ - { "automergeable.txt", 0100644, 0100644, 0100644, \ - "6212c31dab5e482247d7977e4f0dd3601decf13b", \ - "ee3fa1b8c00aff7fe02065fdb50864bb0d932ccf", \ - "058541fc37114bfc1dddf6bd6bffc7fae5c2e6fe" } -#define CONFLICTING_REUC_ENTRY \ - { "conflicting.txt", 0100644, 0100644, 0100644, \ - "d427e0b2e138501a3d15cc376077a3631e15bd46", \ - "4e886e602529caa9ab11d71f86634bd1b6e0de10", \ - "2bd0a343aeef7a2cf0d158478966a6e587ff3863" } -#define REMOVED_IN_BRANCH_REUC_ENTRY \ - { "removed-in-branch.txt", 0100644, 0100644, 0, \ - "dfe3f22baa1f6fce5447901c3086bae368de6bdd", \ - "dfe3f22baa1f6fce5447901c3086bae368de6bdd", \ - "" } -#define REMOVED_IN_MASTER_REUC_ENTRY \ - { "removed-in-master.txt", 0100644, 0, 0100644, \ - "5c3b68a71fc4fa5d362fd3875e53137c6a5ab7a5", \ - "", \ - "5c3b68a71fc4fa5d362fd3875e53137c6a5ab7a5" } - -// Fixture setup and teardown -void test_merge_trees_automerge__initialize(void) -{ - repo = cl_git_sandbox_init(TEST_REPO_PATH); -} - -void test_merge_trees_automerge__cleanup(void) -{ - cl_git_sandbox_cleanup(); -} - -void test_merge_trees_automerge__automerge(void) -{ - git_index *index; - const git_index_entry *entry; - git_merge_options opts = GIT_MERGE_OPTIONS_INIT; - git_blob *blob; - - struct merge_index_entry merge_index_entries[] = { - ADDED_IN_MASTER_INDEX_ENTRY, - AUTOMERGEABLE_INDEX_ENTRY, - CHANGED_IN_BRANCH_INDEX_ENTRY, - CHANGED_IN_MASTER_INDEX_ENTRY, - - { 0100644, "d427e0b2e138501a3d15cc376077a3631e15bd46", 1, "conflicting.txt" }, - { 0100644, "4e886e602529caa9ab11d71f86634bd1b6e0de10", 2, "conflicting.txt" }, - { 0100644, "2bd0a343aeef7a2cf0d158478966a6e587ff3863", 3, "conflicting.txt" }, - - UNCHANGED_INDEX_ENTRY, - }; - - struct merge_reuc_entry merge_reuc_entries[] = { - AUTOMERGEABLE_REUC_ENTRY, - REMOVED_IN_BRANCH_REUC_ENTRY, - REMOVED_IN_MASTER_REUC_ENTRY - }; - - cl_git_pass(merge_trees_from_branches(&index, repo, "master", THEIRS_AUTOMERGE_BRANCH, &opts)); - - cl_assert(merge_test_index(index, merge_index_entries, 8)); - cl_assert(merge_test_reuc(index, merge_reuc_entries, 3)); - - cl_assert((entry = git_index_get_bypath(index, "automergeable.txt", 0)) != NULL); - cl_assert(entry->file_size == strlen(AUTOMERGEABLE_MERGED_FILE)); - - cl_git_pass(git_object_lookup((git_object **)&blob, repo, &entry->id, GIT_OBJ_BLOB)); - cl_assert(memcmp(git_blob_rawcontent(blob), AUTOMERGEABLE_MERGED_FILE, (size_t)entry->file_size) == 0); - - git_index_free(index); - git_blob_free(blob); -} - -void test_merge_trees_automerge__favor_ours(void) -{ - git_index *index; - git_merge_options opts = GIT_MERGE_OPTIONS_INIT; - - struct merge_index_entry merge_index_entries[] = { - ADDED_IN_MASTER_INDEX_ENTRY, - AUTOMERGEABLE_INDEX_ENTRY, - CHANGED_IN_BRANCH_INDEX_ENTRY, - CHANGED_IN_MASTER_INDEX_ENTRY, - { 0100644, "4e886e602529caa9ab11d71f86634bd1b6e0de10", 0, "conflicting.txt" }, - UNCHANGED_INDEX_ENTRY, - }; - - struct merge_reuc_entry merge_reuc_entries[] = { - AUTOMERGEABLE_REUC_ENTRY, - CONFLICTING_REUC_ENTRY, - REMOVED_IN_BRANCH_REUC_ENTRY, - REMOVED_IN_MASTER_REUC_ENTRY, - }; - - opts.file_favor = GIT_MERGE_FILE_FAVOR_OURS; - - cl_git_pass(merge_trees_from_branches(&index, repo, "master", THEIRS_AUTOMERGE_BRANCH, &opts)); - - cl_assert(merge_test_index(index, merge_index_entries, 6)); - cl_assert(merge_test_reuc(index, merge_reuc_entries, 4)); - - git_index_free(index); -} - -void test_merge_trees_automerge__favor_theirs(void) -{ - git_index *index; - git_merge_options opts = GIT_MERGE_OPTIONS_INIT; - - struct merge_index_entry merge_index_entries[] = { - ADDED_IN_MASTER_INDEX_ENTRY, - AUTOMERGEABLE_INDEX_ENTRY, - CHANGED_IN_BRANCH_INDEX_ENTRY, - CHANGED_IN_MASTER_INDEX_ENTRY, - { 0100644, "2bd0a343aeef7a2cf0d158478966a6e587ff3863", 0, "conflicting.txt" }, - UNCHANGED_INDEX_ENTRY, - }; - - struct merge_reuc_entry merge_reuc_entries[] = { - AUTOMERGEABLE_REUC_ENTRY, - CONFLICTING_REUC_ENTRY, - REMOVED_IN_BRANCH_REUC_ENTRY, - REMOVED_IN_MASTER_REUC_ENTRY, - }; - - opts.file_favor = GIT_MERGE_FILE_FAVOR_THEIRS; - - cl_git_pass(merge_trees_from_branches(&index, repo, "master", THEIRS_AUTOMERGE_BRANCH, &opts)); - - cl_assert(merge_test_index(index, merge_index_entries, 6)); - cl_assert(merge_test_reuc(index, merge_reuc_entries, 4)); - - git_index_free(index); -} - -void test_merge_trees_automerge__unrelated(void) -{ - git_index *index; - git_merge_options opts = GIT_MERGE_OPTIONS_INIT; - - struct merge_index_entry merge_index_entries[] = { - { 0100644, "233c0919c998ed110a4b6ff36f353aec8b713487", 0, "added-in-master.txt" }, - { 0100644, "ee3fa1b8c00aff7fe02065fdb50864bb0d932ccf", 2, "automergeable.txt" }, - { 0100644, "d07ec190c306ec690bac349e87d01c4358e49bb2", 3, "automergeable.txt" }, - { 0100644, "ab6c44a2e84492ad4b41bb6bac87353e9d02ac8b", 0, "changed-in-branch.txt" }, - { 0100644, "11deab00b2d3a6f5a3073988ac050c2d7b6655e2", 0, "changed-in-master.txt" }, - { 0100644, "4e886e602529caa9ab11d71f86634bd1b6e0de10", 2, "conflicting.txt" }, - { 0100644, "4b253da36a0ae8bfce63aeabd8c5b58429925594", 3, "conflicting.txt" }, - { 0100644, "ef58fdd8086c243bdc81f99e379acacfd21d32d6", 0, "new-in-unrelated1.txt" }, - { 0100644, "948ba6e701c1edab0c2d394fb7c5538334129793", 0, "new-in-unrelated2.txt" }, - { 0100644, "dfe3f22baa1f6fce5447901c3086bae368de6bdd", 0, "removed-in-branch.txt" }, - { 0100644, "c8f06f2e3bb2964174677e91f0abead0e43c9e5d", 0, "unchanged.txt" }, - }; - - cl_git_pass(merge_trees_from_branches(&index, repo, "master", THEIRS_UNRELATED_BRANCH, &opts)); - - cl_assert(merge_test_index(index, merge_index_entries, 11)); - - git_index_free(index); -} diff --git a/vendor/libgit2/tests/merge/trees/commits.c b/vendor/libgit2/tests/merge/trees/commits.c deleted file mode 100644 index c4e4709977..0000000000 --- a/vendor/libgit2/tests/merge/trees/commits.c +++ /dev/null @@ -1,131 +0,0 @@ -#include "clar_libgit2.h" -#include "git2/repository.h" -#include "git2/merge.h" -#include "merge.h" -#include "../merge_helpers.h" - -static git_repository *repo; - -#define TEST_REPO_PATH "merge-resolve" - -void test_merge_trees_commits__initialize(void) -{ - repo = cl_git_sandbox_init(TEST_REPO_PATH); -} - -void test_merge_trees_commits__cleanup(void) -{ - cl_git_sandbox_cleanup(); -} - -void test_merge_trees_commits__automerge(void) -{ - git_index *index; - const git_index_entry *entry; - git_merge_options opts = GIT_MERGE_OPTIONS_INIT; - git_blob *blob; - - struct merge_index_entry merge_index_entries[] = { - { 0100644, "233c0919c998ed110a4b6ff36f353aec8b713487", 0, "added-in-master.txt" }, - { 0100644, "f2e1550a0c9e53d5811175864a29536642ae3821", 0, "automergeable.txt" }, - { 0100644, "4eb04c9e79e88f6640d01ff5b25ca2a60764f216", 0, "changed-in-branch.txt" }, - { 0100644, "11deab00b2d3a6f5a3073988ac050c2d7b6655e2", 0, "changed-in-master.txt" }, - - { 0100644, "d427e0b2e138501a3d15cc376077a3631e15bd46", 1, "conflicting.txt" }, - { 0100644, "4e886e602529caa9ab11d71f86634bd1b6e0de10", 2, "conflicting.txt" }, - { 0100644, "2bd0a343aeef7a2cf0d158478966a6e587ff3863", 3, "conflicting.txt" }, - - { 0100644, "c8f06f2e3bb2964174677e91f0abead0e43c9e5d", 0, "unchanged.txt" }, - }; - - struct merge_reuc_entry merge_reuc_entries[] = { - { "automergeable.txt", 0100644, 0100644, 0100644, \ - "6212c31dab5e482247d7977e4f0dd3601decf13b", \ - "ee3fa1b8c00aff7fe02065fdb50864bb0d932ccf", \ - "058541fc37114bfc1dddf6bd6bffc7fae5c2e6fe" }, - { "removed-in-branch.txt", 0100644, 0100644, 0, \ - "dfe3f22baa1f6fce5447901c3086bae368de6bdd", \ - "dfe3f22baa1f6fce5447901c3086bae368de6bdd", \ - "" }, - { "removed-in-master.txt", 0100644, 0, 0100644, \ - "5c3b68a71fc4fa5d362fd3875e53137c6a5ab7a5", \ - "", \ - "5c3b68a71fc4fa5d362fd3875e53137c6a5ab7a5" }, - }; - - cl_git_pass(merge_commits_from_branches(&index, repo, "master", "branch", &opts)); - - cl_assert(merge_test_index(index, merge_index_entries, 8)); - cl_assert(merge_test_reuc(index, merge_reuc_entries, 3)); - - cl_assert((entry = git_index_get_bypath(index, "automergeable.txt", 0)) != NULL); - cl_assert(entry->file_size == strlen(AUTOMERGEABLE_MERGED_FILE)); - - cl_git_pass(git_object_lookup((git_object **)&blob, repo, &entry->id, GIT_OBJ_BLOB)); - cl_assert(memcmp(git_blob_rawcontent(blob), AUTOMERGEABLE_MERGED_FILE, (size_t)entry->file_size) == 0); - - git_index_free(index); - git_blob_free(blob); -} - -void test_merge_trees_commits__no_ancestor(void) -{ - git_index *index; - git_merge_options opts = GIT_MERGE_OPTIONS_INIT; - - struct merge_index_entry merge_index_entries[] = { - { 0100644, "233c0919c998ed110a4b6ff36f353aec8b713487", 0, "added-in-master.txt" }, - { 0100644, "ee3fa1b8c00aff7fe02065fdb50864bb0d932ccf", 2, "automergeable.txt" }, - { 0100644, "d07ec190c306ec690bac349e87d01c4358e49bb2", 3, "automergeable.txt" }, - { 0100644, "ab6c44a2e84492ad4b41bb6bac87353e9d02ac8b", 0, "changed-in-branch.txt" }, - { 0100644, "11deab00b2d3a6f5a3073988ac050c2d7b6655e2", 0, "changed-in-master.txt" }, - { 0100644, "4e886e602529caa9ab11d71f86634bd1b6e0de10", 2, "conflicting.txt" }, - { 0100644, "4b253da36a0ae8bfce63aeabd8c5b58429925594", 3, "conflicting.txt" }, - { 0100644, "ef58fdd8086c243bdc81f99e379acacfd21d32d6", 0, "new-in-unrelated1.txt" }, - { 0100644, "948ba6e701c1edab0c2d394fb7c5538334129793", 0, "new-in-unrelated2.txt" }, - { 0100644, "dfe3f22baa1f6fce5447901c3086bae368de6bdd", 0, "removed-in-branch.txt" }, - { 0100644, "c8f06f2e3bb2964174677e91f0abead0e43c9e5d", 0, "unchanged.txt" }, - }; - - cl_git_pass(merge_commits_from_branches(&index, repo, "master", "unrelated", &opts)); - - cl_assert(merge_test_index(index, merge_index_entries, 11)); - - git_index_free(index); -} - - -void test_merge_trees_commits__df_conflict(void) -{ - git_index *index; - git_merge_options opts = GIT_MERGE_OPTIONS_INIT; - - struct merge_index_entry merge_index_entries[] = { - { 0100644, "49130a28ef567af9a6a6104c38773fedfa5f9742", 2, "dir-10" }, - { 0100644, "6c06dcd163587c2cc18be44857e0b71116382aeb", 3, "dir-10" }, - { 0100644, "43aafd43bea779ec74317dc361f45ae3f532a505", 0, "dir-6" }, - { 0100644, "a031a28ae70e33a641ce4b8a8f6317f1ab79dee4", 3, "dir-7" }, - { 0100644, "5012fd565b1393bdfda1805d4ec38ce6619e1fd1", 1, "dir-7/file.txt" }, - { 0100644, "a5563304ddf6caba25cb50323a2ea6f7dbfcadca", 2, "dir-7/file.txt" }, - { 0100644, "e9ad6ec3e38364a3d07feda7c4197d4d845c53b5", 0, "dir-8" }, - { 0100644, "3ef4d30382ca33fdeba9fda895a99e0891ba37aa", 2, "dir-9" }, - { 0100644, "fc4c636d6515e9e261f9260dbcf3cc6eca97ea08", 1, "dir-9/file.txt" }, - { 0100644, "76ab0e2868197ec158ddd6c78d8a0d2fd73d38f9", 3, "dir-9/file.txt" }, - { 0100644, "5c2411f8075f48a6b2fdb85ebc0d371747c4df15", 0, "file-1/new" }, - { 0100644, "a39a620dae5bc8b4e771cd4d251b7d080401a21e", 1, "file-2" }, - { 0100644, "d963979c237d08b6ba39062ee7bf64c7d34a27f8", 2, "file-2" }, - { 0100644, "5c341ead2ba6f2af98ce5ec3fe84f6b6d2899c0d", 0, "file-2/new" }, - { 0100644, "9efe7723802d4305142eee177e018fee1572c4f4", 0, "file-3/new" }, - { 0100644, "bacac9b3493509aa15e1730e1545fc0919d1dae0", 1, "file-4" }, - { 0100644, "7663fce0130db092936b137cabd693ec234eb060", 3, "file-4" }, - { 0100644, "e49f917b448d1340b31d76e54ba388268fd4c922", 0, "file-4/new" }, - { 0100644, "cab2cf23998b40f1af2d9d9a756dc9e285a8df4b", 2, "file-5/new" }, - { 0100644, "f5504f36e6f4eb797a56fc5bac6c6c7f32969bf2", 3, "file-5/new" }, - }; - - cl_git_pass(merge_trees_from_branches(&index, repo, "df_side1", "df_side2", &opts)); - - cl_assert(merge_test_index(index, merge_index_entries, 20)); - - git_index_free(index); -} diff --git a/vendor/libgit2/tests/merge/trees/modeconflict.c b/vendor/libgit2/tests/merge/trees/modeconflict.c deleted file mode 100644 index d858b8f66f..0000000000 --- a/vendor/libgit2/tests/merge/trees/modeconflict.c +++ /dev/null @@ -1,59 +0,0 @@ -#include "clar_libgit2.h" -#include "git2/repository.h" -#include "git2/merge.h" -#include "buffer.h" -#include "merge.h" -#include "../merge_helpers.h" -#include "fileops.h" - -static git_repository *repo; - -#define TEST_REPO_PATH "merge-resolve" - -#define DF_SIDE1_BRANCH "df_side1" -#define DF_SIDE2_BRANCH "df_side2" - -// Fixture setup and teardown -void test_merge_trees_modeconflict__initialize(void) -{ - repo = cl_git_sandbox_init(TEST_REPO_PATH); -} - -void test_merge_trees_modeconflict__cleanup(void) -{ - cl_git_sandbox_cleanup(); -} - -void test_merge_trees_modeconflict__df_conflict(void) -{ - git_index *index; - - struct merge_index_entry merge_index_entries[] = { - { 0100644, "49130a28ef567af9a6a6104c38773fedfa5f9742", 2, "dir-10" }, - { 0100644, "6c06dcd163587c2cc18be44857e0b71116382aeb", 3, "dir-10" }, - { 0100644, "43aafd43bea779ec74317dc361f45ae3f532a505", 0, "dir-6" }, - { 0100644, "a031a28ae70e33a641ce4b8a8f6317f1ab79dee4", 3, "dir-7" }, - { 0100644, "5012fd565b1393bdfda1805d4ec38ce6619e1fd1", 1, "dir-7/file.txt" }, - { 0100644, "a5563304ddf6caba25cb50323a2ea6f7dbfcadca", 2, "dir-7/file.txt" }, - { 0100644, "e9ad6ec3e38364a3d07feda7c4197d4d845c53b5", 0, "dir-8" }, - { 0100644, "3ef4d30382ca33fdeba9fda895a99e0891ba37aa", 2, "dir-9" }, - { 0100644, "fc4c636d6515e9e261f9260dbcf3cc6eca97ea08", 1, "dir-9/file.txt" }, - { 0100644, "76ab0e2868197ec158ddd6c78d8a0d2fd73d38f9", 3, "dir-9/file.txt" }, - { 0100644, "5c2411f8075f48a6b2fdb85ebc0d371747c4df15", 0, "file-1/new" }, - { 0100644, "a39a620dae5bc8b4e771cd4d251b7d080401a21e", 1, "file-2" }, - { 0100644, "d963979c237d08b6ba39062ee7bf64c7d34a27f8", 2, "file-2" }, - { 0100644, "5c341ead2ba6f2af98ce5ec3fe84f6b6d2899c0d", 0, "file-2/new" }, - { 0100644, "9efe7723802d4305142eee177e018fee1572c4f4", 0, "file-3/new" }, - { 0100644, "bacac9b3493509aa15e1730e1545fc0919d1dae0", 1, "file-4" }, - { 0100644, "7663fce0130db092936b137cabd693ec234eb060", 3, "file-4" }, - { 0100644, "e49f917b448d1340b31d76e54ba388268fd4c922", 0, "file-4/new" }, - { 0100644, "cab2cf23998b40f1af2d9d9a756dc9e285a8df4b", 2, "file-5/new" }, - { 0100644, "f5504f36e6f4eb797a56fc5bac6c6c7f32969bf2", 3, "file-5/new" }, - }; - - cl_git_pass(merge_trees_from_branches(&index, repo, DF_SIDE1_BRANCH, DF_SIDE2_BRANCH, NULL)); - - cl_assert(merge_test_index(index, merge_index_entries, 20)); - - git_index_free(index); -} diff --git a/vendor/libgit2/tests/merge/trees/renames.c b/vendor/libgit2/tests/merge/trees/renames.c deleted file mode 100644 index d7721c894a..0000000000 --- a/vendor/libgit2/tests/merge/trees/renames.c +++ /dev/null @@ -1,252 +0,0 @@ -#include "clar_libgit2.h" -#include "git2/repository.h" -#include "git2/merge.h" -#include "buffer.h" -#include "merge.h" -#include "../merge_helpers.h" -#include "fileops.h" - -static git_repository *repo; - -#define TEST_REPO_PATH "merge-resolve" - -#define BRANCH_RENAME_OURS "rename_conflict_ours" -#define BRANCH_RENAME_THEIRS "rename_conflict_theirs" - -// Fixture setup and teardown -void test_merge_trees_renames__initialize(void) -{ - repo = cl_git_sandbox_init(TEST_REPO_PATH); -} - -void test_merge_trees_renames__cleanup(void) -{ - cl_git_sandbox_cleanup(); -} - -void test_merge_trees_renames__index(void) -{ - git_index *index; - git_merge_options *opts = NULL; - - struct merge_index_entry merge_index_entries[] = { - { 0100644, "68c6c84b091926c7d90aa6a79b2bc3bb6adccd8e", 0, "0a-no-change.txt" }, - { 0100644, "f0ce2b8e4986084d9b308fb72709e414c23eb5e6", 0, "0b-duplicated-in-ours.txt" }, - { 0100644, "f0ce2b8e4986084d9b308fb72709e414c23eb5e6", 1, "0b-rewritten-in-ours.txt" }, - { 0100644, "e376fbdd06ebf021c92724da9f26f44212734e3e", 2, "0b-rewritten-in-ours.txt" }, - { 0100644, "b2d399ae15224e1d58066e3c8df70ce37de7a656", 3, "0b-rewritten-in-ours.txt" }, - { 0100644, "2f56120107d680129a5d9791b521cb1e73a2ed31", 0, "0c-duplicated-in-theirs.txt" }, - { 0100644, "2f56120107d680129a5d9791b521cb1e73a2ed31", 1, "0c-rewritten-in-theirs.txt" }, - { 0100644, "efc9121fdedaf08ba180b53ebfbcf71bd488ed09", 2, "0c-rewritten-in-theirs.txt" }, - { 0100644, "712ebba6669ea847d9829e4f1059d6c830c8b531", 3, "0c-rewritten-in-theirs.txt" }, - { 0100644, "0d872f8e871a30208305978ecbf9e66d864f1638", 0, "1a-newname-in-ours-edited-in-theirs.txt" }, - { 0100644, "d0d4594e16f2e19107e3fa7ea63e7aaaff305ffb", 0, "1a-newname-in-ours.txt" }, - { 0100644, "ed9523e62e453e50dd9be1606af19399b96e397a", 0, "1b-newname-in-theirs-edited-in-ours.txt" }, - { 0100644, "2b5f1f181ee3b58ea751f5dd5d8f9b445520a136", 0, "1b-newname-in-theirs.txt" }, - { 0100644, "178940b450f238a56c0d75b7955cb57b38191982", 0, "2-newname-in-both.txt" }, - { 0100644, "18cb316b1cefa0f8a6946f0e201a8e1a6f845ab9", 2, "3a-newname-in-ours-deleted-in-theirs.txt" }, - { 0100644, "18cb316b1cefa0f8a6946f0e201a8e1a6f845ab9", 1, "3a-renamed-in-ours-deleted-in-theirs.txt" }, - { 0100644, "36219b49367146cb2e6a1555b5a9ebd4d0328495", 3, "3b-newname-in-theirs-deleted-in-ours.txt" }, - { 0100644, "36219b49367146cb2e6a1555b5a9ebd4d0328495", 1, "3b-renamed-in-theirs-deleted-in-ours.txt" }, - { 0100644, "227792b52aaa0b238bea00ec7e509b02623f168c", 2, "4a-newname-in-ours-added-in-theirs.txt" }, - { 0100644, "8b5b53cb2aa9ceb1139f5312fcfa3cc3c5a47c9a", 3, "4a-newname-in-ours-added-in-theirs.txt" }, - { 0100644, "227792b52aaa0b238bea00ec7e509b02623f168c", 1, "4a-renamed-in-ours-added-in-theirs.txt" }, - { 0100644, "de872ee3618b894992e9d1e18ba2ebe256a112f9", 2, "4b-newname-in-theirs-added-in-ours.txt" }, - { 0100644, "98d52d07c0b0bbf2b46548f6aa521295c2cb55db", 3, "4b-newname-in-theirs-added-in-ours.txt" }, - { 0100644, "98d52d07c0b0bbf2b46548f6aa521295c2cb55db", 1, "4b-renamed-in-theirs-added-in-ours.txt" }, - { 0100644, "d3719a5ae8e4d92276b5313ce976f6ee5af2b436", 2, "5a-newname-in-ours-added-in-theirs.txt" }, - { 0100644, "98ba4205fcf31f5dd93c916d35fe3f3b3d0e6714", 3, "5a-newname-in-ours-added-in-theirs.txt" }, - { 0100644, "d3719a5ae8e4d92276b5313ce976f6ee5af2b436", 1, "5a-renamed-in-ours-added-in-theirs.txt" }, - { 0100644, "d3719a5ae8e4d92276b5313ce976f6ee5af2b436", 3, "5a-renamed-in-ours-added-in-theirs.txt" }, - { 0100644, "385c8a0f26ddf79e9041e15e17dc352ed2c4cced", 2, "5b-newname-in-theirs-added-in-ours.txt" }, - { 0100644, "63247125386de9ec90a27ad36169307bf8a11a38", 3, "5b-newname-in-theirs-added-in-ours.txt" }, - { 0100644, "63247125386de9ec90a27ad36169307bf8a11a38", 1, "5b-renamed-in-theirs-added-in-ours.txt" }, - { 0100644, "63247125386de9ec90a27ad36169307bf8a11a38", 2, "5b-renamed-in-theirs-added-in-ours.txt" }, - { 0100644, "d8fa77b6833082c1ea36b7828a582d4c43882450", 2, "6-both-renamed-1-to-2-ours.txt" }, - { 0100644, "d8fa77b6833082c1ea36b7828a582d4c43882450", 3, "6-both-renamed-1-to-2-theirs.txt" }, - { 0100644, "d8fa77b6833082c1ea36b7828a582d4c43882450", 1, "6-both-renamed-1-to-2.txt" }, - { 0100644, "b42712cfe99a1a500b2a51fe984e0b8a7702ba11", 1, "7-both-renamed-side-1.txt" }, - { 0100644, "b42712cfe99a1a500b2a51fe984e0b8a7702ba11", 3, "7-both-renamed-side-1.txt" }, - { 0100644, "b69fe837e4cecfd4c9a40cdca7c138468687df07", 1, "7-both-renamed-side-2.txt" }, - { 0100644, "b69fe837e4cecfd4c9a40cdca7c138468687df07", 2, "7-both-renamed-side-2.txt" }, - { 0100644, "b42712cfe99a1a500b2a51fe984e0b8a7702ba11", 2, "7-both-renamed.txt" }, - { 0100644, "b69fe837e4cecfd4c9a40cdca7c138468687df07", 3, "7-both-renamed.txt" }, - }; - - struct merge_name_entry merge_name_entries[] = { - { - "3a-renamed-in-ours-deleted-in-theirs.txt", - "3a-newname-in-ours-deleted-in-theirs.txt", - "" - }, - - { - "3b-renamed-in-theirs-deleted-in-ours.txt", - "", - "3b-newname-in-theirs-deleted-in-ours.txt", - }, - - { - "4a-renamed-in-ours-added-in-theirs.txt", - "4a-newname-in-ours-added-in-theirs.txt", - "", - }, - - { - "4b-renamed-in-theirs-added-in-ours.txt", - "", - "4b-newname-in-theirs-added-in-ours.txt", - }, - - { - "5a-renamed-in-ours-added-in-theirs.txt", - "5a-newname-in-ours-added-in-theirs.txt", - "5a-renamed-in-ours-added-in-theirs.txt", - }, - - { - "5b-renamed-in-theirs-added-in-ours.txt", - "5b-renamed-in-theirs-added-in-ours.txt", - "5b-newname-in-theirs-added-in-ours.txt", - }, - - { - "6-both-renamed-1-to-2.txt", - "6-both-renamed-1-to-2-ours.txt", - "6-both-renamed-1-to-2-theirs.txt", - }, - - { - "7-both-renamed-side-1.txt", - "7-both-renamed.txt", - "7-both-renamed-side-1.txt", - }, - - { - "7-both-renamed-side-2.txt", - "7-both-renamed-side-2.txt", - "7-both-renamed.txt", - }, - }; - - struct merge_reuc_entry merge_reuc_entries[] = { - { "1a-newname-in-ours-edited-in-theirs.txt", - 0, 0100644, 0, - "", - "c3d02eeef75183df7584d8d13ac03053910c1301", - "" }, - - { "1a-newname-in-ours.txt", - 0, 0100644, 0, - "", - "d0d4594e16f2e19107e3fa7ea63e7aaaff305ffb", - "" }, - - { "1a-renamed-in-ours-edited-in-theirs.txt", - 0100644, 0, 0100644, - "c3d02eeef75183df7584d8d13ac03053910c1301", - "", - "0d872f8e871a30208305978ecbf9e66d864f1638" }, - - { "1a-renamed-in-ours.txt", - 0100644, 0, 0100644, - "d0d4594e16f2e19107e3fa7ea63e7aaaff305ffb", - "", - "d0d4594e16f2e19107e3fa7ea63e7aaaff305ffb" }, - - { "1b-newname-in-theirs-edited-in-ours.txt", - 0, 0, 0100644, - "", - "", - "241a1005cd9b980732741b74385b891142bcba28" }, - - { "1b-newname-in-theirs.txt", - 0, 0, 0100644, - "", - "", - "2b5f1f181ee3b58ea751f5dd5d8f9b445520a136" }, - - { "1b-renamed-in-theirs-edited-in-ours.txt", - 0100644, 0100644, 0, - "241a1005cd9b980732741b74385b891142bcba28", - "ed9523e62e453e50dd9be1606af19399b96e397a", - "" }, - - { "1b-renamed-in-theirs.txt", - 0100644, 0100644, 0, - "2b5f1f181ee3b58ea751f5dd5d8f9b445520a136", - "2b5f1f181ee3b58ea751f5dd5d8f9b445520a136", - "" }, - - { "2-newname-in-both.txt", - 0, 0100644, 0100644, - "", - "178940b450f238a56c0d75b7955cb57b38191982", - "178940b450f238a56c0d75b7955cb57b38191982" }, - - { "2-renamed-in-both.txt", - 0100644, 0, 0, - "178940b450f238a56c0d75b7955cb57b38191982", - "", - "" }, - }; - - cl_git_pass(merge_trees_from_branches(&index, repo, - BRANCH_RENAME_OURS, BRANCH_RENAME_THEIRS, - opts)); - - cl_assert(merge_test_index(index, merge_index_entries, 41)); - cl_assert(merge_test_names(index, merge_name_entries, 9)); - cl_assert(merge_test_reuc(index, merge_reuc_entries, 10)); - - git_index_free(index); -} - -void test_merge_trees_renames__no_rename_index(void) -{ - git_index *index; - git_merge_options opts = GIT_MERGE_OPTIONS_INIT; - - struct merge_index_entry merge_index_entries[] = { - { 0100644, "68c6c84b091926c7d90aa6a79b2bc3bb6adccd8e", 0, "0a-no-change.txt" }, - { 0100644, "f0ce2b8e4986084d9b308fb72709e414c23eb5e6", 0, "0b-duplicated-in-ours.txt" }, - { 0100644, "f0ce2b8e4986084d9b308fb72709e414c23eb5e6", 1, "0b-rewritten-in-ours.txt" }, - { 0100644, "e376fbdd06ebf021c92724da9f26f44212734e3e", 2, "0b-rewritten-in-ours.txt" }, - { 0100644, "b2d399ae15224e1d58066e3c8df70ce37de7a656", 3, "0b-rewritten-in-ours.txt" }, - { 0100644, "2f56120107d680129a5d9791b521cb1e73a2ed31", 0, "0c-duplicated-in-theirs.txt" }, - { 0100644, "2f56120107d680129a5d9791b521cb1e73a2ed31", 1, "0c-rewritten-in-theirs.txt" }, - { 0100644, "efc9121fdedaf08ba180b53ebfbcf71bd488ed09", 2, "0c-rewritten-in-theirs.txt" }, - { 0100644, "712ebba6669ea847d9829e4f1059d6c830c8b531", 3, "0c-rewritten-in-theirs.txt" }, - { 0100644, "c3d02eeef75183df7584d8d13ac03053910c1301", 0, "1a-newname-in-ours-edited-in-theirs.txt" }, - { 0100644, "d0d4594e16f2e19107e3fa7ea63e7aaaff305ffb", 0, "1a-newname-in-ours.txt" }, - { 0100644, "c3d02eeef75183df7584d8d13ac03053910c1301", 1, "1a-renamed-in-ours-edited-in-theirs.txt" }, - { 0100644, "0d872f8e871a30208305978ecbf9e66d864f1638", 3, "1a-renamed-in-ours-edited-in-theirs.txt" }, - { 0100644, "241a1005cd9b980732741b74385b891142bcba28", 0, "1b-newname-in-theirs-edited-in-ours.txt" }, - { 0100644, "2b5f1f181ee3b58ea751f5dd5d8f9b445520a136", 0, "1b-newname-in-theirs.txt" }, - { 0100644, "241a1005cd9b980732741b74385b891142bcba28", 1, "1b-renamed-in-theirs-edited-in-ours.txt" }, - { 0100644, "ed9523e62e453e50dd9be1606af19399b96e397a", 2, "1b-renamed-in-theirs-edited-in-ours.txt" }, - { 0100644, "178940b450f238a56c0d75b7955cb57b38191982", 0, "2-newname-in-both.txt" }, - { 0100644, "18cb316b1cefa0f8a6946f0e201a8e1a6f845ab9", 0, "3a-newname-in-ours-deleted-in-theirs.txt" }, - { 0100644, "36219b49367146cb2e6a1555b5a9ebd4d0328495", 0, "3b-newname-in-theirs-deleted-in-ours.txt" }, - { 0100644, "227792b52aaa0b238bea00ec7e509b02623f168c", 2, "4a-newname-in-ours-added-in-theirs.txt" }, - { 0100644, "8b5b53cb2aa9ceb1139f5312fcfa3cc3c5a47c9a", 3, "4a-newname-in-ours-added-in-theirs.txt" }, - { 0100644, "de872ee3618b894992e9d1e18ba2ebe256a112f9", 2, "4b-newname-in-theirs-added-in-ours.txt" }, - { 0100644, "98d52d07c0b0bbf2b46548f6aa521295c2cb55db", 3, "4b-newname-in-theirs-added-in-ours.txt" }, - { 0100644, "d3719a5ae8e4d92276b5313ce976f6ee5af2b436", 2, "5a-newname-in-ours-added-in-theirs.txt" }, - { 0100644, "98ba4205fcf31f5dd93c916d35fe3f3b3d0e6714", 3, "5a-newname-in-ours-added-in-theirs.txt" }, - { 0100644, "385c8a0f26ddf79e9041e15e17dc352ed2c4cced", 2, "5b-newname-in-theirs-added-in-ours.txt" }, - { 0100644, "63247125386de9ec90a27ad36169307bf8a11a38", 3, "5b-newname-in-theirs-added-in-ours.txt" }, - { 0100644, "d8fa77b6833082c1ea36b7828a582d4c43882450", 0, "6-both-renamed-1-to-2-ours.txt" }, - { 0100644, "d8fa77b6833082c1ea36b7828a582d4c43882450", 0, "6-both-renamed-1-to-2-theirs.txt" }, - { 0100644, "b42712cfe99a1a500b2a51fe984e0b8a7702ba11", 2, "7-both-renamed.txt" }, - { 0100644, "b69fe837e4cecfd4c9a40cdca7c138468687df07", 3, "7-both-renamed.txt" }, - }; - - cl_git_pass(merge_trees_from_branches(&index, repo, - BRANCH_RENAME_OURS, BRANCH_RENAME_THEIRS, - &opts)); - - cl_assert(merge_test_index(index, merge_index_entries, 32)); - - git_index_free(index); -} diff --git a/vendor/libgit2/tests/merge/trees/treediff.c b/vendor/libgit2/tests/merge/trees/treediff.c deleted file mode 100644 index b96c4c4dbe..0000000000 --- a/vendor/libgit2/tests/merge/trees/treediff.c +++ /dev/null @@ -1,554 +0,0 @@ -#include "clar_libgit2.h" -#include "git2/tree.h" -#include "merge.h" -#include "../merge_helpers.h" -#include "diff.h" -#include "git2/sys/hashsig.h" - -static git_repository *repo; - -#define TEST_REPO_PATH "merge-resolve" - -#define TREE_OID_ANCESTOR "0d52e3a556e189ba0948ae56780918011c1b167d" -#define TREE_OID_MASTER "1f81433e3161efbf250576c58fede7f6b836f3d3" -#define TREE_OID_BRANCH "eea9286df54245fea72c5b557291470eb825f38f" -#define TREE_OID_RENAMES1 "f5f9dd5886a6ee20272be0aafc790cba43b31931" -#define TREE_OID_RENAMES2 "5fbfbdc04b4eca46f54f4853a3c5a1dce28f5165" - -#define TREE_OID_DF_ANCESTOR "b8a3a806d3950e8c0a03a34f234a92eff0e2c68d" -#define TREE_OID_DF_SIDE1 "ee1d6f164893c1866a323f072eeed36b855656be" -#define TREE_OID_DF_SIDE2 "6178885b38fe96e825ac0f492c0a941f288b37f6" - -#define TREE_OID_RENAME_CONFLICT_ANCESTOR "476dbb3e207313d1d8aaa120c6ad204bf1295e53" -#define TREE_OID_RENAME_CONFLICT_OURS "c4efe31e9decccc8b2b4d3df9aac2cdfe2995618" -#define TREE_OID_RENAME_CONFLICT_THEIRS "9e7f4359c469f309b6057febf4c6e80742cbed5b" - -void test_merge_trees_treediff__initialize(void) -{ - repo = cl_git_sandbox_init(TEST_REPO_PATH); -} - -void test_merge_trees_treediff__cleanup(void) -{ - cl_git_sandbox_cleanup(); -} - -static void test_find_differences( - const char *ancestor_oidstr, - const char *ours_oidstr, - const char *theirs_oidstr, - struct merge_index_conflict_data *treediff_conflict_data, - size_t treediff_conflict_data_len) -{ - git_merge_diff_list *merge_diff_list = git_merge_diff_list__alloc(repo); - git_oid ancestor_oid, ours_oid, theirs_oid; - git_tree *ancestor_tree, *ours_tree, *theirs_tree; - git_iterator *ancestor_iter, *ours_iter, *theirs_iter; - - git_merge_options opts = GIT_MERGE_OPTIONS_INIT; - opts.tree_flags |= GIT_MERGE_TREE_FIND_RENAMES; - opts.target_limit = 1000; - opts.rename_threshold = 50; - - opts.metric = git__malloc(sizeof(git_diff_similarity_metric)); - cl_assert(opts.metric != NULL); - - opts.metric->file_signature = git_diff_find_similar__hashsig_for_file; - opts.metric->buffer_signature = git_diff_find_similar__hashsig_for_buf; - opts.metric->free_signature = git_diff_find_similar__hashsig_free; - opts.metric->similarity = git_diff_find_similar__calc_similarity; - opts.metric->payload = (void *)GIT_HASHSIG_SMART_WHITESPACE; - - cl_git_pass(git_oid_fromstr(&ancestor_oid, ancestor_oidstr)); - cl_git_pass(git_oid_fromstr(&ours_oid, ours_oidstr)); - cl_git_pass(git_oid_fromstr(&theirs_oid, theirs_oidstr)); - - cl_git_pass(git_tree_lookup(&ancestor_tree, repo, &ancestor_oid)); - cl_git_pass(git_tree_lookup(&ours_tree, repo, &ours_oid)); - cl_git_pass(git_tree_lookup(&theirs_tree, repo, &theirs_oid)); - - cl_git_pass(git_iterator_for_tree(&ancestor_iter, ancestor_tree, - GIT_ITERATOR_DONT_IGNORE_CASE, NULL, NULL)); - cl_git_pass(git_iterator_for_tree(&ours_iter, ours_tree, - GIT_ITERATOR_DONT_IGNORE_CASE, NULL, NULL)); - cl_git_pass(git_iterator_for_tree(&theirs_iter, theirs_tree, - GIT_ITERATOR_DONT_IGNORE_CASE, NULL, NULL)); - - cl_git_pass(git_merge_diff_list__find_differences(merge_diff_list, ancestor_iter, ours_iter, theirs_iter)); - cl_git_pass(git_merge_diff_list__find_renames(repo, merge_diff_list, &opts)); - - /* - dump_merge_index(merge_index); - */ - - cl_assert(treediff_conflict_data_len == merge_diff_list->conflicts.length); - - cl_assert(merge_test_merge_conflicts(&merge_diff_list->conflicts, treediff_conflict_data, treediff_conflict_data_len)); - - git_iterator_free(ancestor_iter); - git_iterator_free(ours_iter); - git_iterator_free(theirs_iter); - - git_tree_free(ancestor_tree); - git_tree_free(ours_tree); - git_tree_free(theirs_tree); - - git_merge_diff_list__free(merge_diff_list); - - git__free(opts.metric); -} - -void test_merge_trees_treediff__simple(void) -{ - struct merge_index_conflict_data treediff_conflict_data[] = { - { - { { 0, "", 0, "" }, GIT_DELTA_UNMODIFIED }, - { { 0100644, "233c0919c998ed110a4b6ff36f353aec8b713487", 0, "added-in-master.txt" }, GIT_DELTA_ADDED }, - { { 0, "", 0, "" }, GIT_DELTA_UNMODIFIED }, - GIT_MERGE_DIFF_NONE - }, - - { - { { 0100644, "6212c31dab5e482247d7977e4f0dd3601decf13b", 0, "automergeable.txt" }, GIT_DELTA_UNMODIFIED }, - { { 0100644, "ee3fa1b8c00aff7fe02065fdb50864bb0d932ccf", 0, "automergeable.txt" }, GIT_DELTA_MODIFIED }, - { { 0100644, "058541fc37114bfc1dddf6bd6bffc7fae5c2e6fe", 0, "automergeable.txt" }, GIT_DELTA_MODIFIED }, - GIT_MERGE_DIFF_BOTH_MODIFIED - }, - - { - { { 0100644, "ab6c44a2e84492ad4b41bb6bac87353e9d02ac8b", 0, "changed-in-branch.txt" }, GIT_DELTA_UNMODIFIED }, - { { 0100644, "ab6c44a2e84492ad4b41bb6bac87353e9d02ac8b", 0, "changed-in-branch.txt" }, GIT_DELTA_UNMODIFIED }, - { { 0100644, "4eb04c9e79e88f6640d01ff5b25ca2a60764f216", 0, "changed-in-branch.txt" }, GIT_DELTA_MODIFIED }, - GIT_MERGE_DIFF_NONE - }, - - { - { { 0100644, "ab6c44a2e84492ad4b41bb6bac87353e9d02ac8b", 0, "changed-in-master.txt" }, GIT_DELTA_UNMODIFIED }, - { { 0100644, "11deab00b2d3a6f5a3073988ac050c2d7b6655e2", 0, "changed-in-master.txt" }, GIT_DELTA_MODIFIED }, - { { 0100644, "ab6c44a2e84492ad4b41bb6bac87353e9d02ac8b", 0, "changed-in-master.txt" }, GIT_DELTA_UNMODIFIED }, - GIT_MERGE_DIFF_NONE - }, - - { - { { 0100644, "d427e0b2e138501a3d15cc376077a3631e15bd46", 0, "conflicting.txt" }, GIT_DELTA_UNMODIFIED }, - { { 0100644, "4e886e602529caa9ab11d71f86634bd1b6e0de10", 0, "conflicting.txt" }, GIT_DELTA_MODIFIED }, - { { 0100644, "2bd0a343aeef7a2cf0d158478966a6e587ff3863", 0, "conflicting.txt" }, GIT_DELTA_MODIFIED }, - GIT_MERGE_DIFF_BOTH_MODIFIED - }, - - { - { { 0100644, "dfe3f22baa1f6fce5447901c3086bae368de6bdd", 0, "removed-in-branch.txt" }, GIT_DELTA_UNMODIFIED }, - { { 0100644, "dfe3f22baa1f6fce5447901c3086bae368de6bdd", 0, "removed-in-branch.txt" }, GIT_DELTA_UNMODIFIED }, - { { 0, "", 0, "" }, GIT_DELTA_DELETED }, - GIT_MERGE_DIFF_NONE - }, - - { - { { 0100644, "5c3b68a71fc4fa5d362fd3875e53137c6a5ab7a5", 0, "removed-in-master.txt" }, GIT_DELTA_UNMODIFIED }, - { { 0, "", 0, "" }, GIT_DELTA_DELETED }, - { { 0100644, "5c3b68a71fc4fa5d362fd3875e53137c6a5ab7a5", 0, "removed-in-master.txt" }, GIT_DELTA_UNMODIFIED }, - GIT_MERGE_DIFF_NONE - }, - }; - - test_find_differences(TREE_OID_ANCESTOR, TREE_OID_MASTER, TREE_OID_BRANCH, treediff_conflict_data, 7); -} - -void test_merge_trees_treediff__df_conflicts(void) -{ - struct merge_index_conflict_data treediff_conflict_data[] = { - { - { { 0, "", 0, "" }, GIT_DELTA_UNMODIFIED }, - { { 0100644, "49130a28ef567af9a6a6104c38773fedfa5f9742", 0, "dir-10" }, GIT_DELTA_ADDED }, - { { 0100644, "6c06dcd163587c2cc18be44857e0b71116382aeb", 0, "dir-10" }, GIT_DELTA_ADDED }, - GIT_MERGE_DIFF_BOTH_ADDED, - }, - - { - { { 0100644, "242591eb280ee9eeb2ce63524b9a8b9bc4cb515d", 0, "dir-10/file.txt" }, GIT_DELTA_UNMODIFIED }, - { { 0, "", 0, "" }, GIT_DELTA_DELETED }, - { { 0, "", 0, "" }, GIT_DELTA_DELETED }, - GIT_MERGE_DIFF_BOTH_DELETED, - }, - - { - { { 0, "", 0, "" }, GIT_DELTA_UNMODIFIED }, - { { 0, "", 0, "" }, GIT_DELTA_UNMODIFIED }, - { { 0100644, "43aafd43bea779ec74317dc361f45ae3f532a505", 0, "dir-6" }, GIT_DELTA_ADDED }, - GIT_MERGE_DIFF_NONE, - }, - - { - { { 0100644, "cf8c5cc8a85a1ff5a4ba51e0bc7cf5665669924d", 0, "dir-6/file.txt" }, GIT_DELTA_UNMODIFIED }, - { { 0100644, "cf8c5cc8a85a1ff5a4ba51e0bc7cf5665669924d", 0, "dir-6/file.txt" }, GIT_DELTA_UNMODIFIED }, - { { 0, "", 0, "" }, GIT_DELTA_DELETED }, - GIT_MERGE_DIFF_NONE, - }, - - { - { { 0, "", 0, "" }, GIT_DELTA_UNMODIFIED }, - { { 0, "", 0, "" }, GIT_DELTA_UNMODIFIED }, - { { 0100644, "a031a28ae70e33a641ce4b8a8f6317f1ab79dee4", 0, "dir-7" }, GIT_DELTA_ADDED }, - GIT_MERGE_DIFF_DIRECTORY_FILE, - }, - - { - { { 0100644, "5012fd565b1393bdfda1805d4ec38ce6619e1fd1", 0, "dir-7/file.txt" }, GIT_DELTA_UNMODIFIED }, - { { 0100644, "a5563304ddf6caba25cb50323a2ea6f7dbfcadca", 0, "dir-7/file.txt" }, GIT_DELTA_MODIFIED }, - { { 0, "", 0, "" }, GIT_DELTA_DELETED }, - GIT_MERGE_DIFF_DF_CHILD, - }, - - { - { { 0, "", 0, "" }, GIT_DELTA_UNMODIFIED }, - { { 0100644, "e9ad6ec3e38364a3d07feda7c4197d4d845c53b5", 0, "dir-8" }, GIT_DELTA_ADDED }, - { {0, "", 0, "" }, GIT_DELTA_UNMODIFIED }, - GIT_MERGE_DIFF_NONE, - }, - - { - { { 0100644, "f20c9063fa0bda9a397c96947a7b687305c49753", 0, "dir-8/file.txt" }, GIT_DELTA_UNMODIFIED }, - { { 0, "", 0, "" }, GIT_DELTA_DELETED }, - { { 0100644, "f20c9063fa0bda9a397c96947a7b687305c49753", 0, "dir-8/file.txt" }, GIT_DELTA_UNMODIFIED }, - GIT_MERGE_DIFF_NONE, - }, - - { - { { 0, "", 0, "" }, GIT_DELTA_UNMODIFIED }, - { { 0100644, "3ef4d30382ca33fdeba9fda895a99e0891ba37aa", 0, "dir-9" }, GIT_DELTA_ADDED }, - { { 0, "", 0, "" }, GIT_DELTA_UNMODIFIED }, - GIT_MERGE_DIFF_DIRECTORY_FILE, - }, - - { - { { 0100644, "fc4c636d6515e9e261f9260dbcf3cc6eca97ea08", 0, "dir-9/file.txt" }, GIT_DELTA_UNMODIFIED }, - { { 0, "", 0, "" }, GIT_DELTA_DELETED }, - { { 0100644, "76ab0e2868197ec158ddd6c78d8a0d2fd73d38f9", 0, "dir-9/file.txt" }, GIT_DELTA_MODIFIED }, - GIT_MERGE_DIFF_DF_CHILD, - }, - - { - { { 0100644, "1e4ff029aee68d0d69ef9eb6efa6cbf1ec732f99", 0, "file-1" }, GIT_DELTA_UNMODIFIED }, - { { 0100644, "1e4ff029aee68d0d69ef9eb6efa6cbf1ec732f99", 0, "file-1" }, GIT_DELTA_UNMODIFIED }, - { { 0, "", 0, "" }, GIT_DELTA_DELETED }, - GIT_MERGE_DIFF_NONE, - }, - - { - { { 0, "", 0, "" }, GIT_DELTA_UNMODIFIED }, - { { 0, "", 0, "" }, GIT_DELTA_UNMODIFIED }, - { { 0100644, "5c2411f8075f48a6b2fdb85ebc0d371747c4df15", 0, "file-1/new" }, GIT_DELTA_ADDED }, - GIT_MERGE_DIFF_NONE, - }, - - { - { { 0100644, "a39a620dae5bc8b4e771cd4d251b7d080401a21e", 0, "file-2" }, GIT_DELTA_UNMODIFIED }, - { { 0100644, "d963979c237d08b6ba39062ee7bf64c7d34a27f8", 0, "file-2" }, GIT_DELTA_MODIFIED }, - { { 0, "", 0, "" }, GIT_DELTA_DELETED }, - GIT_MERGE_DIFF_DIRECTORY_FILE, - }, - - { - { { 0, "", 0, "" }, GIT_DELTA_UNMODIFIED }, - { { 0, "", 0, "" }, GIT_DELTA_UNMODIFIED }, - { { 0100644, "5c341ead2ba6f2af98ce5ec3fe84f6b6d2899c0d", 0, "file-2/new" }, GIT_DELTA_ADDED }, - GIT_MERGE_DIFF_DF_CHILD, - }, - - { - { { 0100644, "032ebc5ab85d9553bb187d3cd40875ff23a63ed0", 0, "file-3" }, GIT_DELTA_UNMODIFIED }, - { { 0, "", 0, "" }, GIT_DELTA_DELETED }, - { { 0100644, "032ebc5ab85d9553bb187d3cd40875ff23a63ed0", 0, "file-3" }, GIT_DELTA_UNMODIFIED }, - GIT_MERGE_DIFF_NONE, - }, - - { - { { 0, "", 0, "" }, GIT_DELTA_UNMODIFIED }, - { { 0100644, "9efe7723802d4305142eee177e018fee1572c4f4", 0, "file-3/new" }, GIT_DELTA_ADDED }, - { { 0, "", 0, "" }, GIT_DELTA_UNMODIFIED }, - GIT_MERGE_DIFF_NONE, - }, - - { - { { 0100644, "bacac9b3493509aa15e1730e1545fc0919d1dae0", 0, "file-4" }, GIT_DELTA_UNMODIFIED }, - { { 0, "", 0, "" }, GIT_DELTA_DELETED }, - { { 0100644, "7663fce0130db092936b137cabd693ec234eb060", 0, "file-4" }, GIT_DELTA_MODIFIED }, - GIT_MERGE_DIFF_DIRECTORY_FILE, - }, - - { - { { 0, "", 0, "" }, GIT_DELTA_UNMODIFIED }, - { { 0100644, "e49f917b448d1340b31d76e54ba388268fd4c922", 0, "file-4/new" }, GIT_DELTA_ADDED }, - { { 0, "", 0, "" }, GIT_DELTA_UNMODIFIED }, - GIT_MERGE_DIFF_DF_CHILD, - }, - - { - { { 0100644, "ac4045f965119e6998f4340ed0f411decfb3ec05", 0, "file-5" }, GIT_DELTA_UNMODIFIED }, - { { 0, "", 0, "" }, GIT_DELTA_DELETED }, - { { 0, "", 0, "" }, GIT_DELTA_DELETED }, - GIT_MERGE_DIFF_BOTH_DELETED, - }, - - { - { { 0, "", 0, "" }, GIT_DELTA_UNMODIFIED }, - { { 0100644, "cab2cf23998b40f1af2d9d9a756dc9e285a8df4b", 0, "file-5/new" }, GIT_DELTA_ADDED }, - { { 0100644, "f5504f36e6f4eb797a56fc5bac6c6c7f32969bf2", 0, "file-5/new" }, GIT_DELTA_ADDED }, - GIT_MERGE_DIFF_BOTH_ADDED, - }, - }; - - test_find_differences(TREE_OID_DF_ANCESTOR, TREE_OID_DF_SIDE1, TREE_OID_DF_SIDE2, treediff_conflict_data, 20); -} - -void test_merge_trees_treediff__strict_renames(void) -{ - struct merge_index_conflict_data treediff_conflict_data[] = { - { - { { 0, "", 0, "" }, GIT_DELTA_UNMODIFIED }, - { { 0100644, "233c0919c998ed110a4b6ff36f353aec8b713487", 0, "added-in-master.txt" }, GIT_DELTA_ADDED }, - { { 0, "", 0, "" }, GIT_DELTA_UNMODIFIED }, - GIT_MERGE_DIFF_NONE, - }, - - { - { { 0100644, "6212c31dab5e482247d7977e4f0dd3601decf13b", 0, "automergeable.txt" }, GIT_DELTA_UNMODIFIED }, - { { 0100644, "ee3fa1b8c00aff7fe02065fdb50864bb0d932ccf", 0, "automergeable.txt" }, GIT_DELTA_MODIFIED }, - { { 0100644, "6212c31dab5e482247d7977e4f0dd3601decf13b", 0, "automergeable.txt" }, GIT_DELTA_UNMODIFIED }, - GIT_MERGE_DIFF_NONE, - }, - - { - { { 0100644, "ab6c44a2e84492ad4b41bb6bac87353e9d02ac8b", 0, "changed-in-master.txt" }, GIT_DELTA_UNMODIFIED }, - { { 0100644, "11deab00b2d3a6f5a3073988ac050c2d7b6655e2", 0, "changed-in-master.txt" }, GIT_DELTA_MODIFIED }, - { { 0100644, "ab6c44a2e84492ad4b41bb6bac87353e9d02ac8b", 0, "changed-in-master.txt" }, GIT_DELTA_UNMODIFIED }, - GIT_MERGE_DIFF_NONE, - }, - - { - { { 0100644, "d427e0b2e138501a3d15cc376077a3631e15bd46", 0, "conflicting.txt" }, GIT_DELTA_UNMODIFIED }, - { { 0100644, "4e886e602529caa9ab11d71f86634bd1b6e0de10", 0, "conflicting.txt" }, GIT_DELTA_MODIFIED }, - { { 0100644, "d427e0b2e138501a3d15cc376077a3631e15bd46", 0, "conflicting.txt" }, GIT_DELTA_UNMODIFIED }, - GIT_MERGE_DIFF_NONE, - }, - - { - { { 0100644, "dfe3f22baa1f6fce5447901c3086bae368de6bdd", 0, "removed-in-branch.txt" }, GIT_DELTA_UNMODIFIED }, - { { 0100644, "dfe3f22baa1f6fce5447901c3086bae368de6bdd", 0, "removed-in-branch.txt" }, GIT_DELTA_UNMODIFIED }, - { { 0100644, "dfe3f22baa1f6fce5447901c3086bae368de6bdd", 0, "renamed-in-branch.txt" }, GIT_DELTA_RENAMED }, - GIT_MERGE_DIFF_NONE, - }, - - { - { { 0100644, "5c3b68a71fc4fa5d362fd3875e53137c6a5ab7a5", 0, "removed-in-master.txt" }, GIT_DELTA_UNMODIFIED }, - { { 0, "", 0, "" }, GIT_DELTA_DELETED }, - { { 0100644, "5c3b68a71fc4fa5d362fd3875e53137c6a5ab7a5", 0, "removed-in-master.txt" }, GIT_DELTA_UNMODIFIED }, - GIT_MERGE_DIFF_NONE, - }, - - { - { { 0, "", 0, "" }, GIT_DELTA_UNMODIFIED }, - { { 0, "", 0, "" }, GIT_DELTA_UNMODIFIED }, - { { 0100644, "c8f06f2e3bb2964174677e91f0abead0e43c9e5d", 0, "renamed.txt" }, GIT_DELTA_ADDED }, - GIT_MERGE_DIFF_NONE, - }, - - { - { { 0100644, "c8f06f2e3bb2964174677e91f0abead0e43c9e5d", 0, "unchanged.txt" }, GIT_DELTA_UNMODIFIED }, - { { 0100644, "c8f06f2e3bb2964174677e91f0abead0e43c9e5d", 0, "unchanged.txt" }, GIT_DELTA_UNMODIFIED }, - { { 0100644, "c8f06f2e3bb2964174677e91f0abead0e43c9e5d", 0, "copied.txt" }, GIT_DELTA_RENAMED }, - GIT_MERGE_DIFF_NONE, - }, - }; - - test_find_differences(TREE_OID_ANCESTOR, TREE_OID_MASTER, TREE_OID_RENAMES1, treediff_conflict_data, 8); -} - -void test_merge_trees_treediff__rename_conflicts(void) -{ - struct merge_index_conflict_data treediff_conflict_data[] = { - { - { { 0, "", 0, "" }, GIT_DELTA_UNMODIFIED }, - { { 0100644, "f0ce2b8e4986084d9b308fb72709e414c23eb5e6", 0, "0b-duplicated-in-ours.txt" }, GIT_DELTA_ADDED }, - { { 0, "", 0, "" }, GIT_DELTA_UNMODIFIED }, - GIT_MERGE_DIFF_NONE, - }, - - { - { { 0100644, "f0ce2b8e4986084d9b308fb72709e414c23eb5e6", 0, "0b-rewritten-in-ours.txt" }, GIT_DELTA_UNMODIFIED }, - { { 0100644, "e376fbdd06ebf021c92724da9f26f44212734e3e", 0, "0b-rewritten-in-ours.txt" }, GIT_DELTA_MODIFIED }, - { { 0100644, "b2d399ae15224e1d58066e3c8df70ce37de7a656", 0, "0b-rewritten-in-ours.txt" }, GIT_DELTA_MODIFIED }, - GIT_MERGE_DIFF_BOTH_MODIFIED, - }, - - { - { { 0, "", 0, "" }, GIT_DELTA_UNMODIFIED }, - { { 0, "", 0, "" }, GIT_DELTA_UNMODIFIED }, - { { 0100644, "2f56120107d680129a5d9791b521cb1e73a2ed31", 0, "0c-duplicated-in-theirs.txt" }, GIT_DELTA_ADDED }, - GIT_MERGE_DIFF_NONE, - }, - - { - { { 0100644, "2f56120107d680129a5d9791b521cb1e73a2ed31", 0, "0c-rewritten-in-theirs.txt" }, GIT_DELTA_UNMODIFIED }, - { { 0100644, "efc9121fdedaf08ba180b53ebfbcf71bd488ed09", 0, "0c-rewritten-in-theirs.txt" }, GIT_DELTA_MODIFIED }, - { { 0100644, "712ebba6669ea847d9829e4f1059d6c830c8b531", 0, "0c-rewritten-in-theirs.txt" }, GIT_DELTA_MODIFIED }, - GIT_MERGE_DIFF_BOTH_MODIFIED, - }, - - { - { { 0100644, "c3d02eeef75183df7584d8d13ac03053910c1301", 0, "1a-renamed-in-ours-edited-in-theirs.txt" }, GIT_DELTA_UNMODIFIED }, - { { 0100644, "c3d02eeef75183df7584d8d13ac03053910c1301", 0, "1a-newname-in-ours-edited-in-theirs.txt" }, GIT_DELTA_RENAMED }, - { { 0100644, "0d872f8e871a30208305978ecbf9e66d864f1638", 0, "1a-renamed-in-ours-edited-in-theirs.txt" }, GIT_DELTA_MODIFIED }, - GIT_MERGE_DIFF_RENAMED_MODIFIED, - }, - - { - { { 0100644, "d0d4594e16f2e19107e3fa7ea63e7aaaff305ffb", 0, "1a-renamed-in-ours.txt" }, GIT_DELTA_UNMODIFIED }, - { { 0100644, "d0d4594e16f2e19107e3fa7ea63e7aaaff305ffb", 0, "1a-newname-in-ours.txt" }, GIT_DELTA_RENAMED }, - { { 0100644, "d0d4594e16f2e19107e3fa7ea63e7aaaff305ffb", 0, "1a-renamed-in-ours.txt" }, GIT_DELTA_UNMODIFIED }, - GIT_MERGE_DIFF_NONE, - }, - - { - { { 0100644, "241a1005cd9b980732741b74385b891142bcba28", 0, "1b-renamed-in-theirs-edited-in-ours.txt" }, GIT_DELTA_UNMODIFIED }, - { { 0100644, "ed9523e62e453e50dd9be1606af19399b96e397a", 0, "1b-renamed-in-theirs-edited-in-ours.txt" }, GIT_DELTA_MODIFIED }, - { { 0100644, "241a1005cd9b980732741b74385b891142bcba28", 0, "1b-newname-in-theirs-edited-in-ours.txt" }, GIT_DELTA_RENAMED }, - GIT_MERGE_DIFF_RENAMED_MODIFIED, - }, - - { - { { 0100644, "2b5f1f181ee3b58ea751f5dd5d8f9b445520a136", 0, "1b-renamed-in-theirs.txt" }, GIT_DELTA_UNMODIFIED }, - { { 0100644, "2b5f1f181ee3b58ea751f5dd5d8f9b445520a136", 0, "1b-renamed-in-theirs.txt" }, GIT_DELTA_UNMODIFIED }, - { { 0100644, "2b5f1f181ee3b58ea751f5dd5d8f9b445520a136", 0, "1b-newname-in-theirs.txt" }, GIT_DELTA_RENAMED }, - GIT_MERGE_DIFF_NONE, - }, - - { - { { 0100644, "178940b450f238a56c0d75b7955cb57b38191982", 0, "2-renamed-in-both.txt" }, GIT_DELTA_UNMODIFIED }, - { { 0100644, "178940b450f238a56c0d75b7955cb57b38191982", 0, "2-newname-in-both.txt" }, GIT_DELTA_RENAMED }, - { { 0100644, "178940b450f238a56c0d75b7955cb57b38191982", 0, "2-newname-in-both.txt" }, GIT_DELTA_RENAMED }, - GIT_MERGE_DIFF_BOTH_RENAMED, - }, - - { - { { 0100644, "18cb316b1cefa0f8a6946f0e201a8e1a6f845ab9", 0, "3a-renamed-in-ours-deleted-in-theirs.txt" }, GIT_DELTA_UNMODIFIED }, - { { 0100644, "18cb316b1cefa0f8a6946f0e201a8e1a6f845ab9", 0, "3a-newname-in-ours-deleted-in-theirs.txt" }, GIT_DELTA_RENAMED }, - { { 0, "", 0, "" }, GIT_DELTA_DELETED }, - GIT_MERGE_DIFF_RENAMED_DELETED, - }, - - { - { { 0100644, "36219b49367146cb2e6a1555b5a9ebd4d0328495", 0, "3b-renamed-in-theirs-deleted-in-ours.txt" }, GIT_DELTA_UNMODIFIED }, - { { 0, "", 0, "" }, GIT_DELTA_DELETED }, - { { 0100644, "36219b49367146cb2e6a1555b5a9ebd4d0328495", 0, "3b-newname-in-theirs-deleted-in-ours.txt" }, GIT_DELTA_RENAMED }, - GIT_MERGE_DIFF_RENAMED_DELETED, - }, - - { - { { 0, "", 0, "" }, GIT_DELTA_UNMODIFIED }, - { { 0, "", 0, "" }, GIT_DELTA_UNMODIFIED }, - { { 0100644, "8b5b53cb2aa9ceb1139f5312fcfa3cc3c5a47c9a", 0, "4a-newname-in-ours-added-in-theirs.txt" }, GIT_DELTA_ADDED }, - GIT_MERGE_DIFF_RENAMED_ADDED, - }, - - { - { { 0100644, "227792b52aaa0b238bea00ec7e509b02623f168c", 0, "4a-renamed-in-ours-added-in-theirs.txt" }, GIT_DELTA_UNMODIFIED }, - { { 0100644, "227792b52aaa0b238bea00ec7e509b02623f168c", 0, "4a-newname-in-ours-added-in-theirs.txt" }, GIT_DELTA_RENAMED }, - { { 0, "", 0, "" }, GIT_DELTA_DELETED }, - GIT_MERGE_DIFF_RENAMED_ADDED, - }, - - { - { { 0, "", 0, "" }, GIT_DELTA_UNMODIFIED }, - { { 0100644, "de872ee3618b894992e9d1e18ba2ebe256a112f9", 0, "4b-newname-in-theirs-added-in-ours.txt" }, GIT_DELTA_ADDED }, - { { 0, "", 0, "" }, GIT_DELTA_UNMODIFIED }, - GIT_MERGE_DIFF_RENAMED_ADDED, - }, - - { - { { 0100644, "98d52d07c0b0bbf2b46548f6aa521295c2cb55db", 0, "4b-renamed-in-theirs-added-in-ours.txt" }, GIT_DELTA_UNMODIFIED }, - { { 0, "", 0, "" }, GIT_DELTA_DELETED }, - { { 0100644, "98d52d07c0b0bbf2b46548f6aa521295c2cb55db", 0, "4b-newname-in-theirs-added-in-ours.txt" }, GIT_DELTA_RENAMED }, - GIT_MERGE_DIFF_RENAMED_ADDED, - }, - - { - { { 0100644, "d8fa77b6833082c1ea36b7828a582d4c43882450", 0, "5-both-renamed-1-to-2.txt" }, GIT_DELTA_UNMODIFIED }, - { { 0100644, "d8fa77b6833082c1ea36b7828a582d4c43882450", 0, "5-both-renamed-1-to-2-ours.txt" }, GIT_DELTA_RENAMED }, - { { 0100644, "d8fa77b6833082c1ea36b7828a582d4c43882450", 0, "5-both-renamed-1-to-2-theirs.txt" }, GIT_DELTA_RENAMED }, - GIT_MERGE_DIFF_BOTH_RENAMED_1_TO_2, - }, - - { - { { 0100644, "b42712cfe99a1a500b2a51fe984e0b8a7702ba11", 0, "6-both-renamed-side-1.txt" }, GIT_DELTA_UNMODIFIED }, - { { 0100644, "b42712cfe99a1a500b2a51fe984e0b8a7702ba11", 0, "6-both-renamed.txt" }, GIT_DELTA_RENAMED }, - { { 0100644, "b42712cfe99a1a500b2a51fe984e0b8a7702ba11", 0, "6-both-renamed-side-1.txt" }, GIT_DELTA_UNMODIFIED }, - GIT_MERGE_DIFF_BOTH_RENAMED_2_TO_1, - }, - - { - { { 0100644, "b69fe837e4cecfd4c9a40cdca7c138468687df07", 0, "6-both-renamed-side-2.txt" }, GIT_DELTA_UNMODIFIED }, - { { 0100644, "b69fe837e4cecfd4c9a40cdca7c138468687df07", 0, "6-both-renamed-side-2.txt" }, GIT_DELTA_UNMODIFIED }, - { { 0100644, "b69fe837e4cecfd4c9a40cdca7c138468687df07", 0, "6-both-renamed.txt" }, GIT_DELTA_RENAMED }, - GIT_MERGE_DIFF_BOTH_RENAMED_2_TO_1, - }, - }; - test_find_differences(TREE_OID_RENAME_CONFLICT_ANCESTOR, - TREE_OID_RENAME_CONFLICT_OURS, TREE_OID_RENAME_CONFLICT_THEIRS, treediff_conflict_data, 18); -} - -void test_merge_trees_treediff__best_renames(void) -{ - struct merge_index_conflict_data treediff_conflict_data[] = { - { - { { 0, "", 0, "" }, GIT_DELTA_UNMODIFIED }, - { { 0100644, "233c0919c998ed110a4b6ff36f353aec8b713487", 0, "added-in-master.txt" }, GIT_DELTA_ADDED }, - { { 0, "", 0, "" }, GIT_DELTA_UNMODIFIED }, - GIT_MERGE_DIFF_NONE, - }, - - { - { { 0100644, "6212c31dab5e482247d7977e4f0dd3601decf13b", 0, "automergeable.txt" }, GIT_DELTA_UNMODIFIED }, - { { 0100644, "ee3fa1b8c00aff7fe02065fdb50864bb0d932ccf", 0, "automergeable.txt" }, GIT_DELTA_MODIFIED }, - { { 0100644, "45299c1ca5e07bba1fd90843056fb559f96b1f5a", 0, "renamed-90.txt" }, GIT_DELTA_RENAMED }, - GIT_MERGE_DIFF_RENAMED_MODIFIED, - }, - - { - { { 0100644, "ab6c44a2e84492ad4b41bb6bac87353e9d02ac8b", 0, "changed-in-master.txt" }, GIT_DELTA_UNMODIFIED }, - { { 0100644, "11deab00b2d3a6f5a3073988ac050c2d7b6655e2", 0, "changed-in-master.txt" }, GIT_DELTA_MODIFIED }, - { { 0100644, "ab6c44a2e84492ad4b41bb6bac87353e9d02ac8b", 0, "changed-in-master.txt" }, GIT_DELTA_UNMODIFIED }, - GIT_MERGE_DIFF_NONE, - }, - - { - { { 0100644, "d427e0b2e138501a3d15cc376077a3631e15bd46", 0, "conflicting.txt" }, GIT_DELTA_UNMODIFIED }, - { { 0100644, "4e886e602529caa9ab11d71f86634bd1b6e0de10", 0, "conflicting.txt" }, GIT_DELTA_MODIFIED }, - { { 0100644, "d427e0b2e138501a3d15cc376077a3631e15bd46", 0, "conflicting.txt" }, GIT_DELTA_UNMODIFIED }, - GIT_MERGE_DIFF_NONE, - }, - - { - { { 0100644, "5c3b68a71fc4fa5d362fd3875e53137c6a5ab7a5", 0, "removed-in-master.txt" },GIT_DELTA_UNMODIFIED }, - { { 0, "", 0, "" }, GIT_DELTA_DELETED }, - { { 0100644, "5c3b68a71fc4fa5d362fd3875e53137c6a5ab7a5", 0, "removed-in-master.txt" }, GIT_DELTA_UNMODIFIED }, - GIT_MERGE_DIFF_MODIFIED_DELETED, - }, - - { - { { 0, "", 0, "" }, GIT_DELTA_UNMODIFIED }, - { { 0, "", 0, "" }, GIT_DELTA_UNMODIFIED }, - { { 0100644, "5843febcb23480df0b5edb22a21c59c772bb8e29", 0, "renamed-50.txt" }, GIT_DELTA_ADDED }, - GIT_MERGE_DIFF_NONE, - }, - - { - { { 0, "", 0, "" }, GIT_DELTA_UNMODIFIED }, - { { 0, "", 0, "" }, GIT_DELTA_UNMODIFIED }, - { { 0100644, "a77a56a49f8f3ae242e02717f18ebbc60c5cc543", 0, "renamed-75.txt" }, GIT_DELTA_ADDED }, - GIT_MERGE_DIFF_NONE, - }, - }; - - test_find_differences(TREE_OID_ANCESTOR, TREE_OID_MASTER, TREE_OID_RENAMES2, treediff_conflict_data, 7); -} diff --git a/vendor/libgit2/tests/merge/trees/trivial.c b/vendor/libgit2/tests/merge/trees/trivial.c deleted file mode 100644 index 2262edda6a..0000000000 --- a/vendor/libgit2/tests/merge/trees/trivial.c +++ /dev/null @@ -1,306 +0,0 @@ -#include "clar_libgit2.h" -#include "git2/repository.h" -#include "git2/merge.h" -#include "merge.h" -#include "../merge_helpers.h" -#include "refs.h" -#include "fileops.h" -#include "git2/sys/index.h" - -static git_repository *repo; - -#define TEST_REPO_PATH "merge-resolve" -#define TEST_INDEX_PATH TEST_REPO_PATH "/.git/index" - - -// Fixture setup and teardown -void test_merge_trees_trivial__initialize(void) -{ - repo = cl_git_sandbox_init(TEST_REPO_PATH); -} - -void test_merge_trees_trivial__cleanup(void) -{ - cl_git_sandbox_cleanup(); -} - - -static int merge_trivial(git_index **index, const char *ours, const char *theirs) -{ - git_commit *our_commit, *their_commit, *ancestor_commit; - git_tree *our_tree, *their_tree, *ancestor_tree; - git_oid our_oid, their_oid, ancestor_oid; - git_buf branch_buf = GIT_BUF_INIT; - git_merge_options opts = GIT_MERGE_OPTIONS_INIT; - - git_buf_printf(&branch_buf, "%s%s", GIT_REFS_HEADS_DIR, ours); - cl_git_pass(git_reference_name_to_id(&our_oid, repo, branch_buf.ptr)); - cl_git_pass(git_commit_lookup(&our_commit, repo, &our_oid)); - - git_buf_clear(&branch_buf); - git_buf_printf(&branch_buf, "%s%s", GIT_REFS_HEADS_DIR, theirs); - cl_git_pass(git_reference_name_to_id(&their_oid, repo, branch_buf.ptr)); - cl_git_pass(git_commit_lookup(&their_commit, repo, &their_oid)); - - cl_git_pass(git_merge_base(&ancestor_oid, repo, git_commit_id(our_commit), git_commit_id(their_commit))); - cl_git_pass(git_commit_lookup(&ancestor_commit, repo, &ancestor_oid)); - - cl_git_pass(git_commit_tree(&ancestor_tree, ancestor_commit)); - cl_git_pass(git_commit_tree(&our_tree, our_commit)); - cl_git_pass(git_commit_tree(&their_tree, their_commit)); - - cl_git_pass(git_merge_trees(index, repo, ancestor_tree, our_tree, their_tree, &opts)); - - git_buf_free(&branch_buf); - git_tree_free(our_tree); - git_tree_free(their_tree); - git_tree_free(ancestor_tree); - git_commit_free(our_commit); - git_commit_free(their_commit); - git_commit_free(ancestor_commit); - - return 0; -} - -static int merge_trivial_conflict_entrycount(git_index *index) -{ - const git_index_entry *entry; - int count = 0; - size_t i; - - for (i = 0; i < git_index_entrycount(index); i++) { - cl_assert(entry = git_index_get_byindex(index, i)); - - if (git_index_entry_is_conflict(entry)) - count++; - } - - return count; -} - -/* 2ALT: ancest:(empty)+, head:*empty*, remote:remote = result:remote */ -void test_merge_trees_trivial__2alt(void) -{ - git_index *result; - const git_index_entry *entry; - - cl_git_pass(merge_trivial(&result, "trivial-2alt", "trivial-2alt-branch")); - - cl_assert(entry = git_index_get_bypath(result, "new-in-branch.txt", 0)); - cl_assert(git_index_reuc_entrycount(result) == 0); - cl_assert(merge_trivial_conflict_entrycount(result) == 0); - - git_index_free(result); -} - -/* 3ALT: ancest:(empty)+, head:head, remote:*empty* = result:head */ -void test_merge_trees_trivial__3alt(void) -{ - git_index *result; - const git_index_entry *entry; - - cl_git_pass(merge_trivial(&result, "trivial-3alt", "trivial-3alt-branch")); - - cl_assert(entry = git_index_get_bypath(result, "new-in-3alt.txt", 0)); - cl_assert(git_index_reuc_entrycount(result) == 0); - cl_assert(merge_trivial_conflict_entrycount(result) == 0); - - git_index_free(result); -} - -/* 4: ancest:(empty)^, head:head, remote:remote = result:no merge */ -void test_merge_trees_trivial__4(void) -{ - git_index *result; - const git_index_entry *entry; - - cl_git_pass(merge_trivial(&result, "trivial-4", "trivial-4-branch")); - - cl_assert((entry = git_index_get_bypath(result, "new-and-different.txt", 0)) == NULL); - cl_assert(git_index_reuc_entrycount(result) == 0); - - cl_assert(merge_trivial_conflict_entrycount(result) == 2); - cl_assert(entry = git_index_get_bypath(result, "new-and-different.txt", 2)); - cl_assert(entry = git_index_get_bypath(result, "new-and-different.txt", 3)); - - git_index_free(result); -} - -/* 5ALT: ancest:*, head:head, remote:head = result:head */ -void test_merge_trees_trivial__5alt_1(void) -{ - git_index *result; - const git_index_entry *entry; - - cl_git_pass(merge_trivial(&result, "trivial-5alt-1", "trivial-5alt-1-branch")); - - cl_assert(entry = git_index_get_bypath(result, "new-and-same.txt", 0)); - cl_assert(git_index_reuc_entrycount(result) == 0); - cl_assert(merge_trivial_conflict_entrycount(result) == 0); - - git_index_free(result); -} - -/* 5ALT: ancest:*, head:head, remote:head = result:head */ -void test_merge_trees_trivial__5alt_2(void) -{ - git_index *result; - const git_index_entry *entry; - - cl_git_pass(merge_trivial(&result, "trivial-5alt-2", "trivial-5alt-2-branch")); - - cl_assert(entry = git_index_get_bypath(result, "modified-to-same.txt", 0)); - cl_assert(git_index_reuc_entrycount(result) == 0); - cl_assert(merge_trivial_conflict_entrycount(result) == 0); - - git_index_free(result); -} - -/* 6: ancest:ancest+, head:(empty), remote:(empty) = result:no merge */ -void test_merge_trees_trivial__6(void) -{ - git_index *result; - const git_index_entry *entry; - const git_index_reuc_entry *reuc; - - cl_git_pass(merge_trivial(&result, "trivial-6", "trivial-6-branch")); - - cl_assert((entry = git_index_get_bypath(result, "removed-in-both.txt", 0)) == NULL); - cl_assert(git_index_reuc_entrycount(result) == 1); - cl_assert(reuc = git_index_reuc_get_bypath(result, "removed-in-both.txt")); - - cl_assert(merge_trivial_conflict_entrycount(result) == 0); - - git_index_free(result); -} - -/* 8: ancest:ancest^, head:(empty), remote:ancest = result:no merge */ -void test_merge_trees_trivial__8(void) -{ - git_index *result; - const git_index_entry *entry; - const git_index_reuc_entry *reuc; - - cl_git_pass(merge_trivial(&result, "trivial-8", "trivial-8-branch")); - - cl_assert((entry = git_index_get_bypath(result, "removed-in-8.txt", 0)) == NULL); - - cl_assert(git_index_reuc_entrycount(result) == 1); - cl_assert(reuc = git_index_reuc_get_bypath(result, "removed-in-8.txt")); - - cl_assert(merge_trivial_conflict_entrycount(result) == 0); - - git_index_free(result); -} - -/* 7: ancest:ancest+, head:(empty), remote:remote = result:no merge */ -void test_merge_trees_trivial__7(void) -{ - git_index *result; - const git_index_entry *entry; - - cl_git_pass(merge_trivial(&result, "trivial-7", "trivial-7-branch")); - - cl_assert((entry = git_index_get_bypath(result, "removed-in-7.txt", 0)) == NULL); - cl_assert(git_index_reuc_entrycount(result) == 0); - - cl_assert(merge_trivial_conflict_entrycount(result) == 2); - cl_assert(entry = git_index_get_bypath(result, "removed-in-7.txt", 1)); - cl_assert(entry = git_index_get_bypath(result, "removed-in-7.txt", 3)); - - git_index_free(result); -} - -/* 10: ancest:ancest^, head:ancest, remote:(empty) = result:no merge */ -void test_merge_trees_trivial__10(void) -{ - git_index *result; - const git_index_entry *entry; - const git_index_reuc_entry *reuc; - - cl_git_pass(merge_trivial(&result, "trivial-10", "trivial-10-branch")); - - cl_assert((entry = git_index_get_bypath(result, "removed-in-10-branch.txt", 0)) == NULL); - - cl_assert(git_index_reuc_entrycount(result) == 1); - cl_assert(reuc = git_index_reuc_get_bypath(result, "removed-in-10-branch.txt")); - - cl_assert(merge_trivial_conflict_entrycount(result) == 0); - - git_index_free(result); -} - -/* 9: ancest:ancest+, head:head, remote:(empty) = result:no merge */ -void test_merge_trees_trivial__9(void) -{ - git_index *result; - const git_index_entry *entry; - - cl_git_pass(merge_trivial(&result, "trivial-9", "trivial-9-branch")); - - cl_assert((entry = git_index_get_bypath(result, "removed-in-9-branch.txt", 0)) == NULL); - cl_assert(git_index_reuc_entrycount(result) == 0); - - cl_assert(merge_trivial_conflict_entrycount(result) == 2); - cl_assert(entry = git_index_get_bypath(result, "removed-in-9-branch.txt", 1)); - cl_assert(entry = git_index_get_bypath(result, "removed-in-9-branch.txt", 2)); - - git_index_free(result); -} - -/* 13: ancest:ancest+, head:head, remote:ancest = result:head */ -void test_merge_trees_trivial__13(void) -{ - git_index *result; - const git_index_entry *entry; - git_oid expected_oid; - - cl_git_pass(merge_trivial(&result, "trivial-13", "trivial-13-branch")); - - cl_assert(entry = git_index_get_bypath(result, "modified-in-13.txt", 0)); - cl_git_pass(git_oid_fromstr(&expected_oid, "1cff9ec6a47a537380dedfdd17c9e76d74259a2b")); - cl_assert_equal_oid(&expected_oid, &entry->id); - - cl_assert(git_index_reuc_entrycount(result) == 0); - cl_assert(merge_trivial_conflict_entrycount(result) == 0); - - git_index_free(result); -} - -/* 14: ancest:ancest+, head:ancest, remote:remote = result:remote */ -void test_merge_trees_trivial__14(void) -{ - git_index *result; - const git_index_entry *entry; - git_oid expected_oid; - - cl_git_pass(merge_trivial(&result, "trivial-14", "trivial-14-branch")); - - cl_assert(entry = git_index_get_bypath(result, "modified-in-14-branch.txt", 0)); - cl_git_pass(git_oid_fromstr(&expected_oid, "26153a3ff3649b6c2bb652d3f06878c6e0a172f9")); - cl_assert(git_oid_cmp(&entry->id, &expected_oid) == 0); - - cl_assert(git_index_reuc_entrycount(result) == 0); - cl_assert(merge_trivial_conflict_entrycount(result) == 0); - - git_index_free(result); -} - -/* 11: ancest:ancest+, head:head, remote:remote = result:no merge */ -void test_merge_trees_trivial__11(void) -{ - git_index *result; - const git_index_entry *entry; - - cl_git_pass(merge_trivial(&result, "trivial-11", "trivial-11-branch")); - - cl_assert((entry = git_index_get_bypath(result, "modified-in-both.txt", 0)) == NULL); - cl_assert(git_index_reuc_entrycount(result) == 0); - - cl_assert(merge_trivial_conflict_entrycount(result) == 3); - cl_assert(entry = git_index_get_bypath(result, "modified-in-both.txt", 1)); - cl_assert(entry = git_index_get_bypath(result, "modified-in-both.txt", 2)); - cl_assert(entry = git_index_get_bypath(result, "modified-in-both.txt", 3)); - - git_index_free(result); -} diff --git a/vendor/libgit2/tests/merge/trees/whitespace.c b/vendor/libgit2/tests/merge/trees/whitespace.c deleted file mode 100644 index b99583cb33..0000000000 --- a/vendor/libgit2/tests/merge/trees/whitespace.c +++ /dev/null @@ -1,82 +0,0 @@ -#include "clar_libgit2.h" -#include "git2/repository.h" -#include "git2/merge.h" -#include "buffer.h" -#include "merge.h" -#include "../merge_helpers.h" -#include "fileops.h" - -static git_repository *repo; - -#define TEST_REPO_PATH "merge-whitespace" - -#define BRANCH_A_EOL "branch_a_eol" -#define BRANCH_B_EOL "branch_b_eol" - -#define BRANCH_A_CHANGE "branch_a_change" -#define BRANCH_B_CHANGE "branch_b_change" - -// Fixture setup and teardown -void test_merge_trees_whitespace__initialize(void) -{ - repo = cl_git_sandbox_init(TEST_REPO_PATH); -} - -void test_merge_trees_whitespace__cleanup(void) -{ - cl_git_sandbox_cleanup(); -} - -void test_merge_trees_whitespace__conflict(void) -{ - git_index *index; - git_merge_options opts = GIT_MERGE_OPTIONS_INIT; - - struct merge_index_entry merge_index_entries[] = { - { 0100644, "4026a6c83f39c56881c9ac62e7582db9e3d33a4f", 1, "test.txt" }, - { 0100644, "c3b1fb31424c98072542cc8e42b48c92e52f494a", 2, "test.txt" }, - { 0100644, "262f67de0de2e535a59ae1bc3c739601e98c354d", 3, "test.txt" }, - }; - - cl_git_pass(merge_trees_from_branches(&index, repo, BRANCH_A_EOL, BRANCH_B_EOL, &opts)); - - cl_assert(merge_test_index(index, merge_index_entries, 3)); - - git_index_free(index); -} - -void test_merge_trees_whitespace__eol(void) -{ - git_index *index; - git_merge_options opts = GIT_MERGE_OPTIONS_INIT; - - struct merge_index_entry merge_index_entries[] = { - { 0100644, "ee3c2aac8e03224c323b58ecb1f9eef616745467", 0, "test.txt" }, - }; - - opts.file_flags |= GIT_MERGE_FILE_IGNORE_WHITESPACE_EOL; - - cl_git_pass(merge_trees_from_branches(&index, repo, BRANCH_A_EOL, BRANCH_B_EOL, &opts)); - - cl_assert(merge_test_index(index, merge_index_entries, 1)); - - git_index_free(index); -} - -void test_merge_trees_whitespace__change(void) -{ - git_index *index; - git_merge_options opts = GIT_MERGE_OPTIONS_INIT; - - struct merge_index_entry merge_index_entries[] = { - { 0100644, "a827eab4fd66ab37a6ebcfaa7b7e341abfd55947", 0, "test.txt" }, - }; - - opts.file_flags |= GIT_MERGE_FILE_IGNORE_WHITESPACE_CHANGE; - - cl_git_pass(merge_trees_from_branches(&index, repo, BRANCH_A_CHANGE, BRANCH_B_CHANGE, &opts)); - - cl_assert(merge_test_index(index, merge_index_entries, 1)); - - git_index_free(index); -} diff --git a/vendor/libgit2/tests/merge/workdir/analysis.c b/vendor/libgit2/tests/merge/workdir/analysis.c deleted file mode 100644 index 351cfbdd55..0000000000 --- a/vendor/libgit2/tests/merge/workdir/analysis.c +++ /dev/null @@ -1,141 +0,0 @@ -#include "clar_libgit2.h" -#include "git2/repository.h" -#include "git2/merge.h" -#include "git2/annotated_commit.h" -#include "git2/sys/index.h" -#include "merge.h" -#include "../merge_helpers.h" -#include "refs.h" -#include "posix.h" - -static git_repository *repo; -static git_index *repo_index; - -#define TEST_REPO_PATH "merge-resolve" -#define TEST_INDEX_PATH TEST_REPO_PATH "/.git/index" - -#define UPTODATE_BRANCH "master" -#define PREVIOUS_BRANCH "previous" - -#define FASTFORWARD_BRANCH "ff_branch" -#define FASTFORWARD_ID "fd89f8cffb663ac89095a0f9764902e93ceaca6a" - -#define NOFASTFORWARD_BRANCH "branch" -#define NOFASTFORWARD_ID "7cb63eed597130ba4abb87b3e544b85021905520" - - -// Fixture setup and teardown -void test_merge_workdir_analysis__initialize(void) -{ - repo = cl_git_sandbox_init(TEST_REPO_PATH); - git_repository_index(&repo_index, repo); -} - -void test_merge_workdir_analysis__cleanup(void) -{ - git_index_free(repo_index); - cl_git_sandbox_cleanup(); -} - -static void analysis_from_branch( - git_merge_analysis_t *merge_analysis, - git_merge_preference_t *merge_pref, - const char *branchname) -{ - git_buf refname = GIT_BUF_INIT; - git_reference *their_ref; - git_annotated_commit *their_head; - - git_buf_printf(&refname, "%s%s", GIT_REFS_HEADS_DIR, branchname); - - cl_git_pass(git_reference_lookup(&their_ref, repo, git_buf_cstr(&refname))); - cl_git_pass(git_annotated_commit_from_ref(&their_head, repo, their_ref)); - - cl_git_pass(git_merge_analysis(merge_analysis, merge_pref, repo, (const git_annotated_commit **)&their_head, 1)); - - git_buf_free(&refname); - git_annotated_commit_free(their_head); - git_reference_free(their_ref); -} - -void test_merge_workdir_analysis__fastforward(void) -{ - git_merge_analysis_t merge_analysis; - git_merge_preference_t merge_pref; - - analysis_from_branch(&merge_analysis, &merge_pref, FASTFORWARD_BRANCH); - cl_assert_equal_i(GIT_MERGE_ANALYSIS_FASTFORWARD, (merge_analysis & GIT_MERGE_ANALYSIS_FASTFORWARD)); - cl_assert_equal_i(GIT_MERGE_ANALYSIS_NORMAL, (merge_analysis & GIT_MERGE_ANALYSIS_NORMAL)); -} - -void test_merge_workdir_analysis__no_fastforward(void) -{ - git_merge_analysis_t merge_analysis; - git_merge_preference_t merge_pref; - - analysis_from_branch(&merge_analysis, &merge_pref, NOFASTFORWARD_BRANCH); - cl_assert_equal_i(GIT_MERGE_ANALYSIS_NORMAL, merge_analysis); -} - -void test_merge_workdir_analysis__uptodate(void) -{ - git_merge_analysis_t merge_analysis; - git_merge_preference_t merge_pref; - - analysis_from_branch(&merge_analysis, &merge_pref, UPTODATE_BRANCH); - cl_assert_equal_i(GIT_MERGE_ANALYSIS_UP_TO_DATE, merge_analysis); -} - -void test_merge_workdir_analysis__uptodate_merging_prev_commit(void) -{ - git_merge_analysis_t merge_analysis; - git_merge_preference_t merge_pref; - - analysis_from_branch(&merge_analysis, &merge_pref, PREVIOUS_BRANCH); - cl_assert_equal_i(GIT_MERGE_ANALYSIS_UP_TO_DATE, merge_analysis); -} - -void test_merge_workdir_analysis__unborn(void) -{ - git_merge_analysis_t merge_analysis; - git_merge_preference_t merge_pref; - git_buf master = GIT_BUF_INIT; - - git_buf_joinpath(&master, git_repository_path(repo), "refs/heads/master"); - p_unlink(git_buf_cstr(&master)); - - analysis_from_branch(&merge_analysis, &merge_pref, NOFASTFORWARD_BRANCH); - cl_assert_equal_i(GIT_MERGE_ANALYSIS_FASTFORWARD, (merge_analysis & GIT_MERGE_ANALYSIS_FASTFORWARD)); - cl_assert_equal_i(GIT_MERGE_ANALYSIS_UNBORN, (merge_analysis & GIT_MERGE_ANALYSIS_UNBORN)); - - git_buf_free(&master); -} - -void test_merge_workdir_analysis__fastforward_with_config_noff(void) -{ - git_config *config; - git_merge_analysis_t merge_analysis; - git_merge_preference_t merge_pref; - - git_repository_config(&config, repo); - git_config_set_string(config, "merge.ff", "false"); - - analysis_from_branch(&merge_analysis, &merge_pref, FASTFORWARD_BRANCH); - cl_assert_equal_i(GIT_MERGE_ANALYSIS_FASTFORWARD, (merge_analysis & GIT_MERGE_ANALYSIS_FASTFORWARD)); - cl_assert_equal_i(GIT_MERGE_ANALYSIS_NORMAL, (merge_analysis & GIT_MERGE_ANALYSIS_NORMAL)); - cl_assert_equal_i(GIT_MERGE_PREFERENCE_NO_FASTFORWARD, (merge_pref & GIT_MERGE_PREFERENCE_NO_FASTFORWARD)); -} - -void test_merge_workdir_analysis__no_fastforward_with_config_ffonly(void) -{ - git_config *config; - git_merge_analysis_t merge_analysis; - git_merge_preference_t merge_pref; - - git_repository_config(&config, repo); - git_config_set_string(config, "merge.ff", "only"); - - analysis_from_branch(&merge_analysis, &merge_pref, NOFASTFORWARD_BRANCH); - cl_assert_equal_i(GIT_MERGE_ANALYSIS_NORMAL, (merge_analysis & GIT_MERGE_ANALYSIS_NORMAL)); - cl_assert_equal_i(GIT_MERGE_PREFERENCE_FASTFORWARD_ONLY, (merge_pref & GIT_MERGE_PREFERENCE_FASTFORWARD_ONLY)); -} diff --git a/vendor/libgit2/tests/merge/workdir/dirty.c b/vendor/libgit2/tests/merge/workdir/dirty.c deleted file mode 100644 index 4bf984c231..0000000000 --- a/vendor/libgit2/tests/merge/workdir/dirty.c +++ /dev/null @@ -1,347 +0,0 @@ -#include "clar_libgit2.h" -#include "git2/merge.h" -#include "buffer.h" -#include "merge.h" -#include "index.h" -#include "../merge_helpers.h" -#include "posix.h" - -#define TEST_REPO_PATH "merge-resolve" -#define MERGE_BRANCH_OID "7cb63eed597130ba4abb87b3e544b85021905520" - -#define AUTOMERGEABLE_MERGED_FILE \ - "this file is changed in master\n" \ - "this file is automergeable\n" \ - "this file is automergeable\n" \ - "this file is automergeable\n" \ - "this file is automergeable\n" \ - "this file is automergeable\n" \ - "this file is automergeable\n" \ - "this file is automergeable\n" \ - "this file is changed in branch\n" - -#define CHANGED_IN_BRANCH_FILE \ - "changed in branch\n" - -static git_repository *repo; -static git_index *repo_index; - -static char *unaffected[][4] = { - { "added-in-master.txt", NULL }, - { "changed-in-master.txt", NULL }, - { "unchanged.txt", NULL }, - { "added-in-master.txt", "changed-in-master.txt", NULL }, - { "added-in-master.txt", "unchanged.txt", NULL }, - { "changed-in-master.txt", "unchanged.txt", NULL }, - { "added-in-master.txt", "changed-in-master.txt", "unchanged.txt", NULL }, - { "new_file.txt", NULL }, - { "new_file.txt", "unchanged.txt", NULL }, - { NULL }, -}; - -static char *affected[][5] = { - { "automergeable.txt", NULL }, - { "changed-in-branch.txt", NULL }, - { "conflicting.txt", NULL }, - { "removed-in-branch.txt", NULL }, - { "automergeable.txt", "changed-in-branch.txt", NULL }, - { "automergeable.txt", "conflicting.txt", NULL }, - { "automergeable.txt", "removed-in-branch.txt", NULL }, - { "changed-in-branch.txt", "conflicting.txt", NULL }, - { "changed-in-branch.txt", "removed-in-branch.txt", NULL }, - { "conflicting.txt", "removed-in-branch.txt", NULL }, - { "automergeable.txt", "changed-in-branch.txt", "conflicting.txt", NULL }, - { "automergeable.txt", "changed-in-branch.txt", "removed-in-branch.txt", NULL }, - { "automergeable.txt", "conflicting.txt", "removed-in-branch.txt", NULL }, - { "changed-in-branch.txt", "conflicting.txt", "removed-in-branch.txt", NULL }, - { "automergeable.txt", "changed-in-branch.txt", "conflicting.txt", "removed-in-branch.txt", NULL }, - { NULL }, -}; - -static char *result_contents[4][6] = { - { "automergeable.txt", AUTOMERGEABLE_MERGED_FILE, NULL, NULL }, - { "changed-in-branch.txt", CHANGED_IN_BRANCH_FILE, NULL, NULL }, - { "automergeable.txt", AUTOMERGEABLE_MERGED_FILE, "changed-in-branch.txt", CHANGED_IN_BRANCH_FILE, NULL, NULL }, - { NULL } -}; - -void test_merge_workdir_dirty__initialize(void) -{ - repo = cl_git_sandbox_init(TEST_REPO_PATH); - git_repository_index(&repo_index, repo); -} - -void test_merge_workdir_dirty__cleanup(void) -{ - git_index_free(repo_index); - cl_git_sandbox_cleanup(); -} - -static void set_core_autocrlf_to(git_repository *repo, bool value) -{ - git_config *cfg; - - cl_git_pass(git_repository_config(&cfg, repo)); - cl_git_pass(git_config_set_bool(cfg, "core.autocrlf", value)); - - git_config_free(cfg); -} - -static int merge_branch(void) -{ - git_oid their_oids[1]; - git_annotated_commit *their_head; - git_merge_options merge_opts = GIT_MERGE_OPTIONS_INIT; - git_checkout_options checkout_opts = GIT_CHECKOUT_OPTIONS_INIT; - int error; - - cl_git_pass(git_oid_fromstr(&their_oids[0], MERGE_BRANCH_OID)); - cl_git_pass(git_annotated_commit_lookup(&their_head, repo, &their_oids[0])); - - checkout_opts.checkout_strategy = GIT_CHECKOUT_SAFE; - error = git_merge(repo, (const git_annotated_commit **)&their_head, 1, &merge_opts, &checkout_opts); - - git_annotated_commit_free(their_head); - - return error; -} - -static void write_files(char *files[]) -{ - char *filename; - git_buf path = GIT_BUF_INIT, content = GIT_BUF_INIT; - size_t i; - - for (i = 0, filename = files[i]; filename; filename = files[++i]) { - git_buf_clear(&path); - git_buf_clear(&content); - - git_buf_printf(&path, "%s/%s", TEST_REPO_PATH, filename); - git_buf_printf(&content, "This is a dirty file in the working directory!\n\n" - "It will not be staged! Its filename is %s.\n", filename); - - cl_git_mkfile(path.ptr, content.ptr); - } - - git_buf_free(&path); - git_buf_free(&content); -} - -static void hack_index(char *files[]) -{ - char *filename; - struct stat statbuf; - git_buf path = GIT_BUF_INIT; - git_index_entry *entry; - struct timeval times[2]; - time_t now; - size_t i; - - /* Update the index to suggest that checkout placed these files on - * disk, keeping the object id but updating the cache, which will - * emulate a Git implementation's different filter. - * - * We set the file's timestamp to before now to pretend that - * it was an old checkout so we don't trigger the racy - * protections would would check the content. - */ - - now = time(NULL); - times[0].tv_sec = now - 5; - times[0].tv_usec = 0; - times[1].tv_sec = now - 5; - times[1].tv_usec = 0; - - for (i = 0, filename = files[i]; filename; filename = files[++i]) { - git_buf_clear(&path); - - cl_assert(entry = (git_index_entry *) - git_index_get_bypath(repo_index, filename, 0)); - - cl_git_pass(git_buf_printf(&path, "%s/%s", TEST_REPO_PATH, filename)); - cl_git_pass(p_utimes(path.ptr, times)); - cl_git_pass(p_stat(path.ptr, &statbuf)); - - entry->ctime.seconds = (git_time_t)statbuf.st_ctime; - entry->ctime.nanoseconds = 0; - entry->mtime.seconds = (git_time_t)statbuf.st_mtime; - entry->mtime.nanoseconds = 0; - entry->dev = statbuf.st_dev; - entry->ino = statbuf.st_ino; - entry->uid = statbuf.st_uid; - entry->gid = statbuf.st_gid; - entry->file_size = statbuf.st_size; - } - - git_buf_free(&path); -} - -static void stage_random_files(char *files[]) -{ - char *filename; - size_t i; - - write_files(files); - - for (i = 0, filename = files[i]; filename; filename = files[++i]) - cl_git_pass(git_index_add_bypath(repo_index, filename)); -} - -static void stage_content(char *content[]) -{ - git_reference *head; - git_object *head_object; - git_buf path = GIT_BUF_INIT; - char *filename, *text; - size_t i; - - cl_git_pass(git_repository_head(&head, repo)); - cl_git_pass(git_reference_peel(&head_object, head, GIT_OBJ_COMMIT)); - cl_git_pass(git_reset(repo, head_object, GIT_RESET_HARD, NULL)); - - for (i = 0, filename = content[i], text = content[++i]; - filename && text; - filename = content[++i], text = content[++i]) { - - git_buf_clear(&path); - - cl_git_pass(git_buf_printf(&path, "%s/%s", TEST_REPO_PATH, filename)); - - cl_git_mkfile(path.ptr, text); - cl_git_pass(git_index_add_bypath(repo_index, filename)); - } - - git_object_free(head_object); - git_reference_free(head); - git_buf_free(&path); -} - -static int merge_dirty_files(char *dirty_files[]) -{ - git_reference *head; - git_object *head_object; - int error; - - cl_git_pass(git_repository_head(&head, repo)); - cl_git_pass(git_reference_peel(&head_object, head, GIT_OBJ_COMMIT)); - cl_git_pass(git_reset(repo, head_object, GIT_RESET_HARD, NULL)); - - write_files(dirty_files); - - error = merge_branch(); - - git_object_free(head_object); - git_reference_free(head); - - return error; -} - -static int merge_differently_filtered_files(char *files[]) -{ - git_reference *head; - git_object *head_object; - int error; - - cl_git_pass(git_repository_head(&head, repo)); - cl_git_pass(git_reference_peel(&head_object, head, GIT_OBJ_COMMIT)); - cl_git_pass(git_reset(repo, head_object, GIT_RESET_HARD, NULL)); - - /* Emulate checkout with a broken or misconfigured filter: modify some - * files on-disk and then update the index with the updated file size - * and time, as if some filter applied them. These files should not be - * treated as dirty since we created them. - * - * (Make sure to update the index stamp to defeat racy-git protections - * trying to sanity check the files in the index; those would rehash the - * files, showing them as dirty, the exact mechanism we're trying to avoid.) - */ - - write_files(files); - hack_index(files); - - cl_git_pass(git_index_write(repo_index)); - - error = merge_branch(); - - git_object_free(head_object); - git_reference_free(head); - - return error; -} - -static int merge_staged_files(char *staged_files[]) -{ - stage_random_files(staged_files); - return merge_branch(); -} - -void test_merge_workdir_dirty__unaffected_dirty_files_allowed(void) -{ - char **files; - size_t i; - - for (i = 0, files = unaffected[i]; files[0]; files = unaffected[++i]) - cl_git_pass(merge_dirty_files(files)); -} - -void test_merge_workdir_dirty__unstaged_deletes_maintained(void) -{ - git_reference *head; - git_object *head_object; - - cl_git_pass(git_repository_head(&head, repo)); - cl_git_pass(git_reference_peel(&head_object, head, GIT_OBJ_COMMIT)); - cl_git_pass(git_reset(repo, head_object, GIT_RESET_HARD, NULL)); - - cl_git_pass(p_unlink("merge-resolve/unchanged.txt")); - - cl_git_pass(merge_branch()); - - git_object_free(head_object); - git_reference_free(head); -} - -void test_merge_workdir_dirty__affected_dirty_files_disallowed(void) -{ - char **files; - size_t i; - - for (i = 0, files = affected[i]; files[0]; files = affected[++i]) - cl_git_fail(merge_dirty_files(files)); -} - -void test_merge_workdir_dirty__staged_files_in_index_disallowed(void) -{ - char **files; - size_t i; - - for (i = 0, files = unaffected[i]; files[0]; files = unaffected[++i]) - cl_git_fail(merge_staged_files(files)); - - for (i = 0, files = affected[i]; files[0]; files = affected[++i]) - cl_git_fail(merge_staged_files(files)); -} - -void test_merge_workdir_dirty__identical_staged_files_allowed(void) -{ - char **content; - size_t i; - - set_core_autocrlf_to(repo, false); - - for (i = 0, content = result_contents[i]; content[0]; content = result_contents[++i]) { - stage_content(content); - - git_index_write(repo_index); - cl_git_pass(merge_branch()); - } -} - -void test_merge_workdir_dirty__honors_cache(void) -{ - char **files; - size_t i; - - for (i = 0, files = affected[i]; files[0]; files = affected[++i]) - cl_git_pass(merge_differently_filtered_files(files)); -} diff --git a/vendor/libgit2/tests/merge/workdir/renames.c b/vendor/libgit2/tests/merge/workdir/renames.c deleted file mode 100644 index 83006a7039..0000000000 --- a/vendor/libgit2/tests/merge/workdir/renames.c +++ /dev/null @@ -1,156 +0,0 @@ -#include "clar_libgit2.h" -#include "git2/repository.h" -#include "git2/merge.h" -#include "buffer.h" -#include "merge.h" -#include "../merge_helpers.h" -#include "fileops.h" -#include "refs.h" - -static git_repository *repo; - -#define TEST_REPO_PATH "merge-resolve" - -#define BRANCH_RENAME_OURS "rename_conflict_ours" -#define BRANCH_RENAME_THEIRS "rename_conflict_theirs" - -// Fixture setup and teardown -void test_merge_workdir_renames__initialize(void) -{ - git_config *cfg; - - repo = cl_git_sandbox_init(TEST_REPO_PATH); - - /* Ensure that the user's merge.conflictstyle doesn't interfere */ - cl_git_pass(git_repository_config(&cfg, repo)); - cl_git_pass(git_config_set_string(cfg, "merge.conflictstyle", "merge")); - git_config_free(cfg); -} - -void test_merge_workdir_renames__cleanup(void) -{ - cl_git_sandbox_cleanup(); -} - -void test_merge_workdir_renames__renames(void) -{ - git_merge_options merge_opts = GIT_MERGE_OPTIONS_INIT; - - struct merge_index_entry merge_index_entries[] = { - { 0100644, "68c6c84b091926c7d90aa6a79b2bc3bb6adccd8e", 0, "0a-no-change.txt" }, - { 0100644, "f0ce2b8e4986084d9b308fb72709e414c23eb5e6", 0, "0b-duplicated-in-ours.txt" }, - { 0100644, "8aac75de2a34b4d340bf62a6e58197269cb55797", 0, "0b-rewritten-in-ours.txt" }, - { 0100644, "2f56120107d680129a5d9791b521cb1e73a2ed31", 0, "0c-duplicated-in-theirs.txt" }, - { 0100644, "7edc726325da726751a4195e434e4377b0f67f9a", 0, "0c-rewritten-in-theirs.txt" }, - { 0100644, "0d872f8e871a30208305978ecbf9e66d864f1638", 0, "1a-newname-in-ours-edited-in-theirs.txt" }, - { 0100644, "d0d4594e16f2e19107e3fa7ea63e7aaaff305ffb", 0, "1a-newname-in-ours.txt" }, - { 0100644, "ed9523e62e453e50dd9be1606af19399b96e397a", 0, "1b-newname-in-theirs-edited-in-ours.txt" }, - { 0100644, "2b5f1f181ee3b58ea751f5dd5d8f9b445520a136", 0, "1b-newname-in-theirs.txt" }, - { 0100644, "178940b450f238a56c0d75b7955cb57b38191982", 0, "2-newname-in-both.txt" }, - { 0100644, "18cb316b1cefa0f8a6946f0e201a8e1a6f845ab9", 0, "3a-newname-in-ours-deleted-in-theirs.txt" }, - { 0100644, "36219b49367146cb2e6a1555b5a9ebd4d0328495", 0, "3b-newname-in-theirs-deleted-in-ours.txt" }, - { 0100644, "227792b52aaa0b238bea00ec7e509b02623f168c", 0, "4a-newname-in-ours-added-in-theirs.txt~HEAD" }, - { 0100644, "8b5b53cb2aa9ceb1139f5312fcfa3cc3c5a47c9a", 0, "4a-newname-in-ours-added-in-theirs.txt~rename_conflict_theirs" }, - { 0100644, "de872ee3618b894992e9d1e18ba2ebe256a112f9", 0, "4b-newname-in-theirs-added-in-ours.txt~HEAD" }, - { 0100644, "98d52d07c0b0bbf2b46548f6aa521295c2cb55db", 0, "4b-newname-in-theirs-added-in-ours.txt~rename_conflict_theirs" }, - { 0100644, "d3719a5ae8e4d92276b5313ce976f6ee5af2b436", 0, "5a-newname-in-ours-added-in-theirs.txt~HEAD" }, - { 0100644, "98ba4205fcf31f5dd93c916d35fe3f3b3d0e6714", 0, "5a-newname-in-ours-added-in-theirs.txt~rename_conflict_theirs" }, - { 0100644, "385c8a0f26ddf79e9041e15e17dc352ed2c4cced", 0, "5b-newname-in-theirs-added-in-ours.txt~HEAD" }, - { 0100644, "63247125386de9ec90a27ad36169307bf8a11a38", 0, "5b-newname-in-theirs-added-in-ours.txt~rename_conflict_theirs" }, - { 0100644, "d8fa77b6833082c1ea36b7828a582d4c43882450", 0, "6-both-renamed-1-to-2-ours.txt" }, - { 0100644, "d8fa77b6833082c1ea36b7828a582d4c43882450", 0, "6-both-renamed-1-to-2-theirs.txt" }, - { 0100644, "b42712cfe99a1a500b2a51fe984e0b8a7702ba11", 0, "7-both-renamed.txt~HEAD" }, - { 0100644, "b69fe837e4cecfd4c9a40cdca7c138468687df07", 0, "7-both-renamed.txt~rename_conflict_theirs" }, - }; - - merge_opts.tree_flags |= GIT_MERGE_TREE_FIND_RENAMES; - merge_opts.rename_threshold = 50; - - cl_git_pass(merge_branches(repo, GIT_REFS_HEADS_DIR BRANCH_RENAME_OURS, GIT_REFS_HEADS_DIR BRANCH_RENAME_THEIRS, &merge_opts, NULL)); - cl_assert(merge_test_workdir(repo, merge_index_entries, 24)); -} - -void test_merge_workdir_renames__ours(void) -{ - git_index *index; - git_merge_options merge_opts = GIT_MERGE_OPTIONS_INIT; - git_checkout_options checkout_opts = GIT_CHECKOUT_OPTIONS_INIT; - - struct merge_index_entry merge_index_entries[] = { - { 0100644, "68c6c84b091926c7d90aa6a79b2bc3bb6adccd8e", 0, "0a-no-change.txt" }, - { 0100644, "f0ce2b8e4986084d9b308fb72709e414c23eb5e6", 0, "0b-duplicated-in-ours.txt" }, - { 0100644, "e376fbdd06ebf021c92724da9f26f44212734e3e", 0, "0b-rewritten-in-ours.txt" }, - { 0100644, "2f56120107d680129a5d9791b521cb1e73a2ed31", 0, "0c-duplicated-in-theirs.txt" }, - { 0100644, "efc9121fdedaf08ba180b53ebfbcf71bd488ed09", 0, "0c-rewritten-in-theirs.txt" }, - { 0100644, "0d872f8e871a30208305978ecbf9e66d864f1638", 0, "1a-newname-in-ours-edited-in-theirs.txt" }, - { 0100644, "d0d4594e16f2e19107e3fa7ea63e7aaaff305ffb", 0, "1a-newname-in-ours.txt" }, - { 0100644, "ed9523e62e453e50dd9be1606af19399b96e397a", 0, "1b-newname-in-theirs-edited-in-ours.txt" }, - { 0100644, "2b5f1f181ee3b58ea751f5dd5d8f9b445520a136", 0, "1b-newname-in-theirs.txt" }, - { 0100644, "178940b450f238a56c0d75b7955cb57b38191982", 0, "2-newname-in-both.txt" }, - { 0100644, "18cb316b1cefa0f8a6946f0e201a8e1a6f845ab9", 0, "3a-newname-in-ours-deleted-in-theirs.txt" }, - { 0100644, "36219b49367146cb2e6a1555b5a9ebd4d0328495", 0, "3b-newname-in-theirs-deleted-in-ours.txt" }, - { 0100644, "227792b52aaa0b238bea00ec7e509b02623f168c", 0, "4a-newname-in-ours-added-in-theirs.txt" }, - { 0100644, "de872ee3618b894992e9d1e18ba2ebe256a112f9", 0, "4b-newname-in-theirs-added-in-ours.txt" }, - { 0100644, "d3719a5ae8e4d92276b5313ce976f6ee5af2b436", 0, "5a-newname-in-ours-added-in-theirs.txt" }, - { 0100644, "385c8a0f26ddf79e9041e15e17dc352ed2c4cced", 0, "5b-newname-in-theirs-added-in-ours.txt" }, - { 0100644, "63247125386de9ec90a27ad36169307bf8a11a38", 0, "5b-renamed-in-theirs-added-in-ours.txt" }, - { 0100644, "d8fa77b6833082c1ea36b7828a582d4c43882450", 0, "6-both-renamed-1-to-2-ours.txt" }, - { 0100644, "b69fe837e4cecfd4c9a40cdca7c138468687df07", 0, "7-both-renamed-side-2.txt" }, - { 0100644, "b42712cfe99a1a500b2a51fe984e0b8a7702ba11", 0, "7-both-renamed.txt" }, - }; - - merge_opts.tree_flags |= GIT_MERGE_TREE_FIND_RENAMES; - merge_opts.rename_threshold = 50; - checkout_opts.checkout_strategy = GIT_CHECKOUT_SAFE | GIT_CHECKOUT_USE_OURS; - - cl_git_pass(merge_branches(repo, GIT_REFS_HEADS_DIR BRANCH_RENAME_OURS, GIT_REFS_HEADS_DIR BRANCH_RENAME_THEIRS, &merge_opts, &checkout_opts)); - cl_git_pass(git_repository_index(&index, repo)); - cl_git_pass(git_index_write(index)); - cl_assert(merge_test_workdir(repo, merge_index_entries, 20)); - - git_index_free(index); -} - -void test_merge_workdir_renames__similar(void) -{ - git_merge_options merge_opts = GIT_MERGE_OPTIONS_INIT; - - /* - * Note: this differs slightly from the core git merge result - there, 4a is - * tracked as a rename/delete instead of a rename/add and the theirs side - * is not placed in workdir in any form. - */ - struct merge_index_entry merge_index_entries[] = { - { 0100644, "68c6c84b091926c7d90aa6a79b2bc3bb6adccd8e", 0, "0a-no-change.txt" }, - { 0100644, "f0ce2b8e4986084d9b308fb72709e414c23eb5e6", 0, "0b-duplicated-in-ours.txt" }, - { 0100644, "8aac75de2a34b4d340bf62a6e58197269cb55797", 0, "0b-rewritten-in-ours.txt" }, - { 0100644, "2f56120107d680129a5d9791b521cb1e73a2ed31", 0, "0c-duplicated-in-theirs.txt" }, - { 0100644, "7edc726325da726751a4195e434e4377b0f67f9a", 0, "0c-rewritten-in-theirs.txt" }, - { 0100644, "0d872f8e871a30208305978ecbf9e66d864f1638", 0, "1a-newname-in-ours-edited-in-theirs.txt" }, - { 0100644, "d0d4594e16f2e19107e3fa7ea63e7aaaff305ffb", 0, "1a-newname-in-ours.txt" }, - { 0100644, "ed9523e62e453e50dd9be1606af19399b96e397a", 0, "1b-newname-in-theirs-edited-in-ours.txt" }, - { 0100644, "2b5f1f181ee3b58ea751f5dd5d8f9b445520a136", 0, "1b-newname-in-theirs.txt" }, - { 0100644, "178940b450f238a56c0d75b7955cb57b38191982", 0, "2-newname-in-both.txt" }, - { 0100644, "18cb316b1cefa0f8a6946f0e201a8e1a6f845ab9", 0, "3a-newname-in-ours-deleted-in-theirs.txt" }, - { 0100644, "36219b49367146cb2e6a1555b5a9ebd4d0328495", 0, "3b-newname-in-theirs-deleted-in-ours.txt" }, - { 0100644, "227792b52aaa0b238bea00ec7e509b02623f168c", 0, "4a-newname-in-ours-added-in-theirs.txt~HEAD" }, - { 0100644, "8b5b53cb2aa9ceb1139f5312fcfa3cc3c5a47c9a", 0, "4a-newname-in-ours-added-in-theirs.txt~rename_conflict_theirs" }, - { 0100644, "de872ee3618b894992e9d1e18ba2ebe256a112f9", 0, "4b-newname-in-theirs-added-in-ours.txt~HEAD" }, - { 0100644, "98d52d07c0b0bbf2b46548f6aa521295c2cb55db", 0, "4b-newname-in-theirs-added-in-ours.txt~rename_conflict_theirs" }, - { 0100644, "d3719a5ae8e4d92276b5313ce976f6ee5af2b436", 0, "5a-newname-in-ours-added-in-theirs.txt~HEAD" }, - { 0100644, "98ba4205fcf31f5dd93c916d35fe3f3b3d0e6714", 0, "5a-newname-in-ours-added-in-theirs.txt~rename_conflict_theirs" }, - { 0100644, "385c8a0f26ddf79e9041e15e17dc352ed2c4cced", 0, "5b-newname-in-theirs-added-in-ours.txt~HEAD" }, - { 0100644, "63247125386de9ec90a27ad36169307bf8a11a38", 0, "5b-newname-in-theirs-added-in-ours.txt~rename_conflict_theirs" }, - { 0100644, "d8fa77b6833082c1ea36b7828a582d4c43882450", 0, "6-both-renamed-1-to-2-ours.txt" }, - { 0100644, "d8fa77b6833082c1ea36b7828a582d4c43882450", 0, "6-both-renamed-1-to-2-theirs.txt" }, - { 0100644, "b42712cfe99a1a500b2a51fe984e0b8a7702ba11", 0, "7-both-renamed.txt~HEAD" }, - { 0100644, "b69fe837e4cecfd4c9a40cdca7c138468687df07", 0, "7-both-renamed.txt~rename_conflict_theirs" }, - }; - - merge_opts.tree_flags |= GIT_MERGE_TREE_FIND_RENAMES; - merge_opts.rename_threshold = 50; - - cl_git_pass(merge_branches(repo, GIT_REFS_HEADS_DIR BRANCH_RENAME_OURS, GIT_REFS_HEADS_DIR BRANCH_RENAME_THEIRS, &merge_opts, NULL)); - cl_assert(merge_test_workdir(repo, merge_index_entries, 24)); -} - diff --git a/vendor/libgit2/tests/merge/workdir/setup.c b/vendor/libgit2/tests/merge/workdir/setup.c deleted file mode 100644 index 4aebf87013..0000000000 --- a/vendor/libgit2/tests/merge/workdir/setup.c +++ /dev/null @@ -1,1096 +0,0 @@ -#include "clar_libgit2.h" -#include "git2/repository.h" -#include "git2/merge.h" -#include "merge.h" -#include "refs.h" -#include "fileops.h" - -static git_repository *repo; -static git_index *repo_index; - -#define TEST_REPO_PATH "merge-resolve" -#define TEST_INDEX_PATH TEST_REPO_PATH "/.git/index" - -#define ORIG_HEAD "bd593285fc7fe4ca18ccdbabf027f5d689101452" - -#define THEIRS_SIMPLE_BRANCH "branch" -#define THEIRS_SIMPLE_OID "7cb63eed597130ba4abb87b3e544b85021905520" - -#define OCTO1_BRANCH "octo1" -#define OCTO1_OID "16f825815cfd20a07a75c71554e82d8eede0b061" - -#define OCTO2_BRANCH "octo2" -#define OCTO2_OID "158dc7bedb202f5b26502bf3574faa7f4238d56c" - -#define OCTO3_BRANCH "octo3" -#define OCTO3_OID "50ce7d7d01217679e26c55939eef119e0c93e272" - -#define OCTO4_BRANCH "octo4" -#define OCTO4_OID "54269b3f6ec3d7d4ede24dd350dd5d605495c3ae" - -#define OCTO5_BRANCH "octo5" -#define OCTO5_OID "e4f618a2c3ed0669308735727df5ebf2447f022f" - -// Fixture setup and teardown -void test_merge_workdir_setup__initialize(void) -{ - repo = cl_git_sandbox_init(TEST_REPO_PATH); - git_repository_index(&repo_index, repo); -} - -void test_merge_workdir_setup__cleanup(void) -{ - git_index_free(repo_index); - cl_git_sandbox_cleanup(); -} - -static bool test_file_contents(const char *filename, const char *expected) -{ - git_buf file_path_buf = GIT_BUF_INIT, file_buf = GIT_BUF_INIT; - bool equals; - - git_buf_printf(&file_path_buf, "%s/%s", git_repository_path(repo), filename); - - cl_git_pass(git_futils_readbuffer(&file_buf, file_path_buf.ptr)); - equals = (strcmp(file_buf.ptr, expected) == 0); - - git_buf_free(&file_path_buf); - git_buf_free(&file_buf); - - return equals; -} - -static void write_file_contents(const char *filename, const char *output) -{ - git_buf file_path_buf = GIT_BUF_INIT; - - git_buf_printf(&file_path_buf, "%s/%s", git_repository_path(repo), - filename); - cl_git_rewritefile(file_path_buf.ptr, output); - - git_buf_free(&file_path_buf); -} - -/* git merge --no-ff octo1 */ -void test_merge_workdir_setup__one_branch(void) -{ - git_oid our_oid; - git_reference *octo1_ref; - git_annotated_commit *our_head, *their_heads[1]; - - cl_git_pass(git_oid_fromstr(&our_oid, ORIG_HEAD)); - cl_git_pass(git_annotated_commit_lookup(&our_head, repo, &our_oid)); - - cl_git_pass(git_reference_lookup(&octo1_ref, repo, GIT_REFS_HEADS_DIR OCTO1_BRANCH)); - cl_git_pass(git_annotated_commit_from_ref(&their_heads[0], repo, octo1_ref)); - - cl_git_pass(git_merge__setup(repo, our_head, (const git_annotated_commit **)their_heads, 1)); - - cl_assert(test_file_contents(GIT_MERGE_HEAD_FILE, OCTO1_OID "\n")); - cl_assert(test_file_contents(GIT_ORIG_HEAD_FILE, ORIG_HEAD "\n")); - cl_assert(test_file_contents(GIT_MERGE_MODE_FILE, "no-ff")); - cl_assert(test_file_contents(GIT_MERGE_MSG_FILE, "Merge branch '" OCTO1_BRANCH "'\n")); - - git_reference_free(octo1_ref); - - git_annotated_commit_free(our_head); - git_annotated_commit_free(their_heads[0]); -} - -/* git merge --no-ff 16f825815cfd20a07a75c71554e82d8eede0b061 */ -void test_merge_workdir_setup__one_oid(void) -{ - git_oid our_oid; - git_oid octo1_oid; - git_annotated_commit *our_head, *their_heads[1]; - - cl_git_pass(git_oid_fromstr(&our_oid, ORIG_HEAD)); - cl_git_pass(git_annotated_commit_lookup(&our_head, repo, &our_oid)); - - cl_git_pass(git_oid_fromstr(&octo1_oid, OCTO1_OID)); - cl_git_pass(git_annotated_commit_lookup(&their_heads[0], repo, &octo1_oid)); - - cl_git_pass(git_merge__setup(repo, our_head, (const git_annotated_commit **)their_heads, 1)); - - cl_assert(test_file_contents(GIT_MERGE_HEAD_FILE, OCTO1_OID "\n")); - cl_assert(test_file_contents(GIT_ORIG_HEAD_FILE, ORIG_HEAD "\n")); - cl_assert(test_file_contents(GIT_MERGE_MODE_FILE, "no-ff")); - cl_assert(test_file_contents(GIT_MERGE_MSG_FILE, "Merge commit '" OCTO1_OID "'\n")); - - git_annotated_commit_free(our_head); - git_annotated_commit_free(their_heads[0]); -} - -/* git merge octo1 octo2 */ -void test_merge_workdir_setup__two_branches(void) -{ - git_oid our_oid; - git_reference *octo1_ref; - git_reference *octo2_ref; - git_annotated_commit *our_head, *their_heads[2]; - - cl_git_pass(git_oid_fromstr(&our_oid, ORIG_HEAD)); - cl_git_pass(git_annotated_commit_lookup(&our_head, repo, &our_oid)); - - cl_git_pass(git_reference_lookup(&octo1_ref, repo, GIT_REFS_HEADS_DIR OCTO1_BRANCH)); - cl_git_pass(git_annotated_commit_from_ref(&their_heads[0], repo, octo1_ref)); - - cl_git_pass(git_reference_lookup(&octo2_ref, repo, GIT_REFS_HEADS_DIR OCTO2_BRANCH)); - cl_git_pass(git_annotated_commit_from_ref(&their_heads[1], repo, octo2_ref)); - - cl_git_pass(git_merge__setup(repo, our_head, (const git_annotated_commit **)their_heads, 2)); - - cl_assert(test_file_contents(GIT_MERGE_HEAD_FILE, OCTO1_OID "\n" OCTO2_OID "\n")); - cl_assert(test_file_contents(GIT_ORIG_HEAD_FILE, ORIG_HEAD "\n")); - cl_assert(test_file_contents(GIT_MERGE_MODE_FILE, "no-ff")); - cl_assert(test_file_contents(GIT_MERGE_MSG_FILE, "Merge branches '" OCTO1_BRANCH "' and '" OCTO2_BRANCH "'\n")); - - git_reference_free(octo1_ref); - git_reference_free(octo2_ref); - - git_annotated_commit_free(our_head); - git_annotated_commit_free(their_heads[0]); - git_annotated_commit_free(their_heads[1]); -} - -/* git merge octo1 octo2 octo3 */ -void test_merge_workdir_setup__three_branches(void) -{ - git_oid our_oid; - git_reference *octo1_ref; - git_reference *octo2_ref; - git_reference *octo3_ref; - git_annotated_commit *our_head, *their_heads[3]; - - cl_git_pass(git_oid_fromstr(&our_oid, ORIG_HEAD)); - cl_git_pass(git_annotated_commit_lookup(&our_head, repo, &our_oid)); - - cl_git_pass(git_reference_lookup(&octo1_ref, repo, GIT_REFS_HEADS_DIR OCTO1_BRANCH)); - cl_git_pass(git_annotated_commit_from_ref(&their_heads[0], repo, octo1_ref)); - - cl_git_pass(git_reference_lookup(&octo2_ref, repo, GIT_REFS_HEADS_DIR OCTO2_BRANCH)); - cl_git_pass(git_annotated_commit_from_ref(&their_heads[1], repo, octo2_ref)); - - cl_git_pass(git_reference_lookup(&octo3_ref, repo, GIT_REFS_HEADS_DIR OCTO3_BRANCH)); - cl_git_pass(git_annotated_commit_from_ref(&their_heads[2], repo, octo3_ref)); - - cl_git_pass(git_merge__setup(repo, our_head, (const git_annotated_commit **)their_heads, 3)); - - cl_assert(test_file_contents(GIT_MERGE_HEAD_FILE, OCTO1_OID "\n" OCTO2_OID "\n" OCTO3_OID "\n")); - cl_assert(test_file_contents(GIT_ORIG_HEAD_FILE, ORIG_HEAD "\n")); - cl_assert(test_file_contents(GIT_MERGE_MODE_FILE, "no-ff")); - cl_assert(test_file_contents(GIT_MERGE_MSG_FILE, "Merge branches '" OCTO1_BRANCH "', '" OCTO2_BRANCH "' and '" OCTO3_BRANCH "'\n")); - - git_reference_free(octo1_ref); - git_reference_free(octo2_ref); - git_reference_free(octo3_ref); - - git_annotated_commit_free(our_head); - git_annotated_commit_free(their_heads[0]); - git_annotated_commit_free(their_heads[1]); - git_annotated_commit_free(their_heads[2]); -} - -/* git merge 16f825815cfd20a07a75c71554e82d8eede0b061 158dc7bedb202f5b26502bf3574faa7f4238d56c 50ce7d7d01217679e26c55939eef119e0c93e272 */ -void test_merge_workdir_setup__three_oids(void) -{ - git_oid our_oid; - git_oid octo1_oid; - git_oid octo2_oid; - git_oid octo3_oid; - git_annotated_commit *our_head, *their_heads[3]; - - cl_git_pass(git_oid_fromstr(&our_oid, ORIG_HEAD)); - cl_git_pass(git_annotated_commit_lookup(&our_head, repo, &our_oid)); - - cl_git_pass(git_oid_fromstr(&octo1_oid, OCTO1_OID)); - cl_git_pass(git_annotated_commit_lookup(&their_heads[0], repo, &octo1_oid)); - - cl_git_pass(git_oid_fromstr(&octo2_oid, OCTO2_OID)); - cl_git_pass(git_annotated_commit_lookup(&their_heads[1], repo, &octo2_oid)); - - cl_git_pass(git_oid_fromstr(&octo3_oid, OCTO3_OID)); - cl_git_pass(git_annotated_commit_lookup(&their_heads[2], repo, &octo3_oid)); - - cl_git_pass(git_merge__setup(repo, our_head, (const git_annotated_commit **)their_heads, 3)); - - cl_assert(test_file_contents(GIT_MERGE_HEAD_FILE, OCTO1_OID "\n" OCTO2_OID "\n" OCTO3_OID "\n")); - cl_assert(test_file_contents(GIT_ORIG_HEAD_FILE, ORIG_HEAD "\n")); - cl_assert(test_file_contents(GIT_MERGE_MODE_FILE, "no-ff")); - cl_assert(test_file_contents(GIT_MERGE_MSG_FILE, "Merge commit '" OCTO1_OID "'; commit '" OCTO2_OID "'; commit '" OCTO3_OID "'\n")); - - git_annotated_commit_free(our_head); - git_annotated_commit_free(their_heads[0]); - git_annotated_commit_free(their_heads[1]); - git_annotated_commit_free(their_heads[2]); -} - -/* git merge octo1 158dc7bedb202f5b26502bf3574faa7f4238d56c */ -void test_merge_workdir_setup__branches_and_oids_1(void) -{ - git_oid our_oid; - git_reference *octo1_ref; - git_oid octo2_oid; - git_annotated_commit *our_head, *their_heads[2]; - - cl_git_pass(git_oid_fromstr(&our_oid, ORIG_HEAD)); - cl_git_pass(git_annotated_commit_lookup(&our_head, repo, &our_oid)); - - cl_git_pass(git_reference_lookup(&octo1_ref, repo, GIT_REFS_HEADS_DIR OCTO1_BRANCH)); - cl_git_pass(git_annotated_commit_from_ref(&their_heads[0], repo, octo1_ref)); - - cl_git_pass(git_oid_fromstr(&octo2_oid, OCTO2_OID)); - cl_git_pass(git_annotated_commit_lookup(&their_heads[1], repo, &octo2_oid)); - - cl_git_pass(git_merge__setup(repo, our_head, (const git_annotated_commit **)their_heads, 2)); - - cl_assert(test_file_contents(GIT_MERGE_HEAD_FILE, OCTO1_OID "\n" OCTO2_OID "\n")); - cl_assert(test_file_contents(GIT_ORIG_HEAD_FILE, ORIG_HEAD "\n")); - cl_assert(test_file_contents(GIT_MERGE_MODE_FILE, "no-ff")); - cl_assert(test_file_contents(GIT_MERGE_MSG_FILE, "Merge branch '" OCTO1_BRANCH "'; commit '" OCTO2_OID "'\n")); - - git_reference_free(octo1_ref); - - git_annotated_commit_free(our_head); - git_annotated_commit_free(their_heads[0]); - git_annotated_commit_free(their_heads[1]); -} - -/* git merge octo1 158dc7bedb202f5b26502bf3574faa7f4238d56c octo3 54269b3f6ec3d7d4ede24dd350dd5d605495c3ae */ -void test_merge_workdir_setup__branches_and_oids_2(void) -{ - git_oid our_oid; - git_reference *octo1_ref; - git_oid octo2_oid; - git_reference *octo3_ref; - git_oid octo4_oid; - git_annotated_commit *our_head, *their_heads[4]; - - cl_git_pass(git_oid_fromstr(&our_oid, ORIG_HEAD)); - cl_git_pass(git_annotated_commit_lookup(&our_head, repo, &our_oid)); - - cl_git_pass(git_reference_lookup(&octo1_ref, repo, GIT_REFS_HEADS_DIR OCTO1_BRANCH)); - cl_git_pass(git_annotated_commit_from_ref(&their_heads[0], repo, octo1_ref)); - - cl_git_pass(git_oid_fromstr(&octo2_oid, OCTO2_OID)); - cl_git_pass(git_annotated_commit_lookup(&their_heads[1], repo, &octo2_oid)); - - cl_git_pass(git_reference_lookup(&octo3_ref, repo, GIT_REFS_HEADS_DIR OCTO3_BRANCH)); - cl_git_pass(git_annotated_commit_from_ref(&their_heads[2], repo, octo3_ref)); - - cl_git_pass(git_oid_fromstr(&octo4_oid, OCTO4_OID)); - cl_git_pass(git_annotated_commit_lookup(&their_heads[3], repo, &octo4_oid)); - - cl_git_pass(git_merge__setup(repo, our_head, (const git_annotated_commit **)their_heads, 4)); - - cl_assert(test_file_contents(GIT_MERGE_HEAD_FILE, OCTO1_OID "\n" OCTO2_OID "\n" OCTO3_OID "\n" OCTO4_OID "\n")); - cl_assert(test_file_contents(GIT_ORIG_HEAD_FILE, ORIG_HEAD "\n")); - cl_assert(test_file_contents(GIT_MERGE_MODE_FILE, "no-ff")); - cl_assert(test_file_contents(GIT_MERGE_MSG_FILE, "Merge branches '" OCTO1_BRANCH "' and '" OCTO3_BRANCH "'; commit '" OCTO2_OID "'; commit '" OCTO4_OID "'\n")); - - git_reference_free(octo1_ref); - git_reference_free(octo3_ref); - - git_annotated_commit_free(our_head); - git_annotated_commit_free(their_heads[0]); - git_annotated_commit_free(their_heads[1]); - git_annotated_commit_free(their_heads[2]); - git_annotated_commit_free(their_heads[3]); -} - -/* git merge 16f825815cfd20a07a75c71554e82d8eede0b061 octo2 50ce7d7d01217679e26c55939eef119e0c93e272 octo4 */ -void test_merge_workdir_setup__branches_and_oids_3(void) -{ - git_oid our_oid; - git_oid octo1_oid; - git_reference *octo2_ref; - git_oid octo3_oid; - git_reference *octo4_ref; - git_annotated_commit *our_head, *their_heads[4]; - - cl_git_pass(git_oid_fromstr(&our_oid, ORIG_HEAD)); - cl_git_pass(git_annotated_commit_lookup(&our_head, repo, &our_oid)); - - cl_git_pass(git_oid_fromstr(&octo1_oid, OCTO1_OID)); - cl_git_pass(git_annotated_commit_lookup(&their_heads[0], repo, &octo1_oid)); - - cl_git_pass(git_reference_lookup(&octo2_ref, repo, GIT_REFS_HEADS_DIR OCTO2_BRANCH)); - cl_git_pass(git_annotated_commit_from_ref(&their_heads[1], repo, octo2_ref)); - - cl_git_pass(git_oid_fromstr(&octo3_oid, OCTO3_OID)); - cl_git_pass(git_annotated_commit_lookup(&their_heads[2], repo, &octo3_oid)); - - cl_git_pass(git_reference_lookup(&octo4_ref, repo, GIT_REFS_HEADS_DIR OCTO4_BRANCH)); - cl_git_pass(git_annotated_commit_from_ref(&their_heads[3], repo, octo4_ref)); - - cl_git_pass(git_merge__setup(repo, our_head, (const git_annotated_commit **)their_heads, 4)); - - cl_assert(test_file_contents(GIT_MERGE_HEAD_FILE, OCTO1_OID "\n" OCTO2_OID "\n" OCTO3_OID "\n" OCTO4_OID "\n")); - cl_assert(test_file_contents(GIT_ORIG_HEAD_FILE, ORIG_HEAD "\n")); - cl_assert(test_file_contents(GIT_MERGE_MODE_FILE, "no-ff")); - cl_assert(test_file_contents(GIT_MERGE_MSG_FILE, "Merge commit '" OCTO1_OID "'; branches '" OCTO2_BRANCH "' and '" OCTO4_BRANCH "'; commit '" OCTO3_OID "'\n")); - - git_reference_free(octo2_ref); - git_reference_free(octo4_ref); - - git_annotated_commit_free(our_head); - git_annotated_commit_free(their_heads[0]); - git_annotated_commit_free(their_heads[1]); - git_annotated_commit_free(their_heads[2]); - git_annotated_commit_free(their_heads[3]); -} - -/* git merge 16f825815cfd20a07a75c71554e82d8eede0b061 octo2 50ce7d7d01217679e26c55939eef119e0c93e272 octo4 octo5 */ -void test_merge_workdir_setup__branches_and_oids_4(void) -{ - git_oid our_oid; - git_oid octo1_oid; - git_reference *octo2_ref; - git_oid octo3_oid; - git_reference *octo4_ref; - git_reference *octo5_ref; - git_annotated_commit *our_head, *their_heads[5]; - - cl_git_pass(git_oid_fromstr(&our_oid, ORIG_HEAD)); - cl_git_pass(git_annotated_commit_lookup(&our_head, repo, &our_oid)); - - cl_git_pass(git_oid_fromstr(&octo1_oid, OCTO1_OID)); - cl_git_pass(git_annotated_commit_lookup(&their_heads[0], repo, &octo1_oid)); - - cl_git_pass(git_reference_lookup(&octo2_ref, repo, GIT_REFS_HEADS_DIR OCTO2_BRANCH)); - cl_git_pass(git_annotated_commit_from_ref(&their_heads[1], repo, octo2_ref)); - - cl_git_pass(git_oid_fromstr(&octo3_oid, OCTO3_OID)); - cl_git_pass(git_annotated_commit_lookup(&their_heads[2], repo, &octo3_oid)); - - cl_git_pass(git_reference_lookup(&octo4_ref, repo, GIT_REFS_HEADS_DIR OCTO4_BRANCH)); - cl_git_pass(git_annotated_commit_from_ref(&their_heads[3], repo, octo4_ref)); - - cl_git_pass(git_reference_lookup(&octo5_ref, repo, GIT_REFS_HEADS_DIR OCTO5_BRANCH)); - cl_git_pass(git_annotated_commit_from_ref(&their_heads[4], repo, octo5_ref)); - - cl_git_pass(git_merge__setup(repo, our_head, (const git_annotated_commit **)their_heads, 5)); - - cl_assert(test_file_contents(GIT_MERGE_HEAD_FILE, OCTO1_OID "\n" OCTO2_OID "\n" OCTO3_OID "\n" OCTO4_OID "\n" OCTO5_OID "\n")); - cl_assert(test_file_contents(GIT_ORIG_HEAD_FILE, ORIG_HEAD "\n")); - cl_assert(test_file_contents(GIT_MERGE_MODE_FILE, "no-ff")); - cl_assert(test_file_contents(GIT_MERGE_MSG_FILE, "Merge commit '" OCTO1_OID "'; branches '" OCTO2_BRANCH "', '" OCTO4_BRANCH "' and '" OCTO5_BRANCH "'; commit '" OCTO3_OID "'\n")); - - git_reference_free(octo2_ref); - git_reference_free(octo4_ref); - git_reference_free(octo5_ref); - - git_annotated_commit_free(our_head); - git_annotated_commit_free(their_heads[0]); - git_annotated_commit_free(their_heads[1]); - git_annotated_commit_free(their_heads[2]); - git_annotated_commit_free(their_heads[3]); - git_annotated_commit_free(their_heads[4]); -} - -/* git merge octo1 octo1 octo1 */ -void test_merge_workdir_setup__three_same_branches(void) -{ - git_oid our_oid; - git_reference *octo1_1_ref; - git_reference *octo1_2_ref; - git_reference *octo1_3_ref; - git_annotated_commit *our_head, *their_heads[3]; - - cl_git_pass(git_oid_fromstr(&our_oid, ORIG_HEAD)); - cl_git_pass(git_annotated_commit_lookup(&our_head, repo, &our_oid)); - - cl_git_pass(git_reference_lookup(&octo1_1_ref, repo, GIT_REFS_HEADS_DIR OCTO1_BRANCH)); - cl_git_pass(git_annotated_commit_from_ref(&their_heads[0], repo, octo1_1_ref)); - - cl_git_pass(git_reference_lookup(&octo1_2_ref, repo, GIT_REFS_HEADS_DIR OCTO1_BRANCH)); - cl_git_pass(git_annotated_commit_from_ref(&their_heads[1], repo, octo1_2_ref)); - - cl_git_pass(git_reference_lookup(&octo1_3_ref, repo, GIT_REFS_HEADS_DIR OCTO1_BRANCH)); - cl_git_pass(git_annotated_commit_from_ref(&their_heads[2], repo, octo1_3_ref)); - - cl_git_pass(git_merge__setup(repo, our_head, (const git_annotated_commit **)their_heads, 3)); - - cl_assert(test_file_contents(GIT_MERGE_HEAD_FILE, OCTO1_OID "\n" OCTO1_OID "\n" OCTO1_OID "\n")); - cl_assert(test_file_contents(GIT_ORIG_HEAD_FILE, ORIG_HEAD "\n")); - cl_assert(test_file_contents(GIT_MERGE_MODE_FILE, "no-ff")); - cl_assert(test_file_contents(GIT_MERGE_MSG_FILE, "Merge branches '" OCTO1_BRANCH "', '" OCTO1_BRANCH "' and '" OCTO1_BRANCH "'\n")); - - git_reference_free(octo1_1_ref); - git_reference_free(octo1_2_ref); - git_reference_free(octo1_3_ref); - - git_annotated_commit_free(our_head); - git_annotated_commit_free(their_heads[0]); - git_annotated_commit_free(their_heads[1]); - git_annotated_commit_free(their_heads[2]); -} - -/* git merge 16f825815cfd20a07a75c71554e82d8eede0b061 16f825815cfd20a07a75c71554e82d8eede0b061 16f825815cfd20a07a75c71554e82d8eede0b061 */ -void test_merge_workdir_setup__three_same_oids(void) -{ - git_oid our_oid; - git_oid octo1_1_oid; - git_oid octo1_2_oid; - git_oid octo1_3_oid; - git_annotated_commit *our_head, *their_heads[3]; - - cl_git_pass(git_oid_fromstr(&our_oid, ORIG_HEAD)); - cl_git_pass(git_annotated_commit_lookup(&our_head, repo, &our_oid)); - - cl_git_pass(git_oid_fromstr(&octo1_1_oid, OCTO1_OID)); - cl_git_pass(git_annotated_commit_lookup(&their_heads[0], repo, &octo1_1_oid)); - - cl_git_pass(git_oid_fromstr(&octo1_2_oid, OCTO1_OID)); - cl_git_pass(git_annotated_commit_lookup(&their_heads[1], repo, &octo1_2_oid)); - - cl_git_pass(git_oid_fromstr(&octo1_3_oid, OCTO1_OID)); - cl_git_pass(git_annotated_commit_lookup(&their_heads[2], repo, &octo1_3_oid)); - - cl_git_pass(git_merge__setup(repo, our_head, (const git_annotated_commit **)their_heads, 3)); - - cl_assert(test_file_contents(GIT_MERGE_HEAD_FILE, OCTO1_OID "\n" OCTO1_OID "\n" OCTO1_OID "\n")); - cl_assert(test_file_contents(GIT_ORIG_HEAD_FILE, ORIG_HEAD "\n")); - cl_assert(test_file_contents(GIT_MERGE_MODE_FILE, "no-ff")); - cl_assert(test_file_contents(GIT_MERGE_MSG_FILE, "Merge commit '" OCTO1_OID "'; commit '" OCTO1_OID "'; commit '" OCTO1_OID "'\n")); - - git_annotated_commit_free(our_head); - git_annotated_commit_free(their_heads[0]); - git_annotated_commit_free(their_heads[1]); - git_annotated_commit_free(their_heads[2]); -} - -static int create_remote_tracking_branch(const char *branch_name, const char *oid_str) -{ - int error = 0; - - git_buf remotes_path = GIT_BUF_INIT, - origin_path = GIT_BUF_INIT, - filename = GIT_BUF_INIT, - data = GIT_BUF_INIT; - - if ((error = git_buf_puts(&remotes_path, git_repository_path(repo))) < 0 || - (error = git_buf_puts(&remotes_path, GIT_REFS_REMOTES_DIR)) < 0) - goto done; - - if (!git_path_exists(git_buf_cstr(&remotes_path)) && - (error = p_mkdir(git_buf_cstr(&remotes_path), 0777)) < 0) - goto done; - - if ((error = git_buf_puts(&origin_path, git_buf_cstr(&remotes_path))) < 0 || - (error = git_buf_puts(&origin_path, "origin")) < 0) - goto done; - - if (!git_path_exists(git_buf_cstr(&origin_path)) && - (error = p_mkdir(git_buf_cstr(&origin_path), 0777)) < 0) - goto done; - - if ((error = git_buf_puts(&filename, git_buf_cstr(&origin_path))) < 0 || - (error = git_buf_puts(&filename, "/")) < 0 || - (error = git_buf_puts(&filename, branch_name)) < 0 || - (error = git_buf_puts(&data, oid_str)) < 0 || - (error = git_buf_puts(&data, "\n")) < 0) - goto done; - - cl_git_rewritefile(git_buf_cstr(&filename), git_buf_cstr(&data)); - -done: - git_buf_free(&remotes_path); - git_buf_free(&origin_path); - git_buf_free(&filename); - git_buf_free(&data); - - return error; -} - -/* git merge refs/remotes/origin/octo1 */ -void test_merge_workdir_setup__remote_tracking_one_branch(void) -{ - git_oid our_oid; - git_reference *octo1_ref; - git_annotated_commit *our_head, *their_heads[1]; - - cl_git_pass(create_remote_tracking_branch(OCTO1_BRANCH, OCTO1_OID)); - - cl_git_pass(git_oid_fromstr(&our_oid, ORIG_HEAD)); - cl_git_pass(git_annotated_commit_lookup(&our_head, repo, &our_oid)); - - cl_git_pass(git_reference_lookup(&octo1_ref, repo, GIT_REFS_REMOTES_DIR "origin/" OCTO1_BRANCH)); - cl_git_pass(git_annotated_commit_from_ref(&their_heads[0], repo, octo1_ref)); - - cl_git_pass(git_merge__setup(repo, our_head, (const git_annotated_commit **)their_heads, 1)); - - cl_assert(test_file_contents(GIT_MERGE_HEAD_FILE, OCTO1_OID "\n")); - cl_assert(test_file_contents(GIT_ORIG_HEAD_FILE, ORIG_HEAD "\n")); - cl_assert(test_file_contents(GIT_MERGE_MODE_FILE, "no-ff")); - cl_assert(test_file_contents(GIT_MERGE_MSG_FILE, "Merge remote-tracking branch 'refs/remotes/origin/" OCTO1_BRANCH "'\n")); - - git_reference_free(octo1_ref); - - git_annotated_commit_free(our_head); - git_annotated_commit_free(their_heads[0]); -} - -/* git merge refs/remotes/origin/octo1 refs/remotes/origin/octo2 */ -void test_merge_workdir_setup__remote_tracking_two_branches(void) -{ - git_oid our_oid; - git_reference *octo1_ref; - git_reference *octo2_ref; - git_annotated_commit *our_head, *their_heads[2]; - - cl_git_pass(create_remote_tracking_branch(OCTO1_BRANCH, OCTO1_OID)); - cl_git_pass(create_remote_tracking_branch(OCTO2_BRANCH, OCTO2_OID)); - - cl_git_pass(git_oid_fromstr(&our_oid, ORIG_HEAD)); - cl_git_pass(git_annotated_commit_lookup(&our_head, repo, &our_oid)); - - cl_git_pass(git_reference_lookup(&octo1_ref, repo, GIT_REFS_REMOTES_DIR "origin/" OCTO1_BRANCH)); - cl_git_pass(git_annotated_commit_from_ref(&their_heads[0], repo, octo1_ref)); - - cl_git_pass(git_reference_lookup(&octo2_ref, repo, GIT_REFS_REMOTES_DIR "origin/" OCTO2_BRANCH)); - cl_git_pass(git_annotated_commit_from_ref(&their_heads[1], repo, octo2_ref)); - - cl_git_pass(git_merge__setup(repo, our_head, (const git_annotated_commit **)their_heads, 2)); - - cl_assert(test_file_contents(GIT_MERGE_HEAD_FILE, OCTO1_OID "\n" OCTO2_OID "\n")); - cl_assert(test_file_contents(GIT_ORIG_HEAD_FILE, ORIG_HEAD "\n")); - cl_assert(test_file_contents(GIT_MERGE_MODE_FILE, "no-ff")); - cl_assert(test_file_contents(GIT_MERGE_MSG_FILE, "Merge remote-tracking branches 'refs/remotes/origin/" OCTO1_BRANCH "' and 'refs/remotes/origin/" OCTO2_BRANCH "'\n")); - - git_reference_free(octo1_ref); - git_reference_free(octo2_ref); - - git_annotated_commit_free(our_head); - git_annotated_commit_free(their_heads[0]); - git_annotated_commit_free(their_heads[1]); -} - -/* git merge refs/remotes/origin/octo1 refs/remotes/origin/octo2 refs/remotes/origin/octo3 */ -void test_merge_workdir_setup__remote_tracking_three_branches(void) -{ - git_oid our_oid; - git_reference *octo1_ref; - git_reference *octo2_ref; - git_reference *octo3_ref; - git_annotated_commit *our_head, *their_heads[3]; - - cl_git_pass(create_remote_tracking_branch(OCTO1_BRANCH, OCTO1_OID)); - cl_git_pass(create_remote_tracking_branch(OCTO2_BRANCH, OCTO2_OID)); - cl_git_pass(create_remote_tracking_branch(OCTO3_BRANCH, OCTO3_OID)); - - cl_git_pass(git_oid_fromstr(&our_oid, ORIG_HEAD)); - cl_git_pass(git_annotated_commit_lookup(&our_head, repo, &our_oid)); - - cl_git_pass(git_reference_lookup(&octo1_ref, repo, GIT_REFS_REMOTES_DIR "origin/" OCTO1_BRANCH)); - cl_git_pass(git_annotated_commit_from_ref(&their_heads[0], repo, octo1_ref)); - - cl_git_pass(git_reference_lookup(&octo2_ref, repo, GIT_REFS_REMOTES_DIR "origin/" OCTO2_BRANCH)); - cl_git_pass(git_annotated_commit_from_ref(&their_heads[1], repo, octo2_ref)); - - cl_git_pass(git_reference_lookup(&octo3_ref, repo, GIT_REFS_REMOTES_DIR "origin/" OCTO3_BRANCH)); - cl_git_pass(git_annotated_commit_from_ref(&their_heads[2], repo, octo3_ref)); - - cl_git_pass(git_merge__setup(repo, our_head, (const git_annotated_commit **)their_heads, 3)); - - cl_assert(test_file_contents(GIT_MERGE_HEAD_FILE, OCTO1_OID "\n" OCTO2_OID "\n" OCTO3_OID "\n")); - cl_assert(test_file_contents(GIT_ORIG_HEAD_FILE, ORIG_HEAD "\n")); - cl_assert(test_file_contents(GIT_MERGE_MODE_FILE, "no-ff")); - cl_assert(test_file_contents(GIT_MERGE_MSG_FILE, "Merge remote-tracking branches 'refs/remotes/origin/" OCTO1_BRANCH "', 'refs/remotes/origin/" OCTO2_BRANCH "' and 'refs/remotes/origin/" OCTO3_BRANCH "'\n")); - - git_reference_free(octo1_ref); - git_reference_free(octo2_ref); - git_reference_free(octo3_ref); - - git_annotated_commit_free(our_head); - git_annotated_commit_free(their_heads[0]); - git_annotated_commit_free(their_heads[1]); - git_annotated_commit_free(their_heads[2]); -} - -/* git merge octo1 refs/remotes/origin/octo2 */ -void test_merge_workdir_setup__normal_branch_and_remote_tracking_branch(void) -{ - git_oid our_oid; - git_reference *octo1_ref; - git_reference *octo2_ref; - git_annotated_commit *our_head, *their_heads[2]; - - cl_git_pass(create_remote_tracking_branch(OCTO2_BRANCH, OCTO2_OID)); - - cl_git_pass(git_oid_fromstr(&our_oid, ORIG_HEAD)); - cl_git_pass(git_annotated_commit_lookup(&our_head, repo, &our_oid)); - - cl_git_pass(git_reference_lookup(&octo1_ref, repo, GIT_REFS_HEADS_DIR OCTO1_BRANCH)); - cl_git_pass(git_annotated_commit_from_ref(&their_heads[0], repo, octo1_ref)); - - cl_git_pass(git_reference_lookup(&octo2_ref, repo, GIT_REFS_REMOTES_DIR "origin/" OCTO2_BRANCH)); - cl_git_pass(git_annotated_commit_from_ref(&their_heads[1], repo, octo2_ref)); - - cl_git_pass(git_merge__setup(repo, our_head, (const git_annotated_commit **)their_heads, 2)); - - cl_assert(test_file_contents(GIT_MERGE_HEAD_FILE, OCTO1_OID "\n" OCTO2_OID "\n")); - cl_assert(test_file_contents(GIT_ORIG_HEAD_FILE, ORIG_HEAD "\n")); - cl_assert(test_file_contents(GIT_MERGE_MODE_FILE, "no-ff")); - cl_assert(test_file_contents(GIT_MERGE_MSG_FILE, "Merge branch '" OCTO1_BRANCH "', remote-tracking branch 'refs/remotes/origin/" OCTO2_BRANCH "'\n")); - - git_reference_free(octo1_ref); - git_reference_free(octo2_ref); - - git_annotated_commit_free(our_head); - git_annotated_commit_free(their_heads[0]); - git_annotated_commit_free(their_heads[1]); -} - -/* git merge refs/remotes/origin/octo1 octo2 */ -void test_merge_workdir_setup__remote_tracking_branch_and_normal_branch(void) -{ - git_oid our_oid; - git_reference *octo1_ref; - git_reference *octo2_ref; - git_annotated_commit *our_head, *their_heads[2]; - - cl_git_pass(create_remote_tracking_branch(OCTO1_BRANCH, OCTO1_OID)); - - cl_git_pass(git_oid_fromstr(&our_oid, ORIG_HEAD)); - cl_git_pass(git_annotated_commit_lookup(&our_head, repo, &our_oid)); - - cl_git_pass(git_reference_lookup(&octo1_ref, repo, GIT_REFS_REMOTES_DIR "origin/" OCTO1_BRANCH)); - cl_git_pass(git_annotated_commit_from_ref(&their_heads[0], repo, octo1_ref)); - - cl_git_pass(git_reference_lookup(&octo2_ref, repo, GIT_REFS_HEADS_DIR OCTO2_BRANCH)); - cl_git_pass(git_annotated_commit_from_ref(&their_heads[1], repo, octo2_ref)); - - cl_git_pass(git_merge__setup(repo, our_head, (const git_annotated_commit **)their_heads, 2)); - - cl_assert(test_file_contents(GIT_MERGE_HEAD_FILE, OCTO1_OID "\n" OCTO2_OID "\n")); - cl_assert(test_file_contents(GIT_ORIG_HEAD_FILE, ORIG_HEAD "\n")); - cl_assert(test_file_contents(GIT_MERGE_MODE_FILE, "no-ff")); - cl_assert(test_file_contents(GIT_MERGE_MSG_FILE, "Merge branch '" OCTO2_BRANCH "', remote-tracking branch 'refs/remotes/origin/" OCTO1_BRANCH "'\n")); - - git_reference_free(octo1_ref); - git_reference_free(octo2_ref); - - git_annotated_commit_free(our_head); - git_annotated_commit_free(their_heads[0]); - git_annotated_commit_free(their_heads[1]); -} - -/* git merge octo1 refs/remotes/origin/octo2 octo3 refs/remotes/origin/octo4 */ -void test_merge_workdir_setup__two_remote_tracking_branch_and_two_normal_branches(void) -{ - git_oid our_oid; - git_reference *octo1_ref; - git_reference *octo2_ref; - git_reference *octo3_ref; - git_reference *octo4_ref; - git_annotated_commit *our_head, *their_heads[4]; - - cl_git_pass(create_remote_tracking_branch(OCTO2_BRANCH, OCTO2_OID)); - cl_git_pass(create_remote_tracking_branch(OCTO4_BRANCH, OCTO4_OID)); - - cl_git_pass(git_oid_fromstr(&our_oid, ORIG_HEAD)); - cl_git_pass(git_annotated_commit_lookup(&our_head, repo, &our_oid)); - - cl_git_pass(git_reference_lookup(&octo1_ref, repo, GIT_REFS_HEADS_DIR OCTO1_BRANCH)); - cl_git_pass(git_annotated_commit_from_ref(&their_heads[0], repo, octo1_ref)); - - cl_git_pass(git_reference_lookup(&octo2_ref, repo, GIT_REFS_REMOTES_DIR "origin/" OCTO2_BRANCH)); - cl_git_pass(git_annotated_commit_from_ref(&their_heads[1], repo, octo2_ref)); - - cl_git_pass(git_reference_lookup(&octo3_ref, repo, GIT_REFS_HEADS_DIR OCTO3_BRANCH)); - cl_git_pass(git_annotated_commit_from_ref(&their_heads[2], repo, octo3_ref)); - - cl_git_pass(git_reference_lookup(&octo4_ref, repo, GIT_REFS_REMOTES_DIR "origin/" OCTO4_BRANCH)); - cl_git_pass(git_annotated_commit_from_ref(&their_heads[3], repo, octo4_ref)); - - cl_git_pass(git_merge__setup(repo, our_head, (const git_annotated_commit **)their_heads, 4)); - - cl_assert(test_file_contents(GIT_MERGE_HEAD_FILE, OCTO1_OID "\n" OCTO2_OID "\n" OCTO3_OID "\n" OCTO4_OID "\n")); - cl_assert(test_file_contents(GIT_ORIG_HEAD_FILE, ORIG_HEAD "\n")); - cl_assert(test_file_contents(GIT_MERGE_MODE_FILE, "no-ff")); - cl_assert(test_file_contents(GIT_MERGE_MSG_FILE, "Merge branches '" OCTO1_BRANCH "' and '" OCTO3_BRANCH "', remote-tracking branches 'refs/remotes/origin/" OCTO2_BRANCH "' and 'refs/remotes/origin/" OCTO4_BRANCH "'\n")); - - git_reference_free(octo1_ref); - git_reference_free(octo2_ref); - git_reference_free(octo3_ref); - git_reference_free(octo4_ref); - - git_annotated_commit_free(our_head); - git_annotated_commit_free(their_heads[0]); - git_annotated_commit_free(their_heads[1]); - git_annotated_commit_free(their_heads[2]); - git_annotated_commit_free(their_heads[3]); -} - -/* git pull origin branch octo1 */ -void test_merge_workdir_setup__pull_one(void) -{ - git_oid our_oid; - git_oid octo1_1_oid; - git_annotated_commit *our_head, *their_heads[1]; - - cl_git_pass(git_oid_fromstr(&our_oid, ORIG_HEAD)); - cl_git_pass(git_annotated_commit_lookup(&our_head, repo, &our_oid)); - - cl_git_pass(git_oid_fromstr(&octo1_1_oid, OCTO1_OID)); - cl_git_pass(git_annotated_commit_from_fetchhead(&their_heads[0], repo, GIT_REFS_HEADS_DIR OCTO1_BRANCH, "http://remote.url/repo.git", &octo1_1_oid)); - - cl_git_pass(git_merge__setup(repo, our_head, (const git_annotated_commit **)their_heads, 1)); - - cl_assert(test_file_contents(GIT_MERGE_HEAD_FILE, OCTO1_OID "\n")); - cl_assert(test_file_contents(GIT_ORIG_HEAD_FILE, ORIG_HEAD "\n")); - cl_assert(test_file_contents(GIT_MERGE_MODE_FILE, "no-ff")); - cl_assert(test_file_contents(GIT_MERGE_MSG_FILE, "Merge branch 'octo1' of http://remote.url/repo.git\n")); - - git_annotated_commit_free(our_head); - git_annotated_commit_free(their_heads[0]); -} - -/* git pull origin octo1 octo2 */ -void test_merge_workdir_setup__pull_two(void) -{ - git_oid our_oid; - git_oid octo1_oid; - git_oid octo2_oid; - git_annotated_commit *our_head, *their_heads[2]; - - cl_git_pass(git_oid_fromstr(&our_oid, ORIG_HEAD)); - cl_git_pass(git_annotated_commit_lookup(&our_head, repo, &our_oid)); - - cl_git_pass(git_oid_fromstr(&octo1_oid, OCTO1_OID)); - cl_git_pass(git_annotated_commit_from_fetchhead(&their_heads[0], repo, GIT_REFS_HEADS_DIR OCTO1_BRANCH, "http://remote.url/repo.git", &octo1_oid)); - - cl_git_pass(git_oid_fromstr(&octo2_oid, OCTO2_OID)); - cl_git_pass(git_annotated_commit_from_fetchhead(&their_heads[1], repo, GIT_REFS_HEADS_DIR OCTO2_BRANCH, "http://remote.url/repo.git", &octo2_oid)); - - cl_git_pass(git_merge__setup(repo, our_head, (const git_annotated_commit **)their_heads, 2)); - - cl_assert(test_file_contents(GIT_MERGE_HEAD_FILE, OCTO1_OID "\n" OCTO2_OID "\n")); - cl_assert(test_file_contents(GIT_ORIG_HEAD_FILE, ORIG_HEAD "\n")); - cl_assert(test_file_contents(GIT_MERGE_MODE_FILE, "no-ff")); - cl_assert(test_file_contents(GIT_MERGE_MSG_FILE, "Merge branches '" OCTO1_BRANCH "' and '" OCTO2_BRANCH "' of http://remote.url/repo.git\n")); - - git_annotated_commit_free(our_head); - git_annotated_commit_free(their_heads[0]); - git_annotated_commit_free(their_heads[1]); -} - -/* git pull origin octo1 octo2 octo3 */ -void test_merge_workdir_setup__pull_three(void) -{ - git_oid our_oid; - git_oid octo1_oid; - git_oid octo2_oid; - git_oid octo3_oid; - git_annotated_commit *our_head, *their_heads[3]; - - cl_git_pass(git_oid_fromstr(&our_oid, ORIG_HEAD)); - cl_git_pass(git_annotated_commit_lookup(&our_head, repo, &our_oid)); - - cl_git_pass(git_oid_fromstr(&octo1_oid, OCTO1_OID)); - cl_git_pass(git_annotated_commit_from_fetchhead(&their_heads[0], repo, GIT_REFS_HEADS_DIR OCTO1_BRANCH, "http://remote.url/repo.git", &octo1_oid)); - - cl_git_pass(git_oid_fromstr(&octo2_oid, OCTO2_OID)); - cl_git_pass(git_annotated_commit_from_fetchhead(&their_heads[1], repo, GIT_REFS_HEADS_DIR OCTO2_BRANCH, "http://remote.url/repo.git", &octo2_oid)); - - cl_git_pass(git_oid_fromstr(&octo3_oid, OCTO3_OID)); - cl_git_pass(git_annotated_commit_from_fetchhead(&their_heads[2], repo, GIT_REFS_HEADS_DIR OCTO3_BRANCH, "http://remote.url/repo.git", &octo3_oid)); - - cl_git_pass(git_merge__setup(repo, our_head, (const git_annotated_commit **)their_heads, 3)); - - cl_assert(test_file_contents(GIT_MERGE_HEAD_FILE, OCTO1_OID "\n" OCTO2_OID "\n" OCTO3_OID "\n")); - cl_assert(test_file_contents(GIT_ORIG_HEAD_FILE, ORIG_HEAD "\n")); - cl_assert(test_file_contents(GIT_MERGE_MODE_FILE, "no-ff")); - cl_assert(test_file_contents(GIT_MERGE_MSG_FILE, "Merge branches '" OCTO1_BRANCH "', '" OCTO2_BRANCH "' and '" OCTO3_BRANCH "' of http://remote.url/repo.git\n")); - - git_annotated_commit_free(our_head); - git_annotated_commit_free(their_heads[0]); - git_annotated_commit_free(their_heads[1]); - git_annotated_commit_free(their_heads[2]); -} - -void test_merge_workdir_setup__three_remotes(void) -{ - git_oid our_oid; - git_oid octo1_oid; - git_oid octo2_oid; - git_oid octo3_oid; - git_annotated_commit *our_head, *their_heads[3]; - - cl_git_pass(git_oid_fromstr(&our_oid, ORIG_HEAD)); - cl_git_pass(git_annotated_commit_lookup(&our_head, repo, &our_oid)); - - cl_git_pass(git_oid_fromstr(&octo1_oid, OCTO1_OID)); - cl_git_pass(git_annotated_commit_from_fetchhead(&their_heads[0], repo, GIT_REFS_HEADS_DIR OCTO1_BRANCH, "http://remote.first/repo.git", &octo1_oid)); - - cl_git_pass(git_oid_fromstr(&octo2_oid, OCTO2_OID)); - cl_git_pass(git_annotated_commit_from_fetchhead(&their_heads[1], repo, GIT_REFS_HEADS_DIR OCTO2_BRANCH, "http://remote.second/repo.git", &octo2_oid)); - - cl_git_pass(git_oid_fromstr(&octo3_oid, OCTO3_OID)); - cl_git_pass(git_annotated_commit_from_fetchhead(&their_heads[2], repo, GIT_REFS_HEADS_DIR OCTO3_BRANCH, "http://remote.third/repo.git", &octo3_oid)); - - cl_git_pass(git_merge__setup(repo, our_head, (const git_annotated_commit **)their_heads, 3)); - - cl_assert(test_file_contents(GIT_MERGE_HEAD_FILE, OCTO1_OID "\n" OCTO2_OID "\n" OCTO3_OID "\n")); - cl_assert(test_file_contents(GIT_ORIG_HEAD_FILE, ORIG_HEAD "\n")); - cl_assert(test_file_contents(GIT_MERGE_MODE_FILE, "no-ff")); - cl_assert(test_file_contents(GIT_MERGE_MSG_FILE, "Merge branch '" OCTO1_BRANCH "' of http://remote.first/repo.git, branch '" OCTO2_BRANCH "' of http://remote.second/repo.git, branch '" OCTO3_BRANCH "' of http://remote.third/repo.git\n")); - - git_annotated_commit_free(our_head); - git_annotated_commit_free(their_heads[0]); - git_annotated_commit_free(their_heads[1]); - git_annotated_commit_free(their_heads[2]); -} - -void test_merge_workdir_setup__two_remotes(void) -{ - git_oid our_oid; - git_oid octo1_oid; - git_oid octo2_oid; - git_oid octo3_oid; - git_oid octo4_oid; - git_annotated_commit *our_head, *their_heads[4]; - - cl_git_pass(git_oid_fromstr(&our_oid, ORIG_HEAD)); - cl_git_pass(git_annotated_commit_lookup(&our_head, repo, &our_oid)); - - cl_git_pass(git_oid_fromstr(&octo1_oid, OCTO1_OID)); - cl_git_pass(git_annotated_commit_from_fetchhead(&their_heads[0], repo, GIT_REFS_HEADS_DIR OCTO1_BRANCH, "http://remote.first/repo.git", &octo1_oid)); - - cl_git_pass(git_oid_fromstr(&octo2_oid, OCTO2_OID)); - cl_git_pass(git_annotated_commit_from_fetchhead(&their_heads[1], repo, GIT_REFS_HEADS_DIR OCTO2_BRANCH, "http://remote.second/repo.git", &octo2_oid)); - - cl_git_pass(git_oid_fromstr(&octo3_oid, OCTO3_OID)); - cl_git_pass(git_annotated_commit_from_fetchhead(&their_heads[2], repo, GIT_REFS_HEADS_DIR OCTO3_BRANCH, "http://remote.first/repo.git", &octo3_oid)); - - cl_git_pass(git_oid_fromstr(&octo4_oid, OCTO4_OID)); - cl_git_pass(git_annotated_commit_from_fetchhead(&their_heads[3], repo, GIT_REFS_HEADS_DIR OCTO4_BRANCH, "http://remote.second/repo.git", &octo4_oid)); - - cl_git_pass(git_merge__setup(repo, our_head, (const git_annotated_commit **)their_heads, 4)); - - cl_assert(test_file_contents(GIT_MERGE_HEAD_FILE, OCTO1_OID "\n" OCTO2_OID "\n" OCTO3_OID "\n" OCTO4_OID "\n")); - cl_assert(test_file_contents(GIT_ORIG_HEAD_FILE, ORIG_HEAD "\n")); - cl_assert(test_file_contents(GIT_MERGE_MODE_FILE, "no-ff")); - cl_assert(test_file_contents(GIT_MERGE_MSG_FILE, "Merge branches '" OCTO1_BRANCH "' and '" OCTO3_BRANCH "' of http://remote.first/repo.git, branches '" OCTO2_BRANCH "' and '" OCTO4_BRANCH "' of http://remote.second/repo.git\n")); - - git_annotated_commit_free(our_head); - git_annotated_commit_free(their_heads[0]); - git_annotated_commit_free(their_heads[1]); - git_annotated_commit_free(their_heads[2]); - git_annotated_commit_free(their_heads[3]); -} - -void test_merge_workdir_setup__id_from_head(void) -{ - git_oid expected_id; - const git_oid *id; - git_reference *ref; - git_annotated_commit *heads[3]; - - cl_git_pass(git_oid_fromstr(&expected_id, OCTO1_OID)); - cl_git_pass(git_annotated_commit_from_fetchhead(&heads[0], repo, GIT_REFS_HEADS_DIR OCTO1_BRANCH, "http://remote.url/repo.git", &expected_id)); - id = git_annotated_commit_id(heads[0]); - cl_assert_equal_i(1, git_oid_equal(id, &expected_id)); - - cl_git_pass(git_annotated_commit_lookup(&heads[1], repo, &expected_id)); - id = git_annotated_commit_id(heads[1]); - cl_assert_equal_i(1, git_oid_equal(id, &expected_id)); - - cl_git_pass(git_reference_lookup(&ref, repo, GIT_REFS_HEADS_DIR OCTO1_BRANCH)); - cl_git_pass(git_annotated_commit_from_ref(&heads[2], repo, ref)); - id = git_annotated_commit_id(heads[2]); - cl_assert_equal_i(1, git_oid_equal(id, &expected_id)); - - git_reference_free(ref); - git_annotated_commit_free(heads[0]); - git_annotated_commit_free(heads[1]); - git_annotated_commit_free(heads[2]); -} - -struct annotated_commit_cb_data { - const char **oid_str; - unsigned int len; - - unsigned int i; -}; - -static int annotated_commit_foreach_cb(const git_oid *oid, void *payload) -{ - git_oid expected_oid; - struct annotated_commit_cb_data *cb_data = payload; - - git_oid_fromstr(&expected_oid, cb_data->oid_str[cb_data->i]); - cl_assert(git_oid_cmp(&expected_oid, oid) == 0); - cb_data->i++; - return 0; -} - -void test_merge_workdir_setup__head_notfound(void) -{ - int error; - - cl_git_fail((error = git_repository_mergehead_foreach(repo, - annotated_commit_foreach_cb, NULL))); - cl_assert(error == GIT_ENOTFOUND); -} - -void test_merge_workdir_setup__head_invalid_oid(void) -{ - int error; - - write_file_contents(GIT_MERGE_HEAD_FILE, "invalid-oid\n"); - - cl_git_fail((error = git_repository_mergehead_foreach(repo, - annotated_commit_foreach_cb, NULL))); - cl_assert(error == -1); -} - -void test_merge_workdir_setup__head_foreach_nonewline(void) -{ - int error; - - write_file_contents(GIT_MERGE_HEAD_FILE, THEIRS_SIMPLE_OID); - - cl_git_fail((error = git_repository_mergehead_foreach(repo, - annotated_commit_foreach_cb, NULL))); - cl_assert(error == -1); -} - -void test_merge_workdir_setup__head_foreach_one(void) -{ - const char *expected = THEIRS_SIMPLE_OID; - - struct annotated_commit_cb_data cb_data = { &expected, 1 }; - - write_file_contents(GIT_MERGE_HEAD_FILE, THEIRS_SIMPLE_OID "\n"); - - cl_git_pass(git_repository_mergehead_foreach(repo, - annotated_commit_foreach_cb, &cb_data)); - - cl_assert(cb_data.i == cb_data.len); -} - -void test_merge_workdir_setup__head_foreach_octopus(void) -{ - const char *expected[] = { THEIRS_SIMPLE_OID, - OCTO1_OID, OCTO2_OID, OCTO3_OID, OCTO4_OID, OCTO5_OID }; - - struct annotated_commit_cb_data cb_data = { expected, 6 }; - - write_file_contents(GIT_MERGE_HEAD_FILE, - THEIRS_SIMPLE_OID "\n" - OCTO1_OID "\n" - OCTO2_OID "\n" - OCTO3_OID "\n" - OCTO4_OID "\n" - OCTO5_OID "\n"); - - cl_git_pass(git_repository_mergehead_foreach(repo, - annotated_commit_foreach_cb, &cb_data)); - - cl_assert(cb_data.i == cb_data.len); -} - -void test_merge_workdir_setup__retained_after_success(void) -{ - git_oid our_oid; - git_reference *octo1_ref; - git_annotated_commit *our_head, *their_heads[1]; - - cl_git_pass(git_oid_fromstr(&our_oid, ORIG_HEAD)); - cl_git_pass(git_annotated_commit_lookup(&our_head, repo, &our_oid)); - - cl_git_pass(git_reference_lookup(&octo1_ref, repo, GIT_REFS_HEADS_DIR OCTO1_BRANCH)); - - cl_git_pass(git_annotated_commit_from_ref(&their_heads[0], repo, octo1_ref)); - - cl_git_pass(git_merge(repo, (const git_annotated_commit **)&their_heads[0], 1, NULL, NULL)); - - cl_assert(test_file_contents(GIT_MERGE_HEAD_FILE, OCTO1_OID "\n")); - cl_assert(test_file_contents(GIT_ORIG_HEAD_FILE, ORIG_HEAD "\n")); - cl_assert(test_file_contents(GIT_MERGE_MODE_FILE, "no-ff")); - cl_assert(test_file_contents(GIT_MERGE_MSG_FILE, "Merge branch '" OCTO1_BRANCH "'\n")); - - git_reference_free(octo1_ref); - - git_annotated_commit_free(our_head); - git_annotated_commit_free(their_heads[0]); -} - - -void test_merge_workdir_setup__removed_after_failure(void) -{ - git_oid our_oid; - git_reference *octo1_ref; - git_annotated_commit *our_head, *their_heads[1]; - - cl_git_pass(git_oid_fromstr(&our_oid, ORIG_HEAD)); - cl_git_pass(git_annotated_commit_lookup(&our_head, repo, &our_oid)); - - cl_git_pass(git_reference_lookup(&octo1_ref, repo, GIT_REFS_HEADS_DIR OCTO1_BRANCH)); - cl_git_pass(git_annotated_commit_from_ref(&their_heads[0], repo, octo1_ref)); - - cl_git_write2file("merge-resolve/.git/index.lock", "foo\n", 4, O_RDWR|O_CREAT, 0666); - - cl_git_fail(git_merge( - repo, (const git_annotated_commit **)&their_heads[0], 1, NULL, NULL)); - - cl_assert(!git_path_exists("merge-resolve/.git/" GIT_MERGE_HEAD_FILE)); - cl_assert(!git_path_exists("merge-resolve/.git/" GIT_MERGE_MODE_FILE)); - cl_assert(!git_path_exists("merge-resolve/.git/" GIT_MERGE_MSG_FILE)); - - git_reference_free(octo1_ref); - - git_annotated_commit_free(our_head); - git_annotated_commit_free(their_heads[0]); -} - -void test_merge_workdir_setup__unlocked_after_success(void) -{ - git_oid our_oid; - git_reference *octo1_ref; - git_annotated_commit *our_head, *their_heads[1]; - - cl_git_pass(git_oid_fromstr(&our_oid, ORIG_HEAD)); - cl_git_pass(git_annotated_commit_lookup(&our_head, repo, &our_oid)); - - cl_git_pass(git_reference_lookup(&octo1_ref, repo, GIT_REFS_HEADS_DIR OCTO1_BRANCH)); - cl_git_pass(git_annotated_commit_from_ref(&their_heads[0], repo, octo1_ref)); - - cl_git_pass(git_merge( - repo, (const git_annotated_commit **)&their_heads[0], 1, NULL, NULL)); - - cl_assert(!git_path_exists("merge-resolve/.git/index.lock")); - - git_reference_free(octo1_ref); - - git_annotated_commit_free(our_head); - git_annotated_commit_free(their_heads[0]); -} - -void test_merge_workdir_setup__unlocked_after_conflict(void) -{ - git_oid our_oid; - git_reference *octo1_ref; - git_annotated_commit *our_head, *their_heads[1]; - - cl_git_pass(git_oid_fromstr(&our_oid, ORIG_HEAD)); - cl_git_pass(git_annotated_commit_lookup(&our_head, repo, &our_oid)); - - cl_git_pass(git_reference_lookup(&octo1_ref, repo, GIT_REFS_HEADS_DIR OCTO1_BRANCH)); - cl_git_pass(git_annotated_commit_from_ref(&their_heads[0], repo, octo1_ref)); - - cl_git_rewritefile("merge-resolve/new-in-octo1.txt", - "Conflicting file!\n\nMerge will fail!\n"); - - cl_git_fail(git_merge( - repo, (const git_annotated_commit **)&their_heads[0], 1, NULL, NULL)); - - cl_assert(!git_path_exists("merge-resolve/.git/index.lock")); - - git_reference_free(octo1_ref); - - git_annotated_commit_free(our_head); - git_annotated_commit_free(their_heads[0]); -} diff --git a/vendor/libgit2/tests/merge/workdir/simple.c b/vendor/libgit2/tests/merge/workdir/simple.c deleted file mode 100644 index abc0777f74..0000000000 --- a/vendor/libgit2/tests/merge/workdir/simple.c +++ /dev/null @@ -1,635 +0,0 @@ -#include "clar_libgit2.h" -#include "git2/repository.h" -#include "git2/merge.h" -#include "buffer.h" -#include "merge.h" -#include "../merge_helpers.h" -#include "refs.h" -#include "fileops.h" - -static git_repository *repo; -static git_index *repo_index; - -#define TEST_REPO_PATH "merge-resolve" -#define TEST_INDEX_PATH TEST_REPO_PATH "/.git/index" - -#define THEIRS_SIMPLE_BRANCH "branch" -#define THEIRS_SIMPLE_OID "7cb63eed597130ba4abb87b3e544b85021905520" - -#define THEIRS_UNRELATED_BRANCH "unrelated" -#define THEIRS_UNRELATED_OID "55b4e4687e7a0d9ca367016ed930f385d4022e6f" -#define THEIRS_UNRELATED_PARENT "d6cf6c7741b3316826af1314042550c97ded1d50" - -#define OURS_DIRECTORY_FILE "df_side1" -#define THEIRS_DIRECTORY_FILE "fc90237dc4891fa6c69827fc465632225e391618" - - -/* Non-conflicting files, index entries are common to every merge operation */ -#define ADDED_IN_MASTER_INDEX_ENTRY \ - { 0100644, "233c0919c998ed110a4b6ff36f353aec8b713487", 0, \ - "added-in-master.txt" } -#define AUTOMERGEABLE_INDEX_ENTRY \ - { 0100644, "f2e1550a0c9e53d5811175864a29536642ae3821", 0, \ - "automergeable.txt" } -#define CHANGED_IN_BRANCH_INDEX_ENTRY \ - { 0100644, "4eb04c9e79e88f6640d01ff5b25ca2a60764f216", 0, \ - "changed-in-branch.txt" } -#define CHANGED_IN_MASTER_INDEX_ENTRY \ - { 0100644, "11deab00b2d3a6f5a3073988ac050c2d7b6655e2", 0, \ - "changed-in-master.txt" } -#define UNCHANGED_INDEX_ENTRY \ - { 0100644, "c8f06f2e3bb2964174677e91f0abead0e43c9e5d", 0, \ - "unchanged.txt" } - -/* Unrelated files */ -#define UNRELATED_NEW1 \ - { 0100644, "ef58fdd8086c243bdc81f99e379acacfd21d32d6", 0, \ - "new-in-unrelated1.txt" } -#define UNRELATED_NEW2 \ - { 0100644, "948ba6e701c1edab0c2d394fb7c5538334129793", 0, \ - "new-in-unrelated2.txt" } - -/* Expected REUC entries */ -#define AUTOMERGEABLE_REUC_ENTRY \ - { "automergeable.txt", 0100644, 0100644, 0100644, \ - "6212c31dab5e482247d7977e4f0dd3601decf13b", \ - "ee3fa1b8c00aff7fe02065fdb50864bb0d932ccf", \ - "058541fc37114bfc1dddf6bd6bffc7fae5c2e6fe" } -#define CONFLICTING_REUC_ENTRY \ - { "conflicting.txt", 0100644, 0100644, 0100644, \ - "d427e0b2e138501a3d15cc376077a3631e15bd46", \ - "4e886e602529caa9ab11d71f86634bd1b6e0de10", \ - "2bd0a343aeef7a2cf0d158478966a6e587ff3863" } -#define REMOVED_IN_BRANCH_REUC_ENTRY \ - { "removed-in-branch.txt", 0100644, 0100644, 0, \ - "dfe3f22baa1f6fce5447901c3086bae368de6bdd", \ - "dfe3f22baa1f6fce5447901c3086bae368de6bdd", \ - "" } -#define REMOVED_IN_MASTER_REUC_ENTRY \ - { "removed-in-master.txt", 0100644, 0, 0100644, \ - "5c3b68a71fc4fa5d362fd3875e53137c6a5ab7a5", \ - "", \ - "5c3b68a71fc4fa5d362fd3875e53137c6a5ab7a5" } - - -// Fixture setup and teardown -void test_merge_workdir_simple__initialize(void) -{ - git_config *cfg; - - repo = cl_git_sandbox_init(TEST_REPO_PATH); - git_repository_index(&repo_index, repo); - - /* Ensure that the user's merge.conflictstyle doesn't interfere */ - cl_git_pass(git_repository_config(&cfg, repo)); - cl_git_pass(git_config_set_string(cfg, "merge.conflictstyle", "merge")); - git_config_free(cfg); -} - -void test_merge_workdir_simple__cleanup(void) -{ - git_index_free(repo_index); - cl_git_sandbox_cleanup(); -} - -static void merge_simple_branch(int merge_file_favor, int addl_checkout_strategy) -{ - git_oid their_oids[1]; - git_annotated_commit *their_heads[1]; - git_merge_options merge_opts = GIT_MERGE_OPTIONS_INIT; - git_checkout_options checkout_opts = GIT_CHECKOUT_OPTIONS_INIT; - - cl_git_pass(git_oid_fromstr(&their_oids[0], THEIRS_SIMPLE_OID)); - cl_git_pass(git_annotated_commit_lookup(&their_heads[0], repo, &their_oids[0])); - - merge_opts.file_favor = merge_file_favor; - checkout_opts.checkout_strategy = GIT_CHECKOUT_SAFE | GIT_CHECKOUT_ALLOW_CONFLICTS | - addl_checkout_strategy; - - cl_git_pass(git_merge(repo, (const git_annotated_commit **)their_heads, 1, &merge_opts, &checkout_opts)); - - git_annotated_commit_free(their_heads[0]); -} - -static void set_core_autocrlf_to(git_repository *repo, bool value) -{ - git_config *cfg; - - cl_git_pass(git_repository_config(&cfg, repo)); - cl_git_pass(git_config_set_bool(cfg, "core.autocrlf", value)); - - git_config_free(cfg); -} - -void test_merge_workdir_simple__automerge(void) -{ - git_index *index; - const git_index_entry *entry; - git_buf automergeable_buf = GIT_BUF_INIT; - - struct merge_index_entry merge_index_entries[] = { - ADDED_IN_MASTER_INDEX_ENTRY, - AUTOMERGEABLE_INDEX_ENTRY, - CHANGED_IN_BRANCH_INDEX_ENTRY, - CHANGED_IN_MASTER_INDEX_ENTRY, - - { 0100644, "d427e0b2e138501a3d15cc376077a3631e15bd46", 1, "conflicting.txt" }, - { 0100644, "4e886e602529caa9ab11d71f86634bd1b6e0de10", 2, "conflicting.txt" }, - { 0100644, "2bd0a343aeef7a2cf0d158478966a6e587ff3863", 3, "conflicting.txt" }, - - UNCHANGED_INDEX_ENTRY, - }; - - struct merge_reuc_entry merge_reuc_entries[] = { - AUTOMERGEABLE_REUC_ENTRY, - REMOVED_IN_BRANCH_REUC_ENTRY, - REMOVED_IN_MASTER_REUC_ENTRY - }; - - - set_core_autocrlf_to(repo, false); - - merge_simple_branch(0, 0); - - cl_git_pass(git_futils_readbuffer(&automergeable_buf, - TEST_REPO_PATH "/automergeable.txt")); - cl_assert(strcmp(automergeable_buf.ptr, AUTOMERGEABLE_MERGED_FILE) == 0); - git_buf_free(&automergeable_buf); - - cl_assert(merge_test_index(repo_index, merge_index_entries, 8)); - cl_assert(merge_test_reuc(repo_index, merge_reuc_entries, 3)); - - git_repository_index(&index, repo); - - cl_assert((entry = git_index_get_bypath(index, "automergeable.txt", 0)) != NULL); - cl_assert(entry->file_size == strlen(AUTOMERGEABLE_MERGED_FILE)); - - git_index_free(index); -} - -void test_merge_workdir_simple__automerge_crlf(void) -{ -#ifdef GIT_WIN32 - git_index *index; - const git_index_entry *entry; - git_buf automergeable_buf = GIT_BUF_INIT; - - struct merge_index_entry merge_index_entries[] = { - ADDED_IN_MASTER_INDEX_ENTRY, - AUTOMERGEABLE_INDEX_ENTRY, - CHANGED_IN_BRANCH_INDEX_ENTRY, - CHANGED_IN_MASTER_INDEX_ENTRY, - - { 0100644, "d427e0b2e138501a3d15cc376077a3631e15bd46", 1, "conflicting.txt" }, - { 0100644, "4e886e602529caa9ab11d71f86634bd1b6e0de10", 2, "conflicting.txt" }, - { 0100644, "2bd0a343aeef7a2cf0d158478966a6e587ff3863", 3, "conflicting.txt" }, - - UNCHANGED_INDEX_ENTRY, - }; - - struct merge_reuc_entry merge_reuc_entries[] = { - AUTOMERGEABLE_REUC_ENTRY, - REMOVED_IN_BRANCH_REUC_ENTRY, - REMOVED_IN_MASTER_REUC_ENTRY - }; - - set_core_autocrlf_to(repo, true); - - merge_simple_branch(0, 0); - - cl_git_pass(git_futils_readbuffer(&automergeable_buf, - TEST_REPO_PATH "/automergeable.txt")); - cl_assert(strcmp(automergeable_buf.ptr, AUTOMERGEABLE_MERGED_FILE_CRLF) == 0); - git_buf_free(&automergeable_buf); - - cl_assert(merge_test_index(repo_index, merge_index_entries, 8)); - cl_assert(merge_test_reuc(repo_index, merge_reuc_entries, 3)); - - git_repository_index(&index, repo); - - cl_assert((entry = git_index_get_bypath(index, "automergeable.txt", 0)) != NULL); - cl_assert(entry->file_size == strlen(AUTOMERGEABLE_MERGED_FILE_CRLF)); - - git_index_free(index); -#endif /* GIT_WIN32 */ -} - -void test_merge_workdir_simple__mergefile(void) -{ - git_buf conflicting_buf = GIT_BUF_INIT, mergemsg_buf = GIT_BUF_INIT; - - struct merge_index_entry merge_index_entries[] = { - ADDED_IN_MASTER_INDEX_ENTRY, - AUTOMERGEABLE_INDEX_ENTRY, - CHANGED_IN_BRANCH_INDEX_ENTRY, - CHANGED_IN_MASTER_INDEX_ENTRY, - - { 0100644, "d427e0b2e138501a3d15cc376077a3631e15bd46", 1, "conflicting.txt" }, - { 0100644, "4e886e602529caa9ab11d71f86634bd1b6e0de10", 2, "conflicting.txt" }, - { 0100644, "2bd0a343aeef7a2cf0d158478966a6e587ff3863", 3, "conflicting.txt" }, - - UNCHANGED_INDEX_ENTRY, - }; - - struct merge_reuc_entry merge_reuc_entries[] = { - AUTOMERGEABLE_REUC_ENTRY, - REMOVED_IN_BRANCH_REUC_ENTRY, - REMOVED_IN_MASTER_REUC_ENTRY - }; - - set_core_autocrlf_to(repo, false); - - merge_simple_branch(0, 0); - - cl_git_pass(git_futils_readbuffer(&conflicting_buf, - TEST_REPO_PATH "/conflicting.txt")); - cl_assert(strcmp(conflicting_buf.ptr, CONFLICTING_MERGE_FILE) == 0); - cl_git_pass(git_futils_readbuffer(&mergemsg_buf, - TEST_REPO_PATH "/.git/MERGE_MSG")); - cl_assert(strcmp(git_buf_cstr(&mergemsg_buf), - "Merge commit '7cb63eed597130ba4abb87b3e544b85021905520'\n" \ - "\n" \ - "Conflicts:\n" \ - "\tconflicting.txt\n") == 0); - git_buf_free(&conflicting_buf); - git_buf_free(&mergemsg_buf); - - cl_assert(merge_test_index(repo_index, merge_index_entries, 8)); - cl_assert(merge_test_reuc(repo_index, merge_reuc_entries, 3)); -} - -void test_merge_workdir_simple__diff3(void) -{ - git_buf conflicting_buf = GIT_BUF_INIT; - - struct merge_index_entry merge_index_entries[] = { - ADDED_IN_MASTER_INDEX_ENTRY, - AUTOMERGEABLE_INDEX_ENTRY, - CHANGED_IN_BRANCH_INDEX_ENTRY, - CHANGED_IN_MASTER_INDEX_ENTRY, - - { 0100644, "d427e0b2e138501a3d15cc376077a3631e15bd46", 1, "conflicting.txt" }, - { 0100644, "4e886e602529caa9ab11d71f86634bd1b6e0de10", 2, "conflicting.txt" }, - { 0100644, "2bd0a343aeef7a2cf0d158478966a6e587ff3863", 3, "conflicting.txt" }, - - UNCHANGED_INDEX_ENTRY, - }; - - struct merge_reuc_entry merge_reuc_entries[] = { - AUTOMERGEABLE_REUC_ENTRY, - REMOVED_IN_BRANCH_REUC_ENTRY, - REMOVED_IN_MASTER_REUC_ENTRY - }; - - set_core_autocrlf_to(repo, false); - - merge_simple_branch(0, GIT_CHECKOUT_CONFLICT_STYLE_DIFF3); - - cl_git_pass(git_futils_readbuffer(&conflicting_buf, - TEST_REPO_PATH "/conflicting.txt")); - cl_assert(strcmp(conflicting_buf.ptr, CONFLICTING_DIFF3_FILE) == 0); - git_buf_free(&conflicting_buf); - - cl_assert(merge_test_index(repo_index, merge_index_entries, 8)); - cl_assert(merge_test_reuc(repo_index, merge_reuc_entries, 3)); -} - -void test_merge_workdir_simple__union(void) -{ - git_buf conflicting_buf = GIT_BUF_INIT; - - struct merge_index_entry merge_index_entries[] = { - ADDED_IN_MASTER_INDEX_ENTRY, - AUTOMERGEABLE_INDEX_ENTRY, - CHANGED_IN_BRANCH_INDEX_ENTRY, - CHANGED_IN_MASTER_INDEX_ENTRY, - - { 0100644, "72cdb057b340205164478565e91eb71647e66891", 0, "conflicting.txt" }, - - UNCHANGED_INDEX_ENTRY, - }; - - struct merge_reuc_entry merge_reuc_entries[] = { - AUTOMERGEABLE_REUC_ENTRY, - CONFLICTING_REUC_ENTRY, - REMOVED_IN_BRANCH_REUC_ENTRY, - REMOVED_IN_MASTER_REUC_ENTRY - }; - - set_core_autocrlf_to(repo, false); - - merge_simple_branch(GIT_MERGE_FILE_FAVOR_UNION, 0); - - cl_git_pass(git_futils_readbuffer(&conflicting_buf, - TEST_REPO_PATH "/conflicting.txt")); - cl_assert(strcmp(conflicting_buf.ptr, CONFLICTING_UNION_FILE) == 0); - git_buf_free(&conflicting_buf); - - cl_assert(merge_test_index(repo_index, merge_index_entries, 6)); - cl_assert(merge_test_reuc(repo_index, merge_reuc_entries, 4)); -} - -void test_merge_workdir_simple__diff3_from_config(void) -{ - git_config *config; - git_buf conflicting_buf = GIT_BUF_INIT; - - struct merge_index_entry merge_index_entries[] = { - ADDED_IN_MASTER_INDEX_ENTRY, - AUTOMERGEABLE_INDEX_ENTRY, - CHANGED_IN_BRANCH_INDEX_ENTRY, - CHANGED_IN_MASTER_INDEX_ENTRY, - - { 0100644, "d427e0b2e138501a3d15cc376077a3631e15bd46", 1, "conflicting.txt" }, - { 0100644, "4e886e602529caa9ab11d71f86634bd1b6e0de10", 2, "conflicting.txt" }, - { 0100644, "2bd0a343aeef7a2cf0d158478966a6e587ff3863", 3, "conflicting.txt" }, - - UNCHANGED_INDEX_ENTRY, - }; - - struct merge_reuc_entry merge_reuc_entries[] = { - AUTOMERGEABLE_REUC_ENTRY, - REMOVED_IN_BRANCH_REUC_ENTRY, - REMOVED_IN_MASTER_REUC_ENTRY - }; - - cl_git_pass(git_repository_config(&config, repo)); - cl_git_pass(git_config_set_string(config, "merge.conflictstyle", "diff3")); - - set_core_autocrlf_to(repo, false); - - merge_simple_branch(0, 0); - - cl_git_pass(git_futils_readbuffer(&conflicting_buf, - TEST_REPO_PATH "/conflicting.txt")); - cl_assert(strcmp(conflicting_buf.ptr, CONFLICTING_DIFF3_FILE) == 0); - git_buf_free(&conflicting_buf); - - cl_assert(merge_test_index(repo_index, merge_index_entries, 8)); - cl_assert(merge_test_reuc(repo_index, merge_reuc_entries, 3)); - - git_config_free(config); -} - -void test_merge_workdir_simple__merge_overrides_config(void) -{ - git_config *config; - git_buf conflicting_buf = GIT_BUF_INIT; - - struct merge_index_entry merge_index_entries[] = { - ADDED_IN_MASTER_INDEX_ENTRY, - AUTOMERGEABLE_INDEX_ENTRY, - CHANGED_IN_BRANCH_INDEX_ENTRY, - CHANGED_IN_MASTER_INDEX_ENTRY, - - { 0100644, "d427e0b2e138501a3d15cc376077a3631e15bd46", 1, "conflicting.txt" }, - { 0100644, "4e886e602529caa9ab11d71f86634bd1b6e0de10", 2, "conflicting.txt" }, - { 0100644, "2bd0a343aeef7a2cf0d158478966a6e587ff3863", 3, "conflicting.txt" }, - - UNCHANGED_INDEX_ENTRY, - }; - - struct merge_reuc_entry merge_reuc_entries[] = { - AUTOMERGEABLE_REUC_ENTRY, - REMOVED_IN_BRANCH_REUC_ENTRY, - REMOVED_IN_MASTER_REUC_ENTRY - }; - - cl_git_pass(git_repository_config(&config, repo)); - cl_git_pass(git_config_set_string(config, "merge.conflictstyle", "diff3")); - - set_core_autocrlf_to(repo, false); - - merge_simple_branch(0, GIT_CHECKOUT_CONFLICT_STYLE_MERGE); - - cl_git_pass(git_futils_readbuffer(&conflicting_buf, - TEST_REPO_PATH "/conflicting.txt")); - cl_assert(strcmp(conflicting_buf.ptr, CONFLICTING_MERGE_FILE) == 0); - git_buf_free(&conflicting_buf); - - cl_assert(merge_test_index(repo_index, merge_index_entries, 8)); - cl_assert(merge_test_reuc(repo_index, merge_reuc_entries, 3)); - - git_config_free(config); -} - -void test_merge_workdir_simple__checkout_ours(void) -{ - struct merge_index_entry merge_index_entries[] = { - ADDED_IN_MASTER_INDEX_ENTRY, - AUTOMERGEABLE_INDEX_ENTRY, - CHANGED_IN_BRANCH_INDEX_ENTRY, - CHANGED_IN_MASTER_INDEX_ENTRY, - - { 0100644, "d427e0b2e138501a3d15cc376077a3631e15bd46", 1, "conflicting.txt" }, - { 0100644, "4e886e602529caa9ab11d71f86634bd1b6e0de10", 2, "conflicting.txt" }, - { 0100644, "2bd0a343aeef7a2cf0d158478966a6e587ff3863", 3, "conflicting.txt" }, - - UNCHANGED_INDEX_ENTRY, - }; - - struct merge_reuc_entry merge_reuc_entries[] = { - AUTOMERGEABLE_REUC_ENTRY, - REMOVED_IN_BRANCH_REUC_ENTRY, - REMOVED_IN_MASTER_REUC_ENTRY - }; - - merge_simple_branch(0, GIT_CHECKOUT_SAFE | GIT_CHECKOUT_USE_OURS); - - cl_assert(merge_test_index(repo_index, merge_index_entries, 8)); - cl_assert(merge_test_reuc(repo_index, merge_reuc_entries, 3)); - - cl_assert(git_path_exists(TEST_REPO_PATH "/conflicting.txt")); -} - -void test_merge_workdir_simple__favor_ours(void) -{ - struct merge_index_entry merge_index_entries[] = { - ADDED_IN_MASTER_INDEX_ENTRY, - AUTOMERGEABLE_INDEX_ENTRY, - CHANGED_IN_BRANCH_INDEX_ENTRY, - CHANGED_IN_MASTER_INDEX_ENTRY, - { 0100644, "4e886e602529caa9ab11d71f86634bd1b6e0de10", 0, "conflicting.txt" }, - UNCHANGED_INDEX_ENTRY, - }; - - struct merge_reuc_entry merge_reuc_entries[] = { - AUTOMERGEABLE_REUC_ENTRY, - CONFLICTING_REUC_ENTRY, - REMOVED_IN_BRANCH_REUC_ENTRY, - REMOVED_IN_MASTER_REUC_ENTRY, - }; - - merge_simple_branch(GIT_MERGE_FILE_FAVOR_OURS, 0); - - cl_assert(merge_test_index(repo_index, merge_index_entries, 6)); - cl_assert(merge_test_reuc(repo_index, merge_reuc_entries, 4)); -} - -void test_merge_workdir_simple__favor_theirs(void) -{ - struct merge_index_entry merge_index_entries[] = { - ADDED_IN_MASTER_INDEX_ENTRY, - AUTOMERGEABLE_INDEX_ENTRY, - CHANGED_IN_BRANCH_INDEX_ENTRY, - CHANGED_IN_MASTER_INDEX_ENTRY, - { 0100644, "2bd0a343aeef7a2cf0d158478966a6e587ff3863", 0, "conflicting.txt" }, - UNCHANGED_INDEX_ENTRY, - }; - - struct merge_reuc_entry merge_reuc_entries[] = { - AUTOMERGEABLE_REUC_ENTRY, - CONFLICTING_REUC_ENTRY, - REMOVED_IN_BRANCH_REUC_ENTRY, - REMOVED_IN_MASTER_REUC_ENTRY, - }; - - merge_simple_branch(GIT_MERGE_FILE_FAVOR_THEIRS, 0); - - cl_assert(merge_test_index(repo_index, merge_index_entries, 6)); - cl_assert(merge_test_reuc(repo_index, merge_reuc_entries, 4)); -} - -void test_merge_workdir_simple__directory_file(void) -{ - git_reference *head; - git_oid their_oids[1], head_commit_id; - git_annotated_commit *their_heads[1]; - git_merge_options merge_opts = GIT_MERGE_OPTIONS_INIT; - git_commit *head_commit; - - struct merge_index_entry merge_index_entries[] = { - { 0100644, "49130a28ef567af9a6a6104c38773fedfa5f9742", 2, "dir-10" }, - { 0100644, "6c06dcd163587c2cc18be44857e0b71116382aeb", 3, "dir-10" }, - { 0100644, "43aafd43bea779ec74317dc361f45ae3f532a505", 0, "dir-6" }, - { 0100644, "a031a28ae70e33a641ce4b8a8f6317f1ab79dee4", 3, "dir-7" }, - { 0100644, "5012fd565b1393bdfda1805d4ec38ce6619e1fd1", 1, "dir-7/file.txt" }, - { 0100644, "a5563304ddf6caba25cb50323a2ea6f7dbfcadca", 2, "dir-7/file.txt" }, - { 0100644, "e9ad6ec3e38364a3d07feda7c4197d4d845c53b5", 0, "dir-8" }, - { 0100644, "3ef4d30382ca33fdeba9fda895a99e0891ba37aa", 2, "dir-9" }, - { 0100644, "fc4c636d6515e9e261f9260dbcf3cc6eca97ea08", 1, "dir-9/file.txt" }, - { 0100644, "76ab0e2868197ec158ddd6c78d8a0d2fd73d38f9", 3, "dir-9/file.txt" }, - { 0100644, "5c2411f8075f48a6b2fdb85ebc0d371747c4df15", 0, "file-1/new" }, - { 0100644, "a39a620dae5bc8b4e771cd4d251b7d080401a21e", 1, "file-2" }, - { 0100644, "d963979c237d08b6ba39062ee7bf64c7d34a27f8", 2, "file-2" }, - { 0100644, "5c341ead2ba6f2af98ce5ec3fe84f6b6d2899c0d", 0, "file-2/new" }, - { 0100644, "9efe7723802d4305142eee177e018fee1572c4f4", 0, "file-3/new" }, - { 0100644, "bacac9b3493509aa15e1730e1545fc0919d1dae0", 1, "file-4" }, - { 0100644, "7663fce0130db092936b137cabd693ec234eb060", 3, "file-4" }, - { 0100644, "e49f917b448d1340b31d76e54ba388268fd4c922", 0, "file-4/new" }, - { 0100644, "cab2cf23998b40f1af2d9d9a756dc9e285a8df4b", 2, "file-5/new" }, - { 0100644, "f5504f36e6f4eb797a56fc5bac6c6c7f32969bf2", 3, "file-5/new" }, - }; - - cl_git_pass(git_reference_symbolic_create(&head, repo, GIT_HEAD_FILE, GIT_REFS_HEADS_DIR OURS_DIRECTORY_FILE, 1, NULL)); - cl_git_pass(git_reference_name_to_id(&head_commit_id, repo, GIT_HEAD_FILE)); - cl_git_pass(git_commit_lookup(&head_commit, repo, &head_commit_id)); - cl_git_pass(git_reset(repo, (git_object *)head_commit, GIT_RESET_HARD, NULL)); - - cl_git_pass(git_oid_fromstr(&their_oids[0], THEIRS_DIRECTORY_FILE)); - cl_git_pass(git_annotated_commit_lookup(&their_heads[0], repo, &their_oids[0])); - - merge_opts.file_favor = 0; - cl_git_pass(git_merge(repo, (const git_annotated_commit **)their_heads, 1, &merge_opts, NULL)); - - cl_assert(merge_test_index(repo_index, merge_index_entries, 20)); - - git_reference_free(head); - git_commit_free(head_commit); - git_annotated_commit_free(their_heads[0]); -} - -void test_merge_workdir_simple__unrelated(void) -{ - git_oid their_oids[1]; - git_annotated_commit *their_heads[1]; - git_merge_options merge_opts = GIT_MERGE_OPTIONS_INIT; - - struct merge_index_entry merge_index_entries[] = { - { 0100644, "233c0919c998ed110a4b6ff36f353aec8b713487", 0, "added-in-master.txt" }, - { 0100644, "ee3fa1b8c00aff7fe02065fdb50864bb0d932ccf", 0, "automergeable.txt" }, - { 0100644, "ab6c44a2e84492ad4b41bb6bac87353e9d02ac8b", 0, "changed-in-branch.txt" }, - { 0100644, "11deab00b2d3a6f5a3073988ac050c2d7b6655e2", 0, "changed-in-master.txt" }, - { 0100644, "4e886e602529caa9ab11d71f86634bd1b6e0de10", 0, "conflicting.txt" }, - { 0100644, "ef58fdd8086c243bdc81f99e379acacfd21d32d6", 0, "new-in-unrelated1.txt" }, - { 0100644, "948ba6e701c1edab0c2d394fb7c5538334129793", 0, "new-in-unrelated2.txt" }, - { 0100644, "dfe3f22baa1f6fce5447901c3086bae368de6bdd", 0, "removed-in-branch.txt" }, - { 0100644, "c8f06f2e3bb2964174677e91f0abead0e43c9e5d", 0, "unchanged.txt" }, - }; - - cl_git_pass(git_oid_fromstr(&their_oids[0], THEIRS_UNRELATED_PARENT)); - cl_git_pass(git_annotated_commit_lookup(&their_heads[0], repo, &their_oids[0])); - - merge_opts.file_favor = 0; - cl_git_pass(git_merge(repo, (const git_annotated_commit **)their_heads, 1, &merge_opts, NULL)); - - cl_assert(merge_test_index(repo_index, merge_index_entries, 9)); - - git_annotated_commit_free(their_heads[0]); -} - -void test_merge_workdir_simple__unrelated_with_conflicts(void) -{ - git_oid their_oids[1]; - git_annotated_commit *their_heads[1]; - git_merge_options merge_opts = GIT_MERGE_OPTIONS_INIT; - - struct merge_index_entry merge_index_entries[] = { - { 0100644, "233c0919c998ed110a4b6ff36f353aec8b713487", 0, "added-in-master.txt" }, - { 0100644, "ee3fa1b8c00aff7fe02065fdb50864bb0d932ccf", 2, "automergeable.txt" }, - { 0100644, "d07ec190c306ec690bac349e87d01c4358e49bb2", 3, "automergeable.txt" }, - { 0100644, "ab6c44a2e84492ad4b41bb6bac87353e9d02ac8b", 0, "changed-in-branch.txt" }, - { 0100644, "11deab00b2d3a6f5a3073988ac050c2d7b6655e2", 0, "changed-in-master.txt" }, - { 0100644, "4e886e602529caa9ab11d71f86634bd1b6e0de10", 2, "conflicting.txt" }, - { 0100644, "4b253da36a0ae8bfce63aeabd8c5b58429925594", 3, "conflicting.txt" }, - { 0100644, "ef58fdd8086c243bdc81f99e379acacfd21d32d6", 0, "new-in-unrelated1.txt" }, - { 0100644, "948ba6e701c1edab0c2d394fb7c5538334129793", 0, "new-in-unrelated2.txt" }, - { 0100644, "dfe3f22baa1f6fce5447901c3086bae368de6bdd", 0, "removed-in-branch.txt" }, - { 0100644, "c8f06f2e3bb2964174677e91f0abead0e43c9e5d", 0, "unchanged.txt" }, - }; - - cl_git_pass(git_oid_fromstr(&their_oids[0], THEIRS_UNRELATED_OID)); - cl_git_pass(git_annotated_commit_lookup(&their_heads[0], repo, &their_oids[0])); - - merge_opts.file_favor = 0; - cl_git_pass(git_merge(repo, (const git_annotated_commit **)their_heads, 1, &merge_opts, NULL)); - - cl_assert(merge_test_index(repo_index, merge_index_entries, 11)); - - git_annotated_commit_free(their_heads[0]); -} - -void test_merge_workdir_simple__binary(void) -{ - git_oid our_oid, their_oid, our_file_oid; - git_commit *our_commit; - git_annotated_commit *their_head; - const git_index_entry *binary_entry; - - struct merge_index_entry merge_index_entries[] = { - { 0100644, "1c51d885170f57a0c4e8c69ff6363d91a5b51f85", 1, "binary" }, - { 0100644, "23ed141a6ae1e798b2f721afedbe947c119111ba", 2, "binary" }, - { 0100644, "836b8b82b26cab22eaaed8820877c76d6c8bca19", 3, "binary" }, - }; - - cl_git_pass(git_oid_fromstr(&our_oid, "cc338e4710c9b257106b8d16d82f86458d5beaf1")); - cl_git_pass(git_oid_fromstr(&their_oid, "ad01aebfdf2ac13145efafe3f9fcf798882f1730")); - - cl_git_pass(git_commit_lookup(&our_commit, repo, &our_oid)); - cl_git_pass(git_reset(repo, (git_object *)our_commit, GIT_RESET_HARD, NULL)); - - cl_git_pass(git_annotated_commit_lookup(&their_head, repo, &their_oid)); - - cl_git_pass(git_merge(repo, (const git_annotated_commit **)&their_head, 1, NULL, NULL)); - - cl_assert(merge_test_index(repo_index, merge_index_entries, 3)); - - cl_git_pass(git_index_add_bypath(repo_index, "binary")); - cl_assert((binary_entry = git_index_get_bypath(repo_index, "binary", 0)) != NULL); - - cl_git_pass(git_oid_fromstr(&our_file_oid, "23ed141a6ae1e798b2f721afedbe947c119111ba")); - cl_assert(git_oid_cmp(&binary_entry->id, &our_file_oid) == 0); - - git_annotated_commit_free(their_head); - git_commit_free(our_commit); -} diff --git a/vendor/libgit2/tests/merge/workdir/submodules.c b/vendor/libgit2/tests/merge/workdir/submodules.c deleted file mode 100644 index 7c18c2ffb8..0000000000 --- a/vendor/libgit2/tests/merge/workdir/submodules.c +++ /dev/null @@ -1,95 +0,0 @@ -#include "clar_libgit2.h" -#include "git2/repository.h" -#include "git2/merge.h" -#include "buffer.h" -#include "merge.h" -#include "../merge_helpers.h" - -static git_repository *repo; - -#define TEST_REPO_PATH "merge-resolve" - -#define SUBMODULE_MAIN_BRANCH "submodules" -#define SUBMODULE_OTHER_BRANCH "submodules-branch" -#define SUBMODULE_OTHER2_BRANCH "submodules-branch2" - -#define TEST_INDEX_PATH TEST_REPO_PATH "/.git/index" - -// Fixture setup and teardown -void test_merge_workdir_submodules__initialize(void) -{ - repo = cl_git_sandbox_init(TEST_REPO_PATH); -} - -void test_merge_workdir_submodules__cleanup(void) -{ - cl_git_sandbox_cleanup(); -} - -void test_merge_workdir_submodules__automerge(void) -{ - git_reference *our_ref, *their_ref; - git_commit *our_commit; - git_annotated_commit *their_head; - git_index *index; - - struct merge_index_entry merge_index_entries[] = { - { 0100644, "caff6b7d44973f53e3e0cf31d0d695188b19aec6", 0, ".gitmodules" }, - { 0100644, "950a663a6a7b2609eed1ed1ba9f41eb1a3192a9f", 0, "file1.txt" }, - { 0100644, "343e660b9cb4bee5f407c2e33fcb9df24d9407a4", 0, "file2.txt" }, - { 0160000, "d3d806a4bef96889117fd7ebac0e3cb5ec152932", 1, "submodule" }, - { 0160000, "297aa6cd028b3336c7802c7a6f49143da4e1602d", 2, "submodule" }, - { 0160000, "ae39c77c70cb6bad18bb471912460c4e1ba0f586", 3, "submodule" }, - }; - - cl_git_pass(git_reference_lookup(&our_ref, repo, "refs/heads/" SUBMODULE_MAIN_BRANCH)); - cl_git_pass(git_commit_lookup(&our_commit, repo, git_reference_target(our_ref))); - cl_git_pass(git_reset(repo, (git_object *)our_commit, GIT_RESET_HARD, NULL)); - - cl_git_pass(git_reference_lookup(&their_ref, repo, "refs/heads/" SUBMODULE_OTHER_BRANCH)); - cl_git_pass(git_annotated_commit_from_ref(&their_head, repo, their_ref)); - - cl_git_pass(git_merge(repo, (const git_annotated_commit **)&their_head, 1, NULL, NULL)); - - cl_git_pass(git_repository_index(&index, repo)); - cl_assert(merge_test_index(index, merge_index_entries, 6)); - - git_index_free(index); - git_annotated_commit_free(their_head); - git_commit_free(our_commit); - git_reference_free(their_ref); - git_reference_free(our_ref); -} - -void test_merge_workdir_submodules__take_changed(void) -{ - git_reference *our_ref, *their_ref; - git_commit *our_commit; - git_annotated_commit *their_head; - git_index *index; - - struct merge_index_entry merge_index_entries[] = { - { 0100644, "caff6b7d44973f53e3e0cf31d0d695188b19aec6", 0, ".gitmodules" }, - { 0100644, "b438ff23300b2e0f80b84a6f30140dfa91e71423", 0, "file1.txt" }, - { 0100644, "f27fbafdfa6693f8f7a5128506fe3e338dbfcad2", 0, "file2.txt" }, - { 0160000, "297aa6cd028b3336c7802c7a6f49143da4e1602d", 0, "submodule" }, - }; - - cl_git_pass(git_reference_lookup(&our_ref, repo, "refs/heads/" SUBMODULE_MAIN_BRANCH)); - cl_git_pass(git_commit_lookup(&our_commit, repo, git_reference_target(our_ref))); - cl_git_pass(git_reset(repo, (git_object *)our_commit, GIT_RESET_HARD, NULL)); - - cl_git_pass(git_reference_lookup(&their_ref, repo, "refs/heads/" SUBMODULE_OTHER2_BRANCH)); - cl_git_pass(git_annotated_commit_from_ref(&their_head, repo, their_ref)); - - cl_git_pass(git_merge(repo, (const git_annotated_commit **)&their_head, 1, NULL, NULL)); - - cl_git_pass(git_repository_index(&index, repo)); - cl_assert(merge_test_index(index, merge_index_entries, 4)); - - git_index_free(index); - git_annotated_commit_free(their_head); - git_commit_free(our_commit); - git_reference_free(their_ref); - git_reference_free(our_ref); -} diff --git a/vendor/libgit2/tests/merge/workdir/trivial.c b/vendor/libgit2/tests/merge/workdir/trivial.c deleted file mode 100644 index 4ddaf233de..0000000000 --- a/vendor/libgit2/tests/merge/workdir/trivial.c +++ /dev/null @@ -1,262 +0,0 @@ -#include "clar_libgit2.h" -#include "git2/repository.h" -#include "git2/merge.h" -#include "git2/sys/index.h" -#include "merge.h" -#include "../merge_helpers.h" -#include "refs.h" -#include "fileops.h" - -static git_repository *repo; -static git_index *repo_index; - -#define TEST_REPO_PATH "merge-resolve" -#define TEST_INDEX_PATH TEST_REPO_PATH "/.git/index" - - -// Fixture setup and teardown -void test_merge_workdir_trivial__initialize(void) -{ - repo = cl_git_sandbox_init(TEST_REPO_PATH); - git_repository_index(&repo_index, repo); -} - -void test_merge_workdir_trivial__cleanup(void) -{ - git_index_free(repo_index); - cl_git_sandbox_cleanup(); -} - - -static int merge_trivial(const char *ours, const char *theirs) -{ - git_buf branch_buf = GIT_BUF_INIT; - git_checkout_options checkout_opts = GIT_CHECKOUT_OPTIONS_INIT; - git_reference *our_ref, *their_ref; - git_annotated_commit *their_heads[1]; - - checkout_opts.checkout_strategy = GIT_CHECKOUT_FORCE; - - git_buf_printf(&branch_buf, "%s%s", GIT_REFS_HEADS_DIR, ours); - cl_git_pass(git_reference_symbolic_create(&our_ref, repo, "HEAD", branch_buf.ptr, 1, NULL)); - - cl_git_pass(git_checkout_head(repo, &checkout_opts)); - - git_buf_clear(&branch_buf); - git_buf_printf(&branch_buf, "%s%s", GIT_REFS_HEADS_DIR, theirs); - cl_git_pass(git_reference_lookup(&their_ref, repo, branch_buf.ptr)); - cl_git_pass(git_annotated_commit_from_ref(&their_heads[0], repo, their_ref)); - - cl_git_pass(git_merge(repo, (const git_annotated_commit **)their_heads, 1, NULL, NULL)); - - git_buf_free(&branch_buf); - git_reference_free(our_ref); - git_reference_free(their_ref); - git_annotated_commit_free(their_heads[0]); - - return 0; -} - -static size_t merge_trivial_conflict_entrycount(void) -{ - const git_index_entry *entry; - size_t count = 0; - size_t i; - - for (i = 0; i < git_index_entrycount(repo_index); i++) { - cl_assert(entry = git_index_get_byindex(repo_index, i)); - - if (git_index_entry_is_conflict(entry)) - count++; - } - - return count; -} - -/* 2ALT: ancest:(empty)+, head:*empty*, remote:remote = result:remote */ -void test_merge_workdir_trivial__2alt(void) -{ - const git_index_entry *entry; - - cl_git_pass(merge_trivial("trivial-2alt", "trivial-2alt-branch")); - - cl_assert(entry = git_index_get_bypath(repo_index, "new-in-branch.txt", 0)); - cl_assert(git_index_reuc_entrycount(repo_index) == 0); - cl_assert(merge_trivial_conflict_entrycount() == 0); -} - -/* 3ALT: ancest:(empty)+, head:head, remote:*empty* = result:head */ -void test_merge_workdir_trivial__3alt(void) -{ - const git_index_entry *entry; - - cl_git_pass(merge_trivial("trivial-3alt", "trivial-3alt-branch")); - - cl_assert(entry = git_index_get_bypath(repo_index, "new-in-3alt.txt", 0)); - cl_assert(git_index_reuc_entrycount(repo_index) == 0); - cl_assert(merge_trivial_conflict_entrycount() == 0); -} - -/* 4: ancest:(empty)^, head:head, remote:remote = result:no merge */ -void test_merge_workdir_trivial__4(void) -{ - const git_index_entry *entry; - - cl_git_pass(merge_trivial("trivial-4", "trivial-4-branch")); - - cl_assert((entry = git_index_get_bypath(repo_index, "new-and-different.txt", 0)) == NULL); - cl_assert(git_index_reuc_entrycount(repo_index) == 0); - - cl_assert(merge_trivial_conflict_entrycount() == 2); - cl_assert(entry = git_index_get_bypath(repo_index, "new-and-different.txt", 2)); - cl_assert(entry = git_index_get_bypath(repo_index, "new-and-different.txt", 3)); -} - -/* 5ALT: ancest:*, head:head, remote:head = result:head */ -void test_merge_workdir_trivial__5alt_1(void) -{ - const git_index_entry *entry; - - cl_git_pass(merge_trivial("trivial-5alt-1", "trivial-5alt-1-branch")); - - cl_assert(entry = git_index_get_bypath(repo_index, "new-and-same.txt", 0)); - cl_assert(git_index_reuc_entrycount(repo_index) == 0); - cl_assert(merge_trivial_conflict_entrycount() == 0); -} - -/* 5ALT: ancest:*, head:head, remote:head = result:head */ -void test_merge_workdir_trivial__5alt_2(void) -{ - const git_index_entry *entry; - - cl_git_pass(merge_trivial("trivial-5alt-2", "trivial-5alt-2-branch")); - - cl_assert(entry = git_index_get_bypath(repo_index, "modified-to-same.txt", 0)); - cl_assert(git_index_reuc_entrycount(repo_index) == 0); - cl_assert(merge_trivial_conflict_entrycount() == 0); -} - -/* 6: ancest:ancest+, head:(empty), remote:(empty) = result:no merge */ -void test_merge_workdir_trivial__6(void) -{ - const git_index_entry *entry; - const git_index_reuc_entry *reuc; - - cl_git_pass(merge_trivial("trivial-6", "trivial-6-branch")); - - cl_assert((entry = git_index_get_bypath(repo_index, "removed-in-both.txt", 0)) == NULL); - cl_assert(git_index_reuc_entrycount(repo_index) == 1); - cl_assert(reuc = git_index_reuc_get_bypath(repo_index, "removed-in-both.txt")); - - cl_assert(merge_trivial_conflict_entrycount() == 0); -} - -/* 8: ancest:ancest^, head:(empty), remote:ancest = result:no merge */ -void test_merge_workdir_trivial__8(void) -{ - const git_index_entry *entry; - const git_index_reuc_entry *reuc; - - cl_git_pass(merge_trivial("trivial-8", "trivial-8-branch")); - - cl_assert((entry = git_index_get_bypath(repo_index, "removed-in-8.txt", 0)) == NULL); - - cl_assert(git_index_reuc_entrycount(repo_index) == 1); - cl_assert(reuc = git_index_reuc_get_bypath(repo_index, "removed-in-8.txt")); - - cl_assert(merge_trivial_conflict_entrycount() == 0); -} - -/* 7: ancest:ancest+, head:(empty), remote:remote = result:no merge */ -void test_merge_workdir_trivial__7(void) -{ - const git_index_entry *entry; - - cl_git_pass(merge_trivial("trivial-7", "trivial-7-branch")); - - cl_assert((entry = git_index_get_bypath(repo_index, "removed-in-7.txt", 0)) == NULL); - cl_assert(git_index_reuc_entrycount(repo_index) == 0); - - cl_assert(merge_trivial_conflict_entrycount() == 2); - cl_assert(entry = git_index_get_bypath(repo_index, "removed-in-7.txt", 1)); - cl_assert(entry = git_index_get_bypath(repo_index, "removed-in-7.txt", 3)); -} - -/* 10: ancest:ancest^, head:ancest, remote:(empty) = result:no merge */ -void test_merge_workdir_trivial__10(void) -{ - const git_index_entry *entry; - const git_index_reuc_entry *reuc; - - cl_git_pass(merge_trivial("trivial-10", "trivial-10-branch")); - - cl_assert((entry = git_index_get_bypath(repo_index, "removed-in-10-branch.txt", 0)) == NULL); - - cl_assert(git_index_reuc_entrycount(repo_index) == 1); - cl_assert(reuc = git_index_reuc_get_bypath(repo_index, "removed-in-10-branch.txt")); - - cl_assert(merge_trivial_conflict_entrycount() == 0); -} - -/* 9: ancest:ancest+, head:head, remote:(empty) = result:no merge */ -void test_merge_workdir_trivial__9(void) -{ - const git_index_entry *entry; - - cl_git_pass(merge_trivial("trivial-9", "trivial-9-branch")); - - cl_assert((entry = git_index_get_bypath(repo_index, "removed-in-9-branch.txt", 0)) == NULL); - cl_assert(git_index_reuc_entrycount(repo_index) == 0); - - cl_assert(merge_trivial_conflict_entrycount() == 2); - cl_assert(entry = git_index_get_bypath(repo_index, "removed-in-9-branch.txt", 1)); - cl_assert(entry = git_index_get_bypath(repo_index, "removed-in-9-branch.txt", 2)); -} - -/* 13: ancest:ancest+, head:head, remote:ancest = result:head */ -void test_merge_workdir_trivial__13(void) -{ - const git_index_entry *entry; - git_oid expected_oid; - - cl_git_pass(merge_trivial("trivial-13", "trivial-13-branch")); - - cl_assert(entry = git_index_get_bypath(repo_index, "modified-in-13.txt", 0)); - cl_git_pass(git_oid_fromstr(&expected_oid, "1cff9ec6a47a537380dedfdd17c9e76d74259a2b")); - cl_assert(git_oid_cmp(&entry->id, &expected_oid) == 0); - - cl_assert(git_index_reuc_entrycount(repo_index) == 0); - cl_assert(merge_trivial_conflict_entrycount() == 0); -} - -/* 14: ancest:ancest+, head:ancest, remote:remote = result:remote */ -void test_merge_workdir_trivial__14(void) -{ - const git_index_entry *entry; - git_oid expected_oid; - - cl_git_pass(merge_trivial("trivial-14", "trivial-14-branch")); - - cl_assert(entry = git_index_get_bypath(repo_index, "modified-in-14-branch.txt", 0)); - cl_git_pass(git_oid_fromstr(&expected_oid, "26153a3ff3649b6c2bb652d3f06878c6e0a172f9")); - cl_assert(git_oid_cmp(&entry->id, &expected_oid) == 0); - - cl_assert(git_index_reuc_entrycount(repo_index) == 0); - cl_assert(merge_trivial_conflict_entrycount() == 0); -} - -/* 11: ancest:ancest+, head:head, remote:remote = result:no merge */ -void test_merge_workdir_trivial__11(void) -{ - const git_index_entry *entry; - - cl_git_pass(merge_trivial("trivial-11", "trivial-11-branch")); - - cl_assert((entry = git_index_get_bypath(repo_index, "modified-in-both.txt", 0)) == NULL); - cl_assert(git_index_reuc_entrycount(repo_index) == 0); - - cl_assert(merge_trivial_conflict_entrycount() == 3); - cl_assert(entry = git_index_get_bypath(repo_index, "modified-in-both.txt", 1)); - cl_assert(entry = git_index_get_bypath(repo_index, "modified-in-both.txt", 2)); - cl_assert(entry = git_index_get_bypath(repo_index, "modified-in-both.txt", 3)); -} diff --git a/vendor/libgit2/tests/network/cred.c b/vendor/libgit2/tests/network/cred.c deleted file mode 100644 index 6994cc0c36..0000000000 --- a/vendor/libgit2/tests/network/cred.c +++ /dev/null @@ -1,50 +0,0 @@ -#include "clar_libgit2.h" - -#include "git2/cred_helpers.h" - -void test_network_cred__stock_userpass_validates_args(void) -{ - git_cred_userpass_payload payload = {0}; - - cl_git_fail(git_cred_userpass(NULL, NULL, NULL, 0, NULL)); - - payload.username = "user"; - cl_git_fail(git_cred_userpass(NULL, NULL, NULL, 0, &payload)); - - payload.username = NULL; - payload.username = "pass"; - cl_git_fail(git_cred_userpass(NULL, NULL, NULL, 0, &payload)); -} - -void test_network_cred__stock_userpass_validates_that_method_is_allowed(void) -{ - git_cred *cred; - git_cred_userpass_payload payload = {"user", "pass"}; - - cl_git_fail(git_cred_userpass(&cred, NULL, NULL, 0, &payload)); - cl_git_pass(git_cred_userpass(&cred, NULL, NULL, GIT_CREDTYPE_USERPASS_PLAINTEXT, &payload)); - cred->free(cred); -} - -void test_network_cred__stock_userpass_properly_handles_username_in_url(void) -{ - git_cred *cred; - git_cred_userpass_plaintext *plain; - git_cred_userpass_payload payload = {"alice", "password"}; - - cl_git_pass(git_cred_userpass(&cred, NULL, NULL, GIT_CREDTYPE_USERPASS_PLAINTEXT, &payload)); - plain = (git_cred_userpass_plaintext*)cred; - cl_assert_equal_s(plain->username, "alice"); - cred->free(cred); - - cl_git_pass(git_cred_userpass(&cred, NULL, "bob", GIT_CREDTYPE_USERPASS_PLAINTEXT, &payload)); - plain = (git_cred_userpass_plaintext*)cred; - cl_assert_equal_s(plain->username, "alice"); - cred->free(cred); - - payload.username = NULL; - cl_git_pass(git_cred_userpass(&cred, NULL, "bob", GIT_CREDTYPE_USERPASS_PLAINTEXT, &payload)); - plain = (git_cred_userpass_plaintext*)cred; - cl_assert_equal_s(plain->username, "bob"); - cred->free(cred); -} diff --git a/vendor/libgit2/tests/network/fetchlocal.c b/vendor/libgit2/tests/network/fetchlocal.c deleted file mode 100644 index 06ee3dd36a..0000000000 --- a/vendor/libgit2/tests/network/fetchlocal.c +++ /dev/null @@ -1,491 +0,0 @@ -#include "clar_libgit2.h" - -#include "buffer.h" -#include "path.h" -#include "remote.h" - -static const char* tagger_name = "Vicent Marti"; -static const char* tagger_email = "vicent@github.com"; -static const char* tagger_message = "This is my tag.\n\nThere are many tags, but this one is mine\n"; - -static int transfer_cb(const git_transfer_progress *stats, void *payload) -{ - int *callcount = (int*)payload; - GIT_UNUSED(stats); - (*callcount)++; - return 0; -} - -static void cleanup_local_repo(void *path) -{ - cl_fixture_cleanup((char *)path); -} - -void test_network_fetchlocal__cleanup(void) -{ - cl_git_sandbox_cleanup(); -} - -void test_network_fetchlocal__complete(void) -{ - git_repository *repo; - git_remote *origin; - int callcount = 0; - git_strarray refnames = {0}; - - const char *url = cl_git_fixture_url("testrepo.git"); - git_fetch_options options = GIT_FETCH_OPTIONS_INIT; - - options.callbacks.transfer_progress = transfer_cb; - options.callbacks.payload = &callcount; - - cl_set_cleanup(&cleanup_local_repo, "foo"); - cl_git_pass(git_repository_init(&repo, "foo", true)); - - cl_git_pass(git_remote_create(&origin, repo, GIT_REMOTE_ORIGIN, url)); - cl_git_pass(git_remote_fetch(origin, NULL, &options, NULL)); - - cl_git_pass(git_reference_list(&refnames, repo)); - cl_assert_equal_i(19, (int)refnames.count); - cl_assert(callcount > 0); - - git_strarray_free(&refnames); - git_remote_free(origin); - git_repository_free(repo); -} - -void test_network_fetchlocal__prune(void) -{ - git_repository *repo; - git_remote *origin; - int callcount = 0; - git_strarray refnames = {0}; - git_reference *ref; - git_repository *remote_repo = cl_git_sandbox_init("testrepo.git"); - const char *url = cl_git_path_url(git_repository_path(remote_repo)); - git_fetch_options options = GIT_FETCH_OPTIONS_INIT; - - options.callbacks.transfer_progress = transfer_cb; - options.callbacks.payload = &callcount; - - cl_set_cleanup(&cleanup_local_repo, "foo"); - cl_git_pass(git_repository_init(&repo, "foo", true)); - - cl_git_pass(git_remote_create(&origin, repo, GIT_REMOTE_ORIGIN, url)); - cl_git_pass(git_remote_fetch(origin, NULL, &options, NULL)); - - cl_git_pass(git_reference_list(&refnames, repo)); - cl_assert_equal_i(19, (int)refnames.count); - cl_assert(callcount > 0); - git_strarray_free(&refnames); - git_remote_free(origin); - - cl_git_pass(git_reference_lookup(&ref, remote_repo, "refs/heads/br2")); - cl_git_pass(git_reference_delete(ref)); - git_reference_free(ref); - - cl_git_pass(git_remote_lookup(&origin, repo, GIT_REMOTE_ORIGIN)); - cl_git_pass(git_remote_fetch(origin, NULL, &options, NULL)); - cl_git_pass(git_remote_prune(origin, &options.callbacks)); - - cl_git_pass(git_reference_list(&refnames, repo)); - cl_assert_equal_i(18, (int)refnames.count); - git_strarray_free(&refnames); - git_remote_free(origin); - - cl_git_pass(git_reference_lookup(&ref, remote_repo, "refs/heads/packed")); - cl_git_pass(git_reference_delete(ref)); - git_reference_free(ref); - - cl_git_pass(git_remote_lookup(&origin, repo, GIT_REMOTE_ORIGIN)); - cl_git_pass(git_remote_fetch(origin, NULL, &options, NULL)); - cl_git_pass(git_remote_prune(origin, &options.callbacks)); - - cl_git_pass(git_reference_list(&refnames, repo)); - cl_assert_equal_i(17, (int)refnames.count); - git_strarray_free(&refnames); - git_remote_free(origin); - - git_repository_free(repo); -} - -int update_tips_fail_on_call(const char *ref, const git_oid *old, const git_oid *new, void *data) -{ - GIT_UNUSED(ref); - GIT_UNUSED(old); - GIT_UNUSED(new); - GIT_UNUSED(data); - - cl_fail("update tips called"); - return 0; -} - -void assert_ref_exists(git_repository *repo, const char *name) -{ - git_reference *ref; - - cl_git_pass(git_reference_lookup(&ref, repo, name)); - git_reference_free(ref); -} - -void test_network_fetchlocal__prune_overlapping(void) -{ - git_repository *repo; - git_remote *origin; - int callcount = 0; - git_strarray refnames = {0}; - git_reference *ref; - git_config *config; - git_oid target; - - git_repository *remote_repo = cl_git_sandbox_init("testrepo.git"); - const char *url = cl_git_path_url(git_repository_path(remote_repo)); - - git_fetch_options options = GIT_FETCH_OPTIONS_INIT; - options.callbacks.transfer_progress = transfer_cb; - options.callbacks.payload = &callcount; - - cl_git_pass(git_reference_lookup(&ref, remote_repo, "refs/heads/master")); - git_oid_cpy(&target, git_reference_target(ref)); - git_reference_free(ref); - cl_git_pass(git_reference_create(&ref, remote_repo, "refs/pull/42/head", &target, 1, NULL)); - git_reference_free(ref); - - cl_set_cleanup(&cleanup_local_repo, "foo"); - cl_git_pass(git_repository_init(&repo, "foo", true)); - - cl_git_pass(git_remote_create(&origin, repo, GIT_REMOTE_ORIGIN, url)); - - cl_git_pass(git_repository_config(&config, repo)); - cl_git_pass(git_config_set_bool(config, "remote.origin.prune", true)); - cl_git_pass(git_config_set_multivar(config, "remote.origin.fetch", "^$", "refs/pull/*/head:refs/remotes/origin/pr/*")); - - git_remote_free(origin); - cl_git_pass(git_remote_lookup(&origin, repo, GIT_REMOTE_ORIGIN)); - cl_git_pass(git_remote_fetch(origin, NULL, &options, NULL)); - - assert_ref_exists(repo, "refs/remotes/origin/master"); - assert_ref_exists(repo, "refs/remotes/origin/pr/42"); - cl_git_pass(git_reference_list(&refnames, repo)); - cl_assert_equal_i(20, (int)refnames.count); - git_strarray_free(&refnames); - - cl_git_pass(git_config_delete_multivar(config, "remote.origin.fetch", "refs")); - cl_git_pass(git_config_set_multivar(config, "remote.origin.fetch", "^$", "refs/pull/*/head:refs/remotes/origin/pr/*")); - cl_git_pass(git_config_set_multivar(config, "remote.origin.fetch", "^$", "refs/heads/*:refs/remotes/origin/*")); - - git_remote_free(origin); - cl_git_pass(git_remote_lookup(&origin, repo, GIT_REMOTE_ORIGIN)); - options.callbacks.update_tips = update_tips_fail_on_call; - cl_git_pass(git_remote_fetch(origin, NULL, &options, NULL)); - - assert_ref_exists(repo, "refs/remotes/origin/master"); - assert_ref_exists(repo, "refs/remotes/origin/pr/42"); - cl_git_pass(git_reference_list(&refnames, repo)); - cl_assert_equal_i(20, (int)refnames.count); - git_strarray_free(&refnames); - - cl_git_pass(git_config_delete_multivar(config, "remote.origin.fetch", "refs")); - cl_git_pass(git_config_set_multivar(config, "remote.origin.fetch", "^$", "refs/heads/*:refs/remotes/origin/*")); - cl_git_pass(git_config_set_multivar(config, "remote.origin.fetch", "^$", "refs/pull/*/head:refs/remotes/origin/pr/*")); - - git_remote_free(origin); - cl_git_pass(git_remote_lookup(&origin, repo, GIT_REMOTE_ORIGIN)); - options.callbacks.update_tips = update_tips_fail_on_call; - cl_git_pass(git_remote_fetch(origin, NULL, &options, NULL)); - - git_config_free(config); - git_strarray_free(&refnames); - git_remote_free(origin); - git_repository_free(repo); -} - -void test_network_fetchlocal__fetchprune(void) -{ - git_repository *repo; - git_remote *origin; - int callcount = 0; - git_strarray refnames = {0}; - git_reference *ref; - git_config *config; - git_repository *remote_repo = cl_git_sandbox_init("testrepo.git"); - const char *url = cl_git_path_url(git_repository_path(remote_repo)); - git_fetch_options options = GIT_FETCH_OPTIONS_INIT; - - options.callbacks.transfer_progress = transfer_cb; - options.callbacks.payload = &callcount; - - cl_set_cleanup(&cleanup_local_repo, "foo"); - cl_git_pass(git_repository_init(&repo, "foo", true)); - - cl_git_pass(git_remote_create(&origin, repo, GIT_REMOTE_ORIGIN, url)); - cl_git_pass(git_remote_fetch(origin, NULL, &options, NULL)); - - cl_git_pass(git_reference_list(&refnames, repo)); - cl_assert_equal_i(19, (int)refnames.count); - cl_assert(callcount > 0); - git_strarray_free(&refnames); - git_remote_free(origin); - - cl_git_pass(git_reference_lookup(&ref, remote_repo, "refs/heads/br2")); - cl_git_pass(git_reference_delete(ref)); - git_reference_free(ref); - - cl_git_pass(git_remote_lookup(&origin, repo, GIT_REMOTE_ORIGIN)); - cl_git_pass(git_remote_fetch(origin, NULL, &options, NULL)); - cl_git_pass(git_remote_prune(origin, &options.callbacks)); - - cl_git_pass(git_reference_list(&refnames, repo)); - cl_assert_equal_i(18, (int)refnames.count); - git_strarray_free(&refnames); - git_remote_free(origin); - - cl_git_pass(git_reference_lookup(&ref, remote_repo, "refs/heads/packed")); - cl_git_pass(git_reference_delete(ref)); - git_reference_free(ref); - - cl_git_pass(git_repository_config(&config, repo)); - cl_git_pass(git_config_set_bool(config, "remote.origin.prune", 1)); - git_config_free(config); - cl_git_pass(git_remote_lookup(&origin, repo, GIT_REMOTE_ORIGIN)); - cl_assert_equal_i(1, git_remote_prune_refs(origin)); - cl_git_pass(git_remote_fetch(origin, NULL, &options, NULL)); - - cl_git_pass(git_reference_list(&refnames, repo)); - cl_assert_equal_i(17, (int)refnames.count); - git_strarray_free(&refnames); - git_remote_free(origin); - - git_repository_free(repo); -} - -void test_network_fetchlocal__prune_tag(void) -{ - git_repository *repo; - git_remote *origin; - int callcount = 0; - git_reference *ref; - git_config *config; - git_oid tag_id; - git_signature *tagger; - git_object *obj; - - git_repository *remote_repo = cl_git_sandbox_init("testrepo.git"); - const char *url = cl_git_path_url(git_repository_path(remote_repo)); - git_fetch_options options = GIT_FETCH_OPTIONS_INIT; - - options.callbacks.transfer_progress = transfer_cb; - options.callbacks.payload = &callcount; - - cl_set_cleanup(&cleanup_local_repo, "foo"); - cl_git_pass(git_repository_init(&repo, "foo", true)); - - cl_git_pass(git_remote_create(&origin, repo, GIT_REMOTE_ORIGIN, url)); - cl_git_pass(git_remote_fetch(origin, NULL, &options, NULL)); - git_remote_free(origin); - - cl_git_pass(git_revparse_single(&obj, repo, "origin/master")); - - cl_git_pass(git_reference_create(&ref, repo, "refs/remotes/origin/fake-remote", git_object_id(obj), 1, NULL)); - git_reference_free(ref); - - /* create signature */ - cl_git_pass(git_signature_new(&tagger, tagger_name, tagger_email, 123456789, 60)); - - cl_git_pass( - git_tag_create(&tag_id, repo, - "some-tag", obj, tagger, tagger_message, 0) - ); - git_signature_free(tagger); - - cl_git_pass(git_repository_config(&config, repo)); - cl_git_pass(git_config_set_bool(config, "remote.origin.prune", 1)); - git_config_free(config); - cl_git_pass(git_remote_lookup(&origin, repo, GIT_REMOTE_ORIGIN)); - cl_assert_equal_i(1, git_remote_prune_refs(origin)); - cl_git_pass(git_remote_fetch(origin, NULL, &options, NULL)); - - assert_ref_exists(repo, "refs/tags/some-tag"); - cl_git_fail_with(GIT_ENOTFOUND, git_reference_lookup(&ref, repo, "refs/remotes/origin/fake-remote")); - - git_object_free(obj); - git_remote_free(origin); - - git_repository_free(repo); -} - -static void cleanup_sandbox(void *unused) -{ - GIT_UNUSED(unused); - cl_git_sandbox_cleanup(); -} - -void test_network_fetchlocal__partial(void) -{ - git_repository *repo = cl_git_sandbox_init("partial-testrepo"); - git_remote *origin; - int callcount = 0; - git_strarray refnames = {0}; - const char *url; - git_fetch_options options = GIT_FETCH_OPTIONS_INIT; - - options.callbacks.transfer_progress = transfer_cb; - options.callbacks.payload = &callcount; - - cl_set_cleanup(&cleanup_sandbox, NULL); - cl_git_pass(git_reference_list(&refnames, repo)); - cl_assert_equal_i(1, (int)refnames.count); - - url = cl_git_fixture_url("testrepo.git"); - cl_git_pass(git_remote_create(&origin, repo, GIT_REMOTE_ORIGIN, url)); - cl_git_pass(git_remote_fetch(origin, NULL, &options, NULL)); - - git_strarray_free(&refnames); - - cl_git_pass(git_reference_list(&refnames, repo)); - cl_assert_equal_i(20, (int)refnames.count); /* 18 remote + 1 local */ - cl_assert(callcount > 0); - - git_strarray_free(&refnames); - git_remote_free(origin); -} - -static int remote_mirror_cb(git_remote **out, git_repository *repo, - const char *name, const char *url, void *payload) -{ - int error; - git_remote *remote; - - GIT_UNUSED(payload); - - if ((error = git_remote_create_with_fetchspec(&remote, repo, name, url, "+refs/*:refs/*")) < 0) - return error; - - *out = remote; - return 0; -} - -void test_network_fetchlocal__clone_into_mirror(void) -{ - git_clone_options opts = GIT_CLONE_OPTIONS_INIT; - git_repository *repo; - git_reference *head; - - opts.bare = true; - opts.remote_cb = remote_mirror_cb; - cl_git_pass(git_clone(&repo, cl_git_fixture_url("testrepo.git"), "./foo.git", &opts)); - - cl_git_pass(git_reference_lookup(&head, repo, "HEAD")); - cl_assert_equal_i(GIT_REF_SYMBOLIC, git_reference_type(head)); - cl_assert_equal_s("refs/heads/master", git_reference_symbolic_target(head)); - - git_reference_free(head); - git_repository_free(repo); - cl_fixture_cleanup("./foo.git"); -} - -void test_network_fetchlocal__multi_remotes(void) -{ - git_repository *repo = cl_git_sandbox_init("testrepo.git"); - git_remote *test, *test2; - git_strarray refnames = {0}; - git_fetch_options options = GIT_FETCH_OPTIONS_INIT; - - cl_set_cleanup(&cleanup_sandbox, NULL); - options.callbacks.transfer_progress = transfer_cb; - cl_git_pass(git_remote_set_url(repo, "test", cl_git_fixture_url("testrepo.git"))); - cl_git_pass(git_remote_lookup(&test, repo, "test")); - cl_git_pass(git_remote_fetch(test, NULL, &options, NULL)); - - cl_git_pass(git_reference_list(&refnames, repo)); - cl_assert_equal_i(32, (int)refnames.count); - git_strarray_free(&refnames); - - cl_git_pass(git_remote_set_url(repo, "test_with_pushurl", cl_git_fixture_url("testrepo.git"))); - cl_git_pass(git_remote_lookup(&test2, repo, "test_with_pushurl")); - cl_git_pass(git_remote_fetch(test2, NULL, &options, NULL)); - - cl_git_pass(git_reference_list(&refnames, repo)); - cl_assert_equal_i(44, (int)refnames.count); - - git_strarray_free(&refnames); - git_remote_free(test); - git_remote_free(test2); -} - -static int sideband_cb(const char *str, int len, void *payload) -{ - int *count = (int *) payload; - - GIT_UNUSED(str); - GIT_UNUSED(len); - - (*count)++; - return 0; -} - -void test_network_fetchlocal__call_progress(void) -{ - git_repository *repo; - git_remote *remote; - git_fetch_options options = GIT_FETCH_OPTIONS_INIT; - int callcount = 0; - - cl_git_pass(git_repository_init(&repo, "foo.git", true)); - cl_set_cleanup(cleanup_local_repo, "foo.git"); - - cl_git_pass(git_remote_create_with_fetchspec(&remote, repo, "origin", cl_git_fixture_url("testrepo.git"), "+refs/heads/*:refs/heads/*")); - - options.callbacks.sideband_progress = sideband_cb; - options.callbacks.payload = &callcount; - - cl_git_pass(git_remote_fetch(remote, NULL, &options, NULL)); - cl_assert(callcount != 0); - - git_remote_free(remote); - git_repository_free(repo); -} - -void test_network_fetchlocal__prune_load_remote_prune_config(void) -{ - git_repository *repo; - git_remote *origin; - git_config *config; - git_repository *remote_repo = cl_git_sandbox_init("testrepo.git"); - const char *url = cl_git_path_url(git_repository_path(remote_repo)); - - cl_set_cleanup(&cleanup_local_repo, "foo"); - cl_git_pass(git_repository_init(&repo, "foo", true)); - - cl_git_pass(git_repository_config(&config, repo)); - cl_git_pass(git_config_set_bool(config, "remote.origin.prune", 1)); - - cl_git_pass(git_remote_create(&origin, repo, GIT_REMOTE_ORIGIN, url)); - cl_assert_equal_i(1, git_remote_prune_refs(origin)); - - git_config_free(config); - git_remote_free(origin); - git_repository_free(repo); -} - -void test_network_fetchlocal__prune_load_fetch_prune_config(void) -{ - git_repository *repo; - git_remote *origin; - git_config *config; - git_repository *remote_repo = cl_git_sandbox_init("testrepo.git"); - const char *url = cl_git_path_url(git_repository_path(remote_repo)); - - cl_set_cleanup(&cleanup_local_repo, "foo"); - cl_git_pass(git_repository_init(&repo, "foo", true)); - - cl_git_pass(git_repository_config(&config, repo)); - cl_git_pass(git_config_set_bool(config, "fetch.prune", 1)); - - cl_git_pass(git_remote_create(&origin, repo, GIT_REMOTE_ORIGIN, url)); - cl_assert_equal_i(1, git_remote_prune_refs(origin)); - - git_config_free(config); - git_remote_free(origin); - git_repository_free(repo); -} diff --git a/vendor/libgit2/tests/network/matchhost.c b/vendor/libgit2/tests/network/matchhost.c deleted file mode 100644 index 3100dc21d7..0000000000 --- a/vendor/libgit2/tests/network/matchhost.c +++ /dev/null @@ -1,13 +0,0 @@ -#include "clar_libgit2.h" -#include "netops.h" - -void test_network_matchhost__match(void) -{ - cl_git_pass(gitno__match_host("*.example.org", "www.example.org")); - cl_git_pass(gitno__match_host("*.foo.example.org", "www.foo.example.org")); - cl_git_fail(gitno__match_host("*.foo.example.org", "foo.example.org")); - cl_git_fail(gitno__match_host("*.foo.example.org", "www.example.org")); - cl_git_fail(gitno__match_host("*.example.org", "example.org")); - cl_git_fail(gitno__match_host("*.example.org", "www.foo.example.org")); - cl_git_fail(gitno__match_host("*.example.org", "blah.www.www.example.org")); -} diff --git a/vendor/libgit2/tests/network/refspecs.c b/vendor/libgit2/tests/network/refspecs.c deleted file mode 100644 index c47f197ff1..0000000000 --- a/vendor/libgit2/tests/network/refspecs.c +++ /dev/null @@ -1,160 +0,0 @@ -#include "clar_libgit2.h" -#include "refspec.h" -#include "remote.h" - -static void assert_refspec(unsigned int direction, const char *input, bool is_expected_to_be_valid) -{ - git_refspec refspec; - int error; - - error = git_refspec__parse(&refspec, input, direction == GIT_DIRECTION_FETCH); - git_refspec__free(&refspec); - - if (is_expected_to_be_valid) - cl_assert_equal_i(0, error); - else - cl_assert_equal_i(GIT_ERROR, error); -} - -void test_network_refspecs__parsing(void) -{ - // Ported from https://github.com/git/git/blob/abd2bde78bd994166900290434a2048e660dabed/t/t5511-refspec.sh - - assert_refspec(GIT_DIRECTION_PUSH, "", false); - assert_refspec(GIT_DIRECTION_PUSH, ":", true); - assert_refspec(GIT_DIRECTION_PUSH, "::", false); - assert_refspec(GIT_DIRECTION_PUSH, "+:", true); - - assert_refspec(GIT_DIRECTION_FETCH, "", true); - assert_refspec(GIT_DIRECTION_PUSH, ":", true); - assert_refspec(GIT_DIRECTION_FETCH, "::", false); - - assert_refspec(GIT_DIRECTION_PUSH, "refs/heads/*:refs/remotes/frotz/*", true); - assert_refspec(GIT_DIRECTION_PUSH, "refs/heads/*:refs/remotes/frotz", false); - assert_refspec(GIT_DIRECTION_PUSH, "refs/heads:refs/remotes/frotz/*", false); - assert_refspec(GIT_DIRECTION_PUSH, "refs/heads/master:refs/remotes/frotz/xyzzy", true); - - /* - * These have invalid LHS, but we do not have a formal "valid sha-1 - * expression syntax checker" so they are not checked with the current - * code. They will be caught downstream anyway, but we may want to - * have tighter check later... - */ - //assert_refspec(GIT_DIRECTION_PUSH, "refs/heads/master::refs/remotes/frotz/xyzzy", false); - //assert_refspec(GIT_DIRECTION_PUSH, "refs/heads/maste :refs/remotes/frotz/xyzzy", false); - - assert_refspec(GIT_DIRECTION_FETCH, "refs/heads/*:refs/remotes/frotz/*", true); - assert_refspec(GIT_DIRECTION_FETCH, "refs/heads/*:refs/remotes/frotz", false); - assert_refspec(GIT_DIRECTION_FETCH, "refs/heads:refs/remotes/frotz/*", false); - assert_refspec(GIT_DIRECTION_FETCH, "refs/heads/master:refs/remotes/frotz/xyzzy", true); - assert_refspec(GIT_DIRECTION_FETCH, "refs/heads/master::refs/remotes/frotz/xyzzy", false); - assert_refspec(GIT_DIRECTION_FETCH, "refs/heads/maste :refs/remotes/frotz/xyzzy", false); - - assert_refspec(GIT_DIRECTION_PUSH, "master~1:refs/remotes/frotz/backup", true); - assert_refspec(GIT_DIRECTION_FETCH, "master~1:refs/remotes/frotz/backup", false); - assert_refspec(GIT_DIRECTION_PUSH, "HEAD~4:refs/remotes/frotz/new", true); - assert_refspec(GIT_DIRECTION_FETCH, "HEAD~4:refs/remotes/frotz/new", false); - - assert_refspec(GIT_DIRECTION_PUSH, "HEAD", true); - assert_refspec(GIT_DIRECTION_FETCH, "HEAD", true); - assert_refspec(GIT_DIRECTION_PUSH, "refs/heads/ nitfol", false); - assert_refspec(GIT_DIRECTION_FETCH, "refs/heads/ nitfol", false); - - assert_refspec(GIT_DIRECTION_PUSH, "HEAD:", false); - assert_refspec(GIT_DIRECTION_FETCH, "HEAD:", true); - assert_refspec(GIT_DIRECTION_PUSH, "refs/heads/ nitfol:", false); - assert_refspec(GIT_DIRECTION_FETCH, "refs/heads/ nitfol:", false); - - assert_refspec(GIT_DIRECTION_PUSH, ":refs/remotes/frotz/deleteme", true); - assert_refspec(GIT_DIRECTION_FETCH, ":refs/remotes/frotz/HEAD-to-me", true); - assert_refspec(GIT_DIRECTION_PUSH, ":refs/remotes/frotz/delete me", false); - assert_refspec(GIT_DIRECTION_FETCH, ":refs/remotes/frotz/HEAD to me", false); - - assert_refspec(GIT_DIRECTION_FETCH, "refs/heads/*/for-linus:refs/remotes/mine/*-blah", false); - assert_refspec(GIT_DIRECTION_PUSH, "refs/heads/*/for-linus:refs/remotes/mine/*-blah", false); - - assert_refspec(GIT_DIRECTION_FETCH, "refs/heads*/for-linus:refs/remotes/mine/*", false); - assert_refspec(GIT_DIRECTION_PUSH, "refs/heads*/for-linus:refs/remotes/mine/*", false); - - assert_refspec(GIT_DIRECTION_FETCH, "refs/heads/*/*/for-linus:refs/remotes/mine/*", false); - assert_refspec(GIT_DIRECTION_PUSH, "refs/heads/*/*/for-linus:refs/remotes/mine/*", false); - - assert_refspec(GIT_DIRECTION_FETCH, "refs/heads/*/for-linus:refs/remotes/mine/*", true); - assert_refspec(GIT_DIRECTION_PUSH, "refs/heads/*/for-linus:refs/remotes/mine/*", true); - - assert_refspec(GIT_DIRECTION_FETCH, "master", true); - assert_refspec(GIT_DIRECTION_PUSH, "master", true); - - assert_refspec(GIT_DIRECTION_FETCH, "refs/pull/*/head:refs/remotes/origin/pr/*", true); -} - -static void assert_valid_transform(const char *refspec, const char *name, const char *result) -{ - git_refspec spec; - git_buf buf = GIT_BUF_INIT; - - git_refspec__parse(&spec, refspec, true); - cl_git_pass(git_refspec_transform(&buf, &spec, name)); - cl_assert_equal_s(result, buf.ptr); - - git_buf_free(&buf); - git_refspec__free(&spec); -} - -void test_network_refspecs__transform_mid_star(void) -{ - assert_valid_transform("refs/pull/*/head:refs/remotes/origin/pr/*", "refs/pull/23/head", "refs/remotes/origin/pr/23"); - assert_valid_transform("refs/heads/*:refs/remotes/origin/*", "refs/heads/master", "refs/remotes/origin/master"); - assert_valid_transform("refs/heads/*:refs/remotes/origin/*", "refs/heads/user/feature", "refs/remotes/origin/user/feature"); - assert_valid_transform("refs/heads/*:refs/heads/*", "refs/heads/master", "refs/heads/master"); - assert_valid_transform("refs/heads/*:refs/heads/*", "refs/heads/user/feature", "refs/heads/user/feature"); - assert_valid_transform("refs/*:refs/*", "refs/heads/master", "refs/heads/master"); -} - -static void assert_invalid_transform(const char *refspec, const char *name) -{ - git_refspec spec; - git_buf buf = GIT_BUF_INIT; - - git_refspec__parse(&spec, refspec, true); - cl_git_fail(git_refspec_transform(&buf, &spec, name)); - - git_buf_free(&buf); - git_refspec__free(&spec); -} - -void test_network_refspecs__invalid(void) -{ - assert_invalid_transform("refs/heads/*:refs/remotes/origin/*", "master"); - assert_invalid_transform("refs/heads/*:refs/remotes/origin/*", "refs/headz/master"); -} - -static void assert_invalid_rtransform(const char *refspec, const char *name) -{ - git_refspec spec; - git_buf buf = GIT_BUF_INIT; - - git_refspec__parse(&spec, refspec, true); - cl_git_fail(git_refspec_rtransform(&buf, &spec, name)); - - git_buf_free(&buf); - git_refspec__free(&spec); -} - -void test_network_refspecs__invalid_reverse(void) -{ - assert_invalid_rtransform("refs/heads/*:refs/remotes/origin/*", "master"); - assert_invalid_rtransform("refs/heads/*:refs/remotes/origin/*", "refs/remotes/o/master"); -} - -void test_network_refspecs__matching(void) -{ - git_refspec spec; - - cl_git_pass(git_refspec__parse(&spec, ":", false)); - cl_assert_equal_s(":", spec.string); - cl_assert_equal_s("", spec.src); - cl_assert_equal_s("", spec.dst); - - git_refspec__free(&spec); -} diff --git a/vendor/libgit2/tests/network/remote/createthenload.c b/vendor/libgit2/tests/network/remote/createthenload.c deleted file mode 100644 index f811f3c4cb..0000000000 --- a/vendor/libgit2/tests/network/remote/createthenload.c +++ /dev/null @@ -1,37 +0,0 @@ -#include "clar_libgit2.h" - -static git_remote *_remote; -static git_repository *_repo; -static git_config *_config; -static char url[] = "http://github.com/libgit2/libgit2.git"; - -void test_network_remote_createthenload__initialize(void) -{ - cl_fixture_sandbox("testrepo.git"); - - cl_git_pass(git_repository_open(&_repo, "testrepo.git")); - - cl_git_pass(git_repository_config(&_config, _repo)); - cl_git_pass(git_config_set_string(_config, "remote.origin.fetch", "+refs/heads/*:refs/remotes/origin/*")); - cl_git_pass(git_config_set_string(_config, "remote.origin.url", url)); - git_config_free(_config); - - cl_git_pass(git_remote_lookup(&_remote, _repo, "origin")); -} - -void test_network_remote_createthenload__cleanup(void) -{ - git_remote_free(_remote); - _remote = NULL; - - git_repository_free(_repo); - _repo = NULL; - - cl_fixture_cleanup("testrepo.git"); -} - -void test_network_remote_createthenload__parsing(void) -{ - cl_assert_equal_s(git_remote_name(_remote), "origin"); - cl_assert_equal_s(git_remote_url(_remote), url); -} diff --git a/vendor/libgit2/tests/network/remote/defaultbranch.c b/vendor/libgit2/tests/network/remote/defaultbranch.c deleted file mode 100644 index e83755ef67..0000000000 --- a/vendor/libgit2/tests/network/remote/defaultbranch.c +++ /dev/null @@ -1,108 +0,0 @@ -#include "clar_libgit2.h" -#include "buffer.h" -#include "refspec.h" -#include "remote.h" - -static git_remote *g_remote; -static git_repository *g_repo_a, *g_repo_b; - -void test_network_remote_defaultbranch__initialize(void) -{ - g_repo_a = cl_git_sandbox_init("testrepo.git"); - cl_git_pass(git_repository_init(&g_repo_b, "repo-b.git", true)); - cl_git_pass(git_remote_create(&g_remote, g_repo_b, "origin", git_repository_path(g_repo_a))); -} - -void test_network_remote_defaultbranch__cleanup(void) -{ - git_remote_free(g_remote); - git_repository_free(g_repo_b); - - cl_git_sandbox_cleanup(); - cl_fixture_cleanup("repo-b.git"); -} - -static void assert_default_branch(const char *should) -{ - git_buf name = GIT_BUF_INIT; - - cl_git_pass(git_remote_connect(g_remote, GIT_DIRECTION_FETCH, NULL)); - cl_git_pass(git_remote_default_branch(&name, g_remote)); - cl_assert_equal_s(should, name.ptr); - git_buf_free(&name); -} - -void test_network_remote_defaultbranch__master(void) -{ - assert_default_branch("refs/heads/master"); -} - -void test_network_remote_defaultbranch__master_does_not_win(void) -{ - cl_git_pass(git_repository_set_head(g_repo_a, "refs/heads/not-good")); - assert_default_branch("refs/heads/not-good"); -} - -void test_network_remote_defaultbranch__master_on_detached(void) -{ - cl_git_pass(git_repository_detach_head(g_repo_a)); - assert_default_branch("refs/heads/master"); -} - -void test_network_remote_defaultbranch__no_default_branch(void) -{ - git_remote *remote_b; - const git_remote_head **heads; - size_t len; - git_buf buf = GIT_BUF_INIT; - - cl_git_pass(git_remote_create(&remote_b, g_repo_b, "self", git_repository_path(g_repo_b))); - cl_git_pass(git_remote_connect(remote_b, GIT_DIRECTION_FETCH, NULL)); - cl_git_pass(git_remote_ls(&heads, &len, remote_b)); - cl_assert_equal_i(0, len); - - cl_git_fail_with(GIT_ENOTFOUND, git_remote_default_branch(&buf, remote_b)); - - git_remote_free(remote_b); -} - -void test_network_remote_defaultbranch__detached_sharing_nonbranch_id(void) -{ - git_oid id, id_cloned; - git_reference *ref; - git_buf buf = GIT_BUF_INIT; - git_repository *cloned_repo; - - cl_git_pass(git_reference_name_to_id(&id, g_repo_a, "HEAD")); - cl_git_pass(git_repository_detach_head(g_repo_a)); - cl_git_pass(git_reference_remove(g_repo_a, "refs/heads/master")); - cl_git_pass(git_reference_remove(g_repo_a, "refs/heads/not-good")); - cl_git_pass(git_reference_create(&ref, g_repo_a, "refs/foo/bar", &id, 1, NULL)); - git_reference_free(ref); - - cl_git_pass(git_remote_connect(g_remote, GIT_DIRECTION_FETCH, NULL)); - cl_git_fail_with(GIT_ENOTFOUND, git_remote_default_branch(&buf, g_remote)); - - cl_git_pass(git_clone(&cloned_repo, git_repository_path(g_repo_a), "./local-detached", NULL)); - - cl_assert(git_repository_head_detached(cloned_repo)); - cl_git_pass(git_reference_name_to_id(&id_cloned, g_repo_a, "HEAD")); - cl_assert(git_oid_equal(&id, &id_cloned)); - - git_repository_free(cloned_repo); -} - -void test_network_remote_defaultbranch__unborn_HEAD_with_branches(void) -{ - git_reference *ref; - git_repository *cloned_repo; - - cl_git_pass(git_reference_symbolic_create(&ref, g_repo_a, "HEAD", "refs/heads/i-dont-exist", 1, NULL)); - git_reference_free(ref); - - cl_git_pass(git_clone(&cloned_repo, git_repository_path(g_repo_a), "./semi-empty", NULL)); - - cl_assert(git_repository_head_unborn(cloned_repo)); - - git_repository_free(cloned_repo); -} diff --git a/vendor/libgit2/tests/network/remote/delete.c b/vendor/libgit2/tests/network/remote/delete.c deleted file mode 100644 index f23a638aaa..0000000000 --- a/vendor/libgit2/tests/network/remote/delete.c +++ /dev/null @@ -1,46 +0,0 @@ -#include "clar_libgit2.h" -#include "config/config_helpers.h" - -#include "repository.h" - -static git_repository *_repo; - -void test_network_remote_delete__initialize(void) -{ - _repo = cl_git_sandbox_init("testrepo.git"); -} - -void test_network_remote_delete__cleanup(void) -{ - cl_git_sandbox_cleanup(); -} - -void test_network_remote_delete__remove_remote_tracking_branches(void) -{ - git_reference *ref; - - cl_git_pass(git_remote_delete(_repo, "test")); - cl_git_fail_with(GIT_ENOTFOUND, git_reference_lookup(&ref, _repo, "refs/remotes/test/master")); -} - -void test_network_remote_delete__remove_remote_configuration_settings(void) -{ - cl_assert(count_config_entries_match(_repo, "remote\\.test\\.+") > 0); - - cl_git_pass(git_remote_delete(_repo, "test")); - - cl_assert_equal_i(0, count_config_entries_match(_repo, "remote\\.test\\.+")); -} - -void test_network_remote_delete__remove_branch_upstream_configuration_settings(void) -{ - assert_config_entry_existence(_repo, "branch.mergeless.remote", true); - assert_config_entry_existence(_repo, "branch.master.remote", true); - - cl_git_pass(git_remote_delete(_repo, "test")); - - assert_config_entry_existence(_repo, "branch.mergeless.remote", false); - assert_config_entry_existence(_repo, "branch.mergeless.merge", false); - assert_config_entry_existence(_repo, "branch.master.remote", false); - assert_config_entry_existence(_repo, "branch.master.merge", false); -} diff --git a/vendor/libgit2/tests/network/remote/isvalidname.c b/vendor/libgit2/tests/network/remote/isvalidname.c deleted file mode 100644 index c26fbd0a5b..0000000000 --- a/vendor/libgit2/tests/network/remote/isvalidname.c +++ /dev/null @@ -1,17 +0,0 @@ -#include "clar_libgit2.h" - -void test_network_remote_isvalidname__can_detect_invalid_formats(void) -{ - cl_assert_equal_i(false, git_remote_is_valid_name("/")); - cl_assert_equal_i(false, git_remote_is_valid_name("//")); - cl_assert_equal_i(false, git_remote_is_valid_name(".lock")); - cl_assert_equal_i(false, git_remote_is_valid_name("a.lock")); - cl_assert_equal_i(false, git_remote_is_valid_name("/no/leading/slash")); - cl_assert_equal_i(false, git_remote_is_valid_name("no/trailing/slash/")); -} - -void test_network_remote_isvalidname__wont_hopefully_choke_on_valid_formats(void) -{ - cl_assert_equal_i(true, git_remote_is_valid_name("webmatrix")); - cl_assert_equal_i(true, git_remote_is_valid_name("yishaigalatzer/rules")); -} diff --git a/vendor/libgit2/tests/network/remote/local.c b/vendor/libgit2/tests/network/remote/local.c deleted file mode 100644 index 5d726c9587..0000000000 --- a/vendor/libgit2/tests/network/remote/local.c +++ /dev/null @@ -1,467 +0,0 @@ -#include "clar_libgit2.h" -#include "buffer.h" -#include "path.h" -#include "posix.h" - -static git_repository *repo; -static git_buf file_path_buf = GIT_BUF_INIT; -static git_remote *remote; - -static char *push_refspec_strings[] = { - "refs/heads/master", -}; -static git_strarray push_array = { - push_refspec_strings, - 1, -}; - -void test_network_remote_local__initialize(void) -{ - cl_git_pass(git_repository_init(&repo, "remotelocal/", 0)); - cl_git_pass(git_repository_set_ident(repo, "Foo Bar", "foo@example.com")); - cl_assert(repo != NULL); -} - -void test_network_remote_local__cleanup(void) -{ - git_buf_free(&file_path_buf); - - git_remote_free(remote); - remote = NULL; - - git_repository_free(repo); - repo = NULL; - - cl_fixture_cleanup("remotelocal"); -} - -static void connect_to_local_repository(const char *local_repository) -{ - git_buf_sets(&file_path_buf, cl_git_path_url(local_repository)); - - cl_git_pass(git_remote_create_anonymous(&remote, repo, git_buf_cstr(&file_path_buf))); - cl_git_pass(git_remote_connect(remote, GIT_DIRECTION_FETCH, NULL)); -} - -void test_network_remote_local__connected(void) -{ - connect_to_local_repository(cl_fixture("testrepo.git")); - cl_assert(git_remote_connected(remote)); - - git_remote_disconnect(remote); - cl_assert(!git_remote_connected(remote)); -} - -void test_network_remote_local__retrieve_advertised_references(void) -{ - const git_remote_head **refs; - size_t refs_len; - - connect_to_local_repository(cl_fixture("testrepo.git")); - - cl_git_pass(git_remote_ls(&refs, &refs_len, remote)); - - cl_assert_equal_i(refs_len, 28); -} - -void test_network_remote_local__retrieve_advertised_before_connect(void) -{ - const git_remote_head **refs; - size_t refs_len = 0; - - git_buf_sets(&file_path_buf, cl_git_path_url(cl_fixture("testrepo.git"))); - - cl_git_pass(git_remote_create_anonymous(&remote, repo, git_buf_cstr(&file_path_buf))); - cl_git_fail(git_remote_ls(&refs, &refs_len, remote)); -} - -void test_network_remote_local__retrieve_advertised_references_after_disconnect(void) -{ - const git_remote_head **refs; - size_t refs_len; - - connect_to_local_repository(cl_fixture("testrepo.git")); - git_remote_disconnect(remote); - - cl_git_pass(git_remote_ls(&refs, &refs_len, remote)); - - cl_assert_equal_i(refs_len, 28); -} - -void test_network_remote_local__retrieve_advertised_references_from_spaced_repository(void) -{ - const git_remote_head **refs; - size_t refs_len; - - cl_fixture_sandbox("testrepo.git"); - cl_git_pass(p_rename("testrepo.git", "spaced testrepo.git")); - - connect_to_local_repository("spaced testrepo.git"); - - cl_git_pass(git_remote_ls(&refs, &refs_len, remote)); - - cl_assert_equal_i(refs_len, 28); - - git_remote_free(remote); /* Disconnect from the "spaced repo" before the cleanup */ - remote = NULL; - - cl_fixture_cleanup("spaced testrepo.git"); -} - -void test_network_remote_local__nested_tags_are_completely_peeled(void) -{ - const git_remote_head **refs; - size_t refs_len, i; - - connect_to_local_repository(cl_fixture("testrepo.git")); - - cl_git_pass(git_remote_ls(&refs, &refs_len, remote)); - - for (i = 0; i < refs_len; i++) { - if (!strcmp(refs[i]->name, "refs/tags/test^{}")) - cl_git_pass(git_oid_streq(&refs[i]->oid, "e90810b8df3e80c413d903f631643c716887138d")); - } -} - -void test_network_remote_local__shorthand_fetch_refspec0(void) -{ - char *refspec_strings[] = { - "master:remotes/sloppy/master", - "master:boh/sloppy/master", - }; - git_strarray array = { - refspec_strings, - 2, - }; - - git_reference *ref; - - connect_to_local_repository(cl_fixture("testrepo.git")); - - cl_git_pass(git_remote_fetch(remote, &array, NULL, NULL)); - - cl_git_pass(git_reference_lookup(&ref, repo, "refs/remotes/sloppy/master")); - git_reference_free(ref); - - cl_git_pass(git_reference_lookup(&ref, repo, "refs/heads/boh/sloppy/master")); - git_reference_free(ref); -} - -void test_network_remote_local__shorthand_fetch_refspec1(void) -{ - char *refspec_strings[] = { - "master", - "hard_tag", - }; - git_strarray array = { - refspec_strings, - 2, - }; - - git_reference *ref; - - connect_to_local_repository(cl_fixture("testrepo.git")); - - cl_git_pass(git_remote_fetch(remote, &array, NULL, NULL)); - - cl_git_fail(git_reference_lookup(&ref, repo, "refs/remotes/origin/master")); - cl_git_fail(git_reference_lookup(&ref, repo, "refs/tags/hard_tag")); -} - -void test_network_remote_local__tagopt(void) -{ - git_reference *ref; - git_fetch_options fetch_opts = GIT_FETCH_OPTIONS_INIT; - - cl_git_pass(git_remote_create(&remote, repo, "tagopt", cl_git_path_url(cl_fixture("testrepo.git")))); - fetch_opts.download_tags = GIT_REMOTE_DOWNLOAD_TAGS_ALL; - cl_git_pass(git_remote_fetch(remote, NULL, &fetch_opts, NULL)); - - cl_git_pass(git_reference_lookup(&ref, repo, "refs/remotes/tagopt/master")); - git_reference_free(ref); - cl_git_pass(git_reference_lookup(&ref, repo, "refs/tags/hard_tag")); - git_reference_free(ref); - - fetch_opts.download_tags = GIT_REMOTE_DOWNLOAD_TAGS_AUTO; - cl_git_pass(git_remote_fetch(remote, NULL, &fetch_opts, NULL)); - cl_git_pass(git_reference_lookup(&ref, repo, "refs/remotes/tagopt/master")); - git_reference_free(ref); -} - -void test_network_remote_local__push_to_bare_remote(void) -{ - char *refspec_strings[] = { - "master:master", - }; - git_strarray array = { - refspec_strings, - 1, - }; - - /* Should be able to push to a bare remote */ - git_remote *localremote; - - /* Get some commits */ - connect_to_local_repository(cl_fixture("testrepo.git")); - cl_git_pass(git_remote_fetch(remote, &array, NULL, NULL)); - - /* Set up an empty bare repo to push into */ - { - git_repository *localbarerepo; - cl_git_pass(git_repository_init(&localbarerepo, "./localbare.git", 1)); - git_repository_free(localbarerepo); - } - - /* Connect to the bare repo */ - cl_git_pass(git_remote_create_anonymous(&localremote, repo, "./localbare.git")); - cl_git_pass(git_remote_connect(localremote, GIT_DIRECTION_PUSH, NULL)); - - /* Try to push */ - cl_git_pass(git_remote_upload(localremote, &push_array, NULL)); - - /* Clean up */ - git_remote_free(localremote); - cl_fixture_cleanup("localbare.git"); -} - -void test_network_remote_local__push_to_bare_remote_with_file_url(void) -{ - char *refspec_strings[] = { - "master:master", - }; - git_strarray array = { - refspec_strings, - 1, - }; - /* Should be able to push to a bare remote */ - git_remote *localremote; - const char *url; - - /* Get some commits */ - connect_to_local_repository(cl_fixture("testrepo.git")); - cl_git_pass(git_remote_fetch(remote, &array, NULL, NULL)); - - /* Set up an empty bare repo to push into */ - { - git_repository *localbarerepo; - cl_git_pass(git_repository_init(&localbarerepo, "./localbare.git", 1)); - git_repository_free(localbarerepo); - } - - /* Create a file URL */ - url = cl_git_path_url("./localbare.git"); - - /* Connect to the bare repo */ - cl_git_pass(git_remote_create_anonymous(&localremote, repo, url)); - cl_git_pass(git_remote_connect(localremote, GIT_DIRECTION_PUSH, NULL)); - - /* Try to push */ - cl_git_pass(git_remote_upload(localremote, &push_array, NULL)); - - /* Clean up */ - git_remote_free(localremote); - cl_fixture_cleanup("localbare.git"); -} - - -void test_network_remote_local__push_to_non_bare_remote(void) -{ - char *refspec_strings[] = { - "master:master", - }; - git_strarray array = { - refspec_strings, - 1, - }; - /* Shouldn't be able to push to a non-bare remote */ - git_remote *localremote; - git_fetch_options fetch_opts = GIT_FETCH_OPTIONS_INIT; - - /* Get some commits */ - connect_to_local_repository(cl_fixture("testrepo.git")); - cl_git_pass(git_remote_fetch(remote, &array, &fetch_opts, NULL)); - - /* Set up an empty non-bare repo to push into */ - { - git_repository *remoterepo = NULL; - cl_git_pass(git_repository_init(&remoterepo, "localnonbare", 0)); - git_repository_free(remoterepo); - } - - /* Connect to the bare repo */ - cl_git_pass(git_remote_create_anonymous(&localremote, repo, "./localnonbare")); - cl_git_pass(git_remote_connect(localremote, GIT_DIRECTION_PUSH, NULL)); - - /* Try to push */ - cl_git_fail_with(GIT_EBAREREPO, git_remote_upload(localremote, &push_array, NULL)); - - /* Clean up */ - git_remote_free(localremote); - cl_fixture_cleanup("localbare.git"); -} - -void test_network_remote_local__fetch(void) -{ - char *refspec_strings[] = { - "master:remotes/sloppy/master", - }; - git_strarray array = { - refspec_strings, - 1, - }; - - git_reflog *log; - const git_reflog_entry *entry; - git_reference *ref; - - connect_to_local_repository(cl_fixture("testrepo.git")); - - cl_git_pass(git_remote_fetch(remote, &array, NULL, "UPDAAAAAATE!!")); - - cl_git_pass(git_reference_lookup(&ref, repo, "refs/remotes/sloppy/master")); - git_reference_free(ref); - - cl_git_pass(git_reflog_read(&log, repo, "refs/remotes/sloppy/master")); - cl_assert_equal_i(1, git_reflog_entrycount(log)); - entry = git_reflog_entry_byindex(log, 0); - cl_assert_equal_s("foo@example.com", git_reflog_entry_committer(entry)->email); - cl_assert_equal_s("UPDAAAAAATE!!", git_reflog_entry_message(entry)); - - git_reflog_free(log); -} - -void test_network_remote_local__reflog(void) -{ - char *refspec_strings[] = { - "master:remotes/sloppy/master", - }; - git_strarray array = { - refspec_strings, - 1, - }; - - git_reflog *log; - const git_reflog_entry *entry; - - connect_to_local_repository(cl_fixture("testrepo.git")); - - cl_git_pass(git_remote_fetch(remote, &array, NULL, "UPDAAAAAATE!!")); - - cl_git_pass(git_reflog_read(&log, repo, "refs/remotes/sloppy/master")); - cl_assert_equal_i(1, git_reflog_entrycount(log)); - entry = git_reflog_entry_byindex(log, 0); - cl_assert_equal_s("foo@example.com", git_reflog_entry_committer(entry)->email); - cl_assert_equal_s("UPDAAAAAATE!!", git_reflog_entry_message(entry)); - - git_reflog_free(log); -} - -void test_network_remote_local__fetch_default_reflog_message(void) -{ - char *refspec_strings[] = { - "master:remotes/sloppy/master", - }; - git_strarray array = { - refspec_strings, - 1, - }; - - git_reflog *log; - const git_reflog_entry *entry; - char expected_reflog_msg[1024]; - - connect_to_local_repository(cl_fixture("testrepo.git")); - - cl_git_pass(git_remote_fetch(remote, &array, NULL, NULL)); - - cl_git_pass(git_reflog_read(&log, repo, "refs/remotes/sloppy/master")); - cl_assert_equal_i(1, git_reflog_entrycount(log)); - entry = git_reflog_entry_byindex(log, 0); - cl_assert_equal_s("foo@example.com", git_reflog_entry_committer(entry)->email); - - sprintf(expected_reflog_msg, "fetch %s", git_remote_url(remote)); - cl_assert_equal_s(expected_reflog_msg, git_reflog_entry_message(entry)); - - git_reflog_free(log); -} - -void test_network_remote_local__opportunistic_update(void) -{ - git_reference *ref; - char *refspec_strings[] = { - "master", - }; - git_strarray array = { - refspec_strings, - 1, - }; - - /* this remote has a passive refspec of "refs/heads/:refs/remotes/origin/" */ - cl_git_pass(git_remote_create(&remote, repo, "origin", cl_git_fixture_url("testrepo.git"))); - /* and we pass the active refspec "master" */ - cl_git_pass(git_remote_fetch(remote, &array, NULL, NULL)); - - /* and we expect that to update our copy of origin's master */ - cl_git_pass(git_reference_lookup(&ref, repo, "refs/remotes/origin/master")); - git_reference_free(ref); -} - -void test_network_remote_local__update_tips_for_new_remote(void) { - git_repository *src_repo; - git_repository *dst_repo; - git_remote *new_remote; - git_reference* branch; - - /* Copy test repo */ - cl_fixture_sandbox("testrepo.git"); - cl_git_pass(git_repository_open(&src_repo, "testrepo.git")); - - /* Set up an empty bare repo to push into */ - cl_git_pass(git_repository_init(&dst_repo, "./localbare.git", 1)); - - /* Push to bare repo */ - cl_git_pass(git_remote_create(&new_remote, src_repo, "bare", "./localbare.git")); - cl_git_pass(git_remote_push(new_remote, &push_array, NULL)); - /* Make sure remote branch has been created */ - cl_git_pass(git_branch_lookup(&branch, src_repo, "bare/master", GIT_BRANCH_REMOTE)); - - git_reference_free(branch); - git_remote_free(new_remote); - git_repository_free(dst_repo); - cl_fixture_cleanup("localbare.git"); - git_repository_free(src_repo); - cl_fixture_cleanup("testrepo.git"); -} - -void test_network_remote_local__push_delete(void) -{ - git_repository *src_repo; - git_repository *dst_repo; - git_remote *remote; - git_reference *ref; - char *spec_push[] = { "refs/heads/master" }; - char *spec_delete[] = { ":refs/heads/master" }; - git_strarray specs = { - spec_push, - 1, - }; - - src_repo = cl_git_sandbox_init("testrepo.git"); - cl_git_pass(git_repository_init(&dst_repo, "target.git", 1)); - - cl_git_pass(git_remote_create(&remote, src_repo, "origin", "./target.git")); - - /* Push the master branch and verify it's there */ - cl_git_pass(git_remote_push(remote, &specs, NULL)); - cl_git_pass(git_reference_lookup(&ref, dst_repo, "refs/heads/master")); - git_reference_free(ref); - - specs.strings = spec_delete; - cl_git_pass(git_remote_push(remote, &specs, NULL)); - cl_git_fail(git_reference_lookup(&ref, dst_repo, "refs/heads/master")); - - git_remote_free(remote); - git_repository_free(dst_repo); - cl_fixture_cleanup("target.git"); - cl_git_sandbox_cleanup(); -} diff --git a/vendor/libgit2/tests/network/remote/push.c b/vendor/libgit2/tests/network/remote/push.c deleted file mode 100644 index 34860542e4..0000000000 --- a/vendor/libgit2/tests/network/remote/push.c +++ /dev/null @@ -1,114 +0,0 @@ -#include "clar_libgit2.h" -#include "git2/sys/commit.h" - -static git_remote *_remote; -static git_repository *_repo, *_dummy; - -void test_network_remote_push__initialize(void) -{ - cl_fixture_sandbox("testrepo.git"); - git_repository_open(&_repo, "testrepo.git"); - - /* We need a repository to have a remote */ - cl_git_pass(git_repository_init(&_dummy, "dummy.git", true)); - cl_git_pass(git_remote_create(&_remote, _dummy, "origin", cl_git_path_url("testrepo.git"))); -} - -void test_network_remote_push__cleanup(void) -{ - git_remote_free(_remote); - _remote = NULL; - - git_repository_free(_repo); - _repo = NULL; - - git_repository_free(_dummy); - _dummy = NULL; - - cl_fixture_cleanup("testrepo.git"); - cl_fixture_cleanup("dummy.git"); -} - -int negotiation_cb(const git_push_update **updates, size_t len, void *payload) -{ - const git_push_update *expected = payload; - - cl_assert_equal_i(1, len); - cl_assert_equal_s(expected->src_refname, updates[0]->src_refname); - cl_assert_equal_s(expected->dst_refname, updates[0]->dst_refname); - cl_assert_equal_oid(&expected->src, &updates[0]->src); - cl_assert_equal_oid(&expected->dst, &updates[0]->dst); - - return 0; -} - -void test_network_remote_push__delete_notification(void) -{ - git_push_options opts = GIT_PUSH_OPTIONS_INIT; - git_reference *ref; - git_push_update expected; - char *refspec = ":refs/heads/master"; - const git_strarray refspecs = { - &refspec, - 1, - }; - - cl_git_pass(git_reference_lookup(&ref, _repo, "refs/heads/master")); - - expected.src_refname = ""; - expected.dst_refname = "refs/heads/master"; - memset(&expected.dst, 0, sizeof(git_oid)); - git_oid_cpy(&expected.src, git_reference_target(ref)); - - opts.callbacks.push_negotiation = negotiation_cb; - opts.callbacks.payload = &expected; - cl_git_pass(git_remote_push(_remote, &refspecs, &opts)); - - git_reference_free(ref); - cl_git_fail_with(GIT_ENOTFOUND, git_reference_lookup(&ref, _repo, "refs/heads/master")); - -} - -void create_dummy_commit(git_reference **out, git_repository *repo) -{ - git_index *index; - git_oid tree_id, commit_id; - git_signature *sig; - - cl_git_pass(git_repository_index(&index, repo)); - cl_git_pass(git_index_write_tree(&tree_id, index)); - git_index_free(index); - - cl_git_pass(git_signature_now(&sig, "Pusher Joe", "pjoe")); - cl_git_pass(git_commit_create_from_ids(&commit_id, repo, NULL, sig, sig, - NULL, "Empty tree\n", &tree_id, 0, NULL)); - cl_git_pass(git_reference_create(out, repo, "refs/heads/empty-tree", &commit_id, true, "commit yo")); - git_signature_free(sig); -} - -void test_network_remote_push__create_notification(void) -{ - git_push_options opts = GIT_PUSH_OPTIONS_INIT; - git_reference *ref; - git_push_update expected; - char *refspec = "refs/heads/empty-tree"; - const git_strarray refspecs = { - &refspec, - 1, - }; - - create_dummy_commit(&ref, _dummy); - - expected.src_refname = "refs/heads/empty-tree"; - expected.dst_refname = "refs/heads/empty-tree"; - git_oid_cpy(&expected.dst, git_reference_target(ref)); - memset(&expected.src, 0, sizeof(git_oid)); - - opts.callbacks.push_negotiation = negotiation_cb; - opts.callbacks.payload = &expected; - cl_git_pass(git_remote_push(_remote, &refspecs, &opts)); - - git_reference_free(ref); - cl_git_pass(git_reference_lookup(&ref, _repo, "refs/heads/empty-tree")); - git_reference_free(ref); -} diff --git a/vendor/libgit2/tests/network/remote/remotes.c b/vendor/libgit2/tests/network/remote/remotes.c deleted file mode 100644 index 2fa21d4607..0000000000 --- a/vendor/libgit2/tests/network/remote/remotes.c +++ /dev/null @@ -1,469 +0,0 @@ -#include "clar_libgit2.h" -#include "config/config_helpers.h" -#include "buffer.h" -#include "refspec.h" -#include "remote.h" - -static git_remote *_remote; -static git_repository *_repo; -static const git_refspec *_refspec; - -void test_network_remote_remotes__initialize(void) -{ - _repo = cl_git_sandbox_init("testrepo.git"); - - cl_git_pass(git_remote_lookup(&_remote, _repo, "test")); - - _refspec = git_remote_get_refspec(_remote, 0); - cl_assert(_refspec != NULL); -} - -void test_network_remote_remotes__cleanup(void) -{ - git_remote_free(_remote); - _remote = NULL; - - cl_git_sandbox_cleanup(); -} - -void test_network_remote_remotes__parsing(void) -{ - git_remote *_remote2 = NULL; - - cl_assert_equal_s(git_remote_name(_remote), "test"); - cl_assert_equal_s(git_remote_url(_remote), "git://github.com/libgit2/libgit2"); - cl_assert(git_remote_pushurl(_remote) == NULL); - - cl_assert_equal_s(git_remote__urlfordirection(_remote, GIT_DIRECTION_FETCH), - "git://github.com/libgit2/libgit2"); - cl_assert_equal_s(git_remote__urlfordirection(_remote, GIT_DIRECTION_PUSH), - "git://github.com/libgit2/libgit2"); - - cl_git_pass(git_remote_lookup(&_remote2, _repo, "test_with_pushurl")); - cl_assert_equal_s(git_remote_name(_remote2), "test_with_pushurl"); - cl_assert_equal_s(git_remote_url(_remote2), "git://github.com/libgit2/fetchlibgit2"); - cl_assert_equal_s(git_remote_pushurl(_remote2), "git://github.com/libgit2/pushlibgit2"); - - cl_assert_equal_s(git_remote__urlfordirection(_remote2, GIT_DIRECTION_FETCH), - "git://github.com/libgit2/fetchlibgit2"); - cl_assert_equal_s(git_remote__urlfordirection(_remote2, GIT_DIRECTION_PUSH), - "git://github.com/libgit2/pushlibgit2"); - - git_remote_free(_remote2); -} - -void test_network_remote_remotes__pushurl(void) -{ - const char *name = git_remote_name(_remote); - git_remote *mod; - - cl_git_pass(git_remote_set_pushurl(_repo, name, "git://github.com/libgit2/notlibgit2")); - cl_git_pass(git_remote_lookup(&mod, _repo, name)); - cl_assert_equal_s(git_remote_pushurl(mod), "git://github.com/libgit2/notlibgit2"); - git_remote_free(mod); - - cl_git_pass(git_remote_set_pushurl(_repo, name, NULL)); - cl_git_pass(git_remote_lookup(&mod, _repo, name)); - cl_assert(git_remote_pushurl(mod) == NULL); - git_remote_free(mod); -} - -void test_network_remote_remotes__error_when_not_found(void) -{ - git_remote *r; - cl_git_fail_with(git_remote_lookup(&r, _repo, "does-not-exist"), GIT_ENOTFOUND); - - cl_assert(giterr_last() != NULL); - cl_assert(giterr_last()->klass == GITERR_CONFIG); -} - -void test_network_remote_remotes__error_when_no_push_available(void) -{ - git_remote *r; - git_remote_callbacks callbacks = GIT_REMOTE_CALLBACKS_INIT; - char *specs = { - "refs/heads/master", - }; - git_strarray arr = { - &specs, - 1, - }; - - - cl_git_pass(git_remote_create_anonymous(&r, _repo, cl_fixture("testrepo.git"))); - - callbacks.transport = git_transport_local; - cl_git_pass(git_remote_connect(r, GIT_DIRECTION_PUSH, &callbacks)); - - /* Make sure that push is really not available */ - r->transport->push = NULL; - - cl_git_fail_with(-1, git_remote_upload(r, &arr, NULL)); - - git_remote_free(r); -} - -void test_network_remote_remotes__refspec_parsing(void) -{ - cl_assert_equal_s(git_refspec_src(_refspec), "refs/heads/*"); - cl_assert_equal_s(git_refspec_dst(_refspec), "refs/remotes/test/*"); -} - -void test_network_remote_remotes__add_fetchspec(void) -{ - size_t size; - - size = git_remote_refspec_count(_remote); - - cl_git_pass(git_remote_add_fetch(_repo, "test", "refs/*:refs/*")); - size++; - - git_remote_free(_remote); - cl_git_pass(git_remote_lookup(&_remote, _repo, "test")); - - cl_assert_equal_i((int)size, (int)git_remote_refspec_count(_remote)); - - _refspec = git_remote_get_refspec(_remote, size - 1); - cl_assert_equal_s(git_refspec_src(_refspec), "refs/*"); - cl_assert_equal_s(git_refspec_dst(_refspec), "refs/*"); - cl_assert_equal_s(git_refspec_string(_refspec), "refs/*:refs/*"); - cl_assert_equal_b(_refspec->push, false); - - cl_git_fail_with(GIT_EINVALIDSPEC, git_remote_add_fetch(_repo, "test", "refs/*/foo/*:refs/*")); -} - -void test_network_remote_remotes__dup(void) -{ - git_strarray array; - git_remote *dup; - - cl_git_pass(git_remote_dup(&dup, _remote)); - - cl_assert_equal_s(git_remote_name(dup), git_remote_name(_remote)); - cl_assert_equal_s(git_remote_url(dup), git_remote_url(_remote)); - cl_assert_equal_s(git_remote_pushurl(dup), git_remote_pushurl(_remote)); - - cl_git_pass(git_remote_get_fetch_refspecs(&array, _remote)); - cl_assert_equal_i(1, (int)array.count); - cl_assert_equal_s("+refs/heads/*:refs/remotes/test/*", array.strings[0]); - git_strarray_free(&array); - - cl_git_pass(git_remote_get_push_refspecs(&array, _remote)); - cl_assert_equal_i(0, (int)array.count); - git_strarray_free(&array); - - git_remote_free(dup); -} - -void test_network_remote_remotes__add_pushspec(void) -{ - size_t size; - - size = git_remote_refspec_count(_remote); - - cl_git_pass(git_remote_add_push(_repo, "test", "refs/*:refs/*")); - size++; - - git_remote_free(_remote); - cl_git_pass(git_remote_lookup(&_remote, _repo, "test")); - - cl_assert_equal_i((int)size, (int)git_remote_refspec_count(_remote)); - - _refspec = git_remote_get_refspec(_remote, size - 1); - cl_assert_equal_s(git_refspec_src(_refspec), "refs/*"); - cl_assert_equal_s(git_refspec_dst(_refspec), "refs/*"); - cl_assert_equal_s(git_refspec_string(_refspec), "refs/*:refs/*"); - - cl_assert_equal_b(_refspec->push, true); -} - -void test_network_remote_remotes__fnmatch(void) -{ - cl_assert(git_refspec_src_matches(_refspec, "refs/heads/master")); - cl_assert(git_refspec_src_matches(_refspec, "refs/heads/multi/level/branch")); -} - -void test_network_remote_remotes__transform(void) -{ - git_buf ref = GIT_BUF_INIT; - - cl_git_pass(git_refspec_transform(&ref, _refspec, "refs/heads/master")); - cl_assert_equal_s(ref.ptr, "refs/remotes/test/master"); - git_buf_free(&ref); -} - -void test_network_remote_remotes__transform_destination_to_source(void) -{ - git_buf ref = GIT_BUF_INIT; - - cl_git_pass(git_refspec_rtransform(&ref, _refspec, "refs/remotes/test/master")); - cl_assert_equal_s(ref.ptr, "refs/heads/master"); - git_buf_free(&ref); -} - -void test_network_remote_remotes__missing_refspecs(void) -{ - git_config *cfg; - - git_remote_free(_remote); - _remote = NULL; - - cl_git_pass(git_repository_config(&cfg, _repo)); - cl_git_pass(git_config_set_string(cfg, "remote.specless.url", "http://example.com")); - cl_git_pass(git_remote_lookup(&_remote, _repo, "specless")); - - git_config_free(cfg); -} - -void test_network_remote_remotes__nonmatch_upstream_refspec(void) -{ - git_config *config; - git_remote *remote; - char *specstr[] = { - "refs/tags/*:refs/tags/*", - }; - git_strarray specs = { - specstr, - 1, - }; - - cl_git_pass(git_remote_create(&remote, _repo, "taggy", git_repository_path(_repo))); - - /* - * Set the current branch's upstream remote to a dummy ref so we call into the code - * which tries to check for the current branch's upstream in the refspecs - */ - cl_git_pass(git_repository_config(&config, _repo)); - cl_git_pass(git_config_set_string(config, "branch.master.remote", "taggy")); - cl_git_pass(git_config_set_string(config, "branch.master.merge", "refs/heads/foo")); - - cl_git_pass(git_remote_fetch(remote, &specs, NULL, NULL)); - - git_remote_free(remote); -} - -void test_network_remote_remotes__list(void) -{ - git_strarray list; - git_config *cfg; - - cl_git_pass(git_remote_list(&list, _repo)); - cl_assert(list.count == 5); - git_strarray_free(&list); - - cl_git_pass(git_repository_config(&cfg, _repo)); - - /* Create a new remote */ - cl_git_pass(git_config_set_string(cfg, "remote.specless.url", "http://example.com")); - - /* Update a remote (previously without any url/pushurl entry) */ - cl_git_pass(git_config_set_string(cfg, "remote.no-remote-url.pushurl", "http://example.com")); - - cl_git_pass(git_remote_list(&list, _repo)); - cl_assert(list.count == 7); - git_strarray_free(&list); - - git_config_free(cfg); -} - -void test_network_remote_remotes__loading_a_missing_remote_returns_ENOTFOUND(void) -{ - git_remote_free(_remote); - _remote = NULL; - - cl_assert_equal_i(GIT_ENOTFOUND, git_remote_lookup(&_remote, _repo, "just-left-few-minutes-ago")); -} - -void test_network_remote_remotes__loading_with_an_invalid_name_returns_EINVALIDSPEC(void) -{ - git_remote_free(_remote); - _remote = NULL; - - cl_assert_equal_i(GIT_EINVALIDSPEC, git_remote_lookup(&_remote, _repo, "Inv@{id")); -} - -/* - * $ git remote add addtest http://github.com/libgit2/libgit2 - * - * $ cat .git/config - * [...] - * [remote "addtest"] - * url = http://github.com/libgit2/libgit2 - * fetch = +refs/heads/\*:refs/remotes/addtest/\* - */ -void test_network_remote_remotes__add(void) -{ - git_remote_free(_remote); - _remote = NULL; - - cl_git_pass(git_remote_create(&_remote, _repo, "addtest", "http://github.com/libgit2/libgit2")); - cl_assert_equal_i(GIT_REMOTE_DOWNLOAD_TAGS_AUTO, git_remote_autotag(_remote)); - - git_remote_free(_remote); - _remote = NULL; - - cl_git_pass(git_remote_lookup(&_remote, _repo, "addtest")); - cl_assert_equal_i(GIT_REMOTE_DOWNLOAD_TAGS_AUTO, git_remote_autotag(_remote)); - - _refspec = git_vector_get(&_remote->refspecs, 0); - cl_assert_equal_s("refs/heads/*", git_refspec_src(_refspec)); - cl_assert(git_refspec_force(_refspec) == 1); - cl_assert_equal_s("refs/remotes/addtest/*", git_refspec_dst(_refspec)); - cl_assert_equal_s(git_remote_url(_remote), "http://github.com/libgit2/libgit2"); -} - -void test_network_remote_remotes__cannot_add_a_nameless_remote(void) -{ - git_remote *remote; - - cl_assert_equal_i( - GIT_EINVALIDSPEC, - git_remote_create(&remote, _repo, NULL, "git://github.com/libgit2/libgit2")); -} - -void test_network_remote_remotes__cannot_add_a_remote_with_an_invalid_name(void) -{ - git_remote *remote = NULL; - - cl_assert_equal_i( - GIT_EINVALIDSPEC, - git_remote_create(&remote, _repo, "Inv@{id", "git://github.com/libgit2/libgit2")); - cl_assert_equal_p(remote, NULL); - - cl_assert_equal_i( - GIT_EINVALIDSPEC, - git_remote_create(&remote, _repo, "", "git://github.com/libgit2/libgit2")); - cl_assert_equal_p(remote, NULL); -} - -void test_network_remote_remotes__tagopt(void) -{ - const char *name = git_remote_name(_remote); - - git_remote_set_autotag(_repo, name, GIT_REMOTE_DOWNLOAD_TAGS_ALL); - assert_config_entry_value(_repo, "remote.test.tagopt", "--tags"); - - git_remote_set_autotag(_repo, name, GIT_REMOTE_DOWNLOAD_TAGS_NONE); - assert_config_entry_value(_repo, "remote.test.tagopt", "--no-tags"); - - git_remote_set_autotag(_repo, name, GIT_REMOTE_DOWNLOAD_TAGS_AUTO); - assert_config_entry_existence(_repo, "remote.test.tagopt", false); -} - -void test_network_remote_remotes__can_load_with_an_empty_url(void) -{ - git_remote *remote = NULL; - - cl_git_pass(git_remote_lookup(&remote, _repo, "empty-remote-url")); - - cl_assert(remote->url == NULL); - cl_assert(remote->pushurl == NULL); - - cl_git_fail(git_remote_connect(remote, GIT_DIRECTION_FETCH, NULL)); - - cl_assert(giterr_last() != NULL); - cl_assert(giterr_last()->klass == GITERR_INVALID); - - git_remote_free(remote); -} - -void test_network_remote_remotes__can_load_with_only_an_empty_pushurl(void) -{ - git_remote *remote = NULL; - - cl_git_pass(git_remote_lookup(&remote, _repo, "empty-remote-pushurl")); - - cl_assert(remote->url == NULL); - cl_assert(remote->pushurl == NULL); - - cl_git_fail(git_remote_connect(remote, GIT_DIRECTION_FETCH, NULL)); - - git_remote_free(remote); -} - -void test_network_remote_remotes__returns_ENOTFOUND_when_neither_url_nor_pushurl(void) -{ - git_remote *remote = NULL; - - cl_git_fail_with( - git_remote_lookup(&remote, _repo, "no-remote-url"), GIT_ENOTFOUND); -} - -void assert_cannot_create_remote(const char *name, int expected_error) -{ - git_remote *remote = NULL; - - cl_git_fail_with( - git_remote_create(&remote, _repo, name, "git://github.com/libgit2/libgit2"), - expected_error); - - cl_assert_equal_p(remote, NULL); -} - -void test_network_remote_remotes__cannot_create_a_remote_which_name_conflicts_with_an_existing_remote(void) -{ - assert_cannot_create_remote("test", GIT_EEXISTS); -} - -void test_network_remote_remotes__cannot_create_a_remote_which_name_is_invalid(void) -{ - assert_cannot_create_remote("/", GIT_EINVALIDSPEC); - assert_cannot_create_remote("//", GIT_EINVALIDSPEC); - assert_cannot_create_remote(".lock", GIT_EINVALIDSPEC); - assert_cannot_create_remote("a.lock", GIT_EINVALIDSPEC); -} - -void test_network_remote_remote__git_remote_create_with_fetchspec(void) -{ - git_remote *remote; - git_strarray array; - - cl_git_pass(git_remote_create_with_fetchspec(&remote, _repo, "test-new", "git://github.com/libgit2/libgit2", "+refs/*:refs/*")); - git_remote_get_fetch_refspecs(&array, remote); - cl_assert_equal_s("+refs/*:refs/*", array.strings[0]); - git_remote_free(remote); -} - -static const char *fetch_refspecs[] = { - "+refs/heads/*:refs/remotes/origin/*", - "refs/tags/*:refs/tags/*", - "+refs/pull/*:refs/pull/*", -}; - -static const char *push_refspecs[] = { - "refs/heads/*:refs/heads/*", - "refs/tags/*:refs/tags/*", - "refs/notes/*:refs/notes/*", -}; - -void test_network_remote_remotes__query_refspecs(void) -{ - git_remote *remote; - git_strarray array; - int i; - - cl_git_pass(git_remote_create_with_fetchspec(&remote, _repo, "query", "git://github.com/libgit2/libgit2", NULL)); - git_remote_free(remote); - - for (i = 0; i < 3; i++) { - cl_git_pass(git_remote_add_fetch(_repo, "query", fetch_refspecs[i])); - cl_git_pass(git_remote_add_push(_repo, "query", push_refspecs[i])); - } - - cl_git_pass(git_remote_lookup(&remote, _repo, "query")); - - cl_git_pass(git_remote_get_fetch_refspecs(&array, remote)); - for (i = 0; i < 3; i++) { - cl_assert_equal_s(fetch_refspecs[i], array.strings[i]); - } - git_strarray_free(&array); - - cl_git_pass(git_remote_get_push_refspecs(&array, remote)); - for (i = 0; i < 3; i++) { - cl_assert_equal_s(push_refspecs[i], array.strings[i]); - } - git_strarray_free(&array); - - git_remote_free(remote); - git_remote_delete(_repo, "test"); -} diff --git a/vendor/libgit2/tests/network/remote/rename.c b/vendor/libgit2/tests/network/remote/rename.c deleted file mode 100644 index b44a0ae716..0000000000 --- a/vendor/libgit2/tests/network/remote/rename.c +++ /dev/null @@ -1,255 +0,0 @@ -#include "clar_libgit2.h" -#include "config/config_helpers.h" - -#include "repository.h" - -static git_repository *_repo; -static const char *_remote_name = "test"; - -void test_network_remote_rename__initialize(void) -{ - _repo = cl_git_sandbox_init("testrepo.git"); -} - -void test_network_remote_rename__cleanup(void) -{ - cl_git_sandbox_cleanup(); -} - -static int dont_call_me_cb(const char *fetch_refspec, void *payload) -{ - GIT_UNUSED(fetch_refspec); - GIT_UNUSED(payload); - - cl_assert(false); - - return -1; -} - -void test_network_remote_rename__renaming_a_remote_moves_related_configuration_section(void) -{ - git_strarray problems = {0}; - - assert_config_entry_existence(_repo, "remote.test.fetch", true); - assert_config_entry_existence(_repo, "remote.just/renamed.fetch", false); - - cl_git_pass(git_remote_rename(&problems, _repo, _remote_name, "just/renamed")); - cl_assert_equal_i(0, problems.count); - git_strarray_free(&problems); - - assert_config_entry_existence(_repo, "remote.test.fetch", false); - assert_config_entry_existence(_repo, "remote.just/renamed.fetch", true); -} - -void test_network_remote_rename__renaming_a_remote_updates_branch_related_configuration_entries(void) -{ - git_strarray problems = {0}; - - assert_config_entry_value(_repo, "branch.master.remote", "test"); - - cl_git_pass(git_remote_rename(&problems, _repo, _remote_name, "just/renamed")); - cl_assert_equal_i(0, problems.count); - git_strarray_free(&problems); - - assert_config_entry_value(_repo, "branch.master.remote", "just/renamed"); -} - -void test_network_remote_rename__renaming_a_remote_updates_default_fetchrefspec(void) -{ - git_strarray problems = {0}; - - cl_git_pass(git_remote_rename(&problems, _repo, _remote_name, "just/renamed")); - cl_assert_equal_i(0, problems.count); - git_strarray_free(&problems); - - assert_config_entry_value(_repo, "remote.just/renamed.fetch", "+refs/heads/*:refs/remotes/just/renamed/*"); -} - -void test_network_remote_rename__renaming_a_remote_without_a_fetchrefspec_doesnt_create_one(void) -{ - git_config *config; - git_remote *remote; - git_strarray problems = {0}; - - cl_git_pass(git_repository_config__weakptr(&config, _repo)); - cl_git_pass(git_config_delete_entry(config, "remote.test.fetch")); - - cl_git_pass(git_remote_lookup(&remote, _repo, "test")); - git_remote_free(remote); - - assert_config_entry_existence(_repo, "remote.test.fetch", false); - - cl_git_pass(git_remote_rename(&problems, _repo, _remote_name, "just/renamed")); - cl_assert_equal_i(0, problems.count); - git_strarray_free(&problems); - - assert_config_entry_existence(_repo, "remote.just/renamed.fetch", false); -} - -void test_network_remote_rename__renaming_a_remote_notifies_of_non_default_fetchrefspec(void) -{ - git_config *config; - git_remote *remote; - git_strarray problems = {0}; - - cl_git_pass(git_repository_config__weakptr(&config, _repo)); - cl_git_pass(git_config_set_string(config, "remote.test.fetch", "+refs/*:refs/*")); - cl_git_pass(git_remote_lookup(&remote, _repo, "test")); - git_remote_free(remote); - - cl_git_pass(git_remote_rename(&problems, _repo, _remote_name, "just/renamed")); - cl_assert_equal_i(1, problems.count); - cl_assert_equal_s("+refs/*:refs/*", problems.strings[0]); - git_strarray_free(&problems); - - assert_config_entry_value(_repo, "remote.just/renamed.fetch", "+refs/*:refs/*"); - - git_strarray_free(&problems); -} - -void test_network_remote_rename__new_name_can_contain_dots(void) -{ - git_strarray problems = {0}; - - cl_git_pass(git_remote_rename(&problems, _repo, _remote_name, "just.renamed")); - cl_assert_equal_i(0, problems.count); - git_strarray_free(&problems); - assert_config_entry_existence(_repo, "remote.just.renamed.fetch", true); -} - -void test_network_remote_rename__new_name_must_conform_to_reference_naming_conventions(void) -{ - git_strarray problems = {0}; - - cl_assert_equal_i( - GIT_EINVALIDSPEC, - git_remote_rename(&problems, _repo, _remote_name, "new@{name")); -} - -void test_network_remote_rename__renamed_name_is_persisted(void) -{ - git_remote *renamed; - git_repository *another_repo; - git_strarray problems = {0}; - - cl_git_fail(git_remote_lookup(&renamed, _repo, "just/renamed")); - - cl_git_pass(git_remote_rename(&problems, _repo, _remote_name, "just/renamed")); - cl_assert_equal_i(0, problems.count); - git_strarray_free(&problems); - - cl_git_pass(git_repository_open(&another_repo, "testrepo.git")); - cl_git_pass(git_remote_lookup(&renamed, _repo, "just/renamed")); - - git_remote_free(renamed); - git_repository_free(another_repo); -} - -void test_network_remote_rename__cannot_overwrite_an_existing_remote(void) -{ - git_strarray problems = {0}; - - cl_assert_equal_i(GIT_EEXISTS, git_remote_rename(&problems, _repo, _remote_name, "test")); - cl_assert_equal_i(GIT_EEXISTS, git_remote_rename(&problems, _repo, _remote_name, "test_with_pushurl")); -} - -void test_network_remote_rename__renaming_a_remote_moves_the_underlying_reference(void) -{ - git_reference *underlying; - git_strarray problems = {0}; - - cl_assert_equal_i(GIT_ENOTFOUND, git_reference_lookup(&underlying, _repo, "refs/remotes/just/renamed")); - cl_git_pass(git_reference_lookup(&underlying, _repo, "refs/remotes/test/master")); - git_reference_free(underlying); - - cl_git_pass(git_remote_rename(&problems, _repo, _remote_name, "just/renamed")); - cl_assert_equal_i(0, problems.count); - git_strarray_free(&problems); - - cl_assert_equal_i(GIT_ENOTFOUND, git_reference_lookup(&underlying, _repo, "refs/remotes/test/master")); - cl_git_pass(git_reference_lookup(&underlying, _repo, "refs/remotes/just/renamed/master")); - git_reference_free(underlying); -} - -void test_network_remote_rename__overwrite_ref_in_target(void) -{ - git_oid id; - char idstr[GIT_OID_HEXSZ + 1] = {0}; - git_reference *ref; - git_branch_t btype; - git_branch_iterator *iter; - git_strarray problems = {0}; - - cl_git_pass(git_oid_fromstr(&id, "a65fedf39aefe402d3bb6e24df4d4f5fe4547750")); - cl_git_pass(git_reference_create(&ref, _repo, "refs/remotes/renamed/master", &id, 1, NULL)); - git_reference_free(ref); - - cl_git_pass(git_remote_rename(&problems, _repo, _remote_name, "renamed")); - cl_assert_equal_i(0, problems.count); - git_strarray_free(&problems); - - /* make sure there's only one remote-tracking branch */ - cl_git_pass(git_branch_iterator_new(&iter, _repo, GIT_BRANCH_REMOTE)); - cl_git_pass(git_branch_next(&ref, &btype, iter)); - cl_assert_equal_s("refs/remotes/renamed/master", git_reference_name(ref)); - git_oid_fmt(idstr, git_reference_target(ref)); - cl_assert_equal_s("be3563ae3f795b2b4353bcce3a527ad0a4f7f644", idstr); - git_reference_free(ref); - - cl_git_fail_with(GIT_ITEROVER, git_branch_next(&ref, &btype, iter)); - git_branch_iterator_free(iter); -} - -void test_network_remote_rename__nonexistent_returns_enotfound(void) -{ - git_strarray problems = {0}; - - int err = git_remote_rename(&problems, _repo, "nonexistent", "renamed"); - - cl_assert_equal_i(GIT_ENOTFOUND, err); -} - -void test_network_remote_rename__symref_head(void) -{ - int error; - git_reference *ref; - git_branch_t btype; - git_branch_iterator *iter; - git_strarray problems = {0}; - char idstr[GIT_OID_HEXSZ + 1] = {0}; - git_vector refs; - - cl_git_pass(git_reference_symbolic_create(&ref, _repo, "refs/remotes/test/HEAD", "refs/remotes/test/master", 0, NULL)); - git_reference_free(ref); - - cl_git_pass(git_remote_rename(&problems, _repo, _remote_name, "renamed")); - cl_assert_equal_i(0, problems.count); - git_strarray_free(&problems); - - cl_git_pass(git_vector_init(&refs, 2, (git_vector_cmp) git_reference_cmp)); - cl_git_pass(git_branch_iterator_new(&iter, _repo, GIT_BRANCH_REMOTE)); - - while ((error = git_branch_next(&ref, &btype, iter)) == 0) { - cl_git_pass(git_vector_insert(&refs, ref)); - } - cl_assert_equal_i(GIT_ITEROVER, error); - git_vector_sort(&refs); - - cl_assert_equal_i(2, refs.length); - - ref = git_vector_get(&refs, 0); - cl_assert_equal_s("refs/remotes/renamed/HEAD", git_reference_name(ref)); - cl_assert_equal_s("refs/remotes/renamed/master", git_reference_symbolic_target(ref)); - git_reference_free(ref); - - ref = git_vector_get(&refs, 1); - cl_assert_equal_s("refs/remotes/renamed/master", git_reference_name(ref)); - git_oid_fmt(idstr, git_reference_target(ref)); - cl_assert_equal_s("be3563ae3f795b2b4353bcce3a527ad0a4f7f644", idstr); - git_reference_free(ref); - - git_vector_free(&refs); - - cl_git_fail_with(GIT_ITEROVER, git_branch_next(&ref, &btype, iter)); - git_branch_iterator_free(iter); -} diff --git a/vendor/libgit2/tests/network/urlparse.c b/vendor/libgit2/tests/network/urlparse.c deleted file mode 100644 index b3ac8ae60c..0000000000 --- a/vendor/libgit2/tests/network/urlparse.c +++ /dev/null @@ -1,211 +0,0 @@ -#include "clar_libgit2.h" -#include "netops.h" - -static char *host, *port, *path, *user, *pass; -static gitno_connection_data conndata; - -void test_network_urlparse__initialize(void) -{ - host = port = path = user = pass = NULL; - memset(&conndata, 0, sizeof(conndata)); -} - -void test_network_urlparse__cleanup(void) -{ -#define FREE_AND_NULL(x) if (x) { git__free(x); x = NULL; } - FREE_AND_NULL(host); - FREE_AND_NULL(port); - FREE_AND_NULL(path); - FREE_AND_NULL(user); - FREE_AND_NULL(pass); - - gitno_connection_data_free_ptrs(&conndata); -} - -void test_network_urlparse__trivial(void) -{ - cl_git_pass(gitno_extract_url_parts(&host, &port, &path, &user, &pass, - "http://example.com/resource", "8080")); - cl_assert_equal_s(host, "example.com"); - cl_assert_equal_s(port, "8080"); - cl_assert_equal_s(path, "/resource"); - cl_assert_equal_p(user, NULL); - cl_assert_equal_p(pass, NULL); -} - -void test_network_urlparse__root(void) -{ - cl_git_pass(gitno_extract_url_parts(&host, &port, &path, &user, &pass, - "http://example.com/", "8080")); - cl_assert_equal_s(host, "example.com"); - cl_assert_equal_s(port, "8080"); - cl_assert_equal_s(path, "/"); - cl_assert_equal_p(user, NULL); - cl_assert_equal_p(pass, NULL); -} - -void test_network_urlparse__just_hostname(void) -{ - cl_git_fail_with(GIT_EINVALIDSPEC, - gitno_extract_url_parts(&host, &port, &path, &user, &pass, - "http://example.com", "8080")); -} - -void test_network_urlparse__encoded_password(void) -{ - cl_git_pass(gitno_extract_url_parts(&host, &port, &path, &user, &pass, - "https://user:pass%2fis%40bad@hostname.com:1234/", "1")); - cl_assert_equal_s(host, "hostname.com"); - cl_assert_equal_s(port, "1234"); - cl_assert_equal_s(path, "/"); - cl_assert_equal_s(user, "user"); - cl_assert_equal_s(pass, "pass/is@bad"); -} - -void test_network_urlparse__user(void) -{ - cl_git_pass(gitno_extract_url_parts(&host, &port, &path, &user, &pass, - "https://user@example.com/resource", "8080")); - cl_assert_equal_s(host, "example.com"); - cl_assert_equal_s(port, "8080"); - cl_assert_equal_s(path, "/resource"); - cl_assert_equal_s(user, "user"); - cl_assert_equal_p(pass, NULL); -} - -void test_network_urlparse__user_pass(void) -{ - /* user:pass@hostname.tld/resource */ - cl_git_pass(gitno_extract_url_parts(&host, &port, &path, &user, &pass, - "https://user:pass@example.com/resource", "8080")); - cl_assert_equal_s(host, "example.com"); - cl_assert_equal_s(port, "8080"); - cl_assert_equal_s(path, "/resource"); - cl_assert_equal_s(user, "user"); - cl_assert_equal_s(pass, "pass"); -} - -void test_network_urlparse__port(void) -{ - /* hostname.tld:port/resource */ - cl_git_pass(gitno_extract_url_parts(&host, &port, &path, &user, &pass, - "https://example.com:9191/resource", "8080")); - cl_assert_equal_s(host, "example.com"); - cl_assert_equal_s(port, "9191"); - cl_assert_equal_s(path, "/resource"); - cl_assert_equal_p(user, NULL); - cl_assert_equal_p(pass, NULL); -} - -void test_network_urlparse__user_port(void) -{ - /* user@hostname.tld:port/resource */ - cl_git_pass(gitno_extract_url_parts(&host, &port, &path, &user, &pass, - "https://user@example.com:9191/resource", "8080")); - cl_assert_equal_s(host, "example.com"); - cl_assert_equal_s(port, "9191"); - cl_assert_equal_s(path, "/resource"); - cl_assert_equal_s(user, "user"); - cl_assert_equal_p(pass, NULL); -} - -void test_network_urlparse__user_pass_port(void) -{ - /* user:pass@hostname.tld:port/resource */ - cl_git_pass(gitno_extract_url_parts(&host, &port, &path, &user, &pass, - "https://user:pass@example.com:9191/resource", "8080")); - cl_assert_equal_s(host, "example.com"); - cl_assert_equal_s(port, "9191"); - cl_assert_equal_s(path, "/resource"); - cl_assert_equal_s(user, "user"); - cl_assert_equal_s(pass, "pass"); -} - -void test_network_urlparse__connection_data_http(void) -{ - cl_git_pass(gitno_connection_data_from_url(&conndata, - "http://example.com/foo/bar/baz", "bar/baz")); - cl_assert_equal_s(conndata.host, "example.com"); - cl_assert_equal_s(conndata.port, "80"); - cl_assert_equal_s(conndata.path, "/foo/"); - cl_assert_equal_p(conndata.user, NULL); - cl_assert_equal_p(conndata.pass, NULL); - cl_assert_equal_i(conndata.use_ssl, false); -} - -void test_network_urlparse__connection_data_ssl(void) -{ - cl_git_pass(gitno_connection_data_from_url(&conndata, - "https://example.com/foo/bar/baz", "bar/baz")); - cl_assert_equal_s(conndata.host, "example.com"); - cl_assert_equal_s(conndata.port, "443"); - cl_assert_equal_s(conndata.path, "/foo/"); - cl_assert_equal_p(conndata.user, NULL); - cl_assert_equal_p(conndata.pass, NULL); - cl_assert_equal_i(conndata.use_ssl, true); -} - -void test_network_urlparse__encoded_username_password(void) -{ - cl_git_pass(gitno_connection_data_from_url(&conndata, - "https://user%2fname:pass%40word%zyx%v@example.com/foo/bar/baz", "bar/baz")); - cl_assert_equal_s(conndata.host, "example.com"); - cl_assert_equal_s(conndata.port, "443"); - cl_assert_equal_s(conndata.path, "/foo/"); - cl_assert_equal_s(conndata.user, "user/name"); - cl_assert_equal_s(conndata.pass, "pass@word%zyx%v"); - cl_assert_equal_i(conndata.use_ssl, true); -} - -void test_network_urlparse__connection_data_cross_host_redirect(void) -{ - conndata.host = git__strdup("bar.com"); - cl_git_fail_with(gitno_connection_data_from_url(&conndata, - "https://foo.com/bar/baz", NULL), - -1); -} - -void test_network_urlparse__connection_data_http_downgrade(void) -{ - conndata.use_ssl = true; - cl_git_fail_with(gitno_connection_data_from_url(&conndata, - "http://foo.com/bar/baz", NULL), - -1); -} - -void test_network_urlparse__connection_data_relative_redirect(void) -{ - cl_git_pass(gitno_connection_data_from_url(&conndata, - "http://foo.com/bar/baz/biff", NULL)); - cl_git_pass(gitno_connection_data_from_url(&conndata, - "/zap/baz/biff?bam", NULL)); - cl_assert_equal_s(conndata.host, "foo.com"); - cl_assert_equal_s(conndata.port, "80"); - cl_assert_equal_s(conndata.path, "/zap/baz/biff?bam"); - cl_assert_equal_p(conndata.user, NULL); - cl_assert_equal_p(conndata.pass, NULL); - cl_assert_equal_i(conndata.use_ssl, false); -} - -void test_network_urlparse__connection_data_relative_redirect_ssl(void) -{ - cl_git_pass(gitno_connection_data_from_url(&conndata, - "https://foo.com/bar/baz/biff", NULL)); - cl_git_pass(gitno_connection_data_from_url(&conndata, - "/zap/baz/biff?bam", NULL)); - cl_assert_equal_s(conndata.host, "foo.com"); - cl_assert_equal_s(conndata.port, "443"); - cl_assert_equal_s(conndata.path, "/zap/baz/biff?bam"); - cl_assert_equal_p(conndata.user, NULL); - cl_assert_equal_p(conndata.pass, NULL); - cl_assert_equal_i(conndata.use_ssl, true); -} - -/* Run this under valgrind */ -void test_network_urlparse__connection_data_cleanup(void) -{ - cl_git_pass(gitno_connection_data_from_url(&conndata, - "http://foo.com/bar/baz/biff", "baz/biff")); - cl_git_pass(gitno_connection_data_from_url(&conndata, - "https://foo.com/bar/baz/biff", "baz/biff")); -} diff --git a/vendor/libgit2/tests/notes/notes.c b/vendor/libgit2/tests/notes/notes.c deleted file mode 100644 index a91bf5bdfc..0000000000 --- a/vendor/libgit2/tests/notes/notes.c +++ /dev/null @@ -1,390 +0,0 @@ -#include "clar_libgit2.h" - -#include "buffer.h" - -static git_repository *_repo; -static git_signature *_sig; - -void test_notes_notes__initialize(void) -{ - _repo = cl_git_sandbox_init("testrepo.git"); - cl_git_pass(git_signature_now(&_sig, "alice", "alice@example.com")); -} - -void test_notes_notes__cleanup(void) -{ - git_signature_free(_sig); - _sig = NULL; - - cl_git_sandbox_cleanup(); -} - -static void assert_note_equal(git_note *note, char *message, git_oid *note_oid) { - git_blob *blob; - - cl_assert_equal_s(git_note_message(note), message); - cl_assert_equal_oid(git_note_id(note), note_oid); - - cl_git_pass(git_blob_lookup(&blob, _repo, note_oid)); - cl_assert_equal_s(git_note_message(note), (const char *)git_blob_rawcontent(blob)); - - git_blob_free(blob); -} - -static void create_note(git_oid *note_oid, const char *canonical_namespace, const char *target_sha, const char *message) -{ - git_oid oid; - - cl_git_pass(git_oid_fromstr(&oid, target_sha)); - cl_git_pass(git_note_create(note_oid, _repo, canonical_namespace, _sig, _sig, &oid, message, 0)); -} - -static struct { - const char *note_sha; - const char *annotated_object_sha; -} -list_expectations[] = { - { "1c73b1f51762155d357bcd1fd4f2c409ef80065b", "4a202b346bb0fb0db7eff3cffeb3c70babbd2045" }, - { "1c73b1f51762155d357bcd1fd4f2c409ef80065b", "9fd738e8f7967c078dceed8190330fc8648ee56a" }, - { "257b43746b6b46caa4aa788376c647cce0a33e2b", "a65fedf39aefe402d3bb6e24df4d4f5fe4547750" }, - { "1ec1c8e03f461f4f5d3f3702172483662e7223f3", "c47800c7266a2be04c571c04d5a6614691ea99bd" }, - { NULL, NULL } -}; - -#define EXPECTATIONS_COUNT (sizeof(list_expectations)/sizeof(list_expectations[0])) - 1 - -static int note_list_cb( - const git_oid *blob_id, const git_oid *annotated_obj_id, void *payload) -{ - git_oid expected_note_oid, expected_target_oid; - - unsigned int *count = (unsigned int *)payload; - - cl_assert(*count < EXPECTATIONS_COUNT); - - cl_git_pass(git_oid_fromstr(&expected_note_oid, list_expectations[*count].note_sha)); - cl_assert_equal_oid(&expected_note_oid, blob_id); - - cl_git_pass(git_oid_fromstr(&expected_target_oid, list_expectations[*count].annotated_object_sha)); - cl_assert_equal_oid(&expected_target_oid, annotated_obj_id); - - (*count)++; - - return 0; -} - -/* - * $ git notes --ref i-can-see-dead-notes add -m "I decorate a65f" a65fedf39aefe402d3bb6e24df4d4f5fe4547750 - * $ git notes --ref i-can-see-dead-notes add -m "I decorate c478" c47800c7266a2be04c571c04d5a6614691ea99bd - * $ git notes --ref i-can-see-dead-notes add -m "I decorate 9fd7 and 4a20" 9fd738e8f7967c078dceed8190330fc8648ee56a - * $ git notes --ref i-can-see-dead-notes add -m "I decorate 9fd7 and 4a20" 4a202b346bb0fb0db7eff3cffeb3c70babbd2045 - * - * $ git notes --ref i-can-see-dead-notes list - * 1c73b1f51762155d357bcd1fd4f2c409ef80065b 4a202b346bb0fb0db7eff3cffeb3c70babbd2045 - * 1c73b1f51762155d357bcd1fd4f2c409ef80065b 9fd738e8f7967c078dceed8190330fc8648ee56a - * 257b43746b6b46caa4aa788376c647cce0a33e2b a65fedf39aefe402d3bb6e24df4d4f5fe4547750 - * 1ec1c8e03f461f4f5d3f3702172483662e7223f3 c47800c7266a2be04c571c04d5a6614691ea99bd - * - * $ git ls-tree refs/notes/i-can-see-dead-notes - * 100644 blob 1c73b1f51762155d357bcd1fd4f2c409ef80065b 4a202b346bb0fb0db7eff3cffeb3c70babbd2045 - * 100644 blob 1c73b1f51762155d357bcd1fd4f2c409ef80065b 9fd738e8f7967c078dceed8190330fc8648ee56a - * 100644 blob 257b43746b6b46caa4aa788376c647cce0a33e2b a65fedf39aefe402d3bb6e24df4d4f5fe4547750 - * 100644 blob 1ec1c8e03f461f4f5d3f3702172483662e7223f3 c47800c7266a2be04c571c04d5a6614691ea99bd -*/ -void test_notes_notes__can_retrieve_a_list_of_notes_for_a_given_namespace(void) -{ - git_oid note_oid1, note_oid2, note_oid3, note_oid4; - unsigned int retrieved_notes = 0; - - create_note(¬e_oid1, "refs/notes/i-can-see-dead-notes", "a65fedf39aefe402d3bb6e24df4d4f5fe4547750", "I decorate a65f\n"); - create_note(¬e_oid2, "refs/notes/i-can-see-dead-notes", "c47800c7266a2be04c571c04d5a6614691ea99bd", "I decorate c478\n"); - create_note(¬e_oid3, "refs/notes/i-can-see-dead-notes", "9fd738e8f7967c078dceed8190330fc8648ee56a", "I decorate 9fd7 and 4a20\n"); - create_note(¬e_oid4, "refs/notes/i-can-see-dead-notes", "4a202b346bb0fb0db7eff3cffeb3c70babbd2045", "I decorate 9fd7 and 4a20\n"); - - cl_git_pass(git_note_foreach -(_repo, "refs/notes/i-can-see-dead-notes", note_list_cb, &retrieved_notes)); - - cl_assert_equal_i(4, retrieved_notes); -} - -static int note_cancel_cb( - const git_oid *blob_id, const git_oid *annotated_obj_id, void *payload) -{ - unsigned int *count = (unsigned int *)payload; - - GIT_UNUSED(blob_id); - GIT_UNUSED(annotated_obj_id); - - (*count)++; - - return (*count > 2); -} - -void test_notes_notes__can_cancel_foreach(void) -{ - git_oid note_oid1, note_oid2, note_oid3, note_oid4; - unsigned int retrieved_notes = 0; - - create_note(¬e_oid1, "refs/notes/i-can-see-dead-notes", "a65fedf39aefe402d3bb6e24df4d4f5fe4547750", "I decorate a65f\n"); - create_note(¬e_oid2, "refs/notes/i-can-see-dead-notes", "c47800c7266a2be04c571c04d5a6614691ea99bd", "I decorate c478\n"); - create_note(¬e_oid3, "refs/notes/i-can-see-dead-notes", "9fd738e8f7967c078dceed8190330fc8648ee56a", "I decorate 9fd7 and 4a20\n"); - create_note(¬e_oid4, "refs/notes/i-can-see-dead-notes", "4a202b346bb0fb0db7eff3cffeb3c70babbd2045", "I decorate 9fd7 and 4a20\n"); - - cl_assert_equal_i( - 1, - git_note_foreach(_repo, "refs/notes/i-can-see-dead-notes", - note_cancel_cb, &retrieved_notes)); -} - -void test_notes_notes__retrieving_a_list_of_notes_for_an_unknown_namespace_returns_ENOTFOUND(void) -{ - int error; - unsigned int retrieved_notes = 0; - - error = git_note_foreach(_repo, "refs/notes/i-am-not", note_list_cb, &retrieved_notes); - cl_git_fail(error); - cl_assert_equal_i(GIT_ENOTFOUND, error); - - cl_assert_equal_i(0, retrieved_notes); -} - -void test_notes_notes__inserting_a_note_without_passing_a_namespace_uses_the_default_namespace(void) -{ - git_oid note_oid, target_oid; - git_note *note, *default_namespace_note; - git_buf default_ref = GIT_BUF_INIT; - - cl_git_pass(git_oid_fromstr(&target_oid, "08b041783f40edfe12bb406c9c9a8a040177c125")); - cl_git_pass(git_note_default_ref(&default_ref, _repo)); - - create_note(¬e_oid, NULL, "08b041783f40edfe12bb406c9c9a8a040177c125", "hello world\n"); - - cl_git_pass(git_note_read(¬e, _repo, NULL, &target_oid)); - cl_git_pass(git_note_read(&default_namespace_note, _repo, git_buf_cstr(&default_ref), &target_oid)); - - assert_note_equal(note, "hello world\n", ¬e_oid); - assert_note_equal(default_namespace_note, "hello world\n", ¬e_oid); - - git_buf_free(&default_ref); - git_note_free(note); - git_note_free(default_namespace_note); -} - -void test_notes_notes__can_insert_a_note_with_a_custom_namespace(void) -{ - git_oid note_oid, target_oid; - git_note *note; - - cl_git_pass(git_oid_fromstr(&target_oid, "08b041783f40edfe12bb406c9c9a8a040177c125")); - - create_note(¬e_oid, "refs/notes/some/namespace", "08b041783f40edfe12bb406c9c9a8a040177c125", "hello world on a custom namespace\n"); - - cl_git_pass(git_note_read(¬e, _repo, "refs/notes/some/namespace", &target_oid)); - - assert_note_equal(note, "hello world on a custom namespace\n", ¬e_oid); - - git_note_free(note); -} - -/* - * $ git notes --ref fanout list 8496071c1b46c854b31185ea97743be6a8774479 - * 08b041783f40edfe12bb406c9c9a8a040177c125 - */ -void test_notes_notes__creating_a_note_on_a_target_which_already_has_one_returns_EEXISTS(void) -{ - int error; - git_oid note_oid, target_oid; - - cl_git_pass(git_oid_fromstr(&target_oid, "08b041783f40edfe12bb406c9c9a8a040177c125")); - - create_note(¬e_oid, NULL, "08b041783f40edfe12bb406c9c9a8a040177c125", "hello world\n"); - error = git_note_create(¬e_oid, _repo, NULL, _sig, _sig, &target_oid, "hello world\n", 0); - cl_git_fail(error); - cl_assert_equal_i(GIT_EEXISTS, error); - - create_note(¬e_oid, "refs/notes/some/namespace", "08b041783f40edfe12bb406c9c9a8a040177c125", "hello world\n"); - error = git_note_create(¬e_oid, _repo, "refs/notes/some/namespace", _sig, _sig, &target_oid, "hello world\n", 0); - cl_git_fail(error); - cl_assert_equal_i(GIT_EEXISTS, error); -} - - -void test_notes_notes__creating_a_note_on_a_target_can_overwrite_existing_note(void) -{ - git_oid note_oid, target_oid; - git_note *note, *namespace_note; - - cl_git_pass(git_oid_fromstr(&target_oid, "08b041783f40edfe12bb406c9c9a8a040177c125")); - - create_note(¬e_oid, NULL, "08b041783f40edfe12bb406c9c9a8a040177c125", "hello old world\n"); - cl_git_pass(git_note_create(¬e_oid, _repo, NULL, _sig, _sig, &target_oid, "hello new world\n", 1)); - - cl_git_pass(git_note_read(¬e, _repo, NULL, &target_oid)); - assert_note_equal(note, "hello new world\n", ¬e_oid); - - create_note(¬e_oid, "refs/notes/some/namespace", "08b041783f40edfe12bb406c9c9a8a040177c125", "hello old world\n"); - cl_git_pass(git_note_create(¬e_oid, _repo, "refs/notes/some/namespace", _sig, _sig, &target_oid, "hello new ref world\n", 1)); - - cl_git_pass(git_note_read(&namespace_note, _repo, "refs/notes/some/namespace", &target_oid)); - assert_note_equal(namespace_note, "hello new ref world\n", ¬e_oid); - - git_note_free(note); - git_note_free(namespace_note); -} - -static char *messages[] = { - "08c041783f40edfe12bb406c9c9a8a040177c125", - "96c45fbe09ab7445fc7c60fd8d17f32494399343", - "48cc7e38dcfc1ec87e70ec03e08c3e83d7a16aa1", - "24c3eaafb681c3df668f9df96f58e7b8c756eb04", - "96ca1b6ccc7858ae94684777f85ac0e7447f7040", - "7ac2db4378a08bb244a427c357e0082ee0d57ac6", - "e6cba23dbf4ef84fe35e884f017f4e24dc228572", - "c8cf3462c7d8feba716deeb2ebe6583bd54589e2", - "39c16b9834c2d665ac5f68ad91dc5b933bad8549", - "f3c582b1397df6a664224ebbaf9d4cc952706597", - "29cec67037fe8e89977474988219016ae7f342a6", - "36c4cd238bf8e82e27b740e0741b025f2e8c79ab", - "f1c45a47c02e01d5a9a326f1d9f7f756373387f8", - "4aca84406f5daee34ab513a60717c8d7b1763ead", - "84ce167da452552f63ed8407b55d5ece4901845f", - NULL -}; - -#define MESSAGES_COUNT (sizeof(messages)/sizeof(messages[0])) - 1 - -/* - * $ git ls-tree refs/notes/fanout - * 040000 tree 4b22b35d44b5a4f589edf3dc89196399771796ea 84 - * - * $ git ls-tree 4b22b35 - * 040000 tree d71aab4f9b04b45ce09bcaa636a9be6231474759 96 - * - * $ git ls-tree d71aab4 - * 100644 blob 08b041783f40edfe12bb406c9c9a8a040177c125 071c1b46c854b31185ea97743be6a8774479 - */ -void test_notes_notes__can_insert_a_note_in_an_existing_fanout(void) -{ - size_t i; - git_oid note_oid, target_oid; - git_note *_note; - - cl_git_pass(git_oid_fromstr(&target_oid, "08b041783f40edfe12bb406c9c9a8a040177c125")); - - for (i = 0; i < MESSAGES_COUNT; i++) { - cl_git_pass(git_note_create(¬e_oid, _repo, "refs/notes/fanout", _sig, _sig, &target_oid, messages[i], 0)); - cl_git_pass(git_note_read(&_note, _repo, "refs/notes/fanout", &target_oid)); - git_note_free(_note); - - git_oid_cpy(&target_oid, ¬e_oid); - } -} - -/* - * $ git notes --ref fanout list 8496071c1b46c854b31185ea97743be6a8774479 - * 08b041783f40edfe12bb406c9c9a8a040177c125 - */ -void test_notes_notes__can_read_a_note_in_an_existing_fanout(void) -{ - git_oid note_oid, target_oid; - git_note *note; - - cl_git_pass(git_oid_fromstr(&target_oid, "8496071c1b46c854b31185ea97743be6a8774479")); - cl_git_pass(git_note_read(¬e, _repo, "refs/notes/fanout", &target_oid)); - - cl_git_pass(git_oid_fromstr(¬e_oid, "08b041783f40edfe12bb406c9c9a8a040177c125")); - cl_assert_equal_oid(git_note_id(note), ¬e_oid); - - git_note_free(note); -} - -void test_notes_notes__can_remove_a_note_in_an_existing_fanout(void) -{ - git_oid target_oid; - git_note *note; - - cl_git_pass(git_oid_fromstr(&target_oid, "8496071c1b46c854b31185ea97743be6a8774479")); - cl_git_pass(git_note_remove(_repo, "refs/notes/fanout", _sig, _sig, &target_oid)); - - cl_git_fail(git_note_read(¬e, _repo, "refs/notes/fanout", &target_oid)); -} - -void test_notes_notes__removing_a_note_which_doesnt_exists_returns_ENOTFOUND(void) -{ - int error; - git_oid target_oid; - - cl_git_pass(git_oid_fromstr(&target_oid, "8496071c1b46c854b31185ea97743be6a8774479")); - cl_git_pass(git_note_remove(_repo, "refs/notes/fanout", _sig, _sig, &target_oid)); - - error = git_note_remove(_repo, "refs/notes/fanout", _sig, _sig, &target_oid); - cl_git_fail(error); - cl_assert_equal_i(GIT_ENOTFOUND, error); -} - -void test_notes_notes__can_iterate_default_namespace(void) -{ - git_note_iterator *iter; - git_note *note; - git_oid note_id, annotated_id; - git_oid note_created[2]; - const char* note_message[] = { - "I decorate a65f\n", - "I decorate c478\n" - }; - int i, err; - - create_note(¬e_created[0], "refs/notes/commits", - "a65fedf39aefe402d3bb6e24df4d4f5fe4547750", note_message[0]); - create_note(¬e_created[1], "refs/notes/commits", - "c47800c7266a2be04c571c04d5a6614691ea99bd", note_message[1]); - - cl_git_pass(git_note_iterator_new(&iter, _repo, NULL)); - - for (i = 0; (err = git_note_next(¬e_id, &annotated_id, iter)) >= 0; ++i) { - cl_git_pass(git_note_read(¬e, _repo, NULL, &annotated_id)); - cl_assert_equal_s(git_note_message(note), note_message[i]); - git_note_free(note); - } - - cl_assert_equal_i(GIT_ITEROVER, err); - cl_assert_equal_i(2, i); - git_note_iterator_free(iter); -} - -void test_notes_notes__can_iterate_custom_namespace(void) -{ - git_note_iterator *iter; - git_note *note; - git_oid note_id, annotated_id; - git_oid note_created[2]; - const char* note_message[] = { - "I decorate a65f\n", - "I decorate c478\n" - }; - int i, err; - - create_note(¬e_created[0], "refs/notes/beer", - "a65fedf39aefe402d3bb6e24df4d4f5fe4547750", note_message[0]); - create_note(¬e_created[1], "refs/notes/beer", - "c47800c7266a2be04c571c04d5a6614691ea99bd", note_message[1]); - - cl_git_pass(git_note_iterator_new(&iter, _repo, "refs/notes/beer")); - - for (i = 0; (err = git_note_next(¬e_id, &annotated_id, iter)) >= 0; ++i) { - cl_git_pass(git_note_read(¬e, _repo, "refs/notes/beer", &annotated_id)); - cl_assert_equal_s(git_note_message(note), note_message[i]); - git_note_free(note); - } - - cl_assert_equal_i(GIT_ITEROVER, err); - cl_assert_equal_i(2, i); - git_note_iterator_free(iter); -} - -void test_notes_notes__empty_iterate(void) -{ - git_note_iterator *iter; - - cl_git_fail(git_note_iterator_new(&iter, _repo, "refs/notes/commits")); -} diff --git a/vendor/libgit2/tests/notes/notesref.c b/vendor/libgit2/tests/notes/notesref.c deleted file mode 100644 index 4159ddc0dd..0000000000 --- a/vendor/libgit2/tests/notes/notesref.c +++ /dev/null @@ -1,68 +0,0 @@ -#include "clar_libgit2.h" - -#include "notes.h" -#include "buffer.h" - -static git_repository *_repo; -static git_note *_note; -static git_signature *_sig; -static git_config *_cfg; - -void test_notes_notesref__initialize(void) -{ - cl_fixture_sandbox("testrepo.git"); - cl_git_pass(git_repository_open(&_repo, "testrepo.git")); -} - -void test_notes_notesref__cleanup(void) -{ - git_note_free(_note); - _note = NULL; - - git_signature_free(_sig); - _sig = NULL; - - git_config_free(_cfg); - _cfg = NULL; - - git_repository_free(_repo); - _repo = NULL; - - cl_fixture_cleanup("testrepo.git"); -} - -void test_notes_notesref__config_corenotesref(void) -{ - git_oid oid, note_oid; - git_buf default_ref = GIT_BUF_INIT; - - cl_git_pass(git_signature_now(&_sig, "alice", "alice@example.com")); - cl_git_pass(git_oid_fromstr(&oid, "8496071c1b46c854b31185ea97743be6a8774479")); - - cl_git_pass(git_repository_config(&_cfg, _repo)); - - cl_git_pass(git_config_set_string(_cfg, "core.notesRef", "refs/notes/mydefaultnotesref")); - - cl_git_pass(git_note_create(¬e_oid, _repo, NULL, _sig, _sig, &oid, "test123test\n", 0)); - - cl_git_pass(git_note_read(&_note, _repo, NULL, &oid)); - cl_assert_equal_s("test123test\n", git_note_message(_note)); - cl_assert_equal_oid(git_note_id(_note), ¬e_oid); - - git_note_free(_note); - - cl_git_pass(git_note_read(&_note, _repo, "refs/notes/mydefaultnotesref", &oid)); - cl_assert_equal_s("test123test\n", git_note_message(_note)); - cl_assert_equal_oid(git_note_id(_note), ¬e_oid); - - cl_git_pass(git_note_default_ref(&default_ref, _repo)); - cl_assert_equal_s("refs/notes/mydefaultnotesref", default_ref.ptr); - git_buf_clear(&default_ref); - - cl_git_pass(git_config_delete_entry(_cfg, "core.notesRef")); - - cl_git_pass(git_note_default_ref(&default_ref, _repo)); - cl_assert_equal_s(GIT_NOTES_DEFAULT_REF, default_ref.ptr); - - git_buf_free(&default_ref); -} diff --git a/vendor/libgit2/tests/object/blob/filter.c b/vendor/libgit2/tests/object/blob/filter.c deleted file mode 100644 index 0aaaee6f37..0000000000 --- a/vendor/libgit2/tests/object/blob/filter.c +++ /dev/null @@ -1,150 +0,0 @@ -#include "clar_libgit2.h" -#include "posix.h" -#include "blob.h" -#include "buf_text.h" - -static git_repository *g_repo = NULL; - -#define CRLF_NUM_TEST_OBJECTS 9 - -static const char *g_crlf_raw[CRLF_NUM_TEST_OBJECTS] = { - "", - "foo\nbar\n", - "foo\rbar\r", - "foo\r\nbar\r\n", - "foo\nbar\rboth\r\nreversed\n\ragain\nproblems\r", - "123\n\000\001\002\003\004abc\255\254\253\r\n", - "\xEF\xBB\xBFThis is UTF-8\n", - "\xEF\xBB\xBF\xE3\x81\xBB\xE3\x81\x92\xE3\x81\xBB\xE3\x81\x92\r\n\xE3\x81\xBB\xE3\x81\x92\xE3\x81\xBB\xE3\x81\x92\r\n", - "\xFE\xFF\x00T\x00h\x00i\x00s\x00!" -}; - -static git_off_t g_crlf_raw_len[CRLF_NUM_TEST_OBJECTS] = { - -1, -1, -1, -1, -1, 17, -1, -1, 12 -}; - -static git_oid g_crlf_oids[CRLF_NUM_TEST_OBJECTS]; - -static git_buf g_crlf_filtered[CRLF_NUM_TEST_OBJECTS] = { - { "", 0, 0 }, - { "foo\nbar\n", 0, 8 }, - { "foo\rbar\r", 0, 8 }, - { "foo\nbar\n", 0, 8 }, - { "foo\nbar\rboth\nreversed\n\ragain\nproblems\r", 0, 38 }, - { "123\n\000\001\002\003\004abc\255\254\253\n", 0, 16 }, - { "\xEF\xBB\xBFThis is UTF-8\n", 0, 17 }, - { "\xEF\xBB\xBF\xE3\x81\xBB\xE3\x81\x92\xE3\x81\xBB\xE3\x81\x92\n\xE3\x81\xBB\xE3\x81\x92\xE3\x81\xBB\xE3\x81\x92\n", 0, 29 }, - { "\xFE\xFF\x00T\x00h\x00i\x00s\x00!", 0, 12 } -}; - -static git_buf_text_stats g_crlf_filtered_stats[CRLF_NUM_TEST_OBJECTS] = { - { 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 2, 0, 6, 0 }, - { 0, 0, 2, 0, 0, 6, 0 }, - { 0, 0, 2, 2, 2, 6, 0 }, - { 0, 0, 4, 4, 1, 31, 0 }, - { 0, 1, 1, 2, 1, 9, 5 }, - { GIT_BOM_UTF8, 0, 0, 1, 0, 16, 0 }, - { GIT_BOM_UTF8, 0, 2, 2, 2, 27, 0 }, - { GIT_BOM_UTF16_BE, 5, 0, 0, 0, 7, 5 }, -}; - -void test_object_blob_filter__initialize(void) -{ - int i; - - g_repo = cl_git_sandbox_init("empty_standard_repo"); - - for (i = 0; i < CRLF_NUM_TEST_OBJECTS; i++) { - if (g_crlf_raw_len[i] < 0) - g_crlf_raw_len[i] = strlen(g_crlf_raw[i]); - - cl_git_pass(git_blob_create_frombuffer( - &g_crlf_oids[i], g_repo, g_crlf_raw[i], (size_t)g_crlf_raw_len[i])); - } -} - -void test_object_blob_filter__cleanup(void) -{ - cl_git_sandbox_cleanup(); -} - -void test_object_blob_filter__unfiltered(void) -{ - int i; - git_blob *blob; - - for (i = 0; i < CRLF_NUM_TEST_OBJECTS; i++) { - size_t raw_len = (size_t)g_crlf_raw_len[i]; - - cl_git_pass(git_blob_lookup(&blob, g_repo, &g_crlf_oids[i])); - - cl_assert_equal_sz(raw_len, (size_t)git_blob_rawsize(blob)); - cl_assert_equal_i( - 0, memcmp(g_crlf_raw[i], git_blob_rawcontent(blob), raw_len)); - - git_blob_free(blob); - } -} - -void test_object_blob_filter__stats(void) -{ - int i; - git_blob *blob; - git_buf buf = GIT_BUF_INIT; - git_buf_text_stats stats; - - for (i = 0; i < CRLF_NUM_TEST_OBJECTS; i++) { - cl_git_pass(git_blob_lookup(&blob, g_repo, &g_crlf_oids[i])); - cl_git_pass(git_blob__getbuf(&buf, blob)); - git_buf_text_gather_stats(&stats, &buf, false); - cl_assert_equal_i( - 0, memcmp(&g_crlf_filtered_stats[i], &stats, sizeof(stats))); - git_blob_free(blob); - } - - git_buf_free(&buf); -} - -void test_object_blob_filter__to_odb(void) -{ - git_filter_list *fl = NULL; - git_config *cfg; - int i; - git_blob *blob; - git_buf out = GIT_BUF_INIT, zeroed; - - cl_git_pass(git_repository_config(&cfg, g_repo)); - cl_assert(cfg); - - git_attr_cache_flush(g_repo); - cl_git_append2file("empty_standard_repo/.gitattributes", "*.txt text\n"); - - cl_git_pass(git_filter_list_load( - &fl, g_repo, NULL, "filename.txt", GIT_FILTER_TO_ODB, 0)); - cl_assert(fl != NULL); - - for (i = 0; i < CRLF_NUM_TEST_OBJECTS; i++) { - cl_git_pass(git_blob_lookup(&blob, g_repo, &g_crlf_oids[i])); - - /* try once with allocated blob */ - cl_git_pass(git_filter_list_apply_to_blob(&out, fl, blob)); - cl_assert_equal_sz(g_crlf_filtered[i].size, out.size); - cl_assert_equal_i( - 0, memcmp(out.ptr, g_crlf_filtered[i].ptr, out.size)); - - /* try again with zeroed blob */ - memset(&zeroed, 0, sizeof(zeroed)); - cl_git_pass(git_filter_list_apply_to_blob(&zeroed, fl, blob)); - cl_assert_equal_sz(g_crlf_filtered[i].size, zeroed.size); - cl_assert_equal_i( - 0, memcmp(zeroed.ptr, g_crlf_filtered[i].ptr, zeroed.size)); - git_buf_free(&zeroed); - - git_blob_free(blob); - } - - git_filter_list_free(fl); - git_buf_free(&out); - git_config_free(cfg); -} diff --git a/vendor/libgit2/tests/object/blob/fromchunks.c b/vendor/libgit2/tests/object/blob/fromchunks.c deleted file mode 100644 index b61cabfe19..0000000000 --- a/vendor/libgit2/tests/object/blob/fromchunks.c +++ /dev/null @@ -1,156 +0,0 @@ -#include "clar_libgit2.h" -#include "buffer.h" -#include "posix.h" -#include "path.h" -#include "fileops.h" - -static git_repository *repo; -static char textual_content[] = "libgit2\n\r\n\0"; - -void test_object_blob_fromchunks__initialize(void) -{ - repo = cl_git_sandbox_init("testrepo.git"); -} - -void test_object_blob_fromchunks__cleanup(void) -{ - cl_git_sandbox_cleanup(); -} - -static int text_chunked_source_cb(char *content, size_t max_length, void *payload) -{ - int *count; - - GIT_UNUSED(max_length); - - count = (int *)payload; - (*count)--; - - if (*count == 0) - return 0; - - strcpy(content, textual_content); - return (int)strlen(textual_content); -} - -void test_object_blob_fromchunks__can_create_a_blob_from_a_in_memory_chunk_provider(void) -{ - git_oid expected_oid, oid; - git_object *blob; - int howmany = 7; - - cl_git_pass(git_oid_fromstr(&expected_oid, "321cbdf08803c744082332332838df6bd160f8f9")); - - cl_git_fail_with( - git_object_lookup(&blob, repo, &expected_oid, GIT_OBJ_ANY), - GIT_ENOTFOUND); - - cl_git_pass(git_blob_create_fromchunks(&oid, repo, NULL, text_chunked_source_cb, &howmany)); - - cl_git_pass(git_object_lookup(&blob, repo, &expected_oid, GIT_OBJ_ANY)); - cl_assert(git_oid_cmp(&expected_oid, git_object_id(blob)) == 0); - - git_object_free(blob); -} - -void test_object_blob_fromchunks__doesnot_overwrite_an_already_existing_object(void) -{ - git_buf path = GIT_BUF_INIT; - git_buf content = GIT_BUF_INIT; - git_oid expected_oid, oid; - int howmany = 7; - - cl_git_pass(git_oid_fromstr(&expected_oid, "321cbdf08803c744082332332838df6bd160f8f9")); - - cl_git_pass(git_blob_create_fromchunks(&oid, repo, NULL, text_chunked_source_cb, &howmany)); - - /* Let's replace the content of the blob file storage with something else... */ - cl_git_pass(git_buf_joinpath(&path, git_repository_path(repo), "objects/32/1cbdf08803c744082332332838df6bd160f8f9")); - cl_git_pass(p_unlink(git_buf_cstr(&path))); - cl_git_mkfile(git_buf_cstr(&path), "boom"); - - /* ...request a creation of the same blob... */ - howmany = 7; - cl_git_pass(git_blob_create_fromchunks(&oid, repo, NULL, text_chunked_source_cb, &howmany)); - - /* ...and ensure the content of the faked blob file hasn't been altered */ - cl_git_pass(git_futils_readbuffer(&content, git_buf_cstr(&path))); - cl_assert(!git__strcmp("boom", git_buf_cstr(&content))); - - git_buf_free(&path); - git_buf_free(&content); -} - -#define GITATTR "* text=auto\n" \ - "*.txt text\n" \ - "*.data binary\n" - -static void write_attributes(git_repository *repo) -{ - git_buf buf = GIT_BUF_INIT; - - cl_git_pass(git_buf_joinpath(&buf, git_repository_path(repo), "info")); - cl_git_pass(git_buf_joinpath(&buf, git_buf_cstr(&buf), "attributes")); - - cl_git_pass(git_futils_mkpath2file(git_buf_cstr(&buf), 0777)); - cl_git_rewritefile(git_buf_cstr(&buf), GITATTR); - - git_buf_free(&buf); -} - -static void assert_named_chunked_blob(const char *expected_sha, const char *fake_name) -{ - git_oid expected_oid, oid; - int howmany = 7; - - cl_git_pass(git_oid_fromstr(&expected_oid, expected_sha)); - - cl_git_pass(git_blob_create_fromchunks(&oid, repo, fake_name, text_chunked_source_cb, &howmany)); - cl_assert(git_oid_cmp(&expected_oid, &oid) == 0); -} - -void test_object_blob_fromchunks__creating_a_blob_from_chunks_honors_the_attributes_directives(void) -{ - write_attributes(repo); - - assert_named_chunked_blob("321cbdf08803c744082332332838df6bd160f8f9", "dummy.data"); - assert_named_chunked_blob("e9671e138a780833cb689753570fd10a55be84fb", "dummy.txt"); - assert_named_chunked_blob("e9671e138a780833cb689753570fd10a55be84fb", "dummy.dunno"); -} - -static int failing_chunked_source_cb( - char *content, size_t max_length, void *payload) -{ - int *count = (int *)payload; - - GIT_UNUSED(max_length); - - (*count)--; - if (*count == 0) - return -1234; - - strcpy(content, textual_content); - return (int)strlen(textual_content); -} - -void test_object_blob_fromchunks__can_stop_with_error(void) -{ - git_oid expected_oid, oid; - git_object *blob; - int howmany = 7; - - cl_git_pass(git_oid_fromstr( - &expected_oid, "321cbdf08803c744082332332838df6bd160f8f9")); - - cl_git_fail_with( - git_object_lookup(&blob, repo, &expected_oid, GIT_OBJ_ANY), - GIT_ENOTFOUND); - - cl_git_fail_with(git_blob_create_fromchunks( - &oid, repo, NULL, failing_chunked_source_cb, &howmany), -1234); - - cl_git_fail_with( - git_object_lookup(&blob, repo, &expected_oid, GIT_OBJ_ANY), - GIT_ENOTFOUND); -} - diff --git a/vendor/libgit2/tests/object/blob/write.c b/vendor/libgit2/tests/object/blob/write.c deleted file mode 100644 index 203bc67c1a..0000000000 --- a/vendor/libgit2/tests/object/blob/write.c +++ /dev/null @@ -1,69 +0,0 @@ -#include "clar_libgit2.h" -#include "buffer.h" -#include "posix.h" -#include "path.h" -#include "fileops.h" - -static git_repository *repo; - -#define WORKDIR "empty_standard_repo" -#define BARE_REPO "testrepo.git" -#define ELSEWHERE "elsewhere" - -typedef int (*blob_creator_fn)( - git_oid *, - git_repository *, - const char *); - -void test_object_blob_write__cleanup(void) -{ - cl_git_sandbox_cleanup(); -} - -static void assert_blob_creation(const char *path_to_file, const char *blob_from_path, blob_creator_fn creator) -{ - git_oid oid; - cl_git_mkfile(path_to_file, "1..2...3... Can you hear me?\n"); - - cl_must_pass(creator(&oid, repo, blob_from_path)); - cl_assert(git_oid_streq(&oid, "da5e4f20c91c81b44a7e298f3d3fb3fe2f178e32") == 0); -} - -void test_object_blob_write__can_create_a_blob_in_a_standard_repo_from_a_file_located_in_the_working_directory(void) -{ - repo = cl_git_sandbox_init(WORKDIR); - - assert_blob_creation(WORKDIR "/test.txt", "test.txt", &git_blob_create_fromworkdir); -} - -void test_object_blob_write__can_create_a_blob_in_a_standard_repo_from_a_absolute_filepath_pointing_outside_of_the_working_directory(void) -{ - git_buf full_path = GIT_BUF_INIT; - - repo = cl_git_sandbox_init(WORKDIR); - - cl_must_pass(p_mkdir(ELSEWHERE, 0777)); - cl_must_pass(git_path_prettify_dir(&full_path, ELSEWHERE, NULL)); - cl_must_pass(git_buf_puts(&full_path, "test.txt")); - - assert_blob_creation(ELSEWHERE "/test.txt", git_buf_cstr(&full_path), &git_blob_create_fromdisk); - - git_buf_free(&full_path); - cl_must_pass(git_futils_rmdir_r(ELSEWHERE, NULL, GIT_RMDIR_REMOVE_FILES)); -} - -void test_object_blob_write__can_create_a_blob_in_a_bare_repo_from_a_absolute_filepath(void) -{ - git_buf full_path = GIT_BUF_INIT; - - repo = cl_git_sandbox_init(BARE_REPO); - - cl_must_pass(p_mkdir(ELSEWHERE, 0777)); - cl_must_pass(git_path_prettify_dir(&full_path, ELSEWHERE, NULL)); - cl_must_pass(git_buf_puts(&full_path, "test.txt")); - - assert_blob_creation(ELSEWHERE "/test.txt", git_buf_cstr(&full_path), &git_blob_create_fromdisk); - - git_buf_free(&full_path); - cl_must_pass(git_futils_rmdir_r(ELSEWHERE, NULL, GIT_RMDIR_REMOVE_FILES)); -} diff --git a/vendor/libgit2/tests/object/cache.c b/vendor/libgit2/tests/object/cache.c deleted file mode 100644 index bdf12da7ae..0000000000 --- a/vendor/libgit2/tests/object/cache.c +++ /dev/null @@ -1,287 +0,0 @@ -#include "clar_libgit2.h" -#include "repository.h" - -static git_repository *g_repo; - -void test_object_cache__initialize(void) -{ - g_repo = NULL; -} - -void test_object_cache__cleanup(void) -{ - git_repository_free(g_repo); - g_repo = NULL; - - git_libgit2_opts(GIT_OPT_SET_CACHE_OBJECT_LIMIT, (int)GIT_OBJ_BLOB, (size_t)0); -} - -static struct { - git_otype type; - const char *sha; -} g_data[] = { - /* HEAD */ - { GIT_OBJ_BLOB, "a8233120f6ad708f843d861ce2b7228ec4e3dec6" }, /* README */ - { GIT_OBJ_BLOB, "3697d64be941a53d4ae8f6a271e4e3fa56b022cc" }, /* branch_file.txt */ - { GIT_OBJ_BLOB, "a71586c1dfe8a71c6cbf6c129f404c5642ff31bd" }, /* new.txt */ - - /* refs/heads/subtrees */ - { GIT_OBJ_BLOB, "1385f264afb75a56a5bec74243be9b367ba4ca08" }, /* README */ - { GIT_OBJ_TREE, "f1425cef211cc08caa31e7b545ffb232acb098c3" }, /* ab */ - { GIT_OBJ_BLOB, "d6c93164c249c8000205dd4ec5cbca1b516d487f" }, /* ab/4.txt */ - { GIT_OBJ_TREE, "9a03079b8a8ee85a0bee58bf9be3da8b62414ed4" }, /* ab/c */ - { GIT_OBJ_BLOB, "270b8ea76056d5cad83af921837702d3e3c2924d" }, /* ab/c/3.txt */ - { GIT_OBJ_TREE, "b6361fc6a97178d8fc8639fdeed71c775ab52593" }, /* ab/de */ - { GIT_OBJ_BLOB, "e7b4ad382349ff96dd8199000580b9b1e2042eb0" }, /* ab/de/2.txt */ - { GIT_OBJ_TREE, "3259a6bd5b57fb9c1281bb7ed3167b50f224cb54" }, /* ab/de/fgh */ - { GIT_OBJ_BLOB, "1f67fc4386b2d171e0d21be1c447e12660561f9b" }, /* ab/de/fgh/1.txt */ - { GIT_OBJ_BLOB, "45b983be36b73c0788dc9cbcb76cbb80fc7bb057" }, /* branch_file.txt */ - { GIT_OBJ_BLOB, "fa49b077972391ad58037050f2a75f74e3671e92" }, /* new.txt */ - - /* refs/heads/chomped */ - { GIT_OBJ_BLOB, "0266163a49e280c4f5ed1e08facd36a2bd716bcf" }, /* readme.txt */ - - { 0, NULL }, - { 0, NULL } -}; - -void test_object_cache__cache_everything(void) -{ - int i, start; - git_oid oid; - git_odb_object *odb_obj; - git_object *obj; - git_odb *odb; - - git_libgit2_opts( - GIT_OPT_SET_CACHE_OBJECT_LIMIT, (int)GIT_OBJ_BLOB, (size_t)32767); - - cl_git_pass(git_repository_open(&g_repo, cl_fixture("testrepo.git"))); - cl_git_pass(git_repository_odb(&odb, g_repo)); - - start = (int)git_cache_size(&g_repo->objects); - - for (i = 0; g_data[i].sha != NULL; ++i) { - int count = (int)git_cache_size(&g_repo->objects); - - cl_git_pass(git_oid_fromstr(&oid, g_data[i].sha)); - - /* alternate between loading raw and parsed objects */ - if ((i & 1) == 0) { - cl_git_pass(git_odb_read(&odb_obj, odb, &oid)); - cl_assert(g_data[i].type == git_odb_object_type(odb_obj)); - git_odb_object_free(odb_obj); - } else { - cl_git_pass(git_object_lookup(&obj, g_repo, &oid, GIT_OBJ_ANY)); - cl_assert(g_data[i].type == git_object_type(obj)); - git_object_free(obj); - } - - cl_assert_equal_i(count + 1, (int)git_cache_size(&g_repo->objects)); - } - - cl_assert_equal_i(i, (int)git_cache_size(&g_repo->objects) - start); - - git_odb_free(odb); - - for (i = 0; g_data[i].sha != NULL; ++i) { - int count = (int)git_cache_size(&g_repo->objects); - - cl_git_pass(git_oid_fromstr(&oid, g_data[i].sha)); - cl_git_pass(git_object_lookup(&obj, g_repo, &oid, GIT_OBJ_ANY)); - cl_assert(g_data[i].type == git_object_type(obj)); - git_object_free(obj); - - cl_assert_equal_i(count, (int)git_cache_size(&g_repo->objects)); - } -} - -void test_object_cache__cache_no_blobs(void) -{ - int i, start, nonblobs = 0; - git_oid oid; - git_odb_object *odb_obj; - git_object *obj; - git_odb *odb; - - git_libgit2_opts(GIT_OPT_SET_CACHE_OBJECT_LIMIT, (int)GIT_OBJ_BLOB, (size_t)0); - - cl_git_pass(git_repository_open(&g_repo, cl_fixture("testrepo.git"))); - cl_git_pass(git_repository_odb(&odb, g_repo)); - - start = (int)git_cache_size(&g_repo->objects); - - for (i = 0; g_data[i].sha != NULL; ++i) { - int count = (int)git_cache_size(&g_repo->objects); - - cl_git_pass(git_oid_fromstr(&oid, g_data[i].sha)); - - /* alternate between loading raw and parsed objects */ - if ((i & 1) == 0) { - cl_git_pass(git_odb_read(&odb_obj, odb, &oid)); - cl_assert(g_data[i].type == git_odb_object_type(odb_obj)); - git_odb_object_free(odb_obj); - } else { - cl_git_pass(git_object_lookup(&obj, g_repo, &oid, GIT_OBJ_ANY)); - cl_assert(g_data[i].type == git_object_type(obj)); - git_object_free(obj); - } - - if (g_data[i].type == GIT_OBJ_BLOB) - cl_assert_equal_i(count, (int)git_cache_size(&g_repo->objects)); - else { - cl_assert_equal_i(count + 1, (int)git_cache_size(&g_repo->objects)); - nonblobs++; - } - } - - cl_assert_equal_i(nonblobs, (int)git_cache_size(&g_repo->objects) - start); - - git_odb_free(odb); -} - -static void *cache_parsed(void *arg) -{ - int i; - git_oid oid; - git_object *obj; - - for (i = ((int *)arg)[1]; g_data[i].sha != NULL; i += 2) { - cl_git_pass(git_oid_fromstr(&oid, g_data[i].sha)); - cl_git_pass(git_object_lookup(&obj, g_repo, &oid, GIT_OBJ_ANY)); - cl_assert(g_data[i].type == git_object_type(obj)); - git_object_free(obj); - } - - for (i = 0; i < ((int *)arg)[1]; i += 2) { - cl_git_pass(git_oid_fromstr(&oid, g_data[i].sha)); - cl_git_pass(git_object_lookup(&obj, g_repo, &oid, GIT_OBJ_ANY)); - cl_assert(g_data[i].type == git_object_type(obj)); - git_object_free(obj); - } - - return arg; -} - -static void *cache_raw(void *arg) -{ - int i; - git_oid oid; - git_odb *odb; - git_odb_object *odb_obj; - - cl_git_pass(git_repository_odb(&odb, g_repo)); - - for (i = ((int *)arg)[1]; g_data[i].sha != NULL; i += 2) { - cl_git_pass(git_oid_fromstr(&oid, g_data[i].sha)); - cl_git_pass(git_odb_read(&odb_obj, odb, &oid)); - cl_assert(g_data[i].type == git_odb_object_type(odb_obj)); - git_odb_object_free(odb_obj); - } - - for (i = 0; i < ((int *)arg)[1]; i += 2) { - cl_git_pass(git_oid_fromstr(&oid, g_data[i].sha)); - cl_git_pass(git_odb_read(&odb_obj, odb, &oid)); - cl_assert(g_data[i].type == git_odb_object_type(odb_obj)); - git_odb_object_free(odb_obj); - } - - git_odb_free(odb); - - return arg; -} - -#define REPEAT 20 -#define THREADCOUNT 50 - -void test_object_cache__threadmania(void) -{ - int try, th, max_i; - void *data; - void *(*fn)(void *); - -#ifdef GIT_THREADS - git_thread t[THREADCOUNT]; -#endif - - for (max_i = 0; g_data[max_i].sha != NULL; ++max_i) - /* count up */; - - for (try = 0; try < REPEAT; ++try) { - - cl_git_pass(git_repository_open(&g_repo, cl_fixture("testrepo.git"))); - - for (th = 0; th < THREADCOUNT; ++th) { - data = git__malloc(2 * sizeof(int)); - - ((int *)data)[0] = th; - ((int *)data)[1] = th % max_i; - - fn = (th & 1) ? cache_parsed : cache_raw; - -#ifdef GIT_THREADS - cl_git_pass(git_thread_create(&t[th], NULL, fn, data)); -#else - cl_assert(fn(data) == data); - git__free(data); -#endif - } - -#ifdef GIT_THREADS - for (th = 0; th < THREADCOUNT; ++th) { - cl_git_pass(git_thread_join(&t[th], &data)); - cl_assert_equal_i(th, ((int *)data)[0]); - git__free(data); - } -#endif - - git_repository_free(g_repo); - g_repo = NULL; - } -} - -static void *cache_quick(void *arg) -{ - git_oid oid; - git_object *obj; - - cl_git_pass(git_oid_fromstr(&oid, g_data[4].sha)); - cl_git_pass(git_object_lookup(&obj, g_repo, &oid, GIT_OBJ_ANY)); - cl_assert(g_data[4].type == git_object_type(obj)); - git_object_free(obj); - - return arg; -} - -void test_object_cache__fast_thread_rush(void) -{ - int try, th, data[THREADCOUNT*2]; -#ifdef GIT_THREADS - git_thread t[THREADCOUNT*2]; -#endif - - for (try = 0; try < REPEAT; ++try) { - cl_git_pass(git_repository_open(&g_repo, cl_fixture("testrepo.git"))); - - for (th = 0; th < THREADCOUNT*2; ++th) { - data[th] = th; -#ifdef GIT_THREADS - cl_git_pass( - git_thread_create(&t[th], NULL, cache_quick, &data[th])); -#else - cl_assert(cache_quick(&data[th]) == &data[th]); -#endif - } - -#ifdef GIT_THREADS - for (th = 0; th < THREADCOUNT*2; ++th) { - void *rval; - cl_git_pass(git_thread_join(&t[th], &rval)); - cl_assert_equal_i(th, *((int *)rval)); - } -#endif - - git_repository_free(g_repo); - g_repo = NULL; - } -} diff --git a/vendor/libgit2/tests/object/commit/commitstagedfile.c b/vendor/libgit2/tests/object/commit/commitstagedfile.c deleted file mode 100644 index 5b48519b85..0000000000 --- a/vendor/libgit2/tests/object/commit/commitstagedfile.c +++ /dev/null @@ -1,219 +0,0 @@ -#include "clar_libgit2.h" -#include "posix.h" - -static git_repository *repo; - -void test_object_commit_commitstagedfile__initialize(void) -{ - cl_fixture("treebuilder"); - cl_git_pass(git_repository_init(&repo, "treebuilder/", 0)); - cl_assert(repo != NULL); -} - -void test_object_commit_commitstagedfile__cleanup(void) -{ - git_repository_free(repo); - repo = NULL; - - cl_fixture_cleanup("treebuilder"); -} - -void test_object_commit_commitstagedfile__generate_predictable_object_ids(void) -{ - git_index *index; - const git_index_entry *entry; - git_oid expected_blob_oid, tree_oid, expected_tree_oid, commit_oid, expected_commit_oid; - git_signature *signature; - git_tree *tree; - git_buf buffer; - - /* - * The test below replicates the following git scenario - * - * $ echo "test" > test.txt - * $ git hash-object test.txt - * 9daeafb9864cf43055ae93beb0afd6c7d144bfa4 - * - * $ git add . - * $ git commit -m "Initial commit" - * - * $ git log - * commit 1fe3126578fc4eca68c193e4a3a0a14a0704624d - * Author: nulltoken - * Date: Wed Dec 14 08:29:03 2011 +0100 - * - * Initial commit - * - * $ git show 1fe3 --format=raw - * commit 1fe3126578fc4eca68c193e4a3a0a14a0704624d - * tree 2b297e643c551e76cfa1f93810c50811382f9117 - * author nulltoken 1323847743 +0100 - * committer nulltoken 1323847743 +0100 - * - * Initial commit - * - * diff --git a/test.txt b/test.txt - * new file mode 100644 - * index 0000000..9daeafb - * --- /dev/null - * +++ b/test.txt - * @@ -0,0 +1 @@ - * +test - * - * $ git ls-tree 2b297 - * 100644 blob 9daeafb9864cf43055ae93beb0afd6c7d144bfa4 test.txt - */ - - cl_git_pass(git_oid_fromstr(&expected_commit_oid, "1fe3126578fc4eca68c193e4a3a0a14a0704624d")); - cl_git_pass(git_oid_fromstr(&expected_tree_oid, "2b297e643c551e76cfa1f93810c50811382f9117")); - cl_git_pass(git_oid_fromstr(&expected_blob_oid, "9daeafb9864cf43055ae93beb0afd6c7d144bfa4")); - - /* - * Add a new file to the index - */ - cl_git_mkfile("treebuilder/test.txt", "test\n"); - cl_git_pass(git_repository_index(&index, repo)); - cl_git_pass(git_index_add_bypath(index, "test.txt")); - - entry = git_index_get_byindex(index, 0); - - cl_assert(git_oid_cmp(&expected_blob_oid, &entry->id) == 0); - - /* - * Information about index entry should match test file - */ - { - struct stat st; - cl_must_pass(p_lstat("treebuilder/test.txt", &st)); - cl_assert(entry->file_size == st.st_size); -#ifndef _WIN32 - /* - * Windows doesn't populate these fields, and the signage is - * wrong in the Windows version of the struct, so lets avoid - * the "comparing signed and unsigned" compilation warning in - * that case. - */ - cl_assert(entry->uid == st.st_uid); - cl_assert(entry->gid == st.st_gid); -#endif - } - - /* - * Build the tree from the index - */ - cl_git_pass(git_index_write_tree(&tree_oid, index)); - - cl_assert(git_oid_cmp(&expected_tree_oid, &tree_oid) == 0); - - /* - * Commit the staged file - */ - cl_git_pass(git_signature_new(&signature, "nulltoken", "emeric.fermas@gmail.com", 1323847743, 60)); - cl_git_pass(git_tree_lookup(&tree, repo, &tree_oid)); - - memset(&buffer, 0, sizeof(git_buf)); - cl_git_pass(git_message_prettify(&buffer, "Initial commit", 0, '#')); - - cl_git_pass(git_commit_create_v( - &commit_oid, - repo, - "HEAD", - signature, - signature, - NULL, - buffer.ptr, - tree, - 0)); - - cl_assert(git_oid_cmp(&expected_commit_oid, &commit_oid) == 0); - - git_buf_free(&buffer); - git_signature_free(signature); - git_tree_free(tree); - git_index_free(index); -} - -static void assert_commit_tree_has_n_entries(git_commit *c, int count) -{ - git_tree *tree; - cl_git_pass(git_commit_tree(&tree, c)); - cl_assert_equal_i(count, git_tree_entrycount(tree)); - git_tree_free(tree); -} - -static void assert_commit_is_head_(git_commit *c, const char *file, int line) -{ - git_commit *head; - cl_git_pass(git_revparse_single((git_object **)&head, repo, "HEAD")); - clar__assert(git_oid_equal(git_commit_id(c), git_commit_id(head)), file, line, "Commit is not the HEAD", NULL, 1); - git_commit_free(head); -} -#define assert_commit_is_head(C) assert_commit_is_head_((C),__FILE__,__LINE__) - -void test_object_commit_commitstagedfile__amend_commit(void) -{ - git_index *index; - git_oid old_oid, new_oid, tree_oid; - git_commit *old_commit, *new_commit; - git_tree *tree; - - /* make a commit */ - - cl_git_mkfile("treebuilder/myfile", "This is a file\n"); - cl_git_pass(git_repository_index(&index, repo)); - cl_git_pass(git_index_add_bypath(index, "myfile")); - cl_repo_commit_from_index(&old_oid, repo, NULL, 0, "first commit"); - - cl_git_pass(git_commit_lookup(&old_commit, repo, &old_oid)); - - cl_assert_equal_i(0, git_commit_parentcount(old_commit)); - assert_commit_tree_has_n_entries(old_commit, 1); - assert_commit_is_head(old_commit); - - /* let's amend the message of the HEAD commit */ - - cl_git_pass(git_commit_amend( - &new_oid, old_commit, "HEAD", NULL, NULL, NULL, "Initial commit", NULL)); - - /* fail because the commit isn't the tip of the branch anymore */ - cl_git_fail(git_commit_amend( - &new_oid, old_commit, "HEAD", NULL, NULL, NULL, "Initial commit", NULL)); - - cl_git_pass(git_commit_lookup(&new_commit, repo, &new_oid)); - - cl_assert_equal_i(0, git_commit_parentcount(new_commit)); - assert_commit_tree_has_n_entries(new_commit, 1); - assert_commit_is_head(new_commit); - - git_commit_free(old_commit); - - old_commit = new_commit; - - /* let's amend the tree of that last commit */ - - cl_git_mkfile("treebuilder/anotherfile", "This is another file\n"); - cl_git_pass(git_index_add_bypath(index, "anotherfile")); - cl_git_pass(git_index_write_tree(&tree_oid, index)); - cl_git_pass(git_tree_lookup(&tree, repo, &tree_oid)); - cl_assert_equal_i(2, git_tree_entrycount(tree)); - - /* fail to amend on a ref which does not exist */ - cl_git_fail_with(GIT_ENOTFOUND, git_commit_amend( - &new_oid, old_commit, "refs/heads/nope", NULL, NULL, NULL, "Initial commit", tree)); - - cl_git_pass(git_commit_amend( - &new_oid, old_commit, "HEAD", NULL, NULL, NULL, "Initial commit", tree)); - git_tree_free(tree); - - cl_git_pass(git_commit_lookup(&new_commit, repo, &new_oid)); - - cl_assert_equal_i(0, git_commit_parentcount(new_commit)); - assert_commit_tree_has_n_entries(new_commit, 2); - assert_commit_is_head(new_commit); - - /* cleanup */ - - git_commit_free(old_commit); - git_commit_free(new_commit); - git_index_free(index); -} diff --git a/vendor/libgit2/tests/object/lookup.c b/vendor/libgit2/tests/object/lookup.c deleted file mode 100644 index cfa6d46780..0000000000 --- a/vendor/libgit2/tests/object/lookup.c +++ /dev/null @@ -1,65 +0,0 @@ -#include "clar_libgit2.h" - -#include "repository.h" - -static git_repository *g_repo; - -void test_object_lookup__initialize(void) -{ - cl_git_pass(git_repository_open(&g_repo, cl_fixture("testrepo.git"))); -} - -void test_object_lookup__cleanup(void) -{ - git_repository_free(g_repo); - g_repo = NULL; -} - -void test_object_lookup__lookup_wrong_type_returns_enotfound(void) -{ - const char *commit = "e90810b8df3e80c413d903f631643c716887138d"; - git_oid oid; - git_object *object; - - cl_git_pass(git_oid_fromstr(&oid, commit)); - cl_assert_equal_i( - GIT_ENOTFOUND, git_object_lookup(&object, g_repo, &oid, GIT_OBJ_TAG)); -} - -void test_object_lookup__lookup_nonexisting_returns_enotfound(void) -{ - const char *unknown = "deadbeefdeadbeefdeadbeefdeadbeefdeadbeef"; - git_oid oid; - git_object *object; - - cl_git_pass(git_oid_fromstr(&oid, unknown)); - cl_assert_equal_i( - GIT_ENOTFOUND, git_object_lookup(&object, g_repo, &oid, GIT_OBJ_ANY)); -} - -void test_object_lookup__lookup_wrong_type_by_abbreviated_id_returns_enotfound(void) -{ - const char *commit = "e90810b"; - git_oid oid; - git_object *object; - - cl_git_pass(git_oid_fromstrn(&oid, commit, strlen(commit))); - cl_assert_equal_i( - GIT_ENOTFOUND, git_object_lookup_prefix(&object, g_repo, &oid, strlen(commit), GIT_OBJ_TAG)); -} - -void test_object_lookup__lookup_wrong_type_eventually_returns_enotfound(void) -{ - const char *commit = "e90810b8df3e80c413d903f631643c716887138d"; - git_oid oid; - git_object *object; - - cl_git_pass(git_oid_fromstr(&oid, commit)); - - cl_git_pass(git_object_lookup(&object, g_repo, &oid, GIT_OBJ_COMMIT)); - git_object_free(object); - - cl_assert_equal_i( - GIT_ENOTFOUND, git_object_lookup(&object, g_repo, &oid, GIT_OBJ_TAG)); -} - diff --git a/vendor/libgit2/tests/object/lookupbypath.c b/vendor/libgit2/tests/object/lookupbypath.c deleted file mode 100644 index 13cd6a1288..0000000000 --- a/vendor/libgit2/tests/object/lookupbypath.c +++ /dev/null @@ -1,83 +0,0 @@ -#include "clar_libgit2.h" - -#include "repository.h" - -static git_repository *g_repo; -static git_tree *g_root_tree; -static git_commit *g_head_commit; -static git_object *g_expectedobject, - *g_actualobject; - -void test_object_lookupbypath__initialize(void) -{ - git_reference *head; - git_tree_entry *tree_entry; - - cl_git_pass(git_repository_open(&g_repo, cl_fixture("attr/.gitted"))); - - cl_git_pass(git_repository_head(&head, g_repo)); - cl_git_pass(git_reference_peel((git_object**)&g_head_commit, head, GIT_OBJ_COMMIT)); - cl_git_pass(git_commit_tree(&g_root_tree, g_head_commit)); - cl_git_pass(git_tree_entry_bypath(&tree_entry, g_root_tree, "subdir/subdir_test2.txt")); - cl_git_pass(git_object_lookup(&g_expectedobject, g_repo, git_tree_entry_id(tree_entry), - GIT_OBJ_ANY)); - - git_tree_entry_free(tree_entry); - git_reference_free(head); - - g_actualobject = NULL; -} -void test_object_lookupbypath__cleanup(void) -{ - git_object_free(g_actualobject); - git_object_free(g_expectedobject); - git_tree_free(g_root_tree); - git_commit_free(g_head_commit); - g_expectedobject = NULL; - git_repository_free(g_repo); - g_repo = NULL; -} - -void test_object_lookupbypath__errors(void) -{ - cl_assert_equal_i(GIT_EINVALIDSPEC, - git_object_lookup_bypath(&g_actualobject, (git_object*)g_root_tree, - "subdir/subdir_test2.txt", GIT_OBJ_TREE)); // It's not a tree - cl_assert_equal_i(GIT_ENOTFOUND, - git_object_lookup_bypath(&g_actualobject, (git_object*)g_root_tree, - "file/doesnt/exist", GIT_OBJ_ANY)); -} - -void test_object_lookupbypath__from_root_tree(void) -{ - cl_git_pass(git_object_lookup_bypath(&g_actualobject, (git_object*)g_root_tree, - "subdir/subdir_test2.txt", GIT_OBJ_BLOB)); - cl_assert_equal_oid(git_object_id(g_expectedobject), - git_object_id(g_actualobject)); -} - -void test_object_lookupbypath__from_head_commit(void) -{ - cl_git_pass(git_object_lookup_bypath(&g_actualobject, (git_object*)g_head_commit, - "subdir/subdir_test2.txt", GIT_OBJ_BLOB)); - cl_assert_equal_oid(git_object_id(g_expectedobject), - git_object_id(g_actualobject)); -} - -void test_object_lookupbypath__from_subdir_tree(void) -{ - git_tree_entry *entry = NULL; - git_tree *tree = NULL; - - cl_git_pass(git_tree_entry_bypath(&entry, g_root_tree, "subdir")); - cl_git_pass(git_tree_lookup(&tree, g_repo, git_tree_entry_id(entry))); - - cl_git_pass(git_object_lookup_bypath(&g_actualobject, (git_object*)tree, - "subdir_test2.txt", GIT_OBJ_BLOB)); - cl_assert_equal_oid(git_object_id(g_expectedobject), - git_object_id(g_actualobject)); - - git_tree_entry_free(entry); - git_tree_free(tree); -} - diff --git a/vendor/libgit2/tests/object/message.c b/vendor/libgit2/tests/object/message.c deleted file mode 100644 index 40d8e72972..0000000000 --- a/vendor/libgit2/tests/object/message.c +++ /dev/null @@ -1,199 +0,0 @@ -#include "clar_libgit2.h" -#include "buffer.h" -#include "message.h" - -static void assert_message_prettifying(char *expected_output, char *input, int strip_comments) -{ - git_buf prettified_message = GIT_BUF_INIT; - - git_message_prettify(&prettified_message, input, strip_comments, '#'); - cl_assert_equal_s(expected_output, git_buf_cstr(&prettified_message)); - - git_buf_free(&prettified_message); -} - -#define t40 "A quick brown fox jumps over the lazy do" -#define s40 " " -#define sss s40 s40 s40 s40 s40 s40 s40 s40 s40 s40 // # 400 -#define ttt t40 t40 t40 t40 t40 t40 t40 t40 t40 t40 // # 400 - -/* Ported from git.git */ -/* see https://github.com/git/git/blob/master/t/t0030-stripspace.sh */ -void test_object_message__long_lines_without_spaces_should_be_unchanged(void) -{ - assert_message_prettifying(ttt "\n", ttt, 0); - assert_message_prettifying(ttt ttt "\n", ttt ttt, 0); - assert_message_prettifying(ttt ttt ttt "\n", ttt ttt ttt, 0); - assert_message_prettifying(ttt ttt ttt ttt "\n", ttt ttt ttt ttt, 0); -} - -void test_object_message__lines_with_spaces_at_the_beginning_should_be_unchanged(void) -{ - assert_message_prettifying(sss ttt "\n", sss ttt, 0); - assert_message_prettifying(sss sss ttt "\n", sss sss ttt, 0); - assert_message_prettifying(sss sss sss ttt "\n", sss sss sss ttt, 0); -} - -void test_object_message__lines_with_intermediate_spaces_should_be_unchanged(void) -{ - assert_message_prettifying(ttt sss ttt "\n", ttt sss ttt, 0); - assert_message_prettifying(ttt sss sss ttt "\n", ttt sss sss ttt, 0); -} - -void test_object_message__consecutive_blank_lines_should_be_unified(void) -{ - assert_message_prettifying(ttt "\n\n" ttt "\n", ttt "\n\n\n\n\n" ttt "\n", 0); - assert_message_prettifying(ttt ttt "\n\n" ttt "\n", ttt ttt "\n\n\n\n\n" ttt "\n", 0); - assert_message_prettifying(ttt ttt ttt "\n\n" ttt "\n", ttt ttt ttt "\n\n\n\n\n" ttt "\n", 0); - - assert_message_prettifying(ttt "\n\n" ttt ttt "\n", ttt "\n\n\n\n\n" ttt ttt "\n", 0); - assert_message_prettifying(ttt "\n\n" ttt ttt ttt "\n", ttt "\n\n\n\n\n" ttt ttt ttt "\n", 0); - - assert_message_prettifying(ttt "\n\n" ttt "\n", ttt "\n\t\n \n\n \t\t\n" ttt "\n", 0); - assert_message_prettifying(ttt ttt "\n\n" ttt "\n", ttt ttt "\n\t\n \n\n \t\t\n" ttt "\n", 0); - assert_message_prettifying(ttt ttt ttt "\n\n" ttt "\n", ttt ttt ttt "\n\t\n \n\n \t\t\n" ttt "\n", 0); - - assert_message_prettifying(ttt "\n\n" ttt ttt "\n", ttt "\n\t\n \n\n \t\t\n" ttt ttt "\n", 0); - assert_message_prettifying(ttt "\n\n" ttt ttt ttt "\n", ttt "\n\t\n \n\n \t\t\n" ttt ttt ttt "\n", 0); -} - -void test_object_message__only_consecutive_blank_lines_should_be_completely_removed(void) -{ - assert_message_prettifying("", "\n", 0); - assert_message_prettifying("", "\n\n\n", 0); - assert_message_prettifying("", sss "\n" sss "\n" sss "\n", 0); - assert_message_prettifying("", sss sss "\n" sss "\n\n", 0); -} - -void test_object_message__consecutive_blank_lines_at_the_beginning_should_be_removed(void) -{ - assert_message_prettifying(ttt "\n", "\n" ttt "\n", 0); - assert_message_prettifying(ttt "\n", "\n\n\n" ttt "\n", 0); - assert_message_prettifying(ttt ttt "\n", "\n\n\n" ttt ttt "\n", 0); - assert_message_prettifying(ttt ttt ttt "\n", "\n\n\n" ttt ttt ttt "\n", 0); - assert_message_prettifying(ttt ttt ttt ttt "\n", "\n\n\n" ttt ttt ttt ttt "\n", 0); - assert_message_prettifying(ttt "\n", sss "\n" sss "\n" sss "\n" ttt "\n", 0); - assert_message_prettifying(ttt "\n", "\n" sss "\n" sss sss "\n" ttt "\n", 0); - assert_message_prettifying(ttt "\n", sss sss "\n" sss "\n\n" ttt "\n", 0); - assert_message_prettifying(ttt "\n", sss sss sss "\n\n\n" ttt "\n", 0); - assert_message_prettifying(ttt "\n", "\n" sss sss sss "\n\n" ttt "\n", 0); - assert_message_prettifying(ttt "\n", "\n\n" sss sss sss "\n" ttt "\n", 0); -} - -void test_object_message__consecutive_blank_lines_at_the_end_should_be_removed(void) -{ - assert_message_prettifying(ttt "\n", ttt "\n\n", 0); - assert_message_prettifying(ttt "\n", ttt "\n\n\n\n", 0); - assert_message_prettifying(ttt ttt "\n", ttt ttt "\n\n\n\n", 0); - assert_message_prettifying(ttt ttt ttt "\n", ttt ttt ttt "\n\n\n\n", 0); - assert_message_prettifying(ttt ttt ttt ttt "\n", ttt ttt ttt ttt "\n\n\n\n", 0); - assert_message_prettifying(ttt "\n", ttt "\n" sss "\n" sss "\n" sss "\n", 0); - assert_message_prettifying(ttt "\n", ttt "\n\n" sss "\n" sss sss "\n", 0); - assert_message_prettifying(ttt "\n", ttt "\n" sss sss "\n" sss "\n\n", 0); - assert_message_prettifying(ttt "\n", ttt "\n" sss sss sss "\n\n\n", 0); - assert_message_prettifying(ttt "\n", ttt "\n\n" sss sss sss "\n\n", 0); - assert_message_prettifying(ttt "\n", ttt "\n\n\n" sss sss sss "\n\n", 0); -} - -void test_object_message__text_without_newline_at_end_should_end_with_newline(void) -{ - assert_message_prettifying(ttt "\n", ttt, 0); - assert_message_prettifying(ttt ttt "\n", ttt ttt, 0); - assert_message_prettifying(ttt ttt ttt "\n", ttt ttt ttt, 0); - assert_message_prettifying(ttt ttt ttt ttt "\n", ttt ttt ttt ttt, 0); -} - -void test_object_message__text_plus_spaces_without_newline_should_not_show_spaces_and_end_with_newline(void) -{ - assert_message_prettifying(ttt "\n", ttt sss, 0); - assert_message_prettifying(ttt ttt "\n", ttt ttt sss, 0); - assert_message_prettifying(ttt ttt ttt "\n", ttt ttt ttt sss, 0); - assert_message_prettifying(ttt "\n", ttt sss sss, 0); - assert_message_prettifying(ttt ttt "\n", ttt ttt sss sss, 0); - assert_message_prettifying(ttt "\n", ttt sss sss sss, 0); -} - -void test_object_message__text_plus_spaces_ending_with_newline_should_be_cleaned_and_newline_must_remain(void){ - assert_message_prettifying(ttt "\n", ttt sss "\n", 0); - assert_message_prettifying(ttt "\n", ttt sss sss "\n", 0); - assert_message_prettifying(ttt "\n", ttt sss sss sss "\n", 0); - assert_message_prettifying(ttt ttt "\n", ttt ttt sss "\n", 0); - assert_message_prettifying(ttt ttt "\n", ttt ttt sss sss "\n", 0); - assert_message_prettifying(ttt ttt ttt "\n", ttt ttt ttt sss "\n", 0); -} - -void test_object_message__spaces_with_newline_at_end_should_be_replaced_with_empty_string(void) -{ - assert_message_prettifying("", sss "\n", 0); - assert_message_prettifying("", sss sss "\n", 0); - assert_message_prettifying("", sss sss sss "\n", 0); - assert_message_prettifying("", sss sss sss sss "\n", 0); -} - -void test_object_message__spaces_without_newline_at_end_should_be_replaced_with_empty_string(void) -{ - assert_message_prettifying("", "", 0); - assert_message_prettifying("", sss sss, 0); - assert_message_prettifying("", sss sss sss, 0); - assert_message_prettifying("", sss sss sss sss, 0); -} - -void test_object_message__consecutive_text_lines_should_be_unchanged(void) -{ - assert_message_prettifying(ttt ttt "\n" ttt "\n", ttt ttt "\n" ttt "\n", 0); - assert_message_prettifying(ttt "\n" ttt ttt "\n" ttt "\n", ttt "\n" ttt ttt "\n" ttt "\n", 0); - assert_message_prettifying(ttt "\n" ttt "\n" ttt "\n" ttt ttt "\n", ttt "\n" ttt "\n" ttt "\n" ttt ttt "\n", 0); - assert_message_prettifying(ttt "\n" ttt "\n\n" ttt ttt "\n" ttt "\n", ttt "\n" ttt "\n\n" ttt ttt "\n" ttt "\n", 0); - assert_message_prettifying(ttt ttt "\n\n" ttt "\n" ttt ttt "\n", ttt ttt "\n\n" ttt "\n" ttt ttt "\n", 0); - assert_message_prettifying(ttt "\n" ttt ttt "\n\n" ttt "\n", ttt "\n" ttt ttt "\n\n" ttt "\n", 0); -} - -void test_object_message__strip_comments(void) -{ - assert_message_prettifying("", "# comment", 1); - assert_message_prettifying("", "# comment\n", 1); - assert_message_prettifying("", "# comment \n", 1); - - assert_message_prettifying(ttt "\n", ttt "\n" "# comment\n", 1); - assert_message_prettifying(ttt "\n", "# comment\n" ttt "\n", 1); - assert_message_prettifying(ttt "\n" ttt "\n", ttt "\n" "# comment\n" ttt "\n", 1); -} - -void test_object_message__keep_comments(void) -{ - assert_message_prettifying("# comment\n", "# comment", 0); - assert_message_prettifying("# comment\n", "# comment\n", 0); - assert_message_prettifying("# comment\n", "# comment \n", 0); - - assert_message_prettifying(ttt "\n" "# comment\n", ttt "\n" "# comment\n", 0); - assert_message_prettifying("# comment\n" ttt "\n", "# comment\n" ttt "\n", 0); - assert_message_prettifying(ttt "\n" "# comment\n" ttt "\n", ttt "\n" "# comment\n" ttt "\n", 0); -} - -void test_object_message__message_prettify(void) -{ - git_buf buffer; - - memset(&buffer, 0, sizeof(buffer)); - cl_git_pass(git_message_prettify(&buffer, "", 0, '#')); - cl_assert_equal_s(buffer.ptr, ""); - git_buf_free(&buffer); - cl_git_pass(git_message_prettify(&buffer, "", 1, '#')); - cl_assert_equal_s(buffer.ptr, ""); - git_buf_free(&buffer); - - cl_git_pass(git_message_prettify(&buffer, "Short", 0, '#')); - cl_assert_equal_s("Short\n", buffer.ptr); - git_buf_free(&buffer); - cl_git_pass(git_message_prettify(&buffer, "Short", 1, '#')); - cl_assert_equal_s("Short\n", buffer.ptr); - git_buf_free(&buffer); - - cl_git_pass(git_message_prettify(&buffer, "This is longer\nAnd multiline\n# with some comments still in\n", 0, '#')); - cl_assert_equal_s(buffer.ptr, "This is longer\nAnd multiline\n# with some comments still in\n"); - git_buf_free(&buffer); - - cl_git_pass(git_message_prettify(&buffer, "This is longer\nAnd multiline\n# with some comments still in\n", 1, '#')); - cl_assert_equal_s(buffer.ptr, "This is longer\nAnd multiline\n"); - git_buf_free(&buffer); -} diff --git a/vendor/libgit2/tests/object/peel.c b/vendor/libgit2/tests/object/peel.c deleted file mode 100644 index 344885f1d3..0000000000 --- a/vendor/libgit2/tests/object/peel.c +++ /dev/null @@ -1,118 +0,0 @@ -#include "clar_libgit2.h" - -static git_repository *g_repo; - -void test_object_peel__initialize(void) -{ - cl_git_pass(git_repository_open(&g_repo, cl_fixture("testrepo.git"))); -} - -void test_object_peel__cleanup(void) -{ - git_repository_free(g_repo); - g_repo = NULL; -} - -static void assert_peel( - const char *sha, - git_otype requested_type, - const char* expected_sha, - git_otype expected_type) -{ - git_oid oid, expected_oid; - git_object *obj; - git_object *peeled; - - cl_git_pass(git_oid_fromstr(&oid, sha)); - cl_git_pass(git_object_lookup(&obj, g_repo, &oid, GIT_OBJ_ANY)); - - cl_git_pass(git_object_peel(&peeled, obj, requested_type)); - - cl_git_pass(git_oid_fromstr(&expected_oid, expected_sha)); - cl_assert_equal_oid(&expected_oid, git_object_id(peeled)); - - cl_assert_equal_i(expected_type, git_object_type(peeled)); - - git_object_free(peeled); - git_object_free(obj); -} - -static void assert_peel_error(int error, const char *sha, git_otype requested_type) -{ - git_oid oid; - git_object *obj; - git_object *peeled; - - cl_git_pass(git_oid_fromstr(&oid, sha)); - cl_git_pass(git_object_lookup(&obj, g_repo, &oid, GIT_OBJ_ANY)); - - cl_assert_equal_i(error, git_object_peel(&peeled, obj, requested_type)); - - git_object_free(obj); -} - -void test_object_peel__peeling_an_object_into_its_own_type_returns_another_instance_of_it(void) -{ - assert_peel("e90810b8df3e80c413d903f631643c716887138d", GIT_OBJ_COMMIT, - "e90810b8df3e80c413d903f631643c716887138d", GIT_OBJ_COMMIT); - assert_peel("7b4384978d2493e851f9cca7858815fac9b10980", GIT_OBJ_TAG, - "7b4384978d2493e851f9cca7858815fac9b10980", GIT_OBJ_TAG); - assert_peel("53fc32d17276939fc79ed05badaef2db09990016", GIT_OBJ_TREE, - "53fc32d17276939fc79ed05badaef2db09990016", GIT_OBJ_TREE); - assert_peel("0266163a49e280c4f5ed1e08facd36a2bd716bcf", GIT_OBJ_BLOB, - "0266163a49e280c4f5ed1e08facd36a2bd716bcf", GIT_OBJ_BLOB); -} - -void test_object_peel__tag(void) -{ - assert_peel("7b4384978d2493e851f9cca7858815fac9b10980", GIT_OBJ_COMMIT, - "e90810b8df3e80c413d903f631643c716887138d", GIT_OBJ_COMMIT); - assert_peel("7b4384978d2493e851f9cca7858815fac9b10980", GIT_OBJ_TREE, - "53fc32d17276939fc79ed05badaef2db09990016", GIT_OBJ_TREE); - assert_peel_error(GIT_EPEEL, "7b4384978d2493e851f9cca7858815fac9b10980", GIT_OBJ_BLOB); - assert_peel("7b4384978d2493e851f9cca7858815fac9b10980", GIT_OBJ_ANY, - "e90810b8df3e80c413d903f631643c716887138d", GIT_OBJ_COMMIT); -} - -void test_object_peel__commit(void) -{ - assert_peel_error(GIT_EINVALIDSPEC, "e90810b8df3e80c413d903f631643c716887138d", GIT_OBJ_BLOB); - assert_peel("e90810b8df3e80c413d903f631643c716887138d", GIT_OBJ_TREE, - "53fc32d17276939fc79ed05badaef2db09990016", GIT_OBJ_TREE); - assert_peel("e90810b8df3e80c413d903f631643c716887138d", GIT_OBJ_COMMIT, - "e90810b8df3e80c413d903f631643c716887138d", GIT_OBJ_COMMIT); - assert_peel_error(GIT_EINVALIDSPEC, "e90810b8df3e80c413d903f631643c716887138d", GIT_OBJ_TAG); - assert_peel("e90810b8df3e80c413d903f631643c716887138d", GIT_OBJ_ANY, - "53fc32d17276939fc79ed05badaef2db09990016", GIT_OBJ_TREE); -} - -void test_object_peel__tree(void) -{ - assert_peel_error(GIT_EINVALIDSPEC, "53fc32d17276939fc79ed05badaef2db09990016", GIT_OBJ_BLOB); - assert_peel("53fc32d17276939fc79ed05badaef2db09990016", GIT_OBJ_TREE, - "53fc32d17276939fc79ed05badaef2db09990016", GIT_OBJ_TREE); - assert_peel_error(GIT_EINVALIDSPEC, "53fc32d17276939fc79ed05badaef2db09990016", GIT_OBJ_COMMIT); - assert_peel_error(GIT_EINVALIDSPEC, "53fc32d17276939fc79ed05badaef2db09990016", GIT_OBJ_TAG); - assert_peel_error(GIT_EINVALIDSPEC, "53fc32d17276939fc79ed05badaef2db09990016", GIT_OBJ_ANY); -} - -void test_object_peel__blob(void) -{ - assert_peel("0266163a49e280c4f5ed1e08facd36a2bd716bcf", GIT_OBJ_BLOB, - "0266163a49e280c4f5ed1e08facd36a2bd716bcf", GIT_OBJ_BLOB); - assert_peel_error(GIT_EINVALIDSPEC, "0266163a49e280c4f5ed1e08facd36a2bd716bcf", GIT_OBJ_TREE); - assert_peel_error(GIT_EINVALIDSPEC, "0266163a49e280c4f5ed1e08facd36a2bd716bcf", GIT_OBJ_COMMIT); - assert_peel_error(GIT_EINVALIDSPEC, "0266163a49e280c4f5ed1e08facd36a2bd716bcf", GIT_OBJ_TAG); - assert_peel_error(GIT_EINVALIDSPEC, "0266163a49e280c4f5ed1e08facd36a2bd716bcf", GIT_OBJ_ANY); -} - -void test_object_peel__target_any_object_for_type_change(void) -{ - /* tag to commit */ - assert_peel("7b4384978d2493e851f9cca7858815fac9b10980", GIT_OBJ_ANY, - "e90810b8df3e80c413d903f631643c716887138d", GIT_OBJ_COMMIT); - - /* commit to tree */ - assert_peel("e90810b8df3e80c413d903f631643c716887138d", GIT_OBJ_ANY, - "53fc32d17276939fc79ed05badaef2db09990016", GIT_OBJ_TREE); -} diff --git a/vendor/libgit2/tests/object/raw/chars.c b/vendor/libgit2/tests/object/raw/chars.c deleted file mode 100644 index cde0bdbf61..0000000000 --- a/vendor/libgit2/tests/object/raw/chars.c +++ /dev/null @@ -1,41 +0,0 @@ - -#include "clar_libgit2.h" - -#include "odb.h" - -void test_object_raw_chars__find_invalid_chars_in_oid(void) -{ - git_oid out; - unsigned char exp[] = { - 0x16, 0xa6, 0x77, 0x70, 0xb7, - 0xd8, 0xd7, 0x23, 0x17, 0xc4, - 0xb7, 0x75, 0x21, 0x3c, 0x23, - 0xa8, 0xbd, 0x74, 0xf5, 0xe0, - }; - char in[] = "16a67770b7d8d72317c4b775213c23a8bd74f5e0"; - unsigned int i; - - for (i = 0; i < 256; i++) { - in[38] = (char)i; - if (git__fromhex(i) >= 0) { - exp[19] = (unsigned char)(git__fromhex(i) << 4); - cl_git_pass(git_oid_fromstr(&out, in)); - cl_assert(memcmp(out.id, exp, sizeof(out.id)) == 0); - } else { - cl_git_fail(git_oid_fromstr(&out, in)); - } - } -} - -void test_object_raw_chars__build_valid_oid_from_raw_bytes(void) -{ - git_oid out; - unsigned char exp[] = { - 0x16, 0xa6, 0x77, 0x70, 0xb7, - 0xd8, 0xd7, 0x23, 0x17, 0xc4, - 0xb7, 0x75, 0x21, 0x3c, 0x23, - 0xa8, 0xbd, 0x74, 0xf5, 0xe0, - }; - git_oid_fromraw(&out, exp); - cl_git_pass(memcmp(out.id, exp, sizeof(out.id))); -} diff --git a/vendor/libgit2/tests/object/raw/compare.c b/vendor/libgit2/tests/object/raw/compare.c deleted file mode 100644 index 56c016b72e..0000000000 --- a/vendor/libgit2/tests/object/raw/compare.c +++ /dev/null @@ -1,123 +0,0 @@ - -#include "clar_libgit2.h" - -#include "odb.h" - -void test_object_raw_compare__succeed_on_copy_oid(void) -{ - git_oid a, b; - unsigned char exp[] = { - 0x16, 0xa6, 0x77, 0x70, 0xb7, - 0xd8, 0xd7, 0x23, 0x17, 0xc4, - 0xb7, 0x75, 0x21, 0x3c, 0x23, - 0xa8, 0xbd, 0x74, 0xf5, 0xe0, - }; - memset(&b, 0, sizeof(b)); - git_oid_fromraw(&a, exp); - git_oid_cpy(&b, &a); - cl_git_pass(memcmp(a.id, exp, sizeof(a.id))); -} - -void test_object_raw_compare__succeed_on_oid_comparison_lesser(void) -{ - git_oid a, b; - unsigned char a_in[] = { - 0x16, 0xa6, 0x77, 0x70, 0xb7, - 0xd8, 0xd7, 0x23, 0x17, 0xc4, - 0xb7, 0x75, 0x21, 0x3c, 0x23, - 0xa8, 0xbd, 0x74, 0xf5, 0xe0, - }; - unsigned char b_in[] = { - 0x16, 0xa6, 0x77, 0x70, 0xb7, - 0xd8, 0xd7, 0x23, 0x17, 0xc4, - 0xb7, 0x75, 0x21, 0x3c, 0x23, - 0xa8, 0xbd, 0x74, 0xf5, 0xf0, - }; - git_oid_fromraw(&a, a_in); - git_oid_fromraw(&b, b_in); - cl_assert(git_oid_cmp(&a, &b) < 0); -} - -void test_object_raw_compare__succeed_on_oid_comparison_equal(void) -{ - git_oid a, b; - unsigned char a_in[] = { - 0x16, 0xa6, 0x77, 0x70, 0xb7, - 0xd8, 0xd7, 0x23, 0x17, 0xc4, - 0xb7, 0x75, 0x21, 0x3c, 0x23, - 0xa8, 0xbd, 0x74, 0xf5, 0xe0, - }; - git_oid_fromraw(&a, a_in); - git_oid_fromraw(&b, a_in); - cl_assert(git_oid_cmp(&a, &b) == 0); -} - -void test_object_raw_compare__succeed_on_oid_comparison_greater(void) -{ - git_oid a, b; - unsigned char a_in[] = { - 0x16, 0xa6, 0x77, 0x70, 0xb7, - 0xd8, 0xd7, 0x23, 0x17, 0xc4, - 0xb7, 0x75, 0x21, 0x3c, 0x23, - 0xa8, 0xbd, 0x74, 0xf5, 0xe0, - }; - unsigned char b_in[] = { - 0x16, 0xa6, 0x77, 0x70, 0xb7, - 0xd8, 0xd7, 0x23, 0x17, 0xc4, - 0xb7, 0x75, 0x21, 0x3c, 0x23, - 0xa8, 0xbd, 0x74, 0xf5, 0xd0, - }; - git_oid_fromraw(&a, a_in); - git_oid_fromraw(&b, b_in); - cl_assert(git_oid_cmp(&a, &b) > 0); -} - -void test_object_raw_compare__compare_fmt_oids(void) -{ - const char *exp = "16a0123456789abcdef4b775213c23a8bd74f5e0"; - git_oid in; - char out[GIT_OID_HEXSZ + 1]; - - cl_git_pass(git_oid_fromstr(&in, exp)); - - /* Format doesn't touch the last byte */ - out[GIT_OID_HEXSZ] = 'Z'; - git_oid_fmt(out, &in); - cl_assert(out[GIT_OID_HEXSZ] == 'Z'); - - /* Format produced the right result */ - out[GIT_OID_HEXSZ] = '\0'; - cl_assert_equal_s(exp, out); -} - -void test_object_raw_compare__compare_static_oids(void) -{ - const char *exp = "16a0123456789abcdef4b775213c23a8bd74f5e0"; - git_oid in; - char *out; - - cl_git_pass(git_oid_fromstr(&in, exp)); - - out = git_oid_tostr_s(&in); - cl_assert(out); - cl_assert_equal_s(exp, out); -} - -void test_object_raw_compare__compare_pathfmt_oids(void) -{ - const char *exp1 = "16a0123456789abcdef4b775213c23a8bd74f5e0"; - const char *exp2 = "16/a0123456789abcdef4b775213c23a8bd74f5e0"; - git_oid in; - char out[GIT_OID_HEXSZ + 2]; - - cl_git_pass(git_oid_fromstr(&in, exp1)); - - /* Format doesn't touch the last byte */ - out[GIT_OID_HEXSZ + 1] = 'Z'; - git_oid_pathfmt(out, &in); - cl_assert(out[GIT_OID_HEXSZ + 1] == 'Z'); - - /* Format produced the right result */ - out[GIT_OID_HEXSZ + 1] = '\0'; - cl_assert_equal_s(exp2, out); -} diff --git a/vendor/libgit2/tests/object/raw/convert.c b/vendor/libgit2/tests/object/raw/convert.c deleted file mode 100644 index 88b1380a48..0000000000 --- a/vendor/libgit2/tests/object/raw/convert.c +++ /dev/null @@ -1,112 +0,0 @@ - -#include "clar_libgit2.h" - -#include "odb.h" - -void test_object_raw_convert__succeed_on_oid_to_string_conversion(void) -{ - const char *exp = "16a0123456789abcdef4b775213c23a8bd74f5e0"; - git_oid in; - char out[GIT_OID_HEXSZ + 1]; - char *str; - int i; - - cl_git_pass(git_oid_fromstr(&in, exp)); - - /* NULL buffer pointer, returns static empty string */ - str = git_oid_tostr(NULL, sizeof(out), &in); - cl_assert(str && *str == '\0' && str != out); - - /* zero buffer size, returns static empty string */ - str = git_oid_tostr(out, 0, &in); - cl_assert(str && *str == '\0' && str != out); - - /* NULL oid pointer, sets existing buffer to empty string */ - str = git_oid_tostr(out, sizeof(out), NULL); - cl_assert(str && *str == '\0' && str == out); - - /* n == 1, returns out as an empty string */ - str = git_oid_tostr(out, 1, &in); - cl_assert(str && *str == '\0' && str == out); - - for (i = 1; i < GIT_OID_HEXSZ; i++) { - out[i+1] = 'Z'; - str = git_oid_tostr(out, i+1, &in); - /* returns out containing c-string */ - cl_assert(str && str == out); - /* must be '\0' terminated */ - cl_assert(*(str+i) == '\0'); - /* must not touch bytes past end of string */ - cl_assert(*(str+(i+1)) == 'Z'); - /* i == n-1 charaters of string */ - cl_git_pass(strncmp(exp, out, i)); - } - - /* returns out as hex formatted c-string */ - str = git_oid_tostr(out, sizeof(out), &in); - cl_assert(str && str == out && *(str+GIT_OID_HEXSZ) == '\0'); - cl_assert_equal_s(exp, out); -} - -void test_object_raw_convert__succeed_on_oid_to_string_conversion_big(void) -{ - const char *exp = "16a0123456789abcdef4b775213c23a8bd74f5e0"; - git_oid in; - char big[GIT_OID_HEXSZ + 1 + 3]; /* note + 4 => big buffer */ - char *str; - - cl_git_pass(git_oid_fromstr(&in, exp)); - - /* place some tail material */ - big[GIT_OID_HEXSZ+0] = 'W'; /* should be '\0' afterwards */ - big[GIT_OID_HEXSZ+1] = 'X'; /* should remain untouched */ - big[GIT_OID_HEXSZ+2] = 'Y'; /* ditto */ - big[GIT_OID_HEXSZ+3] = 'Z'; /* ditto */ - - /* returns big as hex formatted c-string */ - str = git_oid_tostr(big, sizeof(big), &in); - cl_assert(str && str == big && *(str+GIT_OID_HEXSZ) == '\0'); - cl_assert_equal_s(exp, big); - - /* check tail material is untouched */ - cl_assert(str && str == big && *(str+GIT_OID_HEXSZ+1) == 'X'); - cl_assert(str && str == big && *(str+GIT_OID_HEXSZ+2) == 'Y'); - cl_assert(str && str == big && *(str+GIT_OID_HEXSZ+3) == 'Z'); -} - -static void check_partial_oid( - char *buffer, size_t count, const git_oid *oid, const char *expected) -{ - git_oid_nfmt(buffer, count, oid); - buffer[count] = '\0'; - cl_assert_equal_s(expected, buffer); -} - -void test_object_raw_convert__convert_oid_partially(void) -{ - const char *exp = "16a0123456789abcdef4b775213c23a8bd74f5e0"; - git_oid in; - char big[GIT_OID_HEXSZ + 1 + 3]; /* note + 4 => big buffer */ - - cl_git_pass(git_oid_fromstr(&in, exp)); - - git_oid_nfmt(big, sizeof(big), &in); - cl_assert_equal_s(exp, big); - - git_oid_nfmt(big, GIT_OID_HEXSZ + 1, &in); - cl_assert_equal_s(exp, big); - - check_partial_oid(big, 1, &in, "1"); - check_partial_oid(big, 2, &in, "16"); - check_partial_oid(big, 3, &in, "16a"); - check_partial_oid(big, 4, &in, "16a0"); - check_partial_oid(big, 5, &in, "16a01"); - - check_partial_oid(big, GIT_OID_HEXSZ, &in, exp); - check_partial_oid( - big, GIT_OID_HEXSZ - 1, &in, "16a0123456789abcdef4b775213c23a8bd74f5e"); - check_partial_oid( - big, GIT_OID_HEXSZ - 2, &in, "16a0123456789abcdef4b775213c23a8bd74f5"); - check_partial_oid( - big, GIT_OID_HEXSZ - 3, &in, "16a0123456789abcdef4b775213c23a8bd74f"); -} diff --git a/vendor/libgit2/tests/object/raw/data.h b/vendor/libgit2/tests/object/raw/data.h deleted file mode 100644 index cf23819f1d..0000000000 --- a/vendor/libgit2/tests/object/raw/data.h +++ /dev/null @@ -1,323 +0,0 @@ - -/* - * Raw data - */ -static unsigned char commit_data[] = { - 0x74, 0x72, 0x65, 0x65, 0x20, 0x64, 0x66, 0x66, - 0x32, 0x64, 0x61, 0x39, 0x30, 0x62, 0x32, 0x35, - 0x34, 0x65, 0x31, 0x62, 0x65, 0x62, 0x38, 0x38, - 0x39, 0x64, 0x31, 0x66, 0x31, 0x66, 0x31, 0x32, - 0x38, 0x38, 0x62, 0x65, 0x31, 0x38, 0x30, 0x33, - 0x37, 0x38, 0x32, 0x64, 0x66, 0x0a, 0x61, 0x75, - 0x74, 0x68, 0x6f, 0x72, 0x20, 0x41, 0x20, 0x55, - 0x20, 0x54, 0x68, 0x6f, 0x72, 0x20, 0x3c, 0x61, - 0x75, 0x74, 0x68, 0x6f, 0x72, 0x40, 0x65, 0x78, - 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x63, 0x6f, - 0x6d, 0x3e, 0x20, 0x31, 0x32, 0x32, 0x37, 0x38, - 0x31, 0x34, 0x32, 0x39, 0x37, 0x20, 0x2b, 0x30, - 0x30, 0x30, 0x30, 0x0a, 0x63, 0x6f, 0x6d, 0x6d, - 0x69, 0x74, 0x74, 0x65, 0x72, 0x20, 0x43, 0x20, - 0x4f, 0x20, 0x4d, 0x69, 0x74, 0x74, 0x65, 0x72, - 0x20, 0x3c, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, - 0x74, 0x65, 0x72, 0x40, 0x65, 0x78, 0x61, 0x6d, - 0x70, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x3e, - 0x20, 0x31, 0x32, 0x32, 0x37, 0x38, 0x31, 0x34, - 0x32, 0x39, 0x37, 0x20, 0x2b, 0x30, 0x30, 0x30, - 0x30, 0x0a, 0x0a, 0x41, 0x20, 0x6f, 0x6e, 0x65, - 0x2d, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x63, 0x6f, - 0x6d, 0x6d, 0x69, 0x74, 0x20, 0x73, 0x75, 0x6d, - 0x6d, 0x61, 0x72, 0x79, 0x0a, 0x0a, 0x54, 0x68, - 0x65, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x6f, - 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, - 0x6d, 0x6d, 0x69, 0x74, 0x20, 0x6d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x63, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, - 0x20, 0x66, 0x75, 0x72, 0x74, 0x68, 0x65, 0x72, - 0x20, 0x65, 0x78, 0x70, 0x6c, 0x61, 0x6e, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x0a, 0x6f, 0x66, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x70, 0x75, 0x72, 0x70, - 0x6f, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x73, 0x20, 0x69, 0x6e, 0x74, 0x72, 0x6f, - 0x64, 0x75, 0x63, 0x65, 0x64, 0x20, 0x62, 0x79, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, - 0x6d, 0x69, 0x74, 0x2e, 0x0a, 0x0a, 0x53, 0x69, - 0x67, 0x6e, 0x65, 0x64, 0x2d, 0x6f, 0x66, 0x2d, - 0x62, 0x79, 0x3a, 0x20, 0x41, 0x20, 0x55, 0x20, - 0x54, 0x68, 0x6f, 0x72, 0x20, 0x3c, 0x61, 0x75, - 0x74, 0x68, 0x6f, 0x72, 0x40, 0x65, 0x78, 0x61, - 0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, - 0x3e, 0x0a, -}; - - -static unsigned char tree_data[] = { - 0x31, 0x30, 0x30, 0x36, 0x34, 0x34, 0x20, 0x6f, - 0x6e, 0x65, 0x00, 0x8b, 0x13, 0x78, 0x91, 0x79, - 0x1f, 0xe9, 0x69, 0x27, 0xad, 0x78, 0xe6, 0x4b, - 0x0a, 0xad, 0x7b, 0xde, 0xd0, 0x8b, 0xdc, 0x31, - 0x30, 0x30, 0x36, 0x34, 0x34, 0x20, 0x73, 0x6f, - 0x6d, 0x65, 0x00, 0xfd, 0x84, 0x30, 0xbc, 0x86, - 0x4c, 0xfc, 0xd5, 0xf1, 0x0e, 0x55, 0x90, 0xf8, - 0xa4, 0x47, 0xe0, 0x1b, 0x94, 0x2b, 0xfe, 0x31, - 0x30, 0x30, 0x36, 0x34, 0x34, 0x20, 0x74, 0x77, - 0x6f, 0x00, 0x78, 0x98, 0x19, 0x22, 0x61, 0x3b, - 0x2a, 0xfb, 0x60, 0x25, 0x04, 0x2f, 0xf6, 0xbd, - 0x87, 0x8a, 0xc1, 0x99, 0x4e, 0x85, 0x31, 0x30, - 0x30, 0x36, 0x34, 0x34, 0x20, 0x7a, 0x65, 0x72, - 0x6f, 0x00, 0xe6, 0x9d, 0xe2, 0x9b, 0xb2, 0xd1, - 0xd6, 0x43, 0x4b, 0x8b, 0x29, 0xae, 0x77, 0x5a, - 0xd8, 0xc2, 0xe4, 0x8c, 0x53, 0x91, -}; - -static unsigned char tag_data[] = { - 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x33, - 0x64, 0x37, 0x66, 0x38, 0x61, 0x36, 0x61, 0x66, - 0x30, 0x37, 0x36, 0x63, 0x38, 0x63, 0x33, 0x66, - 0x32, 0x30, 0x30, 0x37, 0x31, 0x61, 0x38, 0x39, - 0x33, 0x35, 0x63, 0x64, 0x62, 0x65, 0x38, 0x32, - 0x32, 0x38, 0x35, 0x39, 0x34, 0x64, 0x31, 0x0a, - 0x74, 0x79, 0x70, 0x65, 0x20, 0x63, 0x6f, 0x6d, - 0x6d, 0x69, 0x74, 0x0a, 0x74, 0x61, 0x67, 0x20, - 0x76, 0x30, 0x2e, 0x30, 0x2e, 0x31, 0x0a, 0x74, - 0x61, 0x67, 0x67, 0x65, 0x72, 0x20, 0x43, 0x20, - 0x4f, 0x20, 0x4d, 0x69, 0x74, 0x74, 0x65, 0x72, - 0x20, 0x3c, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, - 0x74, 0x65, 0x72, 0x40, 0x65, 0x78, 0x61, 0x6d, - 0x70, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x3e, - 0x20, 0x31, 0x32, 0x32, 0x37, 0x38, 0x31, 0x34, - 0x32, 0x39, 0x37, 0x20, 0x2b, 0x30, 0x30, 0x30, - 0x30, 0x0a, 0x0a, 0x54, 0x68, 0x69, 0x73, 0x20, - 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, - 0x61, 0x67, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x72, 0x65, - 0x6c, 0x65, 0x61, 0x73, 0x65, 0x20, 0x76, 0x30, - 0x2e, 0x30, 0x2e, 0x31, 0x0a, -}; - -/* - * Dummy data - */ -static unsigned char zero_data[] = { - 0x00, -}; - -static unsigned char one_data[] = { - 0x0a, -}; - -static unsigned char two_data[] = { - 0x61, 0x0a, -}; - -static unsigned char some_data[] = { - 0x2f, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x54, 0x68, - 0x69, 0x73, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, - 0x69, 0x73, 0x20, 0x66, 0x72, 0x65, 0x65, 0x20, - 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, - 0x3b, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x63, 0x61, - 0x6e, 0x20, 0x72, 0x65, 0x64, 0x69, 0x73, 0x74, - 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x69, - 0x74, 0x20, 0x61, 0x6e, 0x64, 0x2f, 0x6f, 0x72, - 0x20, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x0a, - 0x20, 0x2a, 0x20, 0x69, 0x74, 0x20, 0x75, 0x6e, - 0x64, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x74, 0x65, 0x72, 0x6d, 0x73, 0x20, 0x6f, 0x66, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x47, 0x4e, 0x55, - 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, - 0x20, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20, - 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x2c, - 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x20, 0x32, 0x2c, 0x0a, 0x20, 0x2a, 0x20, 0x61, - 0x73, 0x20, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, - 0x68, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x46, 0x72, 0x65, 0x65, 0x20, - 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, - 0x20, 0x46, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x2e, 0x0a, 0x20, 0x2a, 0x0a, - 0x20, 0x2a, 0x20, 0x49, 0x6e, 0x20, 0x61, 0x64, - 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, - 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x65, - 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x47, 0x4e, 0x55, 0x20, 0x47, 0x65, 0x6e, - 0x65, 0x72, 0x61, 0x6c, 0x20, 0x50, 0x75, 0x62, - 0x6c, 0x69, 0x63, 0x20, 0x4c, 0x69, 0x63, 0x65, - 0x6e, 0x73, 0x65, 0x2c, 0x0a, 0x20, 0x2a, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x61, 0x75, 0x74, 0x68, - 0x6f, 0x72, 0x73, 0x20, 0x67, 0x69, 0x76, 0x65, - 0x20, 0x79, 0x6f, 0x75, 0x20, 0x75, 0x6e, 0x6c, - 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x20, 0x70, - 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x6c, 0x69, 0x6e, - 0x6b, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, - 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x64, 0x0a, 0x20, - 0x2a, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, - 0x73, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x69, - 0x6e, 0x74, 0x6f, 0x20, 0x63, 0x6f, 0x6d, 0x62, - 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x6f, 0x74, - 0x68, 0x65, 0x72, 0x20, 0x70, 0x72, 0x6f, 0x67, - 0x72, 0x61, 0x6d, 0x73, 0x2c, 0x0a, 0x20, 0x2a, - 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x6f, 0x20, - 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, - 0x74, 0x65, 0x20, 0x74, 0x68, 0x6f, 0x73, 0x65, - 0x20, 0x63, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x77, 0x69, - 0x74, 0x68, 0x6f, 0x75, 0x74, 0x20, 0x61, 0x6e, - 0x79, 0x20, 0x72, 0x65, 0x73, 0x74, 0x72, 0x69, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x0a, 0x20, 0x2a, - 0x20, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x20, - 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, - 0x74, 0x68, 0x69, 0x73, 0x20, 0x66, 0x69, 0x6c, - 0x65, 0x2e, 0x20, 0x20, 0x28, 0x54, 0x68, 0x65, - 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, - 0x20, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20, - 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x0a, - 0x20, 0x2a, 0x20, 0x72, 0x65, 0x73, 0x74, 0x72, - 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, - 0x64, 0x6f, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x79, - 0x20, 0x69, 0x6e, 0x20, 0x6f, 0x74, 0x68, 0x65, - 0x72, 0x20, 0x72, 0x65, 0x73, 0x70, 0x65, 0x63, - 0x74, 0x73, 0x3b, 0x20, 0x66, 0x6f, 0x72, 0x20, - 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2c, - 0x20, 0x74, 0x68, 0x65, 0x79, 0x20, 0x63, 0x6f, - 0x76, 0x65, 0x72, 0x0a, 0x20, 0x2a, 0x20, 0x6d, - 0x6f, 0x64, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x2c, - 0x20, 0x61, 0x6e, 0x64, 0x20, 0x64, 0x69, 0x73, - 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x6e, - 0x6f, 0x74, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x65, - 0x64, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x0a, 0x20, - 0x2a, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6d, 0x62, - 0x69, 0x6e, 0x65, 0x64, 0x20, 0x65, 0x78, 0x65, - 0x63, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, - 0x29, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, - 0x54, 0x68, 0x69, 0x73, 0x20, 0x66, 0x69, 0x6c, - 0x65, 0x20, 0x69, 0x73, 0x20, 0x64, 0x69, 0x73, - 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x64, - 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x68, 0x6f, 0x70, 0x65, 0x20, 0x74, 0x68, 0x61, - 0x74, 0x20, 0x69, 0x74, 0x20, 0x77, 0x69, 0x6c, - 0x6c, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, - 0x66, 0x75, 0x6c, 0x2c, 0x20, 0x62, 0x75, 0x74, - 0x0a, 0x20, 0x2a, 0x20, 0x57, 0x49, 0x54, 0x48, - 0x4f, 0x55, 0x54, 0x20, 0x41, 0x4e, 0x59, 0x20, - 0x57, 0x41, 0x52, 0x52, 0x41, 0x4e, 0x54, 0x59, - 0x3b, 0x20, 0x77, 0x69, 0x74, 0x68, 0x6f, 0x75, - 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x69, 0x6d, 0x70, 0x6c, 0x69, - 0x65, 0x64, 0x20, 0x77, 0x61, 0x72, 0x72, 0x61, - 0x6e, 0x74, 0x79, 0x20, 0x6f, 0x66, 0x0a, 0x20, - 0x2a, 0x20, 0x4d, 0x45, 0x52, 0x43, 0x48, 0x41, - 0x4e, 0x54, 0x41, 0x42, 0x49, 0x4c, 0x49, 0x54, - 0x59, 0x20, 0x6f, 0x72, 0x20, 0x46, 0x49, 0x54, - 0x4e, 0x45, 0x53, 0x53, 0x20, 0x46, 0x4f, 0x52, - 0x20, 0x41, 0x20, 0x50, 0x41, 0x52, 0x54, 0x49, - 0x43, 0x55, 0x4c, 0x41, 0x52, 0x20, 0x50, 0x55, - 0x52, 0x50, 0x4f, 0x53, 0x45, 0x2e, 0x20, 0x20, - 0x53, 0x65, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x47, 0x4e, 0x55, 0x0a, 0x20, 0x2a, 0x20, 0x47, - 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x20, 0x50, - 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20, 0x4c, 0x69, - 0x63, 0x65, 0x6e, 0x73, 0x65, 0x20, 0x66, 0x6f, - 0x72, 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x64, - 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x2e, 0x0a, - 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x59, 0x6f, - 0x75, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, - 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x72, 0x65, - 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x20, 0x61, - 0x20, 0x63, 0x6f, 0x70, 0x79, 0x20, 0x6f, 0x66, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x47, 0x4e, 0x55, - 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, - 0x20, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20, - 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x0a, - 0x20, 0x2a, 0x20, 0x61, 0x6c, 0x6f, 0x6e, 0x67, - 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, - 0x69, 0x73, 0x20, 0x70, 0x72, 0x6f, 0x67, 0x72, - 0x61, 0x6d, 0x3b, 0x20, 0x73, 0x65, 0x65, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x6c, 0x65, - 0x20, 0x43, 0x4f, 0x50, 0x59, 0x49, 0x4e, 0x47, - 0x2e, 0x20, 0x20, 0x49, 0x66, 0x20, 0x6e, 0x6f, - 0x74, 0x2c, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, - 0x20, 0x74, 0x6f, 0x0a, 0x20, 0x2a, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x46, 0x72, 0x65, 0x65, 0x20, - 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, - 0x20, 0x46, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x35, 0x31, 0x20, - 0x46, 0x72, 0x61, 0x6e, 0x6b, 0x6c, 0x69, 0x6e, - 0x20, 0x53, 0x74, 0x72, 0x65, 0x65, 0x74, 0x2c, - 0x20, 0x46, 0x69, 0x66, 0x74, 0x68, 0x20, 0x46, - 0x6c, 0x6f, 0x6f, 0x72, 0x2c, 0x0a, 0x20, 0x2a, - 0x20, 0x42, 0x6f, 0x73, 0x74, 0x6f, 0x6e, 0x2c, - 0x20, 0x4d, 0x41, 0x20, 0x30, 0x32, 0x31, 0x31, - 0x30, 0x2d, 0x31, 0x33, 0x30, 0x31, 0x2c, 0x20, - 0x55, 0x53, 0x41, 0x2e, 0x0a, 0x20, 0x2a, 0x2f, - 0x0a, -}; - -/* - * SHA1 Hashes - */ -static char *commit_id = "3d7f8a6af076c8c3f20071a8935cdbe8228594d1"; -static char *tree_id = "dff2da90b254e1beb889d1f1f1288be1803782df"; -static char *tag_id = "09d373e1dfdc16b129ceec6dd649739911541e05"; -static char *zero_id = "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391"; -static char *one_id = "8b137891791fe96927ad78e64b0aad7bded08bdc"; -static char *two_id = "78981922613b2afb6025042ff6bd878ac1994e85"; -static char *some_id = "fd8430bc864cfcd5f10e5590f8a447e01b942bfe"; - -/* - * In-memory objects - */ -static git_rawobj tree_obj = { - tree_data, - sizeof(tree_data), - GIT_OBJ_TREE -}; - -static git_rawobj tag_obj = { - tag_data, - sizeof(tag_data), - GIT_OBJ_TAG -}; - -static git_rawobj zero_obj = { - zero_data, - 0, - GIT_OBJ_BLOB -}; - -static git_rawobj one_obj = { - one_data, - sizeof(one_data), - GIT_OBJ_BLOB -}; - -static git_rawobj two_obj = { - two_data, - sizeof(two_data), - GIT_OBJ_BLOB -}; - -static git_rawobj commit_obj = { - commit_data, - sizeof(commit_data), - GIT_OBJ_COMMIT -}; - -static git_rawobj some_obj = { - some_data, - sizeof(some_data), - GIT_OBJ_BLOB -}; - -static git_rawobj junk_obj = { - NULL, - 0, - GIT_OBJ_BAD -}; diff --git a/vendor/libgit2/tests/object/raw/fromstr.c b/vendor/libgit2/tests/object/raw/fromstr.c deleted file mode 100644 index 8c11c105fd..0000000000 --- a/vendor/libgit2/tests/object/raw/fromstr.c +++ /dev/null @@ -1,30 +0,0 @@ - -#include "clar_libgit2.h" - -#include "odb.h" - -void test_object_raw_fromstr__fail_on_invalid_oid_string(void) -{ - git_oid out; - cl_git_fail(git_oid_fromstr(&out, "")); - cl_git_fail(git_oid_fromstr(&out, "moo")); - cl_git_fail(git_oid_fromstr(&out, "16a67770b7d8d72317c4b775213c23a8bd74f5ez")); -} - -void test_object_raw_fromstr__succeed_on_valid_oid_string(void) -{ - git_oid out; - unsigned char exp[] = { - 0x16, 0xa6, 0x77, 0x70, 0xb7, - 0xd8, 0xd7, 0x23, 0x17, 0xc4, - 0xb7, 0x75, 0x21, 0x3c, 0x23, - 0xa8, 0xbd, 0x74, 0xf5, 0xe0, - }; - - cl_git_pass(git_oid_fromstr(&out, "16a67770b7d8d72317c4b775213c23a8bd74f5e0")); - cl_git_pass(memcmp(out.id, exp, sizeof(out.id))); - - cl_git_pass(git_oid_fromstr(&out, "16A67770B7D8D72317C4b775213C23A8BD74F5E0")); - cl_git_pass(memcmp(out.id, exp, sizeof(out.id))); - -} diff --git a/vendor/libgit2/tests/object/raw/hash.c b/vendor/libgit2/tests/object/raw/hash.c deleted file mode 100644 index ede31e145e..0000000000 --- a/vendor/libgit2/tests/object/raw/hash.c +++ /dev/null @@ -1,166 +0,0 @@ - -#include "clar_libgit2.h" - -#include "odb.h" -#include "hash.h" - -#include "data.h" - -static void hash_object_pass(git_oid *oid, git_rawobj *obj) -{ - cl_git_pass(git_odb_hash(oid, obj->data, obj->len, obj->type)); -} -static void hash_object_fail(git_oid *oid, git_rawobj *obj) -{ - cl_git_fail(git_odb_hash(oid, obj->data, obj->len, obj->type)); -} - -static char *hello_id = "22596363b3de40b06f981fb85d82312e8c0ed511"; -static char *hello_text = "hello world\n"; - -static char *bye_id = "ce08fe4884650f067bd5703b6a59a8b3b3c99a09"; -static char *bye_text = "bye world\n"; - -void test_object_raw_hash__hash_by_blocks(void) -{ - git_hash_ctx ctx; - git_oid id1, id2; - - cl_git_pass(git_hash_ctx_init(&ctx)); - - /* should already be init'd */ - cl_git_pass(git_hash_update(&ctx, hello_text, strlen(hello_text))); - cl_git_pass(git_hash_final(&id2, &ctx)); - cl_git_pass(git_oid_fromstr(&id1, hello_id)); - cl_assert(git_oid_cmp(&id1, &id2) == 0); - - /* reinit should permit reuse */ - cl_git_pass(git_hash_init(&ctx)); - cl_git_pass(git_hash_update(&ctx, bye_text, strlen(bye_text))); - cl_git_pass(git_hash_final(&id2, &ctx)); - cl_git_pass(git_oid_fromstr(&id1, bye_id)); - cl_assert(git_oid_cmp(&id1, &id2) == 0); - - git_hash_ctx_cleanup(&ctx); -} - -void test_object_raw_hash__hash_buffer_in_single_call(void) -{ - git_oid id1, id2; - - cl_git_pass(git_oid_fromstr(&id1, hello_id)); - git_hash_buf(&id2, hello_text, strlen(hello_text)); - cl_assert(git_oid_cmp(&id1, &id2) == 0); -} - -void test_object_raw_hash__hash_vector(void) -{ - git_oid id1, id2; - git_buf_vec vec[2]; - - cl_git_pass(git_oid_fromstr(&id1, hello_id)); - - vec[0].data = hello_text; - vec[0].len = 4; - vec[1].data = hello_text+4; - vec[1].len = strlen(hello_text)-4; - - git_hash_vec(&id2, vec, 2); - - cl_assert(git_oid_cmp(&id1, &id2) == 0); -} - -void test_object_raw_hash__hash_junk_data(void) -{ - git_oid id, id_zero; - - cl_git_pass(git_oid_fromstr(&id_zero, zero_id)); - - /* invalid types: */ - junk_obj.data = some_data; - hash_object_fail(&id, &junk_obj); - - junk_obj.type = GIT_OBJ__EXT1; - hash_object_fail(&id, &junk_obj); - - junk_obj.type = GIT_OBJ__EXT2; - hash_object_fail(&id, &junk_obj); - - junk_obj.type = GIT_OBJ_OFS_DELTA; - hash_object_fail(&id, &junk_obj); - - junk_obj.type = GIT_OBJ_REF_DELTA; - hash_object_fail(&id, &junk_obj); - - /* data can be NULL only if len is zero: */ - junk_obj.type = GIT_OBJ_BLOB; - junk_obj.data = NULL; - hash_object_pass(&id, &junk_obj); - cl_assert(git_oid_cmp(&id, &id_zero) == 0); - - junk_obj.len = 1; - hash_object_fail(&id, &junk_obj); -} - -void test_object_raw_hash__hash_commit_object(void) -{ - git_oid id1, id2; - - cl_git_pass(git_oid_fromstr(&id1, commit_id)); - hash_object_pass(&id2, &commit_obj); - cl_assert(git_oid_cmp(&id1, &id2) == 0); -} - -void test_object_raw_hash__hash_tree_object(void) -{ - git_oid id1, id2; - - cl_git_pass(git_oid_fromstr(&id1, tree_id)); - hash_object_pass(&id2, &tree_obj); - cl_assert(git_oid_cmp(&id1, &id2) == 0); -} - -void test_object_raw_hash__hash_tag_object(void) -{ - git_oid id1, id2; - - cl_git_pass(git_oid_fromstr(&id1, tag_id)); - hash_object_pass(&id2, &tag_obj); - cl_assert(git_oid_cmp(&id1, &id2) == 0); -} - -void test_object_raw_hash__hash_zero_length_object(void) -{ - git_oid id1, id2; - - cl_git_pass(git_oid_fromstr(&id1, zero_id)); - hash_object_pass(&id2, &zero_obj); - cl_assert(git_oid_cmp(&id1, &id2) == 0); -} - -void test_object_raw_hash__hash_one_byte_object(void) -{ - git_oid id1, id2; - - cl_git_pass(git_oid_fromstr(&id1, one_id)); - hash_object_pass(&id2, &one_obj); - cl_assert(git_oid_cmp(&id1, &id2) == 0); -} - -void test_object_raw_hash__hash_two_byte_object(void) -{ - git_oid id1, id2; - - cl_git_pass(git_oid_fromstr(&id1, two_id)); - hash_object_pass(&id2, &two_obj); - cl_assert(git_oid_cmp(&id1, &id2) == 0); -} - -void test_object_raw_hash__hash_multi_byte_object(void) -{ - git_oid id1, id2; - - cl_git_pass(git_oid_fromstr(&id1, some_id)); - hash_object_pass(&id2, &some_obj); - cl_assert(git_oid_cmp(&id1, &id2) == 0); -} diff --git a/vendor/libgit2/tests/object/raw/short.c b/vendor/libgit2/tests/object/raw/short.c deleted file mode 100644 index 813cd86b6f..0000000000 --- a/vendor/libgit2/tests/object/raw/short.c +++ /dev/null @@ -1,137 +0,0 @@ - -#include "clar_libgit2.h" - -#include "odb.h" -#include "hash.h" - -void test_object_raw_short__oid_shortener_no_duplicates(void) -{ - git_oid_shorten *os; - int min_len; - - os = git_oid_shorten_new(0); - cl_assert(os != NULL); - - git_oid_shorten_add(os, "22596363b3de40b06f981fb85d82312e8c0ed511"); - git_oid_shorten_add(os, "ce08fe4884650f067bd5703b6a59a8b3b3c99a09"); - git_oid_shorten_add(os, "16a0123456789abcdef4b775213c23a8bd74f5e0"); - min_len = git_oid_shorten_add(os, "ce08fe4884650f067bd5703b6a59a8b3b3c99a09"); - - cl_assert(min_len == GIT_OID_HEXSZ + 1); - - git_oid_shorten_free(os); -} - -static int insert_sequential_oids( - char ***out, git_oid_shorten *os, int n, int fail) -{ - int i, min_len = 0; - char numbuf[16]; - git_oid oid; - char **oids = git__calloc(n, sizeof(char *)); - cl_assert(oids != NULL); - - for (i = 0; i < n; ++i) { - p_snprintf(numbuf, sizeof(numbuf), "%u", (unsigned int)i); - git_hash_buf(&oid, numbuf, strlen(numbuf)); - - oids[i] = git__malloc(GIT_OID_HEXSZ + 1); - cl_assert(oids[i]); - git_oid_nfmt(oids[i], GIT_OID_HEXSZ + 1, &oid); - - min_len = git_oid_shorten_add(os, oids[i]); - - /* After "fail", we expect git_oid_shorten_add to fail */ - if (fail >= 0 && i >= fail) - cl_assert(min_len < 0); - else - cl_assert(min_len >= 0); - } - - *out = oids; - - return min_len; -} - -static void free_oids(int n, char **oids) -{ - int i; - - for (i = 0; i < n; ++i) { - git__free(oids[i]); - } - git__free(oids); -} - -void test_object_raw_short__oid_shortener_stresstest_git_oid_shorten(void) -{ -#define MAX_OIDS 1000 - - git_oid_shorten *os; - size_t i, j; - int min_len = 0, found_collision; - char **oids; - - os = git_oid_shorten_new(0); - cl_assert(os != NULL); - - /* - * Insert in the shortener 1000 unique SHA1 ids - */ - min_len = insert_sequential_oids(&oids, os, MAX_OIDS, MAX_OIDS); - cl_assert(min_len > 0); - - /* - * Compare the first `min_char - 1` characters of each - * SHA1 OID. If the minimizer worked, we should find at - * least one collision - */ - found_collision = 0; - for (i = 0; i < MAX_OIDS; ++i) { - for (j = i + 1; j < MAX_OIDS; ++j) { - if (memcmp(oids[i], oids[j], min_len - 1) == 0) - found_collision = 1; - } - } - cl_assert_equal_b(true, found_collision); - - /* - * Compare the first `min_char` characters of each - * SHA1 OID. If the minimizer worked, every single preffix - * should be unique. - */ - found_collision = 0; - for (i = 0; i < MAX_OIDS; ++i) { - for (j = i + 1; j < MAX_OIDS; ++j) { - if (memcmp(oids[i], oids[j], min_len) == 0) - found_collision = 1; - } - } - cl_assert_equal_b(false, found_collision); - - /* cleanup */ - free_oids(MAX_OIDS, oids); - git_oid_shorten_free(os); - -#undef MAX_OIDS -} - -void test_object_raw_short__oid_shortener_too_much_oids(void) -{ - /* The magic number of oids at which an oid_shortener will fail. - * This was experimentally established. */ -#define MAX_OIDS 24556 - - git_oid_shorten *os; - char **oids; - - os = git_oid_shorten_new(0); - cl_assert(os != NULL); - - cl_assert(insert_sequential_oids(&oids, os, MAX_OIDS, MAX_OIDS - 1) < 0); - - free_oids(MAX_OIDS, oids); - git_oid_shorten_free(os); - -#undef MAX_OIDS -} diff --git a/vendor/libgit2/tests/object/raw/size.c b/vendor/libgit2/tests/object/raw/size.c deleted file mode 100644 index 930c6de233..0000000000 --- a/vendor/libgit2/tests/object/raw/size.c +++ /dev/null @@ -1,13 +0,0 @@ - -#include "clar_libgit2.h" - -#include "odb.h" - -void test_object_raw_size__validate_oid_size(void) -{ - git_oid out; - cl_assert(20 == GIT_OID_RAWSZ); - cl_assert(40 == GIT_OID_HEXSZ); - cl_assert(sizeof(out) == GIT_OID_RAWSZ); - cl_assert(sizeof(out.id) == GIT_OID_RAWSZ); -} diff --git a/vendor/libgit2/tests/object/raw/type2string.c b/vendor/libgit2/tests/object/raw/type2string.c deleted file mode 100644 index a3585487f6..0000000000 --- a/vendor/libgit2/tests/object/raw/type2string.c +++ /dev/null @@ -1,54 +0,0 @@ - -#include "clar_libgit2.h" - -#include "odb.h" -#include "hash.h" - -void test_object_raw_type2string__convert_type_to_string(void) -{ - cl_assert_equal_s(git_object_type2string(GIT_OBJ_BAD), ""); - cl_assert_equal_s(git_object_type2string(GIT_OBJ__EXT1), ""); - cl_assert_equal_s(git_object_type2string(GIT_OBJ_COMMIT), "commit"); - cl_assert_equal_s(git_object_type2string(GIT_OBJ_TREE), "tree"); - cl_assert_equal_s(git_object_type2string(GIT_OBJ_BLOB), "blob"); - cl_assert_equal_s(git_object_type2string(GIT_OBJ_TAG), "tag"); - cl_assert_equal_s(git_object_type2string(GIT_OBJ__EXT2), ""); - cl_assert_equal_s(git_object_type2string(GIT_OBJ_OFS_DELTA), "OFS_DELTA"); - cl_assert_equal_s(git_object_type2string(GIT_OBJ_REF_DELTA), "REF_DELTA"); - - cl_assert_equal_s(git_object_type2string(-2), ""); - cl_assert_equal_s(git_object_type2string(8), ""); - cl_assert_equal_s(git_object_type2string(1234), ""); -} - -void test_object_raw_type2string__convert_string_to_type(void) -{ - cl_assert(git_object_string2type(NULL) == GIT_OBJ_BAD); - cl_assert(git_object_string2type("") == GIT_OBJ_BAD); - cl_assert(git_object_string2type("commit") == GIT_OBJ_COMMIT); - cl_assert(git_object_string2type("tree") == GIT_OBJ_TREE); - cl_assert(git_object_string2type("blob") == GIT_OBJ_BLOB); - cl_assert(git_object_string2type("tag") == GIT_OBJ_TAG); - cl_assert(git_object_string2type("OFS_DELTA") == GIT_OBJ_OFS_DELTA); - cl_assert(git_object_string2type("REF_DELTA") == GIT_OBJ_REF_DELTA); - - cl_assert(git_object_string2type("CoMmIt") == GIT_OBJ_BAD); - cl_assert(git_object_string2type("hohoho") == GIT_OBJ_BAD); -} - -void test_object_raw_type2string__check_type_is_loose(void) -{ - cl_assert(git_object_typeisloose(GIT_OBJ_BAD) == 0); - cl_assert(git_object_typeisloose(GIT_OBJ__EXT1) == 0); - cl_assert(git_object_typeisloose(GIT_OBJ_COMMIT) == 1); - cl_assert(git_object_typeisloose(GIT_OBJ_TREE) == 1); - cl_assert(git_object_typeisloose(GIT_OBJ_BLOB) == 1); - cl_assert(git_object_typeisloose(GIT_OBJ_TAG) == 1); - cl_assert(git_object_typeisloose(GIT_OBJ__EXT2) == 0); - cl_assert(git_object_typeisloose(GIT_OBJ_OFS_DELTA) == 0); - cl_assert(git_object_typeisloose(GIT_OBJ_REF_DELTA) == 0); - - cl_assert(git_object_typeisloose(-2) == 0); - cl_assert(git_object_typeisloose(8) == 0); - cl_assert(git_object_typeisloose(1234) == 0); -} diff --git a/vendor/libgit2/tests/object/raw/write.c b/vendor/libgit2/tests/object/raw/write.c deleted file mode 100644 index 273f08f2c3..0000000000 --- a/vendor/libgit2/tests/object/raw/write.c +++ /dev/null @@ -1,462 +0,0 @@ -#include "clar_libgit2.h" -#include "git2/odb_backend.h" - -#include "fileops.h" -#include "odb.h" - -typedef struct object_data { - char *id; /* object id (sha1) */ - char *dir; /* object store (fan-out) directory name */ - char *file; /* object store filename */ -} object_data; - -static const char *odb_dir = "test-objects"; - -void test_body(object_data *d, git_rawobj *o); - - - -// Helpers -static void remove_object_files(object_data *d) -{ - cl_git_pass(p_unlink(d->file)); - cl_git_pass(p_rmdir(d->dir)); - cl_assert(errno != ENOTEMPTY); - cl_git_pass(p_rmdir(odb_dir) < 0); -} - -static void streaming_write(git_oid *oid, git_odb *odb, git_rawobj *raw) -{ - git_odb_stream *stream; - int error; - - cl_git_pass(git_odb_open_wstream(&stream, odb, raw->len, raw->type)); - git_odb_stream_write(stream, raw->data, raw->len); - error = git_odb_stream_finalize_write(oid, stream); - git_odb_stream_free(stream); - cl_git_pass(error); -} - -static void check_object_files(object_data *d) -{ - cl_assert(git_path_exists(d->dir)); - cl_assert(git_path_exists(d->file)); -} - -static void cmp_objects(git_rawobj *o1, git_rawobj *o2) -{ - cl_assert(o1->type == o2->type); - cl_assert(o1->len == o2->len); - if (o1->len > 0) - cl_assert(memcmp(o1->data, o2->data, o1->len) == 0); -} - -static void make_odb_dir(void) -{ - cl_git_pass(p_mkdir(odb_dir, GIT_OBJECT_DIR_MODE)); -} - - -// Standard test form -void test_body(object_data *d, git_rawobj *o) -{ - git_odb *db; - git_oid id1, id2; - git_odb_object *obj; - git_rawobj tmp; - - make_odb_dir(); - cl_git_pass(git_odb_open(&db, odb_dir)); - cl_git_pass(git_oid_fromstr(&id1, d->id)); - - streaming_write(&id2, db, o); - cl_assert(git_oid_cmp(&id1, &id2) == 0); - check_object_files(d); - - cl_git_pass(git_odb_read(&obj, db, &id1)); - - tmp.data = obj->buffer; - tmp.len = obj->cached.size; - tmp.type = obj->cached.type; - - cmp_objects(&tmp, o); - - git_odb_object_free(obj); - git_odb_free(db); - remove_object_files(d); -} - - -void test_object_raw_write__loose_object(void) -{ - object_data commit = { - "3d7f8a6af076c8c3f20071a8935cdbe8228594d1", - "test-objects/3d", - "test-objects/3d/7f8a6af076c8c3f20071a8935cdbe8228594d1", - }; - - unsigned char commit_data[] = { - 0x74, 0x72, 0x65, 0x65, 0x20, 0x64, 0x66, 0x66, - 0x32, 0x64, 0x61, 0x39, 0x30, 0x62, 0x32, 0x35, - 0x34, 0x65, 0x31, 0x62, 0x65, 0x62, 0x38, 0x38, - 0x39, 0x64, 0x31, 0x66, 0x31, 0x66, 0x31, 0x32, - 0x38, 0x38, 0x62, 0x65, 0x31, 0x38, 0x30, 0x33, - 0x37, 0x38, 0x32, 0x64, 0x66, 0x0a, 0x61, 0x75, - 0x74, 0x68, 0x6f, 0x72, 0x20, 0x41, 0x20, 0x55, - 0x20, 0x54, 0x68, 0x6f, 0x72, 0x20, 0x3c, 0x61, - 0x75, 0x74, 0x68, 0x6f, 0x72, 0x40, 0x65, 0x78, - 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x63, 0x6f, - 0x6d, 0x3e, 0x20, 0x31, 0x32, 0x32, 0x37, 0x38, - 0x31, 0x34, 0x32, 0x39, 0x37, 0x20, 0x2b, 0x30, - 0x30, 0x30, 0x30, 0x0a, 0x63, 0x6f, 0x6d, 0x6d, - 0x69, 0x74, 0x74, 0x65, 0x72, 0x20, 0x43, 0x20, - 0x4f, 0x20, 0x4d, 0x69, 0x74, 0x74, 0x65, 0x72, - 0x20, 0x3c, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, - 0x74, 0x65, 0x72, 0x40, 0x65, 0x78, 0x61, 0x6d, - 0x70, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x3e, - 0x20, 0x31, 0x32, 0x32, 0x37, 0x38, 0x31, 0x34, - 0x32, 0x39, 0x37, 0x20, 0x2b, 0x30, 0x30, 0x30, - 0x30, 0x0a, 0x0a, 0x41, 0x20, 0x6f, 0x6e, 0x65, - 0x2d, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x63, 0x6f, - 0x6d, 0x6d, 0x69, 0x74, 0x20, 0x73, 0x75, 0x6d, - 0x6d, 0x61, 0x72, 0x79, 0x0a, 0x0a, 0x54, 0x68, - 0x65, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x6f, - 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, - 0x6d, 0x6d, 0x69, 0x74, 0x20, 0x6d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x63, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, - 0x20, 0x66, 0x75, 0x72, 0x74, 0x68, 0x65, 0x72, - 0x20, 0x65, 0x78, 0x70, 0x6c, 0x61, 0x6e, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x0a, 0x6f, 0x66, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x70, 0x75, 0x72, 0x70, - 0x6f, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x73, 0x20, 0x69, 0x6e, 0x74, 0x72, 0x6f, - 0x64, 0x75, 0x63, 0x65, 0x64, 0x20, 0x62, 0x79, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, - 0x6d, 0x69, 0x74, 0x2e, 0x0a, 0x0a, 0x53, 0x69, - 0x67, 0x6e, 0x65, 0x64, 0x2d, 0x6f, 0x66, 0x2d, - 0x62, 0x79, 0x3a, 0x20, 0x41, 0x20, 0x55, 0x20, - 0x54, 0x68, 0x6f, 0x72, 0x20, 0x3c, 0x61, 0x75, - 0x74, 0x68, 0x6f, 0x72, 0x40, 0x65, 0x78, 0x61, - 0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, - 0x3e, 0x0a, - }; - - git_rawobj commit_obj = { - commit_data, - sizeof(commit_data), - GIT_OBJ_COMMIT - }; - - test_body(&commit, &commit_obj); -} - -void test_object_raw_write__loose_tree(void) -{ - static object_data tree = { - "dff2da90b254e1beb889d1f1f1288be1803782df", - "test-objects/df", - "test-objects/df/f2da90b254e1beb889d1f1f1288be1803782df", - }; - - static unsigned char tree_data[] = { - 0x31, 0x30, 0x30, 0x36, 0x34, 0x34, 0x20, 0x6f, - 0x6e, 0x65, 0x00, 0x8b, 0x13, 0x78, 0x91, 0x79, - 0x1f, 0xe9, 0x69, 0x27, 0xad, 0x78, 0xe6, 0x4b, - 0x0a, 0xad, 0x7b, 0xde, 0xd0, 0x8b, 0xdc, 0x31, - 0x30, 0x30, 0x36, 0x34, 0x34, 0x20, 0x73, 0x6f, - 0x6d, 0x65, 0x00, 0xfd, 0x84, 0x30, 0xbc, 0x86, - 0x4c, 0xfc, 0xd5, 0xf1, 0x0e, 0x55, 0x90, 0xf8, - 0xa4, 0x47, 0xe0, 0x1b, 0x94, 0x2b, 0xfe, 0x31, - 0x30, 0x30, 0x36, 0x34, 0x34, 0x20, 0x74, 0x77, - 0x6f, 0x00, 0x78, 0x98, 0x19, 0x22, 0x61, 0x3b, - 0x2a, 0xfb, 0x60, 0x25, 0x04, 0x2f, 0xf6, 0xbd, - 0x87, 0x8a, 0xc1, 0x99, 0x4e, 0x85, 0x31, 0x30, - 0x30, 0x36, 0x34, 0x34, 0x20, 0x7a, 0x65, 0x72, - 0x6f, 0x00, 0xe6, 0x9d, 0xe2, 0x9b, 0xb2, 0xd1, - 0xd6, 0x43, 0x4b, 0x8b, 0x29, 0xae, 0x77, 0x5a, - 0xd8, 0xc2, 0xe4, 0x8c, 0x53, 0x91, - }; - - static git_rawobj tree_obj = { - tree_data, - sizeof(tree_data), - GIT_OBJ_TREE - }; - - test_body(&tree, &tree_obj); -} - -void test_object_raw_write__loose_tag(void) -{ - static object_data tag = { - "09d373e1dfdc16b129ceec6dd649739911541e05", - "test-objects/09", - "test-objects/09/d373e1dfdc16b129ceec6dd649739911541e05", - }; - - static unsigned char tag_data[] = { - 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x33, - 0x64, 0x37, 0x66, 0x38, 0x61, 0x36, 0x61, 0x66, - 0x30, 0x37, 0x36, 0x63, 0x38, 0x63, 0x33, 0x66, - 0x32, 0x30, 0x30, 0x37, 0x31, 0x61, 0x38, 0x39, - 0x33, 0x35, 0x63, 0x64, 0x62, 0x65, 0x38, 0x32, - 0x32, 0x38, 0x35, 0x39, 0x34, 0x64, 0x31, 0x0a, - 0x74, 0x79, 0x70, 0x65, 0x20, 0x63, 0x6f, 0x6d, - 0x6d, 0x69, 0x74, 0x0a, 0x74, 0x61, 0x67, 0x20, - 0x76, 0x30, 0x2e, 0x30, 0x2e, 0x31, 0x0a, 0x74, - 0x61, 0x67, 0x67, 0x65, 0x72, 0x20, 0x43, 0x20, - 0x4f, 0x20, 0x4d, 0x69, 0x74, 0x74, 0x65, 0x72, - 0x20, 0x3c, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, - 0x74, 0x65, 0x72, 0x40, 0x65, 0x78, 0x61, 0x6d, - 0x70, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x3e, - 0x20, 0x31, 0x32, 0x32, 0x37, 0x38, 0x31, 0x34, - 0x32, 0x39, 0x37, 0x20, 0x2b, 0x30, 0x30, 0x30, - 0x30, 0x0a, 0x0a, 0x54, 0x68, 0x69, 0x73, 0x20, - 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, - 0x61, 0x67, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x72, 0x65, - 0x6c, 0x65, 0x61, 0x73, 0x65, 0x20, 0x76, 0x30, - 0x2e, 0x30, 0x2e, 0x31, 0x0a, - }; - - static git_rawobj tag_obj = { - tag_data, - sizeof(tag_data), - GIT_OBJ_TAG - }; - - - test_body(&tag, &tag_obj); -} - -void test_object_raw_write__zero_length(void) -{ - static object_data zero = { - "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391", - "test-objects/e6", - "test-objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391", - }; - - static unsigned char zero_data[] = { - 0x00 /* dummy data */ - }; - - static git_rawobj zero_obj = { - zero_data, - 0, - GIT_OBJ_BLOB - }; - - test_body(&zero, &zero_obj); -} - -void test_object_raw_write__one_byte(void) -{ - static object_data one = { - "8b137891791fe96927ad78e64b0aad7bded08bdc", - "test-objects/8b", - "test-objects/8b/137891791fe96927ad78e64b0aad7bded08bdc", - }; - - static unsigned char one_data[] = { - 0x0a, - }; - - static git_rawobj one_obj = { - one_data, - sizeof(one_data), - GIT_OBJ_BLOB - }; - - test_body(&one, &one_obj); -} - -void test_object_raw_write__two_byte(void) -{ - static object_data two = { - "78981922613b2afb6025042ff6bd878ac1994e85", - "test-objects/78", - "test-objects/78/981922613b2afb6025042ff6bd878ac1994e85", - }; - - static unsigned char two_data[] = { - 0x61, 0x0a, - }; - - static git_rawobj two_obj = { - two_data, - sizeof(two_data), - GIT_OBJ_BLOB - }; - - test_body(&two, &two_obj); -} - -void test_object_raw_write__several_bytes(void) -{ - static object_data some = { - "fd8430bc864cfcd5f10e5590f8a447e01b942bfe", - "test-objects/fd", - "test-objects/fd/8430bc864cfcd5f10e5590f8a447e01b942bfe", - }; - - static unsigned char some_data[] = { - 0x2f, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x54, 0x68, - 0x69, 0x73, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, - 0x69, 0x73, 0x20, 0x66, 0x72, 0x65, 0x65, 0x20, - 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, - 0x3b, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x63, 0x61, - 0x6e, 0x20, 0x72, 0x65, 0x64, 0x69, 0x73, 0x74, - 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x69, - 0x74, 0x20, 0x61, 0x6e, 0x64, 0x2f, 0x6f, 0x72, - 0x20, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x0a, - 0x20, 0x2a, 0x20, 0x69, 0x74, 0x20, 0x75, 0x6e, - 0x64, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x74, 0x65, 0x72, 0x6d, 0x73, 0x20, 0x6f, 0x66, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x47, 0x4e, 0x55, - 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, - 0x20, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20, - 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x2c, - 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x20, 0x32, 0x2c, 0x0a, 0x20, 0x2a, 0x20, 0x61, - 0x73, 0x20, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, - 0x68, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x46, 0x72, 0x65, 0x65, 0x20, - 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, - 0x20, 0x46, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x2e, 0x0a, 0x20, 0x2a, 0x0a, - 0x20, 0x2a, 0x20, 0x49, 0x6e, 0x20, 0x61, 0x64, - 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, - 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x65, - 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x47, 0x4e, 0x55, 0x20, 0x47, 0x65, 0x6e, - 0x65, 0x72, 0x61, 0x6c, 0x20, 0x50, 0x75, 0x62, - 0x6c, 0x69, 0x63, 0x20, 0x4c, 0x69, 0x63, 0x65, - 0x6e, 0x73, 0x65, 0x2c, 0x0a, 0x20, 0x2a, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x61, 0x75, 0x74, 0x68, - 0x6f, 0x72, 0x73, 0x20, 0x67, 0x69, 0x76, 0x65, - 0x20, 0x79, 0x6f, 0x75, 0x20, 0x75, 0x6e, 0x6c, - 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x20, 0x70, - 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x6c, 0x69, 0x6e, - 0x6b, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, - 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x64, 0x0a, 0x20, - 0x2a, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, - 0x73, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x69, - 0x6e, 0x74, 0x6f, 0x20, 0x63, 0x6f, 0x6d, 0x62, - 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x6f, 0x74, - 0x68, 0x65, 0x72, 0x20, 0x70, 0x72, 0x6f, 0x67, - 0x72, 0x61, 0x6d, 0x73, 0x2c, 0x0a, 0x20, 0x2a, - 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x6f, 0x20, - 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, - 0x74, 0x65, 0x20, 0x74, 0x68, 0x6f, 0x73, 0x65, - 0x20, 0x63, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x77, 0x69, - 0x74, 0x68, 0x6f, 0x75, 0x74, 0x20, 0x61, 0x6e, - 0x79, 0x20, 0x72, 0x65, 0x73, 0x74, 0x72, 0x69, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x0a, 0x20, 0x2a, - 0x20, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x20, - 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, - 0x74, 0x68, 0x69, 0x73, 0x20, 0x66, 0x69, 0x6c, - 0x65, 0x2e, 0x20, 0x20, 0x28, 0x54, 0x68, 0x65, - 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, - 0x20, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20, - 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x0a, - 0x20, 0x2a, 0x20, 0x72, 0x65, 0x73, 0x74, 0x72, - 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, - 0x64, 0x6f, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x79, - 0x20, 0x69, 0x6e, 0x20, 0x6f, 0x74, 0x68, 0x65, - 0x72, 0x20, 0x72, 0x65, 0x73, 0x70, 0x65, 0x63, - 0x74, 0x73, 0x3b, 0x20, 0x66, 0x6f, 0x72, 0x20, - 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2c, - 0x20, 0x74, 0x68, 0x65, 0x79, 0x20, 0x63, 0x6f, - 0x76, 0x65, 0x72, 0x0a, 0x20, 0x2a, 0x20, 0x6d, - 0x6f, 0x64, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x2c, - 0x20, 0x61, 0x6e, 0x64, 0x20, 0x64, 0x69, 0x73, - 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x6e, - 0x6f, 0x74, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x65, - 0x64, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x0a, 0x20, - 0x2a, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6d, 0x62, - 0x69, 0x6e, 0x65, 0x64, 0x20, 0x65, 0x78, 0x65, - 0x63, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, - 0x29, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, - 0x54, 0x68, 0x69, 0x73, 0x20, 0x66, 0x69, 0x6c, - 0x65, 0x20, 0x69, 0x73, 0x20, 0x64, 0x69, 0x73, - 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x64, - 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x68, 0x6f, 0x70, 0x65, 0x20, 0x74, 0x68, 0x61, - 0x74, 0x20, 0x69, 0x74, 0x20, 0x77, 0x69, 0x6c, - 0x6c, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, - 0x66, 0x75, 0x6c, 0x2c, 0x20, 0x62, 0x75, 0x74, - 0x0a, 0x20, 0x2a, 0x20, 0x57, 0x49, 0x54, 0x48, - 0x4f, 0x55, 0x54, 0x20, 0x41, 0x4e, 0x59, 0x20, - 0x57, 0x41, 0x52, 0x52, 0x41, 0x4e, 0x54, 0x59, - 0x3b, 0x20, 0x77, 0x69, 0x74, 0x68, 0x6f, 0x75, - 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x69, 0x6d, 0x70, 0x6c, 0x69, - 0x65, 0x64, 0x20, 0x77, 0x61, 0x72, 0x72, 0x61, - 0x6e, 0x74, 0x79, 0x20, 0x6f, 0x66, 0x0a, 0x20, - 0x2a, 0x20, 0x4d, 0x45, 0x52, 0x43, 0x48, 0x41, - 0x4e, 0x54, 0x41, 0x42, 0x49, 0x4c, 0x49, 0x54, - 0x59, 0x20, 0x6f, 0x72, 0x20, 0x46, 0x49, 0x54, - 0x4e, 0x45, 0x53, 0x53, 0x20, 0x46, 0x4f, 0x52, - 0x20, 0x41, 0x20, 0x50, 0x41, 0x52, 0x54, 0x49, - 0x43, 0x55, 0x4c, 0x41, 0x52, 0x20, 0x50, 0x55, - 0x52, 0x50, 0x4f, 0x53, 0x45, 0x2e, 0x20, 0x20, - 0x53, 0x65, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x47, 0x4e, 0x55, 0x0a, 0x20, 0x2a, 0x20, 0x47, - 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x20, 0x50, - 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20, 0x4c, 0x69, - 0x63, 0x65, 0x6e, 0x73, 0x65, 0x20, 0x66, 0x6f, - 0x72, 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x64, - 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x2e, 0x0a, - 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x59, 0x6f, - 0x75, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, - 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x72, 0x65, - 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x20, 0x61, - 0x20, 0x63, 0x6f, 0x70, 0x79, 0x20, 0x6f, 0x66, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x47, 0x4e, 0x55, - 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, - 0x20, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20, - 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x0a, - 0x20, 0x2a, 0x20, 0x61, 0x6c, 0x6f, 0x6e, 0x67, - 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, - 0x69, 0x73, 0x20, 0x70, 0x72, 0x6f, 0x67, 0x72, - 0x61, 0x6d, 0x3b, 0x20, 0x73, 0x65, 0x65, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x6c, 0x65, - 0x20, 0x43, 0x4f, 0x50, 0x59, 0x49, 0x4e, 0x47, - 0x2e, 0x20, 0x20, 0x49, 0x66, 0x20, 0x6e, 0x6f, - 0x74, 0x2c, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, - 0x20, 0x74, 0x6f, 0x0a, 0x20, 0x2a, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x46, 0x72, 0x65, 0x65, 0x20, - 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, - 0x20, 0x46, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x35, 0x31, 0x20, - 0x46, 0x72, 0x61, 0x6e, 0x6b, 0x6c, 0x69, 0x6e, - 0x20, 0x53, 0x74, 0x72, 0x65, 0x65, 0x74, 0x2c, - 0x20, 0x46, 0x69, 0x66, 0x74, 0x68, 0x20, 0x46, - 0x6c, 0x6f, 0x6f, 0x72, 0x2c, 0x0a, 0x20, 0x2a, - 0x20, 0x42, 0x6f, 0x73, 0x74, 0x6f, 0x6e, 0x2c, - 0x20, 0x4d, 0x41, 0x20, 0x30, 0x32, 0x31, 0x31, - 0x30, 0x2d, 0x31, 0x33, 0x30, 0x31, 0x2c, 0x20, - 0x55, 0x53, 0x41, 0x2e, 0x0a, 0x20, 0x2a, 0x2f, - 0x0a, - }; - - static git_rawobj some_obj = { - some_data, - sizeof(some_data), - GIT_OBJ_BLOB - }; - - test_body(&some, &some_obj); -} diff --git a/vendor/libgit2/tests/object/shortid.c b/vendor/libgit2/tests/object/shortid.c deleted file mode 100644 index d854cb78e9..0000000000 --- a/vendor/libgit2/tests/object/shortid.c +++ /dev/null @@ -1,51 +0,0 @@ -#include "clar_libgit2.h" - -git_repository *_repo; - -void test_object_shortid__initialize(void) -{ - cl_git_pass(git_repository_open(&_repo, cl_fixture("duplicate.git"))); -} - -void test_object_shortid__cleanup(void) -{ - git_repository_free(_repo); - _repo = NULL; -} - -void test_object_shortid__select(void) -{ - git_oid full; - git_object *obj; - git_buf shorty = {0}; - - git_oid_fromstr(&full, "ce013625030ba8dba906f756967f9e9ca394464a"); - cl_git_pass(git_object_lookup(&obj, _repo, &full, GIT_OBJ_ANY)); - cl_git_pass(git_object_short_id(&shorty, obj)); - cl_assert_equal_i(7, shorty.size); - cl_assert_equal_s("ce01362", shorty.ptr); - git_object_free(obj); - - git_oid_fromstr(&full, "038d718da6a1ebbc6a7780a96ed75a70cc2ad6e2"); - cl_git_pass(git_object_lookup(&obj, _repo, &full, GIT_OBJ_ANY)); - cl_git_pass(git_object_short_id(&shorty, obj)); - cl_assert_equal_i(7, shorty.size); - cl_assert_equal_s("038d718", shorty.ptr); - git_object_free(obj); - - git_oid_fromstr(&full, "dea509d097ce692e167dfc6a48a7a280cc5e877e"); - cl_git_pass(git_object_lookup(&obj, _repo, &full, GIT_OBJ_ANY)); - cl_git_pass(git_object_short_id(&shorty, obj)); - cl_assert_equal_i(9, shorty.size); - cl_assert_equal_s("dea509d09", shorty.ptr); - git_object_free(obj); - - git_oid_fromstr(&full, "dea509d0b3cb8ee0650f6ca210bc83f4678851ba"); - cl_git_pass(git_object_lookup(&obj, _repo, &full, GIT_OBJ_ANY)); - cl_git_pass(git_object_short_id(&shorty, obj)); - cl_assert_equal_i(9, shorty.size); - cl_assert_equal_s("dea509d0b", shorty.ptr); - git_object_free(obj); - - git_buf_free(&shorty); -} diff --git a/vendor/libgit2/tests/object/tag/list.c b/vendor/libgit2/tests/object/tag/list.c deleted file mode 100644 index 6d5a243477..0000000000 --- a/vendor/libgit2/tests/object/tag/list.c +++ /dev/null @@ -1,115 +0,0 @@ -#include "clar_libgit2.h" - -#include "tag.h" - -static git_repository *g_repo; - -#define MAX_USED_TAGS 6 - -struct pattern_match_t -{ - const char* pattern; - const size_t expected_matches; - const char* expected_results[MAX_USED_TAGS]; -}; - -// Helpers -static void ensure_tag_pattern_match(git_repository *repo, - const struct pattern_match_t* data) -{ - int already_found[MAX_USED_TAGS] = { 0 }; - git_strarray tag_list; - int error = 0; - size_t sucessfully_found = 0; - size_t i, j; - - cl_assert(data->expected_matches <= MAX_USED_TAGS); - - if ((error = git_tag_list_match(&tag_list, data->pattern, repo)) < 0) - goto exit; - - if (tag_list.count != data->expected_matches) - { - error = GIT_ERROR; - goto exit; - } - - // we have to be prepared that tags come in any order. - for (i = 0; i < tag_list.count; i++) - { - for (j = 0; j < data->expected_matches; j++) - { - if (!already_found[j] && !strcmp(data->expected_results[j], tag_list.strings[i])) - { - already_found[j] = 1; - sucessfully_found++; - break; - } - } - } - cl_assert_equal_i((int)sucessfully_found, (int)data->expected_matches); - -exit: - git_strarray_free(&tag_list); - cl_git_pass(error); -} - -// Fixture setup and teardown -void test_object_tag_list__initialize(void) -{ - g_repo = cl_git_sandbox_init("testrepo"); -} - -void test_object_tag_list__cleanup(void) -{ - cl_git_sandbox_cleanup(); -} - -void test_object_tag_list__list_all(void) -{ - // list all tag names from the repository - git_strarray tag_list; - - cl_git_pass(git_tag_list(&tag_list, g_repo)); - - cl_assert_equal_i((int)tag_list.count, 6); - - git_strarray_free(&tag_list); -} - -static const struct pattern_match_t matches[] = { - // All tags, including a packed one and two namespaced ones. - { "", 6, { "e90810b", "point_to_blob", "test", "packed-tag", "foo/bar", "foo/foo/bar" } }, - - // beginning with - { "t*", 1, { "test" } }, - - // ending with - { "*b", 2, { "e90810b", "point_to_blob" } }, - - // exact match - { "e", 0 }, - { "e90810b", 1, { "e90810b" } }, - - // either or - { "e90810[ab]", 1, { "e90810b" } }, - - // glob in the middle - { "foo/*/bar", 1, { "foo/foo/bar" } }, - - // The matching of '*' is based on plain string matching analog to the regular expression ".*" - // => a '/' in the tag name has no special meaning. - // Compare to `git tag -l "*bar"` - { "*bar", 2, { "foo/bar", "foo/foo/bar" } }, - - // End of list - { NULL } -}; - -void test_object_tag_list__list_by_pattern(void) -{ - // list all tag names from the repository matching a specified pattern - size_t i = 0; - while (matches[i].pattern) - ensure_tag_pattern_match(g_repo, &matches[i++]); -} diff --git a/vendor/libgit2/tests/object/tag/peel.c b/vendor/libgit2/tests/object/tag/peel.c deleted file mode 100644 index e2cd8d6a86..0000000000 --- a/vendor/libgit2/tests/object/tag/peel.c +++ /dev/null @@ -1,61 +0,0 @@ -#include "clar_libgit2.h" -#include "tag.h" - -static git_repository *repo; -static git_tag *tag; -static git_object *target; - -void test_object_tag_peel__initialize(void) -{ - cl_fixture_sandbox("testrepo.git"); - cl_git_pass(git_repository_open(&repo, "testrepo.git")); -} - -void test_object_tag_peel__cleanup(void) -{ - git_tag_free(tag); - tag = NULL; - - git_object_free(target); - target = NULL; - - git_repository_free(repo); - repo = NULL; - - cl_fixture_cleanup("testrepo.git"); -} - -static void retrieve_tag_from_oid(git_tag **tag_out, git_repository *repo, const char *sha) -{ - git_oid oid; - - cl_git_pass(git_oid_fromstr(&oid, sha)); - cl_git_pass(git_tag_lookup(tag_out, repo, &oid)); -} - -void test_object_tag_peel__can_peel_to_a_commit(void) -{ - retrieve_tag_from_oid(&tag, repo, "7b4384978d2493e851f9cca7858815fac9b10980"); - - cl_git_pass(git_tag_peel(&target, tag)); - cl_assert(git_object_type(target) == GIT_OBJ_COMMIT); - cl_git_pass(git_oid_streq(git_object_id(target), "e90810b8df3e80c413d903f631643c716887138d")); -} - -void test_object_tag_peel__can_peel_several_nested_tags_to_a_commit(void) -{ - retrieve_tag_from_oid(&tag, repo, "b25fa35b38051e4ae45d4222e795f9df2e43f1d1"); - - cl_git_pass(git_tag_peel(&target, tag)); - cl_assert(git_object_type(target) == GIT_OBJ_COMMIT); - cl_git_pass(git_oid_streq(git_object_id(target), "e90810b8df3e80c413d903f631643c716887138d")); -} - -void test_object_tag_peel__can_peel_to_a_non_commit(void) -{ - retrieve_tag_from_oid(&tag, repo, "521d87c1ec3aef9824daf6d96cc0ae3710766d91"); - - cl_git_pass(git_tag_peel(&target, tag)); - cl_assert(git_object_type(target) == GIT_OBJ_BLOB); - cl_git_pass(git_oid_streq(git_object_id(target), "1385f264afb75a56a5bec74243be9b367ba4ca08")); -} diff --git a/vendor/libgit2/tests/object/tag/read.c b/vendor/libgit2/tests/object/tag/read.c deleted file mode 100644 index c9787a413f..0000000000 --- a/vendor/libgit2/tests/object/tag/read.c +++ /dev/null @@ -1,142 +0,0 @@ -#include "clar_libgit2.h" - -#include "tag.h" - -static const char *tag1_id = "b25fa35b38051e4ae45d4222e795f9df2e43f1d1"; -static const char *tag2_id = "7b4384978d2493e851f9cca7858815fac9b10980"; -static const char *tagged_commit = "e90810b8df3e80c413d903f631643c716887138d"; -static const char *bad_tag_id = "eda9f45a2a98d4c17a09d681d88569fa4ea91755"; -static const char *badly_tagged_commit = "e90810b8df3e80c413d903f631643c716887138d"; -static const char *short_tag_id = "5da7760512a953e3c7c4e47e4392c7a4338fb729"; -static const char *short_tagged_commit = "4a5ed60bafcf4638b7c8356bd4ce1916bfede93c"; -static const char *taggerless = "4a23e2e65ad4e31c4c9db7dc746650bfad082679"; - -static git_repository *g_repo; - -// Fixture setup and teardown -void test_object_tag_read__initialize(void) -{ - g_repo = cl_git_sandbox_init("testrepo"); -} - -void test_object_tag_read__cleanup(void) -{ - cl_git_sandbox_cleanup(); -} - - -void test_object_tag_read__parse(void) -{ - // read and parse a tag from the repository - git_tag *tag1, *tag2; - git_commit *commit; - git_oid id1, id2, id_commit; - - git_oid_fromstr(&id1, tag1_id); - git_oid_fromstr(&id2, tag2_id); - git_oid_fromstr(&id_commit, tagged_commit); - - cl_git_pass(git_tag_lookup(&tag1, g_repo, &id1)); - - cl_assert_equal_s(git_tag_name(tag1), "test"); - cl_assert(git_tag_target_type(tag1) == GIT_OBJ_TAG); - - cl_git_pass(git_tag_target((git_object **)&tag2, tag1)); - cl_assert(tag2 != NULL); - - cl_assert(git_oid_cmp(&id2, git_tag_id(tag2)) == 0); - - cl_git_pass(git_tag_target((git_object **)&commit, tag2)); - cl_assert(commit != NULL); - - cl_assert(git_oid_cmp(&id_commit, git_commit_id(commit)) == 0); - - git_tag_free(tag1); - git_tag_free(tag2); - git_commit_free(commit); -} - -void test_object_tag_read__parse_without_tagger(void) -{ - // read and parse a tag without a tagger field - git_repository *bad_tag_repo; - git_tag *bad_tag; - git_commit *commit; - git_oid id, id_commit; - - // TODO: This is a little messy - cl_git_pass(git_repository_open(&bad_tag_repo, cl_fixture("bad_tag.git"))); - - git_oid_fromstr(&id, bad_tag_id); - git_oid_fromstr(&id_commit, badly_tagged_commit); - - cl_git_pass(git_tag_lookup(&bad_tag, bad_tag_repo, &id)); - cl_assert(bad_tag != NULL); - - cl_assert_equal_s(git_tag_name(bad_tag), "e90810b"); - cl_assert(git_oid_cmp(&id, git_tag_id(bad_tag)) == 0); - cl_assert(bad_tag->tagger == NULL); - - cl_git_pass(git_tag_target((git_object **)&commit, bad_tag)); - cl_assert(commit != NULL); - - cl_assert(git_oid_cmp(&id_commit, git_commit_id(commit)) == 0); - - - git_tag_free(bad_tag); - git_commit_free(commit); - git_repository_free(bad_tag_repo); -} - -void test_object_tag_read__parse_without_message(void) -{ - // read and parse a tag without a message field - git_repository *short_tag_repo; - git_tag *short_tag; - git_commit *commit; - git_oid id, id_commit; - - // TODO: This is a little messy - cl_git_pass(git_repository_open(&short_tag_repo, cl_fixture("short_tag.git"))); - - git_oid_fromstr(&id, short_tag_id); - git_oid_fromstr(&id_commit, short_tagged_commit); - - cl_git_pass(git_tag_lookup(&short_tag, short_tag_repo, &id)); - cl_assert(short_tag != NULL); - - cl_assert_equal_s(git_tag_name(short_tag), "no_description"); - cl_assert(git_oid_cmp(&id, git_tag_id(short_tag)) == 0); - cl_assert(short_tag->message == NULL); - - cl_git_pass(git_tag_target((git_object **)&commit, short_tag)); - cl_assert(commit != NULL); - - cl_assert(git_oid_cmp(&id_commit, git_commit_id(commit)) == 0); - - git_tag_free(short_tag); - git_commit_free(commit); - git_repository_free(short_tag_repo); -} - -void test_object_tag_read__without_tagger_nor_message(void) -{ - git_tag *tag; - git_oid id; - git_repository *repo; - - cl_git_pass(git_repository_open(&repo, cl_fixture("testrepo.git"))); - - cl_git_pass(git_oid_fromstr(&id, taggerless)); - - cl_git_pass(git_tag_lookup(&tag, repo, &id)); - - cl_assert_equal_s(git_tag_name(tag), "taggerless"); - cl_assert(git_tag_target_type(tag) == GIT_OBJ_COMMIT); - - cl_assert(tag->message == NULL); - cl_assert(tag->tagger == NULL); - - git_tag_free(tag); - git_repository_free(repo); -} diff --git a/vendor/libgit2/tests/object/tag/write.c b/vendor/libgit2/tests/object/tag/write.c deleted file mode 100644 index 68e4b6c617..0000000000 --- a/vendor/libgit2/tests/object/tag/write.c +++ /dev/null @@ -1,260 +0,0 @@ -#include "clar_libgit2.h" - -static const char* tagger_name = "Vicent Marti"; -static const char* tagger_email = "vicent@github.com"; -static const char* tagger_message = "This is my tag.\n\nThere are many tags, but this one is mine\n"; - -static const char *tag2_id = "7b4384978d2493e851f9cca7858815fac9b10980"; -static const char *tagged_commit = "e90810b8df3e80c413d903f631643c716887138d"; - -static git_repository *g_repo; - -// Fixture setup and teardown -void test_object_tag_write__initialize(void) -{ - g_repo = cl_git_sandbox_init("testrepo"); -} - -void test_object_tag_write__cleanup(void) -{ - cl_git_sandbox_cleanup(); -} - -void test_object_tag_write__basic(void) -{ - // write a tag to the repository and read it again - git_tag *tag; - git_oid target_id, tag_id; - git_signature *tagger; - const git_signature *tagger1; - git_reference *ref_tag; - git_object *target; - - git_oid_fromstr(&target_id, tagged_commit); - cl_git_pass(git_object_lookup(&target, g_repo, &target_id, GIT_OBJ_COMMIT)); - - /* create signature */ - cl_git_pass(git_signature_new(&tagger, tagger_name, tagger_email, 123456789, 60)); - - cl_git_pass( - git_tag_create(&tag_id, g_repo, - "the-tag", target, tagger, tagger_message, 0) - ); - - git_object_free(target); - git_signature_free(tagger); - - cl_git_pass(git_tag_lookup(&tag, g_repo, &tag_id)); - cl_assert(git_oid_cmp(git_tag_target_id(tag), &target_id) == 0); - - /* Check attributes were set correctly */ - tagger1 = git_tag_tagger(tag); - cl_assert(tagger1 != NULL); - cl_assert_equal_s(tagger1->name, tagger_name); - cl_assert_equal_s(tagger1->email, tagger_email); - cl_assert(tagger1->when.time == 123456789); - cl_assert(tagger1->when.offset == 60); - - cl_assert_equal_s(git_tag_message(tag), tagger_message); - - cl_git_pass(git_reference_lookup(&ref_tag, g_repo, "refs/tags/the-tag")); - cl_assert(git_oid_cmp(git_reference_target(ref_tag), &tag_id) == 0); - cl_git_pass(git_reference_delete(ref_tag)); - git_reference_free(ref_tag); - - git_tag_free(tag); -} - -void test_object_tag_write__overwrite(void) -{ - // Attempt to write a tag bearing the same name than an already existing tag - git_oid target_id, tag_id; - git_signature *tagger; - git_object *target; - - git_oid_fromstr(&target_id, tagged_commit); - cl_git_pass(git_object_lookup(&target, g_repo, &target_id, GIT_OBJ_COMMIT)); - - /* create signature */ - cl_git_pass(git_signature_new(&tagger, tagger_name, tagger_email, 123456789, 60)); - - cl_assert_equal_i(GIT_EEXISTS, git_tag_create( - &tag_id, /* out id */ - g_repo, - "e90810b", - target, - tagger, - tagger_message, - 0)); - - git_object_free(target); - git_signature_free(tagger); -} - -void test_object_tag_write__replace(void) -{ - // Replace an already existing tag - git_oid target_id, tag_id, old_tag_id; - git_signature *tagger; - git_reference *ref_tag; - git_object *target; - - git_oid_fromstr(&target_id, tagged_commit); - cl_git_pass(git_object_lookup(&target, g_repo, &target_id, GIT_OBJ_COMMIT)); - - cl_git_pass(git_reference_lookup(&ref_tag, g_repo, "refs/tags/e90810b")); - git_oid_cpy(&old_tag_id, git_reference_target(ref_tag)); - git_reference_free(ref_tag); - - /* create signature */ - cl_git_pass(git_signature_new(&tagger, tagger_name, tagger_email, 123456789, 60)); - - cl_git_pass(git_tag_create( - &tag_id, /* out id */ - g_repo, - "e90810b", - target, - tagger, - tagger_message, - 1)); - - git_object_free(target); - git_signature_free(tagger); - - cl_git_pass(git_reference_lookup(&ref_tag, g_repo, "refs/tags/e90810b")); - cl_assert(git_oid_cmp(git_reference_target(ref_tag), &tag_id) == 0); - cl_assert(git_oid_cmp(git_reference_target(ref_tag), &old_tag_id) != 0); - - git_reference_free(ref_tag); -} - -void test_object_tag_write__lightweight(void) -{ - // write a lightweight tag to the repository and read it again - git_oid target_id, object_id; - git_reference *ref_tag; - git_object *target; - - git_oid_fromstr(&target_id, tagged_commit); - cl_git_pass(git_object_lookup(&target, g_repo, &target_id, GIT_OBJ_COMMIT)); - - cl_git_pass(git_tag_create_lightweight( - &object_id, - g_repo, - "light-tag", - target, - 0)); - - git_object_free(target); - - cl_assert(git_oid_cmp(&object_id, &target_id) == 0); - - cl_git_pass(git_reference_lookup(&ref_tag, g_repo, "refs/tags/light-tag")); - cl_assert(git_oid_cmp(git_reference_target(ref_tag), &target_id) == 0); - - cl_git_pass(git_tag_delete(g_repo, "light-tag")); - - git_reference_free(ref_tag); -} - -void test_object_tag_write__lightweight_over_existing(void) -{ - // Attempt to write a lightweight tag bearing the same name than an already existing tag - git_oid target_id, object_id, existing_object_id; - git_object *target; - - git_oid_fromstr(&target_id, tagged_commit); - cl_git_pass(git_object_lookup(&target, g_repo, &target_id, GIT_OBJ_COMMIT)); - - cl_assert_equal_i(GIT_EEXISTS, git_tag_create_lightweight( - &object_id, - g_repo, - "e90810b", - target, - 0)); - - git_oid_fromstr(&existing_object_id, tag2_id); - cl_assert(git_oid_cmp(&object_id, &existing_object_id) == 0); - - git_object_free(target); -} - -void test_object_tag_write__delete(void) -{ - // Delete an already existing tag - git_reference *ref_tag; - - cl_git_pass(git_tag_delete(g_repo, "e90810b")); - - cl_git_fail(git_reference_lookup(&ref_tag, g_repo, "refs/tags/e90810b")); - - git_reference_free(ref_tag); -} - -void test_object_tag_write__creating_with_an_invalid_name_returns_EINVALIDSPEC(void) -{ - git_oid target_id, tag_id; - git_signature *tagger; - git_object *target; - - git_oid_fromstr(&target_id, tagged_commit); - cl_git_pass(git_object_lookup(&target, g_repo, &target_id, GIT_OBJ_COMMIT)); - - cl_git_pass(git_signature_new(&tagger, tagger_name, tagger_email, 123456789, 60)); - - cl_assert_equal_i(GIT_EINVALIDSPEC, - git_tag_create(&tag_id, g_repo, - "Inv@{id", target, tagger, tagger_message, 0) - ); - - cl_assert_equal_i(GIT_EINVALIDSPEC, - git_tag_create_lightweight(&tag_id, g_repo, - "Inv@{id", target, 0) - ); - - git_object_free(target); - git_signature_free(tagger); -} - -void test_object_tag_write__deleting_with_an_invalid_name_returns_EINVALIDSPEC(void) -{ - cl_assert_equal_i(GIT_EINVALIDSPEC, git_tag_delete(g_repo, "Inv@{id")); -} - -void create_annotation(git_oid *tag_id, const char *name) -{ - git_object *target; - git_oid target_id; - git_signature *tagger; - - cl_git_pass(git_signature_new(&tagger, tagger_name, tagger_email, 123456789, 60)); - - git_oid_fromstr(&target_id, tagged_commit); - cl_git_pass(git_object_lookup(&target, g_repo, &target_id, GIT_OBJ_COMMIT)); - - cl_git_pass(git_tag_annotation_create(tag_id, g_repo, name, target, tagger, "boom!")); - git_object_free(target); - git_signature_free(tagger); -} - -void test_object_tag_write__creating_an_annotation_stores_the_new_object_in_the_odb(void) -{ - git_oid tag_id; - git_tag *tag; - - create_annotation(&tag_id, "new_tag"); - - cl_git_pass(git_tag_lookup(&tag, g_repo, &tag_id)); - cl_assert_equal_s("new_tag", git_tag_name(tag)); - - git_tag_free(tag); -} - -void test_object_tag_write__creating_an_annotation_does_not_create_a_reference(void) -{ - git_oid tag_id; - git_reference *tag_ref; - - create_annotation(&tag_id, "new_tag"); - cl_git_fail_with(git_reference_lookup(&tag_ref, g_repo, "refs/tags/new_tag"), GIT_ENOTFOUND); -} diff --git a/vendor/libgit2/tests/object/tree/attributes.c b/vendor/libgit2/tests/object/tree/attributes.c deleted file mode 100644 index 413514c48e..0000000000 --- a/vendor/libgit2/tests/object/tree/attributes.c +++ /dev/null @@ -1,116 +0,0 @@ -#include "clar_libgit2.h" -#include "tree.h" - -static git_repository *repo; - -static const char *blob_oid = "3d0970ec547fc41ef8a5882dde99c6adce65b021"; -static const char *tree_oid = "1b05fdaa881ee45b48cbaa5e9b037d667a47745e"; - -void test_object_tree_attributes__initialize(void) -{ - repo = cl_git_sandbox_init("deprecated-mode.git"); -} - -void test_object_tree_attributes__cleanup(void) -{ - cl_git_sandbox_cleanup(); -} - -void test_object_tree_attributes__ensure_correctness_of_attributes_on_insertion(void) -{ - git_treebuilder *builder; - git_oid oid; - - cl_git_pass(git_oid_fromstr(&oid, blob_oid)); - - cl_git_pass(git_treebuilder_new(&builder, repo, NULL)); - - cl_git_fail(git_treebuilder_insert(NULL, builder, "one.txt", &oid, (git_filemode_t)0777777)); - cl_git_fail(git_treebuilder_insert(NULL, builder, "one.txt", &oid, (git_filemode_t)0100666)); - cl_git_fail(git_treebuilder_insert(NULL, builder, "one.txt", &oid, (git_filemode_t)0000001)); - - git_treebuilder_free(builder); -} - -void test_object_tree_attributes__group_writable_tree_entries_created_with_an_antique_git_version_can_still_be_accessed(void) -{ - git_oid tid; - git_tree *tree; - const git_tree_entry *entry; - - - cl_git_pass(git_oid_fromstr(&tid, tree_oid)); - cl_git_pass(git_tree_lookup(&tree, repo, &tid)); - - entry = git_tree_entry_byname(tree, "old_mode.txt"); - cl_assert_equal_i( - GIT_FILEMODE_BLOB, - git_tree_entry_filemode(entry)); - - git_tree_free(tree); -} - -void test_object_tree_attributes__treebuilder_reject_invalid_filemode(void) -{ - git_treebuilder *builder; - git_oid bid; - const git_tree_entry *entry; - - cl_git_pass(git_oid_fromstr(&bid, blob_oid)); - cl_git_pass(git_treebuilder_new(&builder, repo, NULL)); - - cl_git_fail(git_treebuilder_insert( - &entry, - builder, - "normalized.txt", - &bid, - GIT_FILEMODE_BLOB_GROUP_WRITABLE)); - - git_treebuilder_free(builder); -} - -void test_object_tree_attributes__normalize_attributes_when_creating_a_tree_from_an_existing_one(void) -{ - git_treebuilder *builder; - git_oid tid, tid2; - git_tree *tree; - const git_tree_entry *entry; - - cl_git_pass(git_oid_fromstr(&tid, tree_oid)); - cl_git_pass(git_tree_lookup(&tree, repo, &tid)); - - cl_git_pass(git_treebuilder_new(&builder, repo, tree)); - - entry = git_treebuilder_get(builder, "old_mode.txt"); - cl_assert_equal_i( - GIT_FILEMODE_BLOB, - git_tree_entry_filemode(entry)); - - cl_git_pass(git_treebuilder_write(&tid2, builder)); - git_treebuilder_free(builder); - git_tree_free(tree); - - cl_git_pass(git_tree_lookup(&tree, repo, &tid2)); - entry = git_tree_entry_byname(tree, "old_mode.txt"); - cl_assert_equal_i( - GIT_FILEMODE_BLOB, - git_tree_entry_filemode(entry)); - - git_tree_free(tree); -} - -void test_object_tree_attributes__normalize_600(void) -{ - git_oid id; - git_tree *tree; - const git_tree_entry *entry; - - git_oid_fromstr(&id, "0810fb7818088ff5ac41ee49199b51473b1bd6c7"); - cl_git_pass(git_tree_lookup(&tree, repo, &id)); - - entry = git_tree_entry_byname(tree, "ListaTeste.xml"); - cl_assert_equal_i(git_tree_entry_filemode(entry), GIT_FILEMODE_BLOB); - cl_assert_equal_i(git_tree_entry_filemode_raw(entry), 0100600); - - git_tree_free(tree); -} diff --git a/vendor/libgit2/tests/object/tree/duplicateentries.c b/vendor/libgit2/tests/object/tree/duplicateentries.c deleted file mode 100644 index 35dd383ec1..0000000000 --- a/vendor/libgit2/tests/object/tree/duplicateentries.c +++ /dev/null @@ -1,157 +0,0 @@ -#include "clar_libgit2.h" -#include "tree.h" - -static git_repository *_repo; - -void test_object_tree_duplicateentries__initialize(void) { - _repo = cl_git_sandbox_init("testrepo"); -} - -void test_object_tree_duplicateentries__cleanup(void) { - cl_git_sandbox_cleanup(); -} - -/* - * $ git show --format=raw refs/heads/dir - * commit 144344043ba4d4a405da03de3844aa829ae8be0e - * tree d52a8fe84ceedf260afe4f0287bbfca04a117e83 - * parent cf80f8de9f1185bf3a05f993f6121880dd0cfbc9 - * author Ben Straub 1343755506 -0700 - * committer Ben Straub 1343755506 -0700 - * - * Change a file mode - * - * diff --git a/a/b.txt b/a/b.txt - * old mode 100644 - * new mode 100755 - * - * $ git ls-tree d52a8fe84ceedf260afe4f0287bbfca04a117e83 - * 100644 blob a8233120f6ad708f843d861ce2b7228ec4e3dec6 README - * 040000 tree 4e0883eeeeebc1fb1735161cea82f7cb5fab7e63 a - * 100644 blob 45b983be36b73c0788dc9cbcb76cbb80fc7bb057 branch_file.txt - * 100644 blob a71586c1dfe8a71c6cbf6c129f404c5642ff31bd new.txt - */ - -static void tree_checker( - git_oid *tid, - const char *expected_sha, - git_filemode_t expected_filemode) -{ - git_tree *tree; - const git_tree_entry *entry; - git_oid oid; - - cl_git_pass(git_tree_lookup(&tree, _repo, tid)); - cl_assert_equal_i(1, (int)git_tree_entrycount(tree)); - entry = git_tree_entry_byindex(tree, 0); - - cl_git_pass(git_oid_fromstr(&oid, expected_sha)); - - cl_assert_equal_i(0, git_oid_cmp(&oid, git_tree_entry_id(entry))); - cl_assert_equal_i(expected_filemode, git_tree_entry_filemode(entry)); - - git_tree_free(tree); -} - -static void tree_creator(git_oid *out, void (*fn)(git_treebuilder *)) -{ - git_treebuilder *builder; - - cl_git_pass(git_treebuilder_new(&builder, _repo, NULL)); - - fn(builder); - - cl_git_pass(git_treebuilder_write(out, builder)); - git_treebuilder_free(builder); -} - -static void two_blobs(git_treebuilder *bld) -{ - git_oid oid; - const git_tree_entry *entry; - - cl_git_pass(git_oid_fromstr(&oid, - "a8233120f6ad708f843d861ce2b7228ec4e3dec6")); /* blob oid (README) */ - - cl_git_pass(git_treebuilder_insert( - &entry, bld, "duplicate", &oid, - GIT_FILEMODE_BLOB)); - - cl_git_pass(git_oid_fromstr(&oid, - "a71586c1dfe8a71c6cbf6c129f404c5642ff31bd")); /* blob oid (new.txt) */ - - cl_git_pass(git_treebuilder_insert( - &entry, bld, "duplicate", &oid, - GIT_FILEMODE_BLOB)); -} - -static void one_blob_and_one_tree(git_treebuilder *bld) -{ - git_oid oid; - const git_tree_entry *entry; - - cl_git_pass(git_oid_fromstr(&oid, - "a8233120f6ad708f843d861ce2b7228ec4e3dec6")); /* blob oid (README) */ - - cl_git_pass(git_treebuilder_insert( - &entry, bld, "duplicate", &oid, - GIT_FILEMODE_BLOB)); - - cl_git_pass(git_oid_fromstr(&oid, - "4e0883eeeeebc1fb1735161cea82f7cb5fab7e63")); /* tree oid (a) */ - - cl_git_pass(git_treebuilder_insert( - &entry, bld, "duplicate", &oid, - GIT_FILEMODE_TREE)); -} - -void test_object_tree_duplicateentries__cannot_create_a_duplicate_entry_through_the_treebuilder(void) -{ - git_oid tid; - - tree_creator(&tid, two_blobs); - tree_checker(&tid, "a71586c1dfe8a71c6cbf6c129f404c5642ff31bd", GIT_FILEMODE_BLOB); - - tree_creator(&tid, one_blob_and_one_tree); - tree_checker(&tid, "4e0883eeeeebc1fb1735161cea82f7cb5fab7e63", GIT_FILEMODE_TREE); -} - -static void add_fake_conflicts(git_index *index) -{ - git_index_entry ancestor_entry, our_entry, their_entry; - - memset(&ancestor_entry, 0x0, sizeof(git_index_entry)); - memset(&our_entry, 0x0, sizeof(git_index_entry)); - memset(&their_entry, 0x0, sizeof(git_index_entry)); - - ancestor_entry.path = "duplicate"; - ancestor_entry.mode = GIT_FILEMODE_BLOB; - GIT_IDXENTRY_STAGE_SET(&ancestor_entry, 1); - git_oid_fromstr(&ancestor_entry.id, "a8233120f6ad708f843d861ce2b7228ec4e3dec6"); - - our_entry.path = "duplicate"; - our_entry.mode = GIT_FILEMODE_BLOB; - GIT_IDXENTRY_STAGE_SET(&our_entry, 2); - git_oid_fromstr(&our_entry.id, "45b983be36b73c0788dc9cbcb76cbb80fc7bb057"); - - their_entry.path = "duplicate"; - their_entry.mode = GIT_FILEMODE_BLOB; - GIT_IDXENTRY_STAGE_SET(&their_entry, 3); - git_oid_fromstr(&their_entry.id, "a71586c1dfe8a71c6cbf6c129f404c5642ff31bd"); - - cl_git_pass(git_index_conflict_add(index, &ancestor_entry, &our_entry, &their_entry)); -} - -void test_object_tree_duplicateentries__cannot_create_a_duplicate_entry_building_a_tree_from_a_index_with_conflicts(void) -{ - git_index *index; - git_oid tid; - - cl_git_pass(git_repository_index(&index, _repo)); - - add_fake_conflicts(index); - - cl_assert_equal_i(GIT_EUNMERGED, git_index_write_tree(&tid, index)); - - git_index_free(index); -} diff --git a/vendor/libgit2/tests/object/tree/frompath.c b/vendor/libgit2/tests/object/tree/frompath.c deleted file mode 100644 index 86ca47e94e..0000000000 --- a/vendor/libgit2/tests/object/tree/frompath.c +++ /dev/null @@ -1,68 +0,0 @@ -#include "clar_libgit2.h" - -static git_repository *repo; -static git_tree *tree; - -void test_object_tree_frompath__initialize(void) -{ - git_oid id; - const char *tree_with_subtrees_oid = "ae90f12eea699729ed24555e40b9fd669da12a12"; - - cl_git_pass(git_repository_open(&repo, cl_fixture("testrepo.git"))); - cl_assert(repo != NULL); - - cl_git_pass(git_oid_fromstr(&id, tree_with_subtrees_oid)); - cl_git_pass(git_tree_lookup(&tree, repo, &id)); - cl_assert(tree != NULL); -} - -void test_object_tree_frompath__cleanup(void) -{ - git_tree_free(tree); - tree = NULL; - - git_repository_free(repo); - repo = NULL; -} - -static void assert_tree_from_path( - git_tree *root, - const char *path, - const char *expected_entry_name) -{ - git_tree_entry *entry; - - cl_git_pass(git_tree_entry_bypath(&entry, root, path)); - cl_assert_equal_s(git_tree_entry_name(entry), expected_entry_name); - git_tree_entry_free(entry); -} - -void test_object_tree_frompath__retrieve_tree_from_path_to_treeentry(void) -{ - git_tree_entry *e; - - assert_tree_from_path(tree, "README", "README"); - assert_tree_from_path(tree, "ab/de/fgh/1.txt", "1.txt"); - assert_tree_from_path(tree, "ab/de/fgh", "fgh"); - assert_tree_from_path(tree, "ab/de/fgh/", "fgh"); - assert_tree_from_path(tree, "ab/de", "de"); - assert_tree_from_path(tree, "ab/", "ab"); - assert_tree_from_path(tree, "ab/de/", "de"); - - cl_assert_equal_i(GIT_ENOTFOUND, git_tree_entry_bypath(&e, tree, "i-do-not-exist.txt")); - cl_assert_equal_i(GIT_ENOTFOUND, git_tree_entry_bypath(&e, tree, "README/")); - cl_assert_equal_i(GIT_ENOTFOUND, git_tree_entry_bypath(&e, tree, "ab/de/fgh/i-do-not-exist.txt")); - cl_assert_equal_i(GIT_ENOTFOUND, git_tree_entry_bypath(&e, tree, "nope/de/fgh/1.txt")); - cl_assert_equal_i(GIT_ENOTFOUND, git_tree_entry_bypath(&e, tree, "ab/me-neither/fgh/2.txt")); - cl_assert_equal_i(GIT_ENOTFOUND, git_tree_entry_bypath(&e, tree, "ab/me-neither/fgh/2.txt/")); -} - -void test_object_tree_frompath__fail_when_processing_an_invalid_path(void) -{ - git_tree_entry *e; - - cl_must_fail(git_tree_entry_bypath(&e, tree, "/")); - cl_must_fail(git_tree_entry_bypath(&e, tree, "/ab")); - cl_must_fail(git_tree_entry_bypath(&e, tree, "/ab/de")); - cl_must_fail(git_tree_entry_bypath(&e, tree, "ab//de")); -} diff --git a/vendor/libgit2/tests/object/tree/read.c b/vendor/libgit2/tests/object/tree/read.c deleted file mode 100644 index 59a809bf19..0000000000 --- a/vendor/libgit2/tests/object/tree/read.c +++ /dev/null @@ -1,75 +0,0 @@ -#include "clar_libgit2.h" - -#include "tree.h" - -static const char *tree_oid = "1810dff58d8a660512d4832e740f692884338ccd"; - -static git_repository *g_repo; - -// Fixture setup and teardown -void test_object_tree_read__initialize(void) -{ - g_repo = cl_git_sandbox_init("testrepo"); -} - -void test_object_tree_read__cleanup(void) -{ - cl_git_sandbox_cleanup(); -} - - - -void test_object_tree_read__loaded(void) -{ - // acces randomly the entries on a loaded tree - git_oid id; - git_tree *tree; - - git_oid_fromstr(&id, tree_oid); - - cl_git_pass(git_tree_lookup(&tree, g_repo, &id)); - - cl_assert(git_tree_entry_byname(tree, "README") != NULL); - cl_assert(git_tree_entry_byname(tree, "NOTEXISTS") == NULL); - cl_assert(git_tree_entry_byname(tree, "") == NULL); - cl_assert(git_tree_entry_byindex(tree, 0) != NULL); - cl_assert(git_tree_entry_byindex(tree, 2) != NULL); - cl_assert(git_tree_entry_byindex(tree, 3) == NULL); - cl_assert(git_tree_entry_byindex(tree, (unsigned int)-1) == NULL); - - git_tree_free(tree); -} - -void test_object_tree_read__two(void) -{ - // read a tree from the repository - git_oid id; - git_tree *tree; - const git_tree_entry *entry; - git_object *obj; - - git_oid_fromstr(&id, tree_oid); - - cl_git_pass(git_tree_lookup(&tree, g_repo, &id)); - - cl_assert(git_tree_entrycount(tree) == 3); - - /* GH-86: git_object_lookup() should also check the type if the object comes from the cache */ - cl_assert(git_object_lookup(&obj, g_repo, &id, GIT_OBJ_TREE) == 0); - cl_assert(obj != NULL); - git_object_free(obj); - obj = NULL; - cl_git_fail(git_object_lookup(&obj, g_repo, &id, GIT_OBJ_BLOB)); - cl_assert(obj == NULL); - - entry = git_tree_entry_byname(tree, "README"); - cl_assert(entry != NULL); - - cl_assert_equal_s(git_tree_entry_name(entry), "README"); - - cl_git_pass(git_tree_entry_to_object(&obj, g_repo, entry)); - cl_assert(obj != NULL); - - git_object_free(obj); - git_tree_free(tree); -} diff --git a/vendor/libgit2/tests/object/tree/walk.c b/vendor/libgit2/tests/object/tree/walk.c deleted file mode 100644 index f8005e5795..0000000000 --- a/vendor/libgit2/tests/object/tree/walk.c +++ /dev/null @@ -1,177 +0,0 @@ -#include "clar_libgit2.h" -#include "tree.h" - -static const char *tree_oid = "1810dff58d8a660512d4832e740f692884338ccd"; -static git_repository *g_repo; - -void test_object_tree_walk__initialize(void) -{ - g_repo = cl_git_sandbox_init("testrepo"); -} - -void test_object_tree_walk__cleanup(void) -{ - cl_git_sandbox_cleanup(); -} - -static int treewalk_count_cb( - const char *root, const git_tree_entry *entry, void *payload) -{ - int *count = payload; - - GIT_UNUSED(root); - GIT_UNUSED(entry); - - (*count) += 1; - - return 0; -} - -void test_object_tree_walk__0(void) -{ - git_oid id; - git_tree *tree; - int ct; - - git_oid_fromstr(&id, tree_oid); - - cl_git_pass(git_tree_lookup(&tree, g_repo, &id)); - - ct = 0; - cl_git_pass(git_tree_walk(tree, GIT_TREEWALK_PRE, treewalk_count_cb, &ct)); - cl_assert_equal_i(3, ct); - - ct = 0; - cl_git_pass(git_tree_walk(tree, GIT_TREEWALK_POST, treewalk_count_cb, &ct)); - cl_assert_equal_i(3, ct); - - git_tree_free(tree); -} - - -static int treewalk_stop_cb( - const char *root, const git_tree_entry *entry, void *payload) -{ - int *count = payload; - - GIT_UNUSED(root); - GIT_UNUSED(entry); - - (*count) += 1; - - return (*count == 2) ? -123 : 0; -} - -static int treewalk_stop_immediately_cb( - const char *root, const git_tree_entry *entry, void *payload) -{ - GIT_UNUSED(root); - GIT_UNUSED(entry); - GIT_UNUSED(payload); - return -100; -} - -void test_object_tree_walk__1(void) -{ - git_oid id; - git_tree *tree; - int ct; - - git_oid_fromstr(&id, tree_oid); - - cl_git_pass(git_tree_lookup(&tree, g_repo, &id)); - - ct = 0; - cl_assert_equal_i( - -123, git_tree_walk(tree, GIT_TREEWALK_PRE, treewalk_stop_cb, &ct)); - cl_assert_equal_i(2, ct); - - ct = 0; - cl_assert_equal_i( - -123, git_tree_walk(tree, GIT_TREEWALK_POST, treewalk_stop_cb, &ct)); - cl_assert_equal_i(2, ct); - - cl_assert_equal_i( - -100, git_tree_walk( - tree, GIT_TREEWALK_PRE, treewalk_stop_immediately_cb, NULL)); - - cl_assert_equal_i( - -100, git_tree_walk( - tree, GIT_TREEWALK_POST, treewalk_stop_immediately_cb, NULL)); - - git_tree_free(tree); -} - - -struct treewalk_skip_data { - int files; - int dirs; - const char *skip; - const char *stop; -}; - -static int treewalk_skip_de_cb( - const char *root, const git_tree_entry *entry, void *payload) -{ - struct treewalk_skip_data *data = payload; - const char *name = git_tree_entry_name(entry); - - GIT_UNUSED(root); - - if (git_tree_entry_type(entry) == GIT_OBJ_TREE) - data->dirs++; - else - data->files++; - - if (data->skip && !strcmp(name, data->skip)) - return 1; - else if (data->stop && !strcmp(name, data->stop)) - return -1; - else - return 0; -} - -void test_object_tree_walk__2(void) -{ - git_oid id; - git_tree *tree; - struct treewalk_skip_data data; - - /* look up a deep tree */ - git_oid_fromstr(&id, "ae90f12eea699729ed24555e40b9fd669da12a12"); - cl_git_pass(git_tree_lookup(&tree, g_repo, &id)); - - memset(&data, 0, sizeof(data)); - data.skip = "de"; - - cl_assert_equal_i(0, git_tree_walk( - tree, GIT_TREEWALK_PRE, treewalk_skip_de_cb, &data)); - cl_assert_equal_i(5, data.files); - cl_assert_equal_i(3, data.dirs); - - memset(&data, 0, sizeof(data)); - data.stop = "3.txt"; - - cl_assert_equal_i(-1, git_tree_walk( - tree, GIT_TREEWALK_PRE, treewalk_skip_de_cb, &data)); - cl_assert_equal_i(3, data.files); - cl_assert_equal_i(2, data.dirs); - - memset(&data, 0, sizeof(data)); - data.skip = "new.txt"; - - cl_assert_equal_i(0, git_tree_walk( - tree, GIT_TREEWALK_PRE, treewalk_skip_de_cb, &data)); - cl_assert_equal_i(7, data.files); - cl_assert_equal_i(4, data.dirs); - - memset(&data, 0, sizeof(data)); - data.stop = "new.txt"; - - cl_assert_equal_i(-1, git_tree_walk( - tree, GIT_TREEWALK_PRE, treewalk_skip_de_cb, &data)); - cl_assert_equal_i(7, data.files); - cl_assert_equal_i(4, data.dirs); - - git_tree_free(tree); -} diff --git a/vendor/libgit2/tests/object/tree/write.c b/vendor/libgit2/tests/object/tree/write.c deleted file mode 100644 index 5433e5f03b..0000000000 --- a/vendor/libgit2/tests/object/tree/write.c +++ /dev/null @@ -1,442 +0,0 @@ -#include "clar_libgit2.h" - -#include "tree.h" - -static const char *blob_oid = "fa49b077972391ad58037050f2a75f74e3671e92"; -static const char *first_tree = "181037049a54a1eb5fab404658a3a250b44335d7"; -static const char *second_tree = "f60079018b664e4e79329a7ef9559c8d9e0378d1"; -static const char *third_tree = "eb86d8b81d6adbd5290a935d6c9976882de98488"; - -static git_repository *g_repo; - -/* Fixture setup and teardown */ -void test_object_tree_write__initialize(void) -{ - g_repo = cl_git_sandbox_init("testrepo"); -} - -void test_object_tree_write__cleanup(void) -{ - cl_git_sandbox_cleanup(); -} - -void test_object_tree_write__from_memory(void) -{ - /* write a tree from a memory */ - git_treebuilder *builder; - git_tree *tree; - git_oid id, bid, rid, id2; - - git_oid_fromstr(&id, first_tree); - git_oid_fromstr(&id2, second_tree); - git_oid_fromstr(&bid, blob_oid); - - /* create a second tree from first tree using `git_treebuilder_insert` - * on REPOSITORY_FOLDER. - */ - cl_git_pass(git_tree_lookup(&tree, g_repo, &id)); - cl_git_pass(git_treebuilder_new(&builder, g_repo, tree)); - - cl_git_fail(git_treebuilder_insert(NULL, builder, "", - &bid, GIT_FILEMODE_BLOB)); - cl_git_fail(git_treebuilder_insert(NULL, builder, "/", - &bid, GIT_FILEMODE_BLOB)); - cl_git_fail(git_treebuilder_insert(NULL, builder, ".git", - &bid, GIT_FILEMODE_BLOB)); - cl_git_fail(git_treebuilder_insert(NULL, builder, "..", - &bid, GIT_FILEMODE_BLOB)); - cl_git_fail(git_treebuilder_insert(NULL, builder, ".", - &bid, GIT_FILEMODE_BLOB)); - cl_git_fail(git_treebuilder_insert(NULL, builder, "folder/new.txt", - &bid, GIT_FILEMODE_BLOB)); - - cl_git_pass(git_treebuilder_insert( - NULL, builder, "new.txt", &bid, GIT_FILEMODE_BLOB)); - - cl_git_pass(git_treebuilder_write(&rid, builder)); - - cl_assert(git_oid_cmp(&rid, &id2) == 0); - - git_treebuilder_free(builder); - git_tree_free(tree); -} - -void test_object_tree_write__subtree(void) -{ - /* write a hierarchical tree from a memory */ - git_treebuilder *builder; - git_tree *tree; - git_oid id, bid, subtree_id, id2, id3; - git_oid id_hiearar; - - git_oid_fromstr(&id, first_tree); - git_oid_fromstr(&id2, second_tree); - git_oid_fromstr(&id3, third_tree); - git_oid_fromstr(&bid, blob_oid); - - /* create subtree */ - cl_git_pass(git_treebuilder_new(&builder, g_repo, NULL)); - cl_git_pass(git_treebuilder_insert( - NULL, builder, "new.txt", &bid, GIT_FILEMODE_BLOB)); /* -V536 */ - cl_git_pass(git_treebuilder_write(&subtree_id, builder)); - git_treebuilder_free(builder); - - /* create parent tree */ - cl_git_pass(git_tree_lookup(&tree, g_repo, &id)); - cl_git_pass(git_treebuilder_new(&builder, g_repo, tree)); - cl_git_pass(git_treebuilder_insert( - NULL, builder, "new", &subtree_id, GIT_FILEMODE_TREE)); /* -V536 */ - cl_git_pass(git_treebuilder_write(&id_hiearar, builder)); - git_treebuilder_free(builder); - git_tree_free(tree); - - cl_assert(git_oid_cmp(&id_hiearar, &id3) == 0); - - /* check data is correct */ - cl_git_pass(git_tree_lookup(&tree, g_repo, &id_hiearar)); - cl_assert(2 == git_tree_entrycount(tree)); - git_tree_free(tree); -} - -/* - * And the Lord said: Is this tree properly sorted? - */ -void test_object_tree_write__sorted_subtrees(void) -{ - git_treebuilder *builder; - git_tree *tree; - unsigned int i; - int position_c = -1, position_cake = -1, position_config = -1; - - struct { - unsigned int attr; - const char *filename; - } entries[] = { - { GIT_FILEMODE_BLOB, ".gitattributes" }, - { GIT_FILEMODE_BLOB, ".gitignore" }, - { GIT_FILEMODE_BLOB, ".htaccess" }, - { GIT_FILEMODE_BLOB, "Capfile" }, - { GIT_FILEMODE_BLOB, "Makefile"}, - { GIT_FILEMODE_BLOB, "README"}, - { GIT_FILEMODE_TREE, "app"}, - { GIT_FILEMODE_TREE, "cake"}, - { GIT_FILEMODE_TREE, "config"}, - { GIT_FILEMODE_BLOB, "c"}, - { GIT_FILEMODE_BLOB, "git_test.txt"}, - { GIT_FILEMODE_BLOB, "htaccess.htaccess"}, - { GIT_FILEMODE_BLOB, "index.php"}, - { GIT_FILEMODE_TREE, "plugins"}, - { GIT_FILEMODE_TREE, "schemas"}, - { GIT_FILEMODE_TREE, "ssl-certs"}, - { GIT_FILEMODE_TREE, "vendors"} - }; - - git_oid blank_oid, tree_oid; - - memset(&blank_oid, 0x0, sizeof(blank_oid)); - - cl_git_pass(git_treebuilder_new(&builder, g_repo, NULL)); - - for (i = 0; i < ARRAY_SIZE(entries); ++i) { - cl_git_pass(git_treebuilder_insert(NULL, - builder, entries[i].filename, &blank_oid, entries[i].attr)); - } - - cl_git_pass(git_treebuilder_write(&tree_oid, builder)); - - cl_git_pass(git_tree_lookup(&tree, g_repo, &tree_oid)); - for (i = 0; i < git_tree_entrycount(tree); i++) { - const git_tree_entry *entry = git_tree_entry_byindex(tree, i); - - if (strcmp(entry->filename, "c") == 0) - position_c = i; - - if (strcmp(entry->filename, "cake") == 0) - position_cake = i; - - if (strcmp(entry->filename, "config") == 0) - position_config = i; - } - - git_tree_free(tree); - - cl_assert(position_c != -1); - cl_assert(position_cake != -1); - cl_assert(position_config != -1); - - cl_assert(position_c < position_cake); - cl_assert(position_cake < position_config); - - git_treebuilder_free(builder); -} - -static struct { - unsigned int attr; - const char *filename; -} _entries[] = { - { GIT_FILEMODE_BLOB, "aardvark" }, - { GIT_FILEMODE_BLOB, ".first" }, - { GIT_FILEMODE_BLOB, "apple" }, - { GIT_FILEMODE_BLOB, "last"}, - { GIT_FILEMODE_BLOB, "apple_after"}, - { GIT_FILEMODE_BLOB, "after_aardvark"}, - { 0, NULL }, -}; - -void test_object_tree_write__removing_and_re_adding_in_treebuilder(void) -{ - git_treebuilder *builder; - int i, aardvark_i, apple_i, apple_after_i, apple_extra_i, last_i; - git_oid blank_oid, tree_oid; - git_tree *tree; - - memset(&blank_oid, 0x0, sizeof(blank_oid)); - - cl_git_pass(git_treebuilder_new(&builder, g_repo, NULL)); - - cl_assert_equal_i(0, (int)git_treebuilder_entrycount(builder)); - - for (i = 0; _entries[i].filename; ++i) - cl_git_pass(git_treebuilder_insert(NULL, - builder, _entries[i].filename, &blank_oid, _entries[i].attr)); - - cl_assert_equal_i(6, (int)git_treebuilder_entrycount(builder)); - - cl_git_pass(git_treebuilder_remove(builder, "apple")); - cl_assert_equal_i(5, (int)git_treebuilder_entrycount(builder)); - - cl_git_pass(git_treebuilder_remove(builder, "apple_after")); - cl_assert_equal_i(4, (int)git_treebuilder_entrycount(builder)); - - cl_git_pass(git_treebuilder_insert( - NULL, builder, "before_last", &blank_oid, GIT_FILEMODE_BLOB)); - cl_assert_equal_i(5, (int)git_treebuilder_entrycount(builder)); - - /* reinsert apple_after */ - cl_git_pass(git_treebuilder_insert( - NULL, builder, "apple_after", &blank_oid, GIT_FILEMODE_BLOB)); - cl_assert_equal_i(6, (int)git_treebuilder_entrycount(builder)); - - cl_git_pass(git_treebuilder_remove(builder, "last")); - cl_assert_equal_i(5, (int)git_treebuilder_entrycount(builder)); - - /* reinsert last */ - cl_git_pass(git_treebuilder_insert( - NULL, builder, "last", &blank_oid, GIT_FILEMODE_BLOB)); - cl_assert_equal_i(6, (int)git_treebuilder_entrycount(builder)); - - cl_git_pass(git_treebuilder_insert( - NULL, builder, "apple_extra", &blank_oid, GIT_FILEMODE_BLOB)); - cl_assert_equal_i(7, (int)git_treebuilder_entrycount(builder)); - - cl_git_pass(git_treebuilder_write(&tree_oid, builder)); - - git_treebuilder_free(builder); - - cl_git_pass(git_tree_lookup(&tree, g_repo, &tree_oid)); - - cl_assert_equal_i(7, (int)git_tree_entrycount(tree)); - - cl_assert(git_tree_entry_byname(tree, ".first") != NULL); - cl_assert(git_tree_entry_byname(tree, "apple") == NULL); - cl_assert(git_tree_entry_byname(tree, "apple_after") != NULL); - cl_assert(git_tree_entry_byname(tree, "apple_extra") != NULL); - cl_assert(git_tree_entry_byname(tree, "last") != NULL); - - aardvark_i = apple_i = apple_after_i = apple_extra_i = last_i = -1; - - for (i = 0; i < 7; ++i) { - const git_tree_entry *entry = git_tree_entry_byindex(tree, i); - - if (!strcmp(entry->filename, "aardvark")) - aardvark_i = i; - else if (!strcmp(entry->filename, "apple")) - apple_i = i; - else if (!strcmp(entry->filename, "apple_after")) - apple_after_i = i; - else if (!strcmp(entry->filename, "apple_extra")) - apple_extra_i = i; - else if (!strcmp(entry->filename, "last")) - last_i = i; - } - - cl_assert_equal_i(-1, apple_i); - cl_assert_equal_i(6, last_i); - cl_assert(aardvark_i < apple_after_i); - cl_assert(apple_after_i < apple_extra_i); - - git_tree_free(tree); -} - -static int treebuilder_filter_prefixed( - const git_tree_entry *entry, void *payload) -{ - return !git__prefixcmp(git_tree_entry_name(entry), payload); -} - -void test_object_tree_write__filtering(void) -{ - git_treebuilder *builder; - int i; - git_oid blank_oid, tree_oid; - git_tree *tree; - - memset(&blank_oid, 0x0, sizeof(blank_oid)); - - cl_git_pass(git_treebuilder_new(&builder, g_repo, NULL)); - - for (i = 0; _entries[i].filename; ++i) - cl_git_pass(git_treebuilder_insert(NULL, - builder, _entries[i].filename, &blank_oid, _entries[i].attr)); - - cl_assert_equal_i(6, (int)git_treebuilder_entrycount(builder)); - - cl_assert(git_treebuilder_get(builder, "apple") != NULL); - cl_assert(git_treebuilder_get(builder, "aardvark") != NULL); - cl_assert(git_treebuilder_get(builder, "last") != NULL); - - git_treebuilder_filter(builder, treebuilder_filter_prefixed, "apple"); - - cl_assert_equal_i(4, (int)git_treebuilder_entrycount(builder)); - - cl_assert(git_treebuilder_get(builder, "apple") == NULL); - cl_assert(git_treebuilder_get(builder, "aardvark") != NULL); - cl_assert(git_treebuilder_get(builder, "last") != NULL); - - git_treebuilder_filter(builder, treebuilder_filter_prefixed, "a"); - - cl_assert_equal_i(2, (int)git_treebuilder_entrycount(builder)); - - cl_assert(git_treebuilder_get(builder, "aardvark") == NULL); - cl_assert(git_treebuilder_get(builder, "last") != NULL); - - cl_git_pass(git_treebuilder_write(&tree_oid, builder)); - - git_treebuilder_free(builder); - - cl_git_pass(git_tree_lookup(&tree, g_repo, &tree_oid)); - - cl_assert_equal_i(2, (int)git_tree_entrycount(tree)); - - git_tree_free(tree); -} - -void test_object_tree_write__cruel_paths(void) -{ - static const char *the_paths[] = { - "C:\\", - " : * ? \" \n < > |", - "a\\b", - "\\\\b\a", - ":\\", - "COM1", - "foo.aux", - REP1024("1234"), /* 4096 char string */ - REP1024("12345678"), /* 8192 char string */ - "\xC5\xAA\x6E\xC4\xAD\x63\xC5\x8D\x64\x65\xCC\xBD", /* ĹŞnÄ­cĹŤdeĚ˝ */ - NULL - }; - git_treebuilder *builder; - git_tree *tree; - git_oid id, bid, subid; - const char **scan; - int count = 0, i, j; - git_tree_entry *te; - - git_oid_fromstr(&bid, blob_oid); - - /* create tree */ - cl_git_pass(git_treebuilder_new(&builder, g_repo, NULL)); - for (scan = the_paths; *scan; ++scan) { - cl_git_pass(git_treebuilder_insert( - NULL, builder, *scan, &bid, GIT_FILEMODE_BLOB)); - count++; - } - cl_git_pass(git_treebuilder_write(&id, builder)); - git_treebuilder_free(builder); - - /* check data is correct */ - cl_git_pass(git_tree_lookup(&tree, g_repo, &id)); - - cl_assert_equal_i(count, git_tree_entrycount(tree)); - - for (scan = the_paths; *scan; ++scan) { - const git_tree_entry *cte = git_tree_entry_byname(tree, *scan); - cl_assert(cte != NULL); - cl_assert_equal_s(*scan, git_tree_entry_name(cte)); - } - for (scan = the_paths; *scan; ++scan) { - cl_git_pass(git_tree_entry_bypath(&te, tree, *scan)); - cl_assert_equal_s(*scan, git_tree_entry_name(te)); - git_tree_entry_free(te); - } - - git_tree_free(tree); - - /* let's try longer paths */ - cl_git_pass(git_treebuilder_new(&builder, g_repo, NULL)); - for (scan = the_paths; *scan; ++scan) { - cl_git_pass(git_treebuilder_insert( - NULL, builder, *scan, &id, GIT_FILEMODE_TREE)); - } - cl_git_pass(git_treebuilder_write(&subid, builder)); - git_treebuilder_free(builder); - - /* check data is correct */ - cl_git_pass(git_tree_lookup(&tree, g_repo, &subid)); - - cl_assert_equal_i(count, git_tree_entrycount(tree)); - - for (i = 0; i < count; ++i) { - for (j = 0; j < count; ++j) { - git_buf b = GIT_BUF_INIT; - cl_git_pass(git_buf_joinpath(&b, the_paths[i], the_paths[j])); - cl_git_pass(git_tree_entry_bypath(&te, tree, b.ptr)); - cl_assert_equal_s(the_paths[j], git_tree_entry_name(te)); - git_tree_entry_free(te); - git_buf_free(&b); - } - } - - git_tree_free(tree); -} - -void test_object_tree_write__protect_filesystems(void) -{ - git_treebuilder *builder; - git_oid bid; - - /* Ensure that (by default) we can write objects with funny names on - * platforms that are not affected. - */ - cl_git_pass(git_treebuilder_new(&builder, g_repo, NULL)); - -#ifndef GIT_WIN32 - cl_git_pass(git_treebuilder_insert(NULL, builder, ".git.", &bid, GIT_FILEMODE_BLOB)); - cl_git_pass(git_treebuilder_insert(NULL, builder, "git~1", &bid, GIT_FILEMODE_BLOB)); -#endif - -#ifndef __APPLE__ - cl_git_pass(git_treebuilder_insert(NULL, builder, ".git\xef\xbb\xbf", &bid, GIT_FILEMODE_BLOB)); - cl_git_pass(git_treebuilder_insert(NULL, builder, ".git\xe2\x80\xad", &bid, GIT_FILEMODE_BLOB)); -#endif - - git_treebuilder_free(builder); - - /* Now turn on core.protectHFS and core.protectNTFS and validate that these - * paths are rejected. - */ - - cl_repo_set_bool(g_repo, "core.protectHFS", true); - cl_repo_set_bool(g_repo, "core.protectNTFS", true); - - cl_git_pass(git_treebuilder_new(&builder, g_repo, NULL)); - - cl_git_fail(git_treebuilder_insert(NULL, builder, ".git.", &bid, GIT_FILEMODE_BLOB)); - cl_git_fail(git_treebuilder_insert(NULL, builder, "git~1", &bid, GIT_FILEMODE_BLOB)); - - cl_git_fail(git_treebuilder_insert(NULL, builder, ".git\xef\xbb\xbf", &bid, GIT_FILEMODE_BLOB)); - cl_git_fail(git_treebuilder_insert(NULL, builder, ".git\xe2\x80\xad", &bid, GIT_FILEMODE_BLOB)); - - git_treebuilder_free(builder); -} diff --git a/vendor/libgit2/tests/odb/alternates.c b/vendor/libgit2/tests/odb/alternates.c deleted file mode 100644 index c75f6feaae..0000000000 --- a/vendor/libgit2/tests/odb/alternates.c +++ /dev/null @@ -1,80 +0,0 @@ -#include "clar_libgit2.h" -#include "odb.h" -#include "filebuf.h" - -static git_buf destpath, filepath; -static const char *paths[] = { - "A.git", "B.git", "C.git", "D.git", "E.git", "F.git", "G.git" -}; -static git_filebuf file; -static git_repository *repo; - -void test_odb_alternates__cleanup(void) -{ - size_t i; - - git_buf_free(&destpath); - git_buf_free(&filepath); - - for (i = 0; i < ARRAY_SIZE(paths); i++) - cl_fixture_cleanup(paths[i]); -} - -static void init_linked_repo(const char *path, const char *alternate) -{ - git_buf_clear(&destpath); - git_buf_clear(&filepath); - - cl_git_pass(git_repository_init(&repo, path, 1)); - cl_git_pass(git_path_prettify(&destpath, alternate, NULL)); - cl_git_pass(git_buf_joinpath(&destpath, destpath.ptr, "objects")); - cl_git_pass(git_buf_joinpath(&filepath, git_repository_path(repo), "objects/info")); - cl_git_pass(git_futils_mkdir(filepath.ptr, NULL, 0755, GIT_MKDIR_PATH)); - cl_git_pass(git_buf_joinpath(&filepath, filepath.ptr , "alternates")); - - cl_git_pass(git_filebuf_open(&file, git_buf_cstr(&filepath), 0, 0666)); - git_filebuf_printf(&file, "%s\n", git_buf_cstr(&destpath)); - cl_git_pass(git_filebuf_commit(&file)); - - git_repository_free(repo); -} - -void test_odb_alternates__chained(void) -{ - git_commit *commit; - git_oid oid; - - /* Set the alternate A -> testrepo.git */ - init_linked_repo(paths[0], cl_fixture("testrepo.git")); - - /* Set the alternate B -> A */ - init_linked_repo(paths[1], paths[0]); - - /* Now load B and see if we can find an object from testrepo.git */ - cl_git_pass(git_repository_open(&repo, paths[1])); - git_oid_fromstr(&oid, "a65fedf39aefe402d3bb6e24df4d4f5fe4547750"); - cl_git_pass(git_commit_lookup(&commit, repo, &oid)); - git_commit_free(commit); - git_repository_free(repo); -} - -void test_odb_alternates__long_chain(void) -{ - git_commit *commit; - git_oid oid; - size_t i; - - /* Set the alternate A -> testrepo.git */ - init_linked_repo(paths[0], cl_fixture("testrepo.git")); - - /* Set up the five-element chain */ - for (i = 1; i < ARRAY_SIZE(paths); i++) { - init_linked_repo(paths[i], paths[i-1]); - } - - /* Now load the last one and see if we can find an object from testrepo.git */ - cl_git_pass(git_repository_open(&repo, paths[ARRAY_SIZE(paths)-1])); - git_oid_fromstr(&oid, "a65fedf39aefe402d3bb6e24df4d4f5fe4547750"); - cl_git_fail(git_commit_lookup(&commit, repo, &oid)); - git_repository_free(repo); -} diff --git a/vendor/libgit2/tests/odb/backend/nobackend.c b/vendor/libgit2/tests/odb/backend/nobackend.c deleted file mode 100644 index 783641e8f0..0000000000 --- a/vendor/libgit2/tests/odb/backend/nobackend.c +++ /dev/null @@ -1,46 +0,0 @@ -#include "clar_libgit2.h" -#include "repository.h" -#include "git2/sys/repository.h" - -static git_repository *_repo; - -void test_odb_backend_nobackend__initialize(void) -{ - git_config *config; - git_odb *odb; - git_refdb *refdb; - - cl_git_pass(git_repository_new(&_repo)); - cl_git_pass(git_config_new(&config)); - cl_git_pass(git_odb_new(&odb)); - cl_git_pass(git_refdb_new(&refdb, _repo)); - - git_repository_set_config(_repo, config); - git_repository_set_odb(_repo, odb); - git_repository_set_refdb(_repo, refdb); - - /* The set increases the refcount and we don't want them anymore */ - git_config_free(config); - git_odb_free(odb); - git_refdb_free(refdb); -} - -void test_odb_backend_nobackend__cleanup(void) -{ - git_repository_free(_repo); -} - -void test_odb_backend_nobackend__write_fails_gracefully(void) -{ - git_oid id; - git_odb *odb; - const git_error *err; - - git_repository_odb(&odb, _repo); - cl_git_fail(git_odb_write(&id, odb, "Hello world!\n", 13, GIT_OBJ_BLOB)); - - err = giterr_last(); - cl_assert_equal_s(err->message, "Cannot write object - unsupported in the loaded odb backends"); - - git_odb_free(odb); -} diff --git a/vendor/libgit2/tests/odb/backend/nonrefreshing.c b/vendor/libgit2/tests/odb/backend/nonrefreshing.c deleted file mode 100644 index b435294790..0000000000 --- a/vendor/libgit2/tests/odb/backend/nonrefreshing.c +++ /dev/null @@ -1,274 +0,0 @@ -#include "clar_libgit2.h" -#include "git2/sys/odb_backend.h" -#include "repository.h" - -typedef struct fake_backend { - git_odb_backend parent; - - git_error_code error_code; - - int exists_calls; - int read_calls; - int read_header_calls; - int read_prefix_calls; -} fake_backend; - -static git_repository *_repo; -static fake_backend *_fake; -static git_oid _oid; - -static int fake_backend__exists(git_odb_backend *backend, const git_oid *oid) -{ - fake_backend *fake; - - GIT_UNUSED(oid); - - fake = (fake_backend *)backend; - - fake->exists_calls++; - - return (fake->error_code == GIT_OK); -} - -static int fake_backend__read( - void **buffer_p, size_t *len_p, git_otype *type_p, - git_odb_backend *backend, const git_oid *oid) -{ - fake_backend *fake; - - GIT_UNUSED(buffer_p); - GIT_UNUSED(len_p); - GIT_UNUSED(type_p); - GIT_UNUSED(oid); - - fake = (fake_backend *)backend; - - fake->read_calls++; - - *len_p = 0; - *buffer_p = NULL; - *type_p = GIT_OBJ_BLOB; - - return fake->error_code; -} - -static int fake_backend__read_header( - size_t *len_p, git_otype *type_p, - git_odb_backend *backend, const git_oid *oid) -{ - fake_backend *fake; - - GIT_UNUSED(len_p); - GIT_UNUSED(type_p); - GIT_UNUSED(oid); - - fake = (fake_backend *)backend; - - fake->read_header_calls++; - - *len_p = 0; - *type_p = GIT_OBJ_BLOB; - - return fake->error_code; -} - -static int fake_backend__read_prefix( - git_oid *out_oid, void **buffer_p, size_t *len_p, git_otype *type_p, - git_odb_backend *backend, const git_oid *short_oid, size_t len) -{ - fake_backend *fake; - - GIT_UNUSED(out_oid); - GIT_UNUSED(buffer_p); - GIT_UNUSED(len_p); - GIT_UNUSED(type_p); - GIT_UNUSED(short_oid); - GIT_UNUSED(len); - - fake = (fake_backend *)backend; - - fake->read_prefix_calls++; - - *len_p = 0; - *buffer_p = NULL; - *type_p = GIT_OBJ_BLOB; - - return fake->error_code; -} - -static void fake_backend__free(git_odb_backend *_backend) -{ - fake_backend *backend; - - backend = (fake_backend *)_backend; - - git__free(backend); -} - -static int build_fake_backend( - git_odb_backend **out, - git_error_code error_code) -{ - fake_backend *backend; - - backend = git__calloc(1, sizeof(fake_backend)); - GITERR_CHECK_ALLOC(backend); - - backend->parent.version = GIT_ODB_BACKEND_VERSION; - - backend->parent.refresh = NULL; - backend->error_code = error_code; - - backend->parent.read = fake_backend__read; - backend->parent.read_prefix = fake_backend__read_prefix; - backend->parent.read_header = fake_backend__read_header; - backend->parent.exists = fake_backend__exists; - backend->parent.free = &fake_backend__free; - - *out = (git_odb_backend *)backend; - - return 0; -} - -static void setup_repository_and_backend(git_error_code error_code) -{ - git_odb *odb = NULL; - git_odb_backend *backend = NULL; - - _repo = cl_git_sandbox_init("testrepo.git"); - - cl_git_pass(build_fake_backend(&backend, error_code)); - - cl_git_pass(git_repository_odb__weakptr(&odb, _repo)); - cl_git_pass(git_odb_add_backend(odb, backend, 10)); - - _fake = (fake_backend *)backend; - - cl_git_pass(git_oid_fromstr(&_oid, "deadbeefdeadbeefdeadbeefdeadbeefdeadbeef")); -} - -void test_odb_backend_nonrefreshing__cleanup(void) -{ - cl_git_sandbox_cleanup(); -} - -void test_odb_backend_nonrefreshing__exists_is_invoked_once_on_failure(void) -{ - git_odb *odb; - - setup_repository_and_backend(GIT_ENOTFOUND); - - cl_git_pass(git_repository_odb__weakptr(&odb, _repo)); - cl_assert_equal_b(false, git_odb_exists(odb, &_oid)); - - cl_assert_equal_i(1, _fake->exists_calls); -} - -void test_odb_backend_nonrefreshing__read_is_invoked_once_on_failure(void) -{ - git_object *obj; - - setup_repository_and_backend(GIT_ENOTFOUND); - - cl_git_fail_with( - git_object_lookup(&obj, _repo, &_oid, GIT_OBJ_ANY), - GIT_ENOTFOUND); - - cl_assert_equal_i(1, _fake->read_calls); -} - -void test_odb_backend_nonrefreshing__readprefix_is_invoked_once_on_failure(void) -{ - git_object *obj; - - setup_repository_and_backend(GIT_ENOTFOUND); - - cl_git_fail_with( - git_object_lookup_prefix(&obj, _repo, &_oid, 7, GIT_OBJ_ANY), - GIT_ENOTFOUND); - - cl_assert_equal_i(1, _fake->read_prefix_calls); -} - -void test_odb_backend_nonrefreshing__readheader_is_invoked_once_on_failure(void) -{ - git_odb *odb; - size_t len; - git_otype type; - - setup_repository_and_backend(GIT_ENOTFOUND); - - cl_git_pass(git_repository_odb__weakptr(&odb, _repo)); - - cl_git_fail_with( - git_odb_read_header(&len, &type, odb, &_oid), - GIT_ENOTFOUND); - - cl_assert_equal_i(1, _fake->read_header_calls); -} - -void test_odb_backend_nonrefreshing__exists_is_invoked_once_on_success(void) -{ - git_odb *odb; - - setup_repository_and_backend(GIT_OK); - - cl_git_pass(git_repository_odb__weakptr(&odb, _repo)); - cl_assert_equal_b(true, git_odb_exists(odb, &_oid)); - - cl_assert_equal_i(1, _fake->exists_calls); -} - -void test_odb_backend_nonrefreshing__read_is_invoked_once_on_success(void) -{ - git_object *obj; - - setup_repository_and_backend(GIT_OK); - - cl_git_pass(git_object_lookup(&obj, _repo, &_oid, GIT_OBJ_ANY)); - - cl_assert_equal_i(1, _fake->read_calls); - - git_object_free(obj); -} - -void test_odb_backend_nonrefreshing__readprefix_is_invoked_once_on_success(void) -{ - git_object *obj; - - setup_repository_and_backend(GIT_OK); - - cl_git_pass(git_object_lookup_prefix(&obj, _repo, &_oid, 7, GIT_OBJ_ANY)); - - cl_assert_equal_i(1, _fake->read_prefix_calls); - - git_object_free(obj); -} - -void test_odb_backend_nonrefreshing__readheader_is_invoked_once_on_success(void) -{ - git_odb *odb; - size_t len; - git_otype type; - - setup_repository_and_backend(GIT_OK); - - cl_git_pass(git_repository_odb__weakptr(&odb, _repo)); - - cl_git_pass(git_odb_read_header(&len, &type, odb, &_oid)); - - cl_assert_equal_i(1, _fake->read_header_calls); -} - -void test_odb_backend_nonrefreshing__read_is_invoked_once_when_revparsing_a_full_oid(void) -{ - git_object *obj; - - setup_repository_and_backend(GIT_ENOTFOUND); - - cl_git_fail_with( - git_revparse_single(&obj, _repo, "deadbeefdeadbeefdeadbeefdeadbeefdeadbeef"), - GIT_ENOTFOUND); - - cl_assert_equal_i(1, _fake->read_calls); -} diff --git a/vendor/libgit2/tests/odb/emptyobjects.c b/vendor/libgit2/tests/odb/emptyobjects.c deleted file mode 100644 index 783d051974..0000000000 --- a/vendor/libgit2/tests/odb/emptyobjects.c +++ /dev/null @@ -1,57 +0,0 @@ -#include "clar_libgit2.h" -#include "odb.h" -#include "filebuf.h" - -git_repository *g_repo; - -void test_odb_emptyobjects__initialize(void) -{ - cl_git_pass(git_repository_open(&g_repo, cl_fixture("testrepo.git"))); -} -void test_odb_emptyobjects__cleanup(void) -{ - git_repository_free(g_repo); -} - -void test_odb_emptyobjects__read(void) -{ - git_oid id; - git_blob *blob; - - cl_git_pass(git_oid_fromstr(&id, "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391")); - cl_git_pass(git_blob_lookup(&blob, g_repo, &id)); - cl_assert_equal_i(GIT_OBJ_BLOB, git_object_type((git_object *) blob)); - cl_assert(git_blob_rawcontent(blob)); - cl_assert_equal_s("", git_blob_rawcontent(blob)); - cl_assert_equal_i(0, git_blob_rawsize(blob)); - git_blob_free(blob); -} - -void test_odb_emptyobjects__read_tree(void) -{ - git_oid id; - git_tree *tree; - - cl_git_pass(git_oid_fromstr(&id, "4b825dc642cb6eb9a060e54bf8d69288fbee4904")); - cl_git_pass(git_tree_lookup(&tree, g_repo, &id)); - cl_assert_equal_i(GIT_OBJ_TREE, git_object_type((git_object *) tree)); - cl_assert_equal_i(0, git_tree_entrycount(tree)); - cl_assert_equal_p(NULL, git_tree_entry_byname(tree, "foo")); - git_tree_free(tree); -} - -void test_odb_emptyobjects__read_tree_odb(void) -{ - git_oid id; - git_odb *odb; - git_odb_object *tree_odb; - - cl_git_pass(git_oid_fromstr(&id, "4b825dc642cb6eb9a060e54bf8d69288fbee4904")); - cl_git_pass(git_repository_odb(&odb, g_repo)); - cl_git_pass(git_odb_read(&tree_odb, odb, &id)); - cl_assert(git_odb_object_data(tree_odb)); - cl_assert_equal_s("", git_odb_object_data(tree_odb)); - cl_assert_equal_i(0, git_odb_object_size(tree_odb)); - git_odb_object_free(tree_odb); - git_odb_free(odb); -} diff --git a/vendor/libgit2/tests/odb/foreach.c b/vendor/libgit2/tests/odb/foreach.c deleted file mode 100644 index 12b81b4f14..0000000000 --- a/vendor/libgit2/tests/odb/foreach.c +++ /dev/null @@ -1,126 +0,0 @@ -#include "clar_libgit2.h" -#include "odb.h" -#include "git2/odb_backend.h" -#include "pack.h" -#include "buffer.h" - -static git_odb *_odb; -static git_repository *_repo; - -void test_odb_foreach__cleanup(void) -{ - git_odb_free(_odb); - git_repository_free(_repo); - - _odb = NULL; - _repo = NULL; -} - -static int foreach_cb(const git_oid *oid, void *data) -{ - int *nobj = data; - (*nobj)++; - - GIT_UNUSED(oid); - - return 0; -} - -/* - * $ git --git-dir tests/resources/testrepo.git count-objects --verbose - * count: 47 - * size: 4 - * in-pack: 1640 - * packs: 3 - * size-pack: 425 - * prune-packable: 0 - * garbage: 0 - */ -void test_odb_foreach__foreach(void) -{ - int nobj = 0; - - cl_git_pass(git_repository_open(&_repo, cl_fixture("testrepo.git"))); - git_repository_odb(&_odb, _repo); - - cl_git_pass(git_odb_foreach(_odb, foreach_cb, &nobj)); - cl_assert_equal_i(47 + 1640, nobj); /* count + in-pack */ -} - -void test_odb_foreach__one_pack(void) -{ - git_odb_backend *backend = NULL; - int nobj = 0; - - cl_git_pass(git_odb_new(&_odb)); - cl_git_pass(git_odb_backend_one_pack(&backend, cl_fixture("testrepo.git/objects/pack/pack-a81e489679b7d3418f9ab594bda8ceb37dd4c695.idx"))); - cl_git_pass(git_odb_add_backend(_odb, backend, 1)); - _repo = NULL; - - cl_git_pass(git_odb_foreach(_odb, foreach_cb, &nobj)); - cl_assert(nobj == 1628); -} - -static int foreach_stop_cb(const git_oid *oid, void *data) -{ - int *nobj = data; - (*nobj)++; - - GIT_UNUSED(oid); - - return (*nobj == 1000) ? -321 : 0; -} - -static int foreach_stop_first_cb(const git_oid *oid, void *data) -{ - int *nobj = data; - (*nobj)++; - - GIT_UNUSED(oid); - - return -123; -} - -void test_odb_foreach__interrupt_foreach(void) -{ - int nobj = 0; - git_oid id; - - cl_git_pass(git_repository_open(&_repo, cl_fixture("testrepo.git"))); - git_repository_odb(&_odb, _repo); - - cl_assert_equal_i(-321, git_odb_foreach(_odb, foreach_stop_cb, &nobj)); - cl_assert(nobj == 1000); - - git_odb_free(_odb); - git_repository_free(_repo); - - cl_git_pass(git_repository_init(&_repo, "onlyloose.git", true)); - git_repository_odb(&_odb, _repo); - - cl_git_pass(git_odb_write(&id, _odb, "", 0, GIT_OBJ_BLOB)); - cl_assert_equal_i(-123, git_odb_foreach(_odb, foreach_stop_first_cb, &nobj)); -} - -void test_odb_foreach__files_in_objects_dir(void) -{ - git_repository *repo; - git_odb *odb; - git_buf buf = GIT_BUF_INIT; - int nobj = 0; - - cl_fixture_sandbox("testrepo.git"); - cl_git_pass(git_repository_open(&repo, "testrepo.git")); - - cl_git_pass(git_buf_printf(&buf, "%s/objects/somefile", git_repository_path(repo))); - cl_git_mkfile(buf.ptr, ""); - git_buf_free(&buf); - - cl_git_pass(git_repository_odb(&odb, repo)); - cl_git_pass(git_odb_foreach(odb, foreach_cb, &nobj)); - cl_assert_equal_i(47 + 1640, nobj); /* count + in-pack */ - - git_odb_free(odb); - git_repository_free(repo); - cl_fixture_cleanup("testrepo.git"); -} diff --git a/vendor/libgit2/tests/odb/loose.c b/vendor/libgit2/tests/odb/loose.c deleted file mode 100644 index c91927c4af..0000000000 --- a/vendor/libgit2/tests/odb/loose.c +++ /dev/null @@ -1,152 +0,0 @@ -#include "clar_libgit2.h" -#include "odb.h" -#include "git2/odb_backend.h" -#include "posix.h" -#include "loose_data.h" - -#ifdef __ANDROID_API__ -# define S_IREAD S_IRUSR -# define S_IWRITE S_IWUSR -#endif - -static void write_object_files(object_data *d) -{ - int fd; - - if (p_mkdir(d->dir, GIT_OBJECT_DIR_MODE) < 0) - cl_assert(errno == EEXIST); - - cl_assert((fd = p_creat(d->file, S_IREAD | S_IWRITE)) >= 0); - cl_must_pass(p_write(fd, d->bytes, d->blen)); - - p_close(fd); -} - -static void cmp_objects(git_rawobj *o, object_data *d) -{ - cl_assert(o->type == git_object_string2type(d->type)); - cl_assert(o->len == d->dlen); - - if (o->len > 0) - cl_assert(memcmp(o->data, d->data, o->len) == 0); -} - -static void test_read_object(object_data *data) -{ - git_oid id; - git_odb_object *obj; - git_odb *odb; - git_rawobj tmp; - - write_object_files(data); - - cl_git_pass(git_odb_open(&odb, "test-objects")); - cl_git_pass(git_oid_fromstr(&id, data->id)); - cl_git_pass(git_odb_read(&obj, odb, &id)); - - tmp.data = obj->buffer; - tmp.len = obj->cached.size; - tmp.type = obj->cached.type; - - cmp_objects(&tmp, data); - - git_odb_object_free(obj); - git_odb_free(odb); -} - -void test_odb_loose__initialize(void) -{ - cl_must_pass(p_mkdir("test-objects", GIT_OBJECT_DIR_MODE)); -} - -void test_odb_loose__cleanup(void) -{ - cl_fixture_cleanup("test-objects"); -} - -void test_odb_loose__exists(void) -{ - git_oid id, id2; - git_odb *odb; - - write_object_files(&one); - cl_git_pass(git_odb_open(&odb, "test-objects")); - - cl_git_pass(git_oid_fromstr(&id, one.id)); - cl_assert(git_odb_exists(odb, &id)); - - cl_git_pass(git_oid_fromstrp(&id, "8b137891")); - cl_git_pass(git_odb_exists_prefix(&id2, odb, &id, 8)); - cl_assert_equal_i(0, git_oid_streq(&id2, one.id)); - - /* Test for a missing object */ - cl_git_pass(git_oid_fromstr(&id, "8b137891791fe96927ad78e64b0aad7bded08baa")); - cl_assert(!git_odb_exists(odb, &id)); - - cl_git_pass(git_oid_fromstrp(&id, "8b13789a")); - cl_assert_equal_i(GIT_ENOTFOUND, git_odb_exists_prefix(&id2, odb, &id, 8)); - - git_odb_free(odb); -} - -void test_odb_loose__simple_reads(void) -{ - test_read_object(&commit); - test_read_object(&tree); - test_read_object(&tag); - test_read_object(&zero); - test_read_object(&one); - test_read_object(&two); - test_read_object(&some); -} - -void test_write_object_permission( - mode_t dir_mode, mode_t file_mode, - mode_t expected_dir_mode, mode_t expected_file_mode) -{ - git_odb *odb; - git_odb_backend *backend; - git_oid oid; - struct stat statbuf; - mode_t mask, os_mask; - - /* Windows does not return group/user bits from stat, - * files are never executable. - */ -#ifdef GIT_WIN32 - os_mask = 0600; -#else - os_mask = 0777; -#endif - - mask = p_umask(0); - p_umask(mask); - - cl_git_pass(git_odb_new(&odb)); - cl_git_pass(git_odb_backend_loose(&backend, "test-objects", -1, 0, dir_mode, file_mode)); - cl_git_pass(git_odb_add_backend(odb, backend, 1)); - cl_git_pass(git_odb_write(&oid, odb, "Test data\n", 10, GIT_OBJ_BLOB)); - - cl_git_pass(p_stat("test-objects/67", &statbuf)); - cl_assert_equal_i(statbuf.st_mode & os_mask, (expected_dir_mode & ~mask) & os_mask); - - cl_git_pass(p_stat("test-objects/67/b808feb36201507a77f85e6d898f0a2836e4a5", &statbuf)); - cl_assert_equal_i(statbuf.st_mode & os_mask, (expected_file_mode & ~mask) & os_mask); - - git_odb_free(odb); -} - -void test_odb_loose__permissions_standard(void) -{ - test_write_object_permission(0, 0, GIT_OBJECT_DIR_MODE, GIT_OBJECT_FILE_MODE); -} - -void test_odb_loose_permissions_readonly(void) -{ - test_write_object_permission(0777, 0444, 0777, 0444); -} - -void test_odb_loose__permissions_readwrite(void) -{ - test_write_object_permission(0777, 0666, 0777, 0666); -} diff --git a/vendor/libgit2/tests/odb/loose_data.h b/vendor/libgit2/tests/odb/loose_data.h deleted file mode 100644 index c10c9bc7f3..0000000000 --- a/vendor/libgit2/tests/odb/loose_data.h +++ /dev/null @@ -1,522 +0,0 @@ -typedef struct object_data { - unsigned char *bytes; /* (compressed) bytes stored in object store */ - size_t blen; /* length of data in object store */ - char *id; /* object id (sha1) */ - char *type; /* object type */ - char *dir; /* object store (fan-out) directory name */ - char *file; /* object store filename */ - unsigned char *data; /* (uncompressed) object data */ - size_t dlen; /* length of (uncompressed) object data */ -} object_data; - -/* one == 8b137891791fe96927ad78e64b0aad7bded08bdc */ -static unsigned char one_bytes[] = { - 0x31, 0x78, 0x9c, 0xe3, 0x02, 0x00, 0x00, 0x0b, - 0x00, 0x0b, -}; - -static unsigned char one_data[] = { - 0x0a, -}; - -static object_data one = { - one_bytes, - sizeof(one_bytes), - "8b137891791fe96927ad78e64b0aad7bded08bdc", - "blob", - "test-objects/8b", - "test-objects/8b/137891791fe96927ad78e64b0aad7bded08bdc", - one_data, - sizeof(one_data), -}; - - -/* commit == 3d7f8a6af076c8c3f20071a8935cdbe8228594d1 */ -static unsigned char commit_bytes[] = { - 0x78, 0x01, 0x85, 0x50, 0xc1, 0x6a, 0xc3, 0x30, - 0x0c, 0xdd, 0xd9, 0x5f, 0xa1, 0xfb, 0x96, 0x12, - 0xbb, 0x29, 0x71, 0x46, 0x19, 0x2b, 0x3d, 0x97, - 0x1d, 0xd6, 0x7d, 0x80, 0x1d, 0xcb, 0x89, 0x21, - 0xb6, 0x82, 0xed, 0x40, 0xf3, 0xf7, 0xf3, 0x48, - 0x29, 0x3b, 0x6d, 0xd2, 0xe5, 0xbd, 0x27, 0xbd, - 0x27, 0x50, 0x4f, 0xde, 0xbb, 0x0c, 0xfb, 0x43, - 0xf3, 0x94, 0x23, 0x22, 0x18, 0x6b, 0x85, 0x51, - 0x5d, 0xad, 0xc5, 0xa1, 0x41, 0xae, 0x51, 0x4b, - 0xd9, 0x19, 0x6e, 0x4b, 0x0b, 0x29, 0x35, 0x72, - 0x59, 0xef, 0x5b, 0x29, 0x8c, 0x65, 0x6a, 0xc9, - 0x23, 0x45, 0x38, 0xc1, 0x17, 0x5c, 0x7f, 0xc0, - 0x71, 0x13, 0xde, 0xf1, 0xa6, 0xfc, 0x3c, 0xe1, - 0xae, 0x27, 0xff, 0x06, 0x5c, 0x88, 0x56, 0xf2, - 0x46, 0x74, 0x2d, 0x3c, 0xd7, 0xa5, 0x58, 0x51, - 0xcb, 0xb9, 0x8c, 0x11, 0xce, 0xf0, 0x01, 0x97, - 0x0d, 0x1e, 0x1f, 0xea, 0x3f, 0x6e, 0x76, 0x02, - 0x0a, 0x58, 0x4d, 0x2e, 0x20, 0x6c, 0x1e, 0x48, - 0x8b, 0xf7, 0x2a, 0xae, 0x8c, 0x5d, 0x47, 0x04, - 0x4d, 0x66, 0x05, 0xb2, 0x90, 0x0b, 0xbe, 0xcf, - 0x3d, 0xa6, 0xa4, 0x06, 0x7c, 0x29, 0x3c, 0x64, - 0xe5, 0x82, 0x0b, 0x03, 0xd8, 0x25, 0x96, 0x8d, - 0x08, 0x78, 0x9b, 0x27, 0x15, 0x54, 0x76, 0x14, - 0xd8, 0xdd, 0x35, 0x2f, 0x71, 0xa6, 0x84, 0x8f, - 0x90, 0x51, 0x85, 0x01, 0x13, 0xb8, 0x90, 0x23, - 0x99, 0xa5, 0x47, 0x03, 0x7a, 0xfd, 0x15, 0xbf, - 0x63, 0xec, 0xd3, 0x0d, 0x01, 0x4d, 0x45, 0xb6, - 0xd2, 0xeb, 0xeb, 0xdf, 0xef, 0x60, 0xdf, 0xef, - 0x1f, 0x78, 0x35, -}; - -static unsigned char commit_data[] = { - 0x74, 0x72, 0x65, 0x65, 0x20, 0x64, 0x66, 0x66, - 0x32, 0x64, 0x61, 0x39, 0x30, 0x62, 0x32, 0x35, - 0x34, 0x65, 0x31, 0x62, 0x65, 0x62, 0x38, 0x38, - 0x39, 0x64, 0x31, 0x66, 0x31, 0x66, 0x31, 0x32, - 0x38, 0x38, 0x62, 0x65, 0x31, 0x38, 0x30, 0x33, - 0x37, 0x38, 0x32, 0x64, 0x66, 0x0a, 0x61, 0x75, - 0x74, 0x68, 0x6f, 0x72, 0x20, 0x41, 0x20, 0x55, - 0x20, 0x54, 0x68, 0x6f, 0x72, 0x20, 0x3c, 0x61, - 0x75, 0x74, 0x68, 0x6f, 0x72, 0x40, 0x65, 0x78, - 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x63, 0x6f, - 0x6d, 0x3e, 0x20, 0x31, 0x32, 0x32, 0x37, 0x38, - 0x31, 0x34, 0x32, 0x39, 0x37, 0x20, 0x2b, 0x30, - 0x30, 0x30, 0x30, 0x0a, 0x63, 0x6f, 0x6d, 0x6d, - 0x69, 0x74, 0x74, 0x65, 0x72, 0x20, 0x43, 0x20, - 0x4f, 0x20, 0x4d, 0x69, 0x74, 0x74, 0x65, 0x72, - 0x20, 0x3c, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, - 0x74, 0x65, 0x72, 0x40, 0x65, 0x78, 0x61, 0x6d, - 0x70, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x3e, - 0x20, 0x31, 0x32, 0x32, 0x37, 0x38, 0x31, 0x34, - 0x32, 0x39, 0x37, 0x20, 0x2b, 0x30, 0x30, 0x30, - 0x30, 0x0a, 0x0a, 0x41, 0x20, 0x6f, 0x6e, 0x65, - 0x2d, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x63, 0x6f, - 0x6d, 0x6d, 0x69, 0x74, 0x20, 0x73, 0x75, 0x6d, - 0x6d, 0x61, 0x72, 0x79, 0x0a, 0x0a, 0x54, 0x68, - 0x65, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x6f, - 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, - 0x6d, 0x6d, 0x69, 0x74, 0x20, 0x6d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x63, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, - 0x20, 0x66, 0x75, 0x72, 0x74, 0x68, 0x65, 0x72, - 0x20, 0x65, 0x78, 0x70, 0x6c, 0x61, 0x6e, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x0a, 0x6f, 0x66, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x70, 0x75, 0x72, 0x70, - 0x6f, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x73, 0x20, 0x69, 0x6e, 0x74, 0x72, 0x6f, - 0x64, 0x75, 0x63, 0x65, 0x64, 0x20, 0x62, 0x79, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, - 0x6d, 0x69, 0x74, 0x2e, 0x0a, 0x0a, 0x53, 0x69, - 0x67, 0x6e, 0x65, 0x64, 0x2d, 0x6f, 0x66, 0x2d, - 0x62, 0x79, 0x3a, 0x20, 0x41, 0x20, 0x55, 0x20, - 0x54, 0x68, 0x6f, 0x72, 0x20, 0x3c, 0x61, 0x75, - 0x74, 0x68, 0x6f, 0x72, 0x40, 0x65, 0x78, 0x61, - 0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, - 0x3e, 0x0a, -}; - -static object_data commit = { - commit_bytes, - sizeof(commit_bytes), - "3d7f8a6af076c8c3f20071a8935cdbe8228594d1", - "commit", - "test-objects/3d", - "test-objects/3d/7f8a6af076c8c3f20071a8935cdbe8228594d1", - commit_data, - sizeof(commit_data), -}; - -/* tree == dff2da90b254e1beb889d1f1f1288be1803782df */ -static unsigned char tree_bytes[] = { - 0x78, 0x01, 0x2b, 0x29, 0x4a, 0x4d, 0x55, 0x30, - 0x34, 0x32, 0x63, 0x30, 0x34, 0x30, 0x30, 0x33, - 0x31, 0x51, 0xc8, 0xcf, 0x4b, 0x65, 0xe8, 0x16, - 0xae, 0x98, 0x58, 0x29, 0xff, 0x32, 0x53, 0x7d, - 0x6d, 0xc5, 0x33, 0x6f, 0xae, 0xb5, 0xd5, 0xf7, - 0x2e, 0x74, 0xdf, 0x81, 0x4a, 0x17, 0xe7, 0xe7, - 0xa6, 0x32, 0xfc, 0x6d, 0x31, 0xd8, 0xd3, 0xe6, - 0xf3, 0xe7, 0xea, 0x47, 0xbe, 0xd0, 0x09, 0x3f, - 0x96, 0xb8, 0x3f, 0x90, 0x9e, 0xa2, 0xfd, 0x0f, - 0x2a, 0x5f, 0x52, 0x9e, 0xcf, 0x50, 0x31, 0x43, - 0x52, 0x29, 0xd1, 0x5a, 0xeb, 0x77, 0x82, 0x2a, - 0x8b, 0xfe, 0xb7, 0xbd, 0xed, 0x5d, 0x07, 0x67, - 0xfa, 0xb5, 0x42, 0xa5, 0xab, 0x52, 0x8b, 0xf2, - 0x19, 0x9e, 0xcd, 0x7d, 0x34, 0x7b, 0xd3, 0xc5, - 0x6b, 0xce, 0xde, 0xdd, 0x9a, 0xeb, 0xca, 0xa3, - 0x6e, 0x1c, 0x7a, 0xd2, 0x13, 0x3c, 0x11, 0x00, - 0xe2, 0xaa, 0x38, 0x57, -}; - -static unsigned char tree_data[] = { - 0x31, 0x30, 0x30, 0x36, 0x34, 0x34, 0x20, 0x6f, - 0x6e, 0x65, 0x00, 0x8b, 0x13, 0x78, 0x91, 0x79, - 0x1f, 0xe9, 0x69, 0x27, 0xad, 0x78, 0xe6, 0x4b, - 0x0a, 0xad, 0x7b, 0xde, 0xd0, 0x8b, 0xdc, 0x31, - 0x30, 0x30, 0x36, 0x34, 0x34, 0x20, 0x73, 0x6f, - 0x6d, 0x65, 0x00, 0xfd, 0x84, 0x30, 0xbc, 0x86, - 0x4c, 0xfc, 0xd5, 0xf1, 0x0e, 0x55, 0x90, 0xf8, - 0xa4, 0x47, 0xe0, 0x1b, 0x94, 0x2b, 0xfe, 0x31, - 0x30, 0x30, 0x36, 0x34, 0x34, 0x20, 0x74, 0x77, - 0x6f, 0x00, 0x78, 0x98, 0x19, 0x22, 0x61, 0x3b, - 0x2a, 0xfb, 0x60, 0x25, 0x04, 0x2f, 0xf6, 0xbd, - 0x87, 0x8a, 0xc1, 0x99, 0x4e, 0x85, 0x31, 0x30, - 0x30, 0x36, 0x34, 0x34, 0x20, 0x7a, 0x65, 0x72, - 0x6f, 0x00, 0xe6, 0x9d, 0xe2, 0x9b, 0xb2, 0xd1, - 0xd6, 0x43, 0x4b, 0x8b, 0x29, 0xae, 0x77, 0x5a, - 0xd8, 0xc2, 0xe4, 0x8c, 0x53, 0x91, -}; - -static object_data tree = { - tree_bytes, - sizeof(tree_bytes), - "dff2da90b254e1beb889d1f1f1288be1803782df", - "tree", - "test-objects/df", - "test-objects/df/f2da90b254e1beb889d1f1f1288be1803782df", - tree_data, - sizeof(tree_data), -}; - -/* tag == 09d373e1dfdc16b129ceec6dd649739911541e05 */ -static unsigned char tag_bytes[] = { - 0x78, 0x01, 0x35, 0x4e, 0xcb, 0x0a, 0xc2, 0x40, - 0x10, 0xf3, 0xbc, 0x5f, 0x31, 0x77, 0xa1, 0xec, - 0xa3, 0xed, 0x6e, 0x41, 0x44, 0xf0, 0x2c, 0x5e, - 0xfc, 0x81, 0xe9, 0x76, 0xb6, 0xad, 0xb4, 0xb4, - 0x6c, 0x07, 0xd1, 0xbf, 0x77, 0x44, 0x0d, 0x39, - 0x84, 0x10, 0x92, 0x30, 0xf6, 0x60, 0xbc, 0xdb, - 0x2d, 0xed, 0x9d, 0x22, 0x83, 0xeb, 0x7c, 0x0a, - 0x58, 0x63, 0xd2, 0xbe, 0x8e, 0x21, 0xba, 0x64, - 0xb5, 0xf6, 0x06, 0x43, 0xe3, 0xaa, 0xd8, 0xb5, - 0x14, 0xac, 0x0d, 0x55, 0x53, 0x76, 0x46, 0xf1, - 0x6b, 0x25, 0x88, 0xcb, 0x3c, 0x8f, 0xac, 0x58, - 0x3a, 0x1e, 0xba, 0xd0, 0x85, 0xd8, 0xd8, 0xf7, - 0x94, 0xe1, 0x0c, 0x57, 0xb8, 0x8c, 0xcc, 0x22, - 0x0f, 0xdf, 0x90, 0xc8, 0x13, 0x3d, 0x71, 0x5e, - 0x27, 0x2a, 0xc4, 0x39, 0x82, 0xb1, 0xd6, 0x07, - 0x53, 0xda, 0xc6, 0xc3, 0x5e, 0x0b, 0x94, 0xba, - 0x0d, 0xe3, 0x06, 0x42, 0x1e, 0x08, 0x3e, 0x95, - 0xbf, 0x4b, 0x69, 0xc9, 0x90, 0x69, 0x22, 0xdc, - 0xe8, 0xbf, 0xf2, 0x06, 0x42, 0x9a, 0x36, 0xb1, -}; - -static unsigned char tag_data[] = { - 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x33, - 0x64, 0x37, 0x66, 0x38, 0x61, 0x36, 0x61, 0x66, - 0x30, 0x37, 0x36, 0x63, 0x38, 0x63, 0x33, 0x66, - 0x32, 0x30, 0x30, 0x37, 0x31, 0x61, 0x38, 0x39, - 0x33, 0x35, 0x63, 0x64, 0x62, 0x65, 0x38, 0x32, - 0x32, 0x38, 0x35, 0x39, 0x34, 0x64, 0x31, 0x0a, - 0x74, 0x79, 0x70, 0x65, 0x20, 0x63, 0x6f, 0x6d, - 0x6d, 0x69, 0x74, 0x0a, 0x74, 0x61, 0x67, 0x20, - 0x76, 0x30, 0x2e, 0x30, 0x2e, 0x31, 0x0a, 0x74, - 0x61, 0x67, 0x67, 0x65, 0x72, 0x20, 0x43, 0x20, - 0x4f, 0x20, 0x4d, 0x69, 0x74, 0x74, 0x65, 0x72, - 0x20, 0x3c, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, - 0x74, 0x65, 0x72, 0x40, 0x65, 0x78, 0x61, 0x6d, - 0x70, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x3e, - 0x20, 0x31, 0x32, 0x32, 0x37, 0x38, 0x31, 0x34, - 0x32, 0x39, 0x37, 0x20, 0x2b, 0x30, 0x30, 0x30, - 0x30, 0x0a, 0x0a, 0x54, 0x68, 0x69, 0x73, 0x20, - 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, - 0x61, 0x67, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x72, 0x65, - 0x6c, 0x65, 0x61, 0x73, 0x65, 0x20, 0x76, 0x30, - 0x2e, 0x30, 0x2e, 0x31, 0x0a, -}; - -static object_data tag = { - tag_bytes, - sizeof(tag_bytes), - "09d373e1dfdc16b129ceec6dd649739911541e05", - "tag", - "test-objects/09", - "test-objects/09/d373e1dfdc16b129ceec6dd649739911541e05", - tag_data, - sizeof(tag_data), -}; - -/* zero == e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 */ -static unsigned char zero_bytes[] = { - 0x78, 0x01, 0x4b, 0xca, 0xc9, 0x4f, 0x52, 0x30, - 0x60, 0x00, 0x00, 0x09, 0xb0, 0x01, 0xf0, -}; - -static unsigned char zero_data[] = { - 0x00 /* dummy data */ -}; - -static object_data zero = { - zero_bytes, - sizeof(zero_bytes), - "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391", - "blob", - "test-objects/e6", - "test-objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391", - zero_data, - 0, -}; - -/* two == 78981922613b2afb6025042ff6bd878ac1994e85 */ -static unsigned char two_bytes[] = { - 0x78, 0x01, 0x4b, 0xca, 0xc9, 0x4f, 0x52, 0x30, - 0x62, 0x48, 0xe4, 0x02, 0x00, 0x0e, 0x64, 0x02, - 0x5d, -}; - -static unsigned char two_data[] = { - 0x61, 0x0a, -}; - -static object_data two = { - two_bytes, - sizeof(two_bytes), - "78981922613b2afb6025042ff6bd878ac1994e85", - "blob", - "test-objects/78", - "test-objects/78/981922613b2afb6025042ff6bd878ac1994e85", - two_data, - sizeof(two_data), -}; - -/* some == fd8430bc864cfcd5f10e5590f8a447e01b942bfe */ -static unsigned char some_bytes[] = { - 0x78, 0x01, 0x7d, 0x54, 0xc1, 0x4e, 0xe3, 0x30, - 0x10, 0xdd, 0x33, 0x5f, 0x31, 0xc7, 0x5d, 0x94, - 0xa5, 0x84, 0xd5, 0x22, 0xad, 0x7a, 0x0a, 0x15, - 0x85, 0x48, 0xd0, 0x56, 0x49, 0x2a, 0xd4, 0xa3, - 0x13, 0x4f, 0x88, 0x85, 0x63, 0x47, 0xb6, 0x43, - 0xc9, 0xdf, 0xef, 0x8c, 0x69, 0x17, 0x56, 0x0b, - 0x7b, 0xaa, 0x62, 0x7b, 0xde, 0xbc, 0xf7, 0xe6, - 0x4d, 0x6b, 0x6d, 0x6b, 0x48, 0xd3, 0xcb, 0x5f, - 0x5f, 0x66, 0xa7, 0x27, 0x70, 0x0a, 0x55, 0xa7, - 0x3c, 0xb4, 0x4a, 0x23, 0xf0, 0xaf, 0x43, 0x04, - 0x6f, 0xdb, 0xb0, 0x17, 0x0e, 0xe7, 0x30, 0xd9, - 0x11, 0x1a, 0x61, 0xc0, 0xa1, 0x54, 0x3e, 0x38, - 0x55, 0x8f, 0x81, 0x9e, 0x05, 0x10, 0x46, 0xce, - 0xac, 0x83, 0xde, 0x4a, 0xd5, 0x4e, 0x0c, 0x42, - 0x67, 0xa3, 0x91, 0xe8, 0x20, 0x74, 0x08, 0x01, - 0x5d, 0xef, 0xc1, 0xb6, 0xf1, 0xe3, 0x66, 0xb5, - 0x85, 0x1b, 0x34, 0xe8, 0x84, 0x86, 0xcd, 0x58, - 0x6b, 0xd5, 0xc0, 0x9d, 0x6a, 0xd0, 0x78, 0x4c, - 0xe0, 0x19, 0x9d, 0x57, 0xd6, 0xc0, 0x45, 0xc2, - 0x18, 0xc2, 0xc3, 0xc0, 0x0f, 0x7c, 0x87, 0x12, - 0xea, 0x29, 0x56, 0x2f, 0x99, 0x4f, 0x79, 0xe0, - 0x03, 0x4b, 0x4b, 0x4d, 0x44, 0xa0, 0x92, 0x33, - 0x2a, 0xe0, 0x9a, 0xdc, 0x80, 0x90, 0x52, 0xf1, - 0x11, 0x04, 0x1b, 0x4b, 0x06, 0xea, 0xae, 0x3c, - 0xe3, 0x7a, 0x50, 0x74, 0x4a, 0x84, 0xfe, 0xc3, - 0x81, 0x41, 0xf8, 0x89, 0x18, 0x43, 0x67, 0x9d, - 0x87, 0x47, 0xf5, 0x8c, 0x51, 0xf6, 0x68, 0xb4, - 0xea, 0x55, 0x20, 0x2a, 0x6f, 0x80, 0xdc, 0x42, - 0x2b, 0xf3, 0x14, 0x2b, 0x1a, 0xdb, 0x0f, 0xe4, - 0x9a, 0x64, 0x84, 0xa3, 0x90, 0xa8, 0xf9, 0x8f, - 0x9d, 0x86, 0x9e, 0xd3, 0xab, 0x5a, 0x99, 0xc8, - 0xd9, 0xc3, 0x5e, 0x85, 0x0e, 0x2c, 0xb5, 0x73, - 0x30, 0x38, 0xfb, 0xe8, 0x44, 0xef, 0x5f, 0x95, - 0x1b, 0xc9, 0xd0, 0xef, 0x3c, 0x26, 0x32, 0x1e, - 0xff, 0x2d, 0xb6, 0x23, 0x7b, 0x3f, 0xd1, 0x3c, - 0x78, 0x1a, 0x0d, 0xcb, 0xe6, 0xf6, 0xd4, 0x44, - 0x99, 0x47, 0x1a, 0x9e, 0xed, 0x23, 0xb5, 0x91, - 0x6a, 0xdf, 0x53, 0x39, 0x03, 0xf8, 0x5a, 0xb1, - 0x0f, 0x1f, 0xce, 0x81, 0x11, 0xde, 0x01, 0x7a, - 0x90, 0x16, 0xc4, 0x30, 0xe8, 0x89, 0xed, 0x7b, - 0x65, 0x4b, 0xd7, 0x03, 0x36, 0xc1, 0xcf, 0xa1, - 0xa5, 0xb1, 0xe3, 0x8b, 0xe8, 0x07, 0x4d, 0xf3, - 0x23, 0x25, 0x13, 0x35, 0x27, 0xf5, 0x8c, 0x11, - 0xd3, 0xa0, 0x9a, 0xa8, 0xf5, 0x38, 0x7d, 0xce, - 0x55, 0xc2, 0x71, 0x79, 0x13, 0xc7, 0xa3, 0xda, - 0x77, 0x68, 0xc0, 0xd8, 0x10, 0xdd, 0x24, 0x8b, - 0x15, 0x59, 0xc5, 0x10, 0xe2, 0x20, 0x99, 0x8e, - 0xf0, 0x05, 0x9b, 0x31, 0x88, 0x5a, 0xe3, 0xd9, - 0x37, 0xba, 0xe2, 0xdb, 0xbf, 0x92, 0xfa, 0x66, - 0x16, 0x97, 0x47, 0xd9, 0x9d, 0x1d, 0x28, 0x7c, - 0x9d, 0x08, 0x1c, 0xc7, 0xbd, 0xd2, 0x1a, 0x6a, - 0x04, 0xf2, 0xa2, 0x1d, 0x75, 0x02, 0x14, 0x5d, - 0xc6, 0x78, 0xc8, 0xab, 0xdb, 0xf5, 0xb6, 0x82, - 0x6c, 0xb5, 0x83, 0x87, 0xac, 0x28, 0xb2, 0x55, - 0xb5, 0x9b, 0xc7, 0xc1, 0xb0, 0xb7, 0xf8, 0x4c, - 0xbc, 0x38, 0x0e, 0x8a, 0x04, 0x2a, 0x62, 0x41, - 0x6b, 0xe0, 0x84, 0x09, 0x13, 0xe9, 0xe1, 0xea, - 0xfb, 0xeb, 0x62, 0x71, 0x4b, 0x25, 0xd9, 0x55, - 0x7e, 0x97, 0x57, 0x3b, 0x20, 0x33, 0x96, 0x79, - 0xb5, 0xba, 0x2e, 0x4b, 0x58, 0xae, 0x0b, 0xc8, - 0x60, 0x93, 0x15, 0x55, 0xbe, 0xd8, 0xde, 0x65, - 0x05, 0x6c, 0xb6, 0xc5, 0x66, 0x5d, 0x5e, 0x93, - 0xf7, 0x25, 0x65, 0x98, 0x41, 0x29, 0x86, 0x0c, - 0xf2, 0xf1, 0x14, 0xa2, 0xb3, 0xbd, 0x75, 0x08, - 0x12, 0x83, 0x50, 0xda, 0x1f, 0x23, 0xbe, 0xa3, - 0x1d, 0xf4, 0x9d, 0x1d, 0xb5, 0x84, 0x4e, 0x50, - 0x38, 0x1d, 0x36, 0x48, 0x21, 0x95, 0xd1, 0xac, - 0x81, 0x99, 0x1d, 0xc1, 0x3f, 0x41, 0xe6, 0x9e, - 0x42, 0x5b, 0x0a, 0x48, 0xcc, 0x5f, 0xe0, 0x7d, - 0x3f, 0xc4, 0x6f, 0x0e, 0xfe, 0xc0, 0x2d, 0xfe, - 0x01, 0x2c, 0xd6, 0x9b, 0x5d, 0xbe, 0xba, 0x21, - 0xca, 0x79, 0xcb, 0xe3, 0x49, 0x60, 0xef, 0x68, - 0x05, 0x28, 0x9b, 0x8c, 0xc1, 0x12, 0x3e, 0xdb, - 0xc7, 0x04, 0x7e, 0xa6, 0x74, 0x29, 0xcc, 0x13, - 0xed, 0x07, 0x94, 0x81, 0xd6, 0x96, 0xaa, 0x97, - 0xaa, 0xa5, 0xc0, 0x2f, 0xb5, 0xb5, 0x2e, 0xe6, - 0xfc, 0xca, 0xfa, 0x60, 0x4d, 0x02, 0xf7, 0x19, - 0x9c, 0x5f, 0xa4, 0xe9, 0xf9, 0xf7, 0xf4, 0xc7, - 0x79, 0x9a, 0xc0, 0xb6, 0xcc, 0x58, 0xec, 0xec, - 0xe4, 0x37, 0x22, 0xfa, 0x8b, 0x53, -}; - -static unsigned char some_data[] = { - 0x2f, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x54, 0x68, - 0x69, 0x73, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, - 0x69, 0x73, 0x20, 0x66, 0x72, 0x65, 0x65, 0x20, - 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, - 0x3b, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x63, 0x61, - 0x6e, 0x20, 0x72, 0x65, 0x64, 0x69, 0x73, 0x74, - 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x69, - 0x74, 0x20, 0x61, 0x6e, 0x64, 0x2f, 0x6f, 0x72, - 0x20, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x0a, - 0x20, 0x2a, 0x20, 0x69, 0x74, 0x20, 0x75, 0x6e, - 0x64, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x74, 0x65, 0x72, 0x6d, 0x73, 0x20, 0x6f, 0x66, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x47, 0x4e, 0x55, - 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, - 0x20, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20, - 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x2c, - 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x20, 0x32, 0x2c, 0x0a, 0x20, 0x2a, 0x20, 0x61, - 0x73, 0x20, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, - 0x68, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x46, 0x72, 0x65, 0x65, 0x20, - 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, - 0x20, 0x46, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x2e, 0x0a, 0x20, 0x2a, 0x0a, - 0x20, 0x2a, 0x20, 0x49, 0x6e, 0x20, 0x61, 0x64, - 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, - 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x65, - 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x47, 0x4e, 0x55, 0x20, 0x47, 0x65, 0x6e, - 0x65, 0x72, 0x61, 0x6c, 0x20, 0x50, 0x75, 0x62, - 0x6c, 0x69, 0x63, 0x20, 0x4c, 0x69, 0x63, 0x65, - 0x6e, 0x73, 0x65, 0x2c, 0x0a, 0x20, 0x2a, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x61, 0x75, 0x74, 0x68, - 0x6f, 0x72, 0x73, 0x20, 0x67, 0x69, 0x76, 0x65, - 0x20, 0x79, 0x6f, 0x75, 0x20, 0x75, 0x6e, 0x6c, - 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x20, 0x70, - 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x6c, 0x69, 0x6e, - 0x6b, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, - 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x64, 0x0a, 0x20, - 0x2a, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, - 0x73, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x69, - 0x6e, 0x74, 0x6f, 0x20, 0x63, 0x6f, 0x6d, 0x62, - 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x6f, 0x74, - 0x68, 0x65, 0x72, 0x20, 0x70, 0x72, 0x6f, 0x67, - 0x72, 0x61, 0x6d, 0x73, 0x2c, 0x0a, 0x20, 0x2a, - 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x6f, 0x20, - 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, - 0x74, 0x65, 0x20, 0x74, 0x68, 0x6f, 0x73, 0x65, - 0x20, 0x63, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x77, 0x69, - 0x74, 0x68, 0x6f, 0x75, 0x74, 0x20, 0x61, 0x6e, - 0x79, 0x20, 0x72, 0x65, 0x73, 0x74, 0x72, 0x69, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x0a, 0x20, 0x2a, - 0x20, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x20, - 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, - 0x74, 0x68, 0x69, 0x73, 0x20, 0x66, 0x69, 0x6c, - 0x65, 0x2e, 0x20, 0x20, 0x28, 0x54, 0x68, 0x65, - 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, - 0x20, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20, - 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x0a, - 0x20, 0x2a, 0x20, 0x72, 0x65, 0x73, 0x74, 0x72, - 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, - 0x64, 0x6f, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x79, - 0x20, 0x69, 0x6e, 0x20, 0x6f, 0x74, 0x68, 0x65, - 0x72, 0x20, 0x72, 0x65, 0x73, 0x70, 0x65, 0x63, - 0x74, 0x73, 0x3b, 0x20, 0x66, 0x6f, 0x72, 0x20, - 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2c, - 0x20, 0x74, 0x68, 0x65, 0x79, 0x20, 0x63, 0x6f, - 0x76, 0x65, 0x72, 0x0a, 0x20, 0x2a, 0x20, 0x6d, - 0x6f, 0x64, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x2c, - 0x20, 0x61, 0x6e, 0x64, 0x20, 0x64, 0x69, 0x73, - 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x6e, - 0x6f, 0x74, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x65, - 0x64, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x0a, 0x20, - 0x2a, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6d, 0x62, - 0x69, 0x6e, 0x65, 0x64, 0x20, 0x65, 0x78, 0x65, - 0x63, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, - 0x29, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, - 0x54, 0x68, 0x69, 0x73, 0x20, 0x66, 0x69, 0x6c, - 0x65, 0x20, 0x69, 0x73, 0x20, 0x64, 0x69, 0x73, - 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x64, - 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x68, 0x6f, 0x70, 0x65, 0x20, 0x74, 0x68, 0x61, - 0x74, 0x20, 0x69, 0x74, 0x20, 0x77, 0x69, 0x6c, - 0x6c, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, - 0x66, 0x75, 0x6c, 0x2c, 0x20, 0x62, 0x75, 0x74, - 0x0a, 0x20, 0x2a, 0x20, 0x57, 0x49, 0x54, 0x48, - 0x4f, 0x55, 0x54, 0x20, 0x41, 0x4e, 0x59, 0x20, - 0x57, 0x41, 0x52, 0x52, 0x41, 0x4e, 0x54, 0x59, - 0x3b, 0x20, 0x77, 0x69, 0x74, 0x68, 0x6f, 0x75, - 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x69, 0x6d, 0x70, 0x6c, 0x69, - 0x65, 0x64, 0x20, 0x77, 0x61, 0x72, 0x72, 0x61, - 0x6e, 0x74, 0x79, 0x20, 0x6f, 0x66, 0x0a, 0x20, - 0x2a, 0x20, 0x4d, 0x45, 0x52, 0x43, 0x48, 0x41, - 0x4e, 0x54, 0x41, 0x42, 0x49, 0x4c, 0x49, 0x54, - 0x59, 0x20, 0x6f, 0x72, 0x20, 0x46, 0x49, 0x54, - 0x4e, 0x45, 0x53, 0x53, 0x20, 0x46, 0x4f, 0x52, - 0x20, 0x41, 0x20, 0x50, 0x41, 0x52, 0x54, 0x49, - 0x43, 0x55, 0x4c, 0x41, 0x52, 0x20, 0x50, 0x55, - 0x52, 0x50, 0x4f, 0x53, 0x45, 0x2e, 0x20, 0x20, - 0x53, 0x65, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x47, 0x4e, 0x55, 0x0a, 0x20, 0x2a, 0x20, 0x47, - 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x20, 0x50, - 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20, 0x4c, 0x69, - 0x63, 0x65, 0x6e, 0x73, 0x65, 0x20, 0x66, 0x6f, - 0x72, 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x64, - 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x2e, 0x0a, - 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x59, 0x6f, - 0x75, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, - 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x72, 0x65, - 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x20, 0x61, - 0x20, 0x63, 0x6f, 0x70, 0x79, 0x20, 0x6f, 0x66, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x47, 0x4e, 0x55, - 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, - 0x20, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20, - 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x0a, - 0x20, 0x2a, 0x20, 0x61, 0x6c, 0x6f, 0x6e, 0x67, - 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, - 0x69, 0x73, 0x20, 0x70, 0x72, 0x6f, 0x67, 0x72, - 0x61, 0x6d, 0x3b, 0x20, 0x73, 0x65, 0x65, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x6c, 0x65, - 0x20, 0x43, 0x4f, 0x50, 0x59, 0x49, 0x4e, 0x47, - 0x2e, 0x20, 0x20, 0x49, 0x66, 0x20, 0x6e, 0x6f, - 0x74, 0x2c, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, - 0x20, 0x74, 0x6f, 0x0a, 0x20, 0x2a, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x46, 0x72, 0x65, 0x65, 0x20, - 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, - 0x20, 0x46, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x35, 0x31, 0x20, - 0x46, 0x72, 0x61, 0x6e, 0x6b, 0x6c, 0x69, 0x6e, - 0x20, 0x53, 0x74, 0x72, 0x65, 0x65, 0x74, 0x2c, - 0x20, 0x46, 0x69, 0x66, 0x74, 0x68, 0x20, 0x46, - 0x6c, 0x6f, 0x6f, 0x72, 0x2c, 0x0a, 0x20, 0x2a, - 0x20, 0x42, 0x6f, 0x73, 0x74, 0x6f, 0x6e, 0x2c, - 0x20, 0x4d, 0x41, 0x20, 0x30, 0x32, 0x31, 0x31, - 0x30, 0x2d, 0x31, 0x33, 0x30, 0x31, 0x2c, 0x20, - 0x55, 0x53, 0x41, 0x2e, 0x0a, 0x20, 0x2a, 0x2f, - 0x0a, -}; - -static object_data some = { - some_bytes, - sizeof(some_bytes), - "fd8430bc864cfcd5f10e5590f8a447e01b942bfe", - "blob", - "test-objects/fd", - "test-objects/fd/8430bc864cfcd5f10e5590f8a447e01b942bfe", - some_data, - sizeof(some_data), -}; diff --git a/vendor/libgit2/tests/odb/mixed.c b/vendor/libgit2/tests/odb/mixed.c deleted file mode 100644 index 2dad4b64e4..0000000000 --- a/vendor/libgit2/tests/odb/mixed.c +++ /dev/null @@ -1,110 +0,0 @@ -#include "clar_libgit2.h" -#include "odb.h" - -static git_odb *_odb; - -void test_odb_mixed__initialize(void) -{ - cl_git_pass(git_odb_open(&_odb, cl_fixture("duplicate.git/objects"))); -} - -void test_odb_mixed__cleanup(void) -{ - git_odb_free(_odb); - _odb = NULL; -} - -void test_odb_mixed__dup_oid(void) { - const char hex[] = "ce013625030ba8dba906f756967f9e9ca394464a"; - const char short_hex[] = "ce01362"; - git_oid oid; - git_odb_object *obj; - - cl_git_pass(git_oid_fromstr(&oid, hex)); - cl_git_pass(git_odb_read_prefix(&obj, _odb, &oid, GIT_OID_HEXSZ)); - git_odb_object_free(obj); - - cl_git_pass(git_odb_exists_prefix(NULL, _odb, &oid, GIT_OID_HEXSZ)); - - cl_git_pass(git_oid_fromstrn(&oid, short_hex, sizeof(short_hex) - 1)); - cl_git_pass(git_odb_read_prefix(&obj, _odb, &oid, sizeof(short_hex) - 1)); - git_odb_object_free(obj); - - cl_git_pass(git_odb_exists_prefix(NULL, _odb, &oid, sizeof(short_hex) - 1)); -} - -/* some known sha collisions of file content: - * 'aabqhq' and 'aaazvc' with prefix 'dea509d0' (+ '9' and + 'b') - * 'aaeufo' and 'aaaohs' with prefix '81b5bff5' (+ 'f' and + 'b') - * 'aafewy' and 'aaepta' with prefix '739e3c4c' - * 'aahsyn' and 'aadrjg' with prefix '0ddeaded' (+ '9' and + 'e') - */ - -void test_odb_mixed__dup_oid_prefix_0(void) { - char hex[10]; - git_oid oid, found; - git_odb_object *obj; - - /* ambiguous in the same pack file */ - - strncpy(hex, "dea509d0", sizeof(hex)); - cl_git_pass(git_oid_fromstrn(&oid, hex, strlen(hex))); - cl_assert_equal_i( - GIT_EAMBIGUOUS, git_odb_read_prefix(&obj, _odb, &oid, strlen(hex))); - cl_assert_equal_i( - GIT_EAMBIGUOUS, git_odb_exists_prefix(&found, _odb, &oid, strlen(hex))); - - strncpy(hex, "dea509d09", sizeof(hex)); - cl_git_pass(git_oid_fromstrn(&oid, hex, strlen(hex))); - cl_git_pass(git_odb_read_prefix(&obj, _odb, &oid, strlen(hex))); - cl_git_pass(git_odb_exists_prefix(&found, _odb, &oid, strlen(hex))); - cl_assert_equal_oid(&found, git_odb_object_id(obj)); - git_odb_object_free(obj); - - strncpy(hex, "dea509d0b", sizeof(hex)); - cl_git_pass(git_oid_fromstrn(&oid, hex, strlen(hex))); - cl_git_pass(git_odb_read_prefix(&obj, _odb, &oid, strlen(hex))); - git_odb_object_free(obj); - - /* ambiguous in different pack files */ - - strncpy(hex, "81b5bff5", sizeof(hex)); - cl_git_pass(git_oid_fromstrn(&oid, hex, strlen(hex))); - cl_assert_equal_i( - GIT_EAMBIGUOUS, git_odb_read_prefix(&obj, _odb, &oid, strlen(hex))); - cl_assert_equal_i( - GIT_EAMBIGUOUS, git_odb_exists_prefix(&found, _odb, &oid, strlen(hex))); - - strncpy(hex, "81b5bff5b", sizeof(hex)); - cl_git_pass(git_oid_fromstrn(&oid, hex, strlen(hex))); - cl_git_pass(git_odb_read_prefix(&obj, _odb, &oid, strlen(hex))); - cl_git_pass(git_odb_exists_prefix(&found, _odb, &oid, strlen(hex))); - cl_assert_equal_oid(&found, git_odb_object_id(obj)); - git_odb_object_free(obj); - - strncpy(hex, "81b5bff5f", sizeof(hex)); - cl_git_pass(git_oid_fromstrn(&oid, hex, strlen(hex))); - cl_git_pass(git_odb_read_prefix(&obj, _odb, &oid, strlen(hex))); - git_odb_object_free(obj); - - /* ambiguous in pack file and loose */ - - strncpy(hex, "0ddeaded", sizeof(hex)); - cl_git_pass(git_oid_fromstrn(&oid, hex, strlen(hex))); - cl_assert_equal_i( - GIT_EAMBIGUOUS, git_odb_read_prefix(&obj, _odb, &oid, strlen(hex))); - cl_assert_equal_i( - GIT_EAMBIGUOUS, git_odb_exists_prefix(&found, _odb, &oid, strlen(hex))); - - strncpy(hex, "0ddeaded9", sizeof(hex)); - cl_git_pass(git_oid_fromstrn(&oid, hex, strlen(hex))); - cl_git_pass(git_odb_read_prefix(&obj, _odb, &oid, strlen(hex))); - cl_git_pass(git_odb_exists_prefix(&found, _odb, &oid, strlen(hex))); - cl_assert_equal_oid(&found, git_odb_object_id(obj)); - git_odb_object_free(obj); - - strncpy(hex, "0ddeadede", sizeof(hex)); - cl_git_pass(git_oid_fromstrn(&oid, hex, strlen(hex))); - cl_git_pass(git_odb_read_prefix(&obj, _odb, &oid, strlen(hex))); - git_odb_object_free(obj); -} diff --git a/vendor/libgit2/tests/odb/pack_data.h b/vendor/libgit2/tests/odb/pack_data.h deleted file mode 100644 index e6371beb10..0000000000 --- a/vendor/libgit2/tests/odb/pack_data.h +++ /dev/null @@ -1,151 +0,0 @@ - -static const char *packed_objects[] = { - "0266163a49e280c4f5ed1e08facd36a2bd716bcf", - "53fc32d17276939fc79ed05badaef2db09990016", - "6336846bd5c88d32f93ae57d846683e61ab5c530", - "6dcf9bf7541ee10456529833502442f385010c3d", - "bed08a0b30b72a9d4aed7f1af8c8ca124e8d64b9", - "e90810b8df3e80c413d903f631643c716887138d", - "fc3c3a2083e9f6f89e6bd53e9420e70d1e357c9b", - "fc58168adf502d0c0ef614c3111a7038fc8c09c8", - "fd0ec0333948dfe23265ac46be0205a436a8c3a5", - "fd8430bc864cfcd5f10e5590f8a447e01b942bfe", - "fd899f45951c15c1c5f7c34b1c864e91bd6556c6", - "fda23b974899e7e1f938619099280bfda13bdca9", - "fdbec189efb657c8325962b494875987881a356b", - "fe1ca6bd22b5d8353ce6c2f3aba80805c438a7a5", - "fe3a6a42c87ff1239370c741a265f3997add87c1", - "deb106bfd2d36ecf9f0079224c12022201a39ad1", - "dec93efc79e60f2680de3e666755d335967eec30", - "def425bf8568b9c1e20879bf5be6f9c52b7361c4", - "df48000ac4f48570054e3a71a81916357997b680", - "dfae6ed8f6dd8acc3b40a31811ea316239223559", - "dff79e27d3d2cdc09790ded80fe2ea8ff5d61034", - "e00e46abe4c542e17c8bc83d72cf5be8018d7b0e", - "e01b107b4f77f8f98645adac0206a504f2d29d7c", - "e032d863f512c47b479bd984f8b6c8061f66b7d4", - "e044baa468a1c74f9f9da36805445f6888358b49", - "e04529998989ba8ae3419538dd57969af819b241", - "e0637ddfbea67c8d7f557c709e095af8906e9176", - "e0743ad4031231e71700abdc6fdbe94f189d20e5", - "cf33ac7a3d8b2b8f6bb266518aadbf59de397608", - "cf5f7235b9c9689b133f6ea12015720b411329bd", - "cf6cccf1297284833a9a03138a1f5738fa1c6c94", - "cf7992bde17ce7a79cab5f0c1fcbe8a0108721ed", - "cfe3a027ab12506d4144ee8a35669ae8fc4b7ab1", - "cfe96f31dfad7bab49977aa1df7302f7fafcb025", - "cff54d138945ef4de384e9d2759291d0c13ea90a", - "d01f7573ac34c2f502bd1cf18cde73480c741151", - "d03f567593f346a1ca96a57f8191def098d126e3", - "d047b47aadf88501238f36f5c17dd0a50dc62087", - "d0a0d63086fae3b0682af7261df21f7d0f7f066d", - "d0a44bd6ed0be21b725a96c0891bbc79bc1a540c", - "d0d7e736e536a41bcb885005f8bf258c61cad682", - "d0e7959d4b95ffec6198df6f5a7ae259b23a5f50", - "bf2fe2acca17d13356ce802ba9dc8343f710dfb7", - "bf55f407d6d9418e51f42ea7a3a6aadf17388349", - "bf92206f8b633b88a66dca4a911777630b06fbac", - "bfaf8c42eb8842abe206179fee864cfba87e3ca9", - "bfe05675d4e8f6b59d50932add8790f1a06b10ee", - "bff8618112330763327cfa6ce6e914db84f51ddf", - "bff873e9853ed99fed52c25f7ad29f78b27dcec2", - "c01c3fae7251098d7af1b459bcd0786e81d4616d", - "c0220fca67f48b8a5d4163d53b1486224be3a198", - "c02d0b160b82ee72469c269f13de4c26a7ea09cb", - "c059510ad1b45ab58390e042d7dee1ac46703854", - "c07204a1897aeeaa3c248d29dbfa9b033baf9755", - "c073337a4dd7276931b4b3fdbc3f0040e9441793", - "0fd7e4bfba5b3a82be88d1057757ca8b2c5e6d26", - "100746511cc45c9f1ad6721c4ef5be49222fee4d", - "1088490171d9b984d68b8b9be9ca003f4eafff59", - "1093c8ff4cb78fcf5f79dbbeedcb6e824bd4e253", - "10aa3fa72afab7ee31e116ae06442fe0f7b79df2", - "10b759e734e8299aa0dca08be935d95d886127b6", - "111d5ccf0bb010c4e8d7af3eedfa12ef4c5e265b", - "11261fbff21758444d426356ff6327ee01e90752", - "112998d425717bb922ce74e8f6f0f831d8dc4510", - "2ef4e5d838b6507bd61d457cf6466662b791c5c0", - "2ef4faa0f82efa00eeac6cae9e8b2abccc8566ee", - "2f06098183b0d7be350acbe39cdbaccff2df0c4a", - "2f1c5d509ac5bffb3c62f710a1c2c542e126dfd1", - "2f205b20fc16423c42b3ba51b2ea78d7b9ff3578", - "2f9b6b6e3d9250ba09360734aa47973a993b59d1", - "30c62a2d5a8d644f1311d4f7fe3f6a788e4c8188", - "31438e245492d85fd6da4d1406eba0fbde8332a4", - "3184a3abdfea231992254929ff4e275898e5bbf6", - "3188ffdbb3a3d52e0f78f30c484533899224436e", - "32581d0093429770d044a60eb0e9cc0462bedb13", - "32679a9544d83e5403202c4d5efb61ad02492847", - "4e7e9f60b7e2049b7f5697daf133161a18ef688f", - "4e8cda27ddc8be7db875ceb0f360c37734724c6d", - "4ea481c61c59ab55169b7cbaae536ad50b49d6f0", - "4f0adcd0e61eabe06fe32be66b16559537124b7a", - "4f1355c91100d12f9e7202f91b245df0c110867c", - "4f6eadeb08b9d0d1e8b1b3eac8a34940adf29a2d", - "4f9339df943c53117a5fc8e86e2f38716ff3a668", - "4fc3874b118752e40de556b1c3e7b4a9f1737d00", - "4ff1dd0992dd6baafdb5e166be6f9f23b59bdf87", - "5018a35e0b7e2eec7ce5050baf9c7343f3f74164", - "50298f44a45eda3a29dae82dbe911b5aa176ac07", - "502acd164fb115768d723144da2e7bb5a24891bb", - "50330c02bd4fd95c9db1fcf2f97f4218e42b7226", - "5052bf355d9f8c52446561a39733a8767bf31e37", - "6f2cd729ae42988c1dd43588d3a6661ba48ad7a0", - "6f4e2c42d9138bfbf3e0f908f1308828cc6f2178", - "6f6a17db05a83620cef4572761831c20a70ba9b9", - "6faad60901e36538634f0d8b8ff3f21f83503c71", - "6fc72e46de3df0c3842dab302bbacf697a63abab", - "6fdccd49f442a7204399ca9b418f017322dbded8", - "6fe7568fc3861c334cb008fd85d57d9647249ef5", - "700f55d91d7b55665594676a4bada1f1457a0598", - "702bd70595a7b19afc48a1f784a6505be68469d4", - "7033f9ee0e52b08cb5679cd49b7b7999eaf9eaf8", - "70957110ce446c4e250f865760fb3da513cdcc92", - "8ec696a4734f16479d091bc70574d23dd9fe7443", - "8ed341c55ed4d6f4cdc8bf4f0ca18a08c93f6962", - "8edc2805f1f11b63e44bf81f4557f8b473612b69", - "8ef9060a954118a698fc10e20acdc430566a100f", - "8f0c4b543f4bb6eb1518ecfc3d4699e43108d393", - "8fac94df3035405c2e60b3799153ce7c428af6b9", - "904c0ac12b23548de524adae712241b423d765a3", - "90bbaa9a809c3a768d873a9cc7d52b4f3bf3d1b9", - "90d4d2f0fc362beabbbf76b4ffda0828229c198d", - "90f9ff6755330b685feff6c3d81782ee3592ab04", - "91822c50ebe4f9bf5bbb8308ecf9f6557062775c", - "91d973263a55708fa8255867b3202d81ef9c2868", - "af292c99c6148d772af3315a1c74e83330e7ead7", - "af3b99d5be330dbbce0b9250c3a5fb05911908cc", - "af55d0cdeb280af2db8697e5afa506e081012719", - "af795e498d411142ddb073e8ca2c5447c3295a4c", - "afadc73a392f8cc8e2cc77dd62a7433dd3bafa8c", - "affd84ed8ec7ce67612fe3c12a80f8164b101f6a", - "b0941f9c70ffe67f0387a827b338e64ecf3190f0", - "b0a3077f9ef6e093f8d9869bdb0c07095bd722cb", - "b0a8568a7614806378a54db5706ee3b06ae58693", - "b0fb7372f242233d1d35ce7d8e74d3990cbc5841", - "b10489944b9ead17427551759d180d10203e06ba", - "b196a807b323f2748ffc6b1d42cd0812d04c9a40", - "b1bb1d888f0c5e19278536d49fa77db035fac7ae" -}; - -static const char *loose_objects[] = { - "45b983be36b73c0788dc9cbcb76cbb80fc7bb057", - "a8233120f6ad708f843d861ce2b7228ec4e3dec6", - "fd093bff70906175335656e6ce6ae05783708765", - "c47800c7266a2be04c571c04d5a6614691ea99bd", - "a71586c1dfe8a71c6cbf6c129f404c5642ff31bd", - "8496071c1b46c854b31185ea97743be6a8774479", - "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391", - "814889a078c031f61ed08ab5fa863aea9314344d", - "5b5b025afb0b4c913b4c338a42934a3863bf3644", - "1385f264afb75a56a5bec74243be9b367ba4ca08", - "f60079018b664e4e79329a7ef9559c8d9e0378d1", - "be3563ae3f795b2b4353bcce3a527ad0a4f7f644", - "75057dd4114e74cca1d750d0aee1647c903cb60a", - "fa49b077972391ad58037050f2a75f74e3671e92", - "9fd738e8f7967c078dceed8190330fc8648ee56a", - "1810dff58d8a660512d4832e740f692884338ccd", - "181037049a54a1eb5fab404658a3a250b44335d7", - "a4a7dce85cf63874e984719f4fdd239f5145052f", - "4a202b346bb0fb0db7eff3cffeb3c70babbd2045" -}; diff --git a/vendor/libgit2/tests/odb/pack_data_one.h b/vendor/libgit2/tests/odb/pack_data_one.h deleted file mode 100644 index 13570ba78c..0000000000 --- a/vendor/libgit2/tests/odb/pack_data_one.h +++ /dev/null @@ -1,19 +0,0 @@ -/* Just a few to make sure it's working, the rest is tested already */ -static const char *packed_objects_one[] = { - "9fcf811e00fa469688943a9152c16d4ee90fb9a9", - "a93f42a5b5e9de40fa645a9ff1e276a021c9542b", - "12bf5f3e3470d90db177ccf1b5e8126409377fc6", - "ed1ea164cdbe3c4b200fb4fa19861ea90eaee222", - "dfae6ed8f6dd8acc3b40a31811ea316239223559", - "aefe66d192771201e369fde830530f4475beec30", - "775e4b4c1296e9e3104f2a36ca9cf9356a130959", - "412ec4e4a6a7419bc1be00561fe474e54cb499fe", - "236e7579fed7763be77209efb8708960982f3cb3", - "09fe9364461cf60dd1c46b0e9545b1e47bb1a297", - "d76d8a6390d1cf32138d98a91b1eb7e0275a12f5", - "d0fdf2dcff2f548952eec536ccc6d266550041bc", - "a20d733a9fa79fa5b4cbb9639864f93325ec27a6", - "785d3fe8e7db5ade2c2242fecd46c32a7f4dc59f", - "4d8d0fd9cb6045075385701c3f933ec13345e9c4", - "0cfd861bd547b6520d1fc2e190e8359e0a9c9b90" -}; diff --git a/vendor/libgit2/tests/odb/packed.c b/vendor/libgit2/tests/odb/packed.c deleted file mode 100644 index b4f549b58f..0000000000 --- a/vendor/libgit2/tests/odb/packed.c +++ /dev/null @@ -1,79 +0,0 @@ -#include "clar_libgit2.h" -#include "odb.h" -#include "pack_data.h" - -static git_odb *_odb; - -void test_odb_packed__initialize(void) -{ - cl_git_pass(git_odb_open(&_odb, cl_fixture("testrepo.git/objects"))); -} - -void test_odb_packed__cleanup(void) -{ - git_odb_free(_odb); - _odb = NULL; -} - -void test_odb_packed__mass_read(void) -{ - unsigned int i; - - for (i = 0; i < ARRAY_SIZE(packed_objects); ++i) { - git_oid id; - git_odb_object *obj; - - cl_git_pass(git_oid_fromstr(&id, packed_objects[i])); - cl_assert(git_odb_exists(_odb, &id) == 1); - cl_git_pass(git_odb_read(&obj, _odb, &id)); - - git_odb_object_free(obj); - } -} - -void test_odb_packed__read_header_0(void) -{ - unsigned int i; - - for (i = 0; i < ARRAY_SIZE(packed_objects); ++i) { - git_oid id; - git_odb_object *obj; - size_t len; - git_otype type; - - cl_git_pass(git_oid_fromstr(&id, packed_objects[i])); - - cl_git_pass(git_odb_read(&obj, _odb, &id)); - cl_git_pass(git_odb_read_header(&len, &type, _odb, &id)); - - cl_assert(obj->cached.size == len); - cl_assert(obj->cached.type == type); - - git_odb_object_free(obj); - } -} - -void test_odb_packed__read_header_1(void) -{ - unsigned int i; - - for (i = 0; i < ARRAY_SIZE(loose_objects); ++i) { - git_oid id; - git_odb_object *obj; - size_t len; - git_otype type; - - cl_git_pass(git_oid_fromstr(&id, loose_objects[i])); - - cl_assert(git_odb_exists(_odb, &id) == 1); - - cl_git_pass(git_odb_read(&obj, _odb, &id)); - cl_git_pass(git_odb_read_header(&len, &type, _odb, &id)); - - cl_assert(obj->cached.size == len); - cl_assert(obj->cached.type == type); - - git_odb_object_free(obj); - } -} - diff --git a/vendor/libgit2/tests/odb/packed_one.c b/vendor/libgit2/tests/odb/packed_one.c deleted file mode 100644 index 0c6ed387b4..0000000000 --- a/vendor/libgit2/tests/odb/packed_one.c +++ /dev/null @@ -1,60 +0,0 @@ -#include "clar_libgit2.h" -#include "git2/odb_backend.h" - -#include "pack_data_one.h" -#include "pack.h" - -static git_odb *_odb; - -void test_odb_packed_one__initialize(void) -{ - git_odb_backend *backend = NULL; - - cl_git_pass(git_odb_new(&_odb)); - cl_git_pass(git_odb_backend_one_pack(&backend, cl_fixture("testrepo.git/objects/pack/pack-a81e489679b7d3418f9ab594bda8ceb37dd4c695.idx"))); - cl_git_pass(git_odb_add_backend(_odb, backend, 1)); -} - -void test_odb_packed_one__cleanup(void) -{ - git_odb_free(_odb); - _odb = NULL; -} - -void test_odb_packed_one__mass_read(void) -{ - unsigned int i; - - for (i = 0; i < ARRAY_SIZE(packed_objects_one); ++i) { - git_oid id; - git_odb_object *obj; - - cl_git_pass(git_oid_fromstr(&id, packed_objects_one[i])); - cl_assert(git_odb_exists(_odb, &id) == 1); - cl_git_pass(git_odb_read(&obj, _odb, &id)); - - git_odb_object_free(obj); - } -} - -void test_odb_packed_one__read_header_0(void) -{ - unsigned int i; - - for (i = 0; i < ARRAY_SIZE(packed_objects_one); ++i) { - git_oid id; - git_odb_object *obj; - size_t len; - git_otype type; - - cl_git_pass(git_oid_fromstr(&id, packed_objects_one[i])); - - cl_git_pass(git_odb_read(&obj, _odb, &id)); - cl_git_pass(git_odb_read_header(&len, &type, _odb, &id)); - - cl_assert(obj->cached.size == len); - cl_assert(obj->cached.type == type); - - git_odb_object_free(obj); - } -} diff --git a/vendor/libgit2/tests/odb/sorting.c b/vendor/libgit2/tests/odb/sorting.c deleted file mode 100644 index 147a160c87..0000000000 --- a/vendor/libgit2/tests/odb/sorting.c +++ /dev/null @@ -1,69 +0,0 @@ -#include "clar_libgit2.h" -#include "git2/sys/odb_backend.h" - -typedef struct { - git_odb_backend base; - size_t position; -} fake_backend; - -static git_odb_backend *new_backend(size_t position) -{ - fake_backend *b; - - b = git__calloc(1, sizeof(fake_backend)); - if (b == NULL) - return NULL; - - b->base.version = GIT_ODB_BACKEND_VERSION; - b->position = position; - return (git_odb_backend *)b; -} - -static void check_backend_sorting(git_odb *odb) -{ - size_t i, max_i = git_odb_num_backends(odb); - fake_backend *internal; - - for (i = 0; i < max_i; ++i) { - cl_git_pass(git_odb_get_backend((git_odb_backend **)&internal, odb, i)); - cl_assert(internal != NULL); - cl_assert_equal_sz(i, internal->position); - } -} - -static git_odb *_odb; - -void test_odb_sorting__initialize(void) -{ - cl_git_pass(git_odb_new(&_odb)); -} - -void test_odb_sorting__cleanup(void) -{ - git_odb_free(_odb); - _odb = NULL; -} - -void test_odb_sorting__basic_backends_sorting(void) -{ - cl_git_pass(git_odb_add_backend(_odb, new_backend(0), 5)); - cl_git_pass(git_odb_add_backend(_odb, new_backend(2), 3)); - cl_git_pass(git_odb_add_backend(_odb, new_backend(1), 4)); - cl_git_pass(git_odb_add_backend(_odb, new_backend(3), 1)); - - check_backend_sorting(_odb); -} - -void test_odb_sorting__alternate_backends_sorting(void) -{ - cl_git_pass(git_odb_add_backend(_odb, new_backend(0), 5)); - cl_git_pass(git_odb_add_backend(_odb, new_backend(2), 3)); - cl_git_pass(git_odb_add_backend(_odb, new_backend(1), 4)); - cl_git_pass(git_odb_add_backend(_odb, new_backend(3), 1)); - cl_git_pass(git_odb_add_alternate(_odb, new_backend(4), 5)); - cl_git_pass(git_odb_add_alternate(_odb, new_backend(6), 3)); - cl_git_pass(git_odb_add_alternate(_odb, new_backend(5), 4)); - cl_git_pass(git_odb_add_alternate(_odb, new_backend(7), 1)); - - check_backend_sorting(_odb); -} diff --git a/vendor/libgit2/tests/odb/streamwrite.c b/vendor/libgit2/tests/odb/streamwrite.c deleted file mode 100644 index 591a20040c..0000000000 --- a/vendor/libgit2/tests/odb/streamwrite.c +++ /dev/null @@ -1,56 +0,0 @@ -#include "clar_libgit2.h" -#include "git2/odb_backend.h" - -static git_repository *repo; -static git_odb *odb; -static git_odb_stream *stream; - -void test_odb_streamwrite__initialize(void) -{ - repo = cl_git_sandbox_init("testrepo.git"); - cl_git_pass(git_repository_odb(&odb, repo)); - - cl_git_pass(git_odb_open_wstream(&stream, odb, 14, GIT_OBJ_BLOB)); - cl_assert_equal_sz(14, stream->declared_size); -} - -void test_odb_streamwrite__cleanup(void) -{ - git_odb_stream_free(stream); - git_odb_free(odb); - cl_git_sandbox_cleanup(); -} - -void test_odb_streamwrite__can_accept_chunks(void) -{ - git_oid oid; - - cl_git_pass(git_odb_stream_write(stream, "deadbeef", 8)); - cl_assert_equal_sz(8, stream->received_bytes); - - cl_git_pass(git_odb_stream_write(stream, "deadbeef", 6)); - cl_assert_equal_sz(8 + 6, stream->received_bytes); - - cl_git_pass(git_odb_stream_finalize_write(&oid, stream)); -} - -void test_odb_streamwrite__can_detect_missing_bytes(void) -{ - git_oid oid; - - cl_git_pass(git_odb_stream_write(stream, "deadbeef", 8)); - cl_assert_equal_sz(8, stream->received_bytes); - - cl_git_pass(git_odb_stream_write(stream, "deadbeef", 4)); - cl_assert_equal_sz(8 + 4, stream->received_bytes); - - cl_git_fail(git_odb_stream_finalize_write(&oid, stream)); -} - -void test_odb_streamwrite__can_detect_additional_bytes(void) -{ - cl_git_pass(git_odb_stream_write(stream, "deadbeef", 8)); - cl_assert_equal_sz(8, stream->received_bytes); - - cl_git_fail(git_odb_stream_write(stream, "deadbeef", 7)); -} diff --git a/vendor/libgit2/tests/online/clone.c b/vendor/libgit2/tests/online/clone.c deleted file mode 100644 index e63cf55f1a..0000000000 --- a/vendor/libgit2/tests/online/clone.c +++ /dev/null @@ -1,625 +0,0 @@ -#include "clar_libgit2.h" - -#include "git2/clone.h" -#include "git2/cred_helpers.h" -#include "remote.h" -#include "fileops.h" -#include "refs.h" - -#define LIVE_REPO_URL "http://github.com/libgit2/TestGitRepository" -#define LIVE_EMPTYREPO_URL "http://github.com/libgit2/TestEmptyRepository" -#define BB_REPO_URL "https://libgit3@bitbucket.org/libgit2/testgitrepository.git" -#define BB_REPO_URL_WITH_PASS "https://libgit3:libgit3@bitbucket.org/libgit2/testgitrepository.git" -#define BB_REPO_URL_WITH_WRONG_PASS "https://libgit3:wrong@bitbucket.org/libgit2/testgitrepository.git" - -#define SSH_REPO_URL "ssh://github.com/libgit2/TestGitRepository" - -static git_repository *g_repo; -static git_clone_options g_options; - -void test_online_clone__initialize(void) -{ - git_checkout_options dummy_opts = GIT_CHECKOUT_OPTIONS_INIT; - git_fetch_options dummy_fetch = GIT_FETCH_OPTIONS_INIT; - - g_repo = NULL; - - memset(&g_options, 0, sizeof(git_clone_options)); - g_options.version = GIT_CLONE_OPTIONS_VERSION; - g_options.checkout_opts = dummy_opts; - g_options.checkout_opts.checkout_strategy = GIT_CHECKOUT_SAFE; - g_options.fetch_opts = dummy_fetch; -} - -void test_online_clone__cleanup(void) -{ - if (g_repo) { - git_repository_free(g_repo); - g_repo = NULL; - } - cl_fixture_cleanup("./foo"); -} - -void test_online_clone__network_full(void) -{ - git_remote *origin; - - cl_git_pass(git_clone(&g_repo, LIVE_REPO_URL, "./foo", &g_options)); - cl_assert(!git_repository_is_bare(g_repo)); - cl_git_pass(git_remote_lookup(&origin, g_repo, "origin")); - - cl_assert_equal_i(GIT_REMOTE_DOWNLOAD_TAGS_AUTO, origin->download_tags); - - git_remote_free(origin); -} - -void test_online_clone__network_bare(void) -{ - git_remote *origin; - - g_options.bare = true; - - cl_git_pass(git_clone(&g_repo, LIVE_REPO_URL, "./foo", &g_options)); - cl_assert(git_repository_is_bare(g_repo)); - cl_git_pass(git_remote_lookup(&origin, g_repo, "origin")); - - git_remote_free(origin); -} - -void test_online_clone__empty_repository(void) -{ - git_reference *head; - - cl_git_pass(git_clone(&g_repo, LIVE_EMPTYREPO_URL, "./foo", &g_options)); - - cl_assert_equal_i(true, git_repository_is_empty(g_repo)); - cl_assert_equal_i(true, git_repository_head_unborn(g_repo)); - - cl_git_pass(git_reference_lookup(&head, g_repo, GIT_HEAD_FILE)); - cl_assert_equal_i(GIT_REF_SYMBOLIC, git_reference_type(head)); - cl_assert_equal_s("refs/heads/master", git_reference_symbolic_target(head)); - - git_reference_free(head); -} - -static void checkout_progress(const char *path, size_t cur, size_t tot, void *payload) -{ - bool *was_called = (bool*)payload; - GIT_UNUSED(path); GIT_UNUSED(cur); GIT_UNUSED(tot); - (*was_called) = true; -} - -static int fetch_progress(const git_transfer_progress *stats, void *payload) -{ - bool *was_called = (bool*)payload; - GIT_UNUSED(stats); - (*was_called) = true; - return 0; -} - -void test_online_clone__can_checkout_a_cloned_repo(void) -{ - git_buf path = GIT_BUF_INIT; - git_reference *head; - bool checkout_progress_cb_was_called = false, - fetch_progress_cb_was_called = false; - - g_options.checkout_opts.checkout_strategy = GIT_CHECKOUT_SAFE; - g_options.checkout_opts.progress_cb = &checkout_progress; - g_options.checkout_opts.progress_payload = &checkout_progress_cb_was_called; - g_options.fetch_opts.callbacks.transfer_progress = &fetch_progress; - g_options.fetch_opts.callbacks.payload = &fetch_progress_cb_was_called; - - cl_git_pass(git_clone(&g_repo, LIVE_REPO_URL, "./foo", &g_options)); - - cl_git_pass(git_buf_joinpath(&path, git_repository_workdir(g_repo), "master.txt")); - cl_assert_equal_i(true, git_path_isfile(git_buf_cstr(&path))); - - cl_git_pass(git_reference_lookup(&head, g_repo, "HEAD")); - cl_assert_equal_i(GIT_REF_SYMBOLIC, git_reference_type(head)); - cl_assert_equal_s("refs/heads/master", git_reference_symbolic_target(head)); - - cl_assert_equal_i(true, checkout_progress_cb_was_called); - cl_assert_equal_i(true, fetch_progress_cb_was_called); - - git_reference_free(head); - git_buf_free(&path); -} - -static int remote_mirror_cb(git_remote **out, git_repository *repo, - const char *name, const char *url, void *payload) -{ - int error; - git_remote *remote; - - GIT_UNUSED(payload); - - if ((error = git_remote_create_with_fetchspec(&remote, repo, name, url, "+refs/*:refs/*")) < 0) - return error; - - *out = remote; - return 0; -} - -void test_online_clone__clone_mirror(void) -{ - git_clone_options opts = GIT_CLONE_OPTIONS_INIT; - git_reference *head; - - bool fetch_progress_cb_was_called = false; - - opts.fetch_opts.callbacks.transfer_progress = &fetch_progress; - opts.fetch_opts.callbacks.payload = &fetch_progress_cb_was_called; - - opts.bare = true; - opts.remote_cb = remote_mirror_cb; - - cl_git_pass(git_clone(&g_repo, LIVE_REPO_URL, "./foo.git", &opts)); - - cl_git_pass(git_reference_lookup(&head, g_repo, "HEAD")); - cl_assert_equal_i(GIT_REF_SYMBOLIC, git_reference_type(head)); - cl_assert_equal_s("refs/heads/master", git_reference_symbolic_target(head)); - - cl_assert_equal_i(true, fetch_progress_cb_was_called); - - git_reference_free(head); - git_repository_free(g_repo); - g_repo = NULL; - - cl_fixture_cleanup("./foo.git"); -} - -static int update_tips(const char *refname, const git_oid *a, const git_oid *b, void *payload) -{ - int *callcount = (int*)payload; - GIT_UNUSED(refname); GIT_UNUSED(a); GIT_UNUSED(b); - *callcount = *callcount + 1; - return 0; -} - -void test_online_clone__custom_remote_callbacks(void) -{ - int callcount = 0; - - g_options.fetch_opts.callbacks.update_tips = update_tips; - g_options.fetch_opts.callbacks.payload = &callcount; - - cl_git_pass(git_clone(&g_repo, LIVE_REPO_URL, "./foo", &g_options)); - cl_assert(callcount > 0); -} - -static int cred_failure_cb( - git_cred **cred, - const char *url, - const char *username_from_url, - unsigned int allowed_types, - void *data) -{ - GIT_UNUSED(cred); GIT_UNUSED(url); GIT_UNUSED(username_from_url); - GIT_UNUSED(allowed_types); GIT_UNUSED(data); - return -172; -} - -void test_online_clone__cred_callback_failure_return_code_is_tunnelled(void) -{ - const char *remote_url = cl_getenv("GITTEST_REMOTE_URL"); - const char *remote_user = cl_getenv("GITTEST_REMOTE_USER"); - - if (!remote_url || !remote_user) - clar__skip(); - - g_options.fetch_opts.callbacks.credentials = cred_failure_cb; - - cl_git_fail_with(-172, git_clone(&g_repo, remote_url, "./foo", &g_options)); -} - -static int cred_count_calls_cb(git_cred **cred, const char *url, const char *user, - unsigned int allowed_types, void *data) -{ - size_t *counter = (size_t *) data; - - GIT_UNUSED(url); GIT_UNUSED(user); GIT_UNUSED(allowed_types); - - if (allowed_types == GIT_CREDTYPE_USERNAME) - return git_cred_username_new(cred, "foo"); - - (*counter)++; - - if (*counter == 3) - return GIT_EUSER; - - return git_cred_userpass_plaintext_new(cred, "foo", "bar"); -} - -void test_online_clone__cred_callback_called_again_on_auth_failure(void) -{ - const char *remote_url = cl_getenv("GITTEST_REMOTE_URL"); - const char *remote_user = cl_getenv("GITTEST_REMOTE_USER"); - size_t counter = 0; - - if (!remote_url || !remote_user) - clar__skip(); - - g_options.fetch_opts.callbacks.credentials = cred_count_calls_cb; - g_options.fetch_opts.callbacks.payload = &counter; - - cl_git_fail_with(GIT_EUSER, git_clone(&g_repo, remote_url, "./foo", &g_options)); - cl_assert_equal_i(3, counter); -} - -int cred_default( - git_cred **cred, - const char *url, - const char *user_from_url, - unsigned int allowed_types, - void *payload) -{ - GIT_UNUSED(url); - GIT_UNUSED(user_from_url); - GIT_UNUSED(payload); - - if (!(allowed_types & GIT_CREDTYPE_DEFAULT)) - return 0; - - return git_cred_default_new(cred); -} - -void test_online_clone__credentials(void) -{ - /* Remote URL environment variable must be set. - * User and password are optional. - */ - const char *remote_url = cl_getenv("GITTEST_REMOTE_URL"); - git_cred_userpass_payload user_pass = { - cl_getenv("GITTEST_REMOTE_USER"), - cl_getenv("GITTEST_REMOTE_PASS") - }; - - if (!remote_url) return; - - if (cl_getenv("GITTEST_REMOTE_DEFAULT")) { - g_options.fetch_opts.callbacks.credentials = cred_default; - } else { - g_options.fetch_opts.callbacks.credentials = git_cred_userpass; - g_options.fetch_opts.callbacks.payload = &user_pass; - } - - cl_git_pass(git_clone(&g_repo, remote_url, "./foo", &g_options)); - git_repository_free(g_repo); g_repo = NULL; - cl_fixture_cleanup("./foo"); -} - -void test_online_clone__bitbucket_style(void) -{ - git_cred_userpass_payload user_pass = { - "libgit2", "libgit2" - }; - - g_options.fetch_opts.callbacks.credentials = git_cred_userpass; - g_options.fetch_opts.callbacks.payload = &user_pass; - - cl_git_pass(git_clone(&g_repo, BB_REPO_URL, "./foo", &g_options)); - git_repository_free(g_repo); g_repo = NULL; - cl_fixture_cleanup("./foo"); - - /* User and pass from URL */ - user_pass.password = "wrong"; - cl_git_pass(git_clone(&g_repo, BB_REPO_URL_WITH_PASS, "./foo", &g_options)); - git_repository_free(g_repo); g_repo = NULL; - cl_fixture_cleanup("./foo"); - - /* Wrong password in URL, fall back to user_pass */ - user_pass.password = "libgit2"; - cl_git_pass(git_clone(&g_repo, BB_REPO_URL_WITH_WRONG_PASS, "./foo", &g_options)); - git_repository_free(g_repo); g_repo = NULL; - cl_fixture_cleanup("./foo"); -} - -static int cancel_at_half(const git_transfer_progress *stats, void *payload) -{ - GIT_UNUSED(payload); - - if (stats->received_objects > (stats->total_objects/2)) - return 4321; - return 0; -} - -void test_online_clone__can_cancel(void) -{ - g_options.fetch_opts.callbacks.transfer_progress = cancel_at_half; - - cl_git_fail_with( - git_clone(&g_repo, LIVE_REPO_URL, "./foo", &g_options), 4321); -} - -static int cred_cb(git_cred **cred, const char *url, const char *user_from_url, - unsigned int allowed_types, void *payload) -{ - const char *remote_user = cl_getenv("GITTEST_REMOTE_USER"); - const char *pubkey = cl_getenv("GITTEST_REMOTE_SSH_PUBKEY"); - const char *privkey = cl_getenv("GITTEST_REMOTE_SSH_KEY"); - const char *passphrase = cl_getenv("GITTEST_REMOTE_SSH_PASSPHRASE"); - - GIT_UNUSED(url); GIT_UNUSED(user_from_url); GIT_UNUSED(payload); - - if (allowed_types & GIT_CREDTYPE_USERNAME) - return git_cred_username_new(cred, remote_user); - - if (allowed_types & GIT_CREDTYPE_SSH_KEY) - return git_cred_ssh_key_new(cred, remote_user, pubkey, privkey, passphrase); - - giterr_set(GITERR_NET, "unexpected cred type"); - return -1; -} - -static int check_ssh_auth_methods(git_cred **cred, const char *url, const char *username_from_url, - unsigned int allowed_types, void *data) -{ - int *with_user = (int *) data; - GIT_UNUSED(cred); GIT_UNUSED(url); GIT_UNUSED(username_from_url); GIT_UNUSED(data); - - if (!*with_user) - cl_assert_equal_i(GIT_CREDTYPE_USERNAME, allowed_types); - else - cl_assert(!(allowed_types & GIT_CREDTYPE_USERNAME)); - - return GIT_EUSER; -} - -void test_online_clone__ssh_auth_methods(void) -{ - int with_user; - -#ifndef GIT_SSH - clar__skip(); -#endif - g_options.fetch_opts.callbacks.credentials = check_ssh_auth_methods; - g_options.fetch_opts.callbacks.payload = &with_user; - - with_user = 0; - cl_git_fail_with(GIT_EUSER, - git_clone(&g_repo, SSH_REPO_URL, "./foo", &g_options)); - - with_user = 1; - cl_git_fail_with(GIT_EUSER, - git_clone(&g_repo, "ssh://git@github.com/libgit2/TestGitRepository", "./foo", &g_options)); -} - -static int custom_remote_ssh_with_paths( - git_remote **out, - git_repository *repo, - const char *name, - const char *url, - void *payload) -{ - int error; - - GIT_UNUSED(payload); - - if ((error = git_remote_create(out, repo, name, url)) < 0) - return error; - - return 0; -} - -void test_online_clone__ssh_with_paths(void) -{ - char *bad_paths[] = { - "/bin/yes", - "/bin/false", - }; - char *good_paths[] = { - "/usr/bin/git-upload-pack", - "/usr/bin/git-receive-pack", - }; - git_strarray arr = { - bad_paths, - 2, - }; - - const char *remote_url = cl_getenv("GITTEST_REMOTE_URL"); - const char *remote_user = cl_getenv("GITTEST_REMOTE_USER"); - -#ifndef GIT_SSH - clar__skip(); -#endif - if (!remote_url || !remote_user || strncmp(remote_url, "ssh://", 5) != 0) - clar__skip(); - - g_options.remote_cb = custom_remote_ssh_with_paths; - g_options.fetch_opts.callbacks.transport = git_transport_ssh_with_paths; - g_options.fetch_opts.callbacks.credentials = cred_cb; - g_options.fetch_opts.callbacks.payload = &arr; - - cl_git_fail(git_clone(&g_repo, remote_url, "./foo", &g_options)); - - arr.strings = good_paths; - cl_git_pass(git_clone(&g_repo, remote_url, "./foo", &g_options)); -} - -static int cred_foo_bar(git_cred **cred, const char *url, const char *username_from_url, - unsigned int allowed_types, void *data) - -{ - GIT_UNUSED(url); GIT_UNUSED(username_from_url); GIT_UNUSED(allowed_types); GIT_UNUSED(data); - - return git_cred_userpass_plaintext_new(cred, "foo", "bar"); -} - -void test_online_clone__ssh_cannot_change_username(void) -{ -#ifndef GIT_SSH - clar__skip(); -#endif - g_options.fetch_opts.callbacks.credentials = cred_foo_bar; - - cl_git_fail(git_clone(&g_repo, "ssh://git@github.com/libgit2/TestGitRepository", "./foo", &g_options)); -} - -int ssh_certificate_check(git_cert *cert, int valid, const char *host, void *payload) -{ - git_cert_hostkey *key; - git_oid expected = {{0}}, actual = {{0}}; - const char *expected_str; - - GIT_UNUSED(valid); - GIT_UNUSED(payload); - - expected_str = cl_getenv("GITTEST_REMOTE_SSH_FINGERPRINT"); - cl_assert(expected_str); - - cl_git_pass(git_oid_fromstrp(&expected, expected_str)); - cl_assert_equal_i(GIT_CERT_HOSTKEY_LIBSSH2, cert->cert_type); - key = (git_cert_hostkey *) cert; - - /* - * We need to figure out how long our input was to check for - * the type. Here we abuse the fact that both hashes fit into - * our git_oid type. - */ - if (strlen(expected_str) == 32 && key->type & GIT_CERT_SSH_MD5) { - memcpy(&actual.id, key->hash_md5, 16); - } else if (strlen(expected_str) == 40 && key->type & GIT_CERT_SSH_SHA1) { - memcpy(&actual, key->hash_sha1, 20); - } else { - cl_fail("Cannot find a usable SSH hash"); - } - - cl_assert(!memcmp(&expected, &actual, 20)); - - cl_assert_equal_s("localhost", host); - - return GIT_EUSER; -} - -void test_online_clone__ssh_cert(void) -{ - g_options.fetch_opts.callbacks.certificate_check = ssh_certificate_check; - - if (!cl_getenv("GITTEST_REMOTE_SSH_FINGERPRINT")) - cl_skip(); - - cl_git_fail_with(GIT_EUSER, git_clone(&g_repo, "ssh://localhost/foo", "./foo", &g_options)); -} - -static char *read_key_file(const char *path) -{ - FILE *f; - char *buf; - long key_length; - - if (!path || !*path) - return NULL; - - cl_assert((f = fopen(path, "r")) != NULL); - cl_assert(fseek(f, 0, SEEK_END) != -1); - cl_assert((key_length = ftell(f)) != -1); - cl_assert(fseek(f, 0, SEEK_SET) != -1); - cl_assert((buf = malloc(key_length)) != NULL); - cl_assert(fread(buf, key_length, 1, f) == 1); - fclose(f); - - return buf; -} - -static int ssh_memory_cred_cb(git_cred **cred, const char *url, const char *user_from_url, - unsigned int allowed_types, void *payload) -{ - const char *remote_user = cl_getenv("GITTEST_REMOTE_USER"); - const char *pubkey_path = cl_getenv("GITTEST_REMOTE_SSH_PUBKEY"); - const char *privkey_path = cl_getenv("GITTEST_REMOTE_SSH_KEY"); - const char *passphrase = cl_getenv("GITTEST_REMOTE_SSH_PASSPHRASE"); - - GIT_UNUSED(url); GIT_UNUSED(user_from_url); GIT_UNUSED(payload); - - if (allowed_types & GIT_CREDTYPE_USERNAME) - return git_cred_username_new(cred, remote_user); - - if (allowed_types & GIT_CREDTYPE_SSH_KEY) - { - char *pubkey = read_key_file(pubkey_path); - char *privkey = read_key_file(privkey_path); - - int ret = git_cred_ssh_key_memory_new(cred, remote_user, pubkey, privkey, passphrase); - - if (privkey) - free(privkey); - if (pubkey) - free(pubkey); - return ret; - } - - giterr_set(GITERR_NET, "unexpected cred type"); - return -1; -} - -void test_online_clone__ssh_memory_auth(void) -{ - const char *remote_url = cl_getenv("GITTEST_REMOTE_URL"); - const char *remote_user = cl_getenv("GITTEST_REMOTE_USER"); - const char *privkey = cl_getenv("GITTEST_REMOTE_SSH_KEY"); - -#ifndef GIT_SSH_MEMORY_CREDENTIALS - clar__skip(); -#endif - if (!remote_url || !remote_user || !privkey || strncmp(remote_url, "ssh://", 5) != 0) - clar__skip(); - - g_options.fetch_opts.callbacks.credentials = ssh_memory_cred_cb; - - cl_git_pass(git_clone(&g_repo, remote_url, "./foo", &g_options)); -} - -void test_online_clone__url_with_no_path_returns_EINVALIDSPEC(void) -{ - cl_git_fail_with(git_clone(&g_repo, "http://github.com", "./foo", &g_options), - GIT_EINVALIDSPEC); -} - -static int fail_certificate_check(git_cert *cert, int valid, const char *host, void *payload) -{ - GIT_UNUSED(cert); - GIT_UNUSED(valid); - GIT_UNUSED(host); - GIT_UNUSED(payload); - - return GIT_ECERTIFICATE; -} - -void test_online_clone__certificate_invalid(void) -{ - g_options.fetch_opts.callbacks.certificate_check = fail_certificate_check; - - cl_git_fail_with(git_clone(&g_repo, "https://github.com/libgit2/TestGitRepository", "./foo", &g_options), - GIT_ECERTIFICATE); - -#ifdef GIT_SSH - cl_git_fail_with(git_clone(&g_repo, "ssh://github.com/libgit2/TestGitRepository", "./foo", &g_options), - GIT_ECERTIFICATE); -#endif -} - -static int succeed_certificate_check(git_cert *cert, int valid, const char *host, void *payload) -{ - GIT_UNUSED(cert); - GIT_UNUSED(valid); - GIT_UNUSED(payload); - - cl_assert_equal_s("github.com", host); - - return 0; -} - -void test_online_clone__certificate_valid(void) -{ - g_options.fetch_opts.callbacks.certificate_check = succeed_certificate_check; - - cl_git_pass(git_clone(&g_repo, "https://github.com/libgit2/TestGitRepository", "./foo", &g_options)); -} - -void test_online_clone__start_with_http(void) -{ - g_options.fetch_opts.callbacks.certificate_check = succeed_certificate_check; - - cl_git_pass(git_clone(&g_repo, "http://github.com/libgit2/TestGitRepository", "./foo", &g_options)); -} diff --git a/vendor/libgit2/tests/online/fetch.c b/vendor/libgit2/tests/online/fetch.c deleted file mode 100644 index 72e7c24e3c..0000000000 --- a/vendor/libgit2/tests/online/fetch.c +++ /dev/null @@ -1,209 +0,0 @@ -#include "clar_libgit2.h" - -static git_repository *_repo; -static int counter; - -void test_online_fetch__initialize(void) -{ - cl_git_pass(git_repository_init(&_repo, "./fetch", 0)); -} - -void test_online_fetch__cleanup(void) -{ - git_repository_free(_repo); - _repo = NULL; - - cl_fixture_cleanup("./fetch"); -} - -static int update_tips(const char *refname, const git_oid *a, const git_oid *b, void *data) -{ - GIT_UNUSED(refname); GIT_UNUSED(a); GIT_UNUSED(b); GIT_UNUSED(data); - - ++counter; - - return 0; -} - -static int progress(const git_transfer_progress *stats, void *payload) -{ - size_t *bytes_received = (size_t *)payload; - *bytes_received = stats->received_bytes; - return 0; -} - -static void do_fetch(const char *url, git_remote_autotag_option_t flag, int n) -{ - git_remote *remote; - git_fetch_options options = GIT_FETCH_OPTIONS_INIT; - size_t bytes_received = 0; - - options.callbacks.transfer_progress = progress; - options.callbacks.update_tips = update_tips; - options.callbacks.payload = &bytes_received; - options.download_tags = flag; - counter = 0; - - cl_git_pass(git_remote_create(&remote, _repo, "test", url)); - cl_git_pass(git_remote_fetch(remote, NULL, &options, NULL)); - cl_assert_equal_i(counter, n); - cl_assert(bytes_received > 0); - - git_remote_free(remote); -} - -void test_online_fetch__default_git(void) -{ - do_fetch("git://github.com/libgit2/TestGitRepository.git", GIT_REMOTE_DOWNLOAD_TAGS_AUTO, 6); -} - -void test_online_fetch__default_http(void) -{ - do_fetch("http://github.com/libgit2/TestGitRepository.git", GIT_REMOTE_DOWNLOAD_TAGS_AUTO, 6); -} - -void test_online_fetch__default_https(void) -{ - do_fetch("https://github.com/libgit2/TestGitRepository.git", GIT_REMOTE_DOWNLOAD_TAGS_AUTO, 6); -} - -void test_online_fetch__no_tags_git(void) -{ - do_fetch("git://github.com/libgit2/TestGitRepository.git", GIT_REMOTE_DOWNLOAD_TAGS_NONE, 3); -} - -void test_online_fetch__no_tags_http(void) -{ - do_fetch("http://github.com/libgit2/TestGitRepository.git", GIT_REMOTE_DOWNLOAD_TAGS_NONE, 3); -} - -void test_online_fetch__fetch_twice(void) -{ - git_remote *remote; - cl_git_pass(git_remote_create(&remote, _repo, "test", "git://github.com/libgit2/TestGitRepository.git")); - cl_git_pass(git_remote_connect(remote, GIT_DIRECTION_FETCH, NULL)); - cl_git_pass(git_remote_download(remote, NULL, NULL)); - git_remote_disconnect(remote); - - git_remote_connect(remote, GIT_DIRECTION_FETCH, NULL); - cl_git_pass(git_remote_download(remote, NULL, NULL)); - git_remote_disconnect(remote); - - git_remote_free(remote); -} - -static int transferProgressCallback(const git_transfer_progress *stats, void *payload) -{ - bool *invoked = (bool *)payload; - - GIT_UNUSED(stats); - *invoked = true; - return 0; -} - -void test_online_fetch__doesnt_retrieve_a_pack_when_the_repository_is_up_to_date(void) -{ - git_repository *_repository; - bool invoked = false; - git_remote *remote; - git_fetch_options options = GIT_FETCH_OPTIONS_INIT; - git_clone_options opts = GIT_CLONE_OPTIONS_INIT; - opts.bare = true; - - cl_git_pass(git_clone(&_repository, "https://github.com/libgit2/TestGitRepository.git", - "./fetch/lg2", &opts)); - git_repository_free(_repository); - - cl_git_pass(git_repository_open(&_repository, "./fetch/lg2")); - - cl_git_pass(git_remote_lookup(&remote, _repository, "origin")); - cl_git_pass(git_remote_connect(remote, GIT_DIRECTION_FETCH, NULL)); - - cl_assert_equal_i(false, invoked); - - options.callbacks.transfer_progress = &transferProgressCallback; - options.callbacks.payload = &invoked; - cl_git_pass(git_remote_download(remote, NULL, &options)); - - cl_assert_equal_i(false, invoked); - - cl_git_pass(git_remote_update_tips(remote, &options.callbacks, 1, options.download_tags, NULL)); - git_remote_disconnect(remote); - - git_remote_free(remote); - git_repository_free(_repository); -} - -static int cancel_at_half(const git_transfer_progress *stats, void *payload) -{ - GIT_UNUSED(payload); - - if (stats->received_objects > (stats->total_objects/2)) - return -4321; - return 0; -} - -void test_online_fetch__can_cancel(void) -{ - git_remote *remote; - size_t bytes_received = 0; - git_fetch_options options = GIT_FETCH_OPTIONS_INIT; - - cl_git_pass(git_remote_create(&remote, _repo, "test", - "http://github.com/libgit2/TestGitRepository.git")); - - options.callbacks.transfer_progress = cancel_at_half; - options.callbacks.payload = &bytes_received; - - cl_git_pass(git_remote_connect(remote, GIT_DIRECTION_FETCH, NULL)); - cl_git_fail_with(git_remote_download(remote, NULL, &options), -4321); - git_remote_disconnect(remote); - git_remote_free(remote); -} - -void test_online_fetch__ls_disconnected(void) -{ - const git_remote_head **refs; - size_t refs_len_before, refs_len_after; - git_remote *remote; - - cl_git_pass(git_remote_create(&remote, _repo, "test", - "http://github.com/libgit2/TestGitRepository.git")); - cl_git_pass(git_remote_connect(remote, GIT_DIRECTION_FETCH, NULL)); - cl_git_pass(git_remote_ls(&refs, &refs_len_before, remote)); - git_remote_disconnect(remote); - cl_git_pass(git_remote_ls(&refs, &refs_len_after, remote)); - - cl_assert_equal_i(refs_len_before, refs_len_after); - - git_remote_free(remote); -} - -void test_online_fetch__remote_symrefs(void) -{ - const git_remote_head **refs; - size_t refs_len; - git_remote *remote; - - cl_git_pass(git_remote_create(&remote, _repo, "test", - "http://github.com/libgit2/TestGitRepository.git")); - cl_git_pass(git_remote_connect(remote, GIT_DIRECTION_FETCH, NULL)); - git_remote_disconnect(remote); - cl_git_pass(git_remote_ls(&refs, &refs_len, remote)); - - cl_assert_equal_s("HEAD", refs[0]->name); - cl_assert_equal_s("refs/heads/master", refs[0]->symref_target); - - git_remote_free(remote); -} - -void test_online_fetch__twice(void) -{ - git_remote *remote; - - cl_git_pass(git_remote_create(&remote, _repo, "test", "http://github.com/libgit2/TestGitRepository.git")); - cl_git_pass(git_remote_fetch(remote, NULL, NULL, NULL)); - cl_git_pass(git_remote_fetch(remote, NULL, NULL, NULL)); - - git_remote_free(remote); -} diff --git a/vendor/libgit2/tests/online/fetchhead.c b/vendor/libgit2/tests/online/fetchhead.c deleted file mode 100644 index 200edacfd8..0000000000 --- a/vendor/libgit2/tests/online/fetchhead.c +++ /dev/null @@ -1,103 +0,0 @@ -#include "clar_libgit2.h" - -#include "fileops.h" -#include "fetchhead.h" -#include "../fetchhead/fetchhead_data.h" -#include "git2/clone.h" - -#define LIVE_REPO_URL "git://github.com/libgit2/TestGitRepository" - -static git_repository *g_repo; -static git_clone_options g_options; - -void test_online_fetchhead__initialize(void) -{ - git_fetch_options dummy_fetch = GIT_FETCH_OPTIONS_INIT; - g_repo = NULL; - - memset(&g_options, 0, sizeof(git_clone_options)); - g_options.version = GIT_CLONE_OPTIONS_VERSION; - g_options.fetch_opts = dummy_fetch; -} - -void test_online_fetchhead__cleanup(void) -{ - if (g_repo) { - git_repository_free(g_repo); - g_repo = NULL; - } - - cl_fixture_cleanup("./foo"); -} - -static void fetchhead_test_clone(void) -{ - cl_git_pass(git_clone(&g_repo, LIVE_REPO_URL, "./foo", &g_options)); -} - -static void fetchhead_test_fetch(const char *fetchspec, const char *expected_fetchhead) -{ - git_remote *remote; - git_fetch_options fetch_opts = GIT_FETCH_OPTIONS_INIT; - git_buf fetchhead_buf = GIT_BUF_INIT; - int equals = 0; - git_strarray array, *active_refs = NULL; - - cl_git_pass(git_remote_lookup(&remote, g_repo, "origin")); - fetch_opts.download_tags = GIT_REMOTE_DOWNLOAD_TAGS_AUTO; - - if(fetchspec != NULL) { - array.count = 1; - array.strings = (char **) &fetchspec; - active_refs = &array; - } - - cl_git_pass(git_remote_fetch(remote, active_refs, &fetch_opts, NULL)); - git_remote_free(remote); - - cl_git_pass(git_futils_readbuffer(&fetchhead_buf, "./foo/.git/FETCH_HEAD")); - - equals = (strcmp(fetchhead_buf.ptr, expected_fetchhead) == 0); - - git_buf_free(&fetchhead_buf); - - cl_assert(equals); -} - -void test_online_fetchhead__wildcard_spec(void) -{ - fetchhead_test_clone(); - fetchhead_test_fetch(NULL, FETCH_HEAD_WILDCARD_DATA2); - cl_git_pass(git_tag_delete(g_repo, "annotated_tag")); - cl_git_pass(git_tag_delete(g_repo, "blob")); - cl_git_pass(git_tag_delete(g_repo, "commit_tree")); - cl_git_pass(git_tag_delete(g_repo, "nearly-dangling")); - fetchhead_test_fetch(NULL, FETCH_HEAD_WILDCARD_DATA); -} - -void test_online_fetchhead__explicit_spec(void) -{ - fetchhead_test_clone(); - fetchhead_test_fetch("refs/heads/first-merge:refs/remotes/origin/first-merge", FETCH_HEAD_EXPLICIT_DATA); -} - -void test_online_fetchhead__no_merges(void) -{ - git_config *config; - - fetchhead_test_clone(); - - cl_git_pass(git_repository_config(&config, g_repo)); - cl_git_pass(git_config_delete_entry(config, "branch.master.remote")); - cl_git_pass(git_config_delete_entry(config, "branch.master.merge")); - git_config_free(config); - - fetchhead_test_fetch(NULL, FETCH_HEAD_NO_MERGE_DATA2); - cl_git_pass(git_tag_delete(g_repo, "annotated_tag")); - cl_git_pass(git_tag_delete(g_repo, "blob")); - cl_git_pass(git_tag_delete(g_repo, "commit_tree")); - cl_git_pass(git_tag_delete(g_repo, "nearly-dangling")); - fetchhead_test_fetch(NULL, FETCH_HEAD_NO_MERGE_DATA); - cl_git_pass(git_tag_delete(g_repo, "commit_tree")); - fetchhead_test_fetch(NULL, FETCH_HEAD_NO_MERGE_DATA3); -} diff --git a/vendor/libgit2/tests/online/push.c b/vendor/libgit2/tests/online/push.c deleted file mode 100644 index 6cd444320d..0000000000 --- a/vendor/libgit2/tests/online/push.c +++ /dev/null @@ -1,898 +0,0 @@ -#include "clar_libgit2.h" -#include "buffer.h" -#include "posix.h" -#include "vector.h" -#include "../submodule/submodule_helpers.h" -#include "push_util.h" -#include "refspec.h" -#include "remote.h" - -static git_repository *_repo; - -static char *_remote_url; - -static char *_remote_ssh_key; -static char *_remote_ssh_pubkey; -static char *_remote_ssh_passphrase; - -static char *_remote_user; -static char *_remote_pass; - -static char *_remote_default; - -static int cred_acquire_cb(git_cred **, const char *, const char *, unsigned int, void *); - -static git_remote *_remote; -static record_callbacks_data _record_cbs_data = {{ 0 }}; -static git_remote_callbacks _record_cbs = RECORD_CALLBACKS_INIT(&_record_cbs_data); - -static git_oid _oid_b6; -static git_oid _oid_b5; -static git_oid _oid_b4; -static git_oid _oid_b3; -static git_oid _oid_b2; -static git_oid _oid_b1; - -static git_oid _tag_commit; -static git_oid _tag_tree; -static git_oid _tag_blob; -static git_oid _tag_lightweight; -static git_oid _tag_tag; - -static int cred_acquire_cb( - git_cred **cred, - const char *url, - const char *user_from_url, - unsigned int allowed_types, - void *payload) -{ - GIT_UNUSED(url); - GIT_UNUSED(user_from_url); - GIT_UNUSED(payload); - - if (GIT_CREDTYPE_USERNAME & allowed_types) { - if (!_remote_user) { - printf("GITTEST_REMOTE_USER must be set\n"); - return -1; - } - - return git_cred_username_new(cred, _remote_user); - } - - if (GIT_CREDTYPE_DEFAULT & allowed_types) { - if (!_remote_default) { - printf("GITTEST_REMOTE_DEFAULT must be set to use NTLM/Negotiate credentials\n"); - return -1; - } - - return git_cred_default_new(cred); - } - - if (GIT_CREDTYPE_SSH_KEY & allowed_types) { - if (!_remote_user || !_remote_ssh_pubkey || !_remote_ssh_key || !_remote_ssh_passphrase) { - printf("GITTEST_REMOTE_USER, GITTEST_REMOTE_SSH_PUBKEY, GITTEST_REMOTE_SSH_KEY and GITTEST_REMOTE_SSH_PASSPHRASE must be set\n"); - return -1; - } - - return git_cred_ssh_key_new(cred, _remote_user, _remote_ssh_pubkey, _remote_ssh_key, _remote_ssh_passphrase); - } - - if (GIT_CREDTYPE_USERPASS_PLAINTEXT & allowed_types) { - if (!_remote_user || !_remote_pass) { - printf("GITTEST_REMOTE_USER and GITTEST_REMOTE_PASS must be set\n"); - return -1; - } - - return git_cred_userpass_plaintext_new(cred, _remote_user, _remote_pass); - } - - return -1; -} - -/** - * git_push_status_foreach callback that records status entries. - * @param data (git_vector *) of push_status instances - */ -static int record_push_status_cb(const char *ref, const char *msg, void *payload) -{ - record_callbacks_data *data = (record_callbacks_data *) payload; - push_status *s; - - cl_assert(s = git__calloc(1, sizeof(*s))); - if (ref) - cl_assert(s->ref = git__strdup(ref)); - s->success = (msg == NULL); - if (msg) - cl_assert(s->msg = git__strdup(msg)); - - git_vector_insert(&data->statuses, s); - - return 0; -} - -static void do_verify_push_status(record_callbacks_data *data, const push_status expected[], const size_t expected_len) -{ - git_vector *actual = &data->statuses; - push_status *iter; - bool failed = false; - size_t i; - - if (expected_len != actual->length) - failed = true; - else - git_vector_foreach(actual, i, iter) - if (strcmp(expected[i].ref, iter->ref) || - (expected[i].success != iter->success) || - (expected[i].msg && (!iter->msg || strcmp(expected[i].msg, iter->msg)))) { - failed = true; - break; - } - - if (failed) { - git_buf msg = GIT_BUF_INIT; - - git_buf_puts(&msg, "Expected and actual push statuses differ:\nEXPECTED:\n"); - - for(i = 0; i < expected_len; i++) { - git_buf_printf(&msg, "%s: %s\n", - expected[i].ref, - expected[i].success ? "success" : "failed"); - } - - git_buf_puts(&msg, "\nACTUAL:\n"); - - git_vector_foreach(actual, i, iter) { - if (iter->success) - git_buf_printf(&msg, "%s: success\n", iter->ref); - else - git_buf_printf(&msg, "%s: failed with message: %s", iter->ref, iter->msg); - } - - cl_fail(git_buf_cstr(&msg)); - - git_buf_free(&msg); - } - - git_vector_foreach(actual, i, iter) - git__free(iter); - - git_vector_free(actual); -} - -/** - * Verifies that after git_push_finish(), refs on a remote have the expected - * names, oids, and order. - * - * @param remote remote to verify - * @param expected_refs expected remote refs after push - * @param expected_refs_len length of expected_refs - */ -static void verify_refs(git_remote *remote, expected_ref expected_refs[], size_t expected_refs_len) -{ - const git_remote_head **actual_refs; - size_t actual_refs_len; - - git_remote_ls(&actual_refs, &actual_refs_len, remote); - verify_remote_refs(actual_refs, actual_refs_len, expected_refs, expected_refs_len); -} - -/** - * Verifies that after git_push_update_tips(), remote tracking branches have the expected - * names and oids. - * - * @param remote remote to verify - * @param expected_refs expected remote refs after push - * @param expected_refs_len length of expected_refs - */ -static void verify_tracking_branches(git_remote *remote, expected_ref expected_refs[], size_t expected_refs_len) -{ - git_refspec *fetch_spec; - size_t i, j; - git_buf msg = GIT_BUF_INIT; - git_buf ref_name = GIT_BUF_INIT; - git_vector actual_refs = GIT_VECTOR_INIT; - git_branch_iterator *iter; - char *actual_ref; - git_oid oid; - int failed = 0, error; - git_branch_t branch_type; - git_reference *ref; - - /* Get current remote-tracking branches */ - cl_git_pass(git_branch_iterator_new(&iter, remote->repo, GIT_BRANCH_REMOTE)); - - while ((error = git_branch_next(&ref, &branch_type, iter)) == 0) { - cl_assert_equal_i(branch_type, GIT_BRANCH_REMOTE); - - cl_git_pass(git_vector_insert(&actual_refs, git__strdup(git_reference_name(ref)))); - - git_reference_free(ref); - } - - cl_assert_equal_i(error, GIT_ITEROVER); - git_branch_iterator_free(iter); - - /* Loop through expected refs, make sure they exist */ - for (i = 0; i < expected_refs_len; i++) { - - /* Convert remote reference name into remote-tracking branch name. - * If the spec is not under refs/heads/, then skip. - */ - fetch_spec = git_remote__matching_refspec(remote, expected_refs[i].name); - if (!fetch_spec) - continue; - - cl_git_pass(git_refspec_transform(&ref_name, fetch_spec, expected_refs[i].name)); - - /* Find matching remote branch */ - git_vector_foreach(&actual_refs, j, actual_ref) { - if (!strcmp(git_buf_cstr(&ref_name), actual_ref)) - break; - } - - if (j == actual_refs.length) { - git_buf_printf(&msg, "Did not find expected tracking branch '%s'.", git_buf_cstr(&ref_name)); - failed = 1; - goto failed; - } - - /* Make sure tracking branch is at expected commit ID */ - cl_git_pass(git_reference_name_to_id(&oid, remote->repo, actual_ref)); - - if (git_oid_cmp(expected_refs[i].oid, &oid) != 0) { - git_buf_puts(&msg, "Tracking branch commit does not match expected ID."); - failed = 1; - goto failed; - } - - git__free(actual_ref); - cl_git_pass(git_vector_remove(&actual_refs, j)); - } - - /* Make sure there are no extra branches */ - if (actual_refs.length > 0) { - git_buf_puts(&msg, "Unexpected remote tracking branches exist."); - failed = 1; - goto failed; - } - -failed: - if (failed) - cl_fail(git_buf_cstr(&msg)); - - git_vector_foreach(&actual_refs, i, actual_ref) - git__free(actual_ref); - - git_vector_free(&actual_refs); - git_buf_free(&msg); - git_buf_free(&ref_name); -} - -static void verify_update_tips_callback(git_remote *remote, expected_ref expected_refs[], size_t expected_refs_len) -{ - git_refspec *fetch_spec; - git_buf msg = GIT_BUF_INIT; - git_buf ref_name = GIT_BUF_INIT; - updated_tip *tip = NULL; - size_t i, j; - int failed = 0; - - for (i = 0; i < expected_refs_len; ++i) { - /* Convert remote reference name into tracking branch name. - * If the spec is not under refs/heads/, then skip. - */ - fetch_spec = git_remote__matching_refspec(remote, expected_refs[i].name); - if (!fetch_spec) - continue; - - cl_git_pass(git_refspec_transform(&ref_name, fetch_spec, expected_refs[i].name)); - - /* Find matching update_tip entry */ - git_vector_foreach(&_record_cbs_data.updated_tips, j, tip) { - if (!strcmp(git_buf_cstr(&ref_name), tip->name)) - break; - } - - if (j == _record_cbs_data.updated_tips.length) { - git_buf_printf(&msg, "Did not find expected updated tip entry for branch '%s'.", git_buf_cstr(&ref_name)); - failed = 1; - goto failed; - } - - if (git_oid_cmp(expected_refs[i].oid, tip->new_oid) != 0) { - git_buf_printf(&msg, "Updated tip ID does not match expected ID"); - failed = 1; - goto failed; - } - } - -failed: - if (failed) - cl_fail(git_buf_cstr(&msg)); - - git_buf_free(&ref_name); - git_buf_free(&msg); -} - -void test_online_push__initialize(void) -{ - git_vector delete_specs = GIT_VECTOR_INIT; - const git_remote_head **heads; - size_t heads_len; - git_push_options push_opts = GIT_PUSH_OPTIONS_INIT; - git_fetch_options fetch_opts = GIT_FETCH_OPTIONS_INIT; - - _repo = cl_git_sandbox_init("push_src"); - - cl_git_pass(git_repository_set_ident(_repo, "Random J. Hacker", "foo@example.com")); - cl_fixture_sandbox("testrepo.git"); - cl_rename("push_src/submodule/.gitted", "push_src/submodule/.git"); - - rewrite_gitmodules(git_repository_workdir(_repo)); - - /* git log --format=oneline --decorate --graph - * *-. 951bbbb90e2259a4c8950db78946784fb53fcbce (HEAD, b6) merge b3, b4, and b5 to b6 - * |\ \ - * | | * fa38b91f199934685819bea316186d8b008c52a2 (b5) added submodule named 'submodule' pointing to '../testrepo.git' - * | * | 27b7ce66243eb1403862d05f958c002312df173d (b4) edited fold\b.txt - * | |/ - * * | d9b63a88223d8367516f50bd131a5f7349b7f3e4 (b3) edited a.txt - * |/ - * * a78705c3b2725f931d3ee05348d83cc26700f247 (b2, b1) added fold and fold/b.txt - * * 5c0bb3d1b9449d1cc69d7519fd05166f01840915 added a.txt - */ - git_oid_fromstr(&_oid_b6, "951bbbb90e2259a4c8950db78946784fb53fcbce"); - git_oid_fromstr(&_oid_b5, "fa38b91f199934685819bea316186d8b008c52a2"); - git_oid_fromstr(&_oid_b4, "27b7ce66243eb1403862d05f958c002312df173d"); - git_oid_fromstr(&_oid_b3, "d9b63a88223d8367516f50bd131a5f7349b7f3e4"); - git_oid_fromstr(&_oid_b2, "a78705c3b2725f931d3ee05348d83cc26700f247"); - git_oid_fromstr(&_oid_b1, "a78705c3b2725f931d3ee05348d83cc26700f247"); - - git_oid_fromstr(&_tag_commit, "805c54522e614f29f70d2413a0470247d8b424ac"); - git_oid_fromstr(&_tag_tree, "ff83aa4c5e5d28e3bcba2f5c6e2adc61286a4e5e"); - git_oid_fromstr(&_tag_blob, "b483ae7ba66decee9aee971f501221dea84b1498"); - git_oid_fromstr(&_tag_lightweight, "951bbbb90e2259a4c8950db78946784fb53fcbce"); - git_oid_fromstr(&_tag_tag, "eea4f2705eeec2db3813f2430829afce99cd00b5"); - - /* Remote URL environment variable must be set. User and password are optional. */ - _remote_url = cl_getenv("GITTEST_REMOTE_URL"); - _remote_user = cl_getenv("GITTEST_REMOTE_USER"); - _remote_pass = cl_getenv("GITTEST_REMOTE_PASS"); - _remote_ssh_key = cl_getenv("GITTEST_REMOTE_SSH_KEY"); - _remote_ssh_pubkey = cl_getenv("GITTEST_REMOTE_SSH_PUBKEY"); - _remote_ssh_passphrase = cl_getenv("GITTEST_REMOTE_SSH_PASSPHRASE"); - _remote_default = cl_getenv("GITTEST_REMOTE_DEFAULT"); - _remote = NULL; - - /* Skip the test if we're missing the remote URL */ - if (!_remote_url) - cl_skip(); - - cl_git_pass(git_remote_create(&_remote, _repo, "test", _remote_url)); - - record_callbacks_data_clear(&_record_cbs_data); - - cl_git_pass(git_remote_connect(_remote, GIT_DIRECTION_PUSH, &_record_cbs)); - - /* Clean up previously pushed branches. Fails if receive.denyDeletes is - * set on the remote. Also, on Git 1.7.0 and newer, you must run - * 'git config receive.denyDeleteCurrent ignore' in the remote repo in - * order to delete the remote branch pointed to by HEAD (usually master). - * See: https://raw.github.com/git/git/master/Documentation/RelNotes/1.7.0.txt - */ - cl_git_pass(git_remote_ls(&heads, &heads_len, _remote)); - cl_git_pass(create_deletion_refspecs(&delete_specs, heads, heads_len)); - if (delete_specs.length) { - git_strarray arr = { - (char **) delete_specs.contents, - delete_specs.length, - }; - - memcpy(&push_opts.callbacks, &_record_cbs, sizeof(git_remote_callbacks)); - cl_git_pass(git_remote_upload(_remote, &arr, &push_opts)); - } - - git_remote_disconnect(_remote); - git_vector_free(&delete_specs); - - /* Now that we've deleted everything, fetch from the remote */ - memcpy(&fetch_opts.callbacks, &_record_cbs, sizeof(git_remote_callbacks)); - cl_git_pass(git_remote_fetch(_remote, NULL, &fetch_opts, NULL)); -} - -void test_online_push__cleanup(void) -{ - if (_remote) - git_remote_free(_remote); - _remote = NULL; - - /* Freed by cl_git_sandbox_cleanup */ - _repo = NULL; - - record_callbacks_data_clear(&_record_cbs_data); - - cl_fixture_cleanup("testrepo.git"); - cl_git_sandbox_cleanup(); -} - -static int push_pack_progress_cb( - int stage, unsigned int current, unsigned int total, void* payload) -{ - record_callbacks_data *data = (record_callbacks_data *) payload; - GIT_UNUSED(stage); GIT_UNUSED(current); GIT_UNUSED(total); - if (data->pack_progress_calls < 0) - return data->pack_progress_calls; - - data->pack_progress_calls++; - return 0; -} - -static int push_transfer_progress_cb( - unsigned int current, unsigned int total, size_t bytes, void* payload) -{ - record_callbacks_data *data = (record_callbacks_data *) payload; - GIT_UNUSED(current); GIT_UNUSED(total); GIT_UNUSED(bytes); - if (data->transfer_progress_calls < 0) - return data->transfer_progress_calls; - - data->transfer_progress_calls++; - return 0; -} - -/** - * Calls push and relists refs on remote to verify success. - * - * @param refspecs refspecs to push - * @param refspecs_len length of refspecs - * @param expected_refs expected remote refs after push - * @param expected_refs_len length of expected_refs - * @param expected_ret expected return value from git_push_finish() - * @param check_progress_cb Check that the push progress callbacks are called - */ -static void do_push( - const char *refspecs[], size_t refspecs_len, - push_status expected_statuses[], size_t expected_statuses_len, - expected_ref expected_refs[], size_t expected_refs_len, - int expected_ret, int check_progress_cb, int check_update_tips_cb) -{ - git_push_options opts = GIT_PUSH_OPTIONS_INIT; - size_t i; - int error; - git_strarray specs = {0}; - record_callbacks_data *data; - - if (_remote) { - /* Auto-detect the number of threads to use */ - opts.pb_parallelism = 0; - - memcpy(&opts.callbacks, &_record_cbs, sizeof(git_remote_callbacks)); - data = opts.callbacks.payload; - - opts.callbacks.pack_progress = push_pack_progress_cb; - opts.callbacks.push_transfer_progress = push_transfer_progress_cb; - opts.callbacks.push_update_reference = record_push_status_cb; - - if (refspecs_len) { - specs.count = refspecs_len; - specs.strings = git__calloc(refspecs_len, sizeof(char *)); - cl_assert(specs.strings); - } - - for (i = 0; i < refspecs_len; i++) - specs.strings[i] = (char *) refspecs[i]; - - /* if EUSER, then abort in transfer */ - if (check_progress_cb && expected_ret == GIT_EUSER) - data->transfer_progress_calls = GIT_EUSER; - - error = git_remote_push(_remote, &specs, &opts); - git__free(specs.strings); - - if (expected_ret < 0) { - cl_git_fail_with(expected_ret, error); - } else { - cl_git_pass(error); - } - - if (check_progress_cb && expected_ret == 0) { - cl_assert(data->pack_progress_calls > 0); - cl_assert(data->transfer_progress_calls > 0); - } - - do_verify_push_status(data, expected_statuses, expected_statuses_len); - - verify_refs(_remote, expected_refs, expected_refs_len); - verify_tracking_branches(_remote, expected_refs, expected_refs_len); - - if (check_update_tips_cb) - verify_update_tips_callback(_remote, expected_refs, expected_refs_len); - - } - -} - -/* Call push_finish() without ever calling git_push_add_refspec() */ -void test_online_push__noop(void) -{ - do_push(NULL, 0, NULL, 0, NULL, 0, 0, 0, 1); -} - -void test_online_push__b1(void) -{ - const char *specs[] = { "refs/heads/b1:refs/heads/b1" }; - push_status exp_stats[] = { { "refs/heads/b1", 1 } }; - expected_ref exp_refs[] = { { "refs/heads/b1", &_oid_b1 } }; - do_push(specs, ARRAY_SIZE(specs), - exp_stats, ARRAY_SIZE(exp_stats), - exp_refs, ARRAY_SIZE(exp_refs), 0, 1, 1); -} - -void test_online_push__b2(void) -{ - const char *specs[] = { "refs/heads/b2:refs/heads/b2" }; - push_status exp_stats[] = { { "refs/heads/b2", 1 } }; - expected_ref exp_refs[] = { { "refs/heads/b2", &_oid_b2 } }; - do_push(specs, ARRAY_SIZE(specs), - exp_stats, ARRAY_SIZE(exp_stats), - exp_refs, ARRAY_SIZE(exp_refs), 0, 1, 1); -} - -void test_online_push__b3(void) -{ - const char *specs[] = { "refs/heads/b3:refs/heads/b3" }; - push_status exp_stats[] = { { "refs/heads/b3", 1 } }; - expected_ref exp_refs[] = { { "refs/heads/b3", &_oid_b3 } }; - do_push(specs, ARRAY_SIZE(specs), - exp_stats, ARRAY_SIZE(exp_stats), - exp_refs, ARRAY_SIZE(exp_refs), 0, 1, 1); -} - -void test_online_push__b4(void) -{ - const char *specs[] = { "refs/heads/b4:refs/heads/b4" }; - push_status exp_stats[] = { { "refs/heads/b4", 1 } }; - expected_ref exp_refs[] = { { "refs/heads/b4", &_oid_b4 } }; - do_push(specs, ARRAY_SIZE(specs), - exp_stats, ARRAY_SIZE(exp_stats), - exp_refs, ARRAY_SIZE(exp_refs), 0, 1, 1); -} - -void test_online_push__b5(void) -{ - const char *specs[] = { "refs/heads/b5:refs/heads/b5" }; - push_status exp_stats[] = { { "refs/heads/b5", 1 } }; - expected_ref exp_refs[] = { { "refs/heads/b5", &_oid_b5 } }; - do_push(specs, ARRAY_SIZE(specs), - exp_stats, ARRAY_SIZE(exp_stats), - exp_refs, ARRAY_SIZE(exp_refs), 0, 1, 1); -} - -void test_online_push__b5_cancel(void) -{ - const char *specs[] = { "refs/heads/b5:refs/heads/b5" }; - do_push(specs, ARRAY_SIZE(specs), NULL, 0, NULL, 0, GIT_EUSER, 1, 1); -} - -void test_online_push__multi(void) -{ - git_reflog *log; - const git_reflog_entry *entry; - - const char *specs[] = { - "refs/heads/b1:refs/heads/b1", - "refs/heads/b2:refs/heads/b2", - "refs/heads/b3:refs/heads/b3", - "refs/heads/b4:refs/heads/b4", - "refs/heads/b5:refs/heads/b5" - }; - push_status exp_stats[] = { - { "refs/heads/b1", 1 }, - { "refs/heads/b2", 1 }, - { "refs/heads/b3", 1 }, - { "refs/heads/b4", 1 }, - { "refs/heads/b5", 1 } - }; - expected_ref exp_refs[] = { - { "refs/heads/b1", &_oid_b1 }, - { "refs/heads/b2", &_oid_b2 }, - { "refs/heads/b3", &_oid_b3 }, - { "refs/heads/b4", &_oid_b4 }, - { "refs/heads/b5", &_oid_b5 } - }; - do_push(specs, ARRAY_SIZE(specs), - exp_stats, ARRAY_SIZE(exp_stats), - exp_refs, ARRAY_SIZE(exp_refs), 0, 1, 1); - - cl_git_pass(git_reflog_read(&log, _repo, "refs/remotes/test/b1")); - entry = git_reflog_entry_byindex(log, 0); - if (entry) { - cl_assert_equal_s("update by push", git_reflog_entry_message(entry)); - cl_assert_equal_s("foo@example.com", git_reflog_entry_committer(entry)->email); - } - - git_reflog_free(log); -} - -void test_online_push__implicit_tgt(void) -{ - const char *specs1[] = { "refs/heads/b1" }; - push_status exp_stats1[] = { { "refs/heads/b1", 1 } }; - expected_ref exp_refs1[] = { { "refs/heads/b1", &_oid_b1 } }; - - const char *specs2[] = { "refs/heads/b2" }; - push_status exp_stats2[] = { { "refs/heads/b2", 1 } }; - expected_ref exp_refs2[] = { - { "refs/heads/b1", &_oid_b1 }, - { "refs/heads/b2", &_oid_b2 } - }; - - do_push(specs1, ARRAY_SIZE(specs1), - exp_stats1, ARRAY_SIZE(exp_stats1), - exp_refs1, ARRAY_SIZE(exp_refs1), 0, 1, 1); - do_push(specs2, ARRAY_SIZE(specs2), - exp_stats2, ARRAY_SIZE(exp_stats2), - exp_refs2, ARRAY_SIZE(exp_refs2), 0, 0, 0); -} - -void test_online_push__fast_fwd(void) -{ - /* Fast forward b1 in tgt from _oid_b1 to _oid_b6. */ - - const char *specs_init[] = { "refs/heads/b1:refs/heads/b1" }; - push_status exp_stats_init[] = { { "refs/heads/b1", 1 } }; - expected_ref exp_refs_init[] = { { "refs/heads/b1", &_oid_b1 } }; - - const char *specs_ff[] = { "refs/heads/b6:refs/heads/b1" }; - push_status exp_stats_ff[] = { { "refs/heads/b1", 1 } }; - expected_ref exp_refs_ff[] = { { "refs/heads/b1", &_oid_b6 } }; - - /* Do a force push to reset b1 in target back to _oid_b1 */ - const char *specs_reset[] = { "+refs/heads/b1:refs/heads/b1" }; - /* Force should have no effect on a fast forward push */ - const char *specs_ff_force[] = { "+refs/heads/b6:refs/heads/b1" }; - - do_push(specs_init, ARRAY_SIZE(specs_init), - exp_stats_init, ARRAY_SIZE(exp_stats_init), - exp_refs_init, ARRAY_SIZE(exp_refs_init), 0, 1, 1); - - do_push(specs_ff, ARRAY_SIZE(specs_ff), - exp_stats_ff, ARRAY_SIZE(exp_stats_ff), - exp_refs_ff, ARRAY_SIZE(exp_refs_ff), 0, 0, 0); - - do_push(specs_reset, ARRAY_SIZE(specs_reset), - exp_stats_init, ARRAY_SIZE(exp_stats_init), - exp_refs_init, ARRAY_SIZE(exp_refs_init), 0, 0, 0); - - do_push(specs_ff_force, ARRAY_SIZE(specs_ff_force), - exp_stats_ff, ARRAY_SIZE(exp_stats_ff), - exp_refs_ff, ARRAY_SIZE(exp_refs_ff), 0, 0, 0); -} - -void test_online_push__tag_commit(void) -{ - const char *specs[] = { "refs/tags/tag-commit:refs/tags/tag-commit" }; - push_status exp_stats[] = { { "refs/tags/tag-commit", 1 } }; - expected_ref exp_refs[] = { { "refs/tags/tag-commit", &_tag_commit } }; - do_push(specs, ARRAY_SIZE(specs), - exp_stats, ARRAY_SIZE(exp_stats), - exp_refs, ARRAY_SIZE(exp_refs), 0, 1, 1); -} - -void test_online_push__tag_tree(void) -{ - const char *specs[] = { "refs/tags/tag-tree:refs/tags/tag-tree" }; - push_status exp_stats[] = { { "refs/tags/tag-tree", 1 } }; - expected_ref exp_refs[] = { { "refs/tags/tag-tree", &_tag_tree } }; - do_push(specs, ARRAY_SIZE(specs), - exp_stats, ARRAY_SIZE(exp_stats), - exp_refs, ARRAY_SIZE(exp_refs), 0, 1, 1); -} - -void test_online_push__tag_blob(void) -{ - const char *specs[] = { "refs/tags/tag-blob:refs/tags/tag-blob" }; - push_status exp_stats[] = { { "refs/tags/tag-blob", 1 } }; - expected_ref exp_refs[] = { { "refs/tags/tag-blob", &_tag_blob } }; - do_push(specs, ARRAY_SIZE(specs), - exp_stats, ARRAY_SIZE(exp_stats), - exp_refs, ARRAY_SIZE(exp_refs), 0, 1, 1); -} - -void test_online_push__tag_lightweight(void) -{ - const char *specs[] = { "refs/tags/tag-lightweight:refs/tags/tag-lightweight" }; - push_status exp_stats[] = { { "refs/tags/tag-lightweight", 1 } }; - expected_ref exp_refs[] = { { "refs/tags/tag-lightweight", &_tag_lightweight } }; - do_push(specs, ARRAY_SIZE(specs), - exp_stats, ARRAY_SIZE(exp_stats), - exp_refs, ARRAY_SIZE(exp_refs), 0, 1, 1); -} - -void test_online_push__tag_to_tag(void) -{ - const char *specs[] = { "refs/tags/tag-tag:refs/tags/tag-tag" }; - push_status exp_stats[] = { { "refs/tags/tag-tag", 1 } }; - expected_ref exp_refs[] = { { "refs/tags/tag-tag", &_tag_tag } }; - do_push(specs, ARRAY_SIZE(specs), - exp_stats, ARRAY_SIZE(exp_stats), - exp_refs, ARRAY_SIZE(exp_refs), 0, 0, 0); -} - -void test_online_push__force(void) -{ - const char *specs1[] = {"refs/heads/b3:refs/heads/tgt"}; - push_status exp_stats1[] = { { "refs/heads/tgt", 1 } }; - expected_ref exp_refs1[] = { { "refs/heads/tgt", &_oid_b3 } }; - - const char *specs2[] = {"refs/heads/b4:refs/heads/tgt"}; - - const char *specs2_force[] = {"+refs/heads/b4:refs/heads/tgt"}; - push_status exp_stats2_force[] = { { "refs/heads/tgt", 1 } }; - expected_ref exp_refs2_force[] = { { "refs/heads/tgt", &_oid_b4 } }; - - do_push(specs1, ARRAY_SIZE(specs1), - exp_stats1, ARRAY_SIZE(exp_stats1), - exp_refs1, ARRAY_SIZE(exp_refs1), 0, 1, 1); - - do_push(specs2, ARRAY_SIZE(specs2), - NULL, 0, - exp_refs1, ARRAY_SIZE(exp_refs1), GIT_ENONFASTFORWARD, 0, 0); - - /* Non-fast-forward update with force should pass. */ - record_callbacks_data_clear(&_record_cbs_data); - do_push(specs2_force, ARRAY_SIZE(specs2_force), - exp_stats2_force, ARRAY_SIZE(exp_stats2_force), - exp_refs2_force, ARRAY_SIZE(exp_refs2_force), 0, 1, 1); -} - -void test_online_push__delete(void) -{ - const char *specs1[] = { - "refs/heads/b1:refs/heads/tgt1", - "refs/heads/b1:refs/heads/tgt2" - }; - push_status exp_stats1[] = { - { "refs/heads/tgt1", 1 }, - { "refs/heads/tgt2", 1 } - }; - expected_ref exp_refs1[] = { - { "refs/heads/tgt1", &_oid_b1 }, - { "refs/heads/tgt2", &_oid_b1 } - }; - - const char *specs_del_fake[] = { ":refs/heads/fake" }; - /* Force has no effect for delete. */ - const char *specs_del_fake_force[] = { "+:refs/heads/fake" }; - push_status exp_stats_fake[] = { { "refs/heads/fake", 1 } }; - - const char *specs_delete[] = { ":refs/heads/tgt1" }; - push_status exp_stats_delete[] = { { "refs/heads/tgt1", 1 } }; - expected_ref exp_refs_delete[] = { { "refs/heads/tgt2", &_oid_b1 } }; - /* Force has no effect for delete. */ - const char *specs_delete_force[] = { "+:refs/heads/tgt1" }; - - do_push(specs1, ARRAY_SIZE(specs1), - exp_stats1, ARRAY_SIZE(exp_stats1), - exp_refs1, ARRAY_SIZE(exp_refs1), 0, 1, 1); - - /* When deleting a non-existent branch, the git client sends zero for both - * the old and new commit id. This should succeed on the server with the - * same status report as if the branch were actually deleted. The server - * returns a warning on the side-band iff the side-band is supported. - * Since libgit2 doesn't support the side-band yet, there are no warnings. - */ - do_push(specs_del_fake, ARRAY_SIZE(specs_del_fake), - exp_stats_fake, 1, - exp_refs1, ARRAY_SIZE(exp_refs1), 0, 0, 0); - do_push(specs_del_fake_force, ARRAY_SIZE(specs_del_fake_force), - exp_stats_fake, 1, - exp_refs1, ARRAY_SIZE(exp_refs1), 0, 0, 0); - - /* Delete one of the pushed branches. */ - do_push(specs_delete, ARRAY_SIZE(specs_delete), - exp_stats_delete, ARRAY_SIZE(exp_stats_delete), - exp_refs_delete, ARRAY_SIZE(exp_refs_delete), 0, 0, 0); - - /* Re-push branches and retry delete with force. */ - do_push(specs1, ARRAY_SIZE(specs1), - exp_stats1, ARRAY_SIZE(exp_stats1), - exp_refs1, ARRAY_SIZE(exp_refs1), 0, 0, 0); - do_push(specs_delete_force, ARRAY_SIZE(specs_delete_force), - exp_stats_delete, ARRAY_SIZE(exp_stats_delete), - exp_refs_delete, ARRAY_SIZE(exp_refs_delete), 0, 0, 0); -} - -void test_online_push__bad_refspecs(void) -{ - /* All classes of refspecs that should be rejected by - * git_push_add_refspec() should go in this test. - */ - char *specs = { - "b6:b6", - }; - git_strarray arr = { - &specs, - 1, - }; - - if (_remote) { - cl_git_fail(git_remote_upload(_remote, &arr, NULL)); - } -} - -void test_online_push__expressions(void) -{ - /* TODO: Expressions in refspecs doesn't actually work yet */ - const char *specs_left_expr[] = { "refs/heads/b2~1:refs/heads/b2" }; - - /* TODO: Find a more precise way of checking errors than a exit code of -1. */ - do_push(specs_left_expr, ARRAY_SIZE(specs_left_expr), - NULL, 0, - NULL, 0, -1, 0, 0); -} - -void test_online_push__notes(void) -{ - git_oid note_oid, *target_oid, expected_oid; - git_signature *signature; - const char *specs[] = { "refs/notes/commits:refs/notes/commits" }; - push_status exp_stats[] = { { "refs/notes/commits", 1 } }; - expected_ref exp_refs[] = { { "refs/notes/commits", &expected_oid } }; - const char *specs_del[] = { ":refs/notes/commits" }; - - git_oid_fromstr(&expected_oid, "8461a99b27b7043e58ff6e1f5d2cf07d282534fb"); - - target_oid = &_oid_b6; - - /* Create note to push */ - cl_git_pass(git_signature_new(&signature, "nulltoken", "emeric.fermas@gmail.com", 1323847743, 60)); /* Wed Dec 14 08:29:03 2011 +0100 */ - cl_git_pass(git_note_create(¬e_oid, _repo, NULL, signature, signature, target_oid, "hello world\n", 0)); - - do_push(specs, ARRAY_SIZE(specs), - exp_stats, ARRAY_SIZE(exp_stats), - exp_refs, ARRAY_SIZE(exp_refs), 0, 1, 1); - - /* And make sure to delete the note */ - - do_push(specs_del, ARRAY_SIZE(specs_del), - exp_stats, 1, - NULL, 0, 0, 0, 0); - - git_signature_free(signature); -} - -void test_online_push__configured(void) -{ - git_oid note_oid, *target_oid, expected_oid; - git_signature *signature; - git_remote *old_remote; - const char *specs[] = { "refs/notes/commits:refs/notes/commits" }; - push_status exp_stats[] = { { "refs/notes/commits", 1 } }; - expected_ref exp_refs[] = { { "refs/notes/commits", &expected_oid } }; - const char *specs_del[] = { ":refs/notes/commits" }; - - git_oid_fromstr(&expected_oid, "8461a99b27b7043e58ff6e1f5d2cf07d282534fb"); - - target_oid = &_oid_b6; - - cl_git_pass(git_remote_add_push(_repo, git_remote_name(_remote), specs[0])); - old_remote = _remote; - cl_git_pass(git_remote_lookup(&_remote, _repo, git_remote_name(_remote))); - git_remote_free(old_remote); - - /* Create note to push */ - cl_git_pass(git_signature_new(&signature, "nulltoken", "emeric.fermas@gmail.com", 1323847743, 60)); /* Wed Dec 14 08:29:03 2011 +0100 */ - cl_git_pass(git_note_create(¬e_oid, _repo, NULL, signature, signature, target_oid, "hello world\n", 0)); - - do_push(NULL, 0, - exp_stats, ARRAY_SIZE(exp_stats), - exp_refs, ARRAY_SIZE(exp_refs), 0, 1, 1); - - /* And make sure to delete the note */ - - do_push(specs_del, ARRAY_SIZE(specs_del), - exp_stats, 1, - NULL, 0, 0, 0, 0); - - git_signature_free(signature); -} diff --git a/vendor/libgit2/tests/online/push_util.c b/vendor/libgit2/tests/online/push_util.c deleted file mode 100644 index cd483c7c02..0000000000 --- a/vendor/libgit2/tests/online/push_util.c +++ /dev/null @@ -1,146 +0,0 @@ - -#include "clar_libgit2.h" -#include "buffer.h" -#include "vector.h" -#include "push_util.h" - -const git_oid OID_ZERO = {{ 0 }}; - -void updated_tip_free(updated_tip *t) -{ - git__free(t->name); - git__free(t->old_oid); - git__free(t->new_oid); - git__free(t); -} - -void push_status_free(push_status *s) -{ - git__free(s->ref); - git__free(s->msg); - git__free(s); -} - -void record_callbacks_data_clear(record_callbacks_data *data) -{ - size_t i; - updated_tip *tip; - push_status *status; - - git_vector_foreach(&data->updated_tips, i, tip) - updated_tip_free(tip); - - git_vector_free(&data->updated_tips); - - git_vector_foreach(&data->statuses, i, status) - push_status_free(status); - - git_vector_free(&data->statuses); - - data->pack_progress_calls = 0; - data->transfer_progress_calls = 0; -} - -int record_update_tips_cb(const char *refname, const git_oid *a, const git_oid *b, void *data) -{ - updated_tip *t; - record_callbacks_data *record_data = (record_callbacks_data *)data; - - cl_assert(t = git__malloc(sizeof(*t))); - - cl_assert(t->name = git__strdup(refname)); - cl_assert(t->old_oid = git__malloc(sizeof(*t->old_oid))); - git_oid_cpy(t->old_oid, a); - - cl_assert(t->new_oid = git__malloc(sizeof(*t->new_oid))); - git_oid_cpy(t->new_oid, b); - - git_vector_insert(&record_data->updated_tips, t); - - return 0; -} - -int create_deletion_refspecs(git_vector *out, const git_remote_head **heads, size_t heads_len) -{ - git_buf del_spec = GIT_BUF_INIT; - size_t i; - - for (i = 0; i < heads_len; i++) { - const git_remote_head *head = heads[i]; - /* Ignore malformed ref names (which also saves us from tag^{} */ - if (!git_reference_is_valid_name(head->name)) - return 0; - - /* Create a refspec that deletes a branch in the remote */ - if (strcmp(head->name, "refs/heads/master")) { - cl_git_pass(git_buf_putc(&del_spec, ':')); - cl_git_pass(git_buf_puts(&del_spec, head->name)); - cl_git_pass(git_vector_insert(out, git_buf_detach(&del_spec))); - } - } - - return 0; -} - -int record_ref_cb(git_remote_head *head, void *payload) -{ - git_vector *refs = (git_vector *) payload; - return git_vector_insert(refs, head); -} - -void verify_remote_refs(const git_remote_head *actual_refs[], size_t actual_refs_len, const expected_ref expected_refs[], size_t expected_refs_len) -{ - size_t i, j = 0; - git_buf msg = GIT_BUF_INIT; - const git_remote_head *actual; - char *oid_str; - bool master_present = false; - - /* We don't care whether "master" is present on the other end or not */ - for (i = 0; i < actual_refs_len; i++) { - actual = actual_refs[i]; - if (!strcmp(actual->name, "refs/heads/master")) { - master_present = true; - break; - } - } - - if (expected_refs_len + (master_present ? 1 : 0) != actual_refs_len) - goto failed; - - for (i = 0; i < actual_refs_len; i++) { - actual = actual_refs[i]; - if (master_present && !strcmp(actual->name, "refs/heads/master")) - continue; - - if (strcmp(expected_refs[j].name, actual->name) || - git_oid_cmp(expected_refs[j].oid, &actual->oid)) - goto failed; - - j++; - } - - return; - -failed: - git_buf_puts(&msg, "Expected and actual refs differ:\nEXPECTED:\n"); - - for(i = 0; i < expected_refs_len; i++) { - oid_str = git_oid_tostr_s(expected_refs[i].oid); - cl_git_pass(git_buf_printf(&msg, "%s = %s\n", expected_refs[i].name, oid_str)); - } - - git_buf_puts(&msg, "\nACTUAL:\n"); - for (i = 0; i < actual_refs_len; i++) { - actual = actual_refs[i]; - if (master_present && !strcmp(actual->name, "refs/heads/master")) - continue; - - oid_str = git_oid_tostr_s(&actual->oid); - cl_git_pass(git_buf_printf(&msg, "%s = %s\n", actual->name, oid_str)); - } - - cl_fail(git_buf_cstr(&msg)); - - git_buf_free(&msg); -} diff --git a/vendor/libgit2/tests/online/push_util.h b/vendor/libgit2/tests/online/push_util.h deleted file mode 100644 index 822341bd26..0000000000 --- a/vendor/libgit2/tests/online/push_util.h +++ /dev/null @@ -1,83 +0,0 @@ -#ifndef INCLUDE_cl_push_util_h__ -#define INCLUDE_cl_push_util_h__ - -#include "git2/oid.h" - -/* Constant for zero oid */ -extern const git_oid OID_ZERO; - -/** - * Macro for initializing git_remote_callbacks to use test helpers that - * record data in a record_callbacks_data instance. - * @param data pointer to a record_callbacks_data instance - */ -#define RECORD_CALLBACKS_INIT(data) \ - { GIT_REMOTE_CALLBACKS_VERSION, NULL, NULL, cred_acquire_cb, NULL, NULL, record_update_tips_cb, NULL, NULL, NULL, NULL, NULL, data } - -typedef struct { - char *name; - git_oid *old_oid; - git_oid *new_oid; -} updated_tip; - -typedef struct { - git_vector updated_tips; - git_vector statuses; - int pack_progress_calls; - int transfer_progress_calls; -} record_callbacks_data; - -typedef struct { - const char *name; - const git_oid *oid; -} expected_ref; - -/* the results of a push status. when used for expected values, msg may be NULL - * to indicate that it should not be matched. */ -typedef struct { - char *ref; - int success; - char *msg; -} push_status; - - -void updated_tip_free(updated_tip *t); - -void record_callbacks_data_clear(record_callbacks_data *data); - -/** - * Callback for git_remote_update_tips that records updates - * - * @param data (git_vector *) of updated_tip instances - */ -int record_update_tips_cb(const char *refname, const git_oid *a, const git_oid *b, void *data); - -/** - * Create a set of refspecs that deletes each of the inputs - * - * @param out the vector in which to store the refspecs - * @param heads the remote heads - * @param heads_len the size of the array - */ -int create_deletion_refspecs(git_vector *out, const git_remote_head **heads, size_t heads_len); - -/** - * Callback for git_remote_list that adds refspecs to vector - * - * @param head a ref on the remote - * @param payload (git_vector *) of git_remote_head instances - */ -int record_ref_cb(git_remote_head *head, void *payload); - -/** - * Verifies that refs on remote stored by record_ref_cb match the expected - * names, oids, and order. - * - * @param actual_refs actual refs in the remote - * @param actual_refs_len length of actual_refs - * @param expected_refs expected remote refs - * @param expected_refs_len length of expected_refs - */ -void verify_remote_refs(const git_remote_head *actual_refs[], size_t actual_refs_len, const expected_ref expected_refs[], size_t expected_refs_len); - -#endif /* INCLUDE_cl_push_util_h__ */ diff --git a/vendor/libgit2/tests/online/remotes.c b/vendor/libgit2/tests/online/remotes.c deleted file mode 100644 index a86f2d9ae1..0000000000 --- a/vendor/libgit2/tests/online/remotes.c +++ /dev/null @@ -1,55 +0,0 @@ -#include "clar_libgit2.h" - -static const char *refspec = "refs/heads/first-merge:refs/remotes/origin/first-merge"; - -static int remote_single_branch(git_remote **out, git_repository *repo, const char *name, const char *url, void *payload) -{ - GIT_UNUSED(payload); - - cl_git_pass(git_remote_create_with_fetchspec(out, repo, name, url, refspec)); - - return 0; -} - -void test_online_remotes__single_branch(void) -{ - git_clone_options opts = GIT_CLONE_OPTIONS_INIT; - git_repository *repo; - git_remote *remote; - git_strarray refs; - size_t i, count = 0; - - opts.remote_cb = remote_single_branch; - opts.checkout_branch = "first-merge"; - - cl_git_pass(git_clone(&repo, "git://github.com/libgit2/TestGitRepository", "./single-branch", &opts)); - cl_git_pass(git_reference_list(&refs, repo)); - - for (i = 0; i < refs.count; i++) { - if (!git__prefixcmp(refs.strings[i], "refs/heads/")) - count++; - } - cl_assert_equal_i(1, count); - - git_strarray_free(&refs); - - cl_git_pass(git_remote_lookup(&remote, repo, "origin")); - cl_git_pass(git_remote_get_fetch_refspecs(&refs, remote)); - - cl_assert_equal_i(1, refs.count); - cl_assert_equal_s(refspec, refs.strings[0]); - - git_strarray_free(&refs); - git_remote_free(remote); - git_repository_free(repo); -} - -void test_online_remotes__restricted_refspecs(void) -{ - git_clone_options opts = GIT_CLONE_OPTIONS_INIT; - git_repository *repo; - - opts.remote_cb = remote_single_branch; - - cl_git_fail_with(GIT_EINVALIDSPEC, git_clone(&repo, "git://github.com/libgit2/TestGitRepository", "./restrict-refspec", &opts)); -} diff --git a/vendor/libgit2/tests/pack/indexer.c b/vendor/libgit2/tests/pack/indexer.c deleted file mode 100644 index 49a106d98f..0000000000 --- a/vendor/libgit2/tests/pack/indexer.c +++ /dev/null @@ -1,127 +0,0 @@ -#include "clar_libgit2.h" -#include -#include "fileops.h" -#include "hash.h" -#include "iterator.h" -#include "vector.h" -#include "posix.h" - - -/* - * This is a packfile with three objects. The second is a delta which - * depends on the third, which is also a delta. - */ -static const unsigned char out_of_order_pack[] = { - 0x50, 0x41, 0x43, 0x4b, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, - 0x32, 0x78, 0x9c, 0x63, 0x67, 0x00, 0x00, 0x00, 0x10, 0x00, 0x08, 0x76, - 0xe6, 0x8f, 0xe8, 0x12, 0x9b, 0x54, 0x6b, 0x10, 0x1a, 0xee, 0x95, 0x10, - 0xc5, 0x32, 0x8e, 0x7f, 0x21, 0xca, 0x1d, 0x18, 0x78, 0x9c, 0x63, 0x62, - 0x66, 0x4e, 0xcb, 0xcf, 0x07, 0x00, 0x02, 0xac, 0x01, 0x4d, 0x75, 0x01, - 0xd7, 0x71, 0x36, 0x66, 0xf4, 0xde, 0x82, 0x27, 0x76, 0xc7, 0x62, 0x2c, - 0x10, 0xf1, 0xb0, 0x7d, 0xe2, 0x80, 0xdc, 0x78, 0x9c, 0x63, 0x62, 0x62, - 0x62, 0xb7, 0x03, 0x00, 0x00, 0x69, 0x00, 0x4c, 0xde, 0x7d, 0xaa, 0xe4, - 0x19, 0x87, 0x58, 0x80, 0x61, 0x09, 0x9a, 0x33, 0xca, 0x7a, 0x31, 0x92, - 0x6f, 0xae, 0x66, 0x75 -}; -static const unsigned int out_of_order_pack_len = 112; - -/* - * Packfile with two objects. The second is a delta against an object - * which is not in the packfile - */ -static const unsigned char thin_pack[] = { - 0x50, 0x41, 0x43, 0x4b, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, - 0x32, 0x78, 0x9c, 0x63, 0x67, 0x00, 0x00, 0x00, 0x10, 0x00, 0x08, 0x76, - 0xe6, 0x8f, 0xe8, 0x12, 0x9b, 0x54, 0x6b, 0x10, 0x1a, 0xee, 0x95, 0x10, - 0xc5, 0x32, 0x8e, 0x7f, 0x21, 0xca, 0x1d, 0x18, 0x78, 0x9c, 0x63, 0x62, - 0x66, 0x4e, 0xcb, 0xcf, 0x07, 0x00, 0x02, 0xac, 0x01, 0x4d, 0x42, 0x52, - 0x3a, 0x6f, 0x39, 0xd1, 0xfe, 0x66, 0x68, 0x6b, 0xa5, 0xe5, 0xe2, 0x97, - 0xac, 0x94, 0x6c, 0x76, 0x0b, 0x04 -}; -static const unsigned int thin_pack_len = 78; - -static const unsigned char base_obj[] = { 07, 076 }; -static const unsigned int base_obj_len = 2; - -void test_pack_indexer__out_of_order(void) -{ - git_indexer *idx = 0; - git_transfer_progress stats = { 0 }; - - cl_git_pass(git_indexer_new(&idx, ".", 0, NULL, NULL, NULL)); - cl_git_pass(git_indexer_append( - idx, out_of_order_pack, out_of_order_pack_len, &stats)); - cl_git_pass(git_indexer_commit(idx, &stats)); - - cl_assert_equal_i(stats.total_objects, 3); - cl_assert_equal_i(stats.received_objects, 3); - cl_assert_equal_i(stats.indexed_objects, 3); - - git_indexer_free(idx); -} - -void test_pack_indexer__fix_thin(void) -{ - git_indexer *idx = NULL; - git_transfer_progress stats = { 0 }; - git_repository *repo; - git_odb *odb; - git_oid id, should_id; - - cl_git_pass(git_repository_init(&repo, "thin.git", true)); - cl_git_pass(git_repository_odb(&odb, repo)); - - /* Store the missing base into your ODB so the indexer can fix the pack */ - cl_git_pass(git_odb_write(&id, odb, base_obj, base_obj_len, GIT_OBJ_BLOB)); - git_oid_fromstr(&should_id, "e68fe8129b546b101aee9510c5328e7f21ca1d18"); - cl_assert_equal_oid(&should_id, &id); - - cl_git_pass(git_indexer_new(&idx, ".", 0, odb, NULL, NULL)); - cl_git_pass(git_indexer_append(idx, thin_pack, thin_pack_len, &stats)); - cl_git_pass(git_indexer_commit(idx, &stats)); - - cl_assert_equal_i(stats.total_objects, 2); - cl_assert_equal_i(stats.received_objects, 2); - cl_assert_equal_i(stats.indexed_objects, 2); - cl_assert_equal_i(stats.local_objects, 1); - - git_oid_fromstr(&should_id, "11f0f69b334728fdd8bc86b80499f22f29d85b15"); - cl_assert_equal_oid(&should_id, git_indexer_hash(idx)); - - git_indexer_free(idx); - git_odb_free(odb); - git_repository_free(repo); - - /* - * The pack's name/hash only tells us what objects there are, - * so we need to go through the packfile again in order to - * figure out whether we calculated the trailer correctly. - */ - { - unsigned char buffer[128]; - int fd; - ssize_t read; - struct stat st; - const char *name = "pack-11f0f69b334728fdd8bc86b80499f22f29d85b15.pack"; - - fd = p_open(name, O_RDONLY); - cl_assert(fd != -1); - - cl_git_pass(p_stat(name, &st)); - - cl_git_pass(git_indexer_new(&idx, ".", 0, NULL, NULL, NULL)); - read = p_read(fd, buffer, sizeof(buffer)); - cl_assert(read != -1); - p_close(fd); - - cl_git_pass(git_indexer_append(idx, buffer, read, &stats)); - cl_git_pass(git_indexer_commit(idx, &stats)); - - cl_assert_equal_i(stats.total_objects, 3); - cl_assert_equal_i(stats.received_objects, 3); - cl_assert_equal_i(stats.indexed_objects, 3); - cl_assert_equal_i(stats.local_objects, 0); - - git_indexer_free(idx); - } -} diff --git a/vendor/libgit2/tests/pack/packbuilder.c b/vendor/libgit2/tests/pack/packbuilder.c deleted file mode 100644 index 29f3e2d643..0000000000 --- a/vendor/libgit2/tests/pack/packbuilder.c +++ /dev/null @@ -1,225 +0,0 @@ -#include "clar_libgit2.h" -#include "fileops.h" -#include "pack.h" -#include "hash.h" -#include "iterator.h" -#include "vector.h" -#include "posix.h" - -static git_repository *_repo; -static git_revwalk *_revwalker; -static git_packbuilder *_packbuilder; -static git_indexer *_indexer; -static git_vector _commits; -static int _commits_is_initialized; -static git_transfer_progress _stats; - -void test_pack_packbuilder__initialize(void) -{ - _repo = cl_git_sandbox_init("testrepo.git"); - cl_git_pass(p_chdir("testrepo.git")); - cl_git_pass(git_revwalk_new(&_revwalker, _repo)); - cl_git_pass(git_packbuilder_new(&_packbuilder, _repo)); - cl_git_pass(git_vector_init(&_commits, 0, NULL)); - _commits_is_initialized = 1; - memset(&_stats, 0, sizeof(_stats)); -} - -void test_pack_packbuilder__cleanup(void) -{ - git_oid *o; - unsigned int i; - - if (_commits_is_initialized) { - _commits_is_initialized = 0; - git_vector_foreach(&_commits, i, o) { - git__free(o); - } - git_vector_free(&_commits); - } - - git_packbuilder_free(_packbuilder); - _packbuilder = NULL; - - git_revwalk_free(_revwalker); - _revwalker = NULL; - - git_indexer_free(_indexer); - _indexer = NULL; - - cl_git_pass(p_chdir("..")); - cl_git_sandbox_cleanup(); - _repo = NULL; -} - -static void seed_packbuilder(void) -{ - git_oid oid, *o; - unsigned int i; - - git_revwalk_sorting(_revwalker, GIT_SORT_TIME); - cl_git_pass(git_revwalk_push_ref(_revwalker, "HEAD")); - - while (git_revwalk_next(&oid, _revwalker) == 0) { - o = git__malloc(GIT_OID_RAWSZ); - cl_assert(o != NULL); - git_oid_cpy(o, &oid); - cl_git_pass(git_vector_insert(&_commits, o)); - } - - git_vector_foreach(&_commits, i, o) { - cl_git_pass(git_packbuilder_insert(_packbuilder, o, NULL)); - } - - git_vector_foreach(&_commits, i, o) { - git_object *obj; - cl_git_pass(git_object_lookup(&obj, _repo, o, GIT_OBJ_COMMIT)); - cl_git_pass(git_packbuilder_insert_tree(_packbuilder, - git_commit_tree_id((git_commit *)obj))); - git_object_free(obj); - } -} - -static int feed_indexer(void *ptr, size_t len, void *payload) -{ - git_transfer_progress *stats = (git_transfer_progress *)payload; - - return git_indexer_append(_indexer, ptr, len, stats); -} - -void test_pack_packbuilder__create_pack(void) -{ - git_transfer_progress stats; - git_buf buf = GIT_BUF_INIT, path = GIT_BUF_INIT; - git_hash_ctx ctx; - git_oid hash; - char hex[GIT_OID_HEXSZ+1]; hex[GIT_OID_HEXSZ] = '\0'; - - seed_packbuilder(); - - cl_git_pass(git_indexer_new(&_indexer, ".", 0, NULL, NULL, NULL)); - cl_git_pass(git_packbuilder_foreach(_packbuilder, feed_indexer, &stats)); - cl_git_pass(git_indexer_commit(_indexer, &stats)); - - git_oid_fmt(hex, git_indexer_hash(_indexer)); - git_buf_printf(&path, "pack-%s.pack", hex); - - /* - * By default, packfiles are created with only one thread. - * Therefore we can predict the object ordering and make sure - * we create exactly the same pack as git.git does when *not* - * reusing existing deltas (as libgit2). - * - * $ cd tests/resources/testrepo.git - * $ git rev-list --objects HEAD | \ - * git pack-objects -q --no-reuse-delta --threads=1 pack - * $ sha1sum git-80e61eb315239ef3c53033e37fee43b744d57122.pack - * 5d410bdf97cf896f9007681b92868471d636954b - * - */ - - cl_git_pass(git_futils_readbuffer(&buf, git_buf_cstr(&path))); - - cl_git_pass(git_hash_ctx_init(&ctx)); - cl_git_pass(git_hash_update(&ctx, buf.ptr, buf.size)); - cl_git_pass(git_hash_final(&hash, &ctx)); - git_hash_ctx_cleanup(&ctx); - - git_buf_free(&path); - git_buf_free(&buf); - - git_oid_fmt(hex, &hash); - - cl_assert_equal_s(hex, "5d410bdf97cf896f9007681b92868471d636954b"); -} - -void test_pack_packbuilder__get_hash(void) -{ - char hex[GIT_OID_HEXSZ+1]; hex[GIT_OID_HEXSZ] = '\0'; - - seed_packbuilder(); - - git_packbuilder_write(_packbuilder, ".", 0, NULL, NULL); - git_oid_fmt(hex, git_packbuilder_hash(_packbuilder)); - - cl_assert_equal_s(hex, "80e61eb315239ef3c53033e37fee43b744d57122"); -} - -static void test_write_pack_permission(mode_t given, mode_t expected) -{ - struct stat statbuf; - mode_t mask, os_mask; - - seed_packbuilder(); - - git_packbuilder_write(_packbuilder, ".", given, NULL, NULL); - - /* Windows does not return group/user bits from stat, - * files are never executable. - */ -#ifdef GIT_WIN32 - os_mask = 0600; -#else - os_mask = 0777; -#endif - - mask = p_umask(0); - p_umask(mask); - - cl_git_pass(p_stat("pack-80e61eb315239ef3c53033e37fee43b744d57122.idx", &statbuf)); - cl_assert_equal_i(statbuf.st_mode & os_mask, (expected & ~mask) & os_mask); - - cl_git_pass(p_stat("pack-80e61eb315239ef3c53033e37fee43b744d57122.pack", &statbuf)); - cl_assert_equal_i(statbuf.st_mode & os_mask, (expected & ~mask) & os_mask); -} - -void test_pack_packbuilder__permissions_standard(void) -{ - test_write_pack_permission(0, GIT_PACK_FILE_MODE); -} - -void test_pack_packbuilder__permissions_readonly(void) -{ - test_write_pack_permission(0444, 0444); -} - -void test_pack_packbuilder__permissions_readwrite(void) -{ - test_write_pack_permission(0666, 0666); -} - -static int foreach_cb(void *buf, size_t len, void *payload) -{ - git_indexer *idx = (git_indexer *) payload; - cl_git_pass(git_indexer_append(idx, buf, len, &_stats)); - return 0; -} - -void test_pack_packbuilder__foreach(void) -{ - git_indexer *idx; - - seed_packbuilder(); - cl_git_pass(git_indexer_new(&idx, ".", 0, NULL, NULL, NULL)); - cl_git_pass(git_packbuilder_foreach(_packbuilder, foreach_cb, idx)); - cl_git_pass(git_indexer_commit(idx, &_stats)); - git_indexer_free(idx); -} - -static int foreach_cancel_cb(void *buf, size_t len, void *payload) -{ - git_indexer *idx = (git_indexer *)payload; - cl_git_pass(git_indexer_append(idx, buf, len, &_stats)); - return (_stats.total_objects > 2) ? -1111 : 0; -} - -void test_pack_packbuilder__foreach_with_cancel(void) -{ - git_indexer *idx; - - seed_packbuilder(); - cl_git_pass(git_indexer_new(&idx, ".", 0, NULL, NULL, NULL)); - cl_git_fail_with( - git_packbuilder_foreach(_packbuilder, foreach_cancel_cb, idx), -1111); - git_indexer_free(idx); -} diff --git a/vendor/libgit2/tests/pack/sharing.c b/vendor/libgit2/tests/pack/sharing.c deleted file mode 100644 index a67d655887..0000000000 --- a/vendor/libgit2/tests/pack/sharing.c +++ /dev/null @@ -1,42 +0,0 @@ -#include "clar_libgit2.h" -#include -#include "strmap.h" -#include "mwindow.h" -#include "pack.h" - -extern git_strmap *git__pack_cache; - -void test_pack_sharing__open_two_repos(void) -{ - git_repository *repo1, *repo2; - git_object *obj1, *obj2; - git_oid id; - git_strmap_iter pos; - void *data; - int error; - - cl_git_pass(git_repository_open(&repo1, cl_fixture("testrepo.git"))); - cl_git_pass(git_repository_open(&repo2, cl_fixture("testrepo.git"))); - - git_oid_fromstr(&id, "a65fedf39aefe402d3bb6e24df4d4f5fe4547750"); - - cl_git_pass(git_object_lookup(&obj1, repo1, &id, GIT_OBJ_ANY)); - cl_git_pass(git_object_lookup(&obj2, repo2, &id, GIT_OBJ_ANY)); - - pos = 0; - while ((error = git_strmap_next(&data, &pos, git__pack_cache)) == 0) { - struct git_pack_file *pack = (struct git_pack_file *) data; - - cl_assert_equal_i(2, pack->refcount.val); - } - - cl_assert_equal_i(3, git_strmap_num_entries(git__pack_cache)); - - git_object_free(obj1); - git_object_free(obj2); - git_repository_free(repo1); - git_repository_free(repo2); - - /* we don't want to keep the packs open after the repos go away */ - cl_assert_equal_i(0, git_strmap_num_entries(git__pack_cache)); -} diff --git a/vendor/libgit2/tests/path/core.c b/vendor/libgit2/tests/path/core.c deleted file mode 100644 index 064f1492a6..0000000000 --- a/vendor/libgit2/tests/path/core.c +++ /dev/null @@ -1,354 +0,0 @@ -#include "clar_libgit2.h" -#include "path.h" - -static void test_make_relative( - const char *expected_path, - const char *path, - const char *parent, - int expected_status) -{ - git_buf buf = GIT_BUF_INIT; - git_buf_puts(&buf, path); - cl_assert_equal_i(expected_status, git_path_make_relative(&buf, parent)); - cl_assert_equal_s(expected_path, buf.ptr); - git_buf_free(&buf); -} - -void test_path_core__make_relative(void) -{ - test_make_relative("foo.c", "/path/to/foo.c", "/path/to", 0); - test_make_relative("bar/foo.c", "/path/to/bar/foo.c", "/path/to", 0); - test_make_relative("foo.c", "/path/to/foo.c", "/path/to/", 0); - - test_make_relative("", "/path/to", "/path/to", 0); - test_make_relative("", "/path/to", "/path/to/", 0); - - test_make_relative("../", "/path/to", "/path/to/foo", 0); - - test_make_relative("../foo.c", "/path/to/foo.c", "/path/to/bar", 0); - test_make_relative("../bar/foo.c", "/path/to/bar/foo.c", "/path/to/baz", 0); - - test_make_relative("../../foo.c", "/path/to/foo.c", "/path/to/foo/bar", 0); - test_make_relative("../../foo/bar.c", "/path/to/foo/bar.c", "/path/to/bar/foo", 0); - - test_make_relative("../../foo.c", "/foo.c", "/bar/foo", 0); - - test_make_relative("foo.c", "/path/to/foo.c", "/path/to/", 0); - test_make_relative("../foo.c", "/path/to/foo.c", "/path/to/bar/", 0); - - test_make_relative("foo.c", "d:/path/to/foo.c", "d:/path/to", 0); - - test_make_relative("../foo", "/foo", "/bar", 0); - test_make_relative("path/to/foo.c", "/path/to/foo.c", "/", 0); - test_make_relative("../foo", "path/to/foo", "path/to/bar", 0); - - test_make_relative("/path/to/foo.c", "/path/to/foo.c", "d:/path/to", GIT_ENOTFOUND); - test_make_relative("d:/path/to/foo.c", "d:/path/to/foo.c", "/path/to", GIT_ENOTFOUND); - - test_make_relative("/path/to/foo.c", "/path/to/foo.c", "not-a-rooted-path", GIT_ENOTFOUND); - test_make_relative("not-a-rooted-path", "not-a-rooted-path", "/path/to", GIT_ENOTFOUND); - - test_make_relative("/path", "/path", "pathtofoo", GIT_ENOTFOUND); - test_make_relative("path", "path", "pathtofoo", GIT_ENOTFOUND); -} - -void test_path_core__isvalid_standard(void) -{ - cl_assert_equal_b(true, git_path_isvalid(NULL, "foo/bar", 0)); - cl_assert_equal_b(true, git_path_isvalid(NULL, "foo/bar/file.txt", 0)); - cl_assert_equal_b(true, git_path_isvalid(NULL, "foo/bar/.file", 0)); -} - -void test_path_core__isvalid_empty_dir_component(void) -{ - cl_assert_equal_b(false, git_path_isvalid(NULL, "foo//bar", 0)); - - /* leading slash */ - cl_assert_equal_b(false, git_path_isvalid(NULL, "/", 0)); - cl_assert_equal_b(false, git_path_isvalid(NULL, "/foo", 0)); - cl_assert_equal_b(false, git_path_isvalid(NULL, "/foo/bar", 0)); - - /* trailing slash */ - cl_assert_equal_b(false, git_path_isvalid(NULL, "foo/", 0)); - cl_assert_equal_b(false, git_path_isvalid(NULL, "foo/bar/", 0)); -} - -void test_path_core__isvalid_dot_and_dotdot(void) -{ - cl_assert_equal_b(true, git_path_isvalid(NULL, ".", 0)); - cl_assert_equal_b(true, git_path_isvalid(NULL, "./foo", 0)); - cl_assert_equal_b(true, git_path_isvalid(NULL, "foo/.", 0)); - cl_assert_equal_b(true, git_path_isvalid(NULL, "./foo", 0)); - - cl_assert_equal_b(true, git_path_isvalid(NULL, "..", 0)); - cl_assert_equal_b(true, git_path_isvalid(NULL, "../foo", 0)); - cl_assert_equal_b(true, git_path_isvalid(NULL, "foo/..", 0)); - cl_assert_equal_b(true, git_path_isvalid(NULL, "../foo", 0)); - - cl_assert_equal_b(false, git_path_isvalid(NULL, ".", GIT_PATH_REJECT_TRAVERSAL)); - cl_assert_equal_b(false, git_path_isvalid(NULL, "./foo", GIT_PATH_REJECT_TRAVERSAL)); - cl_assert_equal_b(false, git_path_isvalid(NULL, "foo/.", GIT_PATH_REJECT_TRAVERSAL)); - cl_assert_equal_b(false, git_path_isvalid(NULL, "./foo", GIT_PATH_REJECT_TRAVERSAL)); - - cl_assert_equal_b(false, git_path_isvalid(NULL, "..", GIT_PATH_REJECT_TRAVERSAL)); - cl_assert_equal_b(false, git_path_isvalid(NULL, "../foo", GIT_PATH_REJECT_TRAVERSAL)); - cl_assert_equal_b(false, git_path_isvalid(NULL, "foo/..", GIT_PATH_REJECT_TRAVERSAL)); - cl_assert_equal_b(false, git_path_isvalid(NULL, "../foo", GIT_PATH_REJECT_TRAVERSAL)); -} - -void test_path_core__isvalid_dot_git(void) -{ - cl_assert_equal_b(true, git_path_isvalid(NULL, ".git", 0)); - cl_assert_equal_b(true, git_path_isvalid(NULL, ".git/foo", 0)); - cl_assert_equal_b(true, git_path_isvalid(NULL, "foo/.git", 0)); - cl_assert_equal_b(true, git_path_isvalid(NULL, "foo/.git/bar", 0)); - cl_assert_equal_b(true, git_path_isvalid(NULL, "foo/.GIT/bar", 0)); - cl_assert_equal_b(true, git_path_isvalid(NULL, "foo/bar/.Git", 0)); - - cl_assert_equal_b(false, git_path_isvalid(NULL, ".git", GIT_PATH_REJECT_DOT_GIT)); - cl_assert_equal_b(false, git_path_isvalid(NULL, ".git/foo", GIT_PATH_REJECT_DOT_GIT)); - cl_assert_equal_b(false, git_path_isvalid(NULL, "foo/.git", GIT_PATH_REJECT_DOT_GIT)); - cl_assert_equal_b(false, git_path_isvalid(NULL, "foo/.git/bar", GIT_PATH_REJECT_DOT_GIT)); - cl_assert_equal_b(false, git_path_isvalid(NULL, "foo/.GIT/bar", GIT_PATH_REJECT_DOT_GIT)); - cl_assert_equal_b(false, git_path_isvalid(NULL, "foo/bar/.Git", GIT_PATH_REJECT_DOT_GIT)); - - cl_assert_equal_b(true, git_path_isvalid(NULL, "!git", 0)); - cl_assert_equal_b(true, git_path_isvalid(NULL, "foo/!git", 0)); - cl_assert_equal_b(true, git_path_isvalid(NULL, "!git/bar", 0)); - cl_assert_equal_b(true, git_path_isvalid(NULL, ".tig", 0)); - cl_assert_equal_b(true, git_path_isvalid(NULL, "foo/.tig", 0)); - cl_assert_equal_b(true, git_path_isvalid(NULL, ".tig/bar", 0)); -} - -void test_path_core__isvalid_backslash(void) -{ - cl_assert_equal_b(true, git_path_isvalid(NULL, "foo\\file.txt", 0)); - cl_assert_equal_b(true, git_path_isvalid(NULL, "foo/bar\\file.txt", 0)); - cl_assert_equal_b(true, git_path_isvalid(NULL, "foo/bar\\", 0)); - - cl_assert_equal_b(false, git_path_isvalid(NULL, "foo\\file.txt", GIT_PATH_REJECT_BACKSLASH)); - cl_assert_equal_b(false, git_path_isvalid(NULL, "foo/bar\\file.txt", GIT_PATH_REJECT_BACKSLASH)); - cl_assert_equal_b(false, git_path_isvalid(NULL, "foo/bar\\", GIT_PATH_REJECT_BACKSLASH)); -} - -void test_path_core__isvalid_trailing_dot(void) -{ - cl_assert_equal_b(true, git_path_isvalid(NULL, "foo.", 0)); - cl_assert_equal_b(true, git_path_isvalid(NULL, "foo...", 0)); - cl_assert_equal_b(true, git_path_isvalid(NULL, "foo/bar.", 0)); - cl_assert_equal_b(true, git_path_isvalid(NULL, "foo./bar", 0)); - - cl_assert_equal_b(false, git_path_isvalid(NULL, "foo.", GIT_PATH_REJECT_TRAILING_DOT)); - cl_assert_equal_b(false, git_path_isvalid(NULL, "foo...", GIT_PATH_REJECT_TRAILING_DOT)); - cl_assert_equal_b(false, git_path_isvalid(NULL, "foo/bar.", GIT_PATH_REJECT_TRAILING_DOT)); - cl_assert_equal_b(false, git_path_isvalid(NULL, "foo./bar", GIT_PATH_REJECT_TRAILING_DOT)); -} - -void test_path_core__isvalid_trailing_space(void) -{ - cl_assert_equal_b(true, git_path_isvalid(NULL, "foo ", 0)); - cl_assert_equal_b(true, git_path_isvalid(NULL, "foo ", 0)); - cl_assert_equal_b(true, git_path_isvalid(NULL, "foo/bar ", 0)); - cl_assert_equal_b(true, git_path_isvalid(NULL, " ", 0)); - cl_assert_equal_b(true, git_path_isvalid(NULL, "foo /bar", 0)); - - cl_assert_equal_b(false, git_path_isvalid(NULL, "foo ", GIT_PATH_REJECT_TRAILING_SPACE)); - cl_assert_equal_b(false, git_path_isvalid(NULL, "foo ", GIT_PATH_REJECT_TRAILING_SPACE)); - cl_assert_equal_b(false, git_path_isvalid(NULL, "foo/bar ", GIT_PATH_REJECT_TRAILING_SPACE)); - cl_assert_equal_b(false, git_path_isvalid(NULL, " ", GIT_PATH_REJECT_TRAILING_SPACE)); - cl_assert_equal_b(false, git_path_isvalid(NULL, "foo /bar", GIT_PATH_REJECT_TRAILING_SPACE)); -} - -void test_path_core__isvalid_trailing_colon(void) -{ - cl_assert_equal_b(true, git_path_isvalid(NULL, "foo:", 0)); - cl_assert_equal_b(true, git_path_isvalid(NULL, "foo/bar:", 0)); - cl_assert_equal_b(true, git_path_isvalid(NULL, ":", 0)); - cl_assert_equal_b(true, git_path_isvalid(NULL, "foo:/bar", 0)); - - cl_assert_equal_b(false, git_path_isvalid(NULL, "foo:", GIT_PATH_REJECT_TRAILING_COLON)); - cl_assert_equal_b(false, git_path_isvalid(NULL, "foo/bar:", GIT_PATH_REJECT_TRAILING_COLON)); - cl_assert_equal_b(false, git_path_isvalid(NULL, ":", GIT_PATH_REJECT_TRAILING_COLON)); - cl_assert_equal_b(false, git_path_isvalid(NULL, "foo:/bar", GIT_PATH_REJECT_TRAILING_COLON)); -} - -void test_path_core__isvalid_dotgit_ntfs(void) -{ - cl_assert_equal_b(true, git_path_isvalid(NULL, ".git", 0)); - cl_assert_equal_b(true, git_path_isvalid(NULL, ".git ", 0)); - cl_assert_equal_b(true, git_path_isvalid(NULL, ".git.", 0)); - cl_assert_equal_b(true, git_path_isvalid(NULL, ".git.. .", 0)); - - cl_assert_equal_b(true, git_path_isvalid(NULL, "git~1", 0)); - cl_assert_equal_b(true, git_path_isvalid(NULL, "git~1 ", 0)); - cl_assert_equal_b(true, git_path_isvalid(NULL, "git~1.", 0)); - cl_assert_equal_b(true, git_path_isvalid(NULL, "git~1.. .", 0)); - - cl_assert_equal_b(false, git_path_isvalid(NULL, ".git", GIT_PATH_REJECT_DOT_GIT_NTFS)); - cl_assert_equal_b(false, git_path_isvalid(NULL, ".git ", GIT_PATH_REJECT_DOT_GIT_NTFS)); - cl_assert_equal_b(false, git_path_isvalid(NULL, ".git.", GIT_PATH_REJECT_DOT_GIT_NTFS)); - cl_assert_equal_b(false, git_path_isvalid(NULL, ".git.. .", GIT_PATH_REJECT_DOT_GIT_NTFS)); - - cl_assert_equal_b(false, git_path_isvalid(NULL, "git~1", GIT_PATH_REJECT_DOT_GIT_NTFS)); - cl_assert_equal_b(false, git_path_isvalid(NULL, "git~1 ", GIT_PATH_REJECT_DOT_GIT_NTFS)); - cl_assert_equal_b(false, git_path_isvalid(NULL, "git~1.", GIT_PATH_REJECT_DOT_GIT_NTFS)); - cl_assert_equal_b(false, git_path_isvalid(NULL, "git~1.. .", GIT_PATH_REJECT_DOT_GIT_NTFS)); -} - -void test_path_core__isvalid_dos_paths(void) -{ - cl_assert_equal_b(true, git_path_isvalid(NULL, "aux", 0)); - cl_assert_equal_b(true, git_path_isvalid(NULL, "aux.", 0)); - cl_assert_equal_b(true, git_path_isvalid(NULL, "aux:", 0)); - cl_assert_equal_b(true, git_path_isvalid(NULL, "aux.asdf", 0)); - cl_assert_equal_b(true, git_path_isvalid(NULL, "aux.asdf\\zippy", 0)); - cl_assert_equal_b(true, git_path_isvalid(NULL, "aux:asdf\\foobar", 0)); - cl_assert_equal_b(true, git_path_isvalid(NULL, "con", 0)); - cl_assert_equal_b(true, git_path_isvalid(NULL, "prn", 0)); - cl_assert_equal_b(true, git_path_isvalid(NULL, "nul", 0)); - - cl_assert_equal_b(false, git_path_isvalid(NULL, "aux", GIT_PATH_REJECT_DOS_PATHS)); - cl_assert_equal_b(false, git_path_isvalid(NULL, "aux.", GIT_PATH_REJECT_DOS_PATHS)); - cl_assert_equal_b(false, git_path_isvalid(NULL, "aux:", GIT_PATH_REJECT_DOS_PATHS)); - cl_assert_equal_b(false, git_path_isvalid(NULL, "aux.asdf", GIT_PATH_REJECT_DOS_PATHS)); - cl_assert_equal_b(false, git_path_isvalid(NULL, "aux.asdf\\zippy", GIT_PATH_REJECT_DOS_PATHS)); - cl_assert_equal_b(false, git_path_isvalid(NULL, "aux:asdf\\foobar", GIT_PATH_REJECT_DOS_PATHS)); - cl_assert_equal_b(false, git_path_isvalid(NULL, "con", GIT_PATH_REJECT_DOS_PATHS)); - cl_assert_equal_b(false, git_path_isvalid(NULL, "prn", GIT_PATH_REJECT_DOS_PATHS)); - cl_assert_equal_b(false, git_path_isvalid(NULL, "nul", GIT_PATH_REJECT_DOS_PATHS)); - - cl_assert_equal_b(true, git_path_isvalid(NULL, "aux1", 0)); - cl_assert_equal_b(true, git_path_isvalid(NULL, "aux1", GIT_PATH_REJECT_DOS_PATHS)); - cl_assert_equal_b(true, git_path_isvalid(NULL, "auxn", GIT_PATH_REJECT_DOS_PATHS)); - cl_assert_equal_b(true, git_path_isvalid(NULL, "aux\\foo", GIT_PATH_REJECT_DOS_PATHS)); -} - -void test_path_core__isvalid_dos_paths_withnum(void) -{ - cl_assert_equal_b(true, git_path_isvalid(NULL, "com1", 0)); - cl_assert_equal_b(true, git_path_isvalid(NULL, "com1.", 0)); - cl_assert_equal_b(true, git_path_isvalid(NULL, "com1:", 0)); - cl_assert_equal_b(true, git_path_isvalid(NULL, "com1.asdf", 0)); - cl_assert_equal_b(true, git_path_isvalid(NULL, "com1.asdf\\zippy", 0)); - cl_assert_equal_b(true, git_path_isvalid(NULL, "com1:asdf\\foobar", 0)); - cl_assert_equal_b(true, git_path_isvalid(NULL, "com1\\foo", 0)); - cl_assert_equal_b(true, git_path_isvalid(NULL, "lpt1", 0)); - - cl_assert_equal_b(false, git_path_isvalid(NULL, "com1", GIT_PATH_REJECT_DOS_PATHS)); - cl_assert_equal_b(false, git_path_isvalid(NULL, "com1.", GIT_PATH_REJECT_DOS_PATHS)); - cl_assert_equal_b(false, git_path_isvalid(NULL, "com1:", GIT_PATH_REJECT_DOS_PATHS)); - cl_assert_equal_b(false, git_path_isvalid(NULL, "com1.asdf", GIT_PATH_REJECT_DOS_PATHS)); - cl_assert_equal_b(false, git_path_isvalid(NULL, "com1.asdf\\zippy", GIT_PATH_REJECT_DOS_PATHS)); - cl_assert_equal_b(false, git_path_isvalid(NULL, "com1:asdf\\foobar", GIT_PATH_REJECT_DOS_PATHS)); - cl_assert_equal_b(false, git_path_isvalid(NULL, "com1/foo", GIT_PATH_REJECT_DOS_PATHS)); - cl_assert_equal_b(false, git_path_isvalid(NULL, "lpt1", GIT_PATH_REJECT_DOS_PATHS)); - - cl_assert_equal_b(true, git_path_isvalid(NULL, "com0", 0)); - cl_assert_equal_b(true, git_path_isvalid(NULL, "com0", GIT_PATH_REJECT_DOS_PATHS)); - cl_assert_equal_b(true, git_path_isvalid(NULL, "com10", 0)); - cl_assert_equal_b(true, git_path_isvalid(NULL, "com10", GIT_PATH_REJECT_DOS_PATHS)); - cl_assert_equal_b(true, git_path_isvalid(NULL, "comn", GIT_PATH_REJECT_DOS_PATHS)); - cl_assert_equal_b(true, git_path_isvalid(NULL, "com1\\foo", GIT_PATH_REJECT_DOS_PATHS)); - cl_assert_equal_b(true, git_path_isvalid(NULL, "lpt0", GIT_PATH_REJECT_DOS_PATHS)); - cl_assert_equal_b(true, git_path_isvalid(NULL, "lpt10", GIT_PATH_REJECT_DOS_PATHS)); - cl_assert_equal_b(true, git_path_isvalid(NULL, "lptn", GIT_PATH_REJECT_DOS_PATHS)); -} - -void test_path_core__isvalid_nt_chars(void) -{ - cl_assert_equal_b(true, git_path_isvalid(NULL, "asdf\001foo", 0)); - cl_assert_equal_b(true, git_path_isvalid(NULL, "asdf\037bar", 0)); - cl_assert_equal_b(true, git_path_isvalid(NULL, "asdffoo", 0)); - cl_assert_equal_b(true, git_path_isvalid(NULL, "asdf:foo", 0)); - cl_assert_equal_b(true, git_path_isvalid(NULL, "asdf\"bar", 0)); - cl_assert_equal_b(true, git_path_isvalid(NULL, "asdf|foo", 0)); - cl_assert_equal_b(true, git_path_isvalid(NULL, "asdf?bar", 0)); - cl_assert_equal_b(true, git_path_isvalid(NULL, "asdf*bar", 0)); - - cl_assert_equal_b(false, git_path_isvalid(NULL, "asdf\001foo", GIT_PATH_REJECT_NT_CHARS)); - cl_assert_equal_b(false, git_path_isvalid(NULL, "asdf\037bar", GIT_PATH_REJECT_NT_CHARS)); - cl_assert_equal_b(false, git_path_isvalid(NULL, "asdffoo", GIT_PATH_REJECT_NT_CHARS)); - cl_assert_equal_b(false, git_path_isvalid(NULL, "asdf:foo", GIT_PATH_REJECT_NT_CHARS)); - cl_assert_equal_b(false, git_path_isvalid(NULL, "asdf\"bar", GIT_PATH_REJECT_NT_CHARS)); - cl_assert_equal_b(false, git_path_isvalid(NULL, "asdf|foo", GIT_PATH_REJECT_NT_CHARS)); - cl_assert_equal_b(false, git_path_isvalid(NULL, "asdf?bar", GIT_PATH_REJECT_NT_CHARS)); - cl_assert_equal_b(false, git_path_isvalid(NULL, "asdf*bar", GIT_PATH_REJECT_NT_CHARS)); -} - -void test_path_core__isvalid_dotgit_with_hfs_ignorables(void) -{ - cl_assert_equal_b(false, git_path_isvalid(NULL, ".git", GIT_PATH_REJECT_DOT_GIT_HFS)); - cl_assert_equal_b(false, git_path_isvalid(NULL, ".git\xe2\x80\x8c", GIT_PATH_REJECT_DOT_GIT_HFS)); - cl_assert_equal_b(false, git_path_isvalid(NULL, ".gi\xe2\x80\x8dT", GIT_PATH_REJECT_DOT_GIT_HFS)); - cl_assert_equal_b(false, git_path_isvalid(NULL, ".g\xe2\x80\x8eIt", GIT_PATH_REJECT_DOT_GIT_HFS)); - cl_assert_equal_b(false, git_path_isvalid(NULL, ".\xe2\x80\x8fgIt", GIT_PATH_REJECT_DOT_GIT_HFS)); - cl_assert_equal_b(false, git_path_isvalid(NULL, "\xe2\x80\xaa.gIt", GIT_PATH_REJECT_DOT_GIT_HFS)); - - cl_assert_equal_b(false, git_path_isvalid(NULL, "\xe2\x80\xab.\xe2\x80\xacG\xe2\x80\xadI\xe2\x80\xaet", GIT_PATH_REJECT_DOT_GIT_HFS)); - cl_assert_equal_b(false, git_path_isvalid(NULL, "\xe2\x81\xab.\xe2\x80\xaaG\xe2\x81\xabI\xe2\x80\xact", GIT_PATH_REJECT_DOT_GIT_HFS)); - cl_assert_equal_b(false, git_path_isvalid(NULL, "\xe2\x81\xad.\xe2\x80\xaeG\xef\xbb\xbfIT", GIT_PATH_REJECT_DOT_GIT_HFS)); - - cl_assert_equal_b(true, git_path_isvalid(NULL, ".", GIT_PATH_REJECT_DOT_GIT_HFS)); - cl_assert_equal_b(true, git_path_isvalid(NULL, ".g", GIT_PATH_REJECT_DOT_GIT_HFS)); - cl_assert_equal_b(true, git_path_isvalid(NULL, ".gi", GIT_PATH_REJECT_DOT_GIT_HFS)); - cl_assert_equal_b(true, git_path_isvalid(NULL, " .git", GIT_PATH_REJECT_DOT_GIT_HFS)); - cl_assert_equal_b(true, git_path_isvalid(NULL, "..git\xe2\x80\x8c", GIT_PATH_REJECT_DOT_GIT_HFS)); - cl_assert_equal_b(true, git_path_isvalid(NULL, ".gi\xe2\x80\x8dT.", GIT_PATH_REJECT_DOT_GIT_HFS)); - cl_assert_equal_b(true, git_path_isvalid(NULL, ".g\xe2\x80It", GIT_PATH_REJECT_DOT_GIT_HFS)); - cl_assert_equal_b(true, git_path_isvalid(NULL, ".\xe2gIt", GIT_PATH_REJECT_DOT_GIT_HFS)); - cl_assert_equal_b(true, git_path_isvalid(NULL, "\xe2\x80\xaa.gi", GIT_PATH_REJECT_DOT_GIT_HFS)); - cl_assert_equal_b(true, git_path_isvalid(NULL, ".gi\x80\x8dT", GIT_PATH_REJECT_DOT_GIT_HFS)); - cl_assert_equal_b(true, git_path_isvalid(NULL, ".gi\x8dT", GIT_PATH_REJECT_DOT_GIT_HFS)); - cl_assert_equal_b(true, git_path_isvalid(NULL, ".g\xe2i\x80T\x8e", GIT_PATH_REJECT_DOT_GIT_HFS)); - cl_assert_equal_b(true, git_path_isvalid(NULL, ".git\xe2\x80\xbf", GIT_PATH_REJECT_DOT_GIT_HFS)); - cl_assert_equal_b(true, git_path_isvalid(NULL, ".git\xe2\xab\x81", GIT_PATH_REJECT_DOT_GIT_HFS)); -} - -static void test_join_unrooted( - const char *expected_result, - ssize_t expected_rootlen, - const char *path, - const char *base) -{ - git_buf result = GIT_BUF_INIT; - ssize_t root_at; - - cl_git_pass(git_path_join_unrooted(&result, path, base, &root_at)); - cl_assert_equal_s(expected_result, result.ptr); - cl_assert_equal_i(expected_rootlen, root_at); - - git_buf_free(&result); -} - -void test_path_core__join_unrooted(void) -{ - git_buf out = GIT_BUF_INIT; - - test_join_unrooted("foo", 0, "foo", NULL); - test_join_unrooted("foo/bar", 0, "foo/bar", NULL); - - /* Relative paths have base prepended */ - test_join_unrooted("/foo/bar", 4, "bar", "/foo"); - test_join_unrooted("/foo/bar/foobar", 4, "bar/foobar", "/foo"); - test_join_unrooted("c:/foo/bar/foobar", 6, "bar/foobar", "c:/foo"); - test_join_unrooted("c:/foo/bar/foobar", 10, "foobar", "c:/foo/bar"); - - /* Absolute paths are not prepended with base */ - test_join_unrooted("/foo", 0, "/foo", "/asdf"); - test_join_unrooted("/foo/bar", 0, "/foo/bar", "/asdf"); - - /* Drive letter is given as root length on Windows */ - test_join_unrooted("c:/foo", 2, "c:/foo", "c:/asdf"); - test_join_unrooted("c:/foo/bar", 2, "c:/foo/bar", "c:/asdf"); - - /* Base is returned when it's provided and is the prefix */ - test_join_unrooted("c:/foo/bar/foobar", 6, "c:/foo/bar/foobar", "c:/foo"); - test_join_unrooted("c:/foo/bar/foobar", 10, "c:/foo/bar/foobar", "c:/foo/bar"); - - /* Trailing slash in the base is ignored */ - test_join_unrooted("c:/foo/bar/foobar", 6, "c:/foo/bar/foobar", "c:/foo/"); - - git_buf_free(&out); -} diff --git a/vendor/libgit2/tests/path/win32.c b/vendor/libgit2/tests/path/win32.c deleted file mode 100644 index 4ff0397386..0000000000 --- a/vendor/libgit2/tests/path/win32.c +++ /dev/null @@ -1,217 +0,0 @@ - -#include "clar_libgit2.h" -#include "path.h" - -#ifdef GIT_WIN32 -#include "win32/path_w32.h" -#endif - -void test_utf8_to_utf16(const char *utf8_in, const wchar_t *utf16_expected) -{ -#ifdef GIT_WIN32 - git_win32_path path_utf16; - int path_utf16len; - - cl_assert((path_utf16len = git_win32_path_from_utf8(path_utf16, utf8_in)) >= 0); - cl_assert_equal_wcs(utf16_expected, path_utf16); - cl_assert_equal_i(wcslen(utf16_expected), path_utf16len); -#else - GIT_UNUSED(utf8_in); - GIT_UNUSED(utf16_expected); -#endif -} - -void test_path_win32__utf8_to_utf16(void) -{ -#ifdef GIT_WIN32 - test_utf8_to_utf16("C:\\", L"\\\\?\\C:\\"); - test_utf8_to_utf16("c:\\", L"\\\\?\\c:\\"); - test_utf8_to_utf16("C:/", L"\\\\?\\C:\\"); - test_utf8_to_utf16("c:/", L"\\\\?\\c:\\"); -#endif -} - -void test_path_win32__removes_trailing_slash(void) -{ -#ifdef GIT_WIN32 - test_utf8_to_utf16("C:\\Foo\\", L"\\\\?\\C:\\Foo"); - test_utf8_to_utf16("C:\\Foo\\\\", L"\\\\?\\C:\\Foo"); - test_utf8_to_utf16("C:\\Foo\\\\", L"\\\\?\\C:\\Foo"); - test_utf8_to_utf16("C:/Foo/", L"\\\\?\\C:\\Foo"); - test_utf8_to_utf16("C:/Foo///", L"\\\\?\\C:\\Foo"); -#endif -} - -void test_path_win32__squashes_multiple_slashes(void) -{ -#ifdef GIT_WIN32 - test_utf8_to_utf16("C:\\\\Foo\\Bar\\\\Foobar", L"\\\\?\\C:\\Foo\\Bar\\Foobar"); - test_utf8_to_utf16("C://Foo/Bar///Foobar", L"\\\\?\\C:\\Foo\\Bar\\Foobar"); -#endif -} - -void test_path_win32__unc(void) -{ -#ifdef GIT_WIN32 - test_utf8_to_utf16("\\\\server\\c$\\unc\\path", L"\\\\?\\UNC\\server\\c$\\unc\\path"); - test_utf8_to_utf16("//server/git/style/unc/path", L"\\\\?\\UNC\\server\\git\\style\\unc\\path"); -#endif -} - -void test_path_win32__honors_max_path(void) -{ -#ifdef GIT_WIN32 - git_win32_path path_utf16; - - test_utf8_to_utf16("C:\\This path is 259 chars and is the max length in windows\\0123456789abcdefghij0123456789abcdefghij0123456789abcdefghij0123456789abcdefghij0123456789abcdefghij0123456789abcdefghij0123456789abcdefghij0123456789abcdefghij0123456789abcdefghij0123456789abcdefghij", - L"\\\\?\\C:\\This path is 259 chars and is the max length in windows\\0123456789abcdefghij0123456789abcdefghij0123456789abcdefghij0123456789abcdefghij0123456789abcdefghij0123456789abcdefghij0123456789abcdefghij0123456789abcdefghij0123456789abcdefghij0123456789abcdefghij"); - test_utf8_to_utf16("\\\\unc\\paths may also be 259 characters including the server\\123456789abcdefghij0123456789abcdefghij0123456789abcdefghij0123456789abcdefghij0123456789abcdefghij0123456789abcdefghij0123456789abcdefghij0123456789abcdefghij0123456789abcdefghij0123456789abcdefghij", - L"\\\\?\\UNC\\unc\\paths may also be 259 characters including the server\\123456789abcdefghij0123456789abcdefghij0123456789abcdefghij0123456789abcdefghij0123456789abcdefghij0123456789abcdefghij0123456789abcdefghij0123456789abcdefghij0123456789abcdefghij0123456789abcdefghij"); - - cl_check_fail(git_win32_path_from_utf8(path_utf16, "C:\\This path is 260 chars and is sadly too long for windows\\0123456789abcdefghij0123456789abcdefghij0123456789abcdefghij0123456789abcdefghij0123456789abcdefghij0123456789abcdefghij0123456789abcdefghij0123456789abcdefghij0123456789abcdefghij0123456789abcdefghij")); - cl_check_fail(git_win32_path_from_utf8(path_utf16, "\\\\unc\\paths are also bound by 260 character restrictions\\including the server name portion\\bcdefghij0123456789abcdefghij0123456789abcdefghij0123456789abcdefghij0123456789abcdefghij0123456789abcdefghij0123456789abcdefghij0123456789abcdefghij0123456789abcdefghij")); -#endif -} - -void test_path_win32__dot_and_dotdot(void) -{ -#ifdef GIT_WIN32 - test_utf8_to_utf16("C:\\Foo\\..\\Foobar", L"\\\\?\\C:\\Foobar"); - test_utf8_to_utf16("C:\\Foo\\Bar\\..\\Foobar", L"\\\\?\\C:\\Foo\\Foobar"); - test_utf8_to_utf16("C:\\Foo\\Bar\\..\\Foobar\\..", L"\\\\?\\C:\\Foo"); - test_utf8_to_utf16("C:\\Foobar\\..", L"\\\\?\\C:\\"); - test_utf8_to_utf16("C:/Foo/Bar/../Foobar", L"\\\\?\\C:\\Foo\\Foobar"); - test_utf8_to_utf16("C:/Foo/Bar/../Foobar/../Asdf/", L"\\\\?\\C:\\Foo\\Asdf"); - test_utf8_to_utf16("C:/Foo/Bar/../Foobar/..", L"\\\\?\\C:\\Foo"); - test_utf8_to_utf16("C:/Foo/..", L"\\\\?\\C:\\"); - - test_utf8_to_utf16("C:\\Foo\\Bar\\.\\Foobar", L"\\\\?\\C:\\Foo\\Bar\\Foobar"); - test_utf8_to_utf16("C:\\.\\Foo\\.\\Bar\\.\\Foobar\\.\\", L"\\\\?\\C:\\Foo\\Bar\\Foobar"); - test_utf8_to_utf16("C:/Foo/Bar/./Foobar", L"\\\\?\\C:\\Foo\\Bar\\Foobar"); - test_utf8_to_utf16("C:/Foo/../Bar/./Foobar/../", L"\\\\?\\C:\\Bar"); - - test_utf8_to_utf16("C:\\Foo\\..\\..\\Bar", L"\\\\?\\C:\\Bar"); -#endif -} - -void test_path_win32__absolute_from_no_drive_letter(void) -{ -#ifdef GIT_WIN32 - test_utf8_to_utf16("\\Foo", L"\\\\?\\C:\\Foo"); - test_utf8_to_utf16("\\Foo\\Bar", L"\\\\?\\C:\\Foo\\Bar"); - test_utf8_to_utf16("/Foo/Bar", L"\\\\?\\C:\\Foo\\Bar"); -#endif -} - -void test_path_win32__absolute_from_relative(void) -{ -#ifdef GIT_WIN32 - char cwd_backup[MAX_PATH]; - - cl_must_pass(p_getcwd(cwd_backup, MAX_PATH)); - cl_must_pass(p_chdir("C:/")); - - test_utf8_to_utf16("Foo", L"\\\\?\\C:\\Foo"); - test_utf8_to_utf16("..\\..\\Foo", L"\\\\?\\C:\\Foo"); - test_utf8_to_utf16("Foo\\..", L"\\\\?\\C:\\"); - test_utf8_to_utf16("Foo\\..\\..", L"\\\\?\\C:\\"); - test_utf8_to_utf16("", L"\\\\?\\C:\\"); - - cl_must_pass(p_chdir("C:/Windows")); - - test_utf8_to_utf16("Foo", L"\\\\?\\C:\\Windows\\Foo"); - test_utf8_to_utf16("Foo\\Bar", L"\\\\?\\C:\\Windows\\Foo\\Bar"); - test_utf8_to_utf16("..\\Foo", L"\\\\?\\C:\\Foo"); - test_utf8_to_utf16("Foo\\..\\Bar", L"\\\\?\\C:\\Windows\\Bar"); - test_utf8_to_utf16("", L"\\\\?\\C:\\Windows"); - - cl_must_pass(p_chdir(cwd_backup)); -#endif -} - -void test_canonicalize(const wchar_t *in, const wchar_t *expected) -{ -#ifdef GIT_WIN32 - git_win32_path canonical; - - cl_assert(wcslen(in) < MAX_PATH); - wcscpy(canonical, in); - - cl_must_pass(git_win32_path_canonicalize(canonical)); - cl_assert_equal_wcs(expected, canonical); -#else - GIT_UNUSED(in); - GIT_UNUSED(expected); -#endif -} - -void test_path_win32__canonicalize(void) -{ -#ifdef GIT_WIN32 - test_canonicalize(L"C:\\Foo\\Bar", L"C:\\Foo\\Bar"); - test_canonicalize(L"C:\\Foo\\", L"C:\\Foo"); - test_canonicalize(L"C:\\Foo\\\\", L"C:\\Foo"); - test_canonicalize(L"C:\\Foo\\..\\Bar", L"C:\\Bar"); - test_canonicalize(L"C:\\Foo\\..\\..\\Bar", L"C:\\Bar"); - test_canonicalize(L"C:\\Foo\\..\\..\\..\\..\\", L"C:\\"); - test_canonicalize(L"C:/Foo/Bar", L"C:\\Foo\\Bar"); - test_canonicalize(L"C:/", L"C:\\"); - - test_canonicalize(L"Foo\\\\Bar\\\\Asdf\\\\", L"Foo\\Bar\\Asdf"); - test_canonicalize(L"Foo\\\\Bar\\\\..\\\\Asdf\\", L"Foo\\Asdf"); - test_canonicalize(L"Foo\\\\Bar\\\\.\\\\Asdf\\", L"Foo\\Bar\\Asdf"); - test_canonicalize(L"Foo\\\\..\\Bar\\\\.\\\\Asdf\\", L"Bar\\Asdf"); - test_canonicalize(L"\\", L""); - test_canonicalize(L"", L""); - test_canonicalize(L"Foo\\..\\..\\..\\..", L""); - test_canonicalize(L"..\\..\\..\\..", L""); - test_canonicalize(L"\\..\\..\\..\\..", L""); - - test_canonicalize(L"\\\\?\\C:\\Foo\\Bar", L"\\\\?\\C:\\Foo\\Bar"); - test_canonicalize(L"\\\\?\\C:\\Foo\\Bar\\", L"\\\\?\\C:\\Foo\\Bar"); - test_canonicalize(L"\\\\?\\C:\\\\Foo\\.\\Bar\\\\..\\", L"\\\\?\\C:\\Foo"); - test_canonicalize(L"\\\\?\\C:\\\\", L"\\\\?\\C:\\"); - test_canonicalize(L"//?/C:/", L"\\\\?\\C:\\"); - test_canonicalize(L"//?/C:/../../Foo/", L"\\\\?\\C:\\Foo"); - test_canonicalize(L"//?/C:/Foo/../../", L"\\\\?\\C:\\"); - - test_canonicalize(L"\\\\?\\UNC\\server\\C$\\folder", L"\\\\?\\UNC\\server\\C$\\folder"); - test_canonicalize(L"\\\\?\\UNC\\server\\C$\\folder\\", L"\\\\?\\UNC\\server\\C$\\folder"); - test_canonicalize(L"\\\\?\\UNC\\server\\C$\\folder\\", L"\\\\?\\UNC\\server\\C$\\folder"); - test_canonicalize(L"\\\\?\\UNC\\server\\C$\\folder\\..\\..\\..\\..\\share\\", L"\\\\?\\UNC\\server\\share"); - - test_canonicalize(L"\\\\server\\share", L"\\\\server\\share"); - test_canonicalize(L"\\\\server\\share\\", L"\\\\server\\share"); - test_canonicalize(L"\\\\server\\share\\\\foo\\\\bar", L"\\\\server\\share\\foo\\bar"); - test_canonicalize(L"\\\\server\\\\share\\\\foo\\\\bar", L"\\\\server\\share\\foo\\bar"); - test_canonicalize(L"\\\\server\\share\\..\\foo", L"\\\\server\\foo"); - test_canonicalize(L"\\\\server\\..\\..\\share\\.\\foo", L"\\\\server\\share\\foo"); -#endif -} - -void test_path_win32__8dot3_name(void) -{ -#ifdef GIT_WIN32 - char *shortname; - - if (!cl_sandbox_supports_8dot3()) - clar__skip(); - - /* Some guaranteed short names */ - cl_assert_equal_s("PROGRA~1", (shortname = git_win32_path_8dot3_name("C:\\Program Files"))); - git__free(shortname); - - cl_assert_equal_s("WINDOWS", (shortname = git_win32_path_8dot3_name("C:\\WINDOWS"))); - git__free(shortname); - - /* Create some predictible short names */ - cl_must_pass(p_mkdir(".foo", 0777)); - cl_assert_equal_s("FOO~1", (shortname = git_win32_path_8dot3_name(".foo"))); - git__free(shortname); - - cl_git_write2file("bar~1", "foobar\n", 7, O_RDWR|O_CREAT, 0666); - cl_must_pass(p_mkdir(".bar", 0777)); - cl_assert_equal_s("BAR~2", (shortname = git_win32_path_8dot3_name(".bar"))); - git__free(shortname); -#endif -} diff --git a/vendor/libgit2/tests/perf/helper__perf__do_merge.c b/vendor/libgit2/tests/perf/helper__perf__do_merge.c deleted file mode 100644 index c77b46a1fe..0000000000 --- a/vendor/libgit2/tests/perf/helper__perf__do_merge.c +++ /dev/null @@ -1,75 +0,0 @@ -#include "clar_libgit2.h" -#include "helper__perf__do_merge.h" -#include "helper__perf__timer.h" - -static git_repository * g_repo; - -void perf__do_merge(const char *fixture, - const char *test_name, - const char *id_a, - const char *id_b) -{ - git_checkout_options checkout_opts = GIT_CHECKOUT_OPTIONS_INIT; - git_clone_options clone_opts = GIT_CLONE_OPTIONS_INIT; - git_merge_options merge_opts = GIT_MERGE_OPTIONS_INIT; - git_oid oid_a; - git_oid oid_b; - git_reference *ref_branch_a = NULL; - git_reference *ref_branch_b = NULL; - git_commit *commit_a = NULL; - git_commit *commit_b = NULL; - git_annotated_commit *annotated_commits[1] = { NULL }; - perf_timer t_total = PERF_TIMER_INIT; - perf_timer t_clone = PERF_TIMER_INIT; - perf_timer t_checkout = PERF_TIMER_INIT; - perf_timer t_merge = PERF_TIMER_INIT; - - perf__timer__start(&t_total); - - checkout_opts.checkout_strategy = GIT_CHECKOUT_SAFE; - clone_opts.checkout_opts = checkout_opts; - - perf__timer__start(&t_clone); - cl_git_pass(git_clone(&g_repo, fixture, test_name, &clone_opts)); - perf__timer__stop(&t_clone); - - git_oid_fromstr(&oid_a, id_a); - cl_git_pass(git_commit_lookup(&commit_a, g_repo, &oid_a)); - cl_git_pass(git_branch_create(&ref_branch_a, g_repo, - "A", commit_a, - 0)); - - perf__timer__start(&t_checkout); - cl_git_pass(git_checkout_tree(g_repo, (git_object*)commit_a, &checkout_opts)); - perf__timer__stop(&t_checkout); - - cl_git_pass(git_repository_set_head(g_repo, git_reference_name(ref_branch_a))); - - git_oid_fromstr(&oid_b, id_b); - cl_git_pass(git_commit_lookup(&commit_b, g_repo, &oid_b)); - cl_git_pass(git_branch_create(&ref_branch_b, g_repo, - "B", commit_b, - 0)); - - cl_git_pass(git_annotated_commit_lookup(&annotated_commits[0], g_repo, &oid_b)); - - perf__timer__start(&t_merge); - cl_git_pass(git_merge(g_repo, - (const git_annotated_commit **)annotated_commits, 1, - &merge_opts, &checkout_opts)); - perf__timer__stop(&t_merge); - - git_reference_free(ref_branch_a); - git_reference_free(ref_branch_b); - git_commit_free(commit_a); - git_commit_free(commit_b); - git_annotated_commit_free(annotated_commits[0]); - git_repository_free(g_repo); - - perf__timer__stop(&t_total); - - perf__timer__report(&t_clone, "%s: clone", test_name); - perf__timer__report(&t_checkout, "%s: checkout", test_name); - perf__timer__report(&t_merge, "%s: merge", test_name); - perf__timer__report(&t_total, "%s: total", test_name); -} diff --git a/vendor/libgit2/tests/perf/helper__perf__do_merge.h b/vendor/libgit2/tests/perf/helper__perf__do_merge.h deleted file mode 100644 index 4a4723da5f..0000000000 --- a/vendor/libgit2/tests/perf/helper__perf__do_merge.h +++ /dev/null @@ -1,4 +0,0 @@ -void perf__do_merge(const char *fixture, - const char *test_name, - const char *id_a, - const char *id_b); diff --git a/vendor/libgit2/tests/perf/helper__perf__timer.c b/vendor/libgit2/tests/perf/helper__perf__timer.c deleted file mode 100644 index 8a7ed09e82..0000000000 --- a/vendor/libgit2/tests/perf/helper__perf__timer.c +++ /dev/null @@ -1,73 +0,0 @@ -#include "clar_libgit2.h" -#include "helper__perf__timer.h" - -#if defined(GIT_WIN32) - -void perf__timer__start(perf_timer *t) -{ - QueryPerformanceCounter(&t->time_started); -} - -void perf__timer__stop(perf_timer *t) -{ - LARGE_INTEGER time_now; - QueryPerformanceCounter(&time_now); - - t->sum.QuadPart += (time_now.QuadPart - t->time_started.QuadPart); -} - -void perf__timer__report(perf_timer *t, const char *fmt, ...) -{ - va_list arglist; - LARGE_INTEGER freq; - double fraction; - - QueryPerformanceFrequency(&freq); - - fraction = ((double)t->sum.QuadPart) / ((double)freq.QuadPart); - - printf("%10.3f: ", fraction); - - va_start(arglist, fmt); - vprintf(fmt, arglist); - va_end(arglist); - - printf("\n"); -} - -#else - -#include - -static uint32_t now_in_ms(void) -{ - struct timeval now; - gettimeofday(&now, NULL); - return (uint32_t)((now.tv_sec * 1000) + (now.tv_usec / 1000)); -} - -void perf__timer__start(perf_timer *t) -{ - t->time_started = now_in_ms(); -} - -void perf__timer__stop(perf_timer *t) -{ - uint32_t now = now_in_ms(); - t->sum += (now - t->time_started); -} - -void perf__timer__report(perf_timer *t, const char *fmt, ...) -{ - va_list arglist; - - printf("%10.3f: ", ((double)t->sum) / 1000); - - va_start(arglist, fmt); - vprintf(fmt, arglist); - va_end(arglist); - - printf("\n"); -} - -#endif diff --git a/vendor/libgit2/tests/perf/helper__perf__timer.h b/vendor/libgit2/tests/perf/helper__perf__timer.h deleted file mode 100644 index 5aff4b1366..0000000000 --- a/vendor/libgit2/tests/perf/helper__perf__timer.h +++ /dev/null @@ -1,27 +0,0 @@ -#if defined(GIT_WIN32) - -struct perf__timer -{ - LARGE_INTEGER sum; - LARGE_INTEGER time_started; -}; - -#define PERF_TIMER_INIT {0} - -#else - -struct perf__timer -{ - uint32_t sum; - uint32_t time_started; -}; - -#define PERF_TIMER_INIT {0} - -#endif - -typedef struct perf__timer perf_timer; - -void perf__timer__start(perf_timer *t); -void perf__timer__stop(perf_timer *t); -void perf__timer__report(perf_timer *t, const char *fmt, ...); diff --git a/vendor/libgit2/tests/perf/merge.c b/vendor/libgit2/tests/perf/merge.c deleted file mode 100644 index b2ef082ebc..0000000000 --- a/vendor/libgit2/tests/perf/merge.c +++ /dev/null @@ -1,44 +0,0 @@ -#include "clar_libgit2.h" -#include "helper__perf__do_merge.h" - -/* This test requires a large repo with many files. - * It doesn't care about the contents, just the size. - * - * For now, we use the LibGit2 repo containing the - * source tree because it is already here. - * - * `find . | wc -l` reports 5128. - * - */ -#define SRC_REPO (cl_fixture("../..")) - -/* We need 2 arbitrary commits within that repo - * that have a large number of changed files. - * Again, we don't care about the actual contents, - * just the size. - * - * For now, we use these public branches: - * maint/v0.21 d853fb9f24e0fe63b3dce9fbc04fd9cfe17a030b Always checkout with case sensitive iterator - * maint/v0.22 1ce9ea3ba9b4fa666602d52a5281d41a482cc58b checkout tests: cleanup realpath impl on Win32 - * - */ -#define ID_BRANCH_A "d853fb9f24e0fe63b3dce9fbc04fd9cfe17a030b" -#define ID_BRANCH_B "1ce9ea3ba9b4fa666602d52a5281d41a482cc58b" - - -void test_perf_merge__initialize(void) -{ -} - -void test_perf_merge__cleanup(void) -{ -} - -void test_perf_merge__m1(void) -{ -#if 1 - cl_skip(); -#else - perf__do_merge(SRC_REPO, "m1", ID_BRANCH_A, ID_BRANCH_B); -#endif -} diff --git a/vendor/libgit2/tests/rebase/abort.c b/vendor/libgit2/tests/rebase/abort.c deleted file mode 100644 index c4b3890bc5..0000000000 --- a/vendor/libgit2/tests/rebase/abort.c +++ /dev/null @@ -1,150 +0,0 @@ -#include "clar_libgit2.h" -#include "git2/rebase.h" -#include "merge.h" -#include "posix.h" -#include "annotated_commit.h" - -#include - -static git_repository *repo; - -// Fixture setup and teardown -void test_rebase_abort__initialize(void) -{ - repo = cl_git_sandbox_init("rebase"); -} - -void test_rebase_abort__cleanup(void) -{ - cl_git_sandbox_cleanup(); -} - -static void test_abort(git_annotated_commit *branch, git_annotated_commit *onto) -{ - git_rebase *rebase; - git_reference *head_ref, *branch_ref = NULL; - git_status_list *statuslist; - git_reflog *reflog; - const git_reflog_entry *reflog_entry; - - cl_git_pass(git_rebase_open(&rebase, repo, NULL)); - cl_git_pass(git_rebase_abort(rebase)); - - cl_assert_equal_i(GIT_REPOSITORY_STATE_NONE, git_repository_state(repo)); - - /* Make sure the refs are updated appropriately */ - cl_git_pass(git_reference_lookup(&head_ref, repo, "HEAD")); - - if (branch->ref_name == NULL) - cl_assert_equal_oid(git_annotated_commit_id(branch), git_reference_target(head_ref)); - else { - cl_assert_equal_s("refs/heads/beef", git_reference_symbolic_target(head_ref)); - cl_git_pass(git_reference_lookup(&branch_ref, repo, git_reference_symbolic_target(head_ref))); - cl_assert_equal_oid(git_annotated_commit_id(branch), git_reference_target(branch_ref)); - } - - git_status_list_new(&statuslist, repo, NULL); - cl_assert_equal_i(0, git_status_list_entrycount(statuslist)); - git_status_list_free(statuslist); - - /* Make sure the reflogs are updated appropriately */ - cl_git_pass(git_reflog_read(&reflog, repo, "HEAD")); - - cl_assert(reflog_entry = git_reflog_entry_byindex(reflog, 0)); - cl_assert_equal_oid(git_annotated_commit_id(onto), git_reflog_entry_id_old(reflog_entry)); - cl_assert_equal_oid(git_annotated_commit_id(branch), git_reflog_entry_id_new(reflog_entry)); - cl_assert_equal_s("rebase: aborting", git_reflog_entry_message(reflog_entry)); - - git_reflog_free(reflog); - git_reference_free(head_ref); - git_reference_free(branch_ref); - git_rebase_free(rebase); -} - -void test_rebase_abort__merge(void) -{ - git_rebase *rebase; - git_reference *branch_ref, *onto_ref; - git_annotated_commit *branch_head, *onto_head; - - cl_git_pass(git_reference_lookup(&branch_ref, repo, "refs/heads/beef")); - cl_git_pass(git_reference_lookup(&onto_ref, repo, "refs/heads/master")); - - cl_git_pass(git_annotated_commit_from_ref(&branch_head, repo, branch_ref)); - cl_git_pass(git_annotated_commit_from_ref(&onto_head, repo, onto_ref)); - - cl_git_pass(git_rebase_init(&rebase, repo, branch_head, NULL, onto_head, NULL)); - cl_assert_equal_i(GIT_REPOSITORY_STATE_REBASE_MERGE, git_repository_state(repo)); - - test_abort(branch_head, onto_head); - - git_annotated_commit_free(branch_head); - git_annotated_commit_free(onto_head); - - git_reference_free(branch_ref); - git_reference_free(onto_ref); - git_rebase_free(rebase); -} - -void test_rebase_abort__detached_head(void) -{ - git_rebase *rebase; - git_oid branch_id; - git_reference *onto_ref; - git_signature *signature; - git_annotated_commit *branch_head, *onto_head; - - git_oid_fromstr(&branch_id, "b146bd7608eac53d9bf9e1a6963543588b555c64"); - cl_git_pass(git_reference_lookup(&onto_ref, repo, "refs/heads/master")); - - cl_git_pass(git_annotated_commit_lookup(&branch_head, repo, &branch_id)); - cl_git_pass(git_annotated_commit_from_ref(&onto_head, repo, onto_ref)); - - cl_git_pass(git_signature_new(&signature, "Rebaser", "rebaser@example.com", 1404157834, -400)); - - cl_git_pass(git_rebase_init(&rebase, repo, branch_head, NULL, onto_head, NULL)); - cl_assert_equal_i(GIT_REPOSITORY_STATE_REBASE_MERGE, git_repository_state(repo)); - - test_abort(branch_head, onto_head); - - git_signature_free(signature); - - git_annotated_commit_free(branch_head); - git_annotated_commit_free(onto_head); - - git_reference_free(onto_ref); - git_rebase_free(rebase); -} - -void test_rebase_abort__old_style_head_file(void) -{ - git_rebase *rebase; - git_reference *branch_ref, *onto_ref; - git_signature *signature; - git_annotated_commit *branch_head, *onto_head; - - cl_git_pass(git_reference_lookup(&branch_ref, repo, "refs/heads/beef")); - cl_git_pass(git_reference_lookup(&onto_ref, repo, "refs/heads/master")); - - cl_git_pass(git_annotated_commit_from_ref(&branch_head, repo, branch_ref)); - cl_git_pass(git_annotated_commit_from_ref(&onto_head, repo, onto_ref)); - - cl_git_pass(git_signature_new(&signature, "Rebaser", "rebaser@example.com", 1404157834, -400)); - - cl_git_pass(git_rebase_init(&rebase, repo, branch_head, NULL, onto_head, NULL)); - cl_assert_equal_i(GIT_REPOSITORY_STATE_REBASE_MERGE, git_repository_state(repo)); - - p_rename("rebase-merge/.git/rebase-merge/orig-head", - "rebase-merge/.git/rebase-merge/head"); - - test_abort(branch_head, onto_head); - - git_signature_free(signature); - - git_annotated_commit_free(branch_head); - git_annotated_commit_free(onto_head); - - git_reference_free(branch_ref); - git_reference_free(onto_ref); - git_rebase_free(rebase); -} diff --git a/vendor/libgit2/tests/rebase/iterator.c b/vendor/libgit2/tests/rebase/iterator.c deleted file mode 100644 index acf2a92db7..0000000000 --- a/vendor/libgit2/tests/rebase/iterator.c +++ /dev/null @@ -1,106 +0,0 @@ -#include "clar_libgit2.h" -#include "git2/rebase.h" -#include "posix.h" - -#include - -static git_repository *repo; -static git_index *_index; -static git_signature *signature; - -// Fixture setup and teardown -void test_rebase_iterator__initialize(void) -{ - repo = cl_git_sandbox_init("rebase"); - cl_git_pass(git_repository_index(&_index, repo)); - cl_git_pass(git_signature_now(&signature, "Rebaser", "rebaser@rebaser.rb")); -} - -void test_rebase_iterator__cleanup(void) -{ - git_signature_free(signature); - git_index_free(_index); - cl_git_sandbox_cleanup(); -} - -static void test_operations(git_rebase *rebase, size_t expected_current) -{ - size_t i, expected_count = 5; - git_oid expected_oid[5]; - git_rebase_operation *operation; - - git_oid_fromstr(&expected_oid[0], "da9c51a23d02d931a486f45ad18cda05cf5d2b94"); - git_oid_fromstr(&expected_oid[1], "8d1f13f93c4995760ac07d129246ac1ff64c0be9"); - git_oid_fromstr(&expected_oid[2], "3069cc907e6294623e5917ef6de663928c1febfb"); - git_oid_fromstr(&expected_oid[3], "588e5d2f04d49707fe4aab865e1deacaf7ef6787"); - git_oid_fromstr(&expected_oid[4], "b146bd7608eac53d9bf9e1a6963543588b555c64"); - - cl_assert_equal_i(expected_count, git_rebase_operation_entrycount(rebase)); - cl_assert_equal_i(expected_current, git_rebase_operation_current(rebase)); - - for (i = 0; i < expected_count; i++) { - operation = git_rebase_operation_byindex(rebase, i); - cl_assert_equal_i(GIT_REBASE_OPERATION_PICK, operation->type); - cl_assert_equal_oid(&expected_oid[i], &operation->id); - cl_assert_equal_p(NULL, operation->exec); - } -} - -void test_rebase_iterator__iterates(void) -{ - git_rebase *rebase; - git_reference *branch_ref, *upstream_ref; - git_annotated_commit *branch_head, *upstream_head; - git_rebase_operation *rebase_operation; - git_oid commit_id; - int error; - - cl_git_pass(git_reference_lookup(&branch_ref, repo, "refs/heads/beef")); - cl_git_pass(git_reference_lookup(&upstream_ref, repo, "refs/heads/master")); - - cl_git_pass(git_annotated_commit_from_ref(&branch_head, repo, branch_ref)); - cl_git_pass(git_annotated_commit_from_ref(&upstream_head, repo, upstream_ref)); - - cl_git_pass(git_rebase_init(&rebase, repo, branch_head, upstream_head, NULL, NULL)); - test_operations(rebase, GIT_REBASE_NO_OPERATION); - git_rebase_free(rebase); - - cl_git_pass(git_rebase_open(&rebase, repo, NULL)); - cl_git_pass(git_rebase_next(&rebase_operation, rebase)); - cl_git_pass(git_rebase_commit(&commit_id, rebase, NULL, signature, - NULL, NULL)); - test_operations(rebase, 0); - - cl_git_pass(git_rebase_next(&rebase_operation, rebase)); - cl_git_pass(git_rebase_commit(&commit_id, rebase, NULL, signature, - NULL, NULL)); - test_operations(rebase, 1); - - cl_git_pass(git_rebase_next(&rebase_operation, rebase)); - cl_git_pass(git_rebase_commit(&commit_id, rebase, NULL, signature, - NULL, NULL)); - test_operations(rebase, 2); - - git_rebase_free(rebase); - cl_git_pass(git_rebase_open(&rebase, repo, NULL)); - - cl_git_pass(git_rebase_next(&rebase_operation, rebase)); - cl_git_pass(git_rebase_commit(&commit_id, rebase, NULL, signature, - NULL, NULL)); - test_operations(rebase, 3); - - cl_git_pass(git_rebase_next(&rebase_operation, rebase)); - cl_git_pass(git_rebase_commit(&commit_id, rebase, NULL, signature, - NULL, NULL)); - test_operations(rebase, 4); - - cl_git_fail(error = git_rebase_next(&rebase_operation, rebase)); - cl_assert_equal_i(GIT_ITEROVER, error); - test_operations(rebase, 4); - - git_annotated_commit_free(branch_head); - git_annotated_commit_free(upstream_head); - git_reference_free(branch_ref); - git_reference_free(upstream_ref); - git_rebase_free(rebase); -} diff --git a/vendor/libgit2/tests/rebase/merge.c b/vendor/libgit2/tests/rebase/merge.c deleted file mode 100644 index 33eadb7ede..0000000000 --- a/vendor/libgit2/tests/rebase/merge.c +++ /dev/null @@ -1,567 +0,0 @@ -#include "clar_libgit2.h" -#include "git2/rebase.h" -#include "posix.h" -#include "signature.h" - -#include - -static git_repository *repo; -static git_signature *signature; - -static void set_core_autocrlf_to(git_repository *repo, bool value) -{ - git_config *cfg; - - cl_git_pass(git_repository_config(&cfg, repo)); - cl_git_pass(git_config_set_bool(cfg, "core.autocrlf", value)); - - git_config_free(cfg); -} - -// Fixture setup and teardown -void test_rebase_merge__initialize(void) -{ - repo = cl_git_sandbox_init("rebase"); - cl_git_pass(git_signature_new(&signature, - "Rebaser", "rebaser@rebaser.rb", 1405694510, 0)); - - set_core_autocrlf_to(repo, false); -} - -void test_rebase_merge__cleanup(void) -{ - git_signature_free(signature); - cl_git_sandbox_cleanup(); -} - -void test_rebase_merge__next(void) -{ - git_rebase *rebase; - git_reference *branch_ref, *upstream_ref; - git_annotated_commit *branch_head, *upstream_head; - git_rebase_operation *rebase_operation; - git_status_list *status_list; - const git_status_entry *status_entry; - git_oid pick_id, file1_id; - - cl_git_pass(git_reference_lookup(&branch_ref, repo, "refs/heads/beef")); - cl_git_pass(git_reference_lookup(&upstream_ref, repo, "refs/heads/master")); - - cl_git_pass(git_annotated_commit_from_ref(&branch_head, repo, branch_ref)); - cl_git_pass(git_annotated_commit_from_ref(&upstream_head, repo, upstream_ref)); - - cl_git_pass(git_rebase_init(&rebase, repo, branch_head, upstream_head, NULL, NULL)); - - cl_git_pass(git_rebase_next(&rebase_operation, rebase)); - - git_oid_fromstr(&pick_id, "da9c51a23d02d931a486f45ad18cda05cf5d2b94"); - - cl_assert_equal_i(GIT_REBASE_OPERATION_PICK, rebase_operation->type); - cl_assert_equal_oid(&pick_id, &rebase_operation->id); - cl_assert_equal_file("da9c51a23d02d931a486f45ad18cda05cf5d2b94\n", 41, "rebase/.git/rebase-merge/current"); - cl_assert_equal_file("1\n", 2, "rebase/.git/rebase-merge/msgnum"); - - cl_git_pass(git_status_list_new(&status_list, repo, NULL)); - cl_assert_equal_i(1, git_status_list_entrycount(status_list)); - cl_assert(status_entry = git_status_byindex(status_list, 0)); - - cl_assert_equal_s("beef.txt", status_entry->head_to_index->new_file.path); - - git_oid_fromstr(&file1_id, "8d95ea62e621f1d38d230d9e7d206e41096d76af"); - cl_assert_equal_oid(&file1_id, &status_entry->head_to_index->new_file.id); - - git_status_list_free(status_list); - git_annotated_commit_free(branch_head); - git_annotated_commit_free(upstream_head); - git_reference_free(branch_ref); - git_reference_free(upstream_ref); - git_rebase_free(rebase); -} - -void test_rebase_merge__next_with_conflicts(void) -{ - git_rebase *rebase; - git_reference *branch_ref, *upstream_ref; - git_annotated_commit *branch_head, *upstream_head; - git_rebase_operation *rebase_operation; - git_status_list *status_list; - const git_status_entry *status_entry; - git_oid pick_id, commit_id; - - const char *expected_merge = -"ASPARAGUS SOUP.\n" -"\n" -"<<<<<<< master\n" -"TAKE FOUR LARGE BUNCHES of asparagus, scrape it nicely, cut off one inch\n" -"OF THE TOPS, and lay them in water, chop the stalks and put them on the\n" -"FIRE WITH A PIECE OF BACON, a large onion cut up, and pepper and salt;\n" -"ADD TWO QUARTS OF WATER, boil them till the stalks are quite soft, then\n" -"PULP THEM THROUGH A SIEVE, and strain the water to it, which must be put\n" -"=======\n" -"Take four large bunches of asparagus, scrape it nicely, CUT OFF ONE INCH\n" -"of the tops, and lay them in water, chop the stalks and PUT THEM ON THE\n" -"fire with a piece of bacon, a large onion cut up, and pepper and salt;\n" -"add two quarts of water, boil them till the stalks are quite soft, then\n" -"pulp them through a sieve, and strain the water to it, which must be put\n" -">>>>>>> Conflicting modification 1 to asparagus\n" -"back in the pot; put into it a chicken cut up, with the tops of\n" -"asparagus which had been laid by, boil it until these last articles are\n" -"sufficiently done, thicken with flour, butter and milk, and serve it up.\n"; - - cl_git_pass(git_reference_lookup(&branch_ref, repo, "refs/heads/asparagus")); - cl_git_pass(git_reference_lookup(&upstream_ref, repo, "refs/heads/master")); - - cl_git_pass(git_annotated_commit_from_ref(&branch_head, repo, branch_ref)); - cl_git_pass(git_annotated_commit_from_ref(&upstream_head, repo, upstream_ref)); - - cl_git_pass(git_rebase_init(&rebase, repo, branch_head, upstream_head, NULL, NULL)); - - cl_git_pass(git_rebase_next(&rebase_operation, rebase)); - - git_oid_fromstr(&pick_id, "33f915f9e4dbd9f4b24430e48731a59b45b15500"); - - cl_assert_equal_i(GIT_REBASE_OPERATION_PICK, rebase_operation->type); - cl_assert_equal_oid(&pick_id, &rebase_operation->id); - cl_assert_equal_file("33f915f9e4dbd9f4b24430e48731a59b45b15500\n", 41, "rebase/.git/rebase-merge/current"); - cl_assert_equal_file("1\n", 2, "rebase/.git/rebase-merge/msgnum"); - - cl_git_pass(git_status_list_new(&status_list, repo, NULL)); - cl_assert_equal_i(1, git_status_list_entrycount(status_list)); - cl_assert(status_entry = git_status_byindex(status_list, 0)); - - cl_assert_equal_s("asparagus.txt", status_entry->head_to_index->new_file.path); - - cl_assert_equal_file(expected_merge, strlen(expected_merge), "rebase/asparagus.txt"); - - cl_git_fail_with(GIT_EUNMERGED, git_rebase_commit(&commit_id, rebase, NULL, signature, NULL, NULL)); - - git_status_list_free(status_list); - git_annotated_commit_free(branch_head); - git_annotated_commit_free(upstream_head); - git_reference_free(branch_ref); - git_reference_free(upstream_ref); - git_rebase_free(rebase); -} - -void test_rebase_merge__next_stops_with_iterover(void) -{ - git_rebase *rebase; - git_reference *branch_ref, *upstream_ref; - git_annotated_commit *branch_head, *upstream_head; - git_rebase_operation *rebase_operation; - git_oid commit_id; - int error; - - cl_git_pass(git_reference_lookup(&branch_ref, repo, "refs/heads/beef")); - cl_git_pass(git_reference_lookup(&upstream_ref, repo, "refs/heads/master")); - - cl_git_pass(git_annotated_commit_from_ref(&branch_head, repo, branch_ref)); - cl_git_pass(git_annotated_commit_from_ref(&upstream_head, repo, upstream_ref)); - - cl_git_pass(git_rebase_init(&rebase, repo, branch_head, upstream_head, NULL, NULL)); - - cl_git_pass(git_rebase_next(&rebase_operation, rebase)); - cl_git_pass(git_rebase_commit(&commit_id, rebase, NULL, signature, - NULL, NULL)); - - cl_git_pass(git_rebase_next(&rebase_operation, rebase)); - cl_git_pass(git_rebase_commit(&commit_id, rebase, NULL, signature, - NULL, NULL)); - - cl_git_pass(git_rebase_next(&rebase_operation, rebase)); - cl_git_pass(git_rebase_commit(&commit_id, rebase, NULL, signature, - NULL, NULL)); - - cl_git_pass(git_rebase_next(&rebase_operation, rebase)); - cl_git_pass(git_rebase_commit(&commit_id, rebase, NULL, signature, - NULL, NULL)); - - cl_git_pass(git_rebase_next(&rebase_operation, rebase)); - cl_git_pass(git_rebase_commit(&commit_id, rebase, NULL, signature, - NULL, NULL)); - - cl_git_fail(error = git_rebase_next(&rebase_operation, rebase)); - cl_assert_equal_i(GIT_ITEROVER, error); - - cl_assert_equal_file("5\n", 2, "rebase/.git/rebase-merge/end"); - cl_assert_equal_file("5\n", 2, "rebase/.git/rebase-merge/msgnum"); - - git_annotated_commit_free(branch_head); - git_annotated_commit_free(upstream_head); - git_reference_free(branch_ref); - git_reference_free(upstream_ref); - git_rebase_free(rebase); -} - -void test_rebase_merge__commit(void) -{ - git_rebase *rebase; - git_reference *branch_ref, *upstream_ref; - git_annotated_commit *branch_head, *upstream_head; - git_rebase_operation *rebase_operation; - git_oid commit_id, tree_id, parent_id; - git_signature *author; - git_commit *commit; - git_reflog *reflog; - const git_reflog_entry *reflog_entry; - - cl_git_pass(git_reference_lookup(&branch_ref, repo, "refs/heads/beef")); - cl_git_pass(git_reference_lookup(&upstream_ref, repo, "refs/heads/master")); - - cl_git_pass(git_annotated_commit_from_ref(&branch_head, repo, branch_ref)); - cl_git_pass(git_annotated_commit_from_ref(&upstream_head, repo, upstream_ref)); - - cl_git_pass(git_rebase_init(&rebase, repo, branch_head, upstream_head, NULL, NULL)); - - cl_git_pass(git_rebase_next(&rebase_operation, rebase)); - cl_git_pass(git_rebase_commit(&commit_id, rebase, NULL, signature, - NULL, NULL)); - - cl_git_pass(git_commit_lookup(&commit, repo, &commit_id)); - - git_oid_fromstr(&parent_id, "efad0b11c47cb2f0220cbd6f5b0f93bb99064b00"); - cl_assert_equal_i(1, git_commit_parentcount(commit)); - cl_assert_equal_oid(&parent_id, git_commit_parent_id(commit, 0)); - - git_oid_fromstr(&tree_id, "4461379789c777d2a6c1f2ee0e9d6c86731b9992"); - cl_assert_equal_oid(&tree_id, git_commit_tree_id(commit)); - - cl_assert_equal_s(NULL, git_commit_message_encoding(commit)); - cl_assert_equal_s("Modification 1 to beef\n", git_commit_message(commit)); - - cl_git_pass(git_signature_new(&author, - "Edward Thomson", "ethomson@edwardthomson.com", 1405621769, 0-(4*60))); - cl_assert(git_signature__equal(author, git_commit_author(commit))); - - cl_assert(git_signature__equal(signature, git_commit_committer(commit))); - - /* Make sure the reflogs are updated appropriately */ - cl_git_pass(git_reflog_read(&reflog, repo, "HEAD")); - cl_assert(reflog_entry = git_reflog_entry_byindex(reflog, 0)); - cl_assert_equal_oid(&parent_id, git_reflog_entry_id_old(reflog_entry)); - cl_assert_equal_oid(&commit_id, git_reflog_entry_id_new(reflog_entry)); - cl_assert_equal_s("rebase: Modification 1 to beef", git_reflog_entry_message(reflog_entry)); - - git_reflog_free(reflog); - git_signature_free(author); - git_commit_free(commit); - git_annotated_commit_free(branch_head); - git_annotated_commit_free(upstream_head); - git_reference_free(branch_ref); - git_reference_free(upstream_ref); - git_rebase_free(rebase); -} - -void test_rebase_merge__blocked_when_dirty(void) -{ - git_rebase *rebase; - git_reference *branch_ref, *upstream_ref; - git_annotated_commit *branch_head, *upstream_head; - git_rebase_operation *rebase_operation; - git_oid commit_id; - - cl_git_pass(git_reference_lookup(&branch_ref, repo, "refs/heads/beef")); - cl_git_pass(git_reference_lookup(&upstream_ref, repo, "refs/heads/master")); - - cl_git_pass(git_annotated_commit_from_ref(&branch_head, repo, branch_ref)); - cl_git_pass(git_annotated_commit_from_ref(&upstream_head, repo, upstream_ref)); - - cl_git_pass(git_rebase_init(&rebase, repo, branch_head, upstream_head, NULL, NULL)); - - /* Allow untracked files */ - cl_git_pass(git_rebase_next(&rebase_operation, rebase)); - cl_git_mkfile("rebase/untracked_file.txt", "This is untracked\n"); - cl_git_pass(git_rebase_commit(&commit_id, rebase, NULL, signature, - NULL, NULL)); - - /* Do not allow unstaged */ - cl_git_pass(git_rebase_next(&rebase_operation, rebase)); - cl_git_mkfile("rebase/veal.txt", "This is an unstaged change\n"); - cl_git_fail_with(GIT_EUNMERGED, git_rebase_commit(&commit_id, rebase, NULL, signature, - NULL, NULL)); - - git_annotated_commit_free(branch_head); - git_annotated_commit_free(upstream_head); - git_reference_free(branch_ref); - git_reference_free(upstream_ref); - git_rebase_free(rebase); -} - -void test_rebase_merge__commit_updates_rewritten(void) -{ - git_rebase *rebase; - git_reference *branch_ref, *upstream_ref; - git_annotated_commit *branch_head, *upstream_head; - git_rebase_operation *rebase_operation; - git_oid commit_id; - - cl_git_pass(git_reference_lookup(&branch_ref, repo, "refs/heads/beef")); - cl_git_pass(git_reference_lookup(&upstream_ref, repo, "refs/heads/master")); - - cl_git_pass(git_annotated_commit_from_ref(&branch_head, repo, branch_ref)); - cl_git_pass(git_annotated_commit_from_ref(&upstream_head, repo, upstream_ref)); - - cl_git_pass(git_rebase_init(&rebase, repo, branch_head, upstream_head, NULL, NULL)); - - cl_git_pass(git_rebase_next(&rebase_operation, rebase)); - cl_git_pass(git_rebase_commit(&commit_id, rebase, NULL, signature, - NULL, NULL)); - - cl_git_pass(git_rebase_next(&rebase_operation, rebase)); - cl_git_pass(git_rebase_commit(&commit_id, rebase, NULL, signature, - NULL, NULL)); - - cl_assert_equal_file( - "da9c51a23d02d931a486f45ad18cda05cf5d2b94 776e4c48922799f903f03f5f6e51da8b01e4cce0\n" - "8d1f13f93c4995760ac07d129246ac1ff64c0be9 ba1f9b4fd5cf8151f7818be2111cc0869f1eb95a\n", - 164, "rebase/.git/rebase-merge/rewritten"); - - git_annotated_commit_free(branch_head); - git_annotated_commit_free(upstream_head); - git_reference_free(branch_ref); - git_reference_free(upstream_ref); - git_rebase_free(rebase); -} - -void test_rebase_merge__commit_drops_already_applied(void) -{ - git_rebase *rebase; - git_reference *branch_ref, *upstream_ref; - git_annotated_commit *branch_head, *upstream_head; - git_rebase_operation *rebase_operation; - git_oid commit_id; - int error; - - cl_git_pass(git_reference_lookup(&branch_ref, repo, "refs/heads/beef")); - cl_git_pass(git_reference_lookup(&upstream_ref, repo, "refs/heads/green_pea")); - - cl_git_pass(git_annotated_commit_from_ref(&branch_head, repo, branch_ref)); - cl_git_pass(git_annotated_commit_from_ref(&upstream_head, repo, upstream_ref)); - - cl_git_pass(git_rebase_init(&rebase, repo, branch_head, upstream_head, NULL, NULL)); - - cl_git_pass(git_rebase_next(&rebase_operation, rebase)); - cl_git_fail(error = git_rebase_commit(&commit_id, rebase, NULL, signature, - NULL, NULL)); - - cl_assert_equal_i(GIT_EAPPLIED, error); - - cl_git_pass(git_rebase_next(&rebase_operation, rebase)); - cl_git_pass(git_rebase_commit(&commit_id, rebase, NULL, signature, - NULL, NULL)); - - cl_assert_equal_file( - "8d1f13f93c4995760ac07d129246ac1ff64c0be9 2ac4fb7b74c1287f6c792acad759e1ec01e18dae\n", - 82, "rebase/.git/rebase-merge/rewritten"); - - git_annotated_commit_free(branch_head); - git_annotated_commit_free(upstream_head); - git_reference_free(branch_ref); - git_reference_free(upstream_ref); - git_rebase_free(rebase); -} - -void test_rebase_merge__finish(void) -{ - git_rebase *rebase; - git_reference *branch_ref, *upstream_ref, *head_ref; - git_annotated_commit *branch_head, *upstream_head; - git_rebase_operation *rebase_operation; - git_oid commit_id; - git_reflog *reflog; - const git_reflog_entry *reflog_entry; - int error; - - cl_git_pass(git_reference_lookup(&branch_ref, repo, "refs/heads/gravy")); - cl_git_pass(git_reference_lookup(&upstream_ref, repo, "refs/heads/veal")); - - cl_git_pass(git_annotated_commit_from_ref(&branch_head, repo, branch_ref)); - cl_git_pass(git_annotated_commit_from_ref(&upstream_head, repo, upstream_ref)); - - cl_git_pass(git_rebase_init(&rebase, repo, branch_head, upstream_head, NULL, NULL)); - - cl_git_pass(git_rebase_next(&rebase_operation, rebase)); - cl_git_pass(git_rebase_commit(&commit_id, rebase, NULL, signature, - NULL, NULL)); - - cl_git_fail(error = git_rebase_next(&rebase_operation, rebase)); - cl_assert_equal_i(GIT_ITEROVER, error); - - cl_git_pass(git_rebase_finish(rebase, signature)); - - cl_assert_equal_i(GIT_REPOSITORY_STATE_NONE, git_repository_state(repo)); - - cl_git_pass(git_reference_lookup(&head_ref, repo, "HEAD")); - cl_assert_equal_i(GIT_REF_SYMBOLIC, git_reference_type(head_ref)); - cl_assert_equal_s("refs/heads/gravy", git_reference_symbolic_target(head_ref)); - - /* Make sure the reflogs are updated appropriately */ - cl_git_pass(git_reflog_read(&reflog, repo, "HEAD")); - cl_assert(reflog_entry = git_reflog_entry_byindex(reflog, 0)); - cl_assert_equal_oid(&commit_id, git_reflog_entry_id_old(reflog_entry)); - cl_assert_equal_oid(&commit_id, git_reflog_entry_id_new(reflog_entry)); - cl_assert_equal_s("rebase finished: returning to refs/heads/gravy", git_reflog_entry_message(reflog_entry)); - git_reflog_free(reflog); - - cl_git_pass(git_reflog_read(&reflog, repo, "refs/heads/gravy")); - cl_assert(reflog_entry = git_reflog_entry_byindex(reflog, 0)); - cl_assert_equal_oid(git_annotated_commit_id(branch_head), git_reflog_entry_id_old(reflog_entry)); - cl_assert_equal_oid(&commit_id, git_reflog_entry_id_new(reflog_entry)); - cl_assert_equal_s("rebase finished: refs/heads/gravy onto f87d14a4a236582a0278a916340a793714256864", git_reflog_entry_message(reflog_entry)); - - git_reflog_free(reflog); - git_annotated_commit_free(branch_head); - git_annotated_commit_free(upstream_head); - git_reference_free(head_ref); - git_reference_free(branch_ref); - git_reference_free(upstream_ref); - git_rebase_free(rebase); -} - -static void test_copy_note( - const git_rebase_options *opts, - bool should_exist) -{ - git_rebase *rebase; - git_reference *branch_ref, *upstream_ref; - git_annotated_commit *branch_head, *upstream_head; - git_commit *branch_commit; - git_rebase_operation *rebase_operation; - git_oid note_id, commit_id; - git_note *note = NULL; - int error; - - cl_git_pass(git_reference_lookup(&branch_ref, repo, "refs/heads/gravy")); - cl_git_pass(git_reference_lookup(&upstream_ref, repo, "refs/heads/veal")); - - cl_git_pass(git_annotated_commit_from_ref(&branch_head, repo, branch_ref)); - cl_git_pass(git_annotated_commit_from_ref(&upstream_head, repo, upstream_ref)); - - cl_git_pass(git_reference_peel((git_object **)&branch_commit, - branch_ref, GIT_OBJ_COMMIT)); - - /* Add a note to a commit */ - cl_git_pass(git_note_create(¬e_id, repo, "refs/notes/test", - git_commit_author(branch_commit), git_commit_committer(branch_commit), - git_commit_id(branch_commit), - "This is a commit note.", 0)); - - cl_git_pass(git_rebase_init(&rebase, repo, branch_head, upstream_head, NULL, opts)); - - cl_git_pass(git_rebase_next(&rebase_operation, rebase)); - cl_git_pass(git_rebase_commit(&commit_id, rebase, NULL, signature, - NULL, NULL)); - - cl_git_pass(git_rebase_finish(rebase, signature)); - - cl_assert_equal_i(GIT_REPOSITORY_STATE_NONE, git_repository_state(repo)); - - if (should_exist) { - cl_git_pass(git_note_read(¬e, repo, "refs/notes/test", &commit_id)); - cl_assert_equal_s("This is a commit note.", git_note_message(note)); - } else { - cl_git_fail(error = - git_note_read(¬e, repo, "refs/notes/test", &commit_id)); - cl_assert_equal_i(GIT_ENOTFOUND, error); - } - - git_note_free(note); - git_commit_free(branch_commit); - git_annotated_commit_free(branch_head); - git_annotated_commit_free(upstream_head); - git_reference_free(branch_ref); - git_reference_free(upstream_ref); - git_rebase_free(rebase); -} - -void test_rebase_merge__copy_notes_off_by_default(void) -{ - test_copy_note(NULL, 0); -} - -void test_rebase_merge__copy_notes_specified_in_options(void) -{ - git_rebase_options opts = GIT_REBASE_OPTIONS_INIT; - opts.rewrite_notes_ref = "refs/notes/test"; - - test_copy_note(&opts, 1); -} - -void test_rebase_merge__copy_notes_specified_in_config(void) -{ - git_config *config; - - cl_git_pass(git_repository_config(&config, repo)); - cl_git_pass(git_config_set_string(config, - "notes.rewriteRef", "refs/notes/test")); - - test_copy_note(NULL, 1); -} - -void test_rebase_merge__copy_notes_disabled_in_config(void) -{ - git_config *config; - - cl_git_pass(git_repository_config(&config, repo)); - cl_git_pass(git_config_set_bool(config, "notes.rewrite.rebase", 0)); - cl_git_pass(git_config_set_string(config, - "notes.rewriteRef", "refs/notes/test")); - - test_copy_note(NULL, 0); -} - -void rebase_checkout_progress_cb( - const char *path, - size_t completed_steps, - size_t total_steps, - void *payload) -{ - int *called = payload; - - GIT_UNUSED(path); - GIT_UNUSED(completed_steps); - GIT_UNUSED(total_steps); - - *called = 1; -} - -void test_rebase_merge__custom_checkout_options(void) -{ - git_rebase *rebase; - git_reference *branch_ref, *upstream_ref; - git_annotated_commit *branch_head, *upstream_head; - git_rebase_options rebase_options = GIT_REBASE_OPTIONS_INIT; - git_checkout_options checkout_options = GIT_CHECKOUT_OPTIONS_INIT; - git_rebase_operation *rebase_operation; - int called = 0; - - checkout_options.progress_cb = rebase_checkout_progress_cb; - checkout_options.progress_payload = &called; - - memcpy(&rebase_options.checkout_options, &checkout_options, - sizeof(git_checkout_options)); - - cl_git_pass(git_reference_lookup(&branch_ref, repo, "refs/heads/beef")); - cl_git_pass(git_reference_lookup(&upstream_ref, repo, "refs/heads/master")); - - cl_git_pass(git_annotated_commit_from_ref(&branch_head, repo, branch_ref)); - cl_git_pass(git_annotated_commit_from_ref(&upstream_head, repo, upstream_ref)); - - called = 0; - cl_git_pass(git_rebase_init(&rebase, repo, branch_head, upstream_head, NULL, &rebase_options)); - cl_assert_equal_i(1, called); - - called = 0; - cl_git_pass(git_rebase_next(&rebase_operation, rebase)); - cl_assert_equal_i(1, called); - - called = 0; - cl_git_pass(git_rebase_abort(rebase)); - cl_assert_equal_i(1, called); - - git_annotated_commit_free(branch_head); - git_annotated_commit_free(upstream_head); - git_reference_free(branch_ref); - git_reference_free(upstream_ref); - git_rebase_free(rebase); -} diff --git a/vendor/libgit2/tests/rebase/setup.c b/vendor/libgit2/tests/rebase/setup.c deleted file mode 100644 index 627d3b9de4..0000000000 --- a/vendor/libgit2/tests/rebase/setup.c +++ /dev/null @@ -1,391 +0,0 @@ -#include "clar_libgit2.h" -#include "git2/rebase.h" -#include "posix.h" - -#include - -static git_repository *repo; -static git_index *_index; -static git_signature *signature; - -// Fixture setup and teardown -void test_rebase_setup__initialize(void) -{ - repo = cl_git_sandbox_init("rebase"); - cl_git_pass(git_repository_index(&_index, repo)); - cl_git_pass(git_signature_now(&signature, "Rebaser", "rebaser@rebaser.rb")); -} - -void test_rebase_setup__cleanup(void) -{ - git_signature_free(signature); - git_index_free(_index); - cl_git_sandbox_cleanup(); -} - -/* git checkout beef ; git rebase --merge master - * git checkout beef ; git rebase --merge master */ -void test_rebase_setup__blocked_when_in_progress(void) -{ - git_rebase *rebase; - git_reference *branch_ref, *upstream_ref; - git_annotated_commit *branch_head, *upstream_head; - - cl_assert_equal_i(GIT_REPOSITORY_STATE_NONE, git_repository_state(repo)); - - cl_git_pass(git_reference_lookup(&branch_ref, repo, "refs/heads/beef")); - cl_git_pass(git_reference_lookup(&upstream_ref, repo, "refs/heads/master")); - - cl_git_pass(git_annotated_commit_from_ref(&branch_head, repo, branch_ref)); - cl_git_pass(git_annotated_commit_from_ref(&upstream_head, repo, upstream_ref)); - - cl_git_pass(git_rebase_init(&rebase, repo, branch_head, upstream_head, NULL, NULL)); - git_rebase_free(rebase); - - cl_assert_equal_i(GIT_REPOSITORY_STATE_REBASE_MERGE, git_repository_state(repo)); - - cl_git_fail(git_rebase_init(&rebase, repo, branch_head, upstream_head, NULL, NULL)); - - git_annotated_commit_free(branch_head); - git_annotated_commit_free(upstream_head); - git_reference_free(branch_ref); - git_reference_free(upstream_ref); -} - -/* git checkout beef ; git rebase --merge master */ -void test_rebase_setup__merge(void) -{ - git_rebase *rebase; - git_reference *branch_ref, *upstream_ref; - git_annotated_commit *branch_head, *upstream_head; - git_reference *head; - git_commit *head_commit; - git_oid head_id; - - cl_assert_equal_i(GIT_REPOSITORY_STATE_NONE, git_repository_state(repo)); - - cl_git_pass(git_reference_lookup(&branch_ref, repo, "refs/heads/beef")); - cl_git_pass(git_reference_lookup(&upstream_ref, repo, "refs/heads/master")); - - cl_git_pass(git_annotated_commit_from_ref(&branch_head, repo, branch_ref)); - cl_git_pass(git_annotated_commit_from_ref(&upstream_head, repo, upstream_ref)); - - cl_git_pass(git_rebase_init(&rebase, repo, branch_head, upstream_head, NULL, NULL)); - - cl_assert_equal_i(GIT_REPOSITORY_STATE_REBASE_MERGE, git_repository_state(repo)); - - git_oid_fromstr(&head_id, "efad0b11c47cb2f0220cbd6f5b0f93bb99064b00"); - cl_git_pass(git_repository_head(&head, repo)); - cl_git_pass(git_reference_peel((git_object **)&head_commit, head, GIT_OBJ_COMMIT)); - cl_assert_equal_oid(&head_id, git_commit_id(head_commit)); - - cl_assert_equal_file("b146bd7608eac53d9bf9e1a6963543588b555c64\n", 41, "rebase/.git/ORIG_HEAD"); - - cl_assert_equal_file("da9c51a23d02d931a486f45ad18cda05cf5d2b94\n", 41, "rebase/.git/rebase-merge/cmt.1"); - cl_assert_equal_file("8d1f13f93c4995760ac07d129246ac1ff64c0be9\n", 41, "rebase/.git/rebase-merge/cmt.2"); - cl_assert_equal_file("3069cc907e6294623e5917ef6de663928c1febfb\n", 41, "rebase/.git/rebase-merge/cmt.3"); - cl_assert_equal_file("588e5d2f04d49707fe4aab865e1deacaf7ef6787\n", 41, "rebase/.git/rebase-merge/cmt.4"); - cl_assert_equal_file("b146bd7608eac53d9bf9e1a6963543588b555c64\n", 41, "rebase/.git/rebase-merge/cmt.5"); - cl_assert_equal_file("5\n", 2, "rebase/.git/rebase-merge/end"); - cl_assert_equal_file("efad0b11c47cb2f0220cbd6f5b0f93bb99064b00\n", 41, "rebase/.git/rebase-merge/onto"); - cl_assert_equal_file("master\n", 7, "rebase/.git/rebase-merge/onto_name"); - cl_assert_equal_file("b146bd7608eac53d9bf9e1a6963543588b555c64\n", 41, "rebase/.git/rebase-merge/orig-head"); - - git_commit_free(head_commit); - git_reference_free(head); - git_annotated_commit_free(branch_head); - git_annotated_commit_free(upstream_head); - git_reference_free(branch_ref); - git_reference_free(upstream_ref); - git_rebase_free(rebase); -} - -/* git checkout beef && git rebase --merge --root --onto master */ -void test_rebase_setup__merge_root(void) -{ - git_rebase *rebase; - git_reference *branch_ref, *onto_ref; - git_annotated_commit *branch_head, *onto_head; - git_reference *head; - git_commit *head_commit; - git_oid head_id; - - cl_assert_equal_i(GIT_REPOSITORY_STATE_NONE, git_repository_state(repo)); - - cl_git_pass(git_reference_lookup(&branch_ref, repo, "refs/heads/beef")); - cl_git_pass(git_reference_lookup(&onto_ref, repo, "refs/heads/master")); - - cl_git_pass(git_annotated_commit_from_ref(&branch_head, repo, branch_ref)); - cl_git_pass(git_annotated_commit_from_ref(&onto_head, repo, onto_ref)); - - cl_git_pass(git_rebase_init(&rebase, repo, branch_head, NULL, onto_head, NULL)); - - git_oid_fromstr(&head_id, "efad0b11c47cb2f0220cbd6f5b0f93bb99064b00"); - cl_git_pass(git_repository_head(&head, repo)); - cl_git_pass(git_reference_peel((git_object **)&head_commit, head, GIT_OBJ_COMMIT)); - cl_assert_equal_oid(&head_id, git_commit_id(head_commit)); - - cl_assert_equal_file("b146bd7608eac53d9bf9e1a6963543588b555c64\n", 41, "rebase/.git/ORIG_HEAD"); - - cl_assert_equal_i(GIT_REPOSITORY_STATE_REBASE_MERGE, git_repository_state(repo)); - - cl_assert_equal_file("da9c51a23d02d931a486f45ad18cda05cf5d2b94\n", 41, "rebase/.git/rebase-merge/cmt.1"); - cl_assert_equal_file("8d1f13f93c4995760ac07d129246ac1ff64c0be9\n", 41, "rebase/.git/rebase-merge/cmt.2"); - cl_assert_equal_file("3069cc907e6294623e5917ef6de663928c1febfb\n", 41, "rebase/.git/rebase-merge/cmt.3"); - cl_assert_equal_file("588e5d2f04d49707fe4aab865e1deacaf7ef6787\n", 41, "rebase/.git/rebase-merge/cmt.4"); - cl_assert_equal_file("b146bd7608eac53d9bf9e1a6963543588b555c64\n", 41, "rebase/.git/rebase-merge/cmt.5"); - cl_assert_equal_file("5\n", 2, "rebase/.git/rebase-merge/end"); - cl_assert_equal_file("efad0b11c47cb2f0220cbd6f5b0f93bb99064b00\n", 41, "rebase/.git/rebase-merge/onto"); - cl_assert_equal_file("master\n", 7, "rebase/.git/rebase-merge/onto_name"); - cl_assert_equal_file("b146bd7608eac53d9bf9e1a6963543588b555c64\n", 41, "rebase/.git/rebase-merge/orig-head"); - - git_commit_free(head_commit); - git_reference_free(head); - git_annotated_commit_free(branch_head); - git_annotated_commit_free(onto_head); - git_reference_free(branch_ref); - git_reference_free(onto_ref); - git_rebase_free(rebase); -} - -/* git checkout gravy && git rebase --merge --onto master veal */ -void test_rebase_setup__merge_onto_and_upstream(void) -{ - git_rebase *rebase; - git_reference *branch1_ref, *branch2_ref, *onto_ref; - git_annotated_commit *branch1_head, *branch2_head, *onto_head; - git_reference *head; - git_commit *head_commit; - git_oid head_id; - - cl_assert_equal_i(GIT_REPOSITORY_STATE_NONE, git_repository_state(repo)); - - cl_git_pass(git_reference_lookup(&branch1_ref, repo, "refs/heads/gravy")); - cl_git_pass(git_reference_lookup(&branch2_ref, repo, "refs/heads/veal")); - cl_git_pass(git_reference_lookup(&onto_ref, repo, "refs/heads/master")); - - cl_git_pass(git_annotated_commit_from_ref(&branch1_head, repo, branch1_ref)); - cl_git_pass(git_annotated_commit_from_ref(&branch2_head, repo, branch2_ref)); - cl_git_pass(git_annotated_commit_from_ref(&onto_head, repo, onto_ref)); - - cl_git_pass(git_rebase_init(&rebase, repo, branch1_head, branch2_head, onto_head, NULL)); - - git_oid_fromstr(&head_id, "efad0b11c47cb2f0220cbd6f5b0f93bb99064b00"); - cl_git_pass(git_repository_head(&head, repo)); - cl_git_pass(git_reference_peel((git_object **)&head_commit, head, GIT_OBJ_COMMIT)); - cl_assert_equal_oid(&head_id, git_commit_id(head_commit)); - - cl_assert_equal_file("d616d97082eb7bb2dc6f180a7cca940993b7a56f\n", 41, "rebase/.git/ORIG_HEAD"); - - cl_assert_equal_i(GIT_REPOSITORY_STATE_REBASE_MERGE, git_repository_state(repo)); - - cl_assert_equal_file("d616d97082eb7bb2dc6f180a7cca940993b7a56f\n", 41, "rebase/.git/rebase-merge/cmt.1"); - cl_assert_equal_file("1\n", 2, "rebase/.git/rebase-merge/end"); - cl_assert_equal_file("efad0b11c47cb2f0220cbd6f5b0f93bb99064b00\n", 41, "rebase/.git/rebase-merge/onto"); - cl_assert_equal_file("master\n", 7, "rebase/.git/rebase-merge/onto_name"); - cl_assert_equal_file("d616d97082eb7bb2dc6f180a7cca940993b7a56f\n", 41, "rebase/.git/rebase-merge/orig-head"); - - git_commit_free(head_commit); - git_reference_free(head); - git_annotated_commit_free(branch1_head); - git_annotated_commit_free(branch2_head); - git_annotated_commit_free(onto_head); - git_reference_free(branch1_ref); - git_reference_free(branch2_ref); - git_reference_free(onto_ref); - git_rebase_free(rebase); -} - -/* Ensure merge commits are dropped in a rebase */ -/* git checkout veal && git rebase --merge master */ -void test_rebase_setup__branch_with_merges(void) -{ - git_rebase *rebase; - git_reference *branch_ref, *upstream_ref; - git_annotated_commit *branch_head, *upstream_head; - git_reference *head; - git_commit *head_commit; - git_oid head_id; - - cl_assert_equal_i(GIT_REPOSITORY_STATE_NONE, git_repository_state(repo)); - - cl_git_pass(git_reference_lookup(&branch_ref, repo, "refs/heads/veal")); - cl_git_pass(git_reference_lookup(&upstream_ref, repo, "refs/heads/master")); - - cl_git_pass(git_annotated_commit_from_ref(&branch_head, repo, branch_ref)); - cl_git_pass(git_annotated_commit_from_ref(&upstream_head, repo, upstream_ref)); - - cl_git_pass(git_rebase_init(&rebase, repo, branch_head, upstream_head, NULL, NULL)); - - cl_assert_equal_i(GIT_REPOSITORY_STATE_REBASE_MERGE, git_repository_state(repo)); - - git_oid_fromstr(&head_id, "efad0b11c47cb2f0220cbd6f5b0f93bb99064b00"); - cl_git_pass(git_repository_head(&head, repo)); - cl_git_pass(git_reference_peel((git_object **)&head_commit, head, GIT_OBJ_COMMIT)); - cl_assert_equal_oid(&head_id, git_commit_id(head_commit)); - - cl_assert_equal_file("f87d14a4a236582a0278a916340a793714256864\n", 41, "rebase/.git/ORIG_HEAD"); - - cl_assert_equal_file("4bed71df7017283cac61bbf726197ad6a5a18b84\n", 41, "rebase/.git/rebase-merge/cmt.1"); - cl_assert_equal_file("2aa3ce842094e08ebac152b3d6d5b0fff39f9c6e\n", 41, "rebase/.git/rebase-merge/cmt.2"); - cl_assert_equal_file("3e8989b5a16d5258c935d998ef0e6bb139cc4757\n", 41, "rebase/.git/rebase-merge/cmt.3"); - cl_assert_equal_file("4cacc6f6e740a5bc64faa33e04b8ef0733d8a127\n", 41, "rebase/.git/rebase-merge/cmt.4"); - cl_assert_equal_file("f87d14a4a236582a0278a916340a793714256864\n", 41, "rebase/.git/rebase-merge/cmt.5"); - cl_assert_equal_file("5\n", 2, "rebase/.git/rebase-merge/end"); - cl_assert_equal_file("efad0b11c47cb2f0220cbd6f5b0f93bb99064b00\n", 41, "rebase/.git/rebase-merge/onto"); - cl_assert_equal_file("master\n", 7, "rebase/.git/rebase-merge/onto_name"); - cl_assert_equal_file("f87d14a4a236582a0278a916340a793714256864\n", 41, "rebase/.git/rebase-merge/orig-head"); - - git_commit_free(head_commit); - git_reference_free(head); - git_annotated_commit_free(branch_head); - git_annotated_commit_free(upstream_head); - git_reference_free(branch_ref); - git_reference_free(upstream_ref); - git_rebase_free(rebase); -} - -/* git checkout barley && git rebase --merge master */ -void test_rebase_setup__orphan_branch(void) -{ - git_rebase *rebase; - git_reference *branch_ref, *upstream_ref; - git_annotated_commit *branch_head, *upstream_head; - git_reference *head; - git_commit *head_commit; - git_oid head_id; - - cl_assert_equal_i(GIT_REPOSITORY_STATE_NONE, git_repository_state(repo)); - - cl_git_pass(git_reference_lookup(&branch_ref, repo, "refs/heads/barley")); - cl_git_pass(git_reference_lookup(&upstream_ref, repo, "refs/heads/master")); - - cl_git_pass(git_annotated_commit_from_ref(&branch_head, repo, branch_ref)); - cl_git_pass(git_annotated_commit_from_ref(&upstream_head, repo, upstream_ref)); - - cl_git_pass(git_rebase_init(&rebase, repo, branch_head, upstream_head, NULL, NULL)); - - cl_assert_equal_i(GIT_REPOSITORY_STATE_REBASE_MERGE, git_repository_state(repo)); - - git_oid_fromstr(&head_id, "efad0b11c47cb2f0220cbd6f5b0f93bb99064b00"); - cl_git_pass(git_repository_head(&head, repo)); - cl_git_pass(git_reference_peel((git_object **)&head_commit, head, GIT_OBJ_COMMIT)); - cl_assert_equal_oid(&head_id, git_commit_id(head_commit)); - - cl_assert_equal_file("12c084412b952396962eb420716df01022b847cc\n", 41, "rebase/.git/ORIG_HEAD"); - - cl_assert_equal_file("aa4c42aecdfc7cd989bbc3209934ea7cda3f4d88\n", 41, "rebase/.git/rebase-merge/cmt.1"); - cl_assert_equal_file("e4f809f826c1a9fc929874bc0e4644dd2f2a1af4\n", 41, "rebase/.git/rebase-merge/cmt.2"); - cl_assert_equal_file("9539b2cc291d6a6b1b266df8474d31fdd344dd79\n", 41, "rebase/.git/rebase-merge/cmt.3"); - cl_assert_equal_file("013cc32d341bab0e6f039f50f153c18986f16c58\n", 41, "rebase/.git/rebase-merge/cmt.4"); - cl_assert_equal_file("12c084412b952396962eb420716df01022b847cc\n", 41, "rebase/.git/rebase-merge/cmt.5"); - cl_assert_equal_file("5\n", 2, "rebase/.git/rebase-merge/end"); - cl_assert_equal_file("efad0b11c47cb2f0220cbd6f5b0f93bb99064b00\n", 41, "rebase/.git/rebase-merge/onto"); - cl_assert_equal_file("master\n", 7, "rebase/.git/rebase-merge/onto_name"); - cl_assert_equal_file("12c084412b952396962eb420716df01022b847cc\n", 41, "rebase/.git/rebase-merge/orig-head"); - - git_commit_free(head_commit); - git_reference_free(head); - git_annotated_commit_free(branch_head); - git_annotated_commit_free(upstream_head); - git_reference_free(branch_ref); - git_reference_free(upstream_ref); - git_rebase_free(rebase); -} - -/* git checkout beef && git rebase --merge master */ -void test_rebase_setup__merge_null_branch_uses_HEAD(void) -{ - git_rebase *rebase; - git_reference *upstream_ref; - git_annotated_commit *upstream_head; - git_reference *head; - git_commit *head_commit; - git_oid head_id; - git_checkout_options checkout_opts = GIT_CHECKOUT_OPTIONS_INIT; - - checkout_opts.checkout_strategy = GIT_CHECKOUT_FORCE; - - cl_assert_equal_i(GIT_REPOSITORY_STATE_NONE, git_repository_state(repo)); - - cl_git_pass(git_repository_set_head(repo, "refs/heads/beef")); - cl_git_pass(git_checkout_head(repo, &checkout_opts)); - - cl_git_pass(git_reference_lookup(&upstream_ref, repo, "refs/heads/master")); - cl_git_pass(git_annotated_commit_from_ref(&upstream_head, repo, upstream_ref)); - - cl_git_pass(git_rebase_init(&rebase, repo, NULL, upstream_head, NULL, NULL)); - - cl_assert_equal_i(GIT_REPOSITORY_STATE_REBASE_MERGE, git_repository_state(repo)); - - git_oid_fromstr(&head_id, "efad0b11c47cb2f0220cbd6f5b0f93bb99064b00"); - cl_git_pass(git_repository_head(&head, repo)); - cl_git_pass(git_reference_peel((git_object **)&head_commit, head, GIT_OBJ_COMMIT)); - cl_assert_equal_oid(&head_id, git_commit_id(head_commit)); - - cl_assert_equal_file("b146bd7608eac53d9bf9e1a6963543588b555c64\n", 41, "rebase/.git/ORIG_HEAD"); - - cl_assert_equal_file("da9c51a23d02d931a486f45ad18cda05cf5d2b94\n", 41, "rebase/.git/rebase-merge/cmt.1"); - cl_assert_equal_file("8d1f13f93c4995760ac07d129246ac1ff64c0be9\n", 41, "rebase/.git/rebase-merge/cmt.2"); - cl_assert_equal_file("3069cc907e6294623e5917ef6de663928c1febfb\n", 41, "rebase/.git/rebase-merge/cmt.3"); - cl_assert_equal_file("588e5d2f04d49707fe4aab865e1deacaf7ef6787\n", 41, "rebase/.git/rebase-merge/cmt.4"); - cl_assert_equal_file("b146bd7608eac53d9bf9e1a6963543588b555c64\n", 41, "rebase/.git/rebase-merge/cmt.5"); - cl_assert_equal_file("5\n", 2, "rebase/.git/rebase-merge/end"); - cl_assert_equal_file("efad0b11c47cb2f0220cbd6f5b0f93bb99064b00\n", 41, "rebase/.git/rebase-merge/onto"); - cl_assert_equal_file("master\n", 7, "rebase/.git/rebase-merge/onto_name"); - cl_assert_equal_file("b146bd7608eac53d9bf9e1a6963543588b555c64\n", 41, "rebase/.git/rebase-merge/orig-head"); - - git_commit_free(head_commit); - git_reference_free(head); - git_annotated_commit_free(upstream_head); - git_reference_free(upstream_ref); - git_rebase_free(rebase); -} - -static int rebase_is_blocked(void) -{ - git_rebase *rebase = NULL; - int error; - - git_reference *branch_ref, *upstream_ref; - git_annotated_commit *branch_head, *upstream_head; - - cl_assert_equal_i(GIT_REPOSITORY_STATE_NONE, git_repository_state(repo)); - - cl_git_pass(git_reference_lookup(&branch_ref, repo, "refs/heads/beef")); - cl_git_pass(git_reference_lookup(&upstream_ref, repo, "refs/heads/master")); - - cl_git_pass(git_annotated_commit_from_ref(&branch_head, repo, branch_ref)); - cl_git_pass(git_annotated_commit_from_ref(&upstream_head, repo, upstream_ref)); - - error = git_rebase_init(&rebase, repo, branch_head, upstream_head, NULL, NULL); - - git_annotated_commit_free(branch_head); - git_annotated_commit_free(upstream_head); - - git_reference_free(branch_ref); - git_reference_free(upstream_ref); - git_rebase_free(rebase); - - return error; -} - -void test_rebase_setup__blocked_for_staged_change(void) -{ - cl_git_rewritefile("rebase/newfile.txt", "Stage an add"); - git_index_add_bypath(_index, "newfile.txt"); - cl_git_fail(rebase_is_blocked()); -} - -void test_rebase_setup__blocked_for_unstaged_change(void) -{ - cl_git_rewritefile("rebase/asparagus.txt", "Unstaged change"); - cl_git_fail(rebase_is_blocked()); -} - -void test_rebase_setup__not_blocked_for_untracked_add(void) -{ - cl_git_rewritefile("rebase/newfile.txt", "Untracked file"); - cl_git_pass(rebase_is_blocked()); -} - diff --git a/vendor/libgit2/tests/refs/branches/create.c b/vendor/libgit2/tests/refs/branches/create.c deleted file mode 100644 index 31dec0678f..0000000000 --- a/vendor/libgit2/tests/refs/branches/create.c +++ /dev/null @@ -1,300 +0,0 @@ -#include "clar_libgit2.h" -#include "refs.h" -#include "path.h" - -static git_repository *repo; -static git_commit *target; -static git_reference *branch; - -void test_refs_branches_create__initialize(void) -{ - repo = cl_git_sandbox_init("testrepo.git"); - branch = NULL; - target = NULL; -} - -void test_refs_branches_create__cleanup(void) -{ - git_reference_free(branch); - branch = NULL; - - git_commit_free(target); - target = NULL; - - cl_git_sandbox_cleanup(); - repo = NULL; -} - -static void retrieve_target_from_oid(git_commit **out, git_repository *repo, const char *sha) -{ - git_object *obj; - - cl_git_pass(git_revparse_single(&obj, repo, sha)); - cl_git_pass(git_commit_lookup(out, repo, git_object_id(obj))); - git_object_free(obj); -} - -static void retrieve_known_commit(git_commit **commit, git_repository *repo) -{ - retrieve_target_from_oid(commit, repo, "e90810b8df3"); -} - -#define NEW_BRANCH_NAME "new-branch-on-the-block" - -void test_refs_branches_create__can_create_a_local_branch(void) -{ - retrieve_known_commit(&target, repo); - - cl_git_pass(git_branch_create(&branch, repo, NEW_BRANCH_NAME, target, 0)); - cl_git_pass(git_oid_cmp(git_reference_target(branch), git_commit_id(target))); -} - -void test_refs_branches_create__can_not_create_a_branch_if_its_name_collide_with_an_existing_one(void) -{ - retrieve_known_commit(&target, repo); - - cl_assert_equal_i(GIT_EEXISTS, git_branch_create(&branch, repo, "br2", target, 0)); -} - -void test_refs_branches_create__can_force_create_over_an_existing_branch(void) -{ - retrieve_known_commit(&target, repo); - - cl_git_pass(git_branch_create(&branch, repo, "br2", target, 1)); - cl_git_pass(git_oid_cmp(git_reference_target(branch), git_commit_id(target))); - cl_assert_equal_s("refs/heads/br2", git_reference_name(branch)); -} - -void test_refs_branches_create__cannot_force_create_over_current_branch(void) -{ - const git_oid *oid; - git_reference *branch2; - retrieve_known_commit(&target, repo); - - cl_git_pass(git_branch_lookup(&branch2, repo, "master", GIT_BRANCH_LOCAL)); - cl_assert_equal_s("refs/heads/master", git_reference_name(branch2)); - cl_assert_equal_i(true, git_branch_is_head(branch2)); - oid = git_reference_target(branch2); - - cl_git_fail_with(-1, git_branch_create(&branch, repo, "master", target, 1)); - branch = NULL; - cl_git_pass(git_branch_lookup(&branch, repo, "master", GIT_BRANCH_LOCAL)); - cl_assert_equal_s("refs/heads/master", git_reference_name(branch)); - cl_git_pass(git_oid_cmp(git_reference_target(branch), oid)); - git_reference_free(branch2); -} - -void test_refs_branches_create__creating_a_branch_with_an_invalid_name_returns_EINVALIDSPEC(void) -{ - retrieve_known_commit(&target, repo); - - cl_assert_equal_i(GIT_EINVALIDSPEC, - git_branch_create(&branch, repo, "inv@{id", target, 0)); -} - -void test_refs_branches_create__default_reflog_message(void) -{ - git_reflog *log; - git_buf buf = GIT_BUF_INIT; - const git_reflog_entry *entry; - git_annotated_commit *annotated; - git_signature *sig; - git_config *cfg; - - cl_git_pass(git_repository_config(&cfg, repo)); - cl_git_pass(git_config_set_string(cfg, "user.name", "Foo Bar")); - cl_git_pass(git_config_set_string(cfg, "user.email", "foo@example.com")); - git_config_free(cfg); - - cl_git_pass(git_signature_default(&sig, repo)); - - retrieve_known_commit(&target, repo); - cl_git_pass(git_branch_create(&branch, repo, NEW_BRANCH_NAME, target, false)); - cl_git_pass(git_reflog_read(&log, repo, "refs/heads/" NEW_BRANCH_NAME)); - - entry = git_reflog_entry_byindex(log, 0); - cl_git_pass(git_buf_printf(&buf, "branch: Created from %s", git_oid_tostr_s(git_commit_id(target)))); - cl_assert_equal_s(git_buf_cstr(&buf), git_reflog_entry_message(entry)); - cl_assert_equal_s(sig->email, git_reflog_entry_committer(entry)->email); - - cl_git_pass(git_reference_remove(repo, "refs/heads/" NEW_BRANCH_NAME)); - git_reference_free(branch); - git_reflog_free(log); - git_buf_clear(&buf); - - cl_git_pass(git_annotated_commit_from_revspec(&annotated, repo, "e90810b8df3")); - cl_git_pass(git_branch_create_from_annotated(&branch, repo, NEW_BRANCH_NAME, annotated, true)); - cl_git_pass(git_reflog_read(&log, repo, "refs/heads/" NEW_BRANCH_NAME)); - - entry = git_reflog_entry_byindex(log, 0); - cl_git_pass(git_buf_printf(&buf, "branch: Created from e90810b8df3")); - cl_assert_equal_s(git_buf_cstr(&buf), git_reflog_entry_message(entry)); - cl_assert_equal_s(sig->email, git_reflog_entry_committer(entry)->email); - - git_annotated_commit_free(annotated); - git_buf_free(&buf); - git_reflog_free(log); - git_signature_free(sig); -} - -static void assert_branch_matches_name( - const char *expected, const char *lookup_as) -{ - git_reference *ref; - git_buf b = GIT_BUF_INIT; - - cl_git_pass(git_branch_lookup(&ref, repo, lookup_as, GIT_BRANCH_LOCAL)); - - cl_git_pass(git_buf_sets(&b, "refs/heads/")); - cl_git_pass(git_buf_puts(&b, expected)); - cl_assert_equal_s(b.ptr, git_reference_name(ref)); - - cl_git_pass( - git_oid_cmp(git_reference_target(ref), git_commit_id(target))); - - git_reference_free(ref); - git_buf_free(&b); -} - -void test_refs_branches_create__can_create_branch_with_unicode(void) -{ - const char *nfc = "\xC3\x85\x73\x74\x72\xC3\xB6\x6D"; - const char *nfd = "\x41\xCC\x8A\x73\x74\x72\x6F\xCC\x88\x6D"; - const char *emoji = "\xF0\x9F\x8D\xB7"; - const char *names[] = { nfc, nfd, emoji }; - const char *alt[] = { nfd, nfc, NULL }; - const char *expected[] = { nfc, nfd, emoji }; - unsigned int i; - bool fs_decompose_unicode = - git_path_does_fs_decompose_unicode(git_repository_path(repo)); - - retrieve_known_commit(&target, repo); - - if (cl_repo_get_bool(repo, "core.precomposeunicode")) - expected[1] = nfc; - /* test decomp. because not all Mac filesystems decompose unicode */ - else if (fs_decompose_unicode) - expected[0] = nfd; - - for (i = 0; i < ARRAY_SIZE(names); ++i) { - const char *name; - cl_git_pass(git_branch_create( - &branch, repo, names[i], target, 0)); - cl_git_pass(git_oid_cmp( - git_reference_target(branch), git_commit_id(target))); - - cl_git_pass(git_branch_name(&name, branch)); - cl_assert_equal_s(expected[i], name); - assert_branch_matches_name(expected[i], names[i]); - if (fs_decompose_unicode && alt[i]) - assert_branch_matches_name(expected[i], alt[i]); - - cl_git_pass(git_branch_delete(branch)); - git_reference_free(branch); - branch = NULL; - } -} - -/** - * Verify that we can create a branch with a name that matches the - * namespace of a previously delete branch. - * - * git branch level_one/level_two - * git branch -D level_one/level_two - * git branch level_one - * - * We expect the delete to have deleted the files: - * ".git/refs/heads/level_one/level_two" - * ".git/logs/refs/heads/level_one/level_two" - * It may or may not have deleted the (now empty) - * containing directories. To match git.git behavior, - * the second create needs to implicilty delete the - * directories and create the new files. - * "refs/heads/level_one" - * "logs/refs/heads/level_one" - * - * We should not fail to create the branch or its - * reflog because of an obsolete namespace container - * directory. - */ -void test_refs_branches_create__name_vs_namespace(void) -{ - const char * name; - struct item { - const char *first; - const char *second; - }; - static const struct item item[] = { - { "level_one/level_two", "level_one" }, - { "a/b/c/d/e", "a/b/c/d" }, - { "ss/tt/uu/vv/ww", "ss" }, - /* And one test case that is deeper. */ - { "xx1/xx2/xx3/xx4", "xx1/xx2/xx3/xx4/xx5/xx6" }, - { NULL, NULL }, - }; - const struct item *p; - - retrieve_known_commit(&target, repo); - - for (p=item; p->first; p++) { - cl_git_pass(git_branch_create(&branch, repo, p->first, target, 0)); - cl_git_pass(git_oid_cmp(git_reference_target(branch), git_commit_id(target))); - cl_git_pass(git_branch_name(&name, branch)); - cl_assert_equal_s(name, p->first); - - cl_git_pass(git_branch_delete(branch)); - git_reference_free(branch); - branch = NULL; - - cl_git_pass(git_branch_create(&branch, repo, p->second, target, 0)); - git_reference_free(branch); - branch = NULL; - } -} - -/** - * We still need to fail if part of the namespace is - * still in use. - */ -void test_refs_branches_create__name_vs_namespace_fail(void) -{ - const char * name; - struct item { - const char *first; - const char *first_alternate; - const char *second; - }; - static const struct item item[] = { - { "level_one/level_two", "level_one/alternate", "level_one" }, - { "a/b/c/d/e", "a/b/c/d/alternate", "a/b/c/d" }, - { "ss/tt/uu/vv/ww", "ss/alternate", "ss" }, - { NULL, NULL, NULL }, - }; - const struct item *p; - - retrieve_known_commit(&target, repo); - - for (p=item; p->first; p++) { - cl_git_pass(git_branch_create(&branch, repo, p->first, target, 0)); - cl_git_pass(git_oid_cmp(git_reference_target(branch), git_commit_id(target))); - cl_git_pass(git_branch_name(&name, branch)); - cl_assert_equal_s(name, p->first); - - cl_git_pass(git_branch_delete(branch)); - git_reference_free(branch); - branch = NULL; - - cl_git_pass(git_branch_create(&branch, repo, p->first_alternate, target, 0)); - cl_git_pass(git_oid_cmp(git_reference_target(branch), git_commit_id(target))); - cl_git_pass(git_branch_name(&name, branch)); - cl_assert_equal_s(name, p->first_alternate); - - /* we do not delete the alternate. */ - git_reference_free(branch); - branch = NULL; - - cl_git_fail(git_branch_create(&branch, repo, p->second, target, 0)); - git_reference_free(branch); - branch = NULL; - } -} diff --git a/vendor/libgit2/tests/refs/branches/delete.c b/vendor/libgit2/tests/refs/branches/delete.c deleted file mode 100644 index 343ff0f508..0000000000 --- a/vendor/libgit2/tests/refs/branches/delete.c +++ /dev/null @@ -1,140 +0,0 @@ -#include "clar_libgit2.h" -#include "refs.h" -#include "repo/repo_helpers.h" -#include "config/config_helpers.h" - -static git_repository *repo; -static git_reference *fake_remote; - -void test_refs_branches_delete__initialize(void) -{ - git_oid id; - - repo = cl_git_sandbox_init("testrepo.git"); - - cl_git_pass(git_oid_fromstr(&id, "be3563ae3f795b2b4353bcce3a527ad0a4f7f644")); - cl_git_pass(git_reference_create(&fake_remote, repo, "refs/remotes/nulltoken/master", &id, 0, NULL)); -} - -void test_refs_branches_delete__cleanup(void) -{ - git_reference_free(fake_remote); - fake_remote = NULL; - - cl_git_sandbox_cleanup(); - repo = NULL; -} - -void test_refs_branches_delete__can_not_delete_a_branch_pointed_at_by_HEAD(void) -{ - git_reference *head; - git_reference *branch; - - /* Ensure HEAD targets the local master branch */ - cl_git_pass(git_reference_lookup(&head, repo, GIT_HEAD_FILE)); - cl_assert_equal_s("refs/heads/master", git_reference_symbolic_target(head)); - git_reference_free(head); - - cl_git_pass(git_branch_lookup(&branch, repo, "master", GIT_BRANCH_LOCAL)); - cl_git_fail(git_branch_delete(branch)); - git_reference_free(branch); -} - -void test_refs_branches_delete__can_delete_a_branch_even_if_HEAD_is_missing(void) -{ - git_reference *head; - git_reference *branch; - - cl_git_pass(git_reference_lookup(&head, repo, GIT_HEAD_FILE)); - git_reference_delete(head); - git_reference_free(head); - - cl_git_pass(git_branch_lookup(&branch, repo, "br2", GIT_BRANCH_LOCAL)); - cl_git_pass(git_branch_delete(branch)); - git_reference_free(branch); -} - -void test_refs_branches_delete__can_delete_a_branch_when_HEAD_is_unborn(void) -{ - git_reference *branch; - - make_head_unborn(repo, NON_EXISTING_HEAD); - - cl_git_pass(git_branch_lookup(&branch, repo, "br2", GIT_BRANCH_LOCAL)); - cl_git_pass(git_branch_delete(branch)); - git_reference_free(branch); -} - -void test_refs_branches_delete__can_delete_a_branch_pointed_at_by_detached_HEAD(void) -{ - git_reference *head, *branch; - - cl_git_pass(git_reference_lookup(&head, repo, GIT_HEAD_FILE)); - cl_assert_equal_i(GIT_REF_SYMBOLIC, git_reference_type(head)); - cl_assert_equal_s("refs/heads/master", git_reference_symbolic_target(head)); - git_reference_free(head); - - /* Detach HEAD and make it target the commit that "master" points to */ - git_repository_detach_head(repo); - - cl_git_pass(git_branch_lookup(&branch, repo, "master", GIT_BRANCH_LOCAL)); - cl_git_pass(git_branch_delete(branch)); - git_reference_free(branch); -} - -void test_refs_branches_delete__can_delete_a_local_branch(void) -{ - git_reference *branch; - cl_git_pass(git_branch_lookup(&branch, repo, "br2", GIT_BRANCH_LOCAL)); - cl_git_pass(git_branch_delete(branch)); - git_reference_free(branch); -} - -void test_refs_branches_delete__can_delete_a_remote_branch(void) -{ - git_reference *branch; - cl_git_pass(git_branch_lookup(&branch, repo, "nulltoken/master", GIT_BRANCH_REMOTE)); - cl_git_pass(git_branch_delete(branch)); - git_reference_free(branch); -} - -void test_refs_branches_delete__deleting_a_branch_removes_related_configuration_data(void) -{ - git_reference *branch; - - assert_config_entry_existence(repo, "branch.track-local.remote", true); - assert_config_entry_existence(repo, "branch.track-local.merge", true); - - cl_git_pass(git_branch_lookup(&branch, repo, "track-local", GIT_BRANCH_LOCAL)); - cl_git_pass(git_branch_delete(branch)); - git_reference_free(branch); - - assert_config_entry_existence(repo, "branch.track-local.remote", false); - assert_config_entry_existence(repo, "branch.track-local.merge", false); -} - -void test_refs_branches_delete__removes_reflog(void) -{ - git_reference *branch; - git_reflog *log; - git_oid oidzero = {{0}}; - git_signature *sig; - - /* Ensure the reflog has at least one entry */ - cl_git_pass(git_signature_now(&sig, "Me", "user@example.com")); - cl_git_pass(git_reflog_read(&log, repo, "refs/heads/track-local")); - cl_git_pass(git_reflog_append(log, &oidzero, sig, "message")); - cl_assert(git_reflog_entrycount(log) > 0); - git_signature_free(sig); - git_reflog_free(log); - - cl_git_pass(git_branch_lookup(&branch, repo, "track-local", GIT_BRANCH_LOCAL)); - cl_git_pass(git_branch_delete(branch)); - git_reference_free(branch); - - /* Reading a nonexistant reflog creates it, but it should be empty */ - cl_git_pass(git_reflog_read(&log, repo, "refs/heads/track-local")); - cl_assert_equal_i(0, git_reflog_entrycount(log)); - git_reflog_free(log); -} - diff --git a/vendor/libgit2/tests/refs/branches/ishead.c b/vendor/libgit2/tests/refs/branches/ishead.c deleted file mode 100644 index 1df70b7897..0000000000 --- a/vendor/libgit2/tests/refs/branches/ishead.c +++ /dev/null @@ -1,98 +0,0 @@ -#include "clar_libgit2.h" -#include "refs.h" -#include "repo/repo_helpers.h" - -static git_repository *repo; -static git_reference *branch; - -void test_refs_branches_ishead__initialize(void) -{ - repo = cl_git_sandbox_init("testrepo.git"); - branch = NULL; -} - -void test_refs_branches_ishead__cleanup(void) -{ - git_reference_free(branch); - branch = NULL; - - cl_git_sandbox_cleanup(); - repo = NULL; -} - -void test_refs_branches_ishead__can_tell_if_a_branch_is_pointed_at_by_HEAD(void) -{ - cl_git_pass(git_reference_lookup(&branch, repo, "refs/heads/master")); - - cl_assert_equal_i(true, git_branch_is_head(branch)); -} - -void test_refs_branches_ishead__can_properly_handle_unborn_HEAD(void) -{ - make_head_unborn(repo, NON_EXISTING_HEAD); - - cl_git_pass(git_reference_lookup(&branch, repo, "refs/heads/master")); - - cl_assert_equal_i(false, git_branch_is_head(branch)); -} - -void test_refs_branches_ishead__can_properly_handle_missing_HEAD(void) -{ - delete_head(repo); - - cl_git_pass(git_reference_lookup(&branch, repo, "refs/heads/master")); - - cl_assert_equal_i(false, git_branch_is_head(branch)); -} - -void test_refs_branches_ishead__can_tell_if_a_branch_is_not_pointed_at_by_HEAD(void) -{ - cl_git_pass(git_reference_lookup(&branch, repo, "refs/heads/br2")); - - cl_assert_equal_i(false, git_branch_is_head(branch)); -} - -void test_refs_branches_ishead__wont_be_fooled_by_a_non_branch(void) -{ - cl_git_pass(git_reference_lookup(&branch, repo, "refs/tags/e90810b")); - - cl_assert_equal_i(false, git_branch_is_head(branch)); -} - -/* - * $ git init . - * Initialized empty Git repository in d:/temp/tempee/.git/ - * - * $ touch a && git add a - * $ git commit -m" boom" - * [master (root-commit) b47b758] boom - * 0 files changed - * create mode 100644 a - * - * $ echo "ref: refs/heads/master" > .git/refs/heads/linked - * $ echo "ref: refs/heads/linked" > .git/refs/heads/super - * $ echo "ref: refs/heads/super" > .git/HEAD - * - * $ git branch - * linked -> master - * * master - * super -> master - */ -void test_refs_branches_ishead__only_direct_references_are_considered(void) -{ - git_reference *linked, *super, *head; - - cl_git_pass(git_reference_symbolic_create(&linked, repo, "refs/heads/linked", "refs/heads/master", 0, NULL)); - cl_git_pass(git_reference_symbolic_create(&super, repo, "refs/heads/super", "refs/heads/linked", 0, NULL)); - cl_git_pass(git_reference_symbolic_create(&head, repo, GIT_HEAD_FILE, "refs/heads/super", 1, NULL)); - - cl_assert_equal_i(false, git_branch_is_head(linked)); - cl_assert_equal_i(false, git_branch_is_head(super)); - - cl_git_pass(git_repository_head(&branch, repo)); - cl_assert_equal_s("refs/heads/master", git_reference_name(branch)); - - git_reference_free(linked); - git_reference_free(super); - git_reference_free(head); -} diff --git a/vendor/libgit2/tests/refs/branches/iterator.c b/vendor/libgit2/tests/refs/branches/iterator.c deleted file mode 100644 index ca366c9f3c..0000000000 --- a/vendor/libgit2/tests/refs/branches/iterator.c +++ /dev/null @@ -1,151 +0,0 @@ -#include "clar_libgit2.h" -#include "refs.h" - -static git_repository *repo; -static git_reference *fake_remote; - -void test_refs_branches_iterator__initialize(void) -{ - git_oid id; - - cl_fixture_sandbox("testrepo.git"); - cl_git_pass(git_repository_open(&repo, "testrepo.git")); - - cl_git_pass(git_oid_fromstr(&id, "be3563ae3f795b2b4353bcce3a527ad0a4f7f644")); - cl_git_pass(git_reference_create(&fake_remote, repo, "refs/remotes/nulltoken/master", &id, 0, NULL)); -} - -void test_refs_branches_iterator__cleanup(void) -{ - git_reference_free(fake_remote); - fake_remote = NULL; - - git_repository_free(repo); - repo = NULL; - - cl_fixture_cleanup("testrepo.git"); - - cl_git_sandbox_cleanup(); -} - -static void assert_retrieval(unsigned int flags, unsigned int expected_count) -{ - git_branch_iterator *iter; - git_reference *ref; - int count = 0, error; - git_branch_t type; - - cl_git_pass(git_branch_iterator_new(&iter, repo, flags)); - while ((error = git_branch_next(&ref, &type, iter)) == 0) { - count++; - git_reference_free(ref); - } - - git_branch_iterator_free(iter); - cl_assert_equal_i(error, GIT_ITEROVER); - cl_assert_equal_i(expected_count, count); -} - -void test_refs_branches_iterator__retrieve_all_branches(void) -{ - assert_retrieval(GIT_BRANCH_ALL, 14); -} - -void test_refs_branches_iterator__retrieve_remote_branches(void) -{ - assert_retrieval(GIT_BRANCH_REMOTE, 2); -} - -void test_refs_branches_iterator__retrieve_local_branches(void) -{ - assert_retrieval(GIT_BRANCH_LOCAL, 12); -} - -struct expectations { - const char *branch_name; - int encounters; -}; - -static void assert_branch_has_been_found(struct expectations *findings, const char* expected_branch_name) -{ - int pos = 0; - - for (pos = 0; findings[pos].branch_name; ++pos) { - if (strcmp(expected_branch_name, findings[pos].branch_name) == 0) { - cl_assert_equal_i(1, findings[pos].encounters); - return; - } - } - - cl_fail("expected branch not found in list."); -} - -static void contains_branches(struct expectations exp[], git_branch_iterator *iter) -{ - git_reference *ref; - git_branch_t type; - int error, pos = 0; - - while ((error = git_branch_next(&ref, &type, iter)) == 0) { - for (pos = 0; exp[pos].branch_name; ++pos) { - if (strcmp(git_reference_shorthand(ref), exp[pos].branch_name) == 0) - exp[pos].encounters++; - } - - git_reference_free(ref); - } - - cl_assert_equal_i(error, GIT_ITEROVER); -} - -/* - * $ git branch -r - * nulltoken/HEAD -> nulltoken/master - * nulltoken/master - */ -void test_refs_branches_iterator__retrieve_remote_symbolic_HEAD_when_present(void) -{ - git_branch_iterator *iter; - struct expectations exp[] = { - { "nulltoken/HEAD", 0 }, - { "nulltoken/master", 0 }, - { NULL, 0 } - }; - - git_reference_free(fake_remote); - cl_git_pass(git_reference_symbolic_create(&fake_remote, repo, "refs/remotes/nulltoken/HEAD", "refs/remotes/nulltoken/master", 0, NULL)); - - assert_retrieval(GIT_BRANCH_REMOTE, 3); - - cl_git_pass(git_branch_iterator_new(&iter, repo, GIT_BRANCH_REMOTE)); - contains_branches(exp, iter); - git_branch_iterator_free(iter); - - assert_branch_has_been_found(exp, "nulltoken/HEAD"); - assert_branch_has_been_found(exp, "nulltoken/master"); -} - -void test_refs_branches_iterator__mix_of_packed_and_loose(void) -{ - git_branch_iterator *iter; - struct expectations exp[] = { - { "master", 0 }, - { "origin/HEAD", 0 }, - { "origin/master", 0 }, - { "origin/packed", 0 }, - { NULL, 0 } - }; - git_repository *r2; - - r2 = cl_git_sandbox_init("testrepo2"); - - cl_git_pass(git_branch_iterator_new(&iter, r2, GIT_BRANCH_ALL)); - contains_branches(exp, iter); - - git_branch_iterator_free(iter); - - assert_branch_has_been_found(exp, "master"); - assert_branch_has_been_found(exp, "origin/HEAD"); - assert_branch_has_been_found(exp, "origin/master"); - assert_branch_has_been_found(exp, "origin/packed"); -} diff --git a/vendor/libgit2/tests/refs/branches/lookup.c b/vendor/libgit2/tests/refs/branches/lookup.c deleted file mode 100644 index 95d49a4b35..0000000000 --- a/vendor/libgit2/tests/refs/branches/lookup.c +++ /dev/null @@ -1,45 +0,0 @@ -#include "clar_libgit2.h" -#include "refs.h" - -static git_repository *repo; -static git_reference *branch; - -void test_refs_branches_lookup__initialize(void) -{ - cl_git_pass(git_repository_open(&repo, cl_fixture("testrepo.git"))); - - branch = NULL; -} - -void test_refs_branches_lookup__cleanup(void) -{ - git_reference_free(branch); - branch = NULL; - - git_repository_free(repo); - repo = NULL; -} - -void test_refs_branches_lookup__can_retrieve_a_local_branch(void) -{ - cl_git_pass(git_branch_lookup(&branch, repo, "br2", GIT_BRANCH_LOCAL)); -} - -void test_refs_branches_lookup__can_retrieve_a_remote_tracking_branch(void) -{ - cl_git_pass(git_branch_lookup(&branch, repo, "test/master", GIT_BRANCH_REMOTE)); -} - -void test_refs_branches_lookup__trying_to_retrieve_an_unknown_branch_returns_ENOTFOUND(void) -{ - cl_assert_equal_i(GIT_ENOTFOUND, git_branch_lookup(&branch, repo, "where/are/you", GIT_BRANCH_LOCAL)); - cl_assert_equal_i(GIT_ENOTFOUND, git_branch_lookup(&branch, repo, "over/here", GIT_BRANCH_REMOTE)); -} - -void test_refs_branches_lookup__trying_to_retrieve_a_branch_with_an_invalid_name_returns_EINVALIDSPEC(void) -{ - cl_assert_equal_i(GIT_EINVALIDSPEC, - git_branch_lookup(&branch, repo, "are/you/inv@{id", GIT_BRANCH_LOCAL)); - cl_assert_equal_i(GIT_EINVALIDSPEC, - git_branch_lookup(&branch, repo, "yes/i am", GIT_BRANCH_REMOTE)); -} diff --git a/vendor/libgit2/tests/refs/branches/move.c b/vendor/libgit2/tests/refs/branches/move.c deleted file mode 100644 index bec39e18ba..0000000000 --- a/vendor/libgit2/tests/refs/branches/move.c +++ /dev/null @@ -1,248 +0,0 @@ -#include "clar_libgit2.h" -#include "refs.h" -#include "config/config_helpers.h" - -static git_repository *repo; - -void test_refs_branches_move__initialize(void) -{ - repo = cl_git_sandbox_init("testrepo.git"); -} - -void test_refs_branches_move__cleanup(void) -{ - cl_git_sandbox_cleanup(); -} - -#define NEW_BRANCH_NAME "new-branch-on-the-block" - -void test_refs_branches_move__can_move_a_local_branch(void) -{ - git_reference *original_ref, *new_ref; - - cl_git_pass(git_reference_lookup(&original_ref, repo, "refs/heads/br2")); - - cl_git_pass(git_branch_move(&new_ref, original_ref, NEW_BRANCH_NAME, 0)); - cl_assert_equal_s(GIT_REFS_HEADS_DIR NEW_BRANCH_NAME, git_reference_name(new_ref)); - - git_reference_free(original_ref); - git_reference_free(new_ref); -} - -void test_refs_branches_move__can_move_a_local_branch_to_a_different_namespace(void) -{ - git_reference *original_ref, *new_ref, *newer_ref; - - cl_git_pass(git_reference_lookup(&original_ref, repo, "refs/heads/br2")); - - /* Downward */ - cl_git_pass(git_branch_move(&new_ref, original_ref, "somewhere/" NEW_BRANCH_NAME, 0)); - git_reference_free(original_ref); - - /* Upward */ - cl_git_pass(git_branch_move(&newer_ref, new_ref, "br2", 0)); - git_reference_free(new_ref); - - git_reference_free(newer_ref); -} - -void test_refs_branches_move__can_move_a_local_branch_to_a_partially_colliding_namespace(void) -{ - git_reference *original_ref, *new_ref, *newer_ref; - - cl_git_pass(git_reference_lookup(&original_ref, repo, "refs/heads/br2")); - - /* Downward */ - cl_git_pass(git_branch_move(&new_ref, original_ref, "br2/" NEW_BRANCH_NAME, 0)); - git_reference_free(original_ref); - - /* Upward */ - cl_git_pass(git_branch_move(&newer_ref, new_ref, "br2", 0)); - git_reference_free(new_ref); - - git_reference_free(newer_ref); -} - -void test_refs_branches_move__can_not_move_a_branch_if_its_destination_name_collide_with_an_existing_one(void) -{ - git_reference *original_ref, *new_ref; - git_config *config; - git_buf buf = GIT_BUF_INIT; - char *original_remote, *original_merge; - const char *str; - - cl_git_pass(git_repository_config_snapshot(&config, repo)); - - cl_git_pass(git_config_get_string_buf(&buf, config, "branch.master.remote")); - original_remote = git_buf_detach(&buf); - cl_git_pass(git_config_get_string_buf(&buf, config, "branch.master.merge")); - original_merge = git_buf_detach(&buf); - git_config_free(config); - - cl_git_pass(git_reference_lookup(&original_ref, repo, "refs/heads/br2")); - - cl_assert_equal_i(GIT_EEXISTS, - git_branch_move(&new_ref, original_ref, "master", 0)); - - cl_assert(giterr_last()->message != NULL); - - cl_git_pass(git_repository_config_snapshot(&config, repo)); - cl_git_pass(git_config_get_string(&str, config, "branch.master.remote")); - cl_assert_equal_s(original_remote, str); - cl_git_pass(git_config_get_string(&str, config, "branch.master.merge")); - cl_assert_equal_s(original_merge, str); - git_config_free(config); - - cl_assert_equal_i(GIT_EEXISTS, - git_branch_move(&new_ref, original_ref, "cannot-fetch", 0)); - - cl_assert(giterr_last()->message != NULL); - - cl_git_pass(git_repository_config_snapshot(&config, repo)); - cl_git_pass(git_config_get_string(&str, config, "branch.master.remote")); - cl_assert_equal_s(original_remote, str); - cl_git_pass(git_config_get_string(&str, config, "branch.master.merge")); - cl_assert_equal_s(original_merge, str); - git_config_free(config); - - git_reference_free(original_ref); - cl_git_pass(git_reference_lookup(&original_ref, repo, "refs/heads/track-local")); - - cl_assert_equal_i(GIT_EEXISTS, - git_branch_move(&new_ref, original_ref, "master", 0)); - - cl_assert(giterr_last()->message != NULL); - - cl_git_pass(git_repository_config_snapshot(&config, repo)); - cl_git_pass(git_config_get_string(&str, config, "branch.master.remote")); - cl_assert_equal_s(original_remote, str); - cl_git_pass(git_config_get_string(&str, config, "branch.master.merge")); - cl_assert_equal_s(original_merge, str); - - git__free(original_remote); git__free(original_merge); - git_reference_free(original_ref); - git_config_free(config); -} - -void test_refs_branches_move__moving_a_branch_with_an_invalid_name_returns_EINVALIDSPEC(void) -{ - git_reference *original_ref, *new_ref; - - cl_git_pass(git_reference_lookup(&original_ref, repo, "refs/heads/br2")); - - cl_assert_equal_i(GIT_EINVALIDSPEC, git_branch_move(&new_ref, original_ref, "Inv@{id", 0)); - - git_reference_free(original_ref); -} - -void test_refs_branches_move__can_not_move_a_non_branch(void) -{ - git_reference *tag, *new_ref; - - cl_git_pass(git_reference_lookup(&tag, repo, "refs/tags/e90810b")); - cl_git_fail(git_branch_move(&new_ref, tag, NEW_BRANCH_NAME, 0)); - - git_reference_free(tag); -} - -void test_refs_branches_move__can_force_move_over_an_existing_branch(void) -{ - git_reference *original_ref, *new_ref; - - cl_git_pass(git_reference_lookup(&original_ref, repo, "refs/heads/br2")); - - cl_git_pass(git_branch_move(&new_ref, original_ref, "master", 1)); - - git_reference_free(original_ref); - git_reference_free(new_ref); -} - -void test_refs_branches_move__moving_a_branch_moves_related_configuration_data(void) -{ - git_reference *branch; - git_reference *new_branch; - - cl_git_pass(git_branch_lookup(&branch, repo, "track-local", GIT_BRANCH_LOCAL)); - - assert_config_entry_existence(repo, "branch.track-local.remote", true); - assert_config_entry_existence(repo, "branch.track-local.merge", true); - assert_config_entry_existence(repo, "branch.moved.remote", false); - assert_config_entry_existence(repo, "branch.moved.merge", false); - - cl_git_pass(git_branch_move(&new_branch, branch, "moved", 0)); - git_reference_free(branch); - - assert_config_entry_existence(repo, "branch.track-local.remote", false); - assert_config_entry_existence(repo, "branch.track-local.merge", false); - assert_config_entry_existence(repo, "branch.moved.remote", true); - assert_config_entry_existence(repo, "branch.moved.merge", true); - - git_reference_free(new_branch); -} - -void test_refs_branches_move__moving_the_branch_pointed_at_by_HEAD_updates_HEAD(void) -{ - git_reference *branch; - git_reference *new_branch; - - cl_git_pass(git_reference_lookup(&branch, repo, "refs/heads/master")); - cl_git_pass(git_branch_move(&new_branch, branch, "master2", 0)); - git_reference_free(branch); - git_reference_free(new_branch); - - cl_git_pass(git_repository_head(&branch, repo)); - cl_assert_equal_s("refs/heads/master2", git_reference_name(branch)); - git_reference_free(branch); -} - -void test_refs_branches_move__default_reflog_message(void) -{ - git_reference *branch; - git_reference *new_branch; - git_reflog *log; - const git_reflog_entry *entry; - git_signature *sig; - git_config *cfg; - git_oid id; - - cl_git_pass(git_repository_config(&cfg, repo)); - cl_git_pass(git_config_set_string(cfg, "user.name", "Foo Bar")); - cl_git_pass(git_config_set_string(cfg, "user.email", "foo@example.com")); - git_config_free(cfg); - - cl_git_pass(git_signature_default(&sig, repo)); - - cl_git_pass(git_reference_lookup(&branch, repo, "refs/heads/master")); - git_oid_cpy(&id, git_reference_target(branch)); - cl_git_pass(git_branch_move(&new_branch, branch, "master2", 0)); - - cl_git_pass(git_reflog_read(&log, repo, git_reference_name(new_branch))); - entry = git_reflog_entry_byindex(log, 0); - cl_assert_equal_s("branch: renamed refs/heads/master to refs/heads/master2", - git_reflog_entry_message(entry)); - cl_assert_equal_s(sig->email, git_reflog_entry_committer(entry)->email); - cl_assert_equal_oid(&id, git_reflog_entry_id_old(entry)); - cl_assert_equal_oid(&id, git_reflog_entry_id_new(entry)); - - git_reference_free(branch); - git_reference_free(new_branch); - git_reflog_free(log); - git_signature_free(sig); -} - -void test_refs_branches_move__can_move_with_unicode(void) -{ - git_reference *original_ref, *new_ref; - const char *new_branch_name = "\x41\xCC\x8A\x73\x74\x72\x6F\xCC\x88\x6D"; - - cl_git_pass(git_reference_lookup(&original_ref, repo, "refs/heads/br2")); - cl_git_pass(git_branch_move(&new_ref, original_ref, new_branch_name, 0)); - - if (cl_repo_get_bool(repo, "core.precomposeunicode")) - cl_assert_equal_s(GIT_REFS_HEADS_DIR "\xC3\x85\x73\x74\x72\xC3\xB6\x6D", git_reference_name(new_ref)); - else - cl_assert_equal_s(GIT_REFS_HEADS_DIR "\x41\xCC\x8A\x73\x74\x72\x6F\xCC\x88\x6D", git_reference_name(new_ref)); - - git_reference_free(original_ref); - git_reference_free(new_ref); -} diff --git a/vendor/libgit2/tests/refs/branches/name.c b/vendor/libgit2/tests/refs/branches/name.c deleted file mode 100644 index 176f836a42..0000000000 --- a/vendor/libgit2/tests/refs/branches/name.c +++ /dev/null @@ -1,45 +0,0 @@ -#include "clar_libgit2.h" -#include "branch.h" - -static git_repository *repo; -static git_reference *ref; - -void test_refs_branches_name__initialize(void) -{ - cl_git_pass(git_repository_open(&repo, cl_fixture("testrepo.git"))); -} - -void test_refs_branches_name__cleanup(void) -{ - git_reference_free(ref); - ref = NULL; - - git_repository_free(repo); - repo = NULL; -} - -void test_refs_branches_name__can_get_local_branch_name(void) -{ - const char *name; - - cl_git_pass(git_branch_lookup(&ref,repo,"master",GIT_BRANCH_LOCAL)); - cl_git_pass(git_branch_name(&name,ref)); - cl_assert_equal_s("master",name); -} - -void test_refs_branches_name__can_get_remote_branch_name(void) -{ - const char *name; - - cl_git_pass(git_branch_lookup(&ref,repo,"test/master",GIT_BRANCH_REMOTE)); - cl_git_pass(git_branch_name(&name,ref)); - cl_assert_equal_s("test/master",name); -} - -void test_refs_branches_name__error_when_ref_is_no_branch(void) -{ - const char *name; - - cl_git_pass(git_reference_lookup(&ref,repo,"refs/notes/fanout")); - cl_git_fail(git_branch_name(&name,ref)); -} diff --git a/vendor/libgit2/tests/refs/branches/remote.c b/vendor/libgit2/tests/refs/branches/remote.c deleted file mode 100644 index 47526717f1..0000000000 --- a/vendor/libgit2/tests/refs/branches/remote.c +++ /dev/null @@ -1,68 +0,0 @@ -#include "clar_libgit2.h" -#include "branch.h" -#include "remote.h" - -static git_repository *g_repo; -static const char *remote_tracking_branch_name = "refs/remotes/test/master"; -static const char *expected_remote_name = "test"; -static int expected_remote_name_length; - -void test_refs_branches_remote__initialize(void) -{ - g_repo = cl_git_sandbox_init("testrepo"); - - expected_remote_name_length = (int)strlen(expected_remote_name) + 1; -} - -void test_refs_branches_remote__cleanup(void) -{ - cl_git_sandbox_cleanup(); -} - -void test_refs_branches_remote__can_get_remote_for_branch(void) -{ - git_buf remotename = {0}; - - cl_git_pass(git_branch_remote_name(&remotename, g_repo, remote_tracking_branch_name)); - - cl_assert_equal_s("test", remotename.ptr); - git_buf_free(&remotename); -} - -void test_refs_branches_remote__no_matching_remote_returns_error(void) -{ - const char *unknown = "refs/remotes/nonexistent/master"; - git_buf buf; - - giterr_clear(); - memset(&buf, 0, sizeof(git_buf)); - cl_git_fail_with(git_branch_remote_name(&buf, g_repo, unknown), GIT_ENOTFOUND); - cl_assert(giterr_last() != NULL); -} - -void test_refs_branches_remote__local_remote_returns_error(void) -{ - const char *local = "refs/heads/master"; - git_buf buf; - - giterr_clear(); - memset(&buf, 0, sizeof(git_buf)); - cl_git_fail_with(git_branch_remote_name(&buf, g_repo, local), GIT_ERROR); - cl_assert(giterr_last() != NULL); -} - -void test_refs_branches_remote__ambiguous_remote_returns_error(void) -{ - git_remote *remote; - git_buf buf; - - /* Create the remote */ - cl_git_pass(git_remote_create_with_fetchspec(&remote, g_repo, "addtest", "http://github.com/libgit2/libgit2", "refs/heads/*:refs/remotes/test/*")); - - git_remote_free(remote); - - giterr_clear(); - memset(&buf, 0, sizeof(git_buf)); - cl_git_fail_with(git_branch_remote_name(&buf, g_repo, remote_tracking_branch_name), GIT_EAMBIGUOUS); - cl_assert(giterr_last() != NULL); -} diff --git a/vendor/libgit2/tests/refs/branches/upstream.c b/vendor/libgit2/tests/refs/branches/upstream.c deleted file mode 100644 index 8f2e7a2cac..0000000000 --- a/vendor/libgit2/tests/refs/branches/upstream.c +++ /dev/null @@ -1,193 +0,0 @@ -#include "clar_libgit2.h" -#include "config/config_helpers.h" -#include "refs.h" - -static git_repository *repo; -static git_reference *branch, *upstream; - -void test_refs_branches_upstream__initialize(void) -{ - cl_git_pass(git_repository_open(&repo, cl_fixture("testrepo.git"))); - - branch = NULL; - upstream = NULL; -} - -void test_refs_branches_upstream__cleanup(void) -{ - git_reference_free(upstream); - git_reference_free(branch); - branch = NULL; - - git_repository_free(repo); - repo = NULL; -} - -void test_refs_branches_upstream__can_retrieve_the_remote_tracking_reference_of_a_local_branch(void) -{ - cl_git_pass(git_reference_lookup(&branch, repo, "refs/heads/master")); - - cl_git_pass(git_branch_upstream(&upstream, branch)); - - cl_assert_equal_s("refs/remotes/test/master", git_reference_name(upstream)); -} - -void test_refs_branches_upstream__can_retrieve_the_local_upstream_reference_of_a_local_branch(void) -{ - cl_git_pass(git_reference_lookup(&branch, repo, "refs/heads/track-local")); - - cl_git_pass(git_branch_upstream(&upstream, branch)); - - cl_assert_equal_s("refs/heads/master", git_reference_name(upstream)); -} - -void test_refs_branches_upstream__cannot_retrieve_a_remote_upstream_reference_from_a_non_branch(void) -{ - cl_git_pass(git_reference_lookup(&branch, repo, "refs/tags/e90810b")); - - cl_git_fail(git_branch_upstream(&upstream, branch)); -} - -void test_refs_branches_upstream__trying_to_retrieve_a_remote_tracking_reference_from_a_plain_local_branch_returns_GIT_ENOTFOUND(void) -{ - cl_git_pass(git_reference_lookup(&branch, repo, "refs/heads/subtrees")); - - cl_assert_equal_i(GIT_ENOTFOUND, git_branch_upstream(&upstream, branch)); -} - -void test_refs_branches_upstream__trying_to_retrieve_a_remote_tracking_reference_from_a_branch_with_no_fetchspec_returns_GIT_ENOTFOUND(void) -{ - cl_git_pass(git_reference_lookup(&branch, repo, "refs/heads/cannot-fetch")); - - cl_assert_equal_i(GIT_ENOTFOUND, git_branch_upstream(&upstream, branch)); -} - -void test_refs_branches_upstream__upstream_remote(void) -{ - git_buf buf = GIT_BUF_INIT; - - cl_git_pass(git_branch_upstream_remote(&buf, repo, "refs/heads/master")); - cl_assert_equal_s("test", buf.ptr); - git_buf_free(&buf); -} - -void test_refs_branches_upstream__upstream_remote_empty_value(void) -{ - git_repository *repository; - git_config *cfg; - git_buf buf = GIT_BUF_INIT; - - repository = cl_git_sandbox_init("testrepo.git"); - cl_git_pass(git_repository_config(&cfg, repository)); - cl_git_pass(git_config_set_string(cfg, "branch.master.remote", "")); - cl_git_fail_with(GIT_ENOTFOUND, git_branch_upstream_remote(&buf, repository, "refs/heads/master")); - - cl_git_pass(git_config_delete_entry(cfg, "branch.master.remote")); - cl_git_fail_with(GIT_ENOTFOUND, git_branch_upstream_remote(&buf, repository, "refs/heads/master")); - cl_git_sandbox_cleanup(); -} - -static void assert_merge_and_or_remote_key_missing(git_repository *repository, const git_commit *target, const char *entry_name) -{ - git_reference *branch; - - cl_assert_equal_i(GIT_OBJ_COMMIT, git_object_type((git_object*)target)); - cl_git_pass(git_branch_create(&branch, repository, entry_name, (git_commit*)target, 0)); - - cl_assert_equal_i(GIT_ENOTFOUND, git_branch_upstream(&upstream, branch)); - - git_reference_free(branch); -} - -void test_refs_branches_upstream__retrieve_a_remote_tracking_reference_from_a_branch_with_no_remote_returns_GIT_ENOTFOUND(void) -{ - git_reference *head; - git_repository *repository; - git_commit *target; - - repository = cl_git_sandbox_init("testrepo.git"); - - cl_git_pass(git_repository_head(&head, repository)); - cl_git_pass(git_reference_peel(((git_object **)&target), head, GIT_OBJ_COMMIT)); - git_reference_free(head); - - assert_merge_and_or_remote_key_missing(repository, target, "remoteless"); - assert_merge_and_or_remote_key_missing(repository, target, "mergeless"); - assert_merge_and_or_remote_key_missing(repository, target, "mergeandremoteless"); - - git_commit_free(target); - - cl_git_sandbox_cleanup(); -} - -void test_refs_branches_upstream__set_unset_upstream(void) -{ - git_reference *branch; - git_repository *repository; - - repository = cl_git_sandbox_init("testrepo.git"); - - /* remote */ - cl_git_pass(git_reference_lookup(&branch, repository, "refs/heads/test")); - cl_git_pass(git_branch_set_upstream(branch, "test/master")); - - assert_config_entry_value(repository, "branch.test.remote", "test"); - assert_config_entry_value(repository, "branch.test.merge", "refs/heads/master"); - - git_reference_free(branch); - - /* local */ - cl_git_pass(git_reference_lookup(&branch, repository, "refs/heads/test")); - cl_git_pass(git_branch_set_upstream(branch, "master")); - - assert_config_entry_value(repository, "branch.test.remote", "."); - assert_config_entry_value(repository, "branch.test.merge", "refs/heads/master"); - - /* unset */ - cl_git_pass(git_branch_set_upstream(branch, NULL)); - assert_config_entry_existence(repository, "branch.test.remote", false); - assert_config_entry_existence(repository, "branch.test.merge", false); - - git_reference_free(branch); - - cl_git_pass(git_reference_lookup(&branch, repository, "refs/heads/master")); - cl_git_pass(git_branch_set_upstream(branch, NULL)); - assert_config_entry_existence(repository, "branch.test.remote", false); - assert_config_entry_existence(repository, "branch.test.merge", false); - - git_reference_free(branch); - - cl_git_sandbox_cleanup(); -} - -void test_refs_branches_upstream__no_fetch_refspec(void) -{ - git_reference *ref, *branch; - git_repository *repo; - git_remote *remote; - git_config *cfg; - - repo = cl_git_sandbox_init("testrepo.git"); - - cl_git_pass(git_remote_create_with_fetchspec(&remote, repo, "matching", ".", NULL)); - cl_git_pass(git_remote_add_push(repo, "matching", ":")); - - cl_git_pass(git_reference_lookup(&branch, repo, "refs/heads/test")); - cl_git_pass(git_reference_create(&ref, repo, "refs/remotes/matching/master", git_reference_target(branch), 1, "fetch")); - cl_git_fail(git_branch_set_upstream(branch, "matching/master")); - cl_assert_equal_s("Could not determine remote for 'refs/remotes/matching/master'", - giterr_last()->message); - - /* we can't set it automatically, so let's test the user setting it by hand */ - cl_git_pass(git_repository_config(&cfg, repo)); - cl_git_pass(git_config_set_string(cfg, "branch.test.remote", "matching")); - cl_git_pass(git_config_set_string(cfg, "branch.test.merge", "refs/heads/master")); - /* we still can't find it because there is no rule for that reference */ - cl_git_fail_with(GIT_ENOTFOUND, git_branch_upstream(&ref, branch)); - - git_reference_free(ref); - git_reference_free(branch); - git_remote_free(remote); - - cl_git_sandbox_cleanup(); -} diff --git a/vendor/libgit2/tests/refs/branches/upstreamname.c b/vendor/libgit2/tests/refs/branches/upstreamname.c deleted file mode 100644 index d30002e080..0000000000 --- a/vendor/libgit2/tests/refs/branches/upstreamname.c +++ /dev/null @@ -1,36 +0,0 @@ -#include "clar_libgit2.h" -#include "branch.h" - -static git_repository *repo; -static git_buf upstream_name; - -void test_refs_branches_upstreamname__initialize(void) -{ - cl_git_pass(git_repository_open(&repo, cl_fixture("testrepo.git"))); - - git_buf_init(&upstream_name, 0); -} - -void test_refs_branches_upstreamname__cleanup(void) -{ - git_buf_free(&upstream_name); - - git_repository_free(repo); - repo = NULL; -} - -void test_refs_branches_upstreamname__can_retrieve_the_remote_tracking_reference_name_of_a_local_branch(void) -{ - cl_git_pass(git_branch_upstream_name( - &upstream_name, repo, "refs/heads/master")); - - cl_assert_equal_s("refs/remotes/test/master", git_buf_cstr(&upstream_name)); -} - -void test_refs_branches_upstreamname__can_retrieve_the_local_upstream_reference_name_of_a_local_branch(void) -{ - cl_git_pass(git_branch_upstream_name( - &upstream_name, repo, "refs/heads/track-local")); - - cl_assert_equal_s("refs/heads/master", git_buf_cstr(&upstream_name)); -} diff --git a/vendor/libgit2/tests/refs/crashes.c b/vendor/libgit2/tests/refs/crashes.c deleted file mode 100644 index 7a10411c86..0000000000 --- a/vendor/libgit2/tests/refs/crashes.c +++ /dev/null @@ -1,20 +0,0 @@ -#include "clar_libgit2.h" - -void test_refs_crashes__double_free(void) -{ - git_repository *repo; - git_reference *ref, *ref2; - const char *REFNAME = "refs/heads/xxx"; - - cl_git_pass(git_repository_open(&repo, cl_fixture("testrepo.git"))); - cl_git_pass(git_reference_symbolic_create(&ref, repo, REFNAME, "refs/heads/master", 0, NULL)); - cl_git_pass(git_reference_lookup(&ref2, repo, REFNAME)); - cl_git_pass(git_reference_delete(ref)); - git_reference_free(ref); - git_reference_free(ref2); - - /* reference is gone from disk, so reloading it will fail */ - cl_git_fail(git_reference_lookup(&ref2, repo, REFNAME)); - - git_repository_free(repo); -} diff --git a/vendor/libgit2/tests/refs/create.c b/vendor/libgit2/tests/refs/create.c deleted file mode 100644 index 192551dbd2..0000000000 --- a/vendor/libgit2/tests/refs/create.c +++ /dev/null @@ -1,210 +0,0 @@ -#include "clar_libgit2.h" - -#include "repository.h" -#include "git2/reflog.h" -#include "reflog.h" -#include "ref_helpers.h" - -static const char *current_master_tip = "099fabac3a9ea935598528c27f866e34089c2eff"; -static const char *current_head_target = "refs/heads/master"; - -static git_repository *g_repo; - -void test_refs_create__initialize(void) -{ - g_repo = cl_git_sandbox_init("testrepo"); -} - -void test_refs_create__cleanup(void) -{ - cl_git_sandbox_cleanup(); -} - -void test_refs_create__symbolic(void) -{ - // create a new symbolic reference - git_reference *new_reference, *looked_up_ref, *resolved_ref; - git_repository *repo2; - git_oid id; - - const char *new_head_tracker = "ANOTHER_HEAD_TRACKER"; - - git_oid_fromstr(&id, current_master_tip); - - /* Create and write the new symbolic reference */ - cl_git_pass(git_reference_symbolic_create(&new_reference, g_repo, new_head_tracker, current_head_target, 0, NULL)); - - /* Ensure the reference can be looked-up... */ - cl_git_pass(git_reference_lookup(&looked_up_ref, g_repo, new_head_tracker)); - cl_assert(git_reference_type(looked_up_ref) & GIT_REF_SYMBOLIC); - cl_assert(reference_is_packed(looked_up_ref) == 0); - cl_assert_equal_s(looked_up_ref->name, new_head_tracker); - - /* ...peeled.. */ - cl_git_pass(git_reference_resolve(&resolved_ref, looked_up_ref)); - cl_assert(git_reference_type(resolved_ref) == GIT_REF_OID); - - /* ...and that it points to the current master tip */ - cl_assert_equal_oid(&id, git_reference_target(resolved_ref)); - git_reference_free(looked_up_ref); - git_reference_free(resolved_ref); - - /* Similar test with a fresh new repository */ - cl_git_pass(git_repository_open(&repo2, "testrepo")); - - cl_git_pass(git_reference_lookup(&looked_up_ref, repo2, new_head_tracker)); - cl_git_pass(git_reference_resolve(&resolved_ref, looked_up_ref)); - cl_assert_equal_oid(&id, git_reference_target(resolved_ref)); - - git_repository_free(repo2); - - git_reference_free(new_reference); - git_reference_free(looked_up_ref); - git_reference_free(resolved_ref); -} - -void test_refs_create__deep_symbolic(void) -{ - // create a deep symbolic reference - git_reference *new_reference, *looked_up_ref, *resolved_ref; - git_oid id; - - const char *new_head_tracker = "deep/rooted/tracker"; - - git_oid_fromstr(&id, current_master_tip); - - cl_git_pass(git_reference_symbolic_create(&new_reference, g_repo, new_head_tracker, current_head_target, 0, NULL)); - cl_git_pass(git_reference_lookup(&looked_up_ref, g_repo, new_head_tracker)); - cl_git_pass(git_reference_resolve(&resolved_ref, looked_up_ref)); - cl_assert_equal_oid(&id, git_reference_target(resolved_ref)); - - git_reference_free(new_reference); - git_reference_free(looked_up_ref); - git_reference_free(resolved_ref); -} - -void test_refs_create__oid(void) -{ - // create a new OID reference - git_reference *new_reference, *looked_up_ref; - git_repository *repo2; - git_oid id; - - const char *new_head = "refs/heads/new-head"; - - git_oid_fromstr(&id, current_master_tip); - - /* Create and write the new object id reference */ - cl_git_pass(git_reference_create(&new_reference, g_repo, new_head, &id, 0, NULL)); - - /* Ensure the reference can be looked-up... */ - cl_git_pass(git_reference_lookup(&looked_up_ref, g_repo, new_head)); - cl_assert(git_reference_type(looked_up_ref) & GIT_REF_OID); - cl_assert(reference_is_packed(looked_up_ref) == 0); - cl_assert_equal_s(looked_up_ref->name, new_head); - - /* ...and that it points to the current master tip */ - cl_assert_equal_oid(&id, git_reference_target(looked_up_ref)); - git_reference_free(looked_up_ref); - - /* Similar test with a fresh new repository */ - cl_git_pass(git_repository_open(&repo2, "testrepo")); - - cl_git_pass(git_reference_lookup(&looked_up_ref, repo2, new_head)); - cl_assert_equal_oid(&id, git_reference_target(looked_up_ref)); - - git_repository_free(repo2); - - git_reference_free(new_reference); - git_reference_free(looked_up_ref); -} - -void test_refs_create__oid_unknown(void) -{ - // Can not create a new OID reference which targets at an unknown id - git_reference *new_reference, *looked_up_ref; - git_oid id; - - const char *new_head = "refs/heads/new-head"; - - git_oid_fromstr(&id, "deadbeef3f795b2b4353bcce3a527ad0a4f7f644"); - - /* Create and write the new object id reference */ - cl_git_fail(git_reference_create(&new_reference, g_repo, new_head, &id, 0, NULL)); - - /* Ensure the reference can't be looked-up... */ - cl_git_fail(git_reference_lookup(&looked_up_ref, g_repo, new_head)); -} - -void test_refs_create__propagate_eexists(void) -{ - int error; - git_oid oid; - git_reference *ref; - - /* Make sure it works for oid and for symbolic both */ - git_oid_fromstr(&oid, current_master_tip); - error = git_reference_create(&ref, g_repo, current_head_target, &oid, false, NULL); - cl_assert(error == GIT_EEXISTS); - - error = git_reference_symbolic_create(&ref, g_repo, "HEAD", current_head_target, false, NULL); - cl_assert(error == GIT_EEXISTS); -} - -static void test_invalid_name(const char *name) -{ - git_reference *new_reference; - git_oid id; - - git_oid_fromstr(&id, current_master_tip); - - cl_assert_equal_i(GIT_EINVALIDSPEC, git_reference_create( - &new_reference, g_repo, name, &id, 0, NULL)); - - cl_assert_equal_i(GIT_EINVALIDSPEC, git_reference_symbolic_create( - &new_reference, g_repo, name, current_head_target, 0, NULL)); -} - -void test_refs_create__creating_a_reference_with_an_invalid_name_returns_EINVALIDSPEC(void) -{ - test_invalid_name("refs/heads/inv@{id"); - test_invalid_name("refs/heads/back\\slash"); - - test_invalid_name("refs/heads/foo "); - test_invalid_name("refs/heads/foo /bar"); - test_invalid_name("refs/heads/com1:bar/foo"); - - test_invalid_name("refs/heads/e:"); - test_invalid_name("refs/heads/c:/foo"); - - test_invalid_name("refs/heads/foo."); -} - -static void test_win32_name(const char *name) -{ - git_reference *new_reference = NULL; - git_oid id; - int ret; - - git_oid_fromstr(&id, current_master_tip); - - ret = git_reference_create(&new_reference, g_repo, name, &id, 0, NULL); - -#ifdef GIT_WIN32 - cl_assert_equal_i(GIT_EINVALIDSPEC, ret); -#else - cl_git_pass(ret); -#endif - - git_reference_free(new_reference); -} - -void test_refs_create__creating_a_loose_ref_with_invalid_windows_name(void) -{ - test_win32_name("refs/heads/foo./bar"); - - test_win32_name("refs/heads/aux"); - test_win32_name("refs/heads/aux.foo/bar"); - - test_win32_name("refs/heads/com1"); -} diff --git a/vendor/libgit2/tests/refs/createwithlog.c b/vendor/libgit2/tests/refs/createwithlog.c deleted file mode 100644 index 4f643635b8..0000000000 --- a/vendor/libgit2/tests/refs/createwithlog.c +++ /dev/null @@ -1,47 +0,0 @@ -#include "clar_libgit2.h" - -#include "repository.h" -#include "git2/reflog.h" -#include "reflog.h" -#include "ref_helpers.h" - -static const char *current_master_tip = "a65fedf39aefe402d3bb6e24df4d4f5fe4547750"; - -static git_repository *g_repo; - -void test_refs_createwithlog__initialize(void) -{ - g_repo = cl_git_sandbox_init("testrepo.git"); -} - -void test_refs_createwithlog__cleanup(void) -{ - cl_git_sandbox_cleanup(); -} - -void test_refs_createwithlog__creating_a_direct_reference_adds_a_reflog_entry(void) -{ - git_reference *reference; - git_oid id; - git_reflog *reflog; - const git_reflog_entry *entry; - - const char *name = "refs/heads/new-head"; - const char *message = "You've been logged, mate!"; - - git_oid_fromstr(&id, current_master_tip); - - cl_git_pass( - git_reference_create(&reference, g_repo, name, &id, 0, message)); - - cl_git_pass(git_reflog_read(&reflog, g_repo, name)); - cl_assert_equal_sz(1, git_reflog_entrycount(reflog)); - - entry = git_reflog_entry_byindex(reflog, 0); - cl_assert(git_oid_streq(&entry->oid_old, GIT_OID_HEX_ZERO) == 0); - cl_assert_equal_oid(&id, &entry->oid_cur); - cl_assert_equal_s(message, entry->msg); - - git_reflog_free(reflog); - git_reference_free(reference); -} diff --git a/vendor/libgit2/tests/refs/delete.c b/vendor/libgit2/tests/refs/delete.c deleted file mode 100644 index a1b9e251ee..0000000000 --- a/vendor/libgit2/tests/refs/delete.c +++ /dev/null @@ -1,107 +0,0 @@ -#include "clar_libgit2.h" - -#include "fileops.h" -#include "git2/reflog.h" -#include "git2/refdb.h" -#include "reflog.h" -#include "ref_helpers.h" - -static const char *packed_test_head_name = "refs/heads/packed-test"; -static const char *current_master_tip = "a65fedf39aefe402d3bb6e24df4d4f5fe4547750"; - -static git_repository *g_repo; - - - -void test_refs_delete__initialize(void) -{ - g_repo = cl_git_sandbox_init("testrepo"); -} - -void test_refs_delete__cleanup(void) -{ - cl_git_sandbox_cleanup(); -} - - - -void test_refs_delete__packed_loose(void) -{ - // deleting a ref which is both packed and loose should remove both tracks in the filesystem - git_reference *looked_up_ref, *another_looked_up_ref; - git_buf temp_path = GIT_BUF_INIT; - - /* Ensure the loose reference exists on the file system */ - cl_git_pass(git_buf_joinpath(&temp_path, git_repository_path(g_repo), packed_test_head_name)); - cl_assert(git_path_exists(temp_path.ptr)); - - /* Lookup the reference */ - cl_git_pass(git_reference_lookup(&looked_up_ref, g_repo, packed_test_head_name)); - - /* Ensure it's the loose version that has been found */ - cl_assert(reference_is_packed(looked_up_ref) == 0); - - /* Now that the reference is deleted... */ - cl_git_pass(git_reference_delete(looked_up_ref)); - git_reference_free(looked_up_ref); - - /* Looking up the reference once again should not retrieve it */ - cl_git_fail(git_reference_lookup(&another_looked_up_ref, g_repo, packed_test_head_name)); - - /* Ensure the loose reference doesn't exist any longer on the file system */ - cl_assert(!git_path_exists(temp_path.ptr)); - - git_reference_free(another_looked_up_ref); - git_buf_free(&temp_path); -} - -void test_refs_delete__packed_only(void) -{ - // can delete a just packed reference - git_reference *ref; - git_refdb *refdb; - git_oid id; - const char *new_ref = "refs/heads/new_ref"; - - git_oid_fromstr(&id, current_master_tip); - - /* Create and write the new object id reference */ - cl_git_pass(git_reference_create(&ref, g_repo, new_ref, &id, 0, NULL)); - git_reference_free(ref); - - /* Lookup the reference */ - cl_git_pass(git_reference_lookup(&ref, g_repo, new_ref)); - - /* Ensure it's a loose reference */ - cl_assert(reference_is_packed(ref) == 0); - - /* Pack all existing references */ - cl_git_pass(git_repository_refdb(&refdb, g_repo)); - cl_git_pass(git_refdb_compress(refdb)); - - /* Reload the reference from disk */ - git_reference_free(ref); - cl_git_pass(git_reference_lookup(&ref, g_repo, new_ref)); - - /* Ensure it's a packed reference */ - cl_assert(reference_is_packed(ref) == 1); - - /* This should pass */ - cl_git_pass(git_reference_delete(ref)); - git_reference_free(ref); - git_refdb_free(refdb); -} - -void test_refs_delete__remove(void) -{ - git_reference *ref; - - /* Check that passing no old values lets us delete */ - - cl_git_pass(git_reference_lookup(&ref, g_repo, packed_test_head_name)); - git_reference_free(ref); - - cl_git_pass(git_reference_remove(g_repo, packed_test_head_name)); - - cl_git_fail(git_reference_lookup(&ref, g_repo, packed_test_head_name)); -} diff --git a/vendor/libgit2/tests/refs/foreachglob.c b/vendor/libgit2/tests/refs/foreachglob.c deleted file mode 100644 index a09191e799..0000000000 --- a/vendor/libgit2/tests/refs/foreachglob.c +++ /dev/null @@ -1,95 +0,0 @@ -#include "clar_libgit2.h" -#include "refs.h" - -static git_repository *repo; -static git_reference *fake_remote; - -void test_refs_foreachglob__initialize(void) -{ - git_oid id; - - cl_fixture_sandbox("testrepo.git"); - cl_git_pass(git_repository_open(&repo, "testrepo.git")); - - cl_git_pass(git_oid_fromstr(&id, "be3563ae3f795b2b4353bcce3a527ad0a4f7f644")); - cl_git_pass(git_reference_create(&fake_remote, repo, "refs/remotes/nulltoken/master", &id, 0, NULL)); -} - -void test_refs_foreachglob__cleanup(void) -{ - git_reference_free(fake_remote); - fake_remote = NULL; - - git_repository_free(repo); - repo = NULL; - - cl_fixture_cleanup("testrepo.git"); -} - -static int count_cb(const char *reference_name, void *payload) -{ - int *count = (int *)payload; - - GIT_UNUSED(reference_name); - - (*count)++; - - return 0; -} - -static void assert_retrieval(const char *glob, int expected_count) -{ - int count = 0; - - cl_git_pass(git_reference_foreach_glob(repo, glob, count_cb, &count)); - - cl_assert_equal_i(expected_count, count); -} - -void test_refs_foreachglob__retrieve_all_refs(void) -{ - /* 12 heads (including one packed head) + 1 note + 2 remotes + 7 tags */ - assert_retrieval("*", 22); -} - -void test_refs_foreachglob__retrieve_remote_branches(void) -{ - assert_retrieval("refs/remotes/*", 2); -} - -void test_refs_foreachglob__retrieve_local_branches(void) -{ - assert_retrieval("refs/heads/*", 12); -} - -void test_refs_foreachglob__retrieve_partially_named_references(void) -{ - /* - * refs/heads/packed-test, refs/heads/test - * refs/remotes/test/master, refs/tags/test - */ - - assert_retrieval("*test*", 4); -} - - -static int interrupt_cb(const char *reference_name, void *payload) -{ - int *count = (int *)payload; - - GIT_UNUSED(reference_name); - - (*count)++; - - return (*count == 11) ? -1000 : 0; -} - -void test_refs_foreachglob__can_cancel(void) -{ - int count = 0; - - cl_assert_equal_i(-1000, git_reference_foreach_glob( - repo, "*", interrupt_cb, &count) ); - - cl_assert_equal_i(11, count); -} diff --git a/vendor/libgit2/tests/refs/isvalidname.c b/vendor/libgit2/tests/refs/isvalidname.c deleted file mode 100644 index 65c70ba4d8..0000000000 --- a/vendor/libgit2/tests/refs/isvalidname.c +++ /dev/null @@ -1,31 +0,0 @@ -#include "clar_libgit2.h" - -void test_refs_isvalidname__can_detect_invalid_formats(void) -{ - cl_assert_equal_i(false, git_reference_is_valid_name("refs/tags/0.17.0^{}")); - cl_assert_equal_i(false, git_reference_is_valid_name("TWO/LEVELS")); - cl_assert_equal_i(false, git_reference_is_valid_name("ONE.LEVEL")); - cl_assert_equal_i(false, git_reference_is_valid_name("HEAD/")); - cl_assert_equal_i(false, git_reference_is_valid_name("NO_TRAILING_UNDERSCORE_")); - cl_assert_equal_i(false, git_reference_is_valid_name("_NO_LEADING_UNDERSCORE")); - cl_assert_equal_i(false, git_reference_is_valid_name("HEAD/aa")); - cl_assert_equal_i(false, git_reference_is_valid_name("lower_case")); - cl_assert_equal_i(false, git_reference_is_valid_name("/stupid/name/master")); - cl_assert_equal_i(false, git_reference_is_valid_name("/")); - cl_assert_equal_i(false, git_reference_is_valid_name("//")); - cl_assert_equal_i(false, git_reference_is_valid_name("")); - cl_assert_equal_i(false, git_reference_is_valid_name("refs/heads/sub.lock/webmatrix")); -} - -void test_refs_isvalidname__wont_hopefully_choke_on_valid_formats(void) -{ - cl_assert_equal_i(true, git_reference_is_valid_name("refs/tags/0.17.0")); - cl_assert_equal_i(true, git_reference_is_valid_name("refs/LEVELS")); - cl_assert_equal_i(true, git_reference_is_valid_name("HEAD")); - cl_assert_equal_i(true, git_reference_is_valid_name("ONE_LEVEL")); - cl_assert_equal_i(true, git_reference_is_valid_name("refs/stash")); - cl_assert_equal_i(true, git_reference_is_valid_name("refs/remotes/origin/bim_with_3d@11296")); - cl_assert_equal_i(true, git_reference_is_valid_name("refs/master{yesterday")); - cl_assert_equal_i(true, git_reference_is_valid_name("refs/master}yesterday")); - cl_assert_equal_i(true, git_reference_is_valid_name("refs/master{yesterday}")); -} diff --git a/vendor/libgit2/tests/refs/iterator.c b/vendor/libgit2/tests/refs/iterator.c deleted file mode 100644 index c774513090..0000000000 --- a/vendor/libgit2/tests/refs/iterator.c +++ /dev/null @@ -1,221 +0,0 @@ -#include "clar_libgit2.h" -#include "refs.h" -#include "vector.h" - -static git_repository *repo; - -void test_refs_iterator__initialize(void) -{ - cl_git_pass(git_repository_open(&repo, cl_fixture("testrepo.git"))); -} - -void test_refs_iterator__cleanup(void) -{ - git_repository_free(repo); -} - -static const char *refnames[] = { - "refs/heads/br2", - "refs/heads/cannot-fetch", - "refs/heads/chomped", - "refs/heads/haacked", - "refs/heads/master", - "refs/heads/not-good", - "refs/heads/packed", - "refs/heads/packed-test", - "refs/heads/subtrees", - "refs/heads/test", - "refs/heads/track-local", - "refs/heads/trailing", - "refs/notes/fanout", - "refs/remotes/test/master", - "refs/tags/annotated_tag_to_blob", - "refs/tags/e90810b", - "refs/tags/hard_tag", - "refs/tags/point_to_blob", - "refs/tags/taggerless", - "refs/tags/test", - "refs/tags/wrapped_tag", -}; - -static int refcmp_cb(const void *a, const void *b) -{ - const git_reference *refa = (const git_reference *)a; - const git_reference *refb = (const git_reference *)b; - - return strcmp(refa->name, refb->name); -} - -static void assert_all_refnames_match(git_vector *output) -{ - size_t i; - git_reference *ref; - - cl_assert_equal_sz(output->length, ARRAY_SIZE(refnames)); - - git_vector_sort(output); - - git_vector_foreach(output, i, ref) { - cl_assert_equal_s(ref->name, refnames[i]); - git_reference_free(ref); - } - - git_vector_free(output); -} - -void test_refs_iterator__list(void) -{ - git_reference_iterator *iter; - git_vector output; - git_reference *ref; - - cl_git_pass(git_vector_init(&output, 32, &refcmp_cb)); - cl_git_pass(git_reference_iterator_new(&iter, repo)); - - while (1) { - int error = git_reference_next(&ref, iter); - if (error == GIT_ITEROVER) - break; - cl_git_pass(error); - cl_git_pass(git_vector_insert(&output, ref)); - } - - git_reference_iterator_free(iter); - - assert_all_refnames_match(&output); -} - -void test_refs_iterator__empty(void) -{ - git_reference_iterator *iter; - git_odb *odb; - git_reference *ref; - git_repository *empty; - - cl_git_pass(git_odb_new(&odb)); - cl_git_pass(git_repository_wrap_odb(&empty, odb)); - - cl_git_pass(git_reference_iterator_new(&iter, empty)); - cl_assert_equal_i(GIT_ITEROVER, git_reference_next(&ref, iter)); - - git_reference_iterator_free(iter); - git_odb_free(odb); - git_repository_free(empty); -} - -static int refs_foreach_cb(git_reference *reference, void *payload) -{ - git_vector *output = payload; - cl_git_pass(git_vector_insert(output, reference)); - return 0; -} - -void test_refs_iterator__foreach(void) -{ - git_vector output; - cl_git_pass(git_vector_init(&output, 32, &refcmp_cb)); - cl_git_pass(git_reference_foreach(repo, refs_foreach_cb, &output)); - assert_all_refnames_match(&output); -} - -static int refs_foreach_cancel_cb(git_reference *reference, void *payload) -{ - int *cancel_after = payload; - - git_reference_free(reference); - - if (!*cancel_after) - return -333; - (*cancel_after)--; - return 0; -} - -void test_refs_iterator__foreach_can_cancel(void) -{ - int cancel_after = 3; - cl_git_fail_with( - git_reference_foreach(repo, refs_foreach_cancel_cb, &cancel_after), - -333); - cl_assert_equal_i(0, cancel_after); -} - -static int refs_foreach_name_cb(const char *name, void *payload) -{ - git_vector *output = payload; - cl_git_pass(git_vector_insert(output, git__strdup(name))); - return 0; -} - -void test_refs_iterator__foreach_name(void) -{ - git_vector output; - size_t i; - char *name; - - cl_git_pass(git_vector_init(&output, 32, &git__strcmp_cb)); - cl_git_pass( - git_reference_foreach_name(repo, refs_foreach_name_cb, &output)); - - cl_assert_equal_sz(output.length, ARRAY_SIZE(refnames)); - git_vector_sort(&output); - - git_vector_foreach(&output, i, name) { - cl_assert_equal_s(name, refnames[i]); - git__free(name); - } - - git_vector_free(&output); -} - -static int refs_foreach_name_cancel_cb(const char *name, void *payload) -{ - int *cancel_after = payload; - if (!*cancel_after) - return -333; - GIT_UNUSED(name); - (*cancel_after)--; - return 0; -} - -void test_refs_iterator__foreach_name_can_cancel(void) -{ - int cancel_after = 5; - cl_git_fail_with( - git_reference_foreach_name( - repo, refs_foreach_name_cancel_cb, &cancel_after), - -333); - cl_assert_equal_i(0, cancel_after); -} - -void test_refs_iterator__concurrent_delete(void) -{ - git_reference_iterator *iter; - size_t full_count = 0, concurrent_count = 0; - const char *name; - int error; - - git_repository_free(repo); - repo = cl_git_sandbox_init("testrepo"); - - cl_git_pass(git_reference_iterator_new(&iter, repo)); - while ((error = git_reference_next_name(&name, iter)) == 0) { - full_count++; - } - - git_reference_iterator_free(iter); - cl_assert_equal_i(GIT_ITEROVER, error); - - cl_git_pass(git_reference_iterator_new(&iter, repo)); - while ((error = git_reference_next_name(&name, iter)) == 0) { - cl_git_pass(git_reference_remove(repo, name)); - concurrent_count++; - } - - git_reference_iterator_free(iter); - cl_assert_equal_i(GIT_ITEROVER, error); - - cl_assert_equal_i(full_count, concurrent_count); - - cl_git_sandbox_cleanup(); - repo = NULL; -} diff --git a/vendor/libgit2/tests/refs/list.c b/vendor/libgit2/tests/refs/list.c deleted file mode 100644 index 374943b052..0000000000 --- a/vendor/libgit2/tests/refs/list.c +++ /dev/null @@ -1,57 +0,0 @@ -#include "clar_libgit2.h" - -#include "repository.h" -#include "git2/reflog.h" -#include "reflog.h" - -static git_repository *g_repo; - - - -void test_refs_list__initialize(void) -{ - g_repo = cl_git_sandbox_init("testrepo"); -} - -void test_refs_list__cleanup(void) -{ - cl_git_sandbox_cleanup(); -} - - - -void test_refs_list__all(void) -{ - // try to list all the references in our test repo - git_strarray ref_list; - - cl_git_pass(git_reference_list(&ref_list, g_repo)); - - /*{ - unsigned short i; - for (i = 0; i < ref_list.count; ++i) - printf("# %s\n", ref_list.strings[i]); - }*/ - - /* We have exactly 12 refs in total if we include the packed ones: - * there is a reference that exists both in the packfile and as - * loose, but we only list it once */ - cl_assert_equal_i((int)ref_list.count, 15); - - git_strarray_free(&ref_list); -} - -void test_refs_list__do_not_retrieve_references_which_name_end_with_a_lock_extension(void) -{ - git_strarray ref_list; - - /* Create a fake locked reference */ - cl_git_mkfile( - "./testrepo/.git/refs/heads/hanwen.lock", - "144344043ba4d4a405da03de3844aa829ae8be0e\n"); - - cl_git_pass(git_reference_list(&ref_list, g_repo)); - cl_assert_equal_i((int)ref_list.count, 15); - - git_strarray_free(&ref_list); -} diff --git a/vendor/libgit2/tests/refs/listall.c b/vendor/libgit2/tests/refs/listall.c deleted file mode 100644 index c696fbb2ed..0000000000 --- a/vendor/libgit2/tests/refs/listall.c +++ /dev/null @@ -1,47 +0,0 @@ -#include "clar_libgit2.h" -#include "posix.h" - -static git_repository *repo; -static git_strarray ref_list; - -static void ensure_no_refname_starts_with_a_forward_slash(const char *path) -{ - size_t i; - - cl_git_pass(git_repository_open(&repo, path)); - cl_git_pass(git_reference_list(&ref_list, repo)); - - cl_assert(ref_list.count > 0); - - for (i = 0; i < ref_list.count; i++) - cl_assert(git__prefixcmp(ref_list.strings[i], "/") != 0); - - git_strarray_free(&ref_list); - git_repository_free(repo); -} - -void test_refs_listall__from_repository_opened_through_workdir_path(void) -{ - cl_fixture_sandbox("status"); - cl_git_pass(p_rename("status/.gitted", "status/.git")); - - ensure_no_refname_starts_with_a_forward_slash("status"); - - cl_fixture_cleanup("status"); -} - -void test_refs_listall__from_repository_opened_through_gitdir_path(void) -{ - ensure_no_refname_starts_with_a_forward_slash(cl_fixture("testrepo.git")); -} - -void test_refs_listall__from_repository_with_no_trailing_newline(void) -{ - cl_git_pass(git_repository_open(&repo, cl_fixture("bad_tag.git"))); - cl_git_pass(git_reference_list(&ref_list, repo)); - - cl_assert(ref_list.count > 0); - - git_strarray_free(&ref_list); - git_repository_free(repo); -} diff --git a/vendor/libgit2/tests/refs/lookup.c b/vendor/libgit2/tests/refs/lookup.c deleted file mode 100644 index d076e491fe..0000000000 --- a/vendor/libgit2/tests/refs/lookup.c +++ /dev/null @@ -1,60 +0,0 @@ -#include "clar_libgit2.h" -#include "refs.h" - -static git_repository *g_repo; - -void test_refs_lookup__initialize(void) -{ - g_repo = cl_git_sandbox_init("testrepo.git"); -} - -void test_refs_lookup__cleanup(void) -{ - cl_git_sandbox_cleanup(); -} - -void test_refs_lookup__with_resolve(void) -{ - git_reference *a, *b, *temp; - - cl_git_pass(git_reference_lookup(&temp, g_repo, "HEAD")); - cl_git_pass(git_reference_resolve(&a, temp)); - git_reference_free(temp); - - cl_git_pass(git_reference_lookup_resolved(&b, g_repo, "HEAD", 5)); - cl_assert(git_reference_cmp(a, b) == 0); - git_reference_free(b); - - cl_git_pass(git_reference_lookup_resolved(&b, g_repo, "HEAD_TRACKER", 5)); - cl_assert(git_reference_cmp(a, b) == 0); - git_reference_free(b); - - git_reference_free(a); -} - -void test_refs_lookup__invalid_name(void) -{ - git_oid oid; - cl_git_fail(git_reference_name_to_id(&oid, g_repo, "/refs/tags/point_to_blob")); -} - -void test_refs_lookup__oid(void) -{ - git_oid tag, expected; - - cl_git_pass(git_reference_name_to_id(&tag, g_repo, "refs/tags/point_to_blob")); - cl_git_pass(git_oid_fromstr(&expected, "1385f264afb75a56a5bec74243be9b367ba4ca08")); - cl_assert_equal_oid(&expected, &tag); -} - -void test_refs_lookup__namespace(void) -{ - int error; - git_reference *ref; - - error = git_reference_lookup(&ref, g_repo, "refs/heads"); - cl_assert_equal_i(error, GIT_ENOTFOUND); - - error = git_reference_lookup(&ref, g_repo, "refs/heads/"); - cl_assert_equal_i(error, GIT_EINVALIDSPEC); -} diff --git a/vendor/libgit2/tests/refs/normalize.c b/vendor/libgit2/tests/refs/normalize.c deleted file mode 100644 index 7f313ef38a..0000000000 --- a/vendor/libgit2/tests/refs/normalize.c +++ /dev/null @@ -1,403 +0,0 @@ -#include "clar_libgit2.h" - -#include "repository.h" -#include "git2/reflog.h" -#include "reflog.h" - -// Helpers -static void ensure_refname_normalized( - unsigned int flags, - const char *input_refname, - const char *expected_refname) -{ - char buffer_out[GIT_REFNAME_MAX]; - - cl_git_pass(git_reference_normalize_name(buffer_out, sizeof(buffer_out), input_refname, flags)); - - cl_assert_equal_s(expected_refname, buffer_out); -} - -static void ensure_refname_invalid(unsigned int flags, const char *input_refname) -{ - char buffer_out[GIT_REFNAME_MAX]; - - cl_assert_equal_i( - GIT_EINVALIDSPEC, - git_reference_normalize_name(buffer_out, sizeof(buffer_out), input_refname, flags)); -} - -void test_refs_normalize__can_normalize_a_direct_reference_name(void) -{ - ensure_refname_normalized( - GIT_REF_FORMAT_NORMAL, "refs/dummy/a", "refs/dummy/a"); - ensure_refname_normalized( - GIT_REF_FORMAT_NORMAL, "refs/stash", "refs/stash"); - ensure_refname_normalized( - GIT_REF_FORMAT_NORMAL, "refs/tags/a", "refs/tags/a"); - ensure_refname_normalized( - GIT_REF_FORMAT_NORMAL, "refs/heads/a/b", "refs/heads/a/b"); - ensure_refname_normalized( - GIT_REF_FORMAT_NORMAL, "refs/heads/a./b", "refs/heads/a./b"); - ensure_refname_normalized( - GIT_REF_FORMAT_NORMAL, "refs/heads/v@ation", "refs/heads/v@ation"); - ensure_refname_normalized( - GIT_REF_FORMAT_NORMAL, "refs///heads///a", "refs/heads/a"); -} - -void test_refs_normalize__cannot_normalize_any_direct_reference_name(void) -{ - ensure_refname_invalid( - GIT_REF_FORMAT_NORMAL, "a"); - ensure_refname_invalid( - GIT_REF_FORMAT_NORMAL, "/a"); - ensure_refname_invalid( - GIT_REF_FORMAT_NORMAL, "//a"); - ensure_refname_invalid( - GIT_REF_FORMAT_NORMAL, ""); - ensure_refname_invalid( - GIT_REF_FORMAT_NORMAL, "/refs/heads/a/"); - ensure_refname_invalid( - GIT_REF_FORMAT_NORMAL, "refs/heads/a/"); - ensure_refname_invalid( - GIT_REF_FORMAT_NORMAL, "refs/heads/a."); - ensure_refname_invalid( - GIT_REF_FORMAT_NORMAL, "refs/heads/a.lock"); - ensure_refname_invalid( - GIT_REF_FORMAT_NORMAL, "refs/heads/foo?bar"); - ensure_refname_invalid( - GIT_REF_FORMAT_NORMAL, "refs/heads\foo"); - ensure_refname_normalized( - GIT_REF_FORMAT_NORMAL, "refs/heads/v@ation", "refs/heads/v@ation"); - ensure_refname_normalized( - GIT_REF_FORMAT_NORMAL, "refs///heads///a", "refs/heads/a"); - ensure_refname_invalid( - GIT_REF_FORMAT_NORMAL, "refs/heads/.a/b"); - ensure_refname_invalid( - GIT_REF_FORMAT_NORMAL, "refs/heads/foo/../bar"); - ensure_refname_invalid( - GIT_REF_FORMAT_NORMAL, "refs/heads/foo..bar"); - ensure_refname_invalid( - GIT_REF_FORMAT_NORMAL, "refs/heads/./foo"); - ensure_refname_invalid( - GIT_REF_FORMAT_NORMAL, "refs/heads/v@{ation"); -} - -void test_refs_normalize__symbolic(void) -{ - ensure_refname_invalid( - GIT_REF_FORMAT_ALLOW_ONELEVEL, ""); - ensure_refname_invalid( - GIT_REF_FORMAT_ALLOW_ONELEVEL, "heads\foo"); - ensure_refname_invalid( - GIT_REF_FORMAT_ALLOW_ONELEVEL, "/"); - ensure_refname_invalid( - GIT_REF_FORMAT_ALLOW_ONELEVEL, "///"); - - ensure_refname_normalized( - GIT_REF_FORMAT_ALLOW_ONELEVEL, "ALL_CAPS_AND_UNDERSCORES", "ALL_CAPS_AND_UNDERSCORES"); - ensure_refname_normalized( - GIT_REF_FORMAT_ALLOW_ONELEVEL, "refs/MixedCasing", "refs/MixedCasing"); - ensure_refname_normalized( - GIT_REF_FORMAT_ALLOW_ONELEVEL, "refs///heads///a", "refs/heads/a"); - - ensure_refname_normalized( - GIT_REF_FORMAT_ALLOW_ONELEVEL, "HEAD", "HEAD"); - ensure_refname_normalized( - GIT_REF_FORMAT_ALLOW_ONELEVEL, "MERGE_HEAD", "MERGE_HEAD"); - ensure_refname_normalized( - GIT_REF_FORMAT_ALLOW_ONELEVEL, "FETCH_HEAD", "FETCH_HEAD"); -} - -/* Ported from JGit, BSD licence. - * See https://github.com/spearce/JGit/commit/e4bf8f6957bbb29362575d641d1e77a02d906739 - * - * Copyright (C) 2009, Google Inc. - * - * 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 the Git Development Community 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. - */ - -void test_refs_normalize__jgit_suite(void) -{ - // tests borrowed from JGit - -/* EmptyString */ - ensure_refname_invalid( - GIT_REF_FORMAT_ALLOW_ONELEVEL, ""); - ensure_refname_invalid( - GIT_REF_FORMAT_ALLOW_ONELEVEL, "/"); - -/* MustHaveTwoComponents */ - ensure_refname_invalid( - GIT_REF_FORMAT_NORMAL, "master"); - ensure_refname_normalized( - GIT_REF_FORMAT_NORMAL, "heads/master", "heads/master"); - -/* ValidHead */ - ensure_refname_normalized( - GIT_REF_FORMAT_ALLOW_ONELEVEL, "refs/heads/master", "refs/heads/master"); - ensure_refname_normalized( - GIT_REF_FORMAT_ALLOW_ONELEVEL, "refs/heads/pu", "refs/heads/pu"); - ensure_refname_normalized( - GIT_REF_FORMAT_ALLOW_ONELEVEL, "refs/heads/z", "refs/heads/z"); - ensure_refname_normalized( - GIT_REF_FORMAT_ALLOW_ONELEVEL, "refs/heads/FoO", "refs/heads/FoO"); - -/* ValidTag */ - ensure_refname_normalized( - GIT_REF_FORMAT_ALLOW_ONELEVEL, "refs/tags/v1.0", "refs/tags/v1.0"); - -/* NoLockSuffix */ - ensure_refname_invalid(GIT_REF_FORMAT_ALLOW_ONELEVEL, "refs/heads/master.lock"); - -/* NoDirectorySuffix */ - ensure_refname_invalid( - GIT_REF_FORMAT_ALLOW_ONELEVEL, "refs/heads/master/"); - -/* NoSpace */ - ensure_refname_invalid( - GIT_REF_FORMAT_ALLOW_ONELEVEL, "refs/heads/i haz space"); - -/* NoAsciiControlCharacters */ - { - char c; - char buffer[GIT_REFNAME_MAX]; - for (c = '\1'; c < ' '; c++) { - strncpy(buffer, "refs/heads/mast", 15); - strncpy(buffer + 15, (const char *)&c, 1); - strncpy(buffer + 16, "er", 2); - buffer[18 - 1] = '\0'; - ensure_refname_invalid(GIT_REF_FORMAT_ALLOW_ONELEVEL, buffer); - } - } - -/* NoBareDot */ - ensure_refname_invalid( - GIT_REF_FORMAT_ALLOW_ONELEVEL, "refs/heads/."); - ensure_refname_invalid( - GIT_REF_FORMAT_ALLOW_ONELEVEL, "refs/heads/.."); - ensure_refname_invalid( - GIT_REF_FORMAT_ALLOW_ONELEVEL, "refs/heads/./master"); - ensure_refname_invalid( - GIT_REF_FORMAT_ALLOW_ONELEVEL, "refs/heads/../master"); - -/* NoLeadingOrTrailingDot */ - ensure_refname_invalid( - GIT_REF_FORMAT_ALLOW_ONELEVEL, "."); - ensure_refname_invalid( - GIT_REF_FORMAT_ALLOW_ONELEVEL, "refs/heads/.bar"); - ensure_refname_invalid( - GIT_REF_FORMAT_ALLOW_ONELEVEL, "refs/heads/..bar"); - ensure_refname_invalid( - GIT_REF_FORMAT_ALLOW_ONELEVEL, "refs/heads/bar."); - -/* ContainsDot */ - ensure_refname_normalized( - GIT_REF_FORMAT_ALLOW_ONELEVEL, "refs/heads/m.a.s.t.e.r", "refs/heads/m.a.s.t.e.r"); - ensure_refname_invalid( - GIT_REF_FORMAT_ALLOW_ONELEVEL, "refs/heads/master..pu"); - -/* NoMagicRefCharacters */ - ensure_refname_invalid( - GIT_REF_FORMAT_ALLOW_ONELEVEL, "refs/heads/master^"); - ensure_refname_invalid( - GIT_REF_FORMAT_ALLOW_ONELEVEL, "refs/heads/^master"); - ensure_refname_invalid( - GIT_REF_FORMAT_ALLOW_ONELEVEL, "^refs/heads/master"); - - ensure_refname_invalid( - GIT_REF_FORMAT_ALLOW_ONELEVEL, "refs/heads/master~"); - ensure_refname_invalid( - GIT_REF_FORMAT_ALLOW_ONELEVEL, "refs/heads/~master"); - ensure_refname_invalid( - GIT_REF_FORMAT_ALLOW_ONELEVEL, "~refs/heads/master"); - - ensure_refname_invalid( - GIT_REF_FORMAT_ALLOW_ONELEVEL, "refs/heads/master:"); - ensure_refname_invalid( - GIT_REF_FORMAT_ALLOW_ONELEVEL, "refs/heads/:master"); - ensure_refname_invalid( - GIT_REF_FORMAT_ALLOW_ONELEVEL, ":refs/heads/master"); - -/* ShellGlob */ - ensure_refname_invalid( - GIT_REF_FORMAT_ALLOW_ONELEVEL, "refs/heads/master?"); - ensure_refname_invalid( - GIT_REF_FORMAT_ALLOW_ONELEVEL, "refs/heads/?master"); - ensure_refname_invalid( - GIT_REF_FORMAT_ALLOW_ONELEVEL, "?refs/heads/master"); - - ensure_refname_invalid( - GIT_REF_FORMAT_ALLOW_ONELEVEL, "refs/heads/master["); - ensure_refname_invalid( - GIT_REF_FORMAT_ALLOW_ONELEVEL, "refs/heads/[master"); - ensure_refname_invalid( - GIT_REF_FORMAT_ALLOW_ONELEVEL, "[refs/heads/master"); - - ensure_refname_invalid( - GIT_REF_FORMAT_ALLOW_ONELEVEL, "refs/heads/master*"); - ensure_refname_invalid( - GIT_REF_FORMAT_ALLOW_ONELEVEL, "refs/heads/*master"); - ensure_refname_invalid( - GIT_REF_FORMAT_ALLOW_ONELEVEL, "*refs/heads/master"); - -/* ValidSpecialCharacters */ - ensure_refname_normalized - (GIT_REF_FORMAT_ALLOW_ONELEVEL, "refs/heads/!", "refs/heads/!"); - ensure_refname_normalized( - GIT_REF_FORMAT_ALLOW_ONELEVEL, "refs/heads/\"", "refs/heads/\""); - ensure_refname_normalized( - GIT_REF_FORMAT_ALLOW_ONELEVEL, "refs/heads/#", "refs/heads/#"); - ensure_refname_normalized( - GIT_REF_FORMAT_ALLOW_ONELEVEL, "refs/heads/$", "refs/heads/$"); - ensure_refname_normalized( - GIT_REF_FORMAT_ALLOW_ONELEVEL, "refs/heads/%", "refs/heads/%"); - ensure_refname_normalized( - GIT_REF_FORMAT_ALLOW_ONELEVEL, "refs/heads/&", "refs/heads/&"); - ensure_refname_normalized( - GIT_REF_FORMAT_ALLOW_ONELEVEL, "refs/heads/'", "refs/heads/'"); - ensure_refname_normalized( - GIT_REF_FORMAT_ALLOW_ONELEVEL, "refs/heads/(", "refs/heads/("); - ensure_refname_normalized( - GIT_REF_FORMAT_ALLOW_ONELEVEL, "refs/heads/)", "refs/heads/)"); - ensure_refname_normalized( - GIT_REF_FORMAT_ALLOW_ONELEVEL, "refs/heads/+", "refs/heads/+"); - ensure_refname_normalized( - GIT_REF_FORMAT_ALLOW_ONELEVEL, "refs/heads/,", "refs/heads/,"); - ensure_refname_normalized( - GIT_REF_FORMAT_ALLOW_ONELEVEL, "refs/heads/-", "refs/heads/-"); - ensure_refname_normalized( - GIT_REF_FORMAT_ALLOW_ONELEVEL, "refs/heads/;", "refs/heads/;"); - ensure_refname_normalized( - GIT_REF_FORMAT_ALLOW_ONELEVEL, "refs/heads/<", "refs/heads/<"); - ensure_refname_normalized( - GIT_REF_FORMAT_ALLOW_ONELEVEL, "refs/heads/=", "refs/heads/="); - ensure_refname_normalized( - GIT_REF_FORMAT_ALLOW_ONELEVEL, "refs/heads/>", "refs/heads/>"); - ensure_refname_normalized( - GIT_REF_FORMAT_ALLOW_ONELEVEL, "refs/heads/@", "refs/heads/@"); - ensure_refname_normalized( - GIT_REF_FORMAT_ALLOW_ONELEVEL, "refs/heads/]", "refs/heads/]"); - ensure_refname_normalized( - GIT_REF_FORMAT_ALLOW_ONELEVEL, "refs/heads/_", "refs/heads/_"); - ensure_refname_normalized( - GIT_REF_FORMAT_ALLOW_ONELEVEL, "refs/heads/`", "refs/heads/`"); - ensure_refname_normalized( - GIT_REF_FORMAT_ALLOW_ONELEVEL, "refs/heads/{", "refs/heads/{"); - ensure_refname_normalized( - GIT_REF_FORMAT_ALLOW_ONELEVEL, "refs/heads/|", "refs/heads/|"); - ensure_refname_normalized( - GIT_REF_FORMAT_ALLOW_ONELEVEL, "refs/heads/}", "refs/heads/}"); - - // This is valid on UNIX, but not on Windows - // hence we make in invalid due to non-portability - // - ensure_refname_invalid( - GIT_REF_FORMAT_ALLOW_ONELEVEL, "refs/heads/\\"); - -/* UnicodeNames */ - /* - * Currently this fails. - * ensure_refname_normalized(GIT_REF_FORMAT_ALLOW_ONELEVEL, "refs/heads/\u00e5ngstr\u00f6m", "refs/heads/\u00e5ngstr\u00f6m"); - */ - -/* RefLogQueryIsValidRef */ - ensure_refname_invalid( - GIT_REF_FORMAT_ALLOW_ONELEVEL, "refs/heads/master@{1}"); - ensure_refname_invalid( - GIT_REF_FORMAT_ALLOW_ONELEVEL, "refs/heads/master@{1.hour.ago}"); -} - -void test_refs_normalize__buffer_has_to_be_big_enough_to_hold_the_normalized_version(void) -{ - char buffer_out[21]; - - cl_git_pass(git_reference_normalize_name( - buffer_out, 21, "refs//heads///long///name", GIT_REF_FORMAT_NORMAL)); - cl_git_fail(git_reference_normalize_name( - buffer_out, 20, "refs//heads///long///name", GIT_REF_FORMAT_NORMAL)); -} - -#define ONE_LEVEL_AND_REFSPEC \ - GIT_REF_FORMAT_ALLOW_ONELEVEL \ - | GIT_REF_FORMAT_REFSPEC_PATTERN - -void test_refs_normalize__refspec_pattern(void) -{ - ensure_refname_invalid( - GIT_REF_FORMAT_REFSPEC_PATTERN, "heads/*foo/bar"); - ensure_refname_invalid( - GIT_REF_FORMAT_REFSPEC_PATTERN, "heads/foo*/bar"); - ensure_refname_invalid( - GIT_REF_FORMAT_REFSPEC_PATTERN, "heads/f*o/bar"); - - ensure_refname_invalid( - GIT_REF_FORMAT_REFSPEC_PATTERN, "foo"); - ensure_refname_normalized( - ONE_LEVEL_AND_REFSPEC, "FOO", "FOO"); - - ensure_refname_normalized( - GIT_REF_FORMAT_REFSPEC_PATTERN, "foo/bar", "foo/bar"); - ensure_refname_normalized( - ONE_LEVEL_AND_REFSPEC, "foo/bar", "foo/bar"); - - ensure_refname_normalized( - GIT_REF_FORMAT_REFSPEC_PATTERN, "*/foo", "*/foo"); - ensure_refname_normalized( - ONE_LEVEL_AND_REFSPEC, "*/foo", "*/foo"); - - ensure_refname_normalized( - GIT_REF_FORMAT_REFSPEC_PATTERN, "foo/*/bar", "foo/*/bar"); - ensure_refname_normalized( - ONE_LEVEL_AND_REFSPEC, "foo/*/bar", "foo/*/bar"); - - ensure_refname_invalid( - GIT_REF_FORMAT_REFSPEC_PATTERN, "*"); - ensure_refname_normalized( - ONE_LEVEL_AND_REFSPEC, "*", "*"); - - ensure_refname_invalid( - GIT_REF_FORMAT_REFSPEC_PATTERN, "foo/*/*"); - ensure_refname_invalid( - ONE_LEVEL_AND_REFSPEC, "foo/*/*"); - - ensure_refname_invalid( - GIT_REF_FORMAT_REFSPEC_PATTERN, "*/foo/*"); - ensure_refname_invalid( - ONE_LEVEL_AND_REFSPEC, "*/foo/*"); - - ensure_refname_invalid( - GIT_REF_FORMAT_REFSPEC_PATTERN, "*/*/foo"); - ensure_refname_invalid( - ONE_LEVEL_AND_REFSPEC, "*/*/foo"); -} diff --git a/vendor/libgit2/tests/refs/overwrite.c b/vendor/libgit2/tests/refs/overwrite.c deleted file mode 100644 index 5aea2a7648..0000000000 --- a/vendor/libgit2/tests/refs/overwrite.c +++ /dev/null @@ -1,136 +0,0 @@ -#include "clar_libgit2.h" - -#include "repository.h" -#include "git2/reflog.h" -#include "reflog.h" - -static const char *ref_name = "refs/heads/other"; -static const char *ref_master_name = "refs/heads/master"; -static const char *ref_branch_name = "refs/heads/branch"; -static const char *ref_test_name = "refs/heads/test"; - -static git_repository *g_repo; - -void test_refs_overwrite__initialize(void) -{ - g_repo = cl_git_sandbox_init("testrepo"); -} - -void test_refs_overwrite__cleanup(void) -{ - cl_git_sandbox_cleanup(); -} - -void test_refs_overwrite__symbolic(void) -{ - // Overwrite an existing symbolic reference - git_reference *ref, *branch_ref; - - /* The target needds to exist and we need to check the name has changed */ - cl_git_pass(git_reference_symbolic_create(&branch_ref, g_repo, ref_branch_name, ref_master_name, 0, NULL)); - cl_git_pass(git_reference_symbolic_create(&ref, g_repo, ref_name, ref_branch_name, 0, NULL)); - git_reference_free(ref); - - /* Ensure it points to the right place*/ - cl_git_pass(git_reference_lookup(&ref, g_repo, ref_name)); - cl_assert(git_reference_type(ref) & GIT_REF_SYMBOLIC); - cl_assert_equal_s(git_reference_symbolic_target(ref), ref_branch_name); - git_reference_free(ref); - - /* Ensure we can't create it unless we force it to */ - cl_git_fail(git_reference_symbolic_create(&ref, g_repo, ref_name, ref_master_name, 0, NULL)); - cl_git_pass(git_reference_symbolic_create(&ref, g_repo, ref_name, ref_master_name, 1, NULL)); - git_reference_free(ref); - - /* Ensure it points to the right place */ - cl_git_pass(git_reference_lookup(&ref, g_repo, ref_name)); - cl_assert(git_reference_type(ref) & GIT_REF_SYMBOLIC); - cl_assert_equal_s(git_reference_symbolic_target(ref), ref_master_name); - - git_reference_free(ref); - git_reference_free(branch_ref); -} - -void test_refs_overwrite__object_id(void) -{ - // Overwrite an existing object id reference - git_reference *ref; - git_oid id; - - cl_git_pass(git_reference_lookup(&ref, g_repo, ref_master_name)); - cl_assert(git_reference_type(ref) & GIT_REF_OID); - git_oid_cpy(&id, git_reference_target(ref)); - git_reference_free(ref); - - /* Create it */ - cl_git_pass(git_reference_create(&ref, g_repo, ref_name, &id, 0, NULL)); - git_reference_free(ref); - - cl_git_pass(git_reference_lookup(&ref, g_repo, ref_test_name)); - cl_assert(git_reference_type(ref) & GIT_REF_OID); - git_oid_cpy(&id, git_reference_target(ref)); - git_reference_free(ref); - - /* Ensure we can't overwrite unless we force it */ - cl_git_fail(git_reference_create(&ref, g_repo, ref_name, &id, 0, NULL)); - cl_git_pass(git_reference_create(&ref, g_repo, ref_name, &id, 1, NULL)); - git_reference_free(ref); - - /* Ensure it has been overwritten */ - cl_git_pass(git_reference_lookup(&ref, g_repo, ref_name)); - cl_assert_equal_oid(&id, git_reference_target(ref)); - - git_reference_free(ref); -} - -void test_refs_overwrite__object_id_with_symbolic(void) -{ - // Overwrite an existing object id reference with a symbolic one - git_reference *ref; - git_oid id; - - cl_git_pass(git_reference_lookup(&ref, g_repo, ref_master_name)); - cl_assert(git_reference_type(ref) & GIT_REF_OID); - git_oid_cpy(&id, git_reference_target(ref)); - git_reference_free(ref); - - cl_git_pass(git_reference_create(&ref, g_repo, ref_name, &id, 0, NULL)); - git_reference_free(ref); - cl_git_fail(git_reference_symbolic_create(&ref, g_repo, ref_name, ref_master_name, 0, NULL)); - cl_git_pass(git_reference_symbolic_create(&ref, g_repo, ref_name, ref_master_name, 1, NULL)); - git_reference_free(ref); - - /* Ensure it points to the right place */ - cl_git_pass(git_reference_lookup(&ref, g_repo, ref_name)); - cl_assert(git_reference_type(ref) & GIT_REF_SYMBOLIC); - cl_assert_equal_s(git_reference_symbolic_target(ref), ref_master_name); - - git_reference_free(ref); -} - -void test_refs_overwrite__symbolic_with_object_id(void) -{ - // Overwrite an existing symbolic reference with an object id one - git_reference *ref; - git_oid id; - - cl_git_pass(git_reference_lookup(&ref, g_repo, ref_master_name)); - cl_assert(git_reference_type(ref) & GIT_REF_OID); - git_oid_cpy(&id, git_reference_target(ref)); - git_reference_free(ref); - - /* Create the symbolic ref */ - cl_git_pass(git_reference_symbolic_create(&ref, g_repo, ref_name, ref_master_name, 0, NULL)); - git_reference_free(ref); - /* It shouldn't overwrite unless we tell it to */ - cl_git_fail(git_reference_create(&ref, g_repo, ref_name, &id, 0, NULL)); - cl_git_pass(git_reference_create(&ref, g_repo, ref_name, &id, 1, NULL)); - git_reference_free(ref); - - /* Ensure it points to the right place */ - cl_git_pass(git_reference_lookup(&ref, g_repo, ref_name)); - cl_assert(git_reference_type(ref) & GIT_REF_OID); - cl_assert_equal_oid(&id, git_reference_target(ref)); - - git_reference_free(ref); -} diff --git a/vendor/libgit2/tests/refs/pack.c b/vendor/libgit2/tests/refs/pack.c deleted file mode 100644 index 7dfaf6d8f8..0000000000 --- a/vendor/libgit2/tests/refs/pack.c +++ /dev/null @@ -1,105 +0,0 @@ -#include "clar_libgit2.h" - -#include "fileops.h" -#include "git2/reflog.h" -#include "git2/refdb.h" -#include "reflog.h" -#include "refs.h" -#include "ref_helpers.h" - -static const char *loose_tag_ref_name = "refs/tags/e90810b"; - -static git_repository *g_repo; - -void test_refs_pack__initialize(void) -{ - g_repo = cl_git_sandbox_init("testrepo"); -} - -void test_refs_pack__cleanup(void) -{ - cl_git_sandbox_cleanup(); -} - -static void packall(void) -{ - git_refdb *refdb; - - cl_git_pass(git_repository_refdb(&refdb, g_repo)); - cl_git_pass(git_refdb_compress(refdb)); - git_refdb_free(refdb); -} - -void test_refs_pack__empty(void) -{ - /* create a packfile for an empty folder */ - git_buf temp_path = GIT_BUF_INIT; - - cl_git_pass(git_buf_join_n(&temp_path, '/', 3, git_repository_path(g_repo), GIT_REFS_HEADS_DIR, "empty_dir")); - cl_git_pass(git_futils_mkdir_r(temp_path.ptr, NULL, GIT_REFS_DIR_MODE)); - git_buf_free(&temp_path); - - packall(); -} - -void test_refs_pack__loose(void) -{ - /* create a packfile from all the loose refs in a repo */ - git_reference *reference; - git_buf temp_path = GIT_BUF_INIT; - - /* Ensure a known loose ref can be looked up */ - cl_git_pass(git_reference_lookup(&reference, g_repo, loose_tag_ref_name)); - cl_assert(reference_is_packed(reference) == 0); - cl_assert_equal_s(reference->name, loose_tag_ref_name); - git_reference_free(reference); - - /* - * We are now trying to pack also a loose reference - * called `points_to_blob`, to make sure we can properly - * pack weak tags - */ - packall(); - - /* Ensure the packed-refs file exists */ - cl_git_pass(git_buf_joinpath(&temp_path, git_repository_path(g_repo), GIT_PACKEDREFS_FILE)); - cl_assert(git_path_exists(temp_path.ptr)); - - /* Ensure the known ref can still be looked up but is now packed */ - cl_git_pass(git_reference_lookup(&reference, g_repo, loose_tag_ref_name)); - cl_assert(reference_is_packed(reference)); - cl_assert_equal_s(reference->name, loose_tag_ref_name); - - /* Ensure the known ref has been removed from the loose folder structure */ - cl_git_pass(git_buf_joinpath(&temp_path, git_repository_path(g_repo), loose_tag_ref_name)); - cl_assert(!git_path_exists(temp_path.ptr)); - - git_reference_free(reference); - git_buf_free(&temp_path); -} - -void test_refs_pack__symbolic(void) -{ - /* create a packfile from loose refs skipping symbolic refs */ - int i; - git_oid head; - git_reference *ref; - char name[128]; - - cl_git_pass(git_reference_name_to_id(&head, g_repo, "HEAD")); - - /* make a bunch of references */ - - for (i = 0; i < 100; ++i) { - p_snprintf(name, sizeof(name), "refs/heads/symbolic-%03d", i); - cl_git_pass(git_reference_symbolic_create( - &ref, g_repo, name, "refs/heads/master", 0, NULL)); - git_reference_free(ref); - - p_snprintf(name, sizeof(name), "refs/heads/direct-%03d", i); - cl_git_pass(git_reference_create(&ref, g_repo, name, &head, 0, NULL)); - git_reference_free(ref); - } - - packall(); -} diff --git a/vendor/libgit2/tests/refs/peel.c b/vendor/libgit2/tests/refs/peel.c deleted file mode 100644 index 83f6109c07..0000000000 --- a/vendor/libgit2/tests/refs/peel.c +++ /dev/null @@ -1,119 +0,0 @@ -#include "clar_libgit2.h" - -static git_repository *g_repo; -static git_repository *g_peel_repo; - -void test_refs_peel__initialize(void) -{ - cl_git_pass(git_repository_open(&g_repo, cl_fixture("testrepo.git"))); - cl_git_pass(git_repository_open(&g_peel_repo, cl_fixture("peeled.git"))); -} - -void test_refs_peel__cleanup(void) -{ - git_repository_free(g_repo); - g_repo = NULL; - git_repository_free(g_peel_repo); - g_peel_repo = NULL; -} - -static void assert_peel_generic( - git_repository *repo, - const char *ref_name, - git_otype requested_type, - const char* expected_sha, - git_otype expected_type) -{ - git_oid expected_oid; - git_reference *ref; - git_object *peeled; - - cl_git_pass(git_reference_lookup(&ref, repo, ref_name)); - - cl_git_pass(git_reference_peel(&peeled, ref, requested_type)); - - cl_git_pass(git_oid_fromstr(&expected_oid, expected_sha)); - cl_assert_equal_oid(&expected_oid, git_object_id(peeled)); - - cl_assert_equal_i(expected_type, git_object_type(peeled)); - - git_object_free(peeled); - git_reference_free(ref); -} - -static void assert_peel( - const char *ref_name, - git_otype requested_type, - const char* expected_sha, - git_otype expected_type) -{ - assert_peel_generic(g_repo, ref_name, requested_type, - expected_sha, expected_type); -} - -static void assert_peel_error(int error, const char *ref_name, git_otype requested_type) -{ - git_reference *ref; - git_object *peeled; - - cl_git_pass(git_reference_lookup(&ref, g_repo, ref_name)); - - cl_assert_equal_i(error, git_reference_peel(&peeled, ref, requested_type)); - - git_reference_free(ref); -} - -void test_refs_peel__can_peel_a_tag(void) -{ - assert_peel("refs/tags/test", GIT_OBJ_TAG, - "b25fa35b38051e4ae45d4222e795f9df2e43f1d1", GIT_OBJ_TAG); - assert_peel("refs/tags/test", GIT_OBJ_COMMIT, - "e90810b8df3e80c413d903f631643c716887138d", GIT_OBJ_COMMIT); - assert_peel("refs/tags/test", GIT_OBJ_TREE, - "53fc32d17276939fc79ed05badaef2db09990016", GIT_OBJ_TREE); - assert_peel("refs/tags/point_to_blob", GIT_OBJ_BLOB, - "1385f264afb75a56a5bec74243be9b367ba4ca08", GIT_OBJ_BLOB); -} - -void test_refs_peel__can_peel_a_branch(void) -{ - assert_peel("refs/heads/master", GIT_OBJ_COMMIT, - "a65fedf39aefe402d3bb6e24df4d4f5fe4547750", GIT_OBJ_COMMIT); - assert_peel("refs/heads/master", GIT_OBJ_TREE, - "944c0f6e4dfa41595e6eb3ceecdb14f50fe18162", GIT_OBJ_TREE); -} - -void test_refs_peel__can_peel_a_symbolic_reference(void) -{ - assert_peel("HEAD", GIT_OBJ_COMMIT, - "a65fedf39aefe402d3bb6e24df4d4f5fe4547750", GIT_OBJ_COMMIT); - assert_peel("HEAD", GIT_OBJ_TREE, - "944c0f6e4dfa41595e6eb3ceecdb14f50fe18162", GIT_OBJ_TREE); -} - -void test_refs_peel__cannot_peel_into_a_non_existing_target(void) -{ - assert_peel_error(GIT_EINVALIDSPEC, "refs/tags/point_to_blob", GIT_OBJ_TAG); -} - -void test_refs_peel__can_peel_into_any_non_tag_object(void) -{ - assert_peel("refs/heads/master", GIT_OBJ_ANY, - "a65fedf39aefe402d3bb6e24df4d4f5fe4547750", GIT_OBJ_COMMIT); - assert_peel("refs/tags/point_to_blob", GIT_OBJ_ANY, - "1385f264afb75a56a5bec74243be9b367ba4ca08", GIT_OBJ_BLOB); - assert_peel("refs/tags/test", GIT_OBJ_ANY, - "e90810b8df3e80c413d903f631643c716887138d", GIT_OBJ_COMMIT); -} - -void test_refs_peel__can_peel_fully_peeled_packed_refs(void) -{ - assert_peel_generic(g_peel_repo, - "refs/tags/tag-inside-tags", GIT_OBJ_ANY, - "0df1a5865c8abfc09f1f2182e6a31be550e99f07", - GIT_OBJ_COMMIT); - assert_peel_generic(g_peel_repo, - "refs/foo/tag-outside-tags", GIT_OBJ_ANY, - "0df1a5865c8abfc09f1f2182e6a31be550e99f07", - GIT_OBJ_COMMIT); -} diff --git a/vendor/libgit2/tests/refs/races.c b/vendor/libgit2/tests/refs/races.c deleted file mode 100644 index fbecf4a75e..0000000000 --- a/vendor/libgit2/tests/refs/races.c +++ /dev/null @@ -1,152 +0,0 @@ -#include "clar_libgit2.h" - -#include "repository.h" -#include "git2/reflog.h" -#include "reflog.h" -#include "ref_helpers.h" - -static const char *commit_id = "099fabac3a9ea935598528c27f866e34089c2eff"; -static const char *refname = "refs/heads/master"; -static const char *other_refname = "refs/heads/foo"; -static const char *other_commit_id = "a65fedf39aefe402d3bb6e24df4d4f5fe4547750"; - -static git_repository *g_repo; - -void test_refs_races__initialize(void) -{ - g_repo = cl_git_sandbox_init("testrepo"); -} - -void test_refs_races__cleanup(void) -{ - cl_git_sandbox_cleanup(); -} - -void test_refs_races__create_matching(void) -{ - git_reference *ref, *ref2, *ref3; - git_oid id, other_id; - - git_oid_fromstr(&id, commit_id); - git_oid_fromstr(&other_id, other_commit_id); - - cl_git_fail_with(GIT_EMODIFIED, git_reference_create_matching(&ref, g_repo, refname, &other_id, 1, &other_id, NULL)); - - cl_git_pass(git_reference_lookup(&ref, g_repo, refname)); - cl_git_pass(git_reference_create_matching(&ref2, g_repo, refname, &other_id, 1, &id, NULL)); - cl_git_fail_with(GIT_EMODIFIED, git_reference_set_target(&ref3, ref, &other_id, NULL)); - - git_reference_free(ref); - git_reference_free(ref2); - git_reference_free(ref3); -} - -void test_refs_races__symbolic_create_matching(void) -{ - git_reference *ref, *ref2, *ref3; - git_oid id, other_id; - - git_oid_fromstr(&id, commit_id); - git_oid_fromstr(&other_id, other_commit_id); - - cl_git_fail_with(GIT_EMODIFIED, git_reference_symbolic_create_matching(&ref, g_repo, "HEAD", other_refname, 1, other_refname, NULL)); - - cl_git_pass(git_reference_lookup(&ref, g_repo, "HEAD")); - cl_git_pass(git_reference_symbolic_create_matching(&ref2, g_repo, "HEAD", other_refname, 1, NULL, refname)); - cl_git_fail_with(GIT_EMODIFIED, git_reference_symbolic_set_target(&ref3, ref, other_refname, NULL)); - - git_reference_free(ref); - git_reference_free(ref2); - git_reference_free(ref3); -} - -void test_refs_races__delete(void) -{ - git_reference *ref, *ref2; - git_oid id, other_id; - - git_oid_fromstr(&id, commit_id); - git_oid_fromstr(&other_id, other_commit_id); - - /* We can delete a value that matches */ - cl_git_pass(git_reference_lookup(&ref, g_repo, refname)); - cl_git_pass(git_reference_delete(ref)); - git_reference_free(ref); - - /* We cannot delete a symbolic value that doesn't match */ - cl_git_pass(git_reference_lookup(&ref, g_repo, "HEAD")); - cl_git_pass(git_reference_symbolic_create_matching(&ref2, g_repo, "HEAD", other_refname, 1, NULL, refname)); - cl_git_fail_with(GIT_EMODIFIED, git_reference_delete(ref)); - - git_reference_free(ref); - git_reference_free(ref2); - - cl_git_pass(git_reference_create(&ref, g_repo, refname, &id, 1, NULL)); - git_reference_free(ref); - - /* We cannot delete an oid value that doesn't match */ - cl_git_pass(git_reference_lookup(&ref, g_repo, refname)); - cl_git_pass(git_reference_create_matching(&ref2, g_repo, refname, &other_id, 1, &id, NULL)); - cl_git_fail_with(GIT_EMODIFIED, git_reference_delete(ref)); - - git_reference_free(ref); - git_reference_free(ref2); -} - -void test_refs_races__switch_oid_to_symbolic(void) -{ - git_reference *ref, *ref2, *ref3; - git_oid id, other_id; - - git_oid_fromstr(&id, commit_id); - git_oid_fromstr(&other_id, other_commit_id); - - /* Removing a direct ref when it's currently symbolic should fail */ - cl_git_pass(git_reference_lookup(&ref, g_repo, refname)); - cl_git_pass(git_reference_symbolic_create(&ref2, g_repo, refname, other_refname, 1, NULL)); - cl_git_fail_with(GIT_EMODIFIED, git_reference_delete(ref)); - - git_reference_free(ref); - git_reference_free(ref2); - - cl_git_pass(git_reference_create(&ref, g_repo, refname, &id, 1, NULL)); - git_reference_free(ref); - - /* Updating a direct ref when it's currently symbolic should fail */ - cl_git_pass(git_reference_lookup(&ref, g_repo, refname)); - cl_git_pass(git_reference_symbolic_create(&ref2, g_repo, refname, other_refname, 1, NULL)); - cl_git_fail_with(GIT_EMODIFIED, git_reference_set_target(&ref3, ref, &other_id, NULL)); - - git_reference_free(ref); - git_reference_free(ref2); - git_reference_free(ref3); -} - -void test_refs_races__switch_symbolic_to_oid(void) -{ - git_reference *ref, *ref2, *ref3; - git_oid id, other_id; - - git_oid_fromstr(&id, commit_id); - git_oid_fromstr(&other_id, other_commit_id); - - /* Removing a symbolic ref when it's currently direct should fail */ - cl_git_pass(git_reference_lookup(&ref, g_repo, "HEAD")); - cl_git_pass(git_reference_create(&ref2, g_repo, "HEAD", &id, 1, NULL)); - cl_git_fail_with(GIT_EMODIFIED, git_reference_delete(ref)); - - git_reference_free(ref); - git_reference_free(ref2); - - cl_git_pass(git_reference_symbolic_create(&ref, g_repo, "HEAD", refname, 1, NULL)); - git_reference_free(ref); - - /* Updating a symbolic ref when it's currently direct should fail */ - cl_git_pass(git_reference_lookup(&ref, g_repo, "HEAD")); - cl_git_pass(git_reference_create(&ref2, g_repo, "HEAD", &id, 1, NULL)); - cl_git_fail_with(GIT_EMODIFIED, git_reference_symbolic_set_target(&ref3, ref, other_refname, NULL)); - - git_reference_free(ref); - git_reference_free(ref2); - git_reference_free(ref3); -} diff --git a/vendor/libgit2/tests/refs/read.c b/vendor/libgit2/tests/refs/read.c deleted file mode 100644 index cb42a568bc..0000000000 --- a/vendor/libgit2/tests/refs/read.c +++ /dev/null @@ -1,299 +0,0 @@ -#include "clar_libgit2.h" - -#include "repository.h" -#include "git2/reflog.h" -#include "reflog.h" -#include "ref_helpers.h" - -static const char *loose_tag_ref_name = "refs/tags/e90810b"; -static const char *non_existing_tag_ref_name = "refs/tags/i-do-not-exist"; -static const char *head_tracker_sym_ref_name = "HEAD_TRACKER"; -static const char *current_head_target = "refs/heads/master"; -static const char *current_master_tip = "a65fedf39aefe402d3bb6e24df4d4f5fe4547750"; -static const char *packed_head_name = "refs/heads/packed"; -static const char *packed_test_head_name = "refs/heads/packed-test"; - -static git_repository *g_repo; - -void test_refs_read__initialize(void) -{ - cl_git_pass(git_repository_open(&g_repo, cl_fixture("testrepo.git"))); -} - -void test_refs_read__cleanup(void) -{ - git_repository_free(g_repo); - g_repo = NULL; -} - -void test_refs_read__loose_tag(void) -{ - // lookup a loose tag reference - git_reference *reference; - git_object *object; - git_buf ref_name_from_tag_name = GIT_BUF_INIT; - - cl_git_pass(git_reference_lookup(&reference, g_repo, loose_tag_ref_name)); - cl_assert(git_reference_type(reference) & GIT_REF_OID); - cl_assert(reference_is_packed(reference) == 0); - cl_assert_equal_s(reference->name, loose_tag_ref_name); - - cl_git_pass(git_object_lookup(&object, g_repo, git_reference_target(reference), GIT_OBJ_ANY)); - cl_assert(object != NULL); - cl_assert(git_object_type(object) == GIT_OBJ_TAG); - - /* Ensure the name of the tag matches the name of the reference */ - cl_git_pass(git_buf_joinpath(&ref_name_from_tag_name, GIT_REFS_TAGS_DIR, git_tag_name((git_tag *)object))); - cl_assert_equal_s(ref_name_from_tag_name.ptr, loose_tag_ref_name); - git_buf_free(&ref_name_from_tag_name); - - git_object_free(object); - - git_reference_free(reference); -} - -void test_refs_read__nonexisting_tag(void) -{ - // lookup a loose tag reference that doesn't exist - git_reference *reference; - - cl_git_fail(git_reference_lookup(&reference, g_repo, non_existing_tag_ref_name)); - - git_reference_free(reference); -} - - -void test_refs_read__symbolic(void) -{ - // lookup a symbolic reference - git_reference *reference, *resolved_ref; - git_object *object; - git_oid id; - - cl_git_pass(git_reference_lookup(&reference, g_repo, GIT_HEAD_FILE)); - cl_assert(git_reference_type(reference) & GIT_REF_SYMBOLIC); - cl_assert(reference_is_packed(reference) == 0); - cl_assert_equal_s(reference->name, GIT_HEAD_FILE); - - cl_git_pass(git_reference_resolve(&resolved_ref, reference)); - cl_assert(git_reference_type(resolved_ref) == GIT_REF_OID); - - cl_git_pass(git_object_lookup(&object, g_repo, git_reference_target(resolved_ref), GIT_OBJ_ANY)); - cl_assert(object != NULL); - cl_assert(git_object_type(object) == GIT_OBJ_COMMIT); - - git_oid_fromstr(&id, current_master_tip); - cl_assert_equal_oid(&id, git_object_id(object)); - - git_object_free(object); - - git_reference_free(reference); - git_reference_free(resolved_ref); -} - -void test_refs_read__nested_symbolic(void) -{ - // lookup a nested symbolic reference - git_reference *reference, *resolved_ref; - git_object *object; - git_oid id; - - cl_git_pass(git_reference_lookup(&reference, g_repo, head_tracker_sym_ref_name)); - cl_assert(git_reference_type(reference) & GIT_REF_SYMBOLIC); - cl_assert(reference_is_packed(reference) == 0); - cl_assert_equal_s(reference->name, head_tracker_sym_ref_name); - - cl_git_pass(git_reference_resolve(&resolved_ref, reference)); - cl_assert(git_reference_type(resolved_ref) == GIT_REF_OID); - - cl_git_pass(git_object_lookup(&object, g_repo, git_reference_target(resolved_ref), GIT_OBJ_ANY)); - cl_assert(object != NULL); - cl_assert(git_object_type(object) == GIT_OBJ_COMMIT); - - git_oid_fromstr(&id, current_master_tip); - cl_assert_equal_oid(&id, git_object_id(object)); - - git_object_free(object); - - git_reference_free(reference); - git_reference_free(resolved_ref); -} - -void test_refs_read__head_then_master(void) -{ - // lookup the HEAD and resolve the master branch - git_reference *reference, *resolved_ref, *comp_base_ref; - - cl_git_pass(git_reference_lookup(&reference, g_repo, head_tracker_sym_ref_name)); - cl_git_pass(git_reference_resolve(&comp_base_ref, reference)); - git_reference_free(reference); - - cl_git_pass(git_reference_lookup(&reference, g_repo, GIT_HEAD_FILE)); - cl_git_pass(git_reference_resolve(&resolved_ref, reference)); - cl_assert_equal_oid(git_reference_target(comp_base_ref), git_reference_target(resolved_ref)); - git_reference_free(reference); - git_reference_free(resolved_ref); - - cl_git_pass(git_reference_lookup(&reference, g_repo, current_head_target)); - cl_git_pass(git_reference_resolve(&resolved_ref, reference)); - cl_assert_equal_oid(git_reference_target(comp_base_ref), git_reference_target(resolved_ref)); - git_reference_free(reference); - git_reference_free(resolved_ref); - - git_reference_free(comp_base_ref); -} - -void test_refs_read__master_then_head(void) -{ - // lookup the master branch and then the HEAD - git_reference *reference, *master_ref, *resolved_ref; - - cl_git_pass(git_reference_lookup(&master_ref, g_repo, current_head_target)); - cl_git_pass(git_reference_lookup(&reference, g_repo, GIT_HEAD_FILE)); - - cl_git_pass(git_reference_resolve(&resolved_ref, reference)); - cl_assert_equal_oid(git_reference_target(master_ref), git_reference_target(resolved_ref)); - - git_reference_free(reference); - git_reference_free(resolved_ref); - git_reference_free(master_ref); -} - - -void test_refs_read__packed(void) -{ - // lookup a packed reference - git_reference *reference; - git_object *object; - - cl_git_pass(git_reference_lookup(&reference, g_repo, packed_head_name)); - cl_assert(git_reference_type(reference) & GIT_REF_OID); - cl_assert(reference_is_packed(reference)); - cl_assert_equal_s(reference->name, packed_head_name); - - cl_git_pass(git_object_lookup(&object, g_repo, git_reference_target(reference), GIT_OBJ_ANY)); - cl_assert(object != NULL); - cl_assert(git_object_type(object) == GIT_OBJ_COMMIT); - - git_object_free(object); - - git_reference_free(reference); -} - -void test_refs_read__loose_first(void) -{ - // assure that a loose reference is looked up before a packed reference - git_reference *reference; - - cl_git_pass(git_reference_lookup(&reference, g_repo, packed_head_name)); - git_reference_free(reference); - cl_git_pass(git_reference_lookup(&reference, g_repo, packed_test_head_name)); - cl_assert(git_reference_type(reference) & GIT_REF_OID); - cl_assert(reference_is_packed(reference) == 0); - cl_assert_equal_s(reference->name, packed_test_head_name); - - git_reference_free(reference); -} - -void test_refs_read__chomped(void) -{ - git_reference *test, *chomped; - - cl_git_pass(git_reference_lookup(&test, g_repo, "refs/heads/test")); - cl_git_pass(git_reference_lookup(&chomped, g_repo, "refs/heads/chomped")); - cl_assert_equal_oid(git_reference_target(test), git_reference_target(chomped)); - - git_reference_free(test); - git_reference_free(chomped); -} - -void test_refs_read__trailing(void) -{ - git_reference *test, *trailing; - - cl_git_pass(git_reference_lookup(&test, g_repo, "refs/heads/test")); - cl_git_pass(git_reference_lookup(&trailing, g_repo, "refs/heads/trailing")); - cl_assert_equal_oid(git_reference_target(test), git_reference_target(trailing)); - git_reference_free(trailing); - cl_git_pass(git_reference_lookup(&trailing, g_repo, "FETCH_HEAD")); - - git_reference_free(test); - git_reference_free(trailing); -} - -void test_refs_read__unfound_return_ENOTFOUND(void) -{ - git_reference *reference; - git_oid id; - - cl_assert_equal_i(GIT_ENOTFOUND, - git_reference_lookup(&reference, g_repo, "TEST_MASTER")); - cl_assert_equal_i(GIT_ENOTFOUND, - git_reference_lookup(&reference, g_repo, "refs/test/master")); - cl_assert_equal_i(GIT_ENOTFOUND, - git_reference_lookup(&reference, g_repo, "refs/tags/test/master")); - cl_assert_equal_i(GIT_ENOTFOUND, - git_reference_lookup(&reference, g_repo, "refs/tags/test/farther/master")); - - cl_assert_equal_i(GIT_ENOTFOUND, - git_reference_name_to_id(&id, g_repo, "refs/tags/test/farther/master")); -} - -static void assert_is_branch(const char *name, bool expected_branchness) -{ - git_reference *reference; - cl_git_pass(git_reference_lookup(&reference, g_repo, name)); - cl_assert_equal_i(expected_branchness, git_reference_is_branch(reference)); - git_reference_free(reference); -} - -void test_refs_read__can_determine_if_a_reference_is_a_local_branch(void) -{ - assert_is_branch("refs/heads/master", true); - assert_is_branch("refs/heads/packed", true); - assert_is_branch("refs/remotes/test/master", false); - assert_is_branch("refs/tags/e90810b", false); -} - -static void assert_is_tag(const char *name, bool expected_tagness) -{ - git_reference *reference; - cl_git_pass(git_reference_lookup(&reference, g_repo, name)); - cl_assert_equal_i(expected_tagness, git_reference_is_tag(reference)); - git_reference_free(reference); -} - -void test_refs_read__can_determine_if_a_reference_is_a_tag(void) -{ - assert_is_tag("refs/tags/e90810b", true); - assert_is_tag("refs/tags/test", true); - assert_is_tag("refs/heads/packed", false); - assert_is_tag("refs/remotes/test/master", false); -} - -static void assert_is_note(const char *name, bool expected_noteness) -{ - git_reference *reference; - cl_git_pass(git_reference_lookup(&reference, g_repo, name)); - cl_assert_equal_i(expected_noteness, git_reference_is_note(reference)); - git_reference_free(reference); -} - -void test_refs_read__can_determine_if_a_reference_is_a_note(void) -{ - assert_is_note("refs/notes/fanout", true); - assert_is_note("refs/heads/packed", false); - assert_is_note("refs/remotes/test/master", false); -} - -void test_refs_read__invalid_name_returns_EINVALIDSPEC(void) -{ - git_reference *reference; - git_oid id; - - cl_assert_equal_i(GIT_EINVALIDSPEC, - git_reference_lookup(&reference, g_repo, "refs/heads/Inv@{id")); - - cl_assert_equal_i(GIT_EINVALIDSPEC, - git_reference_name_to_id(&id, g_repo, "refs/heads/Inv@{id")); -} diff --git a/vendor/libgit2/tests/refs/ref_helpers.c b/vendor/libgit2/tests/refs/ref_helpers.c deleted file mode 100644 index 7676e65a79..0000000000 --- a/vendor/libgit2/tests/refs/ref_helpers.c +++ /dev/null @@ -1,25 +0,0 @@ -#include "git2/repository.h" -#include "git2/refs.h" -#include "common.h" -#include "util.h" -#include "buffer.h" -#include "path.h" - -int reference_is_packed(git_reference *ref) -{ - git_buf ref_path = GIT_BUF_INIT; - int packed; - - assert(ref); - - if (git_buf_joinpath(&ref_path, - git_repository_path(git_reference_owner(ref)), - git_reference_name(ref)) < 0) - return -1; - - packed = !git_path_isfile(ref_path.ptr); - - git_buf_free(&ref_path); - - return packed; -} diff --git a/vendor/libgit2/tests/refs/ref_helpers.h b/vendor/libgit2/tests/refs/ref_helpers.h deleted file mode 100644 index 0ef55bfce7..0000000000 --- a/vendor/libgit2/tests/refs/ref_helpers.h +++ /dev/null @@ -1 +0,0 @@ -int reference_is_packed(git_reference *ref); diff --git a/vendor/libgit2/tests/refs/reflog/drop.c b/vendor/libgit2/tests/refs/reflog/drop.c deleted file mode 100644 index 916bd99335..0000000000 --- a/vendor/libgit2/tests/refs/reflog/drop.c +++ /dev/null @@ -1,115 +0,0 @@ -#include "clar_libgit2.h" - -#include "reflog.h" - -static git_repository *g_repo; -static git_reflog *g_reflog; -static size_t entrycount; - -void test_refs_reflog_drop__initialize(void) -{ - g_repo = cl_git_sandbox_init("testrepo.git"); - - git_reflog_read(&g_reflog, g_repo, "HEAD"); - entrycount = git_reflog_entrycount(g_reflog); -} - -void test_refs_reflog_drop__cleanup(void) -{ - git_reflog_free(g_reflog); - g_reflog = NULL; - - cl_git_sandbox_cleanup(); -} - -void test_refs_reflog_drop__dropping_a_non_exisiting_entry_from_the_log_returns_ENOTFOUND(void) -{ - cl_assert_equal_i(GIT_ENOTFOUND, git_reflog_drop(g_reflog, entrycount, 0)); - - cl_assert_equal_sz(entrycount, git_reflog_entrycount(g_reflog)); -} - -void test_refs_reflog_drop__can_drop_an_entry(void) -{ - cl_assert(entrycount > 4); - - cl_git_pass(git_reflog_drop(g_reflog, 2, 0)); - cl_assert_equal_sz(entrycount - 1, git_reflog_entrycount(g_reflog)); -} - -void test_refs_reflog_drop__can_drop_an_entry_and_rewrite_the_log_history(void) -{ - const git_reflog_entry *before_current; - const git_reflog_entry *after_current; - git_oid before_current_old_oid, before_current_cur_oid; - - cl_assert(entrycount > 4); - - before_current = git_reflog_entry_byindex(g_reflog, 1); - - git_oid_cpy(&before_current_old_oid, &before_current->oid_old); - git_oid_cpy(&before_current_cur_oid, &before_current->oid_cur); - - cl_git_pass(git_reflog_drop(g_reflog, 1, 1)); - - cl_assert_equal_sz(entrycount - 1, git_reflog_entrycount(g_reflog)); - - after_current = git_reflog_entry_byindex(g_reflog, 0); - - cl_assert_equal_i(0, git_oid_cmp(&before_current_old_oid, &after_current->oid_old)); - cl_assert(0 != git_oid_cmp(&before_current_cur_oid, &after_current->oid_cur)); -} - -void test_refs_reflog_drop__can_drop_the_oldest_entry(void) -{ - const git_reflog_entry *entry; - - cl_assert(entrycount > 2); - - cl_git_pass(git_reflog_drop(g_reflog, entrycount - 1, 0)); - cl_assert_equal_sz(entrycount - 1, git_reflog_entrycount(g_reflog)); - - entry = git_reflog_entry_byindex(g_reflog, entrycount - 2); - cl_assert(git_oid_streq(&entry->oid_old, GIT_OID_HEX_ZERO) != 0); -} - -void test_refs_reflog_drop__can_drop_the_oldest_entry_and_rewrite_the_log_history(void) -{ - const git_reflog_entry *entry; - - cl_assert(entrycount > 2); - - cl_git_pass(git_reflog_drop(g_reflog, entrycount - 1, 1)); - cl_assert_equal_sz(entrycount - 1, git_reflog_entrycount(g_reflog)); - - entry = git_reflog_entry_byindex(g_reflog, entrycount - 2); - cl_assert(git_oid_streq(&entry->oid_old, GIT_OID_HEX_ZERO) == 0); -} - -void test_refs_reflog_drop__can_drop_all_the_entries(void) -{ - cl_assert(--entrycount > 0); - - do { - cl_git_pass(git_reflog_drop(g_reflog, 0, 1)); - } while (--entrycount > 0); - - cl_git_pass(git_reflog_drop(g_reflog, 0, 1)); - - cl_assert_equal_i(0, (int)git_reflog_entrycount(g_reflog)); -} - -void test_refs_reflog_drop__can_persist_deletion_on_disk(void) -{ - cl_assert(entrycount > 2); - - cl_git_pass(git_reflog_drop(g_reflog, 0, 1)); - cl_assert_equal_sz(entrycount - 1, git_reflog_entrycount(g_reflog)); - cl_git_pass(git_reflog_write(g_reflog)); - - git_reflog_free(g_reflog); - - git_reflog_read(&g_reflog, g_repo, "HEAD"); - - cl_assert_equal_sz(entrycount - 1, git_reflog_entrycount(g_reflog)); -} diff --git a/vendor/libgit2/tests/refs/reflog/reflog.c b/vendor/libgit2/tests/refs/reflog/reflog.c deleted file mode 100644 index 56ec422c39..0000000000 --- a/vendor/libgit2/tests/refs/reflog/reflog.c +++ /dev/null @@ -1,336 +0,0 @@ -#include "clar_libgit2.h" - -#include "fileops.h" -#include "git2/reflog.h" -#include "reflog.h" - - -static const char *new_ref = "refs/heads/test-reflog"; -static const char *current_master_tip = "a65fedf39aefe402d3bb6e24df4d4f5fe4547750"; -#define commit_msg "commit: bla bla" - -static git_repository *g_repo; - - -// helpers -static void assert_signature(const git_signature *expected, const git_signature *actual) -{ - cl_assert(actual); - cl_assert_equal_s(expected->name, actual->name); - cl_assert_equal_s(expected->email, actual->email); - cl_assert(expected->when.offset == actual->when.offset); - cl_assert(expected->when.time == actual->when.time); -} - - -// Fixture setup and teardown -void test_refs_reflog_reflog__initialize(void) -{ - g_repo = cl_git_sandbox_init("testrepo.git"); -} - -void test_refs_reflog_reflog__cleanup(void) -{ - cl_git_sandbox_cleanup(); -} - -static void assert_appends(const git_signature *committer, const git_oid *oid) -{ - git_repository *repo2; - git_reference *lookedup_ref; - git_reflog *reflog; - const git_reflog_entry *entry; - - /* Reopen a new instance of the repository */ - cl_git_pass(git_repository_open(&repo2, "testrepo.git")); - - /* Lookup the previously created branch */ - cl_git_pass(git_reference_lookup(&lookedup_ref, repo2, new_ref)); - - /* Read and parse the reflog for this branch */ - cl_git_pass(git_reflog_read(&reflog, repo2, new_ref)); - cl_assert_equal_i(3, (int)git_reflog_entrycount(reflog)); - - /* The first one was the creation of the branch */ - entry = git_reflog_entry_byindex(reflog, 2); - cl_assert(git_oid_streq(&entry->oid_old, GIT_OID_HEX_ZERO) == 0); - - entry = git_reflog_entry_byindex(reflog, 1); - assert_signature(committer, entry->committer); - cl_assert(git_oid_cmp(oid, &entry->oid_old) == 0); - cl_assert(git_oid_cmp(oid, &entry->oid_cur) == 0); - cl_assert(entry->msg == NULL); - - entry = git_reflog_entry_byindex(reflog, 0); - assert_signature(committer, entry->committer); - cl_assert(git_oid_cmp(oid, &entry->oid_cur) == 0); - cl_assert_equal_s(commit_msg, entry->msg); - - git_reflog_free(reflog); - git_repository_free(repo2); - - git_reference_free(lookedup_ref); -} - -void test_refs_reflog_reflog__append_then_read(void) -{ - /* write a reflog for a given reference and ensure it can be read back */ - git_reference *ref; - git_oid oid; - git_signature *committer; - git_reflog *reflog; - - /* Create a new branch pointing at the HEAD */ - git_oid_fromstr(&oid, current_master_tip); - cl_git_pass(git_reference_create(&ref, g_repo, new_ref, &oid, 0, NULL)); - git_reference_free(ref); - - cl_git_pass(git_signature_now(&committer, "foo", "foo@bar")); - - cl_git_pass(git_reflog_read(&reflog, g_repo, new_ref)); - - cl_git_fail(git_reflog_append(reflog, &oid, committer, "no inner\nnewline")); - cl_git_pass(git_reflog_append(reflog, &oid, committer, NULL)); - cl_git_pass(git_reflog_append(reflog, &oid, committer, commit_msg "\n")); - cl_git_pass(git_reflog_write(reflog)); - git_reflog_free(reflog); - - assert_appends(committer, &oid); - - git_signature_free(committer); -} - -void test_refs_reflog_reflog__renaming_the_reference_moves_the_reflog(void) -{ - git_reference *master, *new_master; - git_buf master_log_path = GIT_BUF_INIT, moved_log_path = GIT_BUF_INIT; - - git_buf_joinpath(&master_log_path, git_repository_path(g_repo), GIT_REFLOG_DIR); - git_buf_puts(&moved_log_path, git_buf_cstr(&master_log_path)); - git_buf_joinpath(&master_log_path, git_buf_cstr(&master_log_path), "refs/heads/master"); - git_buf_joinpath(&moved_log_path, git_buf_cstr(&moved_log_path), "refs/moved"); - - cl_assert_equal_i(true, git_path_isfile(git_buf_cstr(&master_log_path))); - cl_assert_equal_i(false, git_path_isfile(git_buf_cstr(&moved_log_path))); - - cl_git_pass(git_reference_lookup(&master, g_repo, "refs/heads/master")); - cl_git_pass(git_reference_rename(&new_master, master, "refs/moved", 0, NULL)); - git_reference_free(master); - - cl_assert_equal_i(false, git_path_isfile(git_buf_cstr(&master_log_path))); - cl_assert_equal_i(true, git_path_isfile(git_buf_cstr(&moved_log_path))); - - git_reference_free(new_master); - git_buf_free(&moved_log_path); - git_buf_free(&master_log_path); -} - -static void assert_has_reflog(bool expected_result, const char *name) -{ - cl_assert_equal_i(expected_result, git_reference_has_log(g_repo, name)); -} - -void test_refs_reflog_reflog__reference_has_reflog(void) -{ - assert_has_reflog(true, "HEAD"); - assert_has_reflog(true, "refs/heads/master"); - assert_has_reflog(false, "refs/heads/subtrees"); -} - -void test_refs_reflog_reflog__reading_the_reflog_from_a_reference_with_no_log_returns_an_empty_one(void) -{ - git_reflog *reflog; - const char *refname = "refs/heads/subtrees"; - git_buf subtrees_log_path = GIT_BUF_INIT; - - git_buf_join_n(&subtrees_log_path, '/', 3, git_repository_path(g_repo), GIT_REFLOG_DIR, refname); - cl_assert_equal_i(false, git_path_isfile(git_buf_cstr(&subtrees_log_path))); - - cl_git_pass(git_reflog_read(&reflog, g_repo, refname)); - - cl_assert_equal_i(0, (int)git_reflog_entrycount(reflog)); - - git_reflog_free(reflog); - git_buf_free(&subtrees_log_path); -} - -void test_refs_reflog_reflog__cannot_write_a_moved_reflog(void) -{ - git_reference *master, *new_master; - git_buf master_log_path = GIT_BUF_INIT, moved_log_path = GIT_BUF_INIT; - git_reflog *reflog; - - cl_git_pass(git_reference_lookup(&master, g_repo, "refs/heads/master")); - cl_git_pass(git_reflog_read(&reflog, g_repo, "refs/heads/master")); - - cl_git_pass(git_reflog_write(reflog)); - - cl_git_pass(git_reference_rename(&new_master, master, "refs/moved", 0, NULL)); - git_reference_free(master); - - cl_git_fail(git_reflog_write(reflog)); - - git_reflog_free(reflog); - git_reference_free(new_master); - git_buf_free(&moved_log_path); - git_buf_free(&master_log_path); -} - -void test_refs_reflog_reflog__renaming_with_an_invalid_name_returns_EINVALIDSPEC(void) -{ - cl_assert_equal_i(GIT_EINVALIDSPEC, - git_reflog_rename(g_repo, "refs/heads/master", "refs/heads/Inv@{id")); -} - -void test_refs_reflog_reflog__write_only_std_locations(void) -{ - git_reference *ref; - git_oid id; - - git_oid_fromstr(&id, current_master_tip); - - cl_git_pass(git_reference_create(&ref, g_repo, "refs/heads/foo", &id, 1, NULL)); - git_reference_free(ref); - cl_git_pass(git_reference_create(&ref, g_repo, "refs/tags/foo", &id, 1, NULL)); - git_reference_free(ref); - cl_git_pass(git_reference_create(&ref, g_repo, "refs/notes/foo", &id, 1, NULL)); - git_reference_free(ref); - - assert_has_reflog(true, "refs/heads/foo"); - assert_has_reflog(false, "refs/tags/foo"); - assert_has_reflog(true, "refs/notes/foo"); - -} - -void test_refs_reflog_reflog__write_when_explicitly_active(void) -{ - git_reference *ref; - git_oid id; - - git_oid_fromstr(&id, current_master_tip); - git_reference_ensure_log(g_repo, "refs/tags/foo"); - - cl_git_pass(git_reference_create(&ref, g_repo, "refs/tags/foo", &id, 1, NULL)); - git_reference_free(ref); - assert_has_reflog(true, "refs/tags/foo"); -} - -void test_refs_reflog_reflog__append_to_HEAD_when_changing_current_branch(void) -{ - size_t nlogs, nlogs_after; - git_reference *ref; - git_reflog *log; - git_oid id; - - cl_git_pass(git_reflog_read(&log, g_repo, "HEAD")); - nlogs = git_reflog_entrycount(log); - git_reflog_free(log); - - /* Move it back */ - git_oid_fromstr(&id, "be3563ae3f795b2b4353bcce3a527ad0a4f7f644"); - cl_git_pass(git_reference_create(&ref, g_repo, "refs/heads/master", &id, 1, NULL)); - git_reference_free(ref); - - cl_git_pass(git_reflog_read(&log, g_repo, "HEAD")); - nlogs_after = git_reflog_entrycount(log); - git_reflog_free(log); - - cl_assert_equal_i(nlogs_after, nlogs + 1); -} - -void test_refs_reflog_reflog__do_not_append_when_no_update(void) -{ - size_t nlogs, nlogs_after; - git_reference *ref, *ref2; - git_reflog *log; - - cl_git_pass(git_reflog_read(&log, g_repo, "HEAD")); - nlogs = git_reflog_entrycount(log); - git_reflog_free(log); - - cl_git_pass(git_reference_lookup(&ref, g_repo, "refs/heads/master")); - cl_git_pass(git_reference_create(&ref2, g_repo, "refs/heads/master", - git_reference_target(ref), 1, NULL)); - - git_reference_free(ref); - git_reference_free(ref2); - - cl_git_pass(git_reflog_read(&log, g_repo, "HEAD")); - nlogs_after = git_reflog_entrycount(log); - git_reflog_free(log); - - cl_assert_equal_i(nlogs_after, nlogs); -} - -static void assert_no_reflog_update(void) -{ - size_t nlogs, nlogs_after; - size_t nlogs_master, nlogs_master_after; - git_reference *ref; - git_reflog *log; - git_oid id; - - cl_git_pass(git_reflog_read(&log, g_repo, "HEAD")); - nlogs = git_reflog_entrycount(log); - git_reflog_free(log); - - cl_git_pass(git_reflog_read(&log, g_repo, "refs/heads/master")); - nlogs_master = git_reflog_entrycount(log); - git_reflog_free(log); - - /* Move it back */ - git_oid_fromstr(&id, "be3563ae3f795b2b4353bcce3a527ad0a4f7f644"); - cl_git_pass(git_reference_create(&ref, g_repo, "refs/heads/master", &id, 1, NULL)); - git_reference_free(ref); - - cl_git_pass(git_reflog_read(&log, g_repo, "HEAD")); - nlogs_after = git_reflog_entrycount(log); - git_reflog_free(log); - - cl_assert_equal_i(nlogs_after, nlogs); - - cl_git_pass(git_reflog_read(&log, g_repo, "refs/heads/master")); - nlogs_master_after = git_reflog_entrycount(log); - git_reflog_free(log); - - cl_assert_equal_i(nlogs_after, nlogs); - cl_assert_equal_i(nlogs_master_after, nlogs_master); - -} - -void test_refs_reflog_reflog__logallrefupdates_bare_set_false(void) -{ - git_config *config; - - cl_git_pass(git_repository_config(&config, g_repo)); - cl_git_pass(git_config_set_bool(config, "core.logallrefupdates", false)); - git_config_free(config); - - assert_no_reflog_update(); -} - -void test_refs_reflog_reflog__logallrefupdates_bare_unset(void) -{ - git_config *config; - - cl_git_pass(git_repository_config(&config, g_repo)); - cl_git_pass(git_config_delete_entry(config, "core.logallrefupdates")); - git_config_free(config); - - assert_no_reflog_update(); -} - -void test_refs_reflog_reflog__logallrefupdates_nonbare_set_false(void) -{ - git_config *config; - - cl_git_sandbox_cleanup(); - g_repo = cl_git_sandbox_init("testrepo"); - - - cl_git_pass(git_repository_config(&config, g_repo)); - cl_git_pass(git_config_set_bool(config, "core.logallrefupdates", false)); - git_config_free(config); - - assert_no_reflog_update(); -} diff --git a/vendor/libgit2/tests/refs/rename.c b/vendor/libgit2/tests/refs/rename.c deleted file mode 100644 index 6106e6c67c..0000000000 --- a/vendor/libgit2/tests/refs/rename.c +++ /dev/null @@ -1,387 +0,0 @@ -#include "clar_libgit2.h" - -#include "fileops.h" -#include "git2/reflog.h" -#include "reflog.h" -#include "refs.h" -#include "ref_helpers.h" - -static const char *loose_tag_ref_name = "refs/tags/e90810b"; -static const char *packed_head_name = "refs/heads/packed"; -static const char *packed_test_head_name = "refs/heads/packed-test"; -static const char *ref_one_name = "refs/heads/one/branch"; -static const char *ref_one_name_new = "refs/heads/two/branch"; -static const char *ref_two_name = "refs/heads/two"; -static const char *ref_master_name = "refs/heads/master"; -static const char *ref_two_name_new = "refs/heads/two/two"; - -static git_repository *g_repo; - - - -void test_refs_rename__initialize(void) -{ - g_repo = cl_git_sandbox_init("testrepo"); - cl_git_pass(git_repository_set_ident(g_repo, "me", "foo@example.com")); -} - -void test_refs_rename__cleanup(void) -{ - cl_git_sandbox_cleanup(); -} - - - -void test_refs_rename__loose(void) -{ - // rename a loose reference - git_reference *looked_up_ref, *new_ref, *another_looked_up_ref; - git_buf temp_path = GIT_BUF_INIT; - const char *new_name = "refs/tags/Nemo/knows/refs.kung-fu"; - - /* Ensure the ref doesn't exist on the file system */ - cl_git_pass(git_buf_joinpath(&temp_path, git_repository_path(g_repo), new_name)); - cl_assert(!git_path_exists(temp_path.ptr)); - - /* Retrieval of the reference to rename */ - cl_git_pass(git_reference_lookup(&looked_up_ref, g_repo, loose_tag_ref_name)); - - /* ... which is indeed loose */ - cl_assert(reference_is_packed(looked_up_ref) == 0); - - /* Now that the reference is renamed... */ - cl_git_pass(git_reference_rename(&new_ref, looked_up_ref, new_name, 0, NULL)); - cl_assert_equal_s(new_ref->name, new_name); - git_reference_free(looked_up_ref); - - /* ...It can't be looked-up with the old name... */ - cl_git_fail(git_reference_lookup(&another_looked_up_ref, g_repo, loose_tag_ref_name)); - - /* ...but the new name works ok... */ - cl_git_pass(git_reference_lookup(&another_looked_up_ref, g_repo, new_name)); - cl_assert_equal_s(new_ref->name, new_name); - - /* .. the new ref is loose... */ - cl_assert(reference_is_packed(another_looked_up_ref) == 0); - cl_assert(reference_is_packed(new_ref) == 0); - - /* ...and the ref can be found in the file system */ - cl_git_pass(git_buf_joinpath(&temp_path, git_repository_path(g_repo), new_name)); - cl_assert(git_path_exists(temp_path.ptr)); - - git_reference_free(new_ref); - git_reference_free(another_looked_up_ref); - git_buf_free(&temp_path); -} - -void test_refs_rename__packed(void) -{ - // rename a packed reference (should make it loose) - git_reference *looked_up_ref, *new_ref, *another_looked_up_ref; - git_buf temp_path = GIT_BUF_INIT; - const char *brand_new_name = "refs/heads/brand_new_name"; - - /* Ensure the ref doesn't exist on the file system */ - cl_git_pass(git_buf_joinpath(&temp_path, git_repository_path(g_repo), packed_head_name)); - cl_assert(!git_path_exists(temp_path.ptr)); - - /* The reference can however be looked-up... */ - cl_git_pass(git_reference_lookup(&looked_up_ref, g_repo, packed_head_name)); - - /* .. and it's packed */ - cl_assert(reference_is_packed(looked_up_ref) != 0); - - /* Now that the reference is renamed... */ - cl_git_pass(git_reference_rename(&new_ref, looked_up_ref, brand_new_name, 0, NULL)); - cl_assert_equal_s(new_ref->name, brand_new_name); - git_reference_free(looked_up_ref); - - /* ...It can't be looked-up with the old name... */ - cl_git_fail(git_reference_lookup(&another_looked_up_ref, g_repo, packed_head_name)); - - /* ...but the new name works ok... */ - cl_git_pass(git_reference_lookup(&another_looked_up_ref, g_repo, brand_new_name)); - cl_assert_equal_s(another_looked_up_ref->name, brand_new_name); - - /* .. the ref is no longer packed... */ - cl_assert(reference_is_packed(another_looked_up_ref) == 0); - cl_assert(reference_is_packed(new_ref) == 0); - - /* ...and the ref now happily lives in the file system */ - cl_git_pass(git_buf_joinpath(&temp_path, git_repository_path(g_repo), brand_new_name)); - cl_assert(git_path_exists(temp_path.ptr)); - - git_reference_free(new_ref); - git_reference_free(another_looked_up_ref); - git_buf_free(&temp_path); -} - -void test_refs_rename__packed_doesnt_pack_others(void) -{ - // renaming a packed reference does not pack another reference which happens to be in both loose and pack state - git_reference *looked_up_ref, *another_looked_up_ref, *renamed_ref; - git_buf temp_path = GIT_BUF_INIT; - const char *brand_new_name = "refs/heads/brand_new_name"; - - /* Ensure the other reference exists on the file system */ - cl_git_pass(git_buf_joinpath(&temp_path, git_repository_path(g_repo), packed_test_head_name)); - cl_assert(git_path_exists(temp_path.ptr)); - - /* Lookup the other reference */ - cl_git_pass(git_reference_lookup(&another_looked_up_ref, g_repo, packed_test_head_name)); - - /* Ensure it's loose */ - cl_assert(reference_is_packed(another_looked_up_ref) == 0); - git_reference_free(another_looked_up_ref); - - /* Lookup the reference to rename */ - cl_git_pass(git_reference_lookup(&looked_up_ref, g_repo, packed_head_name)); - - /* Ensure it's packed */ - cl_assert(reference_is_packed(looked_up_ref) != 0); - - /* Now that the reference is renamed... */ - cl_git_pass(git_reference_rename(&renamed_ref, looked_up_ref, brand_new_name, 0, NULL)); - git_reference_free(looked_up_ref); - - /* Lookup the other reference */ - cl_git_pass(git_reference_lookup(&another_looked_up_ref, g_repo, packed_test_head_name)); - - /* Ensure it's loose */ - cl_assert(reference_is_packed(another_looked_up_ref) == 0); - - /* Ensure the other ref still exists on the file system */ - cl_assert(git_path_exists(temp_path.ptr)); - - git_reference_free(renamed_ref); - git_reference_free(another_looked_up_ref); - git_buf_free(&temp_path); -} - -void test_refs_rename__name_collision(void) -{ - // can not rename a reference with the name of an existing reference - git_reference *looked_up_ref, *renamed_ref; - - /* An existing reference... */ - cl_git_pass(git_reference_lookup(&looked_up_ref, g_repo, packed_head_name)); - - /* Can not be renamed to the name of another existing reference. */ - cl_git_fail(git_reference_rename(&renamed_ref, looked_up_ref, packed_test_head_name, 0, NULL)); - git_reference_free(looked_up_ref); - - /* Failure to rename it hasn't corrupted its state */ - cl_git_pass(git_reference_lookup(&looked_up_ref, g_repo, packed_head_name)); - cl_assert_equal_s(looked_up_ref->name, packed_head_name); - - git_reference_free(looked_up_ref); -} - -void test_refs_rename__invalid_name(void) -{ - // can not rename a reference with an invalid name - git_reference *looked_up_ref, *renamed_ref; - - /* An existing oid reference... */ - cl_git_pass(git_reference_lookup(&looked_up_ref, g_repo, packed_test_head_name)); - - /* Can not be renamed with an invalid name. */ - cl_assert_equal_i( - GIT_EINVALIDSPEC, - git_reference_rename(&renamed_ref, looked_up_ref, "Hello! I'm a very invalid name.", 0, NULL)); - - /* Can not be renamed outside of the refs hierarchy - * unless it's ALL_CAPS_AND_UNDERSCORES. - */ - cl_assert_equal_i(GIT_EINVALIDSPEC, git_reference_rename(&renamed_ref, looked_up_ref, "i-will-sudo-you", 0, NULL)); - - /* Failure to rename it hasn't corrupted its state */ - git_reference_free(looked_up_ref); - cl_git_pass(git_reference_lookup(&looked_up_ref, g_repo, packed_test_head_name)); - cl_assert_equal_s(looked_up_ref->name, packed_test_head_name); - - git_reference_free(looked_up_ref); -} - -void test_refs_rename__force_loose_packed(void) -{ - // can force-rename a packed reference with the name of an existing loose and packed reference - git_reference *looked_up_ref, *renamed_ref; - git_oid oid; - - /* An existing reference... */ - cl_git_pass(git_reference_lookup(&looked_up_ref, g_repo, packed_head_name)); - git_oid_cpy(&oid, git_reference_target(looked_up_ref)); - - /* Can be force-renamed to the name of another existing reference. */ - cl_git_pass(git_reference_rename(&renamed_ref, looked_up_ref, packed_test_head_name, 1, NULL)); - git_reference_free(looked_up_ref); - git_reference_free(renamed_ref); - - /* Check we actually renamed it */ - cl_git_pass(git_reference_lookup(&looked_up_ref, g_repo, packed_test_head_name)); - cl_assert_equal_s(looked_up_ref->name, packed_test_head_name); - cl_assert_equal_oid(&oid, git_reference_target(looked_up_ref)); - git_reference_free(looked_up_ref); - - /* And that the previous one doesn't exist any longer */ - cl_git_fail(git_reference_lookup(&looked_up_ref, g_repo, packed_head_name)); -} - -void test_refs_rename__force_loose(void) -{ - // can force-rename a loose reference with the name of an existing loose reference - git_reference *looked_up_ref, *renamed_ref; - git_oid oid; - - /* An existing reference... */ - cl_git_pass(git_reference_lookup(&looked_up_ref, g_repo, "refs/heads/br2")); - git_oid_cpy(&oid, git_reference_target(looked_up_ref)); - - /* Can be force-renamed to the name of another existing reference. */ - cl_git_pass(git_reference_rename(&renamed_ref, looked_up_ref, "refs/heads/test", 1, NULL)); - git_reference_free(looked_up_ref); - git_reference_free(renamed_ref); - - /* Check we actually renamed it */ - cl_git_pass(git_reference_lookup(&looked_up_ref, g_repo, "refs/heads/test")); - cl_assert_equal_s(looked_up_ref->name, "refs/heads/test"); - cl_assert_equal_oid(&oid, git_reference_target(looked_up_ref)); - git_reference_free(looked_up_ref); - - /* And that the previous one doesn't exist any longer */ - cl_git_fail(git_reference_lookup(&looked_up_ref, g_repo, "refs/heads/br2")); - - git_reference_free(looked_up_ref); -} - - -void test_refs_rename__overwrite(void) -{ - // can not overwrite name of existing reference - git_reference *ref, *ref_one, *ref_one_new, *ref_two; - git_refdb *refdb; - git_oid id; - - cl_git_pass(git_reference_lookup(&ref, g_repo, ref_master_name)); - cl_assert(git_reference_type(ref) & GIT_REF_OID); - - git_oid_cpy(&id, git_reference_target(ref)); - - /* Create loose references */ - cl_git_pass(git_reference_create(&ref_one, g_repo, ref_one_name, &id, 0, NULL)); - cl_git_pass(git_reference_create(&ref_two, g_repo, ref_two_name, &id, 0, NULL)); - - /* Pack everything */ - cl_git_pass(git_repository_refdb(&refdb, g_repo)); - cl_git_pass(git_refdb_compress(refdb)); - - /* Attempt to create illegal reference */ - cl_git_fail(git_reference_create(&ref_one_new, g_repo, ref_one_name_new, &id, 0, NULL)); - - /* Illegal reference couldn't be created so this is supposed to fail */ - cl_git_fail(git_reference_lookup(&ref_one_new, g_repo, ref_one_name_new)); - - git_reference_free(ref); - git_reference_free(ref_one); - git_reference_free(ref_one_new); - git_reference_free(ref_two); - git_refdb_free(refdb); -} - - -void test_refs_rename__prefix(void) -{ - // can be renamed to a new name prefixed with the old name - git_reference *ref, *ref_two, *looked_up_ref, *renamed_ref; - git_oid id; - - cl_git_pass(git_reference_lookup(&ref, g_repo, ref_master_name)); - cl_assert(git_reference_type(ref) & GIT_REF_OID); - - git_oid_cpy(&id, git_reference_target(ref)); - - /* Create loose references */ - cl_git_pass(git_reference_create(&ref_two, g_repo, ref_two_name, &id, 0, NULL)); - - /* An existing reference... */ - cl_git_pass(git_reference_lookup(&looked_up_ref, g_repo, ref_two_name)); - - /* Can be rename to a new name starting with the old name. */ - cl_git_pass(git_reference_rename(&renamed_ref, looked_up_ref, ref_two_name_new, 0, NULL)); - git_reference_free(looked_up_ref); - git_reference_free(renamed_ref); - - /* Check we actually renamed it */ - cl_git_pass(git_reference_lookup(&looked_up_ref, g_repo, ref_two_name_new)); - cl_assert_equal_s(looked_up_ref->name, ref_two_name_new); - git_reference_free(looked_up_ref); - cl_git_fail(git_reference_lookup(&looked_up_ref, g_repo, ref_two_name)); - - git_reference_free(ref); - git_reference_free(ref_two); - git_reference_free(looked_up_ref); -} - -void test_refs_rename__move_up(void) -{ - // can move a reference to a upper reference hierarchy - git_reference *ref, *ref_two, *looked_up_ref, *renamed_ref; - git_oid id; - - cl_git_pass(git_reference_lookup(&ref, g_repo, ref_master_name)); - cl_assert(git_reference_type(ref) & GIT_REF_OID); - - git_oid_cpy(&id, git_reference_target(ref)); - - /* Create loose references */ - cl_git_pass(git_reference_create(&ref_two, g_repo, ref_two_name_new, &id, 0, NULL)); - git_reference_free(ref_two); - - /* An existing reference... */ - cl_git_pass(git_reference_lookup(&looked_up_ref, g_repo, ref_two_name_new)); - - /* Can be renamed upward the reference tree. */ - cl_git_pass(git_reference_rename(&renamed_ref, looked_up_ref, ref_two_name, 0, NULL)); - git_reference_free(looked_up_ref); - git_reference_free(renamed_ref); - - /* Check we actually renamed it */ - cl_git_pass(git_reference_lookup(&looked_up_ref, g_repo, ref_two_name)); - cl_assert_equal_s(looked_up_ref->name, ref_two_name); - git_reference_free(looked_up_ref); - - cl_git_fail(git_reference_lookup(&looked_up_ref, g_repo, ref_two_name_new)); - git_reference_free(ref); - git_reference_free(looked_up_ref); -} - -void test_refs_rename__propagate_eexists(void) -{ - git_reference *ref, *new_ref; - - cl_git_pass(git_reference_lookup(&ref, g_repo, packed_head_name)); - - cl_assert_equal_i(GIT_EEXISTS, git_reference_rename(&new_ref, ref, packed_test_head_name, 0, NULL)); - - git_reference_free(ref); -} - -void test_refs_rename__writes_to_reflog(void) -{ - git_reference *ref, *new_ref; - git_reflog *log; - const git_reflog_entry *entry; - - cl_git_pass(git_reference_lookup(&ref, g_repo, ref_master_name)); - cl_git_pass(git_reference_rename(&new_ref, ref, ref_one_name_new, false, - "message")); - cl_git_pass(git_reflog_read(&log, g_repo, git_reference_name(new_ref))); - entry = git_reflog_entry_byindex(log, 0); - cl_assert_equal_s("message", git_reflog_entry_message(entry)); - cl_assert_equal_s("foo@example.com", git_reflog_entry_committer(entry)->email); - - git_reflog_free(log); - git_reference_free(ref); - git_reference_free(new_ref); -} diff --git a/vendor/libgit2/tests/refs/revparse.c b/vendor/libgit2/tests/refs/revparse.c deleted file mode 100644 index c22c30440e..0000000000 --- a/vendor/libgit2/tests/refs/revparse.c +++ /dev/null @@ -1,829 +0,0 @@ -#include "clar_libgit2.h" - -#include "git2/revparse.h" -#include "buffer.h" -#include "refs.h" -#include "path.h" - -static git_repository *g_repo; -static git_object *g_obj; - -/* Helpers */ -static void test_object_and_ref_inrepo( - const char *spec, - const char *expected_oid, - const char *expected_refname, - git_repository *repo, - bool assert_reference_retrieval) -{ - char objstr[64] = {0}; - git_object *obj = NULL; - git_reference *ref = NULL; - int error; - - error = git_revparse_ext(&obj, &ref, repo, spec); - - if (expected_oid != NULL) { - cl_git_pass(error); - git_oid_fmt(objstr, git_object_id(obj)); - cl_assert_equal_s(objstr, expected_oid); - } else - cl_git_fail(error); - - if (assert_reference_retrieval) { - if (expected_refname == NULL) - cl_assert(NULL == ref); - else - cl_assert_equal_s(expected_refname, git_reference_name(ref)); - } - - git_object_free(obj); - git_reference_free(ref); -} - -static void test_object_inrepo(const char *spec, const char *expected_oid, git_repository *repo) -{ - test_object_and_ref_inrepo(spec, expected_oid, NULL, repo, false); -} - -static void test_id_inrepo( - const char *spec, - const char *expected_left, - const char *expected_right, - git_revparse_mode_t expected_flags, - git_repository *repo) -{ - git_revspec revspec; - int error = git_revparse(&revspec, repo, spec); - - if (expected_left) { - char str[64] = {0}; - cl_assert_equal_i(0, error); - git_oid_fmt(str, git_object_id(revspec.from)); - cl_assert_equal_s(str, expected_left); - git_object_free(revspec.from); - } else { - cl_assert_equal_i(GIT_ENOTFOUND, error); - } - - if (expected_right) { - char str[64] = {0}; - git_oid_fmt(str, git_object_id(revspec.to)); - cl_assert_equal_s(str, expected_right); - git_object_free(revspec.to); - } - - if (expected_flags) - cl_assert_equal_i(expected_flags, revspec.flags); -} - -static void test_object(const char *spec, const char *expected_oid) -{ - test_object_inrepo(spec, expected_oid, g_repo); -} - -static void test_object_and_ref(const char *spec, const char *expected_oid, const char *expected_refname) -{ - test_object_and_ref_inrepo(spec, expected_oid, expected_refname, g_repo, true); -} - -static void test_rangelike(const char *rangelike, - const char *expected_left, - const char *expected_right, - git_revparse_mode_t expected_revparseflags) -{ - char objstr[64] = {0}; - git_revspec revspec; - int error; - - error = git_revparse(&revspec, g_repo, rangelike); - - if (expected_left != NULL) { - cl_assert_equal_i(0, error); - cl_assert_equal_i(revspec.flags, expected_revparseflags); - git_oid_fmt(objstr, git_object_id(revspec.from)); - cl_assert_equal_s(objstr, expected_left); - git_oid_fmt(objstr, git_object_id(revspec.to)); - cl_assert_equal_s(objstr, expected_right); - } else - cl_assert(error != 0); - - git_object_free(revspec.from); - git_object_free(revspec.to); -} - - -static void test_id( - const char *spec, - const char *expected_left, - const char *expected_right, - git_revparse_mode_t expected_flags) -{ - test_id_inrepo(spec, expected_left, expected_right, expected_flags, g_repo); -} - -void test_refs_revparse__initialize(void) -{ - cl_git_pass(git_repository_open(&g_repo, cl_fixture("testrepo.git"))); -} - -void test_refs_revparse__cleanup(void) -{ - git_repository_free(g_repo); -} - -void test_refs_revparse__nonexistant_object(void) -{ - test_object("this-does-not-exist", NULL); - test_object("this-does-not-exist^1", NULL); - test_object("this-does-not-exist~2", NULL); -} - -static void assert_invalid_single_spec(const char *invalid_spec) -{ - cl_assert_equal_i( - GIT_EINVALIDSPEC, git_revparse_single(&g_obj, g_repo, invalid_spec)); -} - -void test_refs_revparse__invalid_reference_name(void) -{ - assert_invalid_single_spec("this doesn't make sense"); - assert_invalid_single_spec("Inv@{id"); - assert_invalid_single_spec(""); -} - -void test_refs_revparse__shas(void) -{ - test_object("c47800c7266a2be04c571c04d5a6614691ea99bd", "c47800c7266a2be04c571c04d5a6614691ea99bd"); - test_object("c47800c", "c47800c7266a2be04c571c04d5a6614691ea99bd"); -} - -void test_refs_revparse__head(void) -{ - test_object("HEAD", "a65fedf39aefe402d3bb6e24df4d4f5fe4547750"); - test_object("HEAD^0", "a65fedf39aefe402d3bb6e24df4d4f5fe4547750"); - test_object("HEAD~0", "a65fedf39aefe402d3bb6e24df4d4f5fe4547750"); - test_object("master", "a65fedf39aefe402d3bb6e24df4d4f5fe4547750"); -} - -void test_refs_revparse__full_refs(void) -{ - test_object("refs/heads/master", "a65fedf39aefe402d3bb6e24df4d4f5fe4547750"); - test_object("refs/heads/test", "e90810b8df3e80c413d903f631643c716887138d"); - test_object("refs/tags/test", "b25fa35b38051e4ae45d4222e795f9df2e43f1d1"); -} - -void test_refs_revparse__partial_refs(void) -{ - test_object("point_to_blob", "1385f264afb75a56a5bec74243be9b367ba4ca08"); - test_object("packed-test", "4a202b346bb0fb0db7eff3cffeb3c70babbd2045"); - test_object("br2", "a4a7dce85cf63874e984719f4fdd239f5145052f"); -} - -void test_refs_revparse__describe_output(void) -{ - test_object("blah-7-gc47800c", "c47800c7266a2be04c571c04d5a6614691ea99bd"); - test_object("not-good", "a65fedf39aefe402d3bb6e24df4d4f5fe4547750"); -} - -void test_refs_revparse__nth_parent(void) -{ - assert_invalid_single_spec("be3563a^-1"); - assert_invalid_single_spec("^"); - assert_invalid_single_spec("be3563a^{tree}^"); - assert_invalid_single_spec("point_to_blob^{blob}^"); - assert_invalid_single_spec("this doesn't make sense^1"); - - test_object("be3563a^1", "9fd738e8f7967c078dceed8190330fc8648ee56a"); - test_object("be3563a^", "9fd738e8f7967c078dceed8190330fc8648ee56a"); - test_object("be3563a^2", "c47800c7266a2be04c571c04d5a6614691ea99bd"); - test_object("be3563a^1^1", "4a202b346bb0fb0db7eff3cffeb3c70babbd2045"); - test_object("be3563a^^", "4a202b346bb0fb0db7eff3cffeb3c70babbd2045"); - test_object("be3563a^2^1", "5b5b025afb0b4c913b4c338a42934a3863bf3644"); - test_object("be3563a^0", "be3563ae3f795b2b4353bcce3a527ad0a4f7f644"); - test_object("be3563a^{commit}^", "9fd738e8f7967c078dceed8190330fc8648ee56a"); - - test_object("be3563a^42", NULL); -} - -void test_refs_revparse__not_tag(void) -{ - test_object("point_to_blob^{}", "1385f264afb75a56a5bec74243be9b367ba4ca08"); - test_object("wrapped_tag^{}", "a65fedf39aefe402d3bb6e24df4d4f5fe4547750"); - test_object("master^{}", "a65fedf39aefe402d3bb6e24df4d4f5fe4547750"); - test_object("master^{tree}^{}", "944c0f6e4dfa41595e6eb3ceecdb14f50fe18162"); - test_object("e90810b^{}", "e90810b8df3e80c413d903f631643c716887138d"); - test_object("tags/e90810b^{}", "e90810b8df3e80c413d903f631643c716887138d"); - test_object("e908^{}", "e90810b8df3e80c413d903f631643c716887138d"); -} - -void test_refs_revparse__to_type(void) -{ - assert_invalid_single_spec("wrapped_tag^{trip}"); - test_object("point_to_blob^{commit}", NULL); - cl_assert_equal_i( - GIT_EPEEL, git_revparse_single(&g_obj, g_repo, "wrapped_tag^{blob}")); - - test_object("wrapped_tag^{commit}", "a65fedf39aefe402d3bb6e24df4d4f5fe4547750"); - test_object("wrapped_tag^{tree}", "944c0f6e4dfa41595e6eb3ceecdb14f50fe18162"); - test_object("point_to_blob^{blob}", "1385f264afb75a56a5bec74243be9b367ba4ca08"); - test_object("master^{commit}^{commit}", "a65fedf39aefe402d3bb6e24df4d4f5fe4547750"); -} - -void test_refs_revparse__linear_history(void) -{ - assert_invalid_single_spec("~"); - test_object("foo~bar", NULL); - - assert_invalid_single_spec("master~bar"); - assert_invalid_single_spec("master~-1"); - assert_invalid_single_spec("master~0bar"); - assert_invalid_single_spec("this doesn't make sense~2"); - assert_invalid_single_spec("be3563a^{tree}~"); - assert_invalid_single_spec("point_to_blob^{blob}~"); - - test_object("master~0", "a65fedf39aefe402d3bb6e24df4d4f5fe4547750"); - test_object("master~1", "be3563ae3f795b2b4353bcce3a527ad0a4f7f644"); - test_object("master~2", "9fd738e8f7967c078dceed8190330fc8648ee56a"); - test_object("master~1~1", "9fd738e8f7967c078dceed8190330fc8648ee56a"); - test_object("master~~", "9fd738e8f7967c078dceed8190330fc8648ee56a"); -} - -void test_refs_revparse__chaining(void) -{ - assert_invalid_single_spec("master@{0}@{0}"); - assert_invalid_single_spec("@{u}@{-1}"); - assert_invalid_single_spec("@{-1}@{-1}"); - assert_invalid_single_spec("@{-3}@{0}"); - - test_object("master@{0}~1^1", "9fd738e8f7967c078dceed8190330fc8648ee56a"); - test_object("@{u}@{0}", "be3563ae3f795b2b4353bcce3a527ad0a4f7f644"); - test_object("@{-1}@{0}", "a4a7dce85cf63874e984719f4fdd239f5145052f"); - test_object("@{-4}@{1}", "be3563ae3f795b2b4353bcce3a527ad0a4f7f644"); - test_object("master~1^1", "9fd738e8f7967c078dceed8190330fc8648ee56a"); - test_object("master~1^2", "c47800c7266a2be04c571c04d5a6614691ea99bd"); - test_object("master^1^2~1", "5b5b025afb0b4c913b4c338a42934a3863bf3644"); - test_object("master^^2^", "5b5b025afb0b4c913b4c338a42934a3863bf3644"); - test_object("master^1^1^1^1^1", "8496071c1b46c854b31185ea97743be6a8774479"); - test_object("master^^1^2^1", NULL); -} - -void test_refs_revparse__upstream(void) -{ - assert_invalid_single_spec("e90810b@{u}"); - assert_invalid_single_spec("refs/tags/e90810b@{u}"); - test_object("refs/heads/e90810b@{u}", NULL); - - test_object("master@{upstream}", "be3563ae3f795b2b4353bcce3a527ad0a4f7f644"); - test_object("@{u}", "be3563ae3f795b2b4353bcce3a527ad0a4f7f644"); - test_object("master@{u}", "be3563ae3f795b2b4353bcce3a527ad0a4f7f644"); - test_object("heads/master@{u}", "be3563ae3f795b2b4353bcce3a527ad0a4f7f644"); - test_object("refs/heads/master@{u}", "be3563ae3f795b2b4353bcce3a527ad0a4f7f644"); -} - -void test_refs_revparse__ordinal(void) -{ - assert_invalid_single_spec("master@{-2}"); - - /* TODO: make the test below actually fail - * cl_git_fail(git_revparse_single(&g_obj, g_repo, "master@{1a}")); - */ - - test_object("nope@{0}", NULL); - test_object("master@{31415}", NULL); - test_object("@{1000}", NULL); - test_object("@{2}", NULL); - - test_object("@{0}", "a65fedf39aefe402d3bb6e24df4d4f5fe4547750"); - test_object("@{1}", "be3563ae3f795b2b4353bcce3a527ad0a4f7f644"); - - test_object("master@{0}", "a65fedf39aefe402d3bb6e24df4d4f5fe4547750"); - test_object("master@{1}", "be3563ae3f795b2b4353bcce3a527ad0a4f7f644"); - test_object("heads/master@{1}", "be3563ae3f795b2b4353bcce3a527ad0a4f7f644"); - test_object("refs/heads/master@{1}", "be3563ae3f795b2b4353bcce3a527ad0a4f7f644"); -} - -void test_refs_revparse__previous_head(void) -{ - assert_invalid_single_spec("@{-xyz}"); - assert_invalid_single_spec("@{-0}"); - assert_invalid_single_spec("@{-1b}"); - - test_object("@{-42}", NULL); - - test_object("@{-2}", "a65fedf39aefe402d3bb6e24df4d4f5fe4547750"); - test_object("@{-1}", "a4a7dce85cf63874e984719f4fdd239f5145052f"); -} - -static void create_fake_stash_reference_and_reflog(git_repository *repo) -{ - git_reference *master, *new_master; - git_buf log_path = GIT_BUF_INIT; - - git_buf_joinpath(&log_path, git_repository_path(repo), "logs/refs/fakestash"); - - cl_assert_equal_i(false, git_path_isfile(git_buf_cstr(&log_path))); - - cl_git_pass(git_reference_lookup(&master, repo, "refs/heads/master")); - cl_git_pass(git_reference_rename(&new_master, master, "refs/fakestash", 0, NULL)); - git_reference_free(master); - - cl_assert_equal_i(true, git_path_isfile(git_buf_cstr(&log_path))); - - git_buf_free(&log_path); - git_reference_free(new_master); -} - -void test_refs_revparse__reflog_of_a_ref_under_refs(void) -{ - git_repository *repo = cl_git_sandbox_init("testrepo.git"); - - test_object_inrepo("refs/fakestash", NULL, repo); - - create_fake_stash_reference_and_reflog(repo); - - /* - * $ git reflog -1 refs/fakestash - * a65fedf refs/fakestash@{0}: commit: checking in - * - * $ git reflog -1 refs/fakestash@{0} - * a65fedf refs/fakestash@{0}: commit: checking in - * - * $ git reflog -1 fakestash - * a65fedf fakestash@{0}: commit: checking in - * - * $ git reflog -1 fakestash@{0} - * a65fedf fakestash@{0}: commit: checking in - */ - test_object_inrepo("refs/fakestash", "a65fedf39aefe402d3bb6e24df4d4f5fe4547750", repo); - test_object_inrepo("refs/fakestash@{0}", "a65fedf39aefe402d3bb6e24df4d4f5fe4547750", repo); - test_object_inrepo("fakestash", "a65fedf39aefe402d3bb6e24df4d4f5fe4547750", repo); - test_object_inrepo("fakestash@{0}", "a65fedf39aefe402d3bb6e24df4d4f5fe4547750", repo); - - cl_git_sandbox_cleanup(); -} - -void test_refs_revparse__revwalk(void) -{ - test_object("master^{/not found in any commit}", NULL); - test_object("master^{/merge}", NULL); - assert_invalid_single_spec("master^{/((}"); - - test_object("master^{/anoth}", "5b5b025afb0b4c913b4c338a42934a3863bf3644"); - test_object("master^{/Merge}", "be3563ae3f795b2b4353bcce3a527ad0a4f7f644"); - test_object("br2^{/Merge}", "a4a7dce85cf63874e984719f4fdd239f5145052f"); - test_object("master^{/fo.rth}", "9fd738e8f7967c078dceed8190330fc8648ee56a"); -} - -void test_refs_revparse__date(void) -{ - /* - * $ git reflog HEAD --date=iso - * a65fedf HEAD@{2012-04-30 08:23:41 -0900}: checkout: moving from br2 to master - * a4a7dce HEAD@{2012-04-30 08:23:37 -0900}: commit: checking in - * c47800c HEAD@{2012-04-30 08:23:28 -0900}: checkout: moving from master to br2 - * a65fedf HEAD@{2012-04-30 08:23:23 -0900}: commit: - * be3563a HEAD@{2012-04-30 10:22:43 -0700}: clone: from /Users/ben/src/libgit2/tes - * - * $ git reflog HEAD --date=raw - * a65fedf HEAD@{1335806621 -0900}: checkout: moving from br2 to master - * a4a7dce HEAD@{1335806617 -0900}: commit: checking in - * c47800c HEAD@{1335806608 -0900}: checkout: moving from master to br2 - * a65fedf HEAD@{1335806603 -0900}: commit: - * be3563a HEAD@{1335806563 -0700}: clone: from /Users/ben/src/libgit2/tests/resour - */ - test_object("HEAD@{10 years ago}", NULL); - - test_object("HEAD@{1 second}", "a65fedf39aefe402d3bb6e24df4d4f5fe4547750"); - test_object("HEAD@{1 second ago}", "a65fedf39aefe402d3bb6e24df4d4f5fe4547750"); - test_object("HEAD@{2 days ago}", "a65fedf39aefe402d3bb6e24df4d4f5fe4547750"); - - /* - * $ git reflog master --date=iso - * a65fedf master@{2012-04-30 09:23:23 -0800}: commit: checking in - * be3563a master@{2012-04-30 09:22:43 -0800}: clone: from /Users/ben/src... - * - * $ git reflog master --date=raw - * a65fedf master@{1335806603 -0800}: commit: checking in - * be3563a master@{1335806563 -0800}: clone: from /Users/ben/src/libgit2/tests/reso - */ - - - /* - * $ git reflog -1 "master@{2012-04-30 17:22:42 +0000}" - * warning: Log for 'master' only goes back to Mon, 30 Apr 2012 09:22:43 -0800. - */ - test_object("master@{2012-04-30 17:22:42 +0000}", NULL); - test_object("master@{2012-04-30 09:22:42 -0800}", NULL); - - /* - * $ git reflog -1 "master@{2012-04-30 17:22:43 +0000}" - * be3563a master@{Mon Apr 30 09:22:43 2012 -0800}: clone: from /Users/ben/src/libg - */ - test_object("master@{2012-04-30 17:22:43 +0000}", "be3563ae3f795b2b4353bcce3a527ad0a4f7f644"); - test_object("master@{2012-04-30 09:22:43 -0800}", "be3563ae3f795b2b4353bcce3a527ad0a4f7f644"); - - /* - * $ git reflog -1 "master@{2012-4-30 09:23:27 -0800}" - * a65fedf master@{Mon Apr 30 09:23:23 2012 -0800}: commit: checking in - */ - test_object("master@{2012-4-30 09:23:27 -0800}", "a65fedf39aefe402d3bb6e24df4d4f5fe4547750"); - - /* - * $ git reflog -1 master@{2012-05-03} - * a65fedf master@{Mon Apr 30 09:23:23 2012 -0800}: commit: checking in - */ - test_object("master@{2012-05-03}", "a65fedf39aefe402d3bb6e24df4d4f5fe4547750"); - - /* - * $ git reflog -1 "master@{1335806603}" - * a65fedf - * - * $ git reflog -1 "master@{1335806602}" - * be3563a - */ - test_object("master@{1335806603}", "a65fedf39aefe402d3bb6e24df4d4f5fe4547750"); - test_object("master@{1335806602}", "be3563ae3f795b2b4353bcce3a527ad0a4f7f644"); -} - -void test_refs_revparse__colon(void) -{ - assert_invalid_single_spec(":/"); - assert_invalid_single_spec("point_to_blob:readme.txt"); - cl_git_fail(git_revparse_single(&g_obj, g_repo, ":2:README")); /* Not implemented */ - - test_object(":/not found in any commit", NULL); - test_object("subtrees:ab/42.txt", NULL); - test_object("subtrees:ab/4.txt/nope", NULL); - test_object("subtrees:nope", NULL); - test_object("test/master^1:branch_file.txt", NULL); - - /* From tags */ - test_object("test:readme.txt", "0266163a49e280c4f5ed1e08facd36a2bd716bcf"); - test_object("tags/test:readme.txt", "0266163a49e280c4f5ed1e08facd36a2bd716bcf"); - test_object("e90810b:readme.txt", "0266163a49e280c4f5ed1e08facd36a2bd716bcf"); - test_object("tags/e90810b:readme.txt", "0266163a49e280c4f5ed1e08facd36a2bd716bcf"); - - /* From commits */ - test_object("a65f:branch_file.txt", "3697d64be941a53d4ae8f6a271e4e3fa56b022cc"); - - /* From trees */ - test_object("a65f^{tree}:branch_file.txt", "3697d64be941a53d4ae8f6a271e4e3fa56b022cc"); - test_object("944c:branch_file.txt", "3697d64be941a53d4ae8f6a271e4e3fa56b022cc"); - - /* Retrieving trees */ - test_object("master:", "944c0f6e4dfa41595e6eb3ceecdb14f50fe18162"); - test_object("subtrees:", "ae90f12eea699729ed24555e40b9fd669da12a12"); - test_object("subtrees:ab", "f1425cef211cc08caa31e7b545ffb232acb098c3"); - test_object("subtrees:ab/", "f1425cef211cc08caa31e7b545ffb232acb098c3"); - - /* Retrieving blobs */ - test_object("subtrees:ab/4.txt", "d6c93164c249c8000205dd4ec5cbca1b516d487f"); - test_object("subtrees:ab/de/fgh/1.txt", "1f67fc4386b2d171e0d21be1c447e12660561f9b"); - test_object("master:README", "a8233120f6ad708f843d861ce2b7228ec4e3dec6"); - test_object("master:new.txt", "a71586c1dfe8a71c6cbf6c129f404c5642ff31bd"); - test_object(":/Merge", "a4a7dce85cf63874e984719f4fdd239f5145052f"); - test_object(":/one", "c47800c7266a2be04c571c04d5a6614691ea99bd"); - test_object(":/packed commit t", "41bc8c69075bbdb46c5c6f0566cc8cc5b46e8bd9"); - test_object("test/master^2:branch_file.txt", "45b983be36b73c0788dc9cbcb76cbb80fc7bb057"); - test_object("test/master@{1}:branch_file.txt", "3697d64be941a53d4ae8f6a271e4e3fa56b022cc"); -} - -void test_refs_revparse__disambiguation(void) -{ - /* - * $ git show e90810b - * tag e90810b - * Tagger: Vicent Marti - * Date: Thu Aug 12 03:59:17 2010 +0200 - * - * This is a very simple tag. - * - * commit e90810b8df3e80c413d903f631643c716887138d - * Author: Vicent Marti - * Date: Thu Aug 5 18:42:20 2010 +0200 - * - * Test commit 2 - * - * diff --git a/readme.txt b/readme.txt - * index 6336846..0266163 100644 - * --- a/readme.txt - * +++ b/readme.txt - * @@ -1 +1,2 @@ - * Testing a readme.txt - * +Now we add a single line here - * - * $ git show-ref e90810b - * 7b4384978d2493e851f9cca7858815fac9b10980 refs/tags/e90810b - * - */ - test_object("e90810b", "7b4384978d2493e851f9cca7858815fac9b10980"); - - /* - * $ git show e90810 - * commit e90810b8df3e80c413d903f631643c716887138d - * Author: Vicent Marti - * Date: Thu Aug 5 18:42:20 2010 +0200 - * - * Test commit 2 - * - * diff --git a/readme.txt b/readme.txt - * index 6336846..0266163 100644 - * --- a/readme.txt - * +++ b/readme.txt - * @@ -1 +1,2 @@ - * Testing a readme.txt - * +Now we add a single line here - */ - test_object("e90810", "e90810b8df3e80c413d903f631643c716887138d"); -} - -void test_refs_revparse__a_too_short_objectid_returns_EAMBIGUOUS(void) -{ - cl_assert_equal_i( - GIT_EAMBIGUOUS, git_revparse_single(&g_obj, g_repo, "e90")); -} - -/* - * $ echo "aabqhq" | git hash-object -t blob --stdin - * dea509d0b3cb8ee0650f6ca210bc83f4678851ba - * - * $ echo "aaazvc" | git hash-object -t blob --stdin - * dea509d097ce692e167dfc6a48a7a280cc5e877e - */ -void test_refs_revparse__a_not_precise_enough_objectid_returns_EAMBIGUOUS(void) -{ - git_repository *repo; - git_index *index; - git_object *obj; - - repo = cl_git_sandbox_init("testrepo"); - - cl_git_mkfile("testrepo/one.txt", "aabqhq\n"); - cl_git_mkfile("testrepo/two.txt", "aaazvc\n"); - - cl_git_pass(git_repository_index(&index, repo)); - cl_git_pass(git_index_add_bypath(index, "one.txt")); - cl_git_pass(git_index_add_bypath(index, "two.txt")); - - cl_git_fail_with(git_revparse_single(&obj, repo, "dea509d0"), GIT_EAMBIGUOUS); - - cl_git_pass(git_revparse_single(&obj, repo, "dea509d09")); - - git_object_free(obj); - git_index_free(index); - cl_git_sandbox_cleanup(); -} - -void test_refs_revparse__issue_994(void) -{ - git_repository *repo; - git_reference *head, *with_at; - git_object *target; - - repo = cl_git_sandbox_init("testrepo.git"); - - cl_assert_equal_i(GIT_ENOTFOUND, - git_revparse_single(&target, repo, "origin/bim_with_3d@11296")); - - cl_assert_equal_i(GIT_ENOTFOUND, - git_revparse_single(&target, repo, "refs/remotes/origin/bim_with_3d@11296")); - - - cl_git_pass(git_repository_head(&head, repo)); - cl_git_pass(git_reference_create( - &with_at, - repo, - "refs/remotes/origin/bim_with_3d@11296", - git_reference_target(head), - 0, - NULL)); - - cl_git_pass(git_revparse_single(&target, repo, "origin/bim_with_3d@11296")); - git_object_free(target); - - cl_git_pass(git_revparse_single(&target, repo, "refs/remotes/origin/bim_with_3d@11296")); - git_object_free(target); - - git_reference_free(with_at); - git_reference_free(head); - cl_git_sandbox_cleanup(); -} - -/** - * $ git rev-parse blah-7-gc47800c - * c47800c7266a2be04c571c04d5a6614691ea99bd - * - * $ git rev-parse HEAD~3 - * 4a202b346bb0fb0db7eff3cffeb3c70babbd2045 - * - * $ git branch blah-7-gc47800c HEAD~3 - * - * $ git rev-parse blah-7-gc47800c - * 4a202b346bb0fb0db7eff3cffeb3c70babbd2045 - */ -void test_refs_revparse__try_to_retrieve_branch_before_described_tag(void) -{ - git_repository *repo; - git_reference *branch; - git_object *target; - char sha[GIT_OID_HEXSZ + 1]; - - repo = cl_git_sandbox_init("testrepo.git"); - - test_object_inrepo("blah-7-gc47800c", "c47800c7266a2be04c571c04d5a6614691ea99bd", repo); - - cl_git_pass(git_revparse_single(&target, repo, "HEAD~3")); - cl_git_pass(git_branch_create(&branch, repo, "blah-7-gc47800c", (git_commit *)target, 0)); - - git_oid_tostr(sha, GIT_OID_HEXSZ + 1, git_object_id(target)); - - test_object_inrepo("blah-7-gc47800c", sha, repo); - - git_reference_free(branch); - git_object_free(target); - cl_git_sandbox_cleanup(); -} - -/** - * $ git rev-parse a65fedf39aefe402d3bb6e24df4d4f5fe4547750 - * a65fedf39aefe402d3bb6e24df4d4f5fe4547750 - * - * $ git rev-parse HEAD~3 - * 4a202b346bb0fb0db7eff3cffeb3c70babbd2045 - * - * $ git branch a65fedf39aefe402d3bb6e24df4d4f5fe4547750 HEAD~3 - * - * $ git rev-parse a65fedf39aefe402d3bb6e24df4d4f5fe4547750 - * a65fedf39aefe402d3bb6e24df4d4f5fe4547750 - * - * $ git rev-parse heads/a65fedf39aefe402d3bb6e24df4d4f5fe4547750 - * 4a202b346bb0fb0db7eff3cffeb3c70babbd2045 - */ -void test_refs_revparse__try_to_retrieve_sha_before_branch(void) -{ - git_repository *repo; - git_reference *branch; - git_object *target; - char sha[GIT_OID_HEXSZ + 1]; - - repo = cl_git_sandbox_init("testrepo.git"); - - test_object_inrepo("a65fedf39aefe402d3bb6e24df4d4f5fe4547750", "a65fedf39aefe402d3bb6e24df4d4f5fe4547750", repo); - - cl_git_pass(git_revparse_single(&target, repo, "HEAD~3")); - cl_git_pass(git_branch_create(&branch, repo, "a65fedf39aefe402d3bb6e24df4d4f5fe4547750", (git_commit *)target, 0)); - - git_oid_tostr(sha, GIT_OID_HEXSZ + 1, git_object_id(target)); - - test_object_inrepo("a65fedf39aefe402d3bb6e24df4d4f5fe4547750", "a65fedf39aefe402d3bb6e24df4d4f5fe4547750", repo); - test_object_inrepo("heads/a65fedf39aefe402d3bb6e24df4d4f5fe4547750", sha, repo); - - git_reference_free(branch); - git_object_free(target); - cl_git_sandbox_cleanup(); -} - -/** - * $ git rev-parse c47800 - * c47800c7266a2be04c571c04d5a6614691ea99bd - * - * $ git rev-parse HEAD~3 - * 4a202b346bb0fb0db7eff3cffeb3c70babbd2045 - * - * $ git branch c47800 HEAD~3 - * - * $ git rev-parse c47800 - * 4a202b346bb0fb0db7eff3cffeb3c70babbd2045 - */ -void test_refs_revparse__try_to_retrieve_branch_before_abbrev_sha(void) -{ - git_repository *repo; - git_reference *branch; - git_object *target; - char sha[GIT_OID_HEXSZ + 1]; - - repo = cl_git_sandbox_init("testrepo.git"); - - test_object_inrepo("c47800", "c47800c7266a2be04c571c04d5a6614691ea99bd", repo); - - cl_git_pass(git_revparse_single(&target, repo, "HEAD~3")); - cl_git_pass(git_branch_create(&branch, repo, "c47800", (git_commit *)target, 0)); - - git_oid_tostr(sha, GIT_OID_HEXSZ + 1, git_object_id(target)); - - test_object_inrepo("c47800", sha, repo); - - git_reference_free(branch); - git_object_free(target); - cl_git_sandbox_cleanup(); -} - - -void test_refs_revparse__range(void) -{ - assert_invalid_single_spec("be3563a^1..be3563a"); - - test_rangelike("be3563a^1..be3563a", - "9fd738e8f7967c078dceed8190330fc8648ee56a", - "be3563ae3f795b2b4353bcce3a527ad0a4f7f644", - GIT_REVPARSE_RANGE); - - test_rangelike("be3563a^1...be3563a", - "9fd738e8f7967c078dceed8190330fc8648ee56a", - "be3563ae3f795b2b4353bcce3a527ad0a4f7f644", - GIT_REVPARSE_RANGE | GIT_REVPARSE_MERGE_BASE); - - test_rangelike("be3563a^1.be3563a", NULL, NULL, 0); -} - -void test_refs_revparse__parses_range_operator(void) -{ - test_id("HEAD", "a65fedf39aefe402d3bb6e24df4d4f5fe4547750", NULL, GIT_REVPARSE_SINGLE); - test_id("HEAD~3..HEAD", - "4a202b346bb0fb0db7eff3cffeb3c70babbd2045", - "a65fedf39aefe402d3bb6e24df4d4f5fe4547750", - GIT_REVPARSE_RANGE); - - test_id("HEAD~3...HEAD", - "4a202b346bb0fb0db7eff3cffeb3c70babbd2045", - "a65fedf39aefe402d3bb6e24df4d4f5fe4547750", - GIT_REVPARSE_RANGE | GIT_REVPARSE_MERGE_BASE); -} - -void test_refs_revparse__ext_retrieves_both_the_reference_and_its_target(void) -{ - test_object_and_ref( - "master@{upstream}", - "be3563ae3f795b2b4353bcce3a527ad0a4f7f644", - "refs/remotes/test/master"); - - test_object_and_ref( - "@{-1}", - "a4a7dce85cf63874e984719f4fdd239f5145052f", - "refs/heads/br2"); -} - -void test_refs_revparse__ext_can_expand_short_reference_names(void) -{ - test_object_and_ref( - "master", - "a65fedf39aefe402d3bb6e24df4d4f5fe4547750", - "refs/heads/master"); - - test_object_and_ref( - "HEAD", - "a65fedf39aefe402d3bb6e24df4d4f5fe4547750", - "refs/heads/master"); - - test_object_and_ref( - "tags/test", - "b25fa35b38051e4ae45d4222e795f9df2e43f1d1", - "refs/tags/test"); -} - -void test_refs_revparse__ext_returns_NULL_reference_when_expression_points_at_a_revision(void) -{ - test_object_and_ref( - "HEAD~3", - "4a202b346bb0fb0db7eff3cffeb3c70babbd2045", - NULL); - - test_object_and_ref( - "HEAD~0", - "a65fedf39aefe402d3bb6e24df4d4f5fe4547750", - NULL); - - test_object_and_ref( - "HEAD^0", - "a65fedf39aefe402d3bb6e24df4d4f5fe4547750", - NULL); - - test_object_and_ref( - "@{-1}@{0}", - "a4a7dce85cf63874e984719f4fdd239f5145052f", - NULL); -} - -void test_refs_revparse__ext_returns_NULL_reference_when_expression_points_at_a_tree_content(void) -{ - test_object_and_ref( - "tags/test:readme.txt", - "0266163a49e280c4f5ed1e08facd36a2bd716bcf", - NULL); -} - -void test_refs_revparse__uneven_sizes(void) -{ - test_object("a65fedf39aefe402d3bb6e24df4d4f5fe454775", - "a65fedf39aefe402d3bb6e24df4d4f5fe4547750"); - - test_object("a65fedf39aefe402d3bb6e24df4d4f5fe45477", - "a65fedf39aefe402d3bb6e24df4d4f5fe4547750"); - - test_object("a65fedf39aefe402d3bb6e24df4d4f5fe4547", - "a65fedf39aefe402d3bb6e24df4d4f5fe4547750"); - - test_object("a65fedf39aefe402d3bb6e24df4d", - "a65fedf39aefe402d3bb6e24df4d4f5fe4547750"); -} diff --git a/vendor/libgit2/tests/refs/settargetwithlog.c b/vendor/libgit2/tests/refs/settargetwithlog.c deleted file mode 100644 index 58fbb5feed..0000000000 --- a/vendor/libgit2/tests/refs/settargetwithlog.c +++ /dev/null @@ -1,51 +0,0 @@ -#include "clar_libgit2.h" - -#include "repository.h" -#include "git2/reflog.h" -#include "reflog.h" -#include "ref_helpers.h" - -static const char *br2_tip = "a4a7dce85cf63874e984719f4fdd239f5145052f"; -static const char *master_tip = "a65fedf39aefe402d3bb6e24df4d4f5fe4547750"; -static const char *br2_name = "refs/heads/br2"; - -static git_repository *g_repo; - -void test_refs_settargetwithlog__initialize(void) -{ - g_repo = cl_git_sandbox_init("testrepo.git"); -} - -void test_refs_settargetwithlog__cleanup(void) -{ - cl_git_sandbox_cleanup(); -} - -void test_refs_settargetwithlog__updating_a_direct_reference_adds_a_reflog_entry(void) -{ - git_reference *reference, *reference_out; - git_oid current_id, target_id; - git_reflog *reflog; - const git_reflog_entry *entry; - - const char *message = "You've been logged, mate!"; - - git_oid_fromstr(¤t_id, br2_tip); - git_oid_fromstr(&target_id, master_tip); - - cl_git_pass(git_reference_lookup(&reference, g_repo, br2_name)); - - cl_git_pass(git_reference_set_target( - &reference_out, reference, &target_id, message)); - - cl_git_pass(git_reflog_read(&reflog, g_repo, br2_name)); - - entry = git_reflog_entry_byindex(reflog, 0); - cl_assert_equal_oid(¤t_id, &entry->oid_old); - cl_assert_equal_oid(&target_id, &entry->oid_cur); - cl_assert_equal_s(message, entry->msg); - - git_reflog_free(reflog); - git_reference_free(reference_out); - git_reference_free(reference); -} diff --git a/vendor/libgit2/tests/refs/setter.c b/vendor/libgit2/tests/refs/setter.c deleted file mode 100644 index 2b42ff253e..0000000000 --- a/vendor/libgit2/tests/refs/setter.c +++ /dev/null @@ -1,99 +0,0 @@ -#include "clar_libgit2.h" - -#include "repository.h" -#include "git2/reflog.h" -#include "reflog.h" -#include "git2/refs.h" - -static const char *ref_name = "refs/heads/other"; -static const char *ref_master_name = "refs/heads/master"; -static const char *ref_test_name = "refs/heads/test"; - -static git_repository *g_repo; - -void test_refs_setter__initialize(void) -{ - g_repo = cl_git_sandbox_init("testrepo"); -} - -void test_refs_setter__cleanup(void) -{ - cl_git_sandbox_cleanup(); -} - -void test_refs_setter__update_direct(void) -{ - git_reference *ref, *test_ref, *new_ref; - git_oid id; - - cl_git_pass(git_reference_lookup(&ref, g_repo, ref_master_name)); - cl_assert(git_reference_type(ref) == GIT_REF_OID); - git_oid_cpy(&id, git_reference_target(ref)); - git_reference_free(ref); - - cl_git_pass(git_reference_lookup(&test_ref, g_repo, ref_test_name)); - cl_assert(git_reference_type(test_ref) == GIT_REF_OID); - - cl_git_pass(git_reference_set_target(&new_ref, test_ref, &id, NULL)); - - git_reference_free(test_ref); - git_reference_free(new_ref); - - cl_git_pass(git_reference_lookup(&test_ref, g_repo, ref_test_name)); - cl_assert(git_reference_type(test_ref) == GIT_REF_OID); - cl_assert_equal_oid(&id, git_reference_target(test_ref)); - git_reference_free(test_ref); -} - -void test_refs_setter__update_symbolic(void) -{ - git_reference *head, *new_head; - - cl_git_pass(git_reference_lookup(&head, g_repo, "HEAD")); - cl_assert(git_reference_type(head) == GIT_REF_SYMBOLIC); - cl_assert(strcmp(git_reference_symbolic_target(head), ref_master_name) == 0); - - cl_git_pass(git_reference_symbolic_set_target(&new_head, head, ref_test_name, NULL)); - git_reference_free(new_head); - git_reference_free(head); - - cl_git_pass(git_reference_lookup(&head, g_repo, "HEAD")); - cl_assert(git_reference_type(head) == GIT_REF_SYMBOLIC); - cl_assert(strcmp(git_reference_symbolic_target(head), ref_test_name) == 0); - git_reference_free(head); -} - -void test_refs_setter__cant_update_direct_with_symbolic(void) -{ - // Overwrite an existing object id reference with a symbolic one - git_reference *ref, *new; - git_oid id; - - cl_git_pass(git_reference_lookup(&ref, g_repo, ref_master_name)); - cl_assert(git_reference_type(ref) == GIT_REF_OID); - git_oid_cpy(&id, git_reference_target(ref)); - - cl_git_fail(git_reference_symbolic_set_target(&new, ref, ref_name, NULL)); - - git_reference_free(ref); -} - -void test_refs_setter__cant_update_symbolic_with_direct(void) -{ - // Overwrite an existing symbolic reference with an object id one - git_reference *ref, *new; - git_oid id; - - cl_git_pass(git_reference_lookup(&ref, g_repo, ref_master_name)); - cl_assert(git_reference_type(ref) == GIT_REF_OID); - git_oid_cpy(&id, git_reference_target(ref)); - git_reference_free(ref); - - /* Create the symbolic ref */ - cl_git_pass(git_reference_symbolic_create(&ref, g_repo, ref_name, ref_master_name, 0, NULL)); - - /* Can't set an OID on a direct ref */ - cl_git_fail(git_reference_set_target(&new, ref, &id, NULL)); - - git_reference_free(ref); -} diff --git a/vendor/libgit2/tests/refs/shorthand.c b/vendor/libgit2/tests/refs/shorthand.c deleted file mode 100644 index f995d26cac..0000000000 --- a/vendor/libgit2/tests/refs/shorthand.c +++ /dev/null @@ -1,27 +0,0 @@ -#include "clar_libgit2.h" - -#include "repository.h" - -void assert_shorthand(git_repository *repo, const char *refname, const char *shorthand) -{ - git_reference *ref; - - cl_git_pass(git_reference_lookup(&ref, repo, refname)); - cl_assert_equal_s(git_reference_shorthand(ref), shorthand); - git_reference_free(ref); -} - -void test_refs_shorthand__0(void) -{ - git_repository *repo; - - cl_git_pass(git_repository_open(&repo, cl_fixture("testrepo.git"))); - - - assert_shorthand(repo, "refs/heads/master", "master"); - assert_shorthand(repo, "refs/tags/test", "test"); - assert_shorthand(repo, "refs/remotes/test/master", "test/master"); - assert_shorthand(repo, "refs/notes/fanout", "notes/fanout"); - - git_repository_free(repo); -} diff --git a/vendor/libgit2/tests/refs/transactions.c b/vendor/libgit2/tests/refs/transactions.c deleted file mode 100644 index 39ea1cae52..0000000000 --- a/vendor/libgit2/tests/refs/transactions.c +++ /dev/null @@ -1,110 +0,0 @@ -#include "clar_libgit2.h" -#include "git2/transaction.h" - -static git_repository *g_repo; -static git_transaction *g_tx; - -void test_refs_transactions__initialize(void) -{ - g_repo = cl_git_sandbox_init("testrepo"); - cl_git_pass(git_transaction_new(&g_tx, g_repo)); -} - -void test_refs_transactions__cleanup(void) -{ - git_transaction_free(g_tx); - cl_git_sandbox_cleanup(); -} - -void test_refs_transactions__single_ref_oid(void) -{ - git_reference *ref; - git_oid id; - - git_oid_fromstr(&id, "a65fedf39aefe402d3bb6e24df4d4f5fe4547750"); - - cl_git_pass(git_transaction_lock_ref(g_tx, "refs/heads/master")); - cl_git_pass(git_transaction_set_target(g_tx, "refs/heads/master", &id, NULL, NULL)); - cl_git_pass(git_transaction_commit(g_tx)); - - cl_git_pass(git_reference_lookup(&ref, g_repo, "refs/heads/master")); - - cl_assert(!git_oid_cmp(&id, git_reference_target(ref))); - git_reference_free(ref); -} - -void test_refs_transactions__single_ref_symbolic(void) -{ - git_reference *ref; - - cl_git_pass(git_transaction_lock_ref(g_tx, "HEAD")); - cl_git_pass(git_transaction_set_symbolic_target(g_tx, "HEAD", "refs/heads/foo", NULL, NULL)); - cl_git_pass(git_transaction_commit(g_tx)); - - cl_git_pass(git_reference_lookup(&ref, g_repo, "HEAD")); - - cl_assert_equal_s("refs/heads/foo", git_reference_symbolic_target(ref)); - git_reference_free(ref); -} - -void test_refs_transactions__single_ref_mix_types(void) -{ - git_reference *ref; - git_oid id; - - git_oid_fromstr(&id, "a65fedf39aefe402d3bb6e24df4d4f5fe4547750"); - - cl_git_pass(git_transaction_lock_ref(g_tx, "refs/heads/master")); - cl_git_pass(git_transaction_lock_ref(g_tx, "HEAD")); - cl_git_pass(git_transaction_set_symbolic_target(g_tx, "refs/heads/master", "refs/heads/foo", NULL, NULL)); - cl_git_pass(git_transaction_set_target(g_tx, "HEAD", &id, NULL, NULL)); - cl_git_pass(git_transaction_commit(g_tx)); - - cl_git_pass(git_reference_lookup(&ref, g_repo, "refs/heads/master")); - cl_assert_equal_s("refs/heads/foo", git_reference_symbolic_target(ref)); - git_reference_free(ref); - - cl_git_pass(git_reference_lookup(&ref, g_repo, "HEAD")); - cl_assert(!git_oid_cmp(&id, git_reference_target(ref))); - git_reference_free(ref); -} - -void test_refs_transactions__single_ref_delete(void) -{ - git_reference *ref; - - cl_git_pass(git_transaction_lock_ref(g_tx, "refs/heads/master")); - cl_git_pass(git_transaction_remove(g_tx, "refs/heads/master")); - cl_git_pass(git_transaction_commit(g_tx)); - - cl_git_fail_with(GIT_ENOTFOUND, git_reference_lookup(&ref, g_repo, "refs/heads/master")); -} - -void test_refs_transactions__single_create(void) -{ - git_reference *ref; - const char *name = "refs/heads/new-branch"; - git_oid id; - - cl_git_fail_with(GIT_ENOTFOUND, git_reference_lookup(&ref, g_repo, name)); - - cl_git_pass(git_transaction_lock_ref(g_tx, name)); - - git_oid_fromstr(&id, "a65fedf39aefe402d3bb6e24df4d4f5fe4547750"); - cl_git_pass(git_transaction_set_target(g_tx, name, &id, NULL, NULL)); - cl_git_pass(git_transaction_commit(g_tx)); - - cl_git_pass(git_reference_lookup(&ref, g_repo, name)); - cl_assert(!git_oid_cmp(&id, git_reference_target(ref))); - git_reference_free(ref); -} - -void test_refs_transactions__unlocked_set(void) -{ - git_oid id; - - cl_git_pass(git_transaction_lock_ref(g_tx, "refs/heads/master")); - git_oid_fromstr(&id, "a65fedf39aefe402d3bb6e24df4d4f5fe4547750"); - cl_git_fail_with(GIT_ENOTFOUND, git_transaction_set_target(g_tx, "refs/heads/foo", &id, NULL, NULL)); - cl_git_pass(git_transaction_commit(g_tx)); -} diff --git a/vendor/libgit2/tests/refs/unicode.c b/vendor/libgit2/tests/refs/unicode.c deleted file mode 100644 index a279d5006b..0000000000 --- a/vendor/libgit2/tests/refs/unicode.c +++ /dev/null @@ -1,54 +0,0 @@ -#include "clar_libgit2.h" - -static git_repository *repo; - -void test_refs_unicode__initialize(void) -{ - repo = cl_git_sandbox_init("testrepo.git"); -} - -void test_refs_unicode__cleanup(void) -{ - cl_git_sandbox_cleanup(); - repo = NULL; -} - -void test_refs_unicode__create_and_lookup(void) -{ - git_reference *ref0, *ref1, *ref2; - git_repository *repo2; - - const char *REFNAME = "refs/heads/" "\303\205" "ngstr" "\303\266" "m"; - const char *master = "refs/heads/master"; - - /* Create the reference */ - cl_git_pass(git_reference_lookup(&ref0, repo, master)); - cl_git_pass(git_reference_create( - &ref1, repo, REFNAME, git_reference_target(ref0), 0, NULL)); - cl_assert_equal_s(REFNAME, git_reference_name(ref1)); - git_reference_free(ref0); - - /* Lookup the reference in a different instance of the repository */ - cl_git_pass(git_repository_open(&repo2, "testrepo.git")); - - cl_git_pass(git_reference_lookup(&ref2, repo2, REFNAME)); - cl_assert_equal_oid(git_reference_target(ref1), git_reference_target(ref2)); - cl_assert_equal_s(REFNAME, git_reference_name(ref2)); - git_reference_free(ref2); - -#if GIT_USE_ICONV - /* Lookup reference by decomposed unicode name */ - -#define REFNAME_DECOMPOSED "refs/heads/" "A" "\314\212" "ngstro" "\314\210" "m" - - cl_git_pass(git_reference_lookup(&ref2, repo2, REFNAME_DECOMPOSED)); - cl_assert_equal_oid(git_reference_target(ref1), git_reference_target(ref2)); - cl_assert_equal_s(REFNAME, git_reference_name(ref2)); - git_reference_free(ref2); -#endif - - /* Cleanup */ - - git_reference_free(ref1); - git_repository_free(repo2); -} diff --git a/vendor/libgit2/tests/refs/update.c b/vendor/libgit2/tests/refs/update.c deleted file mode 100644 index 403ea75b84..0000000000 --- a/vendor/libgit2/tests/refs/update.c +++ /dev/null @@ -1,26 +0,0 @@ -#include "clar_libgit2.h" - -#include "refs.h" - -static git_repository *g_repo; - -void test_refs_update__initialize(void) -{ - g_repo = cl_git_sandbox_init("testrepo.git"); -} - -void test_refs_update__cleanup(void) -{ - cl_git_sandbox_cleanup(); -} - -void test_refs_update__updating_the_target_of_a_symref_with_an_invalid_name_returns_EINVALIDSPEC(void) -{ - git_reference *head; - - cl_git_pass(git_reference_lookup(&head, g_repo, GIT_HEAD_FILE)); - cl_assert_equal_i(GIT_REF_SYMBOLIC, git_reference_type(head)); - git_reference_free(head); - - cl_assert_equal_i(GIT_EINVALIDSPEC, git_reference_symbolic_create(&head, g_repo, GIT_HEAD_FILE, "refs/heads/inv@{id", 1, NULL)); -} diff --git a/vendor/libgit2/tests/remote/insteadof.c b/vendor/libgit2/tests/remote/insteadof.c deleted file mode 100644 index 05d4757cf0..0000000000 --- a/vendor/libgit2/tests/remote/insteadof.c +++ /dev/null @@ -1,72 +0,0 @@ -#include "clar_libgit2.h" -#include "remote.h" -#include "repository.h" - -#define REPO_PATH "testrepo2/.gitted" -#define REMOTE_ORIGIN "origin" -#define REMOTE_INSTEADOF "insteadof-test" - -static git_repository *g_repo; -static git_remote *g_remote; - -void test_remote_insteadof__initialize(void) -{ - g_repo = NULL; - g_remote = NULL; -} - -void test_remote_insteadof__cleanup(void) -{ - git_repository_free(g_repo); - git_remote_free(g_remote); -} - -void test_remote_insteadof__url_insteadof_not_applicable(void) -{ - cl_git_pass(git_repository_open(&g_repo, cl_fixture(REPO_PATH))); - cl_git_pass(git_remote_lookup(&g_remote, g_repo, REMOTE_ORIGIN)); - - cl_assert_equal_s( - git_remote_url(g_remote), - "https://github.com/libgit2/false.git"); -} - -void test_remote_insteadof__url_insteadof_applicable(void) -{ - cl_git_pass(git_repository_open(&g_repo, cl_fixture(REPO_PATH))); - cl_git_pass(git_remote_lookup(&g_remote, g_repo, REMOTE_INSTEADOF)); - - cl_assert_equal_s( - git_remote_url(g_remote), - "http://github.com/libgit2/libgit2"); -} - -void test_remote_insteadof__pushurl_insteadof_not_applicable(void) -{ - cl_git_pass(git_repository_open(&g_repo, cl_fixture(REPO_PATH))); - cl_git_pass(git_remote_lookup(&g_remote, g_repo, REMOTE_ORIGIN)); - - cl_assert_equal_p(git_remote_pushurl(g_remote), NULL); -} - -void test_remote_insteadof__pushurl_insteadof_applicable(void) -{ - cl_git_pass(git_repository_open(&g_repo, cl_fixture(REPO_PATH))); - cl_git_pass(git_remote_lookup(&g_remote, g_repo, REMOTE_INSTEADOF)); - - cl_assert_equal_s( - git_remote_pushurl(g_remote), - "git@github.com:libgit2/libgit2"); -} - -void test_remote_insteadof__anonymous_remote(void) -{ - cl_git_pass(git_repository_open(&g_repo, cl_fixture(REPO_PATH))); - cl_git_pass(git_remote_create_anonymous(&g_remote, g_repo, - "http://example.com/libgit2/libgit2")); - - cl_assert_equal_s( - git_remote_url(g_remote), - "http://github.com/libgit2/libgit2"); - cl_assert_equal_p(git_remote_pushurl(g_remote), NULL); -} diff --git a/vendor/libgit2/tests/repo/config.c b/vendor/libgit2/tests/repo/config.c deleted file mode 100644 index 93dedd5760..0000000000 --- a/vendor/libgit2/tests/repo/config.c +++ /dev/null @@ -1,211 +0,0 @@ -#include "clar_libgit2.h" -#include "sysdir.h" -#include "fileops.h" -#include - -static git_buf path = GIT_BUF_INIT; - -void test_repo_config__initialize(void) -{ - cl_fixture_sandbox("empty_standard_repo"); - cl_git_pass(cl_rename( - "empty_standard_repo/.gitted", "empty_standard_repo/.git")); - - git_buf_clear(&path); - - cl_must_pass(p_mkdir("alternate", 0777)); - cl_git_pass(git_path_prettify(&path, "alternate", NULL)); -} - -void test_repo_config__cleanup(void) -{ - cl_sandbox_set_search_path_defaults(); - - git_buf_free(&path); - - cl_git_pass( - git_futils_rmdir_r("alternate", NULL, GIT_RMDIR_REMOVE_FILES)); - cl_assert(!git_path_isdir("alternate")); - - cl_fixture_cleanup("empty_standard_repo"); - -} - -void test_repo_config__can_open_global_when_there_is_no_file(void) -{ - git_repository *repo; - git_config *config, *global; - - cl_git_pass(git_libgit2_opts( - GIT_OPT_SET_SEARCH_PATH, GIT_CONFIG_LEVEL_GLOBAL, path.ptr)); - cl_git_pass(git_libgit2_opts( - GIT_OPT_SET_SEARCH_PATH, GIT_CONFIG_LEVEL_SYSTEM, path.ptr)); - cl_git_pass(git_libgit2_opts( - GIT_OPT_SET_SEARCH_PATH, GIT_CONFIG_LEVEL_XDG, path.ptr)); - - cl_git_pass(git_repository_open(&repo, "empty_standard_repo")); - cl_git_pass(git_repository_config(&config, repo)); - cl_git_pass(git_config_open_level( - &global, config, GIT_CONFIG_LEVEL_GLOBAL)); - - cl_git_pass(git_config_set_string(global, "test.set", "42")); - - git_config_free(global); - git_config_free(config); - git_repository_free(repo); -} - -void test_repo_config__can_open_missing_global_with_separators(void) -{ - git_repository *repo; - git_config *config, *global; - - cl_git_pass(git_buf_printf( - &path, "%c%s", GIT_PATH_LIST_SEPARATOR, "dummy")); - - cl_git_pass(git_libgit2_opts( - GIT_OPT_SET_SEARCH_PATH, GIT_CONFIG_LEVEL_GLOBAL, path.ptr)); - cl_git_pass(git_libgit2_opts( - GIT_OPT_SET_SEARCH_PATH, GIT_CONFIG_LEVEL_SYSTEM, path.ptr)); - cl_git_pass(git_libgit2_opts( - GIT_OPT_SET_SEARCH_PATH, GIT_CONFIG_LEVEL_XDG, path.ptr)); - - git_buf_free(&path); - - cl_git_pass(git_repository_open(&repo, "empty_standard_repo")); - cl_git_pass(git_repository_config(&config, repo)); - cl_git_pass(git_config_open_level( - &global, config, GIT_CONFIG_LEVEL_GLOBAL)); - - cl_git_pass(git_config_set_string(global, "test.set", "42")); - - git_config_free(global); - git_config_free(config); - git_repository_free(repo); -} - -#include "repository.h" - -void test_repo_config__read_with_no_configs_at_all(void) -{ - git_repository *repo; - int val; - - cl_git_pass(git_libgit2_opts( - GIT_OPT_SET_SEARCH_PATH, GIT_CONFIG_LEVEL_GLOBAL, path.ptr)); - cl_git_pass(git_libgit2_opts( - GIT_OPT_SET_SEARCH_PATH, GIT_CONFIG_LEVEL_SYSTEM, path.ptr)); - cl_git_pass(git_libgit2_opts( - GIT_OPT_SET_SEARCH_PATH, GIT_CONFIG_LEVEL_XDG, path.ptr)); - - /* with none */ - - cl_must_pass(p_unlink("empty_standard_repo/.git/config")); - cl_assert(!git_path_isfile("empty_standard_repo/.git/config")); - - cl_git_pass(git_repository_open(&repo, "empty_standard_repo")); - git_repository__cvar_cache_clear(repo); - val = -1; - cl_git_pass(git_repository__cvar(&val, repo, GIT_CVAR_ABBREV)); - cl_assert_equal_i(GIT_ABBREV_DEFAULT, val); - git_repository_free(repo); - - /* with no local config, just system */ - - cl_sandbox_set_search_path_defaults(); - - cl_must_pass(p_mkdir("alternate/1", 0777)); - cl_git_pass(git_buf_joinpath(&path, path.ptr, "1")); - cl_git_rewritefile("alternate/1/gitconfig", "[core]\n\tabbrev = 10\n"); - cl_git_pass(git_libgit2_opts( - GIT_OPT_SET_SEARCH_PATH, GIT_CONFIG_LEVEL_SYSTEM, path.ptr)); - - cl_git_pass(git_repository_open(&repo, "empty_standard_repo")); - git_repository__cvar_cache_clear(repo); - val = -1; - cl_git_pass(git_repository__cvar(&val, repo, GIT_CVAR_ABBREV)); - cl_assert_equal_i(10, val); - git_repository_free(repo); - - /* with just xdg + system */ - - cl_must_pass(p_mkdir("alternate/2", 0777)); - path.ptr[path.size - 1] = '2'; - cl_git_rewritefile("alternate/2/config", "[core]\n\tabbrev = 20\n"); - cl_git_pass(git_libgit2_opts( - GIT_OPT_SET_SEARCH_PATH, GIT_CONFIG_LEVEL_XDG, path.ptr)); - - cl_git_pass(git_repository_open(&repo, "empty_standard_repo")); - git_repository__cvar_cache_clear(repo); - val = -1; - cl_git_pass(git_repository__cvar(&val, repo, GIT_CVAR_ABBREV)); - cl_assert_equal_i(20, val); - git_repository_free(repo); - - /* with global + xdg + system */ - - cl_must_pass(p_mkdir("alternate/3", 0777)); - path.ptr[path.size - 1] = '3'; - cl_git_rewritefile("alternate/3/.gitconfig", "[core]\n\tabbrev = 30\n"); - cl_git_pass(git_libgit2_opts( - GIT_OPT_SET_SEARCH_PATH, GIT_CONFIG_LEVEL_GLOBAL, path.ptr)); - - cl_git_pass(git_repository_open(&repo, "empty_standard_repo")); - git_repository__cvar_cache_clear(repo); - val = -1; - cl_git_pass(git_repository__cvar(&val, repo, GIT_CVAR_ABBREV)); - cl_assert_equal_i(30, val); - git_repository_free(repo); - - /* with all configs */ - - cl_git_rewritefile("empty_standard_repo/.git/config", "[core]\n\tabbrev = 40\n"); - - cl_git_pass(git_repository_open(&repo, "empty_standard_repo")); - git_repository__cvar_cache_clear(repo); - val = -1; - cl_git_pass(git_repository__cvar(&val, repo, GIT_CVAR_ABBREV)); - cl_assert_equal_i(40, val); - git_repository_free(repo); - - /* with all configs but delete the files ? */ - - cl_git_pass(git_repository_open(&repo, "empty_standard_repo")); - git_repository__cvar_cache_clear(repo); - val = -1; - cl_git_pass(git_repository__cvar(&val, repo, GIT_CVAR_ABBREV)); - cl_assert_equal_i(40, val); - - cl_must_pass(p_unlink("empty_standard_repo/.git/config")); - cl_assert(!git_path_isfile("empty_standard_repo/.git/config")); - - cl_must_pass(p_unlink("alternate/1/gitconfig")); - cl_assert(!git_path_isfile("alternate/1/gitconfig")); - - cl_must_pass(p_unlink("alternate/2/config")); - cl_assert(!git_path_isfile("alternate/2/config")); - - cl_must_pass(p_unlink("alternate/3/.gitconfig")); - cl_assert(!git_path_isfile("alternate/3/.gitconfig")); - - git_repository__cvar_cache_clear(repo); - val = -1; - cl_git_pass(git_repository__cvar(&val, repo, GIT_CVAR_ABBREV)); - cl_assert_equal_i(40, val); - git_repository_free(repo); - - /* reopen */ - - cl_assert(!git_path_isfile("empty_standard_repo/.git/config")); - cl_assert(!git_path_isfile("alternate/3/.gitconfig")); - - cl_git_pass(git_repository_open(&repo, "empty_standard_repo")); - git_repository__cvar_cache_clear(repo); - val = -1; - cl_git_pass(git_repository__cvar(&val, repo, GIT_CVAR_ABBREV)); - cl_assert_equal_i(7, val); - git_repository_free(repo); - - cl_assert(!git_path_exists("empty_standard_repo/.git/config")); - cl_assert(!git_path_exists("alternate/3/.gitconfig")); -} diff --git a/vendor/libgit2/tests/repo/discover.c b/vendor/libgit2/tests/repo/discover.c deleted file mode 100644 index 7904b6496b..0000000000 --- a/vendor/libgit2/tests/repo/discover.c +++ /dev/null @@ -1,143 +0,0 @@ -#include "clar_libgit2.h" - -#include "odb.h" -#include "fileops.h" -#include "repository.h" - -#define TEMP_REPO_FOLDER "temprepo/" -#define DISCOVER_FOLDER TEMP_REPO_FOLDER "discover.git" - -#define SUB_REPOSITORY_FOLDER_NAME "sub_repo" -#define SUB_REPOSITORY_FOLDER DISCOVER_FOLDER "/" SUB_REPOSITORY_FOLDER_NAME -#define SUB_REPOSITORY_FOLDER_SUB SUB_REPOSITORY_FOLDER "/sub" -#define SUB_REPOSITORY_FOLDER_SUB_SUB SUB_REPOSITORY_FOLDER_SUB "/subsub" -#define SUB_REPOSITORY_FOLDER_SUB_SUB_SUB SUB_REPOSITORY_FOLDER_SUB_SUB "/subsubsub" - -#define REPOSITORY_ALTERNATE_FOLDER DISCOVER_FOLDER "/alternate_sub_repo" -#define REPOSITORY_ALTERNATE_FOLDER_SUB REPOSITORY_ALTERNATE_FOLDER "/sub" -#define REPOSITORY_ALTERNATE_FOLDER_SUB_SUB REPOSITORY_ALTERNATE_FOLDER_SUB "/subsub" -#define REPOSITORY_ALTERNATE_FOLDER_SUB_SUB_SUB REPOSITORY_ALTERNATE_FOLDER_SUB_SUB "/subsubsub" - -#define ALTERNATE_MALFORMED_FOLDER1 DISCOVER_FOLDER "/alternate_malformed_repo1" -#define ALTERNATE_MALFORMED_FOLDER2 DISCOVER_FOLDER "/alternate_malformed_repo2" -#define ALTERNATE_MALFORMED_FOLDER3 DISCOVER_FOLDER "/alternate_malformed_repo3" -#define ALTERNATE_NOT_FOUND_FOLDER DISCOVER_FOLDER "/alternate_not_found_repo" - -static void ensure_repository_discover(const char *start_path, - const char *ceiling_dirs, - git_buf *expected_path) -{ - git_buf found_path = GIT_BUF_INIT; - cl_git_pass(git_repository_discover(&found_path, start_path, 0, ceiling_dirs)); - //across_fs is always 0 as we can't automate the filesystem change tests - cl_assert_equal_s(found_path.ptr, expected_path->ptr); - git_buf_free(&found_path); -} - -static void write_file(const char *path, const char *content) -{ - git_file file; - int error; - - if (git_path_exists(path)) { - cl_git_pass(p_unlink(path)); - } - - file = git_futils_creat_withpath(path, 0777, 0666); - cl_assert(file >= 0); - - error = p_write(file, content, strlen(content) * sizeof(char)); - p_close(file); - cl_git_pass(error); -} - -//no check is performed on ceiling_dirs length, so be sure it's long enough -static void append_ceiling_dir(git_buf *ceiling_dirs, const char *path) -{ - git_buf pretty_path = GIT_BUF_INIT; - char ceiling_separator[2] = { GIT_PATH_LIST_SEPARATOR, '\0' }; - - cl_git_pass(git_path_prettify_dir(&pretty_path, path, NULL)); - - if (ceiling_dirs->size > 0) - git_buf_puts(ceiling_dirs, ceiling_separator); - - git_buf_puts(ceiling_dirs, pretty_path.ptr); - - git_buf_free(&pretty_path); - cl_assert(git_buf_oom(ceiling_dirs) == 0); -} - -void test_repo_discover__0(void) -{ - // test discover - git_repository *repo; - git_buf ceiling_dirs_buf = GIT_BUF_INIT, repository_path = GIT_BUF_INIT, - sub_repository_path = GIT_BUF_INIT, found_path = GIT_BUF_INIT; - const char *ceiling_dirs; - const mode_t mode = 0777; - - git_futils_mkdir_r(DISCOVER_FOLDER, NULL, mode); - append_ceiling_dir(&ceiling_dirs_buf, TEMP_REPO_FOLDER); - ceiling_dirs = git_buf_cstr(&ceiling_dirs_buf); - - cl_assert_equal_i(GIT_ENOTFOUND, git_repository_discover(&repository_path, DISCOVER_FOLDER, 0, ceiling_dirs)); - - cl_git_pass(git_repository_init(&repo, DISCOVER_FOLDER, 1)); - cl_git_pass(git_repository_discover(&repository_path, DISCOVER_FOLDER, 0, ceiling_dirs)); - git_repository_free(repo); - - cl_git_pass(git_repository_init(&repo, SUB_REPOSITORY_FOLDER, 0)); - cl_git_pass(git_futils_mkdir_r(SUB_REPOSITORY_FOLDER_SUB_SUB_SUB, NULL, mode)); - cl_git_pass(git_repository_discover(&sub_repository_path, SUB_REPOSITORY_FOLDER, 0, ceiling_dirs)); - - cl_git_pass(git_futils_mkdir_r(SUB_REPOSITORY_FOLDER_SUB_SUB_SUB, NULL, mode)); - ensure_repository_discover(SUB_REPOSITORY_FOLDER_SUB, ceiling_dirs, &sub_repository_path); - ensure_repository_discover(SUB_REPOSITORY_FOLDER_SUB_SUB, ceiling_dirs, &sub_repository_path); - ensure_repository_discover(SUB_REPOSITORY_FOLDER_SUB_SUB_SUB, ceiling_dirs, &sub_repository_path); - - cl_git_pass(git_futils_mkdir_r(REPOSITORY_ALTERNATE_FOLDER_SUB_SUB_SUB, NULL, mode)); - write_file(REPOSITORY_ALTERNATE_FOLDER "/" DOT_GIT, "gitdir: ../" SUB_REPOSITORY_FOLDER_NAME "/" DOT_GIT); - write_file(REPOSITORY_ALTERNATE_FOLDER_SUB_SUB "/" DOT_GIT, "gitdir: ../../../" SUB_REPOSITORY_FOLDER_NAME "/" DOT_GIT); - write_file(REPOSITORY_ALTERNATE_FOLDER_SUB_SUB_SUB "/" DOT_GIT, "gitdir: ../../../../"); - ensure_repository_discover(REPOSITORY_ALTERNATE_FOLDER, ceiling_dirs, &sub_repository_path); - ensure_repository_discover(REPOSITORY_ALTERNATE_FOLDER_SUB, ceiling_dirs, &sub_repository_path); - ensure_repository_discover(REPOSITORY_ALTERNATE_FOLDER_SUB_SUB, ceiling_dirs, &sub_repository_path); - ensure_repository_discover(REPOSITORY_ALTERNATE_FOLDER_SUB_SUB_SUB, ceiling_dirs, &repository_path); - - cl_git_pass(git_futils_mkdir_r(ALTERNATE_MALFORMED_FOLDER1, NULL, mode)); - write_file(ALTERNATE_MALFORMED_FOLDER1 "/" DOT_GIT, "Anything but not gitdir:"); - cl_git_pass(git_futils_mkdir_r(ALTERNATE_MALFORMED_FOLDER2, NULL, mode)); - write_file(ALTERNATE_MALFORMED_FOLDER2 "/" DOT_GIT, "gitdir:"); - cl_git_pass(git_futils_mkdir_r(ALTERNATE_MALFORMED_FOLDER3, NULL, mode)); - write_file(ALTERNATE_MALFORMED_FOLDER3 "/" DOT_GIT, "gitdir: \n\n\n"); - cl_git_pass(git_futils_mkdir_r(ALTERNATE_NOT_FOUND_FOLDER, NULL, mode)); - write_file(ALTERNATE_NOT_FOUND_FOLDER "/" DOT_GIT, "gitdir: a_repository_that_surely_does_not_exist"); - cl_git_fail(git_repository_discover(&found_path, ALTERNATE_MALFORMED_FOLDER1, 0, ceiling_dirs)); - cl_git_fail(git_repository_discover(&found_path, ALTERNATE_MALFORMED_FOLDER2, 0, ceiling_dirs)); - cl_git_fail(git_repository_discover(&found_path, ALTERNATE_MALFORMED_FOLDER3, 0, ceiling_dirs)); - cl_assert_equal_i(GIT_ENOTFOUND, git_repository_discover(&found_path, ALTERNATE_NOT_FOUND_FOLDER, 0, ceiling_dirs)); - - append_ceiling_dir(&ceiling_dirs_buf, SUB_REPOSITORY_FOLDER); - ceiling_dirs = git_buf_cstr(&ceiling_dirs_buf); - - //this must pass as ceiling_directories cannot predent the current - //working directory to be checked - cl_git_pass(git_repository_discover(&found_path, SUB_REPOSITORY_FOLDER, 0, ceiling_dirs)); - cl_assert_equal_i(GIT_ENOTFOUND, git_repository_discover(&found_path, SUB_REPOSITORY_FOLDER_SUB, 0, ceiling_dirs)); - cl_assert_equal_i(GIT_ENOTFOUND, git_repository_discover(&found_path, SUB_REPOSITORY_FOLDER_SUB_SUB, 0, ceiling_dirs)); - cl_assert_equal_i(GIT_ENOTFOUND, git_repository_discover(&found_path, SUB_REPOSITORY_FOLDER_SUB_SUB_SUB, 0, ceiling_dirs)); - - //.gitfile redirection should not be affected by ceiling directories - ensure_repository_discover(REPOSITORY_ALTERNATE_FOLDER, ceiling_dirs, &sub_repository_path); - ensure_repository_discover(REPOSITORY_ALTERNATE_FOLDER_SUB, ceiling_dirs, &sub_repository_path); - ensure_repository_discover(REPOSITORY_ALTERNATE_FOLDER_SUB_SUB, ceiling_dirs, &sub_repository_path); - ensure_repository_discover(REPOSITORY_ALTERNATE_FOLDER_SUB_SUB_SUB, ceiling_dirs, &repository_path); - - cl_git_pass(git_futils_rmdir_r(TEMP_REPO_FOLDER, NULL, GIT_RMDIR_REMOVE_FILES)); - git_repository_free(repo); - git_buf_free(&ceiling_dirs_buf); - git_buf_free(&repository_path); - git_buf_free(&sub_repository_path); -} - diff --git a/vendor/libgit2/tests/repo/getters.c b/vendor/libgit2/tests/repo/getters.c deleted file mode 100644 index b8ede126c1..0000000000 --- a/vendor/libgit2/tests/repo/getters.c +++ /dev/null @@ -1,40 +0,0 @@ -#include "clar_libgit2.h" - -void test_repo_getters__is_empty_correctly_deals_with_pristine_looking_repos(void) -{ - git_repository *repo; - - repo = cl_git_sandbox_init("empty_bare.git"); - cl_git_remove_placeholders(git_repository_path(repo), "dummy-marker.txt"); - - cl_assert_equal_i(true, git_repository_is_empty(repo)); - - cl_git_sandbox_cleanup(); -} - -void test_repo_getters__is_empty_can_detect_used_repositories(void) -{ - git_repository *repo; - - cl_git_pass(git_repository_open(&repo, cl_fixture("testrepo.git"))); - - cl_assert_equal_i(false, git_repository_is_empty(repo)); - - git_repository_free(repo); -} - -void test_repo_getters__retrieving_the_odb_honors_the_refcount(void) -{ - git_odb *odb; - git_repository *repo; - - cl_git_pass(git_repository_open(&repo, cl_fixture("testrepo.git"))); - - cl_git_pass(git_repository_odb(&odb, repo)); - cl_assert(((git_refcount *)odb)->refcount.val == 2); - - git_repository_free(repo); - cl_assert(((git_refcount *)odb)->refcount.val == 1); - - git_odb_free(odb); -} diff --git a/vendor/libgit2/tests/repo/hashfile.c b/vendor/libgit2/tests/repo/hashfile.c deleted file mode 100644 index ae8e122f68..0000000000 --- a/vendor/libgit2/tests/repo/hashfile.c +++ /dev/null @@ -1,85 +0,0 @@ -#include "clar_libgit2.h" -#include "buffer.h" - -static git_repository *_repo; - -void test_repo_hashfile__initialize(void) -{ - _repo = cl_git_sandbox_init("status"); -} - -void test_repo_hashfile__cleanup(void) -{ - cl_git_sandbox_cleanup(); - _repo = NULL; -} - -void test_repo_hashfile__simple(void) -{ - git_oid a, b; - git_buf full = GIT_BUF_INIT; - - /* hash with repo relative path */ - cl_git_pass(git_odb_hashfile(&a, "status/current_file", GIT_OBJ_BLOB)); - cl_git_pass(git_repository_hashfile(&b, _repo, "current_file", GIT_OBJ_BLOB, NULL)); - cl_assert_equal_oid(&a, &b); - - cl_git_pass(git_buf_joinpath(&full, git_repository_workdir(_repo), "current_file")); - - /* hash with full path */ - cl_git_pass(git_odb_hashfile(&a, full.ptr, GIT_OBJ_BLOB)); - cl_git_pass(git_repository_hashfile(&b, _repo, full.ptr, GIT_OBJ_BLOB, NULL)); - cl_assert_equal_oid(&a, &b); - - /* hash with invalid type */ - cl_git_fail(git_odb_hashfile(&a, full.ptr, GIT_OBJ_ANY)); - cl_git_fail(git_repository_hashfile(&b, _repo, full.ptr, GIT_OBJ_OFS_DELTA, NULL)); - - git_buf_free(&full); -} - -void test_repo_hashfile__filtered(void) -{ - git_oid a, b; - - cl_repo_set_bool(_repo, "core.autocrlf", true); - - cl_git_append2file("status/.gitattributes", "*.txt text\n*.bin binary\n\n"); - - /* create some sample content with CRLF in it */ - cl_git_mkfile("status/testfile.txt", "content\r\n"); - cl_git_mkfile("status/testfile.bin", "other\r\nstuff\r\n"); - - /* not equal hashes because of filtering */ - cl_git_pass(git_odb_hashfile(&a, "status/testfile.txt", GIT_OBJ_BLOB)); - cl_git_pass(git_repository_hashfile(&b, _repo, "testfile.txt", GIT_OBJ_BLOB, NULL)); - cl_assert(git_oid_cmp(&a, &b)); - - /* equal hashes because filter is binary */ - cl_git_pass(git_odb_hashfile(&a, "status/testfile.bin", GIT_OBJ_BLOB)); - cl_git_pass(git_repository_hashfile(&b, _repo, "testfile.bin", GIT_OBJ_BLOB, NULL)); - cl_assert_equal_oid(&a, &b); - - /* equal hashes when 'as_file' points to binary filtering */ - cl_git_pass(git_odb_hashfile(&a, "status/testfile.txt", GIT_OBJ_BLOB)); - cl_git_pass(git_repository_hashfile(&b, _repo, "testfile.txt", GIT_OBJ_BLOB, "foo.bin")); - cl_assert_equal_oid(&a, &b); - - /* not equal hashes when 'as_file' points to text filtering */ - cl_git_pass(git_odb_hashfile(&a, "status/testfile.bin", GIT_OBJ_BLOB)); - cl_git_pass(git_repository_hashfile(&b, _repo, "testfile.bin", GIT_OBJ_BLOB, "foo.txt")); - cl_assert(git_oid_cmp(&a, &b)); - - /* equal hashes when 'as_file' is empty and turns off filtering */ - cl_git_pass(git_odb_hashfile(&a, "status/testfile.txt", GIT_OBJ_BLOB)); - cl_git_pass(git_repository_hashfile(&b, _repo, "testfile.txt", GIT_OBJ_BLOB, "")); - cl_assert_equal_oid(&a, &b); - - cl_git_pass(git_odb_hashfile(&a, "status/testfile.bin", GIT_OBJ_BLOB)); - cl_git_pass(git_repository_hashfile(&b, _repo, "testfile.bin", GIT_OBJ_BLOB, "")); - cl_assert_equal_oid(&a, &b); - - /* some hash type failures */ - cl_git_fail(git_odb_hashfile(&a, "status/testfile.txt", 0)); - cl_git_fail(git_repository_hashfile(&b, _repo, "testfile.txt", GIT_OBJ_ANY, NULL)); -} diff --git a/vendor/libgit2/tests/repo/head.c b/vendor/libgit2/tests/repo/head.c deleted file mode 100644 index 31c2287776..0000000000 --- a/vendor/libgit2/tests/repo/head.c +++ /dev/null @@ -1,461 +0,0 @@ -#include "clar_libgit2.h" -#include "refs.h" -#include "repo_helpers.h" -#include "posix.h" -#include "git2/annotated_commit.h" - -static const char *g_email = "foo@example.com"; -static git_repository *repo; - -void test_repo_head__initialize(void) -{ - repo = cl_git_sandbox_init("testrepo.git"); - cl_git_pass(git_repository_set_ident(repo, "Foo Bar", g_email)); -} - -void test_repo_head__cleanup(void) -{ - cl_git_sandbox_cleanup(); -} - -static void check_last_reflog_entry(const char *email, const char *message) -{ - git_reflog *log; - const git_reflog_entry *entry; - - cl_git_pass(git_reflog_read(&log, repo, GIT_HEAD_FILE)); - cl_assert(git_reflog_entrycount(log) > 0); - entry = git_reflog_entry_byindex(log, 0); - if (email) - cl_assert_equal_s(email, git_reflog_entry_committer(entry)->email); - if (message) - cl_assert_equal_s(message, git_reflog_entry_message(entry)); - git_reflog_free(log); -} - -void test_repo_head__head_detached(void) -{ - git_reference *ref; - - cl_assert_equal_i(false, git_repository_head_detached(repo)); - - cl_git_pass(git_repository_detach_head(repo)); - check_last_reflog_entry(g_email, "checkout: moving from master to a65fedf39aefe402d3bb6e24df4d4f5fe4547750"); - cl_assert_equal_i(true, git_repository_head_detached(repo)); - - /* take the repo back to it's original state */ - cl_git_pass(git_reference_symbolic_create(&ref, repo, "HEAD", "refs/heads/master", - true, "REATTACH")); - git_reference_free(ref); - - check_last_reflog_entry(g_email, "REATTACH"); - cl_assert_equal_i(false, git_repository_head_detached(repo)); -} - -void test_repo_head__unborn_head(void) -{ - git_reference *ref; - - cl_git_pass(git_repository_head_detached(repo)); - - make_head_unborn(repo, NON_EXISTING_HEAD); - - cl_assert(git_repository_head_unborn(repo) == 1); - - - /* take the repo back to it's original state */ - cl_git_pass(git_reference_symbolic_create(&ref, repo, "HEAD", "refs/heads/master", 1, NULL)); - cl_assert(git_repository_head_unborn(repo) == 0); - - git_reference_free(ref); -} - -void test_repo_head__set_head_Attaches_HEAD_to_un_unborn_branch_when_the_branch_doesnt_exist(void) -{ - git_reference *head; - - cl_git_pass(git_repository_set_head(repo, "refs/heads/doesnt/exist/yet")); - - cl_assert_equal_i(false, git_repository_head_detached(repo)); - - cl_assert_equal_i(GIT_EUNBORNBRANCH, git_repository_head(&head, repo)); -} - -void test_repo_head__set_head_Returns_ENOTFOUND_when_the_reference_doesnt_exist(void) -{ - cl_assert_equal_i(GIT_ENOTFOUND, git_repository_set_head(repo, "refs/tags/doesnt/exist/yet")); -} - -void test_repo_head__set_head_Fails_when_the_reference_points_to_a_non_commitish(void) -{ - cl_git_fail(git_repository_set_head(repo, "refs/tags/point_to_blob")); -} - -void test_repo_head__set_head_Attaches_HEAD_when_the_reference_points_to_a_branch(void) -{ - git_reference *head; - - cl_git_pass(git_repository_set_head(repo, "refs/heads/br2")); - - cl_assert_equal_i(false, git_repository_head_detached(repo)); - - cl_git_pass(git_repository_head(&head, repo)); - cl_assert_equal_s("refs/heads/br2", git_reference_name(head)); - - git_reference_free(head); -} - -static void assert_head_is_correctly_detached(void) -{ - git_reference *head; - git_object *commit; - - cl_assert_equal_i(true, git_repository_head_detached(repo)); - - cl_git_pass(git_repository_head(&head, repo)); - - cl_git_pass(git_object_lookup(&commit, repo, git_reference_target(head), GIT_OBJ_COMMIT)); - - git_object_free(commit); - git_reference_free(head); -} - -void test_repo_head__set_head_Detaches_HEAD_when_the_reference_doesnt_point_to_a_branch(void) -{ - cl_git_pass(git_repository_set_head(repo, "refs/tags/test")); - - cl_assert_equal_i(true, git_repository_head_detached(repo)); - - assert_head_is_correctly_detached(); -} - -void test_repo_head__set_head_detached_Return_ENOTFOUND_when_the_object_doesnt_exist(void) -{ - git_oid oid; - - cl_git_pass(git_oid_fromstr(&oid, "deadbeefdeadbeefdeadbeefdeadbeefdeadbeef")); - - cl_assert_equal_i(GIT_ENOTFOUND, git_repository_set_head_detached(repo, &oid)); -} - -void test_repo_head__set_head_detached_Fails_when_the_object_isnt_a_commitish(void) -{ - git_object *blob; - - cl_git_pass(git_revparse_single(&blob, repo, "point_to_blob")); - - cl_git_fail(git_repository_set_head_detached(repo, git_object_id(blob))); - - git_object_free(blob); -} - -void test_repo_head__set_head_detached_Detaches_HEAD_and_make_it_point_to_the_peeled_commit(void) -{ - git_object *tag; - - cl_git_pass(git_revparse_single(&tag, repo, "tags/test")); - cl_assert_equal_i(GIT_OBJ_TAG, git_object_type(tag)); - - cl_git_pass(git_repository_set_head_detached(repo, git_object_id(tag))); - - assert_head_is_correctly_detached(); - - git_object_free(tag); -} - -void test_repo_head__detach_head_Detaches_HEAD_and_make_it_point_to_the_peeled_commit(void) -{ - cl_assert_equal_i(false, git_repository_head_detached(repo)); - - cl_git_pass(git_repository_detach_head(repo)); - - assert_head_is_correctly_detached(); -} - -void test_repo_head__detach_head_Fails_if_HEAD_and_point_to_a_non_commitish(void) -{ - git_reference *head; - - cl_git_pass(git_reference_symbolic_create(&head, repo, GIT_HEAD_FILE, "refs/tags/point_to_blob", 1, NULL)); - - cl_git_fail(git_repository_detach_head(repo)); - - git_reference_free(head); -} - -void test_repo_head__detaching_an_unborn_branch_returns_GIT_EUNBORNBRANCH(void) -{ - make_head_unborn(repo, NON_EXISTING_HEAD); - - cl_assert_equal_i(GIT_EUNBORNBRANCH, git_repository_detach_head(repo)); -} - -void test_repo_head__retrieving_an_unborn_branch_returns_GIT_EUNBORNBRANCH(void) -{ - git_reference *head; - - make_head_unborn(repo, NON_EXISTING_HEAD); - - cl_assert_equal_i(GIT_EUNBORNBRANCH, git_repository_head(&head, repo)); -} - -void test_repo_head__retrieving_a_missing_head_returns_GIT_ENOTFOUND(void) -{ - git_reference *head; - - delete_head(repo); - - cl_assert_equal_i(GIT_ENOTFOUND, git_repository_head(&head, repo)); -} - -void test_repo_head__can_tell_if_an_unborn_head_is_detached(void) -{ - make_head_unborn(repo, NON_EXISTING_HEAD); - - cl_assert_equal_i(false, git_repository_head_detached(repo)); -} - -static void test_reflog(git_repository *repo, size_t idx, - const char *old_spec, const char *new_spec, - const char *email, const char *message) -{ - git_reflog *log; - const git_reflog_entry *entry; - - cl_git_pass(git_reflog_read(&log, repo, "HEAD")); - entry = git_reflog_entry_byindex(log, idx); - - if (old_spec) { - git_object *obj; - cl_git_pass(git_revparse_single(&obj, repo, old_spec)); - cl_assert_equal_oid(git_object_id(obj), git_reflog_entry_id_old(entry)); - git_object_free(obj); - } - if (new_spec) { - git_object *obj; - cl_git_pass(git_revparse_single(&obj, repo, new_spec)); - cl_assert_equal_oid(git_object_id(obj), git_reflog_entry_id_new(entry)); - git_object_free(obj); - } - - if (email) { - cl_assert_equal_s(email, git_reflog_entry_committer(entry)->email); - } - if (message) { - cl_assert_equal_s(message, git_reflog_entry_message(entry)); - } - - git_reflog_free(log); -} - -void test_repo_head__setting_head_updates_reflog(void) -{ - git_object *tag; - git_signature *sig; - git_annotated_commit *annotated; - - cl_git_pass(git_signature_now(&sig, "me", "foo@example.com")); - - cl_git_pass(git_repository_set_head(repo, "refs/heads/haacked")); - cl_git_pass(git_repository_set_head(repo, "refs/heads/unborn")); - cl_git_pass(git_revparse_single(&tag, repo, "tags/test")); - cl_git_pass(git_repository_set_head_detached(repo, git_object_id(tag))); - cl_git_pass(git_repository_set_head(repo, "refs/heads/haacked")); - - test_reflog(repo, 2, NULL, "refs/heads/haacked", "foo@example.com", "checkout: moving from master to haacked"); - test_reflog(repo, 1, NULL, "tags/test^{commit}", "foo@example.com", "checkout: moving from unborn to e90810b8df3e80c413d903f631643c716887138d"); - test_reflog(repo, 0, "tags/test^{commit}", "refs/heads/haacked", "foo@example.com", "checkout: moving from e90810b8df3e80c413d903f631643c716887138d to haacked"); - - cl_git_pass(git_annotated_commit_from_revspec(&annotated, repo, "haacked~0")); - cl_git_pass(git_repository_set_head_detached_from_annotated(repo, annotated)); - - test_reflog(repo, 0, NULL, "refs/heads/haacked", "foo@example.com", "checkout: moving from haacked to haacked~0"); - - git_annotated_commit_free(annotated); - git_object_free(tag); - git_signature_free(sig); -} - -static void assert_head_reflog(git_repository *repo, size_t idx, - const char *old_id, const char *new_id, const char *message) -{ - git_reflog *log; - const git_reflog_entry *entry; - char id_str[GIT_OID_HEXSZ + 1] = {0}; - - cl_git_pass(git_reflog_read(&log, repo, GIT_HEAD_FILE)); - entry = git_reflog_entry_byindex(log, idx); - - git_oid_fmt(id_str, git_reflog_entry_id_old(entry)); - cl_assert_equal_s(old_id, id_str); - - git_oid_fmt(id_str, git_reflog_entry_id_new(entry)); - cl_assert_equal_s(new_id, id_str); - - cl_assert_equal_s(message, git_reflog_entry_message(entry)); - - git_reflog_free(log); -} - -void test_repo_head__detaching_writes_reflog(void) -{ - git_signature *sig; - git_oid id; - const char *msg; - - cl_git_pass(git_signature_now(&sig, "me", "foo@example.com")); - - msg = "checkout: moving from master to e90810b8df3e80c413d903f631643c716887138d"; - git_oid_fromstr(&id, "e90810b8df3e80c413d903f631643c716887138d"); - cl_git_pass(git_repository_set_head_detached(repo, &id)); - assert_head_reflog(repo, 0, "a65fedf39aefe402d3bb6e24df4d4f5fe4547750", - "e90810b8df3e80c413d903f631643c716887138d", msg); - - msg = "checkout: moving from e90810b8df3e80c413d903f631643c716887138d to haacked"; - cl_git_pass(git_repository_set_head(repo, "refs/heads/haacked")); - assert_head_reflog(repo, 0, "e90810b8df3e80c413d903f631643c716887138d", - "258f0e2a959a364e40ed6603d5d44fbb24765b10", msg); - - git_signature_free(sig); -} - -void test_repo_head__orphan_branch_does_not_count(void) -{ - git_oid id; - const char *msg; - - /* Have something known */ - msg = "checkout: moving from master to e90810b8df3e80c413d903f631643c716887138d"; - git_oid_fromstr(&id, "e90810b8df3e80c413d903f631643c716887138d"); - cl_git_pass(git_repository_set_head_detached(repo, &id)); - assert_head_reflog(repo, 0, "a65fedf39aefe402d3bb6e24df4d4f5fe4547750", - "e90810b8df3e80c413d903f631643c716887138d", msg); - - /* Switching to an orphan branch does not write tot he reflog */ - cl_git_pass(git_repository_set_head(repo, "refs/heads/orphan")); - assert_head_reflog(repo, 0, "a65fedf39aefe402d3bb6e24df4d4f5fe4547750", - "e90810b8df3e80c413d903f631643c716887138d", msg); - - /* And coming back, we set the source to zero */ - msg = "checkout: moving from orphan to haacked"; - cl_git_pass(git_repository_set_head(repo, "refs/heads/haacked")); - assert_head_reflog(repo, 0, "0000000000000000000000000000000000000000", - "258f0e2a959a364e40ed6603d5d44fbb24765b10", msg); -} - -void test_repo_head__set_to_current_target(void) -{ - git_reflog *log; - size_t nentries, nentries_after; - - cl_git_pass(git_reflog_read(&log, repo, GIT_HEAD_FILE)); - nentries = git_reflog_entrycount(log); - git_reflog_free(log); - - cl_git_pass(git_repository_set_head(repo, "refs/heads/haacked")); - cl_git_pass(git_repository_set_head(repo, "refs/heads/haacked")); - - cl_git_pass(git_reflog_read(&log, repo, GIT_HEAD_FILE)); - nentries_after = git_reflog_entrycount(log); - git_reflog_free(log); - - cl_assert_equal_i(nentries + 1, nentries_after); -} - -void test_repo_head__branch_birth(void) -{ - git_signature *sig; - git_oid id; - git_tree *tree; - git_reference *ref; - const char *msg; - git_reflog *log; - size_t nentries, nentries_after; - - cl_git_pass(git_reflog_read(&log, repo, GIT_HEAD_FILE)); - nentries = git_reflog_entrycount(log); - git_reflog_free(log); - - cl_git_pass(git_signature_now(&sig, "me", "foo@example.com")); - - cl_git_pass(git_repository_head(&ref, repo)); - cl_git_pass(git_reference_peel((git_object **) &tree, ref, GIT_OBJ_TREE)); - git_reference_free(ref); - - cl_git_pass(git_repository_set_head(repo, "refs/heads/orphan")); - - cl_git_pass(git_reflog_read(&log, repo, GIT_HEAD_FILE)); - nentries_after = git_reflog_entrycount(log); - git_reflog_free(log); - - cl_assert_equal_i(nentries, nentries_after); - - msg = "message 2"; - cl_git_pass(git_commit_create(&id, repo, "HEAD", sig, sig, NULL, msg, tree, 0, NULL)); - - git_tree_free(tree); - - cl_git_pass(git_reflog_read(&log, repo, "refs/heads/orphan")); - cl_assert_equal_i(1, git_reflog_entrycount(log)); - git_reflog_free(log); - - cl_git_pass(git_reflog_read(&log, repo, GIT_HEAD_FILE)); - nentries_after = git_reflog_entrycount(log); - git_reflog_free(log); - - cl_assert_equal_i(nentries + 1, nentries_after); - - git_signature_free(sig); - -} - -static size_t entrycount(git_repository *repo, const char *name) -{ - git_reflog *log; - size_t ret; - - cl_git_pass(git_reflog_read(&log, repo, name)); - ret = git_reflog_entrycount(log); - git_reflog_free(log); - - return ret; -} - -void test_repo_head__symref_chain(void) -{ - git_signature *sig; - git_oid id; - git_tree *tree; - git_reference *ref; - const char *msg; - size_t nentries, nentries_master; - - nentries = entrycount(repo, GIT_HEAD_FILE); - - cl_git_pass(git_signature_now(&sig, "me", "foo@example.com")); - - cl_git_pass(git_repository_head(&ref, repo)); - cl_git_pass(git_reference_peel((git_object **) &tree, ref, GIT_OBJ_TREE)); - git_reference_free(ref); - - nentries_master = entrycount(repo, "refs/heads/master"); - - msg = "message 1"; - cl_git_pass(git_reference_symbolic_create(&ref, repo, "refs/heads/master", "refs/heads/foo", 1, msg)); - git_reference_free(ref); - - cl_assert_equal_i(0, entrycount(repo, "refs/heads/foo")); - cl_assert_equal_i(nentries, entrycount(repo, GIT_HEAD_FILE)); - cl_assert_equal_i(nentries_master, entrycount(repo, "refs/heads/master")); - - msg = "message 2"; - cl_git_pass(git_commit_create(&id, repo, "HEAD", sig, sig, NULL, msg, tree, 0, NULL)); - git_tree_free(tree); - - cl_assert_equal_i(1, entrycount(repo, "refs/heads/foo")); - cl_assert_equal_i(nentries +1, entrycount(repo, GIT_HEAD_FILE)); - cl_assert_equal_i(nentries_master, entrycount(repo, "refs/heads/master")); - - git_signature_free(sig); - -} diff --git a/vendor/libgit2/tests/repo/headtree.c b/vendor/libgit2/tests/repo/headtree.c deleted file mode 100644 index e899ac399c..0000000000 --- a/vendor/libgit2/tests/repo/headtree.c +++ /dev/null @@ -1,53 +0,0 @@ -#include "clar_libgit2.h" -#include "repository.h" -#include "repo_helpers.h" -#include "posix.h" - -static git_repository *repo; -static git_tree *tree; - -void test_repo_headtree__initialize(void) -{ - repo = cl_git_sandbox_init("testrepo.git"); - tree = NULL; -} - -void test_repo_headtree__cleanup(void) -{ - git_tree_free(tree); - cl_git_sandbox_cleanup(); -} - -void test_repo_headtree__can_retrieve_the_root_tree_from_a_detached_head(void) -{ - cl_git_pass(git_repository_detach_head(repo)); - - cl_git_pass(git_repository_head_tree(&tree, repo)); - - cl_assert(git_oid_streq(git_tree_id(tree), "az")); -} - -void test_repo_headtree__can_retrieve_the_root_tree_from_a_non_detached_head(void) -{ - cl_assert_equal_i(false, git_repository_head_detached(repo)); - - cl_git_pass(git_repository_head_tree(&tree, repo)); - - cl_assert(git_oid_streq(git_tree_id(tree), "az")); -} - -void test_repo_headtree__when_head_is_unborn_returns_EUNBORNBRANCH(void) -{ - make_head_unborn(repo, NON_EXISTING_HEAD); - - cl_assert_equal_i(true, git_repository_head_unborn(repo)); - - cl_assert_equal_i(GIT_EUNBORNBRANCH, git_repository_head_tree(&tree, repo)); -} - -void test_repo_headtree__when_head_is_missing_returns_ENOTFOUND(void) -{ - delete_head(repo); - - cl_assert_equal_i(GIT_ENOTFOUND, git_repository_head_tree(&tree, repo)); -} diff --git a/vendor/libgit2/tests/repo/init.c b/vendor/libgit2/tests/repo/init.c deleted file mode 100644 index 525020f5a4..0000000000 --- a/vendor/libgit2/tests/repo/init.c +++ /dev/null @@ -1,733 +0,0 @@ -#include "clar_libgit2.h" -#include "fileops.h" -#include "repository.h" -#include "config.h" -#include "path.h" -#include "config/config_helpers.h" - -enum repo_mode { - STANDARD_REPOSITORY = 0, - BARE_REPOSITORY = 1 -}; - -static git_repository *_repo = NULL; -static mode_t g_umask = 0; - -void test_repo_init__initialize(void) -{ - _repo = NULL; - - /* load umask if not already loaded */ - if (!g_umask) { - g_umask = p_umask(022); - (void)p_umask(g_umask); - } -} - -static void cleanup_repository(void *path) -{ - git_repository_free(_repo); - _repo = NULL; - - cl_fixture_cleanup((const char *)path); -} - -static void ensure_repository_init( - const char *working_directory, - int is_bare, - const char *expected_path_repository, - const char *expected_working_directory) -{ - const char *workdir; - - cl_assert(!git_path_isdir(working_directory)); - - cl_git_pass(git_repository_init(&_repo, working_directory, is_bare)); - - workdir = git_repository_workdir(_repo); - if (workdir != NULL || expected_working_directory != NULL) { - cl_assert( - git__suffixcmp(workdir, expected_working_directory) == 0 - ); - } - - cl_assert( - git__suffixcmp(git_repository_path(_repo), expected_path_repository) == 0 - ); - - cl_assert(git_repository_is_bare(_repo) == is_bare); - -#ifdef GIT_WIN32 - if (!is_bare) { - DWORD fattrs = GetFileAttributes(git_repository_path(_repo)); - cl_assert((fattrs & FILE_ATTRIBUTE_HIDDEN) != 0); - } -#endif - - cl_assert(git_repository_is_empty(_repo)); -} - -void test_repo_init__standard_repo(void) -{ - cl_set_cleanup(&cleanup_repository, "testrepo"); - ensure_repository_init("testrepo/", 0, "testrepo/.git/", "testrepo/"); -} - -void test_repo_init__standard_repo_noslash(void) -{ - cl_set_cleanup(&cleanup_repository, "testrepo"); - ensure_repository_init("testrepo", 0, "testrepo/.git/", "testrepo/"); -} - -void test_repo_init__bare_repo(void) -{ - cl_set_cleanup(&cleanup_repository, "testrepo.git"); - ensure_repository_init("testrepo.git/", 1, "testrepo.git/", NULL); -} - -void test_repo_init__bare_repo_noslash(void) -{ - cl_set_cleanup(&cleanup_repository, "testrepo.git"); - ensure_repository_init("testrepo.git", 1, "testrepo.git/", NULL); -} - -void test_repo_init__bare_repo_escaping_current_workdir(void) -{ - git_buf path_repository = GIT_BUF_INIT; - git_buf path_current_workdir = GIT_BUF_INIT; - - cl_git_pass(git_path_prettify_dir(&path_current_workdir, ".", NULL)); - - cl_git_pass(git_buf_joinpath(&path_repository, git_buf_cstr(&path_current_workdir), "a/b/c")); - cl_git_pass(git_futils_mkdir_r(git_buf_cstr(&path_repository), NULL, GIT_DIR_MODE)); - - /* Change the current working directory */ - cl_git_pass(chdir(git_buf_cstr(&path_repository))); - - /* Initialize a bare repo with a relative path escaping out of the current working directory */ - cl_git_pass(git_repository_init(&_repo, "../d/e.git", 1)); - cl_git_pass(git__suffixcmp(git_repository_path(_repo), "/a/b/d/e.git/")); - - git_repository_free(_repo); - - /* Open a bare repo with a relative path escaping out of the current working directory */ - cl_git_pass(git_repository_open(&_repo, "../d/e.git")); - - cl_git_pass(chdir(git_buf_cstr(&path_current_workdir))); - - git_buf_free(&path_current_workdir); - git_buf_free(&path_repository); - - cleanup_repository("a"); -} - -void test_repo_init__reinit_bare_repo(void) -{ - cl_set_cleanup(&cleanup_repository, "reinit.git"); - - /* Initialize the repository */ - cl_git_pass(git_repository_init(&_repo, "reinit.git", 1)); - git_repository_free(_repo); - - /* Reinitialize the repository */ - cl_git_pass(git_repository_init(&_repo, "reinit.git", 1)); -} - -void test_repo_init__reinit_too_recent_bare_repo(void) -{ - git_config *config; - - /* Initialize the repository */ - cl_git_pass(git_repository_init(&_repo, "reinit.git", 1)); - git_repository_config(&config, _repo); - - /* - * Hack the config of the repository to make it look like it has - * been created by a recenter version of git/libgit2 - */ - cl_git_pass(git_config_set_int32(config, "core.repositoryformatversion", 42)); - - git_config_free(config); - git_repository_free(_repo); - - /* Try to reinitialize the repository */ - cl_git_fail(git_repository_init(&_repo, "reinit.git", 1)); - - cl_fixture_cleanup("reinit.git"); -} - -void test_repo_init__additional_templates(void) -{ - git_buf path = GIT_BUF_INIT; - - cl_set_cleanup(&cleanup_repository, "tester"); - - ensure_repository_init("tester", 0, "tester/.git/", "tester/"); - - cl_git_pass( - git_buf_joinpath(&path, git_repository_path(_repo), "description")); - cl_assert(git_path_isfile(git_buf_cstr(&path))); - - cl_git_pass( - git_buf_joinpath(&path, git_repository_path(_repo), "info/exclude")); - cl_assert(git_path_isfile(git_buf_cstr(&path))); - - cl_git_pass( - git_buf_joinpath(&path, git_repository_path(_repo), "hooks")); - cl_assert(git_path_isdir(git_buf_cstr(&path))); - /* won't confirm specific contents of hooks dir since it may vary */ - - git_buf_free(&path); -} - -static void assert_config_entry_on_init_bytype( - const char *config_key, int expected_value, bool is_bare) -{ - git_config *config; - int error, current_value; - const char *repo_path = is_bare ? - "config_entry/test.bare.git" : "config_entry/test.non.bare.git"; - - cl_set_cleanup(&cleanup_repository, "config_entry"); - - cl_git_pass(git_repository_init(&_repo, repo_path, is_bare)); - - cl_git_pass(git_repository_config(&config, _repo)); - error = git_config_get_bool(¤t_value, config, config_key); - git_config_free(config); - - if (expected_value >= 0) { - cl_assert_equal_i(0, error); - cl_assert_equal_i(expected_value, current_value); - } else { - cl_assert_equal_i(expected_value, error); - } -} - -static void assert_config_entry_on_init( - const char *config_key, int expected_value) -{ - assert_config_entry_on_init_bytype(config_key, expected_value, true); - git_repository_free(_repo); - - assert_config_entry_on_init_bytype(config_key, expected_value, false); -} - -void test_repo_init__detect_filemode(void) -{ - assert_config_entry_on_init("core.filemode", cl_is_chmod_supported()); -} - -void test_repo_init__detect_ignorecase(void) -{ - struct stat st; - bool found_without_match; - - cl_git_write2file("testCAPS", "whatever\n", 0, O_CREAT | O_WRONLY, 0666); - found_without_match = (p_stat("Testcaps", &st) == 0); - cl_must_pass(p_unlink("testCAPS")); - - assert_config_entry_on_init( - "core.ignorecase", found_without_match ? true : GIT_ENOTFOUND); -} - -void test_repo_init__detect_precompose_unicode_required(void) -{ -#ifdef GIT_USE_ICONV - char *composed = "ḱṷṓn", *decomposed = "kĚuĚ­oĚ„Ěn"; - struct stat st; - bool found_with_nfd; - - cl_git_write2file(composed, "whatever\n", 0, O_CREAT | O_WRONLY, 0666); - found_with_nfd = (p_stat(decomposed, &st) == 0); - cl_must_pass(p_unlink(composed)); - - assert_config_entry_on_init("core.precomposeunicode", found_with_nfd); -#else - assert_config_entry_on_init("core.precomposeunicode", GIT_ENOTFOUND); -#endif -} - -void test_repo_init__reinit_doesnot_overwrite_ignorecase(void) -{ - git_config *config; - int current_value; - - /* Init a new repo */ - cl_set_cleanup(&cleanup_repository, "not.overwrite.git"); - cl_git_pass(git_repository_init(&_repo, "not.overwrite.git", 1)); - - /* Change the "core.ignorecase" config value to something unlikely */ - git_repository_config(&config, _repo); - git_config_set_int32(config, "core.ignorecase", 42); - git_config_free(config); - git_repository_free(_repo); - _repo = NULL; - - /* Reinit the repository */ - cl_git_pass(git_repository_init(&_repo, "not.overwrite.git", 1)); - git_repository_config(&config, _repo); - - /* Ensure the "core.ignorecase" config value hasn't been updated */ - cl_git_pass(git_config_get_int32(¤t_value, config, "core.ignorecase")); - cl_assert_equal_i(42, current_value); - - git_config_free(config); -} - -void test_repo_init__reinit_overwrites_filemode(void) -{ - int expected = cl_is_chmod_supported(), current_value; - - /* Init a new repo */ - cl_set_cleanup(&cleanup_repository, "overwrite.git"); - cl_git_pass(git_repository_init(&_repo, "overwrite.git", 1)); - - /* Change the "core.filemode" config value to something unlikely */ - cl_repo_set_bool(_repo, "core.filemode", !expected); - - git_repository_free(_repo); - _repo = NULL; - - /* Reinit the repository */ - cl_git_pass(git_repository_init(&_repo, "overwrite.git", 1)); - - /* Ensure the "core.filemode" config value has been reset */ - current_value = cl_repo_get_bool(_repo, "core.filemode"); - cl_assert_equal_i(expected, current_value); -} - -void test_repo_init__sets_logAllRefUpdates_according_to_type_of_repository(void) -{ - assert_config_entry_on_init_bytype("core.logallrefupdates", GIT_ENOTFOUND, true); - git_repository_free(_repo); - assert_config_entry_on_init_bytype("core.logallrefupdates", true, false); -} - -void test_repo_init__extended_0(void) -{ - git_repository_init_options opts = GIT_REPOSITORY_INIT_OPTIONS_INIT; - - /* without MKDIR this should fail */ - cl_git_fail(git_repository_init_ext(&_repo, "extended", &opts)); - - /* make the directory first, then it should succeed */ - cl_git_pass(git_futils_mkdir("extended", NULL, 0775, 0)); - cl_git_pass(git_repository_init_ext(&_repo, "extended", &opts)); - - cl_assert(!git__suffixcmp(git_repository_workdir(_repo), "/extended/")); - cl_assert(!git__suffixcmp(git_repository_path(_repo), "/extended/.git/")); - cl_assert(!git_repository_is_bare(_repo)); - cl_assert(git_repository_is_empty(_repo)); - - cleanup_repository("extended"); -} - -void test_repo_init__extended_1(void) -{ - git_reference *ref; - git_remote *remote; - struct stat st; - git_repository_init_options opts = GIT_REPOSITORY_INIT_OPTIONS_INIT; - - opts.flags = GIT_REPOSITORY_INIT_MKPATH | - GIT_REPOSITORY_INIT_NO_DOTGIT_DIR; - opts.mode = GIT_REPOSITORY_INIT_SHARED_GROUP; - opts.workdir_path = "../c_wd"; - opts.description = "Awesomest test repository evah"; - opts.initial_head = "development"; - opts.origin_url = "https://github.com/libgit2/libgit2.git"; - - cl_git_pass(git_repository_init_ext(&_repo, "root/b/c.git", &opts)); - - cl_assert(!git__suffixcmp(git_repository_workdir(_repo), "/c_wd/")); - cl_assert(!git__suffixcmp(git_repository_path(_repo), "/c.git/")); - cl_assert(git_path_isfile("root/b/c_wd/.git")); - cl_assert(!git_repository_is_bare(_repo)); - /* repo will not be counted as empty because we set head to "development" */ - cl_assert(!git_repository_is_empty(_repo)); - - cl_git_pass(git_path_lstat(git_repository_path(_repo), &st)); - cl_assert(S_ISDIR(st.st_mode)); - if (cl_is_chmod_supported()) - cl_assert((S_ISGID & st.st_mode) == S_ISGID); - else - cl_assert((S_ISGID & st.st_mode) == 0); - - cl_git_pass(git_reference_lookup(&ref, _repo, "HEAD")); - cl_assert(git_reference_type(ref) == GIT_REF_SYMBOLIC); - cl_assert_equal_s("refs/heads/development", git_reference_symbolic_target(ref)); - git_reference_free(ref); - - cl_git_pass(git_remote_lookup(&remote, _repo, "origin")); - cl_assert_equal_s("origin", git_remote_name(remote)); - cl_assert_equal_s(opts.origin_url, git_remote_url(remote)); - git_remote_free(remote); - - git_repository_free(_repo); - cl_fixture_cleanup("root"); -} - -void test_repo_init__relative_gitdir(void) -{ - git_repository_init_options opts = GIT_REPOSITORY_INIT_OPTIONS_INIT; - git_buf dot_git_content = GIT_BUF_INIT; - - opts.workdir_path = "../c_wd"; - opts.flags = - GIT_REPOSITORY_INIT_MKPATH | - GIT_REPOSITORY_INIT_RELATIVE_GITLINK | - GIT_REPOSITORY_INIT_NO_DOTGIT_DIR; - - /* make the directory first, then it should succeed */ - cl_git_pass(git_repository_init_ext(&_repo, "root/b/my_repository", &opts)); - - cl_assert(!git__suffixcmp(git_repository_workdir(_repo), "root/b/c_wd/")); - cl_assert(!git__suffixcmp(git_repository_path(_repo), "root/b/my_repository/")); - cl_assert(!git_repository_is_bare(_repo)); - cl_assert(git_repository_is_empty(_repo)); - - /* Verify that the gitlink and worktree entries are relative */ - - /* Verify worktree */ - assert_config_entry_value(_repo, "core.worktree", "../c_wd/"); - - /* Verify gitlink */ - cl_git_pass(git_futils_readbuffer(&dot_git_content, "root/b/c_wd/.git")); - cl_assert_equal_s("gitdir: ../my_repository/", dot_git_content.ptr); - - git_buf_free(&dot_git_content); - cleanup_repository("root"); -} - -void test_repo_init__relative_gitdir_2(void) -{ - git_repository_init_options opts = GIT_REPOSITORY_INIT_OPTIONS_INIT; - git_buf dot_git_content = GIT_BUF_INIT; - git_buf full_path = GIT_BUF_INIT; - - cl_git_pass(git_path_prettify(&full_path, ".", NULL)); - cl_git_pass(git_buf_joinpath(&full_path, full_path.ptr, "root/b/c_wd")); - - opts.workdir_path = full_path.ptr; - opts.flags = - GIT_REPOSITORY_INIT_MKPATH | - GIT_REPOSITORY_INIT_RELATIVE_GITLINK | - GIT_REPOSITORY_INIT_NO_DOTGIT_DIR; - - /* make the directory first, then it should succeed */ - cl_git_pass(git_repository_init_ext(&_repo, "root/b/my_repository", &opts)); - git_buf_free(&full_path); - - cl_assert(!git__suffixcmp(git_repository_workdir(_repo), "root/b/c_wd/")); - cl_assert(!git__suffixcmp(git_repository_path(_repo), "root/b/my_repository/")); - cl_assert(!git_repository_is_bare(_repo)); - cl_assert(git_repository_is_empty(_repo)); - - /* Verify that the gitlink and worktree entries are relative */ - - /* Verify worktree */ - assert_config_entry_value(_repo, "core.worktree", "../c_wd/"); - - /* Verify gitlink */ - cl_git_pass(git_futils_readbuffer(&dot_git_content, "root/b/c_wd/.git")); - cl_assert_equal_s("gitdir: ../my_repository/", dot_git_content.ptr); - - git_buf_free(&dot_git_content); - cleanup_repository("root"); -} - -#define CLEAR_FOR_CORE_FILEMODE(M) ((M) &= ~0177) - -static void assert_hooks_match( - const char *template_dir, - const char *repo_dir, - const char *hook_path, - bool core_filemode) -{ - git_buf expected = GIT_BUF_INIT; - git_buf actual = GIT_BUF_INIT; - struct stat expected_st, st; - - cl_git_pass(git_buf_joinpath(&expected, template_dir, hook_path)); - cl_git_pass(git_path_lstat(expected.ptr, &expected_st)); - - cl_git_pass(git_buf_joinpath(&actual, repo_dir, hook_path)); - cl_git_pass(git_path_lstat(actual.ptr, &st)); - - cl_assert(expected_st.st_size == st.st_size); - - if (GIT_MODE_TYPE(expected_st.st_mode) != GIT_FILEMODE_LINK) { - mode_t expected_mode = - GIT_MODE_TYPE(expected_st.st_mode) | - (GIT_PERMS_FOR_WRITE(expected_st.st_mode) & ~g_umask); - - if (!core_filemode) { - CLEAR_FOR_CORE_FILEMODE(expected_mode); - CLEAR_FOR_CORE_FILEMODE(st.st_mode); - } - - cl_assert_equal_i_fmt(expected_mode, st.st_mode, "%07o"); - } - - git_buf_free(&expected); - git_buf_free(&actual); -} - -static void assert_mode_seems_okay( - const char *base, const char *path, - git_filemode_t expect_mode, bool expect_setgid, bool core_filemode) -{ - git_buf full = GIT_BUF_INIT; - struct stat st; - - cl_git_pass(git_buf_joinpath(&full, base, path)); - cl_git_pass(git_path_lstat(full.ptr, &st)); - git_buf_free(&full); - - if (!core_filemode) { - CLEAR_FOR_CORE_FILEMODE(expect_mode); - CLEAR_FOR_CORE_FILEMODE(st.st_mode); - expect_setgid = false; - } - - if (S_ISGID != 0) - cl_assert_equal_b(expect_setgid, (st.st_mode & S_ISGID) != 0); - - cl_assert_equal_b( - GIT_PERMS_IS_EXEC(expect_mode), GIT_PERMS_IS_EXEC(st.st_mode)); - - cl_assert_equal_i_fmt( - GIT_MODE_TYPE(expect_mode), GIT_MODE_TYPE(st.st_mode), "%07o"); -} - -static const char *template_sandbox(const char *name) -{ - git_buf hooks_path = GIT_BUF_INIT, link_path = GIT_BUF_INIT; - const char *path = cl_fixture(name); - - cl_fixture_sandbox(name); - - /* create a symlink from link.sample to update.sample if the filesystem - * supports it. - */ - - cl_git_pass(git_buf_joinpath(&hooks_path, name, "hooks")); - cl_git_pass(git_buf_joinpath(&link_path, hooks_path.ptr, "link.sample")); - -#ifdef GIT_WIN32 - cl_git_mkfile(link_path.ptr, "#!/bin/sh\necho hello, world\n"); -#else - cl_must_pass(symlink("update.sample", link_path.ptr)); -#endif - - git_buf_free(&link_path); - git_buf_free(&hooks_path); - - return path; -} - -void test_repo_init__extended_with_template(void) -{ - git_buf expected = GIT_BUF_INIT; - git_buf actual = GIT_BUF_INIT; - git_repository_init_options opts = GIT_REPOSITORY_INIT_OPTIONS_INIT; - int filemode; - - cl_set_cleanup(&cleanup_repository, "templated.git"); - template_sandbox("template"); - - opts.flags = GIT_REPOSITORY_INIT_MKPATH | GIT_REPOSITORY_INIT_BARE | - GIT_REPOSITORY_INIT_EXTERNAL_TEMPLATE; - opts.template_path = "template"; - - cl_git_pass(git_repository_init_ext(&_repo, "templated.git", &opts)); - - cl_assert(git_repository_is_bare(_repo)); - - cl_assert(!git__suffixcmp(git_repository_path(_repo), "/templated.git/")); - - cl_git_pass(git_futils_readbuffer(&expected, "template/description")); - cl_git_pass(git_futils_readbuffer( - &actual, "templated.git/description")); - - cl_assert_equal_s(expected.ptr, actual.ptr); - - git_buf_free(&expected); - git_buf_free(&actual); - - filemode = cl_repo_get_bool(_repo, "core.filemode"); - - assert_hooks_match( - "template", git_repository_path(_repo), - "hooks/update.sample", filemode); - - assert_hooks_match( - "template", git_repository_path(_repo), - "hooks/link.sample", filemode); - - cl_fixture_cleanup("template"); -} - -void test_repo_init__extended_with_template_and_shared_mode(void) -{ - git_buf expected = GIT_BUF_INIT; - git_buf actual = GIT_BUF_INIT; - git_repository_init_options opts = GIT_REPOSITORY_INIT_OPTIONS_INIT; - int filemode = true; - const char *repo_path = NULL; - - cl_set_cleanup(&cleanup_repository, "init_shared_from_tpl"); - template_sandbox("template"); - - opts.flags = GIT_REPOSITORY_INIT_MKPATH | - GIT_REPOSITORY_INIT_EXTERNAL_TEMPLATE; - opts.template_path = "template"; - opts.mode = GIT_REPOSITORY_INIT_SHARED_GROUP; - - cl_git_pass(git_repository_init_ext(&_repo, "init_shared_from_tpl", &opts)); - - cl_assert(!git_repository_is_bare(_repo)); - cl_assert(!git__suffixcmp(git_repository_path(_repo), "/init_shared_from_tpl/.git/")); - - filemode = cl_repo_get_bool(_repo, "core.filemode"); - - cl_git_pass(git_futils_readbuffer( - &expected, "template/description")); - cl_git_pass(git_futils_readbuffer( - &actual, "init_shared_from_tpl/.git/description")); - - cl_assert_equal_s(expected.ptr, actual.ptr); - - git_buf_free(&expected); - git_buf_free(&actual); - - repo_path = git_repository_path(_repo); - assert_mode_seems_okay(repo_path, "hooks", - GIT_FILEMODE_TREE | GIT_REPOSITORY_INIT_SHARED_GROUP, true, filemode); - assert_mode_seems_okay(repo_path, "info", - GIT_FILEMODE_TREE | GIT_REPOSITORY_INIT_SHARED_GROUP, true, filemode); - assert_mode_seems_okay(repo_path, "description", - GIT_FILEMODE_BLOB, false, filemode); - - /* for a non-symlinked hook, it should have shared permissions now */ - assert_hooks_match( - "template", git_repository_path(_repo), - "hooks/update.sample", filemode); - - /* for a symlinked hook, the permissions still should match the - * source link, not the GIT_REPOSITORY_INIT_SHARED_GROUP value - */ - assert_hooks_match( - "template", git_repository_path(_repo), - "hooks/link.sample", filemode); - - cl_fixture_cleanup("template"); -} - -void test_repo_init__can_reinit_an_initialized_repository(void) -{ - git_repository *reinit; - - cl_set_cleanup(&cleanup_repository, "extended"); - - cl_git_pass(git_futils_mkdir("extended", NULL, 0775, 0)); - cl_git_pass(git_repository_init(&_repo, "extended", false)); - - cl_git_pass(git_repository_init(&reinit, "extended", false)); - - cl_assert_equal_s(git_repository_path(_repo), git_repository_path(reinit)); - - git_repository_free(reinit); -} - -void test_repo_init__init_with_initial_commit(void) -{ - git_index *index; - - cl_set_cleanup(&cleanup_repository, "committed"); - - /* Initialize the repository */ - cl_git_pass(git_repository_init(&_repo, "committed", 0)); - - /* Init will be automatically created when requested for a new repo */ - cl_git_pass(git_repository_index(&index, _repo)); - - /* Create a file so we can commit it - * - * If you are writing code outside the test suite, you can create this - * file any way that you like, such as: - * FILE *fp = fopen("committed/file.txt", "w"); - * fputs("some stuff\n", fp); - * fclose(fp); - * We like to use the help functions because they do error detection - * in a way that's easily compatible with our test suite. - */ - cl_git_mkfile("committed/file.txt", "some stuff\n"); - - /* Add file to the index */ - cl_git_pass(git_index_add_bypath(index, "file.txt")); - cl_git_pass(git_index_write(index)); - - /* Intentionally not using cl_repo_commit_from_index here so this code - * can be used as an example of how an initial commit is typically - * made to a repository... - */ - - /* Make sure we're ready to use git_signature_default :-) */ - { - git_config *cfg, *local; - cl_git_pass(git_repository_config(&cfg, _repo)); - cl_git_pass(git_config_open_level(&local, cfg, GIT_CONFIG_LEVEL_LOCAL)); - cl_git_pass(git_config_set_string(local, "user.name", "Test User")); - cl_git_pass(git_config_set_string(local, "user.email", "t@example.com")); - git_config_free(local); - git_config_free(cfg); - } - - /* Create a commit with the new contents of the index */ - { - git_signature *sig; - git_oid tree_id, commit_id; - git_tree *tree; - - cl_git_pass(git_signature_default(&sig, _repo)); - cl_git_pass(git_index_write_tree(&tree_id, index)); - cl_git_pass(git_tree_lookup(&tree, _repo, &tree_id)); - - cl_git_pass(git_commit_create_v( - &commit_id, _repo, "HEAD", sig, sig, - NULL, "First", tree, 0)); - - git_tree_free(tree); - git_signature_free(sig); - } - - git_index_free(index); -} - -void test_repo_init__at_filesystem_root(void) -{ - git_repository *repo; - const char *sandbox = clar_sandbox_path(); - git_buf root = GIT_BUF_INIT; - int root_len; - - if (!cl_getenv("GITTEST_INVASIVE_FS_STRUCTURE")) - cl_skip(); - - root_len = git_path_root(sandbox); - cl_assert(root_len >= 0); - - git_buf_put(&root, sandbox, root_len+1); - git_buf_joinpath(&root, root.ptr, "libgit2_test_dir"); - - cl_assert(!git_path_exists(root.ptr)); - - cl_git_pass(git_repository_init(&repo, root.ptr, 0)); - cl_assert(git_path_isdir(root.ptr)); - cl_git_pass(git_futils_rmdir_r(root.ptr, NULL, GIT_RMDIR_REMOVE_FILES)); - - git_buf_free(&root); - git_repository_free(repo); -} diff --git a/vendor/libgit2/tests/repo/iterator.c b/vendor/libgit2/tests/repo/iterator.c deleted file mode 100644 index bb2d3a1867..0000000000 --- a/vendor/libgit2/tests/repo/iterator.c +++ /dev/null @@ -1,991 +0,0 @@ -#include "clar_libgit2.h" -#include "iterator.h" -#include "repository.h" -#include "fileops.h" -#include - -static git_repository *g_repo; - -void test_repo_iterator__initialize(void) -{ -} - -void test_repo_iterator__cleanup(void) -{ - cl_git_sandbox_cleanup(); - g_repo = NULL; -} - -static void expect_iterator_items( - git_iterator *i, - int expected_flat, - const char **expected_flat_paths, - int expected_total, - const char **expected_total_paths) -{ - const git_index_entry *entry; - int count, error; - int no_trees = !(git_iterator_flags(i) & GIT_ITERATOR_INCLUDE_TREES); - bool v = false; - - if (expected_flat < 0) { v = true; expected_flat = -expected_flat; } - if (expected_total < 0) { v = true; expected_total = -expected_total; } - - if (v) fprintf(stderr, "== %s ==\n", no_trees ? "notrees" : "trees"); - - count = 0; - - while (!git_iterator_advance(&entry, i)) { - if (v) fprintf(stderr, " %s %07o\n", entry->path, (int)entry->mode); - - if (no_trees) - cl_assert(entry->mode != GIT_FILEMODE_TREE); - - if (expected_flat_paths) { - const char *expect_path = expected_flat_paths[count]; - size_t expect_len = strlen(expect_path); - - cl_assert_equal_s(expect_path, entry->path); - - if (expect_path[expect_len - 1] == '/') - cl_assert_equal_i(GIT_FILEMODE_TREE, entry->mode); - else - cl_assert(entry->mode != GIT_FILEMODE_TREE); - } - - if (++count > expected_flat) - break; - } - - cl_assert_equal_i(expected_flat, count); - - cl_git_pass(git_iterator_reset(i, NULL, NULL)); - - count = 0; - cl_git_pass(git_iterator_current(&entry, i)); - - if (v) fprintf(stderr, "-- %s --\n", no_trees ? "notrees" : "trees"); - - while (entry != NULL) { - if (v) fprintf(stderr, " %s %07o\n", entry->path, (int)entry->mode); - - if (no_trees) - cl_assert(entry->mode != GIT_FILEMODE_TREE); - - if (expected_total_paths) { - const char *expect_path = expected_total_paths[count]; - size_t expect_len = strlen(expect_path); - - cl_assert_equal_s(expect_path, entry->path); - - if (expect_path[expect_len - 1] == '/') - cl_assert_equal_i(GIT_FILEMODE_TREE, entry->mode); - else - cl_assert(entry->mode != GIT_FILEMODE_TREE); - } - - if (entry->mode == GIT_FILEMODE_TREE) { - error = git_iterator_advance_into(&entry, i); - - /* could return NOTFOUND if directory is empty */ - cl_assert(!error || error == GIT_ENOTFOUND); - - if (error == GIT_ENOTFOUND) { - error = git_iterator_advance(&entry, i); - cl_assert(!error || error == GIT_ITEROVER); - } - } else { - error = git_iterator_advance(&entry, i); - cl_assert(!error || error == GIT_ITEROVER); - } - - if (++count > expected_total) - break; - } - - cl_assert_equal_i(expected_total, count); -} - -/* Index contents (including pseudotrees): - * - * 0: a 5: F 10: k/ 16: L/ - * 1: B 6: g 11: k/1 17: L/1 - * 2: c 7: H 12: k/a 18: L/a - * 3: D 8: i 13: k/B 19: L/B - * 4: e 9: J 14: k/c 20: L/c - * 15: k/D 21: L/D - * - * 0: B 5: L/ 11: a 16: k/ - * 1: D 6: L/1 12: c 17: k/1 - * 2: F 7: L/B 13: e 18: k/B - * 3: H 8: L/D 14: g 19: k/D - * 4: J 9: L/a 15: i 20: k/a - * 10: L/c 21: k/c - */ - -void test_repo_iterator__index(void) -{ - git_iterator *i; - git_index *index; - - g_repo = cl_git_sandbox_init("icase"); - - cl_git_pass(git_repository_index(&index, g_repo)); - - /* autoexpand with no tree entries for index */ - cl_git_pass(git_iterator_for_index(&i, index, 0, NULL, NULL)); - expect_iterator_items(i, 20, NULL, 20, NULL); - git_iterator_free(i); - - /* auto expand with tree entries */ - cl_git_pass(git_iterator_for_index( - &i, index, GIT_ITERATOR_INCLUDE_TREES, NULL, NULL)); - expect_iterator_items(i, 22, NULL, 22, NULL); - git_iterator_free(i); - - /* no auto expand (implies trees included) */ - cl_git_pass(git_iterator_for_index( - &i, index, GIT_ITERATOR_DONT_AUTOEXPAND, NULL, NULL)); - expect_iterator_items(i, 12, NULL, 22, NULL); - git_iterator_free(i); - - git_index_free(index); -} - -void test_repo_iterator__index_icase(void) -{ - git_iterator *i; - git_index *index; - int caps; - - g_repo = cl_git_sandbox_init("icase"); - - cl_git_pass(git_repository_index(&index, g_repo)); - caps = git_index_caps(index); - - /* force case sensitivity */ - cl_git_pass(git_index_set_caps(index, caps & ~GIT_INDEXCAP_IGNORE_CASE)); - - /* autoexpand with no tree entries over range */ - cl_git_pass(git_iterator_for_index(&i, index, 0, "c", "k/D")); - expect_iterator_items(i, 7, NULL, 7, NULL); - git_iterator_free(i); - - cl_git_pass(git_iterator_for_index(&i, index, 0, "k", "k/Z")); - expect_iterator_items(i, 3, NULL, 3, NULL); - git_iterator_free(i); - - /* auto expand with tree entries */ - cl_git_pass(git_iterator_for_index( - &i, index, GIT_ITERATOR_INCLUDE_TREES, "c", "k/D")); - expect_iterator_items(i, 8, NULL, 8, NULL); - git_iterator_free(i); - cl_git_pass(git_iterator_for_index( - &i, index, GIT_ITERATOR_INCLUDE_TREES, "k", "k/Z")); - expect_iterator_items(i, 4, NULL, 4, NULL); - git_iterator_free(i); - - /* no auto expand (implies trees included) */ - cl_git_pass(git_iterator_for_index( - &i, index, GIT_ITERATOR_DONT_AUTOEXPAND, "c", "k/D")); - expect_iterator_items(i, 5, NULL, 8, NULL); - git_iterator_free(i); - - cl_git_pass(git_iterator_for_index( - &i, index, GIT_ITERATOR_DONT_AUTOEXPAND, "k", "k/Z")); - expect_iterator_items(i, 1, NULL, 4, NULL); - git_iterator_free(i); - - /* force case insensitivity */ - cl_git_pass(git_index_set_caps(index, caps | GIT_INDEXCAP_IGNORE_CASE)); - - /* autoexpand with no tree entries over range */ - cl_git_pass(git_iterator_for_index(&i, index, 0, "c", "k/D")); - expect_iterator_items(i, 13, NULL, 13, NULL); - git_iterator_free(i); - - cl_git_pass(git_iterator_for_index(&i, index, 0, "k", "k/Z")); - expect_iterator_items(i, 5, NULL, 5, NULL); - git_iterator_free(i); - - /* auto expand with tree entries */ - cl_git_pass(git_iterator_for_index( - &i, index, GIT_ITERATOR_INCLUDE_TREES, "c", "k/D")); - expect_iterator_items(i, 14, NULL, 14, NULL); - git_iterator_free(i); - - cl_git_pass(git_iterator_for_index( - &i, index, GIT_ITERATOR_INCLUDE_TREES, "k", "k/Z")); - expect_iterator_items(i, 6, NULL, 6, NULL); - git_iterator_free(i); - - /* no auto expand (implies trees included) */ - cl_git_pass(git_iterator_for_index( - &i, index, GIT_ITERATOR_DONT_AUTOEXPAND, "c", "k/D")); - expect_iterator_items(i, 9, NULL, 14, NULL); - git_iterator_free(i); - - cl_git_pass(git_iterator_for_index( - &i, index, GIT_ITERATOR_DONT_AUTOEXPAND, "k", "k/Z")); - expect_iterator_items(i, 1, NULL, 6, NULL); - git_iterator_free(i); - - cl_git_pass(git_index_set_caps(index, caps)); - git_index_free(index); -} - -void test_repo_iterator__tree(void) -{ - git_iterator *i; - git_tree *head; - - g_repo = cl_git_sandbox_init("icase"); - - cl_git_pass(git_repository_head_tree(&head, g_repo)); - - /* auto expand with no tree entries */ - cl_git_pass(git_iterator_for_tree(&i, head, 0, NULL, NULL)); - expect_iterator_items(i, 20, NULL, 20, NULL); - git_iterator_free(i); - - /* auto expand with tree entries */ - cl_git_pass(git_iterator_for_tree( - &i, head, GIT_ITERATOR_INCLUDE_TREES, NULL, NULL)); - expect_iterator_items(i, 22, NULL, 22, NULL); - git_iterator_free(i); - - /* no auto expand (implies trees included) */ - cl_git_pass(git_iterator_for_tree( - &i, head, GIT_ITERATOR_DONT_AUTOEXPAND, NULL, NULL)); - expect_iterator_items(i, 12, NULL, 22, NULL); - git_iterator_free(i); - - git_tree_free(head); -} - -void test_repo_iterator__tree_icase(void) -{ - git_iterator *i; - git_tree *head; - git_iterator_flag_t flag; - - g_repo = cl_git_sandbox_init("icase"); - - cl_git_pass(git_repository_head_tree(&head, g_repo)); - - flag = GIT_ITERATOR_DONT_IGNORE_CASE; - - /* auto expand with no tree entries */ - cl_git_pass(git_iterator_for_tree(&i, head, flag, "c", "k/D")); - expect_iterator_items(i, 7, NULL, 7, NULL); - git_iterator_free(i); - - cl_git_pass(git_iterator_for_tree(&i, head, flag, "k", "k/Z")); - expect_iterator_items(i, 3, NULL, 3, NULL); - git_iterator_free(i); - - /* auto expand with tree entries */ - cl_git_pass(git_iterator_for_tree( - &i, head, flag | GIT_ITERATOR_INCLUDE_TREES, "c", "k/D")); - expect_iterator_items(i, 8, NULL, 8, NULL); - git_iterator_free(i); - - cl_git_pass(git_iterator_for_tree( - &i, head, flag | GIT_ITERATOR_INCLUDE_TREES, "k", "k/Z")); - expect_iterator_items(i, 4, NULL, 4, NULL); - git_iterator_free(i); - - /* no auto expand (implies trees included) */ - cl_git_pass(git_iterator_for_tree( - &i, head, flag | GIT_ITERATOR_DONT_AUTOEXPAND, "c", "k/D")); - expect_iterator_items(i, 5, NULL, 8, NULL); - git_iterator_free(i); - - cl_git_pass(git_iterator_for_tree( - &i, head, flag | GIT_ITERATOR_DONT_AUTOEXPAND, "k", "k/Z")); - expect_iterator_items(i, 1, NULL, 4, NULL); - git_iterator_free(i); - - flag = GIT_ITERATOR_IGNORE_CASE; - - /* auto expand with no tree entries */ - cl_git_pass(git_iterator_for_tree(&i, head, flag, "c", "k/D")); - expect_iterator_items(i, 13, NULL, 13, NULL); - git_iterator_free(i); - - cl_git_pass(git_iterator_for_tree(&i, head, flag, "k", "k/Z")); - expect_iterator_items(i, 5, NULL, 5, NULL); - git_iterator_free(i); - - /* auto expand with tree entries */ - cl_git_pass(git_iterator_for_tree( - &i, head, flag | GIT_ITERATOR_INCLUDE_TREES, "c", "k/D")); - expect_iterator_items(i, 14, NULL, 14, NULL); - git_iterator_free(i); - - cl_git_pass(git_iterator_for_tree( - &i, head, flag | GIT_ITERATOR_INCLUDE_TREES, "k", "k/Z")); - expect_iterator_items(i, 6, NULL, 6, NULL); - git_iterator_free(i); - - /* no auto expand (implies trees included) */ - cl_git_pass(git_iterator_for_tree( - &i, head, flag | GIT_ITERATOR_DONT_AUTOEXPAND, "c", "k/D")); - expect_iterator_items(i, 9, NULL, 14, NULL); - git_iterator_free(i); - - cl_git_pass(git_iterator_for_tree( - &i, head, flag | GIT_ITERATOR_DONT_AUTOEXPAND, "k", "k/Z")); - expect_iterator_items(i, 1, NULL, 6, NULL); - git_iterator_free(i); - - git_tree_free(head); -} - -void test_repo_iterator__tree_more(void) -{ - git_iterator *i; - git_tree *head; - static const char *expect_basic[] = { - "current_file", - "file_deleted", - "modified_file", - "staged_changes", - "staged_changes_file_deleted", - "staged_changes_modified_file", - "staged_delete_file_deleted", - "staged_delete_modified_file", - "subdir.txt", - "subdir/current_file", - "subdir/deleted_file", - "subdir/modified_file", - NULL, - }; - static const char *expect_trees[] = { - "current_file", - "file_deleted", - "modified_file", - "staged_changes", - "staged_changes_file_deleted", - "staged_changes_modified_file", - "staged_delete_file_deleted", - "staged_delete_modified_file", - "subdir.txt", - "subdir/", - "subdir/current_file", - "subdir/deleted_file", - "subdir/modified_file", - NULL, - }; - static const char *expect_noauto[] = { - "current_file", - "file_deleted", - "modified_file", - "staged_changes", - "staged_changes_file_deleted", - "staged_changes_modified_file", - "staged_delete_file_deleted", - "staged_delete_modified_file", - "subdir.txt", - "subdir/", - NULL - }; - - g_repo = cl_git_sandbox_init("status"); - - cl_git_pass(git_repository_head_tree(&head, g_repo)); - - /* auto expand with no tree entries */ - cl_git_pass(git_iterator_for_tree(&i, head, 0, NULL, NULL)); - expect_iterator_items(i, 12, expect_basic, 12, expect_basic); - git_iterator_free(i); - - /* auto expand with tree entries */ - cl_git_pass(git_iterator_for_tree( - &i, head, GIT_ITERATOR_INCLUDE_TREES, NULL, NULL)); - expect_iterator_items(i, 13, expect_trees, 13, expect_trees); - git_iterator_free(i); - - /* no auto expand (implies trees included) */ - cl_git_pass(git_iterator_for_tree( - &i, head, GIT_ITERATOR_DONT_AUTOEXPAND, NULL, NULL)); - expect_iterator_items(i, 10, expect_noauto, 13, expect_trees); - git_iterator_free(i); - - git_tree_free(head); -} - -/* "b=name,t=name", blob_id, tree_id */ -static void build_test_tree( - git_oid *out, git_repository *repo, const char *fmt, ...) -{ - git_oid *id; - git_treebuilder *builder; - const char *scan = fmt, *next; - char type, delimiter; - git_filemode_t mode = GIT_FILEMODE_BLOB; - git_buf name = GIT_BUF_INIT; - va_list arglist; - - cl_git_pass(git_treebuilder_new(&builder, repo, NULL)); /* start builder */ - - va_start(arglist, fmt); - while (*scan) { - switch (type = *scan++) { - case 't': case 'T': mode = GIT_FILEMODE_TREE; break; - case 'b': case 'B': mode = GIT_FILEMODE_BLOB; break; - default: - cl_assert(type == 't' || type == 'T' || type == 'b' || type == 'B'); - } - - delimiter = *scan++; /* read and skip delimiter */ - for (next = scan; *next && *next != delimiter; ++next) - /* seek end */; - cl_git_pass(git_buf_set(&name, scan, (size_t)(next - scan))); - for (scan = next; *scan && (*scan == delimiter || *scan == ','); ++scan) - /* skip delimiter and optional comma */; - - id = va_arg(arglist, git_oid *); - - cl_git_pass(git_treebuilder_insert(NULL, builder, name.ptr, id, mode)); - } - va_end(arglist); - - cl_git_pass(git_treebuilder_write(out, builder)); - - git_treebuilder_free(builder); - git_buf_free(&name); -} - -void test_repo_iterator__tree_case_conflicts_0(void) -{ - const char *blob_sha = "d44e18fb93b7107b5cd1b95d601591d77869a1b6"; - git_tree *tree; - git_oid blob_id, biga_id, littlea_id, tree_id; - git_iterator *i; - const char *expect_cs[] = { - "A/1.file", "A/3.file", "a/2.file", "a/4.file" }; - const char *expect_ci[] = { - "A/1.file", "a/2.file", "A/3.file", "a/4.file" }; - const char *expect_cs_trees[] = { - "A/", "A/1.file", "A/3.file", "a/", "a/2.file", "a/4.file" }; - const char *expect_ci_trees[] = { - "A/", "A/1.file", "a/2.file", "A/3.file", "a/4.file" }; - - g_repo = cl_git_sandbox_init("icase"); - - cl_git_pass(git_oid_fromstr(&blob_id, blob_sha)); /* lookup blob */ - - /* create tree with: A/1.file, A/3.file, a/2.file, a/4.file */ - build_test_tree( - &biga_id, g_repo, "b|1.file|,b|3.file|", &blob_id, &blob_id); - build_test_tree( - &littlea_id, g_repo, "b|2.file|,b|4.file|", &blob_id, &blob_id); - build_test_tree( - &tree_id, g_repo, "t|A|,t|a|", &biga_id, &littlea_id); - - cl_git_pass(git_tree_lookup(&tree, g_repo, &tree_id)); - - cl_git_pass(git_iterator_for_tree( - &i, tree, GIT_ITERATOR_DONT_IGNORE_CASE, NULL, NULL)); - expect_iterator_items(i, 4, expect_cs, 4, expect_cs); - git_iterator_free(i); - - cl_git_pass(git_iterator_for_tree( - &i, tree, GIT_ITERATOR_IGNORE_CASE, NULL, NULL)); - expect_iterator_items(i, 4, expect_ci, 4, expect_ci); - git_iterator_free(i); - - cl_git_pass(git_iterator_for_tree( - &i, tree, GIT_ITERATOR_DONT_IGNORE_CASE | - GIT_ITERATOR_INCLUDE_TREES, NULL, NULL)); - expect_iterator_items(i, 6, expect_cs_trees, 6, expect_cs_trees); - git_iterator_free(i); - - cl_git_pass(git_iterator_for_tree( - &i, tree, GIT_ITERATOR_IGNORE_CASE | - GIT_ITERATOR_INCLUDE_TREES, NULL, NULL)); - expect_iterator_items(i, 5, expect_ci_trees, 5, expect_ci_trees); - git_iterator_free(i); - - git_tree_free(tree); -} - -void test_repo_iterator__tree_case_conflicts_1(void) -{ - const char *blob_sha = "d44e18fb93b7107b5cd1b95d601591d77869a1b6"; - git_tree *tree; - git_oid blob_id, Ab_id, biga_id, littlea_id, tree_id; - git_iterator *i; - const char *expect_cs[] = { - "A/a", "A/b/1", "A/c", "a/C", "a/a", "a/b" }; - const char *expect_ci[] = { - "A/a", "a/b", "A/b/1", "A/c" }; - const char *expect_cs_trees[] = { - "A/", "A/a", "A/b/", "A/b/1", "A/c", "a/", "a/C", "a/a", "a/b" }; - const char *expect_ci_trees[] = { - "A/", "A/a", "a/b", "A/b/", "A/b/1", "A/c" }; - - g_repo = cl_git_sandbox_init("icase"); - - cl_git_pass(git_oid_fromstr(&blob_id, blob_sha)); /* lookup blob */ - - /* create: A/a A/b/1 A/c a/a a/b a/C */ - build_test_tree(&Ab_id, g_repo, "b|1|", &blob_id); - build_test_tree( - &biga_id, g_repo, "b|a|,t|b|,b|c|", &blob_id, &Ab_id, &blob_id); - build_test_tree( - &littlea_id, g_repo, "b|a|,b|b|,b|C|", &blob_id, &blob_id, &blob_id); - build_test_tree( - &tree_id, g_repo, "t|A|,t|a|", &biga_id, &littlea_id); - - cl_git_pass(git_tree_lookup(&tree, g_repo, &tree_id)); - - cl_git_pass(git_iterator_for_tree( - &i, tree, GIT_ITERATOR_DONT_IGNORE_CASE, NULL, NULL)); - expect_iterator_items(i, 6, expect_cs, 6, expect_cs); - git_iterator_free(i); - - cl_git_pass(git_iterator_for_tree( - &i, tree, GIT_ITERATOR_IGNORE_CASE, NULL, NULL)); - expect_iterator_items(i, 4, expect_ci, 4, expect_ci); - git_iterator_free(i); - - cl_git_pass(git_iterator_for_tree( - &i, tree, GIT_ITERATOR_DONT_IGNORE_CASE | - GIT_ITERATOR_INCLUDE_TREES, NULL, NULL)); - expect_iterator_items(i, 9, expect_cs_trees, 9, expect_cs_trees); - git_iterator_free(i); - - cl_git_pass(git_iterator_for_tree( - &i, tree, GIT_ITERATOR_IGNORE_CASE | - GIT_ITERATOR_INCLUDE_TREES, NULL, NULL)); - expect_iterator_items(i, 6, expect_ci_trees, 6, expect_ci_trees); - git_iterator_free(i); - - git_tree_free(tree); -} - -void test_repo_iterator__tree_case_conflicts_2(void) -{ - const char *blob_sha = "d44e18fb93b7107b5cd1b95d601591d77869a1b6"; - git_tree *tree; - git_oid blob_id, d1, d2, c1, c2, b1, b2, a1, a2, tree_id; - git_iterator *i; - const char *expect_cs[] = { - "A/B/C/D/16", "A/B/C/D/foo", "A/B/C/d/15", "A/B/C/d/FOO", - "A/B/c/D/14", "A/B/c/D/foo", "A/B/c/d/13", "A/B/c/d/FOO", - "A/b/C/D/12", "A/b/C/D/foo", "A/b/C/d/11", "A/b/C/d/FOO", - "A/b/c/D/10", "A/b/c/D/foo", "A/b/c/d/09", "A/b/c/d/FOO", - "a/B/C/D/08", "a/B/C/D/foo", "a/B/C/d/07", "a/B/C/d/FOO", - "a/B/c/D/06", "a/B/c/D/foo", "a/B/c/d/05", "a/B/c/d/FOO", - "a/b/C/D/04", "a/b/C/D/foo", "a/b/C/d/03", "a/b/C/d/FOO", - "a/b/c/D/02", "a/b/c/D/foo", "a/b/c/d/01", "a/b/c/d/FOO", }; - const char *expect_ci[] = { - "a/b/c/d/01", "a/b/c/D/02", "a/b/C/d/03", "a/b/C/D/04", - "a/B/c/d/05", "a/B/c/D/06", "a/B/C/d/07", "a/B/C/D/08", - "A/b/c/d/09", "A/b/c/D/10", "A/b/C/d/11", "A/b/C/D/12", - "A/B/c/d/13", "A/B/c/D/14", "A/B/C/d/15", "A/B/C/D/16", - "A/B/C/D/foo", }; - const char *expect_ci_trees[] = { - "A/", "A/B/", "A/B/C/", "A/B/C/D/", - "a/b/c/d/01", "a/b/c/D/02", "a/b/C/d/03", "a/b/C/D/04", - "a/B/c/d/05", "a/B/c/D/06", "a/B/C/d/07", "a/B/C/D/08", - "A/b/c/d/09", "A/b/c/D/10", "A/b/C/d/11", "A/b/C/D/12", - "A/B/c/d/13", "A/B/c/D/14", "A/B/C/d/15", "A/B/C/D/16", - "A/B/C/D/foo", }; - - g_repo = cl_git_sandbox_init("icase"); - - cl_git_pass(git_oid_fromstr(&blob_id, blob_sha)); /* lookup blob */ - - build_test_tree(&d1, g_repo, "b|16|,b|foo|", &blob_id, &blob_id); - build_test_tree(&d2, g_repo, "b|15|,b|FOO|", &blob_id, &blob_id); - build_test_tree(&c1, g_repo, "t|D|,t|d|", &d1, &d2); - build_test_tree(&d1, g_repo, "b|14|,b|foo|", &blob_id, &blob_id); - build_test_tree(&d2, g_repo, "b|13|,b|FOO|", &blob_id, &blob_id); - build_test_tree(&c2, g_repo, "t|D|,t|d|", &d1, &d2); - build_test_tree(&b1, g_repo, "t|C|,t|c|", &c1, &c2); - - build_test_tree(&d1, g_repo, "b|12|,b|foo|", &blob_id, &blob_id); - build_test_tree(&d2, g_repo, "b|11|,b|FOO|", &blob_id, &blob_id); - build_test_tree(&c1, g_repo, "t|D|,t|d|", &d1, &d2); - build_test_tree(&d1, g_repo, "b|10|,b|foo|", &blob_id, &blob_id); - build_test_tree(&d2, g_repo, "b|09|,b|FOO|", &blob_id, &blob_id); - build_test_tree(&c2, g_repo, "t|D|,t|d|", &d1, &d2); - build_test_tree(&b2, g_repo, "t|C|,t|c|", &c1, &c2); - - build_test_tree(&a1, g_repo, "t|B|,t|b|", &b1, &b2); - - build_test_tree(&d1, g_repo, "b|08|,b|foo|", &blob_id, &blob_id); - build_test_tree(&d2, g_repo, "b|07|,b|FOO|", &blob_id, &blob_id); - build_test_tree(&c1, g_repo, "t|D|,t|d|", &d1, &d2); - build_test_tree(&d1, g_repo, "b|06|,b|foo|", &blob_id, &blob_id); - build_test_tree(&d2, g_repo, "b|05|,b|FOO|", &blob_id, &blob_id); - build_test_tree(&c2, g_repo, "t|D|,t|d|", &d1, &d2); - build_test_tree(&b1, g_repo, "t|C|,t|c|", &c1, &c2); - - build_test_tree(&d1, g_repo, "b|04|,b|foo|", &blob_id, &blob_id); - build_test_tree(&d2, g_repo, "b|03|,b|FOO|", &blob_id, &blob_id); - build_test_tree(&c1, g_repo, "t|D|,t|d|", &d1, &d2); - build_test_tree(&d1, g_repo, "b|02|,b|foo|", &blob_id, &blob_id); - build_test_tree(&d2, g_repo, "b|01|,b|FOO|", &blob_id, &blob_id); - build_test_tree(&c2, g_repo, "t|D|,t|d|", &d1, &d2); - build_test_tree(&b2, g_repo, "t|C|,t|c|", &c1, &c2); - - build_test_tree(&a2, g_repo, "t|B|,t|b|", &b1, &b2); - - build_test_tree(&tree_id, g_repo, "t/A/,t/a/", &a1, &a2); - - cl_git_pass(git_tree_lookup(&tree, g_repo, &tree_id)); - - cl_git_pass(git_iterator_for_tree( - &i, tree, GIT_ITERATOR_DONT_IGNORE_CASE, NULL, NULL)); - expect_iterator_items(i, 32, expect_cs, 32, expect_cs); - git_iterator_free(i); - - cl_git_pass(git_iterator_for_tree( - &i, tree, GIT_ITERATOR_IGNORE_CASE, NULL, NULL)); - expect_iterator_items(i, 17, expect_ci, 17, expect_ci); - git_iterator_free(i); - - cl_git_pass(git_iterator_for_tree( - &i, tree, GIT_ITERATOR_IGNORE_CASE | - GIT_ITERATOR_INCLUDE_TREES, NULL, NULL)); - expect_iterator_items(i, 21, expect_ci_trees, 21, expect_ci_trees); - git_iterator_free(i); - - git_tree_free(tree); -} - -void test_repo_iterator__workdir(void) -{ - git_iterator *i; - - g_repo = cl_git_sandbox_init("icase"); - - /* auto expand with no tree entries */ - cl_git_pass(git_iterator_for_workdir(&i, g_repo, NULL, NULL, 0, NULL, NULL)); - expect_iterator_items(i, 20, NULL, 20, NULL); - git_iterator_free(i); - - /* auto expand with tree entries */ - cl_git_pass(git_iterator_for_workdir( - &i, g_repo, NULL, NULL, GIT_ITERATOR_INCLUDE_TREES, NULL, NULL)); - expect_iterator_items(i, 22, NULL, 22, NULL); - git_iterator_free(i); - - /* no auto expand (implies trees included) */ - cl_git_pass(git_iterator_for_workdir( - &i, g_repo, NULL, NULL, GIT_ITERATOR_DONT_AUTOEXPAND, NULL, NULL)); - expect_iterator_items(i, 12, NULL, 22, NULL); - git_iterator_free(i); -} - -void test_repo_iterator__workdir_icase(void) -{ - git_iterator *i; - git_iterator_flag_t flag; - - g_repo = cl_git_sandbox_init("icase"); - - flag = GIT_ITERATOR_DONT_IGNORE_CASE; - - /* auto expand with no tree entries */ - cl_git_pass(git_iterator_for_workdir(&i, g_repo, NULL, NULL, flag, "c", "k/D")); - expect_iterator_items(i, 7, NULL, 7, NULL); - git_iterator_free(i); - - cl_git_pass(git_iterator_for_workdir(&i, g_repo, NULL, NULL, flag, "k", "k/Z")); - expect_iterator_items(i, 3, NULL, 3, NULL); - git_iterator_free(i); - - /* auto expand with tree entries */ - cl_git_pass(git_iterator_for_workdir( - &i, g_repo, NULL, NULL, flag | GIT_ITERATOR_INCLUDE_TREES, "c", "k/D")); - expect_iterator_items(i, 8, NULL, 8, NULL); - git_iterator_free(i); - - cl_git_pass(git_iterator_for_workdir( - &i, g_repo, NULL, NULL, flag | GIT_ITERATOR_INCLUDE_TREES, "k", "k/Z")); - expect_iterator_items(i, 4, NULL, 4, NULL); - git_iterator_free(i); - - /* no auto expand (implies trees included) */ - cl_git_pass(git_iterator_for_workdir( - &i, g_repo, NULL, NULL, flag | GIT_ITERATOR_DONT_AUTOEXPAND, "c", "k/D")); - expect_iterator_items(i, 5, NULL, 8, NULL); - git_iterator_free(i); - - cl_git_pass(git_iterator_for_workdir( - &i, g_repo, NULL, NULL, flag | GIT_ITERATOR_DONT_AUTOEXPAND, "k", "k/Z")); - expect_iterator_items(i, 1, NULL, 4, NULL); - git_iterator_free(i); - - flag = GIT_ITERATOR_IGNORE_CASE; - - /* auto expand with no tree entries */ - cl_git_pass(git_iterator_for_workdir(&i, g_repo, NULL, NULL, flag, "c", "k/D")); - expect_iterator_items(i, 13, NULL, 13, NULL); - git_iterator_free(i); - - cl_git_pass(git_iterator_for_workdir(&i, g_repo, NULL, NULL, flag, "k", "k/Z")); - expect_iterator_items(i, 5, NULL, 5, NULL); - git_iterator_free(i); - - /* auto expand with tree entries */ - cl_git_pass(git_iterator_for_workdir( - &i, g_repo, NULL, NULL, flag | GIT_ITERATOR_INCLUDE_TREES, "c", "k/D")); - expect_iterator_items(i, 14, NULL, 14, NULL); - git_iterator_free(i); - - cl_git_pass(git_iterator_for_workdir( - &i, g_repo, NULL, NULL, flag | GIT_ITERATOR_INCLUDE_TREES, "k", "k/Z")); - expect_iterator_items(i, 6, NULL, 6, NULL); - git_iterator_free(i); - - /* no auto expand (implies trees included) */ - cl_git_pass(git_iterator_for_workdir( - &i, g_repo, NULL, NULL, flag | GIT_ITERATOR_DONT_AUTOEXPAND, "c", "k/D")); - expect_iterator_items(i, 9, NULL, 14, NULL); - git_iterator_free(i); - - cl_git_pass(git_iterator_for_workdir( - &i, g_repo, NULL, NULL, flag | GIT_ITERATOR_DONT_AUTOEXPAND, "k", "k/Z")); - expect_iterator_items(i, 1, NULL, 6, NULL); - git_iterator_free(i); -} - -static void build_workdir_tree(const char *root, int dirs, int subs) -{ - int i, j; - char buf[64], sub[64]; - - for (i = 0; i < dirs; ++i) { - if (i % 2 == 0) { - p_snprintf(buf, sizeof(buf), "%s/dir%02d", root, i); - cl_git_pass(git_futils_mkdir(buf, NULL, 0775, GIT_MKDIR_PATH)); - - p_snprintf(buf, sizeof(buf), "%s/dir%02d/file", root, i); - cl_git_mkfile(buf, buf); - buf[strlen(buf) - 5] = '\0'; - } else { - p_snprintf(buf, sizeof(buf), "%s/DIR%02d", root, i); - cl_git_pass(git_futils_mkdir(buf, NULL, 0775, GIT_MKDIR_PATH)); - } - - for (j = 0; j < subs; ++j) { - switch (j % 4) { - case 0: p_snprintf(sub, sizeof(sub), "%s/sub%02d", buf, j); break; - case 1: p_snprintf(sub, sizeof(sub), "%s/sUB%02d", buf, j); break; - case 2: p_snprintf(sub, sizeof(sub), "%s/Sub%02d", buf, j); break; - case 3: p_snprintf(sub, sizeof(sub), "%s/SUB%02d", buf, j); break; - } - cl_git_pass(git_futils_mkdir(sub, NULL, 0775, GIT_MKDIR_PATH)); - - if (j % 2 == 0) { - size_t sublen = strlen(sub); - memcpy(&sub[sublen], "/file", sizeof("/file")); - cl_git_mkfile(sub, sub); - sub[sublen] = '\0'; - } - } - } -} - -void test_repo_iterator__workdir_depth(void) -{ - git_iterator *iter; - - g_repo = cl_git_sandbox_init("icase"); - - build_workdir_tree("icase", 10, 10); - build_workdir_tree("icase/DIR01/sUB01", 50, 0); - build_workdir_tree("icase/dir02/sUB01", 50, 0); - - /* auto expand with no tree entries */ - cl_git_pass(git_iterator_for_workdir(&iter, g_repo, NULL, NULL, 0, NULL, NULL)); - expect_iterator_items(iter, 125, NULL, 125, NULL); - git_iterator_free(iter); - - /* auto expand with tree entries (empty dirs silently skipped) */ - cl_git_pass(git_iterator_for_workdir( - &iter, g_repo, NULL, NULL, GIT_ITERATOR_INCLUDE_TREES, NULL, NULL)); - expect_iterator_items(iter, 337, NULL, 337, NULL); - git_iterator_free(iter); -} - -void test_repo_iterator__fs(void) -{ - git_iterator *i; - static const char *expect_base[] = { - "DIR01/Sub02/file", - "DIR01/sub00/file", - "current_file", - "dir00/Sub02/file", - "dir00/file", - "dir00/sub00/file", - "modified_file", - "new_file", - NULL, - }; - static const char *expect_trees[] = { - "DIR01/", - "DIR01/SUB03/", - "DIR01/Sub02/", - "DIR01/Sub02/file", - "DIR01/sUB01/", - "DIR01/sub00/", - "DIR01/sub00/file", - "current_file", - "dir00/", - "dir00/SUB03/", - "dir00/Sub02/", - "dir00/Sub02/file", - "dir00/file", - "dir00/sUB01/", - "dir00/sub00/", - "dir00/sub00/file", - "modified_file", - "new_file", - NULL, - }; - static const char *expect_noauto[] = { - "DIR01/", - "current_file", - "dir00/", - "modified_file", - "new_file", - NULL, - }; - - g_repo = cl_git_sandbox_init("status"); - - build_workdir_tree("status/subdir", 2, 4); - - cl_git_pass(git_iterator_for_filesystem( - &i, "status/subdir", 0, NULL, NULL)); - expect_iterator_items(i, 8, expect_base, 8, expect_base); - git_iterator_free(i); - - cl_git_pass(git_iterator_for_filesystem( - &i, "status/subdir", GIT_ITERATOR_INCLUDE_TREES, NULL, NULL)); - expect_iterator_items(i, 18, expect_trees, 18, expect_trees); - git_iterator_free(i); - - cl_git_pass(git_iterator_for_filesystem( - &i, "status/subdir", GIT_ITERATOR_DONT_AUTOEXPAND, NULL, NULL)); - expect_iterator_items(i, 5, expect_noauto, 18, expect_trees); - git_iterator_free(i); - - git__tsort((void **)expect_base, 8, (git__tsort_cmp)git__strcasecmp); - git__tsort((void **)expect_trees, 18, (git__tsort_cmp)git__strcasecmp); - git__tsort((void **)expect_noauto, 5, (git__tsort_cmp)git__strcasecmp); - - cl_git_pass(git_iterator_for_filesystem( - &i, "status/subdir", GIT_ITERATOR_IGNORE_CASE, NULL, NULL)); - expect_iterator_items(i, 8, expect_base, 8, expect_base); - git_iterator_free(i); - - cl_git_pass(git_iterator_for_filesystem( - &i, "status/subdir", GIT_ITERATOR_IGNORE_CASE | - GIT_ITERATOR_INCLUDE_TREES, NULL, NULL)); - expect_iterator_items(i, 18, expect_trees, 18, expect_trees); - git_iterator_free(i); - - cl_git_pass(git_iterator_for_filesystem( - &i, "status/subdir", GIT_ITERATOR_IGNORE_CASE | - GIT_ITERATOR_DONT_AUTOEXPAND, NULL, NULL)); - expect_iterator_items(i, 5, expect_noauto, 18, expect_trees); - git_iterator_free(i); -} - -void test_repo_iterator__fs2(void) -{ - git_iterator *i; - static const char *expect_base[] = { - "heads/br2", - "heads/dir", - "heads/ident", - "heads/long-file-name", - "heads/master", - "heads/packed-test", - "heads/subtrees", - "heads/test", - "tags/e90810b", - "tags/foo/bar", - "tags/foo/foo/bar", - "tags/point_to_blob", - "tags/test", - NULL, - }; - - g_repo = cl_git_sandbox_init("testrepo"); - - cl_git_pass(git_iterator_for_filesystem( - &i, "testrepo/.git/refs", 0, NULL, NULL)); - expect_iterator_items(i, 13, expect_base, 13, expect_base); - git_iterator_free(i); -} - -void test_repo_iterator__unreadable_dir(void) -{ - git_iterator *i; - const git_index_entry *e; - - if (!cl_is_chmod_supported()) - return; - - g_repo = cl_git_sandbox_init("empty_standard_repo"); - - cl_must_pass(p_mkdir("empty_standard_repo/r", 0777)); - cl_git_mkfile("empty_standard_repo/r/a", "hello"); - cl_must_pass(p_mkdir("empty_standard_repo/r/b", 0777)); - cl_git_mkfile("empty_standard_repo/r/b/problem", "not me"); - cl_must_pass(p_chmod("empty_standard_repo/r/b", 0000)); - cl_must_pass(p_mkdir("empty_standard_repo/r/c", 0777)); - cl_git_mkfile("empty_standard_repo/r/d", "final"); - - cl_git_pass(git_iterator_for_filesystem( - &i, "empty_standard_repo/r", 0, NULL, NULL)); - - cl_git_pass(git_iterator_advance(&e, i)); /* a */ - cl_git_fail(git_iterator_advance(&e, i)); /* b */ - cl_assert_equal_i(GIT_ITEROVER, git_iterator_advance(&e, i)); - - cl_must_pass(p_chmod("empty_standard_repo/r/b", 0777)); - - git_iterator_free(i); -} - -void test_repo_iterator__skips_fifos_and_such(void) -{ -#ifndef GIT_WIN32 - git_iterator *i; - const git_index_entry *e; - - g_repo = cl_git_sandbox_init("empty_standard_repo"); - - cl_must_pass(p_mkdir("empty_standard_repo/dir", 0777)); - cl_git_mkfile("empty_standard_repo/file", "not me"); - - cl_assert(!mkfifo("empty_standard_repo/fifo", 0777)); - cl_assert(!access("empty_standard_repo/fifo", F_OK)); - - cl_git_pass(git_iterator_for_filesystem( - &i, "empty_standard_repo", GIT_ITERATOR_INCLUDE_TREES | - GIT_ITERATOR_DONT_AUTOEXPAND, NULL, NULL)); - - cl_git_pass(git_iterator_advance(&e, i)); /* .git */ - cl_assert(S_ISDIR(e->mode)); - cl_git_pass(git_iterator_advance(&e, i)); /* dir */ - cl_assert(S_ISDIR(e->mode)); - /* skips fifo */ - cl_git_pass(git_iterator_advance(&e, i)); /* file */ - cl_assert(S_ISREG(e->mode)); - - cl_assert_equal_i(GIT_ITEROVER, git_iterator_advance(&e, i)); - - git_iterator_free(i); -#endif -} diff --git a/vendor/libgit2/tests/repo/message.c b/vendor/libgit2/tests/repo/message.c deleted file mode 100644 index 87574590b2..0000000000 --- a/vendor/libgit2/tests/repo/message.c +++ /dev/null @@ -1,39 +0,0 @@ -#include "clar_libgit2.h" -#include "buffer.h" -#include "refs.h" -#include "posix.h" - -static git_repository *_repo; - -void test_repo_message__initialize(void) -{ - _repo = cl_git_sandbox_init("testrepo.git"); -} - -void test_repo_message__cleanup(void) -{ - cl_git_sandbox_cleanup(); -} - -void test_repo_message__none(void) -{ - git_buf actual = GIT_BUF_INIT; - cl_assert_equal_i(GIT_ENOTFOUND, git_repository_message(&actual, _repo)); -} - -void test_repo_message__message(void) -{ - git_buf path = GIT_BUF_INIT, actual = GIT_BUF_INIT; - const char expected[] = "Test\n\nThis is a test of the emergency broadcast system\n"; - - cl_git_pass(git_buf_joinpath(&path, git_repository_path(_repo), "MERGE_MSG")); - cl_git_mkfile(git_buf_cstr(&path), expected); - - cl_git_pass(git_repository_message(&actual, _repo)); - cl_assert_equal_s(expected, git_buf_cstr(&actual)); - git_buf_free(&actual); - - cl_git_pass(p_unlink(git_buf_cstr(&path))); - cl_assert_equal_i(GIT_ENOTFOUND, git_repository_message(&actual, _repo)); - git_buf_free(&path); -} diff --git a/vendor/libgit2/tests/repo/new.c b/vendor/libgit2/tests/repo/new.c deleted file mode 100644 index d77e903f67..0000000000 --- a/vendor/libgit2/tests/repo/new.c +++ /dev/null @@ -1,27 +0,0 @@ -#include "clar_libgit2.h" -#include "git2/sys/repository.h" - -void test_repo_new__has_nothing(void) -{ - git_repository *repo; - - cl_git_pass(git_repository_new(&repo)); - cl_assert_equal_b(true, git_repository_is_bare(repo)); - cl_assert_equal_p(NULL, git_repository_path(repo)); - cl_assert_equal_p(NULL, git_repository_workdir(repo)); - git_repository_free(repo); -} - -void test_repo_new__is_bare_until_workdir_set(void) -{ - git_repository *repo; - - cl_git_pass(git_repository_new(&repo)); - cl_assert_equal_b(true, git_repository_is_bare(repo)); - - cl_git_pass(git_repository_set_workdir(repo, clar_sandbox_path(), 0)); - cl_assert_equal_b(false, git_repository_is_bare(repo)); - - git_repository_free(repo); -} - diff --git a/vendor/libgit2/tests/repo/open.c b/vendor/libgit2/tests/repo/open.c deleted file mode 100644 index eb459e51d6..0000000000 --- a/vendor/libgit2/tests/repo/open.c +++ /dev/null @@ -1,396 +0,0 @@ -#include "clar_libgit2.h" -#include "fileops.h" -#include "sysdir.h" -#include - -void test_repo_open__cleanup(void) -{ - cl_git_sandbox_cleanup(); - - if (git_path_isdir("alternate")) - git_futils_rmdir_r("alternate", NULL, GIT_RMDIR_REMOVE_FILES); -} - -void test_repo_open__bare_empty_repo(void) -{ - git_repository *repo = cl_git_sandbox_init("empty_bare.git"); - - cl_assert(git_repository_path(repo) != NULL); - cl_assert(git__suffixcmp(git_repository_path(repo), "/") == 0); - cl_assert(git_repository_workdir(repo) == NULL); -} - -void test_repo_open__format_version_1(void) -{ - git_repository *repo; - git_config *config; - - repo = cl_git_sandbox_init("empty_bare.git"); - - cl_git_pass(git_repository_open(&repo, "empty_bare.git")); - cl_git_pass(git_repository_config(&config, repo)); - - cl_git_pass(git_config_set_int32(config, "core.repositoryformatversion", 1)); - - git_config_free(config); - git_repository_free(repo); - cl_git_fail(git_repository_open(&repo, "empty_bare.git")); -} - -void test_repo_open__standard_empty_repo_through_gitdir(void) -{ - git_repository *repo; - - cl_git_pass(git_repository_open(&repo, cl_fixture("empty_standard_repo/.gitted"))); - - cl_assert(git_repository_path(repo) != NULL); - cl_assert(git__suffixcmp(git_repository_path(repo), "/") == 0); - - cl_assert(git_repository_workdir(repo) != NULL); - cl_assert(git__suffixcmp(git_repository_workdir(repo), "/") == 0); - - git_repository_free(repo); -} - -void test_repo_open__standard_empty_repo_through_workdir(void) -{ - git_repository *repo = cl_git_sandbox_init("empty_standard_repo"); - - cl_assert(git_repository_path(repo) != NULL); - cl_assert(git__suffixcmp(git_repository_path(repo), "/") == 0); - - cl_assert(git_repository_workdir(repo) != NULL); - cl_assert(git__suffixcmp(git_repository_workdir(repo), "/") == 0); -} - - -void test_repo_open__open_with_discover(void) -{ - static const char *variants[] = { - "attr", "attr/", "attr/.git", "attr/.git/", - "attr/sub", "attr/sub/", "attr/sub/sub", "attr/sub/sub/", - NULL - }; - git_repository *repo; - const char **scan; - - cl_fixture_sandbox("attr"); - cl_git_pass(p_rename("attr/.gitted", "attr/.git")); - - for (scan = variants; *scan != NULL; scan++) { - cl_git_pass(git_repository_open_ext(&repo, *scan, 0, NULL)); - cl_assert(git__suffixcmp(git_repository_path(repo), "attr/.git/") == 0); - cl_assert(git__suffixcmp(git_repository_workdir(repo), "attr/") == 0); - git_repository_free(repo); - } - - cl_fixture_cleanup("attr"); -} - -static void make_gitlink_dir(const char *dir, const char *linktext) -{ - git_buf path = GIT_BUF_INIT; - - cl_git_pass(git_futils_mkdir(dir, NULL, 0777, GIT_MKDIR_VERIFY_DIR)); - cl_git_pass(git_buf_joinpath(&path, dir, ".git")); - cl_git_rewritefile(path.ptr, linktext); - git_buf_free(&path); -} - -void test_repo_open__gitlinked(void) -{ - /* need to have both repo dir and workdir set up correctly */ - git_repository *repo = cl_git_sandbox_init("empty_standard_repo"); - git_repository *repo2; - - make_gitlink_dir("alternate", "gitdir: ../empty_standard_repo/.git"); - - cl_git_pass(git_repository_open(&repo2, "alternate")); - - cl_assert(git_repository_path(repo2) != NULL); - cl_assert_(git__suffixcmp(git_repository_path(repo2), "empty_standard_repo/.git/") == 0, git_repository_path(repo2)); - cl_assert_equal_s(git_repository_path(repo), git_repository_path(repo2)); - - cl_assert(git_repository_workdir(repo2) != NULL); - cl_assert_(git__suffixcmp(git_repository_workdir(repo2), "alternate/") == 0, git_repository_workdir(repo2)); - - git_repository_free(repo2); -} - -void test_repo_open__from_git_new_workdir(void) -{ -#ifndef GIT_WIN32 - /* The git-new-workdir script that ships with git sets up a bunch of - * symlinks to create a second workdir that shares the object db with - * another checkout. Libgit2 can open a repo that has been configured - * this way. - */ - - git_repository *repo2; - git_buf link_tgt = GIT_BUF_INIT, link = GIT_BUF_INIT, body = GIT_BUF_INIT; - const char **scan; - int link_fd; - static const char *links[] = { - "config", "refs", "logs/refs", "objects", "info", "hooks", - "packed-refs", "remotes", "rr-cache", "svn", NULL - }; - static const char *copies[] = { - "HEAD", NULL - }; - - cl_git_sandbox_init("empty_standard_repo"); - - cl_git_pass(p_mkdir("alternate", 0777)); - cl_git_pass(p_mkdir("alternate/.git", 0777)); - - for (scan = links; *scan != NULL; scan++) { - git_buf_joinpath(&link_tgt, "empty_standard_repo/.git", *scan); - if (git_path_exists(link_tgt.ptr)) { - git_buf_joinpath(&link_tgt, "../../empty_standard_repo/.git", *scan); - git_buf_joinpath(&link, "alternate/.git", *scan); - if (strchr(*scan, '/')) - git_futils_mkpath2file(link.ptr, 0777); - cl_assert_(symlink(link_tgt.ptr, link.ptr) == 0, strerror(errno)); - } - } - for (scan = copies; *scan != NULL; scan++) { - git_buf_joinpath(&link_tgt, "empty_standard_repo/.git", *scan); - if (git_path_exists(link_tgt.ptr)) { - git_buf_joinpath(&link, "alternate/.git", *scan); - cl_git_pass(git_futils_readbuffer(&body, link_tgt.ptr)); - - cl_assert((link_fd = git_futils_creat_withpath(link.ptr, 0777, 0666)) >= 0); - cl_must_pass(p_write(link_fd, body.ptr, body.size)); - p_close(link_fd); - } - } - - git_buf_free(&link_tgt); - git_buf_free(&link); - git_buf_free(&body); - - - cl_git_pass(git_repository_open(&repo2, "alternate")); - - cl_assert(git_repository_path(repo2) != NULL); - cl_assert_(git__suffixcmp(git_repository_path(repo2), "alternate/.git/") == 0, git_repository_path(repo2)); - - cl_assert(git_repository_workdir(repo2) != NULL); - cl_assert_(git__suffixcmp(git_repository_workdir(repo2), "alternate/") == 0, git_repository_workdir(repo2)); - - git_repository_free(repo2); -#endif -} - -void test_repo_open__failures(void) -{ - git_repository *base, *repo; - git_buf ceiling = GIT_BUF_INIT; - - base = cl_git_sandbox_init("attr"); - cl_git_pass(git_buf_sets(&ceiling, git_repository_workdir(base))); - - /* fail with no searching */ - cl_git_fail(git_repository_open(&repo, "attr/sub")); - cl_git_fail(git_repository_open_ext( - &repo, "attr/sub", GIT_REPOSITORY_OPEN_NO_SEARCH, NULL)); - - /* fail with ceiling too low */ - cl_git_pass(git_buf_joinpath(&ceiling, ceiling.ptr, "sub")); - cl_git_fail(git_repository_open_ext(&repo, "attr/sub", 0, ceiling.ptr)); - - /* fail with no repo */ - cl_git_pass(p_mkdir("alternate", 0777)); - cl_git_pass(p_mkdir("alternate/.git", 0777)); - cl_git_fail(git_repository_open_ext(&repo, "alternate", 0, NULL)); - cl_git_fail(git_repository_open_ext(&repo, "alternate/.git", 0, NULL)); - - git_buf_free(&ceiling); -} - -void test_repo_open__bad_gitlinks(void) -{ - git_repository *repo; - static const char *bad_links[] = { - "garbage\n", "gitdir", "gitdir:\n", "gitdir: foobar", - "gitdir: ../invalid", "gitdir: ../invalid2", - "gitdir: ../attr/.git with extra stuff", - NULL - }; - const char **scan; - - cl_git_sandbox_init("attr"); - - cl_git_pass(p_mkdir("invalid", 0777)); - cl_git_pass(git_futils_mkdir_r("invalid2/.git", NULL, 0777)); - - for (scan = bad_links; *scan != NULL; scan++) { - make_gitlink_dir("alternate", *scan); - cl_git_fail(git_repository_open_ext(&repo, "alternate", 0, NULL)); - } - - git_futils_rmdir_r("invalid", NULL, GIT_RMDIR_REMOVE_FILES); - git_futils_rmdir_r("invalid2", NULL, GIT_RMDIR_REMOVE_FILES); -} - -#ifdef GIT_WIN32 -static void unposix_path(git_buf *path) -{ - char *src, *tgt; - - src = tgt = path->ptr; - - /* convert "/d/..." to "d:\..." */ - if (src[0] == '/' && isalpha(src[1]) && src[2] == '/') { - *tgt++ = src[1]; - *tgt++ = ':'; - *tgt++ = '\\'; - src += 3; - } - - while (*src) { - *tgt++ = (*src == '/') ? '\\' : *src; - src++; - } - - *tgt = '\0'; -} -#endif - -void test_repo_open__win32_path(void) -{ -#ifdef GIT_WIN32 - git_repository *repo = cl_git_sandbox_init("empty_standard_repo"), *repo2; - git_buf winpath = GIT_BUF_INIT; - static const char *repo_path = "empty_standard_repo/.git/"; - static const char *repo_wd = "empty_standard_repo/"; - - cl_assert(git__suffixcmp(git_repository_path(repo), repo_path) == 0); - cl_assert(git__suffixcmp(git_repository_workdir(repo), repo_wd) == 0); - - cl_git_pass(git_buf_sets(&winpath, git_repository_path(repo))); - unposix_path(&winpath); - cl_git_pass(git_repository_open(&repo2, winpath.ptr)); - cl_assert(git__suffixcmp(git_repository_path(repo2), repo_path) == 0); - cl_assert(git__suffixcmp(git_repository_workdir(repo2), repo_wd) == 0); - git_repository_free(repo2); - - cl_git_pass(git_buf_sets(&winpath, git_repository_path(repo))); - git_buf_truncate(&winpath, winpath.size - 1); /* remove trailing '/' */ - unposix_path(&winpath); - cl_git_pass(git_repository_open(&repo2, winpath.ptr)); - cl_assert(git__suffixcmp(git_repository_path(repo2), repo_path) == 0); - cl_assert(git__suffixcmp(git_repository_workdir(repo2), repo_wd) == 0); - git_repository_free(repo2); - - cl_git_pass(git_buf_sets(&winpath, git_repository_workdir(repo))); - unposix_path(&winpath); - cl_git_pass(git_repository_open(&repo2, winpath.ptr)); - cl_assert(git__suffixcmp(git_repository_path(repo2), repo_path) == 0); - cl_assert(git__suffixcmp(git_repository_workdir(repo2), repo_wd) == 0); - git_repository_free(repo2); - - cl_git_pass(git_buf_sets(&winpath, git_repository_workdir(repo))); - git_buf_truncate(&winpath, winpath.size - 1); /* remove trailing '/' */ - unposix_path(&winpath); - cl_git_pass(git_repository_open(&repo2, winpath.ptr)); - cl_assert(git__suffixcmp(git_repository_path(repo2), repo_path) == 0); - cl_assert(git__suffixcmp(git_repository_workdir(repo2), repo_wd) == 0); - git_repository_free(repo2); - - git_buf_free(&winpath); -#endif -} - -void test_repo_open__opening_a_non_existing_repository_returns_ENOTFOUND(void) -{ - git_repository *repo; - cl_assert_equal_i(GIT_ENOTFOUND, git_repository_open(&repo, "i-do-not/exist")); -} - -void test_repo_open__no_config(void) -{ - git_buf path = GIT_BUF_INIT; - git_repository *repo; - git_config *config; - - cl_fixture_sandbox("empty_standard_repo"); - cl_git_pass(cl_rename( - "empty_standard_repo/.gitted", "empty_standard_repo/.git")); - - /* remove local config */ - cl_git_pass(git_futils_rmdir_r( - "empty_standard_repo/.git/config", NULL, GIT_RMDIR_REMOVE_FILES)); - - /* isolate from system level configs */ - cl_must_pass(p_mkdir("alternate", 0777)); - cl_git_pass(git_path_prettify(&path, "alternate", NULL)); - cl_git_pass(git_libgit2_opts( - GIT_OPT_SET_SEARCH_PATH, GIT_CONFIG_LEVEL_GLOBAL, path.ptr)); - cl_git_pass(git_libgit2_opts( - GIT_OPT_SET_SEARCH_PATH, GIT_CONFIG_LEVEL_SYSTEM, path.ptr)); - cl_git_pass(git_libgit2_opts( - GIT_OPT_SET_SEARCH_PATH, GIT_CONFIG_LEVEL_XDG, path.ptr)); - - git_buf_free(&path); - - cl_git_pass(git_repository_open(&repo, "empty_standard_repo")); - cl_git_pass(git_repository_config(&config, repo)); - - cl_git_pass(git_config_set_string(config, "test.set", "42")); - - git_config_free(config); - git_repository_free(repo); - cl_fixture_cleanup("empty_standard_repo"); - - cl_sandbox_set_search_path_defaults(); -} - -void test_repo_open__force_bare(void) -{ - /* need to have both repo dir and workdir set up correctly */ - git_repository *repo = cl_git_sandbox_init("empty_standard_repo"); - git_repository *barerepo; - - make_gitlink_dir("alternate", "gitdir: ../empty_standard_repo/.git"); - - cl_assert(!git_repository_is_bare(repo)); - - cl_git_pass(git_repository_open(&barerepo, "alternate")); - cl_assert(!git_repository_is_bare(barerepo)); - git_repository_free(barerepo); - - cl_git_pass(git_repository_open_bare( - &barerepo, "empty_standard_repo/.git")); - cl_assert(git_repository_is_bare(barerepo)); - git_repository_free(barerepo); - - cl_git_fail(git_repository_open_bare(&barerepo, "alternate/.git")); - - cl_git_pass(git_repository_open_ext( - &barerepo, "alternate/.git", GIT_REPOSITORY_OPEN_BARE, NULL)); - cl_assert(git_repository_is_bare(barerepo)); - git_repository_free(barerepo); - - cl_git_pass(p_mkdir("empty_standard_repo/subdir", 0777)); - cl_git_mkfile("empty_standard_repo/subdir/something.txt", "something"); - - cl_git_fail(git_repository_open_bare( - &barerepo, "empty_standard_repo/subdir")); - - cl_git_pass(git_repository_open_ext( - &barerepo, "empty_standard_repo/subdir", GIT_REPOSITORY_OPEN_BARE, NULL)); - cl_assert(git_repository_is_bare(barerepo)); - git_repository_free(barerepo); - - cl_git_pass(p_mkdir("alternate/subdir", 0777)); - cl_git_pass(p_mkdir("alternate/subdir/sub2", 0777)); - cl_git_mkfile("alternate/subdir/sub2/something.txt", "something"); - - cl_git_fail(git_repository_open_bare(&barerepo, "alternate/subdir/sub2")); - - cl_git_pass(git_repository_open_ext( - &barerepo, "alternate/subdir/sub2", GIT_REPOSITORY_OPEN_BARE, NULL)); - cl_assert(git_repository_is_bare(barerepo)); - git_repository_free(barerepo); -} diff --git a/vendor/libgit2/tests/repo/pathspec.c b/vendor/libgit2/tests/repo/pathspec.c deleted file mode 100644 index 5b86662bcf..0000000000 --- a/vendor/libgit2/tests/repo/pathspec.c +++ /dev/null @@ -1,385 +0,0 @@ -#include "clar_libgit2.h" -#include "git2/pathspec.h" - -static git_repository *g_repo; - -void test_repo_pathspec__initialize(void) -{ - g_repo = cl_git_sandbox_init("status"); -} - -void test_repo_pathspec__cleanup(void) -{ - cl_git_sandbox_cleanup(); - g_repo = NULL; -} - -static char *str0[] = { "*_file", "new_file", "garbage" }; -static char *str1[] = { "*_FILE", "NEW_FILE", "GARBAGE" }; -static char *str2[] = { "staged_*" }; -static char *str3[] = { "!subdir", "*_file", "new_file" }; -static char *str4[] = { "*" }; -static char *str5[] = { "S*" }; - -void test_repo_pathspec__workdir0(void) -{ - git_strarray s; - git_pathspec *ps; - git_pathspec_match_list *m; - - /* { "*_file", "new_file", "garbage" } */ - s.strings = str0; s.count = ARRAY_SIZE(str0); - cl_git_pass(git_pathspec_new(&ps, &s)); - - cl_git_pass(git_pathspec_match_workdir(&m, g_repo, 0, ps)); - cl_assert_equal_sz(10, git_pathspec_match_list_entrycount(m)); - cl_assert_equal_sz(0, git_pathspec_match_list_failed_entrycount(m)); - git_pathspec_match_list_free(m); - - cl_git_pass(git_pathspec_match_workdir(&m, g_repo, - GIT_PATHSPEC_FIND_FAILURES, ps)); - cl_assert_equal_sz(10, git_pathspec_match_list_entrycount(m)); - cl_assert_equal_sz(1, git_pathspec_match_list_failed_entrycount(m)); - cl_assert_equal_s("garbage", git_pathspec_match_list_failed_entry(m, 0)); - git_pathspec_match_list_free(m); - - cl_git_pass(git_pathspec_match_workdir(&m, g_repo, - GIT_PATHSPEC_FIND_FAILURES | GIT_PATHSPEC_FAILURES_ONLY, ps)); - cl_assert_equal_sz(0, git_pathspec_match_list_entrycount(m)); - cl_assert_equal_sz(1, git_pathspec_match_list_failed_entrycount(m)); - git_pathspec_match_list_free(m); - - git_pathspec_free(ps); -} - -void test_repo_pathspec__workdir1(void) -{ - git_strarray s; - git_pathspec *ps; - git_pathspec_match_list *m; - - /* { "*_FILE", "NEW_FILE", "GARBAGE" } */ - s.strings = str1; s.count = ARRAY_SIZE(str1); - cl_git_pass(git_pathspec_new(&ps, &s)); - - cl_git_pass(git_pathspec_match_workdir(&m, g_repo, - GIT_PATHSPEC_IGNORE_CASE, ps)); - cl_assert_equal_sz(10, git_pathspec_match_list_entrycount(m)); - git_pathspec_match_list_free(m); - - cl_git_pass(git_pathspec_match_workdir(&m, g_repo, - GIT_PATHSPEC_USE_CASE, ps)); - cl_assert_equal_sz(0, git_pathspec_match_list_entrycount(m)); - git_pathspec_match_list_free(m); - - cl_git_fail(git_pathspec_match_workdir(&m, g_repo, - GIT_PATHSPEC_USE_CASE | GIT_PATHSPEC_NO_MATCH_ERROR, ps)); - - cl_git_pass(git_pathspec_match_workdir(&m, g_repo, - GIT_PATHSPEC_IGNORE_CASE | GIT_PATHSPEC_FIND_FAILURES, ps)); - cl_assert_equal_sz(10, git_pathspec_match_list_entrycount(m)); - cl_assert_equal_sz(1, git_pathspec_match_list_failed_entrycount(m)); - git_pathspec_match_list_free(m); - - cl_git_pass(git_pathspec_match_workdir(&m, g_repo, - GIT_PATHSPEC_USE_CASE | GIT_PATHSPEC_FIND_FAILURES, ps)); - cl_assert_equal_sz(0, git_pathspec_match_list_entrycount(m)); - cl_assert_equal_sz(3, git_pathspec_match_list_failed_entrycount(m)); - git_pathspec_match_list_free(m); - - git_pathspec_free(ps); -} - -void test_repo_pathspec__workdir2(void) -{ - git_strarray s; - git_pathspec *ps; - git_pathspec_match_list *m; - - /* { "staged_*" } */ - s.strings = str2; s.count = ARRAY_SIZE(str2); - cl_git_pass(git_pathspec_new(&ps, &s)); - - cl_git_pass(git_pathspec_match_workdir(&m, g_repo, 0, ps)); - cl_assert_equal_sz(5, git_pathspec_match_list_entrycount(m)); - git_pathspec_match_list_free(m); - - cl_git_pass(git_pathspec_match_workdir(&m, g_repo, - GIT_PATHSPEC_FIND_FAILURES, ps)); - cl_assert_equal_sz(5, git_pathspec_match_list_entrycount(m)); - cl_assert_equal_sz(0, git_pathspec_match_list_failed_entrycount(m)); - git_pathspec_match_list_free(m); - - cl_git_fail(git_pathspec_match_workdir(&m, g_repo, - GIT_PATHSPEC_NO_GLOB | GIT_PATHSPEC_NO_MATCH_ERROR, ps)); - - cl_git_pass(git_pathspec_match_workdir(&m, g_repo, - GIT_PATHSPEC_NO_GLOB | GIT_PATHSPEC_FIND_FAILURES, ps)); - cl_assert_equal_sz(0, git_pathspec_match_list_entrycount(m)); - cl_assert_equal_sz(1, git_pathspec_match_list_failed_entrycount(m)); - git_pathspec_match_list_free(m); - - git_pathspec_free(ps); -} - -void test_repo_pathspec__workdir3(void) -{ - git_strarray s; - git_pathspec *ps; - git_pathspec_match_list *m; - - /* { "!subdir", "*_file", "new_file" } */ - s.strings = str3; s.count = ARRAY_SIZE(str3); - cl_git_pass(git_pathspec_new(&ps, &s)); - - cl_git_pass(git_pathspec_match_workdir(&m, g_repo, 0, ps)); - cl_assert_equal_sz(7, git_pathspec_match_list_entrycount(m)); - git_pathspec_match_list_free(m); - - cl_git_pass(git_pathspec_match_workdir(&m, g_repo, - GIT_PATHSPEC_FIND_FAILURES, ps)); - cl_assert_equal_sz(7, git_pathspec_match_list_entrycount(m)); - cl_assert_equal_sz(0, git_pathspec_match_list_failed_entrycount(m)); - - cl_assert_equal_s("current_file", git_pathspec_match_list_entry(m, 0)); - cl_assert_equal_s("modified_file", git_pathspec_match_list_entry(m, 1)); - cl_assert_equal_s("new_file", git_pathspec_match_list_entry(m, 2)); - cl_assert_equal_s("staged_changes_modified_file", git_pathspec_match_list_entry(m, 3)); - cl_assert_equal_s("staged_delete_modified_file", git_pathspec_match_list_entry(m, 4)); - cl_assert_equal_s("staged_new_file", git_pathspec_match_list_entry(m, 5)); - cl_assert_equal_s("staged_new_file_modified_file", git_pathspec_match_list_entry(m, 6)); - cl_assert_equal_s(NULL, git_pathspec_match_list_entry(m, 7)); - - git_pathspec_match_list_free(m); - - git_pathspec_free(ps); -} - -void test_repo_pathspec__workdir4(void) -{ - git_strarray s; - git_pathspec *ps; - git_pathspec_match_list *m; - - /* { "*" } */ - s.strings = str4; s.count = ARRAY_SIZE(str4); - cl_git_pass(git_pathspec_new(&ps, &s)); - - cl_git_pass(git_pathspec_match_workdir(&m, g_repo, 0, ps)); - cl_assert_equal_sz(13, git_pathspec_match_list_entrycount(m)); - cl_assert_equal_s("\xE8\xBF\x99", git_pathspec_match_list_entry(m, 12)); - git_pathspec_match_list_free(m); - - git_pathspec_free(ps); -} - - -void test_repo_pathspec__index0(void) -{ - git_index *idx; - git_strarray s; - git_pathspec *ps; - git_pathspec_match_list *m; - - cl_git_pass(git_repository_index(&idx, g_repo)); - - /* { "*_file", "new_file", "garbage" } */ - s.strings = str0; s.count = ARRAY_SIZE(str0); - cl_git_pass(git_pathspec_new(&ps, &s)); - - cl_git_pass(git_pathspec_match_index(&m, idx, 0, ps)); - cl_assert_equal_sz(9, git_pathspec_match_list_entrycount(m)); - cl_assert_equal_sz(0, git_pathspec_match_list_failed_entrycount(m)); - cl_assert_equal_s("current_file", git_pathspec_match_list_entry(m, 0)); - cl_assert_equal_s("modified_file", git_pathspec_match_list_entry(m, 1)); - cl_assert_equal_s("staged_changes_modified_file", git_pathspec_match_list_entry(m, 2)); - cl_assert_equal_s("staged_new_file", git_pathspec_match_list_entry(m, 3)); - cl_assert_equal_s("staged_new_file_deleted_file", git_pathspec_match_list_entry(m, 4)); - cl_assert_equal_s("staged_new_file_modified_file", git_pathspec_match_list_entry(m, 5)); - cl_assert_equal_s("subdir/current_file", git_pathspec_match_list_entry(m, 6)); - cl_assert_equal_s("subdir/deleted_file", git_pathspec_match_list_entry(m, 7)); - cl_assert_equal_s("subdir/modified_file", git_pathspec_match_list_entry(m, 8)); - cl_assert_equal_s(NULL, git_pathspec_match_list_entry(m, 9)); - git_pathspec_match_list_free(m); - - cl_git_pass(git_pathspec_match_index(&m, idx, - GIT_PATHSPEC_FIND_FAILURES, ps)); - cl_assert_equal_sz(9, git_pathspec_match_list_entrycount(m)); - cl_assert_equal_sz(2, git_pathspec_match_list_failed_entrycount(m)); - cl_assert_equal_s("new_file", git_pathspec_match_list_failed_entry(m, 0)); - cl_assert_equal_s("garbage", git_pathspec_match_list_failed_entry(m, 1)); - cl_assert_equal_s(NULL, git_pathspec_match_list_failed_entry(m, 2)); - git_pathspec_match_list_free(m); - - git_pathspec_free(ps); - git_index_free(idx); -} - -void test_repo_pathspec__index1(void) -{ - /* Currently the USE_CASE and IGNORE_CASE flags don't work on the - * index because the index sort order for the index iterator is - * set by the index itself. I think the correct fix is for the - * index not to embed a global sort order but to support traversal - * in either case sensitive or insensitive order in a stateless - * manner. - * - * Anyhow, as it is, there is no point in doing this test. - */ -#if 0 - git_index *idx; - git_strarray s; - git_pathspec *ps; - git_pathspec_match_list *m; - - cl_git_pass(git_repository_index(&idx, g_repo)); - - /* { "*_FILE", "NEW_FILE", "GARBAGE" } */ - s.strings = str1; s.count = ARRAY_SIZE(str1); - cl_git_pass(git_pathspec_new(&ps, &s)); - - cl_git_pass(git_pathspec_match_index(&m, idx, - GIT_PATHSPEC_USE_CASE, ps)); - cl_assert_equal_sz(0, git_pathspec_match_list_entrycount(m)); - cl_assert_equal_sz(0, git_pathspec_match_list_failed_entrycount(m)); - git_pathspec_match_list_free(m); - - cl_git_pass(git_pathspec_match_index(&m, idx, - GIT_PATHSPEC_USE_CASE | GIT_PATHSPEC_FIND_FAILURES, ps)); - cl_assert_equal_sz(0, git_pathspec_match_list_entrycount(m)); - cl_assert_equal_sz(3, git_pathspec_match_list_failed_entrycount(m)); - git_pathspec_match_list_free(m); - - cl_git_pass(git_pathspec_match_index(&m, idx, - GIT_PATHSPEC_IGNORE_CASE | GIT_PATHSPEC_FIND_FAILURES, ps)); - cl_assert_equal_sz(10, git_pathspec_match_list_entrycount(m)); - cl_assert_equal_sz(2, git_pathspec_match_list_failed_entrycount(m)); - git_pathspec_match_list_free(m); - - git_pathspec_free(ps); - git_index_free(idx); -#endif -} - -void test_repo_pathspec__tree0(void) -{ - git_object *tree; - git_strarray s; - git_pathspec *ps; - git_pathspec_match_list *m; - - /* { "*_file", "new_file", "garbage" } */ - s.strings = str0; s.count = ARRAY_SIZE(str0); - cl_git_pass(git_pathspec_new(&ps, &s)); - - cl_git_pass(git_revparse_single(&tree, g_repo, "HEAD~2^{tree}")); - - cl_git_pass(git_pathspec_match_tree(&m, (git_tree *)tree, - GIT_PATHSPEC_FIND_FAILURES, ps)); - cl_assert_equal_sz(4, git_pathspec_match_list_entrycount(m)); - cl_assert_equal_s("current_file", git_pathspec_match_list_entry(m, 0)); - cl_assert_equal_s("modified_file", git_pathspec_match_list_entry(m, 1)); - cl_assert_equal_s("staged_changes_modified_file", git_pathspec_match_list_entry(m, 2)); - cl_assert_equal_s("staged_delete_modified_file", git_pathspec_match_list_entry(m, 3)); - cl_assert_equal_s(NULL, git_pathspec_match_list_entry(m, 4)); - cl_assert_equal_sz(2, git_pathspec_match_list_failed_entrycount(m)); - cl_assert_equal_s("new_file", git_pathspec_match_list_failed_entry(m, 0)); - cl_assert_equal_s("garbage", git_pathspec_match_list_failed_entry(m, 1)); - cl_assert_equal_s(NULL, git_pathspec_match_list_failed_entry(m, 2)); - git_pathspec_match_list_free(m); - - git_object_free(tree); - - cl_git_pass(git_revparse_single(&tree, g_repo, "HEAD^{tree}")); - - cl_git_pass(git_pathspec_match_tree(&m, (git_tree *)tree, - GIT_PATHSPEC_FIND_FAILURES, ps)); - cl_assert_equal_sz(7, git_pathspec_match_list_entrycount(m)); - cl_assert_equal_s("current_file", git_pathspec_match_list_entry(m, 0)); - cl_assert_equal_s("modified_file", git_pathspec_match_list_entry(m, 1)); - cl_assert_equal_s("staged_changes_modified_file", git_pathspec_match_list_entry(m, 2)); - cl_assert_equal_s("staged_delete_modified_file", git_pathspec_match_list_entry(m, 3)); - cl_assert_equal_s("subdir/current_file", git_pathspec_match_list_entry(m, 4)); - cl_assert_equal_s("subdir/deleted_file", git_pathspec_match_list_entry(m, 5)); - cl_assert_equal_s("subdir/modified_file", git_pathspec_match_list_entry(m, 6)); - cl_assert_equal_s(NULL, git_pathspec_match_list_entry(m, 7)); - cl_assert_equal_sz(2, git_pathspec_match_list_failed_entrycount(m)); - cl_assert_equal_s("new_file", git_pathspec_match_list_failed_entry(m, 0)); - cl_assert_equal_s("garbage", git_pathspec_match_list_failed_entry(m, 1)); - cl_assert_equal_s(NULL, git_pathspec_match_list_failed_entry(m, 2)); - git_pathspec_match_list_free(m); - - git_object_free(tree); - - git_pathspec_free(ps); -} - -void test_repo_pathspec__tree5(void) -{ - git_object *tree; - git_strarray s; - git_pathspec *ps; - git_pathspec_match_list *m; - - /* { "S*" } */ - s.strings = str5; s.count = ARRAY_SIZE(str5); - cl_git_pass(git_pathspec_new(&ps, &s)); - - cl_git_pass(git_revparse_single(&tree, g_repo, "HEAD~2^{tree}")); - - cl_git_pass(git_pathspec_match_tree(&m, (git_tree *)tree, - GIT_PATHSPEC_USE_CASE | GIT_PATHSPEC_FIND_FAILURES, ps)); - cl_assert_equal_sz(0, git_pathspec_match_list_entrycount(m)); - cl_assert_equal_sz(1, git_pathspec_match_list_failed_entrycount(m)); - git_pathspec_match_list_free(m); - - cl_git_pass(git_pathspec_match_tree(&m, (git_tree *)tree, - GIT_PATHSPEC_IGNORE_CASE | GIT_PATHSPEC_FIND_FAILURES, ps)); - cl_assert_equal_sz(5, git_pathspec_match_list_entrycount(m)); - cl_assert_equal_s("staged_changes", git_pathspec_match_list_entry(m, 0)); - cl_assert_equal_s("staged_delete_modified_file", git_pathspec_match_list_entry(m, 4)); - cl_assert_equal_sz(0, git_pathspec_match_list_failed_entrycount(m)); - git_pathspec_match_list_free(m); - - git_object_free(tree); - - cl_git_pass(git_revparse_single(&tree, g_repo, "HEAD^{tree}")); - - cl_git_pass(git_pathspec_match_tree(&m, (git_tree *)tree, - GIT_PATHSPEC_IGNORE_CASE | GIT_PATHSPEC_FIND_FAILURES, ps)); - cl_assert_equal_sz(9, git_pathspec_match_list_entrycount(m)); - cl_assert_equal_s("staged_changes", git_pathspec_match_list_entry(m, 0)); - cl_assert_equal_s("subdir.txt", git_pathspec_match_list_entry(m, 5)); - cl_assert_equal_s("subdir/current_file", git_pathspec_match_list_entry(m, 6)); - cl_assert_equal_sz(0, git_pathspec_match_list_failed_entrycount(m)); - git_pathspec_match_list_free(m); - - git_object_free(tree); - - git_pathspec_free(ps); -} - -void test_repo_pathspec__in_memory(void) -{ - static char *strings[] = { "one", "two*", "!three*", "*four" }; - git_strarray s = { strings, ARRAY_SIZE(strings) }; - git_pathspec *ps; - - cl_git_pass(git_pathspec_new(&ps, &s)); - - cl_assert(git_pathspec_matches_path(ps, 0, "one")); - cl_assert(!git_pathspec_matches_path(ps, 0, "ONE")); - cl_assert(git_pathspec_matches_path(ps, GIT_PATHSPEC_IGNORE_CASE, "ONE")); - cl_assert(git_pathspec_matches_path(ps, 0, "two")); - cl_assert(git_pathspec_matches_path(ps, 0, "two.txt")); - cl_assert(!git_pathspec_matches_path(ps, 0, "three.txt")); - cl_assert(git_pathspec_matches_path(ps, 0, "anything.four")); - cl_assert(!git_pathspec_matches_path(ps, 0, "three.four")); - cl_assert(!git_pathspec_matches_path(ps, 0, "nomatch")); - cl_assert(!git_pathspec_matches_path(ps, GIT_PATHSPEC_NO_GLOB, "two")); - cl_assert(git_pathspec_matches_path(ps, GIT_PATHSPEC_NO_GLOB, "two*")); - cl_assert(!git_pathspec_matches_path(ps, GIT_PATHSPEC_NO_GLOB, "anyfour")); - cl_assert(git_pathspec_matches_path(ps, GIT_PATHSPEC_NO_GLOB, "*four")); - - git_pathspec_free(ps); -} diff --git a/vendor/libgit2/tests/repo/repo_helpers.c b/vendor/libgit2/tests/repo/repo_helpers.c deleted file mode 100644 index 61f6968656..0000000000 --- a/vendor/libgit2/tests/repo/repo_helpers.c +++ /dev/null @@ -1,22 +0,0 @@ -#include "clar_libgit2.h" -#include "refs.h" -#include "repo_helpers.h" -#include "posix.h" - -void make_head_unborn(git_repository* repo, const char *target) -{ - git_reference *head; - - cl_git_pass(git_reference_symbolic_create(&head, repo, GIT_HEAD_FILE, target, 1, NULL)); - git_reference_free(head); -} - -void delete_head(git_repository* repo) -{ - git_buf head_path = GIT_BUF_INIT; - - cl_git_pass(git_buf_joinpath(&head_path, git_repository_path(repo), GIT_HEAD_FILE)); - cl_git_pass(p_unlink(git_buf_cstr(&head_path))); - - git_buf_free(&head_path); -} diff --git a/vendor/libgit2/tests/repo/repo_helpers.h b/vendor/libgit2/tests/repo/repo_helpers.h deleted file mode 100644 index 6783d57010..0000000000 --- a/vendor/libgit2/tests/repo/repo_helpers.h +++ /dev/null @@ -1,6 +0,0 @@ -#include "common.h" - -#define NON_EXISTING_HEAD "refs/heads/hide/and/seek" - -extern void make_head_unborn(git_repository* repo, const char *target); -extern void delete_head(git_repository* repo); diff --git a/vendor/libgit2/tests/repo/reservedname.c b/vendor/libgit2/tests/repo/reservedname.c deleted file mode 100644 index faea0cc2b3..0000000000 --- a/vendor/libgit2/tests/repo/reservedname.c +++ /dev/null @@ -1,108 +0,0 @@ -#include "clar_libgit2.h" -#include "../submodule/submodule_helpers.h" -#include "repository.h" - -void test_repo_reservedname__cleanup(void) -{ - cl_git_sandbox_cleanup(); -} - -void test_repo_reservedname__includes_shortname_on_win32(void) -{ - git_repository *repo; - git_buf *reserved; - size_t reserved_len; - - repo = cl_git_sandbox_init("nasty"); - cl_assert(git_repository__reserved_names(&reserved, &reserved_len, repo, false)); - -#ifdef GIT_WIN32 - cl_assert_equal_i(2, reserved_len); - cl_assert_equal_s(".git", reserved[0].ptr); - cl_assert_equal_s("GIT~1", reserved[1].ptr); -#else - cl_assert_equal_i(1, reserved_len); - cl_assert_equal_s(".git", reserved[0].ptr); -#endif -} - -void test_repo_reservedname__includes_shortname_when_requested(void) -{ - git_repository *repo; - git_buf *reserved; - size_t reserved_len; - - repo = cl_git_sandbox_init("nasty"); - cl_assert(git_repository__reserved_names(&reserved, &reserved_len, repo, true)); - - cl_assert_equal_i(2, reserved_len); - cl_assert_equal_s(".git", reserved[0].ptr); - cl_assert_equal_s("GIT~1", reserved[1].ptr); -} - -/* Ensures that custom shortnames are included: creates a GIT~1 so that the - * .git folder itself will have to be named GIT~2 - */ -void test_repo_reservedname__custom_shortname_recognized(void) -{ -#ifdef GIT_WIN32 - git_repository *repo; - git_buf *reserved; - size_t reserved_len; - - if (!cl_sandbox_supports_8dot3()) - clar__skip(); - - repo = cl_git_sandbox_init("nasty"); - - cl_must_pass(p_rename("nasty/.git", "nasty/_temp")); - cl_git_write2file("nasty/git~1", "", 0, O_RDWR|O_CREAT, 0666); - cl_must_pass(p_rename("nasty/_temp", "nasty/.git")); - - cl_assert(git_repository__reserved_names(&reserved, &reserved_len, repo, true)); - - cl_assert_equal_i(3, reserved_len); - cl_assert_equal_s(".git", reserved[0].ptr); - cl_assert_equal_s("GIT~1", reserved[1].ptr); - cl_assert_equal_s("GIT~2", reserved[2].ptr); -#endif -} - -/* When looking at the short name for a submodule, we need to prevent - * people from overwriting the `.git` file in the submodule working - * directory itself. We don't want to look at the actual repository - * path, since it will be in the super's repository above us, and - * typically named with the name of our subrepository. Consequently, - * preventing access to the short name of the actual repository path - * would prevent us from creating files with the same name as the - * subrepo. (Eg, a submodule named "libgit2" could not contain a file - * named "libgit2", which would be unfortunate.) - */ -void test_repo_reservedname__submodule_pointer(void) -{ -#ifdef GIT_WIN32 - git_repository *super_repo, *sub_repo; - git_submodule *sub; - git_buf *sub_reserved; - size_t sub_reserved_len; - - if (!cl_sandbox_supports_8dot3()) - clar__skip(); - - super_repo = setup_fixture_submod2(); - - assert_submodule_exists(super_repo, "sm_unchanged"); - - cl_git_pass(git_submodule_lookup(&sub, super_repo, "sm_unchanged")); - cl_git_pass(git_submodule_open(&sub_repo, sub)); - - cl_assert(git_repository__reserved_names(&sub_reserved, &sub_reserved_len, sub_repo, true)); - - cl_assert_equal_i(2, sub_reserved_len); - cl_assert_equal_s(".git", sub_reserved[0].ptr); - cl_assert_equal_s("GIT~1", sub_reserved[1].ptr); - - git_submodule_free(sub); - git_repository_free(sub_repo); -#endif -} diff --git a/vendor/libgit2/tests/repo/setters.c b/vendor/libgit2/tests/repo/setters.c deleted file mode 100644 index 5a83fdbee4..0000000000 --- a/vendor/libgit2/tests/repo/setters.c +++ /dev/null @@ -1,109 +0,0 @@ -#include "clar_libgit2.h" -#include "git2/sys/repository.h" - -#include "buffer.h" -#include "posix.h" -#include "util.h" -#include "path.h" -#include "fileops.h" - -static git_repository *repo; - -void test_repo_setters__initialize(void) -{ - cl_fixture_sandbox("testrepo.git"); - cl_git_pass(git_repository_open(&repo, "testrepo.git")); - cl_must_pass(p_mkdir("new_workdir", 0777)); -} - -void test_repo_setters__cleanup(void) -{ - git_repository_free(repo); - repo = NULL; - - cl_fixture_cleanup("testrepo.git"); - cl_fixture_cleanup("new_workdir"); -} - -void test_repo_setters__setting_a_workdir_turns_a_bare_repository_into_a_standard_one(void) -{ - cl_assert(git_repository_is_bare(repo) == 1); - - cl_assert(git_repository_workdir(repo) == NULL); - cl_git_pass(git_repository_set_workdir(repo, "./new_workdir", false)); - - cl_assert(git_repository_workdir(repo) != NULL); - cl_assert(git_repository_is_bare(repo) == 0); -} - -void test_repo_setters__setting_a_workdir_prettifies_its_path(void) -{ - cl_git_pass(git_repository_set_workdir(repo, "./new_workdir", false)); - - cl_assert(git__suffixcmp(git_repository_workdir(repo), "new_workdir/") == 0); -} - -void test_repo_setters__setting_a_workdir_creates_a_gitlink(void) -{ - git_config *cfg; - git_buf buf = GIT_BUF_INIT; - git_buf content = GIT_BUF_INIT; - - cl_git_pass(git_repository_set_workdir(repo, "./new_workdir", true)); - - cl_assert(git_path_isfile("./new_workdir/.git")); - - cl_git_pass(git_futils_readbuffer(&content, "./new_workdir/.git")); - cl_assert(git__prefixcmp(git_buf_cstr(&content), "gitdir: ") == 0); - cl_assert(git__suffixcmp(git_buf_cstr(&content), "testrepo.git/") == 0); - git_buf_free(&content); - - cl_git_pass(git_repository_config(&cfg, repo)); - cl_git_pass(git_config_get_string_buf(&buf, cfg, "core.worktree")); - cl_assert(git__suffixcmp(git_buf_cstr(&buf), "new_workdir/") == 0); - - git_buf_free(&buf); - git_config_free(cfg); -} - -void test_repo_setters__setting_a_new_index_on_a_repo_which_has_already_loaded_one_properly_honors_the_refcount(void) -{ - git_index *new_index; - - cl_git_pass(git_index_open(&new_index, "./my-index")); - cl_assert(((git_refcount *)new_index)->refcount.val == 1); - - git_repository_set_index(repo, new_index); - cl_assert(((git_refcount *)new_index)->refcount.val == 2); - - git_repository_free(repo); - cl_assert(((git_refcount *)new_index)->refcount.val == 1); - - git_index_free(new_index); - - /* - * Ensure the cleanup method won't try to free the repo as it's already been taken care of - */ - repo = NULL; -} - -void test_repo_setters__setting_a_new_odb_on_a_repo_which_already_loaded_one_properly_honors_the_refcount(void) -{ - git_odb *new_odb; - - cl_git_pass(git_odb_open(&new_odb, "./testrepo.git/objects")); - cl_assert(((git_refcount *)new_odb)->refcount.val == 1); - - git_repository_set_odb(repo, new_odb); - cl_assert(((git_refcount *)new_odb)->refcount.val == 2); - - git_repository_free(repo); - cl_assert(((git_refcount *)new_odb)->refcount.val == 1); - - git_odb_free(new_odb); - - /* - * Ensure the cleanup method won't try to free the repo as it's already been taken care of - */ - repo = NULL; -} diff --git a/vendor/libgit2/tests/repo/shallow.c b/vendor/libgit2/tests/repo/shallow.c deleted file mode 100644 index 5aeaf2def4..0000000000 --- a/vendor/libgit2/tests/repo/shallow.c +++ /dev/null @@ -1,39 +0,0 @@ -#include "clar_libgit2.h" -#include "fileops.h" - -static git_repository *g_repo; - -void test_repo_shallow__initialize(void) -{ -} - -void test_repo_shallow__cleanup(void) -{ - cl_git_sandbox_cleanup(); -} - -void test_repo_shallow__no_shallow_file(void) -{ - g_repo = cl_git_sandbox_init("testrepo.git"); - cl_assert_equal_i(0, git_repository_is_shallow(g_repo)); -} - -void test_repo_shallow__empty_shallow_file(void) -{ - g_repo = cl_git_sandbox_init("testrepo.git"); - cl_git_mkfile("testrepo.git/shallow", ""); - cl_assert_equal_i(0, git_repository_is_shallow(g_repo)); -} - -void test_repo_shallow__shallow_repo(void) -{ - g_repo = cl_git_sandbox_init("shallow.git"); - cl_assert_equal_i(1, git_repository_is_shallow(g_repo)); -} - -void test_repo_shallow__clears_errors(void) -{ - g_repo = cl_git_sandbox_init("testrepo.git"); - cl_assert_equal_i(0, git_repository_is_shallow(g_repo)); - cl_assert_equal_p(NULL, giterr_last()); -} diff --git a/vendor/libgit2/tests/repo/state.c b/vendor/libgit2/tests/repo/state.c deleted file mode 100644 index bf2633c176..0000000000 --- a/vendor/libgit2/tests/repo/state.c +++ /dev/null @@ -1,114 +0,0 @@ -#include "clar_libgit2.h" -#include "buffer.h" -#include "refs.h" -#include "posix.h" -#include "fileops.h" - -static git_repository *_repo; -static git_buf _path; - -void test_repo_state__initialize(void) -{ - _repo = cl_git_sandbox_init("testrepo.git"); -} - -void test_repo_state__cleanup(void) -{ - cl_git_sandbox_cleanup(); - git_buf_free(&_path); -} - -static void setup_simple_state(const char *filename) -{ - cl_git_pass(git_buf_joinpath(&_path, git_repository_path(_repo), filename)); - git_futils_mkpath2file(git_buf_cstr(&_path), 0777); - cl_git_mkfile(git_buf_cstr(&_path), "dummy"); -} - -static void assert_repo_state(git_repository_state_t state) -{ - cl_assert_equal_i(state, git_repository_state(_repo)); -} - -void test_repo_state__none_with_HEAD_attached(void) -{ - assert_repo_state(GIT_REPOSITORY_STATE_NONE); -} - -void test_repo_state__none_with_HEAD_detached(void) -{ - cl_git_pass(git_repository_detach_head(_repo)); - assert_repo_state(GIT_REPOSITORY_STATE_NONE); -} - -void test_repo_state__merge(void) -{ - setup_simple_state(GIT_MERGE_HEAD_FILE); - assert_repo_state(GIT_REPOSITORY_STATE_MERGE); - cl_git_pass(git_repository_state_cleanup(_repo)); - assert_repo_state(GIT_REPOSITORY_STATE_NONE); -} - -void test_repo_state__revert(void) -{ - setup_simple_state(GIT_REVERT_HEAD_FILE); - assert_repo_state(GIT_REPOSITORY_STATE_REVERT); - cl_git_pass(git_repository_state_cleanup(_repo)); - assert_repo_state(GIT_REPOSITORY_STATE_NONE); -} - -void test_repo_state__cherry_pick(void) -{ - setup_simple_state(GIT_CHERRYPICK_HEAD_FILE); - assert_repo_state(GIT_REPOSITORY_STATE_CHERRYPICK); - cl_git_pass(git_repository_state_cleanup(_repo)); - assert_repo_state(GIT_REPOSITORY_STATE_NONE); -} - -void test_repo_state__bisect(void) -{ - setup_simple_state(GIT_BISECT_LOG_FILE); - assert_repo_state(GIT_REPOSITORY_STATE_BISECT); - cl_git_pass(git_repository_state_cleanup(_repo)); - assert_repo_state(GIT_REPOSITORY_STATE_NONE); -} - -void test_repo_state__rebase_interactive(void) -{ - setup_simple_state(GIT_REBASE_MERGE_INTERACTIVE_FILE); - assert_repo_state(GIT_REPOSITORY_STATE_REBASE_INTERACTIVE); - cl_git_pass(git_repository_state_cleanup(_repo)); - assert_repo_state(GIT_REPOSITORY_STATE_NONE); -} - -void test_repo_state__rebase_merge(void) -{ - setup_simple_state(GIT_REBASE_MERGE_DIR "whatever"); - assert_repo_state(GIT_REPOSITORY_STATE_REBASE_MERGE); - cl_git_pass(git_repository_state_cleanup(_repo)); - assert_repo_state(GIT_REPOSITORY_STATE_NONE); -} - -void test_repo_state__rebase(void) -{ - setup_simple_state(GIT_REBASE_APPLY_REBASING_FILE); - assert_repo_state(GIT_REPOSITORY_STATE_REBASE); - cl_git_pass(git_repository_state_cleanup(_repo)); - assert_repo_state(GIT_REPOSITORY_STATE_NONE); -} - -void test_repo_state__apply_mailbox(void) -{ - setup_simple_state(GIT_REBASE_APPLY_APPLYING_FILE); - assert_repo_state(GIT_REPOSITORY_STATE_APPLY_MAILBOX); - cl_git_pass(git_repository_state_cleanup(_repo)); - assert_repo_state(GIT_REPOSITORY_STATE_NONE); -} - -void test_repo_state__apply_mailbox_or_rebase(void) -{ - setup_simple_state(GIT_REBASE_APPLY_DIR "whatever"); - assert_repo_state(GIT_REPOSITORY_STATE_APPLY_MAILBOX_OR_REBASE); - cl_git_pass(git_repository_state_cleanup(_repo)); - assert_repo_state(GIT_REPOSITORY_STATE_NONE); -} diff --git a/vendor/libgit2/tests/reset/default.c b/vendor/libgit2/tests/reset/default.c deleted file mode 100644 index c76f148135..0000000000 --- a/vendor/libgit2/tests/reset/default.c +++ /dev/null @@ -1,212 +0,0 @@ -#include "clar_libgit2.h" -#include "posix.h" -#include "reset_helpers.h" -#include "path.h" - -static git_repository *_repo; -static git_object *_target; -static git_strarray _pathspecs; -static git_index *_index; - -static void initialize(const char *repo_name) -{ - _repo = cl_git_sandbox_init(repo_name); - cl_git_pass(git_repository_index(&_index, _repo)); - - _target = NULL; - - _pathspecs.strings = NULL; - _pathspecs.count = 0; -} - -void test_reset_default__initialize(void) -{ -} - -void test_reset_default__cleanup(void) -{ - git_object_free(_target); - _target = NULL; - - git_index_free(_index); - _index = NULL; - - cl_git_sandbox_cleanup(); -} - -static void assert_content_in_index( - git_strarray *pathspecs, - bool should_exist, - git_strarray *expected_shas) -{ - size_t i, pos; - int error; - - for (i = 0; i < pathspecs->count; i++) { - error = git_index_find(&pos, _index, pathspecs->strings[i]); - - if (should_exist) { - const git_index_entry *entry; - - cl_assert(error != GIT_ENOTFOUND); - - entry = git_index_get_byindex(_index, pos); - cl_assert(entry != NULL); - - if (!expected_shas) - continue; - - cl_git_pass(git_oid_streq(&entry->id, expected_shas->strings[i])); - } else - cl_assert_equal_i(should_exist, error != GIT_ENOTFOUND); - } -} - -void test_reset_default__resetting_filepaths_against_a_null_target_removes_them_from_the_index(void) -{ - char *paths[] = { "staged_changes", "staged_new_file" }; - - initialize("status"); - - _pathspecs.strings = paths; - _pathspecs.count = 2; - - assert_content_in_index(&_pathspecs, true, NULL); - - cl_git_pass(git_reset_default(_repo, NULL, &_pathspecs)); - - assert_content_in_index(&_pathspecs, false, NULL); -} - -/* - * $ git ls-files --cached -s --abbrev=7 -- "staged*" - * 100644 55d316c 0 staged_changes - * 100644 a6be623 0 staged_changes_file_deleted - * ... - * - * $ git reset 0017bd4 -- staged_changes staged_changes_file_deleted - * Unstaged changes after reset: - * ... - * - * $ git ls-files --cached -s --abbrev=7 -- "staged*" - * 100644 32504b7 0 staged_changes - * 100644 061d42a 0 staged_changes_file_deleted - * ... - */ -void test_reset_default__resetting_filepaths_replaces_their_corresponding_index_entries(void) -{ - git_strarray before, after; - - char *paths[] = { "staged_changes", "staged_changes_file_deleted" }; - char *before_shas[] = { "55d316c9ba708999f1918e9677d01dfcae69c6b9", - "a6be623522ce87a1d862128ac42672604f7b468b" }; - char *after_shas[] = { "32504b727382542f9f089e24fddac5e78533e96c", - "061d42a44cacde5726057b67558821d95db96f19" }; - - initialize("status"); - - _pathspecs.strings = paths; - _pathspecs.count = 2; - before.strings = before_shas; - before.count = 2; - after.strings = after_shas; - after.count = 2; - - cl_git_pass(git_revparse_single(&_target, _repo, "0017bd4")); - assert_content_in_index(&_pathspecs, true, &before); - - cl_git_pass(git_reset_default(_repo, _target, &_pathspecs)); - - assert_content_in_index(&_pathspecs, true, &after); -} - -/* - * $ git ls-files --cached -s --abbrev=7 -- conflicts-one.txt - * 100644 1f85ca5 1 conflicts-one.txt - * 100644 6aea5f2 2 conflicts-one.txt - * 100644 516bd85 3 conflicts-one.txt - * - * $ git reset 9a05ccb -- conflicts-one.txt - * Unstaged changes after reset: - * ... - * - * $ git ls-files --cached -s --abbrev=7 -- conflicts-one.txt - * 100644 1f85ca5 0 conflicts-one.txt - * - */ -void test_reset_default__resetting_filepaths_clears_previous_conflicts(void) -{ - const git_index_entry *conflict_entry[3]; - git_strarray after; - - char *paths[] = { "conflicts-one.txt" }; - char *after_shas[] = { "1f85ca51b8e0aac893a621b61a9c2661d6aa6d81" }; - - initialize("mergedrepo"); - - _pathspecs.strings = paths; - _pathspecs.count = 1; - after.strings = after_shas; - after.count = 1; - - cl_git_pass(git_index_conflict_get(&conflict_entry[0], &conflict_entry[1], - &conflict_entry[2], _index, "conflicts-one.txt")); - - cl_git_pass(git_revparse_single(&_target, _repo, "9a05ccb")); - cl_git_pass(git_reset_default(_repo, _target, &_pathspecs)); - - assert_content_in_index(&_pathspecs, true, &after); - - cl_assert_equal_i(GIT_ENOTFOUND, git_index_conflict_get(&conflict_entry[0], - &conflict_entry[1], &conflict_entry[2], _index, "conflicts-one.txt")); -} - -/* -$ git reset HEAD -- "I_am_not_there.txt" "me_neither.txt" -Unstaged changes after reset: -... -*/ -void test_reset_default__resetting_unknown_filepaths_does_not_fail(void) -{ - char *paths[] = { "I_am_not_there.txt", "me_neither.txt" }; - - initialize("status"); - - _pathspecs.strings = paths; - _pathspecs.count = 2; - - assert_content_in_index(&_pathspecs, false, NULL); - - cl_git_pass(git_revparse_single(&_target, _repo, "HEAD")); - cl_git_pass(git_reset_default(_repo, _target, &_pathspecs)); - - assert_content_in_index(&_pathspecs, false, NULL); -} - -void test_reset_default__staged_rename_reset_delete(void) -{ - git_index_entry entry; - const git_index_entry *existing; - char *paths[] = { "new.txt" }; - - initialize("testrepo2"); - - existing = git_index_get_bypath(_index, "new.txt", 0); - cl_assert(existing); - memcpy(&entry, existing, sizeof(entry)); - - cl_git_pass(git_index_remove_bypath(_index, "new.txt")); - - entry.path = "renamed.txt"; - cl_git_pass(git_index_add(_index, &entry)); - - _pathspecs.strings = paths; - _pathspecs.count = 1; - - assert_content_in_index(&_pathspecs, false, NULL); - - cl_git_pass(git_revparse_single(&_target, _repo, "HEAD")); - cl_git_pass(git_reset_default(_repo, _target, &_pathspecs)); - - assert_content_in_index(&_pathspecs, true, NULL); -} diff --git a/vendor/libgit2/tests/reset/hard.c b/vendor/libgit2/tests/reset/hard.c deleted file mode 100644 index 88055addad..0000000000 --- a/vendor/libgit2/tests/reset/hard.c +++ /dev/null @@ -1,237 +0,0 @@ -#include "clar_libgit2.h" -#include "posix.h" -#include "reset_helpers.h" -#include "path.h" -#include "fileops.h" - -static git_repository *repo; -static git_object *target; - -void test_reset_hard__initialize(void) -{ - repo = cl_git_sandbox_init("status"); - target = NULL; -} - -void test_reset_hard__cleanup(void) -{ - if (target != NULL) { - git_object_free(target); - target = NULL; - } - - cl_git_sandbox_cleanup(); -} - -static int strequal_ignore_eol(const char *exp, const char *str) -{ - while (*exp && *str) { - if (*exp != *str) { - while (*exp == '\r' || *exp == '\n') ++exp; - while (*str == '\r' || *str == '\n') ++str; - if (*exp != *str) - return false; - } else { - exp++; str++; - } - } - return (!*exp && !*str); -} - -void test_reset_hard__resetting_reverts_modified_files(void) -{ - git_buf path = GIT_BUF_INIT, content = GIT_BUF_INIT; - int i; - static const char *files[4] = { - "current_file", - "modified_file", - "staged_new_file", - "staged_changes_modified_file" }; - static const char *before[4] = { - "current_file\n", - "modified_file\nmodified_file\n", - "staged_new_file\n", - "staged_changes_modified_file\nstaged_changes_modified_file\nstaged_changes_modified_file\n" - }; - static const char *after[4] = { - "current_file\n", - "modified_file\n", - NULL, - "staged_changes_modified_file\n" - }; - const char *wd = git_repository_workdir(repo); - - cl_assert(wd); - - for (i = 0; i < 4; ++i) { - cl_git_pass(git_buf_joinpath(&path, wd, files[i])); - cl_git_pass(git_futils_readbuffer(&content, path.ptr)); - cl_assert_equal_s(before[i], content.ptr); - } - - cl_git_pass(git_revparse_single(&target, repo, "26a125e")); - - cl_git_pass(git_reset(repo, target, GIT_RESET_HARD, NULL)); - - for (i = 0; i < 4; ++i) { - cl_git_pass(git_buf_joinpath(&path, wd, files[i])); - if (after[i]) { - cl_git_pass(git_futils_readbuffer(&content, path.ptr)); - cl_assert(strequal_ignore_eol(after[i], content.ptr)); - } else { - cl_assert(!git_path_exists(path.ptr)); - } - } - - git_buf_free(&content); - git_buf_free(&path); -} - -void test_reset_hard__cannot_reset_in_a_bare_repository(void) -{ - git_repository *bare; - - cl_git_pass(git_repository_open(&bare, cl_fixture("testrepo.git"))); - cl_assert(git_repository_is_bare(bare) == true); - - cl_git_pass(git_revparse_single(&target, bare, KNOWN_COMMIT_IN_BARE_REPO)); - - cl_assert_equal_i(GIT_EBAREREPO, git_reset(bare, target, GIT_RESET_HARD, NULL)); - - git_repository_free(bare); -} - -static void index_entry_init(git_index *index, int side, git_oid *oid) -{ - git_index_entry entry; - - memset(&entry, 0x0, sizeof(git_index_entry)); - - entry.path = "conflicting_file"; - GIT_IDXENTRY_STAGE_SET(&entry, side); - entry.mode = 0100644; - git_oid_cpy(&entry.id, oid); - - cl_git_pass(git_index_add(index, &entry)); -} - -static void unmerged_index_init(git_index *index, int entries) -{ - int write_ancestor = 1; - int write_ours = 2; - int write_theirs = 4; - git_oid ancestor, ours, theirs; - - git_oid_fromstr(&ancestor, "6bb0d9f700543ba3d318ba7075fc3bd696b4287b"); - git_oid_fromstr(&ours, "b19a1e93bec1317dc6097229e12afaffbfa74dc2"); - git_oid_fromstr(&theirs, "950b81b7eee953d050aa05a641f8e056c85dd1bd"); - - cl_git_rewritefile("status/conflicting_file", "conflicting file\n"); - - if (entries & write_ancestor) - index_entry_init(index, 1, &ancestor); - - if (entries & write_ours) - index_entry_init(index, 2, &ours); - - if (entries & write_theirs) - index_entry_init(index, 3, &theirs); -} - -void test_reset_hard__resetting_reverts_unmerged(void) -{ - git_index *index; - int entries; - - /* Ensure every permutation of non-zero stage entries results in the - * path being cleaned up. */ - for (entries = 1; entries < 8; entries++) { - cl_git_pass(git_repository_index(&index, repo)); - - unmerged_index_init(index, entries); - cl_git_pass(git_index_write(index)); - - cl_git_pass(git_revparse_single(&target, repo, "26a125e")); - cl_git_pass(git_reset(repo, target, GIT_RESET_HARD, NULL)); - - cl_assert(git_path_exists("status/conflicting_file") == 0); - - git_object_free(target); - target = NULL; - - git_index_free(index); - } -} - -void test_reset_hard__cleans_up_merge(void) -{ - git_buf merge_head_path = GIT_BUF_INIT, - merge_msg_path = GIT_BUF_INIT, - merge_mode_path = GIT_BUF_INIT, - orig_head_path = GIT_BUF_INIT; - - cl_git_pass(git_buf_joinpath(&merge_head_path, git_repository_path(repo), "MERGE_HEAD")); - cl_git_mkfile(git_buf_cstr(&merge_head_path), "beefbeefbeefbeefbeefbeefbeefbeefbeefbeef\n"); - - cl_git_pass(git_buf_joinpath(&merge_msg_path, git_repository_path(repo), "MERGE_MSG")); - cl_git_mkfile(git_buf_cstr(&merge_msg_path), "Merge commit 0017bd4ab1ec30440b17bae1680cff124ab5f1f6\n"); - - cl_git_pass(git_buf_joinpath(&merge_mode_path, git_repository_path(repo), "MERGE_MODE")); - cl_git_mkfile(git_buf_cstr(&merge_mode_path), ""); - - cl_git_pass(git_buf_joinpath(&orig_head_path, git_repository_path(repo), "ORIG_HEAD")); - cl_git_mkfile(git_buf_cstr(&orig_head_path), "0017bd4ab1ec30440b17bae1680cff124ab5f1f6"); - - cl_git_pass(git_revparse_single(&target, repo, "0017bd4")); - cl_git_pass(git_reset(repo, target, GIT_RESET_HARD, NULL)); - - cl_assert(!git_path_exists(git_buf_cstr(&merge_head_path))); - cl_assert(!git_path_exists(git_buf_cstr(&merge_msg_path))); - cl_assert(!git_path_exists(git_buf_cstr(&merge_mode_path))); - - cl_assert(git_path_exists(git_buf_cstr(&orig_head_path))); - cl_git_pass(p_unlink(git_buf_cstr(&orig_head_path))); - - git_buf_free(&merge_head_path); - git_buf_free(&merge_msg_path); - git_buf_free(&merge_mode_path); - git_buf_free(&orig_head_path); -} - -void test_reset_hard__reflog_is_correct(void) -{ - git_buf buf = GIT_BUF_INIT; - git_annotated_commit *annotated; - const char *exp_msg = "commit: Add a file which name should appear before the " - "\"subdir/\" folder while being dealt with by the treewalker"; - - reflog_check(repo, "HEAD", 3, "emeric.fermas@gmail.com", exp_msg); - reflog_check(repo, "refs/heads/master", 3, "emeric.fermas@gmail.com", exp_msg); - - /* Branch not moving, no reflog entry */ - cl_git_pass(git_revparse_single(&target, repo, "HEAD^{commit}")); - cl_git_pass(git_reset(repo, target, GIT_RESET_HARD, NULL)); - reflog_check(repo, "HEAD", 3, "emeric.fermas@gmail.com", exp_msg); - reflog_check(repo, "refs/heads/master", 3, "emeric.fermas@gmail.com", exp_msg); - - git_object_free(target); - - /* Moved branch, expect id in message */ - cl_git_pass(git_revparse_single(&target, repo, "HEAD~^{commit}")); - cl_git_pass(git_buf_printf(&buf, "reset: moving to %s", git_oid_tostr_s(git_object_id(target)))); - cl_git_pass(git_reset(repo, target, GIT_RESET_HARD, NULL)); - reflog_check(repo, "HEAD", 4, NULL, git_buf_cstr(&buf)); - reflog_check(repo, "refs/heads/master", 4, NULL, git_buf_cstr(&buf)); - - git_buf_free(&buf); - - /* Moved branch, expect revspec in message */ - exp_msg = "reset: moving to HEAD~^{commit}"; - cl_git_pass(git_annotated_commit_from_revspec(&annotated, repo, "HEAD~^{commit}")); - cl_git_pass(git_reset_from_annotated(repo, annotated, GIT_RESET_HARD, NULL)); - reflog_check(repo, "HEAD", 5, NULL, exp_msg); - reflog_check(repo, "refs/heads/master", 5, NULL, exp_msg); - - git_annotated_commit_free(annotated); - -} diff --git a/vendor/libgit2/tests/reset/mixed.c b/vendor/libgit2/tests/reset/mixed.c deleted file mode 100644 index 97eac74e8b..0000000000 --- a/vendor/libgit2/tests/reset/mixed.c +++ /dev/null @@ -1,85 +0,0 @@ -#include "clar_libgit2.h" -#include "posix.h" -#include "reset_helpers.h" -#include "path.h" - -static git_repository *repo; -static git_object *target; - -void test_reset_mixed__initialize(void) -{ - repo = cl_git_sandbox_init("attr"); - target = NULL; -} - -void test_reset_mixed__cleanup(void) -{ - git_object_free(target); - target = NULL; - - cl_git_sandbox_cleanup(); -} - -void test_reset_mixed__cannot_reset_in_a_bare_repository(void) -{ - git_repository *bare; - - cl_git_pass(git_repository_open(&bare, cl_fixture("testrepo.git"))); - cl_assert(git_repository_is_bare(bare) == true); - - cl_git_pass(git_revparse_single(&target, bare, KNOWN_COMMIT_IN_BARE_REPO)); - - cl_assert_equal_i(GIT_EBAREREPO, git_reset(bare, target, GIT_RESET_MIXED, NULL)); - - git_repository_free(bare); -} - -void test_reset_mixed__resetting_refreshes_the_index_to_the_commit_tree(void) -{ - unsigned int status; - - cl_git_pass(git_status_file(&status, repo, "macro_bad")); - cl_assert(status == GIT_STATUS_CURRENT); - cl_git_pass(git_revparse_single(&target, repo, "605812a")); - - cl_git_pass(git_reset(repo, target, GIT_RESET_MIXED, NULL)); - - cl_git_pass(git_status_file(&status, repo, "macro_bad")); - cl_assert(status == GIT_STATUS_WT_NEW); -} - -void test_reset_mixed__reflog_is_correct(void) -{ - git_buf buf = GIT_BUF_INIT; - git_annotated_commit *annotated; - const char *exp_msg = "commit: Updating test data so we can test inter-hunk-context"; - - reflog_check(repo, "HEAD", 9, "yoram.harmelin@gmail.com", exp_msg); - reflog_check(repo, "refs/heads/master", 9, "yoram.harmelin@gmail.com", exp_msg); - - /* Branch not moving, no reflog entry */ - cl_git_pass(git_revparse_single(&target, repo, "HEAD^{commit}")); - cl_git_pass(git_reset(repo, target, GIT_RESET_MIXED, NULL)); - reflog_check(repo, "HEAD", 9, "yoram.harmelin@gmail.com", exp_msg); - reflog_check(repo, "refs/heads/master", 9, "yoram.harmelin@gmail.com", exp_msg); - - git_object_free(target); - target = NULL; - - /* Moved branch, expect id in message */ - cl_git_pass(git_revparse_single(&target, repo, "HEAD~^{commit}")); - git_buf_clear(&buf); - cl_git_pass(git_buf_printf(&buf, "reset: moving to %s", git_oid_tostr_s(git_object_id(target)))); - cl_git_pass(git_reset(repo, target, GIT_RESET_MIXED, NULL)); - reflog_check(repo, "HEAD", 10, NULL, git_buf_cstr(&buf)); - reflog_check(repo, "refs/heads/master", 10, NULL, git_buf_cstr(&buf)); - git_buf_free(&buf); - - /* Moved branch, expect revspec in message */ - exp_msg = "reset: moving to HEAD~^{commit}"; - cl_git_pass(git_annotated_commit_from_revspec(&annotated, repo, "HEAD~^{commit}")); - cl_git_pass(git_reset_from_annotated(repo, annotated, GIT_RESET_MIXED, NULL)); - reflog_check(repo, "HEAD", 11, NULL, exp_msg); - reflog_check(repo, "refs/heads/master", 11, NULL, exp_msg); - git_annotated_commit_free(annotated); -} diff --git a/vendor/libgit2/tests/reset/reset_helpers.c b/vendor/libgit2/tests/reset/reset_helpers.c deleted file mode 100644 index e6acec9efd..0000000000 --- a/vendor/libgit2/tests/reset/reset_helpers.c +++ /dev/null @@ -1,20 +0,0 @@ -#include "clar_libgit2.h" -#include "reset_helpers.h" - -void reflog_check(git_repository *repo, const char *refname, - size_t exp_count, const char *exp_email, const char *exp_msg) -{ - git_reflog *log; - const git_reflog_entry *entry; - - GIT_UNUSED(exp_email); - - cl_git_pass(git_reflog_read(&log, repo, refname)); - cl_assert_equal_i(exp_count, git_reflog_entrycount(log)); - entry = git_reflog_entry_byindex(log, 0); - - if (exp_msg) - cl_assert_equal_s(exp_msg, git_reflog_entry_message(entry)); - - git_reflog_free(log); -} diff --git a/vendor/libgit2/tests/reset/reset_helpers.h b/vendor/libgit2/tests/reset/reset_helpers.h deleted file mode 100644 index e7e048514e..0000000000 --- a/vendor/libgit2/tests/reset/reset_helpers.h +++ /dev/null @@ -1,7 +0,0 @@ -#include "common.h" - -#define KNOWN_COMMIT_IN_BARE_REPO "e90810b8df3e80c413d903f631643c716887138d" -#define KNOWN_COMMIT_IN_ATTR_REPO "217878ab49e1314388ea2e32dc6fdb58a1b969e0" - -void reflog_check(git_repository *repo, const char *refname, - size_t exp_count, const char *exp_email, const char *exp_msg); diff --git a/vendor/libgit2/tests/reset/soft.c b/vendor/libgit2/tests/reset/soft.c deleted file mode 100644 index 506decaed9..0000000000 --- a/vendor/libgit2/tests/reset/soft.c +++ /dev/null @@ -1,189 +0,0 @@ -#include "clar_libgit2.h" -#include "posix.h" -#include "reset_helpers.h" -#include "path.h" -#include "repo/repo_helpers.h" - -static git_repository *repo; -static git_object *target; - -void test_reset_soft__initialize(void) -{ - repo = cl_git_sandbox_init("testrepo.git"); -} - -void test_reset_soft__cleanup(void) -{ - git_object_free(target); - target = NULL; - - cl_git_sandbox_cleanup(); -} - -static void assert_reset_soft(bool should_be_detached) -{ - git_oid oid; - - cl_git_pass(git_reference_name_to_id(&oid, repo, "HEAD")); - cl_git_fail(git_oid_streq(&oid, KNOWN_COMMIT_IN_BARE_REPO)); - cl_git_pass(git_revparse_single(&target, repo, KNOWN_COMMIT_IN_BARE_REPO)); - - cl_assert(git_repository_head_detached(repo) == should_be_detached); - - cl_git_pass(git_reset(repo, target, GIT_RESET_SOFT, NULL)); - - cl_assert(git_repository_head_detached(repo) == should_be_detached); - - cl_git_pass(git_reference_name_to_id(&oid, repo, "HEAD")); - cl_git_pass(git_oid_streq(&oid, KNOWN_COMMIT_IN_BARE_REPO)); -} - -void test_reset_soft__can_reset_the_non_detached_Head_to_the_specified_commit(void) -{ - assert_reset_soft(false); -} - -void test_reset_soft__can_reset_the_detached_Head_to_the_specified_commit(void) -{ - git_repository_detach_head(repo); - - assert_reset_soft(true); -} - -void test_reset_soft__resetting_to_the_commit_pointed_at_by_the_Head_does_not_change_the_target_of_the_Head(void) -{ - git_oid oid; - char raw_head_oid[GIT_OID_HEXSZ + 1]; - - cl_git_pass(git_reference_name_to_id(&oid, repo, "HEAD")); - git_oid_fmt(raw_head_oid, &oid); - raw_head_oid[GIT_OID_HEXSZ] = '\0'; - - cl_git_pass(git_revparse_single(&target, repo, raw_head_oid)); - - cl_git_pass(git_reset(repo, target, GIT_RESET_SOFT, NULL)); - - cl_git_pass(git_reference_name_to_id(&oid, repo, "HEAD")); - cl_git_pass(git_oid_streq(&oid, raw_head_oid)); -} - -void test_reset_soft__resetting_to_a_tag_sets_the_Head_to_the_peeled_commit(void) -{ - git_oid oid; - - /* b25fa35 is a tag, pointing to another tag which points to commit e90810b */ - cl_git_pass(git_revparse_single(&target, repo, "b25fa35")); - - cl_git_pass(git_reset(repo, target, GIT_RESET_SOFT, NULL)); - - cl_assert(git_repository_head_detached(repo) == false); - cl_git_pass(git_reference_name_to_id(&oid, repo, "HEAD")); - cl_git_pass(git_oid_streq(&oid, KNOWN_COMMIT_IN_BARE_REPO)); -} - -void test_reset_soft__cannot_reset_to_a_tag_not_pointing_at_a_commit(void) -{ - /* 53fc32d is the tree of commit e90810b */ - cl_git_pass(git_revparse_single(&target, repo, "53fc32d")); - - cl_git_fail(git_reset(repo, target, GIT_RESET_SOFT, NULL)); - git_object_free(target); - - /* 521d87c is an annotated tag pointing to a blob */ - cl_git_pass(git_revparse_single(&target, repo, "521d87c")); - cl_git_fail(git_reset(repo, target, GIT_RESET_SOFT, NULL)); -} - -void test_reset_soft__resetting_against_an_unborn_head_repo_makes_the_head_no_longer_unborn(void) -{ - git_reference *head; - - cl_git_pass(git_revparse_single(&target, repo, KNOWN_COMMIT_IN_BARE_REPO)); - - make_head_unborn(repo, NON_EXISTING_HEAD); - - cl_assert_equal_i(true, git_repository_head_unborn(repo)); - - cl_git_pass(git_reset(repo, target, GIT_RESET_SOFT, NULL)); - - cl_assert_equal_i(false, git_repository_head_unborn(repo)); - - cl_git_pass(git_reference_lookup(&head, repo, NON_EXISTING_HEAD)); - cl_assert_equal_i(0, git_oid_streq(git_reference_target(head), KNOWN_COMMIT_IN_BARE_REPO)); - - git_reference_free(head); -} - -void test_reset_soft__fails_when_merging(void) -{ - git_buf merge_head_path = GIT_BUF_INIT; - - cl_git_pass(git_repository_detach_head(repo)); - cl_git_pass(git_buf_joinpath(&merge_head_path, git_repository_path(repo), "MERGE_HEAD")); - cl_git_mkfile(git_buf_cstr(&merge_head_path), "beefbeefbeefbeefbeefbeefbeefbeefbeefbeef\n"); - - cl_git_pass(git_revparse_single(&target, repo, KNOWN_COMMIT_IN_BARE_REPO)); - - cl_assert_equal_i(GIT_EUNMERGED, git_reset(repo, target, GIT_RESET_SOFT, NULL)); - cl_git_pass(p_unlink(git_buf_cstr(&merge_head_path))); - - git_buf_free(&merge_head_path); -} - -void test_reset_soft__fails_when_index_contains_conflicts_independently_of_MERGE_HEAD_file_existence(void) -{ - git_index *index; - git_reference *head; - git_buf merge_head_path = GIT_BUF_INIT; - - cl_git_sandbox_cleanup(); - - repo = cl_git_sandbox_init("mergedrepo"); - - cl_git_pass(git_buf_joinpath(&merge_head_path, git_repository_path(repo), "MERGE_HEAD")); - cl_git_pass(p_unlink(git_buf_cstr(&merge_head_path))); - git_buf_free(&merge_head_path); - - cl_git_pass(git_repository_index(&index, repo)); - cl_assert_equal_i(true, git_index_has_conflicts(index)); - git_index_free(index); - - cl_git_pass(git_repository_head(&head, repo)); - cl_git_pass(git_reference_peel(&target, head, GIT_OBJ_COMMIT)); - git_reference_free(head); - - cl_assert_equal_i(GIT_EUNMERGED, git_reset(repo, target, GIT_RESET_SOFT, NULL)); -} - -void test_reset_soft__reflog_is_correct(void) -{ - git_annotated_commit *annotated; - const char *exp_msg = "checkout: moving from br2 to master"; - const char *master_msg = "commit: checking in"; - - reflog_check(repo, "HEAD", 7, "yoram.harmelin@gmail.com", exp_msg); - reflog_check(repo, "refs/heads/master", 2, "yoram.harmelin@gmail.com", master_msg); - - /* Branch not moving, no reflog entry */ - cl_git_pass(git_revparse_single(&target, repo, "HEAD^{commit}")); - cl_git_pass(git_reset(repo, target, GIT_RESET_SOFT, NULL)); - reflog_check(repo, "HEAD", 7, "yoram.harmelin@gmail.com", exp_msg); - reflog_check(repo, "refs/heads/master", 2, "yoram.harmelin@gmail.com", master_msg); - git_object_free(target); - - /* Moved branch, expect id in message */ - exp_msg = "reset: moving to be3563ae3f795b2b4353bcce3a527ad0a4f7f644"; - cl_git_pass(git_revparse_single(&target, repo, "HEAD~^{commit}")); - cl_git_pass(git_reset(repo, target, GIT_RESET_SOFT, NULL)); - reflog_check(repo, "HEAD", 8, "yoram.harmelin@gmail.com", exp_msg); - reflog_check(repo, "refs/heads/master", 3, NULL, exp_msg); - - /* Moved branch, expect message with annotated string */ - exp_msg = "reset: moving to HEAD~^{commit}"; - cl_git_pass(git_annotated_commit_from_revspec(&annotated, repo, "HEAD~^{commit}")); - cl_git_pass(git_reset_from_annotated(repo, annotated, GIT_RESET_SOFT, NULL)); - reflog_check(repo, "HEAD", 9, "yoram.harmelin@gmail.com", exp_msg); - reflog_check(repo, "refs/heads/master", 4, NULL, exp_msg); - - git_annotated_commit_free(annotated); -} diff --git a/vendor/libgit2/tests/resources/.gitattributes b/vendor/libgit2/tests/resources/.gitattributes deleted file mode 100644 index 556f8c827b..0000000000 --- a/vendor/libgit2/tests/resources/.gitattributes +++ /dev/null @@ -1 +0,0 @@ -* binary diff --git a/vendor/libgit2/tests/resources/.gitignore b/vendor/libgit2/tests/resources/.gitignore deleted file mode 100644 index 43a19cc9d3..0000000000 --- a/vendor/libgit2/tests/resources/.gitignore +++ /dev/null @@ -1 +0,0 @@ -discover.git diff --git a/vendor/libgit2/tests/resources/attr/.gitted/HEAD b/vendor/libgit2/tests/resources/attr/.gitted/HEAD deleted file mode 100644 index cb089cd89a..0000000000 --- a/vendor/libgit2/tests/resources/attr/.gitted/HEAD +++ /dev/null @@ -1 +0,0 @@ -ref: refs/heads/master diff --git a/vendor/libgit2/tests/resources/attr/.gitted/config b/vendor/libgit2/tests/resources/attr/.gitted/config deleted file mode 100644 index af107929f2..0000000000 --- a/vendor/libgit2/tests/resources/attr/.gitted/config +++ /dev/null @@ -1,6 +0,0 @@ -[core] - repositoryformatversion = 0 - filemode = true - bare = false - logallrefupdates = true - ignorecase = true diff --git a/vendor/libgit2/tests/resources/attr/.gitted/description b/vendor/libgit2/tests/resources/attr/.gitted/description deleted file mode 100644 index 498b267a8c..0000000000 --- a/vendor/libgit2/tests/resources/attr/.gitted/description +++ /dev/null @@ -1 +0,0 @@ -Unnamed repository; edit this file 'description' to name the repository. diff --git a/vendor/libgit2/tests/resources/attr/.gitted/index b/vendor/libgit2/tests/resources/attr/.gitted/index deleted file mode 100644 index 439ffb151e..0000000000 Binary files a/vendor/libgit2/tests/resources/attr/.gitted/index and /dev/null differ diff --git a/vendor/libgit2/tests/resources/attr/.gitted/info/attributes b/vendor/libgit2/tests/resources/attr/.gitted/info/attributes deleted file mode 100644 index 5fe62a37a5..0000000000 --- a/vendor/libgit2/tests/resources/attr/.gitted/info/attributes +++ /dev/null @@ -1,4 +0,0 @@ -* repoattr -a* foo !bar -baz -sub/*.txt reposub -sub/sub/*.txt reposubsub diff --git a/vendor/libgit2/tests/resources/attr/.gitted/info/exclude b/vendor/libgit2/tests/resources/attr/.gitted/info/exclude deleted file mode 100644 index a5196d1be8..0000000000 --- a/vendor/libgit2/tests/resources/attr/.gitted/info/exclude +++ /dev/null @@ -1,6 +0,0 @@ -# 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/vendor/libgit2/tests/resources/attr/.gitted/logs/HEAD b/vendor/libgit2/tests/resources/attr/.gitted/logs/HEAD deleted file mode 100644 index 8ece39f37f..0000000000 --- a/vendor/libgit2/tests/resources/attr/.gitted/logs/HEAD +++ /dev/null @@ -1,9 +0,0 @@ -0000000000000000000000000000000000000000 6bab5c79cd5140d0f800917f550eb2a3dc32b0da Russell Belfer 1324416995 -0800 commit (initial): initial test data -6bab5c79cd5140d0f800917f550eb2a3dc32b0da 605812ab7fe421fdd325a935d35cb06a9234a7d7 Russell Belfer 1325143098 -0800 commit: latest test updates -605812ab7fe421fdd325a935d35cb06a9234a7d7 a5d76cad53f66f1312bd995909a5bab3c0820770 Russell Belfer 1325281762 -0800 commit: more macro tests -a5d76cad53f66f1312bd995909a5bab3c0820770 370fe9ec224ce33e71f9e5ec2bd1142ce9937a6a Russell Belfer 1327611749 -0800 commit: Updating files so we can do diffs -370fe9ec224ce33e71f9e5ec2bd1142ce9937a6a f5b0af1fb4f5c0cd7aad880711d368a07333c307 Russell Belfer 1327621027 -0800 commit: Updating test data -f5b0af1fb4f5c0cd7aad880711d368a07333c307 a97cc019851d401a4f1d091cb91a15890a0dd1ba Russell Belfer 1328653313 -0800 commit: Some whitespace only changes for testing purposes -a97cc019851d401a4f1d091cb91a15890a0dd1ba 217878ab49e1314388ea2e32dc6fdb58a1b969e0 Russell Belfer 1332734901 -0700 commit: added files in sub/sub -217878ab49e1314388ea2e32dc6fdb58a1b969e0 24fa9a9fc4e202313e24b648087495441dab432b Russell Belfer 1332735555 -0700 commit: adding more files in sub for tree status -24fa9a9fc4e202313e24b648087495441dab432b 8d0b9df9bd30be7910ddda60548d485bc302b911 yorah 1341230701 +0200 commit: Updating test data so we can test inter-hunk-context diff --git a/vendor/libgit2/tests/resources/attr/.gitted/logs/refs/heads/master b/vendor/libgit2/tests/resources/attr/.gitted/logs/refs/heads/master deleted file mode 100644 index 8ece39f37f..0000000000 --- a/vendor/libgit2/tests/resources/attr/.gitted/logs/refs/heads/master +++ /dev/null @@ -1,9 +0,0 @@ -0000000000000000000000000000000000000000 6bab5c79cd5140d0f800917f550eb2a3dc32b0da Russell Belfer 1324416995 -0800 commit (initial): initial test data -6bab5c79cd5140d0f800917f550eb2a3dc32b0da 605812ab7fe421fdd325a935d35cb06a9234a7d7 Russell Belfer 1325143098 -0800 commit: latest test updates -605812ab7fe421fdd325a935d35cb06a9234a7d7 a5d76cad53f66f1312bd995909a5bab3c0820770 Russell Belfer 1325281762 -0800 commit: more macro tests -a5d76cad53f66f1312bd995909a5bab3c0820770 370fe9ec224ce33e71f9e5ec2bd1142ce9937a6a Russell Belfer 1327611749 -0800 commit: Updating files so we can do diffs -370fe9ec224ce33e71f9e5ec2bd1142ce9937a6a f5b0af1fb4f5c0cd7aad880711d368a07333c307 Russell Belfer 1327621027 -0800 commit: Updating test data -f5b0af1fb4f5c0cd7aad880711d368a07333c307 a97cc019851d401a4f1d091cb91a15890a0dd1ba Russell Belfer 1328653313 -0800 commit: Some whitespace only changes for testing purposes -a97cc019851d401a4f1d091cb91a15890a0dd1ba 217878ab49e1314388ea2e32dc6fdb58a1b969e0 Russell Belfer 1332734901 -0700 commit: added files in sub/sub -217878ab49e1314388ea2e32dc6fdb58a1b969e0 24fa9a9fc4e202313e24b648087495441dab432b Russell Belfer 1332735555 -0700 commit: adding more files in sub for tree status -24fa9a9fc4e202313e24b648087495441dab432b 8d0b9df9bd30be7910ddda60548d485bc302b911 yorah 1341230701 +0200 commit: Updating test data so we can test inter-hunk-context diff --git a/vendor/libgit2/tests/resources/attr/.gitted/objects/10/8bb4e7fd7b16490dc33ff7d972151e73d7166e b/vendor/libgit2/tests/resources/attr/.gitted/objects/10/8bb4e7fd7b16490dc33ff7d972151e73d7166e deleted file mode 100644 index edcf7520c7..0000000000 Binary files a/vendor/libgit2/tests/resources/attr/.gitted/objects/10/8bb4e7fd7b16490dc33ff7d972151e73d7166e and /dev/null differ diff --git a/vendor/libgit2/tests/resources/attr/.gitted/objects/16/983da6643656bb44c43965ecb6855c6d574512 b/vendor/libgit2/tests/resources/attr/.gitted/objects/16/983da6643656bb44c43965ecb6855c6d574512 deleted file mode 100644 index e49c94acda..0000000000 Binary files a/vendor/libgit2/tests/resources/attr/.gitted/objects/16/983da6643656bb44c43965ecb6855c6d574512 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/attr/.gitted/objects/21/7878ab49e1314388ea2e32dc6fdb58a1b969e0 b/vendor/libgit2/tests/resources/attr/.gitted/objects/21/7878ab49e1314388ea2e32dc6fdb58a1b969e0 deleted file mode 100644 index b537899f28..0000000000 --- a/vendor/libgit2/tests/resources/attr/.gitted/objects/21/7878ab49e1314388ea2e32dc6fdb58a1b969e0 +++ /dev/null @@ -1,4 +0,0 @@ -xťŽQ -Â0DýÎ)öęn“ŘDÄ#xmv…ÖJ’Ţ߀7đcx0ĽIۺΠ­¨‚óž-ąĚÁń+e"Ľvů‚Á‡śâťůpŃwŽcJH1x‡Ô%Ś”¦HL>Ddˇ‰ ďíµxîµę˛ŔC—¬®\ʤz˙á”¶ődí0Z‘ŕ#˘ém˙ŘşţĎÚ° -äyŃ -óę>ť{Ě–qK˛ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/attr/.gitted/objects/24/fa9a9fc4e202313e24b648087495441dab432b b/vendor/libgit2/tests/resources/attr/.gitted/objects/24/fa9a9fc4e202313e24b648087495441dab432b deleted file mode 100644 index e7099bbaa4..0000000000 Binary files a/vendor/libgit2/tests/resources/attr/.gitted/objects/24/fa9a9fc4e202313e24b648087495441dab432b and /dev/null differ diff --git a/vendor/libgit2/tests/resources/attr/.gitted/objects/29/29de282ce999e95183aedac6451d3384559c4b b/vendor/libgit2/tests/resources/attr/.gitted/objects/29/29de282ce999e95183aedac6451d3384559c4b deleted file mode 100644 index ad84f0854e..0000000000 Binary files a/vendor/libgit2/tests/resources/attr/.gitted/objects/29/29de282ce999e95183aedac6451d3384559c4b and /dev/null differ diff --git a/vendor/libgit2/tests/resources/attr/.gitted/objects/2b/40c5aca159b04ea8d20ffe36cdf8b09369b14a b/vendor/libgit2/tests/resources/attr/.gitted/objects/2b/40c5aca159b04ea8d20ffe36cdf8b09369b14a deleted file mode 100644 index 0e23680698..0000000000 --- a/vendor/libgit2/tests/resources/attr/.gitted/objects/2b/40c5aca159b04ea8d20ffe36cdf8b09369b14a +++ /dev/null @@ -1 +0,0 @@ -xmPŃj„0ě«ůŠ=úP8Z…ŢSľ¤”cŁń hR6{=ĽŻobâ™Ň"šŮafvŚšś‚÷×ćéä#3‰ά=7P˙%[8ď yNlÍŁˇ>cŻ;gÓ•ĄkÇYXÄ9b|DŞ~VŘ—)…vżřńÎÜ• \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/attr/.gitted/objects/2c/66e14f77196ea763fb1e41612c1aa2bc2d8ed2 b/vendor/libgit2/tests/resources/attr/.gitted/objects/2c/66e14f77196ea763fb1e41612c1aa2bc2d8ed2 deleted file mode 100644 index 4b75d50eb4..0000000000 Binary files a/vendor/libgit2/tests/resources/attr/.gitted/objects/2c/66e14f77196ea763fb1e41612c1aa2bc2d8ed2 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/attr/.gitted/objects/2d/e7dfe3588f3c7e9ad59e7d50ba90e3329df9d9 b/vendor/libgit2/tests/resources/attr/.gitted/objects/2d/e7dfe3588f3c7e9ad59e7d50ba90e3329df9d9 deleted file mode 100644 index e0fd0468e8..0000000000 Binary files a/vendor/libgit2/tests/resources/attr/.gitted/objects/2d/e7dfe3588f3c7e9ad59e7d50ba90e3329df9d9 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/attr/.gitted/objects/37/0fe9ec224ce33e71f9e5ec2bd1142ce9937a6a b/vendor/libgit2/tests/resources/attr/.gitted/objects/37/0fe9ec224ce33e71f9e5ec2bd1142ce9937a6a deleted file mode 100644 index 9c37c5946c..0000000000 Binary files a/vendor/libgit2/tests/resources/attr/.gitted/objects/37/0fe9ec224ce33e71f9e5ec2bd1142ce9937a6a and /dev/null differ diff --git a/vendor/libgit2/tests/resources/attr/.gitted/objects/3a/6df026462ebafe455af9867d27eda20a9e0974 b/vendor/libgit2/tests/resources/attr/.gitted/objects/3a/6df026462ebafe455af9867d27eda20a9e0974 deleted file mode 100644 index c74add8265..0000000000 Binary files a/vendor/libgit2/tests/resources/attr/.gitted/objects/3a/6df026462ebafe455af9867d27eda20a9e0974 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/attr/.gitted/objects/3b/74db7ab381105dc0d28f8295a77f6a82989292 b/vendor/libgit2/tests/resources/attr/.gitted/objects/3b/74db7ab381105dc0d28f8295a77f6a82989292 deleted file mode 100644 index e5cef35fa4..0000000000 Binary files a/vendor/libgit2/tests/resources/attr/.gitted/objects/3b/74db7ab381105dc0d28f8295a77f6a82989292 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/attr/.gitted/objects/3e/42ffc54a663f9401cc25843d6c0e71a33e4249 b/vendor/libgit2/tests/resources/attr/.gitted/objects/3e/42ffc54a663f9401cc25843d6c0e71a33e4249 deleted file mode 100644 index 091d79b149..0000000000 Binary files a/vendor/libgit2/tests/resources/attr/.gitted/objects/3e/42ffc54a663f9401cc25843d6c0e71a33e4249 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/attr/.gitted/objects/45/141a79a77842c59a63229403220a4e4be74e3d b/vendor/libgit2/tests/resources/attr/.gitted/objects/45/141a79a77842c59a63229403220a4e4be74e3d deleted file mode 100644 index 5b58ef0243..0000000000 Binary files a/vendor/libgit2/tests/resources/attr/.gitted/objects/45/141a79a77842c59a63229403220a4e4be74e3d and /dev/null differ diff --git a/vendor/libgit2/tests/resources/attr/.gitted/objects/45/5a314fa848d52ae1f11d254da4f60858fc97f4 b/vendor/libgit2/tests/resources/attr/.gitted/objects/45/5a314fa848d52ae1f11d254da4f60858fc97f4 deleted file mode 100644 index f90f0d79cb..0000000000 Binary files a/vendor/libgit2/tests/resources/attr/.gitted/objects/45/5a314fa848d52ae1f11d254da4f60858fc97f4 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/attr/.gitted/objects/45/b983be36b73c0788dc9cbcb76cbb80fc7bb057 b/vendor/libgit2/tests/resources/attr/.gitted/objects/45/b983be36b73c0788dc9cbcb76cbb80fc7bb057 deleted file mode 100644 index 7ca4ceed50..0000000000 Binary files a/vendor/libgit2/tests/resources/attr/.gitted/objects/45/b983be36b73c0788dc9cbcb76cbb80fc7bb057 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/attr/.gitted/objects/4d/713dc48e6b1bd75b0d61ad078ba9ca3a56745d b/vendor/libgit2/tests/resources/attr/.gitted/objects/4d/713dc48e6b1bd75b0d61ad078ba9ca3a56745d deleted file mode 100644 index eb1e8d0c56..0000000000 --- a/vendor/libgit2/tests/resources/attr/.gitted/objects/4d/713dc48e6b1bd75b0d61ad078ba9ca3a56745d +++ /dev/null @@ -1,2 +0,0 @@ -xÁÁ € @ßWŶŕÇ -|ř§k 9n$ˇ}gŠ«ŕ:ʇîÂ;5°1Ąe–4\k_]‘ޟ٭hśDˇk›ý'~ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/attr/.gitted/objects/4e/49ba8c5b6c32ff28cd9dcb60be34df50fcc485 b/vendor/libgit2/tests/resources/attr/.gitted/objects/4e/49ba8c5b6c32ff28cd9dcb60be34df50fcc485 deleted file mode 100644 index 6fcc549b4f..0000000000 Binary files a/vendor/libgit2/tests/resources/attr/.gitted/objects/4e/49ba8c5b6c32ff28cd9dcb60be34df50fcc485 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/attr/.gitted/objects/55/6f8c827b8e4a02ad5cab77dca2bcb3e226b0b3 b/vendor/libgit2/tests/resources/attr/.gitted/objects/55/6f8c827b8e4a02ad5cab77dca2bcb3e226b0b3 deleted file mode 100644 index 4bcff1faaa..0000000000 Binary files a/vendor/libgit2/tests/resources/attr/.gitted/objects/55/6f8c827b8e4a02ad5cab77dca2bcb3e226b0b3 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/attr/.gitted/objects/58/19a185d77b03325aaf87cafc771db36f6ddca7 b/vendor/libgit2/tests/resources/attr/.gitted/objects/58/19a185d77b03325aaf87cafc771db36f6ddca7 deleted file mode 100644 index fe34eb63a2..0000000000 Binary files a/vendor/libgit2/tests/resources/attr/.gitted/objects/58/19a185d77b03325aaf87cafc771db36f6ddca7 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/attr/.gitted/objects/60/5812ab7fe421fdd325a935d35cb06a9234a7d7 b/vendor/libgit2/tests/resources/attr/.gitted/objects/60/5812ab7fe421fdd325a935d35cb06a9234a7d7 deleted file mode 100644 index b0cc51ee6b..0000000000 --- a/vendor/libgit2/tests/resources/attr/.gitted/objects/60/5812ab7fe421fdd325a935d35cb06a9234a7d7 +++ /dev/null @@ -1,2 +0,0 @@ -xťNŰ Â0ă;SÜ Ë»•BŚŔ—ËU Ą´JÓý °?¶lŮ–y™çgcáU RbaâŮcG;¸l˛ă ťDqÖ Z©Ę«AH”<Ç‘ł×3Nâ¨ăä=J2d3[“0“˘˝=– -÷}ۤ¸I™¤Â™jM"םx™/ ­é[ÇŽŘçTwűÇÖă˙´Uˇ&[/ěkţ(őtJL \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/attr/.gitted/objects/6b/ab5c79cd5140d0f800917f550eb2a3dc32b0da b/vendor/libgit2/tests/resources/attr/.gitted/objects/6b/ab5c79cd5140d0f800917f550eb2a3dc32b0da deleted file mode 100644 index f51e11ccc8..0000000000 --- a/vendor/libgit2/tests/resources/attr/.gitted/objects/6b/ab5c79cd5140d0f800917f550eb2a3dc32b0da +++ /dev/null @@ -1,3 +0,0 @@ -xťŤŰ Ă0 Eűí)´@‹d'~@(Ą#tĹQ¨ÁiŔQöݎôëÂánŢ·­(Pôm"Ĺ2ćh°s L+Źd{—"{Zś“`řÔ÷Ţŕu‡Ô -O©«4¸µYäń›[Ţ·;łĂ@>Ą®M§ýS»ţOmʧhá -*‡ÂÂĘć ż<- \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/attr/.gitted/objects/6d/968d62c89c7d9ea23a4c9a7b665d017c3d8ffd b/vendor/libgit2/tests/resources/attr/.gitted/objects/6d/968d62c89c7d9ea23a4c9a7b665d017c3d8ffd deleted file mode 100644 index e832241c9e..0000000000 Binary files a/vendor/libgit2/tests/resources/attr/.gitted/objects/6d/968d62c89c7d9ea23a4c9a7b665d017c3d8ffd and /dev/null differ diff --git a/vendor/libgit2/tests/resources/attr/.gitted/objects/71/7fc31f6b84f9d6fc3a4edbca259d7fc92beee2 b/vendor/libgit2/tests/resources/attr/.gitted/objects/71/7fc31f6b84f9d6fc3a4edbca259d7fc92beee2 deleted file mode 100644 index a80265caca..0000000000 Binary files a/vendor/libgit2/tests/resources/attr/.gitted/objects/71/7fc31f6b84f9d6fc3a4edbca259d7fc92beee2 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/attr/.gitted/objects/8d/0b9df9bd30be7910ddda60548d485bc302b911 b/vendor/libgit2/tests/resources/attr/.gitted/objects/8d/0b9df9bd30be7910ddda60548d485bc302b911 deleted file mode 100644 index 3dcf088e44..0000000000 --- a/vendor/libgit2/tests/resources/attr/.gitted/objects/8d/0b9df9bd30be7910ddda60548d485bc302b911 +++ /dev/null @@ -1 +0,0 @@ -xťŽKj1DłÖ)zolôiőŚ _"hiÚK2˛L’ŰG!7ČŞݍÔJÉ,ů—ŃEŔPXÝĆDčČSŚ ] /)Ňę}˘Í/čŤUwîR§. Ĺj댋‘pŐë‚Á#šŤ#:?ÇŢ:|·Î;ĽţF9íÜ‹Ür=_ çŰ)µňơ±N/ÚŔA[­ŐlçĂ!˙qŐű}ă‘ë†<Lfx4řH\˙ş\çôqÖŹcj“ż†úTč \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/attr/.gitted/objects/93/61f40bb97239cf55811892e14de2e344168ba1 b/vendor/libgit2/tests/resources/attr/.gitted/objects/93/61f40bb97239cf55811892e14de2e344168ba1 deleted file mode 100644 index 4b57836cd2..0000000000 Binary files a/vendor/libgit2/tests/resources/attr/.gitted/objects/93/61f40bb97239cf55811892e14de2e344168ba1 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/attr/.gitted/objects/94/da4faa0a6bfb8ee6ccf7153801a69202b31857 b/vendor/libgit2/tests/resources/attr/.gitted/objects/94/da4faa0a6bfb8ee6ccf7153801a69202b31857 deleted file mode 100644 index a9ddf5d20d..0000000000 Binary files a/vendor/libgit2/tests/resources/attr/.gitted/objects/94/da4faa0a6bfb8ee6ccf7153801a69202b31857 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/attr/.gitted/objects/96/089fd31ce1d3ee2afb0ba09ba063066932f027 b/vendor/libgit2/tests/resources/attr/.gitted/objects/96/089fd31ce1d3ee2afb0ba09ba063066932f027 deleted file mode 100644 index efa62f9126..0000000000 Binary files a/vendor/libgit2/tests/resources/attr/.gitted/objects/96/089fd31ce1d3ee2afb0ba09ba063066932f027 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/attr/.gitted/objects/99/eae476896f4907224978b88e5ecaa6c5bb67a9 b/vendor/libgit2/tests/resources/attr/.gitted/objects/99/eae476896f4907224978b88e5ecaa6c5bb67a9 deleted file mode 100644 index 8f5acc70a0..0000000000 Binary files a/vendor/libgit2/tests/resources/attr/.gitted/objects/99/eae476896f4907224978b88e5ecaa6c5bb67a9 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/attr/.gitted/objects/9e/5bdc47d6a80f2be0ea3049ad74231b94609242 b/vendor/libgit2/tests/resources/attr/.gitted/objects/9e/5bdc47d6a80f2be0ea3049ad74231b94609242 deleted file mode 100644 index d6385ec8d6..0000000000 Binary files a/vendor/libgit2/tests/resources/attr/.gitted/objects/9e/5bdc47d6a80f2be0ea3049ad74231b94609242 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/attr/.gitted/objects/9f/b40b6675dde60b5697afceae91b66d908c02d9 b/vendor/libgit2/tests/resources/attr/.gitted/objects/9f/b40b6675dde60b5697afceae91b66d908c02d9 deleted file mode 100644 index 7663ad0ad9..0000000000 Binary files a/vendor/libgit2/tests/resources/attr/.gitted/objects/9f/b40b6675dde60b5697afceae91b66d908c02d9 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/attr/.gitted/objects/a0/f7217ae99f5ac3e88534f5cea267febc5fa85b b/vendor/libgit2/tests/resources/attr/.gitted/objects/a0/f7217ae99f5ac3e88534f5cea267febc5fa85b deleted file mode 100644 index 985c2e2813..0000000000 --- a/vendor/libgit2/tests/resources/attr/.gitted/objects/a0/f7217ae99f5ac3e88534f5cea267febc5fa85b +++ /dev/null @@ -1 +0,0 @@ -x5Ž1Â0 E™}Š?–΀;•SâÔ®’”ŠŰ“Đv´ýߢ8źO‡'FČČ:2r™ť)(ľ &˘Ţ·«×9ZĽA ÂđłĽŃąr9Ýl¬ %¨„3ŃEo‚Ł.˙V­Ői!"ZB;u¤ŕ3Cm˙ í § ‡{.7µZź4âavfČÖgBLĘEeP;NQÚ¬BŚLAnŲIĆç ŢÔů5ÁI»)MŃ6Z•śQ[ -h3Úe: - ůě}ćŁu¸Ćŕ}‡ď…;ś©÷Č|ýĹ)µzµ&ô¦ĽÓp”›”bŃőq®ú?¶¨­3TJ˝Áä1‡ř3ŮJX \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/attr/.gitted/objects/a9/7cc019851d401a4f1d091cb91a15890a0dd1ba b/vendor/libgit2/tests/resources/attr/.gitted/objects/a9/7cc019851d401a4f1d091cb91a15890a0dd1ba deleted file mode 100644 index 1a7ec0c55e..0000000000 --- a/vendor/libgit2/tests/resources/attr/.gitted/objects/a9/7cc019851d401a4f1d091cb91a15890a0dd1ba +++ /dev/null @@ -1,2 +0,0 @@ -xťŽQjÄ0 DűíSč[ähc;PJéÚ(˛Ľ $q°–Ţľ†Ţ _3oŕIŢ÷µÁŕÜK+ŞŕâäBt„I|ś”â»LěgçĆÖ ĹR4'=¤qFN6Í÷4 -JôĚ1ôÖFrŃ‘zĂW[rŻ«VÝ6řÔ-i7.eVýř‹WÉű;X‚‰,Á ˘émwl˙ĎŰ|ç]ṬMëɢŹídáăˇRwęC[ŹśW9sŐj~’Wy \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/attr/.gitted/objects/b4/35cd5689a0fb54afbeda4ac20368aa480e8f04 b/vendor/libgit2/tests/resources/attr/.gitted/objects/b4/35cd5689a0fb54afbeda4ac20368aa480e8f04 deleted file mode 100644 index ffe3473f4b..0000000000 Binary files a/vendor/libgit2/tests/resources/attr/.gitted/objects/b4/35cd5689a0fb54afbeda4ac20368aa480e8f04 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/attr/.gitted/objects/c0/091889c0c77142b87a1fa5123a6398a61d33e7 b/vendor/libgit2/tests/resources/attr/.gitted/objects/c0/091889c0c77142b87a1fa5123a6398a61d33e7 deleted file mode 100644 index 11dc63c79e..0000000000 Binary files a/vendor/libgit2/tests/resources/attr/.gitted/objects/c0/091889c0c77142b87a1fa5123a6398a61d33e7 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/attr/.gitted/objects/c4/85abe35abd4aa6fd83b076a78bbea9e2e7e06c b/vendor/libgit2/tests/resources/attr/.gitted/objects/c4/85abe35abd4aa6fd83b076a78bbea9e2e7e06c deleted file mode 100644 index 58569ca0ee..0000000000 Binary files a/vendor/libgit2/tests/resources/attr/.gitted/objects/c4/85abe35abd4aa6fd83b076a78bbea9e2e7e06c and /dev/null differ diff --git a/vendor/libgit2/tests/resources/attr/.gitted/objects/c7/aadd770d5907a8475c29e9ee21a27b88bf675d b/vendor/libgit2/tests/resources/attr/.gitted/objects/c7/aadd770d5907a8475c29e9ee21a27b88bf675d deleted file mode 100644 index 39aedb7d95..0000000000 Binary files a/vendor/libgit2/tests/resources/attr/.gitted/objects/c7/aadd770d5907a8475c29e9ee21a27b88bf675d and /dev/null differ diff --git a/vendor/libgit2/tests/resources/attr/.gitted/objects/c9/6bbb2c2557a8325ae1559e3ba79cdcecb23076 b/vendor/libgit2/tests/resources/attr/.gitted/objects/c9/6bbb2c2557a8325ae1559e3ba79cdcecb23076 deleted file mode 100644 index 589f9ad319..0000000000 --- a/vendor/libgit2/tests/resources/attr/.gitted/objects/c9/6bbb2c2557a8325ae1559e3ba79cdcecb23076 +++ /dev/null @@ -1,2 +0,0 @@ -x5ŤA -Â0D]˙SĚεčoŕÂuJ~L0ýÍŻˇ··)¸xĂcfŞśpą]OOΊcńB µ6‘»!뢴˛Ăł‚{,áU 1335817070 -0700 commit (initial): Initial commit -67c1640e91ccbaf0793591be09bf572cf40c9a53 d441d7d88f52c28c2b23940ce4c33756748425f9 Russell Belfer 1335817296 -0700 commit: Adding some files in subtrees -d441d7d88f52c28c2b23940ce4c33756748425f9 67c1640e91ccbaf0793591be09bf572cf40c9a53 Russell Belfer 1335817353 -0700 HEAD^: updating HEAD -67c1640e91ccbaf0793591be09bf572cf40c9a53 58f7cf825b553ef7c26e5b9f8a23599c1a9ca296 Russell Belfer 1335817372 -0700 commit: Adding subtree data diff --git a/vendor/libgit2/tests/resources/attr_index/.gitted/logs/refs/heads/master b/vendor/libgit2/tests/resources/attr_index/.gitted/logs/refs/heads/master deleted file mode 100644 index ffd298c048..0000000000 --- a/vendor/libgit2/tests/resources/attr_index/.gitted/logs/refs/heads/master +++ /dev/null @@ -1,4 +0,0 @@ -0000000000000000000000000000000000000000 67c1640e91ccbaf0793591be09bf572cf40c9a53 Russell Belfer 1335817070 -0700 commit (initial): Initial commit -67c1640e91ccbaf0793591be09bf572cf40c9a53 d441d7d88f52c28c2b23940ce4c33756748425f9 Russell Belfer 1335817296 -0700 commit: Adding some files in subtrees -d441d7d88f52c28c2b23940ce4c33756748425f9 67c1640e91ccbaf0793591be09bf572cf40c9a53 Russell Belfer 1335817353 -0700 HEAD^: updating HEAD -67c1640e91ccbaf0793591be09bf572cf40c9a53 58f7cf825b553ef7c26e5b9f8a23599c1a9ca296 Russell Belfer 1335817372 -0700 commit: Adding subtree data diff --git a/vendor/libgit2/tests/resources/attr_index/.gitted/objects/38/12cfef36615db1788d4e63f90028007e17a348 b/vendor/libgit2/tests/resources/attr_index/.gitted/objects/38/12cfef36615db1788d4e63f90028007e17a348 deleted file mode 100644 index ee2991571c..0000000000 --- a/vendor/libgit2/tests/resources/attr_index/.gitted/objects/38/12cfef36615db1788d4e63f90028007e17a348 +++ /dev/null @@ -1,3 +0,0 @@ -x•Ž[ -Ă Eűí*Ü@‹ŽPJé -]€š™&“`Ěţëúw¸ś 'oĄĚM¸K«D’ ‚q•4¤ĘËě5DFË#šä!!=VZ›DĎ.łL†:%L}!dCެg›¶*ßçqвČ-LUŢkz~ç6ťé–·ňÚ«íŕWĺ”}í}­«˙>ĹgťËľŐ{fžâú%ń ˇGň \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/attr_index/.gitted/objects/59/d942b8be2784bc96db9b22202c10815c9a077b b/vendor/libgit2/tests/resources/attr_index/.gitted/objects/59/d942b8be2784bc96db9b22202c10815c9a077b deleted file mode 100644 index ff33737dbf..0000000000 --- a/vendor/libgit2/tests/resources/attr_index/.gitted/objects/59/d942b8be2784bc96db9b22202c10815c9a077b +++ /dev/null @@ -1 +0,0 @@ -x ĂŃ €0 @żťâÍŕ‡“¸@kR”’@ßÂ]˝ă<¶K4±ÜnŐÔĹY‰á)l(a¨hFHcc˙^ÔŹ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/attr_index/.gitted/objects/cd/f17ea3fe625ef812f4dce7f423f4f299287505 b/vendor/libgit2/tests/resources/attr_index/.gitted/objects/cd/f17ea3fe625ef812f4dce7f423f4f299287505 deleted file mode 100644 index 2a410057ef..0000000000 Binary files a/vendor/libgit2/tests/resources/attr_index/.gitted/objects/cd/f17ea3fe625ef812f4dce7f423f4f299287505 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/attr_index/.gitted/objects/f7/2502ddd01412bb20796ff812af56fd53b82b52 b/vendor/libgit2/tests/resources/attr_index/.gitted/objects/f7/2502ddd01412bb20796ff812af56fd53b82b52 deleted file mode 100644 index 0489280004..0000000000 Binary files a/vendor/libgit2/tests/resources/attr_index/.gitted/objects/f7/2502ddd01412bb20796ff812af56fd53b82b52 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/attr_index/.gitted/objects/info/packs b/vendor/libgit2/tests/resources/attr_index/.gitted/objects/info/packs deleted file mode 100644 index 559dc741ce..0000000000 --- a/vendor/libgit2/tests/resources/attr_index/.gitted/objects/info/packs +++ /dev/null @@ -1,2 +0,0 @@ -P pack-4e6438607204ce78827e3885594b2c0bb4f13895.pack - diff --git a/vendor/libgit2/tests/resources/attr_index/.gitted/objects/pack/pack-4e6438607204ce78827e3885594b2c0bb4f13895.idx b/vendor/libgit2/tests/resources/attr_index/.gitted/objects/pack/pack-4e6438607204ce78827e3885594b2c0bb4f13895.idx deleted file mode 100644 index fbef4aa1d2..0000000000 Binary files a/vendor/libgit2/tests/resources/attr_index/.gitted/objects/pack/pack-4e6438607204ce78827e3885594b2c0bb4f13895.idx and /dev/null differ diff --git a/vendor/libgit2/tests/resources/attr_index/.gitted/objects/pack/pack-4e6438607204ce78827e3885594b2c0bb4f13895.pack b/vendor/libgit2/tests/resources/attr_index/.gitted/objects/pack/pack-4e6438607204ce78827e3885594b2c0bb4f13895.pack deleted file mode 100644 index 09c9e06d96..0000000000 Binary files a/vendor/libgit2/tests/resources/attr_index/.gitted/objects/pack/pack-4e6438607204ce78827e3885594b2c0bb4f13895.pack and /dev/null differ diff --git a/vendor/libgit2/tests/resources/attr_index/.gitted/packed-refs b/vendor/libgit2/tests/resources/attr_index/.gitted/packed-refs deleted file mode 100644 index 6b3e4decf9..0000000000 --- a/vendor/libgit2/tests/resources/attr_index/.gitted/packed-refs +++ /dev/null @@ -1,2 +0,0 @@ -# pack-refs with: peeled -58f7cf825b553ef7c26e5b9f8a23599c1a9ca296 refs/heads/master diff --git a/vendor/libgit2/tests/resources/attr_index/.gitted/refs/heads/master b/vendor/libgit2/tests/resources/attr_index/.gitted/refs/heads/master deleted file mode 100644 index 9b7562931f..0000000000 --- a/vendor/libgit2/tests/resources/attr_index/.gitted/refs/heads/master +++ /dev/null @@ -1 +0,0 @@ -3812cfef36615db1788d4e63f90028007e17a348 diff --git a/vendor/libgit2/tests/resources/attr_index/README.md b/vendor/libgit2/tests/resources/attr_index/README.md deleted file mode 100644 index 59d942b8be..0000000000 --- a/vendor/libgit2/tests/resources/attr_index/README.md +++ /dev/null @@ -1 +0,0 @@ -This is contains tests for when the index and work dir differ diff --git a/vendor/libgit2/tests/resources/attr_index/README.txt b/vendor/libgit2/tests/resources/attr_index/README.txt deleted file mode 100644 index 874c12b79a..0000000000 --- a/vendor/libgit2/tests/resources/attr_index/README.txt +++ /dev/null @@ -1 +0,0 @@ -This contains files for testing when the index and the workdir differ diff --git a/vendor/libgit2/tests/resources/attr_index/gitattributes b/vendor/libgit2/tests/resources/attr_index/gitattributes deleted file mode 100644 index cdf17ea3fe..0000000000 --- a/vendor/libgit2/tests/resources/attr_index/gitattributes +++ /dev/null @@ -1,4 +0,0 @@ -* bar -*.txt -foo beep=10 -*.md blargh=goop -bar - diff --git a/vendor/libgit2/tests/resources/attr_index/sub/sub/.gitattributes b/vendor/libgit2/tests/resources/attr_index/sub/sub/.gitattributes deleted file mode 100644 index 060c9a261b..0000000000 --- a/vendor/libgit2/tests/resources/attr_index/sub/sub/.gitattributes +++ /dev/null @@ -1,3 +0,0 @@ -*.txt another=one again -*.md bar=1234 - diff --git a/vendor/libgit2/tests/resources/attr_index/sub/sub/README.md b/vendor/libgit2/tests/resources/attr_index/sub/sub/README.md deleted file mode 100644 index 59652e3495..0000000000 --- a/vendor/libgit2/tests/resources/attr_index/sub/sub/README.md +++ /dev/null @@ -1 +0,0 @@ -More testing diff --git a/vendor/libgit2/tests/resources/attr_index/sub/sub/README.txt b/vendor/libgit2/tests/resources/attr_index/sub/sub/README.txt deleted file mode 100644 index 59652e3495..0000000000 --- a/vendor/libgit2/tests/resources/attr_index/sub/sub/README.txt +++ /dev/null @@ -1 +0,0 @@ -More testing diff --git a/vendor/libgit2/tests/resources/bad.index b/vendor/libgit2/tests/resources/bad.index deleted file mode 100644 index 53746549fe..0000000000 Binary files a/vendor/libgit2/tests/resources/bad.index and /dev/null differ diff --git a/vendor/libgit2/tests/resources/bad_tag.git/HEAD b/vendor/libgit2/tests/resources/bad_tag.git/HEAD deleted file mode 100644 index cb089cd89a..0000000000 --- a/vendor/libgit2/tests/resources/bad_tag.git/HEAD +++ /dev/null @@ -1 +0,0 @@ -ref: refs/heads/master diff --git a/vendor/libgit2/tests/resources/bad_tag.git/config b/vendor/libgit2/tests/resources/bad_tag.git/config deleted file mode 100644 index 2f8958058a..0000000000 --- a/vendor/libgit2/tests/resources/bad_tag.git/config +++ /dev/null @@ -1,5 +0,0 @@ -[core] - repositoryformatversion = 0 - filemode = true - bare = true - logallrefupdates = true diff --git a/vendor/libgit2/tests/resources/bad_tag.git/objects/pack/pack-7a28f4e000a17f49a41d7a79fc2f762a8a7d9164.idx b/vendor/libgit2/tests/resources/bad_tag.git/objects/pack/pack-7a28f4e000a17f49a41d7a79fc2f762a8a7d9164.idx deleted file mode 100644 index c404aa15bb..0000000000 Binary files a/vendor/libgit2/tests/resources/bad_tag.git/objects/pack/pack-7a28f4e000a17f49a41d7a79fc2f762a8a7d9164.idx and /dev/null differ diff --git a/vendor/libgit2/tests/resources/bad_tag.git/objects/pack/pack-7a28f4e000a17f49a41d7a79fc2f762a8a7d9164.pack b/vendor/libgit2/tests/resources/bad_tag.git/objects/pack/pack-7a28f4e000a17f49a41d7a79fc2f762a8a7d9164.pack deleted file mode 100644 index 90eac50322..0000000000 Binary files a/vendor/libgit2/tests/resources/bad_tag.git/objects/pack/pack-7a28f4e000a17f49a41d7a79fc2f762a8a7d9164.pack and /dev/null differ diff --git a/vendor/libgit2/tests/resources/bad_tag.git/packed-refs b/vendor/libgit2/tests/resources/bad_tag.git/packed-refs deleted file mode 100644 index 9da16459b8..0000000000 --- a/vendor/libgit2/tests/resources/bad_tag.git/packed-refs +++ /dev/null @@ -1,5 +0,0 @@ -# pack-refs with: peeled -eda9f45a2a98d4c17a09d681d88569fa4ea91755 refs/tags/e90810b -^e90810b8df3e80c413d903f631643c716887138d -d3bacb8d3ff25876a961b1963b6515170d0151ab refs/tags/hello -^6dcf9bf7541ee10456529833502442f385010c3d \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/bad_tag.git/refs/dummy-marker.txt b/vendor/libgit2/tests/resources/bad_tag.git/refs/dummy-marker.txt deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/vendor/libgit2/tests/resources/big.index b/vendor/libgit2/tests/resources/big.index deleted file mode 100644 index 66932f14b5..0000000000 Binary files a/vendor/libgit2/tests/resources/big.index and /dev/null differ diff --git a/vendor/libgit2/tests/resources/binaryunicode/.gitted/HEAD b/vendor/libgit2/tests/resources/binaryunicode/.gitted/HEAD deleted file mode 100644 index cb089cd89a..0000000000 --- a/vendor/libgit2/tests/resources/binaryunicode/.gitted/HEAD +++ /dev/null @@ -1 +0,0 @@ -ref: refs/heads/master diff --git a/vendor/libgit2/tests/resources/binaryunicode/.gitted/config b/vendor/libgit2/tests/resources/binaryunicode/.gitted/config deleted file mode 100644 index f9845fe7e4..0000000000 --- a/vendor/libgit2/tests/resources/binaryunicode/.gitted/config +++ /dev/null @@ -1,6 +0,0 @@ -[core] - repositoryformatversion = 0 - filemode = true - bare = false - autocrlf = true - logallrefupdates = true diff --git a/vendor/libgit2/tests/resources/binaryunicode/.gitted/description b/vendor/libgit2/tests/resources/binaryunicode/.gitted/description deleted file mode 100644 index 498b267a8c..0000000000 --- a/vendor/libgit2/tests/resources/binaryunicode/.gitted/description +++ /dev/null @@ -1 +0,0 @@ -Unnamed repository; edit this file 'description' to name the repository. diff --git a/vendor/libgit2/tests/resources/binaryunicode/.gitted/index b/vendor/libgit2/tests/resources/binaryunicode/.gitted/index deleted file mode 100644 index a216d22194..0000000000 Binary files a/vendor/libgit2/tests/resources/binaryunicode/.gitted/index and /dev/null differ diff --git a/vendor/libgit2/tests/resources/binaryunicode/.gitted/info/exclude b/vendor/libgit2/tests/resources/binaryunicode/.gitted/info/exclude deleted file mode 100644 index a5196d1be8..0000000000 --- a/vendor/libgit2/tests/resources/binaryunicode/.gitted/info/exclude +++ /dev/null @@ -1,6 +0,0 @@ -# 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/vendor/libgit2/tests/resources/binaryunicode/.gitted/info/refs b/vendor/libgit2/tests/resources/binaryunicode/.gitted/info/refs deleted file mode 100644 index 128eea7c93..0000000000 --- a/vendor/libgit2/tests/resources/binaryunicode/.gitted/info/refs +++ /dev/null @@ -1,3 +0,0 @@ -39e046d1416a208265b754124d0d197b4c9c0c47 refs/heads/branch1 -9e7d8bcd4d24dd57e3f1179aaf7afe648ff50e80 refs/heads/branch2 -d2a291469f4c11f387600d189313b927ddfe891c refs/heads/master diff --git a/vendor/libgit2/tests/resources/binaryunicode/.gitted/objects/info/packs b/vendor/libgit2/tests/resources/binaryunicode/.gitted/objects/info/packs deleted file mode 100644 index c2de8f5cb8..0000000000 --- a/vendor/libgit2/tests/resources/binaryunicode/.gitted/objects/info/packs +++ /dev/null @@ -1,2 +0,0 @@ -P pack-c5bfca875b4995d7aba6e5abf36241f3c397327d.pack - diff --git a/vendor/libgit2/tests/resources/binaryunicode/.gitted/objects/pack/pack-c5bfca875b4995d7aba6e5abf36241f3c397327d.idx b/vendor/libgit2/tests/resources/binaryunicode/.gitted/objects/pack/pack-c5bfca875b4995d7aba6e5abf36241f3c397327d.idx deleted file mode 100644 index 8a05b2beb0..0000000000 Binary files a/vendor/libgit2/tests/resources/binaryunicode/.gitted/objects/pack/pack-c5bfca875b4995d7aba6e5abf36241f3c397327d.idx and /dev/null differ diff --git a/vendor/libgit2/tests/resources/binaryunicode/.gitted/objects/pack/pack-c5bfca875b4995d7aba6e5abf36241f3c397327d.pack b/vendor/libgit2/tests/resources/binaryunicode/.gitted/objects/pack/pack-c5bfca875b4995d7aba6e5abf36241f3c397327d.pack deleted file mode 100644 index 6b5ddc4144..0000000000 Binary files a/vendor/libgit2/tests/resources/binaryunicode/.gitted/objects/pack/pack-c5bfca875b4995d7aba6e5abf36241f3c397327d.pack and /dev/null differ diff --git a/vendor/libgit2/tests/resources/binaryunicode/.gitted/refs/heads/branch1 b/vendor/libgit2/tests/resources/binaryunicode/.gitted/refs/heads/branch1 deleted file mode 100644 index 0595fbd310..0000000000 --- a/vendor/libgit2/tests/resources/binaryunicode/.gitted/refs/heads/branch1 +++ /dev/null @@ -1 +0,0 @@ -39e046d1416a208265b754124d0d197b4c9c0c47 diff --git a/vendor/libgit2/tests/resources/binaryunicode/.gitted/refs/heads/branch2 b/vendor/libgit2/tests/resources/binaryunicode/.gitted/refs/heads/branch2 deleted file mode 100644 index d868566878..0000000000 --- a/vendor/libgit2/tests/resources/binaryunicode/.gitted/refs/heads/branch2 +++ /dev/null @@ -1 +0,0 @@ -9e7d8bcd4d24dd57e3f1179aaf7afe648ff50e80 diff --git a/vendor/libgit2/tests/resources/binaryunicode/.gitted/refs/heads/master b/vendor/libgit2/tests/resources/binaryunicode/.gitted/refs/heads/master deleted file mode 100644 index 552d166da4..0000000000 --- a/vendor/libgit2/tests/resources/binaryunicode/.gitted/refs/heads/master +++ /dev/null @@ -1 +0,0 @@ -d2a291469f4c11f387600d189313b927ddfe891c diff --git a/vendor/libgit2/tests/resources/binaryunicode/file.txt b/vendor/libgit2/tests/resources/binaryunicode/file.txt deleted file mode 100644 index 2255035d4d..0000000000 --- a/vendor/libgit2/tests/resources/binaryunicode/file.txt +++ /dev/null @@ -1 +0,0 @@ -Master branch. diff --git a/vendor/libgit2/tests/resources/blametest.git/HEAD b/vendor/libgit2/tests/resources/blametest.git/HEAD deleted file mode 100644 index cb089cd89a..0000000000 --- a/vendor/libgit2/tests/resources/blametest.git/HEAD +++ /dev/null @@ -1 +0,0 @@ -ref: refs/heads/master diff --git a/vendor/libgit2/tests/resources/blametest.git/config b/vendor/libgit2/tests/resources/blametest.git/config deleted file mode 100644 index c53d818dd9..0000000000 --- a/vendor/libgit2/tests/resources/blametest.git/config +++ /dev/null @@ -1,5 +0,0 @@ -[core] - repositoryformatversion = 0 - filemode = true - bare = true - ignorecase = true diff --git a/vendor/libgit2/tests/resources/blametest.git/description b/vendor/libgit2/tests/resources/blametest.git/description deleted file mode 100644 index 498b267a8c..0000000000 --- a/vendor/libgit2/tests/resources/blametest.git/description +++ /dev/null @@ -1 +0,0 @@ -Unnamed repository; edit this file 'description' to name the repository. diff --git a/vendor/libgit2/tests/resources/blametest.git/objects/0c/bab4d45fd61e55a1c9697f9f9cb07a12e15448 b/vendor/libgit2/tests/resources/blametest.git/objects/0c/bab4d45fd61e55a1c9697f9f9cb07a12e15448 deleted file mode 100644 index 90331cef9e..0000000000 Binary files a/vendor/libgit2/tests/resources/blametest.git/objects/0c/bab4d45fd61e55a1c9697f9f9cb07a12e15448 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/blametest.git/objects/1a/ac69ae5d96461afc4d81d0066cb12f5b05a35b b/vendor/libgit2/tests/resources/blametest.git/objects/1a/ac69ae5d96461afc4d81d0066cb12f5b05a35b deleted file mode 100644 index 71890274ac..0000000000 Binary files a/vendor/libgit2/tests/resources/blametest.git/objects/1a/ac69ae5d96461afc4d81d0066cb12f5b05a35b and /dev/null differ diff --git a/vendor/libgit2/tests/resources/blametest.git/objects/1b/5f0775af166331c854bd8d1bca3450eaf2532a b/vendor/libgit2/tests/resources/blametest.git/objects/1b/5f0775af166331c854bd8d1bca3450eaf2532a deleted file mode 100644 index e664306379..0000000000 Binary files a/vendor/libgit2/tests/resources/blametest.git/objects/1b/5f0775af166331c854bd8d1bca3450eaf2532a and /dev/null differ diff --git a/vendor/libgit2/tests/resources/blametest.git/objects/48/2f2c370e35c2c314fc1f96db2beb33f955a26a b/vendor/libgit2/tests/resources/blametest.git/objects/48/2f2c370e35c2c314fc1f96db2beb33f955a26a deleted file mode 100644 index 7da4cf5d4e..0000000000 Binary files a/vendor/libgit2/tests/resources/blametest.git/objects/48/2f2c370e35c2c314fc1f96db2beb33f955a26a and /dev/null differ diff --git a/vendor/libgit2/tests/resources/blametest.git/objects/63/d671eb32d250e4a83766ebbc60e818c1e1e93a b/vendor/libgit2/tests/resources/blametest.git/objects/63/d671eb32d250e4a83766ebbc60e818c1e1e93a deleted file mode 100644 index 5f41f29366..0000000000 --- a/vendor/libgit2/tests/resources/blametest.git/objects/63/d671eb32d250e4a83766ebbc60e818c1e1e93a +++ /dev/null @@ -1,3 +0,0 @@ -x•ŹA E]sŠŮuĄĘ@bڱGđŔP뢭Azk<ů’—Ľź×y~60­–Ił“1S´’=“-6÷FfC.†ěcp˝őе, $b -¶8MF -ᨹO!1eďČŹň]TqkÓZáV¸··çôľ>žmÚŇ)Żó49dŤě-Ń#Şťîm­üg©áw©şTK@Î \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/blametest.git/objects/63/eb57322e363e18d460da5ea8284f3cd2340b36 b/vendor/libgit2/tests/resources/blametest.git/objects/63/eb57322e363e18d460da5ea8284f3cd2340b36 deleted file mode 100644 index c6c285eeb4..0000000000 Binary files a/vendor/libgit2/tests/resources/blametest.git/objects/63/eb57322e363e18d460da5ea8284f3cd2340b36 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/blametest.git/objects/8b/137891791fe96927ad78e64b0aad7bded08bdc b/vendor/libgit2/tests/resources/blametest.git/objects/8b/137891791fe96927ad78e64b0aad7bded08bdc deleted file mode 100644 index 9d8f60531e..0000000000 Binary files a/vendor/libgit2/tests/resources/blametest.git/objects/8b/137891791fe96927ad78e64b0aad7bded08bdc and /dev/null differ diff --git a/vendor/libgit2/tests/resources/blametest.git/objects/96/679d59cf9f74d69b3c920f258559b5e8c9a18a b/vendor/libgit2/tests/resources/blametest.git/objects/96/679d59cf9f74d69b3c920f258559b5e8c9a18a deleted file mode 100644 index d716e3b034..0000000000 Binary files a/vendor/libgit2/tests/resources/blametest.git/objects/96/679d59cf9f74d69b3c920f258559b5e8c9a18a and /dev/null differ diff --git a/vendor/libgit2/tests/resources/blametest.git/objects/98/89d6e5557761aa8e3607e80c874a6dc51ada7c b/vendor/libgit2/tests/resources/blametest.git/objects/98/89d6e5557761aa8e3607e80c874a6dc51ada7c deleted file mode 100644 index 12407f662d..0000000000 Binary files a/vendor/libgit2/tests/resources/blametest.git/objects/98/89d6e5557761aa8e3607e80c874a6dc51ada7c and /dev/null differ diff --git a/vendor/libgit2/tests/resources/blametest.git/objects/aa/06ecca6c4ad6432ab9313e556ca92ba4bcf9e9 b/vendor/libgit2/tests/resources/blametest.git/objects/aa/06ecca6c4ad6432ab9313e556ca92ba4bcf9e9 deleted file mode 100644 index bc13badb1a..0000000000 --- a/vendor/libgit2/tests/resources/blametest.git/objects/aa/06ecca6c4ad6432ab9313e556ca92ba4bcf9e9 +++ /dev/null @@ -1 +0,0 @@ -x•ŹKÂ0 DYçŢu˛ă6I%„P9'Čǡ]ôŁŢź"NŔĚîI#˝‰ë­3‹L vîoŔ¸{őR-eĐΤ1#ŽóBĆ0Ť©}¶s9xăí‹R6d1’SˇËZÜx‡§´Đ#śăçúŢdíń”ją€&‡‹F§ Ń#ŞAGKř?KݧÇôgő2r \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/blametest.git/objects/bc/7c5ac2bafe828a68e9d1d460343718d6fbe136 b/vendor/libgit2/tests/resources/blametest.git/objects/bc/7c5ac2bafe828a68e9d1d460343718d6fbe136 deleted file mode 100644 index 4e6ad159e8..0000000000 --- a/vendor/libgit2/tests/resources/blametest.git/objects/bc/7c5ac2bafe828a68e9d1d460343718d6fbe136 +++ /dev/null @@ -1,3 +0,0 @@ -x•AnĂ0 {Ö+tË))J´AŰ3ö<í^ąGĄnŐ@$H­É\;ÍMęŹoă¶śŤúѬ‹ŁƤ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/blametest.git/objects/da/237394e6132d20d30f175b9b73c8638fddddda b/vendor/libgit2/tests/resources/blametest.git/objects/da/237394e6132d20d30f175b9b73c8638fddddda deleted file mode 100644 index e9e13833fd..0000000000 --- a/vendor/libgit2/tests/resources/blametest.git/objects/da/237394e6132d20d30f175b9b73c8638fddddda +++ /dev/null @@ -1,4 +0,0 @@ -x•ŹK -Â0@]÷łëJ™|'"˘ŢŔ$“ÔvŃVbz žŔíďÉ:ĎS­đĐj)ŃifŁŃ‘äDNS ĆdOĚbs§Ń[ěޱ–ĄAb( -¦Y;“fç¬(‚„‰®‹[× -·˛ŔłŐ¸%8§Ďő5µqK'Yç (ă‘zF8b@ěvş·µňźŐÝKýŁ˙c–?S \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/blametest.git/objects/e5/b41c1ea533f87388ab69b13baf0b5a562d6243 b/vendor/libgit2/tests/resources/blametest.git/objects/e5/b41c1ea533f87388ab69b13baf0b5a562d6243 deleted file mode 100644 index 7e5586c2b4..0000000000 Binary files a/vendor/libgit2/tests/resources/blametest.git/objects/e5/b41c1ea533f87388ab69b13baf0b5a562d6243 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/blametest.git/objects/ef/32df4d259143933715c74951f932d9892364d1 b/vendor/libgit2/tests/resources/blametest.git/objects/ef/32df4d259143933715c74951f932d9892364d1 deleted file mode 100644 index d021ccfde3..0000000000 Binary files a/vendor/libgit2/tests/resources/blametest.git/objects/ef/32df4d259143933715c74951f932d9892364d1 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/blametest.git/refs/heads/master b/vendor/libgit2/tests/resources/blametest.git/refs/heads/master deleted file mode 100644 index b763025d8c..0000000000 --- a/vendor/libgit2/tests/resources/blametest.git/refs/heads/master +++ /dev/null @@ -1 +0,0 @@ -bc7c5ac2bafe828a68e9d1d460343718d6fbe136 diff --git a/vendor/libgit2/tests/resources/cherrypick/.gitted/HEAD b/vendor/libgit2/tests/resources/cherrypick/.gitted/HEAD deleted file mode 100644 index 656ac0e0a8..0000000000 --- a/vendor/libgit2/tests/resources/cherrypick/.gitted/HEAD +++ /dev/null @@ -1 +0,0 @@ -ref: refs/heads/automerge-branch diff --git a/vendor/libgit2/tests/resources/cherrypick/.gitted/config b/vendor/libgit2/tests/resources/cherrypick/.gitted/config deleted file mode 100644 index 6c9406b7d9..0000000000 --- a/vendor/libgit2/tests/resources/cherrypick/.gitted/config +++ /dev/null @@ -1,7 +0,0 @@ -[core] - repositoryformatversion = 0 - filemode = true - bare = false - logallrefupdates = true - ignorecase = true - precomposeunicode = true diff --git a/vendor/libgit2/tests/resources/cherrypick/.gitted/index b/vendor/libgit2/tests/resources/cherrypick/.gitted/index deleted file mode 100644 index 7291006c88..0000000000 Binary files a/vendor/libgit2/tests/resources/cherrypick/.gitted/index and /dev/null differ diff --git a/vendor/libgit2/tests/resources/cherrypick/.gitted/info/exclude b/vendor/libgit2/tests/resources/cherrypick/.gitted/info/exclude deleted file mode 100644 index a5196d1be8..0000000000 --- a/vendor/libgit2/tests/resources/cherrypick/.gitted/info/exclude +++ /dev/null @@ -1,6 +0,0 @@ -# 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/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/01/a2b453c2647c71ccfefc285f2266d1f00b8253 b/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/01/a2b453c2647c71ccfefc285f2266d1f00b8253 deleted file mode 100644 index 736a7f57b3..0000000000 Binary files a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/01/a2b453c2647c71ccfefc285f2266d1f00b8253 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/02/67838e09bbc5969bba035be2d27c8a6de694d8 b/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/02/67838e09bbc5969bba035be2d27c8a6de694d8 deleted file mode 100644 index 4eacb26f50..0000000000 Binary files a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/02/67838e09bbc5969bba035be2d27c8a6de694d8 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/06/3fc9f01e6e9ec2a8d8f749885e931875e50d37 b/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/06/3fc9f01e6e9ec2a8d8f749885e931875e50d37 deleted file mode 100644 index 48fa6efcdd..0000000000 Binary files a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/06/3fc9f01e6e9ec2a8d8f749885e931875e50d37 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/08/9ac03f76058b5ba0b44bb268f317f9242481e9 b/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/08/9ac03f76058b5ba0b44bb268f317f9242481e9 deleted file mode 100644 index 06d1c694e5..0000000000 --- a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/08/9ac03f76058b5ba0b44bb268f317f9242481e9 +++ /dev/null @@ -1,3 +0,0 @@ -xĄÎA -Â0@Q×9Ĺ왤“i"î—Ţ`L§µB¬MÓ…··ŕÜľĹç§)籂#ŢŐ˘ -^ťCNťŘä™”Îb+%¸¬ŹŠ÷¨bŢRôU!ő‰zŚ1Jh¸ő)JO}딼ë b˝‘µ>¦WIóŞ \´äqy¬źŽĎź 祖QŞŇ”O`›ČDÍ6{tfÓmµę_sÓy‹‚@Ö2¨ů("O- \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/0d/447a6c2528b06616cde3b209a4b4ea3dcb8d65 b/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/0d/447a6c2528b06616cde3b209a4b4ea3dcb8d65 deleted file mode 100644 index 9a3ea32097..0000000000 Binary files a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/0d/447a6c2528b06616cde3b209a4b4ea3dcb8d65 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/11/24c2c1ae07b26fded662d6c3f3631d9dc16f88 b/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/11/24c2c1ae07b26fded662d6c3f3631d9dc16f88 deleted file mode 100644 index 62abc3c5be..0000000000 Binary files a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/11/24c2c1ae07b26fded662d6c3f3631d9dc16f88 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/12/905f4ea5b76f9d3fdcfe73e462201c06ae632a b/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/12/905f4ea5b76f9d3fdcfe73e462201c06ae632a deleted file mode 100644 index 162844a70b..0000000000 Binary files a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/12/905f4ea5b76f9d3fdcfe73e462201c06ae632a and /dev/null differ diff --git a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/19/c5c7207054604b69c84d08a7571ef9672bb5c2 b/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/19/c5c7207054604b69c84d08a7571ef9672bb5c2 deleted file mode 100644 index d5cd6d3f2d..0000000000 Binary files a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/19/c5c7207054604b69c84d08a7571ef9672bb5c2 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/1c/2116845780455ecf916538c1cc27c4222452af b/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/1c/2116845780455ecf916538c1cc27c4222452af deleted file mode 100644 index f9a841d4f1..0000000000 Binary files a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/1c/2116845780455ecf916538c1cc27c4222452af and /dev/null differ diff --git a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/1c/c85eb4ff0a8438fde1b14274c6f87f891b36a0 b/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/1c/c85eb4ff0a8438fde1b14274c6f87f891b36a0 deleted file mode 100644 index 98b792b644..0000000000 Binary files a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/1c/c85eb4ff0a8438fde1b14274c6f87f891b36a0 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/1e/1cb7391d25dcd8daba88f1f627f3045982286c b/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/1e/1cb7391d25dcd8daba88f1f627f3045982286c deleted file mode 100644 index 10a5be6fe1..0000000000 Binary files a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/1e/1cb7391d25dcd8daba88f1f627f3045982286c and /dev/null differ diff --git a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/20/fc1a4c9d994021f43d33ab75e4252e27ca661d b/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/20/fc1a4c9d994021f43d33ab75e4252e27ca661d deleted file mode 100644 index c8b26cd011..0000000000 Binary files a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/20/fc1a4c9d994021f43d33ab75e4252e27ca661d and /dev/null differ diff --git a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/28/d9eb4208074ad1cc84e71ccc908b34573f05d2 b/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/28/d9eb4208074ad1cc84e71ccc908b34573f05d2 deleted file mode 100644 index 80363b0169..0000000000 Binary files a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/28/d9eb4208074ad1cc84e71ccc908b34573f05d2 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/2a/26c7e88b285613b302ba76712bc998863f3cbc b/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/2a/26c7e88b285613b302ba76712bc998863f3cbc deleted file mode 100644 index 2831139998..0000000000 --- a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/2a/26c7e88b285613b302ba76712bc998863f3cbc +++ /dev/null @@ -1 +0,0 @@ -xĄŹMjĂ0…»Ö)f_jôď„]ˇËÜ`$Ź—*Nä1´·ŻC=@—ď{đń^YZ›lLOŇ™Á”‚łŻUz‡ub“Ť·Ł/±âX1™ě"iuŁÎWN9şębŮŇ„şčZŽS”&r4ŁmrY:ĽQąoĽÂ+÷6Ż—í{…ĂÇ/{?­ŇgĘŇŽ`\ŠŢk-Uř_uć+5ž Îźěůx9ţ…a?ő¨Ő7W… \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/2a/c3b376093de405b0a951bff578655b1c2b7fa1 b/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/2a/c3b376093de405b0a951bff578655b1c2b7fa1 deleted file mode 100644 index a3294d7644..0000000000 --- a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/2a/c3b376093de405b0a951bff578655b1c2b7fa1 +++ /dev/null @@ -1 +0,0 @@ -x•ŹÁJĹ0E]ç+f÷˘¤“Išw‚ŕGLŇÉk…´š¦ ˙ŢĘóÜž‡{óVëŇG{×›*¤A9ą ĘÄšcô:ĘPÜ”CJ’Bž¬ů”¦k‡\2ËĚ]}j‰ĄPQÉăD6b”Á9úĽ5x“üučŻÚę˛ĎÇ÷O7v}Ů{[¤ËcŢę3 Ž‘‹žŕޢµć¤çÔ®˙Ź#ţEĚ»¶ëyłÉšg¸TŮĎŕ–µoPŐĂM™Í/X \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/2c/acbcaabf785f1ac231e8519849d4ad38692f2c b/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/2c/acbcaabf785f1ac231e8519849d4ad38692f2c deleted file mode 100644 index 74b48dd6b6..0000000000 Binary files a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/2c/acbcaabf785f1ac231e8519849d4ad38692f2c and /dev/null differ diff --git a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/35/cb210149022c7379b0a67b0dec13cc628ff87d b/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/35/cb210149022c7379b0a67b0dec13cc628ff87d deleted file mode 100644 index c0466f46ae..0000000000 Binary files a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/35/cb210149022c7379b0a67b0dec13cc628ff87d and /dev/null differ diff --git a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/38/c05a857e831a7e759d83778bfc85d003e21c45 b/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/38/c05a857e831a7e759d83778bfc85d003e21c45 deleted file mode 100644 index d4f1cf8ac0..0000000000 Binary files a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/38/c05a857e831a7e759d83778bfc85d003e21c45 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/3f/9eed8946df9e2c737d3b8dc0b8e78959aacd92 b/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/3f/9eed8946df9e2c737d3b8dc0b8e78959aacd92 deleted file mode 100644 index 8c4d6d94f1..0000000000 --- a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/3f/9eed8946df9e2c737d3b8dc0b8e78959aacd92 +++ /dev/null @@ -1,5 +0,0 @@ -xťŹMjĂ0…»Ö)fj¤ńH– „ě]ćĂdÔ¸Dq#ËĐŢľ --tßĺűáă=YJ™`HO­Ş‚t.DňS´ä˝JN.ř1ŠÁIÉ#góÁUo $ e›Râ8†É‡¨–gĘj/žÉFŚěĽá­]– -Ż,÷MW8j-ózŮľVxy˙ńŢk«37d){pc -Ô°łh­énźÚô -îbNză˘gČóUǡ}6xŢ˙‰ˇźzÄćď*V8 \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/40/9a1bec58bf35348e8b62b72bb9c1f45cf5a587 b/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/40/9a1bec58bf35348e8b62b72bb9c1f45cf5a587 deleted file mode 100644 index 60d5dca4af..0000000000 Binary files a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/40/9a1bec58bf35348e8b62b72bb9c1f45cf5a587 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/44/cd2ed2052c9c68f9a439d208e9614dc2a55c70 b/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/44/cd2ed2052c9c68f9a439d208e9614dc2a55c70 deleted file mode 100644 index 8697c4e660..0000000000 --- a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/44/cd2ed2052c9c68f9a439d208e9614dc2a55c70 +++ /dev/null @@ -1 +0,0 @@ -xĄŹÁNÄ0C9ç+推’É$M$´â†Ä‘XÍ&Úi!M%ř{şđ ÜěgɲÓZëÜÇp×› .É0Ąc$Ť¦ÍÖňetBčPpLě˝Éę›,RITtŚ‘őŁóA4E.TFrI lśâ˝OkNź»lđ,­ÎŰ´ođxýcoO[o3wŇZO`lôD.÷µV=¦vůW‰z•…«d(ó»Řˇux8ýš›ŽO·ôĽ.çKă%MęÖ?ZŘ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/48/7434cace79238a7091e2220611d4f20a765690 b/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/48/7434cace79238a7091e2220611d4f20a765690 deleted file mode 100644 index a1fa599e18..0000000000 Binary files a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/48/7434cace79238a7091e2220611d4f20a765690 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/49/20ad2f17162dcc8823ad491444dcb87f5899c9 b/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/49/20ad2f17162dcc8823ad491444dcb87f5899c9 deleted file mode 100644 index bf96fccad5..0000000000 Binary files a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/49/20ad2f17162dcc8823ad491444dcb87f5899c9 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee4904 b/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee4904 deleted file mode 100644 index adf64119a3..0000000000 Binary files a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee4904 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/4c/532774cc1fea37f6efc2256763a64d38c8cdde b/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/4c/532774cc1fea37f6efc2256763a64d38c8cdde deleted file mode 100644 index 2e56d74035..0000000000 Binary files a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/4c/532774cc1fea37f6efc2256763a64d38c8cdde and /dev/null differ diff --git a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/51/145af30d411a50195b66517d825e69bf57ed22 b/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/51/145af30d411a50195b66517d825e69bf57ed22 deleted file mode 100644 index 3e01376bdf..0000000000 Binary files a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/51/145af30d411a50195b66517d825e69bf57ed22 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/54/61de53ffadbf15be4dd6345997c15689573209 b/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/54/61de53ffadbf15be4dd6345997c15689573209 deleted file mode 100644 index 7d2b233a65..0000000000 --- a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/54/61de53ffadbf15be4dd6345997c15689573209 +++ /dev/null @@ -1,4 +0,0 @@ -xťŹMjĂ0…»Ö)fj¤ńH– „ě]ćĂdÔ¸Dq#ËĐŢľ --tßĺűáă=YJ™`HO­Ş‚t.DňS´ä˝JN.ř1ŠÁIÉ#góÁUo $ e›Râ8†É‡¨–gĘj/žÉFŚěĽá­]– -Ż,÷MW8j-ózŮľVxy˙ńŢk«37d){pc -Ô°łh­énźÚô?JżsŇ=CžŻ:íłÁóţO ýÔ#6ßďäV< \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/54/784f10955e92ab27e4fa832e40cb2baf1edbdc b/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/54/784f10955e92ab27e4fa832e40cb2baf1edbdc deleted file mode 100644 index 2a5bcec275..0000000000 Binary files a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/54/784f10955e92ab27e4fa832e40cb2baf1edbdc and /dev/null differ diff --git a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/56/3f6473a3858f99b80e5f93c660512ed38e1e6f b/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/56/3f6473a3858f99b80e5f93c660512ed38e1e6f deleted file mode 100644 index 8847ed6899..0000000000 Binary files a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/56/3f6473a3858f99b80e5f93c660512ed38e1e6f and /dev/null differ diff --git a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/58/a957ef0061c1a8ef995c855dfab4f5da8d6617 b/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/58/a957ef0061c1a8ef995c855dfab4f5da8d6617 deleted file mode 100644 index f161a19419..0000000000 Binary files a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/58/a957ef0061c1a8ef995c855dfab4f5da8d6617 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/5d/c7e1f440ce74d5503a0dfbc6c30e091475f774 b/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/5d/c7e1f440ce74d5503a0dfbc6c30e091475f774 deleted file mode 100644 index 77deeaf0bd..0000000000 Binary files a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/5d/c7e1f440ce74d5503a0dfbc6c30e091475f774 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/5e/2206cda1c56430ad107a6866a829c159e0b9ea b/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/5e/2206cda1c56430ad107a6866a829c159e0b9ea deleted file mode 100644 index aa30f501f8..0000000000 --- a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/5e/2206cda1c56430ad107a6866a829c159e0b9ea +++ /dev/null @@ -1 +0,0 @@ -x+)JMU044d040031QHËĚI5Ô+©(ařô¦§çăĘßU ÜE9sě‘ \uI‘X‘śĚvKYŐ;7níęřřMý3Kd“F’"c°˘•áď®x?3¦5ö×–Ż·zÓÄѨ1* \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/5f/77a2a13935ac62a629553f8944ad57b1ed8b4a b/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/5f/77a2a13935ac62a629553f8944ad57b1ed8b4a deleted file mode 100644 index 5e622a1fac..0000000000 Binary files a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/5f/77a2a13935ac62a629553f8944ad57b1ed8b4a and /dev/null differ diff --git a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/63/c0d92b95253c4a40d3883f423a54be47d2c4c8 b/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/63/c0d92b95253c4a40d3883f423a54be47d2c4c8 deleted file mode 100644 index eafe2c30af..0000000000 Binary files a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/63/c0d92b95253c4a40d3883f423a54be47d2c4c8 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/6c/e83eb5f0fd34a10c3d25c6b36d2ed7ec0d6ce7 b/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/6c/e83eb5f0fd34a10c3d25c6b36d2ed7ec0d6ce7 deleted file mode 100644 index 1c1f5034d6..0000000000 Binary files a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/6c/e83eb5f0fd34a10c3d25c6b36d2ed7ec0d6ce7 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/6d/1c2afe5eeb9e497528e2780ac468a5465cbc96 b/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/6d/1c2afe5eeb9e497528e2780ac468a5465cbc96 deleted file mode 100644 index a98378a70c..0000000000 --- a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/6d/1c2afe5eeb9e497528e2780ac468a5465cbc96 +++ /dev/null @@ -1 +0,0 @@ -xĄÎ=jĂ@@áÔ{Šé fvöLpgp“3ĚŽF–˛śŐŞđímđŇľâăÉş,sňţ«7Uŕě$Ž ©¤š1 :HđEcČ.d*1ŽQ«p5nzďŕ‚T˛h}A"I.•ŠSĹAĹ:‘Hys ď}Z\YţvÝŕ˘m™·inpúý´ŰyëmćÎGY—o°®Ä`É$Dó®ďŐ®˙BĚO{L|‡f^äđOA \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/74/f06b5bfec6d33d7264f73606b57a7c0b963819 b/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/74/f06b5bfec6d33d7264f73606b57a7c0b963819 deleted file mode 100644 index 732011fce2..0000000000 Binary files a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/74/f06b5bfec6d33d7264f73606b57a7c0b963819 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/82/8b08c52d2cba30952e0e008f60b25b5ba0d41a b/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/82/8b08c52d2cba30952e0e008f60b25b5ba0d41a deleted file mode 100644 index 302014bffc..0000000000 Binary files a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/82/8b08c52d2cba30952e0e008f60b25b5ba0d41a and /dev/null differ diff --git a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/85/36dd6f0ec3ddecb9f9b6c8c64c6d322cd01211 b/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/85/36dd6f0ec3ddecb9f9b6c8c64c6d322cd01211 deleted file mode 100644 index db6faa9e21..0000000000 Binary files a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/85/36dd6f0ec3ddecb9f9b6c8c64c6d322cd01211 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/85/a4a1d791973644f24c72f5e89420d3064cc452 b/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/85/a4a1d791973644f24c72f5e89420d3064cc452 deleted file mode 100644 index 7fe69b6f83..0000000000 Binary files a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/85/a4a1d791973644f24c72f5e89420d3064cc452 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/8b/5c30499a71001189b647f4d5b57fa8f04897ce b/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/8b/5c30499a71001189b647f4d5b57fa8f04897ce deleted file mode 100644 index 8b1638fbba..0000000000 Binary files a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/8b/5c30499a71001189b647f4d5b57fa8f04897ce and /dev/null differ diff --git a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/96/4ea3da044d9083181a88ba6701de9e35778bf4 b/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/96/4ea3da044d9083181a88ba6701de9e35778bf4 deleted file mode 100644 index 2dec33f693..0000000000 Binary files a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/96/4ea3da044d9083181a88ba6701de9e35778bf4 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/9c/c39fca3765a2facbe31157f7d60c2602193f36 b/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/9c/c39fca3765a2facbe31157f7d60c2602193f36 deleted file mode 100644 index 00314454f7..0000000000 Binary files a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/9c/c39fca3765a2facbe31157f7d60c2602193f36 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/9c/cb9bf50c011fd58dcbaa65df917bf79539717f b/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/9c/cb9bf50c011fd58dcbaa65df917bf79539717f deleted file mode 100644 index 1266aff36c..0000000000 Binary files a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/9c/cb9bf50c011fd58dcbaa65df917bf79539717f and /dev/null differ diff --git a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/a1/0b59f4280491afe6e430c30654a7acc67d4a33 b/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/a1/0b59f4280491afe6e430c30654a7acc67d4a33 deleted file mode 100644 index 7aa0a5dcdd..0000000000 Binary files a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/a1/0b59f4280491afe6e430c30654a7acc67d4a33 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/a2/1b4bfe7a04ab18024fb57f4ae9a52a1acef394 b/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/a2/1b4bfe7a04ab18024fb57f4ae9a52a1acef394 deleted file mode 100644 index 07b7195d2c..0000000000 Binary files a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/a2/1b4bfe7a04ab18024fb57f4ae9a52a1acef394 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/a4/3a050c588d4e92f11a6b139680923e9728477d b/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/a4/3a050c588d4e92f11a6b139680923e9728477d deleted file mode 100644 index 4713fb2db2..0000000000 --- a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/a4/3a050c588d4e92f11a6b139680923e9728477d +++ /dev/null @@ -1 +0,0 @@ -xĄÎMjĂ0†á®uŠŮÂHŠţ ”BÜb4Ç.‘ÝJ2´·Ź Gčöáăĺă˝”µqńĄWČ9ťĽăl=#»`5GÎsDD5ę(ꋪlěXš!—„Ćp°!e$2NÂÚ2{ç9†IŃŃ—˝ÂŤřűW©emËńŰŕőóĎîď­×•:ťy/o mň“‚7pB¨†Ž«]ţQ mw™`^˘Ďý§ĂľAˇ6şę mT \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/a5/8ca3fee5eb68b11adc2703e5843f968c9dad1e b/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/a5/8ca3fee5eb68b11adc2703e5843f968c9dad1e deleted file mode 100644 index 1c3f2fb016..0000000000 Binary files a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/a5/8ca3fee5eb68b11adc2703e5843f968c9dad1e and /dev/null differ diff --git a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/a6/61b5dec1004e2c62654ded3762370c27cf266b b/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/a6/61b5dec1004e2c62654ded3762370c27cf266b deleted file mode 100644 index d94a9541fd..0000000000 Binary files a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/a6/61b5dec1004e2c62654ded3762370c27cf266b and /dev/null differ diff --git a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/a6/9ef8fcbb9a2c509a7dbf4f23d257eb551d5610 b/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/a6/9ef8fcbb9a2c509a7dbf4f23d257eb551d5610 deleted file mode 100644 index 69feba2059..0000000000 --- a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/a6/9ef8fcbb9a2c509a7dbf4f23d257eb551d5610 +++ /dev/null @@ -1 +0,0 @@ -xĄÎ1ŠĂ0@Ń­uŠéAŤ¤,!] ĺŢ`,Ź/hťČr‘ŰǰGHűŠĎĎK­s¤đŐ›*heć”Éć§8ŞĹčťýčJ*(&ó¦rÉTlJI؅諥$…JD%ŹYF–ÁŮú}ip•üÜt…‹¶:Ż÷íµÂ÷ďżÝÎkołt9楞`p)9ö­5»î«]?Š}nsS¨ÚnjŢGPOL \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/a8/3c6f70297b805dedc549e6583582966f6ebcab b/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/a8/3c6f70297b805dedc549e6583582966f6ebcab deleted file mode 100644 index 5a6db508e8..0000000000 Binary files a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/a8/3c6f70297b805dedc549e6583582966f6ebcab and /dev/null differ diff --git a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/a9/020cd240774e4d672732bcb82d516d9685da76 b/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/a9/020cd240774e4d672732bcb82d516d9685da76 deleted file mode 100644 index 61741aff9f..0000000000 Binary files a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/a9/020cd240774e4d672732bcb82d516d9685da76 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/ab/4115f808bc585b60f822da7020af86d20f62c8 b/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/ab/4115f808bc585b60f822da7020af86d20f62c8 deleted file mode 100644 index 08c4bef571..0000000000 Binary files a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/ab/4115f808bc585b60f822da7020af86d20f62c8 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/ab/e4603bc7cd5b8167a267e0e2418fd2348f8cff b/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/ab/e4603bc7cd5b8167a267e0e2418fd2348f8cff deleted file mode 100644 index 4e4fe6f12e..0000000000 --- a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/ab/e4603bc7cd5b8167a267e0e2418fd2348f8cff +++ /dev/null @@ -1,4 +0,0 @@ -xĄŹKNÄ0DYç˝›Ůî´?Bě8D»ÓžÉHNŔqÜžŚFś€í«Ş'•¬µÎĐƇŢT!‰`*Â<±+,YŃZ -%LŢóĆŮ„ýđĹM—ě“–X$çÄNČ$S.cq89 -š‰ěDŢšżľ¦ěo{˘ěxŠFL)Ć”‰ĹÄČÁ}ŢűemđÁň˝ëďÚęĽ]öź ^®wv~Űz›ąół¬ő,&?Ži„GăŚz\ëú/Éđ©í¬/rSĺíž`^ú -ő=ÝŁáXľfZ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/b8/26e9b36e22e949ec885e7a1f3db496bbab6cd0 b/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/b8/26e9b36e22e949ec885e7a1f3db496bbab6cd0 deleted file mode 100644 index e3bf3a0179..0000000000 Binary files a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/b8/26e9b36e22e949ec885e7a1f3db496bbab6cd0 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/ba/fbf6912c09505ac60575cd43d3f2aba3bd84d8 b/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/ba/fbf6912c09505ac60575cd43d3f2aba3bd84d8 deleted file mode 100644 index 956da8b71c..0000000000 Binary files a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/ba/fbf6912c09505ac60575cd43d3f2aba3bd84d8 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/bb/14296ffa9dfbf935ec9ce2f9ed7808d952226b b/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/bb/14296ffa9dfbf935ec9ce2f9ed7808d952226b deleted file mode 100644 index b5583685a4..0000000000 Binary files a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/bb/14296ffa9dfbf935ec9ce2f9ed7808d952226b and /dev/null differ diff --git a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/bc/4dd0744364d1db380a9811bd264c101065231e b/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/bc/4dd0744364d1db380a9811bd264c101065231e deleted file mode 100644 index 01d88a283d..0000000000 Binary files a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/bc/4dd0744364d1db380a9811bd264c101065231e and /dev/null differ diff --git a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/bd/65d4083845ed5ed4e1fe5feb85ac395d0760c8 b/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/bd/65d4083845ed5ed4e1fe5feb85ac395d0760c8 deleted file mode 100644 index 6a0eccb5ee..0000000000 --- a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/bd/65d4083845ed5ed4e1fe5feb85ac395d0760c8 +++ /dev/null @@ -1,2 +0,0 @@ -xĄÍA -B!€áÖžböAŚ6ŠBD» [¨o^Ď@$Ýľˇí·ř˙Üj-Ú›tf äŤ]˛#““ă":dKiő‹ Ćű51S@RqĘÖ:qđ>Ąq”µehMÁ„”}ČP”!ň:ÖCxεůŽôuň!ßx´íXĎźC>}üŮňṟáÄőö,•IŢç‚“Ź ÄĄ×ęäEÄë9{ă±0ć;KZq_®ťľËşÝYÝć÷żt3V \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/cf/c4f0999a8367568e049af4f72e452d40828a15 b/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/cf/c4f0999a8367568e049af4f72e452d40828a15 deleted file mode 100644 index d7deb0bff1..0000000000 Binary files a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/cf/c4f0999a8367568e049af4f72e452d40828a15 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/d0/f21e17beb5b9d953b1d8349049818a4f2edd1e b/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/d0/f21e17beb5b9d953b1d8349049818a4f2edd1e deleted file mode 100644 index 65c846fa4c..0000000000 --- a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/d0/f21e17beb5b9d953b1d8349049818a4f2edd1e +++ /dev/null @@ -1 +0,0 @@ -xĄŽAjĂ0E»Ö)f_¶¤‘,ˇ]z‹‘<˛]"«•ÇĐŢľ‚!Ë˙ř<^ŞĄlÚá‹4fŔě=iM0HÉir: š<kiFGž§hI}Să] ő™ă4FÇ ŤťqfĘšl˙Äŕ’ÁŹŻč”µ6ř¤ôsňÜĘv¬çßׯ[Ţi ]R-7č ÎÄ áuĐĂ :í©ÂOIÔű)µp[âť!­´/=§î·;ë‹üŠú&éWY \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/d3/d77487660ee3c0194ee01dc5eaf478782b1c7e b/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/d3/d77487660ee3c0194ee01dc5eaf478782b1c7e deleted file mode 100644 index b42df7e509..0000000000 --- a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/d3/d77487660ee3c0194ee01dc5eaf478782b1c7e +++ /dev/null @@ -1 +0,0 @@ -xĄÎKJ1€a×9Eí…!ďI@df%x‹Ş¤ú!“ަ«AooGpű-~ţŇ[[l O2AW﯋ 6‘ŽŃÄRŮ‘Ő=yFW ĄúÄÁ›@Ő“5l®Ä(×™šśĎÚçdúÉr­†˛ôďXľŢáŤG[÷ĺřŮáĺăĎćŰ.cEÁKéíŚËŃ»˛…gmµV§ž«Â˙Ѝű!˝ńéÁPÜćs§o0­vůő *Wd \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/e2/33b9ed408a95e9d4b65fec7fc34943a556deb2 b/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/e2/33b9ed408a95e9d4b65fec7fc34943a556deb2 deleted file mode 100644 index b344c9cc8a..0000000000 Binary files a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/e2/33b9ed408a95e9d4b65fec7fc34943a556deb2 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/e5/183bfd18e3a0a691fadde2f0d5610b73282d31 b/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/e5/183bfd18e3a0a691fadde2f0d5610b73282d31 deleted file mode 100644 index fdc05714f7..0000000000 Binary files a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/e5/183bfd18e3a0a691fadde2f0d5610b73282d31 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/e6/ae8889c40c77d7be02758235b5b3f7a4f2a129 b/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/e6/ae8889c40c77d7be02758235b5b3f7a4f2a129 deleted file mode 100644 index 3345907dbb..0000000000 Binary files a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/e6/ae8889c40c77d7be02758235b5b3f7a4f2a129 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/e7/811a2bc55635f182750f0420da5ad232c1af91 b/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/e7/811a2bc55635f182750f0420da5ad232c1af91 deleted file mode 100644 index 2388730252..0000000000 Binary files a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/e7/811a2bc55635f182750f0420da5ad232c1af91 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/e9/b63f3655b2ad80c0ff587389b5a9589a3a7110 b/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/e9/b63f3655b2ad80c0ff587389b5a9589a3a7110 deleted file mode 100644 index ab0a27f37a..0000000000 --- a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/e9/b63f3655b2ad80c0ff587389b5a9589a3a7110 +++ /dev/null @@ -1,2 +0,0 @@ -xĄÎMjĂ0@á®uŠŮŠ<Ë!Eˇ·ÉŁŘĹ?‰$/rűz„nżĹăĄ}]çHĂG+ŞzĺčĽ"*k -ˇ×AşěĆHěc”čÓhÍ]Šn RN”-3Kp~č}PK,™ň€J=Ždéz#G›ö?’‡VřÖ˛Îu:žNżv»ÔVfiň•öő ťcOÎ;‹điŃZóÖ÷jÓEĚu’í¦ Ëy^´š-P@ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/eb/da71fe44dcb60c53b8fbd53208a1204d32e959 b/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/eb/da71fe44dcb60c53b8fbd53208a1204d32e959 deleted file mode 100644 index 19d0c52880..0000000000 Binary files a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/eb/da71fe44dcb60c53b8fbd53208a1204d32e959 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/f0/5ed049854c1596a7cc0e957fab34961077f3ae b/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/f0/5ed049854c1596a7cc0e957fab34961077f3ae deleted file mode 100644 index ab454399e4..0000000000 Binary files a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/f0/5ed049854c1596a7cc0e957fab34961077f3ae and /dev/null differ diff --git a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/f0/a4e1c66bb548cd2b22eebefda703872e969775 b/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/f0/a4e1c66bb548cd2b22eebefda703872e969775 deleted file mode 100644 index 558dd0a441..0000000000 Binary files a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/f0/a4e1c66bb548cd2b22eebefda703872e969775 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/f2/ec8c8cf1a9fb7aa047a25a4308bfe860237ad4 b/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/f2/ec8c8cf1a9fb7aa047a25a4308bfe860237ad4 deleted file mode 100644 index a0117515ce..0000000000 Binary files a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/f2/ec8c8cf1a9fb7aa047a25a4308bfe860237ad4 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/f5/684c96bf40c709877b56404cd8a5dd2d2a7978 b/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/f5/684c96bf40c709877b56404cd8a5dd2d2a7978 deleted file mode 100644 index 83bb5a0cc5..0000000000 Binary files a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/f5/684c96bf40c709877b56404cd8a5dd2d2a7978 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/f9/0f9dcbdac2cce5cc166346160e19cb693ef4e8 b/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/f9/0f9dcbdac2cce5cc166346160e19cb693ef4e8 deleted file mode 100644 index 71be9f8344..0000000000 Binary files a/vendor/libgit2/tests/resources/cherrypick/.gitted/objects/f9/0f9dcbdac2cce5cc166346160e19cb693ef4e8 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/cherrypick/.gitted/refs/heads/automerge-branch b/vendor/libgit2/tests/resources/cherrypick/.gitted/refs/heads/automerge-branch deleted file mode 100644 index 9330ef3d1f..0000000000 --- a/vendor/libgit2/tests/resources/cherrypick/.gitted/refs/heads/automerge-branch +++ /dev/null @@ -1 +0,0 @@ -d3d77487660ee3c0194ee01dc5eaf478782b1c7e diff --git a/vendor/libgit2/tests/resources/cherrypick/.gitted/refs/heads/master b/vendor/libgit2/tests/resources/cherrypick/.gitted/refs/heads/master deleted file mode 100644 index aa8913beb9..0000000000 --- a/vendor/libgit2/tests/resources/cherrypick/.gitted/refs/heads/master +++ /dev/null @@ -1 +0,0 @@ -2a26c7e88b285613b302ba76712bc998863f3cbc diff --git a/vendor/libgit2/tests/resources/cherrypick/.gitted/refs/heads/merge-branch b/vendor/libgit2/tests/resources/cherrypick/.gitted/refs/heads/merge-branch deleted file mode 100644 index ea5b277ecc..0000000000 --- a/vendor/libgit2/tests/resources/cherrypick/.gitted/refs/heads/merge-branch +++ /dev/null @@ -1 +0,0 @@ -abe4603bc7cd5b8167a267e0e2418fd2348f8cff diff --git a/vendor/libgit2/tests/resources/cherrypick/.gitted/refs/heads/merge-conflicts b/vendor/libgit2/tests/resources/cherrypick/.gitted/refs/heads/merge-conflicts deleted file mode 100644 index f63f17efb7..0000000000 --- a/vendor/libgit2/tests/resources/cherrypick/.gitted/refs/heads/merge-conflicts +++ /dev/null @@ -1 +0,0 @@ -bafbf6912c09505ac60575cd43d3f2aba3bd84d8 diff --git a/vendor/libgit2/tests/resources/cherrypick/.gitted/refs/heads/merge-mainline b/vendor/libgit2/tests/resources/cherrypick/.gitted/refs/heads/merge-mainline deleted file mode 100644 index 0ec5e458c5..0000000000 --- a/vendor/libgit2/tests/resources/cherrypick/.gitted/refs/heads/merge-mainline +++ /dev/null @@ -1 +0,0 @@ -cfc4f0999a8367568e049af4f72e452d40828a15 diff --git a/vendor/libgit2/tests/resources/cherrypick/.gitted/refs/heads/orphan b/vendor/libgit2/tests/resources/cherrypick/.gitted/refs/heads/orphan deleted file mode 100644 index f4d6a7467f..0000000000 --- a/vendor/libgit2/tests/resources/cherrypick/.gitted/refs/heads/orphan +++ /dev/null @@ -1 +0,0 @@ -74f06b5bfec6d33d7264f73606b57a7c0b963819 diff --git a/vendor/libgit2/tests/resources/cherrypick/.gitted/refs/heads/renames b/vendor/libgit2/tests/resources/cherrypick/.gitted/refs/heads/renames deleted file mode 100644 index df55871735..0000000000 --- a/vendor/libgit2/tests/resources/cherrypick/.gitted/refs/heads/renames +++ /dev/null @@ -1 +0,0 @@ -44cd2ed2052c9c68f9a439d208e9614dc2a55c70 diff --git a/vendor/libgit2/tests/resources/cherrypick/file1.txt b/vendor/libgit2/tests/resources/cherrypick/file1.txt deleted file mode 100644 index 38c05a857e..0000000000 --- a/vendor/libgit2/tests/resources/cherrypick/file1.txt +++ /dev/null @@ -1,15 +0,0 @@ -!File 1 -File 1 -File 1 -File 1 -File 1 -File 1 -File 1 -File 1 -File 1 -File 1 -File 1 -File 1 -File 1 -File 1 -File 1 diff --git a/vendor/libgit2/tests/resources/cherrypick/file2.txt b/vendor/libgit2/tests/resources/cherrypick/file2.txt deleted file mode 100644 index a661b5dec1..0000000000 --- a/vendor/libgit2/tests/resources/cherrypick/file2.txt +++ /dev/null @@ -1,15 +0,0 @@ -!File 2 -File 2 -File 2 -File 2 -File 2 -File 2 -File 2 -File 2 -File 2 -File 2 -File 2 -File 2 -File 2 -File 2 -File 2 diff --git a/vendor/libgit2/tests/resources/cherrypick/file3.txt b/vendor/libgit2/tests/resources/cherrypick/file3.txt deleted file mode 100644 index 85a4a1d791..0000000000 --- a/vendor/libgit2/tests/resources/cherrypick/file3.txt +++ /dev/null @@ -1,15 +0,0 @@ -!File 3 -File 3 -File 3 -File 3 -File 3 -File 3 -File 3 -File 3 -File 3 -File 3 -File 3 -File 3 -File 3 -File 3 -File 3 diff --git a/vendor/libgit2/tests/resources/config/.gitconfig b/vendor/libgit2/tests/resources/config/.gitconfig deleted file mode 100644 index fa72bddfc6..0000000000 --- a/vendor/libgit2/tests/resources/config/.gitconfig +++ /dev/null @@ -1,3 +0,0 @@ -[core] - repositoryformatversion = 5 - something = 2 \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/config/config-include b/vendor/libgit2/tests/resources/config/config-include deleted file mode 100644 index 6b5e79de73..0000000000 --- a/vendor/libgit2/tests/resources/config/config-include +++ /dev/null @@ -1,2 +0,0 @@ -[include] - path = config-included diff --git a/vendor/libgit2/tests/resources/config/config-included b/vendor/libgit2/tests/resources/config/config-included deleted file mode 100644 index 089ca08a71..0000000000 --- a/vendor/libgit2/tests/resources/config/config-included +++ /dev/null @@ -1,2 +0,0 @@ -[foo "bar"] - baz = huzzah diff --git a/vendor/libgit2/tests/resources/config/config0 b/vendor/libgit2/tests/resources/config/config0 deleted file mode 100644 index 85235c5012..0000000000 --- a/vendor/libgit2/tests/resources/config/config0 +++ /dev/null @@ -1,7 +0,0 @@ -# This is a test -; of different comments -[core] - repositoryformatversion = 0 - filemode = true - bare = false - logallrefupdates = true \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/config/config1 b/vendor/libgit2/tests/resources/config/config1 deleted file mode 100644 index 211dc9e7d4..0000000000 --- a/vendor/libgit2/tests/resources/config/config1 +++ /dev/null @@ -1,5 +0,0 @@ -# This one checks for case sensitivity -[this "that"] - other = true -[this "That"] - other = yes diff --git a/vendor/libgit2/tests/resources/config/config10 b/vendor/libgit2/tests/resources/config/config10 deleted file mode 100644 index dde17911bf..0000000000 --- a/vendor/libgit2/tests/resources/config/config10 +++ /dev/null @@ -1 +0,0 @@ -[empty] diff --git a/vendor/libgit2/tests/resources/config/config11 b/vendor/libgit2/tests/resources/config/config11 deleted file mode 100644 index 1d8a744707..0000000000 --- a/vendor/libgit2/tests/resources/config/config11 +++ /dev/null @@ -1,5 +0,0 @@ -[remote "ab"] - url = git://github.com/libgit2/libgit2 - url = git://git.example.com/libgit2 - - diff --git a/vendor/libgit2/tests/resources/config/config12 b/vendor/libgit2/tests/resources/config/config12 deleted file mode 100644 index 6917880b5c..0000000000 --- a/vendor/libgit2/tests/resources/config/config12 +++ /dev/null @@ -1,13 +0,0 @@ -[some "section"] - test = hi ; comment - test2 = hello ; comment - test3 = welcome #comment - other = "hello! \" ; ; ; " ; more test - other2 = "cool! \" # # # " # more test - multi = "hi, this is a ; \ -multiline comment # with ;\n special chars \ -and other stuff !@#" - multi2 = "good, this is a ; \ -multiline comment # with ;\n special chars \ -and other stuff !@#" #^^^ - back = "this is \ba phrase" diff --git a/vendor/libgit2/tests/resources/config/config13 b/vendor/libgit2/tests/resources/config/config13 deleted file mode 100644 index c1e0c56473..0000000000 --- a/vendor/libgit2/tests/resources/config/config13 +++ /dev/null @@ -1,2 +0,0 @@ -[core] - editor = \"C:/Program Files/Nonsense/bah.exe\" \"--some option\" diff --git a/vendor/libgit2/tests/resources/config/config14 b/vendor/libgit2/tests/resources/config/config14 deleted file mode 100644 index ef2198c455..0000000000 --- a/vendor/libgit2/tests/resources/config/config14 +++ /dev/null @@ -1,4 +0,0 @@ -[a] - b=c -[d] - e = f diff --git a/vendor/libgit2/tests/resources/config/config15 b/vendor/libgit2/tests/resources/config/config15 deleted file mode 100644 index 6d34f817b1..0000000000 --- a/vendor/libgit2/tests/resources/config/config15 +++ /dev/null @@ -1,3 +0,0 @@ -[core] - dummy2 = 7 - global = 17 diff --git a/vendor/libgit2/tests/resources/config/config16 b/vendor/libgit2/tests/resources/config/config16 deleted file mode 100644 index f25cdb7283..0000000000 --- a/vendor/libgit2/tests/resources/config/config16 +++ /dev/null @@ -1,3 +0,0 @@ -[core] - dummy2 = 28 - system = 11 diff --git a/vendor/libgit2/tests/resources/config/config17 b/vendor/libgit2/tests/resources/config/config17 deleted file mode 100644 index ca25a86af0..0000000000 --- a/vendor/libgit2/tests/resources/config/config17 +++ /dev/null @@ -1,3 +0,0 @@ -[core] - dummy2 = 7 - global = 17 \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/config/config18 b/vendor/libgit2/tests/resources/config/config18 deleted file mode 100644 index cb6fd5ebcf..0000000000 --- a/vendor/libgit2/tests/resources/config/config18 +++ /dev/null @@ -1,5 +0,0 @@ -[core] - int32global = 28 - int64global = 9223372036854775803 - boolglobal = true - stringglobal = I'm a global config value! \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/config/config19 b/vendor/libgit2/tests/resources/config/config19 deleted file mode 100644 index f3ae5a6406..0000000000 --- a/vendor/libgit2/tests/resources/config/config19 +++ /dev/null @@ -1,5 +0,0 @@ -[core] - int32global = -1 - int64global = -2 - boolglobal = false - stringglobal = don't find me! \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/config/config2 b/vendor/libgit2/tests/resources/config/config2 deleted file mode 100644 index 60a389827c..0000000000 --- a/vendor/libgit2/tests/resources/config/config2 +++ /dev/null @@ -1,5 +0,0 @@ -; This one tests for multiline values -[this "That"] - and = one one one \ -two two \ -three three \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/config/config20 b/vendor/libgit2/tests/resources/config/config20 deleted file mode 100644 index 8f0f12c4c8..0000000000 --- a/vendor/libgit2/tests/resources/config/config20 +++ /dev/null @@ -1,11 +0,0 @@ -[valid "[subsection]"] - something = a -; we don't allow anything after closing " -[sec "[subsec]/child"] - parent = grand -[sec2 "[subsec2]/child2"] - type = dvcs -[sec3 "escape\"quote"] - vcs = git -[sec4 "escaping\\slash"] - lib = git2 diff --git a/vendor/libgit2/tests/resources/config/config3 b/vendor/libgit2/tests/resources/config/config3 deleted file mode 100644 index 44a5e50ea0..0000000000 --- a/vendor/libgit2/tests/resources/config/config3 +++ /dev/null @@ -1,3 +0,0 @@ -# A [section.subsection] header is case-insensitive -[section.SuBsection] - var = hello diff --git a/vendor/libgit2/tests/resources/config/config4 b/vendor/libgit2/tests/resources/config/config4 deleted file mode 100644 index 9dd40419e1..0000000000 --- a/vendor/libgit2/tests/resources/config/config4 +++ /dev/null @@ -1,5 +0,0 @@ -# A variable name on its own is valid -[some.section] - variable -# A variable and '=' is accepted, but it's not considered true - variableeq = diff --git a/vendor/libgit2/tests/resources/config/config5 b/vendor/libgit2/tests/resources/config/config5 deleted file mode 100644 index 8ab60ccec8..0000000000 --- a/vendor/libgit2/tests/resources/config/config5 +++ /dev/null @@ -1,9 +0,0 @@ -# Test for number suffixes -[number] - simple = 1 - k = 1k - kk = 1K - m = 1m - mm = 1M - g = 1g - gg = 1G diff --git a/vendor/libgit2/tests/resources/config/config6 b/vendor/libgit2/tests/resources/config/config6 deleted file mode 100644 index 0f8f90ac9a..0000000000 --- a/vendor/libgit2/tests/resources/config/config6 +++ /dev/null @@ -1,5 +0,0 @@ -[valid "subsection"] - something = true - -[something "else"] - something = false diff --git a/vendor/libgit2/tests/resources/config/config7 b/vendor/libgit2/tests/resources/config/config7 deleted file mode 100644 index 6af6fcf251..0000000000 --- a/vendor/libgit2/tests/resources/config/config7 +++ /dev/null @@ -1,5 +0,0 @@ -[valid "subsection"] - something = a -; we don't allow anything after closing " -[sec "subsec"x] - bleh = blah diff --git a/vendor/libgit2/tests/resources/config/config8 b/vendor/libgit2/tests/resources/config/config8 deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/vendor/libgit2/tests/resources/config/config9 b/vendor/libgit2/tests/resources/config/config9 deleted file mode 100644 index fcaac424e4..0000000000 --- a/vendor/libgit2/tests/resources/config/config9 +++ /dev/null @@ -1,9 +0,0 @@ -[core] - dummy2 = 42 - verylong = 1 - dummy = 1 - -[remote "ab"] - url = http://example.com/git/ab -[remote "abba"] - url = http://example.com/git/abba diff --git a/vendor/libgit2/tests/resources/crlf/.gitted/HEAD b/vendor/libgit2/tests/resources/crlf/.gitted/HEAD deleted file mode 100644 index cb089cd89a..0000000000 --- a/vendor/libgit2/tests/resources/crlf/.gitted/HEAD +++ /dev/null @@ -1 +0,0 @@ -ref: refs/heads/master diff --git a/vendor/libgit2/tests/resources/crlf/.gitted/config b/vendor/libgit2/tests/resources/crlf/.gitted/config deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/vendor/libgit2/tests/resources/crlf/.gitted/index b/vendor/libgit2/tests/resources/crlf/.gitted/index deleted file mode 100644 index e8d43e97e1..0000000000 Binary files a/vendor/libgit2/tests/resources/crlf/.gitted/index and /dev/null differ diff --git a/vendor/libgit2/tests/resources/crlf/.gitted/objects/04/4bcd5c9bf5ebdd51e514a9a36457018f06f6e1 b/vendor/libgit2/tests/resources/crlf/.gitted/objects/04/4bcd5c9bf5ebdd51e514a9a36457018f06f6e1 deleted file mode 100644 index a32a9b2823..0000000000 --- a/vendor/libgit2/tests/resources/crlf/.gitted/objects/04/4bcd5c9bf5ebdd51e514a9a36457018f06f6e1 +++ /dev/null @@ -1 +0,0 @@ -x-ŽÁjĂ0D{ÖWě˝4H+Ů+C(ɡ·ţ„¤]aÓŘJU…|}•Ă̓ʺ. Đş·VE@˛ćÄv™ŃČ”˛ËvB˝x=%‰ęŞl ČsDŇÉx÷H¦!x3E9ĹA‡hPĆdU¸´ąTřâk¨ {éký+ŰAžŕµv©¬ź`¬źŚC2|hŻµę´źlRá{Ů~/Ë]`zµĂ-ĚĄ<ÄÝüÓ]×MÄ5Ľ?]ud†»ÔńÖňrőÄ&K! \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf/.gitted/objects/04/de00b358f13389948756732158eaaaefa1448c b/vendor/libgit2/tests/resources/crlf/.gitted/objects/04/de00b358f13389948756732158eaaaefa1448c deleted file mode 100644 index c3b7598c07..0000000000 Binary files a/vendor/libgit2/tests/resources/crlf/.gitted/objects/04/de00b358f13389948756732158eaaaefa1448c and /dev/null differ diff --git a/vendor/libgit2/tests/resources/crlf/.gitted/objects/09/7722be9b67b48dfe3b19396d02fd535300ee46 b/vendor/libgit2/tests/resources/crlf/.gitted/objects/09/7722be9b67b48dfe3b19396d02fd535300ee46 deleted file mode 100644 index 5c5c24cd54..0000000000 Binary files a/vendor/libgit2/tests/resources/crlf/.gitted/objects/09/7722be9b67b48dfe3b19396d02fd535300ee46 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/crlf/.gitted/objects/0a/a76e474d259bd7c13eb726a1396c381db55c88 b/vendor/libgit2/tests/resources/crlf/.gitted/objects/0a/a76e474d259bd7c13eb726a1396c381db55c88 deleted file mode 100644 index e118d66560..0000000000 Binary files a/vendor/libgit2/tests/resources/crlf/.gitted/objects/0a/a76e474d259bd7c13eb726a1396c381db55c88 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/crlf/.gitted/objects/0d/06894e14df22e066763ae906e0ed3eb79c205f b/vendor/libgit2/tests/resources/crlf/.gitted/objects/0d/06894e14df22e066763ae906e0ed3eb79c205f deleted file mode 100644 index b7a1f3290e..0000000000 Binary files a/vendor/libgit2/tests/resources/crlf/.gitted/objects/0d/06894e14df22e066763ae906e0ed3eb79c205f and /dev/null differ diff --git a/vendor/libgit2/tests/resources/crlf/.gitted/objects/0e/052888828a954ca17e5882638e3c6a083e75c0 b/vendor/libgit2/tests/resources/crlf/.gitted/objects/0e/052888828a954ca17e5882638e3c6a083e75c0 deleted file mode 100644 index 746143f85f..0000000000 Binary files a/vendor/libgit2/tests/resources/crlf/.gitted/objects/0e/052888828a954ca17e5882638e3c6a083e75c0 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/crlf/.gitted/objects/0f/f5a53f19bfd2b5eea1ba550295c47515678987 b/vendor/libgit2/tests/resources/crlf/.gitted/objects/0f/f5a53f19bfd2b5eea1ba550295c47515678987 deleted file mode 100644 index 5366acd8c0..0000000000 Binary files a/vendor/libgit2/tests/resources/crlf/.gitted/objects/0f/f5a53f19bfd2b5eea1ba550295c47515678987 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/crlf/.gitted/objects/16/78031ee023a23bd3515e4e1693b661a69f0a73 b/vendor/libgit2/tests/resources/crlf/.gitted/objects/16/78031ee023a23bd3515e4e1693b661a69f0a73 deleted file mode 100644 index 4aa4ffb1d6..0000000000 Binary files a/vendor/libgit2/tests/resources/crlf/.gitted/objects/16/78031ee023a23bd3515e4e1693b661a69f0a73 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/crlf/.gitted/objects/16/c72b67861f8524a5bebc05cd20472d3fca00da b/vendor/libgit2/tests/resources/crlf/.gitted/objects/16/c72b67861f8524a5bebc05cd20472d3fca00da deleted file mode 100644 index e2b199458a..0000000000 Binary files a/vendor/libgit2/tests/resources/crlf/.gitted/objects/16/c72b67861f8524a5bebc05cd20472d3fca00da and /dev/null differ diff --git a/vendor/libgit2/tests/resources/crlf/.gitted/objects/18/c637c5d9aba6eed226ee1840cd1ca2e6c4e4c5 b/vendor/libgit2/tests/resources/crlf/.gitted/objects/18/c637c5d9aba6eed226ee1840cd1ca2e6c4e4c5 deleted file mode 100644 index 790eb1324a..0000000000 Binary files a/vendor/libgit2/tests/resources/crlf/.gitted/objects/18/c637c5d9aba6eed226ee1840cd1ca2e6c4e4c5 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/crlf/.gitted/objects/20/3555c5676d75cd80d69b50beb1f4b588c59ceb b/vendor/libgit2/tests/resources/crlf/.gitted/objects/20/3555c5676d75cd80d69b50beb1f4b588c59ceb deleted file mode 100644 index 8038a9b10b..0000000000 Binary files a/vendor/libgit2/tests/resources/crlf/.gitted/objects/20/3555c5676d75cd80d69b50beb1f4b588c59ceb and /dev/null differ diff --git a/vendor/libgit2/tests/resources/crlf/.gitted/objects/23/f4582779e60bfa7f14750ad507399a58876611 b/vendor/libgit2/tests/resources/crlf/.gitted/objects/23/f4582779e60bfa7f14750ad507399a58876611 deleted file mode 100644 index 4a4e4dc9e6..0000000000 Binary files a/vendor/libgit2/tests/resources/crlf/.gitted/objects/23/f4582779e60bfa7f14750ad507399a58876611 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/crlf/.gitted/objects/2a/d3df895f68f4dda6a0a815c620b909bdd27c05 b/vendor/libgit2/tests/resources/crlf/.gitted/objects/2a/d3df895f68f4dda6a0a815c620b909bdd27c05 deleted file mode 100644 index f5421cf6a0..0000000000 Binary files a/vendor/libgit2/tests/resources/crlf/.gitted/objects/2a/d3df895f68f4dda6a0a815c620b909bdd27c05 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/crlf/.gitted/objects/2b/55b4b94f655c857635b6a9005c056aa7de3532 b/vendor/libgit2/tests/resources/crlf/.gitted/objects/2b/55b4b94f655c857635b6a9005c056aa7de3532 deleted file mode 100644 index 031fd6681c..0000000000 --- a/vendor/libgit2/tests/resources/crlf/.gitted/objects/2b/55b4b94f655c857635b6a9005c056aa7de3532 +++ /dev/null @@ -1,2 +0,0 @@ -x-ŽKjÄ0DłÖ)z2tëcµał™].ˇO ›ÄV˘Č„ÉéŁ µ¨zđ RݶµÖřÔ›AvyIfLiň.˛Ď…śPÉL0dŃőšě<ç¨=&b{Oń.09o4Ĺś˘ĂIË”Ś -G_jkţ -ĂYĆÚľë~‘đX§T·W ăذçŮ NjĐq˛K·u˙:Ö_óÇŁ]na©ő.ž–÷áZ˛Zk7!<#W˝°ú˛F \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf/.gitted/objects/2b/d9d81b51a867352bab307b89cbb5b4a69adfe1 b/vendor/libgit2/tests/resources/crlf/.gitted/objects/2b/d9d81b51a867352bab307b89cbb5b4a69adfe1 deleted file mode 100644 index 96d952e855..0000000000 Binary files a/vendor/libgit2/tests/resources/crlf/.gitted/objects/2b/d9d81b51a867352bab307b89cbb5b4a69adfe1 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/crlf/.gitted/objects/2c/03f9f407b576eae80327864bab572e282a33ea b/vendor/libgit2/tests/resources/crlf/.gitted/objects/2c/03f9f407b576eae80327864bab572e282a33ea deleted file mode 100644 index 0e4afbbba6..0000000000 Binary files a/vendor/libgit2/tests/resources/crlf/.gitted/objects/2c/03f9f407b576eae80327864bab572e282a33ea and /dev/null differ diff --git a/vendor/libgit2/tests/resources/crlf/.gitted/objects/33/cdead44e1c3ec178e39a4a69085280dbacf01b b/vendor/libgit2/tests/resources/crlf/.gitted/objects/33/cdead44e1c3ec178e39a4a69085280dbacf01b deleted file mode 100644 index 72dc780a06..0000000000 Binary files a/vendor/libgit2/tests/resources/crlf/.gitted/objects/33/cdead44e1c3ec178e39a4a69085280dbacf01b and /dev/null differ diff --git a/vendor/libgit2/tests/resources/crlf/.gitted/objects/38/1cfe630df902bc29271a202d3277981180e4a6 b/vendor/libgit2/tests/resources/crlf/.gitted/objects/38/1cfe630df902bc29271a202d3277981180e4a6 deleted file mode 100644 index 0cf707296e..0000000000 Binary files a/vendor/libgit2/tests/resources/crlf/.gitted/objects/38/1cfe630df902bc29271a202d3277981180e4a6 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/crlf/.gitted/objects/3f/96bdca0e37616026afaa325c148cec4aa62d04 b/vendor/libgit2/tests/resources/crlf/.gitted/objects/3f/96bdca0e37616026afaa325c148cec4aa62d04 deleted file mode 100644 index a204fc9832..0000000000 Binary files a/vendor/libgit2/tests/resources/crlf/.gitted/objects/3f/96bdca0e37616026afaa325c148cec4aa62d04 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/crlf/.gitted/objects/41/7786fc35b3c71aa546e3f95eb5da3c8dad8c41 b/vendor/libgit2/tests/resources/crlf/.gitted/objects/41/7786fc35b3c71aa546e3f95eb5da3c8dad8c41 deleted file mode 100644 index ec57bdeba5..0000000000 Binary files a/vendor/libgit2/tests/resources/crlf/.gitted/objects/41/7786fc35b3c71aa546e3f95eb5da3c8dad8c41 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/crlf/.gitted/objects/47/fbc2c28a18df0dc773276a253eb85c7516ca50 b/vendor/libgit2/tests/resources/crlf/.gitted/objects/47/fbc2c28a18df0dc773276a253eb85c7516ca50 deleted file mode 100644 index d16db96335..0000000000 Binary files a/vendor/libgit2/tests/resources/crlf/.gitted/objects/47/fbc2c28a18df0dc773276a253eb85c7516ca50 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/crlf/.gitted/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee4904 b/vendor/libgit2/tests/resources/crlf/.gitted/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee4904 deleted file mode 100644 index adf64119a3..0000000000 Binary files a/vendor/libgit2/tests/resources/crlf/.gitted/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee4904 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/crlf/.gitted/objects/5a/fb6a14a864e30787857dd92af837e8cdd2cb1b b/vendor/libgit2/tests/resources/crlf/.gitted/objects/5a/fb6a14a864e30787857dd92af837e8cdd2cb1b deleted file mode 100644 index 11a25c581c..0000000000 Binary files a/vendor/libgit2/tests/resources/crlf/.gitted/objects/5a/fb6a14a864e30787857dd92af837e8cdd2cb1b and /dev/null differ diff --git a/vendor/libgit2/tests/resources/crlf/.gitted/objects/68/03c385642cebc8103fddd526ef395d75678a7e b/vendor/libgit2/tests/resources/crlf/.gitted/objects/68/03c385642cebc8103fddd526ef395d75678a7e deleted file mode 100644 index f8d489fcb6..0000000000 --- a/vendor/libgit2/tests/resources/crlf/.gitted/objects/68/03c385642cebc8103fddd526ef395d75678a7e +++ /dev/null @@ -1,2 +0,0 @@ -xĄÎKjÄ0ЬuŠľŔ},µ !dÉ &h·ZŘ0˛‚¬ÁäöQvŮgWĽ‚˘¸–˛u°źzËÚĺ9OŹAH˘vŁ ÓB¬ŘhÉ9!őEMö}śŃcžfÔ52vŮ%ëmä` /¬čŃ×Úŕ=ťÔÜÖZŽşĂ‹ ýMoeăVŹšű3×ň -fr1pŃ“Öjč8Úĺęšäí.ś[_ˇĐţ ź·ŹK^©@űčĺükęѡYj \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf/.gitted/objects/69/597764abeaa1a403ebf589d2ea579c6a8f877e b/vendor/libgit2/tests/resources/crlf/.gitted/objects/69/597764abeaa1a403ebf589d2ea579c6a8f877e deleted file mode 100644 index ee4f4273d7..0000000000 --- a/vendor/libgit2/tests/resources/crlf/.gitted/objects/69/597764abeaa1a403ebf589d2ea579c6a8f877e +++ /dev/null @@ -1 +0,0 @@ -xťÎŃŤÂ0 €až3…ßOwr“&­%„`†NŕÄŽ -JĂ!¶1|żţ´Îsi`ݸkUȢr.*{z¤‘Ägr>ɱcňbn\ui ęcć.x"’‚DÎ,–ŢN“Ă,†ďíĽVţu©Ő’.umgŘëĚĺzLŰďăü=@×[kŤđ˘IźÇ¦ßismťbY¸>!—«nćJ“LĹ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf/.gitted/objects/6a/e3e9c11a51f0aabebcffcbd5c00f4beed143c9 b/vendor/libgit2/tests/resources/crlf/.gitted/objects/6a/e3e9c11a51f0aabebcffcbd5c00f4beed143c9 deleted file mode 100644 index 6c18a3ad25..0000000000 Binary files a/vendor/libgit2/tests/resources/crlf/.gitted/objects/6a/e3e9c11a51f0aabebcffcbd5c00f4beed143c9 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/crlf/.gitted/objects/6c/589757f65a970a6cc07c71c3f3d2528c611cbc b/vendor/libgit2/tests/resources/crlf/.gitted/objects/6c/589757f65a970a6cc07c71c3f3d2528c611cbc deleted file mode 100644 index fe4da8ce0d..0000000000 --- a/vendor/libgit2/tests/resources/crlf/.gitted/objects/6c/589757f65a970a6cc07c71c3f3d2528c611cbc +++ /dev/null @@ -1,2 +0,0 @@ -x-ŽKNĂ0„Yç˙µň;Ž„PYp‚r˙5j#Ç€¸=nĹnF3ói¸¬ëŇŔ…ń©UUp$“dKŃbNŁŹŽĽ)OL)`šPfµĂ'VÝpCV‰‘Y$ĎSĘŐłłcÔqVIŃÎ:ŕW»” -çoÝŕÜęÂ×ZÚ^tĹĺvâýđÓGŃW°Á9gLš2<kĚŔŹŹM+ĽKo |\Ęş—­Ź;ó®NúţݱîďŁő>$8Đ1Ă›ěeU eĂú órÓ}ř.QŻ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf/.gitted/objects/77/afe26d93c49279ca90604c125496920753fede b/vendor/libgit2/tests/resources/crlf/.gitted/objects/77/afe26d93c49279ca90604c125496920753fede deleted file mode 100644 index a377cb04d0..0000000000 Binary files a/vendor/libgit2/tests/resources/crlf/.gitted/objects/77/afe26d93c49279ca90604c125496920753fede and /dev/null differ diff --git a/vendor/libgit2/tests/resources/crlf/.gitted/objects/78/db270c1841841f75a8157321bdcb50ab12e6c3 b/vendor/libgit2/tests/resources/crlf/.gitted/objects/78/db270c1841841f75a8157321bdcb50ab12e6c3 deleted file mode 100644 index 8a55bb0823..0000000000 Binary files a/vendor/libgit2/tests/resources/crlf/.gitted/objects/78/db270c1841841f75a8157321bdcb50ab12e6c3 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/crlf/.gitted/objects/79/9770d1cff46753a57db7a066159b5610da6e3a b/vendor/libgit2/tests/resources/crlf/.gitted/objects/79/9770d1cff46753a57db7a066159b5610da6e3a deleted file mode 100644 index 5c701b8676..0000000000 Binary files a/vendor/libgit2/tests/resources/crlf/.gitted/objects/79/9770d1cff46753a57db7a066159b5610da6e3a and /dev/null differ diff --git a/vendor/libgit2/tests/resources/crlf/.gitted/objects/7c/ce67e58173e2b01f7db124ceaabe3183d19c49 b/vendor/libgit2/tests/resources/crlf/.gitted/objects/7c/ce67e58173e2b01f7db124ceaabe3183d19c49 deleted file mode 100644 index 8e836aba1a..0000000000 Binary files a/vendor/libgit2/tests/resources/crlf/.gitted/objects/7c/ce67e58173e2b01f7db124ceaabe3183d19c49 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/crlf/.gitted/objects/85/340755cfe5e28c2835781978bb1cece91b3d0f b/vendor/libgit2/tests/resources/crlf/.gitted/objects/85/340755cfe5e28c2835781978bb1cece91b3d0f deleted file mode 100644 index e83fbc290c..0000000000 Binary files a/vendor/libgit2/tests/resources/crlf/.gitted/objects/85/340755cfe5e28c2835781978bb1cece91b3d0f and /dev/null differ diff --git a/vendor/libgit2/tests/resources/crlf/.gitted/objects/92/0e90a663bea5d740989d5f935f6dfb473a0c5d b/vendor/libgit2/tests/resources/crlf/.gitted/objects/92/0e90a663bea5d740989d5f935f6dfb473a0c5d deleted file mode 100644 index f872be6e99..0000000000 Binary files a/vendor/libgit2/tests/resources/crlf/.gitted/objects/92/0e90a663bea5d740989d5f935f6dfb473a0c5d and /dev/null differ diff --git a/vendor/libgit2/tests/resources/crlf/.gitted/objects/96/87e444bcbb85645cb496080434c292f1b57182 b/vendor/libgit2/tests/resources/crlf/.gitted/objects/96/87e444bcbb85645cb496080434c292f1b57182 deleted file mode 100644 index 5df64d8496..0000000000 --- a/vendor/libgit2/tests/resources/crlf/.gitted/objects/96/87e444bcbb85645cb496080434c292f1b57182 +++ /dev/null @@ -1 +0,0 @@ -xĄÎAJ1@Q×9Eí…!©T:™Y ޢşRí´ĐMŞAoďGpűź/mß7LůÁş*L¬Q‹„Ŕ)¬žyŃEÖU–šÄű•Ő(JqÜőfP2Q©Ś1Ą”%Ą™‰âL•ć¬Ó$QS Ž»¶Ż,ź‡xŃľoăz|xz˙ł·ó°ľ±ńIÚţ 0{ŠS@xôč˝»ë}Őô_w©U+H»Ůďľ50†'ű2÷˙=T‰ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf/.gitted/objects/97/449da2d225557c558ac244384d487e66c3e591 b/vendor/libgit2/tests/resources/crlf/.gitted/objects/97/449da2d225557c558ac244384d487e66c3e591 deleted file mode 100644 index d3917a4332..0000000000 Binary files a/vendor/libgit2/tests/resources/crlf/.gitted/objects/97/449da2d225557c558ac244384d487e66c3e591 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/crlf/.gitted/objects/9a/6c3533fef19abd6eec8e61206b5c51982b80d9 b/vendor/libgit2/tests/resources/crlf/.gitted/objects/9a/6c3533fef19abd6eec8e61206b5c51982b80d9 deleted file mode 100644 index 78fc8aeb70..0000000000 Binary files a/vendor/libgit2/tests/resources/crlf/.gitted/objects/9a/6c3533fef19abd6eec8e61206b5c51982b80d9 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/crlf/.gitted/objects/9d/29b5bb165bf65637ffcb5ededb82ddd7c3fd13 b/vendor/libgit2/tests/resources/crlf/.gitted/objects/9d/29b5bb165bf65637ffcb5ededb82ddd7c3fd13 deleted file mode 100644 index 106332d550..0000000000 Binary files a/vendor/libgit2/tests/resources/crlf/.gitted/objects/9d/29b5bb165bf65637ffcb5ededb82ddd7c3fd13 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/crlf/.gitted/objects/a2/34455d62297f1856c4603686150c59fcb0aafe b/vendor/libgit2/tests/resources/crlf/.gitted/objects/a2/34455d62297f1856c4603686150c59fcb0aafe deleted file mode 100644 index 7d204f4c87..0000000000 Binary files a/vendor/libgit2/tests/resources/crlf/.gitted/objects/a2/34455d62297f1856c4603686150c59fcb0aafe and /dev/null differ diff --git a/vendor/libgit2/tests/resources/crlf/.gitted/objects/a9/a2e8913c1dbe2812fac5e6b4e0a4bd5d0d5966 b/vendor/libgit2/tests/resources/crlf/.gitted/objects/a9/a2e8913c1dbe2812fac5e6b4e0a4bd5d0d5966 deleted file mode 100644 index 33d59f1f18..0000000000 --- a/vendor/libgit2/tests/resources/crlf/.gitted/objects/a9/a2e8913c1dbe2812fac5e6b4e0a4bd5d0d5966 +++ /dev/null @@ -1 +0,0 @@ -xKĘÉOR02aH.ĘIăĺÂ$śž  \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf/.gitted/objects/aa/f083a9cb53dac3669dcfa0e48921580d629ec7 b/vendor/libgit2/tests/resources/crlf/.gitted/objects/aa/f083a9cb53dac3669dcfa0e48921580d629ec7 deleted file mode 100644 index 38775d0050..0000000000 Binary files a/vendor/libgit2/tests/resources/crlf/.gitted/objects/aa/f083a9cb53dac3669dcfa0e48921580d629ec7 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/crlf/.gitted/objects/af/6fcf6da196f615d7cda269b55b5c4ecfb4a5b3 b/vendor/libgit2/tests/resources/crlf/.gitted/objects/af/6fcf6da196f615d7cda269b55b5c4ecfb4a5b3 deleted file mode 100644 index 0acc9744e1..0000000000 Binary files a/vendor/libgit2/tests/resources/crlf/.gitted/objects/af/6fcf6da196f615d7cda269b55b5c4ecfb4a5b3 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/crlf/.gitted/objects/bb/29a7b46b5d4ba3ea17b238ae561b81d59dc818 b/vendor/libgit2/tests/resources/crlf/.gitted/objects/bb/29a7b46b5d4ba3ea17b238ae561b81d59dc818 deleted file mode 100644 index a08789b54d..0000000000 Binary files a/vendor/libgit2/tests/resources/crlf/.gitted/objects/bb/29a7b46b5d4ba3ea17b238ae561b81d59dc818 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/crlf/.gitted/objects/c3/e11722855ff260bd27418988ac1467c4e9e73a b/vendor/libgit2/tests/resources/crlf/.gitted/objects/c3/e11722855ff260bd27418988ac1467c4e9e73a deleted file mode 100644 index 5f96dc76ce..0000000000 Binary files a/vendor/libgit2/tests/resources/crlf/.gitted/objects/c3/e11722855ff260bd27418988ac1467c4e9e73a and /dev/null differ diff --git a/vendor/libgit2/tests/resources/crlf/.gitted/objects/c8/d0b1ebcaccdd8f968c4aae3c2175e7fed651fe b/vendor/libgit2/tests/resources/crlf/.gitted/objects/c8/d0b1ebcaccdd8f968c4aae3c2175e7fed651fe deleted file mode 100644 index 21e2ce093a..0000000000 --- a/vendor/libgit2/tests/resources/crlf/.gitted/objects/c8/d0b1ebcaccdd8f968c4aae3c2175e7fed651fe +++ /dev/null @@ -1,2 +0,0 @@ -x-ŽKnĂ0C»Ö)f8Đod (‚tѤ4#Ře˛ú9~• ;$öR–őK«ĚŕIű1*‡1;tfĚ9EdbŠ“&˘1™LĘĎPyk ­Ť‰0ů‘#*FeĆYĄš˛tٱá«Í{…Ű7opkuI÷ş·^ą„e˝¦cřéŔ3ń”ŐZ?™ NRI)Ňócă -ďÔ[ó^Ž}ëăÎ|¨+?wîĆTĆX ´#Ţ ,żLę°ć!Ő5C^V>Ä=ßR~ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf/.gitted/objects/cd/574f5a2baa4c79504f8837b730fa0b11defe99 b/vendor/libgit2/tests/resources/crlf/.gitted/objects/cd/574f5a2baa4c79504f8837b730fa0b11defe99 deleted file mode 100644 index e8d0202463..0000000000 Binary files a/vendor/libgit2/tests/resources/crlf/.gitted/objects/cd/574f5a2baa4c79504f8837b730fa0b11defe99 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/crlf/.gitted/objects/cd/d3dacc5c0501d5ea57bbdf90e3d80176606139 b/vendor/libgit2/tests/resources/crlf/.gitted/objects/cd/d3dacc5c0501d5ea57bbdf90e3d80176606139 deleted file mode 100644 index 72cf3b0fda..0000000000 Binary files a/vendor/libgit2/tests/resources/crlf/.gitted/objects/cd/d3dacc5c0501d5ea57bbdf90e3d80176606139 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/crlf/.gitted/objects/d1/1e7ef63ba7db1db3b1b99cdbafc57a8549f8a4 b/vendor/libgit2/tests/resources/crlf/.gitted/objects/d1/1e7ef63ba7db1db3b1b99cdbafc57a8549f8a4 deleted file mode 100644 index 05d88fc864..0000000000 Binary files a/vendor/libgit2/tests/resources/crlf/.gitted/objects/d1/1e7ef63ba7db1db3b1b99cdbafc57a8549f8a4 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/crlf/.gitted/objects/dc/88e3b917de821e25962bea7ec1f55c4ce2112c b/vendor/libgit2/tests/resources/crlf/.gitted/objects/dc/88e3b917de821e25962bea7ec1f55c4ce2112c deleted file mode 100644 index 3db13aa798..0000000000 Binary files a/vendor/libgit2/tests/resources/crlf/.gitted/objects/dc/88e3b917de821e25962bea7ec1f55c4ce2112c and /dev/null differ diff --git a/vendor/libgit2/tests/resources/crlf/.gitted/objects/de/5bfa165999d9d6c6dbafad2a7e709f93ec30fd b/vendor/libgit2/tests/resources/crlf/.gitted/objects/de/5bfa165999d9d6c6dbafad2a7e709f93ec30fd deleted file mode 100644 index e288b975fe..0000000000 Binary files a/vendor/libgit2/tests/resources/crlf/.gitted/objects/de/5bfa165999d9d6c6dbafad2a7e709f93ec30fd and /dev/null differ diff --git a/vendor/libgit2/tests/resources/crlf/.gitted/objects/e5/062da7d7802cf492975eda580f09ac4876bd88 b/vendor/libgit2/tests/resources/crlf/.gitted/objects/e5/062da7d7802cf492975eda580f09ac4876bd88 deleted file mode 100644 index 62835b9e1f..0000000000 --- a/vendor/libgit2/tests/resources/crlf/.gitted/objects/e5/062da7d7802cf492975eda580f09ac4876bd88 +++ /dev/null @@ -1 +0,0 @@ -xĄŹQŠ1DýÎ)új'ťd2"‹ű)ţxNŇĂĆ,3Żď¸x˙Ş^AQ•j)×ĆŰU›D`ŽÔiJÖ»>Fc:D´&Rr.†ě1#÷ÎDőǓܥ,ś­ťH’î‚PĎ–}ŹÁ™€9rPGĹŹ6Ö ~ó“§ —±–ąŢa/ }«ü·Iµü€¶DÎx$k´jˇËŘ&_Ö¨GÂćZ–ż×›ĚđÜ›Áń|šŐ ǸUë \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf/.gitted/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391 b/vendor/libgit2/tests/resources/crlf/.gitted/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391 deleted file mode 100644 index 7112238943..0000000000 Binary files a/vendor/libgit2/tests/resources/crlf/.gitted/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/crlf/.gitted/objects/ea/030d3c6cec212069eca698cabaa5b4550f1511 b/vendor/libgit2/tests/resources/crlf/.gitted/objects/ea/030d3c6cec212069eca698cabaa5b4550f1511 deleted file mode 100644 index 117dc725a9..0000000000 Binary files a/vendor/libgit2/tests/resources/crlf/.gitted/objects/ea/030d3c6cec212069eca698cabaa5b4550f1511 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/crlf/.gitted/objects/ef/0dcd356d77221e9c27f4f3928ad28e80b87ceb b/vendor/libgit2/tests/resources/crlf/.gitted/objects/ef/0dcd356d77221e9c27f4f3928ad28e80b87ceb deleted file mode 100644 index 33aceda12d..0000000000 Binary files a/vendor/libgit2/tests/resources/crlf/.gitted/objects/ef/0dcd356d77221e9c27f4f3928ad28e80b87ceb and /dev/null differ diff --git a/vendor/libgit2/tests/resources/crlf/.gitted/objects/f2/b745d7f47d114a3a6b31a7b628e61e804d1a58 b/vendor/libgit2/tests/resources/crlf/.gitted/objects/f2/b745d7f47d114a3a6b31a7b628e61e804d1a58 deleted file mode 100644 index 7b2e7a1161..0000000000 Binary files a/vendor/libgit2/tests/resources/crlf/.gitted/objects/f2/b745d7f47d114a3a6b31a7b628e61e804d1a58 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/crlf/.gitted/objects/f4/d25b796d86387205a5498175d66e91d1e5006a b/vendor/libgit2/tests/resources/crlf/.gitted/objects/f4/d25b796d86387205a5498175d66e91d1e5006a deleted file mode 100644 index 792b1659d5..0000000000 Binary files a/vendor/libgit2/tests/resources/crlf/.gitted/objects/f4/d25b796d86387205a5498175d66e91d1e5006a and /dev/null differ diff --git a/vendor/libgit2/tests/resources/crlf/.gitted/objects/fe/085d9ace90cc675b87df15e1aeed0c3a31407f b/vendor/libgit2/tests/resources/crlf/.gitted/objects/fe/085d9ace90cc675b87df15e1aeed0c3a31407f deleted file mode 100644 index 2e8d10b76a..0000000000 Binary files a/vendor/libgit2/tests/resources/crlf/.gitted/objects/fe/085d9ace90cc675b87df15e1aeed0c3a31407f and /dev/null differ diff --git a/vendor/libgit2/tests/resources/crlf/.gitted/objects/fe/ab3713c4659bb22700042b3c55b8d60d0a952b b/vendor/libgit2/tests/resources/crlf/.gitted/objects/fe/ab3713c4659bb22700042b3c55b8d60d0a952b deleted file mode 100644 index 8552c7bf73..0000000000 Binary files a/vendor/libgit2/tests/resources/crlf/.gitted/objects/fe/ab3713c4659bb22700042b3c55b8d60d0a952b and /dev/null differ diff --git a/vendor/libgit2/tests/resources/crlf/.gitted/refs/heads/empty-files b/vendor/libgit2/tests/resources/crlf/.gitted/refs/heads/empty-files deleted file mode 100644 index 8f1fe61045..0000000000 --- a/vendor/libgit2/tests/resources/crlf/.gitted/refs/heads/empty-files +++ /dev/null @@ -1 +0,0 @@ -9687e444bcbb85645cb496080434c292f1b57182 diff --git a/vendor/libgit2/tests/resources/crlf/.gitted/refs/heads/master b/vendor/libgit2/tests/resources/crlf/.gitted/refs/heads/master deleted file mode 100644 index fe1d0aa038..0000000000 --- a/vendor/libgit2/tests/resources/crlf/.gitted/refs/heads/master +++ /dev/null @@ -1 +0,0 @@ -5afb6a14a864e30787857dd92af837e8cdd2cb1b diff --git a/vendor/libgit2/tests/resources/crlf_data/.gitattributes b/vendor/libgit2/tests/resources/crlf_data/.gitattributes deleted file mode 100644 index 23d9bdb29a..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/.gitattributes +++ /dev/null @@ -1 +0,0 @@ -* binary diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-crlf/all-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-crlf/all-crlf deleted file mode 100644 index a9a2e8913c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-crlf/all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-crlf/all-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-crlf/all-crlf-utf8bom deleted file mode 100644 index 0aa76e474d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-crlf/all-crlf-utf8bom +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-crlf/all-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-crlf/all-lf deleted file mode 100644 index 799770d1cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-crlf/all-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-crlf/all-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-crlf/all-lf-utf8bom deleted file mode 100644 index 7cce67e581..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-crlf/all-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-crlf/binary-all-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-crlf/binary-all-crlf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-crlf/binary-all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-crlf/binary-all-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-crlf/binary-all-lf deleted file mode 100644 index af6fcf6da1..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-crlf/binary-all-lf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-crlf/binary-mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-crlf/binary-mixed-lf-cr deleted file mode 100644 index 203555c567..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-crlf/binary-mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-crlf/binary-mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-crlf/binary-mixed-lf-cr-crlf deleted file mode 100644 index aaf083a9cb..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-crlf/binary-mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-crlf/few-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-crlf/few-utf8-chars-crlf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-crlf/few-utf8-chars-crlf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-crlf/few-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-crlf/few-utf8-chars-lf deleted file mode 100644 index f4d25b796d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-crlf/few-utf8-chars-lf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-crlf/many-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-crlf/many-utf8-chars-crlf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-crlf/many-utf8-chars-crlf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-crlf/many-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-crlf/many-utf8-chars-lf deleted file mode 100644 index 9a6c3533fe..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-crlf/many-utf8-chars-lf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-crlf/mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-crlf/mixed-lf-cr deleted file mode 100644 index d11e7ef63b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-crlf/mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-crlf/mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-crlf/mixed-lf-cr-crlf deleted file mode 100644 index 417786fc35..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-crlf/mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-crlf/more-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-crlf/more-crlf deleted file mode 100644 index 0ff5a53f19..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-crlf/more-crlf +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-crlf/more-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-crlf/more-crlf-utf8bom deleted file mode 100644 index ea030d3c6c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-crlf/more-crlf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-crlf/more-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-crlf/more-lf deleted file mode 100644 index 04de00b358..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-crlf/more-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-crlf/more-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-crlf/more-lf-utf8bom deleted file mode 100644 index dc88e3b917..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-crlf/more-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-crlf/zero-byte b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-crlf/zero-byte deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-text/all-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-text/all-crlf deleted file mode 100644 index a9a2e8913c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-text/all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-text/all-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-text/all-crlf-utf8bom deleted file mode 100644 index 0aa76e474d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-text/all-crlf-utf8bom +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-text/all-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-text/all-lf deleted file mode 100644 index 799770d1cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-text/all-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-text/all-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-text/all-lf-utf8bom deleted file mode 100644 index 7cce67e581..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-text/all-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-text/binary-all-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-text/binary-all-crlf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-text/binary-all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-text/binary-all-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-text/binary-all-lf deleted file mode 100644 index af6fcf6da1..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-text/binary-all-lf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-text/binary-mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-text/binary-mixed-lf-cr deleted file mode 100644 index 203555c567..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-text/binary-mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-text/binary-mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-text/binary-mixed-lf-cr-crlf deleted file mode 100644 index aaf083a9cb..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-text/binary-mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-text/few-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-text/few-utf8-chars-crlf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-text/few-utf8-chars-crlf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-text/few-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-text/few-utf8-chars-lf deleted file mode 100644 index f4d25b796d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-text/few-utf8-chars-lf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-text/many-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-text/many-utf8-chars-crlf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-text/many-utf8-chars-crlf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-text/many-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-text/many-utf8-chars-lf deleted file mode 100644 index 9a6c3533fe..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-text/many-utf8-chars-lf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-text/mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-text/mixed-lf-cr deleted file mode 100644 index d11e7ef63b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-text/mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-text/mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-text/mixed-lf-cr-crlf deleted file mode 100644 index 417786fc35..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-text/mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-text/more-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-text/more-crlf deleted file mode 100644 index 0ff5a53f19..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-text/more-crlf +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-text/more-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-text/more-crlf-utf8bom deleted file mode 100644 index ea030d3c6c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-text/more-crlf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-text/more-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-text/more-lf deleted file mode 100644 index 04de00b358..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-text/more-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-text/more-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-text/more-lf-utf8bom deleted file mode 100644 index dc88e3b917..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-text/more-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-text/zero-byte b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,-text/zero-byte deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,crlf/all-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,crlf/all-crlf deleted file mode 100644 index a9a2e8913c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,crlf/all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,crlf/all-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,crlf/all-crlf-utf8bom deleted file mode 100644 index 0aa76e474d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,crlf/all-crlf-utf8bom +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,crlf/all-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,crlf/all-lf deleted file mode 100644 index 799770d1cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,crlf/all-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,crlf/all-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,crlf/all-lf-utf8bom deleted file mode 100644 index 7cce67e581..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,crlf/all-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,crlf/binary-all-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,crlf/binary-all-crlf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,crlf/binary-all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,crlf/binary-all-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,crlf/binary-all-lf deleted file mode 100644 index af6fcf6da1..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,crlf/binary-all-lf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,crlf/binary-mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,crlf/binary-mixed-lf-cr deleted file mode 100644 index 203555c567..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,crlf/binary-mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,crlf/binary-mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,crlf/binary-mixed-lf-cr-crlf deleted file mode 100644 index aaf083a9cb..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,crlf/binary-mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,crlf/few-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,crlf/few-utf8-chars-crlf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,crlf/few-utf8-chars-crlf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,crlf/few-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,crlf/few-utf8-chars-lf deleted file mode 100644 index f4d25b796d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,crlf/few-utf8-chars-lf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,crlf/many-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,crlf/many-utf8-chars-crlf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,crlf/many-utf8-chars-crlf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,crlf/many-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,crlf/many-utf8-chars-lf deleted file mode 100644 index 9a6c3533fe..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,crlf/many-utf8-chars-lf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,crlf/mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,crlf/mixed-lf-cr deleted file mode 100644 index d11e7ef63b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,crlf/mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,crlf/mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,crlf/mixed-lf-cr-crlf deleted file mode 100644 index 417786fc35..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,crlf/mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,crlf/more-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,crlf/more-crlf deleted file mode 100644 index 0ff5a53f19..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,crlf/more-crlf +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,crlf/more-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,crlf/more-crlf-utf8bom deleted file mode 100644 index ea030d3c6c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,crlf/more-crlf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,crlf/more-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,crlf/more-lf deleted file mode 100644 index 04de00b358..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,crlf/more-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,crlf/more-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,crlf/more-lf-utf8bom deleted file mode 100644 index dc88e3b917..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,crlf/more-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,crlf/zero-byte b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,crlf/zero-byte deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_crlf/all-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_crlf/all-crlf deleted file mode 100644 index a9a2e8913c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_crlf/all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_crlf/all-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_crlf/all-crlf-utf8bom deleted file mode 100644 index 0aa76e474d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_crlf/all-crlf-utf8bom +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_crlf/all-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_crlf/all-lf deleted file mode 100644 index f557a02d86..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_crlf/all-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_crlf/all-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_crlf/all-lf-utf8bom deleted file mode 100644 index 381cfe630d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_crlf/all-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_crlf/binary-all-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_crlf/binary-all-crlf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_crlf/binary-all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_crlf/binary-all-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_crlf/binary-all-lf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_crlf/binary-all-lf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_crlf/binary-mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_crlf/binary-mixed-lf-cr deleted file mode 100644 index fd2abfa9d9..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_crlf/binary-mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_crlf/binary-mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_crlf/binary-mixed-lf-cr-crlf deleted file mode 100644 index fd2abfa9d9..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_crlf/binary-mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_crlf/few-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_crlf/few-utf8-chars-crlf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_crlf/few-utf8-chars-crlf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_crlf/few-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_crlf/few-utf8-chars-lf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_crlf/few-utf8-chars-lf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_crlf/many-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_crlf/many-utf8-chars-crlf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_crlf/many-utf8-chars-crlf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_crlf/many-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_crlf/many-utf8-chars-lf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_crlf/many-utf8-chars-lf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_crlf/mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_crlf/mixed-lf-cr deleted file mode 100644 index df8c0f680a..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_crlf/mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_crlf/mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_crlf/mixed-lf-cr-crlf deleted file mode 100644 index df8c0f680a..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_crlf/mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_crlf/more-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_crlf/more-crlf deleted file mode 100644 index e682c30774..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_crlf/more-crlf +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_crlf/more-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_crlf/more-crlf-utf8bom deleted file mode 100644 index 2e1220cbb5..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_crlf/more-crlf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_crlf/more-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_crlf/more-lf deleted file mode 100644 index 6da5b0c7e1..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_crlf/more-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_crlf/more-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_crlf/more-lf-utf8bom deleted file mode 100644 index 3fa59c809c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_crlf/more-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_crlf/zero-byte b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_crlf/zero-byte deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_lf/all-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_lf/all-crlf deleted file mode 100644 index a9a2e8913c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_lf/all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_lf/all-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_lf/all-crlf-utf8bom deleted file mode 100644 index 0aa76e474d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_lf/all-crlf-utf8bom +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_lf/all-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_lf/all-lf deleted file mode 100644 index 799770d1cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_lf/all-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_lf/all-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_lf/all-lf-utf8bom deleted file mode 100644 index 7cce67e581..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_lf/all-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_lf/binary-all-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_lf/binary-all-crlf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_lf/binary-all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_lf/binary-all-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_lf/binary-all-lf deleted file mode 100644 index af6fcf6da1..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_lf/binary-all-lf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_lf/binary-mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_lf/binary-mixed-lf-cr deleted file mode 100644 index 203555c567..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_lf/binary-mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_lf/binary-mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_lf/binary-mixed-lf-cr-crlf deleted file mode 100644 index aaf083a9cb..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_lf/binary-mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_lf/few-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_lf/few-utf8-chars-crlf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_lf/few-utf8-chars-crlf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_lf/few-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_lf/few-utf8-chars-lf deleted file mode 100644 index f4d25b796d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_lf/few-utf8-chars-lf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_lf/many-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_lf/many-utf8-chars-crlf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_lf/many-utf8-chars-crlf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_lf/many-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_lf/many-utf8-chars-lf deleted file mode 100644 index 9a6c3533fe..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_lf/many-utf8-chars-lf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_lf/mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_lf/mixed-lf-cr deleted file mode 100644 index d11e7ef63b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_lf/mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_lf/mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_lf/mixed-lf-cr-crlf deleted file mode 100644 index 417786fc35..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_lf/mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_lf/more-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_lf/more-crlf deleted file mode 100644 index 0ff5a53f19..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_lf/more-crlf +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_lf/more-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_lf/more-crlf-utf8bom deleted file mode 100644 index ea030d3c6c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_lf/more-crlf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_lf/more-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_lf/more-lf deleted file mode 100644 index 04de00b358..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_lf/more-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_lf/more-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_lf/more-lf-utf8bom deleted file mode 100644 index dc88e3b917..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_lf/more-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_lf/zero-byte b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,eol_lf/zero-byte deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_crlf/all-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_crlf/all-crlf deleted file mode 100644 index a9a2e8913c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_crlf/all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_crlf/all-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_crlf/all-crlf-utf8bom deleted file mode 100644 index 0aa76e474d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_crlf/all-crlf-utf8bom +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_crlf/all-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_crlf/all-lf deleted file mode 100644 index f557a02d86..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_crlf/all-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_crlf/all-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_crlf/all-lf-utf8bom deleted file mode 100644 index 381cfe630d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_crlf/all-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_crlf/binary-all-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_crlf/binary-all-crlf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_crlf/binary-all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_crlf/binary-all-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_crlf/binary-all-lf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_crlf/binary-all-lf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_crlf/binary-mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_crlf/binary-mixed-lf-cr deleted file mode 100644 index fd2abfa9d9..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_crlf/binary-mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_crlf/binary-mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_crlf/binary-mixed-lf-cr-crlf deleted file mode 100644 index fd2abfa9d9..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_crlf/binary-mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_crlf/few-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_crlf/few-utf8-chars-crlf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_crlf/few-utf8-chars-crlf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_crlf/few-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_crlf/few-utf8-chars-lf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_crlf/few-utf8-chars-lf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_crlf/many-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_crlf/many-utf8-chars-crlf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_crlf/many-utf8-chars-crlf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_crlf/many-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_crlf/many-utf8-chars-lf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_crlf/many-utf8-chars-lf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_crlf/mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_crlf/mixed-lf-cr deleted file mode 100644 index df8c0f680a..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_crlf/mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_crlf/mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_crlf/mixed-lf-cr-crlf deleted file mode 100644 index df8c0f680a..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_crlf/mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_crlf/more-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_crlf/more-crlf deleted file mode 100644 index e682c30774..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_crlf/more-crlf +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_crlf/more-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_crlf/more-crlf-utf8bom deleted file mode 100644 index 2e1220cbb5..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_crlf/more-crlf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_crlf/more-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_crlf/more-lf deleted file mode 100644 index 6da5b0c7e1..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_crlf/more-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_crlf/more-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_crlf/more-lf-utf8bom deleted file mode 100644 index 3fa59c809c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_crlf/more-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_crlf/zero-byte b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_crlf/zero-byte deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_lf/all-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_lf/all-crlf deleted file mode 100644 index a9a2e8913c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_lf/all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_lf/all-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_lf/all-crlf-utf8bom deleted file mode 100644 index 0aa76e474d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_lf/all-crlf-utf8bom +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_lf/all-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_lf/all-lf deleted file mode 100644 index 799770d1cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_lf/all-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_lf/all-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_lf/all-lf-utf8bom deleted file mode 100644 index 7cce67e581..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_lf/all-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_lf/binary-all-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_lf/binary-all-crlf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_lf/binary-all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_lf/binary-all-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_lf/binary-all-lf deleted file mode 100644 index af6fcf6da1..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_lf/binary-all-lf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_lf/binary-mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_lf/binary-mixed-lf-cr deleted file mode 100644 index 203555c567..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_lf/binary-mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_lf/binary-mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_lf/binary-mixed-lf-cr-crlf deleted file mode 100644 index aaf083a9cb..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_lf/binary-mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_lf/few-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_lf/few-utf8-chars-crlf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_lf/few-utf8-chars-crlf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_lf/few-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_lf/few-utf8-chars-lf deleted file mode 100644 index f4d25b796d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_lf/few-utf8-chars-lf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_lf/many-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_lf/many-utf8-chars-crlf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_lf/many-utf8-chars-crlf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_lf/many-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_lf/many-utf8-chars-lf deleted file mode 100644 index 9a6c3533fe..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_lf/many-utf8-chars-lf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_lf/mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_lf/mixed-lf-cr deleted file mode 100644 index d11e7ef63b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_lf/mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_lf/mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_lf/mixed-lf-cr-crlf deleted file mode 100644 index 417786fc35..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_lf/mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_lf/more-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_lf/more-crlf deleted file mode 100644 index 0ff5a53f19..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_lf/more-crlf +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_lf/more-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_lf/more-crlf-utf8bom deleted file mode 100644 index ea030d3c6c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_lf/more-crlf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_lf/more-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_lf/more-lf deleted file mode 100644 index 04de00b358..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_lf/more-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_lf/more-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_lf/more-lf-utf8bom deleted file mode 100644 index dc88e3b917..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_lf/more-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_lf/zero-byte b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text,eol_lf/zero-byte deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text/all-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text/all-crlf deleted file mode 100644 index a9a2e8913c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text/all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text/all-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text/all-crlf-utf8bom deleted file mode 100644 index 0aa76e474d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text/all-crlf-utf8bom +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text/all-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text/all-lf deleted file mode 100644 index 799770d1cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text/all-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text/all-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text/all-lf-utf8bom deleted file mode 100644 index 7cce67e581..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text/all-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text/binary-all-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text/binary-all-crlf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text/binary-all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text/binary-all-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text/binary-all-lf deleted file mode 100644 index af6fcf6da1..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text/binary-all-lf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text/binary-mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text/binary-mixed-lf-cr deleted file mode 100644 index 203555c567..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text/binary-mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text/binary-mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text/binary-mixed-lf-cr-crlf deleted file mode 100644 index aaf083a9cb..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text/binary-mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text/few-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text/few-utf8-chars-crlf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text/few-utf8-chars-crlf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text/few-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text/few-utf8-chars-lf deleted file mode 100644 index f4d25b796d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text/few-utf8-chars-lf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text/many-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text/many-utf8-chars-crlf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text/many-utf8-chars-crlf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text/many-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text/many-utf8-chars-lf deleted file mode 100644 index 9a6c3533fe..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text/many-utf8-chars-lf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text/mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text/mixed-lf-cr deleted file mode 100644 index d11e7ef63b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text/mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text/mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text/mixed-lf-cr-crlf deleted file mode 100644 index 417786fc35..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text/mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text/more-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text/more-crlf deleted file mode 100644 index 0ff5a53f19..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text/more-crlf +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text/more-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text/more-crlf-utf8bom deleted file mode 100644 index ea030d3c6c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text/more-crlf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text/more-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text/more-lf deleted file mode 100644 index 04de00b358..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text/more-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text/more-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text/more-lf-utf8bom deleted file mode 100644 index dc88e3b917..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text/more-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text/zero-byte b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text/zero-byte deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/all-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/all-crlf deleted file mode 100644 index a9a2e8913c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/all-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/all-crlf-utf8bom deleted file mode 100644 index 0aa76e474d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/all-crlf-utf8bom +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/all-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/all-lf deleted file mode 100644 index f557a02d86..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/all-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/all-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/all-lf-utf8bom deleted file mode 100644 index 381cfe630d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/all-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/binary-all-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/binary-all-crlf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/binary-all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/binary-all-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/binary-all-lf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/binary-all-lf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/binary-mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/binary-mixed-lf-cr deleted file mode 100644 index fd2abfa9d9..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/binary-mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/binary-mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/binary-mixed-lf-cr-crlf deleted file mode 100644 index fd2abfa9d9..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/binary-mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/few-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/few-utf8-chars-crlf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/few-utf8-chars-crlf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/few-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/few-utf8-chars-lf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/few-utf8-chars-lf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/many-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/many-utf8-chars-crlf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/many-utf8-chars-crlf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/many-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/many-utf8-chars-lf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/many-utf8-chars-lf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/mixed-lf-cr deleted file mode 100644 index df8c0f680a..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/mixed-lf-cr-crlf deleted file mode 100644 index df8c0f680a..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/more-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/more-crlf deleted file mode 100644 index e682c30774..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/more-crlf +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/more-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/more-crlf-utf8bom deleted file mode 100644 index 2e1220cbb5..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/more-crlf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/more-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/more-lf deleted file mode 100644 index 6da5b0c7e1..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/more-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/more-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/more-lf-utf8bom deleted file mode 100644 index 3fa59c809c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/more-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/zero-byte b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_crlf/zero-byte deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_lf/all-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_lf/all-crlf deleted file mode 100644 index a9a2e8913c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_lf/all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_lf/all-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_lf/all-crlf-utf8bom deleted file mode 100644 index 0aa76e474d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_lf/all-crlf-utf8bom +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_lf/all-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_lf/all-lf deleted file mode 100644 index 799770d1cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_lf/all-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_lf/all-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_lf/all-lf-utf8bom deleted file mode 100644 index 7cce67e581..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_lf/all-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_lf/binary-all-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_lf/binary-all-crlf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_lf/binary-all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_lf/binary-all-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_lf/binary-all-lf deleted file mode 100644 index af6fcf6da1..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_lf/binary-all-lf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_lf/binary-mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_lf/binary-mixed-lf-cr deleted file mode 100644 index 203555c567..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_lf/binary-mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_lf/binary-mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_lf/binary-mixed-lf-cr-crlf deleted file mode 100644 index aaf083a9cb..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_lf/binary-mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_lf/few-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_lf/few-utf8-chars-crlf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_lf/few-utf8-chars-crlf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_lf/few-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_lf/few-utf8-chars-lf deleted file mode 100644 index f4d25b796d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_lf/few-utf8-chars-lf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_lf/many-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_lf/many-utf8-chars-crlf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_lf/many-utf8-chars-crlf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_lf/many-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_lf/many-utf8-chars-lf deleted file mode 100644 index 9a6c3533fe..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_lf/many-utf8-chars-lf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_lf/mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_lf/mixed-lf-cr deleted file mode 100644 index d11e7ef63b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_lf/mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_lf/mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_lf/mixed-lf-cr-crlf deleted file mode 100644 index 417786fc35..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_lf/mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_lf/more-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_lf/more-crlf deleted file mode 100644 index 0ff5a53f19..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_lf/more-crlf +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_lf/more-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_lf/more-crlf-utf8bom deleted file mode 100644 index ea030d3c6c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_lf/more-crlf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_lf/more-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_lf/more-lf deleted file mode 100644 index 04de00b358..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_lf/more-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_lf/more-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_lf/more-lf-utf8bom deleted file mode 100644 index dc88e3b917..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_lf/more-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_lf/zero-byte b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto,eol_lf/zero-byte deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto/all-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto/all-crlf deleted file mode 100644 index a9a2e8913c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto/all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto/all-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto/all-crlf-utf8bom deleted file mode 100644 index 0aa76e474d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto/all-crlf-utf8bom +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto/all-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto/all-lf deleted file mode 100644 index 799770d1cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto/all-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto/all-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto/all-lf-utf8bom deleted file mode 100644 index 7cce67e581..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto/all-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto/binary-all-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto/binary-all-crlf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto/binary-all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto/binary-all-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto/binary-all-lf deleted file mode 100644 index af6fcf6da1..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto/binary-all-lf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto/binary-mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto/binary-mixed-lf-cr deleted file mode 100644 index 203555c567..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto/binary-mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto/binary-mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto/binary-mixed-lf-cr-crlf deleted file mode 100644 index aaf083a9cb..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto/binary-mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto/few-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto/few-utf8-chars-crlf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto/few-utf8-chars-crlf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto/few-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto/few-utf8-chars-lf deleted file mode 100644 index f4d25b796d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto/few-utf8-chars-lf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto/many-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto/many-utf8-chars-crlf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto/many-utf8-chars-crlf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto/many-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto/many-utf8-chars-lf deleted file mode 100644 index 9a6c3533fe..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto/many-utf8-chars-lf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto/mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto/mixed-lf-cr deleted file mode 100644 index d11e7ef63b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto/mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto/mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto/mixed-lf-cr-crlf deleted file mode 100644 index 417786fc35..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto/mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto/more-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto/more-crlf deleted file mode 100644 index 0ff5a53f19..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto/more-crlf +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto/more-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto/more-crlf-utf8bom deleted file mode 100644 index ea030d3c6c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto/more-crlf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto/more-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto/more-lf deleted file mode 100644 index 04de00b358..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto/more-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto/more-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto/more-lf-utf8bom deleted file mode 100644 index dc88e3b917..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto/more-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto/zero-byte b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false,text_auto/zero-byte deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false/all-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false/all-crlf deleted file mode 100644 index a9a2e8913c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false/all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false/all-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false/all-crlf-utf8bom deleted file mode 100644 index 0aa76e474d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false/all-crlf-utf8bom +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false/all-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false/all-lf deleted file mode 100644 index 799770d1cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false/all-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false/all-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false/all-lf-utf8bom deleted file mode 100644 index 7cce67e581..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false/all-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false/binary-all-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false/binary-all-crlf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false/binary-all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false/binary-all-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false/binary-all-lf deleted file mode 100644 index af6fcf6da1..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false/binary-all-lf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false/binary-mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false/binary-mixed-lf-cr deleted file mode 100644 index 203555c567..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false/binary-mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false/binary-mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false/binary-mixed-lf-cr-crlf deleted file mode 100644 index aaf083a9cb..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false/binary-mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false/few-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false/few-utf8-chars-crlf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false/few-utf8-chars-crlf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false/few-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false/few-utf8-chars-lf deleted file mode 100644 index f4d25b796d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false/few-utf8-chars-lf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false/many-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false/many-utf8-chars-crlf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false/many-utf8-chars-crlf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false/many-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false/many-utf8-chars-lf deleted file mode 100644 index 9a6c3533fe..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false/many-utf8-chars-lf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false/mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false/mixed-lf-cr deleted file mode 100644 index d11e7ef63b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false/mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false/mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false/mixed-lf-cr-crlf deleted file mode 100644 index 417786fc35..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false/mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false/more-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false/more-crlf deleted file mode 100644 index 0ff5a53f19..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false/more-crlf +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false/more-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false/more-crlf-utf8bom deleted file mode 100644 index ea030d3c6c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false/more-crlf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false/more-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false/more-lf deleted file mode 100644 index 04de00b358..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false/more-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false/more-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false/more-lf-utf8bom deleted file mode 100644 index dc88e3b917..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false/more-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false/zero-byte b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_false/zero-byte deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-crlf/all-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-crlf/all-crlf deleted file mode 100644 index a9a2e8913c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-crlf/all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-crlf/all-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-crlf/all-crlf-utf8bom deleted file mode 100644 index 0aa76e474d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-crlf/all-crlf-utf8bom +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-crlf/all-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-crlf/all-lf deleted file mode 100644 index 799770d1cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-crlf/all-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-crlf/all-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-crlf/all-lf-utf8bom deleted file mode 100644 index 7cce67e581..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-crlf/all-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-crlf/binary-all-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-crlf/binary-all-crlf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-crlf/binary-all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-crlf/binary-all-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-crlf/binary-all-lf deleted file mode 100644 index af6fcf6da1..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-crlf/binary-all-lf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-crlf/binary-mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-crlf/binary-mixed-lf-cr deleted file mode 100644 index 203555c567..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-crlf/binary-mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-crlf/binary-mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-crlf/binary-mixed-lf-cr-crlf deleted file mode 100644 index aaf083a9cb..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-crlf/binary-mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-crlf/few-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-crlf/few-utf8-chars-crlf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-crlf/few-utf8-chars-crlf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-crlf/few-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-crlf/few-utf8-chars-lf deleted file mode 100644 index f4d25b796d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-crlf/few-utf8-chars-lf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-crlf/many-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-crlf/many-utf8-chars-crlf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-crlf/many-utf8-chars-crlf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-crlf/many-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-crlf/many-utf8-chars-lf deleted file mode 100644 index 9a6c3533fe..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-crlf/many-utf8-chars-lf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-crlf/mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-crlf/mixed-lf-cr deleted file mode 100644 index d11e7ef63b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-crlf/mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-crlf/mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-crlf/mixed-lf-cr-crlf deleted file mode 100644 index 417786fc35..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-crlf/mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-crlf/more-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-crlf/more-crlf deleted file mode 100644 index 0ff5a53f19..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-crlf/more-crlf +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-crlf/more-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-crlf/more-crlf-utf8bom deleted file mode 100644 index ea030d3c6c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-crlf/more-crlf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-crlf/more-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-crlf/more-lf deleted file mode 100644 index 04de00b358..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-crlf/more-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-crlf/more-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-crlf/more-lf-utf8bom deleted file mode 100644 index dc88e3b917..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-crlf/more-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-crlf/zero-byte b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-crlf/zero-byte deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-text/all-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-text/all-crlf deleted file mode 100644 index a9a2e8913c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-text/all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-text/all-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-text/all-crlf-utf8bom deleted file mode 100644 index 0aa76e474d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-text/all-crlf-utf8bom +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-text/all-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-text/all-lf deleted file mode 100644 index 799770d1cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-text/all-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-text/all-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-text/all-lf-utf8bom deleted file mode 100644 index 7cce67e581..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-text/all-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-text/binary-all-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-text/binary-all-crlf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-text/binary-all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-text/binary-all-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-text/binary-all-lf deleted file mode 100644 index af6fcf6da1..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-text/binary-all-lf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-text/binary-mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-text/binary-mixed-lf-cr deleted file mode 100644 index 203555c567..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-text/binary-mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-text/binary-mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-text/binary-mixed-lf-cr-crlf deleted file mode 100644 index aaf083a9cb..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-text/binary-mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-text/few-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-text/few-utf8-chars-crlf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-text/few-utf8-chars-crlf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-text/few-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-text/few-utf8-chars-lf deleted file mode 100644 index f4d25b796d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-text/few-utf8-chars-lf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-text/many-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-text/many-utf8-chars-crlf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-text/many-utf8-chars-crlf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-text/many-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-text/many-utf8-chars-lf deleted file mode 100644 index 9a6c3533fe..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-text/many-utf8-chars-lf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-text/mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-text/mixed-lf-cr deleted file mode 100644 index d11e7ef63b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-text/mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-text/mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-text/mixed-lf-cr-crlf deleted file mode 100644 index 417786fc35..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-text/mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-text/more-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-text/more-crlf deleted file mode 100644 index 0ff5a53f19..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-text/more-crlf +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-text/more-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-text/more-crlf-utf8bom deleted file mode 100644 index ea030d3c6c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-text/more-crlf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-text/more-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-text/more-lf deleted file mode 100644 index 04de00b358..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-text/more-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-text/more-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-text/more-lf-utf8bom deleted file mode 100644 index dc88e3b917..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-text/more-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-text/zero-byte b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,-text/zero-byte deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,crlf/all-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,crlf/all-crlf deleted file mode 100644 index a9a2e8913c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,crlf/all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,crlf/all-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,crlf/all-crlf-utf8bom deleted file mode 100644 index 0aa76e474d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,crlf/all-crlf-utf8bom +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,crlf/all-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,crlf/all-lf deleted file mode 100644 index 799770d1cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,crlf/all-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,crlf/all-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,crlf/all-lf-utf8bom deleted file mode 100644 index 7cce67e581..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,crlf/all-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,crlf/binary-all-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,crlf/binary-all-crlf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,crlf/binary-all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,crlf/binary-all-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,crlf/binary-all-lf deleted file mode 100644 index af6fcf6da1..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,crlf/binary-all-lf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,crlf/binary-mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,crlf/binary-mixed-lf-cr deleted file mode 100644 index 203555c567..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,crlf/binary-mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,crlf/binary-mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,crlf/binary-mixed-lf-cr-crlf deleted file mode 100644 index aaf083a9cb..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,crlf/binary-mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,crlf/few-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,crlf/few-utf8-chars-crlf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,crlf/few-utf8-chars-crlf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,crlf/few-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,crlf/few-utf8-chars-lf deleted file mode 100644 index f4d25b796d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,crlf/few-utf8-chars-lf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,crlf/many-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,crlf/many-utf8-chars-crlf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,crlf/many-utf8-chars-crlf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,crlf/many-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,crlf/many-utf8-chars-lf deleted file mode 100644 index 9a6c3533fe..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,crlf/many-utf8-chars-lf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,crlf/mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,crlf/mixed-lf-cr deleted file mode 100644 index d11e7ef63b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,crlf/mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,crlf/mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,crlf/mixed-lf-cr-crlf deleted file mode 100644 index 417786fc35..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,crlf/mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,crlf/more-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,crlf/more-crlf deleted file mode 100644 index 0ff5a53f19..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,crlf/more-crlf +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,crlf/more-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,crlf/more-crlf-utf8bom deleted file mode 100644 index ea030d3c6c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,crlf/more-crlf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,crlf/more-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,crlf/more-lf deleted file mode 100644 index 04de00b358..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,crlf/more-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,crlf/more-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,crlf/more-lf-utf8bom deleted file mode 100644 index dc88e3b917..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,crlf/more-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,crlf/zero-byte b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,crlf/zero-byte deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_crlf/all-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_crlf/all-crlf deleted file mode 100644 index a9a2e8913c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_crlf/all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_crlf/all-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_crlf/all-crlf-utf8bom deleted file mode 100644 index 0aa76e474d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_crlf/all-crlf-utf8bom +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_crlf/all-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_crlf/all-lf deleted file mode 100644 index f557a02d86..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_crlf/all-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_crlf/all-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_crlf/all-lf-utf8bom deleted file mode 100644 index 381cfe630d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_crlf/all-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_crlf/binary-all-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_crlf/binary-all-crlf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_crlf/binary-all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_crlf/binary-all-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_crlf/binary-all-lf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_crlf/binary-all-lf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_crlf/binary-mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_crlf/binary-mixed-lf-cr deleted file mode 100644 index fd2abfa9d9..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_crlf/binary-mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_crlf/binary-mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_crlf/binary-mixed-lf-cr-crlf deleted file mode 100644 index fd2abfa9d9..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_crlf/binary-mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_crlf/few-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_crlf/few-utf8-chars-crlf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_crlf/few-utf8-chars-crlf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_crlf/few-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_crlf/few-utf8-chars-lf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_crlf/few-utf8-chars-lf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_crlf/many-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_crlf/many-utf8-chars-crlf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_crlf/many-utf8-chars-crlf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_crlf/many-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_crlf/many-utf8-chars-lf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_crlf/many-utf8-chars-lf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_crlf/mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_crlf/mixed-lf-cr deleted file mode 100644 index df8c0f680a..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_crlf/mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_crlf/mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_crlf/mixed-lf-cr-crlf deleted file mode 100644 index df8c0f680a..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_crlf/mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_crlf/more-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_crlf/more-crlf deleted file mode 100644 index e682c30774..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_crlf/more-crlf +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_crlf/more-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_crlf/more-crlf-utf8bom deleted file mode 100644 index 2e1220cbb5..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_crlf/more-crlf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_crlf/more-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_crlf/more-lf deleted file mode 100644 index 6da5b0c7e1..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_crlf/more-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_crlf/more-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_crlf/more-lf-utf8bom deleted file mode 100644 index 3fa59c809c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_crlf/more-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_crlf/zero-byte b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_crlf/zero-byte deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_lf/all-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_lf/all-crlf deleted file mode 100644 index a9a2e8913c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_lf/all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_lf/all-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_lf/all-crlf-utf8bom deleted file mode 100644 index 0aa76e474d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_lf/all-crlf-utf8bom +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_lf/all-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_lf/all-lf deleted file mode 100644 index 799770d1cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_lf/all-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_lf/all-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_lf/all-lf-utf8bom deleted file mode 100644 index 7cce67e581..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_lf/all-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_lf/binary-all-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_lf/binary-all-crlf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_lf/binary-all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_lf/binary-all-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_lf/binary-all-lf deleted file mode 100644 index af6fcf6da1..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_lf/binary-all-lf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_lf/binary-mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_lf/binary-mixed-lf-cr deleted file mode 100644 index 203555c567..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_lf/binary-mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_lf/binary-mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_lf/binary-mixed-lf-cr-crlf deleted file mode 100644 index aaf083a9cb..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_lf/binary-mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_lf/few-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_lf/few-utf8-chars-crlf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_lf/few-utf8-chars-crlf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_lf/few-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_lf/few-utf8-chars-lf deleted file mode 100644 index f4d25b796d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_lf/few-utf8-chars-lf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_lf/many-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_lf/many-utf8-chars-crlf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_lf/many-utf8-chars-crlf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_lf/many-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_lf/many-utf8-chars-lf deleted file mode 100644 index 9a6c3533fe..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_lf/many-utf8-chars-lf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_lf/mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_lf/mixed-lf-cr deleted file mode 100644 index d11e7ef63b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_lf/mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_lf/mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_lf/mixed-lf-cr-crlf deleted file mode 100644 index 417786fc35..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_lf/mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_lf/more-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_lf/more-crlf deleted file mode 100644 index 0ff5a53f19..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_lf/more-crlf +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_lf/more-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_lf/more-crlf-utf8bom deleted file mode 100644 index ea030d3c6c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_lf/more-crlf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_lf/more-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_lf/more-lf deleted file mode 100644 index 04de00b358..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_lf/more-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_lf/more-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_lf/more-lf-utf8bom deleted file mode 100644 index dc88e3b917..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_lf/more-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_lf/zero-byte b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,eol_lf/zero-byte deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_crlf/all-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_crlf/all-crlf deleted file mode 100644 index a9a2e8913c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_crlf/all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_crlf/all-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_crlf/all-crlf-utf8bom deleted file mode 100644 index 0aa76e474d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_crlf/all-crlf-utf8bom +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_crlf/all-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_crlf/all-lf deleted file mode 100644 index f557a02d86..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_crlf/all-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_crlf/all-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_crlf/all-lf-utf8bom deleted file mode 100644 index 381cfe630d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_crlf/all-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_crlf/binary-all-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_crlf/binary-all-crlf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_crlf/binary-all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_crlf/binary-all-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_crlf/binary-all-lf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_crlf/binary-all-lf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_crlf/binary-mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_crlf/binary-mixed-lf-cr deleted file mode 100644 index fd2abfa9d9..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_crlf/binary-mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_crlf/binary-mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_crlf/binary-mixed-lf-cr-crlf deleted file mode 100644 index fd2abfa9d9..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_crlf/binary-mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_crlf/few-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_crlf/few-utf8-chars-crlf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_crlf/few-utf8-chars-crlf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_crlf/few-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_crlf/few-utf8-chars-lf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_crlf/few-utf8-chars-lf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_crlf/many-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_crlf/many-utf8-chars-crlf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_crlf/many-utf8-chars-crlf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_crlf/many-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_crlf/many-utf8-chars-lf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_crlf/many-utf8-chars-lf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_crlf/mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_crlf/mixed-lf-cr deleted file mode 100644 index df8c0f680a..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_crlf/mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_crlf/mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_crlf/mixed-lf-cr-crlf deleted file mode 100644 index df8c0f680a..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_crlf/mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_crlf/more-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_crlf/more-crlf deleted file mode 100644 index e682c30774..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_crlf/more-crlf +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_crlf/more-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_crlf/more-crlf-utf8bom deleted file mode 100644 index 2e1220cbb5..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_crlf/more-crlf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_crlf/more-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_crlf/more-lf deleted file mode 100644 index 6da5b0c7e1..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_crlf/more-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_crlf/more-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_crlf/more-lf-utf8bom deleted file mode 100644 index 3fa59c809c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_crlf/more-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_crlf/zero-byte b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_crlf/zero-byte deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_lf/all-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_lf/all-crlf deleted file mode 100644 index a9a2e8913c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_lf/all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_lf/all-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_lf/all-crlf-utf8bom deleted file mode 100644 index 0aa76e474d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_lf/all-crlf-utf8bom +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_lf/all-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_lf/all-lf deleted file mode 100644 index 799770d1cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_lf/all-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_lf/all-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_lf/all-lf-utf8bom deleted file mode 100644 index 7cce67e581..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_lf/all-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_lf/binary-all-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_lf/binary-all-crlf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_lf/binary-all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_lf/binary-all-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_lf/binary-all-lf deleted file mode 100644 index af6fcf6da1..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_lf/binary-all-lf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_lf/binary-mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_lf/binary-mixed-lf-cr deleted file mode 100644 index 203555c567..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_lf/binary-mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_lf/binary-mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_lf/binary-mixed-lf-cr-crlf deleted file mode 100644 index aaf083a9cb..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_lf/binary-mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_lf/few-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_lf/few-utf8-chars-crlf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_lf/few-utf8-chars-crlf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_lf/few-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_lf/few-utf8-chars-lf deleted file mode 100644 index f4d25b796d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_lf/few-utf8-chars-lf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_lf/many-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_lf/many-utf8-chars-crlf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_lf/many-utf8-chars-crlf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_lf/many-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_lf/many-utf8-chars-lf deleted file mode 100644 index 9a6c3533fe..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_lf/many-utf8-chars-lf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_lf/mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_lf/mixed-lf-cr deleted file mode 100644 index d11e7ef63b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_lf/mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_lf/mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_lf/mixed-lf-cr-crlf deleted file mode 100644 index 417786fc35..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_lf/mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_lf/more-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_lf/more-crlf deleted file mode 100644 index 0ff5a53f19..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_lf/more-crlf +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_lf/more-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_lf/more-crlf-utf8bom deleted file mode 100644 index ea030d3c6c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_lf/more-crlf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_lf/more-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_lf/more-lf deleted file mode 100644 index 04de00b358..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_lf/more-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_lf/more-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_lf/more-lf-utf8bom deleted file mode 100644 index dc88e3b917..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_lf/more-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_lf/zero-byte b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text,eol_lf/zero-byte deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text/all-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text/all-crlf deleted file mode 100644 index a9a2e8913c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text/all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text/all-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text/all-crlf-utf8bom deleted file mode 100644 index 0aa76e474d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text/all-crlf-utf8bom +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text/all-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text/all-lf deleted file mode 100644 index 799770d1cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text/all-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text/all-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text/all-lf-utf8bom deleted file mode 100644 index 7cce67e581..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text/all-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text/binary-all-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text/binary-all-crlf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text/binary-all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text/binary-all-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text/binary-all-lf deleted file mode 100644 index af6fcf6da1..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text/binary-all-lf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text/binary-mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text/binary-mixed-lf-cr deleted file mode 100644 index 203555c567..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text/binary-mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text/binary-mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text/binary-mixed-lf-cr-crlf deleted file mode 100644 index aaf083a9cb..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text/binary-mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text/few-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text/few-utf8-chars-crlf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text/few-utf8-chars-crlf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text/few-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text/few-utf8-chars-lf deleted file mode 100644 index f4d25b796d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text/few-utf8-chars-lf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text/many-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text/many-utf8-chars-crlf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text/many-utf8-chars-crlf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text/many-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text/many-utf8-chars-lf deleted file mode 100644 index 9a6c3533fe..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text/many-utf8-chars-lf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text/mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text/mixed-lf-cr deleted file mode 100644 index d11e7ef63b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text/mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text/mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text/mixed-lf-cr-crlf deleted file mode 100644 index 417786fc35..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text/mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text/more-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text/more-crlf deleted file mode 100644 index 0ff5a53f19..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text/more-crlf +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text/more-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text/more-crlf-utf8bom deleted file mode 100644 index ea030d3c6c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text/more-crlf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text/more-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text/more-lf deleted file mode 100644 index 04de00b358..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text/more-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text/more-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text/more-lf-utf8bom deleted file mode 100644 index dc88e3b917..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text/more-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text/zero-byte b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text/zero-byte deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/all-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/all-crlf deleted file mode 100644 index a9a2e8913c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/all-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/all-crlf-utf8bom deleted file mode 100644 index 0aa76e474d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/all-crlf-utf8bom +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/all-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/all-lf deleted file mode 100644 index f557a02d86..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/all-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/all-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/all-lf-utf8bom deleted file mode 100644 index 381cfe630d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/all-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/binary-all-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/binary-all-crlf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/binary-all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/binary-all-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/binary-all-lf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/binary-all-lf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/binary-mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/binary-mixed-lf-cr deleted file mode 100644 index fd2abfa9d9..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/binary-mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/binary-mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/binary-mixed-lf-cr-crlf deleted file mode 100644 index fd2abfa9d9..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/binary-mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/few-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/few-utf8-chars-crlf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/few-utf8-chars-crlf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/few-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/few-utf8-chars-lf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/few-utf8-chars-lf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/many-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/many-utf8-chars-crlf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/many-utf8-chars-crlf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/many-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/many-utf8-chars-lf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/many-utf8-chars-lf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/mixed-lf-cr deleted file mode 100644 index df8c0f680a..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/mixed-lf-cr-crlf deleted file mode 100644 index df8c0f680a..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/more-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/more-crlf deleted file mode 100644 index e682c30774..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/more-crlf +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/more-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/more-crlf-utf8bom deleted file mode 100644 index 2e1220cbb5..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/more-crlf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/more-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/more-lf deleted file mode 100644 index 6da5b0c7e1..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/more-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/more-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/more-lf-utf8bom deleted file mode 100644 index 3fa59c809c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/more-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/zero-byte b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_crlf/zero-byte deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_lf/all-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_lf/all-crlf deleted file mode 100644 index a9a2e8913c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_lf/all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_lf/all-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_lf/all-crlf-utf8bom deleted file mode 100644 index 0aa76e474d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_lf/all-crlf-utf8bom +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_lf/all-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_lf/all-lf deleted file mode 100644 index 799770d1cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_lf/all-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_lf/all-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_lf/all-lf-utf8bom deleted file mode 100644 index 7cce67e581..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_lf/all-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_lf/binary-all-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_lf/binary-all-crlf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_lf/binary-all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_lf/binary-all-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_lf/binary-all-lf deleted file mode 100644 index af6fcf6da1..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_lf/binary-all-lf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_lf/binary-mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_lf/binary-mixed-lf-cr deleted file mode 100644 index 203555c567..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_lf/binary-mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_lf/binary-mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_lf/binary-mixed-lf-cr-crlf deleted file mode 100644 index aaf083a9cb..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_lf/binary-mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_lf/few-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_lf/few-utf8-chars-crlf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_lf/few-utf8-chars-crlf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_lf/few-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_lf/few-utf8-chars-lf deleted file mode 100644 index f4d25b796d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_lf/few-utf8-chars-lf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_lf/many-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_lf/many-utf8-chars-crlf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_lf/many-utf8-chars-crlf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_lf/many-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_lf/many-utf8-chars-lf deleted file mode 100644 index 9a6c3533fe..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_lf/many-utf8-chars-lf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_lf/mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_lf/mixed-lf-cr deleted file mode 100644 index d11e7ef63b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_lf/mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_lf/mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_lf/mixed-lf-cr-crlf deleted file mode 100644 index 417786fc35..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_lf/mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_lf/more-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_lf/more-crlf deleted file mode 100644 index 0ff5a53f19..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_lf/more-crlf +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_lf/more-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_lf/more-crlf-utf8bom deleted file mode 100644 index ea030d3c6c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_lf/more-crlf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_lf/more-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_lf/more-lf deleted file mode 100644 index 04de00b358..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_lf/more-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_lf/more-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_lf/more-lf-utf8bom deleted file mode 100644 index dc88e3b917..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_lf/more-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_lf/zero-byte b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto,eol_lf/zero-byte deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto/all-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto/all-crlf deleted file mode 100644 index a9a2e8913c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto/all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto/all-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto/all-crlf-utf8bom deleted file mode 100644 index 0aa76e474d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto/all-crlf-utf8bom +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto/all-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto/all-lf deleted file mode 100644 index 799770d1cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto/all-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto/all-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto/all-lf-utf8bom deleted file mode 100644 index 7cce67e581..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto/all-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto/binary-all-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto/binary-all-crlf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto/binary-all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto/binary-all-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto/binary-all-lf deleted file mode 100644 index af6fcf6da1..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto/binary-all-lf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto/binary-mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto/binary-mixed-lf-cr deleted file mode 100644 index 203555c567..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto/binary-mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto/binary-mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto/binary-mixed-lf-cr-crlf deleted file mode 100644 index aaf083a9cb..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto/binary-mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto/few-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto/few-utf8-chars-crlf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto/few-utf8-chars-crlf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto/few-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto/few-utf8-chars-lf deleted file mode 100644 index f4d25b796d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto/few-utf8-chars-lf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto/many-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto/many-utf8-chars-crlf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto/many-utf8-chars-crlf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto/many-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto/many-utf8-chars-lf deleted file mode 100644 index 9a6c3533fe..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto/many-utf8-chars-lf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto/mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto/mixed-lf-cr deleted file mode 100644 index d11e7ef63b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto/mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto/mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto/mixed-lf-cr-crlf deleted file mode 100644 index 417786fc35..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto/mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto/more-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto/more-crlf deleted file mode 100644 index 0ff5a53f19..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto/more-crlf +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto/more-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto/more-crlf-utf8bom deleted file mode 100644 index ea030d3c6c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto/more-crlf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto/more-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto/more-lf deleted file mode 100644 index 04de00b358..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto/more-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto/more-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto/more-lf-utf8bom deleted file mode 100644 index dc88e3b917..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto/more-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto/zero-byte b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input,text_auto/zero-byte deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input/all-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input/all-crlf deleted file mode 100644 index a9a2e8913c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input/all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input/all-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input/all-crlf-utf8bom deleted file mode 100644 index 0aa76e474d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input/all-crlf-utf8bom +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input/all-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input/all-lf deleted file mode 100644 index 799770d1cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input/all-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input/all-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input/all-lf-utf8bom deleted file mode 100644 index 7cce67e581..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input/all-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input/binary-all-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input/binary-all-crlf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input/binary-all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input/binary-all-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input/binary-all-lf deleted file mode 100644 index af6fcf6da1..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input/binary-all-lf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input/binary-mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input/binary-mixed-lf-cr deleted file mode 100644 index 203555c567..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input/binary-mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input/binary-mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input/binary-mixed-lf-cr-crlf deleted file mode 100644 index aaf083a9cb..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input/binary-mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input/few-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input/few-utf8-chars-crlf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input/few-utf8-chars-crlf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input/few-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input/few-utf8-chars-lf deleted file mode 100644 index f4d25b796d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input/few-utf8-chars-lf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input/many-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input/many-utf8-chars-crlf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input/many-utf8-chars-crlf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input/many-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input/many-utf8-chars-lf deleted file mode 100644 index 9a6c3533fe..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input/many-utf8-chars-lf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input/mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input/mixed-lf-cr deleted file mode 100644 index d11e7ef63b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input/mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input/mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input/mixed-lf-cr-crlf deleted file mode 100644 index 417786fc35..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input/mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input/more-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input/more-crlf deleted file mode 100644 index 0ff5a53f19..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input/more-crlf +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input/more-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input/more-crlf-utf8bom deleted file mode 100644 index ea030d3c6c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input/more-crlf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input/more-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input/more-lf deleted file mode 100644 index 04de00b358..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input/more-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input/more-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input/more-lf-utf8bom deleted file mode 100644 index dc88e3b917..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input/more-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input/zero-byte b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_input/zero-byte deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-crlf/all-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-crlf/all-crlf deleted file mode 100644 index a9a2e8913c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-crlf/all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-crlf/all-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-crlf/all-crlf-utf8bom deleted file mode 100644 index 0aa76e474d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-crlf/all-crlf-utf8bom +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-crlf/all-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-crlf/all-lf deleted file mode 100644 index 799770d1cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-crlf/all-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-crlf/all-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-crlf/all-lf-utf8bom deleted file mode 100644 index 7cce67e581..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-crlf/all-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-crlf/binary-all-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-crlf/binary-all-crlf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-crlf/binary-all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-crlf/binary-all-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-crlf/binary-all-lf deleted file mode 100644 index af6fcf6da1..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-crlf/binary-all-lf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-crlf/binary-mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-crlf/binary-mixed-lf-cr deleted file mode 100644 index 203555c567..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-crlf/binary-mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-crlf/binary-mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-crlf/binary-mixed-lf-cr-crlf deleted file mode 100644 index aaf083a9cb..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-crlf/binary-mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-crlf/few-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-crlf/few-utf8-chars-crlf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-crlf/few-utf8-chars-crlf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-crlf/few-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-crlf/few-utf8-chars-lf deleted file mode 100644 index f4d25b796d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-crlf/few-utf8-chars-lf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-crlf/many-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-crlf/many-utf8-chars-crlf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-crlf/many-utf8-chars-crlf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-crlf/many-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-crlf/many-utf8-chars-lf deleted file mode 100644 index 9a6c3533fe..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-crlf/many-utf8-chars-lf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-crlf/mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-crlf/mixed-lf-cr deleted file mode 100644 index d11e7ef63b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-crlf/mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-crlf/mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-crlf/mixed-lf-cr-crlf deleted file mode 100644 index 417786fc35..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-crlf/mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-crlf/more-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-crlf/more-crlf deleted file mode 100644 index 0ff5a53f19..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-crlf/more-crlf +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-crlf/more-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-crlf/more-crlf-utf8bom deleted file mode 100644 index ea030d3c6c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-crlf/more-crlf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-crlf/more-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-crlf/more-lf deleted file mode 100644 index 04de00b358..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-crlf/more-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-crlf/more-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-crlf/more-lf-utf8bom deleted file mode 100644 index dc88e3b917..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-crlf/more-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-crlf/zero-byte b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-crlf/zero-byte deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-text/all-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-text/all-crlf deleted file mode 100644 index a9a2e8913c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-text/all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-text/all-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-text/all-crlf-utf8bom deleted file mode 100644 index 0aa76e474d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-text/all-crlf-utf8bom +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-text/all-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-text/all-lf deleted file mode 100644 index 799770d1cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-text/all-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-text/all-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-text/all-lf-utf8bom deleted file mode 100644 index 7cce67e581..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-text/all-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-text/binary-all-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-text/binary-all-crlf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-text/binary-all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-text/binary-all-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-text/binary-all-lf deleted file mode 100644 index af6fcf6da1..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-text/binary-all-lf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-text/binary-mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-text/binary-mixed-lf-cr deleted file mode 100644 index 203555c567..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-text/binary-mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-text/binary-mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-text/binary-mixed-lf-cr-crlf deleted file mode 100644 index aaf083a9cb..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-text/binary-mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-text/few-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-text/few-utf8-chars-crlf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-text/few-utf8-chars-crlf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-text/few-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-text/few-utf8-chars-lf deleted file mode 100644 index f4d25b796d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-text/few-utf8-chars-lf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-text/many-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-text/many-utf8-chars-crlf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-text/many-utf8-chars-crlf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-text/many-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-text/many-utf8-chars-lf deleted file mode 100644 index 9a6c3533fe..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-text/many-utf8-chars-lf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-text/mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-text/mixed-lf-cr deleted file mode 100644 index d11e7ef63b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-text/mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-text/mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-text/mixed-lf-cr-crlf deleted file mode 100644 index 417786fc35..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-text/mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-text/more-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-text/more-crlf deleted file mode 100644 index 0ff5a53f19..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-text/more-crlf +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-text/more-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-text/more-crlf-utf8bom deleted file mode 100644 index ea030d3c6c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-text/more-crlf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-text/more-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-text/more-lf deleted file mode 100644 index 04de00b358..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-text/more-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-text/more-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-text/more-lf-utf8bom deleted file mode 100644 index dc88e3b917..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-text/more-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-text/zero-byte b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,-text/zero-byte deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,crlf/all-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,crlf/all-crlf deleted file mode 100644 index a9a2e8913c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,crlf/all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,crlf/all-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,crlf/all-crlf-utf8bom deleted file mode 100644 index 0aa76e474d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,crlf/all-crlf-utf8bom +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,crlf/all-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,crlf/all-lf deleted file mode 100644 index f557a02d86..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,crlf/all-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,crlf/all-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,crlf/all-lf-utf8bom deleted file mode 100644 index 381cfe630d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,crlf/all-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,crlf/binary-all-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,crlf/binary-all-crlf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,crlf/binary-all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,crlf/binary-all-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,crlf/binary-all-lf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,crlf/binary-all-lf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,crlf/binary-mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,crlf/binary-mixed-lf-cr deleted file mode 100644 index fd2abfa9d9..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,crlf/binary-mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,crlf/binary-mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,crlf/binary-mixed-lf-cr-crlf deleted file mode 100644 index fd2abfa9d9..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,crlf/binary-mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,crlf/few-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,crlf/few-utf8-chars-crlf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,crlf/few-utf8-chars-crlf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,crlf/few-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,crlf/few-utf8-chars-lf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,crlf/few-utf8-chars-lf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,crlf/many-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,crlf/many-utf8-chars-crlf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,crlf/many-utf8-chars-crlf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,crlf/many-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,crlf/many-utf8-chars-lf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,crlf/many-utf8-chars-lf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,crlf/mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,crlf/mixed-lf-cr deleted file mode 100644 index df8c0f680a..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,crlf/mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,crlf/mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,crlf/mixed-lf-cr-crlf deleted file mode 100644 index df8c0f680a..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,crlf/mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,crlf/more-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,crlf/more-crlf deleted file mode 100644 index e682c30774..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,crlf/more-crlf +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,crlf/more-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,crlf/more-crlf-utf8bom deleted file mode 100644 index 2e1220cbb5..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,crlf/more-crlf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,crlf/more-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,crlf/more-lf deleted file mode 100644 index 6da5b0c7e1..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,crlf/more-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,crlf/more-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,crlf/more-lf-utf8bom deleted file mode 100644 index 3fa59c809c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,crlf/more-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,crlf/zero-byte b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,crlf/zero-byte deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_crlf/all-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_crlf/all-crlf deleted file mode 100644 index a9a2e8913c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_crlf/all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_crlf/all-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_crlf/all-crlf-utf8bom deleted file mode 100644 index 0aa76e474d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_crlf/all-crlf-utf8bom +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_crlf/all-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_crlf/all-lf deleted file mode 100644 index f557a02d86..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_crlf/all-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_crlf/all-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_crlf/all-lf-utf8bom deleted file mode 100644 index 381cfe630d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_crlf/all-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_crlf/binary-all-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_crlf/binary-all-crlf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_crlf/binary-all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_crlf/binary-all-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_crlf/binary-all-lf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_crlf/binary-all-lf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_crlf/binary-mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_crlf/binary-mixed-lf-cr deleted file mode 100644 index fd2abfa9d9..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_crlf/binary-mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_crlf/binary-mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_crlf/binary-mixed-lf-cr-crlf deleted file mode 100644 index fd2abfa9d9..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_crlf/binary-mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_crlf/few-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_crlf/few-utf8-chars-crlf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_crlf/few-utf8-chars-crlf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_crlf/few-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_crlf/few-utf8-chars-lf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_crlf/few-utf8-chars-lf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_crlf/many-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_crlf/many-utf8-chars-crlf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_crlf/many-utf8-chars-crlf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_crlf/many-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_crlf/many-utf8-chars-lf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_crlf/many-utf8-chars-lf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_crlf/mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_crlf/mixed-lf-cr deleted file mode 100644 index df8c0f680a..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_crlf/mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_crlf/mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_crlf/mixed-lf-cr-crlf deleted file mode 100644 index df8c0f680a..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_crlf/mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_crlf/more-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_crlf/more-crlf deleted file mode 100644 index e682c30774..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_crlf/more-crlf +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_crlf/more-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_crlf/more-crlf-utf8bom deleted file mode 100644 index 2e1220cbb5..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_crlf/more-crlf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_crlf/more-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_crlf/more-lf deleted file mode 100644 index 6da5b0c7e1..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_crlf/more-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_crlf/more-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_crlf/more-lf-utf8bom deleted file mode 100644 index 3fa59c809c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_crlf/more-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_crlf/zero-byte b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_crlf/zero-byte deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_lf/all-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_lf/all-crlf deleted file mode 100644 index a9a2e8913c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_lf/all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_lf/all-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_lf/all-crlf-utf8bom deleted file mode 100644 index 0aa76e474d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_lf/all-crlf-utf8bom +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_lf/all-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_lf/all-lf deleted file mode 100644 index 799770d1cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_lf/all-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_lf/all-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_lf/all-lf-utf8bom deleted file mode 100644 index 7cce67e581..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_lf/all-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_lf/binary-all-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_lf/binary-all-crlf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_lf/binary-all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_lf/binary-all-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_lf/binary-all-lf deleted file mode 100644 index af6fcf6da1..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_lf/binary-all-lf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_lf/binary-mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_lf/binary-mixed-lf-cr deleted file mode 100644 index 203555c567..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_lf/binary-mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_lf/binary-mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_lf/binary-mixed-lf-cr-crlf deleted file mode 100644 index aaf083a9cb..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_lf/binary-mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_lf/few-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_lf/few-utf8-chars-crlf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_lf/few-utf8-chars-crlf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_lf/few-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_lf/few-utf8-chars-lf deleted file mode 100644 index f4d25b796d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_lf/few-utf8-chars-lf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_lf/many-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_lf/many-utf8-chars-crlf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_lf/many-utf8-chars-crlf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_lf/many-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_lf/many-utf8-chars-lf deleted file mode 100644 index 9a6c3533fe..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_lf/many-utf8-chars-lf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_lf/mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_lf/mixed-lf-cr deleted file mode 100644 index d11e7ef63b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_lf/mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_lf/mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_lf/mixed-lf-cr-crlf deleted file mode 100644 index 417786fc35..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_lf/mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_lf/more-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_lf/more-crlf deleted file mode 100644 index 0ff5a53f19..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_lf/more-crlf +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_lf/more-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_lf/more-crlf-utf8bom deleted file mode 100644 index ea030d3c6c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_lf/more-crlf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_lf/more-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_lf/more-lf deleted file mode 100644 index 04de00b358..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_lf/more-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_lf/more-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_lf/more-lf-utf8bom deleted file mode 100644 index dc88e3b917..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_lf/more-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_lf/zero-byte b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,eol_lf/zero-byte deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_crlf/all-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_crlf/all-crlf deleted file mode 100644 index a9a2e8913c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_crlf/all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_crlf/all-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_crlf/all-crlf-utf8bom deleted file mode 100644 index 0aa76e474d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_crlf/all-crlf-utf8bom +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_crlf/all-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_crlf/all-lf deleted file mode 100644 index f557a02d86..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_crlf/all-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_crlf/all-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_crlf/all-lf-utf8bom deleted file mode 100644 index 381cfe630d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_crlf/all-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_crlf/binary-all-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_crlf/binary-all-crlf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_crlf/binary-all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_crlf/binary-all-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_crlf/binary-all-lf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_crlf/binary-all-lf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_crlf/binary-mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_crlf/binary-mixed-lf-cr deleted file mode 100644 index fd2abfa9d9..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_crlf/binary-mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_crlf/binary-mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_crlf/binary-mixed-lf-cr-crlf deleted file mode 100644 index fd2abfa9d9..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_crlf/binary-mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_crlf/few-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_crlf/few-utf8-chars-crlf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_crlf/few-utf8-chars-crlf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_crlf/few-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_crlf/few-utf8-chars-lf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_crlf/few-utf8-chars-lf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_crlf/many-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_crlf/many-utf8-chars-crlf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_crlf/many-utf8-chars-crlf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_crlf/many-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_crlf/many-utf8-chars-lf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_crlf/many-utf8-chars-lf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_crlf/mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_crlf/mixed-lf-cr deleted file mode 100644 index df8c0f680a..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_crlf/mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_crlf/mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_crlf/mixed-lf-cr-crlf deleted file mode 100644 index df8c0f680a..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_crlf/mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_crlf/more-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_crlf/more-crlf deleted file mode 100644 index e682c30774..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_crlf/more-crlf +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_crlf/more-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_crlf/more-crlf-utf8bom deleted file mode 100644 index 2e1220cbb5..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_crlf/more-crlf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_crlf/more-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_crlf/more-lf deleted file mode 100644 index 6da5b0c7e1..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_crlf/more-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_crlf/more-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_crlf/more-lf-utf8bom deleted file mode 100644 index 3fa59c809c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_crlf/more-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_crlf/zero-byte b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_crlf/zero-byte deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_lf/all-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_lf/all-crlf deleted file mode 100644 index a9a2e8913c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_lf/all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_lf/all-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_lf/all-crlf-utf8bom deleted file mode 100644 index 0aa76e474d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_lf/all-crlf-utf8bom +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_lf/all-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_lf/all-lf deleted file mode 100644 index 799770d1cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_lf/all-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_lf/all-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_lf/all-lf-utf8bom deleted file mode 100644 index 7cce67e581..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_lf/all-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_lf/binary-all-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_lf/binary-all-crlf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_lf/binary-all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_lf/binary-all-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_lf/binary-all-lf deleted file mode 100644 index af6fcf6da1..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_lf/binary-all-lf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_lf/binary-mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_lf/binary-mixed-lf-cr deleted file mode 100644 index 203555c567..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_lf/binary-mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_lf/binary-mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_lf/binary-mixed-lf-cr-crlf deleted file mode 100644 index aaf083a9cb..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_lf/binary-mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_lf/few-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_lf/few-utf8-chars-crlf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_lf/few-utf8-chars-crlf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_lf/few-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_lf/few-utf8-chars-lf deleted file mode 100644 index f4d25b796d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_lf/few-utf8-chars-lf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_lf/many-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_lf/many-utf8-chars-crlf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_lf/many-utf8-chars-crlf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_lf/many-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_lf/many-utf8-chars-lf deleted file mode 100644 index 9a6c3533fe..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_lf/many-utf8-chars-lf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_lf/mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_lf/mixed-lf-cr deleted file mode 100644 index d11e7ef63b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_lf/mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_lf/mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_lf/mixed-lf-cr-crlf deleted file mode 100644 index 417786fc35..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_lf/mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_lf/more-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_lf/more-crlf deleted file mode 100644 index 0ff5a53f19..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_lf/more-crlf +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_lf/more-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_lf/more-crlf-utf8bom deleted file mode 100644 index ea030d3c6c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_lf/more-crlf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_lf/more-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_lf/more-lf deleted file mode 100644 index 04de00b358..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_lf/more-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_lf/more-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_lf/more-lf-utf8bom deleted file mode 100644 index dc88e3b917..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_lf/more-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_lf/zero-byte b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text,eol_lf/zero-byte deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text/all-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text/all-crlf deleted file mode 100644 index a9a2e8913c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text/all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text/all-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text/all-crlf-utf8bom deleted file mode 100644 index 0aa76e474d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text/all-crlf-utf8bom +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text/all-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text/all-lf deleted file mode 100644 index f557a02d86..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text/all-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text/all-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text/all-lf-utf8bom deleted file mode 100644 index 381cfe630d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text/all-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text/binary-all-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text/binary-all-crlf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text/binary-all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text/binary-all-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text/binary-all-lf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text/binary-all-lf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text/binary-mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text/binary-mixed-lf-cr deleted file mode 100644 index fd2abfa9d9..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text/binary-mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text/binary-mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text/binary-mixed-lf-cr-crlf deleted file mode 100644 index fd2abfa9d9..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text/binary-mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text/few-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text/few-utf8-chars-crlf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text/few-utf8-chars-crlf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text/few-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text/few-utf8-chars-lf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text/few-utf8-chars-lf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text/many-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text/many-utf8-chars-crlf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text/many-utf8-chars-crlf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text/many-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text/many-utf8-chars-lf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text/many-utf8-chars-lf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text/mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text/mixed-lf-cr deleted file mode 100644 index df8c0f680a..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text/mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text/mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text/mixed-lf-cr-crlf deleted file mode 100644 index df8c0f680a..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text/mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text/more-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text/more-crlf deleted file mode 100644 index e682c30774..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text/more-crlf +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text/more-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text/more-crlf-utf8bom deleted file mode 100644 index 2e1220cbb5..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text/more-crlf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text/more-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text/more-lf deleted file mode 100644 index 6da5b0c7e1..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text/more-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text/more-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text/more-lf-utf8bom deleted file mode 100644 index 3fa59c809c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text/more-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text/zero-byte b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text/zero-byte deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/all-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/all-crlf deleted file mode 100644 index a9a2e8913c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/all-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/all-crlf-utf8bom deleted file mode 100644 index 0aa76e474d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/all-crlf-utf8bom +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/all-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/all-lf deleted file mode 100644 index f557a02d86..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/all-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/all-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/all-lf-utf8bom deleted file mode 100644 index 381cfe630d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/all-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/binary-all-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/binary-all-crlf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/binary-all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/binary-all-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/binary-all-lf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/binary-all-lf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/binary-mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/binary-mixed-lf-cr deleted file mode 100644 index fd2abfa9d9..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/binary-mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/binary-mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/binary-mixed-lf-cr-crlf deleted file mode 100644 index fd2abfa9d9..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/binary-mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/few-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/few-utf8-chars-crlf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/few-utf8-chars-crlf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/few-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/few-utf8-chars-lf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/few-utf8-chars-lf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/many-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/many-utf8-chars-crlf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/many-utf8-chars-crlf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/many-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/many-utf8-chars-lf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/many-utf8-chars-lf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/mixed-lf-cr deleted file mode 100644 index df8c0f680a..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/mixed-lf-cr-crlf deleted file mode 100644 index df8c0f680a..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/more-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/more-crlf deleted file mode 100644 index e682c30774..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/more-crlf +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/more-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/more-crlf-utf8bom deleted file mode 100644 index 2e1220cbb5..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/more-crlf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/more-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/more-lf deleted file mode 100644 index 6da5b0c7e1..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/more-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/more-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/more-lf-utf8bom deleted file mode 100644 index 3fa59c809c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/more-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/zero-byte b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_crlf/zero-byte deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_lf/all-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_lf/all-crlf deleted file mode 100644 index a9a2e8913c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_lf/all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_lf/all-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_lf/all-crlf-utf8bom deleted file mode 100644 index 0aa76e474d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_lf/all-crlf-utf8bom +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_lf/all-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_lf/all-lf deleted file mode 100644 index 799770d1cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_lf/all-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_lf/all-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_lf/all-lf-utf8bom deleted file mode 100644 index 7cce67e581..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_lf/all-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_lf/binary-all-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_lf/binary-all-crlf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_lf/binary-all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_lf/binary-all-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_lf/binary-all-lf deleted file mode 100644 index af6fcf6da1..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_lf/binary-all-lf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_lf/binary-mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_lf/binary-mixed-lf-cr deleted file mode 100644 index 203555c567..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_lf/binary-mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_lf/binary-mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_lf/binary-mixed-lf-cr-crlf deleted file mode 100644 index aaf083a9cb..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_lf/binary-mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_lf/few-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_lf/few-utf8-chars-crlf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_lf/few-utf8-chars-crlf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_lf/few-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_lf/few-utf8-chars-lf deleted file mode 100644 index f4d25b796d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_lf/few-utf8-chars-lf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_lf/many-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_lf/many-utf8-chars-crlf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_lf/many-utf8-chars-crlf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_lf/many-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_lf/many-utf8-chars-lf deleted file mode 100644 index 9a6c3533fe..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_lf/many-utf8-chars-lf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_lf/mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_lf/mixed-lf-cr deleted file mode 100644 index d11e7ef63b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_lf/mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_lf/mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_lf/mixed-lf-cr-crlf deleted file mode 100644 index 417786fc35..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_lf/mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_lf/more-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_lf/more-crlf deleted file mode 100644 index 0ff5a53f19..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_lf/more-crlf +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_lf/more-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_lf/more-crlf-utf8bom deleted file mode 100644 index ea030d3c6c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_lf/more-crlf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_lf/more-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_lf/more-lf deleted file mode 100644 index 04de00b358..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_lf/more-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_lf/more-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_lf/more-lf-utf8bom deleted file mode 100644 index dc88e3b917..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_lf/more-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_lf/zero-byte b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto,eol_lf/zero-byte deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto/all-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto/all-crlf deleted file mode 100644 index a9a2e8913c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto/all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto/all-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto/all-crlf-utf8bom deleted file mode 100644 index 0aa76e474d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto/all-crlf-utf8bom +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto/all-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto/all-lf deleted file mode 100644 index f557a02d86..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto/all-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto/all-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto/all-lf-utf8bom deleted file mode 100644 index 381cfe630d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto/all-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto/binary-all-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto/binary-all-crlf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto/binary-all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto/binary-all-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto/binary-all-lf deleted file mode 100644 index af6fcf6da1..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto/binary-all-lf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto/binary-mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto/binary-mixed-lf-cr deleted file mode 100644 index 203555c567..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto/binary-mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto/binary-mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto/binary-mixed-lf-cr-crlf deleted file mode 100644 index aaf083a9cb..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto/binary-mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto/few-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto/few-utf8-chars-crlf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto/few-utf8-chars-crlf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto/few-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto/few-utf8-chars-lf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto/few-utf8-chars-lf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto/many-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto/many-utf8-chars-crlf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto/many-utf8-chars-crlf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto/many-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto/many-utf8-chars-lf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto/many-utf8-chars-lf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto/mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto/mixed-lf-cr deleted file mode 100644 index d11e7ef63b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto/mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto/mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto/mixed-lf-cr-crlf deleted file mode 100644 index 417786fc35..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto/mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto/more-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto/more-crlf deleted file mode 100644 index e682c30774..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto/more-crlf +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto/more-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto/more-crlf-utf8bom deleted file mode 100644 index 2e1220cbb5..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto/more-crlf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto/more-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto/more-lf deleted file mode 100644 index 6da5b0c7e1..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto/more-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto/more-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto/more-lf-utf8bom deleted file mode 100644 index 3fa59c809c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto/more-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto/zero-byte b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true,text_auto/zero-byte deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true/all-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true/all-crlf deleted file mode 100644 index a9a2e8913c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true/all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true/all-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true/all-crlf-utf8bom deleted file mode 100644 index 0aa76e474d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true/all-crlf-utf8bom +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true/all-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true/all-lf deleted file mode 100644 index f557a02d86..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true/all-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true/all-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true/all-lf-utf8bom deleted file mode 100644 index 381cfe630d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true/all-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true/binary-all-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true/binary-all-crlf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true/binary-all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true/binary-all-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true/binary-all-lf deleted file mode 100644 index af6fcf6da1..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true/binary-all-lf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true/binary-mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true/binary-mixed-lf-cr deleted file mode 100644 index 203555c567..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true/binary-mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true/binary-mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true/binary-mixed-lf-cr-crlf deleted file mode 100644 index aaf083a9cb..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true/binary-mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true/few-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true/few-utf8-chars-crlf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true/few-utf8-chars-crlf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true/few-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true/few-utf8-chars-lf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true/few-utf8-chars-lf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true/many-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true/many-utf8-chars-crlf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true/many-utf8-chars-crlf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true/many-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true/many-utf8-chars-lf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true/many-utf8-chars-lf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true/mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true/mixed-lf-cr deleted file mode 100644 index d11e7ef63b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true/mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true/mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true/mixed-lf-cr-crlf deleted file mode 100644 index 417786fc35..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true/mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true/more-crlf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true/more-crlf deleted file mode 100644 index 0ff5a53f19..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true/more-crlf +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true/more-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true/more-crlf-utf8bom deleted file mode 100644 index ea030d3c6c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true/more-crlf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true/more-lf b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true/more-lf deleted file mode 100644 index 04de00b358..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true/more-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true/more-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true/more-lf-utf8bom deleted file mode 100644 index dc88e3b917..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true/more-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true/zero-byte b/vendor/libgit2/tests/resources/crlf_data/posix/autocrlf_true/zero-byte deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-crlf/all-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-crlf/all-crlf deleted file mode 100644 index a9a2e8913c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-crlf/all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-crlf/all-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-crlf/all-crlf-utf8bom deleted file mode 100644 index 0aa76e474d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-crlf/all-crlf-utf8bom +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-crlf/all-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-crlf/all-lf deleted file mode 100644 index 799770d1cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-crlf/all-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-crlf/all-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-crlf/all-lf-utf8bom deleted file mode 100644 index 7cce67e581..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-crlf/all-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-crlf/binary-all-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-crlf/binary-all-crlf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-crlf/binary-all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-crlf/binary-all-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-crlf/binary-all-lf deleted file mode 100644 index af6fcf6da1..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-crlf/binary-all-lf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-crlf/binary-mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-crlf/binary-mixed-lf-cr deleted file mode 100644 index 203555c567..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-crlf/binary-mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-crlf/binary-mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-crlf/binary-mixed-lf-cr-crlf deleted file mode 100644 index aaf083a9cb..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-crlf/binary-mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-crlf/few-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-crlf/few-utf8-chars-crlf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-crlf/few-utf8-chars-crlf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-crlf/few-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-crlf/few-utf8-chars-lf deleted file mode 100644 index f4d25b796d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-crlf/few-utf8-chars-lf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-crlf/many-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-crlf/many-utf8-chars-crlf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-crlf/many-utf8-chars-crlf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-crlf/many-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-crlf/many-utf8-chars-lf deleted file mode 100644 index 9a6c3533fe..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-crlf/many-utf8-chars-lf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-crlf/mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-crlf/mixed-lf-cr deleted file mode 100644 index d11e7ef63b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-crlf/mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-crlf/mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-crlf/mixed-lf-cr-crlf deleted file mode 100644 index 417786fc35..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-crlf/mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-crlf/more-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-crlf/more-crlf deleted file mode 100644 index 0ff5a53f19..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-crlf/more-crlf +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-crlf/more-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-crlf/more-crlf-utf8bom deleted file mode 100644 index ea030d3c6c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-crlf/more-crlf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-crlf/more-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-crlf/more-lf deleted file mode 100644 index 04de00b358..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-crlf/more-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-crlf/more-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-crlf/more-lf-utf8bom deleted file mode 100644 index dc88e3b917..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-crlf/more-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-crlf/zero-byte b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-crlf/zero-byte deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-text/all-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-text/all-crlf deleted file mode 100644 index a9a2e8913c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-text/all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-text/all-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-text/all-crlf-utf8bom deleted file mode 100644 index 0aa76e474d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-text/all-crlf-utf8bom +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-text/all-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-text/all-lf deleted file mode 100644 index 799770d1cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-text/all-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-text/all-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-text/all-lf-utf8bom deleted file mode 100644 index 7cce67e581..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-text/all-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-text/binary-all-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-text/binary-all-crlf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-text/binary-all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-text/binary-all-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-text/binary-all-lf deleted file mode 100644 index af6fcf6da1..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-text/binary-all-lf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-text/binary-mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-text/binary-mixed-lf-cr deleted file mode 100644 index 203555c567..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-text/binary-mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-text/binary-mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-text/binary-mixed-lf-cr-crlf deleted file mode 100644 index aaf083a9cb..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-text/binary-mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-text/few-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-text/few-utf8-chars-crlf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-text/few-utf8-chars-crlf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-text/few-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-text/few-utf8-chars-lf deleted file mode 100644 index f4d25b796d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-text/few-utf8-chars-lf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-text/many-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-text/many-utf8-chars-crlf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-text/many-utf8-chars-crlf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-text/many-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-text/many-utf8-chars-lf deleted file mode 100644 index 9a6c3533fe..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-text/many-utf8-chars-lf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-text/mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-text/mixed-lf-cr deleted file mode 100644 index d11e7ef63b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-text/mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-text/mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-text/mixed-lf-cr-crlf deleted file mode 100644 index 417786fc35..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-text/mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-text/more-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-text/more-crlf deleted file mode 100644 index 0ff5a53f19..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-text/more-crlf +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-text/more-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-text/more-crlf-utf8bom deleted file mode 100644 index ea030d3c6c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-text/more-crlf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-text/more-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-text/more-lf deleted file mode 100644 index 04de00b358..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-text/more-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-text/more-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-text/more-lf-utf8bom deleted file mode 100644 index dc88e3b917..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-text/more-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-text/zero-byte b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,-text/zero-byte deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,crlf/all-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,crlf/all-crlf deleted file mode 100644 index a9a2e8913c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,crlf/all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,crlf/all-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,crlf/all-crlf-utf8bom deleted file mode 100644 index 0aa76e474d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,crlf/all-crlf-utf8bom +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,crlf/all-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,crlf/all-lf deleted file mode 100644 index f557a02d86..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,crlf/all-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,crlf/all-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,crlf/all-lf-utf8bom deleted file mode 100644 index 381cfe630d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,crlf/all-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,crlf/binary-all-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,crlf/binary-all-crlf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,crlf/binary-all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,crlf/binary-all-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,crlf/binary-all-lf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,crlf/binary-all-lf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,crlf/binary-mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,crlf/binary-mixed-lf-cr deleted file mode 100644 index fd2abfa9d9..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,crlf/binary-mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,crlf/binary-mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,crlf/binary-mixed-lf-cr-crlf deleted file mode 100644 index fd2abfa9d9..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,crlf/binary-mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,crlf/few-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,crlf/few-utf8-chars-crlf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,crlf/few-utf8-chars-crlf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,crlf/few-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,crlf/few-utf8-chars-lf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,crlf/few-utf8-chars-lf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,crlf/many-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,crlf/many-utf8-chars-crlf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,crlf/many-utf8-chars-crlf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,crlf/many-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,crlf/many-utf8-chars-lf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,crlf/many-utf8-chars-lf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,crlf/mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,crlf/mixed-lf-cr deleted file mode 100644 index df8c0f680a..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,crlf/mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,crlf/mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,crlf/mixed-lf-cr-crlf deleted file mode 100644 index df8c0f680a..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,crlf/mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,crlf/more-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,crlf/more-crlf deleted file mode 100644 index e682c30774..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,crlf/more-crlf +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,crlf/more-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,crlf/more-crlf-utf8bom deleted file mode 100644 index 2e1220cbb5..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,crlf/more-crlf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,crlf/more-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,crlf/more-lf deleted file mode 100644 index 6da5b0c7e1..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,crlf/more-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,crlf/more-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,crlf/more-lf-utf8bom deleted file mode 100644 index 3fa59c809c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,crlf/more-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,crlf/zero-byte b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,crlf/zero-byte deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_crlf/all-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_crlf/all-crlf deleted file mode 100644 index a9a2e8913c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_crlf/all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_crlf/all-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_crlf/all-crlf-utf8bom deleted file mode 100644 index 0aa76e474d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_crlf/all-crlf-utf8bom +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_crlf/all-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_crlf/all-lf deleted file mode 100644 index f557a02d86..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_crlf/all-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_crlf/all-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_crlf/all-lf-utf8bom deleted file mode 100644 index 381cfe630d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_crlf/all-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_crlf/binary-all-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_crlf/binary-all-crlf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_crlf/binary-all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_crlf/binary-all-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_crlf/binary-all-lf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_crlf/binary-all-lf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_crlf/binary-mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_crlf/binary-mixed-lf-cr deleted file mode 100644 index fd2abfa9d9..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_crlf/binary-mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_crlf/binary-mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_crlf/binary-mixed-lf-cr-crlf deleted file mode 100644 index fd2abfa9d9..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_crlf/binary-mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_crlf/few-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_crlf/few-utf8-chars-crlf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_crlf/few-utf8-chars-crlf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_crlf/few-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_crlf/few-utf8-chars-lf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_crlf/few-utf8-chars-lf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_crlf/many-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_crlf/many-utf8-chars-crlf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_crlf/many-utf8-chars-crlf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_crlf/many-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_crlf/many-utf8-chars-lf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_crlf/many-utf8-chars-lf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_crlf/mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_crlf/mixed-lf-cr deleted file mode 100644 index df8c0f680a..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_crlf/mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_crlf/mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_crlf/mixed-lf-cr-crlf deleted file mode 100644 index df8c0f680a..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_crlf/mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_crlf/more-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_crlf/more-crlf deleted file mode 100644 index e682c30774..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_crlf/more-crlf +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_crlf/more-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_crlf/more-crlf-utf8bom deleted file mode 100644 index 2e1220cbb5..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_crlf/more-crlf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_crlf/more-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_crlf/more-lf deleted file mode 100644 index 6da5b0c7e1..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_crlf/more-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_crlf/more-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_crlf/more-lf-utf8bom deleted file mode 100644 index 3fa59c809c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_crlf/more-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_crlf/zero-byte b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_crlf/zero-byte deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_lf/all-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_lf/all-crlf deleted file mode 100644 index a9a2e8913c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_lf/all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_lf/all-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_lf/all-crlf-utf8bom deleted file mode 100644 index 0aa76e474d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_lf/all-crlf-utf8bom +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_lf/all-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_lf/all-lf deleted file mode 100644 index 799770d1cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_lf/all-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_lf/all-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_lf/all-lf-utf8bom deleted file mode 100644 index 7cce67e581..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_lf/all-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_lf/binary-all-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_lf/binary-all-crlf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_lf/binary-all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_lf/binary-all-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_lf/binary-all-lf deleted file mode 100644 index af6fcf6da1..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_lf/binary-all-lf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_lf/binary-mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_lf/binary-mixed-lf-cr deleted file mode 100644 index 203555c567..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_lf/binary-mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_lf/binary-mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_lf/binary-mixed-lf-cr-crlf deleted file mode 100644 index aaf083a9cb..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_lf/binary-mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_lf/few-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_lf/few-utf8-chars-crlf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_lf/few-utf8-chars-crlf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_lf/few-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_lf/few-utf8-chars-lf deleted file mode 100644 index f4d25b796d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_lf/few-utf8-chars-lf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_lf/many-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_lf/many-utf8-chars-crlf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_lf/many-utf8-chars-crlf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_lf/many-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_lf/many-utf8-chars-lf deleted file mode 100644 index 9a6c3533fe..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_lf/many-utf8-chars-lf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_lf/mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_lf/mixed-lf-cr deleted file mode 100644 index d11e7ef63b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_lf/mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_lf/mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_lf/mixed-lf-cr-crlf deleted file mode 100644 index 417786fc35..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_lf/mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_lf/more-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_lf/more-crlf deleted file mode 100644 index 0ff5a53f19..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_lf/more-crlf +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_lf/more-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_lf/more-crlf-utf8bom deleted file mode 100644 index ea030d3c6c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_lf/more-crlf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_lf/more-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_lf/more-lf deleted file mode 100644 index 04de00b358..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_lf/more-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_lf/more-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_lf/more-lf-utf8bom deleted file mode 100644 index dc88e3b917..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_lf/more-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_lf/zero-byte b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,eol_lf/zero-byte deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_crlf/all-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_crlf/all-crlf deleted file mode 100644 index a9a2e8913c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_crlf/all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_crlf/all-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_crlf/all-crlf-utf8bom deleted file mode 100644 index 0aa76e474d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_crlf/all-crlf-utf8bom +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_crlf/all-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_crlf/all-lf deleted file mode 100644 index f557a02d86..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_crlf/all-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_crlf/all-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_crlf/all-lf-utf8bom deleted file mode 100644 index 381cfe630d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_crlf/all-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_crlf/binary-all-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_crlf/binary-all-crlf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_crlf/binary-all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_crlf/binary-all-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_crlf/binary-all-lf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_crlf/binary-all-lf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_crlf/binary-mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_crlf/binary-mixed-lf-cr deleted file mode 100644 index fd2abfa9d9..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_crlf/binary-mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_crlf/binary-mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_crlf/binary-mixed-lf-cr-crlf deleted file mode 100644 index fd2abfa9d9..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_crlf/binary-mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_crlf/few-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_crlf/few-utf8-chars-crlf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_crlf/few-utf8-chars-crlf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_crlf/few-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_crlf/few-utf8-chars-lf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_crlf/few-utf8-chars-lf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_crlf/many-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_crlf/many-utf8-chars-crlf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_crlf/many-utf8-chars-crlf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_crlf/many-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_crlf/many-utf8-chars-lf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_crlf/many-utf8-chars-lf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_crlf/mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_crlf/mixed-lf-cr deleted file mode 100644 index df8c0f680a..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_crlf/mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_crlf/mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_crlf/mixed-lf-cr-crlf deleted file mode 100644 index df8c0f680a..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_crlf/mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_crlf/more-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_crlf/more-crlf deleted file mode 100644 index e682c30774..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_crlf/more-crlf +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_crlf/more-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_crlf/more-crlf-utf8bom deleted file mode 100644 index 2e1220cbb5..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_crlf/more-crlf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_crlf/more-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_crlf/more-lf deleted file mode 100644 index 6da5b0c7e1..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_crlf/more-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_crlf/more-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_crlf/more-lf-utf8bom deleted file mode 100644 index 3fa59c809c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_crlf/more-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_crlf/zero-byte b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_crlf/zero-byte deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_lf/all-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_lf/all-crlf deleted file mode 100644 index a9a2e8913c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_lf/all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_lf/all-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_lf/all-crlf-utf8bom deleted file mode 100644 index 0aa76e474d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_lf/all-crlf-utf8bom +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_lf/all-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_lf/all-lf deleted file mode 100644 index 799770d1cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_lf/all-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_lf/all-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_lf/all-lf-utf8bom deleted file mode 100644 index 7cce67e581..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_lf/all-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_lf/binary-all-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_lf/binary-all-crlf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_lf/binary-all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_lf/binary-all-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_lf/binary-all-lf deleted file mode 100644 index af6fcf6da1..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_lf/binary-all-lf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_lf/binary-mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_lf/binary-mixed-lf-cr deleted file mode 100644 index 203555c567..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_lf/binary-mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_lf/binary-mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_lf/binary-mixed-lf-cr-crlf deleted file mode 100644 index aaf083a9cb..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_lf/binary-mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_lf/few-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_lf/few-utf8-chars-crlf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_lf/few-utf8-chars-crlf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_lf/few-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_lf/few-utf8-chars-lf deleted file mode 100644 index f4d25b796d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_lf/few-utf8-chars-lf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_lf/many-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_lf/many-utf8-chars-crlf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_lf/many-utf8-chars-crlf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_lf/many-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_lf/many-utf8-chars-lf deleted file mode 100644 index 9a6c3533fe..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_lf/many-utf8-chars-lf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_lf/mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_lf/mixed-lf-cr deleted file mode 100644 index d11e7ef63b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_lf/mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_lf/mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_lf/mixed-lf-cr-crlf deleted file mode 100644 index 417786fc35..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_lf/mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_lf/more-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_lf/more-crlf deleted file mode 100644 index 0ff5a53f19..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_lf/more-crlf +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_lf/more-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_lf/more-crlf-utf8bom deleted file mode 100644 index ea030d3c6c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_lf/more-crlf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_lf/more-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_lf/more-lf deleted file mode 100644 index 04de00b358..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_lf/more-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_lf/more-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_lf/more-lf-utf8bom deleted file mode 100644 index dc88e3b917..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_lf/more-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_lf/zero-byte b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text,eol_lf/zero-byte deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text/all-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text/all-crlf deleted file mode 100644 index a9a2e8913c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text/all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text/all-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text/all-crlf-utf8bom deleted file mode 100644 index 0aa76e474d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text/all-crlf-utf8bom +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text/all-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text/all-lf deleted file mode 100644 index f557a02d86..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text/all-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text/all-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text/all-lf-utf8bom deleted file mode 100644 index 381cfe630d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text/all-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text/binary-all-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text/binary-all-crlf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text/binary-all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text/binary-all-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text/binary-all-lf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text/binary-all-lf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text/binary-mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text/binary-mixed-lf-cr deleted file mode 100644 index fd2abfa9d9..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text/binary-mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text/binary-mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text/binary-mixed-lf-cr-crlf deleted file mode 100644 index fd2abfa9d9..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text/binary-mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text/few-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text/few-utf8-chars-crlf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text/few-utf8-chars-crlf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text/few-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text/few-utf8-chars-lf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text/few-utf8-chars-lf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text/many-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text/many-utf8-chars-crlf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text/many-utf8-chars-crlf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text/many-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text/many-utf8-chars-lf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text/many-utf8-chars-lf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text/mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text/mixed-lf-cr deleted file mode 100644 index df8c0f680a..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text/mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text/mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text/mixed-lf-cr-crlf deleted file mode 100644 index df8c0f680a..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text/mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text/more-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text/more-crlf deleted file mode 100644 index e682c30774..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text/more-crlf +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text/more-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text/more-crlf-utf8bom deleted file mode 100644 index 2e1220cbb5..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text/more-crlf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text/more-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text/more-lf deleted file mode 100644 index 6da5b0c7e1..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text/more-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text/more-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text/more-lf-utf8bom deleted file mode 100644 index 3fa59c809c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text/more-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text/zero-byte b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text/zero-byte deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/all-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/all-crlf deleted file mode 100644 index a9a2e8913c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/all-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/all-crlf-utf8bom deleted file mode 100644 index 0aa76e474d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/all-crlf-utf8bom +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/all-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/all-lf deleted file mode 100644 index f557a02d86..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/all-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/all-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/all-lf-utf8bom deleted file mode 100644 index 381cfe630d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/all-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/binary-all-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/binary-all-crlf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/binary-all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/binary-all-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/binary-all-lf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/binary-all-lf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/binary-mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/binary-mixed-lf-cr deleted file mode 100644 index fd2abfa9d9..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/binary-mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/binary-mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/binary-mixed-lf-cr-crlf deleted file mode 100644 index fd2abfa9d9..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/binary-mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/few-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/few-utf8-chars-crlf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/few-utf8-chars-crlf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/few-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/few-utf8-chars-lf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/few-utf8-chars-lf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/many-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/many-utf8-chars-crlf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/many-utf8-chars-crlf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/many-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/many-utf8-chars-lf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/many-utf8-chars-lf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/mixed-lf-cr deleted file mode 100644 index df8c0f680a..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/mixed-lf-cr-crlf deleted file mode 100644 index df8c0f680a..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/more-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/more-crlf deleted file mode 100644 index e682c30774..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/more-crlf +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/more-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/more-crlf-utf8bom deleted file mode 100644 index 2e1220cbb5..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/more-crlf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/more-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/more-lf deleted file mode 100644 index 6da5b0c7e1..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/more-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/more-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/more-lf-utf8bom deleted file mode 100644 index 3fa59c809c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/more-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/zero-byte b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_crlf/zero-byte deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_lf/all-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_lf/all-crlf deleted file mode 100644 index a9a2e8913c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_lf/all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_lf/all-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_lf/all-crlf-utf8bom deleted file mode 100644 index 0aa76e474d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_lf/all-crlf-utf8bom +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_lf/all-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_lf/all-lf deleted file mode 100644 index 799770d1cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_lf/all-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_lf/all-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_lf/all-lf-utf8bom deleted file mode 100644 index 7cce67e581..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_lf/all-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_lf/binary-all-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_lf/binary-all-crlf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_lf/binary-all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_lf/binary-all-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_lf/binary-all-lf deleted file mode 100644 index af6fcf6da1..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_lf/binary-all-lf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_lf/binary-mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_lf/binary-mixed-lf-cr deleted file mode 100644 index 203555c567..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_lf/binary-mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_lf/binary-mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_lf/binary-mixed-lf-cr-crlf deleted file mode 100644 index aaf083a9cb..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_lf/binary-mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_lf/few-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_lf/few-utf8-chars-crlf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_lf/few-utf8-chars-crlf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_lf/few-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_lf/few-utf8-chars-lf deleted file mode 100644 index f4d25b796d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_lf/few-utf8-chars-lf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_lf/many-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_lf/many-utf8-chars-crlf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_lf/many-utf8-chars-crlf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_lf/many-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_lf/many-utf8-chars-lf deleted file mode 100644 index 9a6c3533fe..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_lf/many-utf8-chars-lf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_lf/mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_lf/mixed-lf-cr deleted file mode 100644 index d11e7ef63b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_lf/mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_lf/mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_lf/mixed-lf-cr-crlf deleted file mode 100644 index 417786fc35..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_lf/mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_lf/more-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_lf/more-crlf deleted file mode 100644 index 0ff5a53f19..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_lf/more-crlf +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_lf/more-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_lf/more-crlf-utf8bom deleted file mode 100644 index ea030d3c6c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_lf/more-crlf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_lf/more-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_lf/more-lf deleted file mode 100644 index 04de00b358..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_lf/more-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_lf/more-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_lf/more-lf-utf8bom deleted file mode 100644 index dc88e3b917..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_lf/more-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_lf/zero-byte b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto,eol_lf/zero-byte deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto/all-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto/all-crlf deleted file mode 100644 index a9a2e8913c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto/all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto/all-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto/all-crlf-utf8bom deleted file mode 100644 index 0aa76e474d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto/all-crlf-utf8bom +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto/all-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto/all-lf deleted file mode 100644 index f557a02d86..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto/all-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto/all-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto/all-lf-utf8bom deleted file mode 100644 index 381cfe630d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto/all-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto/binary-all-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto/binary-all-crlf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto/binary-all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto/binary-all-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto/binary-all-lf deleted file mode 100644 index af6fcf6da1..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto/binary-all-lf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto/binary-mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto/binary-mixed-lf-cr deleted file mode 100644 index 203555c567..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto/binary-mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto/binary-mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto/binary-mixed-lf-cr-crlf deleted file mode 100644 index aaf083a9cb..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto/binary-mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto/few-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto/few-utf8-chars-crlf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto/few-utf8-chars-crlf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto/few-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto/few-utf8-chars-lf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto/few-utf8-chars-lf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto/many-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto/many-utf8-chars-crlf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto/many-utf8-chars-crlf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto/many-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto/many-utf8-chars-lf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto/many-utf8-chars-lf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto/mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto/mixed-lf-cr deleted file mode 100644 index d11e7ef63b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto/mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto/mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto/mixed-lf-cr-crlf deleted file mode 100644 index 417786fc35..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto/mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto/more-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto/more-crlf deleted file mode 100644 index e682c30774..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto/more-crlf +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto/more-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto/more-crlf-utf8bom deleted file mode 100644 index 2e1220cbb5..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto/more-crlf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto/more-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto/more-lf deleted file mode 100644 index 6da5b0c7e1..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto/more-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto/more-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto/more-lf-utf8bom deleted file mode 100644 index 3fa59c809c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto/more-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto/zero-byte b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false,text_auto/zero-byte deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false/all-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false/all-crlf deleted file mode 100644 index a9a2e8913c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false/all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false/all-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false/all-crlf-utf8bom deleted file mode 100644 index 0aa76e474d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false/all-crlf-utf8bom +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false/all-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false/all-lf deleted file mode 100644 index 799770d1cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false/all-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false/all-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false/all-lf-utf8bom deleted file mode 100644 index 7cce67e581..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false/all-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false/binary-all-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false/binary-all-crlf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false/binary-all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false/binary-all-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false/binary-all-lf deleted file mode 100644 index af6fcf6da1..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false/binary-all-lf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false/binary-mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false/binary-mixed-lf-cr deleted file mode 100644 index 203555c567..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false/binary-mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false/binary-mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false/binary-mixed-lf-cr-crlf deleted file mode 100644 index aaf083a9cb..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false/binary-mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false/few-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false/few-utf8-chars-crlf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false/few-utf8-chars-crlf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false/few-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false/few-utf8-chars-lf deleted file mode 100644 index f4d25b796d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false/few-utf8-chars-lf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false/many-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false/many-utf8-chars-crlf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false/many-utf8-chars-crlf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false/many-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false/many-utf8-chars-lf deleted file mode 100644 index 9a6c3533fe..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false/many-utf8-chars-lf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false/mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false/mixed-lf-cr deleted file mode 100644 index d11e7ef63b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false/mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false/mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false/mixed-lf-cr-crlf deleted file mode 100644 index 417786fc35..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false/mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false/more-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false/more-crlf deleted file mode 100644 index 0ff5a53f19..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false/more-crlf +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false/more-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false/more-crlf-utf8bom deleted file mode 100644 index ea030d3c6c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false/more-crlf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false/more-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false/more-lf deleted file mode 100644 index 04de00b358..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false/more-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false/more-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false/more-lf-utf8bom deleted file mode 100644 index dc88e3b917..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false/more-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false/zero-byte b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_false/zero-byte deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-crlf/all-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-crlf/all-crlf deleted file mode 100644 index a9a2e8913c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-crlf/all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-crlf/all-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-crlf/all-crlf-utf8bom deleted file mode 100644 index 0aa76e474d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-crlf/all-crlf-utf8bom +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-crlf/all-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-crlf/all-lf deleted file mode 100644 index 799770d1cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-crlf/all-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-crlf/all-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-crlf/all-lf-utf8bom deleted file mode 100644 index 7cce67e581..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-crlf/all-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-crlf/binary-all-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-crlf/binary-all-crlf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-crlf/binary-all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-crlf/binary-all-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-crlf/binary-all-lf deleted file mode 100644 index af6fcf6da1..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-crlf/binary-all-lf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-crlf/binary-mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-crlf/binary-mixed-lf-cr deleted file mode 100644 index 203555c567..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-crlf/binary-mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-crlf/binary-mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-crlf/binary-mixed-lf-cr-crlf deleted file mode 100644 index aaf083a9cb..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-crlf/binary-mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-crlf/few-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-crlf/few-utf8-chars-crlf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-crlf/few-utf8-chars-crlf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-crlf/few-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-crlf/few-utf8-chars-lf deleted file mode 100644 index f4d25b796d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-crlf/few-utf8-chars-lf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-crlf/many-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-crlf/many-utf8-chars-crlf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-crlf/many-utf8-chars-crlf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-crlf/many-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-crlf/many-utf8-chars-lf deleted file mode 100644 index 9a6c3533fe..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-crlf/many-utf8-chars-lf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-crlf/mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-crlf/mixed-lf-cr deleted file mode 100644 index d11e7ef63b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-crlf/mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-crlf/mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-crlf/mixed-lf-cr-crlf deleted file mode 100644 index 417786fc35..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-crlf/mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-crlf/more-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-crlf/more-crlf deleted file mode 100644 index 0ff5a53f19..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-crlf/more-crlf +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-crlf/more-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-crlf/more-crlf-utf8bom deleted file mode 100644 index ea030d3c6c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-crlf/more-crlf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-crlf/more-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-crlf/more-lf deleted file mode 100644 index 04de00b358..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-crlf/more-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-crlf/more-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-crlf/more-lf-utf8bom deleted file mode 100644 index dc88e3b917..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-crlf/more-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-crlf/zero-byte b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-crlf/zero-byte deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-text/all-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-text/all-crlf deleted file mode 100644 index a9a2e8913c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-text/all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-text/all-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-text/all-crlf-utf8bom deleted file mode 100644 index 0aa76e474d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-text/all-crlf-utf8bom +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-text/all-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-text/all-lf deleted file mode 100644 index 799770d1cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-text/all-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-text/all-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-text/all-lf-utf8bom deleted file mode 100644 index 7cce67e581..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-text/all-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-text/binary-all-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-text/binary-all-crlf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-text/binary-all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-text/binary-all-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-text/binary-all-lf deleted file mode 100644 index af6fcf6da1..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-text/binary-all-lf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-text/binary-mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-text/binary-mixed-lf-cr deleted file mode 100644 index 203555c567..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-text/binary-mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-text/binary-mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-text/binary-mixed-lf-cr-crlf deleted file mode 100644 index aaf083a9cb..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-text/binary-mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-text/few-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-text/few-utf8-chars-crlf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-text/few-utf8-chars-crlf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-text/few-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-text/few-utf8-chars-lf deleted file mode 100644 index f4d25b796d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-text/few-utf8-chars-lf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-text/many-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-text/many-utf8-chars-crlf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-text/many-utf8-chars-crlf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-text/many-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-text/many-utf8-chars-lf deleted file mode 100644 index 9a6c3533fe..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-text/many-utf8-chars-lf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-text/mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-text/mixed-lf-cr deleted file mode 100644 index d11e7ef63b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-text/mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-text/mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-text/mixed-lf-cr-crlf deleted file mode 100644 index 417786fc35..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-text/mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-text/more-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-text/more-crlf deleted file mode 100644 index 0ff5a53f19..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-text/more-crlf +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-text/more-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-text/more-crlf-utf8bom deleted file mode 100644 index ea030d3c6c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-text/more-crlf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-text/more-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-text/more-lf deleted file mode 100644 index 04de00b358..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-text/more-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-text/more-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-text/more-lf-utf8bom deleted file mode 100644 index dc88e3b917..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-text/more-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-text/zero-byte b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,-text/zero-byte deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,crlf/all-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,crlf/all-crlf deleted file mode 100644 index a9a2e8913c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,crlf/all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,crlf/all-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,crlf/all-crlf-utf8bom deleted file mode 100644 index 0aa76e474d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,crlf/all-crlf-utf8bom +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,crlf/all-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,crlf/all-lf deleted file mode 100644 index 799770d1cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,crlf/all-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,crlf/all-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,crlf/all-lf-utf8bom deleted file mode 100644 index 7cce67e581..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,crlf/all-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,crlf/binary-all-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,crlf/binary-all-crlf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,crlf/binary-all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,crlf/binary-all-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,crlf/binary-all-lf deleted file mode 100644 index af6fcf6da1..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,crlf/binary-all-lf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,crlf/binary-mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,crlf/binary-mixed-lf-cr deleted file mode 100644 index 203555c567..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,crlf/binary-mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,crlf/binary-mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,crlf/binary-mixed-lf-cr-crlf deleted file mode 100644 index aaf083a9cb..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,crlf/binary-mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,crlf/few-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,crlf/few-utf8-chars-crlf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,crlf/few-utf8-chars-crlf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,crlf/few-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,crlf/few-utf8-chars-lf deleted file mode 100644 index f4d25b796d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,crlf/few-utf8-chars-lf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,crlf/many-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,crlf/many-utf8-chars-crlf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,crlf/many-utf8-chars-crlf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,crlf/many-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,crlf/many-utf8-chars-lf deleted file mode 100644 index 9a6c3533fe..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,crlf/many-utf8-chars-lf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,crlf/mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,crlf/mixed-lf-cr deleted file mode 100644 index d11e7ef63b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,crlf/mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,crlf/mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,crlf/mixed-lf-cr-crlf deleted file mode 100644 index 417786fc35..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,crlf/mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,crlf/more-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,crlf/more-crlf deleted file mode 100644 index 0ff5a53f19..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,crlf/more-crlf +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,crlf/more-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,crlf/more-crlf-utf8bom deleted file mode 100644 index ea030d3c6c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,crlf/more-crlf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,crlf/more-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,crlf/more-lf deleted file mode 100644 index 04de00b358..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,crlf/more-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,crlf/more-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,crlf/more-lf-utf8bom deleted file mode 100644 index dc88e3b917..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,crlf/more-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,crlf/zero-byte b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,crlf/zero-byte deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_crlf/all-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_crlf/all-crlf deleted file mode 100644 index a9a2e8913c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_crlf/all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_crlf/all-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_crlf/all-crlf-utf8bom deleted file mode 100644 index 0aa76e474d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_crlf/all-crlf-utf8bom +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_crlf/all-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_crlf/all-lf deleted file mode 100644 index f557a02d86..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_crlf/all-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_crlf/all-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_crlf/all-lf-utf8bom deleted file mode 100644 index 381cfe630d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_crlf/all-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_crlf/binary-all-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_crlf/binary-all-crlf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_crlf/binary-all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_crlf/binary-all-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_crlf/binary-all-lf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_crlf/binary-all-lf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_crlf/binary-mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_crlf/binary-mixed-lf-cr deleted file mode 100644 index fd2abfa9d9..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_crlf/binary-mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_crlf/binary-mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_crlf/binary-mixed-lf-cr-crlf deleted file mode 100644 index fd2abfa9d9..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_crlf/binary-mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_crlf/few-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_crlf/few-utf8-chars-crlf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_crlf/few-utf8-chars-crlf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_crlf/few-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_crlf/few-utf8-chars-lf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_crlf/few-utf8-chars-lf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_crlf/many-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_crlf/many-utf8-chars-crlf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_crlf/many-utf8-chars-crlf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_crlf/many-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_crlf/many-utf8-chars-lf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_crlf/many-utf8-chars-lf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_crlf/mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_crlf/mixed-lf-cr deleted file mode 100644 index df8c0f680a..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_crlf/mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_crlf/mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_crlf/mixed-lf-cr-crlf deleted file mode 100644 index df8c0f680a..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_crlf/mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_crlf/more-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_crlf/more-crlf deleted file mode 100644 index e682c30774..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_crlf/more-crlf +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_crlf/more-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_crlf/more-crlf-utf8bom deleted file mode 100644 index 2e1220cbb5..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_crlf/more-crlf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_crlf/more-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_crlf/more-lf deleted file mode 100644 index 6da5b0c7e1..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_crlf/more-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_crlf/more-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_crlf/more-lf-utf8bom deleted file mode 100644 index 3fa59c809c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_crlf/more-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_crlf/zero-byte b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_crlf/zero-byte deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_lf/all-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_lf/all-crlf deleted file mode 100644 index a9a2e8913c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_lf/all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_lf/all-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_lf/all-crlf-utf8bom deleted file mode 100644 index 0aa76e474d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_lf/all-crlf-utf8bom +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_lf/all-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_lf/all-lf deleted file mode 100644 index 799770d1cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_lf/all-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_lf/all-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_lf/all-lf-utf8bom deleted file mode 100644 index 7cce67e581..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_lf/all-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_lf/binary-all-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_lf/binary-all-crlf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_lf/binary-all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_lf/binary-all-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_lf/binary-all-lf deleted file mode 100644 index af6fcf6da1..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_lf/binary-all-lf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_lf/binary-mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_lf/binary-mixed-lf-cr deleted file mode 100644 index 203555c567..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_lf/binary-mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_lf/binary-mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_lf/binary-mixed-lf-cr-crlf deleted file mode 100644 index aaf083a9cb..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_lf/binary-mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_lf/few-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_lf/few-utf8-chars-crlf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_lf/few-utf8-chars-crlf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_lf/few-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_lf/few-utf8-chars-lf deleted file mode 100644 index f4d25b796d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_lf/few-utf8-chars-lf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_lf/many-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_lf/many-utf8-chars-crlf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_lf/many-utf8-chars-crlf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_lf/many-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_lf/many-utf8-chars-lf deleted file mode 100644 index 9a6c3533fe..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_lf/many-utf8-chars-lf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_lf/mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_lf/mixed-lf-cr deleted file mode 100644 index d11e7ef63b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_lf/mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_lf/mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_lf/mixed-lf-cr-crlf deleted file mode 100644 index 417786fc35..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_lf/mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_lf/more-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_lf/more-crlf deleted file mode 100644 index 0ff5a53f19..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_lf/more-crlf +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_lf/more-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_lf/more-crlf-utf8bom deleted file mode 100644 index ea030d3c6c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_lf/more-crlf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_lf/more-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_lf/more-lf deleted file mode 100644 index 04de00b358..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_lf/more-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_lf/more-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_lf/more-lf-utf8bom deleted file mode 100644 index dc88e3b917..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_lf/more-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_lf/zero-byte b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,eol_lf/zero-byte deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_crlf/all-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_crlf/all-crlf deleted file mode 100644 index a9a2e8913c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_crlf/all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_crlf/all-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_crlf/all-crlf-utf8bom deleted file mode 100644 index 0aa76e474d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_crlf/all-crlf-utf8bom +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_crlf/all-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_crlf/all-lf deleted file mode 100644 index f557a02d86..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_crlf/all-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_crlf/all-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_crlf/all-lf-utf8bom deleted file mode 100644 index 381cfe630d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_crlf/all-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_crlf/binary-all-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_crlf/binary-all-crlf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_crlf/binary-all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_crlf/binary-all-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_crlf/binary-all-lf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_crlf/binary-all-lf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_crlf/binary-mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_crlf/binary-mixed-lf-cr deleted file mode 100644 index fd2abfa9d9..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_crlf/binary-mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_crlf/binary-mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_crlf/binary-mixed-lf-cr-crlf deleted file mode 100644 index fd2abfa9d9..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_crlf/binary-mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_crlf/few-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_crlf/few-utf8-chars-crlf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_crlf/few-utf8-chars-crlf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_crlf/few-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_crlf/few-utf8-chars-lf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_crlf/few-utf8-chars-lf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_crlf/many-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_crlf/many-utf8-chars-crlf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_crlf/many-utf8-chars-crlf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_crlf/many-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_crlf/many-utf8-chars-lf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_crlf/many-utf8-chars-lf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_crlf/mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_crlf/mixed-lf-cr deleted file mode 100644 index df8c0f680a..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_crlf/mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_crlf/mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_crlf/mixed-lf-cr-crlf deleted file mode 100644 index df8c0f680a..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_crlf/mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_crlf/more-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_crlf/more-crlf deleted file mode 100644 index e682c30774..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_crlf/more-crlf +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_crlf/more-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_crlf/more-crlf-utf8bom deleted file mode 100644 index 2e1220cbb5..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_crlf/more-crlf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_crlf/more-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_crlf/more-lf deleted file mode 100644 index 6da5b0c7e1..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_crlf/more-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_crlf/more-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_crlf/more-lf-utf8bom deleted file mode 100644 index 3fa59c809c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_crlf/more-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_crlf/zero-byte b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_crlf/zero-byte deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_lf/all-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_lf/all-crlf deleted file mode 100644 index a9a2e8913c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_lf/all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_lf/all-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_lf/all-crlf-utf8bom deleted file mode 100644 index 0aa76e474d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_lf/all-crlf-utf8bom +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_lf/all-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_lf/all-lf deleted file mode 100644 index 799770d1cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_lf/all-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_lf/all-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_lf/all-lf-utf8bom deleted file mode 100644 index 7cce67e581..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_lf/all-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_lf/binary-all-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_lf/binary-all-crlf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_lf/binary-all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_lf/binary-all-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_lf/binary-all-lf deleted file mode 100644 index af6fcf6da1..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_lf/binary-all-lf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_lf/binary-mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_lf/binary-mixed-lf-cr deleted file mode 100644 index 203555c567..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_lf/binary-mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_lf/binary-mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_lf/binary-mixed-lf-cr-crlf deleted file mode 100644 index aaf083a9cb..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_lf/binary-mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_lf/few-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_lf/few-utf8-chars-crlf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_lf/few-utf8-chars-crlf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_lf/few-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_lf/few-utf8-chars-lf deleted file mode 100644 index f4d25b796d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_lf/few-utf8-chars-lf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_lf/many-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_lf/many-utf8-chars-crlf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_lf/many-utf8-chars-crlf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_lf/many-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_lf/many-utf8-chars-lf deleted file mode 100644 index 9a6c3533fe..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_lf/many-utf8-chars-lf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_lf/mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_lf/mixed-lf-cr deleted file mode 100644 index d11e7ef63b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_lf/mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_lf/mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_lf/mixed-lf-cr-crlf deleted file mode 100644 index 417786fc35..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_lf/mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_lf/more-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_lf/more-crlf deleted file mode 100644 index 0ff5a53f19..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_lf/more-crlf +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_lf/more-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_lf/more-crlf-utf8bom deleted file mode 100644 index ea030d3c6c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_lf/more-crlf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_lf/more-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_lf/more-lf deleted file mode 100644 index 04de00b358..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_lf/more-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_lf/more-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_lf/more-lf-utf8bom deleted file mode 100644 index dc88e3b917..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_lf/more-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_lf/zero-byte b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text,eol_lf/zero-byte deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text/all-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text/all-crlf deleted file mode 100644 index a9a2e8913c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text/all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text/all-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text/all-crlf-utf8bom deleted file mode 100644 index 0aa76e474d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text/all-crlf-utf8bom +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text/all-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text/all-lf deleted file mode 100644 index 799770d1cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text/all-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text/all-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text/all-lf-utf8bom deleted file mode 100644 index 7cce67e581..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text/all-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text/binary-all-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text/binary-all-crlf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text/binary-all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text/binary-all-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text/binary-all-lf deleted file mode 100644 index af6fcf6da1..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text/binary-all-lf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text/binary-mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text/binary-mixed-lf-cr deleted file mode 100644 index 203555c567..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text/binary-mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text/binary-mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text/binary-mixed-lf-cr-crlf deleted file mode 100644 index aaf083a9cb..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text/binary-mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text/few-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text/few-utf8-chars-crlf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text/few-utf8-chars-crlf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text/few-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text/few-utf8-chars-lf deleted file mode 100644 index f4d25b796d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text/few-utf8-chars-lf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text/many-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text/many-utf8-chars-crlf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text/many-utf8-chars-crlf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text/many-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text/many-utf8-chars-lf deleted file mode 100644 index 9a6c3533fe..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text/many-utf8-chars-lf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text/mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text/mixed-lf-cr deleted file mode 100644 index d11e7ef63b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text/mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text/mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text/mixed-lf-cr-crlf deleted file mode 100644 index 417786fc35..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text/mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text/more-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text/more-crlf deleted file mode 100644 index 0ff5a53f19..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text/more-crlf +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text/more-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text/more-crlf-utf8bom deleted file mode 100644 index ea030d3c6c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text/more-crlf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text/more-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text/more-lf deleted file mode 100644 index 04de00b358..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text/more-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text/more-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text/more-lf-utf8bom deleted file mode 100644 index dc88e3b917..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text/more-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text/zero-byte b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text/zero-byte deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/all-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/all-crlf deleted file mode 100644 index a9a2e8913c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/all-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/all-crlf-utf8bom deleted file mode 100644 index 0aa76e474d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/all-crlf-utf8bom +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/all-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/all-lf deleted file mode 100644 index f557a02d86..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/all-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/all-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/all-lf-utf8bom deleted file mode 100644 index 381cfe630d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/all-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/binary-all-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/binary-all-crlf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/binary-all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/binary-all-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/binary-all-lf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/binary-all-lf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/binary-mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/binary-mixed-lf-cr deleted file mode 100644 index fd2abfa9d9..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/binary-mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/binary-mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/binary-mixed-lf-cr-crlf deleted file mode 100644 index fd2abfa9d9..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/binary-mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/few-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/few-utf8-chars-crlf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/few-utf8-chars-crlf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/few-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/few-utf8-chars-lf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/few-utf8-chars-lf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/many-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/many-utf8-chars-crlf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/many-utf8-chars-crlf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/many-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/many-utf8-chars-lf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/many-utf8-chars-lf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/mixed-lf-cr deleted file mode 100644 index df8c0f680a..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/mixed-lf-cr-crlf deleted file mode 100644 index df8c0f680a..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/more-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/more-crlf deleted file mode 100644 index e682c30774..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/more-crlf +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/more-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/more-crlf-utf8bom deleted file mode 100644 index 2e1220cbb5..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/more-crlf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/more-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/more-lf deleted file mode 100644 index 6da5b0c7e1..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/more-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/more-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/more-lf-utf8bom deleted file mode 100644 index 3fa59c809c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/more-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/zero-byte b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_crlf/zero-byte deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_lf/all-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_lf/all-crlf deleted file mode 100644 index a9a2e8913c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_lf/all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_lf/all-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_lf/all-crlf-utf8bom deleted file mode 100644 index 0aa76e474d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_lf/all-crlf-utf8bom +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_lf/all-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_lf/all-lf deleted file mode 100644 index 799770d1cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_lf/all-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_lf/all-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_lf/all-lf-utf8bom deleted file mode 100644 index 7cce67e581..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_lf/all-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_lf/binary-all-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_lf/binary-all-crlf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_lf/binary-all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_lf/binary-all-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_lf/binary-all-lf deleted file mode 100644 index af6fcf6da1..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_lf/binary-all-lf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_lf/binary-mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_lf/binary-mixed-lf-cr deleted file mode 100644 index 203555c567..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_lf/binary-mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_lf/binary-mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_lf/binary-mixed-lf-cr-crlf deleted file mode 100644 index aaf083a9cb..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_lf/binary-mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_lf/few-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_lf/few-utf8-chars-crlf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_lf/few-utf8-chars-crlf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_lf/few-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_lf/few-utf8-chars-lf deleted file mode 100644 index f4d25b796d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_lf/few-utf8-chars-lf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_lf/many-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_lf/many-utf8-chars-crlf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_lf/many-utf8-chars-crlf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_lf/many-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_lf/many-utf8-chars-lf deleted file mode 100644 index 9a6c3533fe..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_lf/many-utf8-chars-lf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_lf/mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_lf/mixed-lf-cr deleted file mode 100644 index d11e7ef63b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_lf/mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_lf/mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_lf/mixed-lf-cr-crlf deleted file mode 100644 index 417786fc35..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_lf/mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_lf/more-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_lf/more-crlf deleted file mode 100644 index 0ff5a53f19..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_lf/more-crlf +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_lf/more-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_lf/more-crlf-utf8bom deleted file mode 100644 index ea030d3c6c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_lf/more-crlf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_lf/more-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_lf/more-lf deleted file mode 100644 index 04de00b358..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_lf/more-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_lf/more-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_lf/more-lf-utf8bom deleted file mode 100644 index dc88e3b917..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_lf/more-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_lf/zero-byte b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto,eol_lf/zero-byte deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto/all-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto/all-crlf deleted file mode 100644 index a9a2e8913c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto/all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto/all-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto/all-crlf-utf8bom deleted file mode 100644 index 0aa76e474d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto/all-crlf-utf8bom +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto/all-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto/all-lf deleted file mode 100644 index 799770d1cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto/all-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto/all-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto/all-lf-utf8bom deleted file mode 100644 index 7cce67e581..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto/all-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto/binary-all-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto/binary-all-crlf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto/binary-all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto/binary-all-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto/binary-all-lf deleted file mode 100644 index af6fcf6da1..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto/binary-all-lf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto/binary-mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto/binary-mixed-lf-cr deleted file mode 100644 index 203555c567..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto/binary-mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto/binary-mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto/binary-mixed-lf-cr-crlf deleted file mode 100644 index aaf083a9cb..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto/binary-mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto/few-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto/few-utf8-chars-crlf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto/few-utf8-chars-crlf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto/few-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto/few-utf8-chars-lf deleted file mode 100644 index f4d25b796d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto/few-utf8-chars-lf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto/many-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto/many-utf8-chars-crlf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto/many-utf8-chars-crlf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto/many-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto/many-utf8-chars-lf deleted file mode 100644 index 9a6c3533fe..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto/many-utf8-chars-lf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto/mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto/mixed-lf-cr deleted file mode 100644 index d11e7ef63b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto/mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto/mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto/mixed-lf-cr-crlf deleted file mode 100644 index 417786fc35..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto/mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto/more-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto/more-crlf deleted file mode 100644 index 0ff5a53f19..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto/more-crlf +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto/more-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto/more-crlf-utf8bom deleted file mode 100644 index ea030d3c6c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto/more-crlf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto/more-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto/more-lf deleted file mode 100644 index 04de00b358..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto/more-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto/more-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto/more-lf-utf8bom deleted file mode 100644 index dc88e3b917..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto/more-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto/zero-byte b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input,text_auto/zero-byte deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input/all-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input/all-crlf deleted file mode 100644 index a9a2e8913c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input/all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input/all-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input/all-crlf-utf8bom deleted file mode 100644 index 0aa76e474d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input/all-crlf-utf8bom +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input/all-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input/all-lf deleted file mode 100644 index 799770d1cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input/all-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input/all-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input/all-lf-utf8bom deleted file mode 100644 index 7cce67e581..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input/all-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input/binary-all-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input/binary-all-crlf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input/binary-all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input/binary-all-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input/binary-all-lf deleted file mode 100644 index af6fcf6da1..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input/binary-all-lf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input/binary-mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input/binary-mixed-lf-cr deleted file mode 100644 index 203555c567..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input/binary-mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input/binary-mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input/binary-mixed-lf-cr-crlf deleted file mode 100644 index aaf083a9cb..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input/binary-mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input/few-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input/few-utf8-chars-crlf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input/few-utf8-chars-crlf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input/few-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input/few-utf8-chars-lf deleted file mode 100644 index f4d25b796d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input/few-utf8-chars-lf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input/many-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input/many-utf8-chars-crlf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input/many-utf8-chars-crlf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input/many-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input/many-utf8-chars-lf deleted file mode 100644 index 9a6c3533fe..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input/many-utf8-chars-lf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input/mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input/mixed-lf-cr deleted file mode 100644 index d11e7ef63b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input/mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input/mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input/mixed-lf-cr-crlf deleted file mode 100644 index 417786fc35..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input/mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input/more-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input/more-crlf deleted file mode 100644 index 0ff5a53f19..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input/more-crlf +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input/more-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input/more-crlf-utf8bom deleted file mode 100644 index ea030d3c6c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input/more-crlf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input/more-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input/more-lf deleted file mode 100644 index 04de00b358..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input/more-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input/more-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input/more-lf-utf8bom deleted file mode 100644 index dc88e3b917..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input/more-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input/zero-byte b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_input/zero-byte deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-crlf/all-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-crlf/all-crlf deleted file mode 100644 index a9a2e8913c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-crlf/all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-crlf/all-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-crlf/all-crlf-utf8bom deleted file mode 100644 index 0aa76e474d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-crlf/all-crlf-utf8bom +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-crlf/all-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-crlf/all-lf deleted file mode 100644 index 799770d1cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-crlf/all-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-crlf/all-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-crlf/all-lf-utf8bom deleted file mode 100644 index 7cce67e581..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-crlf/all-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-crlf/binary-all-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-crlf/binary-all-crlf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-crlf/binary-all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-crlf/binary-all-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-crlf/binary-all-lf deleted file mode 100644 index af6fcf6da1..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-crlf/binary-all-lf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-crlf/binary-mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-crlf/binary-mixed-lf-cr deleted file mode 100644 index 203555c567..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-crlf/binary-mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-crlf/binary-mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-crlf/binary-mixed-lf-cr-crlf deleted file mode 100644 index aaf083a9cb..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-crlf/binary-mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-crlf/few-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-crlf/few-utf8-chars-crlf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-crlf/few-utf8-chars-crlf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-crlf/few-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-crlf/few-utf8-chars-lf deleted file mode 100644 index f4d25b796d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-crlf/few-utf8-chars-lf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-crlf/many-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-crlf/many-utf8-chars-crlf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-crlf/many-utf8-chars-crlf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-crlf/many-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-crlf/many-utf8-chars-lf deleted file mode 100644 index 9a6c3533fe..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-crlf/many-utf8-chars-lf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-crlf/mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-crlf/mixed-lf-cr deleted file mode 100644 index d11e7ef63b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-crlf/mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-crlf/mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-crlf/mixed-lf-cr-crlf deleted file mode 100644 index 417786fc35..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-crlf/mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-crlf/more-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-crlf/more-crlf deleted file mode 100644 index 0ff5a53f19..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-crlf/more-crlf +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-crlf/more-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-crlf/more-crlf-utf8bom deleted file mode 100644 index ea030d3c6c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-crlf/more-crlf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-crlf/more-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-crlf/more-lf deleted file mode 100644 index 04de00b358..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-crlf/more-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-crlf/more-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-crlf/more-lf-utf8bom deleted file mode 100644 index dc88e3b917..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-crlf/more-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-crlf/zero-byte b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-crlf/zero-byte deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-text/all-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-text/all-crlf deleted file mode 100644 index a9a2e8913c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-text/all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-text/all-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-text/all-crlf-utf8bom deleted file mode 100644 index 0aa76e474d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-text/all-crlf-utf8bom +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-text/all-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-text/all-lf deleted file mode 100644 index 799770d1cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-text/all-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-text/all-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-text/all-lf-utf8bom deleted file mode 100644 index 7cce67e581..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-text/all-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-text/binary-all-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-text/binary-all-crlf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-text/binary-all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-text/binary-all-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-text/binary-all-lf deleted file mode 100644 index af6fcf6da1..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-text/binary-all-lf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-text/binary-mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-text/binary-mixed-lf-cr deleted file mode 100644 index 203555c567..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-text/binary-mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-text/binary-mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-text/binary-mixed-lf-cr-crlf deleted file mode 100644 index aaf083a9cb..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-text/binary-mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-text/few-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-text/few-utf8-chars-crlf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-text/few-utf8-chars-crlf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-text/few-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-text/few-utf8-chars-lf deleted file mode 100644 index f4d25b796d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-text/few-utf8-chars-lf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-text/many-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-text/many-utf8-chars-crlf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-text/many-utf8-chars-crlf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-text/many-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-text/many-utf8-chars-lf deleted file mode 100644 index 9a6c3533fe..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-text/many-utf8-chars-lf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-text/mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-text/mixed-lf-cr deleted file mode 100644 index d11e7ef63b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-text/mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-text/mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-text/mixed-lf-cr-crlf deleted file mode 100644 index 417786fc35..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-text/mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-text/more-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-text/more-crlf deleted file mode 100644 index 0ff5a53f19..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-text/more-crlf +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-text/more-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-text/more-crlf-utf8bom deleted file mode 100644 index ea030d3c6c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-text/more-crlf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-text/more-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-text/more-lf deleted file mode 100644 index 04de00b358..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-text/more-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-text/more-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-text/more-lf-utf8bom deleted file mode 100644 index dc88e3b917..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-text/more-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-text/zero-byte b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,-text/zero-byte deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,crlf/all-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,crlf/all-crlf deleted file mode 100644 index a9a2e8913c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,crlf/all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,crlf/all-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,crlf/all-crlf-utf8bom deleted file mode 100644 index 0aa76e474d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,crlf/all-crlf-utf8bom +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,crlf/all-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,crlf/all-lf deleted file mode 100644 index f557a02d86..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,crlf/all-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,crlf/all-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,crlf/all-lf-utf8bom deleted file mode 100644 index 381cfe630d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,crlf/all-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,crlf/binary-all-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,crlf/binary-all-crlf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,crlf/binary-all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,crlf/binary-all-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,crlf/binary-all-lf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,crlf/binary-all-lf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,crlf/binary-mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,crlf/binary-mixed-lf-cr deleted file mode 100644 index fd2abfa9d9..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,crlf/binary-mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,crlf/binary-mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,crlf/binary-mixed-lf-cr-crlf deleted file mode 100644 index fd2abfa9d9..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,crlf/binary-mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,crlf/few-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,crlf/few-utf8-chars-crlf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,crlf/few-utf8-chars-crlf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,crlf/few-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,crlf/few-utf8-chars-lf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,crlf/few-utf8-chars-lf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,crlf/many-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,crlf/many-utf8-chars-crlf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,crlf/many-utf8-chars-crlf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,crlf/many-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,crlf/many-utf8-chars-lf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,crlf/many-utf8-chars-lf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,crlf/mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,crlf/mixed-lf-cr deleted file mode 100644 index df8c0f680a..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,crlf/mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,crlf/mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,crlf/mixed-lf-cr-crlf deleted file mode 100644 index df8c0f680a..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,crlf/mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,crlf/more-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,crlf/more-crlf deleted file mode 100644 index e682c30774..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,crlf/more-crlf +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,crlf/more-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,crlf/more-crlf-utf8bom deleted file mode 100644 index 2e1220cbb5..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,crlf/more-crlf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,crlf/more-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,crlf/more-lf deleted file mode 100644 index 6da5b0c7e1..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,crlf/more-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,crlf/more-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,crlf/more-lf-utf8bom deleted file mode 100644 index 3fa59c809c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,crlf/more-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,crlf/zero-byte b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,crlf/zero-byte deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_crlf/all-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_crlf/all-crlf deleted file mode 100644 index a9a2e8913c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_crlf/all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_crlf/all-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_crlf/all-crlf-utf8bom deleted file mode 100644 index 0aa76e474d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_crlf/all-crlf-utf8bom +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_crlf/all-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_crlf/all-lf deleted file mode 100644 index f557a02d86..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_crlf/all-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_crlf/all-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_crlf/all-lf-utf8bom deleted file mode 100644 index 381cfe630d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_crlf/all-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_crlf/binary-all-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_crlf/binary-all-crlf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_crlf/binary-all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_crlf/binary-all-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_crlf/binary-all-lf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_crlf/binary-all-lf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_crlf/binary-mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_crlf/binary-mixed-lf-cr deleted file mode 100644 index fd2abfa9d9..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_crlf/binary-mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_crlf/binary-mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_crlf/binary-mixed-lf-cr-crlf deleted file mode 100644 index fd2abfa9d9..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_crlf/binary-mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_crlf/few-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_crlf/few-utf8-chars-crlf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_crlf/few-utf8-chars-crlf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_crlf/few-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_crlf/few-utf8-chars-lf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_crlf/few-utf8-chars-lf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_crlf/many-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_crlf/many-utf8-chars-crlf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_crlf/many-utf8-chars-crlf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_crlf/many-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_crlf/many-utf8-chars-lf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_crlf/many-utf8-chars-lf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_crlf/mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_crlf/mixed-lf-cr deleted file mode 100644 index df8c0f680a..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_crlf/mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_crlf/mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_crlf/mixed-lf-cr-crlf deleted file mode 100644 index df8c0f680a..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_crlf/mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_crlf/more-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_crlf/more-crlf deleted file mode 100644 index e682c30774..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_crlf/more-crlf +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_crlf/more-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_crlf/more-crlf-utf8bom deleted file mode 100644 index 2e1220cbb5..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_crlf/more-crlf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_crlf/more-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_crlf/more-lf deleted file mode 100644 index 6da5b0c7e1..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_crlf/more-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_crlf/more-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_crlf/more-lf-utf8bom deleted file mode 100644 index 3fa59c809c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_crlf/more-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_crlf/zero-byte b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_crlf/zero-byte deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_lf/all-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_lf/all-crlf deleted file mode 100644 index a9a2e8913c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_lf/all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_lf/all-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_lf/all-crlf-utf8bom deleted file mode 100644 index 0aa76e474d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_lf/all-crlf-utf8bom +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_lf/all-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_lf/all-lf deleted file mode 100644 index 799770d1cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_lf/all-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_lf/all-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_lf/all-lf-utf8bom deleted file mode 100644 index 7cce67e581..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_lf/all-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_lf/binary-all-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_lf/binary-all-crlf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_lf/binary-all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_lf/binary-all-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_lf/binary-all-lf deleted file mode 100644 index af6fcf6da1..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_lf/binary-all-lf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_lf/binary-mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_lf/binary-mixed-lf-cr deleted file mode 100644 index 203555c567..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_lf/binary-mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_lf/binary-mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_lf/binary-mixed-lf-cr-crlf deleted file mode 100644 index aaf083a9cb..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_lf/binary-mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_lf/few-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_lf/few-utf8-chars-crlf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_lf/few-utf8-chars-crlf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_lf/few-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_lf/few-utf8-chars-lf deleted file mode 100644 index f4d25b796d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_lf/few-utf8-chars-lf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_lf/many-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_lf/many-utf8-chars-crlf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_lf/many-utf8-chars-crlf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_lf/many-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_lf/many-utf8-chars-lf deleted file mode 100644 index 9a6c3533fe..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_lf/many-utf8-chars-lf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_lf/mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_lf/mixed-lf-cr deleted file mode 100644 index d11e7ef63b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_lf/mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_lf/mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_lf/mixed-lf-cr-crlf deleted file mode 100644 index 417786fc35..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_lf/mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_lf/more-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_lf/more-crlf deleted file mode 100644 index 0ff5a53f19..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_lf/more-crlf +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_lf/more-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_lf/more-crlf-utf8bom deleted file mode 100644 index ea030d3c6c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_lf/more-crlf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_lf/more-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_lf/more-lf deleted file mode 100644 index 04de00b358..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_lf/more-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_lf/more-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_lf/more-lf-utf8bom deleted file mode 100644 index dc88e3b917..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_lf/more-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_lf/zero-byte b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,eol_lf/zero-byte deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_crlf/all-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_crlf/all-crlf deleted file mode 100644 index a9a2e8913c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_crlf/all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_crlf/all-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_crlf/all-crlf-utf8bom deleted file mode 100644 index 0aa76e474d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_crlf/all-crlf-utf8bom +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_crlf/all-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_crlf/all-lf deleted file mode 100644 index f557a02d86..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_crlf/all-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_crlf/all-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_crlf/all-lf-utf8bom deleted file mode 100644 index 381cfe630d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_crlf/all-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_crlf/binary-all-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_crlf/binary-all-crlf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_crlf/binary-all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_crlf/binary-all-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_crlf/binary-all-lf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_crlf/binary-all-lf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_crlf/binary-mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_crlf/binary-mixed-lf-cr deleted file mode 100644 index fd2abfa9d9..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_crlf/binary-mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_crlf/binary-mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_crlf/binary-mixed-lf-cr-crlf deleted file mode 100644 index fd2abfa9d9..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_crlf/binary-mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_crlf/few-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_crlf/few-utf8-chars-crlf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_crlf/few-utf8-chars-crlf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_crlf/few-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_crlf/few-utf8-chars-lf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_crlf/few-utf8-chars-lf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_crlf/many-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_crlf/many-utf8-chars-crlf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_crlf/many-utf8-chars-crlf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_crlf/many-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_crlf/many-utf8-chars-lf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_crlf/many-utf8-chars-lf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_crlf/mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_crlf/mixed-lf-cr deleted file mode 100644 index df8c0f680a..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_crlf/mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_crlf/mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_crlf/mixed-lf-cr-crlf deleted file mode 100644 index df8c0f680a..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_crlf/mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_crlf/more-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_crlf/more-crlf deleted file mode 100644 index e682c30774..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_crlf/more-crlf +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_crlf/more-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_crlf/more-crlf-utf8bom deleted file mode 100644 index 2e1220cbb5..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_crlf/more-crlf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_crlf/more-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_crlf/more-lf deleted file mode 100644 index 6da5b0c7e1..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_crlf/more-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_crlf/more-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_crlf/more-lf-utf8bom deleted file mode 100644 index 3fa59c809c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_crlf/more-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_crlf/zero-byte b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_crlf/zero-byte deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_lf/all-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_lf/all-crlf deleted file mode 100644 index a9a2e8913c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_lf/all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_lf/all-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_lf/all-crlf-utf8bom deleted file mode 100644 index 0aa76e474d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_lf/all-crlf-utf8bom +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_lf/all-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_lf/all-lf deleted file mode 100644 index 799770d1cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_lf/all-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_lf/all-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_lf/all-lf-utf8bom deleted file mode 100644 index 7cce67e581..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_lf/all-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_lf/binary-all-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_lf/binary-all-crlf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_lf/binary-all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_lf/binary-all-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_lf/binary-all-lf deleted file mode 100644 index af6fcf6da1..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_lf/binary-all-lf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_lf/binary-mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_lf/binary-mixed-lf-cr deleted file mode 100644 index 203555c567..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_lf/binary-mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_lf/binary-mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_lf/binary-mixed-lf-cr-crlf deleted file mode 100644 index aaf083a9cb..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_lf/binary-mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_lf/few-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_lf/few-utf8-chars-crlf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_lf/few-utf8-chars-crlf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_lf/few-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_lf/few-utf8-chars-lf deleted file mode 100644 index f4d25b796d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_lf/few-utf8-chars-lf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_lf/many-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_lf/many-utf8-chars-crlf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_lf/many-utf8-chars-crlf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_lf/many-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_lf/many-utf8-chars-lf deleted file mode 100644 index 9a6c3533fe..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_lf/many-utf8-chars-lf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_lf/mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_lf/mixed-lf-cr deleted file mode 100644 index d11e7ef63b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_lf/mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_lf/mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_lf/mixed-lf-cr-crlf deleted file mode 100644 index 417786fc35..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_lf/mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_lf/more-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_lf/more-crlf deleted file mode 100644 index 0ff5a53f19..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_lf/more-crlf +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_lf/more-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_lf/more-crlf-utf8bom deleted file mode 100644 index ea030d3c6c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_lf/more-crlf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_lf/more-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_lf/more-lf deleted file mode 100644 index 04de00b358..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_lf/more-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_lf/more-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_lf/more-lf-utf8bom deleted file mode 100644 index dc88e3b917..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_lf/more-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_lf/zero-byte b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text,eol_lf/zero-byte deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text/all-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text/all-crlf deleted file mode 100644 index a9a2e8913c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text/all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text/all-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text/all-crlf-utf8bom deleted file mode 100644 index 0aa76e474d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text/all-crlf-utf8bom +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text/all-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text/all-lf deleted file mode 100644 index f557a02d86..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text/all-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text/all-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text/all-lf-utf8bom deleted file mode 100644 index 381cfe630d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text/all-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text/binary-all-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text/binary-all-crlf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text/binary-all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text/binary-all-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text/binary-all-lf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text/binary-all-lf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text/binary-mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text/binary-mixed-lf-cr deleted file mode 100644 index fd2abfa9d9..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text/binary-mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text/binary-mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text/binary-mixed-lf-cr-crlf deleted file mode 100644 index fd2abfa9d9..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text/binary-mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text/few-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text/few-utf8-chars-crlf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text/few-utf8-chars-crlf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text/few-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text/few-utf8-chars-lf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text/few-utf8-chars-lf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text/many-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text/many-utf8-chars-crlf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text/many-utf8-chars-crlf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text/many-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text/many-utf8-chars-lf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text/many-utf8-chars-lf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text/mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text/mixed-lf-cr deleted file mode 100644 index df8c0f680a..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text/mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text/mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text/mixed-lf-cr-crlf deleted file mode 100644 index df8c0f680a..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text/mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text/more-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text/more-crlf deleted file mode 100644 index e682c30774..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text/more-crlf +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text/more-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text/more-crlf-utf8bom deleted file mode 100644 index 2e1220cbb5..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text/more-crlf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text/more-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text/more-lf deleted file mode 100644 index 6da5b0c7e1..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text/more-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text/more-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text/more-lf-utf8bom deleted file mode 100644 index 3fa59c809c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text/more-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text/zero-byte b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text/zero-byte deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/all-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/all-crlf deleted file mode 100644 index a9a2e8913c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/all-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/all-crlf-utf8bom deleted file mode 100644 index 0aa76e474d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/all-crlf-utf8bom +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/all-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/all-lf deleted file mode 100644 index f557a02d86..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/all-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/all-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/all-lf-utf8bom deleted file mode 100644 index 381cfe630d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/all-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/binary-all-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/binary-all-crlf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/binary-all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/binary-all-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/binary-all-lf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/binary-all-lf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/binary-mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/binary-mixed-lf-cr deleted file mode 100644 index fd2abfa9d9..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/binary-mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/binary-mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/binary-mixed-lf-cr-crlf deleted file mode 100644 index fd2abfa9d9..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/binary-mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/few-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/few-utf8-chars-crlf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/few-utf8-chars-crlf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/few-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/few-utf8-chars-lf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/few-utf8-chars-lf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/many-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/many-utf8-chars-crlf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/many-utf8-chars-crlf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/many-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/many-utf8-chars-lf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/many-utf8-chars-lf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/mixed-lf-cr deleted file mode 100644 index df8c0f680a..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/mixed-lf-cr-crlf deleted file mode 100644 index df8c0f680a..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/more-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/more-crlf deleted file mode 100644 index e682c30774..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/more-crlf +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/more-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/more-crlf-utf8bom deleted file mode 100644 index 2e1220cbb5..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/more-crlf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/more-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/more-lf deleted file mode 100644 index 6da5b0c7e1..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/more-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/more-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/more-lf-utf8bom deleted file mode 100644 index 3fa59c809c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/more-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/zero-byte b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_crlf/zero-byte deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_lf/all-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_lf/all-crlf deleted file mode 100644 index a9a2e8913c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_lf/all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_lf/all-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_lf/all-crlf-utf8bom deleted file mode 100644 index 0aa76e474d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_lf/all-crlf-utf8bom +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_lf/all-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_lf/all-lf deleted file mode 100644 index 799770d1cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_lf/all-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_lf/all-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_lf/all-lf-utf8bom deleted file mode 100644 index 7cce67e581..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_lf/all-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_lf/binary-all-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_lf/binary-all-crlf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_lf/binary-all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_lf/binary-all-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_lf/binary-all-lf deleted file mode 100644 index af6fcf6da1..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_lf/binary-all-lf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_lf/binary-mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_lf/binary-mixed-lf-cr deleted file mode 100644 index 203555c567..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_lf/binary-mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_lf/binary-mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_lf/binary-mixed-lf-cr-crlf deleted file mode 100644 index aaf083a9cb..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_lf/binary-mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_lf/few-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_lf/few-utf8-chars-crlf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_lf/few-utf8-chars-crlf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_lf/few-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_lf/few-utf8-chars-lf deleted file mode 100644 index f4d25b796d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_lf/few-utf8-chars-lf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_lf/many-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_lf/many-utf8-chars-crlf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_lf/many-utf8-chars-crlf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_lf/many-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_lf/many-utf8-chars-lf deleted file mode 100644 index 9a6c3533fe..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_lf/many-utf8-chars-lf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_lf/mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_lf/mixed-lf-cr deleted file mode 100644 index d11e7ef63b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_lf/mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_lf/mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_lf/mixed-lf-cr-crlf deleted file mode 100644 index 417786fc35..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_lf/mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_lf/more-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_lf/more-crlf deleted file mode 100644 index 0ff5a53f19..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_lf/more-crlf +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_lf/more-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_lf/more-crlf-utf8bom deleted file mode 100644 index ea030d3c6c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_lf/more-crlf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_lf/more-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_lf/more-lf deleted file mode 100644 index 04de00b358..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_lf/more-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_lf/more-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_lf/more-lf-utf8bom deleted file mode 100644 index dc88e3b917..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_lf/more-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_lf/zero-byte b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto,eol_lf/zero-byte deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto/all-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto/all-crlf deleted file mode 100644 index a9a2e8913c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto/all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto/all-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto/all-crlf-utf8bom deleted file mode 100644 index 0aa76e474d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto/all-crlf-utf8bom +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto/all-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto/all-lf deleted file mode 100644 index f557a02d86..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto/all-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto/all-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto/all-lf-utf8bom deleted file mode 100644 index 381cfe630d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto/all-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto/binary-all-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto/binary-all-crlf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto/binary-all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto/binary-all-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto/binary-all-lf deleted file mode 100644 index af6fcf6da1..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto/binary-all-lf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto/binary-mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto/binary-mixed-lf-cr deleted file mode 100644 index 203555c567..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto/binary-mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto/binary-mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto/binary-mixed-lf-cr-crlf deleted file mode 100644 index aaf083a9cb..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto/binary-mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto/few-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto/few-utf8-chars-crlf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto/few-utf8-chars-crlf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto/few-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto/few-utf8-chars-lf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto/few-utf8-chars-lf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto/many-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto/many-utf8-chars-crlf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto/many-utf8-chars-crlf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto/many-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto/many-utf8-chars-lf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto/many-utf8-chars-lf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto/mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto/mixed-lf-cr deleted file mode 100644 index d11e7ef63b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto/mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto/mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto/mixed-lf-cr-crlf deleted file mode 100644 index 417786fc35..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto/mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto/more-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto/more-crlf deleted file mode 100644 index e682c30774..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto/more-crlf +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto/more-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto/more-crlf-utf8bom deleted file mode 100644 index 2e1220cbb5..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto/more-crlf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto/more-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto/more-lf deleted file mode 100644 index 6da5b0c7e1..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto/more-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto/more-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto/more-lf-utf8bom deleted file mode 100644 index 3fa59c809c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto/more-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto/zero-byte b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true,text_auto/zero-byte deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true/all-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true/all-crlf deleted file mode 100644 index a9a2e8913c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true/all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true/all-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true/all-crlf-utf8bom deleted file mode 100644 index 0aa76e474d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true/all-crlf-utf8bom +++ /dev/null @@ -1,4 +0,0 @@ -crlf -crlf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true/all-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true/all-lf deleted file mode 100644 index f557a02d86..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true/all-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true/all-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true/all-lf-utf8bom deleted file mode 100644 index 381cfe630d..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true/all-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -lf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true/binary-all-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true/binary-all-crlf deleted file mode 100644 index 85340755cf..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true/binary-all-crlf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true/binary-all-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true/binary-all-lf deleted file mode 100644 index af6fcf6da1..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true/binary-all-lf +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true/binary-mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true/binary-mixed-lf-cr deleted file mode 100644 index 203555c567..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true/binary-mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true/binary-mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true/binary-mixed-lf-cr-crlf deleted file mode 100644 index aaf083a9cb..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true/binary-mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true/few-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true/few-utf8-chars-crlf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true/few-utf8-chars-crlf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true/few-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true/few-utf8-chars-lf deleted file mode 100644 index 0e05288882..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true/few-utf8-chars-lf +++ /dev/null @@ -1,22 +0,0 @@ -âš˝The rest is ASCII01. -The rest is ASCII02. -The rest is ASCII03. -The rest is ASCII04. -The rest is ASCII05. -The rest is ASCII06. -The rest is ASCII07. -The rest is ASCII08. -The rest is ASCII09. -The rest is ASCII10. -The rest is ASCII11. -The rest is ASCII12. -The rest is ASCII13. -The rest is ASCII14. -The rest is ASCII15. -The rest is ASCII16. -The rest is ASCII17. -The rest is ASCII18. -The rest is ASCII19. -The rest is ASCII20. -The rest is ASCII21. -The rest is ASCII22. diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true/many-utf8-chars-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true/many-utf8-chars-crlf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true/many-utf8-chars-crlf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true/many-utf8-chars-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true/many-utf8-chars-lf deleted file mode 100644 index cd574f5a2b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true/many-utf8-chars-lf +++ /dev/null @@ -1,4 +0,0 @@ -Lets sing! -♫♪♬♩ -Eat food -🍅🍕 diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true/mixed-lf-cr b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true/mixed-lf-cr deleted file mode 100644 index d11e7ef63b..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true/mixed-lf-cr +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true/mixed-lf-cr-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true/mixed-lf-cr-crlf deleted file mode 100644 index 417786fc35..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true/mixed-lf-cr-crlf +++ /dev/null @@ -1,3 +0,0 @@ -one -two three -four \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true/more-crlf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true/more-crlf deleted file mode 100644 index 0ff5a53f19..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true/more-crlf +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true/more-crlf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true/more-crlf-utf8bom deleted file mode 100644 index ea030d3c6c..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true/more-crlf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -crlf -crlf -lf -crlf -crlf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true/more-lf b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true/more-lf deleted file mode 100644 index 04de00b358..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true/more-lf +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true/more-lf-utf8bom b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true/more-lf-utf8bom deleted file mode 100644 index dc88e3b917..0000000000 --- a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true/more-lf-utf8bom +++ /dev/null @@ -1,5 +0,0 @@ -lf -lf -crlf -lf -lf diff --git a/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true/zero-byte b/vendor/libgit2/tests/resources/crlf_data/windows/autocrlf_true/zero-byte deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/vendor/libgit2/tests/resources/deprecated-mode.git/HEAD b/vendor/libgit2/tests/resources/deprecated-mode.git/HEAD deleted file mode 100644 index cb089cd89a..0000000000 --- a/vendor/libgit2/tests/resources/deprecated-mode.git/HEAD +++ /dev/null @@ -1 +0,0 @@ -ref: refs/heads/master diff --git a/vendor/libgit2/tests/resources/deprecated-mode.git/config b/vendor/libgit2/tests/resources/deprecated-mode.git/config deleted file mode 100644 index f57351fd54..0000000000 --- a/vendor/libgit2/tests/resources/deprecated-mode.git/config +++ /dev/null @@ -1,6 +0,0 @@ -[core] - bare = true - repositoryformatversion = 0 - filemode = false - logallrefupdates = true - ignorecase = true diff --git a/vendor/libgit2/tests/resources/deprecated-mode.git/description b/vendor/libgit2/tests/resources/deprecated-mode.git/description deleted file mode 100644 index 498b267a8c..0000000000 --- a/vendor/libgit2/tests/resources/deprecated-mode.git/description +++ /dev/null @@ -1 +0,0 @@ -Unnamed repository; edit this file 'description' to name the repository. diff --git a/vendor/libgit2/tests/resources/deprecated-mode.git/index b/vendor/libgit2/tests/resources/deprecated-mode.git/index deleted file mode 100644 index 6827406039..0000000000 Binary files a/vendor/libgit2/tests/resources/deprecated-mode.git/index and /dev/null differ diff --git a/vendor/libgit2/tests/resources/deprecated-mode.git/info/exclude b/vendor/libgit2/tests/resources/deprecated-mode.git/info/exclude deleted file mode 100644 index 6d05881d3a..0000000000 --- a/vendor/libgit2/tests/resources/deprecated-mode.git/info/exclude +++ /dev/null @@ -1,2 +0,0 @@ -# File patterns to ignore; see `git help ignore` for more information. -# Lines that start with '#' are comments. diff --git a/vendor/libgit2/tests/resources/deprecated-mode.git/objects/06/262edc257418e9987caf999f9a7a3e1547adff b/vendor/libgit2/tests/resources/deprecated-mode.git/objects/06/262edc257418e9987caf999f9a7a3e1547adff deleted file mode 100644 index a030cf7a78..0000000000 Binary files a/vendor/libgit2/tests/resources/deprecated-mode.git/objects/06/262edc257418e9987caf999f9a7a3e1547adff and /dev/null differ diff --git a/vendor/libgit2/tests/resources/deprecated-mode.git/objects/08/10fb7818088ff5ac41ee49199b51473b1bd6c7 b/vendor/libgit2/tests/resources/deprecated-mode.git/objects/08/10fb7818088ff5ac41ee49199b51473b1bd6c7 deleted file mode 100644 index 52d56936a1..0000000000 Binary files a/vendor/libgit2/tests/resources/deprecated-mode.git/objects/08/10fb7818088ff5ac41ee49199b51473b1bd6c7 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/deprecated-mode.git/objects/1b/05fdaa881ee45b48cbaa5e9b037d667a47745e b/vendor/libgit2/tests/resources/deprecated-mode.git/objects/1b/05fdaa881ee45b48cbaa5e9b037d667a47745e deleted file mode 100644 index ae7765a708..0000000000 Binary files a/vendor/libgit2/tests/resources/deprecated-mode.git/objects/1b/05fdaa881ee45b48cbaa5e9b037d667a47745e and /dev/null differ diff --git a/vendor/libgit2/tests/resources/deprecated-mode.git/objects/3d/0970ec547fc41ef8a5882dde99c6adce65b021 b/vendor/libgit2/tests/resources/deprecated-mode.git/objects/3d/0970ec547fc41ef8a5882dde99c6adce65b021 deleted file mode 100644 index 595283e897..0000000000 Binary files a/vendor/libgit2/tests/resources/deprecated-mode.git/objects/3d/0970ec547fc41ef8a5882dde99c6adce65b021 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/deprecated-mode.git/refs/heads/master b/vendor/libgit2/tests/resources/deprecated-mode.git/refs/heads/master deleted file mode 100644 index 1e106dfa4d..0000000000 --- a/vendor/libgit2/tests/resources/deprecated-mode.git/refs/heads/master +++ /dev/null @@ -1 +0,0 @@ -06262edc257418e9987caf999f9a7a3e1547adff diff --git a/vendor/libgit2/tests/resources/describe/.gitted/HEAD b/vendor/libgit2/tests/resources/describe/.gitted/HEAD deleted file mode 100644 index cb43805164..0000000000 --- a/vendor/libgit2/tests/resources/describe/.gitted/HEAD +++ /dev/null @@ -1 +0,0 @@ -ref: refs/heads/master diff --git a/vendor/libgit2/tests/resources/describe/.gitted/config b/vendor/libgit2/tests/resources/describe/.gitted/config deleted file mode 100644 index 454e576b97..0000000000 --- a/vendor/libgit2/tests/resources/describe/.gitted/config +++ /dev/null @@ -1,8 +0,0 @@ -[core] - repositoryformatversion = 0 - filemode = false - bare = false - logallrefupdates = true - symlinks = false - ignorecase = true - hideDotFiles = dotGitOnly diff --git a/vendor/libgit2/tests/resources/describe/.gitted/index b/vendor/libgit2/tests/resources/describe/.gitted/index deleted file mode 100644 index f5f35e26b5..0000000000 Binary files a/vendor/libgit2/tests/resources/describe/.gitted/index and /dev/null differ diff --git a/vendor/libgit2/tests/resources/describe/.gitted/logs/HEAD b/vendor/libgit2/tests/resources/describe/.gitted/logs/HEAD deleted file mode 100644 index fc49c6fa36..0000000000 --- a/vendor/libgit2/tests/resources/describe/.gitted/logs/HEAD +++ /dev/null @@ -1,14 +0,0 @@ -0000000000000000000000000000000000000000 108b485d8268ea595df8ffea74f0f4b186577d32 nulltoken 1380209394 +0200 commit (initial): initial -108b485d8268ea595df8ffea74f0f4b186577d32 4d6558b8fa764baeb0f19c1e857df91e0eda5a0f nulltoken 1380209404 +0200 commit: second -4d6558b8fa764baeb0f19c1e857df91e0eda5a0f b240c0fb88c5a629e00ebc1275fa1f33e364a705 nulltoken 1380209414 +0200 commit: third -b240c0fb88c5a629e00ebc1275fa1f33e364a705 81f4b1aac643e6983fab370eae8aefccecbf3a4c nulltoken 1380209425 +0200 commit: A -81f4b1aac643e6983fab370eae8aefccecbf3a4c 6126a5f9c57ebc81e64370ec3095184ad92dab1c nulltoken 1380209445 +0200 commit: c -6126a5f9c57ebc81e64370ec3095184ad92dab1c 4d6558b8fa764baeb0f19c1e857df91e0eda5a0f nulltoken 1380209455 +0200 reset: moving to 4d6558b8fa764baeb0f19c1e857df91e0eda5a0f -4d6558b8fa764baeb0f19c1e857df91e0eda5a0f 31fc9136820b507e938a9c6b88bf2c567a9f6f4b nulltoken 1380209465 +0200 commit: B -31fc9136820b507e938a9c6b88bf2c567a9f6f4b ce1c4f8b6120122e23d4442925d98c56c41917d8 nulltoken 1380209486 +0200 merge c: Merge made by the 'recursive' strategy. -ce1c4f8b6120122e23d4442925d98c56c41917d8 4d6558b8fa764baeb0f19c1e857df91e0eda5a0f nulltoken 1380209486 +0200 reset: moving to 4d6558b8fa764baeb0f19c1e857df91e0eda5a0f -4d6558b8fa764baeb0f19c1e857df91e0eda5a0f 6a12b56088706aa6c39ccd23b7c7ce60f3a0b9a1 nulltoken 1380209496 +0200 commit: D -6a12b56088706aa6c39ccd23b7c7ce60f3a0b9a1 1e016431ec7b22dd3e23f3e6f5f68f358f9227cf nulltoken 1380209527 +0200 commit: another -1e016431ec7b22dd3e23f3e6f5f68f358f9227cf a9eb02af13df030159e39f70330d5c8a47655691 nulltoken 1380209547 +0200 commit: yet another -a9eb02af13df030159e39f70330d5c8a47655691 949b98e208015bfc0e2f573debc34ae2f97a7f0e nulltoken 1380209557 +0200 merge ce1c4f8b6120122e23d4442925d98c56c41917d8: Merge made by the 'recursive' strategy. -949b98e208015bfc0e2f573debc34ae2f97a7f0e a6095f816e81f64651595d488badc42399837d6a nulltoken 1380209567 +0200 commit: x diff --git a/vendor/libgit2/tests/resources/describe/.gitted/logs/refs/heads/master b/vendor/libgit2/tests/resources/describe/.gitted/logs/refs/heads/master deleted file mode 100644 index fc49c6fa36..0000000000 --- a/vendor/libgit2/tests/resources/describe/.gitted/logs/refs/heads/master +++ /dev/null @@ -1,14 +0,0 @@ -0000000000000000000000000000000000000000 108b485d8268ea595df8ffea74f0f4b186577d32 nulltoken 1380209394 +0200 commit (initial): initial -108b485d8268ea595df8ffea74f0f4b186577d32 4d6558b8fa764baeb0f19c1e857df91e0eda5a0f nulltoken 1380209404 +0200 commit: second -4d6558b8fa764baeb0f19c1e857df91e0eda5a0f b240c0fb88c5a629e00ebc1275fa1f33e364a705 nulltoken 1380209414 +0200 commit: third -b240c0fb88c5a629e00ebc1275fa1f33e364a705 81f4b1aac643e6983fab370eae8aefccecbf3a4c nulltoken 1380209425 +0200 commit: A -81f4b1aac643e6983fab370eae8aefccecbf3a4c 6126a5f9c57ebc81e64370ec3095184ad92dab1c nulltoken 1380209445 +0200 commit: c -6126a5f9c57ebc81e64370ec3095184ad92dab1c 4d6558b8fa764baeb0f19c1e857df91e0eda5a0f nulltoken 1380209455 +0200 reset: moving to 4d6558b8fa764baeb0f19c1e857df91e0eda5a0f -4d6558b8fa764baeb0f19c1e857df91e0eda5a0f 31fc9136820b507e938a9c6b88bf2c567a9f6f4b nulltoken 1380209465 +0200 commit: B -31fc9136820b507e938a9c6b88bf2c567a9f6f4b ce1c4f8b6120122e23d4442925d98c56c41917d8 nulltoken 1380209486 +0200 merge c: Merge made by the 'recursive' strategy. -ce1c4f8b6120122e23d4442925d98c56c41917d8 4d6558b8fa764baeb0f19c1e857df91e0eda5a0f nulltoken 1380209486 +0200 reset: moving to 4d6558b8fa764baeb0f19c1e857df91e0eda5a0f -4d6558b8fa764baeb0f19c1e857df91e0eda5a0f 6a12b56088706aa6c39ccd23b7c7ce60f3a0b9a1 nulltoken 1380209496 +0200 commit: D -6a12b56088706aa6c39ccd23b7c7ce60f3a0b9a1 1e016431ec7b22dd3e23f3e6f5f68f358f9227cf nulltoken 1380209527 +0200 commit: another -1e016431ec7b22dd3e23f3e6f5f68f358f9227cf a9eb02af13df030159e39f70330d5c8a47655691 nulltoken 1380209547 +0200 commit: yet another -a9eb02af13df030159e39f70330d5c8a47655691 949b98e208015bfc0e2f573debc34ae2f97a7f0e nulltoken 1380209557 +0200 merge ce1c4f8b6120122e23d4442925d98c56c41917d8: Merge made by the 'recursive' strategy. -949b98e208015bfc0e2f573debc34ae2f97a7f0e a6095f816e81f64651595d488badc42399837d6a nulltoken 1380209567 +0200 commit: x diff --git a/vendor/libgit2/tests/resources/describe/.gitted/objects/03/00021985931292d0611b9232e757035fefc04d b/vendor/libgit2/tests/resources/describe/.gitted/objects/03/00021985931292d0611b9232e757035fefc04d deleted file mode 100644 index 4b98de8fbb..0000000000 Binary files a/vendor/libgit2/tests/resources/describe/.gitted/objects/03/00021985931292d0611b9232e757035fefc04d and /dev/null differ diff --git a/vendor/libgit2/tests/resources/describe/.gitted/objects/10/8b485d8268ea595df8ffea74f0f4b186577d32 b/vendor/libgit2/tests/resources/describe/.gitted/objects/10/8b485d8268ea595df8ffea74f0f4b186577d32 deleted file mode 100644 index 0d6187b100..0000000000 Binary files a/vendor/libgit2/tests/resources/describe/.gitted/objects/10/8b485d8268ea595df8ffea74f0f4b186577d32 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/describe/.gitted/objects/10/bd08b099ecb79184c60183f5c94ca915f427ad b/vendor/libgit2/tests/resources/describe/.gitted/objects/10/bd08b099ecb79184c60183f5c94ca915f427ad deleted file mode 100644 index 3540cfae06..0000000000 Binary files a/vendor/libgit2/tests/resources/describe/.gitted/objects/10/bd08b099ecb79184c60183f5c94ca915f427ad and /dev/null differ diff --git a/vendor/libgit2/tests/resources/describe/.gitted/objects/17/8481050188cf00d7d9cd5a11e43ab8fab9294f b/vendor/libgit2/tests/resources/describe/.gitted/objects/17/8481050188cf00d7d9cd5a11e43ab8fab9294f deleted file mode 100644 index f2eaf83e5c..0000000000 Binary files a/vendor/libgit2/tests/resources/describe/.gitted/objects/17/8481050188cf00d7d9cd5a11e43ab8fab9294f and /dev/null differ diff --git a/vendor/libgit2/tests/resources/describe/.gitted/objects/19/1faf88a5826a99f475baaf8b13652c4e40bfe6 b/vendor/libgit2/tests/resources/describe/.gitted/objects/19/1faf88a5826a99f475baaf8b13652c4e40bfe6 deleted file mode 100644 index e44246b17a..0000000000 Binary files a/vendor/libgit2/tests/resources/describe/.gitted/objects/19/1faf88a5826a99f475baaf8b13652c4e40bfe6 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/describe/.gitted/objects/1e/016431ec7b22dd3e23f3e6f5f68f358f9227cf b/vendor/libgit2/tests/resources/describe/.gitted/objects/1e/016431ec7b22dd3e23f3e6f5f68f358f9227cf deleted file mode 100644 index a8769814b3..0000000000 Binary files a/vendor/libgit2/tests/resources/describe/.gitted/objects/1e/016431ec7b22dd3e23f3e6f5f68f358f9227cf and /dev/null differ diff --git a/vendor/libgit2/tests/resources/describe/.gitted/objects/22/3b7836fb19fdf64ba2d3cd6173c6a283141f78 b/vendor/libgit2/tests/resources/describe/.gitted/objects/22/3b7836fb19fdf64ba2d3cd6173c6a283141f78 deleted file mode 100644 index faf1fbe7c3..0000000000 Binary files a/vendor/libgit2/tests/resources/describe/.gitted/objects/22/3b7836fb19fdf64ba2d3cd6173c6a283141f78 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/describe/.gitted/objects/25/d5edf8c0ef17e8a13b8da75913dcec4ea7afc1 b/vendor/libgit2/tests/resources/describe/.gitted/objects/25/d5edf8c0ef17e8a13b8da75913dcec4ea7afc1 deleted file mode 100644 index 3353bf9eae..0000000000 Binary files a/vendor/libgit2/tests/resources/describe/.gitted/objects/25/d5edf8c0ef17e8a13b8da75913dcec4ea7afc1 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/describe/.gitted/objects/2b/df67abb163a4ffb2d7f3f0880c9fe5068ce782 b/vendor/libgit2/tests/resources/describe/.gitted/objects/2b/df67abb163a4ffb2d7f3f0880c9fe5068ce782 deleted file mode 100644 index d0398e6e35..0000000000 Binary files a/vendor/libgit2/tests/resources/describe/.gitted/objects/2b/df67abb163a4ffb2d7f3f0880c9fe5068ce782 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/describe/.gitted/objects/31/fc9136820b507e938a9c6b88bf2c567a9f6f4b b/vendor/libgit2/tests/resources/describe/.gitted/objects/31/fc9136820b507e938a9c6b88bf2c567a9f6f4b deleted file mode 100644 index 7752a9558b..0000000000 Binary files a/vendor/libgit2/tests/resources/describe/.gitted/objects/31/fc9136820b507e938a9c6b88bf2c567a9f6f4b and /dev/null differ diff --git a/vendor/libgit2/tests/resources/describe/.gitted/objects/42/8f9554a2eec22de29898819b579466af7c1583 b/vendor/libgit2/tests/resources/describe/.gitted/objects/42/8f9554a2eec22de29898819b579466af7c1583 deleted file mode 100644 index f27d552fd4..0000000000 Binary files a/vendor/libgit2/tests/resources/describe/.gitted/objects/42/8f9554a2eec22de29898819b579466af7c1583 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/describe/.gitted/objects/4d/6558b8fa764baeb0f19c1e857df91e0eda5a0f b/vendor/libgit2/tests/resources/describe/.gitted/objects/4d/6558b8fa764baeb0f19c1e857df91e0eda5a0f deleted file mode 100644 index 311ee2fad9..0000000000 Binary files a/vendor/libgit2/tests/resources/describe/.gitted/objects/4d/6558b8fa764baeb0f19c1e857df91e0eda5a0f and /dev/null differ diff --git a/vendor/libgit2/tests/resources/describe/.gitted/objects/4f/2d9ce01ad5249cabdc6565366af8aff85b1525 b/vendor/libgit2/tests/resources/describe/.gitted/objects/4f/2d9ce01ad5249cabdc6565366af8aff85b1525 deleted file mode 100644 index f04379f35b..0000000000 Binary files a/vendor/libgit2/tests/resources/describe/.gitted/objects/4f/2d9ce01ad5249cabdc6565366af8aff85b1525 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/describe/.gitted/objects/52/912fbab0715dec53d43053966e78ad213ba359 b/vendor/libgit2/tests/resources/describe/.gitted/objects/52/912fbab0715dec53d43053966e78ad213ba359 deleted file mode 100644 index 5deb7ec065..0000000000 Binary files a/vendor/libgit2/tests/resources/describe/.gitted/objects/52/912fbab0715dec53d43053966e78ad213ba359 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/describe/.gitted/objects/56/26abf0f72e58d7a153368ba57db4c673c0e171 b/vendor/libgit2/tests/resources/describe/.gitted/objects/56/26abf0f72e58d7a153368ba57db4c673c0e171 deleted file mode 100644 index 4d54474672..0000000000 Binary files a/vendor/libgit2/tests/resources/describe/.gitted/objects/56/26abf0f72e58d7a153368ba57db4c673c0e171 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/describe/.gitted/objects/61/26a5f9c57ebc81e64370ec3095184ad92dab1c b/vendor/libgit2/tests/resources/describe/.gitted/objects/61/26a5f9c57ebc81e64370ec3095184ad92dab1c deleted file mode 100644 index e71707f4b6..0000000000 Binary files a/vendor/libgit2/tests/resources/describe/.gitted/objects/61/26a5f9c57ebc81e64370ec3095184ad92dab1c and /dev/null differ diff --git a/vendor/libgit2/tests/resources/describe/.gitted/objects/62/d8fe9f6db631bd3a19140699101c9e281c9f9d b/vendor/libgit2/tests/resources/describe/.gitted/objects/62/d8fe9f6db631bd3a19140699101c9e281c9f9d deleted file mode 100644 index 734f7dc429..0000000000 Binary files a/vendor/libgit2/tests/resources/describe/.gitted/objects/62/d8fe9f6db631bd3a19140699101c9e281c9f9d and /dev/null differ diff --git a/vendor/libgit2/tests/resources/describe/.gitted/objects/65/a91bc2262480dce4c5979519aae6668368eb4e b/vendor/libgit2/tests/resources/describe/.gitted/objects/65/a91bc2262480dce4c5979519aae6668368eb4e deleted file mode 100644 index ef9f53a391..0000000000 Binary files a/vendor/libgit2/tests/resources/describe/.gitted/objects/65/a91bc2262480dce4c5979519aae6668368eb4e and /dev/null differ diff --git a/vendor/libgit2/tests/resources/describe/.gitted/objects/68/0166b6cd31f76354fee2572618e6b0142d05e6 b/vendor/libgit2/tests/resources/describe/.gitted/objects/68/0166b6cd31f76354fee2572618e6b0142d05e6 deleted file mode 100644 index 36f1986861..0000000000 --- a/vendor/libgit2/tests/resources/describe/.gitted/objects/68/0166b6cd31f76354fee2572618e6b0142d05e6 +++ /dev/null @@ -1,2 +0,0 @@ -xŚK @]sŠŮ›4¤|cJ[QĹhK% \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/describe/.gitted/objects/aa/d8d5cef3915ab78b3227abaaac99b62db9eb54 b/vendor/libgit2/tests/resources/describe/.gitted/objects/aa/d8d5cef3915ab78b3227abaaac99b62db9eb54 deleted file mode 100644 index 4cbaff1922..0000000000 Binary files a/vendor/libgit2/tests/resources/describe/.gitted/objects/aa/d8d5cef3915ab78b3227abaaac99b62db9eb54 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/describe/.gitted/objects/aa/ddd4f14847e0e323924ec262c2343249a84f8b b/vendor/libgit2/tests/resources/describe/.gitted/objects/aa/ddd4f14847e0e323924ec262c2343249a84f8b deleted file mode 100644 index 651ec782e7..0000000000 Binary files a/vendor/libgit2/tests/resources/describe/.gitted/objects/aa/ddd4f14847e0e323924ec262c2343249a84f8b and /dev/null differ diff --git a/vendor/libgit2/tests/resources/describe/.gitted/objects/b2/40c0fb88c5a629e00ebc1275fa1f33e364a705 b/vendor/libgit2/tests/resources/describe/.gitted/objects/b2/40c0fb88c5a629e00ebc1275fa1f33e364a705 deleted file mode 100644 index fe86e7c7c5..0000000000 --- a/vendor/libgit2/tests/resources/describe/.gitted/objects/b2/40c0fb88c5a629e00ebc1275fa1f33e364a705 +++ /dev/null @@ -1,3 +0,0 @@ -xťŽM -Ă »öî AͧQ(ĄWńçŮJc,ÖÜżžˇ«7 ĽŘj-+E—Ńner†´ĚYč9› Xg¬•*’ «†±Źď8§d´¶Áfż -Ad预Ő[ĘNB yíEfţŻÖůqîűhoü†Š^â’Ń«˙>žŐ—}‰­Ţą\­P‘$~ť Ř´óäŔź9ŻŇűµGG¬ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/describe/.gitted/objects/ce/1c4f8b6120122e23d4442925d98c56c41917d8 b/vendor/libgit2/tests/resources/describe/.gitted/objects/ce/1c4f8b6120122e23d4442925d98c56c41917d8 deleted file mode 100644 index 408c5da337..0000000000 Binary files a/vendor/libgit2/tests/resources/describe/.gitted/objects/ce/1c4f8b6120122e23d4442925d98c56c41917d8 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/describe/.gitted/objects/d5/aab219a814ddbe4b3aaedf03cdea491b218ec4 b/vendor/libgit2/tests/resources/describe/.gitted/objects/d5/aab219a814ddbe4b3aaedf03cdea491b218ec4 deleted file mode 100644 index 4512d16d66..0000000000 Binary files a/vendor/libgit2/tests/resources/describe/.gitted/objects/d5/aab219a814ddbe4b3aaedf03cdea491b218ec4 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/describe/.gitted/objects/f2/ad6c76f0115a6ba5b00456a849810e7ec0af20 b/vendor/libgit2/tests/resources/describe/.gitted/objects/f2/ad6c76f0115a6ba5b00456a849810e7ec0af20 deleted file mode 100644 index a36463115d..0000000000 Binary files a/vendor/libgit2/tests/resources/describe/.gitted/objects/f2/ad6c76f0115a6ba5b00456a849810e7ec0af20 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/describe/.gitted/objects/f7/0f10e4db19068f79bc43844b49f3eece45c4e8 b/vendor/libgit2/tests/resources/describe/.gitted/objects/f7/0f10e4db19068f79bc43844b49f3eece45c4e8 deleted file mode 100644 index 2e15b4fb0a..0000000000 Binary files a/vendor/libgit2/tests/resources/describe/.gitted/objects/f7/0f10e4db19068f79bc43844b49f3eece45c4e8 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/describe/.gitted/objects/f7/19efd430d52bcfc8566a43b2eb655688d38871 b/vendor/libgit2/tests/resources/describe/.gitted/objects/f7/19efd430d52bcfc8566a43b2eb655688d38871 deleted file mode 100644 index b2d51d93bb..0000000000 Binary files a/vendor/libgit2/tests/resources/describe/.gitted/objects/f7/19efd430d52bcfc8566a43b2eb655688d38871 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/describe/.gitted/refs/heads/master b/vendor/libgit2/tests/resources/describe/.gitted/refs/heads/master deleted file mode 100644 index 0b2a541309..0000000000 --- a/vendor/libgit2/tests/resources/describe/.gitted/refs/heads/master +++ /dev/null @@ -1 +0,0 @@ -a6095f816e81f64651595d488badc42399837d6a diff --git a/vendor/libgit2/tests/resources/describe/another b/vendor/libgit2/tests/resources/describe/another deleted file mode 100644 index a3d00fa8a4..0000000000 --- a/vendor/libgit2/tests/resources/describe/another +++ /dev/null @@ -1 +0,0 @@ -DDD diff --git a/vendor/libgit2/tests/resources/describe/file b/vendor/libgit2/tests/resources/describe/file deleted file mode 100644 index fd66be08d0..0000000000 --- a/vendor/libgit2/tests/resources/describe/file +++ /dev/null @@ -1 +0,0 @@ -X diff --git a/vendor/libgit2/tests/resources/describe/side b/vendor/libgit2/tests/resources/describe/side deleted file mode 100644 index fd66be08d0..0000000000 --- a/vendor/libgit2/tests/resources/describe/side +++ /dev/null @@ -1 +0,0 @@ -X diff --git a/vendor/libgit2/tests/resources/diff/.gitted/HEAD b/vendor/libgit2/tests/resources/diff/.gitted/HEAD deleted file mode 100644 index cb089cd89a..0000000000 --- a/vendor/libgit2/tests/resources/diff/.gitted/HEAD +++ /dev/null @@ -1 +0,0 @@ -ref: refs/heads/master diff --git a/vendor/libgit2/tests/resources/diff/.gitted/config b/vendor/libgit2/tests/resources/diff/.gitted/config deleted file mode 100644 index 77a27ef1d5..0000000000 --- a/vendor/libgit2/tests/resources/diff/.gitted/config +++ /dev/null @@ -1,6 +0,0 @@ -[core] - repositoryformatversion = 0 - filemode = true - bare = false - logallrefupdates = true - ignorecase = false diff --git a/vendor/libgit2/tests/resources/diff/.gitted/description b/vendor/libgit2/tests/resources/diff/.gitted/description deleted file mode 100644 index 498b267a8c..0000000000 --- a/vendor/libgit2/tests/resources/diff/.gitted/description +++ /dev/null @@ -1 +0,0 @@ -Unnamed repository; edit this file 'description' to name the repository. diff --git a/vendor/libgit2/tests/resources/diff/.gitted/index b/vendor/libgit2/tests/resources/diff/.gitted/index deleted file mode 100644 index e1071874e2..0000000000 Binary files a/vendor/libgit2/tests/resources/diff/.gitted/index and /dev/null differ diff --git a/vendor/libgit2/tests/resources/diff/.gitted/info/exclude b/vendor/libgit2/tests/resources/diff/.gitted/info/exclude deleted file mode 100644 index a5196d1be8..0000000000 --- a/vendor/libgit2/tests/resources/diff/.gitted/info/exclude +++ /dev/null @@ -1,6 +0,0 @@ -# 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/vendor/libgit2/tests/resources/diff/.gitted/logs/HEAD b/vendor/libgit2/tests/resources/diff/.gitted/logs/HEAD deleted file mode 100644 index 8c6f6fd18b..0000000000 --- a/vendor/libgit2/tests/resources/diff/.gitted/logs/HEAD +++ /dev/null @@ -1,2 +0,0 @@ -0000000000000000000000000000000000000000 d70d245ed97ed2aa596dd1af6536e4bfdb047b69 Russell Belfer 1347559804 -0700 commit (initial): initial commit -d70d245ed97ed2aa596dd1af6536e4bfdb047b69 7a9e0b02e63179929fed24f0a3e0f19168114d10 Russell Belfer 1347560491 -0700 commit: some changes diff --git a/vendor/libgit2/tests/resources/diff/.gitted/logs/refs/heads/master b/vendor/libgit2/tests/resources/diff/.gitted/logs/refs/heads/master deleted file mode 100644 index 8c6f6fd18b..0000000000 --- a/vendor/libgit2/tests/resources/diff/.gitted/logs/refs/heads/master +++ /dev/null @@ -1,2 +0,0 @@ -0000000000000000000000000000000000000000 d70d245ed97ed2aa596dd1af6536e4bfdb047b69 Russell Belfer 1347559804 -0700 commit (initial): initial commit -d70d245ed97ed2aa596dd1af6536e4bfdb047b69 7a9e0b02e63179929fed24f0a3e0f19168114d10 Russell Belfer 1347560491 -0700 commit: some changes diff --git a/vendor/libgit2/tests/resources/diff/.gitted/objects/29/ab7053bb4dde0298e03e2c179e890b7dd465a7 b/vendor/libgit2/tests/resources/diff/.gitted/objects/29/ab7053bb4dde0298e03e2c179e890b7dd465a7 deleted file mode 100644 index 94f9a676de..0000000000 Binary files a/vendor/libgit2/tests/resources/diff/.gitted/objects/29/ab7053bb4dde0298e03e2c179e890b7dd465a7 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/diff/.gitted/objects/3e/5bcbad2a68e5bc60a53b8388eea53a1a7ab847 b/vendor/libgit2/tests/resources/diff/.gitted/objects/3e/5bcbad2a68e5bc60a53b8388eea53a1a7ab847 deleted file mode 100644 index 9fed523dc6..0000000000 Binary files a/vendor/libgit2/tests/resources/diff/.gitted/objects/3e/5bcbad2a68e5bc60a53b8388eea53a1a7ab847 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/diff/.gitted/objects/54/6c735f16a3b44d9784075c2c0dab2ac9bf1989 b/vendor/libgit2/tests/resources/diff/.gitted/objects/54/6c735f16a3b44d9784075c2c0dab2ac9bf1989 deleted file mode 100644 index d7df4d6a19..0000000000 Binary files a/vendor/libgit2/tests/resources/diff/.gitted/objects/54/6c735f16a3b44d9784075c2c0dab2ac9bf1989 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/diff/.gitted/objects/7a/9e0b02e63179929fed24f0a3e0f19168114d10 b/vendor/libgit2/tests/resources/diff/.gitted/objects/7a/9e0b02e63179929fed24f0a3e0f19168114d10 deleted file mode 100644 index 9bc25eb349..0000000000 Binary files a/vendor/libgit2/tests/resources/diff/.gitted/objects/7a/9e0b02e63179929fed24f0a3e0f19168114d10 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/diff/.gitted/objects/7b/808f723a8ca90df319682c221187235af76693 b/vendor/libgit2/tests/resources/diff/.gitted/objects/7b/808f723a8ca90df319682c221187235af76693 deleted file mode 100644 index 2fd266be66..0000000000 Binary files a/vendor/libgit2/tests/resources/diff/.gitted/objects/7b/808f723a8ca90df319682c221187235af76693 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/diff/.gitted/objects/88/789109439c1e1c3cd45224001edee5304ed53c b/vendor/libgit2/tests/resources/diff/.gitted/objects/88/789109439c1e1c3cd45224001edee5304ed53c deleted file mode 100644 index 7598b59141..0000000000 --- a/vendor/libgit2/tests/resources/diff/.gitted/objects/88/789109439c1e1c3cd45224001edee5304ed53c +++ /dev/null @@ -1 +0,0 @@ -x+)JMU07g040031QHĚË/ÉH-Ň+©(aÉ)Ž[ĽĹwz {Śďj­“ű%;ˇĘŠRSrSÁŞ4Wďö˝Ç4㝎řĽNîÚ+©Ë¶a \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/diff/.gitted/objects/cb/8294e696339863df760b2ff5d1e275bee72455 b/vendor/libgit2/tests/resources/diff/.gitted/objects/cb/8294e696339863df760b2ff5d1e275bee72455 deleted file mode 100644 index 86ebe04fed..0000000000 Binary files a/vendor/libgit2/tests/resources/diff/.gitted/objects/cb/8294e696339863df760b2ff5d1e275bee72455 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/diff/.gitted/objects/d7/0d245ed97ed2aa596dd1af6536e4bfdb047b69 b/vendor/libgit2/tests/resources/diff/.gitted/objects/d7/0d245ed97ed2aa596dd1af6536e4bfdb047b69 deleted file mode 100644 index 99304c4aa2..0000000000 --- a/vendor/libgit2/tests/resources/diff/.gitted/objects/d7/0d245ed97ed2aa596dd1af6536e4bfdb047b69 +++ /dev/null @@ -1 +0,0 @@ -x•ŤŰ !óm·_ׄRB:XÝkVpWpµ˙© ż‡™9±î{î ,^z#‚śôšŚ7JygÔš¬áA¦„« i1Y©Ů2úVĽÇyR)𢒨Á˝…ç'÷m„[¬ű„ŇŃ;®áĘ-çl®óŻOô_“ĺ#÷Ľř%Řśv8¤ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/diff/.gitted/refs/heads/master b/vendor/libgit2/tests/resources/diff/.gitted/refs/heads/master deleted file mode 100644 index a83afc38be..0000000000 --- a/vendor/libgit2/tests/resources/diff/.gitted/refs/heads/master +++ /dev/null @@ -1 +0,0 @@ -7a9e0b02e63179929fed24f0a3e0f19168114d10 diff --git a/vendor/libgit2/tests/resources/diff/another.txt b/vendor/libgit2/tests/resources/diff/another.txt deleted file mode 100644 index d0e0bae4d4..0000000000 --- a/vendor/libgit2/tests/resources/diff/another.txt +++ /dev/null @@ -1,38 +0,0 @@ -Git is fast. With Git, nearly all operations are performed locally, giving -it an huge speed advantage on centralized systems that constantly have to -communicate with a server somewh3r3. - -For testing, large AWS instances were set up in the same availability -zone. Git and SVN were installed on both machines, the Ruby repository was -copied to both Git and SVN servers, and common operations were performed on -both. - -In some cases the commands don't match up exactly. Here, matching on the -lowest common denominator was attempted. For example, the 'commit' tests -also include the time to push for Git, though most of the time you would not -actually be pushing to the server immediately after a commit where the two -commands cannot be separated in SVN. - -Note that this is the best case scenario for SVN - a server with no load -with an 80MB/s bandwidth connection to the client machine. Nearly all of -these times would be even worse for SVN if that connection was slower, while -many of the Git times would not be affected. - -Clearly, in many of these common version control operations, Git is one or -two orders of magnitude faster than SVN, even under ideal conditions for -SVN. - -Let's see how common operations stack up against Subversion, a common -centralized version control system that is similar to CVS or -Perforce. Smaller is faster. - -One place where Git is slower is in the initial clone operation. Here, Git -One place where Git is slower is in the initial clone operation. Here, Git -One place where Git is slower is in the initial clone operation. Here, Git -seen in the above charts, it's not considerably slower for an operation that -is only performed once. - -It's also interesting to note that the size of the data on the client side -is very similar even though Git also has every version of every file for the -entire history of the project. This illustrates how efficient it is at -compressing and storing data on the client side. \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/diff/readme.txt b/vendor/libgit2/tests/resources/diff/readme.txt deleted file mode 100644 index beedf288d5..0000000000 --- a/vendor/libgit2/tests/resources/diff/readme.txt +++ /dev/null @@ -1,36 +0,0 @@ -The Git feature that r3ally mak3s it stand apart from n3arly 3v3ry other SCM -out there is its branching model. - -Git allows and encourages you to have multiple local branches that can be -entirely independent of each other. The creation, merging, and deletion of -those lines of development takes seconds. - -Git allows and encourages you to have multiple local branches that can be -entirely independent of each other. The creation, merging, and deletion of -those lines of development takes seconds. - -This means that you can do things like: - -Role-Bas3d Codelin3s. Have a branch that always contains only what goes to -production, another that you merge work into for testing, and several -smaller ones for day to day work. - -Feature Based Workflow. Create new branches for each new feature you're -working on so you can seamlessly switch back and forth between them, then -delete each branch when that feature gets merged into your main line. - -Disposable Experimentation. Create a branch to experiment in, realize it's -not going to work, and just delete it - abandoning the work—with nobody else -ever seeing it (even if you've pushed other branches in the meantime). - -Notably, when you push to a remote repository, you do not have to push all -share it with others. - -Git allows and encourages you to have multiple local branches that can be -entirely independent of each other. The creation, merging, and deletion of -those lines of development takes seconds. - -There are ways to accomplish some of this with other systems, but the work -involved is much more difficult and error-prone. Git makes this process -incredibly easy and it changes the way most developers work when they learn -it.! diff --git a/vendor/libgit2/tests/resources/diff_format_email/.gitted/HEAD b/vendor/libgit2/tests/resources/diff_format_email/.gitted/HEAD deleted file mode 100644 index cb089cd89a..0000000000 --- a/vendor/libgit2/tests/resources/diff_format_email/.gitted/HEAD +++ /dev/null @@ -1 +0,0 @@ -ref: refs/heads/master diff --git a/vendor/libgit2/tests/resources/diff_format_email/.gitted/config b/vendor/libgit2/tests/resources/diff_format_email/.gitted/config deleted file mode 100644 index 6c9406b7d9..0000000000 --- a/vendor/libgit2/tests/resources/diff_format_email/.gitted/config +++ /dev/null @@ -1,7 +0,0 @@ -[core] - repositoryformatversion = 0 - filemode = true - bare = false - logallrefupdates = true - ignorecase = true - precomposeunicode = true diff --git a/vendor/libgit2/tests/resources/diff_format_email/.gitted/index b/vendor/libgit2/tests/resources/diff_format_email/.gitted/index deleted file mode 100644 index f73027e565..0000000000 Binary files a/vendor/libgit2/tests/resources/diff_format_email/.gitted/index and /dev/null differ diff --git a/vendor/libgit2/tests/resources/diff_format_email/.gitted/info/exclude b/vendor/libgit2/tests/resources/diff_format_email/.gitted/info/exclude deleted file mode 100644 index a5196d1be8..0000000000 --- a/vendor/libgit2/tests/resources/diff_format_email/.gitted/info/exclude +++ /dev/null @@ -1,6 +0,0 @@ -# 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/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/0a/37045ca6d8503e9bcf06a12abbbc8e92664cce b/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/0a/37045ca6d8503e9bcf06a12abbbc8e92664cce deleted file mode 100644 index 1ece99cde7..0000000000 Binary files a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/0a/37045ca6d8503e9bcf06a12abbbc8e92664cce and /dev/null differ diff --git a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/10/808fe9c9be5a190c0ba68d1a002233fb363508 b/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/10/808fe9c9be5a190c0ba68d1a002233fb363508 deleted file mode 100644 index 90313feec7..0000000000 Binary files a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/10/808fe9c9be5a190c0ba68d1a002233fb363508 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/13/ecf3d572dbc5e5b32c8ba067d1d1e0939572e8 b/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/13/ecf3d572dbc5e5b32c8ba067d1d1e0939572e8 deleted file mode 100644 index 360dc3bc7e..0000000000 Binary files a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/13/ecf3d572dbc5e5b32c8ba067d1d1e0939572e8 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/17/cfad36e93db7706b16bef5ef842ba1e5ca06ab b/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/17/cfad36e93db7706b16bef5ef842ba1e5ca06ab deleted file mode 100644 index 603aa496aa..0000000000 Binary files a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/17/cfad36e93db7706b16bef5ef842ba1e5ca06ab and /dev/null differ diff --git a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/1a/9932083f96b0db42552103d40076f62fa8235e b/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/1a/9932083f96b0db42552103d40076f62fa8235e deleted file mode 100644 index b6f04538e8..0000000000 Binary files a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/1a/9932083f96b0db42552103d40076f62fa8235e and /dev/null differ diff --git a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/1a/e3be57f869687d983066a0f5d2aaea1b82ddc5 b/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/1a/e3be57f869687d983066a0f5d2aaea1b82ddc5 deleted file mode 100644 index be85c78ba0..0000000000 Binary files a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/1a/e3be57f869687d983066a0f5d2aaea1b82ddc5 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/1b/525b0a6c5218b069b601ce91fce8eaf0a54e20 b/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/1b/525b0a6c5218b069b601ce91fce8eaf0a54e20 deleted file mode 100644 index e8145edfd2..0000000000 Binary files a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/1b/525b0a6c5218b069b601ce91fce8eaf0a54e20 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/1e/82c3b234e37da82e5b23e0e2a70bca68ee12c6 b/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/1e/82c3b234e37da82e5b23e0e2a70bca68ee12c6 deleted file mode 100644 index 3ae87cfa97..0000000000 Binary files a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/1e/82c3b234e37da82e5b23e0e2a70bca68ee12c6 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/1e/875da9b1e67f853b2eec3e202c21c867097234 b/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/1e/875da9b1e67f853b2eec3e202c21c867097234 deleted file mode 100644 index f80b3612cb..0000000000 Binary files a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/1e/875da9b1e67f853b2eec3e202c21c867097234 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/20/609dbbc32bbfc827528eec3fcea2d024e6dd8a b/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/20/609dbbc32bbfc827528eec3fcea2d024e6dd8a deleted file mode 100644 index 190c3f2724..0000000000 Binary files a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/20/609dbbc32bbfc827528eec3fcea2d024e6dd8a and /dev/null differ diff --git a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/23/f92946d3f38bd090f700d3e8e7b728ffc58264 b/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/23/f92946d3f38bd090f700d3e8e7b728ffc58264 deleted file mode 100644 index 42f49ae8aa..0000000000 Binary files a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/23/f92946d3f38bd090f700d3e8e7b728ffc58264 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/24/97c5249408494e66e25070a8c74e49eaeeb6c3 b/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/24/97c5249408494e66e25070a8c74e49eaeeb6c3 deleted file mode 100644 index e1ede9ae9b..0000000000 Binary files a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/24/97c5249408494e66e25070a8c74e49eaeeb6c3 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/24/9a4263be23b4d1c02484cb840b6eca4c6cf74d b/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/24/9a4263be23b4d1c02484cb840b6eca4c6cf74d deleted file mode 100644 index 1b8d689518..0000000000 Binary files a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/24/9a4263be23b4d1c02484cb840b6eca4c6cf74d and /dev/null differ diff --git a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/25/2a3e19fd2c6fb7b20c111142c5bd5fb9ea6b8e b/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/25/2a3e19fd2c6fb7b20c111142c5bd5fb9ea6b8e deleted file mode 100644 index 10c34009d1..0000000000 Binary files a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/25/2a3e19fd2c6fb7b20c111142c5bd5fb9ea6b8e and /dev/null differ diff --git a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/27/93544db9060bab4f9169e5b89c82f9fa7c7fa6 b/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/27/93544db9060bab4f9169e5b89c82f9fa7c7fa6 deleted file mode 100644 index 689f5b9a11..0000000000 Binary files a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/27/93544db9060bab4f9169e5b89c82f9fa7c7fa6 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/29/1f1ff3cbb9a6f153678d9657679e3d4bf257df b/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/29/1f1ff3cbb9a6f153678d9657679e3d4bf257df deleted file mode 100644 index 6af5dda9d1..0000000000 Binary files a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/29/1f1ff3cbb9a6f153678d9657679e3d4bf257df and /dev/null differ diff --git a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/2f/f7b811eee62a73959350b1f7349f6f4d0c882d b/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/2f/f7b811eee62a73959350b1f7349f6f4d0c882d deleted file mode 100644 index d2b911d0e0..0000000000 Binary files a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/2f/f7b811eee62a73959350b1f7349f6f4d0c882d and /dev/null differ diff --git a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/39/91dce9e71a0641ca49a6a4eea6c9e7ff402ed4 b/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/39/91dce9e71a0641ca49a6a4eea6c9e7ff402ed4 deleted file mode 100644 index 69d213dcb0..0000000000 Binary files a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/39/91dce9e71a0641ca49a6a4eea6c9e7ff402ed4 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/45/eef2a9317e179984649de247269e38cd5d99cf b/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/45/eef2a9317e179984649de247269e38cd5d99cf deleted file mode 100644 index e5014565bd..0000000000 --- a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/45/eef2a9317e179984649de247269e38cd5d99cf +++ /dev/null @@ -1,2 +0,0 @@ -xĄÎÁJĹ0…a×yŠŮ_I›IqwÁĄo0ťLo+$ą&©ŕŰ[őÜţź””öźzU…ŕ&ŇÁFY„,ń:ŻŢYšĽCT·8BĄŐ ŽćÎUsŻH,BL‘Â)ËČ(‚ër.cŚažĂ }+^Y>mpŐšö¶_ žŢ˙ÚíĄőşsçG)éě&k}G¸ŕ€hÎzR»ţëÄĽi*ź -Rr˙ńsŽ ç›Âý—Ôö’›ůĐXă \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/4a/076277b884c519a932be67e346db2ac80a98fa b/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/4a/076277b884c519a932be67e346db2ac80a98fa deleted file mode 100644 index b855408e8f..0000000000 Binary files a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/4a/076277b884c519a932be67e346db2ac80a98fa and /dev/null differ diff --git a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/4c/3bd7182ad66ea7aa20ba47ae82812b710d169c b/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/4c/3bd7182ad66ea7aa20ba47ae82812b710d169c deleted file mode 100644 index 65740b42c2..0000000000 Binary files a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/4c/3bd7182ad66ea7aa20ba47ae82812b710d169c and /dev/null differ diff --git a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/4c/a10087e696d2ba78d07b146a118e9a7096ed4f b/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/4c/a10087e696d2ba78d07b146a118e9a7096ed4f deleted file mode 100644 index b05e7d634f..0000000000 Binary files a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/4c/a10087e696d2ba78d07b146a118e9a7096ed4f and /dev/null differ diff --git a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/4d/de2b17d1c982cd988f21d24350a214401e4a1e b/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/4d/de2b17d1c982cd988f21d24350a214401e4a1e deleted file mode 100644 index 57a8dfed19..0000000000 Binary files a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/4d/de2b17d1c982cd988f21d24350a214401e4a1e and /dev/null differ diff --git a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/4f/31e0248ac800a1edc78b74f74e86f5eba90e87 b/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/4f/31e0248ac800a1edc78b74f74e86f5eba90e87 deleted file mode 100644 index 0f31b97d6b..0000000000 Binary files a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/4f/31e0248ac800a1edc78b74f74e86f5eba90e87 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/50/17c9456d013b2c7712d29aab73b681c880f509 b/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/50/17c9456d013b2c7712d29aab73b681c880f509 deleted file mode 100644 index 5b96aa5ea6..0000000000 Binary files a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/50/17c9456d013b2c7712d29aab73b681c880f509 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/50/438cfa585c1d15cf3650ed1bf641da937cc261 b/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/50/438cfa585c1d15cf3650ed1bf641da937cc261 deleted file mode 100644 index 8db9090bc7..0000000000 Binary files a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/50/438cfa585c1d15cf3650ed1bf641da937cc261 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/52/c3cd1ff6234b95fecbaf9ef13624da17697b8d b/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/52/c3cd1ff6234b95fecbaf9ef13624da17697b8d deleted file mode 100644 index 4bbc0ea431..0000000000 Binary files a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/52/c3cd1ff6234b95fecbaf9ef13624da17697b8d and /dev/null differ diff --git a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/55/0d730ba1b8c4937ea170b37c7ba91d792c0aaa b/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/55/0d730ba1b8c4937ea170b37c7ba91d792c0aaa deleted file mode 100644 index 680e48762a..0000000000 Binary files a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/55/0d730ba1b8c4937ea170b37c7ba91d792c0aaa and /dev/null differ diff --git a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/66/81f1844dc677e5ff07ffd993461f5c441e6af5 b/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/66/81f1844dc677e5ff07ffd993461f5c441e6af5 deleted file mode 100644 index 86a38289b8..0000000000 Binary files a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/66/81f1844dc677e5ff07ffd993461f5c441e6af5 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/69/ddefb5c245e2f9ee62bd4cabd8ebe60a01e448 b/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/69/ddefb5c245e2f9ee62bd4cabd8ebe60a01e448 deleted file mode 100644 index 81b606f4e4..0000000000 Binary files a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/69/ddefb5c245e2f9ee62bd4cabd8ebe60a01e448 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/6b/6c2067c6d968f9bddb9b900ee1ab7e5b067430 b/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/6b/6c2067c6d968f9bddb9b900ee1ab7e5b067430 deleted file mode 100644 index aa9d7b0cdf..0000000000 --- a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/6b/6c2067c6d968f9bddb9b900ee1ab7e5b067430 +++ /dev/null @@ -1,2 +0,0 @@ -xĄÎ; -1…aë¬âö‚äť X)¸‹$săD3ćş{.Áö+ţsšsjŔ…޵‚ 'Łfg=Cm⤄çA §ĄŐ LîqŠŢGř°h­Ůé~učż$ć+g¨­+H[Ć^`ŢČŹQW \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/7a/de76dd34bba4733cf9878079f9fd4a456a9189 b/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/7a/de76dd34bba4733cf9878079f9fd4a456a9189 deleted file mode 100644 index cf9bdaa5fd..0000000000 --- a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/7a/de76dd34bba4733cf9878079f9fd4a456a9189 +++ /dev/null @@ -1,3 +0,0 @@ -xĄŽA -Â0E]çłd’4M"î÷`šm…´5IŢޢGpű>Ľ˙âśŇXÁ4aWł°nŚ3â y Ś–,[F­í˝ôH­oD-”eŞĐ -:ŠŃ‘cęzš0FĽ÷Űb™C×ĂŠÖ:Ě®_«¸HNcÖwăóÇçRóH•qN'Đ6x­˝F {4jŁ[j•ż$ę¶0Uĺű_Ćy*ę&R \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/7a/ff11da95ca2be0bfb74b06e7cc1c480559dbe7 b/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/7a/ff11da95ca2be0bfb74b06e7cc1c480559dbe7 deleted file mode 100644 index d8c9934f7a..0000000000 Binary files a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/7a/ff11da95ca2be0bfb74b06e7cc1c480559dbe7 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/7f/854619451620f7fbcec7ea171675e615ce92b6 b/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/7f/854619451620f7fbcec7ea171675e615ce92b6 deleted file mode 100644 index df4cbb3226..0000000000 Binary files a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/7f/854619451620f7fbcec7ea171675e615ce92b6 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/87/3806f6f27e631eb0b23e4b56bea2bfac14a373 b/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/87/3806f6f27e631eb0b23e4b56bea2bfac14a373 deleted file mode 100644 index 890abcd4a9..0000000000 Binary files a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/87/3806f6f27e631eb0b23e4b56bea2bfac14a373 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/89/47a46e2097638ca6040ad4877246f4186ec3bd b/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/89/47a46e2097638ca6040ad4877246f4186ec3bd deleted file mode 100644 index d4018bf8e9..0000000000 --- a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/89/47a46e2097638ca6040ad4877246f4186ec3bd +++ /dev/null @@ -1,2 +0,0 @@ -x•ŽAjĂ0EłÖ)´/„ŃŚ,ÉJw….{‘ňť8 ;•ĺEo_C{nßâ˝WÖZçnYŇ©7Ŕ:¤8\uĚ!NiĚ@0qaWR4FožÚ°t›˘$ -S8"C¦Ěꇎś'-ΫD1ş÷űÚ쇖Ż›}G«óvßż7{yü˛ŰŰÖ۬]Ďe­ŻÖɢ‘ĽŘb"sĐcµăßöÎńźÄ|bŃŠ«ůţűLĘ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/89/7d3af16ca9e420cd071b1c4541bd2b91d04c8c b/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/89/7d3af16ca9e420cd071b1c4541bd2b91d04c8c deleted file mode 100644 index 1dce143b76..0000000000 --- a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/89/7d3af16ca9e420cd071b1c4541bd2b91d04c8c +++ /dev/null @@ -1 +0,0 @@ -xĄÎANÄ0 @QÖ9…÷HȵÓ$•šY!q '±™ éŇt1·g$ŽŔö-ľ~ŮÖµ źžFWb[hńˇ˛qĘ´XY“Ć)™•9Qđî[şŢ¤Č ٍ'͉Őç9dĘ&eň‘ťă˛uřňsčďÚ×¶_ŽűŻ_öyÚGo2äĄlëLĽDŹ3§ĎHա˙Џs­Z!·›ô;X»Şű"Pq \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/8d/7523f6fcb2404257889abe0d96f093d9f524f9 b/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/8d/7523f6fcb2404257889abe0d96f093d9f524f9 deleted file mode 100644 index 903ec751c9..0000000000 --- a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/8d/7523f6fcb2404257889abe0d96f093d9f524f9 +++ /dev/null @@ -1 +0,0 @@ -xĄÎAJĹ0€a×9Ĺě™IÓ¤w‚ŕ!f&_äőUÓtńnoÁ#¸ýżnëÚř™F7JZąLŃňT$%ŚBQ¬ÎV—ŕ…ÉfeŚ,î›»Ý,9•‰+EĺlÁŁL$¤a$ĹK¦‚Au|ŚËÖáťőç°ެŻmż÷žżţÚçë>zăÁOş­/@SNOfGôî¬çę°!îc+­6+ íĆýµ]ÍýERÚ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/8d/fa038554d5b682a51bda8ee3038cee6c63be76 b/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/8d/fa038554d5b682a51bda8ee3038cee6c63be76 deleted file mode 100644 index b5e08f901f..0000000000 Binary files a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/8d/fa038554d5b682a51bda8ee3038cee6c63be76 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/92/64b96c6d104d0e07ae33d3007b6a48246c6f92 b/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/92/64b96c6d104d0e07ae33d3007b6a48246c6f92 deleted file mode 100644 index 75b047a64a..0000000000 Binary files a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/92/64b96c6d104d0e07ae33d3007b6a48246c6f92 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/94/350226b3aa14efac831c803a51f7a09f3fc31a b/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/94/350226b3aa14efac831c803a51f7a09f3fc31a deleted file mode 100644 index a5286bc68f..0000000000 Binary files a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/94/350226b3aa14efac831c803a51f7a09f3fc31a and /dev/null differ diff --git a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/94/75e21dcbc515af8f641576400e4b450e5f4c03 b/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/94/75e21dcbc515af8f641576400e4b450e5f4c03 deleted file mode 100644 index 9e26e34cd9..0000000000 Binary files a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/94/75e21dcbc515af8f641576400e4b450e5f4c03 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/94/aaae8954e8bb613de636071da663a621695911 b/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/94/aaae8954e8bb613de636071da663a621695911 deleted file mode 100644 index 5fc167e796..0000000000 Binary files a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/94/aaae8954e8bb613de636071da663a621695911 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/9a/2d780ac2ea0aeabdb9d2a876e6bbfff17b2c44 b/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/9a/2d780ac2ea0aeabdb9d2a876e6bbfff17b2c44 deleted file mode 100644 index be48c275e0..0000000000 Binary files a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/9a/2d780ac2ea0aeabdb9d2a876e6bbfff17b2c44 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/9a/c0329b8b7a4046210d8b8b02ac02055667de63 b/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/9a/c0329b8b7a4046210d8b8b02ac02055667de63 deleted file mode 100644 index f322a7ce46..0000000000 Binary files a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/9a/c0329b8b7a4046210d8b8b02ac02055667de63 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/9a/c35ff15cd8864aeafd889e4826a3150f0b06c4 b/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/9a/c35ff15cd8864aeafd889e4826a3150f0b06c4 deleted file mode 100644 index 75cd714269..0000000000 Binary files a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/9a/c35ff15cd8864aeafd889e4826a3150f0b06c4 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/9b/997daca2a0beb5cc44b32c64f100a9a26d4d4b b/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/9b/997daca2a0beb5cc44b32c64f100a9a26d4d4b deleted file mode 100644 index d84ab8dcc0..0000000000 Binary files a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/9b/997daca2a0beb5cc44b32c64f100a9a26d4d4b and /dev/null differ diff --git a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/a3/ac918e3a6604294b239cb956363e83d71abb3b b/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/a3/ac918e3a6604294b239cb956363e83d71abb3b deleted file mode 100644 index a693df5c84..0000000000 --- a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/a3/ac918e3a6604294b239cb956363e83d71abb3b +++ /dev/null @@ -1 +0,0 @@ -xĄÎMJ1@a×9Eí©TçDf7 xJRĺD¦§5ť^ĚíđnżĹăŐm]űňöih±çbSK5pâÂ)RDô.‘˛V­ĄŮ|óۄԢ§EÖBůRć"ŘrPĚKËęÉi6|ĚË6ŕťëĎ!;śe¬}ż÷^żţěó´ĎŃyňKÝÖ7°KŽC ĎH桏Ő)˙ŠŹ­uíŇ ôŹ;hżŠůÜüQK \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/a5/ac978d4f2a1784f847f41223a34c3e78934238 b/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/a5/ac978d4f2a1784f847f41223a34c3e78934238 deleted file mode 100644 index f0483943b9..0000000000 Binary files a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/a5/ac978d4f2a1784f847f41223a34c3e78934238 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/a7/29eab45c84563135e8631d4010230bc0479f1f b/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/a7/29eab45c84563135e8631d4010230bc0479f1f deleted file mode 100644 index 5c1faf009b..0000000000 Binary files a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/a7/29eab45c84563135e8631d4010230bc0479f1f and /dev/null differ diff --git a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/a9/7157a0d0571698728b6f2f7675b456c98c5961 b/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/a9/7157a0d0571698728b6f2f7675b456c98c5961 deleted file mode 100644 index 3baf494bef..0000000000 Binary files a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/a9/7157a0d0571698728b6f2f7675b456c98c5961 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/af/8f41d0cb7a3079a8f8e231ea2ab8b97837ce13 b/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/af/8f41d0cb7a3079a8f8e231ea2ab8b97837ce13 deleted file mode 100644 index f0dcaa9acb..0000000000 Binary files a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/af/8f41d0cb7a3079a8f8e231ea2ab8b97837ce13 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/b0/5cecf1949d192b6df852b3f71853ef820ee235 b/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/b0/5cecf1949d192b6df852b3f71853ef820ee235 deleted file mode 100644 index 28e148f418..0000000000 Binary files a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/b0/5cecf1949d192b6df852b3f71853ef820ee235 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/b4/f457c219dbb3517be908d4e70f0ada2fd8b8f9 b/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/b4/f457c219dbb3517be908d4e70f0ada2fd8b8f9 deleted file mode 100644 index 0c74e76964..0000000000 Binary files a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/b4/f457c219dbb3517be908d4e70f0ada2fd8b8f9 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/bd/474b2519cc15eab801ff851cc7d50f0dee49a1 b/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/bd/474b2519cc15eab801ff851cc7d50f0dee49a1 deleted file mode 100644 index 2dc82087b9..0000000000 Binary files a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/bd/474b2519cc15eab801ff851cc7d50f0dee49a1 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/bd/f7ba6bc5c4e57ca6595928dcbe6753c8a663ff b/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/bd/f7ba6bc5c4e57ca6595928dcbe6753c8a663ff deleted file mode 100644 index af0232aa14..0000000000 Binary files a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/bd/f7ba6bc5c4e57ca6595928dcbe6753c8a663ff and /dev/null differ diff --git a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/cb/a89408dc016f4caddb6dc886fcb58f587a78df b/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/cb/a89408dc016f4caddb6dc886fcb58f587a78df deleted file mode 100644 index e03c749355..0000000000 --- a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/cb/a89408dc016f4caddb6dc886fcb58f587a78df +++ /dev/null @@ -1,3 +0,0 @@ -xĄÎK -Â0FaÇYE悤ąÍCq&8t7É[!­¦éŔÝ[p NżÁáÄą”±IM~×* }ʬČÓ'¬×lşŘ´il´ŕ¬xqĹÔ¤wä•Í6kK‚ -šĐcX‡Ě±ë™ ^Ű0Wyăř^±Č+j—aý,ňôüŮ㲴:răCśËYvttZUOrŻ´RbÓmµáݏcâ‚$ľ’ĎM‘ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/cd/471f0d8770371e1bc78bcbb38db4c7e4106bd2 b/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/cd/471f0d8770371e1bc78bcbb38db4c7e4106bd2 deleted file mode 100644 index 155b452733..0000000000 Binary files a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/cd/471f0d8770371e1bc78bcbb38db4c7e4106bd2 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/cd/ed722d05305c6b181f188c118d2d9810f39bb8 b/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/cd/ed722d05305c6b181f188c118d2d9810f39bb8 deleted file mode 100644 index fd93636125..0000000000 Binary files a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/cd/ed722d05305c6b181f188c118d2d9810f39bb8 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/ce/2792fcae8d704a56901754a0583a7418a21d8a b/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/ce/2792fcae8d704a56901754a0583a7418a21d8a deleted file mode 100644 index 5863cec1ba..0000000000 Binary files a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/ce/2792fcae8d704a56901754a0583a7418a21d8a and /dev/null differ diff --git a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/d1/4aa252e52a709d03a3d3d0d965e177eb0a674e b/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/d1/4aa252e52a709d03a3d3d0d965e177eb0a674e deleted file mode 100644 index a5d4d78e98..0000000000 --- a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/d1/4aa252e52a709d03a3d3d0d965e177eb0a674e +++ /dev/null @@ -1 +0,0 @@ -x+)JMU01e040075UHËĚI5Ô+©(Ń+JÍKĚMMaXYľŕB¸ŘŚ˘î|ý˛Ň-a'{"Íz \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/d7/bb447df12c6a8aba8727005482fb211f11297a b/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/d7/bb447df12c6a8aba8727005482fb211f11297a deleted file mode 100644 index 85eb8141ce..0000000000 Binary files a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/d7/bb447df12c6a8aba8727005482fb211f11297a and /dev/null differ diff --git a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/db/e8727e4806ae88ccc3f0755cae8f8cb7efa2cc b/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/db/e8727e4806ae88ccc3f0755cae8f8cb7efa2cc deleted file mode 100644 index 8e250ece28..0000000000 Binary files a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/db/e8727e4806ae88ccc3f0755cae8f8cb7efa2cc and /dev/null differ diff --git a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/e1/2af77c510e8ce4c261a3758736109c2c2dd1f0 b/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/e1/2af77c510e8ce4c261a3758736109c2c2dd1f0 deleted file mode 100644 index 92a89a2cf6..0000000000 Binary files a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/e1/2af77c510e8ce4c261a3758736109c2c2dd1f0 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391 b/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391 deleted file mode 100644 index 7112238943..0000000000 Binary files a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/e9/091231467304a5ef112de02361d795ef051ee1 b/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/e9/091231467304a5ef112de02361d795ef051ee1 deleted file mode 100644 index 43a006231e..0000000000 Binary files a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/e9/091231467304a5ef112de02361d795ef051ee1 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/ee/251372f131d82e575f16fe51c778406d88f8c2 b/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/ee/251372f131d82e575f16fe51c778406d88f8c2 deleted file mode 100644 index ee1edad9a2..0000000000 --- a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/ee/251372f131d82e575f16fe51c778406d88f8c2 +++ /dev/null @@ -1,2 +0,0 @@ -xĄÎM -Â0@a×9Eö‚dň3“€+o‘¦ˇ¶¦)čí-x·ßâńŇ4ŽĄImp×*łÔ9Sçu$\0NuÉŘ1Ű^%ďu/ćXůŮ$eď,B°P«LąKś# 9Fp‰îPĵ S•·^+/ňĘu,˰~y|üě~^Z-±ĹCšĆ“H‘˛hĺ^iĄÄ¦Űjăż"âRŢë,ľHrKď \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/f3/d35bd592fefd8280fc0c302fa9f27dbdd721a3 b/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/f3/d35bd592fefd8280fc0c302fa9f27dbdd721a3 deleted file mode 100644 index 62d747cf67..0000000000 --- a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/f3/d35bd592fefd8280fc0c302fa9f27dbdd721a3 +++ /dev/null @@ -1 +0,0 @@ -xĄÍA @Qלbö&fhi)‰1îŚŢb€A1b#LŢŢ&=‚Űżx?ĚĄdíěN*3x“Ě`C§]ôľ´őěpІ-&¤H]Š“ź’S´Čc®pŁđY¸Á…kÉí±|ź[»ź›ÔLB‡0—čŢYűq4°ÇQ­u] ˙…¨ë;K¦lšúH°Bż \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/f4/07be01334e07bfb8f57cd2078f0ee3eb61e085 b/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/f4/07be01334e07bfb8f57cd2078f0ee3eb61e085 deleted file mode 100644 index d858a87b54..0000000000 --- a/vendor/libgit2/tests/resources/diff_format_email/.gitted/objects/f4/07be01334e07bfb8f57cd2078f0ee3eb61e085 +++ /dev/null @@ -1 +0,0 @@ -xĄÎMNÄ0 @aÖ9…÷”8®ÓH±CBâNâ™v íL~Üž‘8Űońôň±mk¤řĐ«*pŇĹ„–Ć31M¬6L1'4'rJŮ\ĄęŢ!„bĹkń=KäĘÄt˛sáąřä™ zgdôĺ¨đ!ů6´Á»ÖmmËřiđrůłó[ëu•.ĎůŘ^ÁůĐš 1336844322 -0300 commit (initial): commit diff --git a/vendor/libgit2/tests/resources/duplicate.git/logs/refs/heads/master b/vendor/libgit2/tests/resources/duplicate.git/logs/refs/heads/master deleted file mode 100644 index be9b4c6cb1..0000000000 --- a/vendor/libgit2/tests/resources/duplicate.git/logs/refs/heads/master +++ /dev/null @@ -1 +0,0 @@ -0000000000000000000000000000000000000000 8d2f05c97ef29a4697b37c30fe81c248ef411a23 Han-Wen Nienhuys 1336844322 -0300 commit (initial): commit diff --git a/vendor/libgit2/tests/resources/duplicate.git/objects/03/8d718da6a1ebbc6a7780a96ed75a70cc2ad6e2 b/vendor/libgit2/tests/resources/duplicate.git/objects/03/8d718da6a1ebbc6a7780a96ed75a70cc2ad6e2 deleted file mode 100644 index 7350d98a23..0000000000 Binary files a/vendor/libgit2/tests/resources/duplicate.git/objects/03/8d718da6a1ebbc6a7780a96ed75a70cc2ad6e2 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/duplicate.git/objects/0d/deadede9e6d6ccddce0ee1e5749eed0485e5ea b/vendor/libgit2/tests/resources/duplicate.git/objects/0d/deadede9e6d6ccddce0ee1e5749eed0485e5ea deleted file mode 100644 index 47c2a631ab..0000000000 Binary files a/vendor/libgit2/tests/resources/duplicate.git/objects/0d/deadede9e6d6ccddce0ee1e5749eed0485e5ea and /dev/null differ diff --git a/vendor/libgit2/tests/resources/duplicate.git/objects/ce/013625030ba8dba906f756967f9e9ca394464a b/vendor/libgit2/tests/resources/duplicate.git/objects/ce/013625030ba8dba906f756967f9e9ca394464a deleted file mode 100644 index 6802d49492..0000000000 Binary files a/vendor/libgit2/tests/resources/duplicate.git/objects/ce/013625030ba8dba906f756967f9e9ca394464a and /dev/null differ diff --git a/vendor/libgit2/tests/resources/duplicate.git/objects/info/packs b/vendor/libgit2/tests/resources/duplicate.git/objects/info/packs deleted file mode 100644 index d0fdf905e7..0000000000 --- a/vendor/libgit2/tests/resources/duplicate.git/objects/info/packs +++ /dev/null @@ -1,3 +0,0 @@ -P pack-e87994ad581c9af946de0eb890175c08cd005f38.pack -P pack-f4ef1aa326265de7d05018ee51acc0a8717fe1ea.pack - diff --git a/vendor/libgit2/tests/resources/duplicate.git/objects/pack/pack-29a4896f0a0b9c9947b0927c57a5c03dcae052e3.idx b/vendor/libgit2/tests/resources/duplicate.git/objects/pack/pack-29a4896f0a0b9c9947b0927c57a5c03dcae052e3.idx deleted file mode 100644 index acbed82b6f..0000000000 Binary files a/vendor/libgit2/tests/resources/duplicate.git/objects/pack/pack-29a4896f0a0b9c9947b0927c57a5c03dcae052e3.idx and /dev/null differ diff --git a/vendor/libgit2/tests/resources/duplicate.git/objects/pack/pack-29a4896f0a0b9c9947b0927c57a5c03dcae052e3.pack b/vendor/libgit2/tests/resources/duplicate.git/objects/pack/pack-29a4896f0a0b9c9947b0927c57a5c03dcae052e3.pack deleted file mode 100644 index 652b0c91fe..0000000000 Binary files a/vendor/libgit2/tests/resources/duplicate.git/objects/pack/pack-29a4896f0a0b9c9947b0927c57a5c03dcae052e3.pack and /dev/null differ diff --git a/vendor/libgit2/tests/resources/duplicate.git/objects/pack/pack-b18eeacbd65cbd30a365d7564b45a468e8bd43d6.idx b/vendor/libgit2/tests/resources/duplicate.git/objects/pack/pack-b18eeacbd65cbd30a365d7564b45a468e8bd43d6.idx deleted file mode 100644 index fff6855545..0000000000 Binary files a/vendor/libgit2/tests/resources/duplicate.git/objects/pack/pack-b18eeacbd65cbd30a365d7564b45a468e8bd43d6.idx and /dev/null differ diff --git a/vendor/libgit2/tests/resources/duplicate.git/objects/pack/pack-b18eeacbd65cbd30a365d7564b45a468e8bd43d6.pack b/vendor/libgit2/tests/resources/duplicate.git/objects/pack/pack-b18eeacbd65cbd30a365d7564b45a468e8bd43d6.pack deleted file mode 100644 index e3e5f0e098..0000000000 Binary files a/vendor/libgit2/tests/resources/duplicate.git/objects/pack/pack-b18eeacbd65cbd30a365d7564b45a468e8bd43d6.pack and /dev/null differ diff --git a/vendor/libgit2/tests/resources/duplicate.git/objects/pack/pack-e87994ad581c9af946de0eb890175c08cd005f38.idx b/vendor/libgit2/tests/resources/duplicate.git/objects/pack/pack-e87994ad581c9af946de0eb890175c08cd005f38.idx deleted file mode 100644 index fd8abee98e..0000000000 Binary files a/vendor/libgit2/tests/resources/duplicate.git/objects/pack/pack-e87994ad581c9af946de0eb890175c08cd005f38.idx and /dev/null differ diff --git a/vendor/libgit2/tests/resources/duplicate.git/objects/pack/pack-e87994ad581c9af946de0eb890175c08cd005f38.pack b/vendor/libgit2/tests/resources/duplicate.git/objects/pack/pack-e87994ad581c9af946de0eb890175c08cd005f38.pack deleted file mode 100644 index 9879e08696..0000000000 Binary files a/vendor/libgit2/tests/resources/duplicate.git/objects/pack/pack-e87994ad581c9af946de0eb890175c08cd005f38.pack and /dev/null differ diff --git a/vendor/libgit2/tests/resources/duplicate.git/objects/pack/pack-f4ef1aa326265de7d05018ee51acc0a8717fe1ea.idx b/vendor/libgit2/tests/resources/duplicate.git/objects/pack/pack-f4ef1aa326265de7d05018ee51acc0a8717fe1ea.idx deleted file mode 100644 index 9f78f6e0f7..0000000000 Binary files a/vendor/libgit2/tests/resources/duplicate.git/objects/pack/pack-f4ef1aa326265de7d05018ee51acc0a8717fe1ea.idx and /dev/null differ diff --git a/vendor/libgit2/tests/resources/duplicate.git/objects/pack/pack-f4ef1aa326265de7d05018ee51acc0a8717fe1ea.pack b/vendor/libgit2/tests/resources/duplicate.git/objects/pack/pack-f4ef1aa326265de7d05018ee51acc0a8717fe1ea.pack deleted file mode 100644 index d1dd3b61af..0000000000 Binary files a/vendor/libgit2/tests/resources/duplicate.git/objects/pack/pack-f4ef1aa326265de7d05018ee51acc0a8717fe1ea.pack and /dev/null differ diff --git a/vendor/libgit2/tests/resources/duplicate.git/packed-refs b/vendor/libgit2/tests/resources/duplicate.git/packed-refs deleted file mode 100644 index 9f0d4e434b..0000000000 --- a/vendor/libgit2/tests/resources/duplicate.git/packed-refs +++ /dev/null @@ -1,2 +0,0 @@ -# pack-refs with: peeled -8d2f05c97ef29a4697b37c30fe81c248ef411a23 refs/heads/master diff --git a/vendor/libgit2/tests/resources/duplicate.git/refs/heads/dummy-marker.txt b/vendor/libgit2/tests/resources/duplicate.git/refs/heads/dummy-marker.txt deleted file mode 100644 index 421376db9e..0000000000 --- a/vendor/libgit2/tests/resources/duplicate.git/refs/heads/dummy-marker.txt +++ /dev/null @@ -1 +0,0 @@ -dummy diff --git a/vendor/libgit2/tests/resources/empty_bare.git/HEAD b/vendor/libgit2/tests/resources/empty_bare.git/HEAD deleted file mode 100644 index cb089cd89a..0000000000 --- a/vendor/libgit2/tests/resources/empty_bare.git/HEAD +++ /dev/null @@ -1 +0,0 @@ -ref: refs/heads/master diff --git a/vendor/libgit2/tests/resources/empty_bare.git/config b/vendor/libgit2/tests/resources/empty_bare.git/config deleted file mode 100644 index 90e16477bd..0000000000 --- a/vendor/libgit2/tests/resources/empty_bare.git/config +++ /dev/null @@ -1,7 +0,0 @@ -[core] - repositoryformatversion = 0 - filemode = false - bare = true - symlinks = false - ignorecase = true - hideDotFiles = dotGitOnly diff --git a/vendor/libgit2/tests/resources/empty_bare.git/description b/vendor/libgit2/tests/resources/empty_bare.git/description deleted file mode 100644 index 498b267a8c..0000000000 --- a/vendor/libgit2/tests/resources/empty_bare.git/description +++ /dev/null @@ -1 +0,0 @@ -Unnamed repository; edit this file 'description' to name the repository. diff --git a/vendor/libgit2/tests/resources/empty_bare.git/info/exclude b/vendor/libgit2/tests/resources/empty_bare.git/info/exclude deleted file mode 100644 index a5196d1be8..0000000000 --- a/vendor/libgit2/tests/resources/empty_bare.git/info/exclude +++ /dev/null @@ -1,6 +0,0 @@ -# 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/vendor/libgit2/tests/resources/empty_bare.git/objects/info/dummy-marker.txt b/vendor/libgit2/tests/resources/empty_bare.git/objects/info/dummy-marker.txt deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/vendor/libgit2/tests/resources/empty_bare.git/objects/pack/dummy-marker.txt b/vendor/libgit2/tests/resources/empty_bare.git/objects/pack/dummy-marker.txt deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/vendor/libgit2/tests/resources/empty_bare.git/refs/heads/dummy-marker.txt b/vendor/libgit2/tests/resources/empty_bare.git/refs/heads/dummy-marker.txt deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/vendor/libgit2/tests/resources/empty_standard_repo/.gitted/HEAD b/vendor/libgit2/tests/resources/empty_standard_repo/.gitted/HEAD deleted file mode 100644 index cb089cd89a..0000000000 --- a/vendor/libgit2/tests/resources/empty_standard_repo/.gitted/HEAD +++ /dev/null @@ -1 +0,0 @@ -ref: refs/heads/master diff --git a/vendor/libgit2/tests/resources/empty_standard_repo/.gitted/config b/vendor/libgit2/tests/resources/empty_standard_repo/.gitted/config deleted file mode 100644 index 78387c50b4..0000000000 --- a/vendor/libgit2/tests/resources/empty_standard_repo/.gitted/config +++ /dev/null @@ -1,8 +0,0 @@ -[core] - repositoryformatversion = 0 - filemode = false - bare = false - logallrefupdates = true - symlinks = false - ignorecase = true - hideDotFiles = dotGitOnly diff --git a/vendor/libgit2/tests/resources/empty_standard_repo/.gitted/description b/vendor/libgit2/tests/resources/empty_standard_repo/.gitted/description deleted file mode 100644 index 498b267a8c..0000000000 --- a/vendor/libgit2/tests/resources/empty_standard_repo/.gitted/description +++ /dev/null @@ -1 +0,0 @@ -Unnamed repository; edit this file 'description' to name the repository. diff --git a/vendor/libgit2/tests/resources/empty_standard_repo/.gitted/info/exclude b/vendor/libgit2/tests/resources/empty_standard_repo/.gitted/info/exclude deleted file mode 100644 index a5196d1be8..0000000000 --- a/vendor/libgit2/tests/resources/empty_standard_repo/.gitted/info/exclude +++ /dev/null @@ -1,6 +0,0 @@ -# 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/vendor/libgit2/tests/resources/empty_standard_repo/.gitted/objects/info/dummy-marker.txt b/vendor/libgit2/tests/resources/empty_standard_repo/.gitted/objects/info/dummy-marker.txt deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/vendor/libgit2/tests/resources/empty_standard_repo/.gitted/objects/pack/dummy-marker.txt b/vendor/libgit2/tests/resources/empty_standard_repo/.gitted/objects/pack/dummy-marker.txt deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/vendor/libgit2/tests/resources/empty_standard_repo/.gitted/refs/heads/dummy-marker.txt b/vendor/libgit2/tests/resources/empty_standard_repo/.gitted/refs/heads/dummy-marker.txt deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/vendor/libgit2/tests/resources/filemodes/.gitted/HEAD b/vendor/libgit2/tests/resources/filemodes/.gitted/HEAD deleted file mode 100644 index cb089cd89a..0000000000 --- a/vendor/libgit2/tests/resources/filemodes/.gitted/HEAD +++ /dev/null @@ -1 +0,0 @@ -ref: refs/heads/master diff --git a/vendor/libgit2/tests/resources/filemodes/.gitted/config b/vendor/libgit2/tests/resources/filemodes/.gitted/config deleted file mode 100644 index af107929f2..0000000000 --- a/vendor/libgit2/tests/resources/filemodes/.gitted/config +++ /dev/null @@ -1,6 +0,0 @@ -[core] - repositoryformatversion = 0 - filemode = true - bare = false - logallrefupdates = true - ignorecase = true diff --git a/vendor/libgit2/tests/resources/filemodes/.gitted/description b/vendor/libgit2/tests/resources/filemodes/.gitted/description deleted file mode 100644 index 498b267a8c..0000000000 --- a/vendor/libgit2/tests/resources/filemodes/.gitted/description +++ /dev/null @@ -1 +0,0 @@ -Unnamed repository; edit this file 'description' to name the repository. diff --git a/vendor/libgit2/tests/resources/filemodes/.gitted/index b/vendor/libgit2/tests/resources/filemodes/.gitted/index deleted file mode 100644 index b1b175a9b5..0000000000 Binary files a/vendor/libgit2/tests/resources/filemodes/.gitted/index and /dev/null differ diff --git a/vendor/libgit2/tests/resources/filemodes/.gitted/info/exclude b/vendor/libgit2/tests/resources/filemodes/.gitted/info/exclude deleted file mode 100644 index a5196d1be8..0000000000 --- a/vendor/libgit2/tests/resources/filemodes/.gitted/info/exclude +++ /dev/null @@ -1,6 +0,0 @@ -# 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/vendor/libgit2/tests/resources/filemodes/.gitted/logs/HEAD b/vendor/libgit2/tests/resources/filemodes/.gitted/logs/HEAD deleted file mode 100644 index 1cb6a84c19..0000000000 --- a/vendor/libgit2/tests/resources/filemodes/.gitted/logs/HEAD +++ /dev/null @@ -1 +0,0 @@ -0000000000000000000000000000000000000000 9962c8453ba6f0cf8dac7c5dcc2fa2897fa9964a Russell Belfer 1338847682 -0700 commit (initial): Initial commit of test data diff --git a/vendor/libgit2/tests/resources/filemodes/.gitted/logs/refs/heads/master b/vendor/libgit2/tests/resources/filemodes/.gitted/logs/refs/heads/master deleted file mode 100644 index 1cb6a84c19..0000000000 --- a/vendor/libgit2/tests/resources/filemodes/.gitted/logs/refs/heads/master +++ /dev/null @@ -1 +0,0 @@ -0000000000000000000000000000000000000000 9962c8453ba6f0cf8dac7c5dcc2fa2897fa9964a Russell Belfer 1338847682 -0700 commit (initial): Initial commit of test data diff --git a/vendor/libgit2/tests/resources/filemodes/.gitted/objects/99/62c8453ba6f0cf8dac7c5dcc2fa2897fa9964a b/vendor/libgit2/tests/resources/filemodes/.gitted/objects/99/62c8453ba6f0cf8dac7c5dcc2fa2897fa9964a deleted file mode 100644 index cbd2b557ae..0000000000 Binary files a/vendor/libgit2/tests/resources/filemodes/.gitted/objects/99/62c8453ba6f0cf8dac7c5dcc2fa2897fa9964a and /dev/null differ diff --git a/vendor/libgit2/tests/resources/filemodes/.gitted/objects/a5/c5dd0fc6c313159a69b1d19d7f61a9f978e8f1 b/vendor/libgit2/tests/resources/filemodes/.gitted/objects/a5/c5dd0fc6c313159a69b1d19d7f61a9f978e8f1 deleted file mode 100644 index a9eaf2cba8..0000000000 Binary files a/vendor/libgit2/tests/resources/filemodes/.gitted/objects/a5/c5dd0fc6c313159a69b1d19d7f61a9f978e8f1 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/filemodes/.gitted/objects/e7/48d196331bcb20267eaaee4ff3326cb73b8182 b/vendor/libgit2/tests/resources/filemodes/.gitted/objects/e7/48d196331bcb20267eaaee4ff3326cb73b8182 deleted file mode 100644 index 98066029c1..0000000000 Binary files a/vendor/libgit2/tests/resources/filemodes/.gitted/objects/e7/48d196331bcb20267eaaee4ff3326cb73b8182 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/filemodes/.gitted/refs/heads/master b/vendor/libgit2/tests/resources/filemodes/.gitted/refs/heads/master deleted file mode 100644 index 9822d2d3fb..0000000000 --- a/vendor/libgit2/tests/resources/filemodes/.gitted/refs/heads/master +++ /dev/null @@ -1 +0,0 @@ -9962c8453ba6f0cf8dac7c5dcc2fa2897fa9964a diff --git a/vendor/libgit2/tests/resources/filemodes/exec_off b/vendor/libgit2/tests/resources/filemodes/exec_off deleted file mode 100644 index a5c5dd0fc6..0000000000 --- a/vendor/libgit2/tests/resources/filemodes/exec_off +++ /dev/null @@ -1 +0,0 @@ -Howdy diff --git a/vendor/libgit2/tests/resources/filemodes/exec_off2on_staged b/vendor/libgit2/tests/resources/filemodes/exec_off2on_staged deleted file mode 100755 index a5c5dd0fc6..0000000000 --- a/vendor/libgit2/tests/resources/filemodes/exec_off2on_staged +++ /dev/null @@ -1 +0,0 @@ -Howdy diff --git a/vendor/libgit2/tests/resources/filemodes/exec_off2on_workdir b/vendor/libgit2/tests/resources/filemodes/exec_off2on_workdir deleted file mode 100755 index a5c5dd0fc6..0000000000 --- a/vendor/libgit2/tests/resources/filemodes/exec_off2on_workdir +++ /dev/null @@ -1 +0,0 @@ -Howdy diff --git a/vendor/libgit2/tests/resources/filemodes/exec_off_untracked b/vendor/libgit2/tests/resources/filemodes/exec_off_untracked deleted file mode 100644 index a5c5dd0fc6..0000000000 --- a/vendor/libgit2/tests/resources/filemodes/exec_off_untracked +++ /dev/null @@ -1 +0,0 @@ -Howdy diff --git a/vendor/libgit2/tests/resources/filemodes/exec_on b/vendor/libgit2/tests/resources/filemodes/exec_on deleted file mode 100755 index a5c5dd0fc6..0000000000 --- a/vendor/libgit2/tests/resources/filemodes/exec_on +++ /dev/null @@ -1 +0,0 @@ -Howdy diff --git a/vendor/libgit2/tests/resources/filemodes/exec_on2off_staged b/vendor/libgit2/tests/resources/filemodes/exec_on2off_staged deleted file mode 100644 index a5c5dd0fc6..0000000000 --- a/vendor/libgit2/tests/resources/filemodes/exec_on2off_staged +++ /dev/null @@ -1 +0,0 @@ -Howdy diff --git a/vendor/libgit2/tests/resources/filemodes/exec_on2off_workdir b/vendor/libgit2/tests/resources/filemodes/exec_on2off_workdir deleted file mode 100644 index a5c5dd0fc6..0000000000 --- a/vendor/libgit2/tests/resources/filemodes/exec_on2off_workdir +++ /dev/null @@ -1 +0,0 @@ -Howdy diff --git a/vendor/libgit2/tests/resources/filemodes/exec_on_untracked b/vendor/libgit2/tests/resources/filemodes/exec_on_untracked deleted file mode 100755 index a5c5dd0fc6..0000000000 --- a/vendor/libgit2/tests/resources/filemodes/exec_on_untracked +++ /dev/null @@ -1 +0,0 @@ -Howdy diff --git a/vendor/libgit2/tests/resources/gitgit.index b/vendor/libgit2/tests/resources/gitgit.index deleted file mode 100644 index 215da649e1..0000000000 Binary files a/vendor/libgit2/tests/resources/gitgit.index and /dev/null differ diff --git a/vendor/libgit2/tests/resources/icase/.gitted/HEAD b/vendor/libgit2/tests/resources/icase/.gitted/HEAD deleted file mode 100644 index cb089cd89a..0000000000 --- a/vendor/libgit2/tests/resources/icase/.gitted/HEAD +++ /dev/null @@ -1 +0,0 @@ -ref: refs/heads/master diff --git a/vendor/libgit2/tests/resources/icase/.gitted/config b/vendor/libgit2/tests/resources/icase/.gitted/config deleted file mode 100644 index bb4d11c1fa..0000000000 --- a/vendor/libgit2/tests/resources/icase/.gitted/config +++ /dev/null @@ -1,7 +0,0 @@ -[core] - repositoryformatversion = 0 - filemode = true - bare = false - logallrefupdates = true - ignorecase = true - precomposeunicode = false diff --git a/vendor/libgit2/tests/resources/icase/.gitted/description b/vendor/libgit2/tests/resources/icase/.gitted/description deleted file mode 100644 index 498b267a8c..0000000000 --- a/vendor/libgit2/tests/resources/icase/.gitted/description +++ /dev/null @@ -1 +0,0 @@ -Unnamed repository; edit this file 'description' to name the repository. diff --git a/vendor/libgit2/tests/resources/icase/.gitted/index b/vendor/libgit2/tests/resources/icase/.gitted/index deleted file mode 100644 index f8288ec137..0000000000 Binary files a/vendor/libgit2/tests/resources/icase/.gitted/index and /dev/null differ diff --git a/vendor/libgit2/tests/resources/icase/.gitted/info/exclude b/vendor/libgit2/tests/resources/icase/.gitted/info/exclude deleted file mode 100644 index a5196d1be8..0000000000 --- a/vendor/libgit2/tests/resources/icase/.gitted/info/exclude +++ /dev/null @@ -1,6 +0,0 @@ -# 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/vendor/libgit2/tests/resources/icase/.gitted/logs/HEAD b/vendor/libgit2/tests/resources/icase/.gitted/logs/HEAD deleted file mode 100644 index 3b16bd1633..0000000000 --- a/vendor/libgit2/tests/resources/icase/.gitted/logs/HEAD +++ /dev/null @@ -1 +0,0 @@ -0000000000000000000000000000000000000000 76d6e1d231b1085fcce151427e9899335de74be6 Russell Belfer 1359157123 -0800 commit (initial): initial commit diff --git a/vendor/libgit2/tests/resources/icase/.gitted/logs/refs/heads/master b/vendor/libgit2/tests/resources/icase/.gitted/logs/refs/heads/master deleted file mode 100644 index 3b16bd1633..0000000000 --- a/vendor/libgit2/tests/resources/icase/.gitted/logs/refs/heads/master +++ /dev/null @@ -1 +0,0 @@ -0000000000000000000000000000000000000000 76d6e1d231b1085fcce151427e9899335de74be6 Russell Belfer 1359157123 -0800 commit (initial): initial commit diff --git a/vendor/libgit2/tests/resources/icase/.gitted/objects/3e/257c57f136a1cb8f2b8e9a2e5bc8ec0258bdce b/vendor/libgit2/tests/resources/icase/.gitted/objects/3e/257c57f136a1cb8f2b8e9a2e5bc8ec0258bdce deleted file mode 100644 index 10691c788e..0000000000 Binary files a/vendor/libgit2/tests/resources/icase/.gitted/objects/3e/257c57f136a1cb8f2b8e9a2e5bc8ec0258bdce and /dev/null differ diff --git a/vendor/libgit2/tests/resources/icase/.gitted/objects/4d/d6027d083575c7431396dc2a3174afeb393c93 b/vendor/libgit2/tests/resources/icase/.gitted/objects/4d/d6027d083575c7431396dc2a3174afeb393c93 deleted file mode 100644 index 8ca70df172..0000000000 Binary files a/vendor/libgit2/tests/resources/icase/.gitted/objects/4d/d6027d083575c7431396dc2a3174afeb393c93 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/icase/.gitted/objects/62/e0af52c199ec731fe4ad230041cd3286192d49 b/vendor/libgit2/tests/resources/icase/.gitted/objects/62/e0af52c199ec731fe4ad230041cd3286192d49 deleted file mode 100644 index e264aeab3b..0000000000 Binary files a/vendor/libgit2/tests/resources/icase/.gitted/objects/62/e0af52c199ec731fe4ad230041cd3286192d49 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/icase/.gitted/objects/76/d6e1d231b1085fcce151427e9899335de74be6 b/vendor/libgit2/tests/resources/icase/.gitted/objects/76/d6e1d231b1085fcce151427e9899335de74be6 deleted file mode 100644 index 24a4b3ee3f..0000000000 --- a/vendor/libgit2/tests/resources/icase/.gitted/objects/76/d6e1d231b1085fcce151427e9899335de74be6 +++ /dev/null @@ -1,3 +0,0 @@ -x•ŤŰ 1EýNÓ€’c˛ ‹X‚dƉČČ&ý°/çśËußsăńÔ›8±č}2î SH–‚,Ń -am1Đ‹EĹŃ·Úŕ9ŽCJ‡”$ nŤîďÜ·A®ű -ĆábĐëŕ¬Öj®óŻOô_SĺOî9ř%Ô)Ś9š \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/icase/.gitted/objects/d4/4e18fb93b7107b5cd1b95d601591d77869a1b6 b/vendor/libgit2/tests/resources/icase/.gitted/objects/d4/4e18fb93b7107b5cd1b95d601591d77869a1b6 deleted file mode 100644 index 32d8c499f0..0000000000 Binary files a/vendor/libgit2/tests/resources/icase/.gitted/objects/d4/4e18fb93b7107b5cd1b95d601591d77869a1b6 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/icase/.gitted/refs/heads/master b/vendor/libgit2/tests/resources/icase/.gitted/refs/heads/master deleted file mode 100644 index 37410ec2a5..0000000000 --- a/vendor/libgit2/tests/resources/icase/.gitted/refs/heads/master +++ /dev/null @@ -1 +0,0 @@ -76d6e1d231b1085fcce151427e9899335de74be6 diff --git a/vendor/libgit2/tests/resources/icase/B b/vendor/libgit2/tests/resources/icase/B deleted file mode 100644 index d44e18fb93..0000000000 --- a/vendor/libgit2/tests/resources/icase/B +++ /dev/null @@ -1 +0,0 @@ -start diff --git a/vendor/libgit2/tests/resources/icase/D b/vendor/libgit2/tests/resources/icase/D deleted file mode 100644 index d44e18fb93..0000000000 --- a/vendor/libgit2/tests/resources/icase/D +++ /dev/null @@ -1 +0,0 @@ -start diff --git a/vendor/libgit2/tests/resources/icase/F b/vendor/libgit2/tests/resources/icase/F deleted file mode 100644 index d44e18fb93..0000000000 --- a/vendor/libgit2/tests/resources/icase/F +++ /dev/null @@ -1 +0,0 @@ -start diff --git a/vendor/libgit2/tests/resources/icase/H b/vendor/libgit2/tests/resources/icase/H deleted file mode 100644 index d44e18fb93..0000000000 --- a/vendor/libgit2/tests/resources/icase/H +++ /dev/null @@ -1 +0,0 @@ -start diff --git a/vendor/libgit2/tests/resources/icase/J b/vendor/libgit2/tests/resources/icase/J deleted file mode 100644 index d44e18fb93..0000000000 --- a/vendor/libgit2/tests/resources/icase/J +++ /dev/null @@ -1 +0,0 @@ -start diff --git a/vendor/libgit2/tests/resources/icase/L/1 b/vendor/libgit2/tests/resources/icase/L/1 deleted file mode 100644 index 62e0af52c1..0000000000 --- a/vendor/libgit2/tests/resources/icase/L/1 +++ /dev/null @@ -1 +0,0 @@ -sub diff --git a/vendor/libgit2/tests/resources/icase/L/B b/vendor/libgit2/tests/resources/icase/L/B deleted file mode 100644 index 62e0af52c1..0000000000 --- a/vendor/libgit2/tests/resources/icase/L/B +++ /dev/null @@ -1 +0,0 @@ -sub diff --git a/vendor/libgit2/tests/resources/icase/L/D b/vendor/libgit2/tests/resources/icase/L/D deleted file mode 100644 index 62e0af52c1..0000000000 --- a/vendor/libgit2/tests/resources/icase/L/D +++ /dev/null @@ -1 +0,0 @@ -sub diff --git a/vendor/libgit2/tests/resources/icase/L/a b/vendor/libgit2/tests/resources/icase/L/a deleted file mode 100644 index 62e0af52c1..0000000000 --- a/vendor/libgit2/tests/resources/icase/L/a +++ /dev/null @@ -1 +0,0 @@ -sub diff --git a/vendor/libgit2/tests/resources/icase/L/c b/vendor/libgit2/tests/resources/icase/L/c deleted file mode 100644 index 62e0af52c1..0000000000 --- a/vendor/libgit2/tests/resources/icase/L/c +++ /dev/null @@ -1 +0,0 @@ -sub diff --git a/vendor/libgit2/tests/resources/icase/a b/vendor/libgit2/tests/resources/icase/a deleted file mode 100644 index d44e18fb93..0000000000 --- a/vendor/libgit2/tests/resources/icase/a +++ /dev/null @@ -1 +0,0 @@ -start diff --git a/vendor/libgit2/tests/resources/icase/c b/vendor/libgit2/tests/resources/icase/c deleted file mode 100644 index d44e18fb93..0000000000 --- a/vendor/libgit2/tests/resources/icase/c +++ /dev/null @@ -1 +0,0 @@ -start diff --git a/vendor/libgit2/tests/resources/icase/e b/vendor/libgit2/tests/resources/icase/e deleted file mode 100644 index d44e18fb93..0000000000 --- a/vendor/libgit2/tests/resources/icase/e +++ /dev/null @@ -1 +0,0 @@ -start diff --git a/vendor/libgit2/tests/resources/icase/g b/vendor/libgit2/tests/resources/icase/g deleted file mode 100644 index d44e18fb93..0000000000 --- a/vendor/libgit2/tests/resources/icase/g +++ /dev/null @@ -1 +0,0 @@ -start diff --git a/vendor/libgit2/tests/resources/icase/i b/vendor/libgit2/tests/resources/icase/i deleted file mode 100644 index d44e18fb93..0000000000 --- a/vendor/libgit2/tests/resources/icase/i +++ /dev/null @@ -1 +0,0 @@ -start diff --git a/vendor/libgit2/tests/resources/icase/k/1 b/vendor/libgit2/tests/resources/icase/k/1 deleted file mode 100644 index 62e0af52c1..0000000000 --- a/vendor/libgit2/tests/resources/icase/k/1 +++ /dev/null @@ -1 +0,0 @@ -sub diff --git a/vendor/libgit2/tests/resources/icase/k/B b/vendor/libgit2/tests/resources/icase/k/B deleted file mode 100644 index 62e0af52c1..0000000000 --- a/vendor/libgit2/tests/resources/icase/k/B +++ /dev/null @@ -1 +0,0 @@ -sub diff --git a/vendor/libgit2/tests/resources/icase/k/D b/vendor/libgit2/tests/resources/icase/k/D deleted file mode 100644 index 62e0af52c1..0000000000 --- a/vendor/libgit2/tests/resources/icase/k/D +++ /dev/null @@ -1 +0,0 @@ -sub diff --git a/vendor/libgit2/tests/resources/icase/k/a b/vendor/libgit2/tests/resources/icase/k/a deleted file mode 100644 index 62e0af52c1..0000000000 --- a/vendor/libgit2/tests/resources/icase/k/a +++ /dev/null @@ -1 +0,0 @@ -sub diff --git a/vendor/libgit2/tests/resources/icase/k/c b/vendor/libgit2/tests/resources/icase/k/c deleted file mode 100644 index 62e0af52c1..0000000000 --- a/vendor/libgit2/tests/resources/icase/k/c +++ /dev/null @@ -1 +0,0 @@ -sub diff --git a/vendor/libgit2/tests/resources/issue_1397/.gitted/HEAD b/vendor/libgit2/tests/resources/issue_1397/.gitted/HEAD deleted file mode 100644 index cb089cd89a..0000000000 --- a/vendor/libgit2/tests/resources/issue_1397/.gitted/HEAD +++ /dev/null @@ -1 +0,0 @@ -ref: refs/heads/master diff --git a/vendor/libgit2/tests/resources/issue_1397/.gitted/config b/vendor/libgit2/tests/resources/issue_1397/.gitted/config deleted file mode 100644 index ba5bbde24b..0000000000 --- a/vendor/libgit2/tests/resources/issue_1397/.gitted/config +++ /dev/null @@ -1,6 +0,0 @@ -[core] - bare = false - repositoryformatversion = 0 - filemode = false - logallrefupdates = true - ignorecase = true diff --git a/vendor/libgit2/tests/resources/issue_1397/.gitted/index b/vendor/libgit2/tests/resources/issue_1397/.gitted/index deleted file mode 100644 index fa0f541d68..0000000000 Binary files a/vendor/libgit2/tests/resources/issue_1397/.gitted/index and /dev/null differ diff --git a/vendor/libgit2/tests/resources/issue_1397/.gitted/objects/7f/483a738f867e5b21c8f377d70311f011eb48b5 b/vendor/libgit2/tests/resources/issue_1397/.gitted/objects/7f/483a738f867e5b21c8f377d70311f011eb48b5 deleted file mode 100644 index 63bcb5d765..0000000000 --- a/vendor/libgit2/tests/resources/issue_1397/.gitted/objects/7f/483a738f867e5b21c8f377d70311f011eb48b5 +++ /dev/null @@ -1,3 +0,0 @@ -xťÎQNĂ0 €ažs -żŁ!'nâTBÓî°¸ŽC+Öe\Äv€˙ÓŻÇľoŃËčfP¦PL8FΆ‘ŇĚ%Ş_Ä‹b4ćIÜ—tk˛°Uś¸ęLdeIÁňd<3/|0ĄšjČää1ÖŁĂőŰ\Gßôłc…wŰe»]ô~úůߊťÁS -)ĎGxEŹčô˙qŘsµÓUÚ‡8šÁmkć~yIć \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/issue_1397/.gitted/objects/83/12e0889a9cbab77c732b6bc39b51a683e3a318 b/vendor/libgit2/tests/resources/issue_1397/.gitted/objects/83/12e0889a9cbab77c732b6bc39b51a683e3a318 deleted file mode 100644 index 06b59fede0..0000000000 Binary files a/vendor/libgit2/tests/resources/issue_1397/.gitted/objects/83/12e0889a9cbab77c732b6bc39b51a683e3a318 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/issue_1397/.gitted/objects/8a/7ef047fc933edb62e84e7977b0612ec3f6f283 b/vendor/libgit2/tests/resources/issue_1397/.gitted/objects/8a/7ef047fc933edb62e84e7977b0612ec3f6f283 deleted file mode 100644 index 19cfbeae24..0000000000 Binary files a/vendor/libgit2/tests/resources/issue_1397/.gitted/objects/8a/7ef047fc933edb62e84e7977b0612ec3f6f283 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/issue_1397/.gitted/objects/8e/8f80088a9274fd23584992f587083ca1bcbbac b/vendor/libgit2/tests/resources/issue_1397/.gitted/objects/8e/8f80088a9274fd23584992f587083ca1bcbbac deleted file mode 100644 index f5c776b170..0000000000 Binary files a/vendor/libgit2/tests/resources/issue_1397/.gitted/objects/8e/8f80088a9274fd23584992f587083ca1bcbbac and /dev/null differ diff --git a/vendor/libgit2/tests/resources/issue_1397/.gitted/objects/f2/c62dea0372a0578e053697d5c1ba1ac05e774a b/vendor/libgit2/tests/resources/issue_1397/.gitted/objects/f2/c62dea0372a0578e053697d5c1ba1ac05e774a deleted file mode 100644 index f932f36183..0000000000 Binary files a/vendor/libgit2/tests/resources/issue_1397/.gitted/objects/f2/c62dea0372a0578e053697d5c1ba1ac05e774a and /dev/null differ diff --git a/vendor/libgit2/tests/resources/issue_1397/.gitted/objects/ff/3578d64d199d5b48d92bbb569e0a273e411741 b/vendor/libgit2/tests/resources/issue_1397/.gitted/objects/ff/3578d64d199d5b48d92bbb569e0a273e411741 deleted file mode 100644 index fbd7317276..0000000000 Binary files a/vendor/libgit2/tests/resources/issue_1397/.gitted/objects/ff/3578d64d199d5b48d92bbb569e0a273e411741 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/issue_1397/.gitted/refs/heads/master b/vendor/libgit2/tests/resources/issue_1397/.gitted/refs/heads/master deleted file mode 100644 index 285bc08ff5..0000000000 --- a/vendor/libgit2/tests/resources/issue_1397/.gitted/refs/heads/master +++ /dev/null @@ -1 +0,0 @@ -7f483a738f867e5b21c8f377d70311f011eb48b5 diff --git a/vendor/libgit2/tests/resources/issue_1397/crlf_file.txt b/vendor/libgit2/tests/resources/issue_1397/crlf_file.txt deleted file mode 100644 index 8312e0889a..0000000000 --- a/vendor/libgit2/tests/resources/issue_1397/crlf_file.txt +++ /dev/null @@ -1,3 +0,0 @@ -first line -second line -both with crlf \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/issue_1397/some_other_crlf_file.txt b/vendor/libgit2/tests/resources/issue_1397/some_other_crlf_file.txt deleted file mode 100644 index 8e8f80088a..0000000000 --- a/vendor/libgit2/tests/resources/issue_1397/some_other_crlf_file.txt +++ /dev/null @@ -1,3 +0,0 @@ -first line -second line with some change -both with crlf \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/issue_592/.gitted/COMMIT_EDITMSG b/vendor/libgit2/tests/resources/issue_592/.gitted/COMMIT_EDITMSG deleted file mode 100644 index 5852f44639..0000000000 --- a/vendor/libgit2/tests/resources/issue_592/.gitted/COMMIT_EDITMSG +++ /dev/null @@ -1 +0,0 @@ -Initial commit diff --git a/vendor/libgit2/tests/resources/issue_592/.gitted/HEAD b/vendor/libgit2/tests/resources/issue_592/.gitted/HEAD deleted file mode 100644 index cb089cd89a..0000000000 --- a/vendor/libgit2/tests/resources/issue_592/.gitted/HEAD +++ /dev/null @@ -1 +0,0 @@ -ref: refs/heads/master diff --git a/vendor/libgit2/tests/resources/issue_592/.gitted/config b/vendor/libgit2/tests/resources/issue_592/.gitted/config deleted file mode 100644 index 78387c50b4..0000000000 --- a/vendor/libgit2/tests/resources/issue_592/.gitted/config +++ /dev/null @@ -1,8 +0,0 @@ -[core] - repositoryformatversion = 0 - filemode = false - bare = false - logallrefupdates = true - symlinks = false - ignorecase = true - hideDotFiles = dotGitOnly diff --git a/vendor/libgit2/tests/resources/issue_592/.gitted/index b/vendor/libgit2/tests/resources/issue_592/.gitted/index deleted file mode 100644 index be7a29d99f..0000000000 Binary files a/vendor/libgit2/tests/resources/issue_592/.gitted/index and /dev/null differ diff --git a/vendor/libgit2/tests/resources/issue_592/.gitted/info/exclude b/vendor/libgit2/tests/resources/issue_592/.gitted/info/exclude deleted file mode 100644 index a5196d1be8..0000000000 --- a/vendor/libgit2/tests/resources/issue_592/.gitted/info/exclude +++ /dev/null @@ -1,6 +0,0 @@ -# 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/vendor/libgit2/tests/resources/issue_592/.gitted/logs/HEAD b/vendor/libgit2/tests/resources/issue_592/.gitted/logs/HEAD deleted file mode 100644 index f19fe35a60..0000000000 --- a/vendor/libgit2/tests/resources/issue_592/.gitted/logs/HEAD +++ /dev/null @@ -1,2 +0,0 @@ -0000000000000000000000000000000000000000 4d383e87f0371ba8fa353f3912db6862b2625e85 nulltoken 1331989635 +0100 commit (initial): Initial commit -4d383e87f0371ba8fa353f3912db6862b2625e85 e38fcc7a6060f5eb5b876e836b52ae4769363f21 nulltoken 1332227062 +0100 commit (amend): Initial commit diff --git a/vendor/libgit2/tests/resources/issue_592/.gitted/logs/refs/heads/master b/vendor/libgit2/tests/resources/issue_592/.gitted/logs/refs/heads/master deleted file mode 100644 index f19fe35a60..0000000000 --- a/vendor/libgit2/tests/resources/issue_592/.gitted/logs/refs/heads/master +++ /dev/null @@ -1,2 +0,0 @@ -0000000000000000000000000000000000000000 4d383e87f0371ba8fa353f3912db6862b2625e85 nulltoken 1331989635 +0100 commit (initial): Initial commit -4d383e87f0371ba8fa353f3912db6862b2625e85 e38fcc7a6060f5eb5b876e836b52ae4769363f21 nulltoken 1332227062 +0100 commit (amend): Initial commit diff --git a/vendor/libgit2/tests/resources/issue_592/.gitted/objects/06/07ee9d4ccce8e4c4fa13c2c7d727e7faba4e0e b/vendor/libgit2/tests/resources/issue_592/.gitted/objects/06/07ee9d4ccce8e4c4fa13c2c7d727e7faba4e0e deleted file mode 100644 index 05dec10f73..0000000000 Binary files a/vendor/libgit2/tests/resources/issue_592/.gitted/objects/06/07ee9d4ccce8e4c4fa13c2c7d727e7faba4e0e and /dev/null differ diff --git a/vendor/libgit2/tests/resources/issue_592/.gitted/objects/49/363a72a90d9424240258cd3759f23788ecf1d8 b/vendor/libgit2/tests/resources/issue_592/.gitted/objects/49/363a72a90d9424240258cd3759f23788ecf1d8 deleted file mode 100644 index e997e1b497..0000000000 Binary files a/vendor/libgit2/tests/resources/issue_592/.gitted/objects/49/363a72a90d9424240258cd3759f23788ecf1d8 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/issue_592/.gitted/objects/4d/383e87f0371ba8fa353f3912db6862b2625e85 b/vendor/libgit2/tests/resources/issue_592/.gitted/objects/4d/383e87f0371ba8fa353f3912db6862b2625e85 deleted file mode 100644 index c49a8be587..0000000000 --- a/vendor/libgit2/tests/resources/issue_592/.gitted/objects/4d/383e87f0371ba8fa353f3912db6862b2625e85 +++ /dev/null @@ -1,2 +0,0 @@ -xťŤM -Â0]ço/”¤I›DÜzŚçë ćbz ŢŔíŔĚHÍ9v2Ëtę =k¬›,pâ+ŁřÍŹ>đ4ďýU•=Ą^ß(tAF‹2´ĚźŰ3sLÔ|%c­Y—u¶ťµŃZôvü©«{‰=r˘_G}KČ> \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/issue_592/.gitted/objects/71/44be264b61825fbff68046fe999bdfe96a1792 b/vendor/libgit2/tests/resources/issue_592/.gitted/objects/71/44be264b61825fbff68046fe999bdfe96a1792 deleted file mode 100644 index 25d44d9381..0000000000 Binary files a/vendor/libgit2/tests/resources/issue_592/.gitted/objects/71/44be264b61825fbff68046fe999bdfe96a1792 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/issue_592/.gitted/objects/be/de83ee10b5b3f00239660b00acec2d55fd0b84 b/vendor/libgit2/tests/resources/issue_592/.gitted/objects/be/de83ee10b5b3f00239660b00acec2d55fd0b84 deleted file mode 100644 index 1d6e38d374..0000000000 Binary files a/vendor/libgit2/tests/resources/issue_592/.gitted/objects/be/de83ee10b5b3f00239660b00acec2d55fd0b84 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/issue_592/.gitted/objects/e3/8fcc7a6060f5eb5b876e836b52ae4769363f21 b/vendor/libgit2/tests/resources/issue_592/.gitted/objects/e3/8fcc7a6060f5eb5b876e836b52ae4769363f21 deleted file mode 100644 index 36c5b9aabb..0000000000 Binary files a/vendor/libgit2/tests/resources/issue_592/.gitted/objects/e3/8fcc7a6060f5eb5b876e836b52ae4769363f21 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/issue_592/.gitted/objects/f1/adef63cb08891a0942b76fc4b9c50c6c494bc7 b/vendor/libgit2/tests/resources/issue_592/.gitted/objects/f1/adef63cb08891a0942b76fc4b9c50c6c494bc7 deleted file mode 100644 index c08ecd5eda..0000000000 Binary files a/vendor/libgit2/tests/resources/issue_592/.gitted/objects/f1/adef63cb08891a0942b76fc4b9c50c6c494bc7 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/issue_592/.gitted/refs/heads/master b/vendor/libgit2/tests/resources/issue_592/.gitted/refs/heads/master deleted file mode 100644 index 1f66696284..0000000000 --- a/vendor/libgit2/tests/resources/issue_592/.gitted/refs/heads/master +++ /dev/null @@ -1 +0,0 @@ -e38fcc7a6060f5eb5b876e836b52ae4769363f21 diff --git a/vendor/libgit2/tests/resources/issue_592/a.txt b/vendor/libgit2/tests/resources/issue_592/a.txt deleted file mode 100644 index f1adef63cb..0000000000 --- a/vendor/libgit2/tests/resources/issue_592/a.txt +++ /dev/null @@ -1 +0,0 @@ -nothing here diff --git a/vendor/libgit2/tests/resources/issue_592/c/a.txt b/vendor/libgit2/tests/resources/issue_592/c/a.txt deleted file mode 100644 index f1adef63cb..0000000000 --- a/vendor/libgit2/tests/resources/issue_592/c/a.txt +++ /dev/null @@ -1 +0,0 @@ -nothing here diff --git a/vendor/libgit2/tests/resources/issue_592/l.txt b/vendor/libgit2/tests/resources/issue_592/l.txt deleted file mode 100644 index f1adef63cb..0000000000 --- a/vendor/libgit2/tests/resources/issue_592/l.txt +++ /dev/null @@ -1 +0,0 @@ -nothing here diff --git a/vendor/libgit2/tests/resources/issue_592/t/a.txt b/vendor/libgit2/tests/resources/issue_592/t/a.txt deleted file mode 100644 index f1adef63cb..0000000000 --- a/vendor/libgit2/tests/resources/issue_592/t/a.txt +++ /dev/null @@ -1 +0,0 @@ -nothing here diff --git a/vendor/libgit2/tests/resources/issue_592/t/b.txt b/vendor/libgit2/tests/resources/issue_592/t/b.txt deleted file mode 100644 index f1adef63cb..0000000000 --- a/vendor/libgit2/tests/resources/issue_592/t/b.txt +++ /dev/null @@ -1 +0,0 @@ -nothing here diff --git a/vendor/libgit2/tests/resources/issue_592b/.gitted/HEAD b/vendor/libgit2/tests/resources/issue_592b/.gitted/HEAD deleted file mode 100644 index cb089cd89a..0000000000 --- a/vendor/libgit2/tests/resources/issue_592b/.gitted/HEAD +++ /dev/null @@ -1 +0,0 @@ -ref: refs/heads/master diff --git a/vendor/libgit2/tests/resources/issue_592b/.gitted/config b/vendor/libgit2/tests/resources/issue_592b/.gitted/config deleted file mode 100644 index af107929f2..0000000000 --- a/vendor/libgit2/tests/resources/issue_592b/.gitted/config +++ /dev/null @@ -1,6 +0,0 @@ -[core] - repositoryformatversion = 0 - filemode = true - bare = false - logallrefupdates = true - ignorecase = true diff --git a/vendor/libgit2/tests/resources/issue_592b/.gitted/description b/vendor/libgit2/tests/resources/issue_592b/.gitted/description deleted file mode 100644 index 498b267a8c..0000000000 --- a/vendor/libgit2/tests/resources/issue_592b/.gitted/description +++ /dev/null @@ -1 +0,0 @@ -Unnamed repository; edit this file 'description' to name the repository. diff --git a/vendor/libgit2/tests/resources/issue_592b/.gitted/index b/vendor/libgit2/tests/resources/issue_592b/.gitted/index deleted file mode 100644 index 5964382162..0000000000 Binary files a/vendor/libgit2/tests/resources/issue_592b/.gitted/index and /dev/null differ diff --git a/vendor/libgit2/tests/resources/issue_592b/.gitted/info/exclude b/vendor/libgit2/tests/resources/issue_592b/.gitted/info/exclude deleted file mode 100644 index a5196d1be8..0000000000 --- a/vendor/libgit2/tests/resources/issue_592b/.gitted/info/exclude +++ /dev/null @@ -1,6 +0,0 @@ -# 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/vendor/libgit2/tests/resources/issue_592b/.gitted/logs/HEAD b/vendor/libgit2/tests/resources/issue_592b/.gitted/logs/HEAD deleted file mode 100644 index 6f3ba90cc9..0000000000 --- a/vendor/libgit2/tests/resources/issue_592b/.gitted/logs/HEAD +++ /dev/null @@ -1 +0,0 @@ -0000000000000000000000000000000000000000 3fbf1852f72fd268e36457b13a18cdd9a4c9ea35 Russell Belfer 1337205933 -0700 commit (initial): Initial commit diff --git a/vendor/libgit2/tests/resources/issue_592b/.gitted/logs/refs/heads/master b/vendor/libgit2/tests/resources/issue_592b/.gitted/logs/refs/heads/master deleted file mode 100644 index 6f3ba90cc9..0000000000 --- a/vendor/libgit2/tests/resources/issue_592b/.gitted/logs/refs/heads/master +++ /dev/null @@ -1 +0,0 @@ -0000000000000000000000000000000000000000 3fbf1852f72fd268e36457b13a18cdd9a4c9ea35 Russell Belfer 1337205933 -0700 commit (initial): Initial commit diff --git a/vendor/libgit2/tests/resources/issue_592b/.gitted/objects/3f/bf1852f72fd268e36457b13a18cdd9a4c9ea35 b/vendor/libgit2/tests/resources/issue_592b/.gitted/objects/3f/bf1852f72fd268e36457b13a18cdd9a4c9ea35 deleted file mode 100644 index 6eaf64b46a..0000000000 --- a/vendor/libgit2/tests/resources/issue_592b/.gitted/objects/3f/bf1852f72fd268e36457b13a18cdd9a4c9ea35 +++ /dev/null @@ -1,2 +0,0 @@ -x•ŤK -1]ç}%Bwn˝A§íq‰™Îý x·ŹŞzĽµVĆv É‚cňžŃ&”%9¦@9x¤dÝëŚěŮĐĐuëđű.µÂ]ę".=ßŢEבOĽµ+¸ĐŰB€ŁEkÍ\çźNô_Ó<>E Uř%Ěű•9 \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/issue_592b/.gitted/objects/6f/a891d3e578c83e1c03bdb9e0fdd8e6e934157f b/vendor/libgit2/tests/resources/issue_592b/.gitted/objects/6f/a891d3e578c83e1c03bdb9e0fdd8e6e934157f deleted file mode 100644 index c4becfe2f1..0000000000 Binary files a/vendor/libgit2/tests/resources/issue_592b/.gitted/objects/6f/a891d3e578c83e1c03bdb9e0fdd8e6e934157f and /dev/null differ diff --git a/vendor/libgit2/tests/resources/issue_592b/.gitted/objects/80/07d41d5794e6ce4d4d2c97e370d5a9aa6d5213 b/vendor/libgit2/tests/resources/issue_592b/.gitted/objects/80/07d41d5794e6ce4d4d2c97e370d5a9aa6d5213 deleted file mode 100644 index aea14f2af9..0000000000 Binary files a/vendor/libgit2/tests/resources/issue_592b/.gitted/objects/80/07d41d5794e6ce4d4d2c97e370d5a9aa6d5213 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/issue_592b/.gitted/objects/a6/5fb6583a7c425284142f285bc359a2d6565513 b/vendor/libgit2/tests/resources/issue_592b/.gitted/objects/a6/5fb6583a7c425284142f285bc359a2d6565513 deleted file mode 100644 index 9b74072213..0000000000 Binary files a/vendor/libgit2/tests/resources/issue_592b/.gitted/objects/a6/5fb6583a7c425284142f285bc359a2d6565513 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/issue_592b/.gitted/objects/ae/be7a55922c7097ef91ca3a7bc327a901d87c2c b/vendor/libgit2/tests/resources/issue_592b/.gitted/objects/ae/be7a55922c7097ef91ca3a7bc327a901d87c2c deleted file mode 100644 index 1494ed8229..0000000000 Binary files a/vendor/libgit2/tests/resources/issue_592b/.gitted/objects/ae/be7a55922c7097ef91ca3a7bc327a901d87c2c and /dev/null differ diff --git a/vendor/libgit2/tests/resources/issue_592b/.gitted/objects/b3/44b055867fcdc1f01eaa75056a43e868eb4fbc b/vendor/libgit2/tests/resources/issue_592b/.gitted/objects/b3/44b055867fcdc1f01eaa75056a43e868eb4fbc deleted file mode 100644 index 7a66266363..0000000000 Binary files a/vendor/libgit2/tests/resources/issue_592b/.gitted/objects/b3/44b055867fcdc1f01eaa75056a43e868eb4fbc and /dev/null differ diff --git a/vendor/libgit2/tests/resources/issue_592b/.gitted/objects/f7/d75fbfad8b1d2e307ced287ea78aad403cdce3 b/vendor/libgit2/tests/resources/issue_592b/.gitted/objects/f7/d75fbfad8b1d2e307ced287ea78aad403cdce3 deleted file mode 100644 index 65a1fd0d09..0000000000 Binary files a/vendor/libgit2/tests/resources/issue_592b/.gitted/objects/f7/d75fbfad8b1d2e307ced287ea78aad403cdce3 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/issue_592b/.gitted/refs/heads/master b/vendor/libgit2/tests/resources/issue_592b/.gitted/refs/heads/master deleted file mode 100644 index c0a9ab4951..0000000000 --- a/vendor/libgit2/tests/resources/issue_592b/.gitted/refs/heads/master +++ /dev/null @@ -1 +0,0 @@ -3fbf1852f72fd268e36457b13a18cdd9a4c9ea35 diff --git a/vendor/libgit2/tests/resources/issue_592b/gitignore b/vendor/libgit2/tests/resources/issue_592b/gitignore deleted file mode 100644 index 8007d41d57..0000000000 --- a/vendor/libgit2/tests/resources/issue_592b/gitignore +++ /dev/null @@ -1 +0,0 @@ -ignored/ diff --git a/vendor/libgit2/tests/resources/issue_592b/ignored/contained/ignored3.txt b/vendor/libgit2/tests/resources/issue_592b/ignored/contained/ignored3.txt deleted file mode 100644 index b5dc7b0735..0000000000 --- a/vendor/libgit2/tests/resources/issue_592b/ignored/contained/ignored3.txt +++ /dev/null @@ -1 +0,0 @@ -I'm ignored diff --git a/vendor/libgit2/tests/resources/issue_592b/ignored/contained/tracked3.txt b/vendor/libgit2/tests/resources/issue_592b/ignored/contained/tracked3.txt deleted file mode 100644 index b344b05586..0000000000 --- a/vendor/libgit2/tests/resources/issue_592b/ignored/contained/tracked3.txt +++ /dev/null @@ -1 +0,0 @@ -You added me anyhow diff --git a/vendor/libgit2/tests/resources/issue_592b/ignored/ignored2.txt b/vendor/libgit2/tests/resources/issue_592b/ignored/ignored2.txt deleted file mode 100644 index b5dc7b0735..0000000000 --- a/vendor/libgit2/tests/resources/issue_592b/ignored/ignored2.txt +++ /dev/null @@ -1 +0,0 @@ -I'm ignored diff --git a/vendor/libgit2/tests/resources/issue_592b/ignored/tracked2.txt b/vendor/libgit2/tests/resources/issue_592b/ignored/tracked2.txt deleted file mode 100644 index 6fa891d3e5..0000000000 --- a/vendor/libgit2/tests/resources/issue_592b/ignored/tracked2.txt +++ /dev/null @@ -1 +0,0 @@ -You like me diff --git a/vendor/libgit2/tests/resources/issue_592b/ignored1.txt b/vendor/libgit2/tests/resources/issue_592b/ignored1.txt deleted file mode 100644 index b5dc7b0735..0000000000 --- a/vendor/libgit2/tests/resources/issue_592b/ignored1.txt +++ /dev/null @@ -1 +0,0 @@ -I'm ignored diff --git a/vendor/libgit2/tests/resources/issue_592b/tracked1.txt b/vendor/libgit2/tests/resources/issue_592b/tracked1.txt deleted file mode 100644 index 6fa891d3e5..0000000000 --- a/vendor/libgit2/tests/resources/issue_592b/tracked1.txt +++ /dev/null @@ -1 +0,0 @@ -You like me diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/COMMIT_EDITMSG b/vendor/libgit2/tests/resources/merge-resolve/.gitted/COMMIT_EDITMSG deleted file mode 100644 index 245b18a2c5..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/COMMIT_EDITMSG +++ /dev/null @@ -1 +0,0 @@ -rename conflict theirs diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/HEAD b/vendor/libgit2/tests/resources/merge-resolve/.gitted/HEAD deleted file mode 100644 index cb089cd89a..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/HEAD +++ /dev/null @@ -1 +0,0 @@ -ref: refs/heads/master diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/ORIG_HEAD b/vendor/libgit2/tests/resources/merge-resolve/.gitted/ORIG_HEAD deleted file mode 100644 index 4092d428f1..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/ORIG_HEAD +++ /dev/null @@ -1 +0,0 @@ -2392a2dacc9efb562b8635d6579fb458751c7c5b diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/config b/vendor/libgit2/tests/resources/merge-resolve/.gitted/config deleted file mode 100644 index 26c48426d9..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/config +++ /dev/null @@ -1,8 +0,0 @@ -[core] - repositoryformatversion = 0 - filemode = true - bare = false - logallrefupdates = true - ignorecase = true -[submodule "submodule"] - url = ../submodule diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/description b/vendor/libgit2/tests/resources/merge-resolve/.gitted/description deleted file mode 100644 index 498b267a8c..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/description +++ /dev/null @@ -1 +0,0 @@ -Unnamed repository; edit this file 'description' to name the repository. diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/index b/vendor/libgit2/tests/resources/merge-resolve/.gitted/index deleted file mode 100644 index 230eba9eb2..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/index and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/HEAD b/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/HEAD deleted file mode 100644 index 96cdb337e1..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/HEAD +++ /dev/null @@ -1,236 +0,0 @@ -0000000000000000000000000000000000000000 c607fc30883e335def28cd686b51f6cfa02b06ec Edward Thomson 1351563869 -0500 commit (initial): initial -c607fc30883e335def28cd686b51f6cfa02b06ec c607fc30883e335def28cd686b51f6cfa02b06ec Edward Thomson 1351563886 -0500 checkout: moving from master to branch -c607fc30883e335def28cd686b51f6cfa02b06ec 7cb63eed597130ba4abb87b3e544b85021905520 Edward Thomson 1351563965 -0500 commit: branch -7cb63eed597130ba4abb87b3e544b85021905520 c607fc30883e335def28cd686b51f6cfa02b06ec Edward Thomson 1351563968 -0500 checkout: moving from branch to master -c607fc30883e335def28cd686b51f6cfa02b06ec 977c696519c5a3004c5f1d15d60c89dbeb8f235f Edward Thomson 1351564033 -0500 commit: master -977c696519c5a3004c5f1d15d60c89dbeb8f235f 977c696519c5a3004c5f1d15d60c89dbeb8f235f Edward Thomson 1351605785 -0500 checkout: moving from master to ff_branch -977c696519c5a3004c5f1d15d60c89dbeb8f235f 33d500f588fbbe65901d82b4e6b008e549064be0 Edward Thomson 1351605830 -0500 commit: fastforward -33d500f588fbbe65901d82b4e6b008e549064be0 977c696519c5a3004c5f1d15d60c89dbeb8f235f Edward Thomson 1351605889 -0500 checkout: moving from ff_branch to master -977c696519c5a3004c5f1d15d60c89dbeb8f235f 977c696519c5a3004c5f1d15d60c89dbeb8f235f Edward Thomson 1351874933 -0500 checkout: moving from master to octo1 -977c696519c5a3004c5f1d15d60c89dbeb8f235f 16f825815cfd20a07a75c71554e82d8eede0b061 Edward Thomson 1351874954 -0500 commit: octo1 -16f825815cfd20a07a75c71554e82d8eede0b061 977c696519c5a3004c5f1d15d60c89dbeb8f235f Edward Thomson 1351874957 -0500 checkout: moving from octo1 to master -977c696519c5a3004c5f1d15d60c89dbeb8f235f 977c696519c5a3004c5f1d15d60c89dbeb8f235f Edward Thomson 1351874960 -0500 checkout: moving from master to octo2 -977c696519c5a3004c5f1d15d60c89dbeb8f235f 158dc7bedb202f5b26502bf3574faa7f4238d56c Edward Thomson 1351874974 -0500 commit: octo2 -158dc7bedb202f5b26502bf3574faa7f4238d56c 977c696519c5a3004c5f1d15d60c89dbeb8f235f Edward Thomson 1351874976 -0500 checkout: moving from octo2 to master -977c696519c5a3004c5f1d15d60c89dbeb8f235f 977c696519c5a3004c5f1d15d60c89dbeb8f235f Edward Thomson 1351874980 -0500 checkout: moving from master to octo3 -977c696519c5a3004c5f1d15d60c89dbeb8f235f 50ce7d7d01217679e26c55939eef119e0c93e272 Edward Thomson 1351874998 -0500 commit: octo3 -50ce7d7d01217679e26c55939eef119e0c93e272 977c696519c5a3004c5f1d15d60c89dbeb8f235f Edward Thomson 1351875006 -0500 checkout: moving from octo3 to master -977c696519c5a3004c5f1d15d60c89dbeb8f235f 977c696519c5a3004c5f1d15d60c89dbeb8f235f Edward Thomson 1351875010 -0500 checkout: moving from master to octo4 -977c696519c5a3004c5f1d15d60c89dbeb8f235f 54269b3f6ec3d7d4ede24dd350dd5d605495c3ae Edward Thomson 1351875023 -0500 commit: octo4 -54269b3f6ec3d7d4ede24dd350dd5d605495c3ae 977c696519c5a3004c5f1d15d60c89dbeb8f235f Edward Thomson 1351875031 -0500 checkout: moving from octo4 to master -977c696519c5a3004c5f1d15d60c89dbeb8f235f 977c696519c5a3004c5f1d15d60c89dbeb8f235f Edward Thomson 1351875031 -0500 checkout: moving from master to octo5 -977c696519c5a3004c5f1d15d60c89dbeb8f235f e4f618a2c3ed0669308735727df5ebf2447f022f Edward Thomson 1351875041 -0500 commit: octo5 -e4f618a2c3ed0669308735727df5ebf2447f022f 977c696519c5a3004c5f1d15d60c89dbeb8f235f Edward Thomson 1351875046 -0500 checkout: moving from octo5 to master -977c696519c5a3004c5f1d15d60c89dbeb8f235f 977c696519c5a3004c5f1d15d60c89dbeb8f235f Edward Thomson 1351875046 -0500 checkout: moving from master to octo6 -977c696519c5a3004c5f1d15d60c89dbeb8f235f 4ca408a8c88655f7586a1b580be6fad138121e98 Edward Thomson 1351875057 -0500 commit: octo5 -4ca408a8c88655f7586a1b580be6fad138121e98 b6f610aef53bd343e6c96227de874c66f00ee8e8 Edward Thomson 1351875065 -0500 commit (amend): octo6 -b6f610aef53bd343e6c96227de874c66f00ee8e8 977c696519c5a3004c5f1d15d60c89dbeb8f235f Edward Thomson 1351875071 -0500 checkout: moving from octo6 to master -977c696519c5a3004c5f1d15d60c89dbeb8f235f 4e0d9401aee78eb345a8685a859d37c8c3c0bbed Edward Thomson 1351875091 -0500 merge octo1 octo2 octo3 octo4: Merge made by the 'octopus' strategy. -4e0d9401aee78eb345a8685a859d37c8c3c0bbed 54269b3f6ec3d7d4ede24dd350dd5d605495c3ae Edward Thomson 1351875108 -0500 reset: moving to 54269b3f6ec3d7d4ede24dd350dd5d605495c3ae -54269b3f6ec3d7d4ede24dd350dd5d605495c3ae 977c696519c5a3004c5f1d15d60c89dbeb8f235f Edward Thomson 1351875584 -0500 reset: moving to 977c696519c5a3004c5f1d15d60c89dbeb8f235f -bd593285fc7fe4ca18ccdbabf027f5d689101452 33d500f588fbbe65901d82b4e6b008e549064be0 Edward Thomson 1351990193 -0500 checkout: moving from master to ff_branch -33d500f588fbbe65901d82b4e6b008e549064be0 c607fc30883e335def28cd686b51f6cfa02b06ec Edward Thomson 1351990202 -0500 reset: moving to c607fc30883e335def28cd686b51f6cfa02b06ec -c607fc30883e335def28cd686b51f6cfa02b06ec bd593285fc7fe4ca18ccdbabf027f5d689101452 Edward Thomson 1351990205 -0500 merge master: Fast-forward -bd593285fc7fe4ca18ccdbabf027f5d689101452 fd89f8cffb663ac89095a0f9764902e93ceaca6a Edward Thomson 1351990229 -0500 commit: fastforward -fd89f8cffb663ac89095a0f9764902e93ceaca6a bd593285fc7fe4ca18ccdbabf027f5d689101452 Edward Thomson 1351990233 -0500 checkout: moving from ff_branch to master -bd593285fc7fe4ca18ccdbabf027f5d689101452 c607fc30883e335def28cd686b51f6cfa02b06ec Edward Thomson 1352091703 -0600 checkout: moving from master to trivial-2alt -c607fc30883e335def28cd686b51f6cfa02b06ec c607fc30883e335def28cd686b51f6cfa02b06ec Edward Thomson 1352092411 -0600 checkout: moving from trivial-2alt to trivial-2alt-branch -c607fc30883e335def28cd686b51f6cfa02b06ec c9174cef549ec94ecbc43ef03cdc775b4950becb Edward Thomson 1352092434 -0600 commit: 2alt-branch -c9174cef549ec94ecbc43ef03cdc775b4950becb c607fc30883e335def28cd686b51f6cfa02b06ec Edward Thomson 1352092440 -0600 checkout: moving from trivial-2alt-branch to trivial-2alt -c607fc30883e335def28cd686b51f6cfa02b06ec 566ab53c220a2eafc1212af1a024513230280ab9 Edward Thomson 1352092452 -0600 commit: 2alt -bd593285fc7fe4ca18ccdbabf027f5d689101452 566ab53c220a2eafc1212af1a024513230280ab9 Edward Thomson 1352094476 -0600 checkout: moving from master to trivial-3alt -566ab53c220a2eafc1212af1a024513230280ab9 c607fc30883e335def28cd686b51f6cfa02b06ec Edward Thomson 1352094547 -0600 reset: moving to c607fc30883e335def28cd686b51f6cfa02b06ec -c607fc30883e335def28cd686b51f6cfa02b06ec 5459c89aa0026d543ce8343bd89871bce543f9c2 Edward Thomson 1352094580 -0600 commit: 3alt -5459c89aa0026d543ce8343bd89871bce543f9c2 4c9fac0707f8d4195037ae5a681aa48626491541 Edward Thomson 1352094610 -0600 commit: 3alt-branch -4c9fac0707f8d4195037ae5a681aa48626491541 bd593285fc7fe4ca18ccdbabf027f5d689101452 Edward Thomson 1352094620 -0600 checkout: moving from trivial-3alt to master -bd593285fc7fe4ca18ccdbabf027f5d689101452 566ab53c220a2eafc1212af1a024513230280ab9 Edward Thomson 1352094752 -0600 checkout: moving from master to trivial-4 -566ab53c220a2eafc1212af1a024513230280ab9 c607fc30883e335def28cd686b51f6cfa02b06ec Edward Thomson 1352094764 -0600 reset: moving to c607fc30883e335def28cd686b51f6cfa02b06ec -c607fc30883e335def28cd686b51f6cfa02b06ec cc3e3009134cb88014129fc8858d1101359e5e2f Edward Thomson 1352094815 -0600 commit: trivial-4 -cc3e3009134cb88014129fc8858d1101359e5e2f c607fc30883e335def28cd686b51f6cfa02b06ec Edward Thomson 1352094843 -0600 checkout: moving from trivial-4 to trivial-4-branch -c607fc30883e335def28cd686b51f6cfa02b06ec 183310e30fb1499af8c619108ffea4d300b5e778 Edward Thomson 1352094856 -0600 commit: trivial-4-branch -183310e30fb1499af8c619108ffea4d300b5e778 bd593285fc7fe4ca18ccdbabf027f5d689101452 Edward Thomson 1352094860 -0600 checkout: moving from trivial-4-branch to master -bd593285fc7fe4ca18ccdbabf027f5d689101452 cc3e3009134cb88014129fc8858d1101359e5e2f Edward Thomson 1352096588 -0600 checkout: moving from master to trivial-4 -cc3e3009134cb88014129fc8858d1101359e5e2f c607fc30883e335def28cd686b51f6cfa02b06ec Edward Thomson 1352096612 -0600 checkout: moving from trivial-4 to trivial-5alt-1 -c607fc30883e335def28cd686b51f6cfa02b06ec 4fe93c0ec83eb6305cbace3dace88ecee1b63cb6 Edward Thomson 1352096643 -0600 commit: 5alt-1 -4fe93c0ec83eb6305cbace3dace88ecee1b63cb6 c607fc30883e335def28cd686b51f6cfa02b06ec Edward Thomson 1352096661 -0600 checkout: moving from trivial-5alt-1 to trivial-5alt-1-branch -c607fc30883e335def28cd686b51f6cfa02b06ec 4fe93c0ec83eb6305cbace3dace88ecee1b63cb6 Edward Thomson 1352096671 -0600 checkout: moving from trivial-5alt-1-branch to trivial-5alt-1 -4fe93c0ec83eb6305cbace3dace88ecee1b63cb6 c607fc30883e335def28cd686b51f6cfa02b06ec Edward Thomson 1352096678 -0600 checkout: moving from trivial-5alt-1 to trivial-5alt-1-branch -c607fc30883e335def28cd686b51f6cfa02b06ec 478172cb2f5ff9b514bc9d04d3bd5ef5840cb3b2 Edward Thomson 1352096689 -0600 commit: 5alt-1-branch -478172cb2f5ff9b514bc9d04d3bd5ef5840cb3b2 4fe93c0ec83eb6305cbace3dace88ecee1b63cb6 Edward Thomson 1352096701 -0600 checkout: moving from trivial-5alt-1-branch to trivial-5alt-1 -4fe93c0ec83eb6305cbace3dace88ecee1b63cb6 c607fc30883e335def28cd686b51f6cfa02b06ec Edward Thomson 1352096715 -0600 checkout: moving from trivial-5alt-1 to trivial-5alt-2 -c607fc30883e335def28cd686b51f6cfa02b06ec ebc09d0137cfb0c26697aed0109fb943ad906f3f Edward Thomson 1352096764 -0600 commit: existing file -ebc09d0137cfb0c26697aed0109fb943ad906f3f 3b47b031b3e55ae11e14a05260b1c3ffd6838d55 Edward Thomson 1352096815 -0600 commit: 5alt-2 -3b47b031b3e55ae11e14a05260b1c3ffd6838d55 ebc09d0137cfb0c26697aed0109fb943ad906f3f Edward Thomson 1352096840 -0600 checkout: moving from trivial-5alt-2 to trivial-5alt-2-branch -ebc09d0137cfb0c26697aed0109fb943ad906f3f f48097eb340dc5a7cae55aabcf1faf4548aa821f Edward Thomson 1352096855 -0600 commit: 5alt-2-branch -f48097eb340dc5a7cae55aabcf1faf4548aa821f bd593285fc7fe4ca18ccdbabf027f5d689101452 Edward Thomson 1352096858 -0600 checkout: moving from trivial-5alt-2-branch to master -bd593285fc7fe4ca18ccdbabf027f5d689101452 c607fc30883e335def28cd686b51f6cfa02b06ec Edward Thomson 1352097377 -0600 checkout: moving from master to trivial-6 -c607fc30883e335def28cd686b51f6cfa02b06ec f7c332bd4d4d4b777366cae4d24d1687477576bf Edward Thomson 1352097389 -0600 commit: 6 -f7c332bd4d4d4b777366cae4d24d1687477576bf 99b4f7e4f24470fa06b980bc21f1095c2a9425c0 Edward Thomson 1352097404 -0600 commit: trivial-6 -99b4f7e4f24470fa06b980bc21f1095c2a9425c0 f7c332bd4d4d4b777366cae4d24d1687477576bf Edward Thomson 1352097420 -0600 checkout: moving from trivial-6 to trivial-6-branch -f7c332bd4d4d4b777366cae4d24d1687477576bf a43150a738849c59376cf30bb2a68348a83c8f48 Edward Thomson 1352097431 -0600 commit: 6-branch -a43150a738849c59376cf30bb2a68348a83c8f48 bd593285fc7fe4ca18ccdbabf027f5d689101452 Edward Thomson 1352097442 -0600 checkout: moving from trivial-6-branch to master -bd593285fc7fe4ca18ccdbabf027f5d689101452 99b4f7e4f24470fa06b980bc21f1095c2a9425c0 Edward Thomson 1352098040 -0600 checkout: moving from master to trivial-6 -99b4f7e4f24470fa06b980bc21f1095c2a9425c0 bd593285fc7fe4ca18ccdbabf027f5d689101452 Edward Thomson 1352098057 -0600 checkout: moving from trivial-6 to master -bd593285fc7fe4ca18ccdbabf027f5d689101452 cc3e3009134cb88014129fc8858d1101359e5e2f Edward Thomson 1352098792 -0600 checkout: moving from master to trivial-4 -cc3e3009134cb88014129fc8858d1101359e5e2f c607fc30883e335def28cd686b51f6cfa02b06ec Edward Thomson 1352098818 -0600 checkout: moving from trivial-4 to trivial-8 -c607fc30883e335def28cd686b51f6cfa02b06ec 75a811bf6bc57694adb3fe604786f3a4efd1cd1b Edward Thomson 1352098884 -0600 commit: trivial-8 -75a811bf6bc57694adb3fe604786f3a4efd1cd1b 75a811bf6bc57694adb3fe604786f3a4efd1cd1b Edward Thomson 1352098947 -0600 checkout: moving from trivial-8 to trivial-8-branch -75a811bf6bc57694adb3fe604786f3a4efd1cd1b 52d8bc572af2b6d4ee0d5e62ed5d1fbad92210a9 Edward Thomson 1352098979 -0600 commit: trivial-8-branch -52d8bc572af2b6d4ee0d5e62ed5d1fbad92210a9 75a811bf6bc57694adb3fe604786f3a4efd1cd1b Edward Thomson 1352098982 -0600 checkout: moving from trivial-8-branch to trivial-8 -75a811bf6bc57694adb3fe604786f3a4efd1cd1b 3575826c96a975031d2c14368529cc5c4353a8fd Edward Thomson 1352099000 -0600 commit: trivial-8 -3575826c96a975031d2c14368529cc5c4353a8fd bd593285fc7fe4ca18ccdbabf027f5d689101452 Edward Thomson 1352099008 -0600 checkout: moving from trivial-8 to master -bd593285fc7fe4ca18ccdbabf027f5d689101452 c607fc30883e335def28cd686b51f6cfa02b06ec Edward Thomson 1352099776 -0600 checkout: moving from master to trivial-7 -c607fc30883e335def28cd686b51f6cfa02b06ec 092ce8682d7f3a2a3a769a6daca58950168ba5c4 Edward Thomson 1352099790 -0600 commit: trivial-7 -092ce8682d7f3a2a3a769a6daca58950168ba5c4 092ce8682d7f3a2a3a769a6daca58950168ba5c4 Edward Thomson 1352099799 -0600 checkout: moving from trivial-7 to trivial-7-branch -092ce8682d7f3a2a3a769a6daca58950168ba5c4 73cbfdc4fe843169e5b2af8dcad03cbf3acf306c Edward Thomson 1352099812 -0600 commit: trivial-7-branch -73cbfdc4fe843169e5b2af8dcad03cbf3acf306c 092ce8682d7f3a2a3a769a6daca58950168ba5c4 Edward Thomson 1352099815 -0600 checkout: moving from trivial-7-branch to trivial-7 -092ce8682d7f3a2a3a769a6daca58950168ba5c4 73cbfdc4fe843169e5b2af8dcad03cbf3acf306c Edward Thomson 1352099838 -0600 checkout: moving from trivial-7 to trivial-7-branch -73cbfdc4fe843169e5b2af8dcad03cbf3acf306c 092ce8682d7f3a2a3a769a6daca58950168ba5c4 Edward Thomson 1352099874 -0600 reset: moving to 092ce8682d7f3a2a3a769a6daca58950168ba5c4 -092ce8682d7f3a2a3a769a6daca58950168ba5c4 009b9cab6fdac02915a88ecd078b7a792ed802d8 Edward Thomson 1352099921 -0600 commit: removed in 7 -009b9cab6fdac02915a88ecd078b7a792ed802d8 5195a1b480f66691b667f10a9e41e70115a78351 Edward Thomson 1352099927 -0600 commit (amend): trivial-7-branch -5195a1b480f66691b667f10a9e41e70115a78351 092ce8682d7f3a2a3a769a6daca58950168ba5c4 Edward Thomson 1352099937 -0600 checkout: moving from trivial-7-branch to trivial-7 -092ce8682d7f3a2a3a769a6daca58950168ba5c4 d874671ef5b20184836cb983bb273e5280384d0b Edward Thomson 1352099947 -0600 commit: trivial-7 -d874671ef5b20184836cb983bb273e5280384d0b bd593285fc7fe4ca18ccdbabf027f5d689101452 Edward Thomson 1352099949 -0600 checkout: moving from trivial-7 to master -bd593285fc7fe4ca18ccdbabf027f5d689101452 c607fc30883e335def28cd686b51f6cfa02b06ec Edward Thomson 1352100174 -0600 checkout: moving from master to trivial-10 -c607fc30883e335def28cd686b51f6cfa02b06ec 53825f41ac8d640612f9423a2f03a69f3d96809a Edward Thomson 1352100193 -0600 commit: trivial-10 -53825f41ac8d640612f9423a2f03a69f3d96809a 53825f41ac8d640612f9423a2f03a69f3d96809a Edward Thomson 1352100200 -0600 checkout: moving from trivial-10 to trivial-10-branch -53825f41ac8d640612f9423a2f03a69f3d96809a 11f4f3c08b737f5fd896cbefa1425ee63b21b2fa Edward Thomson 1352100211 -0600 commit: trivial-10-branch -11f4f3c08b737f5fd896cbefa1425ee63b21b2fa 53825f41ac8d640612f9423a2f03a69f3d96809a Edward Thomson 1352100214 -0600 checkout: moving from trivial-10-branch to trivial-10 -53825f41ac8d640612f9423a2f03a69f3d96809a 0ec5f433959cd46177f745903353efb5be08d151 Edward Thomson 1352100223 -0600 commit: trivial-10 -0ec5f433959cd46177f745903353efb5be08d151 bd593285fc7fe4ca18ccdbabf027f5d689101452 Edward Thomson 1352100225 -0600 checkout: moving from trivial-10 to master -bd593285fc7fe4ca18ccdbabf027f5d689101452 c607fc30883e335def28cd686b51f6cfa02b06ec Edward Thomson 1352100270 -0600 checkout: moving from master to trivial-9 -c607fc30883e335def28cd686b51f6cfa02b06ec f0053b8060bb3f0be5cbcc3147a07ece26bf097e Edward Thomson 1352100304 -0600 commit: trivial-9 -f0053b8060bb3f0be5cbcc3147a07ece26bf097e f0053b8060bb3f0be5cbcc3147a07ece26bf097e Edward Thomson 1352100310 -0600 checkout: moving from trivial-9 to trivial-9-branch -f0053b8060bb3f0be5cbcc3147a07ece26bf097e 13d1be4ea52a6ced1d7a1d832f0ee3c399348e5e Edward Thomson 1352100317 -0600 commit: trivial-9-branch -13d1be4ea52a6ced1d7a1d832f0ee3c399348e5e f0053b8060bb3f0be5cbcc3147a07ece26bf097e Edward Thomson 1352100319 -0600 checkout: moving from trivial-9-branch to trivial-9 -f0053b8060bb3f0be5cbcc3147a07ece26bf097e c35dee9bcc0e989f3b0c40f68372a9a51b6c4e6a Edward Thomson 1352100333 -0600 commit: trivial-9 -c35dee9bcc0e989f3b0c40f68372a9a51b6c4e6a bd593285fc7fe4ca18ccdbabf027f5d689101452 Edward Thomson 1352100335 -0600 checkout: moving from trivial-9 to master -bd593285fc7fe4ca18ccdbabf027f5d689101452 c607fc30883e335def28cd686b51f6cfa02b06ec Edward Thomson 1352100576 -0600 checkout: moving from master to trivial-13 -c607fc30883e335def28cd686b51f6cfa02b06ec 8f4433f8593ddd65b7dd43dd4564d841f4d9c8aa Edward Thomson 1352100589 -0600 commit: trivial-13 -8f4433f8593ddd65b7dd43dd4564d841f4d9c8aa 8f4433f8593ddd65b7dd43dd4564d841f4d9c8aa Edward Thomson 1352100604 -0600 checkout: moving from trivial-13 to trivial-13-branch -8f4433f8593ddd65b7dd43dd4564d841f4d9c8aa 05f3c1a2a56ca95c3d2ef28dc9ddf32b5cd6c91c Edward Thomson 1352100610 -0600 commit: trivial-13-branch -05f3c1a2a56ca95c3d2ef28dc9ddf32b5cd6c91c 8f4433f8593ddd65b7dd43dd4564d841f4d9c8aa Edward Thomson 1352100612 -0600 checkout: moving from trivial-13-branch to trivial-13 -8f4433f8593ddd65b7dd43dd4564d841f4d9c8aa a3fabece9eb8748da810e1e08266fef9b7136ad4 Edward Thomson 1352100625 -0600 commit: trivial-13 -a3fabece9eb8748da810e1e08266fef9b7136ad4 bd593285fc7fe4ca18ccdbabf027f5d689101452 Edward Thomson 1352100627 -0600 checkout: moving from trivial-13 to master -bd593285fc7fe4ca18ccdbabf027f5d689101452 c607fc30883e335def28cd686b51f6cfa02b06ec Edward Thomson 1352100936 -0600 checkout: moving from master to trivial-11 -c607fc30883e335def28cd686b51f6cfa02b06ec 35632e43612c06a3ea924bfbacd48333da874c29 Edward Thomson 1352100958 -0600 commit: trivial-11 -35632e43612c06a3ea924bfbacd48333da874c29 35632e43612c06a3ea924bfbacd48333da874c29 Edward Thomson 1352100964 -0600 checkout: moving from trivial-11 to trivial-11-branch -35632e43612c06a3ea924bfbacd48333da874c29 6718a45909532d1fcf5600d0877f7fe7e78f0b86 Edward Thomson 1352100978 -0600 commit: trivial-11-branch -6718a45909532d1fcf5600d0877f7fe7e78f0b86 35632e43612c06a3ea924bfbacd48333da874c29 Edward Thomson 1352100981 -0600 checkout: moving from trivial-11-branch to trivial-11 -35632e43612c06a3ea924bfbacd48333da874c29 3168dca1a561889b045a6441909f4c56145e666d Edward Thomson 1352100992 -0600 commit: trivial-11 -3168dca1a561889b045a6441909f4c56145e666d bd593285fc7fe4ca18ccdbabf027f5d689101452 Edward Thomson 1352100996 -0600 checkout: moving from trivial-11 to master -bd593285fc7fe4ca18ccdbabf027f5d689101452 c607fc30883e335def28cd686b51f6cfa02b06ec Edward Thomson 1352101098 -0600 checkout: moving from master to trivial-14 -c607fc30883e335def28cd686b51f6cfa02b06ec 596803b523203a4851c824c07366906f8353f4ad Edward Thomson 1352101113 -0600 commit: trivial-14 -596803b523203a4851c824c07366906f8353f4ad 596803b523203a4851c824c07366906f8353f4ad Edward Thomson 1352101117 -0600 checkout: moving from trivial-14 to trivial-14-branch -596803b523203a4851c824c07366906f8353f4ad 8187117062b750eed4f93fd7e899f17b52ce554d Edward Thomson 1352101132 -0600 commit: trivial-14-branch -8187117062b750eed4f93fd7e899f17b52ce554d 596803b523203a4851c824c07366906f8353f4ad Edward Thomson 1352101135 -0600 checkout: moving from trivial-14-branch to trivial-14 -596803b523203a4851c824c07366906f8353f4ad 7e2d058d5fedf8329db44db4fac610d6b1a89159 Edward Thomson 1352101141 -0600 commit: trivial-14 -7e2d058d5fedf8329db44db4fac610d6b1a89159 bd593285fc7fe4ca18ccdbabf027f5d689101452 Edward Thomson 1352101145 -0600 checkout: moving from trivial-14 to master -bd593285fc7fe4ca18ccdbabf027f5d689101452 c607fc30883e335def28cd686b51f6cfa02b06ec Edward Thomson 1353177749 -0600 checkout: moving from master to renames1 -c607fc30883e335def28cd686b51f6cfa02b06ec 412b32fb66137366147f1801ecc962452757d48a Edward Thomson 1353177886 -0600 commit: renames -412b32fb66137366147f1801ecc962452757d48a bd593285fc7fe4ca18ccdbabf027f5d689101452 Edward Thomson 1353794607 -0600 checkout: moving from renames1 to master -bd593285fc7fe4ca18ccdbabf027f5d689101452 bd593285fc7fe4ca18ccdbabf027f5d689101452 Edward Thomson 1353794647 -0600 checkout: moving from master to renames2 -bd593285fc7fe4ca18ccdbabf027f5d689101452 c607fc30883e335def28cd686b51f6cfa02b06ec Edward Thomson 1353794677 -0600 reset: moving to c607fc30883e335def28cd686b51f6cfa02b06ec -c607fc30883e335def28cd686b51f6cfa02b06ec ab40af3cb8a3ed2e2843e96d9aa7871336b94573 Edward Thomson 1353794852 -0600 commit: renames2 -ab40af3cb8a3ed2e2843e96d9aa7871336b94573 bd593285fc7fe4ca18ccdbabf027f5d689101452 Edward Thomson 1353794883 -0600 checkout: moving from renames2 to master -bd593285fc7fe4ca18ccdbabf027f5d689101452 bd593285fc7fe4ca18ccdbabf027f5d689101452 Edward Thomson 1354574697 -0600 checkout: moving from master to df_side1 -bd593285fc7fe4ca18ccdbabf027f5d689101452 d4207f77243500bec335ab477f9227fcdb1e271a Edward Thomson 1354574962 -0600 commit: df_ancestor -d4207f77243500bec335ab477f9227fcdb1e271a c94b27e41064c521120627e07e2035cca1d24ffa Edward Thomson 1354575027 -0600 commit: df_side1 -c94b27e41064c521120627e07e2035cca1d24ffa d4207f77243500bec335ab477f9227fcdb1e271a Edward Thomson 1354575070 -0600 checkout: moving from df_side1 to df_side2 -d4207f77243500bec335ab477f9227fcdb1e271a f8958bdf4d365a84a9a178b1f5f35ff1dacbd884 Edward Thomson 1354575206 -0600 commit: df_side2 -f8958bdf4d365a84a9a178b1f5f35ff1dacbd884 bd593285fc7fe4ca18ccdbabf027f5d689101452 Edward Thomson 1354575381 -0600 checkout: moving from df_side2 to master -bd593285fc7fe4ca18ccdbabf027f5d689101452 c94b27e41064c521120627e07e2035cca1d24ffa Edward Thomson 1355017614 -0600 checkout: moving from master to df_side1 -c94b27e41064c521120627e07e2035cca1d24ffa a90bc3fb6f15181972a2959a921429efbd81a473 Edward Thomson 1355017650 -0600 commit: df_added -a90bc3fb6f15181972a2959a921429efbd81a473 c94b27e41064c521120627e07e2035cca1d24ffa Edward Thomson 1355017673 -0600 checkout: moving from df_side1 to c94b27e -c94b27e41064c521120627e07e2035cca1d24ffa d4207f77243500bec335ab477f9227fcdb1e271a Edward Thomson 1355017673 -0600 rebase -i (squash): updating HEAD -d4207f77243500bec335ab477f9227fcdb1e271a 005b6fcc8fec71d2550bef8462d169b3c26aa14b Edward Thomson 1355017673 -0600 rebase -i (squash): df_side1 -005b6fcc8fec71d2550bef8462d169b3c26aa14b 005b6fcc8fec71d2550bef8462d169b3c26aa14b Edward Thomson 1355017676 -0600 rebase -i (finish): returning to refs/heads/df_side1 -005b6fcc8fec71d2550bef8462d169b3c26aa14b f8958bdf4d365a84a9a178b1f5f35ff1dacbd884 Edward Thomson 1355017715 -0600 reset: moving to df_side2 -f8958bdf4d365a84a9a178b1f5f35ff1dacbd884 8c749d9968d4b10dcfb06c9f97d0e5d92d337071 Edward Thomson 1355017744 -0600 commit: df_added -8c749d9968d4b10dcfb06c9f97d0e5d92d337071 f8958bdf4d365a84a9a178b1f5f35ff1dacbd884 Edward Thomson 1355017754 -0600 checkout: moving from df_side1 to f8958bd -f8958bdf4d365a84a9a178b1f5f35ff1dacbd884 d4207f77243500bec335ab477f9227fcdb1e271a Edward Thomson 1355017754 -0600 rebase -i (squash): updating HEAD -d4207f77243500bec335ab477f9227fcdb1e271a 0204a84f822acbf6386b36d33f1f6bc68bbbf858 Edward Thomson 1355017754 -0600 rebase -i (squash): df_side2 -0204a84f822acbf6386b36d33f1f6bc68bbbf858 0204a84f822acbf6386b36d33f1f6bc68bbbf858 Edward Thomson 1355017756 -0600 rebase -i (finish): returning to refs/heads/df_side1 -0204a84f822acbf6386b36d33f1f6bc68bbbf858 005b6fcc8fec71d2550bef8462d169b3c26aa14b Edward Thomson 1355017793 -0600 reset: moving to 005b6fcc8fec71d2550bef8462d169b3c26aa14b -005b6fcc8fec71d2550bef8462d169b3c26aa14b 0204a84f822acbf6386b36d33f1f6bc68bbbf858 Edward Thomson 1355017826 -0600 reset: moving to 0204a84 -0204a84f822acbf6386b36d33f1f6bc68bbbf858 bd593285fc7fe4ca18ccdbabf027f5d689101452 Edward Thomson 1355017847 -0600 checkout: moving from df_side1 to master -bd593285fc7fe4ca18ccdbabf027f5d689101452 0204a84f822acbf6386b36d33f1f6bc68bbbf858 Edward Thomson 1355168677 -0600 checkout: moving from master to df_side1 -005b6fcc8fec71d2550bef8462d169b3c26aa14b 005b6fcc8fec71d2550bef8462d169b3c26aa14b Edward Thomson 1355168829 -0600 checkout: moving from df_side1 to df_side1 -005b6fcc8fec71d2550bef8462d169b3c26aa14b 005b6fcc8fec71d2550bef8462d169b3c26aa14b Edward Thomson 1355168838 -0600 checkout: moving from df_side1 to df_side1 -005b6fcc8fec71d2550bef8462d169b3c26aa14b e8107f24196736b870a318a0e28f048e29f6feff Edward Thomson 1355169065 -0600 commit: df_side1 -e8107f24196736b870a318a0e28f048e29f6feff 005b6fcc8fec71d2550bef8462d169b3c26aa14b Edward Thomson 1355169081 -0600 checkout: moving from df_side1 to 005b6fc -005b6fcc8fec71d2550bef8462d169b3c26aa14b d4207f77243500bec335ab477f9227fcdb1e271a Edward Thomson 1355169081 -0600 rebase -i (squash): updating HEAD -d4207f77243500bec335ab477f9227fcdb1e271a 80a8fbb3abb1ba423d554e9630b8fc2e5698f86b Edward Thomson 1355169081 -0600 rebase -i (squash): df_side1 -80a8fbb3abb1ba423d554e9630b8fc2e5698f86b 80a8fbb3abb1ba423d554e9630b8fc2e5698f86b Edward Thomson 1355169084 -0600 rebase -i (finish): returning to refs/heads/df_side1 -80a8fbb3abb1ba423d554e9630b8fc2e5698f86b 0204a84f822acbf6386b36d33f1f6bc68bbbf858 Edward Thomson 1355169141 -0600 checkout: moving from df_side1 to df_side2 -0204a84f822acbf6386b36d33f1f6bc68bbbf858 944f5dd1a867cab4c2bbcb896493435cae1dcc1a Edward Thomson 1355169174 -0600 commit: both -944f5dd1a867cab4c2bbcb896493435cae1dcc1a 0204a84f822acbf6386b36d33f1f6bc68bbbf858 Edward Thomson 1355169182 -0600 checkout: moving from df_side2 to 0204a84 -0204a84f822acbf6386b36d33f1f6bc68bbbf858 d4207f77243500bec335ab477f9227fcdb1e271a Edward Thomson 1355169182 -0600 rebase -i (squash): updating HEAD -d4207f77243500bec335ab477f9227fcdb1e271a 57079a46233ae2b6df62e9ade71c4948512abefb Edward Thomson 1355169182 -0600 rebase -i (squash): df_side2 -57079a46233ae2b6df62e9ade71c4948512abefb 57079a46233ae2b6df62e9ade71c4948512abefb Edward Thomson 1355169185 -0600 rebase -i (finish): returning to refs/heads/df_side2 -57079a46233ae2b6df62e9ade71c4948512abefb 80a8fbb3abb1ba423d554e9630b8fc2e5698f86b Edward Thomson 1355169241 -0600 checkout: moving from df_side2 to df_side1 -80a8fbb3abb1ba423d554e9630b8fc2e5698f86b e65a9bb2af9f4c2d1c375dd0f8f8a46cf9c68812 Edward Thomson 1355169419 -0600 commit: side1 -e65a9bb2af9f4c2d1c375dd0f8f8a46cf9c68812 80a8fbb3abb1ba423d554e9630b8fc2e5698f86b Edward Thomson 1355169431 -0600 checkout: moving from df_side1 to 80a8fbb -80a8fbb3abb1ba423d554e9630b8fc2e5698f86b d4207f77243500bec335ab477f9227fcdb1e271a Edward Thomson 1355169431 -0600 rebase -i (squash): updating HEAD -d4207f77243500bec335ab477f9227fcdb1e271a 5dc1018e90b19654bee986b7a0c268804d39659d Edward Thomson 1355169431 -0600 rebase -i (squash): df_side1 -5dc1018e90b19654bee986b7a0c268804d39659d 5dc1018e90b19654bee986b7a0c268804d39659d Edward Thomson 1355169435 -0600 rebase -i (finish): returning to refs/heads/df_side1 -5dc1018e90b19654bee986b7a0c268804d39659d 57079a46233ae2b6df62e9ade71c4948512abefb Edward Thomson 1355169439 -0600 checkout: moving from df_side1 to df_side2 -57079a46233ae2b6df62e9ade71c4948512abefb 58e853f66699fd02629fd50bde08082bc005933a Edward Thomson 1355169460 -0600 commit: side2 -58e853f66699fd02629fd50bde08082bc005933a 57079a46233ae2b6df62e9ade71c4948512abefb Edward Thomson 1355169469 -0600 checkout: moving from df_side2 to 57079a4 -57079a46233ae2b6df62e9ade71c4948512abefb d4207f77243500bec335ab477f9227fcdb1e271a Edward Thomson 1355169469 -0600 rebase -i (squash): updating HEAD -d4207f77243500bec335ab477f9227fcdb1e271a fada9356aa3f74622327a3038ae9c6f92e1c5c1d Edward Thomson 1355169469 -0600 rebase -i (squash): df_side2 -fada9356aa3f74622327a3038ae9c6f92e1c5c1d fada9356aa3f74622327a3038ae9c6f92e1c5c1d Edward Thomson 1355169471 -0600 rebase -i (finish): returning to refs/heads/df_side2 -fada9356aa3f74622327a3038ae9c6f92e1c5c1d 5dc1018e90b19654bee986b7a0c268804d39659d Edward Thomson 1355169494 -0600 checkout: moving from df_side2 to df_side1 -5dc1018e90b19654bee986b7a0c268804d39659d d4207f77243500bec335ab477f9227fcdb1e271a Edward Thomson 1355169663 -0600 checkout: moving from df_side1 to d4207f77243500bec335ab477f9227fcdb1e271a -d4207f77243500bec335ab477f9227fcdb1e271a 849619b03ae540acee4d1edec96b86993da6b497 Edward Thomson 1355169683 -0600 commit: both_dirs -849619b03ae540acee4d1edec96b86993da6b497 d4207f77243500bec335ab477f9227fcdb1e271a Edward Thomson 1355169691 -0600 checkout: moving from 849619b03ae540acee4d1edec96b86993da6b497 to d4207f7 -d4207f77243500bec335ab477f9227fcdb1e271a bd593285fc7fe4ca18ccdbabf027f5d689101452 Edward Thomson 1355169691 -0600 rebase -i (squash): updating HEAD -bd593285fc7fe4ca18ccdbabf027f5d689101452 a765fb87eb2f7a1920b73b2d5a057f8f8476a42b Edward Thomson 1355169691 -0600 rebase -i (squash): df_ancestor -a765fb87eb2f7a1920b73b2d5a057f8f8476a42b 5dc1018e90b19654bee986b7a0c268804d39659d Edward Thomson 1355169706 -0600 checkout: moving from a765fb87eb2f7a1920b73b2d5a057f8f8476a42b to df_side1 -5dc1018e90b19654bee986b7a0c268804d39659d a765fb87eb2f7a1920b73b2d5a057f8f8476a42b Edward Thomson 1355169715 -0600 checkout: moving from df_side1 to a765fb87eb2f7a1920b73b2d5a057f8f8476a42b^0 -a765fb87eb2f7a1920b73b2d5a057f8f8476a42b bc744705e1d8a019993cf88f62bc4020f1b80919 Edward Thomson 1355169801 -0600 commit: df_side1 -bc744705e1d8a019993cf88f62bc4020f1b80919 bc744705e1d8a019993cf88f62bc4020f1b80919 Edward Thomson 1355169822 -0600 checkout: moving from bc744705e1d8a019993cf88f62bc4020f1b80919 to df_side1 -bc744705e1d8a019993cf88f62bc4020f1b80919 fada9356aa3f74622327a3038ae9c6f92e1c5c1d Edward Thomson 1355169826 -0600 checkout: moving from df_side1 to df_side2 -fada9356aa3f74622327a3038ae9c6f92e1c5c1d a765fb87eb2f7a1920b73b2d5a057f8f8476a42b Edward Thomson 1355169866 -0600 checkout: moving from df_side2 to a765fb87eb2f7a1920b73b2d5a057f8f8476a42b^0 -a765fb87eb2f7a1920b73b2d5a057f8f8476a42b 95646149ab6b6ba6edc83cff678582538b457b2b Edward Thomson 1355169897 -0600 rebase: df_side2 -95646149ab6b6ba6edc83cff678582538b457b2b 95646149ab6b6ba6edc83cff678582538b457b2b Edward Thomson 1355169897 -0600 rebase finished: returning to refs/heads/df_side2 -95646149ab6b6ba6edc83cff678582538b457b2b bc744705e1d8a019993cf88f62bc4020f1b80919 Edward Thomson 1355169949 -0600 checkout: moving from df_side2 to df_side1 -bc744705e1d8a019993cf88f62bc4020f1b80919 bd593285fc7fe4ca18ccdbabf027f5d689101452 Edward Thomson 1355170046 -0600 checkout: moving from df_side1 to master -bd593285fc7fe4ca18ccdbabf027f5d689101452 bd593285fc7fe4ca18ccdbabf027f5d689101452 Edward Thomson 1355181639 -0600 checkout: moving from master to df_ancestor -bd593285fc7fe4ca18ccdbabf027f5d689101452 2da538570bc1e5b2c3e855bf702f35248ad0735f Edward Thomson 1355181673 -0600 commit: df_ancestor -2da538570bc1e5b2c3e855bf702f35248ad0735f a7dbfcbfc1a60709cb80b5ca24539008456531d0 Edward Thomson 1355181715 -0600 commit: df_side1 -a7dbfcbfc1a60709cb80b5ca24539008456531d0 a7dbfcbfc1a60709cb80b5ca24539008456531d0 Edward Thomson 1355181743 -0600 checkout: moving from df_ancestor to df_ancestor -a7dbfcbfc1a60709cb80b5ca24539008456531d0 9a301fbe6fada7dcb74fcd7c20269b5c743459a7 Edward Thomson 1355181775 -0600 commit: df_side2 -9a301fbe6fada7dcb74fcd7c20269b5c743459a7 a7dbfcbfc1a60709cb80b5ca24539008456531d0 Edward Thomson 1355181793 -0600 checkout: moving from df_ancestor to df_side1 -a7dbfcbfc1a60709cb80b5ca24539008456531d0 9a301fbe6fada7dcb74fcd7c20269b5c743459a7 Edward Thomson 1355181797 -0600 checkout: moving from df_side1 to df_side2 -9a301fbe6fada7dcb74fcd7c20269b5c743459a7 9a301fbe6fada7dcb74fcd7c20269b5c743459a7 Edward Thomson 1355182062 -0600 checkout: moving from df_side2 to df_ancestor -9a301fbe6fada7dcb74fcd7c20269b5c743459a7 2da538570bc1e5b2c3e855bf702f35248ad0735f Edward Thomson 1355182067 -0600 reset: moving to 2da538570bc1e5b2c3e855bf702f35248ad0735f -2da538570bc1e5b2c3e855bf702f35248ad0735f 2da538570bc1e5b2c3e855bf702f35248ad0735f Edward Thomson 1355182087 -0600 checkout: moving from df_ancestor to df_side2 -2da538570bc1e5b2c3e855bf702f35248ad0735f fc90237dc4891fa6c69827fc465632225e391618 Edward Thomson 1355182104 -0600 commit: df_side2 -fc90237dc4891fa6c69827fc465632225e391618 a7dbfcbfc1a60709cb80b5ca24539008456531d0 Edward Thomson 1355182111 -0600 checkout: moving from df_side2 to df_side1 -a7dbfcbfc1a60709cb80b5ca24539008456531d0 fc90237dc4891fa6c69827fc465632225e391618 Edward Thomson 1355182115 -0600 checkout: moving from df_side1 to df_side2 -fc90237dc4891fa6c69827fc465632225e391618 bd593285fc7fe4ca18ccdbabf027f5d689101452 Edward Thomson 1355182122 -0600 checkout: moving from df_side2 to master -bd593285fc7fe4ca18ccdbabf027f5d689101452 d6cf6c7741b3316826af1314042550c97ded1d50 Edward Thomson 1358997543 -0600 checkout: moving from master to unrelated -d6cf6c7741b3316826af1314042550c97ded1d50 55b4e4687e7a0d9ca367016ed930f385d4022e6f Edward Thomson 1358997664 -0600 commit: conflicting changes -55b4e4687e7a0d9ca367016ed930f385d4022e6f bd593285fc7fe4ca18ccdbabf027f5d689101452 Edward Thomson 1358997675 -0600 checkout: moving from unrelated to master -bd593285fc7fe4ca18ccdbabf027f5d689101452 88e185910a15cd13bdf44854ad037f4842b03b29 Edward Thomson 1365714471 -0500 checkout: moving from master to rename_conflict_ours -88e185910a15cd13bdf44854ad037f4842b03b29 bef6e37b3ee632ba74159168836f382fed21d77d Edward Thomson 1365714516 -0500 checkout: moving from rename_conflict_ours to bef6e37b3ee632ba74159168836f382fed21d77d -bef6e37b3ee632ba74159168836f382fed21d77d 01f149e1b8f84bd8896aaff6d6b22af88459ded0 Edward Thomson 1365714831 -0500 commit: rename ancestor -0000000000000000000000000000000000000000 2392a2dacc9efb562b8635d6579fb458751c7c5b Edward Thomson 1365714958 -0500 commit (initial): rename conflict ancestor -2392a2dacc9efb562b8635d6579fb458751c7c5b 88e185910a15cd13bdf44854ad037f4842b03b29 Edward Thomson 1365714980 -0500 checkout: moving from rename_conflict_ancestor to rename_conflict_ours -88e185910a15cd13bdf44854ad037f4842b03b29 7c2c5228c9e90170d4a35e6558e47163daf092e5 Edward Thomson 1365715250 -0500 commit: rename conflict ours -7c2c5228c9e90170d4a35e6558e47163daf092e5 2f4024ce528d36d8670c289cce5a7963e625bb0c Edward Thomson 1365715274 -0500 checkout: moving from rename_conflict_ours to rename_conflict_theirs -2f4024ce528d36d8670c289cce5a7963e625bb0c 56a638b76b75e068590ac999c2f8621e7f3e264c Edward Thomson 1365715362 -0500 commit: rename conflict theirs -56a638b76b75e068590ac999c2f8621e7f3e264c 2392a2dacc9efb562b8635d6579fb458751c7c5b Edward Thomson 1365715368 -0500 checkout: moving from rename_conflict_theirs to rename_conflict_ancestor -2392a2dacc9efb562b8635d6579fb458751c7c5b 56a638b76b75e068590ac999c2f8621e7f3e264c Edward Thomson 1365715371 -0500 checkout: moving from rename_conflict_ancestor to rename_conflict_theirs -56a638b76b75e068590ac999c2f8621e7f3e264c 2392a2dacc9efb562b8635d6579fb458751c7c5b Edward Thomson 1365715404 -0500 checkout: moving from rename_conflict_theirs to rename_conflict_ancestor -2392a2dacc9efb562b8635d6579fb458751c7c5b 2392a2dacc9efb562b8635d6579fb458751c7c5b Edward Thomson 1365715438 -0500 checkout: moving from rename_conflict_ancestor to rename_conflict_ours -2392a2dacc9efb562b8635d6579fb458751c7c5b 2392a2dacc9efb562b8635d6579fb458751c7c5b Edward Thomson 1365715480 -0500 checkout: moving from rename_conflict_ours to rename_conflict_ancestor -2392a2dacc9efb562b8635d6579fb458751c7c5b 2392a2dacc9efb562b8635d6579fb458751c7c5b Edward Thomson 1365715486 -0500 checkout: moving from rename_conflict_ancestor to rename_conflict_ours -2392a2dacc9efb562b8635d6579fb458751c7c5b f3293571dcd708b6a3faf03818cd2844d000e198 Edward Thomson 1365715538 -0500 commit: rename conflict ours -f3293571dcd708b6a3faf03818cd2844d000e198 2392a2dacc9efb562b8635d6579fb458751c7c5b Edward Thomson 1365715546 -0500 checkout: moving from rename_conflict_ours to rename_conflict_ancestor -2392a2dacc9efb562b8635d6579fb458751c7c5b 2392a2dacc9efb562b8635d6579fb458751c7c5b Edward Thomson 1365715550 -0500 checkout: moving from rename_conflict_ancestor to rename_conflict_thiers -2392a2dacc9efb562b8635d6579fb458751c7c5b 2392a2dacc9efb562b8635d6579fb458751c7c5b Edward Thomson 1365715554 -0500 checkout: moving from rename_conflict_thiers to rename_conflict_ancestor -2392a2dacc9efb562b8635d6579fb458751c7c5b 2392a2dacc9efb562b8635d6579fb458751c7c5b Edward Thomson 1365715557 -0500 checkout: moving from rename_conflict_ancestor to rename_conflict_theirs -2392a2dacc9efb562b8635d6579fb458751c7c5b a802e06f1782a9645b9851bc7202cee74a8a4972 Edward Thomson 1365715572 -0500 commit: rename conflict theirs -a802e06f1782a9645b9851bc7202cee74a8a4972 bd593285fc7fe4ca18ccdbabf027f5d689101452 Edward Thomson 1365715620 -0500 checkout: moving from rename_conflict_theirs to master diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/branch b/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/branch deleted file mode 100644 index 8b0acb7020..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/branch +++ /dev/null @@ -1,2 +0,0 @@ -0000000000000000000000000000000000000000 c607fc30883e335def28cd686b51f6cfa02b06ec Edward Thomson 1351563886 -0500 branch: Created from HEAD -c607fc30883e335def28cd686b51f6cfa02b06ec 7cb63eed597130ba4abb87b3e544b85021905520 Edward Thomson 1351563965 -0500 commit: branch diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/df_ancestor b/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/df_ancestor deleted file mode 100644 index df7695a66d..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/df_ancestor +++ /dev/null @@ -1,5 +0,0 @@ -0000000000000000000000000000000000000000 bd593285fc7fe4ca18ccdbabf027f5d689101452 Edward Thomson 1355181639 -0600 branch: Created from HEAD -bd593285fc7fe4ca18ccdbabf027f5d689101452 2da538570bc1e5b2c3e855bf702f35248ad0735f Edward Thomson 1355181673 -0600 commit: df_ancestor -2da538570bc1e5b2c3e855bf702f35248ad0735f a7dbfcbfc1a60709cb80b5ca24539008456531d0 Edward Thomson 1355181715 -0600 commit: df_side1 -a7dbfcbfc1a60709cb80b5ca24539008456531d0 9a301fbe6fada7dcb74fcd7c20269b5c743459a7 Edward Thomson 1355181775 -0600 commit: df_side2 -9a301fbe6fada7dcb74fcd7c20269b5c743459a7 2da538570bc1e5b2c3e855bf702f35248ad0735f Edward Thomson 1355182067 -0600 reset: moving to 2da538570bc1e5b2c3e855bf702f35248ad0735f diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/df_side1 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/df_side1 deleted file mode 100644 index a504ad610b..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/df_side1 +++ /dev/null @@ -1,14 +0,0 @@ -0000000000000000000000000000000000000000 bd593285fc7fe4ca18ccdbabf027f5d689101452 Edward Thomson 1354574697 -0600 branch: Created from HEAD -bd593285fc7fe4ca18ccdbabf027f5d689101452 d4207f77243500bec335ab477f9227fcdb1e271a Edward Thomson 1354574962 -0600 commit: df_ancestor -d4207f77243500bec335ab477f9227fcdb1e271a c94b27e41064c521120627e07e2035cca1d24ffa Edward Thomson 1354575027 -0600 commit: df_side1 -c94b27e41064c521120627e07e2035cca1d24ffa a90bc3fb6f15181972a2959a921429efbd81a473 Edward Thomson 1355017650 -0600 commit: df_added -a90bc3fb6f15181972a2959a921429efbd81a473 005b6fcc8fec71d2550bef8462d169b3c26aa14b Edward Thomson 1355017676 -0600 rebase -i (finish): refs/heads/df_side1 onto c94b27e -005b6fcc8fec71d2550bef8462d169b3c26aa14b f8958bdf4d365a84a9a178b1f5f35ff1dacbd884 Edward Thomson 1355017715 -0600 reset: moving to df_side2 -f8958bdf4d365a84a9a178b1f5f35ff1dacbd884 8c749d9968d4b10dcfb06c9f97d0e5d92d337071 Edward Thomson 1355017744 -0600 commit: df_added -8c749d9968d4b10dcfb06c9f97d0e5d92d337071 0204a84f822acbf6386b36d33f1f6bc68bbbf858 Edward Thomson 1355017756 -0600 rebase -i (finish): refs/heads/df_side1 onto f8958bd -0204a84f822acbf6386b36d33f1f6bc68bbbf858 005b6fcc8fec71d2550bef8462d169b3c26aa14b Edward Thomson 1355017793 -0600 reset: moving to 005b6fcc8fec71d2550bef8462d169b3c26aa14b -005b6fcc8fec71d2550bef8462d169b3c26aa14b 0204a84f822acbf6386b36d33f1f6bc68bbbf858 Edward Thomson 1355017826 -0600 reset: moving to 0204a84 -005b6fcc8fec71d2550bef8462d169b3c26aa14b e8107f24196736b870a318a0e28f048e29f6feff Edward Thomson 1355169065 -0600 commit: df_side1 -e8107f24196736b870a318a0e28f048e29f6feff 80a8fbb3abb1ba423d554e9630b8fc2e5698f86b Edward Thomson 1355169084 -0600 rebase -i (finish): refs/heads/df_side1 onto 005b6fc -80a8fbb3abb1ba423d554e9630b8fc2e5698f86b e65a9bb2af9f4c2d1c375dd0f8f8a46cf9c68812 Edward Thomson 1355169419 -0600 commit: side1 -e65a9bb2af9f4c2d1c375dd0f8f8a46cf9c68812 5dc1018e90b19654bee986b7a0c268804d39659d Edward Thomson 1355169435 -0600 rebase -i (finish): refs/heads/df_side1 onto 80a8fbb diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/df_side2 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/df_side2 deleted file mode 100644 index 27d833eda2..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/df_side2 +++ /dev/null @@ -1,9 +0,0 @@ -0000000000000000000000000000000000000000 d4207f77243500bec335ab477f9227fcdb1e271a Edward Thomson 1354575051 -0600 branch: Created from d4207f77243500bec335ab477f9227fcdb1e271a -d4207f77243500bec335ab477f9227fcdb1e271a f8958bdf4d365a84a9a178b1f5f35ff1dacbd884 Edward Thomson 1354575206 -0600 commit: df_side2 -0204a84f822acbf6386b36d33f1f6bc68bbbf858 944f5dd1a867cab4c2bbcb896493435cae1dcc1a Edward Thomson 1355169174 -0600 commit: both -944f5dd1a867cab4c2bbcb896493435cae1dcc1a 57079a46233ae2b6df62e9ade71c4948512abefb Edward Thomson 1355169185 -0600 rebase -i (finish): refs/heads/df_side2 onto 0204a84 -57079a46233ae2b6df62e9ade71c4948512abefb 58e853f66699fd02629fd50bde08082bc005933a Edward Thomson 1355169460 -0600 commit: side2 -58e853f66699fd02629fd50bde08082bc005933a fada9356aa3f74622327a3038ae9c6f92e1c5c1d Edward Thomson 1355169471 -0600 rebase -i (finish): refs/heads/df_side2 onto 57079a4 -fada9356aa3f74622327a3038ae9c6f92e1c5c1d 95646149ab6b6ba6edc83cff678582538b457b2b Edward Thomson 1355169897 -0600 rebase finished: refs/heads/df_side2 onto a765fb87eb2f7a1920b73b2d5a057f8f8476a42b -0000000000000000000000000000000000000000 2da538570bc1e5b2c3e855bf702f35248ad0735f Edward Thomson 1355182087 -0600 branch: Created from HEAD -2da538570bc1e5b2c3e855bf702f35248ad0735f fc90237dc4891fa6c69827fc465632225e391618 Edward Thomson 1355182104 -0600 commit: df_side2 diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/ff_branch b/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/ff_branch deleted file mode 100644 index c4706175d1..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/ff_branch +++ /dev/null @@ -1,5 +0,0 @@ -0000000000000000000000000000000000000000 977c696519c5a3004c5f1d15d60c89dbeb8f235f Edward Thomson 1351605785 -0500 branch: Created from HEAD -977c696519c5a3004c5f1d15d60c89dbeb8f235f 33d500f588fbbe65901d82b4e6b008e549064be0 Edward Thomson 1351605830 -0500 commit: fastforward -33d500f588fbbe65901d82b4e6b008e549064be0 c607fc30883e335def28cd686b51f6cfa02b06ec Edward Thomson 1351990202 -0500 reset: moving to c607fc30883e335def28cd686b51f6cfa02b06ec -c607fc30883e335def28cd686b51f6cfa02b06ec bd593285fc7fe4ca18ccdbabf027f5d689101452 Edward Thomson 1351990205 -0500 merge master: Fast-forward -bd593285fc7fe4ca18ccdbabf027f5d689101452 fd89f8cffb663ac89095a0f9764902e93ceaca6a Edward Thomson 1351990229 -0500 commit: fastforward diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/master b/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/master deleted file mode 100644 index 60475992a2..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/master +++ /dev/null @@ -1,5 +0,0 @@ -0000000000000000000000000000000000000000 c607fc30883e335def28cd686b51f6cfa02b06ec Edward Thomson 1351563869 -0500 commit (initial): initial -c607fc30883e335def28cd686b51f6cfa02b06ec 977c696519c5a3004c5f1d15d60c89dbeb8f235f Edward Thomson 1351564033 -0500 commit: master -977c696519c5a3004c5f1d15d60c89dbeb8f235f 4e0d9401aee78eb345a8685a859d37c8c3c0bbed Edward Thomson 1351875091 -0500 merge octo1 octo2 octo3 octo4: Merge made by the 'octopus' strategy. -4e0d9401aee78eb345a8685a859d37c8c3c0bbed 54269b3f6ec3d7d4ede24dd350dd5d605495c3ae Edward Thomson 1351875108 -0500 reset: moving to 54269b3f6ec3d7d4ede24dd350dd5d605495c3ae -54269b3f6ec3d7d4ede24dd350dd5d605495c3ae 977c696519c5a3004c5f1d15d60c89dbeb8f235f Edward Thomson 1351875584 -0500 reset: moving to 977c696519c5a3004c5f1d15d60c89dbeb8f235f diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/octo1 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/octo1 deleted file mode 100644 index 0b6c9214a3..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/octo1 +++ /dev/null @@ -1,2 +0,0 @@ -0000000000000000000000000000000000000000 977c696519c5a3004c5f1d15d60c89dbeb8f235f Edward Thomson 1351874933 -0500 branch: Created from HEAD -977c696519c5a3004c5f1d15d60c89dbeb8f235f 16f825815cfd20a07a75c71554e82d8eede0b061 Edward Thomson 1351874954 -0500 commit: octo1 diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/octo2 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/octo2 deleted file mode 100644 index 5392a4f865..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/octo2 +++ /dev/null @@ -1,2 +0,0 @@ -0000000000000000000000000000000000000000 977c696519c5a3004c5f1d15d60c89dbeb8f235f Edward Thomson 1351874960 -0500 branch: Created from HEAD -977c696519c5a3004c5f1d15d60c89dbeb8f235f 158dc7bedb202f5b26502bf3574faa7f4238d56c Edward Thomson 1351874974 -0500 commit: octo2 diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/octo3 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/octo3 deleted file mode 100644 index 7db5617c80..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/octo3 +++ /dev/null @@ -1,2 +0,0 @@ -0000000000000000000000000000000000000000 977c696519c5a3004c5f1d15d60c89dbeb8f235f Edward Thomson 1351874980 -0500 branch: Created from HEAD -977c696519c5a3004c5f1d15d60c89dbeb8f235f 50ce7d7d01217679e26c55939eef119e0c93e272 Edward Thomson 1351874998 -0500 commit: octo3 diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/octo4 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/octo4 deleted file mode 100644 index b0f9e42ef1..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/octo4 +++ /dev/null @@ -1,2 +0,0 @@ -0000000000000000000000000000000000000000 977c696519c5a3004c5f1d15d60c89dbeb8f235f Edward Thomson 1351875010 -0500 branch: Created from HEAD -977c696519c5a3004c5f1d15d60c89dbeb8f235f 54269b3f6ec3d7d4ede24dd350dd5d605495c3ae Edward Thomson 1351875023 -0500 commit: octo4 diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/octo5 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/octo5 deleted file mode 100644 index 614563edfe..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/octo5 +++ /dev/null @@ -1,2 +0,0 @@ -0000000000000000000000000000000000000000 977c696519c5a3004c5f1d15d60c89dbeb8f235f Edward Thomson 1351875031 -0500 branch: Created from HEAD -977c696519c5a3004c5f1d15d60c89dbeb8f235f e4f618a2c3ed0669308735727df5ebf2447f022f Edward Thomson 1351875041 -0500 commit: octo5 diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/octo6 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/octo6 deleted file mode 100644 index 4c812eaccb..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/octo6 +++ /dev/null @@ -1,3 +0,0 @@ -0000000000000000000000000000000000000000 977c696519c5a3004c5f1d15d60c89dbeb8f235f Edward Thomson 1351875046 -0500 branch: Created from HEAD -977c696519c5a3004c5f1d15d60c89dbeb8f235f 4ca408a8c88655f7586a1b580be6fad138121e98 Edward Thomson 1351875057 -0500 commit: octo5 -4ca408a8c88655f7586a1b580be6fad138121e98 b6f610aef53bd343e6c96227de874c66f00ee8e8 Edward Thomson 1351875065 -0500 commit (amend): octo6 diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/renames1 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/renames1 deleted file mode 100644 index 58a7e0565b..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/renames1 +++ /dev/null @@ -1,2 +0,0 @@ -0000000000000000000000000000000000000000 c607fc30883e335def28cd686b51f6cfa02b06ec Edward Thomson 1353177745 -0600 branch: Created from c607fc30883e335def28cd686b51f6cfa02b06ec -c607fc30883e335def28cd686b51f6cfa02b06ec 412b32fb66137366147f1801ecc962452757d48a Edward Thomson 1353177886 -0600 commit: renames diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/renames2 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/renames2 deleted file mode 100644 index 5645ecee73..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/renames2 +++ /dev/null @@ -1,3 +0,0 @@ -0000000000000000000000000000000000000000 bd593285fc7fe4ca18ccdbabf027f5d689101452 Edward Thomson 1353794647 -0600 branch: Created from HEAD -bd593285fc7fe4ca18ccdbabf027f5d689101452 c607fc30883e335def28cd686b51f6cfa02b06ec Edward Thomson 1353794677 -0600 reset: moving to c607fc30883e335def28cd686b51f6cfa02b06ec -c607fc30883e335def28cd686b51f6cfa02b06ec ab40af3cb8a3ed2e2843e96d9aa7871336b94573 Edward Thomson 1353794852 -0600 commit: renames2 diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/trivial-10 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/trivial-10 deleted file mode 100644 index b6bd247e75..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/trivial-10 +++ /dev/null @@ -1,3 +0,0 @@ -0000000000000000000000000000000000000000 c607fc30883e335def28cd686b51f6cfa02b06ec Edward Thomson 1352100171 -0600 branch: Created from c607fc30883e335def28cd686b51f6cfa02b06ec -c607fc30883e335def28cd686b51f6cfa02b06ec 53825f41ac8d640612f9423a2f03a69f3d96809a Edward Thomson 1352100193 -0600 commit: trivial-10 -53825f41ac8d640612f9423a2f03a69f3d96809a 0ec5f433959cd46177f745903353efb5be08d151 Edward Thomson 1352100223 -0600 commit: trivial-10 diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/trivial-10-branch b/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/trivial-10-branch deleted file mode 100644 index 14ce9e545e..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/trivial-10-branch +++ /dev/null @@ -1,2 +0,0 @@ -0000000000000000000000000000000000000000 53825f41ac8d640612f9423a2f03a69f3d96809a Edward Thomson 1352100200 -0600 branch: Created from HEAD -53825f41ac8d640612f9423a2f03a69f3d96809a 11f4f3c08b737f5fd896cbefa1425ee63b21b2fa Edward Thomson 1352100211 -0600 commit: trivial-10-branch diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/trivial-11 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/trivial-11 deleted file mode 100644 index 3e6b774370..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/trivial-11 +++ /dev/null @@ -1,3 +0,0 @@ -0000000000000000000000000000000000000000 c607fc30883e335def28cd686b51f6cfa02b06ec Edward Thomson 1352100930 -0600 branch: Created from c607fc30883e335def28cd686b51f6cfa02b06ec -c607fc30883e335def28cd686b51f6cfa02b06ec 35632e43612c06a3ea924bfbacd48333da874c29 Edward Thomson 1352100958 -0600 commit: trivial-11 -35632e43612c06a3ea924bfbacd48333da874c29 3168dca1a561889b045a6441909f4c56145e666d Edward Thomson 1352100992 -0600 commit: trivial-11 diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/trivial-11-branch b/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/trivial-11-branch deleted file mode 100644 index 30d5ec7a34..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/trivial-11-branch +++ /dev/null @@ -1,2 +0,0 @@ -0000000000000000000000000000000000000000 35632e43612c06a3ea924bfbacd48333da874c29 Edward Thomson 1352100964 -0600 branch: Created from HEAD -35632e43612c06a3ea924bfbacd48333da874c29 6718a45909532d1fcf5600d0877f7fe7e78f0b86 Edward Thomson 1352100978 -0600 commit: trivial-11-branch diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/trivial-13 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/trivial-13 deleted file mode 100644 index 3a7302dea2..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/trivial-13 +++ /dev/null @@ -1,3 +0,0 @@ -0000000000000000000000000000000000000000 c607fc30883e335def28cd686b51f6cfa02b06ec Edward Thomson 1352100559 -0600 branch: Created from c607fc30883e335def28cd686b51f6cfa02b06ec -c607fc30883e335def28cd686b51f6cfa02b06ec 8f4433f8593ddd65b7dd43dd4564d841f4d9c8aa Edward Thomson 1352100589 -0600 commit: trivial-13 -8f4433f8593ddd65b7dd43dd4564d841f4d9c8aa a3fabece9eb8748da810e1e08266fef9b7136ad4 Edward Thomson 1352100625 -0600 commit: trivial-13 diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/trivial-13-branch b/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/trivial-13-branch deleted file mode 100644 index bb26042448..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/trivial-13-branch +++ /dev/null @@ -1,2 +0,0 @@ -0000000000000000000000000000000000000000 8f4433f8593ddd65b7dd43dd4564d841f4d9c8aa Edward Thomson 1352100604 -0600 branch: Created from HEAD -8f4433f8593ddd65b7dd43dd4564d841f4d9c8aa 05f3c1a2a56ca95c3d2ef28dc9ddf32b5cd6c91c Edward Thomson 1352100610 -0600 commit: trivial-13-branch diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/trivial-14 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/trivial-14 deleted file mode 100644 index 4b70d2898a..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/trivial-14 +++ /dev/null @@ -1,3 +0,0 @@ -0000000000000000000000000000000000000000 c607fc30883e335def28cd686b51f6cfa02b06ec Edward Thomson 1352101083 -0600 branch: Created from c607fc30883e335def28cd686b51f6cfa02b06ec -c607fc30883e335def28cd686b51f6cfa02b06ec 596803b523203a4851c824c07366906f8353f4ad Edward Thomson 1352101113 -0600 commit: trivial-14 -596803b523203a4851c824c07366906f8353f4ad 7e2d058d5fedf8329db44db4fac610d6b1a89159 Edward Thomson 1352101141 -0600 commit: trivial-14 diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/trivial-14-branch b/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/trivial-14-branch deleted file mode 100644 index 8e491ca684..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/trivial-14-branch +++ /dev/null @@ -1,2 +0,0 @@ -0000000000000000000000000000000000000000 596803b523203a4851c824c07366906f8353f4ad Edward Thomson 1352101117 -0600 branch: Created from HEAD -596803b523203a4851c824c07366906f8353f4ad 8187117062b750eed4f93fd7e899f17b52ce554d Edward Thomson 1352101132 -0600 commit: trivial-14-branch diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/trivial-2alt b/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/trivial-2alt deleted file mode 100644 index a2a28d4012..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/trivial-2alt +++ /dev/null @@ -1,2 +0,0 @@ -0000000000000000000000000000000000000000 c607fc30883e335def28cd686b51f6cfa02b06ec Edward Thomson 1352091695 -0600 branch: Created from c607fc30883e335def28cd686b51f6cfa02b06ec -c607fc30883e335def28cd686b51f6cfa02b06ec 566ab53c220a2eafc1212af1a024513230280ab9 Edward Thomson 1352092452 -0600 commit: 2alt diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/trivial-2alt-branch b/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/trivial-2alt-branch deleted file mode 100644 index a0a48ae351..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/trivial-2alt-branch +++ /dev/null @@ -1,2 +0,0 @@ -0000000000000000000000000000000000000000 c607fc30883e335def28cd686b51f6cfa02b06ec Edward Thomson 1352092411 -0600 branch: Created from HEAD -c607fc30883e335def28cd686b51f6cfa02b06ec c9174cef549ec94ecbc43ef03cdc775b4950becb Edward Thomson 1352092434 -0600 commit: 2alt-branch diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/trivial-3alt b/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/trivial-3alt deleted file mode 100644 index 4374d3888b..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/trivial-3alt +++ /dev/null @@ -1,3 +0,0 @@ -566ab53c220a2eafc1212af1a024513230280ab9 c607fc30883e335def28cd686b51f6cfa02b06ec Edward Thomson 1352094547 -0600 reset: moving to c607fc30883e335def28cd686b51f6cfa02b06ec -c607fc30883e335def28cd686b51f6cfa02b06ec 5459c89aa0026d543ce8343bd89871bce543f9c2 Edward Thomson 1352094580 -0600 commit: 3alt -5459c89aa0026d543ce8343bd89871bce543f9c2 4c9fac0707f8d4195037ae5a681aa48626491541 Edward Thomson 1352094610 -0600 commit: 3alt-branch diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/trivial-3alt-branch b/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/trivial-3alt-branch deleted file mode 100644 index 7a2e6f8223..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/trivial-3alt-branch +++ /dev/null @@ -1 +0,0 @@ -0000000000000000000000000000000000000000 c607fc30883e335def28cd686b51f6cfa02b06ec Edward Thomson 1352094594 -0600 branch: Created from c607fc30883e335def28cd686b51f6cfa02b06ec diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/trivial-4 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/trivial-4 deleted file mode 100644 index 3ee6d25033..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/trivial-4 +++ /dev/null @@ -1,2 +0,0 @@ -566ab53c220a2eafc1212af1a024513230280ab9 c607fc30883e335def28cd686b51f6cfa02b06ec Edward Thomson 1352094764 -0600 reset: moving to c607fc30883e335def28cd686b51f6cfa02b06ec -c607fc30883e335def28cd686b51f6cfa02b06ec cc3e3009134cb88014129fc8858d1101359e5e2f Edward Thomson 1352094815 -0600 commit: trivial-4 diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/trivial-4-branch b/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/trivial-4-branch deleted file mode 100644 index 51f8a9290d..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/trivial-4-branch +++ /dev/null @@ -1,2 +0,0 @@ -0000000000000000000000000000000000000000 c607fc30883e335def28cd686b51f6cfa02b06ec Edward Thomson 1352094830 -0600 branch: Created from c607fc30883e335def28cd686b51f6cfa02b06ec -c607fc30883e335def28cd686b51f6cfa02b06ec 183310e30fb1499af8c619108ffea4d300b5e778 Edward Thomson 1352094856 -0600 commit: trivial-4-branch diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/trivial-5alt-1 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/trivial-5alt-1 deleted file mode 100644 index 14497029aa..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/trivial-5alt-1 +++ /dev/null @@ -1,2 +0,0 @@ -0000000000000000000000000000000000000000 c607fc30883e335def28cd686b51f6cfa02b06ec Edward Thomson 1352096606 -0600 branch: Created from c607fc30883e335def28cd686b51f6cfa02b06ec -c607fc30883e335def28cd686b51f6cfa02b06ec 4fe93c0ec83eb6305cbace3dace88ecee1b63cb6 Edward Thomson 1352096643 -0600 commit: 5alt-1 diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/trivial-5alt-1-branch b/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/trivial-5alt-1-branch deleted file mode 100644 index 4cff835265..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/trivial-5alt-1-branch +++ /dev/null @@ -1,2 +0,0 @@ -0000000000000000000000000000000000000000 c607fc30883e335def28cd686b51f6cfa02b06ec Edward Thomson 1352096657 -0600 branch: Created from c607fc30883e335def28cd686b51f6cfa02b06ec -c607fc30883e335def28cd686b51f6cfa02b06ec 478172cb2f5ff9b514bc9d04d3bd5ef5840cb3b2 Edward Thomson 1352096689 -0600 commit: 5alt-1-branch diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/trivial-5alt-2 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/trivial-5alt-2 deleted file mode 100644 index 3ca077b296..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/trivial-5alt-2 +++ /dev/null @@ -1,3 +0,0 @@ -0000000000000000000000000000000000000000 c607fc30883e335def28cd686b51f6cfa02b06ec Edward Thomson 1352096711 -0600 branch: Created from c607fc30883e335def28cd686b51f6cfa02b06ec -c607fc30883e335def28cd686b51f6cfa02b06ec ebc09d0137cfb0c26697aed0109fb943ad906f3f Edward Thomson 1352096764 -0600 commit: existing file -ebc09d0137cfb0c26697aed0109fb943ad906f3f 3b47b031b3e55ae11e14a05260b1c3ffd6838d55 Edward Thomson 1352096815 -0600 commit: 5alt-2 diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/trivial-5alt-2-branch b/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/trivial-5alt-2-branch deleted file mode 100644 index e7bb901f27..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/trivial-5alt-2-branch +++ /dev/null @@ -1,2 +0,0 @@ -0000000000000000000000000000000000000000 ebc09d0137cfb0c26697aed0109fb943ad906f3f Edward Thomson 1352096833 -0600 branch: Created from ebc09d0 -ebc09d0137cfb0c26697aed0109fb943ad906f3f f48097eb340dc5a7cae55aabcf1faf4548aa821f Edward Thomson 1352096855 -0600 commit: 5alt-2-branch diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/trivial-6 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/trivial-6 deleted file mode 100644 index 7c717a2105..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/trivial-6 +++ /dev/null @@ -1,3 +0,0 @@ -0000000000000000000000000000000000000000 c607fc30883e335def28cd686b51f6cfa02b06ec Edward Thomson 1352097371 -0600 branch: Created from c607fc30883e335def28cd686b51f6cfa02b06ec -c607fc30883e335def28cd686b51f6cfa02b06ec f7c332bd4d4d4b777366cae4d24d1687477576bf Edward Thomson 1352097389 -0600 commit: 6 -f7c332bd4d4d4b777366cae4d24d1687477576bf 99b4f7e4f24470fa06b980bc21f1095c2a9425c0 Edward Thomson 1352097404 -0600 commit: trivial-6 diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/trivial-6-branch b/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/trivial-6-branch deleted file mode 100644 index 715f3ae1c2..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/trivial-6-branch +++ /dev/null @@ -1,2 +0,0 @@ -0000000000000000000000000000000000000000 f7c332bd4d4d4b777366cae4d24d1687477576bf Edward Thomson 1352097414 -0600 branch: Created from f7c332bd4d4d4b777366cae4d24d1687477576bf -f7c332bd4d4d4b777366cae4d24d1687477576bf a43150a738849c59376cf30bb2a68348a83c8f48 Edward Thomson 1352097431 -0600 commit: 6-branch diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/trivial-7 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/trivial-7 deleted file mode 100644 index a014f1722b..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/trivial-7 +++ /dev/null @@ -1,3 +0,0 @@ -0000000000000000000000000000000000000000 c607fc30883e335def28cd686b51f6cfa02b06ec Edward Thomson 1352099765 -0600 branch: Created from c607fc30883e335def28cd686b51f6cfa02b06ec -c607fc30883e335def28cd686b51f6cfa02b06ec 092ce8682d7f3a2a3a769a6daca58950168ba5c4 Edward Thomson 1352099790 -0600 commit: trivial-7 -092ce8682d7f3a2a3a769a6daca58950168ba5c4 d874671ef5b20184836cb983bb273e5280384d0b Edward Thomson 1352099947 -0600 commit: trivial-7 diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/trivial-7-branch b/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/trivial-7-branch deleted file mode 100644 index 22331d78cc..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/trivial-7-branch +++ /dev/null @@ -1,5 +0,0 @@ -0000000000000000000000000000000000000000 092ce8682d7f3a2a3a769a6daca58950168ba5c4 Edward Thomson 1352099799 -0600 branch: Created from HEAD -092ce8682d7f3a2a3a769a6daca58950168ba5c4 73cbfdc4fe843169e5b2af8dcad03cbf3acf306c Edward Thomson 1352099812 -0600 commit: trivial-7-branch -73cbfdc4fe843169e5b2af8dcad03cbf3acf306c 092ce8682d7f3a2a3a769a6daca58950168ba5c4 Edward Thomson 1352099874 -0600 reset: moving to 092ce8682d7f3a2a3a769a6daca58950168ba5c4 -092ce8682d7f3a2a3a769a6daca58950168ba5c4 009b9cab6fdac02915a88ecd078b7a792ed802d8 Edward Thomson 1352099921 -0600 commit: removed in 7 -009b9cab6fdac02915a88ecd078b7a792ed802d8 5195a1b480f66691b667f10a9e41e70115a78351 Edward Thomson 1352099927 -0600 commit (amend): trivial-7-branch diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/trivial-8 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/trivial-8 deleted file mode 100644 index 7670c35066..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/trivial-8 +++ /dev/null @@ -1,3 +0,0 @@ -0000000000000000000000000000000000000000 c607fc30883e335def28cd686b51f6cfa02b06ec Edward Thomson 1352098816 -0600 branch: Created from c607fc30883e335def28cd686b51f6cfa02b06ec -c607fc30883e335def28cd686b51f6cfa02b06ec 75a811bf6bc57694adb3fe604786f3a4efd1cd1b Edward Thomson 1352098884 -0600 commit: trivial-8 -75a811bf6bc57694adb3fe604786f3a4efd1cd1b 3575826c96a975031d2c14368529cc5c4353a8fd Edward Thomson 1352099000 -0600 commit: trivial-8 diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/trivial-8-branch b/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/trivial-8-branch deleted file mode 100644 index c4d68edcf8..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/trivial-8-branch +++ /dev/null @@ -1,2 +0,0 @@ -0000000000000000000000000000000000000000 75a811bf6bc57694adb3fe604786f3a4efd1cd1b Edward Thomson 1352098947 -0600 branch: Created from HEAD -75a811bf6bc57694adb3fe604786f3a4efd1cd1b 52d8bc572af2b6d4ee0d5e62ed5d1fbad92210a9 Edward Thomson 1352098979 -0600 commit: trivial-8-branch diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/trivial-9 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/trivial-9 deleted file mode 100644 index 09a343bdb5..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/trivial-9 +++ /dev/null @@ -1,3 +0,0 @@ -0000000000000000000000000000000000000000 c607fc30883e335def28cd686b51f6cfa02b06ec Edward Thomson 1352100268 -0600 branch: Created from c607fc30883e335def28cd686b51f6cfa02b06ec -c607fc30883e335def28cd686b51f6cfa02b06ec f0053b8060bb3f0be5cbcc3147a07ece26bf097e Edward Thomson 1352100304 -0600 commit: trivial-9 -f0053b8060bb3f0be5cbcc3147a07ece26bf097e c35dee9bcc0e989f3b0c40f68372a9a51b6c4e6a Edward Thomson 1352100333 -0600 commit: trivial-9 diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/trivial-9-branch b/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/trivial-9-branch deleted file mode 100644 index 1b126fb7be..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/trivial-9-branch +++ /dev/null @@ -1,2 +0,0 @@ -0000000000000000000000000000000000000000 f0053b8060bb3f0be5cbcc3147a07ece26bf097e Edward Thomson 1352100310 -0600 branch: Created from HEAD -f0053b8060bb3f0be5cbcc3147a07ece26bf097e 13d1be4ea52a6ced1d7a1d832f0ee3c399348e5e Edward Thomson 1352100317 -0600 commit: trivial-9-branch diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/unrelated b/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/unrelated deleted file mode 100644 index a83ffc26a5..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/logs/refs/heads/unrelated +++ /dev/null @@ -1 +0,0 @@ -d6cf6c7741b3316826af1314042550c97ded1d50 55b4e4687e7a0d9ca367016ed930f385d4022e6f Edward Thomson 1358997664 -0600 commit: conflicting changes diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/modules/submodule/HEAD b/vendor/libgit2/tests/resources/merge-resolve/.gitted/modules/submodule/HEAD deleted file mode 100644 index cb089cd89a..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/modules/submodule/HEAD +++ /dev/null @@ -1 +0,0 @@ -ref: refs/heads/master diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/modules/submodule/ORIG_HEAD b/vendor/libgit2/tests/resources/merge-resolve/.gitted/modules/submodule/ORIG_HEAD deleted file mode 100644 index d1bfcf0f4b..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/modules/submodule/ORIG_HEAD +++ /dev/null @@ -1 +0,0 @@ -ae39c77c70cb6bad18bb471912460c4e1ba0f586 diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/modules/submodule/config b/vendor/libgit2/tests/resources/merge-resolve/.gitted/modules/submodule/config deleted file mode 100644 index 575cc85995..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/modules/submodule/config +++ /dev/null @@ -1,15 +0,0 @@ -[core] - repositoryformatversion = 0 - filemode = false - bare = false - logallrefupdates = true - worktree = ../../../submodule - symlinks = false - ignorecase = true - hideDotFiles = dotGitOnly -[remote "origin"] - url = c:/Temp/TestRepos/submodule - fetch = +refs/heads/*:refs/remotes/origin/* -[branch "master"] - remote = origin - merge = refs/heads/master diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/modules/submodule/index b/vendor/libgit2/tests/resources/merge-resolve/.gitted/modules/submodule/index deleted file mode 100644 index e948afb27f..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/modules/submodule/index and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/modules/submodule/info/exclude b/vendor/libgit2/tests/resources/merge-resolve/.gitted/modules/submodule/info/exclude deleted file mode 100644 index a5196d1be8..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/modules/submodule/info/exclude +++ /dev/null @@ -1,6 +0,0 @@ -# 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/vendor/libgit2/tests/resources/merge-resolve/.gitted/modules/submodule/objects/18/fae1354bba0a5f1e6a531f9988369142c24a9e b/vendor/libgit2/tests/resources/merge-resolve/.gitted/modules/submodule/objects/18/fae1354bba0a5f1e6a531f9988369142c24a9e deleted file mode 100644 index fcf1c63810..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/modules/submodule/objects/18/fae1354bba0a5f1e6a531f9988369142c24a9e and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/modules/submodule/objects/29/7aa6cd028b3336c7802c7a6f49143da4e1602d b/vendor/libgit2/tests/resources/merge-resolve/.gitted/modules/submodule/objects/29/7aa6cd028b3336c7802c7a6f49143da4e1602d deleted file mode 100644 index aa9fc50069..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/modules/submodule/objects/29/7aa6cd028b3336c7802c7a6f49143da4e1602d and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/modules/submodule/objects/38/6c80dc813b89d719797668f40c1be0a6efa996 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/modules/submodule/objects/38/6c80dc813b89d719797668f40c1be0a6efa996 deleted file mode 100644 index bc9a32ebc1..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/modules/submodule/objects/38/6c80dc813b89d719797668f40c1be0a6efa996 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/modules/submodule/objects/ab/435a147bae6d5906ecfd0916a570c4ab3eeea8 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/modules/submodule/objects/ab/435a147bae6d5906ecfd0916a570c4ab3eeea8 deleted file mode 100644 index 65a8d759f2..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/modules/submodule/objects/ab/435a147bae6d5906ecfd0916a570c4ab3eeea8 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/modules/submodule/objects/ad/16e0a7684ea95bf892980a2ee412293ae979cc b/vendor/libgit2/tests/resources/merge-resolve/.gitted/modules/submodule/objects/ad/16e0a7684ea95bf892980a2ee412293ae979cc deleted file mode 100644 index 49e1aafeb0..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/modules/submodule/objects/ad/16e0a7684ea95bf892980a2ee412293ae979cc and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/modules/submodule/objects/ae/39c77c70cb6bad18bb471912460c4e1ba0f586 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/modules/submodule/objects/ae/39c77c70cb6bad18bb471912460c4e1ba0f586 deleted file mode 100644 index 6ceffdd4e6..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/modules/submodule/objects/ae/39c77c70cb6bad18bb471912460c4e1ba0f586 +++ /dev/null @@ -1,2 +0,0 @@ -xĄŽË !@=S hfů%Ćx±†!ëĹ Ćö]kđöň/Ź{kŹ©-âa] xW«s =,lÄP…‰ -Šë#g0KČęIC¶© –ž–,5ů“1ˇ– ™9;aălB«č=×>ô­|h}_{{őMźe·?ş¶Źţęuž¸·‹6Ŕšô"€Úí>:叄Ę6^Ő¤±Kd \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/modules/submodule/objects/c2/0765f6e24e8bbb63a648d0d11d84da63170190 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/modules/submodule/objects/c2/0765f6e24e8bbb63a648d0d11d84da63170190 deleted file mode 100644 index 14781032fd..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/modules/submodule/objects/c2/0765f6e24e8bbb63a648d0d11d84da63170190 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/modules/submodule/objects/d3/d806a4bef96889117fd7ebac0e3cb5ec152932 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/modules/submodule/objects/d3/d806a4bef96889117fd7ebac0e3cb5ec152932 deleted file mode 100644 index 8df72a45cd..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/modules/submodule/objects/d3/d806a4bef96889117fd7ebac0e3cb5ec152932 +++ /dev/null @@ -1,3 +0,0 @@ -xĄŤA -Â0E]çse¦mÚDÜx˝Ŕ$™Ň‚é@šâőŤgpóřĽĹQs^+·§ZD€ĂĐ[¦a -,c˛G‰sBO#Ű ăŔˇv†ŹşhGúpIđZ4ďşÁUšý­{^cŃ]çz‰šo@˝ÇŽ\çÎčMł-\ĺŹ óZC'g$楧¦čfćé&%ć%g€5¬ÎqYôÂeŇZoÇÝŮkÚMíć2­éĆÔ›X\’ZDPC~^ZNfrIf^:Xéő›ZHŮŠž1O(_ś,'ş× jvn~JfZ&Ä5†&ȚؽůÁ„ +gĆz¬źĄ•4íú3Ž^¨¦˘ÔÜü2 ÜüI{•|ţą÷ 2m»gÜËľ‹©É1ÖËĺŹüŠ5ÓżÜ,\“µ})TC)0XŔˇv˙‰ůzÖ›¦9–¤×Mü°úŐ…'6óbó#— \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/05/8541fc37114bfc1dddf6bd6bffc7fae5c2e6fe b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/05/8541fc37114bfc1dddf6bd6bffc7fae5c2e6fe deleted file mode 100644 index d79dc30ba7..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/05/8541fc37114bfc1dddf6bd6bffc7fae5c2e6fe and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/05/f3c1a2a56ca95c3d2ef28dc9ddf32b5cd6c91c b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/05/f3c1a2a56ca95c3d2ef28dc9ddf32b5cd6c91c deleted file mode 100644 index 7b4b152f34..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/05/f3c1a2a56ca95c3d2ef28dc9ddf32b5cd6c91c and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/07/a759da919f737221791d542f176ab49c88837f b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/07/a759da919f737221791d542f176ab49c88837f deleted file mode 100644 index a34b6c2356..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/07/a759da919f737221791d542f176ab49c88837f and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/07/c514b04698e068892b31c8d352b85813b99c6e b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/07/c514b04698e068892b31c8d352b85813b99c6e deleted file mode 100644 index 23ab921714..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/07/c514b04698e068892b31c8d352b85813b99c6e and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/09/055301463b7f2f8ee5d368f8ed5c0a40ad8515 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/09/055301463b7f2f8ee5d368f8ed5c0a40ad8515 deleted file mode 100644 index bf5b0fcc57..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/09/055301463b7f2f8ee5d368f8ed5c0a40ad8515 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/09/17bb159596aea4d295f4857da77e8f96b3c7dc b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/09/17bb159596aea4d295f4857da77e8f96b3c7dc deleted file mode 100644 index 9fb640dd5c..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/09/17bb159596aea4d295f4857da77e8f96b3c7dc and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/09/2ce8682d7f3a2a3a769a6daca58950168ba5c4 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/09/2ce8682d7f3a2a3a769a6daca58950168ba5c4 deleted file mode 100644 index b709cf461b..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/09/2ce8682d7f3a2a3a769a6daca58950168ba5c4 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/09/3bebf072dd4bbba88833667d6ffe454df199e1 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/09/3bebf072dd4bbba88833667d6ffe454df199e1 deleted file mode 100644 index ae13207d74..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/09/3bebf072dd4bbba88833667d6ffe454df199e1 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/09/768bed22680cdb0859683fa9677ccc8d5a25c1 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/09/768bed22680cdb0859683fa9677ccc8d5a25c1 deleted file mode 100644 index 5f4b4dab13..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/09/768bed22680cdb0859683fa9677ccc8d5a25c1 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/0a/75d9aac1dc84fb5aa51f7325c0ab53242ddef7 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/0a/75d9aac1dc84fb5aa51f7325c0ab53242ddef7 deleted file mode 100644 index d5377341aa..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/0a/75d9aac1dc84fb5aa51f7325c0ab53242ddef7 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/0c/fd6c54ef6532d862408f562309dc9c74a401e8 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/0c/fd6c54ef6532d862408f562309dc9c74a401e8 deleted file mode 100644 index 40f628f891..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/0c/fd6c54ef6532d862408f562309dc9c74a401e8 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/0d/52e3a556e189ba0948ae56780918011c1b167d b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/0d/52e3a556e189ba0948ae56780918011c1b167d deleted file mode 100644 index 4b633e5043..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/0d/52e3a556e189ba0948ae56780918011c1b167d and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/0d/872f8e871a30208305978ecbf9e66d864f1638 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/0d/872f8e871a30208305978ecbf9e66d864f1638 deleted file mode 100644 index 4cbc18e844..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/0d/872f8e871a30208305978ecbf9e66d864f1638 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/0e/c5f433959cd46177f745903353efb5be08d151 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/0e/c5f433959cd46177f745903353efb5be08d151 deleted file mode 100644 index 1bee56c14b..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/0e/c5f433959cd46177f745903353efb5be08d151 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/0f/3fc5dddc8964b9ac1040d0e957f9eb02d9efb3 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/0f/3fc5dddc8964b9ac1040d0e957f9eb02d9efb3 deleted file mode 100644 index d0ca42dad7..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/0f/3fc5dddc8964b9ac1040d0e957f9eb02d9efb3 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/11/aeee27ac45a8402c2fd5b875d66dd844e5df00 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/11/aeee27ac45a8402c2fd5b875d66dd844e5df00 deleted file mode 100644 index 90e729f6d4..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/11/aeee27ac45a8402c2fd5b875d66dd844e5df00 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/11/deab00b2d3a6f5a3073988ac050c2d7b6655e2 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/11/deab00b2d3a6f5a3073988ac050c2d7b6655e2 deleted file mode 100644 index 857b236867..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/11/deab00b2d3a6f5a3073988ac050c2d7b6655e2 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/11/f4f3c08b737f5fd896cbefa1425ee63b21b2fa b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/11/f4f3c08b737f5fd896cbefa1425ee63b21b2fa deleted file mode 100644 index 6555194cb0..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/11/f4f3c08b737f5fd896cbefa1425ee63b21b2fa +++ /dev/null @@ -1 +0,0 @@ -xĄŽQ Dýć\ fw)cüń^` Ű´‰-QŻ/oŕßĚ›Ědb^ץj˛´«EDC˛$†­u‚>Ś ˇ÷,Ö z@Ś8˘’şq‘­jk<Ů©GŽ>ąŇz2Lva2)¸VeĹŹ:ç˘ĎéĹ%éËś×{ŢôAý¨“|źŰÇĽ5K@ş mg«ü9ŁjYž _;„n,ĽĹY˝y˛P” \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/13/d1be4ea52a6ced1d7a1d832f0ee3c399348e5e b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/13/d1be4ea52a6ced1d7a1d832f0ee3c399348e5e deleted file mode 100644 index 4e4e175e81..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/13/d1be4ea52a6ced1d7a1d832f0ee3c399348e5e and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/14/39088f509b79b1535b64193137d3ce4b240734 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/14/39088f509b79b1535b64193137d3ce4b240734 deleted file mode 100644 index 51ddf6dcb9..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/14/39088f509b79b1535b64193137d3ce4b240734 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/15/8dc7bedb202f5b26502bf3574faa7f4238d56c b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/15/8dc7bedb202f5b26502bf3574faa7f4238d56c deleted file mode 100644 index 064423d0c9..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/15/8dc7bedb202f5b26502bf3574faa7f4238d56c +++ /dev/null @@ -1,2 +0,0 @@ -xĄŽK!D]sŠľ€¦ůCbŚoŕ i2. bĽľŁńîŞŢK*E˝µŰep73UÓľ*NYYôI˛Ô”)–jĽŠL:8§<‹{ĽNŢ“‹ÎĘH6iDC¶Ę"mqH!–Ě9TĄmé9—>ŕR^i¸.˝=ú -GŢč'ťů+~í@˝ť@j+7ŃŘŁEÝÎNţsFtš]‰7bN) \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/16/f825815cfd20a07a75c71554e82d8eede0b061 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/16/f825815cfd20a07a75c71554e82d8eede0b061 deleted file mode 100644 index 82d65253bf..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/16/f825815cfd20a07a75c71554e82d8eede0b061 +++ /dev/null @@ -1 +0,0 @@ -xĄŽK!D]sŠľ€†šObŚoŕ Ś ŻďhĽ»Ş÷’Jqoí6Aą›Ł°JŮ€¬“T1h˘3§Ł·Î'LŐ ó.‰{eťśc,a`ŠZJĂT1#e+هśJňUiŞ">çŇ\ň+Ž ×Ą·G_áX6úIçňżvŕŢN€šĐ;ČŔ^’”bŁŰŮYţśťgGń—MMµ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/17/8940b450f238a56c0d75b7955cb57b38191982 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/17/8940b450f238a56c0d75b7955cb57b38191982 deleted file mode 100644 index 94e571e654..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/17/8940b450f238a56c0d75b7955cb57b38191982 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/18/3310e30fb1499af8c619108ffea4d300b5e778 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/18/3310e30fb1499af8c619108ffea4d300b5e778 deleted file mode 100644 index 1c4010d047..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/18/3310e30fb1499af8c619108ffea4d300b5e778 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/18/cb316b1cefa0f8a6946f0e201a8e1a6f845ab9 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/18/cb316b1cefa0f8a6946f0e201a8e1a6f845ab9 deleted file mode 100644 index 30f3110f12..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/18/cb316b1cefa0f8a6946f0e201a8e1a6f845ab9 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/19/b7ac485269b672a101060894de3ba9c2a24dd1 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/19/b7ac485269b672a101060894de3ba9c2a24dd1 deleted file mode 100644 index e34ccb855c..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/19/b7ac485269b672a101060894de3ba9c2a24dd1 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/1a/010b1c0f081b2e8901d55307a15c29ff30af0e b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/1a/010b1c0f081b2e8901d55307a15c29ff30af0e deleted file mode 100644 index 6039df00eb..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/1a/010b1c0f081b2e8901d55307a15c29ff30af0e and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/1c/51d885170f57a0c4e8c69ff6363d91a5b51f85 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/1c/51d885170f57a0c4e8c69ff6363d91a5b51f85 deleted file mode 100644 index 9a21e26c0a..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/1c/51d885170f57a0c4e8c69ff6363d91a5b51f85 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/1c/ff9ec6a47a537380dedfdd17c9e76d74259a2b b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/1c/ff9ec6a47a537380dedfdd17c9e76d74259a2b deleted file mode 100644 index 30802bcecd..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/1c/ff9ec6a47a537380dedfdd17c9e76d74259a2b and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/1e/4ff029aee68d0d69ef9eb6efa6cbf1ec732f99 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/1e/4ff029aee68d0d69ef9eb6efa6cbf1ec732f99 deleted file mode 100644 index 5183b8360a..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/1e/4ff029aee68d0d69ef9eb6efa6cbf1ec732f99 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/1f/81433e3161efbf250576c58fede7f6b836f3d3 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/1f/81433e3161efbf250576c58fede7f6b836f3d3 deleted file mode 100644 index 9708556753..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/1f/81433e3161efbf250576c58fede7f6b836f3d3 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/20/91d94c8bd3eb0835dc5220de5e8bb310fa1513 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/20/91d94c8bd3eb0835dc5220de5e8bb310fa1513 deleted file mode 100644 index a843890c07..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/20/91d94c8bd3eb0835dc5220de5e8bb310fa1513 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/21/671e290278286fb2ce4c63d01699b67adce331 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/21/671e290278286fb2ce4c63d01699b67adce331 deleted file mode 100644 index b656d00015..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/21/671e290278286fb2ce4c63d01699b67adce331 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/22/7792b52aaa0b238bea00ec7e509b02623f168c b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/22/7792b52aaa0b238bea00ec7e509b02623f168c deleted file mode 100644 index 3bb19bb772..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/22/7792b52aaa0b238bea00ec7e509b02623f168c and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/23/3c0919c998ed110a4b6ff36f353aec8b713487 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/23/3c0919c998ed110a4b6ff36f353aec8b713487 deleted file mode 100644 index d0c8c9e1df..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/23/3c0919c998ed110a4b6ff36f353aec8b713487 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/23/92a2dacc9efb562b8635d6579fb458751c7c5b b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/23/92a2dacc9efb562b8635d6579fb458751c7c5b deleted file mode 100644 index 86127a344b..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/23/92a2dacc9efb562b8635d6579fb458751c7c5b and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/23/ed141a6ae1e798b2f721afedbe947c119111ba b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/23/ed141a6ae1e798b2f721afedbe947c119111ba deleted file mode 100644 index 06dee3b237..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/23/ed141a6ae1e798b2f721afedbe947c119111ba and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/24/1a1005cd9b980732741b74385b891142bcba28 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/24/1a1005cd9b980732741b74385b891142bcba28 deleted file mode 100644 index 9b65f666f7..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/24/1a1005cd9b980732741b74385b891142bcba28 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/24/2591eb280ee9eeb2ce63524b9a8b9bc4cb515d b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/24/2591eb280ee9eeb2ce63524b9a8b9bc4cb515d deleted file mode 100644 index 74a01373f4..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/24/2591eb280ee9eeb2ce63524b9a8b9bc4cb515d and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/24/90b9f1a079420870027deefb49f51d6656cf74 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/24/90b9f1a079420870027deefb49f51d6656cf74 deleted file mode 100644 index 60497caa56..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/24/90b9f1a079420870027deefb49f51d6656cf74 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/25/9d08ca43af9200e9ea9a098e44a5a350ebd9b3 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/25/9d08ca43af9200e9ea9a098e44a5a350ebd9b3 deleted file mode 100644 index 2bae669989..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/25/9d08ca43af9200e9ea9a098e44a5a350ebd9b3 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/25/c40b7660c08c8fb581f770312f41b9b03119d1 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/25/c40b7660c08c8fb581f770312f41b9b03119d1 deleted file mode 100644 index 185214727f..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/25/c40b7660c08c8fb581f770312f41b9b03119d1 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/26/153a3ff3649b6c2bb652d3f06878c6e0a172f9 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/26/153a3ff3649b6c2bb652d3f06878c6e0a172f9 deleted file mode 100644 index 4fcaa07e22..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/26/153a3ff3649b6c2bb652d3f06878c6e0a172f9 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/27/133da702ba3c60af2a01e96c2555ff4045d692 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/27/133da702ba3c60af2a01e96c2555ff4045d692 deleted file mode 100644 index 08e61f8441..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/27/133da702ba3c60af2a01e96c2555ff4045d692 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/27/4bbe983022fb4c02f8a2bf2ebe8da4fe130054 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/27/4bbe983022fb4c02f8a2bf2ebe8da4fe130054 deleted file mode 100644 index c7afad2a8a..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/27/4bbe983022fb4c02f8a2bf2ebe8da4fe130054 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/2b/0de5dc27505dcdd83a75c8bf1fcd9462cd7add b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/2b/0de5dc27505dcdd83a75c8bf1fcd9462cd7add deleted file mode 100644 index a95f926f82..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/2b/0de5dc27505dcdd83a75c8bf1fcd9462cd7add and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/2b/5f1f181ee3b58ea751f5dd5d8f9b445520a136 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/2b/5f1f181ee3b58ea751f5dd5d8f9b445520a136 deleted file mode 100644 index d24231eda0..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/2b/5f1f181ee3b58ea751f5dd5d8f9b445520a136 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/2b/d0a343aeef7a2cf0d158478966a6e587ff3863 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/2b/d0a343aeef7a2cf0d158478966a6e587ff3863 deleted file mode 100644 index d10ca636b6..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/2b/d0a343aeef7a2cf0d158478966a6e587ff3863 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/2b/fdd7e1b6c6ae993f23dfe8e84a8e06a772fa2a b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/2b/fdd7e1b6c6ae993f23dfe8e84a8e06a772fa2a deleted file mode 100644 index c86edfb689..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/2b/fdd7e1b6c6ae993f23dfe8e84a8e06a772fa2a and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/2d/a538570bc1e5b2c3e855bf702f35248ad0735f b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/2d/a538570bc1e5b2c3e855bf702f35248ad0735f deleted file mode 100644 index 83253f81c6..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/2d/a538570bc1e5b2c3e855bf702f35248ad0735f +++ /dev/null @@ -1,2 +0,0 @@ -xĄŽK -1D]繀ŇůN"nĽ{ét:Ś‹L$ńúŽâ ÜU˝EQ«ő>¤¶~7:łL đŮD [´±5—¬É‡,Řy2eŤ®ĐTŘŞ@”¦z*.ű(ë´Ŕç[——üžĺunum‹<ňF?éĚ_ńkjő$•qNĺ'#÷ŕÄF·ł˙śąÜp!^Gëâ 9+Q. \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/2f/2e37b7ebbae467978610896ca3aafcdad2ee67 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/2f/2e37b7ebbae467978610896ca3aafcdad2ee67 deleted file mode 100644 index 7adffb165a..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/2f/2e37b7ebbae467978610896ca3aafcdad2ee67 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/2f/4024ce528d36d8670c289cce5a7963e625bb0c b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/2f/4024ce528d36d8670c289cce5a7963e625bb0c deleted file mode 100644 index 0100fd70e8..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/2f/4024ce528d36d8670c289cce5a7963e625bb0c and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/2f/56120107d680129a5d9791b521cb1e73a2ed31 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/2f/56120107d680129a5d9791b521cb1e73a2ed31 deleted file mode 100644 index 1f5f597b9d..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/2f/56120107d680129a5d9791b521cb1e73a2ed31 +++ /dev/null @@ -1,3 +0,0 @@ -xí[ -Â@ EýžUdR臸žy¤öBĚ”LJ·oÔnBđ/pî#Ü"˝Đí>_|Ĺ Ât@„ -“ńapg%hň•aăJYÁŐ®Aâ8Ő©í› fçŕ˛űN©ě¦Ż4Ŕ;ś”h[ş%cÍO¦ĆÎŐŃuJŃ÷çWÖyÎŹ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/2f/598248eeccfc27e5ca44d9d96383f6dfea7b16 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/2f/598248eeccfc27e5ca44d9d96383f6dfea7b16 deleted file mode 100644 index 1d9f226e2c..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/2f/598248eeccfc27e5ca44d9d96383f6dfea7b16 +++ /dev/null @@ -1 +0,0 @@ -x+)JMU067c040031QH,-ÉĎM-JOMLĘIŐ+©(aH:,»:ÎCÉýúô:ŢË ˛o>ZC'g$楧¦čfćé&%ć%g€5¬ÎqYôÂeŇZoÇÝŮkÚMíć2­éĆÔ›X\’ZDPC~^ZNfrIf^:Xéő›ZHŮŠž1O(_ś,'ş× jvQjn~Ä1–ČÎŃ×3ßţzדôémť9‹Wýąué]:¦$÷ßüI{•|ţą÷ 2m»gÜËľ‹©Éý1ÖËĺŹüŠ5ÓżÜ,\“µ})TC)0PŔavý‰ůzÖ›¦9–¤×Mü°úŐ…'6óbŤ—˘ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/31/68dca1a561889b045a6441909f4c56145e666d b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/31/68dca1a561889b045a6441909f4c56145e666d deleted file mode 100644 index 2de1c5a791..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/31/68dca1a561889b045a6441909f4c56145e666d +++ /dev/null @@ -1,2 +0,0 @@ -xĄŽQ -Â0DýÎ)rJ˛›MńÇxM˛ĄŰHŚz}«x˙fŢaRY–ąip´kUD $Ď1f˘Q2qę-Ó=YŁëÁ3R7®˛6Ťäġ·Śgŕâ9e7 bćˇw ‚âG›JŐçüâšőe*Ë˝¬ú ý¤“|ĹŻíSYŽÚ"5&ĐťńƨŤng›ü9ŁZťź3_;kŐ¬dOĽ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/31/d5472536041a83d986829240bbbdc897c6f8a6 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/31/d5472536041a83d986829240bbbdc897c6f8a6 deleted file mode 100644 index 5ec5acb596..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/31/d5472536041a83d986829240bbbdc897c6f8a6 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/32/21dd512b7e2dc4b5bd03046df6c81b2ab2070b b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/32/21dd512b7e2dc4b5bd03046df6c81b2ab2070b deleted file mode 100644 index d36138d796..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/32/21dd512b7e2dc4b5bd03046df6c81b2ab2070b and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/33/46d64325b39e5323733492cd55f808994a2475 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/33/46d64325b39e5323733492cd55f808994a2475 deleted file mode 100644 index 11546cea44..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/33/46d64325b39e5323733492cd55f808994a2475 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/33/d500f588fbbe65901d82b4e6b008e549064be0 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/33/d500f588fbbe65901d82b4e6b008e549064be0 deleted file mode 100644 index 061a031b6f..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/33/d500f588fbbe65901d82b4e6b008e549064be0 +++ /dev/null @@ -1,2 +0,0 @@ -xĄŽA E]s -. hbŚoত.Z Ĺx}[ă Üý˙~ňó¤ÎóŁkëüˇ·śµCAŚž<:km`d”„Ě‘d,!:𦳤žÜňŇő‚řÁ“„śP1ÉPň qHcc±HEń«Oµé[zsKú>Őy­‹>çŤî隿ïť¤ÎmŚŠú 6şÉöüçŤ*ĽöRŰn˘>úĺOÇ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/34/8dcd41e2b467991578e92bedd16971b877ef1e b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/34/8dcd41e2b467991578e92bedd16971b877ef1e deleted file mode 100644 index fd61b6ce59..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/34/8dcd41e2b467991578e92bedd16971b877ef1e and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/34/bfafff88eaf118402b44e6f3e2dbbf1a582b05 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/34/bfafff88eaf118402b44e6f3e2dbbf1a582b05 deleted file mode 100644 index c653cec50c..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/34/bfafff88eaf118402b44e6f3e2dbbf1a582b05 +++ /dev/null @@ -1 +0,0 @@ -x•ŽKj1D˝Ö)ú úµ>`Ś7ľA. µ$<`MŤŚŻorlŠ˘ ʏ÷m‚¶ţ4G­›·&údVd[j2ÖµËJÉâ›C«ŃŠgu_GuŇ%ĹÚ2:ť3XúزĹŕQ‘'Ě"˝ćťÜĘ;Ť?wîďp®kým׾ŃŕŰü&îPf!˘ đ%QJ±Ö%:ëťűCeśzâ˝=6šŔŻq;iOč \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/35/0c6eb3010efc403a6bed682332635314e9ed58 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/35/0c6eb3010efc403a6bed682332635314e9ed58 deleted file mode 100644 index 2eee602335..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/35/0c6eb3010efc403a6bed682332635314e9ed58 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/35/411bfb77cd2cc431f3a03a2b4976ed94b5d241 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/35/411bfb77cd2cc431f3a03a2b4976ed94b5d241 deleted file mode 100644 index ea024ccd9e..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/35/411bfb77cd2cc431f3a03a2b4976ed94b5d241 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/35/4704d3613ad4228e4786fc76656b11e98236c4 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/35/4704d3613ad4228e4786fc76656b11e98236c4 deleted file mode 100644 index 1dd13c44a0..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/35/4704d3613ad4228e4786fc76656b11e98236c4 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/35/632e43612c06a3ea924bfbacd48333da874c29 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/35/632e43612c06a3ea924bfbacd48333da874c29 deleted file mode 100644 index be7684f191..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/35/632e43612c06a3ea924bfbacd48333da874c29 +++ /dev/null @@ -1 +0,0 @@ -xĄNË !őLÓŔšd–MŚńb60ŔÝĨí‹ĆĽ˝^,ëş40;·iUFf+)›ł1vňBÁ939fG–(ôDIݸʵA$s´č˝k]’l|Lä{IgŠ™Ń$‰Šm.NéĹ5Áy.ë˝\a/]ý Ł|ŤŰƲ@[g4âä< HŞ«ýl“?gT«ËsáË µzCřP \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/35/75826c96a975031d2c14368529cc5c4353a8fd b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/35/75826c96a975031d2c14368529cc5c4353a8fd deleted file mode 100644 index 24e33bc41c..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/35/75826c96a975031d2c14368529cc5c4353a8fd and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/36/219b49367146cb2e6a1555b5a9ebd4d0328495 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/36/219b49367146cb2e6a1555b5a9ebd4d0328495 deleted file mode 100644 index 7f8044372a..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/36/219b49367146cb2e6a1555b5a9ebd4d0328495 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/36/4bbe4ce80c7bd31e6307dce77d46e3e1759fb3 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/36/4bbe4ce80c7bd31e6307dce77d46e3e1759fb3 deleted file mode 100644 index 90fd9651f8..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/36/4bbe4ce80c7bd31e6307dce77d46e3e1759fb3 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/37/48859b001c6e627e712a07951aee40afd19b41 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/37/48859b001c6e627e712a07951aee40afd19b41 deleted file mode 100644 index 6a0c389e43..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/37/48859b001c6e627e712a07951aee40afd19b41 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/38/5c8a0f26ddf79e9041e15e17dc352ed2c4cced b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/38/5c8a0f26ddf79e9041e15e17dc352ed2c4cced deleted file mode 100644 index e95ff3a88f..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/38/5c8a0f26ddf79e9041e15e17dc352ed2c4cced +++ /dev/null @@ -1,2 +0,0 @@ -x-MK -1 uťSĽYÍRÄ…ń™6C±…6Ň뛪đĽokn÷ÇĺYt ŕEpŞ iĹDűŘCd§ÉśłdLőB+8ř%¨q‚±k µ˙ú+Ţe™Ţ6˘ď‡©fHüBü·Ż1J©ŐÓ4ůFŕ1l \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/3b/47b031b3e55ae11e14a05260b1c3ffd6838d55 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/3b/47b031b3e55ae11e14a05260b1c3ffd6838d55 deleted file mode 100644 index 82086466f5..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/3b/47b031b3e55ae11e14a05260b1c3ffd6838d55 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/3b/bf0bf59b20df5d5fc58b9fc1dc07be637c301f b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/3b/bf0bf59b20df5d5fc58b9fc1dc07be637c301f deleted file mode 100644 index 723a9ae4c9..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/3b/bf0bf59b20df5d5fc58b9fc1dc07be637c301f and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/3e/f4d30382ca33fdeba9fda895a99e0891ba37aa b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/3e/f4d30382ca33fdeba9fda895a99e0891ba37aa deleted file mode 100644 index 49ee152397..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/3e/f4d30382ca33fdeba9fda895a99e0891ba37aa and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/3e/f9bfe82f9635518ae89152322f3b46fd4ba25b b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/3e/f9bfe82f9635518ae89152322f3b46fd4ba25b deleted file mode 100644 index 3b5998ca61..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/3e/f9bfe82f9635518ae89152322f3b46fd4ba25b and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/40/2784a46a4a3982294231594cbeb431f506d22c b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/40/2784a46a4a3982294231594cbeb431f506d22c deleted file mode 100644 index a17e05d0f1..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/40/2784a46a4a3982294231594cbeb431f506d22c and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/41/2b32fb66137366147f1801ecc962452757d48a b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/41/2b32fb66137366147f1801ecc962452757d48a deleted file mode 100644 index b183dd7822..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/41/2b32fb66137366147f1801ecc962452757d48a +++ /dev/null @@ -1,2 +0,0 @@ -xĄŽK -1D]繀ŇIO>"nĽčt:Ś‹™‰x}ŁxwUŻ xÜj˝um'»ë«.®Ě9»=y 6Ř$@T8ĚŔ‰&Lhf4ęA«Ü»fˇ0BŚ(.K±‘łŹ>9S<›Ŕ +zöĄ­ú’_´f}]ZÝÚ]eĐO:Ëwřµ·zŇš†‹ŢPŮ.ިaNU6őÎOÖ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/42/18670ab81cc219a9f94befb5c5dad90ec52648 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/42/18670ab81cc219a9f94befb5c5dad90ec52648 deleted file mode 100644 index 33ead6112c..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/42/18670ab81cc219a9f94befb5c5dad90ec52648 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/43/aafd43bea779ec74317dc361f45ae3f532a505 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/43/aafd43bea779ec74317dc361f45ae3f532a505 deleted file mode 100644 index ac86823b67..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/43/aafd43bea779ec74317dc361f45ae3f532a505 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/43/c338656342227a3a3cd3aa85cbf784061f5425 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/43/c338656342227a3a3cd3aa85cbf784061f5425 deleted file mode 100644 index d9773118b2..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/43/c338656342227a3a3cd3aa85cbf784061f5425 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/45/299c1ca5e07bba1fd90843056fb559f96b1f5a b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/45/299c1ca5e07bba1fd90843056fb559f96b1f5a deleted file mode 100644 index 2093b44103..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/45/299c1ca5e07bba1fd90843056fb559f96b1f5a and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/46/6daf8552b891e5c22bc58c9d7fc1a2eb8f0289 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/46/6daf8552b891e5c22bc58c9d7fc1a2eb8f0289 deleted file mode 100644 index c39b53aa8f..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/46/6daf8552b891e5c22bc58c9d7fc1a2eb8f0289 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/47/6dbb3e207313d1d8aaa120c6ad204bf1295e53 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/47/6dbb3e207313d1d8aaa120c6ad204bf1295e53 deleted file mode 100644 index 3e5f66e556..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/47/6dbb3e207313d1d8aaa120c6ad204bf1295e53 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/47/8172cb2f5ff9b514bc9d04d3bd5ef5840cb3b2 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/47/8172cb2f5ff9b514bc9d04d3bd5ef5840cb3b2 deleted file mode 100644 index d9e250e666..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/47/8172cb2f5ff9b514bc9d04d3bd5ef5840cb3b2 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/49/130a28ef567af9a6a6104c38773fedfa5f9742 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/49/130a28ef567af9a6a6104c38773fedfa5f9742 deleted file mode 100644 index e2c49f5c45..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/49/130a28ef567af9a6a6104c38773fedfa5f9742 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/49/9df817155e4bdd3c6ee192a72c52f481818230 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/49/9df817155e4bdd3c6ee192a72c52f481818230 deleted file mode 100644 index 9c7e471dd6..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/49/9df817155e4bdd3c6ee192a72c52f481818230 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/49/fd9edac79d15c8fbfca2d481cbb900beba22a6 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/49/fd9edac79d15c8fbfca2d481cbb900beba22a6 deleted file mode 100644 index d808d9fd96..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/49/fd9edac79d15c8fbfca2d481cbb900beba22a6 +++ /dev/null @@ -1,3 +0,0 @@ -xUŤÁ -Â0D=ç+ćĽčĹ -‚…ţĆf»5dIŽ~ĽŃEhße3Ěó©xśŻ—ÓÍŔ2?ž®‡Ř°Ĺ$Éô%+˘"SëRAşÂWRîm Kýn¸ä\t XZ/µźhôşĄČÝMƱߙěţg2©»ńj># \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/4a/9550ebcc97ce22b22f45af7b829bb030d003f5 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/4a/9550ebcc97ce22b22f45af7b829bb030d003f5 deleted file mode 100644 index 6ec674adc5..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/4a/9550ebcc97ce22b22f45af7b829bb030d003f5 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/4b/253da36a0ae8bfce63aeabd8c5b58429925594 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/4b/253da36a0ae8bfce63aeabd8c5b58429925594 deleted file mode 100644 index 1a4072794b..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/4b/253da36a0ae8bfce63aeabd8c5b58429925594 +++ /dev/null @@ -1,2 +0,0 @@ -x ĹA -€0 @ĎűŠľAđAILm lˇ¦˙׹ŚćÔvťGŤxŃ#˙6Ů3¬‚tW BŘ6—§”ßĐ%´hť” \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/4b/48deed3a433909bfd6b6ab3d4b91348b6af464 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/4b/48deed3a433909bfd6b6ab3d4b91348b6af464 deleted file mode 100644 index 328c8506e0..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/4b/48deed3a433909bfd6b6ab3d4b91348b6af464 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee4904 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee4904 deleted file mode 100644 index adf64119a3..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee4904 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/4c/9fac0707f8d4195037ae5a681aa48626491541 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/4c/9fac0707f8d4195037ae5a681aa48626491541 deleted file mode 100644 index 6b8c85e2be..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/4c/9fac0707f8d4195037ae5a681aa48626491541 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/4c/a408a8c88655f7586a1b580be6fad138121e98 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/4c/a408a8c88655f7586a1b580be6fad138121e98 deleted file mode 100644 index 15cb7f29af..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/4c/a408a8c88655f7586a1b580be6fad138121e98 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/4e/0d9401aee78eb345a8685a859d37c8c3c0bbed b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/4e/0d9401aee78eb345a8685a859d37c8c3c0bbed deleted file mode 100644 index 57f7eb68c3..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/4e/0d9401aee78eb345a8685a859d37c8c3c0bbed and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/4e/886e602529caa9ab11d71f86634bd1b6e0de10 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/4e/886e602529caa9ab11d71f86634bd1b6e0de10 deleted file mode 100644 index 53168a038b..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/4e/886e602529caa9ab11d71f86634bd1b6e0de10 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/4e/b04c9e79e88f6640d01ff5b25ca2a60764f216 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/4e/b04c9e79e88f6640d01ff5b25ca2a60764f216 deleted file mode 100644 index f4ec0efecb..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/4e/b04c9e79e88f6640d01ff5b25ca2a60764f216 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/4f/e93c0ec83eb6305cbace3dace88ecee1b63cb6 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/4f/e93c0ec83eb6305cbace3dace88ecee1b63cb6 deleted file mode 100644 index 67dc6842fd..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/4f/e93c0ec83eb6305cbace3dace88ecee1b63cb6 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/50/12fd565b1393bdfda1805d4ec38ce6619e1fd1 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/50/12fd565b1393bdfda1805d4ec38ce6619e1fd1 deleted file mode 100644 index d629a23a16..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/50/12fd565b1393bdfda1805d4ec38ce6619e1fd1 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/50/4f75ac95a71ef98051817618576a68505b92f9 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/50/4f75ac95a71ef98051817618576a68505b92f9 deleted file mode 100644 index 1b24c721ab..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/50/4f75ac95a71ef98051817618576a68505b92f9 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/50/84fc2a88b6bdba8db93bd3953a8f4fdb470238 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/50/84fc2a88b6bdba8db93bd3953a8f4fdb470238 deleted file mode 100644 index 84c9987ce2..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/50/84fc2a88b6bdba8db93bd3953a8f4fdb470238 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/50/ce7d7d01217679e26c55939eef119e0c93e272 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/50/ce7d7d01217679e26c55939eef119e0c93e272 deleted file mode 100644 index e2f9f67fdf..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/50/ce7d7d01217679e26c55939eef119e0c93e272 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/51/95a1b480f66691b667f10a9e41e70115a78351 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/51/95a1b480f66691b667f10a9e41e70115a78351 deleted file mode 100644 index 088ee5498e..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/51/95a1b480f66691b667f10a9e41e70115a78351 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/52/d8bc572af2b6d4ee0d5e62ed5d1fbad92210a9 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/52/d8bc572af2b6d4ee0d5e62ed5d1fbad92210a9 deleted file mode 100644 index 6522209bdf..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/52/d8bc572af2b6d4ee0d5e62ed5d1fbad92210a9 +++ /dev/null @@ -1,3 +0,0 @@ -xĄŽ] -Â0„}Î)rĘnóÓD|ń^`“ÝĐ‚m$F˝ľUĽo3ßä˛,sÓ˝Ă]«" #€ÇŕŮbČ"ö1± 9÷˛’cTôhS©úĚ/ެ/SYîeŐŮč'ťä+~mźĘrÔh\c‡QwŕÔF·łMţśQ­ÎĎ™®]čbĄ5Mę ¨ÚRź \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/53/825f41ac8d640612f9423a2f03a69f3d96809a b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/53/825f41ac8d640612f9423a2f03a69f3d96809a deleted file mode 100644 index 08cb0b66fe..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/53/825f41ac8d640612f9423a2f03a69f3d96809a and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/54/269b3f6ec3d7d4ede24dd350dd5d605495c3ae b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/54/269b3f6ec3d7d4ede24dd350dd5d605495c3ae deleted file mode 100644 index 4a24153394..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/54/269b3f6ec3d7d4ede24dd350dd5d605495c3ae +++ /dev/null @@ -1,2 +0,0 @@ -xĄŽK -1D]繀ŇI¦ó7ŢŔ LşÓŚ‹L$FĽľŁxwUďAQÔj˝ m'ŘŤ^Šv9 dÁ”-° ŁĆś„ „\Ľ äŔşĎ˝¬C§Č'Ź&Î`"ĂŮĹÄąä(Öˇ¨ů9–Öő…_sg}]Z}´UËF?é\ľâ×ÔęI‡&ëô@mt;;Ęź3ŞŃh“z“ÎNŔ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/54/59c89aa0026d543ce8343bd89871bce543f9c2 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/54/59c89aa0026d543ce8343bd89871bce543f9c2 deleted file mode 100644 index 178b833e88..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/54/59c89aa0026d543ce8343bd89871bce543f9c2 +++ /dev/null @@ -1,3 +0,0 @@ -xĄŽŃ !Dý¦ -Đ,,,ăŹŘŔ,9O blßÓŘ3ď%“ÉmY.C[L›ŃEtd–`\ %aBH%TvB G%QphĐqŞęÎ]nCg‚P3BŚ(ľHµ1Š4yS)W;IVüsëúT^Ü‹>Ďmy´›ŢËJ?é(_ńk»Ü–6č-$ç#č-€ZézvČź3 -ů:ÔNqMB \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/54/7607c690372fe81fab8e3bb44c530e129118fd b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/54/7607c690372fe81fab8e3bb44c530e129118fd deleted file mode 100644 index dccd220068..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/54/7607c690372fe81fab8e3bb44c530e129118fd and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/55/b4e4687e7a0d9ca367016ed930f385d4022e6f b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/55/b4e4687e7a0d9ca367016ed930f385d4022e6f deleted file mode 100644 index fb157a2146..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/55/b4e4687e7a0d9ca367016ed930f385d4022e6f +++ /dev/null @@ -1 +0,0 @@ -xĄŽQjĂ0DűíSěZvĄŐJ‚ú“䞴Рµ•\żNé ú7ó“ű¶­Śă·±«‚Ôd-{áąLěXçŔÖ'ĹŚ ĘçéžvmŠä*Ů{¦ŮZ’`$U˛ÄČĆ9ĚŃ-TNé{,}‡Ky¦˝ŔuéŰŁ78éA_éS‡żö‘űv˛.ÄčEŢQ§g‡ţSsxZýZóXŰ ň’ÚMÓNRi \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/56/6ab53c220a2eafc1212af1a024513230280ab9 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/56/6ab53c220a2eafc1212af1a024513230280ab9 deleted file mode 100644 index a8855ae677..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/56/6ab53c220a2eafc1212af1a024513230280ab9 +++ /dev/null @@ -1,3 +0,0 @@ -xĄŽŃ !Dý¦ -Đ,˱‰1ţŘ ,°äLD blßÓŘ3ď%“I­ÖËĐhĂft ١XvŽÄřÂäYÍ‚ń`L2ŃĐśŐť»Ü†NsIĽ·b­ËRЧLž˘3…RaŔ$Ińs,­ëS~qĎúĽ´úh7˝—•~ŇQľâ×v©Ő6Ö!śę-€ZézvČź3 -ů:Ô9âM& \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/56/a638b76b75e068590ac999c2f8621e7f3e264c b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/56/a638b76b75e068590ac999c2f8621e7f3e264c deleted file mode 100644 index 36289bf7af..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/56/a638b76b75e068590ac999c2f8621e7f3e264c +++ /dev/null @@ -1 +0,0 @@ -xĄŽAj!Ełöu vuW©B6są€–%ÝŰÁ6äúqÎÝçÁČ$Ń^•‘R˛bâĎŘ[‡{ţŤ=Ăcoőj'|褯őUéíjeĽK«ź°¬Lnˇ•n–¬5“ÎС˙PY«‚´ł|2`ězôËü—zQ{ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/57/079a46233ae2b6df62e9ade71c4948512abefb b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/57/079a46233ae2b6df62e9ade71c4948512abefb deleted file mode 100644 index c7eabc46b2..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/57/079a46233ae2b6df62e9ade71c4948512abefb and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/58/43febcb23480df0b5edb22a21c59c772bb8e29 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/58/43febcb23480df0b5edb22a21c59c772bb8e29 deleted file mode 100644 index f6b2a2bfeb..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/58/43febcb23480df0b5edb22a21c59c772bb8e29 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/58/87a5e516c53bd58efb0f02ec6aa031b6fe9ad7 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/58/87a5e516c53bd58efb0f02ec6aa031b6fe9ad7 deleted file mode 100644 index 550d288d49..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/58/87a5e516c53bd58efb0f02ec6aa031b6fe9ad7 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/58/e853f66699fd02629fd50bde08082bc005933a b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/58/e853f66699fd02629fd50bde08082bc005933a deleted file mode 100644 index cf6db633cb..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/58/e853f66699fd02629fd50bde08082bc005933a and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/59/6803b523203a4851c824c07366906f8353f4ad b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/59/6803b523203a4851c824c07366906f8353f4ad deleted file mode 100644 index cbc8cbef31..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/59/6803b523203a4851c824c07366906f8353f4ad and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/5c/2411f8075f48a6b2fdb85ebc0d371747c4df15 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/5c/2411f8075f48a6b2fdb85ebc0d371747c4df15 deleted file mode 100644 index 7b41413dad..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/5c/2411f8075f48a6b2fdb85ebc0d371747c4df15 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/5c/341ead2ba6f2af98ce5ec3fe84f6b6d2899c0d b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/5c/341ead2ba6f2af98ce5ec3fe84f6b6d2899c0d deleted file mode 100644 index 63c86bd339..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/5c/341ead2ba6f2af98ce5ec3fe84f6b6d2899c0d and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/5c/3b68a71fc4fa5d362fd3875e53137c6a5ab7a5 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/5c/3b68a71fc4fa5d362fd3875e53137c6a5ab7a5 deleted file mode 100644 index 541001456c..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/5c/3b68a71fc4fa5d362fd3875e53137c6a5ab7a5 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/5d/c1018e90b19654bee986b7a0c268804d39659d b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/5d/c1018e90b19654bee986b7a0c268804d39659d deleted file mode 100644 index 7500b99146..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/5d/c1018e90b19654bee986b7a0c268804d39659d and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/5d/dd0fe66f990dc0e5cf9fec6d9b465240e9537f b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/5d/dd0fe66f990dc0e5cf9fec6d9b465240e9537f deleted file mode 100644 index 9d8691eb23..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/5d/dd0fe66f990dc0e5cf9fec6d9b465240e9537f and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/5e/b7bb6a146eb3c7fd3990b240a2308eceb1cf8d b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/5e/b7bb6a146eb3c7fd3990b240a2308eceb1cf8d deleted file mode 100644 index aca2666cfb..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/5e/b7bb6a146eb3c7fd3990b240a2308eceb1cf8d and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/5f/bfbdc04b4eca46f54f4853a3c5a1dce28f5165 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/5f/bfbdc04b4eca46f54f4853a3c5a1dce28f5165 deleted file mode 100644 index aec3867c8b..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/5f/bfbdc04b4eca46f54f4853a3c5a1dce28f5165 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/60/61fe116ecba0800c26113ea1a7dfac2e16eeaf b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/60/61fe116ecba0800c26113ea1a7dfac2e16eeaf deleted file mode 100644 index 3f266f6df1..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/60/61fe116ecba0800c26113ea1a7dfac2e16eeaf and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/60/91fc2c036a382a69489e3f518ee5aae9a4e567 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/60/91fc2c036a382a69489e3f518ee5aae9a4e567 deleted file mode 100644 index fa63afba1c..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/60/91fc2c036a382a69489e3f518ee5aae9a4e567 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/61/340eeed7340fa6a8792def9a5938bb5d4434bb b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/61/340eeed7340fa6a8792def9a5938bb5d4434bb deleted file mode 100644 index e830cafe5e..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/61/340eeed7340fa6a8792def9a5938bb5d4434bb and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/61/78885b38fe96e825ac0f492c0a941f288b37f6 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/61/78885b38fe96e825ac0f492c0a941f288b37f6 deleted file mode 100644 index bedc5f27ec..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/61/78885b38fe96e825ac0f492c0a941f288b37f6 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/62/12c31dab5e482247d7977e4f0dd3601decf13b b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/62/12c31dab5e482247d7977e4f0dd3601decf13b deleted file mode 100644 index b6f0607bb9..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/62/12c31dab5e482247d7977e4f0dd3601decf13b and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/62/269111c3b02a9355badcb9da8678b1bf41787b b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/62/269111c3b02a9355badcb9da8678b1bf41787b deleted file mode 100644 index 0edf659944..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/62/269111c3b02a9355badcb9da8678b1bf41787b and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/62/33c6a0670228627f93c01cef32485a30403670 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/62/33c6a0670228627f93c01cef32485a30403670 deleted file mode 100644 index 81428dd624..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/62/33c6a0670228627f93c01cef32485a30403670 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/62/c4f6533c9a3894191fdcb96a3be935ade63f1a b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/62/c4f6533c9a3894191fdcb96a3be935ade63f1a deleted file mode 100644 index c0f822d2ce..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/62/c4f6533c9a3894191fdcb96a3be935ade63f1a and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/63/247125386de9ec90a27ad36169307bf8a11a38 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/63/247125386de9ec90a27ad36169307bf8a11a38 deleted file mode 100644 index bc2d7384d2..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/63/247125386de9ec90a27ad36169307bf8a11a38 +++ /dev/null @@ -1 +0,0 @@ -xÝŹ;1 D©}Šé¶A‹Vâô\ŔŮ8¬ĄŕHIVp|˛?‰‚ĐLăyO“ĂuN7Cť] ÍĄËlăt¦:iAĐ(xiŚp‚,ĆOńÄćˇ;•ćo†7 …UYZ B‡˝ß÷Ă˝]ĆdUmÔyk©ô[…˝Úc©ńţÍĄ)©ń!ęX{˘żZó±Ťö \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/67/110d77886b2af6309b9212961e72b8583e5fa9 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/67/110d77886b2af6309b9212961e72b8583e5fa9 deleted file mode 100644 index 877bad7033..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/67/110d77886b2af6309b9212961e72b8583e5fa9 +++ /dev/null @@ -1 +0,0 @@ -xĄŹ=N1 „©÷î^rś !J:.`'űŠlP^×gâT3ú43Ň”Ńűuĺp·¦*´ZŁ %°ćlŮÚ4irśÇHŤ‰·žz,곥ä[‰M]a“J©ÂŇbó5¤lĐ8OůX$XŐłŤEaÇ")ŠUďś$Źd2zO¸ńçÚÇ„—úĹłÂŰ>úmđ¨'ýqĎýZ渍¶ĘčO`lF“łOî1!n'=Ź-ýÇÄöŞó]A&e‡ËŻ^¶o––^Ý \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/67/18a45909532d1fcf5600d0877f7fe7e78f0b86 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/67/18a45909532d1fcf5600d0877f7fe7e78f0b86 deleted file mode 100644 index ffda698f04..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/67/18a45909532d1fcf5600d0877f7fe7e78f0b86 +++ /dev/null @@ -1 +0,0 @@ -xĄŽŃM1 DůNi`‘ÇąDBč~č€ǧ]‰Ý öYđ7óž4íűľM8<ĚaćF䬵@Ňr*‹Ü85ĆV«±eV÷.Î鉋”0($!“b˝UŃ35É—¨ˇ8ąĎµ˙Ňľd4˙şöýŁţÉNú“®ö+ţÚŁöýŮ#q@€rÉ~ŕNzžťöĎ7ÇöąÉŰ‚¸Ô!‡®î÷uQu \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/68/c6c84b091926c7d90aa6a79b2bc3bb6adccd8e b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/68/c6c84b091926c7d90aa6a79b2bc3bb6adccd8e deleted file mode 100644 index 1e4b075741..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/68/c6c84b091926c7d90aa6a79b2bc3bb6adccd8e and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/69/f570c57b24ea7c086e94c5e574964798321435 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/69/f570c57b24ea7c086e94c5e574964798321435 deleted file mode 100644 index 6975f0bab1..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/69/f570c57b24ea7c086e94c5e574964798321435 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/6a/e1a3967031a42cf955d9d5c2395211ac82f6cf b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/6a/e1a3967031a42cf955d9d5c2395211ac82f6cf deleted file mode 100644 index 3b5713cbcf..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/6a/e1a3967031a42cf955d9d5c2395211ac82f6cf and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/6b/7e37be8ce0b897093f2878a9dcd8f396beda2c b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/6b/7e37be8ce0b897093f2878a9dcd8f396beda2c deleted file mode 100644 index c39318683c..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/6b/7e37be8ce0b897093f2878a9dcd8f396beda2c and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/6c/06dcd163587c2cc18be44857e0b71116382aeb b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/6c/06dcd163587c2cc18be44857e0b71116382aeb deleted file mode 100644 index 2f54be818f..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/6c/06dcd163587c2cc18be44857e0b71116382aeb and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/6e/3b9eb35214d4e31ed5789afc7d520ac798ce55 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/6e/3b9eb35214d4e31ed5789afc7d520ac798ce55 deleted file mode 100644 index c6100cb012..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/6e/3b9eb35214d4e31ed5789afc7d520ac798ce55 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/6f/32739c3724d1d5f855299309f388606f407468 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/6f/32739c3724d1d5f855299309f388606f407468 deleted file mode 100644 index 6741aa4d59..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/6f/32739c3724d1d5f855299309f388606f407468 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/6f/a33014764bf1120a454eb8437ae098238e409b b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/6f/a33014764bf1120a454eb8437ae098238e409b deleted file mode 100644 index 973a4f646f..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/6f/a33014764bf1120a454eb8437ae098238e409b and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/6f/be9fb85c86d7d1435f728da418bdff52c640a9 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/6f/be9fb85c86d7d1435f728da418bdff52c640a9 deleted file mode 100644 index a2c8d93ad5..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/6f/be9fb85c86d7d1435f728da418bdff52c640a9 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/71/17467b18605a660ebe5586df69e2311ed5609f b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/71/17467b18605a660ebe5586df69e2311ed5609f deleted file mode 100644 index 02e1831446..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/71/17467b18605a660ebe5586df69e2311ed5609f and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/71/2ebba6669ea847d9829e4f1059d6c830c8b531 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/71/2ebba6669ea847d9829e4f1059d6c830c8b531 deleted file mode 100644 index dd7d58f1fd..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/71/2ebba6669ea847d9829e4f1059d6c830c8b531 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/71/add2d7b93d55bf3600f8a1582beceebbd050c8 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/71/add2d7b93d55bf3600f8a1582beceebbd050c8 deleted file mode 100644 index 221afa3c8e..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/71/add2d7b93d55bf3600f8a1582beceebbd050c8 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/72/cdb057b340205164478565e91eb71647e66891 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/72/cdb057b340205164478565e91eb71647e66891 deleted file mode 100644 index 84aa8336bd..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/72/cdb057b340205164478565e91eb71647e66891 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/72/ea499e108df5ff0a4a913e7655bbeeb1fb69f2 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/72/ea499e108df5ff0a4a913e7655bbeeb1fb69f2 deleted file mode 100644 index 4886e492e7..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/72/ea499e108df5ff0a4a913e7655bbeeb1fb69f2 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/74/df13f0793afdaa972150bba976f7de8284914e b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/74/df13f0793afdaa972150bba976f7de8284914e deleted file mode 100644 index cb50e67577..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/74/df13f0793afdaa972150bba976f7de8284914e and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/75/a811bf6bc57694adb3fe604786f3a4efd1cd1b b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/75/a811bf6bc57694adb3fe604786f3a4efd1cd1b deleted file mode 100644 index 477fd87ecc..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/75/a811bf6bc57694adb3fe604786f3a4efd1cd1b +++ /dev/null @@ -1,2 +0,0 @@ -xĄŽK -1D]çąŔHçk "nĽHş;Ě€3‘őúŽâ ÜU˝EQťç©këý¦7 Ž€ !˛7Xdc2±ÇR¬Ŕ©[j˛tMv… :q.°‹Äc¦D* l†(¤ŇŁŹµé3żRc}ë|Ż‹>ČJ?é$_ńk[ŞóQ,ěŃë"€Zéz¶Ëź3Ş·é9Ąë€ę LŽOĘ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/76/63fce0130db092936b137cabd693ec234eb060 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/76/63fce0130db092936b137cabd693ec234eb060 deleted file mode 100644 index f578a4a680..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/76/63fce0130db092936b137cabd693ec234eb060 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/76/ab0e2868197ec158ddd6c78d8a0d2fd73d38f9 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/76/ab0e2868197ec158ddd6c78d8a0d2fd73d38f9 deleted file mode 100644 index 4d41ad8cd0..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/76/ab0e2868197ec158ddd6c78d8a0d2fd73d38f9 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/7a/a3edf2bcfee22398e6b55295aa56366b7aaf76 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/7a/a3edf2bcfee22398e6b55295aa56366b7aaf76 deleted file mode 100644 index 09f1e4d3a7..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/7a/a3edf2bcfee22398e6b55295aa56366b7aaf76 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/7a/f14d9c679baaef35555095f4f5d33e9a569ab9 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/7a/f14d9c679baaef35555095f4f5d33e9a569ab9 deleted file mode 100644 index b4c4ef734e..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/7a/f14d9c679baaef35555095f4f5d33e9a569ab9 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/7c/04ca611203ed320c5f495b9813054dd23be3be b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/7c/04ca611203ed320c5f495b9813054dd23be3be deleted file mode 100644 index e3ba6056d7..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/7c/04ca611203ed320c5f495b9813054dd23be3be +++ /dev/null @@ -1,2 +0,0 @@ -xĄŽQ Dýć{ -,tcüń^`%őb(ĆëKĎŕ|ÍĽd&k)Żł±§ŢDŔsžl˘č<fɇ4a¶“1BŚŽ8zs“­CvĹ„şEëQüdˇĹO>ĺEń§ŻµÁ#}ą%x®µěu« z¸{yĹV÷šű%Örɞdž·pÖ¨µtíňÇ„ -Ť·¸ÎęUrL \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/7c/2c5228c9e90170d4a35e6558e47163daf092e5 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/7c/2c5228c9e90170d4a35e6558e47163daf092e5 deleted file mode 100644 index 52fde92a14..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/7c/2c5228c9e90170d4a35e6558e47163daf092e5 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/7c/b63eed597130ba4abb87b3e544b85021905520 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/7c/b63eed597130ba4abb87b3e544b85021905520 deleted file mode 100644 index 769f29c6e0..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/7c/b63eed597130ba4abb87b3e544b85021905520 +++ /dev/null @@ -1,3 +0,0 @@ -xĄŽK -1D]繀Ňůt'"nĽH:ĆĹL$FĽľŁxwUďAQÜ–ĺ6´őf7şI“ŤT*zë±J -–1#;@r´X]¬ęžş¬C3A¨ě F'Îa‘j#Š”ŃTâšŔf a•žcn]_Ę+ő˘Żs[mŐGŮč'ťĺ+~íŔm9iăĐ ą‰PďÔF·łCţśQą§•gőe"NŐ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/7e/2d058d5fedf8329db44db4fac610d6b1a89159 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/7e/2d058d5fedf8329db44db4fac610d6b1a89159 deleted file mode 100644 index d12d7b4a71..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/7e/2d058d5fedf8329db44db4fac610d6b1a89159 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/7f/7a2da58126226986d71c6ddfab4afba693280d b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/7f/7a2da58126226986d71c6ddfab4afba693280d deleted file mode 100644 index 2f833c2924..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/7f/7a2da58126226986d71c6ddfab4afba693280d and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/80/a8fbb3abb1ba423d554e9630b8fc2e5698f86b b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/80/a8fbb3abb1ba423d554e9630b8fc2e5698f86b deleted file mode 100644 index 3daf6c3e07..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/80/a8fbb3abb1ba423d554e9630b8fc2e5698f86b and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/81/1c70fcb6d5bbd022d04cc31836d30b436f9551 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/81/1c70fcb6d5bbd022d04cc31836d30b436f9551 deleted file mode 100644 index 6d8702404f..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/81/1c70fcb6d5bbd022d04cc31836d30b436f9551 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/81/87117062b750eed4f93fd7e899f17b52ce554d b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/81/87117062b750eed4f93fd7e899f17b52ce554d deleted file mode 100644 index 19cac9faf4..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/81/87117062b750eed4f93fd7e899f17b52ce554d and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/83/07d93a155903a5c49576583f0ce1f6ff897c0e b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/83/07d93a155903a5c49576583f0ce1f6ff897c0e deleted file mode 100644 index 5a96a4e4e3..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/83/07d93a155903a5c49576583f0ce1f6ff897c0e and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/83/6b8b82b26cab22eaaed8820877c76d6c8bca19 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/83/6b8b82b26cab22eaaed8820877c76d6c8bca19 deleted file mode 100644 index 99f828649d..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/83/6b8b82b26cab22eaaed8820877c76d6c8bca19 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/83/824a8c6658768e2013905219cc8c64cc3d9a2e b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/83/824a8c6658768e2013905219cc8c64cc3d9a2e deleted file mode 100644 index 066190fb8c..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/83/824a8c6658768e2013905219cc8c64cc3d9a2e and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/84/9619b03ae540acee4d1edec96b86993da6b497 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/84/9619b03ae540acee4d1edec96b86993da6b497 deleted file mode 100644 index 67271ac509..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/84/9619b03ae540acee4d1edec96b86993da6b497 +++ /dev/null @@ -1,3 +0,0 @@ -xĄŽK -1D]繀Ňův7ŢŔ˝t’3‹L$ńúŽâ ÜU˝EĄVë<¤¶v7:ł"xçĄK@›R¶ -rĚŠ#Ç"Ôy2[ Xµ5 r2ĆQ´ĺ¨5–”ŁbŤŠ=ÇÔşĽćő,oS«k[ä‰7úIţŠ_;¤VĎRç”?ú`ä<€Řčvvđź3"¶1ÝóÜWńEÇP \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/84/de84f8f3a6d63e636ee9ad81f4b80512fa9bbe b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/84/de84f8f3a6d63e636ee9ad81f4b80512fa9bbe deleted file mode 100644 index 32f1461d40..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/84/de84f8f3a6d63e636ee9ad81f4b80512fa9bbe and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/86/088dae8bade454995b21a1c88107b0e1accdab b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/86/088dae8bade454995b21a1c88107b0e1accdab deleted file mode 100644 index 623a747f01..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/86/088dae8bade454995b21a1c88107b0e1accdab and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/87/b4926260d77a3b851e71ecce06839bd650b231 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/87/b4926260d77a3b851e71ecce06839bd650b231 deleted file mode 100644 index 91944ffb57..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/87/b4926260d77a3b851e71ecce06839bd650b231 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/88/e185910a15cd13bdf44854ad037f4842b03b29 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/88/e185910a15cd13bdf44854ad037f4842b03b29 deleted file mode 100644 index ae1c5e242c..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/88/e185910a15cd13bdf44854ad037f4842b03b29 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/8a/ad9d0ea334951da47b621a475b39cc6ed759bf b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/8a/ad9d0ea334951da47b621a475b39cc6ed759bf deleted file mode 100644 index 5e2c943210..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/8a/ad9d0ea334951da47b621a475b39cc6ed759bf and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/8a/ae714f7d939309d7f132b30646d96743134a9f b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/8a/ae714f7d939309d7f132b30646d96743134a9f deleted file mode 100644 index 34ff560e32..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/8a/ae714f7d939309d7f132b30646d96743134a9f +++ /dev/null @@ -1 +0,0 @@ -x+)JMU06ł`040031QH,-ÉĎM-JOMLĘIŐ+©(aH:,»:ÎCÉýúô:ŢË ˛o>ZC'g$楧¦čfćé&%ć%g€5¬ÎqYôÂeŇZoÇÝŮkÚMíć2­éĆÔ›X\’ZDPC~^ZNfrIf^:Xéő›ZHŮŠž1O(_ś,'ş× jv^j9Č!Ɖ9%`Ą<sBާÝHrčSćĽ3§d 㠨ҢÔÜü2 wßüI{•|ţą÷ 2m»gÜËľ‹©ÉÝ1ÖËĺŹüŠ5ÓżÜ,\“µ})TC)00ŔavʉůzÖ›¦9–¤×Mü°úŐ…'6óbĘĺ’G \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/8b/095d8fd01594f4d14454d073e3ac57b9ce485f b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/8b/095d8fd01594f4d14454d073e3ac57b9ce485f deleted file mode 100644 index 4ec0138816..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/8b/095d8fd01594f4d14454d073e3ac57b9ce485f and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/8b/5b53cb2aa9ceb1139f5312fcfa3cc3c5a47c9a b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/8b/5b53cb2aa9ceb1139f5312fcfa3cc3c5a47c9a deleted file mode 100644 index f4249c23df..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/8b/5b53cb2aa9ceb1139f5312fcfa3cc3c5a47c9a +++ /dev/null @@ -1 +0,0 @@ -xí± Ŕ0 S{Š"2ŽŚd,0˛‘^?&S¤HóŐÝź[Ď8ďëŞE›`Ń„ËrŤZŠ*ędŚĄ­ĆrlŚ,©± ŮcbF/ ·“¶÷'żűĺgв \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/8b/7cd60d49ce3a1a770ece43b7d29b5cf462a33a b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/8b/7cd60d49ce3a1a770ece43b7d29b5cf462a33a deleted file mode 100644 index 790750c0ff..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/8b/7cd60d49ce3a1a770ece43b7d29b5cf462a33a and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/8b/fb012a6d809e499bd8d3e194a3929bc8995b93 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/8b/fb012a6d809e499bd8d3e194a3929bc8995b93 deleted file mode 100644 index a90ee08ce1..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/8b/fb012a6d809e499bd8d3e194a3929bc8995b93 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/8c/749d9968d4b10dcfb06c9f97d0e5d92d337071 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/8c/749d9968d4b10dcfb06c9f97d0e5d92d337071 deleted file mode 100644 index e42393cf71..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/8c/749d9968d4b10dcfb06c9f97d0e5d92d337071 +++ /dev/null @@ -1,2 +0,0 @@ -xĄŽAB!C]s -. a€ůcÜx÷f`†|_ bĽľhĽ»ö5mšëş^»¶ŢmzŃŮL“`đ”}$26#"8°ĹĆ`s.`ÔťšÜş.!bH\<» i´"Á,K¦ś8ŻčŮ—Úô‰_ÔXź—ş>ęMďeĐŹ:Ę7řą]®ëAC40ĎŢë­™ŚQŽł]ţśQ\.Ä,¬ŢVO  \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/8f/4433f8593ddd65b7dd43dd4564d841f4d9c8aa b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/8f/4433f8593ddd65b7dd43dd4564d841f4d9c8aa deleted file mode 100644 index d2de777ccd..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/8f/4433f8593ddd65b7dd43dd4564d841f4d9c8aa and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/90/a336c7dacbe295159413559b0043b8bdc60d57 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/90/a336c7dacbe295159413559b0043b8bdc60d57 deleted file mode 100644 index 35453ebfd5..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/90/a336c7dacbe295159413559b0043b8bdc60d57 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/91/2b2d7819cf9c1029e414883857ed61d597a1a5 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/91/2b2d7819cf9c1029e414883857ed61d597a1a5 deleted file mode 100644 index d5df393e9d..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/91/2b2d7819cf9c1029e414883857ed61d597a1a5 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/91/8bb3e09090a9995d48af9a2a6296d7e6088d1c b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/91/8bb3e09090a9995d48af9a2a6296d7e6088d1c deleted file mode 100644 index c214ab2063..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/91/8bb3e09090a9995d48af9a2a6296d7e6088d1c and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/91/f44111cb1cb1358ac6944ad356ca1738813ea1 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/91/f44111cb1cb1358ac6944ad356ca1738813ea1 deleted file mode 100644 index 51a456f423..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/91/f44111cb1cb1358ac6944ad356ca1738813ea1 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/92/7d4943cdbdc9a667db8e62cfd0a41870235c51 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/92/7d4943cdbdc9a667db8e62cfd0a41870235c51 deleted file mode 100644 index b6b92c8424..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/92/7d4943cdbdc9a667db8e62cfd0a41870235c51 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/93/77fccdb210540b8c0520cc6e80eb632c20bd25 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/93/77fccdb210540b8c0520cc6e80eb632c20bd25 deleted file mode 100644 index 4b2d93b07d..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/93/77fccdb210540b8c0520cc6e80eb632c20bd25 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/94/4f5dd1a867cab4c2bbcb896493435cae1dcc1a b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/94/4f5dd1a867cab4c2bbcb896493435cae1dcc1a deleted file mode 100644 index 1430938313..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/94/4f5dd1a867cab4c2bbcb896493435cae1dcc1a +++ /dev/null @@ -1,2 +0,0 @@ -xĄŽK!D]s -. zšÄ7ŢŔ Đ|2. bĽľhĽ»ŞWÉKĹVëmH0~7zÎŇ"¦PČ9`ň:»ŔŃQôi)QČLEyq=oC*P6-"4„l0StAŽHĚZC'g$楧¦čfćé&%ć%g€5¬ÎqYôÂeŇZoÇÝŮkÚMíć2­éĆÔ›X\’ZDPC~^ZNfrIf^:Xéő›ZHŮŠž1O(_ś,'ş× jv^jąnb^ŠnJfZZjQj^ XĂű#3|>˛^Uó:ţ'äAÝÔ2ż†R¨†˘ÔÜü2 ×ßüI{•|ţą÷ 2m»gÜËľ‹©Éő1ÖËĺŹüŠ5ÓżÜ,\“µ})TC)0HŔ!vʉůzÖ›¦9–¤×Mü°úŐ…'6óbG–x \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/a9/0bc3fb6f15181972a2959a921429efbd81a473 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/a9/0bc3fb6f15181972a2959a921429efbd81a473 deleted file mode 100644 index 91113ee8e5..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/a9/0bc3fb6f15181972a2959a921429efbd81a473 +++ /dev/null @@ -1,2 +0,0 @@ -xĄŽK -1D]ç}Ą;˙7ŢŔ˝dŇ=Ś‹‰Żooŕ®^UQT®Ą\;hk6˝‰@¦™Â‰gŚ §5r’čѓʖŚ]uOMnňdgÄz›ť&ŇčcŤĆĺśő¨'•ž}­ NüJŤáĽÖň¨7ŘËp?ę(ßŕG»\ËČ8‡ĽCآGTĂg»ü9Łxą$faőxN" \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/ab/40af3cb8a3ed2e2843e96d9aa7871336b94573 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/ab/40af3cb8a3ed2e2843e96d9aa7871336b94573 deleted file mode 100644 index 7da1da656f..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/ab/40af3cb8a3ed2e2843e96d9aa7871336b94573 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/ab/6c44a2e84492ad4b41bb6bac87353e9d02ac8b b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/ab/6c44a2e84492ad4b41bb6bac87353e9d02ac8b deleted file mode 100644 index d840c1a573..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/ab/6c44a2e84492ad4b41bb6bac87353e9d02ac8b and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/ab/929391ac42572f92110f3deeb4f0844a951e22 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/ab/929391ac42572f92110f3deeb4f0844a951e22 deleted file mode 100644 index 8840d00c5d..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/ab/929391ac42572f92110f3deeb4f0844a951e22 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/ac/4045f965119e6998f4340ed0f411decfb3ec05 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/ac/4045f965119e6998f4340ed0f411decfb3ec05 deleted file mode 100644 index 4c32d63f82..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/ac/4045f965119e6998f4340ed0f411decfb3ec05 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/ad/01aebfdf2ac13145efafe3f9fcf798882f1730 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/ad/01aebfdf2ac13145efafe3f9fcf798882f1730 deleted file mode 100644 index ae3ef8ce30..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/ad/01aebfdf2ac13145efafe3f9fcf798882f1730 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/ad/26b598134264fd284292cb233fc0b2f25851da b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/ad/26b598134264fd284292cb233fc0b2f25851da deleted file mode 100644 index 5819a2e25d..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/ad/26b598134264fd284292cb233fc0b2f25851da and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/ad/a14492498136771f69dd451866cabcb0e9ef9a b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/ad/a14492498136771f69dd451866cabcb0e9ef9a deleted file mode 100644 index 71023de390..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/ad/a14492498136771f69dd451866cabcb0e9ef9a and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/ad/a55a45d14527dc3dfc714ea1c65d2e1e6fbe87 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/ad/a55a45d14527dc3dfc714ea1c65d2e1e6fbe87 deleted file mode 100644 index 3091b8f3d8..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/ad/a55a45d14527dc3dfc714ea1c65d2e1e6fbe87 +++ /dev/null @@ -1 +0,0 @@ -x+)JMU067d040031QH,-ÉĎM-JOMLĘIŐ+©(aH:,»:ÎCÉýúô:ŢË ˛o>ZC'g$楧¦čfćé&%ć%g€5¬ÎqYôÂeŇZoÇÝŮkÚMíć2­éĆÔ›X\’ZDPC~^ZNfrIf^:Xéő›ZHŮŠž1O(_ś,'ş× jvn~JfZ&Ä5†Ć`ŐĆnלU7Ď V.6™t6ôÇL/•R¨ę˘ÔÜü2 §ßüI{•|ţą÷ 2m»gÜËľ‹©Éé1ÖËĺŹüŠ5ÓżÜ,\“µ})TC)0<ŔÁvʉůzÖ›¦9–¤×Mü°úŐ…'6ób±N’* \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/b2/d399ae15224e1d58066e3c8df70ce37de7a656 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/b2/d399ae15224e1d58066e3c8df70ce37de7a656 deleted file mode 100644 index 20fa838f20..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/b2/d399ae15224e1d58066e3c8df70ce37de7a656 +++ /dev/null @@ -1,2 +0,0 @@ -xíQA1ôĚ+x€ŮÄ‹‰Ďˇ-kI*5”fż/»zőîÁ af!¤Ö^/·“W¸Jcܤ5LŚĆ›‰;+ŠBź6ÎHZP|`îóh>\(óŮ$“sŕ´î•íX·@š˘75€}57ąK -ݵ+= ;g—® @Đ˝Ň!¬4Úč!Ś,\$\ \Âb/±ÉHsř©#ţaľĽ÷QÄß \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/b4/2712cfe99a1a500b2a51fe984e0b8a7702ba11 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/b4/2712cfe99a1a500b2a51fe984e0b8a7702ba11 deleted file mode 100644 index 2820b46ccc..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/b4/2712cfe99a1a500b2a51fe984e0b8a7702ba11 +++ /dev/null @@ -1,5 +0,0 @@ -xíA -Ŕ {öű†Bé{M1  ¨ĄßŻ>ŁPŘËË–‹3ŽýÜFÖŽ7ÁĄE02 †Űý¶‹XŽ0üšąĚ’ę,)ë$;:Ż‚­Ü·îţÍĆ(óä: \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/b6/f610aef53bd343e6c96227de874c66f00ee8e8 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/b6/f610aef53bd343e6c96227de874c66f00ee8e8 deleted file mode 100644 index fb102f15dc..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/b6/f610aef53bd343e6c96227de874c66f00ee8e8 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/b7/a2576f9fc20024ac9ef17cb134acbd1ac73127 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/b7/a2576f9fc20024ac9ef17cb134acbd1ac73127 deleted file mode 100644 index 22f2d137d4..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/b7/a2576f9fc20024ac9ef17cb134acbd1ac73127 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/b8/a3a806d3950e8c0a03a34f234a92eff0e2c68d b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/b8/a3a806d3950e8c0a03a34f234a92eff0e2c68d deleted file mode 100644 index 24f029900e..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/b8/a3a806d3950e8c0a03a34f234a92eff0e2c68d and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/ba/cac9b3493509aa15e1730e1545fc0919d1dae0 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/ba/cac9b3493509aa15e1730e1545fc0919d1dae0 deleted file mode 100644 index f35586f7f8..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/ba/cac9b3493509aa15e1730e1545fc0919d1dae0 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/bc/744705e1d8a019993cf88f62bc4020f1b80919 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/bc/744705e1d8a019993cf88f62bc4020f1b80919 deleted file mode 100644 index 0d4bdb3237..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/bc/744705e1d8a019993cf88f62bc4020f1b80919 +++ /dev/null @@ -1,2 +0,0 @@ -xĄŽK -1D]ç}%˙¸ńî%ťtYÄH&âőŤâ ÜU˝˘ŠJ­Öu€Ôj7:P(Ú#Ą”¬ĚF§̄ģ1”ť°Ů+kŮ#vşΚ‚ŢĘ⢒ŁS8«‘W|ńÚ٨%˛řKëpÉŻŘ3\—V·v‡#MúQgú?wH­ž@(c„ ž ŘsË9›tžôç Ëĺ¶­™{źkOó \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/bc/95c75d59386147d1e79a87c33068d8dbfd71f2 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/bc/95c75d59386147d1e79a87c33068d8dbfd71f2 deleted file mode 100644 index 436d5a076a..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/bc/95c75d59386147d1e79a87c33068d8dbfd71f2 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/bd/593285fc7fe4ca18ccdbabf027f5d689101452 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/bd/593285fc7fe4ca18ccdbabf027f5d689101452 deleted file mode 100644 index 75ab1f0f3f..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/bd/593285fc7fe4ca18ccdbabf027f5d689101452 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/bd/867fbae2faa80b920b002b80b1c91bcade7784 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/bd/867fbae2faa80b920b002b80b1c91bcade7784 deleted file mode 100644 index 0f7421963a..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/bd/867fbae2faa80b920b002b80b1c91bcade7784 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/bd/9cb4cd0a770cb9adcb5fce212142ef40ea1c35 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/bd/9cb4cd0a770cb9adcb5fce212142ef40ea1c35 deleted file mode 100644 index 2aafdc64f0..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/bd/9cb4cd0a770cb9adcb5fce212142ef40ea1c35 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/be/f6e37b3ee632ba74159168836f382fed21d77d b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/be/f6e37b3ee632ba74159168836f382fed21d77d deleted file mode 100644 index 6c243150dc..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/be/f6e37b3ee632ba74159168836f382fed21d77d +++ /dev/null @@ -1,2 +0,0 @@ -xĄŤK -1D]ç}Ą»3?AÄŤ7p?ô$=Ś`҉x}GńîŞŢŞ`)Ý+0Ń®Uhú.N“WĆŢ“Ź!ĆĐIdl¦™řŘjëť<ëb®ń%%Âm±´Z†“nô“.úżv–Î@ľCdjy€=nŁŰyŐ?g\Ń,IÇ`y~ÜC%]«÷˝żH& \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/c0/6a9be584ac49aa02c5551312d9e2982c91df10 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/c0/6a9be584ac49aa02c5551312d9e2982c91df10 deleted file mode 100644 index 963ef23ac8..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/c0/6a9be584ac49aa02c5551312d9e2982c91df10 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/c1/b17981db0840109a820dae8674ee29684134ff b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/c1/b17981db0840109a820dae8674ee29684134ff deleted file mode 100644 index fdcf28cb0a..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/c1/b17981db0840109a820dae8674ee29684134ff and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/c1/b6a51bbb87c2f82b161412c3d20b59fc69b090 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/c1/b6a51bbb87c2f82b161412c3d20b59fc69b090 deleted file mode 100644 index 3b369f8fe8..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/c1/b6a51bbb87c2f82b161412c3d20b59fc69b090 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/c3/5dee9bcc0e989f3b0c40f68372a9a51b6c4e6a b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/c3/5dee9bcc0e989f3b0c40f68372a9a51b6c4e6a deleted file mode 100644 index d22b3b23ca..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/c3/5dee9bcc0e989f3b0c40f68372a9a51b6c4e6a and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/c3/d02eeef75183df7584d8d13ac03053910c1301 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/c3/d02eeef75183df7584d8d13ac03053910c1301 deleted file mode 100644 index 2294f018d6..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/c3/d02eeef75183df7584d8d13ac03053910c1301 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/c4/efe31e9decccc8b2b4d3df9aac2cdfe2995618 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/c4/efe31e9decccc8b2b4d3df9aac2cdfe2995618 deleted file mode 100644 index c7572d5bc5..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/c4/efe31e9decccc8b2b4d3df9aac2cdfe2995618 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/c5/0d0f1cb60b8b0fe1615ad20ace557e9d68d7bd b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/c5/0d0f1cb60b8b0fe1615ad20ace557e9d68d7bd deleted file mode 100644 index a1d5321e84..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/c5/0d0f1cb60b8b0fe1615ad20ace557e9d68d7bd +++ /dev/null @@ -1 +0,0 @@ -xĄŽKj1DłÖ)t–4ę–Ŕl|ďŤ>-f Ť‚Ż9äŢU˝‚âĄVë6¤¶ô1:łĚ¸čč‰ !ĆüŔĺ>Z.ĽP…0“x„Îű‘ ˛ˇhŃčhQÖ+tÎ`1NÎZe˘,ÂĎX[—×ü =ËŰÚęŃvyćI_é‹˙†˙vJ­^¤2 í$?ÁI§ěŕ7oÄ4•ď©íĺ{Kă>VŢú!~|”U= \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/c5/bbe550b9f09444bdddd3ecf3d97c0b42aa786c b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/c5/bbe550b9f09444bdddd3ecf3d97c0b42aa786c deleted file mode 100644 index 2f2ada732b..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/c5/bbe550b9f09444bdddd3ecf3d97c0b42aa786c and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/c6/07fc30883e335def28cd686b51f6cfa02b06ec b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/c6/07fc30883e335def28cd686b51f6cfa02b06ec deleted file mode 100644 index 475b87ef9b..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/c6/07fc30883e335def28cd686b51f6cfa02b06ec +++ /dev/null @@ -1,2 +0,0 @@ -xĄŤQ -1 Dýî)r%±›n "ţx/m[°[¨ŻooŕßĚ{0k)ą…i×›*`âŁZavJ>,‚aň˘ěfŹ<EZČÍÉČłŻµÁ5˝¤%¸­µ<ę'ô“.úżvµś,;ë]€=2˘tśwýsĆä-÷,wóĘ8@° \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/c6/92ecf62007c0ac9fb26e2aa884de2933de15ed b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/c6/92ecf62007c0ac9fb26e2aa884de2933de15ed deleted file mode 100644 index ae430bd4af..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/c6/92ecf62007c0ac9fb26e2aa884de2933de15ed and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/c8/f06f2e3bb2964174677e91f0abead0e43c9e5d b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/c8/f06f2e3bb2964174677e91f0abead0e43c9e5d deleted file mode 100644 index 5dae4c3acf..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/c8/f06f2e3bb2964174677e91f0abead0e43c9e5d and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/c9/174cef549ec94ecbc43ef03cdc775b4950becb b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/c9/174cef549ec94ecbc43ef03cdc775b4950becb deleted file mode 100644 index da8dba2445..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/c9/174cef549ec94ecbc43ef03cdc775b4950becb +++ /dev/null @@ -1,2 +0,0 @@ -xĄŽQ -Â0DýÎ)rĘf“nSńÇxífCŰHŚx}«x˙fŢŔc¤,˵Y ´kUŐbďň8‚pÔu`%—|@rä3GtBŔ™;W]›‚!‹‡˝zß'Í%Q¤iÓdś€T ?Ű\Ş=§×d/sYeµÝč'ťô;üÚ^Ęr´Î÷#l`6şťmú§Ć ßZ7U^e6oVňO´ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/c9/4b27e41064c521120627e07e2035cca1d24ffa b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/c9/4b27e41064c521120627e07e2035cca1d24ffa deleted file mode 100644 index fd1ec9fab8..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/c9/4b27e41064c521120627e07e2035cca1d24ffa and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/ca/b2cf23998b40f1af2d9d9a756dc9e285a8df4b b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/ca/b2cf23998b40f1af2d9d9a756dc9e285a8df4b deleted file mode 100644 index 32ba2aa53a..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/ca/b2cf23998b40f1af2d9d9a756dc9e285a8df4b and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/ca/ff6b7d44973f53e3e0cf31d0d695188b19aec6 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/ca/ff6b7d44973f53e3e0cf31d0d695188b19aec6 deleted file mode 100644 index 6d0f60077b..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/ca/ff6b7d44973f53e3e0cf31d0d695188b19aec6 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/cb/491780d82e46dc88a065b965ab307a038f2bc2 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/cb/491780d82e46dc88a065b965ab307a038f2bc2 deleted file mode 100644 index cf9cd7d399..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/cb/491780d82e46dc88a065b965ab307a038f2bc2 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/cb/6693a788715b82440a54e0eacd19ba9f6ec559 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/cb/6693a788715b82440a54e0eacd19ba9f6ec559 deleted file mode 100644 index e11181a967..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/cb/6693a788715b82440a54e0eacd19ba9f6ec559 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/cc/338e4710c9b257106b8d16d82f86458d5beaf1 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/cc/338e4710c9b257106b8d16d82f86458d5beaf1 deleted file mode 100644 index 85b3b81123..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/cc/338e4710c9b257106b8d16d82f86458d5beaf1 +++ /dev/null @@ -1,2 +0,0 @@ -xĄŽK!]sŠľ€†ć3`bŚoŕ »ÉĚ1 Ćë‹gpW©E˝G­Öm€±x]“Čůť6d -űçeaŽÎ‰ç˘µzĄ.ϬŽDv Ů[ęhťŽĄäDł[´Jď±¶wţ¤ÎđX[ÝŰ.2íŹnuŁŢöVƉZ˝ÚłF´!x8ę8÷¦ťG‡ü‘PÂŰP_’?KN \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/cc/3e3009134cb88014129fc8858d1101359e5e2f b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/cc/3e3009134cb88014129fc8858d1101359e5e2f deleted file mode 100644 index 9a0cb7a0c9..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/cc/3e3009134cb88014129fc8858d1101359e5e2f +++ /dev/null @@ -1,2 +0,0 @@ -xĄŽ] -Â0„}Î)ö•Íß&_ĽH“ -ŘFbÔë[Ĺř6ó}0LŞË2wPĆězc†’­Ë*“sXbö‚ Rt”®#Gë$‰[lĽvH„®$ŤŢkÖÚf.ʧLžF+ ĄQŤHśD|ô©68çWl.S]îu…oô“Nüż¶Ou9‚ÔVa0^ZĹF·łť˙ś˝ÍĎ9^#Ţ ŘOd \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/ce/8860d49e3bea6fd745874a01b7c3e46da8cbc3 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/ce/8860d49e3bea6fd745874a01b7c3e46da8cbc3 deleted file mode 100644 index 860f9952f1..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/ce/8860d49e3bea6fd745874a01b7c3e46da8cbc3 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/ce/e656c392ad0557b3aae0fb411475c206e2926f b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/ce/e656c392ad0557b3aae0fb411475c206e2926f deleted file mode 100644 index ff0624ccb0..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/ce/e656c392ad0557b3aae0fb411475c206e2926f and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/cf/8c5cc8a85a1ff5a4ba51e0bc7cf5665669924d b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/cf/8c5cc8a85a1ff5a4ba51e0bc7cf5665669924d deleted file mode 100644 index 36b0289e6f..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/cf/8c5cc8a85a1ff5a4ba51e0bc7cf5665669924d and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/d0/7ec190c306ec690bac349e87d01c4358e49bb2 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/d0/7ec190c306ec690bac349e87d01c4358e49bb2 deleted file mode 100644 index d52a56ffed..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/d0/7ec190c306ec690bac349e87d01c4358e49bb2 +++ /dev/null @@ -1,2 +0,0 @@ -xŐŹ± €0 ©™Â3¤ažOb%Ç‘S°=HTŚ@u:]uYG¦´Ą%šLÚE™–;¸’uĚ`_?gŚÎ~0˛ňßŇ”. -׋PëűŁÓśńxvXië Ó­f! \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/d0/d4594e16f2e19107e3fa7ea63e7aaaff305ffb b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/d0/d4594e16f2e19107e3fa7ea63e7aaaff305ffb deleted file mode 100644 index 5f7e286ff8..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/d0/d4594e16f2e19107e3fa7ea63e7aaaff305ffb and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/d2/f8637f2eab2507a1e13cbc9df4729ec386627e b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/d2/f8637f2eab2507a1e13cbc9df4729ec386627e deleted file mode 100644 index 558a8513fd..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/d2/f8637f2eab2507a1e13cbc9df4729ec386627e and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/d3/3cedf513c059e0515653fa2c2e386631387a05 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/d3/3cedf513c059e0515653fa2c2e386631387a05 deleted file mode 100644 index d6d4c2b45e..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/d3/3cedf513c059e0515653fa2c2e386631387a05 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/d3/719a5ae8e4d92276b5313ce976f6ee5af2b436 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/d3/719a5ae8e4d92276b5313ce976f6ee5af2b436 deleted file mode 100644 index 930bf5a5e6..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/d3/719a5ae8e4d92276b5313ce976f6ee5af2b436 +++ /dev/null @@ -1,2 +0,0 @@ -x=Ť1Â0 E™}ŠżuAH…Ř¨Ä z‡¸ÔRHPÔź´T –ż÷ěBrh/ç]?ŞaĐ 48ˇ,‘_âˇMúdköÄŃTPF!«÷›TďZµQ? -RÖ§F«Në™ŐĘŇ_J͆ĂÔ Řh’Ş{źßň(kŇËLKV1p–+Q‹ťęŃŐÝŃ® A× \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/d3/7aa3bbfe1c0c49b909781251b956dbabe85f96 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/d3/7aa3bbfe1c0c49b909781251b956dbabe85f96 deleted file mode 100644 index 5902e0f329..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/d3/7aa3bbfe1c0c49b909781251b956dbabe85f96 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/d3/7ad72a2052685fc6201c2af90103ad42d2079b b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/d3/7ad72a2052685fc6201c2af90103ad42d2079b deleted file mode 100644 index b2f39bff41..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/d3/7ad72a2052685fc6201c2af90103ad42d2079b and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/d4/207f77243500bec335ab477f9227fcdb1e271a b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/d4/207f77243500bec335ab477f9227fcdb1e271a deleted file mode 100644 index 862e4e5bce..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/d4/207f77243500bec335ab477f9227fcdb1e271a +++ /dev/null @@ -1,2 +0,0 @@ -xĄŽK -1D]繀’O'™7ŢŔ˝t:ÝŚ‹™H&âőŸ«zŠ˘:Ď÷®Ä]oĚZŔBńBXlô(“ć­+d<"«6^şÎ%ŚŢ A( ˇJĆ,Ć% %Ł5‚SřěSmúR^ŘŠľNu^뢏ĽŃO:óWüÚę|ŇÖ ĆčôŢDcÔF·łť˙śQEn¸Ż˝6őÔ#Qç \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/d4/27e0b2e138501a3d15cc376077a3631e15bd46 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/d4/27e0b2e138501a3d15cc376077a3631e15bd46 deleted file mode 100644 index 0b3611ae4c..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/d4/27e0b2e138501a3d15cc376077a3631e15bd46 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/d5/093787ef302b941b6aab081b99fb4880038bd8 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/d5/093787ef302b941b6aab081b99fb4880038bd8 deleted file mode 100644 index 7d73449eb3..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/d5/093787ef302b941b6aab081b99fb4880038bd8 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/d5/a61b0b4992a4f0caa887fa08b52431e727bb6f b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/d5/a61b0b4992a4f0caa887fa08b52431e727bb6f deleted file mode 100644 index a7921de43c..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/d5/a61b0b4992a4f0caa887fa08b52431e727bb6f and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/d5/b6fc965c926a1bfc9ee456042b94088b5c5d21 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/d5/b6fc965c926a1bfc9ee456042b94088b5c5d21 deleted file mode 100644 index 924bdbbb58..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/d5/b6fc965c926a1bfc9ee456042b94088b5c5d21 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/d5/ec1152fe25e9fec00189eb00b3db71db24c218 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/d5/ec1152fe25e9fec00189eb00b3db71db24c218 deleted file mode 100644 index 0d2534bc9b..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/d5/ec1152fe25e9fec00189eb00b3db71db24c218 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/d6/42b9770c66bba94a08df09b5efb095001f76d7 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/d6/42b9770c66bba94a08df09b5efb095001f76d7 deleted file mode 100644 index 1671f9f2c0..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/d6/42b9770c66bba94a08df09b5efb095001f76d7 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/d6/462fa3f5292857db599c54aea2bf91616230c5 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/d6/462fa3f5292857db599c54aea2bf91616230c5 deleted file mode 100644 index baae3f0e01..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/d6/462fa3f5292857db599c54aea2bf91616230c5 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/d6/cf6c7741b3316826af1314042550c97ded1d50 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/d6/cf6c7741b3316826af1314042550c97ded1d50 deleted file mode 100644 index 8f9ae1fc64..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/d6/cf6c7741b3316826af1314042550c97ded1d50 +++ /dev/null @@ -1,2 +0,0 @@ -xĄŤQ -1 Dýî)r%µ¦i@Äoŕj›e»…ÚĹë[Ĺř7ó̤ZĘ˝żéMSLB‘­Nl°ěm öŃBşÉ~×>×—üŠ-Ău®ĺY8ę źtÖŻřµ]ŞĺÖQaǶčÍ ăĽëź3f]š>b×lŢ(„A] \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/d7/308cc367b2cc23f710834ec1fd8ffbacf1b460 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/d7/308cc367b2cc23f710834ec1fd8ffbacf1b460 deleted file mode 100644 index b02cda4fa7..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/d7/308cc367b2cc23f710834ec1fd8ffbacf1b460 +++ /dev/null @@ -1 +0,0 @@ -xĄŤK @]sŠą€†)ĐÄ7ŢŔ đ™¦]ĐI(Ćx{ń î^Ţâ˝,µnĐ»SoĚ`¬/ąXä)Ů™B@GžĂ”¸śaňDĽ «řę«4x”wlž«ÔCv¸ň°?ş×-79dé—,őh‚F4Žśµ×Z ;Ćť˙H¨´í±}Ô·š=  \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/d8/74671ef5b20184836cb983bb273e5280384d0b b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/d8/74671ef5b20184836cb983bb273e5280384d0b deleted file mode 100644 index 1d8037895d..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/d8/74671ef5b20184836cb983bb273e5280384d0b and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/d8/dec75ff2f8b41d1c5bfef0cd57b7300c834f66 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/d8/dec75ff2f8b41d1c5bfef0cd57b7300c834f66 deleted file mode 100644 index 74f807e686..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/d8/dec75ff2f8b41d1c5bfef0cd57b7300c834f66 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/d8/fa77b6833082c1ea36b7828a582d4c43882450 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/d8/fa77b6833082c1ea36b7828a582d4c43882450 deleted file mode 100644 index 988145322e..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/d8/fa77b6833082c1ea36b7828a582d4c43882450 +++ /dev/null @@ -1 +0,0 @@ -xíĐ1€ DQkN1Ą–&6‡•%l˛BkŚ·naa1Ĺk¦ř¤…°íëdI˘(ăUŁrö'7‰‘»Lź’AĹ,±+Wmđ9 ŚI'UźŹÄÍą˙ńŁ_ŰܰN \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/d9/63979c237d08b6ba39062ee7bf64c7d34a27f8 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/d9/63979c237d08b6ba39062ee7bf64c7d34a27f8 deleted file mode 100644 index 5fa10405ce..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/d9/63979c237d08b6ba39062ee7bf64c7d34a27f8 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/da/178208145ef585a1bd5ca5f4c9785d738df2cf b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/da/178208145ef585a1bd5ca5f4c9785d738df2cf deleted file mode 100644 index 6292118e04..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/da/178208145ef585a1bd5ca5f4c9785d738df2cf and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/db/6261a7c65c7fd678520c9bb6f2c47582ab9ed5 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/db/6261a7c65c7fd678520c9bb6f2c47582ab9ed5 deleted file mode 100644 index b82e7fcafe..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/db/6261a7c65c7fd678520c9bb6f2c47582ab9ed5 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/dd/2ae5ab264e5592aa754235d5ad5eac8f0ecdfd b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/dd/2ae5ab264e5592aa754235d5ad5eac8f0ecdfd deleted file mode 100644 index 55626a57b1..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/dd/2ae5ab264e5592aa754235d5ad5eac8f0ecdfd and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/dd/9a570c3400e6e07bc4d7651d6e20b08926b3d9 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/dd/9a570c3400e6e07bc4d7651d6e20b08926b3d9 deleted file mode 100644 index 8fd60cbe8f..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/dd/9a570c3400e6e07bc4d7651d6e20b08926b3d9 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/de/872ee3618b894992e9d1e18ba2ebe256a112f9 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/de/872ee3618b894992e9d1e18ba2ebe256a112f9 deleted file mode 100644 index 04dda4a758..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/de/872ee3618b894992e9d1e18ba2ebe256a112f9 +++ /dev/null @@ -1 +0,0 @@ -xí± Ŕ S3ĹŹ‚…ŚlK–A†ő˛BÚ4Wť®¸b­ źů—T5Á˘:§8ÔS»c€ś±Ô Ô»P`KäIťĄË†O3Z˝•”ţŕç‡&ŘÝ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/df/e3f22baa1f6fce5447901c3086bae368de6bdd b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/df/e3f22baa1f6fce5447901c3086bae368de6bdd deleted file mode 100644 index e135694400..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/df/e3f22baa1f6fce5447901c3086bae368de6bdd and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/e0/67f9361140f19391472df8a82d6610813c73b7 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/e0/67f9361140f19391472df8a82d6610813c73b7 deleted file mode 100644 index 955431dd7f..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/e0/67f9361140f19391472df8a82d6610813c73b7 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/e1/129b3cfb5898e0fbd606e0cb80b2755e50d161 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/e1/129b3cfb5898e0fbd606e0cb80b2755e50d161 deleted file mode 100644 index 751f1dd333..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/e1/129b3cfb5898e0fbd606e0cb80b2755e50d161 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/e1/7ace1492648c9dc5701bad5c47af9d1b60c4e9 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/e1/7ace1492648c9dc5701bad5c47af9d1b60c4e9 deleted file mode 100644 index 4a812e5dfa..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/e1/7ace1492648c9dc5701bad5c47af9d1b60c4e9 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/e2/c6abbd55fed5ac71a5f2751e29b4a34726a595 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/e2/c6abbd55fed5ac71a5f2751e29b4a34726a595 deleted file mode 100644 index 7b84ce966d..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/e2/c6abbd55fed5ac71a5f2751e29b4a34726a595 +++ /dev/null @@ -1 +0,0 @@ -x+)JMU067f040031QH,-ÉĎM-JOMLĘIŐ+©(aH:,»:ÎCÉýúô:ŢË ˛o>ZC'g$楧¦čfćé&%ć%g€5¬ÎqYôÂeŇZoÇÝŮkÚMíć2­éĆÔ›X\’ZDPC~^ZNfrIf^:Xéő›ZHŮŠž1O(_ś,'ş× jvn~JfZ&Ô5ů%·şł\N´ş˘ÔçŢö§,5[đe“٨ú˘ÔÜü2 ÇßüI{•|ţą÷ 2m»gÜËľ‹©Éń1ÖËĺŹüŠ5ÓżÜ,\“µ})TC)0DŔvú‰ůzÖ›¦9–¤×Mü°úŐ…'6ób‹” \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/e3/1e7ad3ed298f24e383c4950f4671993ec078e4 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/e3/1e7ad3ed298f24e383c4950f4671993ec078e4 deleted file mode 100644 index a28ded3fba..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/e3/1e7ad3ed298f24e383c4950f4671993ec078e4 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/e3/76fbdd06ebf021c92724da9f26f44212734e3e b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/e3/76fbdd06ebf021c92724da9f26f44212734e3e deleted file mode 100644 index 8da234114d..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/e3/76fbdd06ebf021c92724da9f26f44212734e3e +++ /dev/null @@ -1,3 +0,0 @@ -xíAÂ@E]s -`ö@Ě uHš)M=ľScô®Üţü’zÂé:ť˘ĘŠł(ăN+6Ţ›D°ˇFeđ­­Y®g$+GŢä&F -ź˝ě‹p‡ţâG —4”mQÉ\±á85Ć#FěCđĄď~QEóŔÄŔÚR—š˝u)Ł;cáŕâ6ü­öë'ÍjÄÇ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/e4/9f917b448d1340b31d76e54ba388268fd4c922 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/e4/9f917b448d1340b31d76e54ba388268fd4c922 deleted file mode 100644 index 870c3e7321..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/e4/9f917b448d1340b31d76e54ba388268fd4c922 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/e4/f618a2c3ed0669308735727df5ebf2447f022f b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/e4/f618a2c3ed0669308735727df5ebf2447f022f deleted file mode 100644 index c7e1ee9d7f..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/e4/f618a2c3ed0669308735727df5ebf2447f022f +++ /dev/null @@ -1,2 +0,0 @@ -xĄŽK!D]s -. išObŚoŕ i2. bĽľhĽ»Ş÷’JQ«ő6äb`7:łDN.%•±ś4ą’u¦Ź‹ĎÄIQńYÜcçmČŕŮ`Q¨ aQYa¶@>äÄÉ—Ecń9ÖÖĺ%żbĎňş¶úh›<ň¤źtćŻřµµz’JŁňÁ(ą“Îł˙śŤFCń_‹NŚ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/e5/060729746ca9888239cba08fdcf4bee907b406 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/e5/060729746ca9888239cba08fdcf4bee907b406 deleted file mode 100644 index 33299c2b0f..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/e5/060729746ca9888239cba08fdcf4bee907b406 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/e6/5a9bb2af9f4c2d1c375dd0f8f8a46cf9c68812 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/e6/5a9bb2af9f4c2d1c375dd0f8f8a46cf9c68812 deleted file mode 100644 index 72f1cbcd94..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/e6/5a9bb2af9f4c2d1c375dd0f8f8a46cf9c68812 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/e8/107f24196736b870a318a0e28f048e29f6feff b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/e8/107f24196736b870a318a0e28f048e29f6feff deleted file mode 100644 index ffcf843c26..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/e8/107f24196736b870a318a0e28f048e29f6feff +++ /dev/null @@ -1,3 +0,0 @@ -xĄŽK!D]s -. i~=LbŚoŕŢ@ÓdfăőEă ÜU˝—TŠj)k—Úš]oĚŇŻmđ„čü„ž5(3Ój&Ô™4Íâß»póp™iRI;‘ł·¨“Â9Ň‚˛Q„g_j“—ô --ÉëRËVďňČ~Ň™żâ×TËI*ăÜtr g;˙9#Rľmkb%ŢrLNÁ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/e9/2cdb7017dc6c5aed25cb4202c5b0104b872246 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/e9/2cdb7017dc6c5aed25cb4202c5b0104b872246 deleted file mode 100644 index cb1260eb8b..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/e9/2cdb7017dc6c5aed25cb4202c5b0104b872246 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/e9/ad6ec3e38364a3d07feda7c4197d4d845c53b5 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/e9/ad6ec3e38364a3d07feda7c4197d4d845c53b5 deleted file mode 100644 index da4a5edd18..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/e9/ad6ec3e38364a3d07feda7c4197d4d845c53b5 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/e9/f48beccc62d535739bfbdebe0a55ed716d8366 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/e9/f48beccc62d535739bfbdebe0a55ed716d8366 deleted file mode 100644 index 23c59e4c96..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/e9/f48beccc62d535739bfbdebe0a55ed716d8366 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/eb/c09d0137cfb0c26697aed0109fb943ad906f3f b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/eb/c09d0137cfb0c26697aed0109fb943ad906f3f deleted file mode 100644 index 83b489d3af..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/eb/c09d0137cfb0c26697aed0109fb943ad906f3f and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/ec/67e5a86adff465359f1c8f995e12dbdfa08d8a b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/ec/67e5a86adff465359f1c8f995e12dbdfa08d8a deleted file mode 100644 index 8490346e1a..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/ec/67e5a86adff465359f1c8f995e12dbdfa08d8a and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/ed/9523e62e453e50dd9be1606af19399b96e397a b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/ed/9523e62e453e50dd9be1606af19399b96e397a deleted file mode 100644 index 7853e235cb..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/ed/9523e62e453e50dd9be1606af19399b96e397a and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/ee/1d6f164893c1866a323f072eeed36b855656be b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/ee/1d6f164893c1866a323f072eeed36b855656be deleted file mode 100644 index 87d808007f..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/ee/1d6f164893c1866a323f072eeed36b855656be and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/ee/3fa1b8c00aff7fe02065fdb50864bb0d932ccf b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/ee/3fa1b8c00aff7fe02065fdb50864bb0d932ccf deleted file mode 100644 index 974b72dfd1..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/ee/3fa1b8c00aff7fe02065fdb50864bb0d932ccf and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/ee/a9286df54245fea72c5b557291470eb825f38f b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/ee/a9286df54245fea72c5b557291470eb825f38f deleted file mode 100644 index ead0b2cdad..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/ee/a9286df54245fea72c5b557291470eb825f38f and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/ef/58fdd8086c243bdc81f99e379acacfd21d32d6 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/ef/58fdd8086c243bdc81f99e379acacfd21d32d6 deleted file mode 100644 index 55f79e0668..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/ef/58fdd8086c243bdc81f99e379acacfd21d32d6 +++ /dev/null @@ -1,2 +0,0 @@ -x ÉÁ Ŕ0Đžťâď:JŠB˘ÝźćôOV -Ţń´yáó5éę†5jă†q!’4÷Î{ˇł:ýp;Ľ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/ef/c499524cf105d5264ac7fc54e07e95764e8075 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/ef/c499524cf105d5264ac7fc54e07e95764e8075 deleted file mode 100644 index bc9350bc0a..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/ef/c499524cf105d5264ac7fc54e07e95764e8075 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/ef/c9121fdedaf08ba180b53ebfbcf71bd488ed09 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/ef/c9121fdedaf08ba180b53ebfbcf71bd488ed09 deleted file mode 100644 index 5f9cd3012d..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/ef/c9121fdedaf08ba180b53ebfbcf71bd488ed09 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/f0/053b8060bb3f0be5cbcc3147a07ece26bf097e b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/f0/053b8060bb3f0be5cbcc3147a07ece26bf097e deleted file mode 100644 index c63d37fb0c..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/f0/053b8060bb3f0be5cbcc3147a07ece26bf097e and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/f0/ce2b8e4986084d9b308fb72709e414c23eb5e6 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/f0/ce2b8e4986084d9b308fb72709e414c23eb5e6 deleted file mode 100644 index e78c19f1a7..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/f0/ce2b8e4986084d9b308fb72709e414c23eb5e6 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/f2/0c9063fa0bda9a397c96947a7b687305c49753 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/f2/0c9063fa0bda9a397c96947a7b687305c49753 deleted file mode 100644 index 34d9aed207..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/f2/0c9063fa0bda9a397c96947a7b687305c49753 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/f2/9e7fb590551095230c6149cbe72f2e9104a796 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/f2/9e7fb590551095230c6149cbe72f2e9104a796 deleted file mode 100644 index 663f6aeb7c..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/f2/9e7fb590551095230c6149cbe72f2e9104a796 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/f2/e1550a0c9e53d5811175864a29536642ae3821 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/f2/e1550a0c9e53d5811175864a29536642ae3821 deleted file mode 100644 index 1fdcbe22a8..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/f2/e1550a0c9e53d5811175864a29536642ae3821 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/f3/293571dcd708b6a3faf03818cd2844d000e198 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/f3/293571dcd708b6a3faf03818cd2844d000e198 deleted file mode 100644 index f748743b84..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/f3/293571dcd708b6a3faf03818cd2844d000e198 +++ /dev/null @@ -1 +0,0 @@ -xĄŽKjÄ0łÖ)údµZ!›ąÁ\@nIŘą,3×Ͳ{Ľ˘XZŰë?F/\Eă12zcó’©"#ęX1§]µÚ[Ô_ęĺGŚ&™śc©+9ł‡”ůXWKÁÓžiUé›t¸çgę›´Sř*“ľ×OŰąË)u|˛´oXp*" pÓ¤µšt†Žň…šĹ©`9ęďÎäę§zĹKO\ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/f3/f1164b68b57b1995b658a828320e6df3081fae b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/f3/f1164b68b57b1995b658a828320e6df3081fae deleted file mode 100644 index 5f0b4e424b..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/f3/f1164b68b57b1995b658a828320e6df3081fae and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/f4/15caf3fcad16304cb424b67f0ee6b12dc03aae b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/f4/15caf3fcad16304cb424b67f0ee6b12dc03aae deleted file mode 100644 index 21ce1a0fc8..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/f4/15caf3fcad16304cb424b67f0ee6b12dc03aae and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/f4/8097eb340dc5a7cae55aabcf1faf4548aa821f b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/f4/8097eb340dc5a7cae55aabcf1faf4548aa821f deleted file mode 100644 index 5a4a9a54ff..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/f4/8097eb340dc5a7cae55aabcf1faf4548aa821f and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/f5/504f36e6f4eb797a56fc5bac6c6c7f32969bf2 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/f5/504f36e6f4eb797a56fc5bac6c6c7f32969bf2 deleted file mode 100644 index 2aa0c3b9ac..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/f5/504f36e6f4eb797a56fc5bac6c6c7f32969bf2 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/f5/b50c85a87cac64d7eb3254cdd1aec9564c0293 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/f5/b50c85a87cac64d7eb3254cdd1aec9564c0293 deleted file mode 100644 index c1885cbe7b..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/f5/b50c85a87cac64d7eb3254cdd1aec9564c0293 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/f5/f9dd5886a6ee20272be0aafc790cba43b31931 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/f5/f9dd5886a6ee20272be0aafc790cba43b31931 deleted file mode 100644 index 17ad5063d7..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/f5/f9dd5886a6ee20272be0aafc790cba43b31931 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/f6/65b45cde9b568009c6e6b7b568e89cfe717df8 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/f6/65b45cde9b568009c6e6b7b568e89cfe717df8 deleted file mode 100644 index 7af50d7dff..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/f6/65b45cde9b568009c6e6b7b568e89cfe717df8 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/f6/be049e284c0f9dcbbc745543885be3502ea521 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/f6/be049e284c0f9dcbbc745543885be3502ea521 deleted file mode 100644 index 12d3c25c25..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/f6/be049e284c0f9dcbbc745543885be3502ea521 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/f7/c332bd4d4d4b777366cae4d24d1687477576bf b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/f7/c332bd4d4d4b777366cae4d24d1687477576bf deleted file mode 100644 index b36bceabf7..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/f7/c332bd4d4d4b777366cae4d24d1687477576bf and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/f8/958bdf4d365a84a9a178b1f5f35ff1dacbd884 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/f8/958bdf4d365a84a9a178b1f5f35ff1dacbd884 deleted file mode 100644 index 5dbbef2761..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/f8/958bdf4d365a84a9a178b1f5f35ff1dacbd884 +++ /dev/null @@ -1,2 +0,0 @@ -xĄŽK -1D]ç}ĄÓI¦qă ÜK>f1’‰x}ŁxwUŻŕQ±–˛v kv˝‰@`Oާ<çHd}ś%kŽA›‘CŇ>˛ŃÄęá›Ü;$KČ™ybhŚóÁ2ç™sLA ±öĘ?űR\ŇË·ץ–­Ţá(~ŇYľĂŻb-'ĐĆYÇŽp‚=NjĐq¶Ëź•ňm[“zí O+ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/fa/c03f2c5139618d87d53614c153823bf1f31396 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/fa/c03f2c5139618d87d53614c153823bf1f31396 deleted file mode 100644 index 30e07e5b71..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/fa/c03f2c5139618d87d53614c153823bf1f31396 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/fa/da9356aa3f74622327a3038ae9c6f92e1c5c1d b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/fa/da9356aa3f74622327a3038ae9c6f92e1c5c1d deleted file mode 100644 index 16ce49a1bc..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/fa/da9356aa3f74622327a3038ae9c6f92e1c5c1d and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/fb/738a106cfd097a4acb96ce132ecb1ad6c46b03 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/fb/738a106cfd097a4acb96ce132ecb1ad6c46b03 deleted file mode 100644 index 4f1e726881..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/fb/738a106cfd097a4acb96ce132ecb1ad6c46b03 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/fc/4c636d6515e9e261f9260dbcf3cc6eca97ea08 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/fc/4c636d6515e9e261f9260dbcf3cc6eca97ea08 deleted file mode 100644 index be8a810cd8..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/fc/4c636d6515e9e261f9260dbcf3cc6eca97ea08 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/fc/7d7b805f7a9428574f4f802b2e34cd20ab9d99 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/fc/7d7b805f7a9428574f4f802b2e34cd20ab9d99 deleted file mode 100644 index 20493e68cb..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/fc/7d7b805f7a9428574f4f802b2e34cd20ab9d99 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/fc/90237dc4891fa6c69827fc465632225e391618 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/fc/90237dc4891fa6c69827fc465632225e391618 deleted file mode 100644 index 961814baeb..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/fc/90237dc4891fa6c69827fc465632225e391618 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/fd/57d2d6770fad8e9959124793a17f441b571e66 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/fd/57d2d6770fad8e9959124793a17f441b571e66 deleted file mode 100644 index 21e6b2c558..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/fd/57d2d6770fad8e9959124793a17f441b571e66 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/fd/89f8cffb663ac89095a0f9764902e93ceaca6a b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/fd/89f8cffb663ac89095a0f9764902e93ceaca6a deleted file mode 100644 index 2f9d83b261..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/fd/89f8cffb663ac89095a0f9764902e93ceaca6a +++ /dev/null @@ -1,2 +0,0 @@ -xĄŽK!D]s -. ˇ{` cÜx/Ŕ§É¸`0 ĆëËoŕ®ęURy±–ňčő|čŤY`ŔdPĚA!±íÜäŚĺ4C2d=x#žľńÚe`Bgr´™uôŕbLÁ‡¬Đf“fG @ţŐ—Úä-˝}KňľÔ˛ŐUžyĐ=]ů;üÚ)Ör‘0 R$ŹĘ(%˛ť˙ĽŮo=×¶›‡OPw \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/fe/5407fc50a53aecb41d1a6e9ea7b612e581af87 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/fe/5407fc50a53aecb41d1a6e9ea7b612e581af87 deleted file mode 100644 index 4ce7d2297b..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/fe/5407fc50a53aecb41d1a6e9ea7b612e581af87 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/ff/49d07869831ad761bbdaea026086f8789bcb00 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/ff/49d07869831ad761bbdaea026086f8789bcb00 deleted file mode 100644 index eada39b77e..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/ff/49d07869831ad761bbdaea026086f8789bcb00 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/ff/b312248d607284c290023f9502eea010d34efd b/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/ff/b312248d607284c290023f9502eea010d34efd deleted file mode 100644 index 7e46c4fe30..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-resolve/.gitted/objects/ff/b312248d607284c290023f9502eea010d34efd and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/branch b/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/branch deleted file mode 100644 index 03f79a3dcf..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/branch +++ /dev/null @@ -1 +0,0 @@ -7cb63eed597130ba4abb87b3e544b85021905520 diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/df_ancestor b/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/df_ancestor deleted file mode 100644 index 4bc37ac606..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/df_ancestor +++ /dev/null @@ -1 +0,0 @@ -2da538570bc1e5b2c3e855bf702f35248ad0735f diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/df_side1 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/df_side1 deleted file mode 100644 index ca6dd679d0..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/df_side1 +++ /dev/null @@ -1 +0,0 @@ -a7dbfcbfc1a60709cb80b5ca24539008456531d0 diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/df_side2 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/df_side2 deleted file mode 100644 index b8160f80eb..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/df_side2 +++ /dev/null @@ -1 +0,0 @@ -fc90237dc4891fa6c69827fc465632225e391618 diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/ff_branch b/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/ff_branch deleted file mode 100644 index e9e90512f9..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/ff_branch +++ /dev/null @@ -1 +0,0 @@ -fd89f8cffb663ac89095a0f9764902e93ceaca6a diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/master b/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/master deleted file mode 100644 index 8a329ae5f7..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/master +++ /dev/null @@ -1 +0,0 @@ -bd593285fc7fe4ca18ccdbabf027f5d689101452 diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/octo1 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/octo1 deleted file mode 100644 index 4d2c669023..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/octo1 +++ /dev/null @@ -1 +0,0 @@ -16f825815cfd20a07a75c71554e82d8eede0b061 diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/octo2 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/octo2 deleted file mode 100644 index f503977a73..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/octo2 +++ /dev/null @@ -1 +0,0 @@ -158dc7bedb202f5b26502bf3574faa7f4238d56c diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/octo3 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/octo3 deleted file mode 100644 index b92994f100..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/octo3 +++ /dev/null @@ -1 +0,0 @@ -50ce7d7d01217679e26c55939eef119e0c93e272 diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/octo4 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/octo4 deleted file mode 100644 index f33d57cbcb..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/octo4 +++ /dev/null @@ -1 +0,0 @@ -54269b3f6ec3d7d4ede24dd350dd5d605495c3ae diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/octo5 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/octo5 deleted file mode 100644 index e9f943385b..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/octo5 +++ /dev/null @@ -1 +0,0 @@ -e4f618a2c3ed0669308735727df5ebf2447f022f diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/octo6 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/octo6 deleted file mode 100644 index 4c5a98ad9c..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/octo6 +++ /dev/null @@ -1 +0,0 @@ -b6f610aef53bd343e6c96227de874c66f00ee8e8 diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/previous b/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/previous deleted file mode 100644 index 7bc1a8d159..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/previous +++ /dev/null @@ -1 +0,0 @@ -c607fc30883e335def28cd686b51f6cfa02b06ec diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/rename_conflict_ancestor b/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/rename_conflict_ancestor deleted file mode 100644 index 4092d428f1..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/rename_conflict_ancestor +++ /dev/null @@ -1 +0,0 @@ -2392a2dacc9efb562b8635d6579fb458751c7c5b diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/rename_conflict_ours b/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/rename_conflict_ours deleted file mode 100644 index a1c50dce8d..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/rename_conflict_ours +++ /dev/null @@ -1 +0,0 @@ -34bfafff88eaf118402b44e6f3e2dbbf1a582b05 diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/rename_conflict_theirs b/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/rename_conflict_theirs deleted file mode 100644 index 130989399e..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/rename_conflict_theirs +++ /dev/null @@ -1 +0,0 @@ -a802e06f1782a9645b9851bc7202cee74a8a4972 diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/renames1 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/renames1 deleted file mode 100644 index 3d248102c3..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/renames1 +++ /dev/null @@ -1 +0,0 @@ -412b32fb66137366147f1801ecc962452757d48a diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/renames2 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/renames2 deleted file mode 100644 index d22621561b..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/renames2 +++ /dev/null @@ -1 +0,0 @@ -ab40af3cb8a3ed2e2843e96d9aa7871336b94573 diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/submodules b/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/submodules deleted file mode 100644 index e5511eca95..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/submodules +++ /dev/null @@ -1 +0,0 @@ -d8dec75ff2f8b41d1c5bfef0cd57b7300c834f66 diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/submodules-branch b/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/submodules-branch deleted file mode 100644 index 7d47e07b88..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/submodules-branch +++ /dev/null @@ -1 +0,0 @@ -811c70fcb6d5bbd022d04cc31836d30b436f9551 diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/submodules-branch2 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/submodules-branch2 deleted file mode 100644 index ced60d8135..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/submodules-branch2 +++ /dev/null @@ -1 +0,0 @@ -7c04ca611203ed320c5f495b9813054dd23be3be diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/trivial-10 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/trivial-10 deleted file mode 100644 index 5b378cd88d..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/trivial-10 +++ /dev/null @@ -1 +0,0 @@ -0ec5f433959cd46177f745903353efb5be08d151 diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/trivial-10-branch b/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/trivial-10-branch deleted file mode 100644 index b3db6c8927..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/trivial-10-branch +++ /dev/null @@ -1 +0,0 @@ -11f4f3c08b737f5fd896cbefa1425ee63b21b2fa diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/trivial-11 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/trivial-11 deleted file mode 100644 index 154de9a641..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/trivial-11 +++ /dev/null @@ -1 +0,0 @@ -3168dca1a561889b045a6441909f4c56145e666d diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/trivial-11-branch b/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/trivial-11-branch deleted file mode 100644 index 2e41180292..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/trivial-11-branch +++ /dev/null @@ -1 +0,0 @@ -6718a45909532d1fcf5600d0877f7fe7e78f0b86 diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/trivial-13 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/trivial-13 deleted file mode 100644 index 297573a576..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/trivial-13 +++ /dev/null @@ -1 +0,0 @@ -a3fabece9eb8748da810e1e08266fef9b7136ad4 diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/trivial-13-branch b/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/trivial-13-branch deleted file mode 100644 index 22e429a616..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/trivial-13-branch +++ /dev/null @@ -1 +0,0 @@ -05f3c1a2a56ca95c3d2ef28dc9ddf32b5cd6c91c diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/trivial-14 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/trivial-14 deleted file mode 100644 index 89051853ae..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/trivial-14 +++ /dev/null @@ -1 +0,0 @@ -7e2d058d5fedf8329db44db4fac610d6b1a89159 diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/trivial-14-branch b/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/trivial-14-branch deleted file mode 100644 index 0158f950c3..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/trivial-14-branch +++ /dev/null @@ -1 +0,0 @@ -8187117062b750eed4f93fd7e899f17b52ce554d diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/trivial-2alt b/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/trivial-2alt deleted file mode 100644 index 474074120c..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/trivial-2alt +++ /dev/null @@ -1 +0,0 @@ -566ab53c220a2eafc1212af1a024513230280ab9 diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/trivial-2alt-branch b/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/trivial-2alt-branch deleted file mode 100644 index 2f5f1a4af0..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/trivial-2alt-branch +++ /dev/null @@ -1 +0,0 @@ -c9174cef549ec94ecbc43ef03cdc775b4950becb diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/trivial-3alt b/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/trivial-3alt deleted file mode 100644 index 18e50ae125..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/trivial-3alt +++ /dev/null @@ -1 +0,0 @@ -4c9fac0707f8d4195037ae5a681aa48626491541 diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/trivial-3alt-branch b/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/trivial-3alt-branch deleted file mode 100644 index 7bc1a8d159..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/trivial-3alt-branch +++ /dev/null @@ -1 +0,0 @@ -c607fc30883e335def28cd686b51f6cfa02b06ec diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/trivial-4 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/trivial-4 deleted file mode 100644 index f49bbf956e..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/trivial-4 +++ /dev/null @@ -1 +0,0 @@ -cc3e3009134cb88014129fc8858d1101359e5e2f diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/trivial-4-branch b/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/trivial-4-branch deleted file mode 100644 index bff519ef18..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/trivial-4-branch +++ /dev/null @@ -1 +0,0 @@ -183310e30fb1499af8c619108ffea4d300b5e778 diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/trivial-5alt-1 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/trivial-5alt-1 deleted file mode 100644 index 963a7b3362..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/trivial-5alt-1 +++ /dev/null @@ -1 +0,0 @@ -4fe93c0ec83eb6305cbace3dace88ecee1b63cb6 diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/trivial-5alt-1-branch b/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/trivial-5alt-1-branch deleted file mode 100644 index 4a22138e75..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/trivial-5alt-1-branch +++ /dev/null @@ -1 +0,0 @@ -478172cb2f5ff9b514bc9d04d3bd5ef5840cb3b2 diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/trivial-5alt-2 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/trivial-5alt-2 deleted file mode 100644 index aa4ada17e9..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/trivial-5alt-2 +++ /dev/null @@ -1 +0,0 @@ -3b47b031b3e55ae11e14a05260b1c3ffd6838d55 diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/trivial-5alt-2-branch b/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/trivial-5alt-2-branch deleted file mode 100644 index 5553cdba10..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/trivial-5alt-2-branch +++ /dev/null @@ -1 +0,0 @@ -f48097eb340dc5a7cae55aabcf1faf4548aa821f diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/trivial-6 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/trivial-6 deleted file mode 100644 index fb685bb631..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/trivial-6 +++ /dev/null @@ -1 +0,0 @@ -99b4f7e4f24470fa06b980bc21f1095c2a9425c0 diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/trivial-6-branch b/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/trivial-6-branch deleted file mode 100644 index efc4c55ac4..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/trivial-6-branch +++ /dev/null @@ -1 +0,0 @@ -a43150a738849c59376cf30bb2a68348a83c8f48 diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/trivial-7 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/trivial-7 deleted file mode 100644 index 9c9424346a..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/trivial-7 +++ /dev/null @@ -1 +0,0 @@ -d874671ef5b20184836cb983bb273e5280384d0b diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/trivial-7-branch b/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/trivial-7-branch deleted file mode 100644 index 1762bb5dbc..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/trivial-7-branch +++ /dev/null @@ -1 +0,0 @@ -5195a1b480f66691b667f10a9e41e70115a78351 diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/trivial-8 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/trivial-8 deleted file mode 100644 index 837c4915a8..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/trivial-8 +++ /dev/null @@ -1 +0,0 @@ -3575826c96a975031d2c14368529cc5c4353a8fd diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/trivial-8-branch b/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/trivial-8-branch deleted file mode 100644 index 874230eff3..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/trivial-8-branch +++ /dev/null @@ -1 +0,0 @@ -52d8bc572af2b6d4ee0d5e62ed5d1fbad92210a9 diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/trivial-9 b/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/trivial-9 deleted file mode 100644 index b968a3efbc..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/trivial-9 +++ /dev/null @@ -1 +0,0 @@ -c35dee9bcc0e989f3b0c40f68372a9a51b6c4e6a diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/trivial-9-branch b/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/trivial-9-branch deleted file mode 100644 index 7f3097b697..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/trivial-9-branch +++ /dev/null @@ -1 +0,0 @@ -13d1be4ea52a6ced1d7a1d832f0ee3c399348e5e diff --git a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/unrelated b/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/unrelated deleted file mode 100644 index bb877be2e6..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/.gitted/refs/heads/unrelated +++ /dev/null @@ -1 +0,0 @@ -55b4e4687e7a0d9ca367016ed930f385d4022e6f diff --git a/vendor/libgit2/tests/resources/merge-resolve/added-in-master.txt b/vendor/libgit2/tests/resources/merge-resolve/added-in-master.txt deleted file mode 100644 index 233c0919c9..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/added-in-master.txt +++ /dev/null @@ -1 +0,0 @@ -this file is added in master diff --git a/vendor/libgit2/tests/resources/merge-resolve/automergeable.txt b/vendor/libgit2/tests/resources/merge-resolve/automergeable.txt deleted file mode 100644 index ee3fa1b8c0..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/automergeable.txt +++ /dev/null @@ -1,9 +0,0 @@ -this file is changed in master -this file is automergeable -this file is automergeable -this file is automergeable -this file is automergeable -this file is automergeable -this file is automergeable -this file is automergeable -this file is automergeable diff --git a/vendor/libgit2/tests/resources/merge-resolve/changed-in-branch.txt b/vendor/libgit2/tests/resources/merge-resolve/changed-in-branch.txt deleted file mode 100644 index ab6c44a2e8..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/changed-in-branch.txt +++ /dev/null @@ -1 +0,0 @@ -initial revision diff --git a/vendor/libgit2/tests/resources/merge-resolve/changed-in-master.txt b/vendor/libgit2/tests/resources/merge-resolve/changed-in-master.txt deleted file mode 100644 index 11deab00b2..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/changed-in-master.txt +++ /dev/null @@ -1 +0,0 @@ -changed in master diff --git a/vendor/libgit2/tests/resources/merge-resolve/conflicting.txt b/vendor/libgit2/tests/resources/merge-resolve/conflicting.txt deleted file mode 100644 index 4e886e6025..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/conflicting.txt +++ /dev/null @@ -1 +0,0 @@ -this file is changed in master and branch diff --git a/vendor/libgit2/tests/resources/merge-resolve/removed-in-branch.txt b/vendor/libgit2/tests/resources/merge-resolve/removed-in-branch.txt deleted file mode 100644 index dfe3f22baa..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/removed-in-branch.txt +++ /dev/null @@ -1 +0,0 @@ -this is removed in branch diff --git a/vendor/libgit2/tests/resources/merge-resolve/unchanged.txt b/vendor/libgit2/tests/resources/merge-resolve/unchanged.txt deleted file mode 100644 index c8f06f2e3b..0000000000 --- a/vendor/libgit2/tests/resources/merge-resolve/unchanged.txt +++ /dev/null @@ -1 +0,0 @@ -this file is unchanged in both diff --git a/vendor/libgit2/tests/resources/merge-whitespace/.gitted/HEAD b/vendor/libgit2/tests/resources/merge-whitespace/.gitted/HEAD deleted file mode 100644 index cb089cd89a..0000000000 --- a/vendor/libgit2/tests/resources/merge-whitespace/.gitted/HEAD +++ /dev/null @@ -1 +0,0 @@ -ref: refs/heads/master diff --git a/vendor/libgit2/tests/resources/merge-whitespace/.gitted/config b/vendor/libgit2/tests/resources/merge-whitespace/.gitted/config deleted file mode 100644 index 6c9406b7d9..0000000000 --- a/vendor/libgit2/tests/resources/merge-whitespace/.gitted/config +++ /dev/null @@ -1,7 +0,0 @@ -[core] - repositoryformatversion = 0 - filemode = true - bare = false - logallrefupdates = true - ignorecase = true - precomposeunicode = true diff --git a/vendor/libgit2/tests/resources/merge-whitespace/.gitted/index b/vendor/libgit2/tests/resources/merge-whitespace/.gitted/index deleted file mode 100644 index 534804af20..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-whitespace/.gitted/index and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/01/bd650462136a4f0a266dfc91ab93b3fef0f7cb b/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/01/bd650462136a4f0a266dfc91ab93b3fef0f7cb deleted file mode 100644 index 074a77abf1..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/01/bd650462136a4f0a266dfc91ab93b3fef0f7cb and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/08/3f868fb4324e32a4999173b2437b31d7a1ef25 b/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/08/3f868fb4324e32a4999173b2437b31d7a1ef25 deleted file mode 100644 index ec6ed4d4cb..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/08/3f868fb4324e32a4999173b2437b31d7a1ef25 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/0a/a2acaa63cacc7a99fab0c2ce3d56572911df19 b/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/0a/a2acaa63cacc7a99fab0c2ce3d56572911df19 deleted file mode 100644 index a2178ceab7..0000000000 --- a/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/0a/a2acaa63cacc7a99fab0c2ce3d56572911df19 +++ /dev/null @@ -1 +0,0 @@ -xťÍA @Qלbö&f€R!1ĆťŃ[Lq°b#LŢŢ&z·ń~śKÉ:ŕF*3gşžâ€¨˝ó)qJZ&Bş™¤{;xk-2ή_ 78s-ąŤË»Ááńm÷S“šIhçrÝĽ·ÎĂ ˘Zëşţq{űCÔĺ™%Ó¤>4˙?« \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/11/89e10a62aadf2fea8cd018afb52c1980f40b4f b/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/11/89e10a62aadf2fea8cd018afb52c1980f40b4f deleted file mode 100644 index f9f59840e2..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/11/89e10a62aadf2fea8cd018afb52c1980f40b4f and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/24/2c8f6cf388e96e2c12b6e49cb7ae60167cba1e b/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/24/2c8f6cf388e96e2c12b6e49cb7ae60167cba1e deleted file mode 100644 index 7cfc318ed3..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/24/2c8f6cf388e96e2c12b6e49cb7ae60167cba1e and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/25/246acb001858ffeffb03ea399fd2c0a163b832 b/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/25/246acb001858ffeffb03ea399fd2c0a163b832 deleted file mode 100644 index f7160ce446..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/25/246acb001858ffeffb03ea399fd2c0a163b832 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/26/2f67de0de2e535a59ae1bc3c739601e98c354d b/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/26/2f67de0de2e535a59ae1bc3c739601e98c354d deleted file mode 100644 index c5a33b4b45..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/26/2f67de0de2e535a59ae1bc3c739601e98c354d and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/2f/6727d2e570bf962d9dd926423cf6fe5072071a b/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/2f/6727d2e570bf962d9dd926423cf6fe5072071a deleted file mode 100644 index 02bb788e5e..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/2f/6727d2e570bf962d9dd926423cf6fe5072071a and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/3c/43e7fc2a56fc825c31dfee65abd6dda8d16dca b/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/3c/43e7fc2a56fc825c31dfee65abd6dda8d16dca deleted file mode 100644 index 0ec95b5c21..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/3c/43e7fc2a56fc825c31dfee65abd6dda8d16dca and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/40/26a6c83f39c56881c9ac62e7582db9e3d33a4f b/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/40/26a6c83f39c56881c9ac62e7582db9e3d33a4f deleted file mode 100644 index 50bdfc543c..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/40/26a6c83f39c56881c9ac62e7582db9e3d33a4f and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/42/dabb8d5dba2de103815a77e4369bb3966e64ef b/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/42/dabb8d5dba2de103815a77e4369bb3966e64ef deleted file mode 100644 index ae6dab79ab..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/42/dabb8d5dba2de103815a77e4369bb3966e64ef and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/43/9230587f2eb38e9540a5c99e9831f65641eab9 b/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/43/9230587f2eb38e9540a5c99e9831f65641eab9 deleted file mode 100644 index 1b6354db85..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/43/9230587f2eb38e9540a5c99e9831f65641eab9 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/43/ad73e75e15f03bb0b4398a48a57ecfc20788e2 b/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/43/ad73e75e15f03bb0b4398a48a57ecfc20788e2 deleted file mode 100644 index 1936bc34a0..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/43/ad73e75e15f03bb0b4398a48a57ecfc20788e2 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee4904 b/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee4904 deleted file mode 100644 index adf64119a3..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee4904 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/54/74989173042512ab630191ad71cdcedb646b9a b/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/54/74989173042512ab630191ad71cdcedb646b9a deleted file mode 100644 index cf12d4d960..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/54/74989173042512ab630191ad71cdcedb646b9a and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/5e/fb9bc29c482e023e40e0a2b3b7e49cec842034 b/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/5e/fb9bc29c482e023e40e0a2b3b7e49cec842034 deleted file mode 100644 index d615c02a6b..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/5e/fb9bc29c482e023e40e0a2b3b7e49cec842034 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/70/d3d2e7d51a18fcc6f035a67e5c3f33069be04d b/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/70/d3d2e7d51a18fcc6f035a67e5c3f33069be04d deleted file mode 100644 index 1718878a71..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/70/d3d2e7d51a18fcc6f035a67e5c3f33069be04d and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/74/e83b6c5df14f1fba7c4ea1f99c6d007b591002 b/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/74/e83b6c5df14f1fba7c4ea1f99c6d007b591002 deleted file mode 100644 index 779e1bcb3e..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/74/e83b6c5df14f1fba7c4ea1f99c6d007b591002 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/77/f40c621ceae77ad8d756ef507bdbafe2713aa7 b/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/77/f40c621ceae77ad8d756ef507bdbafe2713aa7 deleted file mode 100644 index f2efa93be2..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/77/f40c621ceae77ad8d756ef507bdbafe2713aa7 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/9c/5362069759fb37ae036cef6e4b2f95c6c5eaab b/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/9c/5362069759fb37ae036cef6e4b2f95c6c5eaab deleted file mode 100644 index cc6ad103d6..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/9c/5362069759fb37ae036cef6e4b2f95c6c5eaab and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/a2/9e7dabd68dfb38a717e6b1648713cd5c7adee2 b/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/a2/9e7dabd68dfb38a717e6b1648713cd5c7adee2 deleted file mode 100644 index 6e034377f0..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/a2/9e7dabd68dfb38a717e6b1648713cd5c7adee2 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/a4/e6a86e07ef5afe036e26602fbbaa27496d00a9 b/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/a4/e6a86e07ef5afe036e26602fbbaa27496d00a9 deleted file mode 100644 index 95e0d71632..0000000000 --- a/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/a4/e6a86e07ef5afe036e26602fbbaa27496d00a9 +++ /dev/null @@ -1,2 +0,0 @@ -xĄŹMJÄ@…]÷)j7 A:Ý]ý"îÁ3 U5Ő“I´ÓYx{#Ł'pőŕ㽞¬ó‘ZEkÔŔ®”(¨Dü×çŞA łEŞÎňP‚ĂŠkô!äXs í}\Ľ’|îşÁ‹¶yÚĆýkÇ÷»>o˝MÔéAÖů †ϱLî­łÖô¸Öő_ó¦íŞŔŤátË3ź`Zúú‹Ďdľ“AeĎ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/a8/27eab4fd66ab37a6ebcfaa7b7e341abfd55947 b/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/a8/27eab4fd66ab37a6ebcfaa7b7e341abfd55947 deleted file mode 100644 index fe2bdf4929..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/a8/27eab4fd66ab37a6ebcfaa7b7e341abfd55947 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/a9/66acc271e50b5d4595911752a77def0a5e5d40 b/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/a9/66acc271e50b5d4595911752a77def0a5e5d40 deleted file mode 100644 index cd6f64d6fa..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/a9/66acc271e50b5d4595911752a77def0a5e5d40 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/b2/a69114f4897109fedf1aafea363cb2d2557029 b/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/b2/a69114f4897109fedf1aafea363cb2d2557029 deleted file mode 100644 index b95a7be74f..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/b2/a69114f4897109fedf1aafea363cb2d2557029 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/bc/83ac0422ba1082c80e406234910377984cfbb6 b/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/bc/83ac0422ba1082c80e406234910377984cfbb6 deleted file mode 100644 index 0ea77e8162..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/bc/83ac0422ba1082c80e406234910377984cfbb6 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/bf/e4ea5805af22a5b194259bda6f5f634486f891 b/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/bf/e4ea5805af22a5b194259bda6f5f634486f891 deleted file mode 100644 index a27169e8f7..0000000000 --- a/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/bf/e4ea5805af22a5b194259bda6f5f634486f891 +++ /dev/null @@ -1 +0,0 @@ -xĄŹMjĂ0F»Ö)f’lýA)%›B/Đőx4®°•Jcho_‡!Ű÷ŕă}T×µX?ľHc´‰CĆ)űçiL`??Ć`ĘŽff«nŘxĐ Ń„t¸”fś4Yâ!;ď‚MĆäŮ$…»,µÁ'ŇĎÎ>¸­Ą/ű_‡×ë}żwiĎT×70Łu)FďF8i«µ:č‘*üÔúZŠpż!1Ěĺ÷(Á-ŐMîoęőzX \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/c3/b1fb31424c98072542cc8e42b48c92e52f494a b/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/c3/b1fb31424c98072542cc8e42b48c92e52f494a deleted file mode 100644 index 4006460e8f..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/c3/b1fb31424c98072542cc8e42b48c92e52f494a and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/c7/e2f386736445936f5ba181269a0e0967e280e8 b/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/c7/e2f386736445936f5ba181269a0e0967e280e8 deleted file mode 100644 index 821336f20d..0000000000 --- a/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/c7/e2f386736445936f5ba181269a0e0967e280e8 +++ /dev/null @@ -1,2 +0,0 @@ -xĄŹAjĂ0E»Ö)f—EˇČ’FA)Ů -=CQF± ¶Y^ôöMI{‚®><>^Yçyęŕ‡řĐ›*Ďçä5ˇX­±|&Ä´Ôâl"Rg>ąéŇ!ôŃŮć*>±Z‹Ö¨A\ÍXbAe–żżT ĘHą:Ç(Cłś9V¬Ń‡@±R ď}\ĽqąîşÁ«¶yÚĆýkçŹ;»·Ţ&îüTÖů†ˇ…Gë¬57zKëú/‰y×vQĆKápß“`Zúú‹Olľ$eĹ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/d9/5182053c31f8aa09df4fa225f4e668c5320b59 b/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/d9/5182053c31f8aa09df4fa225f4e668c5320b59 deleted file mode 100644 index 6b9483a5cd..0000000000 --- a/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/d9/5182053c31f8aa09df4fa225f4e668c5320b59 +++ /dev/null @@ -1,5 +0,0 @@ -xĄÎM -Â0@a×9Ĺě™$M›€®/ŕz:™Ř -ý1IŢ^Á#¸ýŹÇË4ŤŚł»šE ĂhŁ‘.:MÚ'ć6ˇuÔvâŘ&k± ˝`ŐJYć -Zű ©5D1™$ä9˘ö”zgXŹ©ÁľIж:,nÄŻM -\%Oc¶wăógŹs©y¤J^¦čƸŕCç,ěŃ ŞŻ~W«üQ÷a¬RVbh~,3\ÔgäRý \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391 b/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391 deleted file mode 100644 index 7112238943..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/ec/5a35c75b8d3ee29bed37996b14e909d04fdcee b/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/ec/5a35c75b8d3ee29bed37996b14e909d04fdcee deleted file mode 100644 index d7fc301d87..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/ec/5a35c75b8d3ee29bed37996b14e909d04fdcee and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/ee/3c2aac8e03224c323b58ecb1f9eef616745467 b/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/ee/3c2aac8e03224c323b58ecb1f9eef616745467 deleted file mode 100644 index 1acec06a6b..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/ee/3c2aac8e03224c323b58ecb1f9eef616745467 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/ef/e94a4bf4e697f7f0270f0d1b8a93af784a19d0 b/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/ef/e94a4bf4e697f7f0270f0d1b8a93af784a19d0 deleted file mode 100644 index ca5af406bb..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/ef/e94a4bf4e697f7f0270f0d1b8a93af784a19d0 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/f0/0c965d8307308469e537302baa73048488f162 b/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/f0/0c965d8307308469e537302baa73048488f162 deleted file mode 100644 index 343037e77e..0000000000 Binary files a/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/f0/0c965d8307308469e537302baa73048488f162 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/f1/90a0d111ca1688778657798743ddfb4ed4bd64 b/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/f1/90a0d111ca1688778657798743ddfb4ed4bd64 deleted file mode 100644 index 4e2291208b..0000000000 --- a/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/f1/90a0d111ca1688778657798743ddfb4ed4bd64 +++ /dev/null @@ -1,2 +0,0 @@ -xĄÎM -Â0@a×9Eö‚äoš .o1I¦Z!Ť¦éÂŰ[đnżĹăĄZĘÔĄ±a׳äd!y![f‘łőCÔŽQaVn̉YĽ¨ńÜ%á0PJĆk!;@@­=ň>ó¨xS%híŹÚäŤŇ{ĺE^ą•iy¬źEź?»ź—Ţ&ętHµś¤v0g¬Ü+Ł”Řt[íüWD\ęÜ·qńĂMŘ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/f4/9b2c244e9d3b0647fdfb95954c38fbfeecf3ad b/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/f4/9b2c244e9d3b0647fdfb95954c38fbfeecf3ad deleted file mode 100644 index 437f667f56..0000000000 --- a/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/f4/9b2c244e9d3b0647fdfb95954c38fbfeecf3ad +++ /dev/null @@ -1,2 +0,0 @@ -xĄÍ= -1@aëśbzAf‡Iś€ťŕ-’ě¬!,ć§đö.xŰŻx/mĄä“СWUŕ(dçäRt}@‡j9.2;O"KTeŹlÂčëVáŇ{h»Ö’Ű:> .Żź=o­×z8Ą­\ab˛^ÄžŽHf×}ÝőŻůR<ě \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/f8/7905f99f0e66d179a8379d8ca4d8cbbd32c231 b/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/f8/7905f99f0e66d179a8379d8ca4d8cbbd32c231 deleted file mode 100644 index d568dc1e94..0000000000 --- a/vendor/libgit2/tests/resources/merge-whitespace/.gitted/objects/f8/7905f99f0e66d179a8379d8ca4d8cbbd32c231 +++ /dev/null @@ -1 +0,0 @@ -xĄŹKjÄ0Dłö)´›E tëg5„0»@ g0-©e;`;#Ë‹Ü>†™ś «‚WEQ•¶e™›2žZQÎö–aoŔj‡šŁ7€„ś{L9IŽŢúHÜ}s•µ©Lg’Ár±…µvĹŠ÷!9Ł!:úËGÍžm±z*’ 2aăMŠ:kçzĐÔńѦ­ŞN·Cvő.u™÷éřŮŐëםŤ×˝Ő™ż¤mySxî=—ăŐ3h€î¤çµ&˙*é>ĄŽ˘bĺ5Męr×!iâu”‹š×¶=Ü´ű´Äiŕ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/merge-whitespace/.gitted/refs/heads/branch_a_change b/vendor/libgit2/tests/resources/merge-whitespace/.gitted/refs/heads/branch_a_change deleted file mode 100644 index 3a46eff10f..0000000000 --- a/vendor/libgit2/tests/resources/merge-whitespace/.gitted/refs/heads/branch_a_change +++ /dev/null @@ -1 +0,0 @@ -d95182053c31f8aa09df4fa225f4e668c5320b59 diff --git a/vendor/libgit2/tests/resources/merge-whitespace/.gitted/refs/heads/branch_a_eol b/vendor/libgit2/tests/resources/merge-whitespace/.gitted/refs/heads/branch_a_eol deleted file mode 100644 index a59d5b534a..0000000000 --- a/vendor/libgit2/tests/resources/merge-whitespace/.gitted/refs/heads/branch_a_eol +++ /dev/null @@ -1 +0,0 @@ -9c5362069759fb37ae036cef6e4b2f95c6c5eaab diff --git a/vendor/libgit2/tests/resources/merge-whitespace/.gitted/refs/heads/branch_b_change b/vendor/libgit2/tests/resources/merge-whitespace/.gitted/refs/heads/branch_b_change deleted file mode 100644 index c14ced31e1..0000000000 --- a/vendor/libgit2/tests/resources/merge-whitespace/.gitted/refs/heads/branch_b_change +++ /dev/null @@ -1 +0,0 @@ -b2a69114f4897109fedf1aafea363cb2d2557029 diff --git a/vendor/libgit2/tests/resources/merge-whitespace/.gitted/refs/heads/branch_b_eol b/vendor/libgit2/tests/resources/merge-whitespace/.gitted/refs/heads/branch_b_eol deleted file mode 100644 index 9e25c6e29c..0000000000 --- a/vendor/libgit2/tests/resources/merge-whitespace/.gitted/refs/heads/branch_b_eol +++ /dev/null @@ -1 +0,0 @@ -bfe4ea5805af22a5b194259bda6f5f634486f891 diff --git a/vendor/libgit2/tests/resources/merge-whitespace/.gitted/refs/heads/master b/vendor/libgit2/tests/resources/merge-whitespace/.gitted/refs/heads/master deleted file mode 100644 index 61e8ae782a..0000000000 --- a/vendor/libgit2/tests/resources/merge-whitespace/.gitted/refs/heads/master +++ /dev/null @@ -1 +0,0 @@ -1189e10a62aadf2fea8cd018afb52c1980f40b4f diff --git a/vendor/libgit2/tests/resources/merge-whitespace/test.txt b/vendor/libgit2/tests/resources/merge-whitespace/test.txt deleted file mode 100644 index 74e83b6c5d..0000000000 --- a/vendor/libgit2/tests/resources/merge-whitespace/test.txt +++ /dev/null @@ -1,11 +0,0 @@ -0 -1 -2 -3 -4 -5 XXX -6 -7 -8 -9 -10 diff --git a/vendor/libgit2/tests/resources/mergedrepo/.gitted/COMMIT_EDITMSG b/vendor/libgit2/tests/resources/mergedrepo/.gitted/COMMIT_EDITMSG deleted file mode 100644 index 1f7391f92b..0000000000 --- a/vendor/libgit2/tests/resources/mergedrepo/.gitted/COMMIT_EDITMSG +++ /dev/null @@ -1 +0,0 @@ -master diff --git a/vendor/libgit2/tests/resources/mergedrepo/.gitted/HEAD b/vendor/libgit2/tests/resources/mergedrepo/.gitted/HEAD deleted file mode 100644 index cb089cd89a..0000000000 --- a/vendor/libgit2/tests/resources/mergedrepo/.gitted/HEAD +++ /dev/null @@ -1 +0,0 @@ -ref: refs/heads/master diff --git a/vendor/libgit2/tests/resources/mergedrepo/.gitted/MERGE_HEAD b/vendor/libgit2/tests/resources/mergedrepo/.gitted/MERGE_HEAD deleted file mode 100644 index a5bdf6e40c..0000000000 --- a/vendor/libgit2/tests/resources/mergedrepo/.gitted/MERGE_HEAD +++ /dev/null @@ -1 +0,0 @@ -e2809157a7766f272e4cfe26e61ef2678a5357ff diff --git a/vendor/libgit2/tests/resources/mergedrepo/.gitted/MERGE_MODE b/vendor/libgit2/tests/resources/mergedrepo/.gitted/MERGE_MODE deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/vendor/libgit2/tests/resources/mergedrepo/.gitted/MERGE_MSG b/vendor/libgit2/tests/resources/mergedrepo/.gitted/MERGE_MSG deleted file mode 100644 index 7c4d1f5a9b..0000000000 --- a/vendor/libgit2/tests/resources/mergedrepo/.gitted/MERGE_MSG +++ /dev/null @@ -1,5 +0,0 @@ -Merge branch 'branch' - -Conflicts: - conflicts-one.txt - conflicts-two.txt diff --git a/vendor/libgit2/tests/resources/mergedrepo/.gitted/ORIG_HEAD b/vendor/libgit2/tests/resources/mergedrepo/.gitted/ORIG_HEAD deleted file mode 100644 index 13d4d6721d..0000000000 --- a/vendor/libgit2/tests/resources/mergedrepo/.gitted/ORIG_HEAD +++ /dev/null @@ -1 +0,0 @@ -3a34580a35add43a4cf361e8e9a30060a905c876 diff --git a/vendor/libgit2/tests/resources/mergedrepo/.gitted/config b/vendor/libgit2/tests/resources/mergedrepo/.gitted/config deleted file mode 100644 index af107929f2..0000000000 --- a/vendor/libgit2/tests/resources/mergedrepo/.gitted/config +++ /dev/null @@ -1,6 +0,0 @@ -[core] - repositoryformatversion = 0 - filemode = true - bare = false - logallrefupdates = true - ignorecase = true diff --git a/vendor/libgit2/tests/resources/mergedrepo/.gitted/description b/vendor/libgit2/tests/resources/mergedrepo/.gitted/description deleted file mode 100644 index 498b267a8c..0000000000 --- a/vendor/libgit2/tests/resources/mergedrepo/.gitted/description +++ /dev/null @@ -1 +0,0 @@ -Unnamed repository; edit this file 'description' to name the repository. diff --git a/vendor/libgit2/tests/resources/mergedrepo/.gitted/index b/vendor/libgit2/tests/resources/mergedrepo/.gitted/index deleted file mode 100644 index 3d29f78e7e..0000000000 Binary files a/vendor/libgit2/tests/resources/mergedrepo/.gitted/index and /dev/null differ diff --git a/vendor/libgit2/tests/resources/mergedrepo/.gitted/info/exclude b/vendor/libgit2/tests/resources/mergedrepo/.gitted/info/exclude deleted file mode 100644 index a5196d1be8..0000000000 --- a/vendor/libgit2/tests/resources/mergedrepo/.gitted/info/exclude +++ /dev/null @@ -1,6 +0,0 @@ -# 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/vendor/libgit2/tests/resources/mergedrepo/.gitted/logs/HEAD b/vendor/libgit2/tests/resources/mergedrepo/.gitted/logs/HEAD deleted file mode 100644 index a385da67b6..0000000000 --- a/vendor/libgit2/tests/resources/mergedrepo/.gitted/logs/HEAD +++ /dev/null @@ -1,5 +0,0 @@ -0000000000000000000000000000000000000000 9a05ccb4e0f948de03128e095f39dae6976751c5 Edward Thomson 1351371828 -0500 commit (initial): initial -9a05ccb4e0f948de03128e095f39dae6976751c5 9a05ccb4e0f948de03128e095f39dae6976751c5 Edward Thomson 1351371835 -0500 checkout: moving from master to branch -9a05ccb4e0f948de03128e095f39dae6976751c5 e2809157a7766f272e4cfe26e61ef2678a5357ff Edward Thomson 1351371872 -0500 commit: branch -e2809157a7766f272e4cfe26e61ef2678a5357ff 9a05ccb4e0f948de03128e095f39dae6976751c5 Edward Thomson 1351371873 -0500 checkout: moving from branch to master -9a05ccb4e0f948de03128e095f39dae6976751c5 3a34580a35add43a4cf361e8e9a30060a905c876 Edward Thomson 1351372106 -0500 commit: master diff --git a/vendor/libgit2/tests/resources/mergedrepo/.gitted/logs/refs/heads/branch b/vendor/libgit2/tests/resources/mergedrepo/.gitted/logs/refs/heads/branch deleted file mode 100644 index 26a5e8dc50..0000000000 --- a/vendor/libgit2/tests/resources/mergedrepo/.gitted/logs/refs/heads/branch +++ /dev/null @@ -1,2 +0,0 @@ -0000000000000000000000000000000000000000 9a05ccb4e0f948de03128e095f39dae6976751c5 Edward Thomson 1351371835 -0500 branch: Created from HEAD -9a05ccb4e0f948de03128e095f39dae6976751c5 e2809157a7766f272e4cfe26e61ef2678a5357ff Edward Thomson 1351371872 -0500 commit: branch diff --git a/vendor/libgit2/tests/resources/mergedrepo/.gitted/logs/refs/heads/master b/vendor/libgit2/tests/resources/mergedrepo/.gitted/logs/refs/heads/master deleted file mode 100644 index 425f7bd89a..0000000000 --- a/vendor/libgit2/tests/resources/mergedrepo/.gitted/logs/refs/heads/master +++ /dev/null @@ -1,2 +0,0 @@ -0000000000000000000000000000000000000000 9a05ccb4e0f948de03128e095f39dae6976751c5 Edward Thomson 1351371828 -0500 commit (initial): initial -9a05ccb4e0f948de03128e095f39dae6976751c5 3a34580a35add43a4cf361e8e9a30060a905c876 Edward Thomson 1351372106 -0500 commit: master diff --git a/vendor/libgit2/tests/resources/mergedrepo/.gitted/objects/03/db1d37504ca0c4f7c26d7776b0e28bdea08712 b/vendor/libgit2/tests/resources/mergedrepo/.gitted/objects/03/db1d37504ca0c4f7c26d7776b0e28bdea08712 deleted file mode 100644 index 9232f79d9f..0000000000 Binary files a/vendor/libgit2/tests/resources/mergedrepo/.gitted/objects/03/db1d37504ca0c4f7c26d7776b0e28bdea08712 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/mergedrepo/.gitted/objects/17/0efc1023e0ed2390150bb4469c8456b63e8f91 b/vendor/libgit2/tests/resources/mergedrepo/.gitted/objects/17/0efc1023e0ed2390150bb4469c8456b63e8f91 deleted file mode 100644 index 3e124d9a45..0000000000 Binary files a/vendor/libgit2/tests/resources/mergedrepo/.gitted/objects/17/0efc1023e0ed2390150bb4469c8456b63e8f91 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/mergedrepo/.gitted/objects/1f/85ca51b8e0aac893a621b61a9c2661d6aa6d81 b/vendor/libgit2/tests/resources/mergedrepo/.gitted/objects/1f/85ca51b8e0aac893a621b61a9c2661d6aa6d81 deleted file mode 100644 index 7bb19c8738..0000000000 Binary files a/vendor/libgit2/tests/resources/mergedrepo/.gitted/objects/1f/85ca51b8e0aac893a621b61a9c2661d6aa6d81 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/mergedrepo/.gitted/objects/22/0bd62631c8cf7a83ef39c6b94595f00517211e b/vendor/libgit2/tests/resources/mergedrepo/.gitted/objects/22/0bd62631c8cf7a83ef39c6b94595f00517211e deleted file mode 100644 index 487bcffb1b..0000000000 Binary files a/vendor/libgit2/tests/resources/mergedrepo/.gitted/objects/22/0bd62631c8cf7a83ef39c6b94595f00517211e and /dev/null differ diff --git a/vendor/libgit2/tests/resources/mergedrepo/.gitted/objects/32/d55d59265db86dd690f0a7fc563db43e2bc6a6 b/vendor/libgit2/tests/resources/mergedrepo/.gitted/objects/32/d55d59265db86dd690f0a7fc563db43e2bc6a6 deleted file mode 100644 index 2eb3954fc2..0000000000 Binary files a/vendor/libgit2/tests/resources/mergedrepo/.gitted/objects/32/d55d59265db86dd690f0a7fc563db43e2bc6a6 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/mergedrepo/.gitted/objects/38/e2d82b9065a237904af4b780b4d68da6950534 b/vendor/libgit2/tests/resources/mergedrepo/.gitted/objects/38/e2d82b9065a237904af4b780b4d68da6950534 deleted file mode 100644 index ebe83ccb26..0000000000 Binary files a/vendor/libgit2/tests/resources/mergedrepo/.gitted/objects/38/e2d82b9065a237904af4b780b4d68da6950534 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/mergedrepo/.gitted/objects/3a/34580a35add43a4cf361e8e9a30060a905c876 b/vendor/libgit2/tests/resources/mergedrepo/.gitted/objects/3a/34580a35add43a4cf361e8e9a30060a905c876 deleted file mode 100644 index 0d4095ffc7..0000000000 --- a/vendor/libgit2/tests/resources/mergedrepo/.gitted/objects/3a/34580a35add43a4cf361e8e9a30060a905c876 +++ /dev/null @@ -1,2 +0,0 @@ -xĄŽK -1D]ç}ĄóíDÜx/Oă"F2Żooŕ®ę<*·Zo”‘»Ń™uI˛h˛hrÄlĘĘ"r YůT8˘'©Ä#vľmÎÉ0.Ář¨ĄňŚÁ.:”Č.#+łń9ÖÖáR^±¸®­níGžô“Îü~í[=ÔVjRěŃ"ŠIçŮÁjDŤŰ”7|N` \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/mergedrepo/.gitted/objects/44/58b8bc9e72b6c8755ae456f60e9844d0538d8c b/vendor/libgit2/tests/resources/mergedrepo/.gitted/objects/44/58b8bc9e72b6c8755ae456f60e9844d0538d8c deleted file mode 100644 index 33389c3027..0000000000 Binary files a/vendor/libgit2/tests/resources/mergedrepo/.gitted/objects/44/58b8bc9e72b6c8755ae456f60e9844d0538d8c and /dev/null differ diff --git a/vendor/libgit2/tests/resources/mergedrepo/.gitted/objects/47/8871385b9cd03908c5383acfd568bef023c6b3 b/vendor/libgit2/tests/resources/mergedrepo/.gitted/objects/47/8871385b9cd03908c5383acfd568bef023c6b3 deleted file mode 100644 index 5361ea685f..0000000000 Binary files a/vendor/libgit2/tests/resources/mergedrepo/.gitted/objects/47/8871385b9cd03908c5383acfd568bef023c6b3 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/mergedrepo/.gitted/objects/51/6bd85f78061e09ccc714561d7b504672cb52da b/vendor/libgit2/tests/resources/mergedrepo/.gitted/objects/51/6bd85f78061e09ccc714561d7b504672cb52da deleted file mode 100644 index a60da877cb..0000000000 Binary files a/vendor/libgit2/tests/resources/mergedrepo/.gitted/objects/51/6bd85f78061e09ccc714561d7b504672cb52da and /dev/null differ diff --git a/vendor/libgit2/tests/resources/mergedrepo/.gitted/objects/53/c1d95a01f4514b162066fc98564500c96c46ad b/vendor/libgit2/tests/resources/mergedrepo/.gitted/objects/53/c1d95a01f4514b162066fc98564500c96c46ad deleted file mode 100644 index 85e84d71ef..0000000000 Binary files a/vendor/libgit2/tests/resources/mergedrepo/.gitted/objects/53/c1d95a01f4514b162066fc98564500c96c46ad and /dev/null differ diff --git a/vendor/libgit2/tests/resources/mergedrepo/.gitted/objects/6a/ea5f295304c36144ad6e9247a291b7f8112399 b/vendor/libgit2/tests/resources/mergedrepo/.gitted/objects/6a/ea5f295304c36144ad6e9247a291b7f8112399 deleted file mode 100644 index b16b521e6e..0000000000 Binary files a/vendor/libgit2/tests/resources/mergedrepo/.gitted/objects/6a/ea5f295304c36144ad6e9247a291b7f8112399 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/mergedrepo/.gitted/objects/70/68e30a7f0090ae32db35dfa1e4189d8780fcb8 b/vendor/libgit2/tests/resources/mergedrepo/.gitted/objects/70/68e30a7f0090ae32db35dfa1e4189d8780fcb8 deleted file mode 100644 index 7c4e85ffb0..0000000000 Binary files a/vendor/libgit2/tests/resources/mergedrepo/.gitted/objects/70/68e30a7f0090ae32db35dfa1e4189d8780fcb8 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/mergedrepo/.gitted/objects/75/938de1e367098b3e9a7b1ec3c4ac4548afffe4 b/vendor/libgit2/tests/resources/mergedrepo/.gitted/objects/75/938de1e367098b3e9a7b1ec3c4ac4548afffe4 deleted file mode 100644 index 65173fc4d0..0000000000 Binary files a/vendor/libgit2/tests/resources/mergedrepo/.gitted/objects/75/938de1e367098b3e9a7b1ec3c4ac4548afffe4 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/mergedrepo/.gitted/objects/7b/26923aaf452b1977eb08617c59475fb3f74b71 b/vendor/libgit2/tests/resources/mergedrepo/.gitted/objects/7b/26923aaf452b1977eb08617c59475fb3f74b71 deleted file mode 100644 index 162fa44550..0000000000 Binary files a/vendor/libgit2/tests/resources/mergedrepo/.gitted/objects/7b/26923aaf452b1977eb08617c59475fb3f74b71 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/mergedrepo/.gitted/objects/84/af62840be1b1c47b778a8a249f3ff45155038c b/vendor/libgit2/tests/resources/mergedrepo/.gitted/objects/84/af62840be1b1c47b778a8a249f3ff45155038c deleted file mode 100644 index 77a519f556..0000000000 Binary files a/vendor/libgit2/tests/resources/mergedrepo/.gitted/objects/84/af62840be1b1c47b778a8a249f3ff45155038c and /dev/null differ diff --git a/vendor/libgit2/tests/resources/mergedrepo/.gitted/objects/88/71f7a2ee3addfc4ba39fbd0783c8e738d04cda b/vendor/libgit2/tests/resources/mergedrepo/.gitted/objects/88/71f7a2ee3addfc4ba39fbd0783c8e738d04cda deleted file mode 100644 index f624cd4f1c..0000000000 Binary files a/vendor/libgit2/tests/resources/mergedrepo/.gitted/objects/88/71f7a2ee3addfc4ba39fbd0783c8e738d04cda and /dev/null differ diff --git a/vendor/libgit2/tests/resources/mergedrepo/.gitted/objects/88/7b153b165d32409c70163e0f734c090f12f673 b/vendor/libgit2/tests/resources/mergedrepo/.gitted/objects/88/7b153b165d32409c70163e0f734c090f12f673 deleted file mode 100644 index 096474c036..0000000000 Binary files a/vendor/libgit2/tests/resources/mergedrepo/.gitted/objects/88/7b153b165d32409c70163e0f734c090f12f673 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/mergedrepo/.gitted/objects/8a/ad34cc83733590e74b93d0f7cf00375e2a735a b/vendor/libgit2/tests/resources/mergedrepo/.gitted/objects/8a/ad34cc83733590e74b93d0f7cf00375e2a735a deleted file mode 100644 index a413bc6b06..0000000000 Binary files a/vendor/libgit2/tests/resources/mergedrepo/.gitted/objects/8a/ad34cc83733590e74b93d0f7cf00375e2a735a and /dev/null differ diff --git a/vendor/libgit2/tests/resources/mergedrepo/.gitted/objects/8b/3f43d2402825c200f835ca1762413e386fd0b2 b/vendor/libgit2/tests/resources/mergedrepo/.gitted/objects/8b/3f43d2402825c200f835ca1762413e386fd0b2 deleted file mode 100644 index 3ac8f6018e..0000000000 Binary files a/vendor/libgit2/tests/resources/mergedrepo/.gitted/objects/8b/3f43d2402825c200f835ca1762413e386fd0b2 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/mergedrepo/.gitted/objects/8b/72416545c7e761b64cecad4f1686eae4078aa8 b/vendor/libgit2/tests/resources/mergedrepo/.gitted/objects/8b/72416545c7e761b64cecad4f1686eae4078aa8 deleted file mode 100644 index 589a5ae9bd..0000000000 Binary files a/vendor/libgit2/tests/resources/mergedrepo/.gitted/objects/8b/72416545c7e761b64cecad4f1686eae4078aa8 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/mergedrepo/.gitted/objects/8f/3c06cff9a83757cec40c80bc9bf31a2582bde9 b/vendor/libgit2/tests/resources/mergedrepo/.gitted/objects/8f/3c06cff9a83757cec40c80bc9bf31a2582bde9 deleted file mode 100644 index 6503985e31..0000000000 Binary files a/vendor/libgit2/tests/resources/mergedrepo/.gitted/objects/8f/3c06cff9a83757cec40c80bc9bf31a2582bde9 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/mergedrepo/.gitted/objects/8f/fcc405925511824a2240a6d3686aa7f8c7ac50 b/vendor/libgit2/tests/resources/mergedrepo/.gitted/objects/8f/fcc405925511824a2240a6d3686aa7f8c7ac50 deleted file mode 100644 index 2eaa80838f..0000000000 Binary files a/vendor/libgit2/tests/resources/mergedrepo/.gitted/objects/8f/fcc405925511824a2240a6d3686aa7f8c7ac50 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/mergedrepo/.gitted/objects/9a/05ccb4e0f948de03128e095f39dae6976751c5 b/vendor/libgit2/tests/resources/mergedrepo/.gitted/objects/9a/05ccb4e0f948de03128e095f39dae6976751c5 deleted file mode 100644 index 7373a80d88..0000000000 --- a/vendor/libgit2/tests/resources/mergedrepo/.gitted/objects/9a/05ccb4e0f948de03128e095f39dae6976751c5 +++ /dev/null @@ -1 +0,0 @@ -xĄŤŃ !Dý¦Šm@łË ÉĹřc6Ŕq#‘#AŚí‹Ćü›y/™ µ”Üś:ô#$–l•tH:é—„*DłXÖh¬Vśáź}« ®ëË·n[-ŹşĂý¤KüŠ_;…ZÎ@“¦‰ÉJ GÔbĐqŢăź3"ďągoŚ«@I \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/mergedrepo/.gitted/objects/9d/81f82fccc7dcd7de7a1ffead1815294c2e092c b/vendor/libgit2/tests/resources/mergedrepo/.gitted/objects/9d/81f82fccc7dcd7de7a1ffead1815294c2e092c deleted file mode 100644 index c5a651f975..0000000000 Binary files a/vendor/libgit2/tests/resources/mergedrepo/.gitted/objects/9d/81f82fccc7dcd7de7a1ffead1815294c2e092c and /dev/null differ diff --git a/vendor/libgit2/tests/resources/mergedrepo/.gitted/objects/b7/cedb8ad4cbb22b6363f9578cbd749797f7ef0d b/vendor/libgit2/tests/resources/mergedrepo/.gitted/objects/b7/cedb8ad4cbb22b6363f9578cbd749797f7ef0d deleted file mode 100644 index 3e14b5dc83..0000000000 Binary files a/vendor/libgit2/tests/resources/mergedrepo/.gitted/objects/b7/cedb8ad4cbb22b6363f9578cbd749797f7ef0d and /dev/null differ diff --git a/vendor/libgit2/tests/resources/mergedrepo/.gitted/objects/d0/1885ea594926eae9ba5b54ad76692af5969f51 b/vendor/libgit2/tests/resources/mergedrepo/.gitted/objects/d0/1885ea594926eae9ba5b54ad76692af5969f51 deleted file mode 100644 index a641adc2e0..0000000000 Binary files a/vendor/libgit2/tests/resources/mergedrepo/.gitted/objects/d0/1885ea594926eae9ba5b54ad76692af5969f51 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/mergedrepo/.gitted/objects/e2/809157a7766f272e4cfe26e61ef2678a5357ff b/vendor/libgit2/tests/resources/mergedrepo/.gitted/objects/e2/809157a7766f272e4cfe26e61ef2678a5357ff deleted file mode 100644 index fa86662e03..0000000000 --- a/vendor/libgit2/tests/resources/mergedrepo/.gitted/objects/e2/809157a7766f272e4cfe26e61ef2678a5357ff +++ /dev/null @@ -1,3 +0,0 @@ -xĄŽK -1D]繀Ňůt> âĆxžN‡q1‰Żď(ŢŔ]Ő{P·eą m˝ŮŤ.˘S­Ě0[Dc’őd­ -Ĺ…bM‰Ôťş¬CgdžĽ@Í>glČX].$!ÇŃ0*zŽąu})/ęE_ç¶<ÚŞŹ˛ŃO:ËWüÚŰrŇơqѤhő@mt;;äĎ5uZyVoÓ\M˙ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/mergedrepo/.gitted/objects/e6/2cac5c88b9928f2695b934c70efa4285324478 b/vendor/libgit2/tests/resources/mergedrepo/.gitted/objects/e6/2cac5c88b9928f2695b934c70efa4285324478 deleted file mode 100644 index c9841c6984..0000000000 Binary files a/vendor/libgit2/tests/resources/mergedrepo/.gitted/objects/e6/2cac5c88b9928f2695b934c70efa4285324478 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/mergedrepo/.gitted/objects/f7/2784290c151092abf04ce6b875068547f70406 b/vendor/libgit2/tests/resources/mergedrepo/.gitted/objects/f7/2784290c151092abf04ce6b875068547f70406 deleted file mode 100644 index cd587dbec9..0000000000 Binary files a/vendor/libgit2/tests/resources/mergedrepo/.gitted/objects/f7/2784290c151092abf04ce6b875068547f70406 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/mergedrepo/.gitted/refs/heads/branch b/vendor/libgit2/tests/resources/mergedrepo/.gitted/refs/heads/branch deleted file mode 100644 index a5bdf6e40c..0000000000 --- a/vendor/libgit2/tests/resources/mergedrepo/.gitted/refs/heads/branch +++ /dev/null @@ -1 +0,0 @@ -e2809157a7766f272e4cfe26e61ef2678a5357ff diff --git a/vendor/libgit2/tests/resources/mergedrepo/.gitted/refs/heads/master b/vendor/libgit2/tests/resources/mergedrepo/.gitted/refs/heads/master deleted file mode 100644 index 13d4d6721d..0000000000 --- a/vendor/libgit2/tests/resources/mergedrepo/.gitted/refs/heads/master +++ /dev/null @@ -1 +0,0 @@ -3a34580a35add43a4cf361e8e9a30060a905c876 diff --git a/vendor/libgit2/tests/resources/mergedrepo/conflicts-one.txt b/vendor/libgit2/tests/resources/mergedrepo/conflicts-one.txt deleted file mode 100644 index 8aad34cc83..0000000000 --- a/vendor/libgit2/tests/resources/mergedrepo/conflicts-one.txt +++ /dev/null @@ -1,5 +0,0 @@ -<<<<<<< HEAD -This is most certainly a conflict! -======= -This is a conflict!!! ->>>>>>> branch diff --git a/vendor/libgit2/tests/resources/mergedrepo/conflicts-two.txt b/vendor/libgit2/tests/resources/mergedrepo/conflicts-two.txt deleted file mode 100644 index e62cac5c88..0000000000 --- a/vendor/libgit2/tests/resources/mergedrepo/conflicts-two.txt +++ /dev/null @@ -1,5 +0,0 @@ -<<<<<<< HEAD -This is without question another conflict! -======= -This is another conflict!!! ->>>>>>> branch diff --git a/vendor/libgit2/tests/resources/mergedrepo/one.txt b/vendor/libgit2/tests/resources/mergedrepo/one.txt deleted file mode 100644 index 75938de1e3..0000000000 --- a/vendor/libgit2/tests/resources/mergedrepo/one.txt +++ /dev/null @@ -1,10 +0,0 @@ -This is file one! -This is file one. -This is file one. -This is file one. -This is file one. -This is file one. -This is file one. -This is file one. -This is file one. -This is file one! diff --git a/vendor/libgit2/tests/resources/mergedrepo/two.txt b/vendor/libgit2/tests/resources/mergedrepo/two.txt deleted file mode 100644 index 7b26923aaf..0000000000 --- a/vendor/libgit2/tests/resources/mergedrepo/two.txt +++ /dev/null @@ -1,12 +0,0 @@ -This is file two! -This is file two. -This is file two. -This is file two. -This is file two. -This is file two. -This is file two. -This is file two. -This is file two. -This is file two. -This is file two. -This is file two! diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/HEAD b/vendor/libgit2/tests/resources/nasty/.gitted/HEAD deleted file mode 100644 index cb089cd89a..0000000000 --- a/vendor/libgit2/tests/resources/nasty/.gitted/HEAD +++ /dev/null @@ -1 +0,0 @@ -ref: refs/heads/master diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/index b/vendor/libgit2/tests/resources/nasty/.gitted/index deleted file mode 100644 index 782a50d0a8..0000000000 Binary files a/vendor/libgit2/tests/resources/nasty/.gitted/index and /dev/null differ diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/objects/02/28b21d477f67b9f7720565da9e760b84c8b85b b/vendor/libgit2/tests/resources/nasty/.gitted/objects/02/28b21d477f67b9f7720565da9e760b84c8b85b deleted file mode 100644 index e7cd63a280..0000000000 --- a/vendor/libgit2/tests/resources/nasty/.gitted/objects/02/28b21d477f67b9f7720565da9e760b84c8b85b +++ /dev/null @@ -1,3 +0,0 @@ -xĄŤ] -!…{vw ^GčĄÔ˝b#8F´ű,ÚAoç|śj)·čä®7"AÚ ji±&ôÁ.(q¶ÉIgĽvBYć=×çřô-Â5ײŐ4č'ťč+~m -µ§Älěąćś :Î;ý9Ă.wżĺ×ôő’@ő \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/objects/04/18f28a75dc0c4951c01842e0d794843a88178a b/vendor/libgit2/tests/resources/nasty/.gitted/objects/04/18f28a75dc0c4951c01842e0d794843a88178a deleted file mode 100644 index 7f8722e78f..0000000000 Binary files a/vendor/libgit2/tests/resources/nasty/.gitted/objects/04/18f28a75dc0c4951c01842e0d794843a88178a and /dev/null differ diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/objects/04/fab819d8388295cbe3496310e4e53ef8f4a115 b/vendor/libgit2/tests/resources/nasty/.gitted/objects/04/fab819d8388295cbe3496310e4e53ef8f4a115 deleted file mode 100644 index 688b970c28..0000000000 Binary files a/vendor/libgit2/tests/resources/nasty/.gitted/objects/04/fab819d8388295cbe3496310e4e53ef8f4a115 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/objects/05/1229bf9d30ec923052ff42db8069ccdc17159d b/vendor/libgit2/tests/resources/nasty/.gitted/objects/05/1229bf9d30ec923052ff42db8069ccdc17159d deleted file mode 100644 index 4321601047..0000000000 Binary files a/vendor/libgit2/tests/resources/nasty/.gitted/objects/05/1229bf9d30ec923052ff42db8069ccdc17159d and /dev/null differ diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/objects/09/9ed86cb8501ae483b1855c351fe1a506ac9631 b/vendor/libgit2/tests/resources/nasty/.gitted/objects/09/9ed86cb8501ae483b1855c351fe1a506ac9631 deleted file mode 100644 index 7738fc85d6..0000000000 Binary files a/vendor/libgit2/tests/resources/nasty/.gitted/objects/09/9ed86cb8501ae483b1855c351fe1a506ac9631 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/objects/0a/78e40e54cc471c0415ca0680550f242e7843e2 b/vendor/libgit2/tests/resources/nasty/.gitted/objects/0a/78e40e54cc471c0415ca0680550f242e7843e2 deleted file mode 100644 index d59836e9ce..0000000000 Binary files a/vendor/libgit2/tests/resources/nasty/.gitted/objects/0a/78e40e54cc471c0415ca0680550f242e7843e2 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/objects/0b/8206dd72a3b3b932fb562f92d29199b9398390 b/vendor/libgit2/tests/resources/nasty/.gitted/objects/0b/8206dd72a3b3b932fb562f92d29199b9398390 deleted file mode 100644 index b06361552b..0000000000 Binary files a/vendor/libgit2/tests/resources/nasty/.gitted/objects/0b/8206dd72a3b3b932fb562f92d29199b9398390 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/objects/0d/45fb57852c2229346a800bd3fc58e32527a21c b/vendor/libgit2/tests/resources/nasty/.gitted/objects/0d/45fb57852c2229346a800bd3fc58e32527a21c deleted file mode 100644 index d0433a0d59..0000000000 Binary files a/vendor/libgit2/tests/resources/nasty/.gitted/objects/0d/45fb57852c2229346a800bd3fc58e32527a21c and /dev/null differ diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/objects/10/cb44a89d1a9e8bf74de3f11a2a61ee833f13b1 b/vendor/libgit2/tests/resources/nasty/.gitted/objects/10/cb44a89d1a9e8bf74de3f11a2a61ee833f13b1 deleted file mode 100644 index 9d14298d58..0000000000 Binary files a/vendor/libgit2/tests/resources/nasty/.gitted/objects/10/cb44a89d1a9e8bf74de3f11a2a61ee833f13b1 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/objects/11/9f6cd3535de0e2a15654947a7b1a5affbf1406 b/vendor/libgit2/tests/resources/nasty/.gitted/objects/11/9f6cd3535de0e2a15654947a7b1a5affbf1406 deleted file mode 100644 index fb03b26b09..0000000000 Binary files a/vendor/libgit2/tests/resources/nasty/.gitted/objects/11/9f6cd3535de0e2a15654947a7b1a5affbf1406 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/objects/12/12c12915820e1ad523b6305c0dcdefea8b7e97 b/vendor/libgit2/tests/resources/nasty/.gitted/objects/12/12c12915820e1ad523b6305c0dcdefea8b7e97 deleted file mode 100644 index 95bc4c889a..0000000000 --- a/vendor/libgit2/tests/resources/nasty/.gitted/objects/12/12c12915820e1ad523b6305c0dcdefea8b7e97 +++ /dev/null @@ -1 +0,0 @@ -xĄŤQ Dýć{¶P ‰1ţx˝ŔŰ`"%ˇăíEă ü›y/™ %ç[śŐ®Uf°QłrŁv–Ć-Ţ)oŤó„„ÁXM‹ŹŁ GKĄÂ9>©F¸¦’·˛Â;ý¤ĹŻ ˇä# F3+«q„˝ś¤ťöóĆÎËť¶ôŢVŹAž \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/objects/13/e5f8be09e8b7db074fb39b96e08215cc4a36f1 b/vendor/libgit2/tests/resources/nasty/.gitted/objects/13/e5f8be09e8b7db074fb39b96e08215cc4a36f1 deleted file mode 100644 index ea54830c12..0000000000 Binary files a/vendor/libgit2/tests/resources/nasty/.gitted/objects/13/e5f8be09e8b7db074fb39b96e08215cc4a36f1 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/objects/14/e70ab559b4c6a8a6fc9b6f538bd1f3934be725 b/vendor/libgit2/tests/resources/nasty/.gitted/objects/14/e70ab559b4c6a8a6fc9b6f538bd1f3934be725 deleted file mode 100644 index 371951aac1..0000000000 Binary files a/vendor/libgit2/tests/resources/nasty/.gitted/objects/14/e70ab559b4c6a8a6fc9b6f538bd1f3934be725 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/objects/15/f7d9f9514eeb65b9588c49b10b1da145a729a2 b/vendor/libgit2/tests/resources/nasty/.gitted/objects/15/f7d9f9514eeb65b9588c49b10b1da145a729a2 deleted file mode 100644 index a7f3683e41..0000000000 --- a/vendor/libgit2/tests/resources/nasty/.gitted/objects/15/f7d9f9514eeb65b9588c49b10b1da145a729a2 +++ /dev/null @@ -1,2 +0,0 @@ -xťŤ1Â0 E™s -ďH(iÚş‘baeâ&q”Á(5BÜžpŢôő†˙˘Ôş*¸`wÚŃ“3şěÝC”‡ś1řepB˛>»™ ˝´HKzSKp+R7yŔ‘»ý­s]c“M˛˘Ô¸ÁŹÓŚK€˝í.{Wů˙sĄM?P)“´|?ó \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/objects/16/35c47d80914f0abfa43dd4234a948db5bdb107 b/vendor/libgit2/tests/resources/nasty/.gitted/objects/16/35c47d80914f0abfa43dd4234a948db5bdb107 deleted file mode 100644 index f82b82be76..0000000000 --- a/vendor/libgit2/tests/resources/nasty/.gitted/objects/16/35c47d80914f0abfa43dd4234a948db5bdb107 +++ /dev/null @@ -1,2 +0,0 @@ -xťŤ=!…­9Ĺô&–ź…Ä[+/ŔÂÝgcŚ·ŻŕkŢËW|/Q­ -ňŔ ĽśŚ±gD’±®d?*k† ÝRśŇ‹ńĹ+5¸ĺwl+ŐNO8ă żu­[jÔ©đ)Q˝€šôÍ>ŔQŽÇ/ă˙qŹť?Pc‚=ňúĽŐ?q \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/objects/16/a701796bc3670e5c2fdaeccb7f1280c60b373f b/vendor/libgit2/tests/resources/nasty/.gitted/objects/16/a701796bc3670e5c2fdaeccb7f1280c60b373f deleted file mode 100644 index 46ed5c1e07..0000000000 Binary files a/vendor/libgit2/tests/resources/nasty/.gitted/objects/16/a701796bc3670e5c2fdaeccb7f1280c60b373f and /dev/null differ diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/objects/19/1381ee74dec49c89f99a62d055cb1058ba0de9 b/vendor/libgit2/tests/resources/nasty/.gitted/objects/19/1381ee74dec49c89f99a62d055cb1058ba0de9 deleted file mode 100644 index f1619a22e0..0000000000 Binary files a/vendor/libgit2/tests/resources/nasty/.gitted/objects/19/1381ee74dec49c89f99a62d055cb1058ba0de9 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/objects/1e/3c845808fa5883aa4bcf2f882172edb72a7a32 b/vendor/libgit2/tests/resources/nasty/.gitted/objects/1e/3c845808fa5883aa4bcf2f882172edb72a7a32 deleted file mode 100644 index e25f153f4c..0000000000 --- a/vendor/libgit2/tests/resources/nasty/.gitted/objects/1e/3c845808fa5883aa4bcf2f882172edb72a7a32 +++ /dev/null @@ -1,2 +0,0 @@ -xĄŤQ Dýć{›eaiIŚńÇč(Đ`"%ˇăíEă ü›y/™ń%ç[iŐ®ŐćećqbňDd•6nBśZ%ŞPÚŘÉÍ~Ł!G—ń˙qť?PC‚=đúŞ?Ü \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/objects/38/0b9e58872ccf1d858be4b0fc612514a080bc40 b/vendor/libgit2/tests/resources/nasty/.gitted/objects/38/0b9e58872ccf1d858be4b0fc612514a080bc40 deleted file mode 100644 index a911c3ca8d..0000000000 Binary files a/vendor/libgit2/tests/resources/nasty/.gitted/objects/38/0b9e58872ccf1d858be4b0fc612514a080bc40 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/objects/39/fb3af508440cf970b92767f6d081c811574d2a b/vendor/libgit2/tests/resources/nasty/.gitted/objects/39/fb3af508440cf970b92767f6d081c811574d2a deleted file mode 100644 index 3854748c9f..0000000000 --- a/vendor/libgit2/tests/resources/nasty/.gitted/objects/39/fb3af508440cf970b92767f6d081c811574d2a +++ /dev/null @@ -1,2 +0,0 @@ -xĄŤ= -B1„­sŠíÉĎ&® b#b˙.łűxq!FĽľQĽSÍ|3Ek˝up;\ő&‘ťÎ甸pň9Xʉ8˛bşz» &?ű˘ NüĘŤaZ´>ô{ôăŽň-~iS´ŔˇKDÖ˘‡µ2Žó.ÎÖçËdŢΤ?ď \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/objects/3b/24e5c751ee9c7c89df32a0d959748aa3d0112c b/vendor/libgit2/tests/resources/nasty/.gitted/objects/3b/24e5c751ee9c7c89df32a0d959748aa3d0112c deleted file mode 100644 index 5adcd14464..0000000000 --- a/vendor/libgit2/tests/resources/nasty/.gitted/objects/3b/24e5c751ee9c7c89df32a0d959748aa3d0112c +++ /dev/null @@ -1,2 +0,0 @@ -xťŤ1Â0 E™s -ďHČmš&•baeâ&‰ŐÁ(1BÜžpţôô†÷Ł”˛) î´ć !ĚٱĐů¦ąŁ#tś)Y;Ţ#z4ôŇU*\Ň›j‚Ű*ĄÉŽąŰťË«4a=D)'F;ąŮ‡öŘgşěżš˙/+5ý@ˇOŇő c?ä \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/objects/44/14ac920acabc3eb00e3cf9375eeb0cb6859c15 b/vendor/libgit2/tests/resources/nasty/.gitted/objects/44/14ac920acabc3eb00e3cf9375eeb0cb6859c15 deleted file mode 100644 index 4eaaa0cd74..0000000000 Binary files a/vendor/libgit2/tests/resources/nasty/.gitted/objects/44/14ac920acabc3eb00e3cf9375eeb0cb6859c15 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/objects/44/2894787eddb1e84a952f17a027590e2c6c02cd b/vendor/libgit2/tests/resources/nasty/.gitted/objects/44/2894787eddb1e84a952f17a027590e2c6c02cd deleted file mode 100644 index c81b0e67a8..0000000000 Binary files a/vendor/libgit2/tests/resources/nasty/.gitted/objects/44/2894787eddb1e84a952f17a027590e2c6c02cd and /dev/null differ diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/objects/46/fe10fa23259b089ab050788b06df979cd7d054 b/vendor/libgit2/tests/resources/nasty/.gitted/objects/46/fe10fa23259b089ab050788b06df979cd7d054 deleted file mode 100644 index 6d1f52df99..0000000000 Binary files a/vendor/libgit2/tests/resources/nasty/.gitted/objects/46/fe10fa23259b089ab050788b06df979cd7d054 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/objects/4a/a347c8bb0456230f43f34833c97b9f52c40f62 b/vendor/libgit2/tests/resources/nasty/.gitted/objects/4a/a347c8bb0456230f43f34833c97b9f52c40f62 deleted file mode 100644 index 2a54fe2055..0000000000 --- a/vendor/libgit2/tests/resources/nasty/.gitted/objects/4a/a347c8bb0456230f43f34833c97b9f52c40f62 +++ /dev/null @@ -1,3 +0,0 @@ -xĄŤ] -Â0„}Î)ö–Ý6? řâ ôi˛!‚i Ť·7Š7đmćű`Ć—śo ČN»V™ÁE©ś#^ ‡8Łä@ r\¬ŽĚ¬FăÉxá-• -çđt5Ŕ5•Ľ•Üé'ťř+~mđ%$i;i‰#ěQ!ŠNűyă?gÄĺî¶ôŢŠ˝AÍ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/objects/4d/83272d0d372e1232ddc4ff3260d76fdfa2015a b/vendor/libgit2/tests/resources/nasty/.gitted/objects/4d/83272d0d372e1232ddc4ff3260d76fdfa2015a deleted file mode 100644 index d362f1dce1..0000000000 --- a/vendor/libgit2/tests/resources/nasty/.gitted/objects/4d/83272d0d372e1232ddc4ff3260d76fdfa2015a +++ /dev/null @@ -1,2 +0,0 @@ -xĄŤK -1D]ç}Ą“ÉDÜx/OĂ NH"2·woŕ®ę=¨Š5çe€@}ŤL<%´AD“Ě„VşI:%Ir§IDPÇüs̵Á-˝|KpźkîµŔ™vúIWúŠ_;Ĺš/ŔĄ@Ç-WGTl§űů ?gXń}lĐ·ęşDX—ň`oÔ™Dů \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/objects/53/41a7b545d71198b076b8ba3374a75c9a290640 b/vendor/libgit2/tests/resources/nasty/.gitted/objects/53/41a7b545d71198b076b8ba3374a75c9a290640 deleted file mode 100644 index fdfe6eb374..0000000000 --- a/vendor/libgit2/tests/resources/nasty/.gitted/objects/53/41a7b545d71198b076b8ba3374a75c9a290640 +++ /dev/null @@ -1,3 +0,0 @@ -xĄŤ] -Â0„}Î)ö–ݤińĹčňł%‚i Ť·7Š7đmćř&”śo ČŞ]«Ěૹ­öÄČ^Ź‹”ËŚz"˛Ń“’1bµpŹ–J…s|şášJŢĘ -îô“Nü~m%Fš¬ŇFŘcW‰Nűyă?5ârw[z o·f@© \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/objects/5d/1ee4f24f66dcd62a30248588d33804656b2073 b/vendor/libgit2/tests/resources/nasty/.gitted/objects/5d/1ee4f24f66dcd62a30248588d33804656b2073 deleted file mode 100644 index ffd9bfd361..0000000000 Binary files a/vendor/libgit2/tests/resources/nasty/.gitted/objects/5d/1ee4f24f66dcd62a30248588d33804656b2073 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/objects/65/94bdbad86bbc8d3ed0806a23827203fbab56c6 b/vendor/libgit2/tests/resources/nasty/.gitted/objects/65/94bdbad86bbc8d3ed0806a23827203fbab56c6 deleted file mode 100644 index fa990d4084..0000000000 Binary files a/vendor/libgit2/tests/resources/nasty/.gitted/objects/65/94bdbad86bbc8d3ed0806a23827203fbab56c6 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/objects/68/e8bce48725490c376d57ebc60f0170605951a5 b/vendor/libgit2/tests/resources/nasty/.gitted/objects/68/e8bce48725490c376d57ebc60f0170605951a5 deleted file mode 100644 index c23f81597f..0000000000 Binary files a/vendor/libgit2/tests/resources/nasty/.gitted/objects/68/e8bce48725490c376d57ebc60f0170605951a5 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/objects/69/7dc3d723a018538eb819d5db2035c15109af73 b/vendor/libgit2/tests/resources/nasty/.gitted/objects/69/7dc3d723a018538eb819d5db2035c15109af73 deleted file mode 100644 index 6d7d9f5007..0000000000 Binary files a/vendor/libgit2/tests/resources/nasty/.gitted/objects/69/7dc3d723a018538eb819d5db2035c15109af73 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/objects/6b/7d8a5a48a3c753b75a8fe5196f9c8704ac64ad b/vendor/libgit2/tests/resources/nasty/.gitted/objects/6b/7d8a5a48a3c753b75a8fe5196f9c8704ac64ad deleted file mode 100644 index 121277fdfa..0000000000 Binary files a/vendor/libgit2/tests/resources/nasty/.gitted/objects/6b/7d8a5a48a3c753b75a8fe5196f9c8704ac64ad and /dev/null differ diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/objects/6c/1f5f6fec515d33036b44c596bfae28fc460cba b/vendor/libgit2/tests/resources/nasty/.gitted/objects/6c/1f5f6fec515d33036b44c596bfae28fc460cba deleted file mode 100644 index 8172b7f0a1..0000000000 Binary files a/vendor/libgit2/tests/resources/nasty/.gitted/objects/6c/1f5f6fec515d33036b44c596bfae28fc460cba and /dev/null differ diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/objects/71/2ceb8eb3e57072447715bc4057c57aa50f629a b/vendor/libgit2/tests/resources/nasty/.gitted/objects/71/2ceb8eb3e57072447715bc4057c57aa50f629a deleted file mode 100644 index 9ed35d78a6..0000000000 Binary files a/vendor/libgit2/tests/resources/nasty/.gitted/objects/71/2ceb8eb3e57072447715bc4057c57aa50f629a and /dev/null differ diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/objects/7a/0538bc4e20aecb36ef221f2077eb30ebe0bcb2 b/vendor/libgit2/tests/resources/nasty/.gitted/objects/7a/0538bc4e20aecb36ef221f2077eb30ebe0bcb2 deleted file mode 100644 index 0c3ea2694d..0000000000 --- a/vendor/libgit2/tests/resources/nasty/.gitted/objects/7a/0538bc4e20aecb36ef221f2077eb30ebe0bcb2 +++ /dev/null @@ -1,2 +0,0 @@ -xťŤ1!E­9Ĺô&X!1ĆĆÖĘ ĚÂÝÇŔăíĹ+řŞźWü—¸ÖMŔD˝“FÚ\‚‰9ئčÓBÖĹŮMŽĽĄŠCcĽÂ—¬ÜŕšßŘ2ÜW®ťp˘aëR·Ô¸s‘Câz3Yççc°×5äč -ý˙ nŘĺ}‹p͵lu… úI'úŠ_›B-G@…łSR*{®9gŽóNΰËÝoů5˝A) \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/objects/8c/e7a3ef59c3d602a0296321eb964218f3d52fae b/vendor/libgit2/tests/resources/nasty/.gitted/objects/8c/e7a3ef59c3d602a0296321eb964218f3d52fae deleted file mode 100644 index 6f3484c1ae..0000000000 Binary files a/vendor/libgit2/tests/resources/nasty/.gitted/objects/8c/e7a3ef59c3d602a0296321eb964218f3d52fae and /dev/null differ diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/objects/8f/1dcd43aa0164eb6ec319c3ec8879ca5cf62c1e b/vendor/libgit2/tests/resources/nasty/.gitted/objects/8f/1dcd43aa0164eb6ec319c3ec8879ca5cf62c1e deleted file mode 100644 index f802e5af7e..0000000000 --- a/vendor/libgit2/tests/resources/nasty/.gitted/objects/8f/1dcd43aa0164eb6ec319c3ec8879ca5cf62c1e +++ /dev/null @@ -1,2 +0,0 @@ -xĄŤK -1D]ç}‡|:c7¸ńzt` ĚDÄŰŸ«zŞb«őÚÁ°ŰôEČ"٬Ěä$ĺh0ď’8Ď‚™"Ö˝QáŃK[ŕ”žaIp)­®í{ô“Žňż6ĹV`ĐĚŚHÚÂV{­Ő ăĽËź3ę| kyMoA/ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/objects/91/602c85bb50dd834205edd30435b77d5bb9ccf0 b/vendor/libgit2/tests/resources/nasty/.gitted/objects/91/602c85bb50dd834205edd30435b77d5bb9ccf0 deleted file mode 100644 index d7147fb1c0..0000000000 --- a/vendor/libgit2/tests/resources/nasty/.gitted/objects/91/602c85bb50dd834205edd30435b77d5bb9ccf0 +++ /dev/null @@ -1,3 +0,0 @@ -xĄŤQ -1 Dýî)r—d»ŰZńÇčB“Ą‚µĐ­··Š7đoމ%çk -vÓŞ*ÄiÔŁŠ“°8kÉw`‰˝šy˘(!~´T*śäÉUŕ’J^ËöÚí'ő[üh%€&ňH“ö8#šnűyÓ?gĚůĆkz o!çA2 \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/objects/91/cd2c95af92883550b45fcc838013ae7e2954df b/vendor/libgit2/tests/resources/nasty/.gitted/objects/91/cd2c95af92883550b45fcc838013ae7e2954df deleted file mode 100644 index da9d5c4673..0000000000 Binary files a/vendor/libgit2/tests/resources/nasty/.gitted/objects/91/cd2c95af92883550b45fcc838013ae7e2954df and /dev/null differ diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/objects/94/f37c29173c8fa45a232b17e745c82132b2fafd b/vendor/libgit2/tests/resources/nasty/.gitted/objects/94/f37c29173c8fa45a232b17e745c82132b2fafd deleted file mode 100644 index 475d26b2fa..0000000000 Binary files a/vendor/libgit2/tests/resources/nasty/.gitted/objects/94/f37c29173c8fa45a232b17e745c82132b2fafd and /dev/null differ diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/objects/96/156716851c0afb4702b0d2c4ac8c496a730e29 b/vendor/libgit2/tests/resources/nasty/.gitted/objects/96/156716851c0afb4702b0d2c4ac8c496a730e29 deleted file mode 100644 index 57419bc77d..0000000000 --- a/vendor/libgit2/tests/resources/nasty/.gitted/objects/96/156716851c0afb4702b0d2c4ac8c496a730e29 +++ /dev/null @@ -1 +0,0 @@ -xťŤ;Â0©sŠí‘PüŮKŃĐRqµ˝VREÎ"Äí1W`ާ)Ţ$©uU0aÜic›­Ëh0ŚślAWŘGŚŃ1&š,;dĎeF襋4¸ć7µ ÷Eę&8q·żu©kj˛IŃC’zcťÇé8ŘŹťˇËŢUţ˙a¸Ń¦¨”ŕIş|\ä@o \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/objects/96/3fdf003bf7261b9155c5748dc0945349b69e68 b/vendor/libgit2/tests/resources/nasty/.gitted/objects/96/3fdf003bf7261b9155c5748dc0945349b69e68 deleted file mode 100644 index ff1d33e5cc..0000000000 Binary files a/vendor/libgit2/tests/resources/nasty/.gitted/objects/96/3fdf003bf7261b9155c5748dc0945349b69e68 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/objects/9a/b85e507899c19dca57778c9b6e5f1ec799b911 b/vendor/libgit2/tests/resources/nasty/.gitted/objects/9a/b85e507899c19dca57778c9b6e5f1ec799b911 deleted file mode 100644 index aa24a8fc77..0000000000 --- a/vendor/libgit2/tests/resources/nasty/.gitted/objects/9a/b85e507899c19dca57778c9b6e5f1ec799b911 +++ /dev/null @@ -1,3 +0,0 @@ -xťŤ= -1F­sŠéŮ5˙ bckĺf' »EIFÄŰŻŕ«>^ń=âZ79N;i9[| -hŃÔä­^ĽĹP˛ťŁ+‘‚ź ’3ľdĺ×ôĆ–ŕľríü€Sö·.uŁĆť‹ëćŁ6Öůa? ÔŁ+ů˙uĂ.¨HđDYż2Ů@% \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/objects/9d/5898503adc01d763e279ac8fcefbe865b19031 b/vendor/libgit2/tests/resources/nasty/.gitted/objects/9d/5898503adc01d763e279ac8fcefbe865b19031 deleted file mode 100644 index 7cb3106222..0000000000 --- a/vendor/libgit2/tests/resources/nasty/.gitted/objects/9d/5898503adc01d763e279ac8fcefbe865b19031 +++ /dev/null @@ -1,4 +0,0 @@ -xĄO[ ô›Sě4 R -Icüńz -Ű´±t bÔŰKŤ7đk^ÉL&pJS%qS2ôTô=5­1vo•4Ń5t®‚÷zşu­ţQFÎpŠOź#\FNw^ Łę®ěHßŕ§vÓ¤V袶°ĹQT·ŽúłFśß©çy -0OËču›yý$>›…Fű \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/objects/9e/24726d64589ba02430da8cebb5712dad35593d b/vendor/libgit2/tests/resources/nasty/.gitted/objects/9e/24726d64589ba02430da8cebb5712dad35593d deleted file mode 100644 index 2cf9535ae0..0000000000 Binary files a/vendor/libgit2/tests/resources/nasty/.gitted/objects/9e/24726d64589ba02430da8cebb5712dad35593d and /dev/null differ diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/objects/9e/683cdaf9ea2727c891b4cf8f7f11e9e28a67ca b/vendor/libgit2/tests/resources/nasty/.gitted/objects/9e/683cdaf9ea2727c891b4cf8f7f11e9e28a67ca deleted file mode 100644 index 2e36dcae72..0000000000 Binary files a/vendor/libgit2/tests/resources/nasty/.gitted/objects/9e/683cdaf9ea2727c891b4cf8f7f11e9e28a67ca and /dev/null differ diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/objects/a0/d89aa95628fcd6b64fd5b23dd56b906b06bfe2 b/vendor/libgit2/tests/resources/nasty/.gitted/objects/a0/d89aa95628fcd6b64fd5b23dd56b906b06bfe2 deleted file mode 100644 index c1de43b2a4..0000000000 Binary files a/vendor/libgit2/tests/resources/nasty/.gitted/objects/a0/d89aa95628fcd6b64fd5b23dd56b906b06bfe2 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/objects/a5/76a98d3279989226992610372035b76a01a3e9 b/vendor/libgit2/tests/resources/nasty/.gitted/objects/a5/76a98d3279989226992610372035b76a01a3e9 deleted file mode 100644 index 75fa458e75..0000000000 Binary files a/vendor/libgit2/tests/resources/nasty/.gitted/objects/a5/76a98d3279989226992610372035b76a01a3e9 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/objects/a7/8dde970cffbb71d67bef2a74aa72c6621d9819 b/vendor/libgit2/tests/resources/nasty/.gitted/objects/a7/8dde970cffbb71d67bef2a74aa72c6621d9819 deleted file mode 100644 index 78c2fe4f82..0000000000 Binary files a/vendor/libgit2/tests/resources/nasty/.gitted/objects/a7/8dde970cffbb71d67bef2a74aa72c6621d9819 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/objects/ac/84d85a425b2a21fd0ffccacac6c48823fc98c8 b/vendor/libgit2/tests/resources/nasty/.gitted/objects/ac/84d85a425b2a21fd0ffccacac6c48823fc98c8 deleted file mode 100644 index b08e24740c..0000000000 Binary files a/vendor/libgit2/tests/resources/nasty/.gitted/objects/ac/84d85a425b2a21fd0ffccacac6c48823fc98c8 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/objects/af/45aa1eb7edf804ed10f70efb96fd178527c17c b/vendor/libgit2/tests/resources/nasty/.gitted/objects/af/45aa1eb7edf804ed10f70efb96fd178527c17c deleted file mode 100644 index 9e270bfbc9..0000000000 Binary files a/vendor/libgit2/tests/resources/nasty/.gitted/objects/af/45aa1eb7edf804ed10f70efb96fd178527c17c and /dev/null differ diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/objects/b1/1df9aee97a65817e8904a74f5e6a1c62c7a275 b/vendor/libgit2/tests/resources/nasty/.gitted/objects/b1/1df9aee97a65817e8904a74f5e6a1c62c7a275 deleted file mode 100644 index b2e0eda1a4..0000000000 Binary files a/vendor/libgit2/tests/resources/nasty/.gitted/objects/b1/1df9aee97a65817e8904a74f5e6a1c62c7a275 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/objects/b8/3795b1e0eb54f22f7056119db132500d0cdc05 b/vendor/libgit2/tests/resources/nasty/.gitted/objects/b8/3795b1e0eb54f22f7056119db132500d0cdc05 deleted file mode 100644 index 6cee4f9d82..0000000000 Binary files a/vendor/libgit2/tests/resources/nasty/.gitted/objects/b8/3795b1e0eb54f22f7056119db132500d0cdc05 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/objects/bb/29ec85546d29b0bcc314242660d7772b0a3803 b/vendor/libgit2/tests/resources/nasty/.gitted/objects/bb/29ec85546d29b0bcc314242660d7772b0a3803 deleted file mode 100644 index 00ab02c217..0000000000 Binary files a/vendor/libgit2/tests/resources/nasty/.gitted/objects/bb/29ec85546d29b0bcc314242660d7772b0a3803 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/objects/bc/e2dabe5766838216d95f199d95aa4fd479a084 b/vendor/libgit2/tests/resources/nasty/.gitted/objects/bc/e2dabe5766838216d95f199d95aa4fd479a084 deleted file mode 100644 index b1eab10050..0000000000 Binary files a/vendor/libgit2/tests/resources/nasty/.gitted/objects/bc/e2dabe5766838216d95f199d95aa4fd479a084 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/objects/bf/7ab4723fcc57ecc7fceccf591d6c4773491569 b/vendor/libgit2/tests/resources/nasty/.gitted/objects/bf/7ab4723fcc57ecc7fceccf591d6c4773491569 deleted file mode 100644 index af02c6b9b6..0000000000 --- a/vendor/libgit2/tests/resources/nasty/.gitted/objects/bf/7ab4723fcc57ecc7fceccf591d6c4773491569 +++ /dev/null @@ -1,2 +0,0 @@ -xĄŤK -1D]ç}‡î|"n<^`¦;!‚™@&"ŢŢ(ŢŔ]Ő{PĹ%ç[ňfÓj€Ž´ösôb0°×ťŽŃj™÷¸óĚÂ4’ó˘¦GKĄÂYžS¸¦’ײŔ!túI§đż6pÉG K#’ÓĆ¢괟·đ猺ܧ5˝†7Őw@Ç \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/objects/c2/a2ddd339574e5cbfd9228be840eb1bf496de4e b/vendor/libgit2/tests/resources/nasty/.gitted/objects/c2/a2ddd339574e5cbfd9228be840eb1bf496de4e deleted file mode 100644 index 939cf5576f..0000000000 Binary files a/vendor/libgit2/tests/resources/nasty/.gitted/objects/c2/a2ddd339574e5cbfd9228be840eb1bf496de4e and /dev/null differ diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/objects/c3/a70f8a376f17adccfb52b48e2831bfef2a2172 b/vendor/libgit2/tests/resources/nasty/.gitted/objects/c3/a70f8a376f17adccfb52b48e2831bfef2a2172 deleted file mode 100644 index b43d3f165d..0000000000 --- a/vendor/libgit2/tests/resources/nasty/.gitted/objects/c3/a70f8a376f17adccfb52b48e2831bfef2a2172 +++ /dev/null @@ -1,2 +0,0 @@ -xťÍ= -1`ë=Ĺô‚d'n6"6¶V^ żd‹8’Ś·7^ÁW=ľâ˝Ŕµn3©ť´”@y‹Ęĸ˘Ó^{Ňýb0F¤™hYMjr/)Üŕß®E¸®ťpJCíR·Đ¸s–Cŕz†őq1«%Ř«‘iŕř•ô˙Âts]>P]€§“ňť?1 \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/objects/c4/89e70ed6d9f6331770eae21a77d15afd11cd99 b/vendor/libgit2/tests/resources/nasty/.gitted/objects/c4/89e70ed6d9f6331770eae21a77d15afd11cd99 deleted file mode 100644 index 1d763482f0..0000000000 Binary files a/vendor/libgit2/tests/resources/nasty/.gitted/objects/c4/89e70ed6d9f6331770eae21a77d15afd11cd99 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/objects/c6/72414d4d08111145ef8202f21c95fa7e688aee b/vendor/libgit2/tests/resources/nasty/.gitted/objects/c6/72414d4d08111145ef8202f21c95fa7e688aee deleted file mode 100644 index 1b79b342c3..0000000000 Binary files a/vendor/libgit2/tests/resources/nasty/.gitted/objects/c6/72414d4d08111145ef8202f21c95fa7e688aee and /dev/null differ diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/objects/c8/f98a1762ec016c30f0d73512df399dedefc3fd b/vendor/libgit2/tests/resources/nasty/.gitted/objects/c8/f98a1762ec016c30f0d73512df399dedefc3fd deleted file mode 100644 index 85ddc7f9be..0000000000 --- a/vendor/libgit2/tests/resources/nasty/.gitted/objects/c8/f98a1762ec016c30f0d73512df399dedefc3fd +++ /dev/null @@ -1,3 +0,0 @@ -xťŤ= -1F­sŠéŮÄÍŘŘZy1™%[ÄY’ńöĆ+řŞŹW|/q­«€ŽÓN<´ÎKD˘čŃŮ =…8ÍčçĹ’CťśIŤ· -_R¸Á5ż±e¸®ťźp˘aëR×Ô¸ó"‡Äő Úgë|°źjČŃú˙AݰË*&ŘPĘ+?ň \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/objects/cc/bbfdb796f9b03298f5c7225e8f830784e1a3b1 b/vendor/libgit2/tests/resources/nasty/.gitted/objects/cc/bbfdb796f9b03298f5c7225e8f830784e1a3b1 deleted file mode 100644 index 732474aefd..0000000000 --- a/vendor/libgit2/tests/resources/nasty/.gitted/objects/cc/bbfdb796f9b03298f5c7225e8f830784e1a3b1 +++ /dev/null @@ -1,2 +0,0 @@ -xĄOI -1ôśWô]˛tŚ#"^üč$­3‡LC&â÷Í?°Nµ@•¤”ąŐ~×*30rŽî`Ř›ŃŮčSę:f4ł#´Ç‘8±˘W›¤Â-ż©f¸ORVYŕĚÝÝŘ•żÁO IĘ š0XŤ°×Ş»}Ľńź5jxÎíôZ`űˇ>Ţ›E® \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/objects/cd/44b4ea1066b3fa1d4b3baad8dc1531aec287a6 b/vendor/libgit2/tests/resources/nasty/.gitted/objects/cd/44b4ea1066b3fa1d4b3baad8dc1531aec287a6 deleted file mode 100644 index 51ad3880e5..0000000000 Binary files a/vendor/libgit2/tests/resources/nasty/.gitted/objects/cd/44b4ea1066b3fa1d4b3baad8dc1531aec287a6 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/objects/ce/22b3cd9a01efafc370879c1938e0c32fb6f195 b/vendor/libgit2/tests/resources/nasty/.gitted/objects/ce/22b3cd9a01efafc370879c1938e0c32fb6f195 deleted file mode 100644 index eb5acc34b9..0000000000 --- a/vendor/libgit2/tests/resources/nasty/.gitted/objects/ce/22b3cd9a01efafc370879c1938e0c32fb6f195 +++ /dev/null @@ -1,3 +0,0 @@ -xťŤ; -B1E­ß*¦$˙ŘŘZądÉ+âH޸{ă<Őĺ÷ őľ2Č(v}‹p͵¬uúI'ţŠ_›¨–#Čť4NYm¶¨Ĺ ăĽóź3âr÷k~Mo"A< \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/objects/dc/37c5f1521fb76fe1c1ac7b13187f9396a59247 b/vendor/libgit2/tests/resources/nasty/.gitted/objects/dc/37c5f1521fb76fe1c1ac7b13187f9396a59247 deleted file mode 100644 index 57329de37f..0000000000 Binary files a/vendor/libgit2/tests/resources/nasty/.gitted/objects/dc/37c5f1521fb76fe1c1ac7b13187f9396a59247 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/objects/de/bdc4a004fda6141a17d9c297617be70d40248f b/vendor/libgit2/tests/resources/nasty/.gitted/objects/de/bdc4a004fda6141a17d9c297617be70d40248f deleted file mode 100644 index de34bd4305..0000000000 --- a/vendor/libgit2/tests/resources/nasty/.gitted/objects/de/bdc4a004fda6141a17d9c297617be70d40248f +++ /dev/null @@ -1,2 +0,0 @@ -xĄŤK -1D]ç}‡tf&qă ôm§ĂĆ@&"ŢŢ(ŢŔ]Ő{PĹ%çk ă¦UbýČ‘R2Î8ö/'ź\B” Ć“uLŠm)ŽńI5Ây)y-wŘI§źtŻřµKŢNč4ζzÖZuÚĎ›ü9ŁN7Z—×đmĐA¤ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/objects/e2/377bdbc93b30a34ed5deefedded89b947ff8f4 b/vendor/libgit2/tests/resources/nasty/.gitted/objects/e2/377bdbc93b30a34ed5deefedded89b947ff8f4 deleted file mode 100644 index f365908e0f..0000000000 --- a/vendor/libgit2/tests/resources/nasty/.gitted/objects/e2/377bdbc93b30a34ed5deefedded89b947ff8f4 +++ /dev/null @@ -1,2 +0,0 @@ -xĄŤK -1D]ç}‡îÉDÜx˝@&i‰` d"âíŤâ ÜU˝U±–rí@^nzcăŘ-‘•łłVŁ´&iËK4xA˛hP{MA‹đčą68¦gh Îą–µŢaÇ~ŇżâצXËH‘ńŇÎ$a‹Q :Î;˙9#N·°ć×ôŃ@W \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/objects/e3/99c4fc4c07cb7947d2f3d966bc374df6ccc691 b/vendor/libgit2/tests/resources/nasty/.gitted/objects/e3/99c4fc4c07cb7947d2f3d966bc374df6ccc691 deleted file mode 100644 index d8c2379461..0000000000 --- a/vendor/libgit2/tests/resources/nasty/.gitted/objects/e3/99c4fc4c07cb7947d2f3d966bc374df6ccc691 +++ /dev/null @@ -1,2 +0,0 @@ -xĄŤQ -1 Dýî)r—¤›Ú.,âŹ'Đ ”l¤‚µĐ­··Š7đoć=‘’óµMă¦UUŔč2Şcö$Čä$â. sx±lŐŐšřh©T8.ĎX8§’×r‡Y;ý¤~ĹŻ RňÉ#… ¶čM§ýĽéź3ćt‹kz o{@8 \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/objects/e4/edb361e51932b5ccedbc7ee41b4d3a4289aece b/vendor/libgit2/tests/resources/nasty/.gitted/objects/e4/edb361e51932b5ccedbc7ee41b4d3a4289aece deleted file mode 100644 index a9b181815a..0000000000 Binary files a/vendor/libgit2/tests/resources/nasty/.gitted/objects/e4/edb361e51932b5ccedbc7ee41b4d3a4289aece and /dev/null differ diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/objects/e5/1c3fa44fe981ec290c8f47fea736f3ff2af2a6 b/vendor/libgit2/tests/resources/nasty/.gitted/objects/e5/1c3fa44fe981ec290c8f47fea736f3ff2af2a6 deleted file mode 100644 index 3d12f3a808..0000000000 Binary files a/vendor/libgit2/tests/resources/nasty/.gitted/objects/e5/1c3fa44fe981ec290c8f47fea736f3ff2af2a6 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/objects/e7/3a04f71f11ab9d7dde72ff793882757a03f16e b/vendor/libgit2/tests/resources/nasty/.gitted/objects/e7/3a04f71f11ab9d7dde72ff793882757a03f16e deleted file mode 100644 index 14144d736c..0000000000 Binary files a/vendor/libgit2/tests/resources/nasty/.gitted/objects/e7/3a04f71f11ab9d7dde72ff793882757a03f16e and /dev/null differ diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/objects/e8/68b1d6833710021785581a9e11dba8468f3a55 b/vendor/libgit2/tests/resources/nasty/.gitted/objects/e8/68b1d6833710021785581a9e11dba8468f3a55 deleted file mode 100644 index 8311ad31ba..0000000000 Binary files a/vendor/libgit2/tests/resources/nasty/.gitted/objects/e8/68b1d6833710021785581a9e11dba8468f3a55 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/objects/e8/7caf56c91ab8d14e4ee8eb56308533503d1885 b/vendor/libgit2/tests/resources/nasty/.gitted/objects/e8/7caf56c91ab8d14e4ee8eb56308533503d1885 deleted file mode 100644 index 6e61c06928..0000000000 --- a/vendor/libgit2/tests/resources/nasty/.gitted/objects/e8/7caf56c91ab8d14e4ee8eb56308533503d1885 +++ /dev/null @@ -1,2 +0,0 @@ -xĄŤK -1D]ç}‡nó™ ¸ńz|:D02ńöFńîŞŢŞPKąv +7˝1IÖińŚ–?GŹłJ^Zo ă˛#‚rŇ$îŃsmpŠO×"\r-k˝Ăžý¤#ĹŻMˇ–"cĄA©a‹Q :Î;˙9#Î7·ć×ô(źAD \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/objects/eb/82bf596b66f90e25f881ce9b92cb55bab4fdf5 b/vendor/libgit2/tests/resources/nasty/.gitted/objects/eb/82bf596b66f90e25f881ce9b92cb55bab4fdf5 deleted file mode 100644 index b886096ce8..0000000000 Binary files a/vendor/libgit2/tests/resources/nasty/.gitted/objects/eb/82bf596b66f90e25f881ce9b92cb55bab4fdf5 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/objects/ed/4bc023f61dc345ff0084b922b229d24de206e7 b/vendor/libgit2/tests/resources/nasty/.gitted/objects/ed/4bc023f61dc345ff0084b922b229d24de206e7 deleted file mode 100644 index d128a94980..0000000000 Binary files a/vendor/libgit2/tests/resources/nasty/.gitted/objects/ed/4bc023f61dc345ff0084b922b229d24de206e7 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/objects/ef/6ed8a2b15f95795aed82a974b995cace02dbfe b/vendor/libgit2/tests/resources/nasty/.gitted/objects/ef/6ed8a2b15f95795aed82a974b995cace02dbfe deleted file mode 100644 index 7357306c6d..0000000000 Binary files a/vendor/libgit2/tests/resources/nasty/.gitted/objects/ef/6ed8a2b15f95795aed82a974b995cace02dbfe and /dev/null differ diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/objects/f2/c059dab35f6534b3f16d90b2f1de308615320c b/vendor/libgit2/tests/resources/nasty/.gitted/objects/f2/c059dab35f6534b3f16d90b2f1de308615320c deleted file mode 100644 index c3580d3346..0000000000 Binary files a/vendor/libgit2/tests/resources/nasty/.gitted/objects/f2/c059dab35f6534b3f16d90b2f1de308615320c and /dev/null differ diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/objects/fa/9cfdbeaaf3a91ff4b84d74412cd59d9b16a615 b/vendor/libgit2/tests/resources/nasty/.gitted/objects/fa/9cfdbeaaf3a91ff4b84d74412cd59d9b16a615 deleted file mode 100644 index 890324e6cb..0000000000 Binary files a/vendor/libgit2/tests/resources/nasty/.gitted/objects/fa/9cfdbeaaf3a91ff4b84d74412cd59d9b16a615 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/objects/fd/7a37d92197267e55e1fc0cc4f283a815bd79b8 b/vendor/libgit2/tests/resources/nasty/.gitted/objects/fd/7a37d92197267e55e1fc0cc4f283a815bd79b8 deleted file mode 100644 index c8d38ca46c..0000000000 Binary files a/vendor/libgit2/tests/resources/nasty/.gitted/objects/fd/7a37d92197267e55e1fc0cc4f283a815bd79b8 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dot_backslash_dotcapitalgit_path b/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dot_backslash_dotcapitalgit_path deleted file mode 100644 index 06132bc80f..0000000000 --- a/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dot_backslash_dotcapitalgit_path +++ /dev/null @@ -1 +0,0 @@ -0228b21d477f67b9f7720565da9e760b84c8b85b diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dot_dotcapitalgit_path b/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dot_dotcapitalgit_path deleted file mode 100644 index fd12c3ec54..0000000000 --- a/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dot_dotcapitalgit_path +++ /dev/null @@ -1 +0,0 @@ -e2377bdbc93b30a34ed5deefedded89b947ff8f4 diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dot_dotgit_path b/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dot_dotgit_path deleted file mode 100644 index 1f9b2d4a19..0000000000 --- a/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dot_dotgit_path +++ /dev/null @@ -1 +0,0 @@ -4aa347c8bb0456230f43f34833c97b9f52c40f62 diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dot_dotgit_tree b/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dot_dotgit_tree deleted file mode 100644 index dd9a6c0f7d..0000000000 --- a/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dot_dotgit_tree +++ /dev/null @@ -1 +0,0 @@ -8bcbb6e0c0f9554efd5401e1ec14a4b2595eb3bf diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dot_git_colon b/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dot_git_colon deleted file mode 100644 index 39052d99a5..0000000000 --- a/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dot_git_colon +++ /dev/null @@ -1 +0,0 @@ -4414ac920acabc3eb00e3cf9375eeb0cb6859c15 diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dot_git_colon_stuff b/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dot_git_colon_stuff deleted file mode 100644 index a3bc39f66f..0000000000 --- a/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dot_git_colon_stuff +++ /dev/null @@ -1 +0,0 @@ -ccbbfdb796f9b03298f5c7225e8f830784e1a3b1 diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dot_git_dot b/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dot_git_dot deleted file mode 100644 index b20a1e0acf..0000000000 --- a/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dot_git_dot +++ /dev/null @@ -1 +0,0 @@ -26b665c162f67acae67779445f3c7b9782b0a6d7 diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dot_path b/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dot_path deleted file mode 100644 index b3c7ab682a..0000000000 --- a/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dot_path +++ /dev/null @@ -1 +0,0 @@ -bf7ab4723fcc57ecc7fceccf591d6c4773491569 diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dot_path_two b/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dot_path_two deleted file mode 100644 index 515e983c50..0000000000 --- a/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dot_path_two +++ /dev/null @@ -1 +0,0 @@ -debdc4a004fda6141a17d9c297617be70d40248f diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dot_tree b/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dot_tree deleted file mode 100644 index cf95837cca..0000000000 --- a/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dot_tree +++ /dev/null @@ -1 +0,0 @@ -697dc3d723a018538eb819d5db2035c15109af73 diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dotcapitalgit_backslash_path b/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dotcapitalgit_backslash_path deleted file mode 100644 index 6e4344dd6f..0000000000 --- a/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dotcapitalgit_backslash_path +++ /dev/null @@ -1 +0,0 @@ -099ed86cb8501ae483b1855c351fe1a506ac9631 diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dotcapitalgit_path b/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dotcapitalgit_path deleted file mode 100644 index 58227911e8..0000000000 --- a/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dotcapitalgit_path +++ /dev/null @@ -1 +0,0 @@ -e87caf56c91ab8d14e4ee8eb56308533503d1885 diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dotcapitalgit_tree b/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dotcapitalgit_tree deleted file mode 100644 index dfb7a1ab0e..0000000000 --- a/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dotcapitalgit_tree +++ /dev/null @@ -1 +0,0 @@ -39fb3af508440cf970b92767f6d081c811574d2a diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dotdot_dotcapitalgit_path b/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dotdot_dotcapitalgit_path deleted file mode 100644 index 6a24cd70ee..0000000000 --- a/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dotdot_dotcapitalgit_path +++ /dev/null @@ -1 +0,0 @@ -d2eb26d4938550487de59a017a7bfee8ca46b5f4 diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dotdot_dotgit_path b/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dotdot_dotgit_path deleted file mode 100644 index 4d79b3bb60..0000000000 --- a/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dotdot_dotgit_path +++ /dev/null @@ -1 +0,0 @@ -1212c12915820e1ad523b6305c0dcdefea8b7e97 diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dotdot_dotgit_tree b/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dotdot_dotgit_tree deleted file mode 100644 index 6ae117ee9b..0000000000 --- a/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dotdot_dotgit_tree +++ /dev/null @@ -1 +0,0 @@ -1e3c845808fa5883aa4bcf2f882172edb72a7a32 diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dotdot_path b/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dotdot_path deleted file mode 100644 index 185e13b11d..0000000000 --- a/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dotdot_path +++ /dev/null @@ -1 +0,0 @@ -91602c85bb50dd834205edd30435b77d5bb9ccf0 diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dotdot_tree b/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dotdot_tree deleted file mode 100644 index d30a7b52e0..0000000000 --- a/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dotdot_tree +++ /dev/null @@ -1 +0,0 @@ -8f1dcd43aa0164eb6ec319c3ec8879ca5cf62c1e diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dotgit_backslash_path b/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dotgit_backslash_path deleted file mode 100644 index 6e4344dd6f..0000000000 --- a/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dotgit_backslash_path +++ /dev/null @@ -1 +0,0 @@ -099ed86cb8501ae483b1855c351fe1a506ac9631 diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dotgit_hfs_ignorable_1 b/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dotgit_hfs_ignorable_1 deleted file mode 100644 index dc48bd6fcd..0000000000 --- a/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dotgit_hfs_ignorable_1 +++ /dev/null @@ -1 +0,0 @@ -46fe10fa23259b089ab050788b06df979cd7d054 diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dotgit_hfs_ignorable_10 b/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dotgit_hfs_ignorable_10 deleted file mode 100644 index b3a972629e..0000000000 --- a/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dotgit_hfs_ignorable_10 +++ /dev/null @@ -1 +0,0 @@ -9ab85e507899c19dca57778c9b6e5f1ec799b911 diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dotgit_hfs_ignorable_11 b/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dotgit_hfs_ignorable_11 deleted file mode 100644 index edf27988a1..0000000000 --- a/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dotgit_hfs_ignorable_11 +++ /dev/null @@ -1 +0,0 @@ -15f7d9f9514eeb65b9588c49b10b1da145a729a2 diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dotgit_hfs_ignorable_12 b/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dotgit_hfs_ignorable_12 deleted file mode 100644 index c4e682e103..0000000000 --- a/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dotgit_hfs_ignorable_12 +++ /dev/null @@ -1 +0,0 @@ -c3a70f8a376f17adccfb52b48e2831bfef2a2172 diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dotgit_hfs_ignorable_13 b/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dotgit_hfs_ignorable_13 deleted file mode 100644 index 76a155c208..0000000000 --- a/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dotgit_hfs_ignorable_13 +++ /dev/null @@ -1 +0,0 @@ -c2a2ddd339574e5cbfd9228be840eb1bf496de4e diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dotgit_hfs_ignorable_14 b/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dotgit_hfs_ignorable_14 deleted file mode 100644 index be2f835516..0000000000 --- a/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dotgit_hfs_ignorable_14 +++ /dev/null @@ -1 +0,0 @@ -712ceb8eb3e57072447715bc4057c57aa50f629a diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dotgit_hfs_ignorable_15 b/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dotgit_hfs_ignorable_15 deleted file mode 100644 index 3fdeecea69..0000000000 --- a/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dotgit_hfs_ignorable_15 +++ /dev/null @@ -1 +0,0 @@ -3b24e5c751ee9c7c89df32a0d959748aa3d0112c diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dotgit_hfs_ignorable_16 b/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dotgit_hfs_ignorable_16 deleted file mode 100644 index 2739555f7a..0000000000 --- a/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dotgit_hfs_ignorable_16 +++ /dev/null @@ -1 +0,0 @@ -c8f98a1762ec016c30f0d73512df399dedefc3fd diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dotgit_hfs_ignorable_2 b/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dotgit_hfs_ignorable_2 deleted file mode 100644 index 480832e01f..0000000000 --- a/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dotgit_hfs_ignorable_2 +++ /dev/null @@ -1 +0,0 @@ -35ae236308929a536fb4e852278a9b98c42babb3 diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dotgit_hfs_ignorable_3 b/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dotgit_hfs_ignorable_3 deleted file mode 100644 index 8510ece137..0000000000 --- a/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dotgit_hfs_ignorable_3 +++ /dev/null @@ -1 +0,0 @@ -96156716851c0afb4702b0d2c4ac8c496a730e29 diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dotgit_hfs_ignorable_4 b/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dotgit_hfs_ignorable_4 deleted file mode 100644 index 754b55edd5..0000000000 --- a/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dotgit_hfs_ignorable_4 +++ /dev/null @@ -1 +0,0 @@ -7a0538bc4e20aecb36ef221f2077eb30ebe0bcb2 diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dotgit_hfs_ignorable_5 b/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dotgit_hfs_ignorable_5 deleted file mode 100644 index 161ebc43b5..0000000000 --- a/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dotgit_hfs_ignorable_5 +++ /dev/null @@ -1 +0,0 @@ -1635c47d80914f0abfa43dd4234a948db5bdb107 diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dotgit_hfs_ignorable_6 b/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dotgit_hfs_ignorable_6 deleted file mode 100644 index f8a5fa3f7e..0000000000 --- a/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dotgit_hfs_ignorable_6 +++ /dev/null @@ -1 +0,0 @@ -9e24726d64589ba02430da8cebb5712dad35593d diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dotgit_hfs_ignorable_7 b/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dotgit_hfs_ignorable_7 deleted file mode 100644 index ad5ad1d70b..0000000000 --- a/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dotgit_hfs_ignorable_7 +++ /dev/null @@ -1 +0,0 @@ -ce22b3cd9a01efafc370879c1938e0c32fb6f195 diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dotgit_hfs_ignorable_8 b/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dotgit_hfs_ignorable_8 deleted file mode 100644 index 4d10c40097..0000000000 --- a/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dotgit_hfs_ignorable_8 +++ /dev/null @@ -1 +0,0 @@ -a576a98d3279989226992610372035b76a01a3e9 diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dotgit_hfs_ignorable_9 b/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dotgit_hfs_ignorable_9 deleted file mode 100644 index a935018faf..0000000000 --- a/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dotgit_hfs_ignorable_9 +++ /dev/null @@ -1 +0,0 @@ -442894787eddb1e84a952f17a027590e2c6c02cd diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dotgit_path b/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dotgit_path deleted file mode 100644 index dd71efaa48..0000000000 --- a/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dotgit_path +++ /dev/null @@ -1 +0,0 @@ -5341a7b545d71198b076b8ba3374a75c9a290640 diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dotgit_tree b/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dotgit_tree deleted file mode 100644 index 3b7a08d7ce..0000000000 --- a/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/dotgit_tree +++ /dev/null @@ -1 +0,0 @@ -6594bdbad86bbc8d3ed0806a23827203fbab56c6 diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/git_tilde1 b/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/git_tilde1 deleted file mode 100644 index d48a185304..0000000000 --- a/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/git_tilde1 +++ /dev/null @@ -1 +0,0 @@ -94f37c29173c8fa45a232b17e745c82132b2fafd diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/git_tilde2 b/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/git_tilde2 deleted file mode 100644 index 77082e1533..0000000000 --- a/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/git_tilde2 +++ /dev/null @@ -1 +0,0 @@ -899ff28744bed5bece69c78ba752c7dc3e954629 diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/git_tilde3 b/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/git_tilde3 deleted file mode 100644 index 73022aad68..0000000000 --- a/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/git_tilde3 +++ /dev/null @@ -1 +0,0 @@ -fa9cfdbeaaf3a91ff4b84d74412cd59d9b16a615 diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/master b/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/master deleted file mode 100644 index b193433730..0000000000 --- a/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/master +++ /dev/null @@ -1 +0,0 @@ -e399c4fc4c07cb7947d2f3d966bc374df6ccc691 diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/symlink1 b/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/symlink1 deleted file mode 100644 index efa2e88b6b..0000000000 --- a/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/symlink1 +++ /dev/null @@ -1 +0,0 @@ -4d83272d0d372e1232ddc4ff3260d76fdfa2015a diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/symlink2 b/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/symlink2 deleted file mode 100644 index e4f3d60678..0000000000 --- a/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/symlink2 +++ /dev/null @@ -1 +0,0 @@ -9d5898503adc01d763e279ac8fcefbe865b19031 diff --git a/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/symlink3 b/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/symlink3 deleted file mode 100644 index 2b33e4ff78..0000000000 --- a/vendor/libgit2/tests/resources/nasty/.gitted/refs/heads/symlink3 +++ /dev/null @@ -1 +0,0 @@ -cf6fcf8cdf7e8d4cda3b11b0ba02d0d5125fbbd7 diff --git a/vendor/libgit2/tests/resources/partial-testrepo/.gitted/HEAD b/vendor/libgit2/tests/resources/partial-testrepo/.gitted/HEAD deleted file mode 100644 index 4bfb9c93f0..0000000000 --- a/vendor/libgit2/tests/resources/partial-testrepo/.gitted/HEAD +++ /dev/null @@ -1 +0,0 @@ -ref: refs/heads/dir diff --git a/vendor/libgit2/tests/resources/partial-testrepo/.gitted/config b/vendor/libgit2/tests/resources/partial-testrepo/.gitted/config deleted file mode 100644 index 99abaab97c..0000000000 --- a/vendor/libgit2/tests/resources/partial-testrepo/.gitted/config +++ /dev/null @@ -1,7 +0,0 @@ -[core] - repositoryformatversion = 0 - filemode = true - bare = false - logallrefupdates = true - ignorecase = true -[branch "dir"] diff --git a/vendor/libgit2/tests/resources/partial-testrepo/.gitted/index b/vendor/libgit2/tests/resources/partial-testrepo/.gitted/index deleted file mode 100644 index 4f241f9142..0000000000 Binary files a/vendor/libgit2/tests/resources/partial-testrepo/.gitted/index and /dev/null differ diff --git a/vendor/libgit2/tests/resources/partial-testrepo/.gitted/objects/13/85f264afb75a56a5bec74243be9b367ba4ca08 b/vendor/libgit2/tests/resources/partial-testrepo/.gitted/objects/13/85f264afb75a56a5bec74243be9b367ba4ca08 deleted file mode 100644 index cedb2a22e6..0000000000 Binary files a/vendor/libgit2/tests/resources/partial-testrepo/.gitted/objects/13/85f264afb75a56a5bec74243be9b367ba4ca08 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/partial-testrepo/.gitted/objects/14/4344043ba4d4a405da03de3844aa829ae8be0e b/vendor/libgit2/tests/resources/partial-testrepo/.gitted/objects/14/4344043ba4d4a405da03de3844aa829ae8be0e deleted file mode 100644 index b7d944fa11..0000000000 Binary files a/vendor/libgit2/tests/resources/partial-testrepo/.gitted/objects/14/4344043ba4d4a405da03de3844aa829ae8be0e and /dev/null differ diff --git a/vendor/libgit2/tests/resources/partial-testrepo/.gitted/objects/16/8e4ebd1c667499548ae12403b19b22a5c5e925 b/vendor/libgit2/tests/resources/partial-testrepo/.gitted/objects/16/8e4ebd1c667499548ae12403b19b22a5c5e925 deleted file mode 100644 index d37b93e4fe..0000000000 Binary files a/vendor/libgit2/tests/resources/partial-testrepo/.gitted/objects/16/8e4ebd1c667499548ae12403b19b22a5c5e925 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/partial-testrepo/.gitted/objects/18/1037049a54a1eb5fab404658a3a250b44335d7 b/vendor/libgit2/tests/resources/partial-testrepo/.gitted/objects/18/1037049a54a1eb5fab404658a3a250b44335d7 deleted file mode 100644 index 93a16f1463..0000000000 Binary files a/vendor/libgit2/tests/resources/partial-testrepo/.gitted/objects/18/1037049a54a1eb5fab404658a3a250b44335d7 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/partial-testrepo/.gitted/objects/18/10dff58d8a660512d4832e740f692884338ccd b/vendor/libgit2/tests/resources/partial-testrepo/.gitted/objects/18/10dff58d8a660512d4832e740f692884338ccd deleted file mode 100644 index ba0bfb30cd..0000000000 Binary files a/vendor/libgit2/tests/resources/partial-testrepo/.gitted/objects/18/10dff58d8a660512d4832e740f692884338ccd and /dev/null differ diff --git a/vendor/libgit2/tests/resources/partial-testrepo/.gitted/objects/45/b983be36b73c0788dc9cbcb76cbb80fc7bb057 b/vendor/libgit2/tests/resources/partial-testrepo/.gitted/objects/45/b983be36b73c0788dc9cbcb76cbb80fc7bb057 deleted file mode 100644 index 7ca4ceed50..0000000000 Binary files a/vendor/libgit2/tests/resources/partial-testrepo/.gitted/objects/45/b983be36b73c0788dc9cbcb76cbb80fc7bb057 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/partial-testrepo/.gitted/objects/4a/202b346bb0fb0db7eff3cffeb3c70babbd2045 b/vendor/libgit2/tests/resources/partial-testrepo/.gitted/objects/4a/202b346bb0fb0db7eff3cffeb3c70babbd2045 deleted file mode 100644 index 8953b6cefc..0000000000 --- a/vendor/libgit2/tests/resources/partial-testrepo/.gitted/objects/4a/202b346bb0fb0db7eff3cffeb3c70babbd2045 +++ /dev/null @@ -1,2 +0,0 @@ -xťŽQ -Â0DýÎ)öĘ6›Í¦ "xO°‰‰-ŘFbĽżEoŕĎ0 ĽÇ¤ş,ske×[ÎPn8R,EpD?±gź}Ę^3˛ âŮ<µĺµGŽhYKÄčŇ8Đ–DAťÉ)żÉČ;gôݧÚŕšjďp™4ŐŽŻô-çű˘óăęr‚ÁŠ;°s°GA4Űş=ěůÖ(ôin7řIĚKÍFE \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/partial-testrepo/.gitted/objects/4e/0883eeeeebc1fb1735161cea82f7cb5fab7e63 b/vendor/libgit2/tests/resources/partial-testrepo/.gitted/objects/4e/0883eeeeebc1fb1735161cea82f7cb5fab7e63 deleted file mode 100644 index e9150214bf..0000000000 Binary files a/vendor/libgit2/tests/resources/partial-testrepo/.gitted/objects/4e/0883eeeeebc1fb1735161cea82f7cb5fab7e63 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/partial-testrepo/.gitted/objects/5b/5b025afb0b4c913b4c338a42934a3863bf3644 b/vendor/libgit2/tests/resources/partial-testrepo/.gitted/objects/5b/5b025afb0b4c913b4c338a42934a3863bf3644 deleted file mode 100644 index c1f22c54fb..0000000000 --- a/vendor/libgit2/tests/resources/partial-testrepo/.gitted/objects/5b/5b025afb0b4c913b4c338a42934a3863bf3644 +++ /dev/null @@ -1,2 +0,0 @@ -xťŽŰ 1EýNi@™Ék2 "X‚$ŮYW0Yc˙íŔżĂ…s¸ĄŐzďÚÚőMDĎ€0ćś8!¶†ÉĚŢs‰ XŠŞgÚdí::@X0»P˘wŮ"F/‰‰śÍRŕUz÷ĄmúZZďú˛¤ŇV}|•/śo5݇ŇęIŁ!¬1z Ć:vůÇUim}ę/˘> -öF- \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/partial-testrepo/.gitted/objects/62/eb56dabb4b9929bc15dd9263c2c733b13d2dcc b/vendor/libgit2/tests/resources/partial-testrepo/.gitted/objects/62/eb56dabb4b9929bc15dd9263c2c733b13d2dcc deleted file mode 100644 index b669961d8f..0000000000 Binary files a/vendor/libgit2/tests/resources/partial-testrepo/.gitted/objects/62/eb56dabb4b9929bc15dd9263c2c733b13d2dcc and /dev/null differ diff --git a/vendor/libgit2/tests/resources/partial-testrepo/.gitted/objects/66/3adb09143767984f7be83a91effa47e128c735 b/vendor/libgit2/tests/resources/partial-testrepo/.gitted/objects/66/3adb09143767984f7be83a91effa47e128c735 deleted file mode 100644 index 9ff5eb2b5d..0000000000 Binary files a/vendor/libgit2/tests/resources/partial-testrepo/.gitted/objects/66/3adb09143767984f7be83a91effa47e128c735 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/partial-testrepo/.gitted/objects/75/057dd4114e74cca1d750d0aee1647c903cb60a b/vendor/libgit2/tests/resources/partial-testrepo/.gitted/objects/75/057dd4114e74cca1d750d0aee1647c903cb60a deleted file mode 100644 index 2ef4faa0f8..0000000000 Binary files a/vendor/libgit2/tests/resources/partial-testrepo/.gitted/objects/75/057dd4114e74cca1d750d0aee1647c903cb60a and /dev/null differ diff --git a/vendor/libgit2/tests/resources/partial-testrepo/.gitted/objects/81/4889a078c031f61ed08ab5fa863aea9314344d b/vendor/libgit2/tests/resources/partial-testrepo/.gitted/objects/81/4889a078c031f61ed08ab5fa863aea9314344d deleted file mode 100644 index 2f9b6b6e3d..0000000000 Binary files a/vendor/libgit2/tests/resources/partial-testrepo/.gitted/objects/81/4889a078c031f61ed08ab5fa863aea9314344d and /dev/null differ diff --git a/vendor/libgit2/tests/resources/partial-testrepo/.gitted/objects/84/96071c1b46c854b31185ea97743be6a8774479 b/vendor/libgit2/tests/resources/partial-testrepo/.gitted/objects/84/96071c1b46c854b31185ea97743be6a8774479 deleted file mode 100644 index 5df58dda56..0000000000 Binary files a/vendor/libgit2/tests/resources/partial-testrepo/.gitted/objects/84/96071c1b46c854b31185ea97743be6a8774479 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/partial-testrepo/.gitted/objects/9f/d738e8f7967c078dceed8190330fc8648ee56a b/vendor/libgit2/tests/resources/partial-testrepo/.gitted/objects/9f/d738e8f7967c078dceed8190330fc8648ee56a deleted file mode 100644 index a79612435a..0000000000 --- a/vendor/libgit2/tests/resources/partial-testrepo/.gitted/objects/9f/d738e8f7967c078dceed8190330fc8648ee56a +++ /dev/null @@ -1,3 +0,0 @@ -xťŽ[ -Â0EýÎ*fĘäŐ¤ "¸W0“‡-ŘFât˙Ý—çpS[–YŔx^ -Díb CLhutɉ}Ą8X*4Zí¬sY˝¨—UŔ‘AĂÖ ĚX3‡R«Mµ¶) s6輢M¦ÖážšÜ&Jm…ó;}Çő±Đü<Ą¶\@›ŕ‚ŃŢŹpÄ€¨vş?”ňŹ«jŰşLđ«¨Ř?Hĺ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/partial-testrepo/.gitted/objects/a4/a7dce85cf63874e984719f4fdd239f5145052f b/vendor/libgit2/tests/resources/partial-testrepo/.gitted/objects/a4/a7dce85cf63874e984719f4fdd239f5145052f deleted file mode 100644 index f8588696bc..0000000000 --- a/vendor/libgit2/tests/resources/partial-testrepo/.gitted/objects/a4/a7dce85cf63874e984719f4fdd239f5145052f +++ /dev/null @@ -1,2 +0,0 @@ -xťŹ;j1DëťmdÓú·ŔÇŽ|M«µ3`ŤŚV{ >€łâQŻ ¸·vL0I?Í!š4–Z=Ę! ×¦8˛F˘Ă’!rÖsQßyČ9]$DŽ&„l6AÇ>jFWüҵ IKNiűë§Z˘%ˇSŚ‘ -‹Ň ­ĹʉřU~Ě˝řä>'Ľď™ű Żwţ ×[ËÇ× ÷öÚDGÚˇ±đŚQ-şMůŹ«>dܶ‘OŢáŇň}í\ŕ8g_ШÂoYr \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/partial-testrepo/.gitted/objects/a7/1586c1dfe8a71c6cbf6c129f404c5642ff31bd b/vendor/libgit2/tests/resources/partial-testrepo/.gitted/objects/a7/1586c1dfe8a71c6cbf6c129f404c5642ff31bd deleted file mode 100644 index d0d7e736e5..0000000000 Binary files a/vendor/libgit2/tests/resources/partial-testrepo/.gitted/objects/a7/1586c1dfe8a71c6cbf6c129f404c5642ff31bd and /dev/null differ diff --git a/vendor/libgit2/tests/resources/partial-testrepo/.gitted/objects/a8/233120f6ad708f843d861ce2b7228ec4e3dec6 b/vendor/libgit2/tests/resources/partial-testrepo/.gitted/objects/a8/233120f6ad708f843d861ce2b7228ec4e3dec6 deleted file mode 100644 index 18a7f61c29..0000000000 Binary files a/vendor/libgit2/tests/resources/partial-testrepo/.gitted/objects/a8/233120f6ad708f843d861ce2b7228ec4e3dec6 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/partial-testrepo/.gitted/objects/c4/7800c7266a2be04c571c04d5a6614691ea99bd b/vendor/libgit2/tests/resources/partial-testrepo/.gitted/objects/c4/7800c7266a2be04c571c04d5a6614691ea99bd deleted file mode 100644 index 75f541f109..0000000000 --- a/vendor/libgit2/tests/resources/partial-testrepo/.gitted/objects/c4/7800c7266a2be04c571c04d5a6614691ea99bd +++ /dev/null @@ -1,3 +0,0 @@ -xťŽQ -Â0DýÎ)öʦ»I<‚'ŘlR+FjĽżEoŕĎ0 a.txt - git add . - git commit -m 'added a.txt' - - mkdir fold - echo b > fold/b.txt - git add . - git commit -m 'added fold and fold/b.txt' - - git branch b1 #b1 and b2 are the same - git branch b2 - - git checkout -b b3 - echo edit >> a.txt - git add . - git commit -m 'edited a.txt' - - git checkout -b b4 master - echo edit >> fold\b.txt - git add . - git commit -m 'edited fold\b.txt' - - git checkout -b b5 master - git submodule add ../testrepo.git submodule - git commit -m "added submodule named 'submodule' pointing to '../testrepo.git'" - - git checkout master - git merge -m "merge b3, b4, and b5 to master" b3 b4 b5 - - #Log commits to include in testcase - git log --format=oneline --decorate --graph - #*-. 951bbbb90e2259a4c8950db78946784fb53fcbce (HEAD, master) merge b3, b4, and b5 to master - #|\ \ - #| | * fa38b91f199934685819bea316186d8b008c52a2 (b5) added submodule named 'submodule' pointing to '../testrepo.git' - #| * | 27b7ce66243eb1403862d05f958c002312df173d (b4) edited fold\b.txt - #| |/ - #* | d9b63a88223d8367516f50bd131a5f7349b7f3e4 (b3) edited a.txt - #|/ - #* a78705c3b2725f931d3ee05348d83cc26700f247 (b2, b1) added fold and fold/b.txt - #* 5c0bb3d1b9449d1cc69d7519fd05166f01840915 added a.txt - - #fix paths so that we can add repo folders under libgit2 repo - #rename .git to .gitted - find . -name .git -exec mv -i '{}' '{}ted' \; - mv -i .gitmodules gitmodules -popd diff --git a/vendor/libgit2/tests/resources/push_src/.gitted/COMMIT_EDITMSG b/vendor/libgit2/tests/resources/push_src/.gitted/COMMIT_EDITMSG deleted file mode 100644 index b1295084c4..0000000000 --- a/vendor/libgit2/tests/resources/push_src/.gitted/COMMIT_EDITMSG +++ /dev/null @@ -1 +0,0 @@ -added submodule named 'submodule' pointing to '../testrepo.git' diff --git a/vendor/libgit2/tests/resources/push_src/.gitted/HEAD b/vendor/libgit2/tests/resources/push_src/.gitted/HEAD deleted file mode 100644 index cb089cd89a..0000000000 --- a/vendor/libgit2/tests/resources/push_src/.gitted/HEAD +++ /dev/null @@ -1 +0,0 @@ -ref: refs/heads/master diff --git a/vendor/libgit2/tests/resources/push_src/.gitted/ORIG_HEAD b/vendor/libgit2/tests/resources/push_src/.gitted/ORIG_HEAD deleted file mode 100644 index afadf9d26d..0000000000 --- a/vendor/libgit2/tests/resources/push_src/.gitted/ORIG_HEAD +++ /dev/null @@ -1 +0,0 @@ -a78705c3b2725f931d3ee05348d83cc26700f247 diff --git a/vendor/libgit2/tests/resources/push_src/.gitted/config b/vendor/libgit2/tests/resources/push_src/.gitted/config deleted file mode 100644 index 51de0311b9..0000000000 --- a/vendor/libgit2/tests/resources/push_src/.gitted/config +++ /dev/null @@ -1,10 +0,0 @@ -[core] - repositoryformatversion = 0 - filemode = false - bare = false - logallrefupdates = true - symlinks = false - ignorecase = true - hideDotFiles = dotGitOnly -[submodule "submodule"] - url = m:/dd/libgit2/tests-clar/resources/testrepo.git diff --git a/vendor/libgit2/tests/resources/push_src/.gitted/description b/vendor/libgit2/tests/resources/push_src/.gitted/description deleted file mode 100644 index 498b267a8c..0000000000 --- a/vendor/libgit2/tests/resources/push_src/.gitted/description +++ /dev/null @@ -1 +0,0 @@ -Unnamed repository; edit this file 'description' to name the repository. diff --git a/vendor/libgit2/tests/resources/push_src/.gitted/index b/vendor/libgit2/tests/resources/push_src/.gitted/index deleted file mode 100644 index 0ef6594b3c..0000000000 Binary files a/vendor/libgit2/tests/resources/push_src/.gitted/index and /dev/null differ diff --git a/vendor/libgit2/tests/resources/push_src/.gitted/info/exclude b/vendor/libgit2/tests/resources/push_src/.gitted/info/exclude deleted file mode 100644 index a5196d1be8..0000000000 --- a/vendor/libgit2/tests/resources/push_src/.gitted/info/exclude +++ /dev/null @@ -1,6 +0,0 @@ -# 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/vendor/libgit2/tests/resources/push_src/.gitted/logs/HEAD b/vendor/libgit2/tests/resources/push_src/.gitted/logs/HEAD deleted file mode 100644 index 4ef336f84d..0000000000 --- a/vendor/libgit2/tests/resources/push_src/.gitted/logs/HEAD +++ /dev/null @@ -1,10 +0,0 @@ -0000000000000000000000000000000000000000 5c0bb3d1b9449d1cc69d7519fd05166f01840915 Congyi Wu 1352923200 -0500 commit (initial): added a.txt -5c0bb3d1b9449d1cc69d7519fd05166f01840915 a78705c3b2725f931d3ee05348d83cc26700f247 Congyi Wu 1352923200 -0500 commit: added fold and fold/b.txt -a78705c3b2725f931d3ee05348d83cc26700f247 a78705c3b2725f931d3ee05348d83cc26700f247 Congyi Wu 1352923201 -0500 checkout: moving from master to b3 -a78705c3b2725f931d3ee05348d83cc26700f247 d9b63a88223d8367516f50bd131a5f7349b7f3e4 Congyi Wu 1352923201 -0500 commit: edited a.txt -d9b63a88223d8367516f50bd131a5f7349b7f3e4 a78705c3b2725f931d3ee05348d83cc26700f247 Congyi Wu 1352923201 -0500 checkout: moving from b3 to b4 -a78705c3b2725f931d3ee05348d83cc26700f247 27b7ce66243eb1403862d05f958c002312df173d Congyi Wu 1352923201 -0500 commit: edited fold\b.txt -27b7ce66243eb1403862d05f958c002312df173d a78705c3b2725f931d3ee05348d83cc26700f247 Congyi Wu 1352923201 -0500 checkout: moving from b4 to b5 -a78705c3b2725f931d3ee05348d83cc26700f247 fa38b91f199934685819bea316186d8b008c52a2 Congyi Wu 1352923206 -0500 commit: added submodule named 'submodule' pointing to '../testrepo.git' -fa38b91f199934685819bea316186d8b008c52a2 a78705c3b2725f931d3ee05348d83cc26700f247 Congyi Wu 1352923207 -0500 checkout: moving from b5 to master -a78705c3b2725f931d3ee05348d83cc26700f247 951bbbb90e2259a4c8950db78946784fb53fcbce Congyi Wu 1352923207 -0500 merge b3 b4 b5: Merge made by the 'octopus' strategy. diff --git a/vendor/libgit2/tests/resources/push_src/.gitted/logs/refs/heads/b1 b/vendor/libgit2/tests/resources/push_src/.gitted/logs/refs/heads/b1 deleted file mode 100644 index 390a03d5c3..0000000000 --- a/vendor/libgit2/tests/resources/push_src/.gitted/logs/refs/heads/b1 +++ /dev/null @@ -1 +0,0 @@ -0000000000000000000000000000000000000000 a78705c3b2725f931d3ee05348d83cc26700f247 Congyi Wu 1352923200 -0500 branch: Created from master diff --git a/vendor/libgit2/tests/resources/push_src/.gitted/logs/refs/heads/b2 b/vendor/libgit2/tests/resources/push_src/.gitted/logs/refs/heads/b2 deleted file mode 100644 index 390a03d5c3..0000000000 --- a/vendor/libgit2/tests/resources/push_src/.gitted/logs/refs/heads/b2 +++ /dev/null @@ -1 +0,0 @@ -0000000000000000000000000000000000000000 a78705c3b2725f931d3ee05348d83cc26700f247 Congyi Wu 1352923200 -0500 branch: Created from master diff --git a/vendor/libgit2/tests/resources/push_src/.gitted/logs/refs/heads/b3 b/vendor/libgit2/tests/resources/push_src/.gitted/logs/refs/heads/b3 deleted file mode 100644 index 01e302c44f..0000000000 --- a/vendor/libgit2/tests/resources/push_src/.gitted/logs/refs/heads/b3 +++ /dev/null @@ -1,2 +0,0 @@ -0000000000000000000000000000000000000000 a78705c3b2725f931d3ee05348d83cc26700f247 Congyi Wu 1352923201 -0500 branch: Created from HEAD -a78705c3b2725f931d3ee05348d83cc26700f247 d9b63a88223d8367516f50bd131a5f7349b7f3e4 Congyi Wu 1352923201 -0500 commit: edited a.txt diff --git a/vendor/libgit2/tests/resources/push_src/.gitted/logs/refs/heads/b4 b/vendor/libgit2/tests/resources/push_src/.gitted/logs/refs/heads/b4 deleted file mode 100644 index 7afddc54e4..0000000000 --- a/vendor/libgit2/tests/resources/push_src/.gitted/logs/refs/heads/b4 +++ /dev/null @@ -1,2 +0,0 @@ -0000000000000000000000000000000000000000 a78705c3b2725f931d3ee05348d83cc26700f247 Congyi Wu 1352923201 -0500 branch: Created from master -a78705c3b2725f931d3ee05348d83cc26700f247 27b7ce66243eb1403862d05f958c002312df173d Congyi Wu 1352923201 -0500 commit: edited fold\b.txt diff --git a/vendor/libgit2/tests/resources/push_src/.gitted/logs/refs/heads/b5 b/vendor/libgit2/tests/resources/push_src/.gitted/logs/refs/heads/b5 deleted file mode 100644 index bc22567f76..0000000000 --- a/vendor/libgit2/tests/resources/push_src/.gitted/logs/refs/heads/b5 +++ /dev/null @@ -1,2 +0,0 @@ -0000000000000000000000000000000000000000 a78705c3b2725f931d3ee05348d83cc26700f247 Congyi Wu 1352923201 -0500 branch: Created from master -a78705c3b2725f931d3ee05348d83cc26700f247 fa38b91f199934685819bea316186d8b008c52a2 Congyi Wu 1352923206 -0500 commit: added submodule named 'submodule' pointing to '../testrepo.git' diff --git a/vendor/libgit2/tests/resources/push_src/.gitted/logs/refs/heads/master b/vendor/libgit2/tests/resources/push_src/.gitted/logs/refs/heads/master deleted file mode 100644 index 8aafa9ca4c..0000000000 --- a/vendor/libgit2/tests/resources/push_src/.gitted/logs/refs/heads/master +++ /dev/null @@ -1,3 +0,0 @@ -0000000000000000000000000000000000000000 5c0bb3d1b9449d1cc69d7519fd05166f01840915 Congyi Wu 1352923200 -0500 commit (initial): added a.txt -5c0bb3d1b9449d1cc69d7519fd05166f01840915 a78705c3b2725f931d3ee05348d83cc26700f247 Congyi Wu 1352923200 -0500 commit: added fold and fold/b.txt -a78705c3b2725f931d3ee05348d83cc26700f247 951bbbb90e2259a4c8950db78946784fb53fcbce Congyi Wu 1352923207 -0500 merge b3 b4 b5: Merge made by the 'octopus' strategy. diff --git a/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/HEAD b/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/HEAD deleted file mode 100644 index cb089cd89a..0000000000 --- a/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/HEAD +++ /dev/null @@ -1 +0,0 @@ -ref: refs/heads/master diff --git a/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/config b/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/config deleted file mode 100644 index 59810077df..0000000000 --- a/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/config +++ /dev/null @@ -1,15 +0,0 @@ -[core] - repositoryformatversion = 0 - filemode = false - bare = false - logallrefupdates = true - worktree = ../../../submodule - symlinks = false - ignorecase = true - hideDotFiles = dotGitOnly -[remote "origin"] - fetch = +refs/heads/*:refs/remotes/origin/* - url = m:/dd/libgit2/tests-clar/resources/testrepo.git -[branch "master"] - remote = origin - merge = refs/heads/master diff --git a/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/description b/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/description deleted file mode 100644 index 498b267a8c..0000000000 --- a/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/description +++ /dev/null @@ -1 +0,0 @@ -Unnamed repository; edit this file 'description' to name the repository. diff --git a/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/index b/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/index deleted file mode 100644 index 8e44080f3e..0000000000 Binary files a/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/index and /dev/null differ diff --git a/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/info/exclude b/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/info/exclude deleted file mode 100644 index a5196d1be8..0000000000 --- a/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/info/exclude +++ /dev/null @@ -1,6 +0,0 @@ -# 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/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/logs/HEAD b/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/logs/HEAD deleted file mode 100644 index aedcdf2959..0000000000 --- a/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/logs/HEAD +++ /dev/null @@ -1 +0,0 @@ -0000000000000000000000000000000000000000 a65fedf39aefe402d3bb6e24df4d4f5fe4547750 Congyi Wu 1352923205 -0500 clone: from m:/dd/libgit2/tests-clar/resources/testrepo.git diff --git a/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/logs/refs/heads/master b/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/logs/refs/heads/master deleted file mode 100644 index aedcdf2959..0000000000 --- a/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/logs/refs/heads/master +++ /dev/null @@ -1 +0,0 @@ -0000000000000000000000000000000000000000 a65fedf39aefe402d3bb6e24df4d4f5fe4547750 Congyi Wu 1352923205 -0500 clone: from m:/dd/libgit2/tests-clar/resources/testrepo.git diff --git a/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/logs/refs/remotes/origin/HEAD b/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/logs/refs/remotes/origin/HEAD deleted file mode 100644 index aedcdf2959..0000000000 --- a/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/logs/refs/remotes/origin/HEAD +++ /dev/null @@ -1 +0,0 @@ -0000000000000000000000000000000000000000 a65fedf39aefe402d3bb6e24df4d4f5fe4547750 Congyi Wu 1352923205 -0500 clone: from m:/dd/libgit2/tests-clar/resources/testrepo.git diff --git a/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/objects/08/b041783f40edfe12bb406c9c9a8a040177c125 b/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/objects/08/b041783f40edfe12bb406c9c9a8a040177c125 deleted file mode 100644 index d1c032fce3..0000000000 Binary files a/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/objects/08/b041783f40edfe12bb406c9c9a8a040177c125 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/objects/13/85f264afb75a56a5bec74243be9b367ba4ca08 b/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/objects/13/85f264afb75a56a5bec74243be9b367ba4ca08 deleted file mode 100644 index cedb2a22e6..0000000000 Binary files a/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/objects/13/85f264afb75a56a5bec74243be9b367ba4ca08 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/objects/18/1037049a54a1eb5fab404658a3a250b44335d7 b/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/objects/18/1037049a54a1eb5fab404658a3a250b44335d7 deleted file mode 100644 index 93a16f1463..0000000000 Binary files a/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/objects/18/1037049a54a1eb5fab404658a3a250b44335d7 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/objects/18/10dff58d8a660512d4832e740f692884338ccd b/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/objects/18/10dff58d8a660512d4832e740f692884338ccd deleted file mode 100644 index ba0bfb30cd..0000000000 Binary files a/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/objects/18/10dff58d8a660512d4832e740f692884338ccd and /dev/null differ diff --git a/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/objects/1a/443023183e3f2bfbef8ac923cd81c1018a18fd b/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/objects/1a/443023183e3f2bfbef8ac923cd81c1018a18fd deleted file mode 100644 index 3ec541288f..0000000000 Binary files a/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/objects/1a/443023183e3f2bfbef8ac923cd81c1018a18fd and /dev/null differ diff --git a/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/objects/1b/8cbad43e867676df601306689fe7c3def5e689 b/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/objects/1b/8cbad43e867676df601306689fe7c3def5e689 deleted file mode 100644 index 6048d4bad3..0000000000 Binary files a/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/objects/1b/8cbad43e867676df601306689fe7c3def5e689 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/objects/1f/67fc4386b2d171e0d21be1c447e12660561f9b b/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/objects/1f/67fc4386b2d171e0d21be1c447e12660561f9b deleted file mode 100644 index 225c45734e..0000000000 Binary files a/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/objects/1f/67fc4386b2d171e0d21be1c447e12660561f9b and /dev/null differ diff --git a/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/objects/25/8f0e2a959a364e40ed6603d5d44fbb24765b10 b/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/objects/25/8f0e2a959a364e40ed6603d5d44fbb24765b10 deleted file mode 100644 index cb1ed5712c..0000000000 Binary files a/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/objects/25/8f0e2a959a364e40ed6603d5d44fbb24765b10 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/objects/27/0b8ea76056d5cad83af921837702d3e3c2924d b/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/objects/27/0b8ea76056d5cad83af921837702d3e3c2924d deleted file mode 100644 index df40d99aff..0000000000 Binary files a/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/objects/27/0b8ea76056d5cad83af921837702d3e3c2924d and /dev/null differ diff --git a/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/objects/2d/59075e0681f540482d4f6223a68e0fef790bc7 b/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/objects/2d/59075e0681f540482d4f6223a68e0fef790bc7 deleted file mode 100644 index 0a1500a6ff..0000000000 Binary files a/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/objects/2d/59075e0681f540482d4f6223a68e0fef790bc7 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/objects/32/59a6bd5b57fb9c1281bb7ed3167b50f224cb54 b/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/objects/32/59a6bd5b57fb9c1281bb7ed3167b50f224cb54 deleted file mode 100644 index 321eaa8679..0000000000 Binary files a/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/objects/32/59a6bd5b57fb9c1281bb7ed3167b50f224cb54 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/objects/36/97d64be941a53d4ae8f6a271e4e3fa56b022cc b/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/objects/36/97d64be941a53d4ae8f6a271e4e3fa56b022cc deleted file mode 100644 index 9bb5b623bd..0000000000 Binary files a/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/objects/36/97d64be941a53d4ae8f6a271e4e3fa56b022cc and /dev/null differ diff --git a/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/objects/45/b983be36b73c0788dc9cbcb76cbb80fc7bb057 b/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/objects/45/b983be36b73c0788dc9cbcb76cbb80fc7bb057 deleted file mode 100644 index 7ca4ceed50..0000000000 Binary files a/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/objects/45/b983be36b73c0788dc9cbcb76cbb80fc7bb057 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/objects/4a/202b346bb0fb0db7eff3cffeb3c70babbd2045 b/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/objects/4a/202b346bb0fb0db7eff3cffeb3c70babbd2045 deleted file mode 100644 index 8953b6cefc..0000000000 --- a/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/objects/4a/202b346bb0fb0db7eff3cffeb3c70babbd2045 +++ /dev/null @@ -1,2 +0,0 @@ -xťŽQ -Â0DýÎ)öĘ6›Í¦ "xO°‰‰-ŘFbĽżEoŕĎ0 ĽÇ¤ş,ske×[ÎPn8R,EpD?±gź}Ę^3˛ âŮ<µĺµGŽhYKÄčŇ8Đ–DAťÉ)żÉČ;gôݧÚŕšjďp™4ŐŽŻô-çű˘óăęr‚ÁŠ;°s°GA4Űş=ěůÖ(ôin7řIĚKÍFE \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/objects/4b/22b35d44b5a4f589edf3dc89196399771796ea b/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/objects/4b/22b35d44b5a4f589edf3dc89196399771796ea deleted file mode 100644 index b4e5aa1860..0000000000 Binary files a/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/objects/4b/22b35d44b5a4f589edf3dc89196399771796ea and /dev/null differ diff --git a/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/objects/52/1d87c1ec3aef9824daf6d96cc0ae3710766d91 b/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/objects/52/1d87c1ec3aef9824daf6d96cc0ae3710766d91 deleted file mode 100644 index 351cff8230..0000000000 Binary files a/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/objects/52/1d87c1ec3aef9824daf6d96cc0ae3710766d91 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/objects/5b/5b025afb0b4c913b4c338a42934a3863bf3644 b/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/objects/5b/5b025afb0b4c913b4c338a42934a3863bf3644 deleted file mode 100644 index c1f22c54fb..0000000000 --- a/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/objects/5b/5b025afb0b4c913b4c338a42934a3863bf3644 +++ /dev/null @@ -1,2 +0,0 @@ -xťŽŰ 1EýNi@™Ék2 "X‚$ŮYW0Yc˙íŔżĂ…s¸ĄŐzďÚÚőMDĎ€0ćś8!¶†ÉĚŢs‰ XŠŞgÚdí::@X0»P˘wŮ"F/‰‰śÍRŕUz÷ĄmúZZďú˛¤ŇV}|•/śo5݇ŇęIŁ!¬1z Ć:vůÇUim}ę/˘> -öF- \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/objects/75/057dd4114e74cca1d750d0aee1647c903cb60a b/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/objects/75/057dd4114e74cca1d750d0aee1647c903cb60a deleted file mode 100644 index 2ef4faa0f8..0000000000 Binary files a/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/objects/75/057dd4114e74cca1d750d0aee1647c903cb60a and /dev/null differ diff --git a/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/objects/76/3d71aadf09a7951596c9746c024e7eece7c7af b/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/objects/76/3d71aadf09a7951596c9746c024e7eece7c7af deleted file mode 100644 index 716b0c64bf..0000000000 --- a/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/objects/76/3d71aadf09a7951596c9746c024e7eece7c7af +++ /dev/null @@ -1 +0,0 @@ -xťŽAj!łö?0¨ŁßÂ09Ęo}ťHÚ6¨}˙ôjUPP©ŐZ&Y˙ř AÔ›±€pŚÁFdëĽ÷pzŤ[fŽYŚ˝PŇqLJ.,Z§`™Ĺ®Đ.ů`’vŮ łq $Ć5+9çOëtśű>Ű/úDE/龡WŻď*eż§Vźdf1>đ覭Öę˛×äÄ›ąúĘ™F« ­ěTŽŮhśk.i¶^0Ô?PĽR, \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/objects/7b/4384978d2493e851f9cca7858815fac9b10980 b/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/objects/7b/4384978d2493e851f9cca7858815fac9b10980 deleted file mode 100644 index 23c462f341..0000000000 Binary files a/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/objects/7b/4384978d2493e851f9cca7858815fac9b10980 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/objects/81/4889a078c031f61ed08ab5fa863aea9314344d b/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/objects/81/4889a078c031f61ed08ab5fa863aea9314344d deleted file mode 100644 index 2f9b6b6e3d..0000000000 Binary files a/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/objects/81/4889a078c031f61ed08ab5fa863aea9314344d and /dev/null differ diff --git a/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/objects/84/96071c1b46c854b31185ea97743be6a8774479 b/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/objects/84/96071c1b46c854b31185ea97743be6a8774479 deleted file mode 100644 index 5df58dda56..0000000000 Binary files a/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/objects/84/96071c1b46c854b31185ea97743be6a8774479 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/objects/84/9a5e34a26815e821f865b8479f5815a47af0fe b/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/objects/84/9a5e34a26815e821f865b8479f5815a47af0fe deleted file mode 100644 index 71019a636b..0000000000 --- a/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/objects/84/9a5e34a26815e821f865b8479f5815a47af0fe +++ /dev/null @@ -1,2 +0,0 @@ -xŚM F]sŠą€†ź41ĆxÝ(­I‹ÁéÂŰKÝ˝/_ŢăP@ˇÚŐř˘!8›)es -” ĄN&FGSĆ„ąhŃ{+ßCťç‰÷ĆZzvŘFˇ7ZŕÎ-¬Îńó‡k™x\ăˇ[PĆ8ď´ôGŘK/ĄŹ^© lŤĘ>.4 \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/objects/94/4c0f6e4dfa41595e6eb3ceecdb14f50fe18162 b/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/objects/94/4c0f6e4dfa41595e6eb3ceecdb14f50fe18162 deleted file mode 100644 index 4cc3f4dffc..0000000000 --- a/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/objects/94/4c0f6e4dfa41595e6eb3ceecdb14f50fe18162 +++ /dev/null @@ -1 +0,0 @@ -x+)JMU044b040031QrutńueXˇl¨đmmA‹m›ĚŁíJ}Gß;U‘T”—śź–™“ŞWRQÂ`6ýš÷KÇĄ¶^/ľ-*|ňřWŘĄ3PĄy©ĺ`%ËEŰޱ\&gŽĐ|ź0§˙†{ÓŤ1X \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/objects/9a/03079b8a8ee85a0bee58bf9be3da8b62414ed4 b/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/objects/9a/03079b8a8ee85a0bee58bf9be3da8b62414ed4 deleted file mode 100644 index bf7b2bb686..0000000000 Binary files a/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/objects/9a/03079b8a8ee85a0bee58bf9be3da8b62414ed4 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/objects/9f/13f7d0a9402c681f91dc590cf7b5470e6a77d2 b/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/objects/9f/13f7d0a9402c681f91dc590cf7b5470e6a77d2 deleted file mode 100644 index 7f1cfb23c7..0000000000 --- a/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/objects/9f/13f7d0a9402c681f91dc590cf7b5470e6a77d2 +++ /dev/null @@ -1,2 +0,0 @@ -xťŽM -Â0F]çłd2ť¤ń®;ÔÂÁ…¬ŁłX†ÂEČŽ5R±Ł ŰAŃE &n}ZÜć™Aą \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/objects/9f/d738e8f7967c078dceed8190330fc8648ee56a b/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/objects/9f/d738e8f7967c078dceed8190330fc8648ee56a deleted file mode 100644 index a79612435a..0000000000 --- a/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/objects/9f/d738e8f7967c078dceed8190330fc8648ee56a +++ /dev/null @@ -1,3 +0,0 @@ -xťŽ[ -Â0EýÎ*fĘäŐ¤ "¸W0“‡-ŘFât˙Ý—çpS[–YŔx^ -Díb CLhutɉ}Ą8X*4Zí¬sY˝¨—UŔ‘AĂÖ ĚX3‡R«Mµ¶) s6輢M¦ÖážšÜ&Jm…ó;}Çő±Đü<Ą¶\@›ŕ‚ŃŢŹpÄ€¨vş?”ňŹ«jŰşLđ«¨Ř?Hĺ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/objects/a4/a7dce85cf63874e984719f4fdd239f5145052f b/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/objects/a4/a7dce85cf63874e984719f4fdd239f5145052f deleted file mode 100644 index f8588696bc..0000000000 --- a/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/objects/a4/a7dce85cf63874e984719f4fdd239f5145052f +++ /dev/null @@ -1,2 +0,0 @@ -xťŹ;j1DëťmdÓú·ŔÇŽ|M«µ3`ŤŚV{ >€łâQŻ ¸·vL0I?Í!š4–Z=Ę! ×¦8˛F˘Ă’!rÖsQßyČ9]$DŽ&„l6AÇ>jFWüҵ IKNiűë§Z˘%ˇSŚ‘ -‹Ň ­ĹʉřU~Ě˝řä>'Ľď™ű Żwţ ×[ËÇ× ÷öÚDGÚˇ±đŚQ-şMůŹ«>dܶ‘OŢáŇň}í\ŕ8g_ШÂoYr \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/objects/a6/5fedf39aefe402d3bb6e24df4d4f5fe4547750 b/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/objects/a6/5fedf39aefe402d3bb6e24df4d4f5fe4547750 deleted file mode 100644 index 29c8e824d2..0000000000 --- a/vendor/libgit2/tests/resources/push_src/.gitted/modules/submodule/objects/a6/5fedf39aefe402d3bb6e24df4d4f5fe4547750 +++ /dev/null @@ -1,3 +0,0 @@ -xťŽQ -!@űösBťQ"‚ŽĐ Ćٱ rŤÍîßŇú{RëűČž¬y†Eć -Á mâHŽě&µ™EĐr7äS˘Ţ!*u΄µŢËç2ß>#\V8¤ß|­§ŰĆG“Ęt„–-ybÂöhÍF·Uţ/Ťä±J-Ź|ŤM}Wóă+GK \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/push_src/.gitted/objects/28/905c54ea45a4bed8d7b90f51bd8bd81eec8840 b/vendor/libgit2/tests/resources/push_src/.gitted/objects/28/905c54ea45a4bed8d7b90f51bd8bd81eec8840 deleted file mode 100644 index dc10f68317..0000000000 Binary files a/vendor/libgit2/tests/resources/push_src/.gitted/objects/28/905c54ea45a4bed8d7b90f51bd8bd81eec8840 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/push_src/.gitted/objects/36/6226fb970ac0caa9d3f55967ab01334a548f60 b/vendor/libgit2/tests/resources/push_src/.gitted/objects/36/6226fb970ac0caa9d3f55967ab01334a548f60 deleted file mode 100644 index 45c4d92089..0000000000 Binary files a/vendor/libgit2/tests/resources/push_src/.gitted/objects/36/6226fb970ac0caa9d3f55967ab01334a548f60 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/push_src/.gitted/objects/36/f79b2846017d3761e0a02d0bccd573e0f90c57 b/vendor/libgit2/tests/resources/push_src/.gitted/objects/36/f79b2846017d3761e0a02d0bccd573e0f90c57 deleted file mode 100644 index 0bc57f2662..0000000000 --- a/vendor/libgit2/tests/resources/push_src/.gitted/objects/36/f79b2846017d3761e0a02d0bccd573e0f90c57 +++ /dev/null @@ -1,2 +0,0 @@ -x%Ś] -0„űśSě”ÄÍŹB)}é Ľ@bµnŃéíf`f`>ö3(§nŢibC°čűľë0öhťQ6˘BĺMv¨‡ŕ2&-ř÷M0Q)+ ®ŚęćŞ tNsÚŕżE*;}ŕžřJϲN픹­§(th­ÔÖ@#Ť”BŚËşC•?ÉŔTĂ…oĹyk7˙ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/push_src/.gitted/objects/5c/0bb3d1b9449d1cc69d7519fd05166f01840915 b/vendor/libgit2/tests/resources/push_src/.gitted/objects/5c/0bb3d1b9449d1cc69d7519fd05166f01840915 deleted file mode 100644 index 8831821385..0000000000 Binary files a/vendor/libgit2/tests/resources/push_src/.gitted/objects/5c/0bb3d1b9449d1cc69d7519fd05166f01840915 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/push_src/.gitted/objects/61/780798228d17af2d34fce4cfbdf35556832472 b/vendor/libgit2/tests/resources/push_src/.gitted/objects/61/780798228d17af2d34fce4cfbdf35556832472 deleted file mode 100644 index 586bf17a49..0000000000 Binary files a/vendor/libgit2/tests/resources/push_src/.gitted/objects/61/780798228d17af2d34fce4cfbdf35556832472 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/push_src/.gitted/objects/64/fd55f9b6390202db5e5666fd1fb339089fba4d b/vendor/libgit2/tests/resources/push_src/.gitted/objects/64/fd55f9b6390202db5e5666fd1fb339089fba4d deleted file mode 100644 index bcaaa91c21..0000000000 Binary files a/vendor/libgit2/tests/resources/push_src/.gitted/objects/64/fd55f9b6390202db5e5666fd1fb339089fba4d and /dev/null differ diff --git a/vendor/libgit2/tests/resources/push_src/.gitted/objects/78/981922613b2afb6025042ff6bd878ac1994e85 b/vendor/libgit2/tests/resources/push_src/.gitted/objects/78/981922613b2afb6025042ff6bd878ac1994e85 deleted file mode 100644 index e814d07b0b..0000000000 Binary files a/vendor/libgit2/tests/resources/push_src/.gitted/objects/78/981922613b2afb6025042ff6bd878ac1994e85 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/push_src/.gitted/objects/80/5c54522e614f29f70d2413a0470247d8b424ac b/vendor/libgit2/tests/resources/push_src/.gitted/objects/80/5c54522e614f29f70d2413a0470247d8b424ac deleted file mode 100644 index 552670c06f..0000000000 Binary files a/vendor/libgit2/tests/resources/push_src/.gitted/objects/80/5c54522e614f29f70d2413a0470247d8b424ac and /dev/null differ diff --git a/vendor/libgit2/tests/resources/push_src/.gitted/objects/95/1bbbb90e2259a4c8950db78946784fb53fcbce b/vendor/libgit2/tests/resources/push_src/.gitted/objects/95/1bbbb90e2259a4c8950db78946784fb53fcbce deleted file mode 100644 index 596cd43de1..0000000000 --- a/vendor/libgit2/tests/resources/push_src/.gitted/objects/95/1bbbb90e2259a4c8950db78946784fb53fcbce +++ /dev/null @@ -1,2 +0,0 @@ -x•Ź[JĆ0…}î*fż2—Ě$ÁEřśi’úmĄ¶»· -úîŰáă\8ă:Ď×DôfßZ ˝Şöě&ąş65ł^©»ś,ĺî%Ôá­lm١~;KJĚR“XT˛®č•„Šö(!{ěŇÂŻźŁÇ±™qćP’qĹsPÓČB\;EůëďE’gę”s–`IeoEČ(YMŽFĺÂC9ö—u§u™>Żđ|Ŕýř#?ŽÇi.××»qť€D9ł0F¸EENzţßŰ˙“Ăܶ©Ë<\ ,\a_a.ďgßđëd \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/push_src/.gitted/objects/a7/8705c3b2725f931d3ee05348d83cc26700f247 b/vendor/libgit2/tests/resources/push_src/.gitted/objects/a7/8705c3b2725f931d3ee05348d83cc26700f247 deleted file mode 100644 index 6ad835e86c..0000000000 Binary files a/vendor/libgit2/tests/resources/push_src/.gitted/objects/a7/8705c3b2725f931d3ee05348d83cc26700f247 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/push_src/.gitted/objects/b4/83ae7ba66decee9aee971f501221dea84b1498 b/vendor/libgit2/tests/resources/push_src/.gitted/objects/b4/83ae7ba66decee9aee971f501221dea84b1498 deleted file mode 100644 index 1e0bd3b057..0000000000 --- a/vendor/libgit2/tests/resources/push_src/.gitted/objects/b4/83ae7ba66decee9aee971f501221dea84b1498 +++ /dev/null @@ -1,3 +0,0 @@ -x5ŤK -1D]罥;1i"^Ŕ•'čÎô|d`dŚ ooqQE˝Í«*Pŕݢ+ -á 3…$, }ě%˘Rßw¬É+sç9»úy輨«ÍĐrřĂ`+ܦ2ŠÍp/ă[m­p~µuÝę8-—öS™r„=˘Ű,?ĂZ+g \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/push_src/.gitted/objects/b4/e1f2b375a64c1ccd40c5ff6aa8bc96839ba4fd b/vendor/libgit2/tests/resources/push_src/.gitted/objects/b4/e1f2b375a64c1ccd40c5ff6aa8bc96839ba4fd deleted file mode 100644 index 4e650aaa1b..0000000000 Binary files a/vendor/libgit2/tests/resources/push_src/.gitted/objects/b4/e1f2b375a64c1ccd40c5ff6aa8bc96839ba4fd and /dev/null differ diff --git a/vendor/libgit2/tests/resources/push_src/.gitted/objects/c1/0409136a7a75e025fa502a1b2fd7b62b77d279 b/vendor/libgit2/tests/resources/push_src/.gitted/objects/c1/0409136a7a75e025fa502a1b2fd7b62b77d279 deleted file mode 100644 index fcb2b32f35..0000000000 Binary files a/vendor/libgit2/tests/resources/push_src/.gitted/objects/c1/0409136a7a75e025fa502a1b2fd7b62b77d279 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/push_src/.gitted/objects/cd/881f90f2933db2e4cc26b8c71fe6037ac7fe4c b/vendor/libgit2/tests/resources/push_src/.gitted/objects/cd/881f90f2933db2e4cc26b8c71fe6037ac7fe4c deleted file mode 100644 index ad42726381..0000000000 Binary files a/vendor/libgit2/tests/resources/push_src/.gitted/objects/cd/881f90f2933db2e4cc26b8c71fe6037ac7fe4c and /dev/null differ diff --git a/vendor/libgit2/tests/resources/push_src/.gitted/objects/d9/b63a88223d8367516f50bd131a5f7349b7f3e4 b/vendor/libgit2/tests/resources/push_src/.gitted/objects/d9/b63a88223d8367516f50bd131a5f7349b7f3e4 deleted file mode 100644 index b471e21550..0000000000 --- a/vendor/libgit2/tests/resources/push_src/.gitted/objects/d9/b63a88223d8367516f50bd131a5f7349b7f3e4 +++ /dev/null @@ -1,2 +0,0 @@ -x•ŽA -Â0E]çsËd¦Ó$ "x×i2Ő‚m¤¤¨··zwźŹ÷S™¦±‘ÝŐErŠ˝gjĂĐ ![ÍŽ%wbY(zC/ÁšG\t®ťw(‰{r$C`›Y…[ź=§DťC¨u&®őV8—ůúá˛Â!ýćs=]§8Ţ›T¦#|;ĐÂŃltűWőÓh«fM}UóĽQDM \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/push_src/.gitted/objects/dc/ab83249f6f9d1ed735d651352a80519339b591 b/vendor/libgit2/tests/resources/push_src/.gitted/objects/dc/ab83249f6f9d1ed735d651352a80519339b591 deleted file mode 100644 index 9f6b1502f8..0000000000 Binary files a/vendor/libgit2/tests/resources/push_src/.gitted/objects/dc/ab83249f6f9d1ed735d651352a80519339b591 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/push_src/.gitted/objects/ee/a4f2705eeec2db3813f2430829afce99cd00b5 b/vendor/libgit2/tests/resources/push_src/.gitted/objects/ee/a4f2705eeec2db3813f2430829afce99cd00b5 deleted file mode 100644 index b7b81d5e33..0000000000 Binary files a/vendor/libgit2/tests/resources/push_src/.gitted/objects/ee/a4f2705eeec2db3813f2430829afce99cd00b5 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/push_src/.gitted/objects/f7/8a3106c85fb549c65198b2a2086276c6174928 b/vendor/libgit2/tests/resources/push_src/.gitted/objects/f7/8a3106c85fb549c65198b2a2086276c6174928 deleted file mode 100644 index b9813576d2..0000000000 Binary files a/vendor/libgit2/tests/resources/push_src/.gitted/objects/f7/8a3106c85fb549c65198b2a2086276c6174928 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/push_src/.gitted/objects/f8/f7aefc2900a3d737cea9eee45729fd55761e1a b/vendor/libgit2/tests/resources/push_src/.gitted/objects/f8/f7aefc2900a3d737cea9eee45729fd55761e1a deleted file mode 100644 index 888354fc28..0000000000 Binary files a/vendor/libgit2/tests/resources/push_src/.gitted/objects/f8/f7aefc2900a3d737cea9eee45729fd55761e1a and /dev/null differ diff --git a/vendor/libgit2/tests/resources/push_src/.gitted/objects/fa/38b91f199934685819bea316186d8b008c52a2 b/vendor/libgit2/tests/resources/push_src/.gitted/objects/fa/38b91f199934685819bea316186d8b008c52a2 deleted file mode 100644 index 13d9bca20d..0000000000 --- a/vendor/libgit2/tests/resources/push_src/.gitted/objects/fa/38b91f199934685819bea316186d8b008c52a2 +++ /dev/null @@ -1,2 +0,0 @@ -x•˝J1„­ó§ŰĘ5›˙…‹>„urr˛n’eo‚řö {»™f[)ą°â©_DmIiµ7 -7Ĩ8ꔌ÷.ŕnśÜW)˛Ó_T;xë,×(ĂlĐi—[”D\K墓ÂXΓP–ůŃ?Űď­ß>ÜđW~Ť·Łř|_±•Wؤ»‚xćšs6éÜ×é˙Ićc¤ŹJ‹ăNP}™~ů ś-מë˝Á˛®/ťó„ł­Gî ű§X \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/push_src/.gitted/objects/ff/83aa4c5e5d28e3bcba2f5c6e2adc61286a4e5e b/vendor/libgit2/tests/resources/push_src/.gitted/objects/ff/83aa4c5e5d28e3bcba2f5c6e2adc61286a4e5e deleted file mode 100644 index 10f25eb7cc..0000000000 --- a/vendor/libgit2/tests/resources/push_src/.gitted/objects/ff/83aa4c5e5d28e3bcba2f5c6e2adc61286a4e5e +++ /dev/null @@ -1,4 +0,0 @@ -x5ÍM -1 `×=Eö˘4ÓNAÄ ¸ňýÉüČŔHŤ ooq‘Ç{›/G@ň»5=$+”SOÝ) nĄxâ≻Ř[Ć@4úy -h1Ú„v‡˙ĄÂmÎS”îyz'© -çWk×-ŽóziŮQc<ĂޢµfS~Âpv+… \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/push_src/.gitted/objects/ff/fe95c7fd0a37fa2ed702f8f93b56b2196b3925 b/vendor/libgit2/tests/resources/push_src/.gitted/objects/ff/fe95c7fd0a37fa2ed702f8f93b56b2196b3925 deleted file mode 100644 index 1cdc048c01..0000000000 Binary files a/vendor/libgit2/tests/resources/push_src/.gitted/objects/ff/fe95c7fd0a37fa2ed702f8f93b56b2196b3925 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/push_src/.gitted/objects/pack/dummy b/vendor/libgit2/tests/resources/push_src/.gitted/objects/pack/dummy deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/vendor/libgit2/tests/resources/push_src/.gitted/refs/heads/b1 b/vendor/libgit2/tests/resources/push_src/.gitted/refs/heads/b1 deleted file mode 100644 index afadf9d26d..0000000000 --- a/vendor/libgit2/tests/resources/push_src/.gitted/refs/heads/b1 +++ /dev/null @@ -1 +0,0 @@ -a78705c3b2725f931d3ee05348d83cc26700f247 diff --git a/vendor/libgit2/tests/resources/push_src/.gitted/refs/heads/b2 b/vendor/libgit2/tests/resources/push_src/.gitted/refs/heads/b2 deleted file mode 100644 index afadf9d26d..0000000000 --- a/vendor/libgit2/tests/resources/push_src/.gitted/refs/heads/b2 +++ /dev/null @@ -1 +0,0 @@ -a78705c3b2725f931d3ee05348d83cc26700f247 diff --git a/vendor/libgit2/tests/resources/push_src/.gitted/refs/heads/b3 b/vendor/libgit2/tests/resources/push_src/.gitted/refs/heads/b3 deleted file mode 100644 index 3056bb4363..0000000000 --- a/vendor/libgit2/tests/resources/push_src/.gitted/refs/heads/b3 +++ /dev/null @@ -1 +0,0 @@ -d9b63a88223d8367516f50bd131a5f7349b7f3e4 diff --git a/vendor/libgit2/tests/resources/push_src/.gitted/refs/heads/b4 b/vendor/libgit2/tests/resources/push_src/.gitted/refs/heads/b4 deleted file mode 100644 index efed6f0649..0000000000 --- a/vendor/libgit2/tests/resources/push_src/.gitted/refs/heads/b4 +++ /dev/null @@ -1 +0,0 @@ -27b7ce66243eb1403862d05f958c002312df173d diff --git a/vendor/libgit2/tests/resources/push_src/.gitted/refs/heads/b5 b/vendor/libgit2/tests/resources/push_src/.gitted/refs/heads/b5 deleted file mode 100644 index cf313ad05e..0000000000 --- a/vendor/libgit2/tests/resources/push_src/.gitted/refs/heads/b5 +++ /dev/null @@ -1 +0,0 @@ -fa38b91f199934685819bea316186d8b008c52a2 diff --git a/vendor/libgit2/tests/resources/push_src/.gitted/refs/heads/b6 b/vendor/libgit2/tests/resources/push_src/.gitted/refs/heads/b6 deleted file mode 100644 index 711e466ae7..0000000000 --- a/vendor/libgit2/tests/resources/push_src/.gitted/refs/heads/b6 +++ /dev/null @@ -1 +0,0 @@ -951bbbb90e2259a4c8950db78946784fb53fcbce diff --git a/vendor/libgit2/tests/resources/push_src/a.txt b/vendor/libgit2/tests/resources/push_src/a.txt deleted file mode 100644 index f7eac1c515..0000000000 --- a/vendor/libgit2/tests/resources/push_src/a.txt +++ /dev/null @@ -1,2 +0,0 @@ -a -edit diff --git a/vendor/libgit2/tests/resources/push_src/fold/b.txt b/vendor/libgit2/tests/resources/push_src/fold/b.txt deleted file mode 100644 index 6178079822..0000000000 --- a/vendor/libgit2/tests/resources/push_src/fold/b.txt +++ /dev/null @@ -1 +0,0 @@ -b diff --git a/vendor/libgit2/tests/resources/push_src/foldb.txt b/vendor/libgit2/tests/resources/push_src/foldb.txt deleted file mode 100644 index 5b38718bec..0000000000 --- a/vendor/libgit2/tests/resources/push_src/foldb.txt +++ /dev/null @@ -1 +0,0 @@ -edit diff --git a/vendor/libgit2/tests/resources/push_src/gitmodules b/vendor/libgit2/tests/resources/push_src/gitmodules deleted file mode 100644 index f1734dfc1f..0000000000 --- a/vendor/libgit2/tests/resources/push_src/gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "submodule"] - path = submodule - url = ../testrepo.git diff --git a/vendor/libgit2/tests/resources/push_src/submodule/.gitted b/vendor/libgit2/tests/resources/push_src/submodule/.gitted deleted file mode 100644 index 3ffcf960a5..0000000000 --- a/vendor/libgit2/tests/resources/push_src/submodule/.gitted +++ /dev/null @@ -1 +0,0 @@ -gitdir: ../.git/modules/submodule diff --git a/vendor/libgit2/tests/resources/push_src/submodule/README b/vendor/libgit2/tests/resources/push_src/submodule/README deleted file mode 100644 index ca8c647285..0000000000 --- a/vendor/libgit2/tests/resources/push_src/submodule/README +++ /dev/null @@ -1 +0,0 @@ -hey there diff --git a/vendor/libgit2/tests/resources/push_src/submodule/branch_file.txt b/vendor/libgit2/tests/resources/push_src/submodule/branch_file.txt deleted file mode 100644 index a26902575e..0000000000 --- a/vendor/libgit2/tests/resources/push_src/submodule/branch_file.txt +++ /dev/null @@ -1,2 +0,0 @@ -hi -bye! diff --git a/vendor/libgit2/tests/resources/push_src/submodule/new.txt b/vendor/libgit2/tests/resources/push_src/submodule/new.txt deleted file mode 100644 index 8e0884e365..0000000000 --- a/vendor/libgit2/tests/resources/push_src/submodule/new.txt +++ /dev/null @@ -1 +0,0 @@ -my new file diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/HEAD b/vendor/libgit2/tests/resources/rebase/.gitted/HEAD deleted file mode 100644 index cb089cd89a..0000000000 --- a/vendor/libgit2/tests/resources/rebase/.gitted/HEAD +++ /dev/null @@ -1 +0,0 @@ -ref: refs/heads/master diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/config b/vendor/libgit2/tests/resources/rebase/.gitted/config deleted file mode 100644 index 17e58b1c21..0000000000 --- a/vendor/libgit2/tests/resources/rebase/.gitted/config +++ /dev/null @@ -1,4 +0,0 @@ -[core] - repositoryformatversion = 0 - bare = false - logallrefupdates = true diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/index b/vendor/libgit2/tests/resources/rebase/.gitted/index deleted file mode 100644 index 0f53a21673..0000000000 Binary files a/vendor/libgit2/tests/resources/rebase/.gitted/index and /dev/null differ diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/info/exclude b/vendor/libgit2/tests/resources/rebase/.gitted/info/exclude deleted file mode 100644 index a5196d1be8..0000000000 --- a/vendor/libgit2/tests/resources/rebase/.gitted/info/exclude +++ /dev/null @@ -1,6 +0,0 @@ -# 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/vendor/libgit2/tests/resources/rebase/.gitted/logs/HEAD b/vendor/libgit2/tests/resources/rebase/.gitted/logs/HEAD deleted file mode 100644 index 62d3b164ee..0000000000 --- a/vendor/libgit2/tests/resources/rebase/.gitted/logs/HEAD +++ /dev/null @@ -1 +0,0 @@ -efad0b11c47cb2f0220cbd6f5b0f93bb99064b00 efad0b11c47cb2f0220cbd6f5b0f93bb99064b00 Edward Thomson 1405623541 -0400 checkout: moving from master to master diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/00/66204dd469ee930e551fbcf123f98e211c99ce b/vendor/libgit2/tests/resources/rebase/.gitted/objects/00/66204dd469ee930e551fbcf123f98e211c99ce deleted file mode 100644 index e6f72ce240..0000000000 Binary files a/vendor/libgit2/tests/resources/rebase/.gitted/objects/00/66204dd469ee930e551fbcf123f98e211c99ce and /dev/null differ diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/00/f1b9a0948a7d5d14405eba6030efcdfbb8ff4a b/vendor/libgit2/tests/resources/rebase/.gitted/objects/00/f1b9a0948a7d5d14405eba6030efcdfbb8ff4a deleted file mode 100644 index a23f526b57..0000000000 --- a/vendor/libgit2/tests/resources/rebase/.gitted/objects/00/f1b9a0948a7d5d14405eba6030efcdfbb8ff4a +++ /dev/null @@ -1,3 +0,0 @@ -xĄŽAnC! D»ćľ@*Ŕ𑪪YäŮGĺ/~(UŻZĺŮÍĽ‘f¦´}ßX -oŁ«B% -BU«#DGa‘‚9řě"R”H~±.-HćÎ]o}ń–µH-±HZSÎĹYLÉyĺIŘU/ëjřg\[‡“ür8_ŰţÝnđˇ“ţ©/ýžî˝´ýŹěĽfá€ŃL:Ď}±ĆE¶±ÍůVAú¦rą+› řT \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/01/3cc32d341bab0e6f039f50f153c18986f16c58 b/vendor/libgit2/tests/resources/rebase/.gitted/objects/01/3cc32d341bab0e6f039f50f153c18986f16c58 deleted file mode 100644 index 2e32bd3390..0000000000 Binary files a/vendor/libgit2/tests/resources/rebase/.gitted/objects/01/3cc32d341bab0e6f039f50f153c18986f16c58 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/01/a17f7d154ab5bf9f8bfede3d82dd00ddf7e7dc b/vendor/libgit2/tests/resources/rebase/.gitted/objects/01/a17f7d154ab5bf9f8bfede3d82dd00ddf7e7dc deleted file mode 100644 index c21329f336..0000000000 Binary files a/vendor/libgit2/tests/resources/rebase/.gitted/objects/01/a17f7d154ab5bf9f8bfede3d82dd00ddf7e7dc and /dev/null differ diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/02/2d3b6bbd0bfbdf147319476fb8bf405691cb0d b/vendor/libgit2/tests/resources/rebase/.gitted/objects/02/2d3b6bbd0bfbdf147319476fb8bf405691cb0d deleted file mode 100644 index b1f7468ac6..0000000000 Binary files a/vendor/libgit2/tests/resources/rebase/.gitted/objects/02/2d3b6bbd0bfbdf147319476fb8bf405691cb0d and /dev/null differ diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/05/3808a709cf91385985369159b296cf61a177ac b/vendor/libgit2/tests/resources/rebase/.gitted/objects/05/3808a709cf91385985369159b296cf61a177ac deleted file mode 100644 index c38c5b2559..0000000000 Binary files a/vendor/libgit2/tests/resources/rebase/.gitted/objects/05/3808a709cf91385985369159b296cf61a177ac and /dev/null differ diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/0e/f2e2b2a2b8d6e1f8dff5e621e0eca21b693d0c b/vendor/libgit2/tests/resources/rebase/.gitted/objects/0e/f2e2b2a2b8d6e1f8dff5e621e0eca21b693d0c deleted file mode 100644 index d8ef47c627..0000000000 --- a/vendor/libgit2/tests/resources/rebase/.gitted/objects/0e/f2e2b2a2b8d6e1f8dff5e621e0eca21b693d0c +++ /dev/null @@ -1,3 +0,0 @@ -xĄP»N1¤öWl— -´gŻíł„"J:~`˝^ç"ĺÎČ1Aü=‚/ ›—Fš‘¶®çnrwŁ«B‘Y9g/U­ -¦ä“ÄJ“÷ĚŃ‘Mµ$óĆ]·$,jĐHČ>K Ęěś"ĺY+FçĘĚ“Ťy»»˘3YL¤8kf™ĽÍ®„â3ÖZ]ŞI‚~Këđ\>¸x]Úzm<ę®~Ł'ý1~Ů´őˇÖ:"¸GB4»şŹúĎó˘ý´_Óy“§Î·Ďś·Ńŕ¦|1_"fi \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/0f/5f6d3353be1a9966fa5767b7d604b051798224 b/vendor/libgit2/tests/resources/rebase/.gitted/objects/0f/5f6d3353be1a9966fa5767b7d604b051798224 deleted file mode 100644 index 739aca383a..0000000000 Binary files a/vendor/libgit2/tests/resources/rebase/.gitted/objects/0f/5f6d3353be1a9966fa5767b7d604b051798224 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/11/fac10ca1b9318ce361a0be0c3d889d777e299c b/vendor/libgit2/tests/resources/rebase/.gitted/objects/11/fac10ca1b9318ce361a0be0c3d889d777e299c deleted file mode 100644 index 5af5474b55..0000000000 Binary files a/vendor/libgit2/tests/resources/rebase/.gitted/objects/11/fac10ca1b9318ce361a0be0c3d889d777e299c and /dev/null differ diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/12/c084412b952396962eb420716df01022b847cc b/vendor/libgit2/tests/resources/rebase/.gitted/objects/12/c084412b952396962eb420716df01022b847cc deleted file mode 100644 index 5244e469dc..0000000000 --- a/vendor/libgit2/tests/resources/rebase/.gitted/objects/12/c084412b952396962eb420716df01022b847cc +++ /dev/null @@ -1,2 +0,0 @@ -xĄŽKjC1łÖ)ćúĚčIB6^z— ڤäYAQ0ľ˝ăd×Ő Mĺľďm‚Ąř2‡¸Â8ł )!–m“JġČ"ډML¨ľyČe‚6.gg‹C“8ińU»XIWC.›ŻĆg -Šçą8–+Źźçľ˙ô ĽÉj˙҇<†'˝ćľżAMŢZô4j­V»d§üóFťziµežm) ̉ǗÜÔK€U \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/12/f28ed978639d331269d9dc2b74e87db58e1057 b/vendor/libgit2/tests/resources/rebase/.gitted/objects/12/f28ed978639d331269d9dc2b74e87db58e1057 deleted file mode 100644 index b0dbc3e073..0000000000 --- a/vendor/libgit2/tests/resources/rebase/.gitted/objects/12/f28ed978639d331269d9dc2b74e87db58e1057 +++ /dev/null @@ -1,3 +0,0 @@ -xĄO9nĂ0tÍWěbp)‰KF&e:`ą\Ú*$…|?´á¸›3‘ş,sçÝ©mŞ€XXĐ -cŠŃÁ#ۤV†BĚD¤.F1żĽéÚ€„R “F -sŘÉűBÖe'‰Čű%ä±>Ú˝nđť˙xËp˝×eŻ+\´«ôĄOăĹÎR—OŔ±—9ôăv´ÖtµŹmúfŤů©y.łp›ű„V÷ţ‡oÇnţB#Vj \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/19/14d57ddf6c5c997664521cc94f190df46dc1c2 b/vendor/libgit2/tests/resources/rebase/.gitted/objects/19/14d57ddf6c5c997664521cc94f190df46dc1c2 deleted file mode 100644 index 921f2cd880..0000000000 Binary files a/vendor/libgit2/tests/resources/rebase/.gitted/objects/19/14d57ddf6c5c997664521cc94f190df46dc1c2 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/1b/1d19799fcc89fa3cb821581fcf7f2e8fd2cc4d b/vendor/libgit2/tests/resources/rebase/.gitted/objects/1b/1d19799fcc89fa3cb821581fcf7f2e8fd2cc4d deleted file mode 100644 index 3d206b0cc1..0000000000 Binary files a/vendor/libgit2/tests/resources/rebase/.gitted/objects/1b/1d19799fcc89fa3cb821581fcf7f2e8fd2cc4d and /dev/null differ diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/1f/2214c1b13b134d5508f41f6a3b77cc6a8f5182 b/vendor/libgit2/tests/resources/rebase/.gitted/objects/1f/2214c1b13b134d5508f41f6a3b77cc6a8f5182 deleted file mode 100644 index 84b875c509..0000000000 Binary files a/vendor/libgit2/tests/resources/rebase/.gitted/objects/1f/2214c1b13b134d5508f41f6a3b77cc6a8f5182 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/20/db906c85e78c6dde82eb2ec6d3231c4b96fce8 b/vendor/libgit2/tests/resources/rebase/.gitted/objects/20/db906c85e78c6dde82eb2ec6d3231c4b96fce8 deleted file mode 100644 index 2a908da61f..0000000000 Binary files a/vendor/libgit2/tests/resources/rebase/.gitted/objects/20/db906c85e78c6dde82eb2ec6d3231c4b96fce8 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/22/adb22bef75a0371e85ff6d82e5e60e4b425501 b/vendor/libgit2/tests/resources/rebase/.gitted/objects/22/adb22bef75a0371e85ff6d82e5e60e4b425501 deleted file mode 100644 index 7f17ef059a..0000000000 Binary files a/vendor/libgit2/tests/resources/rebase/.gitted/objects/22/adb22bef75a0371e85ff6d82e5e60e4b425501 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/2a/a3ce842094e08ebac152b3d6d5b0fff39f9c6e b/vendor/libgit2/tests/resources/rebase/.gitted/objects/2a/a3ce842094e08ebac152b3d6d5b0fff39f9c6e deleted file mode 100644 index 38eca43dcf..0000000000 --- a/vendor/libgit2/tests/resources/rebase/.gitted/objects/2a/a3ce842094e08ebac152b3d6d5b0fff39f9c6e +++ /dev/null @@ -1 +0,0 @@ -xĄŽMn! Fłćľ@# 8RTeÓewą€Ť!™Ĺ„’V˝}hŐt÷ýHO/·m[¸…vŁ—Ńg$©H$ÄČb…•ڍŮW >*jUĚť{ą R4ˇÖd19ň™sD‘š\ÄCbŤĽđäQ0ü×ÖáMż¸+śŻműh78–ąţ¤Sů=ţÚ>·í0Ř%:ç-‹ ÖšąNŮQţ‰1ďM׺fëTp0\:~›'fĐUN \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/2b/4ebffd3111546d278bb5df62e5630930b605fb b/vendor/libgit2/tests/resources/rebase/.gitted/objects/2b/4ebffd3111546d278bb5df62e5630930b605fb deleted file mode 100644 index 5bdfc1e293..0000000000 Binary files a/vendor/libgit2/tests/resources/rebase/.gitted/objects/2b/4ebffd3111546d278bb5df62e5630930b605fb and /dev/null differ diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/30/69cc907e6294623e5917ef6de663928c1febfb b/vendor/libgit2/tests/resources/rebase/.gitted/objects/30/69cc907e6294623e5917ef6de663928c1febfb deleted file mode 100644 index edd86f7212..0000000000 --- a/vendor/libgit2/tests/resources/rebase/.gitted/objects/30/69cc907e6294623e5917ef6de663928c1febfb +++ /dev/null @@ -1 +0,0 @@ -xĄŽ;n1 DS뼀Rź] 07.ÓĺEÂ[¬eldřúŢľAş™7ŔŕI_×e€OóÇŘT!&Ć[ËĹUö5´ąR¬L–ŃP±¸oz+Ab)ižçFľř8±Ů«Ç÷qéśŰ·?—ľţö+u§餯áÝ>ĄŻ_@Óä)§Śn§»ěĐ޸ďŢ[„Dz+ŞŞą'ť TG \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/32/52a0692ace4c4c709f22011227d9dc4845f289 b/vendor/libgit2/tests/resources/rebase/.gitted/objects/32/52a0692ace4c4c709f22011227d9dc4845f289 deleted file mode 100644 index 2b2434f87f..0000000000 Binary files a/vendor/libgit2/tests/resources/rebase/.gitted/objects/32/52a0692ace4c4c709f22011227d9dc4845f289 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/33/f915f9e4dbd9f4b24430e48731a59b45b15500 b/vendor/libgit2/tests/resources/rebase/.gitted/objects/33/f915f9e4dbd9f4b24430e48731a59b45b15500 deleted file mode 100644 index c33f179bf6..0000000000 --- a/vendor/libgit2/tests/resources/rebase/.gitted/objects/33/f915f9e4dbd9f4b24430e48731a59b45b15500 +++ /dev/null @@ -1 +0,0 @@ -xĄŹŰi1Eó­*¦iViÁ„@Hi@Ź[­Â®LÚŹbÜ˙î.çćŢZ€ŢľŚť0YN"e1Ć8K}HÉ!dG‹^ťH;Ię'îĽ đŮ' ŽWIJvDâ5ĚÉ{˘´ćP¬¨x׾ĂgůŤ{ŻkoGßŕĚ3ýWď|/î”{{cç˘F‚WmµV3ť°źśQ}“ďšGÝ.Đz©Rsuââ1żĹËíPHľZŢ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/34/86a9d4cdf0b7b4a702c199eed541dc3af13a03 b/vendor/libgit2/tests/resources/rebase/.gitted/objects/34/86a9d4cdf0b7b4a702c199eed541dc3af13a03 deleted file mode 100644 index fdbe16d105..0000000000 --- a/vendor/libgit2/tests/resources/rebase/.gitted/objects/34/86a9d4cdf0b7b4a702c199eed541dc3af13a03 +++ /dev/null @@ -1 +0,0 @@ -xM˝nĂ0 „;ë)îŚ,ť‚L-Đ­@ţ e›Ž…Ң*QuüöĄ…č"Ç#ď#{–÷ÇăÝăĂëóÓ'Ţ^>ÎçÎU!:g"\sLč}fÚş?ů»ú¬M_˝Rî0ŃjMAbÁ`ý5u®„+źł± Ů'áăŘę!Ş` u&lĂž¨A·=MkŽ!µY®,žů„^#(.•7č*Ąć˛#QD˛Ô1™ÉÂ!IŤcŁ4‹Ë~řÚK‘öÂRU%@/l4ÍËdHł_:¬Ag$J‰r#/žőän …eý–xą9)[ľŃÖtŔ»,^ĄŔg˛1Ž®1ŰđăÔn;†ÎÁÎ$ćwż/ŹŠ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/3c/33b080bf75724c8899d8e703614cb59bfbd047 b/vendor/libgit2/tests/resources/rebase/.gitted/objects/3c/33b080bf75724c8899d8e703614cb59bfbd047 deleted file mode 100644 index 8716898f8b..0000000000 Binary files a/vendor/libgit2/tests/resources/rebase/.gitted/objects/3c/33b080bf75724c8899d8e703614cb59bfbd047 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/3d/a85aca38a95b44d77ef55a8deb445e49ba19b4 b/vendor/libgit2/tests/resources/rebase/.gitted/objects/3d/a85aca38a95b44d77ef55a8deb445e49ba19b4 deleted file mode 100644 index fa6d9468d9..0000000000 Binary files a/vendor/libgit2/tests/resources/rebase/.gitted/objects/3d/a85aca38a95b44d77ef55a8deb445e49ba19b4 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/3e/8989b5a16d5258c935d998ef0e6bb139cc4757 b/vendor/libgit2/tests/resources/rebase/.gitted/objects/3e/8989b5a16d5258c935d998ef0e6bb139cc4757 deleted file mode 100644 index 1bbf138ef8..0000000000 --- a/vendor/libgit2/tests/resources/rebase/.gitted/objects/3e/8989b5a16d5258c935d998ef0e6bb139cc4757 +++ /dev/null @@ -1,2 +0,0 @@ -xĄŽKj1 †»ö)tů1¶Jé&ËězŤ%C'.®›\?nČ şűđńĺ¶ďu€[ŇËčŞPЦŐÓŠ™"ĺŔ›%¬Cń˘0+›oîzrÚ --ş&*V,e\b, ť¸ĽĄă¶f’P ˙Žsëp”wĎsŰÚŢt®éCÇł˝ć¶ż ćśwÓÍ\§ěĐbĚ©I-5ó¨SÁÂhpUţ2w_ÎT diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/3f/05a038dd89f51ba2b3d7b14ba1f8c00f0e31ac b/vendor/libgit2/tests/resources/rebase/.gitted/objects/3f/05a038dd89f51ba2b3d7b14ba1f8c00f0e31ac deleted file mode 100644 index 26bd353f74..0000000000 Binary files a/vendor/libgit2/tests/resources/rebase/.gitted/objects/3f/05a038dd89f51ba2b3d7b14ba1f8c00f0e31ac and /dev/null differ diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/3f/d8d53cf02de539b9a25a5941030451f76a152f b/vendor/libgit2/tests/resources/rebase/.gitted/objects/3f/d8d53cf02de539b9a25a5941030451f76a152f deleted file mode 100644 index 91c4d957e1..0000000000 Binary files a/vendor/libgit2/tests/resources/rebase/.gitted/objects/3f/d8d53cf02de539b9a25a5941030451f76a152f and /dev/null differ diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/40/0d89e8ee6cd91b67b1f45de1ca190e1c580c6f b/vendor/libgit2/tests/resources/rebase/.gitted/objects/40/0d89e8ee6cd91b67b1f45de1ca190e1c580c6f deleted file mode 100644 index f674753709..0000000000 --- a/vendor/libgit2/tests/resources/rebase/.gitted/objects/40/0d89e8ee6cd91b67b1f45de1ca190e1c580c6f +++ /dev/null @@ -1 +0,0 @@ -xĄO;Â0 eÎ)|P·•badăqC‡6¨ âúÄ ŘŢGzźT¦i¬ŕÉoę’3Xď™Ĺ˛˛¨ ş!t¤Üł»§Á%¶bqÉsQAń{OÔ$†>ŠďI1aPTb´ëM|Ö{Yŕ,ݏ\ďeZË ‡ÜÔ:ĺŻńc»T¦#¸OťwÔ!lm°Ö4µŤ­ůĎs)2ębŰ„Z ®íOĽ=Wó>{VT \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/41/4dfc71ead79c07acd4ea47fecf91f289afc4b9 b/vendor/libgit2/tests/resources/rebase/.gitted/objects/41/4dfc71ead79c07acd4ea47fecf91f289afc4b9 deleted file mode 100644 index 546815ea85..0000000000 Binary files a/vendor/libgit2/tests/resources/rebase/.gitted/objects/41/4dfc71ead79c07acd4ea47fecf91f289afc4b9 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/41/c5a0a761bb4a7670924c1af0800b30fe9a21be b/vendor/libgit2/tests/resources/rebase/.gitted/objects/41/c5a0a761bb4a7670924c1af0800b30fe9a21be deleted file mode 100644 index ecb399264b..0000000000 Binary files a/vendor/libgit2/tests/resources/rebase/.gitted/objects/41/c5a0a761bb4a7670924c1af0800b30fe9a21be and /dev/null differ diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/42/cdad903aef3e7b614675e6584a8be417941911 b/vendor/libgit2/tests/resources/rebase/.gitted/objects/42/cdad903aef3e7b614675e6584a8be417941911 deleted file mode 100644 index 99b5e6d2c8..0000000000 Binary files a/vendor/libgit2/tests/resources/rebase/.gitted/objects/42/cdad903aef3e7b614675e6584a8be417941911 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/44/c801fe026abbc141b52a4dec5df15fa98249c6 b/vendor/libgit2/tests/resources/rebase/.gitted/objects/44/c801fe026abbc141b52a4dec5df15fa98249c6 deleted file mode 100644 index eaf24ae462..0000000000 Binary files a/vendor/libgit2/tests/resources/rebase/.gitted/objects/44/c801fe026abbc141b52a4dec5df15fa98249c6 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/4b/21eb6eeeec7f8fc89a1d334faff9bd5f5f8c34 b/vendor/libgit2/tests/resources/rebase/.gitted/objects/4b/21eb6eeeec7f8fc89a1d334faff9bd5f5f8c34 deleted file mode 100644 index 0c9f4b9444..0000000000 --- a/vendor/libgit2/tests/resources/rebase/.gitted/objects/4b/21eb6eeeec7f8fc89a1d334faff9bd5f5f8c34 +++ /dev/null @@ -1,2 +0,0 @@ -xĄŹ]J1„}Î)úJOŇ™L`AĽčt:»3‘™,^ß(ŢŔ·úâ+é­Ő6ĐĂ8TÁ‰s 7L%ř`I¶-ĆĽi@·.$ÉÇTRF -ć“Ýlľ8ŤÂQ±8—iˇ•‹J”¤ží:g<"ľŹ[?ŕ-ń‘áýÖŰŮw¸čLÔ‹ţîIz{†…ĐŻÖbpđ„hf:a‡ţsĆĽö˝|TużBëą–*<ęÄ!řśßřz?Í72ZÝ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/4b/7c5650008b2e747fe1809eeb5a1dde0e80850a b/vendor/libgit2/tests/resources/rebase/.gitted/objects/4b/7c5650008b2e747fe1809eeb5a1dde0e80850a deleted file mode 100644 index 016398531e..0000000000 Binary files a/vendor/libgit2/tests/resources/rebase/.gitted/objects/4b/7c5650008b2e747fe1809eeb5a1dde0e80850a and /dev/null differ diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/4b/ed71df7017283cac61bbf726197ad6a5a18b84 b/vendor/libgit2/tests/resources/rebase/.gitted/objects/4b/ed71df7017283cac61bbf726197ad6a5a18b84 deleted file mode 100644 index f206618f19..0000000000 --- a/vendor/libgit2/tests/resources/rebase/.gitted/objects/4b/ed71df7017283cac61bbf726197ad6a5a18b84 +++ /dev/null @@ -1,2 +0,0 @@ -xĄŽ;nB1ES{ł Űř3–PD“’.ŹÇáGĆ€Ř=bt÷#nëş °?FAdÖ’IťO‰ĹÎh$ŰśI¶[ -Ϋ?ęr9ćŠ^RÄjŠAÖ>„µ-–sŚ!äÄX\UtÇÖá»Ü¨ř9¶őÜN°“ąţ§˝<ŹWŰp[żŔ¸ łÖ& źÚi­ć:e‡Ľ‰Q‡V–ş0Ťe* ~;]ďęM˙U9 \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/4c/acc6f6e740a5bc64faa33e04b8ef0733d8a127 b/vendor/libgit2/tests/resources/rebase/.gitted/objects/4c/acc6f6e740a5bc64faa33e04b8ef0733d8a127 deleted file mode 100644 index 36a6b31fa5..0000000000 Binary files a/vendor/libgit2/tests/resources/rebase/.gitted/objects/4c/acc6f6e740a5bc64faa33e04b8ef0733d8a127 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/4f/b698bde45d7d2833e3f2aacfbfe8a7e7f60a65 b/vendor/libgit2/tests/resources/rebase/.gitted/objects/4f/b698bde45d7d2833e3f2aacfbfe8a7e7f60a65 deleted file mode 100644 index 8bb69d099e..0000000000 Binary files a/vendor/libgit2/tests/resources/rebase/.gitted/objects/4f/b698bde45d7d2833e3f2aacfbfe8a7e7f60a65 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/50/8be4ff49d38465ad3de58f66d38f70e59f881f b/vendor/libgit2/tests/resources/rebase/.gitted/objects/50/8be4ff49d38465ad3de58f66d38f70e59f881f deleted file mode 100644 index 7ce4452b20..0000000000 Binary files a/vendor/libgit2/tests/resources/rebase/.gitted/objects/50/8be4ff49d38465ad3de58f66d38f70e59f881f and /dev/null differ diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/53/f75e45a463033854e52fa8d39dc858e45537d0 b/vendor/libgit2/tests/resources/rebase/.gitted/objects/53/f75e45a463033854e52fa8d39dc858e45537d0 deleted file mode 100644 index f25ef1f732..0000000000 Binary files a/vendor/libgit2/tests/resources/rebase/.gitted/objects/53/f75e45a463033854e52fa8d39dc858e45537d0 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/58/8e5d2f04d49707fe4aab865e1deacaf7ef6787 b/vendor/libgit2/tests/resources/rebase/.gitted/objects/58/8e5d2f04d49707fe4aab865e1deacaf7ef6787 deleted file mode 100644 index 766adc10c9..0000000000 --- a/vendor/libgit2/tests/resources/rebase/.gitted/objects/58/8e5d2f04d49707fe4aab865e1deacaf7ef6787 +++ /dev/null @@ -1 +0,0 @@ -xĄŽK!D]sŠľ€†o‰1n\şóĐ4™YĚ`FŚ×Ť7pWő*©ţÔś†rťS57jÜŔ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/6d/fb87d20f3dbca02da4a39890114fd9ba6a51e7 b/vendor/libgit2/tests/resources/rebase/.gitted/objects/6d/fb87d20f3dbca02da4a39890114fd9ba6a51e7 deleted file mode 100644 index 039c669aa4..0000000000 Binary files a/vendor/libgit2/tests/resources/rebase/.gitted/objects/6d/fb87d20f3dbca02da4a39890114fd9ba6a51e7 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/73/f346c88d965227a03c0af8d555870b8c5021d4 b/vendor/libgit2/tests/resources/rebase/.gitted/objects/73/f346c88d965227a03c0af8d555870b8c5021d4 deleted file mode 100644 index 215df59d8c..0000000000 Binary files a/vendor/libgit2/tests/resources/rebase/.gitted/objects/73/f346c88d965227a03c0af8d555870b8c5021d4 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/74/0a804e8963759c98e5b8cb912e15ae74a7a4a6 b/vendor/libgit2/tests/resources/rebase/.gitted/objects/74/0a804e8963759c98e5b8cb912e15ae74a7a4a6 deleted file mode 100644 index b817182792..0000000000 Binary files a/vendor/libgit2/tests/resources/rebase/.gitted/objects/74/0a804e8963759c98e5b8cb912e15ae74a7a4a6 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/78/c320b06544e23d786a9ec84ee93861f2933094 b/vendor/libgit2/tests/resources/rebase/.gitted/objects/78/c320b06544e23d786a9ec84ee93861f2933094 deleted file mode 100644 index afa39fb97a..0000000000 Binary files a/vendor/libgit2/tests/resources/rebase/.gitted/objects/78/c320b06544e23d786a9ec84ee93861f2933094 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/79/e28694aae0d3064b06f96a5207b943a2357f07 b/vendor/libgit2/tests/resources/rebase/.gitted/objects/79/e28694aae0d3064b06f96a5207b943a2357f07 deleted file mode 100644 index 17ff306f1b..0000000000 Binary files a/vendor/libgit2/tests/resources/rebase/.gitted/objects/79/e28694aae0d3064b06f96a5207b943a2357f07 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/7a/05900f340af0252aaa4e34941f040c5d2fe7f7 b/vendor/libgit2/tests/resources/rebase/.gitted/objects/7a/05900f340af0252aaa4e34941f040c5d2fe7f7 deleted file mode 100644 index 43201f89b9..0000000000 Binary files a/vendor/libgit2/tests/resources/rebase/.gitted/objects/7a/05900f340af0252aaa4e34941f040c5d2fe7f7 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/7a/677f6201c8f9d46bdfe1f4b08cb504e360a34e b/vendor/libgit2/tests/resources/rebase/.gitted/objects/7a/677f6201c8f9d46bdfe1f4b08cb504e360a34e deleted file mode 100644 index dc2fd5a364..0000000000 Binary files a/vendor/libgit2/tests/resources/rebase/.gitted/objects/7a/677f6201c8f9d46bdfe1f4b08cb504e360a34e and /dev/null differ diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/7c/7bf85e978f1d18c0566f702d2cb7766b9c8d4f b/vendor/libgit2/tests/resources/rebase/.gitted/objects/7c/7bf85e978f1d18c0566f702d2cb7766b9c8d4f deleted file mode 100644 index fe8b15777c..0000000000 --- a/vendor/libgit2/tests/resources/rebase/.gitted/objects/7c/7bf85e978f1d18c0566f702d2cb7766b9c8d4f +++ /dev/null @@ -1 +0,0 @@ -xĄŤ±NÄ0D©ý««ádç'‘‚ úýĆŢ\VŠ˝‘í\~ź€řş™÷¤/1r…¦w5m|Ŕ0č ŇtˇntĆş®%×öű‘¬ékcnu– ďaÇŕ:K,’ŕ™ú“^éWüµł—řĆęÖ5¦í5ňšĐĎÉ[4Ôd‚ĚA\~ökmđ!?ą |]ëö¨78é /wŃwń—\·3ř0Í ââě§0MnĐq¶ë?gÜg•b…s/ăB€j ­¨|ß5»_X$W‡ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/80/32d630f37266bace093e353f7b97d7f8b20950 b/vendor/libgit2/tests/resources/rebase/.gitted/objects/80/32d630f37266bace093e353f7b97d7f8b20950 deleted file mode 100644 index 07050dfd44..0000000000 Binary files a/vendor/libgit2/tests/resources/rebase/.gitted/objects/80/32d630f37266bace093e353f7b97d7f8b20950 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/80/dce0e74f0534811db734a68c23b49f98584d7a b/vendor/libgit2/tests/resources/rebase/.gitted/objects/80/dce0e74f0534811db734a68c23b49f98584d7a deleted file mode 100644 index 1b98b0a6ff..0000000000 --- a/vendor/libgit2/tests/resources/rebase/.gitted/objects/80/dce0e74f0534811db734a68c23b49f98584d7a +++ /dev/null @@ -1,2 +0,0 @@ -xERÍNĂ0 ćś§đTÜHś* ¶Šm¦îj5KBâ0ííq˛§¦©ýý¶·ľ‡»‡ű›v×µźíëa»íˇ»UjŻg„ŃçVÇ#Bźť™0A§ Ł>ćÔ@2QbpdĐ^x:ěaűňŰÍ -Ţ6Ok% ˇÝ<Ă®}ß?*= Ŕg_YG®v ˝'{ŐĹdë ~ŐńW&FH~䦨٨m•|’ťčó±ČJ„ßxĺMµř+Î+ľř—”8Od&8ĺÄĐ#„ĚJ,Ě%Š2ŠI€Ś•RuD•ň8’!tl/0x'Fxá®śŁ•źAŔ2KeµˇŮyq‹ń»ţ9ÜŞđĘĂ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/83/53b9f9deff7c707f280e0f656c80772cca7cd9 b/vendor/libgit2/tests/resources/rebase/.gitted/objects/83/53b9f9deff7c707f280e0f656c80772cca7cd9 deleted file mode 100644 index a4a7e3aa3d..0000000000 --- a/vendor/libgit2/tests/resources/rebase/.gitted/objects/83/53b9f9deff7c707f280e0f656c80772cca7cd9 +++ /dev/null @@ -1,2 +0,0 @@ -xMAjĂ0E»Ö)ţL6]…¬ŇÚBh‚í@»”íq,*kTi\7·ďŘčJđçóćiĎ ·Ű‡§}y<|˘:]ÎcΗ§wÔŻĺဗ·ă±÷hlňt+ C"Â÷d“ä%ź­P*ĐÓ ŽCF; ¦XęíĎű˛<Őr›l¤6tëÜat®ĄB#âü âä¶PeJÁĹ•eňh˝ßˇaçáW -âo™1đ”ň˘DQ·ş€^#pBď~‘§Đ­–Z1ɶ_Ë(Đňö'*°ĘgŻ6kד* v,0;)FJ«y¶^vć.’=Ď˙Eŕ9\ďMJş_m§¸AÍŁΰ‰cč·%ďő°]çDo=† .#łöÍ óŚŠ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/85/258e426a341cc1aa035ac7f6d18f84fed2ab38 b/vendor/libgit2/tests/resources/rebase/.gitted/objects/85/258e426a341cc1aa035ac7f6d18f84fed2ab38 deleted file mode 100644 index af1106d6aa..0000000000 Binary files a/vendor/libgit2/tests/resources/rebase/.gitted/objects/85/258e426a341cc1aa035ac7f6d18f84fed2ab38 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/85/f34ce9ca9e0f33d4146afec9cbe5a26757500a b/vendor/libgit2/tests/resources/rebase/.gitted/objects/85/f34ce9ca9e0f33d4146afec9cbe5a26757500a deleted file mode 100644 index 03e75165ac..0000000000 Binary files a/vendor/libgit2/tests/resources/rebase/.gitted/objects/85/f34ce9ca9e0f33d4146afec9cbe5a26757500a and /dev/null differ diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/86/a5415741ed3754ccb0cac1fc19fd82587840a4 b/vendor/libgit2/tests/resources/rebase/.gitted/objects/86/a5415741ed3754ccb0cac1fc19fd82587840a4 deleted file mode 100644 index fe00a22e34..0000000000 Binary files a/vendor/libgit2/tests/resources/rebase/.gitted/objects/86/a5415741ed3754ccb0cac1fc19fd82587840a4 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/8d/1f13f93c4995760ac07d129246ac1ff64c0be9 b/vendor/libgit2/tests/resources/rebase/.gitted/objects/8d/1f13f93c4995760ac07d129246ac1ff64c0be9 deleted file mode 100644 index a66cfccb2b..0000000000 --- a/vendor/libgit2/tests/resources/rebase/.gitted/objects/8d/1f13f93c4995760ac07d129246ac1ff64c0be9 +++ /dev/null @@ -1,2 +0,0 @@ -xĄŽAnĂ0 {Ö+řMŮąôŘ[>@“âŁŔQďÇ-úÜvgĹh[ץĄéŁoî0P"Á±¨ł˛NX*ĆH4Y1ĺĚ©R.á&›_;MQh0$+CÎcĺ$łš`ŇšŚćÂAýŇ6ř¶§lçK[ďí -ßéo:ůßđßľ´­GŚi¤™á1ět—íţćMři¶ÔEĄ/»Ao0»×đâ›S€ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/8d/95ea62e621f1d38d230d9e7d206e41096d76af b/vendor/libgit2/tests/resources/rebase/.gitted/objects/8d/95ea62e621f1d38d230d9e7d206e41096d76af deleted file mode 100644 index 464de7c1c6..0000000000 Binary files a/vendor/libgit2/tests/resources/rebase/.gitted/objects/8d/95ea62e621f1d38d230d9e7d206e41096d76af and /dev/null differ diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/8f/4de6c781b9ff9cedfd7f9f9f224e744f97b259 b/vendor/libgit2/tests/resources/rebase/.gitted/objects/8f/4de6c781b9ff9cedfd7f9f9f224e744f97b259 deleted file mode 100644 index faa9389585..0000000000 --- a/vendor/libgit2/tests/resources/rebase/.gitted/objects/8f/4de6c781b9ff9cedfd7f9f9f224e744f97b259 +++ /dev/null @@ -1 +0,0 @@ -x+)JMU0·d040031QHJ,ĘI­Ô+©(a¨|Ô6eŐËlŢl?ł‚Řw:/2­g‡ŞJ)ĘLM‰/HM+tôýSřęúö5W^ą˙;?ńSçú#;a9$j \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/92/54a37fde7e97f9a28dee2967fdb2c5d1ed94e9 b/vendor/libgit2/tests/resources/rebase/.gitted/objects/92/54a37fde7e97f9a28dee2967fdb2c5d1ed94e9 deleted file mode 100644 index 10d6c134f7..0000000000 --- a/vendor/libgit2/tests/resources/rebase/.gitted/objects/92/54a37fde7e97f9a28dee2967fdb2c5d1ed94e9 +++ /dev/null @@ -1 +0,0 @@ -xERËnă0 ěY_Á0z+Z '5uč˘Îúśe…Ž…(–V˘äď—RŠöd‰Îp8­áéĺůAv{ŮĘÍĐA× űG!zůQĂşZř#ŰM oĂçj[wŕ&PŃ« N)VuPÁ,FŁ˝U 1f·pyŃłhÖĐokč›}WZŽ`Ő hĆ ?ĂUnšťĎ5¤ě9g˘sKţŠő®­á°ë· aż«W50ó›\5źLˤá„,jťGHţ.ćŃ{ …0*KŻBľżChŕď ŰľËŮ×mŁ3ö.HĆ–ÓĎ4á_2Äăą‰Ş Z„O¶Ś|ákpé4óŃŕŢu#Ĺţ˛§âČń–*¸ÎFĎpI‘`D`ŹbTúśW‘ˇŢŃk.ň˝ŕ™SsĂM] ÍKÎGŢ´řIă›{VG¦ć« ź8’âŚ#J ;Ë˝ů‘'PڶČű(bš&Ł .dopäř˛Ń»vŃś¬KŐ#+ ˝{ţv‹á«üÉ?Š˙ĐwÇ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/95/39b2cc291d6a6b1b266df8474d31fdd344dd79 b/vendor/libgit2/tests/resources/rebase/.gitted/objects/95/39b2cc291d6a6b1b266df8474d31fdd344dd79 deleted file mode 100644 index 9649434732..0000000000 Binary files a/vendor/libgit2/tests/resources/rebase/.gitted/objects/95/39b2cc291d6a6b1b266df8474d31fdd344dd79 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/9a/8535dfcaf7554c728d874f047c5461fb2c71d1 b/vendor/libgit2/tests/resources/rebase/.gitted/objects/9a/8535dfcaf7554c728d874f047c5461fb2c71d1 deleted file mode 100644 index d997426b2d..0000000000 Binary files a/vendor/libgit2/tests/resources/rebase/.gitted/objects/9a/8535dfcaf7554c728d874f047c5461fb2c71d1 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/9c/d483e7da23819d7f71d24e9843812337886753 b/vendor/libgit2/tests/resources/rebase/.gitted/objects/9c/d483e7da23819d7f71d24e9843812337886753 deleted file mode 100644 index d168455068..0000000000 --- a/vendor/libgit2/tests/resources/rebase/.gitted/objects/9c/d483e7da23819d7f71d24e9843812337886753 +++ /dev/null @@ -1 +0,0 @@ -xMAjĂ0E»Ö)ţL6]…¬ŇÚ€ŰŰv)ŰăXTѨҨ®o_ŮčJđçóćiZË-·Ű‡§}U>Qź.çŤRçKÓ;š×ępŔ˱,kđ€VKsľ“—|ŇBˇŔ@Řv]$_¨úřç}Uťš± ÚSíúunś0zÓQ‘#PĆŮ…éÄČĽP%güĘRőŰľ,whŮXÁ•śŘ21FN!.JäŕóVă0ä0‚çäúŐ2WTĐÝ×2r´ĽnI„]XĺŁÍ6k×RVő­Ŕdd„'ď)¬ćQ[Ů©»H´<ýew˝7)äýŮ6ů ľiá(cývdmţtßÉ7C>†Ś&"rî«?v„‹ę \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/a0/1a6ee390f65d834375e072952deaee0c5e92f7 b/vendor/libgit2/tests/resources/rebase/.gitted/objects/a0/1a6ee390f65d834375e072952deaee0c5e92f7 deleted file mode 100644 index eb98c9da52..0000000000 Binary files a/vendor/libgit2/tests/resources/rebase/.gitted/objects/a0/1a6ee390f65d834375e072952deaee0c5e92f7 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/a0/fa65f96c1e3bdc7287e334229279dcc1248fa4 b/vendor/libgit2/tests/resources/rebase/.gitted/objects/a0/fa65f96c1e3bdc7287e334229279dcc1248fa4 deleted file mode 100644 index fd43545ce7..0000000000 --- a/vendor/libgit2/tests/resources/rebase/.gitted/objects/a0/fa65f96c1e3bdc7287e334229279dcc1248fa4 +++ /dev/null @@ -1,3 +0,0 @@ -xERÍnĂ Ţ™§đD˝M›ÔS6µ«´i©šöqLŁľý ­şSŔ|ţ~ětĆuđúţöR·űúPťZh›Ó~%ıţŢŔ¶9ŕ§>|mŕăôűąŰ´ŕŃË Ď)VUAX­ĐÜ*P‰3€ł\¶jÍŽ» ›}[´=yqćgX$aŕ¦Ńů\HŇL±Ŕ<łů+M#Hđf+ťTÎ2-“†3W¬ft¶ü]ĚŁ÷ -a”†ÖBö=Đâŕ’d 9:§Í]´)§§ľ$MlĎ Te>™byćkpéśmEŤWĽëF -’óĺL…Čń”*XF­FS$č8ŁŕSE†zGë\ä{Á3§â† ˙C• d,9źí‹ç6ܣ왚;ŚÔ|â•”dĽ˘d9Y։ȏě€' •Ažw@Ó0hĄŃ’ąAĎëËAďÚEs0.ńŞşDĽ˛2ĐY›é‘õüÉŻÄ9ĎĚ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/a1/25b9b655932711abceaf8962948e6b601d67b6 b/vendor/libgit2/tests/resources/rebase/.gitted/objects/a1/25b9b655932711abceaf8962948e6b601d67b6 deleted file mode 100644 index 50bcee1092..0000000000 Binary files a/vendor/libgit2/tests/resources/rebase/.gitted/objects/a1/25b9b655932711abceaf8962948e6b601d67b6 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/a7/00acc970eccccc73be53cd269462176544e6d1 b/vendor/libgit2/tests/resources/rebase/.gitted/objects/a7/00acc970eccccc73be53cd269462176544e6d1 deleted file mode 100644 index e5c62dba73..0000000000 Binary files a/vendor/libgit2/tests/resources/rebase/.gitted/objects/a7/00acc970eccccc73be53cd269462176544e6d1 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/a7/b066537e6be7109abfe4ff97b675d4e077da20 b/vendor/libgit2/tests/resources/rebase/.gitted/objects/a7/b066537e6be7109abfe4ff97b675d4e077da20 deleted file mode 100644 index 54f9b66175..0000000000 Binary files a/vendor/libgit2/tests/resources/rebase/.gitted/objects/a7/b066537e6be7109abfe4ff97b675d4e077da20 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/aa/4c42aecdfc7cd989bbc3209934ea7cda3f4d88 b/vendor/libgit2/tests/resources/rebase/.gitted/objects/aa/4c42aecdfc7cd989bbc3209934ea7cda3f4d88 deleted file mode 100644 index 628c2d3a10..0000000000 --- a/vendor/libgit2/tests/resources/rebase/.gitted/objects/aa/4c42aecdfc7cd989bbc3209934ea7cda3f4d88 +++ /dev/null @@ -1 +0,0 @@ -xĄŤÁ B1D=§Šm@Ůý=Ř l˛~Ŕ¸#b÷F±o3o`^ŇZK‹~Ő›dfńL“Ď6ěŘ1GĎ9¦)Ě1 5ôč‹68ó“ĂeŃz×ěeĐO:ĘwřµMŇz€ÉˇßZë¦ÖčÍ CŢĺĎsb.˝ ˝fÔ®ň2o! Fw \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/ab/25a53ef5622d443ecb0492b7516725f0deac8f b/vendor/libgit2/tests/resources/rebase/.gitted/objects/ab/25a53ef5622d443ecb0492b7516725f0deac8f deleted file mode 100644 index 83ef51e265..0000000000 Binary files a/vendor/libgit2/tests/resources/rebase/.gitted/objects/ab/25a53ef5622d443ecb0492b7516725f0deac8f and /dev/null differ diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/ad/c97cfb874cdfb9d5ab17b54f3771dea6e02ccf b/vendor/libgit2/tests/resources/rebase/.gitted/objects/ad/c97cfb874cdfb9d5ab17b54f3771dea6e02ccf deleted file mode 100644 index cc7ccd0867..0000000000 Binary files a/vendor/libgit2/tests/resources/rebase/.gitted/objects/ad/c97cfb874cdfb9d5ab17b54f3771dea6e02ccf and /dev/null differ diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/ae/87cae12879a3c37d7cc994afc6395bcb0eaf99 b/vendor/libgit2/tests/resources/rebase/.gitted/objects/ae/87cae12879a3c37d7cc994afc6395bcb0eaf99 deleted file mode 100644 index 5c8469eb9e..0000000000 Binary files a/vendor/libgit2/tests/resources/rebase/.gitted/objects/ae/87cae12879a3c37d7cc994afc6395bcb0eaf99 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/b1/46bd7608eac53d9bf9e1a6963543588b555c64 b/vendor/libgit2/tests/resources/rebase/.gitted/objects/b1/46bd7608eac53d9bf9e1a6963543588b555c64 deleted file mode 100644 index 3e4b975a9d..0000000000 --- a/vendor/libgit2/tests/resources/rebase/.gitted/objects/b1/46bd7608eac53d9bf9e1a6963543588b555c64 +++ /dev/null @@ -1 +0,0 @@ -xĄŽÁj1 D{öWč,Że«B.=ćÖĐÚ»‡ŤĂĆ!ż_7ôsyĂ”¶mk‡@ůŁďŞ€Ć‚3NC±y¶–dšs.% !w“]ŻY©ó±ĆŻěłi™9‘bU)bY-eÎN}i;|×§ě~–¶ÝŰŽ:čź;ë«řO‡Ň¶`ô”2#|úč˝tśíú挻´şÚZ¤ŻăAo0«šűcJT/ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/b1/b94ec02f8ed87d0efa4c65fb38d5d6da7e8b32 b/vendor/libgit2/tests/resources/rebase/.gitted/objects/b1/b94ec02f8ed87d0efa4c65fb38d5d6da7e8b32 deleted file mode 100644 index d15c022462..0000000000 Binary files a/vendor/libgit2/tests/resources/rebase/.gitted/objects/b1/b94ec02f8ed87d0efa4c65fb38d5d6da7e8b32 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/b6/72b141d48c369fee6c4deeb32a904387594365 b/vendor/libgit2/tests/resources/rebase/.gitted/objects/b6/72b141d48c369fee6c4deeb32a904387594365 deleted file mode 100644 index d8cdb71ae1..0000000000 Binary files a/vendor/libgit2/tests/resources/rebase/.gitted/objects/b6/72b141d48c369fee6c4deeb32a904387594365 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/b7/c536a5883c8adaeb34d5e198c5a3dbbdc608b5 b/vendor/libgit2/tests/resources/rebase/.gitted/objects/b7/c536a5883c8adaeb34d5e198c5a3dbbdc608b5 deleted file mode 100644 index b59498472d..0000000000 Binary files a/vendor/libgit2/tests/resources/rebase/.gitted/objects/b7/c536a5883c8adaeb34d5e198c5a3dbbdc608b5 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/b9/f72b9158fa8c49fb4e4c10b26817ed867be803 b/vendor/libgit2/tests/resources/rebase/.gitted/objects/b9/f72b9158fa8c49fb4e4c10b26817ed867be803 deleted file mode 100644 index 970166755b..0000000000 --- a/vendor/libgit2/tests/resources/rebase/.gitted/objects/b9/f72b9158fa8c49fb4e4c10b26817ed867be803 +++ /dev/null @@ -1,3 +0,0 @@ -xĄO;N1 ĄžS¸Ű -d;Nf"!´ %=ĘÇaFb&«âö' {_[/Ő}ß:ň7˝©‚)yÉÖ¤‚śŐ}`¬Bb©Ě.ĺ2]BÓŁCt3Gʲ$ă|QuI˛j4<ŠYćŃ5Îţĺ‰."ÄŃ[6ŢyÇ…q&— 2ÇE攦píkmđ?BËđĽÖý˝pŻCýFgý1~Ů]Şű uĚă!ܢ NCăşţóĚô¤íU!¶p¤N1´7ý<Ávô -ąmš_.¦/ÚÚdŰ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/bc/cc8eabb5cfe2ec09959c7f4155aa73429fd604 b/vendor/libgit2/tests/resources/rebase/.gitted/objects/bc/cc8eabb5cfe2ec09959c7f4155aa73429fd604 deleted file mode 100644 index de778eb118..0000000000 Binary files a/vendor/libgit2/tests/resources/rebase/.gitted/objects/bc/cc8eabb5cfe2ec09959c7f4155aa73429fd604 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/c4/e6cca3ec6ae0148ed231f97257df8c311e015f b/vendor/libgit2/tests/resources/rebase/.gitted/objects/c4/e6cca3ec6ae0148ed231f97257df8c311e015f deleted file mode 100644 index 2bbf28f573..0000000000 --- a/vendor/libgit2/tests/resources/rebase/.gitted/objects/c4/e6cca3ec6ae0148ed231f97257df8c311e015f +++ /dev/null @@ -1 +0,0 @@ -x%P1nÄ0 ëěWđąCNE§N7¶čˇ:*‰’p¬Ô’/¸ßWÎmI‘”ú$=^^źź._ď?ż¸~|žC¸°ăĽ6©yTČ„A¨(#1eôĚÓé´“.†áŔ(ŹHto@̸K-aë°Ő°…ˇ´˛“sá1r6)&)8¸Ĺ·TęÖaʶ<0ׇżJ٢Ý[‡ťŚK‡5IJ˛˛­ČŔŞcáÁ¸q͓쌫r_Íۇ"u^@ĐČ7~X)—›÷2¸ Ýâ G…,ćĄf¬R¸ůĺ`BÚúÂ4¶3Ł˝ÁvQźř¤›HÖ©¦Öu­ęa˛b SwŢcJ q…)fĆ”čćO‚ůvűŤ×;‡í«Śź \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/c5/17380440ed78865ffe3fa130b9738615c76618 b/vendor/libgit2/tests/resources/rebase/.gitted/objects/c5/17380440ed78865ffe3fa130b9738615c76618 deleted file mode 100644 index b9a52a3106..0000000000 Binary files a/vendor/libgit2/tests/resources/rebase/.gitted/objects/c5/17380440ed78865ffe3fa130b9738615c76618 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/cb/20a10406172afd6ca3138ce36ecaf8b1269e8e b/vendor/libgit2/tests/resources/rebase/.gitted/objects/cb/20a10406172afd6ca3138ce36ecaf8b1269e8e deleted file mode 100644 index acd6bdc56c..0000000000 Binary files a/vendor/libgit2/tests/resources/rebase/.gitted/objects/cb/20a10406172afd6ca3138ce36ecaf8b1269e8e and /dev/null differ diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/d4/82e77aecb8e07da43e4cad6e0dcb59219e12af b/vendor/libgit2/tests/resources/rebase/.gitted/objects/d4/82e77aecb8e07da43e4cad6e0dcb59219e12af deleted file mode 100644 index af3bd174a7..0000000000 Binary files a/vendor/libgit2/tests/resources/rebase/.gitted/objects/d4/82e77aecb8e07da43e4cad6e0dcb59219e12af and /dev/null differ diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/d6/16d97082eb7bb2dc6f180a7cca940993b7a56f b/vendor/libgit2/tests/resources/rebase/.gitted/objects/d6/16d97082eb7bb2dc6f180a7cca940993b7a56f deleted file mode 100644 index fa2e8d9ef6..0000000000 --- a/vendor/libgit2/tests/resources/rebase/.gitted/objects/d6/16d97082eb7bb2dc6f180a7cca940993b7a56f +++ /dev/null @@ -1 +0,0 @@ -xĄNK uÍ)ćš)0-MŚqăŇť`Đ.Z ˘ĆۋƸ{˙ĽçyŞ É­jßůŃJ@ťśD7D”Ä6ô”Ľq‘byçŤVW.˛´"ł â¬ĆVC'žCGÚ›–$Ź)%3¦1ô˘ř^/ąŔ!>ąD8]ň|Ë lĄ©´—Żńc›çt©×„D°F‹¨šÚÎVůsFsśŇ¸N킚á\řńRoV< \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/d6/b9ec0dfb972a6815ace42545cde5f2631cd776 b/vendor/libgit2/tests/resources/rebase/.gitted/objects/d6/b9ec0dfb972a6815ace42545cde5f2631cd776 deleted file mode 100644 index 123970457b..0000000000 Binary files a/vendor/libgit2/tests/resources/rebase/.gitted/objects/d6/b9ec0dfb972a6815ace42545cde5f2631cd776 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/da/82b3a60c50cf5ac524ec3000d743447329465d b/vendor/libgit2/tests/resources/rebase/.gitted/objects/da/82b3a60c50cf5ac524ec3000d743447329465d deleted file mode 100644 index 352a13ad36..0000000000 Binary files a/vendor/libgit2/tests/resources/rebase/.gitted/objects/da/82b3a60c50cf5ac524ec3000d743447329465d and /dev/null differ diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/da/9c51a23d02d931a486f45ad18cda05cf5d2b94 b/vendor/libgit2/tests/resources/rebase/.gitted/objects/da/9c51a23d02d931a486f45ad18cda05cf5d2b94 deleted file mode 100644 index 85b78eed53..0000000000 --- a/vendor/libgit2/tests/resources/rebase/.gitted/objects/da/9c51a23d02d931a486f45ad18cda05cf5d2b94 +++ /dev/null @@ -1,2 +0,0 @@ -xĄŽ;!†­9Ĺ\@3ŔÂ@bŚŤĄťŕ1·X1+Ćë‹ĆŘýŹäËWڲ̌ŁM_™! 5Ő[KĆűś -c´lťĘ‘*IČŁCuO+ß:Pˇ,Áq¤ şęPĐy/„¦š’‰"–P'QéŮŻm…S}ĄµÂĺÚ–G»ÁžÇúIGţż¶+m9€žĚhň¶8!ޱŮÎbÔąŐYć’ú<4ô™YÔőŻS• \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/dc/12ac1e10f2be70e8ecd52132a08da98a309c3a b/vendor/libgit2/tests/resources/rebase/.gitted/objects/dc/12ac1e10f2be70e8ecd52132a08da98a309c3a deleted file mode 100644 index 9907248f80..0000000000 --- a/vendor/libgit2/tests/resources/rebase/.gitted/objects/dc/12ac1e10f2be70e8ecd52132a08da98a309c3a +++ /dev/null @@ -1 +0,0 @@ -xĄŽMJ1…]çĹě•ĘϤ¦Ad@\şóUIĹCw†LDĽ˝QĽ»÷ŢŹ/µm«…»ŃUAI1eq‹U<ůhKfO‘Ľgë$Ř#2/ćĘ]÷š ‰/%«Ť.¤Ůĺ(–ť-.źâä ڵuxÉźÜ3Ľ­m»µu®?鬿ŕŻ=¤¶= x$ŚD Üc@4sť˛C˙ycžWíý ®5]ęţ‡×–k©‰GťJFQ-ó şŹZy \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/df/d3d25264693fcd7348ad286f3c34f3f6b30918 b/vendor/libgit2/tests/resources/rebase/.gitted/objects/df/d3d25264693fcd7348ad286f3c34f3f6b30918 deleted file mode 100644 index 3de3fda62f..0000000000 Binary files a/vendor/libgit2/tests/resources/rebase/.gitted/objects/df/d3d25264693fcd7348ad286f3c34f3f6b30918 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/e4/f809f826c1a9fc929874bc0e4644dd2f2a1af4 b/vendor/libgit2/tests/resources/rebase/.gitted/objects/e4/f809f826c1a9fc929874bc0e4644dd2f2a1af4 deleted file mode 100644 index e475019053..0000000000 --- a/vendor/libgit2/tests/resources/rebase/.gitted/objects/e4/f809f826c1a9fc929874bc0e4644dd2f2a1af4 +++ /dev/null @@ -1,3 +0,0 @@ -xĄŽMŠ1„]çďůym'0—îĽ@%yÁŰ 1"ŢŢ8Ě fWő_Şëşt˛SŘô&Beç -Ü,ÖO15ćČľ`ň ÖÁxĂpČP?hrëpb Ią¤9ĺŕCŚÉY‚cÁ p…ł÷ -Ź~©ŤŽů‰–é|©ë˝Ţč[ý¤üí+ŐuO†ő´ł–YÓVłÖjĐ!Űĺź7ęTóR–„ľ C˝RD»ĘK˝˙XV \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/e5/2ff405da5b7e1e9b0929939fa8405d81fe8a45 b/vendor/libgit2/tests/resources/rebase/.gitted/objects/e5/2ff405da5b7e1e9b0929939fa8405d81fe8a45 deleted file mode 100644 index 30c1987ed0..0000000000 --- a/vendor/libgit2/tests/resources/rebase/.gitted/objects/e5/2ff405da5b7e1e9b0929939fa8405d81fe8a45 +++ /dev/null @@ -1,3 +0,0 @@ -xĄŽ;j1†]ës‘VŹ“&eşôaV3UěĘ( -ą~d“¤űđń•¶ďu€‹î4şZŠ"KFŤ×Ĺ/)&—c!,A˛ÓdîÔ倨v˄ٯ”8°őlqAŃÂşm«Ş'CßăÖ:Ľńu†Ź[ŰżÚ™ë#˝ĘóřkçŇö+؉ŠÎ…äá=˘™ë”ňOŚyo\µu*Xh -Ü«đç]ČüxV˘ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/e7/bb00c4eab291e08361fda376733a12b4150aa9 b/vendor/libgit2/tests/resources/rebase/.gitted/objects/e7/bb00c4eab291e08361fda376733a12b4150aa9 deleted file mode 100644 index da96e9d9c0..0000000000 Binary files a/vendor/libgit2/tests/resources/rebase/.gitted/objects/e7/bb00c4eab291e08361fda376733a12b4150aa9 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/e8/8cc0a6919a74599ce8e1dcb81eb2bbae33a645 b/vendor/libgit2/tests/resources/rebase/.gitted/objects/e8/8cc0a6919a74599ce8e1dcb81eb2bbae33a645 deleted file mode 100644 index e8ce1728b2..0000000000 Binary files a/vendor/libgit2/tests/resources/rebase/.gitted/objects/e8/8cc0a6919a74599ce8e1dcb81eb2bbae33a645 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/e9/5f47e016dcc70b0b888df8e40e97b8aabafd4c b/vendor/libgit2/tests/resources/rebase/.gitted/objects/e9/5f47e016dcc70b0b888df8e40e97b8aabafd4c deleted file mode 100644 index cc3312a473..0000000000 Binary files a/vendor/libgit2/tests/resources/rebase/.gitted/objects/e9/5f47e016dcc70b0b888df8e40e97b8aabafd4c and /dev/null differ diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/e9/f22c10ffb378446c0bbcab7ee3d9d5a0040672 b/vendor/libgit2/tests/resources/rebase/.gitted/objects/e9/f22c10ffb378446c0bbcab7ee3d9d5a0040672 deleted file mode 100644 index 3446b2f8a7..0000000000 --- a/vendor/libgit2/tests/resources/rebase/.gitted/objects/e9/f22c10ffb378446c0bbcab7ee3d9d5a0040672 +++ /dev/null @@ -1,2 +0,0 @@ -xMÍjĂ0„{ÖSĚ\z -9µ`Ú‚iB~=Ęö:•µŞ´Ş“·ďÚčiavývZĎ-ž·Ű§×—cSá´ż6Ć.gě?q~?Ö5Ţ>šćĐÚäé^AĆD„źb“äEź­PŞ0Đ ŽCFW%V&»:›«1wÉFęaCżî]Fď:ŞTiś_28ą/©RRpqÍ2y˛Ţďвóp‚+ńwČĚą¤Ľ Q@Ô«.`P ś0¸_Bäú•R-&Ůî{YZ怩pP€>{ĄY˝ži´S…ŮÉH1RZÉłő˛3ěyţĎáúpRŇűJ[âgž¬p†M¤1†nyŻ_Ŕö˝í Z†ŚNkbő›?ŚÂŤĘ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/ec/725f5639730640f91cd0be5f2d6d7ac5d69c79 b/vendor/libgit2/tests/resources/rebase/.gitted/objects/ec/725f5639730640f91cd0be5f2d6d7ac5d69c79 deleted file mode 100644 index 0fb3334db1..0000000000 Binary files a/vendor/libgit2/tests/resources/rebase/.gitted/objects/ec/725f5639730640f91cd0be5f2d6d7ac5d69c79 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/ed/f7b3ffde1624c60d2d6b1a2bb792d86de172e0 b/vendor/libgit2/tests/resources/rebase/.gitted/objects/ed/f7b3ffde1624c60d2d6b1a2bb792d86de172e0 deleted file mode 100644 index e2e98d6d88..0000000000 --- a/vendor/libgit2/tests/resources/rebase/.gitted/objects/ed/f7b3ffde1624c60d2d6b1a2bb792d86de172e0 +++ /dev/null @@ -1,3 +0,0 @@ -xĄOKN!uÍ)ęhˇ -ctá f?ú8˝čfŇbĽľ8™¸{źä}¸oŰ:`Iř0U¨Â…ŘZ¦Čb­HŞ-PKŃž‰‚hEő łąk=t@LÍrŇBŮ‚„Ě>!ůEnD­p–h®~ŹK?ŕC~ę!pşôí«ďđ˘SýCoz3îě‰űö -!úD± <úč˝›ę;ôź1î]dë¬ďźóő~ľjużZ’U„ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/ee/23c5eeedadf8595c0ff60a366d970a165e373d b/vendor/libgit2/tests/resources/rebase/.gitted/objects/ee/23c5eeedadf8595c0ff60a366d970a165e373d deleted file mode 100644 index b32600f785..0000000000 Binary files a/vendor/libgit2/tests/resources/rebase/.gitted/objects/ee/23c5eeedadf8595c0ff60a366d970a165e373d and /dev/null differ diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/ee/f0edde5daa94da5f297d4ddb5dfbc1980f0902 b/vendor/libgit2/tests/resources/rebase/.gitted/objects/ee/f0edde5daa94da5f297d4ddb5dfbc1980f0902 deleted file mode 100644 index e9b3f58c65..0000000000 Binary files a/vendor/libgit2/tests/resources/rebase/.gitted/objects/ee/f0edde5daa94da5f297d4ddb5dfbc1980f0902 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/ef/ad0b11c47cb2f0220cbd6f5b0f93bb99064b00 b/vendor/libgit2/tests/resources/rebase/.gitted/objects/ef/ad0b11c47cb2f0220cbd6f5b0f93bb99064b00 deleted file mode 100644 index 285e14056c..0000000000 --- a/vendor/libgit2/tests/resources/rebase/.gitted/objects/ef/ad0b11c47cb2f0220cbd6f5b0f93bb99064b00 +++ /dev/null @@ -1 +0,0 @@ -xĄŹ=nĂ0 …3ëĽ@ Š˘dŠ.»ĺ¬D&l¶‚^żjĐt{?ŔĂ÷J[ץ%:ő]r¤•)I`_ŠÁĄL–ŞĎ–Ů´’|…ěî˛ëÖaŚ3˘F1¤H"ÂxfoČXb%ÓÉ&'Ź~k;|ÔoŮ+\nm=ÚgéŻz×gńç^K[ßŔ3ĆD>Í ^Ćş‘Ř®˙śqź­.¶éË@ĐČ1ţČőq¸ć©V \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/f5/56d5fef35003561dc0b64b37057d7541239105 b/vendor/libgit2/tests/resources/rebase/.gitted/objects/f5/56d5fef35003561dc0b64b37057d7541239105 deleted file mode 100644 index f4143e1f55..0000000000 Binary files a/vendor/libgit2/tests/resources/rebase/.gitted/objects/f5/56d5fef35003561dc0b64b37057d7541239105 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/f6/3fa37e285bd11b0a7b48fa584a4091814a3ada b/vendor/libgit2/tests/resources/rebase/.gitted/objects/f6/3fa37e285bd11b0a7b48fa584a4091814a3ada deleted file mode 100644 index e650383a22..0000000000 Binary files a/vendor/libgit2/tests/resources/rebase/.gitted/objects/f6/3fa37e285bd11b0a7b48fa584a4091814a3ada and /dev/null differ diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/f7/5c193a1df47186727179f24867bc4d27a8991f b/vendor/libgit2/tests/resources/rebase/.gitted/objects/f7/5c193a1df47186727179f24867bc4d27a8991f deleted file mode 100644 index 618cb68148..0000000000 Binary files a/vendor/libgit2/tests/resources/rebase/.gitted/objects/f7/5c193a1df47186727179f24867bc4d27a8991f and /dev/null differ diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/f8/7d14a4a236582a0278a916340a793714256864 b/vendor/libgit2/tests/resources/rebase/.gitted/objects/f8/7d14a4a236582a0278a916340a793714256864 deleted file mode 100644 index 1d29712c5d..0000000000 --- a/vendor/libgit2/tests/resources/rebase/.gitted/objects/f8/7d14a4a236582a0278a916340a793714256864 +++ /dev/null @@ -1,2 +0,0 @@ -xĄŽKŠAD]×)ňUŮőqăŇťČÎ6ŘÖĐ–z}Űan0»N1‘Kŕ~hŃ[݆Š#ŽU˛«b–4cPŻLĆĽÄłŁGż´Žň˘Eŕ|ió˝Ýŕ[WúIýţÚ·y!ú”‡śaëŁ÷nĄ«l×޸S“É&¦>­ -ôOĄ«{äTČ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/fc/e0584b379f535e50e036db587db71884ea6b36 b/vendor/libgit2/tests/resources/rebase/.gitted/objects/fc/e0584b379f535e50e036db587db71884ea6b36 deleted file mode 100644 index ce8b2fb54a..0000000000 Binary files a/vendor/libgit2/tests/resources/rebase/.gitted/objects/fc/e0584b379f535e50e036db587db71884ea6b36 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/ff/b36e513f5fdf8a6ba850a20142676a2ac4807d b/vendor/libgit2/tests/resources/rebase/.gitted/objects/ff/b36e513f5fdf8a6ba850a20142676a2ac4807d deleted file mode 100644 index f655d12eaf..0000000000 Binary files a/vendor/libgit2/tests/resources/rebase/.gitted/objects/ff/b36e513f5fdf8a6ba850a20142676a2ac4807d and /dev/null differ diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/objects/ff/dfa89389040a87008c4ab1834120d3046daaea b/vendor/libgit2/tests/resources/rebase/.gitted/objects/ff/dfa89389040a87008c4ab1834120d3046daaea deleted file mode 100644 index 54c938e2e7..0000000000 Binary files a/vendor/libgit2/tests/resources/rebase/.gitted/objects/ff/dfa89389040a87008c4ab1834120d3046daaea and /dev/null differ diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/refs/heads/asparagus b/vendor/libgit2/tests/resources/rebase/.gitted/refs/heads/asparagus deleted file mode 100644 index a3c9d67c4a..0000000000 --- a/vendor/libgit2/tests/resources/rebase/.gitted/refs/heads/asparagus +++ /dev/null @@ -1 +0,0 @@ -4b21eb6eeeec7f8fc89a1d334faff9bd5f5f8c34 diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/refs/heads/barley b/vendor/libgit2/tests/resources/rebase/.gitted/refs/heads/barley deleted file mode 100644 index feab9443f2..0000000000 --- a/vendor/libgit2/tests/resources/rebase/.gitted/refs/heads/barley +++ /dev/null @@ -1 +0,0 @@ -12c084412b952396962eb420716df01022b847cc diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/refs/heads/beef b/vendor/libgit2/tests/resources/rebase/.gitted/refs/heads/beef deleted file mode 100644 index 1c69e6ac5f..0000000000 --- a/vendor/libgit2/tests/resources/rebase/.gitted/refs/heads/beef +++ /dev/null @@ -1 +0,0 @@ -b146bd7608eac53d9bf9e1a6963543588b555c64 diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/refs/heads/dried_pea b/vendor/libgit2/tests/resources/rebase/.gitted/refs/heads/dried_pea deleted file mode 100644 index 9ede6023c0..0000000000 --- a/vendor/libgit2/tests/resources/rebase/.gitted/refs/heads/dried_pea +++ /dev/null @@ -1 +0,0 @@ -7f37fe2d7320360f8a9118b1ed8fba6f38481679 diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/refs/heads/gravy b/vendor/libgit2/tests/resources/rebase/.gitted/refs/heads/gravy deleted file mode 100644 index 3753b73309..0000000000 --- a/vendor/libgit2/tests/resources/rebase/.gitted/refs/heads/gravy +++ /dev/null @@ -1 +0,0 @@ -d616d97082eb7bb2dc6f180a7cca940993b7a56f diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/refs/heads/green_pea b/vendor/libgit2/tests/resources/rebase/.gitted/refs/heads/green_pea deleted file mode 100644 index 3bffe27d1e..0000000000 --- a/vendor/libgit2/tests/resources/rebase/.gitted/refs/heads/green_pea +++ /dev/null @@ -1 +0,0 @@ -d482e77aecb8e07da43e4cad6e0dcb59219e12af diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/refs/heads/master b/vendor/libgit2/tests/resources/rebase/.gitted/refs/heads/master deleted file mode 100644 index abbe9cc15f..0000000000 --- a/vendor/libgit2/tests/resources/rebase/.gitted/refs/heads/master +++ /dev/null @@ -1 +0,0 @@ -efad0b11c47cb2f0220cbd6f5b0f93bb99064b00 diff --git a/vendor/libgit2/tests/resources/rebase/.gitted/refs/heads/veal b/vendor/libgit2/tests/resources/rebase/.gitted/refs/heads/veal deleted file mode 100644 index 484f489761..0000000000 --- a/vendor/libgit2/tests/resources/rebase/.gitted/refs/heads/veal +++ /dev/null @@ -1 +0,0 @@ -f87d14a4a236582a0278a916340a793714256864 diff --git a/vendor/libgit2/tests/resources/rebase/asparagus.txt b/vendor/libgit2/tests/resources/rebase/asparagus.txt deleted file mode 100644 index 67ed7afb25..0000000000 --- a/vendor/libgit2/tests/resources/rebase/asparagus.txt +++ /dev/null @@ -1,10 +0,0 @@ -ASPARAGUS SOUP. - -TAKE FOUR LARGE BUNCHES of asparagus, scrape it nicely, cut off one inch -OF THE TOPS, and lay them in water, chop the stalks and put them on the -FIRE WITH A PIECE OF BACON, a large onion cut up, and pepper and salt; -ADD TWO QUARTS OF WATER, boil them till the stalks are quite soft, then -PULP THEM THROUGH A SIEVE, and strain the water to it, which must be put -back in the pot; put into it a chicken cut up, with the tops of -asparagus which had been laid by, boil it until these last articles are -sufficiently done, thicken with flour, butter and milk, and serve it up. diff --git a/vendor/libgit2/tests/resources/rebase/beef.txt b/vendor/libgit2/tests/resources/rebase/beef.txt deleted file mode 100644 index 68f6182f4c..0000000000 --- a/vendor/libgit2/tests/resources/rebase/beef.txt +++ /dev/null @@ -1,22 +0,0 @@ -BEEF SOUP. - -Take the hind shin of beef, cut off all the flesh off the leg-bone, -which must be taken away entirely, or the soup will be greasy. Wash the -meat clean and lay it in a pot, sprinkle over it one small -table-spoonful of pounded black pepper, and two of salt; three onions -the size of a hen's egg, cut small, six small carrots scraped and cut -up, two small turnips pared and cut into dice; pour on three quarts of -water, cover the pot close, and keep it gently and steadily boiling five -hours, which will leave about three pints of clear soup; do not let the -pot boil over, but take off the scum carefully, as it rises. When it has -boiled four hours, put in a small bundle of thyme and parsley, and a -pint of celery cut small, or a tea-spoonful of celery seed pounded. -These latter ingredients would lose their delicate flavour if boiled too -much. Just before you take it up, brown it in the following manner: put -a small table-spoonful of nice brown sugar into an iron skillet, set it -on the fire and stir it till it melts and looks very dark, pour into it -a ladle full of the soup, a little at a time; stirring it all the while. -Strain this browning and mix it well with the soup; take out the bundle -of thyme and parsley, put the nicest pieces of meat in your tureen, and -pour on the soup and vegetables; put in some toasted bread cut in dice, -and serve it up. diff --git a/vendor/libgit2/tests/resources/rebase/bouilli.txt b/vendor/libgit2/tests/resources/rebase/bouilli.txt deleted file mode 100644 index 4b7c565000..0000000000 --- a/vendor/libgit2/tests/resources/rebase/bouilli.txt +++ /dev/null @@ -1,18 +0,0 @@ -SOUP WITH BOUILLI. - -Take the nicest part of the thick brisket of beef, about eight pounds, -put it into a pot with every thing directed for the other soup; make it -exactly in the same way, only put it on an hour sooner, that you may -have time to prepare the bouilli; after it has boiled five hours, take -out the beef, cover up the soup and set it near the fire that it may -keep hot. Take the skin off the beef, have the yelk of an egg well -beaten, dip a feather in it and wash the top of your beef, sprinkle over -it the crumb of stale bread finely grated, put it in a Dutch oven -previously heated, put the top on with coals enough to brown, but not -burn the beef; let it stand nearly an hour, and prepare your gravy -thus:--Take a sufficient quantity of soup and the vegetables boiled in -it; add to it a table-spoonful of red wine, and two of mushroom catsup, -thicken with a little bit of butter and a little brown flour; make it -very hot, pour it in your dish, and put the beef on it. Garnish it with -green pickle, cut in thin slices, serve up the soup in a tureen with -bits of toasted bread. diff --git a/vendor/libgit2/tests/resources/rebase/gravy.txt b/vendor/libgit2/tests/resources/rebase/gravy.txt deleted file mode 100644 index c4e6cca3ec..0000000000 --- a/vendor/libgit2/tests/resources/rebase/gravy.txt +++ /dev/null @@ -1,8 +0,0 @@ -GRAVY SOUP. - -Get eight pounds of coarse lean beef--wash it clean and lay it in your -pot, put in the same ingredients as for the shin soup, with the same -quantity of water, and follow the process directed for that. Strain the -soup through a sieve, and serve it up clear, with nothing more than -toasted bread in it; two table-spoonsful of mushroom catsup will add a -fine flavour to the soup. diff --git a/vendor/libgit2/tests/resources/rebase/oyster.txt b/vendor/libgit2/tests/resources/rebase/oyster.txt deleted file mode 100644 index 68af1fc740..0000000000 --- a/vendor/libgit2/tests/resources/rebase/oyster.txt +++ /dev/null @@ -1,13 +0,0 @@ -OYSTER SOUP. - -Wash and drain two quarts of oysters, put them on with three quarts of -water, three onions chopped up, two or three slices of lean ham, pepper -and salt; boil it till reduced one-half, strain it through a sieve, -return the liquid into the pot, put in one quart of fresh oysters, boil -it till they are sufficiently done, and thicken the soup with four -spoonsful of flour, two gills of rich cream, and the yelks of six new -laid eggs beaten well; boil it a few minutes after the thickening is put -in. Take care that it does not curdle, and that the flour is not in -lumps; serve it up with the last oysters that were put in. If the -flavour of thyme be agreeable, you may put in a little, but take care -that it does not boil in it long enough to discolour the soup. diff --git a/vendor/libgit2/tests/resources/rebase/veal.txt b/vendor/libgit2/tests/resources/rebase/veal.txt deleted file mode 100644 index a7b066537e..0000000000 --- a/vendor/libgit2/tests/resources/rebase/veal.txt +++ /dev/null @@ -1,18 +0,0 @@ -VEAL SOUP. - -Put into a pot three quarts of water, three onions cut small, one -spoonful of black pepper pounded, and two of salt, with two or three -slices of lean ham; let it boil steadily two hours; skim it -occasionally, then put into it a shin of veal, let it boil two hours -longer; take out the slices of ham, and skim off the grease if any -should rise, take a gill of good cream, mix with it two table-spoonsful -of flour very nicely, and the yelks of two eggs beaten well, strain this -mixture, and add some chopped parsley; pour some soup on by degrees, -stir it well, and pour it into the pot, continuing to stir until it has -boiled two or three minutes to take off the raw taste of the eggs. If -the cream be not perfectly sweet, and the eggs quite new, the thickening -will curdle in the soup. For a change you may put a dozen ripe tomatos -in, first taking off their skins, by letting them stand a few minutes in -hot water, when they may be easily peeled. When made in this way you -must thicken it with the flour only. Any part of the veal may be used, -but the shin or knuckle is the nicest. diff --git a/vendor/libgit2/tests/resources/renames/.gitted/HEAD b/vendor/libgit2/tests/resources/renames/.gitted/HEAD deleted file mode 100644 index cb089cd89a..0000000000 --- a/vendor/libgit2/tests/resources/renames/.gitted/HEAD +++ /dev/null @@ -1 +0,0 @@ -ref: refs/heads/master diff --git a/vendor/libgit2/tests/resources/renames/.gitted/config b/vendor/libgit2/tests/resources/renames/.gitted/config deleted file mode 100644 index bb4d11c1fa..0000000000 --- a/vendor/libgit2/tests/resources/renames/.gitted/config +++ /dev/null @@ -1,7 +0,0 @@ -[core] - repositoryformatversion = 0 - filemode = true - bare = false - logallrefupdates = true - ignorecase = true - precomposeunicode = false diff --git a/vendor/libgit2/tests/resources/renames/.gitted/description b/vendor/libgit2/tests/resources/renames/.gitted/description deleted file mode 100644 index 498b267a8c..0000000000 --- a/vendor/libgit2/tests/resources/renames/.gitted/description +++ /dev/null @@ -1 +0,0 @@ -Unnamed repository; edit this file 'description' to name the repository. diff --git a/vendor/libgit2/tests/resources/renames/.gitted/index b/vendor/libgit2/tests/resources/renames/.gitted/index deleted file mode 100644 index 72363c0f52..0000000000 Binary files a/vendor/libgit2/tests/resources/renames/.gitted/index and /dev/null differ diff --git a/vendor/libgit2/tests/resources/renames/.gitted/info/exclude b/vendor/libgit2/tests/resources/renames/.gitted/info/exclude deleted file mode 100644 index a5196d1be8..0000000000 --- a/vendor/libgit2/tests/resources/renames/.gitted/info/exclude +++ /dev/null @@ -1,6 +0,0 @@ -# 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/vendor/libgit2/tests/resources/renames/.gitted/logs/HEAD b/vendor/libgit2/tests/resources/renames/.gitted/logs/HEAD deleted file mode 100644 index e697922635..0000000000 --- a/vendor/libgit2/tests/resources/renames/.gitted/logs/HEAD +++ /dev/null @@ -1,4 +0,0 @@ -0000000000000000000000000000000000000000 31e47d8c1fa36d7f8d537b96158e3f024de0a9f2 Russell Belfer 1351024687 -0700 commit (initial): Initial commit -31e47d8c1fa36d7f8d537b96158e3f024de0a9f2 2bc7f351d20b53f1c72c16c4b036e491c478c49a Russell Belfer 1351024817 -0700 commit: copy and rename with no change -2bc7f351d20b53f1c72c16c4b036e491c478c49a 1c068dee5790ef1580cfc4cd670915b48d790084 Russell Belfer 1361485758 -0800 commit: rewrites, copies with changes, etc. -1c068dee5790ef1580cfc4cd670915b48d790084 19dd32dfb1520a64e5bbaae8dce6ef423dfa2f13 Russell Belfer 1361486360 -0800 commit: more renames and smallish modifications diff --git a/vendor/libgit2/tests/resources/renames/.gitted/logs/refs/heads/master b/vendor/libgit2/tests/resources/renames/.gitted/logs/refs/heads/master deleted file mode 100644 index e697922635..0000000000 --- a/vendor/libgit2/tests/resources/renames/.gitted/logs/refs/heads/master +++ /dev/null @@ -1,4 +0,0 @@ -0000000000000000000000000000000000000000 31e47d8c1fa36d7f8d537b96158e3f024de0a9f2 Russell Belfer 1351024687 -0700 commit (initial): Initial commit -31e47d8c1fa36d7f8d537b96158e3f024de0a9f2 2bc7f351d20b53f1c72c16c4b036e491c478c49a Russell Belfer 1351024817 -0700 commit: copy and rename with no change -2bc7f351d20b53f1c72c16c4b036e491c478c49a 1c068dee5790ef1580cfc4cd670915b48d790084 Russell Belfer 1361485758 -0800 commit: rewrites, copies with changes, etc. -1c068dee5790ef1580cfc4cd670915b48d790084 19dd32dfb1520a64e5bbaae8dce6ef423dfa2f13 Russell Belfer 1361486360 -0800 commit: more renames and smallish modifications diff --git a/vendor/libgit2/tests/resources/renames/.gitted/objects/03/da7ad872536bd448da8d88eb7165338bf923a7 b/vendor/libgit2/tests/resources/renames/.gitted/objects/03/da7ad872536bd448da8d88eb7165338bf923a7 deleted file mode 100644 index 2ee86444d7..0000000000 Binary files a/vendor/libgit2/tests/resources/renames/.gitted/objects/03/da7ad872536bd448da8d88eb7165338bf923a7 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/renames/.gitted/objects/17/58bdd7c16a72ff7c17d8de0c957ced3ccad645 b/vendor/libgit2/tests/resources/renames/.gitted/objects/17/58bdd7c16a72ff7c17d8de0c957ced3ccad645 deleted file mode 100644 index 01801ed11d..0000000000 --- a/vendor/libgit2/tests/resources/renames/.gitted/objects/17/58bdd7c16a72ff7c17d8de0c957ced3ccad645 +++ /dev/null @@ -1,5 +0,0 @@ -xEͱ Â@QbWq ť˙®—ĂĹHôźˇ_ž‰&{ëó]ăđy›ű¸Ź•¶Y¬Xłű`źě‹=ŻÝ'íť¶=Zo´Ţh˝ŃzŁőFëŤÖíż­­Đ -­Đ -­Đ -­Đ -MhBšĐ„&4ˇ MhB3šŃŚf4ŁÍhF3šŃŽKűxŚŚ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/renames/.gitted/objects/19/dd32dfb1520a64e5bbaae8dce6ef423dfa2f13 b/vendor/libgit2/tests/resources/renames/.gitted/objects/19/dd32dfb1520a64e5bbaae8dce6ef423dfa2f13 deleted file mode 100644 index 4be4c69524..0000000000 --- a/vendor/libgit2/tests/resources/renames/.gitted/objects/19/dd32dfb1520a64e5bbaae8dce6ef423dfa2f13 +++ /dev/null @@ -1 +0,0 @@ -x•ŽŃM!Eý¦Ši@3ĽŢc,Á\X °ýK ţŢ{Nrbo­,xzYC¬<‡h[&“Č?=fcŤvÎyčCŁWż<äZ #:J"vs’µ%Ś9šÜ˝¶ÁPÚ’Q|Żłřľç”ZáKj–ď#|ţ”uŢá-ööúpÚ;Â+˘Úëî[ýŻ©Z;’›Lŕ+Ál\k™'´žJ.‘Wé×TŻ;O diff --git a/vendor/libgit2/tests/resources/renames/.gitted/objects/1c/068dee5790ef1580cfc4cd670915b48d790084 b/vendor/libgit2/tests/resources/renames/.gitted/objects/1c/068dee5790ef1580cfc4cd670915b48d790084 deleted file mode 100644 index d65ab0a9b5..0000000000 Binary files a/vendor/libgit2/tests/resources/renames/.gitted/objects/1c/068dee5790ef1580cfc4cd670915b48d790084 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/renames/.gitted/objects/2b/c7f351d20b53f1c72c16c4b036e491c478c49a b/vendor/libgit2/tests/resources/renames/.gitted/objects/2b/c7f351d20b53f1c72c16c4b036e491c478c49a deleted file mode 100644 index 93f1ccb3fd..0000000000 Binary files a/vendor/libgit2/tests/resources/renames/.gitted/objects/2b/c7f351d20b53f1c72c16c4b036e491c478c49a and /dev/null differ diff --git a/vendor/libgit2/tests/resources/renames/.gitted/objects/31/e47d8c1fa36d7f8d537b96158e3f024de0a9f2 b/vendor/libgit2/tests/resources/renames/.gitted/objects/31/e47d8c1fa36d7f8d537b96158e3f024de0a9f2 deleted file mode 100644 index 00ce532126..0000000000 Binary files a/vendor/libgit2/tests/resources/renames/.gitted/objects/31/e47d8c1fa36d7f8d537b96158e3f024de0a9f2 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/renames/.gitted/objects/35/92953ff3ea5e8ba700c429f3aefe33c8806754 b/vendor/libgit2/tests/resources/renames/.gitted/objects/35/92953ff3ea5e8ba700c429f3aefe33c8806754 deleted file mode 100644 index 886271d32e..0000000000 Binary files a/vendor/libgit2/tests/resources/renames/.gitted/objects/35/92953ff3ea5e8ba700c429f3aefe33c8806754 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/renames/.gitted/objects/36/020db6cdacaa93497f31edcd8f242ff9bc366d b/vendor/libgit2/tests/resources/renames/.gitted/objects/36/020db6cdacaa93497f31edcd8f242ff9bc366d deleted file mode 100644 index f4f9303edb..0000000000 Binary files a/vendor/libgit2/tests/resources/renames/.gitted/objects/36/020db6cdacaa93497f31edcd8f242ff9bc366d and /dev/null differ diff --git a/vendor/libgit2/tests/resources/renames/.gitted/objects/3c/04741dd4b96c4ae4b00ec0f6e10c816a30aad2 b/vendor/libgit2/tests/resources/renames/.gitted/objects/3c/04741dd4b96c4ae4b00ec0f6e10c816a30aad2 deleted file mode 100644 index c236022627..0000000000 Binary files a/vendor/libgit2/tests/resources/renames/.gitted/objects/3c/04741dd4b96c4ae4b00ec0f6e10c816a30aad2 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/renames/.gitted/objects/42/10ffd5c390b21dd5483375e75288dea9ede512 b/vendor/libgit2/tests/resources/renames/.gitted/objects/42/10ffd5c390b21dd5483375e75288dea9ede512 deleted file mode 100644 index d351a6d13b..0000000000 Binary files a/vendor/libgit2/tests/resources/renames/.gitted/objects/42/10ffd5c390b21dd5483375e75288dea9ede512 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/renames/.gitted/objects/44/4a76ed3e45b183753f49376af30da8c3fe276a b/vendor/libgit2/tests/resources/renames/.gitted/objects/44/4a76ed3e45b183753f49376af30da8c3fe276a deleted file mode 100644 index 5ce12a3c5d..0000000000 Binary files a/vendor/libgit2/tests/resources/renames/.gitted/objects/44/4a76ed3e45b183753f49376af30da8c3fe276a and /dev/null differ diff --git a/vendor/libgit2/tests/resources/renames/.gitted/objects/47/184c1e7eb22abcbed2bf4ee87d4e38096f7951 b/vendor/libgit2/tests/resources/renames/.gitted/objects/47/184c1e7eb22abcbed2bf4ee87d4e38096f7951 deleted file mode 100644 index aa91926992..0000000000 Binary files a/vendor/libgit2/tests/resources/renames/.gitted/objects/47/184c1e7eb22abcbed2bf4ee87d4e38096f7951 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/renames/.gitted/objects/4e/4cae3e7dd56ed74bff39526d0469e554432953 b/vendor/libgit2/tests/resources/renames/.gitted/objects/4e/4cae3e7dd56ed74bff39526d0469e554432953 deleted file mode 100644 index 5e6ebd5e02..0000000000 Binary files a/vendor/libgit2/tests/resources/renames/.gitted/objects/4e/4cae3e7dd56ed74bff39526d0469e554432953 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/renames/.gitted/objects/50/e90273af7d826ff0a95865bcd3ba8412c447d9 b/vendor/libgit2/tests/resources/renames/.gitted/objects/50/e90273af7d826ff0a95865bcd3ba8412c447d9 deleted file mode 100644 index a98d14ee70..0000000000 --- a/vendor/libgit2/tests/resources/renames/.gitted/objects/50/e90273af7d826ff0a95865bcd3ba8412c447d9 +++ /dev/null @@ -1,3 +0,0 @@ -xmÍM -Â0`×9Ĺ\@ÉOŰd îEĽ@š&4hLI"âíťî]Ícŕ}Ďĺ”bÉŐ®ďaBŮORvΡ5çÂ"˘ -“óbŔ0[kLołď¶ä·čpÍ­UËşÝSŠ®äšC;¸śŽ ”ć8 ÜhŘóŽsF_šlľŔeţŘ2Ă}ɩ挞Č-ý!Dg4*IDO;Űę!Đ~Ť)>m‰í ä®”¨Ď~*ůD‰ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/renames/.gitted/objects/5e/26abc56a5a84d89790f45416648899cbe13109 b/vendor/libgit2/tests/resources/renames/.gitted/objects/5e/26abc56a5a84d89790f45416648899cbe13109 deleted file mode 100644 index 2acd3d5830..0000000000 Binary files a/vendor/libgit2/tests/resources/renames/.gitted/objects/5e/26abc56a5a84d89790f45416648899cbe13109 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/renames/.gitted/objects/61/8c6f2f8740bd6049b2fb9eb93fc15726462745 b/vendor/libgit2/tests/resources/renames/.gitted/objects/61/8c6f2f8740bd6049b2fb9eb93fc15726462745 deleted file mode 100644 index 24eac54c5e..0000000000 Binary files a/vendor/libgit2/tests/resources/renames/.gitted/objects/61/8c6f2f8740bd6049b2fb9eb93fc15726462745 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/renames/.gitted/objects/66/311f5cfbe7836c27510a3ba2f43e282e2c8bba b/vendor/libgit2/tests/resources/renames/.gitted/objects/66/311f5cfbe7836c27510a3ba2f43e282e2c8bba deleted file mode 100644 index 5ee28a76ae..0000000000 Binary files a/vendor/libgit2/tests/resources/renames/.gitted/objects/66/311f5cfbe7836c27510a3ba2f43e282e2c8bba and /dev/null differ diff --git a/vendor/libgit2/tests/resources/renames/.gitted/objects/93/f538c45a57a87eb4c1e86f91c6ee41d66c7ba7 b/vendor/libgit2/tests/resources/renames/.gitted/objects/93/f538c45a57a87eb4c1e86f91c6ee41d66c7ba7 deleted file mode 100644 index 39105f94de..0000000000 Binary files a/vendor/libgit2/tests/resources/renames/.gitted/objects/93/f538c45a57a87eb4c1e86f91c6ee41d66c7ba7 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/renames/.gitted/objects/9a/69d960ae94b060f56c2a8702545e2bb1abb935 b/vendor/libgit2/tests/resources/renames/.gitted/objects/9a/69d960ae94b060f56c2a8702545e2bb1abb935 deleted file mode 100644 index f75178c59a..0000000000 Binary files a/vendor/libgit2/tests/resources/renames/.gitted/objects/9a/69d960ae94b060f56c2a8702545e2bb1abb935 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/renames/.gitted/objects/ad/0a8e55a104ac54a8a29ed4b84b49e76837a113 b/vendor/libgit2/tests/resources/renames/.gitted/objects/ad/0a8e55a104ac54a8a29ed4b84b49e76837a113 deleted file mode 100644 index 440b7bec3f..0000000000 Binary files a/vendor/libgit2/tests/resources/renames/.gitted/objects/ad/0a8e55a104ac54a8a29ed4b84b49e76837a113 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/renames/.gitted/objects/b9/25b224cc91f897001a9993fbce169fdaa8858f b/vendor/libgit2/tests/resources/renames/.gitted/objects/b9/25b224cc91f897001a9993fbce169fdaa8858f deleted file mode 100644 index 90e107fa23..0000000000 Binary files a/vendor/libgit2/tests/resources/renames/.gitted/objects/b9/25b224cc91f897001a9993fbce169fdaa8858f and /dev/null differ diff --git a/vendor/libgit2/tests/resources/renames/.gitted/objects/d7/9b202de198fa61b02424b9e25e840dc75e1323 b/vendor/libgit2/tests/resources/renames/.gitted/objects/d7/9b202de198fa61b02424b9e25e840dc75e1323 deleted file mode 100644 index daa2b39975..0000000000 Binary files a/vendor/libgit2/tests/resources/renames/.gitted/objects/d7/9b202de198fa61b02424b9e25e840dc75e1323 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/renames/.gitted/objects/ea/c43f5195a2cee53b7458d8dad16aedde10711b b/vendor/libgit2/tests/resources/renames/.gitted/objects/ea/c43f5195a2cee53b7458d8dad16aedde10711b deleted file mode 100644 index 2fb025080a..0000000000 Binary files a/vendor/libgit2/tests/resources/renames/.gitted/objects/ea/c43f5195a2cee53b7458d8dad16aedde10711b and /dev/null differ diff --git a/vendor/libgit2/tests/resources/renames/.gitted/objects/ea/f4a3e3bfe68585e90cada20736ace491cd100b b/vendor/libgit2/tests/resources/renames/.gitted/objects/ea/f4a3e3bfe68585e90cada20736ace491cd100b deleted file mode 100644 index f72df8d829..0000000000 --- a/vendor/libgit2/tests/resources/renames/.gitted/objects/ea/f4a3e3bfe68585e90cada20736ace491cd100b +++ /dev/null @@ -1,5 +0,0 @@ -x}RÁŞÔ@ô<_QžTČ.Ľ“ÂâAáÉ[–‡â -{žĽt2C’žez’›áú%öLžş'!aş»Ş«ję!Ôx{÷îĹ'˘+Îţ;“$ś)Ξ»Ý#±y˙żÇł#q#Żh„­c° ĂQDX¶m­ŹR|ŠaD*ÝOţ†+±”^ZI~ýři>3aôĂŕă!,R!-áďÉEaIÁ>äyš‰o*«Ľ4ćRfˇŤ m&eŻ IAŃú™ň*!â;˘ždÍݬ‚…´Ĺ -ęH¶o­¤ -ĂÄO®‚UľDöyTVŘHpwqĹHĽ7§„Ć·­.ČʆÎÎts6{Zä +öX\)ŠŞ”ŃC–žťě5QŞÂä9 -%©ĚĹt*Ă&Ď&č°ęv;|ťšŐĆ'4˝ěĆéţţ Du[°7hŻże!ÉNťK*"C©-=Óňć`´ć#ŘŽ$EëĹe2őáâT|ůęĺ@NBsús˘¦lµ°Wö|/¶0¬÷aČĄüJ±ň¶Nęv)-šÚˇiۤ3ĹëbäbOŤ:uWMâNÓÜŕóć¶X˛7żTóş \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/renames/.gitted/objects/f9/0d4fc20ecddf21eebe6a37e9225d244339d2b5 b/vendor/libgit2/tests/resources/renames/.gitted/objects/f9/0d4fc20ecddf21eebe6a37e9225d244339d2b5 deleted file mode 100644 index f6d933be99..0000000000 Binary files a/vendor/libgit2/tests/resources/renames/.gitted/objects/f9/0d4fc20ecddf21eebe6a37e9225d244339d2b5 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/renames/.gitted/refs/heads/master b/vendor/libgit2/tests/resources/renames/.gitted/refs/heads/master deleted file mode 100644 index 642c3198db..0000000000 --- a/vendor/libgit2/tests/resources/renames/.gitted/refs/heads/master +++ /dev/null @@ -1 +0,0 @@ -19dd32dfb1520a64e5bbaae8dce6ef423dfa2f13 diff --git a/vendor/libgit2/tests/resources/renames/.gitted/refs/heads/renames_similar b/vendor/libgit2/tests/resources/renames/.gitted/refs/heads/renames_similar deleted file mode 100644 index 8ffb6d94bf..0000000000 --- a/vendor/libgit2/tests/resources/renames/.gitted/refs/heads/renames_similar +++ /dev/null @@ -1 +0,0 @@ -444a76ed3e45b183753f49376af30da8c3fe276a diff --git a/vendor/libgit2/tests/resources/renames/.gitted/refs/heads/renames_similar_two b/vendor/libgit2/tests/resources/renames/.gitted/refs/heads/renames_similar_two deleted file mode 100644 index 4ee5d04e1f..0000000000 --- a/vendor/libgit2/tests/resources/renames/.gitted/refs/heads/renames_similar_two +++ /dev/null @@ -1 +0,0 @@ -50e90273af7d826ff0a95865bcd3ba8412c447d9 diff --git a/vendor/libgit2/tests/resources/renames/ikeepsix.txt b/vendor/libgit2/tests/resources/renames/ikeepsix.txt deleted file mode 100644 index eaf4a3e3bf..0000000000 --- a/vendor/libgit2/tests/resources/renames/ikeepsix.txt +++ /dev/null @@ -1,27 +0,0 @@ -I Keep Six Honest Serving-Men -============================= - -She sends'em abroad on her own affairs, - From the second she opens her eyes— -One million Hows, two million Wheres, -And seven million Whys! - -I let them rest from nine till five, - For I am busy then, -As well as breakfast, lunch, and tea, - For they are hungry men. -But different folk have different views; -I know a person small— -She keeps ten million serving-men, -Who get no rest at all! - - -- Rudyard Kipling - -I KEEP six honest serving-men - (They taught me all I knew); -Their names are What and Why and When - And How and Where and Who. -I send them over land and sea, - I send them east and west; -But after they have worked for me, - I give them all a rest. diff --git a/vendor/libgit2/tests/resources/renames/sixserving.txt b/vendor/libgit2/tests/resources/renames/sixserving.txt deleted file mode 100644 index f90d4fc20e..0000000000 --- a/vendor/libgit2/tests/resources/renames/sixserving.txt +++ /dev/null @@ -1,25 +0,0 @@ -I KEEP six honest serving-men - (They taught me all I knew); -Their names are What and Why and When - And How and Where and Who. -I send them over land and sea, - I send them east and west; -But after they have worked for me, - I give them all a rest. - -I let them rest from nine till five, - For I am busy then, -As well as breakfast, lunch, and tea, - For they are hungry men. -But different folk have different views; -I know a person small— -She keeps ten million serving-men, -Who get no rest at all! - -She sends'em abroad on her own affairs, - From the second she opens her eyes— -One million Hows, two million Wheres, -And seven million Whys! - - -- Rudyard Kipling - diff --git a/vendor/libgit2/tests/resources/renames/songof7cities.txt b/vendor/libgit2/tests/resources/renames/songof7cities.txt deleted file mode 100644 index 4210ffd5c3..0000000000 --- a/vendor/libgit2/tests/resources/renames/songof7cities.txt +++ /dev/null @@ -1,49 +0,0 @@ -The Song of Seven Cities ------------------------- - -I WAS Lord of Cities very sumptuously builded. -Seven roaring Cities paid me tribute from afar. -Ivory their outposts were--the guardrooms of them gilded, -And garrisoned with Amazons invincible in war. - -All the world went softly when it walked before my Cities-- -Neither King nor Army vexed my peoples at their toil, -Never horse nor chariot irked or overbore my Cities, -Never Mob nor Ruler questioned whence they drew their spoil. - -Banded, mailed and arrogant from sunrise unto sunset; -Singing while they sacked it, they possessed the land at large. -Yet when men would rob them, they resisted, they made onset -And pierced the smoke of battle with a thousand-sabred charge. - -So they warred and trafficked only yesterday, my Cities. -To-day there is no mark or mound of where my Cities stood. -For the River rose at midnight and it washed away my Cities. -They are evened with Atlantis and the towns before the Flood. - -Rain on rain-gorged channels raised the water-levels round them, -Freshet backed on freshet swelled and swept their world from sight, -Till the emboldened floods linked arms and, flashing forward, drowned them-- -Drowned my Seven Cities and their peoples in one night! - -Low among the alders lie their derelict foundations, -The beams wherein they trusted and the plinths whereon they built-- -My rulers and their treasure and their unborn populations, -Dead, destroyed, aborted, and defiled with mud and silt! - -The Daughters of the Palace whom they cherished in my Cities, -My silver-tongued Princesses, and the promise of their May-- -Their bridegrooms of the June-tide--all have perished in my Cities, -With the harsh envenomed virgins that can neither love nor play. - -I was Lord of Cities--I will build anew my Cities, -Seven, set on rocks, above the wrath of any flood. -Nor will I rest from search till I have filled anew my Cities -With peoples undefeated of the dark, enduring blood. - -To the sound of trumpets shall their seed restore my Cities -Wealthy and well-weaponed, that once more may I behold -All the world go softly when it walks before my Cities, -And the horses and the chariots fleeing from them as of old! - - -- Rudyard Kipling diff --git a/vendor/libgit2/tests/resources/renames/untimely.txt b/vendor/libgit2/tests/resources/renames/untimely.txt deleted file mode 100644 index 9a69d960ae..0000000000 --- a/vendor/libgit2/tests/resources/renames/untimely.txt +++ /dev/null @@ -1,24 +0,0 @@ -Untimely -======== - -Nothing in life has been made by man for man's using -But it was shown long since to man in ages -Lost as the name of the maker of it, -Who received oppression and shame for his wages-- -Hate, avoidance, and scorn in his daily dealings-- -Until he perished, wholly confounded - -More to be pitied than he are the wise -Souls which foresaw the evil of loosing -Knowledge or Art before time, and aborted -Noble devices and deep-wrought healings, -Lest offense should arise. - -Heaven delivers on earth the Hour that cannot be - thwarted, -Neither advanced, at the price of a world nor a soul, - and its Prophet -Comes through the blood of the vanguards who - dreamed--too soon--it had sounded. - - -- Rudyard Kipling diff --git a/vendor/libgit2/tests/resources/revert/.gitted/HEAD b/vendor/libgit2/tests/resources/revert/.gitted/HEAD deleted file mode 100644 index cb43805164..0000000000 --- a/vendor/libgit2/tests/resources/revert/.gitted/HEAD +++ /dev/null @@ -1 +0,0 @@ -ref: refs/heads/master diff --git a/vendor/libgit2/tests/resources/revert/.gitted/config b/vendor/libgit2/tests/resources/revert/.gitted/config deleted file mode 100644 index 454e576b97..0000000000 --- a/vendor/libgit2/tests/resources/revert/.gitted/config +++ /dev/null @@ -1,8 +0,0 @@ -[core] - repositoryformatversion = 0 - filemode = false - bare = false - logallrefupdates = true - symlinks = false - ignorecase = true - hideDotFiles = dotGitOnly diff --git a/vendor/libgit2/tests/resources/revert/.gitted/index b/vendor/libgit2/tests/resources/revert/.gitted/index deleted file mode 100644 index 3513c04a6c..0000000000 Binary files a/vendor/libgit2/tests/resources/revert/.gitted/index and /dev/null differ diff --git a/vendor/libgit2/tests/resources/revert/.gitted/info/exclude b/vendor/libgit2/tests/resources/revert/.gitted/info/exclude deleted file mode 100644 index f006809736..0000000000 --- a/vendor/libgit2/tests/resources/revert/.gitted/info/exclude +++ /dev/null @@ -1,6 +0,0 @@ -# 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/vendor/libgit2/tests/resources/revert/.gitted/objects/00/c97c9299419874a7bfc4d853d462c568e1be2d b/vendor/libgit2/tests/resources/revert/.gitted/objects/00/c97c9299419874a7bfc4d853d462c568e1be2d deleted file mode 100644 index b4e9635c67..0000000000 Binary files a/vendor/libgit2/tests/resources/revert/.gitted/objects/00/c97c9299419874a7bfc4d853d462c568e1be2d and /dev/null differ diff --git a/vendor/libgit2/tests/resources/revert/.gitted/objects/0a/a8c7e40d342fff78d60b29a4ba8e993ed79c51 b/vendor/libgit2/tests/resources/revert/.gitted/objects/0a/a8c7e40d342fff78d60b29a4ba8e993ed79c51 deleted file mode 100644 index 5c811ef895..0000000000 --- a/vendor/libgit2/tests/resources/revert/.gitted/objects/0a/a8c7e40d342fff78d60b29a4ba8e993ed79c51 +++ /dev/null @@ -1,2 +0,0 @@ -xĄŤK -Â0@]çs%Ó4?qă Ľ@2ťĐ€é@ńúÖ3¸{ĽĹ{$­ŐÜitf@ë¸ÄL9ş°1…ŮOI—‰K™cÁäŃdrYĄ÷XĄĂců¤ľŔs•¶ËW>ěŹî­R—]ʸ´  ŤGଭÖę°Çxđ U·:jz©/¤’? \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/revert/.gitted/objects/0a/b09ea6d4c3634bdf6c221626d8b6f7dd890767 b/vendor/libgit2/tests/resources/revert/.gitted/objects/0a/b09ea6d4c3634bdf6c221626d8b6f7dd890767 deleted file mode 100644 index c050e5a89d..0000000000 Binary files a/vendor/libgit2/tests/resources/revert/.gitted/objects/0a/b09ea6d4c3634bdf6c221626d8b6f7dd890767 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/revert/.gitted/objects/0a/d19525be6d8cae5e5deb2770fc244b65255057 b/vendor/libgit2/tests/resources/revert/.gitted/objects/0a/d19525be6d8cae5e5deb2770fc244b65255057 deleted file mode 100644 index 4aa0459d8e..0000000000 Binary files a/vendor/libgit2/tests/resources/revert/.gitted/objects/0a/d19525be6d8cae5e5deb2770fc244b65255057 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/revert/.gitted/objects/0c/db66192ee192f70f891f05a47636057420e871 b/vendor/libgit2/tests/resources/revert/.gitted/objects/0c/db66192ee192f70f891f05a47636057420e871 deleted file mode 100644 index 31c107fc42..0000000000 Binary files a/vendor/libgit2/tests/resources/revert/.gitted/objects/0c/db66192ee192f70f891f05a47636057420e871 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/revert/.gitted/objects/0f/5bfcf58c558d865da6be0281d7795993646cee b/vendor/libgit2/tests/resources/revert/.gitted/objects/0f/5bfcf58c558d865da6be0281d7795993646cee deleted file mode 100644 index fb4fc763a3..0000000000 Binary files a/vendor/libgit2/tests/resources/revert/.gitted/objects/0f/5bfcf58c558d865da6be0281d7795993646cee and /dev/null differ diff --git a/vendor/libgit2/tests/resources/revert/.gitted/objects/10/10c8f4711d60d04bad16197a0f4b0d4d19c542 b/vendor/libgit2/tests/resources/revert/.gitted/objects/10/10c8f4711d60d04bad16197a0f4b0d4d19c542 deleted file mode 100644 index 083f7467b5..0000000000 Binary files a/vendor/libgit2/tests/resources/revert/.gitted/objects/10/10c8f4711d60d04bad16197a0f4b0d4d19c542 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/revert/.gitted/objects/13/a6fdfd10bd74b1f258fb58801215985dd2e797 b/vendor/libgit2/tests/resources/revert/.gitted/objects/13/a6fdfd10bd74b1f258fb58801215985dd2e797 deleted file mode 100644 index 3c54aab0c5..0000000000 Binary files a/vendor/libgit2/tests/resources/revert/.gitted/objects/13/a6fdfd10bd74b1f258fb58801215985dd2e797 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/revert/.gitted/objects/13/ee9cd5d8e1023c218e0e1ea684ec0c582b5050 b/vendor/libgit2/tests/resources/revert/.gitted/objects/13/ee9cd5d8e1023c218e0e1ea684ec0c582b5050 deleted file mode 100644 index aed4647a6a..0000000000 Binary files a/vendor/libgit2/tests/resources/revert/.gitted/objects/13/ee9cd5d8e1023c218e0e1ea684ec0c582b5050 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/revert/.gitted/objects/15/6ef9bcb968dccec8472a0f2eff49f1a713bc6b b/vendor/libgit2/tests/resources/revert/.gitted/objects/15/6ef9bcb968dccec8472a0f2eff49f1a713bc6b deleted file mode 100644 index 3ee2a189b8..0000000000 Binary files a/vendor/libgit2/tests/resources/revert/.gitted/objects/15/6ef9bcb968dccec8472a0f2eff49f1a713bc6b and /dev/null differ diff --git a/vendor/libgit2/tests/resources/revert/.gitted/objects/18/1aab27ddb37b40d9a284fb4733497006d57091 b/vendor/libgit2/tests/resources/revert/.gitted/objects/18/1aab27ddb37b40d9a284fb4733497006d57091 deleted file mode 100644 index 6b422b808d..0000000000 Binary files a/vendor/libgit2/tests/resources/revert/.gitted/objects/18/1aab27ddb37b40d9a284fb4733497006d57091 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/revert/.gitted/objects/1b/c915c5cb7185a9438de28a7b1a7dfe8c01ee7f b/vendor/libgit2/tests/resources/revert/.gitted/objects/1b/c915c5cb7185a9438de28a7b1a7dfe8c01ee7f deleted file mode 100644 index 0a6955b5da..0000000000 Binary files a/vendor/libgit2/tests/resources/revert/.gitted/objects/1b/c915c5cb7185a9438de28a7b1a7dfe8c01ee7f and /dev/null differ diff --git a/vendor/libgit2/tests/resources/revert/.gitted/objects/1f/a4e069a641f10f5fb7588138b2d147fcd22c36 b/vendor/libgit2/tests/resources/revert/.gitted/objects/1f/a4e069a641f10f5fb7588138b2d147fcd22c36 deleted file mode 100644 index 3df134a8d2..0000000000 Binary files a/vendor/libgit2/tests/resources/revert/.gitted/objects/1f/a4e069a641f10f5fb7588138b2d147fcd22c36 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/revert/.gitted/objects/1f/f0c423042b46cb1d617b81efb715defbe8054d b/vendor/libgit2/tests/resources/revert/.gitted/objects/1f/f0c423042b46cb1d617b81efb715defbe8054d deleted file mode 100644 index 2ed1a2292e..0000000000 Binary files a/vendor/libgit2/tests/resources/revert/.gitted/objects/1f/f0c423042b46cb1d617b81efb715defbe8054d and /dev/null differ diff --git a/vendor/libgit2/tests/resources/revert/.gitted/objects/21/a96a98ed84d45866e1de6e266fd3a61a4ae9dc b/vendor/libgit2/tests/resources/revert/.gitted/objects/21/a96a98ed84d45866e1de6e266fd3a61a4ae9dc deleted file mode 100644 index 95842dbf87..0000000000 Binary files a/vendor/libgit2/tests/resources/revert/.gitted/objects/21/a96a98ed84d45866e1de6e266fd3a61a4ae9dc and /dev/null differ diff --git a/vendor/libgit2/tests/resources/revert/.gitted/objects/29/6a6d3be1dff05c5d1f631d2459389fa7b619eb b/vendor/libgit2/tests/resources/revert/.gitted/objects/29/6a6d3be1dff05c5d1f631d2459389fa7b619eb deleted file mode 100644 index 5555268fde..0000000000 Binary files a/vendor/libgit2/tests/resources/revert/.gitted/objects/29/6a6d3be1dff05c5d1f631d2459389fa7b619eb and /dev/null differ diff --git a/vendor/libgit2/tests/resources/revert/.gitted/objects/2d/440f2b3147d3dc7ad1085813478d6d869d5a4d b/vendor/libgit2/tests/resources/revert/.gitted/objects/2d/440f2b3147d3dc7ad1085813478d6d869d5a4d deleted file mode 100644 index c06cc9472e..0000000000 --- a/vendor/libgit2/tests/resources/revert/.gitted/objects/2d/440f2b3147d3dc7ad1085813478d6d869d5a4d +++ /dev/null @@ -1,2 +0,0 @@ -xĄŽK -1D]ç}%Iç3"nĽČt:΀I$ńúĆ3¸)ŠWđ(Ş9o´q‡ŢaaQ9ËRyífž"É]’JÍv YŤmŻĐ¸tđ“ńŃđ„N9‡2%\F°!™/DHĆŠđîkmp‹źĐ"Üך÷ZŕĚţÚ5oÔę^S?QÍP8Y…~ÖŽŇJ)G;˙ˇŽ’žő­<€ÖPĽ‹/ćlPŢ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/revert/.gitted/objects/33/c6fd981c49a2abf2971482089350bfc5cda8ea b/vendor/libgit2/tests/resources/revert/.gitted/objects/33/c6fd981c49a2abf2971482089350bfc5cda8ea deleted file mode 100644 index 683f27f0eb..0000000000 Binary files a/vendor/libgit2/tests/resources/revert/.gitted/objects/33/c6fd981c49a2abf2971482089350bfc5cda8ea and /dev/null differ diff --git a/vendor/libgit2/tests/resources/revert/.gitted/objects/39/467716290f6df775a91cdb9a4eb39295018145 b/vendor/libgit2/tests/resources/revert/.gitted/objects/39/467716290f6df775a91cdb9a4eb39295018145 deleted file mode 100644 index 7c1e01d67c..0000000000 Binary files a/vendor/libgit2/tests/resources/revert/.gitted/objects/39/467716290f6df775a91cdb9a4eb39295018145 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/revert/.gitted/objects/39/9fb3aba3d9d13f7d40a9254ce4402067ef3149 b/vendor/libgit2/tests/resources/revert/.gitted/objects/39/9fb3aba3d9d13f7d40a9254ce4402067ef3149 deleted file mode 100644 index 6cb6839d63..0000000000 --- a/vendor/libgit2/tests/resources/revert/.gitted/objects/39/9fb3aba3d9d13f7d40a9254ce4402067ef3149 +++ /dev/null @@ -1,2 +0,0 @@ -xĄŽK!]s -. á;@bŚoŕzşA\0mŚ×ĎŕŞ<äÖžC§Łç,3Řd@ű ˘_ŃDň @§K6Ĺ—5Tâ=oS$çT1«Ő.% @zŞQ["-—D xŹĘ]Ţčťä˝rŰy“ç<éo]Ű;ď\Ć ą]¤¶1YťüĺQEĄÄ¤óčČ$l<ę,`…í‘ĹaGNĹ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/revert/.gitted/objects/3a/3ef367eaf3fe79effbfb0a56b269c04c2b59fe b/vendor/libgit2/tests/resources/revert/.gitted/objects/3a/3ef367eaf3fe79effbfb0a56b269c04c2b59fe deleted file mode 100644 index b83806e683..0000000000 Binary files a/vendor/libgit2/tests/resources/revert/.gitted/objects/3a/3ef367eaf3fe79effbfb0a56b269c04c2b59fe and /dev/null differ diff --git a/vendor/libgit2/tests/resources/revert/.gitted/objects/46/ff0854663aeb2182b9838c8da68e33ac23bc1e b/vendor/libgit2/tests/resources/revert/.gitted/objects/46/ff0854663aeb2182b9838c8da68e33ac23bc1e deleted file mode 100644 index 7064dab527..0000000000 Binary files a/vendor/libgit2/tests/resources/revert/.gitted/objects/46/ff0854663aeb2182b9838c8da68e33ac23bc1e and /dev/null differ diff --git a/vendor/libgit2/tests/resources/revert/.gitted/objects/4b/8fcff56437e60f58e9a6bc630dd242ebf6ea2c b/vendor/libgit2/tests/resources/revert/.gitted/objects/4b/8fcff56437e60f58e9a6bc630dd242ebf6ea2c deleted file mode 100644 index c0bd3dbf98..0000000000 Binary files a/vendor/libgit2/tests/resources/revert/.gitted/objects/4b/8fcff56437e60f58e9a6bc630dd242ebf6ea2c and /dev/null differ diff --git a/vendor/libgit2/tests/resources/revert/.gitted/objects/52/c95c4264245469a0617e289a7d737f156826b4 b/vendor/libgit2/tests/resources/revert/.gitted/objects/52/c95c4264245469a0617e289a7d737f156826b4 deleted file mode 100644 index 7cc9e96625..0000000000 --- a/vendor/libgit2/tests/resources/revert/.gitted/objects/52/c95c4264245469a0617e289a7d737f156826b4 +++ /dev/null @@ -1,2 +0,0 @@ -xĄŹ=N1 …©s -k›mŘU~Ç !J´Č8ÎÎIP&ŔőÉ2@˘°ä÷¤Ďď™jÎk+ńˇ7fđŚCË^'…FF3ą4{–’”dCN")JěĹGh\:¸@‘І¤Qˇf˛^E­ ł™ň`“včEřěKmđżC‹p]jŢj'î}{É+µşŐÔĎTó3(sqcŚ“p’NJ1ÜQ´ó?NwţâÖáđĆíĆ0·Phcľ«í´Ë#¬ĄWŘ˝×eÝ ýrěţüóănką ZB)CdĆŰ QMÚË4Ĺ„č‚Wg,ĎĆk鷺(ëÎâçŰä \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/revert/.gitted/objects/55/568c8de5322ff9a95d72747a239cdb64a19965 b/vendor/libgit2/tests/resources/revert/.gitted/objects/55/568c8de5322ff9a95d72747a239cdb64a19965 deleted file mode 100644 index 4dae50b5d3..0000000000 --- a/vendor/libgit2/tests/resources/revert/.gitted/objects/55/568c8de5322ff9a95d72747a239cdb64a19965 +++ /dev/null @@ -1 +0,0 @@ -xĄŽK!]sŠľ€¦ů ăĆx莓Äx}ń î^jńŞr«u`śÝŤÎ ZČ1.‰§EŁxYŹQ۸š˘]\ŚÉvQOęü€D1vX¬3"bYp5‰ÜJ‘S˛\BĘ^+zŹ[ëp)ę®·V_íGžô·ÎuË˝˝šŚCnőSčµ ěŃ#ŞIgčŕ?.Ô,¦Ę°•Yľeş«/»ZOH \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/revert/.gitted/objects/55/acf326a69f0aab7a974ec53ffa55a50bcac14e b/vendor/libgit2/tests/resources/revert/.gitted/objects/55/acf326a69f0aab7a974ec53ffa55a50bcac14e deleted file mode 100644 index e9cdfc5d5c..0000000000 Binary files a/vendor/libgit2/tests/resources/revert/.gitted/objects/55/acf326a69f0aab7a974ec53ffa55a50bcac14e and /dev/null differ diff --git a/vendor/libgit2/tests/resources/revert/.gitted/objects/5a/cdc74af27172ec491d213ee36cea7eb9ef2579 b/vendor/libgit2/tests/resources/revert/.gitted/objects/5a/cdc74af27172ec491d213ee36cea7eb9ef2579 deleted file mode 100644 index 61055ea80a..0000000000 --- a/vendor/libgit2/tests/resources/revert/.gitted/objects/5a/cdc74af27172ec491d213ee36cea7eb9ef2579 +++ /dev/null @@ -1,3 +0,0 @@ -xĄŹ=N1 …©s -w[-Š“8?B4”t\ ?3E&«L×'«' °ä÷é=?9÷Öö éif6Tg¸ćDhµIŢł4=*·<>zRäŞAq‹Ź Ć:‡VYm©ÎQ K -ŃpŇA’čŃĐź5sČ…Šg”Jg…«€‘Łő†łĚäU"IRÄďąőďĺ'Žź[og?ŕ…˝oomĎŁź˝ÎçÜŰ+ ö´főÁuĹĄXt=6ů'ÄŹ/†4â‘7¸´»:ŻyýLü:řc’ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/revert/.gitted/objects/6b/ccd0dc58cea5ccff86014f3d64b31bd8c02a37 b/vendor/libgit2/tests/resources/revert/.gitted/objects/6b/ccd0dc58cea5ccff86014f3d64b31bd8c02a37 deleted file mode 100644 index 2664da4804..0000000000 Binary files a/vendor/libgit2/tests/resources/revert/.gitted/objects/6b/ccd0dc58cea5ccff86014f3d64b31bd8c02a37 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/revert/.gitted/objects/71/eb9c2b53dbbf3c45fb28b27c850db4b7fb8011 b/vendor/libgit2/tests/resources/revert/.gitted/objects/71/eb9c2b53dbbf3c45fb28b27c850db4b7fb8011 deleted file mode 100644 index 995a1e6260..0000000000 Binary files a/vendor/libgit2/tests/resources/revert/.gitted/objects/71/eb9c2b53dbbf3c45fb28b27c850db4b7fb8011 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/revert/.gitted/objects/72/333f47d4e83616630ff3b0ffe4c0faebcc3c45 b/vendor/libgit2/tests/resources/revert/.gitted/objects/72/333f47d4e83616630ff3b0ffe4c0faebcc3c45 deleted file mode 100644 index 1f69787036..0000000000 Binary files a/vendor/libgit2/tests/resources/revert/.gitted/objects/72/333f47d4e83616630ff3b0ffe4c0faebcc3c45 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/revert/.gitted/objects/73/ec36fa120f8066963a0bc9105bb273dbd903d7 b/vendor/libgit2/tests/resources/revert/.gitted/objects/73/ec36fa120f8066963a0bc9105bb273dbd903d7 deleted file mode 100644 index 3c8d2c20aa..0000000000 Binary files a/vendor/libgit2/tests/resources/revert/.gitted/objects/73/ec36fa120f8066963a0bc9105bb273dbd903d7 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/revert/.gitted/objects/74/7726e021bc5f44b86de60e3032fd6f9f1b8383 b/vendor/libgit2/tests/resources/revert/.gitted/objects/74/7726e021bc5f44b86de60e3032fd6f9f1b8383 deleted file mode 100644 index e4d14776fd..0000000000 Binary files a/vendor/libgit2/tests/resources/revert/.gitted/objects/74/7726e021bc5f44b86de60e3032fd6f9f1b8383 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/revert/.gitted/objects/75/ec9929465623f17ff3ad68c0438ea56faba815 b/vendor/libgit2/tests/resources/revert/.gitted/objects/75/ec9929465623f17ff3ad68c0438ea56faba815 deleted file mode 100644 index a3609c7de1..0000000000 Binary files a/vendor/libgit2/tests/resources/revert/.gitted/objects/75/ec9929465623f17ff3ad68c0438ea56faba815 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/revert/.gitted/objects/77/31926a337c4eaba1e2187d90ebfa0a93659382 b/vendor/libgit2/tests/resources/revert/.gitted/objects/77/31926a337c4eaba1e2187d90ebfa0a93659382 deleted file mode 100644 index b87fa15435..0000000000 Binary files a/vendor/libgit2/tests/resources/revert/.gitted/objects/77/31926a337c4eaba1e2187d90ebfa0a93659382 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/revert/.gitted/objects/83/f65df4606c4f8dbf8da43de25de1b7e4c03238 b/vendor/libgit2/tests/resources/revert/.gitted/objects/83/f65df4606c4f8dbf8da43de25de1b7e4c03238 deleted file mode 100644 index 152ed5f778..0000000000 Binary files a/vendor/libgit2/tests/resources/revert/.gitted/objects/83/f65df4606c4f8dbf8da43de25de1b7e4c03238 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/revert/.gitted/objects/87/59ad453cf01cf7daf14e2a668f8218f9a678eb b/vendor/libgit2/tests/resources/revert/.gitted/objects/87/59ad453cf01cf7daf14e2a668f8218f9a678eb deleted file mode 100644 index ab19acf83f..0000000000 Binary files a/vendor/libgit2/tests/resources/revert/.gitted/objects/87/59ad453cf01cf7daf14e2a668f8218f9a678eb and /dev/null differ diff --git a/vendor/libgit2/tests/resources/revert/.gitted/objects/8b/e77695228eadd004606af0508462457961ca4a b/vendor/libgit2/tests/resources/revert/.gitted/objects/8b/e77695228eadd004606af0508462457961ca4a deleted file mode 100644 index 951917ce3d..0000000000 Binary files a/vendor/libgit2/tests/resources/revert/.gitted/objects/8b/e77695228eadd004606af0508462457961ca4a and /dev/null differ diff --git a/vendor/libgit2/tests/resources/revert/.gitted/objects/8f/d40e13fff575b63e86af87175e70fa7fb92f80 b/vendor/libgit2/tests/resources/revert/.gitted/objects/8f/d40e13fff575b63e86af87175e70fa7fb92f80 deleted file mode 100644 index 9ff8617282..0000000000 Binary files a/vendor/libgit2/tests/resources/revert/.gitted/objects/8f/d40e13fff575b63e86af87175e70fa7fb92f80 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/revert/.gitted/objects/97/e52d5e81f541080cd6b92829fb85bc4d81d90b b/vendor/libgit2/tests/resources/revert/.gitted/objects/97/e52d5e81f541080cd6b92829fb85bc4d81d90b deleted file mode 100644 index 416ae0f13c..0000000000 Binary files a/vendor/libgit2/tests/resources/revert/.gitted/objects/97/e52d5e81f541080cd6b92829fb85bc4d81d90b and /dev/null differ diff --git a/vendor/libgit2/tests/resources/revert/.gitted/objects/97/f3574e92f1730d365fb9e00c10e3c507c1cfe9 b/vendor/libgit2/tests/resources/revert/.gitted/objects/97/f3574e92f1730d365fb9e00c10e3c507c1cfe9 deleted file mode 100644 index 12ebc58dfe..0000000000 Binary files a/vendor/libgit2/tests/resources/revert/.gitted/objects/97/f3574e92f1730d365fb9e00c10e3c507c1cfe9 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/revert/.gitted/objects/9a/95fd974e03c5b93828ceedd28755965b5d5c60 b/vendor/libgit2/tests/resources/revert/.gitted/objects/9a/95fd974e03c5b93828ceedd28755965b5d5c60 deleted file mode 100644 index bb93a34bb0..0000000000 Binary files a/vendor/libgit2/tests/resources/revert/.gitted/objects/9a/95fd974e03c5b93828ceedd28755965b5d5c60 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/revert/.gitted/objects/a6/9f74efcb51634b88e04ea81273158a85257f41 b/vendor/libgit2/tests/resources/revert/.gitted/objects/a6/9f74efcb51634b88e04ea81273158a85257f41 deleted file mode 100644 index b96831f107..0000000000 Binary files a/vendor/libgit2/tests/resources/revert/.gitted/objects/a6/9f74efcb51634b88e04ea81273158a85257f41 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/revert/.gitted/objects/a8/c86221b400b836010567cc3593db6e96c1a83a b/vendor/libgit2/tests/resources/revert/.gitted/objects/a8/c86221b400b836010567cc3593db6e96c1a83a deleted file mode 100644 index 29654616ef..0000000000 Binary files a/vendor/libgit2/tests/resources/revert/.gitted/objects/a8/c86221b400b836010567cc3593db6e96c1a83a and /dev/null differ diff --git a/vendor/libgit2/tests/resources/revert/.gitted/objects/aa/7e281435d1fe6740d712f4bcc6fe89c425bedc b/vendor/libgit2/tests/resources/revert/.gitted/objects/aa/7e281435d1fe6740d712f4bcc6fe89c425bedc deleted file mode 100644 index f0dd67d3b8..0000000000 Binary files a/vendor/libgit2/tests/resources/revert/.gitted/objects/aa/7e281435d1fe6740d712f4bcc6fe89c425bedc and /dev/null differ diff --git a/vendor/libgit2/tests/resources/revert/.gitted/objects/ac/c4d33902092efeb3b714aa0b1007c329e2f2e6 b/vendor/libgit2/tests/resources/revert/.gitted/objects/ac/c4d33902092efeb3b714aa0b1007c329e2f2e6 deleted file mode 100644 index 91bb68b419..0000000000 --- a/vendor/libgit2/tests/resources/revert/.gitted/objects/ac/c4d33902092efeb3b714aa0b1007c329e2f2e6 +++ /dev/null @@ -1,2 +0,0 @@ -xŤÍ[ -1 @QßJW‘ étŇ6 F,LâţWŕßý8peé˝ř1llU.LŹĘiT B‡dN0z¸"!:ůML˙ä®˝šąő$Î \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/revert/.gitted/objects/b7/a55408832174c54708906a372a9be2ffe3649b b/vendor/libgit2/tests/resources/revert/.gitted/objects/b7/a55408832174c54708906a372a9be2ffe3649b deleted file mode 100644 index 77d4e20f92..0000000000 Binary files a/vendor/libgit2/tests/resources/revert/.gitted/objects/b7/a55408832174c54708906a372a9be2ffe3649b and /dev/null differ diff --git a/vendor/libgit2/tests/resources/revert/.gitted/objects/be/ead165e017269e8dc0dd6f01195726a2e1e01b b/vendor/libgit2/tests/resources/revert/.gitted/objects/be/ead165e017269e8dc0dd6f01195726a2e1e01b deleted file mode 100644 index 57de3f2785..0000000000 Binary files a/vendor/libgit2/tests/resources/revert/.gitted/objects/be/ead165e017269e8dc0dd6f01195726a2e1e01b and /dev/null differ diff --git a/vendor/libgit2/tests/resources/revert/.gitted/objects/ce/f56612d71a6af8d8015691e4865f7fece905b5 b/vendor/libgit2/tests/resources/revert/.gitted/objects/ce/f56612d71a6af8d8015691e4865f7fece905b5 deleted file mode 100644 index 564588539c..0000000000 Binary files a/vendor/libgit2/tests/resources/revert/.gitted/objects/ce/f56612d71a6af8d8015691e4865f7fece905b5 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/revert/.gitted/objects/d1/d403d22cbe24592d725f442835cf46fe60c8ac b/vendor/libgit2/tests/resources/revert/.gitted/objects/d1/d403d22cbe24592d725f442835cf46fe60c8ac deleted file mode 100644 index 2190bb449d..0000000000 Binary files a/vendor/libgit2/tests/resources/revert/.gitted/objects/d1/d403d22cbe24592d725f442835cf46fe60c8ac and /dev/null differ diff --git a/vendor/libgit2/tests/resources/revert/.gitted/objects/dd/9a159c89509e73fd37d6af99619994cf7dfc06 b/vendor/libgit2/tests/resources/revert/.gitted/objects/dd/9a159c89509e73fd37d6af99619994cf7dfc06 deleted file mode 100644 index ed80d0aa5a..0000000000 Binary files a/vendor/libgit2/tests/resources/revert/.gitted/objects/dd/9a159c89509e73fd37d6af99619994cf7dfc06 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/revert/.gitted/objects/e3/4ef1afe54eb526fd92eec66084125f340f1d65 b/vendor/libgit2/tests/resources/revert/.gitted/objects/e3/4ef1afe54eb526fd92eec66084125f340f1d65 deleted file mode 100644 index fc19ebd3de..0000000000 Binary files a/vendor/libgit2/tests/resources/revert/.gitted/objects/e3/4ef1afe54eb526fd92eec66084125f340f1d65 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/revert/.gitted/objects/e5/f831f064adf9224d8c3ce556959d9d61b3c0a9 b/vendor/libgit2/tests/resources/revert/.gitted/objects/e5/f831f064adf9224d8c3ce556959d9d61b3c0a9 deleted file mode 100644 index 665f1a1a2a..0000000000 --- a/vendor/libgit2/tests/resources/revert/.gitted/objects/e5/f831f064adf9224d8c3ce556959d9d61b3c0a9 +++ /dev/null @@ -1 +0,0 @@ -xĄOIj1ôYŻh|Źé–[3„K>`üIÝbć +h”äű™8y@Ŕ§*Ş –Üj]śŃFWBÂě ĎD2ˇ §(4Q#N(,˛ckŢc×Ű€0«łâÔSqLč1Ë”‚ő6”ä]Ę,ž$`2ńc,­Ă›|Ĺ.p]ZÝÚ žuWŘk]so[+ă”[}bbf´|†'dDł«űСD‹~jpüĂŞGc®ËşAżü–üűÔÉ|ki`ö \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/revert/.gitted/objects/ea/392a157085bc32daccd59aa1998fe2f5fb9fc0 b/vendor/libgit2/tests/resources/revert/.gitted/objects/ea/392a157085bc32daccd59aa1998fe2f5fb9fc0 deleted file mode 100644 index 1451a6ac44..0000000000 Binary files a/vendor/libgit2/tests/resources/revert/.gitted/objects/ea/392a157085bc32daccd59aa1998fe2f5fb9fc0 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/revert/.gitted/objects/eb/b03002cee5d66c7732dd06241119fe72ab96a5 b/vendor/libgit2/tests/resources/revert/.gitted/objects/eb/b03002cee5d66c7732dd06241119fe72ab96a5 deleted file mode 100644 index 802125ebb2..0000000000 --- a/vendor/libgit2/tests/resources/revert/.gitted/objects/eb/b03002cee5d66c7732dd06241119fe72ab96a5 +++ /dev/null @@ -1,2 +0,0 @@ -xĄŤÁ 1E=§Ši@I6&AÄ‹Ř@6;ĂĚdGlßX‡źwřŻHkUÁa` \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/revert/.gitted/objects/ee/c6adcb2f3ceca0cadeccfe01b19382252ece9b b/vendor/libgit2/tests/resources/revert/.gitted/objects/ee/c6adcb2f3ceca0cadeccfe01b19382252ece9b deleted file mode 100644 index f59f3d48de..0000000000 Binary files a/vendor/libgit2/tests/resources/revert/.gitted/objects/ee/c6adcb2f3ceca0cadeccfe01b19382252ece9b and /dev/null differ diff --git a/vendor/libgit2/tests/resources/revert/.gitted/objects/f4/e107c230d08a60fb419d19869f1f282b272d9c b/vendor/libgit2/tests/resources/revert/.gitted/objects/f4/e107c230d08a60fb419d19869f1f282b272d9c deleted file mode 100644 index 029da1ba91..0000000000 Binary files a/vendor/libgit2/tests/resources/revert/.gitted/objects/f4/e107c230d08a60fb419d19869f1f282b272d9c and /dev/null differ diff --git a/vendor/libgit2/tests/resources/revert/.gitted/refs/heads/master b/vendor/libgit2/tests/resources/revert/.gitted/refs/heads/master deleted file mode 100644 index 180f407e3c..0000000000 --- a/vendor/libgit2/tests/resources/revert/.gitted/refs/heads/master +++ /dev/null @@ -1 +0,0 @@ -2d440f2b3147d3dc7ad1085813478d6d869d5a4d diff --git a/vendor/libgit2/tests/resources/revert/.gitted/refs/heads/merges b/vendor/libgit2/tests/resources/revert/.gitted/refs/heads/merges deleted file mode 100644 index 6533a947ba..0000000000 --- a/vendor/libgit2/tests/resources/revert/.gitted/refs/heads/merges +++ /dev/null @@ -1 +0,0 @@ -5acdc74af27172ec491d213ee36cea7eb9ef2579 diff --git a/vendor/libgit2/tests/resources/revert/.gitted/refs/heads/merges-branch b/vendor/libgit2/tests/resources/revert/.gitted/refs/heads/merges-branch deleted file mode 100644 index febb29c445..0000000000 --- a/vendor/libgit2/tests/resources/revert/.gitted/refs/heads/merges-branch +++ /dev/null @@ -1 +0,0 @@ -13ee9cd5d8e1023c218e0e1ea684ec0c582b5050 diff --git a/vendor/libgit2/tests/resources/revert/.gitted/refs/heads/reverted-branch b/vendor/libgit2/tests/resources/revert/.gitted/refs/heads/reverted-branch deleted file mode 100644 index 16bb7a2d72..0000000000 --- a/vendor/libgit2/tests/resources/revert/.gitted/refs/heads/reverted-branch +++ /dev/null @@ -1 +0,0 @@ -52c95c4264245469a0617e289a7d737f156826b4 diff --git a/vendor/libgit2/tests/resources/revert/.gitted/refs/heads/two b/vendor/libgit2/tests/resources/revert/.gitted/refs/heads/two deleted file mode 100644 index 69d76cfad8..0000000000 --- a/vendor/libgit2/tests/resources/revert/.gitted/refs/heads/two +++ /dev/null @@ -1 +0,0 @@ -75ec9929465623f17ff3ad68c0438ea56faba815 diff --git a/vendor/libgit2/tests/resources/revert/file1.txt b/vendor/libgit2/tests/resources/revert/file1.txt deleted file mode 100644 index 84b2259401..0000000000 --- a/vendor/libgit2/tests/resources/revert/file1.txt +++ /dev/null @@ -1,14 +0,0 @@ -!File one! -!File one! -File one! -File one -File one -File one -File one -File one -File one -File one -File one! -!File one! -!File one! -!File one! diff --git a/vendor/libgit2/tests/resources/revert/file2.txt b/vendor/libgit2/tests/resources/revert/file2.txt deleted file mode 100644 index acb5747b3e..0000000000 --- a/vendor/libgit2/tests/resources/revert/file2.txt +++ /dev/null @@ -1,16 +0,0 @@ -File two -File two -File two -File two -File two -File two -File two -File two -File two -File two -File two -File two -File two -File two -File two -File two diff --git a/vendor/libgit2/tests/resources/revert/file3.txt b/vendor/libgit2/tests/resources/revert/file3.txt deleted file mode 100644 index b0330597f4..0000000000 --- a/vendor/libgit2/tests/resources/revert/file3.txt +++ /dev/null @@ -1,16 +0,0 @@ -File three -File three -File three -File three -File three -File three -File three -File three -File three -File three -File three -File three -File three -File three -File three -File three diff --git a/vendor/libgit2/tests/resources/revert/file6.txt b/vendor/libgit2/tests/resources/revert/file6.txt deleted file mode 100644 index 5c0cd5d561..0000000000 --- a/vendor/libgit2/tests/resources/revert/file6.txt +++ /dev/null @@ -1,14 +0,0 @@ -File six, actually! -File four! -File four! -File four! -File four! -File four! -File four! -File four! -File four! -File four! -File four! -File four! -File four! -File four! diff --git a/vendor/libgit2/tests/resources/shallow.git/HEAD b/vendor/libgit2/tests/resources/shallow.git/HEAD deleted file mode 100644 index cb089cd89a..0000000000 --- a/vendor/libgit2/tests/resources/shallow.git/HEAD +++ /dev/null @@ -1 +0,0 @@ -ref: refs/heads/master diff --git a/vendor/libgit2/tests/resources/shallow.git/config b/vendor/libgit2/tests/resources/shallow.git/config deleted file mode 100644 index a88b74b691..0000000000 --- a/vendor/libgit2/tests/resources/shallow.git/config +++ /dev/null @@ -1,8 +0,0 @@ -[core] - repositoryformatversion = 0 - filemode = true - bare = true - ignorecase = true - precomposeunicode = false -[remote "origin"] - url = file://testrepo.git diff --git a/vendor/libgit2/tests/resources/shallow.git/objects/pack/pack-706e49b161700946489570d96153e5be4dc31ad4.idx b/vendor/libgit2/tests/resources/shallow.git/objects/pack/pack-706e49b161700946489570d96153e5be4dc31ad4.idx deleted file mode 100644 index bfc7d24ff4..0000000000 Binary files a/vendor/libgit2/tests/resources/shallow.git/objects/pack/pack-706e49b161700946489570d96153e5be4dc31ad4.idx and /dev/null differ diff --git a/vendor/libgit2/tests/resources/shallow.git/objects/pack/pack-706e49b161700946489570d96153e5be4dc31ad4.pack b/vendor/libgit2/tests/resources/shallow.git/objects/pack/pack-706e49b161700946489570d96153e5be4dc31ad4.pack deleted file mode 100644 index ccc6932fc4..0000000000 Binary files a/vendor/libgit2/tests/resources/shallow.git/objects/pack/pack-706e49b161700946489570d96153e5be4dc31ad4.pack and /dev/null differ diff --git a/vendor/libgit2/tests/resources/shallow.git/packed-refs b/vendor/libgit2/tests/resources/shallow.git/packed-refs deleted file mode 100644 index 97eed743be..0000000000 --- a/vendor/libgit2/tests/resources/shallow.git/packed-refs +++ /dev/null @@ -1,2 +0,0 @@ -# pack-refs with: peeled -a65fedf39aefe402d3bb6e24df4d4f5fe4547750 refs/heads/master diff --git a/vendor/libgit2/tests/resources/shallow.git/refs/.gitkeep b/vendor/libgit2/tests/resources/shallow.git/refs/.gitkeep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/vendor/libgit2/tests/resources/shallow.git/shallow b/vendor/libgit2/tests/resources/shallow.git/shallow deleted file mode 100644 index 9536ad89cf..0000000000 --- a/vendor/libgit2/tests/resources/shallow.git/shallow +++ /dev/null @@ -1 +0,0 @@ -be3563ae3f795b2b4353bcce3a527ad0a4f7f644 diff --git a/vendor/libgit2/tests/resources/short_tag.git/HEAD b/vendor/libgit2/tests/resources/short_tag.git/HEAD deleted file mode 100644 index cb089cd89a..0000000000 --- a/vendor/libgit2/tests/resources/short_tag.git/HEAD +++ /dev/null @@ -1 +0,0 @@ -ref: refs/heads/master diff --git a/vendor/libgit2/tests/resources/short_tag.git/config b/vendor/libgit2/tests/resources/short_tag.git/config deleted file mode 100644 index a4ef456cbc..0000000000 --- a/vendor/libgit2/tests/resources/short_tag.git/config +++ /dev/null @@ -1,5 +0,0 @@ -[core] - repositoryformatversion = 0 - filemode = true - bare = true - logallrefupdates = true diff --git a/vendor/libgit2/tests/resources/short_tag.git/index b/vendor/libgit2/tests/resources/short_tag.git/index deleted file mode 100644 index 87fef78470..0000000000 Binary files a/vendor/libgit2/tests/resources/short_tag.git/index and /dev/null differ diff --git a/vendor/libgit2/tests/resources/short_tag.git/objects/4a/5ed60bafcf4638b7c8356bd4ce1916bfede93c b/vendor/libgit2/tests/resources/short_tag.git/objects/4a/5ed60bafcf4638b7c8356bd4ce1916bfede93c deleted file mode 100644 index aeb4e4b0b8..0000000000 Binary files a/vendor/libgit2/tests/resources/short_tag.git/objects/4a/5ed60bafcf4638b7c8356bd4ce1916bfede93c and /dev/null differ diff --git a/vendor/libgit2/tests/resources/short_tag.git/objects/4d/5fcadc293a348e88f777dc0920f11e7d71441c b/vendor/libgit2/tests/resources/short_tag.git/objects/4d/5fcadc293a348e88f777dc0920f11e7d71441c deleted file mode 100644 index 806ce71a55..0000000000 Binary files a/vendor/libgit2/tests/resources/short_tag.git/objects/4d/5fcadc293a348e88f777dc0920f11e7d71441c and /dev/null differ diff --git a/vendor/libgit2/tests/resources/short_tag.git/objects/5d/a7760512a953e3c7c4e47e4392c7a4338fb729 b/vendor/libgit2/tests/resources/short_tag.git/objects/5d/a7760512a953e3c7c4e47e4392c7a4338fb729 deleted file mode 100644 index 1192707c99..0000000000 --- a/vendor/libgit2/tests/resources/short_tag.git/objects/5d/a7760512a953e3c7c4e47e4392c7a4338fb729 +++ /dev/null @@ -1 +0,0 @@ -xĚM‚0@aלb. ií%1ĆŤ—pcÚé@Š”čé-Ëď-ű¤6§&Bí E+‚pĐVąĐˇSƆ¨‘d/m(RݰáďJ€%çÄ ×ÇR^‘vÜŇĘ©,GiÇ–Ţđń <Ó´3\©ş­n‡ďcöinëĺRé„SögŃ Ńüëu1 \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/short_tag.git/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391 b/vendor/libgit2/tests/resources/short_tag.git/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391 deleted file mode 100644 index 7112238943..0000000000 Binary files a/vendor/libgit2/tests/resources/short_tag.git/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/short_tag.git/packed-refs b/vendor/libgit2/tests/resources/short_tag.git/packed-refs deleted file mode 100644 index ca5197e3cc..0000000000 --- a/vendor/libgit2/tests/resources/short_tag.git/packed-refs +++ /dev/null @@ -1 +0,0 @@ -5da7760512a953e3c7c4e47e4392c7a4338fb729 refs/tags/no_description diff --git a/vendor/libgit2/tests/resources/short_tag.git/refs/heads/master b/vendor/libgit2/tests/resources/short_tag.git/refs/heads/master deleted file mode 100644 index fcefd1ef0c..0000000000 --- a/vendor/libgit2/tests/resources/short_tag.git/refs/heads/master +++ /dev/null @@ -1 +0,0 @@ -4a5ed60bafcf4638b7c8356bd4ce1916bfede93c diff --git a/vendor/libgit2/tests/resources/status/.gitted/COMMIT_EDITMSG b/vendor/libgit2/tests/resources/status/.gitted/COMMIT_EDITMSG deleted file mode 100644 index 1a25cd4a63..0000000000 --- a/vendor/libgit2/tests/resources/status/.gitted/COMMIT_EDITMSG +++ /dev/null @@ -1 +0,0 @@ -Add a file which name should appear before the "subdir/" folder while being dealt with by the treewalker diff --git a/vendor/libgit2/tests/resources/status/.gitted/HEAD b/vendor/libgit2/tests/resources/status/.gitted/HEAD deleted file mode 100644 index cb089cd89a..0000000000 --- a/vendor/libgit2/tests/resources/status/.gitted/HEAD +++ /dev/null @@ -1 +0,0 @@ -ref: refs/heads/master diff --git a/vendor/libgit2/tests/resources/status/.gitted/ORIG_HEAD b/vendor/libgit2/tests/resources/status/.gitted/ORIG_HEAD deleted file mode 100644 index b46871fd6e..0000000000 --- a/vendor/libgit2/tests/resources/status/.gitted/ORIG_HEAD +++ /dev/null @@ -1 +0,0 @@ -735b6a258cd196a8f7c9428419b02c1dca93fd75 diff --git a/vendor/libgit2/tests/resources/status/.gitted/config b/vendor/libgit2/tests/resources/status/.gitted/config deleted file mode 100644 index af107929f2..0000000000 --- a/vendor/libgit2/tests/resources/status/.gitted/config +++ /dev/null @@ -1,6 +0,0 @@ -[core] - repositoryformatversion = 0 - filemode = true - bare = false - logallrefupdates = true - ignorecase = true diff --git a/vendor/libgit2/tests/resources/status/.gitted/description b/vendor/libgit2/tests/resources/status/.gitted/description deleted file mode 100644 index 498b267a8c..0000000000 --- a/vendor/libgit2/tests/resources/status/.gitted/description +++ /dev/null @@ -1 +0,0 @@ -Unnamed repository; edit this file 'description' to name the repository. diff --git a/vendor/libgit2/tests/resources/status/.gitted/index b/vendor/libgit2/tests/resources/status/.gitted/index deleted file mode 100644 index 2af99a1830..0000000000 Binary files a/vendor/libgit2/tests/resources/status/.gitted/index and /dev/null differ diff --git a/vendor/libgit2/tests/resources/status/.gitted/info/exclude b/vendor/libgit2/tests/resources/status/.gitted/info/exclude deleted file mode 100644 index 0c4042a6a9..0000000000 --- a/vendor/libgit2/tests/resources/status/.gitted/info/exclude +++ /dev/null @@ -1,8 +0,0 @@ -# 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] -# *~ -ignored* - diff --git a/vendor/libgit2/tests/resources/status/.gitted/logs/HEAD b/vendor/libgit2/tests/resources/status/.gitted/logs/HEAD deleted file mode 100644 index 7b95b3cf1c..0000000000 --- a/vendor/libgit2/tests/resources/status/.gitted/logs/HEAD +++ /dev/null @@ -1,3 +0,0 @@ -0000000000000000000000000000000000000000 0017bd4ab1ec30440b17bae1680cff124ab5f1f6 Jason Penny 1308050070 -0400 commit (initial): initial -0017bd4ab1ec30440b17bae1680cff124ab5f1f6 735b6a258cd196a8f7c9428419b02c1dca93fd75 Jason Penny 1308954538 -0400 commit: add subdir -735b6a258cd196a8f7c9428419b02c1dca93fd75 26a125ee1bfc5df1e1b2e9441bbe63c8a7ae989f nulltoken 1319911544 +0200 commit: Add a file which name should appear before the "subdir/" folder while being dealt with by the treewalker diff --git a/vendor/libgit2/tests/resources/status/.gitted/logs/refs/heads/master b/vendor/libgit2/tests/resources/status/.gitted/logs/refs/heads/master deleted file mode 100644 index 7b95b3cf1c..0000000000 --- a/vendor/libgit2/tests/resources/status/.gitted/logs/refs/heads/master +++ /dev/null @@ -1,3 +0,0 @@ -0000000000000000000000000000000000000000 0017bd4ab1ec30440b17bae1680cff124ab5f1f6 Jason Penny 1308050070 -0400 commit (initial): initial -0017bd4ab1ec30440b17bae1680cff124ab5f1f6 735b6a258cd196a8f7c9428419b02c1dca93fd75 Jason Penny 1308954538 -0400 commit: add subdir -735b6a258cd196a8f7c9428419b02c1dca93fd75 26a125ee1bfc5df1e1b2e9441bbe63c8a7ae989f nulltoken 1319911544 +0200 commit: Add a file which name should appear before the "subdir/" folder while being dealt with by the treewalker diff --git a/vendor/libgit2/tests/resources/status/.gitted/objects/00/17bd4ab1ec30440b17bae1680cff124ab5f1f6 b/vendor/libgit2/tests/resources/status/.gitted/objects/00/17bd4ab1ec30440b17bae1680cff124ab5f1f6 deleted file mode 100644 index b256d95a35..0000000000 --- a/vendor/libgit2/tests/resources/status/.gitted/objects/00/17bd4ab1ec30440b17bae1680cff124ab5f1f6 +++ /dev/null @@ -1,2 +0,0 @@ -xťŤA E]sŠą€fh)‰1]»ň -#SŔTşđö¶Wp÷ßK^~¨9§šÜˇ-"ŕC'Ř…)FvőbvÉ Ţ"¶wŽŽĽEĹk{Ö®ü©nRĘÎŻŢű6ă#sšOˇć č„pD¨6»ť6ů3W©¤–xV?¨Ĺ9é \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/status/.gitted/objects/06/1d42a44cacde5726057b67558821d95db96f19 b/vendor/libgit2/tests/resources/status/.gitted/objects/06/1d42a44cacde5726057b67558821d95db96f19 deleted file mode 100644 index 82e02cb0e0..0000000000 Binary files a/vendor/libgit2/tests/resources/status/.gitted/objects/06/1d42a44cacde5726057b67558821d95db96f19 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/status/.gitted/objects/18/88c805345ba265b0ee9449b8877b6064592058 b/vendor/libgit2/tests/resources/status/.gitted/objects/18/88c805345ba265b0ee9449b8877b6064592058 deleted file mode 100644 index e3cad2f024..0000000000 Binary files a/vendor/libgit2/tests/resources/status/.gitted/objects/18/88c805345ba265b0ee9449b8877b6064592058 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/status/.gitted/objects/19/d9cc8584ac2c7dcf57d2680375e80f099dc481 b/vendor/libgit2/tests/resources/status/.gitted/objects/19/d9cc8584ac2c7dcf57d2680375e80f099dc481 deleted file mode 100644 index 2d5e711b97..0000000000 Binary files a/vendor/libgit2/tests/resources/status/.gitted/objects/19/d9cc8584ac2c7dcf57d2680375e80f099dc481 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/status/.gitted/objects/26/a125ee1bfc5df1e1b2e9441bbe63c8a7ae989f b/vendor/libgit2/tests/resources/status/.gitted/objects/26/a125ee1bfc5df1e1b2e9441bbe63c8a7ae989f deleted file mode 100644 index f7dddc4ffb..0000000000 --- a/vendor/libgit2/tests/resources/status/.gitted/objects/26/a125ee1bfc5df1e1b2e9441bbe63c8a7ae989f +++ /dev/null @@ -1,2 +0,0 @@ -xťMnÄ …»Î)¬ŮVšň† ŤŞö(Ě€BD˘ŢľLŹĐŤöűüžž«Ą¤RČ·Ţ@ęŕ,Î9Ž‹ňÜĚśtŕěć•đNj6f`žM6Z;h©ě …ZÜĐŢp Ú™Y,37Ż/Ü;42x­&ŔćgęěĎźüŐۉůImú|˝jń \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/status/.gitted/objects/32/504b727382542f9f089e24fddac5e78533e96c b/vendor/libgit2/tests/resources/status/.gitted/objects/32/504b727382542f9f089e24fddac5e78533e96c deleted file mode 100644 index 7fca67be8d..0000000000 Binary files a/vendor/libgit2/tests/resources/status/.gitted/objects/32/504b727382542f9f089e24fddac5e78533e96c and /dev/null differ diff --git a/vendor/libgit2/tests/resources/status/.gitted/objects/37/fcb02ccc1a85d1941e7f106d52dc3702dcf0d0 b/vendor/libgit2/tests/resources/status/.gitted/objects/37/fcb02ccc1a85d1941e7f106d52dc3702dcf0d0 deleted file mode 100644 index b75481b51c..0000000000 Binary files a/vendor/libgit2/tests/resources/status/.gitted/objects/37/fcb02ccc1a85d1941e7f106d52dc3702dcf0d0 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/status/.gitted/objects/45/2e4244b5d083ddf0460acf1ecc74db9dcfa11a b/vendor/libgit2/tests/resources/status/.gitted/objects/45/2e4244b5d083ddf0460acf1ecc74db9dcfa11a deleted file mode 100644 index 5b47461e9c..0000000000 Binary files a/vendor/libgit2/tests/resources/status/.gitted/objects/45/2e4244b5d083ddf0460acf1ecc74db9dcfa11a and /dev/null differ diff --git a/vendor/libgit2/tests/resources/status/.gitted/objects/52/9a16e8e762d4acb7b9636ff540a00831f9155a b/vendor/libgit2/tests/resources/status/.gitted/objects/52/9a16e8e762d4acb7b9636ff540a00831f9155a deleted file mode 100644 index 615009ad04..0000000000 Binary files a/vendor/libgit2/tests/resources/status/.gitted/objects/52/9a16e8e762d4acb7b9636ff540a00831f9155a and /dev/null differ diff --git a/vendor/libgit2/tests/resources/status/.gitted/objects/53/ace0d1cc1145a5f4fe4f78a186a60263190733 b/vendor/libgit2/tests/resources/status/.gitted/objects/53/ace0d1cc1145a5f4fe4f78a186a60263190733 deleted file mode 100644 index cdb7e961a9..0000000000 Binary files a/vendor/libgit2/tests/resources/status/.gitted/objects/53/ace0d1cc1145a5f4fe4f78a186a60263190733 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/status/.gitted/objects/54/52d32f1dd538eb0405e8a83cc185f79e25e80f b/vendor/libgit2/tests/resources/status/.gitted/objects/54/52d32f1dd538eb0405e8a83cc185f79e25e80f deleted file mode 100644 index a72dff646b..0000000000 Binary files a/vendor/libgit2/tests/resources/status/.gitted/objects/54/52d32f1dd538eb0405e8a83cc185f79e25e80f and /dev/null differ diff --git a/vendor/libgit2/tests/resources/status/.gitted/objects/55/d316c9ba708999f1918e9677d01dfcae69c6b9 b/vendor/libgit2/tests/resources/status/.gitted/objects/55/d316c9ba708999f1918e9677d01dfcae69c6b9 deleted file mode 100644 index 72807f3d00..0000000000 Binary files a/vendor/libgit2/tests/resources/status/.gitted/objects/55/d316c9ba708999f1918e9677d01dfcae69c6b9 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/status/.gitted/objects/70/bd9443ada07063e7fbf0b3ff5c13f7494d89c2 b/vendor/libgit2/tests/resources/status/.gitted/objects/70/bd9443ada07063e7fbf0b3ff5c13f7494d89c2 deleted file mode 100644 index 3665a8f7c0..0000000000 Binary files a/vendor/libgit2/tests/resources/status/.gitted/objects/70/bd9443ada07063e7fbf0b3ff5c13f7494d89c2 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/status/.gitted/objects/73/5b6a258cd196a8f7c9428419b02c1dca93fd75 b/vendor/libgit2/tests/resources/status/.gitted/objects/73/5b6a258cd196a8f7c9428419b02c1dca93fd75 deleted file mode 100644 index 08e6fd2460..0000000000 Binary files a/vendor/libgit2/tests/resources/status/.gitted/objects/73/5b6a258cd196a8f7c9428419b02c1dca93fd75 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/status/.gitted/objects/75/6e27627e67bfbc048d01ece5819c6de733d7ea b/vendor/libgit2/tests/resources/status/.gitted/objects/75/6e27627e67bfbc048d01ece5819c6de733d7ea deleted file mode 100644 index 8f3fa89e5b..0000000000 Binary files a/vendor/libgit2/tests/resources/status/.gitted/objects/75/6e27627e67bfbc048d01ece5819c6de733d7ea and /dev/null differ diff --git a/vendor/libgit2/tests/resources/status/.gitted/objects/90/6ee7711f4f4928ddcb2a5f8fbc500deba0d2a8 b/vendor/libgit2/tests/resources/status/.gitted/objects/90/6ee7711f4f4928ddcb2a5f8fbc500deba0d2a8 deleted file mode 100644 index bb732b08e0..0000000000 Binary files a/vendor/libgit2/tests/resources/status/.gitted/objects/90/6ee7711f4f4928ddcb2a5f8fbc500deba0d2a8 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/status/.gitted/objects/90/b8c29d8ba39434d1c63e1b093daaa26e5bd972 b/vendor/libgit2/tests/resources/status/.gitted/objects/90/b8c29d8ba39434d1c63e1b093daaa26e5bd972 deleted file mode 100644 index 7a96618ff1..0000000000 Binary files a/vendor/libgit2/tests/resources/status/.gitted/objects/90/b8c29d8ba39434d1c63e1b093daaa26e5bd972 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/status/.gitted/objects/9c/2e02cdffa8d73e6c189074594477a6baf87960 b/vendor/libgit2/tests/resources/status/.gitted/objects/9c/2e02cdffa8d73e6c189074594477a6baf87960 deleted file mode 100644 index 20a3c497e5..0000000000 Binary files a/vendor/libgit2/tests/resources/status/.gitted/objects/9c/2e02cdffa8d73e6c189074594477a6baf87960 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/status/.gitted/objects/a0/de7e0ac200c489c41c59dfa910154a70264e6e b/vendor/libgit2/tests/resources/status/.gitted/objects/a0/de7e0ac200c489c41c59dfa910154a70264e6e deleted file mode 100644 index a1789c9a61..0000000000 Binary files a/vendor/libgit2/tests/resources/status/.gitted/objects/a0/de7e0ac200c489c41c59dfa910154a70264e6e and /dev/null differ diff --git a/vendor/libgit2/tests/resources/status/.gitted/objects/a6/191982709b746d5650e93c2acf34ef74e11504 b/vendor/libgit2/tests/resources/status/.gitted/objects/a6/191982709b746d5650e93c2acf34ef74e11504 deleted file mode 100644 index cc1f377b30..0000000000 Binary files a/vendor/libgit2/tests/resources/status/.gitted/objects/a6/191982709b746d5650e93c2acf34ef74e11504 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/status/.gitted/objects/a6/be623522ce87a1d862128ac42672604f7b468b b/vendor/libgit2/tests/resources/status/.gitted/objects/a6/be623522ce87a1d862128ac42672604f7b468b deleted file mode 100644 index c47298347d..0000000000 Binary files a/vendor/libgit2/tests/resources/status/.gitted/objects/a6/be623522ce87a1d862128ac42672604f7b468b and /dev/null differ diff --git a/vendor/libgit2/tests/resources/status/.gitted/objects/aa/27a641456848200fdb7f7c99ba36f8a0952877 b/vendor/libgit2/tests/resources/status/.gitted/objects/aa/27a641456848200fdb7f7c99ba36f8a0952877 deleted file mode 100644 index a4669ccbb2..0000000000 Binary files a/vendor/libgit2/tests/resources/status/.gitted/objects/aa/27a641456848200fdb7f7c99ba36f8a0952877 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/status/.gitted/objects/da/bc8af9bd6e9f5bbe96a176f1a24baf3d1f8916 b/vendor/libgit2/tests/resources/status/.gitted/objects/da/bc8af9bd6e9f5bbe96a176f1a24baf3d1f8916 deleted file mode 100644 index 3e3c03c96f..0000000000 Binary files a/vendor/libgit2/tests/resources/status/.gitted/objects/da/bc8af9bd6e9f5bbe96a176f1a24baf3d1f8916 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/status/.gitted/objects/e8/ee89e15bbe9b20137715232387b3de5b28972e b/vendor/libgit2/tests/resources/status/.gitted/objects/e8/ee89e15bbe9b20137715232387b3de5b28972e deleted file mode 100644 index cfc2413d5e..0000000000 Binary files a/vendor/libgit2/tests/resources/status/.gitted/objects/e8/ee89e15bbe9b20137715232387b3de5b28972e and /dev/null differ diff --git a/vendor/libgit2/tests/resources/status/.gitted/objects/e9/b9107f290627c04d097733a10055af941f6bca b/vendor/libgit2/tests/resources/status/.gitted/objects/e9/b9107f290627c04d097733a10055af941f6bca deleted file mode 100644 index 1266d3eac7..0000000000 Binary files a/vendor/libgit2/tests/resources/status/.gitted/objects/e9/b9107f290627c04d097733a10055af941f6bca and /dev/null differ diff --git a/vendor/libgit2/tests/resources/status/.gitted/objects/ed/062903b8f6f3dccb2fa81117ba6590944ef9bd b/vendor/libgit2/tests/resources/status/.gitted/objects/ed/062903b8f6f3dccb2fa81117ba6590944ef9bd deleted file mode 100644 index 8fa8c17074..0000000000 Binary files a/vendor/libgit2/tests/resources/status/.gitted/objects/ed/062903b8f6f3dccb2fa81117ba6590944ef9bd and /dev/null differ diff --git a/vendor/libgit2/tests/resources/status/.gitted/refs/heads/master b/vendor/libgit2/tests/resources/status/.gitted/refs/heads/master deleted file mode 100644 index 3e2e2a07a9..0000000000 --- a/vendor/libgit2/tests/resources/status/.gitted/refs/heads/master +++ /dev/null @@ -1 +0,0 @@ -26a125ee1bfc5df1e1b2e9441bbe63c8a7ae989f diff --git a/vendor/libgit2/tests/resources/status/current_file b/vendor/libgit2/tests/resources/status/current_file deleted file mode 100644 index a0de7e0ac2..0000000000 --- a/vendor/libgit2/tests/resources/status/current_file +++ /dev/null @@ -1 +0,0 @@ -current_file diff --git a/vendor/libgit2/tests/resources/status/ignored_file b/vendor/libgit2/tests/resources/status/ignored_file deleted file mode 100644 index 6a79f808a9..0000000000 --- a/vendor/libgit2/tests/resources/status/ignored_file +++ /dev/null @@ -1 +0,0 @@ -ignored_file diff --git a/vendor/libgit2/tests/resources/status/modified_file b/vendor/libgit2/tests/resources/status/modified_file deleted file mode 100644 index 0a53963052..0000000000 --- a/vendor/libgit2/tests/resources/status/modified_file +++ /dev/null @@ -1,2 +0,0 @@ -modified_file -modified_file diff --git a/vendor/libgit2/tests/resources/status/new_file b/vendor/libgit2/tests/resources/status/new_file deleted file mode 100644 index d4fa8600b4..0000000000 --- a/vendor/libgit2/tests/resources/status/new_file +++ /dev/null @@ -1 +0,0 @@ -new_file diff --git a/vendor/libgit2/tests/resources/status/staged_changes b/vendor/libgit2/tests/resources/status/staged_changes deleted file mode 100644 index 55d316c9ba..0000000000 --- a/vendor/libgit2/tests/resources/status/staged_changes +++ /dev/null @@ -1,2 +0,0 @@ -staged_changes -staged_changes diff --git a/vendor/libgit2/tests/resources/status/staged_changes_modified_file b/vendor/libgit2/tests/resources/status/staged_changes_modified_file deleted file mode 100644 index 011c3440d5..0000000000 --- a/vendor/libgit2/tests/resources/status/staged_changes_modified_file +++ /dev/null @@ -1,3 +0,0 @@ -staged_changes_modified_file -staged_changes_modified_file -staged_changes_modified_file diff --git a/vendor/libgit2/tests/resources/status/staged_delete_modified_file b/vendor/libgit2/tests/resources/status/staged_delete_modified_file deleted file mode 100644 index dabc8af9bd..0000000000 --- a/vendor/libgit2/tests/resources/status/staged_delete_modified_file +++ /dev/null @@ -1 +0,0 @@ -staged_delete_modified_file diff --git a/vendor/libgit2/tests/resources/status/staged_new_file b/vendor/libgit2/tests/resources/status/staged_new_file deleted file mode 100644 index 529a16e8e7..0000000000 --- a/vendor/libgit2/tests/resources/status/staged_new_file +++ /dev/null @@ -1 +0,0 @@ -staged_new_file diff --git a/vendor/libgit2/tests/resources/status/staged_new_file_modified_file b/vendor/libgit2/tests/resources/status/staged_new_file_modified_file deleted file mode 100644 index 8b090c06d1..0000000000 --- a/vendor/libgit2/tests/resources/status/staged_new_file_modified_file +++ /dev/null @@ -1,2 +0,0 @@ -staged_new_file_modified_file -staged_new_file_modified_file diff --git a/vendor/libgit2/tests/resources/status/subdir.txt b/vendor/libgit2/tests/resources/status/subdir.txt deleted file mode 100644 index e8ee89e15b..0000000000 --- a/vendor/libgit2/tests/resources/status/subdir.txt +++ /dev/null @@ -1,2 +0,0 @@ -Is it a bird? -Is it a plane? diff --git a/vendor/libgit2/tests/resources/status/subdir/current_file b/vendor/libgit2/tests/resources/status/subdir/current_file deleted file mode 100644 index 53ace0d1cc..0000000000 --- a/vendor/libgit2/tests/resources/status/subdir/current_file +++ /dev/null @@ -1 +0,0 @@ -subdir/current_file diff --git a/vendor/libgit2/tests/resources/status/subdir/modified_file b/vendor/libgit2/tests/resources/status/subdir/modified_file deleted file mode 100644 index 57274b75ee..0000000000 --- a/vendor/libgit2/tests/resources/status/subdir/modified_file +++ /dev/null @@ -1,2 +0,0 @@ -subdir/modified_file -subdir/modified_file diff --git a/vendor/libgit2/tests/resources/status/subdir/new_file b/vendor/libgit2/tests/resources/status/subdir/new_file deleted file mode 100644 index 80a86a6931..0000000000 --- a/vendor/libgit2/tests/resources/status/subdir/new_file +++ /dev/null @@ -1 +0,0 @@ -subdir/new_file diff --git "a/vendor/libgit2/tests/resources/status/\350\277\231" "b/vendor/libgit2/tests/resources/status/\350\277\231" deleted file mode 100644 index f0ff9a197e..0000000000 --- "a/vendor/libgit2/tests/resources/status/\350\277\231" +++ /dev/null @@ -1 +0,0 @@ -This diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/HEAD b/vendor/libgit2/tests/resources/submod2/.gitted/HEAD deleted file mode 100644 index cb089cd89a..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/HEAD +++ /dev/null @@ -1 +0,0 @@ -ref: refs/heads/master diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/config b/vendor/libgit2/tests/resources/submod2/.gitted/config deleted file mode 100644 index abc420734c..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/config +++ /dev/null @@ -1,20 +0,0 @@ -[core] - repositoryformatversion = 0 - filemode = true - bare = false - logallrefupdates = true - ignorecase = true -[submodule "sm_missing_commits"] - url = ../submod2_target -[submodule "sm_unchanged"] - url = ../submod2_target -[submodule "sm_changed_file"] - url = ../submod2_target -[submodule "sm_changed_index"] - url = ../submod2_target -[submodule "sm_changed_head"] - url = ../submod2_target -[submodule "sm_changed_untracked_file"] - url = ../submod2_target -[submodule "sm_added_and_uncommited"] - url = ../submod2_target diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/description b/vendor/libgit2/tests/resources/submod2/.gitted/description deleted file mode 100644 index 498b267a8c..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/description +++ /dev/null @@ -1 +0,0 @@ -Unnamed repository; edit this file 'description' to name the repository. diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/index b/vendor/libgit2/tests/resources/submod2/.gitted/index deleted file mode 100644 index 0c17e8629d..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2/.gitted/index and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/info/exclude b/vendor/libgit2/tests/resources/submod2/.gitted/info/exclude deleted file mode 100644 index a5196d1be8..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/info/exclude +++ /dev/null @@ -1,6 +0,0 @@ -# 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/vendor/libgit2/tests/resources/submod2/.gitted/logs/HEAD b/vendor/libgit2/tests/resources/submod2/.gitted/logs/HEAD deleted file mode 100644 index 2cf2ca74dd..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/logs/HEAD +++ /dev/null @@ -1,4 +0,0 @@ -0000000000000000000000000000000000000000 14fe9ccf104058df25e0a08361c4494e167ef243 Russell Belfer 1342559771 -0700 commit (initial): Initial commit -14fe9ccf104058df25e0a08361c4494e167ef243 a9104bf89e911387244ef499413960ba472066d9 Russell Belfer 1342559831 -0700 commit: Adding a submodule -a9104bf89e911387244ef499413960ba472066d9 5901da4f1c67756eeadc5121d206bec2431f253b Russell Belfer 1342560036 -0700 commit: Updating submodule -5901da4f1c67756eeadc5121d206bec2431f253b 7484482eb8db738cafa696993664607500a3f2b9 Russell Belfer 1342560288 -0700 commit: Adding a bunch more test content diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/logs/refs/heads/master b/vendor/libgit2/tests/resources/submod2/.gitted/logs/refs/heads/master deleted file mode 100644 index 2cf2ca74dd..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/logs/refs/heads/master +++ /dev/null @@ -1,4 +0,0 @@ -0000000000000000000000000000000000000000 14fe9ccf104058df25e0a08361c4494e167ef243 Russell Belfer 1342559771 -0700 commit (initial): Initial commit -14fe9ccf104058df25e0a08361c4494e167ef243 a9104bf89e911387244ef499413960ba472066d9 Russell Belfer 1342559831 -0700 commit: Adding a submodule -a9104bf89e911387244ef499413960ba472066d9 5901da4f1c67756eeadc5121d206bec2431f253b Russell Belfer 1342560036 -0700 commit: Updating submodule -5901da4f1c67756eeadc5121d206bec2431f253b 7484482eb8db738cafa696993664607500a3f2b9 Russell Belfer 1342560288 -0700 commit: Adding a bunch more test content diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_added_and_uncommited/HEAD b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_added_and_uncommited/HEAD deleted file mode 100644 index cb089cd89a..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_added_and_uncommited/HEAD +++ /dev/null @@ -1 +0,0 @@ -ref: refs/heads/master diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_added_and_uncommited/config b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_added_and_uncommited/config deleted file mode 100644 index 2d0583e996..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_added_and_uncommited/config +++ /dev/null @@ -1,13 +0,0 @@ -[core] - repositoryformatversion = 0 - filemode = true - bare = false - logallrefupdates = true - worktree = ../../../sm_added_and_uncommited - ignorecase = true -[remote "origin"] - fetch = +refs/heads/*:refs/remotes/origin/* - url = /Users/rb/src/libgit2/tests-clar/resources/submod2_target -[branch "master"] - remote = origin - merge = refs/heads/master diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_added_and_uncommited/description b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_added_and_uncommited/description deleted file mode 100644 index 498b267a8c..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_added_and_uncommited/description +++ /dev/null @@ -1 +0,0 @@ -Unnamed repository; edit this file 'description' to name the repository. diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_added_and_uncommited/index b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_added_and_uncommited/index deleted file mode 100644 index 65140a5109..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_added_and_uncommited/index and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_added_and_uncommited/info/exclude b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_added_and_uncommited/info/exclude deleted file mode 100644 index a5196d1be8..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_added_and_uncommited/info/exclude +++ /dev/null @@ -1,6 +0,0 @@ -# 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/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_added_and_uncommited/logs/HEAD b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_added_and_uncommited/logs/HEAD deleted file mode 100644 index 53753e7dd7..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_added_and_uncommited/logs/HEAD +++ /dev/null @@ -1 +0,0 @@ -0000000000000000000000000000000000000000 480095882d281ed676fe5b863569520e54a7d5c0 Russell Belfer 1342560316 -0700 clone: from /Users/rb/src/libgit2/tests-clar/resources/submod2_target diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_added_and_uncommited/logs/refs/heads/master b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_added_and_uncommited/logs/refs/heads/master deleted file mode 100644 index 53753e7dd7..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_added_and_uncommited/logs/refs/heads/master +++ /dev/null @@ -1 +0,0 @@ -0000000000000000000000000000000000000000 480095882d281ed676fe5b863569520e54a7d5c0 Russell Belfer 1342560316 -0700 clone: from /Users/rb/src/libgit2/tests-clar/resources/submod2_target diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_added_and_uncommited/logs/refs/remotes/origin/HEAD b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_added_and_uncommited/logs/refs/remotes/origin/HEAD deleted file mode 100644 index 53753e7dd7..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_added_and_uncommited/logs/refs/remotes/origin/HEAD +++ /dev/null @@ -1 +0,0 @@ -0000000000000000000000000000000000000000 480095882d281ed676fe5b863569520e54a7d5c0 Russell Belfer 1342560316 -0700 clone: from /Users/rb/src/libgit2/tests-clar/resources/submod2_target diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_added_and_uncommited/objects/06/362fe2fdb7010d0e447b4fb450d405420479a1 b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_added_and_uncommited/objects/06/362fe2fdb7010d0e447b4fb450d405420479a1 deleted file mode 100644 index f4b7094c52..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_added_and_uncommited/objects/06/362fe2fdb7010d0e447b4fb450d405420479a1 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_added_and_uncommited/objects/0e/6a3ca48bd47cfe67681acf39aa0b10a0b92484 b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_added_and_uncommited/objects/0e/6a3ca48bd47cfe67681acf39aa0b10a0b92484 deleted file mode 100644 index 56c845e49d..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_added_and_uncommited/objects/0e/6a3ca48bd47cfe67681acf39aa0b10a0b92484 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_added_and_uncommited/objects/17/d0ece6e96460a06592d9d9d000de37ba4232c5 b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_added_and_uncommited/objects/17/d0ece6e96460a06592d9d9d000de37ba4232c5 deleted file mode 100644 index bd179b5f54..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_added_and_uncommited/objects/17/d0ece6e96460a06592d9d9d000de37ba4232c5 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_added_and_uncommited/objects/41/bd4bc3df978de695f67ace64c560913da11653 b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_added_and_uncommited/objects/41/bd4bc3df978de695f67ace64c560913da11653 deleted file mode 100644 index ccf49bd15c..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_added_and_uncommited/objects/41/bd4bc3df978de695f67ace64c560913da11653 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_added_and_uncommited/objects/48/0095882d281ed676fe5b863569520e54a7d5c0 b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_added_and_uncommited/objects/48/0095882d281ed676fe5b863569520e54a7d5c0 deleted file mode 100644 index 53029069ad..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_added_and_uncommited/objects/48/0095882d281ed676fe5b863569520e54a7d5c0 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_added_and_uncommited/objects/5e/4963595a9774b90524d35a807169049de8ccad b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_added_and_uncommited/objects/5e/4963595a9774b90524d35a807169049de8ccad deleted file mode 100644 index 38c791eba1..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_added_and_uncommited/objects/5e/4963595a9774b90524d35a807169049de8ccad and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_added_and_uncommited/objects/6b/31c659545507c381e9cd34ec508f16c04e149e b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_added_and_uncommited/objects/6b/31c659545507c381e9cd34ec508f16c04e149e deleted file mode 100644 index a26d299939..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_added_and_uncommited/objects/6b/31c659545507c381e9cd34ec508f16c04e149e +++ /dev/null @@ -1,2 +0,0 @@ -x•ŤQ -!EűvoĹÓy*Ń_żí@Çg#h‚ŁűOhý^Î9w«Ą¤ŇęSoĚ€f1*˛ŠÁ[”‰¬§čIc Ô¤ěę¤pŁďµÁkç Α\›żżS߇żlµÜ@.¤´^ŤQpF‹(ć:˙úD˙5Ĺó“zr~ ńen8 \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_added_and_uncommited/objects/73/ba924a80437097795ae839e66e187c55d3babf b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_added_and_uncommited/objects/73/ba924a80437097795ae839e66e187c55d3babf deleted file mode 100644 index 83d1ba4813..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_added_and_uncommited/objects/73/ba924a80437097795ae839e66e187c55d3babf and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_added_and_uncommited/objects/78/0d7397f5e8f8f477fb55b7af3accc2154b2d4a b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_added_and_uncommited/objects/78/0d7397f5e8f8f477fb55b7af3accc2154b2d4a deleted file mode 100644 index 6d27af8a89..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_added_and_uncommited/objects/78/0d7397f5e8f8f477fb55b7af3accc2154b2d4a +++ /dev/null @@ -1,2 +0,0 @@ -x-Ë1Â0 FaćžâßŘ0pŽŔěÄĐ(N-ĹöĐŰӡғľé±ăq]>ksĹ*š? |m“‡ŐçiŞ@ŰÖý¶Ľm»¨VŁ…Ł'©î`)”.Ř-1¨ x -u„xăňt(+ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_added_and_uncommited/objects/78/9efbdadaa4a582778d4584385495559ea0994b b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_added_and_uncommited/objects/78/9efbdadaa4a582778d4584385495559ea0994b deleted file mode 100644 index 17458840b8..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_added_and_uncommited/objects/78/9efbdadaa4a582778d4584385495559ea0994b +++ /dev/null @@ -1,2 +0,0 @@ -x ڱ …0 ť)ŢŠ?= ĄÉÄNŠlO¤k®¸‹jŰú˙ą8&„«¨ ăr ” -ďqJWń°7ľB<ÉáöfŮěK8­#Q1C-‘"eŞ·Ě«ŁŠ°đ>Ľ'@ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_added_and_uncommited/objects/88/34b635dd468a83cb012f6feace968c1c9f5d6e b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_added_and_uncommited/objects/88/34b635dd468a83cb012f6feace968c1c9f5d6e deleted file mode 100644 index 83cc29fb15..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_added_and_uncommited/objects/88/34b635dd468a83cb012f6feace968c1c9f5d6e and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_added_and_uncommited/objects/d0/5f2cd5cc77addf68ed6f50d622c9a4f732e6c5 b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_added_and_uncommited/objects/d0/5f2cd5cc77addf68ed6f50d622c9a4f732e6c5 deleted file mode 100644 index 55bda40ef2..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_added_and_uncommited/objects/d0/5f2cd5cc77addf68ed6f50d622c9a4f732e6c5 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_added_and_uncommited/packed-refs b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_added_and_uncommited/packed-refs deleted file mode 100644 index 5a4ebc47cc..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_added_and_uncommited/packed-refs +++ /dev/null @@ -1,2 +0,0 @@ -# pack-refs with: peeled -480095882d281ed676fe5b863569520e54a7d5c0 refs/remotes/origin/master diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_added_and_uncommited/refs/heads/master b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_added_and_uncommited/refs/heads/master deleted file mode 100644 index e12c44d7ae..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_added_and_uncommited/refs/heads/master +++ /dev/null @@ -1 +0,0 @@ -480095882d281ed676fe5b863569520e54a7d5c0 diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_added_and_uncommited/refs/remotes/origin/HEAD b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_added_and_uncommited/refs/remotes/origin/HEAD deleted file mode 100644 index 6efe28fff8..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_added_and_uncommited/refs/remotes/origin/HEAD +++ /dev/null @@ -1 +0,0 @@ -ref: refs/remotes/origin/master diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_file/HEAD b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_file/HEAD deleted file mode 100644 index cb089cd89a..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_file/HEAD +++ /dev/null @@ -1 +0,0 @@ -ref: refs/heads/master diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_file/config b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_file/config deleted file mode 100644 index 10cc2508e4..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_file/config +++ /dev/null @@ -1,13 +0,0 @@ -[core] - repositoryformatversion = 0 - filemode = true - bare = false - logallrefupdates = true - worktree = ../../../sm_changed_file - ignorecase = true -[remote "origin"] - fetch = +refs/heads/*:refs/remotes/origin/* - url = /Users/rb/src/libgit2/tests-clar/resources/submod2_target -[branch "master"] - remote = origin - merge = refs/heads/master diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_file/description b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_file/description deleted file mode 100644 index 498b267a8c..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_file/description +++ /dev/null @@ -1 +0,0 @@ -Unnamed repository; edit this file 'description' to name the repository. diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_file/index b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_file/index deleted file mode 100644 index 6914a3b6ed..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_file/index and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_file/info/exclude b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_file/info/exclude deleted file mode 100644 index a5196d1be8..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_file/info/exclude +++ /dev/null @@ -1,6 +0,0 @@ -# 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/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_file/logs/HEAD b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_file/logs/HEAD deleted file mode 100644 index e5cb63f8d9..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_file/logs/HEAD +++ /dev/null @@ -1 +0,0 @@ -0000000000000000000000000000000000000000 480095882d281ed676fe5b863569520e54a7d5c0 Russell Belfer 1342560173 -0700 clone: from /Users/rb/src/libgit2/tests-clar/resources/submod2_target diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_file/logs/refs/heads/master b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_file/logs/refs/heads/master deleted file mode 100644 index e5cb63f8d9..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_file/logs/refs/heads/master +++ /dev/null @@ -1 +0,0 @@ -0000000000000000000000000000000000000000 480095882d281ed676fe5b863569520e54a7d5c0 Russell Belfer 1342560173 -0700 clone: from /Users/rb/src/libgit2/tests-clar/resources/submod2_target diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_file/logs/refs/remotes/origin/HEAD b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_file/logs/refs/remotes/origin/HEAD deleted file mode 100644 index e5cb63f8d9..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_file/logs/refs/remotes/origin/HEAD +++ /dev/null @@ -1 +0,0 @@ -0000000000000000000000000000000000000000 480095882d281ed676fe5b863569520e54a7d5c0 Russell Belfer 1342560173 -0700 clone: from /Users/rb/src/libgit2/tests-clar/resources/submod2_target diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_file/objects/06/362fe2fdb7010d0e447b4fb450d405420479a1 b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_file/objects/06/362fe2fdb7010d0e447b4fb450d405420479a1 deleted file mode 100644 index f4b7094c52..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_file/objects/06/362fe2fdb7010d0e447b4fb450d405420479a1 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_file/objects/0e/6a3ca48bd47cfe67681acf39aa0b10a0b92484 b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_file/objects/0e/6a3ca48bd47cfe67681acf39aa0b10a0b92484 deleted file mode 100644 index 56c845e49d..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_file/objects/0e/6a3ca48bd47cfe67681acf39aa0b10a0b92484 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_file/objects/17/d0ece6e96460a06592d9d9d000de37ba4232c5 b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_file/objects/17/d0ece6e96460a06592d9d9d000de37ba4232c5 deleted file mode 100644 index bd179b5f54..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_file/objects/17/d0ece6e96460a06592d9d9d000de37ba4232c5 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_file/objects/41/bd4bc3df978de695f67ace64c560913da11653 b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_file/objects/41/bd4bc3df978de695f67ace64c560913da11653 deleted file mode 100644 index ccf49bd15c..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_file/objects/41/bd4bc3df978de695f67ace64c560913da11653 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_file/objects/48/0095882d281ed676fe5b863569520e54a7d5c0 b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_file/objects/48/0095882d281ed676fe5b863569520e54a7d5c0 deleted file mode 100644 index 53029069ad..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_file/objects/48/0095882d281ed676fe5b863569520e54a7d5c0 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_file/objects/5e/4963595a9774b90524d35a807169049de8ccad b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_file/objects/5e/4963595a9774b90524d35a807169049de8ccad deleted file mode 100644 index 38c791eba1..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_file/objects/5e/4963595a9774b90524d35a807169049de8ccad and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_file/objects/6b/31c659545507c381e9cd34ec508f16c04e149e b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_file/objects/6b/31c659545507c381e9cd34ec508f16c04e149e deleted file mode 100644 index a26d299939..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_file/objects/6b/31c659545507c381e9cd34ec508f16c04e149e +++ /dev/null @@ -1,2 +0,0 @@ -x•ŤQ -!EűvoĹÓy*Ń_żí@Çg#h‚ŁűOhý^Î9w«Ą¤ŇęSoĚ€f1*˛ŠÁ[”‰¬§čIc Ô¤ěę¤pŁďµÁkç Α\›żżS߇żlµÜ@.¤´^ŤQpF‹(ć:˙úD˙5Ĺó“zr~ ńen8 \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_file/objects/73/ba924a80437097795ae839e66e187c55d3babf b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_file/objects/73/ba924a80437097795ae839e66e187c55d3babf deleted file mode 100644 index 83d1ba4813..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_file/objects/73/ba924a80437097795ae839e66e187c55d3babf and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_file/objects/78/0d7397f5e8f8f477fb55b7af3accc2154b2d4a b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_file/objects/78/0d7397f5e8f8f477fb55b7af3accc2154b2d4a deleted file mode 100644 index 6d27af8a89..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_file/objects/78/0d7397f5e8f8f477fb55b7af3accc2154b2d4a +++ /dev/null @@ -1,2 +0,0 @@ -x-Ë1Â0 FaćžâßŘ0pŽŔěÄĐ(N-ĹöĐŰӡғľé±ăq]>ksĹ*š? |m“‡ŐçiŞ@ŰÖý¶Ľm»¨VŁ…Ł'©î`)”.Ř-1¨ x -u„xăňt(+ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_file/objects/78/9efbdadaa4a582778d4584385495559ea0994b b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_file/objects/78/9efbdadaa4a582778d4584385495559ea0994b deleted file mode 100644 index 17458840b8..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_file/objects/78/9efbdadaa4a582778d4584385495559ea0994b +++ /dev/null @@ -1,2 +0,0 @@ -x ڱ …0 ť)ŢŠ?= ĄÉÄNŠlO¤k®¸‹jŰú˙ą8&„«¨ ăr ” -ďqJWń°7ľB<ÉáöfŮěK8­#Q1C-‘"eŞ·Ě«ŁŠ°đ>Ľ'@ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_file/objects/88/34b635dd468a83cb012f6feace968c1c9f5d6e b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_file/objects/88/34b635dd468a83cb012f6feace968c1c9f5d6e deleted file mode 100644 index 83cc29fb15..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_file/objects/88/34b635dd468a83cb012f6feace968c1c9f5d6e and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_file/objects/d0/5f2cd5cc77addf68ed6f50d622c9a4f732e6c5 b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_file/objects/d0/5f2cd5cc77addf68ed6f50d622c9a4f732e6c5 deleted file mode 100644 index 55bda40ef2..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_file/objects/d0/5f2cd5cc77addf68ed6f50d622c9a4f732e6c5 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_file/packed-refs b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_file/packed-refs deleted file mode 100644 index 5a4ebc47cc..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_file/packed-refs +++ /dev/null @@ -1,2 +0,0 @@ -# pack-refs with: peeled -480095882d281ed676fe5b863569520e54a7d5c0 refs/remotes/origin/master diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_file/refs/heads/master b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_file/refs/heads/master deleted file mode 100644 index e12c44d7ae..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_file/refs/heads/master +++ /dev/null @@ -1 +0,0 @@ -480095882d281ed676fe5b863569520e54a7d5c0 diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_file/refs/remotes/origin/HEAD b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_file/refs/remotes/origin/HEAD deleted file mode 100644 index 6efe28fff8..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_file/refs/remotes/origin/HEAD +++ /dev/null @@ -1 +0,0 @@ -ref: refs/remotes/origin/master diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_head/COMMIT_EDITMSG b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_head/COMMIT_EDITMSG deleted file mode 100644 index 6b8d1e3fce..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_head/COMMIT_EDITMSG +++ /dev/null @@ -1 +0,0 @@ -Making a change in a submodule diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_head/HEAD b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_head/HEAD deleted file mode 100644 index cb089cd89a..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_head/HEAD +++ /dev/null @@ -1 +0,0 @@ -ref: refs/heads/master diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_head/config b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_head/config deleted file mode 100644 index 7d002536a2..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_head/config +++ /dev/null @@ -1,13 +0,0 @@ -[core] - repositoryformatversion = 0 - filemode = true - bare = false - logallrefupdates = true - worktree = ../../../sm_changed_head - ignorecase = true -[remote "origin"] - fetch = +refs/heads/*:refs/remotes/origin/* - url = /Users/rb/src/libgit2/tests-clar/resources/submod2_target -[branch "master"] - remote = origin - merge = refs/heads/master diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_head/description b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_head/description deleted file mode 100644 index 498b267a8c..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_head/description +++ /dev/null @@ -1 +0,0 @@ -Unnamed repository; edit this file 'description' to name the repository. diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_head/index b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_head/index deleted file mode 100644 index 728fa292f5..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_head/index and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_head/info/exclude b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_head/info/exclude deleted file mode 100644 index a5196d1be8..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_head/info/exclude +++ /dev/null @@ -1,6 +0,0 @@ -# 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/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_head/logs/HEAD b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_head/logs/HEAD deleted file mode 100644 index cabdeb2b59..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_head/logs/HEAD +++ /dev/null @@ -1,2 +0,0 @@ -0000000000000000000000000000000000000000 480095882d281ed676fe5b863569520e54a7d5c0 Russell Belfer 1342560179 -0700 clone: from /Users/rb/src/libgit2/tests-clar/resources/submod2_target -480095882d281ed676fe5b863569520e54a7d5c0 3d9386c507f6b093471a3e324085657a3c2b4247 Russell Belfer 1342560431 -0700 commit: Making a change in a submodule diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_head/logs/refs/heads/master b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_head/logs/refs/heads/master deleted file mode 100644 index cabdeb2b59..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_head/logs/refs/heads/master +++ /dev/null @@ -1,2 +0,0 @@ -0000000000000000000000000000000000000000 480095882d281ed676fe5b863569520e54a7d5c0 Russell Belfer 1342560179 -0700 clone: from /Users/rb/src/libgit2/tests-clar/resources/submod2_target -480095882d281ed676fe5b863569520e54a7d5c0 3d9386c507f6b093471a3e324085657a3c2b4247 Russell Belfer 1342560431 -0700 commit: Making a change in a submodule diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_head/logs/refs/remotes/origin/HEAD b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_head/logs/refs/remotes/origin/HEAD deleted file mode 100644 index 257ca21d17..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_head/logs/refs/remotes/origin/HEAD +++ /dev/null @@ -1 +0,0 @@ -0000000000000000000000000000000000000000 480095882d281ed676fe5b863569520e54a7d5c0 Russell Belfer 1342560179 -0700 clone: from /Users/rb/src/libgit2/tests-clar/resources/submod2_target diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_head/objects/06/362fe2fdb7010d0e447b4fb450d405420479a1 b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_head/objects/06/362fe2fdb7010d0e447b4fb450d405420479a1 deleted file mode 100644 index f4b7094c52..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_head/objects/06/362fe2fdb7010d0e447b4fb450d405420479a1 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_head/objects/0e/6a3ca48bd47cfe67681acf39aa0b10a0b92484 b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_head/objects/0e/6a3ca48bd47cfe67681acf39aa0b10a0b92484 deleted file mode 100644 index 56c845e49d..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_head/objects/0e/6a3ca48bd47cfe67681acf39aa0b10a0b92484 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_head/objects/17/d0ece6e96460a06592d9d9d000de37ba4232c5 b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_head/objects/17/d0ece6e96460a06592d9d9d000de37ba4232c5 deleted file mode 100644 index bd179b5f54..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_head/objects/17/d0ece6e96460a06592d9d9d000de37ba4232c5 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_head/objects/3d/9386c507f6b093471a3e324085657a3c2b4247 b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_head/objects/3d/9386c507f6b093471a3e324085657a3c2b4247 deleted file mode 100644 index a2c371642c..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_head/objects/3d/9386c507f6b093471a3e324085657a3c2b4247 +++ /dev/null @@ -1,3 +0,0 @@ -x•ŽKj!E3vµ„jµüŔ#<Ţ<“ě@­ęéO°u˙q ™.çÂ)×ql ´‰o­Š€÷sFa#Čv‰ŤÓĹ )g#{':ŞßTĺl`b¤4ë0 ;ďfˇár‘4 -Ůä™ -ŞÔŰzUřî÷-ű/Ůg©đ¨ůąlmíůŁ\Ç'LĆjrhÍďčŐXG_ęźę+ýlç ĘšÎE`;ß=÷]ÔŢJç \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_head/objects/41/bd4bc3df978de695f67ace64c560913da11653 b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_head/objects/41/bd4bc3df978de695f67ace64c560913da11653 deleted file mode 100644 index ccf49bd15c..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_head/objects/41/bd4bc3df978de695f67ace64c560913da11653 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_head/objects/48/0095882d281ed676fe5b863569520e54a7d5c0 b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_head/objects/48/0095882d281ed676fe5b863569520e54a7d5c0 deleted file mode 100644 index 53029069ad..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_head/objects/48/0095882d281ed676fe5b863569520e54a7d5c0 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_head/objects/5e/4963595a9774b90524d35a807169049de8ccad b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_head/objects/5e/4963595a9774b90524d35a807169049de8ccad deleted file mode 100644 index 38c791eba1..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_head/objects/5e/4963595a9774b90524d35a807169049de8ccad and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_head/objects/6b/31c659545507c381e9cd34ec508f16c04e149e b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_head/objects/6b/31c659545507c381e9cd34ec508f16c04e149e deleted file mode 100644 index a26d299939..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_head/objects/6b/31c659545507c381e9cd34ec508f16c04e149e +++ /dev/null @@ -1,2 +0,0 @@ -x•ŤQ -!EűvoĹÓy*Ń_żí@Çg#h‚ŁűOhý^Î9w«Ą¤ŇęSoĚ€f1*˛ŠÁ[”‰¬§čIc Ô¤ěę¤pŁďµÁkç Α\›żżS߇żlµÜ@.¤´^ŤQpF‹(ć:˙úD˙5Ĺó“zr~ ńen8 \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_head/objects/73/ba924a80437097795ae839e66e187c55d3babf b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_head/objects/73/ba924a80437097795ae839e66e187c55d3babf deleted file mode 100644 index 83d1ba4813..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_head/objects/73/ba924a80437097795ae839e66e187c55d3babf and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_head/objects/77/fb0ed3e58568d6ad362c78de08ab8649d76e29 b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_head/objects/77/fb0ed3e58568d6ad362c78de08ab8649d76e29 deleted file mode 100644 index f8a236f3d3..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_head/objects/77/fb0ed3e58568d6ad362c78de08ab8649d76e29 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_head/objects/78/0d7397f5e8f8f477fb55b7af3accc2154b2d4a b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_head/objects/78/0d7397f5e8f8f477fb55b7af3accc2154b2d4a deleted file mode 100644 index 6d27af8a89..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_head/objects/78/0d7397f5e8f8f477fb55b7af3accc2154b2d4a +++ /dev/null @@ -1,2 +0,0 @@ -x-Ë1Â0 FaćžâßŘ0pŽŔěÄĐ(N-ĹöĐŰӡғľé±ăq]>ksĹ*š? |m“‡ŐçiŞ@ŰÖý¶Ľm»¨VŁ…Ł'©î`)”.Ř-1¨ x -u„xăňt(+ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_head/objects/78/9efbdadaa4a582778d4584385495559ea0994b b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_head/objects/78/9efbdadaa4a582778d4584385495559ea0994b deleted file mode 100644 index 17458840b8..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_head/objects/78/9efbdadaa4a582778d4584385495559ea0994b +++ /dev/null @@ -1,2 +0,0 @@ -x ڱ …0 ť)ŢŠ?= ĄÉÄNŠlO¤k®¸‹jŰú˙ą8&„«¨ ăr ” -ďqJWń°7ľB<ÉáöfŮěK8­#Q1C-‘"eŞ·Ě«ŁŠ°đ>Ľ'@ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_head/objects/88/34b635dd468a83cb012f6feace968c1c9f5d6e b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_head/objects/88/34b635dd468a83cb012f6feace968c1c9f5d6e deleted file mode 100644 index 83cc29fb15..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_head/objects/88/34b635dd468a83cb012f6feace968c1c9f5d6e and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_head/objects/8e/b1e637ed9fc8e5454fa20d38f809091f9395f4 b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_head/objects/8e/b1e637ed9fc8e5454fa20d38f809091f9395f4 deleted file mode 100644 index 8155b3e87f..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_head/objects/8e/b1e637ed9fc8e5454fa20d38f809091f9395f4 +++ /dev/null @@ -1,2 +0,0 @@ -xMM; -1µÎ)Ţ ÁZPĐŢĆr˛3kÉ l˛Enżl!Ľćýc±óőrz§Üŕ ,ąşˇçe +ÚťlEZxuPY…x QCł*đf·uLácfR3ŠÍT0'ŇŻřjаđ~G¦^s1Ščb2z’˙ůVkî]Ü5<·űv¨'>ă \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_head/objects/d0/5f2cd5cc77addf68ed6f50d622c9a4f732e6c5 b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_head/objects/d0/5f2cd5cc77addf68ed6f50d622c9a4f732e6c5 deleted file mode 100644 index 55bda40ef2..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_head/objects/d0/5f2cd5cc77addf68ed6f50d622c9a4f732e6c5 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_head/packed-refs b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_head/packed-refs deleted file mode 100644 index 5a4ebc47cc..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_head/packed-refs +++ /dev/null @@ -1,2 +0,0 @@ -# pack-refs with: peeled -480095882d281ed676fe5b863569520e54a7d5c0 refs/remotes/origin/master diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_head/refs/heads/master b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_head/refs/heads/master deleted file mode 100644 index ae079bd792..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_head/refs/heads/master +++ /dev/null @@ -1 +0,0 @@ -3d9386c507f6b093471a3e324085657a3c2b4247 diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_head/refs/remotes/origin/HEAD b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_head/refs/remotes/origin/HEAD deleted file mode 100644 index 6efe28fff8..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_head/refs/remotes/origin/HEAD +++ /dev/null @@ -1 +0,0 @@ -ref: refs/remotes/origin/master diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_index/HEAD b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_index/HEAD deleted file mode 100644 index cb089cd89a..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_index/HEAD +++ /dev/null @@ -1 +0,0 @@ -ref: refs/heads/master diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_index/config b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_index/config deleted file mode 100644 index 0274ff7e33..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_index/config +++ /dev/null @@ -1,13 +0,0 @@ -[core] - repositoryformatversion = 0 - filemode = true - bare = false - logallrefupdates = true - worktree = ../../../sm_changed_index - ignorecase = true -[remote "origin"] - fetch = +refs/heads/*:refs/remotes/origin/* - url = /Users/rb/src/libgit2/tests-clar/resources/submod2_target -[branch "master"] - remote = origin - merge = refs/heads/master diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_index/description b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_index/description deleted file mode 100644 index 498b267a8c..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_index/description +++ /dev/null @@ -1 +0,0 @@ -Unnamed repository; edit this file 'description' to name the repository. diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_index/index b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_index/index deleted file mode 100644 index 6fad3b43ea..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_index/index and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_index/info/exclude b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_index/info/exclude deleted file mode 100644 index a5196d1be8..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_index/info/exclude +++ /dev/null @@ -1,6 +0,0 @@ -# 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/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_index/logs/HEAD b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_index/logs/HEAD deleted file mode 100644 index 80eb541025..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_index/logs/HEAD +++ /dev/null @@ -1 +0,0 @@ -0000000000000000000000000000000000000000 480095882d281ed676fe5b863569520e54a7d5c0 Russell Belfer 1342560175 -0700 clone: from /Users/rb/src/libgit2/tests-clar/resources/submod2_target diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_index/logs/refs/heads/master b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_index/logs/refs/heads/master deleted file mode 100644 index 80eb541025..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_index/logs/refs/heads/master +++ /dev/null @@ -1 +0,0 @@ -0000000000000000000000000000000000000000 480095882d281ed676fe5b863569520e54a7d5c0 Russell Belfer 1342560175 -0700 clone: from /Users/rb/src/libgit2/tests-clar/resources/submod2_target diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_index/logs/refs/remotes/origin/HEAD b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_index/logs/refs/remotes/origin/HEAD deleted file mode 100644 index 80eb541025..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_index/logs/refs/remotes/origin/HEAD +++ /dev/null @@ -1 +0,0 @@ -0000000000000000000000000000000000000000 480095882d281ed676fe5b863569520e54a7d5c0 Russell Belfer 1342560175 -0700 clone: from /Users/rb/src/libgit2/tests-clar/resources/submod2_target diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_index/objects/06/362fe2fdb7010d0e447b4fb450d405420479a1 b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_index/objects/06/362fe2fdb7010d0e447b4fb450d405420479a1 deleted file mode 100644 index f4b7094c52..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_index/objects/06/362fe2fdb7010d0e447b4fb450d405420479a1 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_index/objects/0e/6a3ca48bd47cfe67681acf39aa0b10a0b92484 b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_index/objects/0e/6a3ca48bd47cfe67681acf39aa0b10a0b92484 deleted file mode 100644 index 56c845e49d..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_index/objects/0e/6a3ca48bd47cfe67681acf39aa0b10a0b92484 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_index/objects/17/d0ece6e96460a06592d9d9d000de37ba4232c5 b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_index/objects/17/d0ece6e96460a06592d9d9d000de37ba4232c5 deleted file mode 100644 index bd179b5f54..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_index/objects/17/d0ece6e96460a06592d9d9d000de37ba4232c5 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_index/objects/41/bd4bc3df978de695f67ace64c560913da11653 b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_index/objects/41/bd4bc3df978de695f67ace64c560913da11653 deleted file mode 100644 index ccf49bd15c..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_index/objects/41/bd4bc3df978de695f67ace64c560913da11653 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_index/objects/48/0095882d281ed676fe5b863569520e54a7d5c0 b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_index/objects/48/0095882d281ed676fe5b863569520e54a7d5c0 deleted file mode 100644 index 53029069ad..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_index/objects/48/0095882d281ed676fe5b863569520e54a7d5c0 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_index/objects/5e/4963595a9774b90524d35a807169049de8ccad b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_index/objects/5e/4963595a9774b90524d35a807169049de8ccad deleted file mode 100644 index 38c791eba1..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_index/objects/5e/4963595a9774b90524d35a807169049de8ccad and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_index/objects/6b/31c659545507c381e9cd34ec508f16c04e149e b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_index/objects/6b/31c659545507c381e9cd34ec508f16c04e149e deleted file mode 100644 index a26d299939..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_index/objects/6b/31c659545507c381e9cd34ec508f16c04e149e +++ /dev/null @@ -1,2 +0,0 @@ -x•ŤQ -!EűvoĹÓy*Ń_żí@Çg#h‚ŁűOhý^Î9w«Ą¤ŇęSoĚ€f1*˛ŠÁ[”‰¬§čIc Ô¤ěę¤pŁďµÁkç Α\›żżS߇żlµÜ@.¤´^ŤQpF‹(ć:˙úD˙5Ĺó“zr~ ńen8 \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_index/objects/73/ba924a80437097795ae839e66e187c55d3babf b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_index/objects/73/ba924a80437097795ae839e66e187c55d3babf deleted file mode 100644 index 83d1ba4813..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_index/objects/73/ba924a80437097795ae839e66e187c55d3babf and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_index/objects/78/0d7397f5e8f8f477fb55b7af3accc2154b2d4a b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_index/objects/78/0d7397f5e8f8f477fb55b7af3accc2154b2d4a deleted file mode 100644 index 6d27af8a89..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_index/objects/78/0d7397f5e8f8f477fb55b7af3accc2154b2d4a +++ /dev/null @@ -1,2 +0,0 @@ -x-Ë1Â0 FaćžâßŘ0pŽŔěÄĐ(N-ĹöĐŰӡғľé±ăq]>ksĹ*š? |m“‡ŐçiŞ@ŰÖý¶Ľm»¨VŁ…Ł'©î`)”.Ř-1¨ x -u„xăňt(+ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_index/objects/78/9efbdadaa4a582778d4584385495559ea0994b b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_index/objects/78/9efbdadaa4a582778d4584385495559ea0994b deleted file mode 100644 index 17458840b8..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_index/objects/78/9efbdadaa4a582778d4584385495559ea0994b +++ /dev/null @@ -1,2 +0,0 @@ -x ڱ …0 ť)ŢŠ?= ĄÉÄNŠlO¤k®¸‹jŰú˙ą8&„«¨ ăr ” -ďqJWń°7ľB<ÉáöfŮěK8­#Q1C-‘"eŞ·Ě«ŁŠ°đ>Ľ'@ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_index/objects/88/34b635dd468a83cb012f6feace968c1c9f5d6e b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_index/objects/88/34b635dd468a83cb012f6feace968c1c9f5d6e deleted file mode 100644 index 83cc29fb15..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_index/objects/88/34b635dd468a83cb012f6feace968c1c9f5d6e and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_index/objects/a0/2d31770687965547ab7a04cee199b29ee458d6 b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_index/objects/a0/2d31770687965547ab7a04cee199b29ee458d6 deleted file mode 100644 index cb3f5a0026..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_index/objects/a0/2d31770687965547ab7a04cee199b29ee458d6 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_index/objects/d0/5f2cd5cc77addf68ed6f50d622c9a4f732e6c5 b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_index/objects/d0/5f2cd5cc77addf68ed6f50d622c9a4f732e6c5 deleted file mode 100644 index 55bda40ef2..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_index/objects/d0/5f2cd5cc77addf68ed6f50d622c9a4f732e6c5 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_index/packed-refs b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_index/packed-refs deleted file mode 100644 index 5a4ebc47cc..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_index/packed-refs +++ /dev/null @@ -1,2 +0,0 @@ -# pack-refs with: peeled -480095882d281ed676fe5b863569520e54a7d5c0 refs/remotes/origin/master diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_index/refs/heads/master b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_index/refs/heads/master deleted file mode 100644 index e12c44d7ae..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_index/refs/heads/master +++ /dev/null @@ -1 +0,0 @@ -480095882d281ed676fe5b863569520e54a7d5c0 diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_index/refs/remotes/origin/HEAD b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_index/refs/remotes/origin/HEAD deleted file mode 100644 index 6efe28fff8..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_index/refs/remotes/origin/HEAD +++ /dev/null @@ -1 +0,0 @@ -ref: refs/remotes/origin/master diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_untracked_file/HEAD b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_untracked_file/HEAD deleted file mode 100644 index cb089cd89a..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_untracked_file/HEAD +++ /dev/null @@ -1 +0,0 @@ -ref: refs/heads/master diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_untracked_file/config b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_untracked_file/config deleted file mode 100644 index 7f2584476e..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_untracked_file/config +++ /dev/null @@ -1,13 +0,0 @@ -[core] - repositoryformatversion = 0 - filemode = true - bare = false - logallrefupdates = true - worktree = ../../../sm_changed_untracked_file - ignorecase = true -[remote "origin"] - fetch = +refs/heads/*:refs/remotes/origin/* - url = /Users/rb/src/libgit2/tests-clar/resources/submod2_target -[branch "master"] - remote = origin - merge = refs/heads/master diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_untracked_file/description b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_untracked_file/description deleted file mode 100644 index 498b267a8c..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_untracked_file/description +++ /dev/null @@ -1 +0,0 @@ -Unnamed repository; edit this file 'description' to name the repository. diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_untracked_file/index b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_untracked_file/index deleted file mode 100644 index 598e30a32c..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_untracked_file/index and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_untracked_file/info/exclude b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_untracked_file/info/exclude deleted file mode 100644 index a5196d1be8..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_untracked_file/info/exclude +++ /dev/null @@ -1,6 +0,0 @@ -# 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/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_untracked_file/logs/HEAD b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_untracked_file/logs/HEAD deleted file mode 100644 index d1beafbd6f..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_untracked_file/logs/HEAD +++ /dev/null @@ -1 +0,0 @@ -0000000000000000000000000000000000000000 480095882d281ed676fe5b863569520e54a7d5c0 Russell Belfer 1342560186 -0700 clone: from /Users/rb/src/libgit2/tests-clar/resources/submod2_target diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_untracked_file/logs/refs/heads/master b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_untracked_file/logs/refs/heads/master deleted file mode 100644 index d1beafbd6f..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_untracked_file/logs/refs/heads/master +++ /dev/null @@ -1 +0,0 @@ -0000000000000000000000000000000000000000 480095882d281ed676fe5b863569520e54a7d5c0 Russell Belfer 1342560186 -0700 clone: from /Users/rb/src/libgit2/tests-clar/resources/submod2_target diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_untracked_file/logs/refs/remotes/origin/HEAD b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_untracked_file/logs/refs/remotes/origin/HEAD deleted file mode 100644 index d1beafbd6f..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_untracked_file/logs/refs/remotes/origin/HEAD +++ /dev/null @@ -1 +0,0 @@ -0000000000000000000000000000000000000000 480095882d281ed676fe5b863569520e54a7d5c0 Russell Belfer 1342560186 -0700 clone: from /Users/rb/src/libgit2/tests-clar/resources/submod2_target diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_untracked_file/objects/06/362fe2fdb7010d0e447b4fb450d405420479a1 b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_untracked_file/objects/06/362fe2fdb7010d0e447b4fb450d405420479a1 deleted file mode 100644 index f4b7094c52..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_untracked_file/objects/06/362fe2fdb7010d0e447b4fb450d405420479a1 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_untracked_file/objects/0e/6a3ca48bd47cfe67681acf39aa0b10a0b92484 b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_untracked_file/objects/0e/6a3ca48bd47cfe67681acf39aa0b10a0b92484 deleted file mode 100644 index 56c845e49d..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_untracked_file/objects/0e/6a3ca48bd47cfe67681acf39aa0b10a0b92484 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_untracked_file/objects/17/d0ece6e96460a06592d9d9d000de37ba4232c5 b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_untracked_file/objects/17/d0ece6e96460a06592d9d9d000de37ba4232c5 deleted file mode 100644 index bd179b5f54..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_untracked_file/objects/17/d0ece6e96460a06592d9d9d000de37ba4232c5 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_untracked_file/objects/41/bd4bc3df978de695f67ace64c560913da11653 b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_untracked_file/objects/41/bd4bc3df978de695f67ace64c560913da11653 deleted file mode 100644 index ccf49bd15c..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_untracked_file/objects/41/bd4bc3df978de695f67ace64c560913da11653 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_untracked_file/objects/48/0095882d281ed676fe5b863569520e54a7d5c0 b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_untracked_file/objects/48/0095882d281ed676fe5b863569520e54a7d5c0 deleted file mode 100644 index 53029069ad..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_untracked_file/objects/48/0095882d281ed676fe5b863569520e54a7d5c0 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_untracked_file/objects/5e/4963595a9774b90524d35a807169049de8ccad b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_untracked_file/objects/5e/4963595a9774b90524d35a807169049de8ccad deleted file mode 100644 index 38c791eba1..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_untracked_file/objects/5e/4963595a9774b90524d35a807169049de8ccad and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_untracked_file/objects/6b/31c659545507c381e9cd34ec508f16c04e149e b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_untracked_file/objects/6b/31c659545507c381e9cd34ec508f16c04e149e deleted file mode 100644 index a26d299939..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_untracked_file/objects/6b/31c659545507c381e9cd34ec508f16c04e149e +++ /dev/null @@ -1,2 +0,0 @@ -x•ŤQ -!EűvoĹÓy*Ń_żí@Çg#h‚ŁűOhý^Î9w«Ą¤ŇęSoĚ€f1*˛ŠÁ[”‰¬§čIc Ô¤ěę¤pŁďµÁkç Α\›żżS߇żlµÜ@.¤´^ŤQpF‹(ć:˙úD˙5Ĺó“zr~ ńen8 \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_untracked_file/objects/73/ba924a80437097795ae839e66e187c55d3babf b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_untracked_file/objects/73/ba924a80437097795ae839e66e187c55d3babf deleted file mode 100644 index 83d1ba4813..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_untracked_file/objects/73/ba924a80437097795ae839e66e187c55d3babf and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_untracked_file/objects/78/0d7397f5e8f8f477fb55b7af3accc2154b2d4a b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_untracked_file/objects/78/0d7397f5e8f8f477fb55b7af3accc2154b2d4a deleted file mode 100644 index 6d27af8a89..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_untracked_file/objects/78/0d7397f5e8f8f477fb55b7af3accc2154b2d4a +++ /dev/null @@ -1,2 +0,0 @@ -x-Ë1Â0 FaćžâßŘ0pŽŔěÄĐ(N-ĹöĐŰӡғľé±ăq]>ksĹ*š? |m“‡ŐçiŞ@ŰÖý¶Ľm»¨VŁ…Ł'©î`)”.Ř-1¨ x -u„xăňt(+ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_untracked_file/objects/78/9efbdadaa4a582778d4584385495559ea0994b b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_untracked_file/objects/78/9efbdadaa4a582778d4584385495559ea0994b deleted file mode 100644 index 17458840b8..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_untracked_file/objects/78/9efbdadaa4a582778d4584385495559ea0994b +++ /dev/null @@ -1,2 +0,0 @@ -x ڱ …0 ť)ŢŠ?= ĄÉÄNŠlO¤k®¸‹jŰú˙ą8&„«¨ ăr ” -ďqJWń°7ľB<ÉáöfŮěK8­#Q1C-‘"eŞ·Ě«ŁŠ°đ>Ľ'@ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_untracked_file/objects/88/34b635dd468a83cb012f6feace968c1c9f5d6e b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_untracked_file/objects/88/34b635dd468a83cb012f6feace968c1c9f5d6e deleted file mode 100644 index 83cc29fb15..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_untracked_file/objects/88/34b635dd468a83cb012f6feace968c1c9f5d6e and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_untracked_file/objects/d0/5f2cd5cc77addf68ed6f50d622c9a4f732e6c5 b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_untracked_file/objects/d0/5f2cd5cc77addf68ed6f50d622c9a4f732e6c5 deleted file mode 100644 index 55bda40ef2..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_untracked_file/objects/d0/5f2cd5cc77addf68ed6f50d622c9a4f732e6c5 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_untracked_file/packed-refs b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_untracked_file/packed-refs deleted file mode 100644 index 5a4ebc47cc..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_untracked_file/packed-refs +++ /dev/null @@ -1,2 +0,0 @@ -# pack-refs with: peeled -480095882d281ed676fe5b863569520e54a7d5c0 refs/remotes/origin/master diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_untracked_file/refs/heads/master b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_untracked_file/refs/heads/master deleted file mode 100644 index e12c44d7ae..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_untracked_file/refs/heads/master +++ /dev/null @@ -1 +0,0 @@ -480095882d281ed676fe5b863569520e54a7d5c0 diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_untracked_file/refs/remotes/origin/HEAD b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_untracked_file/refs/remotes/origin/HEAD deleted file mode 100644 index 6efe28fff8..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_changed_untracked_file/refs/remotes/origin/HEAD +++ /dev/null @@ -1 +0,0 @@ -ref: refs/remotes/origin/master diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_missing_commits/HEAD b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_missing_commits/HEAD deleted file mode 100644 index cb089cd89a..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_missing_commits/HEAD +++ /dev/null @@ -1 +0,0 @@ -ref: refs/heads/master diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_missing_commits/config b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_missing_commits/config deleted file mode 100644 index 45fbb30cf0..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_missing_commits/config +++ /dev/null @@ -1,13 +0,0 @@ -[core] - repositoryformatversion = 0 - filemode = true - bare = false - logallrefupdates = true - worktree = ../../../sm_missing_commits - ignorecase = true -[remote "origin"] - fetch = +refs/heads/*:refs/remotes/origin/* - url = /Users/rb/src/libgit2/tests-clar/resources/submod2_target -[branch "master"] - remote = origin - merge = refs/heads/master diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_missing_commits/description b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_missing_commits/description deleted file mode 100644 index 498b267a8c..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_missing_commits/description +++ /dev/null @@ -1 +0,0 @@ -Unnamed repository; edit this file 'description' to name the repository. diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_missing_commits/index b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_missing_commits/index deleted file mode 100644 index 4903565245..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_missing_commits/index and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_missing_commits/info/exclude b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_missing_commits/info/exclude deleted file mode 100644 index a5196d1be8..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_missing_commits/info/exclude +++ /dev/null @@ -1,6 +0,0 @@ -# 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/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_missing_commits/logs/HEAD b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_missing_commits/logs/HEAD deleted file mode 100644 index ee08c9706a..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_missing_commits/logs/HEAD +++ /dev/null @@ -1 +0,0 @@ -0000000000000000000000000000000000000000 5e4963595a9774b90524d35a807169049de8ccad Russell Belfer 1342559796 -0700 clone: from /Users/rb/src/libgit2/tests-clar/resources/submod2_target diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_missing_commits/logs/refs/heads/master b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_missing_commits/logs/refs/heads/master deleted file mode 100644 index ee08c9706a..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_missing_commits/logs/refs/heads/master +++ /dev/null @@ -1 +0,0 @@ -0000000000000000000000000000000000000000 5e4963595a9774b90524d35a807169049de8ccad Russell Belfer 1342559796 -0700 clone: from /Users/rb/src/libgit2/tests-clar/resources/submod2_target diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_missing_commits/logs/refs/remotes/origin/HEAD b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_missing_commits/logs/refs/remotes/origin/HEAD deleted file mode 100644 index ee08c9706a..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_missing_commits/logs/refs/remotes/origin/HEAD +++ /dev/null @@ -1 +0,0 @@ -0000000000000000000000000000000000000000 5e4963595a9774b90524d35a807169049de8ccad Russell Belfer 1342559796 -0700 clone: from /Users/rb/src/libgit2/tests-clar/resources/submod2_target diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_missing_commits/objects/06/362fe2fdb7010d0e447b4fb450d405420479a1 b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_missing_commits/objects/06/362fe2fdb7010d0e447b4fb450d405420479a1 deleted file mode 100644 index f4b7094c52..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_missing_commits/objects/06/362fe2fdb7010d0e447b4fb450d405420479a1 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_missing_commits/objects/0e/6a3ca48bd47cfe67681acf39aa0b10a0b92484 b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_missing_commits/objects/0e/6a3ca48bd47cfe67681acf39aa0b10a0b92484 deleted file mode 100644 index 56c845e49d..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_missing_commits/objects/0e/6a3ca48bd47cfe67681acf39aa0b10a0b92484 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_missing_commits/objects/17/d0ece6e96460a06592d9d9d000de37ba4232c5 b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_missing_commits/objects/17/d0ece6e96460a06592d9d9d000de37ba4232c5 deleted file mode 100644 index bd179b5f54..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_missing_commits/objects/17/d0ece6e96460a06592d9d9d000de37ba4232c5 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_missing_commits/objects/41/bd4bc3df978de695f67ace64c560913da11653 b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_missing_commits/objects/41/bd4bc3df978de695f67ace64c560913da11653 deleted file mode 100644 index ccf49bd15c..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_missing_commits/objects/41/bd4bc3df978de695f67ace64c560913da11653 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_missing_commits/objects/5e/4963595a9774b90524d35a807169049de8ccad b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_missing_commits/objects/5e/4963595a9774b90524d35a807169049de8ccad deleted file mode 100644 index 38c791eba1..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_missing_commits/objects/5e/4963595a9774b90524d35a807169049de8ccad and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_missing_commits/objects/6b/31c659545507c381e9cd34ec508f16c04e149e b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_missing_commits/objects/6b/31c659545507c381e9cd34ec508f16c04e149e deleted file mode 100644 index a26d299939..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_missing_commits/objects/6b/31c659545507c381e9cd34ec508f16c04e149e +++ /dev/null @@ -1,2 +0,0 @@ -x•ŤQ -!EűvoĹÓy*Ń_żí@Çg#h‚ŁűOhý^Î9w«Ą¤ŇęSoĚ€f1*˛ŠÁ[”‰¬§čIc Ô¤ěę¤pŁďµÁkç Α\›żżS߇żlµÜ@.¤´^ŤQpF‹(ć:˙úD˙5Ĺó“zr~ ńen8 \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_missing_commits/objects/78/0d7397f5e8f8f477fb55b7af3accc2154b2d4a b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_missing_commits/objects/78/0d7397f5e8f8f477fb55b7af3accc2154b2d4a deleted file mode 100644 index 6d27af8a89..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_missing_commits/objects/78/0d7397f5e8f8f477fb55b7af3accc2154b2d4a +++ /dev/null @@ -1,2 +0,0 @@ -x-Ë1Â0 FaćžâßŘ0pŽŔěÄĐ(N-ĹöĐŰӡғľé±ăq]>ksĹ*š? |m“‡ŐçiŞ@ŰÖý¶Ľm»¨VŁ…Ł'©î`)”.Ř-1¨ x -u„xăňt(+ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_missing_commits/objects/88/34b635dd468a83cb012f6feace968c1c9f5d6e b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_missing_commits/objects/88/34b635dd468a83cb012f6feace968c1c9f5d6e deleted file mode 100644 index 83cc29fb15..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_missing_commits/objects/88/34b635dd468a83cb012f6feace968c1c9f5d6e and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_missing_commits/objects/d0/5f2cd5cc77addf68ed6f50d622c9a4f732e6c5 b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_missing_commits/objects/d0/5f2cd5cc77addf68ed6f50d622c9a4f732e6c5 deleted file mode 100644 index 55bda40ef2..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_missing_commits/objects/d0/5f2cd5cc77addf68ed6f50d622c9a4f732e6c5 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_missing_commits/packed-refs b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_missing_commits/packed-refs deleted file mode 100644 index 66fbf5daf5..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_missing_commits/packed-refs +++ /dev/null @@ -1,2 +0,0 @@ -# pack-refs with: peeled -5e4963595a9774b90524d35a807169049de8ccad refs/remotes/origin/master diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_missing_commits/refs/heads/master b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_missing_commits/refs/heads/master deleted file mode 100644 index 3913aca5de..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_missing_commits/refs/heads/master +++ /dev/null @@ -1 +0,0 @@ -5e4963595a9774b90524d35a807169049de8ccad diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_missing_commits/refs/remotes/origin/HEAD b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_missing_commits/refs/remotes/origin/HEAD deleted file mode 100644 index 6efe28fff8..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_missing_commits/refs/remotes/origin/HEAD +++ /dev/null @@ -1 +0,0 @@ -ref: refs/remotes/origin/master diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_unchanged/HEAD b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_unchanged/HEAD deleted file mode 100644 index cb089cd89a..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_unchanged/HEAD +++ /dev/null @@ -1 +0,0 @@ -ref: refs/heads/master diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_unchanged/config b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_unchanged/config deleted file mode 100644 index fc706c9dd9..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_unchanged/config +++ /dev/null @@ -1,13 +0,0 @@ -[core] - repositoryformatversion = 0 - filemode = true - bare = false - logallrefupdates = true - worktree = ../../../sm_unchanged - ignorecase = true -[remote "origin"] - fetch = +refs/heads/*:refs/remotes/origin/* - url = /Users/rb/src/libgit2/tests-clar/resources/submod2_target -[branch "master"] - remote = origin - merge = refs/heads/master diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_unchanged/description b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_unchanged/description deleted file mode 100644 index 498b267a8c..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_unchanged/description +++ /dev/null @@ -1 +0,0 @@ -Unnamed repository; edit this file 'description' to name the repository. diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_unchanged/index b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_unchanged/index deleted file mode 100644 index 629c849ecf..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_unchanged/index and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_unchanged/info/exclude b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_unchanged/info/exclude deleted file mode 100644 index a5196d1be8..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_unchanged/info/exclude +++ /dev/null @@ -1,6 +0,0 @@ -# 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/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_unchanged/logs/HEAD b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_unchanged/logs/HEAD deleted file mode 100644 index 72653286ae..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_unchanged/logs/HEAD +++ /dev/null @@ -1 +0,0 @@ -0000000000000000000000000000000000000000 480095882d281ed676fe5b863569520e54a7d5c0 Russell Belfer 1342560169 -0700 clone: from /Users/rb/src/libgit2/tests-clar/resources/submod2_target diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_unchanged/logs/refs/heads/master b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_unchanged/logs/refs/heads/master deleted file mode 100644 index 72653286ae..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_unchanged/logs/refs/heads/master +++ /dev/null @@ -1 +0,0 @@ -0000000000000000000000000000000000000000 480095882d281ed676fe5b863569520e54a7d5c0 Russell Belfer 1342560169 -0700 clone: from /Users/rb/src/libgit2/tests-clar/resources/submod2_target diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_unchanged/logs/refs/remotes/origin/HEAD b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_unchanged/logs/refs/remotes/origin/HEAD deleted file mode 100644 index 72653286ae..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_unchanged/logs/refs/remotes/origin/HEAD +++ /dev/null @@ -1 +0,0 @@ -0000000000000000000000000000000000000000 480095882d281ed676fe5b863569520e54a7d5c0 Russell Belfer 1342560169 -0700 clone: from /Users/rb/src/libgit2/tests-clar/resources/submod2_target diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_unchanged/objects/06/362fe2fdb7010d0e447b4fb450d405420479a1 b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_unchanged/objects/06/362fe2fdb7010d0e447b4fb450d405420479a1 deleted file mode 100644 index f4b7094c52..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_unchanged/objects/06/362fe2fdb7010d0e447b4fb450d405420479a1 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_unchanged/objects/0e/6a3ca48bd47cfe67681acf39aa0b10a0b92484 b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_unchanged/objects/0e/6a3ca48bd47cfe67681acf39aa0b10a0b92484 deleted file mode 100644 index 56c845e49d..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_unchanged/objects/0e/6a3ca48bd47cfe67681acf39aa0b10a0b92484 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_unchanged/objects/17/d0ece6e96460a06592d9d9d000de37ba4232c5 b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_unchanged/objects/17/d0ece6e96460a06592d9d9d000de37ba4232c5 deleted file mode 100644 index bd179b5f54..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_unchanged/objects/17/d0ece6e96460a06592d9d9d000de37ba4232c5 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_unchanged/objects/41/bd4bc3df978de695f67ace64c560913da11653 b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_unchanged/objects/41/bd4bc3df978de695f67ace64c560913da11653 deleted file mode 100644 index ccf49bd15c..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_unchanged/objects/41/bd4bc3df978de695f67ace64c560913da11653 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_unchanged/objects/48/0095882d281ed676fe5b863569520e54a7d5c0 b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_unchanged/objects/48/0095882d281ed676fe5b863569520e54a7d5c0 deleted file mode 100644 index 53029069ad..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_unchanged/objects/48/0095882d281ed676fe5b863569520e54a7d5c0 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_unchanged/objects/5e/4963595a9774b90524d35a807169049de8ccad b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_unchanged/objects/5e/4963595a9774b90524d35a807169049de8ccad deleted file mode 100644 index 38c791eba1..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_unchanged/objects/5e/4963595a9774b90524d35a807169049de8ccad and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_unchanged/objects/6b/31c659545507c381e9cd34ec508f16c04e149e b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_unchanged/objects/6b/31c659545507c381e9cd34ec508f16c04e149e deleted file mode 100644 index a26d299939..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_unchanged/objects/6b/31c659545507c381e9cd34ec508f16c04e149e +++ /dev/null @@ -1,2 +0,0 @@ -x•ŤQ -!EűvoĹÓy*Ń_żí@Çg#h‚ŁűOhý^Î9w«Ą¤ŇęSoĚ€f1*˛ŠÁ[”‰¬§čIc Ô¤ěę¤pŁďµÁkç Α\›żżS߇żlµÜ@.¤´^ŤQpF‹(ć:˙úD˙5Ĺó“zr~ ńen8 \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_unchanged/objects/73/ba924a80437097795ae839e66e187c55d3babf b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_unchanged/objects/73/ba924a80437097795ae839e66e187c55d3babf deleted file mode 100644 index 83d1ba4813..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_unchanged/objects/73/ba924a80437097795ae839e66e187c55d3babf and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_unchanged/objects/78/0d7397f5e8f8f477fb55b7af3accc2154b2d4a b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_unchanged/objects/78/0d7397f5e8f8f477fb55b7af3accc2154b2d4a deleted file mode 100644 index 6d27af8a89..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_unchanged/objects/78/0d7397f5e8f8f477fb55b7af3accc2154b2d4a +++ /dev/null @@ -1,2 +0,0 @@ -x-Ë1Â0 FaćžâßŘ0pŽŔěÄĐ(N-ĹöĐŰӡғľé±ăq]>ksĹ*š? |m“‡ŐçiŞ@ŰÖý¶Ľm»¨VŁ…Ł'©î`)”.Ř-1¨ x -u„xăňt(+ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_unchanged/objects/78/9efbdadaa4a582778d4584385495559ea0994b b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_unchanged/objects/78/9efbdadaa4a582778d4584385495559ea0994b deleted file mode 100644 index 17458840b8..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_unchanged/objects/78/9efbdadaa4a582778d4584385495559ea0994b +++ /dev/null @@ -1,2 +0,0 @@ -x ڱ …0 ť)ŢŠ?= ĄÉÄNŠlO¤k®¸‹jŰú˙ą8&„«¨ ăr ” -ďqJWń°7ľB<ÉáöfŮěK8­#Q1C-‘"eŞ·Ě«ŁŠ°đ>Ľ'@ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_unchanged/objects/88/34b635dd468a83cb012f6feace968c1c9f5d6e b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_unchanged/objects/88/34b635dd468a83cb012f6feace968c1c9f5d6e deleted file mode 100644 index 83cc29fb15..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_unchanged/objects/88/34b635dd468a83cb012f6feace968c1c9f5d6e and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_unchanged/objects/d0/5f2cd5cc77addf68ed6f50d622c9a4f732e6c5 b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_unchanged/objects/d0/5f2cd5cc77addf68ed6f50d622c9a4f732e6c5 deleted file mode 100644 index 55bda40ef2..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_unchanged/objects/d0/5f2cd5cc77addf68ed6f50d622c9a4f732e6c5 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_unchanged/packed-refs b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_unchanged/packed-refs deleted file mode 100644 index 5a4ebc47cc..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_unchanged/packed-refs +++ /dev/null @@ -1,2 +0,0 @@ -# pack-refs with: peeled -480095882d281ed676fe5b863569520e54a7d5c0 refs/remotes/origin/master diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_unchanged/refs/heads/master b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_unchanged/refs/heads/master deleted file mode 100644 index e12c44d7ae..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_unchanged/refs/heads/master +++ /dev/null @@ -1 +0,0 @@ -480095882d281ed676fe5b863569520e54a7d5c0 diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_unchanged/refs/remotes/origin/HEAD b/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_unchanged/refs/remotes/origin/HEAD deleted file mode 100644 index 6efe28fff8..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/modules/sm_unchanged/refs/remotes/origin/HEAD +++ /dev/null @@ -1 +0,0 @@ -ref: refs/remotes/origin/master diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/objects/09/460e5b6cbcb05a3e404593c32a3aa7221eca0e b/vendor/libgit2/tests/resources/submod2/.gitted/objects/09/460e5b6cbcb05a3e404593c32a3aa7221eca0e deleted file mode 100644 index f1ea5f4c8e..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2/.gitted/objects/09/460e5b6cbcb05a3e404593c32a3aa7221eca0e and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/objects/14/fe9ccf104058df25e0a08361c4494e167ef243 b/vendor/libgit2/tests/resources/submod2/.gitted/objects/14/fe9ccf104058df25e0a08361c4494e167ef243 deleted file mode 100644 index d3c8582e32..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/objects/14/fe9ccf104058df25e0a08361c4494e167ef243 +++ /dev/null @@ -1 +0,0 @@ -x•ŤM F]sŠą€fhˇccŚ;·Ţ€źÁ’@I(Ü_OŕöË{ďs%çŘ@’>µĘ ^!ą˛F'˝‘!諲lŁ_Ľq4Íä´ÇE޶RáÝŹS‚'§ŔnŐ>>±mÝ^\Éwłš´^‰$ś‘ĹXÇ_迦xí±E“ŕ—_.ŕ9} \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/objects/22/ce3e0311dda73a5992d54a4a595518d3876ea7 b/vendor/libgit2/tests/resources/submod2/.gitted/objects/22/ce3e0311dda73a5992d54a4a595518d3876ea7 deleted file mode 100644 index fce6a94b5c..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/objects/22/ce3e0311dda73a5992d54a4a595518d3876ea7 +++ /dev/null @@ -1,4 +0,0 @@ -xµË -Â0Eݶ_Qş·. -.ü W"!Ź1 ć!3 řů>+¶Š.¤Ű9Ă=3Wş(«nŐ-¶”ĄŹ:;¨jňÜ[" WŃ{›¨Ţ•ĹQ¤ľZWď°,2ş iviyh •“ĐT/‚=Ž{އ ¶!@b(ˇbÎJcSËP˘ĄrĹŚ -č‡đˇă{ë`ě|%łimĐpú콡ŮÄ=IÇĂżW2›6‡„B@)|Ľó˙)gŁý™ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/objects/25/5546424b0efb847b1bfc91dbf7348b277f8970 b/vendor/libgit2/tests/resources/submod2/.gitted/objects/25/5546424b0efb847b1bfc91dbf7348b277f8970 deleted file mode 100644 index 2965becf60..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2/.gitted/objects/25/5546424b0efb847b1bfc91dbf7348b277f8970 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/objects/2a/30f1e6f94b20917005a21273f65b406d0f8bad b/vendor/libgit2/tests/resources/submod2/.gitted/objects/2a/30f1e6f94b20917005a21273f65b406d0f8bad deleted file mode 100644 index 08faf0fa8e..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2/.gitted/objects/2a/30f1e6f94b20917005a21273f65b406d0f8bad and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/objects/42/cfb95cd01bf9225b659b5ee3edcc78e8eeb478 b/vendor/libgit2/tests/resources/submod2/.gitted/objects/42/cfb95cd01bf9225b659b5ee3edcc78e8eeb478 deleted file mode 100644 index ee7848ae6e..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2/.gitted/objects/42/cfb95cd01bf9225b659b5ee3edcc78e8eeb478 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/objects/57/958699c2dc394f81cfc76950e9c3ac3025c398 b/vendor/libgit2/tests/resources/submod2/.gitted/objects/57/958699c2dc394f81cfc76950e9c3ac3025c398 deleted file mode 100644 index ca9203a6e3..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2/.gitted/objects/57/958699c2dc394f81cfc76950e9c3ac3025c398 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/objects/59/01da4f1c67756eeadc5121d206bec2431f253b b/vendor/libgit2/tests/resources/submod2/.gitted/objects/59/01da4f1c67756eeadc5121d206bec2431f253b deleted file mode 100644 index 9f88f6bdf7..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/objects/59/01da4f1c67756eeadc5121d206bec2431f253b +++ /dev/null @@ -1,2 +0,0 @@ -x•ŽŰ 1EýNÓ€2yg@D,A°€$;YöE6éßmÁß{Λ·e™(ĺ/­2őd#ĘjČšL 2—ěYdĘ:fŤĘž =V^D’hR Ä$Ą^ĂĹ©ÉaŠĆ+tn {űnŢý8xžáĹsá -÷šžăÔľ=Ýň¶<@j٬CÔ®čĹąž˙Ú©ţ[ŠĎ>Ä6­#=-ŰĐg?,ŻFŚ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/objects/60/7d96653d4d0a4f733107f7890c2e67b55b620d b/vendor/libgit2/tests/resources/submod2/.gitted/objects/60/7d96653d4d0a4f733107f7890c2e67b55b620d deleted file mode 100644 index 30bee40e94..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2/.gitted/objects/60/7d96653d4d0a4f733107f7890c2e67b55b620d and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/objects/74/84482eb8db738cafa696993664607500a3f2b9 b/vendor/libgit2/tests/resources/submod2/.gitted/objects/74/84482eb8db738cafa696993664607500a3f2b9 deleted file mode 100644 index 79018042d9..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2/.gitted/objects/74/84482eb8db738cafa696993664607500a3f2b9 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/objects/7b/a4c5c3561daa5ab1a86215cfb0587e96d404d6 b/vendor/libgit2/tests/resources/submod2/.gitted/objects/7b/a4c5c3561daa5ab1a86215cfb0587e96d404d6 deleted file mode 100644 index cde89e5bbe..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2/.gitted/objects/7b/a4c5c3561daa5ab1a86215cfb0587e96d404d6 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/objects/87/3585b94bdeabccea991ea5e3ec1a277895b698 b/vendor/libgit2/tests/resources/submod2/.gitted/objects/87/3585b94bdeabccea991ea5e3ec1a277895b698 deleted file mode 100644 index 41af98aa9f..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2/.gitted/objects/87/3585b94bdeabccea991ea5e3ec1a277895b698 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/objects/97/4cf7c73de336b0c4e019f918f3cee367d72e84 b/vendor/libgit2/tests/resources/submod2/.gitted/objects/97/4cf7c73de336b0c4e019f918f3cee367d72e84 deleted file mode 100644 index 160f1caf4a..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/objects/97/4cf7c73de336b0c4e019f918f3cee367d72e84 +++ /dev/null @@ -1,2 +0,0 @@ -xµË -Â0Eݶ_ş·Bqĺg¸ yŚi ™IŔĎ÷Y±Up!ÝÎs¸Ł|R¬ď7«=’)XCAGä˘:…ŕ25‡ş:É<°-ű„uUĐ_IŰň‡¤Y˘…\Ϥ%ęAF fŞ{ťGß qTśPsď”uąă(ÓZ{‰RA ô#ř̉Łó0mľ“Ų.8ďŢŃbáäěÇăŢů?{vĘŚ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/objects/9d/bc299bc013ea253583b40bf327b5a6e4037b89 b/vendor/libgit2/tests/resources/submod2/.gitted/objects/9d/bc299bc013ea253583b40bf327b5a6e4037b89 deleted file mode 100644 index 1ee52218d9..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2/.gitted/objects/9d/bc299bc013ea253583b40bf327b5a6e4037b89 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/objects/a9/104bf89e911387244ef499413960ba472066d9 b/vendor/libgit2/tests/resources/submod2/.gitted/objects/a9/104bf89e911387244ef499413960ba472066d9 deleted file mode 100644 index 2239e14a83..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2/.gitted/objects/a9/104bf89e911387244ef499413960ba472066d9 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/objects/b6/14088620bbdc1d29549d223ceba0f4419fd4cb b/vendor/libgit2/tests/resources/submod2/.gitted/objects/b6/14088620bbdc1d29549d223ceba0f4419fd4cb deleted file mode 100644 index a03ea66e4a..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2/.gitted/objects/b6/14088620bbdc1d29549d223ceba0f4419fd4cb and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/objects/d4/07f19e50c1da1ff584beafe0d6dac7237c5d06 b/vendor/libgit2/tests/resources/submod2/.gitted/objects/d4/07f19e50c1da1ff584beafe0d6dac7237c5d06 deleted file mode 100644 index 292303eb93..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2/.gitted/objects/d4/07f19e50c1da1ff584beafe0d6dac7237c5d06 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/objects/d9/3e95571d92cceb5de28c205f1d5f3cc8b88bc8 b/vendor/libgit2/tests/resources/submod2/.gitted/objects/d9/3e95571d92cceb5de28c205f1d5f3cc8b88bc8 deleted file mode 100644 index b92c7eebdc..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/objects/d9/3e95571d92cceb5de28c205f1d5f3cc8b88bc8 +++ /dev/null @@ -1,2 +0,0 @@ -x•ĎŰ -!€án×§}€ "‚.z’uRÉCx€}üΑۼťřt¸ ś.׫Ů6î‚,iźs&%ăÁ9“Sż#ݲ¦úIW˘=—aßËf2A‹ĽBYsĎńßĐťa{c±¶^K3gĽÄńłwMÍ FÜúřߥ4sĹçâ€ňÇáőÎ÷'Nę°I \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/objects/e3/b83bf274ee065eee48734cf8c6dfaf5e81471c b/vendor/libgit2/tests/resources/submod2/.gitted/objects/e3/b83bf274ee065eee48734cf8c6dfaf5e81471c deleted file mode 100644 index 3c7750b12a..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2/.gitted/objects/e3/b83bf274ee065eee48734cf8c6dfaf5e81471c and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2/.gitted/objects/f5/4414c25e6d24fe39f5c3f128d7c8a17bc23833 b/vendor/libgit2/tests/resources/submod2/.gitted/objects/f5/4414c25e6d24fe39f5c3f128d7c8a17bc23833 deleted file mode 100644 index 219620b251..0000000000 --- a/vendor/libgit2/tests/resources/submod2/.gitted/objects/f5/4414c25e6d24fe39f5c3f128d7c8a17bc23833 +++ /dev/null @@ -1,2 +0,0 @@ -xeÍÁ -Â0„aŻíS„ŢíbOzđ1ßä2 1342560358 -0700 commit (initial): Initial commit diff --git a/vendor/libgit2/tests/resources/submod2/not-submodule/.gitted/logs/refs/heads/master b/vendor/libgit2/tests/resources/submod2/not-submodule/.gitted/logs/refs/heads/master deleted file mode 100644 index 1749e7dff8..0000000000 --- a/vendor/libgit2/tests/resources/submod2/not-submodule/.gitted/logs/refs/heads/master +++ /dev/null @@ -1 +0,0 @@ -0000000000000000000000000000000000000000 68e92c611b80ee1ed8f38314ff9577f0d15b2444 Russell Belfer 1342560358 -0700 commit (initial): Initial commit diff --git a/vendor/libgit2/tests/resources/submod2/not-submodule/.gitted/objects/68/e92c611b80ee1ed8f38314ff9577f0d15b2444 b/vendor/libgit2/tests/resources/submod2/not-submodule/.gitted/objects/68/e92c611b80ee1ed8f38314ff9577f0d15b2444 deleted file mode 100644 index 8892531a74..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2/not-submodule/.gitted/objects/68/e92c611b80ee1ed8f38314ff9577f0d15b2444 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2/not-submodule/.gitted/objects/71/ff9927d7c8a5639e062c38a7d35c433c424627 b/vendor/libgit2/tests/resources/submod2/not-submodule/.gitted/objects/71/ff9927d7c8a5639e062c38a7d35c433c424627 deleted file mode 100644 index c4e1a77d7e..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2/not-submodule/.gitted/objects/71/ff9927d7c8a5639e062c38a7d35c433c424627 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2/not-submodule/.gitted/objects/f0/1d56b18efd353ef2bb93a4585d590a0847195e b/vendor/libgit2/tests/resources/submod2/not-submodule/.gitted/objects/f0/1d56b18efd353ef2bb93a4585d590a0847195e deleted file mode 100644 index e9f1942a97..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2/not-submodule/.gitted/objects/f0/1d56b18efd353ef2bb93a4585d590a0847195e and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2/not-submodule/.gitted/refs/heads/master b/vendor/libgit2/tests/resources/submod2/not-submodule/.gitted/refs/heads/master deleted file mode 100644 index 0bd8514bd0..0000000000 --- a/vendor/libgit2/tests/resources/submod2/not-submodule/.gitted/refs/heads/master +++ /dev/null @@ -1 +0,0 @@ -68e92c611b80ee1ed8f38314ff9577f0d15b2444 diff --git a/vendor/libgit2/tests/resources/submod2/not-submodule/README.txt b/vendor/libgit2/tests/resources/submod2/not-submodule/README.txt deleted file mode 100644 index 71ff9927d7..0000000000 --- a/vendor/libgit2/tests/resources/submod2/not-submodule/README.txt +++ /dev/null @@ -1 +0,0 @@ -This is a git repo but not a submodule diff --git a/vendor/libgit2/tests/resources/submod2/not/.gitted/notempty b/vendor/libgit2/tests/resources/submod2/not/.gitted/notempty deleted file mode 100644 index 9b33ac4e40..0000000000 --- a/vendor/libgit2/tests/resources/submod2/not/.gitted/notempty +++ /dev/null @@ -1 +0,0 @@ -fooled you diff --git a/vendor/libgit2/tests/resources/submod2/not/README.txt b/vendor/libgit2/tests/resources/submod2/not/README.txt deleted file mode 100644 index 4f6935b981..0000000000 --- a/vendor/libgit2/tests/resources/submod2/not/README.txt +++ /dev/null @@ -1 +0,0 @@ -what am I really diff --git a/vendor/libgit2/tests/resources/submod2/sm_added_and_uncommited/.gitted b/vendor/libgit2/tests/resources/submod2/sm_added_and_uncommited/.gitted deleted file mode 100644 index 2b2a4cf904..0000000000 --- a/vendor/libgit2/tests/resources/submod2/sm_added_and_uncommited/.gitted +++ /dev/null @@ -1 +0,0 @@ -gitdir: ../.git/modules/sm_added_and_uncommited diff --git a/vendor/libgit2/tests/resources/submod2/sm_added_and_uncommited/README.txt b/vendor/libgit2/tests/resources/submod2/sm_added_and_uncommited/README.txt deleted file mode 100644 index 780d7397f5..0000000000 --- a/vendor/libgit2/tests/resources/submod2/sm_added_and_uncommited/README.txt +++ /dev/null @@ -1,3 +0,0 @@ -This is the target for submod2 submodule links. -Don't add commits casually because you make break tests. - diff --git a/vendor/libgit2/tests/resources/submod2/sm_added_and_uncommited/file_to_modify b/vendor/libgit2/tests/resources/submod2/sm_added_and_uncommited/file_to_modify deleted file mode 100644 index 789efbdada..0000000000 --- a/vendor/libgit2/tests/resources/submod2/sm_added_and_uncommited/file_to_modify +++ /dev/null @@ -1,3 +0,0 @@ -This is a file to modify in submodules -It already has some history. -You can add local changes as needed. diff --git a/vendor/libgit2/tests/resources/submod2/sm_changed_file/.gitted b/vendor/libgit2/tests/resources/submod2/sm_changed_file/.gitted deleted file mode 100644 index dc98b16740..0000000000 --- a/vendor/libgit2/tests/resources/submod2/sm_changed_file/.gitted +++ /dev/null @@ -1 +0,0 @@ -gitdir: ../.git/modules/sm_changed_file diff --git a/vendor/libgit2/tests/resources/submod2/sm_changed_file/README.txt b/vendor/libgit2/tests/resources/submod2/sm_changed_file/README.txt deleted file mode 100644 index 780d7397f5..0000000000 --- a/vendor/libgit2/tests/resources/submod2/sm_changed_file/README.txt +++ /dev/null @@ -1,3 +0,0 @@ -This is the target for submod2 submodule links. -Don't add commits casually because you make break tests. - diff --git a/vendor/libgit2/tests/resources/submod2/sm_changed_file/file_to_modify b/vendor/libgit2/tests/resources/submod2/sm_changed_file/file_to_modify deleted file mode 100644 index e5ba671685..0000000000 --- a/vendor/libgit2/tests/resources/submod2/sm_changed_file/file_to_modify +++ /dev/null @@ -1,4 +0,0 @@ -This is a file to modify in submodules -It already has some history. -You can add local changes as needed. -In this case, the file is changed in the workdir diff --git a/vendor/libgit2/tests/resources/submod2/sm_changed_head/.gitted b/vendor/libgit2/tests/resources/submod2/sm_changed_head/.gitted deleted file mode 100644 index d5419b62dc..0000000000 --- a/vendor/libgit2/tests/resources/submod2/sm_changed_head/.gitted +++ /dev/null @@ -1 +0,0 @@ -gitdir: ../.git/modules/sm_changed_head diff --git a/vendor/libgit2/tests/resources/submod2/sm_changed_head/README.txt b/vendor/libgit2/tests/resources/submod2/sm_changed_head/README.txt deleted file mode 100644 index 780d7397f5..0000000000 --- a/vendor/libgit2/tests/resources/submod2/sm_changed_head/README.txt +++ /dev/null @@ -1,3 +0,0 @@ -This is the target for submod2 submodule links. -Don't add commits casually because you make break tests. - diff --git a/vendor/libgit2/tests/resources/submod2/sm_changed_head/file_to_modify b/vendor/libgit2/tests/resources/submod2/sm_changed_head/file_to_modify deleted file mode 100644 index 8eb1e637ed..0000000000 --- a/vendor/libgit2/tests/resources/submod2/sm_changed_head/file_to_modify +++ /dev/null @@ -1,4 +0,0 @@ -This is a file to modify in submodules -It already has some history. -You can add local changes as needed. -This one has been changed and the change has been committed to HEAD. diff --git a/vendor/libgit2/tests/resources/submod2/sm_changed_index/.gitted b/vendor/libgit2/tests/resources/submod2/sm_changed_index/.gitted deleted file mode 100644 index 2c7a5b2713..0000000000 --- a/vendor/libgit2/tests/resources/submod2/sm_changed_index/.gitted +++ /dev/null @@ -1 +0,0 @@ -gitdir: ../.git/modules/sm_changed_index diff --git a/vendor/libgit2/tests/resources/submod2/sm_changed_index/README.txt b/vendor/libgit2/tests/resources/submod2/sm_changed_index/README.txt deleted file mode 100644 index 780d7397f5..0000000000 --- a/vendor/libgit2/tests/resources/submod2/sm_changed_index/README.txt +++ /dev/null @@ -1,3 +0,0 @@ -This is the target for submod2 submodule links. -Don't add commits casually because you make break tests. - diff --git a/vendor/libgit2/tests/resources/submod2/sm_changed_index/file_to_modify b/vendor/libgit2/tests/resources/submod2/sm_changed_index/file_to_modify deleted file mode 100644 index a02d317706..0000000000 --- a/vendor/libgit2/tests/resources/submod2/sm_changed_index/file_to_modify +++ /dev/null @@ -1,4 +0,0 @@ -This is a file to modify in submodules -It already has some history. -You can add local changes as needed. -Here the file is changed in the index and the workdir diff --git a/vendor/libgit2/tests/resources/submod2/sm_changed_untracked_file/.gitted b/vendor/libgit2/tests/resources/submod2/sm_changed_untracked_file/.gitted deleted file mode 100644 index 9a1070647d..0000000000 --- a/vendor/libgit2/tests/resources/submod2/sm_changed_untracked_file/.gitted +++ /dev/null @@ -1 +0,0 @@ -gitdir: ../.git/modules/sm_changed_untracked_file diff --git a/vendor/libgit2/tests/resources/submod2/sm_changed_untracked_file/README.txt b/vendor/libgit2/tests/resources/submod2/sm_changed_untracked_file/README.txt deleted file mode 100644 index 780d7397f5..0000000000 --- a/vendor/libgit2/tests/resources/submod2/sm_changed_untracked_file/README.txt +++ /dev/null @@ -1,3 +0,0 @@ -This is the target for submod2 submodule links. -Don't add commits casually because you make break tests. - diff --git a/vendor/libgit2/tests/resources/submod2/sm_changed_untracked_file/file_to_modify b/vendor/libgit2/tests/resources/submod2/sm_changed_untracked_file/file_to_modify deleted file mode 100644 index 789efbdada..0000000000 --- a/vendor/libgit2/tests/resources/submod2/sm_changed_untracked_file/file_to_modify +++ /dev/null @@ -1,3 +0,0 @@ -This is a file to modify in submodules -It already has some history. -You can add local changes as needed. diff --git a/vendor/libgit2/tests/resources/submod2/sm_changed_untracked_file/i_am_untracked b/vendor/libgit2/tests/resources/submod2/sm_changed_untracked_file/i_am_untracked deleted file mode 100644 index d2bae6167c..0000000000 --- a/vendor/libgit2/tests/resources/submod2/sm_changed_untracked_file/i_am_untracked +++ /dev/null @@ -1 +0,0 @@ -This file is untracked, but in a submodule diff --git a/vendor/libgit2/tests/resources/submod2/sm_missing_commits/.gitted b/vendor/libgit2/tests/resources/submod2/sm_missing_commits/.gitted deleted file mode 100644 index 70193be84c..0000000000 --- a/vendor/libgit2/tests/resources/submod2/sm_missing_commits/.gitted +++ /dev/null @@ -1 +0,0 @@ -gitdir: ../.git/modules/sm_missing_commits diff --git a/vendor/libgit2/tests/resources/submod2/sm_missing_commits/README.txt b/vendor/libgit2/tests/resources/submod2/sm_missing_commits/README.txt deleted file mode 100644 index 780d7397f5..0000000000 --- a/vendor/libgit2/tests/resources/submod2/sm_missing_commits/README.txt +++ /dev/null @@ -1,3 +0,0 @@ -This is the target for submod2 submodule links. -Don't add commits casually because you make break tests. - diff --git a/vendor/libgit2/tests/resources/submod2/sm_missing_commits/file_to_modify b/vendor/libgit2/tests/resources/submod2/sm_missing_commits/file_to_modify deleted file mode 100644 index 8834b635dd..0000000000 --- a/vendor/libgit2/tests/resources/submod2/sm_missing_commits/file_to_modify +++ /dev/null @@ -1,3 +0,0 @@ -This is a file to modify in submodules -It already has some history. - diff --git a/vendor/libgit2/tests/resources/submod2/sm_unchanged/.gitted b/vendor/libgit2/tests/resources/submod2/sm_unchanged/.gitted deleted file mode 100644 index 51a679c80a..0000000000 --- a/vendor/libgit2/tests/resources/submod2/sm_unchanged/.gitted +++ /dev/null @@ -1 +0,0 @@ -gitdir: ../.git/modules/sm_unchanged diff --git a/vendor/libgit2/tests/resources/submod2/sm_unchanged/README.txt b/vendor/libgit2/tests/resources/submod2/sm_unchanged/README.txt deleted file mode 100644 index 780d7397f5..0000000000 --- a/vendor/libgit2/tests/resources/submod2/sm_unchanged/README.txt +++ /dev/null @@ -1,3 +0,0 @@ -This is the target for submod2 submodule links. -Don't add commits casually because you make break tests. - diff --git a/vendor/libgit2/tests/resources/submod2/sm_unchanged/file_to_modify b/vendor/libgit2/tests/resources/submod2/sm_unchanged/file_to_modify deleted file mode 100644 index 789efbdada..0000000000 --- a/vendor/libgit2/tests/resources/submod2/sm_unchanged/file_to_modify +++ /dev/null @@ -1,3 +0,0 @@ -This is a file to modify in submodules -It already has some history. -You can add local changes as needed. diff --git a/vendor/libgit2/tests/resources/submod2_target/.gitted/HEAD b/vendor/libgit2/tests/resources/submod2_target/.gitted/HEAD deleted file mode 100644 index cb089cd89a..0000000000 --- a/vendor/libgit2/tests/resources/submod2_target/.gitted/HEAD +++ /dev/null @@ -1 +0,0 @@ -ref: refs/heads/master diff --git a/vendor/libgit2/tests/resources/submod2_target/.gitted/config b/vendor/libgit2/tests/resources/submod2_target/.gitted/config deleted file mode 100644 index af107929f2..0000000000 --- a/vendor/libgit2/tests/resources/submod2_target/.gitted/config +++ /dev/null @@ -1,6 +0,0 @@ -[core] - repositoryformatversion = 0 - filemode = true - bare = false - logallrefupdates = true - ignorecase = true diff --git a/vendor/libgit2/tests/resources/submod2_target/.gitted/description b/vendor/libgit2/tests/resources/submod2_target/.gitted/description deleted file mode 100644 index 498b267a8c..0000000000 --- a/vendor/libgit2/tests/resources/submod2_target/.gitted/description +++ /dev/null @@ -1 +0,0 @@ -Unnamed repository; edit this file 'description' to name the repository. diff --git a/vendor/libgit2/tests/resources/submod2_target/.gitted/index b/vendor/libgit2/tests/resources/submod2_target/.gitted/index deleted file mode 100644 index eb3ff8c101..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2_target/.gitted/index and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2_target/.gitted/info/exclude b/vendor/libgit2/tests/resources/submod2_target/.gitted/info/exclude deleted file mode 100644 index a5196d1be8..0000000000 --- a/vendor/libgit2/tests/resources/submod2_target/.gitted/info/exclude +++ /dev/null @@ -1,6 +0,0 @@ -# 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/vendor/libgit2/tests/resources/submod2_target/.gitted/logs/HEAD b/vendor/libgit2/tests/resources/submod2_target/.gitted/logs/HEAD deleted file mode 100644 index 0ecd1113f4..0000000000 --- a/vendor/libgit2/tests/resources/submod2_target/.gitted/logs/HEAD +++ /dev/null @@ -1,4 +0,0 @@ -0000000000000000000000000000000000000000 6b31c659545507c381e9cd34ec508f16c04e149e Russell Belfer 1342559662 -0700 commit (initial): Initial commit -6b31c659545507c381e9cd34ec508f16c04e149e 41bd4bc3df978de695f67ace64c560913da11653 Russell Belfer 1342559709 -0700 commit: Adding test file -41bd4bc3df978de695f67ace64c560913da11653 5e4963595a9774b90524d35a807169049de8ccad Russell Belfer 1342559726 -0700 commit: Updating test file -5e4963595a9774b90524d35a807169049de8ccad 480095882d281ed676fe5b863569520e54a7d5c0 Russell Belfer 1342559925 -0700 commit: One more update diff --git a/vendor/libgit2/tests/resources/submod2_target/.gitted/logs/refs/heads/master b/vendor/libgit2/tests/resources/submod2_target/.gitted/logs/refs/heads/master deleted file mode 100644 index 0ecd1113f4..0000000000 --- a/vendor/libgit2/tests/resources/submod2_target/.gitted/logs/refs/heads/master +++ /dev/null @@ -1,4 +0,0 @@ -0000000000000000000000000000000000000000 6b31c659545507c381e9cd34ec508f16c04e149e Russell Belfer 1342559662 -0700 commit (initial): Initial commit -6b31c659545507c381e9cd34ec508f16c04e149e 41bd4bc3df978de695f67ace64c560913da11653 Russell Belfer 1342559709 -0700 commit: Adding test file -41bd4bc3df978de695f67ace64c560913da11653 5e4963595a9774b90524d35a807169049de8ccad Russell Belfer 1342559726 -0700 commit: Updating test file -5e4963595a9774b90524d35a807169049de8ccad 480095882d281ed676fe5b863569520e54a7d5c0 Russell Belfer 1342559925 -0700 commit: One more update diff --git a/vendor/libgit2/tests/resources/submod2_target/.gitted/objects/06/362fe2fdb7010d0e447b4fb450d405420479a1 b/vendor/libgit2/tests/resources/submod2_target/.gitted/objects/06/362fe2fdb7010d0e447b4fb450d405420479a1 deleted file mode 100644 index f4b7094c52..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2_target/.gitted/objects/06/362fe2fdb7010d0e447b4fb450d405420479a1 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2_target/.gitted/objects/0e/6a3ca48bd47cfe67681acf39aa0b10a0b92484 b/vendor/libgit2/tests/resources/submod2_target/.gitted/objects/0e/6a3ca48bd47cfe67681acf39aa0b10a0b92484 deleted file mode 100644 index 56c845e49d..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2_target/.gitted/objects/0e/6a3ca48bd47cfe67681acf39aa0b10a0b92484 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2_target/.gitted/objects/17/d0ece6e96460a06592d9d9d000de37ba4232c5 b/vendor/libgit2/tests/resources/submod2_target/.gitted/objects/17/d0ece6e96460a06592d9d9d000de37ba4232c5 deleted file mode 100644 index bd179b5f54..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2_target/.gitted/objects/17/d0ece6e96460a06592d9d9d000de37ba4232c5 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2_target/.gitted/objects/41/bd4bc3df978de695f67ace64c560913da11653 b/vendor/libgit2/tests/resources/submod2_target/.gitted/objects/41/bd4bc3df978de695f67ace64c560913da11653 deleted file mode 100644 index ccf49bd15c..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2_target/.gitted/objects/41/bd4bc3df978de695f67ace64c560913da11653 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2_target/.gitted/objects/48/0095882d281ed676fe5b863569520e54a7d5c0 b/vendor/libgit2/tests/resources/submod2_target/.gitted/objects/48/0095882d281ed676fe5b863569520e54a7d5c0 deleted file mode 100644 index 53029069ad..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2_target/.gitted/objects/48/0095882d281ed676fe5b863569520e54a7d5c0 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2_target/.gitted/objects/5e/4963595a9774b90524d35a807169049de8ccad b/vendor/libgit2/tests/resources/submod2_target/.gitted/objects/5e/4963595a9774b90524d35a807169049de8ccad deleted file mode 100644 index 38c791eba1..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2_target/.gitted/objects/5e/4963595a9774b90524d35a807169049de8ccad and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2_target/.gitted/objects/6b/31c659545507c381e9cd34ec508f16c04e149e b/vendor/libgit2/tests/resources/submod2_target/.gitted/objects/6b/31c659545507c381e9cd34ec508f16c04e149e deleted file mode 100644 index a26d299939..0000000000 --- a/vendor/libgit2/tests/resources/submod2_target/.gitted/objects/6b/31c659545507c381e9cd34ec508f16c04e149e +++ /dev/null @@ -1,2 +0,0 @@ -x•ŤQ -!EűvoĹÓy*Ń_żí@Çg#h‚ŁűOhý^Î9w«Ą¤ŇęSoĚ€f1*˛ŠÁ[”‰¬§čIc Ô¤ěę¤pŁďµÁkç Α\›żżS߇żlµÜ@.¤´^ŤQpF‹(ć:˙úD˙5Ĺó“zr~ ńen8 \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/submod2_target/.gitted/objects/73/ba924a80437097795ae839e66e187c55d3babf b/vendor/libgit2/tests/resources/submod2_target/.gitted/objects/73/ba924a80437097795ae839e66e187c55d3babf deleted file mode 100644 index 83d1ba4813..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2_target/.gitted/objects/73/ba924a80437097795ae839e66e187c55d3babf and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2_target/.gitted/objects/78/0d7397f5e8f8f477fb55b7af3accc2154b2d4a b/vendor/libgit2/tests/resources/submod2_target/.gitted/objects/78/0d7397f5e8f8f477fb55b7af3accc2154b2d4a deleted file mode 100644 index 6d27af8a89..0000000000 --- a/vendor/libgit2/tests/resources/submod2_target/.gitted/objects/78/0d7397f5e8f8f477fb55b7af3accc2154b2d4a +++ /dev/null @@ -1,2 +0,0 @@ -x-Ë1Â0 FaćžâßŘ0pŽŔěÄĐ(N-ĹöĐŰӡғľé±ăq]>ksĹ*š? |m“‡ŐçiŞ@ŰÖý¶Ľm»¨VŁ…Ł'©î`)”.Ř-1¨ x -u„xăňt(+ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/submod2_target/.gitted/objects/78/9efbdadaa4a582778d4584385495559ea0994b b/vendor/libgit2/tests/resources/submod2_target/.gitted/objects/78/9efbdadaa4a582778d4584385495559ea0994b deleted file mode 100644 index 17458840b8..0000000000 --- a/vendor/libgit2/tests/resources/submod2_target/.gitted/objects/78/9efbdadaa4a582778d4584385495559ea0994b +++ /dev/null @@ -1,2 +0,0 @@ -x ڱ …0 ť)ŢŠ?= ĄÉÄNŠlO¤k®¸‹jŰú˙ą8&„«¨ ăr ” -ďqJWń°7ľB<ÉáöfŮěK8­#Q1C-‘"eŞ·Ě«ŁŠ°đ>Ľ'@ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/submod2_target/.gitted/objects/88/34b635dd468a83cb012f6feace968c1c9f5d6e b/vendor/libgit2/tests/resources/submod2_target/.gitted/objects/88/34b635dd468a83cb012f6feace968c1c9f5d6e deleted file mode 100644 index 83cc29fb15..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2_target/.gitted/objects/88/34b635dd468a83cb012f6feace968c1c9f5d6e and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2_target/.gitted/objects/d0/5f2cd5cc77addf68ed6f50d622c9a4f732e6c5 b/vendor/libgit2/tests/resources/submod2_target/.gitted/objects/d0/5f2cd5cc77addf68ed6f50d622c9a4f732e6c5 deleted file mode 100644 index 55bda40ef2..0000000000 Binary files a/vendor/libgit2/tests/resources/submod2_target/.gitted/objects/d0/5f2cd5cc77addf68ed6f50d622c9a4f732e6c5 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submod2_target/.gitted/refs/heads/master b/vendor/libgit2/tests/resources/submod2_target/.gitted/refs/heads/master deleted file mode 100644 index e12c44d7ae..0000000000 --- a/vendor/libgit2/tests/resources/submod2_target/.gitted/refs/heads/master +++ /dev/null @@ -1 +0,0 @@ -480095882d281ed676fe5b863569520e54a7d5c0 diff --git a/vendor/libgit2/tests/resources/submod2_target/README.txt b/vendor/libgit2/tests/resources/submod2_target/README.txt deleted file mode 100644 index 780d7397f5..0000000000 --- a/vendor/libgit2/tests/resources/submod2_target/README.txt +++ /dev/null @@ -1,3 +0,0 @@ -This is the target for submod2 submodule links. -Don't add commits casually because you make break tests. - diff --git a/vendor/libgit2/tests/resources/submod2_target/file_to_modify b/vendor/libgit2/tests/resources/submod2_target/file_to_modify deleted file mode 100644 index 789efbdada..0000000000 --- a/vendor/libgit2/tests/resources/submod2_target/file_to_modify +++ /dev/null @@ -1,3 +0,0 @@ -This is a file to modify in submodules -It already has some history. -You can add local changes as needed. diff --git a/vendor/libgit2/tests/resources/submodule_simple/.gitmodules b/vendor/libgit2/tests/resources/submodule_simple/.gitmodules deleted file mode 100644 index 03150b4a72..0000000000 --- a/vendor/libgit2/tests/resources/submodule_simple/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "testrepo"] - path = testrepo - url = ../testrepo.git diff --git a/vendor/libgit2/tests/resources/submodule_simple/.gitted/HEAD b/vendor/libgit2/tests/resources/submodule_simple/.gitted/HEAD deleted file mode 100644 index cb089cd89a..0000000000 --- a/vendor/libgit2/tests/resources/submodule_simple/.gitted/HEAD +++ /dev/null @@ -1 +0,0 @@ -ref: refs/heads/master diff --git a/vendor/libgit2/tests/resources/submodule_simple/.gitted/config b/vendor/libgit2/tests/resources/submodule_simple/.gitted/config deleted file mode 100644 index 78387c50b4..0000000000 --- a/vendor/libgit2/tests/resources/submodule_simple/.gitted/config +++ /dev/null @@ -1,8 +0,0 @@ -[core] - repositoryformatversion = 0 - filemode = false - bare = false - logallrefupdates = true - symlinks = false - ignorecase = true - hideDotFiles = dotGitOnly diff --git a/vendor/libgit2/tests/resources/submodule_simple/.gitted/description b/vendor/libgit2/tests/resources/submodule_simple/.gitted/description deleted file mode 100644 index 498b267a8c..0000000000 --- a/vendor/libgit2/tests/resources/submodule_simple/.gitted/description +++ /dev/null @@ -1 +0,0 @@ -Unnamed repository; edit this file 'description' to name the repository. diff --git a/vendor/libgit2/tests/resources/submodule_simple/.gitted/index b/vendor/libgit2/tests/resources/submodule_simple/.gitted/index deleted file mode 100644 index 6e22d7ffb7..0000000000 Binary files a/vendor/libgit2/tests/resources/submodule_simple/.gitted/index and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submodule_simple/.gitted/objects/22/9cea838964f435d4fc2c11561ddb7447003609 b/vendor/libgit2/tests/resources/submodule_simple/.gitted/objects/22/9cea838964f435d4fc2c11561ddb7447003609 deleted file mode 100644 index 9f0800d29d..0000000000 Binary files a/vendor/libgit2/tests/resources/submodule_simple/.gitted/objects/22/9cea838964f435d4fc2c11561ddb7447003609 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submodule_simple/.gitted/objects/5b/19f7523fbf55c96153ff5a94875583f1115a36 b/vendor/libgit2/tests/resources/submodule_simple/.gitted/objects/5b/19f7523fbf55c96153ff5a94875583f1115a36 deleted file mode 100644 index d0681ac400..0000000000 Binary files a/vendor/libgit2/tests/resources/submodule_simple/.gitted/objects/5b/19f7523fbf55c96153ff5a94875583f1115a36 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submodule_simple/.gitted/objects/a8/575e6aaececba78823993e4f11abbc6172aabd b/vendor/libgit2/tests/resources/submodule_simple/.gitted/objects/a8/575e6aaececba78823993e4f11abbc6172aabd deleted file mode 100644 index b8961b0be2..0000000000 Binary files a/vendor/libgit2/tests/resources/submodule_simple/.gitted/objects/a8/575e6aaececba78823993e4f11abbc6172aabd and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submodule_simple/.gitted/objects/b4/f28943fad380f4ee3a9c6b95259b28204cc25a b/vendor/libgit2/tests/resources/submodule_simple/.gitted/objects/b4/f28943fad380f4ee3a9c6b95259b28204cc25a deleted file mode 100644 index 653238cd88..0000000000 Binary files a/vendor/libgit2/tests/resources/submodule_simple/.gitted/objects/b4/f28943fad380f4ee3a9c6b95259b28204cc25a and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submodule_simple/.gitted/objects/d6/9ff504a3ba631f2fdb35bff93cc8cb8e85f4f8 b/vendor/libgit2/tests/resources/submodule_simple/.gitted/objects/d6/9ff504a3ba631f2fdb35bff93cc8cb8e85f4f8 deleted file mode 100644 index dabf65b7ee..0000000000 Binary files a/vendor/libgit2/tests/resources/submodule_simple/.gitted/objects/d6/9ff504a3ba631f2fdb35bff93cc8cb8e85f4f8 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submodule_simple/.gitted/packed-refs b/vendor/libgit2/tests/resources/submodule_simple/.gitted/packed-refs deleted file mode 100644 index 0400126533..0000000000 --- a/vendor/libgit2/tests/resources/submodule_simple/.gitted/packed-refs +++ /dev/null @@ -1,3 +0,0 @@ -# pack-refs with: peeled fully-peeled -229cea838964f435d4fc2c11561ddb7447003609 refs/remotes/origin/alternate_1 -a8575e6aaececba78823993e4f11abbc6172aabd refs/remotes/origin/master diff --git a/vendor/libgit2/tests/resources/submodule_simple/.gitted/refs/heads/alternate_1 b/vendor/libgit2/tests/resources/submodule_simple/.gitted/refs/heads/alternate_1 deleted file mode 100644 index 6f51966650..0000000000 --- a/vendor/libgit2/tests/resources/submodule_simple/.gitted/refs/heads/alternate_1 +++ /dev/null @@ -1 +0,0 @@ -229cea838964f435d4fc2c11561ddb7447003609 diff --git a/vendor/libgit2/tests/resources/submodule_simple/.gitted/refs/heads/master b/vendor/libgit2/tests/resources/submodule_simple/.gitted/refs/heads/master deleted file mode 100644 index f01cfb23f5..0000000000 --- a/vendor/libgit2/tests/resources/submodule_simple/.gitted/refs/heads/master +++ /dev/null @@ -1 +0,0 @@ -a8575e6aaececba78823993e4f11abbc6172aabd diff --git a/vendor/libgit2/tests/resources/submodules/.gitted/HEAD b/vendor/libgit2/tests/resources/submodules/.gitted/HEAD deleted file mode 100644 index cb089cd89a..0000000000 --- a/vendor/libgit2/tests/resources/submodules/.gitted/HEAD +++ /dev/null @@ -1 +0,0 @@ -ref: refs/heads/master diff --git a/vendor/libgit2/tests/resources/submodules/.gitted/config b/vendor/libgit2/tests/resources/submodules/.gitted/config deleted file mode 100644 index af107929f2..0000000000 --- a/vendor/libgit2/tests/resources/submodules/.gitted/config +++ /dev/null @@ -1,6 +0,0 @@ -[core] - repositoryformatversion = 0 - filemode = true - bare = false - logallrefupdates = true - ignorecase = true diff --git a/vendor/libgit2/tests/resources/submodules/.gitted/description b/vendor/libgit2/tests/resources/submodules/.gitted/description deleted file mode 100644 index 498b267a8c..0000000000 --- a/vendor/libgit2/tests/resources/submodules/.gitted/description +++ /dev/null @@ -1 +0,0 @@ -Unnamed repository; edit this file 'description' to name the repository. diff --git a/vendor/libgit2/tests/resources/submodules/.gitted/index b/vendor/libgit2/tests/resources/submodules/.gitted/index deleted file mode 100644 index 97bf8ef515..0000000000 Binary files a/vendor/libgit2/tests/resources/submodules/.gitted/index and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submodules/.gitted/info/exclude b/vendor/libgit2/tests/resources/submodules/.gitted/info/exclude deleted file mode 100644 index dfc4115797..0000000000 --- a/vendor/libgit2/tests/resources/submodules/.gitted/info/exclude +++ /dev/null @@ -1,8 +0,0 @@ -# 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] -# *~ -ignored - diff --git a/vendor/libgit2/tests/resources/submodules/.gitted/info/refs b/vendor/libgit2/tests/resources/submodules/.gitted/info/refs deleted file mode 100644 index ba17abddef..0000000000 --- a/vendor/libgit2/tests/resources/submodules/.gitted/info/refs +++ /dev/null @@ -1 +0,0 @@ -09176a980273d801a3e37cc45c84af1366501ed9 refs/heads/master diff --git a/vendor/libgit2/tests/resources/submodules/.gitted/logs/HEAD b/vendor/libgit2/tests/resources/submodules/.gitted/logs/HEAD deleted file mode 100644 index 87a7bdafc2..0000000000 --- a/vendor/libgit2/tests/resources/submodules/.gitted/logs/HEAD +++ /dev/null @@ -1,2 +0,0 @@ -0000000000000000000000000000000000000000 09176a980273d801a3e37cc45c84af1366501ed9 Russell Belfer 1332365253 -0700 commit (initial): initial commit -09176a980273d801a3e37cc45c84af1366501ed9 97896810b3210244a62a82458b8e0819ecfc6850 Russell Belfer 1332780781 -0700 commit: Setting up gitmodules diff --git a/vendor/libgit2/tests/resources/submodules/.gitted/logs/refs/heads/master b/vendor/libgit2/tests/resources/submodules/.gitted/logs/refs/heads/master deleted file mode 100644 index 87a7bdafc2..0000000000 --- a/vendor/libgit2/tests/resources/submodules/.gitted/logs/refs/heads/master +++ /dev/null @@ -1,2 +0,0 @@ -0000000000000000000000000000000000000000 09176a980273d801a3e37cc45c84af1366501ed9 Russell Belfer 1332365253 -0700 commit (initial): initial commit -09176a980273d801a3e37cc45c84af1366501ed9 97896810b3210244a62a82458b8e0819ecfc6850 Russell Belfer 1332780781 -0700 commit: Setting up gitmodules diff --git a/vendor/libgit2/tests/resources/submodules/.gitted/objects/26/a3b32a9b7d97486c5557f5902e8ac94638145e b/vendor/libgit2/tests/resources/submodules/.gitted/objects/26/a3b32a9b7d97486c5557f5902e8ac94638145e deleted file mode 100644 index 2c3c2cb61c..0000000000 --- a/vendor/libgit2/tests/resources/submodules/.gitted/objects/26/a3b32a9b7d97486c5557f5902e8ac94638145e +++ /dev/null @@ -1,2 +0,0 @@ -x%‰= -€0 F]í)Š0ŕ"ĂIŚ*•|Éý-t{?ś2ÇilV8żůô$±«Řmˇýv»ăk­k*F DAĘ=(=|=6 ¬DAv=ŰÍA}™&'…Oň$= \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/submodules/.gitted/objects/78/308c9251cf4eee8b25a76c7d2790c73d797357 b/vendor/libgit2/tests/resources/submodules/.gitted/objects/78/308c9251cf4eee8b25a76c7d2790c73d797357 deleted file mode 100644 index c85fb5512f..0000000000 Binary files a/vendor/libgit2/tests/resources/submodules/.gitted/objects/78/308c9251cf4eee8b25a76c7d2790c73d797357 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submodules/.gitted/objects/97/896810b3210244a62a82458b8e0819ecfc6850 b/vendor/libgit2/tests/resources/submodules/.gitted/objects/97/896810b3210244a62a82458b8e0819ecfc6850 deleted file mode 100644 index 1c8dbdf9f0..0000000000 --- a/vendor/libgit2/tests/resources/submodules/.gitted/objects/97/896810b3210244a62a82458b8e0819ecfc6850 +++ /dev/null @@ -1,3 +0,0 @@ -xťŽ[ -Â0EýÎ*fʤS“ KФéŤú4Ýżwŕ×…Ă9pÓ2MCĄFôP @ťăÜu.„.¶pÚ!˛OYádiYUÍ'Ě•8XďbPnĽôĘ6 -ħԞ“¶1[qîĚ}0q«ďĄĐc[WŚ#Ý1fşÄR:ŕö›SZ¦+Y‘Ć+{µtdĎlvş¬»ţOmž¨u_´}č5Ôié·«ů` Kć \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/submodules/.gitted/objects/b6/0fd986699ba4e9e68bea07cf8e793f323ef888 b/vendor/libgit2/tests/resources/submodules/.gitted/objects/b6/0fd986699ba4e9e68bea07cf8e793f323ef888 deleted file mode 100644 index 3d78bd6bef..0000000000 Binary files a/vendor/libgit2/tests/resources/submodules/.gitted/objects/b6/0fd986699ba4e9e68bea07cf8e793f323ef888 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submodules/.gitted/objects/d5/f7fc3f74f7dec08280f370a975b112e8f60818 b/vendor/libgit2/tests/resources/submodules/.gitted/objects/d5/f7fc3f74f7dec08280f370a975b112e8f60818 deleted file mode 100644 index 6e0b49e86a..0000000000 Binary files a/vendor/libgit2/tests/resources/submodules/.gitted/objects/d5/f7fc3f74f7dec08280f370a975b112e8f60818 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submodules/.gitted/objects/e3/50052cc767cd1fcb37e84e9a89e701925be4ae b/vendor/libgit2/tests/resources/submodules/.gitted/objects/e3/50052cc767cd1fcb37e84e9a89e701925be4ae deleted file mode 100644 index 082a58941a..0000000000 Binary files a/vendor/libgit2/tests/resources/submodules/.gitted/objects/e3/50052cc767cd1fcb37e84e9a89e701925be4ae and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submodules/.gitted/objects/info/packs b/vendor/libgit2/tests/resources/submodules/.gitted/objects/info/packs deleted file mode 100644 index 0785ef6989..0000000000 --- a/vendor/libgit2/tests/resources/submodules/.gitted/objects/info/packs +++ /dev/null @@ -1,2 +0,0 @@ -P pack-b69d04bb39ac274669e2184e45bd90015d02ef5b.pack - diff --git a/vendor/libgit2/tests/resources/submodules/.gitted/objects/pack/pack-b69d04bb39ac274669e2184e45bd90015d02ef5b.idx b/vendor/libgit2/tests/resources/submodules/.gitted/objects/pack/pack-b69d04bb39ac274669e2184e45bd90015d02ef5b.idx deleted file mode 100644 index 810fc31811..0000000000 Binary files a/vendor/libgit2/tests/resources/submodules/.gitted/objects/pack/pack-b69d04bb39ac274669e2184e45bd90015d02ef5b.idx and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submodules/.gitted/objects/pack/pack-b69d04bb39ac274669e2184e45bd90015d02ef5b.pack b/vendor/libgit2/tests/resources/submodules/.gitted/objects/pack/pack-b69d04bb39ac274669e2184e45bd90015d02ef5b.pack deleted file mode 100644 index c25c4a73f8..0000000000 Binary files a/vendor/libgit2/tests/resources/submodules/.gitted/objects/pack/pack-b69d04bb39ac274669e2184e45bd90015d02ef5b.pack and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submodules/.gitted/packed-refs b/vendor/libgit2/tests/resources/submodules/.gitted/packed-refs deleted file mode 100644 index a6450691ea..0000000000 --- a/vendor/libgit2/tests/resources/submodules/.gitted/packed-refs +++ /dev/null @@ -1,2 +0,0 @@ -# pack-refs with: peeled -09176a980273d801a3e37cc45c84af1366501ed9 refs/heads/master diff --git a/vendor/libgit2/tests/resources/submodules/.gitted/refs/heads/master b/vendor/libgit2/tests/resources/submodules/.gitted/refs/heads/master deleted file mode 100644 index 32b9358537..0000000000 --- a/vendor/libgit2/tests/resources/submodules/.gitted/refs/heads/master +++ /dev/null @@ -1 +0,0 @@ -97896810b3210244a62a82458b8e0819ecfc6850 diff --git a/vendor/libgit2/tests/resources/submodules/added b/vendor/libgit2/tests/resources/submodules/added deleted file mode 100644 index d5f7fc3f74..0000000000 --- a/vendor/libgit2/tests/resources/submodules/added +++ /dev/null @@ -1 +0,0 @@ -added diff --git a/vendor/libgit2/tests/resources/submodules/gitmodules b/vendor/libgit2/tests/resources/submodules/gitmodules deleted file mode 100644 index 2798b696c2..0000000000 --- a/vendor/libgit2/tests/resources/submodules/gitmodules +++ /dev/null @@ -1,6 +0,0 @@ -[submodule "testrepo"] - path = testrepo - url = -[submodule ""] - path = testrepo - url = \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/submodules/ignored b/vendor/libgit2/tests/resources/submodules/ignored deleted file mode 100644 index 092bfb9bdf..0000000000 --- a/vendor/libgit2/tests/resources/submodules/ignored +++ /dev/null @@ -1 +0,0 @@ -yo diff --git a/vendor/libgit2/tests/resources/submodules/modified b/vendor/libgit2/tests/resources/submodules/modified deleted file mode 100644 index 452216e1d4..0000000000 --- a/vendor/libgit2/tests/resources/submodules/modified +++ /dev/null @@ -1,2 +0,0 @@ -changed - diff --git a/vendor/libgit2/tests/resources/submodules/testrepo/.gitted/HEAD b/vendor/libgit2/tests/resources/submodules/testrepo/.gitted/HEAD deleted file mode 100644 index cb089cd89a..0000000000 --- a/vendor/libgit2/tests/resources/submodules/testrepo/.gitted/HEAD +++ /dev/null @@ -1 +0,0 @@ -ref: refs/heads/master diff --git a/vendor/libgit2/tests/resources/submodules/testrepo/.gitted/config b/vendor/libgit2/tests/resources/submodules/testrepo/.gitted/config deleted file mode 100644 index d6dcad12b3..0000000000 --- a/vendor/libgit2/tests/resources/submodules/testrepo/.gitted/config +++ /dev/null @@ -1,12 +0,0 @@ -[core] - repositoryformatversion = 0 - filemode = true - bare = false - logallrefupdates = true - ignorecase = true -[remote "origin"] - fetch = +refs/heads/*:refs/remotes/origin/* - url = /Users/rb/src/libgit2/tests/resources/testrepo.git -[branch "master"] - remote = origin - merge = refs/heads/master diff --git a/vendor/libgit2/tests/resources/submodules/testrepo/.gitted/description b/vendor/libgit2/tests/resources/submodules/testrepo/.gitted/description deleted file mode 100644 index 498b267a8c..0000000000 --- a/vendor/libgit2/tests/resources/submodules/testrepo/.gitted/description +++ /dev/null @@ -1 +0,0 @@ -Unnamed repository; edit this file 'description' to name the repository. diff --git a/vendor/libgit2/tests/resources/submodules/testrepo/.gitted/index b/vendor/libgit2/tests/resources/submodules/testrepo/.gitted/index deleted file mode 100644 index 3eb8d84fe3..0000000000 Binary files a/vendor/libgit2/tests/resources/submodules/testrepo/.gitted/index and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submodules/testrepo/.gitted/info/exclude b/vendor/libgit2/tests/resources/submodules/testrepo/.gitted/info/exclude deleted file mode 100644 index a5196d1be8..0000000000 --- a/vendor/libgit2/tests/resources/submodules/testrepo/.gitted/info/exclude +++ /dev/null @@ -1,6 +0,0 @@ -# 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/vendor/libgit2/tests/resources/submodules/testrepo/.gitted/logs/HEAD b/vendor/libgit2/tests/resources/submodules/testrepo/.gitted/logs/HEAD deleted file mode 100644 index 147643a304..0000000000 --- a/vendor/libgit2/tests/resources/submodules/testrepo/.gitted/logs/HEAD +++ /dev/null @@ -1 +0,0 @@ -0000000000000000000000000000000000000000 a65fedf39aefe402d3bb6e24df4d4f5fe4547750 Russell Belfer 1332366307 -0700 clone: from /Users/rb/src/libgit2/tests/resources/testrepo.git diff --git a/vendor/libgit2/tests/resources/submodules/testrepo/.gitted/logs/refs/heads/master b/vendor/libgit2/tests/resources/submodules/testrepo/.gitted/logs/refs/heads/master deleted file mode 100644 index 147643a304..0000000000 --- a/vendor/libgit2/tests/resources/submodules/testrepo/.gitted/logs/refs/heads/master +++ /dev/null @@ -1 +0,0 @@ -0000000000000000000000000000000000000000 a65fedf39aefe402d3bb6e24df4d4f5fe4547750 Russell Belfer 1332366307 -0700 clone: from /Users/rb/src/libgit2/tests/resources/testrepo.git diff --git a/vendor/libgit2/tests/resources/submodules/testrepo/.gitted/objects/13/85f264afb75a56a5bec74243be9b367ba4ca08 b/vendor/libgit2/tests/resources/submodules/testrepo/.gitted/objects/13/85f264afb75a56a5bec74243be9b367ba4ca08 deleted file mode 100644 index cedb2a22e6..0000000000 Binary files a/vendor/libgit2/tests/resources/submodules/testrepo/.gitted/objects/13/85f264afb75a56a5bec74243be9b367ba4ca08 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submodules/testrepo/.gitted/objects/18/1037049a54a1eb5fab404658a3a250b44335d7 b/vendor/libgit2/tests/resources/submodules/testrepo/.gitted/objects/18/1037049a54a1eb5fab404658a3a250b44335d7 deleted file mode 100644 index 93a16f1463..0000000000 Binary files a/vendor/libgit2/tests/resources/submodules/testrepo/.gitted/objects/18/1037049a54a1eb5fab404658a3a250b44335d7 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submodules/testrepo/.gitted/objects/18/10dff58d8a660512d4832e740f692884338ccd b/vendor/libgit2/tests/resources/submodules/testrepo/.gitted/objects/18/10dff58d8a660512d4832e740f692884338ccd deleted file mode 100644 index ba0bfb30cd..0000000000 Binary files a/vendor/libgit2/tests/resources/submodules/testrepo/.gitted/objects/18/10dff58d8a660512d4832e740f692884338ccd and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submodules/testrepo/.gitted/objects/1f/67fc4386b2d171e0d21be1c447e12660561f9b b/vendor/libgit2/tests/resources/submodules/testrepo/.gitted/objects/1f/67fc4386b2d171e0d21be1c447e12660561f9b deleted file mode 100644 index 225c45734e..0000000000 Binary files a/vendor/libgit2/tests/resources/submodules/testrepo/.gitted/objects/1f/67fc4386b2d171e0d21be1c447e12660561f9b and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submodules/testrepo/.gitted/objects/27/0b8ea76056d5cad83af921837702d3e3c2924d b/vendor/libgit2/tests/resources/submodules/testrepo/.gitted/objects/27/0b8ea76056d5cad83af921837702d3e3c2924d deleted file mode 100644 index df40d99aff..0000000000 Binary files a/vendor/libgit2/tests/resources/submodules/testrepo/.gitted/objects/27/0b8ea76056d5cad83af921837702d3e3c2924d and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submodules/testrepo/.gitted/objects/32/59a6bd5b57fb9c1281bb7ed3167b50f224cb54 b/vendor/libgit2/tests/resources/submodules/testrepo/.gitted/objects/32/59a6bd5b57fb9c1281bb7ed3167b50f224cb54 deleted file mode 100644 index 321eaa8679..0000000000 Binary files a/vendor/libgit2/tests/resources/submodules/testrepo/.gitted/objects/32/59a6bd5b57fb9c1281bb7ed3167b50f224cb54 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submodules/testrepo/.gitted/objects/36/97d64be941a53d4ae8f6a271e4e3fa56b022cc b/vendor/libgit2/tests/resources/submodules/testrepo/.gitted/objects/36/97d64be941a53d4ae8f6a271e4e3fa56b022cc deleted file mode 100644 index 9bb5b623bd..0000000000 Binary files a/vendor/libgit2/tests/resources/submodules/testrepo/.gitted/objects/36/97d64be941a53d4ae8f6a271e4e3fa56b022cc and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submodules/testrepo/.gitted/objects/45/b983be36b73c0788dc9cbcb76cbb80fc7bb057 b/vendor/libgit2/tests/resources/submodules/testrepo/.gitted/objects/45/b983be36b73c0788dc9cbcb76cbb80fc7bb057 deleted file mode 100644 index 7ca4ceed50..0000000000 Binary files a/vendor/libgit2/tests/resources/submodules/testrepo/.gitted/objects/45/b983be36b73c0788dc9cbcb76cbb80fc7bb057 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submodules/testrepo/.gitted/objects/4a/202b346bb0fb0db7eff3cffeb3c70babbd2045 b/vendor/libgit2/tests/resources/submodules/testrepo/.gitted/objects/4a/202b346bb0fb0db7eff3cffeb3c70babbd2045 deleted file mode 100644 index 8953b6cefc..0000000000 --- a/vendor/libgit2/tests/resources/submodules/testrepo/.gitted/objects/4a/202b346bb0fb0db7eff3cffeb3c70babbd2045 +++ /dev/null @@ -1,2 +0,0 @@ -xťŽQ -Â0DýÎ)öĘ6›Í¦ "xO°‰‰-ŘFbĽżEoŕĎ0 ĽÇ¤ş,ske×[ÎPn8R,EpD?±gź}Ę^3˛ âŮ<µĺµGŽhYKÄčŇ8Đ–DAťÉ)żÉČ;gôݧÚŕšjďp™4ŐŽŻô-çű˘óăęr‚ÁŠ;°s°GA4Űş=ěůÖ(ôin7řIĚKÍFE \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/submodules/testrepo/.gitted/objects/5b/5b025afb0b4c913b4c338a42934a3863bf3644 b/vendor/libgit2/tests/resources/submodules/testrepo/.gitted/objects/5b/5b025afb0b4c913b4c338a42934a3863bf3644 deleted file mode 100644 index c1f22c54fb..0000000000 --- a/vendor/libgit2/tests/resources/submodules/testrepo/.gitted/objects/5b/5b025afb0b4c913b4c338a42934a3863bf3644 +++ /dev/null @@ -1,2 +0,0 @@ -xťŽŰ 1EýNi@™Ék2 "X‚$ŮYW0Yc˙íŔżĂ…s¸ĄŐzďÚÚőMDĎ€0ćś8!¶†ÉĚŢs‰ XŠŞgÚdí::@X0»P˘wŮ"F/‰‰śÍRŕUz÷ĄmúZZďú˛¤ŇV}|•/śo5݇ŇęIŁ!¬1z Ć:vůÇUim}ę/˘> -öF- \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/submodules/testrepo/.gitted/objects/75/057dd4114e74cca1d750d0aee1647c903cb60a b/vendor/libgit2/tests/resources/submodules/testrepo/.gitted/objects/75/057dd4114e74cca1d750d0aee1647c903cb60a deleted file mode 100644 index 2ef4faa0f8..0000000000 Binary files a/vendor/libgit2/tests/resources/submodules/testrepo/.gitted/objects/75/057dd4114e74cca1d750d0aee1647c903cb60a and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submodules/testrepo/.gitted/objects/76/3d71aadf09a7951596c9746c024e7eece7c7af b/vendor/libgit2/tests/resources/submodules/testrepo/.gitted/objects/76/3d71aadf09a7951596c9746c024e7eece7c7af deleted file mode 100644 index 716b0c64bf..0000000000 --- a/vendor/libgit2/tests/resources/submodules/testrepo/.gitted/objects/76/3d71aadf09a7951596c9746c024e7eece7c7af +++ /dev/null @@ -1 +0,0 @@ -xťŽAj!łö?0¨ŁßÂ09Ęo}ťHÚ6¨}˙ôjUPP©ŐZ&Y˙ř AÔ›±€pŚÁFdëĽ÷pzŤ[fŽYŚ˝PŇqLJ.,Z§`™Ĺ®Đ.ů`’vŮ łq $Ć5+9çOëtśű>Ű/úDE/龡WŻď*eż§Vźdf1>đ覭Öę˛×äÄ›ąúĘ™F« ­ěTŽŮhśk.i¶^0Ô?PĽR, \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/submodules/testrepo/.gitted/objects/7b/4384978d2493e851f9cca7858815fac9b10980 b/vendor/libgit2/tests/resources/submodules/testrepo/.gitted/objects/7b/4384978d2493e851f9cca7858815fac9b10980 deleted file mode 100644 index 23c462f341..0000000000 Binary files a/vendor/libgit2/tests/resources/submodules/testrepo/.gitted/objects/7b/4384978d2493e851f9cca7858815fac9b10980 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submodules/testrepo/.gitted/objects/81/4889a078c031f61ed08ab5fa863aea9314344d b/vendor/libgit2/tests/resources/submodules/testrepo/.gitted/objects/81/4889a078c031f61ed08ab5fa863aea9314344d deleted file mode 100644 index 2f9b6b6e3d..0000000000 Binary files a/vendor/libgit2/tests/resources/submodules/testrepo/.gitted/objects/81/4889a078c031f61ed08ab5fa863aea9314344d and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submodules/testrepo/.gitted/objects/84/96071c1b46c854b31185ea97743be6a8774479 b/vendor/libgit2/tests/resources/submodules/testrepo/.gitted/objects/84/96071c1b46c854b31185ea97743be6a8774479 deleted file mode 100644 index 5df58dda56..0000000000 Binary files a/vendor/libgit2/tests/resources/submodules/testrepo/.gitted/objects/84/96071c1b46c854b31185ea97743be6a8774479 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submodules/testrepo/.gitted/objects/94/4c0f6e4dfa41595e6eb3ceecdb14f50fe18162 b/vendor/libgit2/tests/resources/submodules/testrepo/.gitted/objects/94/4c0f6e4dfa41595e6eb3ceecdb14f50fe18162 deleted file mode 100644 index 4cc3f4dffc..0000000000 --- a/vendor/libgit2/tests/resources/submodules/testrepo/.gitted/objects/94/4c0f6e4dfa41595e6eb3ceecdb14f50fe18162 +++ /dev/null @@ -1 +0,0 @@ -x+)JMU044b040031QrutńueXˇl¨đmmA‹m›ĚŁíJ}Gß;U‘T”—śź–™“ŞWRQÂ`6ýš÷KÇĄ¶^/ľ-*|ňřWŘĄ3PĄy©ĺ`%ËEŰޱ\&gŽĐ|ź0§˙†{ÓŤ1X \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/submodules/testrepo/.gitted/objects/9a/03079b8a8ee85a0bee58bf9be3da8b62414ed4 b/vendor/libgit2/tests/resources/submodules/testrepo/.gitted/objects/9a/03079b8a8ee85a0bee58bf9be3da8b62414ed4 deleted file mode 100644 index bf7b2bb686..0000000000 Binary files a/vendor/libgit2/tests/resources/submodules/testrepo/.gitted/objects/9a/03079b8a8ee85a0bee58bf9be3da8b62414ed4 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/submodules/testrepo/.gitted/objects/9f/d738e8f7967c078dceed8190330fc8648ee56a b/vendor/libgit2/tests/resources/submodules/testrepo/.gitted/objects/9f/d738e8f7967c078dceed8190330fc8648ee56a deleted file mode 100644 index a79612435a..0000000000 --- a/vendor/libgit2/tests/resources/submodules/testrepo/.gitted/objects/9f/d738e8f7967c078dceed8190330fc8648ee56a +++ /dev/null @@ -1,3 +0,0 @@ -xťŽ[ -Â0EýÎ*fĘäŐ¤ "¸W0“‡-ŘFât˙Ý—çpS[–YŔx^ -Díb CLhutɉ}Ą8X*4Zí¬sY˝¨—UŔ‘AĂÖ ĚX3‡R«Mµ¶) s6輢M¦ÖážšÜ&Jm…ó;}Çő±Đü<Ą¶\@›ŕ‚ŃŢŹpÄ€¨vş?”ňŹ«jŰşLđ«¨Ř?Hĺ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/submodules/testrepo/.gitted/objects/a4/a7dce85cf63874e984719f4fdd239f5145052f b/vendor/libgit2/tests/resources/submodules/testrepo/.gitted/objects/a4/a7dce85cf63874e984719f4fdd239f5145052f deleted file mode 100644 index f8588696bc..0000000000 --- a/vendor/libgit2/tests/resources/submodules/testrepo/.gitted/objects/a4/a7dce85cf63874e984719f4fdd239f5145052f +++ /dev/null @@ -1,2 +0,0 @@ -xťŹ;j1DëťmdÓú·ŔÇŽ|M«µ3`ŤŚV{ >€łâQŻ ¸·vL0I?Í!š4–Z=Ę! ×¦8˛F˘Ă’!rÖsQßyČ9]$DŽ&„l6AÇ>jFWüҵ IKNiűë§Z˘%ˇSŚ‘ -‹Ň ­ĹʉřU~Ě˝řä>'Ľď™ű Żwţ ×[ËÇ× ÷öÚDGÚˇ±đŚQ-şMůŹ«>dܶ‘OŢáŇň}í\ŕ8g_ШÂoYr \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/submodules/testrepo/.gitted/objects/a6/5fedf39aefe402d3bb6e24df4d4f5fe4547750 b/vendor/libgit2/tests/resources/submodules/testrepo/.gitted/objects/a6/5fedf39aefe402d3bb6e24df4d4f5fe4547750 deleted file mode 100644 index 29c8e824d2..0000000000 --- a/vendor/libgit2/tests/resources/submodules/testrepo/.gitted/objects/a6/5fedf39aefe402d3bb6e24df4d4f5fe4547750 +++ /dev/null @@ -1,3 +0,0 @@ -xťŽQ -!@űösBťQ"‚ŽĐ Ćٱ rŤÍîßŇú{ 1335806563 -0700 clone: from /Users/ben/src/libgit2/tests/resources/testrepo.git -be3563ae3f795b2b4353bcce3a527ad0a4f7f644 a65fedf39aefe402d3bb6e24df4d4f5fe4547750 Ben Straub 1335806603 -0900 commit: -a65fedf39aefe402d3bb6e24df4d4f5fe4547750 5b5b025afb0b4c913b4c338a42934a3863bf3644 Ben Straub 1335806604 -0900 checkout: moving from master to 5b5b025 -5b5b025afb0b4c913b4c338a42934a3863bf3644 a65fedf39aefe402d3bb6e24df4d4f5fe4547750 Ben Straub 1335806605 -0900 checkout: moving from 5b5b025 to master -a65fedf39aefe402d3bb6e24df4d4f5fe4547750 c47800c7266a2be04c571c04d5a6614691ea99bd Ben Straub 1335806608 -0900 checkout: moving from master to br2 -c47800c7266a2be04c571c04d5a6614691ea99bd a4a7dce85cf63874e984719f4fdd239f5145052f Ben Straub 1335806617 -0900 commit: checking in -a4a7dce85cf63874e984719f4fdd239f5145052f a65fedf39aefe402d3bb6e24df4d4f5fe4547750 Ben Straub 1335806621 -0900 checkout: moving from br2 to master diff --git a/vendor/libgit2/tests/resources/testrepo.git/logs/refs/heads/br2 b/vendor/libgit2/tests/resources/testrepo.git/logs/refs/heads/br2 deleted file mode 100644 index 4e27f6b8df..0000000000 --- a/vendor/libgit2/tests/resources/testrepo.git/logs/refs/heads/br2 +++ /dev/null @@ -1,2 +0,0 @@ -0000000000000000000000000000000000000000 c47800c7266a2be04c571c04d5a6614691ea99bd Ben Straub 1335806608 -0700 branch: Created from refs/remotes/origin/br2 -a4a7dce85cf63874e984719f4fdd239f5145052f a4a7dce85cf63874e984719f4fdd239f5145052f Ben Straub 1335806617 -0700 commit: checking in diff --git a/vendor/libgit2/tests/resources/testrepo.git/logs/refs/heads/master b/vendor/libgit2/tests/resources/testrepo.git/logs/refs/heads/master deleted file mode 100644 index e1c729a45f..0000000000 --- a/vendor/libgit2/tests/resources/testrepo.git/logs/refs/heads/master +++ /dev/null @@ -1,2 +0,0 @@ -0000000000000000000000000000000000000000 be3563ae3f795b2b4353bcce3a527ad0a4f7f644 Ben Straub 1335806563 -0800 clone: from /Users/ben/src/libgit2/tests/resources/testrepo.git -be3563ae3f795b2b4353bcce3a527ad0a4f7f644 a65fedf39aefe402d3bb6e24df4d4f5fe4547750 Ben Straub 1335806603 -0800 commit: checking in diff --git a/vendor/libgit2/tests/resources/testrepo.git/logs/refs/heads/not-good b/vendor/libgit2/tests/resources/testrepo.git/logs/refs/heads/not-good deleted file mode 100644 index bfbeacb8a6..0000000000 --- a/vendor/libgit2/tests/resources/testrepo.git/logs/refs/heads/not-good +++ /dev/null @@ -1 +0,0 @@ -0000000000000000000000000000000000000000 a65fedf39aefe402d3bb6e24df4d4f5fe4547750 Ben Straub 1336761944 -0700 branch: Created from master diff --git a/vendor/libgit2/tests/resources/testrepo.git/logs/refs/remotes/origin/HEAD b/vendor/libgit2/tests/resources/testrepo.git/logs/refs/remotes/origin/HEAD deleted file mode 100644 index f1aac6d0fb..0000000000 --- a/vendor/libgit2/tests/resources/testrepo.git/logs/refs/remotes/origin/HEAD +++ /dev/null @@ -1 +0,0 @@ -0000000000000000000000000000000000000000 be3563ae3f795b2b4353bcce3a527ad0a4f7f644 Ben Straub 1335806563 -0700 clone: from /Users/ben/src/libgit2/tests/resources/testrepo.git diff --git a/vendor/libgit2/tests/resources/testrepo.git/logs/refs/remotes/test/master b/vendor/libgit2/tests/resources/testrepo.git/logs/refs/remotes/test/master deleted file mode 100644 index 8d49ba3e03..0000000000 --- a/vendor/libgit2/tests/resources/testrepo.git/logs/refs/remotes/test/master +++ /dev/null @@ -1,2 +0,0 @@ -0000000000000000000000000000000000000000 a65fedf39aefe402d3bb6e24df4d4f5fe4547750 Ben Straub 1335806565 -0800 update by push -a65fedf39aefe402d3bb6e24df4d4f5fe4547750 be3563ae3f795b2b4353bcce3a527ad0a4f7f644 Ben Straub 1335806688 -0800 update by push diff --git a/vendor/libgit2/tests/resources/testrepo.git/objects/08/b041783f40edfe12bb406c9c9a8a040177c125 b/vendor/libgit2/tests/resources/testrepo.git/objects/08/b041783f40edfe12bb406c9c9a8a040177c125 deleted file mode 100644 index d1c032fce3..0000000000 Binary files a/vendor/libgit2/tests/resources/testrepo.git/objects/08/b041783f40edfe12bb406c9c9a8a040177c125 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/testrepo.git/objects/13/85f264afb75a56a5bec74243be9b367ba4ca08 b/vendor/libgit2/tests/resources/testrepo.git/objects/13/85f264afb75a56a5bec74243be9b367ba4ca08 deleted file mode 100644 index cedb2a22e6..0000000000 Binary files a/vendor/libgit2/tests/resources/testrepo.git/objects/13/85f264afb75a56a5bec74243be9b367ba4ca08 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/testrepo.git/objects/18/1037049a54a1eb5fab404658a3a250b44335d7 b/vendor/libgit2/tests/resources/testrepo.git/objects/18/1037049a54a1eb5fab404658a3a250b44335d7 deleted file mode 100644 index 93a16f1463..0000000000 Binary files a/vendor/libgit2/tests/resources/testrepo.git/objects/18/1037049a54a1eb5fab404658a3a250b44335d7 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/testrepo.git/objects/18/10dff58d8a660512d4832e740f692884338ccd b/vendor/libgit2/tests/resources/testrepo.git/objects/18/10dff58d8a660512d4832e740f692884338ccd deleted file mode 100644 index ba0bfb30cd..0000000000 Binary files a/vendor/libgit2/tests/resources/testrepo.git/objects/18/10dff58d8a660512d4832e740f692884338ccd and /dev/null differ diff --git a/vendor/libgit2/tests/resources/testrepo.git/objects/1a/443023183e3f2bfbef8ac923cd81c1018a18fd b/vendor/libgit2/tests/resources/testrepo.git/objects/1a/443023183e3f2bfbef8ac923cd81c1018a18fd deleted file mode 100644 index 3ec541288f..0000000000 Binary files a/vendor/libgit2/tests/resources/testrepo.git/objects/1a/443023183e3f2bfbef8ac923cd81c1018a18fd and /dev/null differ diff --git a/vendor/libgit2/tests/resources/testrepo.git/objects/1b/8cbad43e867676df601306689fe7c3def5e689 b/vendor/libgit2/tests/resources/testrepo.git/objects/1b/8cbad43e867676df601306689fe7c3def5e689 deleted file mode 100644 index 6048d4bad3..0000000000 Binary files a/vendor/libgit2/tests/resources/testrepo.git/objects/1b/8cbad43e867676df601306689fe7c3def5e689 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/testrepo.git/objects/1f/67fc4386b2d171e0d21be1c447e12660561f9b b/vendor/libgit2/tests/resources/testrepo.git/objects/1f/67fc4386b2d171e0d21be1c447e12660561f9b deleted file mode 100644 index 225c45734e..0000000000 Binary files a/vendor/libgit2/tests/resources/testrepo.git/objects/1f/67fc4386b2d171e0d21be1c447e12660561f9b and /dev/null differ diff --git a/vendor/libgit2/tests/resources/testrepo.git/objects/25/8f0e2a959a364e40ed6603d5d44fbb24765b10 b/vendor/libgit2/tests/resources/testrepo.git/objects/25/8f0e2a959a364e40ed6603d5d44fbb24765b10 deleted file mode 100644 index cb1ed5712c..0000000000 Binary files a/vendor/libgit2/tests/resources/testrepo.git/objects/25/8f0e2a959a364e40ed6603d5d44fbb24765b10 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/testrepo.git/objects/27/0b8ea76056d5cad83af921837702d3e3c2924d b/vendor/libgit2/tests/resources/testrepo.git/objects/27/0b8ea76056d5cad83af921837702d3e3c2924d deleted file mode 100644 index df40d99aff..0000000000 Binary files a/vendor/libgit2/tests/resources/testrepo.git/objects/27/0b8ea76056d5cad83af921837702d3e3c2924d and /dev/null differ diff --git a/vendor/libgit2/tests/resources/testrepo.git/objects/2d/59075e0681f540482d4f6223a68e0fef790bc7 b/vendor/libgit2/tests/resources/testrepo.git/objects/2d/59075e0681f540482d4f6223a68e0fef790bc7 deleted file mode 100644 index 0a1500a6ff..0000000000 Binary files a/vendor/libgit2/tests/resources/testrepo.git/objects/2d/59075e0681f540482d4f6223a68e0fef790bc7 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/testrepo.git/objects/32/59a6bd5b57fb9c1281bb7ed3167b50f224cb54 b/vendor/libgit2/tests/resources/testrepo.git/objects/32/59a6bd5b57fb9c1281bb7ed3167b50f224cb54 deleted file mode 100644 index 321eaa8679..0000000000 Binary files a/vendor/libgit2/tests/resources/testrepo.git/objects/32/59a6bd5b57fb9c1281bb7ed3167b50f224cb54 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/testrepo.git/objects/36/97d64be941a53d4ae8f6a271e4e3fa56b022cc b/vendor/libgit2/tests/resources/testrepo.git/objects/36/97d64be941a53d4ae8f6a271e4e3fa56b022cc deleted file mode 100644 index 9bb5b623bd..0000000000 Binary files a/vendor/libgit2/tests/resources/testrepo.git/objects/36/97d64be941a53d4ae8f6a271e4e3fa56b022cc and /dev/null differ diff --git a/vendor/libgit2/tests/resources/testrepo.git/objects/45/b983be36b73c0788dc9cbcb76cbb80fc7bb057 b/vendor/libgit2/tests/resources/testrepo.git/objects/45/b983be36b73c0788dc9cbcb76cbb80fc7bb057 deleted file mode 100644 index 7ca4ceed50..0000000000 Binary files a/vendor/libgit2/tests/resources/testrepo.git/objects/45/b983be36b73c0788dc9cbcb76cbb80fc7bb057 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/testrepo.git/objects/4a/202b346bb0fb0db7eff3cffeb3c70babbd2045 b/vendor/libgit2/tests/resources/testrepo.git/objects/4a/202b346bb0fb0db7eff3cffeb3c70babbd2045 deleted file mode 100644 index 8953b6cefc..0000000000 --- a/vendor/libgit2/tests/resources/testrepo.git/objects/4a/202b346bb0fb0db7eff3cffeb3c70babbd2045 +++ /dev/null @@ -1,2 +0,0 @@ -xťŽQ -Â0DýÎ)öĘ6›Í¦ "xO°‰‰-ŘFbĽżEoŕĎ0 ĽÇ¤ş,ske×[ÎPn8R,EpD?±gź}Ę^3˛ âŮ<µĺµGŽhYKÄčŇ8Đ–DAťÉ)żÉČ;gôݧÚŕšjďp™4ŐŽŻô-çű˘óăęr‚ÁŠ;°s°GA4Űş=ěůÖ(ôin7řIĚKÍFE \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/testrepo.git/objects/4a/23e2e65ad4e31c4c9db7dc746650bfad082679 b/vendor/libgit2/tests/resources/testrepo.git/objects/4a/23e2e65ad4e31c4c9db7dc746650bfad082679 deleted file mode 100644 index 18e3964b39..0000000000 Binary files a/vendor/libgit2/tests/resources/testrepo.git/objects/4a/23e2e65ad4e31c4c9db7dc746650bfad082679 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/testrepo.git/objects/4b/22b35d44b5a4f589edf3dc89196399771796ea b/vendor/libgit2/tests/resources/testrepo.git/objects/4b/22b35d44b5a4f589edf3dc89196399771796ea deleted file mode 100644 index b4e5aa1860..0000000000 Binary files a/vendor/libgit2/tests/resources/testrepo.git/objects/4b/22b35d44b5a4f589edf3dc89196399771796ea and /dev/null differ diff --git a/vendor/libgit2/tests/resources/testrepo.git/objects/52/1d87c1ec3aef9824daf6d96cc0ae3710766d91 b/vendor/libgit2/tests/resources/testrepo.git/objects/52/1d87c1ec3aef9824daf6d96cc0ae3710766d91 deleted file mode 100644 index 351cff8230..0000000000 Binary files a/vendor/libgit2/tests/resources/testrepo.git/objects/52/1d87c1ec3aef9824daf6d96cc0ae3710766d91 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/testrepo.git/objects/5b/5b025afb0b4c913b4c338a42934a3863bf3644 b/vendor/libgit2/tests/resources/testrepo.git/objects/5b/5b025afb0b4c913b4c338a42934a3863bf3644 deleted file mode 100644 index c1f22c54fb..0000000000 --- a/vendor/libgit2/tests/resources/testrepo.git/objects/5b/5b025afb0b4c913b4c338a42934a3863bf3644 +++ /dev/null @@ -1,2 +0,0 @@ -xťŽŰ 1EýNi@™Ék2 "X‚$ŮYW0Yc˙íŔżĂ…s¸ĄŐzďÚÚőMDĎ€0ćś8!¶†ÉĚŢs‰ XŠŞgÚdí::@X0»P˘wŮ"F/‰‰śÍRŕUz÷ĄmúZZďú˛¤ŇV}|•/śo5݇ŇęIŁ!¬1z Ć:vůÇUim}ę/˘> -öF- \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/testrepo.git/objects/75/057dd4114e74cca1d750d0aee1647c903cb60a b/vendor/libgit2/tests/resources/testrepo.git/objects/75/057dd4114e74cca1d750d0aee1647c903cb60a deleted file mode 100644 index 2ef4faa0f8..0000000000 Binary files a/vendor/libgit2/tests/resources/testrepo.git/objects/75/057dd4114e74cca1d750d0aee1647c903cb60a and /dev/null differ diff --git a/vendor/libgit2/tests/resources/testrepo.git/objects/76/3d71aadf09a7951596c9746c024e7eece7c7af b/vendor/libgit2/tests/resources/testrepo.git/objects/76/3d71aadf09a7951596c9746c024e7eece7c7af deleted file mode 100644 index 716b0c64bf..0000000000 --- a/vendor/libgit2/tests/resources/testrepo.git/objects/76/3d71aadf09a7951596c9746c024e7eece7c7af +++ /dev/null @@ -1 +0,0 @@ -xťŽAj!łö?0¨ŁßÂ09Ęo}ťHÚ6¨}˙ôjUPP©ŐZ&Y˙ř AÔ›±€pŚÁFdëĽ÷pzŤ[fŽYŚ˝PŇqLJ.,Z§`™Ĺ®Đ.ů`’vŮ łq $Ć5+9çOëtśű>Ű/úDE/龡WŻď*eż§Vźdf1>đ覭Öę˛×äÄ›ąúĘ™F« ­ěTŽŮhśk.i¶^0Ô?PĽR, \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/testrepo.git/objects/7b/4384978d2493e851f9cca7858815fac9b10980 b/vendor/libgit2/tests/resources/testrepo.git/objects/7b/4384978d2493e851f9cca7858815fac9b10980 deleted file mode 100644 index 23c462f341..0000000000 Binary files a/vendor/libgit2/tests/resources/testrepo.git/objects/7b/4384978d2493e851f9cca7858815fac9b10980 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/testrepo.git/objects/81/4889a078c031f61ed08ab5fa863aea9314344d b/vendor/libgit2/tests/resources/testrepo.git/objects/81/4889a078c031f61ed08ab5fa863aea9314344d deleted file mode 100644 index 2f9b6b6e3d..0000000000 Binary files a/vendor/libgit2/tests/resources/testrepo.git/objects/81/4889a078c031f61ed08ab5fa863aea9314344d and /dev/null differ diff --git a/vendor/libgit2/tests/resources/testrepo.git/objects/84/96071c1b46c854b31185ea97743be6a8774479 b/vendor/libgit2/tests/resources/testrepo.git/objects/84/96071c1b46c854b31185ea97743be6a8774479 deleted file mode 100644 index 5df58dda56..0000000000 Binary files a/vendor/libgit2/tests/resources/testrepo.git/objects/84/96071c1b46c854b31185ea97743be6a8774479 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/testrepo.git/objects/84/9a5e34a26815e821f865b8479f5815a47af0fe b/vendor/libgit2/tests/resources/testrepo.git/objects/84/9a5e34a26815e821f865b8479f5815a47af0fe deleted file mode 100644 index 71019a636b..0000000000 --- a/vendor/libgit2/tests/resources/testrepo.git/objects/84/9a5e34a26815e821f865b8479f5815a47af0fe +++ /dev/null @@ -1,2 +0,0 @@ -xŚM F]sŠą€†ź41ĆxÝ(­I‹ÁéÂŰKÝ˝/_ŢăP@ˇÚŐř˘!8›)es -” ĄN&FGSĆ„ąhŃ{+ßCťç‰÷ĆZzvŘFˇ7ZŕÎ-¬Îńó‡k™x\ăˇ[PĆ8ď´ôGŘK/ĄŹ^© lŤĘ>.4 \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/testrepo.git/objects/94/4c0f6e4dfa41595e6eb3ceecdb14f50fe18162 b/vendor/libgit2/tests/resources/testrepo.git/objects/94/4c0f6e4dfa41595e6eb3ceecdb14f50fe18162 deleted file mode 100644 index 4cc3f4dffc..0000000000 --- a/vendor/libgit2/tests/resources/testrepo.git/objects/94/4c0f6e4dfa41595e6eb3ceecdb14f50fe18162 +++ /dev/null @@ -1 +0,0 @@ -x+)JMU044b040031QrutńueXˇl¨đmmA‹m›ĚŁíJ}Gß;U‘T”—śź–™“ŞWRQÂ`6ýš÷KÇĄ¶^/ľ-*|ňřWŘĄ3PĄy©ĺ`%ËEŰޱ\&gŽĐ|ź0§˙†{ÓŤ1X \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/testrepo.git/objects/9a/03079b8a8ee85a0bee58bf9be3da8b62414ed4 b/vendor/libgit2/tests/resources/testrepo.git/objects/9a/03079b8a8ee85a0bee58bf9be3da8b62414ed4 deleted file mode 100644 index bf7b2bb686..0000000000 Binary files a/vendor/libgit2/tests/resources/testrepo.git/objects/9a/03079b8a8ee85a0bee58bf9be3da8b62414ed4 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/testrepo.git/objects/9f/13f7d0a9402c681f91dc590cf7b5470e6a77d2 b/vendor/libgit2/tests/resources/testrepo.git/objects/9f/13f7d0a9402c681f91dc590cf7b5470e6a77d2 deleted file mode 100644 index 7f1cfb23c7..0000000000 --- a/vendor/libgit2/tests/resources/testrepo.git/objects/9f/13f7d0a9402c681f91dc590cf7b5470e6a77d2 +++ /dev/null @@ -1,2 +0,0 @@ -xťŽM -Â0F]çłd2ť¤ń®;ÔÂÁ…¬ŁłX†ÂEČŽ5R±Ł ŰAŃE &n}ZÜć™Aą \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/testrepo.git/objects/9f/d738e8f7967c078dceed8190330fc8648ee56a b/vendor/libgit2/tests/resources/testrepo.git/objects/9f/d738e8f7967c078dceed8190330fc8648ee56a deleted file mode 100644 index a79612435a..0000000000 --- a/vendor/libgit2/tests/resources/testrepo.git/objects/9f/d738e8f7967c078dceed8190330fc8648ee56a +++ /dev/null @@ -1,3 +0,0 @@ -xťŽ[ -Â0EýÎ*fĘäŐ¤ "¸W0“‡-ŘFât˙Ý—çpS[–YŔx^ -Díb CLhutɉ}Ą8X*4Zí¬sY˝¨—UŔ‘AĂÖ ĚX3‡R«Mµ¶) s6輢M¦ÖážšÜ&Jm…ó;}Çő±Đü<Ą¶\@›ŕ‚ŃŢŹpÄ€¨vş?”ňŹ«jŰşLđ«¨Ř?Hĺ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/testrepo.git/objects/a4/a7dce85cf63874e984719f4fdd239f5145052f b/vendor/libgit2/tests/resources/testrepo.git/objects/a4/a7dce85cf63874e984719f4fdd239f5145052f deleted file mode 100644 index f8588696bc..0000000000 --- a/vendor/libgit2/tests/resources/testrepo.git/objects/a4/a7dce85cf63874e984719f4fdd239f5145052f +++ /dev/null @@ -1,2 +0,0 @@ -xťŹ;j1DëťmdÓú·ŔÇŽ|M«µ3`ŤŚV{ >€łâQŻ ¸·vL0I?Í!š4–Z=Ę! ×¦8˛F˘Ă’!rÖsQßyČ9]$DŽ&„l6AÇ>jFWüҵ IKNiűë§Z˘%ˇSŚ‘ -‹Ň ­ĹʉřU~Ě˝řä>'Ľď™ű Żwţ ×[ËÇ× ÷öÚDGÚˇ±đŚQ-şMůŹ«>dܶ‘OŢáŇň}í\ŕ8g_ШÂoYr \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/testrepo.git/objects/a6/5fedf39aefe402d3bb6e24df4d4f5fe4547750 b/vendor/libgit2/tests/resources/testrepo.git/objects/a6/5fedf39aefe402d3bb6e24df4d4f5fe4547750 deleted file mode 100644 index 29c8e824d2..0000000000 --- a/vendor/libgit2/tests/resources/testrepo.git/objects/a6/5fedf39aefe402d3bb6e24df4d4f5fe4547750 +++ /dev/null @@ -1,3 +0,0 @@ -xťŽQ -!@űösBťQ"‚ŽĐ Ćٱ rŤÍîßŇú{ -öF- \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/testrepo/.gitted/objects/62/eb56dabb4b9929bc15dd9263c2c733b13d2dcc b/vendor/libgit2/tests/resources/testrepo/.gitted/objects/62/eb56dabb4b9929bc15dd9263c2c733b13d2dcc deleted file mode 100644 index b669961d8f..0000000000 Binary files a/vendor/libgit2/tests/resources/testrepo/.gitted/objects/62/eb56dabb4b9929bc15dd9263c2c733b13d2dcc and /dev/null differ diff --git a/vendor/libgit2/tests/resources/testrepo/.gitted/objects/66/3adb09143767984f7be83a91effa47e128c735 b/vendor/libgit2/tests/resources/testrepo/.gitted/objects/66/3adb09143767984f7be83a91effa47e128c735 deleted file mode 100644 index 9ff5eb2b5d..0000000000 Binary files a/vendor/libgit2/tests/resources/testrepo/.gitted/objects/66/3adb09143767984f7be83a91effa47e128c735 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/testrepo/.gitted/objects/6b/377958d8c6a4906e8573b53672a1a23a4e8ce6 b/vendor/libgit2/tests/resources/testrepo/.gitted/objects/6b/377958d8c6a4906e8573b53672a1a23a4e8ce6 deleted file mode 100644 index ee7c781740..0000000000 Binary files a/vendor/libgit2/tests/resources/testrepo/.gitted/objects/6b/377958d8c6a4906e8573b53672a1a23a4e8ce6 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/testrepo/.gitted/objects/6b/9b767af9992b4abad5e24ffb1ba2d688ca602e b/vendor/libgit2/tests/resources/testrepo/.gitted/objects/6b/9b767af9992b4abad5e24ffb1ba2d688ca602e deleted file mode 100644 index 197685b864..0000000000 Binary files a/vendor/libgit2/tests/resources/testrepo/.gitted/objects/6b/9b767af9992b4abad5e24ffb1ba2d688ca602e and /dev/null differ diff --git a/vendor/libgit2/tests/resources/testrepo/.gitted/objects/6f/d5c7dd2ab27b48c493023f794be09861e9045f b/vendor/libgit2/tests/resources/testrepo/.gitted/objects/6f/d5c7dd2ab27b48c493023f794be09861e9045f deleted file mode 100644 index 7f0c6fe4e5..0000000000 --- a/vendor/libgit2/tests/resources/testrepo/.gitted/objects/6f/d5c7dd2ab27b48c493023f794be09861e9045f +++ /dev/null @@ -1 +0,0 @@ -xĄŹAŞ!Dłö}G㌠á“Mr‚\ m[FăÇ1äú1gȢ (¨G×Rr3ëCo"ŔvŽ^hq‘<7éÄAóY{žâ"Î&$ÄDýS“gŤ([B!´ÎˇwĆłY’źg±Łl$%EŻľÖ·ř¦á±Ö˛×'\d¤_w-™[Ýkę'®ĺ¦ł1hüµÓZŤt íňBÝó&;ô•:Ľó¶AČńű"ĺm%ŞţV \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/testrepo/.gitted/objects/75/057dd4114e74cca1d750d0aee1647c903cb60a b/vendor/libgit2/tests/resources/testrepo/.gitted/objects/75/057dd4114e74cca1d750d0aee1647c903cb60a deleted file mode 100644 index 2ef4faa0f8..0000000000 Binary files a/vendor/libgit2/tests/resources/testrepo/.gitted/objects/75/057dd4114e74cca1d750d0aee1647c903cb60a and /dev/null differ diff --git a/vendor/libgit2/tests/resources/testrepo/.gitted/objects/76/3d71aadf09a7951596c9746c024e7eece7c7af b/vendor/libgit2/tests/resources/testrepo/.gitted/objects/76/3d71aadf09a7951596c9746c024e7eece7c7af deleted file mode 100644 index 716b0c64bf..0000000000 --- a/vendor/libgit2/tests/resources/testrepo/.gitted/objects/76/3d71aadf09a7951596c9746c024e7eece7c7af +++ /dev/null @@ -1 +0,0 @@ -xťŽAj!łö?0¨ŁßÂ09Ęo}ťHÚ6¨}˙ôjUPP©ŐZ&Y˙ř AÔ›±€pŚÁFdëĽ÷pzŤ[fŽYŚ˝PŇqLJ.,Z§`™Ĺ®Đ.ů`’vŮ łq $Ć5+9çOëtśű>Ű/úDE/龡WŻď*eż§Vźdf1>đ覭Öę˛×äÄ›ąúĘ™F« ­ěTŽŮhśk.i¶^0Ô?PĽR, \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/testrepo/.gitted/objects/7b/2417a23b63e1fdde88c80e14b33247c6e5785a b/vendor/libgit2/tests/resources/testrepo/.gitted/objects/7b/2417a23b63e1fdde88c80e14b33247c6e5785a deleted file mode 100644 index db778aaaed..0000000000 Binary files a/vendor/libgit2/tests/resources/testrepo/.gitted/objects/7b/2417a23b63e1fdde88c80e14b33247c6e5785a and /dev/null differ diff --git a/vendor/libgit2/tests/resources/testrepo/.gitted/objects/7b/4384978d2493e851f9cca7858815fac9b10980 b/vendor/libgit2/tests/resources/testrepo/.gitted/objects/7b/4384978d2493e851f9cca7858815fac9b10980 deleted file mode 100644 index 23c462f341..0000000000 Binary files a/vendor/libgit2/tests/resources/testrepo/.gitted/objects/7b/4384978d2493e851f9cca7858815fac9b10980 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/testrepo/.gitted/objects/81/4889a078c031f61ed08ab5fa863aea9314344d b/vendor/libgit2/tests/resources/testrepo/.gitted/objects/81/4889a078c031f61ed08ab5fa863aea9314344d deleted file mode 100644 index 2f9b6b6e3d..0000000000 Binary files a/vendor/libgit2/tests/resources/testrepo/.gitted/objects/81/4889a078c031f61ed08ab5fa863aea9314344d and /dev/null differ diff --git a/vendor/libgit2/tests/resources/testrepo/.gitted/objects/84/96071c1b46c854b31185ea97743be6a8774479 b/vendor/libgit2/tests/resources/testrepo/.gitted/objects/84/96071c1b46c854b31185ea97743be6a8774479 deleted file mode 100644 index 5df58dda56..0000000000 Binary files a/vendor/libgit2/tests/resources/testrepo/.gitted/objects/84/96071c1b46c854b31185ea97743be6a8774479 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/testrepo/.gitted/objects/87/380ae84009e9c503506c2f6143a4fc6c60bf80 b/vendor/libgit2/tests/resources/testrepo/.gitted/objects/87/380ae84009e9c503506c2f6143a4fc6c60bf80 deleted file mode 100644 index 3042f57909..0000000000 Binary files a/vendor/libgit2/tests/resources/testrepo/.gitted/objects/87/380ae84009e9c503506c2f6143a4fc6c60bf80 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/testrepo/.gitted/objects/94/4c0f6e4dfa41595e6eb3ceecdb14f50fe18162 b/vendor/libgit2/tests/resources/testrepo/.gitted/objects/94/4c0f6e4dfa41595e6eb3ceecdb14f50fe18162 deleted file mode 100644 index 4cc3f4dffc..0000000000 --- a/vendor/libgit2/tests/resources/testrepo/.gitted/objects/94/4c0f6e4dfa41595e6eb3ceecdb14f50fe18162 +++ /dev/null @@ -1 +0,0 @@ -x+)JMU044b040031QrutńueXˇl¨đmmA‹m›ĚŁíJ}Gß;U‘T”—śź–™“ŞWRQÂ`6ýš÷KÇĄ¶^/ľ-*|ňřWŘĄ3PĄy©ĺ`%ËEŰޱ\&gŽĐ|ź0§˙†{ÓŤ1X \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/testrepo/.gitted/objects/9a/03079b8a8ee85a0bee58bf9be3da8b62414ed4 b/vendor/libgit2/tests/resources/testrepo/.gitted/objects/9a/03079b8a8ee85a0bee58bf9be3da8b62414ed4 deleted file mode 100644 index bf7b2bb686..0000000000 Binary files a/vendor/libgit2/tests/resources/testrepo/.gitted/objects/9a/03079b8a8ee85a0bee58bf9be3da8b62414ed4 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/testrepo/.gitted/objects/9f/d738e8f7967c078dceed8190330fc8648ee56a b/vendor/libgit2/tests/resources/testrepo/.gitted/objects/9f/d738e8f7967c078dceed8190330fc8648ee56a deleted file mode 100644 index a79612435a..0000000000 --- a/vendor/libgit2/tests/resources/testrepo/.gitted/objects/9f/d738e8f7967c078dceed8190330fc8648ee56a +++ /dev/null @@ -1,3 +0,0 @@ -xťŽ[ -Â0EýÎ*fĘäŐ¤ "¸W0“‡-ŘFât˙Ý—çpS[–YŔx^ -Díb CLhutɉ}Ą8X*4Zí¬sY˝¨—UŔ‘AĂÖ ĚX3‡R«Mµ¶) s6輢M¦ÖážšÜ&Jm…ó;}Çő±Đü<Ą¶\@›ŕ‚ŃŢŹpÄ€¨vş?”ňŹ«jŰşLđ«¨Ř?Hĺ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/testrepo/.gitted/objects/a4/a7dce85cf63874e984719f4fdd239f5145052f b/vendor/libgit2/tests/resources/testrepo/.gitted/objects/a4/a7dce85cf63874e984719f4fdd239f5145052f deleted file mode 100644 index f8588696bc..0000000000 --- a/vendor/libgit2/tests/resources/testrepo/.gitted/objects/a4/a7dce85cf63874e984719f4fdd239f5145052f +++ /dev/null @@ -1,2 +0,0 @@ -xťŹ;j1DëťmdÓú·ŔÇŽ|M«µ3`ŤŚV{ >€łâQŻ ¸·vL0I?Í!š4–Z=Ę! ×¦8˛F˘Ă’!rÖsQßyČ9]$DŽ&„l6AÇ>jFWüҵ IKNiűë§Z˘%ˇSŚ‘ -‹Ň ­ĹʉřU~Ě˝řä>'Ľď™ű Żwţ ×[ËÇ× ÷öÚDGÚˇ±đŚQ-şMůŹ«>dܶ‘OŢáŇň}í\ŕ8g_ШÂoYr \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/testrepo/.gitted/objects/a6/5fedf39aefe402d3bb6e24df4d4f5fe4547750 b/vendor/libgit2/tests/resources/testrepo/.gitted/objects/a6/5fedf39aefe402d3bb6e24df4d4f5fe4547750 deleted file mode 100644 index 29c8e824d2..0000000000 --- a/vendor/libgit2/tests/resources/testrepo/.gitted/objects/a6/5fedf39aefe402d3bb6e24df4d4f5fe4547750 +++ /dev/null @@ -1,3 +0,0 @@ -xťŽQ -!@űösBťQ"‚ŽĐ Ćٱ rŤÍîßŇú{ 1368278260 -0700 clone: from /Users/rb/src/libgit2/tests-clar/resources/../../../rugged/test/fixtures/testrepo.git diff --git a/vendor/libgit2/tests/resources/testrepo2/.gitted/logs/refs/heads/master b/vendor/libgit2/tests/resources/testrepo2/.gitted/logs/refs/heads/master deleted file mode 100644 index 4e80c69faf..0000000000 --- a/vendor/libgit2/tests/resources/testrepo2/.gitted/logs/refs/heads/master +++ /dev/null @@ -1 +0,0 @@ -0000000000000000000000000000000000000000 36060c58702ed4c2a40832c51758d5344201d89a Russell Belfer 1368278260 -0700 clone: from /Users/rb/src/libgit2/tests-clar/resources/../../../rugged/test/fixtures/testrepo.git diff --git a/vendor/libgit2/tests/resources/testrepo2/.gitted/logs/refs/remotes/origin/HEAD b/vendor/libgit2/tests/resources/testrepo2/.gitted/logs/refs/remotes/origin/HEAD deleted file mode 100644 index 4e80c69faf..0000000000 --- a/vendor/libgit2/tests/resources/testrepo2/.gitted/logs/refs/remotes/origin/HEAD +++ /dev/null @@ -1 +0,0 @@ -0000000000000000000000000000000000000000 36060c58702ed4c2a40832c51758d5344201d89a Russell Belfer 1368278260 -0700 clone: from /Users/rb/src/libgit2/tests-clar/resources/../../../rugged/test/fixtures/testrepo.git diff --git a/vendor/libgit2/tests/resources/testrepo2/.gitted/objects/0c/37a5391bbff43c37f0d0371823a5509eed5b1d b/vendor/libgit2/tests/resources/testrepo2/.gitted/objects/0c/37a5391bbff43c37f0d0371823a5509eed5b1d deleted file mode 100644 index bfe146a5a8..0000000000 Binary files a/vendor/libgit2/tests/resources/testrepo2/.gitted/objects/0c/37a5391bbff43c37f0d0371823a5509eed5b1d and /dev/null differ diff --git a/vendor/libgit2/tests/resources/testrepo2/.gitted/objects/13/85f264afb75a56a5bec74243be9b367ba4ca08 b/vendor/libgit2/tests/resources/testrepo2/.gitted/objects/13/85f264afb75a56a5bec74243be9b367ba4ca08 deleted file mode 100644 index cedb2a22e6..0000000000 Binary files a/vendor/libgit2/tests/resources/testrepo2/.gitted/objects/13/85f264afb75a56a5bec74243be9b367ba4ca08 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/testrepo2/.gitted/objects/18/1037049a54a1eb5fab404658a3a250b44335d7 b/vendor/libgit2/tests/resources/testrepo2/.gitted/objects/18/1037049a54a1eb5fab404658a3a250b44335d7 deleted file mode 100644 index 93a16f1463..0000000000 Binary files a/vendor/libgit2/tests/resources/testrepo2/.gitted/objects/18/1037049a54a1eb5fab404658a3a250b44335d7 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/testrepo2/.gitted/objects/18/10dff58d8a660512d4832e740f692884338ccd b/vendor/libgit2/tests/resources/testrepo2/.gitted/objects/18/10dff58d8a660512d4832e740f692884338ccd deleted file mode 100644 index ba0bfb30cd..0000000000 Binary files a/vendor/libgit2/tests/resources/testrepo2/.gitted/objects/18/10dff58d8a660512d4832e740f692884338ccd and /dev/null differ diff --git a/vendor/libgit2/tests/resources/testrepo2/.gitted/objects/2d/2eff63372b08adf0a9eb84109ccf7d19e2f3a2 b/vendor/libgit2/tests/resources/testrepo2/.gitted/objects/2d/2eff63372b08adf0a9eb84109ccf7d19e2f3a2 deleted file mode 100644 index 3cd240db52..0000000000 Binary files a/vendor/libgit2/tests/resources/testrepo2/.gitted/objects/2d/2eff63372b08adf0a9eb84109ccf7d19e2f3a2 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/testrepo2/.gitted/objects/36/060c58702ed4c2a40832c51758d5344201d89a b/vendor/libgit2/tests/resources/testrepo2/.gitted/objects/36/060c58702ed4c2a40832c51758d5344201d89a deleted file mode 100644 index 0c62460610..0000000000 --- a/vendor/libgit2/tests/resources/testrepo2/.gitted/objects/36/060c58702ed4c2a40832c51758d5344201d89a +++ /dev/null @@ -1,2 +0,0 @@ -xťŽQ -Â0ýÎ)re“Ý´ Á$Ű­-FŇíý-ÁźÇ00𸖲¨őľ?i±L#»‚ĐHSŽŚS×#qĎ2˛DČ據¬jC|HS†L‹8$ň)áĐaž°#2i׹6űäŞjsâşÚëĆ?¸żJZŢ®ĺfťçtΞÁĂUţiͶçqiÂZŰ"›ů_/H6 \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/testrepo2/.gitted/objects/45/b983be36b73c0788dc9cbcb76cbb80fc7bb057 b/vendor/libgit2/tests/resources/testrepo2/.gitted/objects/45/b983be36b73c0788dc9cbcb76cbb80fc7bb057 deleted file mode 100644 index 7ca4ceed50..0000000000 Binary files a/vendor/libgit2/tests/resources/testrepo2/.gitted/objects/45/b983be36b73c0788dc9cbcb76cbb80fc7bb057 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/testrepo2/.gitted/objects/4a/202b346bb0fb0db7eff3cffeb3c70babbd2045 b/vendor/libgit2/tests/resources/testrepo2/.gitted/objects/4a/202b346bb0fb0db7eff3cffeb3c70babbd2045 deleted file mode 100644 index 8953b6cefc..0000000000 --- a/vendor/libgit2/tests/resources/testrepo2/.gitted/objects/4a/202b346bb0fb0db7eff3cffeb3c70babbd2045 +++ /dev/null @@ -1,2 +0,0 @@ -xťŽQ -Â0DýÎ)öĘ6›Í¦ "xO°‰‰-ŘFbĽżEoŕĎ0 ĽÇ¤ş,ske×[ÎPn8R,EpD?±gź}Ę^3˛ âŮ<µĺµGŽhYKÄčŇ8Đ–DAťÉ)żÉČ;gôݧÚŕšjďp™4ŐŽŻô-çű˘óăęr‚ÁŠ;°s°GA4Űş=ěůÖ(ôin7řIĚKÍFE \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/testrepo2/.gitted/objects/5b/5b025afb0b4c913b4c338a42934a3863bf3644 b/vendor/libgit2/tests/resources/testrepo2/.gitted/objects/5b/5b025afb0b4c913b4c338a42934a3863bf3644 deleted file mode 100644 index c1f22c54fb..0000000000 --- a/vendor/libgit2/tests/resources/testrepo2/.gitted/objects/5b/5b025afb0b4c913b4c338a42934a3863bf3644 +++ /dev/null @@ -1,2 +0,0 @@ -xťŽŰ 1EýNi@™Ék2 "X‚$ŮYW0Yc˙íŔżĂ…s¸ĄŐzďÚÚőMDĎ€0ćś8!¶†ÉĚŢs‰ XŠŞgÚdí::@X0»P˘wŮ"F/‰‰śÍRŕUz÷ĄmúZZďú˛¤ŇV}|•/śo5݇ŇęIŁ!¬1z Ć:vůÇUim}ę/˘> -öF- \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/testrepo2/.gitted/objects/61/9f9935957e010c419cb9d15621916ddfcc0b96 b/vendor/libgit2/tests/resources/testrepo2/.gitted/objects/61/9f9935957e010c419cb9d15621916ddfcc0b96 deleted file mode 100644 index 1fd79b4779..0000000000 Binary files a/vendor/libgit2/tests/resources/testrepo2/.gitted/objects/61/9f9935957e010c419cb9d15621916ddfcc0b96 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/testrepo2/.gitted/objects/75/057dd4114e74cca1d750d0aee1647c903cb60a b/vendor/libgit2/tests/resources/testrepo2/.gitted/objects/75/057dd4114e74cca1d750d0aee1647c903cb60a deleted file mode 100644 index 2ef4faa0f8..0000000000 Binary files a/vendor/libgit2/tests/resources/testrepo2/.gitted/objects/75/057dd4114e74cca1d750d0aee1647c903cb60a and /dev/null differ diff --git a/vendor/libgit2/tests/resources/testrepo2/.gitted/objects/7f/043268ea43ce18e3540acaabf9e090c91965b0 b/vendor/libgit2/tests/resources/testrepo2/.gitted/objects/7f/043268ea43ce18e3540acaabf9e090c91965b0 deleted file mode 100644 index 3d1016daae..0000000000 Binary files a/vendor/libgit2/tests/resources/testrepo2/.gitted/objects/7f/043268ea43ce18e3540acaabf9e090c91965b0 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/testrepo2/.gitted/objects/81/4889a078c031f61ed08ab5fa863aea9314344d b/vendor/libgit2/tests/resources/testrepo2/.gitted/objects/81/4889a078c031f61ed08ab5fa863aea9314344d deleted file mode 100644 index 2f9b6b6e3d..0000000000 Binary files a/vendor/libgit2/tests/resources/testrepo2/.gitted/objects/81/4889a078c031f61ed08ab5fa863aea9314344d and /dev/null differ diff --git a/vendor/libgit2/tests/resources/testrepo2/.gitted/objects/84/96071c1b46c854b31185ea97743be6a8774479 b/vendor/libgit2/tests/resources/testrepo2/.gitted/objects/84/96071c1b46c854b31185ea97743be6a8774479 deleted file mode 100644 index 5df58dda56..0000000000 Binary files a/vendor/libgit2/tests/resources/testrepo2/.gitted/objects/84/96071c1b46c854b31185ea97743be6a8774479 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/testrepo2/.gitted/objects/9f/d738e8f7967c078dceed8190330fc8648ee56a b/vendor/libgit2/tests/resources/testrepo2/.gitted/objects/9f/d738e8f7967c078dceed8190330fc8648ee56a deleted file mode 100644 index a79612435a..0000000000 --- a/vendor/libgit2/tests/resources/testrepo2/.gitted/objects/9f/d738e8f7967c078dceed8190330fc8648ee56a +++ /dev/null @@ -1,3 +0,0 @@ -xťŽ[ -Â0EýÎ*fĘäŐ¤ "¸W0“‡-ŘFât˙Ý—çpS[–YŔx^ -Díb CLhutɉ}Ą8X*4Zí¬sY˝¨—UŔ‘AĂÖ ĚX3‡R«Mµ¶) s6輢M¦ÖážšÜ&Jm…ó;}Çő±Đü<Ą¶\@›ŕ‚ŃŢŹpÄ€¨vş?”ňŹ«jŰşLđ«¨Ř?Hĺ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/testrepo2/.gitted/objects/a4/a7dce85cf63874e984719f4fdd239f5145052f b/vendor/libgit2/tests/resources/testrepo2/.gitted/objects/a4/a7dce85cf63874e984719f4fdd239f5145052f deleted file mode 100644 index f8588696bc..0000000000 --- a/vendor/libgit2/tests/resources/testrepo2/.gitted/objects/a4/a7dce85cf63874e984719f4fdd239f5145052f +++ /dev/null @@ -1,2 +0,0 @@ -xťŹ;j1DëťmdÓú·ŔÇŽ|M«µ3`ŤŚV{ >€łâQŻ ¸·vL0I?Í!š4–Z=Ę! ×¦8˛F˘Ă’!rÖsQßyČ9]$DŽ&„l6AÇ>jFWüҵ IKNiűë§Z˘%ˇSŚ‘ -‹Ň ­ĹʉřU~Ě˝řä>'Ľď™ű Żwţ ×[ËÇ× ÷öÚDGÚˇ±đŚQ-şMůŹ«>dܶ‘OŢáŇň}í\ŕ8g_ШÂoYr \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/testrepo2/.gitted/objects/a7/1586c1dfe8a71c6cbf6c129f404c5642ff31bd b/vendor/libgit2/tests/resources/testrepo2/.gitted/objects/a7/1586c1dfe8a71c6cbf6c129f404c5642ff31bd deleted file mode 100644 index d0d7e736e5..0000000000 Binary files a/vendor/libgit2/tests/resources/testrepo2/.gitted/objects/a7/1586c1dfe8a71c6cbf6c129f404c5642ff31bd and /dev/null differ diff --git a/vendor/libgit2/tests/resources/testrepo2/.gitted/objects/a8/233120f6ad708f843d861ce2b7228ec4e3dec6 b/vendor/libgit2/tests/resources/testrepo2/.gitted/objects/a8/233120f6ad708f843d861ce2b7228ec4e3dec6 deleted file mode 100644 index 18a7f61c29..0000000000 Binary files a/vendor/libgit2/tests/resources/testrepo2/.gitted/objects/a8/233120f6ad708f843d861ce2b7228ec4e3dec6 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/testrepo2/.gitted/objects/be/3563ae3f795b2b4353bcce3a527ad0a4f7f644 b/vendor/libgit2/tests/resources/testrepo2/.gitted/objects/be/3563ae3f795b2b4353bcce3a527ad0a4f7f644 deleted file mode 100644 index 0817229bc1..0000000000 --- a/vendor/libgit2/tests/resources/testrepo2/.gitted/objects/be/3563ae3f795b2b4353bcce3a527ad0a4f7f644 +++ /dev/null @@ -1,3 +0,0 @@ -xťŹKj1DłÖ)zçUBëŰ-0ÁuV9¦Őň<#ŁČ÷ĎȲ+ŠWľTKy4`6‡¶ć š,yŹ’9j§GJě8ŤÁÇŢb˘‘\Śfő–5/ Ç^‰8vą'ö‚ŮËśě`SĆťť%[›ë -÷T[[×úŠ,púüĚsşLŹ6o±Kµś´5Ř;ŽčŐn÷›-˙= ˛ú˙DĂ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/twowaymerge.git/objects/1f/4c0311a24b63f6fc209a59a1e404942d4a5006 b/vendor/libgit2/tests/resources/twowaymerge.git/objects/1f/4c0311a24b63f6fc209a59a1e404942d4a5006 deleted file mode 100644 index 99288fdd79..0000000000 --- a/vendor/libgit2/tests/resources/twowaymerge.git/objects/1f/4c0311a24b63f6fc209a59a1e404942d4a5006 +++ /dev/null @@ -1,2 +0,0 @@ -xťÍ=Â0 @aćśÂ ˛Mę6BlH¬ś żm!RqďOąë7Ľ[­‹ rĐ5g°N’X‹Ĺ±)Eg]ĎDY2c R8xă7ťŰ -ŹŘTáŢÁ­˝Rőo8~ňś®Ó˘óşŘęčÔ[”™ŕ#˘Ůußjţ;`ĽůÔŮ7ó \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/twowaymerge.git/objects/22/24e191514cb4bd8c566d80dac22dfcb1e9bb83 b/vendor/libgit2/tests/resources/twowaymerge.git/objects/22/24e191514cb4bd8c566d80dac22dfcb1e9bb83 deleted file mode 100644 index 48466ea51f..0000000000 --- a/vendor/libgit2/tests/resources/twowaymerge.git/objects/22/24e191514cb4bd8c566d80dac22dfcb1e9bb83 +++ /dev/null @@ -1,3 +0,0 @@ -xťŽK -Â0@]çsK&ť¤ ¸Üz‚™4éŰHMďo˝‚Ű÷ŕńbY–©‚1tŞ[JŕbŽlɵâĄí4vɡ±Lâł ě'—Ő›·´V`B¦ű . -ëÎIöm ď1őZ¨Ç xŻcŮŕK­đhŕ^^ýÂ+\>?2·aŞă.M,˰µtTB‹pÖ^kuĐcł¦żjV_«sFh \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/twowaymerge.git/objects/29/6e56023cdc034d2735fee8c0d85a659d1b07f4 b/vendor/libgit2/tests/resources/twowaymerge.git/objects/29/6e56023cdc034d2735fee8c0d85a659d1b07f4 deleted file mode 100644 index aa3fccdf0c..0000000000 Binary files a/vendor/libgit2/tests/resources/twowaymerge.git/objects/29/6e56023cdc034d2735fee8c0d85a659d1b07f4 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/twowaymerge.git/objects/31/51880ae2b363f1c262cf98b750c1f169a0d432 b/vendor/libgit2/tests/resources/twowaymerge.git/objects/31/51880ae2b363f1c262cf98b750c1f169a0d432 deleted file mode 100644 index 235d42bff5..0000000000 Binary files a/vendor/libgit2/tests/resources/twowaymerge.git/objects/31/51880ae2b363f1c262cf98b750c1f169a0d432 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/twowaymerge.git/objects/3b/287f8730c81d0b763c2d294618a5e32b67b4f8 b/vendor/libgit2/tests/resources/twowaymerge.git/objects/3b/287f8730c81d0b763c2d294618a5e32b67b4f8 deleted file mode 100644 index 56ddac5ee6..0000000000 Binary files a/vendor/libgit2/tests/resources/twowaymerge.git/objects/3b/287f8730c81d0b763c2d294618a5e32b67b4f8 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/twowaymerge.git/objects/42/b7311aa626e712891940c1ec5d5cba201946a4 b/vendor/libgit2/tests/resources/twowaymerge.git/objects/42/b7311aa626e712891940c1ec5d5cba201946a4 deleted file mode 100644 index a8e6581f8a..0000000000 --- a/vendor/libgit2/tests/resources/twowaymerge.git/objects/42/b7311aa626e712891940c1ec5d5cba201946a4 +++ /dev/null @@ -1,3 +0,0 @@ -xťÎ˝ Â0@ajOq ťcßů"!D‡DËţKÂ1 -Îţ„h_ńéĹZĘŁAßŰC[s†aĚČžp´Ił±‰#‹„lBť…śqČęí׼4đŹZ"ŤˇÇ(śyGF˘˘řd#y«ťň[›ë -÷X[[×úJĹ/púüĘsşLŹ6oˇ‹µśA˛čX„Ⴈöşo¶ü7 ’úÔ¸Ec \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/twowaymerge.git/objects/49/6d6428b9cf92981dc9495211e6e1120fb6f2ba b/vendor/libgit2/tests/resources/twowaymerge.git/objects/49/6d6428b9cf92981dc9495211e6e1120fb6f2ba deleted file mode 100644 index 978bc3448a..0000000000 Binary files a/vendor/libgit2/tests/resources/twowaymerge.git/objects/49/6d6428b9cf92981dc9495211e6e1120fb6f2ba and /dev/null differ diff --git a/vendor/libgit2/tests/resources/twowaymerge.git/objects/59/b0cf7d74659e1cdb13305319d6d4ce2733c118 b/vendor/libgit2/tests/resources/twowaymerge.git/objects/59/b0cf7d74659e1cdb13305319d6d4ce2733c118 deleted file mode 100644 index 30b507c068..0000000000 Binary files a/vendor/libgit2/tests/resources/twowaymerge.git/objects/59/b0cf7d74659e1cdb13305319d6d4ce2733c118 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/twowaymerge.git/objects/6a/b5d28acbf3c3bdff276f7ccfdf29c1520e542f b/vendor/libgit2/tests/resources/twowaymerge.git/objects/6a/b5d28acbf3c3bdff276f7ccfdf29c1520e542f deleted file mode 100644 index ff6a386ac8..0000000000 --- a/vendor/libgit2/tests/resources/twowaymerge.git/objects/6a/b5d28acbf3c3bdff276f7ccfdf29c1520e542f +++ /dev/null @@ -1 +0,0 @@ -xťÎM‚0@a×=Ĺ\@2ýcÜ™¸őeÚ†Rĺţâܾŗǵ”ąRćÔ¶”@˘Šś(i$™uOÉ 1ö9Ro"“ ¬9¸ŕĽx‡-­ ü@¬µcc3;ę-KvHĘ+‡9ŮčÁFeĽ{›ęO®­ÁŁ{]b +\>żňoăܦ}踖+Hm zŹšŕŚ„(Žzl¶ô7 ń•śF- \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/twowaymerge.git/objects/6c/fca542b55b8b37017e6125a4b8f59a6eae6f11 b/vendor/libgit2/tests/resources/twowaymerge.git/objects/6c/fca542b55b8b37017e6125a4b8f59a6eae6f11 deleted file mode 100644 index 9a969a279b..0000000000 Binary files a/vendor/libgit2/tests/resources/twowaymerge.git/objects/6c/fca542b55b8b37017e6125a4b8f59a6eae6f11 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/twowaymerge.git/objects/76/5b32c65d38f04c4f287abda055818ec0f26912 b/vendor/libgit2/tests/resources/twowaymerge.git/objects/76/5b32c65d38f04c4f287abda055818ec0f26912 deleted file mode 100644 index 493bbc076b..0000000000 Binary files a/vendor/libgit2/tests/resources/twowaymerge.git/objects/76/5b32c65d38f04c4f287abda055818ec0f26912 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/twowaymerge.git/objects/7b/8c336c45fc6895c1c60827260fe5d798e5d247 b/vendor/libgit2/tests/resources/twowaymerge.git/objects/7b/8c336c45fc6895c1c60827260fe5d798e5d247 deleted file mode 100644 index 19e7ef4637..0000000000 --- a/vendor/libgit2/tests/resources/twowaymerge.git/objects/7b/8c336c45fc6895c1c60827260fe5d798e5d247 +++ /dev/null @@ -1,3 +0,0 @@ -xťÎA @Qלb.`3 S(‰1îLÜz‚B[µĹTzëÜľĹĎŹež§ -D|¨kJCß3f‰´íȵś‚uŮ ›L>YGMĚV˝eMKť9˘ŃZ5ŮćHčĄő˘#{¦žĄE´J¶:–î±Ô -·®ĺŐϲŔéó“Çp¦:nˇ‰e>6-ŁsH GěŐ®űfMÔS}ZE˛ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/twowaymerge.git/objects/82/bf9a1a10a4b25c1f14c9607b60970705e92545 b/vendor/libgit2/tests/resources/twowaymerge.git/objects/82/bf9a1a10a4b25c1f14c9607b60970705e92545 deleted file mode 100644 index 89b0b9f9be..0000000000 --- a/vendor/libgit2/tests/resources/twowaymerge.git/objects/82/bf9a1a10a4b25c1f14c9607b60970705e92545 +++ /dev/null @@ -1 +0,0 @@ -xťŽË Â09»Šm€hă_ÖBܸRן„cśţ1-pť§yšPKy4RÚ–D›GŚF»ŔJvÉFE>‡1#q˛Ž j§ĹŰoimbvSŽŠYSbEr˛Š¸»Q"eÓŃ{+üŢ–şÁ=ÔÖŕ6Ŕµľbń+ś>?ňś/óŁ-;ˇ–3ŚĘhś¬C‚#˘č´g¶ô÷XÄĚyF¤ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/twowaymerge.git/objects/8b/82fb1794cb1c8c7f172ec730a4c2db0ae3e650 b/vendor/libgit2/tests/resources/twowaymerge.git/objects/8b/82fb1794cb1c8c7f172ec730a4c2db0ae3e650 deleted file mode 100644 index 8e9b758eac..0000000000 --- a/vendor/libgit2/tests/resources/twowaymerge.git/objects/8b/82fb1794cb1c8c7f172ec730a4c2db0ae3e650 +++ /dev/null @@ -1,3 +0,0 @@ -xťÎ˝ Â0@ajOq ů7BtH´Lpľó%A8FÁŮź°íW<=ŞĄĚ ¬ő‡¶ć x"ĘŽŘ$—%1†dÄcĎDNL:Yv=©7®yiĐc -l¤$Ž\b{‰DÂbOd‚Ő9x+ -·6ŐT[{·úâ‚ ś??yŽ×qnÓ–:ŞĺĆŻcÔŢÁQZ«]÷Í–˙¨˘ľ7 H† \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/twowaymerge.git/objects/9a/40a2f11c191f180c47e54b11567cb3c1e89b30 b/vendor/libgit2/tests/resources/twowaymerge.git/objects/9a/40a2f11c191f180c47e54b11567cb3c1e89b30 deleted file mode 100644 index 1de1224f75..0000000000 Binary files a/vendor/libgit2/tests/resources/twowaymerge.git/objects/9a/40a2f11c191f180c47e54b11567cb3c1e89b30 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/twowaymerge.git/objects/9b/219343610c88a1187c996d0dc58330b55cee28 b/vendor/libgit2/tests/resources/twowaymerge.git/objects/9b/219343610c88a1187c996d0dc58330b55cee28 deleted file mode 100644 index 8b64b4381c..0000000000 --- a/vendor/libgit2/tests/resources/twowaymerge.git/objects/9b/219343610c88a1187c996d0dc58330b55cee28 +++ /dev/null @@ -1,2 +0,0 @@ -xťĎKj1Ьç˝óĘFj}Z‚Ľ3˛Ę ¤VĎÇdFA#ß?’\ ËzĹu]—FÓSo" ‰JđĆ& ‚^‚Ž,9$G’Eéd)7|¦&[6”(FU"&Žh< ŻFÉc4AĆż>"ZŃQ;m9Ű\;ďKP%1b9k‰93¤Gźkw®˝Ăënő٬içý[îÓuZúüČ®ë hă¬"RŢÂYĄ†CŹ[]ţ=0ĽI›rKĎp—¶÷óO:Á˛ő -»pÝĘŻ _ľ(c‡ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/twowaymerge.git/objects/9f/e06a50f4d1634d6c6879854d01d80857388706 b/vendor/libgit2/tests/resources/twowaymerge.git/objects/9f/e06a50f4d1634d6c6879854d01d80857388706 deleted file mode 100644 index 055de01580..0000000000 Binary files a/vendor/libgit2/tests/resources/twowaymerge.git/objects/9f/e06a50f4d1634d6c6879854d01d80857388706 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/twowaymerge.git/objects/a4/1a49f8f5cd9b6cb14a076bf8394881ed0b4d19 b/vendor/libgit2/tests/resources/twowaymerge.git/objects/a4/1a49f8f5cd9b6cb14a076bf8394881ed0b4d19 deleted file mode 100644 index cb4d34e77d..0000000000 --- a/vendor/libgit2/tests/resources/twowaymerge.git/objects/a4/1a49f8f5cd9b6cb14a076bf8394881ed0b4d19 +++ /dev/null @@ -1,3 +0,0 @@ -xťÎ˝ Â0@ajOq Ýů7'!D‡DËöŮ A$FÁŮź°íW<=©ó<5ĐÚÚZ -8N(CČÁzÇ…$'2ť!Î>[):#D˝zǵ, zťŽ ŁMÚ d…=†ä‘t…µłNĹ­=ę -w©­Á­k}ĺ9.púüä9^Ć©=¶ÔIťĎ@ĆY ž‰á=˘ÚußlĺÔ°Dâ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/twowaymerge.git/objects/a9/53a018c5b10b20c86e69fef55ebc8ad4c5a417 b/vendor/libgit2/tests/resources/twowaymerge.git/objects/a9/53a018c5b10b20c86e69fef55ebc8ad4c5a417 deleted file mode 100644 index 8235f18397..0000000000 --- a/vendor/libgit2/tests/resources/twowaymerge.git/objects/a9/53a018c5b10b20c86e69fef55ebc8ad4c5a417 +++ /dev/null @@ -1 +0,0 @@ -xťŹÍJÄ0…]÷)înV3$ąis"îÁ•Oű“NŶ’ÉĽżń\žď|8˛ŻëŇ!dzčÍ ŞÔdXG/ޫϹp*‰˘CłXłş@ZÂ8|•f[Vź0HD™H“E]6Ż”g¶I#g«*ńĎ­9UEćHĆH!MHĚŐńh‚şR¦ˇÜűuođ.{ďđz—ýSײÁăí‡|ĚĎóŇŻwľČľ>Ç1ş4‘C8;rn8čq«Űż†7kł·˛ÉNui·~ţM§áÜ^­ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/twowaymerge.git/objects/a9/cce3cd1b3efbda5b1f4a6dcc3f1570b2d3d74c b/vendor/libgit2/tests/resources/twowaymerge.git/objects/a9/cce3cd1b3efbda5b1f4a6dcc3f1570b2d3d74c deleted file mode 100644 index 4da7e826a3..0000000000 --- a/vendor/libgit2/tests/resources/twowaymerge.git/objects/a9/cce3cd1b3efbda5b1f4a6dcc3f1570b2d3d74c +++ /dev/null @@ -1 +0,0 @@ -x+)JMU044c040031QHdx6÷ŃěMŻ9{wk®+ŹşqčIOđD¨d6>É|’ąX%>˝9j \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/twowaymerge.git/objects/bd/1732c43c68d712ad09e1d872b9be6d4b9efdc4 b/vendor/libgit2/tests/resources/twowaymerge.git/objects/bd/1732c43c68d712ad09e1d872b9be6d4b9efdc4 deleted file mode 100644 index b9b60122d7..0000000000 Binary files a/vendor/libgit2/tests/resources/twowaymerge.git/objects/bd/1732c43c68d712ad09e1d872b9be6d4b9efdc4 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/twowaymerge.git/objects/c3/7a783c20d92ac92362a78a32860f7eebf938ef b/vendor/libgit2/tests/resources/twowaymerge.git/objects/c3/7a783c20d92ac92362a78a32860f7eebf938ef deleted file mode 100644 index 041e890aba..0000000000 Binary files a/vendor/libgit2/tests/resources/twowaymerge.git/objects/c3/7a783c20d92ac92362a78a32860f7eebf938ef and /dev/null differ diff --git a/vendor/libgit2/tests/resources/twowaymerge.git/objects/cb/dd40facab1682754eb67f7a43f29e672903cf6 b/vendor/libgit2/tests/resources/twowaymerge.git/objects/cb/dd40facab1682754eb67f7a43f29e672903cf6 deleted file mode 100644 index ccb156d889..0000000000 Binary files a/vendor/libgit2/tests/resources/twowaymerge.git/objects/cb/dd40facab1682754eb67f7a43f29e672903cf6 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/twowaymerge.git/objects/cd/f97fd3bb48eb3827638bb33d208f5fd32d0aa6 b/vendor/libgit2/tests/resources/twowaymerge.git/objects/cd/f97fd3bb48eb3827638bb33d208f5fd32d0aa6 deleted file mode 100644 index 0e028dc019..0000000000 Binary files a/vendor/libgit2/tests/resources/twowaymerge.git/objects/cd/f97fd3bb48eb3827638bb33d208f5fd32d0aa6 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/twowaymerge.git/objects/d6/f10d549cb335b9e6d38afc1f0088be69b50494 b/vendor/libgit2/tests/resources/twowaymerge.git/objects/d6/f10d549cb335b9e6d38afc1f0088be69b50494 deleted file mode 100644 index b298c520e0..0000000000 Binary files a/vendor/libgit2/tests/resources/twowaymerge.git/objects/d6/f10d549cb335b9e6d38afc1f0088be69b50494 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/twowaymerge.git/objects/d9/acdc7ae7632adfeec67fa73c1e343cf4d1f47e b/vendor/libgit2/tests/resources/twowaymerge.git/objects/d9/acdc7ae7632adfeec67fa73c1e343cf4d1f47e deleted file mode 100644 index de94528a4f..0000000000 --- a/vendor/libgit2/tests/resources/twowaymerge.git/objects/d9/acdc7ae7632adfeec67fa73c1e343cf4d1f47e +++ /dev/null @@ -1 +0,0 @@ -x+)JMU044c040031QHdx6÷ŃěMŻ9{wk®+ŹşqčIOđD¨d>É4|’éX%:79U \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/twowaymerge.git/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391 b/vendor/libgit2/tests/resources/twowaymerge.git/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391 deleted file mode 100644 index 7112238943..0000000000 Binary files a/vendor/libgit2/tests/resources/twowaymerge.git/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/twowaymerge.git/objects/ef/0488f0b722f0be8bcb90a7730ac7efafd1d694 b/vendor/libgit2/tests/resources/twowaymerge.git/objects/ef/0488f0b722f0be8bcb90a7730ac7efafd1d694 deleted file mode 100644 index 00f7d36158..0000000000 --- a/vendor/libgit2/tests/resources/twowaymerge.git/objects/ef/0488f0b722f0be8bcb90a7730ac7efafd1d694 +++ /dev/null @@ -1 +0,0 @@ -xťŽM F]sŠą€Í0Ă_cÜ™¸ő@ˇŐH1•Ţ_Ľ‚Ű—ď}y±–ňh@¤mK 8łŮYĆčä„ÁŽ4ѨŚt^'¦`lPى·ßŇÚ ĎksĹ*š? |m“‡ŐçiŞ@ŰÖý¶Ľm»¨VŁ…Ł'©î`)”.Ř-1¨ x -u„xăňt(+ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/typechanges/.gitted/modules/b/objects/78/9efbdadaa4a582778d4584385495559ea0994b b/vendor/libgit2/tests/resources/typechanges/.gitted/modules/b/objects/78/9efbdadaa4a582778d4584385495559ea0994b deleted file mode 100644 index 17458840b8..0000000000 --- a/vendor/libgit2/tests/resources/typechanges/.gitted/modules/b/objects/78/9efbdadaa4a582778d4584385495559ea0994b +++ /dev/null @@ -1,2 +0,0 @@ -x ڱ …0 ť)ŢŠ?= ĄÉÄNŠlO¤k®¸‹jŰú˙ą8&„«¨ ăr ” -ďqJWń°7ľB<ÉáöfŮěK8­#Q1C-‘"eŞ·Ě«ŁŠ°đ>Ľ'@ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/typechanges/.gitted/modules/b/objects/88/34b635dd468a83cb012f6feace968c1c9f5d6e b/vendor/libgit2/tests/resources/typechanges/.gitted/modules/b/objects/88/34b635dd468a83cb012f6feace968c1c9f5d6e deleted file mode 100644 index 83cc29fb15..0000000000 Binary files a/vendor/libgit2/tests/resources/typechanges/.gitted/modules/b/objects/88/34b635dd468a83cb012f6feace968c1c9f5d6e and /dev/null differ diff --git a/vendor/libgit2/tests/resources/typechanges/.gitted/modules/b/objects/d0/5f2cd5cc77addf68ed6f50d622c9a4f732e6c5 b/vendor/libgit2/tests/resources/typechanges/.gitted/modules/b/objects/d0/5f2cd5cc77addf68ed6f50d622c9a4f732e6c5 deleted file mode 100644 index 55bda40ef2..0000000000 Binary files a/vendor/libgit2/tests/resources/typechanges/.gitted/modules/b/objects/d0/5f2cd5cc77addf68ed6f50d622c9a4f732e6c5 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/typechanges/.gitted/modules/b/packed-refs b/vendor/libgit2/tests/resources/typechanges/.gitted/modules/b/packed-refs deleted file mode 100644 index 5a4ebc47cc..0000000000 --- a/vendor/libgit2/tests/resources/typechanges/.gitted/modules/b/packed-refs +++ /dev/null @@ -1,2 +0,0 @@ -# pack-refs with: peeled -480095882d281ed676fe5b863569520e54a7d5c0 refs/remotes/origin/master diff --git a/vendor/libgit2/tests/resources/typechanges/.gitted/modules/b/refs/heads/master b/vendor/libgit2/tests/resources/typechanges/.gitted/modules/b/refs/heads/master deleted file mode 100644 index e12c44d7ae..0000000000 --- a/vendor/libgit2/tests/resources/typechanges/.gitted/modules/b/refs/heads/master +++ /dev/null @@ -1 +0,0 @@ -480095882d281ed676fe5b863569520e54a7d5c0 diff --git a/vendor/libgit2/tests/resources/typechanges/.gitted/modules/b/refs/remotes/origin/HEAD b/vendor/libgit2/tests/resources/typechanges/.gitted/modules/b/refs/remotes/origin/HEAD deleted file mode 100644 index 6efe28fff8..0000000000 --- a/vendor/libgit2/tests/resources/typechanges/.gitted/modules/b/refs/remotes/origin/HEAD +++ /dev/null @@ -1 +0,0 @@ -ref: refs/remotes/origin/master diff --git a/vendor/libgit2/tests/resources/typechanges/.gitted/modules/d/HEAD b/vendor/libgit2/tests/resources/typechanges/.gitted/modules/d/HEAD deleted file mode 100644 index cb089cd89a..0000000000 --- a/vendor/libgit2/tests/resources/typechanges/.gitted/modules/d/HEAD +++ /dev/null @@ -1 +0,0 @@ -ref: refs/heads/master diff --git a/vendor/libgit2/tests/resources/typechanges/.gitted/modules/d/config b/vendor/libgit2/tests/resources/typechanges/.gitted/modules/d/config deleted file mode 100644 index 42e1bddda9..0000000000 --- a/vendor/libgit2/tests/resources/typechanges/.gitted/modules/d/config +++ /dev/null @@ -1,13 +0,0 @@ -[core] - repositoryformatversion = 0 - filemode = true - bare = false - logallrefupdates = true - worktree = ../../../d - ignorecase = true -[remote "origin"] - fetch = +refs/heads/*:refs/remotes/origin/* - url = /Users/rb/src/libgit2/tests-clar/resources/submod2_target/.git -[branch "master"] - remote = origin - merge = refs/heads/master diff --git a/vendor/libgit2/tests/resources/typechanges/.gitted/modules/d/description b/vendor/libgit2/tests/resources/typechanges/.gitted/modules/d/description deleted file mode 100644 index 498b267a8c..0000000000 --- a/vendor/libgit2/tests/resources/typechanges/.gitted/modules/d/description +++ /dev/null @@ -1 +0,0 @@ -Unnamed repository; edit this file 'description' to name the repository. diff --git a/vendor/libgit2/tests/resources/typechanges/.gitted/modules/d/index b/vendor/libgit2/tests/resources/typechanges/.gitted/modules/d/index deleted file mode 100644 index 86d0266e8f..0000000000 Binary files a/vendor/libgit2/tests/resources/typechanges/.gitted/modules/d/index and /dev/null differ diff --git a/vendor/libgit2/tests/resources/typechanges/.gitted/modules/d/info/exclude b/vendor/libgit2/tests/resources/typechanges/.gitted/modules/d/info/exclude deleted file mode 100644 index a5196d1be8..0000000000 --- a/vendor/libgit2/tests/resources/typechanges/.gitted/modules/d/info/exclude +++ /dev/null @@ -1,6 +0,0 @@ -# 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/vendor/libgit2/tests/resources/typechanges/.gitted/modules/d/objects/06/362fe2fdb7010d0e447b4fb450d405420479a1 b/vendor/libgit2/tests/resources/typechanges/.gitted/modules/d/objects/06/362fe2fdb7010d0e447b4fb450d405420479a1 deleted file mode 100644 index f4b7094c52..0000000000 Binary files a/vendor/libgit2/tests/resources/typechanges/.gitted/modules/d/objects/06/362fe2fdb7010d0e447b4fb450d405420479a1 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/typechanges/.gitted/modules/d/objects/0e/6a3ca48bd47cfe67681acf39aa0b10a0b92484 b/vendor/libgit2/tests/resources/typechanges/.gitted/modules/d/objects/0e/6a3ca48bd47cfe67681acf39aa0b10a0b92484 deleted file mode 100644 index 56c845e49d..0000000000 Binary files a/vendor/libgit2/tests/resources/typechanges/.gitted/modules/d/objects/0e/6a3ca48bd47cfe67681acf39aa0b10a0b92484 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/typechanges/.gitted/modules/d/objects/17/d0ece6e96460a06592d9d9d000de37ba4232c5 b/vendor/libgit2/tests/resources/typechanges/.gitted/modules/d/objects/17/d0ece6e96460a06592d9d9d000de37ba4232c5 deleted file mode 100644 index bd179b5f54..0000000000 Binary files a/vendor/libgit2/tests/resources/typechanges/.gitted/modules/d/objects/17/d0ece6e96460a06592d9d9d000de37ba4232c5 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/typechanges/.gitted/modules/d/objects/41/bd4bc3df978de695f67ace64c560913da11653 b/vendor/libgit2/tests/resources/typechanges/.gitted/modules/d/objects/41/bd4bc3df978de695f67ace64c560913da11653 deleted file mode 100644 index ccf49bd15c..0000000000 Binary files a/vendor/libgit2/tests/resources/typechanges/.gitted/modules/d/objects/41/bd4bc3df978de695f67ace64c560913da11653 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/typechanges/.gitted/modules/d/objects/48/0095882d281ed676fe5b863569520e54a7d5c0 b/vendor/libgit2/tests/resources/typechanges/.gitted/modules/d/objects/48/0095882d281ed676fe5b863569520e54a7d5c0 deleted file mode 100644 index 53029069ad..0000000000 Binary files a/vendor/libgit2/tests/resources/typechanges/.gitted/modules/d/objects/48/0095882d281ed676fe5b863569520e54a7d5c0 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/typechanges/.gitted/modules/d/objects/5e/4963595a9774b90524d35a807169049de8ccad b/vendor/libgit2/tests/resources/typechanges/.gitted/modules/d/objects/5e/4963595a9774b90524d35a807169049de8ccad deleted file mode 100644 index 38c791eba1..0000000000 Binary files a/vendor/libgit2/tests/resources/typechanges/.gitted/modules/d/objects/5e/4963595a9774b90524d35a807169049de8ccad and /dev/null differ diff --git a/vendor/libgit2/tests/resources/typechanges/.gitted/modules/d/objects/6b/31c659545507c381e9cd34ec508f16c04e149e b/vendor/libgit2/tests/resources/typechanges/.gitted/modules/d/objects/6b/31c659545507c381e9cd34ec508f16c04e149e deleted file mode 100644 index a26d299939..0000000000 --- a/vendor/libgit2/tests/resources/typechanges/.gitted/modules/d/objects/6b/31c659545507c381e9cd34ec508f16c04e149e +++ /dev/null @@ -1,2 +0,0 @@ -x•ŤQ -!EűvoĹÓy*Ń_żí@Çg#h‚ŁűOhý^Î9w«Ą¤ŇęSoĚ€f1*˛ŠÁ[”‰¬§čIc Ô¤ěę¤pŁďµÁkç Α\›żżS߇żlµÜ@.¤´^ŤQpF‹(ć:˙úD˙5Ĺó“zr~ ńen8 \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/typechanges/.gitted/modules/d/objects/73/ba924a80437097795ae839e66e187c55d3babf b/vendor/libgit2/tests/resources/typechanges/.gitted/modules/d/objects/73/ba924a80437097795ae839e66e187c55d3babf deleted file mode 100644 index 83d1ba4813..0000000000 Binary files a/vendor/libgit2/tests/resources/typechanges/.gitted/modules/d/objects/73/ba924a80437097795ae839e66e187c55d3babf and /dev/null differ diff --git a/vendor/libgit2/tests/resources/typechanges/.gitted/modules/d/objects/78/0d7397f5e8f8f477fb55b7af3accc2154b2d4a b/vendor/libgit2/tests/resources/typechanges/.gitted/modules/d/objects/78/0d7397f5e8f8f477fb55b7af3accc2154b2d4a deleted file mode 100644 index 6d27af8a89..0000000000 --- a/vendor/libgit2/tests/resources/typechanges/.gitted/modules/d/objects/78/0d7397f5e8f8f477fb55b7af3accc2154b2d4a +++ /dev/null @@ -1,2 +0,0 @@ -x-Ë1Â0 FaćžâßŘ0pŽŔěÄĐ(N-ĹöĐŰӡғľé±ăq]>ksĹ*š? |m“‡ŐçiŞ@ŰÖý¶Ľm»¨VŁ…Ł'©î`)”.Ř-1¨ x -u„xăňt(+ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/typechanges/.gitted/modules/d/objects/78/9efbdadaa4a582778d4584385495559ea0994b b/vendor/libgit2/tests/resources/typechanges/.gitted/modules/d/objects/78/9efbdadaa4a582778d4584385495559ea0994b deleted file mode 100644 index 17458840b8..0000000000 --- a/vendor/libgit2/tests/resources/typechanges/.gitted/modules/d/objects/78/9efbdadaa4a582778d4584385495559ea0994b +++ /dev/null @@ -1,2 +0,0 @@ -x ڱ …0 ť)ŢŠ?= ĄÉÄNŠlO¤k®¸‹jŰú˙ą8&„«¨ ăr ” -ďqJWń°7ľB<ÉáöfŮěK8­#Q1C-‘"eŞ·Ě«ŁŠ°đ>Ľ'@ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/typechanges/.gitted/modules/d/objects/88/34b635dd468a83cb012f6feace968c1c9f5d6e b/vendor/libgit2/tests/resources/typechanges/.gitted/modules/d/objects/88/34b635dd468a83cb012f6feace968c1c9f5d6e deleted file mode 100644 index 83cc29fb15..0000000000 Binary files a/vendor/libgit2/tests/resources/typechanges/.gitted/modules/d/objects/88/34b635dd468a83cb012f6feace968c1c9f5d6e and /dev/null differ diff --git a/vendor/libgit2/tests/resources/typechanges/.gitted/modules/d/objects/d0/5f2cd5cc77addf68ed6f50d622c9a4f732e6c5 b/vendor/libgit2/tests/resources/typechanges/.gitted/modules/d/objects/d0/5f2cd5cc77addf68ed6f50d622c9a4f732e6c5 deleted file mode 100644 index 55bda40ef2..0000000000 Binary files a/vendor/libgit2/tests/resources/typechanges/.gitted/modules/d/objects/d0/5f2cd5cc77addf68ed6f50d622c9a4f732e6c5 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/typechanges/.gitted/modules/d/packed-refs b/vendor/libgit2/tests/resources/typechanges/.gitted/modules/d/packed-refs deleted file mode 100644 index 5a4ebc47cc..0000000000 --- a/vendor/libgit2/tests/resources/typechanges/.gitted/modules/d/packed-refs +++ /dev/null @@ -1,2 +0,0 @@ -# pack-refs with: peeled -480095882d281ed676fe5b863569520e54a7d5c0 refs/remotes/origin/master diff --git a/vendor/libgit2/tests/resources/typechanges/.gitted/modules/d/refs/heads/master b/vendor/libgit2/tests/resources/typechanges/.gitted/modules/d/refs/heads/master deleted file mode 100644 index e12c44d7ae..0000000000 --- a/vendor/libgit2/tests/resources/typechanges/.gitted/modules/d/refs/heads/master +++ /dev/null @@ -1 +0,0 @@ -480095882d281ed676fe5b863569520e54a7d5c0 diff --git a/vendor/libgit2/tests/resources/typechanges/.gitted/modules/d/refs/remotes/origin/HEAD b/vendor/libgit2/tests/resources/typechanges/.gitted/modules/d/refs/remotes/origin/HEAD deleted file mode 100644 index 6efe28fff8..0000000000 --- a/vendor/libgit2/tests/resources/typechanges/.gitted/modules/d/refs/remotes/origin/HEAD +++ /dev/null @@ -1 +0,0 @@ -ref: refs/remotes/origin/master diff --git a/vendor/libgit2/tests/resources/typechanges/.gitted/modules/e/HEAD b/vendor/libgit2/tests/resources/typechanges/.gitted/modules/e/HEAD deleted file mode 100644 index cb089cd89a..0000000000 --- a/vendor/libgit2/tests/resources/typechanges/.gitted/modules/e/HEAD +++ /dev/null @@ -1 +0,0 @@ -ref: refs/heads/master diff --git a/vendor/libgit2/tests/resources/typechanges/.gitted/modules/e/config b/vendor/libgit2/tests/resources/typechanges/.gitted/modules/e/config deleted file mode 100644 index 89b3b9b4fd..0000000000 --- a/vendor/libgit2/tests/resources/typechanges/.gitted/modules/e/config +++ /dev/null @@ -1,13 +0,0 @@ -[core] - repositoryformatversion = 0 - filemode = true - bare = false - logallrefupdates = true - worktree = ../../../e - ignorecase = true -[remote "origin"] - fetch = +refs/heads/*:refs/remotes/origin/* - url = /Users/rb/src/libgit2/tests-clar/resources/submod2_target/.git -[branch "master"] - remote = origin - merge = refs/heads/master diff --git a/vendor/libgit2/tests/resources/typechanges/.gitted/modules/e/description b/vendor/libgit2/tests/resources/typechanges/.gitted/modules/e/description deleted file mode 100644 index 498b267a8c..0000000000 --- a/vendor/libgit2/tests/resources/typechanges/.gitted/modules/e/description +++ /dev/null @@ -1 +0,0 @@ -Unnamed repository; edit this file 'description' to name the repository. diff --git a/vendor/libgit2/tests/resources/typechanges/.gitted/modules/e/index b/vendor/libgit2/tests/resources/typechanges/.gitted/modules/e/index deleted file mode 100644 index cd6e2da6cc..0000000000 Binary files a/vendor/libgit2/tests/resources/typechanges/.gitted/modules/e/index and /dev/null differ diff --git a/vendor/libgit2/tests/resources/typechanges/.gitted/modules/e/info/exclude b/vendor/libgit2/tests/resources/typechanges/.gitted/modules/e/info/exclude deleted file mode 100644 index a5196d1be8..0000000000 --- a/vendor/libgit2/tests/resources/typechanges/.gitted/modules/e/info/exclude +++ /dev/null @@ -1,6 +0,0 @@ -# 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/vendor/libgit2/tests/resources/typechanges/.gitted/modules/e/objects/06/362fe2fdb7010d0e447b4fb450d405420479a1 b/vendor/libgit2/tests/resources/typechanges/.gitted/modules/e/objects/06/362fe2fdb7010d0e447b4fb450d405420479a1 deleted file mode 100644 index f4b7094c52..0000000000 Binary files a/vendor/libgit2/tests/resources/typechanges/.gitted/modules/e/objects/06/362fe2fdb7010d0e447b4fb450d405420479a1 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/typechanges/.gitted/modules/e/objects/0e/6a3ca48bd47cfe67681acf39aa0b10a0b92484 b/vendor/libgit2/tests/resources/typechanges/.gitted/modules/e/objects/0e/6a3ca48bd47cfe67681acf39aa0b10a0b92484 deleted file mode 100644 index 56c845e49d..0000000000 Binary files a/vendor/libgit2/tests/resources/typechanges/.gitted/modules/e/objects/0e/6a3ca48bd47cfe67681acf39aa0b10a0b92484 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/typechanges/.gitted/modules/e/objects/17/d0ece6e96460a06592d9d9d000de37ba4232c5 b/vendor/libgit2/tests/resources/typechanges/.gitted/modules/e/objects/17/d0ece6e96460a06592d9d9d000de37ba4232c5 deleted file mode 100644 index bd179b5f54..0000000000 Binary files a/vendor/libgit2/tests/resources/typechanges/.gitted/modules/e/objects/17/d0ece6e96460a06592d9d9d000de37ba4232c5 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/typechanges/.gitted/modules/e/objects/41/bd4bc3df978de695f67ace64c560913da11653 b/vendor/libgit2/tests/resources/typechanges/.gitted/modules/e/objects/41/bd4bc3df978de695f67ace64c560913da11653 deleted file mode 100644 index ccf49bd15c..0000000000 Binary files a/vendor/libgit2/tests/resources/typechanges/.gitted/modules/e/objects/41/bd4bc3df978de695f67ace64c560913da11653 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/typechanges/.gitted/modules/e/objects/48/0095882d281ed676fe5b863569520e54a7d5c0 b/vendor/libgit2/tests/resources/typechanges/.gitted/modules/e/objects/48/0095882d281ed676fe5b863569520e54a7d5c0 deleted file mode 100644 index 53029069ad..0000000000 Binary files a/vendor/libgit2/tests/resources/typechanges/.gitted/modules/e/objects/48/0095882d281ed676fe5b863569520e54a7d5c0 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/typechanges/.gitted/modules/e/objects/5e/4963595a9774b90524d35a807169049de8ccad b/vendor/libgit2/tests/resources/typechanges/.gitted/modules/e/objects/5e/4963595a9774b90524d35a807169049de8ccad deleted file mode 100644 index 38c791eba1..0000000000 Binary files a/vendor/libgit2/tests/resources/typechanges/.gitted/modules/e/objects/5e/4963595a9774b90524d35a807169049de8ccad and /dev/null differ diff --git a/vendor/libgit2/tests/resources/typechanges/.gitted/modules/e/objects/6b/31c659545507c381e9cd34ec508f16c04e149e b/vendor/libgit2/tests/resources/typechanges/.gitted/modules/e/objects/6b/31c659545507c381e9cd34ec508f16c04e149e deleted file mode 100644 index a26d299939..0000000000 --- a/vendor/libgit2/tests/resources/typechanges/.gitted/modules/e/objects/6b/31c659545507c381e9cd34ec508f16c04e149e +++ /dev/null @@ -1,2 +0,0 @@ -x•ŤQ -!EűvoĹÓy*Ń_żí@Çg#h‚ŁűOhý^Î9w«Ą¤ŇęSoĚ€f1*˛ŠÁ[”‰¬§čIc Ô¤ěę¤pŁďµÁkç Α\›żżS߇żlµÜ@.¤´^ŤQpF‹(ć:˙úD˙5Ĺó“zr~ ńen8 \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/typechanges/.gitted/modules/e/objects/73/ba924a80437097795ae839e66e187c55d3babf b/vendor/libgit2/tests/resources/typechanges/.gitted/modules/e/objects/73/ba924a80437097795ae839e66e187c55d3babf deleted file mode 100644 index 83d1ba4813..0000000000 Binary files a/vendor/libgit2/tests/resources/typechanges/.gitted/modules/e/objects/73/ba924a80437097795ae839e66e187c55d3babf and /dev/null differ diff --git a/vendor/libgit2/tests/resources/typechanges/.gitted/modules/e/objects/78/0d7397f5e8f8f477fb55b7af3accc2154b2d4a b/vendor/libgit2/tests/resources/typechanges/.gitted/modules/e/objects/78/0d7397f5e8f8f477fb55b7af3accc2154b2d4a deleted file mode 100644 index 6d27af8a89..0000000000 --- a/vendor/libgit2/tests/resources/typechanges/.gitted/modules/e/objects/78/0d7397f5e8f8f477fb55b7af3accc2154b2d4a +++ /dev/null @@ -1,2 +0,0 @@ -x-Ë1Â0 FaćžâßŘ0pŽŔěÄĐ(N-ĹöĐŰӡғľé±ăq]>ksĹ*š? |m“‡ŐçiŞ@ŰÖý¶Ľm»¨VŁ…Ł'©î`)”.Ř-1¨ x -u„xăňt(+ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/typechanges/.gitted/modules/e/objects/78/9efbdadaa4a582778d4584385495559ea0994b b/vendor/libgit2/tests/resources/typechanges/.gitted/modules/e/objects/78/9efbdadaa4a582778d4584385495559ea0994b deleted file mode 100644 index 17458840b8..0000000000 --- a/vendor/libgit2/tests/resources/typechanges/.gitted/modules/e/objects/78/9efbdadaa4a582778d4584385495559ea0994b +++ /dev/null @@ -1,2 +0,0 @@ -x ڱ …0 ť)ŢŠ?= ĄÉÄNŠlO¤k®¸‹jŰú˙ą8&„«¨ ăr ” -ďqJWń°7ľB<ÉáöfŮěK8­#Q1C-‘"eŞ·Ě«ŁŠ°đ>Ľ'@ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/typechanges/.gitted/modules/e/objects/88/34b635dd468a83cb012f6feace968c1c9f5d6e b/vendor/libgit2/tests/resources/typechanges/.gitted/modules/e/objects/88/34b635dd468a83cb012f6feace968c1c9f5d6e deleted file mode 100644 index 83cc29fb15..0000000000 Binary files a/vendor/libgit2/tests/resources/typechanges/.gitted/modules/e/objects/88/34b635dd468a83cb012f6feace968c1c9f5d6e and /dev/null differ diff --git a/vendor/libgit2/tests/resources/typechanges/.gitted/modules/e/objects/d0/5f2cd5cc77addf68ed6f50d622c9a4f732e6c5 b/vendor/libgit2/tests/resources/typechanges/.gitted/modules/e/objects/d0/5f2cd5cc77addf68ed6f50d622c9a4f732e6c5 deleted file mode 100644 index 55bda40ef2..0000000000 Binary files a/vendor/libgit2/tests/resources/typechanges/.gitted/modules/e/objects/d0/5f2cd5cc77addf68ed6f50d622c9a4f732e6c5 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/typechanges/.gitted/modules/e/packed-refs b/vendor/libgit2/tests/resources/typechanges/.gitted/modules/e/packed-refs deleted file mode 100644 index 5a4ebc47cc..0000000000 --- a/vendor/libgit2/tests/resources/typechanges/.gitted/modules/e/packed-refs +++ /dev/null @@ -1,2 +0,0 @@ -# pack-refs with: peeled -480095882d281ed676fe5b863569520e54a7d5c0 refs/remotes/origin/master diff --git a/vendor/libgit2/tests/resources/typechanges/.gitted/modules/e/refs/heads/master b/vendor/libgit2/tests/resources/typechanges/.gitted/modules/e/refs/heads/master deleted file mode 100644 index e12c44d7ae..0000000000 --- a/vendor/libgit2/tests/resources/typechanges/.gitted/modules/e/refs/heads/master +++ /dev/null @@ -1 +0,0 @@ -480095882d281ed676fe5b863569520e54a7d5c0 diff --git a/vendor/libgit2/tests/resources/typechanges/.gitted/modules/e/refs/remotes/origin/HEAD b/vendor/libgit2/tests/resources/typechanges/.gitted/modules/e/refs/remotes/origin/HEAD deleted file mode 100644 index 6efe28fff8..0000000000 --- a/vendor/libgit2/tests/resources/typechanges/.gitted/modules/e/refs/remotes/origin/HEAD +++ /dev/null @@ -1 +0,0 @@ -ref: refs/remotes/origin/master diff --git a/vendor/libgit2/tests/resources/typechanges/.gitted/objects/0d/78578795b7ca49fd8df6c4b6d27c5c02d991d8 b/vendor/libgit2/tests/resources/typechanges/.gitted/objects/0d/78578795b7ca49fd8df6c4b6d27c5c02d991d8 deleted file mode 100644 index f2d02f4f72..0000000000 Binary files a/vendor/libgit2/tests/resources/typechanges/.gitted/objects/0d/78578795b7ca49fd8df6c4b6d27c5c02d991d8 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/typechanges/.gitted/objects/0e/7ed140b514b8cae23254cb8656fe1674403aff b/vendor/libgit2/tests/resources/typechanges/.gitted/objects/0e/7ed140b514b8cae23254cb8656fe1674403aff deleted file mode 100644 index 527964c924..0000000000 Binary files a/vendor/libgit2/tests/resources/typechanges/.gitted/objects/0e/7ed140b514b8cae23254cb8656fe1674403aff and /dev/null differ diff --git a/vendor/libgit2/tests/resources/typechanges/.gitted/objects/0f/f461da9689266f482d8f6654a4400b4e33c586 b/vendor/libgit2/tests/resources/typechanges/.gitted/objects/0f/f461da9689266f482d8f6654a4400b4e33c586 deleted file mode 100644 index 2694e4fa01..0000000000 Binary files a/vendor/libgit2/tests/resources/typechanges/.gitted/objects/0f/f461da9689266f482d8f6654a4400b4e33c586 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/typechanges/.gitted/objects/18/aa7e45bbe4c3cc24a0b079696c59d36675af97 b/vendor/libgit2/tests/resources/typechanges/.gitted/objects/18/aa7e45bbe4c3cc24a0b079696c59d36675af97 deleted file mode 100644 index 032a960b47..0000000000 Binary files a/vendor/libgit2/tests/resources/typechanges/.gitted/objects/18/aa7e45bbe4c3cc24a0b079696c59d36675af97 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/typechanges/.gitted/objects/1b/63caae4a5ca96f78e8dfefc376c6a39a142475 b/vendor/libgit2/tests/resources/typechanges/.gitted/objects/1b/63caae4a5ca96f78e8dfefc376c6a39a142475 deleted file mode 100644 index d32622e675..0000000000 Binary files a/vendor/libgit2/tests/resources/typechanges/.gitted/objects/1b/63caae4a5ca96f78e8dfefc376c6a39a142475 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/typechanges/.gitted/objects/1e/abe82aa3b2365a394f6108f24435df6e193d02 b/vendor/libgit2/tests/resources/typechanges/.gitted/objects/1e/abe82aa3b2365a394f6108f24435df6e193d02 deleted file mode 100644 index 42d5f92f39..0000000000 Binary files a/vendor/libgit2/tests/resources/typechanges/.gitted/objects/1e/abe82aa3b2365a394f6108f24435df6e193d02 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/typechanges/.gitted/objects/42/061c01a1c70097d1e4579f29a5adf40abdec95 b/vendor/libgit2/tests/resources/typechanges/.gitted/objects/42/061c01a1c70097d1e4579f29a5adf40abdec95 deleted file mode 100644 index 0a8f32e155..0000000000 Binary files a/vendor/libgit2/tests/resources/typechanges/.gitted/objects/42/061c01a1c70097d1e4579f29a5adf40abdec95 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/typechanges/.gitted/objects/46/2838cee476a87e7cff32196b66fa18ed756592 b/vendor/libgit2/tests/resources/typechanges/.gitted/objects/46/2838cee476a87e7cff32196b66fa18ed756592 deleted file mode 100644 index 52af51f748..0000000000 Binary files a/vendor/libgit2/tests/resources/typechanges/.gitted/objects/46/2838cee476a87e7cff32196b66fa18ed756592 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/typechanges/.gitted/objects/63/499e4ea8e096b831515ceb1d5a7593e4d87ae5 b/vendor/libgit2/tests/resources/typechanges/.gitted/objects/63/499e4ea8e096b831515ceb1d5a7593e4d87ae5 deleted file mode 100644 index afafa89f4d..0000000000 Binary files a/vendor/libgit2/tests/resources/typechanges/.gitted/objects/63/499e4ea8e096b831515ceb1d5a7593e4d87ae5 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/typechanges/.gitted/objects/68/1af94e10eaf262f3ab7cb9b8fd5f4158ba4d3e b/vendor/libgit2/tests/resources/typechanges/.gitted/objects/68/1af94e10eaf262f3ab7cb9b8fd5f4158ba4d3e deleted file mode 100644 index 9e518fc28a..0000000000 Binary files a/vendor/libgit2/tests/resources/typechanges/.gitted/objects/68/1af94e10eaf262f3ab7cb9b8fd5f4158ba4d3e and /dev/null differ diff --git a/vendor/libgit2/tests/resources/typechanges/.gitted/objects/6a/9008602b811e69a9b7a2d83496f39a794fdeeb b/vendor/libgit2/tests/resources/typechanges/.gitted/objects/6a/9008602b811e69a9b7a2d83496f39a794fdeeb deleted file mode 100644 index a245727a1f..0000000000 Binary files a/vendor/libgit2/tests/resources/typechanges/.gitted/objects/6a/9008602b811e69a9b7a2d83496f39a794fdeeb and /dev/null differ diff --git a/vendor/libgit2/tests/resources/typechanges/.gitted/objects/6e/ae26c90e8ccc4d16208972119c40635489c6f0 b/vendor/libgit2/tests/resources/typechanges/.gitted/objects/6e/ae26c90e8ccc4d16208972119c40635489c6f0 deleted file mode 100644 index ea35cd3119..0000000000 Binary files a/vendor/libgit2/tests/resources/typechanges/.gitted/objects/6e/ae26c90e8ccc4d16208972119c40635489c6f0 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/typechanges/.gitted/objects/6f/39eabbb8a7541515e0d35971078bccb502e7e0 b/vendor/libgit2/tests/resources/typechanges/.gitted/objects/6f/39eabbb8a7541515e0d35971078bccb502e7e0 deleted file mode 100644 index c54817598a..0000000000 Binary files a/vendor/libgit2/tests/resources/typechanges/.gitted/objects/6f/39eabbb8a7541515e0d35971078bccb502e7e0 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/typechanges/.gitted/objects/71/54d3083461536dfc71ad5542f3e65e723a06c4 b/vendor/libgit2/tests/resources/typechanges/.gitted/objects/71/54d3083461536dfc71ad5542f3e65e723a06c4 deleted file mode 100644 index 9fdd8f245a..0000000000 Binary files a/vendor/libgit2/tests/resources/typechanges/.gitted/objects/71/54d3083461536dfc71ad5542f3e65e723a06c4 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/typechanges/.gitted/objects/75/56c1d893a4c0ca85ac8ac51de47ff399758729 b/vendor/libgit2/tests/resources/typechanges/.gitted/objects/75/56c1d893a4c0ca85ac8ac51de47ff399758729 deleted file mode 100644 index d43630f44f..0000000000 Binary files a/vendor/libgit2/tests/resources/typechanges/.gitted/objects/75/56c1d893a4c0ca85ac8ac51de47ff399758729 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/typechanges/.gitted/objects/76/fef844064c26d5e06c2508240dae661e7231b2 b/vendor/libgit2/tests/resources/typechanges/.gitted/objects/76/fef844064c26d5e06c2508240dae661e7231b2 deleted file mode 100644 index 355ce4b5b7..0000000000 Binary files a/vendor/libgit2/tests/resources/typechanges/.gitted/objects/76/fef844064c26d5e06c2508240dae661e7231b2 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/typechanges/.gitted/objects/79/b9f23e85f55ea36a472a902e875bc1121a94cb b/vendor/libgit2/tests/resources/typechanges/.gitted/objects/79/b9f23e85f55ea36a472a902e875bc1121a94cb deleted file mode 100644 index 2b07ad2569..0000000000 --- a/vendor/libgit2/tests/resources/typechanges/.gitted/objects/79/b9f23e85f55ea36a472a902e875bc1121a94cb +++ /dev/null @@ -1,2 +0,0 @@ -x•ŤA E]sŠą€f€JbŚqçÖ í`I@ -÷—ĸýyďýµäH;źZeBrž6LP«Yş%8˝˛&v‹4JmÖ˘ÔŰ^*ĽúqpJđŕ¸Âµúű;¶˝űËZň ¤žś’Ć 3ZD1Öń×úŻ)žźŘ"%ř%Ä–38_ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/typechanges/.gitted/objects/85/28da0ea65eacf1f74f9ed6696adbac547963ad b/vendor/libgit2/tests/resources/typechanges/.gitted/objects/85/28da0ea65eacf1f74f9ed6696adbac547963ad deleted file mode 100644 index 6d2da6c935..0000000000 Binary files a/vendor/libgit2/tests/resources/typechanges/.gitted/objects/85/28da0ea65eacf1f74f9ed6696adbac547963ad and /dev/null differ diff --git a/vendor/libgit2/tests/resources/typechanges/.gitted/objects/8b/3726b365824ad5a07c537247f4bc73ed7d37ea b/vendor/libgit2/tests/resources/typechanges/.gitted/objects/8b/3726b365824ad5a07c537247f4bc73ed7d37ea deleted file mode 100644 index 3dc333bc6e..0000000000 Binary files a/vendor/libgit2/tests/resources/typechanges/.gitted/objects/8b/3726b365824ad5a07c537247f4bc73ed7d37ea and /dev/null differ diff --git a/vendor/libgit2/tests/resources/typechanges/.gitted/objects/93/3e28c1c8a68838a763d250bdf0b2c6068289c3 b/vendor/libgit2/tests/resources/typechanges/.gitted/objects/93/3e28c1c8a68838a763d250bdf0b2c6068289c3 deleted file mode 100644 index 02ad0e97a9..0000000000 Binary files a/vendor/libgit2/tests/resources/typechanges/.gitted/objects/93/3e28c1c8a68838a763d250bdf0b2c6068289c3 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/typechanges/.gitted/objects/96/2710fe5b4e453e9e827945b3487c525968ec4a b/vendor/libgit2/tests/resources/typechanges/.gitted/objects/96/2710fe5b4e453e9e827945b3487c525968ec4a deleted file mode 100644 index d06b06a522..0000000000 Binary files a/vendor/libgit2/tests/resources/typechanges/.gitted/objects/96/2710fe5b4e453e9e827945b3487c525968ec4a and /dev/null differ diff --git a/vendor/libgit2/tests/resources/typechanges/.gitted/objects/96/6cf1b3598e195b31b2cde3784f9a19f0728a6f b/vendor/libgit2/tests/resources/typechanges/.gitted/objects/96/6cf1b3598e195b31b2cde3784f9a19f0728a6f deleted file mode 100644 index 5f9ffd4ed1..0000000000 Binary files a/vendor/libgit2/tests/resources/typechanges/.gitted/objects/96/6cf1b3598e195b31b2cde3784f9a19f0728a6f and /dev/null differ diff --git a/vendor/libgit2/tests/resources/typechanges/.gitted/objects/99/e8bab9ece009f0fba7eb41f850f4c12bedb9b7 b/vendor/libgit2/tests/resources/typechanges/.gitted/objects/99/e8bab9ece009f0fba7eb41f850f4c12bedb9b7 deleted file mode 100644 index ac17defac6..0000000000 Binary files a/vendor/libgit2/tests/resources/typechanges/.gitted/objects/99/e8bab9ece009f0fba7eb41f850f4c12bedb9b7 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/typechanges/.gitted/objects/9b/19edf33a03a0c59cdfc113bfa5c06179bf9b1a b/vendor/libgit2/tests/resources/typechanges/.gitted/objects/9b/19edf33a03a0c59cdfc113bfa5c06179bf9b1a deleted file mode 100644 index 7ab83aefeb..0000000000 --- a/vendor/libgit2/tests/resources/typechanges/.gitted/objects/9b/19edf33a03a0c59cdfc113bfa5c06179bf9b1a +++ /dev/null @@ -1,5 +0,0 @@ -x•ŽI -1E]箕LťTč ĽA†J·Đ¤Ó÷7WpűyďńÓ¶,źZŃ©Uf cXcR C4Ľ3Y2ć"ŁNN:ÔHÉo¨Ľ6 ,µ’žs’ňÁjf—#îk˝G›¶ -ďcßyžáÉsá -·ă§MGĽ¦mą2–´Bň -.ŇK)úÚ˙µŽţkŠ×Ö‘w8ńžCCĂ \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/typechanges/.gitted/objects/9b/db75b73836a99e3dbeea640a81de81031fdc29 b/vendor/libgit2/tests/resources/typechanges/.gitted/objects/9b/db75b73836a99e3dbeea640a81de81031fdc29 deleted file mode 100644 index aed4d81659..0000000000 Binary files a/vendor/libgit2/tests/resources/typechanges/.gitted/objects/9b/db75b73836a99e3dbeea640a81de81031fdc29 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/typechanges/.gitted/objects/9d/0235c7a7edc0889a18f97a42ee6db9fe688447 b/vendor/libgit2/tests/resources/typechanges/.gitted/objects/9d/0235c7a7edc0889a18f97a42ee6db9fe688447 deleted file mode 100644 index 3e02a41b2f..0000000000 Binary files a/vendor/libgit2/tests/resources/typechanges/.gitted/objects/9d/0235c7a7edc0889a18f97a42ee6db9fe688447 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/typechanges/.gitted/objects/9e/ffc457877f109b2a4319e14bee613a15f2a00d b/vendor/libgit2/tests/resources/typechanges/.gitted/objects/9e/ffc457877f109b2a4319e14bee613a15f2a00d deleted file mode 100644 index fb24100fc9..0000000000 Binary files a/vendor/libgit2/tests/resources/typechanges/.gitted/objects/9e/ffc457877f109b2a4319e14bee613a15f2a00d and /dev/null differ diff --git a/vendor/libgit2/tests/resources/typechanges/.gitted/objects/a0/a9bad6f6f40325198f938a0e3ae981622d7707 b/vendor/libgit2/tests/resources/typechanges/.gitted/objects/a0/a9bad6f6f40325198f938a0e3ae981622d7707 deleted file mode 100644 index b6b7db785c..0000000000 Binary files a/vendor/libgit2/tests/resources/typechanges/.gitted/objects/a0/a9bad6f6f40325198f938a0e3ae981622d7707 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/typechanges/.gitted/objects/b1/977dc4e573b812d4619754c98138c56999dc0d b/vendor/libgit2/tests/resources/typechanges/.gitted/objects/b1/977dc4e573b812d4619754c98138c56999dc0d deleted file mode 100644 index e1334057c3..0000000000 Binary files a/vendor/libgit2/tests/resources/typechanges/.gitted/objects/b1/977dc4e573b812d4619754c98138c56999dc0d and /dev/null differ diff --git a/vendor/libgit2/tests/resources/typechanges/.gitted/objects/d7/5992dd02391e128dac332dcc78d649dd9ab095 b/vendor/libgit2/tests/resources/typechanges/.gitted/objects/d7/5992dd02391e128dac332dcc78d649dd9ab095 deleted file mode 100644 index 65f1f530f6..0000000000 Binary files a/vendor/libgit2/tests/resources/typechanges/.gitted/objects/d7/5992dd02391e128dac332dcc78d649dd9ab095 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/typechanges/.gitted/objects/da/e2709d638df52212b1f43ff61797ebfedfcc7c b/vendor/libgit2/tests/resources/typechanges/.gitted/objects/da/e2709d638df52212b1f43ff61797ebfedfcc7c deleted file mode 100644 index 355faa61f1..0000000000 Binary files a/vendor/libgit2/tests/resources/typechanges/.gitted/objects/da/e2709d638df52212b1f43ff61797ebfedfcc7c and /dev/null differ diff --git a/vendor/libgit2/tests/resources/typechanges/.gitted/objects/e1/152adcb9adf37ec551ada9ba377ab53aec3bad b/vendor/libgit2/tests/resources/typechanges/.gitted/objects/e1/152adcb9adf37ec551ada9ba377ab53aec3bad deleted file mode 100644 index c68fdcfab0..0000000000 Binary files a/vendor/libgit2/tests/resources/typechanges/.gitted/objects/e1/152adcb9adf37ec551ada9ba377ab53aec3bad and /dev/null differ diff --git a/vendor/libgit2/tests/resources/typechanges/.gitted/objects/e4/ed436a9eb0f198cda722886a5f8d6d6c836b7b b/vendor/libgit2/tests/resources/typechanges/.gitted/objects/e4/ed436a9eb0f198cda722886a5f8d6d6c836b7b deleted file mode 100644 index c9229ba25d..0000000000 Binary files a/vendor/libgit2/tests/resources/typechanges/.gitted/objects/e4/ed436a9eb0f198cda722886a5f8d6d6c836b7b and /dev/null differ diff --git a/vendor/libgit2/tests/resources/typechanges/.gitted/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391 b/vendor/libgit2/tests/resources/typechanges/.gitted/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391 deleted file mode 100644 index 7112238943..0000000000 Binary files a/vendor/libgit2/tests/resources/typechanges/.gitted/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/typechanges/.gitted/objects/f2/0b79342712e0b2315647cd8227a573fd3bc46e b/vendor/libgit2/tests/resources/typechanges/.gitted/objects/f2/0b79342712e0b2315647cd8227a573fd3bc46e deleted file mode 100644 index 3962ba6b43..0000000000 Binary files a/vendor/libgit2/tests/resources/typechanges/.gitted/objects/f2/0b79342712e0b2315647cd8227a573fd3bc46e and /dev/null differ diff --git a/vendor/libgit2/tests/resources/typechanges/.gitted/objects/fd/e0147e3b59f381635a3b016e3fe6dacb70779d b/vendor/libgit2/tests/resources/typechanges/.gitted/objects/fd/e0147e3b59f381635a3b016e3fe6dacb70779d deleted file mode 100644 index e3663da9f3..0000000000 Binary files a/vendor/libgit2/tests/resources/typechanges/.gitted/objects/fd/e0147e3b59f381635a3b016e3fe6dacb70779d and /dev/null differ diff --git a/vendor/libgit2/tests/resources/typechanges/.gitted/refs/heads/master b/vendor/libgit2/tests/resources/typechanges/.gitted/refs/heads/master deleted file mode 100644 index 546481a33f..0000000000 --- a/vendor/libgit2/tests/resources/typechanges/.gitted/refs/heads/master +++ /dev/null @@ -1 +0,0 @@ -6eae26c90e8ccc4d16208972119c40635489c6f0 diff --git a/vendor/libgit2/tests/resources/typechanges/README.md b/vendor/libgit2/tests/resources/typechanges/README.md deleted file mode 100644 index 1f5a95a9fa..0000000000 --- a/vendor/libgit2/tests/resources/typechanges/README.md +++ /dev/null @@ -1,43 +0,0 @@ -This is a test repo for libgit2 where tree entries have type changes - -Types ------ - -The key types that could be found in tree entries are: - -1. GIT_FILEMODE_NEW = 0000000 (i.e. file does not exist) -2. GIT_FILEMODE_TREE = 0040000 -3. GIT_FILEMODE_BLOB = 0100644 -4. GIT_FILEMODE_BLOB_EXECUTABLE = 0100755 -5. GIT_FILEMODE_LINK = 0120000 -6. GIT_FILEMODE_COMMIT = 0160000 - -I will try to have every type of transition somewhere in the history -of this repo. - -Commits -------- - -* `a(1--1) b(1--1) c(1--1) d(1--1) e(1--1)` - **Initial commit**
- `79b9f23e85f55ea36a472a902e875bc1121a94cb` -* `a(1->2) b(1->3) c(1->4) d(1->5) e(1->6)` - **Create content**
- `9bdb75b73836a99e3dbeea640a81de81031fdc29` -* `a(2->3) b(3->4) c(4->5) d(5->6) e(6->2)` - **Changes #1**
- `0e7ed140b514b8cae23254cb8656fe1674403aff` -* `a(3->5) b(4->6) c(5->2) d(6->3) e(2->4)` - **Changes #2**
- `9d0235c7a7edc0889a18f97a42ee6db9fe688447` -* `a(5->3) b(6->4) c(2->5) d(3->6) e(4->2)` - **Changes #3**
- `9b19edf33a03a0c59cdfc113bfa5c06179bf9b1a` -* `a(3->2) b(4->3) c(5->4) d(6->5) e(2->6)` - **Changes #4**
- `1b63caae4a5ca96f78e8dfefc376c6a39a142475`
- Matches **Changes #1** except README.md -* `a(2->1) b(3->1) c(4->1) d(5->1) e(6->1)` - **Changes #5**
- `6eae26c90e8ccc4d16208972119c40635489c6f0`
- Matches **Initial commit** except README.md and .gitmodules diff --git a/vendor/libgit2/tests/resources/typechanges/gitmodules b/vendor/libgit2/tests/resources/typechanges/gitmodules deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/vendor/libgit2/tests/resources/unsymlinked.git/HEAD b/vendor/libgit2/tests/resources/unsymlinked.git/HEAD deleted file mode 100644 index cb089cd89a..0000000000 --- a/vendor/libgit2/tests/resources/unsymlinked.git/HEAD +++ /dev/null @@ -1 +0,0 @@ -ref: refs/heads/master diff --git a/vendor/libgit2/tests/resources/unsymlinked.git/config b/vendor/libgit2/tests/resources/unsymlinked.git/config deleted file mode 100644 index f57351fd54..0000000000 --- a/vendor/libgit2/tests/resources/unsymlinked.git/config +++ /dev/null @@ -1,6 +0,0 @@ -[core] - bare = true - repositoryformatversion = 0 - filemode = false - logallrefupdates = true - ignorecase = true diff --git a/vendor/libgit2/tests/resources/unsymlinked.git/description b/vendor/libgit2/tests/resources/unsymlinked.git/description deleted file mode 100644 index 498b267a8c..0000000000 --- a/vendor/libgit2/tests/resources/unsymlinked.git/description +++ /dev/null @@ -1 +0,0 @@ -Unnamed repository; edit this file 'description' to name the repository. diff --git a/vendor/libgit2/tests/resources/unsymlinked.git/info/exclude b/vendor/libgit2/tests/resources/unsymlinked.git/info/exclude deleted file mode 100644 index 6d05881d3a..0000000000 --- a/vendor/libgit2/tests/resources/unsymlinked.git/info/exclude +++ /dev/null @@ -1,2 +0,0 @@ -# File patterns to ignore; see `git help ignore` for more information. -# Lines that start with '#' are comments. diff --git a/vendor/libgit2/tests/resources/unsymlinked.git/objects/08/8b64704e0d6b8bd061dea879418cb5442a3fbf b/vendor/libgit2/tests/resources/unsymlinked.git/objects/08/8b64704e0d6b8bd061dea879418cb5442a3fbf deleted file mode 100644 index 953262fa91..0000000000 Binary files a/vendor/libgit2/tests/resources/unsymlinked.git/objects/08/8b64704e0d6b8bd061dea879418cb5442a3fbf and /dev/null differ diff --git a/vendor/libgit2/tests/resources/unsymlinked.git/objects/13/a5e939bca25940c069fd2169d993dba328e30b b/vendor/libgit2/tests/resources/unsymlinked.git/objects/13/a5e939bca25940c069fd2169d993dba328e30b deleted file mode 100644 index 91ec8fa5ee..0000000000 Binary files a/vendor/libgit2/tests/resources/unsymlinked.git/objects/13/a5e939bca25940c069fd2169d993dba328e30b and /dev/null differ diff --git a/vendor/libgit2/tests/resources/unsymlinked.git/objects/19/bf568e59e3a0b363cafb4106226e62d4a4c41c b/vendor/libgit2/tests/resources/unsymlinked.git/objects/19/bf568e59e3a0b363cafb4106226e62d4a4c41c deleted file mode 100644 index 94afd01e8a..0000000000 Binary files a/vendor/libgit2/tests/resources/unsymlinked.git/objects/19/bf568e59e3a0b363cafb4106226e62d4a4c41c and /dev/null differ diff --git a/vendor/libgit2/tests/resources/unsymlinked.git/objects/58/1fadd35b4cf320d102a152f918729011604773 b/vendor/libgit2/tests/resources/unsymlinked.git/objects/58/1fadd35b4cf320d102a152f918729011604773 deleted file mode 100644 index 5b33d027c4..0000000000 Binary files a/vendor/libgit2/tests/resources/unsymlinked.git/objects/58/1fadd35b4cf320d102a152f918729011604773 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/unsymlinked.git/objects/5c/87b6791e8b13da658a14d1ef7e09b5dc3bac8c b/vendor/libgit2/tests/resources/unsymlinked.git/objects/5c/87b6791e8b13da658a14d1ef7e09b5dc3bac8c deleted file mode 100644 index 67eb14930c..0000000000 Binary files a/vendor/libgit2/tests/resources/unsymlinked.git/objects/5c/87b6791e8b13da658a14d1ef7e09b5dc3bac8c and /dev/null differ diff --git a/vendor/libgit2/tests/resources/unsymlinked.git/objects/6f/e5f5398af85fb3de8a6aba0339b6d3bfa26a27 b/vendor/libgit2/tests/resources/unsymlinked.git/objects/6f/e5f5398af85fb3de8a6aba0339b6d3bfa26a27 deleted file mode 100644 index c1ea0de75f..0000000000 Binary files a/vendor/libgit2/tests/resources/unsymlinked.git/objects/6f/e5f5398af85fb3de8a6aba0339b6d3bfa26a27 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/unsymlinked.git/objects/7f/ccd75616ec188b8f1b23d67506a334cc34a49d b/vendor/libgit2/tests/resources/unsymlinked.git/objects/7f/ccd75616ec188b8f1b23d67506a334cc34a49d deleted file mode 100644 index 0285055638..0000000000 Binary files a/vendor/libgit2/tests/resources/unsymlinked.git/objects/7f/ccd75616ec188b8f1b23d67506a334cc34a49d and /dev/null differ diff --git a/vendor/libgit2/tests/resources/unsymlinked.git/objects/80/6999882bf91d24241e4077906b9017605eb1f3 b/vendor/libgit2/tests/resources/unsymlinked.git/objects/80/6999882bf91d24241e4077906b9017605eb1f3 deleted file mode 100644 index e866a75a6e..0000000000 Binary files a/vendor/libgit2/tests/resources/unsymlinked.git/objects/80/6999882bf91d24241e4077906b9017605eb1f3 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/unsymlinked.git/objects/83/7d176303c5005505ec1e4a30231c40930c0230 b/vendor/libgit2/tests/resources/unsymlinked.git/objects/83/7d176303c5005505ec1e4a30231c40930c0230 deleted file mode 100644 index 189ab044d0..0000000000 Binary files a/vendor/libgit2/tests/resources/unsymlinked.git/objects/83/7d176303c5005505ec1e4a30231c40930c0230 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/unsymlinked.git/objects/a8/595ccca04f40818ae0155c8f9c77a230e597b6 b/vendor/libgit2/tests/resources/unsymlinked.git/objects/a8/595ccca04f40818ae0155c8f9c77a230e597b6 deleted file mode 100644 index a2ef6be452..0000000000 --- a/vendor/libgit2/tests/resources/unsymlinked.git/objects/a8/595ccca04f40818ae0155c8f9c77a230e597b6 +++ /dev/null @@ -1,2 +0,0 @@ -x•Ž[ -Â0EýÎ*ć_“¤yÝ€{4ShZ))¸| ®ŔŻ ÎáN[ks=čKß™Á¶Ĺš¨[’ÉČQ"4&&—M*¤i/Ţ´óÚ! ‹1† S‰*ź™Ań€ŢGt)˘ň-'UŚ Ł×m‡ń7O cc¸Őą=zĺťĺ´µ;(ăPY«Ť‡+*DqŇó^çżE!Ąś*­/Î0Ż}Z?<ťŇÂPć…ĄřšČJp \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/unsymlinked.git/objects/cf/8f1cf5cce859c438d6cc067284cb5e161206e7 b/vendor/libgit2/tests/resources/unsymlinked.git/objects/cf/8f1cf5cce859c438d6cc067284cb5e161206e7 deleted file mode 100644 index ec274cb1db..0000000000 Binary files a/vendor/libgit2/tests/resources/unsymlinked.git/objects/cf/8f1cf5cce859c438d6cc067284cb5e161206e7 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/unsymlinked.git/objects/d5/278d05c8607ec420bfee4cf219fbc0eeebfd6a b/vendor/libgit2/tests/resources/unsymlinked.git/objects/d5/278d05c8607ec420bfee4cf219fbc0eeebfd6a deleted file mode 100644 index c1b6a5101a..0000000000 Binary files a/vendor/libgit2/tests/resources/unsymlinked.git/objects/d5/278d05c8607ec420bfee4cf219fbc0eeebfd6a and /dev/null differ diff --git a/vendor/libgit2/tests/resources/unsymlinked.git/objects/f4/e16fb76536591a41454194058d048d8e4dd2e9 b/vendor/libgit2/tests/resources/unsymlinked.git/objects/f4/e16fb76536591a41454194058d048d8e4dd2e9 deleted file mode 100644 index ad751adbe2..0000000000 Binary files a/vendor/libgit2/tests/resources/unsymlinked.git/objects/f4/e16fb76536591a41454194058d048d8e4dd2e9 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/unsymlinked.git/objects/f9/e65619d93fdf2673882e0a261c5e93b1a84006 b/vendor/libgit2/tests/resources/unsymlinked.git/objects/f9/e65619d93fdf2673882e0a261c5e93b1a84006 deleted file mode 100644 index f87cd42fba..0000000000 Binary files a/vendor/libgit2/tests/resources/unsymlinked.git/objects/f9/e65619d93fdf2673882e0a261c5e93b1a84006 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/unsymlinked.git/refs/heads/exe-file b/vendor/libgit2/tests/resources/unsymlinked.git/refs/heads/exe-file deleted file mode 100644 index b96ef46cac..0000000000 --- a/vendor/libgit2/tests/resources/unsymlinked.git/refs/heads/exe-file +++ /dev/null @@ -1 +0,0 @@ -a8595ccca04f40818ae0155c8f9c77a230e597b6 diff --git a/vendor/libgit2/tests/resources/unsymlinked.git/refs/heads/master b/vendor/libgit2/tests/resources/unsymlinked.git/refs/heads/master deleted file mode 100644 index 96c17ab17d..0000000000 --- a/vendor/libgit2/tests/resources/unsymlinked.git/refs/heads/master +++ /dev/null @@ -1 +0,0 @@ -7fccd75616ec188b8f1b23d67506a334cc34a49d diff --git a/vendor/libgit2/tests/resources/unsymlinked.git/refs/heads/reg-file b/vendor/libgit2/tests/resources/unsymlinked.git/refs/heads/reg-file deleted file mode 100644 index b428c00d52..0000000000 --- a/vendor/libgit2/tests/resources/unsymlinked.git/refs/heads/reg-file +++ /dev/null @@ -1 +0,0 @@ -806999882bf91d24241e4077906b9017605eb1f3 diff --git a/vendor/libgit2/tests/resources/userdiff/.gitted/HEAD b/vendor/libgit2/tests/resources/userdiff/.gitted/HEAD deleted file mode 100644 index cb089cd89a..0000000000 --- a/vendor/libgit2/tests/resources/userdiff/.gitted/HEAD +++ /dev/null @@ -1 +0,0 @@ -ref: refs/heads/master diff --git a/vendor/libgit2/tests/resources/userdiff/.gitted/config b/vendor/libgit2/tests/resources/userdiff/.gitted/config deleted file mode 100644 index 6c9406b7d9..0000000000 --- a/vendor/libgit2/tests/resources/userdiff/.gitted/config +++ /dev/null @@ -1,7 +0,0 @@ -[core] - repositoryformatversion = 0 - filemode = true - bare = false - logallrefupdates = true - ignorecase = true - precomposeunicode = true diff --git a/vendor/libgit2/tests/resources/userdiff/.gitted/description b/vendor/libgit2/tests/resources/userdiff/.gitted/description deleted file mode 100644 index 498b267a8c..0000000000 --- a/vendor/libgit2/tests/resources/userdiff/.gitted/description +++ /dev/null @@ -1 +0,0 @@ -Unnamed repository; edit this file 'description' to name the repository. diff --git a/vendor/libgit2/tests/resources/userdiff/.gitted/index b/vendor/libgit2/tests/resources/userdiff/.gitted/index deleted file mode 100644 index 548dc7bfd8..0000000000 Binary files a/vendor/libgit2/tests/resources/userdiff/.gitted/index and /dev/null differ diff --git a/vendor/libgit2/tests/resources/userdiff/.gitted/info/refs b/vendor/libgit2/tests/resources/userdiff/.gitted/info/refs deleted file mode 100644 index b0743141df..0000000000 --- a/vendor/libgit2/tests/resources/userdiff/.gitted/info/refs +++ /dev/null @@ -1 +0,0 @@ -60e3f7b244a5305e2c9fa4ef0e897f3b14f3b8dd refs/heads/master diff --git a/vendor/libgit2/tests/resources/userdiff/.gitted/objects/09/65b377c214bbe5e0d18fcdaf556df7fa7ed7c8 b/vendor/libgit2/tests/resources/userdiff/.gitted/objects/09/65b377c214bbe5e0d18fcdaf556df7fa7ed7c8 deleted file mode 100644 index cbaf4c1bc2..0000000000 Binary files a/vendor/libgit2/tests/resources/userdiff/.gitted/objects/09/65b377c214bbe5e0d18fcdaf556df7fa7ed7c8 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/userdiff/.gitted/objects/0c/20ef1409ae1df4d5a76cdbd98d5c33ccdb6bcc b/vendor/libgit2/tests/resources/userdiff/.gitted/objects/0c/20ef1409ae1df4d5a76cdbd98d5c33ccdb6bcc deleted file mode 100644 index fa149da98b..0000000000 Binary files a/vendor/libgit2/tests/resources/userdiff/.gitted/objects/0c/20ef1409ae1df4d5a76cdbd98d5c33ccdb6bcc and /dev/null differ diff --git a/vendor/libgit2/tests/resources/userdiff/.gitted/objects/39/ea75107a09091ba54ff86fcc780b59477e42cd b/vendor/libgit2/tests/resources/userdiff/.gitted/objects/39/ea75107a09091ba54ff86fcc780b59477e42cd deleted file mode 100644 index 748373621c..0000000000 Binary files a/vendor/libgit2/tests/resources/userdiff/.gitted/objects/39/ea75107a09091ba54ff86fcc780b59477e42cd and /dev/null differ diff --git a/vendor/libgit2/tests/resources/userdiff/.gitted/objects/3c/c08384deae5957247bc36776ab626cc9e0582b b/vendor/libgit2/tests/resources/userdiff/.gitted/objects/3c/c08384deae5957247bc36776ab626cc9e0582b deleted file mode 100644 index 29b72fbbca..0000000000 Binary files a/vendor/libgit2/tests/resources/userdiff/.gitted/objects/3c/c08384deae5957247bc36776ab626cc9e0582b and /dev/null differ diff --git a/vendor/libgit2/tests/resources/userdiff/.gitted/objects/46/8d6f2afc940e14c76347fa9af26e429a3c9044 b/vendor/libgit2/tests/resources/userdiff/.gitted/objects/46/8d6f2afc940e14c76347fa9af26e429a3c9044 deleted file mode 100644 index 5fc839170c..0000000000 Binary files a/vendor/libgit2/tests/resources/userdiff/.gitted/objects/46/8d6f2afc940e14c76347fa9af26e429a3c9044 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/userdiff/.gitted/objects/53/917973acfe0111f93c2cfaacf854be245880e8 b/vendor/libgit2/tests/resources/userdiff/.gitted/objects/53/917973acfe0111f93c2cfaacf854be245880e8 deleted file mode 100644 index debf7e40f9..0000000000 Binary files a/vendor/libgit2/tests/resources/userdiff/.gitted/objects/53/917973acfe0111f93c2cfaacf854be245880e8 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/userdiff/.gitted/objects/63/1d44e0c72e8cd1b594fa11d7d1ee8a6d67ff67 b/vendor/libgit2/tests/resources/userdiff/.gitted/objects/63/1d44e0c72e8cd1b594fa11d7d1ee8a6d67ff67 deleted file mode 100644 index e8b884cd59..0000000000 Binary files a/vendor/libgit2/tests/resources/userdiff/.gitted/objects/63/1d44e0c72e8cd1b594fa11d7d1ee8a6d67ff67 and /dev/null differ diff --git a/vendor/libgit2/tests/resources/userdiff/.gitted/objects/f3/be389d351e4bcc6dcc4b5fe22134ef0f63f8bd b/vendor/libgit2/tests/resources/userdiff/.gitted/objects/f3/be389d351e4bcc6dcc4b5fe22134ef0f63f8bd deleted file mode 100644 index cfbef992da..0000000000 Binary files a/vendor/libgit2/tests/resources/userdiff/.gitted/objects/f3/be389d351e4bcc6dcc4b5fe22134ef0f63f8bd and /dev/null differ diff --git a/vendor/libgit2/tests/resources/userdiff/.gitted/objects/info/packs b/vendor/libgit2/tests/resources/userdiff/.gitted/objects/info/packs deleted file mode 100644 index 0c5fc2a30b..0000000000 --- a/vendor/libgit2/tests/resources/userdiff/.gitted/objects/info/packs +++ /dev/null @@ -1,2 +0,0 @@ -P pack-1652578900ac63564f2a24b9714529821276ceb9.pack - diff --git a/vendor/libgit2/tests/resources/userdiff/.gitted/objects/pack/pack-1652578900ac63564f2a24b9714529821276ceb9.idx b/vendor/libgit2/tests/resources/userdiff/.gitted/objects/pack/pack-1652578900ac63564f2a24b9714529821276ceb9.idx deleted file mode 100644 index 6f4381cc71..0000000000 Binary files a/vendor/libgit2/tests/resources/userdiff/.gitted/objects/pack/pack-1652578900ac63564f2a24b9714529821276ceb9.idx and /dev/null differ diff --git a/vendor/libgit2/tests/resources/userdiff/.gitted/objects/pack/pack-1652578900ac63564f2a24b9714529821276ceb9.pack b/vendor/libgit2/tests/resources/userdiff/.gitted/objects/pack/pack-1652578900ac63564f2a24b9714529821276ceb9.pack deleted file mode 100644 index 39bd1d8f0b..0000000000 Binary files a/vendor/libgit2/tests/resources/userdiff/.gitted/objects/pack/pack-1652578900ac63564f2a24b9714529821276ceb9.pack and /dev/null differ diff --git a/vendor/libgit2/tests/resources/userdiff/.gitted/packed-refs b/vendor/libgit2/tests/resources/userdiff/.gitted/packed-refs deleted file mode 100644 index 802f67ce0e..0000000000 --- a/vendor/libgit2/tests/resources/userdiff/.gitted/packed-refs +++ /dev/null @@ -1,2 +0,0 @@ -# pack-refs with: peeled fully-peeled -60e3f7b244a5305e2c9fa4ef0e897f3b14f3b8dd refs/heads/master diff --git a/vendor/libgit2/tests/resources/userdiff/.gitted/refs/dummy-marker.txt b/vendor/libgit2/tests/resources/userdiff/.gitted/refs/dummy-marker.txt deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/vendor/libgit2/tests/resources/userdiff/after/file.html b/vendor/libgit2/tests/resources/userdiff/after/file.html deleted file mode 100644 index 2320e2f1e4..0000000000 --- a/vendor/libgit2/tests/resources/userdiff/after/file.html +++ /dev/null @@ -1,41 +0,0 @@ - - -

-
    -
  1. item 1.1
  2. -
  3. item 1.2 changed
  4. -
  5. item 1.3 changed
  6. -
  7. item 1.4
  8. -
  9. item 1.5
  10. -
  11. item 1.6
  12. -
  13. item 1.7
  14. -
  15. item 1.8
  16. -
  17. item 1.9
  18. -
  19. item 1.10 added
  20. -
-

-

-
    -
  1. item 2.1
  2. -
  3. item 2.2
  4. -
  5. item 2.3
  6. -
  7. item 2.4
  8. -
  9. item 2.5
  10. -
  11. item 2.6
  12. -
  13. item 2.7 changed
  14. -
  15. item 2.7.1 added
  16. -
  17. item 2.8
  18. -
-

-

-
    -
  1. item 3.1
  2. -
  3. item 3.2
  4. -
  5. item 3.3
  6. -
  7. item 3.4
  8. -
  9. item 3.5
  10. -
  11. item 3.6
  12. -
-

- - diff --git a/vendor/libgit2/tests/resources/userdiff/after/file.javascript b/vendor/libgit2/tests/resources/userdiff/after/file.javascript deleted file mode 100644 index 53917973ac..0000000000 --- a/vendor/libgit2/tests/resources/userdiff/after/file.javascript +++ /dev/null @@ -1,108 +0,0 @@ -define(function(require, exports, module) { - module.exports = Player; - - var Key = require("./key") - , Direction = require("./direction"); - - function Player(game) { - this.game = game; - - this.image = new Image("./assets/fighter.png"); - this.game.resources.add(this.image); - - this.x = 0; - this.y = 0; - - this.pixelX = 10; - this.pixelY = 10; - - this.animationStep = 0; - } - - Player.prototype.update = function() { - if (!this.isWalking()) { - this.handleInput(); - } - - if (this.isWalking()) { - // Increase the animation step. - this.animationStep = ++this.animationStep % 60; - - if (this.x * 32 > this.pixelX) { - this.pixelX++; - } else if (this.x * 32 < this.pixelX) { - this.pixelX--; - } - - if (this.y * 32 > this.pixelY) { - this.pixelY++; - } else if (this.y * 32 < this.pixelY) { - this.pixelY--; - } - } else { - // Reset the animation step. - this.animationStep = 0; - } - }; - - Player.prototype.handleInput = function() { - var keyboard = this.game.keyboard, finalAction, action, inputs = { - 'moveDown': keyboard.isDown(Key.DOWN), - 'moveUp': keyboard.isDown(Key.UP), - 'moveLeft': keyboard.isDown(Key.LEFT), - 'moveRight': keyboard.isDown(Key.RIGHT) - }; - - for (action in inputs) { - if (inputs[action]) { - if (!finalAction || inputs[finalAction] < inputs[action]) { - finalAction = action; - } - } - } - - this[finalAction] && this[finalAction](); - }; - - Player.prototype.isWalking = function() { - return this.x * 32 != this.pixelX || this.y * 32 != this.pixelY; - }; - - Player.prototype.moveDown = function() { - this.y += 1; - this.direction = Direction.DOWN; - }; - - Player.prototype.moveUp = function() { - this.y -= 1; - this.direction = Direction.UP; - }; - - Player.prototype.moveLeft = function() { - this.x -= 5; - this.direction = Direction.LEFT; - }; - - Player.prototype.moveRight = function() { - this.x += 1; - this.direction = Direction.RIGHT; - }; - - Player.prototype.draw = function(context) { - var offsetX = Math.floor(this.animationStep / 15) * 32, offsetY = 0; - - switch(this.direction) { - case Direction.UP: - offsetY = 48 * 3; - break; - case Direction.RIGHT: - offsetY = 48 * 2; - break; - case Direction.LEFT: - offsetY = 48; - break; - } - - context.drawImage(this.image.data, offsetX, offsetY, 32, 48, this.pixelX, this.pixelY, 32, 48); - }; -}); diff --git a/vendor/libgit2/tests/resources/userdiff/after/file.php b/vendor/libgit2/tests/resources/userdiff/after/file.php deleted file mode 100644 index 967d6466ca..0000000000 --- a/vendor/libgit2/tests/resources/userdiff/after/file.php +++ /dev/null @@ -1,50 +0,0 @@ -unique() - */ -class UniqueGenerator -{ - protected $generator; - protected $maxRetries; - protected $moreStuff; - protected $uniques = array(); - - public function __construct(Generator $generator, $maxRetries) - { - $this->generator = $generator; - $this->maxRetries = $maxRetries + 1; - } - - /** - * Catch and proxy all generator calls but return only unique values - */ - public function __get($attribute) - { - return $this->__call($attribute, array()); - } - - /** - * Catch and proxy all generator calls with arguments but return only unique values - */ - public function __call($name, $arguments) - { - $i = 0; - if (!isset($this->uniques[$name])) { - $this->uniques[$name] = array(); - } - do { - $res = call_user_func_array(array($this->generator, $name), $arguments); - $i++; - if ($i >= $this->maxRetries) { - throw new \OverflowException(sprintf('Maximum retries of %d reached without finding a unique value', $this->maxRetries)); - } - } while (in_array($res, $this->uniques[$name])); - $this->uniques[$name][]= $res; - - return $res; - } -} diff --git a/vendor/libgit2/tests/resources/userdiff/before/file.html b/vendor/libgit2/tests/resources/userdiff/before/file.html deleted file mode 100644 index 872d19663f..0000000000 --- a/vendor/libgit2/tests/resources/userdiff/before/file.html +++ /dev/null @@ -1,41 +0,0 @@ - - -

-
    -
  1. item 1.1
  2. -
  3. item 1.2
  4. -
  5. item 1.3
  6. -
  7. item 1.4
  8. -
  9. item 1.5
  10. -
  11. item 1.6
  12. -
  13. item 1.7
  14. -
  15. item 1.8
  16. -
  17. item 1.9
  18. -
-

-

-
    -
  1. item 2.1
  2. -
  3. item 2.2
  4. -
  5. item 2.3
  6. -
  7. item 2.4
  8. -
  9. item 2.5
  10. -
  11. item 2.6
  12. -
  13. item 2.7
  14. -
  15. item 2.8
  16. -
-

-

-
    -
  1. item 3.1
  2. -
  3. item 3.2
  4. -
  5. item 3.3
  6. -
  7. item 3.4
  8. -
  9. item 3.5
  10. -
  11. item 3.6
  12. -
  13. item 3.7
  14. -
  15. item 3.8
  16. -
-

- - diff --git a/vendor/libgit2/tests/resources/userdiff/before/file.javascript b/vendor/libgit2/tests/resources/userdiff/before/file.javascript deleted file mode 100644 index 0965b377c2..0000000000 --- a/vendor/libgit2/tests/resources/userdiff/before/file.javascript +++ /dev/null @@ -1,109 +0,0 @@ -define(function(require, exports, module) { - module.exports = Player; - - var Key = require("./key") - , Direction = require("./direction") - , Image = require("./image"); - - function Player(game) { - this.game = game; - - this.image = new Image("./assets/fighter.png"); - this.game.resources.add(this.image); - - this.x = 0; - this.y = 0; - - this.pixelX = 0; - this.pixelY = 0; - - this.animationStep = 0; - } - - Player.prototype.update = function() { - if (!this.isWalking()) { - this.handleInput(); - } - - if (this.isWalking()) { - // Increase the animation step. - this.animationStep = ++this.animationStep % 60; - - if (this.x * 32 > this.pixelX) { - this.pixelX++; - } else if (this.x * 32 < this.pixelX) { - this.pixelX--; - } - - if (this.y * 32 > this.pixelY) { - this.pixelY++; - } else if (this.y * 32 < this.pixelY) { - this.pixelY--; - } - } else { - // Reset the animation step. - this.animationStep = 0; - } - }; - - Player.prototype.handleInput = function() { - var keyboard = this.game.keyboard, finalAction, action, inputs = { - 'moveDown': keyboard.isDown(Key.DOWN), - 'moveUp': keyboard.isDown(Key.UP), - 'moveLeft': keyboard.isDown(Key.LEFT), - 'moveRight': keyboard.isDown(Key.RIGHT) - }; - - for (action in inputs) { - if (inputs[action]) { - if (!finalAction || inputs[finalAction] < inputs[action]) { - finalAction = action; - } - } - } - - this[finalAction] && this[finalAction](); - }; - - Player.prototype.isWalking = function() { - return this.x * 32 != this.pixelX || this.y * 32 != this.pixelY; - }; - - Player.prototype.moveDown = function() { - this.y += 1; - this.direction = Direction.DOWN; - }; - - Player.prototype.moveUp = function() { - this.y -= 1; - this.direction = Direction.UP; - }; - - Player.prototype.moveLeft = function() { - this.x -= 1; - this.direction = Direction.LEFT; - }; - - Player.prototype.moveRight = function() { - this.x += 1; - this.direction = Direction.RIGHT; - }; - - Player.prototype.draw = function(context) { - var offsetX = Math.floor(this.animationStep / 15) * 32, offsetY = 0; - - switch(this.direction) { - case Direction.UP: - offsetY = 48 * 3; - break; - case Direction.RIGHT: - offsetY = 48 * 2; - break; - case Direction.LEFT: - offsetY = 48; - break; - } - - context.drawImage(this.image.data, offsetX, offsetY, 32, 48, this.pixelX, this.pixelY - 16, 32, 48); - }; -}); diff --git a/vendor/libgit2/tests/resources/userdiff/before/file.php b/vendor/libgit2/tests/resources/userdiff/before/file.php deleted file mode 100644 index 63250ad019..0000000000 --- a/vendor/libgit2/tests/resources/userdiff/before/file.php +++ /dev/null @@ -1,49 +0,0 @@ -unique() - */ -class UniqueGenerator -{ - protected $generator; - protected $maxRetries; - protected $uniques = array(); - - public function __construct(Generator $generator, $maxRetries) - { - $this->generator = $generator; - $this->maxRetries = $maxRetries; - } - - /** - * Catch and proxy all generator calls but return only unique values - */ - public function __get($attribute) - { - return $this->__call($attribute, array()); - } - - /** - * Catch and proxy all generator calls with arguments but return only unique values - */ - public function __call($name, $arguments) - { - if (!isset($this->uniques[$name])) { - $this->uniques[$name] = array(); - } - $i = 0; - do { - $res = call_user_func_array(array($this->generator, $name), $arguments); - $i++; - if ($i > $this->maxRetries) { - throw new \OverflowException(sprintf('Maximum retries of %d reached without finding a unique value', $this->maxRetries)); - } - } while (in_array($res, $this->uniques[$name])); - $this->uniques[$name][]= $res; - - return $res; - } -} diff --git a/vendor/libgit2/tests/resources/userdiff/expected/driver/diff.html b/vendor/libgit2/tests/resources/userdiff/expected/driver/diff.html deleted file mode 100644 index 5a428e7dcf..0000000000 --- a/vendor/libgit2/tests/resources/userdiff/expected/driver/diff.html +++ /dev/null @@ -1,26 +0,0 @@ -diff --git a/files/file.html b/files/file.html -index 872d196..2320e2f 100644 ---- a/files/file.html -+++ b/files/file.html -@@ -5,4 +5,4 @@

-
  • item 1.1
  • --
  • item 1.2
  • --
  • item 1.3
  • -+
  • item 1.2 changed
  • -+
  • item 1.3 changed
  • -
  • item 1.4
  • -@@ -13,2 +13,3 @@

    -
  • item 1.9
  • -+
  • item 1.10 added
  • - -@@ -23,3 +24,4 @@

    -
  • item 2.6
  • --
  • item 2.7
  • -+
  • item 2.7 changed
  • -+
  • item 2.7.1 added
  • -
  • item 2.8
  • -@@ -35,4 +37,2 @@

    -
  • item 3.6
  • --
  • item 3.7
  • --
  • item 3.8
  • - diff --git a/vendor/libgit2/tests/resources/userdiff/expected/driver/diff.javascript b/vendor/libgit2/tests/resources/userdiff/expected/driver/diff.javascript deleted file mode 100644 index 4cefe5cff6..0000000000 --- a/vendor/libgit2/tests/resources/userdiff/expected/driver/diff.javascript +++ /dev/null @@ -1,27 +0,0 @@ -diff --git a/files/file.javascript b/files/file.javascript -index 0965b37..5391797 100644 ---- a/files/file.javascript -+++ b/files/file.javascript -@@ -4,4 +4,3 @@ function(require, exports, module) - var Key = require("./key") -- , Direction = require("./direction") -- , Image = require("./image"); -+ , Direction = require("./direction"); - -@@ -16,4 +15,4 @@ function Player(game) - -- this.pixelX = 0; -- this.pixelY = 0; -+ this.pixelX = 10; -+ this.pixelY = 10; - -@@ -82,3 +81,3 @@ Player.prototype.moveUp = function() - Player.prototype.moveLeft = function() { -- this.x -= 1; -+ this.x -= 5; - this.direction = Direction.LEFT; -@@ -106,3 +105,3 @@ Player.prototype.draw = function(context) - -- context.drawImage(this.image.data, offsetX, offsetY, 32, 48, this.pixelX, this.pixelY - 16, 32, 48); -+ context.drawImage(this.image.data, offsetX, offsetY, 32, 48, this.pixelX, this.pixelY, 32, 48); - }; diff --git a/vendor/libgit2/tests/resources/userdiff/expected/driver/diff.php b/vendor/libgit2/tests/resources/userdiff/expected/driver/diff.php deleted file mode 100644 index 9711b5b3e9..0000000000 --- a/vendor/libgit2/tests/resources/userdiff/expected/driver/diff.php +++ /dev/null @@ -1,26 +0,0 @@ -diff --git a/files/file.php b/files/file.php -index 63250ad..967d646 100644 ---- a/files/file.php -+++ b/files/file.php -@@ -12,2 +12,3 @@ class UniqueGenerator - protected $maxRetries; -+ protected $moreStuff; - protected $uniques = array(); -@@ -17,3 +18,3 @@ public function __construct(Generator $generator, $maxRetries) - $this->generator = $generator; -- $this->maxRetries = $maxRetries; -+ $this->maxRetries = $maxRetries + 1; - } -@@ -33,10 +34,10 @@ public function __call($name, $arguments) - { -+ $i = 0; - if (!isset($this->uniques[$name])) { - $this->uniques[$name] = array(); - } -- $i = 0; - do { - $res = call_user_func_array(array($this->generator, $name), $arguments); - $i++; -- if ($i > $this->maxRetries) { -+ if ($i >= $this->maxRetries) { - throw new \OverflowException(sprintf('Maximum retries of %d reached without finding a unique value', $this->maxRetries)); diff --git a/vendor/libgit2/tests/resources/userdiff/expected/nodriver/diff.html b/vendor/libgit2/tests/resources/userdiff/expected/nodriver/diff.html deleted file mode 100644 index 2ea4b8a16d..0000000000 --- a/vendor/libgit2/tests/resources/userdiff/expected/nodriver/diff.html +++ /dev/null @@ -1,26 +0,0 @@ -diff --git a/files/file.html b/files/file.html -index 872d196..2320e2f 100644 ---- a/files/file.html -+++ b/files/file.html -@@ -5,4 +5,4 @@ -
  • item 1.1
  • --
  • item 1.2
  • --
  • item 1.3
  • -+
  • item 1.2 changed
  • -+
  • item 1.3 changed
  • -
  • item 1.4
  • -@@ -13,2 +13,3 @@ -
  • item 1.9
  • -+
  • item 1.10 added
  • - -@@ -23,3 +24,4 @@ -
  • item 2.6
  • --
  • item 2.7
  • -+
  • item 2.7 changed
  • -+
  • item 2.7.1 added
  • -
  • item 2.8
  • -@@ -35,4 +37,2 @@ -
  • item 3.6
  • --
  • item 3.7
  • --
  • item 3.8
  • - diff --git a/vendor/libgit2/tests/resources/userdiff/expected/nodriver/diff.javascript b/vendor/libgit2/tests/resources/userdiff/expected/nodriver/diff.javascript deleted file mode 100644 index 4bbd547644..0000000000 --- a/vendor/libgit2/tests/resources/userdiff/expected/nodriver/diff.javascript +++ /dev/null @@ -1,27 +0,0 @@ -diff --git a/files/file.javascript b/files/file.javascript -index 0965b37..5391797 100644 ---- a/files/file.javascript -+++ b/files/file.javascript -@@ -4,4 +4,3 @@ define(function(require, exports, module) { - var Key = require("./key") -- , Direction = require("./direction") -- , Image = require("./image"); -+ , Direction = require("./direction"); - -@@ -16,4 +15,4 @@ define(function(require, exports, module) { - -- this.pixelX = 0; -- this.pixelY = 0; -+ this.pixelX = 10; -+ this.pixelY = 10; - -@@ -82,3 +81,3 @@ define(function(require, exports, module) { - Player.prototype.moveLeft = function() { -- this.x -= 1; -+ this.x -= 5; - this.direction = Direction.LEFT; -@@ -106,3 +105,3 @@ define(function(require, exports, module) { - -- context.drawImage(this.image.data, offsetX, offsetY, 32, 48, this.pixelX, this.pixelY - 16, 32, 48); -+ context.drawImage(this.image.data, offsetX, offsetY, 32, 48, this.pixelX, this.pixelY, 32, 48); - }; diff --git a/vendor/libgit2/tests/resources/userdiff/expected/nodriver/diff.php b/vendor/libgit2/tests/resources/userdiff/expected/nodriver/diff.php deleted file mode 100644 index e77c094aaf..0000000000 --- a/vendor/libgit2/tests/resources/userdiff/expected/nodriver/diff.php +++ /dev/null @@ -1,26 +0,0 @@ -diff --git a/files/file.php b/files/file.php -index 63250ad..967d646 100644 ---- a/files/file.php -+++ b/files/file.php -@@ -12,2 +12,3 @@ class UniqueGenerator - protected $maxRetries; -+ protected $moreStuff; - protected $uniques = array(); -@@ -17,3 +18,3 @@ class UniqueGenerator - $this->generator = $generator; -- $this->maxRetries = $maxRetries; -+ $this->maxRetries = $maxRetries + 1; - } -@@ -33,10 +34,10 @@ class UniqueGenerator - { -+ $i = 0; - if (!isset($this->uniques[$name])) { - $this->uniques[$name] = array(); - } -- $i = 0; - do { - $res = call_user_func_array(array($this->generator, $name), $arguments); - $i++; -- if ($i > $this->maxRetries) { -+ if ($i >= $this->maxRetries) { - throw new \OverflowException(sprintf('Maximum retries of %d reached without finding a unique value', $this->maxRetries)); diff --git a/vendor/libgit2/tests/resources/userdiff/files/file.html b/vendor/libgit2/tests/resources/userdiff/files/file.html deleted file mode 100644 index 2320e2f1e4..0000000000 --- a/vendor/libgit2/tests/resources/userdiff/files/file.html +++ /dev/null @@ -1,41 +0,0 @@ - - -

    -
      -
    1. item 1.1
    2. -
    3. item 1.2 changed
    4. -
    5. item 1.3 changed
    6. -
    7. item 1.4
    8. -
    9. item 1.5
    10. -
    11. item 1.6
    12. -
    13. item 1.7
    14. -
    15. item 1.8
    16. -
    17. item 1.9
    18. -
    19. item 1.10 added
    20. -
    -

    -

    -
      -
    1. item 2.1
    2. -
    3. item 2.2
    4. -
    5. item 2.3
    6. -
    7. item 2.4
    8. -
    9. item 2.5
    10. -
    11. item 2.6
    12. -
    13. item 2.7 changed
    14. -
    15. item 2.7.1 added
    16. -
    17. item 2.8
    18. -
    -

    -

    -
      -
    1. item 3.1
    2. -
    3. item 3.2
    4. -
    5. item 3.3
    6. -
    7. item 3.4
    8. -
    9. item 3.5
    10. -
    11. item 3.6
    12. -
    -

    - - diff --git a/vendor/libgit2/tests/resources/userdiff/files/file.javascript b/vendor/libgit2/tests/resources/userdiff/files/file.javascript deleted file mode 100644 index 53917973ac..0000000000 --- a/vendor/libgit2/tests/resources/userdiff/files/file.javascript +++ /dev/null @@ -1,108 +0,0 @@ -define(function(require, exports, module) { - module.exports = Player; - - var Key = require("./key") - , Direction = require("./direction"); - - function Player(game) { - this.game = game; - - this.image = new Image("./assets/fighter.png"); - this.game.resources.add(this.image); - - this.x = 0; - this.y = 0; - - this.pixelX = 10; - this.pixelY = 10; - - this.animationStep = 0; - } - - Player.prototype.update = function() { - if (!this.isWalking()) { - this.handleInput(); - } - - if (this.isWalking()) { - // Increase the animation step. - this.animationStep = ++this.animationStep % 60; - - if (this.x * 32 > this.pixelX) { - this.pixelX++; - } else if (this.x * 32 < this.pixelX) { - this.pixelX--; - } - - if (this.y * 32 > this.pixelY) { - this.pixelY++; - } else if (this.y * 32 < this.pixelY) { - this.pixelY--; - } - } else { - // Reset the animation step. - this.animationStep = 0; - } - }; - - Player.prototype.handleInput = function() { - var keyboard = this.game.keyboard, finalAction, action, inputs = { - 'moveDown': keyboard.isDown(Key.DOWN), - 'moveUp': keyboard.isDown(Key.UP), - 'moveLeft': keyboard.isDown(Key.LEFT), - 'moveRight': keyboard.isDown(Key.RIGHT) - }; - - for (action in inputs) { - if (inputs[action]) { - if (!finalAction || inputs[finalAction] < inputs[action]) { - finalAction = action; - } - } - } - - this[finalAction] && this[finalAction](); - }; - - Player.prototype.isWalking = function() { - return this.x * 32 != this.pixelX || this.y * 32 != this.pixelY; - }; - - Player.prototype.moveDown = function() { - this.y += 1; - this.direction = Direction.DOWN; - }; - - Player.prototype.moveUp = function() { - this.y -= 1; - this.direction = Direction.UP; - }; - - Player.prototype.moveLeft = function() { - this.x -= 5; - this.direction = Direction.LEFT; - }; - - Player.prototype.moveRight = function() { - this.x += 1; - this.direction = Direction.RIGHT; - }; - - Player.prototype.draw = function(context) { - var offsetX = Math.floor(this.animationStep / 15) * 32, offsetY = 0; - - switch(this.direction) { - case Direction.UP: - offsetY = 48 * 3; - break; - case Direction.RIGHT: - offsetY = 48 * 2; - break; - case Direction.LEFT: - offsetY = 48; - break; - } - - context.drawImage(this.image.data, offsetX, offsetY, 32, 48, this.pixelX, this.pixelY, 32, 48); - }; -}); diff --git a/vendor/libgit2/tests/resources/userdiff/files/file.php b/vendor/libgit2/tests/resources/userdiff/files/file.php deleted file mode 100644 index 967d6466ca..0000000000 --- a/vendor/libgit2/tests/resources/userdiff/files/file.php +++ /dev/null @@ -1,50 +0,0 @@ -unique() - */ -class UniqueGenerator -{ - protected $generator; - protected $maxRetries; - protected $moreStuff; - protected $uniques = array(); - - public function __construct(Generator $generator, $maxRetries) - { - $this->generator = $generator; - $this->maxRetries = $maxRetries + 1; - } - - /** - * Catch and proxy all generator calls but return only unique values - */ - public function __get($attribute) - { - return $this->__call($attribute, array()); - } - - /** - * Catch and proxy all generator calls with arguments but return only unique values - */ - public function __call($name, $arguments) - { - $i = 0; - if (!isset($this->uniques[$name])) { - $this->uniques[$name] = array(); - } - do { - $res = call_user_func_array(array($this->generator, $name), $arguments); - $i++; - if ($i >= $this->maxRetries) { - throw new \OverflowException(sprintf('Maximum retries of %d reached without finding a unique value', $this->maxRetries)); - } - } while (in_array($res, $this->uniques[$name])); - $this->uniques[$name][]= $res; - - return $res; - } -} diff --git a/vendor/libgit2/tests/revert/bare.c b/vendor/libgit2/tests/revert/bare.c deleted file mode 100644 index 206c86d70c..0000000000 --- a/vendor/libgit2/tests/revert/bare.c +++ /dev/null @@ -1,107 +0,0 @@ -#include "clar.h" -#include "clar_libgit2.h" - -#include "buffer.h" -#include "fileops.h" -#include "git2/revert.h" - -#include "../merge/merge_helpers.h" - -#define TEST_REPO_PATH "revert" - -static git_repository *repo; - -// Fixture setup and teardown -void test_revert_bare__initialize(void) -{ - repo = cl_git_sandbox_init(TEST_REPO_PATH); -} - -void test_revert_bare__cleanup(void) -{ - cl_git_sandbox_cleanup(); -} - -void test_revert_bare__automerge(void) -{ - git_commit *head_commit, *revert_commit; - git_oid head_oid, revert_oid; - git_index *index; - - struct merge_index_entry merge_index_entries[] = { - { 0100644, "caf99de3a49827117bb66721010eac461b06a80c", 0, "file1.txt" }, - { 0100644, "0ab09ea6d4c3634bdf6c221626d8b6f7dd890767", 0, "file2.txt" }, - { 0100644, "f4e107c230d08a60fb419d19869f1f282b272d9c", 0, "file3.txt" }, - { 0100644, "0f5bfcf58c558d865da6be0281d7795993646cee", 0, "file6.txt" }, - }; - - git_oid_fromstr(&head_oid, "72333f47d4e83616630ff3b0ffe4c0faebcc3c45"); - cl_git_pass(git_commit_lookup(&head_commit, repo, &head_oid)); - - git_oid_fromstr(&revert_oid, "d1d403d22cbe24592d725f442835cf46fe60c8ac"); - cl_git_pass(git_commit_lookup(&revert_commit, repo, &revert_oid)); - - cl_git_pass(git_revert_commit(&index, repo, revert_commit, head_commit, 0, NULL)); - cl_assert(merge_test_index(index, merge_index_entries, 4)); - - git_commit_free(revert_commit); - git_commit_free(head_commit); - git_index_free(index); -} - -void test_revert_bare__conflicts(void) -{ - git_reference *head_ref; - git_commit *head_commit, *revert_commit; - git_oid revert_oid; - git_index *index; - - struct merge_index_entry merge_index_entries[] = { - { 0100644, "7731926a337c4eaba1e2187d90ebfa0a93659382", 1, "file1.txt" }, - { 0100644, "4b8fcff56437e60f58e9a6bc630dd242ebf6ea2c", 2, "file1.txt" }, - { 0100644, "3a3ef367eaf3fe79effbfb0a56b269c04c2b59fe", 3, "file1.txt" }, - { 0100644, "0ab09ea6d4c3634bdf6c221626d8b6f7dd890767", 0, "file2.txt" }, - { 0100644, "f4e107c230d08a60fb419d19869f1f282b272d9c", 0, "file3.txt" }, - { 0100644, "0f5bfcf58c558d865da6be0281d7795993646cee", 0, "file6.txt" }, - }; - - git_oid_fromstr(&revert_oid, "72333f47d4e83616630ff3b0ffe4c0faebcc3c45"); - - cl_git_pass(git_repository_head(&head_ref, repo)); - cl_git_pass(git_reference_peel((git_object **)&head_commit, head_ref, GIT_OBJ_COMMIT)); - - cl_git_pass(git_commit_lookup(&revert_commit, repo, &revert_oid)); - cl_git_pass(git_revert_commit(&index, repo, revert_commit, head_commit, 0, NULL)); - - cl_assert(git_index_has_conflicts(index)); - cl_assert(merge_test_index(index, merge_index_entries, 6)); - - git_commit_free(revert_commit); - git_commit_free(head_commit); - git_reference_free(head_ref); - git_index_free(index); -} - -void test_revert_bare__orphan(void) -{ - git_commit *head_commit, *revert_commit; - git_oid head_oid, revert_oid; - git_index *index; - - struct merge_index_entry merge_index_entries[] = { - { 0100644, "296a6d3be1dff05c5d1f631d2459389fa7b619eb", 0, "file-mainline.txt" }, - }; - - git_oid_fromstr(&head_oid, "39467716290f6df775a91cdb9a4eb39295018145"); - cl_git_pass(git_commit_lookup(&head_commit, repo, &head_oid)); - - git_oid_fromstr(&revert_oid, "ebb03002cee5d66c7732dd06241119fe72ab96a5"); - cl_git_pass(git_commit_lookup(&revert_commit, repo, &revert_oid)); - - cl_git_pass(git_revert_commit(&index, repo, revert_commit, head_commit, 0, NULL)); - cl_assert(merge_test_index(index, merge_index_entries, 1)); - - git_commit_free(revert_commit); - git_commit_free(head_commit); - git_index_free(index); -} diff --git a/vendor/libgit2/tests/revert/workdir.c b/vendor/libgit2/tests/revert/workdir.c deleted file mode 100644 index 9f83bd8424..0000000000 --- a/vendor/libgit2/tests/revert/workdir.c +++ /dev/null @@ -1,577 +0,0 @@ -#include "clar.h" -#include "clar_libgit2.h" - -#include "buffer.h" -#include "fileops.h" -#include "git2/revert.h" - -#include "../merge/merge_helpers.h" - -#define TEST_REPO_PATH "revert" - -static git_repository *repo; -static git_index *repo_index; - -// Fixture setup and teardown -void test_revert_workdir__initialize(void) -{ - git_config *cfg; - - repo = cl_git_sandbox_init(TEST_REPO_PATH); - git_repository_index(&repo_index, repo); - - /* Ensure that the user's merge.conflictstyle doesn't interfere */ - cl_git_pass(git_repository_config(&cfg, repo)); - cl_git_pass(git_config_set_string(cfg, "merge.conflictstyle", "merge")); - git_config_free(cfg); -} - -void test_revert_workdir__cleanup(void) -{ - git_index_free(repo_index); - cl_git_sandbox_cleanup(); -} - -/* git reset --hard 72333f47d4e83616630ff3b0ffe4c0faebcc3c45 - * git revert --no-commit d1d403d22cbe24592d725f442835cf46fe60c8ac */ -void test_revert_workdir__automerge(void) -{ - git_commit *head, *commit; - git_oid head_oid, revert_oid; - - struct merge_index_entry merge_index_entries[] = { - { 0100644, "caf99de3a49827117bb66721010eac461b06a80c", 0, "file1.txt" }, - { 0100644, "0ab09ea6d4c3634bdf6c221626d8b6f7dd890767", 0, "file2.txt" }, - { 0100644, "f4e107c230d08a60fb419d19869f1f282b272d9c", 0, "file3.txt" }, - { 0100644, "0f5bfcf58c558d865da6be0281d7795993646cee", 0, "file6.txt" }, - }; - - git_oid_fromstr(&head_oid, "72333f47d4e83616630ff3b0ffe4c0faebcc3c45"); - cl_git_pass(git_commit_lookup(&head, repo, &head_oid)); - cl_git_pass(git_reset(repo, (git_object *)head, GIT_RESET_HARD, NULL)); - - git_oid_fromstr(&revert_oid, "d1d403d22cbe24592d725f442835cf46fe60c8ac"); - cl_git_pass(git_commit_lookup(&commit, repo, &revert_oid)); - cl_git_pass(git_revert(repo, commit, NULL)); - - cl_assert(merge_test_index(repo_index, merge_index_entries, 4)); - - git_commit_free(commit); - git_commit_free(head); -} - -/* git revert --no-commit 72333f47d4e83616630ff3b0ffe4c0faebcc3c45 */ -void test_revert_workdir__conflicts(void) -{ - git_reference *head_ref; - git_commit *head, *commit; - git_oid revert_oid; - git_buf conflicting_buf = GIT_BUF_INIT, mergemsg_buf = GIT_BUF_INIT; - - struct merge_index_entry merge_index_entries[] = { - { 0100644, "7731926a337c4eaba1e2187d90ebfa0a93659382", 1, "file1.txt" }, - { 0100644, "4b8fcff56437e60f58e9a6bc630dd242ebf6ea2c", 2, "file1.txt" }, - { 0100644, "3a3ef367eaf3fe79effbfb0a56b269c04c2b59fe", 3, "file1.txt" }, - { 0100644, "0ab09ea6d4c3634bdf6c221626d8b6f7dd890767", 0, "file2.txt" }, - { 0100644, "f4e107c230d08a60fb419d19869f1f282b272d9c", 0, "file3.txt" }, - { 0100644, "0f5bfcf58c558d865da6be0281d7795993646cee", 0, "file6.txt" }, - }; - - git_oid_fromstr(&revert_oid, "72333f47d4e83616630ff3b0ffe4c0faebcc3c45"); - - cl_git_pass(git_repository_head(&head_ref, repo)); - cl_git_pass(git_reference_peel((git_object **)&head, head_ref, GIT_OBJ_COMMIT)); - cl_git_pass(git_reset(repo, (git_object *)head, GIT_RESET_HARD, NULL)); - - cl_git_pass(git_commit_lookup(&commit, repo, &revert_oid)); - cl_git_pass(git_revert(repo, commit, NULL)); - - cl_assert(merge_test_index(repo_index, merge_index_entries, 6)); - - cl_git_pass(git_futils_readbuffer(&conflicting_buf, - TEST_REPO_PATH "/file1.txt")); - cl_assert(strcmp(conflicting_buf.ptr, "!File one!\n" \ - "!File one!\n" \ - "File one!\n" \ - "File one\n" \ - "File one\n" \ - "File one\n" \ - "File one\n" \ - "File one\n" \ - "File one\n" \ - "File one\n" \ - "<<<<<<< HEAD\n" \ - "File one!\n" \ - "!File one!\n" \ - "!File one!\n" \ - "!File one!\n" \ - "=======\n" \ - "File one\n" \ - "File one\n" \ - "File one\n" \ - "File one\n" \ - ">>>>>>> parent of 72333f4... automergeable changes\n") == 0); - - cl_assert(git_path_exists(TEST_REPO_PATH "/.git/MERGE_MSG")); - cl_git_pass(git_futils_readbuffer(&mergemsg_buf, - TEST_REPO_PATH "/.git/MERGE_MSG")); - cl_assert(strcmp(mergemsg_buf.ptr, - "Revert \"automergeable changes\"\n" \ - "\n" \ - "This reverts commit 72333f47d4e83616630ff3b0ffe4c0faebcc3c45.\n" - "\n" \ - "Conflicts:\n" \ - "\tfile1.txt\n") == 0); - - git_commit_free(commit); - git_commit_free(head); - git_reference_free(head_ref); - git_buf_free(&mergemsg_buf); - git_buf_free(&conflicting_buf); -} - -/* git reset --hard 39467716290f6df775a91cdb9a4eb39295018145 - * git revert --no-commit ebb03002cee5d66c7732dd06241119fe72ab96a5 -*/ -void test_revert_workdir__orphan(void) -{ - git_commit *head, *commit; - git_oid head_oid, revert_oid; - - struct merge_index_entry merge_index_entries[] = { - { 0100644, "296a6d3be1dff05c5d1f631d2459389fa7b619eb", 0, "file-mainline.txt" }, - }; - - git_oid_fromstr(&head_oid, "39467716290f6df775a91cdb9a4eb39295018145"); - cl_git_pass(git_commit_lookup(&head, repo, &head_oid)); - cl_git_pass(git_reset(repo, (git_object *)head, GIT_RESET_HARD, NULL)); - - git_oid_fromstr(&revert_oid, "ebb03002cee5d66c7732dd06241119fe72ab96a5"); - cl_git_pass(git_commit_lookup(&commit, repo, &revert_oid)); - cl_git_pass(git_revert(repo, commit, NULL)); - - cl_assert(merge_test_index(repo_index, merge_index_entries, 1)); - - git_commit_free(commit); - git_commit_free(head); -} - -/* - * revert the same commit twice (when the first reverts cleanly): - * - * git revert 2d440f2 - * git revert 2d440f2 - */ -void test_revert_workdir__again(void) -{ - git_reference *head_ref; - git_commit *orig_head; - git_tree *reverted_tree; - git_oid reverted_tree_oid, reverted_commit_oid; - git_signature *signature; - - struct merge_index_entry merge_index_entries[] = { - { 0100644, "7731926a337c4eaba1e2187d90ebfa0a93659382", 0, "file1.txt" }, - { 0100644, "0ab09ea6d4c3634bdf6c221626d8b6f7dd890767", 0, "file2.txt" }, - { 0100644, "f4e107c230d08a60fb419d19869f1f282b272d9c", 0, "file3.txt" }, - { 0100644, "0f5bfcf58c558d865da6be0281d7795993646cee", 0, "file6.txt" }, - }; - - cl_git_pass(git_repository_head(&head_ref, repo)); - cl_git_pass(git_reference_peel((git_object **)&orig_head, head_ref, GIT_OBJ_COMMIT)); - cl_git_pass(git_reset(repo, (git_object *)orig_head, GIT_RESET_HARD, NULL)); - - cl_git_pass(git_revert(repo, orig_head, NULL)); - - cl_assert(merge_test_index(repo_index, merge_index_entries, 4)); - - cl_git_pass(git_index_write_tree(&reverted_tree_oid, repo_index)); - cl_git_pass(git_tree_lookup(&reverted_tree, repo, &reverted_tree_oid)); - - cl_git_pass(git_signature_new(&signature, "Reverter", "reverter@example.org", time(NULL), 0)); - cl_git_pass(git_commit_create(&reverted_commit_oid, repo, "HEAD", signature, signature, NULL, "Reverted!", reverted_tree, 1, (const git_commit **)&orig_head)); - - cl_git_pass(git_revert(repo, orig_head, NULL)); - cl_assert(merge_test_index(repo_index, merge_index_entries, 4)); - - git_signature_free(signature); - git_tree_free(reverted_tree); - git_commit_free(orig_head); - git_reference_free(head_ref); -} - -/* git reset --hard 72333f47d4e83616630ff3b0ffe4c0faebcc3c45 - * git revert --no-commit d1d403d22cbe24592d725f442835cf46fe60c8ac */ -void test_revert_workdir__again_after_automerge(void) -{ - git_commit *head, *commit; - git_tree *reverted_tree; - git_oid head_oid, revert_oid, reverted_tree_oid, reverted_commit_oid; - git_signature *signature; - - struct merge_index_entry merge_index_entries[] = { - { 0100644, "caf99de3a49827117bb66721010eac461b06a80c", 0, "file1.txt" }, - { 0100644, "0ab09ea6d4c3634bdf6c221626d8b6f7dd890767", 0, "file2.txt" }, - { 0100644, "f4e107c230d08a60fb419d19869f1f282b272d9c", 0, "file3.txt" }, - { 0100644, "0f5bfcf58c558d865da6be0281d7795993646cee", 0, "file6.txt" }, - }; - - struct merge_index_entry second_revert_entries[] = { - { 0100644, "3a3ef367eaf3fe79effbfb0a56b269c04c2b59fe", 1, "file1.txt" }, - { 0100644, "caf99de3a49827117bb66721010eac461b06a80c", 2, "file1.txt" }, - { 0100644, "747726e021bc5f44b86de60e3032fd6f9f1b8383", 3, "file1.txt" }, - { 0100644, "0ab09ea6d4c3634bdf6c221626d8b6f7dd890767", 0, "file2.txt" }, - { 0100644, "f4e107c230d08a60fb419d19869f1f282b272d9c", 0, "file3.txt" }, - { 0100644, "0f5bfcf58c558d865da6be0281d7795993646cee", 0, "file6.txt" }, - }; - - git_oid_fromstr(&head_oid, "72333f47d4e83616630ff3b0ffe4c0faebcc3c45"); - cl_git_pass(git_commit_lookup(&head, repo, &head_oid)); - cl_git_pass(git_reset(repo, (git_object *)head, GIT_RESET_HARD, NULL)); - - git_oid_fromstr(&revert_oid, "d1d403d22cbe24592d725f442835cf46fe60c8ac"); - cl_git_pass(git_commit_lookup(&commit, repo, &revert_oid)); - cl_git_pass(git_revert(repo, commit, NULL)); - - cl_assert(merge_test_index(repo_index, merge_index_entries, 4)); - - cl_git_pass(git_index_write_tree(&reverted_tree_oid, repo_index)); - cl_git_pass(git_tree_lookup(&reverted_tree, repo, &reverted_tree_oid)); - - cl_git_pass(git_signature_new(&signature, "Reverter", "reverter@example.org", time(NULL), 0)); - cl_git_pass(git_commit_create(&reverted_commit_oid, repo, "HEAD", signature, signature, NULL, "Reverted!", reverted_tree, 1, (const git_commit **)&head)); - - cl_git_pass(git_revert(repo, commit, NULL)); - cl_assert(merge_test_index(repo_index, second_revert_entries, 6)); - - git_signature_free(signature); - git_tree_free(reverted_tree); - git_commit_free(commit); - git_commit_free(head); -} - -/* - * revert the same commit twice (when the first reverts cleanly): - * - * git revert 2d440f2 - * git revert 2d440f2 - */ -void test_revert_workdir__again_after_edit(void) -{ - git_reference *head_ref; - git_commit *orig_head, *commit; - git_tree *reverted_tree; - git_oid orig_head_oid, revert_oid, reverted_tree_oid, reverted_commit_oid; - git_signature *signature; - - struct merge_index_entry merge_index_entries[] = { - { 0100644, "3721552e06c4bdc7d478e0674e6304888545d5fd", 0, "file1.txt" }, - { 0100644, "0ab09ea6d4c3634bdf6c221626d8b6f7dd890767", 0, "file2.txt" }, - { 0100644, "f4e107c230d08a60fb419d19869f1f282b272d9c", 0, "file3.txt" }, - { 0100644, "0f5bfcf58c558d865da6be0281d7795993646cee", 0, "file6.txt" }, - }; - - cl_git_pass(git_repository_head(&head_ref, repo)); - - cl_git_pass(git_oid_fromstr(&orig_head_oid, "399fb3aba3d9d13f7d40a9254ce4402067ef3149")); - cl_git_pass(git_commit_lookup(&orig_head, repo, &orig_head_oid)); - cl_git_pass(git_reset(repo, (git_object *)orig_head, GIT_RESET_HARD, NULL)); - - cl_git_pass(git_oid_fromstr(&revert_oid, "2d440f2b3147d3dc7ad1085813478d6d869d5a4d")); - cl_git_pass(git_commit_lookup(&commit, repo, &revert_oid)); - - cl_git_pass(git_revert(repo, commit, NULL)); - - cl_assert(merge_test_index(repo_index, merge_index_entries, 4)); - - cl_git_pass(git_index_write_tree(&reverted_tree_oid, repo_index)); - cl_git_pass(git_tree_lookup(&reverted_tree, repo, &reverted_tree_oid)); - - cl_git_pass(git_signature_new(&signature, "Reverter", "reverter@example.org", time(NULL), 0)); - cl_git_pass(git_commit_create(&reverted_commit_oid, repo, "HEAD", signature, signature, NULL, "Reverted!", reverted_tree, 1, (const git_commit **)&orig_head)); - - cl_git_pass(git_revert(repo, commit, NULL)); - cl_assert(merge_test_index(repo_index, merge_index_entries, 4)); - - git_signature_free(signature); - git_tree_free(reverted_tree); - git_commit_free(commit); - git_commit_free(orig_head); - git_reference_free(head_ref); -} - -/* - * revert the same commit twice (when the first reverts cleanly): - * - * git reset --hard 75ec9929465623f17ff3ad68c0438ea56faba815 - * git revert 97e52d5e81f541080cd6b92829fb85bc4d81d90b - */ -void test_revert_workdir__again_after_edit_two(void) -{ - git_buf diff_buf = GIT_BUF_INIT; - git_config *config; - git_oid head_commit_oid, revert_commit_oid; - git_commit *head_commit, *revert_commit; - - struct merge_index_entry merge_index_entries[] = { - { 0100644, "a8c86221b400b836010567cc3593db6e96c1a83a", 1, "file.txt" }, - { 0100644, "46ff0854663aeb2182b9838c8da68e33ac23bc1e", 2, "file.txt" }, - { 0100644, "21a96a98ed84d45866e1de6e266fd3a61a4ae9dc", 3, "file.txt" }, - }; - - cl_git_pass(git_repository_config(&config, repo)); - cl_git_pass(git_config_set_bool(config, "core.autocrlf", 0)); - - cl_git_pass(git_oid_fromstr(&head_commit_oid, "75ec9929465623f17ff3ad68c0438ea56faba815")); - cl_git_pass(git_commit_lookup(&head_commit, repo, &head_commit_oid)); - cl_git_pass(git_reset(repo, (git_object *)head_commit, GIT_RESET_HARD, NULL)); - - cl_git_pass(git_oid_fromstr(&revert_commit_oid, "97e52d5e81f541080cd6b92829fb85bc4d81d90b")); - cl_git_pass(git_commit_lookup(&revert_commit, repo, &revert_commit_oid)); - - cl_git_pass(git_revert(repo, revert_commit, NULL)); - - cl_assert(merge_test_index(repo_index, merge_index_entries, 3)); - - cl_git_pass(git_futils_readbuffer(&diff_buf, "revert/file.txt")); - cl_assert_equal_s( - "a\n" \ - "<<<<<<< HEAD\n" \ - "=======\n" \ - "a\n" \ - ">>>>>>> parent of 97e52d5... Revert me\n" \ - "a\n" \ - "a\n" \ - "a\n" \ - "a\n" \ - "ab", - diff_buf.ptr); - - git_commit_free(revert_commit); - git_commit_free(head_commit); - git_config_free(config); - git_buf_free(&diff_buf); -} - -/* git reset --hard 72333f47d4e83616630ff3b0ffe4c0faebcc3c45 - * git revert --no-commit d1d403d22cbe24592d725f442835cf46fe60c8ac */ -void test_revert_workdir__conflict_use_ours(void) -{ - git_commit *head, *commit; - git_oid head_oid, revert_oid; - git_revert_options opts = GIT_REVERT_OPTIONS_INIT; - - struct merge_index_entry merge_index_entries[] = { - { 0100644, "caf99de3a49827117bb66721010eac461b06a80c", 0, "file1.txt" }, - { 0100644, "0ab09ea6d4c3634bdf6c221626d8b6f7dd890767", 0, "file2.txt" }, - { 0100644, "f4e107c230d08a60fb419d19869f1f282b272d9c", 0, "file3.txt" }, - { 0100644, "0f5bfcf58c558d865da6be0281d7795993646cee", 0, "file6.txt" }, - }; - - struct merge_index_entry merge_filesystem_entries[] = { - { 0100644, "caf99de3a49827117bb66721010eac461b06a80c", 0, "file1.txt" }, - { 0100644, "0ab09ea6d4c3634bdf6c221626d8b6f7dd890767", 0, "file2.txt" }, - { 0100644, "f4e107c230d08a60fb419d19869f1f282b272d9c", 0, "file3.txt" }, - { 0100644, "0f5bfcf58c558d865da6be0281d7795993646cee", 0, "file6.txt" }, - }; - - opts.checkout_opts.checkout_strategy = GIT_CHECKOUT_SAFE | GIT_CHECKOUT_USE_OURS; - - git_oid_fromstr(&head_oid, "72333f47d4e83616630ff3b0ffe4c0faebcc3c45"); - cl_git_pass(git_commit_lookup(&head, repo, &head_oid)); - cl_git_pass(git_reset(repo, (git_object *)head, GIT_RESET_HARD, NULL)); - - git_oid_fromstr(&revert_oid, "d1d403d22cbe24592d725f442835cf46fe60c8ac"); - cl_git_pass(git_commit_lookup(&commit, repo, &revert_oid)); - cl_git_pass(git_revert(repo, commit, &opts)); - - cl_assert(merge_test_index(repo_index, merge_index_entries, 4)); - cl_assert(merge_test_workdir(repo, merge_filesystem_entries, 4)); - - git_commit_free(commit); - git_commit_free(head); -} - -/* git reset --hard cef56612d71a6af8d8015691e4865f7fece905b5 - * git revert --no-commit 55568c8de5322ff9a95d72747a239cdb64a19965 - */ -void test_revert_workdir__rename_1_of_2(void) -{ - git_commit *head, *commit; - git_oid head_oid, revert_oid; - git_revert_options opts = GIT_REVERT_OPTIONS_INIT; - - struct merge_index_entry merge_index_entries[] = { - { 0100644, "747726e021bc5f44b86de60e3032fd6f9f1b8383", 0, "file1.txt" }, - { 0100644, "0ab09ea6d4c3634bdf6c221626d8b6f7dd890767", 0, "file2.txt" }, - { 0100644, "f4e107c230d08a60fb419d19869f1f282b272d9c", 0, "file3.txt" }, - { 0100644, "55acf326a69f0aab7a974ec53ffa55a50bcac14e", 3, "file4.txt" }, - { 0100644, "55acf326a69f0aab7a974ec53ffa55a50bcac14e", 1, "file5.txt" }, - { 0100644, "0f5bfcf58c558d865da6be0281d7795993646cee", 2, "file6.txt" }, - }; - - opts.merge_opts.tree_flags |= GIT_MERGE_TREE_FIND_RENAMES; - opts.merge_opts.rename_threshold = 50; - - git_oid_fromstr(&head_oid, "cef56612d71a6af8d8015691e4865f7fece905b5"); - cl_git_pass(git_commit_lookup(&head, repo, &head_oid)); - cl_git_pass(git_reset(repo, (git_object *)head, GIT_RESET_HARD, NULL)); - - git_oid_fromstr(&revert_oid, "55568c8de5322ff9a95d72747a239cdb64a19965"); - cl_git_pass(git_commit_lookup(&commit, repo, &revert_oid)); - cl_git_pass(git_revert(repo, commit, &opts)); - - cl_assert(merge_test_index(repo_index, merge_index_entries, 6)); - - git_commit_free(commit); - git_commit_free(head); -} - -/* git reset --hard 55568c8de5322ff9a95d72747a239cdb64a19965 - * git revert --no-commit HEAD~1 */ -void test_revert_workdir__rename(void) -{ - git_commit *head, *commit; - git_oid head_oid, revert_oid; - git_revert_options opts = GIT_REVERT_OPTIONS_INIT; - - struct merge_index_entry merge_index_entries[] = { - { 0100644, "55acf326a69f0aab7a974ec53ffa55a50bcac14e", 1, "file4.txt" }, - { 0100644, "55acf326a69f0aab7a974ec53ffa55a50bcac14e", 2, "file5.txt" }, - }; - - struct merge_name_entry merge_name_entries[] = { - { "file4.txt", "file5.txt", "" }, - }; - - opts.merge_opts.tree_flags |= GIT_MERGE_TREE_FIND_RENAMES; - opts.merge_opts.rename_threshold = 50; - - git_oid_fromstr(&head_oid, "55568c8de5322ff9a95d72747a239cdb64a19965"); - cl_git_pass(git_commit_lookup(&head, repo, &head_oid)); - cl_git_pass(git_reset(repo, (git_object *)head, GIT_RESET_HARD, NULL)); - - git_oid_fromstr(&revert_oid, "0aa8c7e40d342fff78d60b29a4ba8e993ed79c51"); - cl_git_pass(git_commit_lookup(&commit, repo, &revert_oid)); - cl_git_pass(git_revert(repo, commit, &opts)); - - cl_assert(merge_test_index(repo_index, merge_index_entries, 2)); - cl_assert(merge_test_names(repo_index, merge_name_entries, 1)); - - git_commit_free(commit); - git_commit_free(head); -} - -/* git revert --no-commit HEAD */ -void test_revert_workdir__head(void) -{ - git_reference *head; - git_commit *commit; - - struct merge_index_entry merge_index_entries[] = { - { 0100644, "7731926a337c4eaba1e2187d90ebfa0a93659382", 0, "file1.txt" }, - { 0100644, "0ab09ea6d4c3634bdf6c221626d8b6f7dd890767", 0, "file2.txt" }, - { 0100644, "f4e107c230d08a60fb419d19869f1f282b272d9c", 0, "file3.txt" }, - { 0100644, "0f5bfcf58c558d865da6be0281d7795993646cee", 0, "file6.txt" }, - }; - - /* HEAD is 2d440f2b3147d3dc7ad1085813478d6d869d5a4d */ - cl_git_pass(git_repository_head(&head, repo)); - cl_git_pass(git_reference_peel((git_object **)&commit, head, GIT_OBJ_COMMIT)); - cl_git_pass(git_reset(repo, (git_object *)commit, GIT_RESET_HARD, NULL)); - cl_git_pass(git_revert(repo, commit, NULL)); - - cl_assert(merge_test_index(repo_index, merge_index_entries, 4)); - cl_assert(merge_test_workdir(repo, merge_index_entries, 4)); - - git_reference_free(head); - git_commit_free(commit); -} - -void test_revert_workdir__nonmerge_fails_mainline_specified(void) -{ - git_reference *head; - git_commit *commit; - git_revert_options opts = GIT_REVERT_OPTIONS_INIT; - - cl_git_pass(git_repository_head(&head, repo)); - cl_git_pass(git_reference_peel((git_object **)&commit, head, GIT_OBJ_COMMIT)); - - opts.mainline = 1; - cl_must_fail(git_revert(repo, commit, &opts)); - cl_assert(!git_path_exists(TEST_REPO_PATH "/.git/MERGE_MSG")); - cl_assert(!git_path_exists(TEST_REPO_PATH "/.git/REVERT_HEAD")); - - git_reference_free(head); - git_commit_free(commit); -} - -/* git reset --hard 5acdc74af27172ec491d213ee36cea7eb9ef2579 - * git revert HEAD */ -void test_revert_workdir__merge_fails_without_mainline_specified(void) -{ - git_commit *head; - git_oid head_oid; - - git_oid_fromstr(&head_oid, "5acdc74af27172ec491d213ee36cea7eb9ef2579"); - cl_git_pass(git_commit_lookup(&head, repo, &head_oid)); - cl_git_pass(git_reset(repo, (git_object *)head, GIT_RESET_HARD, NULL)); - - cl_must_fail(git_revert(repo, head, NULL)); - cl_assert(!git_path_exists(TEST_REPO_PATH "/.git/MERGE_MSG")); - cl_assert(!git_path_exists(TEST_REPO_PATH "/.git/REVERT_HEAD")); - - git_commit_free(head); -} - -/* git reset --hard 5acdc74af27172ec491d213ee36cea7eb9ef2579 - * git revert HEAD -m1 --no-commit */ -void test_revert_workdir__merge_first_parent(void) -{ - git_commit *head; - git_oid head_oid; - git_revert_options opts = GIT_REVERT_OPTIONS_INIT; - - struct merge_index_entry merge_index_entries[] = { - { 0100644, "296a6d3be1dff05c5d1f631d2459389fa7b619eb", 0, "file-mainline.txt" }, - { 0100644, "0cdb66192ee192f70f891f05a47636057420e871", 0, "file1.txt" }, - { 0100644, "73ec36fa120f8066963a0bc9105bb273dbd903d7", 0, "file2.txt" }, - }; - - opts.mainline = 1; - - git_oid_fromstr(&head_oid, "5acdc74af27172ec491d213ee36cea7eb9ef2579"); - cl_git_pass(git_commit_lookup(&head, repo, &head_oid)); - cl_git_pass(git_reset(repo, (git_object *)head, GIT_RESET_HARD, NULL)); - - cl_git_pass(git_revert(repo, head, &opts)); - - cl_assert(merge_test_index(repo_index, merge_index_entries, 3)); - - git_commit_free(head); -} - -void test_revert_workdir__merge_second_parent(void) -{ - git_commit *head; - git_oid head_oid; - git_revert_options opts = GIT_REVERT_OPTIONS_INIT; - - struct merge_index_entry merge_index_entries[] = { - { 0100644, "33c6fd981c49a2abf2971482089350bfc5cda8ea", 0, "file-branch.txt" }, - { 0100644, "0cdb66192ee192f70f891f05a47636057420e871", 0, "file1.txt" }, - { 0100644, "73ec36fa120f8066963a0bc9105bb273dbd903d7", 0, "file2.txt" }, - }; - - opts.mainline = 2; - - git_oid_fromstr(&head_oid, "5acdc74af27172ec491d213ee36cea7eb9ef2579"); - cl_git_pass(git_commit_lookup(&head, repo, &head_oid)); - cl_git_pass(git_reset(repo, (git_object *)head, GIT_RESET_HARD, NULL)); - - cl_git_pass(git_revert(repo, head, &opts)); - - cl_assert(merge_test_index(repo_index, merge_index_entries, 3)); - - git_commit_free(head); -} diff --git a/vendor/libgit2/tests/revwalk/basic.c b/vendor/libgit2/tests/revwalk/basic.c deleted file mode 100644 index 7e50452c9a..0000000000 --- a/vendor/libgit2/tests/revwalk/basic.c +++ /dev/null @@ -1,439 +0,0 @@ -#include "clar_libgit2.h" - -/* - * a4a7dce [0] Merge branch 'master' into br2 - |\ - | * 9fd738e [1] a fourth commit - | * 4a202b3 [2] a third commit - * | c47800c [3] branch commit one - |/ - * 5b5b025 [5] another commit - * 8496071 [4] testing -*/ -static const char *commit_head = "a4a7dce85cf63874e984719f4fdd239f5145052f"; - -static const char *commit_ids[] = { - "a4a7dce85cf63874e984719f4fdd239f5145052f", /* 0 */ - "9fd738e8f7967c078dceed8190330fc8648ee56a", /* 1 */ - "4a202b346bb0fb0db7eff3cffeb3c70babbd2045", /* 2 */ - "c47800c7266a2be04c571c04d5a6614691ea99bd", /* 3 */ - "8496071c1b46c854b31185ea97743be6a8774479", /* 4 */ - "5b5b025afb0b4c913b4c338a42934a3863bf3644", /* 5 */ -}; - -/* Careful: there are two possible topological sorts */ -static const int commit_sorting_topo[][6] = { - {0, 1, 2, 3, 5, 4}, {0, 3, 1, 2, 5, 4} -}; - -static const int commit_sorting_time[][6] = { - {0, 3, 1, 2, 5, 4} -}; - -static const int commit_sorting_topo_reverse[][6] = { - {4, 5, 3, 2, 1, 0}, {4, 5, 2, 1, 3, 0} -}; - -static const int commit_sorting_time_reverse[][6] = { - {4, 5, 2, 1, 3, 0} -}; - -static const int commit_sorting_segment[][6] = { - {1, 2, -1, -1, -1, -1} -}; - -#define commit_count 6 -static const int result_bytes = 24; - - -static int get_commit_index(git_oid *raw_oid) -{ - int i; - char oid[GIT_OID_HEXSZ]; - - git_oid_fmt(oid, raw_oid); - - for (i = 0; i < commit_count; ++i) - if (memcmp(oid, commit_ids[i], GIT_OID_HEXSZ) == 0) - return i; - - return -1; -} - -static int test_walk_only(git_revwalk *walk, - const int possible_results[][commit_count], int results_count) -{ - git_oid oid; - int i; - int result_array[commit_count]; - - for (i = 0; i < commit_count; ++i) - result_array[i] = -1; - - i = 0; - while (git_revwalk_next(&oid, walk) == 0) { - result_array[i++] = get_commit_index(&oid); - /*{ - char str[GIT_OID_HEXSZ+1]; - git_oid_fmt(str, &oid); - str[GIT_OID_HEXSZ] = 0; - printf(" %d) %s\n", i, str); - }*/ - } - - for (i = 0; i < results_count; ++i) - if (memcmp(possible_results[i], - result_array, result_bytes) == 0) - return 0; - - return GIT_ERROR; -} - -static int test_walk(git_revwalk *walk, const git_oid *root, - int flags, const int possible_results[][6], int results_count) -{ - git_revwalk_sorting(walk, flags); - git_revwalk_push(walk, root); - - return test_walk_only(walk, possible_results, results_count); -} - -static git_repository *_repo = NULL; -static git_revwalk *_walk = NULL; -static const char *_fixture = NULL; - -void test_revwalk_basic__initialize(void) -{ -} - -void test_revwalk_basic__cleanup(void) -{ - git_revwalk_free(_walk); - - if (_fixture) - cl_git_sandbox_cleanup(); - else - git_repository_free(_repo); - - _fixture = NULL; - _repo = NULL; - _walk = NULL; -} - -static void revwalk_basic_setup_walk(const char *fixture) -{ - if (fixture) { - _fixture = fixture; - _repo = cl_git_sandbox_init(fixture); - } else { - cl_git_pass(git_repository_open(&_repo, cl_fixture("testrepo.git"))); - } - - cl_git_pass(git_revwalk_new(&_walk, _repo)); -} - -void test_revwalk_basic__sorting_modes(void) -{ - git_oid id; - - revwalk_basic_setup_walk(NULL); - - git_oid_fromstr(&id, commit_head); - - cl_git_pass(test_walk(_walk, &id, GIT_SORT_TIME, commit_sorting_time, 1)); - cl_git_pass(test_walk(_walk, &id, GIT_SORT_TOPOLOGICAL, commit_sorting_topo, 2)); - cl_git_pass(test_walk(_walk, &id, GIT_SORT_TIME | GIT_SORT_REVERSE, commit_sorting_time_reverse, 1)); - cl_git_pass(test_walk(_walk, &id, GIT_SORT_TOPOLOGICAL | GIT_SORT_REVERSE, commit_sorting_topo_reverse, 2)); -} - -void test_revwalk_basic__glob_heads(void) -{ - int i = 0; - git_oid oid; - - revwalk_basic_setup_walk(NULL); - - cl_git_pass(git_revwalk_push_glob(_walk, "heads")); - - while (git_revwalk_next(&oid, _walk) == 0) { - i++; - } - - /* git log --branches --oneline | wc -l => 14 */ - cl_assert_equal_i(i, 14); -} - -void test_revwalk_basic__glob_heads_with_invalid(void) -{ - int i; - git_oid oid; - - revwalk_basic_setup_walk("testrepo"); - - cl_git_mkfile("testrepo/.git/refs/heads/garbage", "not-a-ref"); - cl_git_pass(git_revwalk_push_glob(_walk, "heads")); - - for (i = 0; !git_revwalk_next(&oid, _walk); ++i) - /* walking */; - - /* git log --branches --oneline | wc -l => 16 */ - cl_assert_equal_i(18, i); -} - -void test_revwalk_basic__push_head(void) -{ - int i = 0; - git_oid oid; - - revwalk_basic_setup_walk(NULL); - - cl_git_pass(git_revwalk_push_head(_walk)); - - while (git_revwalk_next(&oid, _walk) == 0) { - i++; - } - - /* git log HEAD --oneline | wc -l => 7 */ - cl_assert_equal_i(i, 7); -} - -void test_revwalk_basic__push_head_hide_ref(void) -{ - int i = 0; - git_oid oid; - - revwalk_basic_setup_walk(NULL); - - cl_git_pass(git_revwalk_push_head(_walk)); - cl_git_pass(git_revwalk_hide_ref(_walk, "refs/heads/packed-test")); - - while (git_revwalk_next(&oid, _walk) == 0) { - i++; - } - - /* git log HEAD --oneline --not refs/heads/packed-test | wc -l => 4 */ - cl_assert_equal_i(i, 4); -} - -void test_revwalk_basic__push_head_hide_ref_nobase(void) -{ - int i = 0; - git_oid oid; - - revwalk_basic_setup_walk(NULL); - - cl_git_pass(git_revwalk_push_head(_walk)); - cl_git_pass(git_revwalk_hide_ref(_walk, "refs/heads/packed")); - - while (git_revwalk_next(&oid, _walk) == 0) { - i++; - } - - /* git log HEAD --oneline --not refs/heads/packed | wc -l => 7 */ - cl_assert_equal_i(i, 7); -} - -/* -* $ git rev-list HEAD 5b5b02 ^refs/heads/packed-test -* a65fedf39aefe402d3bb6e24df4d4f5fe4547750 -* be3563ae3f795b2b4353bcce3a527ad0a4f7f644 -* c47800c7266a2be04c571c04d5a6614691ea99bd -* 9fd738e8f7967c078dceed8190330fc8648ee56a - -* $ git log HEAD 5b5b02 --oneline --not refs/heads/packed-test | wc -l => 4 -* a65fedf -* be3563a Merge branch 'br2' -* c47800c branch commit one -* 9fd738e a fourth commit -*/ -void test_revwalk_basic__multiple_push_1(void) -{ - int i = 0; - git_oid oid; - - revwalk_basic_setup_walk(NULL); - - cl_git_pass(git_revwalk_push_head(_walk)); - - cl_git_pass(git_revwalk_hide_ref(_walk, "refs/heads/packed-test")); - - cl_git_pass(git_oid_fromstr(&oid, "5b5b025afb0b4c913b4c338a42934a3863bf3644")); - cl_git_pass(git_revwalk_push(_walk, &oid)); - - while (git_revwalk_next(&oid, _walk) == 0) - i++; - - cl_assert_equal_i(i, 4); -} - -/* -* Difference between test_revwalk_basic__multiple_push_1 and -* test_revwalk_basic__multiple_push_2 is in the order reference -* refs/heads/packed-test and commit 5b5b02 are pushed. -* revwalk should return same commits in both the tests. - -* $ git rev-list 5b5b02 HEAD ^refs/heads/packed-test -* a65fedf39aefe402d3bb6e24df4d4f5fe4547750 -* be3563ae3f795b2b4353bcce3a527ad0a4f7f644 -* c47800c7266a2be04c571c04d5a6614691ea99bd -* 9fd738e8f7967c078dceed8190330fc8648ee56a - -* $ git log 5b5b02 HEAD --oneline --not refs/heads/packed-test | wc -l => 4 -* a65fedf -* be3563a Merge branch 'br2' -* c47800c branch commit one -* 9fd738e a fourth commit -*/ -void test_revwalk_basic__multiple_push_2(void) -{ - int i = 0; - git_oid oid; - - revwalk_basic_setup_walk(NULL); - - cl_git_pass(git_oid_fromstr(&oid, "5b5b025afb0b4c913b4c338a42934a3863bf3644")); - cl_git_pass(git_revwalk_push(_walk, &oid)); - - cl_git_pass(git_revwalk_hide_ref(_walk, "refs/heads/packed-test")); - - cl_git_pass(git_revwalk_push_head(_walk)); - - while (git_revwalk_next(&oid, _walk) == 0) - i++; - - cl_assert_equal_i(i, 4); -} - -void test_revwalk_basic__disallow_non_commit(void) -{ - git_oid oid; - - revwalk_basic_setup_walk(NULL); - - cl_git_pass(git_oid_fromstr(&oid, "521d87c1ec3aef9824daf6d96cc0ae3710766d91")); - cl_git_fail(git_revwalk_push(_walk, &oid)); -} - -void test_revwalk_basic__hide_then_push(void) -{ - git_oid oid; - int i = 0; - - revwalk_basic_setup_walk(NULL); - cl_git_pass(git_oid_fromstr(&oid, "5b5b025afb0b4c913b4c338a42934a3863bf3644")); - - cl_git_pass(git_revwalk_hide(_walk, &oid)); - cl_git_pass(git_revwalk_push(_walk, &oid)); - - while (git_revwalk_next(&oid, _walk) == 0) - i++; - - cl_assert_equal_i(i, 0); -} - -void test_revwalk_basic__push_range(void) -{ - revwalk_basic_setup_walk(NULL); - - git_revwalk_reset(_walk); - git_revwalk_sorting(_walk, 0); - cl_git_pass(git_revwalk_push_range(_walk, "9fd738e~2..9fd738e")); - cl_git_pass(test_walk_only(_walk, commit_sorting_segment, 1)); -} - -void test_revwalk_basic__push_mixed(void) -{ - git_oid oid; - int i = 0; - - revwalk_basic_setup_walk(NULL); - - git_revwalk_reset(_walk); - git_revwalk_sorting(_walk, 0); - cl_git_pass(git_revwalk_push_glob(_walk, "tags")); - - while (git_revwalk_next(&oid, _walk) == 0) { - i++; - } - - /* git rev-list --count --glob=tags #=> 9 */ - cl_assert_equal_i(9, i); -} - -void test_revwalk_basic__push_all(void) -{ - git_oid oid; - int i = 0; - - revwalk_basic_setup_walk(NULL); - - git_revwalk_reset(_walk); - git_revwalk_sorting(_walk, 0); - cl_git_pass(git_revwalk_push_glob(_walk, "*")); - - while (git_revwalk_next(&oid, _walk) == 0) { - i++; - } - - /* git rev-list --count --all #=> 15 */ - cl_assert_equal_i(15, i); -} - -/* -* $ git rev-list br2 master e908 -* a65fedf39aefe402d3bb6e24df4d4f5fe4547750 -* e90810b8df3e80c413d903f631643c716887138d -* 6dcf9bf7541ee10456529833502442f385010c3d -* a4a7dce85cf63874e984719f4fdd239f5145052f -* be3563ae3f795b2b4353bcce3a527ad0a4f7f644 -* c47800c7266a2be04c571c04d5a6614691ea99bd -* 9fd738e8f7967c078dceed8190330fc8648ee56a -* 4a202b346bb0fb0db7eff3cffeb3c70babbd2045 -* 5b5b025afb0b4c913b4c338a42934a3863bf3644 -* 8496071c1b46c854b31185ea97743be6a8774479 -*/ - -void test_revwalk_basic__mimic_git_rev_list(void) -{ - git_oid oid; - - revwalk_basic_setup_walk(NULL); - git_revwalk_sorting(_walk, GIT_SORT_TIME); - - cl_git_pass(git_revwalk_push_ref(_walk, "refs/heads/br2")); - cl_git_pass(git_revwalk_push_ref(_walk, "refs/heads/master")); - cl_git_pass(git_oid_fromstr(&oid, "e90810b8df3e80c413d903f631643c716887138d")); - cl_git_pass(git_revwalk_push(_walk, &oid)); - - cl_git_pass(git_revwalk_next(&oid, _walk)); - cl_assert(!git_oid_streq(&oid, "a65fedf39aefe402d3bb6e24df4d4f5fe4547750")); - - cl_git_pass(git_revwalk_next(&oid, _walk)); - cl_assert(!git_oid_streq(&oid, "e90810b8df3e80c413d903f631643c716887138d")); - - cl_git_pass(git_revwalk_next(&oid, _walk)); - cl_assert(!git_oid_streq(&oid, "6dcf9bf7541ee10456529833502442f385010c3d")); - - cl_git_pass(git_revwalk_next(&oid, _walk)); - cl_assert(!git_oid_streq(&oid, "a4a7dce85cf63874e984719f4fdd239f5145052f")); - - cl_git_pass(git_revwalk_next(&oid, _walk)); - cl_assert(!git_oid_streq(&oid, "be3563ae3f795b2b4353bcce3a527ad0a4f7f644")); - - cl_git_pass(git_revwalk_next(&oid, _walk)); - cl_assert(!git_oid_streq(&oid, "c47800c7266a2be04c571c04d5a6614691ea99bd")); - - cl_git_pass(git_revwalk_next(&oid, _walk)); - cl_assert(!git_oid_streq(&oid, "9fd738e8f7967c078dceed8190330fc8648ee56a")); - - cl_git_pass(git_revwalk_next(&oid, _walk)); - cl_assert(!git_oid_streq(&oid, "4a202b346bb0fb0db7eff3cffeb3c70babbd2045")); - - cl_git_pass(git_revwalk_next(&oid, _walk)); - cl_assert(!git_oid_streq(&oid, "5b5b025afb0b4c913b4c338a42934a3863bf3644")); - - cl_git_pass(git_revwalk_next(&oid, _walk)); - cl_assert(!git_oid_streq(&oid, "8496071c1b46c854b31185ea97743be6a8774479")); - - cl_git_fail_with(git_revwalk_next(&oid, _walk), GIT_ITEROVER); -} diff --git a/vendor/libgit2/tests/revwalk/hidecb.c b/vendor/libgit2/tests/revwalk/hidecb.c deleted file mode 100644 index 14cf39afd0..0000000000 --- a/vendor/libgit2/tests/revwalk/hidecb.c +++ /dev/null @@ -1,201 +0,0 @@ -#include "clar_libgit2.h" -/* -* a4a7dce [0] Merge branch 'master' into br2 -|\ -| * 9fd738e [1] a fourth commit -| * 4a202b3 [2] a third commit -* | c47800c [3] branch commit one -|/ -* 5b5b025 [5] another commit -* 8496071 [4] testing -*/ -static const char *commit_head = "a4a7dce85cf63874e984719f4fdd239f5145052f"; - -static const char *commit_strs[] = { - "a4a7dce85cf63874e984719f4fdd239f5145052f", /* 0 */ - "9fd738e8f7967c078dceed8190330fc8648ee56a", /* 1 */ - "4a202b346bb0fb0db7eff3cffeb3c70babbd2045", /* 2 */ - "c47800c7266a2be04c571c04d5a6614691ea99bd", /* 3 */ - "8496071c1b46c854b31185ea97743be6a8774479", /* 4 */ - "5b5b025afb0b4c913b4c338a42934a3863bf3644", /* 5 */ -}; - -#define commit_count 6 - -static git_oid commit_ids[commit_count]; -static git_oid _head_id; -static git_repository *_repo; - - -void test_revwalk_hidecb__initialize(void) -{ - int i; - - cl_git_pass(git_repository_open(&_repo, cl_fixture("testrepo.git"))); - cl_git_pass(git_oid_fromstr(&_head_id, commit_head)); - - for (i = 0; i < commit_count; i++) - cl_git_pass(git_oid_fromstr(&commit_ids[i], commit_strs[i])); - -} - -void test_revwalk_hidecb__cleanup(void) -{ - git_repository_free(_repo); - _repo = NULL; -} - -/* Hide all commits */ -static int hide_every_commit_cb(const git_oid *commit_id, void *data) -{ - GIT_UNUSED(commit_id); - GIT_UNUSED(data); - - return 1; -} - -/* Do not hide anything */ -static int hide_none_cb(const git_oid *commit_id, void *data) -{ - GIT_UNUSED(commit_id); - GIT_UNUSED(data); - - return 0; -} - -/* Hide some commits */ -static int hide_commit_cb(const git_oid *commit_id, void *data) -{ - GIT_UNUSED(commit_id); - GIT_UNUSED(data); - - return (git_oid_cmp(commit_id, &commit_ids[5]) == 0); -} - -/* In payload data, pointer to a commit id is passed */ -static int hide_commit_use_payload_cb(const git_oid *commit_id, void *data) -{ - git_oid *hide_commit_id = data; - - return (git_oid_cmp(commit_id, hide_commit_id) == 0); -} - -void test_revwalk_hidecb__hide_all_cb(void) -{ - git_revwalk *walk; - git_oid id; - - cl_git_pass(git_revwalk_new(&walk, _repo)); - cl_git_pass(git_revwalk_add_hide_cb(walk, hide_every_commit_cb, NULL)); - cl_git_pass(git_revwalk_push(walk, &_head_id)); - - /* First call to git_revwalk_next should return GIT_ITEROVER */ - cl_assert_equal_i(GIT_ITEROVER, git_revwalk_next(&id, walk)); - - git_revwalk_free(walk); -} - - -void test_revwalk_hidecb__hide_none_cb(void) -{ - git_revwalk *walk; - int i, error; - git_oid id; - - cl_git_pass(git_revwalk_new(&walk, _repo)); - cl_git_pass(git_revwalk_add_hide_cb(walk, hide_none_cb, NULL)); - cl_git_pass(git_revwalk_push(walk, &_head_id)); - - /* It should return all 6 commits */ - i = 0; - while ((error = git_revwalk_next(&id, walk)) == 0) - i++; - - cl_assert_equal_i(i, 6); - cl_assert_equal_i(error, GIT_ITEROVER); - - git_revwalk_free(walk); -} - -void test_revwalk_hidecb__add_hide_cb_multiple_times(void) -{ - git_revwalk *walk; - - cl_git_pass(git_revwalk_new(&walk, _repo)); - cl_git_pass(git_revwalk_add_hide_cb(walk, hide_every_commit_cb, NULL)); - cl_git_fail(git_revwalk_add_hide_cb(walk, hide_every_commit_cb, NULL)); - - git_revwalk_free(walk); -} - -void test_revwalk_hidecb__add_hide_cb_during_walking(void) -{ - git_revwalk *walk; - git_oid id; - int error; - - cl_git_pass(git_revwalk_new(&walk, _repo)); - cl_git_pass(git_revwalk_push(walk, &_head_id)); - - /* Start walking without adding hide callback */ - cl_git_pass(git_revwalk_next(&id, walk)); - - /* Now add hide callback */ - cl_git_pass(git_revwalk_add_hide_cb(walk, hide_none_cb, NULL)); - - /* walk should be reset */ - error = git_revwalk_next(&id, walk); - cl_assert_equal_i(error, GIT_ITEROVER); - - git_revwalk_free(walk); -} - -void test_revwalk_hidecb__hide_some_commits(void) -{ - git_revwalk *walk; - git_oid id; - int i, error; - - cl_git_pass(git_revwalk_new(&walk, _repo)); - cl_git_pass(git_revwalk_push(walk, &_head_id)); - - /* Add hide callback */ - cl_git_pass(git_revwalk_add_hide_cb(walk, hide_commit_cb, NULL)); - - i = 0; - while ((error = git_revwalk_next(&id, walk)) == 0) { - cl_assert_equal_oid(&commit_ids[i], &id); - i++; - } - - cl_assert_equal_i(i, 4); - cl_assert_equal_i(error, GIT_ITEROVER); - - git_revwalk_free(walk); -} - -void test_revwalk_hidecb__test_payload(void) -{ - git_revwalk *walk; - git_oid id; - int i, error; - - cl_git_pass(git_revwalk_new(&walk, _repo)); - cl_git_pass(git_revwalk_push(walk, &_head_id)); - - /* Add hide callback, pass id of parent of initial commit as payload data */ - cl_git_pass(git_revwalk_add_hide_cb(walk, hide_commit_use_payload_cb, &commit_ids[5])); - - i = 0; - while ((error = git_revwalk_next(&id, walk)) == 0) { - cl_assert_equal_oid(&commit_ids[i], &id); - i++; - } - - /* walker should return four commits */ - cl_assert_equal_i(i, 4); - cl_assert_equal_i(error, GIT_ITEROVER); - - git_revwalk_free(walk); -} - diff --git a/vendor/libgit2/tests/revwalk/mergebase.c b/vendor/libgit2/tests/revwalk/mergebase.c deleted file mode 100644 index aafe97d719..0000000000 --- a/vendor/libgit2/tests/revwalk/mergebase.c +++ /dev/null @@ -1,494 +0,0 @@ -#include "clar_libgit2.h" -#include "vector.h" -#include - -static git_repository *_repo; -static git_repository *_repo2; - -void test_revwalk_mergebase__initialize(void) -{ - cl_git_pass(git_repository_open(&_repo, cl_fixture("testrepo.git"))); - cl_git_pass(git_repository_open(&_repo2, cl_fixture("twowaymerge.git"))); -} - -void test_revwalk_mergebase__cleanup(void) -{ - git_repository_free(_repo); - _repo = NULL; - - git_repository_free(_repo2); - _repo2 = NULL; -} - -void test_revwalk_mergebase__single1(void) -{ - git_oid result, one, two, expected; - size_t ahead, behind; - - cl_git_pass(git_oid_fromstr(&one, "c47800c7266a2be04c571c04d5a6614691ea99bd ")); - cl_git_pass(git_oid_fromstr(&two, "9fd738e8f7967c078dceed8190330fc8648ee56a")); - cl_git_pass(git_oid_fromstr(&expected, "5b5b025afb0b4c913b4c338a42934a3863bf3644")); - - cl_git_pass(git_merge_base(&result, _repo, &one, &two)); - cl_assert_equal_oid(&expected, &result); - - cl_git_pass(git_graph_ahead_behind(&ahead, &behind, _repo, &one, &two)); - cl_assert_equal_sz(ahead, 1); - cl_assert_equal_sz(behind, 2); - - cl_git_pass(git_graph_ahead_behind(&ahead, &behind, _repo, &two, &one)); - cl_assert_equal_sz(ahead, 2); - cl_assert_equal_sz(behind, 1); -} - -void test_revwalk_mergebase__single2(void) -{ - git_oid result, one, two, expected; - size_t ahead, behind; - - cl_git_pass(git_oid_fromstr(&one, "763d71aadf09a7951596c9746c024e7eece7c7af")); - cl_git_pass(git_oid_fromstr(&two, "a65fedf39aefe402d3bb6e24df4d4f5fe4547750")); - cl_git_pass(git_oid_fromstr(&expected, "c47800c7266a2be04c571c04d5a6614691ea99bd")); - - cl_git_pass(git_merge_base(&result, _repo, &one, &two)); - cl_assert_equal_oid(&expected, &result); - - cl_git_pass(git_graph_ahead_behind( &ahead, &behind, _repo, &one, &two)); - cl_assert_equal_sz(ahead, 1); - cl_assert_equal_sz(behind, 4); - - cl_git_pass(git_graph_ahead_behind( &ahead, &behind, _repo, &two, &one)); - cl_assert_equal_sz(ahead, 4); - cl_assert_equal_sz(behind, 1); -} - -void test_revwalk_mergebase__merged_branch(void) -{ - git_oid result, one, two, expected; - size_t ahead, behind; - - cl_git_pass(git_oid_fromstr(&one, "a65fedf39aefe402d3bb6e24df4d4f5fe4547750")); - cl_git_pass(git_oid_fromstr(&two, "9fd738e8f7967c078dceed8190330fc8648ee56a")); - cl_git_pass(git_oid_fromstr(&expected, "9fd738e8f7967c078dceed8190330fc8648ee56a")); - - cl_git_pass(git_merge_base(&result, _repo, &one, &two)); - cl_assert_equal_oid(&expected, &result); - - cl_git_pass(git_merge_base(&result, _repo, &two, &one)); - cl_assert_equal_oid(&expected, &result); - - cl_git_pass(git_graph_ahead_behind(&ahead, &behind, _repo, &one, &two)); - cl_assert_equal_sz(ahead, 3); - cl_assert_equal_sz(behind, 0); - - cl_git_pass(git_graph_ahead_behind(&ahead, &behind, _repo, &two, &one)); - cl_assert_equal_sz(ahead, 0); - cl_assert_equal_sz(behind, 3); -} - -void test_revwalk_mergebase__two_way_merge(void) -{ - git_oid one, two; - size_t ahead, behind; - - cl_git_pass(git_oid_fromstr(&one, "9b219343610c88a1187c996d0dc58330b55cee28")); - cl_git_pass(git_oid_fromstr(&two, "a953a018c5b10b20c86e69fef55ebc8ad4c5a417")); - cl_git_pass(git_graph_ahead_behind(&ahead, &behind, _repo2, &one, &two)); - - cl_assert_equal_sz(ahead, 8); - cl_assert_equal_sz(behind, 2); - - cl_git_pass(git_graph_ahead_behind(&ahead, &behind, _repo2, &two, &one)); - - cl_assert_equal_sz(ahead, 2); - cl_assert_equal_sz(behind, 8); -} - -void test_revwalk_mergebase__no_common_ancestor_returns_ENOTFOUND(void) -{ - git_oid result, one, two; - size_t ahead, behind; - int error; - - cl_git_pass(git_oid_fromstr(&one, "763d71aadf09a7951596c9746c024e7eece7c7af")); - cl_git_pass(git_oid_fromstr(&two, "e90810b8df3e80c413d903f631643c716887138d")); - - error = git_merge_base(&result, _repo, &one, &two); - cl_git_fail(error); - - cl_assert_equal_i(GIT_ENOTFOUND, error); - - cl_git_pass(git_graph_ahead_behind(&ahead, &behind, _repo, &one, &two)); - cl_assert_equal_sz(4, ahead); - cl_assert_equal_sz(2, behind); -} - -void test_revwalk_mergebase__prefer_youngest_merge_base(void) -{ - git_oid result, one, two, expected; - - cl_git_pass(git_oid_fromstr(&one, "a4a7dce85cf63874e984719f4fdd239f5145052f")); - cl_git_pass(git_oid_fromstr(&two, "be3563ae3f795b2b4353bcce3a527ad0a4f7f644")); - cl_git_pass(git_oid_fromstr(&expected, "c47800c7266a2be04c571c04d5a6614691ea99bd")); - - cl_git_pass(git_merge_base(&result, _repo, &one, &two)); - cl_assert_equal_oid(&expected, &result); -} - -void test_revwalk_mergebase__multiple_merge_bases(void) -{ - git_oid one, two, expected1, expected2; - git_oidarray result = {NULL, 0}; - - cl_git_pass(git_oid_fromstr(&one, "a4a7dce85cf63874e984719f4fdd239f5145052f")); - cl_git_pass(git_oid_fromstr(&two, "be3563ae3f795b2b4353bcce3a527ad0a4f7f644")); - cl_git_pass(git_oid_fromstr(&expected1, "c47800c7266a2be04c571c04d5a6614691ea99bd")); - cl_git_pass(git_oid_fromstr(&expected2, "9fd738e8f7967c078dceed8190330fc8648ee56a")); - - cl_git_pass(git_merge_bases(&result, _repo, &one, &two)); - cl_assert_equal_i(2, result.count); - cl_assert_equal_oid(&expected1, &result.ids[0]); - cl_assert_equal_oid(&expected2, &result.ids[1]); - - git_oidarray_free(&result); -} - -void test_revwalk_mergebase__multiple_merge_bases_many_commits(void) -{ - git_oid expected1, expected2; - git_oidarray result = {NULL, 0}; - - git_oid *input = git__malloc(sizeof(git_oid) * 2); - - cl_git_pass(git_oid_fromstr(&input[0], "a4a7dce85cf63874e984719f4fdd239f5145052f")); - cl_git_pass(git_oid_fromstr(&input[1], "be3563ae3f795b2b4353bcce3a527ad0a4f7f644")); - cl_git_pass(git_oid_fromstr(&expected1, "c47800c7266a2be04c571c04d5a6614691ea99bd")); - cl_git_pass(git_oid_fromstr(&expected2, "9fd738e8f7967c078dceed8190330fc8648ee56a")); - - cl_git_pass(git_merge_bases_many(&result, _repo, 2, input)); - cl_assert_equal_i(2, result.count); - cl_assert_equal_oid(&expected1, &result.ids[0]); - cl_assert_equal_oid(&expected2, &result.ids[1]); - - git_oidarray_free(&result); - git__free(input); -} - -void test_revwalk_mergebase__no_off_by_one_missing(void) -{ - git_oid result, one, two; - - cl_git_pass(git_oid_fromstr(&one, "1a443023183e3f2bfbef8ac923cd81c1018a18fd")); - cl_git_pass(git_oid_fromstr(&two, "9f13f7d0a9402c681f91dc590cf7b5470e6a77d2")); - cl_git_pass(git_merge_base(&result, _repo, &one, &two)); -} - -static void assert_mergebase_many(const char *expected_sha, int count, ...) -{ - va_list ap; - int i; - git_oid *oids; - git_oid oid, expected; - char *partial_oid; - git_object *object; - - oids = git__malloc(count * sizeof(git_oid)); - cl_assert(oids != NULL); - - memset(oids, 0x0, count * sizeof(git_oid)); - - va_start(ap, count); - - for (i = 0; i < count; ++i) { - partial_oid = va_arg(ap, char *); - cl_git_pass(git_oid_fromstrn(&oid, partial_oid, strlen(partial_oid))); - - cl_git_pass(git_object_lookup_prefix(&object, _repo, &oid, strlen(partial_oid), GIT_OBJ_COMMIT)); - git_oid_cpy(&oids[i], git_object_id(object)); - git_object_free(object); - } - - va_end(ap); - - if (expected_sha == NULL) - cl_assert_equal_i(GIT_ENOTFOUND, git_merge_base_many(&oid, _repo, count, oids)); - else { - cl_git_pass(git_merge_base_many(&oid, _repo, count, oids)); - cl_git_pass(git_oid_fromstr(&expected, expected_sha)); - - cl_assert_equal_oid(&expected, &oid); - } - - git__free(oids); -} - -void test_revwalk_mergebase__many_no_common_ancestor_returns_ENOTFOUND(void) -{ - assert_mergebase_many(NULL, 3, "41bc8c", "e90810", "a65fed"); - assert_mergebase_many(NULL, 3, "e90810", "41bc8c", "a65fed"); - assert_mergebase_many(NULL, 3, "e90810", "a65fed", "41bc8c"); - assert_mergebase_many(NULL, 3, "a65fed", "e90810", "41bc8c"); - assert_mergebase_many(NULL, 3, "a65fed", "41bc8c", "e90810"); - - assert_mergebase_many(NULL, 3, "e90810", "763d71", "a65fed"); -} - -void test_revwalk_mergebase__many_merge_branch(void) -{ - assert_mergebase_many("c47800c7266a2be04c571c04d5a6614691ea99bd", 3, "a65fed", "763d71", "849607"); - - assert_mergebase_many("c47800c7266a2be04c571c04d5a6614691ea99bd", 3, "763d71", "e90810", "a65fed"); - assert_mergebase_many("c47800c7266a2be04c571c04d5a6614691ea99bd", 3, "763d71", "a65fed", "e90810"); - - assert_mergebase_many("c47800c7266a2be04c571c04d5a6614691ea99bd", 3, "a65fed", "763d71", "849607"); - assert_mergebase_many("c47800c7266a2be04c571c04d5a6614691ea99bd", 3, "a65fed", "849607", "763d71"); - assert_mergebase_many("8496071c1b46c854b31185ea97743be6a8774479", 3, "849607", "a65fed", "763d71"); - - assert_mergebase_many("5b5b025afb0b4c913b4c338a42934a3863bf3644", 5, "5b5b02", "763d71", "a4a7dc", "a65fed", "41bc8c"); -} - -static void assert_mergebase_octopus(const char *expected_sha, int count, ...) -{ - va_list ap; - int i; - git_oid *oids; - git_oid oid, expected; - char *partial_oid; - git_object *object; - - oids = git__malloc(count * sizeof(git_oid)); - cl_assert(oids != NULL); - - memset(oids, 0x0, count * sizeof(git_oid)); - - va_start(ap, count); - - for (i = 0; i < count; ++i) { - partial_oid = va_arg(ap, char *); - cl_git_pass(git_oid_fromstrn(&oid, partial_oid, strlen(partial_oid))); - - cl_git_pass(git_object_lookup_prefix(&object, _repo, &oid, strlen(partial_oid), GIT_OBJ_COMMIT)); - git_oid_cpy(&oids[i], git_object_id(object)); - git_object_free(object); - } - - va_end(ap); - - if (expected_sha == NULL) - cl_assert_equal_i(GIT_ENOTFOUND, git_merge_base_octopus(&oid, _repo, count, oids)); - else { - cl_git_pass(git_merge_base_octopus(&oid, _repo, count, oids)); - cl_git_pass(git_oid_fromstr(&expected, expected_sha)); - - cl_assert_equal_oid(&expected, &oid); - } - - git__free(oids); -} - -void test_revwalk_mergebase__octopus_no_common_ancestor_returns_ENOTFOUND(void) -{ - assert_mergebase_octopus(NULL, 3, "41bc8c", "e90810", "a65fed"); - assert_mergebase_octopus(NULL, 3, "e90810", "41bc8c", "a65fed"); - assert_mergebase_octopus(NULL, 3, "e90810", "a65fed", "41bc8c"); - assert_mergebase_octopus(NULL, 3, "a65fed", "e90810", "41bc8c"); - assert_mergebase_octopus(NULL, 3, "a65fed", "41bc8c", "e90810"); - - assert_mergebase_octopus(NULL, 3, "e90810", "763d71", "a65fed"); - - assert_mergebase_octopus(NULL, 3, "763d71", "e90810", "a65fed"); - assert_mergebase_octopus(NULL, 3, "763d71", "a65fed", "e90810"); - - assert_mergebase_octopus(NULL, 5, "5b5b02", "763d71", "a4a7dc", "a65fed", "41bc8c"); -} - -void test_revwalk_mergebase__octopus_merge_branch(void) -{ - assert_mergebase_octopus("8496071c1b46c854b31185ea97743be6a8774479", 3, "a65fed", "763d71", "849607"); - - assert_mergebase_octopus("8496071c1b46c854b31185ea97743be6a8774479", 3, "a65fed", "763d71", "849607"); - assert_mergebase_octopus("8496071c1b46c854b31185ea97743be6a8774479", 3, "a65fed", "849607", "763d71"); - assert_mergebase_octopus("8496071c1b46c854b31185ea97743be6a8774479", 3, "849607", "a65fed", "763d71"); -} - -/* - * testrepo.git $ git log --graph --all - * * commit 763d71aadf09a7951596c9746c024e7eece7c7af - * | Author: nulltoken - * | Date: Sun Oct 9 12:54:47 2011 +0200 - * | - * | Add some files into subdirectories - * | - * | * commit a65fedf39aefe402d3bb6e24df4d4f5fe4547750 - * | | Author: Scott Chacon - * | | Date: Tue Aug 9 19:33:46 2011 -0700 - * | | - * | * commit be3563ae3f795b2b4353bcce3a527ad0a4f7f644 - * | |\ Merge: 9fd738e c47800c - * | |/ Author: Scott Chacon - * |/| Date: Tue May 25 11:58:27 2010 -0700 - * | | - * | | Merge branch 'br2' - * | | - * | | * commit e90810b8df3e80c413d903f631643c716887138d - * | | | Author: Vicent Marti - * | | | Date: Thu Aug 5 18:42:20 2010 +0200 - * | | | - * | | | Test commit 2 - * | | | - * | | * commit 6dcf9bf7541ee10456529833502442f385010c3d - * | | Author: Vicent Marti - * | | Date: Thu Aug 5 18:41:33 2010 +0200 - * | | - * | | Test commit 1 - * | | - * | | * commit a4a7dce85cf63874e984719f4fdd239f5145052f - * | | |\ Merge: c47800c 9fd738e - * | |/ / Author: Scott Chacon - * |/| / Date: Tue May 25 12:00:23 2010 -0700 - * | |/ - * | | Merge branch 'master' into br2 - * | | - * | * commit 9fd738e8f7967c078dceed8190330fc8648ee56a - * | | Author: Scott Chacon - * | | Date: Mon May 24 10:19:19 2010 -0700 - * | | - * | | a fourth commit - * | | - * | * commit 4a202b346bb0fb0db7eff3cffeb3c70babbd2045 - * | | Author: Scott Chacon - * | | Date: Mon May 24 10:19:04 2010 -0700 - * | | - * | | a third commit - * | | - * * | commit c47800c7266a2be04c571c04d5a6614691ea99bd - * |/ Author: Scott Chacon - * | Date: Tue May 25 11:58:14 2010 -0700 - * | - * | branch commit one - * | - * * commit 5b5b025afb0b4c913b4c338a42934a3863bf3644 - * | Author: Scott Chacon - * | Date: Tue May 11 13:38:42 2010 -0700 - * | - * | another commit - * | - * * commit 8496071c1b46c854b31185ea97743be6a8774479 - * Author: Scott Chacon - * Date: Sat May 8 16:13:06 2010 -0700 - * - * testing - * - * * commit 41bc8c69075bbdb46c5c6f0566cc8cc5b46e8bd9 - * | Author: Scott Chacon - * | Date: Tue May 11 13:40:41 2010 -0700 - * | - * | packed commit two - * | - * * commit 5001298e0c09ad9c34e4249bc5801c75e9754fa5 - * Author: Scott Chacon - * Date: Tue May 11 13:40:23 2010 -0700 - * - * packed commit one - */ - -/* - * twowaymerge.git $ git log --graph --all - * * commit 9b219343610c88a1187c996d0dc58330b55cee28 - * |\ Merge: c37a783 2224e19 - * | | Author: Scott J. Goldman - * | | Date: Tue Nov 27 20:31:04 2012 -0800 - * | | - * | | Merge branch 'first-branch' into second-branch - * | | - * | * commit 2224e191514cb4bd8c566d80dac22dfcb1e9bb83 - * | | Author: Scott J. Goldman - * | | Date: Tue Nov 27 20:28:51 2012 -0800 - * | | - * | | j - * | | - * | * commit a41a49f8f5cd9b6cb14a076bf8394881ed0b4d19 - * | | Author: Scott J. Goldman - * | | Date: Tue Nov 27 20:28:39 2012 -0800 - * | | - * | | i - * | | - * | * commit 82bf9a1a10a4b25c1f14c9607b60970705e92545 - * | | Author: Scott J. Goldman - * | | Date: Tue Nov 27 20:28:28 2012 -0800 - * | | - * | | h - * | | - * * | commit c37a783c20d92ac92362a78a32860f7eebf938ef - * | | Author: Scott J. Goldman - * | | Date: Tue Nov 27 20:30:57 2012 -0800 - * | | - * | | n - * | | - * * | commit 8b82fb1794cb1c8c7f172ec730a4c2db0ae3e650 - * | | Author: Scott J. Goldman - * | | Date: Tue Nov 27 20:30:43 2012 -0800 - * | | - * | | m - * | | - * * | commit 6ab5d28acbf3c3bdff276f7ccfdf29c1520e542f - * | | Author: Scott J. Goldman - * | | Date: Tue Nov 27 20:30:38 2012 -0800 - * | | - * | | l - * | | - * * | commit 7b8c336c45fc6895c1c60827260fe5d798e5d247 - * | | Author: Scott J. Goldman - * | | Date: Tue Nov 27 20:30:24 2012 -0800 - * | | - * | | k - * | | - * | | * commit 1c30b88f5f3ee66d78df6520a7de9e89b890818b - * | | | Author: Scott J. Goldman - * | | | Date: Tue Nov 27 20:28:10 2012 -0800 - * | | | - * | | | e - * | | | - * | | * commit 42b7311aa626e712891940c1ec5d5cba201946a4 - * | | | Author: Scott J. Goldman - * | | | Date: Tue Nov 27 20:28:06 2012 -0800 - * | | | - * | | | d - * | | | - * | | * commit a953a018c5b10b20c86e69fef55ebc8ad4c5a417 - * | | |\ Merge: bd1732c cdf97fd - * | | |/ Author: Scott J. Goldman - * | |/| Date: Tue Nov 27 20:26:43 2012 -0800 - * | | | - * | | | Merge branch 'first-branch' - * | | | - * | * | commit cdf97fd3bb48eb3827638bb33d208f5fd32d0aa6 - * | | | Author: Scott J. Goldman - * | | | Date: Tue Nov 27 20:24:46 2012 -0800 - * | | | - * | | | g - * | | | - * | * | commit ef0488f0b722f0be8bcb90a7730ac7efafd1d694 - * | | | Author: Scott J. Goldman - * | | | Date: Tue Nov 27 20:24:39 2012 -0800 - * | | | - * | | | f - * | | | - * | | * commit bd1732c43c68d712ad09e1d872b9be6d4b9efdc4 - * | |/ Author: Scott J. Goldman - * | | Date: Tue Nov 27 17:43:58 2012 -0800 - * | | - * | | c - * | | - * | * commit 0c8a3f1f3d5f421cf83048c7c73ee3b55a5e0f29 - * |/ Author: Scott J. Goldman - * | Date: Tue Nov 27 17:43:48 2012 -0800 - * | - * | b - * | - * * commit 1f4c0311a24b63f6fc209a59a1e404942d4a5006 - * Author: Scott J. Goldman - * Date: Tue Nov 27 17:43:41 2012 -0800 - * - * a - */ diff --git a/vendor/libgit2/tests/revwalk/signatureparsing.c b/vendor/libgit2/tests/revwalk/signatureparsing.c deleted file mode 100644 index 5c7d8813dc..0000000000 --- a/vendor/libgit2/tests/revwalk/signatureparsing.c +++ /dev/null @@ -1,47 +0,0 @@ -#include "clar_libgit2.h" - -static git_repository *_repo; -static git_revwalk *_walk; - -void test_revwalk_signatureparsing__initialize(void) -{ - cl_git_pass(git_repository_open(&_repo, cl_fixture("testrepo.git"))); - cl_git_pass(git_revwalk_new(&_walk, _repo)); -} - -void test_revwalk_signatureparsing__cleanup(void) -{ - git_revwalk_free(_walk); - _walk = NULL; - - git_repository_free(_repo); - _repo = NULL; -} - -void test_revwalk_signatureparsing__do_not_choke_when_name_contains_angle_brackets(void) -{ - git_reference *ref; - git_oid commit_oid; - git_commit *commit; - const git_signature *signature; - - /* - * The branch below points at a commit with angle brackets in the committer/author name - * committer 1323847743 +0100 - */ - cl_git_pass(git_reference_lookup(&ref, _repo, "refs/heads/haacked")); - - git_revwalk_push(_walk, git_reference_target(ref)); - cl_git_pass(git_revwalk_next(&commit_oid, _walk)); - - cl_git_pass(git_commit_lookup(&commit, _repo, git_reference_target(ref))); - - signature = git_commit_committer(commit); - cl_assert_equal_s("foo@example.com", signature->email); - cl_assert_equal_s("", signature->name); - cl_assert_equal_i(1323847743, (int)signature->when.time); - cl_assert_equal_i(60, signature->when.offset); - - git_commit_free(commit); - git_reference_free(ref); -} diff --git a/vendor/libgit2/tests/revwalk/simplify.c b/vendor/libgit2/tests/revwalk/simplify.c deleted file mode 100644 index f65ce6c593..0000000000 --- a/vendor/libgit2/tests/revwalk/simplify.c +++ /dev/null @@ -1,55 +0,0 @@ -#include "clar_libgit2.h" - -void test_revwalk_simplify__cleanup(void) -{ - cl_git_sandbox_cleanup(); -} - -/* - * a4a7dce [0] Merge branch 'master' into br2 - |\ - | * 9fd738e [1] a fourth commit - | * 4a202b3 [2] a third commit - * | c47800c [3] branch commit one - |/ - * 5b5b025 [5] another commit - * 8496071 [4] testing -*/ -static const char *commit_head = "a4a7dce85cf63874e984719f4fdd239f5145052f"; - -static const char *expected_str[] = { - "a4a7dce85cf63874e984719f4fdd239f5145052f", /* 0 */ - "c47800c7266a2be04c571c04d5a6614691ea99bd", /* 3 */ - "5b5b025afb0b4c913b4c338a42934a3863bf3644", /* 4 */ - "8496071c1b46c854b31185ea97743be6a8774479", /* 5 */ -}; - -void test_revwalk_simplify__first_parent(void) -{ - git_repository *repo; - git_revwalk *walk; - git_oid id, expected[4]; - int i, error; - - for (i = 0; i < 4; i++) { - git_oid_fromstr(&expected[i], expected_str[i]); - } - - repo = cl_git_sandbox_init("testrepo.git"); - cl_git_pass(git_revwalk_new(&walk, repo)); - - git_oid_fromstr(&id, commit_head); - cl_git_pass(git_revwalk_push(walk, &id)); - git_revwalk_simplify_first_parent(walk); - - i = 0; - while ((error = git_revwalk_next(&id, walk)) == 0) { - cl_assert_equal_oid(&expected[i], &id); - i++; - } - - cl_assert_equal_i(i, 4); - cl_assert_equal_i(error, GIT_ITEROVER); - - git_revwalk_free(walk); -} diff --git a/vendor/libgit2/tests/stash/apply.c b/vendor/libgit2/tests/stash/apply.c deleted file mode 100644 index f26b73b193..0000000000 --- a/vendor/libgit2/tests/stash/apply.c +++ /dev/null @@ -1,449 +0,0 @@ -#include "clar_libgit2.h" -#include "fileops.h" -#include "stash_helpers.h" - -static git_signature *signature; -static git_repository *repo; -static git_index *repo_index; - -void test_stash_apply__initialize(void) -{ - git_oid oid; - - repo = cl_git_sandbox_init_new("stash"); - cl_git_pass(git_repository_index(&repo_index, repo)); - cl_git_pass(git_signature_new(&signature, "nulltoken", "emeric.fermas@gmail.com", 1323847743, 60)); /* Wed Dec 14 08:29:03 2011 +0100 */ - - cl_git_mkfile("stash/what", "hello\n"); - cl_git_mkfile("stash/how", "small\n"); - cl_git_mkfile("stash/who", "world\n"); - cl_git_mkfile("stash/where", "meh\n"); - - cl_git_pass(git_index_add_bypath(repo_index, "what")); - cl_git_pass(git_index_add_bypath(repo_index, "how")); - cl_git_pass(git_index_add_bypath(repo_index, "who")); - - cl_repo_commit_from_index(NULL, repo, signature, 0, "Initial commit"); - - cl_git_rewritefile("stash/what", "goodbye\n"); - cl_git_rewritefile("stash/who", "funky world\n"); - cl_git_mkfile("stash/when", "tomorrow\n"); - cl_git_mkfile("stash/why", "would anybody use stash?\n"); - cl_git_mkfile("stash/where", "????\n"); - - cl_git_pass(git_index_add_bypath(repo_index, "who")); - cl_git_pass(git_index_add_bypath(repo_index, "why")); - cl_git_pass(git_index_add_bypath(repo_index, "where")); - git_index_write(repo_index); - - cl_git_rewritefile("stash/where", "....\n"); - - /* Pre-stash state */ - assert_status(repo, "what", GIT_STATUS_WT_MODIFIED); - assert_status(repo, "how", GIT_STATUS_CURRENT); - assert_status(repo, "who", GIT_STATUS_INDEX_MODIFIED); - assert_status(repo, "when", GIT_STATUS_WT_NEW); - assert_status(repo, "why", GIT_STATUS_INDEX_NEW); - assert_status(repo, "where", GIT_STATUS_INDEX_NEW|GIT_STATUS_WT_MODIFIED); - - cl_git_pass(git_stash_save(&oid, repo, signature, NULL, GIT_STASH_INCLUDE_UNTRACKED)); - - /* Post-stash state */ - assert_status(repo, "what", GIT_STATUS_CURRENT); - assert_status(repo, "how", GIT_STATUS_CURRENT); - assert_status(repo, "who", GIT_STATUS_CURRENT); - assert_status(repo, "when", GIT_ENOTFOUND); - assert_status(repo, "why", GIT_ENOTFOUND); - assert_status(repo, "where", GIT_ENOTFOUND); -} - -void test_stash_apply__cleanup(void) -{ - git_signature_free(signature); - signature = NULL; - - git_index_free(repo_index); - repo_index = NULL; - - cl_git_sandbox_cleanup(); -} - -void test_stash_apply__with_default(void) -{ - git_buf where = GIT_BUF_INIT; - - cl_git_pass(git_stash_apply(repo, 0, NULL)); - - cl_assert_equal_i(git_index_has_conflicts(repo_index), 0); - assert_status(repo, "what", GIT_STATUS_WT_MODIFIED); - assert_status(repo, "how", GIT_STATUS_CURRENT); - assert_status(repo, "who", GIT_STATUS_WT_MODIFIED); - assert_status(repo, "when", GIT_STATUS_WT_NEW); - assert_status(repo, "why", GIT_STATUS_INDEX_NEW); - assert_status(repo, "where", GIT_STATUS_INDEX_NEW); - - cl_git_pass(git_futils_readbuffer(&where, "stash/where")); - cl_assert_equal_s("....\n", where.ptr); - - git_buf_free(&where); -} - -void test_stash_apply__with_existing_file(void) -{ - cl_git_mkfile("stash/where", "oops!\n"); - cl_git_fail(git_stash_apply(repo, 0, NULL)); -} - -void test_stash_apply__merges_new_file(void) -{ - const git_index_entry *ancestor, *our, *their; - - cl_git_mkfile("stash/where", "committed before stash\n"); - cl_git_pass(git_index_add_bypath(repo_index, "where")); - cl_repo_commit_from_index(NULL, repo, signature, 0, "Other commit"); - - cl_git_pass(git_stash_apply(repo, 0, NULL)); - - cl_assert_equal_i(1, git_index_has_conflicts(repo_index)); - assert_status(repo, "what", GIT_STATUS_INDEX_MODIFIED); - cl_git_pass(git_index_conflict_get(&ancestor, &our, &their, repo_index, "where")); /* unmerged */ - assert_status(repo, "who", GIT_STATUS_INDEX_MODIFIED); - assert_status(repo, "when", GIT_STATUS_WT_NEW); - assert_status(repo, "why", GIT_STATUS_INDEX_NEW); -} - -void test_stash_apply__with_reinstate_index(void) -{ - git_buf where = GIT_BUF_INIT; - git_stash_apply_options opts = GIT_STASH_APPLY_OPTIONS_INIT; - - opts.flags = GIT_STASH_APPLY_REINSTATE_INDEX; - - cl_git_pass(git_stash_apply(repo, 0, &opts)); - - cl_assert_equal_i(git_index_has_conflicts(repo_index), 0); - assert_status(repo, "what", GIT_STATUS_WT_MODIFIED); - assert_status(repo, "how", GIT_STATUS_CURRENT); - assert_status(repo, "who", GIT_STATUS_INDEX_MODIFIED); - assert_status(repo, "when", GIT_STATUS_WT_NEW); - assert_status(repo, "why", GIT_STATUS_INDEX_NEW); - assert_status(repo, "where", GIT_STATUS_INDEX_NEW | GIT_STATUS_WT_MODIFIED); - - cl_git_pass(git_futils_readbuffer(&where, "stash/where")); - cl_assert_equal_s("....\n", where.ptr); - - git_buf_free(&where); -} - -void test_stash_apply__conflict_index_with_default(void) -{ - const git_index_entry *ancestor; - const git_index_entry *our; - const git_index_entry *their; - - cl_git_rewritefile("stash/who", "nothing\n"); - cl_git_pass(git_index_add_bypath(repo_index, "who")); - cl_git_pass(git_index_write(repo_index)); - cl_repo_commit_from_index(NULL, repo, signature, 0, "Other commit"); - - cl_git_pass(git_stash_apply(repo, 0, NULL)); - - cl_assert_equal_i(git_index_has_conflicts(repo_index), 1); - assert_status(repo, "what", GIT_STATUS_INDEX_MODIFIED); - assert_status(repo, "how", GIT_STATUS_CURRENT); - cl_git_pass(git_index_conflict_get(&ancestor, &our, &their, repo_index, "who")); /* unmerged */ - assert_status(repo, "when", GIT_STATUS_WT_NEW); - assert_status(repo, "why", GIT_STATUS_INDEX_NEW); -} - -void test_stash_apply__conflict_index_with_reinstate_index(void) -{ - git_stash_apply_options opts = GIT_STASH_APPLY_OPTIONS_INIT; - - opts.flags = GIT_STASH_APPLY_REINSTATE_INDEX; - - cl_git_rewritefile("stash/who", "nothing\n"); - cl_git_pass(git_index_add_bypath(repo_index, "who")); - cl_git_pass(git_index_write(repo_index)); - cl_repo_commit_from_index(NULL, repo, signature, 0, "Other commit"); - - cl_git_fail_with(git_stash_apply(repo, 0, &opts), GIT_ECONFLICT); - - cl_assert_equal_i(git_index_has_conflicts(repo_index), 0); - assert_status(repo, "what", GIT_STATUS_CURRENT); - assert_status(repo, "how", GIT_STATUS_CURRENT); - assert_status(repo, "who", GIT_STATUS_CURRENT); - assert_status(repo, "when", GIT_ENOTFOUND); - assert_status(repo, "why", GIT_ENOTFOUND); -} - -void test_stash_apply__conflict_untracked_with_default(void) -{ - git_stash_apply_options opts = GIT_STASH_APPLY_OPTIONS_INIT; - - cl_git_mkfile("stash/when", "nothing\n"); - - cl_git_fail_with(git_stash_apply(repo, 0, &opts), GIT_ECONFLICT); - - cl_assert_equal_i(git_index_has_conflicts(repo_index), 0); - assert_status(repo, "what", GIT_STATUS_CURRENT); - assert_status(repo, "how", GIT_STATUS_CURRENT); - assert_status(repo, "who", GIT_STATUS_CURRENT); - assert_status(repo, "when", GIT_STATUS_WT_NEW); - assert_status(repo, "why", GIT_ENOTFOUND); -} - -void test_stash_apply__conflict_untracked_with_reinstate_index(void) -{ - git_stash_apply_options opts = GIT_STASH_APPLY_OPTIONS_INIT; - - opts.flags = GIT_STASH_APPLY_REINSTATE_INDEX; - - cl_git_mkfile("stash/when", "nothing\n"); - - cl_git_fail_with(git_stash_apply(repo, 0, &opts), GIT_ECONFLICT); - - cl_assert_equal_i(git_index_has_conflicts(repo_index), 0); - assert_status(repo, "what", GIT_STATUS_CURRENT); - assert_status(repo, "how", GIT_STATUS_CURRENT); - assert_status(repo, "who", GIT_STATUS_CURRENT); - assert_status(repo, "when", GIT_STATUS_WT_NEW); - assert_status(repo, "why", GIT_ENOTFOUND); -} - -void test_stash_apply__conflict_workdir_with_default(void) -{ - cl_git_rewritefile("stash/what", "ciao\n"); - - cl_git_fail_with(git_stash_apply(repo, 0, NULL), GIT_ECONFLICT); - - cl_assert_equal_i(git_index_has_conflicts(repo_index), 0); - assert_status(repo, "what", GIT_STATUS_WT_MODIFIED); - assert_status(repo, "how", GIT_STATUS_CURRENT); - assert_status(repo, "who", GIT_STATUS_CURRENT); - assert_status(repo, "when", GIT_STATUS_WT_NEW); - assert_status(repo, "why", GIT_ENOTFOUND); -} - -void test_stash_apply__conflict_workdir_with_reinstate_index(void) -{ - git_stash_apply_options opts = GIT_STASH_APPLY_OPTIONS_INIT; - - opts.flags = GIT_STASH_APPLY_REINSTATE_INDEX; - - cl_git_rewritefile("stash/what", "ciao\n"); - - cl_git_fail_with(git_stash_apply(repo, 0, &opts), GIT_ECONFLICT); - - cl_assert_equal_i(git_index_has_conflicts(repo_index), 0); - assert_status(repo, "what", GIT_STATUS_WT_MODIFIED); - assert_status(repo, "how", GIT_STATUS_CURRENT); - assert_status(repo, "who", GIT_STATUS_CURRENT); - assert_status(repo, "when", GIT_STATUS_WT_NEW); - assert_status(repo, "why", GIT_ENOTFOUND); -} - -void test_stash_apply__conflict_commit_with_default(void) -{ - const git_index_entry *ancestor; - const git_index_entry *our; - const git_index_entry *their; - - cl_git_rewritefile("stash/what", "ciao\n"); - cl_git_pass(git_index_add_bypath(repo_index, "what")); - cl_repo_commit_from_index(NULL, repo, signature, 0, "Other commit"); - - cl_git_pass(git_stash_apply(repo, 0, NULL)); - - cl_assert_equal_i(git_index_has_conflicts(repo_index), 1); - cl_git_pass(git_index_conflict_get(&ancestor, &our, &their, repo_index, "what")); /* unmerged */ - assert_status(repo, "how", GIT_STATUS_CURRENT); - assert_status(repo, "who", GIT_STATUS_INDEX_MODIFIED); - assert_status(repo, "when", GIT_STATUS_WT_NEW); - assert_status(repo, "why", GIT_STATUS_INDEX_NEW); -} - -void test_stash_apply__conflict_commit_with_reinstate_index(void) -{ - git_stash_apply_options opts = GIT_STASH_APPLY_OPTIONS_INIT; - const git_index_entry *ancestor; - const git_index_entry *our; - const git_index_entry *their; - - opts.flags = GIT_STASH_APPLY_REINSTATE_INDEX; - - cl_git_rewritefile("stash/what", "ciao\n"); - cl_git_pass(git_index_add_bypath(repo_index, "what")); - cl_repo_commit_from_index(NULL, repo, signature, 0, "Other commit"); - - cl_git_pass(git_stash_apply(repo, 0, &opts)); - - cl_assert_equal_i(git_index_has_conflicts(repo_index), 1); - cl_git_pass(git_index_conflict_get(&ancestor, &our, &their, repo_index, "what")); /* unmerged */ - assert_status(repo, "how", GIT_STATUS_CURRENT); - assert_status(repo, "who", GIT_STATUS_INDEX_MODIFIED); - assert_status(repo, "when", GIT_STATUS_WT_NEW); - assert_status(repo, "why", GIT_STATUS_INDEX_NEW); -} - -void test_stash_apply__fails_with_uncommitted_changes_in_index(void) -{ - cl_git_rewritefile("stash/who", "nothing\n"); - cl_git_pass(git_index_add_bypath(repo_index, "who")); - cl_git_pass(git_index_write(repo_index)); - - cl_git_fail_with(git_stash_apply(repo, 0, NULL), GIT_EUNCOMMITTED); - - cl_assert_equal_i(git_index_has_conflicts(repo_index), 0); - assert_status(repo, "what", GIT_STATUS_CURRENT); - assert_status(repo, "how", GIT_STATUS_CURRENT); - assert_status(repo, "who", GIT_STATUS_INDEX_MODIFIED); - assert_status(repo, "when", GIT_ENOTFOUND); - assert_status(repo, "why", GIT_ENOTFOUND); -} - -void test_stash_apply__pop(void) -{ - cl_git_pass(git_stash_pop(repo, 0, NULL)); - - cl_git_fail_with(git_stash_pop(repo, 0, NULL), GIT_ENOTFOUND); -} - -struct seen_paths { - bool what; - bool how; - bool who; - bool when; -}; - -int checkout_notify( - git_checkout_notify_t why, - const char *path, - const git_diff_file *baseline, - const git_diff_file *target, - const git_diff_file *workdir, - void *payload) -{ - struct seen_paths *seen_paths = (struct seen_paths *)payload; - - GIT_UNUSED(why); - GIT_UNUSED(baseline); - GIT_UNUSED(target); - GIT_UNUSED(workdir); - - if (strcmp(path, "what") == 0) - seen_paths->what = 1; - else if (strcmp(path, "how") == 0) - seen_paths->how = 1; - else if (strcmp(path, "who") == 0) - seen_paths->who = 1; - else if (strcmp(path, "when") == 0) - seen_paths->when = 1; - - return 0; -} - -void test_stash_apply__executes_notify_cb(void) -{ - git_stash_apply_options opts = GIT_STASH_APPLY_OPTIONS_INIT; - struct seen_paths seen_paths = {0}; - - opts.checkout_options.notify_cb = checkout_notify; - opts.checkout_options.notify_flags = GIT_CHECKOUT_NOTIFY_ALL; - opts.checkout_options.notify_payload = &seen_paths; - - cl_git_pass(git_stash_apply(repo, 0, &opts)); - - cl_assert_equal_i(git_index_has_conflicts(repo_index), 0); - assert_status(repo, "what", GIT_STATUS_WT_MODIFIED); - assert_status(repo, "how", GIT_STATUS_CURRENT); - assert_status(repo, "who", GIT_STATUS_WT_MODIFIED); - assert_status(repo, "when", GIT_STATUS_WT_NEW); - assert_status(repo, "why", GIT_STATUS_INDEX_NEW); - assert_status(repo, "where", GIT_STATUS_INDEX_NEW); - - cl_assert_equal_b(true, seen_paths.what); - cl_assert_equal_b(false, seen_paths.how); - cl_assert_equal_b(true, seen_paths.who); - cl_assert_equal_b(true, seen_paths.when); -} - -int progress_cb( - git_stash_apply_progress_t progress, - void *payload) -{ - git_stash_apply_progress_t *p = (git_stash_apply_progress_t *)payload; - - cl_assert_equal_i((*p)+1, progress); - - *p = progress; - - return 0; -} - -void test_stash_apply__calls_progress_cb(void) -{ - git_stash_apply_options opts = GIT_STASH_APPLY_OPTIONS_INIT; - git_stash_apply_progress_t progress = GIT_STASH_APPLY_PROGRESS_NONE; - - opts.progress_cb = progress_cb; - opts.progress_payload = &progress; - - cl_git_pass(git_stash_apply(repo, 0, &opts)); - cl_assert_equal_i(progress, GIT_STASH_APPLY_PROGRESS_DONE); -} - -int aborting_progress_cb( - git_stash_apply_progress_t progress, - void *payload) -{ - GIT_UNUSED(payload); - - if (progress == GIT_STASH_APPLY_PROGRESS_ANALYZE_MODIFIED) - return -44; - - return 0; -} - -void test_stash_apply__progress_cb_can_abort(void) -{ - git_stash_apply_options opts = GIT_STASH_APPLY_OPTIONS_INIT; - - opts.progress_cb = aborting_progress_cb; - - cl_git_fail_with(-44, git_stash_apply(repo, 0, &opts)); -} - -void test_stash_apply__uses_reflog_like_indices_1(void) -{ - git_oid oid; - - cl_git_mkfile("stash/untracked", "untracked\n"); - cl_git_pass(git_stash_save(&oid, repo, signature, NULL, GIT_STASH_INCLUDE_UNTRACKED)); - assert_status(repo, "untracked", GIT_ENOTFOUND); - - // stash@{1} is the oldest (first) stash we made - cl_git_pass(git_stash_apply(repo, 1, NULL)); - cl_assert_equal_i(git_index_has_conflicts(repo_index), 0); - assert_status(repo, "what", GIT_STATUS_WT_MODIFIED); - assert_status(repo, "how", GIT_STATUS_CURRENT); - assert_status(repo, "who", GIT_STATUS_WT_MODIFIED); - assert_status(repo, "when", GIT_STATUS_WT_NEW); - assert_status(repo, "why", GIT_STATUS_INDEX_NEW); - assert_status(repo, "where", GIT_STATUS_INDEX_NEW); -} - -void test_stash_apply__uses_reflog_like_indices_2(void) -{ - git_oid oid; - - cl_git_mkfile("stash/untracked", "untracked\n"); - cl_git_pass(git_stash_save(&oid, repo, signature, NULL, GIT_STASH_INCLUDE_UNTRACKED)); - assert_status(repo, "untracked", GIT_ENOTFOUND); - - // stash@{0} is the newest stash we made immediately above - cl_git_pass(git_stash_apply(repo, 0, NULL)); - - cl_assert_equal_i(git_index_has_conflicts(repo_index), 0); - assert_status(repo, "untracked", GIT_STATUS_WT_NEW); -} diff --git a/vendor/libgit2/tests/stash/drop.c b/vendor/libgit2/tests/stash/drop.c deleted file mode 100644 index 89a0ade723..0000000000 --- a/vendor/libgit2/tests/stash/drop.c +++ /dev/null @@ -1,174 +0,0 @@ -#include "clar_libgit2.h" -#include "fileops.h" -#include "stash_helpers.h" -#include "refs.h" - -static git_repository *repo; -static git_signature *signature; - -void test_stash_drop__initialize(void) -{ - cl_git_pass(git_repository_init(&repo, "stash", 0)); - cl_git_pass(git_signature_new(&signature, "nulltoken", "emeric.fermas@gmail.com", 1323847743, 60)); /* Wed Dec 14 08:29:03 2011 +0100 */ -} - -void test_stash_drop__cleanup(void) -{ - git_signature_free(signature); - signature = NULL; - - git_repository_free(repo); - repo = NULL; - - cl_git_pass(git_futils_rmdir_r("stash", NULL, GIT_RMDIR_REMOVE_FILES)); -} - -void test_stash_drop__cannot_drop_from_an_empty_stash(void) -{ - cl_git_fail_with(git_stash_drop(repo, 0), GIT_ENOTFOUND); -} - -static void push_three_states(void) -{ - git_oid oid; - git_index *index; - - cl_git_mkfile("stash/zero.txt", "content\n"); - cl_git_pass(git_repository_index(&index, repo)); - cl_git_pass(git_index_add_bypath(index, "zero.txt")); - cl_repo_commit_from_index(NULL, repo, signature, 0, "Initial commit"); - cl_assert(git_path_exists("stash/zero.txt")); - git_index_free(index); - - cl_git_mkfile("stash/one.txt", "content\n"); - cl_git_pass(git_stash_save( - &oid, repo, signature, "First", GIT_STASH_INCLUDE_UNTRACKED)); - cl_assert(!git_path_exists("stash/one.txt")); - cl_assert(git_path_exists("stash/zero.txt")); - - cl_git_mkfile("stash/two.txt", "content\n"); - cl_git_pass(git_stash_save( - &oid, repo, signature, "Second", GIT_STASH_INCLUDE_UNTRACKED)); - cl_assert(!git_path_exists("stash/two.txt")); - cl_assert(git_path_exists("stash/zero.txt")); - - cl_git_mkfile("stash/three.txt", "content\n"); - cl_git_pass(git_stash_save( - &oid, repo, signature, "Third", GIT_STASH_INCLUDE_UNTRACKED)); - cl_assert(!git_path_exists("stash/three.txt")); - cl_assert(git_path_exists("stash/zero.txt")); -} - -void test_stash_drop__cannot_drop_a_non_existing_stashed_state(void) -{ - push_three_states(); - - cl_git_fail_with(git_stash_drop(repo, 666), GIT_ENOTFOUND); - cl_git_fail_with(git_stash_drop(repo, 42), GIT_ENOTFOUND); - cl_git_fail_with(git_stash_drop(repo, 3), GIT_ENOTFOUND); -} - -void test_stash_drop__can_purge_the_stash_from_the_top(void) -{ - push_three_states(); - - cl_git_pass(git_stash_drop(repo, 0)); - cl_git_pass(git_stash_drop(repo, 0)); - cl_git_pass(git_stash_drop(repo, 0)); - - cl_git_fail_with(git_stash_drop(repo, 0), GIT_ENOTFOUND); -} - -void test_stash_drop__can_purge_the_stash_from_the_bottom(void) -{ - push_three_states(); - - cl_git_pass(git_stash_drop(repo, 2)); - cl_git_pass(git_stash_drop(repo, 1)); - cl_git_pass(git_stash_drop(repo, 0)); - - cl_git_fail_with(git_stash_drop(repo, 0), GIT_ENOTFOUND); -} - -void test_stash_drop__dropping_an_entry_rewrites_reflog_history(void) -{ - git_reference *stash; - git_reflog *reflog; - const git_reflog_entry *entry; - git_oid oid; - size_t count; - - push_three_states(); - - cl_git_pass(git_reference_lookup(&stash, repo, GIT_REFS_STASH_FILE)); - - cl_git_pass(git_reflog_read(&reflog, repo, GIT_REFS_STASH_FILE)); - entry = git_reflog_entry_byindex(reflog, 1); - - git_oid_cpy(&oid, git_reflog_entry_id_old(entry)); - count = git_reflog_entrycount(reflog); - - git_reflog_free(reflog); - - cl_git_pass(git_stash_drop(repo, 1)); - - cl_git_pass(git_reflog_read(&reflog, repo, GIT_REFS_STASH_FILE)); - entry = git_reflog_entry_byindex(reflog, 0); - - cl_assert_equal_oid(&oid, git_reflog_entry_id_old(entry)); - cl_assert_equal_sz(count - 1, git_reflog_entrycount(reflog)); - - git_reflog_free(reflog); - - git_reference_free(stash); -} - -void test_stash_drop__dropping_the_last_entry_removes_the_stash(void) -{ - git_reference *stash; - - push_three_states(); - - cl_git_pass(git_reference_lookup(&stash, repo, GIT_REFS_STASH_FILE)); - git_reference_free(stash); - - cl_git_pass(git_stash_drop(repo, 0)); - cl_git_pass(git_stash_drop(repo, 0)); - cl_git_pass(git_stash_drop(repo, 0)); - - cl_git_fail_with( - git_reference_lookup(&stash, repo, GIT_REFS_STASH_FILE), GIT_ENOTFOUND); -} - -void retrieve_top_stash_id(git_oid *out) -{ - git_object *top_stash; - - cl_git_pass(git_revparse_single(&top_stash, repo, "stash@{0}")); - cl_git_pass(git_reference_name_to_id(out, repo, GIT_REFS_STASH_FILE)); - - cl_assert_equal_oid(out, git_object_id(top_stash)); - - git_object_free(top_stash); -} - -void test_stash_drop__dropping_the_top_stash_updates_the_stash_reference(void) -{ - git_object *next_top_stash; - git_oid oid; - - push_three_states(); - - retrieve_top_stash_id(&oid); - - cl_git_pass(git_revparse_single(&next_top_stash, repo, "stash@{1}")); - cl_assert(git_oid_cmp(&oid, git_object_id(next_top_stash))); - - cl_git_pass(git_stash_drop(repo, 0)); - - retrieve_top_stash_id(&oid); - - cl_assert_equal_oid(&oid, git_object_id(next_top_stash)); - - git_object_free(next_top_stash); -} diff --git a/vendor/libgit2/tests/stash/foreach.c b/vendor/libgit2/tests/stash/foreach.c deleted file mode 100644 index 57dc8eeb42..0000000000 --- a/vendor/libgit2/tests/stash/foreach.c +++ /dev/null @@ -1,126 +0,0 @@ -#include "clar_libgit2.h" -#include "fileops.h" -#include "stash_helpers.h" - -struct callback_data -{ - char **oids; - int invokes; -}; - -static git_repository *repo; -static git_signature *signature; -static git_oid stash_tip_oid; -struct callback_data data; - -#define REPO_NAME "stash" - -void test_stash_foreach__initialize(void) -{ - cl_git_pass(git_signature_new( - &signature, - "nulltoken", - "emeric.fermas@gmail.com", - 1323847743, 60)); /* Wed Dec 14 08:29:03 2011 +0100 */ - - memset(&data, 0, sizeof(struct callback_data)); -} - -void test_stash_foreach__cleanup(void) -{ - git_signature_free(signature); - signature = NULL; - - git_repository_free(repo); - repo = NULL; - - cl_git_pass(git_futils_rmdir_r(REPO_NAME, NULL, GIT_RMDIR_REMOVE_FILES)); -} - -static int callback_cb( - size_t index, - const char* message, - const git_oid *stash_oid, - void *payload) -{ - struct callback_data *data = (struct callback_data *)payload; - - GIT_UNUSED(index); - GIT_UNUSED(message); - - cl_assert_equal_i(0, git_oid_streq(stash_oid, data->oids[data->invokes++])); - - return 0; -} - -void test_stash_foreach__enumerating_a_empty_repository_doesnt_fail(void) -{ - char *oids[] = { NULL }; - - data.oids = oids; - - cl_git_pass(git_repository_init(&repo, REPO_NAME, 0)); - - cl_git_pass(git_stash_foreach(repo, callback_cb, &data)); - - cl_assert_equal_i(0, data.invokes); -} - -void test_stash_foreach__can_enumerate_a_repository(void) -{ - char *oids_default[] = { - "493568b7a2681187aaac8a58d3f1eab1527cba84", NULL }; - - char *oids_untracked[] = { - "7f89a8b15c878809c5c54d1ff8f8c9674154017b", - "493568b7a2681187aaac8a58d3f1eab1527cba84", NULL }; - - char *oids_ignored[] = { - "c95599a8fef20a7e57582c6727b1a0d02e0a5828", - "7f89a8b15c878809c5c54d1ff8f8c9674154017b", - "493568b7a2681187aaac8a58d3f1eab1527cba84", NULL }; - - cl_git_pass(git_repository_init(&repo, REPO_NAME, 0)); - - setup_stash(repo, signature); - - cl_git_pass(git_stash_save( - &stash_tip_oid, - repo, - signature, - NULL, - GIT_STASH_DEFAULT)); - - data.oids = oids_default; - - cl_git_pass(git_stash_foreach(repo, callback_cb, &data)); - cl_assert_equal_i(1, data.invokes); - - /* ensure stash_foreach operates with INCLUDE_UNTRACKED */ - cl_git_pass(git_stash_save( - &stash_tip_oid, - repo, - signature, - NULL, - GIT_STASH_INCLUDE_UNTRACKED)); - - data.oids = oids_untracked; - data.invokes = 0; - - cl_git_pass(git_stash_foreach(repo, callback_cb, &data)); - cl_assert_equal_i(2, data.invokes); - - /* ensure stash_foreach operates with INCLUDE_IGNORED */ - cl_git_pass(git_stash_save( - &stash_tip_oid, - repo, - signature, - NULL, - GIT_STASH_INCLUDE_IGNORED)); - - data.oids = oids_ignored; - data.invokes = 0; - - cl_git_pass(git_stash_foreach(repo, callback_cb, &data)); - cl_assert_equal_i(3, data.invokes); -} diff --git a/vendor/libgit2/tests/stash/save.c b/vendor/libgit2/tests/stash/save.c deleted file mode 100644 index edcee820ff..0000000000 --- a/vendor/libgit2/tests/stash/save.c +++ /dev/null @@ -1,428 +0,0 @@ -#include "clar_libgit2.h" -#include "fileops.h" -#include "stash_helpers.h" - -static git_repository *repo; -static git_signature *signature; -static git_oid stash_tip_oid; - -/* - * Friendly reminder, in order to ease the reading of the following tests: - * - * "stash" points to the worktree commit - * "stash^1" points to the base commit (HEAD when the stash was created) - * "stash^2" points to the index commit - * "stash^3" points to the untracked commit - */ - -void test_stash_save__initialize(void) -{ - cl_git_pass(git_repository_init(&repo, "stash", 0)); - cl_git_pass(git_signature_new(&signature, "nulltoken", "emeric.fermas@gmail.com", 1323847743, 60)); /* Wed Dec 14 08:29:03 2011 +0100 */ - - setup_stash(repo, signature); -} - -void test_stash_save__cleanup(void) -{ - git_signature_free(signature); - signature = NULL; - - git_repository_free(repo); - repo = NULL; - - cl_git_pass(git_futils_rmdir_r("stash", NULL, GIT_RMDIR_REMOVE_FILES)); - cl_fixture_cleanup("sorry-it-is-a-non-bare-only-party"); -} - -static void assert_object_oid(const char* revision, const char* expected_oid, git_otype type) -{ - int result; - git_object *obj; - - result = git_revparse_single(&obj, repo, revision); - - if (!expected_oid) { - cl_assert_equal_i(GIT_ENOTFOUND, result); - return; - } else - cl_assert_equal_i(0, result); - - cl_git_pass(git_oid_streq(git_object_id(obj), expected_oid)); - cl_assert_equal_i(type, git_object_type(obj)); - git_object_free(obj); -} - -static void assert_blob_oid(const char* revision, const char* expected_oid) -{ - assert_object_oid(revision, expected_oid, GIT_OBJ_BLOB); -} - -void test_stash_save__does_not_keep_index_by_default(void) -{ -/* -$ git stash - -$ git show refs/stash:what -see you later - -$ git show refs/stash:how -not so small and - -$ git show refs/stash:who -funky world - -$ git show refs/stash:when -fatal: Path 'when' exists on disk, but not in 'stash'. - -$ git show refs/stash^2:what -goodbye - -$ git show refs/stash^2:how -not so small and - -$ git show refs/stash^2:who -world - -$ git show refs/stash^2:when -fatal: Path 'when' exists on disk, but not in 'stash^2'. - -$ git status --short -?? when - -*/ - unsigned int status; - - cl_git_pass(git_stash_save(&stash_tip_oid, repo, signature, NULL, GIT_STASH_DEFAULT)); - cl_git_pass(git_status_file(&status, repo, "when")); - - assert_blob_oid("refs/stash:what", "bc99dc98b3eba0e9157e94769cd4d49cb49de449"); /* see you later */ - assert_blob_oid("refs/stash:how", "e6d64adb2c7f3eb8feb493b556cc8070dca379a3"); /* not so small and */ - assert_blob_oid("refs/stash:who", "a0400d4954659306a976567af43125a0b1aa8595"); /* funky world */ - assert_blob_oid("refs/stash:when", NULL); - assert_blob_oid("refs/stash:why", "88c2533e21f098b89c91a431d8075cbdbe422a51"); /* would anybody use stash? */ - assert_blob_oid("refs/stash:where", "e3d6434ec12eb76af8dfa843a64ba6ab91014a0b"); /* .... */ - assert_blob_oid("refs/stash:.gitignore", "ac4d88de61733173d9959e4b77c69b9f17a00980"); - assert_blob_oid("refs/stash:just.ignore", NULL); - - assert_blob_oid("refs/stash^2:what", "dd7e1c6f0fefe118f0b63d9f10908c460aa317a6"); /* goodbye */ - assert_blob_oid("refs/stash^2:how", "e6d64adb2c7f3eb8feb493b556cc8070dca379a3"); /* not so small and */ - assert_blob_oid("refs/stash^2:who", "cc628ccd10742baea8241c5924df992b5c019f71"); /* world */ - assert_blob_oid("refs/stash^2:when", NULL); - assert_blob_oid("refs/stash^2:why", "88c2533e21f098b89c91a431d8075cbdbe422a51"); /* would anybody use stash? */ - assert_blob_oid("refs/stash^2:where", "e08f7fbb9a42a0c5367cf8b349f1f08c3d56bd72"); /* ???? */ - assert_blob_oid("refs/stash^2:.gitignore", "ac4d88de61733173d9959e4b77c69b9f17a00980"); - assert_blob_oid("refs/stash^2:just.ignore", NULL); - - assert_blob_oid("refs/stash^3", NULL); - - cl_assert_equal_i(GIT_STATUS_WT_NEW, status); -} - -void test_stash_save__can_keep_index(void) -{ - cl_git_pass(git_stash_save(&stash_tip_oid, repo, signature, NULL, GIT_STASH_KEEP_INDEX)); - - assert_status(repo, "what", GIT_STATUS_INDEX_MODIFIED); - assert_status(repo, "how", GIT_STATUS_INDEX_MODIFIED); - assert_status(repo, "who", GIT_STATUS_CURRENT); - assert_status(repo, "when", GIT_STATUS_WT_NEW); - assert_status(repo, "just.ignore", GIT_STATUS_IGNORED); -} - -static void assert_commit_message_contains(const char *revision, const char *fragment) -{ - git_commit *commit; - - cl_git_pass(git_revparse_single((git_object**)&commit, repo, revision)); - - cl_assert(strstr(git_commit_message(commit), fragment) != NULL); - - git_commit_free(commit); -} - -void test_stash_save__can_include_untracked_files(void) -{ - cl_git_pass(git_stash_save(&stash_tip_oid, repo, signature, NULL, GIT_STASH_INCLUDE_UNTRACKED)); - - assert_commit_message_contains("refs/stash^3", "untracked files on master: "); - - assert_blob_oid("refs/stash^3:what", NULL); - assert_blob_oid("refs/stash^3:how", NULL); - assert_blob_oid("refs/stash^3:who", NULL); - assert_blob_oid("refs/stash^3:when", "b6ed15e81e2593d7bb6265eb4a991d29dc3e628b"); - assert_blob_oid("refs/stash^3:just.ignore", NULL); -} - -void test_stash_save__untracked_skips_ignored(void) -{ - cl_git_append2file("stash/.gitignore", "bundle/vendor/\n"); - cl_must_pass(p_mkdir("stash/bundle", 0777)); - cl_must_pass(p_mkdir("stash/bundle/vendor", 0777)); - cl_git_mkfile("stash/bundle/vendor/blah", "contents\n"); - - cl_assert(git_path_exists("stash/when")); /* untracked */ - cl_assert(git_path_exists("stash/just.ignore")); /* ignored */ - cl_assert(git_path_exists("stash/bundle/vendor/blah")); /* ignored */ - - cl_git_pass(git_stash_save( - &stash_tip_oid, repo, signature, NULL, GIT_STASH_INCLUDE_UNTRACKED)); - - cl_assert(!git_path_exists("stash/when")); - cl_assert(git_path_exists("stash/bundle/vendor/blah")); - cl_assert(git_path_exists("stash/just.ignore")); -} - -void test_stash_save__can_include_untracked_and_ignored_files(void) -{ - cl_git_pass(git_stash_save(&stash_tip_oid, repo, signature, NULL, GIT_STASH_INCLUDE_UNTRACKED | GIT_STASH_INCLUDE_IGNORED)); - - assert_commit_message_contains("refs/stash^3", "untracked files on master: "); - - assert_blob_oid("refs/stash^3:what", NULL); - assert_blob_oid("refs/stash^3:how", NULL); - assert_blob_oid("refs/stash^3:who", NULL); - assert_blob_oid("refs/stash^3:when", "b6ed15e81e2593d7bb6265eb4a991d29dc3e628b"); - assert_blob_oid("refs/stash^3:just.ignore", "78925fb1236b98b37a35e9723033e627f97aa88b"); - - cl_assert(!git_path_exists("stash/just.ignore")); -} - -#define MESSAGE "Look Ma! I'm on TV!" -void test_stash_save__can_accept_a_message(void) -{ - cl_git_pass(git_stash_save(&stash_tip_oid, repo, signature, MESSAGE, GIT_STASH_DEFAULT)); - - assert_commit_message_contains("refs/stash^2", "index on master: "); - assert_commit_message_contains("refs/stash", "On master: " MESSAGE); -} - -void test_stash_save__cannot_stash_against_an_unborn_branch(void) -{ - git_reference *head; - - cl_git_pass(git_reference_symbolic_create(&head, repo, "HEAD", "refs/heads/unborn", 1, NULL)); - - cl_assert_equal_i(GIT_EUNBORNBRANCH, - git_stash_save(&stash_tip_oid, repo, signature, NULL, GIT_STASH_DEFAULT)); - - git_reference_free(head); -} - -void test_stash_save__cannot_stash_against_a_bare_repository(void) -{ - git_repository *local; - - cl_git_pass(git_repository_init(&local, "sorry-it-is-a-non-bare-only-party", 1)); - - cl_assert_equal_i(GIT_EBAREREPO, - git_stash_save(&stash_tip_oid, local, signature, NULL, GIT_STASH_DEFAULT)); - - git_repository_free(local); -} - -void test_stash_save__can_stash_against_a_detached_head(void) -{ - git_repository_detach_head(repo); - - cl_git_pass(git_stash_save(&stash_tip_oid, repo, signature, NULL, GIT_STASH_DEFAULT)); - - assert_commit_message_contains("refs/stash^2", "index on (no branch): "); - assert_commit_message_contains("refs/stash", "WIP on (no branch): "); -} - -void test_stash_save__stashing_updates_the_reflog(void) -{ - assert_object_oid("refs/stash@{0}", NULL, GIT_OBJ_COMMIT); - - cl_git_pass(git_stash_save(&stash_tip_oid, repo, signature, NULL, GIT_STASH_DEFAULT)); - - assert_object_oid("refs/stash@{0}", git_oid_tostr_s(&stash_tip_oid), GIT_OBJ_COMMIT); - assert_object_oid("refs/stash@{1}", NULL, GIT_OBJ_COMMIT); -} - -void test_stash_save__cannot_stash_when_there_are_no_local_change(void) -{ - git_index *index; - git_oid stash_tip_oid; - - cl_git_pass(git_repository_index(&index, repo)); - - /* - * 'what', 'where' and 'who' are being committed. - * 'when' remains untracked. - */ - cl_git_pass(git_index_add_bypath(index, "what")); - cl_git_pass(git_index_add_bypath(index, "where")); - cl_git_pass(git_index_add_bypath(index, "who")); - - cl_repo_commit_from_index(NULL, repo, signature, 0, "Initial commit"); - git_index_free(index); - - cl_assert_equal_i(GIT_ENOTFOUND, - git_stash_save(&stash_tip_oid, repo, signature, NULL, GIT_STASH_DEFAULT)); - - p_unlink("stash/when"); - cl_assert_equal_i(GIT_ENOTFOUND, - git_stash_save(&stash_tip_oid, repo, signature, NULL, GIT_STASH_INCLUDE_UNTRACKED)); -} - -void test_stash_save__can_stage_normal_then_stage_untracked(void) -{ - /* - * $ git ls-tree stash@{1}^0 - * 100644 blob ac4d88de61733173d9959e4b77c69b9f17a00980 .gitignore - * 100644 blob e6d64adb2c7f3eb8feb493b556cc8070dca379a3 how - * 100644 blob bc99dc98b3eba0e9157e94769cd4d49cb49de449 what - * 100644 blob a0400d4954659306a976567af43125a0b1aa8595 who - * - * $ git ls-tree stash@{1}^1 - * 100644 blob ac4d88de61733173d9959e4b77c69b9f17a00980 .gitignore - * 100644 blob ac790413e2d7a26c3767e78c57bb28716686eebc how - * 100644 blob ce013625030ba8dba906f756967f9e9ca394464a what - * 100644 blob cc628ccd10742baea8241c5924df992b5c019f71 who - * - * $ git ls-tree stash@{1}^2 - * 100644 blob ac4d88de61733173d9959e4b77c69b9f17a00980 .gitignore - * 100644 blob e6d64adb2c7f3eb8feb493b556cc8070dca379a3 how - * 100644 blob dd7e1c6f0fefe118f0b63d9f10908c460aa317a6 what - * 100644 blob cc628ccd10742baea8241c5924df992b5c019f71 who - * - * $ git ls-tree stash@{1}^3 - * fatal: Not a valid object name stash@{1}^3 - * - * $ git ls-tree stash@{0}^0 - * 100644 blob ac4d88de61733173d9959e4b77c69b9f17a00980 .gitignore - * 100644 blob ac790413e2d7a26c3767e78c57bb28716686eebc how - * 100644 blob ce013625030ba8dba906f756967f9e9ca394464a what - * 100644 blob cc628ccd10742baea8241c5924df992b5c019f71 who - * - * $ git ls-tree stash@{0}^1 - * 100644 blob ac4d88de61733173d9959e4b77c69b9f17a00980 .gitignore - * 100644 blob ac790413e2d7a26c3767e78c57bb28716686eebc how - * 100644 blob ce013625030ba8dba906f756967f9e9ca394464a what - * 100644 blob cc628ccd10742baea8241c5924df992b5c019f71 who - * - * $ git ls-tree stash@{0}^2 - * 100644 blob ac4d88de61733173d9959e4b77c69b9f17a00980 .gitignore - * 100644 blob ac790413e2d7a26c3767e78c57bb28716686eebc how - * 100644 blob ce013625030ba8dba906f756967f9e9ca394464a what - * 100644 blob cc628ccd10742baea8241c5924df992b5c019f71 who - * - * $ git ls-tree stash@{0}^3 - * 100644 blob b6ed15e81e2593d7bb6265eb4a991d29dc3e628b when - */ - - assert_status(repo, "what", GIT_STATUS_WT_MODIFIED | GIT_STATUS_INDEX_MODIFIED); - assert_status(repo, "how", GIT_STATUS_INDEX_MODIFIED); - assert_status(repo, "who", GIT_STATUS_WT_MODIFIED); - assert_status(repo, "when", GIT_STATUS_WT_NEW); - assert_status(repo, "just.ignore", GIT_STATUS_IGNORED); - - cl_git_pass(git_stash_save(&stash_tip_oid, repo, signature, NULL, GIT_STASH_DEFAULT)); - assert_status(repo, "what", GIT_STATUS_CURRENT); - assert_status(repo, "how", GIT_STATUS_CURRENT); - assert_status(repo, "who", GIT_STATUS_CURRENT); - assert_status(repo, "when", GIT_STATUS_WT_NEW); - assert_status(repo, "just.ignore", GIT_STATUS_IGNORED); - - cl_git_pass(git_stash_save(&stash_tip_oid, repo, signature, NULL, GIT_STASH_INCLUDE_UNTRACKED)); - assert_status(repo, "what", GIT_STATUS_CURRENT); - assert_status(repo, "how", GIT_STATUS_CURRENT); - assert_status(repo, "who", GIT_STATUS_CURRENT); - assert_status(repo, "when", GIT_ENOTFOUND); - assert_status(repo, "just.ignore", GIT_STATUS_IGNORED); - - - assert_blob_oid("stash@{1}^0:what", "bc99dc98b3eba0e9157e94769cd4d49cb49de449"); /* see you later */ - assert_blob_oid("stash@{1}^0:how", "e6d64adb2c7f3eb8feb493b556cc8070dca379a3"); /* not so small and */ - assert_blob_oid("stash@{1}^0:who", "a0400d4954659306a976567af43125a0b1aa8595"); /* funky world */ - assert_blob_oid("stash@{1}^0:when", NULL); - - assert_blob_oid("stash@{1}^2:what", "dd7e1c6f0fefe118f0b63d9f10908c460aa317a6"); /* goodbye */ - assert_blob_oid("stash@{1}^2:how", "e6d64adb2c7f3eb8feb493b556cc8070dca379a3"); /* not so small and */ - assert_blob_oid("stash@{1}^2:who", "cc628ccd10742baea8241c5924df992b5c019f71"); /* world */ - assert_blob_oid("stash@{1}^2:when", NULL); - - assert_object_oid("stash@{1}^3", NULL, GIT_OBJ_COMMIT); - - assert_blob_oid("stash@{0}^0:what", "ce013625030ba8dba906f756967f9e9ca394464a"); /* hello */ - assert_blob_oid("stash@{0}^0:how", "ac790413e2d7a26c3767e78c57bb28716686eebc"); /* small */ - assert_blob_oid("stash@{0}^0:who", "cc628ccd10742baea8241c5924df992b5c019f71"); /* world */ - assert_blob_oid("stash@{0}^0:when", NULL); - - assert_blob_oid("stash@{0}^2:what", "ce013625030ba8dba906f756967f9e9ca394464a"); /* hello */ - assert_blob_oid("stash@{0}^2:how", "ac790413e2d7a26c3767e78c57bb28716686eebc"); /* small */ - assert_blob_oid("stash@{0}^2:who", "cc628ccd10742baea8241c5924df992b5c019f71"); /* world */ - assert_blob_oid("stash@{0}^2:when", NULL); - - assert_blob_oid("stash@{0}^3:when", "b6ed15e81e2593d7bb6265eb4a991d29dc3e628b"); /* now */ -} - -#define EMPTY_TREE "4b825dc642cb6eb9a060e54bf8d69288fbee4904" - -void test_stash_save__including_untracked_without_any_untracked_file_creates_an_empty_tree(void) -{ - cl_must_pass(p_unlink("stash/when")); - - assert_status(repo, "what", GIT_STATUS_WT_MODIFIED | GIT_STATUS_INDEX_MODIFIED); - assert_status(repo, "how", GIT_STATUS_INDEX_MODIFIED); - assert_status(repo, "who", GIT_STATUS_WT_MODIFIED); - assert_status(repo, "when", GIT_ENOTFOUND); - assert_status(repo, "just.ignore", GIT_STATUS_IGNORED); - - cl_git_pass(git_stash_save(&stash_tip_oid, repo, signature, NULL, GIT_STASH_INCLUDE_UNTRACKED)); - - assert_object_oid("stash^3^{tree}", EMPTY_TREE, GIT_OBJ_TREE); -} - -void test_stash_save__ignored_directory(void) -{ - cl_git_pass(p_mkdir("stash/ignored_directory", 0777)); - cl_git_pass(p_mkdir("stash/ignored_directory/sub", 0777)); - cl_git_mkfile("stash/ignored_directory/sub/some_file", "stuff"); - - assert_status(repo, "ignored_directory/sub/some_file", GIT_STATUS_WT_NEW); - cl_git_pass(git_ignore_add_rule(repo, "ignored_directory/")); - assert_status(repo, "ignored_directory/sub/some_file", GIT_STATUS_IGNORED); - - cl_git_pass(git_stash_save(&stash_tip_oid, repo, signature, NULL, GIT_STASH_INCLUDE_UNTRACKED | GIT_STASH_INCLUDE_IGNORED)); - - cl_assert(!git_path_exists("stash/ignored_directory/sub/some_file")); - cl_assert(!git_path_exists("stash/ignored_directory/sub")); - cl_assert(!git_path_exists("stash/ignored_directory")); -} - -void test_stash_save__skip_submodules(void) -{ - git_repository *untracked_repo; - cl_git_pass(git_repository_init(&untracked_repo, "stash/untracked_repo", false)); - cl_git_mkfile("stash/untracked_repo/content", "stuff"); - git_repository_free(untracked_repo); - - assert_status(repo, "untracked_repo/", GIT_STATUS_WT_NEW); - - cl_git_pass(git_stash_save( - &stash_tip_oid, repo, signature, NULL, GIT_STASH_INCLUDE_UNTRACKED)); - - assert_status(repo, "untracked_repo/", GIT_STATUS_WT_NEW); -} - -void test_stash_save__deleted_in_index_modified_in_workdir(void) -{ - git_index *index; - - git_repository_index(&index, repo); - - cl_git_pass(git_index_remove_bypath(index, "who")); - cl_git_pass(git_index_write(index)); - - assert_status(repo, "who", GIT_STATUS_WT_NEW | GIT_STATUS_INDEX_DELETED); - - cl_git_pass(git_stash_save(&stash_tip_oid, repo, signature, NULL, GIT_STASH_DEFAULT)); - - assert_blob_oid("stash@{0}^0:who", "a0400d4954659306a976567af43125a0b1aa8595"); - assert_blob_oid("stash@{0}^2:who", NULL); - - git_index_free(index); -} diff --git a/vendor/libgit2/tests/stash/stash_helpers.c b/vendor/libgit2/tests/stash/stash_helpers.c deleted file mode 100644 index 0398757c24..0000000000 --- a/vendor/libgit2/tests/stash/stash_helpers.c +++ /dev/null @@ -1,57 +0,0 @@ -#include "clar_libgit2.h" -#include "fileops.h" -#include "stash_helpers.h" - -void setup_stash(git_repository *repo, git_signature *signature) -{ - git_index *index; - - cl_git_pass(git_repository_index(&index, repo)); - - cl_git_mkfile("stash/what", "hello\n"); /* ce013625030ba8dba906f756967f9e9ca394464a */ - cl_git_mkfile("stash/how", "small\n"); /* ac790413e2d7a26c3767e78c57bb28716686eebc */ - cl_git_mkfile("stash/who", "world\n"); /* cc628ccd10742baea8241c5924df992b5c019f71 */ - cl_git_mkfile("stash/when", "now\n"); /* b6ed15e81e2593d7bb6265eb4a991d29dc3e628b */ - cl_git_mkfile("stash/just.ignore", "me\n"); /* 78925fb1236b98b37a35e9723033e627f97aa88b */ - - cl_git_mkfile("stash/.gitignore", "*.ignore\n"); - - cl_git_pass(git_index_add_bypath(index, "what")); - cl_git_pass(git_index_add_bypath(index, "how")); - cl_git_pass(git_index_add_bypath(index, "who")); - cl_git_pass(git_index_add_bypath(index, ".gitignore")); - - cl_repo_commit_from_index(NULL, repo, signature, 0, "Initial commit"); - - cl_git_rewritefile("stash/what", "goodbye\n"); /* dd7e1c6f0fefe118f0b63d9f10908c460aa317a6 */ - cl_git_rewritefile("stash/how", "not so small and\n"); /* e6d64adb2c7f3eb8feb493b556cc8070dca379a3 */ - cl_git_rewritefile("stash/who", "funky world\n"); /* a0400d4954659306a976567af43125a0b1aa8595 */ - cl_git_mkfile("stash/why", "would anybody use stash?\n"); /* 88c2533e21f098b89c91a431d8075cbde422a51 */ - cl_git_mkfile("stash/where", "????\n"); /* e08f7fbb9a42a0c5367cf8b349f1f08c3d56bd72 */ - - cl_git_pass(git_index_add_bypath(index, "what")); - cl_git_pass(git_index_add_bypath(index, "how")); - cl_git_pass(git_index_add_bypath(index, "why")); - cl_git_pass(git_index_add_bypath(index, "where")); - cl_git_pass(git_index_write(index)); - - cl_git_rewritefile("stash/what", "see you later\n"); /* bc99dc98b3eba0e9157e94769cd4d49cb49de449 */ - cl_git_mkfile("stash/where", "....\n"); /* e3d6434ec12eb76af8dfa843a64ba6ab91014a0b */ - - git_index_free(index); -} - -void assert_status( - git_repository *repo, - const char *path, - int status_flags) -{ - unsigned int status; - - if (status_flags < 0) - cl_assert_equal_i(status_flags, git_status_file(&status, repo, path)); - else { - cl_git_pass(git_status_file(&status, repo, path)); - cl_assert_equal_i((unsigned int)status_flags, status); - } -} diff --git a/vendor/libgit2/tests/stash/stash_helpers.h b/vendor/libgit2/tests/stash/stash_helpers.h deleted file mode 100644 index 66d758fe2b..0000000000 --- a/vendor/libgit2/tests/stash/stash_helpers.h +++ /dev/null @@ -1,8 +0,0 @@ -void setup_stash( - git_repository *repo, - git_signature *signature); - -void assert_status( - git_repository *repo, - const char *path, - int status_flags); diff --git a/vendor/libgit2/tests/stash/submodules.c b/vendor/libgit2/tests/stash/submodules.c deleted file mode 100644 index 8cadca0f2c..0000000000 --- a/vendor/libgit2/tests/stash/submodules.c +++ /dev/null @@ -1,83 +0,0 @@ -#include "clar_libgit2.h" -#include "stash_helpers.h" -#include "../submodule/submodule_helpers.h" - -static git_repository *repo; -static git_signature *signature; -static git_oid stash_tip_oid; - -static git_submodule *sm; - -void test_stash_submodules__initialize(void) -{ - cl_git_pass(git_signature_new(&signature, "nulltoken", "emeric.fermas@gmail.com", 1323847743, 60)); /* Wed Dec 14 08:29:03 2011 +0100 */ - - repo = setup_fixture_submodules(); - - cl_git_pass(git_submodule_lookup(&sm, repo, "testrepo")); -} - -void test_stash_submodules__cleanup(void) -{ - git_submodule_free(sm); - sm = NULL; - - git_signature_free(signature); - signature = NULL; -} - -void test_stash_submodules__does_not_stash_modified_submodules(void) -{ - static git_index *smindex; - static git_repository *smrepo; - - assert_status(repo, "modified", GIT_STATUS_WT_MODIFIED); - - /* modify file in submodule */ - cl_git_rewritefile("submodules/testrepo/README", "heyheyhey"); - assert_status(repo, "testrepo", GIT_STATUS_WT_MODIFIED); - - /* add file to index in submodule */ - cl_git_pass(git_submodule_open(&smrepo, sm)); - cl_git_pass(git_repository_index(&smindex, smrepo)); - cl_git_pass(git_index_add_bypath(smindex, "README")); - - /* commit changed index of submodule */ - cl_repo_commit_from_index(NULL, smrepo, NULL, 1372350000, "Modify it"); - assert_status(repo, "testrepo", GIT_STATUS_WT_MODIFIED); - - cl_git_pass(git_stash_save(&stash_tip_oid, repo, signature, NULL, GIT_STASH_DEFAULT)); - - assert_status(repo, "testrepo", GIT_STATUS_WT_MODIFIED); - assert_status(repo, "modified", GIT_STATUS_CURRENT); - - git_index_free(smindex); - git_repository_free(smrepo); -} - -void test_stash_submodules__stash_is_empty_with_modified_submodules(void) -{ - static git_index *smindex; - static git_repository *smrepo; - - cl_git_pass(git_stash_save(&stash_tip_oid, repo, signature, NULL, GIT_STASH_DEFAULT)); - assert_status(repo, "modified", GIT_STATUS_CURRENT); - - /* modify file in submodule */ - cl_git_rewritefile("submodules/testrepo/README", "heyheyhey"); - assert_status(repo, "testrepo", GIT_STATUS_WT_MODIFIED); - - /* add file to index in submodule */ - cl_git_pass(git_submodule_open(&smrepo, sm)); - cl_git_pass(git_repository_index(&smindex, smrepo)); - cl_git_pass(git_index_add_bypath(smindex, "README")); - - /* commit changed index of submodule */ - cl_repo_commit_from_index(NULL, smrepo, NULL, 1372350000, "Modify it"); - assert_status(repo, "testrepo", GIT_STATUS_WT_MODIFIED); - - cl_git_fail_with(git_stash_save(&stash_tip_oid, repo, signature, NULL, GIT_STASH_DEFAULT), GIT_ENOTFOUND); - - git_index_free(smindex); - git_repository_free(smrepo); -} diff --git a/vendor/libgit2/tests/status/ignore.c b/vendor/libgit2/tests/status/ignore.c deleted file mode 100644 index ba1d69a992..0000000000 --- a/vendor/libgit2/tests/status/ignore.c +++ /dev/null @@ -1,1024 +0,0 @@ -#include "clar_libgit2.h" -#include "fileops.h" -#include "git2/attr.h" -#include "ignore.h" -#include "attr.h" -#include "status_helpers.h" - -static git_repository *g_repo = NULL; - -void test_status_ignore__initialize(void) -{ -} - -void test_status_ignore__cleanup(void) -{ - cl_git_sandbox_cleanup(); -} - -static void assert_ignored_( - bool expected, const char *filepath, const char *file, int line) -{ - int is_ignored = 0; - cl_git_pass_( - git_status_should_ignore(&is_ignored, g_repo, filepath), file, line); - clar__assert( - (expected != 0) == (is_ignored != 0), - file, line, "expected != is_ignored", filepath, 1); -} -#define assert_ignored(expected, filepath) \ - assert_ignored_(expected, filepath, __FILE__, __LINE__) -#define assert_is_ignored(filepath) \ - assert_ignored_(true, filepath, __FILE__, __LINE__) -#define refute_is_ignored(filepath) \ - assert_ignored_(false, filepath, __FILE__, __LINE__) - -void test_status_ignore__0(void) -{ - struct { - const char *path; - int expected; - } test_cases[] = { - /* pattern "ign" from .gitignore */ - { "file", 0 }, - { "ign", 1 }, - { "sub", 0 }, - { "sub/file", 0 }, - { "sub/ign", 1 }, - { "sub/ign/file", 1 }, - { "sub/ign/sub", 1 }, - { "sub/ign/sub/file", 1 }, - { "sub/sub", 0 }, - { "sub/sub/file", 0 }, - { "sub/sub/ign", 1 }, - { "sub/sub/sub", 0 }, - /* pattern "dir/" from .gitignore */ - { "dir", 1 }, - { "dir/", 1 }, - { "sub/dir", 1 }, - { "sub/dir/", 1 }, - { "sub/dir/file", 1 }, /* contained in ignored parent */ - { "sub/sub/dir", 0 }, /* dir is not actually a dir, but a file */ - { NULL, 0 } - }, *one_test; - - g_repo = cl_git_sandbox_init("attr"); - - for (one_test = test_cases; one_test->path != NULL; one_test++) - assert_ignored(one_test->expected, one_test->path); - - /* confirm that ignore files were cached */ - cl_assert(git_attr_cache__is_cached( - g_repo, GIT_ATTR_FILE__FROM_FILE, ".git/info/exclude")); - cl_assert(git_attr_cache__is_cached( - g_repo, GIT_ATTR_FILE__FROM_FILE, ".gitignore")); -} - - -void test_status_ignore__1(void) -{ - g_repo = cl_git_sandbox_init("attr"); - - cl_git_rewritefile("attr/.gitignore", "/*.txt\n/dir/\n"); - git_attr_cache_flush(g_repo); - - assert_is_ignored("root_test4.txt"); - refute_is_ignored("sub/subdir_test2.txt"); - assert_is_ignored("dir"); - assert_is_ignored("dir/"); - refute_is_ignored("sub/dir"); - refute_is_ignored("sub/dir/"); -} - -void test_status_ignore__empty_repo_with_gitignore_rewrite(void) -{ - status_entry_single st; - - g_repo = cl_git_sandbox_init("empty_standard_repo"); - - cl_git_mkfile( - "empty_standard_repo/look-ma.txt", "I'm going to be ignored!"); - - memset(&st, 0, sizeof(st)); - cl_git_pass(git_status_foreach(g_repo, cb_status__single, &st)); - cl_assert(st.count == 1); - cl_assert(st.status == GIT_STATUS_WT_NEW); - - cl_git_pass(git_status_file(&st.status, g_repo, "look-ma.txt")); - cl_assert(st.status == GIT_STATUS_WT_NEW); - - refute_is_ignored("look-ma.txt"); - - cl_git_rewritefile("empty_standard_repo/.gitignore", "*.nomatch\n"); - - memset(&st, 0, sizeof(st)); - cl_git_pass(git_status_foreach(g_repo, cb_status__single, &st)); - cl_assert(st.count == 2); - cl_assert(st.status == GIT_STATUS_WT_NEW); - - cl_git_pass(git_status_file(&st.status, g_repo, "look-ma.txt")); - cl_assert(st.status == GIT_STATUS_WT_NEW); - - refute_is_ignored("look-ma.txt"); - - cl_git_rewritefile("empty_standard_repo/.gitignore", "*.txt\n"); - - memset(&st, 0, sizeof(st)); - cl_git_pass(git_status_foreach(g_repo, cb_status__single, &st)); - cl_assert(st.count == 2); - cl_assert(st.status == GIT_STATUS_IGNORED); - - cl_git_pass(git_status_file(&st.status, g_repo, "look-ma.txt")); - cl_assert(st.status == GIT_STATUS_IGNORED); - - assert_is_ignored("look-ma.txt"); -} - -void test_status_ignore__ignore_pattern_contains_space(void) -{ - unsigned int flags; - const mode_t mode = 0777; - - g_repo = cl_git_sandbox_init("empty_standard_repo"); - cl_git_rewritefile("empty_standard_repo/.gitignore", "foo bar.txt\n"); - - cl_git_mkfile( - "empty_standard_repo/foo bar.txt", "I'm going to be ignored!"); - - cl_git_pass(git_status_file(&flags, g_repo, "foo bar.txt")); - cl_assert(flags == GIT_STATUS_IGNORED); - - cl_git_pass(git_futils_mkdir_r("empty_standard_repo/foo", NULL, mode)); - cl_git_mkfile("empty_standard_repo/foo/look-ma.txt", "I'm not going to be ignored!"); - - cl_git_pass(git_status_file(&flags, g_repo, "foo/look-ma.txt")); - cl_assert(flags == GIT_STATUS_WT_NEW); -} - -void test_status_ignore__ignore_pattern_ignorecase(void) -{ - unsigned int flags; - bool ignore_case; - git_index *index; - - g_repo = cl_git_sandbox_init("empty_standard_repo"); - cl_git_rewritefile("empty_standard_repo/.gitignore", "a.txt\n"); - - cl_git_mkfile("empty_standard_repo/A.txt", "Differs in case"); - - cl_git_pass(git_repository_index(&index, g_repo)); - ignore_case = (git_index_caps(index) & GIT_INDEXCAP_IGNORE_CASE) != 0; - git_index_free(index); - - cl_git_pass(git_status_file(&flags, g_repo, "A.txt")); - cl_assert(flags == ignore_case ? GIT_STATUS_IGNORED : GIT_STATUS_WT_NEW); -} - -void test_status_ignore__subdirectories(void) -{ - status_entry_single st; - - g_repo = cl_git_sandbox_init("empty_standard_repo"); - - cl_git_mkfile( - "empty_standard_repo/ignore_me", "I'm going to be ignored!"); - - cl_git_rewritefile("empty_standard_repo/.gitignore", "ignore_me\n"); - - memset(&st, 0, sizeof(st)); - cl_git_pass(git_status_foreach(g_repo, cb_status__single, &st)); - cl_assert_equal_i(2, st.count); - cl_assert(st.status == GIT_STATUS_IGNORED); - - cl_git_pass(git_status_file(&st.status, g_repo, "ignore_me")); - cl_assert(st.status == GIT_STATUS_IGNORED); - - assert_is_ignored("ignore_me"); - - /* I've changed libgit2 so that the behavior here now differs from - * core git but seems to make more sense. In core git, the following - * items are skipped completed, even if --ignored is passed to status. - * It you mirror these steps and run "git status -uall --ignored" then - * you will not see "test/ignore_me/" in the results. - * - * However, we had a couple reports of this as a bug, plus there is a - * similar circumstance where we were differing for core git when you - * used a rooted path for an ignore, so I changed this behavior. - */ - cl_git_pass(git_futils_mkdir_r( - "empty_standard_repo/test/ignore_me", NULL, 0775)); - cl_git_mkfile( - "empty_standard_repo/test/ignore_me/file", "I'm going to be ignored!"); - cl_git_mkfile( - "empty_standard_repo/test/ignore_me/file2", "Me, too!"); - - memset(&st, 0, sizeof(st)); - cl_git_pass(git_status_foreach(g_repo, cb_status__single, &st)); - cl_assert_equal_i(3, st.count); - - cl_git_pass(git_status_file(&st.status, g_repo, "test/ignore_me/file")); - cl_assert(st.status == GIT_STATUS_IGNORED); - - assert_is_ignored("test/ignore_me/file"); -} - -static void make_test_data(const char *reponame, const char **files) -{ - const char **scan; - size_t repolen = strlen(reponame) + 1; - - g_repo = cl_git_sandbox_init(reponame); - - for (scan = files; *scan != NULL; ++scan) { - cl_git_pass(git_futils_mkdir( - *scan + repolen, reponame, - 0777, GIT_MKDIR_PATH | GIT_MKDIR_SKIP_LAST)); - cl_git_mkfile(*scan, "contents"); - } -} - -static const char *test_repo_1 = "empty_standard_repo"; -static const char *test_files_1[] = { - "empty_standard_repo/dir/a/ignore_me", - "empty_standard_repo/dir/b/ignore_me", - "empty_standard_repo/dir/ignore_me", - "empty_standard_repo/ignore_also/file", - "empty_standard_repo/ignore_me", - "empty_standard_repo/test/ignore_me/file", - "empty_standard_repo/test/ignore_me/file2", - "empty_standard_repo/test/ignore_me/and_me/file", - NULL -}; - -void test_status_ignore__subdirectories_recursion(void) -{ - /* Let's try again with recursing into ignored dirs turned on */ - git_status_options opts = GIT_STATUS_OPTIONS_INIT; - status_entry_counts counts; - static const char *paths_r[] = { - ".gitignore", - "dir/a/ignore_me", - "dir/b/ignore_me", - "dir/ignore_me", - "ignore_also/file", - "ignore_me", - "test/ignore_me/and_me/file", - "test/ignore_me/file", - "test/ignore_me/file2", - }; - static const unsigned int statuses_r[] = { - GIT_STATUS_WT_NEW, GIT_STATUS_IGNORED, GIT_STATUS_IGNORED, - GIT_STATUS_IGNORED, GIT_STATUS_IGNORED, GIT_STATUS_IGNORED, - GIT_STATUS_IGNORED, GIT_STATUS_IGNORED, GIT_STATUS_IGNORED, - }; - static const char *paths_nr[] = { - ".gitignore", - "dir/a/ignore_me", - "dir/b/ignore_me", - "dir/ignore_me", - "ignore_also/", - "ignore_me", - "test/ignore_me/", - }; - static const unsigned int statuses_nr[] = { - GIT_STATUS_WT_NEW, - GIT_STATUS_IGNORED, GIT_STATUS_IGNORED, GIT_STATUS_IGNORED, - GIT_STATUS_IGNORED, GIT_STATUS_IGNORED, GIT_STATUS_IGNORED, - }; - - make_test_data(test_repo_1, test_files_1); - cl_git_rewritefile("empty_standard_repo/.gitignore", "ignore_me\n/ignore_also\n"); - - memset(&counts, 0x0, sizeof(status_entry_counts)); - counts.expected_entry_count = 9; - counts.expected_paths = paths_r; - counts.expected_statuses = statuses_r; - - opts.flags = GIT_STATUS_OPT_DEFAULTS | GIT_STATUS_OPT_RECURSE_IGNORED_DIRS; - - cl_git_pass(git_status_foreach_ext( - g_repo, &opts, cb_status__normal, &counts)); - - cl_assert_equal_i(counts.expected_entry_count, counts.entry_count); - cl_assert_equal_i(0, counts.wrong_status_flags_count); - cl_assert_equal_i(0, counts.wrong_sorted_path); - - - memset(&counts, 0x0, sizeof(status_entry_counts)); - counts.expected_entry_count = 7; - counts.expected_paths = paths_nr; - counts.expected_statuses = statuses_nr; - - opts.flags = GIT_STATUS_OPT_DEFAULTS; - - cl_git_pass(git_status_foreach_ext( - g_repo, &opts, cb_status__normal, &counts)); - - cl_assert_equal_i(counts.expected_entry_count, counts.entry_count); - cl_assert_equal_i(0, counts.wrong_status_flags_count); - cl_assert_equal_i(0, counts.wrong_sorted_path); -} - -void test_status_ignore__subdirectories_not_at_root(void) -{ - git_status_options opts = GIT_STATUS_OPTIONS_INIT; - status_entry_counts counts; - static const char *paths_1[] = { - "dir/.gitignore", - "dir/a/ignore_me", - "dir/b/ignore_me", - "dir/ignore_me", - "ignore_also/file", - "ignore_me", - "test/.gitignore", - "test/ignore_me/and_me/file", - "test/ignore_me/file", - "test/ignore_me/file2", - }; - static const unsigned int statuses_1[] = { - GIT_STATUS_WT_NEW, GIT_STATUS_IGNORED, GIT_STATUS_IGNORED, - GIT_STATUS_IGNORED, GIT_STATUS_WT_NEW, GIT_STATUS_WT_NEW, - GIT_STATUS_WT_NEW, GIT_STATUS_IGNORED, GIT_STATUS_WT_NEW, GIT_STATUS_WT_NEW, - }; - - make_test_data(test_repo_1, test_files_1); - cl_git_rewritefile("empty_standard_repo/dir/.gitignore", "ignore_me\n/ignore_also\n"); - cl_git_rewritefile("empty_standard_repo/test/.gitignore", "and_me\n"); - - memset(&counts, 0x0, sizeof(status_entry_counts)); - counts.expected_entry_count = 10; - counts.expected_paths = paths_1; - counts.expected_statuses = statuses_1; - - opts.flags = GIT_STATUS_OPT_DEFAULTS | GIT_STATUS_OPT_RECURSE_IGNORED_DIRS; - - cl_git_pass(git_status_foreach_ext( - g_repo, &opts, cb_status__normal, &counts)); - - cl_assert_equal_i(counts.expected_entry_count, counts.entry_count); - cl_assert_equal_i(0, counts.wrong_status_flags_count); - cl_assert_equal_i(0, counts.wrong_sorted_path); -} - -void test_status_ignore__leading_slash_ignores(void) -{ - git_status_options opts = GIT_STATUS_OPTIONS_INIT; - status_entry_counts counts; - static const char *paths_2[] = { - "dir/.gitignore", - "dir/a/ignore_me", - "dir/b/ignore_me", - "dir/ignore_me", - "ignore_also/file", - "ignore_me", - "test/.gitignore", - "test/ignore_me/and_me/file", - "test/ignore_me/file", - "test/ignore_me/file2", - }; - static const unsigned int statuses_2[] = { - GIT_STATUS_WT_NEW, GIT_STATUS_WT_NEW, GIT_STATUS_WT_NEW, - GIT_STATUS_IGNORED, GIT_STATUS_IGNORED, GIT_STATUS_IGNORED, - GIT_STATUS_WT_NEW, GIT_STATUS_WT_NEW, GIT_STATUS_WT_NEW, GIT_STATUS_WT_NEW, - }; - - make_test_data(test_repo_1, test_files_1); - - cl_fake_home(); - cl_git_mkfile("home/.gitignore", "/ignore_me\n"); - { - git_config *cfg; - cl_git_pass(git_repository_config(&cfg, g_repo)); - cl_git_pass(git_config_set_string( - cfg, "core.excludesfile", "~/.gitignore")); - git_config_free(cfg); - } - - cl_git_rewritefile("empty_standard_repo/.git/info/exclude", "/ignore_also\n"); - cl_git_rewritefile("empty_standard_repo/dir/.gitignore", "/ignore_me\n"); - cl_git_rewritefile("empty_standard_repo/test/.gitignore", "/and_me\n"); - - memset(&counts, 0x0, sizeof(status_entry_counts)); - counts.expected_entry_count = 10; - counts.expected_paths = paths_2; - counts.expected_statuses = statuses_2; - - opts.flags = GIT_STATUS_OPT_DEFAULTS | GIT_STATUS_OPT_RECURSE_IGNORED_DIRS; - - cl_git_pass(git_status_foreach_ext( - g_repo, &opts, cb_status__normal, &counts)); - - cl_assert_equal_i(counts.expected_entry_count, counts.entry_count); - cl_assert_equal_i(0, counts.wrong_status_flags_count); - cl_assert_equal_i(0, counts.wrong_sorted_path); -} - -void test_status_ignore__contained_dir_with_matching_name(void) -{ - static const char *test_files[] = { - "empty_standard_repo/subdir_match/aaa/subdir_match/file", - "empty_standard_repo/subdir_match/zzz_ignoreme", - NULL - }; - static const char *expected_paths[] = { - "subdir_match/.gitignore", - "subdir_match/aaa/subdir_match/file", - "subdir_match/zzz_ignoreme", - }; - static const unsigned int expected_statuses[] = { - GIT_STATUS_WT_NEW, GIT_STATUS_WT_NEW, GIT_STATUS_IGNORED - }; - git_status_options opts = GIT_STATUS_OPTIONS_INIT; - status_entry_counts counts; - - make_test_data("empty_standard_repo", test_files); - cl_git_mkfile( - "empty_standard_repo/subdir_match/.gitignore", "*_ignoreme\n"); - - refute_is_ignored("subdir_match/aaa/subdir_match/file"); - assert_is_ignored("subdir_match/zzz_ignoreme"); - - memset(&counts, 0x0, sizeof(status_entry_counts)); - counts.expected_entry_count = 3; - counts.expected_paths = expected_paths; - counts.expected_statuses = expected_statuses; - - opts.flags = GIT_STATUS_OPT_DEFAULTS | GIT_STATUS_OPT_RECURSE_IGNORED_DIRS; - - cl_git_pass(git_status_foreach_ext( - g_repo, &opts, cb_status__normal, &counts)); - - cl_assert_equal_i(counts.expected_entry_count, counts.entry_count); - cl_assert_equal_i(0, counts.wrong_status_flags_count); - cl_assert_equal_i(0, counts.wrong_sorted_path); -} - -void test_status_ignore__trailing_slash_star(void) -{ - static const char *test_files[] = { - "empty_standard_repo/file", - "empty_standard_repo/subdir/file", - "empty_standard_repo/subdir/sub2/sub3/file", - NULL - }; - - make_test_data("empty_standard_repo", test_files); - cl_git_mkfile( - "empty_standard_repo/subdir/.gitignore", "/**/*\n"); - - refute_is_ignored("file"); - assert_is_ignored("subdir/sub2/sub3/file"); - assert_is_ignored("subdir/file"); -} - -void test_status_ignore__adding_internal_ignores(void) -{ - g_repo = cl_git_sandbox_init("empty_standard_repo"); - - refute_is_ignored("one.txt"); - refute_is_ignored("two.bar"); - - cl_git_pass(git_ignore_add_rule(g_repo, "*.nomatch\n")); - - refute_is_ignored("one.txt"); - refute_is_ignored("two.bar"); - - cl_git_pass(git_ignore_add_rule(g_repo, "*.txt\n")); - - assert_is_ignored("one.txt"); - refute_is_ignored("two.bar"); - - cl_git_pass(git_ignore_add_rule(g_repo, "*.bar\n")); - - assert_is_ignored("one.txt"); - assert_is_ignored("two.bar"); - - cl_git_pass(git_ignore_clear_internal_rules(g_repo)); - - refute_is_ignored("one.txt"); - refute_is_ignored("two.bar"); - - cl_git_pass(git_ignore_add_rule( - g_repo, "multiple\n*.rules\n# comment line\n*.bar\n")); - - refute_is_ignored("one.txt"); - assert_is_ignored("two.bar"); -} - -void test_status_ignore__add_internal_as_first_thing(void) -{ - const char *add_me = "\n#################\n## Eclipse\n#################\n\n*.pydevproject\n.project\n.metadata\nbin/\ntmp/\n*.tmp\n\n"; - - g_repo = cl_git_sandbox_init("empty_standard_repo"); - - cl_git_pass(git_ignore_add_rule(g_repo, add_me)); - - assert_is_ignored("one.tmp"); - refute_is_ignored("two.bar"); -} - -void test_status_ignore__internal_ignores_inside_deep_paths(void) -{ - const char *add_me = "Debug\nthis/is/deep\npatterned*/dir\n"; - - g_repo = cl_git_sandbox_init("empty_standard_repo"); - - cl_git_pass(git_ignore_add_rule(g_repo, add_me)); - - assert_is_ignored("Debug"); - assert_is_ignored("and/Debug"); - assert_is_ignored("really/Debug/this/file"); - assert_is_ignored("Debug/what/I/say"); - - refute_is_ignored("and/NoDebug"); - refute_is_ignored("NoDebug/this"); - refute_is_ignored("please/NoDebug/this"); - - assert_is_ignored("this/is/deep"); - /* pattern containing slash gets FNM_PATHNAME so all slashes must match */ - refute_is_ignored("and/this/is/deep"); - assert_is_ignored("this/is/deep/too"); - /* pattern containing slash gets FNM_PATHNAME so all slashes must match */ - refute_is_ignored("but/this/is/deep/and/ignored"); - - refute_is_ignored("this/is/not/deep"); - refute_is_ignored("is/this/not/as/deep"); - refute_is_ignored("this/is/deepish"); - refute_is_ignored("xthis/is/deep"); -} - -void test_status_ignore__automatically_ignore_bad_files(void) -{ - g_repo = cl_git_sandbox_init("empty_standard_repo"); - - assert_is_ignored(".git"); - assert_is_ignored("this/file/."); - assert_is_ignored("path/../funky"); - refute_is_ignored("path/whatever.c"); - - cl_git_pass(git_ignore_add_rule(g_repo, "*.c\n")); - - assert_is_ignored(".git"); - assert_is_ignored("this/file/."); - assert_is_ignored("path/../funky"); - assert_is_ignored("path/whatever.c"); - - cl_git_pass(git_ignore_clear_internal_rules(g_repo)); - - assert_is_ignored(".git"); - assert_is_ignored("this/file/."); - assert_is_ignored("path/../funky"); - refute_is_ignored("path/whatever.c"); -} - -void test_status_ignore__filenames_with_special_prefixes_do_not_interfere_with_status_retrieval(void) -{ - status_entry_single st; - char *test_cases[] = { - "!file", - "#blah", - "[blah]", - "[attr]", - "[attr]blah", - NULL - }; - int i; - - for (i = 0; *(test_cases + i) != NULL; i++) { - git_buf file = GIT_BUF_INIT; - char *file_name = *(test_cases + i); - git_repository *repo = cl_git_sandbox_init("empty_standard_repo"); - - cl_git_pass(git_buf_joinpath(&file, "empty_standard_repo", file_name)); - cl_git_mkfile(git_buf_cstr(&file), "Please don't ignore me!"); - - memset(&st, 0, sizeof(st)); - cl_git_pass(git_status_foreach(repo, cb_status__single, &st)); - cl_assert(st.count == 1); - cl_assert(st.status == GIT_STATUS_WT_NEW); - - cl_git_pass(git_status_file(&st.status, repo, file_name)); - cl_assert(st.status == GIT_STATUS_WT_NEW); - - cl_git_sandbox_cleanup(); - git_buf_free(&file); - } -} - -void test_status_ignore__issue_1766_negated_ignores(void) -{ - unsigned int status; - - g_repo = cl_git_sandbox_init("empty_standard_repo"); - - cl_git_pass(git_futils_mkdir_r( - "empty_standard_repo/a", NULL, 0775)); - cl_git_mkfile( - "empty_standard_repo/a/.gitignore", "*\n!.gitignore\n"); - cl_git_mkfile( - "empty_standard_repo/a/ignoreme", "I should be ignored\n"); - - refute_is_ignored("a/.gitignore"); - assert_is_ignored("a/ignoreme"); - - cl_git_pass(git_futils_mkdir_r( - "empty_standard_repo/b", NULL, 0775)); - cl_git_mkfile( - "empty_standard_repo/b/.gitignore", "*\n!.gitignore\n"); - cl_git_mkfile( - "empty_standard_repo/b/ignoreme", "I should be ignored\n"); - - refute_is_ignored("b/.gitignore"); - assert_is_ignored("b/ignoreme"); - - /* shouldn't have changed results from first couple either */ - refute_is_ignored("a/.gitignore"); - assert_is_ignored("a/ignoreme"); - - /* status should find the two ignore files and nothing else */ - - cl_git_pass(git_status_file(&status, g_repo, "a/.gitignore")); - cl_assert_equal_i(GIT_STATUS_WT_NEW, (int)status); - - cl_git_pass(git_status_file(&status, g_repo, "a/ignoreme")); - cl_assert_equal_i(GIT_STATUS_IGNORED, (int)status); - - cl_git_pass(git_status_file(&status, g_repo, "b/.gitignore")); - cl_assert_equal_i(GIT_STATUS_WT_NEW, (int)status); - - cl_git_pass(git_status_file(&status, g_repo, "b/ignoreme")); - cl_assert_equal_i(GIT_STATUS_IGNORED, (int)status); - - { - git_status_options opts = GIT_STATUS_OPTIONS_INIT; - status_entry_counts counts; - static const char *paths[] = { - "a/.gitignore", - "a/ignoreme", - "b/.gitignore", - "b/ignoreme", - }; - static const unsigned int statuses[] = { - GIT_STATUS_WT_NEW, - GIT_STATUS_IGNORED, - GIT_STATUS_WT_NEW, - GIT_STATUS_IGNORED, - }; - - memset(&counts, 0x0, sizeof(status_entry_counts)); - counts.expected_entry_count = 4; - counts.expected_paths = paths; - counts.expected_statuses = statuses; - - opts.flags = GIT_STATUS_OPT_DEFAULTS; - - cl_git_pass(git_status_foreach_ext( - g_repo, &opts, cb_status__normal, &counts)); - - cl_assert_equal_i(counts.expected_entry_count, counts.entry_count); - cl_assert_equal_i(0, counts.wrong_status_flags_count); - cl_assert_equal_i(0, counts.wrong_sorted_path); - } -} - -static void add_one_to_index(const char *file) -{ - git_index *index; - cl_git_pass(git_repository_index(&index, g_repo)); - cl_git_pass(git_index_add_bypath(index, file)); - git_index_free(index); -} - -/* Some further broken scenarios that have been reported */ -void test_status_ignore__more_breakage(void) -{ - static const char *test_files[] = { - "empty_standard_repo/d1/pfx-d2/d3/d4/d5/tracked", - "empty_standard_repo/d1/pfx-d2/d3/d4/d5/untracked", - "empty_standard_repo/d1/pfx-d2/d3/d4/untracked", - NULL - }; - - make_test_data("empty_standard_repo", test_files); - cl_git_mkfile( - "empty_standard_repo/.gitignore", - "/d1/pfx-*\n" - "!/d1/pfx-d2/\n" - "/d1/pfx-d2/*\n" - "!/d1/pfx-d2/d3/\n" - "/d1/pfx-d2/d3/*\n" - "!/d1/pfx-d2/d3/d4/\n"); - add_one_to_index("d1/pfx-d2/d3/d4/d5/tracked"); - - { - git_status_options opts = GIT_STATUS_OPTIONS_INIT; - status_entry_counts counts; - static const char *files[] = { - ".gitignore", - "d1/pfx-d2/d3/d4/d5/tracked", - "d1/pfx-d2/d3/d4/d5/untracked", - "d1/pfx-d2/d3/d4/untracked", - }; - static const unsigned int statuses[] = { - GIT_STATUS_WT_NEW, - GIT_STATUS_INDEX_NEW, - GIT_STATUS_WT_NEW, - GIT_STATUS_WT_NEW, - }; - - memset(&counts, 0x0, sizeof(status_entry_counts)); - counts.expected_entry_count = 4; - counts.expected_paths = files; - counts.expected_statuses = statuses; - opts.flags = GIT_STATUS_OPT_DEFAULTS | - GIT_STATUS_OPT_INCLUDE_IGNORED | - GIT_STATUS_OPT_RECURSE_IGNORED_DIRS; - cl_git_pass(git_status_foreach_ext( - g_repo, &opts, cb_status__normal, &counts)); - - cl_assert_equal_i(counts.expected_entry_count, counts.entry_count); - cl_assert_equal_i(0, counts.wrong_status_flags_count); - cl_assert_equal_i(0, counts.wrong_sorted_path); - } - - refute_is_ignored("d1/pfx-d2/d3/d4/d5/tracked"); - refute_is_ignored("d1/pfx-d2/d3/d4/d5/untracked"); - refute_is_ignored("d1/pfx-d2/d3/d4/untracked"); -} - -void test_status_ignore__negative_ignores_inside_ignores(void) -{ - static const char *test_files[] = { - "empty_standard_repo/top/mid/btm/tracked", - "empty_standard_repo/top/mid/btm/untracked", - "empty_standard_repo/zoo/bar", - "empty_standard_repo/zoo/foo/bar", - NULL - }; - - make_test_data("empty_standard_repo", test_files); - cl_git_mkfile( - "empty_standard_repo/.gitignore", - "top\n" - "!top/mid/btm\n" - "zoo/*\n" - "!zoo/bar\n" - "!zoo/foo/bar\n"); - add_one_to_index("top/mid/btm/tracked"); - - { - git_status_options opts = GIT_STATUS_OPTIONS_INIT; - status_entry_counts counts; - static const char *files[] = { - ".gitignore", "top/mid/btm/tracked", "top/mid/btm/untracked", - "zoo/bar", "zoo/foo/bar", - }; - static const unsigned int statuses[] = { - GIT_STATUS_WT_NEW, GIT_STATUS_INDEX_NEW, GIT_STATUS_IGNORED, - GIT_STATUS_WT_NEW, GIT_STATUS_IGNORED, - }; - - memset(&counts, 0x0, sizeof(status_entry_counts)); - counts.expected_entry_count = 5; - counts.expected_paths = files; - counts.expected_statuses = statuses; - opts.flags = GIT_STATUS_OPT_DEFAULTS | - GIT_STATUS_OPT_INCLUDE_IGNORED | - GIT_STATUS_OPT_RECURSE_IGNORED_DIRS; - cl_git_pass(git_status_foreach_ext( - g_repo, &opts, cb_status__normal, &counts)); - - cl_assert_equal_i(counts.expected_entry_count, counts.entry_count); - cl_assert_equal_i(0, counts.wrong_status_flags_count); - cl_assert_equal_i(0, counts.wrong_sorted_path); - } - - assert_is_ignored("top/mid/btm/tracked"); - assert_is_ignored("top/mid/btm/untracked"); - refute_is_ignored("foo/bar"); -} - -void test_status_ignore__negative_ignores_in_slash_star(void) -{ - git_status_options status_opts = GIT_STATUS_OPTIONS_INIT; - git_status_list *list; - int found_look_ma = 0, found_what_about = 0; - size_t i; - static const char *test_files[] = { - "empty_standard_repo/bin/look-ma.txt", - "empty_standard_repo/bin/what-about-me.txt", - NULL - }; - - make_test_data("empty_standard_repo", test_files); - cl_git_mkfile( - "empty_standard_repo/.gitignore", - "bin/*\n" - "!bin/w*\n"); - - assert_is_ignored("bin/look-ma.txt"); - refute_is_ignored("bin/what-about-me.txt"); - - status_opts.flags = GIT_STATUS_OPT_DEFAULTS; - cl_git_pass(git_status_list_new(&list, g_repo, &status_opts)); - for (i = 0; i < git_status_list_entrycount(list); i++) { - const git_status_entry *entry = git_status_byindex(list, i); - - if (!strcmp("bin/look-ma.txt", entry->index_to_workdir->new_file.path)) - found_look_ma = 1; - - if (!strcmp("bin/what-about-me.txt", entry->index_to_workdir->new_file.path)) - found_what_about = 1; - } - git_status_list_free(list); - - cl_assert(found_look_ma); - cl_assert(found_what_about); -} - -void test_status_ignore__negative_ignores_without_trailing_slash_inside_ignores(void) -{ - git_status_options status_opts = GIT_STATUS_OPTIONS_INIT; - git_status_list *list; - int found_parent_file = 0, found_parent_child1_file = 0, found_parent_child2_file = 0; - size_t i; - static const char *test_files[] = { - "empty_standard_repo/parent/file.txt", - "empty_standard_repo/parent/force.txt", - "empty_standard_repo/parent/child1/file.txt", - "empty_standard_repo/parent/child2/file.txt", - NULL - }; - - make_test_data("empty_standard_repo", test_files); - cl_git_mkfile( - "empty_standard_repo/.gitignore", - "parent/*\n" - "!parent/force.txt\n" - "!parent/child1\n" - "!parent/child2/\n"); - - add_one_to_index("parent/force.txt"); - - assert_is_ignored("parent/file.txt"); - refute_is_ignored("parent/force.txt"); - refute_is_ignored("parent/child1/file.txt"); - refute_is_ignored("parent/child2/file.txt"); - - status_opts.flags = GIT_STATUS_OPT_DEFAULTS; - cl_git_pass(git_status_list_new(&list, g_repo, &status_opts)); - for (i = 0; i < git_status_list_entrycount(list); i++) { - const git_status_entry *entry = git_status_byindex(list, i); - - if (!entry->index_to_workdir) - continue; - - if (!strcmp("parent/file.txt", entry->index_to_workdir->new_file.path)) - found_parent_file = 1; - - if (!strcmp("parent/force.txt", entry->index_to_workdir->new_file.path)) - found_parent_file = 1; - - if (!strcmp("parent/child1/file.txt", entry->index_to_workdir->new_file.path)) - found_parent_child1_file = 1; - - if (!strcmp("parent/child2/file.txt", entry->index_to_workdir->new_file.path)) - found_parent_child2_file = 1; - } - git_status_list_free(list); - - cl_assert(found_parent_file); - cl_assert(found_parent_child1_file); - cl_assert(found_parent_child2_file); -} - -void test_status_ignore__negative_directory_ignores(void) -{ - static const char *test_files[] = { - "empty_standard_repo/parent/child1/bar.txt", - "empty_standard_repo/parent/child2/bar.txt", - "empty_standard_repo/parent/child3/foo.txt", - "empty_standard_repo/parent/child4/bar.txt", - "empty_standard_repo/parent/nested/child5/bar.txt", - "empty_standard_repo/parent/nested/child6/bar.txt", - "empty_standard_repo/parent/nested/child7/bar.txt", - "empty_standard_repo/padded_parent/child8/bar.txt", - NULL - }; - - make_test_data("empty_standard_repo", test_files); - cl_git_mkfile( - "empty_standard_repo/.gitignore", - "foo.txt\n" - "parent/child1\n" - "parent/child2\n" - "parent/child4\n" - "parent/nested/child5\n" - "nested/child6\n" - "nested/child7\n" - "padded_parent/child8\n" - /* test simple exact match */ - "!parent/child1\n" - /* test negating file without negating dir */ - "!parent/child2/bar.txt\n" - /* test negative pattern on dir with its content - * being ignored */ - "!parent/child3\n" - /* test with partial match at end */ - "!child4\n" - /* test with partial match with '/' at end */ - "!nested/child5\n" - /* test with complete match */ - "!nested/child6\n" - /* test with trailing '/' */ - "!child7/\n" - /* test with partial dir match */ - "!_parent/child8\n"); - - refute_is_ignored("parent/child1/bar.txt"); - assert_is_ignored("parent/child2/bar.txt"); - assert_is_ignored("parent/child3/foo.txt"); - refute_is_ignored("parent/child4/bar.txt"); - assert_is_ignored("parent/nested/child5/bar.txt"); - refute_is_ignored("parent/nested/child6/bar.txt"); - refute_is_ignored("parent/nested/child7/bar.txt"); - assert_is_ignored("padded_parent/child8/bar.txt"); -} - -void test_status_ignore__filename_with_cr(void) -{ - int ignored; - - g_repo = cl_git_sandbox_init("empty_standard_repo"); - cl_git_mkfile("empty_standard_repo/.gitignore", "Icon\r\r\n"); - - cl_git_pass(git_ignore_path_is_ignored(&ignored, g_repo, "Icon\r")); - cl_assert_equal_i(1, ignored); - - cl_git_mkfile("empty_standard_repo/.gitignore", "Ico\rn\n"); - cl_git_pass(git_ignore_path_is_ignored(&ignored, g_repo, "Ico\rn")); - cl_assert_equal_i(1, ignored); - - cl_git_mkfile("empty_standard_repo/.gitignore", "Ico\rn\r\n"); - cl_git_pass(git_ignore_path_is_ignored(&ignored, g_repo, "Ico\rn")); - cl_assert_equal_i(1, ignored); - cl_git_pass(git_ignore_path_is_ignored(&ignored, g_repo, "Ico\rn\r")); - cl_assert_equal_i(0, ignored); - - cl_git_mkfile("empty_standard_repo/.gitignore", "Ico\rn\r\r\n"); - cl_git_pass(git_ignore_path_is_ignored(&ignored, g_repo, "Ico\rn\r")); - cl_assert_equal_i(1, ignored); - cl_git_pass(git_ignore_path_is_ignored(&ignored, g_repo, "Icon\r")); - cl_assert_equal_i(0, ignored); - - cl_git_mkfile("empty_standard_repo/.gitignore", "Icon\r\n"); - cl_git_pass(git_ignore_path_is_ignored(&ignored, g_repo, "Icon\r")); - cl_assert_equal_i(0, ignored); - cl_git_pass(git_ignore_path_is_ignored(&ignored, g_repo, "Icon")); - cl_assert_equal_i(1, ignored); -} - -void test_status_ignore__subdir_doesnt_match_above(void) -{ - int ignored, icase = 0, error; - git_config *cfg; - - g_repo = cl_git_sandbox_init("empty_standard_repo"); - - cl_git_pass(git_repository_config_snapshot(&cfg, g_repo)); - error = git_config_get_bool(&icase, cfg, "core.ignorecase"); - git_config_free(cfg); - if (error == GIT_ENOTFOUND) - error = 0; - - cl_git_pass(error); - - cl_git_pass(p_mkdir("empty_standard_repo/src", 0777)); - cl_git_pass(p_mkdir("empty_standard_repo/src/src", 0777)); - cl_git_mkfile("empty_standard_repo/src/.gitignore", "src\n"); - cl_git_mkfile("empty_standard_repo/.gitignore", ""); - - cl_git_pass(git_ignore_path_is_ignored(&ignored, g_repo, "src/test.txt")); - cl_assert_equal_i(0, ignored); - cl_git_pass(git_ignore_path_is_ignored(&ignored, g_repo, "src/src/test.txt")); - cl_assert_equal_i(1, ignored); - cl_git_pass(git_ignore_path_is_ignored(&ignored, g_repo, "src/foo/test.txt")); - cl_assert_equal_i(0, ignored); - - cl_git_pass(git_ignore_path_is_ignored(&ignored, g_repo, "SRC/src/test.txt")); - cl_assert_equal_i(icase, ignored); - cl_git_pass(git_ignore_path_is_ignored(&ignored, g_repo, "src/SRC/test.txt")); - cl_assert_equal_i(icase, ignored); -} - -void test_status_ignore__negate_exact_previous(void) -{ - int ignored; - - g_repo = cl_git_sandbox_init("empty_standard_repo"); - - cl_git_mkfile("empty_standard_repo/.gitignore", "*.com\ntags\n!tags/\n.buildpath"); - cl_git_mkfile("empty_standard_repo/.buildpath", ""); - cl_git_pass(git_ignore_path_is_ignored(&ignored, g_repo, ".buildpath")); - cl_assert_equal_i(1, ignored); -} diff --git a/vendor/libgit2/tests/status/renames.c b/vendor/libgit2/tests/status/renames.c deleted file mode 100644 index f482d693aa..0000000000 --- a/vendor/libgit2/tests/status/renames.c +++ /dev/null @@ -1,715 +0,0 @@ -#include "clar_libgit2.h" -#include "buffer.h" -#include "path.h" -#include "posix.h" -#include "status_helpers.h" -#include "util.h" -#include "status.h" - -static git_repository *g_repo = NULL; - -void test_status_renames__initialize(void) -{ - g_repo = cl_git_sandbox_init("renames"); - - cl_repo_set_bool(g_repo, "core.autocrlf", false); -} - -void test_status_renames__cleanup(void) -{ - cl_git_sandbox_cleanup(); -} - -static void _rename_helper( - git_repository *repo, const char *from, const char *to, const char *extra) -{ - git_buf oldpath = GIT_BUF_INIT, newpath = GIT_BUF_INIT; - - cl_git_pass(git_buf_joinpath( - &oldpath, git_repository_workdir(repo), from)); - cl_git_pass(git_buf_joinpath( - &newpath, git_repository_workdir(repo), to)); - - cl_git_pass(p_rename(oldpath.ptr, newpath.ptr)); - - if (extra) - cl_git_append2file(newpath.ptr, extra); - - git_buf_free(&oldpath); - git_buf_free(&newpath); -} - -#define rename_file(R,O,N) _rename_helper((R), (O), (N), NULL) -#define rename_and_edit_file(R,O,N) \ - _rename_helper((R), (O), (N), "Added at the end to keep similarity!") - -struct status_entry { - git_status_t status; - const char *oldname; - const char *newname; -}; - -static void check_status( - git_status_list *status_list, - struct status_entry *expected_list, - size_t expected_len) -{ - const git_status_entry *actual; - const struct status_entry *expected; - const char *oldname, *newname; - size_t i, files_in_status = git_status_list_entrycount(status_list); - - cl_assert_equal_sz(expected_len, files_in_status); - - for (i = 0; i < expected_len; i++) { - actual = git_status_byindex(status_list, i); - expected = &expected_list[i]; - - oldname = actual->head_to_index ? actual->head_to_index->old_file.path : - actual->index_to_workdir ? actual->index_to_workdir->old_file.path : NULL; - - newname = actual->index_to_workdir ? actual->index_to_workdir->new_file.path : - actual->head_to_index ? actual->head_to_index->new_file.path : NULL; - - cl_assert_equal_i_fmt(expected->status, actual->status, "%04x"); - - if (expected->oldname) { - cl_assert(oldname != NULL); - cl_assert_equal_s(oldname, expected->oldname); - } else { - cl_assert(oldname == NULL); - } - - if (actual->status & (GIT_STATUS_INDEX_RENAMED|GIT_STATUS_WT_RENAMED)) { - if (expected->newname) { - cl_assert(newname != NULL); - cl_assert_equal_s(newname, expected->newname); - } else { - cl_assert(newname == NULL); - } - } - } -} - -void test_status_renames__head2index_one(void) -{ - git_index *index; - git_status_list *statuslist; - git_status_options opts = GIT_STATUS_OPTIONS_INIT; - struct status_entry expected[] = { - { GIT_STATUS_INDEX_RENAMED, "ikeepsix.txt", "newname.txt" }, - }; - - opts.flags |= GIT_STATUS_OPT_RENAMES_HEAD_TO_INDEX; - - cl_git_pass(git_repository_index(&index, g_repo)); - - rename_file(g_repo, "ikeepsix.txt", "newname.txt"); - - cl_git_pass(git_index_remove_bypath(index, "ikeepsix.txt")); - cl_git_pass(git_index_add_bypath(index, "newname.txt")); - cl_git_pass(git_index_write(index)); - - cl_git_pass(git_status_list_new(&statuslist, g_repo, &opts)); - check_status(statuslist, expected, 1); - git_status_list_free(statuslist); - - git_index_free(index); -} - -void test_status_renames__head2index_two(void) -{ - git_index *index; - git_status_list *statuslist; - git_status_options opts = GIT_STATUS_OPTIONS_INIT; - struct status_entry expected[] = { - { GIT_STATUS_INDEX_RENAMED | GIT_STATUS_INDEX_MODIFIED, - "sixserving.txt", "aaa.txt" }, - { GIT_STATUS_INDEX_RENAMED | GIT_STATUS_INDEX_MODIFIED, - "untimely.txt", "bbb.txt" }, - { GIT_STATUS_INDEX_RENAMED, "songof7cities.txt", "ccc.txt" }, - { GIT_STATUS_INDEX_RENAMED, "ikeepsix.txt", "ddd.txt" }, - }; - - opts.flags |= GIT_STATUS_OPT_RENAMES_HEAD_TO_INDEX; - - cl_git_pass(git_repository_index(&index, g_repo)); - - rename_file(g_repo, "ikeepsix.txt", "ddd.txt"); - rename_and_edit_file(g_repo, "sixserving.txt", "aaa.txt"); - rename_file(g_repo, "songof7cities.txt", "ccc.txt"); - rename_and_edit_file(g_repo, "untimely.txt", "bbb.txt"); - - cl_git_pass(git_index_remove_bypath(index, "ikeepsix.txt")); - cl_git_pass(git_index_remove_bypath(index, "sixserving.txt")); - cl_git_pass(git_index_remove_bypath(index, "songof7cities.txt")); - cl_git_pass(git_index_remove_bypath(index, "untimely.txt")); - cl_git_pass(git_index_add_bypath(index, "ddd.txt")); - cl_git_pass(git_index_add_bypath(index, "aaa.txt")); - cl_git_pass(git_index_add_bypath(index, "ccc.txt")); - cl_git_pass(git_index_add_bypath(index, "bbb.txt")); - cl_git_pass(git_index_write(index)); - - cl_git_pass(git_status_list_new(&statuslist, g_repo, &opts)); - check_status(statuslist, expected, 4); - git_status_list_free(statuslist); - - git_index_free(index); -} - -void test_status_renames__head2index_no_rename_from_rewrite(void) -{ - git_index *index; - git_status_list *statuslist; - git_status_options opts = GIT_STATUS_OPTIONS_INIT; - struct status_entry expected[] = { - { GIT_STATUS_INDEX_MODIFIED, "ikeepsix.txt", "ikeepsix.txt" }, - { GIT_STATUS_INDEX_MODIFIED, "sixserving.txt", "sixserving.txt" }, - }; - - opts.flags |= GIT_STATUS_OPT_RENAMES_HEAD_TO_INDEX; - - cl_git_pass(git_repository_index(&index, g_repo)); - - rename_file(g_repo, "ikeepsix.txt", "_temp_.txt"); - rename_file(g_repo, "sixserving.txt", "ikeepsix.txt"); - rename_file(g_repo, "_temp_.txt", "sixserving.txt"); - - cl_git_pass(git_index_add_bypath(index, "ikeepsix.txt")); - cl_git_pass(git_index_add_bypath(index, "sixserving.txt")); - cl_git_pass(git_index_write(index)); - - cl_git_pass(git_status_list_new(&statuslist, g_repo, &opts)); - check_status(statuslist, expected, 2); - git_status_list_free(statuslist); - - git_index_free(index); -} - -void test_status_renames__head2index_rename_from_rewrite(void) -{ - git_index *index; - git_status_list *statuslist; - git_status_options opts = GIT_STATUS_OPTIONS_INIT; - struct status_entry expected[] = { - { GIT_STATUS_INDEX_RENAMED, "sixserving.txt", "ikeepsix.txt" }, - { GIT_STATUS_INDEX_RENAMED, "ikeepsix.txt", "sixserving.txt" }, - }; - - opts.flags |= GIT_STATUS_OPT_RENAMES_HEAD_TO_INDEX; - opts.flags |= GIT_STATUS_OPT_RENAMES_FROM_REWRITES; - - cl_git_pass(git_repository_index(&index, g_repo)); - - rename_file(g_repo, "ikeepsix.txt", "_temp_.txt"); - rename_file(g_repo, "sixserving.txt", "ikeepsix.txt"); - rename_file(g_repo, "_temp_.txt", "sixserving.txt"); - - cl_git_pass(git_index_add_bypath(index, "ikeepsix.txt")); - cl_git_pass(git_index_add_bypath(index, "sixserving.txt")); - cl_git_pass(git_index_write(index)); - - cl_git_pass(git_status_list_new(&statuslist, g_repo, &opts)); - check_status(statuslist, expected, 2); - git_status_list_free(statuslist); - - git_index_free(index); -} - -void test_status_renames__index2workdir_one(void) -{ - git_status_list *statuslist; - git_status_options opts = GIT_STATUS_OPTIONS_INIT; - struct status_entry expected[] = { - { GIT_STATUS_WT_RENAMED, "ikeepsix.txt", "newname.txt" }, - }; - - opts.flags |= GIT_STATUS_OPT_INCLUDE_UNTRACKED; - opts.flags |= GIT_STATUS_OPT_RENAMES_INDEX_TO_WORKDIR; - - rename_file(g_repo, "ikeepsix.txt", "newname.txt"); - - cl_git_pass(git_status_list_new(&statuslist, g_repo, &opts)); - check_status(statuslist, expected, 1); - git_status_list_free(statuslist); -} - -void test_status_renames__index2workdir_two(void) -{ - git_status_list *statuslist; - git_status_options opts = GIT_STATUS_OPTIONS_INIT; - struct status_entry expected[] = { - { GIT_STATUS_WT_RENAMED | GIT_STATUS_WT_MODIFIED, - "sixserving.txt", "aaa.txt" }, - { GIT_STATUS_WT_RENAMED | GIT_STATUS_WT_MODIFIED, - "untimely.txt", "bbb.txt" }, - { GIT_STATUS_WT_RENAMED, "songof7cities.txt", "ccc.txt" }, - { GIT_STATUS_WT_RENAMED, "ikeepsix.txt", "ddd.txt" }, - }; - - opts.flags |= GIT_STATUS_OPT_INCLUDE_UNTRACKED; - opts.flags |= GIT_STATUS_OPT_RENAMES_INDEX_TO_WORKDIR; - - rename_file(g_repo, "ikeepsix.txt", "ddd.txt"); - rename_and_edit_file(g_repo, "sixserving.txt", "aaa.txt"); - rename_file(g_repo, "songof7cities.txt", "ccc.txt"); - rename_and_edit_file(g_repo, "untimely.txt", "bbb.txt"); - - cl_git_pass(git_status_list_new(&statuslist, g_repo, &opts)); - check_status(statuslist, expected, 4); - git_status_list_free(statuslist); -} - -void test_status_renames__index2workdir_rename_from_rewrite(void) -{ - git_index *index; - git_status_list *statuslist; - git_status_options opts = GIT_STATUS_OPTIONS_INIT; - struct status_entry expected[] = { - { GIT_STATUS_WT_RENAMED, "sixserving.txt", "ikeepsix.txt" }, - { GIT_STATUS_WT_RENAMED, "ikeepsix.txt", "sixserving.txt" }, - }; - - opts.flags |= GIT_STATUS_OPT_RENAMES_INDEX_TO_WORKDIR; - opts.flags |= GIT_STATUS_OPT_RENAMES_FROM_REWRITES; - - cl_git_pass(git_repository_index(&index, g_repo)); - - rename_file(g_repo, "ikeepsix.txt", "_temp_.txt"); - rename_file(g_repo, "sixserving.txt", "ikeepsix.txt"); - rename_file(g_repo, "_temp_.txt", "sixserving.txt"); - - cl_git_pass(git_status_list_new(&statuslist, g_repo, &opts)); - check_status(statuslist, expected, 2); - git_status_list_free(statuslist); - - git_index_free(index); -} - -void test_status_renames__both_one(void) -{ - git_index *index; - git_status_list *statuslist; - git_status_options opts = GIT_STATUS_OPTIONS_INIT; - struct status_entry expected[] = { - { GIT_STATUS_INDEX_RENAMED | GIT_STATUS_WT_RENAMED, - "ikeepsix.txt", "newname-workdir.txt" }, - }; - - opts.flags |= GIT_STATUS_OPT_INCLUDE_UNTRACKED; - opts.flags |= GIT_STATUS_OPT_RENAMES_HEAD_TO_INDEX; - opts.flags |= GIT_STATUS_OPT_RENAMES_INDEX_TO_WORKDIR; - - cl_git_pass(git_repository_index(&index, g_repo)); - - rename_file(g_repo, "ikeepsix.txt", "newname-index.txt"); - - cl_git_pass(git_index_remove_bypath(index, "ikeepsix.txt")); - cl_git_pass(git_index_add_bypath(index, "newname-index.txt")); - cl_git_pass(git_index_write(index)); - - rename_file(g_repo, "newname-index.txt", "newname-workdir.txt"); - - cl_git_pass(git_status_list_new(&statuslist, g_repo, &opts)); - check_status(statuslist, expected, 1); - git_status_list_free(statuslist); - - git_index_free(index); -} - -void test_status_renames__both_two(void) -{ - git_index *index; - git_status_list *statuslist; - git_status_options opts = GIT_STATUS_OPTIONS_INIT; - struct status_entry expected[] = { - { GIT_STATUS_INDEX_RENAMED | GIT_STATUS_INDEX_MODIFIED | - GIT_STATUS_WT_RENAMED | GIT_STATUS_WT_MODIFIED, - "ikeepsix.txt", "ikeepsix-both.txt" }, - { GIT_STATUS_INDEX_RENAMED | GIT_STATUS_INDEX_MODIFIED, - "sixserving.txt", "sixserving-index.txt" }, - { GIT_STATUS_WT_RENAMED | GIT_STATUS_WT_MODIFIED, - "songof7cities.txt", "songof7cities-workdir.txt" }, - { GIT_STATUS_INDEX_RENAMED | GIT_STATUS_WT_RENAMED, - "untimely.txt", "untimely-both.txt" }, - }; - - opts.flags |= GIT_STATUS_OPT_INCLUDE_UNTRACKED; - opts.flags |= GIT_STATUS_OPT_RENAMES_HEAD_TO_INDEX; - opts.flags |= GIT_STATUS_OPT_RENAMES_INDEX_TO_WORKDIR; - - cl_git_pass(git_repository_index(&index, g_repo)); - - rename_and_edit_file(g_repo, "ikeepsix.txt", "ikeepsix-index.txt"); - rename_and_edit_file(g_repo, "sixserving.txt", "sixserving-index.txt"); - rename_file(g_repo, "untimely.txt", "untimely-index.txt"); - - cl_git_pass(git_index_remove_bypath(index, "ikeepsix.txt")); - cl_git_pass(git_index_remove_bypath(index, "sixserving.txt")); - cl_git_pass(git_index_remove_bypath(index, "untimely.txt")); - cl_git_pass(git_index_add_bypath(index, "ikeepsix-index.txt")); - cl_git_pass(git_index_add_bypath(index, "sixserving-index.txt")); - cl_git_pass(git_index_add_bypath(index, "untimely-index.txt")); - cl_git_pass(git_index_write(index)); - - rename_and_edit_file(g_repo, "ikeepsix-index.txt", "ikeepsix-both.txt"); - rename_and_edit_file(g_repo, "songof7cities.txt", "songof7cities-workdir.txt"); - rename_file(g_repo, "untimely-index.txt", "untimely-both.txt"); - - cl_git_pass(git_status_list_new(&statuslist, g_repo, &opts)); - check_status(statuslist, expected, 4); - git_status_list_free(statuslist); - - git_index_free(index); -} - - -void test_status_renames__both_rename_from_rewrite(void) -{ - git_index *index; - git_status_list *statuslist; - git_status_options opts = GIT_STATUS_OPTIONS_INIT; - struct status_entry expected[] = { - { GIT_STATUS_INDEX_RENAMED | GIT_STATUS_WT_RENAMED, - "songof7cities.txt", "ikeepsix.txt" }, - { GIT_STATUS_INDEX_RENAMED | GIT_STATUS_WT_RENAMED, - "ikeepsix.txt", "sixserving.txt" }, - { GIT_STATUS_INDEX_RENAMED | GIT_STATUS_WT_RENAMED, - "sixserving.txt", "songof7cities.txt" }, - }; - - opts.flags |= GIT_STATUS_OPT_INCLUDE_UNTRACKED; - opts.flags |= GIT_STATUS_OPT_RENAMES_HEAD_TO_INDEX; - opts.flags |= GIT_STATUS_OPT_RENAMES_INDEX_TO_WORKDIR; - opts.flags |= GIT_STATUS_OPT_RENAMES_FROM_REWRITES; - - cl_git_pass(git_repository_index(&index, g_repo)); - - rename_file(g_repo, "ikeepsix.txt", "_temp_.txt"); - rename_file(g_repo, "sixserving.txt", "ikeepsix.txt"); - rename_file(g_repo, "songof7cities.txt", "sixserving.txt"); - rename_file(g_repo, "_temp_.txt", "songof7cities.txt"); - - cl_git_pass(git_index_add_bypath(index, "ikeepsix.txt")); - cl_git_pass(git_index_add_bypath(index, "sixserving.txt")); - cl_git_pass(git_index_add_bypath(index, "songof7cities.txt")); - cl_git_pass(git_index_write(index)); - - rename_file(g_repo, "songof7cities.txt", "_temp_.txt"); - rename_file(g_repo, "ikeepsix.txt", "songof7cities.txt"); - rename_file(g_repo, "sixserving.txt", "ikeepsix.txt"); - rename_file(g_repo, "_temp_.txt", "sixserving.txt"); - - cl_git_pass(git_status_list_new(&statuslist, g_repo, &opts)); - check_status(statuslist, expected, 3); - git_status_list_free(statuslist); - - git_index_free(index); -} - -void test_status_renames__rewrites_only_for_renames(void) -{ - git_index *index; - git_status_list *statuslist; - git_status_options opts = GIT_STATUS_OPTIONS_INIT; - struct status_entry expected[] = { - { GIT_STATUS_WT_MODIFIED, "ikeepsix.txt", "ikeepsix.txt" }, - }; - - opts.flags |= GIT_STATUS_OPT_INCLUDE_UNTRACKED; - opts.flags |= GIT_STATUS_OPT_RENAMES_HEAD_TO_INDEX; - opts.flags |= GIT_STATUS_OPT_RENAMES_INDEX_TO_WORKDIR; - opts.flags |= GIT_STATUS_OPT_RENAMES_FROM_REWRITES; - - cl_git_pass(git_repository_index(&index, g_repo)); - - cl_git_rewritefile("renames/ikeepsix.txt", - "This is enough content for the file to be rewritten.\n" \ - "This is enough content for the file to be rewritten.\n" \ - "This is enough content for the file to be rewritten.\n" \ - "This is enough content for the file to be rewritten.\n" \ - "This is enough content for the file to be rewritten.\n" \ - "This is enough content for the file to be rewritten.\n" \ - "This is enough content for the file to be rewritten.\n" \ - "This is enough content for the file to be rewritten.\n" \ - "This is enough content for the file to be rewritten.\n" \ - "This is enough content for the file to be rewritten.\n" \ - "This is enough content for the file to be rewritten.\n" \ - "This is enough content for the file to be rewritten.\n" \ - "This is enough content for the file to be rewritten.\n" \ - "This is enough content for the file to be rewritten.\n" \ - "This is enough content for the file to be rewritten.\n" \ - "This is enough content for the file to be rewritten.\n"); - - cl_git_pass(git_status_list_new(&statuslist, g_repo, &opts)); - check_status(statuslist, expected, 1); - git_status_list_free(statuslist); - - git_index_free(index); -} - -void test_status_renames__both_casechange_one(void) -{ - git_index *index; - git_status_list *statuslist; - git_status_options opts = GIT_STATUS_OPTIONS_INIT; - int index_caps; - struct status_entry expected_icase[] = { - { GIT_STATUS_INDEX_RENAMED, - "ikeepsix.txt", "IKeepSix.txt" }, - }; - struct status_entry expected_case[] = { - { GIT_STATUS_INDEX_RENAMED | GIT_STATUS_WT_RENAMED, - "ikeepsix.txt", "IKEEPSIX.txt" }, - }; - - opts.flags |= GIT_STATUS_OPT_INCLUDE_UNTRACKED; - opts.flags |= GIT_STATUS_OPT_RENAMES_HEAD_TO_INDEX; - opts.flags |= GIT_STATUS_OPT_RENAMES_INDEX_TO_WORKDIR; - - cl_git_pass(git_repository_index(&index, g_repo)); - index_caps = git_index_caps(index); - - rename_file(g_repo, "ikeepsix.txt", "IKeepSix.txt"); - - cl_git_pass(git_index_remove_bypath(index, "ikeepsix.txt")); - cl_git_pass(git_index_add_bypath(index, "IKeepSix.txt")); - cl_git_pass(git_index_write(index)); - - /* on a case-insensitive file system, this change won't matter. - * on a case-sensitive one, it will. - */ - rename_file(g_repo, "IKeepSix.txt", "IKEEPSIX.txt"); - - cl_git_pass(git_status_list_new(&statuslist, g_repo, &opts)); - - check_status(statuslist, (index_caps & GIT_INDEXCAP_IGNORE_CASE) ? - expected_icase : expected_case, 1); - - git_status_list_free(statuslist); - - git_index_free(index); -} - -void test_status_renames__both_casechange_two(void) -{ - git_index *index; - git_status_list *statuslist; - git_status_options opts = GIT_STATUS_OPTIONS_INIT; - int index_caps; - struct status_entry expected_icase[] = { - { GIT_STATUS_INDEX_RENAMED | GIT_STATUS_INDEX_MODIFIED | - GIT_STATUS_WT_MODIFIED, - "ikeepsix.txt", "IKeepSix.txt" }, - { GIT_STATUS_INDEX_MODIFIED, - "sixserving.txt", "sixserving.txt" }, - { GIT_STATUS_INDEX_RENAMED | GIT_STATUS_WT_MODIFIED, - "songof7cities.txt", "songof7.txt" }, - { GIT_STATUS_INDEX_RENAMED | GIT_STATUS_WT_RENAMED, - "untimely.txt", "untimeliest.txt" } - }; - struct status_entry expected_case[] = { - { GIT_STATUS_INDEX_RENAMED | - GIT_STATUS_WT_MODIFIED | GIT_STATUS_WT_RENAMED, - "songof7cities.txt", "SONGOF7.txt" }, - { GIT_STATUS_INDEX_MODIFIED | GIT_STATUS_WT_RENAMED, - "sixserving.txt", "SixServing.txt" }, - { GIT_STATUS_INDEX_RENAMED | GIT_STATUS_INDEX_MODIFIED | - GIT_STATUS_WT_RENAMED | GIT_STATUS_WT_MODIFIED, - "ikeepsix.txt", "ikeepsix.txt" }, - { GIT_STATUS_INDEX_RENAMED | GIT_STATUS_WT_RENAMED, - "untimely.txt", "untimeliest.txt" } - }; - - opts.flags |= GIT_STATUS_OPT_INCLUDE_UNTRACKED; - opts.flags |= GIT_STATUS_OPT_RENAMES_HEAD_TO_INDEX; - opts.flags |= GIT_STATUS_OPT_RENAMES_INDEX_TO_WORKDIR; - - cl_git_pass(git_repository_index(&index, g_repo)); - index_caps = git_index_caps(index); - - rename_and_edit_file(g_repo, "ikeepsix.txt", "IKeepSix.txt"); - rename_and_edit_file(g_repo, "sixserving.txt", "sixserving.txt"); - rename_file(g_repo, "songof7cities.txt", "songof7.txt"); - rename_file(g_repo, "untimely.txt", "untimelier.txt"); - - cl_git_pass(git_index_remove_bypath(index, "ikeepsix.txt")); - cl_git_pass(git_index_remove_bypath(index, "sixserving.txt")); - cl_git_pass(git_index_remove_bypath(index, "songof7cities.txt")); - cl_git_pass(git_index_remove_bypath(index, "untimely.txt")); - cl_git_pass(git_index_add_bypath(index, "IKeepSix.txt")); - cl_git_pass(git_index_add_bypath(index, "sixserving.txt")); - cl_git_pass(git_index_add_bypath(index, "songof7.txt")); - cl_git_pass(git_index_add_bypath(index, "untimelier.txt")); - cl_git_pass(git_index_write(index)); - - rename_and_edit_file(g_repo, "IKeepSix.txt", "ikeepsix.txt"); - rename_file(g_repo, "sixserving.txt", "SixServing.txt"); - rename_and_edit_file(g_repo, "songof7.txt", "SONGOF7.txt"); - rename_file(g_repo, "untimelier.txt", "untimeliest.txt"); - - cl_git_pass(git_status_list_new(&statuslist, g_repo, &opts)); - - check_status(statuslist, (index_caps & GIT_INDEXCAP_IGNORE_CASE) ? - expected_icase : expected_case, 4); - - git_status_list_free(statuslist); - - git_index_free(index); -} - -void test_status_renames__zero_byte_file_does_not_fail(void) -{ - git_status_list *statuslist; - git_status_options opts = GIT_STATUS_OPTIONS_INIT; - - struct status_entry expected[] = { - { GIT_STATUS_WT_DELETED, "ikeepsix.txt", "ikeepsix.txt" }, - { GIT_STATUS_WT_NEW, "zerobyte.txt", "zerobyte.txt" }, - }; - - opts.flags |= GIT_STATUS_OPT_RENAMES_FROM_REWRITES | - GIT_STATUS_OPT_RENAMES_HEAD_TO_INDEX | - GIT_STATUS_OPT_RENAMES_INDEX_TO_WORKDIR | - GIT_STATUS_OPT_INCLUDE_IGNORED | - GIT_STATUS_OPT_INCLUDE_UNTRACKED | - GIT_STATUS_OPT_RECURSE_UNTRACKED_DIRS | - GIT_STATUS_SHOW_INDEX_AND_WORKDIR | - GIT_STATUS_OPT_RECURSE_IGNORED_DIRS; - - p_unlink("renames/ikeepsix.txt"); - cl_git_mkfile("renames/zerobyte.txt", ""); - - cl_git_pass(git_status_list_new(&statuslist, g_repo, &opts)); - check_status(statuslist, expected, 2); - git_status_list_free(statuslist); -} - -#ifdef GIT_USE_ICONV -static char *nfc = "\xC3\x85\x73\x74\x72\xC3\xB6\x6D"; -static char *nfd = "\x41\xCC\x8A\x73\x74\x72\x6F\xCC\x88\x6D"; -#endif - -void test_status_renames__precomposed_unicode_rename(void) -{ -#ifdef GIT_USE_ICONV - git_status_list *statuslist; - git_status_options opts = GIT_STATUS_OPTIONS_INIT; - struct status_entry expected0[] = { - { GIT_STATUS_WT_NEW, nfd, NULL }, - { GIT_STATUS_WT_DELETED, "sixserving.txt", NULL }, - }; - struct status_entry expected1[] = { - { GIT_STATUS_WT_RENAMED, "sixserving.txt", nfd }, - }; - struct status_entry expected2[] = { - { GIT_STATUS_WT_DELETED, "sixserving.txt", NULL }, - { GIT_STATUS_WT_NEW, nfc, NULL }, - }; - struct status_entry expected3[] = { - { GIT_STATUS_WT_RENAMED, "sixserving.txt", nfc }, - }; - - rename_file(g_repo, "sixserving.txt", nfc); - - opts.flags |= GIT_STATUS_OPT_INCLUDE_UNTRACKED; - - cl_repo_set_bool(g_repo, "core.precomposeunicode", false); - - cl_git_pass(git_status_list_new(&statuslist, g_repo, &opts)); - check_status(statuslist, expected0, ARRAY_SIZE(expected0)); - git_status_list_free(statuslist); - - opts.flags |= GIT_STATUS_OPT_RENAMES_INDEX_TO_WORKDIR; - - cl_git_pass(git_status_list_new(&statuslist, g_repo, &opts)); - check_status(statuslist, expected1, ARRAY_SIZE(expected1)); - git_status_list_free(statuslist); - - cl_repo_set_bool(g_repo, "core.precomposeunicode", true); - - opts.flags &= ~GIT_STATUS_OPT_RENAMES_INDEX_TO_WORKDIR; - - cl_git_pass(git_status_list_new(&statuslist, g_repo, &opts)); - check_status(statuslist, expected2, ARRAY_SIZE(expected2)); - git_status_list_free(statuslist); - - opts.flags |= GIT_STATUS_OPT_RENAMES_INDEX_TO_WORKDIR; - - cl_git_pass(git_status_list_new(&statuslist, g_repo, &opts)); - check_status(statuslist, expected3, ARRAY_SIZE(expected3)); - git_status_list_free(statuslist); -#endif -} - -void test_status_renames__precomposed_unicode_toggle_is_rename(void) -{ -#ifdef GIT_USE_ICONV - git_status_list *statuslist; - git_status_options opts = GIT_STATUS_OPTIONS_INIT; - struct status_entry expected0[] = { - { GIT_STATUS_INDEX_RENAMED, "ikeepsix.txt", nfd }, - }; - struct status_entry expected1[] = { - { GIT_STATUS_WT_RENAMED, nfd, nfc }, - }; - struct status_entry expected2[] = { - { GIT_STATUS_INDEX_RENAMED, nfd, nfc }, - }; - struct status_entry expected3[] = { - { GIT_STATUS_INDEX_RENAMED | GIT_STATUS_WT_RENAMED, nfd, nfd }, - }; - - cl_repo_set_bool(g_repo, "core.precomposeunicode", false); - rename_file(g_repo, "ikeepsix.txt", nfd); - - { - git_index *index; - cl_git_pass(git_repository_index(&index, g_repo)); - cl_git_pass(git_index_remove_bypath(index, "ikeepsix.txt")); - cl_git_pass(git_index_add_bypath(index, nfd)); - cl_git_pass(git_index_write(index)); - git_index_free(index); - } - - opts.flags |= GIT_STATUS_OPT_INCLUDE_UNTRACKED | - GIT_STATUS_OPT_RENAMES_HEAD_TO_INDEX | - GIT_STATUS_OPT_RENAMES_INDEX_TO_WORKDIR; - - cl_git_pass(git_status_list_new(&statuslist, g_repo, &opts)); - check_status(statuslist, expected0, ARRAY_SIZE(expected0)); - git_status_list_free(statuslist); - - cl_repo_commit_from_index(NULL, g_repo, NULL, 0, "commit nfd"); - - cl_git_pass(git_status_list_new(&statuslist, g_repo, &opts)); - cl_assert_equal_sz(0, git_status_list_entrycount(statuslist)); - git_status_list_free(statuslist); - - cl_repo_set_bool(g_repo, "core.precomposeunicode", true); - - cl_git_pass(git_status_list_new(&statuslist, g_repo, &opts)); - check_status(statuslist, expected1, ARRAY_SIZE(expected1)); - git_status_list_free(statuslist); - - { - git_index *index; - cl_git_pass(git_repository_index(&index, g_repo)); - cl_git_pass(git_index_remove_bypath(index, nfd)); - cl_git_pass(git_index_add_bypath(index, nfc)); - cl_git_pass(git_index_write(index)); - git_index_free(index); - } - - cl_git_pass(git_status_list_new(&statuslist, g_repo, &opts)); - check_status(statuslist, expected2, ARRAY_SIZE(expected2)); - git_status_list_free(statuslist); - - cl_repo_set_bool(g_repo, "core.precomposeunicode", false); - - cl_git_pass(git_status_list_new(&statuslist, g_repo, &opts)); - check_status(statuslist, expected3, ARRAY_SIZE(expected3)); - git_status_list_free(statuslist); -#endif -} - diff --git a/vendor/libgit2/tests/status/single.c b/vendor/libgit2/tests/status/single.c deleted file mode 100644 index 6efaab294a..0000000000 --- a/vendor/libgit2/tests/status/single.c +++ /dev/null @@ -1,45 +0,0 @@ -#include "clar_libgit2.h" -#include "posix.h" - -static void -cleanup__remove_file(void *_file) -{ - cl_must_pass(p_unlink((char *)_file)); -} - -/* test retrieving OID from a file apart from the ODB */ -void test_status_single__hash_single_file(void) -{ - static const char file_name[] = "new_file"; - static const char file_contents[] = "new_file\n"; - static const char file_hash[] = "d4fa8600b4f37d7516bef4816ae2c64dbf029e3a"; - - git_oid expected_id, actual_id; - - /* initialization */ - git_oid_fromstr(&expected_id, file_hash); - cl_git_mkfile(file_name, file_contents); - cl_set_cleanup(&cleanup__remove_file, (void *)file_name); - - cl_git_pass(git_odb_hashfile(&actual_id, file_name, GIT_OBJ_BLOB)); - cl_assert_equal_oid(&expected_id, &actual_id); -} - -/* test retrieving OID from an empty file apart from the ODB */ -void test_status_single__hash_single_empty_file(void) -{ - static const char file_name[] = "new_empty_file"; - static const char file_contents[] = ""; - static const char file_hash[] = "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391"; - - git_oid expected_id, actual_id; - - /* initialization */ - git_oid_fromstr(&expected_id, file_hash); - cl_git_mkfile(file_name, file_contents); - cl_set_cleanup(&cleanup__remove_file, (void *)file_name); - - cl_git_pass(git_odb_hashfile(&actual_id, file_name, GIT_OBJ_BLOB)); - cl_assert_equal_oid(&expected_id, &actual_id); -} - diff --git a/vendor/libgit2/tests/status/status_data.h b/vendor/libgit2/tests/status/status_data.h deleted file mode 100644 index 8ad4235fd4..0000000000 --- a/vendor/libgit2/tests/status/status_data.h +++ /dev/null @@ -1,326 +0,0 @@ -#include "status_helpers.h" - -// A utf-8 string with 83 characters, but 249 bytes. -static const char *longname = "\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97"; - - -/* entries for a plain copy of tests/resources/status */ - -static const char *entry_paths0[] = { - "file_deleted", - "ignored_file", - "modified_file", - "new_file", - "staged_changes", - "staged_changes_file_deleted", - "staged_changes_modified_file", - "staged_delete_file_deleted", - "staged_delete_modified_file", - "staged_new_file", - "staged_new_file_deleted_file", - "staged_new_file_modified_file", - - "subdir/deleted_file", - "subdir/modified_file", - "subdir/new_file", - - "\xe8\xbf\x99", -}; - -static const unsigned int entry_statuses0[] = { - GIT_STATUS_WT_DELETED, - GIT_STATUS_IGNORED, - GIT_STATUS_WT_MODIFIED, - GIT_STATUS_WT_NEW, - GIT_STATUS_INDEX_MODIFIED, - GIT_STATUS_INDEX_MODIFIED | GIT_STATUS_WT_DELETED, - GIT_STATUS_INDEX_MODIFIED | GIT_STATUS_WT_MODIFIED, - GIT_STATUS_INDEX_DELETED, - GIT_STATUS_INDEX_DELETED | GIT_STATUS_WT_NEW, - GIT_STATUS_INDEX_NEW, - GIT_STATUS_INDEX_NEW | GIT_STATUS_WT_DELETED, - GIT_STATUS_INDEX_NEW | GIT_STATUS_WT_MODIFIED, - - GIT_STATUS_WT_DELETED, - GIT_STATUS_WT_MODIFIED, - GIT_STATUS_WT_NEW, - - GIT_STATUS_WT_NEW, -}; - -static const int entry_count0 = 16; - -/* entries for a copy of tests/resources/status with all content - * deleted from the working directory - */ - -static const char *entry_paths2[] = { - "current_file", - "file_deleted", - "modified_file", - "staged_changes", - "staged_changes_file_deleted", - "staged_changes_modified_file", - "staged_delete_file_deleted", - "staged_delete_modified_file", - "staged_new_file", - "staged_new_file_deleted_file", - "staged_new_file_modified_file", - "subdir.txt", - "subdir/current_file", - "subdir/deleted_file", - "subdir/modified_file", -}; - -static const unsigned int entry_statuses2[] = { - GIT_STATUS_WT_DELETED, - GIT_STATUS_WT_DELETED, - GIT_STATUS_WT_DELETED, - GIT_STATUS_WT_DELETED | GIT_STATUS_INDEX_MODIFIED, - GIT_STATUS_WT_DELETED | GIT_STATUS_INDEX_MODIFIED, - GIT_STATUS_WT_DELETED | GIT_STATUS_INDEX_MODIFIED, - GIT_STATUS_INDEX_DELETED, - GIT_STATUS_INDEX_DELETED, - GIT_STATUS_WT_DELETED | GIT_STATUS_INDEX_NEW, - GIT_STATUS_WT_DELETED | GIT_STATUS_INDEX_NEW, - GIT_STATUS_WT_DELETED | GIT_STATUS_INDEX_NEW, - GIT_STATUS_WT_DELETED, - GIT_STATUS_WT_DELETED, - GIT_STATUS_WT_DELETED, - GIT_STATUS_WT_DELETED, -}; - -static const int entry_count2 = 15; - -/* entries for a copy of tests/resources/status with some mods */ - -static const char *entry_paths3_icase[] = { - ".HEADER", - "42-is-not-prime.sigh", - "current_file", - "current_file/", - "file_deleted", - "ignored_file", - "modified_file", - "new_file", - "README.md", - "staged_changes", - "staged_changes_file_deleted", - "staged_changes_modified_file", - "staged_delete_file_deleted", - "staged_delete_modified_file", - "staged_new_file", - "staged_new_file_deleted_file", - "staged_new_file_modified_file", - "subdir", - "subdir/current_file", - "subdir/deleted_file", - "subdir/modified_file", - "\xe8\xbf\x99", -}; - -static const unsigned int entry_statuses3_icase[] = { - GIT_STATUS_WT_NEW, - GIT_STATUS_WT_NEW, - GIT_STATUS_WT_DELETED, - GIT_STATUS_WT_NEW, - GIT_STATUS_WT_DELETED, - GIT_STATUS_IGNORED, - GIT_STATUS_WT_MODIFIED, - GIT_STATUS_WT_NEW, - GIT_STATUS_WT_NEW, - GIT_STATUS_INDEX_MODIFIED, - GIT_STATUS_WT_DELETED | GIT_STATUS_INDEX_MODIFIED, - GIT_STATUS_WT_MODIFIED | GIT_STATUS_INDEX_MODIFIED, - GIT_STATUS_INDEX_DELETED, - GIT_STATUS_WT_NEW | GIT_STATUS_INDEX_DELETED, - GIT_STATUS_INDEX_NEW, - GIT_STATUS_WT_DELETED | GIT_STATUS_INDEX_NEW, - GIT_STATUS_WT_MODIFIED | GIT_STATUS_INDEX_NEW, - GIT_STATUS_WT_NEW, - GIT_STATUS_WT_DELETED, - GIT_STATUS_WT_DELETED, - GIT_STATUS_WT_DELETED, - GIT_STATUS_WT_NEW, -}; - -static const char *entry_paths3[] = { - ".HEADER", - "42-is-not-prime.sigh", - "README.md", - "current_file", - "current_file/", - "file_deleted", - "ignored_file", - "modified_file", - "new_file", - "staged_changes", - "staged_changes_file_deleted", - "staged_changes_modified_file", - "staged_delete_file_deleted", - "staged_delete_modified_file", - "staged_new_file", - "staged_new_file_deleted_file", - "staged_new_file_modified_file", - "subdir", - "subdir/current_file", - "subdir/deleted_file", - "subdir/modified_file", - "\xe8\xbf\x99", -}; - -static const unsigned int entry_statuses3[] = { - GIT_STATUS_WT_NEW, - GIT_STATUS_WT_NEW, - GIT_STATUS_WT_NEW, - GIT_STATUS_WT_DELETED, - GIT_STATUS_WT_NEW, - GIT_STATUS_WT_DELETED, - GIT_STATUS_IGNORED, - GIT_STATUS_WT_MODIFIED, - GIT_STATUS_WT_NEW, - GIT_STATUS_INDEX_MODIFIED, - GIT_STATUS_WT_DELETED | GIT_STATUS_INDEX_MODIFIED, - GIT_STATUS_WT_MODIFIED | GIT_STATUS_INDEX_MODIFIED, - GIT_STATUS_INDEX_DELETED, - GIT_STATUS_WT_NEW | GIT_STATUS_INDEX_DELETED, - GIT_STATUS_INDEX_NEW, - GIT_STATUS_WT_DELETED | GIT_STATUS_INDEX_NEW, - GIT_STATUS_WT_MODIFIED | GIT_STATUS_INDEX_NEW, - GIT_STATUS_WT_NEW, - GIT_STATUS_WT_DELETED, - GIT_STATUS_WT_DELETED, - GIT_STATUS_WT_DELETED, - GIT_STATUS_WT_NEW, -}; - -static const int entry_count3 = 22; - - -/* entries for a copy of tests/resources/status with some mods - * and different options to the status call - */ - -static const char *entry_paths4[] = { - ".new_file", - "current_file", - "current_file/current_file", - "current_file/modified_file", - "current_file/new_file", - "file_deleted", - "modified_file", - "new_file", - "staged_changes", - "staged_changes_file_deleted", - "staged_changes_modified_file", - "staged_delete_file_deleted", - "staged_delete_modified_file", - "staged_new_file", - "staged_new_file_deleted_file", - "staged_new_file_modified_file", - "subdir", - "subdir/current_file", - "subdir/deleted_file", - "subdir/modified_file", - "zzz_new_dir/new_file", - "zzz_new_file", - "\xe8\xbf\x99", -}; - -static const unsigned int entry_statuses4[] = { - GIT_STATUS_WT_NEW, - GIT_STATUS_WT_DELETED, - GIT_STATUS_WT_NEW, - GIT_STATUS_WT_NEW, - GIT_STATUS_WT_NEW, - GIT_STATUS_WT_DELETED, - GIT_STATUS_WT_MODIFIED, - GIT_STATUS_WT_NEW, - GIT_STATUS_INDEX_MODIFIED, - GIT_STATUS_WT_DELETED | GIT_STATUS_INDEX_MODIFIED, - GIT_STATUS_WT_MODIFIED | GIT_STATUS_INDEX_MODIFIED, - GIT_STATUS_INDEX_DELETED, - GIT_STATUS_WT_NEW | GIT_STATUS_INDEX_DELETED, - GIT_STATUS_INDEX_NEW, - GIT_STATUS_WT_DELETED | GIT_STATUS_INDEX_NEW, - GIT_STATUS_WT_MODIFIED | GIT_STATUS_INDEX_NEW, - GIT_STATUS_WT_NEW, - GIT_STATUS_WT_DELETED, - GIT_STATUS_WT_DELETED, - GIT_STATUS_WT_DELETED, - GIT_STATUS_WT_NEW, - GIT_STATUS_WT_NEW, - GIT_STATUS_WT_NEW, -}; - -static const int entry_count4 = 23; - - -/* entries for a copy of tests/resources/status with options - * passed to the status call in order to only get the differences - * between the HEAD and the index (changes to be committed) - */ - -static const char *entry_paths5[] = { - "staged_changes", - "staged_changes_file_deleted", - "staged_changes_modified_file", - "staged_delete_file_deleted", - "staged_delete_modified_file", - "staged_new_file", - "staged_new_file_deleted_file", - "staged_new_file_modified_file", -}; - -static const unsigned int entry_statuses5[] = { - GIT_STATUS_INDEX_MODIFIED, - GIT_STATUS_INDEX_MODIFIED, - GIT_STATUS_INDEX_MODIFIED, - GIT_STATUS_INDEX_DELETED, - GIT_STATUS_INDEX_DELETED, - GIT_STATUS_INDEX_NEW, - GIT_STATUS_INDEX_NEW, - GIT_STATUS_INDEX_NEW, -}; - -static const int entry_count5 = 8; - - -/* entries for a copy of tests/resources/status with options - * passed to the status call in order to only get the differences - * between the workdir and the index (changes not staged, untracked files) - */ - -static const char *entry_paths6[] = { - "file_deleted", - "ignored_file", - "modified_file", - "new_file", - "staged_changes_file_deleted", - "staged_changes_modified_file", - "staged_delete_modified_file", - "staged_new_file_deleted_file", - "staged_new_file_modified_file", - "subdir/deleted_file", - "subdir/modified_file", - "subdir/new_file", - "\xe8\xbf\x99", -}; - -static const unsigned int entry_statuses6[] = { - GIT_STATUS_WT_DELETED, - GIT_STATUS_IGNORED, - GIT_STATUS_WT_MODIFIED, - GIT_STATUS_WT_NEW, - GIT_STATUS_WT_DELETED, - GIT_STATUS_WT_MODIFIED, - GIT_STATUS_WT_NEW, - GIT_STATUS_WT_DELETED, - GIT_STATUS_WT_MODIFIED, - GIT_STATUS_WT_DELETED, - GIT_STATUS_WT_MODIFIED, - GIT_STATUS_WT_NEW, - GIT_STATUS_WT_NEW, -}; - -static const int entry_count6 = 13; diff --git a/vendor/libgit2/tests/status/status_helpers.c b/vendor/libgit2/tests/status/status_helpers.c deleted file mode 100644 index 5d13caa9a0..0000000000 --- a/vendor/libgit2/tests/status/status_helpers.c +++ /dev/null @@ -1,97 +0,0 @@ -#include "clar_libgit2.h" -#include "status_helpers.h" - -int cb_status__normal( - const char *path, unsigned int status_flags, void *payload) -{ - status_entry_counts *counts = payload; - - if (counts->debug) - cb_status__print(path, status_flags, NULL); - - if (counts->entry_count >= counts->expected_entry_count) - counts->wrong_status_flags_count++; - else if (strcmp(path, counts->expected_paths[counts->entry_count])) - counts->wrong_sorted_path++; - else if (status_flags != counts->expected_statuses[counts->entry_count]) - counts->wrong_status_flags_count++; - - counts->entry_count++; - return 0; -} - -int cb_status__count(const char *p, unsigned int s, void *payload) -{ - volatile int *count = (int *)payload; - - GIT_UNUSED(p); - GIT_UNUSED(s); - - (*count)++; - - return 0; -} - -int cb_status__single(const char *p, unsigned int s, void *payload) -{ - status_entry_single *data = (status_entry_single *)payload; - - if (data->debug) - fprintf(stderr, "%02d: %s (%04x)\n", data->count, p, s); - - data->count++; - data->status = s; - - return 0; -} - -int cb_status__print( - const char *path, unsigned int status_flags, void *payload) -{ - char istatus = ' ', wstatus = ' '; - int icount = 0, wcount = 0; - - if (status_flags & GIT_STATUS_INDEX_NEW) { - istatus = 'A'; icount++; - } - if (status_flags & GIT_STATUS_INDEX_MODIFIED) { - istatus = 'M'; icount++; - } - if (status_flags & GIT_STATUS_INDEX_DELETED) { - istatus = 'D'; icount++; - } - if (status_flags & GIT_STATUS_INDEX_RENAMED) { - istatus = 'R'; icount++; - } - if (status_flags & GIT_STATUS_INDEX_TYPECHANGE) { - istatus = 'T'; icount++; - } - - if (status_flags & GIT_STATUS_WT_NEW) { - wstatus = 'A'; wcount++; - } - if (status_flags & GIT_STATUS_WT_MODIFIED) { - wstatus = 'M'; wcount++; - } - if (status_flags & GIT_STATUS_WT_DELETED) { - wstatus = 'D'; wcount++; - } - if (status_flags & GIT_STATUS_WT_TYPECHANGE) { - wstatus = 'T'; wcount++; - } - if (status_flags & GIT_STATUS_IGNORED) { - wstatus = 'I'; wcount++; - } - if (status_flags & GIT_STATUS_WT_UNREADABLE) { - wstatus = 'X'; wcount++; - } - - fprintf(stderr, "%c%c %s (%d/%d%s)\n", - istatus, wstatus, path, icount, wcount, - (icount > 1 || wcount > 1) ? " INVALID COMBO" : ""); - - if (payload) - *((int *)payload) += 1; - - return 0; -} diff --git a/vendor/libgit2/tests/status/status_helpers.h b/vendor/libgit2/tests/status/status_helpers.h deleted file mode 100644 index 242076cc93..0000000000 --- a/vendor/libgit2/tests/status/status_helpers.h +++ /dev/null @@ -1,49 +0,0 @@ -#ifndef INCLUDE_cl_status_helpers_h__ -#define INCLUDE_cl_status_helpers_h__ - -typedef struct { - int wrong_status_flags_count; - int wrong_sorted_path; - int entry_count; - const unsigned int* expected_statuses; - const char** expected_paths; - int expected_entry_count; - const char *file; - int line; - bool debug; -} status_entry_counts; - -#define status_counts_init(counts, paths, statuses) do { \ - memset(&(counts), 0, sizeof(counts)); \ - (counts).expected_statuses = (statuses); \ - (counts).expected_paths = (paths); \ - (counts).file = __FILE__; \ - (counts).line = __LINE__; \ - } while (0) - -/* cb_status__normal takes payload of "status_entry_counts *" */ - -extern int cb_status__normal( - const char *path, unsigned int status_flags, void *payload); - - -/* cb_status__count takes payload of "int *" */ - -extern int cb_status__count(const char *p, unsigned int s, void *payload); - - -typedef struct { - int count; - unsigned int status; - bool debug; -} status_entry_single; - -/* cb_status__single takes payload of "status_entry_single *" */ - -extern int cb_status__single(const char *p, unsigned int s, void *payload); - -/* cb_status__print takes optional payload of "int *" */ - -extern int cb_status__print(const char *p, unsigned int s, void *payload); - -#endif diff --git a/vendor/libgit2/tests/status/submodules.c b/vendor/libgit2/tests/status/submodules.c deleted file mode 100644 index e6de600884..0000000000 --- a/vendor/libgit2/tests/status/submodules.c +++ /dev/null @@ -1,526 +0,0 @@ -#include "clar_libgit2.h" -#include "fileops.h" -#include "status_helpers.h" -#include "../submodule/submodule_helpers.h" - -static git_repository *g_repo = NULL; - -void test_status_submodules__initialize(void) -{ -} - -void test_status_submodules__cleanup(void) -{ -} - -void test_status_submodules__api(void) -{ - git_submodule *sm; - - g_repo = setup_fixture_submodules(); - - cl_assert(git_submodule_lookup(NULL, g_repo, "nonexistent") == GIT_ENOTFOUND); - - cl_assert(git_submodule_lookup(NULL, g_repo, "modified") == GIT_ENOTFOUND); - - cl_git_pass(git_submodule_lookup(&sm, g_repo, "testrepo")); - cl_assert(sm != NULL); - cl_assert_equal_s("testrepo", git_submodule_name(sm)); - cl_assert_equal_s("testrepo", git_submodule_path(sm)); - git_submodule_free(sm); -} - -void test_status_submodules__0(void) -{ - int counts = 0; - - g_repo = setup_fixture_submodules(); - - cl_assert(git_path_isdir("submodules/.git")); - cl_assert(git_path_isdir("submodules/testrepo/.git")); - cl_assert(git_path_isfile("submodules/.gitmodules")); - - cl_git_pass( - git_status_foreach(g_repo, cb_status__count, &counts) - ); - - cl_assert_equal_i(6, counts); -} - -static const char *expected_files[] = { - ".gitmodules", - "added", - "deleted", - "ignored", - "modified", - "untracked" -}; - -static unsigned int expected_status[] = { - GIT_STATUS_WT_MODIFIED, - GIT_STATUS_INDEX_NEW, - GIT_STATUS_INDEX_DELETED, - GIT_STATUS_IGNORED, - GIT_STATUS_WT_MODIFIED, - GIT_STATUS_WT_NEW -}; - -static int cb_status__match(const char *p, unsigned int s, void *payload) -{ - status_entry_counts *counts = payload; - int idx = counts->entry_count++; - - clar__assert_equal( - counts->file, counts->line, - "Status path mismatch", 1, - "%s", counts->expected_paths[idx], p); - - clar__assert_equal( - counts->file, counts->line, - "Status code mismatch", 1, - "%o", counts->expected_statuses[idx], s); - - return 0; -} - -void test_status_submodules__1(void) -{ - status_entry_counts counts; - - g_repo = setup_fixture_submodules(); - - cl_assert(git_path_isdir("submodules/.git")); - cl_assert(git_path_isdir("submodules/testrepo/.git")); - cl_assert(git_path_isfile("submodules/.gitmodules")); - - status_counts_init(counts, expected_files, expected_status); - - cl_git_pass( git_status_foreach(g_repo, cb_status__match, &counts) ); - - cl_assert_equal_i(6, counts.entry_count); -} - -void test_status_submodules__single_file(void) -{ - unsigned int status = 0; - g_repo = setup_fixture_submodules(); - cl_git_pass( git_status_file(&status, g_repo, "testrepo") ); - cl_assert(!status); -} - -void test_status_submodules__moved_head(void) -{ - git_submodule *sm; - git_repository *smrepo; - git_oid oid; - git_status_options opts = GIT_STATUS_OPTIONS_INIT; - status_entry_counts counts; - static const char *expected_files_with_sub[] = { - ".gitmodules", - "added", - "deleted", - "ignored", - "modified", - "testrepo", - "untracked" - }; - static unsigned int expected_status_with_sub[] = { - GIT_STATUS_WT_MODIFIED, - GIT_STATUS_INDEX_NEW, - GIT_STATUS_INDEX_DELETED, - GIT_STATUS_IGNORED, - GIT_STATUS_WT_MODIFIED, - GIT_STATUS_WT_MODIFIED, - GIT_STATUS_WT_NEW - }; - - g_repo = setup_fixture_submodules(); - - cl_git_pass(git_submodule_lookup(&sm, g_repo, "testrepo")); - cl_git_pass(git_submodule_open(&smrepo, sm)); - git_submodule_free(sm); - - /* move submodule HEAD to c47800c7266a2be04c571c04d5a6614691ea99bd */ - cl_git_pass( - git_oid_fromstr(&oid, "c47800c7266a2be04c571c04d5a6614691ea99bd")); - cl_git_pass(git_repository_set_head_detached(smrepo, &oid)); - - /* first do a normal status, which should now include the submodule */ - - opts.flags = GIT_STATUS_OPT_DEFAULTS; - - status_counts_init( - counts, expected_files_with_sub, expected_status_with_sub); - cl_git_pass( - git_status_foreach_ext(g_repo, &opts, cb_status__match, &counts)); - cl_assert_equal_i(7, counts.entry_count); - - /* try again with EXCLUDE_SUBMODULES which should skip it */ - - opts.flags = GIT_STATUS_OPT_DEFAULTS | GIT_STATUS_OPT_EXCLUDE_SUBMODULES; - - status_counts_init(counts, expected_files, expected_status); - cl_git_pass( - git_status_foreach_ext(g_repo, &opts, cb_status__match, &counts)); - cl_assert_equal_i(6, counts.entry_count); - - git_repository_free(smrepo); -} - -void test_status_submodules__dirty_workdir_only(void) -{ - git_status_options opts = GIT_STATUS_OPTIONS_INIT; - status_entry_counts counts; - static const char *expected_files_with_sub[] = { - ".gitmodules", - "added", - "deleted", - "ignored", - "modified", - "testrepo", - "untracked" - }; - static unsigned int expected_status_with_sub[] = { - GIT_STATUS_WT_MODIFIED, - GIT_STATUS_INDEX_NEW, - GIT_STATUS_INDEX_DELETED, - GIT_STATUS_IGNORED, - GIT_STATUS_WT_MODIFIED, - GIT_STATUS_WT_MODIFIED, - GIT_STATUS_WT_NEW - }; - - g_repo = setup_fixture_submodules(); - - cl_git_rewritefile("submodules/testrepo/README", "heyheyhey"); - cl_git_mkfile("submodules/testrepo/all_new.txt", "never seen before"); - - /* first do a normal status, which should now include the submodule */ - - opts.flags = GIT_STATUS_OPT_DEFAULTS; - - status_counts_init( - counts, expected_files_with_sub, expected_status_with_sub); - cl_git_pass( - git_status_foreach_ext(g_repo, &opts, cb_status__match, &counts)); - cl_assert_equal_i(7, counts.entry_count); - - /* try again with EXCLUDE_SUBMODULES which should skip it */ - - opts.flags = GIT_STATUS_OPT_DEFAULTS | GIT_STATUS_OPT_EXCLUDE_SUBMODULES; - - status_counts_init(counts, expected_files, expected_status); - cl_git_pass( - git_status_foreach_ext(g_repo, &opts, cb_status__match, &counts)); - cl_assert_equal_i(6, counts.entry_count); -} - -void test_status_submodules__uninitialized(void) -{ - git_repository *cloned_repo; - git_status_list *statuslist; - - g_repo = cl_git_sandbox_init("submod2"); - - cl_git_pass(git_clone(&cloned_repo, "submod2", "submod2-clone", NULL)); - - cl_git_pass(git_status_list_new(&statuslist, cloned_repo, NULL)); - cl_assert_equal_i(0, git_status_list_entrycount(statuslist)); - - git_status_list_free(statuslist); - git_repository_free(cloned_repo); - cl_git_sandbox_cleanup(); -} - -void test_status_submodules__contained_untracked_repo(void) -{ - git_status_options opts = GIT_STATUS_OPTIONS_INIT; - status_entry_counts counts; - git_repository *contained; - static const char *expected_files_not_ignored[] = { - ".gitmodules", - "added", - "deleted", - "modified", - "untracked" - }; - static unsigned int expected_status_not_ignored[] = { - GIT_STATUS_WT_MODIFIED, - GIT_STATUS_INDEX_NEW, - GIT_STATUS_INDEX_DELETED, - GIT_STATUS_WT_MODIFIED, - GIT_STATUS_WT_NEW, - }; - static const char *expected_files_with_untracked[] = { - ".gitmodules", - "added", - "deleted", - "dir/file.md", - "modified", - "untracked" - }; - static const char *expected_files_with_untracked_dir[] = { - ".gitmodules", - "added", - "deleted", - "dir/", - "modified", - "untracked" - }; - static unsigned int expected_status_with_untracked[] = { - GIT_STATUS_WT_MODIFIED, - GIT_STATUS_INDEX_NEW, - GIT_STATUS_INDEX_DELETED, - GIT_STATUS_WT_NEW, - GIT_STATUS_WT_MODIFIED, - GIT_STATUS_WT_NEW - }; - - g_repo = setup_fixture_submodules(); - - /* skip empty directory */ - - cl_must_pass(p_mkdir("submodules/dir", 0777)); - opts.flags = GIT_STATUS_OPT_INCLUDE_UNTRACKED; - - status_counts_init( - counts, expected_files_not_ignored, expected_status_not_ignored); - cl_git_pass(git_status_foreach_ext( - g_repo, &opts, cb_status__match, &counts)); - cl_assert_equal_i(5, counts.entry_count); - - /* still skipping because empty == ignored */ - - opts.flags = GIT_STATUS_OPT_INCLUDE_UNTRACKED | - GIT_STATUS_OPT_RECURSE_UNTRACKED_DIRS; - - status_counts_init( - counts, expected_files_not_ignored, expected_status_not_ignored); - cl_git_pass(git_status_foreach_ext( - g_repo, &opts, cb_status__match, &counts)); - cl_assert_equal_i(5, counts.entry_count); - - /* find non-ignored contents of directory */ - - cl_git_mkfile("submodules/dir/file.md", "hello"); - opts.flags = GIT_STATUS_OPT_INCLUDE_UNTRACKED | - GIT_STATUS_OPT_RECURSE_UNTRACKED_DIRS; - - status_counts_init( - counts, expected_files_with_untracked, expected_status_with_untracked); - cl_git_pass(git_status_foreach_ext( - g_repo, &opts, cb_status__match, &counts)); - cl_assert_equal_i(6, counts.entry_count); - - /* but skip if all content is ignored */ - - cl_git_append2file("submodules/.git/info/exclude", "\n*.md\n\n"); - opts.flags = GIT_STATUS_OPT_INCLUDE_UNTRACKED | - GIT_STATUS_OPT_RECURSE_UNTRACKED_DIRS; - - status_counts_init( - counts, expected_files_not_ignored, expected_status_not_ignored); - cl_git_pass(git_status_foreach_ext( - g_repo, &opts, cb_status__match, &counts)); - cl_assert_equal_i(5, counts.entry_count); - - /* same is true if it contains a git link */ - - cl_git_mkfile("submodules/dir/.git", "gitlink: ../.git"); - opts.flags = GIT_STATUS_OPT_INCLUDE_UNTRACKED | - GIT_STATUS_OPT_RECURSE_UNTRACKED_DIRS; - - status_counts_init( - counts, expected_files_not_ignored, expected_status_not_ignored); - cl_git_pass(git_status_foreach_ext( - g_repo, &opts, cb_status__match, &counts)); - cl_assert_equal_i(5, counts.entry_count); - - /* but if it contains tracked files, it should just show up as a - * directory and exclude the files in it - */ - - cl_git_mkfile("submodules/dir/another_file", "hello"); - opts.flags = GIT_STATUS_OPT_INCLUDE_UNTRACKED | - GIT_STATUS_OPT_RECURSE_UNTRACKED_DIRS; - - status_counts_init( - counts, expected_files_with_untracked_dir, - expected_status_with_untracked); - cl_git_pass(git_status_foreach_ext( - g_repo, &opts, cb_status__match, &counts)); - cl_assert_equal_i(6, counts.entry_count); - - /* that applies to a git repo with a .git directory too */ - - cl_must_pass(p_unlink("submodules/dir/.git")); - cl_git_pass(git_repository_init(&contained, "submodules/dir", false)); - git_repository_free(contained); - opts.flags = GIT_STATUS_OPT_INCLUDE_UNTRACKED | - GIT_STATUS_OPT_RECURSE_UNTRACKED_DIRS; - - status_counts_init( - counts, expected_files_with_untracked_dir, - expected_status_with_untracked); - cl_git_pass(git_status_foreach_ext( - g_repo, &opts, cb_status__match, &counts)); - cl_assert_equal_i(6, counts.entry_count); - - /* same result even if we don't recurse into subdirectories */ - - opts.flags = GIT_STATUS_OPT_INCLUDE_UNTRACKED; - - status_counts_init( - counts, expected_files_with_untracked_dir, - expected_status_with_untracked); - cl_git_pass(git_status_foreach_ext( - g_repo, &opts, cb_status__match, &counts)); - cl_assert_equal_i(6, counts.entry_count); - - /* and if we remove the untracked file, it goes back to ignored */ - - cl_must_pass(p_unlink("submodules/dir/another_file")); - - status_counts_init( - counts, expected_files_not_ignored, expected_status_not_ignored); - cl_git_pass(git_status_foreach_ext( - g_repo, &opts, cb_status__match, &counts)); - cl_assert_equal_i(5, counts.entry_count); -} - -void test_status_submodules__broken_stuff_that_git_allows(void) -{ - git_status_options opts = GIT_STATUS_OPTIONS_INIT; - status_entry_counts counts; - git_repository *contained; - static const char *expected_files_with_broken[] = { - ".gitmodules", - "added", - "broken/tracked", - "deleted", - "ignored", - "modified", - "untracked" - }; - static unsigned int expected_status_with_broken[] = { - GIT_STATUS_WT_MODIFIED, - GIT_STATUS_INDEX_NEW, - GIT_STATUS_INDEX_NEW, - GIT_STATUS_INDEX_DELETED, - GIT_STATUS_IGNORED, - GIT_STATUS_WT_MODIFIED, - GIT_STATUS_WT_NEW, - }; - - g_repo = setup_fixture_submodules(); - - opts.flags = GIT_STATUS_OPT_INCLUDE_UNTRACKED | - GIT_STATUS_OPT_RECURSE_UNTRACKED_DIRS | - GIT_STATUS_OPT_INCLUDE_IGNORED; - - /* make a directory and stick a tracked item into the index */ - { - git_index *idx; - cl_must_pass(p_mkdir("submodules/broken", 0777)); - cl_git_mkfile("submodules/broken/tracked", "tracked content"); - cl_git_pass(git_repository_index(&idx, g_repo)); - cl_git_pass(git_index_add_bypath(idx, "broken/tracked")); - cl_git_pass(git_index_write(idx)); - git_index_free(idx); - } - - status_counts_init( - counts, expected_files_with_broken, expected_status_with_broken); - cl_git_pass(git_status_foreach_ext( - g_repo, &opts, cb_status__match, &counts)); - cl_assert_equal_i(7, counts.entry_count); - - /* directory with tracked items that looks a little bit like a repo */ - - cl_must_pass(p_mkdir("submodules/broken/.git", 0777)); - cl_must_pass(p_mkdir("submodules/broken/.git/info", 0777)); - cl_git_mkfile("submodules/broken/.git/info/exclude", "# bogus"); - - status_counts_init( - counts, expected_files_with_broken, expected_status_with_broken); - cl_git_pass(git_status_foreach_ext( - g_repo, &opts, cb_status__match, &counts)); - cl_assert_equal_i(7, counts.entry_count); - - /* directory with tracked items that is a repo */ - - cl_git_pass(git_futils_rmdir_r( - "submodules/broken/.git", NULL, GIT_RMDIR_REMOVE_FILES)); - cl_git_pass(git_repository_init(&contained, "submodules/broken", false)); - git_repository_free(contained); - - status_counts_init( - counts, expected_files_with_broken, expected_status_with_broken); - cl_git_pass(git_status_foreach_ext( - g_repo, &opts, cb_status__match, &counts)); - cl_assert_equal_i(7, counts.entry_count); - - /* directory with tracked items that claims to be a submodule but is not */ - - cl_git_pass(git_futils_rmdir_r( - "submodules/broken/.git", NULL, GIT_RMDIR_REMOVE_FILES)); - cl_git_append2file("submodules/.gitmodules", - "\n[submodule \"broken\"]\n" - "\tpath = broken\n" - "\turl = https://github.com/not/used\n\n"); - - status_counts_init( - counts, expected_files_with_broken, expected_status_with_broken); - cl_git_pass(git_status_foreach_ext( - g_repo, &opts, cb_status__match, &counts)); - cl_assert_equal_i(7, counts.entry_count); -} - -void test_status_submodules__entry_but_dir_tracked(void) -{ - git_repository *repo; - git_status_list *status; - git_diff *diff; - git_index *index; - git_tree *tree; - - cl_git_pass(git_repository_init(&repo, "mixed-submodule", 0)); - cl_git_mkfile("mixed-submodule/.gitmodules", "[submodule \"sub\"]\n path = sub\n url = ../foo\n"); - cl_git_pass(p_mkdir("mixed-submodule/sub", 0777)); - cl_git_mkfile("mixed-submodule/sub/file", ""); - - /* Create the commit with sub/file as a file, and an entry for sub in the modules list */ - { - git_oid tree_id, commit_id; - git_signature *sig; - git_reference *ref; - - cl_git_pass(git_repository_index(&index, repo)); - cl_git_pass(git_index_add_bypath(index, ".gitmodules")); - cl_git_pass(git_index_add_bypath(index, "sub/file")); - cl_git_pass(git_index_write(index)); - cl_git_pass(git_index_write_tree(&tree_id, index)); - cl_git_pass(git_signature_now(&sig, "Sloppy Submoduler", "sloppy@example.com")); - cl_git_pass(git_tree_lookup(&tree, repo, &tree_id)); - cl_git_pass(git_commit_create(&commit_id, repo, NULL, sig, sig, NULL, "message", tree, 0, NULL)); - cl_git_pass(git_reference_create(&ref, repo, "refs/heads/master", &commit_id, 1, "commit: foo")); - git_reference_free(ref); - git_signature_free(sig); - } - - cl_git_pass(git_diff_tree_to_index(&diff, repo, tree, index, NULL)); - cl_assert_equal_i(0, git_diff_num_deltas(diff)); - git_diff_free(diff); - - cl_git_pass(git_diff_index_to_workdir(&diff, repo, index, NULL)); - cl_assert_equal_i(0, git_diff_num_deltas(diff)); - git_diff_free(diff); - - cl_git_pass(git_status_list_new(&status, repo, NULL)); - cl_assert_equal_i(0, git_status_list_entrycount(status)); - - git_status_list_free(status); - git_index_free(index); - git_tree_free(tree); - git_repository_free(repo); -} diff --git a/vendor/libgit2/tests/status/worktree.c b/vendor/libgit2/tests/status/worktree.c deleted file mode 100644 index 75c7b71b07..0000000000 --- a/vendor/libgit2/tests/status/worktree.c +++ /dev/null @@ -1,1148 +0,0 @@ -#include "clar_libgit2.h" -#include "fileops.h" -#include "ignore.h" -#include "status_data.h" -#include "posix.h" -#include "util.h" -#include "path.h" -#include "../diff/diff_helpers.h" -#include "../checkout/checkout_helpers.h" -#include "git2/sys/diff.h" - -/** - * Cleanup - * - * This will be called once after each test finishes, even - * if the test failed - */ -void test_status_worktree__cleanup(void) -{ - cl_git_sandbox_cleanup(); -} - -/** - * Tests - Status determination on a working tree - */ -/* this test is equivalent to t18-status.c:statuscb0 */ -void test_status_worktree__whole_repository(void) -{ - status_entry_counts counts; - git_repository *repo = cl_git_sandbox_init("status"); - - memset(&counts, 0x0, sizeof(status_entry_counts)); - counts.expected_entry_count = entry_count0; - counts.expected_paths = entry_paths0; - counts.expected_statuses = entry_statuses0; - - cl_git_pass( - git_status_foreach(repo, cb_status__normal, &counts) - ); - - cl_assert_equal_i(counts.expected_entry_count, counts.entry_count); - cl_assert_equal_i(0, counts.wrong_status_flags_count); - cl_assert_equal_i(0, counts.wrong_sorted_path); -} - -void assert_show( - const int entry_counts, - const char *entry_paths[], - const unsigned int entry_statuses[], - git_repository *repo, - git_status_show_t show, - unsigned int extra_flags) -{ - status_entry_counts counts; - git_status_options opts = GIT_STATUS_OPTIONS_INIT; - - memset(&counts, 0x0, sizeof(status_entry_counts)); - counts.expected_entry_count = entry_counts; - counts.expected_paths = entry_paths; - counts.expected_statuses = entry_statuses; - - opts.flags = GIT_STATUS_OPT_DEFAULTS | extra_flags; - opts.show = show; - - cl_git_pass( - git_status_foreach_ext(repo, &opts, cb_status__normal, &counts) - ); - - cl_assert_equal_i(counts.expected_entry_count, counts.entry_count); - cl_assert_equal_i(0, counts.wrong_status_flags_count); - cl_assert_equal_i(0, counts.wrong_sorted_path); -} - -void test_status_worktree__show_index_and_workdir(void) -{ - assert_show(entry_count0, entry_paths0, entry_statuses0, - cl_git_sandbox_init("status"), GIT_STATUS_SHOW_INDEX_AND_WORKDIR, 0); -} - -void test_status_worktree__show_index_only(void) -{ - assert_show(entry_count5, entry_paths5, entry_statuses5, - cl_git_sandbox_init("status"), GIT_STATUS_SHOW_INDEX_ONLY, 0); -} - -void test_status_worktree__show_workdir_only(void) -{ - assert_show(entry_count6, entry_paths6, entry_statuses6, - cl_git_sandbox_init("status"), GIT_STATUS_SHOW_WORKDIR_ONLY, 0); -} - -/* this test is equivalent to t18-status.c:statuscb1 */ -void test_status_worktree__empty_repository(void) -{ - int count = 0; - git_repository *repo = cl_git_sandbox_init("empty_standard_repo"); - - cl_git_pass(git_status_foreach(repo, cb_status__count, &count)); - - cl_assert_equal_i(0, count); -} - -static int remove_file_cb(void *data, git_buf *file) -{ - const char *filename = git_buf_cstr(file); - - GIT_UNUSED(data); - - if (git__suffixcmp(filename, ".git") == 0) - return 0; - - if (git_path_isdir(filename)) - cl_git_pass(git_futils_rmdir_r(filename, NULL, GIT_RMDIR_REMOVE_FILES)); - else - cl_git_pass(p_unlink(git_buf_cstr(file))); - - return 0; -} - -/* this test is equivalent to t18-status.c:statuscb2 */ -void test_status_worktree__purged_worktree(void) -{ - status_entry_counts counts; - git_repository *repo = cl_git_sandbox_init("status"); - git_buf workdir = GIT_BUF_INIT; - - /* first purge the contents of the worktree */ - cl_git_pass(git_buf_sets(&workdir, git_repository_workdir(repo))); - cl_git_pass(git_path_direach(&workdir, 0, remove_file_cb, NULL)); - git_buf_free(&workdir); - - /* now get status */ - memset(&counts, 0x0, sizeof(status_entry_counts)); - counts.expected_entry_count = entry_count2; - counts.expected_paths = entry_paths2; - counts.expected_statuses = entry_statuses2; - - cl_git_pass( - git_status_foreach(repo, cb_status__normal, &counts) - ); - - cl_assert_equal_i(counts.expected_entry_count, counts.entry_count); - cl_assert_equal_i(0, counts.wrong_status_flags_count); - cl_assert_equal_i(0, counts.wrong_sorted_path); -} - -/* this test is similar to t18-status.c:statuscb3 */ -void test_status_worktree__swap_subdir_and_file(void) -{ - status_entry_counts counts; - git_repository *repo = cl_git_sandbox_init("status"); - git_index *index; - git_status_options opts = GIT_STATUS_OPTIONS_INIT; - bool ignore_case; - - cl_git_pass(git_repository_index(&index, repo)); - ignore_case = (git_index_caps(index) & GIT_INDEXCAP_IGNORE_CASE) != 0; - git_index_free(index); - - /* first alter the contents of the worktree */ - cl_git_pass(p_rename("status/current_file", "status/swap")); - cl_git_pass(p_rename("status/subdir", "status/current_file")); - cl_git_pass(p_rename("status/swap", "status/subdir")); - - cl_git_mkfile("status/.HEADER", "dummy"); - cl_git_mkfile("status/42-is-not-prime.sigh", "dummy"); - cl_git_mkfile("status/README.md", "dummy"); - - /* now get status */ - memset(&counts, 0x0, sizeof(status_entry_counts)); - counts.expected_entry_count = entry_count3; - counts.expected_paths = ignore_case ? entry_paths3_icase : entry_paths3; - counts.expected_statuses = ignore_case ? entry_statuses3_icase : entry_statuses3; - - opts.flags = GIT_STATUS_OPT_INCLUDE_UNTRACKED | - GIT_STATUS_OPT_INCLUDE_IGNORED; - - cl_git_pass( - git_status_foreach_ext(repo, &opts, cb_status__normal, &counts) - ); - - cl_assert_equal_i(counts.expected_entry_count, counts.entry_count); - cl_assert_equal_i(0, counts.wrong_status_flags_count); - cl_assert_equal_i(0, counts.wrong_sorted_path); -} - -void test_status_worktree__swap_subdir_with_recurse_and_pathspec(void) -{ - status_entry_counts counts; - git_repository *repo = cl_git_sandbox_init("status"); - git_status_options opts = GIT_STATUS_OPTIONS_INIT; - - /* first alter the contents of the worktree */ - cl_git_pass(p_rename("status/current_file", "status/swap")); - cl_git_pass(p_rename("status/subdir", "status/current_file")); - cl_git_pass(p_rename("status/swap", "status/subdir")); - cl_git_mkfile("status/.new_file", "dummy"); - cl_git_pass(git_futils_mkdir_r("status/zzz_new_dir", NULL, 0777)); - cl_git_mkfile("status/zzz_new_dir/new_file", "dummy"); - cl_git_mkfile("status/zzz_new_file", "dummy"); - - /* now get status */ - memset(&counts, 0x0, sizeof(status_entry_counts)); - counts.expected_entry_count = entry_count4; - counts.expected_paths = entry_paths4; - counts.expected_statuses = entry_statuses4; - - opts.flags = GIT_STATUS_OPT_INCLUDE_UNTRACKED | - GIT_STATUS_OPT_RECURSE_UNTRACKED_DIRS; - /* TODO: set pathspec to "current_file" eventually */ - - cl_git_pass( - git_status_foreach_ext(repo, &opts, cb_status__normal, &counts) - ); - - cl_assert_equal_i(counts.expected_entry_count, counts.entry_count); - cl_assert_equal_i(0, counts.wrong_status_flags_count); - cl_assert_equal_i(0, counts.wrong_sorted_path); -} - -/* this test is equivalent to t18-status.c:singlestatus0 */ -void test_status_worktree__single_file(void) -{ - int i; - unsigned int status_flags; - git_repository *repo = cl_git_sandbox_init("status"); - - for (i = 0; i < (int)entry_count0; i++) { - cl_git_pass( - git_status_file(&status_flags, repo, entry_paths0[i]) - ); - cl_assert(entry_statuses0[i] == status_flags); - } -} - -/* this test is equivalent to t18-status.c:singlestatus1 */ -void test_status_worktree__single_nonexistent_file(void) -{ - int error; - unsigned int status_flags; - git_repository *repo = cl_git_sandbox_init("status"); - - error = git_status_file(&status_flags, repo, "nonexistent"); - cl_git_fail(error); - cl_assert(error == GIT_ENOTFOUND); -} - -/* this test is equivalent to t18-status.c:singlestatus2 */ -void test_status_worktree__single_nonexistent_file_empty_repo(void) -{ - int error; - unsigned int status_flags; - git_repository *repo = cl_git_sandbox_init("empty_standard_repo"); - - error = git_status_file(&status_flags, repo, "nonexistent"); - cl_git_fail(error); - cl_assert(error == GIT_ENOTFOUND); -} - -/* this test is equivalent to t18-status.c:singlestatus3 */ -void test_status_worktree__single_file_empty_repo(void) -{ - unsigned int status_flags; - git_repository *repo = cl_git_sandbox_init("empty_standard_repo"); - - cl_git_mkfile("empty_standard_repo/new_file", "new_file\n"); - - cl_git_pass(git_status_file(&status_flags, repo, "new_file")); - cl_assert(status_flags == GIT_STATUS_WT_NEW); -} - -/* this test is equivalent to t18-status.c:singlestatus4 */ -void test_status_worktree__single_folder(void) -{ - int error; - unsigned int status_flags; - git_repository *repo = cl_git_sandbox_init("status"); - - error = git_status_file(&status_flags, repo, "subdir"); - cl_git_fail(error); - cl_assert(error != GIT_ENOTFOUND); -} - - -void test_status_worktree__ignores(void) -{ - int i, ignored; - git_repository *repo = cl_git_sandbox_init("status"); - - for (i = 0; i < (int)entry_count0; i++) { - cl_git_pass( - git_status_should_ignore(&ignored, repo, entry_paths0[i]) - ); - cl_assert(ignored == (entry_statuses0[i] == GIT_STATUS_IGNORED)); - } - - cl_git_pass( - git_status_should_ignore(&ignored, repo, "nonexistent_file") - ); - cl_assert(!ignored); - - cl_git_pass( - git_status_should_ignore(&ignored, repo, "ignored_nonexistent_file") - ); - cl_assert(ignored); -} - -static int cb_status__check_592(const char *p, unsigned int s, void *payload) -{ - if (s != GIT_STATUS_WT_DELETED || - (payload != NULL && strcmp(p, (const char *)payload) != 0)) - return -1; - - return 0; -} - -void test_status_worktree__issue_592(void) -{ - git_repository *repo; - git_buf path = GIT_BUF_INIT; - - repo = cl_git_sandbox_init("issue_592"); - cl_git_pass(git_buf_joinpath(&path, git_repository_workdir(repo), "l.txt")); - cl_git_pass(p_unlink(git_buf_cstr(&path))); - cl_assert(!git_path_exists("issue_592/l.txt")); - - cl_git_pass(git_status_foreach(repo, cb_status__check_592, "l.txt")); - - git_buf_free(&path); -} - -void test_status_worktree__issue_592_2(void) -{ - git_repository *repo; - git_buf path = GIT_BUF_INIT; - - repo = cl_git_sandbox_init("issue_592"); - cl_git_pass(git_buf_joinpath(&path, git_repository_workdir(repo), "c/a.txt")); - cl_git_pass(p_unlink(git_buf_cstr(&path))); - cl_assert(!git_path_exists("issue_592/c/a.txt")); - - cl_git_pass(git_status_foreach(repo, cb_status__check_592, "c/a.txt")); - - git_buf_free(&path); -} - -void test_status_worktree__issue_592_3(void) -{ - git_repository *repo; - git_buf path = GIT_BUF_INIT; - - repo = cl_git_sandbox_init("issue_592"); - - cl_git_pass(git_buf_joinpath(&path, git_repository_workdir(repo), "c")); - cl_git_pass(git_futils_rmdir_r(git_buf_cstr(&path), NULL, GIT_RMDIR_REMOVE_FILES)); - cl_assert(!git_path_exists("issue_592/c/a.txt")); - - cl_git_pass(git_status_foreach(repo, cb_status__check_592, "c/a.txt")); - - git_buf_free(&path); -} - -void test_status_worktree__issue_592_4(void) -{ - git_repository *repo; - git_buf path = GIT_BUF_INIT; - - repo = cl_git_sandbox_init("issue_592"); - - cl_git_pass(git_buf_joinpath(&path, git_repository_workdir(repo), "t/b.txt")); - cl_git_pass(p_unlink(git_buf_cstr(&path))); - - cl_git_pass(git_status_foreach(repo, cb_status__check_592, "t/b.txt")); - - git_buf_free(&path); -} - -void test_status_worktree__issue_592_5(void) -{ - git_repository *repo; - git_buf path = GIT_BUF_INIT; - - repo = cl_git_sandbox_init("issue_592"); - - cl_git_pass(git_buf_joinpath(&path, git_repository_workdir(repo), "t")); - cl_git_pass(git_futils_rmdir_r(git_buf_cstr(&path), NULL, GIT_RMDIR_REMOVE_FILES)); - cl_git_pass(p_mkdir(git_buf_cstr(&path), 0777)); - - cl_git_pass(git_status_foreach(repo, cb_status__check_592, NULL)); - - git_buf_free(&path); -} - -void test_status_worktree__issue_592_ignores_0(void) -{ - int count = 0; - status_entry_single st; - git_repository *repo = cl_git_sandbox_init("issue_592"); - - cl_git_pass(git_status_foreach(repo, cb_status__count, &count)); - cl_assert_equal_i(0, count); - - cl_git_rewritefile("issue_592/.gitignore", - ".gitignore\n*.txt\nc/\n[tT]*/\n"); - - cl_git_pass(git_status_foreach(repo, cb_status__count, &count)); - cl_assert_equal_i(1, count); - - /* This is a situation where the behavior of libgit2 is - * different from core git. Core git will show ignored.txt - * in the list of ignored files, even though the directory - * "t" is ignored and the file is untracked because we have - * the explicit "*.txt" ignore rule. Libgit2 just excludes - * all untracked files that are contained within ignored - * directories without explicitly listing them. - */ - cl_git_rewritefile("issue_592/t/ignored.txt", "ping"); - - memset(&st, 0, sizeof(st)); - cl_git_pass(git_status_foreach(repo, cb_status__single, &st)); - cl_assert_equal_i(1, st.count); - cl_assert(st.status == GIT_STATUS_IGNORED); - - cl_git_rewritefile("issue_592/c/ignored_by_dir", "ping"); - - memset(&st, 0, sizeof(st)); - cl_git_pass(git_status_foreach(repo, cb_status__single, &st)); - cl_assert_equal_i(1, st.count); - cl_assert(st.status == GIT_STATUS_IGNORED); - - cl_git_rewritefile("issue_592/t/ignored_by_dir_pattern", "ping"); - - memset(&st, 0, sizeof(st)); - cl_git_pass(git_status_foreach(repo, cb_status__single, &st)); - cl_assert_equal_i(1, st.count); - cl_assert(st.status == GIT_STATUS_IGNORED); -} - -void test_status_worktree__issue_592_ignored_dirs_with_tracked_content(void) -{ - int count = 0; - git_repository *repo = cl_git_sandbox_init("issue_592b"); - - cl_git_pass(git_status_foreach(repo, cb_status__count, &count)); - cl_assert_equal_i(1, count); - - /* if we are really mimicking core git, then only ignored1.txt - * at the top level will show up in the ignores list here. - * everything else will be unmodified or skipped completely. - */ -} - -void test_status_worktree__conflict_with_diff3(void) -{ - git_repository *repo = cl_git_sandbox_init("status"); - git_index *index; - unsigned int status; - git_index_entry ancestor_entry, our_entry, their_entry; - - memset(&ancestor_entry, 0x0, sizeof(git_index_entry)); - memset(&our_entry, 0x0, sizeof(git_index_entry)); - memset(&their_entry, 0x0, sizeof(git_index_entry)); - - ancestor_entry.path = "modified_file"; - ancestor_entry.mode = 0100644; - git_oid_fromstr(&ancestor_entry.id, - "452e4244b5d083ddf0460acf1ecc74db9dcfa11a"); - - our_entry.path = "modified_file"; - our_entry.mode = 0100644; - git_oid_fromstr(&our_entry.id, - "452e4244b5d083ddf0460acf1ecc74db9dcfa11a"); - - their_entry.path = "modified_file"; - their_entry.mode = 0100644; - git_oid_fromstr(&their_entry.id, - "452e4244b5d083ddf0460acf1ecc74db9dcfa11a"); - - cl_git_pass(git_status_file(&status, repo, "modified_file")); - cl_assert_equal_i(GIT_STATUS_WT_MODIFIED, status); - - cl_git_pass(git_repository_index(&index, repo)); - cl_git_pass(git_index_remove(index, "modified_file", 0)); - cl_git_pass(git_index_conflict_add( - index, &ancestor_entry, &our_entry, &their_entry)); - cl_git_pass(git_index_write(index)); - git_index_free(index); - - cl_git_pass(git_status_file(&status, repo, "modified_file")); - - cl_assert_equal_i(GIT_STATUS_CONFLICTED, status); -} - -static const char *filemode_paths[] = { - "exec_off", - "exec_off2on_staged", - "exec_off2on_workdir", - "exec_off_untracked", - "exec_on", - "exec_on2off_staged", - "exec_on2off_workdir", - "exec_on_untracked", -}; - -static unsigned int filemode_statuses[] = { - GIT_STATUS_CURRENT, - GIT_STATUS_INDEX_MODIFIED, - GIT_STATUS_WT_MODIFIED, - GIT_STATUS_WT_NEW, - GIT_STATUS_CURRENT, - GIT_STATUS_INDEX_MODIFIED, - GIT_STATUS_WT_MODIFIED, - GIT_STATUS_WT_NEW -}; - -static const int filemode_count = 8; - -void test_status_worktree__filemode_changes(void) -{ - git_repository *repo = cl_git_sandbox_init("filemodes"); - status_entry_counts counts; - git_status_options opts = GIT_STATUS_OPTIONS_INIT; - - /* overwrite stored filemode with platform appropriate value */ - if (cl_is_chmod_supported()) - cl_repo_set_bool(repo, "core.filemode", true); - else { - int i; - - cl_repo_set_bool(repo, "core.filemode", false); - - /* won't trust filesystem mode diffs, so these will appear unchanged */ - for (i = 0; i < filemode_count; ++i) - if (filemode_statuses[i] == GIT_STATUS_WT_MODIFIED) - filemode_statuses[i] = GIT_STATUS_CURRENT; - } - - opts.flags = GIT_STATUS_OPT_INCLUDE_UNTRACKED | - GIT_STATUS_OPT_INCLUDE_IGNORED | - GIT_STATUS_OPT_INCLUDE_UNMODIFIED; - - memset(&counts, 0, sizeof(counts)); - counts.expected_entry_count = filemode_count; - counts.expected_paths = filemode_paths; - counts.expected_statuses = filemode_statuses; - - cl_git_pass( - git_status_foreach_ext(repo, &opts, cb_status__normal, &counts) - ); - - cl_assert_equal_i(counts.expected_entry_count, counts.entry_count); - cl_assert_equal_i(0, counts.wrong_status_flags_count); - cl_assert_equal_i(0, counts.wrong_sorted_path); -} - -static int cb_status__interrupt(const char *p, unsigned int s, void *payload) -{ - volatile int *count = (int *)payload; - - GIT_UNUSED(p); - GIT_UNUSED(s); - - (*count)++; - - return (*count == 8) ? -111 : 0; -} - -void test_status_worktree__interruptable_foreach(void) -{ - int count = 0; - git_repository *repo = cl_git_sandbox_init("status"); - - cl_assert_equal_i( - -111, git_status_foreach(repo, cb_status__interrupt, &count) - ); - - cl_assert_equal_i(8, count); -} - -void test_status_worktree__line_endings_dont_count_as_changes_with_autocrlf(void) -{ - git_repository *repo = cl_git_sandbox_init("status"); - unsigned int status; - - cl_repo_set_bool(repo, "core.autocrlf", true); - - cl_git_rewritefile("status/current_file", "current_file\r\n"); - - cl_git_pass(git_status_file(&status, repo, "current_file")); - - /* stat data on file should no longer match stat cache, even though - * file diff will be empty because of line-ending conversion - matches - * the Git command-line behavior here. - */ - cl_assert_equal_i(GIT_STATUS_WT_MODIFIED, status); -} - -void test_status_worktree__line_endings_dont_count_as_changes_with_autocrlf_issue_1397(void) -{ - git_repository *repo = cl_git_sandbox_init("issue_1397"); - unsigned int status; - - cl_repo_set_bool(repo, "core.autocrlf", true); - - cl_git_pass(git_status_file(&status, repo, "crlf_file.txt")); - - cl_assert_equal_i(GIT_STATUS_CURRENT, status); -} - -void test_status_worktree__conflicted_item(void) -{ - git_repository *repo = cl_git_sandbox_init("status"); - git_index *index; - unsigned int status; - git_index_entry ancestor_entry, our_entry, their_entry; - - memset(&ancestor_entry, 0x0, sizeof(git_index_entry)); - memset(&our_entry, 0x0, sizeof(git_index_entry)); - memset(&their_entry, 0x0, sizeof(git_index_entry)); - - ancestor_entry.mode = 0100644; - ancestor_entry.path = "modified_file"; - git_oid_fromstr(&ancestor_entry.id, - "452e4244b5d083ddf0460acf1ecc74db9dcfa11a"); - - our_entry.mode = 0100644; - our_entry.path = "modified_file"; - git_oid_fromstr(&our_entry.id, - "452e4244b5d083ddf0460acf1ecc74db9dcfa11a"); - - their_entry.mode = 0100644; - their_entry.path = "modified_file"; - git_oid_fromstr(&their_entry.id, - "452e4244b5d083ddf0460acf1ecc74db9dcfa11a"); - - cl_git_pass(git_status_file(&status, repo, "modified_file")); - cl_assert_equal_i(GIT_STATUS_WT_MODIFIED, status); - - cl_git_pass(git_repository_index(&index, repo)); - cl_git_pass(git_index_conflict_add(index, &ancestor_entry, - &our_entry, &their_entry)); - - cl_git_pass(git_status_file(&status, repo, "modified_file")); - cl_assert_equal_i(GIT_STATUS_CONFLICTED, status); - - git_index_free(index); -} - -void test_status_worktree__conflict_has_no_oid(void) -{ - git_repository *repo = cl_git_sandbox_init("status"); - git_index *index; - git_index_entry entry = {{0}}; - git_status_list *statuslist; - const git_status_entry *status; - git_oid zero_id = {{0}}; - - entry.mode = 0100644; - entry.path = "modified_file"; - git_oid_fromstr(&entry.id, "deadbeefdeadbeefdeadbeefdeadbeefdeadbeef"); - - cl_git_pass(git_repository_index(&index, repo)); - cl_git_pass(git_index_conflict_add(index, &entry, &entry, &entry)); - - git_status_list_new(&statuslist, repo, NULL); - - cl_assert_equal_i(16, git_status_list_entrycount(statuslist)); - - status = git_status_byindex(statuslist, 2); - - cl_assert_equal_i(GIT_STATUS_CONFLICTED, status->status); - cl_assert_equal_s("modified_file", status->head_to_index->old_file.path); - cl_assert(!git_oid_equal(&zero_id, &status->head_to_index->old_file.id)); - cl_assert(0 != status->head_to_index->old_file.mode); - cl_assert_equal_s("modified_file", status->head_to_index->new_file.path); - cl_assert_equal_oid(&zero_id, &status->head_to_index->new_file.id); - cl_assert_equal_i(0, status->head_to_index->new_file.mode); - cl_assert_equal_i(0, status->head_to_index->new_file.size); - - cl_assert_equal_s("modified_file", status->index_to_workdir->old_file.path); - cl_assert_equal_oid(&zero_id, &status->index_to_workdir->old_file.id); - cl_assert_equal_i(0, status->index_to_workdir->old_file.mode); - cl_assert_equal_i(0, status->index_to_workdir->old_file.size); - cl_assert_equal_s("modified_file", status->index_to_workdir->new_file.path); - cl_assert( - !git_oid_equal(&zero_id, &status->index_to_workdir->new_file.id) || - !(status->index_to_workdir->new_file.flags & GIT_DIFF_FLAG_VALID_ID)); - cl_assert(0 != status->index_to_workdir->new_file.mode); - cl_assert(0 != status->index_to_workdir->new_file.size); - - git_index_free(index); - git_status_list_free(statuslist); -} - -static void stage_and_commit(git_repository *repo, const char *path) -{ - git_index *index; - - cl_git_pass(git_repository_index(&index, repo)); - cl_git_pass(git_index_add_bypath(index, path)); - cl_repo_commit_from_index(NULL, repo, NULL, 1323847743, "Initial commit\n"); - git_index_free(index); -} - -static void assert_ignore_case( - bool should_ignore_case, - int expected_lower_cased_file_status, - int expected_camel_cased_file_status) -{ - unsigned int status; - git_buf lower_case_path = GIT_BUF_INIT, camel_case_path = GIT_BUF_INIT; - git_repository *repo, *repo2; - - repo = cl_git_sandbox_init("empty_standard_repo"); - cl_git_remove_placeholders(git_repository_path(repo), "dummy-marker.txt"); - - cl_repo_set_bool(repo, "core.ignorecase", should_ignore_case); - - cl_git_pass(git_buf_joinpath(&lower_case_path, - git_repository_workdir(repo), "plop")); - - cl_git_mkfile(git_buf_cstr(&lower_case_path), ""); - - stage_and_commit(repo, "plop"); - - cl_git_pass(git_repository_open(&repo2, "./empty_standard_repo")); - - cl_git_pass(git_status_file(&status, repo2, "plop")); - cl_assert_equal_i(GIT_STATUS_CURRENT, status); - - cl_git_pass(git_buf_joinpath(&camel_case_path, - git_repository_workdir(repo), "Plop")); - - cl_git_pass(p_rename(git_buf_cstr(&lower_case_path), git_buf_cstr(&camel_case_path))); - - cl_git_pass(git_status_file(&status, repo2, "plop")); - cl_assert_equal_i(expected_lower_cased_file_status, status); - - cl_git_pass(git_status_file(&status, repo2, "Plop")); - cl_assert_equal_i(expected_camel_cased_file_status, status); - - git_repository_free(repo2); - git_buf_free(&lower_case_path); - git_buf_free(&camel_case_path); -} - -void test_status_worktree__file_status_honors_core_ignorecase_true(void) -{ - assert_ignore_case(true, GIT_STATUS_CURRENT, GIT_STATUS_CURRENT); -} - -void test_status_worktree__file_status_honors_core_ignorecase_false(void) -{ - assert_ignore_case(false, GIT_STATUS_WT_DELETED, GIT_STATUS_WT_NEW); -} - -void test_status_worktree__file_status_honors_case_ignorecase_regarding_untracked_files(void) -{ - git_repository *repo = cl_git_sandbox_init("status"); - unsigned int status; - git_index *index; - - cl_repo_set_bool(repo, "core.ignorecase", false); - - repo = cl_git_sandbox_reopen(); - - /* Actually returns GIT_STATUS_IGNORED on Windows */ - cl_git_fail_with(git_status_file(&status, repo, "NEW_FILE"), GIT_ENOTFOUND); - - cl_git_pass(git_repository_index(&index, repo)); - - cl_git_pass(git_index_add_bypath(index, "new_file")); - cl_git_pass(git_index_write(index)); - git_index_free(index); - - /* Actually returns GIT_STATUS_IGNORED on Windows */ - cl_git_fail_with(git_status_file(&status, repo, "NEW_FILE"), GIT_ENOTFOUND); -} - -void test_status_worktree__simple_delete(void) -{ - git_repository *repo = cl_git_sandbox_init("renames"); - git_status_options opts = GIT_STATUS_OPTIONS_INIT; - int count; - - opts.flags = GIT_STATUS_OPT_INCLUDE_UNTRACKED | - GIT_STATUS_OPT_DISABLE_PATHSPEC_MATCH | - GIT_STATUS_OPT_EXCLUDE_SUBMODULES | - GIT_STATUS_OPT_RECURSE_UNTRACKED_DIRS; - - count = 0; - cl_git_pass( - git_status_foreach_ext(repo, &opts, cb_status__count, &count) ); - cl_assert_equal_i(0, count); - - cl_must_pass(p_unlink("renames/untimely.txt")); - - count = 0; - cl_git_pass( - git_status_foreach_ext(repo, &opts, cb_status__count, &count) ); - cl_assert_equal_i(1, count); -} - -void test_status_worktree__simple_delete_indexed(void) -{ - git_repository *repo = cl_git_sandbox_init("renames"); - git_status_options opts = GIT_STATUS_OPTIONS_INIT; - git_status_list *status; - - opts.flags = GIT_STATUS_OPT_INCLUDE_UNTRACKED | - GIT_STATUS_OPT_DISABLE_PATHSPEC_MATCH | - GIT_STATUS_OPT_EXCLUDE_SUBMODULES | - GIT_STATUS_OPT_RECURSE_UNTRACKED_DIRS; - - cl_git_pass(git_status_list_new(&status, repo, &opts)); - cl_assert_equal_sz(0, git_status_list_entrycount(status)); - git_status_list_free(status); - - cl_must_pass(p_unlink("renames/untimely.txt")); - - cl_git_pass(git_status_list_new(&status, repo, &opts)); - cl_assert_equal_sz(1, git_status_list_entrycount(status)); - cl_assert_equal_i( - GIT_STATUS_WT_DELETED, git_status_byindex(status, 0)->status); - git_status_list_free(status); -} - -static const char *icase_paths[] = { "B", "c", "g", "H" }; -static unsigned int icase_statuses[] = { - GIT_STATUS_WT_MODIFIED, GIT_STATUS_WT_DELETED, - GIT_STATUS_WT_MODIFIED, GIT_STATUS_WT_DELETED, -}; - -static const char *case_paths[] = { "B", "H", "c", "g" }; -static unsigned int case_statuses[] = { - GIT_STATUS_WT_MODIFIED, GIT_STATUS_WT_DELETED, - GIT_STATUS_WT_DELETED, GIT_STATUS_WT_MODIFIED, -}; - -void test_status_worktree__sorting_by_case(void) -{ - git_repository *repo = cl_git_sandbox_init("icase"); - git_index *index; - git_status_options opts = GIT_STATUS_OPTIONS_INIT; - bool native_ignore_case; - status_entry_counts counts; - - cl_git_pass(git_repository_index(&index, repo)); - native_ignore_case = - (git_index_caps(index) & GIT_INDEXCAP_IGNORE_CASE) != 0; - git_index_free(index); - - memset(&counts, 0, sizeof(counts)); - counts.expected_entry_count = 0; - counts.expected_paths = NULL; - counts.expected_statuses = NULL; - cl_git_pass( - git_status_foreach_ext(repo, &opts, cb_status__normal, &counts)); - cl_assert_equal_i(counts.expected_entry_count, counts.entry_count); - cl_assert_equal_i(0, counts.wrong_status_flags_count); - cl_assert_equal_i(0, counts.wrong_sorted_path); - - cl_git_rewritefile("icase/B", "new stuff"); - cl_must_pass(p_unlink("icase/c")); - cl_git_rewritefile("icase/g", "new stuff"); - cl_must_pass(p_unlink("icase/H")); - - memset(&counts, 0, sizeof(counts)); - counts.expected_entry_count = 4; - if (native_ignore_case) { - counts.expected_paths = icase_paths; - counts.expected_statuses = icase_statuses; - } else { - counts.expected_paths = case_paths; - counts.expected_statuses = case_statuses; - } - cl_git_pass( - git_status_foreach_ext(repo, &opts, cb_status__normal, &counts)); - cl_assert_equal_i(counts.expected_entry_count, counts.entry_count); - cl_assert_equal_i(0, counts.wrong_status_flags_count); - cl_assert_equal_i(0, counts.wrong_sorted_path); - - opts.flags = GIT_STATUS_OPT_SORT_CASE_SENSITIVELY; - - memset(&counts, 0, sizeof(counts)); - counts.expected_entry_count = 4; - counts.expected_paths = case_paths; - counts.expected_statuses = case_statuses; - cl_git_pass( - git_status_foreach_ext(repo, &opts, cb_status__normal, &counts)); - cl_assert_equal_i(counts.expected_entry_count, counts.entry_count); - cl_assert_equal_i(0, counts.wrong_status_flags_count); - cl_assert_equal_i(0, counts.wrong_sorted_path); - - opts.flags = GIT_STATUS_OPT_SORT_CASE_INSENSITIVELY; - - memset(&counts, 0, sizeof(counts)); - counts.expected_entry_count = 4; - counts.expected_paths = icase_paths; - counts.expected_statuses = icase_statuses; - cl_git_pass( - git_status_foreach_ext(repo, &opts, cb_status__normal, &counts)); - cl_assert_equal_i(counts.expected_entry_count, counts.entry_count); - cl_assert_equal_i(0, counts.wrong_status_flags_count); - cl_assert_equal_i(0, counts.wrong_sorted_path); -} - -void test_status_worktree__long_filenames(void) -{ - char path[260*4+1]; - const char *expected_paths[] = {path}; - const unsigned int expected_statuses[] = {GIT_STATUS_WT_NEW}; - - git_repository *repo = cl_git_sandbox_init("empty_standard_repo"); - git_status_options opts = GIT_STATUS_OPTIONS_INIT; - status_entry_counts counts = {0}; - - // Create directory with amazingly long filename - sprintf(path, "empty_standard_repo/%s", longname); - cl_git_pass(git_futils_mkdir_r(path, NULL, 0777)); - sprintf(path, "empty_standard_repo/%s/foo", longname); - cl_git_mkfile(path, "dummy"); - - sprintf(path, "%s/foo", longname); - counts.expected_entry_count = 1; - counts.expected_paths = expected_paths; - counts.expected_statuses = expected_statuses; - - opts.show = GIT_STATUS_SHOW_WORKDIR_ONLY; - opts.flags = GIT_STATUS_OPT_DEFAULTS; - - cl_git_pass( - git_status_foreach_ext(repo, &opts, cb_status__normal, &counts) ); - cl_assert_equal_i(counts.expected_entry_count, counts.entry_count); - cl_assert_equal_i(0, counts.wrong_status_flags_count); - cl_assert_equal_i(0, counts.wrong_sorted_path); -} - -/* The update stat cache tests mostly just mirror other tests and try - * to make sure that updating the stat cache doesn't change the results - * while reducing the amount of work that needs to be done - */ - -static void check_status0(git_status_list *status) -{ - size_t i, max_i = git_status_list_entrycount(status); - cl_assert_equal_sz(entry_count0, max_i); - for (i = 0; i < max_i; ++i) { - const git_status_entry *entry = git_status_byindex(status, i); - cl_assert_equal_i(entry_statuses0[i], entry->status); - } -} - -void test_status_worktree__update_stat_cache_0(void) -{ - git_repository *repo = cl_git_sandbox_init("status"); - git_status_options opts = GIT_STATUS_OPTIONS_INIT; - git_status_list *status; - git_diff_perfdata perf = GIT_DIFF_PERFDATA_INIT; - git_index *index; - - opts.flags = GIT_STATUS_OPT_DEFAULTS; - - cl_git_pass(git_status_list_new(&status, repo, &opts)); - check_status0(status); - cl_git_pass(git_status_list_get_perfdata(&perf, status)); - cl_assert_equal_sz(13 + 3, perf.stat_calls); - cl_assert_equal_sz(5, perf.oid_calculations); - - git_status_list_free(status); - - /* tick the index so we avoid recalculating racily-clean entries */ - cl_git_pass(git_repository_index__weakptr(&index, repo)); - tick_index(index); - - opts.flags |= GIT_STATUS_OPT_UPDATE_INDEX; - - cl_git_pass(git_status_list_new(&status, repo, &opts)); - check_status0(status); - cl_git_pass(git_status_list_get_perfdata(&perf, status)); - cl_assert_equal_sz(13 + 3, perf.stat_calls); - cl_assert_equal_sz(5, perf.oid_calculations); - - git_status_list_free(status); - - opts.flags &= ~GIT_STATUS_OPT_UPDATE_INDEX; - - /* tick again as the index updating from the previous diff might have reset the timestamp */ - tick_index(index); - cl_git_pass(git_status_list_new(&status, repo, &opts)); - check_status0(status); - cl_git_pass(git_status_list_get_perfdata(&perf, status)); - cl_assert_equal_sz(13 + 3, perf.stat_calls); - cl_assert_equal_sz(0, perf.oid_calculations); - - git_status_list_free(status); -} - -void test_status_worktree__unreadable(void) -{ -#ifndef GIT_WIN32 - const char *expected_paths[] = { "no_permission/foo" }; - const unsigned int expected_statuses[] = {GIT_STATUS_WT_UNREADABLE}; - - git_repository *repo = cl_git_sandbox_init("empty_standard_repo"); - git_status_options opts = GIT_STATUS_OPTIONS_INIT; - status_entry_counts counts = {0}; - - /* Create directory with no read permission */ - cl_git_pass(git_futils_mkdir_r("empty_standard_repo/no_permission", NULL, 0777)); - cl_git_mkfile("empty_standard_repo/no_permission/foo", "dummy"); - p_chmod("empty_standard_repo/no_permission", 0644); - - counts.expected_entry_count = 1; - counts.expected_paths = expected_paths; - counts.expected_statuses = expected_statuses; - - opts.show = GIT_STATUS_SHOW_WORKDIR_ONLY; - opts.flags = GIT_STATUS_OPT_DEFAULTS | GIT_STATUS_OPT_INCLUDE_UNREADABLE; - - cl_git_pass( - git_status_foreach_ext(repo, &opts, cb_status__normal, &counts) ); - - /* Restore permissions so we can cleanup :) */ - p_chmod("empty_standard_repo/no_permission", 0777); - - cl_assert_equal_i(counts.expected_entry_count, counts.entry_count); - cl_assert_equal_i(0, counts.wrong_status_flags_count); - cl_assert_equal_i(0, counts.wrong_sorted_path); -#endif -} - -void test_status_worktree__unreadable_not_included(void) -{ -#ifndef GIT_WIN32 - const char *expected_paths[] = { "no_permission/" }; - const unsigned int expected_statuses[] = {GIT_STATUS_WT_NEW}; - - git_repository *repo = cl_git_sandbox_init("empty_standard_repo"); - git_status_options opts = GIT_STATUS_OPTIONS_INIT; - status_entry_counts counts = {0}; - - /* Create directory with no read permission */ - cl_git_pass(git_futils_mkdir_r("empty_standard_repo/no_permission", NULL, 0777)); - cl_git_mkfile("empty_standard_repo/no_permission/foo", "dummy"); - p_chmod("empty_standard_repo/no_permission", 0644); - - counts.expected_entry_count = 1; - counts.expected_paths = expected_paths; - counts.expected_statuses = expected_statuses; - - opts.show = GIT_STATUS_SHOW_WORKDIR_ONLY; - opts.flags = (GIT_STATUS_OPT_INCLUDE_IGNORED | GIT_STATUS_OPT_INCLUDE_UNTRACKED); - - cl_git_pass( - git_status_foreach_ext(repo, &opts, cb_status__normal, &counts) ); - - /* Restore permissions so we can cleanup :) */ - p_chmod("empty_standard_repo/no_permission", 0777); - - cl_assert_equal_i(counts.expected_entry_count, counts.entry_count); - cl_assert_equal_i(0, counts.wrong_status_flags_count); - cl_assert_equal_i(0, counts.wrong_sorted_path); -#endif -} - -void test_status_worktree__unreadable_as_untracked(void) -{ - const char *expected_paths[] = { "no_permission/foo" }; - const unsigned int expected_statuses[] = {GIT_STATUS_WT_NEW}; - - git_repository *repo = cl_git_sandbox_init("empty_standard_repo"); - git_status_options opts = GIT_STATUS_OPTIONS_INIT; - status_entry_counts counts = {0}; - - /* Create directory with no read permission */ - cl_git_pass(git_futils_mkdir_r("empty_standard_repo/no_permission", NULL, 0777)); - cl_git_mkfile("empty_standard_repo/no_permission/foo", "dummy"); - p_chmod("empty_standard_repo/no_permission", 0644); - - counts.expected_entry_count = 1; - counts.expected_paths = expected_paths; - counts.expected_statuses = expected_statuses; - - opts.show = GIT_STATUS_SHOW_WORKDIR_ONLY; - opts.flags = GIT_STATUS_OPT_DEFAULTS | - GIT_STATUS_OPT_INCLUDE_UNREADABLE | - GIT_STATUS_OPT_INCLUDE_UNREADABLE_AS_UNTRACKED; - - cl_git_pass( - git_status_foreach_ext(repo, &opts, cb_status__normal, &counts) ); - - /* Restore permissions so we can cleanup :) */ - p_chmod("empty_standard_repo/no_permission", 0777); - - cl_assert_equal_i(counts.expected_entry_count, counts.entry_count); - cl_assert_equal_i(0, counts.wrong_status_flags_count); - cl_assert_equal_i(0, counts.wrong_sorted_path); -} - -void test_status_worktree__update_index_with_symlink_doesnt_change_mode(void) -{ - git_repository *repo = cl_git_sandbox_init("testrepo"); - git_reference *head; - git_object *head_object; - git_index *index; - const git_index_entry *idx_entry; - git_status_options opts = GIT_STATUS_OPTIONS_INIT; - status_entry_counts counts = {0}; - const char *expected_paths[] = { "README" }; - const unsigned int expected_statuses[] = {GIT_STATUS_WT_NEW}; - - opts.show = GIT_STATUS_SHOW_INDEX_AND_WORKDIR; - opts.flags = GIT_STATUS_OPT_DEFAULTS | GIT_STATUS_OPT_UPDATE_INDEX; - - cl_git_pass(git_repository_head(&head, repo)); - cl_git_pass(git_reference_peel(&head_object, head, GIT_OBJ_COMMIT)); - - cl_git_pass(git_reset(repo, head_object, GIT_RESET_HARD, NULL)); - - cl_git_rewritefile("testrepo/README", "This was rewritten."); - - /* this status rewrites the index because we have changed the - * contents of a tracked file - */ - counts.expected_entry_count = 1; - counts.expected_paths = expected_paths; - counts.expected_statuses = expected_statuses; - - cl_git_pass( - git_status_foreach_ext(repo, &opts, cb_status__normal, &counts)); - cl_assert_equal_i(1, counts.entry_count); - - /* now ensure that the status's rewrite of the index did not screw - * up the mode of the symlink `link_to_new.txt`, particularly - * on platforms that don't support symlinks - */ - cl_git_pass(git_repository_index(&index, repo)); - cl_git_pass(git_index_read(index, true)); - - cl_assert(idx_entry = git_index_get_bypath(index, "link_to_new.txt", 0)); - cl_assert(S_ISLNK(idx_entry->mode)); - - git_index_free(index); - git_object_free(head_object); - git_reference_free(head); -} - diff --git a/vendor/libgit2/tests/status/worktree_init.c b/vendor/libgit2/tests/status/worktree_init.c deleted file mode 100644 index cc7e126f11..0000000000 --- a/vendor/libgit2/tests/status/worktree_init.c +++ /dev/null @@ -1,338 +0,0 @@ -#include "clar_libgit2.h" -#include "git2/sys/repository.h" - -#include "fileops.h" -#include "ignore.h" -#include "status_helpers.h" -#include "posix.h" -#include "util.h" -#include "path.h" - -static void cleanup_new_repo(void *path) -{ - cl_fixture_cleanup((char *)path); -} - -void test_status_worktree_init__cannot_retrieve_the_status_of_a_bare_repository(void) -{ - git_repository *repo; - unsigned int status = 0; - - cl_git_pass(git_repository_open(&repo, cl_fixture("testrepo.git"))); - cl_assert_equal_i(GIT_EBAREREPO, git_status_file(&status, repo, "dummy")); - git_repository_free(repo); -} - -void test_status_worktree_init__first_commit_in_progress(void) -{ - git_repository *repo; - git_index *index; - status_entry_single result; - - cl_set_cleanup(&cleanup_new_repo, "getting_started"); - - cl_git_pass(git_repository_init(&repo, "getting_started", 0)); - cl_git_mkfile("getting_started/testfile.txt", "content\n"); - - memset(&result, 0, sizeof(result)); - cl_git_pass(git_status_foreach(repo, cb_status__single, &result)); - cl_assert_equal_i(1, result.count); - cl_assert(result.status == GIT_STATUS_WT_NEW); - - cl_git_pass(git_repository_index(&index, repo)); - cl_git_pass(git_index_add_bypath(index, "testfile.txt")); - cl_git_pass(git_index_write(index)); - - memset(&result, 0, sizeof(result)); - cl_git_pass(git_status_foreach(repo, cb_status__single, &result)); - cl_assert_equal_i(1, result.count); - cl_assert(result.status == GIT_STATUS_INDEX_NEW); - - git_index_free(index); - git_repository_free(repo); -} - - - -void test_status_worktree_init__status_file_without_index_or_workdir(void) -{ - git_repository *repo; - unsigned int status = 0; - git_index *index; - - cl_git_pass(p_mkdir("wd", 0777)); - - cl_git_pass(git_repository_open(&repo, cl_fixture("testrepo.git"))); - cl_git_pass(git_repository_set_workdir(repo, "wd", false)); - - cl_git_pass(git_index_open(&index, "empty-index")); - cl_assert_equal_i(0, (int)git_index_entrycount(index)); - git_repository_set_index(repo, index); - - cl_git_pass(git_status_file(&status, repo, "branch_file.txt")); - - cl_assert_equal_i(GIT_STATUS_INDEX_DELETED, status); - - git_repository_free(repo); - git_index_free(index); - cl_git_pass(p_rmdir("wd")); -} - -static void fill_index_wth_head_entries(git_repository *repo, git_index *index) -{ - git_oid oid; - git_commit *commit; - git_tree *tree; - - cl_git_pass(git_reference_name_to_id(&oid, repo, "HEAD")); - cl_git_pass(git_commit_lookup(&commit, repo, &oid)); - cl_git_pass(git_commit_tree(&tree, commit)); - - cl_git_pass(git_index_read_tree(index, tree)); - cl_git_pass(git_index_write(index)); - - git_tree_free(tree); - git_commit_free(commit); -} - -void test_status_worktree_init__status_file_with_clean_index_and_empty_workdir(void) -{ - git_repository *repo; - unsigned int status = 0; - git_index *index; - - cl_git_pass(p_mkdir("wd", 0777)); - - cl_git_pass(git_repository_open(&repo, cl_fixture("testrepo.git"))); - cl_git_pass(git_repository_set_workdir(repo, "wd", false)); - - cl_git_pass(git_index_open(&index, "my-index")); - fill_index_wth_head_entries(repo, index); - - git_repository_set_index(repo, index); - - cl_git_pass(git_status_file(&status, repo, "branch_file.txt")); - - cl_assert_equal_i(GIT_STATUS_WT_DELETED, status); - - git_repository_free(repo); - git_index_free(index); - cl_git_pass(p_rmdir("wd")); - cl_git_pass(p_unlink("my-index")); -} - -void test_status_worktree_init__bracket_in_filename(void) -{ - git_repository *repo; - git_index *index; - status_entry_single result; - unsigned int status_flags; - - #define FILE_WITH_BRACKET "LICENSE[1].md" - #define FILE_WITHOUT_BRACKET "LICENSE1.md" - - cl_set_cleanup(&cleanup_new_repo, "with_bracket"); - - cl_git_pass(git_repository_init(&repo, "with_bracket", 0)); - cl_git_mkfile("with_bracket/" FILE_WITH_BRACKET, "I have a bracket in my name\n"); - - /* file is new to working directory */ - - memset(&result, 0, sizeof(result)); - cl_git_pass(git_status_foreach(repo, cb_status__single, &result)); - cl_assert_equal_i(1, result.count); - cl_assert(result.status == GIT_STATUS_WT_NEW); - - cl_git_pass(git_status_file(&status_flags, repo, FILE_WITH_BRACKET)); - cl_assert(status_flags == GIT_STATUS_WT_NEW); - - /* ignore the file */ - - cl_git_rewritefile("with_bracket/.gitignore", "*.md\n.gitignore\n"); - - memset(&result, 0, sizeof(result)); - cl_git_pass(git_status_foreach(repo, cb_status__single, &result)); - cl_assert_equal_i(2, result.count); - cl_assert(result.status == GIT_STATUS_IGNORED); - - cl_git_pass(git_status_file(&status_flags, repo, FILE_WITH_BRACKET)); - cl_assert(status_flags == GIT_STATUS_IGNORED); - - /* don't ignore the file */ - - cl_git_rewritefile("with_bracket/.gitignore", ".gitignore\n"); - - memset(&result, 0, sizeof(result)); - cl_git_pass(git_status_foreach(repo, cb_status__single, &result)); - cl_assert_equal_i(2, result.count); - cl_assert(result.status == GIT_STATUS_WT_NEW); - - cl_git_pass(git_status_file(&status_flags, repo, FILE_WITH_BRACKET)); - cl_assert(status_flags == GIT_STATUS_WT_NEW); - - /* add the file to the index */ - - cl_git_pass(git_repository_index(&index, repo)); - cl_git_pass(git_index_add_bypath(index, FILE_WITH_BRACKET)); - cl_git_pass(git_index_write(index)); - - memset(&result, 0, sizeof(result)); - cl_git_pass(git_status_foreach(repo, cb_status__single, &result)); - cl_assert_equal_i(2, result.count); - cl_assert(result.status == GIT_STATUS_INDEX_NEW); - - cl_git_pass(git_status_file(&status_flags, repo, FILE_WITH_BRACKET)); - cl_assert(status_flags == GIT_STATUS_INDEX_NEW); - - /* Create file without bracket */ - - cl_git_mkfile("with_bracket/" FILE_WITHOUT_BRACKET, "I have no bracket in my name!\n"); - - cl_git_pass(git_status_file(&status_flags, repo, FILE_WITHOUT_BRACKET)); - cl_assert(status_flags == GIT_STATUS_WT_NEW); - - cl_git_pass(git_status_file(&status_flags, repo, "LICENSE\\[1\\].md")); - cl_assert(status_flags == GIT_STATUS_INDEX_NEW); - - cl_git_pass(git_status_file(&status_flags, repo, FILE_WITH_BRACKET)); - - git_index_free(index); - git_repository_free(repo); -} - -void test_status_worktree_init__space_in_filename(void) -{ - git_repository *repo; - git_index *index; - status_entry_single result; - unsigned int status_flags; - -#define FILE_WITH_SPACE "LICENSE - copy.md" - - cl_set_cleanup(&cleanup_new_repo, "with_space"); - cl_git_pass(git_repository_init(&repo, "with_space", 0)); - cl_git_mkfile("with_space/" FILE_WITH_SPACE, "I have a space in my name\n"); - - /* file is new to working directory */ - - memset(&result, 0, sizeof(result)); - cl_git_pass(git_status_foreach(repo, cb_status__single, &result)); - cl_assert_equal_i(1, result.count); - cl_assert(result.status == GIT_STATUS_WT_NEW); - - cl_git_pass(git_status_file(&status_flags, repo, FILE_WITH_SPACE)); - cl_assert(status_flags == GIT_STATUS_WT_NEW); - - /* ignore the file */ - - cl_git_rewritefile("with_space/.gitignore", "*.md\n.gitignore\n"); - - memset(&result, 0, sizeof(result)); - cl_git_pass(git_status_foreach(repo, cb_status__single, &result)); - cl_assert_equal_i(2, result.count); - cl_assert(result.status == GIT_STATUS_IGNORED); - - cl_git_pass(git_status_file(&status_flags, repo, FILE_WITH_SPACE)); - cl_assert(status_flags == GIT_STATUS_IGNORED); - - /* don't ignore the file */ - - cl_git_rewritefile("with_space/.gitignore", ".gitignore\n"); - - memset(&result, 0, sizeof(result)); - cl_git_pass(git_status_foreach(repo, cb_status__single, &result)); - cl_assert_equal_i(2, result.count); - cl_assert(result.status == GIT_STATUS_WT_NEW); - - cl_git_pass(git_status_file(&status_flags, repo, FILE_WITH_SPACE)); - cl_assert(status_flags == GIT_STATUS_WT_NEW); - - /* add the file to the index */ - - cl_git_pass(git_repository_index(&index, repo)); - cl_git_pass(git_index_add_bypath(index, FILE_WITH_SPACE)); - cl_git_pass(git_index_write(index)); - - memset(&result, 0, sizeof(result)); - cl_git_pass(git_status_foreach(repo, cb_status__single, &result)); - cl_assert_equal_i(2, result.count); - cl_assert(result.status == GIT_STATUS_INDEX_NEW); - - cl_git_pass(git_status_file(&status_flags, repo, FILE_WITH_SPACE)); - cl_assert(status_flags == GIT_STATUS_INDEX_NEW); - - git_index_free(index); - git_repository_free(repo); -} - -static int cb_status__expected_path(const char *p, unsigned int s, void *payload) -{ - const char *expected_path = (const char *)payload; - - GIT_UNUSED(s); - - if (payload == NULL) - cl_fail("Unexpected path"); - - cl_assert_equal_s(expected_path, p); - - return 0; -} - -void test_status_worktree_init__disable_pathspec_match(void) -{ - git_repository *repo; - git_status_options opts = GIT_STATUS_OPTIONS_INIT; - char *file_with_bracket = "LICENSE[1].md", - *imaginary_file_with_bracket = "LICENSE[1-2].md"; - - cl_set_cleanup(&cleanup_new_repo, "pathspec"); - cl_git_pass(git_repository_init(&repo, "pathspec", 0)); - cl_git_mkfile("pathspec/LICENSE[1].md", "screaming bracket\n"); - cl_git_mkfile("pathspec/LICENSE1.md", "no bracket\n"); - - opts.flags = GIT_STATUS_OPT_INCLUDE_UNTRACKED | - GIT_STATUS_OPT_DISABLE_PATHSPEC_MATCH; - opts.pathspec.count = 1; - opts.pathspec.strings = &file_with_bracket; - - cl_git_pass( - git_status_foreach_ext(repo, &opts, cb_status__expected_path, - file_with_bracket) - ); - - /* Test passing a pathspec matching files in the workdir. */ - /* Must not match because pathspecs are disabled. */ - opts.pathspec.strings = &imaginary_file_with_bracket; - cl_git_pass( - git_status_foreach_ext(repo, &opts, cb_status__expected_path, NULL) - ); - - git_repository_free(repo); -} - -void test_status_worktree_init__new_staged_file_must_handle_crlf(void) -{ - git_repository *repo; - git_index *index; - unsigned int status; - - cl_set_cleanup(&cleanup_new_repo, "getting_started"); - cl_git_pass(git_repository_init(&repo, "getting_started", 0)); - - /* Ensure that repo has core.autocrlf=true */ - cl_repo_set_bool(repo, "core.autocrlf", true); - - cl_git_mkfile("getting_started/testfile.txt", "content\r\n"); /* Content with CRLF */ - - cl_git_pass(git_repository_index(&index, repo)); - cl_git_pass(git_index_add_bypath(index, "testfile.txt")); - cl_git_pass(git_index_write(index)); - - cl_git_pass(git_status_file(&status, repo, "testfile.txt")); - cl_assert_equal_i(GIT_STATUS_INDEX_NEW, status); - - git_index_free(index); - git_repository_free(repo); -} - diff --git a/vendor/libgit2/tests/stress/diff.c b/vendor/libgit2/tests/stress/diff.c deleted file mode 100644 index a3ba4fab3c..0000000000 --- a/vendor/libgit2/tests/stress/diff.c +++ /dev/null @@ -1,146 +0,0 @@ -#include "clar_libgit2.h" -#include "../diff/diff_helpers.h" - -static git_repository *g_repo = NULL; - -void test_stress_diff__initialize(void) -{ -} - -void test_stress_diff__cleanup(void) -{ - cl_git_sandbox_cleanup(); -} - -#define ANOTHER_POEM \ -"OH, glorious are the guarded heights\nWhere guardian souls abide—\nSelf-exiled from our gross delights—\nAbove, beyond, outside:\nAn ampler arc their spirit swings—\nCommands a juster view—\nWe have their word for all these things,\nNo doubt their words are true.\n\nYet we, the bond slaves of our day,\nWhom dirt and danger press—\nCo-heirs of insolence, delay,\nAnd leagued unfaithfulness—\nSuch is our need must seek indeed\nAnd, having found, engage\nThe men who merely do the work\nFor which they draw the wage.\n\nFrom forge and farm and mine and bench,\nDeck, altar, outpost lone—\nMill, school, battalion, counter, trench,\nRail, senate, sheepfold, throne—\nCreation's cry goes up on high\nFrom age to cheated age:\n\"Send us the men who do the work\n\"For which they draw the wage!\"\n" - -static void test_with_many(int expected_new) -{ - git_index *index; - git_tree *tree, *new_tree; - git_diff *diff = NULL; - diff_expects exp; - git_diff_options diffopts = GIT_DIFF_OPTIONS_INIT; - git_diff_find_options opts = GIT_DIFF_FIND_OPTIONS_INIT; - - cl_git_pass(git_repository_index(&index, g_repo)); - cl_git_pass( - git_revparse_single((git_object **)&tree, g_repo, "HEAD^{tree}")); - - cl_git_pass(p_rename("renames/ikeepsix.txt", "renames/ikeepsix2.txt")); - cl_git_pass(git_index_remove_bypath(index, "ikeepsix.txt")); - cl_git_pass(git_index_add_bypath(index, "ikeepsix2.txt")); - cl_git_pass(git_index_write(index)); - - cl_git_pass(git_diff_tree_to_index(&diff, g_repo, tree, index, &diffopts)); - - memset(&exp, 0, sizeof(exp)); - cl_git_pass(git_diff_foreach( - diff, diff_file_cb, NULL, NULL, NULL, &exp)); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_DELETED]); - cl_assert_equal_i(expected_new + 1, exp.file_status[GIT_DELTA_ADDED]); - cl_assert_equal_i(expected_new + 2, exp.files); - - opts.flags = GIT_DIFF_FIND_ALL; - cl_git_pass(git_diff_find_similar(diff, &opts)); - - memset(&exp, 0, sizeof(exp)); - cl_git_pass(git_diff_foreach( - diff, diff_file_cb, NULL, NULL, NULL, &exp)); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_RENAMED]); - cl_assert_equal_i(expected_new, exp.file_status[GIT_DELTA_ADDED]); - cl_assert_equal_i(expected_new + 1, exp.files); - - git_diff_free(diff); - - cl_repo_commit_from_index(NULL, g_repo, NULL, 1372350000, "yoyoyo"); - cl_git_pass(git_revparse_single( - (git_object **)&new_tree, g_repo, "HEAD^{tree}")); - - cl_git_pass(git_diff_tree_to_tree( - &diff, g_repo, tree, new_tree, &diffopts)); - - memset(&exp, 0, sizeof(exp)); - cl_git_pass(git_diff_foreach( - diff, diff_file_cb, NULL, NULL, NULL, &exp)); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_DELETED]); - cl_assert_equal_i(expected_new + 1, exp.file_status[GIT_DELTA_ADDED]); - cl_assert_equal_i(expected_new + 2, exp.files); - - opts.flags = GIT_DIFF_FIND_ALL; - cl_git_pass(git_diff_find_similar(diff, &opts)); - - memset(&exp, 0, sizeof(exp)); - cl_git_pass(git_diff_foreach( - diff, diff_file_cb, NULL, NULL, NULL, &exp)); - cl_assert_equal_i(1, exp.file_status[GIT_DELTA_RENAMED]); - cl_assert_equal_i(expected_new, exp.file_status[GIT_DELTA_ADDED]); - cl_assert_equal_i(expected_new + 1, exp.files); - - git_diff_free(diff); - - git_tree_free(new_tree); - git_tree_free(tree); - git_index_free(index); -} - -void test_stress_diff__rename_big_files(void) -{ - git_index *index; - char tmp[64]; - int i, j; - git_buf b = GIT_BUF_INIT; - - g_repo = cl_git_sandbox_init("renames"); - - cl_git_pass(git_repository_index(&index, g_repo)); - - for (i = 0; i < 100; i += 1) { - p_snprintf(tmp, sizeof(tmp), "renames/newfile%03d", i); - for (j = i * 256; j > 0; --j) - git_buf_printf(&b, "more content %d\n", i); - cl_git_mkfile(tmp, b.ptr); - } - - for (i = 0; i < 100; i += 1) { - p_snprintf(tmp, sizeof(tmp), "renames/newfile%03d", i); - cl_git_pass(git_index_add_bypath(index, tmp + strlen("renames/"))); - } - - git_buf_free(&b); - git_index_free(index); - - test_with_many(100); -} - -void test_stress_diff__rename_many_files(void) -{ - git_index *index; - char tmp[64]; - int i; - git_buf b = GIT_BUF_INIT; - - g_repo = cl_git_sandbox_init("renames"); - - cl_git_pass(git_repository_index(&index, g_repo)); - - git_buf_printf(&b, "%08d\n" ANOTHER_POEM "%08d\n" ANOTHER_POEM ANOTHER_POEM, 0, 0); - - for (i = 0; i < 2500; i += 1) { - p_snprintf(tmp, sizeof(tmp), "renames/newfile%03d", i); - p_snprintf(b.ptr, 9, "%08d", i); - b.ptr[8] = '\n'; - cl_git_mkfile(tmp, b.ptr); - } - git_buf_free(&b); - - for (i = 0; i < 2500; i += 1) { - p_snprintf(tmp, sizeof(tmp), "renames/newfile%03d", i); - cl_git_pass(git_index_add_bypath(index, tmp + strlen("renames/"))); - } - - git_index_free(index); - - test_with_many(2500); -} diff --git a/vendor/libgit2/tests/submodule/add.c b/vendor/libgit2/tests/submodule/add.c deleted file mode 100644 index c3b3e63648..0000000000 --- a/vendor/libgit2/tests/submodule/add.c +++ /dev/null @@ -1,130 +0,0 @@ -#include "clar_libgit2.h" -#include "posix.h" -#include "path.h" -#include "submodule_helpers.h" -#include "config/config_helpers.h" -#include "fileops.h" -#include "repository.h" - -static git_repository *g_repo = NULL; - -void test_submodule_add__cleanup(void) -{ - cl_git_sandbox_cleanup(); -} - -static void assert_submodule_url(const char* name, const char *url) -{ - git_buf key = GIT_BUF_INIT; - - - cl_git_pass(git_buf_printf(&key, "submodule.%s.url", name)); - assert_config_entry_value(g_repo, git_buf_cstr(&key), url); - - git_buf_free(&key); -} - -void test_submodule_add__url_absolute(void) -{ - git_submodule *sm; - git_repository *repo; - git_buf dot_git_content = GIT_BUF_INIT; - - g_repo = setup_fixture_submod2(); - - /* re-add existing submodule */ - cl_git_fail_with( - GIT_EEXISTS, - git_submodule_add_setup(NULL, g_repo, "whatever", "sm_unchanged", 1)); - - /* add a submodule using a gitlink */ - - cl_git_pass( - git_submodule_add_setup(&sm, g_repo, "https://github.com/libgit2/libgit2.git", "sm_libgit2", 1) - ); - git_submodule_free(sm); - - cl_assert(git_path_isfile("submod2/" "sm_libgit2" "/.git")); - - cl_assert(git_path_isdir("submod2/.git/modules")); - cl_assert(git_path_isdir("submod2/.git/modules/" "sm_libgit2")); - cl_assert(git_path_isfile("submod2/.git/modules/" "sm_libgit2" "/HEAD")); - assert_submodule_url("sm_libgit2", "https://github.com/libgit2/libgit2.git"); - - cl_git_pass(git_repository_open(&repo, "submod2/" "sm_libgit2")); - - /* Verify worktree path is relative */ - assert_config_entry_value(repo, "core.worktree", "../../../sm_libgit2/"); - - /* Verify gitdir path is relative */ - cl_git_pass(git_futils_readbuffer(&dot_git_content, "submod2/" "sm_libgit2" "/.git")); - cl_assert_equal_s("gitdir: ../.git/modules/sm_libgit2/", dot_git_content.ptr); - - git_repository_free(repo); - git_buf_free(&dot_git_content); - - /* add a submodule not using a gitlink */ - - cl_git_pass( - git_submodule_add_setup(&sm, g_repo, "https://github.com/libgit2/libgit2.git", "sm_libgit2b", 0) - ); - git_submodule_free(sm); - - cl_assert(git_path_isdir("submod2/" "sm_libgit2b" "/.git")); - cl_assert(git_path_isfile("submod2/" "sm_libgit2b" "/.git/HEAD")); - cl_assert(!git_path_exists("submod2/.git/modules/" "sm_libgit2b")); - assert_submodule_url("sm_libgit2b", "https://github.com/libgit2/libgit2.git"); -} - -void test_submodule_add__url_relative(void) -{ - git_submodule *sm; - git_remote *remote; - git_strarray problems = {0}; - - /* default remote url is https://github.com/libgit2/false.git */ - g_repo = cl_git_sandbox_init("testrepo2"); - - /* make sure we don't default to origin - rename origin -> test_remote */ - cl_git_pass(git_remote_rename(&problems, g_repo, "origin", "test_remote")); - cl_assert_equal_i(0, problems.count); - git_strarray_free(&problems); - cl_git_fail(git_remote_lookup(&remote, g_repo, "origin")); - - cl_git_pass( - git_submodule_add_setup(&sm, g_repo, "../TestGitRepository", "TestGitRepository", 1) - ); - git_submodule_free(sm); - - assert_submodule_url("TestGitRepository", "https://github.com/libgit2/TestGitRepository"); -} - -void test_submodule_add__url_relative_to_origin(void) -{ - git_submodule *sm; - - /* default remote url is https://github.com/libgit2/false.git */ - g_repo = cl_git_sandbox_init("testrepo2"); - - cl_git_pass( - git_submodule_add_setup(&sm, g_repo, "../TestGitRepository", "TestGitRepository", 1) - ); - git_submodule_free(sm); - - assert_submodule_url("TestGitRepository", "https://github.com/libgit2/TestGitRepository"); -} - -void test_submodule_add__url_relative_to_workdir(void) -{ - git_submodule *sm; - - /* In this repo, HEAD (master) has no remote tracking branc h*/ - g_repo = cl_git_sandbox_init("testrepo"); - - cl_git_pass( - git_submodule_add_setup(&sm, g_repo, "./", "TestGitRepository", 1) - ); - git_submodule_free(sm); - - assert_submodule_url("TestGitRepository", git_repository_workdir(g_repo)); -} diff --git a/vendor/libgit2/tests/submodule/init.c b/vendor/libgit2/tests/submodule/init.c deleted file mode 100644 index 9e0cf57536..0000000000 --- a/vendor/libgit2/tests/submodule/init.c +++ /dev/null @@ -1,115 +0,0 @@ -#include "clar_libgit2.h" -#include "posix.h" -#include "path.h" -#include "submodule_helpers.h" -#include "fileops.h" - -static git_repository *g_repo = NULL; - -void test_submodule_init__cleanup(void) -{ - cl_git_sandbox_cleanup(); -} - -void test_submodule_init__absolute_url(void) -{ - git_submodule *sm; - git_config *cfg; - git_buf absolute_url = GIT_BUF_INIT; - const char *config_url; - - g_repo = setup_fixture_submodule_simple(); - - cl_assert(git_path_dirname_r(&absolute_url, git_repository_workdir(g_repo)) > 0); - cl_git_pass(git_buf_joinpath(&absolute_url, absolute_url.ptr, "testrepo.git")); - - /* write the absolute url to the .gitmodules file*/ - cl_git_pass(git_submodule_set_url(g_repo, "testrepo", absolute_url.ptr)); - - cl_git_pass(git_submodule_lookup(&sm, g_repo, "testrepo")); - - /* verify that the .gitmodules is set with an absolute path*/ - cl_assert_equal_s(absolute_url.ptr, git_submodule_url(sm)); - - /* init and verify that absolute path is written to .git/config */ - cl_git_pass(git_submodule_init(sm, false)); - - cl_git_pass(git_repository_config_snapshot(&cfg, g_repo)); - - cl_git_pass(git_config_get_string(&config_url, cfg, "submodule.testrepo.url")); - cl_assert_equal_s(absolute_url.ptr, config_url); - - git_buf_free(&absolute_url); - git_config_free(cfg); - git_submodule_free(sm); -} - -void test_submodule_init__relative_url(void) -{ - git_submodule *sm; - git_config *cfg; - git_buf absolute_url = GIT_BUF_INIT; - const char *config_url; - - g_repo = setup_fixture_submodule_simple(); - - cl_assert(git_path_dirname_r(&absolute_url, git_repository_workdir(g_repo)) > 0); - cl_git_pass(git_buf_joinpath(&absolute_url, absolute_url.ptr, "testrepo.git")); - - cl_git_pass(git_submodule_lookup(&sm, g_repo, "testrepo")); - - /* verify that the .gitmodules is set with an absolute path*/ - cl_assert_equal_s("../testrepo.git", git_submodule_url(sm)); - - /* init and verify that absolute path is written to .git/config */ - cl_git_pass(git_submodule_init(sm, false)); - - cl_git_pass(git_repository_config_snapshot(&cfg, g_repo)); - - cl_git_pass(git_config_get_string(&config_url, cfg, "submodule.testrepo.url")); - cl_assert_equal_s(absolute_url.ptr, config_url); - - git_buf_free(&absolute_url); - git_config_free(cfg); - git_submodule_free(sm); -} - -void test_submodule_init__relative_url_detached_head(void) -{ - git_submodule *sm; - git_config *cfg; - git_buf absolute_url = GIT_BUF_INIT; - const char *config_url; - git_reference *head_ref = NULL; - git_object *head_commit = NULL; - - g_repo = setup_fixture_submodule_simple(); - - /* Put the parent repository into a detached head state. */ - cl_git_pass(git_repository_head(&head_ref, g_repo)); - cl_git_pass(git_reference_peel(&head_commit, head_ref, GIT_OBJ_COMMIT)); - - cl_git_pass(git_repository_set_head_detached(g_repo, git_commit_id((git_commit *)head_commit))); - - cl_assert(git_path_dirname_r(&absolute_url, git_repository_workdir(g_repo)) > 0); - cl_git_pass(git_buf_joinpath(&absolute_url, absolute_url.ptr, "testrepo.git")); - - cl_git_pass(git_submodule_lookup(&sm, g_repo, "testrepo")); - - /* verify that the .gitmodules is set with an absolute path*/ - cl_assert_equal_s("../testrepo.git", git_submodule_url(sm)); - - /* init and verify that absolute path is written to .git/config */ - cl_git_pass(git_submodule_init(sm, false)); - - cl_git_pass(git_repository_config_snapshot(&cfg, g_repo)); - - cl_git_pass(git_config_get_string(&config_url, cfg, "submodule.testrepo.url")); - cl_assert_equal_s(absolute_url.ptr, config_url); - - git_buf_free(&absolute_url); - git_config_free(cfg); - git_object_free(head_commit); - git_reference_free(head_ref); - git_submodule_free(sm); -} diff --git a/vendor/libgit2/tests/submodule/lookup.c b/vendor/libgit2/tests/submodule/lookup.c deleted file mode 100644 index ecea694e51..0000000000 --- a/vendor/libgit2/tests/submodule/lookup.c +++ /dev/null @@ -1,335 +0,0 @@ -#include "clar_libgit2.h" -#include "submodule_helpers.h" -#include "git2/sys/repository.h" -#include "repository.h" -#include "fileops.h" - -static git_repository *g_repo = NULL; - -void test_submodule_lookup__initialize(void) -{ - g_repo = setup_fixture_submod2(); -} - -void test_submodule_lookup__simple_lookup(void) -{ - assert_submodule_exists(g_repo, "sm_unchanged"); - - /* lookup pending change in .gitmodules that is not in HEAD */ - assert_submodule_exists(g_repo, "sm_added_and_uncommited"); - - /* lookup pending change in .gitmodules that is not in HEAD nor index */ - assert_submodule_exists(g_repo, "sm_gitmodules_only"); - - /* lookup git repo subdir that is not added as submodule */ - refute_submodule_exists(g_repo, "not-submodule", GIT_EEXISTS); - - /* lookup existing directory that is not a submodule */ - refute_submodule_exists(g_repo, "just_a_dir", GIT_ENOTFOUND); - - /* lookup existing file that is not a submodule */ - refute_submodule_exists(g_repo, "just_a_file", GIT_ENOTFOUND); - - /* lookup non-existent item */ - refute_submodule_exists(g_repo, "no_such_file", GIT_ENOTFOUND); - - /* lookup a submodule by path with a trailing slash */ - assert_submodule_exists(g_repo, "sm_added_and_uncommited/"); -} - -void test_submodule_lookup__accessors(void) -{ - git_submodule *sm; - const char *oid = "480095882d281ed676fe5b863569520e54a7d5c0"; - - cl_git_pass(git_submodule_lookup(&sm, g_repo, "sm_unchanged")); - cl_assert(git_submodule_owner(sm) == g_repo); - cl_assert_equal_s("sm_unchanged", git_submodule_name(sm)); - cl_assert(git__suffixcmp(git_submodule_path(sm), "sm_unchanged") == 0); - cl_assert(git__suffixcmp(git_submodule_url(sm), "/submod2_target") == 0); - - cl_assert(git_oid_streq(git_submodule_index_id(sm), oid) == 0); - cl_assert(git_oid_streq(git_submodule_head_id(sm), oid) == 0); - cl_assert(git_oid_streq(git_submodule_wd_id(sm), oid) == 0); - - cl_assert(git_submodule_ignore(sm) == GIT_SUBMODULE_IGNORE_NONE); - cl_assert(git_submodule_update_strategy(sm) == GIT_SUBMODULE_UPDATE_CHECKOUT); - - git_submodule_free(sm); - - - cl_git_pass(git_submodule_lookup(&sm, g_repo, "sm_changed_head")); - cl_assert_equal_s("sm_changed_head", git_submodule_name(sm)); - - cl_assert(git_oid_streq(git_submodule_index_id(sm), oid) == 0); - cl_assert(git_oid_streq(git_submodule_head_id(sm), oid) == 0); - cl_assert(git_oid_streq(git_submodule_wd_id(sm), - "3d9386c507f6b093471a3e324085657a3c2b4247") == 0); - - git_submodule_free(sm); - - - cl_git_pass(git_submodule_lookup(&sm, g_repo, "sm_added_and_uncommited")); - cl_assert_equal_s("sm_added_and_uncommited", git_submodule_name(sm)); - - cl_assert(git_oid_streq(git_submodule_index_id(sm), oid) == 0); - cl_assert(git_submodule_head_id(sm) == NULL); - cl_assert(git_oid_streq(git_submodule_wd_id(sm), oid) == 0); - - git_submodule_free(sm); - - - cl_git_pass(git_submodule_lookup(&sm, g_repo, "sm_missing_commits")); - cl_assert_equal_s("sm_missing_commits", git_submodule_name(sm)); - - cl_assert(git_oid_streq(git_submodule_index_id(sm), oid) == 0); - cl_assert(git_oid_streq(git_submodule_head_id(sm), oid) == 0); - cl_assert(git_oid_streq(git_submodule_wd_id(sm), - "5e4963595a9774b90524d35a807169049de8ccad") == 0); - - git_submodule_free(sm); -} - -typedef struct { - int count; -} sm_lookup_data; - -static int sm_lookup_cb(git_submodule *sm, const char *name, void *payload) -{ - sm_lookup_data *data = payload; - data->count += 1; - cl_assert_equal_s(git_submodule_name(sm), name); - return 0; -} - -void test_submodule_lookup__foreach(void) -{ - git_config *cfg; - sm_lookup_data data; - - memset(&data, 0, sizeof(data)); - cl_git_pass(git_submodule_foreach(g_repo, sm_lookup_cb, &data)); - cl_assert_equal_i(8, data.count); - - memset(&data, 0, sizeof(data)); - - /* Change the path for a submodule so it doesn't match the name */ - cl_git_pass(git_config_open_ondisk(&cfg, "submod2/.gitmodules")); - - cl_git_pass(git_config_set_string(cfg, "submodule.smchangedindex.path", "sm_changed_index")); - cl_git_pass(git_config_set_string(cfg, "submodule.smchangedindex.url", "../submod2_target")); - cl_git_pass(git_config_delete_entry(cfg, "submodule.sm_changed_index.path")); - cl_git_pass(git_config_delete_entry(cfg, "submodule.sm_changed_index.url")); - - git_config_free(cfg); - - cl_git_pass(git_submodule_foreach(g_repo, sm_lookup_cb, &data)); - cl_assert_equal_i(8, data.count); -} - -void test_submodule_lookup__lookup_even_with_unborn_head(void) -{ - git_reference *head; - - /* put us on an unborn branch */ - cl_git_pass(git_reference_symbolic_create( - &head, g_repo, "HEAD", "refs/heads/garbage", 1, NULL)); - git_reference_free(head); - - test_submodule_lookup__simple_lookup(); /* baseline should still pass */ -} - -void test_submodule_lookup__lookup_even_with_missing_index(void) -{ - git_index *idx; - - /* give the repo an empty index */ - cl_git_pass(git_index_new(&idx)); - git_repository_set_index(g_repo, idx); - git_index_free(idx); - - test_submodule_lookup__simple_lookup(); /* baseline should still pass */ -} - -void test_submodule_lookup__backslashes(void) -{ - git_config *cfg; - git_submodule *sm; - git_repository *subrepo; - git_buf buf = GIT_BUF_INIT; - const char *backslashed_path = "..\\submod2_target"; - - cl_git_pass(git_config_open_ondisk(&cfg, "submod2/.gitmodules")); - cl_git_pass(git_config_set_string(cfg, "submodule.sm_unchanged.url", backslashed_path)); - git_config_free(cfg); - - cl_git_pass(git_submodule_lookup(&sm, g_repo, "sm_unchanged")); - cl_assert_equal_s(backslashed_path, git_submodule_url(sm)); - cl_git_pass(git_submodule_open(&subrepo, sm)); - - cl_git_pass(git_submodule_resolve_url(&buf, g_repo, backslashed_path)); - - git_buf_free(&buf); - git_submodule_free(sm); - git_repository_free(subrepo); -} - -static void baseline_tests(void) -{ - /* small baseline that should work even if we change the index or make - * commits from the index - */ - assert_submodule_exists(g_repo, "sm_unchanged"); - assert_submodule_exists(g_repo, "sm_gitmodules_only"); - refute_submodule_exists(g_repo, "not-submodule", GIT_EEXISTS); -} - -static void add_submodule_with_commit(const char *name) -{ - git_submodule *sm; - git_repository *smrepo; - git_index *idx; - git_buf p = GIT_BUF_INIT; - - cl_git_pass(git_submodule_add_setup(&sm, g_repo, - "https://github.com/libgit2/libgit2.git", name, 1)); - - assert_submodule_exists(g_repo, name); - - cl_git_pass(git_submodule_open(&smrepo, sm)); - cl_git_pass(git_repository_index(&idx, smrepo)); - - cl_git_pass(git_buf_joinpath(&p, git_repository_workdir(smrepo), "file")); - cl_git_mkfile(p.ptr, "new file"); - git_buf_free(&p); - - cl_git_pass(git_index_add_bypath(idx, "file")); - cl_git_pass(git_index_write(idx)); - git_index_free(idx); - - cl_repo_commit_from_index(NULL, smrepo, NULL, 0, "initial commit"); - git_repository_free(smrepo); - - cl_git_pass(git_submodule_add_finalize(sm)); - - git_submodule_free(sm); -} - -void test_submodule_lookup__just_added(void) -{ - git_submodule *sm; - git_buf snap1 = GIT_BUF_INIT, snap2 = GIT_BUF_INIT; - git_reference *original_head = NULL; - - refute_submodule_exists(g_repo, "sm_just_added", GIT_ENOTFOUND); - refute_submodule_exists(g_repo, "sm_just_added_2", GIT_ENOTFOUND); - refute_submodule_exists(g_repo, "sm_just_added_idx", GIT_ENOTFOUND); - refute_submodule_exists(g_repo, "sm_just_added_head", GIT_ENOTFOUND); - refute_submodule_exists(g_repo, "mismatch_name", GIT_ENOTFOUND); - refute_submodule_exists(g_repo, "mismatch_path", GIT_ENOTFOUND); - baseline_tests(); - - cl_git_pass(git_futils_readbuffer(&snap1, "submod2/.gitmodules")); - cl_git_pass(git_repository_head(&original_head, g_repo)); - - cl_git_pass(git_submodule_add_setup(&sm, g_repo, - "https://github.com/libgit2/libgit2.git", "sm_just_added", 1)); - git_submodule_free(sm); - assert_submodule_exists(g_repo, "sm_just_added"); - - cl_git_pass(git_submodule_add_setup(&sm, g_repo, - "https://github.com/libgit2/libgit2.git", "sm_just_added_2", 1)); - assert_submodule_exists(g_repo, "sm_just_added_2"); - cl_git_fail(git_submodule_add_finalize(sm)); /* fails if no HEAD */ - git_submodule_free(sm); - - add_submodule_with_commit("sm_just_added_head"); - cl_repo_commit_from_index(NULL, g_repo, NULL, 0, "commit new sm to head"); - assert_submodule_exists(g_repo, "sm_just_added_head"); - - add_submodule_with_commit("sm_just_added_idx"); - assert_submodule_exists(g_repo, "sm_just_added_idx"); - - cl_git_pass(git_futils_readbuffer(&snap2, "submod2/.gitmodules")); - - cl_git_append2file( - "submod2/.gitmodules", - "\n[submodule \"mismatch_name\"]\n" - "\tpath = mismatch_path\n" - "\turl = https://example.com/example.git\n\n"); - - assert_submodule_exists(g_repo, "mismatch_name"); - assert_submodule_exists(g_repo, "mismatch_path"); - assert_submodule_exists(g_repo, "sm_just_added"); - assert_submodule_exists(g_repo, "sm_just_added_2"); - assert_submodule_exists(g_repo, "sm_just_added_idx"); - assert_submodule_exists(g_repo, "sm_just_added_head"); - baseline_tests(); - - cl_git_rewritefile("submod2/.gitmodules", snap2.ptr); - git_buf_free(&snap2); - - refute_submodule_exists(g_repo, "mismatch_name", GIT_ENOTFOUND); - refute_submodule_exists(g_repo, "mismatch_path", GIT_ENOTFOUND); - assert_submodule_exists(g_repo, "sm_just_added"); - assert_submodule_exists(g_repo, "sm_just_added_2"); - assert_submodule_exists(g_repo, "sm_just_added_idx"); - assert_submodule_exists(g_repo, "sm_just_added_head"); - baseline_tests(); - - cl_git_rewritefile("submod2/.gitmodules", snap1.ptr); - git_buf_free(&snap1); - - refute_submodule_exists(g_repo, "mismatch_name", GIT_ENOTFOUND); - refute_submodule_exists(g_repo, "mismatch_path", GIT_ENOTFOUND); - /* note error code change, because add_setup made a repo in the workdir */ - refute_submodule_exists(g_repo, "sm_just_added", GIT_EEXISTS); - refute_submodule_exists(g_repo, "sm_just_added_2", GIT_EEXISTS); - /* these still exist in index and head respectively */ - assert_submodule_exists(g_repo, "sm_just_added_idx"); - assert_submodule_exists(g_repo, "sm_just_added_head"); - baseline_tests(); - - { - git_index *idx; - cl_git_pass(git_repository_index(&idx, g_repo)); - cl_git_pass(git_index_remove_bypath(idx, "sm_just_added_idx")); - cl_git_pass(git_index_remove_bypath(idx, "sm_just_added_head")); - cl_git_pass(git_index_write(idx)); - git_index_free(idx); - } - - refute_submodule_exists(g_repo, "sm_just_added_idx", GIT_EEXISTS); - assert_submodule_exists(g_repo, "sm_just_added_head"); - - { - cl_git_pass(git_reference_create(NULL, g_repo, "refs/heads/master", git_reference_target(original_head), 1, "move head back")); - git_reference_free(original_head); - } - - refute_submodule_exists(g_repo, "sm_just_added_head", GIT_EEXISTS); -} - -/* Test_App and Test_App2 are fairly similar names, make sure we load the right one */ -void test_submodule_lookup__prefix_name(void) -{ - git_submodule *sm; - - cl_git_rewritefile("submod2/.gitmodules", - "[submodule \"Test_App\"]\n" - " path = Test_App\n" - " url = ../Test_App\n" - "[submodule \"Test_App2\"]\n" - " path = Test_App2\n" - " url = ../Test_App\n"); - - cl_git_pass(git_submodule_lookup(&sm, g_repo, "Test_App")); - cl_assert_equal_s("Test_App", git_submodule_name(sm)); - - git_submodule_free(sm); - - cl_git_pass(git_submodule_lookup(&sm, g_repo, "Test_App2")); - cl_assert_equal_s("Test_App2", git_submodule_name(sm)); - - git_submodule_free(sm); -} diff --git a/vendor/libgit2/tests/submodule/modify.c b/vendor/libgit2/tests/submodule/modify.c deleted file mode 100644 index f7a089e726..0000000000 --- a/vendor/libgit2/tests/submodule/modify.c +++ /dev/null @@ -1,212 +0,0 @@ -#include "clar_libgit2.h" -#include "posix.h" -#include "path.h" -#include "submodule_helpers.h" -#include "config/config_helpers.h" - -static git_repository *g_repo = NULL; - -#define SM_LIBGIT2_URL "https://github.com/libgit2/libgit2.git" -#define SM_LIBGIT2_BRANCH "github-branch" -#define SM_LIBGIT2 "sm_libgit2" - -void test_submodule_modify__initialize(void) -{ - g_repo = setup_fixture_submod2(); -} - -static int delete_one_config(const git_config_entry *entry, void *payload) -{ - git_config *cfg = payload; - return git_config_delete_entry(cfg, entry->name); -} - -static int init_one_submodule( - git_submodule *sm, const char *name, void *payload) -{ - GIT_UNUSED(name); - GIT_UNUSED(payload); - return git_submodule_init(sm, false); -} - -void test_submodule_modify__init(void) -{ - git_config *cfg; - const char *str; - - /* erase submodule data from .git/config */ - cl_git_pass(git_repository_config(&cfg, g_repo)); - cl_git_pass( - git_config_foreach_match(cfg, "submodule\\..*", delete_one_config, cfg)); - git_config_free(cfg); - - /* confirm no submodule data in config */ - cl_git_pass(git_repository_config_snapshot(&cfg, g_repo)); - cl_git_fail_with(GIT_ENOTFOUND, git_config_get_string(&str, cfg, "submodule.sm_unchanged.url")); - cl_git_fail_with(GIT_ENOTFOUND, git_config_get_string(&str, cfg, "submodule.sm_changed_head.url")); - cl_git_fail_with(GIT_ENOTFOUND, git_config_get_string(&str, cfg, "submodule.sm_added_and_uncommited.url")); - git_config_free(cfg); - - /* call init and see that settings are copied */ - cl_git_pass(git_submodule_foreach(g_repo, init_one_submodule, NULL)); - - /* confirm submodule data in config */ - cl_git_pass(git_repository_config_snapshot(&cfg, g_repo)); - cl_git_pass(git_config_get_string(&str, cfg, "submodule.sm_unchanged.url")); - cl_assert(git__suffixcmp(str, "/submod2_target") == 0); - cl_git_pass(git_config_get_string(&str, cfg, "submodule.sm_changed_head.url")); - cl_assert(git__suffixcmp(str, "/submod2_target") == 0); - cl_git_pass(git_config_get_string(&str, cfg, "submodule.sm_added_and_uncommited.url")); - cl_assert(git__suffixcmp(str, "/submod2_target") == 0); - git_config_free(cfg); -} - -static int sync_one_submodule( - git_submodule *sm, const char *name, void *payload) -{ - GIT_UNUSED(name); - GIT_UNUSED(payload); - return git_submodule_sync(sm); -} - -static void assert_submodule_url_is_synced( - git_submodule *sm, const char *parent_key, const char *child_key) -{ - git_repository *smrepo; - - assert_config_entry_value(g_repo, parent_key, git_submodule_url(sm)); - - cl_git_pass(git_submodule_open(&smrepo, sm)); - assert_config_entry_value(smrepo, child_key, git_submodule_url(sm)); - git_repository_free(smrepo); -} - -void test_submodule_modify__sync(void) -{ - git_submodule *sm1, *sm2, *sm3; - git_config *cfg; - const char *str; - -#define SM1 "sm_unchanged" -#define SM2 "sm_changed_head" -#define SM3 "sm_added_and_uncommited" - - /* look up some submodules */ - cl_git_pass(git_submodule_lookup(&sm1, g_repo, SM1)); - cl_git_pass(git_submodule_lookup(&sm2, g_repo, SM2)); - cl_git_pass(git_submodule_lookup(&sm3, g_repo, SM3)); - - /* At this point, the .git/config URLs for the submodules have - * not be rewritten with the absolute paths (although the - * .gitmodules have. Let's confirm that they DO NOT match - * yet, then we can do a sync to make them match... - */ - - /* check submodule info does not match before sync */ - cl_git_pass(git_repository_config_snapshot(&cfg, g_repo)); - cl_git_pass(git_config_get_string(&str, cfg, "submodule."SM1".url")); - cl_assert(strcmp(git_submodule_url(sm1), str) != 0); - cl_git_pass(git_config_get_string(&str, cfg, "submodule."SM2".url")); - cl_assert(strcmp(git_submodule_url(sm2), str) != 0); - cl_git_pass(git_config_get_string(&str, cfg, "submodule."SM3".url")); - cl_assert(strcmp(git_submodule_url(sm3), str) != 0); - git_config_free(cfg); - - /* sync all the submodules */ - cl_git_pass(git_submodule_foreach(g_repo, sync_one_submodule, NULL)); - - /* check that submodule config is updated */ - assert_submodule_url_is_synced( - sm1, "submodule."SM1".url", "remote.origin.url"); - assert_submodule_url_is_synced( - sm2, "submodule."SM2".url", "remote.origin.url"); - assert_submodule_url_is_synced( - sm3, "submodule."SM3".url", "remote.origin.url"); - - git_submodule_free(sm1); - git_submodule_free(sm2); - git_submodule_free(sm3); -} - -void assert_ignore_change(git_submodule_ignore_t ignore) -{ - git_submodule *sm; - - cl_git_pass(git_submodule_set_ignore(g_repo, "sm_changed_head", ignore)); - - cl_git_pass(git_submodule_lookup(&sm, g_repo, "sm_changed_head")); - cl_assert_equal_i(ignore, git_submodule_ignore(sm)); - git_submodule_free(sm); -} - -void test_submodule_modify__set_ignore(void) -{ - assert_ignore_change(GIT_SUBMODULE_IGNORE_UNTRACKED); - assert_ignore_change(GIT_SUBMODULE_IGNORE_NONE); - assert_ignore_change(GIT_SUBMODULE_IGNORE_ALL); -} - -void assert_update_change(git_submodule_update_t update) -{ - git_submodule *sm; - - cl_git_pass(git_submodule_set_update(g_repo, "sm_changed_head", update)); - - cl_git_pass(git_submodule_lookup(&sm, g_repo, "sm_changed_head")); - cl_assert_equal_i(update, git_submodule_update_strategy(sm)); - git_submodule_free(sm); -} - -void test_submodule_modify__set_update(void) -{ - assert_update_change(GIT_SUBMODULE_UPDATE_REBASE); - assert_update_change(GIT_SUBMODULE_UPDATE_NONE); - assert_update_change(GIT_SUBMODULE_UPDATE_CHECKOUT); -} - -void assert_recurse_change(git_submodule_recurse_t recurse) -{ - git_submodule *sm; - - cl_git_pass(git_submodule_set_fetch_recurse_submodules(g_repo, "sm_changed_head", recurse)); - - cl_git_pass(git_submodule_lookup(&sm, g_repo, "sm_changed_head")); - cl_assert_equal_i(recurse, git_submodule_fetch_recurse_submodules(sm)); - git_submodule_free(sm); -} - -void test_submodule_modify__set_fetch_recurse_submodules(void) -{ - assert_recurse_change(GIT_SUBMODULE_RECURSE_YES); - assert_recurse_change(GIT_SUBMODULE_RECURSE_NO); - assert_recurse_change(GIT_SUBMODULE_RECURSE_ONDEMAND); -} - -void test_submodule_modify__set_branch(void) -{ - git_submodule *sm; - - cl_git_pass(git_submodule_lookup(&sm, g_repo, "sm_changed_head")); - cl_assert(git_submodule_branch(sm) == NULL); - git_submodule_free(sm); - - cl_git_pass(git_submodule_set_branch(g_repo, "sm_changed_head", SM_LIBGIT2_BRANCH)); - cl_git_pass(git_submodule_lookup(&sm, g_repo, "sm_changed_head")); - cl_assert_equal_s(SM_LIBGIT2_BRANCH, git_submodule_branch(sm)); - git_submodule_free(sm); - - cl_git_pass(git_submodule_set_branch(g_repo, "sm_changed_head", NULL)); - cl_git_pass(git_submodule_lookup(&sm, g_repo, "sm_changed_head")); - cl_assert(git_submodule_branch(sm) == NULL); - git_submodule_free(sm); -} - -void test_submodule_modify__set_url(void) -{ - git_submodule *sm; - - cl_git_pass(git_submodule_set_url(g_repo, "sm_changed_head", SM_LIBGIT2_URL)); - cl_git_pass(git_submodule_lookup(&sm, g_repo, "sm_changed_head")); - cl_assert_equal_s(SM_LIBGIT2_URL, git_submodule_url(sm)); - git_submodule_free(sm); -} diff --git a/vendor/libgit2/tests/submodule/nosubs.c b/vendor/libgit2/tests/submodule/nosubs.c deleted file mode 100644 index 8a73dc11a9..0000000000 --- a/vendor/libgit2/tests/submodule/nosubs.c +++ /dev/null @@ -1,130 +0,0 @@ -/* test the submodule APIs on repositories where there are no submodules */ - -#include "clar_libgit2.h" -#include "posix.h" -#include "fileops.h" - -void test_submodule_nosubs__cleanup(void) -{ - cl_git_sandbox_cleanup(); -} - -void test_submodule_nosubs__lookup(void) -{ - git_repository *repo = cl_git_sandbox_init("status"); - git_submodule *sm = NULL; - - p_mkdir("status/subrepo", 0777); - cl_git_mkfile("status/subrepo/.git", "gitdir: ../.git"); - - cl_assert_equal_i(GIT_ENOTFOUND, git_submodule_lookup(&sm, repo, "subdir")); - - cl_assert_equal_i(GIT_EEXISTS, git_submodule_lookup(&sm, repo, "subrepo")); - - cl_assert_equal_i(GIT_ENOTFOUND, git_submodule_lookup(&sm, repo, "subdir")); - - cl_assert_equal_i(GIT_EEXISTS, git_submodule_lookup(&sm, repo, "subrepo")); -} - -static int fake_submod_cb(git_submodule *sm, const char *n, void *p) -{ - GIT_UNUSED(sm); GIT_UNUSED(n); GIT_UNUSED(p); - return 0; -} - -void test_submodule_nosubs__foreach(void) -{ - git_repository *repo = cl_git_sandbox_init("status"); - cl_git_pass(git_submodule_foreach(repo, fake_submod_cb, NULL)); -} - -void test_submodule_nosubs__add(void) -{ - git_repository *repo = cl_git_sandbox_init("status"); - git_submodule *sm, *sm2; - - cl_git_pass(git_submodule_add_setup(&sm, repo, "https://github.com/libgit2/libgit2.git", "submodules/libgit2", 1)); - - cl_git_pass(git_submodule_lookup(&sm2, repo, "submodules/libgit2")); - git_submodule_free(sm2); - - cl_git_pass(git_submodule_foreach(repo, fake_submod_cb, NULL)); - - git_submodule_free(sm); -} - -void test_submodule_nosubs__bad_gitmodules(void) -{ - git_repository *repo = cl_git_sandbox_init("status"); - - cl_git_mkfile("status/.gitmodules", "[submodule \"foobar\"]\tpath=blargle\n\turl=\n\tbranch=\n\tupdate=flooble\n\n"); - - cl_git_rewritefile("status/.gitmodules", "[submodule \"foobar\"]\tpath=blargle\n\turl=\n\tbranch=\n\tupdate=rebase\n\n"); - - cl_git_pass(git_submodule_lookup(NULL, repo, "foobar")); - cl_assert_equal_i(GIT_ENOTFOUND, git_submodule_lookup(NULL, repo, "subdir")); -} - -void test_submodule_nosubs__add_and_delete(void) -{ - git_repository *repo = cl_git_sandbox_init("status"); - git_submodule *sm; - git_buf buf = GIT_BUF_INIT; - - cl_git_fail(git_submodule_lookup(NULL, repo, "libgit2")); - cl_git_fail(git_submodule_lookup(NULL, repo, "submodules/libgit2")); - - /* create */ - - cl_git_pass(git_submodule_add_setup( - &sm, repo, "https://github.com/libgit2/libgit2.git", "submodules/libgit2", 1)); - cl_assert_equal_s("submodules/libgit2", git_submodule_name(sm)); - cl_assert_equal_s("submodules/libgit2", git_submodule_path(sm)); - git_submodule_free(sm); - - cl_git_pass(git_futils_readbuffer(&buf, "status/.gitmodules")); - cl_assert(strstr(buf.ptr, "[submodule \"submodules/libgit2\"]") != NULL); - cl_assert(strstr(buf.ptr, "path = submodules/libgit2") != NULL); - git_buf_free(&buf); - - /* lookup */ - - cl_git_fail(git_submodule_lookup(&sm, repo, "libgit2")); - cl_git_pass(git_submodule_lookup(&sm, repo, "submodules/libgit2")); - cl_assert_equal_s("submodules/libgit2", git_submodule_name(sm)); - cl_assert_equal_s("submodules/libgit2", git_submodule_path(sm)); - git_submodule_free(sm); - - /* update name */ - - cl_git_rewritefile( - "status/.gitmodules", - "[submodule \"libgit2\"]\n" - " path = submodules/libgit2\n" - " url = https://github.com/libgit2/libgit2.git\n"); - - cl_git_pass(git_submodule_lookup(&sm, repo, "libgit2")); - cl_assert_equal_s("libgit2", git_submodule_name(sm)); - cl_assert_equal_s("submodules/libgit2", git_submodule_path(sm)); - git_submodule_free(sm); - cl_git_pass(git_submodule_lookup(&sm, repo, "submodules/libgit2")); - git_submodule_free(sm); - - /* revert name update */ - - cl_git_rewritefile( - "status/.gitmodules", - "[submodule \"submodules/libgit2\"]\n" - " path = submodules/libgit2\n" - " url = https://github.com/libgit2/libgit2.git\n"); - - cl_git_fail(git_submodule_lookup(&sm, repo, "libgit2")); - cl_git_pass(git_submodule_lookup(&sm, repo, "submodules/libgit2")); - git_submodule_free(sm); - - /* remove completely */ - - cl_must_pass(p_unlink("status/.gitmodules")); - cl_git_fail(git_submodule_lookup(&sm, repo, "libgit2")); - cl_git_fail(git_submodule_lookup(&sm, repo, "submodules/libgit2")); -} diff --git a/vendor/libgit2/tests/submodule/repository_init.c b/vendor/libgit2/tests/submodule/repository_init.c deleted file mode 100644 index 9be1e0b236..0000000000 --- a/vendor/libgit2/tests/submodule/repository_init.c +++ /dev/null @@ -1,38 +0,0 @@ -#include "clar_libgit2.h" -#include "posix.h" -#include "path.h" -#include "submodule_helpers.h" -#include "config/config_helpers.h" -#include "fileops.h" - -static git_repository *g_repo = NULL; - -void test_submodule_repository_init__basic(void) -{ - git_submodule *sm; - git_repository *repo; - git_buf dot_git_content = GIT_BUF_INIT; - - g_repo = setup_fixture_submod2(); - - cl_git_pass(git_submodule_lookup(&sm, g_repo, "sm_gitmodules_only")); - cl_git_pass(git_submodule_init(sm, 0)); - cl_git_pass(git_submodule_repo_init(&repo, sm, 1)); - - /* Verify worktree */ - assert_config_entry_value(repo, "core.worktree", "../../../sm_gitmodules_only/"); - - /* Verify gitlink */ - cl_git_pass(git_futils_readbuffer(&dot_git_content, "submod2/" "sm_gitmodules_only" "/.git")); - cl_assert_equal_s("gitdir: ../.git/modules/sm_gitmodules_only/", dot_git_content.ptr); - - cl_assert(git_path_isfile("submod2/" "sm_gitmodules_only" "/.git")); - - cl_assert(git_path_isdir("submod2/.git/modules")); - cl_assert(git_path_isdir("submod2/.git/modules/" "sm_gitmodules_only")); - cl_assert(git_path_isfile("submod2/.git/modules/" "sm_gitmodules_only" "/HEAD")); - - git_submodule_free(sm); - git_repository_free(repo); - git_buf_free(&dot_git_content); -} diff --git a/vendor/libgit2/tests/submodule/status.c b/vendor/libgit2/tests/submodule/status.c deleted file mode 100644 index 6721ee92a9..0000000000 --- a/vendor/libgit2/tests/submodule/status.c +++ /dev/null @@ -1,352 +0,0 @@ -#include "clar_libgit2.h" -#include "posix.h" -#include "path.h" -#include "submodule_helpers.h" -#include "fileops.h" -#include "iterator.h" - -static git_repository *g_repo = NULL; - -void test_submodule_status__initialize(void) -{ - g_repo = setup_fixture_submod2(); -} - -void test_submodule_status__cleanup(void) -{ -} - -void test_submodule_status__unchanged(void) -{ - unsigned int status = get_submodule_status(g_repo, "sm_unchanged"); - unsigned int expected = - GIT_SUBMODULE_STATUS_IN_HEAD | - GIT_SUBMODULE_STATUS_IN_INDEX | - GIT_SUBMODULE_STATUS_IN_CONFIG | - GIT_SUBMODULE_STATUS_IN_WD; - - cl_assert(GIT_SUBMODULE_STATUS_IS_UNMODIFIED(status)); - cl_assert(expected == status); -} - -static void rm_submodule(const char *name) -{ - git_buf path = GIT_BUF_INIT; - cl_git_pass(git_buf_joinpath(&path, git_repository_workdir(g_repo), name)); - cl_git_pass(git_futils_rmdir_r(path.ptr, NULL, GIT_RMDIR_REMOVE_FILES)); - git_buf_free(&path); -} - -static void add_submodule_to_index(const char *name) -{ - git_submodule *sm; - cl_git_pass(git_submodule_lookup(&sm, g_repo, name)); - cl_git_pass(git_submodule_add_to_index(sm, true)); - git_submodule_free(sm); -} - -static void rm_submodule_from_index(const char *name) -{ - git_index *index; - size_t pos; - - cl_git_pass(git_repository_index(&index, g_repo)); - cl_assert(!git_index_find(&pos, index, name)); - cl_git_pass(git_index_remove(index, name, 0)); - cl_git_pass(git_index_write(index)); - git_index_free(index); -} - -/* 4 values of GIT_SUBMODULE_IGNORE to check */ - -void test_submodule_status__ignore_none(void) -{ - unsigned int status; - - rm_submodule("sm_unchanged"); - - refute_submodule_exists(g_repo, "just_a_dir", GIT_ENOTFOUND); - refute_submodule_exists(g_repo, "not-submodule", GIT_EEXISTS); - refute_submodule_exists(g_repo, "not", GIT_EEXISTS); - - status = get_submodule_status(g_repo, "sm_changed_index"); - cl_assert((status & GIT_SUBMODULE_STATUS_WD_INDEX_MODIFIED) != 0); - - status = get_submodule_status(g_repo, "sm_changed_head"); - cl_assert((status & GIT_SUBMODULE_STATUS_WD_MODIFIED) != 0); - - status = get_submodule_status(g_repo, "sm_changed_file"); - cl_assert((status & GIT_SUBMODULE_STATUS_WD_WD_MODIFIED) != 0); - - status = get_submodule_status(g_repo, "sm_changed_untracked_file"); - cl_assert((status & GIT_SUBMODULE_STATUS_WD_UNTRACKED) != 0); - - status = get_submodule_status(g_repo, "sm_missing_commits"); - cl_assert((status & GIT_SUBMODULE_STATUS_WD_MODIFIED) != 0); - - status = get_submodule_status(g_repo, "sm_added_and_uncommited"); - cl_assert((status & GIT_SUBMODULE_STATUS_INDEX_ADDED) != 0); - - /* removed sm_unchanged for deleted workdir */ - status = get_submodule_status(g_repo, "sm_unchanged"); - cl_assert((status & GIT_SUBMODULE_STATUS_WD_DELETED) != 0); - - /* now mkdir sm_unchanged to test uninitialized */ - cl_git_pass(git_futils_mkdir("sm_unchanged", "submod2", 0755, 0)); - status = get_submodule_status(g_repo, "sm_unchanged"); - cl_assert((status & GIT_SUBMODULE_STATUS_WD_UNINITIALIZED) != 0); - - /* update sm_changed_head in index */ - add_submodule_to_index("sm_changed_head"); - status = get_submodule_status(g_repo, "sm_changed_head"); - cl_assert((status & GIT_SUBMODULE_STATUS_INDEX_MODIFIED) != 0); - - /* remove sm_changed_head from index */ - rm_submodule_from_index("sm_changed_head"); - status = get_submodule_status(g_repo, "sm_changed_head"); - cl_assert((status & GIT_SUBMODULE_STATUS_INDEX_DELETED) != 0); -} - -void test_submodule_status__ignore_untracked(void) -{ - unsigned int status; - git_submodule_ignore_t ign = GIT_SUBMODULE_IGNORE_UNTRACKED; - - rm_submodule("sm_unchanged"); - - refute_submodule_exists(g_repo, "just_a_dir", GIT_ENOTFOUND); - refute_submodule_exists(g_repo, "not-submodule", GIT_EEXISTS); - refute_submodule_exists(g_repo, "not", GIT_EEXISTS); - - cl_git_pass(git_submodule_status(&status, g_repo,"sm_changed_index", ign)); - cl_assert((status & GIT_SUBMODULE_STATUS_WD_INDEX_MODIFIED) != 0); - - cl_git_pass(git_submodule_status(&status, g_repo,"sm_changed_head", ign)); - cl_assert((status & GIT_SUBMODULE_STATUS_WD_MODIFIED) != 0); - - cl_git_pass(git_submodule_status(&status, g_repo,"sm_changed_file", ign)); - cl_assert((status & GIT_SUBMODULE_STATUS_WD_WD_MODIFIED) != 0); - - cl_git_pass(git_submodule_status(&status, g_repo,"sm_changed_untracked_file", ign)); - cl_assert(GIT_SUBMODULE_STATUS_IS_UNMODIFIED(status)); - - cl_git_pass(git_submodule_status(&status, g_repo,"sm_missing_commits", ign)); - cl_assert((status & GIT_SUBMODULE_STATUS_WD_MODIFIED) != 0); - - cl_git_pass(git_submodule_status(&status, g_repo,"sm_added_and_uncommited", ign)); - cl_assert((status & GIT_SUBMODULE_STATUS_INDEX_ADDED) != 0); - - /* removed sm_unchanged for deleted workdir */ - cl_git_pass(git_submodule_status(&status, g_repo,"sm_unchanged", ign)); - cl_assert((status & GIT_SUBMODULE_STATUS_WD_DELETED) != 0); - - /* now mkdir sm_unchanged to test uninitialized */ - cl_git_pass(git_futils_mkdir("sm_unchanged", "submod2", 0755, 0)); - cl_git_pass(git_submodule_status(&status, g_repo,"sm_unchanged", ign)); - cl_assert((status & GIT_SUBMODULE_STATUS_WD_UNINITIALIZED) != 0); - - /* update sm_changed_head in index */ - add_submodule_to_index("sm_changed_head"); - cl_git_pass(git_submodule_status(&status, g_repo,"sm_changed_head", ign)); - cl_assert((status & GIT_SUBMODULE_STATUS_INDEX_MODIFIED) != 0); -} - -void test_submodule_status__ignore_dirty(void) -{ - unsigned int status; - git_submodule_ignore_t ign = GIT_SUBMODULE_IGNORE_DIRTY; - - rm_submodule("sm_unchanged"); - - refute_submodule_exists(g_repo, "just_a_dir", GIT_ENOTFOUND); - refute_submodule_exists(g_repo, "not-submodule", GIT_EEXISTS); - refute_submodule_exists(g_repo, "not", GIT_EEXISTS); - - cl_git_pass(git_submodule_status(&status, g_repo,"sm_changed_index", ign)); - cl_assert(GIT_SUBMODULE_STATUS_IS_UNMODIFIED(status)); - - cl_git_pass(git_submodule_status(&status, g_repo,"sm_changed_head", ign)); - cl_assert((status & GIT_SUBMODULE_STATUS_WD_MODIFIED) != 0); - - cl_git_pass(git_submodule_status(&status, g_repo,"sm_changed_file", ign)); - cl_assert(GIT_SUBMODULE_STATUS_IS_UNMODIFIED(status)); - - cl_git_pass(git_submodule_status(&status, g_repo,"sm_changed_untracked_file", ign)); - cl_assert(GIT_SUBMODULE_STATUS_IS_UNMODIFIED(status)); - - cl_git_pass(git_submodule_status(&status, g_repo,"sm_missing_commits", ign)); - cl_assert((status & GIT_SUBMODULE_STATUS_WD_MODIFIED) != 0); - - cl_git_pass(git_submodule_status(&status, g_repo,"sm_added_and_uncommited", ign)); - cl_assert((status & GIT_SUBMODULE_STATUS_INDEX_ADDED) != 0); - - /* removed sm_unchanged for deleted workdir */ - cl_git_pass(git_submodule_status(&status, g_repo,"sm_unchanged", ign)); - cl_assert((status & GIT_SUBMODULE_STATUS_WD_DELETED) != 0); - - /* now mkdir sm_unchanged to test uninitialized */ - cl_git_pass(git_futils_mkdir("sm_unchanged", "submod2", 0755, 0)); - cl_git_pass(git_submodule_status(&status, g_repo,"sm_unchanged", ign)); - cl_assert((status & GIT_SUBMODULE_STATUS_WD_UNINITIALIZED) != 0); - - /* update sm_changed_head in index */ - add_submodule_to_index("sm_changed_head"); - cl_git_pass(git_submodule_status(&status, g_repo,"sm_changed_head", ign)); - cl_assert((status & GIT_SUBMODULE_STATUS_INDEX_MODIFIED) != 0); -} - -void test_submodule_status__ignore_all(void) -{ - unsigned int status; - git_submodule_ignore_t ign = GIT_SUBMODULE_IGNORE_ALL; - - rm_submodule("sm_unchanged"); - - refute_submodule_exists(g_repo, "just_a_dir", GIT_ENOTFOUND); - refute_submodule_exists(g_repo, "not-submodule", GIT_EEXISTS); - refute_submodule_exists(g_repo, "not", GIT_EEXISTS); - - cl_git_pass(git_submodule_status(&status, g_repo,"sm_changed_index", ign)); - cl_assert(GIT_SUBMODULE_STATUS_IS_UNMODIFIED(status)); - - cl_git_pass(git_submodule_status(&status, g_repo,"sm_changed_head", ign)); - cl_assert(GIT_SUBMODULE_STATUS_IS_UNMODIFIED(status)); - - cl_git_pass(git_submodule_status(&status, g_repo,"sm_changed_file", ign)); - cl_assert(GIT_SUBMODULE_STATUS_IS_UNMODIFIED(status)); - - cl_git_pass(git_submodule_status(&status, g_repo,"sm_changed_untracked_file", ign)); - cl_assert(GIT_SUBMODULE_STATUS_IS_UNMODIFIED(status)); - - cl_git_pass(git_submodule_status(&status, g_repo,"sm_missing_commits", ign)); - cl_assert(GIT_SUBMODULE_STATUS_IS_UNMODIFIED(status)); - - cl_git_pass(git_submodule_status(&status, g_repo,"sm_added_and_uncommited", ign)); - cl_assert(GIT_SUBMODULE_STATUS_IS_UNMODIFIED(status)); - - /* removed sm_unchanged for deleted workdir */ - cl_git_pass(git_submodule_status(&status, g_repo,"sm_unchanged", ign)); - cl_assert(GIT_SUBMODULE_STATUS_IS_UNMODIFIED(status)); - - /* now mkdir sm_unchanged to test uninitialized */ - cl_git_pass(git_futils_mkdir("sm_unchanged", "submod2", 0755, 0)); - cl_git_pass(git_submodule_status(&status, g_repo,"sm_unchanged", ign)); - cl_assert(GIT_SUBMODULE_STATUS_IS_UNMODIFIED(status)); - - /* update sm_changed_head in index */ - add_submodule_to_index("sm_changed_head"); - cl_git_pass(git_submodule_status(&status, g_repo,"sm_changed_head", ign)); - cl_assert(GIT_SUBMODULE_STATUS_IS_UNMODIFIED(status)); -} - -typedef struct { - size_t counter; - const char **paths; - int *statuses; -} submodule_expectations; - -static int confirm_submodule_status( - const char *path, unsigned int status_flags, void *payload) -{ - submodule_expectations *exp = payload; - - while (exp->statuses[exp->counter] < 0) - exp->counter++; - - cl_assert_equal_i(exp->statuses[exp->counter], (int)status_flags); - cl_assert_equal_s(exp->paths[exp->counter++], path); - - GIT_UNUSED(status_flags); - - return 0; -} - -void test_submodule_status__iterator(void) -{ - git_iterator *iter; - const git_index_entry *entry; - size_t i; - static const char *expected[] = { - ".gitmodules", - "just_a_dir/", - "just_a_dir/contents", - "just_a_file", - "not-submodule/", - "not-submodule/README.txt", - "not/", - "not/README.txt", - "README.txt", - "sm_added_and_uncommited", - "sm_changed_file", - "sm_changed_head", - "sm_changed_index", - "sm_changed_untracked_file", - "sm_missing_commits", - "sm_unchanged", - NULL - }; - static int expected_flags[] = { - GIT_STATUS_INDEX_MODIFIED | GIT_STATUS_WT_MODIFIED, /* ".gitmodules" */ - -1, /* "just_a_dir/" will be skipped */ - GIT_STATUS_CURRENT, /* "just_a_dir/contents" */ - GIT_STATUS_CURRENT, /* "just_a_file" */ - GIT_STATUS_WT_NEW, /* "not-submodule/" untracked item */ - -1, /* "not-submodule/README.txt" */ - GIT_STATUS_WT_NEW, /* "not/" untracked item */ - -1, /* "not/README.txt" */ - GIT_STATUS_CURRENT, /* "README.txt */ - GIT_STATUS_INDEX_NEW, /* "sm_added_and_uncommited" */ - GIT_STATUS_WT_MODIFIED, /* "sm_changed_file" */ - GIT_STATUS_WT_MODIFIED, /* "sm_changed_head" */ - GIT_STATUS_WT_MODIFIED, /* "sm_changed_index" */ - GIT_STATUS_WT_MODIFIED, /* "sm_changed_untracked_file" */ - GIT_STATUS_WT_MODIFIED, /* "sm_missing_commits" */ - GIT_STATUS_CURRENT, /* "sm_unchanged" */ - 0 - }; - submodule_expectations exp = { 0, expected, expected_flags }; - git_status_options opts = GIT_STATUS_OPTIONS_INIT; - git_index *index; - - cl_git_pass(git_repository_index(&index, g_repo)); - cl_git_pass(git_iterator_for_workdir(&iter, g_repo, index, NULL, - GIT_ITERATOR_IGNORE_CASE | GIT_ITERATOR_INCLUDE_TREES, NULL, NULL)); - - for (i = 0; !git_iterator_advance(&entry, iter); ++i) - cl_assert_equal_s(expected[i], entry->path); - - git_iterator_free(iter); - git_index_free(index); - - opts.flags = GIT_STATUS_OPT_INCLUDE_UNTRACKED | - GIT_STATUS_OPT_INCLUDE_UNMODIFIED | - GIT_STATUS_OPT_INCLUDE_IGNORED | - GIT_STATUS_OPT_RECURSE_UNTRACKED_DIRS | - GIT_STATUS_OPT_SORT_CASE_INSENSITIVELY; - - cl_git_pass(git_status_foreach_ext( - g_repo, &opts, confirm_submodule_status, &exp)); -} - -void test_submodule_status__untracked_dirs_containing_ignored_files(void) -{ - unsigned int status, expected; - - cl_git_append2file( - "submod2/.git/modules/sm_unchanged/info/exclude", "\n*.ignored\n"); - - cl_git_pass( - git_futils_mkdir("sm_unchanged/directory", "submod2", 0755, 0)); - cl_git_mkfile( - "submod2/sm_unchanged/directory/i_am.ignored", - "ignore this file, please\n"); - - status = get_submodule_status(g_repo, "sm_unchanged"); - cl_assert(GIT_SUBMODULE_STATUS_IS_UNMODIFIED(status)); - - expected = GIT_SUBMODULE_STATUS_IN_HEAD | - GIT_SUBMODULE_STATUS_IN_INDEX | - GIT_SUBMODULE_STATUS_IN_CONFIG | - GIT_SUBMODULE_STATUS_IN_WD; - cl_assert(status == expected); -} diff --git a/vendor/libgit2/tests/submodule/submodule_helpers.c b/vendor/libgit2/tests/submodule/submodule_helpers.c deleted file mode 100644 index 1dc6872310..0000000000 --- a/vendor/libgit2/tests/submodule/submodule_helpers.c +++ /dev/null @@ -1,189 +0,0 @@ -#include "clar_libgit2.h" -#include "buffer.h" -#include "path.h" -#include "util.h" -#include "posix.h" -#include "submodule_helpers.h" -#include "git2/sys/repository.h" - -/* rewrite gitmodules -> .gitmodules - * rewrite the empty or relative urls inside each module - * rename the .gitted directory inside any submodule to .git - */ -void rewrite_gitmodules(const char *workdir) -{ - git_buf in_f = GIT_BUF_INIT, out_f = GIT_BUF_INIT, path = GIT_BUF_INIT; - FILE *in, *out; - char line[256]; - - cl_git_pass(git_buf_joinpath(&in_f, workdir, "gitmodules")); - cl_git_pass(git_buf_joinpath(&out_f, workdir, ".gitmodules")); - - cl_assert((in = fopen(in_f.ptr, "rb")) != NULL); - cl_assert((out = fopen(out_f.ptr, "wb")) != NULL); - - while (fgets(line, sizeof(line), in) != NULL) { - char *scan = line; - - while (*scan == ' ' || *scan == '\t') scan++; - - /* rename .gitted -> .git in submodule directories */ - if (git__prefixcmp(scan, "path =") == 0) { - scan += strlen("path ="); - while (*scan == ' ') scan++; - - git_buf_joinpath(&path, workdir, scan); - git_buf_rtrim(&path); - git_buf_joinpath(&path, path.ptr, ".gitted"); - - if (!git_buf_oom(&path) && p_access(path.ptr, F_OK) == 0) { - git_buf_joinpath(&out_f, workdir, scan); - git_buf_rtrim(&out_f); - git_buf_joinpath(&out_f, out_f.ptr, ".git"); - - if (!git_buf_oom(&out_f)) - p_rename(path.ptr, out_f.ptr); - } - } - - /* copy non-"url =" lines verbatim */ - if (git__prefixcmp(scan, "url =") != 0) { - fputs(line, out); - continue; - } - - /* convert relative URLs in "url =" lines */ - scan += strlen("url ="); - while (*scan == ' ') scan++; - - if (*scan == '.') { - git_buf_joinpath(&path, workdir, scan); - git_buf_rtrim(&path); - } else if (!*scan || *scan == '\n') { - git_buf_joinpath(&path, workdir, "../testrepo.git"); - } else { - fputs(line, out); - continue; - } - - git_path_prettify(&path, path.ptr, NULL); - git_buf_putc(&path, '\n'); - cl_assert(!git_buf_oom(&path)); - - fwrite(line, scan - line, sizeof(char), out); - fputs(path.ptr, out); - } - - fclose(in); - fclose(out); - - cl_must_pass(p_unlink(in_f.ptr)); - - git_buf_free(&in_f); - git_buf_free(&out_f); - git_buf_free(&path); -} - -static void cleanup_fixture_submodules(void *payload) -{ - cl_git_sandbox_cleanup(); /* either "submodules" or "submod2" */ - - if (payload) - cl_fixture_cleanup(payload); -} - -git_repository *setup_fixture_submodules(void) -{ - git_repository *repo = cl_git_sandbox_init("submodules"); - - cl_fixture_sandbox("testrepo.git"); - - rewrite_gitmodules(git_repository_workdir(repo)); - p_rename("submodules/testrepo/.gitted", "submodules/testrepo/.git"); - - cl_set_cleanup(cleanup_fixture_submodules, "testrepo.git"); - - cl_git_pass(git_repository_reinit_filesystem(repo, 1)); - - return repo; -} - -git_repository *setup_fixture_submod2(void) -{ - git_repository *repo = cl_git_sandbox_init("submod2"); - - cl_fixture_sandbox("submod2_target"); - p_rename("submod2_target/.gitted", "submod2_target/.git"); - - rewrite_gitmodules(git_repository_workdir(repo)); - p_rename("submod2/not-submodule/.gitted", "submod2/not-submodule/.git"); - p_rename("submod2/not/.gitted", "submod2/not/.git"); - - cl_set_cleanup(cleanup_fixture_submodules, "submod2_target"); - - cl_git_pass(git_repository_reinit_filesystem(repo, 1)); - - return repo; -} - -git_repository *setup_fixture_submodule_simple(void) -{ - git_repository *repo = cl_git_sandbox_init("submodule_simple"); - - cl_fixture_sandbox("testrepo.git"); - p_mkdir("submodule_simple/testrepo", 0777); - - cl_set_cleanup(cleanup_fixture_submodules, "testrepo.git"); - - cl_git_pass(git_repository_reinit_filesystem(repo, 1)); - - return repo; -} - -void assert__submodule_exists( - git_repository *repo, const char *name, - const char *msg, const char *file, int line) -{ - git_submodule *sm; - int error = git_submodule_lookup(&sm, repo, name); - if (error) - cl_git_report_failure(error, file, line, msg); - cl_assert_at_line(sm != NULL, file, line); - git_submodule_free(sm); -} - -void refute__submodule_exists( - git_repository *repo, const char *name, int expected_error, - const char *msg, const char *file, int line) -{ - clar__assert_equal( - file, line, msg, 1, "%i", - expected_error, (int)(git_submodule_lookup(NULL, repo, name))); -} - -unsigned int get_submodule_status(git_repository *repo, const char *name) -{ - unsigned int status = 0; - - assert(repo && name); - - cl_git_pass(git_submodule_status(&status, repo, name, GIT_SUBMODULE_IGNORE_UNSPECIFIED)); - - return status; -} - -static int print_submodules(git_submodule *sm, const char *name, void *p) -{ - unsigned int loc = 0; - GIT_UNUSED(p); - git_submodule_location(&loc, sm); - fprintf(stderr, "# submodule %s (at %s) flags %x\n", - name, git_submodule_path(sm), loc); - return 0; -} - -void dump_submodules(git_repository *repo) -{ - git_submodule_foreach(repo, print_submodules, NULL); -} - diff --git a/vendor/libgit2/tests/submodule/submodule_helpers.h b/vendor/libgit2/tests/submodule/submodule_helpers.h deleted file mode 100644 index 1493f245fa..0000000000 --- a/vendor/libgit2/tests/submodule/submodule_helpers.h +++ /dev/null @@ -1,22 +0,0 @@ -extern void rewrite_gitmodules(const char *workdir); - -/* these will automatically set a cleanup callback */ -extern git_repository *setup_fixture_submodules(void); -extern git_repository *setup_fixture_submod2(void); -extern git_repository *setup_fixture_submodule_simple(void); - -extern unsigned int get_submodule_status(git_repository *, const char *); - -extern void assert__submodule_exists( - git_repository *, const char *, const char *, const char *, int); - -#define assert_submodule_exists(repo,name) \ - assert__submodule_exists(repo, name, "git_submodule_lookup(" #name ") failed", __FILE__, __LINE__) - -extern void refute__submodule_exists( - git_repository *, const char *, int err, const char *, const char *, int); - -#define refute_submodule_exists(repo,name,code) \ - refute__submodule_exists(repo, name, code, "expected git_submodule_lookup(" #name ") to fail with error " #code, __FILE__, __LINE__) - -extern void dump_submodules(git_repository *repo); diff --git a/vendor/libgit2/tests/submodule/update.c b/vendor/libgit2/tests/submodule/update.c deleted file mode 100644 index 40d24d0a78..0000000000 --- a/vendor/libgit2/tests/submodule/update.c +++ /dev/null @@ -1,392 +0,0 @@ -#include "clar_libgit2.h" -#include "posix.h" -#include "path.h" -#include "submodule_helpers.h" -#include "fileops.h" - -static git_repository *g_repo = NULL; - -void test_submodule_update__cleanup(void) -{ - cl_git_sandbox_cleanup(); -} - -void test_submodule_update__unitialized_submodule_no_init(void) -{ - git_submodule *sm; - git_submodule_update_options update_options = GIT_SUBMODULE_UPDATE_OPTIONS_INIT; - - g_repo = setup_fixture_submodule_simple(); - - /* get the submodule */ - cl_git_pass(git_submodule_lookup(&sm, g_repo, "testrepo")); - - /* updating an unitialized repository throws */ - cl_git_fail_with( - GIT_ERROR, - git_submodule_update(sm, 0, &update_options)); - - git_submodule_free(sm); -} - -struct update_submodule_cb_payload { - int update_tips_called; - int checkout_progress_called; - int checkout_notify_called; -}; - -static void checkout_progress_cb( - const char *path, - size_t completed_steps, - size_t total_steps, - void *payload) -{ - struct update_submodule_cb_payload *update_payload = payload; - - GIT_UNUSED(path); - GIT_UNUSED(completed_steps); - GIT_UNUSED(total_steps); - - update_payload->checkout_progress_called = 1; -} - -static int checkout_notify_cb( - git_checkout_notify_t why, - const char *path, - const git_diff_file *baseline, - const git_diff_file *target, - const git_diff_file *workdir, - void *payload) -{ - struct update_submodule_cb_payload *update_payload = payload; - - GIT_UNUSED(why); - GIT_UNUSED(path); - GIT_UNUSED(baseline); - GIT_UNUSED(target); - GIT_UNUSED(workdir); - - update_payload->checkout_notify_called = 1; - - return 0; -} - -static int update_tips(const char *refname, const git_oid *a, const git_oid *b, void *data) -{ - struct update_submodule_cb_payload *update_payload = data; - - GIT_UNUSED(refname); - GIT_UNUSED(a); - GIT_UNUSED(b); - - update_payload->update_tips_called = 1; - - return 1; -} - -void test_submodule_update__update_submodule(void) -{ - git_submodule *sm; - git_submodule_update_options update_options = GIT_SUBMODULE_UPDATE_OPTIONS_INIT; - unsigned int submodule_status = 0; - struct update_submodule_cb_payload update_payload = { 0 }; - - g_repo = setup_fixture_submodule_simple(); - - update_options.checkout_opts.progress_cb = checkout_progress_cb; - update_options.checkout_opts.progress_payload = &update_payload; - - update_options.fetch_opts.callbacks.update_tips = update_tips; - update_options.fetch_opts.callbacks.payload = &update_payload; - - /* get the submodule */ - cl_git_pass(git_submodule_lookup(&sm, g_repo, "testrepo")); - - /* verify the initial state of the submodule */ - cl_git_pass(git_submodule_status(&submodule_status, g_repo, "testrepo", GIT_SUBMODULE_IGNORE_UNSPECIFIED)); - cl_assert_equal_i(submodule_status, GIT_SUBMODULE_STATUS_IN_HEAD | - GIT_SUBMODULE_STATUS_IN_INDEX | - GIT_SUBMODULE_STATUS_IN_CONFIG | - GIT_SUBMODULE_STATUS_WD_UNINITIALIZED); - - /* initialize and update the submodule */ - cl_git_pass(git_submodule_init(sm, 0)); - cl_git_pass(git_submodule_update(sm, 0, &update_options)); - - /* verify state */ - cl_git_pass(git_submodule_status(&submodule_status, g_repo, "testrepo", GIT_SUBMODULE_IGNORE_UNSPECIFIED)); - cl_assert_equal_i(submodule_status, GIT_SUBMODULE_STATUS_IN_HEAD | - GIT_SUBMODULE_STATUS_IN_INDEX | - GIT_SUBMODULE_STATUS_IN_CONFIG | - GIT_SUBMODULE_STATUS_IN_WD); - - cl_assert(git_oid_streq(git_submodule_head_id(sm), "be3563ae3f795b2b4353bcce3a527ad0a4f7f644") == 0); - cl_assert(git_oid_streq(git_submodule_wd_id(sm), "be3563ae3f795b2b4353bcce3a527ad0a4f7f644") == 0); - cl_assert(git_oid_streq(git_submodule_index_id(sm), "be3563ae3f795b2b4353bcce3a527ad0a4f7f644") == 0); - - /* verify that the expected callbacks have been called. */ - cl_assert_equal_i(1, update_payload.checkout_progress_called); - cl_assert_equal_i(1, update_payload.update_tips_called); - - git_submodule_free(sm); -} - -void test_submodule_update__update_and_init_submodule(void) -{ - git_submodule *sm; - git_submodule_update_options update_options = GIT_SUBMODULE_UPDATE_OPTIONS_INIT; - unsigned int submodule_status = 0; - - g_repo = setup_fixture_submodule_simple(); - - /* get the submodule */ - cl_git_pass(git_submodule_lookup(&sm, g_repo, "testrepo")); - - cl_git_pass(git_submodule_status(&submodule_status, g_repo, "testrepo", GIT_SUBMODULE_IGNORE_UNSPECIFIED)); - cl_assert_equal_i(submodule_status, GIT_SUBMODULE_STATUS_IN_HEAD | - GIT_SUBMODULE_STATUS_IN_INDEX | - GIT_SUBMODULE_STATUS_IN_CONFIG | - GIT_SUBMODULE_STATUS_WD_UNINITIALIZED); - - /* update (with option to initialize sub repo) */ - cl_git_pass(git_submodule_update(sm, 1, &update_options)); - - /* verify expected state */ - cl_assert(git_oid_streq(git_submodule_head_id(sm), "be3563ae3f795b2b4353bcce3a527ad0a4f7f644") == 0); - cl_assert(git_oid_streq(git_submodule_wd_id(sm), "be3563ae3f795b2b4353bcce3a527ad0a4f7f644") == 0); - cl_assert(git_oid_streq(git_submodule_index_id(sm), "be3563ae3f795b2b4353bcce3a527ad0a4f7f644") == 0); - - git_submodule_free(sm); -} - -void test_submodule_update__update_already_checked_out_submodule(void) -{ - git_submodule *sm = NULL; - git_checkout_options checkout_options = GIT_CHECKOUT_OPTIONS_INIT; - git_submodule_update_options update_options = GIT_SUBMODULE_UPDATE_OPTIONS_INIT; - unsigned int submodule_status = 0; - git_reference *branch_reference = NULL; - git_object *branch_commit = NULL; - struct update_submodule_cb_payload update_payload = { 0 }; - - g_repo = setup_fixture_submodule_simple(); - - update_options.checkout_opts.progress_cb = checkout_progress_cb; - update_options.checkout_opts.progress_payload = &update_payload; - - /* Initialize and update the sub repository */ - cl_git_pass(git_submodule_lookup(&sm, g_repo, "testrepo")); - - cl_git_pass(git_submodule_status(&submodule_status, g_repo, "testrepo", GIT_SUBMODULE_IGNORE_UNSPECIFIED)); - cl_assert_equal_i(submodule_status, GIT_SUBMODULE_STATUS_IN_HEAD | - GIT_SUBMODULE_STATUS_IN_INDEX | - GIT_SUBMODULE_STATUS_IN_CONFIG | - GIT_SUBMODULE_STATUS_WD_UNINITIALIZED); - - cl_git_pass(git_submodule_update(sm, 1, &update_options)); - - /* verify expected state */ - cl_assert(git_oid_streq(git_submodule_head_id(sm), "be3563ae3f795b2b4353bcce3a527ad0a4f7f644") == 0); - cl_assert(git_oid_streq(git_submodule_wd_id(sm), "be3563ae3f795b2b4353bcce3a527ad0a4f7f644") == 0); - cl_assert(git_oid_streq(git_submodule_index_id(sm), "be3563ae3f795b2b4353bcce3a527ad0a4f7f644") == 0); - - /* checkout the alternate_1 branch */ - checkout_options.checkout_strategy = GIT_CHECKOUT_SAFE; - - cl_git_pass(git_reference_lookup(&branch_reference, g_repo, "refs/heads/alternate_1")); - cl_git_pass(git_reference_peel(&branch_commit, branch_reference, GIT_OBJ_COMMIT)); - cl_git_pass(git_checkout_tree(g_repo, branch_commit, &checkout_options)); - cl_git_pass(git_repository_set_head(g_repo, git_reference_name(branch_reference))); - - /* - * Verify state after checkout of parent repository. The submodule ID in the - * HEAD commit and index should be updated, but not the workdir. - */ - - cl_git_pass(git_submodule_status(&submodule_status, g_repo, "testrepo", GIT_SUBMODULE_IGNORE_UNSPECIFIED)); - - git_submodule_free(sm); - cl_git_pass(git_submodule_lookup(&sm, g_repo, "testrepo")); - - cl_assert_equal_i(submodule_status, GIT_SUBMODULE_STATUS_IN_HEAD | - GIT_SUBMODULE_STATUS_IN_INDEX | - GIT_SUBMODULE_STATUS_IN_CONFIG | - GIT_SUBMODULE_STATUS_IN_WD | - GIT_SUBMODULE_STATUS_WD_MODIFIED); - - cl_assert(git_oid_streq(git_submodule_head_id(sm), "a65fedf39aefe402d3bb6e24df4d4f5fe4547750") == 0); - cl_assert(git_oid_streq(git_submodule_wd_id(sm), "be3563ae3f795b2b4353bcce3a527ad0a4f7f644") == 0); - cl_assert(git_oid_streq(git_submodule_index_id(sm), "a65fedf39aefe402d3bb6e24df4d4f5fe4547750") == 0); - - /* - * Update the submodule and verify the state. - * Now, the HEAD, index, and Workdir commits should all be updated to - * the new commit. - */ - cl_git_pass(git_submodule_update(sm, 0, &update_options)); - cl_assert(git_oid_streq(git_submodule_head_id(sm), "a65fedf39aefe402d3bb6e24df4d4f5fe4547750") == 0); - cl_assert(git_oid_streq(git_submodule_wd_id(sm), "a65fedf39aefe402d3bb6e24df4d4f5fe4547750") == 0); - cl_assert(git_oid_streq(git_submodule_index_id(sm), "a65fedf39aefe402d3bb6e24df4d4f5fe4547750") == 0); - - /* verify that the expected callbacks have been called. */ - cl_assert_equal_i(1, update_payload.checkout_progress_called); - - git_submodule_free(sm); - git_object_free(branch_commit); - git_reference_free(branch_reference); -} - -void test_submodule_update__update_blocks_on_dirty_wd(void) -{ - git_submodule *sm = NULL; - git_checkout_options checkout_options = GIT_CHECKOUT_OPTIONS_INIT; - git_submodule_update_options update_options = GIT_SUBMODULE_UPDATE_OPTIONS_INIT; - unsigned int submodule_status = 0; - git_reference *branch_reference = NULL; - git_object *branch_commit = NULL; - struct update_submodule_cb_payload update_payload = { 0 }; - - g_repo = setup_fixture_submodule_simple(); - - update_options.checkout_opts.notify_flags = GIT_CHECKOUT_NOTIFY_CONFLICT; - update_options.checkout_opts.notify_cb = checkout_notify_cb; - update_options.checkout_opts.notify_payload = &update_payload; - - /* Initialize and update the sub repository */ - cl_git_pass(git_submodule_lookup(&sm, g_repo, "testrepo")); - - cl_git_pass(git_submodule_status(&submodule_status, g_repo, "testrepo", GIT_SUBMODULE_IGNORE_UNSPECIFIED)); - cl_assert_equal_i(submodule_status, GIT_SUBMODULE_STATUS_IN_HEAD | - GIT_SUBMODULE_STATUS_IN_INDEX | - GIT_SUBMODULE_STATUS_IN_CONFIG | - GIT_SUBMODULE_STATUS_WD_UNINITIALIZED); - - cl_git_pass(git_submodule_update(sm, 1, &update_options)); - - /* verify expected state */ - cl_assert(git_oid_streq(git_submodule_head_id(sm), "be3563ae3f795b2b4353bcce3a527ad0a4f7f644") == 0); - cl_assert(git_oid_streq(git_submodule_wd_id(sm), "be3563ae3f795b2b4353bcce3a527ad0a4f7f644") == 0); - cl_assert(git_oid_streq(git_submodule_index_id(sm), "be3563ae3f795b2b4353bcce3a527ad0a4f7f644") == 0); - - /* checkout the alternate_1 branch */ - checkout_options.checkout_strategy = GIT_CHECKOUT_SAFE; - - cl_git_pass(git_reference_lookup(&branch_reference, g_repo, "refs/heads/alternate_1")); - cl_git_pass(git_reference_peel(&branch_commit, branch_reference, GIT_OBJ_COMMIT)); - cl_git_pass(git_checkout_tree(g_repo, branch_commit, &checkout_options)); - cl_git_pass(git_repository_set_head(g_repo, git_reference_name(branch_reference))); - - /* - * Verify state after checkout of parent repository. The submodule ID in the - * HEAD commit and index should be updated, but not the workdir. - */ - - cl_git_pass(git_submodule_status(&submodule_status, g_repo, "testrepo", GIT_SUBMODULE_IGNORE_UNSPECIFIED)); - - git_submodule_free(sm); - cl_git_pass(git_submodule_lookup(&sm, g_repo, "testrepo")); - - cl_assert_equal_i(submodule_status, GIT_SUBMODULE_STATUS_IN_HEAD | - GIT_SUBMODULE_STATUS_IN_INDEX | - GIT_SUBMODULE_STATUS_IN_CONFIG | - GIT_SUBMODULE_STATUS_IN_WD | - GIT_SUBMODULE_STATUS_WD_MODIFIED); - - cl_assert(git_oid_streq(git_submodule_head_id(sm), "a65fedf39aefe402d3bb6e24df4d4f5fe4547750") == 0); - cl_assert(git_oid_streq(git_submodule_wd_id(sm), "be3563ae3f795b2b4353bcce3a527ad0a4f7f644") == 0); - cl_assert(git_oid_streq(git_submodule_index_id(sm), "a65fedf39aefe402d3bb6e24df4d4f5fe4547750") == 0); - - /* - * Create a conflicting edit in the subrepository to verify that - * the submodule update action is blocked. - */ - cl_git_write2file("submodule_simple/testrepo/branch_file.txt", "a conflicting edit", 0, - O_WRONLY | O_CREAT | O_TRUNC, 0755); - - cl_git_fail(git_submodule_update(sm, 0, &update_options)); - - /* verify that the expected callbacks have been called. */ - cl_assert_equal_i(1, update_payload.checkout_notify_called); - - /* verify that the submodule state has not changed. */ - cl_assert(git_oid_streq(git_submodule_head_id(sm), "a65fedf39aefe402d3bb6e24df4d4f5fe4547750") == 0); - cl_assert(git_oid_streq(git_submodule_wd_id(sm), "be3563ae3f795b2b4353bcce3a527ad0a4f7f644") == 0); - cl_assert(git_oid_streq(git_submodule_index_id(sm), "a65fedf39aefe402d3bb6e24df4d4f5fe4547750") == 0); - - git_submodule_free(sm); - git_object_free(branch_commit); - git_reference_free(branch_reference); -} - -void test_submodule_update__can_force_update(void) -{ - git_submodule *sm = NULL; - git_checkout_options checkout_options = GIT_CHECKOUT_OPTIONS_INIT; - git_submodule_update_options update_options = GIT_SUBMODULE_UPDATE_OPTIONS_INIT; - unsigned int submodule_status = 0; - git_reference *branch_reference = NULL; - git_object *branch_commit = NULL; - - g_repo = setup_fixture_submodule_simple(); - - /* Initialize and update the sub repository */ - cl_git_pass(git_submodule_lookup(&sm, g_repo, "testrepo")); - - cl_git_pass(git_submodule_status(&submodule_status, g_repo, "testrepo", GIT_SUBMODULE_IGNORE_UNSPECIFIED)); - cl_assert_equal_i(submodule_status, GIT_SUBMODULE_STATUS_IN_HEAD | - GIT_SUBMODULE_STATUS_IN_INDEX | - GIT_SUBMODULE_STATUS_IN_CONFIG | - GIT_SUBMODULE_STATUS_WD_UNINITIALIZED); - - cl_git_pass(git_submodule_update(sm, 1, &update_options)); - - /* verify expected state */ - cl_assert(git_oid_streq(git_submodule_head_id(sm), "be3563ae3f795b2b4353bcce3a527ad0a4f7f644") == 0); - cl_assert(git_oid_streq(git_submodule_wd_id(sm), "be3563ae3f795b2b4353bcce3a527ad0a4f7f644") == 0); - cl_assert(git_oid_streq(git_submodule_index_id(sm), "be3563ae3f795b2b4353bcce3a527ad0a4f7f644") == 0); - - /* checkout the alternate_1 branch */ - checkout_options.checkout_strategy = GIT_CHECKOUT_SAFE; - - cl_git_pass(git_reference_lookup(&branch_reference, g_repo, "refs/heads/alternate_1")); - cl_git_pass(git_reference_peel(&branch_commit, branch_reference, GIT_OBJ_COMMIT)); - cl_git_pass(git_checkout_tree(g_repo, branch_commit, &checkout_options)); - cl_git_pass(git_repository_set_head(g_repo, git_reference_name(branch_reference))); - - /* - * Verify state after checkout of parent repository. The submodule ID in the - * HEAD commit and index should be updated, but not the workdir. - */ - cl_git_pass(git_submodule_status(&submodule_status, g_repo, "testrepo", GIT_SUBMODULE_IGNORE_UNSPECIFIED)); - - git_submodule_free(sm); - cl_git_pass(git_submodule_lookup(&sm, g_repo, "testrepo")); - - cl_assert_equal_i(submodule_status, GIT_SUBMODULE_STATUS_IN_HEAD | - GIT_SUBMODULE_STATUS_IN_INDEX | - GIT_SUBMODULE_STATUS_IN_CONFIG | - GIT_SUBMODULE_STATUS_IN_WD | - GIT_SUBMODULE_STATUS_WD_MODIFIED); - - cl_assert(git_oid_streq(git_submodule_head_id(sm), "a65fedf39aefe402d3bb6e24df4d4f5fe4547750") == 0); - cl_assert(git_oid_streq(git_submodule_wd_id(sm), "be3563ae3f795b2b4353bcce3a527ad0a4f7f644") == 0); - cl_assert(git_oid_streq(git_submodule_index_id(sm), "a65fedf39aefe402d3bb6e24df4d4f5fe4547750") == 0); - - /* - * Create a conflicting edit in the subrepository to verify that - * the submodule update action is blocked. - */ - cl_git_write2file("submodule_simple/testrepo/branch_file.txt", "a conflicting edit", 0, - O_WRONLY | O_CREAT | O_TRUNC, 0777); - - /* forcefully checkout and verify the submodule state was updated. */ - update_options.checkout_opts.checkout_strategy = GIT_CHECKOUT_FORCE; - cl_git_pass(git_submodule_update(sm, 0, &update_options)); - cl_assert(git_oid_streq(git_submodule_head_id(sm), "a65fedf39aefe402d3bb6e24df4d4f5fe4547750") == 0); - cl_assert(git_oid_streq(git_submodule_wd_id(sm), "a65fedf39aefe402d3bb6e24df4d4f5fe4547750") == 0); - cl_assert(git_oid_streq(git_submodule_index_id(sm), "a65fedf39aefe402d3bb6e24df4d4f5fe4547750") == 0); - - git_submodule_free(sm); - git_object_free(branch_commit); - git_reference_free(branch_reference); -} diff --git a/vendor/libgit2/tests/threads/basic.c b/vendor/libgit2/tests/threads/basic.c deleted file mode 100644 index 9c342bc42c..0000000000 --- a/vendor/libgit2/tests/threads/basic.c +++ /dev/null @@ -1,50 +0,0 @@ -#include "clar_libgit2.h" - -#include "thread_helpers.h" -#include "cache.h" - - -static git_repository *g_repo; - -void test_threads_basic__initialize(void) -{ - g_repo = cl_git_sandbox_init("testrepo"); -} - -void test_threads_basic__cleanup(void) -{ - cl_git_sandbox_cleanup(); -} - - -void test_threads_basic__cache(void) -{ - // run several threads polling the cache at the same time - cl_assert(1 == 1); -} - -void test_threads_basic__multiple_init(void) -{ - git_repository *nested_repo; - - git_libgit2_init(); - cl_git_pass(git_repository_open(&nested_repo, cl_fixture("testrepo.git"))); - git_repository_free(nested_repo); - - git_libgit2_shutdown(); - cl_git_pass(git_repository_open(&nested_repo, cl_fixture("testrepo.git"))); - git_repository_free(nested_repo); -} - -static void *set_error(void *dummy) -{ - giterr_set(GITERR_INVALID, "oh no, something happened!\n"); - - return dummy; -} - -/* Set errors so we can check that we free it */ -void test_threads_basic__set_error(void) -{ - run_in_parallel(1, 4, set_error, NULL, NULL); -} diff --git a/vendor/libgit2/tests/threads/diff.c b/vendor/libgit2/tests/threads/diff.c deleted file mode 100644 index c328114691..0000000000 --- a/vendor/libgit2/tests/threads/diff.c +++ /dev/null @@ -1,196 +0,0 @@ -#include "clar_libgit2.h" -#include "thread_helpers.h" - -#ifdef GIT_THREADS - -# if defined(GIT_WIN32) -# define git_thread_yield() Sleep(0) -# elif defined(__FreeBSD__) || defined(__MidnightBSD__) || defined(__DragonFly__) -# define git_thread_yield() pthread_yield() -# else -# define git_thread_yield() sched_yield() -# endif - -#else -# define git_thread_yield() (void)0 -#endif - -static git_repository *_repo; -static git_tree *_a, *_b; -static git_atomic _counts[4]; -static int _check_counts; - -#define THREADS 20 - -void test_threads_diff__cleanup(void) -{ - cl_git_sandbox_cleanup(); -} - -static void setup_trees(void) -{ - git_index *idx; - - _repo = cl_git_sandbox_reopen(); /* reopen sandbox to flush caches */ - - /* avoid competing to load initial index */ - cl_git_pass(git_repository_index(&idx, _repo)); - git_index_free(idx); - - cl_git_pass(git_revparse_single( - (git_object **)&_a, _repo, "0017bd4ab1^{tree}")); - cl_git_pass(git_revparse_single( - (git_object **)&_b, _repo, "26a125ee1b^{tree}")); - - memset(_counts, 0, sizeof(_counts)); -} - -static void free_trees(void) -{ - git_tree_free(_a); _a = NULL; - git_tree_free(_b); _b = NULL; - - if (_check_counts) { - cl_assert_equal_i(288, git_atomic_get(&_counts[0])); - cl_assert_equal_i(112, git_atomic_get(&_counts[1])); - cl_assert_equal_i( 80, git_atomic_get(&_counts[2])); - cl_assert_equal_i( 96, git_atomic_get(&_counts[3])); - } -} - -static void *run_index_diffs(void *arg) -{ - int thread = *(int *)arg; - git_diff_options opts = GIT_DIFF_OPTIONS_INIT; - git_diff *diff = NULL; - size_t i; - int exp[4] = { 0, 0, 0, 0 }; - - switch (thread & 0x03) { - case 0: /* diff index to workdir */; - cl_git_pass(git_diff_index_to_workdir(&diff, _repo, NULL, &opts)); - break; - case 1: /* diff tree 'a' to index */; - cl_git_pass(git_diff_tree_to_index(&diff, _repo, _a, NULL, &opts)); - break; - case 2: /* diff tree 'b' to index */; - cl_git_pass(git_diff_tree_to_index(&diff, _repo, _b, NULL, &opts)); - break; - case 3: /* diff index to workdir (explicit index) */; - { - git_index *idx; - cl_git_pass(git_repository_index(&idx, _repo)); - cl_git_pass(git_diff_index_to_workdir(&diff, _repo, idx, &opts)); - git_index_free(idx); - break; - } - } - - /* keep some diff stats to make sure results are as expected */ - - i = git_diff_num_deltas(diff); - git_atomic_add(&_counts[0], (int32_t)i); - exp[0] = (int)i; - - while (i > 0) { - switch (git_diff_get_delta(diff, --i)->status) { - case GIT_DELTA_MODIFIED: exp[1]++; git_atomic_inc(&_counts[1]); break; - case GIT_DELTA_ADDED: exp[2]++; git_atomic_inc(&_counts[2]); break; - case GIT_DELTA_DELETED: exp[3]++; git_atomic_inc(&_counts[3]); break; - default: break; - } - } - - switch (thread & 0x03) { - case 0: case 3: - cl_assert_equal_i(8, exp[0]); cl_assert_equal_i(4, exp[1]); - cl_assert_equal_i(0, exp[2]); cl_assert_equal_i(4, exp[3]); - break; - case 1: - cl_assert_equal_i(12, exp[0]); cl_assert_equal_i(3, exp[1]); - cl_assert_equal_i(7, exp[2]); cl_assert_equal_i(2, exp[3]); - break; - case 2: - cl_assert_equal_i(8, exp[0]); cl_assert_equal_i(3, exp[1]); - cl_assert_equal_i(3, exp[2]); cl_assert_equal_i(2, exp[3]); - break; - } - - git_diff_free(diff); - giterr_clear(); - - return arg; -} - -void test_threads_diff__concurrent_diffs(void) -{ - _repo = cl_git_sandbox_init("status"); - _check_counts = 1; - - run_in_parallel( - 5, 32, run_index_diffs, setup_trees, free_trees); -} - -static void *run_index_diffs_with_modifier(void *arg) -{ - int thread = *(int *)arg; - git_diff_options opts = GIT_DIFF_OPTIONS_INIT; - git_diff *diff = NULL; - git_index *idx = NULL; - - cl_git_pass(git_repository_index(&idx, _repo)); - - /* have first thread altering the index as we go */ - if (thread == 0) { - int i; - - for (i = 0; i < 300; ++i) { - switch (i & 0x03) { - case 0: (void)git_index_add_bypath(idx, "new_file"); break; - case 1: (void)git_index_remove_bypath(idx, "modified_file"); break; - case 2: (void)git_index_remove_bypath(idx, "new_file"); break; - case 3: (void)git_index_add_bypath(idx, "modified_file"); break; - } - git_thread_yield(); - } - - goto done; - } - - /* only use explicit index in this test to prevent reloading */ - - switch (thread & 0x03) { - case 0: /* diff index to workdir */; - cl_git_pass(git_diff_index_to_workdir(&diff, _repo, idx, &opts)); - break; - case 1: /* diff tree 'a' to index */; - cl_git_pass(git_diff_tree_to_index(&diff, _repo, _a, idx, &opts)); - break; - case 2: /* diff tree 'b' to index */; - cl_git_pass(git_diff_tree_to_index(&diff, _repo, _b, idx, &opts)); - break; - case 3: /* diff index to workdir reversed */; - opts.flags |= GIT_DIFF_REVERSE; - cl_git_pass(git_diff_index_to_workdir(&diff, _repo, idx, &opts)); - break; - } - - /* results will be unpredictable with index modifier thread running */ - - git_diff_free(diff); - -done: - git_index_free(idx); - giterr_clear(); - - return arg; -} - -void test_threads_diff__with_concurrent_index_modified(void) -{ - _repo = cl_git_sandbox_init("status"); - _check_counts = 0; - - run_in_parallel( - 5, 16, run_index_diffs_with_modifier, setup_trees, free_trees); -} diff --git a/vendor/libgit2/tests/threads/iterator.c b/vendor/libgit2/tests/threads/iterator.c deleted file mode 100644 index 8a2d79c2e5..0000000000 --- a/vendor/libgit2/tests/threads/iterator.c +++ /dev/null @@ -1,49 +0,0 @@ -#include "clar_libgit2.h" -#include "thread_helpers.h" -#include "iterator.h" - -static git_repository *_repo; - -void test_threads_iterator__cleanup(void) -{ - cl_git_sandbox_cleanup(); -} - -static void *run_workdir_iterator(void *arg) -{ - int error = 0; - git_iterator *iter; - const git_index_entry *entry = NULL; - - cl_git_pass(git_iterator_for_workdir( - &iter, _repo, NULL, NULL, GIT_ITERATOR_DONT_AUTOEXPAND, NULL, NULL)); - - while (!error) { - if (entry && entry->mode == GIT_FILEMODE_TREE) { - error = git_iterator_advance_into(&entry, iter); - - if (error == GIT_ENOTFOUND) - error = git_iterator_advance(&entry, iter); - } else { - error = git_iterator_advance(&entry, iter); - } - - if (!error) - (void)git_iterator_current_is_ignored(iter); - } - - cl_assert_equal_i(GIT_ITEROVER, error); - - git_iterator_free(iter); - giterr_clear(); - return arg; -} - - -void test_threads_iterator__workdir(void) -{ - _repo = cl_git_sandbox_init("status"); - - run_in_parallel( - 1, 20, run_workdir_iterator, NULL, NULL); -} diff --git a/vendor/libgit2/tests/threads/refdb.c b/vendor/libgit2/tests/threads/refdb.c deleted file mode 100644 index 6589e3922c..0000000000 --- a/vendor/libgit2/tests/threads/refdb.c +++ /dev/null @@ -1,221 +0,0 @@ -#include "clar_libgit2.h" -#include "git2/refdb.h" -#include "refdb.h" - -static git_repository *g_repo; -static int g_expected = 0; - -void test_threads_refdb__initialize(void) -{ - g_repo = NULL; -} - -void test_threads_refdb__cleanup(void) -{ - cl_git_sandbox_cleanup(); - g_repo = NULL; -} - -#define REPEAT 20 -#define THREADS 20 - -static void *iterate_refs(void *arg) -{ - git_reference_iterator *i; - git_reference *ref; - int count = 0; - - cl_git_pass(git_reference_iterator_new(&i, g_repo)); - - for (count = 0; !git_reference_next(&ref, i); ++count) { - cl_assert(ref != NULL); - git_reference_free(ref); - } - - if (g_expected > 0) - cl_assert_equal_i(g_expected, count); - - git_reference_iterator_free(i); - - giterr_clear(); - return arg; -} - -void test_threads_refdb__iterator(void) -{ - int r, t; - git_thread th[THREADS]; - int id[THREADS]; - git_oid head; - git_reference *ref; - char name[128]; - git_refdb *refdb; - - g_repo = cl_git_sandbox_init("testrepo2"); - - cl_git_pass(git_reference_name_to_id(&head, g_repo, "HEAD")); - - /* make a bunch of references */ - - for (r = 0; r < 200; ++r) { - p_snprintf(name, sizeof(name), "refs/heads/direct-%03d", r); - cl_git_pass(git_reference_create(&ref, g_repo, name, &head, 0, NULL)); - git_reference_free(ref); - } - - cl_git_pass(git_repository_refdb(&refdb, g_repo)); - cl_git_pass(git_refdb_compress(refdb)); - git_refdb_free(refdb); - - g_expected = 206; - - for (r = 0; r < REPEAT; ++r) { - g_repo = cl_git_sandbox_reopen(); /* reopen to flush caches */ - - for (t = 0; t < THREADS; ++t) { - id[t] = t; -#ifdef GIT_THREADS - cl_git_pass(git_thread_create(&th[t], NULL, iterate_refs, &id[t])); -#else - th[t] = t; - iterate_refs(&id[t]); -#endif - } - -#ifdef GIT_THREADS - for (t = 0; t < THREADS; ++t) { - cl_git_pass(git_thread_join(&th[t], NULL)); - } -#endif - - memset(th, 0, sizeof(th)); - } -} - -static void *create_refs(void *arg) -{ - int *id = arg, i; - git_oid head; - char name[128]; - git_reference *ref[10]; - - cl_git_pass(git_reference_name_to_id(&head, g_repo, "HEAD")); - - for (i = 0; i < 10; ++i) { - p_snprintf(name, sizeof(name), "refs/heads/thread-%03d-%02d", *id, i); - cl_git_pass(git_reference_create(&ref[i], g_repo, name, &head, 0, NULL)); - - if (i == 5) { - git_refdb *refdb; - cl_git_pass(git_repository_refdb(&refdb, g_repo)); - cl_git_pass(git_refdb_compress(refdb)); - git_refdb_free(refdb); - } - } - - for (i = 0; i < 10; ++i) - git_reference_free(ref[i]); - - giterr_clear(); - return arg; -} - -static void *delete_refs(void *arg) -{ - int *id = arg, i; - git_reference *ref; - char name[128]; - - for (i = 0; i < 10; ++i) { - p_snprintf( - name, sizeof(name), "refs/heads/thread-%03d-%02d", (*id) & ~0x3, i); - - if (!git_reference_lookup(&ref, g_repo, name)) { - cl_git_pass(git_reference_delete(ref)); - git_reference_free(ref); - } - - if (i == 5) { - git_refdb *refdb; - cl_git_pass(git_repository_refdb(&refdb, g_repo)); - cl_git_pass(git_refdb_compress(refdb)); - git_refdb_free(refdb); - } - } - - giterr_clear(); - return arg; -} - -void test_threads_refdb__edit_while_iterate(void) -{ - int r, t; - int id[THREADS]; - git_oid head; - git_reference *ref; - char name[128]; - git_refdb *refdb; - -#ifdef GIT_THREADS - git_thread th[THREADS]; -#endif - - g_repo = cl_git_sandbox_init("testrepo2"); - - cl_git_pass(git_reference_name_to_id(&head, g_repo, "HEAD")); - - /* make a bunch of references */ - - for (r = 0; r < 50; ++r) { - p_snprintf(name, sizeof(name), "refs/heads/starter-%03d", r); - cl_git_pass(git_reference_create(&ref, g_repo, name, &head, 0, NULL)); - git_reference_free(ref); - } - - cl_git_pass(git_repository_refdb(&refdb, g_repo)); - cl_git_pass(git_refdb_compress(refdb)); - git_refdb_free(refdb); - - g_expected = -1; - - g_repo = cl_git_sandbox_reopen(); /* reopen to flush caches */ - - for (t = 0; t < THREADS; ++t) { - void *(*fn)(void *arg); - - switch (t & 0x3) { - case 0: fn = create_refs; break; - case 1: fn = delete_refs; break; - default: fn = iterate_refs; break; - } - - id[t] = t; - - /* It appears with all reflog writing changes, etc., that this - * test has started to fail quite frequently, so let's disable it - * for now by just running on a single thread... - */ -/* #ifdef GIT_THREADS */ -/* cl_git_pass(git_thread_create(&th[t], NULL, fn, &id[t])); */ -/* #else */ - fn(&id[t]); -/* #endif */ - } - -#ifdef GIT_THREADS -/* for (t = 0; t < THREADS; ++t) { */ -/* cl_git_pass(git_thread_join(th[t], NULL)); */ -/* } */ - - memset(th, 0, sizeof(th)); - - for (t = 0; t < THREADS; ++t) { - id[t] = t; - cl_git_pass(git_thread_create(&th[t], NULL, iterate_refs, &id[t])); - } - - for (t = 0; t < THREADS; ++t) { - cl_git_pass(git_thread_join(&th[t], NULL)); - } -#endif -} diff --git a/vendor/libgit2/tests/threads/thread_helpers.c b/vendor/libgit2/tests/threads/thread_helpers.c deleted file mode 100644 index 760a7bd33b..0000000000 --- a/vendor/libgit2/tests/threads/thread_helpers.c +++ /dev/null @@ -1,44 +0,0 @@ -#include "clar_libgit2.h" -#include "thread_helpers.h" - -void run_in_parallel( - int repeats, - int threads, - void *(*func)(void *), - void (*before_test)(void), - void (*after_test)(void)) -{ - int r, t, *id = git__calloc(threads, sizeof(int)); -#ifdef GIT_THREADS - git_thread *th = git__calloc(threads, sizeof(git_thread)); - cl_assert(th != NULL); -#else - void *th = NULL; -#endif - - cl_assert(id != NULL); - - for (r = 0; r < repeats; ++r) { - if (before_test) before_test(); - - for (t = 0; t < threads; ++t) { - id[t] = t; -#ifdef GIT_THREADS - cl_git_pass(git_thread_create(&th[t], NULL, func, &id[t])); -#else - cl_assert(func(&id[t]) == &id[t]); -#endif - } - -#ifdef GIT_THREADS - for (t = 0; t < threads; ++t) - cl_git_pass(git_thread_join(&th[t], NULL)); - memset(th, 0, threads * sizeof(git_thread)); -#endif - - if (after_test) after_test(); - } - - git__free(id); - git__free(th); -} diff --git a/vendor/libgit2/tests/threads/thread_helpers.h b/vendor/libgit2/tests/threads/thread_helpers.h deleted file mode 100644 index 3c13cfb6bb..0000000000 --- a/vendor/libgit2/tests/threads/thread_helpers.h +++ /dev/null @@ -1,8 +0,0 @@ -#include "thread-utils.h" - -void run_in_parallel( - int repeats, - int threads, - void *(*func)(void *), - void (*before_test)(void), - void (*after_test)(void)); diff --git a/vendor/libgit2/tests/trace/trace.c b/vendor/libgit2/tests/trace/trace.c deleted file mode 100644 index 097208bffd..0000000000 --- a/vendor/libgit2/tests/trace/trace.c +++ /dev/null @@ -1,106 +0,0 @@ -#include "clar_libgit2.h" -#include "clar_libgit2_trace.h" -#include "trace.h" - -static int written = 0; - -static void trace_callback(git_trace_level_t level, const char *message) -{ - GIT_UNUSED(level); - - cl_assert(strcmp(message, "Hello world!") == 0); - - written = 1; -} - -void test_trace_trace__initialize(void) -{ - /* If global tracing is enabled, disable for the duration of this test. */ - cl_global_trace_disable(); - - git_trace_set(GIT_TRACE_INFO, trace_callback); - written = 0; -} - -void test_trace_trace__cleanup(void) -{ - git_trace_set(GIT_TRACE_NONE, NULL); - - /* If global tracing was enabled, restart it. */ - cl_global_trace_register(); -} - -void test_trace_trace__sets(void) -{ -#ifdef GIT_TRACE - cl_assert(git_trace_level() == GIT_TRACE_INFO); -#else - cl_skip(); -#endif -} - -void test_trace_trace__can_reset(void) -{ -#ifdef GIT_TRACE - cl_assert(git_trace_level() == GIT_TRACE_INFO); - cl_git_pass(git_trace_set(GIT_TRACE_ERROR, trace_callback)); - - cl_assert(written == 0); - git_trace(GIT_TRACE_INFO, "Hello %s!", "world"); - cl_assert(written == 0); - - git_trace(GIT_TRACE_ERROR, "Hello %s!", "world"); - cl_assert(written == 1); -#else - cl_skip(); -#endif -} - -void test_trace_trace__can_unset(void) -{ -#ifdef GIT_TRACE - cl_assert(git_trace_level() == GIT_TRACE_INFO); - cl_git_pass(git_trace_set(GIT_TRACE_NONE, NULL)); - - cl_assert(git_trace_level() == GIT_TRACE_NONE); - - cl_assert(written == 0); - git_trace(GIT_TRACE_FATAL, "Hello %s!", "world"); - cl_assert(written == 0); -#else - cl_skip(); -#endif -} - -void test_trace_trace__skips_higher_level(void) -{ -#ifdef GIT_TRACE - cl_assert(written == 0); - git_trace(GIT_TRACE_DEBUG, "Hello %s!", "world"); - cl_assert(written == 0); -#else - cl_skip(); -#endif -} - -void test_trace_trace__writes(void) -{ -#ifdef GIT_TRACE - cl_assert(written == 0); - git_trace(GIT_TRACE_INFO, "Hello %s!", "world"); - cl_assert(written == 1); -#else - cl_skip(); -#endif -} - -void test_trace_trace__writes_lower_level(void) -{ -#ifdef GIT_TRACE - cl_assert(written == 0); - git_trace(GIT_TRACE_ERROR, "Hello %s!", "world"); - cl_assert(written == 1); -#else - cl_skip(); -#endif -} diff --git a/vendor/libgit2/tests/transport/register.c b/vendor/libgit2/tests/transport/register.c deleted file mode 100644 index ea917d5d30..0000000000 --- a/vendor/libgit2/tests/transport/register.c +++ /dev/null @@ -1,68 +0,0 @@ -#include "clar_libgit2.h" -#include "git2/sys/transport.h" - -static git_transport _transport = GIT_TRANSPORT_INIT; - -static int dummy_transport(git_transport **transport, git_remote *owner, void *param) -{ - *transport = &_transport; - GIT_UNUSED(owner); - GIT_UNUSED(param); - return 0; -} - -void test_transport_register__custom_transport(void) -{ - git_transport *transport; - - cl_git_pass(git_transport_register("something", dummy_transport, NULL)); - - cl_git_pass(git_transport_new(&transport, NULL, "something://somepath")); - - cl_assert(transport == &_transport); - - cl_git_pass(git_transport_unregister("something")); -} - -void test_transport_register__custom_transport_error_doubleregister(void) -{ - cl_git_pass(git_transport_register("something", dummy_transport, NULL)); - - cl_git_fail_with(git_transport_register("something", dummy_transport, NULL), GIT_EEXISTS); - - cl_git_pass(git_transport_unregister("something")); -} - -void test_transport_register__custom_transport_error_remove_non_existing(void) -{ - cl_git_fail_with(git_transport_unregister("something"), GIT_ENOTFOUND); -} - -void test_transport_register__custom_transport_ssh(void) -{ - git_transport *transport; - -#ifndef GIT_SSH - cl_git_fail_with(git_transport_new(&transport, NULL, "ssh://somehost:somepath"), -1); - cl_git_fail_with(git_transport_new(&transport, NULL, "git@somehost:somepath"), -1); -#else - cl_git_pass(git_transport_new(&transport, NULL, "git@somehost:somepath")); - transport->free(transport); -#endif - - cl_git_pass(git_transport_register("ssh", dummy_transport, NULL)); - - cl_git_pass(git_transport_new(&transport, NULL, "git@somehost:somepath")); - - cl_assert(transport == &_transport); - - cl_git_pass(git_transport_unregister("ssh")); - -#ifndef GIT_SSH - cl_git_fail_with(git_transport_new(&transport, NULL, "ssh://somehost:somepath"), -1); - cl_git_fail_with(git_transport_new(&transport, NULL, "git@somehost:somepath"), -1); -#else - cl_git_pass(git_transport_new(&transport, NULL, "git@somehost:somepath")); - transport->free(transport); -#endif -} diff --git a/vendor/libgit2/tests/valgrind-supp-mac.txt b/vendor/libgit2/tests/valgrind-supp-mac.txt deleted file mode 100644 index 0cdc975fae..0000000000 --- a/vendor/libgit2/tests/valgrind-supp-mac.txt +++ /dev/null @@ -1,176 +0,0 @@ -{ - libgit2-giterr-set-buffer - Memcheck:Leak - ... - fun:git__realloc - fun:git_buf_try_grow - fun:git_buf_grow - fun:git_buf_vprintf - fun:giterr_set -} -{ - mac-setenv-leak-1 - Memcheck:Leak - fun:malloc_zone_malloc - fun:__setenv - fun:setenv -} -{ - mac-setenv-leak-2 - Memcheck:Leak - fun:malloc_zone_malloc - fun:malloc_set_zone_name - ... - fun:init__zone0 - fun:setenv -} -{ - mac-dyld-initializer-leak - Memcheck:Leak - fun:malloc - ... - fun:dyld_register_image_state_change_handler - fun:_dyld_initializer -} -{ - mac-tz-leak-1 - Memcheck:Leak - ... - fun:token_table_add - fun:notify_register_check - fun:notify_register_tz -} -{ - mac-tz-leak-2 - Memcheck:Leak - fun:malloc - fun:tzload -} -{ - mac-tz-leak-3 - Memcheck:Leak - fun:malloc - fun:tzsetwall_basic -} -{ - mac-tz-leak-4 - Memcheck:Leak - fun:malloc - fun:gmtsub -} -{ - mac-system-init-leak-1 - Memcheck:Leak - ... - fun:_libxpc_initializer - fun:libSystem_initializer -} -{ - mac-system-init-leak-2 - Memcheck:Leak - ... - fun:__keymgr_initializer - fun:libSystem_initializer -} -{ - mac-puts-leak - Memcheck:Leak - fun:malloc - fun:__smakebuf - ... - fun:puts -} -{ - mac-ssl-uninitialized-1 - Memcheck:Cond - obj:/usr/lib/libcrypto.0.9.8.dylib - ... - fun:ssl23_connect -} -{ - mac-ssl-uninitialized-2 - Memcheck:Cond - ... - obj:/usr/lib/libssl.0.9.8.dylib - ... - fun:ssl23_connect -} -{ - mac-ssl-uninitialized-3 - Memcheck:Value8 - obj:/usr/lib/libcrypto.0.9.8.dylib - ... - fun:ssl23_connect -} -{ - mac-ssl-leak-1 - Memcheck:Leak - ... - fun:ERR_load_strings -} -{ - mac-ssl-leak-2 - Memcheck:Leak - ... - fun:SSL_library_init -} -{ - mac-ssl-leak-3 - Memcheck:Leak - ... - fun:si_module_with_name - fun:getaddrinfo -} -{ - mac-ssl-leak-4 - Memcheck:Leak - fun:malloc - fun:CRYPTO_malloc - ... - fun:ssl3_get_server_certificate -} -{ - mac-ssl-leak-5 - Memcheck:Leak - fun:malloc - fun:CRYPTO_malloc - ... - fun:ERR_put_error -} -{ - clar-printf-buf - Memcheck:Leak - fun:malloc - fun:__smakebuf - ... - fun:printf - fun:clar_print_init -} -{ - molo-1 - Memcheck:Leak - fun:malloc_zone_malloc - ... - fun:_objc_init -} -{ - molo-2 - Memcheck:Leak - fun:malloc_zone_calloc - ... - fun:_objc_init -} -{ - molo-3 - Memcheck:Leak - fun:malloc - ... - fun:_objc_init -} -{ - molo-4 - Memcheck:Leak - fun:malloc - ... - fun:dyld_register_image_state_change_handler -} diff --git a/vendor/libssh2.gyp b/vendor/libssh2.gyp new file mode 100644 index 0000000000..1067eeeae2 --- /dev/null +++ b/vendor/libssh2.gyp @@ -0,0 +1,38 @@ +{ + "variables": { + "is_electron%": " +# +# 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 the copyright holder nor the names +# of any other 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. + +cmake_minimum_required(VERSION 2.8.11) + +set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake) + +project(libssh2 C) +set(PROJECT_URL "https://www.libssh2.org/") +set(PROJECT_DESCRIPTION "The SSH library") + +if (CMAKE_VERSION VERSION_LESS "3.1") + if (CMAKE_C_COMPILER_ID STREQUAL "GNU") + set (CMAKE_C_FLAGS "--std=gnu90 ${CMAKE_C_FLAGS}") + endif() +else() + set (CMAKE_C_STANDARD 90) +endif() + +option(BUILD_SHARED_LIBS "Build Shared Libraries" OFF) + +# Parse version + +file(READ ${CMAKE_CURRENT_SOURCE_DIR}/include/libssh2.h _HEADER_CONTENTS) +string( + REGEX REPLACE ".*#define LIBSSH2_VERSION[ \t]+\"([^\"]+)\".*" "\\1" + LIBSSH2_VERSION "${_HEADER_CONTENTS}") +string( + REGEX REPLACE ".*#define LIBSSH2_VERSION_MAJOR[ \t]+([0-9]+).*" "\\1" + LIBSSH2_VERSION_MAJOR "${_HEADER_CONTENTS}") +string( + REGEX REPLACE ".*#define LIBSSH2_VERSION_MINOR[ \t]+([0-9]+).*" "\\1" + LIBSSH2_VERSION_MINOR "${_HEADER_CONTENTS}") +string( + REGEX REPLACE ".*#define LIBSSH2_VERSION_PATCH[ \t]+([0-9]+).*" "\\1" + LIBSSH2_VERSION_PATCH "${_HEADER_CONTENTS}") + +if(NOT LIBSSH2_VERSION OR + NOT LIBSSH2_VERSION_MAJOR MATCHES "^[0-9]+$" OR + NOT LIBSSH2_VERSION_MINOR MATCHES "^[0-9]+$" OR + NOT LIBSSH2_VERSION_PATCH MATCHES "^[0-9]+$") + message( + FATAL_ERROR + "Unable to parse version from" + "${CMAKE_CURRENT_SOURCE_DIR}/include/libssh2.h") +endif() + +include(GNUInstallDirs) +install( + FILES docs/AUTHORS COPYING docs/HACKING README RELEASE-NOTES NEWS + DESTINATION ${CMAKE_INSTALL_DOCDIR}) + +include(max_warnings) +include(FeatureSummary) + +add_subdirectory(src) + +option(BUILD_EXAMPLES "Build libssh2 examples" ON) +if(BUILD_EXAMPLES) + add_subdirectory(example) +endif() + +option(BUILD_TESTING "Build libssh2 test suite" ON) +if(BUILD_TESTING) + enable_testing() + add_subdirectory(tests) +endif() + +option(LINT "Check style while building" OFF) +if(LINT) + add_custom_target(lint ALL + ./ci/checksrc.sh + WORKING_DIRECTORY ${libssh2_SOURCE_DIR}) + add_dependencies(libssh2 lint) +endif() + +add_subdirectory(docs) + +feature_summary(WHAT ALL) + +set(CPACK_PACKAGE_VERSION_MAJOR ${LIBSSH2_VERSION_MAJOR}) +set(CPACK_PACKAGE_VERSION_MINOR ${LIBSSH2_VERSION_MINOR}) +set(CPACK_PACKAGE_VERSION_PATCH ${LIBSSH2_VERSION_PATCH}) +set(CPACK_PACKAGE_VERSION ${LIBSSH2_VERSION}) +include(CPack) diff --git a/vendor/libssh2/COPYING b/vendor/libssh2/COPYING index 1bd78c9cbb..937ed32e3a 100644 --- a/vendor/libssh2/COPYING +++ b/vendor/libssh2/COPYING @@ -2,8 +2,10 @@ * Copyright (c) 2005,2006 Mikhail Gusarov * Copyright (c) 2006-2007 The Written Word, Inc. * Copyright (c) 2007 Eli Fant - * Copyright (c) 2009 Daniel Stenberg + * Copyright (c) 2009-2021 Daniel Stenberg * Copyright (C) 2008, 2009 Simon Josefsson + * Copyright (c) 2000 Markus Friedl + * Copyright (c) 2015 Microsoft Corp. * All rights reserved. * * Redistribution and use in source and binary forms, diff --git a/vendor/libssh2/INSTALL b/vendor/libssh2/INSTALL deleted file mode 100644 index 23e5f25d0e..0000000000 --- a/vendor/libssh2/INSTALL +++ /dev/null @@ -1,236 +0,0 @@ -Installation Instructions -************************* - -Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005 Free -Software Foundation, Inc. - -This file is free documentation; the Free Software Foundation gives -unlimited permission to copy, distribute and modify it. - -Basic Installation -================== - -These are generic installation instructions. - - The `configure' shell script attempts to guess correct values for -various system-dependent variables used during compilation. It uses -those values to create a `Makefile' in each directory of the package. -It may also create one or more `.h' files containing system-dependent -definitions. Finally, it creates a shell script `config.status' that -you can run in the future to recreate the current configuration, and a -file `config.log' containing compiler output (useful mainly for -debugging `configure'). - - It can also use an optional file (typically called `config.cache' -and enabled with `--cache-file=config.cache' or simply `-C') that saves -the results of its tests to speed up reconfiguring. (Caching is -disabled by default to prevent problems with accidental use of stale -cache files.) - - If you need to do unusual things to compile the package, please try -to figure out how `configure' could check whether to do them, and mail -diffs or instructions to the address given in the `README' so they can -be considered for the next release. If you are using the cache, and at -some point `config.cache' contains results you don't want to keep, you -may remove or edit it. - - The file `configure.ac' (or `configure.in') is used to create -`configure' by a program called `autoconf'. You only need -`configure.ac' if you want to change it or regenerate `configure' using -a newer version of `autoconf'. - -The simplest way to compile this package is: - - 1. `cd' to the directory containing the package's source code and type - `./configure' to configure the package for your system. If you're - using `csh' on an old version of System V, you might need to type - `sh ./configure' instead to prevent `csh' from trying to execute - `configure' itself. - - Running `configure' takes awhile. While running, it prints some - messages telling which features it is checking for. - - 2. Type `make' to compile the package. - - 3. Optionally, type `make check' to run any self-tests that come with - the package. - - 4. Type `make install' to install the programs and any data files and - documentation. - - 5. You can remove the program binaries and object files from the - source code directory by typing `make clean'. To also remove the - files that `configure' created (so you can compile the package for - a different kind of computer), type `make distclean'. There is - also a `make maintainer-clean' target, but that is intended mainly - for the package's developers. If you use it, you may have to get - all sorts of other programs in order to regenerate files that came - with the distribution. - -Compilers and Options -===================== - -Some systems require unusual options for compilation or linking that the -`configure' script does not know about. Run `./configure --help' for -details on some of the pertinent environment variables. - - You can give `configure' initial values for configuration parameters -by setting variables in the command line or in the environment. Here -is an example: - - ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix - - *Note Defining Variables::, for more details. - -Compiling For Multiple Architectures -==================================== - -You can compile the package for more than one kind of computer at the -same time, by placing the object files for each architecture in their -own directory. To do this, you must use a version of `make' that -supports the `VPATH' variable, such as GNU `make'. `cd' to the -directory where you want the object files and executables to go and run -the `configure' script. `configure' automatically checks for the -source code in the directory that `configure' is in and in `..'. - - If you have to use a `make' that does not support the `VPATH' -variable, you have to compile the package for one architecture at a -time in the source code directory. After you have installed the -package for one architecture, use `make distclean' before reconfiguring -for another architecture. - -Installation Names -================== - -By default, `make install' installs the package's commands under -`/usr/local/bin', include files under `/usr/local/include', etc. You -can specify an installation prefix other than `/usr/local' by giving -`configure' the option `--prefix=PREFIX'. - - You can specify separate installation prefixes for -architecture-specific files and architecture-independent files. If you -pass the option `--exec-prefix=PREFIX' to `configure', the package uses -PREFIX as the prefix for installing programs and libraries. -Documentation and other data files still use the regular prefix. - - In addition, if you use an unusual directory layout you can give -options like `--bindir=DIR' to specify different values for particular -kinds of files. Run `configure --help' for a list of the directories -you can set and what kinds of files go in them. - - If the package supports it, you can cause programs to be installed -with an extra prefix or suffix on their names by giving `configure' the -option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. - -Optional Features -================= - -Some packages pay attention to `--enable-FEATURE' options to -`configure', where FEATURE indicates an optional part of the package. -They may also pay attention to `--with-PACKAGE' options, where PACKAGE -is something like `gnu-as' or `x' (for the X Window System). The -`README' should mention any `--enable-' and `--with-' options that the -package recognizes. - - For packages that use the X Window System, `configure' can usually -find the X include and library files automatically, but if it doesn't, -you can use the `configure' options `--x-includes=DIR' and -`--x-libraries=DIR' to specify their locations. - -Specifying the System Type -========================== - -There may be some features `configure' cannot figure out automatically, -but needs to determine by the type of machine the package will run on. -Usually, assuming the package is built to be run on the _same_ -architectures, `configure' can figure that out, but if it prints a -message saying it cannot guess the machine type, give it the -`--build=TYPE' option. TYPE can either be a short name for the system -type, such as `sun4', or a canonical name which has the form: - - CPU-COMPANY-SYSTEM - -where SYSTEM can have one of these forms: - - OS KERNEL-OS - - See the file `config.sub' for the possible values of each field. If -`config.sub' isn't included in this package, then this package doesn't -need to know the machine type. - - If you are _building_ compiler tools for cross-compiling, you should -use the option `--target=TYPE' to select the type of system they will -produce code for. - - If you want to _use_ a cross compiler, that generates code for a -platform different from the build platform, you should specify the -"host" platform (i.e., that on which the generated programs will -eventually be run) with `--host=TYPE'. - -Sharing Defaults -================ - -If you want to set default values for `configure' scripts to share, you -can create a site shell script called `config.site' that gives default -values for variables like `CC', `cache_file', and `prefix'. -`configure' looks for `PREFIX/share/config.site' if it exists, then -`PREFIX/etc/config.site' if it exists. Or, you can set the -`CONFIG_SITE' environment variable to the location of the site script. -A warning: not all `configure' scripts look for a site script. - -Defining Variables -================== - -Variables not defined in a site shell script can be set in the -environment passed to `configure'. However, some packages may run -configure again during the build, and the customized values of these -variables may be lost. In order to avoid this problem, you should set -them in the `configure' command line, using `VAR=value'. For example: - - ./configure CC=/usr/local2/bin/gcc - -causes the specified `gcc' to be used as the C compiler (unless it is -overridden in the site shell script). Here is a another example: - - /bin/bash ./configure CONFIG_SHELL=/bin/bash - -Here the `CONFIG_SHELL=/bin/bash' operand causes subsequent -configuration-related scripts to be executed by `/bin/bash'. - -`configure' Invocation -====================== - -`configure' recognizes the following options to control how it operates. - -`--help' -`-h' - Print a summary of the options to `configure', and exit. - -`--version' -`-V' - Print the version of Autoconf used to generate the `configure' - script, and exit. - -`--cache-file=FILE' - Enable the cache: use and save the results of the tests in FILE, - traditionally `config.cache'. FILE defaults to `/dev/null' to - disable caching. - -`--config-cache' -`-C' - Alias for `--cache-file=config.cache'. - -`--quiet' -`--silent' -`-q' - Do not print messages saying which checks are being made. To - suppress all normal output, redirect it to `/dev/null' (any error - messages will still be shown). - -`--srcdir=DIR' - Look for the package's source code in directory DIR. Usually - `configure' can determine that directory automatically. - -`configure' also accepts some other, not widely useful, options. Run -`configure --help' for more details. - diff --git a/vendor/libssh2/Makefile.OpenSSL.inc b/vendor/libssh2/Makefile.OpenSSL.inc new file mode 100644 index 0000000000..1e4e8f0bbb --- /dev/null +++ b/vendor/libssh2/Makefile.OpenSSL.inc @@ -0,0 +1,3 @@ +CRYPTO_CSOURCES = openssl.c +CRYPTO_HHEADERS = openssl.h +CRYPTO_LTLIBS = $(LTLIBSSL) diff --git a/vendor/libssh2/Makefile.WinCNG.inc b/vendor/libssh2/Makefile.WinCNG.inc new file mode 100644 index 0000000000..bbcb82bfde --- /dev/null +++ b/vendor/libssh2/Makefile.WinCNG.inc @@ -0,0 +1,3 @@ +CRYPTO_CSOURCES = wincng.c +CRYPTO_HHEADERS = wincng.h +CRYPTO_LTLIBS = $(LTLIBBCRYPT) $(LTLIBCRYPT32) diff --git a/vendor/libssh2/Makefile.am b/vendor/libssh2/Makefile.am index 023200d0e5..986441bd68 100644 --- a/vendor/libssh2/Makefile.am +++ b/vendor/libssh2/Makefile.am @@ -32,8 +32,20 @@ win32/libssh2_config.h win32/config.mk win32/rules.mk \ win32/Makefile.Watcom win32/libssh2.dsw win32/tests.dsp $(DSP) \ win32/msvcproj.head win32/msvcproj.foot win32/libssh2.rc -EXTRA_DIST = $(WIN32FILES) buildconf $(NETWAREFILES) get_ver.awk HACKING \ - maketgz NMakefile TODO RELEASE-NOTES libssh2.pc.in $(VMSFILES) config.rpath +OS400FILES = os400/README400 os400/initscript.sh os400/make.sh \ +os400/make-src.sh os400/make-rpg.sh os400/make-include.sh \ +os400/os400sys.c os400/ccsid.c \ +os400/libssh2_config.h os400/macros.h os400/libssh2_ccsid.h \ +os400/include/alloca.h os400/include/sys/socket.h os400/include/stdio.h \ +os400/libssh2rpg/libssh2.rpgle.in \ +os400/libssh2rpg/libssh2_ccsid.rpgle.in \ +os400/libssh2rpg/libssh2_publickey.rpgle \ +os400/libssh2rpg/libssh2_sftp.rpgle \ +Makefile.os400qc3.inc + +EXTRA_DIST = $(WIN32FILES) $(NETWAREFILES) get_ver.awk \ + maketgz NMakefile RELEASE-NOTES libssh2.pc.in $(VMSFILES) config.rpath \ + CMakeLists.txt cmake $(OS400FILES) ACLOCAL_AMFLAGS = -I m4 @@ -75,6 +87,9 @@ gen-coverage: coverage: init-coverage build-coverage gen-coverage # DSP/VCPROJ generation adapted from libcurl +# only OpenSSL and WinCNG are supported with this build system +CRYPTO_CSOURCES = openssl.c wincng.c mbedtls.c +CRYPTO_HHEADERS = openssl.h wincng.h mbedtls.h # Makefile.inc provides the CSOURCES and HHEADERS defines include Makefile.inc @@ -104,7 +119,7 @@ $(DSP): win32/msvcproj.head win32/msvcproj.foot Makefile.am for file in $$sorted_hdrs; do \ echo "# Begin Source File"; \ echo ""; \ - if [ "$$file" == "libssh2_config.h" ]; \ + if [ "$$file" = "libssh2_config.h" ]; \ then \ echo "SOURCE=.\\"$$file; \ else \ @@ -132,3 +147,8 @@ $(VCPROJ): win32/vc8proj.head win32/vc8proj.foot Makefile.am done; \ cat $(srcdir)/vc8proj.foot) | \ awk '{printf("%s\r\n", gensub("\r", "", "g"))}' > $@ ) + +checksrc: + perl src/checksrc.pl -i4 -m79 -ASIZEOFNOPAREN -ASNPRINTF -ACOPYRIGHT \ + -AFOPENMODE -Wsrc/libssh2_config.h src/*.[ch] include/*.h example/*.c \ + tests/*.[ch] diff --git a/vendor/libssh2/Makefile.in b/vendor/libssh2/Makefile.in index 88efc530f8..c60873ab8e 100644 --- a/vendor/libssh2/Makefile.in +++ b/vendor/libssh2/Makefile.in @@ -1,9 +1,8 @@ -# Makefile.in generated by automake 1.11.6 from Makefile.am. +# Makefile.in generated by automake 1.16.4 from Makefile.am. # @configure_input@ -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software -# Foundation, Inc. +# Copyright (C) 1994-2021 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -17,23 +16,61 @@ VPATH = @srcdir@ -am__make_dryrun = \ - { \ - am__dry=no; \ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ - echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ - | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ - *) \ - for am__flg in $$MAKEFLAGS; do \ - case $$am__flg in \ - *=*|--*) ;; \ - *n*) am__dry=yes; break;; \ - esac; \ - done;; \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ - test $$am__dry = yes; \ - } + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -53,12 +90,6 @@ POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ @BUILD_EXAMPLES_TRUE@am__append_1 = example -DIST_COMMON = README $(am__configure_deps) $(include_HEADERS) \ - $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ - $(srcdir)/Makefile.inc $(srcdir)/libssh2.pc.in \ - $(top_srcdir)/configure AUTHORS COPYING ChangeLog INSTALL NEWS \ - TODO config.guess config.rpath config.sub depcomp install-sh \ - ltmain.sh missing subdir = . ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/autobuild.m4 \ @@ -69,22 +100,36 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/autobuild.m4 \ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \ + $(am__configure_deps) $(include_HEADERS) $(am__DIST_COMMON) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(install_sh) -d -CONFIG_HEADER = $(top_builddir)/src/libssh2_config.h \ - $(top_builddir)/example/libssh2_config.h +CONFIG_HEADER = $(top_builddir)/src/libssh2_config.h CONFIG_CLEAN_FILES = libssh2.pc CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = SOURCES = DIST_SOURCES = -RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ - html-recursive info-recursive install-data-recursive \ - install-dvi-recursive install-exec-recursive \ - install-html-recursive install-info-recursive \ - install-pdf-recursive install-ps-recursive install-recursive \ - installcheck-recursive installdirs-recursive pdf-recursive \ - ps-recursive uninstall-recursive +RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ + ctags-recursive dvi-recursive html-recursive info-recursive \ + install-data-recursive install-dvi-recursive \ + install-exec-recursive install-html-recursive \ + install-info-recursive install-pdf-recursive \ + install-ps-recursive install-recursive installcheck-recursive \ + installdirs-recursive pdf-recursive ps-recursive \ + tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ @@ -123,12 +168,34 @@ DATA = $(pkgconfig_DATA) HEADERS = $(include_HEADERS) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive -AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ - $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ - distdir dist dist-all distcheck -ETAGS = etags -CTAGS = ctags +am__recursive_targets = \ + $(RECURSIVE_TARGETS) \ + $(RECURSIVE_CLEAN_TARGETS) \ + $(am__extra_recursive_targets) +AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ + cscope distdir distdir-am dist dist-all distcheck +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` DIST_SUBDIRS = src tests docs example +am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.inc \ + $(srcdir)/libssh2.pc.in COPYING ChangeLog NEWS README compile \ + config.guess config.rpath config.sub depcomp install-sh \ + ltmain.sh missing DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) @@ -138,6 +205,7 @@ am__remove_distdir = \ && rm -rf "$(distdir)" \ || { sleep 5 && rm -rf "$(distdir)"; }; \ else :; fi +am__post_remove_distdir = $(am__remove_distdir) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ @@ -165,6 +233,9 @@ am__relativize = \ reldir="$$dir2" DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best +DIST_TARGETS = dist-gzip +# Exists only to be overridden by the user if desired. +AM_DISTCHECK_DVI_TARGET = dvi distuninstallcheck_listfiles = find . -type f -print am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' @@ -172,6 +243,7 @@ distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ @@ -183,6 +255,12 @@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ +CSCOPE = @CSCOPE@ +CTAGS = @CTAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ @@ -193,10 +271,14 @@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ +ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ +HAVE_LIBBCRYPT = @HAVE_LIBBCRYPT@ +HAVE_LIBCRYPT32 = @HAVE_LIBCRYPT32@ HAVE_LIBGCRYPT = @HAVE_LIBGCRYPT@ +HAVE_LIBMBEDCRYPTO = @HAVE_LIBMBEDCRYPTO@ HAVE_LIBSSL = @HAVE_LIBSSL@ HAVE_LIBZ = @HAVE_LIBZ@ INSTALL = @INSTALL@ @@ -206,8 +288,14 @@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ +LIBBCRYPT = @LIBBCRYPT@ +LIBBCRYPT_PREFIX = @LIBBCRYPT_PREFIX@ +LIBCRYPT32 = @LIBCRYPT32@ +LIBCRYPT32_PREFIX = @LIBCRYPT32_PREFIX@ LIBGCRYPT = @LIBGCRYPT@ LIBGCRYPT_PREFIX = @LIBGCRYPT_PREFIX@ +LIBMBEDCRYPTO = @LIBMBEDCRYPTO@ +LIBMBEDCRYPTO_PREFIX = @LIBMBEDCRYPTO_PREFIX@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSREQUIRED = @LIBSREQUIRED@ @@ -217,12 +305,17 @@ LIBSSL_PREFIX = @LIBSSL_PREFIX@ LIBTOOL = @LIBTOOL@ LIBZ = @LIBZ@ LIBZ_PREFIX = @LIBZ_PREFIX@ +LIB_FUZZING_ENGINE = @LIB_FUZZING_ENGINE@ LIPO = @LIPO@ LN_S = @LN_S@ +LTLIBBCRYPT = @LTLIBBCRYPT@ +LTLIBCRYPT32 = @LTLIBCRYPT32@ LTLIBGCRYPT = @LTLIBGCRYPT@ +LTLIBMBEDCRYPTO = @LTLIBMBEDCRYPTO@ LTLIBOBJS = @LTLIBOBJS@ LTLIBSSL = @LTLIBSSL@ LTLIBZ = @LTLIBZ@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ @@ -254,6 +347,7 @@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ @@ -292,6 +386,7 @@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ +runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ @@ -326,20 +421,35 @@ win32/libssh2_config.h win32/config.mk win32/rules.mk \ win32/Makefile.Watcom win32/libssh2.dsw win32/tests.dsp $(DSP) \ win32/msvcproj.head win32/msvcproj.foot win32/libssh2.rc -EXTRA_DIST = $(WIN32FILES) buildconf $(NETWAREFILES) get_ver.awk HACKING \ - maketgz NMakefile TODO RELEASE-NOTES libssh2.pc.in $(VMSFILES) config.rpath +OS400FILES = os400/README400 os400/initscript.sh os400/make.sh \ +os400/make-src.sh os400/make-rpg.sh os400/make-include.sh \ +os400/os400sys.c os400/ccsid.c \ +os400/libssh2_config.h os400/macros.h os400/libssh2_ccsid.h \ +os400/include/alloca.h os400/include/sys/socket.h os400/include/stdio.h \ +os400/libssh2rpg/libssh2.rpgle.in \ +os400/libssh2rpg/libssh2_ccsid.rpgle.in \ +os400/libssh2rpg/libssh2_publickey.rpgle \ +os400/libssh2rpg/libssh2_sftp.rpgle \ +Makefile.os400qc3.inc + +EXTRA_DIST = $(WIN32FILES) $(NETWAREFILES) get_ver.awk \ + maketgz NMakefile RELEASE-NOTES libssh2.pc.in $(VMSFILES) config.rpath \ + CMakeLists.txt cmake $(OS400FILES) ACLOCAL_AMFLAGS = -I m4 + +# DSP/VCPROJ generation adapted from libcurl +# only OpenSSL and WinCNG are supported with this build system +CRYPTO_CSOURCES = openssl.c wincng.c mbedtls.c +CRYPTO_HHEADERS = openssl.h wincng.h mbedtls.h CSOURCES = channel.c comp.c crypt.c hostkey.c kex.c mac.c misc.c \ packet.c publickey.c scp.c session.c sftp.c userauth.c transport.c \ - version.c knownhost.c agent.c openssl.c libgcrypt.c pem.c keepalive.c \ - global.c - -HHEADERS = libssh2_priv.h openssl.h libgcrypt.h transport.h channel.h \ - comp.h mac.h misc.h packet.h userauth.h session.h sftp.h crypto.h + version.c knownhost.c agent.c $(CRYPTO_CSOURCES) pem.c keepalive.c global.c \ + blowfish.c bcrypt_pbkdf.c agent_win.c +HHEADERS = libssh2_priv.h $(CRYPTO_HHEADERS) transport.h channel.h comp.h \ + mac.h misc.h packet.h userauth.h session.h sftp.h crypto.h blf.h agent.h -# DSP/VCPROJ generation adapted from libcurl # Makefile.inc provides the CSOURCES and HHEADERS defines WIN32SOURCES = $(CSOURCES) WIN32HEADERS = $(HHEADERS) libssh2_config.h @@ -361,17 +471,16 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(srcdir)/Ma echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign Makefile -.PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles);; \ esac; -$(srcdir)/Makefile.inc: +$(srcdir)/Makefile.inc $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck @@ -436,22 +545,25 @@ uninstall-includeHEADERS: dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd -# into them and run `make' without going through this Makefile. -# To change the values of `make' variables: instead of editing Makefiles, -# (1) if the variable is set in `config.status', edit `config.status' -# (which will cause the Makefiles to be regenerated when you run `make'); -# (2) otherwise, pass the desired values on the `make' command line. -$(RECURSIVE_TARGETS): - @fail= failcom='exit 1'; \ - for f in x $$MAKEFLAGS; do \ - case $$f in \ - *=* | --[!k]*);; \ - *k*) failcom='fail=yes';; \ - esac; \ - done; \ +# into them and run 'make' without going through this Makefile. +# To change the values of 'make' variables: instead of editing Makefiles, +# (1) if the variable is set in 'config.status', edit 'config.status' +# (which will cause the Makefiles to be regenerated when you run 'make'); +# (2) otherwise, pass the desired values on the 'make' command line. +$(am__recursive_targets): + @fail=; \ + if $(am__make_keepgoing); then \ + failcom='fail=yes'; \ + else \ + failcom='exit 1'; \ + fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ - list='$(SUBDIRS)'; for subdir in $$list; do \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ @@ -466,57 +578,12 @@ $(RECURSIVE_TARGETS): $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" -$(RECURSIVE_CLEAN_TARGETS): - @fail= failcom='exit 1'; \ - for f in x $$MAKEFLAGS; do \ - case $$f in \ - *=* | --[!k]*);; \ - *k*) failcom='fail=yes';; \ - esac; \ - done; \ - dot_seen=no; \ - case "$@" in \ - distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ - *) list='$(SUBDIRS)' ;; \ - esac; \ - rev=''; for subdir in $$list; do \ - if test "$$subdir" = "."; then :; else \ - rev="$$subdir $$rev"; \ - fi; \ - done; \ - rev="$$rev ."; \ - target=`echo $@ | sed s/-recursive//`; \ - for subdir in $$rev; do \ - echo "Making $$target in $$subdir"; \ - if test "$$subdir" = "."; then \ - local_target="$$target-am"; \ - else \ - local_target="$$target"; \ - fi; \ - ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ - || eval $$failcom; \ - done && test -z "$$fail" -tags-recursive: - list='$(SUBDIRS)'; for subdir in $$list; do \ - test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ - done -ctags-recursive: - list='$(SUBDIRS)'; for subdir in $$list; do \ - test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ - done +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-recursive +TAGS: tags -ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - mkid -fID $$unique -tags: TAGS - -TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ @@ -532,12 +599,7 @@ TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ + $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ @@ -549,15 +611,11 @@ TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $$unique; \ fi; \ fi -ctags: CTAGS -CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ +ctags: ctags-recursive + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique @@ -566,11 +624,35 @@ GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" +cscope: cscope.files + test ! -s cscope.files \ + || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) +clean-cscope: + -rm -f cscope.files +cscope.files: clean-cscope cscopelist +cscopelist: cscopelist-recursive + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + -rm -f cscope.out cscope.in.out cscope.po.out cscope.files +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am -distdir: $(DISTFILES) +distdir-am: $(DISTFILES) $(am__remove_distdir) test -d "$(distdir)" || mkdir "$(distdir)" @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ @@ -638,41 +720,47 @@ distdir: $(DISTFILES) ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r "$(distdir)" dist-gzip: distdir - tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz - $(am__remove_distdir) + tardir=$(distdir) && $(am__tar) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).tar.gz + $(am__post_remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 - $(am__remove_distdir) + $(am__post_remove_distdir) dist-lzip: distdir tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz - $(am__remove_distdir) - -dist-lzma: distdir - tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma - $(am__remove_distdir) + $(am__post_remove_distdir) dist-xz: distdir tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz - $(am__remove_distdir) + $(am__post_remove_distdir) + +dist-zstd: distdir + tardir=$(distdir) && $(am__tar) | zstd -c $${ZSTD_CLEVEL-$${ZSTD_OPT--19}} >$(distdir).tar.zst + $(am__post_remove_distdir) dist-tarZ: distdir + @echo WARNING: "Support for distribution archives compressed with" \ + "legacy program 'compress' is deprecated." >&2 + @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z - $(am__remove_distdir) + $(am__post_remove_distdir) dist-shar: distdir - shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz - $(am__remove_distdir) + @echo WARNING: "Support for shar distribution archives is" \ + "deprecated." >&2 + @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 + shar $(distdir) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).shar.gz + $(am__post_remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) - $(am__remove_distdir) + $(am__post_remove_distdir) -dist dist-all: distdir - tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz - $(am__remove_distdir) +dist dist-all: + $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' + $(am__post_remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another @@ -680,11 +768,9 @@ dist dist-all: distdir distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ - GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ + eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ - *.tar.lzma*) \ - lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\ *.tar.lz*) \ lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ *.tar.xz*) \ @@ -692,24 +778,27 @@ distcheck: dist *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ - GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ + eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ + *.tar.zst*) \ + zstd -dc $(distdir).tar.zst | $(am__untar) ;;\ esac - chmod -R a-w $(distdir); chmod u+w $(distdir) - mkdir $(distdir)/_build - mkdir $(distdir)/_inst + chmod -R a-w $(distdir) + chmod u+w $(distdir) + mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ - && $(am__cd) $(distdir)/_build \ - && ../configure --srcdir=.. --prefix="$$dc_install_base" \ + && $(am__cd) $(distdir)/_build/sub \ + && ../../configure \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ + --srcdir=../.. --prefix="$$dc_install_base" \ && $(MAKE) $(AM_MAKEFLAGS) \ - && $(MAKE) $(AM_MAKEFLAGS) dvi \ + && $(MAKE) $(AM_MAKEFLAGS) $(AM_DISTCHECK_DVI_TARGET) \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ @@ -730,7 +819,7 @@ distcheck: dist && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ && cd "$$am__cwd" \ || exit 1 - $(am__remove_distdir) + $(am__post_remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' @@ -869,26 +958,27 @@ ps-am: uninstall-am: uninstall-includeHEADERS uninstall-pkgconfigDATA -.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ - install-am install-strip tags-recursive - -.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ - all all-am am--refresh check check-am clean clean-generic \ - clean-libtool ctags ctags-recursive dist dist-all dist-bzip2 \ - dist-gzip dist-hook dist-lzip dist-lzma dist-shar dist-tarZ \ - dist-xz dist-zip distcheck distclean distclean-generic \ - distclean-libtool distclean-tags distcleancheck distdir \ - distuninstallcheck dvi dvi-am html html-am info info-am \ - install install-am install-data install-data-am install-dvi \ - install-dvi-am install-exec install-exec-am install-html \ - install-html-am install-includeHEADERS install-info \ - install-info-am install-man install-pdf install-pdf-am \ - install-pkgconfigDATA install-ps install-ps-am install-strip \ - installcheck installcheck-am installdirs installdirs-am \ - maintainer-clean maintainer-clean-generic mostlyclean \ - mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ - tags tags-recursive uninstall uninstall-am \ - uninstall-includeHEADERS uninstall-pkgconfigDATA +.MAKE: $(am__recursive_targets) install-am install-strip + +.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ + am--refresh check check-am clean clean-cscope clean-generic \ + clean-libtool cscope cscopelist-am ctags ctags-am dist \ + dist-all dist-bzip2 dist-gzip dist-hook dist-lzip dist-shar \ + dist-tarZ dist-xz dist-zip dist-zstd distcheck distclean \ + distclean-generic distclean-libtool distclean-tags \ + distcleancheck distdir distuninstallcheck dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am \ + install-includeHEADERS install-info install-info-am \ + install-man install-pdf install-pdf-am install-pkgconfigDATA \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs installdirs-am maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ + uninstall-am uninstall-includeHEADERS uninstall-pkgconfigDATA + +.PRECIOUS: Makefile .PHONY: ChangeLog @@ -950,7 +1040,7 @@ $(DSP): win32/msvcproj.head win32/msvcproj.foot Makefile.am for file in $$sorted_hdrs; do \ echo "# Begin Source File"; \ echo ""; \ - if [ "$$file" == "libssh2_config.h" ]; \ + if [ "$$file" = "libssh2_config.h" ]; \ then \ echo "SOURCE=.\\"$$file; \ else \ @@ -979,6 +1069,11 @@ $(VCPROJ): win32/vc8proj.head win32/vc8proj.foot Makefile.am cat $(srcdir)/vc8proj.foot) | \ awk '{printf("%s\r\n", gensub("\r", "", "g"))}' > $@ ) +checksrc: + perl src/checksrc.pl -i4 -m79 -ASIZEOFNOPAREN -ASNPRINTF -ACOPYRIGHT \ + -AFOPENMODE -Wsrc/libssh2_config.h src/*.[ch] include/*.h example/*.c \ + tests/*.[ch] + # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: diff --git a/vendor/libssh2/Makefile.inc b/vendor/libssh2/Makefile.inc index 12a89e536b..20d2ebeeb2 100644 --- a/vendor/libssh2/Makefile.inc +++ b/vendor/libssh2/Makefile.inc @@ -1,7 +1,7 @@ CSOURCES = channel.c comp.c crypt.c hostkey.c kex.c mac.c misc.c \ packet.c publickey.c scp.c session.c sftp.c userauth.c transport.c \ - version.c knownhost.c agent.c openssl.c libgcrypt.c pem.c keepalive.c \ - global.c + version.c knownhost.c agent.c $(CRYPTO_CSOURCES) pem.c keepalive.c global.c \ + blowfish.c bcrypt_pbkdf.c agent_win.c -HHEADERS = libssh2_priv.h openssl.h libgcrypt.h transport.h channel.h \ - comp.h mac.h misc.h packet.h userauth.h session.h sftp.h crypto.h +HHEADERS = libssh2_priv.h $(CRYPTO_HHEADERS) transport.h channel.h comp.h \ + mac.h misc.h packet.h userauth.h session.h sftp.h crypto.h blf.h agent.h diff --git a/vendor/libssh2/Makefile.libgcrypt.inc b/vendor/libssh2/Makefile.libgcrypt.inc new file mode 100644 index 0000000000..0a3aae9aad --- /dev/null +++ b/vendor/libssh2/Makefile.libgcrypt.inc @@ -0,0 +1,3 @@ +CRYPTO_CSOURCES = libgcrypt.c +CRYPTO_HHEADERS = libgcrypt.h +CRYPTO_LTLIBS = $(LTLIBGCRYPT) diff --git a/vendor/libssh2/Makefile.mbedTLS.inc b/vendor/libssh2/Makefile.mbedTLS.inc new file mode 100644 index 0000000000..b9f19fce1a --- /dev/null +++ b/vendor/libssh2/Makefile.mbedTLS.inc @@ -0,0 +1,3 @@ +CRYPTO_CSOURCES = mbedtls.c +CRYPTO_HHEADERS = mbedtls.h +CRYPTO_LTLIBS = $(LTLIBMBEDCRYPTO) diff --git a/vendor/libssh2/Makefile.os400qc3.inc b/vendor/libssh2/Makefile.os400qc3.inc new file mode 100644 index 0000000000..e55094d9bd --- /dev/null +++ b/vendor/libssh2/Makefile.os400qc3.inc @@ -0,0 +1,2 @@ +CRYPTO_CSOURCES = os400qc3.c +CRYPTO_HHEADERS = os400qc3.h diff --git a/vendor/libssh2/NEWS b/vendor/libssh2/NEWS index a5f3f77e56..7e22b3dd85 100644 --- a/vendor/libssh2/NEWS +++ b/vendor/libssh2/NEWS @@ -1,4682 +1,6831 @@ Changelog for the libssh2 project. Generated with git2news.pl -Version 1.4.3 (27 Nov 2012) - -Daniel Stenberg (27 Nov 2012) -- RELEASE-NOTES: fixed for 1.4.3 +Daniel Stenberg (29 Aug 2021) +- [Will Cosgrove brought this change] -- sftp_read: return error if a too large package arrives - -Peter Stuge (13 Nov 2012) -- Only define _libssh2_dsa_*() functions when building with DSA support + updated docs for 1.10.0 release -Guenter Knauf (8 Nov 2012) -- Added .def file to output. +Marc Hörsken (30 May 2021) +- [Laurent Stacul brought this change] -Kamil Dudka (1 Nov 2012) -- libssh2_hostkey_hash.3: update the description of return value + [tests] Try several times to connect the ssh server - The function returns NULL also if the hash algorithm is not available. + Sometimes, as the OCI container is run in detached mode, it is possible + the actual server is not ready yet to handle SSH traffic. The goal of + this PR is to try several times (max 3). The mechanism is the same as + for the connection to the docker machine. -Guenter Knauf (24 Oct 2012) -- Fixed mode acciedently committed. +- [Laurent Stacul brought this change] -- Ignore generated file. + Remove openssh_server container on test exit -- Added hack to make use of Makefile.inc. - - This should avoid further maintainance of the objects list. +- [Laurent Stacul brought this change] -- Fixed MSVC NMakefile. + Allow the tests to run inside a container - Added missing source files; added resource for DLL. - -Kamil Dudka (22 Oct 2012) -- examples: use stderr for messages, stdout for data + The current tests suite starts SSH server as OCI container. This commit + add the possibility to run the tests in a container provided that: - Reported by: Karel Srot - Bug: https://bugzilla.redhat.com/867462 + * the docker client is installed builder container + * the host docker daemon unix socket has been mounted in the builder + container (with, if needed, the DOCKER_HOST environment variable + accordingly set, and the permission to write on this socket) + * the builder container is run on the default bridge network, or the + host network. This PR does not handle the case where the builder + container is on another network. -- openssl: do not leak memory when handling errors +Marc Hoersken (28 May 2021) +- CI/appveyor: run SSH server for tests on GitHub Actions (#607) - ,.. in aes_ctr_init(). Detected by Coverity. - -- channel: fix possible NULL dereference + No longer rely on DigitalOcean to host the Docker container. - ... in libssh2_channel_get_exit_signal(). Detected by Coverity. + Unfortunately we require a small dispatcher script that has + access to a GitHub access token with scope repo in order to + trigger the daemon workflow on GitHub Actions also for PRs. + + This script is hosted by myself for the time being until GitHub + provides a tighter scope to trigger the workflow_dispatch event. -- Revert "aes: the init function fails when OpenSSL has AES support" +GitHub (26 May 2021) +- [Will Cosgrove brought this change] + + openssl.c: guards around calling FIPS_mode() #596 (#603) - This partially reverts commit f4f2298ef3635acd031cc2ee0e71026cdcda5864. + Notes: + FIPS_mode() is not implemented in LibreSSL and this API is removed in OpenSSL 3.0 and was introduced in 0.9.7. Added guards around making this call. - We need to use the EVP_aes_???_ctr() functions in FIPS mode. + Credit: + Will Cosgrove -- crypt: use hard-wired cipher block sizes consistently +- [Will Cosgrove brought this change] -- openssl: do not ignore failure of EVP_CipherInit() + configure.ac: don't undefine scoped variable (#594) + + * configure.ac: don't undefine scoped variable + + To get this script to run with Autoconf 2.71 on macOS I had to remove the undefine of the backend for loop variable. It seems scoped to the for loop and also isn't referenced later in the script so it seems OK to remove it. + + * configure.ac: remove cygwin specific CFLAGS #598 + + Notes: + Remove cygwin specific Win32 CFLAGS and treat the build like a posix build + + Credit: + Will Cosgrove, Brian Inglis -- kex: do not ignore failure of libssh2_md5_init() +- [Laurent Stacul brought this change] + + tests: Makefile.am: Add missing tests client keys in distribution tarball (#604) - The MD5 algorithm is disabled when running in FIPS mode. + Notes: + Added missing test keys. + + Credit: + Laurent Stacul -Daniel Stenberg (21 Aug 2012) -- [Peter Krempa brought this change] +- [Laurent Stacul brought this change] - known_hosts: Fail when parsing unknown keys in known_hosts file. + Makefile.am: Add missing test keys in the distribution tarball (#601) - libssh2_knownhost_readfile() silently ignored problems when reading keys - in unsupported formats from the known hosts file. When the file is - written again from the internal structures of libssh2 it gets truntcated - to the point where the first unknown key was located. + Notes: + Fix tests missing key to build the OCI image - * src/knownhost.c:libssh2_knownhost_readfile() - return error if key - parsing fails + Credit: + Laurent Stacul -- AUTHORS: synced with 42fec44c8a4 +Daniel Stenberg (16 May 2021) +- dist: add src/agent.h - 31 recent authors added + Fixes #597 + Closes #599 -- [Dave Hayden brought this change] +GitHub (12 May 2021) +- [Will Cosgrove brought this change] - compression: add support for zlib@openssh.com + packet.c: Reset read timeout after received a packet (#576) (#586) - Add a "use_in_auth" flag to the LIBSSH2_COMP_METHOD struct and a - separate "zlib@openssh.com" method, along with checking session->state - for LIBSSH2_STATE_AUTHENTICATED. Appears to work on the OpenSSH servers - I've tried against, and it should work as before with normal zlib - compression. + File: + packet.c + + Notes: + Attempt keyboard interactive login (Azure AD 2FA login) and use more than 60 seconds to complete the login, the connection fails. + + The _libssh2_packet_require function does almost the same as _libssh2_packet_requirev but this function sets state->start = 0 before returning. + + Credit: + teottin, Co-authored-by: Tor Erik Ottinsen -- [Dmitry Smirnov brought this change] +- [kkoenig brought this change] - configure: gcrypt doesn't come with pkg-config support + Support ECDSA certificate authentication (#570) - ... so use plain old -lgcrypt to the linker to link with it. + Files: hostkey.c, userauth.c, test_public_key_auth_succeeds_with_correct_ecdsa_key.c - Fixes #225 - -- sftp_read: Value stored to 'next' is never read + Notes: + Support ECDSA certificate authentication - Detected by clang-analyzer - -- publickey_init: errors are negative, fix check + Add a test for: + - Existing ecdsa basic public key authentication + - ecdsa public key authentication with a signed public key - Detected by clang-analyzer. + Credit: + kkoenig -- [Maxime Larocque brought this change] +- [Gabriel Smith brought this change] - session_free: wrong variable used for keeping state + agent.c: Add support for Windows OpenSSH agent (#517) - If libssh2_session_free is called without the channel being freed - previously by libssh2_channel_free a memory leak could occur. + Files: agent.c, agent.h, agent_win.c - A mismatch of states variables in session_free() prevent the call to - libssh2_channel_free function. session->state member is used instead of - session->free_state. + Notes: + * agent: Add support for Windows OpenSSH agent - It causes a leak of around 600 bytes on every connection on my systems - (Linux, x64 and PPC). + The implementation was partially taken and modified from that found in + the Portable OpenSSH port to Win32 by the PowerShell team, but mostly + based on the existing Unix OpenSSH agent support. - (Debugging done under contract for Accedian Networks) + https://github.com/PowerShell/openssh-portable - Fixes #246 + Regarding the partial transfer support implementation: partial transfers + are easy to deal with, but you need to track additional state when + non-blocking IO enters the picture. A tracker of how many bytes have + been transfered has been placed in the transfer context struct as that's + where it makes most sense. This tracker isn't placed behind a WIN32 + #ifdef as it will probably be useful for other agent implementations. + + * agent: win32 openssh: Disable overlapped IO + + Non-blocking IO is not currently supported by the surrounding agent + code, despite a lot of the code having everything set up to handle it. + + Credit: + Co-authored-by: Gabriel Smith -Guenter Knauf (29 Jun 2012) -- Small NetWare makefile tweak. +- [Zenju brought this change] -- Some small Win32 makefile fixes. + Fix detailed _libssh2_error being overwritten (#473) + + Files: openssl.c, pem.c, userauth.c + + Notes: + * Fix detailed _libssh2_error being overwritten by generic errors + * Unified error handling + + Credit: + Zenju -Daniel Stenberg (19 Jun 2012) -- libssh2_userauth_publickey_fromfile_ex.3: mention publickey == NULL +- [Paul Capron brought this change] -- comp_method_zlib_decomp: handle Z_BUF_ERROR when inflating + Fix _libssh2_random() silently discarding errors (#520) - When using libssh2 to perform an SFTP file transfer from the "JSCAPE MFT - Server" (http://www.jscape.com) the transfer failed. The default JSCAPE - configuration is to enforce zlib compression on SSH2 sessions so the - session was compressed. The relevant part of the debug trace contained: + Notes: + * Make _libssh2_random return code consistent - [libssh2] 1.052750 Transport: unhandled zlib error -5 - [libssh2] 1.052750 Failure Event: -29 - decompression failure + Previously, _libssh2_random was advertized in HACKING.CRYPTO as + returning `void` (and was implemented that way in os400qc3.c), but that + was in other crypto backends a lie; _libssh2_random is (a macro + expanding) to an int-value expression or function. - The trace comes from comp_method_zlib_decomp() in comp.c. The "unhandled - zlib error -5" is the status returned from the zlib function - inflate(). The -5 status corresponds to "Z_BUF_ERROR". + Moreover, that returned code was: + — 0 or success, -1 on error for the MbedTLS & WinCNG crypto backends + But also: + — 1 on success, -1 or 0 on error for the OpenSSL backend! + – 1 on success, error cannot happen for libgcrypt! - The inflate() function takes a pointer to a z_stream structure and - "inflates" (decompresses) as much as it can. The relevant fields of the - z_stream structure are: + This commit makes explicit that _libssh2_random can fail (because most of + the underlying crypto functions can indeed fail!), and it makes its result + code consistent: 0 on success, -1 on error. - next_in - pointer to the input buffer containing compressed data - avail_in - the number of bytes available at next_in - next_out - pointer to the output buffer to be filled with uncompressed - data - avail_out - how much space available at next_out + This is related to issue #519 https://github.com/libssh2/libssh2/issues/519 + It fixes the first half of it. - To decompress data you set up a z_stream struct with the relevant fields - filled in and pass it to inflate(). On return the fields will have been - updated so next_in and avail_in show how much compressed data is yet to - be processed and next_out and avail_out show how much space is left in - the output buffer. + * Don't silent errors of _libssh2_random - If the supplied output buffer is too small then on return there will be - compressed data yet to be processed (avail_in != 0) and inflate() will - return Z_OK. In this case the output buffer must be grown, avail_out - updated and inflate() called again. + Make sure to check the returned code of _libssh2_random(), and + propagates any failure. - If the supplied output buffer was big enough then on return the - compressed data will have been exhausted (avail_in == 0) and inflate() - will return Z_OK, so the data has all been uncompressed. + A new LIBSSH_ERROR_RANDGEN constant is added to libssh2.h + None of the existing error constants seemed fit. - There is a corner case where inflate() makes no progress. That is, there - may be unprocessed compressed data and space available in the output - buffer and yet the function does nothing. In this case inflate() will - return Z_BUF_ERROR. From the zlib documentation and the source code it - is not clear under what circumstances this happens. It could be that it - needs to write multiple bytes (all in one go) from its internal state to - the output buffer before processing the next chunk of input but but - can't because there is not enough space (though my guesses as to the - cause are not really relevant). Recovery from Z_BUF_ERROR is pretty - simple - just grow the output buffer, update avail_out and call - inflate() again. + This commit is related to d74285b68450c0e9ea6d5f8070450837fb1e74a7 + and to https://github.com/libssh2/libssh2/issues/519 (see the issue + for more info.) It closes #519. - The comp_method_zlib_decomp() function does not handle the case when - inflate() returns Z_BUF_ERROR. It treats it as a non-recoverable error - and basically aborts the session. + Credit: + Paul Capron + +- [Gabriel Smith brought this change] + + ci: Remove caching of docker image layers (#589) - Fixes #240 + Notes: + continued ci reliability work. + + Credit: + Gabriel Smith -Guenter Knauf (12 Jun 2012) -- MinGW makefile tweaks. +- [Gabriel Smith brought this change] + + ci: Speed up docker builds for tests (#587) - Use GNU tools when compiling on Linux. - Fixed dist and dev targets. + Notes: + The OpenSSH server docker image used for tests is pre-built to prevent + wasting time building it during a test, and unneeded rebuilds are + prevented by caching the image layers. + + Credit: + Gabriel Smith -- NetWare makefile tweaks. +- [Will Cosgrove brought this change] + + userauth.c: don't error if using keys without RSA (#555) - Changed to use Windows commandline tools instead of - GNU tools when compiling on Windows. Fixed dist and - dev targets. Enabled nlmconv error for unresolved - symbols. + file: userauth.c + + notes: libssh2 now supports many other key types besides RSA, if the library is built without RSA support and a user attempts RSA auth it shouldn't be an automatic error + + credit: + Will Cosgrove -Daniel Stenberg (11 Jun 2012) -- Revert "config.rpath: generated file, no need to keep in git" +- [Marc brought this change] + + openssl.c: Avoid OpenSSL latent error in FIPS mode (#528) - This reverts commit 1ac7bd09cc685755577fb2c8829adcd081e7ab3c. + File: + openssl.c - This file still used by lib/*m4 functions so we need to keep the file - around. + Notes: + Avoid initing MD5 digest, which is not permitted in OpenSSL FIPS certified cryptography mode. + + Credit: + Marc -- BINDINGS: added PySsh2, a Python-ctypes binding +- [Laurent Stacul brought this change] -Guenter Knauf (8 Jun 2012) -- Fixed MinGW debug build. + openssl.c: Fix EVP_Cipher interface change in openssl 3 #463 + + File: + openssl.c + + Notes: + Fixes building with OpenSSL 3, #463. + + The change is described there: + https://github.com/openssl/openssl/commit/f7397f0d58ce7ddf4c5366cd1846f16b341fbe43 + + Credit: + Laurent Stacul, reported by Sergei -Daniel Stenberg (5 Jun 2012) -- BINDINGS: Added the Cocoa/Objective-C one +- [Gabriel Smith brought this change] + + openssh_fixture.c: Fix potential overwrite of buffer when reading stdout of command (#580) - ... and sorted the bindings after the languages, alphabetically + File: + openssh_fixture.c + Notes: + If reading the full output from the executed command took multiple + passes (such as when reading multiple lines) the old code would read + into the buffer starting at the some position (the start) every time. + The old code only works if fgets updated p or had an offset parameter, + both of which are not true. - Reported by: Mike Abdullah + Credit: + Gabriel Smith -- BINDINGS: document the bindings we know of +- [Gabriel Smith brought this change] -Guenter Knauf (4 Jun 2012) -- Fixed LIBSSH2_INT64_T_FORMAT macro. + ci: explicitly state the default branch (#585) - Usually a format macro should hold the whole format, otherwise - it should be named a prefix. Also fixed usage of this macro in - scp.c for a signed var where it was used as prefix for unsigned. + Notes: + It looks like the $default-branch macro only works in templates, not + workflows. This is not explicitly stated anywhere except the linked PR + comment. + + https://github.com/actions/starter-workflows/pull/590#issuecomment-672360634 + + credit: + Gabriel Smith -- Removed obsolete define from makefiles. +- [Gabriel Smith brought this change] -- Renamed NetWare makefiles. + ci: Swap from Travis to Github Actions (#581) + + Files: ci files + + Notes: + Move Linux CI using Github Actions + + Credit: + Gabriel Smith, Marc Hörsken -- Renamed NetWare makefiles. +- [Mary brought this change] -- Synced MinGW makefiles with 56c64a6..39e438f. + libssh2_priv.h: add iovec on 3ds (#575) - Also synced MinGW test makefile with b092696..f8cb874. + file: libssh2_priv.h + note: include iovec for 3DS + credit: Mary Mstrodl -Peter Stuge (30 May 2012) -- Revert "sftp: Don't send attrs.permissions on read-only SSH_FXP_OPEN" +- [Laurent Stacul brought this change] + + Tests: Fix unused variables warning (#561) - This reverts commit 04e79e0c798674a0796be8a55f63dd92e6877790. + file: test_public_key_auth_succeeds_with_correct_ed25519_key_from_mem.c + + notes: fixed unused vars + + credit: + Laurent Stacul -- sftp: Don't send attrs.permissions on read-only SSH_FXP_OPEN +- [Viktor Szakats brought this change] + + bcrypt_pbkdf.c: fix clang10 false positive warning (#563) - This works around a protocol violation in the ProFTPD 1.3.4 mod_sftp - server, as reported by Will Cosgrove in: + File: bcrypt_pbkdf.c - http://libssh2.org/mail/libssh2-devel-archive-2012-05/0079.shtml + Notes: + blf_enc() takes a number of 64-bit blocks to encrypt, but using + sizeof(uint64_t) in the calculation triggers a warning with + clang 10 because the actual data type is uint32_t. Pass + BCRYPT_BLOCKS / 2 for the number of blocks like libc bcrypt(3) + does. - Based on a suggested fix by TJ Saunders in: + Ref: https://github.com/openbsd/src/commit/04a2240bd8f465bcae6b595d912af3e2965856de - http://libssh2.org/mail/libssh2-devel-archive-2012-05/0104.shtml - -Guenter Knauf (28 May 2012) -- Try to detect OpenSSL build type automatically. + Fixes #562 - Also fixed recently added libgdi32 linkage which is only - required when OpenSSL libs are linked statically. + Credit: + Viktor Szakats -Daniel Stenberg (25 May 2012) -- config.rpath: generated file, no need to keep in git +- [Will Cosgrove brought this change] -Guenter Knauf (22 May 2012) -- Updated dependency libary versions. + transport.c: release payload on error (#554) + + file: transport.c + notes: If the payload is invalid and there is an early return, we could leak the payload + credit: + Will Cosgrove -Daniel Stenberg (18 May 2012) -- 1.4.3: towards the future +- [Will Cosgrove brought this change] -Version 1.4.2 (18 May 2012) + ssh2_client_fuzzer.cc: fixed building + + The GitHub web editor did some funky things -Daniel Stenberg (18 May 2012) -- RELEASE-NOTES: synced with 92a9f952794 +- [Will Cosgrove brought this change] -Alexander Lamaison (15 May 2012) -- win32/libssh2_config.h: Remove hardcoded #define LIBSSH2_HAVE_ZLIB. + ssh_client_fuzzer.cc: set blocking mode on (#553) - Rationale: Everything else in this file states a fact about the win32 - platform that is unconditional for that platform. There is nothing - unconditional about the presence of zlib. It is neither included with - Windows nor with the platform SDK. Therefore, this is not an appropriate - place to assert its presence. Especially as, once asserted, it cannot be - overridden using a compiler flag. + file: ssh_client_fuzzer.cc - In contrast, if it is omitted, then it can easily be reasserted by adding - a compiler flag defining LIBSSH2_HAVE_ZLIB. + notes: the session needs blocking mode turned on to avoid EAGAIN being returned from libssh2_session_handshake() + + credit: + Will Cosgrove, reviewed by Michael Buckley -Daniel Stenberg (14 May 2012) -- RELEASE-NOTES: synced with 69a3354467c +- [Etienne Samson brought this change] -- _libssh2_packet_add: SSH_MSG_CHANNEL_REQUEST default to want_reply + Add a LINT option to CMake (#372) - RFC4254 says the default 'want_reply' is TRUE but the code defaulted to - FALSE. Now changed. + * ci: make style-checking available locally - Fixes #233 - -- gettimeofday: no need for a replacement under cygwin + * cmake: add a linting target - Fixes #224 + * tests: check test suite syntax with checksrc.pl -Alexander Lamaison (13 May 2012) -- Prevent sftp_packet_read accessing freed memory. +- [Will Cosgrove brought this change] + + kex.c: kex_agree_instr() improve string reading (#552) - sftp_packet_add takes ownership of the packet passed to it and (now that we - handle zombies) might free the packet. sftp_packet_read uses the packet type - byte as its return code but by this point sftp_packet_add might have freed - it. This change fixes the problem by caching the packet type before calling - sftp_packet_add. + * kex.c: kex_agree_instr() improve string reading - I don't understand why sftp_packet_read uses the packet type as its return - code. A future change might get rid of this entirely. + file: kex.c + notes: if haystack isn't null terminated we should use memchr() not strchar(). We should also make sure we don't walk off the end of the buffer. + credit: + Will Cosgrove, reviewed by Michael Buckley -Daniel Stenberg (12 May 2012) -- sftp_packet_flush: flush zombies too - - As this function is called when the SFTP session is closed, it needs to - also kill all zombies left in the SFTP session to avoid leaking memory - just in case some zombie would still be in there. +- [Will Cosgrove brought this change] -- sftp_packetlist_flush: zombies must not have responses already + kex.c: use string_buf in ecdh_sha2_nistp (#551) - When flushing the packetlist, we must only add the request as a zombie - if no response has already been received. Otherwise we could wrongly - make it a zombie even though the response was already received and then - we'd get a zombie stuck there "forever"... - -- sftp_read: on EOF remove packet before flush + * kex.c: use string_buf in ecdh_sha2_nistp - Since the sftp_packetlist_flush() function will move all the existing - FXP_READ requests in this handle to the zombie list we must first remove - this just received packet as it is clearly not a zombie. - -- sftp_packet_require: sftp_packet_read() returning 0 is not an error + file: kex.c - Exactly as the comment in the code said, checking the return code from - sftp_packet_read() with <= was wrong and it should be < 0. With the new - filtering on incoming packets that are "zombies" we can now see this - getting zero returned. + notes: + use string_buf in ecdh_sha2_nistp() to avoid attempting to parse malformed data -- sftp_packetlist_flush: only make it zombie if it was sent +- [Will Cosgrove brought this change] + + kex.c: move EC macro outside of if check #549 (#550) - The list of outgoing packets may also contain packets that never were - sent off and we better not make them zombies too. + File: kex.c + + Notes: + Moved the macro LIBSSH2_KEX_METHOD_EC_SHA_HASH_CREATE_VERIFY outside of the LIBSSH2_ECDSA since it's also now used by the ED25519 code. + + Sha 256, 384 and 512 need to be defined for all backends now even if they aren't used directly. I believe this is already the case, but just a heads up. + + Credit: + Stefan-Ghinea -- [Alexander Lamaison brought this change] +- [Tim Gates brought this change] - Mark outstanding read requests after EOF as zombies. + kex.c: fix simple typo, niumber -> number (#545) - In order to be fast, sftp_read sends many read requests at once. With a small - file, this can mean that when EOF is received back, many of these requests are - still outstanding. Responses arriving after we close the file and abandon the - file handle are queued in the SFTP packet queue and never collected. This - causes transfer speed to drop as a progressively longer queue must be searched - for every packet. + File: kex.c - This change introduces a zombie request-ID list in the SFTP session that is - used to recognise these outstanding requests and prevent them being added to - the queue. + Notes: + There is a small typo in src/kex.c. + + Should read `number` rather than `niumber`. + + Credit: + Tim Gates -Peter Stuge (23 Apr 2012) -- [Rafael Kitover brought this change] +- [Tseng Jun brought this change] - Update win32/GNUmakefile to use OpenSSL 1.0.1a + session.c: Correct a typo which may lead to stack overflow (#533) - libcrypto on win32 now depends on gdi32.dll, so move the OpenSSL LDLIBS - block to before the compiler definitions, so that libcrypto gets added - first, and then add -lgdi32 into the following common LDLIBS for gcc. + File: session.c + + Notes: + Seems the author intend to terminate banner_dup buffer, later, print it to the debug console. + + Author: + Tseng Jun -Guenter Knauf (23 Apr 2012) -- Changed 'Requires' to 'Requires.private'. +Marc Hoersken (10 Oct 2020) +- wincng: fix random big number generation to match openssl - Only static builds need to link against the crypto libs. + The old function would set the least significant bits in + the most significant byte instead of the most significant bits. + + The old function would also zero pad too much bits in the + most significant byte. This lead to a reduction of key space + in the most significant byte according to the following listing: + - 8 bits reduced to 0 bits => eg. 2048 bits to 2040 bits DH key + - 7 bits reduced to 1 bits => eg. 2047 bits to 2041 bits DH key + - 6 bits reduced to 2 bits => eg. 2046 bits to 2042 bits DH key + - 5 bits reduced to 3 bits => eg. 2045 bits to 2043 bits DH key + + No change would occur for the case of 4 significant bits. + For 1 to 3 significant bits in the most significant byte + the DH key would actually be expanded instead of reduced: + - 3 bits expanded to 5 bits => eg. 2043 bits to 2045 bits DH key + - 2 bits expanded to 6 bits => eg. 2042 bits to 2046 bits DH key + - 1 bits expanded to 7 bits => eg. 2041 bits to 2047 bits DH key + + There is no case of 0 significant bits in the most significant byte + since this would be a case of 8 significant bits in the next byte. + + At the moment only the following case applies due to a fixed + DH key size value currently being used in libssh2: + + The DH group_order is fixed to 256 (bytes) which leads to a + 2047 bits DH key size by calculating (256 * 8) - 1. + + This means the DH keyspace was previously reduced from 2047 bits + to 2041 bits (while the top and bottom bits are always set), so the + keyspace is actually always reduced from 2045 bits to 2039 bits. + + All of this is only relevant for Windows versions supporting the + WinCNG backend (Vista or newer) before Windows 10 version 1903. + + Closes #521 -- Fixed 'Requires:' names. +Daniel Stenberg (28 Sep 2020) +- libssh2_session_callback_set.3: explain the recv/send callbacks - The 'Requires:' line lists the names of the .pc files. + Describe how to actually use these callbacks. + + Closes #518 -- Added 'Requires:' line to libssh2.pc. +GitHub (23 Sep 2020) +- [Will Cosgrove brought this change] + + agent.c: formatting - This is necessary so that other libs which lookup libssh2 info - via pkg-config can add the right crypto lib dependencies. + Improved formatting of RECV_SEND_ALL macro. -- Updated dependency lib versions. +- [Will Cosgrove brought this change] -Peter Stuge (18 Apr 2012) -- configure.ac: Add option to disable build of the example applications + CMakeLists.txt: respect install lib dir #405 (#515) - Examples are built by default. Any of the following options on the - configure command line will skip building them: + Files: + CMakeLists.txt - --disable-examples-build - --enable-examples-build=no - --enable-examples-build=false + Notes: + Use CMAKE_INSTALL_LIBDIR directory + + Credit: Arfrever -- userauth.c: fread() from public key file to correctly detect any errors +- [Will Cosgrove brought this change] + + kex.c: group16-sha512 and group18-sha512 support #457 (#468) - If the filename parameter for file_read_publickey() was the name of a - directory instead of a file then libssh2 would spin trying to fgetc() - from the FILE * for the opened directory when trying to determine the - length of the encoded public key, since fgetc() can't report errors. + Files: kex.c - Use fread() instead to correctly detect this error condition along - with many others. + Notes: + Added key exchange group16-sha512 and group18-sha512. As a result did the following: - This fixes the problem reported in - http://www.libssh2.org/mail/libssh2-devel-archive-2012-04/0021.shtml + Abstracted diffie_hellman_sha256() to diffie_hellman_sha_algo() which is now algorithm agnostic and takes the algorithm as a parameter since we needed sha512 support. Unfortunately it required some helper functions but they are simple. + Deleted diffie_hellman_sha1() + Deleted diffie_hellman_sha1 specific macro + Cleaned up some formatting + Defined sha384 in os400 and wincng backends + Defined LIBSSH2_DH_MAX_MODULUS_BITS to abort the connection if we receive too large of p from the server doing sha1 key exchange. + Reorder the default key exchange list to match OpenSSH and improve security - Reported-by: Oleksiy Zagorskyi + Credit: + Will Cosgrove -- Return LIBSSH2_ERROR_SOCKET_DISCONNECT on EOF when reading banner +- [Igor Klevanets brought this change] -Guenter Knauf (17 Apr 2012) -- Fixed copyright year. + agent.c: Recv and send all bytes via network in agent_transact_unix() (#510) + + Files: agent.c + + Notes: + Handle sending/receiving partial packet replies in agent.c API. + + Credit: Klevanets Igor -- Updated dependency lib versions in static makefiles. +- [Daniel Stenberg brought this change] -Daniel Stenberg (6 Apr 2012) -- version: bump to 1.4.2 + Makefile.am: include all test files in the dist #379 - We're on the 1.4.2 track now (at least) - -Version 1.4.1 (4 Apr 2012) + File: + Makefile.am + + Notes: + No longer conditionally include OpenSSL specific test files, they aren't run if we're not building against OpenSSL 1.1.x anyway. + + Credit: + Daniel Stenberg -Daniel Stenberg (4 Apr 2012) -- RELEASE-NOTES: updated for 1.4.1 release +- [Max Dymond brought this change] -- always do "forced" window updates + Add support for an OSS Fuzzer fuzzing target (#392) - When calling _libssh2_channel_receive_window_adjust() internally, we now - always use the 'force' option to prevent libssh2 to avoid sending the - update if the update isn't big enough. + Files: + .travis.yml, configure.ac, ossfuzz - It isn't fully analyzed but we have seen corner cases which made a - necessary window update not get send due to this and then the other side - doesn't send data our side then sits waiting for forever. + Notes: + This adds support for an OSS-Fuzz fuzzing target in ssh2_client_fuzzer, + which is a cut down example of ssh2.c. Future enhancements can improve + coverage. + + Credit: + Max Dymond -- channel_read: force window adjusts! +- [Sebastián Katzer brought this change] + + mbedtls.c: ECDSA support for mbed TLS (#385) - if there's not enough room to receive the data that's being requested, - the window adjustment needs to be sent to the remote and thus the force - option has to be used. _libssh2_channel_receive_window_adjust() would - otherwise "queue" small window adjustments for a later packet but that - is really terribly for the small buffer read that for example is the - final little piece of a very large file as then there is no logical next - packet! + Files: + mbedtls.c, mbedtls.h, .travis.yml - Reported by: Armen Babakhanian - Bug: http://www.libssh2.org/mail/libssh2-devel-archive-2012-03/0130.shtml - -- [Paul Howarth brought this change] + Notes: + This PR adds support for ECDSA for both key exchange and host key algorithms. + + The following elliptic curves are supported: + + 256-bit curve defined by FIPS 186-4 and SEC1 + 384-bit curve defined by FIPS 186-4 and SEC1 + 521-bit curve defined by FIPS 186-4 and SEC1 + + Credit: + Sebastián Katzer - aes: the init function fails when OpenSSL has AES support +Marc Hoersken (1 Sep 2020) +- buildconf: exec autoreconf to avoid additional process (#512) - The internal init function only worked fine when the configure script - didn't detect the OpenSSL AES_CTR function! + Also make buildconf exit with the return code of autoreconf. - Bug: http://www.libssh2.org/mail/libssh2-devel-archive-2012-03/0111.shtml - Reported by: Paul Howarth + Follow up to #224 -- [Matthew Booth brought this change] +- scp.c: fix indentation in shell_quotearg documentation - transport_send: Finish in-progress key exchange before sending data +- wincng: make more use of new helper functions (#496) + +- wincng: make sure algorithm providers are closed once (#496) + +GitHub (10 Jul 2020) +- [David Benjamin brought this change] + + openssl.c: clean up curve25519 code (#499) - _libssh2_channel_write() first reads outstanding packets before writing - new data. If it reads a key exchange request, it will immediately start - key re-exchange, which will require sending a response. If the output - socket is full, this will result in a return from - _libssh2_transport_read() of LIBSSH2_ERROR_EAGAIN. In order not to block - a write because there is no data to read, this error is explicitly - ignored and the code continues marshalling a packet for sending. When it - is sent, the remote end immediately drops the connection because it was - expecting a continuation of the key exchange, but got a data packet. + File: openssl.c, openssl.h, crypto.h, kex.c - This change adds the same check for key exchange to - _libssh2_transport_send() that is in _libssh2_transport_read(). This - ensures that key exchange is completed before any data packet is sent. - -- channel_write: acknowledge transport errors + Notes: + This cleans up a few things in the curve25519 implementation: - When draining data off the socket with _libssh2_transport_read() (which - in turn has to be done so that we can be sure to have read any possible - window-increasing packets), this code previously ignored errors which - could lead to nasty loops. Now all error codes except EAGAIN will cause - the error to be returned at once. + - There is no need to create X509_PUBKEYs or PKCS8_PRIV_KEY_INFOs to + extract key material. EVP_PKEY_get_raw_private_key and + EVP_PKEY_get_raw_public_key work fine. - Bug: http://www.libssh2.org/mail/libssh2-devel-archive-2012-03/0068.shtml - Reported by: Matthew Booth + - libssh2_x25519_ctx was never used (and occasionally mis-typedefed to + libssh2_ed25519_ctx). Remove it. The _libssh2_curve25519_new and + _libssh2_curve25519_gen_k interfaces use the bytes. Note, if it needs + to be added back, there is no need to roundtrip through + EVP_PKEY_new_raw_private_key. EVP_PKEY_keygen already generated an + EVP_PKEY. + + - Add some missing error checks. + + Credit: + David Benjamin -- [Steven Dake brought this change] +- [Will Cosgrove brought this change] - In examples/x11.c, Make sure sizeof passed to read operation is correct + transport.c: socket is disconnected, return error (#500) - sizeof(buf) expands to 8 or 4 (since its a pointer). This variable may - have been static in the past, leading to this error. + File: transport.c - Signed-off-by: Steven Dake + Notes: + This is to fix #102, instead of continuing to attempt to read a disconnected socket, it will now error out. + + Credit: + TDi-jonesds -- [Steven Dake brought this change] +- [Will Cosgrove brought this change] - Fix suspicious sizeof usage in examples/x11.c + stale.yml - In the x11 example, sizeof(buf) = 8UL (on x86_64), when this should - probably represent the buffer size available. I am not sure how to - test that this change is actually correct, however. + Increasing stale values. + +Marc Hoersken (6 Jul 2020) +- wincng: try newer DH API first, fallback to legacy RSA API - Signed-off-by: Steven Dake + Avoid the use of RtlGetVersion or similar Win32 functions, + since these depend on version information from manifests. + + This commit makes the WinCNG backend first try to use the + new DH algorithm API with the raw secret derivation feature. + In case this feature is not available the WinCNG backend + will fallback to the classic approach of using RSA-encrypt + to perform the required modular exponentiation of BigNums. + + The feature availability test is done during the first handshake + and the result is stored in the crypto backends global state. + + Follow up to #397 + Closes #484 -- sftp_packet_read: follow-up fix for EAGAIN/window adjust +- wincng: fix indentation of function arguments and comments - The commit in 7194a9bd7ba45 wasn't complete. This change makes sure - variables are initialized properly before used in the EAGAIN and window - adjust cases. + Follow up to #397 -- sftp_packet_add: use named error code instead of number +- [Wez Furlong brought this change] -- sftp_packet_add: verify the packet before accepting it + wincng: use newer DH API for Windows 8.1+ - In order to bail out as quickly as possible when things are wrong and - out of sync, make sure the SFTP message is one we understand. - -- SFTP: preserve the original error code more + Since Windows 1903 the approach used to perform DH kex with the CNG + API has been failing. - Lots of places in the code translated the original error into the more - generic LIBSSH2_ERROR_SOCKET_TIMEOUT but this turns out to distort the - original error reason a lot and makes tracking down the real origin of a - problem really hard. This change makes the original error code be - preserved to a larger extent when return up to the parent function. - -- sftp_packet_read: adjust window size as necessary + This commit switches to using the `DH` algorithm provider to perform + generation of the key pair and derivation of the shared secret. - Commit 03ca9020756 tried to simplify the window sizing logic but broke - SFTP readdir as there was no window sizing code left there so large - directory listings no longer worked. + It uses a feature of CNG that is not yet documented. The sources of + information that I've found on this are: - This change introduces window sizing logic to the sftp_packet_read() - function so that it now tells the remote about the local size having a - window size that suffice when it is about to ask for directory data. + * https://stackoverflow.com/a/56378698/149111 + * https://github.com/wbenny/mini-tor/blob/5d39011e632be8e2b6b1819ee7295e8bd9b7a769/mini/crypto/cng/dh.inl#L355 - Bug: http://www.libssh2.org/mail/libssh2-devel-archive-2012-03/0069.shtml - Reported by: Eric + With this change I am able to successfully connect from Windows 10 to my + ubuntu system. + + Refs: https://github.com/alexcrichton/ssh2-rs/issues/122 + Fixes: https://github.com/libssh2/libssh2/issues/388 + Closes: https://github.com/libssh2/libssh2/pull/397 -- [Steven Dake brought this change] +GitHub (1 Jul 2020) +- [Zenju brought this change] - Tell C compiler we don't care about return code of libssh2_init + comp.c: Fix name clash with ZLIB macro "compress" (#418) - The call of libssh2_init returns a return code, but nothing could be done - within the _libssh2_init_if_needed execution path. + File: comp.c - Signed-off-by: Steven Dake + Notes: + * Fix name clash with ZLIB macro "compress". + + Credit: + Zenju -- [Steven Dake brought this change] +- [yann-morin-1998 brought this change] - Add comment indicating a resource leak is not really a resource leak + buildsystem: drop custom buildconf script, rely on autoreconf (#224) - While possibly obvious to those investigating the code, coverity complains - about this out of scope leak. + Notes: + The buildconf script is currently required, because we need to copy a + header around, because it is used both from the library and the examples + sources. - Signed-off-by: Steven Dake + However, having a custom 'buildconf'-like script is not needed if we can + ensure that the header exists by the time it is needed. For that, we can + just append the src/ directory to the headers search path for the + examples. + + And then it means we no longer need to generate the same header twice, + so we remove the second one from configure.ac. + + Now, we can just call "autoreconf -fi" to generate the autotools files, + instead of relying on the canned sequence in "buildconf", since + autoreconf has now long known what to do at the correct moment (future + versions of autotools, automake, autopoint, autoheader etc... may + require an other ordering, or other intermediate steps, etc...). + + Eventually, get rid of buildconf now it is no longer needed. In fact, we + really keep it for legacy, but have it just call autoreconf (and print a + nice user-friendly warning). Don't include it in the release tarballs, + though. + + Update doc, gitignore, and travis-CI jobs accordingly. + + Credit: + Signed-off-by: "Yann E. MORIN" + Cc: Sam Voss -- [Steven Dake brought this change] +- [Will Cosgrove brought this change] - Use safer snprintf rather then sprintf in scp_send() + libssh2.h: Update Diffie Hellman group values (#493) - Signed-off-by: Steven Dake + File: libssh2.h + + Notes: + Update the min, preferred and max DH group values based on RFC 8270. + + Credit: + Will Cosgrove, noted from email list by Mitchell Holland -- [Steven Dake brought this change] +Marc Hoersken (22 Jun 2020) +- travis: use existing Makefile target to run checksrc - Use safer snprintf rather then sprintf in scp_recv() +- Makefile: also run checksrc on test source files + +- tests: avoid use of deprecated function _sleep (#490) + +- tests: avoid use of banned function strncat (#489) + +- tests: satisfy checksrc regarding max line length of 79 chars - While the buffer is indeed allocated to a safe length, better safe then sorry. + Follow up to 2764bc8e06d51876b6796d6080c6ac51e20f3332 + +- tests: satisfy checksrc with whitespace only fixes - Signed-off-by: Steven Dake + checksrc.pl -i4 -m79 -ASIZEOFNOPAREN -ASNPRINTF + -ACOPYRIGHT -AFOPENMODE tests/*.[ch] -- [Steven Dake brought this change] +- tests: add support for ports published via Docker for Windows - use snprintf in knownhost_writeline() rather then sprintf +- tests: restore retry behaviour for docker-machine ip command + +- tests: fix mix of declarations and code failing C89 compliance + +- wincng: add and improve checks in bit counting function + +- wincng: align bits to bytes calculation in all functions + +- wincng: do not disable key validation that can be enabled - Although the function checks the length, if the code was in error, there - could potentially be a buffer overrun with the use of sprintf. Instead replace - with snprintf. + The modular exponentiation also works with key validation enabled. + +- wincng: fix return value in _libssh2_dh_secret - Signed-off-by: Steven Dake + Do not ignore return value of modular exponentiation. -- [Steven Dake brought this change] +- appveyor: build and run tests for WinCNG crypto backend - Add tracing to print packets left on session at libssh2_session_free - - Signed-off-by: Steven Dake +GitHub (1 Jun 2020) +- [suryakalpo brought this change] -Peter Stuge (2 Mar 2012) -- Define and use LIBSSH2_INVALID_SOCKET instead of INVALID_SOCKET + INSTALL_CMAKE.md: Update formatting (#481) - INVALID_SOCKET is a special value in Windows representing a - non-valid socket identifier. We were #defining this to -1 on - non-Windows platforms, causing unneccessary namespace pollution. - Let's have our own identifier instead. + File: INSTALL_CMAKE.md - Thanks to Matt Lawson for pointing this out. + Notes: + Although the original text would be immediately clear to seasoned users of CMAKE and/or Unix shell, the lack of newlines may cause some confusion for newcomers. Hence, wrapping the texts in a md code-block such that the newlines appear as intended. + + credit: + suryakalpo -- nw/Makefile.netware: Fix project name typo to avoid needless confusion - -- example/x11: Set raw terminal mode manually instead of with cfmakeraw() - - OpenSolaris has no cfmakeraw() so to make the example more portable - we simply do the equivalent operations on struct termios ourselves. +Marc Hoersken (31 May 2020) +- src: add new and align include guards in header files (#480) - Thanks to Tom Weber for reporting this problem, and finding a solution. + Make sure all include guards exist and follow the same format. -Daniel Stenberg (17 Feb 2012) -- sftp_write: cannot return acked data *and* EAGAIN +- wincng: fix multiple definition of `_libssh2_wincng' (#479) - Whenever we have acked data and is about to call a function that *MAY* - return EAGAIN we must return the number now and wait to get called - again. Our API only allows data *or* EAGAIN and we must never try to get - both. + Add missing include guard and move global state + from header to source file by using extern. -Peter Stuge (13 Feb 2012) -- example/x11: Build only when sys/un.h is found by configure +GitHub (28 May 2020) +- [Will Cosgrove brought this change] + + transport.c: moving total_num check from #476 (#478) - The example can't be built on systems without AF_UNIX sockets. + file: transport.c + + notes: + moving total_num zero length check from #476 up to the prior bounds check which already includes a total_num check. Makes it slightly more readable. + + credit: + Will Cosgrove -Daniel Stenberg (10 Feb 2012) -- [Alexander Lamaison brought this change] +- [lutianxiong brought this change] - Simplified sftp_read. + transport.c: fix use-of-uninitialized-value (#476) - Removed the total_read variable that originally must have tracked how - much data had been written to the buffer. With non-blocking reads, we - must return straight away once we have read data into the buffer so this - variable served not purpose. + file:transport.c - I think it was still hanging around in case the initial processing of - 'leftover' data meant we wrote to the buffer but this case, like the - others, must return immediately. Now that it does, the last remaining - need for the variable is gone. + notes: + return error if malloc(0) + + credit: + lutianxiong -- [Alexander Lamaison brought this change] +- [Dr. Koutheir Attouchi brought this change] - Cleaned up sftp_read and added more explanation. + libssh2_sftp.h: Changed type of LIBSSH2_FX_* constants to unsigned long, fixes #474 - Replaced the gotos which were implementing the state machine with - a switch statement which makes the states more explicit. - -- sftp_read: avoid data *and* EAGAIN + File: + libssh2_sftp.h - Whenever we have data and is about to call a function that *MAY* return - EAGAIN we must return the data now and wait to get called again. Our API - only allows data *or* EAGAIN and we must never try to get both. - -Peter Stuge (2 Feb 2012) -- Add a tcpip-forward example which demonstrates remote port forwarding + Notes: + Error constants `LIBSSH2_FX_*` are only returned by `libssh2_sftp_last_error()` which returns `unsigned long`. + Therefore these constants should be defined as unsigned long literals, instead of int literals. + + Credit: + Dr. Koutheir Attouchi -- libssh2.h: Add missing prototype for libssh2_session_banner_set() +- [monnerat brought this change] -- example/subsystem_netconf.c: Return error when read buffer is too small + os400qc3.c: constify libssh2_os400qc3_hash_update() data parameter. (#469) - Also remove a little redundancy in the read loop condition. + Files: os400qc3.c, os400qc3.h + + Notes: + Fixes building on OS400. #426 + + Credit: + Reported-by: hjindra on github, dev by Monnerat -- example/subsystem_netconf.c: Add a missing newline in an error message +- [monnerat brought this change] -- Fix undefined reference to _libssh_error in libgcrypt backend + HACKING.CRYPTO: keep up to date with new crypto definitions from code. (#466) - Commit 209de22299b4b58e582891dfba70f57e1e0492db introduced a function - call to a non-existing function, and since then the libgcrypt backend - has not been buildable. - -Version 1.4.0 (31 Jan 2012) + File: HACKING.CRYPTO + + Notes: + This commit updates the HACKING.CRYPTO documentation file in an attempt to make it in sync with current code. + New documented features are: + + SHA384 + SHA512 + ECDSA + ED25519 + + Credit: + monnerat -Daniel Stenberg (31 Jan 2012) -- RELEASE-NOTES: synced with 6bd584d29 for 1.4.0 +- [Harry Sintonen brought this change] -- s/1.3.1/1.4.0 + kex.c: Add diffie-hellman-group14-sha256 Key Exchange Method (#464) - We're bumping the minor number + File: kex.c + + Notes: Added diffie-hellman-group14-sha256 kex + + Credit: Harry Sintonen -- [Jernej Kovacic brought this change] +- [Will Cosgrove brought this change] - libssh2_session_supported_algs: fix compiler warning + os400qc3.h: define sha512 macros (#465) + + file: os400qc3.h + notes: fixes for building libssh2 1.9.x -- [Jernej Kovacic brought this change] +- [Will Cosgrove brought this change] - session_supported_algs docs: added an example + os400qc3.h: define EC types to fix building #426 (#462) + + File: os400qc3.h + Notes: define missing EC types which prevents building + Credit: hjindra -- [Gellule Xg brought this change] +- [Brendan Shanks brought this change] - sftp-seek: clear EOF flag + hostkey.c: Fix 'unsigned int'/'uint32_t' mismatch (#461) - Set the EOF flag to False when calling seek64 to be able to get some - data back on a following read + File: hostkey.c + + Notes: + These types are the same size so most compilers are fine with it, but CodeWarrior (on classic MacOS) throws an â€illegal implicit conversion’ error + + Credit: Brendan Shanks -- [Peter Krempa brought this change] +- [Thomas Klausner brought this change] - userauth: Provide more informations if ssh pub key extraction fails + Makefile.am: Fix unportable test(1) operator. (#459) - If the function that extracts/computes the public key from a private key - fails the errors it reports were masked by the function calling it. This - patch modifies the key extraction function to return errors using - _libssh_error() function. The error messages are tweaked to contain - reference to the failed operaton in addition to the reason. + file: Makefile.am - * AUTHORS: - add my name - * libgcrypt.c: _libssh2_pub_priv_keyfile(): - return a more verbose - error using - _libssh2_error() func. - * openssl.c: - modify call graph of _libssh2_pub_priv_keyfile() to use - _libssh2_error for error reporting(); - * userauth.c: - tweak functions calling _libssh2_pub_priv_keyfile() not - to shadow error messages + Notes: + The POSIX comparison operator for test(1) is =; bash supports == but not even test from GNU coreutils does. + + Credit: + Thomas Klausner -- TODO: remove issues we (sort of) did already +- [Tseng Jun brought this change] -- ssh2_exec: skip error outputs for EAGAIN + openssl.c: minor changes of coding style (#454) - Since the example uses non-blocking mode, it will just flood the output - with this "nonsense" error. + File: openssl.c + + Notes: + minor changes of coding style and align preprocessor conditional for #439 + + Credit: + Tseng Jun -Guenter Knauf (30 Nov 2011) -- Some NetWare makefile tweaks. +- [Hans Meier brought this change] -Daniel Stenberg (18 Nov 2011) -- LIBSSH2_SFTP_PACKET_MAXLEN: increase to 80000 + openssl.c: Fix for use of uninitialized aes_ctr_cipher.key_len (#453) - Some SFTP servers send SFTP packets larger than 40000. Since the limit - is only present to avoid insane sizes anyway, we can easily bump it. + File: + Openssl.c - The define was formerly in the public header libssh2_sftp.h but served - no external purpose and was moved into the source dir. + Notes: + * Fix for use of uninitialized aes_ctr_cipher.key_len when using HAVE_OPAQUE_STRUCTS, regression from #439 - Bug: http://www.libssh2.org/mail/libssh2-devel-archive-2011-11/0004.shtml - Reported by: Michael Harris + Credit: + Hans Meirer, Tseng Jun -Alexander Lamaison (18 Nov 2011) -- [Peter Krempa brought this change] +- [Zenju brought this change] - knownhost_check(): Don't dereference ext if NULL is passed + agent.c: Fix Unicode builds on Windows (#417) - Documentation for libssh2_knownhost_checkp() and related functions - states that the last argument is filled with data if non-NULL. + File: agent.c - "knownhost if set to non-NULL, it must be a pointer to a 'struct - libssh2_knownhost' pointer that gets filled in to point to info about a - known host that matches or partially matches." + Notes: + Fixes unicode builds for Windows in Visual Studio 16.3.2. - In this function ext is dereferenced even if set to NULL, causing - segfault in applications not needing the extra data. + Credit: + Zenju -Daniel Stenberg (11 Nov 2011) -- [Peter Krempa brought this change] +- [Hans Meier brought this change] - knownhost_add: Avoid dereferencing uninitialized memory on error path. + openssl.c: Fix use-after-free crash in openssl backend without memory leak (#439) - In function knownhost_add, memory is alocated for a new entry. If normal - alocation is used, memory is not initialized to 0 right after, but a - check is done to verify if correct key type is passed. This test is done - BEFORE setting the memory to null, and on the error path function - free_host() is called, that tries to dereference unititialized memory, - resulting into a glibc abort(). + Files: openssl.c - * knownhost.c - knownhost_add(): - move typemask check before alloc + Notes: + Fixes memory leaks and use after free AES EVP_CIPHER contexts when using OpenSSL 1.0.x. + + Credit: + Hans Meier -- windows build: add define to avoid compiler warning +- [Romain Geissler @ Amadeus brought this change] + + Session.c: Fix undefined warning when mixing with LTO-enabled libcurl. (#449) - A recent mingw compiler has started to complain on "#warning Please - include winsock2.h before windows.h" unless the magic define is set - first. + File: Session.c - Reported by: Vincent Torri - Bug: http://www.libssh2.org/mail/libssh2-devel-archive-2011-10/0064.shtml + Notes: + With gcc 9, libssh2, libcurl and LTO enabled for all binaries I see this + warning (error with -Werror): + + vssh/libssh2.c: In function â€ssh_statemach_act’: + /data/mwrep/rgeissler/ospack/ssh2/BUILD/libssh2-libssh2-03c7c4a/src/session.c:579:9: error: â€seconds_to_next’ is used uninitialized in this function [-Werror=uninitialized] + 579 | int seconds_to_next; + | ^ + lto1: all warnings being treated as errors + + Gcc normally issues -Wuninitialized when it is sure there is a problem, + and -Wmaybe-uninitialized when it's not sure, but it's possible. Here + the compiler seems to have find a real case where this could happen. I + looked in your code and overall it seems you always check if the return + code is non null, not often that it's below zero. I think we should do + the same here. With this patch, gcc is fine. + + Credit: + Romain-Geissler-1A -Henrik Nordstrom (31 Oct 2011) -- [Vincent Torri brought this change] +- [Zenju brought this change] - Correct Windows include file name case, simplifying cross-compilation + transport.c: Fix crash with delayed compression (#443) - When cross compiling to Windows, libssh2.h include Windows header files - with upper case filenames : BaseTsd.h and WinSock2.h. + Files: transport.c - These files have lowercase names with mingw-w64 (iirc, it's the same with - mingw). And as on Windows, being lowercase or uppercase does not matter. + Notes: + Fixes crash with delayed compression option using Bitvise server. + + Contributor: + Zenju -Daniel Stenberg (25 Oct 2011) -- [Jernej Kovacic brought this change] +- [Will Cosgrove brought this change] - libssh2_session_supported_algs: added + Update INSTALL_MAKE path to INSTALL_MAKE.md (#446) + + Included for #429 -- [Kamil Dudka brought this change] +- [Will Cosgrove brought this change] - example/sftp_RW_nonblock: do not ignore LIBSSH2_ERROR_EAGAIN + Update INSTALL_CMAKE filename to INSTALL_CMAKE.md (#445) - Bug: https://bugzilla.redhat.com/745420 + Fixing for #429 -Peter Stuge (5 Oct 2011) -- example/ssh2_agent: Print host key fingerprint before authentication +- [Wallace Souza brought this change] + + Rename INSTALL_CMAKE to INTALL_CMAKE.md (#429) - Also moves the comment about not being authenticated to before the - agent authentication takes place, so that it better matches the code. + Adding Markdown file extension in order to Github render the instructions properly -Daniel Stenberg (29 Sep 2011) -- OpenSSL EVP: fix threaded use of structs +Will Cosgrove (17 Dec 2019) +- [Daniel Stenberg brought this change] + + include/libssh2.h: fix comment: the known host key uses 4 bits (#438) + +- [Zenju brought this change] + + ssh-ed25519: Support PKIX + calc pubkey from private (#416) - Make sure we don't clear or reset static structs after first init so - that they work fine even when used from multiple threads. Init the - structs in the global init. + Files: openssl.c/h + Author: Zenju + Notes: + Adds support for PKIX key reading by fixing: - Help and assistance by: John Engstrom + _libssh2_pub_priv_keyfile() is missing the code to extract the ed25519 public key from a given private key - Fixes #229 (again) + _libssh2_ed25519_new_private_frommemory is only parsing the openssh key format but does not understand PKIX (as retrieved via PEM_read_bio_PrivateKey) -- openssl: don't init static structs differently +GitHub (15 Oct 2019) +- [Will Cosgrove brought this change] + + .travis.yml: Fix Chrome and 32 bit builds (#423) - make_ctr_evp() is changed to take a struct pointer, and then each - _libssh2_EVP_aes_[keylen]_ctr function is made to pass in their own - static struct + File: .travis.yml - Reported by: John Engstrom - Fixes #229 + Notes: + * Fix Chrome installing by using Travis build in directive + * Update to use libgcrypt20-dev package to fix 32 bit builds based on comments found here: + https://launchpad.net/ubuntu/xenial/i386/libgcrypt11-dev -Guenter Knauf (27 Sep 2011) -- Removed obsolete include path. +- [Will Cosgrove brought this change] -Daniel Stenberg (21 Sep 2011) -- read_state: clear the state variable better - - Set read_state back to idle before trying to send anything so that if - the state somehow is wrongly set. + packet.c: improved parsing in packet_x11_open (#410) - Also, avoid such a case of confusion by resetting the read_state when an - sftp handle is closed. + Use new API to parse data in packet_x11_open() for better bounds checking. -- sftp_read: remove leftover fprintf +Will Cosgrove (12 Sep 2019) +- [Michael Buckley brought this change] + + knownhost.c: Double the static buffer size when reading and writing known hosts (#409) - Reported by: Alexander Lamaison + Notes: + We had a user who was being repeatedly prompted to accept a server key repeatedly. It turns out the base64-encoded key was larger than the static buffers allocated to read and write known hosts. I doubled the size of these buffers. + + Credit: + Michael Buckley -- sftp.h: fix the #ifdef to prevent multiple inclusions +GitHub (4 Sep 2019) +- [Will Cosgrove brought this change] -- sftp_read: use a state variable to avoid bad writes + packet.c: improved packet parsing in packet_queue_listener (#404) - When a channel_write call has gotten an EAGAIN back, we try harder to - continue the same write in the subsequent invoke. + * improved bounds checking in packet_queue_listener + + file: packet.c + + notes: + improved parsing packet in packet_queue_listener -- window_size: explicit adjustments only +- [Will Cosgrove brought this change] + + packet.c: improve message parsing (#402) - Removed the automatic window_size adjustments from - _libssh2_channel_read() and instead all channel readers must now make - sure to enlarge the window sizes properly themselves. + * packet.c: improve parsing of packets - libssh2_channel_read_ex() - the public function, now grows the window - size according to the requested buffer size. Applications can still opt - to grow the window more on demand. Larger windows tend to give higher - performance. + file: packet.c - sftp_read() now uses the read-ahead logic to figure out a window_size. + notes: + Use _libssh2_get_string API in SSH_MSG_DEBUG/SSH_MSG_DISCONNECT. Additional uint32 bounds check in SSH_MSG_GLOBAL_REQUEST. -- libssh2.h: bump the default window size to 256K +- [Will Cosgrove brought this change] -- libssh2_userauth_keyboard_interactive.3: fix man warning + misc.c: _libssh2_ntohu32 cast bit shifting (#401) - It seemed to occur due to the excessive line length + To quite overly aggressive analyzers. + + Note, the builds pass, Travis is having some issues with Docker images. -- [Mikhail Gusarov brought this change] +- [Will Cosgrove brought this change] - Add missing .gitignore entries + kex.c: improve bounds checking in kex_agree_methods() (#399) + + file: kex.c + + notes: + use _libssh2_get_string instead of kex_string_pair which does additional checks -- [Mikhail Gusarov brought this change] +Will Cosgrove (23 Aug 2019) +- [Fabrice Fontaine brought this change] - Add manpage syntax checker to 'check' target + acinclude.m4: add mbedtls to LIBS (#371) - In virtually every libssh2 release Debian's lintian catches syntax errors in - manpages. Prevent it by checking manpages as a part of testsuite. + Notes: + This is useful for static builds so that the Libs.private field in + libssh2.pc contains correct info for the benefit of pkg-config users. + Static link with libssh2 requires this information. + + Signed-off-by: Baruch Siach + [Retrieved from: + https://git.buildroot.net/buildroot/tree/package/libssh2/0002-acinclude.m4-add-mbedtls-to-LIBS.patch] + Signed-off-by: Fabrice Fontaine + + Credit: + Fabrice Fontaine -- libssh2_banner_set.3: fix nroff syntax mistake +- [jethrogb brought this change] -Guenter Knauf (10 Sep 2011) -- Use predefined resource compiler macro. + Generate debug info when building with MSVC (#178) + + files: CMakeLists.txt + + notes: Generate debug info when building with MSVC + + credit: + jethrogb -- Added casts to silent compiler warnings. +- [Panos brought this change] -- Fixed uint64_t printf. + Add agent forwarding implementation (#219) + + files: channel.c, test_agent_forward_succeeds.c, libssh2_priv.h, libssh2.h, ssh2_agent_forwarding.c + + notes: + * Adding SSH agent forwarding. + * Fix agent forwarding message, updated example. + Added integration test code and cmake target. Added example to cmake list. + + credit: + pkittenis -- Fixed macro function signatures. +GitHub (2 Aug 2019) +- [Will Cosgrove brought this change] -- NetWare makefile tweaks. + Update EditorConfig + + Added max_line_length = 80 -- Removed unused var. +- [Will Cosgrove brought this change] -- Added 2 samples not mentioned. + global.c : fixed call to libssh2_crypto_exit #394 (#396) + + * global.c : fixed call to libssh2_crypto_exit #394 + + File: global.c + + Notes: Don't call `libssh2_crypto_exit()` until `_libssh2_initialized` count is down to zero. + + Credit: seba30 -- Dont build x11 sample with MinGW. +Will Cosgrove (30 Jul 2019) +- [hlefebvre brought this change] -- Fixed executable file description. + misc.c : Add an EWOULDBLOCK check for better portability (#172) + + File: misc.c + + Notes: Added support for all OS' that implement EWOULDBLOCK, not only VMS + + Credit: hlefebvre -- Removed unused var. +- [Etienne Samson brought this change] -- Kill stupid gcc 3.x uninitialized warning. + userauth.c: fix off by one error when loading public keys with no id (#386) + + File: userauth.c + + Credit: + Etienne Samson + + Notes: + Caught by ASAN: + + ================================================================= + ==73797==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x60700001bcf0 at pc 0x00010026198d bp 0x7ffeefbfed30 sp 0x7ffeefbfe4d8 + READ of size 69 at 0x60700001bcf0 thread T0 + 2019-07-04 08:35:30.292502+0200 atos[73890:2639175] examining /Users/USER/*/libssh2_clar [73797] + #0 0x10026198c in wrap_memchr (libclang_rt.asan_osx_dynamic.dylib:x86_64h+0x1f98c) + #1 0x1000f8e66 in file_read_publickey userauth.c:633 + #2 0x1000f2dc9 in userauth_publickey_fromfile userauth.c:1513 + #3 0x1000f2948 in libssh2_userauth_publickey_fromfile_ex userauth.c:1590 + #4 0x10000e254 in test_userauth_publickey__ed25519_auth_ok publickey.c:69 + #5 0x1000090c3 in clar_run_test clar.c:260 + #6 0x1000038f3 in clar_run_suite clar.c:343 + #7 0x100003272 in clar_test_run clar.c:522 + #8 0x10000c3cc in main runner.c:60 + #9 0x7fff5b43b3d4 in start (libdyld.dylib:x86_64+0x163d4) + + 0x60700001bcf0 is located 0 bytes to the right of 80-byte region [0x60700001bca0,0x60700001bcf0) + allocated by thread T0 here: + #0 0x10029e053 in wrap_malloc (libclang_rt.asan_osx_dynamic.dylib:x86_64h+0x5c053) + #1 0x1000b4978 in libssh2_default_alloc session.c:67 + #2 0x1000f8aba in file_read_publickey userauth.c:597 + #3 0x1000f2dc9 in userauth_publickey_fromfile userauth.c:1513 + #4 0x1000f2948 in libssh2_userauth_publickey_fromfile_ex userauth.c:1590 + #5 0x10000e254 in test_userauth_publickey__ed25519_auth_ok publickey.c:69 + #6 0x1000090c3 in clar_run_test clar.c:260 + #7 0x1000038f3 in clar_run_suite clar.c:343 + #8 0x100003272 in clar_test_run clar.c:522 + #9 0x10000c3cc in main runner.c:60 + #10 0x7fff5b43b3d4 in start (libdyld.dylib:x86_64+0x163d4) + + SUMMARY: AddressSanitizer: heap-buffer-overflow (libclang_rt.asan_osx_dynamic.dylib:x86_64h+0x1f98c) in wrap_memchr + Shadow bytes around the buggy address: + 0x1c0e00003740: fd fd fd fd fd fd fd fd fd fd fa fa fa fa fd fd + 0x1c0e00003750: fd fd fd fd fd fd fd fa fa fa fa fa 00 00 00 00 + 0x1c0e00003760: 00 00 00 00 00 00 fa fa fa fa 00 00 00 00 00 00 + 0x1c0e00003770: 00 00 00 fa fa fa fa fa fd fd fd fd fd fd fd fd + 0x1c0e00003780: fd fd fa fa fa fa fd fd fd fd fd fd fd fd fd fa + =>0x1c0e00003790: fa fa fa fa 00 00 00 00 00 00 00 00 00 00[fa]fa + 0x1c0e000037a0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa + 0x1c0e000037b0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa + 0x1c0e000037c0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa + 0x1c0e000037d0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa + 0x1c0e000037e0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa + Shadow byte legend (one shadow byte represents 8 application bytes): + Addressable: 00 + Partially addressable: 01 02 03 04 05 06 07 + Heap left redzone: fa + Freed heap region: fd + Stack left redzone: f1 + Stack mid redzone: f2 + Stack right redzone: f3 + Stack after return: f5 + Stack use after scope: f8 + Global redzone: f9 + Global init order: f6 + Poisoned by user: f7 + Container overflow: fc + Array cookie: ac + Intra object redzone: bb + ASan internal: fe + Left alloca redzone: ca + Right alloca redzone: cb + Shadow gap: cc -- Build all examples. +- [Thilo Schulz brought this change] -- More MinGW makefile tweaks. + openssl.c : Fix use-after-free crash on reinitialization of openssl backend - Renamed *.mingw makefiles to GNUmakefile since GNU make picks these - up automatically, and therefore win32/Makefile removed. + file : openssl.c + + notes : + libssh2's openssl backend has a use-after-free condition if HAVE_OPAQUE_STRUCTS is defined and you call libssh2_init() again after prior initialisation/deinitialisation of libssh2 + + credit : Thilo Schulz -- Removed forgotten WINSOCK_VERSION defines. +- [axjowa brought this change] -Daniel Stenberg (9 Sep 2011) -- libssh2_session_startup(3) => libssh2_session_handshake(3) + openssl.h : Use of ifdef where if should be used (#389) - Propagate for the current function in docs and examples. - libssh2_session_startup() is deprecated. - -- libssh2_banner_set => libssh2_session_banner_get + File : openssl.h - Marked the old function as deprecated. Added the new name in the correct - name space with the same arguments and functionality. - -- new function: libssh2_session_banner_get + Notes : + LIBSSH2_ECDSA and LIBSSH2_ED25519 are always defined so the #ifdef + checks would never be false. - Returns the banner from the server handshake + This change makes it possible to build libssh2 against OpenSSL built + without EC support. - Fixes #226 + Change-Id: I0a2f07c2d80178314dcb7d505d1295d19cf15afd + + Credit : axjowa -- libssh2.h: bump version to 1.4.0 for new function(s) +- [Zenju brought this change] -- remove embedded CVS/svn tags + Agent.c : Preserve error info from agent_list_identities() (#374) + + Files : agent.c + + Notes : + Currently the error details as returned by agent_transact_pageant() are overwritten by a generic "agent list id failed" message by int agent_list_identities(LIBSSH2_AGENT* agent). + + Credit : + Zenju -- [liuzl brought this change] +- [Who? Me?! brought this change] - API add:libssh2_sftp_get_channel + Channel.c: Make sure the error code is set in _libssh2_channel_open() (#381) - Return the channel of sftp, then caller can - control the channel's behavior. + File : Channel.c - Signed-off-by: liuzl + Notes : + if _libssh2_channel_open() fails, set the error code. + + Credit : + mark-i-m -- _libssh2_channel_read: react on errors from receive_window_adjust +- [Orgad Shaneh brought this change] + + Kex.c, Remove unneeded call to strlen (#373) - Previously the function would ignore all errors except for EAGAIN. + File : Kex.c + + Notes : + Removed call to strlen + + Credit : + Orgad Shaneh -- sftp_read: extend and clarify the documentation +- [Pedro Monreal brought this change] -- sftp_read: cap the read ahead maximum amount + Spelling corrections (#380) - Now we only go up to LIBSSH2_CHANNEL_WINDOW_DEFAULT*30 bytes SFTP read - ahead, which currently equals 64K*30 == 1966080 bytes. + Files : + libssh2.h, libssh2_sftp.h, bcrypt_pbkdf.c, mbedtls.c, sftp.c, ssh2.c + + Notes : + * Fixed misspellings + + Credit : + Pedro Monreal -- _libssh2_channel_read: fix non-blocking window adjusting +- [Sebastián Katzer brought this change] + + Fix Potential typecast error for `_libssh2_ecdsa_key_get_curve_type` (#383) - If EAGAIN is returned when adjusting the receive window, we must not - read from the transport directly until we've finished the adjusting. + Issue : #383 + + Files : hostkey.c, crypto.h, openssl.c + + Notes : + * Fix potential typecast error for `_libssh2_ecdsa_key_get_curve_type` + * Rename _libssh2_ecdsa_key_get_curve_type to _libssh2_ecdsa_get_curve_type + + Credit : + Sebastián Katzer -Guenter Knauf (8 Sep 2011) -- Fix for systems which need sys/select.h. +GitHub (20 Jun 2019) +- [Will Cosgrove brought this change] -- The files were not gone but renamed ... + bump copyright date -Daniel Stenberg (6 Sep 2011) -- sftp_read: added documenting comment - - Taken from some recent email conversations I added some descriptions of - the logic in sftp_read() to aid readers. +Version 1.9.0 (19 Jun 2019) -- 1.3.1: start the work +GitHub (19 Jun 2019) +- [Will Cosgrove brought this change] -Version 1.3.0 (6 Sep 2011) + 1.9 Formatting -Daniel Stenberg (6 Sep 2011) -- Makefile.am: the Makefile.win32 files are gone +- [Will Cosgrove brought this change] -- RELEASE-NOTES: updated for 1.3.0 + 1.9 Release notes -- sftp_read: a short read is not end of file +Will Cosgrove (17 May 2019) +- [Alexander Curtiss brought this change] + + libgcrypt.c : Fixed _libssh2_rsa_sha1_sign memory leak. (#370) - A returned READ packet that is short will now only reduce the - offset. + File: libgcrypt.c - This is a temporary fix as it is slightly better than the previous - approach but still not very good. + Notes : Added calls to gcry_sexp_release to free memory allocated by gcry_sexp_find_token + + Credit : + Reporter : beckmi + PR by: Alexander Curtiss -- [liuzl brought this change] +- [Orivej Desh brought this change] - _libssh2_packet_add: adjust window size when truncating + libssh2_priv.h : Fix musl build warning on sys/poll.h (#346) - When receiving more data than what the window size allows on a - particular channel, make sure that the window size is adjusted in that - case too. Previously it would only adjust the window in the non-error - case. + File : libssh2_priv.h + + Notes : + musl prints `redirecting incorrect #include to ` + http://git.musl-libc.org/cgit/musl/commit/include/sys/poll.h?id=54446d730cfb17c5f7bcf57f139458678f5066cc + + poll is defined by POSIX to be in poll.h: + http://pubs.opengroup.org/onlinepubs/7908799/xsh/poll.html + + Credit : Orivej Desh -Guenter Knauf (29 Aug 2011) -- Silent compiler warning with MinGW64. +GitHub (1 May 2019) +- [Will Cosgrove brought this change] -- Fixed link to native Win32 awk tool. + kex.c : additional bounds checks in diffie_hellman_sha1/256 (#361) + + Files : kex.c, misc.c, misc.h + + Notes : + Fixed possible out of bounds memory access when reading malformed data in diffie_hellman_sha1() and diffie_hellman_sha256(). + + Added _libssh2_copy_string() to misc.c to return an allocated and filled char buffer from a string_buf offset. Removed no longer needed s var in kmdhgGPshakex_state_t. -- Renamed MinGW makefiles. +Will Cosgrove (26 Apr 2019) +- [Tseng Jun brought this change] -- Some MinGW makefile tweaks. + sftp.c : sftp_bin2attr() Correct attrs->gid assignment (#366) - Enable build without GNU tools and with MinGW64 compiler. + Regression with fix for #339 + + Credit : Tseng Jun -- Fixed aes_ctr_do_cipher() signature. +- [Tseng Jun brought this change] -Daniel Stenberg (26 Aug 2011) -- [liuzl brought this change] + kex.c : Correct type cast in curve25519_sha256() (#365) - libssh2_sftp_seek64: flush packetlist and buffered data - - When seeking to a new position, flush the packetlist and buffered data - to prevent already received or pending data to wrongly get used when - sftp-reading from the new offset within the file. +GitHub (24 Apr 2019) +- [Will Cosgrove brought this change] -- sftp_read: advance offset correctly for buffered copies + transport.c : scope local total_num var (#364) - In the case where a read packet has been received from the server, but - the entire contents couldn't be copied to the user-buffer, the data is - instead buffered and copied to the user's buffer in the next invocation - of sftp_read(). When that "extra" copy is made, the 'offset' pointer was - not advanced accordingly. + file : transport.c + notes : move local `total_num` variable inside of if block to prevent scope access issues which caused #360. + +Will Cosgrove (24 Apr 2019) +- [doublex brought this change] + + transport.c : fixes bounds check if partial packet is read - The biggest impact of this flaw was that the 'already' variable at the - top of the function that figures out how much data "ahead" that has - already been asked for would slowly go more and more out of sync, which - could lead to the file not being read all the way to the end. + Files : transport.c - This problem was most noticable in cases where the application would - only try to read the exact file size amount, like curl does. In the - examples libssh2 provides the sftp read function is most often called - with a fixed size large buffer and then the bug would not appear as - easily. + Issue : #360 - This bug was introduced in the SFTP rewrite in 1.2.8. + Notes : + 'p->total_num' instead of local value total_num when doing bounds check. - Bug: http://curl.haxx.se/mail/lib-2011-08/0305.html - http://www.libssh2.org/mail/libssh2-devel-archive-2011-08/0085.shtml - -- wrap some long lines < 80 columns + Credit : Doublex -- LIBSSH2_RECV: fix typo, use the RECV_FD macro +GitHub (23 Apr 2019) +- [Will Cosgrove brought this change] -- subsystem_netconf.c: fix compiler warnings + Editor config file for source files (#322) + + Simple start to an editor config file when editing source files to make sure they are configured correctly. -- [Henrik Nordstrom brought this change] +- [Will Cosgrove brought this change] - Custom callbacks for performing low level socket I/O + misc.c : String buffer API improvements (#332) + + Files : misc.c, hostkey.c, kex.c, misc.h, openssl.c, sftp.c + + Notes : + * updated _libssh2_get_bignum_bytes and _libssh2_get_string. Now pass in length as an argument instead of returning it to keep signedness correct. Now returns -1 for failure, 0 for success. + + _libssh2_check_length now returns 0 on success and -1 on failure to match the other string_buf functions. Added comment to _libssh2_check_length. + + Credit : Will Cosgrove -- version bump: start working towards 1.3.0 +Will Cosgrove (19 Apr 2019) +- [doublex brought this change] -Version 1.2.9 (16 Aug 2011) + mbedtls.c : _libssh2_mbedtls_rsa_new_private_frommemory() allow private-key from memory (#359) + + File : mbedtls.c + + Notes: _libssh2_mbedtls_rsa_new_private_frommemory() fixes private-key from memory reading to by adding NULL terminator before parsing; adds passphrase support. + + Credit: doublex -Daniel Stenberg (16 Aug 2011) -- RELEASE-NOTES: synced with 95d69d3a81261 +- [Ryan Kelley brought this change] -- [Henrik Nordstrom brought this change] + Session.c : banner_receive() from leaking when accessing non ssh ports (#356) + + File : session.c + + Release previous banner in banner_receive() if the session is reused after a failed connection. + + Credit : Ryan Kelley - Document prototypes for macro defined functions +GitHub (11 Apr 2019) +- [Will Cosgrove brought this change] -- [Henrik Nordstrom brought this change] + Formatting in agent.c + + Removed whitespace. - Avoid reuse after free when closing X11 channels +- [Will Cosgrove brought this change] -- _libssh2_channel_write: handle window_size == 0 better - - When about to send data on the channel and the window size is 0, we must - not just return 0 if the transport_read() function returned EAGAIN as it - then causes a busy-loop. + Fixed formatting in agent.c - Bug: http://libssh2.org/mail/libssh2-devel-archive-2011-08/0011.shtml + Quiet linter around a couple if blocks and pointer. -- gettimeofday: fix name space pollution +Will Cosgrove (11 Apr 2019) +- [Zhen-Huan HWANG brought this change] + + sftp.c : discard and reset oversized packet in sftp_packet_read() (#269) - For systems without its own gettimeofday() implementation, we still must - not provide one outside our namespace. + file : sftp.c - Reported by: Bill Segall - -Dan Fandrich (5 Aug 2011) -- libssh2.pc.in: Fixed spelling in pkgconfig file + notes : when sftp_packet_read() encounters an sftp packet which exceeds SFTP max packet size it now resets the reading state so it can continue reading. + + credit : Zhen-Huan HWANG -Peter Stuge (17 Jul 2011) -- example/subsystem_netconf.c: Add missing #include +GitHub (11 Apr 2019) +- [Will Cosgrove brought this change] -- example/subsystem_netconf.c: Discard ]]>]]> and return only XML response + Add agent functions libssh2_agent_get_identity_path() and libssh2_agent_set_identity_path() (#308) + + File : agent.c + + Notes : + Libssh2 uses the SSH_AUTH_SOCK env variable to read the system agent location. However, when using a custom agent path you have to set this value using setenv which is not thread-safe. The new functions allow for a way to set a custom agent socket path in a thread safe manor. -- example/subsystem_netconf.c: Fix uninitialized variable bug +- [Will Cosgrove brought this change] -- example: Add subsystem_netconf.c + Simplified _libssh2_check_length (#350) - This example demonstrates how to use libssh2 to send a request to - the NETCONF subsystem available e.g. in JunOS. + * Simplified _libssh2_check_length - See also http://tools.ietf.org/html/draft-ietf-netconf-ssh-06 + misc.c : _libssh2_check_length() + + Removed cast and improved bounds checking and format. + + Credit : Yuriy M. Kaminskiy -Daniel Stenberg (16 Jul 2011) -- man page cleanups: non-existing functions need no man pages +- [Will Cosgrove brought this change] -- libssh2_new_host_entry.3: removed + _libssh2_check_length() : additional bounds check (#348) - This is just junk leftovers. + Misc.c : _libssh2_check_length() + + Ensure the requested length is less than the total length before doing the additional bounds check -- userauth_keyboard_interactive: fix buffer overflow +Daniel Stenberg (25 Mar 2019) +- misc: remove 'offset' from string_buf - Partly reverse 566894494b4972ae12 which was simplifying the code far too - much and ended up overflowing a buffer within the LIBSSH2_SESSION - struct. Back to allocating the buffer properly like it used to do. + It isn't necessary. - Bug: http://www.libssh2.org/mail/libssh2-devel-archive-2011-06/0032.shtml - Reported by: Alfred Gebert + Closes #343 -- keyboard-interactive man page: cleaned up +- sftp: repair mtime from e1ead35e475 + + A regression from e1ead35e4759 broke the SFTP mtime logic in + sftp_bin2attr + + Also simplified the _libssh2_get_u32/u64 functions slightly. + + Closes #342 -- [Alfred Gebert brought this change] +- session_disconnect: don't zero state, just clear the right bit + + If we clear the entire field, the freeing of data in session_free() is + skipped. Instead just clear the bit that risk making the code get stuck + in the transport functions. + + Regression from 4d66f6762ca3fc45d9. + + Reported-by: dimmaq on github + Fixes #338 + Closes #340 - _libssh2_recv(): handle ENOENT error as EAGAIN +- libssh2_sftp.h: restore broken ABI - A sftp session failed with error "failure establishing ssh session" on - Solaris and HP-UX. Sometimes the first recv() function call sets errno - to ENOENT. In the man pages for recv of Solaris and HP-UX the error - ENOENT is not documented. + Commit 41fbd44 changed variable sizes/types in a public struct which + broke the ABI, which breaks applications! - I tested Solaris SPARC and x86, HP-UX i64, AIX, Windows and Linux. + This reverts that change. + + Closes #339 -- agent_list_identities: fix out of scope access +- style: make includes and examples code style strict - An auto variable out of scope was being referenced and used. + make travis and the makefile rule verify them too - fixes #220 + Closes #334 -- _libssh2_wait_socket: fix timeouts for poll() uses +GitHub (21 Mar 2019) +- [Daniel Stenberg brought this change] -- windows: inclusion fix - - include winsock2.h for all windows compilers + create a github issue template -- keyb-interactive: add the fixed buffer +Daniel Stenberg (21 Mar 2019) +- stale-bot: activated - Belongs to commit 5668944 + The stale bot will automatically mark stale issues (inactive for 90 + days) and if still untouched after 21 more days, close them. + + See https://probot.github.io/apps/stale/ -- code cleanup: don't use C99/c++ comments +- libssh2_session_supported_algs.3: fix formatting mistakes - We aim for C89 compliance + Reported-by: Max Horn + Fixes #57 -- keyb-interactive: allow zero length fields +- [Zenju brought this change] + + libssh2.h: Fix Error C2371 'ssize_t': redefinition - Allow zero length fields so they don't cause malloc(0) calls + Closes #331 + +- travis: add code style check - Avoid free()ing NULL pointers + Closes #324 + +- code style: unify code style - Avoid a malloc of a fixed 5 byte buffer. + Indent-level: 4 + Max columns: 79 + No spaces after if/for/while + Unified brace positions + Unified white spaces -- libssh2_channel_process_startup.3: clean up +- src/checksrc.pl: code style checker - Remove the references to the macro-fied shortcuts as they have their own - individual man pages. + imported as-is from curl + +Will Cosgrove (19 Mar 2019) +- Merge branch 'MichaelBuckley-michaelbuckley-security-fixes' + +- Silence unused var warnings (#329) - Made the prototype different and more readable. + Silence warnings about unused variables in this test -- man page: fix .BR lines +- Removed unneeded > 0 check - We don't use \fI etc on .BR lines + When checking `userauth_kybd_num_prompts > 100` we don't care if it's also above zero. -- userauth_keyboard_interactive: skip code on zero length auth +- [Matthew D. Fuller brought this change] -- libssh2_channel_forward_accept.3: mention how to get error + Spell OpenSS_H_ right when talking about their specific private key (#321) - Since this returns a pointer, libssh2_session_last_errno() must be used - to get the actual error code and it wasn't that clear before. + Good catch, thanks. -- timeout docs: mention they're added in 1.2.9 +GitHub (19 Mar 2019) +- [Will Cosgrove brought this change] -- sftp_write_sliding.c: indent fix + Silence unused var warnings (#329) - Use the standard indenting and removed CVS leftover comment + Silence warnings about unused variables in this test -- [zl liu brought this change] +Michael Buckley (19 Mar 2019) +- Fix more scope and printf warning errors - sftp_write_sliding: send the complete file - - When reaching the end of file there can still be data left not sent. +- Silence unused variable warning -- [Douglas Masterson brought this change] +GitHub (19 Mar 2019) +- [Will Cosgrove brought this change] - session_startup: init state properly + Removed unneeded > 0 check - libssh2_session_startup() didn't set the state correctly so it could get - confused. + When checking `userauth_kybd_num_prompts > 100` we don't care if it's also above zero. + +Will Cosgrove (19 Mar 2019) +- [Matthew D. Fuller brought this change] + + Spell OpenSS_H_ right when talking about their specific private key (#321) - Fixes #218 + Good catch, thanks. -- timeout: added man pages +Michael Buckley (18 Mar 2019) +- Fix errors identified by the build process -- BLOCK_ADJUST_ERRNO: move rc to right level +- Fix casting errors after merge + +GitHub (18 Mar 2019) +- [Michael Buckley brought this change] + + Merge branch 'master' into michaelbuckley-security-fixes + +Michael Buckley (18 Mar 2019) +- Move fallback SIZE_MAX and UINT_MAX to libssh2_priv.h + +- Fix type and logic issues with _libssh2_get_u64 + +Daniel Stenberg (17 Mar 2019) +- examples: fix various compiler warnings + +- lib: fix various compiler warnings + +- session: ignore pedantic warnings for funcpointer <=> void * + +- travis: add a build using configure - We can't declare the variable within the block and use it in the final - do-while() expression to be properly portable C89. + Closes #320 -- [Matt Lilley brought this change] +- configure: provide --enable-werror - adds a timeout to blocking calls +- appveyor: remove old builds that mostly cause failures - Fixes bug #160 as per Daniel's suggestion + ... and only run on master branch. - Adds libssh2_session_set_timeout() and libssh2_session_get_timeout() + Closes #323 -- SCP: fix incorrect error code +- cmake: add two missing man pages to get installed too - After an error occurs in libssh2_scp_recv() or libssh2_scp_send(), the - function libssh2_session_last_error() would return - LIBSSH2_ERROR_SOCKET_NONE on error. + Both libssh2_session_handshake.3 and + libssh2_userauth_publickey_frommemory.3 were installed by the configure + build already. - Bug: http://trac.libssh2.org/ticket/216 - Patch by: "littlesavage" + Reported-by: Arfrever on github + Fixes #278 + +- include/libssh2.h: warning: "_WIN64" is not defined, evaluates to 0 - Fixes #216 + We don't use #if for defines that might not be defined. -Guenter Knauf (19 Apr 2011) -- Updated default (recommended) dependency versions. +- pem: //-comments are not allowed -Daniel Stenberg (17 Apr 2011) -- libssh2_session_block_directions: fix mistake - - The last LIBSSH2_SESSION_BLOCK_INBOUND should be - LIBSSH2_SESSION_BLOCK_OUTBOUND - - And I shortened the short description +Will Cosgrove (14 Mar 2019) +- [Daniel Stenberg brought this change] + + userauth: fix "Function call argument is an uninitialized value" (#318) - Reported by: "drswinghead" + Detected by scan-build. -- msvcproj: added libs and debug stuff +- fixed unsigned/signed issue + +Daniel Stenberg (15 Mar 2019) +- session_disconnect: clear state - Added libraries needed to link whether using openssl dynamically or - statically + If authentication is started but not completed before the application + gives up and instead wants to shut down the session, the '->state' field + might still be set and thus effectively dead-lock session_disconnect. - Added LIBSSH2DEBUG define to debug versions to enable tracing + This happens because both _libssh2_transport_send() and + _libssh2_transport_read() refuse to do anything as long as state is set + without the LIBSSH2_STATE_KEX_ACTIVE bit. - URL: http://trac.libssh2.org/ticket/215 - Patch by: Mark Smith - -- sftp_write: clean offsets on error + Reported in curl bug https://github.com/curl/curl/issues/3650 - When an error has occurred on FXP_WRITE, we must make sure that the - offset, sent offset and acked counter are reset properly. + Closes #310 -- example/.gitignore: ignore built binaries +Will Cosgrove (14 Mar 2019) +- Release notes from 1.8.1 -- sftp_write: flush the packetlist on error - - When an error occurs during write, flush the entire list of pending - outgoing SFTP packets. +Michael Buckley (14 Mar 2019) +- Use string_buf in sftp_init(). -- keepalive: add first basic man pages - - Someone on IRC pointed out that we don't have these documented so I - wrote up a first set based on the information in the wiki: - http://trac.libssh2.org/wiki/KeepAlive +- Guard against out-of-bounds reads in publickey.c -- scp_write_nonblock.c: remove pointless check - - libssh2_channel_write() cannot return a value that is larger than the - input length value +- Guard against out-of-bounds reads in session.c -Mikhail Gusarov (9 Apr 2011) -- s/\.NF/.nf/ to fix wrong macro name caught by man --warnings +- Guard against out-of-bounds reads in userauth.c -Daniel Stenberg (6 Apr 2011) -- version: bump to 1.2.9_dev +- Use LIBSSH2_ERROR_BUFFER_TOO_SMALL instead of LIBSSH2_ERROR_OUT_OF_BOUNDARY in sftp.c + +- Additional bounds checking in sftp.c + +- Additional length checks to prevent out-of-bounds reads and writes in _libssh2_packet_add(). https://libssh2.org/CVE-2019-3862.html + +- Add a required_size parameter to sftp_packet_require et. al. to require callers of these functions to handle packets that are too short. https://libssh2.org/CVE-2019-3860.html + +- Check the length of data passed to sftp_packet_add() to prevent out-of-bounds reads. + +- Prevent zero-byte allocation in sftp_packet_read() which could lead to an out-of-bounds read. https://libssh2.org/CVE-2019-3858.html + +- Sanitize padding_length - _libssh2_transport_read(). https://libssh2.org/CVE-2019-3861.html - Also update the copyright year range to include 2011 + This prevents an underflow resulting in a potential out-of-bounds read if a server sends a too-large padding_length, possibly with malicious intent. -- configure: fix $VERSION +- Defend against writing beyond the end of the payload in _libssh2_transport_read(). + +- Defend against possible integer overflows in comp_method_zlib_decomp. + +GitHub (14 Mar 2019) +- [Will Cosgrove brought this change] + + Security fixes (#315) - Stop using the $VERSION variable as it seems to be magically used by - autoconfig itself and thus gets set to the value set in AC_INIT() - without us wanting that. $LIBSSH2VER is now the libssh2 version as - detected. + * Bounds checks - Reported by: Paul Howarth - Bug: http://www.libssh2.org/mail/libssh2-devel-archive-2011-04/0008.shtml + Fixes for CVEs + https://www.libssh2.org/CVE-2019-3863.html + https://www.libssh2.org/CVE-2019-3856.html + + * Packet length bounds check + + CVE + https://www.libssh2.org/CVE-2019-3855.html + + * Response length check + + CVE + https://www.libssh2.org/CVE-2019-3859.html + + * Bounds check + + CVE + https://www.libssh2.org/CVE-2019-3857.html + + * Bounds checking + + CVE + https://www.libssh2.org/CVE-2019-3859.html + + and additional data validation + + * Check bounds before reading into buffers + + * Bounds checking + + CVE + https://www.libssh2.org/CVE-2019-3859.html + + * declare SIZE_MAX and UINT_MAX if needed -- maketgz: use git2news.pl by the correct name +- [Will Cosgrove brought this change] -Version 1.2.8 (4 Apr 2011) + fixed type warnings (#309) -Daniel Stenberg (4 Apr 2011) -- RELEASE-NOTES: synced with fabf1a45ee +- [Will Cosgrove brought this change] -- NEWS: auto-generated from git - - Starting now, the NEWS file is generated from git using the git2news.pl - script. This makes it always accurate and up-to-date, even for daily - snapshots etc. + Bumping version number for pending 1.8.1 release -- sftp_write: handle FXP_WRITE errors +Will Cosgrove (4 Mar 2019) +- [Daniel Stenberg brought this change] + + _libssh2_string_buf_free: use correct free (#304) - When an sftp server returns an error back on write, make sure the - function bails out and returns the proper error. + Use LIBSSH2_FREE() here, not free(). We allow memory function + replacements so free() is rarely the right choice... -- configure: stop using the deprecated AM_INIT_AUTOMAKE syntax +GitHub (26 Feb 2019) +- [Will Cosgrove brought this change] -Alexander Lamaison (13 Mar 2011) -- Support unlimited number of host names in a single line of the known_hosts file. + Fix for building against libreSSL #302 - Previously the code assumed either a single host name or a hostname,ip-address pair. However, according to the spec [1], there can be any number of comma separated host names or IP addresses. + Changed to use the check we use elsewhere. + +- [Will Cosgrove brought this change] + + Fix for when building against LibreSSL #302 + +Will Cosgrove (25 Feb 2019) +- [gartens brought this change] + + docs: update libssh2_hostkey_hash.3 [ci skip] (#301) + +GitHub (21 Feb 2019) +- [Will Cosgrove brought this change] + + fix malloc/free mismatches #296 (#297) + +- [Will Cosgrove brought this change] + + Replaced malloc with calloc #295 + +- [Will Cosgrove brought this change] + + Abstracted OpenSSL calls out of hostkey.c (#294) + +- [Will Cosgrove brought this change] + + Fix memory dealloc impedance mis-match #292 (#293) - [1] http://www.openbsd.org/cgi-bin/man.cgi?query=sshd&sektion=8 + When using ed25519 host keys and a custom memory allocator. -Daniel Stenberg (26 Feb 2011) -- libssh2_knownhost_readfile.3: clarify return value +- [Will Cosgrove brought this change] + + Added call to OpenSSL_add_all_digests() #288 - This function returns the number of parsed hosts on success, not just - zero as previously documented. + For OpenSSL 1.0.x we need to call OpenSSL_add_all_digests(). -Peter Stuge (26 Feb 2011) -- Don't save allocated packet size until it has actually been allocated +Will Cosgrove (12 Feb 2019) +- [Zhen-Huan HWANG brought this change] + + SFTP: increase maximum packet size to 256K (#268) - The allocated packet size is internal state which needs to match reality - in order to avoid problems. This commit fixes #211. + to match implementations like OpenSSH. -Daniel Stenberg (21 Feb 2011) -- [Alfred Gebert brought this change] +- [Zenju brought this change] - session_startup: manage server data before server identification + Fix https://github.com/libssh2/libssh2/pull/271 (#284) + +GitHub (16 Jan 2019) +- [Will Cosgrove brought this change] + + Agent NULL check in shutdown #281 + +Will Cosgrove (15 Jan 2019) +- [Adrian Moran brought this change] + + mbedtls: Fix leak of 12 bytes by each key exchange. (#280) - Fix the bug that libssh2 could not connect if the sftp server - sends data before sending the version string. + Correctly free ducts by calling _libssh2_mbedtls_bignum_free() in dtor. + +- [alex-weaver brought this change] + + Fix error compiling on Win32 with STDCALL=ON (#275) + +GitHub (8 Nov 2018) +- [Will Cosgrove brought this change] + + Allow default permissions to be used in sftp_mkdir (#271) - http://tools.ietf.org/html/rfc4253#section-4.2 + Added constant LIBSSH2_SFTP_DEFAULT_MODE to use the server default permissions when making a new directory + +Will Cosgrove (13 Sep 2018) +- [Giulio Benetti brought this change] + + openssl: fix dereferencing ambiguity potentially causing build failure (#267) - "The server MAY send other lines of data before sending the version - string. Each line SHOULD be terminated by a Carriage Return and Line - Feed. Such lines MUST NOT begin with "SSH-", and SHOULD be encoded - in ISO-10646 UTF-8 [RFC3629] (language is not specified). Clients - MUST be able to process such lines." + When dereferencing from *aes_ctr_cipher, being a pointer itself, + ambiguity can occur; fixed possible build errors. -- [Alfred Gebert brought this change] +Viktor Szakats (12 Sep 2018) +- win32/GNUmakefile: define HAVE_WINDOWS_H + + This macro was only used in test/example code before, now it is + also used in library code, but only defined automatically by + automake/cmake, so let's do the same for the standalone win32 + make file. + + It'd be probably better to just rely on the built-in _WIN32 macro + to detect the presence of windows.h though. It's already used + in most of libssh2 library code. There is a 3rd, similar macro + named LIBSSH2_WIN32, which might also be replaced with _WIN32. + + Ref: https://github.com/libssh2/libssh2/commit/8b870ad771cbd9cd29edbb3dbb0878e950f868ab + Closes https://github.com/libssh2/libssh2/pull/266 - fullpacket: decompression only after init +Marc Hoersken (2 Sep 2018) +- Fix conditional check for HAVE_DECL_SECUREZEROMEMORY - The buffer for the decompression (remote.comp_abstract) is initialised - in time when it is needed. With this fix decompression is disabled when - the buffer (remote.comp_abstract) is not initialised. + "Unlike the other `AC_CHECK_*S' macros, when a symbol is not declared, + HAVE_DECL_symbol is defined to `0' instead of leaving HAVE_DECL_symbol + undeclared. When you are sure that the check was performed, + use HAVE_DECL_symbol in #if." - Bug: http://trac.libssh2.org/ticket/200 + Source: autoconf documentation for AC_CHECK_DECLS. -- _libssh2_channel_read: store last error +- Fix implicit declaration of function 'SecureZeroMemory' - When the transport layer returns EAGAIN this function didn't call - _libssh2_error() which made the last_error not get set. + Include window.h in order to use SecureZeroMemory on Windows. -- sftp_write: clarified the comment header +- Fix implicit declaration of function 'free' by including stdlib.h -- sftp_read: avoid wrapping counter to insanity - - As pointed out in bug #206, if a second invoke of libssh2_sftp_read() - would shrink the buffer size, libssh2 would go nuts and send out read - requests like crazy. This was due to an unsigned variable turning - "negative" by some wrong math, and that value would be the amount of - data attempt to pre-buffer! +GitHub (27 Aug 2018) +- [Will Cosgrove brought this change] + + Use malloc abstraction function in pem parse - Bug: http://trac.libssh2.org/ticket/206 + Fix warning on WinCNG build. -- sftp_packet_read: use 32bit variables for 32bit data +- [Will Cosgrove brought this change] -- libssh2_sftp_stat_ex.3: cleaned up, extended - - Removed the macros from it as they have their own man pages. + Fixed possible junk memory read in sftp_stat #258 + +- [Will Cosgrove brought this change] + + removed INT64_C define (#260) - Added the LIBSSH2_SFTP_ATTRIBUTES struct in here for easier reference. + No longer used. -- sftp_readdir: return error if buffer is too small +- [Will Cosgrove brought this change] + + Added conditional around engine.h include + +Will Cosgrove (6 Aug 2018) +- [Alex Crichton brought this change] + + Fix OpenSSL link error with `no-engine` support (#259) - If asked to read data into a buffer and the buffer is too small to hold - the data, this function now returns an error instead of as previously - just copy as much as fits. + This commit fixes linking against an OpenSSL library that was compiled with + `no-engine` support by bypassing the initialization routines as they won't be + available anyway. -- sftp_symlink: return error if receive buffer too small +GitHub (2 Aug 2018) +- [Will Cosgrove brought this change] + + ED25519 Key Support #39 (#248) - and clean up some variable type mismatches + OpenSSH Key and ED25519 support #39 + Added _libssh2_explicit_zero() to explicitly zero sensitive data in memory #120 - Discussion: http://www.libssh2.org/mail/libssh2-devel-archive-2011-01/0001.shtml + * ED25519 Key file support - Requires OpenSSL 1.1.1 or later + * OpenSSH Key format reading support - Supports RSA/DSA/ECDSA/ED25519 types + * New string buffer reading functions - These add build-in bounds checking and convenance methods. Used for OpenSSL PEM file reading. + * Added new tests for OpenSSH formatted Keys -- docs: clarify what happens with a too small buffer - - This flaw is subject to change, but I figured it might be valuable to - users of existing code to know how it works. +- [Will Cosgrove brought this change] -- channel_request_pty_size: fix reqPTY_state + ECDSA key types are now explicit (#251) - The state variable isn't properly set so every other call to the - function fails! + * ECDSA key types are now explicit - Bug: http://libssh2.org/mail/libssh2-devel-archive-2010-12/0096.shtml - Reported by: Steve Legg + Issue was brough up in pull request #248 -- data size: cleanup - - Fix 64bit warnings by using (s)size_t and dedicated uint32_t types more. +Will Cosgrove (2 May 2018) +- [Jakob Egger brought this change] -- [Pierre Joye brought this change] + Add Instructions for building from Master (#249) - ssize_t: proper typedef with MSVC compilers +GitHub (27 Apr 2018) +- [Will Cosgrove brought this change] + + Initialize sb_intl #226 + +Will Cosgrove (19 Apr 2018) +- [doublex brought this change] + + buffer overflow (valgrind) (#159) + +- [Brendan Shanks brought this change] + + mbedTLS: Remove some C99-style intermingled variable declarations (#196) + +GitHub (18 Apr 2018) +- [Will Cosgrove brought this change] + + fix for #160 + +Will Cosgrove (18 Apr 2018) +- [doublex brought this change] + + fix memory leak when using mbedtls backend (#158) - As discussed on the mailing list, it was wrong for win64 and using the - VC-provided type is the safest approach instead of second- guessing - which one it should be. + _libssh2_bn_init_from_bin/_libssh2_bn_free would leak bignum from mbedtls_calloc(). -Guenter Knauf (22 Dec 2010) -- Updated OpenSSL version. +- [Brendan Shanks brought this change] -- Expanded tabs to spaces. + mbedTLS: Avoid multiple definition errors for context handles (#197) -Peter Stuge (21 Dec 2010) -- [Joey Degges brought this change] +- [Tseng Jun brought this change] - _libssh2_ntohu64: fix conversion from network bytes to uint64 + Fix the EVP cipher meth memory leakage problem (#244) - Cast individual bytes to uint64 to avoid overflow in arithmetic. + * Fix the EVP cipher meth memory leakage problem + + Looks good, thanks for the fixes. -Daniel Stenberg (20 Dec 2010) -- libssh2_userauth_list: language fix +Marc Hörsken (31 Mar 2018) +- [Will Cosgrove brought this change] + + Added ECDSA defines for WinCNG (#245) - "faily" is not a good English word, and I also cleaned up some other minor - mistakes + Fixed missing defines preventing building using WinCNG -- crypto: unify the generic functions +GitHub (30 Mar 2018) +- [Will Cosgrove brought this change] + + Fix for _libssh2_rsa_new with OpenSSL 1.0.x - Added crypto.h that is the unified header to include when using crypto - functionality. It should be the only header that needs to adapt to the - underlying crypto library in use. It provides the set of prototypes that - are library agnostic. + missing d value assignment. -- [Mark Smith brought this change] +Will Cosgrove (20 Mar 2018) +- [Etienne Samson brought this change] - userauth: derive publickey from private + A collection of small fixes (#198) - Pass a NULL pointer for the publickey parameter of - libssh2_userauth_publickey_fromfile and - libssh2_userauth_hostbased_fromfile functions. In this case, the - functions recompute the public key from the private key file data. + * tests: Remove if-pyramids - This is work done by Jean-Louis CHARTON - , then adapted by Mark Smith and - slightly edited further by me Daniel. + * tests: Switch run_command arguments - WARNING: this does leave the feature NOT WORKING when libssh2 is built - to use libgcrypt instead of OpenSSL simply due to lack of - implementation. + * tests: Make run_command a vararg function + + * tests: Xcode doesn't obey CMake's test working directory + + * openssl: move manual AES-CTR cipher into crypto init + + * cmake: Move our include dir before all other include paths -- ssh2_echo: Value stored to 'exitcode' is never read +GitHub (15 Mar 2018) +- [Will Cosgrove brought this change] -- _libssh2_packet_add: fix SSH_MSG_DEBUG weirdness + Fixes incorrect indexing of KEX prefs string - I believe I may have caused this weird typo style error when I cleaned - up this function a while ago. Corrected now. + After stripping out an invalid KEX pref entry, it would incorrectly advance again leaving invalid values in the list. -- uint32: more longs converted to proper types +Viktor Szakats (13 Mar 2018) +- tests: fix checksrc warnings - I also moved the MAC struct over to the mac.h header file and made sure - that the users of that struct include that file. + Also: + * add 'static' qualifier to file-wide const buffers + * fix a non-ANSI C89 comment + * silence a mismatched fprintf() mask warning by adding a cast -- SFTP: more types to uint32_t +- cmake: recognize OpenSSL 1.1 .dll names - The 'num_names' field in the SSH_FXP_NAME response is an unsigned 32bit - value so we make sure to treat it like that. + Also fix some comment typos and a stray tab. -- SFTP: request_ids are uint32_t - - I went over the code and made sure we use uint32_t all over for the - request_id data. It is an unsigned 32bit value on the wire. +- docs: update an URL [ci skip] -- SFTP: store request_id separately in packets +Daniel Stenberg (12 Mar 2018) +- docs/SECURITY: the max embargo is 14 days now + +Viktor Szakats (12 Mar 2018) +- docs: spelling fixes [ci skip] - By using a new separate struct for incoming SFTP packets and not sharing - the generic packet struct, we can get rid of an unused field and add a - new one dedicated for holding the request_id for the incoming - package. As sftp_packet_ask() is called fairly often, a "mere" integer - comparison is MUCH faster than the previous memcmp() of (typically) 5 - bytes. + Closes https://github.com/libssh2/libssh2/pull/222 -- libssh2_sftp_open_ex: man page extended and cleaned up - - I added the missing documentation for the 'flags' argument. +GitHub (12 Mar 2018) +- [Will Cosgrove brought this change] -- SFTP: unify the READ/WRITE chunk structs + Fixed minor tabs/spacing issues -- SFTP: fix memory leaks - - Make sure that we cleanup remainders when the handle is closed and when - the subsystem is shutdown. - - Existing flaw: if a single handle sends packets that haven't been - replied to yet at the time when the handle is closed, those packets will - arrive later and end up in the generic packet brigade queue and they - will remain in there until flushed. They will use unnecessary memory, - make things slower and they will ruin the SFTP handling if the - request_id counter ever wraps (highly unlikely to every happen). +- [Will Cosgrove brought this change] -- sftp_close_handle: packet list is generic + Update kex.c + +- [Will Cosgrove brought this change] + + Added basic bounds checking #206 - Fix comment, simplify the loop logic + Basic bounds checking in ecdh_sha2_nistp() -- sftp_read: pipeline reads +- [Will Cosgrove brought this change] + + Fixed Clang warning #206 - The SFTP read function now does transfers the same way the SFTP write - function was made to recently: it creates a list of many outgoing - FXP_READ packets that each asks for a small data chunk. The code then - tries to keep sending read request while collecting the acks for the - previous requests and returns the received data. + Fixed possible garbage value for secret in an error case -- sftp_write: removed unused variable +- [Will Cosgrove brought this change] -- _libssh2_channel_close: don't call transport read if disconnected + Fixed incorrect #if to #ifdef #206 - The loop that waits for remote.close to get set may end up looping - forever since session->socket_state gets set to - LIBSSH2_SOCKET_DISCONNECTED by the packet_add() function called from the - transport_read() function and after having been set to - LIBSSH2_SOCKET_DISCONNECTED, the transport_read() function will only - return 0. + When checking HAVE_OPAQUE_STRUCTS. + +Viktor Szakats (12 Mar 2018) +- src: suppress two checksrc warnings - Bug: http://trac.libssh2.org/ticket/198 + Ref: https://github.com/libssh2/libssh2/pull/235 -- libssh2_sftp_seek64: new man page +- src: address fopen() warnings, add missing copyright headers - Split off libssh2_sftp_seek64 from the libssh2_sftp_seek man page, and - mentioned that we consider the latter deprecated. Also added a mention - about the dangers of doing seek during writing or reading. + Ref: https://github.com/libssh2/libssh2/pull/235 -- sftp_seek: fix +- src: replace sprintf() with snprintf() - The new SFTP write code caused a regression as the seek function no - longer worked as it didn't set the write position properly. + Ref: https://github.com/libssh2/libssh2/pull/235 + +- src: fix checksrc warnings - It should be noted that seeking is STRONGLY PROHIBITED during upload, as - the upload magic uses two different offset positions and the multiple - outstanding packets etc make them sensitive to change in the midst of - operations. + Use checksrc.pl from the curl project, with (for now) + suppressed long line warnings and indentation set to + 4 spaces. Fixes are whitespace for the most part. - This functionality was just verified with the new example code - sftp_append. This bug was filed as bug #202: + Warning count went down from 2704 to 12. - Bug: http://trac.libssh2.org/ticket/202 - -- sftp_append: new example doing SFTP append + Also fix codespell typos, two non-ANSI C89 comments + and a stray tab in include/libssh2.h. + + Ref: https://github.com/libssh2/libssh2/pull/235 -- MAX_SFTP_OUTGOING_SIZE: 30000 +- checksrc: add source style checker - I ran SFTP upload tests against localhost. It showed that to make the - app reach really good speeds, I needed to do a little code tweak and - change MAX_SFTP_OUTGOING_SIZE from 4000 to 30000. The tests I did before - with the high latency tests didn't show any real difference whatever I - had that size set to. + This is a slightly extended version of this original source + from the curl project: + https://github.com/curl/curl/blob/8b754c430b9a4c51aa606c687ee5014faf7c7b06/lib/checksrc.pl - This number is the size in bytes that libssh2 cuts off the large input - buffer and sends off as an individual sftp packet. - -- sftp_write_sliding.c: new example + This version adds the following options to customize it for + libssh2 (plus some whitespace formatting): - This is an example that is very similar to sftp_write_nonblock.c, with - the exception that this uses + `-i` to override indentation spaces (2) + `-m` to override maximum line length (79) - 1 - a larger upload buffer + Command-line used to check libssh2 sources: - 2 - a sliding buffer mechnism to allow the app to keep sending lots of - data to libssh2 without having to first drain the buffer. + $ ./checksrc.pl -i4 -m500 *.c *.h - These are two key issues to make libssh2 SFTP uploads really perform - well at this point in time. + Closes https://github.com/libssh2/libssh2/pull/236 -- cpp: s/#elsif/#elif +- src: add static qualifier - This looks like a typo as #elsif is not really C... + To private, const strings. + + Closes https://github.com/libssh2/libssh2/pull/237 -- _libssh2_channel_write: revert channel_write() use +- [Will Cosgrove brought this change] + + Add support for ECDSA keys and host keys (#41) - The attempts made to have _libssh2_channel_write() accept larger pieces - of data and split up the data by itself into 32700 byte chunks and pass - them on to channel_write() in a loop as a way to do faster operations on - larger data blocks was a failed attempt. + This commit lands full ECDSA key support when using the OpenSSL + backend. Which includes: - The reason why it is difficult: + New KEX methods: + ecdsa-sha2-nistp256, ecdsa-sha2-nistp384, ecdsa-sha2-nistp521 - The API only allows EAGAIN or a length to be returned. When looping over - multiple blocks to get sent, one block can get sent and the next might - not. And yet: when transport_send() has returned EAGAIN we must not call - it again with new data until it has returned OK on the existing data it - is still working on. This makes it a mess and we do get a much easier - job by simply returning the bytes or EAGAIN at once, as in the EAGAIN - case we can assume that we will be called with the same arguments again - and transport_send() will be happy. + Can now read OpenSSL formatted ECDSA key files. - Unfortunately, I think we take a small performance hit by not being able - to do this. - -- ssh2_echo: new example + Now supports known host keys of type ecdsa-sha2-nistp256. - This is a new example snippet. The code is largely based on ssh2_exec, - and is written by Tommy Lindgren. I edited it into C90 compliance and to - conform to libssh2 indent style and some more. - -- send_existing: return after send_existing + New curve types: + NID_X9_62_prime256v1, NID_secp384r1, NID_secp521r1 - When a piece of data is sent from the send_existing() function we must - make the parent function return afterwards. Otherwise we risk that the - parent function tries to send more data and ends up getting an EGAIN for - that more data and since it can only return one return code it doesn't - return info for the successfully sent data. + Default host key preferred ordering is now nistp256, nistp384, + nistp521, rsa, dss. - As this change is a regression I now added a larger comment explaining - why it has to work like this. - -- _libssh2_channel_write: count resent data as written + Ref: https://github.com/libssh2/libssh2/issues/41 - In the logic that resends data that was kept for that purpose due to a - previous EAGAIN, the data was not counted as sent causing badness. + Closes https://github.com/libssh2/libssh2/pull/206 -Peter Stuge (13 Nov 2010) -- Use fprintf(stderr, ) instead of write(2, ) for debugging +GitHub (15 Dec 2017) +- [Will Cosgrove brought this change] -- session/transport: Correctly handle when _libssh2_send() returns -EAGAIN + Fixed possible crash when decoding invalid data + + When trying to decode invalid data, it frees the buffer but doesn't nil it so the caller gets a junk memory pointer which they could potentially double free. -- src/agent.c: Simplify _libssh2_send() error checking ever so slightly +- [Will Cosgrove brought this change] -Daniel Stenberg (12 Nov 2010) -- send/recv: use _libssh2_recv and _libssh2_send now + Remove call to OpenSSL_add_all_ciphers() - Starting now, we unconditionally use the internal replacement functions - for send() and recv() - creatively named _libssh2_recv() and - _libssh2_send(). + Now lives in libssh2 init() from PR #189 + +- [Will Cosgrove brought this change] + + Fixed incorrect reference to decrypted block - On errors, these functions return the negative 'errno' value instead of - the traditional -1. This design allows systems that have no "natural" - errno support to not have to invent it. It also means that no code - outside of these two transfer functions should use the errno variable. + Fixed incorrectly copied memory from p->buf into init instead of from the decrypted buffer block. The only reason this worked was because the crypt() function decrypts the value in-place and overwrites p->buf. I'm working on a fork that no longer does this and exposed this bug. -- channel_write: move some logic to _libssh2_channel_write +Will Cosgrove (20 Oct 2017) +- [Pan brought this change] + + Fix typo in crypt.c (#218) + +Kamil Dudka (17 Oct 2017) +- session: avoid printing misleading debug messages - Some checks are better done in _libssh2_channel_write just once per - write instead of in channel_write() since the looping will call the - latter function multiple times per _libssh2_channel_write() invoke. + ... while throwing LIBSSH2_ERROR_EAGAIN out of session_startup() + + If the session runs in blocking mode, LIBSSH2_ERROR_EAGAIN never reaches + the libssh2 API boundary and, in non-blocking mode, these messages are + suppressed by the condition in _libssh2_error_flags() anyway. + + Closes #211 -- sftp_write: handle "left over" acked data +Viktor Szakats (15 Oct 2017) +- win32/GNUmakefile: allow customizing dll suffixes - The SFTP handle struct now buffers number of acked bytes that haven't - yet been returned. The way this is used is as following: + - New `LIBSSH2_DLL_SUFFIX` envvar will add a suffix to the generated + libssh2 dll name. Useful to add `-x64` to 64-bit builds so that + it can live in the same directory as the 32-bit one. By default + this is empty. - 1. sftp_write() gets called with a buffer of let say size 32000. We - split 32000 into 8 smaller packets and send them off one by one. One of - them gets acked before the function returns so 4000 is returned. + - New `LIBSSH2_DLL_A_SUFFIX` envvar to customize the suffix of the + generated import library (implib) for libssh2 .dll. It defaults + to `dll`, and it's useful to modify that to `.dll` to have the + standard naming scheme for mingw-built .dlls, i.e. `libssh2.dll.a`. - 2. sftp_write() gets called again a short while after the previous one, - now with a much smaller size passed in to the function. Lets say 8000. - In the mean-time, all of the remaining packets from the previous call - have been acked (7*4000 = 28000). This function then returns 8000 as all - data passed in are already sent and it can't return any more than what - it got passed in. But we have 28000 bytes acked. We now store the - remaining 20000 in the handle->u.file.acked struct field to add up in - the next call. + Ref: https://github.com/curl/curl/commit/aaa16f80256abc1463fd9374815130a165222257 - 3. sftp_write() gets called again, and now there's a backlogged 20000 - bytes to return as fine and that will get skipped from the beginning - of the buffer that is passed in. + Closes https://github.com/libssh2/libssh2/pull/215 -- sftp_write: polished and simplified +- makefile.m32: allow to override gcc, ar and ranlib - Removed unnecessary struct fields and state changes within the function. + Allow to ovverride certain build tools, making it possible to + use LLVM/Clang to build libssh2. The default behavior is unchanged. + To build with clang (as offered by MSYS2), these settings can + be used: - Made the loop that checks for ACKs only check chunks that were fully - sent. - -- SCP: on failure, show the numerical error reason + LIBSSH2_CC=clang + LIBSSH2_AR=llvm-ar + LIBSSH2_RANLIB=llvm-ranlib - By calling libssh2_session_last_errno() + Also adjust ranlib parameters to be compatible with LLVM/Clang's + ranlib tool. + + Closes https://github.com/libssh2/libssh2/pull/214 -- SFTP: provide the numerical error reason on failure +GitHub (27 Sep 2017) +- [Will Cosgrove brought this change] -- SCP: clean up failure treatment + Fixes out of bounds memory access (#210) - When SCP send or recv fails, it gets a special message from the server - with a warning or error message included. We have no current API to - expose that message but the foundation is there. Removed unnecessary use - of session struct fields. + If an invalid PEM file is read and the lines are longer than 128 characters it will go out of bounds and crash on line 91. -- sftp_write: enlarge buffer to perform better +Will Cosgrove (11 Sep 2017) +- [Kamil Dudka brought this change] -- packets: code cleanup + scp: do not NUL-terminate the command for remote exec (#208) - I added size checks in several places. I fixed the code flow to be easier - to read in some places. + It breaks SCP download/upload from/to certain server implementations. - I removed unnecessary zeroing of structs. I removed unused struct fields. + The bug does not manifest with OpenSSH, which silently drops the NUL + byte (eventually with any garbage that follows the NUL byte) before + executing it. + + Bug: https://bugzilla.redhat.com/1489736 -- LIBSSH2_CALLBACK_MACERROR: clarify return code use +GitHub (21 Aug 2017) +- [Viktor Szakats brought this change] -- _libssh2_userauth_publickey: avoid shadowing + openssl.c: remove no longer used variable (#204) + + after e378d2e30a40bd9bcee06dc3a4250f269098e200 -- packet: avoid shadowing global symbols +- [Will Cosgrove brought this change] -- sftp_readdir: avoid shadowing + Fix for #188 (#189) + + * Update openssl.c + + * Create openssl.h -- shadowing: don't shadow the global compress +Will Cosgrove (24 May 2017) +- [Marcel Raad brought this change] -- _libssh2_packet_add: turn ifs into a single switch + openssl: fix build with OpenSSL 1.1 API (#176) + + When building with OPENSSL_API_COMPAT=0x10100000L, OpenSSL_add_all_algorithms + and OpenSSL_add_all_ciphers don't exist. The corresponding functionality is + handled automatically with OpenSSL 1.1. -- _libssh2_packet_add: check SSH_MSG_GLOBAL_REQUEST packet +- [Sune Bredahl brought this change] -- _libssh2_packet_add: SSH_MSG_DEBUG length checks + Add support for SHA256 hostkey fingerprints (#180) - Verify lengths before using them. Read always_display from the correct - index. Don't copy stuff around just to provide zero-termination of the - strings. + Looks good, thanks! -- _libssh2_packet_add: SSH_MSG_IGNORE skip memmove - - There's no promise of a zero termination of the data in the callback so - no longer perform ugly operation in order to provide it. +GitHub (12 May 2017) +- [Will Cosgrove brought this change] -- _libssh2_packet_add: SSH_MSG_DISCONNECT length checks + Fix memory leak of crypt_ctx->h using openSSL 1.1+ (#177) - Verify lengths before trying to read data. + Need to use EVP_CIPHER_CTX_free instead of EVP_CIPHER_CTX_reset. -- indent: break lines at 80 columns +Marc Hoersken (2 Mar 2017) +- tests/openssh_server/authorized_keys: add key_rsa_encrypted.pub -- SSH_MSG_CHANNEL_OPEN_FAILURE: used defined values - - We don't like magic numbers in the code. Now the acceptable failure - codes sent in the SSH_MSG_CHANNEL_OPEN_FAILURE message are added as - defined values in the private header file. +- tests: add simple test for passphrase-protected PEM file support -- sftp_write: don't return EAGAIN if no EAGAIN was received - - This function now only returns EAGAIN if a lower layer actually returned - EAGAIN to it. If nothing was acked and no EAGAIN was received, it will - now instead return 0. +- os400qc3: enable passphrase-protected PEM file support using pem.c -- _libssh2_wait_socket: detect nothing-to-wait-for - - If _libssh2_wait_socket() gets called but there's no direction set to - wait for, this causes a "hang". This code now detects this situation, - set a 1 second timeout instead and outputs a debug output about it. +- pem: fix indentation and replace assert after 386e012292 -- decomp: remove the free_dest argument - - Since the decompress function ALWAYS returns allocated memory we get a - lot simpler code by removing the ability to return data unallocated. +- [Keno Fischer brought this change] -- decomp: cleaned off old compression stuff + pem: add passphrase-protected PEM file support for libgcrypt and wincng - I cleared off legacy code from when the compression and decompression - functions were a single unified function. Makes the code easier to read - too. + Since they use our own PEM parser which did not support encrypted + PEM files, trying to use such files on these backends failed. + Fix that by augmenting the PEM parser to support encrypted PEM files. -- [TJ Saunders brought this change] +- [Thomas brought this change] - decomp: increase decompression buffer sizes + misc: use time constant implementation for AES CTR increment -- [TJ Saunders brought this change] +- [Thomas brought this change] - zlib: Add debug tracing of zlib errors + wincng: add AES CTR mode support (aes128-ctr, aes192-ctr, aes256-ctr) -- sftp_packet_read: handle partial reads of the length field - - SFTP packets come as [32 bit length][payload] and the code didn't - previously handle that the initial 32 bit field was read only partially - when it was read. +- [Thomas brought this change] -- [Jasmeet Bagga brought this change] + openssl: move shared AES-CTR code into misc - kex_agree_hostkey: fix NULL pointer derefence +Daniel Stenberg (20 Dec 2016) +- [Alex Crichton brought this change] + + kex: acknowledge error code from libssh2_dh_key_pair() - While setting up the session, ssh tries to determine the type of - encryption method it can use for the session. This requires looking at - the keys offered by the remote host and comparing these with the methods - supported by libssh2 (rsa & dss). To do this there is an iteration over - the array containing the methods supported by libssh2. + Fixes a segfault using ssh-agent on Windows - If there is no agreement on the type of encryption we come to the 3rd - entry of the hostkeyp array. Here hostkeyp is valid but *hostkep is - NULL. Thus when we dereference that in (*hostkeyp)->name there is a - crash + This commit fixes a segfault seen dereferencing a null pointer on + Windows when using ssh-agent. The problem ended up being that errors + weren't being communicated all the way through, causing null pointers to + be used when functions should have bailed out sooner. + + The `_libssh2_dh_key_pair` function for WinCNG was modified to propagate + errors, and then the two callsites in kex.c of + `diffie_hellman_sha{1,256}` were updated to recognize this error and + bail out. + + Fixes #162 + Closes #163 -- _libssh2_transport_send: remove dead assignment +Alexander Lamaison (27 Nov 2016) +- [monnerat brought this change] + + Implement Diffie-Hellman computations in crypto backends. (#149) - 'data' isn't accessed beyond this point so there's no need to assign it. + Not all backends feature the low level API needed to compute a Diffie-Hellman + secret, but some of them directly implement Diffie-Hellman support with opaque + private data. The later approach is now generalized and backends are + responsible for all Diffie Hellman computations. + As a side effect, procedures/macros _libssh2_bn_rand and _libssh2_bn_mod_exp + are no longer needed outside the backends. -- scp_recv: remove dead assignment +Peter Stuge (16 Nov 2016) +- acinclude.m4: The mbedtls crypto backend actually requires libmbedcrypto - Instead of assigning a variable we won't read, we now use the more - explicit (void) prefix. + Examples can't be linked with libmbedtls but need libmbedcrypto, and + any users of libssh2 which use libtool and libssh2.la would encounter + the same problem. + + This changes the mbedtls detection to search for libmbedcrypto, which + is the actual dependency for the backend. -- sftp_write: removed superfluous assignment +- acinclude.m4: Add CPPFLAGS=-I$prefix-dir/include in LIBSSH2_LIB_HAVE_LINKFLAGS + + This is absolutely neccessary for header files to be found when + AC_LIB_HAVE_LINKFLAGS searches for libraries. -- bugfix: avoid use of uninitialized value +- acinclude.m4: Make saved variables in LIBSSH2_LIB_HAVE_LINKFLAGS uniform -- sftp_packet_require: propagate error codes better - - There were some chances that they would cause -1 to get returned by - public functions and as we're hunting down all such occurances and since - the underlying functions do return valuable information the code now - passes back proper return codes better. +- docs/HACKING.CRYPTO: Improve documentation for autoconf build system -- [Alfred Gebert brought this change] +Alexander Lamaison (16 Nov 2016) +- [Alex Arslan brought this change] - fix memory leaks (two times cipher_data) for each sftp session + Check for netinet/in.h in the tests cmake file (#148) -- libssh2_userauth_authenticated: make it work as documented - - The man page clearly says it returns 1 for "already authenticated" but - the code said non-zero. I changed the code to use 1 now, as that is also - non-zero but it gets the benefit that it now matches the documentation. - - Using 1 instead of non-zero is better for two reasons: - - 1. We have the opportunity to introduce other return codes in the future for - things like error and what not. - 2. We don't expose the internal bitmask variable value. +- [Patrick Monnerat brought this change] -- userauth_keyboard_interactive: fix indent + Define new Diffie-Hellman context for mbedTLS -- [Alfred Gebert brought this change] +- [monnerat brought this change] - fix memory leak in userauth_keyboard_interactive() + Make libssh2 work again on os400. (#118) - First I wanted to free the memory in session_free() but then - I had still memory leaks because in my test case the function - userauth_keyboard_interactive() is called twice. It is called - twice perhaps because the server has this authentication - methods available: publickey,gssapi-with-mic,keyboard-interactive - The keyboard-interactive method is successful. - -- dist: include sftp.h in dist archives - -Simon Josefsson (27 Oct 2010) -- Update header to match new function prototype, see c48840ba88. - -Daniel Stenberg (26 Oct 2010) -- bugfixes: the transport rearrange left some subtle flaws now gone - -- libssh2_userauth_publickey_fromfile_ex.3: cleaned up looks - -- libssh2_userauth_publickey: add man page + * os400: minimum supported OS version is now V6R1. + Do not log compiler informational messages. - I found an undocumented public function and we can't have it like - that. The description here is incomplete, but should serve as a template - to allow filling in... - -- libssh2_sftp_write.3: added blurb about the "write ahead" + * Implement crypto backend specific Diffie-Hellman computation. - Documented the new SFTP write concept + This feature is now needed on os400 because the QC3 library does not + implement bn_mod_exp() natively. Up to now, this function was emulated using + an RSA encryption, but commits ca5222ea819cc5ed797860070b4c6c1aeeb28420 and + 7934c9ce2a029c43e3642a492d3b9e494d1542be (CVE-2016-0787) broke the emulation + because QC3 only supports RSA exponents up to 512 bits. + + Happily, QC3 supports a native API for Diffie-Hellman computation, with + opaque random value: this commit implements the use of this API and, as a + side effect, enables support of this feature for any other crypto backend that + would use it. + + A "generic" Diffie-Hellman computation internal API supports crypto backends + not implementing their own: this generic API uses the same functions as before. + + * Fix typos in docs/HACKING.CRYPTO. -- sftp_close_handle: free any trailing write chunks +- [Peter Stuge brought this change] -- _libssh2_channel_write: fix warnings + acinclude.m4: Fixup OpenSSL EVP_aes_128_ctr() detection -- SFTP: bufgix, move more sftp stuff to sftp.h +- [Peter Stuge brought this change] + + configure.ac: Add --with-crypto= instead of many different --with-$backend - The sftp_write function shouldn't assume that the buffer pointer will be - the same in subsequent calls, even if it assumes that the data already - passed in before haven't changed. + The new --with-crypto option replaces the previous backend-specific + --with-{openssl,libgcrypt,mbedtls,wincng} options and fixes some issues. - The sftp structs are now moved to sftp.h (which I forgot to add before) - -- SFTP: use multiple outgoing packets when writing + * libgcrypt or mbedtls would previously be used whenever found, even + if configure was passed --without-libgcrypt or --without-mbedtls. - sftp_write was rewritten to split up outgoing data into multiple packets - and deal with the acks in a more asynchronous manner. This is meant to - help overcome latency and round-trip problems with the SFTP protocol. + * If --with-$backend was specified then configure would not fail even + if that library could not be found, and would instead use whichever + crypto library was found first. + + The new option defaults to `auto`, which makes configure check for all + supported crypto libraries in turn, choosing the first one found, or + exiting with an error if none can be found. -- TODO: implemented a lot of the ideas now +- [Tony Kelman brought this change] -- _libssh2_channel_write: removed 32500 size limit + Build mbedtls from source on Travis (#133) - Neither _libssh2_channel_write nor sftp_write now have the 32500 size - limit anymore and instead the channel writing function now has its own - logic to send data in multiple calls until everything is sent. - -- send_existing: don't tell parent to return when drained + * Revert "Revert "travis: Test mbedtls too"" - That will just cause unnecessary code execution. - -- _libssh2_channel_write: general code cleanup + This reverts commit c4c60eac5ca756333034b07dd9e0b97741493ed3. - simplified the function and removed some unused struct fields - -- _libssh2_transport_send: replaces _libssh2_transport_write + * travis: Build mbedtls from source on Travis - The new function takes two data areas, combines them and sends them as a - single SSH packet. This allows several functions to allocate and copy - less data. + Use TOOLCHAIN_OPTION when calling cmake on mbedtls - I also found and fixed a mixed up use of the compression function - arguments that I introduced in my rewrite in a recent commit. - -- scp_write_nonblock: use select() instead of busyloop + * tests: only run DSA tests for non-mbedtls - Make this example nicer by not busylooping. + crypto backends -- send_existing: clear olen when the data is sent off +- [Peter Stuge brought this change] -- _libssh2_transport_write: allow 256 extra bytes around the packet + configure.ac src/Makefile.am: Remove dead AM_CONDITIONAL(OS400QC3) + + According to os400/README400 this backend can not be built + with configure+make, and the conditional is hard coded to false. -- _libssh2_transport_write: remade to send without malloc +- [Peter Stuge brought this change] -- compress: compression disabled by default + configure.ac: Add -DNDEBUG to CPPFLAGS in non-debug builds - We now allow libssh2_session_flag() to enable compression with a new - flag and I added documentation for the previous LIBSSH2_FLAG_SIGPIPE - flag which I wasn't really aware of! + There are a few uses of assert() in channel.c, sftp.c and transport.c. -- comp: split the compress function +- [Peter Stuge brought this change] + + src/global.c: Fix conditional AES-CTR support - It is now made into two separate compress and decompress functions. In - preparation for upcoming further modficications. + Most of libssh2 already has conditional support for AES-CTR according to + the LIBSSH2_AES_CTR crypto backend #define, but global.c needed fixing. -Dan Fandrich (20 Oct 2010) -- Added header file to allow compiling in older environments +- [Peter Stuge brought this change] -Daniel Stenberg (20 Oct 2010) -- TODO: add a possible new API for SFTP transfers + src/crypto.h src/userauth.c: Fix conditional RSA support + + Most of libssh2 already has conditional support for RSA according to + the LIBSSH2_RSA crypto backend #define, but crypto.h and userauth.c + needed a few small fixes. -- TODO: "New Transport API" added +- [Peter Stuge brought this change] -- TODO: add buffering plans + src/kex.c: Cast libssh2_sha{1,256}_update data arguments properly + + The update functions take a const unsigned char * but were called + with (const) char * in some places, causing unneccessary warnings. -Simon Josefsson (13 Oct 2010) -- Mention libssh2_channel_get_exit_signal and give kudos. +- [Peter Stuge brought this change] -- [Tommy Lindgren brought this change] + docs/HACKING.CRYPTO: Fix two type typos - Add libssh2_channel_get_exit_signal man page. +- [Sergei Trofimovich brought this change] + + acinclude.m4: fix ./configure --with-libgcrypt - Signed-off-by: Simon Josefsson + The change fixes passing of bogus gcrypt prefix. + Reproducible as: + + $ ./configure --with-libgcrypt + $ make V=1 + ... + /bin/sh ../libtool --tag=CC --mode=link gcc -g -O2 -Iyes/include -version-info 1:1:0 -no-undefined -export-symbols-regex '^libssh2_.*' -lgcrypt -lz -Lyes/lib -o libssh2.la -rpath /usr/local/lib channel.lo comp.lo crypt.lo hostkey.lo kex.lo mac.lo misc.lo packet.lo publickey.lo scp.lo session.lo sftp.lo userauth.lo transport.lo version.lo knownhost.lo agent.lo libgcrypt.lo pem.lo keepalive.lo global.lo -lgcrypt + ../libtool: line 7475: cd: yes/lib: No such file or directory + libtool: error: cannot determine absolute directory name of 'yes/lib' + + These + -Iyes/include + -Lyes/lib + come from libgcrypt code autodetection: + if test -n "$use_libgcrypt" && test "$use_libgcrypt" != "no"; then + LDFLAGS="$LDFLAGS -L$use_libgcrypt/lib" + CFLAGS="$CFLAGS -I$use_libgcrypt/include" + + I assume it's a typo to use yes/no flag as a prefix and changed + it to '$with_libgcrypt_prefix'. + + Reported-by: Mikhail Pukhlikov + Signed-off-by: Sergei Trofimovich -- [Tommy Lindgren brought this change] +- [Zenju brought this change] - Add libssh2_channel_get_exit_signal. + libssh2_sftp_init hang: last error not set - Signed-off-by: Simon Josefsson - -- Add libssh2_free man page and fix typo. + The problem is that the original if statement simply returns NULL, but does not set the session last error code. The consequence is that libssh2_sftp_init() also returns NULL and libssh2_session_last_errno(sshSession) == LIBSSH2_ERROR_NONE. + + In my test the LIBSSH2_ERROR_EAGAIN is coming from sftp.c row 337: + if(4 != sftp->partial_size_len) + /* we got a short read for the length part */ + return LIBSSH2_ERROR_EAGAIN; + + with "partial_size_len == 0". Not sure if this is expected. -- Add libssh2_free. +- [Aidan Hobson Sayers brought this change] -Daniel Stenberg (11 Oct 2010) -- scp_recv: improved treatment of channel_read() returning zero + docs: correctly describe channel_wait_eof - As a zero return code from channel_read() is not an error we must make - sure that the SCP functions deal with that properly. channel_read() - always returns 0 if the channel is EOFed already so we check for EOF - after 0-reads to be able to return error properly. + channel_wait_eof waits for channel->remote.eof, which is set on + receiving a `SSH_MSG_CHANNEL_EOF` message. This message is sent + when a party has no more data to send on a channel. -- libssh2_session_methods.3: detail what can be asked for +- [Zenju brought this change] -- compression: send zlib before none + Fix MSVC 14 compilation warning (#92) - As the list of algorithms in a preferred order we should send zlib - before none to increase the chances that the server will let us do - compression. + 1> sftp.c + 1>libssh2-files\src\sftp.c(3393): warning C4456: declaration of 'retcode' hides previous local declaration + 1> libssh2-files\src\sftp.c(3315): note: see declaration of 'retcode' -- compress: faster check, better return codes +- [Salvador Fandino brought this change] + + LIBSSH2_ERROR_CHANNEL_WINDOW_FULL: add new error code - In the transport functions we avoid a strcmp() now and just check a - boolean instead. + In order to signal that the requested operation can not succeed + because the receiving window had been exhausted, the error code + LIBSSH2_ERROR_BUFFER_TOO_SMALL has been reused but I have found + that in certain context it may be ambigous. - The compress/decompress function's return code is now acknowledged and - used as actual return code in case of failures. + This patch introduces a new error code, + LIBSSH2_ERROR_CHANNEL_WINDOW_FULL, exclusive to signal that condition. -- libssh2_session_handshake: replaces libssh2_session_startup() - - The function libssh2_session_startup() is now considered deprecated due - to the portability issue with the socket argument. - libssh2_session_handshake() is the name of the replacement. +- [Salvador Fandino brought this change] -- libssh2_socket_t: now externally visible + channel_wait_eof: handle receive window exhaustion - In preparation for upcominig changes, the libssh2_socket_t type is now - typedef'ed in the public header. - -- _libssh2_transport_drain: removed + Until now, in blocking mode, if the remote receiving window is + exhausted this function hangs forever as data is not read and the + remote side just keeps waiting for the window to grow before sending + more data. - This function proved not to be used nor useful. + This patch, makes this function check for that condition and abort + with an error when it happens. -- _libssh2_channel_write: don't iterate over transport writes +- [Salvador Fandino brought this change] + + channel_wait_closed: don't fail when unread data is queued - When a call to _libssh2_transport_write() succeeds, we must return from - _libssh2_channel_write() to allow the caller to provide the next chunk - of data. + This function was calling channel_wait_eof to ensure that the EOF + packet has already been received, but that function also checks that + the read data queue is empty before reporting the EOF. That caused + channel_wait_closed to fail with a LIBSSH2_ERROR_INVAL when some data + was queued even after a successful call to libssh2_channel_wait_eof. - We cannot move on to send the next piece of data that may already have - been provided in this same function call, as we risk getting EAGAIN for - that and we can't return information both about sent data as well as - EAGAIN. So, by returning short now, the caller will call this function - again with new data to send. + This patch changes libssh2_channel_wait_closed to look directly into + channel->remote.eof so that both libssh2_channel_wait_eof and + libssh2_channel_wait_closed bahave consistently. -- _libssh2_transport_write: updated documentation blurb +- [Salvador Fandino brought this change] -- _libssh2_transport_write: remove fprintf remainder - - Mistake from previous debugging + channel_wait_eof: fix debug message -- session: improved errors +Daniel Stenberg (25 Oct 2016) +- libssh2.h: start working on 1.8.1 + +Version 1.8.0 (25 Oct 2016) + +Daniel Stenberg (25 Oct 2016) +- RELEASE-NOTES: adjusted for 1.8.0 + +Kamil Dudka (20 Oct 2016) +- Revert "aes: the init function fails when OpenSSL has AES support" - Replaced -1/SOCKET_NONE errors with appropriate error defines instead. + This partially reverts commit f4f2298ef3635acd031cc2ee0e71026cdcda5864 + because it caused the compatibility code to call initialization routines + redundantly, leading to memory leakage with OpenSSL 1.1 and broken curl + test-suite in Fedora: - Made the verbose trace output during banner receiving less annoying for - non-blocking sessions. + 88 bytes in 1 blocks are definitely lost in loss record 5 of 8 + at 0x4C2DB8D: malloc (vg_replace_malloc.c:299) + by 0x72C607D: CRYPTO_zalloc (mem.c:100) + by 0x72A2480: EVP_CIPHER_meth_new (cmeth_lib.c:18) + by 0x4E5A550: make_ctr_evp.isra.0 (openssl.c:407) + by 0x4E5A8E8: _libssh2_init_aes_ctr (openssl.c:471) + by 0x4E5BB5A: libssh2_init (global.c:49) -- crypt_init: use correct error define +Daniel Stenberg (19 Oct 2016) +- [Charles Collicutt brought this change] -- _libssh2_error: hide EAGAIN for non-blocking sessions + libssh2_wait_socket: Fix comparison with api_timeout to use milliseconds (#134) - In an attempt to make the trace output less cluttered for non-blocking - sessions the error function now avoids calling the debug function if the - error is the EAGAIN and the session is non-blocking. + Fixes #74 -- agent: use better error defines +- [Charles Collicutt brought this change] -- comp_method_zlib_init: use correct error defines + Set err_msg on _libssh2_wait_socket errors (#135) -- transport: better error codes +- Revert "travis: Test mbedtls too" - LIBSSH2_SOCKET_NONE (-1) should no longer be used as error code as it is - (too) generic and we should instead use specific and dedicated error - codes to better describe the error. - -- channel: return code and _libssh2_error cleanup + This reverts commit 3e6de50a24815e72ec5597947f1831f6083b7da8. - Made sure that all transport_write() call failures get _libssh2_error - called. + Travis doesn't seem to support the mbedtls-dev package -- _libssh2_channel_write: limit to 32700 bytes +- maketgz: support "only" to only update version number locally - The well known and used ssh server Dropbear has a maximum SSH packet - length at 32768 by default. Since the libssh2 design current have a - fixed one-to-one mapping from channel_write() to the packet size created - by transport_write() the previous limit of 32768 in the channel layer - caused the transport layer to create larger packets than 32768 at times - which Dropbear rejected forcibly (by closing the connection). + and fix the date output locale + +- configure: make the --with-* options override the OpenSSL default - The long term fix is of course to remove the hard relation between the - outgoing SSH packet size and what the input length argument is in the - transport_write() function call. + ... previously it would default to OpenSSL even with the --with-[crypto] + options used unless you specificly disabled OpenSSL. Now, enabling another + backend will automatically disable OpenSSL if the other one is found. -- libssh.h: add more dedicated error codes +- [Keno Fischer brought this change] -- SCP: allow file names with bytes > 126 - - When parsing the SCP protocol and verifying that the data looks like a - valid file name, byte values over 126 must not be consider illegal since - UTF-8 file names will use such codes. - - Reported by: Uli Zappe - Bug: http://www.libssh2.org/mail/libssh2-devel-archive-2010-08/0112.shtml + docs: Add documentation on new cmake/configure options -Dan Fandrich (25 Aug 2010) -- Document the three sftp stat constants +- [Keno Fischer brought this change] -Guenter Knauf (18 Aug 2010) -- Fixed Win32 makefile which was now broken at resource build. + configure: Add support for building with mbedtls -- It is sufficient to pipe stderr to NUL to get rid of the nasty messages. +- [wildart brought this change] -- [Author: Guenter Knauf brought this change] + travis: Test mbedtls too - Removed Win32 ifdef completely for sys/uio.h. - - No idea why we had this ifdef at all but MSVC, MingW32, Watcom - and Borland all have no sys/uio.h header; so if there's another - Win32 compiler which needs it then it should be added explicitely - instead of this negative list. +- [wildart brought this change] -- New files should also be added to Makefile.am. + crypto: add support for the mbedTLS backend - Otherwise they will never be included with release and snapshot tarballs ... + Closes #132 -Daniel Stenberg (18 Aug 2010) -- version: bump to 1.2.8_DEV +- [wildart brought this change] -Version 1.2.7 (17 Aug 2010) + cmake: Add CLEAR_MEMORY option, analogously to that for autoconf -Daniel Stenberg (17 Aug 2010) -- release: updated to hold 1.2.7 info +- README.md: fix link typo -Guenter Knauf (17 Aug 2010) -- Use the new libssh2.rc file. +- README: markdown version to look nicer on github -- Added resource file for libssh2.dll (shamelessly stolen from libcurl). +Viktor Szakats (5 Sep 2016) +- [Taylor Holberton brought this change] -- Updated Win32 MSVC dependencies versions. + openssl: add OpenSSL 1.1.0 compatibility -- Added include for sys/select.h to get fd.set on some platforms. +Daniel Stenberg (4 Sep 2016) +- [Antenore Gatta brought this change] -- Added Watcom makefile borrowed from libcurl. + tests: HAVE_NETINET_IN_H was not defined correctly (#127) - This makefile compiles already all files fine for static lib, but needs - final touch when I have OpenSSL fully working with shared libs and Watcom. + Fixes #125 -- Added copyright define to libssh2.h and use it for binary builds. +- SECURITY: fix web site typo -- Moved version defines up in order to include from .rc file. +- SECURITY: security process + +GitHub (14 Aug 2016) +- [Alexander Lamaison brought this change] + + Basic dockerised test suite. - Blocked rest of header with ifndef so its possible to let - the rc compiler only use the version defines. + This introduces a test suite for libssh2. It runs OpenSSH in a Docker + container because that works well on Windows (via docker-machine) as + well as Linux. Presumably it works on Mac too with docker-machine, but + I've not tested that. + + Because the test suite is docker-machine aware, you can also run it + against a cloud provider, for more realistic network testing, by setting + your cloud provider as your active docker machine. The Appveyor CI setup + in this commit does that because Appveyor doesn't support docker + locally. -- Some minor makefile tweaks. +Kamil Dudka (3 Aug 2016) +- [Viktor Szakats brought this change] -Daniel Stenberg (2 Aug 2010) -- example: treat the libssh2_channel_read() return code properly + misc.c: Delete unused static variables - A short read is not an error. Only negative values are errors! + Closes #114 -- libssh2_wait_socket: reset error code to "leak" EAGAIN less +Daniel Stenberg (9 Apr 2016) +- [Will Cosgrove brought this change] + + Merge pull request #103 from willco007/patch-2 - Since libssh2 often sets LIBSSH2_ERROR_EAGAIN internally before - _libssh2_wait_socket is called, we can decrease some amount of - confusion in user programs by resetting the error code in this function - to reduce the risk of EAGAIN being stored as error when a blocking - function returns. + Fix for security issue CVE-2016-0787 -- _libssh2_wait_socket: poll needs milliseconds +Alexander Lamaison (2 Apr 2016) +- [Zenju brought this change] + + Fix MSVC 14 compilation errors - As reported on the mailing list, the code path using poll() should - multiple seconds with 1000 to get milliseconds, not divide! + For _MSC_VER == 1900 these macros are not needed and create problems: - Reported by: Jan Van Boghout - -- typedef: make ssize_t get typedef without LIBSSH2_WIN32 - The condition around the ssize_t typedef depended on both LIBSSH2_WIN32 - *and* _MSC_VER being defined when it should be enough to depend on - _MSC_VER only. It also makes it nicer so libssh2-using code builds fine - without having custom defines. + + 1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\ucrt\stdio.h(1925): warning C4005: 'snprintf': macro redefinition (compiling source file libssh2-files\src\mac.c) + + 1> \win32\libssh2_config.h(27): note: see previous definition of 'snprintf' (compiling source file libssh2-files\src\mac.c) + + 1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\ucrt\stdio.h(1927): fatal error C1189: #error: Macro definition of snprintf conflicts with Standard Library function declaration (compiling source file libssh2-files\src\mac.c) -- [John Little brought this change] +Daniel Stenberg (26 Mar 2016) +- [Brad Harder brought this change] - session_free: free more data to avoid memory leaks + _libssh2_channel_open: speeling error fixed in channel error message -- channel_free: ignore problems with channel_close() - - As was pointed out in bug #182, we must not return failure from - _libssh2_channel_free() when _libssh2_channel_close() returns an error - that isn't EAGAIN. It can effectively cause the function to never go - through, like it did now in the case where the socket was actually - closed but socket_state still said LIBSSH2_SOCKET_CONNECTED. +Alexander Lamaison (15 Mar 2016) +- Link with crypt32.lib on Windows. - I consider this fix the right thing as it now also survives other - errors, even if making sure socket_state isn't lying is also a good - idea. - -- publickey_list_free: no return value from a void function + Makes linking with static OpenSSL work again. Although it's not + required for dynamic OpenSSL, it does no harm. - Fixed a compiler warning I introduced previously when checking input - arguments more. I also added a check for the other pointer to avoid NULL - pointer dereferences. + Fixes #98. -- [Lars Nordin brought this change] +- [Craig A. Berry brought this change] - openssl: make use of the EVP interface + Tweak VMS help file building. - Make use of the EVP interface for the AES-funktion. Using this method - supports the use of different ENGINES in OpenSSL for the AES function - (and the direct call to the AES_encrypt should not be used according to - openssl.org) + Primarily this is handling cases where top-level files moved into + the docs/ directory. I also corrected a typo and removed the + claim that libssh2 is public domain. -Peter Stuge (23 Jun 2010) -- [Tor Arntsen brought this change] +- [Craig A. Berry brought this change] - Don't overflow MD5 server hostkey + Build with standard stat structure on VMS. - Use SHA_DIGEST_LENGTH and MD5_DIGEST_LENGTH in memcpy instead of hardcoded - values. An incorrect value was used for MD5. + This gets us large file support, is available on any VMS release + in the last decade and more, and gives stat other modern features + such as 64-bit ino_t. -- Fix message length bugs in libssh2_debug() - - There was a buffer overflow waiting to happen when a debug message was - longer than 1536 bytes. - - Thanks to Daniel who spotted that there was a problem with the message - length passed to a trace handler also after commit - 0f0652a3093111fc7dac0205fdcf8d02bf16e89f. +- [Craig A. Berry brought this change] -- Make libssh2_debug() create a correctly terminated string + Update vms/libssh2_config.h. - Also use FILE *stderr rather than fd 2, which can very well be something - completely different. + VMS does have stdlib.h, gettimeofday(), and OpenSSL. The latter + is appropriate to hard-wire in the configuration because it's + installed by default as part of the base operating system and + there is currently no libgcrypt port. -Daniel Stenberg (23 Jun 2010) -- [TJ Saunders brought this change] +- [Craig A. Berry brought this change] - handshake: Compression enabled at the wrong time - - In KEXINIT messages, the client and server agree on, among other - things, whether to use compression. This method agreement occurs - in src/kex.c's kex_agree_methods() function. However, if - compression is enabled (either client->server, server->client, or - both), then the compression layer is initialized in - kex_agree_methods() -- before NEWKEYS has been received. - - Instead, the initialization of the compression layer should - happen after NEWKEYS has been received. This looks to occur - insrc/kex.c's diffie_hellman_sha1(), which even has the comment: - - /* The first key exchange has been performed, - - switch to active crypt/comp/mac mode */ - - There, after NEWKEYS is received, the cipher and mac algorithms - are initialized, and that is where the compression should be - initialized as well. - - The current implementation fails if server->client compression is - enabled because most server implementations follow OpenSSH's - lead, where compression is initialized after NEWKEYS. Since the - server initializes compression after NEWKEYS, but libssh2 - initializes compression after KEXINIT (i.e. before NEWKEYS), they - are out of sync. + VMS can't use %zd for off_t format. - Reported in bug report #180 + %z is a C99-ism that VMS doesn't currently have; even though the + compiler is C99-compliant, the library isn't quite. The off_t used + for the st_size element of the stat can be 32-bit or 64-bit, so + detect what we've got and pick a format accordingly. -- [TJ Saunders brought this change] +- [Craig A. Berry brought this change] - userauth_hostbased_fromfile: packet length too short - - The packet length calculated in src/userauth.c's - userauth_hostbased_fromfile() function is too short by 4 bytes; - it forgets to add four bytes for the length of the hostname. - This causes hostbased authentication to fail, since the server - will read junk data. + Normalize line endings in libssh2_sftp_get_channel.3. - verified against proftpd's mod_sftp module + Somehow it got Windows-style CRLF endings so convert to just LF, + for consistency as well as not to confuse tools that will regard + the \r as content (e.g. the OpenVMS help librarian). -- _libssh2_userauth_publickey: reject method names longer than the data - - This functions get the method length by looking at the first 32 - bit of data, and I now made it not accept method lengths that are - longer than the whole data set is, as given in the dedicated - function argument. - - This was detected when the function was given bogus public key - data as an ascii string, which caused the first 32bits to create - a HUGE number. +Dan Fandrich (29 Feb 2016) +- libgcrypt: Fixed a NULL pointer dereference on OOM -- NULL resistance: make more public functions survive NULL pointer input - - Sending in NULL as the primary pointer is now dealt with by more - public functions. I also narrowed the userauth.c code somewhat to - stay within 80 columns better. +Daniel Stenberg (24 Feb 2016) +- [Viktor Szakats brought this change] -- agent: make libssh2_agent_userauth() work blocking properly + url updates, HTTP => HTTPS - previously it would always work in a non-blocking manner + Closes #87 -Peter Stuge (17 Jun 2010) -- Fix underscore typo for 64-bit printf format specifiers on Windows - - Commit 49ddf447ff4bd80285f926eac0115f4e595f9425 was missing underscores. +Dan Fandrich (23 Feb 2016) +- RELEASE-NOTES: removed some duplicated names -Daniel Stenberg (16 Jun 2010) -- libssh2_session_callback_set: extended the man page +Version 1.7.0 (23 Feb 2016) -- [John brought this change] +Daniel Stenberg (23 Feb 2016) +- web: the site is now HTTPS - LIBSSH2_DEBUG: macro uses incorrect function variable - - The LIBSSH2_DEBUG macro, defined in libssh2_priv.h, incorrectly uses the - function variable ssh_msg_disconnect when it should use ssh_msg_debug. - - This shows that the LIBSSH2_CALLBACK_DEBUG callback never has worked... +- RELEASE-NOTES: 1.7.0 release -- warning: fix a compiler warning 'pointer differs in signedness' +- diffie_hellman_sha256: convert bytes to bits - As reported in bug #177 - -- portability: introduce LIBSSH2_INT64_T_FORMAT for 64bit printf()s + As otherwise we get far too small numbers. - As pointed out in bug #177, some of the Windows compilers use - %I64 to output 64 bit variables with the printf family. - -- debug: avoid sending NULL to sprintf %s + Reported-by: Andreas Schneider - Via the _libssh2_debug() macro/function. Pointed out by john in bug report + CVE-2016-0787 -- sftp docs: show macro on macro page, only function on function page +Alexander Lamaison (18 Feb 2016) +- Allow CI failures with VS 2008 x64. - The individual man pages for macros now show the full convenience - macro as defined, and then the man page for the actual function - only shows the function. + Appveyor doesn't support this combination. -- code police: make the code use less than 80 columns +Daniel Stenberg (16 Feb 2016) +- [Viktor Szakats brought this change] -- libssh2_channel_write_ex: remove macros, added wording on buffer size + GNUmakefile: list system libs after user libs + + Otherwise some referenced WinSock functions will fail to + resolve when linking against LibreSSL 2.3.x static libraries + with mingw. + + Closes #80 -- libssh2_sftp_write: document buffer size and changed some ordering +- [Viktor Szakats brought this change] -- libssh2_channel_write_stderr: show how the macro is defined + openssl: apply new HAVE_OPAQUE_STRUCTS macro + + Closes #81 -- libssh2_channel_write: show how the macro is defined +- [Viktor Szakats brought this change] -- SFTP: limit write() to not produce overly large packets - - sftp_write() now limits how much data it gets at a time even more - than before. Since this function creates a complete outgoing - packet based on what gets passed to it, it is crucial that it - doesn't create too large packets. - - With this method, there's also no longer any problem to use very - large buffers in your application and feed that to libssh2. I've - done numerous tests now with uploading data over SFTP using 100K - buffers and I've had no problems with that. + openssl: fix LibreSSL support after OpenSSL 1.1.0-pre1/2 support -- scp_write_nonblock: add transfer time info +Alexander Lamaison (14 Feb 2016) +- sftp.h: Fix non-C90 type. - Using the same timing logic and output format as - sftp_write_nonblock allows us to very easily run benchmarks on - SCP vs SFTP uploads using libssh2. + uint64_t does not exist in C90. Use libssh2_uint64_t instead. -- sftp_write_nonblock: select() on socket, use *BIG* buffer, time transfer +- Exclude sshd tests from AppVeyor. - The select() is just to make it nicer so that it doesn't - crazy-loop on EAGAIN. The buffer size thing is mostly to verify - that this really work as supposed. - - Transfer timing is just a minor thing, but it can just as well be - there and help us time and work on performance easier using out - of the box examples. + They fail complaining that sshd wasn't invoked with an absolute path. -- agent: use _libssh2_error() when returning errors - - As pointed out in bug report #173, this module basically never - used _libssh2_error() which made it work inconstently with other - parts of the libssh2 code base. This is my first take at making - this code more in line with the rest. +- Test on more versions of Visual Studio. -- inputchecks: make lots of API functions check for NULL pointers - - If an application accidentally provides a NULL handle pointer to - the channel or sftp public functions, they now return an error - instead of segfaulting. +- Fix Appveyor builds. -- libssh2_channel_eof: clarify that it returns negative on errors +Daniel Stenberg (14 Feb 2016) +- [Viktor Szakats brought this change] -- SFTP: keep the sftp error code as 32 bit + openssl: add OpenSSL 1.1.0-pre3-dev compatibility - 'last_errno' holds to the error code from the SFTP protocol and - since that is 32 bits on the wire there's no point in using a - long for this internally which is larger on some platforms. - -- agent: make the code better deal with unexpected code flows + by using API instead of accessing an internal structure. - agent->ops gets initialized by the libssh2_agent_connect() call - but we need to make sure that we don't segfault even if a bad - sequence of function calls is used. + Closes #83 -Alexander Lamaison (10 Jun 2010) -- Better handling of invalid key files. - - Passing an invalid public key to libssh2_userauth_publickey_fromfile_ex - triggered an assertion. Replaced this with a runtime check that rejects - obviously invalid key data. +- RELEASE-NOTES: synced with 996b04ececdf -Daniel Stenberg (10 Jun 2010) -- version: we start working on 1.2.7 now +- include/libssh2.h: next version is 1.7.0 -Version 1.2.6 (10 Jun 2010) +- configure: build "silent" if possible -Daniel Stenberg (10 Jun 2010) -- NEWS: add the 1.2.6 release details +- sftp: re-indented some minor stuff -- RELEASE-NOTES: 1.2.6 details added +- [Jakob Egger brought this change] -Guenter Knauf (10 Jun 2010) -- fixed libssh2.dsw to use the generated libssh2.dsp; removed old *.dsp files. + sftp.c: ensure minimum read packet size + + For optimum performance we need to ensure we don't request tiny packets. -- moved MSVC strdup define to libssh2_config.h which we include already. +- [Jakob Egger brought this change] -- added missing source files to src/NMakefile. + sftp.c: Explicit return values & sanity checks -Daniel Stenberg (8 Jun 2010) -- libssh2_poll: refer to poll(3) and select(3) instead +- [Jakob Egger brought this change] -- example: fix strdup() for MSVC compiles + sftp.c: Check Read Packet File Offset - MSVC has a _strdup() that we better use. This was reported in bug - -- SFTP: fail init SFTP if session isn't authenticated + This commit adds a simple check to see if the offset of the read + request matches the expected file offset. - Alexander Lamaison filed bug #172 - (http://trac.libssh2.org/ticket/172), and pointed out that SFTP - init would do bad if the session isn't yet authenticated at the - time of the call, so we now check for this situation and returns - an error if detected. Calling sftp_init() at this point is bad - usage to start with. + We could try to recover, from this condition at some point in the future. + Right now it is better to return an error instead of corrupted data. -- direct_tcpip: bring back inclusion of libssh2_config.h - - In order to increase portability of this example, I'm bringing - the inclusion of libssh2_config.h back, and I also added an - require that header for this example to compile. - - I also made all code lines fit within 80 columns. +- [Jakob Egger brought this change] -Guenter Knauf (3 Jun 2010) -- cast away a warning. + sftp.c: Don't return EAGAIN if data was written to buffer -- moved CRT_SECURE_NO_DEPRECATE define up so its defined before the winsock headers are included. +- [Jakob Egger brought this change] -- fixed platform detection for MingW32 test makefile. + sftp.c: Send at least one read request before reading + + This commit ensures that we have sent at least one read request before + we try to read data in sftp_read(). + + Otherwise sftp_read() would return 0 bytes (indicating EOF) if the + socket is not ready for writing. -- MingW32 has gettimeofday() implemented, so proper ifdef this function here. +- [Jakob Egger brought this change] -- removed MSVC ifdef since seems we can use __int64 still with latest headers. + sftp.c: stop reading when buffer is full + + Since we can only store data from a single chunk in filep, + we have to stop receiving data as soon as the buffer is full. + + This adresses the following bug report: + https://github.com/libssh2/libssh2/issues/50 -- changed copyright notice for MinW32 and NetWare binaries. +Salvador Fandiño (21 Jan 2016) +- agent_disconnect_unix: unset the agent fd after closing it + + "agent_disconnect_unix", called by "libssh2_agent_disconnect", was + leaving the file descriptor in the agent structure unchanged. Later, + "libssh2_agent_free" would call again "libssh2_agent_disconnect" under + the hood and it would try to close again the same file descriptor. In + most cases that resulted in just a harmless error, but it is also + possible that the file descriptor had been reused between the two + calls resulting in the closing of an unrelated file descriptor. + + This patch sets agent->fd to LIBSSH2_INVALID_SOCKET avoiding that + issue. + + Signed-off-by: Salvador Fandiño -- cleaned up MSVC ifdefs which where spreaded over 3 places. +Daniel Stenberg (18 Jan 2016) +- [Patrick Monnerat brought this change] -- added uint8_t typedef for NetWare CLIB platform. + os400qc3: support encrypted private keys + + PKCS#8 EncryptedPrivateKeyinfo structures are recognized and decoded to get + values accepted by the Qc3 crypto library. -- if the function declaration gets changed the header should be changed too. +- [Patrick Monnerat brought this change] -- this is MSVC specific and doesnt apply for all Win32 compilers; - the uint8_t typedef clashes with MingW32 headers. + os400qc3: New PKCS#5 decoder + + The Qc3 library is not able to handle PKCS#8 EncryptedPrivateKeyInfo structures + by itself. It is only capable of decrypting the (encrypted) PrivateKeyInfo + part, providing a key encryption key and an encryption algorithm are given. + Since the encryption key and algorithm description part in a PKCS#8 + EncryptedPrivateKeyInfo is a PKCS#5 structure, such a decoder is needed to + get the derived key method and hash, as well as encryption algorith and + initialisation vector. -- updated MingW32 makefiles for latest dependency lib versions. +- [Patrick Monnerat brought this change] -- updated NetWare makefiles for latest dependency lib versions. + os400qc3: force continuous update on non-final hash/hmac computation -Dan Fandrich (30 May 2010) -- Fixed compiling with libgcrypt - - A change of parameter types from unsigned long to size_t was - missed in the prototype in libgcrypt.h +- [Patrick Monnerat brought this change] -Daniel Stenberg (28 May 2010) -- statvfs: use libssh2_sftp_statvfs only, no "_ex" - - As the long-term goal is to get rid of the extensive set of - macros from the API we can just as well start small by not adding - new macros when we add new functions. Therefore we let the - function be libssh2_sftp_statvfs() plainly without using an _ex - suffix. + os400qc3: Be sure hmac keys have a minimum length - I also made it use size_t instead of unsigned int for the string - length as that too is a long-term goal for the API. + The Qc3 library requires a minimum key length depending on the target + hash algorithm. Append binary zeroes to the given key if not long enough. + This matches RFC 2104 specifications. -- [Grubsky Grigory brought this change] +- [Patrick Monnerat brought this change] - DSP: output lib name typo + os400qc3: Slave descriptor for key encryption key + + The Qc3 library requires the key encryption key to exist as long as + the encrypted key is used. Its descriptor token is then kept as an + "encrypted key slave" for recursive release. -- [Grubsky Grigory brought this change] +- [Patrick Monnerat brought this change] - win32: provide a uint8_t typedef for better building on windows + os400qc3.c: comment PEM/DER decoding -- agent: win32: fix bad _libssh2_store_str call - - As pointed out by Grubsky Grigory , I - made a mistake when I added the _libssh2_store_str() call before - and I made a slightly different patch than what he suggested. - Based purely on taste. +- [Patrick Monnerat brought this change] -Peter Stuge (24 May 2010) -- [Joey Degges brought this change] + os400qc3.c: improve ASN.1 header byte checks - Add libssh2_sftp_statvfs() and libssh2_sftp_fstatvfs() - - These can be used to get file system statistics from servers that - support the statvfs@openssh.com and fstatvfs@openssh.com extensions. +- [Patrick Monnerat brought this change] -Alexander Lamaison (22 May 2010) -- [Jose Baars brought this change] + os400qc3.c: improve OID matching - VMS specific: make sure final release can be installed over daily build +- [Patrick Monnerat brought this change] -- [Jose Baars brought this change] + os400: os400qc3.c: replace malloc by LIBSSH2_ALLOC or alloca where possible - VMS: small improvement to the man2help utilities +- [Patrick Monnerat brought this change] -Peter Stuge (22 May 2010) -- [Joey Degges brought this change] + os400: asn1_new_from_bytes(): use data from a single element only - libssh2_exit and libssh2_sftp_readdir man page fixes +- [Patrick Monnerat brought this change] -Daniel Stenberg (21 May 2010) -- spelling: s/sue/use + os400: fix an ILE/RPG prototype -Alexander Lamaison (21 May 2010) -- Change magic port number for generic knownhost check. - - libssh2_knownhost_checkp took 0 as a magic port number that indicated - a 'generic' check should be performed. However, 0 is a valid port - number in its own right so this commit changes the magic value to any - negative int. +- [Patrick Monnerat brought this change] -Mikhail Gusarov (5 May 2010) -- Add re-discovered copyright holders to COPYING + os400: implement character encoding conversion support -- Restoring copyright statements from pre-git era - - Eli Fant has contributed fragmenting SFTP requests +- [Patrick Monnerat brought this change] -- Restoring my copyright statements from pre-git era + os400: do not miss some external prototypes - keyboard_interactive, 'exit-status' information packet, non-atomic read/write - under FreeBSD, multi-channel operation bugfixes. + Build procedure extproto() did not strip braces from header files, thus + possibly prepended them to true prototypes. This prevented the prototype to + be recognized as such. + The solution implemented here is to map braces to semicolons, effectively + considering them as potential prototype delimiters. -Daniel Stenberg (3 May 2010) -- pedantic: make the code C90 clean +- [Patrick Monnerat brought this change] -Peter Stuge (3 May 2010) -- Do proper keyboard-interactive user dialog in the sftp.c example + os400: Really add specific README -Daniel Stenberg (3 May 2010) -- added to tarball: libssh2_knownhost_checkp.3 +- [Patrick Monnerat brought this change] -- knownhost: support [host]:port in knownhost file - - OpenSSH has ways to add hosts to the knownhosts file that include - a specific port number which makes the key associated with only - that specific host+port pair. libssh2 previously did not support - this, and I was forced to add a new function to the API to - properly expose this ability to applications: - libssh2_knownhost_checkp() - - To *add* such hosts to the knownhosts file, you make sure to pass - on the host name in that manner to the libssh2_knownhost_addc() - function. + os400: Add specific README and include new files in dist tarball -- init/exit: mention these were added in 1.2.5 +- [Patrick Monnerat brought this change] -- libssh2_knownhost_check docs: correct the prototype + os400: add compilation scripts -- examples: avoid use of uninitialized variable 'sock' +- [Patrick Monnerat brought this change] -- KEX: stop pretending we negotiate language + os400: include files for ILE/RPG - There was some stub-like parts of an implementation for - implementing kex language negotiation that caused clang-analyzer - to warn and as it did nothing I've now removed the dead code. + In addition, file os400/macros.h declares all procedures originally + defined as macros. It must not be used for real inclusion and is only + intended to be used as a `database' for macro wrapping procedures generation. -- Uninitialized argument +- [Patrick Monnerat brought this change] -- sftpdir: removed dead assignment + os400: add supplementary header files/wrappers. Define configuration. -- Makefile.am: include the VMS-specific config header as well +- [Patrick Monnerat brought this change] -- [Jose Baars brought this change] + Protect callback function calls from macro substitution + + Some structure fields holding callback addresses have the same name as the + underlying system function (connect, send, recv). Set parentheses around + their reference to suppress a possible macro substitution. + + Use a macro for connect() on OS/400 to resolve a const/nonconst parameter + problem. - Add VMS specific libssh2_config.h +- [Patrick Monnerat brought this change] -- fix Value stored to 's' is never read warning - - and moved variable declaration of s to be more local + Add interface for OS/400 crypto library QC3 -- kexinit: simplify the code and avoid scan-build warning - - Previously it would say "Value stored to 's' is never read" due - fourth increment of 's'. +- [Patrick Monnerat brought this change] -Alexander Lamaison (28 Apr 2010) -- Removed unecessary brackets. + misc: include stdarg.h for debug code -- Changed sftp_attrsize macro to a static function. +- [Patrick Monnerat brought this change] -Daniel Stenberg (28 Apr 2010) -- release: include the VMS-specific files + Document crypto library interface -- sftp_attrsize: protect the macro argument with proper parentheses +- [Patrick Monnerat brought this change] -- ssh2_agent: avoid using 'session' uninitialized on failures + Feature an optional crypto-specific macro to rsa sign a data fragment vector + + OS/400 crypto library is unable to sign a precomputed SHA1 hash: however + it does support a procedure that hashes data fragments and rsa signs. + If defined, the new macro _libssh2_rsa_sha1_signv() implements this function + and disables use of _libssh2_rsa_sha1_sign(). + + The function described above requires that the struct iovec unused slacks are + cleared: for this reason, macro libssh2_prepare_iovec() has been introduced. + It should be defined as empty for crypto backends that are not sensitive + to struct iovec unused slack values. -- examples: remove assignments of variable rc that's never used +- [Patrick Monnerat brought this change] -- publickey_init: remove useless variable increment + Fold long lines in include files -- hostkey_method_ssh_rsa_init: remove useless variable increment +- [Viktor Szakats brought this change] -- packet_x11_open: removed useless variable increment + kex.c: fix indentation - and made the declaration of a variable more local + Closes #71 -- packet_queue_listener: removed useless variable increment - - and made the declaration of a variable more local +- [Viktor Szakats brought this change] -- sftp_read: move a read_responses array to where its used + add OpenSSL-1.1.0-pre2 compatibility - I find that this increases readability since the array is used - only in the function call just immediately below and nowhere - else. + Closes #70 -- sftp_readdir: turn a small array static const and move it +- [Viktor Szakats brought this change] -- sftp_attrsize: converted function to a macro + add OpenSSL 1.1.0-pre1 compatibility - This way, the macro can evaluate a static number at compile time - for two out of four uses, and it probably runs faster for the - other two cases too. + * close https://github.com/libssh2/libssh2/issues/69 + * sync a declaration with the rest of similar ones + * handle EVP_MD_CTX_new() returning NULL with OpenSSL 1.1.0 + * fix potential memory leak with OpenSSL 1.1.0 in + _libssh2_*_init() functions, when EVP_MD_CTX_new() succeeds, + but EVP_DigestInit() fails. -- sftp_open: deal with short channel_write calls +Marc Hoersken (22 Dec 2015) +- wincng.c: fixed _libssh2_wincng_hash_final return value - This was an old TODO that just wasn't done before. If - channel_write returns short, that is not an error. + _libssh2_wincng_hash_final was returning the internal BCRYPT + status code instead of a valid libssh2 return value (0 or -1). + + This also means that _libssh2_wincng_hash never returned 0. -- sftp_open: clean up, better check of input data +- wincng.c: fixed possible memory leak in _libssh2_wincng_hash - The clang-analyzer report made it look into this function and - I've went through it to remove a potential use of an - uninitialized variable and I also added some validation of input - data received from the server. + If _libssh2_wincng_hash_update failed _libssh2_wincng_hash_final + would never have been called before. - In general, lots of more code in this file need to validate the - input before assuming it is correct: there are servers out there - that have bugs or just have another idea of how to do the SFTP - protocol. - -- bugfix: avoid using the socket if it failed to create one + Reported by Zenju. -- bugfix: potential use of NULL pointer +Kamil Dudka (15 Dec 2015) +- [Paul Howarth brought this change] -- libssh2_userauth_password_ex: clarify errors somewhat + libssh2.pc.in: fix the output of pkg-config --libs - The errors mentioned in this man page are possible return codes - but not necessarily the only return codes that this can return. + ... such that it does not include LDFLAGS used to build libssh2 itself. + There was a similar fix in the curl project long time ago: - Also reformatted the typ prototypes somewhat. - -- examples: fixed and made them more similar + https://github.com/bagder/curl/commit/curl-7_19_7-56-g4c8adc8 - The channel read/write functions can return 0 in legitimate cases - without it being an error, and we need to loop properly if they - return short. + Bug: https://bugzilla.redhat.com/1279966 + Signed-off-by: Kamil Dudka -- [Jose Baars brought this change] +Marc Hoersken (6 Dec 2015) +- hostkey.c: align code path of ssh_rsa_init to ssh_dss_init - VMS port of libssh2; changes in the libssh2 common code +- hostkey.c: fix invalid memory access if libssh2_dsa_new fails + + Reported by dimmaq, fixes #66 -- Makefile: added the two news headers userauth.h and session.h +Daniel Stenberg (3 Nov 2015) +- [Will Cosgrove brought this change] -- cleanup: prefer the internal functions + gcrypt: define libssh2_sha256_ctx - To get the blocking vs non-blocking to work as smooth as possible - and behave better internally, we avoid using the external - interfaces when calling functions internally. + Looks like it didn't make it into the latest commit for whatever reason. - Renamed a few internal functions to use _libssh2 prefix when not - being private within a file, and removed the libssh2_ for one - that was private within the file. + Closes #58 -- session_free: remove dead code +- [Salvador Fandino brought this change] -- libssh2_publickey_init: fixed to work better non-blocking + libssh2_session_set_last_error: Add function - This was triggered by a clang-analyzer complaint that turned out - to be valid, and it made me dig deeper and fix some generic non- - blocking problems I disovered in the code. + Net::SSH2, the Perl wrapping module for libssh2 implements several features* + on top of libssh2 that can fail and so need some mechanism to report the error + condition to the user. - While cleaning this up, I moved session-specific stuff over to a - new session.h header from the libssh2_priv.h header. - -- channel: reduce duplicated free and returns + Until now, besides the error state maintained internally by libssh2, another + error state was maintained at the Perl level for every session object and then + additional logic was used to merge both error states. That is a maintenance + nighmare, and actually there is no way to do it correctly and consistently. - Simplified the code by trying to free data and return on a single - spot. - -- channel: make variables more local + In order to allow the high level language to add new features to the library + but still rely in its error reporting features the new function + libssh2_session_set_last_error (that just exposses _libssh2_error_flags) is + introduced. + + *) For instance, connecting to a remote SSH service giving the hostname and + port. - By making 'data' and 'data_len' more local in several places in - this file it will be easier to spot how they are used and we'll - get less risks to accidentally do bad things with them. + Signed-off-by: Salvador Fandino + Signed-off-by: Salvador Fandiño -Mikhail Gusarov (24 Apr 2010) -- Fix typos in manpages, catched by Lintian +- [Salvador Fandino brought this change] -Daniel Stenberg (24 Apr 2010) -- channel_request_pty: simplify the code + _libssh2_error: Support allocating the error message - clang-analyzer pointed out how 'data' could be accessed as a NULL - pointer if the wrong state was set, and while I don't see that - happen in real-life the code flow is easier to read and follow by - moving the LIBSSH2_FREE() call into the block that is supposed to - deal with the data pointer anyway. - -- libssh2_channel_process_startup: simplify the code + Before this patch "_libssh2_error" required the error message to be a + static string. - clang-analyzer pointed out how 'data' could be accessed as a NULL - pointer if the wrong state was set, and while I don't see that - happen in real-life the code flow is easier to read and follow by - moving the LIBSSH2_FREE() call into the block that is supposed to - deal with the data pointer anyway. - -- sftp_close_handle: add precation to not access NULL pointer + This patch adds a new function "_libssh2_error_flags" accepting an + additional "flags" argument and specifically the flag + "LIBSSH2_ERR_FLAG_DUP" indicating that the passed string must be + duplicated into the heap. - clang-analyzer pointed this out as a "Pass-by-value argument in - function call is undefined" but while I can't see exactly how - this can ever happen in reality I think a little check for safety - isn't such a bad thing here. - -- scp_write_nonblock: Value stored to 'nread' is never read + Then, the method "_libssh2_error" has been rewritten to use that new + function under the hood. + + Signed-off-by: Salvador Fandino + Signed-off-by: Salvador Fandiño -- scp_write: Value stored to 'ptr' is never read +- [Will Cosgrove brought this change] -- scp_write_nonblock: Value stored to 'ptr' is never read + added engine.h include to fix warning -- sftp_mkdir: less silly output but show failures +- [sune brought this change] -- [Jose Baars brought this change] + kex.c: removed dupe entry from libssh2_kex_methods[] + + Closes #51 - VMS port of libssh2 including VMS specific build procedures +- [Salvador Fandiño brought this change] -- two variable types changes, made lines less than 80 columns + userauth: Fix off by one error when reading public key file - The two variable type changes are only to match type variable - fields actually read from the binary protocol. - -- remove check for negative padding_length + After reading the public key from file the size was incorrectly + decremented by one. - It was silly, since it is read as an unsigned char... - -- hostkey_method_ssh_dss_init: Value stored to 's' is never read - -- libssh2_banner_set: avoid unnecessary increment and explain code - -- agent_transact_unix: remove unused variable - -- remove two unnecessary increments + This was usually a harmless error as the last character on the public + key file is an unimportant EOL. But if due to some error the public key + file is empty, the public key size becomes (uint)(0 - 1), resulting in + an unrecoverable out of memory error later. + + Signed-off-by: Salvador Fandi??o -- more code converted to use _libssh2_store_*() +- [Salvador Fandino brought this change] -- libssh2_publickey_list_fetch: removed unused variables + channel: Detect bad usage of libssh2_channel_process_startup + + A common novice programmer error (at least among those using the + wrapping Perl module Net::SSH2), is to try to reuse channels. + + This patchs detects that incorrect usage and fails with a + LIBSSH2_ERROR_BAD_USE error instead of hanging. + + Signed-off-by: Salvador Fandino -- libssh2_publickey_init: remove unused variables +- [Will Cosgrove brought this change] -- libssh2_scp_send64: added to API to provide large file transfers + kex: Added diffie-hellman-group-exchange-sha256 support - The previously existing libssh2_scp_send_ex() function has no way - to send files that are larger than 'size_t' which on 32bit - systems mean 4GB. This new API uses a libssh2_int64_t type and - should thus on most modern systems be able to send enormous - files. + ... and fixed HMAC_Init depricated usage + + Closes #48 -- sftp_init: remove unused variables and assignments +Alexander Lamaison (21 Sep 2015) +- Prefixed new #defines to prevent collisions. + + Other libraries might have their own USE_WIN32_*FILES. -- libssh2_knownhost_check: Value stored to 'keylen' is never read +- [keith-daigle brought this change] -- hostkey: fix compiler warning + Update examples/scp.c to fix bug where large files on win32 would cause got to wrap and go negative -- remove unused variable +- [David Byron brought this change] -- data types: convert more to use size_t and uint32_t + add libssh2_scp_recv2 to support large (> 2GB) files on windows -- channel: variable type cleanups +Daniel Stenberg (17 Sep 2015) +- [sune brought this change] -- cleanups: better binary packet gen, size_t fixes and PACKET_* removal + WinCNG: support for SHA256/512 HMAC - I'll introduce a new internal function set named - - _libssh2_store_u32 - _libssh2_store_u64 - _libssh2_store_str - - That can be used all through the library to build binary outgoing - packets. Using these instead of the current approach removes - hundreds of lines from the library while at the same time greatly - enhances readability. I've not yet fully converted everything to - use these functions. - - I've converted LOTS of 'unsigned long' to 'size_t' where - data/string lengths are dealt with internally. This is The Right - Thing and it will help us make the transition to our - size_t-polished API later on as well. + Closes #47 + +- [brian m. carlson brought this change] + + Add support for HMAC-SHA-256 and HMAC-SHA-512. - I'm removing the PACKET_* error codes. They were originally - introduced as a set of separate error codes from the transport - layer, but having its own set of errors turned out to be very - awkward and they were then converted into a set of #defines that - simply maps them to the global libssh2 error codes instead. Now, - I'l take the next logical step and simply replace the PACKET_* - defines with the actual LIBSSH2_ERROR_* defines. It will increase - readability and decrease confusion. + Implement support for these algorithms and wire them up to the libgcrypt + and OpenSSL backends. Increase the maximum MAC buffer size to 64 bytes + to prevent buffer overflows. Prefer HMAC-SHA-256 over HMAC-SHA-512, and + that over HMAC-SHA-1, as OpenSSH does. - I also separated packet stuff into its own packet.h header file. + Closes #40 -- clarified the return code +- [Zenju brought this change] -- rename libssh2_error to the correct _libssh2_error + kex: free server host key before allocating it (again) - We reserve ^libssh2_ for public symbols and we use _libssh2 as - prefix for internal ones. I fixed the intendation of all these - edits with emacs afterwards, which then changed it slightly more - than just _libssh2_error() expressions but I didn't see any - obvious problems. - -- data type cleanup: made lots of code use size_t etc + Fixes a memory leak when Synology server requests key exchange - A lot of code used 'unsigned long' and the likes when it should - rather just use plain 'int' or use size_t for data lengths. + Closes #43 -- wait_socket: make c89 compliant and use two fd_sets for select() +- [Viktor Szakats brought this change] -- sftp_readdir: always zero terminate, detail the return code + GNUmakefile: up OpenSSL version - I also added a description for the 'longentry' field which was - previously undocumented! + closes #23 -- sftp_readdir: simplified and bugfixed - - This function no longer has any special purpose code for the - single entry case, as it was pointless. - - The previous code would overflow the buffers with an off-by-one - in case the file name or longentry data fields received from the - server were exactly as long as the buffer provided to - libssh2_sftp_readdir_ex. +- [Viktor Szakats brought this change] + + GNUmakefile: add -m64 CFLAGS when targeting mingw64, add -m32/-m64 to LDFLAGS - We now make sure that libssh2_sftp_readdir_ex() ALWAYS zero - terminate the buffers it fills in. + libssh2 equivalent of curl patch https://github.com/bagder/curl/commit/d21b66835f2af781a3c2a685abc92ef9f0cd86be - The function no longer calls the libssh2_* function again, but - properly uses the internal sftp_* instead. + This allows to build for the non-default target when using a multi-target mingw distro. + Also bump default OpenSSL dependency path to 1.0.2c. -- channel/transport: we now drain the outgoing send buffer when we ignore EAGAIN - - When we ignore the EAGAIN from the transport layer within channel_write, we - now drain the outgoing transport layer buffer so that remainders in that - won't cause any problems in the next invoke of _libssh2_transport_write() +- [Viktor Szakats brought this change] -- channel_write: if data has been sent, don't return EAGAIN + GNUmakefile: add support for LIBSSH2_LDFLAG_EXTRAS - When sending data in a loop, we must not return EAGAIN if we - managed to send data in an earlier round. This was reported in - bug #126 => http://libssh2.stuge.se/ticket/126 - -Simon Josefsson (14 Apr 2010) -- Fix OpenSSL AES-128-CTR detection. + It is similar to existing LIBSSH2_CFLAG_EXTRAS, but for + extra linker options. - Patch from Paul Howarth . - -Daniel Stenberg (13 Apr 2010) -- version in header file now says 1.2.6-DEV - -- 1.2.6: clean the RELEASE-NOTES for next release round - -- NEWS: add the stuff from the version 1.2.5 RELEASE-NOTES - -Version 1.2.5 (13 Apr 2010) - -Daniel Stenberg (13 Apr 2010) -- channel_close: no longer wait for the SSH_MSG_CHANNEL_CLOSE message + Also delete some line/file ending whitespace. - As the packet may simply not arrive we cannot have the close - function wait for it unconditionally. + closes #27 -- less code duplication in the poll vs select code flows - - libssh2_keepalive_send and libssh2_session_block_directions are - now used outside of the #ifdef blocks. +- [nasacj brought this change] -- make it C90 compliant + hostkey.c: Fix compiling error when OPENSSL_NO_MD5 is defined + + Closes #32 -- updated with all changes and bugs since 1.2.4 +- [Mizunashi Mana brought this change] -- Added LIBSSH2_SFTP_S_IS***() macros and updated docs + openssl.h: adjust the rsa/dsa includes - libssh2_sftp_fstat_ex.3 is now extended quite a lot to describe a - lot of the struct and the bits it uses and how to test for them. - -- sftp_init() deal with _libssh2_channel_write() returns short + ... to work when built without DSA support. - When _libssh2_channel_write() is asked to send off 9 bytes, the - code needs to deal with the situation where less than 9 bytes - were sent off and prepare to send the remaining piece at a later - time. + Closes #36 -- handle a NULL password as if it was "" +Alexander Lamaison (26 Jul 2015) +- Let CMake build work as a subproject. - libssh2_userauth_publickey_fromfile_ex() takes a "passphrase" - but didn't deal with it being set to NULL. + Patch contributed by JasonHaslam. -- Reduce used window sizes by factor 10 +- Fix builds with Visual Studio 2015. - As reported in bug report #166 http://libssh2.stuge.se/ticket/166 - by 'ptjm', the maximum window size must be less crazy for libssh2 - to do better with more server implementations. I did not do any - testing to see how this changes raw SCP performance, but the - maximum window size is still almost 4MB. This also has the upside - that libssh2 will use less memory. + VS2015 moved stdio functions to the header files as inline function. That means check_function_exists can't detect them because it doesn't use header files - just does a link check. Instead we need to use check_symbol_exists with the correct headers. -Peter Stuge (28 Mar 2010) -- Correctly clear blocking flag after sending multipart packet +Kamil Dudka (2 Jul 2015) +- cmake: include CMake files in the release tarballs - commit 7317edab61d2179febc38a2c2c4da0b951d74cbc cleared the outbound - blocking bit when send_existing() returned PACKET_NONE and *ret=0, as - opposed to before even calling send_existing(), but because *ret=1 when - sending parts 2..n of an existing packet, the bit would only be cleared - when calling libssh2_transport_write() for a new packet. + Despite we announced the CMake support in libssh2-1.6.0 release notes, + the files required by the CMake build system were not included in the + release tarballs. Hence, the only way to use CMake for build was the + upstream git repository. - Clear the direction flag after the final part of a packet has been sent. + This commit makes CMake actually supported in the release tarballs. -Daniel Stenberg (24 Mar 2010) -- Added man page for libssh2_knownhost_addc() +- tests/mansyntax.sh: fix 'make distcheck' with recent autotools - Added mention in libssh2_knownhost_add() docs that - libssh2_knownhost_addc() is the preferred function now. - -- at next soname bump remove libssh2_knownhost_add() + Do not create symbolic links off the build directory. Recent autotools + verify that out-of-source build works even if the source directory tree + is not writable. -- ignore TAGS ("make tags" makes them) +- openssl: fix memleak in _libssh2_dsa_sha1_verify() -- fix memory leak +Daniel Stenberg (12 Jun 2015) +- openssl: make libssh2_sha1 return error code - we must not assign the pointer a NULL since it keeps allocated - data and at least parts of an error string - -- fixed the pattern for avoiding the poll check + - use the internal prefix _libssh2_ for non-exported functions + + - removed libssh2_md5() since it wasn't used - added some comments about known problems with poll on darwin + Reported-by: Kamil Dudka -- avoid checking for poll on some systems +- [LarsNordin-LNdata brought this change] + + SFTP: Increase speed and datasize in SFTP read - darwin and interix are known to have broken poll implementations - so we skip the check on those and thus have them use select - unconditionally + The function sftp_read never return more then 2000 bytes (as it should + when I asked Daniel). I increased the MAX_SFTP_READ_SIZE to 30000 but + didn't get the same speed as a sftp read in SecureSSH. I analyzed the + code and found that a return always was dona when a chunk has been read. + I changed it to a sliding buffer and worked on all available chunks. I + got an increase in speed and non of the test I have done has failed + (both local net and over Internet). Please review and test. I think + 30000 is still not the optimal MAX_SFTP_READ_SIZE, my next goal is to + make an API to enable changing this value (The SecureSSH sftp_read has + more complete filled packages when comparing the network traffic) -- ignore libssh2.dsp +- bump: start working on 1.6.1 -Simon Josefsson (23 Mar 2010) -- Fix logic in "on-the-fly" crypto init. +Version 1.6.0 (5 Jun 2015) -- Make sure keepalive is working even when poll is used. +Daniel Stenberg (5 Jun 2015) +- RELEASE-NOTES: synced with 858930cae5c6a -- [Paul Querna brought this change] +Marc Hoersken (19 May 2015) +- wincng.c: fixed indentation - Use poll when available on blocking API. - - Signed-off-by: Simon Josefsson +- [sbredahl brought this change] -Peter Stuge (20 Mar 2010) -- Fix speling + wincng.c: fixed memleak in (block) cipher destructor -Daniel Stenberg (19 Mar 2010) -- fix NULL dereference when window adjusting a non-existing channel - - Suyog Jadhav pointed out that when receiving a window adjust to - a channel not found, the code would reference a NULL pointer. - Now it will instead output a message about that fact. +Alexander Lamaison (6 May 2015) +- [Jakob Egger brought this change] -Simon Josefsson (19 Mar 2010) -- Fix build problem. + libssh2_channel_open: more detailed error message + + The error message returned by libssh2_channel_open in case of a server side channel open failure is now more detailed and includes the four standard error conditions in RFC 4254. -- Eat our own dog food, call libssh2_init and libssh2_exit in the examples. +- [Hannes Domani brought this change] -- Fix init/exit logic. Add self-test of it. + kex: fix libgcrypt memory leaks of bignum + + Fixes #168. -Daniel Stenberg (19 Mar 2010) -- fix typo +Marc Hoersken (3 Apr 2015) +- configure.ac: check for SecureZeroMemory for clear memory feature -Simon Josefsson (19 Mar 2010) -- Add man page for libssh2_init and libssh2_exit. Fix libssh2_exit prototype. +- Revert "wincng.c: fix clear memory feature compilation with mingw" + + This reverts commit 2d2744efdd0497b72b3e1ff6e732aa4c0037fc43. + + Autobuilds show that this did not solve the issue. + And it seems like RtlFillMemory is defined to memset, + which would be optimized out by some compilers. -- Shorten constant a bit. More documentation. +- wincng.c: fix clear memory feature compilation with mingw -- Fix namespace pollution. +Alexander Lamaison (1 Apr 2015) +- [LarsNordin-LNdata brought this change] -- Add global init/exit points, to do crypto initialization in one place. + Enable use of OpenSSL that doesn't have DSA. - By Lars Nordin. + Added #if LIBSSH2_DSA for all DSA functions. -Daniel Stenberg (14 Mar 2010) -- libssh2 is released under the Modifed BSD license, not GPL +- [LarsNordin-LNdata brought this change] -Alexander Lamaison (14 Mar 2010) -- Add libssh2_knownhost_addc to handle comments. + Use correct no-blowfish #define with OpenSSL. - Comments in known_hosts file were not handle properly. They were parsed as - part of the key causing key matching to return a mismatch if the entry had a - comment. This adds a new API function that takes an optional comment and - changes libssh2_knownhost_readline to parse the comment as pass it to the - new function. - - Fixes #164. + The OpenSSL define is OPENSSL_NO_BF, not OPENSSL_NO_BLOWFISH. -- Fix gettimeofday to compile with Visual C++ 6. +Marc Hoersken (25 Mar 2015) +- configure: error if explicitly enabled clear-memory is not supported - Reported by Steven Van Ingelgem. - -Simon Josefsson (10 Mar 2010) -- Add. + This takes 22bd8d81d8fab956085e2079bf8c29872455ce59 and + b8289b625e291bbb785ed4add31f4759241067f3 into account, + but still makes it enabled by default if it is supported + and error out in case it is unsupported and was requested. -- keepalive.c: Fix libssh2_error usage. +Daniel Stenberg (25 Mar 2015) +- configure: make clear-memory default but only WARN if backend unsupported + + ... instead of previous ERROR. -- Fix typo in last commit. +Marc Hoersken (24 Mar 2015) +- wincng.h: fix warning about computed return value not being used -- Tidy up build option notice. +- nonblocking examples: fix warning about unused tvdiff on Mac OS X -- Add entry about keep alive stuff. +Daniel Stenberg (24 Mar 2015) +- openssl: fix compiler warnings -- Add keep-alive support. +- cofigure: fix --disable-clear-memory check -Alexander Lamaison (7 Mar 2010) -- Untabify. +Marc Hoersken (23 Mar 2015) +- scp.c: improved command length calculation + + Reduced number of calls to strlen, because shell_quotearg already + returns the length of the resulting string (e.q. quoted path) + which we can add to the existing and known cmd_len. + Removed obsolete call to memset again, because we can put a final + NULL-byte at the end of the string using the calculated length. -- Fix memory leak in libssh2_knownhost_add. +- scp.c: improved and streamlined formatting -Daniel Stenberg (6 Mar 2010) -- change 'int' to 'libssh2_socket_t' in the public API for sockets +- scp.c: fix that scp_recv may transmit not initialised memory -- reduce code duplication and return underlying error better +- scp.c: fix that scp_send may transmit not initialised memory + + Fixes ticket 244. Thanks Torsten. -- acknowledge when _libssh2_packet_requirev() returns error +- kex: do not ignore failure of libssh2_sha1_init() - when _libssh2_packet_requirev() returns an error when waiting for - SSH_MSG_USERAUTH_SUCCESS or SSH_MSG_USERAUTH_FAILURE, it is an - error and it should be treated as such + Based upon 43b730ce56f010e9d33573fcb020df49798c1ed8. + Fixes ticket 290. Thanks for the suggestion, mstrsn. -- wrap long lines +- wincng.h: fix return code of libssh2_md5_init() -- polished the phrasing in two error strings +- openssl.c: fix possible segfault in case EVP_DigestInit fails -- silence picky compiler warnings +- wincng.c: fix possible use of uninitialized variables -- silence picky compiler warnings +- wincng.c: fix unused argument warning if clear memory is not enabled -- removed libssh2_error()'s forth argument +- wincng: Added explicit clear memory feature to WinCNG backend + + This re-introduces the original feature proposed during + the development of the WinCNG crypto backend. It still needs + to be added to libssh2 itself and probably other backends. - libssh2_error() no longer allocates a string and only accepts a const - error string. I also made a lot of functions use the construct of - return libssh2_error(...) instead of having one call to - libssh2_error() and then a separate return call. In several of those - cases I then also changed the former -1 return code to a more - detailed one - something that I think will not change behaviors - anywhere but it's worth keeping an eye open for any such. + Memory is cleared using the function SecureZeroMemory which is + available on Windows systems, just like the WinCNG backend. -- repaired --enable-debug +- wincng.c: fixed mixed line-endings -Simon Josefsson (1 Mar 2010) -- Make ./configure output a summary of build options. +- wincng.c: fixed use of invalid parameter types in a8d14c5dcf -Daniel Stenberg (1 Mar 2010) -- let the err_msg in the session struct be const too +- wincng.c: only try to load keys corresponding to the algorithm -Simon Josefsson (1 Mar 2010) -- Revert #ifdef change that pulled in AES-CTR code when explicitly disabled. +- wincng.c: moved PEM headers into definitions -Daniel Stenberg (1 Mar 2010) -- fix #ifdefs +- wincng.h: fixed invalid parameter name -- make function match the new proto +- wincng: fixed mismatch with declarations in crypto.h -Simon Josefsson (1 Mar 2010) -- Improve AES-CTR check. +- userauth.c: fixed warning C6001: using uninitialized sig and sig_len -Daniel Stenberg (1 Mar 2010) -- use const to silence a bazillion warnings +- pem.c: fixed warning C6269: possible incorrect order of operations -Simon Josefsson (1 Mar 2010) -- Use AES-CTR from OpenSSL when available. +- wincng: add support for authentication keys to be passed in memory - Reported by Lars Nordin . + Based upon 18cfec8336e and daa2dfa2db. -- Make it possible to disable DSA. +- pem.c: add _libssh2_pem_parse_memory to parse PEM from memory - Patch from Lars Nordin . + Requirement to implement 18cfec8336e for Libgcrypt and WinCNG. -Peter Stuge (1 Mar 2010) -- Send and receive channel EOF before sending SSH_MSG_CHANNEL_CLOSE - - Sending SSH_MSG_CHANNEL_CLOSE without channel EOF is explicitly allowed - in RFC 4254, but some non-conforming servers will hang or time out when - the channel is closed before EOF. - - Other common clients send and receive EOF before closing, there are no - drawbacks, and some servers need it to work correctly. +- pem.c: fix copy and paste mistake from 55d030089b8 + +- userauth.c: fix another possible dereference of a null pointer + +- userauth.c: fix possible dereference of a null pointer -Alexander Lamaison (26 Feb 2010) -- Style improvements to knownhost error handling. +- pem.c: reduce number of calls to strlen in readline + +Alexander Lamaison (17 Mar 2015) +- [Will Cosgrove brought this change] + + Initialise HMAC_CTX in more places. - Made improvements as suggested by Peter Stuge: http://www.libssh2.org/mail/libssh2-devel-archive-2010-02/0161.shtml. + Missed a couple more places we init ctx to avoid openssl threading crash. -- Call libssh2_error for every knownhost API failure. +- Build build breakage in WinCNG backend caused when adding libssh2_userauth_publickey_frommemory. - The libssh2 API calls should set the last error code and a message when - returning a failure by calling libssh2_error. This changeset adds these - calls to the libssh2_knownhost_* API as well as libssh2_base64_decode. + The new feature isn't implemented for the WinCNG backend currently, but the WinCNG backend didn't contain any implementation of the required backend functions - even ones that returns an error. That caused link errors. - This change also makes libssh2_error into a function rather than a macro. - Its implementation is moved to misc.c. This function returns the error - code passed to it allowing callers to return the error value directly - without duplicating the error code. + This change fixes the problem by providing an implementation of the backend functions that returns an error. -- Fix LIBSSH2_ALLOC checks. +- Fix breakage in WinCNG backend caused by introducing libssh2_hmac_ctx_init. - These appear to be cut-and paste errors where the wrong variable is checked - for NULLness after calling LIBSSH2_ALLOC. - -Simon Josefsson (23 Feb 2010) -- Silence compiler warning. - -- Make it portable; test uses = for string comparison (not ==). Indent. + The macro was defined to nothing for the libgcrypt backend, but not for WinCNG. This brings the latter into line with the former. -Alexander Lamaison (22 Feb 2010) -- libssh2_knownhost_del: fix write to freed memory. +Daniel Stenberg (15 Mar 2015) +- userauth_publickey_frommemory.3: add AVAILABILITY - When removing a known host, libssh2_knownhost_del would remove the node from the linked list, free its memory and then overwrite the struct parameter (which indicated which node to remove) with 0. However, this struct is actually allocated within the just-freed node meaning we're writing to freed memory. This made Windows very upset. + ... it will be added in 1.6.0 + +- libssh2: next version will be called 1.6.0 - The fix is simply to overwrite the struct first before freeing the memory. + ... since we just added a new function. -Daniel Stenberg (21 Feb 2010) -- show more verbose error when SCP send fails +- docs: add libssh2_userauth_publickey_frommemory.3 to dist + + The function and man page were added in commit 18cfec8336e -- libssh2_socket_t is done, a library-free function is needed +- [Jakob Egger brought this change] -- clarify that this frees all data associated with a session + direct_tcpip: Fixed channel write + + There were 3 bugs in this loop: + 1) Started from beginning after partial writes + 2) Aborted when 0 bytes were sent + 3) Ignored LIBSSH2_ERROR_EAGAIN + + See also: + https://trac.libssh2.org/ticket/281 + https://trac.libssh2.org/ticket/293 -- improved error handling +Alexander Lamaison (15 Mar 2015) +- [Will Cosgrove brought this change] -- add missing libssh2_error() calls + Must init HMAC_CTX before using it. - To make sure the public API is functional and that the - BLOCK_ADJUST_ERRNO() macro works correctly we MUST make sure to - call libssh2_error() when we return errors. + Must init ctx before using it or openssl will reuse the hmac which is not thread safe and causes a crash. + Added libssh2_hmac_ctx_init macro. -- fix memory leak in userauth_keyboard_interactive() +- Add continuous integration configurations. - Mr anonymous in bug #125 pointed out that the userauth_keyboard_interactive() - function does in fact assign the same pointer a second time to a new allocated - buffer without properly freeing the previous one, which caused a memory leak. + Linux-based CI is done by Travis CI. Windows-based CI is done by Appveyor. -- added missing error codes +- [David Calavera brought this change] + + Allow authentication keys to be passed in memory. - To allow the libssh2_session_last_error() function to work as - documented, userauth_password() now better makes sure to call - libssh2_error() everywhere before it returns error. + All credits go to Joe Turpin, I'm just reaplying and cleaning his patch: + http://www.libssh2.org/mail/libssh2-devel-archive-2012-01/0015.shtml - Pointed out by mr anonymous in bug #128 + * Use an unimplemented error for extracting keys from memory with libgcrypt. -Peter Stuge (16 Feb 2010) -- Fix resource and memory leaks in examples as reported by cppcheck - - Thanks to Ettl Martin for the report and patch. This fixes #132 +Daniel Stenberg (14 Mar 2015) +- docs: include the renamed INSTALL* files in dist -Daniel Stenberg (15 Feb 2010) -- mention the new man pages for macros +Alexander Lamaison (13 Mar 2015) +- Prevent collisions between CMake and Autotools in examples/ and tests/. -- added man pages for API macros +- Avoid clash between CMake build and Autotools. - all #defined macros in the public headers are considered to be part - of the API and I've generated individual man pages for each of them - to A) make it easier to figure out what each function/macro actually - is for so that automated lookups work better and for B) make sure we - have all public functions document (both macros and functions) to - make it easier for us to work away from all the macros in a future - release. + Autotools expects a configuration template file at src/libssh2_config.h.in, which buildconf generates. But the CMake build system has its CMake-specific version of the file at this path. This means that, if you don't run buildconf, the Autotools build will fail because it configured the wrong header template. + + See https://github.com/libssh2/libssh2/pull/8. -- Committed the patch by Yoichi Iwaki in bug #2929647 +- Merge pull request #8 from alamaison/cmake - Committed the patch by Yoichi Iwaki in bug #2929647, which fixed a memory - leak when an 'outbuf' was still allocated when a session was freed. + CMake build system. -- free "outbuf" when killing a session +- CMake build system. - Fix memoary leak: if there was an "output" still allocated when a - session was torn down it needs to be freed in session_free() + Tested: + - Windows: + - Visual C++ 2005/2008/2010/2012/2013/MinGW-w64 + - static/shared + - 32/64-bit + - OpenSSL/WinCNG + - Without zlib + - Linux: + - GCC 4.6.3/Clang 3.4 + - static/shared + - 32/64-bit + - OpenSSL/Libgcrypt + - With/Without zlib + - MacOS X + - AppleClang 6.0.0 + - static + - 64-bit + - OpenSSL + - Without zlib - Patch by Yoichi Iwaki in bug #2929647 - -- the working version name is now 1.2.5_DEV + Conflicts: + README -Version 1.2.4 (13 Feb 2010) +- Man man syntax tests fail gracefully if man version is not suitable. -Daniel Stenberg (13 Feb 2010) -- updated info for 1.2.4 +- Return valid code from test fixture on failure. + + The sshd test fixture was returning -1 if an error occurred, but negative error codes aren't technically valid (google it). Bash on Windows converted them to 0 which made setup failure look as though all tests were passing. -Dan Fandrich (10 Feb 2010) -- Allow compiling with OpenSSL when AES isn't available. +- Let mansyntax.sh work regardless of where it is called from. -Peter Stuge (9 Feb 2010) -- [Dave McCaldon brought this change] +Daniel Stenberg (12 Mar 2015) +- [Viktor Szakáts brought this change] - Fix Tru64 socklen_t compile issue with example/direct_tcpip.c + mingw build: allow to pass custom CFLAGS - Building libssh2-1.2.3 on Tru64 fails at line 48 and 166 because socklen_t - isn't defined on Tru64 unless _POSIX_PII_SOCKET is defined. + Allow to pass custom `CFLAGS` options via environment variable + `LIBSSH2_CFLAG_EXTRAS`. Default and automatically added options of + `GNUmakefile` have preference over custom ones. This addition is useful + for passing f.e. custom CPU tuning or LTO optimization (`-flto + -ffat-lto-objects`) options. The only current way to do this is to edit + `GNUmakefile`. This patch makes it unnecessary. - This patch updates configure.ac to add -D_POSIX_PII_SOCKET when building - on Tru64 platform(s). + This is a mirror of similar libcurl patch: + https://github.com/bagder/curl/pull/136 -- [Dave McCaldon brought this change] +- [Will Cosgrove brought this change] - Resolve compile issues on Solaris x64 and UltraSPARC - - Solaris builds of libssh2-1.2.3 failed on both x64 and UltraSPARC - platforms because of two problems: + userauth: Fixed prompt text no longer being copied to the prompts struct - 1) src/agent.c:145 sun is a reserved word when using the SUNWspro compiler - 2) example/direct_tcpip.c:84 INADDR_NONE is not defined + Regression from 031566f9c -Daniel Stenberg (3 Feb 2010) -- towards 1.2.4 now +- README: update the git repo locations -Version 1.2.3 (3 Feb 2010) +- wait_socket: wrong use of difftime() + + With reversed arguments it would always return a negative value... + + Bug: https://github.com/bagder/libssh2/issues/1 -Daniel Stenberg (3 Feb 2010) -- Version 1.2.3 (February 3, 2010) +- bump: start working toward 1.5.1 now -- fix building out of source tree by proving better include path - - when building out of source tree, we provide -I$(top_builddir)/example - since the libssh2_config.h gets generated in that dir +Version 1.5.0 (11 Mar 2015) -Peter Stuge (1 Feb 2010) -- [Sofian Brabez brought this change] +Daniel Stenberg (11 Mar 2015) +- RELEASE-NOTES: 1.5.0 release - Replace : in hexdump with " " (two spaces) +- [Mariusz Ziulek brought this change] -- Detect when the forwarded connection is closed in example/direct_tcpip.c + kex: bail out on rubbish in the incoming packet + + CVE-2015-1782 + + Bug: http://www.libssh2.org/adv_20150311.html -- Fix example/direct_tcpip.c to work also on WIN32 +- docs: move INSTALL, AUTHORS, HACKING and TODO to docs/ - read() and write() are no good for WIN32 sockets, use recv() and send(). + And with this, cleanup README to be shorter and mention the new source + code home. -- Ignore libssh2_config.h.in and stamp-h2 in example/ and remove .cvsignore +- .gitignore: don't ignore INSTALL -- Simplify WIN32 ifdefs in example/direct_tcpip.c to allow standalone compile +Dan Fandrich (4 Mar 2015) +- examples/x11.c: include sys/select.h for improved portability -- Always #define INVALID_SOCKET -1 in libssh2_priv.h when not on win32 +Daniel Stenberg (4 Mar 2015) +- RELEASE-NOTES: synced with a8473c819bc068 - Fix broken builds since commit abd9bd0bbe631efeada1f54552c70b54e1c490c1 - for all non-win32 platforms. + In preparation for the upcoming 1.5.0 release. -- Include hmac-md5 and hmac-md5-96 only if crypto backend supports MD5 +Guenter Knauf (8 Jan 2015) +- NetWare build: added some missing exports. -- Use LIBSSH2_HOSTKEY_HASH_SHA1 instead of _MD5 in examples and tests +Marc Hoersken (29 Dec 2014) +- knownhost.c: fix use of uninitialized argument variable wrote - MD5 support is optional and may not always be available, while SHA1 is both - required and recommended. + Detected by clang scan in line 1195, column 18. -- Update mailing list address in configure.ac to @cool.haxx.se +- examples/x11.c: fix result of operation is garbage or undefined + + Fix use of uninitialized structure w_size_bck. + Detected by clang scan in line 386, column 28. -- Make example/direct_tcpip.c compile for win32 +- examples/x11.c: remove dead assigments of some return values - One warning from FD_SET() remains, it is also in some other examples. + Detected by clang scan in line 212, column 9. + Detected by clang scan in line 222, column 13. + Detected by clang scan in line 410, column 13. -- Correctly check for an invalid socket in session_startup() +- examples/x11.c: fix possible memory leak if read fails + + Detected by clang scan in line 224, column 21. -- Small documentation fix after Dave's _USERAUTH_FAILURE improvement +- examples/x11.c: fix invalid removal of first list element + + Fix use of memory after it was being freed. + Detected by clang scan in line 56, column 12. -- [Dave McCaldon brought this change] +- userauth.c: make sure that sp_len is positive and avoid overflows + + ... if the pointer subtraction of sp1 - pubkey - 1 resulted in a + negative or larger value than pubkey_len, memchr would fail. + + Reported by Coverity CID 89846. - Handle SSH_MSG_USERAUTH_FAILURE for password and kbd-int authentication +- channel.c: remove logically dead code, host cannot be NULL here - Neither libssh2_userauth_password_ex() nor - libssh2_userauth_keyboard_interactive_ex() would return a login failure - error if the server responded with a SSH_MSG_USERAUTH_FAILURE, instead - you would see whatever previous error had occurred, typically - LIBSSH2_ERROR_EAGAIN. + ... host cannot be NULL in line 525, because it is always + valid (e.g. at least set to "0.0.0.0") after lines 430 and 431. - This patch changes error code -18 to LIBSSH2_ERROR_AUTHENTICATION_FAILED - and makes LIBSSH2_ERROR_PUBLICKEY_UNRECOGNIZED an alias for - LIBSSH2_ERROR_AUTHENTICATION_FAILED. In addition, new logic in - userauth_password() properly handles SSH_MSG_USERAUTH_FAILURE and both - this function and userauth_keyboard_interactive() now properly return - LIBSSH2_ERROR_AUTHENTICATION_FAILED. + Reported by Coverity CID 89807. -Simon Josefsson (28 Jan 2010) -- Fix. +- session.c: check return value of session_nonblock during startup + + Reported by Coverity CID 89803. -- Also deal with GLOBAL_REQUEST keep-alives. +- session.c: check return value of session_nonblock in debug mode + + Reported by Coverity CID 89805. -- Make OpenSSH-style keepalive work against libssh2 clients. +- pem.c: fix mixed line-endings introduced with 8670f5da24 -Daniel Stenberg (27 Jan 2010) -- clarified +- pem.c: make sure there's a trailing zero and b64data is not NULL + + ... if there is no base64 data between PEM header and footer. + Reported by Coverity CID 89823. -Peter Stuge (26 Jan 2010) -- [Dave McCaldon brought this change] +- kex.c: make sure mlist is not set to NULL + + ... if the currently unsupported LANG methods are called. + Reported by Coverity CID 89834. - Fix trace context lookup in libssh2_debug() +- packet.c: i < 256 was always true and i would overflow to 0 - The trace context is actually a bitmask so that tracing output can be - controlled by setting a bitmask using libssh2_trace(). However, the logic - in libssh2_debug() that converted the context to a string was using the - context value as an array index. Because the code used a bounds check on - the array, there was never a danger of a crash, but you would certainly - either get the wrong string, or "unknown". - - This patch adds a lookup that iterates over the context strings and uses - it's index to check for the corresponding bit in the context. + Visualize that the 0-termination is intentional, because the array + is later passed to strlen within _libssh2_packet_askv. -- Fix typo in RELEASE-NOTES +- silence multiple data conversion warnings -Daniel Stenberg (20 Jan 2010) -- updated for 1.2.3 with all the stuff I found in the log +Daniel Stenberg (23 Dec 2014) +- agent_connect_unix: make sure there's a trailing zero + + ... if the path name was too long. Reported by Coverity CID 89801. -- ignore more generated files +Marc Hoersken (22 Dec 2014) +- examples on Windows: use native SOCKET-type instead of int + + And check return values accordingly. -- [Dave McCaldon brought this change] +- userauth.c: improve readability and clarity of for-loops - Pass user context through libssh2_trace_sethandler() to callback +Daniel Stenberg (22 Dec 2014) +- calloc: introduce LIBSSH2_CALLOC() - The libssh2_trace_sethandler() call allows the user to handle the output of libssh2 rather than having it written to stderr. This patch updates libssh2_trace_sethandler() to allow a user-defined void* context value to be passed back to the output handler. - -- [Dave McCaldon brought this change] + A simple function using LIBSSH2_ALLOC + memset, since this pattern was + used in multiple places and this simplies code in general. - Add libssh2_trace_sethandler() to the API (even more) +Marc Hoersken (15 Dec 2014) +- libssh2_priv.h: Ignore session, context and format parameters -- [Dave McCaldon brought this change] +- x11 example: check return value of socket function - Add libssh2_trace_sethandler() to the API +- examples: fixed mixed line-endings introduced with aedfba25b8 -- cleanup includes +- wincng.c: explicitly ignore BCrypt*AlgorithmProvider return codes - We now produce a local libssh2_config.h file in this dir for the - examples to use so I cleaned up the include path at the same time. + Fixes VS2012 code analysis warning C6031: + return value ignored: could return unexpected value -- generate a libssh2_config.h in the example dir +- wincng.c: fix possible invalid memory write access - buildconf copies the template to example/ and configure makes sure - to generate a proper file from it and the direct_tcpip.c example - is the first one to use it - to make sure it builds fine on more - paltforms + Fixes VS2012 code analysis warning C6386: + buffer overrun: accessing 'pbOutput', the writable size is + 'cbOutput' bytes, but '3' bytes may be written: libssh2 wincng.c 610 -Simon Josefsson (13 Jan 2010) -- Remove redundant #includes and reorder sys/types.h include. - -Daniel Stenberg (10 Jan 2010) -- avoid a free(NULL) +- tests on Windows: check for WSAStartup return code + + Fixes VS2012 code analysis warning C6031: + return value ignored: could return unexpected value -Simon Josefsson (7 Jan 2010) -- Make it simpler to get more debug info. +- wincng.c: fix possible NULL pointer de-reference of bignum + + Fixes VS2012 code analysis warning C6011: + dereferencing NULL pointer 'bignum'. libssh2 wincng.c 1567 -Daiki Ueno (1 Jan 2010) -- Simplify the commit 63457dfa using type cast from size_t * to ulong *. +- wincng.c: fix possible use of uninitialized memory + + Fixes VS2012 code analysis warning C6001: + using uninitialized memory 'cbDecoded'. libssh2 wincng.c 553 -Alexander Lamaison (30 Dec 2009) -- Fixed memory leak in userauth_publickey(). +- packet.c: fix possible NULL pointer de-reference within listen_state - userauth_publickey_fromfile() reads the key from a - file using file_read_publickey() which returns two - allocated strings, the decoded key and the key - method (such as "ssh-dss"). The latter can be - derived from the former but returning both avoids a - later allocation while doing so. + Fixes VS2012 code analysis warning C6011: + dereferencing NULL pointer 'listen_state->channel'. libssh2 packet.c 221 + +- kex.c: fix possible NULL pointer de-reference with session->kex - Older versions of userauth_publickey_fromfile() used - this method string directly but when - userauth_publickey() was factored out of - userauth_publickey_fromfile() it derived the method - from the key itself. This resulted in the method - being allocated twice. + Fixes VS2012 code analysis warning C6011: + dereferencing NULL pointer 'session->kex'. libssh2 kex.c 1761 + +- agent.c: check return code of MapViewOfFile - This fix, which maintains the optimisation that - avoids an extra allocation, changes - userauth_publickey() so it doesn't allocate and - derive the method when userauth_pblc_method already - has a value. + Fixes VS2012 code analysis warning C6387: 'p+4' may be '0': + this does not adhere to the specification for the function + 'memcpy': libssh2 agent.c 330 - Signed-off-by: Alexander Lamaison + Fixes VS2012 code analysis warning C6387: 'p' may be '0': + this does not adhere to the specification for the function + 'UnmapViewOfFile': libssh2 agent.c 333 -Daiki Ueno (25 Dec 2009) -- Fix the return value description of libssh2_knownhost_free(). - -- Fix compiler warnings for size_t pointers on 32-bit Windows. +- examples on Windows: check for socket return code + + Fixes VS2012 code analysis warning C28193: + The variable holds a value that must be examined -- Define INVALID_SOCKET and use it instead of SOCKET_BAD. +- examples on Windows: check for WSAStartup return code - Revert the part of previous commit that defines SOCKET_BAD library wide. + Fixes VS2012 code analysis warning C6031: + return value ignored: could return unexpected value -- Use libssh2_socket_t in the ssh-agent stuff. - Define a portability macro SOCKET_BAD which means "invalid socket". +Guenter Knauf (11 Dec 2014) +- wincng.c: silent some more gcc compiler warnings. -- Mark/unmark connection to Pageant is open/close. +- wincng.c: silent gcc compiler warnings. -- Add test to check if the socket is connected. +- Watcom build: added support for WinCNG build. -Peter Stuge (24 Dec 2009) -- Add libssh2.pc to top-level .gitignore +- build: updated dependencies in makefiles. -- Fix publickey authentication regression +Daniel Stenberg (4 Dec 2014) +- configure: change LIBS not LDFLAGS when checking for libs - Commit 70b199f47659a74b8778c528beccf893843e5ecb introduced a parsing - bug in file_read_publickey() which made the algorithm name contain an - extra trailing space character, breaking all publickey authentication. + Closes #289 + + Patch-by: maurerpe -- Add a direct-tcpip example which shows local port forwarding +Guenter Knauf (3 Dec 2014) +- MinGW build: some more GNUMakefile tweaks. + + test/GNUmakefile: added architecture autodetection; added switches to + CFLAGS and RCFLAGS to make sure that the right architecture is used. + Added support to build with WinCNG. -- Add session parameter and LIBSSH2_TRACE_SOCKET to libssh2_trace(3) man page +- sftpdir.c: added authentication method detection. + + Stuff copied over from ssh2.c to make testing a bit easier. -- Add TODO: Expose error messages sent by the server +- NMake build: fixed LIBS settings. -Daiki Ueno (23 Dec 2009) -- Fix doc comments. +- NMake build: added support for WinCNG build. -- Add man pages for ssh-agent API. +- MinGW build: some GNUMakefile tweaks. + + Added architecture autodetection; added switches to CFLAGS and + RCFLAGS to make sure that the right architecture is used. + Added support to build with WinCNG. -- Don't request userauthlist after authentication. +- MinGW build: Fixed redefine warnings. -Simon Josefsson (21 Dec 2009) -- Add. +- Updated copyright year. -- [Daiki Ueno brought this change] +Daniel Stenberg (31 Aug 2014) +- COPYING: bump the copyright year - Add an example to use ssh-agent API. - - Signed-off-by: Simon Josefsson +Dan Fandrich (28 Jul 2014) +- docs: fixed a bunch of typos -- [Daiki Ueno brought this change] +- docs: added missing libssh2_session_handshake.3 file - Add ssh-agent API. +Marc Hoersken (19 May 2014) +- wincng.c: specify the required libraries for dependencies using MSVC - Signed-off-by: Simon Josefsson + Initially reported by Bob Kast as "for MS VS builds, specify the + libraries that are required so they don't need to go into all + project files that may use this library". Thanks a lot. -- [Daiki Ueno brought this change] +- [Bob Kast brought this change] - Add callback-based API for publickey auth. + windows build: do not export externals from static library - Signed-off-by: Simon Josefsson + If you are building a DLL, then you need to explicitly export each + entry point. When building a static library, you should not. + + libssh2 was exporting the entry points whether it was building a DLL or a + static library. To elaborate further, if libssh2 was used as a static + library, which was being linked into a DLL, the libssh2 API would be + exported from that separate DLL. + +Daniel Stenberg (19 May 2014) +- [Mikhail Gusarov brought this change] -- Move examples from example/simple to example/. + Fix typos in manpages -- Move examples from example/simple to example/. +Marc Hoersken (18 May 2014) +- wincng.c: Fixed memory leak in case of an error during ASN.1 decoding -Daniel Stenberg (17 Dec 2009) -- _libssh2_list_insert() fixed to work +- configure: Display individual crypto backends on separate lines - While this is code not currently in use, it is part of the generic linked - list code and since I found the error I thought I'd better fix it since we - might bring in this function into the code one day. - -Simon Josefsson (16 Dec 2009) -- Silence compiler warnings. + This avoids line-wrapping in between parameters and makes the + error message look like the following: - Based on patch by Kamil Dudka in - . + configure: error: No crypto library found! + Try --with-libssl-prefix=PATH + or --with-libgcrypt-prefix=PATH + or --with-wincng on Windows -- [Kamil Dudka brought this change] +- [Bob Kast brought this change] - libgcrypt: simplify code of _libssh2_dsa_sha1_sign + libssh2_priv.h: a 1 bit bit-field should be unsigned - Signed-off-by: Simon Josefsson + some compilers may not like this -- [Kamil Dudka brought this change] +- knownhost.c: Fixed warning that pointer targets differ in signedness + +- wincng.c: Fixed warning about pointer targets differing in signedness - libgcrypt: follow-up for ssh-dss padding fix +- tcpip-forward.c: Fixed warning that pointer targets differ in signedness - Signed-off-by: Simon Josefsson + libssh2_channel_forward_listen_ex uses ints instead of unsigned ints. -Dan Fandrich (15 Dec 2009) -- Check for the right environment variable in the test app +- misc.c: Fixed warning about mixed declarations and code -Simon Josefsson (14 Dec 2009) -- Silence warning about unused function parameter. - - Reported by Steven Van Ingelgem . +- libgcrypt.h: Fixed warning about pointer targets differing in signedness -Daniel Stenberg (10 Dec 2009) -- avoid returning data to memory already freed - - In case of failure we must make sure that the data we return - doesn't point to a memory area already freed. Reported anonymously - in the bug report #2910103. +- wincng.h: Fixed warning about pointer targets differing in signedness -Peter Stuge (8 Dec 2009) -- Use LIBSSH2_TRACE_* internally and remove redundant LIBSSH2_DBG_* +- misc.c: Fixed warning about unused parameter abstract -- Add LIBSSH2_TRACE_SOCKET context for tracing send() and recv() - - Helpful in debugging the -39 errors. +- tcpip-forward.c: Removed unused variables shost, sport and sockopt -- Another transport layer fix for bogus -39 (LIBSSH2_ERROR_BAD_USE) errors +- wincng.h: Added forward declarations for all WinCNG functions - Commit 683aa0f6b52fb1014873c961709102b5006372fc made send_existing() send - more than just the second part of a packet when the kernel did not accept - the full packet, but the function still overlooked the SSH protocol - overhead in each packet, often 48 bytes. + Initially reported by Bob Kast as "Wincng - define function + prototypes for wincng routines". Thanks a lot. - If only the last few bytes of a packet remained, then the packet would - erroneously be considered completely sent, and the next call to write - more data in the session would return a -39 error. + Also replaced structure definitions with type definitions. -Daniel Stenberg (6 Dec 2009) -- move local variable to be more localized +- [Bob Kast brought this change] -- fixed some indent mistakes + libssh2.h: on Windows, a socket is of type SOCKET, not int -Peter Stuge (6 Dec 2009) -- Fix padding in ssh-dss signature blob encoding +- win32: Added WinCNG targets to generated Visual Studio project - DSA signatures consist of two 160-bit integers called r and s. In ssh-dss - signature blobs r and s are stored directly after each other in binary - representation, making up a 320-bit (40 byte) string. (See RFC4253 p14.) + Inspired by Bob Kast's reports, this commit enables the compilation + of libssh2 with WinCNG using the generated Visual Studio project files. + This commit adds WinCNG support to parts of the existing Win32 build + infrastructure, until new build systems, like pre-defined VS project + files or CMake files may be added. - The crypto wrappers in libssh2 would either pack r and s incorrectly, or - fail, when at least one integer was small enough to be stored in 19 bytes - or less. - - The patch ensures that r and s are always stored as two 160 bit numbers. + This commit and b20bfeb3e519119a48509a1099c06d65aa7da1d7 raise one + question: How to handle build systems, like VS project files, that + need to include all source files regardless of the desired target, + including all supported crypto backends? For now the mentioned commit + added a check for LIBSSH2_OPENSSL to openssl.c and with this commit + the supported crypto backends are hardcoded within Makefile.am. -- Don't always clear write direction blocking flag - - When libssh2_transport_write() is called to continue sending a - partially sent packet the write direction flag must not be cleared - until the previous packet has been completely sent, or the app would - hang if the packet still isn't sent completely, since select() gets - called by the internal blocking emulation layer in libssh2 but would - then not be watching the socket for writability. +- libssh2_priv msvc: Removed redundant definition of inline keyword - Clear the flag only once processing of previous packet data is - complete and a new packet is about to be prepared. - -Alexander Lamaison (24 Nov 2009) -- Detabify. - -- [Daniel Stenberg brought this change] - - Fixed memory leak in sftp_fstat(). + Initially reported by Bob Kast as "Remove redundant 'inline' define". + Thanks a lot. -Simon Josefsson (17 Nov 2009) -- Mark date of 1.2.2 release. - -- Merge branch 'master' of ssh://git.stuge.se/var/lib/git/libssh2 +- wincng: Made data parameter to hash update function constant + + Initially reported by Bob Kast as "formal parameter must be const + since it is used in contexts where the actual parameter may be const". + Thanks a lot. -Version 1.2.2 (16 Nov 2009) +- wincng: fix cross-compilation against the w64 mingw-runtime package -Daniel Stenberg (16 Nov 2009) -- prepared for 1.2.2 +- openssl: Check for LIBSSH2_OPENSSL in order to compile with openssl -Simon Josefsson (16 Nov 2009) -- Improve NEWS items. +- wincng: Fixed use of possible uninitialized variable pPaddingInfo + + Reported by Bob Kast, thanks a lot. -- Support AES-Counter ciphers. +- wincng: Added cast for double to unsigned long conversion -- Silence compiler warning. +- wincng: Cleaned up includes and check NTSTATUS using macro - Reported by Steven Van Ingelgem - in . - -- Mention libssh2-style.el. + Removed header file combination that is not supported on a real + Windows platform and can only be compiled using MinGW. Replaced + custom NTSTATUS return code checks with BCRYPT_SUCCESS macro. -- Use memmove instead of memcpy on overlapping memory areas. +Daniel Stenberg (16 Mar 2014) +- userauth_hostbased_fromfile: zero assign to avoid uninitialized use - Reported by Bob Alexander in - . + Detected by clang-analyze -- Add. +- channel_receive_window_adjust: store windows size always + + Avoid it sometimes returning without storing it, leaving calling + functions with unknown content! + + Detected by clang-analyzer -- Protect against crash on too small SSH_MSG_IGNORE packets. +- publickey_packet_receive: avoid junk in returned pointers - Reported by Bob Alexander - in . + clang-analyzer found this risk it would return a non-initialized pointer + in a success case -- add copyright line +Peter Stuge (16 Mar 2014) +- [Marc Hoersken brought this change] -- support arcfour128 cipher per RFC 4345 + Added Windows Cryptography API: Next Generation based backend -Daniel Stenberg (21 Oct 2009) -- [Cristian RodrĂ­guez brought this change] +- [Marc Hoersken brought this change] - add support for GCC visibility features + knownhost.c: fixed that 'key_type_len' may be used uninitialized + + ../src/knownhost.c: In function 'libssh2_knownhost_readline': + ../src/knownhost.c:651:16: warning: 'key_type_len' may be used + uninitialized in this function [-Wmaybe-uninitialized] + rc = knownhost_add(hosts, hostbuf, NULL, + ^ + ../src/knownhost.c:745:12: note: 'key_type_len' was declared here + size_t key_type_len; + ^ -Simon Josefsson (19 Oct 2009) -- less hard coding of cipher mode in libgcrypt backend +- [Marc Hoersken brought this change] -Daniel Stenberg (18 Oct 2009) -- [Juzna brought this change] + pem.c: always compile pem.c independently of crypto backend - libssh2_channel_forward_accept() and listening fixes +- Fix non-autotools builds: Always define the LIBSSH2_OPENSSL CPP macro - The forward accepting was not done right before, and the - packet_queue_listener function didn't assign a necessary - variable. All fixed by Juzna. I (Daniel) modified the - forward_accept() change somewhat. - -- added man page for libssh2_knownhost_free - -- more CVS => DEV conversions + Commit d512b25f69a1b6778881f6b4b5ff9cfc6023be42 introduced a crypto + library abstraction in the autotools build system, to allow us to more + easily support new crypto libraries. In that process it was found that + all other build system which we support are hard-coded to build with + OpenSSL. Commit f5c1a0d98bd51aeb24aca3d49c7c81dcf8bd858d fixes automake + introduced into non-autotools build systems but still overlooked the + CPP macro saying that we are using OpenSSL. + + Thanks to Marc Hörsken for identifying this issue and proposing a fix + for win32/{GNUmakefile,config.mk}. This commit uses a slightly different + approach but the end result is the same. -- remove references to "CVS" +Dan Fandrich (15 Mar 2014) +- channel_close: Close the channel even in the case of errors -- we are on the 1.2.2 track nowadays +- sftp_close_handle: ensure the handle is always closed + + Errors are reported on return, but otherwise the close path is + completed as much as possible and the handle is freed on exit. -Peter Stuge (17 Oct 2009) -- Ensure that win32/libssh2.dsp will be generated with CRLF line endings +Alexander Lamaison (6 Mar 2014) +- knownhost: Restore behaviour of `libssh2_knownhost_writeline` with short buffer. - First, win32/msvcproj.{head,foot} are now committed with CRLF line endings, - and .gitattributes specifies that these should not be changed on checkout or - commit. These are win32 files so it makes sense to store them with native - line endings. + Commit 85c6627c changed the behaviour of `libssh2_knownhost_writeline` so that it stopped returning the number of bytes needed when the given buffer was too small. Also, the function changed such that is might write to part of the buffer before realising it is too small. - Second, the rules for generating libssh2.dsp and libssh2.vcproj are changed - so that the full file contents passes through awk, which strips all CR and - then prints each line with one CRLF line ending. Stripping CR is important - to avoid CRCRLF in case the input already comes with CRLF. - -Dan Fandrich (29 Sep 2009) -- Make sure permissions on the private host key file is tight enough that - sshd doesn't complain. Quote $srcdir to try to cope with embedded spaces. - -Peter Stuge (30 Sep 2009) -- Clarify the scp_write examples slightly and use an octal mask for the mode + This commit restores the original behaviour, whilst keeping the unknown-key-type functionality that 85c6627c. Instead of writing to the buffer piecemeal, the length of the various parts is calculated up front and the buffer written only if there is enough space. The calculated necessary size is output in `outlen` regardless of whether the buffer was written to. + + The main use-case for the original behaviour that this commit restores is to allow passing in a NULL buffer to get the actual buffer size needed, before calling the function again with the buffer allocated to the exact size required. -Version 1.2.1 (29 Sep 2009) +- knownhost: Fix DSS keys being detected as unknown. + + I missing `else` meant ssh-dss format keys were being re-detected as unknown format. -Daniel Stenberg (29 Sep 2009) -- 1.2.1 preparations +Dan Fandrich (6 Mar 2014) +- knownhosts: Abort if the hosts buffer is too small + + This could otherwise cause a match on the wrong host -- remove ChangeLog and win32/libssh2.dsp only at make distclean +- agent_list_identities: Fixed memory leak on OOM -Simon Josefsson (23 Sep 2009) -- Fix shell usage. +- Fixed a few typos -Daniel Stenberg (22 Sep 2009) -- clarify that the paths are the remote ones +- userauth: Fixed an attempt to free from stack on error -- let hpux systems build with _REENTRANT defined as well +- Fixed a few memory leaks in error paths -- updated to match reality +- Fixed two potential use-after-frees of the payload buffer - I went over the commit log and added what I believe is all notable - changes and bugfixes since the 1.2 release - -Peter Stuge (20 Sep 2009) -- Fix scp examples to loop correctly over libssh2_channel_write() - -- Fix transport layer bug causing invalid -39 (LIBSSH2_ERROR_BAD_USE) errors + The first might occur if _libssh2_packet_add returns an error, as + fullpacket_state wasn't reset to idle so if it were possible for + fullpacket to be called again, it would return to the same state + handler and re-use the freed p->packet buffer. - The channel layer sends packets using the transport layer, possibly - calling _libssh2_transport_write() many times for each packet. + The second could occur if decrypt returned an error, as it freed the + packet buffer but did not clear total_num, meaning that freed buffer + could be written into again later. + +Alexander Lamaison (28 Nov 2013) +- Fix missing `_libssh2_error` in `_libssh2_channel_write`. - The transport layer uses the send_existing() helper to send out any - remaining parts of previous packets before a new packet is started. + In one case, the error code from `_libssh2_transport_read` was being returned from `_libssh2_channel_write` without setting it as the last error by calling `_libssh2_error`. This commit fixes that. - The bug made send_existing() consider the entire packet sent as soon as it - successfully sent the second part of a packet, even if the packet was not - completely done yet. + Found when using a session whose socket had been inadvertently destroyed. The calling code got confused because via `libssh2_session_last_error` it appeared no error had occurred, despite one being returned from the previous function. -Daniel Stenberg (19 Sep 2009) -- [Neil Gierman brought this change] +Kamil Dudka (21 Nov 2013) +- [Mark McPherson brought this change] - Added gettimeofday() function for win32 + openssl: initialise the digest context before calling EVP_DigestInit() - Neil Gierman's patch adds a gettimeofday() function for win32 - for the libssh2_trace() functionality. The code originates from - cygwin and was put in the public domain by the author - Danny Smith - -- libssh2_channel_read_ex() must return 0 when closed + When using the OpenSSL libraries in FIPS mode, the function call + EVP_DigestInit() is actually #defined to FIPS_digestinit(). + Unfortunately wheres EVP_DigestInit() initialises the context and then + calls EVP_DigestInit_ex(), this function assumes that the context has + been pre-initialised and crashes when it isn't. + + Bug: https://trac.libssh2.org/ticket/279 - If the channel is already at EOF or even closed at the end of the - libssh2_channel_read_ex() function and there's no data to return, - we need to signal that back. We may have gotten that info while - draining the incoming transport layer until EAGAIN so we must not - be fooled by that return code. + Fixes #279 -Dan Fandrich (16 Sep 2009) -- Ignore tags file +- [Marc Hörsken brought this change] -- Some platforms need sys/socket.h included before netinet/in.h. - Fixed an unused variable compiler warning. + .gitignore: Ignore files like src/libssh2_config.h.in~ -Daniel Stenberg (16 Sep 2009) -- libssh2_channel_wait_closed() could hang +Peter Stuge (13 Nov 2013) +- Move automake conditionals added by commit d512b25f out of Makefile.inc - libssh2_channel_wait_closed() had a bad loop waiting for the - channel to close, as it could easily miss the info and then if - the socket would be silent from that moment the funtion would - hang if in blocking-mode or just return EAGAIN wrongly to the - app. The drain-transport loop now correctly checks if the close - has arrived. - -- make libssh2_scp_send/recv do blocking mode correctly + Commit d512b25f69a1b6778881f6b4b5ff9cfc6023be42 added automake + conditionals to Makefile.inc but since Makefile.inc is included + from Makefile for all other build systems that does not work. - Somehow I had completely missed to make the libssh2_scp_send/recv - functions support the blocking mode the correct way so when I - cleaned up things the other day blocking mode broke for them... - Fixed now. - -Guenter Knauf (8 Sep 2009) -- changed NetWare test makefile static link order - -- removed conditional sources from Makefile.inc - added ifdef blocks to libgcrypt.c, pem.c, openssl.c - -Simon Josefsson (7 Sep 2009) -- Fix compilation errors. - -Guenter Knauf (6 Sep 2009) -- some more NetWare build fixes. - -- some more NetWare makefile fixes. - -- added sys/select.h include to samples for fd_set on NetWare. - -- accept CFLAGS from environment. - -- some more .cvsignore / .gitignore fixes. - -- renamed .cvsignore to .gitignore. - -- changed conditional into make language. - -- changed NetWare and MingW32 makefile to use Makefile.inc. - -Daniel Stenberg (2 Sep 2009) -- CVS leftovers removed - -- libssh2_version() exists since 1.1 - -Hacki (2 Sep 2009) -- added knownhost.c to makefiles. - -Alexander Lamaison (2 Sep 2009) -- Pass private-key to OpenSSL as a filename with BIO_new_file(). + This commit instead adds Makefile.OpenSSL.inc and Makefile.libgcrypt.inc + and moves the automake conditional to its proper place, src/Makefile.am. - This keeps all FILE* handling on the OpenSSL side of the DLL boundary avoiding crashes on Windows while removing the need for libssh2 to read the private key file into memory. This is now done by OpenSSL which is likely to do a better job of it. - -Daniel Stenberg (1 Sep 2009) -- generate and install libssh2.pc + The automake conditional includes the correct Makefile.$name.inc per + the crypto library selection/detection done by configure. - oh these are necessary libssh2.pc changes too - -- first take at producing and installing a pkg-config file + All non-autotools build system files in libssh2 are hardcoded to use + OpenSSL and do not get a conditional but at least there is some reuse + because they can all include the new Makefile.OpenSSL.inc. -- renamed to .ac +Daniel Stenberg (27 Oct 2013) +- [Salvador Fandino brought this change] -- renamed to the modern name "configure.ac" - -- always braces and else and brace on the same line removed + Set default window size to 2MB - I don't follow those particular guidelines myself so I think I'd - rather remove them here and keep my style than the opposite. As - I am the most frequent writer of code for the moment. - -- _libssh2_channel_write() only sends the 32K first bytes + The default channel window size used until now was 256KB. This value is + too small and results on a bottleneck on real-life networks where + round-trip delays can easily reach 300ms. - In theory we could split larger buffers into several smaller - packets to pass to transport_write(), but for now we instead only - deal with the first 32K in this call and assume the app will call - this function again with the rest! The 32K size is a - conservative limit based on the text in RFC4253 section 6.1. - -- document _libssh2_channel_write's return code - -- s/libssh2_channel_write_ex/_libssh2_channel_write internally - -- call libssh2_error() when transport_write() returns EAGAIN + The issue was not visible because the configured channel window size + was being ignored and a hard-coded value of ~22MB being used instead, + but that was fixed on a previous commit. - _libssh2_channel_write() should never return error without - libssh2_error() getting called - -- clarify that zero can be returned without meaning error - -- remove debug leftovers - -- channel_read() was changed to _libssh2_channel_read() as lots of - internal code was changed to use that instead of wrongly using - libssh2_channel_read_ex(). Some files now need to include - channel.h to get this proto. + This patch just changes the default window size + (LIBSSH2_CHANNEL_WINDOW_DEFAULT) to 2MB. It is the same value used by + OpenSSH and in our opinion represents a good compromise between memory + used and transfer speed. - channel_read() calls libssh2_error() properly on transport_read() - failures + Performance tests were run to determine the optimum value. The details + and related discussion are available from the following thread on the + libssh2 mailing-list: - channel_read() was adjusted to not "invent" EAGAIN return code in - case the transport_read() didn't return it + http://www.libssh2.org/mail/libssh2-devel-archive-2013-10/0018.shtml + http://article.gmane.org/gmane.network.ssh.libssh2.devel/6543 - channel_close() now returns 0 or error code, as - documented. Previously it would return number of bytes read in - the last read, which was confusing (and useless). - -- changed all return EAGAIN to return the variable instead + An excerpt follows: - I made this change just to easier grep for "return .*EAGAIN" cases - as they should be very rare or done wrongly. Already worked to find - a flaw, marked with "TODO FIXME THIS IS WRONG" in channel.c. I also - fixed a few cases to become more general returns now when we have - more unified return codes internally. - -- _libssh2_channel_write() must not invent EAGAIN situations + "I have been running some transfer test and measuring their speed. - it is important that only the transport layer can generate EAGAIN - error codes so that we limit where we need to set direction bits - and more. When the local window is too small to send data we simply - stop trying to send and (risk) returning zero in - _libssh2_channel_write() - -- error code cleanup - -- remove all libssh2pack_t leftovers - -- removed the libssh2pack_t type + My setup was composed of a quad-core Linux machine running Ubuntu 13.10 + x86_64 with a LXC container inside. The data transfers were performed + from the container to the host (never crossing through a physical + network device). - and a minor _libssh2_transport_read() simplification - -- fix return codes, shortened a very long function name - -- remove use of libssh2_channel_receive_window_adjust + Network delays were simulated using the tc tool. And ping was used to + verify that they worked as intended during the tests. - _libssh2_channel_receive_window_adjust is the new replacement that - is both the correct internal version instead of the external API one, - and it has the return code flaw fixed. I also fixed more return - codes to pass long the correct error found. - -- more proper return codes, added a missing libssh2_error() call - -- clear socket_block_directions bits before send/recv + The operation performed was the equivalent to the following ssh command: - These two places are the only places where send and recv are called - outside of transport.c so make sure they clear/set the bits correctly. - -- simplified fullpacket, clarified _libssh2_transport_write() comment - -- cleaned up _libssh2_packet_add() + $ ssh container "dd bs=16K count=8K if=/dev/zero" >/dev/null - removed some code duplication, changed a few return -1 to return - error codes instead and added a missing libssh2_error() invoke - -- convert return -1 instances to return [proper error code] - -- simplify code by removing code duplication - -- fix several return -1 to return a proper error code + Though, establishment and closing of the SSH connection was excluded + from the timings. - On many places in the code there have been laziness return -1 - statements lying around that should be fixed to return sensible - error codes. Here's a take at fixing a few offenders. - -- change transport to use unified error codes + I run the tests several times transferring files of sizes up to 128MB + and the results were consistent between runs. - I added three new public error codes, and then modified the return - codes we use in the transport layer to use the generic error codes - so that there won't be any risk of internal confusions due to - different error code sets. - -- changes from int to libssh2_socket_t for sokcets + The results corresponding to the 128MB transfer are available here: - modified two functions to use libssh2_socket_t instead of int - when referring to a socket descriptor - -- introducing libssh2_socket_t type and fixed iovec for windows + https://docs.google.com/spreadsheet/ccc?key=0Ao1yRmX6PQQzdG5wSFlrZl9HRWNET3ZyN0hnaGo5ZFE&usp=sharing - Steven Van Ingelgem introduces libssh2_socket_t as a generic socket - type to use internally to avoid compiler warnings and mistakes. Also, - the private struct iovec declaration for windows is now made to look - like the POSIX struct does. - -- linked list changes and minor bug fixes - -- linked list code is now converted to new functions - -- remove superfluous braces and re-indent somewhat - -- move over lots of code to the _libssh2_list_* functions + It clearly shows that 256KB is too small as the default window size. + Moving to a 512MB generates a great improvement and after the 1MB mark + the returns rapidly diminish. Other factors (TCP window size, probably) + become more limiting than the channel window size + + For comparison I also performed the same transfers using OpenSSH. Its + speed is usually on par with that of libssh2 using a window size of 1MB + (even if it uses a 2MB window, maybe it is less aggressive sending the + window adjust msgs)." - and I fixed a few minor bugs at the same time + Signed-off-by: Salvador Fandino -- converted listeners to the linked list functions +- [Salvador brought this change] -- moved the handling of SFTP handles to new linked list code + _libssh2_channel_read: Honour window_size_initial - Each SFTP file handle is now handled by the "mother-struct" - using the generic linked list functions. The goal is to move - all custom linked list code to use this set of functions. + _libssh2_channel_read was using an arbitrary hard-coded limit to trigger + the window adjusting code. The adjustment used was also hard-coded and + arbitrary, 15MB actually, which would limit the usability of libssh2 on + systems with little RAM. - I also moved the list declarations to the misc.h where they - belong and made misc.h no longer include libssh2_priv.h itself - since now libssh2_priv.h needs misc.h... + This patch, uses the window_size parameter passed to + libssh2_channel_open_ex (stored as remote.window_size_initial) plus the + buflen as the base for the trigger and the adjustment calculation. - In misc.c I added a #if 0'ed _libssh2_list_insert() function - because I ended up writing one, and I believe we may need it here - too once we move over more stuff to use the _libssh2_list* family. - -- correct the comment for _libssh2_list_add() + The memory usage when using the default window size is reduced from 22MB + to 256KB per channel (actually, if compression is used, these numbers + should be incremented by ~50% to account for the errors between the + decompressed packet sizes and the predicted sizes). - it adds the new node to the _end_ of the list - -Alexander Lamaison (16 Aug 2009) -- [Steven Van Ingelgem brought this change] - - Suppress signed/unsigned comparison warning. - -Daniel Stenberg (11 Aug 2009) -- added contributors from the 1.2 release notes - -Simon Josefsson (11 Aug 2009) -- Need to use $(EXEEXT) on programs in TESTS to fix mingw cross-compiles. - -Daniel Stenberg (10 Aug 2009) -- start working on 1.2.1 - -Version 1.2 (10 Aug 2009) + My tests indicate that this change does not impact the performance of + transfers across localhost or a LAN, being it on par with that of + OpenSSH. On the other hand, it will probably slow down transfers on + networks with high bandwidth*delay when the default window size + (LIBSSH2_CHANNEL_WINDOW_DEFAULT=256KB) is used. + + Signed-off-by: Salvador Fandino -Daniel Stenberg (10 Aug 2009) -- Version 1.2 (August 10, 2009) +- [Salvador Fandino brought this change] -- revert parts of the b95fe985af3c80a2babcaaaf7da69a15b1237c49 commit + knownhosts: handle unknown key types - Alexander Lamaison tracked down that my previous commit broke SFTP - reads in some aspects. The reversion now gets back to always recv() - until EAGAIN is returned so that the code no longer treats a short - read as an indication that it is "enough for now". + Store but don't use keys of unsupported types on the known_hosts file. - The bad commit in particular had another independent change included, - which is to clear the direction-bits first in the transport read - and write functions, but this reversion does not revert that change. - Clearing those bits first is a good thing. - -- Fix some nroff formatting + Currently, when libssh2 parses a known_host file containing keys of some + type it doesn't natively support, it stops reading the file and returns + an error. - Patch by Sofian Brabez - -Alexander Lamaison (2 Aug 2009) -- Replaced calls to OpenSSL FILE-pointer functions. + That means, that the known_host file can not be safely shared with other + software supporting other key types (i.e. OpenSSH). - Passing a FILE* argument across a DLL boundary causes problems on Windows. Instead the keys are read into memory by libssh2 and passed to the OpenSSL functions as BIO* arguments. - -Daniel Stenberg (31 Jul 2009) -- Add missing names + This patch adds support for handling keys of unknown type. It can read + and write them, even if they are never going to be matched. - I went over the NEWS and git log outputs and added all mentioned - contributors through the project's history. I want us to make an - effort to give credit to everyone who contributes, big or small. - -- fix the C99 variadic macro use for _libssh2_debug() + At the source level the patch does the following things: - George Neill pointed out that the C99 vararg marcro use was - wrong, and I edited his suggested patch slightly and unified - both prec99-GCC and C99 into the same macro. - -- Include RELEASE-NOTES in the release package + - add a new unknown key type LIBSSH2_KNOWNHOST_KEY_UNKNOWN + + - add a new slot (key_type_name) on the known_host struct that is + used to store the key type in ascii form when it is not supported + + - parse correctly known_hosts entries with unknown key types and + populate the key_type_name slot + + - print correctly known_hosts entries of unknown type + + - when checking a host key ignore keys that do not match the key + + Fixes #276 -- Release notes for the pending release +- windows build: fix build errors - I hope to maintain this file during development so that we also add - changes and bugfixes to it when we change things. Makes the daily - snapshots better and makes less of a hurdle when the release day - comes. + Fixes various link errors with VS2010 + + Reported-by: "kdekker" + Fixes #272 -- bad debugdump() causes SIGSEGV, partial sends not done right +- man page: add missing function argument + + for libssh2_userauth_publickey_fromfile_ex() - The anonymous bug report #2822910 pointed out that debugdump() was - stupidly called within the send_existing() function. At closer - inspection was the report not only right, but it also revealed - another problem to me: when the _libssh2_send() function returns - after sending only a part of the buffer, it would then misbehave. - This probably is very rare though, which must be the reason we - haven't seen a bigger problem with this. + Reported-by: "pastey" + + Fixes #262 -Simon Josefsson (28 Jul 2009) -- Silcen compiler warnings. +- [Salvador brought this change] -Daniel Stenberg (27 Jul 2009) -- added two new issues to fix: socket type and better windowing + Fix zlib deflate usage - * make sure the windowing code adapts better to slow situations so that it - doesn't then use as much memory as today + Deflate may return Z_OK even when not all data has been compressed + if the output buffer becomes full. - * Introduce a 'libssh2_socket_t' type for sockets in internal code - -- remove superfluous check for large packets + In practice this is very unlikely to happen because the output buffer + size is always some KBs larger than the size of the data passed for + compression from the upper layers and I think that zlib never expands + the data so much, even on the worst cases. - as we're already doing the correct check further down anyway there's no point - in doing the (wrong) check further up as well. Paul Veldkamp pointed this out. - -Simon Josefsson (22 Jul 2009) -- Fix make distcheck problems. + Anyway, this patch plays on the safe side checking that the output + buffer is not exhausted. + + Signed-off-by: Salvador -Daniel Stenberg (18 Jul 2009) -- parts of the previous VS project files commit +- [Salvador brought this change] -- From: Neil Gierman + comp_method_zlib_decomp: Improve buffer growing algorithm - Makefile changes to generate MSVS project files + The old algorithm was O(N^2), causing lots and lots of reallocations + when highly compressed data was transferred. - - I integrated the libssh2_lib.dsp and libssh2_dll.dsp into a single - libssh2.dsp with different targets for lib vs dll - - Since I run Visual Studio 2008 with VC++9 I did not do vcproj files since - I would have newer vc8proj.head|foot than what others will be running - - My patch only has changes to Makefile.am's. I noticed that Makefile.in's - are included in the daily snapshots but they should be generated from the - .am's - - The 3 new files are msvcproj.head and msvcproj.foot for the beginning and - ending of the dsp file, and a new Makefile.inc that will have the source and - header file names. NOTE: All new source files will need to be added to - Makefile.inc and NOT Makefile.am now. - - I moved the win32 dir before the include dir - - I modified the dsw file so it points to the new libssh2.dsp project file + This patch implements a simpler one that just doubles the buffer size + everytime it is exhausted. It results in O(N) complexity. + + Also a smaller inflate ratio is used to calculate the initial size (x4). + + Signed-off-by: Salvador -- From: Alexander Lamaison - Make the public headers includable on their own +- [Salvador brought this change] -- From: Steven Van Ingelgem - check first for libtoolize, and then for glibtoolize + Fix zlib usage - Mac OS X (and others?) needs this - -- Fix knownhost checking of non-hashed hosts + Data may remain in zlib internal buffers when inflate() returns Z_OK + and avail_out == 0. In that case, inflate has to be called again. - From: Ben Kibbey - -- Fix the functionality again with hashed host names again. + Also, once all the data has been inflated, it returns Z_BUF_ERROR to + signal that the input buffer has been exhausted. - The breakage came with commit 8b46528c0476af50a43b6e619f2db318a0cad194. + Until now, the way to detect that a packet payload had been completely + decompressed was to check that no data remained on the input buffer + but that didn't account for the case where data remained on the internal + zlib buffers. + + That resulted in packets not being completely decompressed and the + missing data reappearing on the next packet, though the bug was masked + by the buffer allocation algorithm most of the time and only manifested + when transferring highly compressible data. + + This patch fixes the zlib usage. + + Signed-off-by: Salvador -- [Peter Stuge brought this change] +- [Salvador brought this change] - Update mailing list URL to new address + _libssh2_channel_read: fix data drop when out of window + + After filling the read buffer with data from the read queue, when the + window size was too small, "libssh2_channel_receive_window_adjust" was + called to increase it. In non-blocking mode that function could return + EAGAIN and, in that case, the EAGAIN was propagated upwards and the data + already read on the buffer lost. + + The function was also moving between the two read states + "libssh2_NB_state_idle" and "libssh2_NB_state_created" both of which + behave in the same way (excepting a debug statment). + + This commit modifies "_libssh2_channel_read" so that the + "libssh2_channel_receive_window_adjust" call is performed first (when + required) and if everything goes well, then it reads the data from the + queued packets into the read buffer. + + It also removes the useless "libssh2_NB_state_created" read state. + + Some rotted comments have also been updated. + + Signed-off-by: Salvador -- const'ify two arguments to libssh2_knownhost_check() +- [Salvador Fandino brought this change] -- Fix compiler warnings appearing with VS2008. Based on Steven Van Ingelgem's - patch in #2787839 with a bunch of additional edits by yours truly. + window_size: redid window handling for flow control reasons + + Until now, the window size (channel->remote.window_size) was being + updated just after receiving the packet from the transport layer. + + That behaviour is wrong because the channel queue may grow uncontrolled + when data arrives from the network faster that the upper layer consumes + it. + + This patch adds a new counter, read_avail, which keeps a count of the + bytes available from the packet queue for reading. Also, now the window + size is adjusted when the data is actually read by an upper layer. + + That way, if the upper layer stops reading data, the window will + eventually fill and the remote host will stop sending data. When the + upper layers reads enough data, a window adjust packet is delivered and + the transfer resumes. + + The read_avail counter is used to detect the situation when the remote + server tries to send data surpassing the window size. In that case, the + extra data is discarded. + + Signed-off-by: Salvador -- Applied Francois Dupoux's extra checks for weird packet or padding length in - incoming packets. We really need to bail out this way on weird input. - bug report #2814613 +Peter Stuge (15 Sep 2013) +- configure.ac: Call zlib zlib and not libz in text but keep option names -- Mark McPherson posted bug report #2815836 pointing out that the custom memory - functions were not given the correct data as argument. This is now fixed even - if I personally don't quite grasp why abstract is passed as a pointer to - pointer all over libssh2... +- configure.ac: Reorder --with-* options in --help output -- Ben Kibbey added a type parameter to the libssh2_session_hostkey() function, - which hasn't yet been in a public release so changing the API is fine! +- configure.ac: Rework crypto library detection + + This further simplifies adding new crypto libraries. -- Guenter Knauf fixed this example to build on win32 +- Clean up crypto library abstraction in build system and source code + + libssh2 used to explicitly check for libgcrypt and default to OpenSSL. + + Now all possible crypto libraries are checked for explicitly, making + the addition of further crypto libraries both simpler and cleaner. -- corrected (again) +- configure.ac: Add zlib to Requires.private in libssh2.pc if using zlib -- clarify +- Revert "Added Windows Cryptography API: Next Generation based backend" + + This reverts commit d385230e15715e67796f16f3e65fd899f21a638b. -- Neil Gierman pointed out in bug report #2809163 that these two files cannot - include the public libssh2.h header as it breaks the compile on window. I'll - adapt to this now, but in the long run I think we should rather fix the - includes so that we _can_ include the public headers properly. +Daniel Stenberg (7 Sep 2013) +- [Leif Salomonsson brought this change] -- fixed the length check in knownhost_writeline() since <= is actually good - enough when the size includes the trailing zero + sftp_statvfs: fix for servers not supporting statfvs extension + + Fixes issue arising when server does not support statfvs and or fstatvfs + extensions. sftp_statvfs() and sftp_fstatvfs() after this patch will + handle the case when SSH_FXP_STATUS is returned from server. -- After a mention from Ben Kibbey we now let knownhost_writeline() return the - length of the actual data it returns, excluding the trailing zero. I also - updated the man page for libssh2_knownhost_writeline() accordingly. +- [Marc Hoersken brought this change] -- empty line removed + Added Windows Cryptography API: Next Generation based backend -- Ben Kibbey fixed the hostline() when parsing lines using only one hostname +- [Kamil Dudka brought this change] -- Merge branch 'master' of ssh://bagder@git.stuge.se/var/lib/git/libssh2 + partially revert "window_size: explicit adjustments only" + + This partially reverts commit 03ca9020756a4e16f0294e5b35e9826ee6af2364 + in order to fix extreme slowdown when uploading to localhost via SFTP. + + I was able to repeat the issue on RHEL-7 on localhost only. It did not + occur when uploading via network and it did not occur on a RHEL-6 box + with the same version of libssh2. + + The problem was that sftp_read() used a read-ahead logic to figure out + the window_size, but sftp_packet_read() called indirectly from + sftp_write() did not use any read-ahead logic. -- Provide a libssh2_scp_send() API for files larger than 4GB (32bit size) +- _libssh2_channel_write: client spins on write when window full + + When there's no window to "write to", there's no point in waiting for + the socket to become writable since it most likely just will continue to + be. + + Patch-by: ncm + Fixes #258 -- Olivier Hervieu provided this x11 forwarding example. This is the version - after my initial cleanup that I posted to the list on May 26th 2009. It still - has a few ugly spots that should be cleaned up, but until then it's will at - least be found in the repo. For this reason I don't add this to the makefile. +- _libssh2_channel_forward_cancel: avoid memory leaks on error + + Fixes #257 -- New man page for libssh2_session_hostkey(3). We probably need to improve this - to also return the type of the key. +- _libssh2_packet_add: avoid using uninitialized memory + + In _libssh2_packet_add, called by _libssh2_packet_read, a call to + _libssh2_packet_send that is supposed to send a one-byte message + SSH_MSG_REQUEST_FAILURE would send an uninitialized byte upon re-entry + if its call to _send returns _EAGAIN. + + Fixes #259 -- Add check for and use of the _REENTRANT define for Solaris so that libssh2 - is then properly thread-safe on that OS. These autuconf macros are straight - from the cURL project and were mostly written by Yang Tse. They were only - very slightly edited by me when imported to here. +- _libssh2_channel_forward_cancel: accessed struct after free + + ... and the assignment was pointless anyway since the struct was about + to be freed. Bug introduced in dde2b094. + + Fixes #268 -- [Tor Arntsen brought this change] +Peter Stuge (2 Jun 2013) +- [Marc Hoersken brought this change] - Ignore generated files + Fixed compilation using mingw-w64 -- use the correct #if condition for strtoll(), pointed out in bug report +- [Marc Hoersken brought this change] -- define the HAVE_LIBSSH2_KNOWNHOST_API to the version number 1.1.1 to make apps - know that when this define exists, the API exists. And the version number can - be used for run-time checks. 1.1.1 is not likely to be the release version as - I think we'll go with 1.2 instead but 1.1.1 OR LATER should still work. + knownhost.c: use LIBSSH2_FREE macro instead of free + + Use LIBSSH2_FREE instead of free since + _libssh2_base64_encode uses LIBSSH2_ALLOC -- libssh2_knownhost_add() got an additional argument: 'store' so that an - application can get a pointer back to the internal representation of the host - it just added. Useful for example when the app wants to add a host, and then - convert that exact same host to a line for storing in a known host file. - 'store' can also be set to NULL to simple not care. +Daniel Stenberg (18 May 2013) +- [Matthias Kerestesch brought this change] -- Added a call to libssh2_knownhost_writefile() + libssh2_agent_init: init ->fd to LIBSSH2_INVALID_SOCKET - Updated to the slightly modified libssh2_knownhost_check() proto - -- "struct libssh2_knownhost" is now part of the internal struct for each known - host so we now only return pointers to structs instead of having the app - allocate a full struct + ... previously it was left at 0 which is a valid file descriptor! - I moved the private struct definition into knownhosts.c instead of exposing it - wider in libssh2_priv.h + Bug: https://trac.libssh2.org/ticket/265 - I thus modified the proto for two functions that previously used 'struct - libssh2_knownhost *' to receive data. - -- when a host is added, we must make sure the app also provides a key *type* even - though we don't use the type in this function + Fixes #265 -- Added man pages for the two newest members of the knownhosts API family: - libssh2_knownhost_readline() and libssh2_knownhost_writeline() +- userauth_password: pass on the underlying error code + + _libssh2_packet_requirev() may return different errors and we pass that + to the parent instead of rewriting it. + + Bug: http://libssh2.org/mail/libssh2-devel-archive-2013-04/0029.shtml + Reported by: Cosmin -- introducing libssh2_knownhost_writeline() and some cleanups to use more - defined error codes instead of the simplified -1 previously used a little too - much here +Peter Stuge (9 May 2013) +- [Marc Hoersken brought this change] -- I think *readline() makes a better name + libcrypt.c: Fix typo in _libssh2_rsa_sha1_sign() parameter type -- clarify that the key "string" needs to be zero terminated too +Kamil Dudka (4 May 2013) +- configure.ac: replace AM_CONFIG_HEADER with AC_CONFIG_HEADERS + + Reported by: Quintus + Bug: https://trac.libssh2.org/ticket/261 -- introducing libssh2_knownhost_read() that makes libssh2 read a single given - line - const'ified a few args to libssh2_knownhost_add() as well +Guenter Knauf (12 Apr 2013) +- Fixed copyright string for NetWare build. -- fix a warning for a comparison mixing signed and unsigned types +Daniel Stenberg (9 Apr 2013) +- [Richard W.M. Jones brought this change] -- After review/feedback/discussions on the mailing list. Rename two functions: + sftp: Add support for fsync (OpenSSH extension). - s/libssh2_knownhost_parsefile/libssh2_knownhost_readfile - s/libssh2_knownhost_dumpfile/libssh2_knownhost_writefile - -- define removed + The new libssh2_sftp_fsync API causes data and metadata in the + currently open file to be committed to disk at the server. + + This is an OpenSSH extension to the SFTP protocol. See: + + https://bugzilla.mindrot.org/show_bug.cgi?id=1798 -- LIBSSH2_KNOWNHOST_TYPE_DEFAULT is not a good idea, scrap it +- [Richard W.M. Jones brought this change] -- Added the initial man pages for the 7 new functions for known host handling + sftp: statvfs: Along error path, reset the correct 'state' variable. -- first shot at implementing libssh2_knownhost_dumpfile() and some minor - cleanups +- [Richard W.M. Jones brought this change] -- introducing libssh2_knownhost_get() to the public API + sftp: seek: Don't flush buffers on same offset + + Signed-off-by: Richard W.M. Jones -- clarified a comment +Guenter Knauf (9 Feb 2013) +- Updated dependency libs. -- slighty better behavior and comments +- Fixed tool macro names. -- remove include since we don't use struct iovec in this file +Daniel Stenberg (29 Nov 2012) +- [Seth Willits brought this change] -- These examples no longer need to explictly set the socket to non-blocking state - as libssh2 itself will always do that by itself. + compiler warnings: typecast strlen in macros + + ... in macro parameters to avoid compiler warnings about lost precision. + + Several macros in libssh2.h call strlen and pass the result directly to + unsigned int parameters of other functions, which warns about precision + loss because strlen returns size_t which is unsigned long on at least + some platforms (such as OS X). The fix is to simply typecast the + strlen() result to unsigned int. -- add myself as copyright owner +- libssh2.h: bump version to 1.4.4-DEV -- mention conversion of code to the new linked list code +Version 1.4.3 (27 Nov 2012) -- remove #if 0'ed code +Daniel Stenberg (27 Nov 2012) +- RELEASE-NOTES: fixed for 1.4.3 -- clarify the fix, as it wasn't a leak +- sftp_read: return error if a too large package arrives -- spell fix a comment +Peter Stuge (13 Nov 2012) +- Only define _libssh2_dsa_*() functions when building with DSA support -- Added some clarifying comments on how the 'sftpInit_sftp' and - 'sftpInit_channel' struct fields within the session struct are used. And made - sure to clear them both correctly when sftp_init() returns instead of at - shutdown time, as it must not touch them at shutdown time. This should make it - possible to properly make more than one SFTP handle. +Guenter Knauf (8 Nov 2012) +- Added .def file to output. -- no need for LIBSSH2_ERROR_MEMORY when LIBSSH2_ERROR_ALLOC already exist! - added my own copyright line too now +Kamil Dudka (1 Nov 2012) +- libssh2_hostkey_hash.3: update the description of return value + + The function returns NULL also if the hash algorithm is not available. -- use LIBSSH2_ERROR_ALLOC instead of introducing a new error code +Guenter Knauf (24 Oct 2012) +- Fixed mode acciedently committed. -- clear session->sftpInit_sftp unconditionally +- Ignore generated file. -- Fix my recent session->sftpInit_sftp fix which wasn't correct. The memory area - does not need to be freed (it already gets freed) but clearing the pointer is - a good idea. And it should be done _after_ the channel_free() call. +- Added hack to make use of Makefile.inc. + + This should avoid further maintainance of the objects list. -- add an assert to help debugging +- Fixed MSVC NMakefile. + + Added missing source files; added resource for DLL. -- Without CVS we must not use cvs tools to generate the changelog. I'm not - confident enough with git to attempt to make one so I'll just make a dummy for - now. +Kamil Dudka (22 Oct 2012) +- examples: use stderr for messages, stdout for data + + Reported by: Karel Srot + Bug: https://bugzilla.redhat.com/867462 -- - Anonymous bug report #2795816 revealed that libssh2_sftp_shutdown() did not - properly free/cleanup the SFTP handle so libssh2 leaked memory and caused - an assert() on subsequent libssh2_sftp_init() calls on the same session. +- openssl: do not leak memory when handling errors + + ,.. in aes_ctr_init(). Detected by Coverity. -- Fix _libssh2_channel_write(): fixed the write loop to also read from the - transport layer better, to avoid draining the window size when sending large - packets. I also fixed the return code for it to return the number of bytes - handled in this single invoke (and not the cumulative amount). +- channel: fix possible NULL dereference + + ... in libssh2_channel_get_exit_signal(). Detected by Coverity. -- First, only try to send max packet size *4 to channel write, as trying to send - much larger packages only cause internal problems and much larger allocations. +- Revert "aes: the init function fails when OpenSSL has AES support" - Also fix sftp_write() when _libssh2_channel_write() returns that a packet was - only partially sent as that is not an error. + This partially reverts commit f4f2298ef3635acd031cc2ee0e71026cdcda5864. - Fixed a few error messages to more accurately point out the problem - -- If recv() returns something less than the full buffer we know we're done for - now, so skip looping and doing another read that then simply will cause an - EAGAIN as it may trick the user into believing things that aren't true. - -daniel (14 May 2009) -- remove the old style as it makes little sense to mention here anymore + We need to use the EVP_aes_???_ctr() functions in FIPS mode. -Daniel Stenberg (12 May 2009) -- typo +- crypt: use hard-wired cipher block sizes consistently -- comment typo and some indent fixes +- openssl: do not ignore failure of EVP_CipherInit() -- Partial fix based on the patch and discussions in #2788319 +- kex: do not ignore failure of libssh2_md5_init() + + The MD5 algorithm is disabled when running in FIPS mode. -- clear the passed in struct when the entry has been removed to help prevent - mistakes due to re-use +Daniel Stenberg (21 Aug 2012) +- [Peter Krempa brought this change] -- use a better example file name for the known_hosts file + known_hosts: Fail when parsing unknown keys in known_hosts file. + + libssh2_knownhost_readfile() silently ignored problems when reading keys + in unsupported formats from the known hosts file. When the file is + written again from the internal structures of libssh2 it gets truntcated + to the point where the first unknown key was located. + + * src/knownhost.c:libssh2_knownhost_readfile() - return error if key + parsing fails -- split out the knownhost code from hostkey.c into its own separate source file - now: knownhost.c +- AUTHORS: synced with 42fec44c8a4 + + 31 recent authors added -- this was never supposed to be added for real +- [Dave Hayden brought this change] -- My knownhost work as of right now. It works at least partly. More tests and - tweaks will come. + compression: add support for zlib@openssh.com + + Add a "use_in_auth" flag to the LIBSSH2_COMP_METHOD struct and a + separate "zlib@openssh.com" method, along with checking session->state + for LIBSSH2_STATE_AUTHENTICATED. Appears to work on the OpenSSH servers + I've tried against, and it should work as before with normal zlib + compression. -- get host, user, password and command from the command line +- [Dmitry Smirnov brought this change] -- Added ssh2_exec as a new example, showing how to run a command remotely with - libssh2 + configure: gcrypt doesn't come with pkg-config support + + ... so use plain old -lgcrypt to the linker to link with it. + + Fixes #225 -- bug #2785173 pointed out that we really must call _libssh2_transport_read() - in loops until it returns < 0 when we call it, as if we just call it once we - may drain the socket for data and then leave unused in-memory data that we - won't detect because the socket is back to idle... +- sftp_read: Value stored to 'next' is never read + + Detected by clang-analyzer -- Markus posted a bug report about a bad 0-return from libssh2_channel_read: - http://libssh2.haxx.se/mail/libssh2-devel-archive-2009-04/0076.shtml +- publickey_init: errors are negative, fix check - And it was indeed a bad loop that terminated too early due to a receveived - close packet. + Detected by clang-analyzer. -- remove pointless sleeps +- [Maxime Larocque brought this change] + + session_free: wrong variable used for keeping state + + If libssh2_session_free is called without the channel being freed + previously by libssh2_channel_free a memory leak could occur. + + A mismatch of states variables in session_free() prevent the call to + libssh2_channel_free function. session->state member is used instead of + session->free_state. + + It causes a leak of around 600 bytes on every connection on my systems + (Linux, x64 and PPC). + + (Debugging done under contract for Accedian Networks) + + Fixes #246 + +Guenter Knauf (29 Jun 2012) +- Small NetWare makefile tweak. + +- Some small Win32 makefile fixes. + +Daniel Stenberg (19 Jun 2012) +- libssh2_userauth_publickey_fromfile_ex.3: mention publickey == NULL + +- comp_method_zlib_decomp: handle Z_BUF_ERROR when inflating + + When using libssh2 to perform an SFTP file transfer from the "JSCAPE MFT + Server" (http://www.jscape.com) the transfer failed. The default JSCAPE + configuration is to enforce zlib compression on SSH2 sessions so the + session was compressed. The relevant part of the debug trace contained: + + [libssh2] 1.052750 Transport: unhandled zlib error -5 + [libssh2] 1.052750 Failure Event: -29 - decompression failure + + The trace comes from comp_method_zlib_decomp() in comp.c. The "unhandled + zlib error -5" is the status returned from the zlib function + inflate(). The -5 status corresponds to "Z_BUF_ERROR". + + The inflate() function takes a pointer to a z_stream structure and + "inflates" (decompresses) as much as it can. The relevant fields of the + z_stream structure are: + + next_in - pointer to the input buffer containing compressed data + avail_in - the number of bytes available at next_in + next_out - pointer to the output buffer to be filled with uncompressed + data + avail_out - how much space available at next_out + + To decompress data you set up a z_stream struct with the relevant fields + filled in and pass it to inflate(). On return the fields will have been + updated so next_in and avail_in show how much compressed data is yet to + be processed and next_out and avail_out show how much space is left in + the output buffer. + + If the supplied output buffer is too small then on return there will be + compressed data yet to be processed (avail_in != 0) and inflate() will + return Z_OK. In this case the output buffer must be grown, avail_out + updated and inflate() called again. + + If the supplied output buffer was big enough then on return the + compressed data will have been exhausted (avail_in == 0) and inflate() + will return Z_OK, so the data has all been uncompressed. + + There is a corner case where inflate() makes no progress. That is, there + may be unprocessed compressed data and space available in the output + buffer and yet the function does nothing. In this case inflate() will + return Z_BUF_ERROR. From the zlib documentation and the source code it + is not clear under what circumstances this happens. It could be that it + needs to write multiple bytes (all in one go) from its internal state to + the output buffer before processing the next chunk of input but but + can't because there is not enough space (though my guesses as to the + cause are not really relevant). Recovery from Z_BUF_ERROR is pretty + simple - just grow the output buffer, update avail_out and call + inflate() again. + + The comp_method_zlib_decomp() function does not handle the case when + inflate() returns Z_BUF_ERROR. It treats it as a non-recoverable error + and basically aborts the session. + + Fixes #240 + +Guenter Knauf (12 Jun 2012) +- MinGW makefile tweaks. + + Use GNU tools when compiling on Linux. + Fixed dist and dev targets. + +- NetWare makefile tweaks. + + Changed to use Windows commandline tools instead of + GNU tools when compiling on Windows. Fixed dist and + dev targets. Enabled nlmconv error for unresolved + symbols. + +Daniel Stenberg (11 Jun 2012) +- Revert "config.rpath: generated file, no need to keep in git" + + This reverts commit 1ac7bd09cc685755577fb2c8829adcd081e7ab3c. + + This file still used by lib/*m4 functions so we need to keep the file + around. + +- BINDINGS: added PySsh2, a Python-ctypes binding + +Guenter Knauf (8 Jun 2012) +- Fixed MinGW debug build. + +Daniel Stenberg (5 Jun 2012) +- BINDINGS: Added the Cocoa/Objective-C one + + ... and sorted the bindings after the languages, alphabetically + + Reported by: Mike Abdullah + +- BINDINGS: document the bindings we know of + +Guenter Knauf (4 Jun 2012) +- Fixed LIBSSH2_INT64_T_FORMAT macro. + + Usually a format macro should hold the whole format, otherwise + it should be named a prefix. Also fixed usage of this macro in + scp.c for a signed var where it was used as prefix for unsigned. + +- Removed obsolete define from makefiles. + +- Renamed NetWare makefiles. + +- Renamed NetWare makefiles. + +- Synced MinGW makefiles with 56c64a6..39e438f. + + Also synced MinGW test makefile with b092696..f8cb874. + +Peter Stuge (30 May 2012) +- Revert "sftp: Don't send attrs.permissions on read-only SSH_FXP_OPEN" + + This reverts commit 04e79e0c798674a0796be8a55f63dd92e6877790. + +- sftp: Don't send attrs.permissions on read-only SSH_FXP_OPEN + + This works around a protocol violation in the ProFTPD 1.3.4 mod_sftp + server, as reported by Will Cosgrove in: + + http://libssh2.org/mail/libssh2-devel-archive-2012-05/0079.shtml + + Based on a suggested fix by TJ Saunders in: + + http://libssh2.org/mail/libssh2-devel-archive-2012-05/0104.shtml + +Guenter Knauf (28 May 2012) +- Try to detect OpenSSL build type automatically. + + Also fixed recently added libgdi32 linkage which is only + required when OpenSSL libs are linked statically. + +Daniel Stenberg (25 May 2012) +- config.rpath: generated file, no need to keep in git + +Guenter Knauf (22 May 2012) +- Updated dependency libary versions. + +Daniel Stenberg (18 May 2012) +- 1.4.3: towards the future + +Version 1.4.2 (18 May 2012) + +Daniel Stenberg (18 May 2012) +- RELEASE-NOTES: synced with 92a9f952794 + +Alexander Lamaison (15 May 2012) +- win32/libssh2_config.h: Remove hardcoded #define LIBSSH2_HAVE_ZLIB. + + Rationale: Everything else in this file states a fact about the win32 + platform that is unconditional for that platform. There is nothing + unconditional about the presence of zlib. It is neither included with + Windows nor with the platform SDK. Therefore, this is not an appropriate + place to assert its presence. Especially as, once asserted, it cannot be + overridden using a compiler flag. + + In contrast, if it is omitted, then it can easily be reasserted by adding + a compiler flag defining LIBSSH2_HAVE_ZLIB. + +Daniel Stenberg (14 May 2012) +- RELEASE-NOTES: synced with 69a3354467c + +- _libssh2_packet_add: SSH_MSG_CHANNEL_REQUEST default to want_reply + + RFC4254 says the default 'want_reply' is TRUE but the code defaulted to + FALSE. Now changed. + + Fixes #233 + +- gettimeofday: no need for a replacement under cygwin + + Fixes #224 + +Alexander Lamaison (13 May 2012) +- Prevent sftp_packet_read accessing freed memory. + + sftp_packet_add takes ownership of the packet passed to it and (now that we + handle zombies) might free the packet. sftp_packet_read uses the packet type + byte as its return code but by this point sftp_packet_add might have freed + it. This change fixes the problem by caching the packet type before calling + sftp_packet_add. + + I don't understand why sftp_packet_read uses the packet type as its return + code. A future change might get rid of this entirely. + +Daniel Stenberg (12 May 2012) +- sftp_packet_flush: flush zombies too + + As this function is called when the SFTP session is closed, it needs to + also kill all zombies left in the SFTP session to avoid leaking memory + just in case some zombie would still be in there. + +- sftp_packetlist_flush: zombies must not have responses already + + When flushing the packetlist, we must only add the request as a zombie + if no response has already been received. Otherwise we could wrongly + make it a zombie even though the response was already received and then + we'd get a zombie stuck there "forever"... + +- sftp_read: on EOF remove packet before flush + + Since the sftp_packetlist_flush() function will move all the existing + FXP_READ requests in this handle to the zombie list we must first remove + this just received packet as it is clearly not a zombie. + +- sftp_packet_require: sftp_packet_read() returning 0 is not an error + + Exactly as the comment in the code said, checking the return code from + sftp_packet_read() with <= was wrong and it should be < 0. With the new + filtering on incoming packets that are "zombies" we can now see this + getting zero returned. + +- sftp_packetlist_flush: only make it zombie if it was sent + + The list of outgoing packets may also contain packets that never were + sent off and we better not make them zombies too. + +- [Alexander Lamaison brought this change] + + Mark outstanding read requests after EOF as zombies. + + In order to be fast, sftp_read sends many read requests at once. With a small + file, this can mean that when EOF is received back, many of these requests are + still outstanding. Responses arriving after we close the file and abandon the + file handle are queued in the SFTP packet queue and never collected. This + causes transfer speed to drop as a progressively longer queue must be searched + for every packet. + + This change introduces a zombie request-ID list in the SFTP session that is + used to recognise these outstanding requests and prevent them being added to + the queue. + +Peter Stuge (23 Apr 2012) +- [Rafael Kitover brought this change] + + Update win32/GNUmakefile to use OpenSSL 1.0.1a + + libcrypto on win32 now depends on gdi32.dll, so move the OpenSSL LDLIBS + block to before the compiler definitions, so that libcrypto gets added + first, and then add -lgdi32 into the following common LDLIBS for gcc. + +Guenter Knauf (23 Apr 2012) +- Changed 'Requires' to 'Requires.private'. + + Only static builds need to link against the crypto libs. + +- Fixed 'Requires:' names. + + The 'Requires:' line lists the names of the .pc files. + +- Added 'Requires:' line to libssh2.pc. + + This is necessary so that other libs which lookup libssh2 info + via pkg-config can add the right crypto lib dependencies. + +- Updated dependency lib versions. + +Peter Stuge (18 Apr 2012) +- configure.ac: Add option to disable build of the example applications + + Examples are built by default. Any of the following options on the + configure command line will skip building them: + + --disable-examples-build + --enable-examples-build=no + --enable-examples-build=false + +- userauth.c: fread() from public key file to correctly detect any errors + + If the filename parameter for file_read_publickey() was the name of a + directory instead of a file then libssh2 would spin trying to fgetc() + from the FILE * for the opened directory when trying to determine the + length of the encoded public key, since fgetc() can't report errors. + + Use fread() instead to correctly detect this error condition along + with many others. + + This fixes the problem reported in + http://www.libssh2.org/mail/libssh2-devel-archive-2012-04/0021.shtml + + Reported-by: Oleksiy Zagorskyi + +- Return LIBSSH2_ERROR_SOCKET_DISCONNECT on EOF when reading banner + +Guenter Knauf (17 Apr 2012) +- Fixed copyright year. + +- Updated dependency lib versions in static makefiles. + +Daniel Stenberg (6 Apr 2012) +- version: bump to 1.4.2 + + We're on the 1.4.2 track now (at least) + +Version 1.4.1 (4 Apr 2012) + +Daniel Stenberg (4 Apr 2012) +- RELEASE-NOTES: updated for 1.4.1 release + +- always do "forced" window updates + + When calling _libssh2_channel_receive_window_adjust() internally, we now + always use the 'force' option to prevent libssh2 to avoid sending the + update if the update isn't big enough. + + It isn't fully analyzed but we have seen corner cases which made a + necessary window update not get send due to this and then the other side + doesn't send data our side then sits waiting for forever. + +- channel_read: force window adjusts! + + if there's not enough room to receive the data that's being requested, + the window adjustment needs to be sent to the remote and thus the force + option has to be used. _libssh2_channel_receive_window_adjust() would + otherwise "queue" small window adjustments for a later packet but that + is really terribly for the small buffer read that for example is the + final little piece of a very large file as then there is no logical next + packet! + + Reported by: Armen Babakhanian + Bug: http://www.libssh2.org/mail/libssh2-devel-archive-2012-03/0130.shtml + +- [Paul Howarth brought this change] + + aes: the init function fails when OpenSSL has AES support + + The internal init function only worked fine when the configure script + didn't detect the OpenSSL AES_CTR function! + + Bug: http://www.libssh2.org/mail/libssh2-devel-archive-2012-03/0111.shtml + Reported by: Paul Howarth + +- [Matthew Booth brought this change] + + transport_send: Finish in-progress key exchange before sending data + + _libssh2_channel_write() first reads outstanding packets before writing + new data. If it reads a key exchange request, it will immediately start + key re-exchange, which will require sending a response. If the output + socket is full, this will result in a return from + _libssh2_transport_read() of LIBSSH2_ERROR_EAGAIN. In order not to block + a write because there is no data to read, this error is explicitly + ignored and the code continues marshalling a packet for sending. When it + is sent, the remote end immediately drops the connection because it was + expecting a continuation of the key exchange, but got a data packet. + + This change adds the same check for key exchange to + _libssh2_transport_send() that is in _libssh2_transport_read(). This + ensures that key exchange is completed before any data packet is sent. + +- channel_write: acknowledge transport errors + + When draining data off the socket with _libssh2_transport_read() (which + in turn has to be done so that we can be sure to have read any possible + window-increasing packets), this code previously ignored errors which + could lead to nasty loops. Now all error codes except EAGAIN will cause + the error to be returned at once. + + Bug: http://www.libssh2.org/mail/libssh2-devel-archive-2012-03/0068.shtml + Reported by: Matthew Booth + +- [Steven Dake brought this change] + + In examples/x11.c, Make sure sizeof passed to read operation is correct + + sizeof(buf) expands to 8 or 4 (since its a pointer). This variable may + have been static in the past, leading to this error. + + Signed-off-by: Steven Dake + +- [Steven Dake brought this change] + + Fix suspicious sizeof usage in examples/x11.c + + In the x11 example, sizeof(buf) = 8UL (on x86_64), when this should + probably represent the buffer size available. I am not sure how to + test that this change is actually correct, however. + + Signed-off-by: Steven Dake + +- sftp_packet_read: follow-up fix for EAGAIN/window adjust + + The commit in 7194a9bd7ba45 wasn't complete. This change makes sure + variables are initialized properly before used in the EAGAIN and window + adjust cases. + +- sftp_packet_add: use named error code instead of number + +- sftp_packet_add: verify the packet before accepting it + + In order to bail out as quickly as possible when things are wrong and + out of sync, make sure the SFTP message is one we understand. + +- SFTP: preserve the original error code more + + Lots of places in the code translated the original error into the more + generic LIBSSH2_ERROR_SOCKET_TIMEOUT but this turns out to distort the + original error reason a lot and makes tracking down the real origin of a + problem really hard. This change makes the original error code be + preserved to a larger extent when return up to the parent function. + +- sftp_packet_read: adjust window size as necessary + + Commit 03ca9020756 tried to simplify the window sizing logic but broke + SFTP readdir as there was no window sizing code left there so large + directory listings no longer worked. + + This change introduces window sizing logic to the sftp_packet_read() + function so that it now tells the remote about the local size having a + window size that suffice when it is about to ask for directory data. + + Bug: http://www.libssh2.org/mail/libssh2-devel-archive-2012-03/0069.shtml + Reported by: Eric + +- [Steven Dake brought this change] + + Tell C compiler we don't care about return code of libssh2_init + + The call of libssh2_init returns a return code, but nothing could be done + within the _libssh2_init_if_needed execution path. + + Signed-off-by: Steven Dake + +- [Steven Dake brought this change] + + Add comment indicating a resource leak is not really a resource leak + + While possibly obvious to those investigating the code, coverity complains + about this out of scope leak. + + Signed-off-by: Steven Dake + +- [Steven Dake brought this change] + + Use safer snprintf rather then sprintf in scp_send() + + Signed-off-by: Steven Dake + +- [Steven Dake brought this change] + + Use safer snprintf rather then sprintf in scp_recv() + + While the buffer is indeed allocated to a safe length, better safe then sorry. + + Signed-off-by: Steven Dake + +- [Steven Dake brought this change] + + use snprintf in knownhost_writeline() rather then sprintf + + Although the function checks the length, if the code was in error, there + could potentially be a buffer overrun with the use of sprintf. Instead replace + with snprintf. + + Signed-off-by: Steven Dake + +- [Steven Dake brought this change] + + Add tracing to print packets left on session at libssh2_session_free + + Signed-off-by: Steven Dake + +Peter Stuge (2 Mar 2012) +- Define and use LIBSSH2_INVALID_SOCKET instead of INVALID_SOCKET + + INVALID_SOCKET is a special value in Windows representing a + non-valid socket identifier. We were #defining this to -1 on + non-Windows platforms, causing unneccessary namespace pollution. + Let's have our own identifier instead. + + Thanks to Matt Lawson for pointing this out. + +- nw/Makefile.netware: Fix project name typo to avoid needless confusion + +- example/x11: Set raw terminal mode manually instead of with cfmakeraw() + + OpenSolaris has no cfmakeraw() so to make the example more portable + we simply do the equivalent operations on struct termios ourselves. + + Thanks to Tom Weber for reporting this problem, and finding a solution. + +Daniel Stenberg (17 Feb 2012) +- sftp_write: cannot return acked data *and* EAGAIN + + Whenever we have acked data and is about to call a function that *MAY* + return EAGAIN we must return the number now and wait to get called + again. Our API only allows data *or* EAGAIN and we must never try to get + both. + +Peter Stuge (13 Feb 2012) +- example/x11: Build only when sys/un.h is found by configure + + The example can't be built on systems without AF_UNIX sockets. + +Daniel Stenberg (10 Feb 2012) +- [Alexander Lamaison brought this change] + + Simplified sftp_read. + + Removed the total_read variable that originally must have tracked how + much data had been written to the buffer. With non-blocking reads, we + must return straight away once we have read data into the buffer so this + variable served not purpose. + + I think it was still hanging around in case the initial processing of + 'leftover' data meant we wrote to the buffer but this case, like the + others, must return immediately. Now that it does, the last remaining + need for the variable is gone. + +- [Alexander Lamaison brought this change] + + Cleaned up sftp_read and added more explanation. + + Replaced the gotos which were implementing the state machine with + a switch statement which makes the states more explicit. + +- sftp_read: avoid data *and* EAGAIN + + Whenever we have data and is about to call a function that *MAY* return + EAGAIN we must return the data now and wait to get called again. Our API + only allows data *or* EAGAIN and we must never try to get both. + +Peter Stuge (2 Feb 2012) +- Add a tcpip-forward example which demonstrates remote port forwarding + +- libssh2.h: Add missing prototype for libssh2_session_banner_set() + +- example/subsystem_netconf.c: Return error when read buffer is too small + + Also remove a little redundancy in the read loop condition. + +- example/subsystem_netconf.c: Add a missing newline in an error message + +- Fix undefined reference to _libssh_error in libgcrypt backend + + Commit 209de22299b4b58e582891dfba70f57e1e0492db introduced a function + call to a non-existing function, and since then the libgcrypt backend + has not been buildable. + +Version 1.4.0 (31 Jan 2012) + +Daniel Stenberg (31 Jan 2012) +- RELEASE-NOTES: synced with 6bd584d29 for 1.4.0 + +- s/1.3.1/1.4.0 + + We're bumping the minor number + +- [Jernej Kovacic brought this change] + + libssh2_session_supported_algs: fix compiler warning + +- [Jernej Kovacic brought this change] + + session_supported_algs docs: added an example + +- [Gellule Xg brought this change] + + sftp-seek: clear EOF flag + + Set the EOF flag to False when calling seek64 to be able to get some + data back on a following read + +- [Peter Krempa brought this change] + + userauth: Provide more informations if ssh pub key extraction fails + + If the function that extracts/computes the public key from a private key + fails the errors it reports were masked by the function calling it. This + patch modifies the key extraction function to return errors using + _libssh_error() function. The error messages are tweaked to contain + reference to the failed operaton in addition to the reason. + + * AUTHORS: - add my name + * libgcrypt.c: _libssh2_pub_priv_keyfile(): - return a more verbose + error using + _libssh2_error() func. + * openssl.c: - modify call graph of _libssh2_pub_priv_keyfile() to use + _libssh2_error for error reporting(); + * userauth.c: - tweak functions calling _libssh2_pub_priv_keyfile() not + to shadow error messages + +- TODO: remove issues we (sort of) did already + +- ssh2_exec: skip error outputs for EAGAIN + + Since the example uses non-blocking mode, it will just flood the output + with this "nonsense" error. + +Guenter Knauf (30 Nov 2011) +- Some NetWare makefile tweaks. + +Daniel Stenberg (18 Nov 2011) +- LIBSSH2_SFTP_PACKET_MAXLEN: increase to 80000 + + Some SFTP servers send SFTP packets larger than 40000. Since the limit + is only present to avoid insane sizes anyway, we can easily bump it. + + The define was formerly in the public header libssh2_sftp.h but served + no external purpose and was moved into the source dir. + + Bug: http://www.libssh2.org/mail/libssh2-devel-archive-2011-11/0004.shtml + Reported by: Michael Harris + +Alexander Lamaison (18 Nov 2011) +- [Peter Krempa brought this change] + + knownhost_check(): Don't dereference ext if NULL is passed + + Documentation for libssh2_knownhost_checkp() and related functions + states that the last argument is filled with data if non-NULL. + + "knownhost if set to non-NULL, it must be a pointer to a 'struct + libssh2_knownhost' pointer that gets filled in to point to info about a + known host that matches or partially matches." + + In this function ext is dereferenced even if set to NULL, causing + segfault in applications not needing the extra data. + +Daniel Stenberg (11 Nov 2011) +- [Peter Krempa brought this change] + + knownhost_add: Avoid dereferencing uninitialized memory on error path. + + In function knownhost_add, memory is alocated for a new entry. If normal + alocation is used, memory is not initialized to 0 right after, but a + check is done to verify if correct key type is passed. This test is done + BEFORE setting the memory to null, and on the error path function + free_host() is called, that tries to dereference unititialized memory, + resulting into a glibc abort(). + + * knownhost.c - knownhost_add(): - move typemask check before alloc + +- windows build: add define to avoid compiler warning + + A recent mingw compiler has started to complain on "#warning Please + include winsock2.h before windows.h" unless the magic define is set + first. + + Reported by: Vincent Torri + Bug: http://www.libssh2.org/mail/libssh2-devel-archive-2011-10/0064.shtml + +Henrik Nordstrom (31 Oct 2011) +- [Vincent Torri brought this change] + + Correct Windows include file name case, simplifying cross-compilation + + When cross compiling to Windows, libssh2.h include Windows header files + with upper case filenames : BaseTsd.h and WinSock2.h. + + These files have lowercase names with mingw-w64 (iirc, it's the same with + mingw). And as on Windows, being lowercase or uppercase does not matter. + +Daniel Stenberg (25 Oct 2011) +- [Jernej Kovacic brought this change] + + libssh2_session_supported_algs: added + +- [Kamil Dudka brought this change] + + example/sftp_RW_nonblock: do not ignore LIBSSH2_ERROR_EAGAIN + + Bug: https://bugzilla.redhat.com/745420 + +Peter Stuge (5 Oct 2011) +- example/ssh2_agent: Print host key fingerprint before authentication + + Also moves the comment about not being authenticated to before the + agent authentication takes place, so that it better matches the code. + +Daniel Stenberg (29 Sep 2011) +- OpenSSL EVP: fix threaded use of structs + + Make sure we don't clear or reset static structs after first init so + that they work fine even when used from multiple threads. Init the + structs in the global init. + + Help and assistance by: John Engstrom + + Fixes #229 (again) + +- openssl: don't init static structs differently + + make_ctr_evp() is changed to take a struct pointer, and then each + _libssh2_EVP_aes_[keylen]_ctr function is made to pass in their own + static struct + + Reported by: John Engstrom + Fixes #229 + +Guenter Knauf (27 Sep 2011) +- Removed obsolete include path. + +Daniel Stenberg (21 Sep 2011) +- read_state: clear the state variable better + + Set read_state back to idle before trying to send anything so that if + the state somehow is wrongly set. + + Also, avoid such a case of confusion by resetting the read_state when an + sftp handle is closed. + +- sftp_read: remove leftover fprintf + + Reported by: Alexander Lamaison + +- sftp.h: fix the #ifdef to prevent multiple inclusions + +- sftp_read: use a state variable to avoid bad writes + + When a channel_write call has gotten an EAGAIN back, we try harder to + continue the same write in the subsequent invoke. + +- window_size: explicit adjustments only + + Removed the automatic window_size adjustments from + _libssh2_channel_read() and instead all channel readers must now make + sure to enlarge the window sizes properly themselves. + + libssh2_channel_read_ex() - the public function, now grows the window + size according to the requested buffer size. Applications can still opt + to grow the window more on demand. Larger windows tend to give higher + performance. + + sftp_read() now uses the read-ahead logic to figure out a window_size. + +- libssh2.h: bump the default window size to 256K + +- libssh2_userauth_keyboard_interactive.3: fix man warning + + It seemed to occur due to the excessive line length + +- [Mikhail Gusarov brought this change] + + Add missing .gitignore entries + +- [Mikhail Gusarov brought this change] + + Add manpage syntax checker to 'check' target + + In virtually every libssh2 release Debian's lintian catches syntax errors in + manpages. Prevent it by checking manpages as a part of testsuite. + +- libssh2_banner_set.3: fix nroff syntax mistake + +Guenter Knauf (10 Sep 2011) +- Use predefined resource compiler macro. + +- Added casts to silent compiler warnings. + +- Fixed uint64_t printf. + +- Fixed macro function signatures. + +- NetWare makefile tweaks. + +- Removed unused var. + +- Added 2 samples not mentioned. + +- Dont build x11 sample with MinGW. + +- Fixed executable file description. + +- Removed unused var. + +- Kill stupid gcc 3.x uninitialized warning. + +- Build all examples. + +- More MinGW makefile tweaks. + + Renamed *.mingw makefiles to GNUmakefile since GNU make picks these + up automatically, and therefore win32/Makefile removed. + +- Removed forgotten WINSOCK_VERSION defines. + +Daniel Stenberg (9 Sep 2011) +- libssh2_session_startup(3) => libssh2_session_handshake(3) + + Propagate for the current function in docs and examples. + libssh2_session_startup() is deprecated. + +- libssh2_banner_set => libssh2_session_banner_get + + Marked the old function as deprecated. Added the new name in the correct + name space with the same arguments and functionality. + +- new function: libssh2_session_banner_get + + Returns the banner from the server handshake + + Fixes #226 + +- libssh2.h: bump version to 1.4.0 for new function(s) + +- remove embedded CVS/svn tags + +- [liuzl brought this change] + + API add:libssh2_sftp_get_channel + + Return the channel of sftp, then caller can + control the channel's behavior. + + Signed-off-by: liuzl + +- _libssh2_channel_read: react on errors from receive_window_adjust + + Previously the function would ignore all errors except for EAGAIN. + +- sftp_read: extend and clarify the documentation + +- sftp_read: cap the read ahead maximum amount + + Now we only go up to LIBSSH2_CHANNEL_WINDOW_DEFAULT*30 bytes SFTP read + ahead, which currently equals 64K*30 == 1966080 bytes. + +- _libssh2_channel_read: fix non-blocking window adjusting + + If EAGAIN is returned when adjusting the receive window, we must not + read from the transport directly until we've finished the adjusting. + +Guenter Knauf (8 Sep 2011) +- Fix for systems which need sys/select.h. + +- The files were not gone but renamed ... + +Daniel Stenberg (6 Sep 2011) +- sftp_read: added documenting comment + + Taken from some recent email conversations I added some descriptions of + the logic in sftp_read() to aid readers. + +- 1.3.1: start the work + +Version 1.3.0 (6 Sep 2011) + +Daniel Stenberg (6 Sep 2011) +- Makefile.am: the Makefile.win32 files are gone + +- RELEASE-NOTES: updated for 1.3.0 + +- sftp_read: a short read is not end of file + + A returned READ packet that is short will now only reduce the + offset. + + This is a temporary fix as it is slightly better than the previous + approach but still not very good. + +- [liuzl brought this change] + + _libssh2_packet_add: adjust window size when truncating + + When receiving more data than what the window size allows on a + particular channel, make sure that the window size is adjusted in that + case too. Previously it would only adjust the window in the non-error + case. + +Guenter Knauf (29 Aug 2011) +- Silent compiler warning with MinGW64. + +- Fixed link to native Win32 awk tool. + +- Renamed MinGW makefiles. + +- Some MinGW makefile tweaks. + + Enable build without GNU tools and with MinGW64 compiler. + +- Fixed aes_ctr_do_cipher() signature. + +Daniel Stenberg (26 Aug 2011) +- [liuzl brought this change] + + libssh2_sftp_seek64: flush packetlist and buffered data + + When seeking to a new position, flush the packetlist and buffered data + to prevent already received or pending data to wrongly get used when + sftp-reading from the new offset within the file. + +- sftp_read: advance offset correctly for buffered copies + + In the case where a read packet has been received from the server, but + the entire contents couldn't be copied to the user-buffer, the data is + instead buffered and copied to the user's buffer in the next invocation + of sftp_read(). When that "extra" copy is made, the 'offset' pointer was + not advanced accordingly. + + The biggest impact of this flaw was that the 'already' variable at the + top of the function that figures out how much data "ahead" that has + already been asked for would slowly go more and more out of sync, which + could lead to the file not being read all the way to the end. + + This problem was most noticable in cases where the application would + only try to read the exact file size amount, like curl does. In the + examples libssh2 provides the sftp read function is most often called + with a fixed size large buffer and then the bug would not appear as + easily. + + This bug was introduced in the SFTP rewrite in 1.2.8. + + Bug: http://curl.haxx.se/mail/lib-2011-08/0305.html + http://www.libssh2.org/mail/libssh2-devel-archive-2011-08/0085.shtml + +- wrap some long lines < 80 columns + +- LIBSSH2_RECV: fix typo, use the RECV_FD macro + +- subsystem_netconf.c: fix compiler warnings + +- [Henrik Nordstrom brought this change] + + Custom callbacks for performing low level socket I/O + +- version bump: start working towards 1.3.0 + +Version 1.2.9 (16 Aug 2011) + +Daniel Stenberg (16 Aug 2011) +- RELEASE-NOTES: synced with 95d69d3a81261 + +- [Henrik Nordstrom brought this change] + + Document prototypes for macro defined functions + +- [Henrik Nordstrom brought this change] + + Avoid reuse after free when closing X11 channels + +- _libssh2_channel_write: handle window_size == 0 better + + When about to send data on the channel and the window size is 0, we must + not just return 0 if the transport_read() function returned EAGAIN as it + then causes a busy-loop. + + Bug: http://libssh2.org/mail/libssh2-devel-archive-2011-08/0011.shtml + +- gettimeofday: fix name space pollution + + For systems without its own gettimeofday() implementation, we still must + not provide one outside our namespace. + + Reported by: Bill Segall + +Dan Fandrich (5 Aug 2011) +- libssh2.pc.in: Fixed spelling in pkgconfig file + +Peter Stuge (17 Jul 2011) +- example/subsystem_netconf.c: Add missing #include + +- example/subsystem_netconf.c: Discard ]]>]]> and return only XML response + +- example/subsystem_netconf.c: Fix uninitialized variable bug + +- example: Add subsystem_netconf.c + + This example demonstrates how to use libssh2 to send a request to + the NETCONF subsystem available e.g. in JunOS. + + See also http://tools.ietf.org/html/draft-ietf-netconf-ssh-06 + +Daniel Stenberg (16 Jul 2011) +- man page cleanups: non-existing functions need no man pages + +- libssh2_new_host_entry.3: removed + + This is just junk leftovers. + +- userauth_keyboard_interactive: fix buffer overflow + + Partly reverse 566894494b4972ae12 which was simplifying the code far too + much and ended up overflowing a buffer within the LIBSSH2_SESSION + struct. Back to allocating the buffer properly like it used to do. + + Bug: http://www.libssh2.org/mail/libssh2-devel-archive-2011-06/0032.shtml + Reported by: Alfred Gebert + +- keyboard-interactive man page: cleaned up + +- [Alfred Gebert brought this change] + + _libssh2_recv(): handle ENOENT error as EAGAIN + + A sftp session failed with error "failure establishing ssh session" on + Solaris and HP-UX. Sometimes the first recv() function call sets errno + to ENOENT. In the man pages for recv of Solaris and HP-UX the error + ENOENT is not documented. + + I tested Solaris SPARC and x86, HP-UX i64, AIX, Windows and Linux. + +- agent_list_identities: fix out of scope access + + An auto variable out of scope was being referenced and used. + + fixes #220 + +- _libssh2_wait_socket: fix timeouts for poll() uses + +- windows: inclusion fix + + include winsock2.h for all windows compilers + +- keyb-interactive: add the fixed buffer + + Belongs to commit 5668944 + +- code cleanup: don't use C99/c++ comments + + We aim for C89 compliance + +- keyb-interactive: allow zero length fields + + Allow zero length fields so they don't cause malloc(0) calls + + Avoid free()ing NULL pointers + + Avoid a malloc of a fixed 5 byte buffer. + +- libssh2_channel_process_startup.3: clean up + + Remove the references to the macro-fied shortcuts as they have their own + individual man pages. + + Made the prototype different and more readable. + +- man page: fix .BR lines + + We don't use \fI etc on .BR lines + +- userauth_keyboard_interactive: skip code on zero length auth + +- libssh2_channel_forward_accept.3: mention how to get error + + Since this returns a pointer, libssh2_session_last_errno() must be used + to get the actual error code and it wasn't that clear before. + +- timeout docs: mention they're added in 1.2.9 + +- sftp_write_sliding.c: indent fix + + Use the standard indenting and removed CVS leftover comment + +- [zl liu brought this change] + + sftp_write_sliding: send the complete file + + When reaching the end of file there can still be data left not sent. + +- [Douglas Masterson brought this change] + + session_startup: init state properly + + libssh2_session_startup() didn't set the state correctly so it could get + confused. + + Fixes #218 + +- timeout: added man pages + +- BLOCK_ADJUST_ERRNO: move rc to right level + + We can't declare the variable within the block and use it in the final + do-while() expression to be properly portable C89. + +- [Matt Lilley brought this change] + + adds a timeout to blocking calls + + Fixes bug #160 as per Daniel's suggestion + + Adds libssh2_session_set_timeout() and libssh2_session_get_timeout() + +- SCP: fix incorrect error code + + After an error occurs in libssh2_scp_recv() or libssh2_scp_send(), the + function libssh2_session_last_error() would return + LIBSSH2_ERROR_SOCKET_NONE on error. + + Bug: http://trac.libssh2.org/ticket/216 + Patch by: "littlesavage" + + Fixes #216 + +Guenter Knauf (19 Apr 2011) +- Updated default (recommended) dependency versions. + +Daniel Stenberg (17 Apr 2011) +- libssh2_session_block_directions: fix mistake + + The last LIBSSH2_SESSION_BLOCK_INBOUND should be + LIBSSH2_SESSION_BLOCK_OUTBOUND + + And I shortened the short description + + Reported by: "drswinghead" + +- msvcproj: added libs and debug stuff + + Added libraries needed to link whether using openssl dynamically or + statically + + Added LIBSSH2DEBUG define to debug versions to enable tracing + + URL: http://trac.libssh2.org/ticket/215 + Patch by: Mark Smith + +- sftp_write: clean offsets on error + + When an error has occurred on FXP_WRITE, we must make sure that the + offset, sent offset and acked counter are reset properly. + +- example/.gitignore: ignore built binaries + +- sftp_write: flush the packetlist on error + + When an error occurs during write, flush the entire list of pending + outgoing SFTP packets. + +- keepalive: add first basic man pages + + Someone on IRC pointed out that we don't have these documented so I + wrote up a first set based on the information in the wiki: + http://trac.libssh2.org/wiki/KeepAlive + +- scp_write_nonblock.c: remove pointless check + + libssh2_channel_write() cannot return a value that is larger than the + input length value + +Mikhail Gusarov (9 Apr 2011) +- s/\.NF/.nf/ to fix wrong macro name caught by man --warnings + +Daniel Stenberg (6 Apr 2011) +- version: bump to 1.2.9_dev + + Also update the copyright year range to include 2011 + +- configure: fix $VERSION + + Stop using the $VERSION variable as it seems to be magically used by + autoconfig itself and thus gets set to the value set in AC_INIT() + without us wanting that. $LIBSSH2VER is now the libssh2 version as + detected. + + Reported by: Paul Howarth + Bug: http://www.libssh2.org/mail/libssh2-devel-archive-2011-04/0008.shtml + +- maketgz: use git2news.pl by the correct name + +Version 1.2.8 (4 Apr 2011) + +Daniel Stenberg (4 Apr 2011) +- RELEASE-NOTES: synced with fabf1a45ee + +- NEWS: auto-generated from git + + Starting now, the NEWS file is generated from git using the git2news.pl + script. This makes it always accurate and up-to-date, even for daily + snapshots etc. + +- sftp_write: handle FXP_WRITE errors + + When an sftp server returns an error back on write, make sure the + function bails out and returns the proper error. + +- configure: stop using the deprecated AM_INIT_AUTOMAKE syntax + +Alexander Lamaison (13 Mar 2011) +- Support unlimited number of host names in a single line of the known_hosts file. + + Previously the code assumed either a single host name or a hostname,ip-address pair. However, according to the spec [1], there can be any number of comma separated host names or IP addresses. + + [1] http://www.openbsd.org/cgi-bin/man.cgi?query=sshd&sektion=8 + +Daniel Stenberg (26 Feb 2011) +- libssh2_knownhost_readfile.3: clarify return value + + This function returns the number of parsed hosts on success, not just + zero as previously documented. + +Peter Stuge (26 Feb 2011) +- Don't save allocated packet size until it has actually been allocated + + The allocated packet size is internal state which needs to match reality + in order to avoid problems. This commit fixes #211. + +Daniel Stenberg (21 Feb 2011) +- [Alfred Gebert brought this change] + + session_startup: manage server data before server identification + + Fix the bug that libssh2 could not connect if the sftp server + sends data before sending the version string. + + http://tools.ietf.org/html/rfc4253#section-4.2 + + "The server MAY send other lines of data before sending the version + string. Each line SHOULD be terminated by a Carriage Return and Line + Feed. Such lines MUST NOT begin with "SSH-", and SHOULD be encoded + in ISO-10646 UTF-8 [RFC3629] (language is not specified). Clients + MUST be able to process such lines." + +- [Alfred Gebert brought this change] + + fullpacket: decompression only after init + + The buffer for the decompression (remote.comp_abstract) is initialised + in time when it is needed. With this fix decompression is disabled when + the buffer (remote.comp_abstract) is not initialised. + + Bug: http://trac.libssh2.org/ticket/200 + +- _libssh2_channel_read: store last error + + When the transport layer returns EAGAIN this function didn't call + _libssh2_error() which made the last_error not get set. -- edited +- sftp_write: clarified the comment header + +- sftp_read: avoid wrapping counter to insanity + + As pointed out in bug #206, if a second invoke of libssh2_sftp_read() + would shrink the buffer size, libssh2 would go nuts and send out read + requests like crazy. This was due to an unsigned variable turning + "negative" by some wrong math, and that value would be the amount of + data attempt to pre-buffer! + + Bug: http://trac.libssh2.org/ticket/206 + +- sftp_packet_read: use 32bit variables for 32bit data + +- libssh2_sftp_stat_ex.3: cleaned up, extended + + Removed the macros from it as they have their own man pages. + + Added the LIBSSH2_SFTP_ATTRIBUTES struct in here for easier reference. + +- sftp_readdir: return error if buffer is too small + + If asked to read data into a buffer and the buffer is too small to hold + the data, this function now returns an error instead of as previously + just copy as much as fits. + +- sftp_symlink: return error if receive buffer too small + + and clean up some variable type mismatches + + Discussion: http://www.libssh2.org/mail/libssh2-devel-archive-2011-01/0001.shtml + +- docs: clarify what happens with a too small buffer + + This flaw is subject to change, but I figured it might be valuable to + users of existing code to know how it works. + +- channel_request_pty_size: fix reqPTY_state + + The state variable isn't properly set so every other call to the + function fails! + + Bug: http://libssh2.org/mail/libssh2-devel-archive-2010-12/0096.shtml + Reported by: Steve Legg + +- data size: cleanup + + Fix 64bit warnings by using (s)size_t and dedicated uint32_t types more. + +- [Pierre Joye brought this change] + + ssize_t: proper typedef with MSVC compilers + + As discussed on the mailing list, it was wrong for win64 and using the + VC-provided type is the safest approach instead of second- guessing + which one it should be. + +Guenter Knauf (22 Dec 2010) +- Updated OpenSSL version. + +- Expanded tabs to spaces. + +Peter Stuge (21 Dec 2010) +- [Joey Degges brought this change] + + _libssh2_ntohu64: fix conversion from network bytes to uint64 + + Cast individual bytes to uint64 to avoid overflow in arithmetic. + +Daniel Stenberg (20 Dec 2010) +- libssh2_userauth_list: language fix + + "faily" is not a good English word, and I also cleaned up some other minor + mistakes + +- crypto: unify the generic functions + + Added crypto.h that is the unified header to include when using crypto + functionality. It should be the only header that needs to adapt to the + underlying crypto library in use. It provides the set of prototypes that + are library agnostic. + +- [Mark Smith brought this change] + + userauth: derive publickey from private + + Pass a NULL pointer for the publickey parameter of + libssh2_userauth_publickey_fromfile and + libssh2_userauth_hostbased_fromfile functions. In this case, the + functions recompute the public key from the private key file data. + + This is work done by Jean-Louis CHARTON + , then adapted by Mark Smith and + slightly edited further by me Daniel. + + WARNING: this does leave the feature NOT WORKING when libssh2 is built + to use libgcrypt instead of OpenSSL simply due to lack of + implementation. + +- ssh2_echo: Value stored to 'exitcode' is never read + +- _libssh2_packet_add: fix SSH_MSG_DEBUG weirdness + + I believe I may have caused this weird typo style error when I cleaned + up this function a while ago. Corrected now. + +- uint32: more longs converted to proper types + + I also moved the MAC struct over to the mac.h header file and made sure + that the users of that struct include that file. + +- SFTP: more types to uint32_t + + The 'num_names' field in the SSH_FXP_NAME response is an unsigned 32bit + value so we make sure to treat it like that. + +- SFTP: request_ids are uint32_t + + I went over the code and made sure we use uint32_t all over for the + request_id data. It is an unsigned 32bit value on the wire. + +- SFTP: store request_id separately in packets + + By using a new separate struct for incoming SFTP packets and not sharing + the generic packet struct, we can get rid of an unused field and add a + new one dedicated for holding the request_id for the incoming + package. As sftp_packet_ask() is called fairly often, a "mere" integer + comparison is MUCH faster than the previous memcmp() of (typically) 5 + bytes. + +- libssh2_sftp_open_ex: man page extended and cleaned up + + I added the missing documentation for the 'flags' argument. + +- SFTP: unify the READ/WRITE chunk structs + +- SFTP: fix memory leaks + + Make sure that we cleanup remainders when the handle is closed and when + the subsystem is shutdown. + + Existing flaw: if a single handle sends packets that haven't been + replied to yet at the time when the handle is closed, those packets will + arrive later and end up in the generic packet brigade queue and they + will remain in there until flushed. They will use unnecessary memory, + make things slower and they will ruin the SFTP handling if the + request_id counter ever wraps (highly unlikely to every happen). + +- sftp_close_handle: packet list is generic + + Fix comment, simplify the loop logic + +- sftp_read: pipeline reads + + The SFTP read function now does transfers the same way the SFTP write + function was made to recently: it creates a list of many outgoing + FXP_READ packets that each asks for a small data chunk. The code then + tries to keep sending read request while collecting the acks for the + previous requests and returns the received data. + +- sftp_write: removed unused variable + +- _libssh2_channel_close: don't call transport read if disconnected + + The loop that waits for remote.close to get set may end up looping + forever since session->socket_state gets set to + LIBSSH2_SOCKET_DISCONNECTED by the packet_add() function called from the + transport_read() function and after having been set to + LIBSSH2_SOCKET_DISCONNECTED, the transport_read() function will only + return 0. + + Bug: http://trac.libssh2.org/ticket/198 + +- libssh2_sftp_seek64: new man page + + Split off libssh2_sftp_seek64 from the libssh2_sftp_seek man page, and + mentioned that we consider the latter deprecated. Also added a mention + about the dangers of doing seek during writing or reading. + +- sftp_seek: fix + + The new SFTP write code caused a regression as the seek function no + longer worked as it didn't set the write position properly. + + It should be noted that seeking is STRONGLY PROHIBITED during upload, as + the upload magic uses two different offset positions and the multiple + outstanding packets etc make them sensitive to change in the midst of + operations. + + This functionality was just verified with the new example code + sftp_append. This bug was filed as bug #202: + + Bug: http://trac.libssh2.org/ticket/202 + +- sftp_append: new example doing SFTP append + +- MAX_SFTP_OUTGOING_SIZE: 30000 + + I ran SFTP upload tests against localhost. It showed that to make the + app reach really good speeds, I needed to do a little code tweak and + change MAX_SFTP_OUTGOING_SIZE from 4000 to 30000. The tests I did before + with the high latency tests didn't show any real difference whatever I + had that size set to. + + This number is the size in bytes that libssh2 cuts off the large input + buffer and sends off as an individual sftp packet. + +- sftp_write_sliding.c: new example + + This is an example that is very similar to sftp_write_nonblock.c, with + the exception that this uses + + 1 - a larger upload buffer + + 2 - a sliding buffer mechnism to allow the app to keep sending lots of + data to libssh2 without having to first drain the buffer. + + These are two key issues to make libssh2 SFTP uploads really perform + well at this point in time. + +- cpp: s/#elsif/#elif + + This looks like a typo as #elsif is not really C... -- libssh2_poll() and libssh2_poll_channel_read() are now considered and - documented deprecated and they will be removed at next soname bump. It also - saves us from fixing some rather quirky bugs in libssh2_poll()... +- _libssh2_channel_write: revert channel_write() use + + The attempts made to have _libssh2_channel_write() accept larger pieces + of data and split up the data by itself into 32700 byte chunks and pass + them on to channel_write() in a loop as a way to do faster operations on + larger data blocks was a failed attempt. + + The reason why it is difficult: + + The API only allows EAGAIN or a length to be returned. When looping over + multiple blocks to get sent, one block can get sent and the next might + not. And yet: when transport_send() has returned EAGAIN we must not call + it again with new data until it has returned OK on the existing data it + is still working on. This makes it a mess and we do get a much easier + job by simply returning the bytes or EAGAIN at once, as in the EAGAIN + case we can assume that we will be called with the same arguments again + and transport_send() will be happy. + + Unfortunately, I think we take a small performance hit by not being able + to do this. -Guenter Knauf (9 Apr 2009) -- some minor Makefile tweaks; mainly for crosscompiling. +- ssh2_echo: new example + + This is a new example snippet. The code is largely based on ssh2_exec, + and is written by Tommy Lindgren. I edited it into C90 compliance and to + conform to libssh2 indent style and some more. -Daniel Stenberg (6 Apr 2009) -- Jussi Mononen pointed out we used an unsigned variable to store negative - values in, when a plain int is much better anyway since it matches the return - type. +- send_existing: return after send_existing + + When a piece of data is sent from the send_existing() function we must + make the parent function return afterwards. Otherwise we risk that the + parent function tries to send more data and ends up getting an EGAIN for + that more data and since it can only return one return code it doesn't + return info for the successfully sent data. + + As this change is a regression I now added a larger comment explaining + why it has to work like this. -- and we're now on the 1.1.1 track +- _libssh2_channel_write: count resent data as written + + In the logic that resends data that was kept for that purpose due to a + previous EAGAIN, the data was not counted as sent causing badness. -- release 1.1 +Peter Stuge (13 Nov 2010) +- Use fprintf(stderr, ) instead of write(2, ) for debugging -- Sofian Brabez removed duplicate calls to libssh2_session_set_blocking() +- session/transport: Correctly handle when _libssh2_send() returns -EAGAIN -- Uh, it is important that we don't set the local state 'local.close' to TRUE - until _after_ we're done as otherwise we might not get called again properly - to clean the entire thing since the close state is checked in - libssh2_channel_free +- src/agent.c: Simplify _libssh2_send() error checking ever so slightly -- Removed the trace output that said "May block until packet of type..." since - it simply wasn't true for non-blocking operations. +Daniel Stenberg (12 Nov 2010) +- send/recv: use _libssh2_recv and _libssh2_send now + + Starting now, we unconditionally use the internal replacement functions + for send() and recv() - creatively named _libssh2_recv() and + _libssh2_send(). + + On errors, these functions return the negative 'errno' value instead of + the traditional -1. This design allows systems that have no "natural" + errno support to not have to invent it. It also means that no code + outside of these two transfer functions should use the errno variable. -- made sure the SFTP code makes more use of internal non-blocking functions - instead of the external API entries +- channel_write: move some logic to _libssh2_channel_write + + Some checks are better done in _libssh2_channel_write just once per + write instead of in channel_write() since the looping will call the + latter function multiple times per _libssh2_channel_write() invoke. -- Fixed the memory leak in in libssh2_userauth_hostbased_fromfile_ex() that - Jean-Louis Charton found. Additional minor indent and comment edits. +- sftp_write: handle "left over" acked data + + The SFTP handle struct now buffers number of acked bytes that haven't + yet been returned. The way this is used is as following: + + 1. sftp_write() gets called with a buffer of let say size 32000. We + split 32000 into 8 smaller packets and send them off one by one. One of + them gets acked before the function returns so 4000 is returned. + + 2. sftp_write() gets called again a short while after the previous one, + now with a much smaller size passed in to the function. Lets say 8000. + In the mean-time, all of the remaining packets from the previous call + have been acked (7*4000 = 28000). This function then returns 8000 as all + data passed in are already sent and it can't return any more than what + it got passed in. But we have 28000 bytes acked. We now store the + remaining 20000 in the handle->u.file.acked struct field to add up in + the next call. + + 3. sftp_write() gets called again, and now there's a backlogged 20000 + bytes to return as fine and that will get skipped from the beginning + of the buffer that is passed in. -- indent changes and removed libssh2_ prefix from static function +- sftp_write: polished and simplified + + Removed unnecessary struct fields and state changes within the function. + + Made the loop that checks for ACKs only check chunks that were fully + sent. -Yang Tse (28 Mar 2009) -- include libssh2_priv.h instead of libssh2.h in order to get - LIBSSH2_API properly defined on LIBSSH2_WIN32 build targets +- SCP: on failure, show the numerical error reason + + By calling libssh2_session_last_errno() -Daniel Stenberg (27 Mar 2009) -- Additional non-blocking fixes. +- SFTP: provide the numerical error reason on failure -- Me and my long fingers couldn't resist "merging" these statements in a previous - commit but of course that broke functionality and this is a revert of that - change. +- SCP: clean up failure treatment + + When SCP send or recv fails, it gets a special message from the server + with a warning or error message included. We have no current API to + expose that message but the foundation is there. Removed unnecessary use + of session struct fields. -- Dump to stderr simply because the other tracing functions in misc.c already - use stderr and mixing output "channels" causes too much confusion for me! +- sftp_write: enlarge buffer to perform better -- fixed sftp_shutdown() for the blockiness and fixed libssh2_channel_close() - to work properly non-blocking +- packets: code cleanup + + I added size checks in several places. I fixed the code flow to be easier + to read in some places. + + I removed unnecessary zeroing of structs. I removed unused struct fields. -- Fixed the order of the check in the BLOCK_ADJUST() macro so that it also works - for libssh2_session_free() +- LIBSSH2_CALLBACK_MACERROR: clarify return code use -- kill warnings +- _libssh2_userauth_publickey: avoid shadowing -- Fix the BLOCK_ADJUST_ERRNO() macro to behave properly in blocking mode. +- packet: avoid shadowing global symbols -Simon Josefsson (27 Mar 2009) -- Add AC_CONFIG_MACRO_DIR to avoid warnings with libtool v2.2.x. +- sftp_readdir: avoid shadowing -Daniel Stenberg (27 Mar 2009) -- fix comments, moved to htonu64 function to sftp.c and made it static +- shadowing: don't shadow the global compress -- More cleaning up converting libssh2_ to _libssh2_ for internal functions and - removing libssh2_ from static functions. Added mac.h. +- _libssh2_packet_add: turn ifs into a single switch -- comp.c only as a single _libssh2_ function, no external one +- _libssh2_packet_add: check SSH_MSG_GLOBAL_REQUEST packet -- * Renamed the functions in src/transport.c to be _libssh2_transport_ prefixed - and introduced a transport.h header. +- _libssh2_packet_add: SSH_MSG_DEBUG length checks - * Fixed the blocking mode to only change behavior not the actual underlying - socket mode so we now always work with non-blocking sockets. This also - introduces a new rule of thumb in libssh2 code: we don't call the - external function calls internally. We use the internal (non-blocking) - ones! + Verify lengths before using them. Read always_display from the correct + index. Don't copy stuff around just to provide zero-termination of the + strings. + +- _libssh2_packet_add: SSH_MSG_IGNORE skip memmove - * libssh2_channel_receive_window_adjust2 was added and - libssh2_channel_receive_window_adjust is now deprecated + There's no promise of a zero termination of the data in the callback so + no longer perform ugly operation in order to provide it. + +- _libssh2_packet_add: SSH_MSG_DISCONNECT length checks - * Introduced "local" header files with prototypes etc for different parts - instead of cramming everything into libssh2_priv.h. channel.h is the - first. + Verify lengths before trying to read data. -- avoid some busy-looping +- indent: break lines at 80 columns -- one function to remove, one proto to correct +- SSH_MSG_CHANNEL_OPEN_FAILURE: used defined values + + We don't like magic numbers in the code. Now the acceptable failure + codes sent in the SSH_MSG_CHANNEL_OPEN_FAILURE message are added as + defined values in the private header file. -- Updated comments and removed "libssh2_" prefixes from static functions +- sftp_write: don't return EAGAIN if no EAGAIN was received + + This function now only returns EAGAIN if a lower layer actually returned + EAGAIN to it. If nothing was acked and no EAGAIN was received, it will + now instead return 0. -- added basic docs +- _libssh2_wait_socket: detect nothing-to-wait-for + + If _libssh2_wait_socket() gets called but there's no direction set to + wait for, this causes a "hang". This code now detects this situation, + set a 1 second timeout instead and outputs a debug output about it. -- quite possibly one of the most pointless functions in the libssh2 API...a +- decomp: remove the free_dest argument + + Since the decompress function ALWAYS returns allocated memory we get a + lot simpler code by removing the ability to return data unallocated. -- ENOTCONN obviously doesn't exist in win32 so don't try to map that +- decomp: cleaned off old compression stuff + + I cleared off legacy code from when the compression and decompression + functions were a single unified function. Makes the code easier to read + too. -- [no comment] +- [TJ Saunders brought this change] -- EEK revert the part of the previous commit that was just my non-functional - attempts to make things work with blocking sockets. + decomp: increase decompression buffer sizes -- I cut out the poll_socket argument from the protos for_libssh2_packet_askv() - and _libssh2_packet_ask() since they are internal and nothing in the code base - uses that functionality == simplicity with no drawbacks! +- [TJ Saunders brought this change] -- pass in unsigned ints for u32 values and not longs + zlib: Add debug tracing of zlib errors -- - (Mar 19 2009) Daniel Stenberg: based on a patch by "E L" we now use errno - properly after recv() and send() calls (that internally are now known as - _libssh2_recv() and _libssh2_send()) so that the API and more works fine on - windows too! +- sftp_packet_read: handle partial reads of the length field + + SFTP packets come as [32 bit length][payload] and the code didn't + previously handle that the initial 32 bit field was read only partially + when it was read. -- I'm upgrading myself! +- [Jasmeet Bagga brought this change] -Simon Josefsson (17 Mar 2009) -- Add StrictModes=no to work around cygwin problem. - Reported by Yang Tse . + kex_agree_hostkey: fix NULL pointer derefence + + While setting up the session, ssh tries to determine the type of + encryption method it can use for the session. This requires looking at + the keys offered by the remote host and comparing these with the methods + supported by libssh2 (rsa & dss). To do this there is an iteration over + the array containing the methods supported by libssh2. + + If there is no agreement on the type of encryption we come to the 3rd + entry of the hostkeyp array. Here hostkeyp is valid but *hostkep is + NULL. Thus when we dereference that in (*hostkeyp)->name there is a + crash -- Add UsePrivilegeSeparation=no for cygwin. - Reported by Yang Tse +- _libssh2_transport_send: remove dead assignment + + 'data' isn't accessed beyond this point so there's no need to assign it. -Daniel Stenberg (17 Mar 2009) -- re-indented for clarity +- scp_recv: remove dead assignment + + Instead of assigning a variable we won't read, we now use the more + explicit (void) prefix. -- re-indented _libssh2_channel_packet_data_len() somewhat to make the huge - condition somewhat easier on the eye +- sftp_write: removed superfluous assignment -- A cleanup effort: libssh2_ prefixes only on external APIs. Use _libssh2_ prefix - for library-wide internal functions. Don't use any of those on static functions. - I also did some comments and whitespace changes. +- bugfix: avoid use of uninitialized value -- bump packet default size to 32768 +- sftp_packet_require: propagate error codes better + + There were some chances that they would cause -1 to get returned by + public functions and as we're hunting down all such occurances and since + the underlying functions do return valuable information the code now + passes back proper return codes better. -- Refer to the exact symbol name, which also is the exact file name of the man - page file. +- [Alfred Gebert brought this change] -Simon Josefsson (17 Mar 2009) -- Use libtool -export-symbols-regex to reduce numer of exported symbols. + fix memory leaks (two times cipher_data) for each sftp session -Daniel Stenberg (16 Mar 2009) -- cleanup round +- libssh2_userauth_authenticated: make it work as documented + + The man page clearly says it returns 1 for "already authenticated" but + the code said non-zero. I changed the code to use 1 now, as that is also + non-zero but it gets the benefit that it now matches the documentation. + + Using 1 instead of non-zero is better for two reasons: + + 1. We have the opportunity to introduce other return codes in the future for + things like error and what not. + 2. We don't expose the internal bitmask variable value. -- Added (templates for) the 13 missing man pages +- userauth_keyboard_interactive: fix indent -- two more renaming of man pages to the actual function name +- [Alfred Gebert brought this change] -- rename the man page to use the same name as the actual function + fix memory leak in userauth_keyboard_interactive() + + First I wanted to free the memory in session_free() but then + I had still memory leaks because in my test case the function + userauth_keyboard_interactive() is called twice. It is called + twice perhaps because the server has this authentication + methods available: publickey,gssapi-with-mic,keyboard-interactive + The keyboard-interactive method is successful. -- mention the basic changes in my previous few commits +- dist: include sftp.h in dist archives -- Patch from bug report #1960894 by "Heiner" applied, and edited by me. It makes - SCP recv and send deal with file names containing spaces (and other - shell-special letters) by quoting them before they are passed to the remote - server. +Simon Josefsson (27 Oct 2010) +- Update header to match new function prototype, see c48840ba88. -- fixed some wrong comments and did a minor code edit and some further - whitespace changes +Daniel Stenberg (26 Oct 2010) +- bugfixes: the transport rearrange left some subtle flaws now gone -- added three more public functions I found lacking man pages +- libssh2_userauth_publickey_fromfile_ex.3: cleaned up looks -- fix a compiler warning +- libssh2_userauth_publickey: add man page + + I found an undocumented public function and we can't have it like + that. The description here is incomplete, but should serve as a template + to allow filling in... -- simplified how the "scp" command line is created in the libssh2_scp_recv() - function +- libssh2_sftp_write.3: added blurb about the "write ahead" + + Documented the new SFTP write concept -- Simplified libssh2_channel_read_ex() and made it send window adjustments less - frequent, use a few less struct fields in the channel struct and improved - reading from the network with libssh2_packet_read(). I also modified the - windowing algorithm and now use a much larger window. This greatly enhances - SSH/SCP performance. I also increased the size of the buffer the transport - layer uses from 4k to 16K. +- sftp_close_handle: free any trailing write chunks -- oops, use %06d for the microseconds! +- _libssh2_channel_write: fix warnings -- re-indented and other whitespace edits +- SFTP: bufgix, move more sftp stuff to sftp.h + + The sftp_write function shouldn't assume that the buffer pointer will be + the same in subsequent calls, even if it assumes that the data already + passed in before haven't changed. + + The sftp structs are now moved to sftp.h (which I forgot to add before) -- improved trace logs with time stamps +- SFTP: use multiple outgoing packets when writing + + sftp_write was rewritten to split up outgoing data into multiple packets + and deal with the acks in a more asynchronous manner. This is meant to + help overcome latency and round-trip problems with the SFTP protocol. -- fixed to work quite similar to the sftp_nonblock example so that it waits - for the socket correctly and measures the transfer speed fine +- TODO: implemented a lot of the ideas now -- Cleanups, that do seem to have boosted SFTP download performance up to 300% in - some tests: - - * cut off "_ex" from several internal function names - - * corrected some log outputs +- _libssh2_channel_write: removed 32500 size limit - * simplified libssh2_channel_read_ex() and made it much faster in the process + Neither _libssh2_channel_write nor sftp_write now have the 32500 size + limit anymore and instead the channel writing function now has its own + logic to send data in multiple calls until everything is sent. + +- send_existing: don't tell parent to return when drained - * cut out {{{ and }}} comments that were incorrect anyway + That will just cause unnecessary code execution. + +- _libssh2_channel_write: general code cleanup - * fixed sftp_packet_ask() to return the correct packet by using memcmp() and - not strncmp() + simplified the function and removed some unused struct fields + +- _libssh2_transport_send: replaces _libssh2_transport_write - * fixed mkdir()'s wait for packet to use the correct request_id - it - semi-worked previously because strncmp() in sftp_packet_ask() made it - match far too easily. + The new function takes two data areas, combines them and sends them as a + single SSH packet. This allows several functions to allocate and copy + less data. - * took away the polling functionality from sftp_packet_ask() since it wasn't - used - -- improved non-blocking behavior for some of the initing stuff before the actual - data transfer begins - -- wait for socket action accordingly, and do some measurements on the transfer - to make this better to use for speed tests - -- - (Mar 7 2009) Olivier Hervieu pointed out a flaw in the - libssh2_channel_x11_req_ex() function that made it produce a crappy random - chunk of data. Peter Stuge improved the fix to not do out-of-boundary - writes. I (Daniel Stenberg) replaced the snprintf() with a plain sprintf() - since the size argument wasn't adding anything anyway. + I also found and fixed a mixed up use of the compression function + arguments that I introduced in my rewrite in a recent commit. -Guenter Knauf (6 Mar 2009) -- some minor Makefile tweaks. +- scp_write_nonblock: use select() instead of busyloop + + Make this example nicer by not busylooping. -Daniel Stenberg (23 Feb 2009) -- - Added libssh2_version() +- send_existing: clear olen when the data is sent off -- - (Feb 20 2009) libssh2_channel_direct_tcpip_ex() bug #1902169 fixed, which - caused it to fail when called a second time. +- _libssh2_transport_write: allow 256 extra bytes around the packet -Mikhail Gusarov (17 Feb 2009) -- Fixed dash-as-minus warning in libssh2_base64_decode.3 manpage +- _libssh2_transport_write: remade to send without malloc -- Fixed syntax error in libssh2_banner_set.3 manpage +- compress: compression disabled by default + + We now allow libssh2_session_flag() to enable compression with a new + flag and I added documentation for the previous LIBSSH2_FLAG_SIGPIPE + flag which I wasn't really aware of! -Simon Josefsson (16 Feb 2009) -- Bump ABI revision from 1.0.0 to 1.0.1 due to code changes. +- comp: split the compress function + + It is now made into two separate compress and decompress functions. In + preparation for upcoming further modficications. -- Fix typo. +Dan Fandrich (20 Oct 2010) +- Added header file to allow compiling in older environments -- Add date for v1.0 release. +Daniel Stenberg (20 Oct 2010) +- TODO: add a possible new API for SFTP transfers -Daniel Stenberg (12 Feb 2009) -- - (Feb 12 2009) Romain Bondue extended Markus Moeller fix from Feb 8, based on - a previous (uncommitted) patch by Erik Brossler. It improves - libssh2_channel_write_ex in blocking situations when the socket is set non- - blocking. +- TODO: "New Transport API" added -- Markus Moeller fixed a flaw in libssh2_channel_write_ex() that would occur - on EAGAIN situations. +- TODO: add buffering plans -- I want to remove all those macros from the official API at next soname bump +Simon Josefsson (13 Oct 2010) +- Mention libssh2_channel_get_exit_signal and give kudos. -- fixed compiler warnings, and stripped off "libssh2_" from static functions - as that makes shorter function names and then making the code look fine within - 80 columns is easier! +- [Tommy Lindgren brought this change] -- made the three public headers use (mostly) lines shorter than 80 columns as - HACKING says - it makes them much more readable to my old tired eyes... + Add libssh2_channel_get_exit_signal man page. + + Signed-off-by: Simon Josefsson -- we're actually working on the 1.0.1 version now (or should it be 1.1?) +- [Tommy Lindgren brought this change] -- Added 'TODO' file (again) with some fresh things I could think of right now + Add libssh2_channel_get_exit_signal. + + Signed-off-by: Simon Josefsson -- Added libssh2_trace man page +- Add libssh2_free man page and fix typo. -- libssh2_base64_decode is deprecated and subject for removal in a future - version (like on the next soname bump) +- Add libssh2_free. -- wrote up a first libssh2_base64_decode man page, added a few missing man - pages to the tarball +Daniel Stenberg (11 Oct 2010) +- scp_recv: improved treatment of channel_read() returning zero + + As a zero return code from channel_read() is not an error we must make + sure that the SCP functions deal with that properly. channel_read() + always returns 0 if the channel is EOFed already so we check for EOF + after 0-reads to be able to return error properly. -- based on Heiner Steven's report, fix the name and description of these man - pages! +- libssh2_session_methods.3: detail what can be asked for -- briefly mention my recent sftp-related fixes +- compression: send zlib before none + + As the list of algorithms in a preferred order we should send zlib + before none to increase the chances that the server will let us do + compression. -- mention web site and mailing list, as I think they're not mentioned anywhere - else in the package! +- compress: faster check, better return codes + + In the transport functions we avoid a strcmp() now and just check a + boolean instead. + + The compress/decompress function's return code is now acknowledged and + used as actual return code in case of failures. -- removed obviously superfluous comments +- libssh2_session_handshake: replaces libssh2_session_startup() + + The function libssh2_session_startup() is now considered deprecated due + to the portability issue with the socket argument. + libssh2_session_handshake() is the name of the replacement. -- use a single >>32 instead of "(value / 65536) / 65536", just make sure that - the shift is done on a 64bit type +- libssh2_socket_t: now externally visible + + In preparation for upcominig changes, the libssh2_socket_t type is now + typedef'ed in the public header. -- remove unused #ifndef, and two whitespace changes +- _libssh2_transport_drain: removed + + This function proved not to be used nor useful. -- style/indent changes only to enforce < 80 column lines more strict +- _libssh2_channel_write: don't iterate over transport writes + + When a call to _libssh2_transport_write() succeeds, we must return from + _libssh2_channel_write() to allow the caller to provide the next chunk + of data. + + We cannot move on to send the next piece of data that may already have + been provided in this same function call, as we risk getting EAGAIN for + that and we can't return information both about sent data as well as + EAGAIN. So, by returning short now, the caller will call this function + again with new data to send. -- libssh2_sftp_seek64() it is now for the 64bit seek function too as the seek2 - name has never been used in a release and it makes the naming consistent +- _libssh2_transport_write: updated documentation blurb -- 0.19 is now 1.0 +- _libssh2_transport_write: remove fprintf remainder + + Mistake from previous debugging -- Based on Alexander Lamaison's patch, there's now a new - function called libssh2_sftp_tell64() that returns the 64 bit file offset, - as the existing libssh2_sftp_tell() only returns a size_t. +- session: improved errors + + Replaced -1/SOCKET_NONE errors with appropriate error defines instead. + + Made the verbose trace output during banner receiving less annoying for + non-blocking sessions. -- first conversion of a malloc => buffer in the sftp handle struct +- crypt_init: use correct error define -- helper script for emacs users to get the code style done libssh2-style - automatically +- _libssh2_error: hide EAGAIN for non-blocking sessions + + In an attempt to make the trace output less cluttered for non-blocking + sessions the error function now avoids calling the debug function if the + error is the EAGAIN and the session is non-blocking. -- - Markus Moeller fixed the issue also reported by Alexander Lamaison which - caused SFTP reads with large buffers to fail. +- agent: use better error defines -Simon Josefsson (17 Dec 2008) -- Sshd is slow to start on some systems. +- comp_method_zlib_init: use correct error defines -Daniel Stenberg (17 Dec 2008) -- Avoid one malloc by putting the entire handle buffer in the handle struct - at once, use a define for the maximum size length of the handle instead of - '256' in the code. +- transport: better error codes + + LIBSSH2_SOCKET_NONE (-1) should no longer be used as error code as it is + (too) generic and we should instead use specific and dedicated error + codes to better describe the error. -- removed some more libssh2_ prefixes from private functions +- channel: return code and _libssh2_error cleanup - Made the libssh2_sftp_open_ex() deal with servers that first responds with - STATUS OK and then sends the actual HANDLE. It seems openssh does this at - times and it screwed things up. To me it seems like a spec violation... + Made sure that all transport_write() call failures get _libssh2_error + called. -- removed unused code, intended the code somewhat +- _libssh2_channel_write: limit to 32700 bytes + + The well known and used ssh server Dropbear has a maximum SSH packet + length at 32768 by default. Since the libssh2 design current have a + fixed one-to-one mapping from channel_write() to the packet size created + by transport_write() the previous limit of 32768 in the channel layer + caused the transport layer to create larger packets than 32768 at times + which Dropbear rejected forcibly (by closing the connection). + + The long term fix is of course to remove the hard relation between the + outgoing SSH packet size and what the input length argument is in the + transport_write() function call. -- Nothing used libssh2_sftp_packet_read's flush argument anymore so I removed - it and simplified the code somewhat thanks to that. I then renamed the function - to sftp_packet_read() only since it is private in this file anyway. +- libssh.h: add more dedicated error codes -- renamed libssh2_sftp_packet_requirev to plain sftp_packet_requirev since it - is private in this file only and a shorter name is nicer +- SCP: allow file names with bytes > 126 + + When parsing the SCP protocol and verifying that the data looks like a + valid file name, byte values over 126 must not be consider illegal since + UTF-8 file names will use such codes. - Removed a "flush" of the data in sftp_packet_requirev() that now seems to have - made SFTP operations a lot more reliable. It didn't make much sense to have it - there but if someone can present a reason for one I figure we should carefully - investigate one and only do it conditionally where/when needed. + Reported by: Uli Zappe + Bug: http://www.libssh2.org/mail/libssh2-devel-archive-2010-08/0112.shtml -- Clarify that this is only fine to use after an actual SFTP protocol error - return code. +Dan Fandrich (25 Aug 2010) +- Document the three sftp stat constants -Simon Josefsson (27 Nov 2008) -- Support EXEEXT in self-test. +Guenter Knauf (18 Aug 2010) +- Fixed Win32 makefile which was now broken at resource build. -- Cygwin needs -lcrypto for -lssl. - Reported by "Yang Tse" . +- It is sufficient to pipe stderr to NUL to get rid of the nasty messages. -Daniel Stenberg (27 Nov 2008) -- oops, add missing file +- [Author: Guenter Knauf brought this change] -Yang Tse (26 Nov 2008) -- fix again cygwin build failure unreleased regression + Removed Win32 ifdef completely for sys/uio.h. + + No idea why we had this ifdef at all but MSVC, MingW32, Watcom + and Borland all have no sys/uio.h header; so if there's another + Win32 compiler which needs it then it should be added explicitely + instead of this negative list. -Dan Fandrich (25 Nov 2008) -- Fixed a potential use of an uninitialized variable, the result of which lead - to an unneeded but harmless realloc. - Reduced the scope of some automatic variables. +- New files should also be added to Makefile.am. + + Otherwise they will never be included with release and snapshot tarballs ... -- Fixed some typos in log messages +Daniel Stenberg (18 Aug 2010) +- version: bump to 1.2.8_DEV -Daniel Stenberg (24 Nov 2008) -- - Vlad Grachov brought the new function called - libssh2_session_block_directions() which returns a bitmask for what - directions the connection blocks. It is to be used applications that use - non-blocking sockets and when a libssh2 function returns - LIBSSH2_ERROR_EAGAIN this function can be used to figure out in which - direction the socket would block and thus it can wait for the socket to - again be ready for communication in that direction before it calls libssh2 - again. +Version 1.2.7 (17 Aug 2010) -Simon Josefsson (21 Nov 2008) -- Add a more realistic self-test of libssh2. +Daniel Stenberg (17 Aug 2010) +- release: updated to hold 1.2.7 info -- Ignore coverage/. +Guenter Knauf (17 Aug 2010) +- Use the new libssh2.rc file. -- Add rules to generate a code coverage report. +- Added resource file for libssh2.dll (shamelessly stolen from libcurl). -- Use AM_CPPFLAGS instead of deprecated INCLUDES. +- Updated Win32 MSVC dependencies versions. -- Add self-test of base64 decode. +- Added include for sys/select.h to get fd.set on some platforms. -- Add gcov files. +- Added Watcom makefile borrowed from libcurl. + + This makefile compiles already all files fine for static lib, but needs + final touch when I have OpenSSL fully working with shared libs and Watcom. -Dan Fandrich (21 Nov 2008) -- Use only C89-style comments +- Added copyright define to libssh2.h and use it for binary builds. -- Check LIBSSH2_HMAC_RIPEMD consistently +- Moved version defines up in order to include from .rc file. + + Blocked rest of header with ifndef so its possible to let + the rc compiler only use the version defines. -Simon Josefsson (20 Nov 2008) -- Fix compiler warnings. +- Some minor makefile tweaks. -- Move pem.c to libgcrypt section, it is not needed for OpenSSL. +Daniel Stenberg (2 Aug 2010) +- example: treat the libssh2_channel_read() return code properly + + A short read is not an error. Only negative values are errors! -- Drop pkg-config test, not needed now. +- libssh2_wait_socket: reset error code to "leak" EAGAIN less + + Since libssh2 often sets LIBSSH2_ERROR_EAGAIN internally before + _libssh2_wait_socket is called, we can decrease some amount of + confusion in user programs by resetting the error code in this function + to reduce the risk of EAGAIN being stored as error when a blocking + function returns. -- Rewrite OpenSSL+libz detection logic. +- _libssh2_wait_socket: poll needs milliseconds + + As reported on the mailing list, the code path using poll() should + multiple seconds with 1000 to get milliseconds, not divide! + + Reported by: Jan Van Boghout -- Add more. +- typedef: make ssize_t get typedef without LIBSSH2_WIN32 + + The condition around the ssize_t typedef depended on both LIBSSH2_WIN32 + *and* _MSC_VER being defined when it should be enough to depend on + _MSC_VER only. It also makes it nicer so libssh2-using code builds fine + without having custom defines. -Daniel Stenberg (11 Nov 2008) -- fix the include path to also point out the build dir's src/ dir for the cases - where we build the lot outside of the source dir +- [John Little brought this change] -- avoid duplicate function declarations on windows + session_free: free more data to avoid memory leaks -- WINSOCK_VERSION is no longer used (Richard W.M. Jones fixed) +- channel_free: ignore problems with channel_close() + + As was pointed out in bug #182, we must not return failure from + _libssh2_channel_free() when _libssh2_channel_close() returns an error + that isn't EAGAIN. It can effectively cause the function to never go + through, like it did now in the case where the socket was actually + closed but socket_state still said LIBSSH2_SOCKET_CONNECTED. + + I consider this fix the right thing as it now also survives other + errors, even if making sure socket_state isn't lying is also a good + idea. -- Richard W.M. Jones' 5 patches that enables libssh2 to get cross-compiled with - mingw +- publickey_list_free: no return value from a void function + + Fixed a compiler warning I introduced previously when checking input + arguments more. I also added a check for the other pointer to avoid NULL + pointer dereferences. -Paul Thomas (9 Nov 2008) -- Fixes a problem that the last code change apparently didn't fix. Verified - that this works correctly with another user. +- [Lars Nordin brought this change] -- Fixed an issue with a patch that I submitted where the channel_read_ex() - could get stuck in a busy read loop. + openssl: make use of the EVP interface + + Make use of the EVP interface for the AES-funktion. Using this method + supports the use of different ENGINES in OpenSSL for the AES function + (and the direct call to the AES_encrypt should not be used according to + openssl.org) -Yang Tse (25 Oct 2008) -- fix cygwin build failure unreleased regression +Peter Stuge (23 Jun 2010) +- [Tor Arntsen brought this change] -Paul Thomas (3 Oct 2008) -- Reformatted the code, updated line endings to match original file, - fixed the build problem, removed tabs and replaced with spaces - and removed C89 unfriendly comments. + Don't overflow MD5 server hostkey + + Use SHA_DIGEST_LENGTH and MD5_DIGEST_LENGTH in memcpy instead of hardcoded + values. An incorrect value was used for MD5. -Daniel Stenberg (2 Oct 2008) -- mention libssh2_channel_request_pty_size_ex() +- Fix message length bugs in libssh2_debug() + + There was a buffer overflow waiting to happen when a debug message was + longer than 1536 bytes. + + Thanks to Daniel who spotted that there was a problem with the message + length passed to a trace handler also after commit + 0f0652a3093111fc7dac0205fdcf8d02bf16e89f. -- two new committers! +- Make libssh2_debug() create a correctly terminated string + + Also use FILE *stderr rather than fd 2, which can very well be something + completely different. -Paul Thomas (2 Oct 2008) -- This fix addresses bug# 2141548. Channel reads would fail despite - libssh2_poll() detecting that there was data ready to be read on - the socket. This is seen when small amounts of data are ready to - be read, typically 1-4 chars worth. +Daniel Stenberg (23 Jun 2010) +- [TJ Saunders brought this change] -- Committed changes to add in support for pty resizing. Credit for this - patch goes to Vincent Jaulin. + handshake: Compression enabled at the wrong time + + In KEXINIT messages, the client and server agree on, among other + things, whether to use compression. This method agreement occurs + in src/kex.c's kex_agree_methods() function. However, if + compression is enabled (either client->server, server->client, or + both), then the compression layer is initialized in + kex_agree_methods() -- before NEWKEYS has been received. + + Instead, the initialization of the compression layer should + happen after NEWKEYS has been received. This looks to occur + insrc/kex.c's diffie_hellman_sha1(), which even has the comment: + + /* The first key exchange has been performed, + + switch to active crypt/comp/mac mode */ + + There, after NEWKEYS is received, the cipher and mac algorithms + are initialized, and that is where the compression should be + initialized as well. + + The current implementation fails if server->client compression is + enabled because most server implementations follow OpenSSH's + lead, where compression is initialized after NEWKEYS. Since the + server initializes compression after NEWKEYS, but libssh2 + initializes compression after KEXINIT (i.e. before NEWKEYS), they + are out of sync. + + Reported in bug report #180 -- Fixed an issue with the libssh2_poll_channel_read function not - reading both normal and extended data when a non-zero value - is passed in as the 2nd parameter. This now matches the functionallity - described in the documentation. +- [TJ Saunders brought this change] -Daniel Stenberg (30 Sep 2008) -- Carlo Bramini fixed the build for msys+mingw. Bug #1943976. + userauth_hostbased_fromfile: packet length too short + + The packet length calculated in src/userauth.c's + userauth_hostbased_fromfile() function is too short by 4 bytes; + it forgets to add four bytes for the length of the hostname. + This causes hostbased authentication to fail, since the server + will read junk data. + + verified against proftpd's mod_sftp module -- Carlo Bramini's fixes for the nonblocking examples for msys/mingw +- _libssh2_userauth_publickey: reject method names longer than the data + + This functions get the method length by looking at the first 32 + bit of data, and I now made it not accept method lengths that are + longer than the whole data set is, as given in the dedicated + function argument. + + This was detected when the function was given bogus public key + data as an ascii string, which caused the first 32bits to create + a HUGE number. -- Neil Gierman provided improved Visual Studio 2008 code in bug #1946268 +- NULL resistance: make more public functions survive NULL pointer input + + Sending in NULL as the primary pointer is now dealt with by more + public functions. I also narrowed the userauth.c code somewhat to + stay within 80 columns better. -- - Bug #1862727 fixed libssh2_poll() to work on windows (by defining HAVE_SELECT). +- agent: make libssh2_agent_userauth() work blocking properly + + previously it would always work in a non-blocking manner -- - Based on bug #1815692, we introduce libssh2_sftp_seek2() that allows seeking - beyond the 2GB margin even on 32bit machines. +Peter Stuge (17 Jun 2010) +- Fix underscore typo for 64-bit printf format specifiers on Windows + + Commit 49ddf447ff4bd80285f926eac0115f4e595f9425 was missing underscores. -- - Based on a patch in bug #1878059 by Steven Ayre libssh2 now parses >2GB file - sizes when downloading SCP files. +Daniel Stenberg (16 Jun 2010) +- libssh2_session_callback_set: extended the man page diff --git a/vendor/libssh2/NMakefile b/vendor/libssh2/NMakefile index f3fcce1121..07bc2ddad1 100644 --- a/vendor/libssh2/NMakefile +++ b/vendor/libssh2/NMakefile @@ -1,5 +1,10 @@ !include "win32/config.mk" +!if "$(WITH_WINCNG)" == "1" +!include "Makefile.WinCNG.inc" +!else +!include "Makefile.OpenSSL.inc" +!endif !include "Makefile.inc" OBJECTS=$(CSOURCES:.c=.obj) @@ -12,6 +17,7 @@ all-sub: win32\objects.mk clean: -rmdir 2>NUL /s/q $(TARGET) + -del 2>NUL win32\objects.mk real-clean vclean: clean -del 2>NUL libssh2.dll @@ -19,7 +25,6 @@ real-clean vclean: clean -del 2>NUL libssh2.ilk -del 2>NUL libssh2.lib -del 2>NUL *.pdb - -del 2>NUL win32\objects.mk win32\objects.mk: Makefile.inc @echo OBJECTS = \>$@ diff --git a/vendor/libssh2/README b/vendor/libssh2/README index 0ba17f926a..8a148568cf 100644 --- a/vendor/libssh2/README +++ b/vendor/libssh2/README @@ -4,94 +4,16 @@ libssh2 - SSH2 library libssh2 is a library implementing the SSH2 protocol, available under the revised BSD license. -Web site: http://www.libssh2.org/ +Web site: https://www.libssh2.org/ -Mailing list: http://cool.haxx.se/mailman/listinfo/libssh2-devel +Mailing list: https://cool.haxx.se/mailman/listinfo/libssh2-devel -Generic installation instructions are in INSTALL. Some ./configure -options deserve additional comments: +License: see COPYING - * --enable-crypt-none +Source code: https://github.com/libssh2/libssh2 - The SSH2 Transport allows for unencrypted data - transmission using the "none" cipher. Because this is - such a huge security hole, it is typically disabled on - SSH2 implementations and is disabled in libssh2 by - default as well. +Web site source code: https://github.com/libssh2/www - Enabling this option will allow for "none" as a - negotiable method, however it still requires that the - method be advertized by the remote end and that no - more-preferable methods are available. - - * --enable-mac-none - - The SSH2 Transport also allows implementations to - forego a message authentication code. While this is - less of a security risk than using a "none" cipher, it - is still not recommended as disabling MAC hashes - removes a layer of security. - - Enabling this option will allow for "none" as a - negotiable method, however it still requires that the - method be advertized by the remote end and that no - more-preferable methods are available. - - * --disable-gex-new - - The diffie-hellman-group-exchange-sha1 (dh-gex) key - exchange method originally defined an exchange - negotiation using packet type 30 to request a - generation pair based on a single target value. Later - refinement of dh-gex provided for range and target - values. By default libssh2 will use the newer range - method. - - If you experience trouble connecting to an old SSH - server using dh-gex, try this option to fallback on - the older more reliable method. - - * --with-libgcrypt - * --without-libgcrypt - * --with-libgcrypt-prefix=DIR - - libssh2 can use the Libgcrypt library - (http://www.gnupg.org/) for cryptographic operations. - Either Libgcrypt or OpenSSL is required. - - Configure will attempt to locate Libgcrypt - automatically. - - If your installation of Libgcrypt is in another - location, specify it using --with-libgcrypt-prefix. - - * --with-openssl - * --without-openssl - * --with-libssl-prefix=[DIR] - - libssh2 can use the OpenSSL library - (http://www.openssl.org) for cryptographic operations. - Either Libgcrypt or OpenSSL is required. - - Configure will attempt to locate OpenSSL in the - default location. - - If your installation of OpenSSL is in another - location, specify it using --with-libssl-prefix. - - * --with-libz - * --without-libz - * --with-libz-prefix=[DIR] - - If present, libssh2 will attempt to use the zlib - (http://www.zlib.org) for payload compression, however - zlib is not required. - - If your installation of Libz is in another location, - specify it using --with-libz-prefix. - - * --enable-debug - - Will make the build use more pedantic and strict compiler - options as well as enable the libssh2_trace() function (for - showing debug traces). +Installation instructions are in: + - docs/INSTALL_CMAKE for CMake + - docs/INSTALL_AUTOTOOLS for Autotools diff --git a/vendor/libssh2/RELEASE-NOTES b/vendor/libssh2/RELEASE-NOTES index eea78f874d..62064a9fe6 100644 --- a/vendor/libssh2/RELEASE-NOTES +++ b/vendor/libssh2/RELEASE-NOTES @@ -1,28 +1,62 @@ -libssh2 1.4.3 +libssh2 1.10 -This release includes the following changes: +This release includes the following enhancements and bugfixes: - o compression: add support for zlib@openssh.com - -This release includes the following bugfixes: - - o sftp_read: return error if a too large package arrives - o libssh2_hostkey_hash.3: update the description of return value - o Fixed MSVC NMakefile - o examples: use stderr for messages, stdout for data - o openssl: do not leak memory when handling errors - o improved handling of disabled MD5 algorithm in OpenSSL - o known_hosts: Fail when parsing unknown keys in known_hosts file - o configure: gcrypt doesn't come with pkg-config support - o session_free: wrong variable used for keeping state - o libssh2_userauth_publickey_fromfile_ex.3: mention publickey == NULL - o comp_method_zlib_decomp: handle Z_BUF_ERROR when inflating + o adds agent forwarding support + o adds OpenSSH Agent support on Windows + o adds ECDSA key support using the Mbed TLS backend + o adds ECDSA cert authentication + o adds diffie-hellman-group14-sha256, diffie-hellman-group16-sha512, + diffie-hellman-group18-sha512 key exchanges + o adds support for PKIX key reading when using ed25519 with OpenSSL + o adds support for EWOULDBLOCK on VMS systems + o adds support for building with OpenSSL 3 + o adds support for using FIPS mode in OpenSSL + o adds debug symbols when building with MSVC + o adds support for building on the 3DS + o adds unicode build support on Windows + o restores os400 building + o increases min, max and opt Diffie Hellman group values + o improves portiablity of the make file + o improves timeout behavior with 2FA keyboard auth + o various improvements to the Wincng backend + o fixes reading parital packet replies when using an agent + o fixes Diffie Hellman key exchange on Windows 1903+ builds + o fixes building tests with older versions of OpenSSL + o fixes possible multiple definition warnings + o fixes potential cast issues _libssh2_ecdsa_key_get_curve_type() + o fixes potential use after free if libssh2_init() is called twice + o improved linking when using Mbed TLS + o fixes call to libssh2_crypto_exit() if crypto hasn't been initialized + o fixes crash when loading public keys with no id + o fixes possible out of bounds read when exchanging keys + o fixes possible out of bounds read when reading packets + o fixes possible out of bounds read when opening an X11 connection + o fixes possible out of bounds read when ecdh host keys + o fixes possible hang when trying to read a disconnected socket + o fixes a crash when using the delayed compression option + o fixes read error with large known host entries + o fixes various warnings + o fixes various small memory leaks + o improved error handling, various detailed errors will now be reported + o builds are now using OSS-Fuzz + o builds now use autoreconf instead of a custom build script + o cmake now respects install directory + o improved CI backend + o updated HACKING-CRYPTO documentation + o use markdown file extensions + o improved unit tests This release would not have looked like this without help, code, reports and advice from friends like these: - Guenter Knauf, Peter Stuge, TJ Saunders, Mike Abdullah, Maxime Larocque, - Dmitry Smirnov, Dave Hayden, Peter Krempa, Kamil Dudka - - Thanks! (and sorry if I forgot to mention someone) + katzer, Orgad Shaneh, mark-i-m, Zenju, axjowa, Thilo Schulz, + Etienne Samson, hlefebvre, seba30, Panos, jethrogb, Fabrice Fontaine, + Will Cosgrove, Daniel Stenberg, Michael Buckley, Wallace Souza Silva, + Romain-Geissler-1A, meierha, Tseng Jun, Thomas Klausner, Brendan Shanks, + Harry Sintonen, monnerat, Koutheir Attouchi, Marc Hörsken, yann-morin-1998, + Wez Furlong, TDi-jonesds, David Benjamin, Max Dymond, Igor Klevanets, + Viktor Szakats, Laurent Stacul, Mstrodl, Gabriel Smith, MarcT512, + Paul Capron, teottin, Tor Erik Ottinsen, Brian Inglis + (40 contributors) diff --git a/vendor/libssh2/acinclude.m4 b/vendor/libssh2/acinclude.m4 index 71860d6182..2066f0ec9b 100644 --- a/vendor/libssh2/acinclude.m4 +++ b/vendor/libssh2/acinclude.m4 @@ -382,3 +382,131 @@ AC_DEFUN([CURL_CONFIGURE_REENTRANT], [ # ]) +dnl LIBSSH2_LIB_HAVE_LINKFLAGS +dnl -------------------------- +dnl Wrapper around AC_LIB_HAVE_LINKFLAGS to also check $prefix/lib, if set. +dnl +dnl autoconf only checks $prefix/lib64 if gcc -print-search-dirs output +dnl includes a directory named lib64. So, to find libraries in $prefix/lib +dnl we append -L$prefix/lib to LDFLAGS before checking. +dnl +dnl For conveniece, $4 is expanded if [lib]$1 is found. + +AC_DEFUN([LIBSSH2_LIB_HAVE_LINKFLAGS], [ + libssh2_save_CPPFLAGS="$CPPFLAGS" + libssh2_save_LDFLAGS="$LDFLAGS" + + if test "${with_lib$1_prefix+set}" = set; then + CPPFLAGS="$CPPFLAGS${CPPFLAGS:+ }-I${with_lib$1_prefix}/include" + LDFLAGS="$LDFLAGS${LDFLAGS:+ }-L${with_lib$1_prefix}/lib" + fi + + AC_LIB_HAVE_LINKFLAGS([$1], [$2], [$3]) + + LDFLAGS="$libssh2_save_LDFLAGS" + + if test "$ac_cv_lib$1" = "yes"; then : + $4 + else + CPPFLAGS="$libssh2_save_CPPFLAGS" + fi +]) + +AC_DEFUN([LIBSSH2_CHECK_CRYPTO], [ +if test "$use_crypto" = "auto" && test "$found_crypto" = "none" || test "$use_crypto" = "$1"; then +m4_case([$1], +[openssl], [ + LIBSSH2_LIB_HAVE_LINKFLAGS([ssl], [crypto], [#include ], [ + AC_DEFINE(LIBSSH2_OPENSSL, 1, [Use $1]) + LIBSREQUIRED="$LIBSREQUIRED${LIBSREQUIRED:+ }libssl libcrypto" + + # Not all OpenSSL have AES-CTR functions. + libssh2_save_LIBS="$LIBS" + LIBS="$LIBS $LIBSSL" + AC_CHECK_FUNCS(EVP_aes_128_ctr) + LIBS="$libssh2_save_LIBS" + + found_crypto="$1" + found_crypto_str="OpenSSL (AES-CTR: ${ac_cv_func_EVP_aes_128_ctr:-N/A})" + ]) +], + +[libgcrypt], [ + LIBSSH2_LIB_HAVE_LINKFLAGS([gcrypt], [], [#include ], [ + AC_DEFINE(LIBSSH2_LIBGCRYPT, 1, [Use $1]) + found_crypto="$1" + ]) +], + +[mbedtls], [ + LIBSSH2_LIB_HAVE_LINKFLAGS([mbedcrypto], [], [#include ], [ + AC_DEFINE(LIBSSH2_MBEDTLS, 1, [Use $1]) + LIBS="$LIBS -lmbedcrypto" + found_crypto="$1" + support_clear_memory=yes + ]) +], + +[wincng], [ + # Look for Windows Cryptography API: Next Generation + + AC_CHECK_HEADERS([ntdef.h ntstatus.h], [], [], [#include ]) + AC_CHECK_DECLS([SecureZeroMemory], [], [], [#include ]) + + LIBSSH2_LIB_HAVE_LINKFLAGS([crypt32], [], [ + #include + #include + ]) + LIBSSH2_LIB_HAVE_LINKFLAGS([bcrypt], [], [ + #include + #include + ], [ + AC_DEFINE(LIBSSH2_WINCNG, 1, [Use $1]) + found_crypto="$1" + found_crypto_str="Windows Cryptography API: Next Generation" + support_clear_memory="$ac_cv_have_decl_SecureZeroMemory" + ]) +], +) + test "$found_crypto" = "none" && + crypto_errors="${crypto_errors}No $1 crypto library found! +" +fi +]) + + +dnl LIBSSH2_CHECK_OPTION_WERROR +dnl ------------------------------------------------- +dnl Verify if configure has been invoked with option +dnl --enable-werror or --disable-werror, and set +dnl shell variable want_werror as appropriate. + +AC_DEFUN([LIBSSH2_CHECK_OPTION_WERROR], [ + AC_BEFORE([$0],[LIBSSH2_CHECK_COMPILER])dnl + AC_MSG_CHECKING([whether to enable compiler warnings as errors]) + OPT_COMPILER_WERROR="default" + AC_ARG_ENABLE(werror, +AC_HELP_STRING([--enable-werror],[Enable compiler warnings as errors]) +AC_HELP_STRING([--disable-werror],[Disable compiler warnings as errors]), + OPT_COMPILER_WERROR=$enableval) + case "$OPT_COMPILER_WERROR" in + no) + dnl --disable-werror option used + want_werror="no" + ;; + default) + dnl configure option not specified + want_werror="no" + ;; + *) + dnl --enable-werror option used + want_werror="yes" + ;; + esac + AC_MSG_RESULT([$want_werror]) + + if test X"$want_werror" = Xyes; then + CFLAGS="$CFLAGS -Werror" + fi +]) + diff --git a/vendor/libssh2/aclocal.m4 b/vendor/libssh2/aclocal.m4 index 80e968f52e..fc56a693e4 100644 --- a/vendor/libssh2/aclocal.m4 +++ b/vendor/libssh2/aclocal.m4 @@ -1,8 +1,7 @@ -# generated automatically by aclocal 1.11.6 -*- Autoconf -*- +# generated automatically by aclocal 1.16.4 -*- Autoconf -*- + +# Copyright (C) 1996-2021 Free Software Foundation, Inc. -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, -# 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, -# Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -12,33 +11,31 @@ # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. +m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl -m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, -[m4_warning([this file was generated for autoconf 2.69. +m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.71],, +[m4_warning([this file was generated for autoconf 2.71. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. -To do so, use the procedure documented by the package, typically `autoreconf'.])]) +To do so, use the procedure documented by the package, typically 'autoreconf'.])]) -# Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008, 2011 Free Software -# Foundation, Inc. +# Copyright (C) 2002-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 1 - # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], -[am__api_version='1.11' +[am__api_version='1.16' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. -m4_if([$1], [1.11.6], [], +m4_if([$1], [1.16.4], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) @@ -54,24 +51,22 @@ m4_define([_AM_AUTOCONF_VERSION], []) # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], -[AM_AUTOMAKE_VERSION([1.11.6])dnl +[AM_AUTOMAKE_VERSION([1.16.4])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- -# Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc. +# Copyright (C) 2001-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 1 - # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets -# $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to -# `$srcdir', `$srcdir/..', or `$srcdir/../..'. +# $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to +# '$srcdir', '$srcdir/..', or '$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and @@ -90,7 +85,7 @@ _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually -# harmless because $srcdir is `.', but things will broke when you +# harmless because $srcdir is '.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, @@ -108,30 +103,26 @@ _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], -[dnl Rely on autoconf to set up CDPATH properly. -AC_PREREQ([2.50])dnl -# expand $ac_aux_dir to an absolute path -am_aux_dir=`cd $ac_aux_dir && pwd` +[AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl +# Expand $ac_aux_dir to an absolute path. +am_aux_dir=`cd "$ac_aux_dir" && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- -# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008 -# Free Software Foundation, Inc. +# Copyright (C) 1997-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 9 - # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], -[AC_PREREQ(2.52)dnl - ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], - [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl +[AC_PREREQ([2.52])dnl + m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], + [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl @@ -150,16 +141,14 @@ AC_CONFIG_COMMANDS_PRE( Usually this means the macro was only invoked conditionally.]]) fi])]) -# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009, -# 2010, 2011 Free Software Foundation, Inc. +# Copyright (C) 1999-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 12 -# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be +# There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing @@ -169,7 +158,7 @@ fi])]) # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. -# NAME is "CC", "CXX", "GCJ", or "OBJC". +# NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was @@ -182,12 +171,13 @@ AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl -ifelse([$1], CC, [depcc="$CC" am_compiler_list=], - [$1], CXX, [depcc="$CXX" am_compiler_list=], - [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], - [$1], UPC, [depcc="$UPC" am_compiler_list=], - [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], - [depcc="$$1" am_compiler_list=]) +m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], + [$1], [CXX], [depcc="$CXX" am_compiler_list=], + [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], + [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], + [$1], [UPC], [depcc="$UPC" am_compiler_list=], + [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], + [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], @@ -195,8 +185,8 @@ AC_CACHE_CHECK([dependency style of $depcc], # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up - # making a dummy file named `D' -- because `-MD' means `put the output - # in D'. + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're @@ -236,16 +226,16 @@ AC_CACHE_CHECK([dependency style of $depcc], : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c - # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with - # Solaris 8's {/usr,}/bin/sh. - touch sub/conftst$i.h + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf - # We check with `-c' and `-o' for the sake of the "dashmstdout" + # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly - # handle `-M -o', and we need to detect this. Also, some Intel - # versions had trouble with output in subdirs + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in @@ -254,8 +244,8 @@ AC_CACHE_CHECK([dependency style of $depcc], test "$am__universal" = false || continue ;; nosideeffect) - # after this tag, mechanisms are not by side-effect, so they'll - # only be used when explicitly requested + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else @@ -263,7 +253,7 @@ AC_CACHE_CHECK([dependency style of $depcc], fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) - # This compiler won't grok `-c -o', but also, the minuso test has + # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} @@ -311,7 +301,7 @@ AM_CONDITIONAL([am__fastdep$1], [ # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. -# This macro is AC_REQUIREd in _AM_DEPENDENCIES +# This macro is AC_REQUIREd in _AM_DEPENDENCIES. AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl @@ -321,9 +311,13 @@ AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], -[AC_ARG_ENABLE(dependency-tracking, -[ --disable-dependency-tracking speeds up one-time build - --enable-dependency-tracking do not reject slow dependency extractors]) +[AC_ARG_ENABLE([dependency-tracking], [dnl +AS_HELP_STRING( + [--enable-dependency-tracking], + [do not reject slow dependency extractors]) +AS_HELP_STRING( + [--disable-dependency-tracking], + [speeds up one-time build])]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' @@ -338,67 +332,56 @@ _AM_SUBST_NOTMAKE([am__nodep])dnl # Generate code to set up dependency tracking. -*- Autoconf -*- -# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008 -# Free Software Foundation, Inc. +# Copyright (C) 1999-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -#serial 5 - # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ - # Autoconf 2.62 quotes --file arguments for eval, but not when files + # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. - case $CONFIG_FILES in - *\'*) eval set x "$CONFIG_FILES" ;; - *) set x $CONFIG_FILES ;; - esac + # TODO: see whether this extra hack can be removed once we start + # requiring Autoconf 2.70 or later. + AS_CASE([$CONFIG_FILES], + [*\'*], [eval set x "$CONFIG_FILES"], + [*], [set x $CONFIG_FILES]) shift - for mf + # Used to flag and report bootstrapping failures. + am_rc=0 + for am_mf do # Strip MF so we end up with the name of the file. - mf=`echo "$mf" | sed -e 's/:.*$//'` - # Check whether this is an Automake generated Makefile or not. - # We used to match only the files named `Makefile.in', but - # some people rename them; so instead we look at the file content. - # Grep'ing the first line is not enough: some people post-process - # each Makefile.in and add a new line on top of each file to say so. - # Grep'ing the whole file is not good either: AIX grep has a line + am_mf=`AS_ECHO(["$am_mf"]) | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile which includes + # dependency-tracking related rules and includes. + # Grep'ing the whole file directly is not great: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. - if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then - dirpart=`AS_DIRNAME("$mf")` - else - continue - fi - # Extract the definition of DEPDIR, am__include, and am__quote - # from the Makefile without running `make'. - DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` - test -z "$DEPDIR" && continue - am__include=`sed -n 's/^am__include = //p' < "$mf"` - test -z "am__include" && continue - am__quote=`sed -n 's/^am__quote = //p' < "$mf"` - # When using ansi2knr, U may be empty or an underscore; expand it - U=`sed -n 's/^U = //p' < "$mf"` - # Find all dependency output files, they are included files with - # $(DEPDIR) in their names. We invoke sed twice because it is the - # simplest approach to changing $(DEPDIR) to its actual value in the - # expansion. - for file in `sed -n " - s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ - sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do - # Make sure the directory exists. - test -f "$dirpart/$file" && continue - fdir=`AS_DIRNAME(["$file"])` - AS_MKDIR_P([$dirpart/$fdir]) - # echo "creating $dirpart/$file" - echo '# dummy' > "$dirpart/$file" - done + sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \ + || continue + am_dirpart=`AS_DIRNAME(["$am_mf"])` + am_filepart=`AS_BASENAME(["$am_mf"])` + AM_RUN_LOG([cd "$am_dirpart" \ + && sed -e '/# am--include-marker/d' "$am_filepart" \ + | $MAKE -f - am--depfiles]) || am_rc=$? done + if test $am_rc -ne 0; then + AC_MSG_FAILURE([Something went wrong bootstrapping makefile fragments + for automatic dependency tracking. If GNU make was not used, consider + re-running the configure script with MAKE="gmake" (or whatever is + necessary). You can also try re-running configure with the + '--disable-dependency-tracking' option to at least be able to build + the package (albeit without support for automatic dependency tracking).]) + fi + AS_UNSET([am_dirpart]) + AS_UNSET([am_filepart]) + AS_UNSET([am_mf]) + AS_UNSET([am_rc]) + rm -f conftest-deps.mk } ])# _AM_OUTPUT_DEPENDENCY_COMMANDS @@ -407,41 +390,31 @@ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], # ----------------------------- # This macro should only be invoked once -- use via AC_REQUIRE. # -# This code is only required when automatic dependency tracking -# is enabled. FIXME. This creates each `.P' file that we will -# need in order to bootstrap the dependency handling code. +# This code is only required when automatic dependency tracking is enabled. +# This creates each '.Po' and '.Plo' makefile fragment that we'll need in +# order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], - [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) -]) - -# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005 -# Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# serial 8 - -# AM_CONFIG_HEADER is obsolete. It has been replaced by AC_CONFIG_HEADERS. -AU_DEFUN([AM_CONFIG_HEADER], [AC_CONFIG_HEADERS($@)]) + [AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}"])]) # Do all the work for Automake. -*- Autoconf -*- -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, -# 2005, 2006, 2008, 2009 Free Software Foundation, Inc. +# Copyright (C) 1996-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 16 - # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. +dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O. +m4_define([AC_PROG_CC], +m4_defn([AC_PROG_CC]) +[_AM_PROG_CC_C_O +]) + # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- @@ -454,7 +427,7 @@ AU_DEFUN([AM_CONFIG_HEADER], [AC_CONFIG_HEADERS($@)]) # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], -[AC_PREREQ([2.62])dnl +[AC_PREREQ([2.65])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl @@ -483,33 +456,42 @@ AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], -[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl +[AC_DIAGNOSE([obsolete], + [$0: two- and three-arguments forms are deprecated.]) +m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. -m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,, +m4_if( + m4_ifset([AC_PACKAGE_NAME], [ok]):m4_ifset([AC_PACKAGE_VERSION], [ok]), + [ok:ok],, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, -[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) - AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl +[AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) + AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl -AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) -AM_MISSING_PROG(AUTOCONF, autoconf) -AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) -AM_MISSING_PROG(AUTOHEADER, autoheader) -AM_MISSING_PROG(MAKEINFO, makeinfo) +AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) +AM_MISSING_PROG([AUTOCONF], [autoconf]) +AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) +AM_MISSING_PROG([AUTOHEADER], [autoheader]) +AM_MISSING_PROG([MAKEINFO], [makeinfo]) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl -AC_REQUIRE([AM_PROG_MKDIR_P])dnl -# We need awk for the "check" target. The system "awk" is bad on -# some platforms. +AC_REQUIRE([AC_PROG_MKDIR_P])dnl +# For better backward compatibility. To be removed once Automake 1.9.x +# dies out for good. For more background, see: +# +# +AC_SUBST([mkdir_p], ['$(MKDIR_P)']) +# We need awk for the "check" target (and possibly the TAP driver). The +# system "awk" is bad on some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl @@ -518,34 +500,96 @@ _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], - [_AM_DEPENDENCIES(CC)], - [define([AC_PROG_CC], - defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl + [_AM_DEPENDENCIES([CC])], + [m4_define([AC_PROG_CC], + m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], - [_AM_DEPENDENCIES(CXX)], - [define([AC_PROG_CXX], - defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl + [_AM_DEPENDENCIES([CXX])], + [m4_define([AC_PROG_CXX], + m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], - [_AM_DEPENDENCIES(OBJC)], - [define([AC_PROG_OBJC], - defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl + [_AM_DEPENDENCIES([OBJC])], + [m4_define([AC_PROG_OBJC], + m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], + [_AM_DEPENDENCIES([OBJCXX])], + [m4_define([AC_PROG_OBJCXX], + m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl ]) -_AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl -dnl The `parallel-tests' driver may need to know about EXEEXT, so add the -dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This macro -dnl is hooked onto _AC_COMPILER_EXEEXT early, see below. +# Variables for tags utilities; see am/tags.am +if test -z "$CTAGS"; then + CTAGS=ctags +fi +AC_SUBST([CTAGS]) +if test -z "$ETAGS"; then + ETAGS=etags +fi +AC_SUBST([ETAGS]) +if test -z "$CSCOPE"; then + CSCOPE=cscope +fi +AC_SUBST([CSCOPE]) + +AC_REQUIRE([AM_SILENT_RULES])dnl +dnl The testsuite driver may need to know about EXEEXT, so add the +dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This +dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl + +# POSIX will say in a future version that running "rm -f" with no argument +# is OK; and we want to be able to make that assumption in our Makefile +# recipes. So use an aggressive probe to check that the usage we want is +# actually supported "in the wild" to an acceptable degree. +# See automake bug#10828. +# To make any issue more visible, cause the running configure to be aborted +# by default if the 'rm' program in use doesn't match our expectations; the +# user can still override this though. +if rm -f && rm -fr && rm -rf; then : OK; else + cat >&2 <<'END' +Oops! + +Your 'rm' program seems unable to run without file operands specified +on the command line, even when the '-f' option is present. This is contrary +to the behaviour of most rm programs out there, and not conforming with +the upcoming POSIX standard: + +Please tell bug-automake@gnu.org about your system, including the value +of your $PATH and any error possibly output before this message. This +can help us improve future automake versions. + +END + if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then + echo 'Configuration will proceed anyway, since you have set the' >&2 + echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 + echo >&2 + else + cat >&2 <<'END' +Aborting the configuration process, to ensure you take notice of the issue. + +You can download and install GNU coreutils to get an 'rm' implementation +that behaves properly: . + +If you want to complete the configuration process using your problematic +'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM +to "yes", and re-run configure. + +END + AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) + fi +fi +dnl The trailing newline in this macro's definition is deliberate, for +dnl backward compatibility and to allow trailing 'dnl'-style comments +dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841. ]) -dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion. Do not +dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further dnl mangled by Autoconf and run in a shell conditional statement. m4_define([_AC_COMPILER_EXEEXT], m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) - # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. @@ -567,21 +611,18 @@ for _am_header in $config_headers :; do done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) -# Copyright (C) 2001, 2003, 2005, 2008, 2011 Free Software Foundation, -# Inc. +# Copyright (C) 2001-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 1 - # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl -if test x"${install_sh}" != xset; then +if test x"${install_sh+set}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; @@ -589,16 +630,14 @@ if test x"${install_sh}" != xset; then install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi -AC_SUBST(install_sh)]) +AC_SUBST([install_sh])]) -# Copyright (C) 2003, 2005 Free Software Foundation, Inc. +# Copyright (C) 2003-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 2 - # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], @@ -615,20 +654,17 @@ AC_SUBST([am__leading_dot])]) # Add --enable-maintainer-mode option to configure. -*- Autoconf -*- # From Jim Meyering -# Copyright (C) 1996, 1998, 2000, 2001, 2002, 2003, 2004, 2005, 2008, -# 2011 Free Software Foundation, Inc. +# Copyright (C) 1996-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 5 - # AM_MAINTAINER_MODE([DEFAULT-MODE]) # ---------------------------------- # Control maintainer-specific portions of Makefiles. -# Default is to disable them, unless `enable' is passed literally. -# For symmetry, `disable' may be passed as well. Anyway, the user +# Default is to disable them, unless 'enable' is passed literally. +# For symmetry, 'disable' may be passed as well. Anyway, the user # can override the default with the --enable/--disable switch. AC_DEFUN([AM_MAINTAINER_MODE], [m4_case(m4_default([$1], [disable]), @@ -639,10 +675,11 @@ AC_DEFUN([AM_MAINTAINER_MODE], AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) dnl maintainer-mode's default is 'disable' unless 'enable' is passed AC_ARG_ENABLE([maintainer-mode], -[ --][am_maintainer_other][-maintainer-mode am_maintainer_other make rules and dependencies not useful - (and sometimes confusing) to the casual installer], - [USE_MAINTAINER_MODE=$enableval], - [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes])) + [AS_HELP_STRING([--]am_maintainer_other[-maintainer-mode], + am_maintainer_other[ make rules and dependencies not useful + (and sometimes confusing) to the casual installer])], + [USE_MAINTAINER_MODE=$enableval], + [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes])) AC_MSG_RESULT([$USE_MAINTAINER_MODE]) AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes]) MAINT=$MAINTAINER_MODE_TRUE @@ -650,71 +687,57 @@ AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) ] ) -AU_DEFUN([jm_MAINTAINER_MODE], [AM_MAINTAINER_MODE]) - # Check to see how 'make' treats includes. -*- Autoconf -*- -# Copyright (C) 2001, 2002, 2003, 2005, 2009 Free Software Foundation, Inc. +# Copyright (C) 2001-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 4 - # AM_MAKE_INCLUDE() # ----------------- -# Check to see how make treats includes. +# Check whether make has an 'include' directive that can support all +# the idioms we need for our automatic dependency tracking code. AC_DEFUN([AM_MAKE_INCLUDE], -[am_make=${MAKE-make} -cat > confinc << 'END' +[AC_MSG_CHECKING([whether ${MAKE-make} supports the include directive]) +cat > confinc.mk << 'END' am__doit: - @echo this is the am__doit target + @echo this is the am__doit target >confinc.out .PHONY: am__doit END -# If we don't find an include directive, just comment out the code. -AC_MSG_CHECKING([for style of include used by $am_make]) am__include="#" am__quote= -_am_result=none -# First try GNU make style include. -echo "include confinc" > confmf -# Ignore all kinds of additional output from `make'. -case `$am_make -s -f confmf 2> /dev/null` in #( -*the\ am__doit\ target*) - am__include=include - am__quote= - _am_result=GNU - ;; -esac -# Now try BSD make style include. -if test "$am__include" = "#"; then - echo '.include "confinc"' > confmf - case `$am_make -s -f confmf 2> /dev/null` in #( - *the\ am__doit\ target*) - am__include=.include - am__quote="\"" - _am_result=BSD - ;; - esac -fi -AC_SUBST([am__include]) -AC_SUBST([am__quote]) -AC_MSG_RESULT([$_am_result]) -rm -f confinc confmf -]) +# BSD make does it like this. +echo '.include "confinc.mk" # ignored' > confmf.BSD +# Other make implementations (GNU, Solaris 10, AIX) do it like this. +echo 'include confinc.mk # ignored' > confmf.GNU +_am_result=no +for s in GNU BSD; do + AM_RUN_LOG([${MAKE-make} -f confmf.$s && cat confinc.out]) + AS_CASE([$?:`cat confinc.out 2>/dev/null`], + ['0:this is the am__doit target'], + [AS_CASE([$s], + [BSD], [am__include='.include' am__quote='"'], + [am__include='include' am__quote=''])]) + if test "$am__include" != "#"; then + _am_result="yes ($s style)" + break + fi +done +rm -f confinc.* confmf.* +AC_MSG_RESULT([${_am_result}]) +AC_SUBST([am__include])]) +AC_SUBST([am__quote])]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- -# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008 -# Free Software Foundation, Inc. +# Copyright (C) 1997-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 6 - # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], @@ -722,71 +745,33 @@ AC_DEFUN([AM_MISSING_PROG], $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) - # AM_MISSING_HAS_RUN # ------------------ -# Define MISSING if not defined so far and test if it supports --run. -# If it does, set am_missing_run to use it, otherwise, to nothing. +# Define MISSING if not defined so far and test if it is modern enough. +# If it is, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl if test x"${MISSING+set}" != xset; then - case $am_aux_dir in - *\ * | *\ *) - MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; - *) - MISSING="\${SHELL} $am_aux_dir/missing" ;; - esac + MISSING="\${SHELL} '$am_aux_dir/missing'" fi # Use eval to expand $SHELL -if eval "$MISSING --run true"; then - am_missing_run="$MISSING --run " +if eval "$MISSING --is-lightweight"; then + am_missing_run="$MISSING " else am_missing_run= - AC_MSG_WARN([`missing' script is too old or missing]) + AC_MSG_WARN(['missing' script is too old or missing]) fi ]) -# Copyright (C) 2003, 2004, 2005, 2006, 2011 Free Software Foundation, -# Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# serial 1 - -# AM_PROG_MKDIR_P -# --------------- -# Check for `mkdir -p'. -AC_DEFUN([AM_PROG_MKDIR_P], -[AC_PREREQ([2.60])dnl -AC_REQUIRE([AC_PROG_MKDIR_P])dnl -dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P, -dnl while keeping a definition of mkdir_p for backward compatibility. -dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile. -dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of -dnl Makefile.ins that do not define MKDIR_P, so we do our own -dnl adjustment using top_builddir (which is defined more often than -dnl MKDIR_P). -AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl -case $mkdir_p in - [[\\/$]]* | ?:[[\\/]]*) ;; - */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; -esac -]) - # Helper functions for option handling. -*- Autoconf -*- -# Copyright (C) 2001, 2002, 2003, 2005, 2008, 2010 Free Software -# Foundation, Inc. +# Copyright (C) 2001-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 5 - # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], @@ -796,7 +781,7 @@ AC_DEFUN([_AM_MANGLE_OPTION], # -------------------- # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], -[m4_define(_AM_MANGLE_OPTION([$1]), 1)]) +[m4_define(_AM_MANGLE_OPTION([$1]), [1])]) # _AM_SET_OPTIONS(OPTIONS) # ------------------------ @@ -810,24 +795,82 @@ AC_DEFUN([_AM_SET_OPTIONS], AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) -# Check to make sure that the build environment is sane. -*- Autoconf -*- +# Copyright (C) 1999-2021 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_PROG_CC_C_O +# --------------- +# Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC +# to automatically call this. +AC_DEFUN([_AM_PROG_CC_C_O], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([compile])dnl +AC_LANG_PUSH([C])dnl +AC_CACHE_CHECK( + [whether $CC understands -c and -o together], + [am_cv_prog_cc_c_o], + [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) + # Make sure it works both with $CC and with simple cc. + # Following AC_PROG_CC_C_O, we do the test twice because some + # compilers refuse to overwrite an existing .o file with -o, + # though they will create one. + am_cv_prog_cc_c_o=yes + for am_i in 1 2; do + if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \ + && test -f conftest2.$ac_objext; then + : OK + else + am_cv_prog_cc_c_o=no + break + fi + done + rm -f core conftest* + unset am_i]) +if test "$am_cv_prog_cc_c_o" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi +AC_LANG_POP([C])]) -# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008 -# Free Software Foundation, Inc. +# For backward compatibility. +AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) + +# Copyright (C) 2001-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 5 +# AM_RUN_LOG(COMMAND) +# ------------------- +# Run COMMAND, save the exit status in ac_status, and log it. +# (This has been adapted from Autoconf's _AC_RUN_LOG macro.) +AC_DEFUN([AM_RUN_LOG], +[{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD + ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + (exit $ac_status); }]) + +# Check to make sure that the build environment is sane. -*- Autoconf -*- + +# Copyright (C) 1996-2021 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) -# Just in case -sleep 1 -echo timestamp > conftest.file # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' @@ -838,32 +881,40 @@ case `pwd` in esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) - AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);; + AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; esac -# Do `set' in a subshell so we don't clobber the current shell's +# Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( - set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` - if test "$[*]" = "X"; then - # -L didn't work. - set X `ls -t "$srcdir/configure" conftest.file` - fi - rm -f conftest.file - if test "$[*]" != "X $srcdir/configure conftest.file" \ - && test "$[*]" != "X conftest.file $srcdir/configure"; then - - # If neither matched, then we have a broken ls. This can happen - # if, for instance, CONFIG_SHELL is bash and it inherits a - # broken ls alias from the environment. This has actually - # happened. Such a system could not be considered "sane". - AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken -alias in your environment]) - fi - + am_has_slept=no + for am_try in 1 2; do + echo "timestamp, slept: $am_has_slept" > conftest.file + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$[*]" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + if test "$[*]" != "X $srcdir/configure conftest.file" \ + && test "$[*]" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken + alias in your environment]) + fi + if test "$[2]" = conftest.file || test $am_try -eq 2; then + break + fi + # Just in case. + sleep 1 + am_has_slept=yes + done test "$[2]" = conftest.file ) then @@ -873,46 +924,118 @@ else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi -AC_MSG_RESULT(yes)]) +AC_MSG_RESULT([yes]) +# If we didn't sleep, we still need to ensure time stamps of config.status and +# generated files are strictly newer. +am_sleep_pid= +if grep 'slept: no' conftest.file >/dev/null 2>&1; then + ( sleep 1 ) & + am_sleep_pid=$! +fi +AC_CONFIG_COMMANDS_PRE( + [AC_MSG_CHECKING([that generated files are newer than configure]) + if test -n "$am_sleep_pid"; then + # Hide warnings about reused PIDs. + wait $am_sleep_pid 2>/dev/null + fi + AC_MSG_RESULT([done])]) +rm -f conftest.file +]) -# Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc. +# Copyright (C) 2009-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 1 +# AM_SILENT_RULES([DEFAULT]) +# -------------------------- +# Enable less verbose build rules; with the default set to DEFAULT +# ("yes" being less verbose, "no" or empty being verbose). +AC_DEFUN([AM_SILENT_RULES], +[AC_ARG_ENABLE([silent-rules], [dnl +AS_HELP_STRING( + [--enable-silent-rules], + [less verbose build output (undo: "make V=1")]) +AS_HELP_STRING( + [--disable-silent-rules], + [verbose build output (undo: "make V=0")])dnl +]) +case $enable_silent_rules in @%:@ ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; +esac +dnl +dnl A few 'make' implementations (e.g., NonStop OS and NextStep) +dnl do not support nested variable expansions. +dnl See automake bug#9928 and bug#10237. +am_make=${MAKE-make} +AC_CACHE_CHECK([whether $am_make supports nested variables], + [am_cv_make_support_nested_variables], + [if AS_ECHO([['TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi]) +if test $am_cv_make_support_nested_variables = yes; then + dnl Using '$V' instead of '$(V)' breaks IRIX make. + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AC_SUBST([AM_V])dnl +AM_SUBST_NOTMAKE([AM_V])dnl +AC_SUBST([AM_DEFAULT_V])dnl +AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl +AC_SUBST([AM_DEFAULT_VERBOSITY])dnl +AM_BACKSLASH='\' +AC_SUBST([AM_BACKSLASH])dnl +_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl +]) + +# Copyright (C) 2001-2021 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_STRIP # --------------------- -# One issue with vendor `install' (even GNU) is that you can't +# One issue with vendor 'install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we -# always use install-sh in `make install-strip', and initialize +# always use install-sh in "make install-strip", and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl -# Installed binaries are usually stripped using `strip' when the user -# run `make install-strip'. However `strip' might not be the right +# Installed binaries are usually stripped using 'strip' when the user +# run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake -# will honor the `STRIP' environment variable to overrule this program. -dnl Don't test for $cross_compiling = yes, because it might be `maybe'. +# will honor the 'STRIP' environment variable to overrule this program. +dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) -# Copyright (C) 2006, 2008, 2010 Free Software Foundation, Inc. +# Copyright (C) 2006-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 3 - # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. @@ -926,18 +1049,16 @@ AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- -# Copyright (C) 2004, 2005, 2012 Free Software Foundation, Inc. +# Copyright (C) 2004-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 2 - # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. -# FORMAT should be one of `v7', `ustar', or `pax'. +# FORMAT should be one of 'v7', 'ustar', or 'pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory @@ -947,76 +1068,114 @@ AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar +# AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AC_SUBST([AMTAR], ['$${TAR-tar}']) -m4_if([$1], [v7], - [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], - [m4_case([$1], [ustar],, [pax],, - [m4_fatal([Unknown tar format])]) -AC_MSG_CHECKING([how to create a $1 tar archive]) -# Loop over all known methods to create a tar archive until one works. + +# We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' -_am_tools=${am_cv_prog_tar_$1-$_am_tools} -# Do not fold the above two line into one, because Tru64 sh and -# Solaris sh will not grok spaces in the rhs of `-'. -for _am_tool in $_am_tools -do - case $_am_tool in - gnutar) - for _am_tar in tar gnutar gtar; - do - AM_RUN_LOG([$_am_tar --version]) && break - done - am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' - am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' - am__untar="$_am_tar -xf -" - ;; - plaintar) - # Must skip GNU tar: if it does not support --format= it doesn't create - # ustar tarball either. - (tar --version) >/dev/null 2>&1 && continue - am__tar='tar chf - "$$tardir"' - am__tar_='tar chf - "$tardir"' - am__untar='tar xf -' - ;; - pax) - am__tar='pax -L -x $1 -w "$$tardir"' - am__tar_='pax -L -x $1 -w "$tardir"' - am__untar='pax -r' - ;; - cpio) - am__tar='find "$$tardir" -print | cpio -o -H $1 -L' - am__tar_='find "$tardir" -print | cpio -o -H $1 -L' - am__untar='cpio -i -H $1 -d' - ;; - none) - am__tar=false - am__tar_=false - am__untar=false - ;; - esac - # If the value was cached, stop now. We just wanted to have am__tar - # and am__untar set. - test -n "${am_cv_prog_tar_$1}" && break +m4_if([$1], [v7], + [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], + + [m4_case([$1], + [ustar], + [# The POSIX 1988 'ustar' format is defined with fixed-size fields. + # There is notably a 21 bits limit for the UID and the GID. In fact, + # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 + # and bug#13588). + am_max_uid=2097151 # 2^21 - 1 + am_max_gid=$am_max_uid + # The $UID and $GID variables are not portable, so we need to resort + # to the POSIX-mandated id(1) utility. Errors in the 'id' calls + # below are definitely unexpected, so allow the users to see them + # (that is, avoid stderr redirection). + am_uid=`id -u || echo unknown` + am_gid=`id -g || echo unknown` + AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) + if test $am_uid -le $am_max_uid; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + _am_tools=none + fi + AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) + if test $am_gid -le $am_max_gid; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + _am_tools=none + fi], + + [pax], + [], + + [m4_fatal([Unknown tar format])]) + + AC_MSG_CHECKING([how to create a $1 tar archive]) + + # Go ahead even if we have the value already cached. We do so because we + # need to set the values for the 'am__tar' and 'am__untar' variables. + _am_tools=${am_cv_prog_tar_$1-$_am_tools} + + for _am_tool in $_am_tools; do + case $_am_tool in + gnutar) + for _am_tar in tar gnutar gtar; do + AM_RUN_LOG([$_am_tar --version]) && break + done + am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' + am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' + am__untar="$_am_tar -xf -" + ;; + plaintar) + # Must skip GNU tar: if it does not support --format= it doesn't create + # ustar tarball either. + (tar --version) >/dev/null 2>&1 && continue + am__tar='tar chf - "$$tardir"' + am__tar_='tar chf - "$tardir"' + am__untar='tar xf -' + ;; + pax) + am__tar='pax -L -x $1 -w "$$tardir"' + am__tar_='pax -L -x $1 -w "$tardir"' + am__untar='pax -r' + ;; + cpio) + am__tar='find "$$tardir" -print | cpio -o -H $1 -L' + am__tar_='find "$tardir" -print | cpio -o -H $1 -L' + am__untar='cpio -i -H $1 -d' + ;; + none) + am__tar=false + am__tar_=false + am__untar=false + ;; + esac - # tar/untar a dummy directory, and stop if the command works - rm -rf conftest.dir - mkdir conftest.dir - echo GrepMe > conftest.dir/file - AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) + # If the value was cached, stop now. We just wanted to have am__tar + # and am__untar set. + test -n "${am_cv_prog_tar_$1}" && break + + # tar/untar a dummy directory, and stop if the command works. + rm -rf conftest.dir + mkdir conftest.dir + echo GrepMe > conftest.dir/file + AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) + rm -rf conftest.dir + if test -s conftest.tar; then + AM_RUN_LOG([$am__untar /dev/null 2>&1 && break + fi + done rm -rf conftest.dir - if test -s conftest.tar; then - AM_RUN_LOG([$am__untar /dev/null 2>&1 && break - fi -done -rm -rf conftest.dir -AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) -AC_MSG_RESULT([$am_cv_prog_tar_$1])]) + AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) + AC_MSG_RESULT([$am_cv_prog_tar_$1])]) + AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR diff --git a/vendor/libssh2/buildconf b/vendor/libssh2/buildconf deleted file mode 100755 index 558dcb660f..0000000000 --- a/vendor/libssh2/buildconf +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/sh - -LIBTOOLIZE="libtoolize" - -if [ "x`which $LIBTOOLIZE`" = "x" ]; then - LIBTOOLIZE="glibtoolize" -fi - -if [ "x`which $LIBTOOLIZE`" = "x" ]; then - echo "Neither libtoolize nor glibtoolize could be found!" - exit 1 -fi - -${LIBTOOLIZE} --copy --automake --force -${ACLOCAL:-aclocal} -I m4 $ACLOCAL_FLAGS -${AUTOHEADER:-autoheader} -# copy the private libssh2_config.h.in to the examples dir so that -# it can be included without pointing the include path to the private -# source dir -cp src/libssh2_config.h.in example/libssh2_config.h.in -${AUTOCONF:-autoconf} -${AUTOMAKE:-automake} --add-missing --copy diff --git a/vendor/libssh2/cmake/CheckFunctionExistsMayNeedLibrary.cmake b/vendor/libssh2/cmake/CheckFunctionExistsMayNeedLibrary.cmake new file mode 100644 index 0000000000..8ac61abe5e --- /dev/null +++ b/vendor/libssh2/cmake/CheckFunctionExistsMayNeedLibrary.cmake @@ -0,0 +1,81 @@ +# Copyright (c) 2014 Alexander Lamaison +# +# 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 the copyright holder nor the names +# of any other 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. + + +# - check_function_exists_maybe_need_library( [lib1 ... libn]) +# +# Check if function is available for linking, first without extra libraries, and +# then, if not found that way, linking in each optional library as well. This +# function is similar to autotools AC_SEARCH_LIBS. +# +# If the function if found, this will define . +# +# If the function was only found by linking in an additional library, this +# will define NEED_LIB_LIBX, where LIBX is the one of lib1 to libn that +# makes the function available, in uppercase. +# +# The following variables may be set before calling this macro to +# modify the way the check is run: +# +# CMAKE_REQUIRED_FLAGS = string of compile command line flags +# CMAKE_REQUIRED_DEFINITIONS = list of macros to define (-DFOO=bar) +# CMAKE_REQUIRED_INCLUDES = list of include directories +# CMAKE_REQUIRED_LIBRARIES = list of libraries to link +# + +include(CheckFunctionExists) +include(CheckLibraryExists) + +function(check_function_exists_may_need_library function variable) + + check_function_exists(${function} ${variable}) + + if(NOT ${variable}) + foreach(lib ${ARGN}) + string(TOUPPER ${lib} UP_LIB) + # Use new variable to prevent cache from previous step shortcircuiting + # new test + check_library_exists(${lib} ${function} "" HAVE_${function}_IN_${lib}) + if(HAVE_${function}_IN_${lib}) + set(${variable} 1 CACHE INTERNAL + "Function ${function} found in library ${lib}") + set(NEED_LIB_${UP_LIB} 1 CACHE INTERNAL + "Need to link ${lib}") + break() + endif() + endforeach() + endif() + +endfunction() \ No newline at end of file diff --git a/vendor/libssh2/cmake/CheckNonblockingSocketSupport.cmake b/vendor/libssh2/cmake/CheckNonblockingSocketSupport.cmake new file mode 100644 index 0000000000..74f4776a68 --- /dev/null +++ b/vendor/libssh2/cmake/CheckNonblockingSocketSupport.cmake @@ -0,0 +1,119 @@ +include(CheckCSourceCompiles) + +# - check_nonblocking_socket_support() +# +# Check for how to set a socket to non-blocking state. There seems to exist +# four known different ways, with the one used almost everywhere being POSIX +# and XPG3, while the other different ways for different systems (old BSD, +# Windows and Amiga). +# +# One of the following variables will be set indicating the supported +# method (if any): +# HAVE_O_NONBLOCK +# HAVE_FIONBIO +# HAVE_IOCTLSOCKET +# HAVE_IOCTLSOCKET_CASE +# HAVE_SO_NONBLOCK +# HAVE_DISABLED_NONBLOCKING +# +# The following variables may be set before calling this macro to +# modify the way the check is run: +# +# CMAKE_REQUIRED_FLAGS = string of compile command line flags +# CMAKE_REQUIRED_DEFINITIONS = list of macros to define (-DFOO=bar) +# CMAKE_REQUIRED_INCLUDES = list of include directories +# CMAKE_REQUIRED_LIBRARIES = list of libraries to link +# +macro(check_nonblocking_socket_support) + # There are two known platforms (AIX 3.x and SunOS 4.1.x) where the + # O_NONBLOCK define is found but does not work. + check_c_source_compiles(" +#include +#include +#include + +#if defined(sun) || defined(__sun__) || defined(__SUNPRO_C) || defined(__SUNPRO_CC) +# if defined(__SVR4) || defined(__srv4__) +# define PLATFORM_SOLARIS +# else +# define PLATFORM_SUNOS4 +# endif +#endif +#if (defined(_AIX) || defined(__xlC__)) && !defined(_AIX41) +# define PLATFORM_AIX_V3 +#endif + +#if defined(PLATFORM_SUNOS4) || defined(PLATFORM_AIX_V3) || defined(__BEOS__) +#error \"O_NONBLOCK does not work on this platform\" +#endif + +int main() +{ + int socket; + int flags = fcntl(socket, F_SETFL, flags | O_NONBLOCK); +}" + HAVE_O_NONBLOCK) + + if(NOT HAVE_O_NONBLOCK) + check_c_source_compiles("/* FIONBIO test (old-style unix) */ +#include +#include + +int main() +{ + int socket; + int flags = ioctl(socket, FIONBIO, &flags); +}" + HAVE_FIONBIO) + + if(NOT HAVE_FIONBIO) + check_c_source_compiles("/* ioctlsocket test (Windows) */ +#undef inline +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN +#endif + +#include +#include + +int main() +{ + SOCKET sd; + unsigned long flags = 0; + sd = socket(0, 0, 0); + ioctlsocket(sd, FIONBIO, &flags); +}" + HAVE_IOCTLSOCKET) + + if(NOT HAVE_IOCTLSOCKET) + check_c_source_compiles("/* IoctlSocket test (Amiga?) */ +#include + +int main() +{ + int socket; + int flags = IoctlSocket(socket, FIONBIO, (long)1); +}" + HAVE_IOCTLSOCKET_CASE) + + if(NOT HAVE_IOCTLSOCKET_CASE) + check_c_source_compiles("/* SO_NONBLOCK test (BeOS) */ +#include + +int main() +{ + long b = 1; + int socket; + int flags = setsockopt(socket, SOL_SOCKET, SO_NONBLOCK, &b, sizeof(b)); +}" + HAVE_SO_NONBLOCK) + + if(NOT HAVE_SO_NONBLOCK) + # No non-blocking socket method found + set(HAVE_DISABLED_NONBLOCKING 1) + endif() + endif() + endif() + endif() + endif() +endmacro() \ No newline at end of file diff --git a/vendor/libssh2/cmake/CopyRuntimeDependencies.cmake b/vendor/libssh2/cmake/CopyRuntimeDependencies.cmake new file mode 100644 index 0000000000..083f762686 --- /dev/null +++ b/vendor/libssh2/cmake/CopyRuntimeDependencies.cmake @@ -0,0 +1,72 @@ +# Copyright (c) 2014 Alexander Lamaison +# +# 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 the copyright holder nor the names +# of any other 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. + +include(CMakeParseArguments) + +function(ADD_TARGET_TO_COPY_DEPENDENCIES) + set(options) + set(oneValueArgs TARGET) + set(multiValueArgs DEPENDENCIES BEFORE_TARGETS) + cmake_parse_arguments(COPY + "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) + + if(NOT COPY_DEPENDENCIES) + return() + endif() + + # Using a custom target to drive custom commands stops multiple + # parallel builds trying to kick off the commands at the same time + add_custom_target(${COPY_TARGET}) + + foreach(target ${COPY_BEFORE_TARGETS}) + add_dependencies(${target} ${COPY_TARGET}) + endforeach() + + foreach(dependency ${COPY_DEPENDENCIES}) + + add_custom_command( + TARGET ${COPY_TARGET} + DEPENDS ${dependency} + # Make directory first otherwise file is copied in place of + # directory instead of into it + COMMAND ${CMAKE_COMMAND} + ARGS -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR} + COMMAND ${CMAKE_COMMAND} + ARGS -E copy ${dependency} ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR} + VERBATIM) + + endforeach() + +endfunction() diff --git a/vendor/libssh2/cmake/FindLibgcrypt.cmake b/vendor/libssh2/cmake/FindLibgcrypt.cmake new file mode 100644 index 0000000000..44a79873d6 --- /dev/null +++ b/vendor/libssh2/cmake/FindLibgcrypt.cmake @@ -0,0 +1,53 @@ +# Copyright (c) 2014 Alexander Lamaison +# +# 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 the copyright holder nor the names +# of any other 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. + +# - Try to find Libgcrypt +# This will define all or none of: +# LIBGCRYPT_FOUND - if Libgcrypt headers and library was found +# LIBGCRYPT_INCLUDE_DIRS - The Libgcrypt include directories +# LIBGCRYPT_LIBRARIES - The libraries needed to use Libgcrypt + +find_path(LIBGCRYPT_INCLUDE_DIR gcrypt.h) + +find_library(LIBGCRYPT_LIBRARY NAMES gcrypt libgcrypt) + +set(LIBGCRYPT_LIBRARIES ${LIBGCRYPT_LIBRARY}) +set(LIBGCRYPT_INCLUDE_DIRS ${LIBGCRYPT_INCLUDE_DIR}) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(Libgcrypt DEFAULT_MSG + LIBGCRYPT_LIBRARY LIBGCRYPT_INCLUDE_DIR) + +mark_as_advanced(LIBGCRYPT_INCLUDE_DIR LIBGCRYPT_LIBRARY) \ No newline at end of file diff --git a/vendor/libssh2/cmake/FindmbedTLS.cmake b/vendor/libssh2/cmake/FindmbedTLS.cmake new file mode 100644 index 0000000000..2f4adbc519 --- /dev/null +++ b/vendor/libssh2/cmake/FindmbedTLS.cmake @@ -0,0 +1,64 @@ +# - Try to find mbedTLS +# Once done this will define +# +# Read-Only variables +# MBEDTLS_FOUND - system has mbedTLS +# MBEDTLS_INCLUDE_DIR - the mbedTLS include directory +# MBEDTLS_LIBRARY_DIR - the mbedTLS library directory +# MBEDTLS_LIBRARIES - Link these to use mbedTLS +# MBEDTLS_LIBRARY - path to mbedTLS library +# MBEDX509_LIBRARY - path to mbedTLS X.509 library +# MBEDCRYPTO_LIBRARY - path to mbedTLS Crypto library + +FIND_PATH(MBEDTLS_INCLUDE_DIR mbedtls/version.h) + +IF(MBEDTLS_INCLUDE_DIR AND MBEDTLS_LIBRARIES) + # Already in cache, be silent + SET(MBEDTLS_FIND_QUIETLY TRUE) +ENDIF() + +FIND_LIBRARY(MBEDTLS_LIBRARY NAMES mbedtls libmbedtls libmbedx509) +FIND_LIBRARY(MBEDX509_LIBRARY NAMES mbedx509 libmbedx509) +FIND_LIBRARY(MBEDCRYPTO_LIBRARY NAMES mbedcrypto libmbedcrypto) + +IF(MBEDTLS_INCLUDE_DIR AND MBEDTLS_LIBRARY AND MBEDX509_LIBRARY AND MBEDCRYPTO_LIBRARY) + SET(MBEDTLS_FOUND TRUE) +ENDIF() + +IF(MBEDTLS_FOUND) + # split mbedTLS into -L and -l linker options, so we can set them for pkg-config + GET_FILENAME_COMPONENT(MBEDTLS_LIBRARY_DIR ${MBEDTLS_LIBRARY} PATH) + GET_FILENAME_COMPONENT(MBEDTLS_LIBRARY_FILE ${MBEDTLS_LIBRARY} NAME_WE) + GET_FILENAME_COMPONENT(MBEDX509_LIBRARY_FILE ${MBEDX509_LIBRARY} NAME_WE) + GET_FILENAME_COMPONENT(MBEDCRYPTO_LIBRARY_FILE ${MBEDCRYPTO_LIBRARY} NAME_WE) + STRING(REGEX REPLACE "^lib" "" MBEDTLS_LIBRARY_FILE ${MBEDTLS_LIBRARY_FILE}) + STRING(REGEX REPLACE "^lib" "" MBEDX509_LIBRARY_FILE ${MBEDX509_LIBRARY_FILE}) + STRING(REGEX REPLACE "^lib" "" MBEDCRYPTO_LIBRARY_FILE ${MBEDCRYPTO_LIBRARY_FILE}) + SET(MBEDTLS_LIBRARIES "-L${MBEDTLS_LIBRARY_DIR} -l${MBEDTLS_LIBRARY_FILE} -l${MBEDX509_LIBRARY_FILE} -l${MBEDCRYPTO_LIBRARY_FILE}") + + IF(NOT MBEDTLS_FIND_QUIETLY) + MESSAGE(STATUS "Found mbedTLS:") + FILE(READ ${MBEDTLS_INCLUDE_DIR}/mbedtls/version.h MBEDTLSCONTENT) + STRING(REGEX MATCH "MBEDTLS_VERSION_STRING +\"[0-9|.]+\"" MBEDTLSMATCH ${MBEDTLSCONTENT}) + IF (MBEDTLSMATCH) + STRING(REGEX REPLACE "MBEDTLS_VERSION_STRING +\"([0-9|.]+)\"" "\\1" MBEDTLS_VERSION ${MBEDTLSMATCH}) + MESSAGE(STATUS " version ${MBEDTLS_VERSION}") + ENDIF(MBEDTLSMATCH) + MESSAGE(STATUS " TLS: ${MBEDTLS_LIBRARY}") + MESSAGE(STATUS " X509: ${MBEDX509_LIBRARY}") + MESSAGE(STATUS " Crypto: ${MBEDCRYPTO_LIBRARY}") + ENDIF(NOT MBEDTLS_FIND_QUIETLY) +ELSE(MBEDTLS_FOUND) + IF(MBEDTLS_FIND_REQUIRED) + MESSAGE(FATAL_ERROR "Could not find mbedTLS") + ENDIF(MBEDTLS_FIND_REQUIRED) +ENDIF(MBEDTLS_FOUND) + +MARK_AS_ADVANCED( + MBEDTLS_INCLUDE_DIR + MBEDTLS_LIBRARY_DIR + MBEDTLS_LIBRARIES + MBEDTLS_LIBRARY + MBEDX509_LIBRARY + MBEDCRYPTO_LIBRARY +) diff --git a/vendor/libssh2/cmake/SocketLibraries.cmake b/vendor/libssh2/cmake/SocketLibraries.cmake new file mode 100644 index 0000000000..bfbbd711e3 --- /dev/null +++ b/vendor/libssh2/cmake/SocketLibraries.cmake @@ -0,0 +1,64 @@ +# Copyright (c) 2014 Alexander Lamaison +# +# 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 the copyright holder nor the names +# of any other 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. + +# Some systems have their socket functions in a library. +# (Solaris -lsocket/-lnsl, Windows -lws2_32). This macro appends those +# libraries to the given list +macro(append_needed_socket_libraries LIBRARIES_LIST) + if(CMAKE_SYSTEM_NAME STREQUAL "Windows" AND CMAKE_SIZEOF_VOID_P EQUAL 4) + # x86 Windows uses STDCALL for these functions, so their names are mangled, + # meaning the platform checks don't work. Hardcoding these until we get + # a better solution. + set(HAVE_SOCKET 1) + set(HAVE_SELECT 1) + set(HAVE_INET_ADDR 1) + set(NEED_LIB_WS2_32 1) + else() + check_function_exists_may_need_library(socket HAVE_SOCKET socket ws2_32) + check_function_exists_may_need_library(select HAVE_SELECT ws2_32) + check_function_exists_may_need_library(inet_addr HAVE_INET_ADDR nsl ws2_32) + endif() + + if(NEED_LIB_SOCKET) + list(APPEND ${LIBRARIES_LIST} socket) + endif() + if(NEED_LIB_NSL) + list(APPEND ${LIBRARIES_LIST} nsl) + endif() + if(NEED_LIB_WS2_32) + list(APPEND ${LIBRARIES_LIST} ws2_32) + endif() + +endmacro() \ No newline at end of file diff --git a/vendor/libssh2/cmake/Toolchain-Linux-32.cmake b/vendor/libssh2/cmake/Toolchain-Linux-32.cmake new file mode 100644 index 0000000000..6aad9b1e2d --- /dev/null +++ b/vendor/libssh2/cmake/Toolchain-Linux-32.cmake @@ -0,0 +1,42 @@ +# Copyright (c) 2014 Alexander Lamaison +# +# 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 the copyright holder nor the names +# of any other 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. + +# Cross-compile 32-bit binary on 64-bit linux host +set(CMAKE_SYSTEM_NAME Linux) +set(CMAKE_SYSTEM_VERSION 1) +set(CMAKE_SYSTEM_PROCESSOR "i386") + +set(CMAKE_CXX_COMPILER_ARG1 "-m32") +set(CMAKE_C_COMPILER_ARG1 "-m32") \ No newline at end of file diff --git a/vendor/libssh2/cmake/max_warnings.cmake b/vendor/libssh2/cmake/max_warnings.cmake new file mode 100644 index 0000000000..b176d302d3 --- /dev/null +++ b/vendor/libssh2/cmake/max_warnings.cmake @@ -0,0 +1,23 @@ +if(MSVC) + # Use the highest warning level for visual studio. + if(CMAKE_CXX_FLAGS MATCHES "/W[0-4]") + string(REGEX REPLACE "/W[0-4]" "/W4" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") + else() + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4") + endif() + if(CMAKE_C_FLAGS MATCHES "/W[0-4]") + string(REGEX REPLACE "/W[0-4]" "/W4" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}") + else() + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /W4") + endif() + + # Disable broken warnings + add_definitions(-D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_DEPRECATE) +elseif(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX) + if(NOT CMAKE_CXX_FLAGS MATCHES "-Wall") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall") + endif() + if(NOT CMAKE_C_FLAGS MATCHES "-Wall") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall") + endif() +endif() diff --git a/vendor/libssh2/compile b/vendor/libssh2/compile new file mode 100755 index 0000000000..23fcba0113 --- /dev/null +++ b/vendor/libssh2/compile @@ -0,0 +1,348 @@ +#! /bin/sh +# Wrapper for compilers which do not understand '-c -o'. + +scriptversion=2018-03-07.03; # UTC + +# Copyright (C) 1999-2020 Free Software Foundation, Inc. +# Written by Tom Tromey . +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# This file is maintained in Automake, please report +# bugs to or send patches to +# . + +nl=' +' + +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent tools from complaining about whitespace usage. +IFS=" "" $nl" + +file_conv= + +# func_file_conv build_file lazy +# Convert a $build file to $host form and store it in $file +# Currently only supports Windows hosts. If the determined conversion +# type is listed in (the comma separated) LAZY, no conversion will +# take place. +func_file_conv () +{ + file=$1 + case $file in + / | /[!/]*) # absolute file, and not a UNC file + if test -z "$file_conv"; then + # lazily determine how to convert abs files + case `uname -s` in + MINGW*) + file_conv=mingw + ;; + CYGWIN* | MSYS*) + file_conv=cygwin + ;; + *) + file_conv=wine + ;; + esac + fi + case $file_conv/,$2, in + *,$file_conv,*) + ;; + mingw/*) + file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` + ;; + cygwin/* | msys/*) + file=`cygpath -m "$file" || echo "$file"` + ;; + wine/*) + file=`winepath -w "$file" || echo "$file"` + ;; + esac + ;; + esac +} + +# func_cl_dashL linkdir +# Make cl look for libraries in LINKDIR +func_cl_dashL () +{ + func_file_conv "$1" + if test -z "$lib_path"; then + lib_path=$file + else + lib_path="$lib_path;$file" + fi + linker_opts="$linker_opts -LIBPATH:$file" +} + +# func_cl_dashl library +# Do a library search-path lookup for cl +func_cl_dashl () +{ + lib=$1 + found=no + save_IFS=$IFS + IFS=';' + for dir in $lib_path $LIB + do + IFS=$save_IFS + if $shared && test -f "$dir/$lib.dll.lib"; then + found=yes + lib=$dir/$lib.dll.lib + break + fi + if test -f "$dir/$lib.lib"; then + found=yes + lib=$dir/$lib.lib + break + fi + if test -f "$dir/lib$lib.a"; then + found=yes + lib=$dir/lib$lib.a + break + fi + done + IFS=$save_IFS + + if test "$found" != yes; then + lib=$lib.lib + fi +} + +# func_cl_wrapper cl arg... +# Adjust compile command to suit cl +func_cl_wrapper () +{ + # Assume a capable shell + lib_path= + shared=: + linker_opts= + for arg + do + if test -n "$eat"; then + eat= + else + case $1 in + -o) + # configure might choose to run compile as 'compile cc -o foo foo.c'. + eat=1 + case $2 in + *.o | *.[oO][bB][jJ]) + func_file_conv "$2" + set x "$@" -Fo"$file" + shift + ;; + *) + func_file_conv "$2" + set x "$@" -Fe"$file" + shift + ;; + esac + ;; + -I) + eat=1 + func_file_conv "$2" mingw + set x "$@" -I"$file" + shift + ;; + -I*) + func_file_conv "${1#-I}" mingw + set x "$@" -I"$file" + shift + ;; + -l) + eat=1 + func_cl_dashl "$2" + set x "$@" "$lib" + shift + ;; + -l*) + func_cl_dashl "${1#-l}" + set x "$@" "$lib" + shift + ;; + -L) + eat=1 + func_cl_dashL "$2" + ;; + -L*) + func_cl_dashL "${1#-L}" + ;; + -static) + shared=false + ;; + -Wl,*) + arg=${1#-Wl,} + save_ifs="$IFS"; IFS=',' + for flag in $arg; do + IFS="$save_ifs" + linker_opts="$linker_opts $flag" + done + IFS="$save_ifs" + ;; + -Xlinker) + eat=1 + linker_opts="$linker_opts $2" + ;; + -*) + set x "$@" "$1" + shift + ;; + *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) + func_file_conv "$1" + set x "$@" -Tp"$file" + shift + ;; + *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) + func_file_conv "$1" mingw + set x "$@" "$file" + shift + ;; + *) + set x "$@" "$1" + shift + ;; + esac + fi + shift + done + if test -n "$linker_opts"; then + linker_opts="-link$linker_opts" + fi + exec "$@" $linker_opts + exit 1 +} + +eat= + +case $1 in + '') + echo "$0: No command. Try '$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: compile [--help] [--version] PROGRAM [ARGS] + +Wrapper for compilers which do not understand '-c -o'. +Remove '-o dest.o' from ARGS, run PROGRAM with the remaining +arguments, and rename the output as expected. + +If you are trying to build a whole package this is not the +right script to run: please start by reading the file 'INSTALL'. + +Report bugs to . +EOF + exit $? + ;; + -v | --v*) + echo "compile $scriptversion" + exit $? + ;; + cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \ + icl | *[/\\]icl | icl.exe | *[/\\]icl.exe ) + func_cl_wrapper "$@" # Doesn't return... + ;; +esac + +ofile= +cfile= + +for arg +do + if test -n "$eat"; then + eat= + else + case $1 in + -o) + # configure might choose to run compile as 'compile cc -o foo foo.c'. + # So we strip '-o arg' only if arg is an object. + eat=1 + case $2 in + *.o | *.obj) + ofile=$2 + ;; + *) + set x "$@" -o "$2" + shift + ;; + esac + ;; + *.c) + cfile=$1 + set x "$@" "$1" + shift + ;; + *) + set x "$@" "$1" + shift + ;; + esac + fi + shift +done + +if test -z "$ofile" || test -z "$cfile"; then + # If no '-o' option was seen then we might have been invoked from a + # pattern rule where we don't need one. That is ok -- this is a + # normal compilation that the losing compiler can handle. If no + # '.c' file was seen then we are probably linking. That is also + # ok. + exec "$@" +fi + +# Name of file we expect compiler to create. +cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` + +# Create the lock directory. +# Note: use '[/\\:.-]' here to ensure that we don't use the same name +# that we are using for the .o file. Also, base the name on the expected +# object file name, since that is what matters with a parallel build. +lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d +while true; do + if mkdir "$lockdir" >/dev/null 2>&1; then + break + fi + sleep 1 +done +# FIXME: race condition here if user kills between mkdir and trap. +trap "rmdir '$lockdir'; exit 1" 1 2 15 + +# Run the compile. +"$@" +ret=$? + +if test -f "$cofile"; then + test "$cofile" = "$ofile" || mv "$cofile" "$ofile" +elif test -f "${cofile}bj"; then + test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" +fi + +rmdir "$lockdir" +exit $ret + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC0" +# time-stamp-end: "; # UTC" +# End: diff --git a/vendor/libssh2/config.guess b/vendor/libssh2/config.guess index d622a44e55..f50dcdb6de 100755 --- a/vendor/libssh2/config.guess +++ b/vendor/libssh2/config.guess @@ -1,14 +1,12 @@ #! /bin/sh # Attempt to guess a canonical system name. -# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, -# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, -# 2011, 2012 Free Software Foundation, Inc. +# Copyright 1992-2018 Free Software Foundation, Inc. -timestamp='2012-02-10' +timestamp='2018-02-24' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or +# the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but @@ -17,24 +15,22 @@ timestamp='2012-02-10' # General Public License for more details. # # You should have received a copy of the GNU General Public License -# along with this program; if not, see . +# along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - - -# Originally written by Per Bothner. Please send patches (context -# diff format) to and include a ChangeLog -# entry. +# the same distribution terms that you use for the rest of that +# program. This Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). # -# This script attempts to guess a canonical system name similar to -# config.sub. If it succeeds, it prints the system name on stdout, and -# exits with 0. Otherwise, it exits with 1. +# Originally written by Per Bothner; maintained since 2000 by Ben Elliston. # # You can get the latest version of this script from: -# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD +# https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess +# +# Please send patches to . + me=`echo "$0" | sed -e 's,.*/,,'` @@ -43,7 +39,7 @@ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. -Operation modes: +Options: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit @@ -54,9 +50,7 @@ version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. -Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, -2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 -Free Software Foundation, Inc. +Copyright 1992-2018 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." @@ -113,9 +107,9 @@ trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in - ,,) echo "int x;" > $dummy.c ; + ,,) echo "int x;" > "$dummy.c" ; for c in cc gcc c89 c99 ; do - if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then + if ($c -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; @@ -138,9 +132,37 @@ UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown +case "$UNAME_SYSTEM" in +Linux|GNU|GNU/*) + # If the system lacks a compiler, then just pick glibc. + # We could probably try harder. + LIBC=gnu + + eval "$set_cc_for_build" + cat <<-EOF > "$dummy.c" + #include + #if defined(__UCLIBC__) + LIBC=uclibc + #elif defined(__dietlibc__) + LIBC=dietlibc + #else + LIBC=gnu + #endif + EOF + eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'`" + + # If ldd exists, use it to detect musl libc. + if command -v ldd >/dev/null && \ + ldd --version 2>&1 | grep -q ^musl + then + LIBC=musl + fi + ;; +esac + # Note: order is significant - the case branches are not exclusive. -case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in +case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, @@ -153,21 +175,31 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" - UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ - /usr/sbin/$sysctl 2>/dev/null || echo unknown)` - case "${UNAME_MACHINE_ARCH}" in + UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \ + "/sbin/$sysctl" 2>/dev/null || \ + "/usr/sbin/$sysctl" 2>/dev/null || \ + echo unknown)` + case "$UNAME_MACHINE_ARCH" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; - *) machine=${UNAME_MACHINE_ARCH}-unknown ;; + earmv*) + arch=`echo "$UNAME_MACHINE_ARCH" | sed -e 's,^e\(armv[0-9]\).*$,\1,'` + endian=`echo "$UNAME_MACHINE_ARCH" | sed -ne 's,^.*\(eb\)$,\1,p'` + machine="${arch}${endian}"-unknown + ;; + *) machine="$UNAME_MACHINE_ARCH"-unknown ;; esac # The Operating System including object format, if it has switched - # to ELF recently, or will in the future. - case "${UNAME_MACHINE_ARCH}" in + # to ELF recently (or will in the future) and ABI. + case "$UNAME_MACHINE_ARCH" in + earm*) + os=netbsdelf + ;; arm*|i386|m68k|ns32k|sh3*|sparc|vax) - eval $set_cc_for_build + eval "$set_cc_for_build" if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ELF__ then @@ -182,40 +214,67 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in os=netbsd ;; esac + # Determine ABI tags. + case "$UNAME_MACHINE_ARCH" in + earm*) + expr='s/^earmv[0-9]/-eabi/;s/eb$//' + abi=`echo "$UNAME_MACHINE_ARCH" | sed -e "$expr"` + ;; + esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. - case "${UNAME_VERSION}" in + case "$UNAME_VERSION" in Debian*) release='-gnu' ;; *) - release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + release=`echo "$UNAME_RELEASE" | sed -e 's/[-_].*//' | cut -d. -f1,2` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. - echo "${machine}-${os}${release}" + echo "$machine-${os}${release}${abi}" + exit ;; + *:Bitrig:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` + echo "$UNAME_MACHINE_ARCH"-unknown-bitrig"$UNAME_RELEASE" exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` - echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} + echo "$UNAME_MACHINE_ARCH"-unknown-openbsd"$UNAME_RELEASE" + exit ;; + *:LibertyBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'` + echo "$UNAME_MACHINE_ARCH"-unknown-libertybsd"$UNAME_RELEASE" + exit ;; + *:MidnightBSD:*:*) + echo "$UNAME_MACHINE"-unknown-midnightbsd"$UNAME_RELEASE" exit ;; *:ekkoBSD:*:*) - echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} + echo "$UNAME_MACHINE"-unknown-ekkobsd"$UNAME_RELEASE" exit ;; *:SolidBSD:*:*) - echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} + echo "$UNAME_MACHINE"-unknown-solidbsd"$UNAME_RELEASE" exit ;; macppc:MirBSD:*:*) - echo powerpc-unknown-mirbsd${UNAME_RELEASE} + echo powerpc-unknown-mirbsd"$UNAME_RELEASE" exit ;; *:MirBSD:*:*) - echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} + echo "$UNAME_MACHINE"-unknown-mirbsd"$UNAME_RELEASE" + exit ;; + *:Sortix:*:*) + echo "$UNAME_MACHINE"-unknown-sortix exit ;; + *:Redox:*:*) + echo "$UNAME_MACHINE"-unknown-redox + exit ;; + mips:OSF1:*.*) + echo mips-dec-osf1 + exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) @@ -232,63 +291,54 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") - UNAME_MACHINE="alpha" ;; + UNAME_MACHINE=alpha ;; "EV4.5 (21064)") - UNAME_MACHINE="alpha" ;; + UNAME_MACHINE=alpha ;; "LCA4 (21066/21068)") - UNAME_MACHINE="alpha" ;; + UNAME_MACHINE=alpha ;; "EV5 (21164)") - UNAME_MACHINE="alphaev5" ;; + UNAME_MACHINE=alphaev5 ;; "EV5.6 (21164A)") - UNAME_MACHINE="alphaev56" ;; + UNAME_MACHINE=alphaev56 ;; "EV5.6 (21164PC)") - UNAME_MACHINE="alphapca56" ;; + UNAME_MACHINE=alphapca56 ;; "EV5.7 (21164PC)") - UNAME_MACHINE="alphapca57" ;; + UNAME_MACHINE=alphapca57 ;; "EV6 (21264)") - UNAME_MACHINE="alphaev6" ;; + UNAME_MACHINE=alphaev6 ;; "EV6.7 (21264A)") - UNAME_MACHINE="alphaev67" ;; + UNAME_MACHINE=alphaev67 ;; "EV6.8CB (21264C)") - UNAME_MACHINE="alphaev68" ;; + UNAME_MACHINE=alphaev68 ;; "EV6.8AL (21264B)") - UNAME_MACHINE="alphaev68" ;; + UNAME_MACHINE=alphaev68 ;; "EV6.8CX (21264D)") - UNAME_MACHINE="alphaev68" ;; + UNAME_MACHINE=alphaev68 ;; "EV6.9A (21264/EV69A)") - UNAME_MACHINE="alphaev69" ;; + UNAME_MACHINE=alphaev69 ;; "EV7 (21364)") - UNAME_MACHINE="alphaev7" ;; + UNAME_MACHINE=alphaev7 ;; "EV7.9 (21364A)") - UNAME_MACHINE="alphaev79" ;; + UNAME_MACHINE=alphaev79 ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. - echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + echo "$UNAME_MACHINE"-dec-osf"`echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`" # Reset EXIT trap before exiting to avoid spurious non-zero exit code. exitcode=$? trap '' 0 exit $exitcode ;; - Alpha\ *:Windows_NT*:*) - # How do we know it's Interix rather than the generic POSIX subsystem? - # Should we change UNAME_MACHINE based on the output of uname instead - # of the specific Alpha model? - echo alpha-pc-interix - exit ;; - 21064:Windows_NT:50:3) - echo alpha-dec-winnt3.5 - exit ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) - echo ${UNAME_MACHINE}-unknown-amigaos + echo "$UNAME_MACHINE"-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) - echo ${UNAME_MACHINE}-unknown-morphos + echo "$UNAME_MACHINE"-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition @@ -300,9 +350,9 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) - echo arm-acorn-riscix${UNAME_RELEASE} + echo arm-acorn-riscix"$UNAME_RELEASE" exit ;; - arm:riscos:*:*|arm:RISCOS:*:*) + arm*:riscos:*:*|arm*:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) @@ -327,38 +377,38 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in sparc) echo sparc-icl-nx7; exit ;; esac ;; s390x:SunOS:*:*) - echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + echo "$UNAME_MACHINE"-ibm-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`" exit ;; sun4H:SunOS:5.*:*) - echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + echo sparc-hal-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) - echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + echo sparc-sun-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`" exit ;; i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) - echo i386-pc-auroraux${UNAME_RELEASE} + echo i386-pc-auroraux"$UNAME_RELEASE" exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) - eval $set_cc_for_build - SUN_ARCH="i386" + eval "$set_cc_for_build" + SUN_ARCH=i386 # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. - if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then + if [ "$CC_FOR_BUILD" != no_compiler_found ]; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ - (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then - SUN_ARCH="x86_64" + SUN_ARCH=x86_64 fi fi - echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + echo "$SUN_ARCH"-pc-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. - echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + echo sparc-sun-solaris3"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" exit ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in @@ -367,25 +417,25 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. - echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` + echo sparc-sun-sunos"`echo "$UNAME_RELEASE"|sed -e 's/-/_/'`" exit ;; sun3*:SunOS:*:*) - echo m68k-sun-sunos${UNAME_RELEASE} + echo m68k-sun-sunos"$UNAME_RELEASE" exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` - test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 + test "x$UNAME_RELEASE" = x && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) - echo m68k-sun-sunos${UNAME_RELEASE} + echo m68k-sun-sunos"$UNAME_RELEASE" ;; sun4) - echo sparc-sun-sunos${UNAME_RELEASE} + echo sparc-sun-sunos"$UNAME_RELEASE" ;; esac exit ;; aushp:SunOS:*:*) - echo sparc-auspex-sunos${UNAME_RELEASE} + echo sparc-auspex-sunos"$UNAME_RELEASE" exit ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not @@ -396,44 +446,44 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) - echo m68k-atari-mint${UNAME_RELEASE} + echo m68k-atari-mint"$UNAME_RELEASE" exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) - echo m68k-atari-mint${UNAME_RELEASE} + echo m68k-atari-mint"$UNAME_RELEASE" exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) - echo m68k-atari-mint${UNAME_RELEASE} + echo m68k-atari-mint"$UNAME_RELEASE" exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) - echo m68k-milan-mint${UNAME_RELEASE} + echo m68k-milan-mint"$UNAME_RELEASE" exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) - echo m68k-hades-mint${UNAME_RELEASE} + echo m68k-hades-mint"$UNAME_RELEASE" exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) - echo m68k-unknown-mint${UNAME_RELEASE} + echo m68k-unknown-mint"$UNAME_RELEASE" exit ;; m68k:machten:*:*) - echo m68k-apple-machten${UNAME_RELEASE} + echo m68k-apple-machten"$UNAME_RELEASE" exit ;; powerpc:machten:*:*) - echo powerpc-apple-machten${UNAME_RELEASE} + echo powerpc-apple-machten"$UNAME_RELEASE" exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) - echo mips-dec-ultrix${UNAME_RELEASE} + echo mips-dec-ultrix"$UNAME_RELEASE" exit ;; VAX*:ULTRIX*:*:*) - echo vax-dec-ultrix${UNAME_RELEASE} + echo vax-dec-ultrix"$UNAME_RELEASE" exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) - echo clipper-intergraph-clix${UNAME_RELEASE} + echo clipper-intergraph-clix"$UNAME_RELEASE" exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c + eval "$set_cc_for_build" + sed 's/^ //' << EOF > "$dummy.c" #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { @@ -442,23 +492,23 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) - printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); + printf ("mips-mips-riscos%ssysv\\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) - printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); + printf ("mips-mips-riscos%ssvr4\\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) - printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); + printf ("mips-mips-riscos%sbsd\\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF - $CC_FOR_BUILD -o $dummy $dummy.c && - dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && - SYSTEM_NAME=`$dummy $dummyarg` && + $CC_FOR_BUILD -o "$dummy" "$dummy.c" && + dummyarg=`echo "$UNAME_RELEASE" | sed -n 's/\([0-9]*\).*/\1/p'` && + SYSTEM_NAME=`"$dummy" "$dummyarg"` && { echo "$SYSTEM_NAME"; exit; } - echo mips-mips-riscos${UNAME_RELEASE} + echo mips-mips-riscos"$UNAME_RELEASE" exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax @@ -484,17 +534,17 @@ EOF AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` - if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] + if [ "$UNAME_PROCESSOR" = mc88100 ] || [ "$UNAME_PROCESSOR" = mc88110 ] then - if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ - [ ${TARGET_BINARY_INTERFACE}x = x ] + if [ "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx ] || \ + [ "$TARGET_BINARY_INTERFACE"x = x ] then - echo m88k-dg-dgux${UNAME_RELEASE} + echo m88k-dg-dgux"$UNAME_RELEASE" else - echo m88k-dg-dguxbcs${UNAME_RELEASE} + echo m88k-dg-dguxbcs"$UNAME_RELEASE" fi else - echo i586-dg-dgux${UNAME_RELEASE} + echo i586-dg-dgux"$UNAME_RELEASE" fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) @@ -511,7 +561,7 @@ EOF echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) - echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` + echo mips-sgi-irix"`echo "$UNAME_RELEASE"|sed -e 's/-/_/g'`" exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id @@ -523,14 +573,14 @@ EOF if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else - IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + IBM_REV="$UNAME_VERSION.$UNAME_RELEASE" fi - echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} + echo "$UNAME_MACHINE"-ibm-aix"$IBM_REV" exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c + eval "$set_cc_for_build" + sed 's/^ //' << EOF > "$dummy.c" #include main() @@ -541,7 +591,7 @@ EOF exit(0); } EOF - if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` + if $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` then echo "$SYSTEM_NAME" else @@ -555,26 +605,27 @@ EOF exit ;; *:AIX:*:[4567]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` - if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then + if /usr/sbin/lsattr -El "$IBM_CPU_ID" | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi - if [ -x /usr/bin/oslevel ] ; then - IBM_REV=`/usr/bin/oslevel` + if [ -x /usr/bin/lslpp ] ; then + IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | + awk -F: '{ print $3 }' | sed s/[0-9]*$/0/` else - IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + IBM_REV="$UNAME_VERSION.$UNAME_RELEASE" fi - echo ${IBM_ARCH}-ibm-aix${IBM_REV} + echo "$IBM_ARCH"-ibm-aix"$IBM_REV" exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; - ibmrt:4.4BSD:*|romp-ibm:BSD:*) + ibmrt:4.4BSD:*|romp-ibm:4.4BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and - echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to + echo romp-ibm-bsd"$UNAME_RELEASE" # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx @@ -589,28 +640,28 @@ EOF echo m68k-hp-bsd4.4 exit ;; 9000/[34678]??:HP-UX:*:*) - HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` - case "${UNAME_MACHINE}" in - 9000/31? ) HP_ARCH=m68000 ;; - 9000/[34]?? ) HP_ARCH=m68k ;; + HPUX_REV=`echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//'` + case "$UNAME_MACHINE" in + 9000/31?) HP_ARCH=m68000 ;; + 9000/[34]??) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` - case "${sc_cpu_version}" in - 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 - 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 + case "$sc_cpu_version" in + 523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0 + 528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 - case "${sc_kernel_bits}" in - 32) HP_ARCH="hppa2.0n" ;; - 64) HP_ARCH="hppa2.0w" ;; - '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 + case "$sc_kernel_bits" in + 32) HP_ARCH=hppa2.0n ;; + 64) HP_ARCH=hppa2.0w ;; + '') HP_ARCH=hppa2.0 ;; # HP-UX 10.20 esac ;; esac fi - if [ "${HP_ARCH}" = "" ]; then - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c + if [ "$HP_ARCH" = "" ]; then + eval "$set_cc_for_build" + sed 's/^ //' << EOF > "$dummy.c" #define _HPUX_SOURCE #include @@ -643,13 +694,13 @@ EOF exit (0); } EOF - (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` + (CCOPTS="" $CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null) && HP_ARCH=`"$dummy"` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac - if [ ${HP_ARCH} = "hppa2.0w" ] + if [ "$HP_ARCH" = hppa2.0w ] then - eval $set_cc_for_build + eval "$set_cc_for_build" # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler @@ -660,23 +711,23 @@ EOF # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 - if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | + if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | grep -q __LP64__ then - HP_ARCH="hppa2.0w" + HP_ARCH=hppa2.0w else - HP_ARCH="hppa64" + HP_ARCH=hppa64 fi fi - echo ${HP_ARCH}-hp-hpux${HPUX_REV} + echo "$HP_ARCH"-hp-hpux"$HPUX_REV" exit ;; ia64:HP-UX:*:*) - HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` - echo ia64-hp-hpux${HPUX_REV} + HPUX_REV=`echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//'` + echo ia64-hp-hpux"$HPUX_REV" exit ;; 3050*:HI-UX:*:*) - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c + eval "$set_cc_for_build" + sed 's/^ //' << EOF > "$dummy.c" #include int main () @@ -701,11 +752,11 @@ EOF exit (0); } EOF - $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && + $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; - 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:*) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) @@ -714,7 +765,7 @@ EOF *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; - hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:*) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) @@ -722,9 +773,9 @@ EOF exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then - echo ${UNAME_MACHINE}-unknown-osf1mk + echo "$UNAME_MACHINE"-unknown-osf1mk else - echo ${UNAME_MACHINE}-unknown-osf1 + echo "$UNAME_MACHINE"-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) @@ -749,124 +800,109 @@ EOF echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) - echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + echo ymp-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*[A-Z]90:*:*:*) - echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ + echo "$UNAME_MACHINE"-cray-unicos"$UNAME_RELEASE" \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) - echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + echo t90-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) - echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + echo alphaev5-cray-unicosmk"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) - echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + echo sv1-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) - echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + echo craynv-cray-unicosmp"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) - FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` - FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` - FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` + FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` + FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` + FUJITSU_REL=`echo "$UNAME_RELEASE" | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) - FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` - FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` + FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` + FUJITSU_REL=`echo "$UNAME_RELEASE" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) - echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} + echo "$UNAME_MACHINE"-pc-bsdi"$UNAME_RELEASE" exit ;; sparc*:BSD/OS:*:*) - echo sparc-unknown-bsdi${UNAME_RELEASE} + echo sparc-unknown-bsdi"$UNAME_RELEASE" exit ;; *:BSD/OS:*:*) - echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} + echo "$UNAME_MACHINE"-unknown-bsdi"$UNAME_RELEASE" exit ;; *:FreeBSD:*:*) UNAME_PROCESSOR=`/usr/bin/uname -p` - case ${UNAME_PROCESSOR} in + case "$UNAME_PROCESSOR" in amd64) - echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; - *) - echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + UNAME_PROCESSOR=x86_64 ;; + i386) + UNAME_PROCESSOR=i586 ;; esac + echo "$UNAME_PROCESSOR"-unknown-freebsd"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`" exit ;; i*:CYGWIN*:*) - echo ${UNAME_MACHINE}-pc-cygwin + echo "$UNAME_MACHINE"-pc-cygwin exit ;; - *:MINGW*:*) - echo ${UNAME_MACHINE}-pc-mingw32 + *:MINGW64*:*) + echo "$UNAME_MACHINE"-pc-mingw64 exit ;; - i*:MSYS*:*) - echo ${UNAME_MACHINE}-pc-msys + *:MINGW*:*) + echo "$UNAME_MACHINE"-pc-mingw32 exit ;; - i*:windows32*:*) - # uname -m includes "-pc" on this system. - echo ${UNAME_MACHINE}-mingw32 + *:MSYS*:*) + echo "$UNAME_MACHINE"-pc-msys exit ;; i*:PW*:*) - echo ${UNAME_MACHINE}-pc-pw32 + echo "$UNAME_MACHINE"-pc-pw32 exit ;; *:Interix*:*) - case ${UNAME_MACHINE} in + case "$UNAME_MACHINE" in x86) - echo i586-pc-interix${UNAME_RELEASE} + echo i586-pc-interix"$UNAME_RELEASE" exit ;; authenticamd | genuineintel | EM64T) - echo x86_64-unknown-interix${UNAME_RELEASE} + echo x86_64-unknown-interix"$UNAME_RELEASE" exit ;; IA64) - echo ia64-unknown-interix${UNAME_RELEASE} + echo ia64-unknown-interix"$UNAME_RELEASE" exit ;; esac ;; - [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) - echo i${UNAME_MACHINE}-pc-mks - exit ;; - 8664:Windows_NT:*) - echo x86_64-pc-mks - exit ;; - i*:Windows_NT*:* | Pentium*:Windows_NT*:*) - # How do we know it's Interix rather than the generic POSIX subsystem? - # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we - # UNAME_MACHINE based on the output of uname instead of i386? - echo i586-pc-interix - exit ;; i*:UWIN*:*) - echo ${UNAME_MACHINE}-pc-uwin + echo "$UNAME_MACHINE"-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; - p*:CYGWIN*:*) - echo powerpcle-unknown-cygwin - exit ;; prep*:SunOS:5.*:*) - echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + echo powerpcle-unknown-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" exit ;; *:GNU:*:*) # the GNU system - echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` + echo "`echo "$UNAME_MACHINE"|sed -e 's,[-/].*$,,'`-unknown-$LIBC`echo "$UNAME_RELEASE"|sed -e 's,/.*$,,'`" exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland - echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu + echo "$UNAME_MACHINE-unknown-`echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"``echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`-$LIBC" exit ;; i*86:Minix:*:*) - echo ${UNAME_MACHINE}-pc-minix + echo "$UNAME_MACHINE"-pc-minix exit ;; aarch64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in @@ -879,63 +915,64 @@ EOF EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep -q ld.so.1 - if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi - echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} + if test "$?" = 0 ; then LIBC=gnulibc1 ; fi + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + arc:Linux:*:* | arceb:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; arm*:Linux:*:*) - eval $set_cc_for_build + eval "$set_cc_for_build" if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" else if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then - echo ${UNAME_MACHINE}-unknown-linux-gnueabi + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabi else - echo ${UNAME_MACHINE}-unknown-linux-gnueabihf + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabihf fi fi exit ;; avr32*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; cris:Linux:*:*) - echo ${UNAME_MACHINE}-axis-linux-gnu + echo "$UNAME_MACHINE"-axis-linux-"$LIBC" exit ;; crisv32:Linux:*:*) - echo ${UNAME_MACHINE}-axis-linux-gnu + echo "$UNAME_MACHINE"-axis-linux-"$LIBC" + exit ;; + e2k:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; frv:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; hexagon:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; i*86:Linux:*:*) - LIBC=gnu - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - #ifdef __dietlibc__ - LIBC=dietlibc - #endif -EOF - eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` - echo "${UNAME_MACHINE}-pc-linux-${LIBC}" + echo "$UNAME_MACHINE"-pc-linux-"$LIBC" exit ;; ia64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + k1om:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; m32r*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; m68*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; mips:Linux:*:* | mips64:Linux:*:*) - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c + eval "$set_cc_for_build" + sed 's/^ //' << EOF > "$dummy.c" #undef CPU #undef ${UNAME_MACHINE} #undef ${UNAME_MACHINE}el @@ -949,55 +986,74 @@ EOF #endif #endif EOF - eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` - test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } + eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU'`" + test "x$CPU" != x && { echo "$CPU-unknown-linux-$LIBC"; exit; } ;; - or32:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + mips64el:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + openrisc*:Linux:*:*) + echo or1k-unknown-linux-"$LIBC" + exit ;; + or32:Linux:*:* | or1k*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; padre:Linux:*:*) - echo sparc-unknown-linux-gnu + echo sparc-unknown-linux-"$LIBC" exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) - echo hppa64-unknown-linux-gnu + echo hppa64-unknown-linux-"$LIBC" exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in - PA7*) echo hppa1.1-unknown-linux-gnu ;; - PA8*) echo hppa2.0-unknown-linux-gnu ;; - *) echo hppa-unknown-linux-gnu ;; + PA7*) echo hppa1.1-unknown-linux-"$LIBC" ;; + PA8*) echo hppa2.0-unknown-linux-"$LIBC" ;; + *) echo hppa-unknown-linux-"$LIBC" ;; esac exit ;; ppc64:Linux:*:*) - echo powerpc64-unknown-linux-gnu + echo powerpc64-unknown-linux-"$LIBC" exit ;; ppc:Linux:*:*) - echo powerpc-unknown-linux-gnu + echo powerpc-unknown-linux-"$LIBC" + exit ;; + ppc64le:Linux:*:*) + echo powerpc64le-unknown-linux-"$LIBC" + exit ;; + ppcle:Linux:*:*) + echo powerpcle-unknown-linux-"$LIBC" + exit ;; + riscv32:Linux:*:* | riscv64:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; s390:Linux:*:* | s390x:Linux:*:*) - echo ${UNAME_MACHINE}-ibm-linux + echo "$UNAME_MACHINE"-ibm-linux-"$LIBC" exit ;; sh64*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; sh*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; tile*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; vax:Linux:*:*) - echo ${UNAME_MACHINE}-dec-linux-gnu + echo "$UNAME_MACHINE"-dec-linux-"$LIBC" exit ;; x86_64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + if objdump -f /bin/sh | grep -q elf32-x86-64; then + echo "$UNAME_MACHINE"-pc-linux-"$LIBC"x32 + else + echo "$UNAME_MACHINE"-pc-linux-"$LIBC" + fi exit ;; xtensa*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. @@ -1011,34 +1067,34 @@ EOF # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. - echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} + echo "$UNAME_MACHINE"-pc-sysv4.2uw"$UNAME_VERSION" exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. - echo ${UNAME_MACHINE}-pc-os2-emx + echo "$UNAME_MACHINE"-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) - echo ${UNAME_MACHINE}-unknown-stop + echo "$UNAME_MACHINE"-unknown-stop exit ;; i*86:atheos:*:*) - echo ${UNAME_MACHINE}-unknown-atheos + echo "$UNAME_MACHINE"-unknown-atheos exit ;; i*86:syllable:*:*) - echo ${UNAME_MACHINE}-pc-syllable + echo "$UNAME_MACHINE"-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) - echo i386-unknown-lynxos${UNAME_RELEASE} + echo i386-unknown-lynxos"$UNAME_RELEASE" exit ;; i*86:*DOS:*:*) - echo ${UNAME_MACHINE}-pc-msdosdjgpp + echo "$UNAME_MACHINE"-pc-msdosdjgpp exit ;; - i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) - UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` + i*86:*:4.*:*) + UNAME_REL=`echo "$UNAME_RELEASE" | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then - echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} + echo "$UNAME_MACHINE"-univel-sysv"$UNAME_REL" else - echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} + echo "$UNAME_MACHINE"-pc-sysv"$UNAME_REL" fi exit ;; i*86:*:5:[678]*) @@ -1048,12 +1104,12 @@ EOF *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac - echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} + echo "$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}{$UNAME_VERSION}" exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 @@ -1063,9 +1119,9 @@ EOF && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 - echo ${UNAME_MACHINE}-pc-sco$UNAME_REL + echo "$UNAME_MACHINE"-pc-sco"$UNAME_REL" else - echo ${UNAME_MACHINE}-pc-sysv32 + echo "$UNAME_MACHINE"-pc-sysv32 fi exit ;; pc:*:*:*) @@ -1073,7 +1129,7 @@ EOF # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i586. # Note: whatever this is, it MUST be the same as what config.sub - # prints for the "djgpp" host, or else GDB configury will decide that + # prints for the "djgpp" host, or else GDB configure will decide that # this is a cross-build. echo i586-pc-msdosdjgpp exit ;; @@ -1085,9 +1141,9 @@ EOF exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then - echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 + echo i860-stardent-sysv"$UNAME_RELEASE" # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. - echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 + echo i860-unknown-sysv"$UNAME_RELEASE" # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) @@ -1107,9 +1163,9 @@ EOF test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ - && { echo i486-ncr-sysv4.3${OS_REL}; exit; } + && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ - && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; @@ -1118,28 +1174,28 @@ EOF test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ - && { echo i486-ncr-sysv4.3${OS_REL}; exit; } + && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ - && { echo i586-ncr-sysv4.3${OS_REL}; exit; } + && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ - && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) - echo m68k-unknown-lynxos${UNAME_RELEASE} + echo m68k-unknown-lynxos"$UNAME_RELEASE" exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) - echo sparc-unknown-lynxos${UNAME_RELEASE} + echo sparc-unknown-lynxos"$UNAME_RELEASE" exit ;; rs6000:LynxOS:2.*:*) - echo rs6000-unknown-lynxos${UNAME_RELEASE} + echo rs6000-unknown-lynxos"$UNAME_RELEASE" exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) - echo powerpc-unknown-lynxos${UNAME_RELEASE} + echo powerpc-unknown-lynxos"$UNAME_RELEASE" exit ;; SM[BE]S:UNIX_SV:*:*) - echo mips-dde-sysv${UNAME_RELEASE} + echo mips-dde-sysv"$UNAME_RELEASE" exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 @@ -1150,7 +1206,7 @@ EOF *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` - echo ${UNAME_MACHINE}-sni-sysv4 + echo "$UNAME_MACHINE"-sni-sysv4 else echo ns32k-sni-sysv fi @@ -1170,23 +1226,23 @@ EOF exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. - echo ${UNAME_MACHINE}-stratus-vos + echo "$UNAME_MACHINE"-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) - echo m68k-apple-aux${UNAME_RELEASE} + echo m68k-apple-aux"$UNAME_RELEASE" exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then - echo mips-nec-sysv${UNAME_RELEASE} + echo mips-nec-sysv"$UNAME_RELEASE" else - echo mips-unknown-sysv${UNAME_RELEASE} + echo mips-unknown-sysv"$UNAME_RELEASE" fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. @@ -1201,66 +1257,97 @@ EOF BePC:Haiku:*:*) # Haiku running on Intel PC compatible. echo i586-pc-haiku exit ;; + x86_64:Haiku:*:*) + echo x86_64-unknown-haiku + exit ;; SX-4:SUPER-UX:*:*) - echo sx4-nec-superux${UNAME_RELEASE} + echo sx4-nec-superux"$UNAME_RELEASE" exit ;; SX-5:SUPER-UX:*:*) - echo sx5-nec-superux${UNAME_RELEASE} + echo sx5-nec-superux"$UNAME_RELEASE" exit ;; SX-6:SUPER-UX:*:*) - echo sx6-nec-superux${UNAME_RELEASE} + echo sx6-nec-superux"$UNAME_RELEASE" exit ;; SX-7:SUPER-UX:*:*) - echo sx7-nec-superux${UNAME_RELEASE} + echo sx7-nec-superux"$UNAME_RELEASE" exit ;; SX-8:SUPER-UX:*:*) - echo sx8-nec-superux${UNAME_RELEASE} + echo sx8-nec-superux"$UNAME_RELEASE" exit ;; SX-8R:SUPER-UX:*:*) - echo sx8r-nec-superux${UNAME_RELEASE} + echo sx8r-nec-superux"$UNAME_RELEASE" + exit ;; + SX-ACE:SUPER-UX:*:*) + echo sxace-nec-superux"$UNAME_RELEASE" exit ;; Power*:Rhapsody:*:*) - echo powerpc-apple-rhapsody${UNAME_RELEASE} + echo powerpc-apple-rhapsody"$UNAME_RELEASE" exit ;; *:Rhapsody:*:*) - echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} + echo "$UNAME_MACHINE"-apple-rhapsody"$UNAME_RELEASE" exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown - case $UNAME_PROCESSOR in - i386) - eval $set_cc_for_build - if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then - if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ - (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ - grep IS_64BIT_ARCH >/dev/null - then - UNAME_PROCESSOR="x86_64" - fi - fi ;; - unknown) UNAME_PROCESSOR=powerpc ;; - esac - echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} + eval "$set_cc_for_build" + if test "$UNAME_PROCESSOR" = unknown ; then + UNAME_PROCESSOR=powerpc + fi + if test "`echo "$UNAME_RELEASE" | sed -e 's/\..*//'`" -le 10 ; then + if [ "$CC_FOR_BUILD" != no_compiler_found ]; then + if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + case $UNAME_PROCESSOR in + i386) UNAME_PROCESSOR=x86_64 ;; + powerpc) UNAME_PROCESSOR=powerpc64 ;; + esac + fi + # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc + if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_PPC >/dev/null + then + UNAME_PROCESSOR=powerpc + fi + fi + elif test "$UNAME_PROCESSOR" = i386 ; then + # Avoid executing cc on OS X 10.9, as it ships with a stub + # that puts up a graphical alert prompting to install + # developer tools. Any system running Mac OS X 10.7 or + # later (Darwin 11 and later) is required to have a 64-bit + # processor. This is not true of the ARM version of Darwin + # that Apple uses in portable devices. + UNAME_PROCESSOR=x86_64 + fi + echo "$UNAME_PROCESSOR"-apple-darwin"$UNAME_RELEASE" exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` - if test "$UNAME_PROCESSOR" = "x86"; then + if test "$UNAME_PROCESSOR" = x86; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi - echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} + echo "$UNAME_PROCESSOR"-"$UNAME_MACHINE"-nto-qnx"$UNAME_RELEASE" exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; - NEO-?:NONSTOP_KERNEL:*:*) - echo neo-tandem-nsk${UNAME_RELEASE} + NEO-*:NONSTOP_KERNEL:*:*) + echo neo-tandem-nsk"$UNAME_RELEASE" + exit ;; + NSE-*:NONSTOP_KERNEL:*:*) + echo nse-tandem-nsk"$UNAME_RELEASE" exit ;; - NSE-?:NONSTOP_KERNEL:*:*) - echo nse-tandem-nsk${UNAME_RELEASE} + NSR-*:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk"$UNAME_RELEASE" exit ;; - NSR-?:NONSTOP_KERNEL:*:*) - echo nsr-tandem-nsk${UNAME_RELEASE} + NSV-*:NONSTOP_KERNEL:*:*) + echo nsv-tandem-nsk"$UNAME_RELEASE" + exit ;; + NSX-*:NONSTOP_KERNEL:*:*) + echo nsx-tandem-nsk"$UNAME_RELEASE" exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux @@ -1269,18 +1356,18 @@ EOF echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) - echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} + echo "$UNAME_MACHINE"-"$UNAME_SYSTEM"-"$UNAME_RELEASE" exit ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. - if test "$cputype" = "386"; then + if test "$cputype" = 386; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi - echo ${UNAME_MACHINE}-unknown-plan9 + echo "$UNAME_MACHINE"-unknown-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 @@ -1301,14 +1388,14 @@ EOF echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) - echo mips-sei-seiux${UNAME_RELEASE} + echo mips-sei-seiux"$UNAME_RELEASE" exit ;; *:DragonFly:*:*) - echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + echo "$UNAME_MACHINE"-unknown-dragonfly"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`" exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` - case "${UNAME_MACHINE}" in + case "$UNAME_MACHINE" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; @@ -1317,185 +1404,48 @@ EOF echo i386-pc-xenix exit ;; i*86:skyos:*:*) - echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' + echo "$UNAME_MACHINE"-pc-skyos"`echo "$UNAME_RELEASE" | sed -e 's/ .*$//'`" exit ;; i*86:rdos:*:*) - echo ${UNAME_MACHINE}-pc-rdos + echo "$UNAME_MACHINE"-pc-rdos exit ;; i*86:AROS:*:*) - echo ${UNAME_MACHINE}-pc-aros + echo "$UNAME_MACHINE"-pc-aros exit ;; x86_64:VMkernel:*:*) - echo ${UNAME_MACHINE}-unknown-esx + echo "$UNAME_MACHINE"-unknown-esx + exit ;; + amd64:Isilon\ OneFS:*:*) + echo x86_64-unknown-onefs exit ;; esac -#echo '(No uname command or uname output not recognized.)' 1>&2 -#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 - -eval $set_cc_for_build -cat >$dummy.c < -# include -#endif -main () -{ -#if defined (sony) -#if defined (MIPSEB) - /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, - I don't know.... */ - printf ("mips-sony-bsd\n"); exit (0); -#else -#include - printf ("m68k-sony-newsos%s\n", -#ifdef NEWSOS4 - "4" -#else - "" -#endif - ); exit (0); -#endif -#endif - -#if defined (__arm) && defined (__acorn) && defined (__unix) - printf ("arm-acorn-riscix\n"); exit (0); -#endif +echo "$0: unable to guess system type" >&2 -#if defined (hp300) && !defined (hpux) - printf ("m68k-hp-bsd\n"); exit (0); -#endif - -#if defined (NeXT) -#if !defined (__ARCHITECTURE__) -#define __ARCHITECTURE__ "m68k" -#endif - int version; - version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; - if (version < 4) - printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); - else - printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); - exit (0); -#endif - -#if defined (MULTIMAX) || defined (n16) -#if defined (UMAXV) - printf ("ns32k-encore-sysv\n"); exit (0); -#else -#if defined (CMU) - printf ("ns32k-encore-mach\n"); exit (0); -#else - printf ("ns32k-encore-bsd\n"); exit (0); -#endif -#endif -#endif - -#if defined (__386BSD__) - printf ("i386-pc-bsd\n"); exit (0); -#endif - -#if defined (sequent) -#if defined (i386) - printf ("i386-sequent-dynix\n"); exit (0); -#endif -#if defined (ns32000) - printf ("ns32k-sequent-dynix\n"); exit (0); -#endif -#endif +case "$UNAME_MACHINE:$UNAME_SYSTEM" in + mips:Linux | mips64:Linux) + # If we got here on MIPS GNU/Linux, output extra information. + cat >&2 < -# if defined (BSD) -# if BSD == 43 - printf ("vax-dec-bsd4.3\n"); exit (0); -# else -# if BSD == 199006 - printf ("vax-dec-bsd4.3reno\n"); exit (0); -# else - printf ("vax-dec-bsd\n"); exit (0); -# endif -# endif -# else - printf ("vax-dec-bsd\n"); exit (0); -# endif -# else - printf ("vax-dec-ultrix\n"); exit (0); -# endif -#endif - -#if defined (alliant) && defined (i860) - printf ("i860-alliant-bsd\n"); exit (0); -#endif - - exit (1); -} +NOTE: MIPS GNU/Linux systems require a C compiler to fully recognize +the system type. Please install a C compiler and try again. EOF - -$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && - { echo "$SYSTEM_NAME"; exit; } - -# Apollos put the system type in the environment. - -test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } - -# Convex versions that predate uname can use getsysinfo(1) - -if [ -x /usr/convex/getsysinfo ] -then - case `getsysinfo -f cpu_type` in - c1*) - echo c1-convex-bsd - exit ;; - c2*) - if getsysinfo -f scalar_acc - then echo c32-convex-bsd - else echo c2-convex-bsd - fi - exit ;; - c34*) - echo c34-convex-bsd - exit ;; - c38*) - echo c38-convex-bsd - exit ;; - c4*) - echo c4-convex-bsd - exit ;; - esac -fi + ;; +esac cat >&2 < in order to provide the needed -information to handle your system. +If $0 has already been updated, send the following data and any +information you think might be pertinent to config-patches@gnu.org to +provide the necessary information to handle your system. config.guess timestamp = $timestamp @@ -1514,16 +1464,16 @@ hostinfo = `(hostinfo) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` -UNAME_MACHINE = ${UNAME_MACHINE} -UNAME_RELEASE = ${UNAME_RELEASE} -UNAME_SYSTEM = ${UNAME_SYSTEM} -UNAME_VERSION = ${UNAME_VERSION} +UNAME_MACHINE = "$UNAME_MACHINE" +UNAME_RELEASE = "$UNAME_RELEASE" +UNAME_SYSTEM = "$UNAME_SYSTEM" +UNAME_VERSION = "$UNAME_VERSION" EOF exit 1 # Local variables: -# eval: (add-hook 'write-file-hooks 'time-stamp) +# eval: (add-hook 'write-file-functions 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" diff --git a/vendor/libssh2/config.sub b/vendor/libssh2/config.sub index c894da4550..1d8e98bcee 100755 --- a/vendor/libssh2/config.sub +++ b/vendor/libssh2/config.sub @@ -1,36 +1,31 @@ #! /bin/sh # Configuration validation subroutine script. -# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, -# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, -# 2011, 2012 Free Software Foundation, Inc. +# Copyright 1992-2018 Free Software Foundation, Inc. -timestamp='2012-02-10' +timestamp='2018-02-22' -# This file is (in principle) common to ALL GNU software. -# The presence of a machine in this file suggests that SOME GNU software -# can handle that machine. It does not imply ALL GNU software can. -# -# This file is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. # # You should have received a copy of the GNU General Public License -# along with this program; if not, see . +# along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. +# the same distribution terms that you use for the rest of that +# program. This Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). -# Please send patches to . Submit a context -# diff and a properly formatted GNU ChangeLog entry. +# Please send patches to . # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. @@ -38,7 +33,7 @@ timestamp='2012-02-10' # Otherwise, we print the canonical config type on stdout and succeed. # You can get the latest version of this script from: -# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD +# https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases @@ -58,12 +53,11 @@ timestamp='2012-02-10' me=`echo "$0" | sed -e 's,.*/,,'` usage="\ -Usage: $0 [OPTION] CPU-MFR-OPSYS - $0 [OPTION] ALIAS +Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS Canonicalize a configuration name. -Operation modes: +Options: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit @@ -73,9 +67,7 @@ Report bugs and patches to ." version="\ GNU config.sub ($timestamp) -Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, -2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 -Free Software Foundation, Inc. +Copyright 1992-2018 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." @@ -102,7 +94,7 @@ while test $# -gt 0 ; do *local*) # First pass through any local machine types. - echo $1 + echo "$1" exit ;; * ) @@ -120,24 +112,24 @@ esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. -maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` +maybe_os=`echo "$1" | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ - linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ - knetbsd*-gnu* | netbsd*-gnu* | \ - kopensolaris*-gnu* | \ + linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ + knetbsd*-gnu* | netbsd*-gnu* | netbsd*-eabi* | \ + kopensolaris*-gnu* | cloudabi*-eabi* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os - basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + basic_machine=`echo "$1" | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; android-linux) os=-linux-android - basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown + basic_machine=`echo "$1" | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown ;; *) - basic_machine=`echo $1 | sed 's/-[^-]*$//'` - if [ $basic_machine != $1 ] - then os=`echo $1 | sed 's/.*-/-/'` + basic_machine=`echo "$1" | sed 's/-[^-]*$//'` + if [ "$basic_machine" != "$1" ] + then os=`echo "$1" | sed 's/.*-/-/'` else os=; fi ;; esac @@ -156,7 +148,7 @@ case $os in -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ - -apple | -axis | -knuth | -cray | -microblaze) + -apple | -axis | -knuth | -cray | -microblaze*) os= basic_machine=$1 ;; @@ -186,53 +178,56 @@ case $os in ;; -sco6) os=-sco5v6 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` ;; -sco5) os=-sco3.2v5 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` ;; -sco5v6*) # Don't forget version if it is 3.2v4 or newer. - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` ;; -udk*) - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` + ;; + -lynx*178) + os=-lynxos178 + ;; + -lynx*5) + os=-lynxos5 ;; -lynx*) os=-lynxos ;; -ptx*) - basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` - ;; - -windowsnt*) - os=`echo $os | sed -e 's/windowsnt/winnt/'` + basic_machine=`echo "$1" | sed -e 's/86-.*/86-sequent/'` ;; -psos*) os=-psos @@ -253,21 +248,25 @@ case $basic_machine in | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ - | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ - | be32 | be64 \ + | arc | arceb \ + | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \ + | avr | avr32 \ + | ba \ + | be32 | be64 \ | bfin \ - | c4x | clipper \ + | c4x | c8051 | clipper \ | d10v | d30v | dlx | dsp16xx \ - | epiphany \ - | fido | fr30 | frv \ + | e2k | epiphany \ + | fido | fr30 | frv | ft32 \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | hexagon \ - | i370 | i860 | i960 | ia64 \ + | i370 | i860 | i960 | ia16 | ia64 \ | ip2k | iq2000 \ + | k1om \ | le32 | le64 \ | lm32 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ - | maxq | mb | microblaze | mcore | mep | metag \ + | maxq | mb | microblaze | microblazeel | mcore | mep | metag \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ @@ -281,26 +280,30 @@ case $basic_machine in | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ + | mipsisa32r6 | mipsisa32r6el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ + | mipsisa64r6 | mipsisa64r6el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ + | mipsr5900 | mipsr5900el \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | moxie \ | mt \ | msp430 \ | nds32 | nds32le | nds32be \ - | nios | nios2 \ + | nios | nios2 | nios2eb | nios2el \ | ns16k | ns32k \ - | open8 \ - | or32 \ - | pdp10 | pdp11 | pj | pjl \ + | open8 | or1k | or1knd | or32 \ + | pdp10 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle \ + | pru \ | pyramid \ + | riscv32 | riscv64 \ | rl78 | rx \ | score \ - | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ + | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[234]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ @@ -308,7 +311,8 @@ case $basic_machine in | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ | ubicom32 \ | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ - | we32k \ + | visium \ + | wasm32 \ | x86 | xc16x | xstormy16 | xtensa \ | z8k | z80) basic_machine=$basic_machine-unknown @@ -322,11 +326,14 @@ case $basic_machine in c6x) basic_machine=tic6x-unknown ;; - m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip) + leon|leon[3-9]) + basic_machine=sparc-$basic_machine + ;; + m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip) basic_machine=$basic_machine-unknown os=-none ;; - m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) + m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65) ;; ms1) basic_machine=mt-unknown @@ -355,7 +362,7 @@ case $basic_machine in ;; # Object if more than one company name word. *-*-*) - echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + echo Invalid configuration \`"$1"\': machine \`"$basic_machine"\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. @@ -364,26 +371,29 @@ case $basic_machine in | aarch64-* | aarch64_be-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ - | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ + | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ + | ba-* \ | be32-* | be64-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* \ - | clipper-* | craynv-* | cydra-* \ + | c8051-* | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ - | elxsi-* \ + | e2k-* | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | hexagon-* \ - | i*86-* | i860-* | i960-* | ia64-* \ + | i*86-* | i860-* | i960-* | ia16-* | ia64-* \ | ip2k-* | iq2000-* \ + | k1om-* \ | le32-* | le64-* \ | lm32-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ - | m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \ + | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ + | microblaze-* | microblazeel-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ @@ -397,28 +407,34 @@ case $basic_machine in | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ + | mipsisa32r6-* | mipsisa32r6el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ + | mipsisa64r6-* | mipsisa64r6el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ + | mipsr5900-* | mipsr5900el-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nds32-* | nds32le-* | nds32be-* \ - | nios-* | nios2-* \ + | nios-* | nios2-* | nios2eb-* | nios2el-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | open8-* \ + | or1k*-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ + | pru-* \ | pyramid-* \ + | riscv32-* | riscv64-* \ | rl78-* | romp-* | rs6000-* | rx-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ - | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \ + | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx*-* \ | tahoe-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tile*-* \ @@ -426,6 +442,8 @@ case $basic_machine in | ubicom32-* \ | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ | vax-* \ + | visium-* \ + | wasm32-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* \ | xstormy16-* | xtensa*-* \ @@ -439,7 +457,7 @@ case $basic_machine in # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) - basic_machine=i386-unknown + basic_machine=i386-pc os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) @@ -473,7 +491,7 @@ case $basic_machine in basic_machine=x86_64-pc ;; amd64-*) - basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` + basic_machine=x86_64-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl @@ -502,6 +520,9 @@ case $basic_machine in basic_machine=i386-pc os=-aros ;; + asmjs) + basic_machine=asmjs-unknown + ;; aux) basic_machine=m68k-apple os=-aux @@ -515,7 +536,7 @@ case $basic_machine in os=-linux ;; blackfin-*) - basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` + basic_machine=bfin-`echo "$basic_machine" | sed 's/^[^-]*-//'` os=-linux ;; bluegene*) @@ -523,13 +544,13 @@ case $basic_machine in os=-cnk ;; c54x-*) - basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` + basic_machine=tic54x-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; c55x-*) - basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` + basic_machine=tic55x-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; c6x-*) - basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` + basic_machine=tic6x-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; c90) basic_machine=c90-cray @@ -618,10 +639,18 @@ case $basic_machine in basic_machine=rs6000-bull os=-bosx ;; - dpx2* | dpx2*-bull) + dpx2*) basic_machine=m68k-bull os=-sysv3 ;; + e500v[12]) + basic_machine=powerpc-unknown + os=$os"spe" + ;; + e500v[12]-*) + basic_machine=powerpc-`echo "$basic_machine" | sed 's/^[^-]*-//'` + os=$os"spe" + ;; ebmon29k) basic_machine=a29k-amd os=-ebmon @@ -711,9 +740,6 @@ case $basic_machine in hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; - hppa-next) - os=-nextstep3 - ;; hppaosf) basic_machine=hppa1.1-hp os=-osf @@ -726,26 +752,26 @@ case $basic_machine in basic_machine=i370-ibm ;; i*86v32) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; - i386-vsta | vsta) + vsta) basic_machine=i386-unknown os=-vsta ;; @@ -763,17 +789,17 @@ case $basic_machine in basic_machine=m68k-isi os=-sysv ;; + leon-*|leon[3-9]-*) + basic_machine=sparc-`echo "$basic_machine" | sed 's/-.*//'` + ;; m68knommu) basic_machine=m68k-unknown os=-linux ;; m68knommu-*) - basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` + basic_machine=m68k-`echo "$basic_machine" | sed 's/^[^-]*-//'` os=-linux ;; - m88k-omron*) - basic_machine=m88k-omron - ;; magnum | m3230) basic_machine=mips-mips os=-sysv @@ -782,11 +808,15 @@ case $basic_machine in basic_machine=ns32k-utek os=-sysv ;; - microblaze) + microblaze*) basic_machine=microblaze-xilinx ;; + mingw64) + basic_machine=x86_64-pc + os=-mingw64 + ;; mingw32) - basic_machine=i386-pc + basic_machine=i686-pc os=-mingw32 ;; mingw32ce) @@ -801,10 +831,10 @@ case $basic_machine in os=-mint ;; mips3*-*) - basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` + basic_machine=`echo "$basic_machine" | sed -e 's/mips3/mips64/'` ;; mips3*) - basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown + basic_machine=`echo "$basic_machine" | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k @@ -814,15 +844,19 @@ case $basic_machine in basic_machine=powerpc-unknown os=-morphos ;; + moxiebox) + basic_machine=moxie-unknown + os=-moxiebox + ;; msdos) basic_machine=i386-pc os=-msdos ;; ms1-*) - basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` + basic_machine=`echo "$basic_machine" | sed -e 's/ms1-/mt-/'` ;; msys) - basic_machine=i386-pc + basic_machine=i686-pc os=-msys ;; mvs) @@ -861,7 +895,7 @@ case $basic_machine in basic_machine=v70-nec os=-sysv ;; - next | m*-next ) + next | m*-next) basic_machine=m68k-next case $os in -nextstep* ) @@ -906,6 +940,12 @@ case $basic_machine in nsr-tandem) basic_machine=nsr-tandem ;; + nsv-tandem) + basic_machine=nsv-tandem + ;; + nsx-tandem) + basic_machine=nsx-tandem + ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf @@ -938,7 +978,7 @@ case $basic_machine in os=-linux ;; parisc-*) - basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` + basic_machine=hppa-`echo "$basic_machine" | sed 's/^[^-]*-//'` os=-linux ;; pbd) @@ -954,7 +994,7 @@ case $basic_machine in basic_machine=i386-pc ;; pc98-*) - basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` + basic_machine=i386-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc @@ -969,16 +1009,16 @@ case $basic_machine in basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) - basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` + basic_machine=i586-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) - basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + basic_machine=i686-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) - basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + basic_machine=i686-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; pentium4-*) - basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` + basic_machine=i786-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould @@ -988,23 +1028,23 @@ case $basic_machine in ppc | ppcbe) basic_machine=powerpc-unknown ;; ppc-* | ppcbe-*) - basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + basic_machine=powerpc-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; - ppcle | powerpclittle | ppc-le | powerpc-little) + ppcle | powerpclittle) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) - basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` + basic_machine=powerpcle-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; - ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` + ppc64-*) basic_machine=powerpc64-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; - ppc64le | powerpc64little | ppc64-le | powerpc64-little) + ppc64le | powerpc64little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) - basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` + basic_machine=powerpc64le-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm @@ -1013,7 +1053,11 @@ case $basic_machine in basic_machine=i586-unknown os=-pw32 ;; - rdos) + rdos | rdos64) + basic_machine=x86_64-pc + os=-rdos + ;; + rdos32) basic_machine=i386-pc os=-rdos ;; @@ -1054,17 +1098,10 @@ case $basic_machine in sequent) basic_machine=i386-sequent ;; - sh) - basic_machine=sh-hitachi - os=-hms - ;; sh5el) basic_machine=sh5le-unknown ;; - sh64) - basic_machine=sh64-unknown - ;; - sparclite-wrs | simso-wrs) + simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; @@ -1083,7 +1120,7 @@ case $basic_machine in os=-sysv4 ;; strongarm-* | thumb-*) - basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` + basic_machine=arm-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; sun2) basic_machine=m68000-sun @@ -1205,6 +1242,9 @@ case $basic_machine in basic_machine=hppa1.1-winbond os=-proelf ;; + x64) + basic_machine=x86_64-pc + ;; xbox) basic_machine=i686-pc os=-mingw32 @@ -1213,20 +1253,12 @@ case $basic_machine in basic_machine=xps100-honeywell ;; xscale-* | xscalee[bl]-*) - basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` + basic_machine=`echo "$basic_machine" | sed 's/^xscale/arm/'` ;; ymp) basic_machine=ymp-cray os=-unicos ;; - z8k-*-coff) - basic_machine=z8k-unknown - os=-sim - ;; - z80-*-coff) - basic_machine=z80-unknown - os=-sim - ;; none) basic_machine=none-none os=-none @@ -1255,10 +1287,6 @@ case $basic_machine in vax) basic_machine=vax-dec ;; - pdp10) - # there are many clones, so DEC is not a safe bet - basic_machine=pdp10-unknown - ;; pdp11) basic_machine=pdp11-dec ;; @@ -1268,9 +1296,6 @@ case $basic_machine in sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; - sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) - basic_machine=sparc-sun - ;; cydra) basic_machine=cydra-cydrome ;; @@ -1290,7 +1315,7 @@ case $basic_machine in # Make sure to match an already-canonicalized machine name. ;; *) - echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + echo Invalid configuration \`"$1"\': machine \`"$basic_machine"\' not recognized 1>&2 exit 1 ;; esac @@ -1298,10 +1323,10 @@ esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) - basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` + basic_machine=`echo "$basic_machine" | sed 's/digital.*/dec/'` ;; *-commodore*) - basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` + basic_machine=`echo "$basic_machine" | sed 's/commodore.*/cbm/'` ;; *) ;; @@ -1312,8 +1337,8 @@ esac if [ x"$os" != x"" ] then case $os in - # First match some system type aliases - # that might get confused with valid system types. + # First match some system type aliases that might get confused + # with valid system types. # -solaris* is a basic system type, with this one exception. -auroraux) os=-auroraux @@ -1324,45 +1349,48 @@ case $os in -solaris) os=-solaris2 ;; - -svr4*) - os=-sysv4 - ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; - # First accept the basic system types. + # es1800 is here to avoid being matched by es* (a different OS) + -es1800*) + os=-ose + ;; + # Now accept the basic system types. # The portable systems comes first. - # Each alternative MUST END IN A *, to match a version number. + # Each alternative MUST end in a * to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ - | -sym* | -kopensolaris* \ + | -sym* | -kopensolaris* | -plan9* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ - | -aos* | -aros* \ + | -aos* | -aros* | -cloudabi* | -sortix* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ - | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ - | -openbsd* | -solidbsd* \ + | -hiux* | -knetbsd* | -mirbsd* | -netbsd* \ + | -bitrig* | -openbsd* | -solidbsd* | -libertybsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ - | -chorusos* | -chorusrdb* | -cegcc* \ + | -chorusos* | -chorusrdb* | -cegcc* | -glidix* \ | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ - | -mingw32* | -linux-gnu* | -linux-android* \ - | -linux-newlib* | -linux-uclibc* \ - | -uxpv* | -beos* | -mpeix* | -udk* \ - | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ + | -midipix* | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ + | -linux-newlib* | -linux-musl* | -linux-uclibc* \ + | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \ + | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ - | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ + | -morphos* | -superux* | -rtmk* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ - | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*) + | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* \ + | -onefs* | -tirtos* | -phoenix* | -fuchsia* | -redox* | -bme* \ + | -midnightbsd*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) @@ -1379,12 +1407,12 @@ case $os in -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; - -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ - | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ + -sim | -xray | -os68k* | -v88r* \ + | -windows* | -osx | -abug | -netware* | -os9* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) - os=`echo $os | sed -e 's|mac|macos|'` + os=`echo "$os" | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc @@ -1393,10 +1421,10 @@ case $os in os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) - os=`echo $os | sed -e 's|sunos5|solaris2|'` + os=`echo "$os" | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) - os=`echo $os | sed -e 's|sunos6|solaris3|'` + os=`echo "$os" | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition @@ -1407,12 +1435,6 @@ case $os in -wince*) os=-wince ;; - -osfrose*) - os=-osfrose - ;; - -osf*) - os=-osf - ;; -utek*) os=-bsd ;; @@ -1437,7 +1459,7 @@ case $os in -nova*) os=-rtmk-nova ;; - -ns2 ) + -ns2) os=-nextstep2 ;; -nsk*) @@ -1459,7 +1481,7 @@ case $os in -oss*) os=-sysv3 ;; - -svr4) + -svr4*) os=-sysv4 ;; -svr3) @@ -1474,35 +1496,38 @@ case $os in -ose*) os=-ose ;; - -es1800*) - os=-ose - ;; - -xenix) - os=-xenix - ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; - -aros*) - os=-aros - ;; - -kaos*) - os=-kaos - ;; -zvmoe) os=-zvmoe ;; -dicos*) os=-dicos ;; + -pikeos*) + # Until real need of OS specific support for + # particular features comes up, bare metal + # configurations are quite functional. + case $basic_machine in + arm*) + os=-eabi + ;; + *) + os=-elf + ;; + esac + ;; -nacl*) ;; + -ios) + ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` - echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 + echo Invalid configuration \`"$1"\': system \`"$os"\' not recognized 1>&2 exit 1 ;; esac @@ -1537,6 +1562,12 @@ case $basic_machine in c4x-* | tic4x-*) os=-coff ;; + c8051-*) + os=-elf + ;; + hexagon-*) + os=-elf + ;; tic54x-*) os=-coff ;; @@ -1586,12 +1617,12 @@ case $basic_machine in sparc-* | *-sun) os=-sunos4.1.1 ;; + pru-*) + os=-elf + ;; *-be) os=-beos ;; - *-haiku) - os=-haiku - ;; *-ibm) os=-aix ;; @@ -1631,7 +1662,7 @@ case $basic_machine in m88k-omron*) os=-luna ;; - *-next ) + *-next) os=-nextstep ;; *-sequent) @@ -1646,9 +1677,6 @@ case $basic_machine in i370-*) os=-mvs ;; - *-next) - os=-nextstep3 - ;; *-gould) os=-sysv ;; @@ -1758,15 +1786,15 @@ case $basic_machine in vendor=stratus ;; esac - basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` + basic_machine=`echo "$basic_machine" | sed "s/unknown/$vendor/"` ;; esac -echo $basic_machine$os +echo "$basic_machine$os" exit # Local variables: -# eval: (add-hook 'write-file-hooks 'time-stamp) +# eval: (add-hook 'write-file-functions 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" diff --git a/vendor/libssh2/configure b/vendor/libssh2/configure index 0445d8ddab..1cbf782b18 100755 --- a/vendor/libssh2/configure +++ b/vendor/libssh2/configure @@ -1,11 +1,12 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for libssh2 -. +# Generated by GNU Autoconf 2.71 for libssh2 -. # # Report bugs to . # # -# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. +# Copyright (C) 1992-1996, 1998-2017, 2020-2021 Free Software Foundation, +# Inc. # # # This configure script is free software; the Free Software Foundation @@ -16,14 +17,16 @@ # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : +as_nop=: +if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 +then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST -else +else $as_nop case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( @@ -33,46 +36,46 @@ esac fi + +# Reset variables that may have inherited troublesome values from +# the environment. + +# IFS needs to be set, to space, tab, and newline, in precisely that order. +# (If _AS_PATH_WALK were called with IFS unset, it would have the +# side effect of setting IFS to empty, thus disabling word splitting.) +# Quoting is to prevent editors from complaining about space-tab. as_nl=' ' export as_nl -# Printing a long string crashes Solaris 7 /usr/bin/printf. -as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo -# Prefer a ksh shell builtin over an external printf program on Solaris, -# but without wasting forks for bash or zsh. -if test -z "$BASH_VERSION$ZSH_VERSION" \ - && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='print -r --' - as_echo_n='print -rn --' -elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='printf %s\n' - as_echo_n='printf %s' -else - if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then - as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' - as_echo_n='/usr/ucb/echo -n' - else - as_echo_body='eval expr "X$1" : "X\\(.*\\)"' - as_echo_n_body='eval - arg=$1; - case $arg in #( - *"$as_nl"*) - expr "X$arg" : "X\\(.*\\)$as_nl"; - arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; - esac; - expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" - ' - export as_echo_n_body - as_echo_n='sh -c $as_echo_n_body as_echo' - fi - export as_echo_body - as_echo='sh -c $as_echo_body as_echo' -fi +IFS=" "" $as_nl" + +PS1='$ ' +PS2='> ' +PS4='+ ' + +# Ensure predictable behavior from utilities with locale-dependent output. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# We cannot yet rely on "unset" to work, but we need these variables +# to be unset--not just set to an empty or harmless value--now, to +# avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct +# also avoids known problems related to "unset" and subshell syntax +# in other old shells (e.g. bash 2.01 and pdksh 5.2.14). +for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH +do eval test \${$as_var+y} \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done + +# Ensure that fds 0, 1, and 2 are open. +if (exec 3>&0) 2>/dev/null; then :; else exec 0&1) 2>/dev/null; then :; else exec 1>/dev/null; fi +if (exec 3>&2) ; then :; else exec 2>/dev/null; fi # The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then +if ${PATH_SEPARATOR+false} :; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || @@ -81,13 +84,6 @@ if test "${PATH_SEPARATOR+set}" != set; then fi -# IFS -# We need space, tab and new line, in precisely that order. Quoting is -# there to prevent editors from complaining about space-tab. -# (If _AS_PATH_WALK were called with IFS unset, it would disable word -# splitting by setting IFS to empty value.) -IFS=" "" $as_nl" - # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( @@ -96,8 +92,12 @@ case $0 in #(( for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + test -r "$as_dir$0" && as_myself=$as_dir$0 && break done IFS=$as_save_IFS @@ -109,30 +109,10 @@ if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then - $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi -# Unset variables that we do not need and which cause bugs (e.g. in -# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" -# suppresses any "Segmentation fault" message there. '((' could -# trigger a bug in pdksh 5.2.14. -for as_var in BASH_ENV ENV MAIL MAILPATH -do eval test x\${$as_var+set} = xset \ - && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : -done -PS1='$ ' -PS2='> ' -PS4='+ ' - -# NLS nuisances. -LC_ALL=C -export LC_ALL -LANGUAGE=C -export LANGUAGE - -# CDPATH. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. @@ -154,20 +134,22 @@ esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. -$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 -as_fn_exit 255 +printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 +exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then - as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : + as_bourne_compatible="as_nop=: +if test \${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 +then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST -else +else \$as_nop case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( @@ -187,18 +169,20 @@ as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } -if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : +if ( set x; as_fn_ret_success y && test x = \"\$1\" ) +then : -else +else \$as_nop exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 +blah=\$(echo \$(echo blah)) +test x\"\$blah\" = xblah || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 -test \$(( 1 + 1 )) = 2 || exit 1 test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' @@ -206,31 +190,40 @@ test \$(( 1 + 1 )) = 2 || exit 1 ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ - || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1" - if (eval "$as_required") 2>/dev/null; then : + || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1 +test \$(( 1 + 1 )) = 2 || exit 1" + if (eval "$as_required") 2>/dev/null +then : as_have_required=yes -else +else $as_nop as_have_required=no fi - if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : + if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null +then : -else +else $as_nop as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. - as_shell=$as_dir/$as_base + as_shell=$as_dir$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && - { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : + as_run=a "$as_shell" -c "$as_bourne_compatible""$as_required" 2>/dev/null +then : CONFIG_SHELL=$as_shell as_have_required=yes - if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : + if as_run=a "$as_shell" -c "$as_bourne_compatible""$as_suggested" 2>/dev/null +then : break 2 fi fi @@ -238,14 +231,21 @@ fi esac as_found=false done -$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && - { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : - CONFIG_SHELL=$SHELL as_have_required=yes -fi; } IFS=$as_save_IFS +if $as_found +then : + +else $as_nop + if { test -f "$SHELL" || test -f "$SHELL.exe"; } && + as_run=a "$SHELL" -c "$as_bourne_compatible""$as_required" 2>/dev/null +then : + CONFIG_SHELL=$SHELL as_have_required=yes +fi +fi - if test "x$CONFIG_SHELL" != x; then : + if test "x$CONFIG_SHELL" != x +then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also @@ -263,18 +263,19 @@ esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. -$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi - if test x$as_have_required = xno; then : - $as_echo "$0: This script requires a shell more modern than all" - $as_echo "$0: the shells that I found on your system." - if test x${ZSH_VERSION+set} = xset ; then - $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" - $as_echo "$0: be upgraded to zsh 4.3.4 or later." + if test x$as_have_required = xno +then : + printf "%s\n" "$0: This script requires a shell more modern than all" + printf "%s\n" "$0: the shells that I found on your system." + if test ${ZSH_VERSION+y} ; then + printf "%s\n" "$0: In particular, zsh $ZSH_VERSION has bugs and should" + printf "%s\n" "$0: be upgraded to zsh 4.3.4 or later." else - $as_echo "$0: Please tell bug-autoconf@gnu.org and + printf "%s\n" "$0: Please tell bug-autoconf@gnu.org and $0: libssh2-devel@cool.haxx.se about your system, including $0: any error possibly output before this message. Then $0: install a modern shell, or manually run the script @@ -302,6 +303,7 @@ as_fn_unset () } as_unset=as_fn_unset + # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. @@ -319,6 +321,14 @@ as_fn_exit () as_fn_set_status $1 exit $1 } # as_fn_exit +# as_fn_nop +# --------- +# Do nothing but, unlike ":", preserve the value of $?. +as_fn_nop () +{ + return $? +} +as_nop=as_fn_nop # as_fn_mkdir_p # ------------- @@ -333,7 +343,7 @@ as_fn_mkdir_p () as_dirs= while :; do case $as_dir in #( - *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" @@ -342,7 +352,7 @@ $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_dir" | +printf "%s\n" X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q @@ -381,12 +391,13 @@ as_fn_executable_p () # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. -if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null +then : eval 'as_fn_append () { eval $1+=\$2 }' -else +else $as_nop as_fn_append () { eval $1=\$$1\$2 @@ -398,18 +409,27 @@ fi # as_fn_append # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. -if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null +then : eval 'as_fn_arith () { as_val=$(( $* )) }' -else +else $as_nop as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith +# as_fn_nop +# --------- +# Do nothing but, unlike ":", preserve the value of $?. +as_fn_nop () +{ + return $? +} +as_nop=as_fn_nop # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- @@ -421,9 +441,9 @@ as_fn_error () as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi - $as_echo "$as_me: error: $2" >&2 + printf "%s\n" "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error @@ -450,7 +470,7 @@ as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X/"$0" | +printf "%s\n" X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q @@ -494,7 +514,7 @@ as_cr_alnum=$as_cr_Letters$as_cr_digits s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || - { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } + { printf "%s\n" "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall @@ -508,6 +528,10 @@ as_cr_alnum=$as_cr_Letters$as_cr_digits exit } + +# Determine whether it's possible to make 'echo' print without a newline. +# These variables are no longer used directly by Autoconf, but are AC_SUBSTed +# for compatibility with existing Makefiles. ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) @@ -521,6 +545,13 @@ case `echo -n x` in #((((( ECHO_N='-n';; esac +# For backward compatibility with old third-party macros, we provide +# the shell variables $as_echo and $as_echo_n. New code should use +# AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively. +as_echo='printf %s\n' +as_echo_n='printf %s' + + rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file @@ -598,40 +629,36 @@ PACKAGE_URL='' ac_unique_file="src" # Factoring default headers for most tests. ac_includes_default="\ -#include -#ifdef HAVE_SYS_TYPES_H -# include -#endif -#ifdef HAVE_SYS_STAT_H -# include +#include +#ifdef HAVE_STDIO_H +# include #endif -#ifdef STDC_HEADERS +#ifdef HAVE_STDLIB_H # include -# include -#else -# ifdef HAVE_STDLIB_H -# include -# endif #endif #ifdef HAVE_STRING_H -# if !defined STDC_HEADERS && defined HAVE_MEMORY_H -# include -# endif # include #endif -#ifdef HAVE_STRINGS_H -# include -#endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif +#ifdef HAVE_STRINGS_H +# include +#endif +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_SYS_STAT_H +# include +#endif #ifdef HAVE_UNISTD_H # include #endif" +ac_header_c_list= ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS @@ -639,15 +666,41 @@ LIBOBJS ALLOCA HAVE_SYS_UN_H_FALSE HAVE_SYS_UN_H_TRUE +USE_OSSFUZZ_STATIC_FALSE +USE_OSSFUZZ_STATIC_TRUE +USE_OSSFUZZ_FLAG_FALSE +USE_OSSFUZZ_FLAG_TRUE +LIB_FUZZING_ENGINE +USE_OSSFUZZERS_FALSE +USE_OSSFUZZERS_TRUE BUILD_EXAMPLES_FALSE BUILD_EXAMPLES_TRUE +CPP +LIBSREQUIRED LIBZ_PREFIX LTLIBZ LIBZ HAVE_LIBZ +WINCNG_FALSE +WINCNG_TRUE +MBEDTLS_FALSE +MBEDTLS_TRUE LIBGCRYPT_FALSE LIBGCRYPT_TRUE -LIBSREQUIRED +OPENSSL_FALSE +OPENSSL_TRUE +LIBBCRYPT_PREFIX +LTLIBBCRYPT +LIBBCRYPT +HAVE_LIBBCRYPT +LIBCRYPT32_PREFIX +LTLIBCRYPT32 +LIBCRYPT32 +HAVE_LIBCRYPT32 +LIBMBEDCRYPTO_PREFIX +LTLIBMBEDCRYPTO +LIBMBEDCRYPTO +HAVE_LIBMBEDCRYPTO LIBGCRYPT_PREFIX LTLIBGCRYPT LIBGCRYPT @@ -656,6 +709,8 @@ LIBSSL_PREFIX LTLIBSSL LIBSSL HAVE_LIBSSL +CXXCPP +LT_SYS_LIBRARY_PATH OTOOL64 OTOOL LIPO @@ -670,6 +725,8 @@ ac_ct_DUMPBIN DUMPBIN LD FGREP +EGREP +GREP LIBTOOL OBJDUMP DLLTOOL @@ -678,9 +735,12 @@ SSHD_FALSE SSHD_TRUE SSHD LN_S -EGREP -GREP -CPP +am__fastdepCXX_FALSE +am__fastdepCXX_TRUE +CXXDEPMODE +ac_ct_CXX +CXXFLAGS +CXX am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE @@ -688,7 +748,6 @@ am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE -am__quote am__include DEPDIR OBJEXT @@ -707,6 +766,9 @@ build_vendor build_cpu build LIBSSH2VER +CSCOPE +ETAGS +CTAGS am__untar am__tar AMTAR @@ -731,6 +793,10 @@ INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM SED +AM_BACKSLASH +AM_DEFAULT_VERBOSITY +AM_DEFAULT_V +AM_V MAINT MAINTAINER_MODE_FALSE MAINTAINER_MODE_TRUE @@ -753,6 +819,7 @@ infodir docdir oldincludedir includedir +runstatedir localstatedir sharedstatedir sysconfdir @@ -771,33 +838,41 @@ PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR -SHELL' +SHELL +am__quote' ac_subst_files='' ac_user_opts=' enable_option_checking enable_maintainer_mode +enable_silent_rules enable_dependency_tracking enable_shared enable_static with_pic enable_fast_install +with_aix_soname with_gnu_ld with_sysroot enable_libtool_lock enable_largefile -with_libgcrypt -with_openssl -with_libz +with_crypto enable_rpath with_libssl_prefix with_libgcrypt_prefix +with_libmbedcrypto_prefix +with_libcrypt32_prefix +with_libbcrypt_prefix +with_libz with_libz_prefix enable_crypt_none enable_mac_none enable_gex_new +enable_clear_memory enable_debug enable_hidden_symbols enable_examples_build +enable_ossfuzzers +enable_werror ' ac_precious_vars='build_alias host_alias @@ -807,6 +882,11 @@ CFLAGS LDFLAGS LIBS CPPFLAGS +CXX +CXXFLAGS +CCC +LT_SYS_LIBRARY_PATH +CXXCPP CPP' @@ -846,6 +926,7 @@ datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' +runstatedir='${localstatedir}/run' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' @@ -875,8 +956,6 @@ do *) ac_optarg=yes ;; esac - # Accept the important Cygnus configure options, so we can diagnose typos. - case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; @@ -917,9 +996,9 @@ do ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid feature name: $ac_useropt" + as_fn_error $? "invalid feature name: \`$ac_useropt'" ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" @@ -943,9 +1022,9 @@ do ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid feature name: $ac_useropt" + as_fn_error $? "invalid feature name: \`$ac_useropt'" ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" @@ -1098,6 +1177,15 @@ do | -silent | --silent | --silen | --sile | --sil) silent=yes ;; + -runstatedir | --runstatedir | --runstatedi | --runstated \ + | --runstate | --runstat | --runsta | --runst | --runs \ + | --run | --ru | --r) + ac_prev=runstatedir ;; + -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ + | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ + | --run=* | --ru=* | --r=*) + runstatedir=$ac_optarg ;; + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ @@ -1147,9 +1235,9 @@ do ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid package name: $ac_useropt" + as_fn_error $? "invalid package name: \`$ac_useropt'" ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" @@ -1163,9 +1251,9 @@ do ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid package name: $ac_useropt" + as_fn_error $? "invalid package name: \`$ac_useropt'" ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" @@ -1209,9 +1297,9 @@ Try \`$0 --help' for more information" *) # FIXME: should be removed in autoconf 3.0. - $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + printf "%s\n" "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && - $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + printf "%s\n" "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; @@ -1227,7 +1315,7 @@ if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; - *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; + *) printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi @@ -1235,7 +1323,7 @@ fi for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ - libdir localedir mandir + libdir localedir mandir runstatedir do eval ac_val=\$$ac_var # Remove trailing slashes. @@ -1291,7 +1379,7 @@ $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_myself" | +printf "%s\n" X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q @@ -1388,6 +1476,7 @@ Fine tuning of the installation directories: --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] @@ -1426,10 +1515,15 @@ Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] - --enable-maintainer-mode enable make rules and dependencies not useful - (and sometimes confusing) to the casual installer - --disable-dependency-tracking speeds up one-time build - --enable-dependency-tracking do not reject slow dependency extractors + --enable-maintainer-mode + enable make rules and dependencies not useful (and + sometimes confusing) to the casual installer + --enable-silent-rules less verbose build output (undo: "make V=1") + --disable-silent-rules verbose build output (undo: "make V=0") + --enable-dependency-tracking + do not reject slow dependency extractors + --disable-dependency-tracking + speeds up one-time build --enable-shared[=PKGS] build shared libraries [default=yes] --enable-static[=PKGS] build static libraries [default=yes] --enable-fast-install[=PKGS] @@ -1441,6 +1535,7 @@ Optional Features: --enable-mac-none Permit "none" MAC -- NOT RECOMMENDED --disable-gex-new Disable "new" diffie-hellman-group-exchange-sha1 method + --disable-clear-memory Disable clearing of memory before being freed --enable-debug Enable pedantic and debug options --disable-debug Disable debug options --enable-hidden-symbols Hide internal symbols in library @@ -1449,23 +1544,35 @@ Optional Features: --enable-examples-build Build example applications (this is the default) --disable-examples-build Do not build example applications + --enable-ossfuzzers Whether to generate the fuzzers for OSS-Fuzz + --enable-werror Enable compiler warnings as errors + --disable-werror Disable compiler warnings as errors Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-pic[=PKGS] try to use only PIC/non-PIC objects [default=use both] + --with-aix-soname=aix|svr4|both + shared library versioning (aka "SONAME") variant to + provide on AIX, [default=aix]. --with-gnu-ld assume the C compiler uses GNU ld [default=no] - --with-sysroot=DIR Search for dependent libraries within DIR - (or the compiler's sysroot if not specified). - --with-libgcrypt Use Libgcrypt for crypto - --with-openssl Use OpenSSL for crypto - --with-libz Use Libz for compression + --with-sysroot[=DIR] Search for dependent libraries within DIR (or the + compiler's sysroot if not specified). + --with-crypto=auto|openssl|libgcrypt|mbedtls|wincng + Select crypto backend (default: auto) --with-gnu-ld assume the C compiler uses GNU ld default=no --with-libssl-prefix[=DIR] search for libssl in DIR/include and DIR/lib --without-libssl-prefix don't search for libssl in includedir and libdir --with-libgcrypt-prefix[=DIR] search for libgcrypt in DIR/include and DIR/lib --without-libgcrypt-prefix don't search for libgcrypt in includedir and libdir + --with-libmbedcrypto-prefix[=DIR] search for libmbedcrypto in DIR/include and DIR/lib + --without-libmbedcrypto-prefix don't search for libmbedcrypto in includedir and libdir + --with-libcrypt32-prefix[=DIR] search for libcrypt32 in DIR/include and DIR/lib + --without-libcrypt32-prefix don't search for libcrypt32 in includedir and libdir + --with-libbcrypt-prefix[=DIR] search for libbcrypt in DIR/include and DIR/lib + --without-libbcrypt-prefix don't search for libbcrypt in includedir and libdir + --with-libz Use libz for compression --with-libz-prefix[=DIR] search for libz in DIR/include and DIR/lib --without-libz-prefix don't search for libz in includedir and libdir @@ -1477,6 +1584,11 @@ Some influential environment variables: LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory + CXX C++ compiler command + CXXFLAGS C++ compiler flags + LT_SYS_LIBRARY_PATH + User-defined run-time library search path. + CXXCPP C++ preprocessor CPP C preprocessor Use these variables to override the choices made by `configure' or to help @@ -1498,9 +1610,9 @@ if test "$ac_init_help" = "recursive"; then case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) - ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. - ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; @@ -1528,7 +1640,8 @@ esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } - # Check for guested configure. + # Check for configure.gnu first; this name is used for a wrapper for + # Metaconfig's "Configure" on case-insensitive file systems. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive @@ -1536,7 +1649,7 @@ ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix echo && $SHELL "$ac_srcdir/configure" --help=recursive else - $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + printf "%s\n" "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done @@ -1546,9 +1659,9 @@ test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF libssh2 configure - -generated by GNU Autoconf 2.69 +generated by GNU Autoconf 2.71 -Copyright (C) 2012 Free Software Foundation, Inc. +Copyright (C) 2021 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF @@ -1565,14 +1678,14 @@ fi ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext + rm -f conftest.$ac_objext conftest.beam if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 +printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then @@ -1580,14 +1693,15 @@ $as_echo "$ac_try_echo"; } >&5 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err - } && test -s conftest.$ac_objext; then : + } && test -s conftest.$ac_objext +then : ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 +else $as_nop + printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 @@ -1604,17 +1718,18 @@ fi ac_fn_c_check_type () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +printf %s "checking for $2... " >&6; } +if eval test \${$3+y} +then : + printf %s "(cached) " >&6 +else $as_nop eval "$3=no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int -main () +main (void) { if (sizeof ($2)) return 0; @@ -1622,12 +1737,13 @@ if (sizeof ($2)) return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int -main () +main (void) { if (sizeof (($2))) return 0; @@ -1635,101 +1751,23 @@ if (sizeof (($2))) return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : -else +else $as_nop eval "$3=yes" fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_type -# ac_fn_c_try_cpp LINENO -# ---------------------- -# Try to preprocess conftest.$ac_ext, and return whether this succeeded. -ac_fn_c_try_cpp () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if { { ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } > conftest.i && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} # ac_fn_c_try_cpp - -# ac_fn_c_try_run LINENO -# ---------------------- -# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes -# that executables *can* be run. -ac_fn_c_try_run () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' - { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; }; then : - ac_retval=0 -else - $as_echo "$as_me: program exited with status $ac_status" >&5 - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=$ac_status -fi - rm -rf conftest.dSYM conftest_ipa8_conftest.oo - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} # ac_fn_c_try_run - # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in @@ -1737,26 +1775,28 @@ fi ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +printf %s "checking for $2... " >&6; } +if eval test \${$3+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : eval "$3=yes" -else +else $as_nop eval "$3=no" fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile @@ -1767,14 +1807,14 @@ $as_echo "$ac_res" >&6; } ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext conftest$ac_exeext + rm -f conftest.$ac_objext conftest.beam conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 +printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then @@ -1782,17 +1822,18 @@ $as_echo "$ac_try_echo"; } >&5 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext - }; then : + } +then : ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 +else $as_nop + printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 @@ -1807,17 +1848,57 @@ fi } # ac_fn_c_try_link +# ac_fn_cxx_try_compile LINENO +# ---------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_cxx_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest.beam + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext +then : + ac_retval=0 +else $as_nop + printf "%s\n" "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_cxx_try_compile + # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +printf %s "checking for $2... " >&6; } +if eval test \${$3+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. @@ -1825,16 +1906,9 @@ else #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $2 (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif + which can conflict with char $2 (); below. */ +#include #undef $2 /* Override any GCC internal prototype to avoid an error. @@ -1852,136 +1926,284 @@ choke me #endif int -main () +main (void) { return $2 (); ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : eval "$3=yes" -else +else $as_nop eval "$3=no" fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func -# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES -# ------------------------------------------------------- -# Tests whether HEADER exists, giving a warning if it cannot be compiled using -# the include files in INCLUDES and setting the cache variable VAR -# accordingly. -ac_fn_c_check_header_mongrel () +# ac_fn_cxx_try_cpp LINENO +# ------------------------ +# Try to preprocess conftest.$ac_ext, and return whether this succeeded. +ac_fn_cxx_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if eval \${$3+:} false; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -else - # Is the header compilable? -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 -$as_echo_n "checking $2 usability... " >&6; } -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -#include <$2> -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_header_compiler=yes -else - ac_header_compiler=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 -$as_echo "$ac_header_compiler" >&6; } - -# Is the header present? -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 -$as_echo_n "checking $2 presence... " >&6; } -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include <$2> -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - ac_header_preproc=yes -else - ac_header_preproc=no -fi -rm -f conftest.err conftest.i conftest.$ac_ext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 -$as_echo "$ac_header_preproc" >&6; } - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( - yes:no: ) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 -$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} - ;; - no:yes:* ) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 -$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 -$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 -$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 -$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} -( $as_echo "## ----------------------------------------- ## -## Report this to libssh2-devel@cool.haxx.se ## -## ----------------------------------------- ##" - ) | sed "s/^/$as_me: WARNING: /" >&2 - ;; + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; esac - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else - eval "$3=\$ac_header_compiler" -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } > conftest.i && { + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || + test ! -s conftest.err + } +then : + ac_retval=0 +else $as_nop + printf "%s\n" "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval -} # ac_fn_c_check_header_mongrel -cat >config.log <<_ACEOF -This file contains any messages produced by compilers while -running configure, to aid debugging if configure makes a mistake. - -It was created by libssh2 $as_me -, which was -generated by GNU Autoconf 2.69. Invocation command line was - - $ $0 $@ +} # ac_fn_cxx_try_cpp -_ACEOF -exec 5>>config.log +# ac_fn_cxx_try_link LINENO +# ------------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. +ac_fn_cxx_try_link () { -cat <<_ASUNAME -## --------- ## -## Platform. ## -## --------- ## - -hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest.beam conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + test -x conftest$ac_exeext + } +then : + ac_retval=0 +else $as_nop + printf "%s\n" "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_cxx_try_link + +# ac_fn_c_try_run LINENO +# ---------------------- +# Try to run conftest.$ac_ext, and return whether this succeeded. Assumes that +# executables *can* be run. +ac_fn_c_try_run () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; } +then : + ac_retval=0 +else $as_nop + printf "%s\n" "$as_me: program exited with status $ac_status" >&5 + printf "%s\n" "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=$ac_status +fi + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_run + +# ac_fn_check_decl LINENO SYMBOL VAR INCLUDES EXTRA-OPTIONS FLAG-VAR +# ------------------------------------------------------------------ +# Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR +# accordingly. Pass EXTRA-OPTIONS to the compiler, using FLAG-VAR. +ac_fn_check_decl () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + as_decl_name=`echo $2|sed 's/ *(.*//'` + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5 +printf %s "checking whether $as_decl_name is declared... " >&6; } +if eval test \${$3+y} +then : + printf %s "(cached) " >&6 +else $as_nop + as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'` + eval ac_save_FLAGS=\$$6 + as_fn_append $6 " $5" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main (void) +{ +#ifndef $as_decl_name +#ifdef __cplusplus + (void) $as_decl_use; +#else + (void) $as_decl_name; +#endif +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + eval "$3=yes" +else $as_nop + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + eval $6=\$ac_save_FLAGS + +fi +eval ac_res=\$$3 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_check_decl + +# ac_fn_c_try_cpp LINENO +# ---------------------- +# Try to preprocess conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_cpp () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } > conftest.i && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + } +then : + ac_retval=0 +else $as_nop + printf "%s\n" "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_cpp +ac_configure_args_raw= +for ac_arg +do + case $ac_arg in + *\'*) + ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + as_fn_append ac_configure_args_raw " '$ac_arg'" +done + +case $ac_configure_args_raw in + *$as_nl*) + ac_safe_unquote= ;; + *) + ac_unsafe_z='|&;<>()$`\\"*?[ '' ' # This string ends in space, tab. + ac_unsafe_a="$ac_unsafe_z#~" + ac_safe_unquote="s/ '\\([^$ac_unsafe_a][^$ac_unsafe_z]*\\)'/ \\1/g" + ac_configure_args_raw=` printf "%s\n" "$ac_configure_args_raw" | sed "$ac_safe_unquote"`;; +esac + +cat >config.log <<_ACEOF +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by libssh2 $as_me -, which was +generated by GNU Autoconf 2.71. Invocation command line was + + $ $0$ac_configure_args_raw + +_ACEOF +exec 5>>config.log +{ +cat <<_ASUNAME +## --------- ## +## Platform. ## +## --------- ## + +hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` @@ -2004,8 +2226,12 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - $as_echo "PATH: $as_dir" + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + printf "%s\n" "PATH: $as_dir" done IFS=$as_save_IFS @@ -2040,7 +2266,7 @@ do | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) - ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; @@ -2075,11 +2301,13 @@ done # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? + # Sanitize IFS. + IFS=" "" $as_nl" # Save into config.log some information that might help in debugging. { echo - $as_echo "## ---------------- ## + printf "%s\n" "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo @@ -2090,8 +2318,8 @@ trap 'exit_status=$? case $ac_val in #( *${as_nl}*) case $ac_var in #( - *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 -$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( @@ -2115,7 +2343,7 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; ) echo - $as_echo "## ----------------- ## + printf "%s\n" "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo @@ -2123,14 +2351,14 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; do eval ac_val=\$$ac_var case $ac_val in - *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac - $as_echo "$ac_var='\''$ac_val'\''" + printf "%s\n" "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then - $as_echo "## ------------------- ## + printf "%s\n" "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo @@ -2138,15 +2366,15 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; do eval ac_val=\$$ac_var case $ac_val in - *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac - $as_echo "$ac_var='\''$ac_val'\''" + printf "%s\n" "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then - $as_echo "## ----------- ## + printf "%s\n" "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo @@ -2154,8 +2382,8 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; echo fi test "$ac_signal" != 0 && - $as_echo "$as_me: caught signal $ac_signal" - $as_echo "$as_me: exit $exit_status" + printf "%s\n" "$as_me: caught signal $ac_signal" + printf "%s\n" "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && @@ -2169,63 +2397,48 @@ ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h -$as_echo "/* confdefs.h */" > confdefs.h +printf "%s\n" "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. -cat >>confdefs.h <<_ACEOF -#define PACKAGE_NAME "$PACKAGE_NAME" -_ACEOF +printf "%s\n" "#define PACKAGE_NAME \"$PACKAGE_NAME\"" >>confdefs.h -cat >>confdefs.h <<_ACEOF -#define PACKAGE_TARNAME "$PACKAGE_TARNAME" -_ACEOF +printf "%s\n" "#define PACKAGE_TARNAME \"$PACKAGE_TARNAME\"" >>confdefs.h -cat >>confdefs.h <<_ACEOF -#define PACKAGE_VERSION "$PACKAGE_VERSION" -_ACEOF +printf "%s\n" "#define PACKAGE_VERSION \"$PACKAGE_VERSION\"" >>confdefs.h -cat >>confdefs.h <<_ACEOF -#define PACKAGE_STRING "$PACKAGE_STRING" -_ACEOF +printf "%s\n" "#define PACKAGE_STRING \"$PACKAGE_STRING\"" >>confdefs.h -cat >>confdefs.h <<_ACEOF -#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" -_ACEOF +printf "%s\n" "#define PACKAGE_BUGREPORT \"$PACKAGE_BUGREPORT\"" >>confdefs.h -cat >>confdefs.h <<_ACEOF -#define PACKAGE_URL "$PACKAGE_URL" -_ACEOF +printf "%s\n" "#define PACKAGE_URL \"$PACKAGE_URL\"" >>confdefs.h # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. -ac_site_file1=NONE -ac_site_file2=NONE if test -n "$CONFIG_SITE"; then - # We do not want a PATH search for config.site. - case $CONFIG_SITE in #(( - -*) ac_site_file1=./$CONFIG_SITE;; - */*) ac_site_file1=$CONFIG_SITE;; - *) ac_site_file1=./$CONFIG_SITE;; - esac + ac_site_files="$CONFIG_SITE" elif test "x$prefix" != xNONE; then - ac_site_file1=$prefix/share/config.site - ac_site_file2=$prefix/etc/config.site + ac_site_files="$prefix/share/config.site $prefix/etc/config.site" else - ac_site_file1=$ac_default_prefix/share/config.site - ac_site_file2=$ac_default_prefix/etc/config.site + ac_site_files="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" fi -for ac_site_file in "$ac_site_file1" "$ac_site_file2" + +for ac_site_file in $ac_site_files do - test "x$ac_site_file" = xNONE && continue - if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 -$as_echo "$as_me: loading site script $ac_site_file" >&6;} + case $ac_site_file in #( + */*) : + ;; #( + *) : + ac_site_file=./$ac_site_file ;; +esac + if test -f "$ac_site_file" && test -r "$ac_site_file"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 +printf "%s\n" "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ - || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + || { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi @@ -2235,898 +2448,1079 @@ if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 -$as_echo "$as_me: loading cache $cache_file" >&6;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 +printf "%s\n" "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else - { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 -$as_echo "$as_me: creating cache $cache_file" >&6;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 +printf "%s\n" "$as_me: creating cache $cache_file" >&6;} >$cache_file fi -# Check that the precious variables saved in the cache have kept the same -# value. -ac_cache_corrupted=false -for ac_var in $ac_precious_vars; do - eval ac_old_set=\$ac_cv_env_${ac_var}_set - eval ac_new_set=\$ac_env_${ac_var}_set - eval ac_old_val=\$ac_cv_env_${ac_var}_value - eval ac_new_val=\$ac_env_${ac_var}_value - case $ac_old_set,$ac_new_set in - set,) - { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 -$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} - ac_cache_corrupted=: ;; - ,set) - { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 -$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} - ac_cache_corrupted=: ;; - ,);; - *) - if test "x$ac_old_val" != "x$ac_new_val"; then - # differences in whitespace do not lead to failure. - ac_old_val_w=`echo x $ac_old_val` - ac_new_val_w=`echo x $ac_new_val` - if test "$ac_old_val_w" != "$ac_new_val_w"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 -$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} - ac_cache_corrupted=: - else - { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 -$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} - eval $ac_var=\$ac_old_val - fi - { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 -$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 -$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} - fi;; - esac - # Pass precious variables to config.status. - if test "$ac_new_set" = set; then - case $ac_new_val in - *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; - *) ac_arg=$ac_var=$ac_new_val ;; - esac - case " $ac_configure_args " in - *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. - *) as_fn_append ac_configure_args " '$ac_arg'" ;; - esac - fi -done -if $ac_cache_corrupted; then - { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 -$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} - as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 -fi -## -------------------- ## -## Main body of script. ## -## -------------------- ## +# Test code for whether the C compiler supports C89 (global declarations) +ac_c_conftest_c89_globals=' +/* Does the compiler advertise C89 conformance? + Do not test the value of __STDC__, because some compilers set it to 0 + while being otherwise adequately conformant. */ +#if !defined __STDC__ +# error "Compiler does not advertise C89 conformance" +#endif -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu +#include +#include +struct stat; +/* Most of the following tests are stolen from RCS 5.7 src/conf.sh. */ +struct buf { int x; }; +struct buf * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not \xHH hex character constants. + These do not provoke an error unfortunately, instead are silently treated + as an "x". The following induces an error, until -std is added to get + proper ANSI mode. Curiously \x00 != x always comes out true, for an + array size at least. It is necessary to write \x00 == 0 to get something + that is true only with -std. */ +int osf4_cc_array ['\''\x00'\'' == 0 ? 1 : -1]; +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) '\''x'\'' +int xlc6_cc_array[FOO(a) == '\''x'\'' ? 1 : -1]; +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, int *(*)(struct buf *, struct stat *, int), + int, int);' -ac_config_headers="$ac_config_headers src/libssh2_config.h example/libssh2_config.h" +# Test code for whether the C compiler supports C89 (body of main). +ac_c_conftest_c89_main=' +ok |= (argc == 0 || f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]); +' +# Test code for whether the C compiler supports C99 (global declarations) +ac_c_conftest_c99_globals=' +// Does the compiler advertise C99 conformance? +#if !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L +# error "Compiler does not advertise C99 conformance" +#endif -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5 -$as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; } - # Check whether --enable-maintainer-mode was given. -if test "${enable_maintainer_mode+set}" = set; then : - enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval -else - USE_MAINTAINER_MODE=no -fi +#include +extern int puts (const char *); +extern int printf (const char *, ...); +extern int dprintf (int, const char *, ...); +extern void *malloc (size_t); + +// Check varargs macros. These examples are taken from C99 6.10.3.5. +// dprintf is used instead of fprintf to avoid needing to declare +// FILE and stderr. +#define debug(...) dprintf (2, __VA_ARGS__) +#define showlist(...) puts (#__VA_ARGS__) +#define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__)) +static void +test_varargs_macros (void) +{ + int x = 1234; + int y = 5678; + debug ("Flag"); + debug ("X = %d\n", x); + showlist (The first, second, and third items.); + report (x>y, "x is %d but y is %d", x, y); +} - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5 -$as_echo "$USE_MAINTAINER_MODE" >&6; } - if test $USE_MAINTAINER_MODE = yes; then - MAINTAINER_MODE_TRUE= - MAINTAINER_MODE_FALSE='#' -else - MAINTAINER_MODE_TRUE='#' - MAINTAINER_MODE_FALSE= -fi +// Check long long types. +#define BIG64 18446744073709551615ull +#define BIG32 4294967295ul +#define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0) +#if !BIG_OK + #error "your preprocessor is broken" +#endif +#if BIG_OK +#else + #error "your preprocessor is broken" +#endif +static long long int bignum = -9223372036854775807LL; +static unsigned long long int ubignum = BIG64; - MAINT=$MAINTAINER_MODE_TRUE +struct incomplete_array +{ + int datasize; + double data[]; +}; +struct named_init { + int number; + const wchar_t *name; + double average; +}; +typedef const char *ccp; -# Extract the first word of "sed", so it can be a program name with args. -set dummy sed; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_SED+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $SED in - [\\/]* | ?:[\\/]*) - ac_cv_path_SED="$SED" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -as_dummy="$PATH:/usr/bin:/usr/local/bin" -for as_dir in $as_dummy -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_SED="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS +static inline int +test_restrict (ccp restrict text) +{ + // See if C++-style comments work. + // Iterate through items via the restricted pointer. + // Also check for declarations in for loops. + for (unsigned int i = 0; *(text+i) != '\''\0'\''; ++i) + continue; + return 0; +} - test -z "$ac_cv_path_SED" && ac_cv_path_SED="sed-was-not-found-by-configure" - ;; -esac -fi -SED=$ac_cv_path_SED -if test -n "$SED"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $SED" >&5 -$as_echo "$SED" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi +// Check varargs and va_copy. +static bool +test_varargs (const char *format, ...) +{ + va_list args; + va_start (args, format); + va_list args_copy; + va_copy (args_copy, args); + const char *str = ""; + int number = 0; + float fnumber = 0; + while (*format) + { + switch (*format++) + { + case '\''s'\'': // string + str = va_arg (args_copy, const char *); + break; + case '\''d'\'': // int + number = va_arg (args_copy, int); + break; + case '\''f'\'': // float + fnumber = va_arg (args_copy, double); + break; + default: + break; + } + } + va_end (args_copy); + va_end (args); + return *str && number && fnumber; +} +' -if test "x$SED" = "xsed-was-not-found-by-configure"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: sed was not found, this may ruin your chances to build fine" >&5 -$as_echo "$as_me: WARNING: sed was not found, this may ruin your chances to build fine" >&2;} -fi +# Test code for whether the C compiler supports C99 (body of main). +ac_c_conftest_c99_main=' + // Check bool. + _Bool success = false; + success |= (argc != 0); + + // Check restrict. + if (test_restrict ("String literal") == 0) + success = true; + char *restrict newvar = "Another string"; + + // Check varargs. + success &= test_varargs ("s, d'\'' f .", "string", 65, 34.234); + test_varargs_macros (); + + // Check flexible array members. + struct incomplete_array *ia = + malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10)); + ia->datasize = 10; + for (int i = 0; i < ia->datasize; ++i) + ia->data[i] = i * 1.234; + + // Check named initializers. + struct named_init ni = { + .number = 34, + .name = L"Test wide string", + .average = 543.34343, + }; + + ni.number = 58; + + int dynamic_array[ni.number]; + dynamic_array[0] = argv[0][0]; + dynamic_array[ni.number - 1] = 543; + + // work around unused variable warnings + ok |= (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == '\''x'\'' + || dynamic_array[ni.number - 1] != 543); +' -LIBSSH2VER=`$SED -ne 's/^#define LIBSSH2_VERSION *"\(.*\)"/\1/p' ${srcdir}/include/libssh2.h` -am__api_version='1.11' +# Test code for whether the C compiler supports C11 (global declarations) +ac_c_conftest_c11_globals=' +// Does the compiler advertise C11 conformance? +#if !defined __STDC_VERSION__ || __STDC_VERSION__ < 201112L +# error "Compiler does not advertise C11 conformance" +#endif -ac_aux_dir= -for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do - if test -f "$ac_dir/install-sh"; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install-sh -c" - break - elif test -f "$ac_dir/install.sh"; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install.sh -c" - break - elif test -f "$ac_dir/shtool"; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/shtool install -c" - break - fi -done -if test -z "$ac_aux_dir"; then - as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 -fi +// Check _Alignas. +char _Alignas (double) aligned_as_double; +char _Alignas (0) no_special_alignment; +extern char aligned_as_int; +char _Alignas (0) _Alignas (int) aligned_as_int; -# These three variables are undocumented and unsupported, -# and are intended to be withdrawn in a future Autoconf release. -# They can cause serious problems if a builder's source tree is in a directory -# whose full name contains unusual characters. -ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. -ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. -ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. +// Check _Alignof. +enum +{ + int_alignment = _Alignof (int), + int_array_alignment = _Alignof (int[100]), + char_alignment = _Alignof (char) +}; +_Static_assert (0 < -_Alignof (int), "_Alignof is signed"); +// Check _Noreturn. +int _Noreturn does_not_return (void) { for (;;) continue; } -# Find a good install program. We prefer a C program (faster), -# so one script is as good as another. But avoid the broken or -# incompatible versions: -# SysV /etc/install, /usr/sbin/install -# SunOS /usr/etc/install -# IRIX /sbin/install -# AIX /bin/install -# AmigaOS /C/install, which installs bootblocks on floppy discs -# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag -# AFS /usr/afsws/bin/install, which mishandles nonexistent args -# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" -# OS/2's system install, which has a completely different semantic -# ./install, which can be erroneously created by make from ./install.sh. -# Reject install programs that cannot install multiple files. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 -$as_echo_n "checking for a BSD-compatible install... " >&6; } -if test -z "$INSTALL"; then -if ${ac_cv_path_install+:} false; then : - $as_echo_n "(cached) " >&6 -else - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - # Account for people who put trailing slashes in PATH elements. -case $as_dir/ in #(( - ./ | .// | /[cC]/* | \ - /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ - ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ - /usr/ucb/* ) ;; - *) - # OSF1 and SCO ODT 3.0 have their own names for install. - # Don't use installbsd from OSF since it installs stuff as root - # by default. - for ac_prog in ginstall scoinst install; do - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then - if test $ac_prog = install && - grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then - # AIX install. It has an incompatible calling convention. - : - elif test $ac_prog = install && - grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then - # program-specific install script used by HP pwplus--don't use. - : - else - rm -rf conftest.one conftest.two conftest.dir - echo one > conftest.one - echo two > conftest.two - mkdir conftest.dir - if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && - test -s conftest.one && test -s conftest.two && - test -s conftest.dir/conftest.one && - test -s conftest.dir/conftest.two - then - ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" - break 3 - fi - fi - fi - done - done - ;; -esac +// Check _Static_assert. +struct test_static_assert +{ + int x; + _Static_assert (sizeof (int) <= sizeof (long int), + "_Static_assert does not work in struct"); + long int y; +}; - done -IFS=$as_save_IFS +// Check UTF-8 literals. +#define u8 syntax error! +char const utf8_literal[] = u8"happens to be ASCII" "another string"; -rm -rf conftest.one conftest.two conftest.dir +// Check duplicate typedefs. +typedef long *long_ptr; +typedef long int *long_ptr; +typedef long_ptr long_ptr; -fi - if test "${ac_cv_path_install+set}" = set; then - INSTALL=$ac_cv_path_install - else - # As a last resort, use the slow shell script. Don't cache a - # value for INSTALL within a source directory, because that will - # break other packages using the cache if that directory is - # removed, or if the value is a relative name. - INSTALL=$ac_install_sh - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 -$as_echo "$INSTALL" >&6; } +// Anonymous structures and unions -- taken from C11 6.7.2.1 Example 1. +struct anonymous +{ + union { + struct { int i; int j; }; + struct { int k; long int l; } w; + }; + int m; +} v1; +' -# Use test -z because SunOS4 sh mishandles braces in ${var-val}. -# It thinks the first close brace ends the variable substitution. -test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' +# Test code for whether the C compiler supports C11 (body of main). +ac_c_conftest_c11_main=' + _Static_assert ((offsetof (struct anonymous, i) + == offsetof (struct anonymous, w.k)), + "Anonymous union alignment botch"); + v1.i = 2; + v1.w.k = 5; + ok |= v1.i != 5; +' -test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' +# Test code for whether the C compiler supports C11 (complete). +ac_c_conftest_c11_program="${ac_c_conftest_c89_globals} +${ac_c_conftest_c99_globals} +${ac_c_conftest_c11_globals} -test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' +int +main (int argc, char **argv) +{ + int ok = 0; + ${ac_c_conftest_c89_main} + ${ac_c_conftest_c99_main} + ${ac_c_conftest_c11_main} + return ok; +} +" -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 -$as_echo_n "checking whether build environment is sane... " >&6; } -# Just in case -sleep 1 -echo timestamp > conftest.file -# Reject unsafe characters in $srcdir or the absolute working directory -# name. Accept space and tab only in the latter. -am_lf=' -' -case `pwd` in - *[\\\"\#\$\&\'\`$am_lf]*) - as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; -esac -case $srcdir in - *[\\\"\#\$\&\'\`$am_lf\ \ ]*) - as_fn_error $? "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;; -esac +# Test code for whether the C compiler supports C99 (complete). +ac_c_conftest_c99_program="${ac_c_conftest_c89_globals} +${ac_c_conftest_c99_globals} -# Do `set' in a subshell so we don't clobber the current shell's -# arguments. Must try -L first in case configure is actually a -# symlink; some systems play weird games with the mod time of symlinks -# (eg FreeBSD returns the mod time of the symlink's containing -# directory). -if ( - set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` - if test "$*" = "X"; then - # -L didn't work. - set X `ls -t "$srcdir/configure" conftest.file` - fi - rm -f conftest.file - if test "$*" != "X $srcdir/configure conftest.file" \ - && test "$*" != "X conftest.file $srcdir/configure"; then - - # If neither matched, then we have a broken ls. This can happen - # if, for instance, CONFIG_SHELL is bash and it inherits a - # broken ls alias from the environment. This has actually - # happened. Such a system could not be considered "sane". - as_fn_error $? "ls -t appears to fail. Make sure there is not a broken -alias in your environment" "$LINENO" 5 - fi +int +main (int argc, char **argv) +{ + int ok = 0; + ${ac_c_conftest_c89_main} + ${ac_c_conftest_c99_main} + return ok; +} +" - test "$2" = conftest.file - ) -then - # Ok. - : -else - as_fn_error $? "newly created file is older than distributed files! -Check your system clock" "$LINENO" 5 -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -test "$program_prefix" != NONE && - program_transform_name="s&^&$program_prefix&;$program_transform_name" -# Use a double $ so make ignores it. -test "$program_suffix" != NONE && - program_transform_name="s&\$&$program_suffix&;$program_transform_name" -# Double any \ or $. -# By default was `s,x,x', remove it if useless. -ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' -program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` +# Test code for whether the C compiler supports C89 (complete). +ac_c_conftest_c89_program="${ac_c_conftest_c89_globals} -# expand $ac_aux_dir to an absolute path -am_aux_dir=`cd $ac_aux_dir && pwd` +int +main (int argc, char **argv) +{ + int ok = 0; + ${ac_c_conftest_c89_main} + return ok; +} +" -if test x"${MISSING+set}" != xset; then - case $am_aux_dir in - *\ * | *\ *) - MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; - *) - MISSING="\${SHELL} $am_aux_dir/missing" ;; - esac -fi -# Use eval to expand $SHELL -if eval "$MISSING --run true"; then - am_missing_run="$MISSING --run " -else - am_missing_run= - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5 -$as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} -fi +as_fn_append ac_header_c_list " stdio.h stdio_h HAVE_STDIO_H" +as_fn_append ac_header_c_list " stdlib.h stdlib_h HAVE_STDLIB_H" +as_fn_append ac_header_c_list " string.h string_h HAVE_STRING_H" +as_fn_append ac_header_c_list " inttypes.h inttypes_h HAVE_INTTYPES_H" +as_fn_append ac_header_c_list " stdint.h stdint_h HAVE_STDINT_H" +as_fn_append ac_header_c_list " strings.h strings_h HAVE_STRINGS_H" +as_fn_append ac_header_c_list " sys/stat.h sys_stat_h HAVE_SYS_STAT_H" +as_fn_append ac_header_c_list " sys/types.h sys_types_h HAVE_SYS_TYPES_H" +as_fn_append ac_header_c_list " unistd.h unistd_h HAVE_UNISTD_H" +# Test code for whether the C++ compiler supports C++98 (global declarations) +ac_cxx_conftest_cxx98_globals=' +// Does the compiler advertise C++98 conformance? +#if !defined __cplusplus || __cplusplus < 199711L +# error "Compiler does not advertise C++98 conformance" +#endif -if test x"${install_sh}" != xset; then - case $am_aux_dir in - *\ * | *\ *) - install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; - *) - install_sh="\${SHELL} $am_aux_dir/install-sh" - esac -fi +// These inclusions are to reject old compilers that +// lack the unsuffixed header files. +#include +#include -# Installed binaries are usually stripped using `strip' when the user -# run `make install-strip'. However `strip' might not be the right -# tool to use in cross-compilation environments, therefore Automake -# will honor the `STRIP' environment variable to overrule this program. -if test "$cross_compiling" != no; then - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. -set dummy ${ac_tool_prefix}strip; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_STRIP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$STRIP"; then - ac_cv_prog_STRIP="$STRIP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_STRIP="${ac_tool_prefix}strip" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS +// and are *not* freestanding headers in C++98. +extern void assert (int); +namespace std { + extern int strcmp (const char *, const char *); +} -fi -fi -STRIP=$ac_cv_prog_STRIP -if test -n "$STRIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 -$as_echo "$STRIP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi +// Namespaces, exceptions, and templates were all added after "C++ 2.0". +using std::exception; +using std::strcmp; +namespace { -fi -if test -z "$ac_cv_prog_STRIP"; then - ac_ct_STRIP=$STRIP - # Extract the first word of "strip", so it can be a program name with args. -set dummy strip; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_STRIP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_STRIP"; then - ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_STRIP="strip" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS +void test_exception_syntax() +{ + try { + throw "test"; + } catch (const char *s) { + // Extra parentheses suppress a warning when building autoconf itself, + // due to lint rules shared with more typical C programs. + assert (!(strcmp) (s, "test")); + } +} -fi -fi -ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP -if test -n "$ac_ct_STRIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 -$as_echo "$ac_ct_STRIP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi +template struct test_template +{ + T const val; + explicit test_template(T t) : val(t) {} + template T add(U u) { return static_cast(u) + val; } +}; - if test "x$ac_ct_STRIP" = x; then - STRIP=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - STRIP=$ac_ct_STRIP - fi -else - STRIP="$ac_cv_prog_STRIP" -fi +} // anonymous namespace +' -fi -INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" +# Test code for whether the C++ compiler supports C++98 (body of main) +ac_cxx_conftest_cxx98_main=' + assert (argc); + assert (! argv[0]); +{ + test_exception_syntax (); + test_template tt (2.0); + assert (tt.add (4) == 6.0); + assert (true && !false); +} +' -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 -$as_echo_n "checking for a thread-safe mkdir -p... " >&6; } -if test -z "$MKDIR_P"; then - if ${ac_cv_path_mkdir+:} false; then : - $as_echo_n "(cached) " >&6 -else - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in mkdir gmkdir; do - for ac_exec_ext in '' $ac_executable_extensions; do - as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue - case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( - 'mkdir (GNU coreutils) '* | \ - 'mkdir (coreutils) '* | \ - 'mkdir (fileutils) '4.1*) - ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext - break 3;; - esac - done - done - done -IFS=$as_save_IFS +# Test code for whether the C++ compiler supports C++11 (global declarations) +ac_cxx_conftest_cxx11_globals=' +// Does the compiler advertise C++ 2011 conformance? +#if !defined __cplusplus || __cplusplus < 201103L +# error "Compiler does not advertise C++11 conformance" +#endif -fi +namespace cxx11test +{ + constexpr int get_val() { return 20; } - test -d ./--version && rmdir ./--version - if test "${ac_cv_path_mkdir+set}" = set; then - MKDIR_P="$ac_cv_path_mkdir -p" - else - # As a last resort, use the slow shell script. Don't cache a - # value for MKDIR_P within a source directory, because that will - # break other packages using the cache if that directory is - # removed, or if the value is a relative name. - MKDIR_P="$ac_install_sh -d" - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 -$as_echo "$MKDIR_P" >&6; } + struct testinit + { + int i; + double d; + }; -mkdir_p="$MKDIR_P" -case $mkdir_p in - [\\/$]* | ?:[\\/]*) ;; - */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; -esac + class delegate + { + public: + delegate(int n) : n(n) {} + delegate(): delegate(2354) {} -for ac_prog in gawk mawk nawk awk -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_AWK+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$AWK"; then - ac_cv_prog_AWK="$AWK" # Let the user override the test. -else + virtual int getval() { return this->n; }; + protected: + int n; + }; + + class overridden : public delegate + { + public: + overridden(int n): delegate(n) {} + virtual int getval() override final { return this->n * 2; } + }; + + class nocopy + { + public: + nocopy(int i): i(i) {} + nocopy() = default; + nocopy(const nocopy&) = delete; + nocopy & operator=(const nocopy&) = delete; + private: + int i; + }; + + // for testing lambda expressions + template Ret eval(Fn f, Ret v) + { + return f(v); + } + + // for testing variadic templates and trailing return types + template auto sum(V first) -> V + { + return first; + } + template auto sum(V first, Args... rest) -> V + { + return first + sum(rest...); + } +} +' + +# Test code for whether the C++ compiler supports C++11 (body of main) +ac_cxx_conftest_cxx11_main=' +{ + // Test auto and decltype + auto a1 = 6538; + auto a2 = 48573953.4; + auto a3 = "String literal"; + + int total = 0; + for (auto i = a3; *i; ++i) { total += *i; } + + decltype(a2) a4 = 34895.034; +} +{ + // Test constexpr + short sa[cxx11test::get_val()] = { 0 }; +} +{ + // Test initializer lists + cxx11test::testinit il = { 4323, 435234.23544 }; +} +{ + // Test range-based for + int array[] = {9, 7, 13, 15, 4, 18, 12, 10, 5, 3, + 14, 19, 17, 8, 6, 20, 16, 2, 11, 1}; + for (auto &x : array) { x += 23; } +} +{ + // Test lambda expressions + using cxx11test::eval; + assert (eval ([](int x) { return x*2; }, 21) == 42); + double d = 2.0; + assert (eval ([&](double x) { return d += x; }, 3.0) == 5.0); + assert (d == 5.0); + assert (eval ([=](double x) mutable { return d += x; }, 4.0) == 9.0); + assert (d == 5.0); +} +{ + // Test use of variadic templates + using cxx11test::sum; + auto a = sum(1); + auto b = sum(1, 2); + auto c = sum(1.0, 2.0, 3.0); +} +{ + // Test constructor delegation + cxx11test::delegate d1; + cxx11test::delegate d2(); + cxx11test::delegate d3(45); +} +{ + // Test override and final + cxx11test::overridden o1(55464); +} +{ + // Test nullptr + char *c = nullptr; +} +{ + // Test template brackets + test_template<::test_template> v(test_template(12)); +} +{ + // Unicode literals + char const *utf8 = u8"UTF-8 string \u2500"; + char16_t const *utf16 = u"UTF-8 string \u2500"; + char32_t const *utf32 = U"UTF-32 string \u2500"; +} +' + +# Test code for whether the C compiler supports C++11 (complete). +ac_cxx_conftest_cxx11_program="${ac_cxx_conftest_cxx98_globals} +${ac_cxx_conftest_cxx11_globals} + +int +main (int argc, char **argv) +{ + int ok = 0; + ${ac_cxx_conftest_cxx98_main} + ${ac_cxx_conftest_cxx11_main} + return ok; +} +" + +# Test code for whether the C compiler supports C++98 (complete). +ac_cxx_conftest_cxx98_program="${ac_cxx_conftest_cxx98_globals} +int +main (int argc, char **argv) +{ + int ok = 0; + ${ac_cxx_conftest_cxx98_main} + return ok; +} +" + + +# Auxiliary files required by this configure script. +ac_aux_files="config.rpath ltmain.sh compile config.guess config.sub missing install-sh" + +# Locations in which to look for auxiliary files. +ac_aux_dir_candidates="${srcdir}${PATH_SEPARATOR}${srcdir}/..${PATH_SEPARATOR}${srcdir}/../.." + +# Search for a directory containing all of the required auxiliary files, +# $ac_aux_files, from the $PATH-style list $ac_aux_dir_candidates. +# If we don't find one directory that contains all the files we need, +# we report the set of missing files from the *first* directory in +# $ac_aux_dir_candidates and give up. +ac_missing_aux_files="" +ac_first_candidate=: +printf "%s\n" "$as_me:${as_lineno-$LINENO}: looking for aux files: $ac_aux_files" >&5 as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH +as_found=false +for as_dir in $ac_aux_dir_candidates do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_AWK="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + as_found=: + + printf "%s\n" "$as_me:${as_lineno-$LINENO}: trying $as_dir" >&5 + ac_aux_dir_found=yes + ac_install_sh= + for ac_aux in $ac_aux_files + do + # As a special case, if "install-sh" is required, that requirement + # can be satisfied by any of "install-sh", "install.sh", or "shtool", + # and $ac_install_sh is set appropriately for whichever one is found. + if test x"$ac_aux" = x"install-sh" + then + if test -f "${as_dir}install-sh"; then + printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install-sh found" >&5 + ac_install_sh="${as_dir}install-sh -c" + elif test -f "${as_dir}install.sh"; then + printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install.sh found" >&5 + ac_install_sh="${as_dir}install.sh -c" + elif test -f "${as_dir}shtool"; then + printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}shtool found" >&5 + ac_install_sh="${as_dir}shtool install -c" + else + ac_aux_dir_found=no + if $ac_first_candidate; then + ac_missing_aux_files="${ac_missing_aux_files} install-sh" + else + break + fi + fi + else + if test -f "${as_dir}${ac_aux}"; then + printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}${ac_aux} found" >&5 + else + ac_aux_dir_found=no + if $ac_first_candidate; then + ac_missing_aux_files="${ac_missing_aux_files} ${ac_aux}" + else + break + fi + fi + fi + done + if test "$ac_aux_dir_found" = yes; then + ac_aux_dir="$as_dir" + break fi + ac_first_candidate=false + + as_found=false done - done IFS=$as_save_IFS +if $as_found +then : +else $as_nop + as_fn_error $? "cannot find required auxiliary files:$ac_missing_aux_files" "$LINENO" 5 fi -fi -AWK=$ac_cv_prog_AWK -if test -n "$AWK"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 -$as_echo "$AWK" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - test -n "$AWK" && break -done -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 -$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } -set x ${MAKE-make} -ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` -if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat >conftest.make <<\_ACEOF -SHELL = /bin/sh -all: - @echo '@@@%%%=$(MAKE)=@@@%%%' -_ACEOF -# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. -case `${MAKE-make} -f conftest.make 2>/dev/null` in - *@@@%%%=?*=@@@%%%*) - eval ac_cv_prog_make_${ac_make}_set=yes;; - *) - eval ac_cv_prog_make_${ac_make}_set=no;; -esac -rm -f conftest.make -fi -if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - SET_MAKE= -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - SET_MAKE="MAKE=${MAKE-make}" +# These three variables are undocumented and unsupported, +# and are intended to be withdrawn in a future Autoconf release. +# They can cause serious problems if a builder's source tree is in a directory +# whose full name contains unusual characters. +if test -f "${ac_aux_dir}config.guess"; then + ac_config_guess="$SHELL ${ac_aux_dir}config.guess" fi - -rm -rf .tst 2>/dev/null -mkdir .tst 2>/dev/null -if test -d .tst; then - am__leading_dot=. -else - am__leading_dot=_ +if test -f "${ac_aux_dir}config.sub"; then + ac_config_sub="$SHELL ${ac_aux_dir}config.sub" fi -rmdir .tst 2>/dev/null - -if test "`cd $srcdir && pwd`" != "`pwd`"; then - # Use -I$(srcdir) only when $(srcdir) != ., so that make's output - # is not polluted with repeated "-I." - am__isrc=' -I$(srcdir)' - # test to see if srcdir already configured - if test -f $srcdir/config.status; then - as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 - fi +if test -f "$ac_aux_dir/configure"; then + ac_configure="$SHELL ${ac_aux_dir}configure" fi -# test whether we have cygpath -if test -z "$CYGPATH_W"; then - if (cygpath --version) >/dev/null 2>/dev/null; then - CYGPATH_W='cygpath -w' - else - CYGPATH_W=echo +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in $ac_precious_vars; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val=\$ac_cv_env_${ac_var}_value + eval ac_new_val=\$ac_env_${ac_var}_value + case $ac_old_set,$ac_new_set in + set,) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +printf "%s\n" "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 +printf "%s\n" "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + # differences in whitespace do not lead to failure. + ac_old_val_w=`echo x $ac_old_val` + ac_new_val_w=`echo x $ac_new_val` + if test "$ac_old_val_w" != "$ac_new_val_w"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 +printf "%s\n" "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + ac_cache_corrupted=: + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 +printf "%s\n" "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} + eval $ac_var=\$ac_old_val + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 +printf "%s\n" "$as_me: former value: \`$ac_old_val'" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 +printf "%s\n" "$as_me: current value: \`$ac_new_val'" >&2;} + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *\'*) ac_arg=$ac_var=`printf "%s\n" "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) as_fn_append ac_configure_args " '$ac_arg'" ;; + esac fi +done +if $ac_cache_corrupted; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 +printf "%s\n" "$as_me: error: changes in the environment can compromise the build" >&2;} + as_fn_error $? "run \`${MAKE-make} distclean' and/or \`rm $cache_file' + and start over" "$LINENO" 5 fi +## -------------------- ## +## Main body of script. ## +## -------------------- ## - -# Define the identity of the package. - PACKAGE='libssh2' - VERSION='-' - - -cat >>confdefs.h <<_ACEOF -#define PACKAGE "$PACKAGE" -_ACEOF +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu -cat >>confdefs.h <<_ACEOF -#define VERSION "$VERSION" -_ACEOF -# Some tools Automake needs. -ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} +ac_config_headers="$ac_config_headers src/libssh2_config.h" -AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5 +printf %s "checking whether to enable maintainer-specific portions of Makefiles... " >&6; } + # Check whether --enable-maintainer-mode was given. +if test ${enable_maintainer_mode+y} +then : + enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval +else $as_nop + USE_MAINTAINER_MODE=no +fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5 +printf "%s\n" "$USE_MAINTAINER_MODE" >&6; } + if test $USE_MAINTAINER_MODE = yes; then + MAINTAINER_MODE_TRUE= + MAINTAINER_MODE_FALSE='#' +else + MAINTAINER_MODE_TRUE='#' + MAINTAINER_MODE_FALSE= +fi -AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} + MAINT=$MAINTAINER_MODE_TRUE -AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} +# Check whether --enable-silent-rules was given. +if test ${enable_silent_rules+y} +then : + enableval=$enable_silent_rules; +fi - -MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} - -# We need awk for the "check" target. The system "awk" is bad on -# some platforms. -# Always define AMTAR for backward compatibility. Yes, it's still used -# in the wild :-( We should find a proper way to deprecate it ... -AMTAR='$${TAR-tar}' - -am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking libssh2 version" >&5 -$as_echo_n "checking libssh2 version... " >&6; } -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBSSH2VER" >&5 -$as_echo "$LIBSSH2VER" >&6; } - - - -AB_VERSION=$LIBSSH2VER - -# Make sure we can run config.sub. -$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || - as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 -$as_echo_n "checking build system type... " >&6; } -if ${ac_cv_build+:} false; then : - $as_echo_n "(cached) " >&6 +case $enable_silent_rules in # ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=0;; +esac +am_make=${MAKE-make} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 +printf %s "checking whether $am_make supports nested variables... " >&6; } +if test ${am_cv_make_support_nested_variables+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if printf "%s\n" 'TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes else - ac_build_alias=$build_alias -test "x$ac_build_alias" = x && - ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` -test "x$ac_build_alias" = x && - as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 -ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || - as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 - + am_cv_make_support_nested_variables=no fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 -$as_echo "$ac_cv_build" >&6; } -case $ac_cv_build in -*-*-*) ;; -*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; -esac -build=$ac_cv_build -ac_save_IFS=$IFS; IFS='-' -set x $ac_cv_build -shift -build_cpu=$1 -build_vendor=$2 -shift; shift -# Remember, the first character of IFS is used to create $*, -# except with old shells: -build_os=$* -IFS=$ac_save_IFS -case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 +printf "%s\n" "$am_cv_make_support_nested_variables" >&6; } +if test $am_cv_make_support_nested_variables = yes; then + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AM_BACKSLASH='\' -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 -$as_echo_n "checking host system type... " >&6; } -if ${ac_cv_host+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test "x$host_alias" = x; then - ac_cv_host=$ac_cv_build +# Extract the first word of "sed", so it can be a program name with args. +set dummy sed; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_path_SED+y} +then : + printf %s "(cached) " >&6 +else $as_nop + case $SED in + [\\/]* | ?:[\\/]*) + ac_cv_path_SED="$SED" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_dummy="$PATH:/usr/bin:/usr/local/bin" +for as_dir in $as_dummy +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_path_SED="$as_dir$ac_word$ac_exec_ext" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_path_SED" && ac_cv_path_SED="sed-was-not-found-by-configure" + ;; +esac +fi +SED=$ac_cv_path_SED +if test -n "$SED"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $SED" >&5 +printf "%s\n" "$SED" >&6; } else - ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || - as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 -$as_echo "$ac_cv_host" >&6; } -case $ac_cv_host in -*-*-*) ;; -*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; -esac -host=$ac_cv_host -ac_save_IFS=$IFS; IFS='-' -set x $ac_cv_host -shift -host_cpu=$1 -host_vendor=$2 -shift; shift -# Remember, the first character of IFS is used to create $*, -# except with old shells: -host_os=$* -IFS=$ac_save_IFS -case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac +if test "x$SED" = "xsed-was-not-found-by-configure"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: sed was not found, this may ruin your chances to build fine" >&5 +printf "%s\n" "$as_me: WARNING: sed was not found, this may ruin your chances to build fine" >&2;} +fi +LIBSSH2VER=`$SED -ne 's/^#define LIBSSH2_VERSION *"\(.*\)"/\1/p' ${srcdir}/include/libssh2.h` +am__api_version='1.16' - if test -z "$AB_PACKAGE"; then - AB_PACKAGE=${PACKAGE_NAME:-$PACKAGE} - fi - { $as_echo "$as_me:${as_lineno-$LINENO}: autobuild project... $AB_PACKAGE" >&5 -$as_echo "$as_me: autobuild project... $AB_PACKAGE" >&6;} - if test -z "$AB_VERSION"; then - AB_VERSION=${PACKAGE_VERSION:-$VERSION} + # Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# OS/2's system install, which has a completely different semantic +# ./install, which can be erroneously created by make from ./install.sh. +# Reject install programs that cannot install multiple files. +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 +printf %s "checking for a BSD-compatible install... " >&6; } +if test -z "$INSTALL"; then +if test ${ac_cv_path_install+y} +then : + printf %s "(cached) " >&6 +else $as_nop + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + # Account for fact that we put trailing slashes in our PATH walk. +case $as_dir in #(( + ./ | /[cC]/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_prog$ac_exec_ext"; then + if test $ac_prog = install && + grep dspmsg "$as_dir$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + rm -rf conftest.one conftest.two conftest.dir + echo one > conftest.one + echo two > conftest.two + mkdir conftest.dir + if "$as_dir$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir/" && + test -s conftest.one && test -s conftest.two && + test -s conftest.dir/conftest.one && + test -s conftest.dir/conftest.two + then + ac_cv_path_install="$as_dir$ac_prog$ac_exec_ext -c" + break 3 + fi + fi fi - { $as_echo "$as_me:${as_lineno-$LINENO}: autobuild revision... $AB_VERSION" >&5 -$as_echo "$as_me: autobuild revision... $AB_VERSION" >&6;} + done + done + ;; +esac - hostname=`hostname` - if test "$hostname"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: autobuild hostname... $hostname" >&5 -$as_echo "$as_me: autobuild hostname... $hostname" >&6;} - fi + done +IFS=$as_save_IFS +rm -rf conftest.one conftest.two conftest.dir +fi + if test ${ac_cv_path_install+y}; then + INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. Don't cache a + # value for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + INSTALL=$ac_install_sh + fi +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 +printf "%s\n" "$INSTALL" >&6; } - date=`date +%Y%m%d-%H%M%S` - if test "$?" != 0; then - date=`date` - fi - if test "$date"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: autobuild timestamp... $date" >&5 -$as_echo "$as_me: autobuild timestamp... $date" >&6;} - fi +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' -# Check for the OS. -# Daniel's note: this should not be necessary and we need to work to -# get this removed. +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' -case "$host" in - *-mingw*) - CFLAGS="$CFLAGS -DLIBSSH2_WIN32" - LIBS="$LIBS -lws2_32" - ;; - *-cygwin) - CFLAGS="$CFLAGS -DLIBSSH2_WIN32" - ;; - *darwin*) - CFLAGS="$CFLAGS -DLIBSSH2_DARWIN" - ;; - *hpux*) - ;; - *osf*) - CFLAGS="$CFLAGS -D_POSIX_PII_SOCKET" - ;; - *) - ;; +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 +printf %s "checking whether build environment is sane... " >&6; } +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[\\\"\#\$\&\'\`$am_lf]*) + as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; +esac +case $srcdir in + *[\\\"\#\$\&\'\`$am_lf\ \ ]*) + as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; esac -DEPDIR="${am__leading_dot}deps" - -ac_config_commands="$ac_config_commands depfiles" +# Do 'set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + am_has_slept=no + for am_try in 1 2; do + echo "timestamp, slept: $am_has_slept" > conftest.file + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$*" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + if test "$*" != "X $srcdir/configure conftest.file" \ + && test "$*" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + as_fn_error $? "ls -t appears to fail. Make sure there is not a broken + alias in your environment" "$LINENO" 5 + fi + if test "$2" = conftest.file || test $am_try -eq 2; then + break + fi + # Just in case. + sleep 1 + am_has_slept=yes + done + test "$2" = conftest.file + ) +then + # Ok. + : +else + as_fn_error $? "newly created file is older than distributed files! +Check your system clock" "$LINENO" 5 +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } +# If we didn't sleep, we still need to ensure time stamps of config.status and +# generated files are strictly newer. +am_sleep_pid= +if grep 'slept: no' conftest.file >/dev/null 2>&1; then + ( sleep 1 ) & + am_sleep_pid=$! +fi +rm -f conftest.file -am_make=${MAKE-make} -cat > confinc << 'END' -am__doit: - @echo this is the am__doit target -.PHONY: am__doit -END -# If we don't find an include directive, just comment out the code. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 -$as_echo_n "checking for style of include used by $am_make... " >&6; } -am__include="#" -am__quote= -_am_result=none -# First try GNU make style include. -echo "include confinc" > confmf -# Ignore all kinds of additional output from `make'. -case `$am_make -s -f confmf 2> /dev/null` in #( -*the\ am__doit\ target*) - am__include=include - am__quote= - _am_result=GNU - ;; -esac -# Now try BSD make style include. -if test "$am__include" = "#"; then - echo '.include "confinc"' > confmf - case `$am_make -s -f confmf 2> /dev/null` in #( - *the\ am__doit\ target*) - am__include=.include - am__quote="\"" - _am_result=BSD - ;; - esac -fi +test "$program_prefix" != NONE && + program_transform_name="s&^&$program_prefix&;$program_transform_name" +# Use a double $ so make ignores it. +test "$program_suffix" != NONE && + program_transform_name="s&\$&$program_suffix&;$program_transform_name" +# Double any \ or $. +# By default was `s,x,x', remove it if useless. +ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' +program_transform_name=`printf "%s\n" "$program_transform_name" | sed "$ac_script"` -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 -$as_echo "$_am_result" >&6; } -rm -f confinc confmf +# Expand $ac_aux_dir to an absolute path. +am_aux_dir=`cd "$ac_aux_dir" && pwd` -# Check whether --enable-dependency-tracking was given. -if test "${enable_dependency_tracking+set}" = set; then : - enableval=$enable_dependency_tracking; -fi -if test "x$enable_dependency_tracking" != xno; then - am_depcomp="$ac_aux_dir/depcomp" - AMDEPBACKSLASH='\' - am__nodep='_no' + if test x"${MISSING+set}" != xset; then + MISSING="\${SHELL} '$am_aux_dir/missing'" fi - if test "x$enable_dependency_tracking" != xno; then - AMDEP_TRUE= - AMDEP_FALSE='#' +# Use eval to expand $SHELL +if eval "$MISSING --is-lightweight"; then + am_missing_run="$MISSING " else - AMDEP_TRUE='#' - AMDEP_FALSE= + am_missing_run= + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 +printf "%s\n" "$as_me: WARNING: 'missing' script is too old or missing" >&2;} fi +if test x"${install_sh+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. -set dummy ${ac_tool_prefix}gcc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. +# Installed binaries are usually stripped using 'strip' when the user +# run "make install-strip". However 'strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the 'STRIP' environment variable to overrule this program. +if test "$cross_compiling" != no; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_STRIP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_CC="${ac_tool_prefix}gcc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -3135,38 +3529,43 @@ IFS=$as_save_IFS fi fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +printf "%s\n" "$STRIP" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi fi -if test -z "$ac_cv_prog_CC"; then - ac_ct_CC=$CC - # Extract the first word of "gcc", so it can be a program name with args. -set dummy gcc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_CC"; then - ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_STRIP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_CC="gcc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_STRIP="strip" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -3175,194 +3574,107 @@ IFS=$as_save_IFS fi fi -ac_ct_CC=$ac_cv_prog_ac_ct_CC -if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 -$as_echo "$ac_ct_CC" >&6; } +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +printf "%s\n" "$ac_ct_STRIP" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi - if test "x$ac_ct_CC" = x; then - CC="" + if test "x$ac_ct_STRIP" = x; then + STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac - CC=$ac_ct_CC + STRIP=$ac_ct_STRIP fi else - CC="$ac_cv_prog_CC" + STRIP="$ac_cv_prog_STRIP" fi -if test -z "$CC"; then - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. -set dummy ${ac_tool_prefix}cc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_CC="${ac_tool_prefix}cc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" - fi -fi -if test -z "$CC"; then - # Extract the first word of "cc", so it can be a program name with args. -set dummy cc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - ac_prog_rejected=no -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a race-free mkdir -p" >&5 +printf %s "checking for a race-free mkdir -p... " >&6; } +if test -z "$MKDIR_P"; then + if test ${ac_cv_path_mkdir+y} +then : + printf %s "(cached) " >&6 +else $as_nop + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then - ac_prog_rejected=yes - continue - fi - ac_cv_prog_CC="cc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_prog in mkdir gmkdir; do + for ac_exec_ext in '' $ac_executable_extensions; do + as_fn_executable_p "$as_dir$ac_prog$ac_exec_ext" || continue + case `"$as_dir$ac_prog$ac_exec_ext" --version 2>&1` in #( + 'mkdir ('*'coreutils) '* | \ + 'BusyBox '* | \ + 'mkdir (fileutils) '4.1*) + ac_cv_path_mkdir=$as_dir$ac_prog$ac_exec_ext + break 3;; + esac + done + done done IFS=$as_save_IFS -if test $ac_prog_rejected = yes; then - # We found a bogon in the path, so make sure we never use it. - set dummy $ac_cv_prog_CC - shift - if test $# != 0; then - # We chose a different compiler from the bogus one. - # However, it has the same basename, so the bogon will be chosen - # first if we set CC to just the basename; use the full file name. - shift - ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" - fi -fi -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } fi - -fi -if test -z "$CC"; then - if test -n "$ac_tool_prefix"; then - for ac_prog in cl.exe - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_CC="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 + test -d ./--version && rmdir ./--version + if test ${ac_cv_path_mkdir+y}; then + MKDIR_P="$ac_cv_path_mkdir -p" + else + # As a last resort, use the slow shell script. Don't cache a + # value for MKDIR_P within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + MKDIR_P="$ac_install_sh -d" fi -done - done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 +printf "%s\n" "$MKDIR_P" >&6; } - - test -n "$CC" && break - done -fi -if test -z "$CC"; then - ac_ct_CC=$CC - for ac_prog in cl.exe +for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_CC"; then - ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_AWK+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$AWK"; then + ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_CC="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_AWK="$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -3371,1817 +3683,1458 @@ IFS=$as_save_IFS fi fi -ac_ct_CC=$ac_cv_prog_ac_ct_CC -if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 -$as_echo "$ac_ct_CC" >&6; } +AWK=$ac_cv_prog_AWK +if test -n "$AWK"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 +printf "%s\n" "$AWK" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi - test -n "$ac_ct_CC" && break + test -n "$AWK" && break done - if test "x$ac_ct_CC" = x; then - CC="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +printf %s "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } +set x ${MAKE-make} +ac_make=`printf "%s\n" "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +if eval test \${ac_cv_prog_make_${ac_make}_set+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat >conftest.make <<\_ACEOF +SHELL = /bin/sh +all: + @echo '@@@%%%=$(MAKE)=@@@%%%' +_ACEOF +# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. +case `${MAKE-make} -f conftest.make 2>/dev/null` in + *@@@%%%=?*=@@@%%%*) + eval ac_cv_prog_make_${ac_make}_set=yes;; + *) + eval ac_cv_prog_make_${ac_make}_set=no;; esac - CC=$ac_ct_CC +rm -f conftest.make +fi +if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + SET_MAKE= +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + SET_MAKE="MAKE=${MAKE-make}" +fi + +rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null + +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + am__isrc=' -I$(srcdir)' + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi fi -test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "no acceptable C compiler found in \$PATH -See \`config.log' for more details" "$LINENO" 5; } +# Define the identity of the package. + PACKAGE='libssh2' + VERSION='-' -# Provide some information about the compiler. -$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 -set X $ac_compile -ac_compiler=$2 -for ac_option in --version -v -V -qversion; do - { { ac_try="$ac_compiler $ac_option >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compiler $ac_option >&5") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - sed '10a\ -... rest of stderr output deleted ... - 10q' conftest.err >conftest.er1 - cat conftest.er1 >&5 - fi - rm -f conftest.er1 conftest.err - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } -done -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ +printf "%s\n" "#define PACKAGE \"$PACKAGE\"" >>confdefs.h -int -main () -{ - ; - return 0; -} -_ACEOF -ac_clean_files_save=$ac_clean_files -ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" -# Try to create an executable without -o first, disregard a.out. -# It will help us diagnose broken compilers, and finding out an intuition -# of exeext. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 -$as_echo_n "checking whether the C compiler works... " >&6; } -ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` +printf "%s\n" "#define VERSION \"$VERSION\"" >>confdefs.h -# The possible output files: -ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" +# Some tools Automake needs. -ac_rmfiles= -for ac_file in $ac_files -do - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; - * ) ac_rmfiles="$ac_rmfiles $ac_file";; - esac -done -rm -f $ac_rmfiles +ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} -if { { ac_try="$ac_link_default" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link_default") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then : - # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. -# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' -# in a Makefile. We should not override ac_cv_exeext if it was cached, -# so that the user can short-circuit this test for compilers unknown to -# Autoconf. -for ac_file in $ac_files '' -do - test -f "$ac_file" || continue - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) - ;; - [ab].out ) - # We found the default executable, but exeext='' is most - # certainly right. - break;; - *.* ) - if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; - then :; else - ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` - fi - # We set ac_cv_exeext here because the later test for it is not - # safe: cross compilers may not add the suffix if given an `-o' - # argument, so we may need to know it at that point already. - # Even if this section looks crufty: it has the advantage of - # actually working. - break;; - * ) - break;; - esac -done -test "$ac_cv_exeext" = no && ac_cv_exeext= -else - ac_file='' -fi -if test -z "$ac_file"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -$as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 +AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} -{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error 77 "C compiler cannot create executables -See \`config.log' for more details" "$LINENO" 5; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 -$as_echo_n "checking for C compiler default output file name... " >&6; } -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 -$as_echo "$ac_file" >&6; } -ac_exeext=$ac_cv_exeext -rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out -ac_clean_files=$ac_clean_files_save -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 -$as_echo_n "checking for suffix of executables... " >&6; } -if { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then : - # If both `conftest.exe' and `conftest' are `present' (well, observable) -# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will -# work properly (i.e., refer to `conftest.exe'), while it won't with -# `rm'. -for ac_file in conftest.exe conftest conftest.*; do - test -f "$ac_file" || continue - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; - *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` - break;; - * ) break;; - esac -done -else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "cannot compute suffix of executables: cannot compile and link -See \`config.log' for more details" "$LINENO" 5; } -fi -rm -f conftest conftest$ac_cv_exeext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 -$as_echo "$ac_cv_exeext" >&6; } +AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} -rm -f conftest.$ac_ext -EXEEXT=$ac_cv_exeext -ac_exeext=$EXEEXT -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -int -main () -{ -FILE *f = fopen ("conftest.out", "w"); - return ferror (f) || fclose (f) != 0; - ; - return 0; -} -_ACEOF -ac_clean_files="$ac_clean_files conftest.out" -# Check that the compiler produces executables we can run. If not, either -# the compiler is broken, or we cross compile. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 -$as_echo_n "checking whether we are cross compiling... " >&6; } -if test "$cross_compiling" != yes; then - { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - if { ac_try='./conftest$ac_cv_exeext' - { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; }; then - cross_compiling=no - else - if test "$cross_compiling" = maybe; then - cross_compiling=yes - else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "cannot run C compiled programs. -If you meant to cross compile, use \`--host'. -See \`config.log' for more details" "$LINENO" 5; } - fi - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 -$as_echo "$cross_compiling" >&6; } +AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} -rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out -ac_clean_files=$ac_clean_files_save -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 -$as_echo_n "checking for suffix of object files... " >&6; } -if ${ac_cv_objext+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -int -main () -{ +MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} - ; - return 0; -} -_ACEOF -rm -f conftest.o conftest.obj -if { { ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compile") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then : - for ac_file in conftest.o conftest.obj conftest.*; do - test -f "$ac_file" || continue; - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; - *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` - break;; - esac -done -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 +# For better backward compatibility. To be removed once Automake 1.9.x +# dies out for good. For more background, see: +# +# +mkdir_p='$(MKDIR_P)' -{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "cannot compute suffix of object files: cannot compile -See \`config.log' for more details" "$LINENO" 5; } -fi -rm -f conftest.$ac_cv_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 -$as_echo "$ac_cv_objext" >&6; } -OBJEXT=$ac_cv_objext -ac_objext=$OBJEXT -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 -$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } -if ${ac_cv_c_compiler_gnu+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ +# We need awk for the "check" target (and possibly the TAP driver). The +# system "awk" is bad on some platforms. +# Always define AMTAR for backward compatibility. Yes, it's still used +# in the wild :-( We should find a proper way to deprecate it ... +AMTAR='$${TAR-tar}' -int -main () -{ -#ifndef __GNUC__ - choke me -#endif - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_compiler_gnu=yes -else - ac_compiler_gnu=no +# We'll loop over all known methods to create a tar archive until one works. +_am_tools='gnutar pax cpio none' + +am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' + + + + + +# Variables for tags utilities; see am/tags.am +if test -z "$CTAGS"; then + CTAGS=ctags fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -ac_cv_c_compiler_gnu=$ac_compiler_gnu +if test -z "$ETAGS"; then + ETAGS=etags fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 -$as_echo "$ac_cv_c_compiler_gnu" >&6; } -if test $ac_compiler_gnu = yes; then - GCC=yes -else - GCC= + +if test -z "$CSCOPE"; then + CSCOPE=cscope fi -ac_test_CFLAGS=${CFLAGS+set} -ac_save_CFLAGS=$CFLAGS -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 -$as_echo_n "checking whether $CC accepts -g... " >&6; } -if ${ac_cv_prog_cc_g+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_save_c_werror_flag=$ac_c_werror_flag - ac_c_werror_flag=yes - ac_cv_prog_cc_g=no - CFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -int -main () -{ - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_g=yes -else - CFLAGS="" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -int -main () -{ +# POSIX will say in a future version that running "rm -f" with no argument +# is OK; and we want to be able to make that assumption in our Makefile +# recipes. So use an aggressive probe to check that the usage we want is +# actually supported "in the wild" to an acceptable degree. +# See automake bug#10828. +# To make any issue more visible, cause the running configure to be aborted +# by default if the 'rm' program in use doesn't match our expectations; the +# user can still override this though. +if rm -f && rm -fr && rm -rf; then : OK; else + cat >&2 <<'END' +Oops! - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - -else - ac_c_werror_flag=$ac_save_c_werror_flag - CFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ +Your 'rm' program seems unable to run without file operands specified +on the command line, even when the '-f' option is present. This is contrary +to the behaviour of most rm programs out there, and not conforming with +the upcoming POSIX standard: -int -main () -{ +Please tell bug-automake@gnu.org about your system, including the value +of your $PATH and any error possibly output before this message. This +can help us improve future automake versions. - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_g=yes -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - ac_c_werror_flag=$ac_save_c_werror_flag -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 -$as_echo "$ac_cv_prog_cc_g" >&6; } -if test "$ac_test_CFLAGS" = set; then - CFLAGS=$ac_save_CFLAGS -elif test $ac_cv_prog_cc_g = yes; then - if test "$GCC" = yes; then - CFLAGS="-g -O2" - else - CFLAGS="-g" - fi -else - if test "$GCC" = yes; then - CFLAGS="-O2" +END + if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then + echo 'Configuration will proceed anyway, since you have set the' >&2 + echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 + echo >&2 else - CFLAGS= - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 -$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } -if ${ac_cv_prog_cc_c89+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_cv_prog_cc_c89=no -ac_save_CC=$CC -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -struct stat; -/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ -struct buf { int x; }; -FILE * (*rcsopen) (struct buf *, struct stat *, int); -static char *e (p, i) - char **p; - int i; -{ - return p[i]; -} -static char *f (char * (*g) (char **, int), char **p, ...) -{ - char *s; - va_list v; - va_start (v,p); - s = g (p, va_arg (v,int)); - va_end (v); - return s; -} + cat >&2 <<'END' +Aborting the configuration process, to ensure you take notice of the issue. -/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has - function prototypes and stuff, but not '\xHH' hex character constants. - These don't provoke an error unfortunately, instead are silently treated - as 'x'. The following induces an error, until -std is added to get - proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an - array size at least. It's necessary to write '\x00'==0 to get something - that's true only with -std. */ -int osf4_cc_array ['\x00' == 0 ? 1 : -1]; +You can download and install GNU coreutils to get an 'rm' implementation +that behaves properly: . -/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters - inside strings and character constants. */ -#define FOO(x) 'x' -int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; +If you want to complete the configuration process using your problematic +'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM +to "yes", and re-run configure. -int test (int i, double x); -struct s1 {int (*f) (int a);}; -struct s2 {int (*f) (double a);}; -int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); -int argc; -char **argv; -int -main () -{ -return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; - ; - return 0; -} -_ACEOF -for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ - -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" -do - CC="$ac_save_CC $ac_arg" - if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_c89=$ac_arg +END + as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 + fi fi -rm -f core conftest.err conftest.$ac_objext - test "x$ac_cv_prog_cc_c89" != "xno" && break -done -rm -f conftest.$ac_ext -CC=$ac_save_CC -fi -# AC_CACHE_VAL -case "x$ac_cv_prog_cc_c89" in - x) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 -$as_echo "none needed" >&6; } ;; - xno) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 -$as_echo "unsupported" >&6; } ;; - *) - CC="$CC $ac_cv_prog_cc_c89" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 -$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; -esac -if test "x$ac_cv_prog_cc_c89" != xno; then : +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking libssh2 version" >&5 +printf %s "checking libssh2 version... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LIBSSH2VER" >&5 +printf "%s\n" "$LIBSSH2VER" >&6; } -fi -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu -depcc="$CC" am_compiler_list= +AB_VERSION=$LIBSSH2VER -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 -$as_echo_n "checking dependency style of $depcc... " >&6; } -if ${am_cv_CC_dependencies_compiler_type+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then - # We make a subdir and do the tests there. Otherwise we can end up - # making bogus files that we don't know about and never remove. For - # instance it was reported that on HP-UX the gcc test will end up - # making a dummy file named `D' -- because `-MD' means `put the output - # in D'. - rm -rf conftest.dir - mkdir conftest.dir - # Copy depcomp to subdir because otherwise we won't find it if we're - # using a relative directory. - cp "$am_depcomp" conftest.dir - cd conftest.dir - # We will build objects and dependencies in a subdirectory because - # it helps to detect inapplicable dependency modes. For instance - # both Tru64's cc and ICC support -MD to output dependencies as a - # side effect of compilation, but ICC will put the dependencies in - # the current directory while Tru64 will put them in the object - # directory. - mkdir sub - am_cv_CC_dependencies_compiler_type=none - if test "$am_compiler_list" = ""; then - am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` - fi - am__universal=false - case " $depcc " in #( - *\ -arch\ *\ -arch\ *) am__universal=true ;; - esac - for depmode in $am_compiler_list; do - # Setup a source with many dependencies, because some compilers - # like to wrap large dependency lists on column 80 (with \), and - # we should not choose a depcomp mode which is confused by this. - # - # We need to recreate these files for each test, as the compiler may - # overwrite some of them when testing with obscure command lines. - # This happens at least with the AIX C compiler. - : > sub/conftest.c - for i in 1 2 3 4 5 6; do - echo '#include "conftst'$i'.h"' >> sub/conftest.c - # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with - # Solaris 8's {/usr,}/bin/sh. - touch sub/conftst$i.h - done - echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + # Make sure we can run config.sub. +$SHELL "${ac_aux_dir}config.sub" sun4 >/dev/null 2>&1 || + as_fn_error $? "cannot run $SHELL ${ac_aux_dir}config.sub" "$LINENO" 5 - # We check with `-c' and `-o' for the sake of the "dashmstdout" - # mode. It turns out that the SunPro C++ compiler does not properly - # handle `-M -o', and we need to detect this. Also, some Intel - # versions had trouble with output in subdirs - am__obj=sub/conftest.${OBJEXT-o} - am__minus_obj="-o $am__obj" - case $depmode in - gcc) - # This depmode causes a compiler race in universal mode. - test "$am__universal" = false || continue - ;; - nosideeffect) - # after this tag, mechanisms are not by side-effect, so they'll - # only be used when explicitly requested - if test "x$enable_dependency_tracking" = xyes; then - continue - else - break - fi - ;; - msvc7 | msvc7msys | msvisualcpp | msvcmsys) - # This compiler won't grok `-c -o', but also, the minuso test has - # not run yet. These depmodes are late enough in the game, and - # so weak that their functioning should not be impacted. - am__obj=conftest.${OBJEXT-o} - am__minus_obj= - ;; - none) break ;; - esac - if depmode=$depmode \ - source=sub/conftest.c object=$am__obj \ - depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ - $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ - >/dev/null 2>conftest.err && - grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && - grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && - grep $am__obj sub/conftest.Po > /dev/null 2>&1 && - ${MAKE-make} -s -f confmf > /dev/null 2>&1; then - # icc doesn't choke on unknown options, it will just issue warnings - # or remarks (even with -Werror). So we grep stderr for any message - # that says an option was ignored or not supported. - # When given -MP, icc 7.0 and 7.1 complain thusly: - # icc: Command line warning: ignoring option '-M'; no argument required - # The diagnosis changed in icc 8.0: - # icc: Command line remark: option '-MP' not supported - if (grep 'ignoring option' conftest.err || - grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else - am_cv_CC_dependencies_compiler_type=$depmode - break - fi - fi - done +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 +printf %s "checking build system type... " >&6; } +if test ${ac_cv_build+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_build_alias=$build_alias +test "x$ac_build_alias" = x && + ac_build_alias=`$SHELL "${ac_aux_dir}config.guess"` +test "x$ac_build_alias" = x && + as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 +ac_cv_build=`$SHELL "${ac_aux_dir}config.sub" $ac_build_alias` || + as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $ac_build_alias failed" "$LINENO" 5 - cd .. - rm -rf conftest.dir -else - am_cv_CC_dependencies_compiler_type=none fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 +printf "%s\n" "$ac_cv_build" >&6; } +case $ac_cv_build in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; +esac +build=$ac_cv_build +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_build +shift +build_cpu=$1 +build_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +build_os=$* +IFS=$ac_save_IFS +case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 -$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } -CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type - if - test "x$enable_dependency_tracking" != xno \ - && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then - am__fastdepCC_TRUE= - am__fastdepCC_FALSE='#' +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 +printf %s "checking host system type... " >&6; } +if test ${ac_cv_host+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test "x$host_alias" = x; then + ac_cv_host=$ac_cv_build else - am__fastdepCC_TRUE='#' - am__fastdepCC_FALSE= + ac_cv_host=`$SHELL "${ac_aux_dir}config.sub" $host_alias` || + as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $host_alias failed" "$LINENO" 5 fi +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 +printf "%s\n" "$ac_cv_host" >&6; } +case $ac_cv_host in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; +esac +host=$ac_cv_host +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_host +shift +host_cpu=$1 +host_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +host_os=$* +IFS=$ac_save_IFS +case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 -$as_echo_n "checking how to run the C preprocessor... " >&6; } -# On Suns, sometimes $CPP names a directory. -if test -n "$CPP" && test -d "$CPP"; then - CPP= -fi -if test -z "$CPP"; then - if ${ac_cv_prog_CPP+:} false; then : - $as_echo_n "(cached) " >&6 -else - # Double quotes because CPP needs to be expanded - for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" - do - ac_preproc_ok=false -for ac_c_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer to if __STDC__ is defined, since - # exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#ifdef __STDC__ -# include -#else -# include -#endif - Syntax error -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : -else - # Broken: fails on valid input. -continue -fi -rm -f conftest.err conftest.i conftest.$ac_ext - # OK, works on sane cases. Now check whether nonexistent headers - # can be detected and how. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - # Broken: success on invalid input. -continue -else - # Passes both tests. -ac_preproc_ok=: -break -fi -rm -f conftest.err conftest.i conftest.$ac_ext -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.i conftest.err conftest.$ac_ext -if $ac_preproc_ok; then : - break -fi - done - ac_cv_prog_CPP=$CPP + if test -z "$AB_PACKAGE"; then + AB_PACKAGE=${PACKAGE_NAME:-$PACKAGE} + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: autobuild project... $AB_PACKAGE" >&5 +printf "%s\n" "$as_me: autobuild project... $AB_PACKAGE" >&6;} -fi - CPP=$ac_cv_prog_CPP -else - ac_cv_prog_CPP=$CPP -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 -$as_echo "$CPP" >&6; } -ac_preproc_ok=false -for ac_c_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer to if __STDC__ is defined, since - # exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#ifdef __STDC__ -# include -#else -# include -#endif - Syntax error -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : + if test -z "$AB_VERSION"; then + AB_VERSION=${PACKAGE_VERSION:-$VERSION} + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: autobuild revision... $AB_VERSION" >&5 +printf "%s\n" "$as_me: autobuild revision... $AB_VERSION" >&6;} -else - # Broken: fails on valid input. -continue -fi -rm -f conftest.err conftest.i conftest.$ac_ext + hostname=`hostname` + if test "$hostname"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: autobuild hostname... $hostname" >&5 +printf "%s\n" "$as_me: autobuild hostname... $hostname" >&6;} + fi + + + + date=`date +%Y%m%d-%H%M%S` + if test "$?" != 0; then + date=`date` + fi + if test "$date"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: autobuild timestamp... $date" >&5 +printf "%s\n" "$as_me: autobuild timestamp... $date" >&6;} + fi + + +# Check for the OS. +# Daniel's note: this should not be necessary and we need to work to +# get this removed. + +case "$host" in + *-mingw*) + CFLAGS="$CFLAGS -DLIBSSH2_WIN32" + LIBS="$LIBS -lws2_32" + ;; + *darwin*) + CFLAGS="$CFLAGS -DLIBSSH2_DARWIN" + ;; + *hpux*) + ;; + *osf*) + CFLAGS="$CFLAGS -D_POSIX_PII_SOCKET" + ;; + *) + ;; +esac - # OK, works on sane cases. Now check whether nonexistent headers - # can be detected and how. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - # Broken: success on invalid input. -continue -else - # Passes both tests. -ac_preproc_ok=: -break -fi -rm -f conftest.err conftest.i conftest.$ac_ext + + + + + + + + +DEPDIR="${am__leading_dot}deps" + +ac_config_commands="$ac_config_commands depfiles" + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} supports the include directive" >&5 +printf %s "checking whether ${MAKE-make} supports the include directive... " >&6; } +cat > confinc.mk << 'END' +am__doit: + @echo this is the am__doit target >confinc.out +.PHONY: am__doit +END +am__include="#" +am__quote= +# BSD make does it like this. +echo '.include "confinc.mk" # ignored' > confmf.BSD +# Other make implementations (GNU, Solaris 10, AIX) do it like this. +echo 'include confinc.mk # ignored' > confmf.GNU +_am_result=no +for s in GNU BSD; do + { echo "$as_me:$LINENO: ${MAKE-make} -f confmf.$s && cat confinc.out" >&5 + (${MAKE-make} -f confmf.$s && cat confinc.out) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + case $?:`cat confinc.out 2>/dev/null` in #( + '0:this is the am__doit target') : + case $s in #( + BSD) : + am__include='.include' am__quote='"' ;; #( + *) : + am__include='include' am__quote='' ;; +esac ;; #( + *) : + ;; +esac + if test "$am__include" != "#"; then + _am_result="yes ($s style)" + break + fi done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.i conftest.err conftest.$ac_ext -if $ac_preproc_ok; then : +rm -f confinc.* confmf.* +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ${_am_result}" >&5 +printf "%s\n" "${_am_result}" >&6; } + +# Check whether --enable-dependency-tracking was given. +if test ${enable_dependency_tracking+y} +then : + enableval=$enable_dependency_tracking; +fi +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' + am__nodep='_no' +fi + if test "x$enable_dependency_tracking" != xno; then + AMDEP_TRUE= + AMDEP_FALSE='#' else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "C preprocessor \"$CPP\" fails sanity check -See \`config.log' for more details" "$LINENO" 5; } + AMDEP_TRUE='#' + AMDEP_FALSE= fi + ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 -$as_echo_n "checking for grep that handles long lines and -e... " >&6; } -if ${ac_cv_path_GREP+:} false; then : - $as_echo_n "(cached) " >&6 +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. else - if test -z "$GREP"; then - ac_path_GREP_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in grep ggrep; do + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_GREP" || continue -# Check for GNU ac_path_GREP and select it if it is found. - # Check for GNU $ac_path_GREP -case `"$ac_path_GREP" --version 2>&1` in -*GNU*) - ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; -*) - ac_count=0 - $as_echo_n 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - $as_echo 'GREP' >> "conftest.nl" - "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_GREP_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_GREP="$ac_path_GREP" - ac_path_GREP_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac +IFS=$as_save_IFS - $ac_path_GREP_found && break 3 - done - done +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="gcc" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done done IFS=$as_save_IFS - if test -z "$ac_cv_path_GREP"; then - as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 - fi + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +printf "%s\n" "$ac_ct_CC" >&6; } else - ac_cv_path_GREP=$GREP + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 -$as_echo "$ac_cv_path_GREP" >&6; } - GREP="$ac_cv_path_GREP" - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 -$as_echo_n "checking for egrep... " >&6; } -if ${ac_cv_path_EGREP+:} false; then : - $as_echo_n "(cached) " >&6 +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. else - if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 - then ac_cv_path_EGREP="$GREP -E" - else - if test -z "$EGREP"; then - ac_path_EGREP_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in egrep; do + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_EGREP" || continue -# Check for GNU ac_path_EGREP and select it if it is found. - # Check for GNU $ac_path_EGREP -case `"$ac_path_EGREP" --version 2>&1` in -*GNU*) - ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; -*) - ac_count=0 - $as_echo_n 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - $as_echo 'EGREP' >> "conftest.nl" - "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_EGREP_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_EGREP="$ac_path_EGREP" - ac_path_EGREP_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - $ac_path_EGREP_found && break 3 - done - done + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done done IFS=$as_save_IFS - if test -z "$ac_cv_path_EGREP"; then - as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 - fi -else - ac_cv_path_EGREP=$EGREP -fi - fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 -$as_echo "$ac_cv_path_EGREP" >&6; } - EGREP="$ac_cv_path_EGREP" +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 -$as_echo_n "checking for ANSI C header files... " >&6; } -if ${ac_cv_header_stdc+:} false; then : - $as_echo_n "(cached) " >&6 + fi +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -#include -#include - -int -main () -{ + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + if test "$as_dir$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_header_stdc=yes +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } else - ac_cv_header_stdc=no + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - -if test $ac_cv_header_stdc = yes; then - # SunOS 4.x string.h does not declare mem*, contrary to ANSI. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "memchr" >/dev/null 2>&1; then : -else - ac_cv_header_stdc=no fi -rm -f conftest* +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS fi - -if test $ac_cv_header_stdc = yes; then - # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "free" >/dev/null 2>&1; then : - +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } else - ac_cv_header_stdc=no + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi -rm -f conftest* -fi -if test $ac_cv_header_stdc = yes; then - # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. - if test "$cross_compiling" = yes; then : - : + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl.exe +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -#if ((' ' & 0x0FF) == 0x020) -# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') -# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) -#else -# define ISLOWER(c) \ - (('a' <= (c) && (c) <= 'i') \ - || ('j' <= (c) && (c) <= 'r') \ - || ('s' <= (c) && (c) <= 'z')) -# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) -#endif - -#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) -int -main () -{ - int i; - for (i = 0; i < 256; i++) - if (XOR (islower (i), ISLOWER (i)) - || toupper (i) != TOUPPER (i)) - return 2; - return 0; -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS -else - ac_cv_header_stdc=no fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi - fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +printf "%s\n" "$ac_ct_CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 -$as_echo "$ac_cv_header_stdc" >&6; } -if test $ac_cv_header_stdc = yes; then - -$as_echo "#define STDC_HEADERS 1" >>confdefs.h -fi -# On IRIX 5.3, sys/types and inttypes.h are conflicting. -for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ - inttypes.h stdint.h unistd.h -do : - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default -" -if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF + test -n "$ac_ct_CC" && break +done + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi fi +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}clang", so it can be a program name with args. +set dummy ${ac_tool_prefix}clang; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}clang" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi done + done +IFS=$as_save_IFS +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi -ac_fn_c_check_type "$LINENO" "long long" "ac_cv_type_long_long" "$ac_includes_default" -if test "x$ac_cv_type_long_long" = xyes; then : - -$as_echo "#define HAVE_LONGLONG 1" >>confdefs.h - longlong="yes" +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "clang", so it can be a program name with args. +set dummy clang; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="clang" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +printf "%s\n" "$ac_ct_CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi +fi - # - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if _REENTRANT is already defined" >&5 -$as_echo_n "checking if _REENTRANT is already defined... " >&6; } - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ +test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "no acceptable C compiler found in \$PATH +See \`config.log' for more details" "$LINENO" 5; } +# Provide some information about the compiler. +printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion -version; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ int -main () +main (void) { -#ifdef _REENTRANT - int dummy=1; -#else - force compilation error -#endif - ; return 0; } - _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - tmp_reentrant_initially_defined="yes" - -else - - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - tmp_reentrant_initially_defined="no" +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" +# Try to create an executable without -o first, disregard a.out. +# It will help us diagnose broken compilers, and finding out an intuition +# of exeext. +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 +printf %s "checking whether the C compiler works... " >&6; } +ac_link_default=`printf "%s\n" "$ac_link" | sed 's/ -o *conftest[^ ]*//'` -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - # - if test "$tmp_reentrant_initially_defined" = "no"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if _REENTRANT is actually needed" >&5 -$as_echo_n "checking if _REENTRANT is actually needed... " >&6; } +# The possible output files: +ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" - case $host in - *-*-solaris* | *-*-hpux*) - tmp_need_reentrant="yes" - ;; - *) - tmp_need_reentrant="no" - ;; +ac_rmfiles= +for ac_file in $ac_files +do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac +done +rm -f $ac_rmfiles +if { { ac_try="$ac_link_default" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_link_default") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +then : + # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. +# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' +# in a Makefile. We should not override ac_cv_exeext if it was cached, +# so that the user can short-circuit this test for compilers unknown to +# Autoconf. +for ac_file in $ac_files '' +do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + if test ${ac_cv_exeext+y} && test "$ac_cv_exeext" != no; + then :; else + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + fi + # We set ac_cv_exeext here because the later test for it is not + # safe: cross compilers may not add the suffix if given an `-o' + # argument, so we may need to know it at that point already. + # Even if this section looks crufty: it has the advantage of + # actually working. + break;; + * ) + break;; + esac +done +test "$ac_cv_exeext" = no && ac_cv_exeext= - if test "$tmp_need_reentrant" = "yes"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - fi - fi - # - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if _REENTRANT is onwards defined" >&5 -$as_echo_n "checking if _REENTRANT is onwards defined... " >&6; } - if test "$tmp_reentrant_initially_defined" = "yes" || - test "$tmp_need_reentrant" = "yes"; then - - -$as_echo "#define NEED_REENTRANT 1" >>confdefs.h - -cat >>confdefs.h <<_EOF -#ifndef _REENTRANT -# define _REENTRANT -#endif -_EOF +else $as_nop + ac_file='' +fi +if test -z "$ac_file" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +printf "%s\n" "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - fi - # +{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "C compiler cannot create executables +See \`config.log' for more details" "$LINENO" 5; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 +printf %s "checking for C compiler default output file name... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 +printf "%s\n" "$ac_file" >&6; } +ac_exeext=$ac_cv_exeext +rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 +printf %s "checking for suffix of executables... " >&6; } +if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +then : + # If both `conftest.exe' and `conftest' are `present' (well, observable) +# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +# work properly (i.e., refer to `conftest.exe'), while it won't with +# `rm'. +for ac_file in conftest.exe conftest conftest.*; do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + break;; + * ) break;; + esac +done +else $as_nop + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest conftest$ac_cv_exeext +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 +printf "%s\n" "$ac_cv_exeext" >&6; } -# Some systems (Solaris?) have socket() in -lsocket. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing socket" >&5 -$as_echo_n "checking for library containing socket... " >&6; } -if ${ac_cv_search_socket+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_func_search_save_LIBS=$LIBS +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char socket (); +#include int -main () +main (void) { -return socket (); +FILE *f = fopen ("conftest.out", "w"); + return ferror (f) || fclose (f) != 0; + ; return 0; } _ACEOF -for ac_lib in '' socket; do - if test -z "$ac_lib"; then - ac_res="none required" +ac_clean_files="$ac_clean_files conftest.out" +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 +printf %s "checking whether we are cross compiling... " >&6; } +if test "$cross_compiling" != yes; then + { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if { ac_try='./conftest$ac_cv_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then + cross_compiling=no else - ac_res=-l$ac_lib - LIBS="-l$ac_lib $ac_func_search_save_LIBS" + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details" "$LINENO" 5; } + fi fi - if ac_fn_c_try_link "$LINENO"; then : - ac_cv_search_socket=$ac_res -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext - if ${ac_cv_search_socket+:} false; then : - break -fi -done -if ${ac_cv_search_socket+:} false; then : - -else - ac_cv_search_socket=no -fi -rm conftest.$ac_ext -LIBS=$ac_func_search_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_socket" >&5 -$as_echo "$ac_cv_search_socket" >&6; } -ac_res=$ac_cv_search_socket -if test "$ac_res" != no; then : - test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" - fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 +printf "%s\n" "$cross_compiling" >&6; } - -# Solaris has inet_addr() in -lnsl. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing inet_addr" >&5 -$as_echo_n "checking for library containing inet_addr... " >&6; } -if ${ac_cv_search_inet_addr+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_func_search_save_LIBS=$LIBS -cat confdefs.h - <<_ACEOF >conftest.$ac_ext +rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out +ac_clean_files=$ac_clean_files_save +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 +printf %s "checking for suffix of object files... " >&6; } +if test ${ac_cv_objext+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char inet_addr (); int -main () +main (void) { -return inet_addr (); + ; return 0; } _ACEOF -for ac_lib in '' nsl; do - if test -z "$ac_lib"; then - ac_res="none required" - else - ac_res=-l$ac_lib - LIBS="-l$ac_lib $ac_func_search_save_LIBS" - fi - if ac_fn_c_try_link "$LINENO"; then : - ac_cv_search_inet_addr=$ac_res -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext - if ${ac_cv_search_inet_addr+:} false; then : - break -fi -done -if ${ac_cv_search_inet_addr+:} false; then : - -else - ac_cv_search_inet_addr=no -fi -rm conftest.$ac_ext -LIBS=$ac_func_search_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_inet_addr" >&5 -$as_echo "$ac_cv_search_inet_addr" >&6; } -ac_res=$ac_cv_search_inet_addr -if test "$ac_res" != no; then : - test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" +rm -f conftest.o conftest.obj +if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +then : + for ac_file in conftest.o conftest.obj conftest.*; do + test -f "$ac_file" || continue; + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else $as_nop + printf "%s\n" "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 +{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of object files: cannot compile +See \`config.log' for more details" "$LINENO" 5; } fi +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 +printf "%s\n" "$ac_cv_objext" >&6; } +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C" >&5 +printf %s "checking whether the compiler supports GNU C... " >&6; } +if test ${ac_cv_c_compiler_gnu+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int +main (void) +{ +#ifndef __GNUC__ + choke me +#endif + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_compiler_gnu=yes +else $as_nop + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +printf "%s\n" "$ac_cv_c_compiler_gnu" >&6; } ac_compiler_gnu=$ac_cv_c_compiler_gnu -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. -set dummy ${ac_tool_prefix}gcc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_CC="${ac_tool_prefix}gcc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } +if test $ac_compiler_gnu = yes; then + GCC=yes else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + GCC= fi +ac_test_CFLAGS=${CFLAGS+y} +ac_save_CFLAGS=$CFLAGS +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +printf %s "checking whether $CC accepts -g... " >&6; } +if test ${ac_cv_prog_cc_g+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int +main (void) +{ -fi -if test -z "$ac_cv_prog_CC"; then - ac_ct_CC=$CC - # Extract the first word of "gcc", so it can be a program name with args. -set dummy gcc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_CC"; then - ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_CC="gcc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_prog_cc_g=yes +else $as_nop + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + +else $as_nop + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_prog_cc_g=yes fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi -ac_ct_CC=$ac_cv_prog_ac_ct_CC -if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 -$as_echo "$ac_ct_CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi - - if test "x$ac_ct_CC" = x; then - CC="" +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +printf "%s\n" "$ac_cv_prog_cc_g" >&6; } +if test $ac_test_CFLAGS; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - CC=$ac_ct_CC + CFLAGS="-g" fi else - CC="$ac_cv_prog_CC" + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi fi - -if test -z "$CC"; then - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. -set dummy ${ac_tool_prefix}cc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH +ac_prog_cc_stdc=no +if test x$ac_prog_cc_stdc = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C11 features" >&5 +printf %s "checking for $CC option to enable C11 features... " >&6; } +if test ${ac_cv_prog_cc_c11+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_prog_cc_c11=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_c_conftest_c11_program +_ACEOF +for ac_arg in '' -std=gnu11 do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_CC="${ac_tool_prefix}cc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_prog_cc_c11=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam + test "x$ac_cv_prog_cc_c11" != "xno" && break done - done -IFS=$as_save_IFS - +rm -f conftest.$ac_ext +CC=$ac_save_CC fi + +if test "x$ac_cv_prog_cc_c11" = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +printf "%s\n" "unsupported" >&6; } +else $as_nop + if test "x$ac_cv_prog_cc_c11" = x +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +printf "%s\n" "none needed" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5 +printf "%s\n" "$ac_cv_prog_cc_c11" >&6; } + CC="$CC $ac_cv_prog_cc_c11" +fi + ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11 + ac_prog_cc_stdc=c11 +fi +fi +if test x$ac_prog_cc_stdc = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C99 features" >&5 +printf %s "checking for $CC option to enable C99 features... " >&6; } +if test ${ac_cv_prog_cc_c99+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_prog_cc_c99=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_c_conftest_c99_program +_ACEOF +for ac_arg in '' -std=gnu99 -std=c99 -c99 -qlanglvl=extc1x -qlanglvl=extc99 -AC99 -D_STDC_C99= +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_prog_cc_c99=$ac_arg fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } +rm -f core conftest.err conftest.$ac_objext conftest.beam + test "x$ac_cv_prog_cc_c99" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC fi - - fi -fi -if test -z "$CC"; then - # Extract the first word of "cc", so it can be a program name with args. -set dummy cc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - ac_prog_rejected=no -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH +if test "x$ac_cv_prog_cc_c99" = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +printf "%s\n" "unsupported" >&6; } +else $as_nop + if test "x$ac_cv_prog_cc_c99" = x +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +printf "%s\n" "none needed" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 +printf "%s\n" "$ac_cv_prog_cc_c99" >&6; } + CC="$CC $ac_cv_prog_cc_c99" +fi + ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99 + ac_prog_cc_stdc=c99 +fi +fi +if test x$ac_prog_cc_stdc = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C89 features" >&5 +printf %s "checking for $CC option to enable C89 features... " >&6; } +if test ${ac_cv_prog_cc_c89+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_c_conftest_c89_program +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then - ac_prog_rejected=yes - continue - fi - ac_cv_prog_CC="cc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam + test "x$ac_cv_prog_cc_c89" != "xno" && break done - done -IFS=$as_save_IFS - -if test $ac_prog_rejected = yes; then - # We found a bogon in the path, so make sure we never use it. - set dummy $ac_cv_prog_CC - shift - if test $# != 0; then - # We chose a different compiler from the bogus one. - # However, it has the same basename, so the bogon will be chosen - # first if we set CC to just the basename; use the full file name. - shift - ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" - fi +rm -f conftest.$ac_ext +CC=$ac_save_CC fi + +if test "x$ac_cv_prog_cc_c89" = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +printf "%s\n" "unsupported" >&6; } +else $as_nop + if test "x$ac_cv_prog_cc_c89" = x +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +printf "%s\n" "none needed" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +printf "%s\n" "$ac_cv_prog_cc_c89" >&6; } + CC="$CC $ac_cv_prog_cc_c89" fi + ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89 + ac_prog_cc_stdc=c89 fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu -fi -if test -z "$CC"; then - if test -n "$ac_tool_prefix"; then - for ac_prog in cl.exe - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_CC="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$CC" && break - done -fi -if test -z "$CC"; then - ac_ct_CC=$CC - for ac_prog in cl.exe -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_CC"; then - ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_CC="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_CC=$ac_cv_prog_ac_ct_CC -if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 -$as_echo "$ac_ct_CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$ac_ct_CC" && break -done - - if test "x$ac_ct_CC" = x; then - CC="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - CC=$ac_ct_CC - fi -fi - -fi - - -test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "no acceptable C compiler found in \$PATH -See \`config.log' for more details" "$LINENO" 5; } - -# Provide some information about the compiler. -$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 -set X $ac_compile -ac_compiler=$2 -for ac_option in --version -v -V -qversion; do - { { ac_try="$ac_compiler $ac_option >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compiler $ac_option >&5") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - sed '10a\ -... rest of stderr output deleted ... - 10q' conftest.err >conftest.er1 - cat conftest.er1 >&5 - fi - rm -f conftest.er1 conftest.err - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } -done -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 -$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } -if ${ac_cv_c_compiler_gnu+:} false; then : - $as_echo_n "(cached) " >&6 -else + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 +printf %s "checking whether $CC understands -c and -o together... " >&6; } +if test ${am_cv_prog_cc_c_o+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int -main () -{ -#ifndef __GNUC__ - choke me -#endif - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_compiler_gnu=yes -else - ac_compiler_gnu=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -ac_cv_c_compiler_gnu=$ac_compiler_gnu - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 -$as_echo "$ac_cv_c_compiler_gnu" >&6; } -if test $ac_compiler_gnu = yes; then - GCC=yes -else - GCC= -fi -ac_test_CFLAGS=${CFLAGS+set} -ac_save_CFLAGS=$CFLAGS -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 -$as_echo_n "checking whether $CC accepts -g... " >&6; } -if ${ac_cv_prog_cc_g+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_save_c_werror_flag=$ac_c_werror_flag - ac_c_werror_flag=yes - ac_cv_prog_cc_g=no - CFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_g=yes -else - CFLAGS="" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - -else - ac_c_werror_flag=$ac_save_c_werror_flag - CFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_g=yes -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - ac_c_werror_flag=$ac_save_c_werror_flag -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 -$as_echo "$ac_cv_prog_cc_g" >&6; } -if test "$ac_test_CFLAGS" = set; then - CFLAGS=$ac_save_CFLAGS -elif test $ac_cv_prog_cc_g = yes; then - if test "$GCC" = yes; then - CFLAGS="-g -O2" - else - CFLAGS="-g" - fi -else - if test "$GCC" = yes; then - CFLAGS="-O2" - else - CFLAGS= - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 -$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } -if ${ac_cv_prog_cc_c89+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_cv_prog_cc_c89=no -ac_save_CC=$CC -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -struct stat; -/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ -struct buf { int x; }; -FILE * (*rcsopen) (struct buf *, struct stat *, int); -static char *e (p, i) - char **p; - int i; +main (void) { - return p[i]; -} -static char *f (char * (*g) (char **, int), char **p, ...) -{ - char *s; - va_list v; - va_start (v,p); - s = g (p, va_arg (v,int)); - va_end (v); - return s; -} - -/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has - function prototypes and stuff, but not '\xHH' hex character constants. - These don't provoke an error unfortunately, instead are silently treated - as 'x'. The following induces an error, until -std is added to get - proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an - array size at least. It's necessary to write '\x00'==0 to get something - that's true only with -std. */ -int osf4_cc_array ['\x00' == 0 ? 1 : -1]; - -/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters - inside strings and character constants. */ -#define FOO(x) 'x' -int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; -int test (int i, double x); -struct s1 {int (*f) (int a);}; -struct s2 {int (*f) (double a);}; -int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); -int argc; -char **argv; -int -main () -{ -return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF -for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ - -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" -do - CC="$ac_save_CC $ac_arg" - if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_c89=$ac_arg -fi -rm -f core conftest.err conftest.$ac_objext - test "x$ac_cv_prog_cc_c89" != "xno" && break -done -rm -f conftest.$ac_ext -CC=$ac_save_CC - -fi -# AC_CACHE_VAL -case "x$ac_cv_prog_cc_c89" in - x) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 -$as_echo "none needed" >&6; } ;; - xno) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 -$as_echo "unsupported" >&6; } ;; - *) - CC="$CC $ac_cv_prog_cc_c89" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 -$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; -esac -if test "x$ac_cv_prog_cc_c89" != xno; then : - + # Make sure it works both with $CC and with simple cc. + # Following AC_PROG_CC_C_O, we do the test twice because some + # compilers refuse to overwrite an existing .o file with -o, + # though they will create one. + am_cv_prog_cc_c_o=yes + for am_i in 1 2; do + if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 + ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } \ + && test -f conftest2.$ac_objext; then + : OK + else + am_cv_prog_cc_c_o=no + break + fi + done + rm -f core conftest* + unset am_i +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 +printf "%s\n" "$am_cv_prog_cc_c_o" >&6; } +if test "$am_cv_prog_cc_c_o" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" fi - ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu + depcc="$CC" am_compiler_list= -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 -$as_echo_n "checking dependency style of $depcc... " >&6; } -if ${am_cv_CC_dependencies_compiler_type+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +printf %s "checking dependency style of $depcc... " >&6; } +if test ${am_cv_CC_dependencies_compiler_type+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up - # making a dummy file named `D' -- because `-MD' means `put the output - # in D'. + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're @@ -5216,16 +5169,16 @@ else : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c - # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with - # Solaris 8's {/usr,}/bin/sh. - touch sub/conftst$i.h + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf - # We check with `-c' and `-o' for the sake of the "dashmstdout" + # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly - # handle `-M -o', and we need to detect this. Also, some Intel - # versions had trouble with output in subdirs + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in @@ -5234,8 +5187,8 @@ else test "$am__universal" = false || continue ;; nosideeffect) - # after this tag, mechanisms are not by side-effect, so they'll - # only be used when explicitly requested + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else @@ -5243,7 +5196,7 @@ else fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) - # This compiler won't grok `-c -o', but also, the minuso test has + # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} @@ -5282,8 +5235,8 @@ else fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 -$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 +printf "%s\n" "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if @@ -5298,125 +5251,286 @@ fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 -$as_echo_n "checking whether ln -s works... " >&6; } -LN_S=$as_ln_s -if test "$LN_S" = "ln -s"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 -$as_echo "no, using $LN_S" >&6; } -fi +ac_header= ac_cache= +for ac_item in $ac_header_c_list +do + if test $ac_cache; then + ac_fn_c_check_header_compile "$LINENO" $ac_header ac_cv_header_$ac_cache "$ac_includes_default" + if eval test \"x\$ac_cv_header_$ac_cache\" = xyes; then + printf "%s\n" "#define $ac_item 1" >> confdefs.h + fi + ac_header= ac_cache= + elif test $ac_header; then + ac_cache=$ac_item + else + ac_header=$ac_item + fi +done + + + + + + + + +if test $ac_cv_header_stdlib_h = yes && test $ac_cv_header_string_h = yes +then : + +printf "%s\n" "#define STDC_HEADERS 1" >>confdefs.h -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 -$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } -set x ${MAKE-make} -ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` -if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat >conftest.make <<\_ACEOF -SHELL = /bin/sh -all: - @echo '@@@%%%=$(MAKE)=@@@%%%' -_ACEOF -# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. -case `${MAKE-make} -f conftest.make 2>/dev/null` in - *@@@%%%=?*=@@@%%%*) - eval ac_cv_prog_make_${ac_make}_set=yes;; - *) - eval ac_cv_prog_make_${ac_make}_set=no;; -esac -rm -f conftest.make fi -if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - SET_MAKE= -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - SET_MAKE="MAKE=${MAKE-make}" +ac_fn_c_check_type "$LINENO" "long long" "ac_cv_type_long_long" "$ac_includes_default" +if test "x$ac_cv_type_long_long" = xyes +then : + +printf "%s\n" "#define HAVE_LONGLONG 1" >>confdefs.h + + longlong="yes" + fi -for ac_prog in sshd -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_SSHD+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $SSHD in - [\\/]* | ?:[\\/]*) - ac_cv_path_SSHD="$SSHD" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/usr/libexec$PATH_SEPARATOR /usr/sbin$PATH_SEPARATOR/usr/etc$PATH_SEPARATOR/etc + + + # + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if _REENTRANT is already defined" >&5 +printf %s "checking if _REENTRANT is already defined... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + + +int +main (void) +{ + +#ifdef _REENTRANT + int dummy=1; +#else + force compilation error +#endif + + ; + return 0; +} + +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + tmp_reentrant_initially_defined="yes" + +else $as_nop + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + tmp_reentrant_initially_defined="no" + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + # + if test "$tmp_reentrant_initially_defined" = "no"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if _REENTRANT is actually needed" >&5 +printf %s "checking if _REENTRANT is actually needed... " >&6; } + + case $host in + *-*-solaris* | *-*-hpux*) + tmp_need_reentrant="yes" + ;; + *) + tmp_need_reentrant="no" + ;; + esac + + + if test "$tmp_need_reentrant" = "yes"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + fi + fi + # + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if _REENTRANT is onwards defined" >&5 +printf %s "checking if _REENTRANT is onwards defined... " >&6; } + if test "$tmp_reentrant_initially_defined" = "yes" || + test "$tmp_need_reentrant" = "yes"; then + + +printf "%s\n" "#define NEED_REENTRANT 1" >>confdefs.h + +cat >>confdefs.h <<_EOF +#ifndef _REENTRANT +# define _REENTRANT +#endif +_EOF + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + fi + # + + +# Some systems (Solaris?) have socket() in -lsocket. +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing socket" >&5 +printf %s "checking for library containing socket... " >&6; } +if test ${ac_cv_search_socket+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char socket (); +int +main (void) +{ +return socket (); + ; + return 0; +} +_ACEOF +for ac_lib in '' socket do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_SSHD="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi + if ac_fn_c_try_link "$LINENO" +then : + ac_cv_search_socket=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext + if test ${ac_cv_search_socket+y} +then : + break +fi done - done -IFS=$as_save_IFS +if test ${ac_cv_search_socket+y} +then : - ;; -esac +else $as_nop + ac_cv_search_socket=no fi -SSHD=$ac_cv_path_SSHD -if test -n "$SSHD"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $SSHD" >&5 -$as_echo "$SSHD" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_socket" >&5 +printf "%s\n" "$ac_cv_search_socket" >&6; } +ac_res=$ac_cv_search_socket +if test "$ac_res" != no +then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + fi - test -n "$SSHD" && break +# Solaris has inet_addr() in -lnsl. +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing inet_addr" >&5 +printf %s "checking for library containing inet_addr... " >&6; } +if test ${ac_cv_search_inet_addr+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char inet_addr (); +int +main (void) +{ +return inet_addr (); + ; + return 0; +} +_ACEOF +for ac_lib in '' nsl +do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO" +then : + ac_cv_search_inet_addr=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext + if test ${ac_cv_search_inet_addr+y} +then : + break +fi done +if test ${ac_cv_search_inet_addr+y} +then : - if test -n "$SSHD"; then - SSHD_TRUE= - SSHD_FALSE='#' -else - SSHD_TRUE='#' - SSHD_FALSE= +else $as_nop + ac_cv_search_inet_addr=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_inet_addr" >&5 +printf "%s\n" "$ac_cv_search_inet_addr" >&6; } +ac_res=$ac_cv_search_inet_addr +if test "$ac_res" != no +then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" -enable_win32_dll=yes +fi -case $host in -*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args. -set dummy ${ac_tool_prefix}as; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_AS+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$AS"; then - ac_cv_prog_AS="$AS" # Let the user override the test. + + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_AS="${ac_tool_prefix}as" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -5425,38 +5539,43 @@ IFS=$as_save_IFS fi fi -AS=$ac_cv_prog_AS -if test -n "$AS"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AS" >&5 -$as_echo "$AS" >&6; } +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi fi -if test -z "$ac_cv_prog_AS"; then - ac_ct_AS=$AS - # Extract the first word of "as", so it can be a program name with args. -set dummy as; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_AS+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_AS"; then - ac_cv_prog_ac_ct_AS="$ac_ct_AS" # Let the user override the test. +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_AS="as" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="gcc" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -5465,90 +5584,214 @@ IFS=$as_save_IFS fi fi -ac_ct_AS=$ac_cv_prog_ac_ct_AS -if test -n "$ac_ct_AS"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AS" >&5 -$as_echo "$ac_ct_AS" >&6; } +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +printf "%s\n" "$ac_ct_CC" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi - if test "x$ac_ct_AS" = x; then - AS="false" + if test "x$ac_ct_CC" = x; then + CC="" else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac - AS=$ac_ct_AS + CC=$ac_ct_CC fi else - AS="$ac_cv_prog_AS" + CC="$ac_cv_prog_CC" fi - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. -set dummy ${ac_tool_prefix}dlltool; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_DLLTOOL+:} false; then : - $as_echo_n "(cached) " >&6 +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. else - if test -n "$DLLTOOL"; then - ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + fi +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. else + ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + if test "$as_dir$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir$ac_word${1+' '}$@" + fi fi fi -DLLTOOL=$ac_cv_prog_DLLTOOL -if test -n "$DLLTOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 -$as_echo "$DLLTOOL" >&6; } +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi fi -if test -z "$ac_cv_prog_DLLTOOL"; then - ac_ct_DLLTOOL=$DLLTOOL - # Extract the first word of "dlltool", so it can be a program name with args. -set dummy dlltool; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : - $as_echo_n "(cached) " >&6 +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. else - if test -n "$ac_ct_DLLTOOL"; then - ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl.exe +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_DLLTOOL="dlltool" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -5557,50 +5800,59 @@ IFS=$as_save_IFS fi fi -ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL -if test -n "$ac_ct_DLLTOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 -$as_echo "$ac_ct_DLLTOOL" >&6; } +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +printf "%s\n" "$ac_ct_CC" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi - if test "x$ac_ct_DLLTOOL" = x; then - DLLTOOL="false" + + test -n "$ac_ct_CC" && break +done + + if test "x$ac_ct_CC" = x; then + CC="" else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac - DLLTOOL=$ac_ct_DLLTOOL + CC=$ac_ct_CC fi -else - DLLTOOL="$ac_cv_prog_DLLTOOL" fi +fi +if test -z "$CC"; then if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. -set dummy ${ac_tool_prefix}objdump; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_OBJDUMP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$OBJDUMP"; then - ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. + # Extract the first word of "${ac_tool_prefix}clang", so it can be a program name with args. +set dummy ${ac_tool_prefix}clang; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}clang" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -5609,38 +5861,43 @@ IFS=$as_save_IFS fi fi -OBJDUMP=$ac_cv_prog_OBJDUMP -if test -n "$OBJDUMP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 -$as_echo "$OBJDUMP" >&6; } +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi fi -if test -z "$ac_cv_prog_OBJDUMP"; then - ac_ct_OBJDUMP=$OBJDUMP - # Extract the first word of "objdump", so it can be a program name with args. -set dummy objdump; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_OBJDUMP"; then - ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "clang", so it can be a program name with args. +set dummy clang; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_OBJDUMP="objdump" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="clang" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -5649,139 +5906,520 @@ IFS=$as_save_IFS fi fi -ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP -if test -n "$ac_ct_OBJDUMP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 -$as_echo "$ac_ct_OBJDUMP" >&6; } +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +printf "%s\n" "$ac_ct_CC" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi - if test "x$ac_ct_OBJDUMP" = x; then - OBJDUMP="false" + if test "x$ac_ct_CC" = x; then + CC="" else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac - OBJDUMP=$ac_ct_OBJDUMP + CC=$ac_ct_CC fi else - OBJDUMP="$ac_cv_prog_OBJDUMP" + CC="$ac_cv_prog_CC" fi - ;; -esac - -test -z "$AS" && AS=as - - - - - -test -z "$DLLTOOL" && DLLTOOL=dlltool - - - - - -test -z "$OBJDUMP" && OBJDUMP=objdump - - - - +fi +test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "no acceptable C compiler found in \$PATH +See \`config.log' for more details" "$LINENO" 5; } -case `pwd` in - *\ * | *\ *) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 -$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; +# Provide some information about the compiler. +printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion -version; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C" >&5 +printf %s "checking whether the compiler supports GNU C... " >&6; } +if test ${ac_cv_c_compiler_gnu+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int +main (void) +{ +#ifndef __GNUC__ + choke me +#endif -macro_version='2.4.2' -macro_revision='1.3337' - - - - - + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_compiler_gnu=yes +else $as_nop + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +printf "%s\n" "$ac_cv_c_compiler_gnu" >&6; } +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+y} +ac_save_CFLAGS=$CFLAGS +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +printf %s "checking whether $CC accepts -g... " >&6; } +if test ${ac_cv_prog_cc_g+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int +main (void) +{ + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_prog_cc_g=yes +else $as_nop + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int +main (void) +{ + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : +else $as_nop + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ -ltmain="$ac_aux_dir/ltmain.sh" +int +main (void) +{ -# Backslashify metacharacters that are still active within -# double-quoted strings. -sed_quote_subst='s/\(["`$\\]\)/\\\1/g' + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_prog_cc_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +printf "%s\n" "$ac_cv_prog_cc_g" >&6; } +if test $ac_test_CFLAGS; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +ac_prog_cc_stdc=no +if test x$ac_prog_cc_stdc = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C11 features" >&5 +printf %s "checking for $CC option to enable C11 features... " >&6; } +if test ${ac_cv_prog_cc_c11+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_prog_cc_c11=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_c_conftest_c11_program +_ACEOF +for ac_arg in '' -std=gnu11 +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_prog_cc_c11=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam + test "x$ac_cv_prog_cc_c11" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC +fi -# Same as above, but do not quote variable references. -double_quote_subst='s/\(["`\\]\)/\\\1/g' +if test "x$ac_cv_prog_cc_c11" = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +printf "%s\n" "unsupported" >&6; } +else $as_nop + if test "x$ac_cv_prog_cc_c11" = x +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +printf "%s\n" "none needed" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5 +printf "%s\n" "$ac_cv_prog_cc_c11" >&6; } + CC="$CC $ac_cv_prog_cc_c11" +fi + ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11 + ac_prog_cc_stdc=c11 +fi +fi +if test x$ac_prog_cc_stdc = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C99 features" >&5 +printf %s "checking for $CC option to enable C99 features... " >&6; } +if test ${ac_cv_prog_cc_c99+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_prog_cc_c99=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_c_conftest_c99_program +_ACEOF +for ac_arg in '' -std=gnu99 -std=c99 -c99 -qlanglvl=extc1x -qlanglvl=extc99 -AC99 -D_STDC_C99= +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_prog_cc_c99=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam + test "x$ac_cv_prog_cc_c99" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC +fi -# Sed substitution to delay expansion of an escaped shell variable in a -# double_quote_subst'ed string. -delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' +if test "x$ac_cv_prog_cc_c99" = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +printf "%s\n" "unsupported" >&6; } +else $as_nop + if test "x$ac_cv_prog_cc_c99" = x +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +printf "%s\n" "none needed" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 +printf "%s\n" "$ac_cv_prog_cc_c99" >&6; } + CC="$CC $ac_cv_prog_cc_c99" +fi + ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99 + ac_prog_cc_stdc=c99 +fi +fi +if test x$ac_prog_cc_stdc = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C89 features" >&5 +printf %s "checking for $CC option to enable C89 features... " >&6; } +if test ${ac_cv_prog_cc_c89+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_c_conftest_c89_program +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC +fi -# Sed substitution to delay expansion of an escaped single quote. -delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' +if test "x$ac_cv_prog_cc_c89" = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +printf "%s\n" "unsupported" >&6; } +else $as_nop + if test "x$ac_cv_prog_cc_c89" = x +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +printf "%s\n" "none needed" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +printf "%s\n" "$ac_cv_prog_cc_c89" >&6; } + CC="$CC $ac_cv_prog_cc_c89" +fi + ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89 + ac_prog_cc_stdc=c89 +fi +fi -# Sed substitution to avoid accidental globbing in evaled expressions -no_glob_subst='s/\*/\\\*/g' +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu -ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' -ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO -ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 -$as_echo_n "checking how to print strings... " >&6; } -# Test print first, because it will be a builtin if present. -if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ - test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then - ECHO='print -r --' -elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then - ECHO='printf %s\n' -else - # Use this function as a fallback that always works. - func_fallback_echo () - { - eval 'cat <<_LTECHO_EOF -$1 -_LTECHO_EOF' - } - ECHO='func_fallback_echo' -fi + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 +printf %s "checking whether $CC understands -c and -o together... " >&6; } +if test ${am_cv_prog_cc_c_o+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ -# func_echo_all arg... -# Invoke $ECHO with all args, space-separated. -func_echo_all () +int +main (void) { - $ECHO "" + + ; + return 0; } +_ACEOF + # Make sure it works both with $CC and with simple cc. + # Following AC_PROG_CC_C_O, we do the test twice because some + # compilers refuse to overwrite an existing .o file with -o, + # though they will create one. + am_cv_prog_cc_c_o=yes + for am_i in 1 2; do + if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 + ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } \ + && test -f conftest2.$ac_objext; then + : OK + else + am_cv_prog_cc_c_o=no + break + fi + done + rm -f core conftest* + unset am_i +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 +printf "%s\n" "$am_cv_prog_cc_c_o" >&6; } +if test "$am_cv_prog_cc_c_o" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu -case "$ECHO" in - printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5 -$as_echo "printf" >&6; } ;; - print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 -$as_echo "print -r" >&6; } ;; - *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5 -$as_echo "cat" >&6; } ;; -esac +depcc="$CC" am_compiler_list= + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +printf %s "checking dependency style of $depcc... " >&6; } +if test ${am_cv_CC_dependencies_compiler_type+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CC_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CC_dependencies_compiler_type=$depmode + break + fi + fi + done + cd .. + rm -rf conftest.dir +else + am_cv_CC_dependencies_compiler_type=none +fi +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 +printf "%s\n" "$am_cv_CC_dependencies_compiler_type" >&6; } +CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then + am__fastdepCC_TRUE= + am__fastdepCC_FALSE='#' +else + am__fastdepCC_TRUE='#' + am__fastdepCC_FALSE= +fi @@ -5790,366 +6428,635 @@ esac -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 -$as_echo_n "checking for a sed that does not truncate output... " >&6; } -if ${ac_cv_path_SED+:} false; then : - $as_echo_n "(cached) " >&6 +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +if test -z "$CXX"; then + if test -n "$CCC"; then + CXX=$CCC + else + if test -n "$ac_tool_prefix"; then + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC clang++ + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CXX+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$CXX"; then + ac_cv_prog_CXX="$CXX" # Let the user override the test. else - ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ - for ac_i in 1 2 3 4 5 6 7; do - ac_script="$ac_script$as_nl$ac_script" - done - echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed - { ac_script=; unset ac_script;} - if test -z "$SED"; then - ac_path_SED_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in sed gsed; do + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_SED" || continue -# Check for GNU ac_path_SED and select it if it is found. - # Check for GNU $ac_path_SED -case `"$ac_path_SED" --version 2>&1` in -*GNU*) - ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; -*) - ac_count=0 - $as_echo_n 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - $as_echo '' >> "conftest.nl" - "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_SED_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_SED="$ac_path_SED" - ac_path_SED_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - $ac_path_SED_found && break 3 - done - done + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done done IFS=$as_save_IFS - if test -z "$ac_cv_path_SED"; then - as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 - fi -else - ac_cv_path_SED=$SED -fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 -$as_echo "$ac_cv_path_SED" >&6; } - SED="$ac_cv_path_SED" - rm -f conftest.sed - -test -z "$SED" && SED=sed -Xsed="$SED -e 1s/^X//" - - - - - - - - - +fi +CXX=$ac_cv_prog_CXX +if test -n "$CXX"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 +printf "%s\n" "$CXX" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 -$as_echo_n "checking for fgrep... " >&6; } -if ${ac_cv_path_FGREP+:} false; then : - $as_echo_n "(cached) " >&6 + test -n "$CXX" && break + done +fi +if test -z "$CXX"; then + ac_ct_CXX=$CXX + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC clang++ +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_CXX+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_CXX"; then + ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else - if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 - then ac_cv_path_FGREP="$GREP -F" - else - if test -z "$FGREP"; then - ac_path_FGREP_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in fgrep; do + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_FGREP" || continue -# Check for GNU ac_path_FGREP and select it if it is found. - # Check for GNU $ac_path_FGREP -case `"$ac_path_FGREP" --version 2>&1` in -*GNU*) - ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; -*) - ac_count=0 - $as_echo_n 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - $as_echo 'FGREP' >> "conftest.nl" - "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_FGREP_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_FGREP="$ac_path_FGREP" - ac_path_FGREP_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - $ac_path_FGREP_found && break 3 - done - done + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CXX="$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done done IFS=$as_save_IFS - if test -z "$ac_cv_path_FGREP"; then - as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 - fi + +fi +fi +ac_ct_CXX=$ac_cv_prog_ac_ct_CXX +if test -n "$ac_ct_CXX"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 +printf "%s\n" "$ac_ct_CXX" >&6; } else - ac_cv_path_FGREP=$FGREP + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 -$as_echo "$ac_cv_path_FGREP" >&6; } - FGREP="$ac_cv_path_FGREP" + test -n "$ac_ct_CXX" && break +done -test -z "$GREP" && GREP=grep + if test "x$ac_ct_CXX" = x; then + CXX="g++" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CXX=$ac_ct_CXX + fi +fi + fi +fi +# Provide some information about the compiler. +printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C++" >&5 +printf %s "checking whether the compiler supports GNU C++... " >&6; } +if test ${ac_cv_cxx_compiler_gnu+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int +main (void) +{ +#ifndef __GNUC__ + choke me +#endif + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO" +then : + ac_compiler_gnu=yes +else $as_nop + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +ac_cv_cxx_compiler_gnu=$ac_compiler_gnu +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 +printf "%s\n" "$ac_cv_cxx_compiler_gnu" >&6; } +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +if test $ac_compiler_gnu = yes; then + GXX=yes +else + GXX= +fi +ac_test_CXXFLAGS=${CXXFLAGS+y} +ac_save_CXXFLAGS=$CXXFLAGS +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 +printf %s "checking whether $CXX accepts -g... " >&6; } +if test ${ac_cv_prog_cxx_g+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_save_cxx_werror_flag=$ac_cxx_werror_flag + ac_cxx_werror_flag=yes + ac_cv_prog_cxx_g=no + CXXFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int +main (void) +{ + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO" +then : + ac_cv_prog_cxx_g=yes +else $as_nop + CXXFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int +main (void) +{ + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO" +then : +else $as_nop + ac_cxx_werror_flag=$ac_save_cxx_werror_flag + CXXFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int +main (void) +{ + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO" +then : + ac_cv_prog_cxx_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + ac_cxx_werror_flag=$ac_save_cxx_werror_flag +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 +printf "%s\n" "$ac_cv_prog_cxx_g" >&6; } +if test $ac_test_CXXFLAGS; then + CXXFLAGS=$ac_save_CXXFLAGS +elif test $ac_cv_prog_cxx_g = yes; then + if test "$GXX" = yes; then + CXXFLAGS="-g -O2" + else + CXXFLAGS="-g" + fi +else + if test "$GXX" = yes; then + CXXFLAGS="-O2" + else + CXXFLAGS= + fi +fi +ac_prog_cxx_stdcxx=no +if test x$ac_prog_cxx_stdcxx = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CXX option to enable C++11 features" >&5 +printf %s "checking for $CXX option to enable C++11 features... " >&6; } +if test ${ac_cv_prog_cxx_11+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_prog_cxx_11=no +ac_save_CXX=$CXX +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_cxx_conftest_cxx11_program +_ACEOF +for ac_arg in '' -std=gnu++11 -std=gnu++0x -std=c++11 -std=c++0x -qlanglvl=extended0x -AA +do + CXX="$ac_save_CXX $ac_arg" + if ac_fn_cxx_try_compile "$LINENO" +then : + ac_cv_prog_cxx_cxx11=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam + test "x$ac_cv_prog_cxx_cxx11" != "xno" && break +done +rm -f conftest.$ac_ext +CXX=$ac_save_CXX +fi + +if test "x$ac_cv_prog_cxx_cxx11" = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +printf "%s\n" "unsupported" >&6; } +else $as_nop + if test "x$ac_cv_prog_cxx_cxx11" = x +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +printf "%s\n" "none needed" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_cxx11" >&5 +printf "%s\n" "$ac_cv_prog_cxx_cxx11" >&6; } + CXX="$CXX $ac_cv_prog_cxx_cxx11" +fi + ac_cv_prog_cxx_stdcxx=$ac_cv_prog_cxx_cxx11 + ac_prog_cxx_stdcxx=cxx11 +fi +fi +if test x$ac_prog_cxx_stdcxx = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CXX option to enable C++98 features" >&5 +printf %s "checking for $CXX option to enable C++98 features... " >&6; } +if test ${ac_cv_prog_cxx_98+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_prog_cxx_98=no +ac_save_CXX=$CXX +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_cxx_conftest_cxx98_program +_ACEOF +for ac_arg in '' -std=gnu++98 -std=c++98 -qlanglvl=extended -AA +do + CXX="$ac_save_CXX $ac_arg" + if ac_fn_cxx_try_compile "$LINENO" +then : + ac_cv_prog_cxx_cxx98=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam + test "x$ac_cv_prog_cxx_cxx98" != "xno" && break +done +rm -f conftest.$ac_ext +CXX=$ac_save_CXX +fi +if test "x$ac_cv_prog_cxx_cxx98" = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +printf "%s\n" "unsupported" >&6; } +else $as_nop + if test "x$ac_cv_prog_cxx_cxx98" = x +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +printf "%s\n" "none needed" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_cxx98" >&5 +printf "%s\n" "$ac_cv_prog_cxx_cxx98" >&6; } + CXX="$CXX $ac_cv_prog_cxx_cxx98" +fi + ac_cv_prog_cxx_stdcxx=$ac_cv_prog_cxx_cxx98 + ac_prog_cxx_stdcxx=cxx98 +fi +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +depcc="$CXX" am_compiler_list= +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +printf %s "checking dependency style of $depcc... " >&6; } +if test ${am_cv_CXX_dependencies_compiler_type+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + am_cv_CXX_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac -# Check whether --with-gnu-ld was given. -if test "${with_gnu_ld+set}" = set; then : - withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes -else - with_gnu_ld=no -fi + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf -ac_prog=ld -if test "$GCC" = yes; then - # Check if gcc -print-prog-name=ld gives a path. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 -$as_echo_n "checking for ld used by $CC... " >&6; } - case $host in - *-*-mingw*) - # gcc leaves a trailing carriage return which upsets mingw - ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; - *) - ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; - esac - case $ac_prog in - # Accept absolute paths. - [\\/]* | ?:[\\/]*) - re_direlt='/[^/][^/]*/\.\./' - # Canonicalize the pathname of ld - ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` - while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do - ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` - done - test -z "$LD" && LD="$ac_prog" + # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue ;; - "") - # If it fails, then pretend we aren't using GCC. - ac_prog=ld - ;; - *) - # If it is relative, then search for the first ld in PATH. - with_gnu_ld=unknown - ;; - esac -elif test "$with_gnu_ld" = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 -$as_echo_n "checking for GNU ld... " >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 -$as_echo_n "checking for non-GNU ld... " >&6; } -fi -if ${lt_cv_path_LD+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -z "$LD"; then - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - for ac_dir in $PATH; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then - lt_cv_path_LD="$ac_dir/$ac_prog" - # Check to see if the program is GNU ld. I'd rather use --version, - # but apparently some variants of GNU ld only accept -v. - # Break only if it was the GNU/non-GNU ld that we prefer. - case `"$lt_cv_path_LD" -v 2>&1 /dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CXX_dependencies_compiler_type=$depmode + break + fi fi done - IFS="$lt_save_ifs" + + cd .. + rm -rf conftest.dir else - lt_cv_path_LD="$LD" # Let the user override the test with a path. -fi + am_cv_CXX_dependencies_compiler_type=none fi -LD="$lt_cv_path_LD" -if test -n "$LD"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5 -$as_echo "$LD" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } fi -test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 -$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } -if ${lt_cv_prog_gnu_ld+:} false; then : - $as_echo_n "(cached) " >&6 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 +printf "%s\n" "$am_cv_CXX_dependencies_compiler_type" >&6; } +CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then + am__fastdepCXX_TRUE= + am__fastdepCXX_FALSE='#' else - # I'd rather use --version here, but apparently some GNU lds only accept -v. -case `$LD -v 2>&1 &5 -$as_echo "$lt_cv_prog_gnu_ld" >&6; } -with_gnu_ld=$lt_cv_prog_gnu_ld +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 +printf %s "checking whether ln -s works... " >&6; } +LN_S=$as_ln_s +if test "$LN_S" = "ln -s"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 +printf "%s\n" "no, using $LN_S" >&6; } +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +printf %s "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } +set x ${MAKE-make} +ac_make=`printf "%s\n" "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +if eval test \${ac_cv_prog_make_${ac_make}_set+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat >conftest.make <<\_ACEOF +SHELL = /bin/sh +all: + @echo '@@@%%%=$(MAKE)=@@@%%%' +_ACEOF +# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. +case `${MAKE-make} -f conftest.make 2>/dev/null` in + *@@@%%%=?*=@@@%%%*) + eval ac_cv_prog_make_${ac_make}_set=yes;; + *) + eval ac_cv_prog_make_${ac_make}_set=no;; +esac +rm -f conftest.make +fi +if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + SET_MAKE= +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + SET_MAKE="MAKE=${MAKE-make}" +fi +for ac_prog in sshd +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_path_SSHD+y} +then : + printf %s "(cached) " >&6 +else $as_nop + case $SSHD in + [\\/]* | ?:[\\/]*) + ac_cv_path_SSHD="$SSHD" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/libexec$PATH_SEPARATOR /usr/sbin$PATH_SEPARATOR/usr/etc$PATH_SEPARATOR/etc +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_path_SSHD="$as_dir$ac_word$ac_exec_ext" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + ;; +esac +fi +SSHD=$ac_cv_path_SSHD +if test -n "$SSHD"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $SSHD" >&5 +printf "%s\n" "$SSHD" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + test -n "$SSHD" && break +done -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 -$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } -if ${lt_cv_path_NM+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$NM"; then - # Let the user override the test. - lt_cv_path_NM="$NM" + if test -n "$SSHD"; then + SSHD_TRUE= + SSHD_FALSE='#' else - lt_nm_to_check="${ac_tool_prefix}nm" - if test -n "$ac_tool_prefix" && test "$build" = "$host"; then - lt_nm_to_check="$lt_nm_to_check nm" - fi - for lt_tmp_nm in $lt_nm_to_check; do - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - tmp_nm="$ac_dir/$lt_tmp_nm" - if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then - # Check to see if the nm accepts a BSD-compat flag. - # Adding the `sed 1q' prevents false positives on HP-UX, which says: - # nm: unknown option "B" ignored - # Tru64's nm complains that /dev/null is an invalid object file - case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in - */dev/null* | *'Invalid file or object type'*) - lt_cv_path_NM="$tmp_nm -B" - break - ;; - *) - case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in - */dev/null*) - lt_cv_path_NM="$tmp_nm -p" - break - ;; - *) - lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but - continue # so that we can try to find one that supports BSD flags - ;; - esac - ;; - esac - fi - done - IFS="$lt_save_ifs" - done - : ${lt_cv_path_NM=no} -fi + SSHD_TRUE='#' + SSHD_FALSE= fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 -$as_echo "$lt_cv_path_NM" >&6; } -if test "$lt_cv_path_NM" != "no"; then - NM="$lt_cv_path_NM" -else - # Didn't find any BSD compatible name lister, look for dumpbin. - if test -n "$DUMPBIN"; then : - # Let the user override the test. - else - if test -n "$ac_tool_prefix"; then - for ac_prog in dumpbin "link -dump" - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_DUMPBIN+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$DUMPBIN"; then - ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. + +enable_win32_dll=yes + +case $host in +*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args. +set dummy ${ac_tool_prefix}as; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_AS+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$AS"; then + ac_cv_prog_AS="$AS" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_AS="${ac_tool_prefix}as" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -6158,42 +7065,43 @@ IFS=$as_save_IFS fi fi -DUMPBIN=$ac_cv_prog_DUMPBIN -if test -n "$DUMPBIN"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 -$as_echo "$DUMPBIN" >&6; } +AS=$ac_cv_prog_AS +if test -n "$AS"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AS" >&5 +printf "%s\n" "$AS" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi - test -n "$DUMPBIN" && break - done fi -if test -z "$DUMPBIN"; then - ac_ct_DUMPBIN=$DUMPBIN - for ac_prog in dumpbin "link -dump" -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_DUMPBIN"; then - ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. +if test -z "$ac_cv_prog_AS"; then + ac_ct_AS=$AS + # Extract the first word of "as", so it can be a program name with args. +set dummy as; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_AS+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_AS"; then + ac_cv_prog_ac_ct_AS="$ac_ct_AS" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_AS="as" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -6202,270 +7110,270 @@ IFS=$as_save_IFS fi fi -ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN -if test -n "$ac_ct_DUMPBIN"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 -$as_echo "$ac_ct_DUMPBIN" >&6; } +ac_ct_AS=$ac_cv_prog_ac_ct_AS +if test -n "$ac_ct_AS"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AS" >&5 +printf "%s\n" "$ac_ct_AS" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi - - test -n "$ac_ct_DUMPBIN" && break -done - - if test "x$ac_ct_DUMPBIN" = x; then - DUMPBIN=":" + if test "x$ac_ct_AS" = x; then + AS="false" else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac - DUMPBIN=$ac_ct_DUMPBIN + AS=$ac_ct_AS fi +else + AS="$ac_cv_prog_AS" fi - case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in - *COFF*) - DUMPBIN="$DUMPBIN -symbols" - ;; - *) - DUMPBIN=: - ;; - esac + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. +set dummy ${ac_tool_prefix}dlltool; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_DLLTOOL+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$DLLTOOL"; then + ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 fi +done + done +IFS=$as_save_IFS - if test "$DUMPBIN" != ":"; then - NM="$DUMPBIN" - fi fi -test -z "$NM" && NM=nm +fi +DLLTOOL=$ac_cv_prog_DLLTOOL +if test -n "$DLLTOOL"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 +printf "%s\n" "$DLLTOOL" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_DLLTOOL"; then + ac_ct_DLLTOOL=$DLLTOOL + # Extract the first word of "dlltool", so it can be a program name with args. +set dummy dlltool; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_DLLTOOL+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_DLLTOOL"; then + ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DLLTOOL="dlltool" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS +fi +fi +ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL +if test -n "$ac_ct_DLLTOOL"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 +printf "%s\n" "$ac_ct_DLLTOOL" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + if test "x$ac_ct_DLLTOOL" = x; then + DLLTOOL="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DLLTOOL=$ac_ct_DLLTOOL + fi +else + DLLTOOL="$ac_cv_prog_DLLTOOL" +fi + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. +set dummy ${ac_tool_prefix}objdump; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_OBJDUMP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$OBJDUMP"; then + ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS +fi +fi +OBJDUMP=$ac_cv_prog_OBJDUMP +if test -n "$OBJDUMP"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 +printf "%s\n" "$OBJDUMP" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 -$as_echo_n "checking the name lister ($NM) interface... " >&6; } -if ${lt_cv_nm_interface+:} false; then : - $as_echo_n "(cached) " >&6 +fi +if test -z "$ac_cv_prog_OBJDUMP"; then + ac_ct_OBJDUMP=$OBJDUMP + # Extract the first word of "objdump", so it can be a program name with args. +set dummy objdump; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_OBJDUMP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_OBJDUMP"; then + ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. else - lt_cv_nm_interface="BSD nm" - echo "int some_variable = 0;" > conftest.$ac_ext - (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) - (eval "$ac_compile" 2>conftest.err) - cat conftest.err >&5 - (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) - (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) - cat conftest.err >&5 - (eval echo "\"\$as_me:$LINENO: output\"" >&5) - cat conftest.out >&5 - if $GREP 'External.*some_variable' conftest.out > /dev/null; then - lt_cv_nm_interface="MS dumpbin" +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OBJDUMP="objdump" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 fi - rm -f conftest* +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP +if test -n "$ac_ct_OBJDUMP"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 +printf "%s\n" "$ac_ct_OBJDUMP" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 -$as_echo "$lt_cv_nm_interface" >&6; } -# find the maximum length of command line arguments -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 -$as_echo_n "checking the maximum length of command line arguments... " >&6; } -if ${lt_cv_sys_max_cmd_len+:} false; then : - $as_echo_n "(cached) " >&6 + if test "x$ac_ct_OBJDUMP" = x; then + OBJDUMP="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OBJDUMP=$ac_ct_OBJDUMP + fi else - i=0 - teststring="ABCD" + OBJDUMP="$ac_cv_prog_OBJDUMP" +fi - case $build_os in - msdosdjgpp*) - # On DJGPP, this test can blow up pretty badly due to problems in libc - # (any single argument exceeding 2000 bytes causes a buffer overrun - # during glob expansion). Even if it were fixed, the result of this - # check would be larger than it should be. - lt_cv_sys_max_cmd_len=12288; # 12K is about right - ;; + ;; +esac - gnu*) - # Under GNU Hurd, this test is not required because there is - # no limit to the length of command line arguments. - # Libtool will interpret -1 as no limit whatsoever - lt_cv_sys_max_cmd_len=-1; - ;; +test -z "$AS" && AS=as - cygwin* | mingw* | cegcc*) - # On Win9x/ME, this test blows up -- it succeeds, but takes - # about 5 minutes as the teststring grows exponentially. - # Worse, since 9x/ME are not pre-emptively multitasking, - # you end up with a "frozen" computer, even though with patience - # the test eventually succeeds (with a max line length of 256k). - # Instead, let's just punt: use the minimum linelength reported by - # all of the supported platforms: 8192 (on NT/2K/XP). - lt_cv_sys_max_cmd_len=8192; - ;; - mint*) - # On MiNT this can take a long time and run out of memory. - lt_cv_sys_max_cmd_len=8192; - ;; - amigaos*) - # On AmigaOS with pdksh, this test takes hours, literally. - # So we just punt and use a minimum line length of 8192. - lt_cv_sys_max_cmd_len=8192; - ;; - netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) - # This has been around since 386BSD, at least. Likely further. - if test -x /sbin/sysctl; then - lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` - elif test -x /usr/sbin/sysctl; then - lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` - else - lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs - fi - # And add a safety zone - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` - ;; - interix*) - # We know the value 262144 and hardcode it with a safety zone (like BSD) - lt_cv_sys_max_cmd_len=196608 - ;; +test -z "$DLLTOOL" && DLLTOOL=dlltool - os2*) - # The test takes a long time on OS/2. - lt_cv_sys_max_cmd_len=8192 - ;; - osf*) - # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure - # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not - # nice to cause kernel panics so lets avoid the loop below. - # First set a reasonable default. - lt_cv_sys_max_cmd_len=16384 - # - if test -x /sbin/sysconfig; then - case `/sbin/sysconfig -q proc exec_disable_arg_limit` in - *1*) lt_cv_sys_max_cmd_len=-1 ;; - esac - fi - ;; - sco3.2v5*) - lt_cv_sys_max_cmd_len=102400 - ;; - sysv5* | sco5v6* | sysv4.2uw2*) - kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` - if test -n "$kargmax"; then - lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` - else - lt_cv_sys_max_cmd_len=32768 - fi - ;; - *) - lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` - if test -n "$lt_cv_sys_max_cmd_len"; then - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` - else - # Make teststring a little bigger before we do anything with it. - # a 1K string should be a reasonable start. - for i in 1 2 3 4 5 6 7 8 ; do - teststring=$teststring$teststring - done - SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} - # If test is not a shell built-in, we'll probably end up computing a - # maximum length that is only half of the actual maximum length, but - # we can't tell. - while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ - = "X$teststring$teststring"; } >/dev/null 2>&1 && - test $i != 17 # 1/2 MB should be enough - do - i=`expr $i + 1` - teststring=$teststring$teststring - done - # Only check the string length outside the loop. - lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` - teststring= - # Add a significant safety factor because C++ compilers can tack on - # massive amounts of additional arguments before passing them to the - # linker. It appears as though 1/2 is a usable value. - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` - fi - ;; - esac -fi -if test -n $lt_cv_sys_max_cmd_len ; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 -$as_echo "$lt_cv_sys_max_cmd_len" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 -$as_echo "none" >&6; } -fi -max_cmd_len=$lt_cv_sys_max_cmd_len +test -z "$OBJDUMP" && OBJDUMP=objdump -: ${CP="cp -f"} -: ${MV="mv -f"} -: ${RM="rm -f"} -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5 -$as_echo_n "checking whether the shell understands some XSI constructs... " >&6; } -# Try some XSI features -xsi_shell=no -( _lt_dummy="a/b/c" - test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ - = c,a/b,b/c, \ - && eval 'test $(( 1 + 1 )) -eq 2 \ - && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ - && xsi_shell=yes -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5 -$as_echo "$xsi_shell" >&6; } - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5 -$as_echo_n "checking whether the shell understands \"+=\"... " >&6; } -lt_shell_append=no -( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \ - >/dev/null 2>&1 \ - && lt_shell_append=yes -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5 -$as_echo "$lt_shell_append" >&6; } +case `pwd` in + *\ * | *\ *) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 +printf "%s\n" "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; +esac -if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then - lt_unset=unset -else - lt_unset=false -fi +macro_version='2.4.6' +macro_revision='2.4.6' -# test EBCDIC or ASCII -case `echo X|tr X '\101'` in - A) # ASCII based system - # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr - lt_SP2NL='tr \040 \012' - lt_NL2SP='tr \015\012 \040\040' - ;; - *) # EBCDIC based system - lt_SP2NL='tr \100 \n' - lt_NL2SP='tr \r\n \100\100' - ;; -esac @@ -6475,109 +7383,69 @@ esac -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 -$as_echo_n "checking how to convert $build file names to $host format... " >&6; } -if ${lt_cv_to_host_file_cmd+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $host in - *-*-mingw* ) - case $build in - *-*-mingw* ) # actually msys - lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 - ;; - *-*-cygwin* ) - lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 - ;; - * ) # otherwise, assume *nix - lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 - ;; - esac - ;; - *-*-cygwin* ) - case $build in - *-*-mingw* ) # actually msys - lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin - ;; - *-*-cygwin* ) - lt_cv_to_host_file_cmd=func_convert_file_noop - ;; - * ) # otherwise, assume *nix - lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin - ;; - esac - ;; - * ) # unhandled hosts (and "normal" native builds) - lt_cv_to_host_file_cmd=func_convert_file_noop - ;; -esac -fi -to_host_file_cmd=$lt_cv_to_host_file_cmd -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 -$as_echo "$lt_cv_to_host_file_cmd" >&6; } +ltmain=$ac_aux_dir/ltmain.sh +# Backslashify metacharacters that are still active within +# double-quoted strings. +sed_quote_subst='s/\(["`$\\]\)/\\\1/g' +# Same as above, but do not quote variable references. +double_quote_subst='s/\(["`\\]\)/\\\1/g' +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' +# Sed substitution to delay expansion of an escaped single quote. +delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 -$as_echo_n "checking how to convert $build file names to toolchain format... " >&6; } -if ${lt_cv_to_tool_file_cmd+:} false; then : - $as_echo_n "(cached) " >&6 -else - #assume ordinary cross tools, or native build. -lt_cv_to_tool_file_cmd=func_convert_file_noop -case $host in - *-*-mingw* ) - case $build in - *-*-mingw* ) # actually msys - lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 - ;; - esac - ;; -esac +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' + +ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 +printf %s "checking how to print strings... " >&6; } +# Test print first, because it will be a builtin if present. +if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ + test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='print -r --' +elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='printf %s\n' +else + # Use this function as a fallback that always works. + func_fallback_echo () + { + eval 'cat <<_LTECHO_EOF +$1 +_LTECHO_EOF' + } + ECHO='func_fallback_echo' fi -to_tool_file_cmd=$lt_cv_to_tool_file_cmd -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 -$as_echo "$lt_cv_to_tool_file_cmd" >&6; } +# func_echo_all arg... +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "" +} +case $ECHO in + printf*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: printf" >&5 +printf "%s\n" "printf" >&6; } ;; + print*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 +printf "%s\n" "print -r" >&6; } ;; + *) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: cat" >&5 +printf "%s\n" "cat" >&6; } ;; +esac -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 -$as_echo_n "checking for $LD option to reload object files... " >&6; } -if ${lt_cv_ld_reload_flag+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_ld_reload_flag='-r' -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 -$as_echo "$lt_cv_ld_reload_flag" >&6; } -reload_flag=$lt_cv_ld_reload_flag -case $reload_flag in -"" | " "*) ;; -*) reload_flag=" $reload_flag" ;; -esac -reload_cmds='$LD$reload_flag -o $output$reload_objs' -case $host_os in - cygwin* | mingw* | pw32* | cegcc*) - if test "$GCC" != yes; then - reload_cmds=false - fi - ;; - darwin*) - if test "$GCC" = yes; then - reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' - else - reload_cmds='$LD$reload_flag -o $output$reload_objs' - fi - ;; -esac @@ -6587,323 +7455,319 @@ esac -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. -set dummy ${ac_tool_prefix}objdump; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_OBJDUMP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$OBJDUMP"; then - ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 +printf %s "checking for a sed that does not truncate output... " >&6; } +if test ${ac_cv_path_SED+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ + for ac_i in 1 2 3 4 5 6 7; do + ac_script="$ac_script$as_nl$ac_script" + done + echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed + { ac_script=; unset ac_script;} + if test -z "$SED"; then + ac_path_SED_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_prog in sed gsed + do for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done + ac_path_SED="$as_dir$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_SED" || continue +# Check for GNU ac_path_SED and select it if it is found. + # Check for GNU $ac_path_SED +case `"$ac_path_SED" --version 2>&1` in +*GNU*) + ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; +*) + ac_count=0 + printf %s 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + printf "%s\n" '' >> "conftest.nl" + "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_SED_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_SED="$ac_path_SED" + ac_path_SED_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break done -IFS=$as_save_IFS - -fi -fi -OBJDUMP=$ac_cv_prog_OBJDUMP -if test -n "$OBJDUMP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 -$as_echo "$OBJDUMP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac -fi -if test -z "$ac_cv_prog_OBJDUMP"; then - ac_ct_OBJDUMP=$OBJDUMP - # Extract the first word of "objdump", so it can be a program name with args. -set dummy objdump; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_OBJDUMP"; then - ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_OBJDUMP="objdump" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done + $ac_path_SED_found && break 3 + done + done done IFS=$as_save_IFS - -fi -fi -ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP -if test -n "$ac_ct_OBJDUMP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 -$as_echo "$ac_ct_OBJDUMP" >&6; } + if test -z "$ac_cv_path_SED"; then + as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 + fi else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + ac_cv_path_SED=$SED fi - if test "x$ac_ct_OBJDUMP" = x; then - OBJDUMP="false" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - OBJDUMP=$ac_ct_OBJDUMP - fi -else - OBJDUMP="$ac_cv_prog_OBJDUMP" fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 +printf "%s\n" "$ac_cv_path_SED" >&6; } + SED="$ac_cv_path_SED" + rm -f conftest.sed -test -z "$OBJDUMP" && OBJDUMP=objdump +test -z "$SED" && SED=sed +Xsed="$SED -e 1s/^X//" -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 -$as_echo_n "checking how to recognize dependent libraries... " >&6; } -if ${lt_cv_deplibs_check_method+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_file_magic_cmd='$MAGIC_CMD' -lt_cv_file_magic_test_file= -lt_cv_deplibs_check_method='unknown' -# Need to set the preceding variable on all platforms that support -# interlibrary dependencies. -# 'none' -- dependencies not supported. -# `unknown' -- same as none, but documents that we really don't know. -# 'pass_all' -- all dependencies passed with no checks. -# 'test_compile' -- check by making test program. -# 'file_magic [[regex]]' -- check by looking for files in library path -# which responds to the $file_magic_cmd with a given extended regex. -# If you have `file' or equivalent on your system and you're not sure -# whether `pass_all' will *always* work, you probably want this one. -case $host_os in -aix[4-9]*) - lt_cv_deplibs_check_method=pass_all - ;; -beos*) - lt_cv_deplibs_check_method=pass_all - ;; -bsdi[45]*) - lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' - lt_cv_file_magic_cmd='/usr/bin/file -L' - lt_cv_file_magic_test_file=/shlib/libc.so - ;; -cygwin*) - # func_win32_libid is a shell function defined in ltmain.sh - lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' - lt_cv_file_magic_cmd='func_win32_libid' - ;; -mingw* | pw32*) - # Base MSYS/MinGW do not provide the 'file' command needed by - # func_win32_libid shell function, so use a weaker test based on 'objdump', - # unless we find 'file', for example because we are cross-compiling. - # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin. - if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then - lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' - lt_cv_file_magic_cmd='func_win32_libid' - else - # Keep this pattern in sync with the one in func_win32_libid. - lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' - lt_cv_file_magic_cmd='$OBJDUMP -f' +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 +printf %s "checking for grep that handles long lines and -e... " >&6; } +if test ${ac_cv_path_GREP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -z "$GREP"; then + ac_path_GREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_prog in grep ggrep + do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_GREP="$as_dir$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_GREP" || continue +# Check for GNU ac_path_GREP and select it if it is found. + # Check for GNU $ac_path_GREP +case `"$ac_path_GREP" --version 2>&1` in +*GNU*) + ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; +*) + ac_count=0 + printf %s 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + printf "%s\n" 'GREP' >> "conftest.nl" + "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_GREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_GREP="$ac_path_GREP" + ac_path_GREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_GREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_GREP"; then + as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi - ;; +else + ac_cv_path_GREP=$GREP +fi -cegcc*) - # use the weaker test based on 'objdump'. See mingw*. - lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' - lt_cv_file_magic_cmd='$OBJDUMP -f' - ;; +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 +printf "%s\n" "$ac_cv_path_GREP" >&6; } + GREP="$ac_cv_path_GREP" -darwin* | rhapsody*) - lt_cv_deplibs_check_method=pass_all - ;; -freebsd* | dragonfly*) - if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then - case $host_cpu in - i*86 ) - # Not sure whether the presence of OpenBSD here was a mistake. - # Let's accept both of them until this is cleared up. - lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' - lt_cv_file_magic_cmd=/usr/bin/file - lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` - ;; - esac - else - lt_cv_deplibs_check_method=pass_all +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 +printf %s "checking for egrep... " >&6; } +if test ${ac_cv_path_EGREP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 + then ac_cv_path_EGREP="$GREP -E" + else + if test -z "$EGREP"; then + ac_path_EGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_prog in egrep + do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP="$as_dir$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_EGREP" || continue +# Check for GNU ac_path_EGREP and select it if it is found. + # Check for GNU $ac_path_EGREP +case `"$ac_path_EGREP" --version 2>&1` in +*GNU*) + ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; +*) + ac_count=0 + printf %s 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + printf "%s\n" 'EGREP' >> "conftest.nl" + "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_EGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP="$ac_path_EGREP" + ac_path_EGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_EGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_EGREP"; then + as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi - ;; +else + ac_cv_path_EGREP=$EGREP +fi -haiku*) - lt_cv_deplibs_check_method=pass_all - ;; + fi +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 +printf "%s\n" "$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" -hpux10.20* | hpux11*) - lt_cv_file_magic_cmd=/usr/bin/file - case $host_cpu in - ia64*) - lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' - lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so - ;; - hppa*64*) - lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]' - lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl - ;; - *) - lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library' - lt_cv_file_magic_test_file=/usr/lib/libc.sl - ;; + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 +printf %s "checking for fgrep... " >&6; } +if test ${ac_cv_path_FGREP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 + then ac_cv_path_FGREP="$GREP -F" + else + if test -z "$FGREP"; then + ac_path_FGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; esac - ;; + for ac_prog in fgrep + do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_FGREP="$as_dir$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_FGREP" || continue +# Check for GNU ac_path_FGREP and select it if it is found. + # Check for GNU $ac_path_FGREP +case `"$ac_path_FGREP" --version 2>&1` in +*GNU*) + ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; +*) + ac_count=0 + printf %s 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + printf "%s\n" 'FGREP' >> "conftest.nl" + "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_FGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_FGREP="$ac_path_FGREP" + ac_path_FGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac -interix[3-9]*) - # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here - lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' - ;; + $ac_path_FGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_FGREP"; then + as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_FGREP=$FGREP +fi -irix5* | irix6* | nonstopux*) - case $LD in - *-32|*"-32 ") libmagic=32-bit;; - *-n32|*"-n32 ") libmagic=N32;; - *-64|*"-64 ") libmagic=64-bit;; - *) libmagic=never-match;; - esac - lt_cv_deplibs_check_method=pass_all - ;; + fi +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 +printf "%s\n" "$ac_cv_path_FGREP" >&6; } + FGREP="$ac_cv_path_FGREP" -# This must be glibc/ELF. -linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) - lt_cv_deplibs_check_method=pass_all - ;; -netbsd* | netbsdelf*-gnu) - if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then - lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' - else - lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' - fi - ;; +test -z "$GREP" && GREP=grep -newos6*) - lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' - lt_cv_file_magic_cmd=/usr/bin/file - lt_cv_file_magic_test_file=/usr/lib/libnls.so - ;; -*nto* | *qnx*) - lt_cv_deplibs_check_method=pass_all - ;; -openbsd*) - if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' - else - lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' - fi - ;; -osf3* | osf4* | osf5*) - lt_cv_deplibs_check_method=pass_all - ;; -rdos*) - lt_cv_deplibs_check_method=pass_all - ;; - -solaris*) - lt_cv_deplibs_check_method=pass_all - ;; - -sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) - lt_cv_deplibs_check_method=pass_all - ;; - -sysv4 | sysv4.3*) - case $host_vendor in - motorola) - lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' - lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` - ;; - ncr) - lt_cv_deplibs_check_method=pass_all - ;; - sequent) - lt_cv_file_magic_cmd='/bin/file' - lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' - ;; - sni) - lt_cv_file_magic_cmd='/bin/file' - lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" - lt_cv_file_magic_test_file=/lib/libc.so - ;; - siemens) - lt_cv_deplibs_check_method=pass_all - ;; - pc) - lt_cv_deplibs_check_method=pass_all - ;; - esac - ;; - -tpf*) - lt_cv_deplibs_check_method=pass_all - ;; -esac -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 -$as_echo "$lt_cv_deplibs_check_method" >&6; } -file_magic_glob= -want_nocaseglob=no -if test "$build" = "$host"; then - case $host_os in - mingw* | pw32*) - if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then - want_nocaseglob=yes - else - file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` - fi - ;; - esac -fi -file_magic_cmd=$lt_cv_file_magic_cmd -deplibs_check_method=$lt_cv_deplibs_check_method -test -z "$deplibs_check_method" && deplibs_check_method=unknown @@ -6915,8 +7779,111 @@ test -z "$deplibs_check_method" && deplibs_check_method=unknown +# Check whether --with-gnu-ld was given. +if test ${with_gnu_ld+y} +then : + withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes +else $as_nop + with_gnu_ld=no +fi +ac_prog=ld +if test yes = "$GCC"; then + # Check if gcc -print-prog-name=ld gives a path. + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 +printf %s "checking for ld used by $CC... " >&6; } + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return, which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | ?:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` + while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do + ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD=$ac_prog + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test yes = "$with_gnu_ld"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 +printf %s "checking for GNU ld... " >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 +printf %s "checking for non-GNU ld... " >&6; } +fi +if test ${lt_cv_path_LD+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -z "$LD"; then + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD=$ac_dir/$ac_prog + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &5 +printf "%s\n" "$LD" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi +test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 +printf %s "checking if the linker ($LD) is GNU ld... " >&6; } +if test ${lt_cv_prog_gnu_ld+y} +then : + printf %s "(cached) " >&6 +else $as_nop + # I'd rather use --version here, but apparently some GNU lds only accept -v. +case `$LD -v 2>&1 &5 +printf "%s\n" "$lt_cv_prog_gnu_ld" >&6; } +with_gnu_ld=$lt_cv_prog_gnu_ld @@ -6926,26 +7893,97 @@ test -z "$deplibs_check_method" && deplibs_check_method=unknown -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. -set dummy ${ac_tool_prefix}dlltool; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_DLLTOOL+:} false; then : - $as_echo_n "(cached) " >&6 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 +printf %s "checking for BSD- or MS-compatible name lister (nm)... " >&6; } +if test ${lt_cv_path_NM+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM=$NM else - if test -n "$DLLTOOL"; then - ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. + lt_nm_to_check=${ac_tool_prefix}nm + if test -n "$ac_tool_prefix" && test "$build" = "$host"; then + lt_nm_to_check="$lt_nm_to_check nm" + fi + for lt_tmp_nm in $lt_nm_to_check; do + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + tmp_nm=$ac_dir/$lt_tmp_nm + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the 'sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty + case $build_os in + mingw*) lt_bad_file=conftest.nm/nofile ;; + *) lt_bad_file=/dev/null ;; + esac + case `"$tmp_nm" -B $lt_bad_file 2>&1 | sed '1q'` in + *$lt_bad_file* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break 2 + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break 2 + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + ;; + esac + fi + done + IFS=$lt_save_ifs + done + : ${lt_cv_path_NM=no} +fi +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 +printf "%s\n" "$lt_cv_path_NM" >&6; } +if test no != "$lt_cv_path_NM"; then + NM=$lt_cv_path_NM +else + # Didn't find any BSD compatible name lister, look for dumpbin. + if test -n "$DUMPBIN"; then : + # Let the user override the test. + else + if test -n "$ac_tool_prefix"; then + for ac_prog in dumpbin "link -dump" + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_DUMPBIN+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$DUMPBIN"; then + ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -6954,38 +7992,47 @@ IFS=$as_save_IFS fi fi -DLLTOOL=$ac_cv_prog_DLLTOOL -if test -n "$DLLTOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 -$as_echo "$DLLTOOL" >&6; } +DUMPBIN=$ac_cv_prog_DUMPBIN +if test -n "$DUMPBIN"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 +printf "%s\n" "$DUMPBIN" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi + test -n "$DUMPBIN" && break + done fi -if test -z "$ac_cv_prog_DLLTOOL"; then - ac_ct_DLLTOOL=$DLLTOOL - # Extract the first word of "dlltool", so it can be a program name with args. -set dummy dlltool; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_DLLTOOL"; then - ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. +if test -z "$DUMPBIN"; then + ac_ct_DUMPBIN=$DUMPBIN + for ac_prog in dumpbin "link -dump" +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_DUMPBIN+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_DUMPBIN"; then + ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_DLLTOOL="dlltool" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -6994,240 +8041,249 @@ IFS=$as_save_IFS fi fi -ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL -if test -n "$ac_ct_DLLTOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 -$as_echo "$ac_ct_DLLTOOL" >&6; } +ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN +if test -n "$ac_ct_DUMPBIN"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 +printf "%s\n" "$ac_ct_DUMPBIN" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi - if test "x$ac_ct_DLLTOOL" = x; then - DLLTOOL="false" + + test -n "$ac_ct_DUMPBIN" && break +done + + if test "x$ac_ct_DUMPBIN" = x; then + DUMPBIN=":" else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac - DLLTOOL=$ac_ct_DLLTOOL + DUMPBIN=$ac_ct_DUMPBIN fi -else - DLLTOOL="$ac_cv_prog_DLLTOOL" fi -test -z "$DLLTOOL" && DLLTOOL=dlltool - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 -$as_echo_n "checking how to associate runtime and link libraries... " >&6; } -if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_sharedlib_from_linklib_cmd='unknown' - -case $host_os in -cygwin* | mingw* | pw32* | cegcc*) - # two different shell functions defined in ltmain.sh - # decide which to use based on capabilities of $DLLTOOL - case `$DLLTOOL --help 2>&1` in - *--identify-strict*) - lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib - ;; - *) - lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback - ;; - esac - ;; -*) - # fallback: assume linklib IS sharedlib - lt_cv_sharedlib_from_linklib_cmd="$ECHO" - ;; -esac + case `$DUMPBIN -symbols -headers /dev/null 2>&1 | sed '1q'` in + *COFF*) + DUMPBIN="$DUMPBIN -symbols -headers" + ;; + *) + DUMPBIN=: + ;; + esac + fi + if test : != "$DUMPBIN"; then + NM=$DUMPBIN + fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 -$as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; } -sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd -test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO - +test -z "$NM" && NM=nm -if test -n "$ac_tool_prefix"; then - for ac_prog in ar - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_AR+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$AR"; then - ac_cv_prog_AR="$AR" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_AR="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 +printf %s "checking the name lister ($NM) interface... " >&6; } +if test ${lt_cv_nm_interface+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_nm_interface="BSD nm" + echo "int some_variable = 0;" > conftest.$ac_ext + (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) + (eval "$ac_compile" 2>conftest.err) + cat conftest.err >&5 + (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) + (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) + cat conftest.err >&5 + (eval echo "\"\$as_me:$LINENO: output\"" >&5) + cat conftest.out >&5 + if $GREP 'External.*some_variable' conftest.out > /dev/null; then + lt_cv_nm_interface="MS dumpbin" fi -done - done -IFS=$as_save_IFS - -fi -fi -AR=$ac_cv_prog_AR -if test -n "$AR"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 -$as_echo "$AR" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + rm -f conftest* fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 +printf "%s\n" "$lt_cv_nm_interface" >&6; } +# find the maximum length of command line arguments +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 +printf %s "checking the maximum length of command line arguments... " >&6; } +if test ${lt_cv_sys_max_cmd_len+y} +then : + printf %s "(cached) " >&6 +else $as_nop + i=0 + teststring=ABCD - test -n "$AR" && break - done -fi -if test -z "$AR"; then - ac_ct_AR=$AR - for ac_prog in ar -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_AR+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_AR"; then - ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_AR="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; -fi -fi -ac_ct_AR=$ac_cv_prog_ac_ct_AR -if test -n "$ac_ct_AR"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 -$as_echo "$ac_ct_AR" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + cygwin* | mingw* | cegcc*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; - test -n "$ac_ct_AR" && break -done + mint*) + # On MiNT this can take a long time and run out of memory. + lt_cv_sys_max_cmd_len=8192; + ;; - if test "x$ac_ct_AR" = x; then - AR="false" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - AR=$ac_ct_AR - fi -fi + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; -: ${AR=ar} -: ${AR_FLAGS=cru} + bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*) + # This has been around since 386BSD, at least. Likely further. + if test -x /sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` + elif test -x /usr/sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` + else + lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs + fi + # And add a safety zone + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + ;; + interix*) + # We know the value 262144 and hardcode it with a safety zone (like BSD) + lt_cv_sys_max_cmd_len=196608 + ;; + + os2*) + # The test takes a long time on OS/2. + lt_cv_sys_max_cmd_len=8192 + ;; + osf*) + # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure + # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not + # nice to cause kernel panics so lets avoid the loop below. + # First set a reasonable default. + lt_cv_sys_max_cmd_len=16384 + # + if test -x /sbin/sysconfig; then + case `/sbin/sysconfig -q proc exec_disable_arg_limit` in + *1*) lt_cv_sys_max_cmd_len=-1 ;; + esac + fi + ;; + sco3.2v5*) + lt_cv_sys_max_cmd_len=102400 + ;; + sysv5* | sco5v6* | sysv4.2uw2*) + kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` + if test -n "$kargmax"; then + lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` + else + lt_cv_sys_max_cmd_len=32768 + fi + ;; + *) + lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` + if test -n "$lt_cv_sys_max_cmd_len" && \ + test undefined != "$lt_cv_sys_max_cmd_len"; then + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + else + # Make teststring a little bigger before we do anything with it. + # a 1K string should be a reasonable start. + for i in 1 2 3 4 5 6 7 8; do + teststring=$teststring$teststring + done + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. + while { test X`env echo "$teststring$teststring" 2>/dev/null` \ + = "X$teststring$teststring"; } >/dev/null 2>&1 && + test 17 != "$i" # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + # Only check the string length outside the loop. + lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` + teststring= + # Add a significant safety factor because C++ compilers can tack on + # massive amounts of additional arguments before passing them to the + # linker. It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + fi + ;; + esac +fi +if test -n "$lt_cv_sys_max_cmd_len"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 +printf "%s\n" "$lt_cv_sys_max_cmd_len" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none" >&5 +printf "%s\n" "none" >&6; } +fi +max_cmd_len=$lt_cv_sys_max_cmd_len +: ${CP="cp -f"} +: ${MV="mv -f"} +: ${RM="rm -f"} -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 -$as_echo_n "checking for archiver @FILE support... " >&6; } -if ${lt_cv_ar_at_file+:} false; then : - $as_echo_n "(cached) " >&6 +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + lt_unset=unset else - lt_cv_ar_at_file=no - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ + lt_unset=false +fi -int -main () -{ - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - echo conftest.$ac_objext > conftest.lst - lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' - { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 - (eval $lt_ar_try) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - if test "$ac_status" -eq 0; then - # Ensure the archiver fails upon bogus file names. - rm -f conftest.$ac_objext libconftest.a - { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 - (eval $lt_ar_try) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - if test "$ac_status" -ne 0; then - lt_cv_ar_at_file=@ - fi - fi - rm -f conftest.* libconftest.a -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 -$as_echo "$lt_cv_ar_at_file" >&6; } -if test "x$lt_cv_ar_at_file" = xno; then - archiver_list_spec= -else - archiver_list_spec=$lt_cv_ar_at_file -fi +# test EBCDIC or ASCII +case `echo X|tr X '\101'` in + A) # ASCII based system + # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr + lt_SP2NL='tr \040 \012' + lt_NL2SP='tr \015\012 \040\040' + ;; + *) # EBCDIC based system + lt_SP2NL='tr \100 \n' + lt_NL2SP='tr \r\n \100\100' + ;; +esac @@ -7235,99 +8291,117 @@ fi -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. -set dummy ${ac_tool_prefix}strip; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_STRIP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$STRIP"; then - ac_cv_prog_STRIP="$STRIP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_STRIP="${ac_tool_prefix}strip" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS -fi -fi -STRIP=$ac_cv_prog_STRIP -if test -n "$STRIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 -$as_echo "$STRIP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 +printf %s "checking how to convert $build file names to $host format... " >&6; } +if test ${lt_cv_to_host_file_cmd+y} +then : + printf %s "(cached) " >&6 +else $as_nop + case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 + ;; + esac + ;; + *-*-cygwin* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin + ;; + esac + ;; + * ) # unhandled hosts (and "normal" native builds) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; +esac fi -if test -z "$ac_cv_prog_STRIP"; then - ac_ct_STRIP=$STRIP - # Extract the first word of "strip", so it can be a program name with args. -set dummy strip; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_STRIP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_STRIP"; then - ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_STRIP="strip" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS -fi -fi -ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP -if test -n "$ac_ct_STRIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 -$as_echo "$ac_ct_STRIP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi +to_host_file_cmd=$lt_cv_to_host_file_cmd +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 +printf "%s\n" "$lt_cv_to_host_file_cmd" >&6; } - if test "x$ac_ct_STRIP" = x; then - STRIP=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; + + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 +printf %s "checking how to convert $build file names to toolchain format... " >&6; } +if test ${lt_cv_to_tool_file_cmd+y} +then : + printf %s "(cached) " >&6 +else $as_nop + #assume ordinary cross tools, or native build. +lt_cv_to_tool_file_cmd=func_convert_file_noop +case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 + ;; + esac + ;; esac - STRIP=$ac_ct_STRIP - fi -else - STRIP="$ac_cv_prog_STRIP" + fi -test -z "$STRIP" && STRIP=: +to_tool_file_cmd=$lt_cv_to_tool_file_cmd +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 +printf "%s\n" "$lt_cv_to_tool_file_cmd" >&6; } + + + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 +printf %s "checking for $LD option to reload object files... " >&6; } +if test ${lt_cv_ld_reload_flag+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_ld_reload_flag='-r' +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 +printf "%s\n" "$lt_cv_ld_reload_flag" >&6; } +reload_flag=$lt_cv_ld_reload_flag +case $reload_flag in +"" | " "*) ;; +*) reload_flag=" $reload_flag" ;; +esac +reload_cmds='$LD$reload_flag -o $output$reload_objs' +case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + if test yes != "$GCC"; then + reload_cmds=false + fi + ;; + darwin*) + if test yes = "$GCC"; then + reload_cmds='$LTCC $LTCFLAGS -nostdlib $wl-r -o $output$reload_objs' + else + reload_cmds='$LD$reload_flag -o $output$reload_objs' + fi + ;; +esac + + + @@ -7335,25 +8409,30 @@ test -z "$STRIP" && STRIP=: if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. -set dummy ${ac_tool_prefix}ranlib; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_RANLIB+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$RANLIB"; then - ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. + # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. +set dummy ${ac_tool_prefix}objdump; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_OBJDUMP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$OBJDUMP"; then + ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -7362,38 +8441,43 @@ IFS=$as_save_IFS fi fi -RANLIB=$ac_cv_prog_RANLIB -if test -n "$RANLIB"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 -$as_echo "$RANLIB" >&6; } +OBJDUMP=$ac_cv_prog_OBJDUMP +if test -n "$OBJDUMP"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 +printf "%s\n" "$OBJDUMP" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi fi -if test -z "$ac_cv_prog_RANLIB"; then - ac_ct_RANLIB=$RANLIB - # Extract the first word of "ranlib", so it can be a program name with args. -set dummy ranlib; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_RANLIB"; then - ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. +if test -z "$ac_cv_prog_OBJDUMP"; then + ac_ct_OBJDUMP=$OBJDUMP + # Extract the first word of "objdump", so it can be a program name with args. +set dummy objdump; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_OBJDUMP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_OBJDUMP"; then + ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_RANLIB="ranlib" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OBJDUMP="objdump" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -7402,90 +8486,258 @@ IFS=$as_save_IFS fi fi -ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB -if test -n "$ac_ct_RANLIB"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 -$as_echo "$ac_ct_RANLIB" >&6; } +ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP +if test -n "$ac_ct_OBJDUMP"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 +printf "%s\n" "$ac_ct_OBJDUMP" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi - if test "x$ac_ct_RANLIB" = x; then - RANLIB=":" + if test "x$ac_ct_OBJDUMP" = x; then + OBJDUMP="false" else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac - RANLIB=$ac_ct_RANLIB + OBJDUMP=$ac_ct_OBJDUMP fi else - RANLIB="$ac_cv_prog_RANLIB" + OBJDUMP="$ac_cv_prog_OBJDUMP" fi -test -z "$RANLIB" && RANLIB=: - +test -z "$OBJDUMP" && OBJDUMP=objdump -# Determine commands to create old-style static archives. -old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' -old_postinstall_cmds='chmod 644 $oldlib' -old_postuninstall_cmds= -if test -n "$RANLIB"; then - case $host_os in - openbsd*) - old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" - ;; - *) - old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" - ;; - esac - old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" -fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 +printf %s "checking how to recognize dependent libraries... " >&6; } +if test ${lt_cv_deplibs_check_method+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_file_magic_cmd='$MAGIC_CMD' +lt_cv_file_magic_test_file= +lt_cv_deplibs_check_method='unknown' +# Need to set the preceding variable on all platforms that support +# interlibrary dependencies. +# 'none' -- dependencies not supported. +# 'unknown' -- same as none, but documents that we really don't know. +# 'pass_all' -- all dependencies passed with no checks. +# 'test_compile' -- check by making test program. +# 'file_magic [[regex]]' -- check by looking for files in library path +# that responds to the $file_magic_cmd with a given extended regex. +# If you have 'file' or equivalent on your system and you're not sure +# whether 'pass_all' will *always* work, you probably want this one. case $host_os in - darwin*) - lock_old_archive_extraction=yes ;; - *) - lock_old_archive_extraction=no ;; -esac - - - - - +aix[4-9]*) + lt_cv_deplibs_check_method=pass_all + ;; +beos*) + lt_cv_deplibs_check_method=pass_all + ;; +bsdi[45]*) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' + lt_cv_file_magic_cmd='/usr/bin/file -L' + lt_cv_file_magic_test_file=/shlib/libc.so + ;; +cygwin*) + # func_win32_libid is a shell function defined in ltmain.sh + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + ;; +mingw* | pw32*) + # Base MSYS/MinGW do not provide the 'file' command needed by + # func_win32_libid shell function, so use a weaker test based on 'objdump', + # unless we find 'file', for example because we are cross-compiling. + if ( file / ) >/dev/null 2>&1; then + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + else + # Keep this pattern in sync with the one in func_win32_libid. + lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' + lt_cv_file_magic_cmd='$OBJDUMP -f' + fi + ;; +cegcc*) + # use the weaker test based on 'objdump'. See mingw*. + lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + ;; +darwin* | rhapsody*) + lt_cv_deplibs_check_method=pass_all + ;; +freebsd* | dragonfly*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; +haiku*) + lt_cv_deplibs_check_method=pass_all + ;; +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case $host_cpu in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]' + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; +interix[3-9]*) + # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' + ;; +irix5* | irix6* | nonstopux*) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + lt_cv_deplibs_check_method=pass_all + ;; +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + lt_cv_deplibs_check_method=pass_all + ;; +netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' + fi + ;; +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; +*nto* | *qnx*) + lt_cv_deplibs_check_method=pass_all + ;; +openbsd* | bitrig*) + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' + fi + ;; +osf3* | osf4* | osf5*) + lt_cv_deplibs_check_method=pass_all + ;; +rdos*) + lt_cv_deplibs_check_method=pass_all + ;; +solaris*) + lt_cv_deplibs_check_method=pass_all + ;; +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; +sysv4 | sysv4.3*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + pc) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; +tpf*) + lt_cv_deplibs_check_method=pass_all + ;; +os2*) + lt_cv_deplibs_check_method=pass_all + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 +printf "%s\n" "$lt_cv_deplibs_check_method" >&6; } +file_magic_glob= +want_nocaseglob=no +if test "$build" = "$host"; then + case $host_os in + mingw* | pw32*) + if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then + want_nocaseglob=yes + else + file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` + fi + ;; + esac +fi +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown @@ -7495,276 +8747,280 @@ esac -# If no C compiler was specified, use CC. -LTCC=${LTCC-"$CC"} -# If no C compiler flags were specified, use CFLAGS. -LTCFLAGS=${LTCFLAGS-"$CFLAGS"} -# Allow CC to be a program name with arguments. -compiler=$CC -# Check for command to grab the raw symbol name followed by C symbol from nm. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 -$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } -if ${lt_cv_sys_global_symbol_pipe+:} false; then : - $as_echo_n "(cached) " >&6 -else -# These are sane defaults that work on at least a few old systems. -# [They come from Ultrix. What could be older than Ultrix?!! ;)] -# Character class describing NM global symbol codes. -symcode='[BCDEGRST]' -# Regexp to match symbols that can be accessed directly from C. -sympat='\([_A-Za-z][_A-Za-z0-9]*\)' -# Define system-specific variables. -case $host_os in -aix*) - symcode='[BCDT]' - ;; -cygwin* | mingw* | pw32* | cegcc*) - symcode='[ABCDGISTW]' - ;; -hpux*) - if test "$host_cpu" = ia64; then - symcode='[ABCDEGRST]' - fi - ;; -irix* | nonstopux*) - symcode='[BCDEGRST]' - ;; -osf*) - symcode='[BCDEGQRST]' - ;; -solaris*) - symcode='[BDRT]' - ;; -sco3.2v5*) - symcode='[DT]' - ;; -sysv4.2uw2*) - symcode='[DT]' - ;; -sysv5* | sco5v6* | unixware* | OpenUNIX*) - symcode='[ABDT]' - ;; -sysv4) - symcode='[DFNSTU]' - ;; -esac -# If we're using GNU nm, then use its standard symbol codes. -case `$NM -V 2>&1` in -*GNU* | *'with BFD'*) - symcode='[ABCDGIRSTW]' ;; -esac -# Transform an extracted symbol line into a proper C declaration. -# Some systems (esp. on ia64) link data and code symbols differently, -# so use this general approach. -lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" -# Transform an extracted symbol line into symbol name and symbol address -lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (void *) \&\2},/p'" -lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"lib\2\", (void *) \&\2},/p'" -# Handle CRLF in mingw tool chain -opt_cr= -case $build_os in -mingw*) - opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp - ;; -esac -# Try without a prefix underscore, then with it. -for ac_symprfx in "" "_"; do +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. +set dummy ${ac_tool_prefix}dlltool; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_DLLTOOL+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$DLLTOOL"; then + ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS - # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. - symxfrm="\\1 $ac_symprfx\\2 \\2" +fi +fi +DLLTOOL=$ac_cv_prog_DLLTOOL +if test -n "$DLLTOOL"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 +printf "%s\n" "$DLLTOOL" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi - # Write the raw and C identifiers. - if test "$lt_cv_nm_interface" = "MS dumpbin"; then - # Fake it for dumpbin and say T for any non-static function - # and D for any global variable. - # Also find C++ and __fastcall symbols from MSVC++, - # which start with @ or ?. - lt_cv_sys_global_symbol_pipe="$AWK '"\ -" {last_section=section; section=\$ 3};"\ -" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ -" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ -" \$ 0!~/External *\|/{next};"\ -" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ -" {if(hide[section]) next};"\ -" {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ -" {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ -" s[1]~/^[@?]/{print s[1], s[1]; next};"\ -" s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ -" ' prfx=^$ac_symprfx" - else - lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" + +fi +if test -z "$ac_cv_prog_DLLTOOL"; then + ac_ct_DLLTOOL=$DLLTOOL + # Extract the first word of "dlltool", so it can be a program name with args. +set dummy dlltool; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_DLLTOOL+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_DLLTOOL"; then + ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DLLTOOL="dlltool" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 fi - lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" +done + done +IFS=$as_save_IFS - # Check to see that the pipe works correctly. - pipe_works=no +fi +fi +ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL +if test -n "$ac_ct_DLLTOOL"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 +printf "%s\n" "$ac_ct_DLLTOOL" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi - rm -f conftest* - cat > conftest.$ac_ext <<_LT_EOF -#ifdef __cplusplus -extern "C" { -#endif -char nm_test_var; -void nm_test_func(void); -void nm_test_func(void){} -#ifdef __cplusplus -} -#endif -int main(){nm_test_var='a';nm_test_func();return(0);} -_LT_EOF + if test "x$ac_ct_DLLTOOL" = x; then + DLLTOOL="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DLLTOOL=$ac_ct_DLLTOOL + fi +else + DLLTOOL="$ac_cv_prog_DLLTOOL" +fi - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - # Now try to grab the symbols. - nlist=conftest.nm - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5 - (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && test -s "$nlist"; then - # Try sorting and uniquifying the output. - if sort "$nlist" | uniq > "$nlist"T; then - mv -f "$nlist"T "$nlist" - else - rm -f "$nlist"T - fi +test -z "$DLLTOOL" && DLLTOOL=dlltool - # Make sure that we snagged all the symbols we need. - if $GREP ' nm_test_var$' "$nlist" >/dev/null; then - if $GREP ' nm_test_func$' "$nlist" >/dev/null; then - cat <<_LT_EOF > conftest.$ac_ext -/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ -#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) -/* DATA imports from DLLs on WIN32 con't be const, because runtime - relocations are performed -- see ld's documentation on pseudo-relocs. */ -# define LT_DLSYM_CONST -#elif defined(__osf__) -/* This system does not cope well with relocations in const data. */ -# define LT_DLSYM_CONST -#else -# define LT_DLSYM_CONST const -#endif -#ifdef __cplusplus -extern "C" { -#endif -_LT_EOF - # Now generate the symbol file. - eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' - cat <<_LT_EOF >> conftest.$ac_ext -/* The mapping between symbol names and symbols. */ -LT_DLSYM_CONST struct { - const char *name; - void *address; -} -lt__PROGRAM__LTX_preloaded_symbols[] = -{ - { "@PROGRAM@", (void *) 0 }, -_LT_EOF - $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext - cat <<\_LT_EOF >> conftest.$ac_ext - {0, (void *) 0} -}; -/* This works around a problem in FreeBSD linker */ -#ifdef FREEBSD_WORKAROUND -static const void *lt_preloaded_setup() { - return lt__PROGRAM__LTX_preloaded_symbols; -} -#endif -#ifdef __cplusplus -} -#endif -_LT_EOF - # Now try linking the two files. - mv conftest.$ac_objext conftstm.$ac_objext - lt_globsym_save_LIBS=$LIBS - lt_globsym_save_CFLAGS=$CFLAGS - LIBS="conftstm.$ac_objext" - CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 - (eval $ac_link) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && test -s conftest${ac_exeext}; then - pipe_works=yes - fi - LIBS=$lt_globsym_save_LIBS - CFLAGS=$lt_globsym_save_CFLAGS - else - echo "cannot find nm_test_func in $nlist" >&5 - fi - else - echo "cannot find nm_test_var in $nlist" >&5 - fi - else - echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 - fi - else - echo "$progname: failed program was:" >&5 - cat conftest.$ac_ext >&5 - fi - rm -rf conftest* conftst* +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 +printf %s "checking how to associate runtime and link libraries... " >&6; } +if test ${lt_cv_sharedlib_from_linklib_cmd+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_sharedlib_from_linklib_cmd='unknown' - # Do not use the global_symbol_pipe unless it works. - if test "$pipe_works" = yes; then - break - else - lt_cv_sys_global_symbol_pipe= - fi -done +case $host_os in +cygwin* | mingw* | pw32* | cegcc*) + # two different shell functions defined in ltmain.sh; + # decide which one to use based on capabilities of $DLLTOOL + case `$DLLTOOL --help 2>&1` in + *--identify-strict*) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib + ;; + *) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback + ;; + esac + ;; +*) + # fallback: assume linklib IS sharedlib + lt_cv_sharedlib_from_linklib_cmd=$ECHO + ;; +esac fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 +printf "%s\n" "$lt_cv_sharedlib_from_linklib_cmd" >&6; } +sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd +test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO + -if test -z "$lt_cv_sys_global_symbol_pipe"; then - lt_cv_sys_global_symbol_to_cdecl= -fi -if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 -$as_echo "failed" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 -$as_echo "ok" >&6; } -fi -# Response file support. -if test "$lt_cv_nm_interface" = "MS dumpbin"; then - nm_file_list_spec='@' -elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then - nm_file_list_spec='@' -fi +if test -n "$ac_tool_prefix"; then + for ac_prog in ar + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_AR+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$AR"; then + ac_cv_prog_AR="$AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_AR="$ac_tool_prefix$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS +fi +fi +AR=$ac_cv_prog_AR +if test -n "$AR"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 +printf "%s\n" "$AR" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + test -n "$AR" && break + done +fi +if test -z "$AR"; then + ac_ct_AR=$AR + for ac_prog in ar +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_AR+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_AR"; then + ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_AR="$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS +fi +fi +ac_ct_AR=$ac_cv_prog_ac_ct_AR +if test -n "$ac_ct_AR"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 +printf "%s\n" "$ac_ct_AR" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + test -n "$ac_ct_AR" && break +done + if test "x$ac_ct_AR" = x; then + AR="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + AR=$ac_ct_AR + fi +fi +: ${AR=ar} +: ${AR_FLAGS=cr} @@ -7776,273 +9032,91 @@ fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 +printf %s "checking for archiver @FILE support... " >&6; } +if test ${lt_cv_ar_at_file+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_ar_at_file=no + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int +main (void) +{ + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + echo conftest.$ac_objext > conftest.lst + lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 + (eval $lt_ar_try) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if test 0 -eq "$ac_status"; then + # Ensure the archiver fails upon bogus file names. + rm -f conftest.$ac_objext libconftest.a + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 + (eval $lt_ar_try) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if test 0 -ne "$ac_status"; then + lt_cv_ar_at_file=@ + fi + fi + rm -f conftest.* libconftest.a +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 -$as_echo_n "checking for sysroot... " >&6; } +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 +printf "%s\n" "$lt_cv_ar_at_file" >&6; } -# Check whether --with-sysroot was given. -if test "${with_sysroot+set}" = set; then : - withval=$with_sysroot; +if test no = "$lt_cv_ar_at_file"; then + archiver_list_spec= else - with_sysroot=no + archiver_list_spec=$lt_cv_ar_at_file fi -lt_sysroot= -case ${with_sysroot} in #( - yes) - if test "$GCC" = yes; then - lt_sysroot=`$CC --print-sysroot 2>/dev/null` - fi - ;; #( - /*) - lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` - ;; #( - no|'') - ;; #( - *) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${with_sysroot}" >&5 -$as_echo "${with_sysroot}" >&6; } - as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 - ;; -esac - - { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 -$as_echo "${lt_sysroot:-no}" >&6; } -# Check whether --enable-libtool-lock was given. -if test "${enable_libtool_lock+set}" = set; then : - enableval=$enable_libtool_lock; -fi - -test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes - -# Some flags need to be propagated to the compiler or linker for good -# libtool support. -case $host in -ia64-*-hpux*) - # Find out which ABI we are using. - echo 'int i;' > conftest.$ac_ext - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - case `/usr/bin/file conftest.$ac_objext` in - *ELF-32*) - HPUX_IA64_MODE="32" - ;; - *ELF-64*) - HPUX_IA64_MODE="64" - ;; - esac - fi - rm -rf conftest* - ;; -*-*-irix6*) - # Find out which ABI we are using. - echo '#line '$LINENO' "configure"' > conftest.$ac_ext - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - if test "$lt_cv_prog_gnu_ld" = yes; then - case `/usr/bin/file conftest.$ac_objext` in - *32-bit*) - LD="${LD-ld} -melf32bsmip" - ;; - *N32*) - LD="${LD-ld} -melf32bmipn32" - ;; - *64-bit*) - LD="${LD-ld} -melf64bmip" - ;; - esac - else - case `/usr/bin/file conftest.$ac_objext` in - *32-bit*) - LD="${LD-ld} -32" - ;; - *N32*) - LD="${LD-ld} -n32" - ;; - *64-bit*) - LD="${LD-ld} -64" - ;; - esac - fi - fi - rm -rf conftest* - ;; - -x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ -s390*-*linux*|s390*-*tpf*|sparc*-*linux*) - # Find out which ABI we are using. - echo 'int i;' > conftest.$ac_ext - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - case `/usr/bin/file conftest.o` in - *32-bit*) - case $host in - x86_64-*kfreebsd*-gnu) - LD="${LD-ld} -m elf_i386_fbsd" - ;; - x86_64-*linux*) - LD="${LD-ld} -m elf_i386" - ;; - ppc64-*linux*|powerpc64-*linux*) - LD="${LD-ld} -m elf32ppclinux" - ;; - s390x-*linux*) - LD="${LD-ld} -m elf_s390" - ;; - sparc64-*linux*) - LD="${LD-ld} -m elf32_sparc" - ;; - esac - ;; - *64-bit*) - case $host in - x86_64-*kfreebsd*-gnu) - LD="${LD-ld} -m elf_x86_64_fbsd" - ;; - x86_64-*linux*) - LD="${LD-ld} -m elf_x86_64" - ;; - ppc*-*linux*|powerpc*-*linux*) - LD="${LD-ld} -m elf64ppc" - ;; - s390*-*linux*|s390*-*tpf*) - LD="${LD-ld} -m elf64_s390" - ;; - sparc*-*linux*) - LD="${LD-ld} -m elf64_sparc" - ;; - esac - ;; - esac - fi - rm -rf conftest* - ;; - -*-*-sco3.2v5*) - # On SCO OpenServer 5, we need -belf to get full-featured binaries. - SAVE_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS -belf" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 -$as_echo_n "checking whether the C compiler needs -belf... " >&6; } -if ${lt_cv_cc_needs_belf+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - lt_cv_cc_needs_belf=yes -else - lt_cv_cc_needs_belf=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 -$as_echo "$lt_cv_cc_needs_belf" >&6; } - if test x"$lt_cv_cc_needs_belf" != x"yes"; then - # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf - CFLAGS="$SAVE_CFLAGS" - fi - ;; -*-*solaris*) - # Find out which ABI we are using. - echo 'int i;' > conftest.$ac_ext - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - case `/usr/bin/file conftest.o` in - *64-bit*) - case $lt_cv_prog_gnu_ld in - yes*) - case $host in - i?86-*-solaris*) - LD="${LD-ld} -m elf_x86_64" - ;; - sparc*-*-solaris*) - LD="${LD-ld} -m elf64_sparc" - ;; - esac - # GNU ld 2.21 introduced _sol2 emulations. Use them if available. - if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then - LD="${LD-ld}_sol2" - fi - ;; - *) - if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then - LD="${LD-ld} -64" - fi - ;; - esac - ;; - esac - fi - rm -rf conftest* - ;; -esac - -need_locks="$enable_libtool_lock" - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. -set dummy ${ac_tool_prefix}mt; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_MANIFEST_TOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$MANIFEST_TOOL"; then - ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_STRIP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -8051,38 +9125,43 @@ IFS=$as_save_IFS fi fi -MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL -if test -n "$MANIFEST_TOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 -$as_echo "$MANIFEST_TOOL" >&6; } +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +printf "%s\n" "$STRIP" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi fi -if test -z "$ac_cv_prog_MANIFEST_TOOL"; then - ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL - # Extract the first word of "mt", so it can be a program name with args. -set dummy mt; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_MANIFEST_TOOL"; then - ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_STRIP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_STRIP="strip" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -8091,78 +9170,62 @@ IFS=$as_save_IFS fi fi -ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL -if test -n "$ac_ct_MANIFEST_TOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 -$as_echo "$ac_ct_MANIFEST_TOOL" >&6; } +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +printf "%s\n" "$ac_ct_STRIP" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi - if test "x$ac_ct_MANIFEST_TOOL" = x; then - MANIFEST_TOOL=":" + if test "x$ac_ct_STRIP" = x; then + STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac - MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL + STRIP=$ac_ct_STRIP fi else - MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" + STRIP="$ac_cv_prog_STRIP" fi -test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 -$as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } -if ${lt_cv_path_mainfest_tool+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_path_mainfest_tool=no - echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 - $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out - cat conftest.err >&5 - if $GREP 'Manifest Tool' conftest.out > /dev/null; then - lt_cv_path_mainfest_tool=yes - fi - rm -f conftest* -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 -$as_echo "$lt_cv_path_mainfest_tool" >&6; } -if test "x$lt_cv_path_mainfest_tool" != xyes; then - MANIFEST_TOOL=: -fi +test -z "$STRIP" && STRIP=: - case $host_os in - rhapsody* | darwin*) - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. -set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_DSYMUTIL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$DSYMUTIL"; then - ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. +set dummy ${ac_tool_prefix}ranlib; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_RANLIB+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$RANLIB"; then + ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -8171,38 +9234,43 @@ IFS=$as_save_IFS fi fi -DSYMUTIL=$ac_cv_prog_DSYMUTIL -if test -n "$DSYMUTIL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 -$as_echo "$DSYMUTIL" >&6; } +RANLIB=$ac_cv_prog_RANLIB +if test -n "$RANLIB"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 +printf "%s\n" "$RANLIB" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi fi -if test -z "$ac_cv_prog_DSYMUTIL"; then - ac_ct_DSYMUTIL=$DSYMUTIL - # Extract the first word of "dsymutil", so it can be a program name with args. -set dummy dsymutil; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_DSYMUTIL"; then - ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. +if test -z "$ac_cv_prog_RANLIB"; then + ac_ct_RANLIB=$RANLIB + # Extract the first word of "ranlib", so it can be a program name with args. +set dummy ranlib; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_RANLIB+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_RANLIB"; then + ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -8211,397 +9279,78 @@ IFS=$as_save_IFS fi fi -ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL -if test -n "$ac_ct_DSYMUTIL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 -$as_echo "$ac_ct_DSYMUTIL" >&6; } +ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB +if test -n "$ac_ct_RANLIB"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 +printf "%s\n" "$ac_ct_RANLIB" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi - if test "x$ac_ct_DSYMUTIL" = x; then - DSYMUTIL=":" + if test "x$ac_ct_RANLIB" = x; then + RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac - DSYMUTIL=$ac_ct_DSYMUTIL + RANLIB=$ac_ct_RANLIB fi else - DSYMUTIL="$ac_cv_prog_DSYMUTIL" + RANLIB="$ac_cv_prog_RANLIB" fi - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. -set dummy ${ac_tool_prefix}nmedit; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_NMEDIT+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$NMEDIT"; then - ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS +test -z "$RANLIB" && RANLIB=: -fi -fi -NMEDIT=$ac_cv_prog_NMEDIT -if test -n "$NMEDIT"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 -$as_echo "$NMEDIT" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi -fi -if test -z "$ac_cv_prog_NMEDIT"; then - ac_ct_NMEDIT=$NMEDIT - # Extract the first word of "nmedit", so it can be a program name with args. -set dummy nmedit; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_NMEDIT"; then - ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_NMEDIT="nmedit" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS -fi -fi -ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT -if test -n "$ac_ct_NMEDIT"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 -$as_echo "$ac_ct_NMEDIT" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + bitrig* | openbsd*) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" + ;; + *) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" fi - if test "x$ac_ct_NMEDIT" = x; then - NMEDIT=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; +case $host_os in + darwin*) + lock_old_archive_extraction=yes ;; + *) + lock_old_archive_extraction=no ;; esac - NMEDIT=$ac_ct_NMEDIT - fi -else - NMEDIT="$ac_cv_prog_NMEDIT" -fi - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. -set dummy ${ac_tool_prefix}lipo; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_LIPO+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$LIPO"; then - ac_cv_prog_LIPO="$LIPO" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_LIPO="${ac_tool_prefix}lipo" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS -fi -fi -LIPO=$ac_cv_prog_LIPO -if test -n "$LIPO"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 -$as_echo "$LIPO" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi -fi -if test -z "$ac_cv_prog_LIPO"; then - ac_ct_LIPO=$LIPO - # Extract the first word of "lipo", so it can be a program name with args. -set dummy lipo; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_LIPO+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_LIPO"; then - ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_LIPO="lipo" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS -fi -fi -ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO -if test -n "$ac_ct_LIPO"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 -$as_echo "$ac_ct_LIPO" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - if test "x$ac_ct_LIPO" = x; then - LIPO=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - LIPO=$ac_ct_LIPO - fi -else - LIPO="$ac_cv_prog_LIPO" -fi - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. -set dummy ${ac_tool_prefix}otool; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_OTOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$OTOOL"; then - ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_OTOOL="${ac_tool_prefix}otool" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS -fi -fi -OTOOL=$ac_cv_prog_OTOOL -if test -n "$OTOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 -$as_echo "$OTOOL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi -fi -if test -z "$ac_cv_prog_OTOOL"; then - ac_ct_OTOOL=$OTOOL - # Extract the first word of "otool", so it can be a program name with args. -set dummy otool; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_OTOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_OTOOL"; then - ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_OTOOL="otool" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS -fi -fi -ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL -if test -n "$ac_ct_OTOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 -$as_echo "$ac_ct_OTOOL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - if test "x$ac_ct_OTOOL" = x; then - OTOOL=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - OTOOL=$ac_ct_OTOOL - fi -else - OTOOL="$ac_cv_prog_OTOOL" -fi - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. -set dummy ${ac_tool_prefix}otool64; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_OTOOL64+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$OTOOL64"; then - ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS -fi -fi -OTOOL64=$ac_cv_prog_OTOOL64 -if test -n "$OTOOL64"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 -$as_echo "$OTOOL64" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi -fi -if test -z "$ac_cv_prog_OTOOL64"; then - ac_ct_OTOOL64=$OTOOL64 - # Extract the first word of "otool64", so it can be a program name with args. -set dummy otool64; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_OTOOL64"; then - ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_OTOOL64="otool64" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS -fi -fi -ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 -if test -n "$ac_ct_OTOOL64"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 -$as_echo "$ac_ct_OTOOL64" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - if test "x$ac_ct_OTOOL64" = x; then - OTOOL64=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - OTOOL64=$ac_ct_OTOOL64 - fi -else - OTOOL64="$ac_cv_prog_OTOOL64" -fi @@ -8623,292 +9372,295 @@ fi +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} +# Allow CC to be a program name with arguments. +compiler=$CC +# Check for command to grab the raw symbol name followed by C symbol from nm. +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 +printf %s "checking command to parse $NM output from $compiler object... " >&6; } +if test ${lt_cv_sys_global_symbol_pipe+y} +then : + printf %s "(cached) " >&6 +else $as_nop +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 -$as_echo_n "checking for -single_module linker flag... " >&6; } -if ${lt_cv_apple_cc_single_mod+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_apple_cc_single_mod=no - if test -z "${LT_MULTI_MODULE}"; then - # By default we will add the -single_module flag. You can override - # by either setting the environment variable LT_MULTI_MODULE - # non-empty at configure time, or by adding -multi_module to the - # link flags. - rm -rf libconftest.dylib* - echo "int foo(void){return 1;}" > conftest.c - echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ --dynamiclib -Wl,-single_module conftest.c" >&5 - $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ - -dynamiclib -Wl,-single_module conftest.c 2>conftest.err - _lt_result=$? - # If there is a non-empty error log, and "single_module" - # appears in it, assume the flag caused a linker warning - if test -s conftest.err && $GREP single_module conftest.err; then - cat conftest.err >&5 - # Otherwise, if the output was created with a 0 exit code from - # the compiler, it worked. - elif test -f libconftest.dylib && test $_lt_result -eq 0; then - lt_cv_apple_cc_single_mod=yes - else - cat conftest.err >&5 - fi - rm -rf libconftest.dylib* - rm -f conftest.* - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 -$as_echo "$lt_cv_apple_cc_single_mod" >&6; } +# Character class describing NM global symbol codes. +symcode='[BCDEGRST]' - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 -$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } -if ${lt_cv_ld_exported_symbols_list+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_ld_exported_symbols_list=no - save_LDFLAGS=$LDFLAGS - echo "_main" > conftest.sym - LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ +# Regexp to match symbols that can be accessed directly from C. +sympat='\([_A-Za-z][_A-Za-z0-9]*\)' -int -main () -{ +# Define system-specific variables. +case $host_os in +aix*) + symcode='[BCDT]' + ;; +cygwin* | mingw* | pw32* | cegcc*) + symcode='[ABCDGISTW]' + ;; +hpux*) + if test ia64 = "$host_cpu"; then + symcode='[ABCDEGRST]' + fi + ;; +irix* | nonstopux*) + symcode='[BCDEGRST]' + ;; +osf*) + symcode='[BCDEGQRST]' + ;; +solaris*) + symcode='[BDRT]' + ;; +sco3.2v5*) + symcode='[DT]' + ;; +sysv4.2uw2*) + symcode='[DT]' + ;; +sysv5* | sco5v6* | unixware* | OpenUNIX*) + symcode='[ABDT]' + ;; +sysv4) + symcode='[DFNSTU]' + ;; +esac - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - lt_cv_ld_exported_symbols_list=yes -else - lt_cv_ld_exported_symbols_list=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - LDFLAGS="$save_LDFLAGS" +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[ABCDGIRSTW]' ;; +esac +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Gets list of data symbols to import. + lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'" + # Adjust the below global symbol transforms to fixup imported variables. + lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'" + lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'" + lt_c_name_lib_hook="\ + -e 's/^I .* \(lib.*\)$/ {\"\1\", (void *) 0},/p'\ + -e 's/^I .* \(.*\)$/ {\"lib\1\", (void *) 0},/p'" +else + # Disable hooks by default. + lt_cv_sys_global_symbol_to_import= + lt_cdecl_hook= + lt_c_name_hook= + lt_c_name_lib_hook= fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 -$as_echo "$lt_cv_ld_exported_symbols_list" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 -$as_echo_n "checking for -force_load linker flag... " >&6; } -if ${lt_cv_ld_force_load+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_ld_force_load=no - cat > conftest.c << _LT_EOF -int forced_loaded() { return 2;} -_LT_EOF - echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 - $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 - echo "$AR cru libconftest.a conftest.o" >&5 - $AR cru libconftest.a conftest.o 2>&5 - echo "$RANLIB libconftest.a" >&5 - $RANLIB libconftest.a 2>&5 - cat > conftest.c << _LT_EOF -int main() { return 0;} -_LT_EOF - echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 - $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err - _lt_result=$? - if test -s conftest.err && $GREP force_load conftest.err; then - cat conftest.err >&5 - elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then - lt_cv_ld_force_load=yes - else - cat conftest.err >&5 - fi - rm -f conftest.err libconftest.a conftest conftest.c - rm -rf conftest.dSYM +# Transform an extracted symbol line into a proper C declaration. +# Some systems (esp. on ia64) link data and code symbols differently, +# so use this general approach. +lt_cv_sys_global_symbol_to_cdecl="sed -n"\ +$lt_cdecl_hook\ +" -e 's/^T .* \(.*\)$/extern int \1();/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'" -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 -$as_echo "$lt_cv_ld_force_load" >&6; } - case $host_os in - rhapsody* | darwin1.[012]) - _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; - darwin1.*) - _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; - darwin*) # darwin 5.x on - # if running on 10.5 or later, the deployment target defaults - # to the OS version, if on x86, and 10.4, the deployment - # target defaults to 10.4. Don't you love it? - case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in - 10.0,*86*-darwin8*|10.0,*-darwin[91]*) - _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; - 10.[012]*) - _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; - 10.*) - _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; - esac - ;; - esac - if test "$lt_cv_apple_cc_single_mod" = "yes"; then - _lt_dar_single_mod='$single_module' - fi - if test "$lt_cv_ld_exported_symbols_list" = "yes"; then - _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' - else - _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' - fi - if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then - _lt_dsymutil='~$DSYMUTIL $lib || :' - else - _lt_dsymutil= - fi - ;; - esac +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n"\ +$lt_c_name_hook\ +" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'" + +# Transform an extracted symbol line into symbol name with lib prefix and +# symbol address. +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\ +$lt_c_name_lib_hook\ +" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ +" -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"lib\1\", (void *) \&\1},/p'" -for ac_header in dlfcn.h -do : - ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default -" -if test "x$ac_cv_header_dlfcn_h" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_DLFCN_H 1 -_ACEOF +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac -fi +# Try without a prefix underscore, then with it. +for ac_symprfx in "" "_"; do -done + # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. + symxfrm="\\1 $ac_symprfx\\2 \\2" + # Write the raw and C identifiers. + if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Fake it for dumpbin and say T for any non-static function, + # D for any global variable and I for any imported variable. + # Also find C++ and __fastcall symbols from MSVC++, + # which start with @ or ?. + lt_cv_sys_global_symbol_pipe="$AWK '"\ +" {last_section=section; section=\$ 3};"\ +" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ +" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ +" /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\ +" /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\ +" /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\ +" \$ 0!~/External *\|/{next};"\ +" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ +" {if(hide[section]) next};"\ +" {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\ +" {split(\$ 0,a,/\||\r/); split(a[2],s)};"\ +" s[1]~/^[@?]/{print f,s[1],s[1]; next};"\ +" s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\ +" ' prfx=^$ac_symprfx" + else + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" + fi + lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" + # Check to see that the pipe works correctly. + pipe_works=no + rm -f conftest* + cat > conftest.$ac_ext <<_LT_EOF +#ifdef __cplusplus +extern "C" { +#endif +char nm_test_var; +void nm_test_func(void); +void nm_test_func(void){} +#ifdef __cplusplus +} +#endif +int main(){nm_test_var='a';nm_test_func();return(0);} +_LT_EOF + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + # Now try to grab the symbols. + nlist=conftest.nm + $ECHO "$as_me:$LINENO: $NM conftest.$ac_objext | $lt_cv_sys_global_symbol_pipe > $nlist" >&5 + if eval "$NM" conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist 2>&5 && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi -# Set options + # Make sure that we snagged all the symbols we need. + if $GREP ' nm_test_var$' "$nlist" >/dev/null; then + if $GREP ' nm_test_func$' "$nlist" >/dev/null; then + cat <<_LT_EOF > conftest.$ac_ext +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE +/* DATA imports from DLLs on WIN32 can't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT_DLSYM_CONST +#elif defined __osf__ +/* This system does not cope well with relocations in const data. */ +# define LT_DLSYM_CONST +#else +# define LT_DLSYM_CONST const +#endif +#ifdef __cplusplus +extern "C" { +#endif +_LT_EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' - enable_dlopen=no + cat <<_LT_EOF >> conftest.$ac_ext +/* The mapping between symbol names and symbols. */ +LT_DLSYM_CONST struct { + const char *name; + void *address; +} +lt__PROGRAM__LTX_preloaded_symbols[] = +{ + { "@PROGRAM@", (void *) 0 }, +_LT_EOF + $SED "s/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext + cat <<\_LT_EOF >> conftest.$ac_ext + {0, (void *) 0} +}; +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt__PROGRAM__LTX_preloaded_symbols; +} +#endif - # Check whether --enable-shared was given. -if test "${enable_shared+set}" = set; then : - enableval=$enable_shared; p=${PACKAGE-default} - case $enableval in - yes) enable_shared=yes ;; - no) enable_shared=no ;; - *) - enable_shared=no - # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for pkg in $enableval; do - IFS="$lt_save_ifs" - if test "X$pkg" = "X$p"; then - enable_shared=yes +#ifdef __cplusplus +} +#endif +_LT_EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_globsym_save_LIBS=$LIBS + lt_globsym_save_CFLAGS=$CFLAGS + LIBS=conftstm.$ac_objext + CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest$ac_exeext; then + pipe_works=yes + fi + LIBS=$lt_globsym_save_LIBS + CFLAGS=$lt_globsym_save_CFLAGS + else + echo "cannot find nm_test_func in $nlist" >&5 fi - done - IFS="$lt_save_ifs" - ;; - esac -else - enable_shared=yes -fi - - - - - - - + else + echo "cannot find nm_test_var in $nlist" >&5 + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 + fi + else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + fi + rm -rf conftest* conftst* + # Do not use the global_symbol_pipe unless it works. + if test yes = "$pipe_works"; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done - # Check whether --enable-static was given. -if test "${enable_static+set}" = set; then : - enableval=$enable_static; p=${PACKAGE-default} - case $enableval in - yes) enable_static=yes ;; - no) enable_static=no ;; - *) - enable_static=no - # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for pkg in $enableval; do - IFS="$lt_save_ifs" - if test "X$pkg" = "X$p"; then - enable_static=yes - fi - done - IFS="$lt_save_ifs" - ;; - esac -else - enable_static=yes fi - - - - - - - - - -# Check whether --with-pic was given. -if test "${with_pic+set}" = set; then : - withval=$with_pic; lt_p=${PACKAGE-default} - case $withval in - yes|no) pic_mode=$withval ;; - *) - pic_mode=default - # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for lt_pkg in $withval; do - IFS="$lt_save_ifs" - if test "X$lt_pkg" = "X$lt_p"; then - pic_mode=yes - fi - done - IFS="$lt_save_ifs" - ;; - esac -else - pic_mode=default +if test -z "$lt_cv_sys_global_symbol_pipe"; then + lt_cv_sys_global_symbol_to_cdecl= fi - - -test -z "$pic_mode" && pic_mode=default - - - - - - - - # Check whether --enable-fast-install was given. -if test "${enable_fast_install+set}" = set; then : - enableval=$enable_fast_install; p=${PACKAGE-default} - case $enableval in - yes) enable_fast_install=yes ;; - no) enable_fast_install=no ;; - *) - enable_fast_install=no - # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for pkg in $enableval; do - IFS="$lt_save_ifs" - if test "X$pkg" = "X$p"; then - enable_fast_install=yes - fi - done - IFS="$lt_save_ifs" - ;; - esac +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: failed" >&5 +printf "%s\n" "failed" >&6; } else - enable_fast_install=yes + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ok" >&5 +printf "%s\n" "ok" >&6; } fi +# Response file support. +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + nm_file_list_spec='@' +elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then + nm_file_list_spec='@' +fi @@ -8919,19 +9671,6 @@ fi -# This can be used to rebuild libtool when needed -LIBTOOL_DEPS="$ltmain" - -# Always use our own libtool. -LIBTOOL='$(SHELL) $(top_builddir)/libtool' - - - - - - - - @@ -8954,355 +9693,524 @@ LIBTOOL='$(SHELL) $(top_builddir)/libtool' -test -z "$LN_S" && LN_S="ln -s" +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 +printf %s "checking for sysroot... " >&6; } +# Check whether --with-sysroot was given. +if test ${with_sysroot+y} +then : + withval=$with_sysroot; +else $as_nop + with_sysroot=no +fi +lt_sysroot= +case $with_sysroot in #( + yes) + if test yes = "$GCC"; then + lt_sysroot=`$CC --print-sysroot 2>/dev/null` + fi + ;; #( + /*) + lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` + ;; #( + no|'') + ;; #( + *) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $with_sysroot" >&5 +printf "%s\n" "$with_sysroot" >&6; } + as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 + ;; +esac + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 +printf "%s\n" "${lt_sysroot:-no}" >&6; } -if test -n "${ZSH_VERSION+set}" ; then - setopt NO_GLOB_SUBST +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a working dd" >&5 +printf %s "checking for a working dd... " >&6; } +if test ${ac_cv_path_lt_DD+y} +then : + printf %s "(cached) " >&6 +else $as_nop + printf 0123456789abcdef0123456789abcdef >conftest.i +cat conftest.i conftest.i >conftest2.i +: ${lt_DD:=$DD} +if test -z "$lt_DD"; then + ac_path_lt_DD_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_prog in dd + do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_lt_DD="$as_dir$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_lt_DD" || continue +if "$ac_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then + cmp -s conftest.i conftest.out \ + && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=: fi - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 -$as_echo_n "checking for objdir... " >&6; } -if ${lt_cv_objdir+:} false; then : - $as_echo_n "(cached) " >&6 -else - rm -f .libs 2>/dev/null -mkdir .libs 2>/dev/null -if test -d .libs; then - lt_cv_objdir=.libs + $ac_path_lt_DD_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_lt_DD"; then + : + fi else - # MS-DOS does not allow filenames that begin with a dot. - lt_cv_objdir=_libs -fi -rmdir .libs 2>/dev/null + ac_cv_path_lt_DD=$lt_DD fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 -$as_echo "$lt_cv_objdir" >&6; } -objdir=$lt_cv_objdir - - +rm -f conftest.i conftest2.i conftest.out +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_lt_DD" >&5 +printf "%s\n" "$ac_cv_path_lt_DD" >&6; } -cat >>confdefs.h <<_ACEOF -#define LT_OBJDIR "$lt_cv_objdir/" -_ACEOF - - +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to truncate binary pipes" >&5 +printf %s "checking how to truncate binary pipes... " >&6; } +if test ${lt_cv_truncate_bin+y} +then : + printf %s "(cached) " >&6 +else $as_nop + printf 0123456789abcdef0123456789abcdef >conftest.i +cat conftest.i conftest.i >conftest2.i +lt_cv_truncate_bin= +if "$ac_cv_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then + cmp -s conftest.i conftest.out \ + && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1" +fi +rm -f conftest.i conftest2.i conftest.out +test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q" +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_truncate_bin" >&5 +printf "%s\n" "$lt_cv_truncate_bin" >&6; } -case $host_os in -aix3*) - # AIX sometimes has problems with the GCC collect2 program. For some - # reason, if we set the COLLECT_NAMES environment variable, the problems - # vanish in a puff of smoke. - if test "X${COLLECT_NAMES+set}" != Xset; then - COLLECT_NAMES= - export COLLECT_NAMES - fi - ;; -esac -# Global variables: -ofile=libtool -can_build_shared=yes -# All known linkers require a `.a' archive for static linking (except MSVC, -# which needs '.lib'). -libext=a -with_gnu_ld="$lt_cv_prog_gnu_ld" -old_CC="$CC" -old_CFLAGS="$CFLAGS" -# Set sane defaults for various variables -test -z "$CC" && CC=cc -test -z "$LTCC" && LTCC=$CC -test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS -test -z "$LD" && LD=ld -test -z "$ac_objext" && ac_objext=o +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +func_cc_basename () +{ + for cc_temp in $*""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac + done + func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +} -for cc_temp in $compiler""; do - case $cc_temp in - compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; - distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; - \-*) ;; - *) break;; - esac -done -cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +# Check whether --enable-libtool-lock was given. +if test ${enable_libtool_lock+y} +then : + enableval=$enable_libtool_lock; +fi +test no = "$enable_libtool_lock" || enable_libtool_lock=yes -# Only perform the check for file, if the check method requires it -test -z "$MAGIC_CMD" && MAGIC_CMD=file -case $deplibs_check_method in -file_magic*) - if test "$file_magic_cmd" = '$MAGIC_CMD'; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 -$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } -if ${lt_cv_path_MAGIC_CMD+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $MAGIC_CMD in -[\\/*] | ?:[\\/]*) - lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +ia64-*-hpux*) + # Find out what ABI is being produced by ac_compile, and set mode + # options accordingly. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE=32 + ;; + *ELF-64*) + HPUX_IA64_MODE=64 + ;; + esac + fi + rm -rf conftest* ;; -*) - lt_save_MAGIC_CMD="$MAGIC_CMD" - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" - for ac_dir in $ac_dummy; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/${ac_tool_prefix}file; then - lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file" - if test -n "$file_magic_test_file"; then - case $deplibs_check_method in - "file_magic "*) - file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` - MAGIC_CMD="$lt_cv_path_MAGIC_CMD" - if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | - $EGREP "$file_magic_regex" > /dev/null; then - : - else - cat <<_LT_EOF 1>&2 - -*** Warning: the command libtool uses to detect shared libraries, -*** $file_magic_cmd, produces output that libtool cannot recognize. -*** The result is that libtool may fail to recognize shared libraries -*** as such. This will affect the creation of libtool libraries that -*** depend on shared libraries, but programs linked with such libtool -*** libraries will work regardless of this problem. Nevertheless, you -*** may want to report the problem to your system manager and/or to -*** bug-libtool@gnu.org - -_LT_EOF - fi ;; - esac - fi - break +*-*-irix6*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo '#line '$LINENO' "configure"' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + if test yes = "$lt_cv_prog_gnu_ld"; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac fi - done - IFS="$lt_save_ifs" - MAGIC_CMD="$lt_save_MAGIC_CMD" + fi + rm -rf conftest* ;; -esac -fi - -MAGIC_CMD="$lt_cv_path_MAGIC_CMD" -if test -n "$MAGIC_CMD"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 -$as_echo "$MAGIC_CMD" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - - -if test -z "$lt_cv_path_MAGIC_CMD"; then - if test -n "$ac_tool_prefix"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 -$as_echo_n "checking for file... " >&6; } -if ${lt_cv_path_MAGIC_CMD+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $MAGIC_CMD in -[\\/*] | ?:[\\/]*) - lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. +mips64*-*linux*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo '#line '$LINENO' "configure"' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + emul=elf + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + emul="${emul}32" + ;; + *64-bit*) + emul="${emul}64" + ;; + esac + case `/usr/bin/file conftest.$ac_objext` in + *MSB*) + emul="${emul}btsmip" + ;; + *LSB*) + emul="${emul}ltsmip" + ;; + esac + case `/usr/bin/file conftest.$ac_objext` in + *N32*) + emul="${emul}n32" + ;; + esac + LD="${LD-ld} -m $emul" + fi + rm -rf conftest* ;; -*) - lt_save_MAGIC_CMD="$MAGIC_CMD" - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" - for ac_dir in $ac_dummy; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/file; then - lt_cv_path_MAGIC_CMD="$ac_dir/file" - if test -n "$file_magic_test_file"; then - case $deplibs_check_method in - "file_magic "*) - file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` - MAGIC_CMD="$lt_cv_path_MAGIC_CMD" - if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | - $EGREP "$file_magic_regex" > /dev/null; then - : - else - cat <<_LT_EOF 1>&2 - -*** Warning: the command libtool uses to detect shared libraries, -*** $file_magic_cmd, produces output that libtool cannot recognize. -*** The result is that libtool may fail to recognize shared libraries -*** as such. This will affect the creation of libtool libraries that -*** depend on shared libraries, but programs linked with such libtool -*** libraries will work regardless of this problem. Nevertheless, you -*** may want to report the problem to your system manager and/or to -*** bug-libtool@gnu.org -_LT_EOF - fi ;; +x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ +s390*-*linux*|s390*-*tpf*|sparc*-*linux*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. Note that the listed cases only cover the + # situations where additional linker options are needed (such as when + # doing 32-bit compilation for a host where ld defaults to 64-bit, or + # vice versa); the common cases where no linker options are needed do + # not appear in the list. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.o` in + *32-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_i386_fbsd" + ;; + x86_64-*linux*) + case `/usr/bin/file conftest.o` in + *x86-64*) + LD="${LD-ld} -m elf32_x86_64" + ;; + *) + LD="${LD-ld} -m elf_i386" + ;; + esac + ;; + powerpc64le-*linux*) + LD="${LD-ld} -m elf32lppclinux" + ;; + powerpc64-*linux*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; esac - fi - break - fi - done - IFS="$lt_save_ifs" - MAGIC_CMD="$lt_save_MAGIC_CMD" - ;; -esac -fi - -MAGIC_CMD="$lt_cv_path_MAGIC_CMD" -if test -n "$MAGIC_CMD"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 -$as_echo "$MAGIC_CMD" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - else - MAGIC_CMD=: - fi -fi - + ;; + *64-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_x86_64_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + powerpcle-*linux*) + LD="${LD-ld} -m elf64lppc" + ;; + powerpc-*linux*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*|s390*-*tpf*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; + esac fi + rm -rf conftest* ;; -esac - -# Use C for the default configuration in the libtool script -lt_save_CC="$CC" -ac_ext=c +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS=$CFLAGS + CFLAGS="$CFLAGS -belf" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 +printf %s "checking whether the C compiler needs -belf... " >&6; } +if test ${lt_cv_cc_needs_belf+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ -# Source file extension for C test sources. -ac_ext=c - -# Object file extension for compiled C test sources. -objext=o -objext=$objext - -# Code to be used in simple compile tests -lt_simple_compile_test_code="int some_variable = 0;" - -# Code to be used in simple link tests -lt_simple_link_test_code='int main(){return(0);}' - - - - - - - -# If no C compiler was specified, use CC. -LTCC=${LTCC-"$CC"} - -# If no C compiler flags were specified, use CFLAGS. -LTCFLAGS=${LTCFLAGS-"$CFLAGS"} +int +main (void) +{ -# Allow CC to be a program name with arguments. -compiler=$CC + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + lt_cv_cc_needs_belf=yes +else $as_nop + lt_cv_cc_needs_belf=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu -# Save the default compiler, since it gets overwritten when the other -# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. -compiler_DEFAULT=$CC - -# save warnings/boilerplate of simple test code -ac_outfile=conftest.$ac_objext -echo "$lt_simple_compile_test_code" >conftest.$ac_ext -eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err -_lt_compiler_boilerplate=`cat conftest.err` -$RM conftest* +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 +printf "%s\n" "$lt_cv_cc_needs_belf" >&6; } + if test yes != "$lt_cv_cc_needs_belf"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS=$SAVE_CFLAGS + fi + ;; +*-*solaris*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) + case $host in + i?86-*-solaris*|x86_64-*-solaris*) + LD="${LD-ld} -m elf_x86_64" + ;; + sparc*-*-solaris*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + # GNU ld 2.21 introduced _sol2 emulations. Use them if available. + if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then + LD=${LD-ld}_sol2 + fi + ;; + *) + if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then + LD="${LD-ld} -64" + fi + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; +esac -ac_outfile=conftest.$ac_objext -echo "$lt_simple_link_test_code" >conftest.$ac_ext -eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err -_lt_linker_boilerplate=`cat conftest.err` -$RM -r conftest* +need_locks=$enable_libtool_lock +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. +set dummy ${ac_tool_prefix}mt; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_MANIFEST_TOOL+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$MANIFEST_TOOL"; then + ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS -## CAVEAT EMPTOR: -## There is no encapsulation within the following macros, do not change -## the running order or otherwise move them around unless you know exactly -## what you are doing... -if test -n "$compiler"; then +fi +fi +MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL +if test -n "$MANIFEST_TOOL"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 +printf "%s\n" "$MANIFEST_TOOL" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi -lt_prog_compiler_no_builtin_flag= -if test "$GCC" = yes; then - case $cc_basename in - nvcc*) - lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; - *) - lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; +fi +if test -z "$ac_cv_prog_MANIFEST_TOOL"; then + ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL + # Extract the first word of "mt", so it can be a program name with args. +set dummy mt; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_MANIFEST_TOOL+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_MANIFEST_TOOL"; then + ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 -$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } -if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : - $as_echo_n "(cached) " >&6 +fi +fi +ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL +if test -n "$ac_ct_MANIFEST_TOOL"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 +printf "%s\n" "$ac_ct_MANIFEST_TOOL" >&6; } else - lt_cv_prog_compiler_rtti_exceptions=no - ac_outfile=conftest.$ac_objext - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - lt_compiler_flag="-fno-rtti -fno-exceptions" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - # The option is referenced via a variable to avoid confusing sed. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) - (eval "$lt_compile" 2>conftest.err) - ac_status=$? - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s "$ac_outfile"; then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings other than the usual output. - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then - lt_cv_prog_compiler_rtti_exceptions=yes - fi - fi - $RM conftest* - + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 -$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } -if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then - lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" + if test "x$ac_ct_MANIFEST_TOOL" = x; then + MANIFEST_TOOL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL + fi else - : + MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" fi +test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 +printf %s "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } +if test ${lt_cv_path_mainfest_tool+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_path_mainfest_tool=no + echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 + $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out + cat conftest.err >&5 + if $GREP 'Manifest Tool' conftest.out > /dev/null; then + lt_cv_path_mainfest_tool=yes + fi + rm -f conftest* +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 +printf "%s\n" "$lt_cv_path_mainfest_tool" >&6; } +if test yes != "$lt_cv_path_mainfest_tool"; then + MANIFEST_TOOL=: fi @@ -9310,381 +10218,526 @@ fi - lt_prog_compiler_wl= -lt_prog_compiler_pic= -lt_prog_compiler_static= + case $host_os in + rhapsody* | darwin*) + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. +set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_DSYMUTIL+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$DSYMUTIL"; then + ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS +fi +fi +DSYMUTIL=$ac_cv_prog_DSYMUTIL +if test -n "$DSYMUTIL"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 +printf "%s\n" "$DSYMUTIL" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi - if test "$GCC" = yes; then - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_static='-static' - case $host_os in - aix*) - # All AIX code is PIC. - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - lt_prog_compiler_static='-Bstatic' - fi - ;; +fi +if test -z "$ac_cv_prog_DSYMUTIL"; then + ac_ct_DSYMUTIL=$DSYMUTIL + # Extract the first word of "dsymutil", so it can be a program name with args. +set dummy dsymutil; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_DSYMUTIL+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_DSYMUTIL"; then + ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS - amigaos*) - case $host_cpu in - powerpc) - # see comment about AmigaOS4 .so support - lt_prog_compiler_pic='-fPIC' - ;; - m68k) - # FIXME: we need at least 68020 code to build shared libraries, but - # adding the `-m68020' flag to GCC prevents building anything better, - # like `-m68040'. - lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' - ;; - esac - ;; +fi +fi +ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL +if test -n "$ac_ct_DSYMUTIL"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 +printf "%s\n" "$ac_ct_DSYMUTIL" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi - beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) - # PIC is the default for these OSes. - ;; + if test "x$ac_ct_DSYMUTIL" = x; then + DSYMUTIL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DSYMUTIL=$ac_ct_DSYMUTIL + fi +else + DSYMUTIL="$ac_cv_prog_DSYMUTIL" +fi - mingw* | cygwin* | pw32* | os2* | cegcc*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - # Although the cygwin gcc ignores -fPIC, still need this for old-style - # (--disable-auto-import) libraries - lt_prog_compiler_pic='-DDLL_EXPORT' - ;; + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. +set dummy ${ac_tool_prefix}nmedit; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_NMEDIT+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$NMEDIT"; then + ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS - darwin* | rhapsody*) - # PIC is the default on this platform - # Common symbols not allowed in MH_DYLIB files - lt_prog_compiler_pic='-fno-common' - ;; +fi +fi +NMEDIT=$ac_cv_prog_NMEDIT +if test -n "$NMEDIT"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 +printf "%s\n" "$NMEDIT" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi - haiku*) - # PIC is the default for Haiku. - # The "-static" flag exists, but is broken. - lt_prog_compiler_static= - ;; - hpux*) - # PIC is the default for 64-bit PA HP-UX, but not for 32-bit - # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag - # sets the default TLS model and affects inlining. - case $host_cpu in - hppa*64*) - # +Z the default - ;; - *) - lt_prog_compiler_pic='-fPIC' - ;; - esac - ;; +fi +if test -z "$ac_cv_prog_NMEDIT"; then + ac_ct_NMEDIT=$NMEDIT + # Extract the first word of "nmedit", so it can be a program name with args. +set dummy nmedit; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_NMEDIT+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_NMEDIT"; then + ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_NMEDIT="nmedit" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS - interix[3-9]*) - # Interix 3.x gcc -fpic/-fPIC options generate broken code. - # Instead, we relocate shared libraries at runtime. - ;; +fi +fi +ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT +if test -n "$ac_ct_NMEDIT"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 +printf "%s\n" "$ac_ct_NMEDIT" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi - msdosdjgpp*) - # Just because we use GCC doesn't mean we suddenly get shared libraries - # on systems that don't support them. - lt_prog_compiler_can_build_shared=no - enable_shared=no - ;; + if test "x$ac_ct_NMEDIT" = x; then + NMEDIT=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + NMEDIT=$ac_ct_NMEDIT + fi +else + NMEDIT="$ac_cv_prog_NMEDIT" +fi - *nto* | *qnx*) - # QNX uses GNU C++, but need to define -shared option too, otherwise - # it will coredump. - lt_prog_compiler_pic='-fPIC -shared' - ;; + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. +set dummy ${ac_tool_prefix}lipo; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_LIPO+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$LIPO"; then + ac_cv_prog_LIPO="$LIPO" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_LIPO="${ac_tool_prefix}lipo" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS - sysv4*MP*) - if test -d /usr/nec; then - lt_prog_compiler_pic=-Kconform_pic - fi - ;; +fi +fi +LIPO=$ac_cv_prog_LIPO +if test -n "$LIPO"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 +printf "%s\n" "$LIPO" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi - *) - lt_prog_compiler_pic='-fPIC' - ;; - esac - case $cc_basename in - nvcc*) # Cuda Compiler Driver 2.2 - lt_prog_compiler_wl='-Xlinker ' - if test -n "$lt_prog_compiler_pic"; then - lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic" - fi - ;; - esac +fi +if test -z "$ac_cv_prog_LIPO"; then + ac_ct_LIPO=$LIPO + # Extract the first word of "lipo", so it can be a program name with args. +set dummy lipo; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_LIPO+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_LIPO"; then + ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_LIPO="lipo" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO +if test -n "$ac_ct_LIPO"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 +printf "%s\n" "$ac_ct_LIPO" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_LIPO" = x; then + LIPO=":" else - # PORTME Check for flag to pass linker flags through the system compiler. - case $host_os in - aix*) - lt_prog_compiler_wl='-Wl,' - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - lt_prog_compiler_static='-Bstatic' - else - lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' - fi - ;; + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + LIPO=$ac_ct_LIPO + fi +else + LIPO="$ac_cv_prog_LIPO" +fi - mingw* | cygwin* | pw32* | os2* | cegcc*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - lt_prog_compiler_pic='-DDLL_EXPORT' - ;; + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. +set dummy ${ac_tool_prefix}otool; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_OTOOL+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$OTOOL"; then + ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_OTOOL="${ac_tool_prefix}otool" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS - hpux9* | hpux10* | hpux11*) - lt_prog_compiler_wl='-Wl,' - # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but - # not for PA HP-UX. - case $host_cpu in - hppa*64*|ia64*) - # +Z the default - ;; - *) - lt_prog_compiler_pic='+Z' - ;; - esac - # Is there a better lt_prog_compiler_static that works with the bundled CC? - lt_prog_compiler_static='${wl}-a ${wl}archive' - ;; +fi +fi +OTOOL=$ac_cv_prog_OTOOL +if test -n "$OTOOL"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 +printf "%s\n" "$OTOOL" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi - irix5* | irix6* | nonstopux*) - lt_prog_compiler_wl='-Wl,' - # PIC (with -KPIC) is the default. - lt_prog_compiler_static='-non_shared' - ;; - linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) - case $cc_basename in - # old Intel for x86_64 which still supported -KPIC. - ecc*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-static' - ;; - # icc used to be incompatible with GCC. - # ICC 10 doesn't accept -KPIC any more. - icc* | ifort*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-fPIC' - lt_prog_compiler_static='-static' - ;; - # Lahey Fortran 8.1. - lf95*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='--shared' - lt_prog_compiler_static='--static' - ;; - nagfor*) - # NAG Fortran compiler - lt_prog_compiler_wl='-Wl,-Wl,,' - lt_prog_compiler_pic='-PIC' - lt_prog_compiler_static='-Bstatic' - ;; - pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) - # Portland Group compilers (*not* the Pentium gcc compiler, - # which looks to be a dead project) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-fpic' - lt_prog_compiler_static='-Bstatic' - ;; - ccc*) - lt_prog_compiler_wl='-Wl,' - # All Alpha code is PIC. - lt_prog_compiler_static='-non_shared' - ;; - xl* | bgxl* | bgf* | mpixl*) - # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-qpic' - lt_prog_compiler_static='-qstaticlink' - ;; - *) - case `$CC -V 2>&1 | sed 5q` in - *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) - # Sun Fortran 8.3 passes all unrecognized flags to the linker - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - lt_prog_compiler_wl='' - ;; - *Sun\ F* | *Sun*Fortran*) - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - lt_prog_compiler_wl='-Qoption ld ' - ;; - *Sun\ C*) - # Sun C 5.9 - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - lt_prog_compiler_wl='-Wl,' - ;; - *Intel*\ [CF]*Compiler*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-fPIC' - lt_prog_compiler_static='-static' - ;; - *Portland\ Group*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-fpic' - lt_prog_compiler_static='-Bstatic' - ;; - esac - ;; - esac - ;; +fi +if test -z "$ac_cv_prog_OTOOL"; then + ac_ct_OTOOL=$OTOOL + # Extract the first word of "otool", so it can be a program name with args. +set dummy otool; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_OTOOL+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_OTOOL"; then + ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OTOOL="otool" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS - newsos6) - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - ;; +fi +fi +ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL +if test -n "$ac_ct_OTOOL"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 +printf "%s\n" "$ac_ct_OTOOL" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi - *nto* | *qnx*) - # QNX uses GNU C++, but need to define -shared option too, otherwise - # it will coredump. - lt_prog_compiler_pic='-fPIC -shared' - ;; + if test "x$ac_ct_OTOOL" = x; then + OTOOL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OTOOL=$ac_ct_OTOOL + fi +else + OTOOL="$ac_cv_prog_OTOOL" +fi - osf3* | osf4* | osf5*) - lt_prog_compiler_wl='-Wl,' - # All OSF/1 code is PIC. - lt_prog_compiler_static='-non_shared' - ;; + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. +set dummy ${ac_tool_prefix}otool64; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_OTOOL64+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$OTOOL64"; then + ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS - rdos*) - lt_prog_compiler_static='-non_shared' - ;; +fi +fi +OTOOL64=$ac_cv_prog_OTOOL64 +if test -n "$OTOOL64"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 +printf "%s\n" "$OTOOL64" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi - solaris*) - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - case $cc_basename in - f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) - lt_prog_compiler_wl='-Qoption ld ';; - *) - lt_prog_compiler_wl='-Wl,';; - esac - ;; - sunos4*) - lt_prog_compiler_wl='-Qoption ld ' - lt_prog_compiler_pic='-PIC' - lt_prog_compiler_static='-Bstatic' - ;; +fi +if test -z "$ac_cv_prog_OTOOL64"; then + ac_ct_OTOOL64=$OTOOL64 + # Extract the first word of "otool64", so it can be a program name with args. +set dummy otool64; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_OTOOL64+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_OTOOL64"; then + ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OTOOL64="otool64" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS - sysv4 | sysv4.2uw2* | sysv4.3*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - ;; +fi +fi +ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 +if test -n "$ac_ct_OTOOL64"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 +printf "%s\n" "$ac_ct_OTOOL64" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi - sysv4*MP*) - if test -d /usr/nec ;then - lt_prog_compiler_pic='-Kconform_pic' - lt_prog_compiler_static='-Bstatic' - fi - ;; + if test "x$ac_ct_OTOOL64" = x; then + OTOOL64=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OTOOL64=$ac_ct_OTOOL64 + fi +else + OTOOL64="$ac_cv_prog_OTOOL64" +fi - sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - ;; - unicos*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_can_build_shared=no - ;; - uts4*) - lt_prog_compiler_pic='-pic' - lt_prog_compiler_static='-Bstatic' - ;; - *) - lt_prog_compiler_can_build_shared=no - ;; - esac - fi -case $host_os in - # For platforms which do not support PIC, -DPIC is meaningless: - *djgpp*) - lt_prog_compiler_pic= - ;; - *) - lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" - ;; -esac -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 -$as_echo_n "checking for $compiler option to produce PIC... " >&6; } -if ${lt_cv_prog_compiler_pic+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_pic=$lt_prog_compiler_pic -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 -$as_echo "$lt_cv_prog_compiler_pic" >&6; } -lt_prog_compiler_pic=$lt_cv_prog_compiler_pic -# -# Check to make sure the PIC flag actually works. -# -if test -n "$lt_prog_compiler_pic"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 -$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } -if ${lt_cv_prog_compiler_pic_works+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_pic_works=no - ac_outfile=conftest.$ac_objext - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - lt_compiler_flag="$lt_prog_compiler_pic -DPIC" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - # The option is referenced via a variable to avoid confusing sed. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) - (eval "$lt_compile" 2>conftest.err) - ac_status=$? - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s "$ac_outfile"; then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings other than the usual output. - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then - lt_cv_prog_compiler_pic_works=yes - fi - fi - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 -$as_echo "$lt_cv_prog_compiler_pic_works" >&6; } -if test x"$lt_cv_prog_compiler_pic_works" = xyes; then - case $lt_prog_compiler_pic in - "" | " "*) ;; - *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; - esac -else - lt_prog_compiler_pic= - lt_prog_compiler_can_build_shared=no -fi -fi @@ -9696,1444 +10749,688 @@ fi -# -# Check to make sure the static flag actually works. -# -wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 -$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } -if ${lt_cv_prog_compiler_static_works+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_static_works=no - save_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS $lt_tmp_static_flag" - echo "$lt_simple_link_test_code" > conftest.$ac_ext - if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then - # The linker can only warn and ignore the option if not recognized - # So say no if there are warnings - if test -s conftest.err; then - # Append any errors to the config.log. - cat conftest.err 1>&5 - $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if diff conftest.exp conftest.er2 >/dev/null; then - lt_cv_prog_compiler_static_works=yes - fi - else - lt_cv_prog_compiler_static_works=yes - fi - fi - $RM -r conftest* - LDFLAGS="$save_LDFLAGS" -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 -$as_echo "$lt_cv_prog_compiler_static_works" >&6; } -if test x"$lt_cv_prog_compiler_static_works" = xyes; then - : -else - lt_prog_compiler_static= -fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 +printf %s "checking for -single_module linker flag... " >&6; } +if test ${lt_cv_apple_cc_single_mod+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_apple_cc_single_mod=no + if test -z "$LT_MULTI_MODULE"; then + # By default we will add the -single_module flag. You can override + # by either setting the environment variable LT_MULTI_MODULE + # non-empty at configure time, or by adding -multi_module to the + # link flags. + rm -rf libconftest.dylib* + echo "int foo(void){return 1;}" > conftest.c + echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ +-dynamiclib -Wl,-single_module conftest.c" >&5 + $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ + -dynamiclib -Wl,-single_module conftest.c 2>conftest.err + _lt_result=$? + # If there is a non-empty error log, and "single_module" + # appears in it, assume the flag caused a linker warning + if test -s conftest.err && $GREP single_module conftest.err; then + cat conftest.err >&5 + # Otherwise, if the output was created with a 0 exit code from + # the compiler, it worked. + elif test -f libconftest.dylib && test 0 = "$_lt_result"; then + lt_cv_apple_cc_single_mod=yes + else + cat conftest.err >&5 + fi + rm -rf libconftest.dylib* + rm -f conftest.* + fi +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 +printf "%s\n" "$lt_cv_apple_cc_single_mod" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 +printf %s "checking for -exported_symbols_list linker flag... " >&6; } +if test ${lt_cv_ld_exported_symbols_list+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_ld_exported_symbols_list=no + save_LDFLAGS=$LDFLAGS + echo "_main" > conftest.sym + LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 -$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } -if ${lt_cv_prog_compiler_c_o+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_c_o=no - $RM -r conftest 2>/dev/null - mkdir conftest - cd conftest - mkdir out - echo "$lt_simple_compile_test_code" > conftest.$ac_ext +int +main (void) +{ - lt_compiler_flag="-o out/conftest2.$ac_objext" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) - (eval "$lt_compile" 2>out/conftest.err) - ac_status=$? - cat out/conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s out/conftest2.$ac_objext - then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp - $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 - if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then - lt_cv_prog_compiler_c_o=yes - fi - fi - chmod u+w . 2>&5 - $RM conftest* - # SGI C++ compiler will create directory out/ii_files/ for - # template instantiation - test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files - $RM out/* && rmdir out - cd .. - $RM -r conftest - $RM conftest* + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + lt_cv_ld_exported_symbols_list=yes +else $as_nop + lt_cv_ld_exported_symbols_list=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 -$as_echo "$lt_cv_prog_compiler_c_o" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 +printf "%s\n" "$lt_cv_ld_exported_symbols_list" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 +printf %s "checking for -force_load linker flag... " >&6; } +if test ${lt_cv_ld_force_load+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_ld_force_load=no + cat > conftest.c << _LT_EOF +int forced_loaded() { return 2;} +_LT_EOF + echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 + $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 + echo "$AR cr libconftest.a conftest.o" >&5 + $AR cr libconftest.a conftest.o 2>&5 + echo "$RANLIB libconftest.a" >&5 + $RANLIB libconftest.a 2>&5 + cat > conftest.c << _LT_EOF +int main() { return 0;} +_LT_EOF + echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 + $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err + _lt_result=$? + if test -s conftest.err && $GREP force_load conftest.err; then + cat conftest.err >&5 + elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then + lt_cv_ld_force_load=yes + else + cat conftest.err >&5 + fi + rm -f conftest.err libconftest.a conftest conftest.c + rm -rf conftest.dSYM +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 +printf "%s\n" "$lt_cv_ld_force_load" >&6; } + case $host_os in + rhapsody* | darwin1.[012]) + _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;; + darwin1.*) + _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; + darwin*) # darwin 5.x on + # if running on 10.5 or later, the deployment target defaults + # to the OS version, if on x86, and 10.4, the deployment + # target defaults to 10.4. Don't you love it? + case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in + 10.0,*86*-darwin8*|10.0,*-darwin[912]*) + _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; + 10.[012][,.]*) + _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; + 10.*|11.*) + _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; + esac + ;; + esac + if test yes = "$lt_cv_apple_cc_single_mod"; then + _lt_dar_single_mod='$single_module' + fi + if test yes = "$lt_cv_ld_exported_symbols_list"; then + _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym' + else + _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib' + fi + if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then + _lt_dsymutil='~$DSYMUTIL $lib || :' + else + _lt_dsymutil= + fi + ;; + esac +# func_munge_path_list VARIABLE PATH +# ----------------------------------- +# VARIABLE is name of variable containing _space_ separated list of +# directories to be munged by the contents of PATH, which is string +# having a format: +# "DIR[:DIR]:" +# string "DIR[ DIR]" will be prepended to VARIABLE +# ":DIR[:DIR]" +# string "DIR[ DIR]" will be appended to VARIABLE +# "DIRP[:DIRP]::[DIRA:]DIRA" +# string "DIRP[ DIRP]" will be prepended to VARIABLE and string +# "DIRA[ DIRA]" will be appended to VARIABLE +# "DIR[:DIR]" +# VARIABLE will be replaced by "DIR[ DIR]" +func_munge_path_list () +{ + case x$2 in + x) + ;; + *:) + eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\" + ;; + x:*) + eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\" + ;; + *::*) + eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" + eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\" + ;; + *) + eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\" + ;; + esac +} +ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default +" +if test "x$ac_cv_header_dlfcn_h" = xyes +then : + printf "%s\n" "#define HAVE_DLFCN_H 1" >>confdefs.h +fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 -$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } -if ${lt_cv_prog_compiler_c_o+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_c_o=no - $RM -r conftest 2>/dev/null - mkdir conftest - cd conftest - mkdir out - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - lt_compiler_flag="-o out/conftest2.$ac_objext" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) - (eval "$lt_compile" 2>out/conftest.err) - ac_status=$? - cat out/conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s out/conftest2.$ac_objext - then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp - $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 - if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then - lt_cv_prog_compiler_c_o=yes - fi - fi - chmod u+w . 2>&5 - $RM conftest* - # SGI C++ compiler will create directory out/ii_files/ for - # template instantiation - test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files - $RM out/* && rmdir out - cd .. - $RM -r conftest - $RM conftest* -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 -$as_echo "$lt_cv_prog_compiler_c_o" >&6; } +func_stripname_cnf () +{ + case $2 in + .*) func_stripname_result=`$ECHO "$3" | $SED "s%^$1%%; s%\\\\$2\$%%"`;; + *) func_stripname_result=`$ECHO "$3" | $SED "s%^$1%%; s%$2\$%%"`;; + esac +} # func_stripname_cnf -hard_links="nottested" -if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then - # do not overwrite the value of need_locks provided by the user - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 -$as_echo_n "checking if we can lock with hard links... " >&6; } - hard_links=yes - $RM conftest* - ln conftest.a conftest.b 2>/dev/null && hard_links=no - touch conftest.a - ln conftest.a conftest.b 2>&5 || hard_links=no - ln conftest.a conftest.b 2>/dev/null && hard_links=no - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 -$as_echo "$hard_links" >&6; } - if test "$hard_links" = no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 -$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} - need_locks=warn - fi -else - need_locks=no -fi +# Set options + enable_dlopen=no - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 -$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } - runpath_var= - allow_undefined_flag= - always_export_symbols=no - archive_cmds= - archive_expsym_cmds= - compiler_needs_object=no - enable_shared_with_static_runtimes=no - export_dynamic_flag_spec= - export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' - hardcode_automatic=no - hardcode_direct=no - hardcode_direct_absolute=no - hardcode_libdir_flag_spec= - hardcode_libdir_separator= - hardcode_minus_L=no - hardcode_shlibpath_var=unsupported - inherit_rpath=no - link_all_deplibs=unknown - module_cmds= - module_expsym_cmds= - old_archive_from_new_cmds= - old_archive_from_expsyms_cmds= - thread_safe_flag_spec= - whole_archive_flag_spec= - # include_expsyms should be a list of space-separated symbols to be *always* - # included in the symbol list - include_expsyms= - # exclude_expsyms can be an extended regexp of symbols to exclude - # it will be wrapped by ` (' and `)$', so one must not match beginning or - # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', - # as well as any symbol that contains `d'. - exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' - # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out - # platforms (ab)use it in PIC code, but their linkers get confused if - # the symbol is explicitly referenced. Since portable code cannot - # rely on this symbol name, it's probably fine to never include it in - # preloaded symbol tables. - # Exclude shared library initialization/finalization symbols. - extract_expsyms_cmds= - case $host_os in - cygwin* | mingw* | pw32* | cegcc*) - # FIXME: the MSVC++ port hasn't been tested in a loooong time - # When not using gcc, we currently assume that we are using - # Microsoft Visual C++. - if test "$GCC" != yes; then - with_gnu_ld=no - fi - ;; - interix*) - # we just hope/assume this is gcc and not c89 (= MSVC++) - with_gnu_ld=yes - ;; - openbsd*) - with_gnu_ld=no - ;; - linux* | k*bsd*-gnu | gnu*) - link_all_deplibs=no - ;; - esac + # Check whether --enable-shared was given. +if test ${enable_shared+y} +then : + enableval=$enable_shared; p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS=$lt_save_ifs + ;; + esac +else $as_nop + enable_shared=yes +fi - ld_shlibs=yes - # On some targets, GNU ld is compatible enough with the native linker - # that we're better off using the native interface for both. - lt_use_gnu_ld_interface=no - if test "$with_gnu_ld" = yes; then - case $host_os in - aix*) - # The AIX port of GNU ld has always aspired to compatibility - # with the native linker. However, as the warning in the GNU ld - # block says, versions before 2.19.5* couldn't really create working - # shared libraries, regardless of the interface used. - case `$LD -v 2>&1` in - *\ \(GNU\ Binutils\)\ 2.19.5*) ;; - *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; - *\ \(GNU\ Binutils\)\ [3-9]*) ;; - *) - lt_use_gnu_ld_interface=yes - ;; - esac - ;; - *) - lt_use_gnu_ld_interface=yes - ;; - esac - fi - if test "$lt_use_gnu_ld_interface" = yes; then - # If archive_cmds runs LD, not CC, wlarc should be empty - wlarc='${wl}' - # Set some defaults for GNU ld with shared library support. These - # are reset later if shared libraries are not supported. Putting them - # here allows them to be overridden if necessary. - runpath_var=LD_RUN_PATH - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - export_dynamic_flag_spec='${wl}--export-dynamic' - # ancient GNU ld didn't support --whole-archive et. al. - if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then - whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' - else - whole_archive_flag_spec= - fi - supports_anon_versioning=no - case `$LD -v 2>&1` in - *GNU\ gold*) supports_anon_versioning=yes ;; - *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 - *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... - *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... - *\ 2.11.*) ;; # other 2.11 versions - *) supports_anon_versioning=yes ;; - esac - # See if GNU ld supports shared libraries. - case $host_os in - aix[3-9]*) - # On AIX/PPC, the GNU linker is very broken - if test "$host_cpu" != ia64; then - ld_shlibs=no - cat <<_LT_EOF 1>&2 -*** Warning: the GNU linker, at least up to release 2.19, is reported -*** to be unable to reliably create shared libraries on AIX. -*** Therefore, libtool is disabling shared libraries support. If you -*** really care for shared libraries, you may want to install binutils -*** 2.20 or above, or modify your PATH so that a non-GNU linker is found. -*** You will then need to restart the configuration process. -_LT_EOF - fi - ;; - amigaos*) - case $host_cpu in - powerpc) - # see comment about AmigaOS4 .so support - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='' - ;; - m68k) - archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' - hardcode_libdir_flag_spec='-L$libdir' - hardcode_minus_L=yes - ;; - esac - ;; - beos*) - if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - allow_undefined_flag=unsupported - # Joseph Beckenbach says some releases of gcc - # support --undefined. This deserves some investigation. FIXME - archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - else - ld_shlibs=no - fi + # Check whether --enable-static was given. +if test ${enable_static+y} +then : + enableval=$enable_static; p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS=$lt_save_ifs ;; + esac +else $as_nop + enable_static=yes +fi - cygwin* | mingw* | pw32* | cegcc*) - # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, - # as there is no search path for DLLs. - hardcode_libdir_flag_spec='-L$libdir' - export_dynamic_flag_spec='${wl}--export-all-symbols' - allow_undefined_flag=unsupported - always_export_symbols=no - enable_shared_with_static_runtimes=yes - export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' - exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' - if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - # If the export-symbols file already is a .def file (1st line - # is EXPORTS), use it as is; otherwise, prepend... - archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then - cp $export_symbols $output_objdir/$soname.def; - else - echo EXPORTS > $output_objdir/$soname.def; - cat $export_symbols >> $output_objdir/$soname.def; - fi~ - $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - else - ld_shlibs=no - fi - ;; - haiku*) - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - link_all_deplibs=yes - ;; - interix[3-9]*) - hardcode_direct=no - hardcode_shlibpath_var=no - hardcode_libdir_flag_spec='${wl}-rpath,$libdir' - export_dynamic_flag_spec='${wl}-E' - # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. - # Instead, shared libraries are loaded at an image base (0x10000000 by - # default) and relocated if they conflict, which is a slow very memory - # consuming and fragmenting process. To avoid this, we pick a random, - # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link - # time. Moving up from 0x10000000 also allows more sbrk(2) space. - archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - ;; - gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) - tmp_diet=no - if test "$host_os" = linux-dietlibc; then - case $cc_basename in - diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) - esac - fi - if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ - && test "$tmp_diet" = no - then - tmp_addflag=' $pic_flag' - tmp_sharedflag='-shared' - case $cc_basename,$host_cpu in - pgcc*) # Portland Group C compiler - whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' - tmp_addflag=' $pic_flag' - ;; - pgf77* | pgf90* | pgf95* | pgfortran*) - # Portland Group f77 and f90 compilers - whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' - tmp_addflag=' $pic_flag -Mnomain' ;; - ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 - tmp_addflag=' -i_dynamic' ;; - efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 - tmp_addflag=' -i_dynamic -nofor_main' ;; - ifc* | ifort*) # Intel Fortran compiler - tmp_addflag=' -nofor_main' ;; - lf95*) # Lahey Fortran 8.1 - whole_archive_flag_spec= - tmp_sharedflag='--shared' ;; - xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) - tmp_sharedflag='-qmkshrobj' - tmp_addflag= ;; - nvcc*) # Cuda Compiler Driver 2.2 - whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' - compiler_needs_object=yes - ;; - esac - case `$CC -V 2>&1 | sed 5q` in - *Sun\ C*) # Sun C 5.9 - whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' - compiler_needs_object=yes - tmp_sharedflag='-G' ;; - *Sun\ F*) # Sun Fortran 8.3 - tmp_sharedflag='-G' ;; - esac - archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - if test "x$supports_anon_versioning" = xyes; then - archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ - cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ - echo "local: *; };" >> $output_objdir/$libname.ver~ - $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' - fi - case $cc_basename in - xlf* | bgf* | bgxlf* | mpixlf*) - # IBM XL Fortran 10.1 on PPC cannot create shared libs itself - whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' - if test "x$supports_anon_versioning" = xyes; then - archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ - cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ - echo "local: *; };" >> $output_objdir/$libname.ver~ - $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' - fi - ;; - esac - else - ld_shlibs=no - fi - ;; - netbsd* | netbsdelf*-gnu) - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' - wlarc= - else - archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - fi - ;; - solaris*) - if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then - ld_shlibs=no - cat <<_LT_EOF 1>&2 -*** Warning: The releases 2.8.* of the GNU linker cannot reliably -*** create shared libraries on Solaris systems. Therefore, libtool -*** is disabling shared libraries support. We urge you to upgrade GNU -*** binutils to release 2.9.1 or newer. Another option is to modify -*** your PATH or compiler configuration so that the native linker is -*** used, and then restart. - -_LT_EOF - elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - else - ld_shlibs=no - fi +# Check whether --with-pic was given. +if test ${with_pic+y} +then : + withval=$with_pic; lt_p=${PACKAGE-default} + case $withval in + yes|no) pic_mode=$withval ;; + *) + pic_mode=default + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for lt_pkg in $withval; do + IFS=$lt_save_ifs + if test "X$lt_pkg" = "X$lt_p"; then + pic_mode=yes + fi + done + IFS=$lt_save_ifs ;; + esac +else $as_nop + pic_mode=default +fi + + + - sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) - case `$LD -v 2>&1` in - *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) - ld_shlibs=no - cat <<_LT_EOF 1>&2 -*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not -*** reliably create shared libraries on SCO systems. Therefore, libtool -*** is disabling shared libraries support. We urge you to upgrade GNU -*** binutils to release 2.16.91.0.3 or newer. Another option is to modify -*** your PATH or compiler configuration so that the native linker is -*** used, and then restart. -_LT_EOF - ;; - *) - # For security reasons, it is highly recommended that you always - # use absolute paths for naming shared libraries, and exclude the - # DT_RUNPATH tag from executables and libraries. But doing so - # requires that you compile everything twice, which is a pain. - if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - else - ld_shlibs=no - fi - ;; - esac - ;; - sunos4*) - archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' - wlarc= - hardcode_direct=yes - hardcode_shlibpath_var=no - ;; + # Check whether --enable-fast-install was given. +if test ${enable_fast_install+y} +then : + enableval=$enable_fast_install; p=${PACKAGE-default} + case $enableval in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; *) - if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - else - ld_shlibs=no - fi + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS=$lt_save_ifs ;; esac +else $as_nop + enable_fast_install=yes +fi - if test "$ld_shlibs" = no; then - runpath_var= - hardcode_libdir_flag_spec= - export_dynamic_flag_spec= - whole_archive_flag_spec= - fi - else - # PORTME fill in a description of your system's linker (not GNU ld) - case $host_os in - aix3*) - allow_undefined_flag=unsupported - always_export_symbols=yes - archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' - # Note: this linker hardcodes the directories in LIBPATH if there - # are no directories specified by -L. - hardcode_minus_L=yes - if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then - # Neither direct hardcoding nor static linking is supported with a - # broken collect2. - hardcode_direct=unsupported - fi + + + + + + + + shared_archive_member_spec= +case $host,$enable_shared in +power*-*-aix[5-9]*,yes) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking which variant of shared library versioning to provide" >&5 +printf %s "checking which variant of shared library versioning to provide... " >&6; } + +# Check whether --with-aix-soname was given. +if test ${with_aix_soname+y} +then : + withval=$with_aix_soname; case $withval in + aix|svr4|both) + ;; + *) + as_fn_error $? "Unknown argument to --with-aix-soname" "$LINENO" 5 ;; + esac + lt_cv_with_aix_soname=$with_aix_soname +else $as_nop + if test ${lt_cv_with_aix_soname+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_with_aix_soname=aix +fi + + with_aix_soname=$lt_cv_with_aix_soname +fi + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $with_aix_soname" >&5 +printf "%s\n" "$with_aix_soname" >&6; } + if test aix != "$with_aix_soname"; then + # For the AIX way of multilib, we name the shared archive member + # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o', + # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File. + # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag, + # the AIX toolchain works better with OBJECT_MODE set (default 32). + if test 64 = "${OBJECT_MODE-32}"; then + shared_archive_member_spec=shr_64 + else + shared_archive_member_spec=shr + fi + fi + ;; +*) + with_aix_soname=aix + ;; +esac - aix[4-9]*) - if test "$host_cpu" = ia64; then - # On IA64, the linker does run time linking by default, so we don't - # have to do anything special. - aix_use_runtimelinking=no - exp_sym_flag='-Bexport' - no_entry_flag="" - else - # If we're using GNU nm, then we don't want the "-C" option. - # -C means demangle to AIX nm, but means don't demangle with GNU nm - # Also, AIX nm treats weak defined symbols like other global - # defined symbols, whereas GNU nm marks them as "W". - if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then - export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' - else - export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' - fi - aix_use_runtimelinking=no - # Test if we are trying to use run time linking or normal - # AIX style linking. If -brtl is somewhere in LDFLAGS, we - # need to do runtime linking. - case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) - for ld_flag in $LDFLAGS; do - if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then - aix_use_runtimelinking=yes - break - fi - done - ;; - esac - exp_sym_flag='-bexport' - no_entry_flag='-bnoentry' - fi - # When large executables or shared objects are built, AIX ld can - # have problems creating the table of contents. If linking a library - # or program results in "error TOC overflow" add -mminimal-toc to - # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not - # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. - archive_cmds='' - hardcode_direct=yes - hardcode_direct_absolute=yes - hardcode_libdir_separator=':' - link_all_deplibs=yes - file_list_spec='${wl}-f,' - if test "$GCC" = yes; then - case $host_os in aix4.[012]|aix4.[012].*) - # We only want to do this on AIX 4.2 and lower, the check - # below for broken collect2 doesn't work under 4.3+ - collect2name=`${CC} -print-prog-name=collect2` - if test -f "$collect2name" && - strings "$collect2name" | $GREP resolve_lib_name >/dev/null - then - # We have reworked collect2 - : - else - # We have old collect2 - hardcode_direct=unsupported - # It fails to find uninstalled libraries when the uninstalled - # path is not listed in the libpath. Setting hardcode_minus_L - # to unsupported forces relinking - hardcode_minus_L=yes - hardcode_libdir_flag_spec='-L$libdir' - hardcode_libdir_separator= - fi - ;; - esac - shared_flag='-shared' - if test "$aix_use_runtimelinking" = yes; then - shared_flag="$shared_flag "'${wl}-G' - fi - link_all_deplibs=no - else - # not using gcc - if test "$host_cpu" = ia64; then - # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release - # chokes on -Wl,-G. The following line is correct: - shared_flag='-G' - else - if test "$aix_use_runtimelinking" = yes; then - shared_flag='${wl}-G' - else - shared_flag='${wl}-bM:SRE' - fi - fi - fi - export_dynamic_flag_spec='${wl}-bexpall' - # It seems that -bexpall does not export symbols beginning with - # underscore (_), so it is better to generate a list of symbols to export. - always_export_symbols=yes - if test "$aix_use_runtimelinking" = yes; then - # Warning - without using the other runtime loading flags (-brtl), - # -berok will link without error, but may produce a broken library. - allow_undefined_flag='-berok' - # Determine the default libpath from the value encoded in an - # empty executable. - if test "${lt_cv_aix_libpath+set}" = set; then - aix_libpath=$lt_cv_aix_libpath -else - if ${lt_cv_aix_libpath_+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -int -main () -{ - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - lt_aix_libpath_sed=' - /Import File Strings/,/^$/ { - /^0/ { - s/^0 *\([^ ]*\) *$/\1/ - p - } - }' - lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - # Check for a 64-bit object if we didn't find anything. - if test -z "$lt_cv_aix_libpath_"; then - lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - fi -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - if test -z "$lt_cv_aix_libpath_"; then - lt_cv_aix_libpath_="/usr/lib:/lib" - fi +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS=$ltmain -fi +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' - aix_libpath=$lt_cv_aix_libpath_ -fi - hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" - archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" - else - if test "$host_cpu" = ia64; then - hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' - allow_undefined_flag="-z nodefs" - archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" - else - # Determine the default libpath from the value encoded in an - # empty executable. - if test "${lt_cv_aix_libpath+set}" = set; then - aix_libpath=$lt_cv_aix_libpath -else - if ${lt_cv_aix_libpath_+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -int -main () -{ - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - lt_aix_libpath_sed=' - /Import File Strings/,/^$/ { - /^0/ { - s/^0 *\([^ ]*\) *$/\1/ - p - } - }' - lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - # Check for a 64-bit object if we didn't find anything. - if test -z "$lt_cv_aix_libpath_"; then - lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - fi -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - if test -z "$lt_cv_aix_libpath_"; then - lt_cv_aix_libpath_="/usr/lib:/lib" - fi -fi - aix_libpath=$lt_cv_aix_libpath_ -fi - hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" - # Warning - without using the other run time loading flags, - # -berok will link without error, but may produce a broken library. - no_undefined_flag=' ${wl}-bernotok' - allow_undefined_flag=' ${wl}-berok' - if test "$with_gnu_ld" = yes; then - # We only use this code for GNU lds that support --whole-archive. - whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive' - else - # Exported symbols can be pulled into shared objects from archives - whole_archive_flag_spec='$convenience' - fi - archive_cmds_need_lc=yes - # This is similar to how AIX traditionally builds its shared libraries. - archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' - fi - fi - ;; - amigaos*) - case $host_cpu in - powerpc) - # see comment about AmigaOS4 .so support - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='' - ;; - m68k) - archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' - hardcode_libdir_flag_spec='-L$libdir' - hardcode_minus_L=yes - ;; - esac - ;; - bsdi[45]*) - export_dynamic_flag_spec=-rdynamic - ;; - cygwin* | mingw* | pw32* | cegcc*) - # When not using gcc, we currently assume that we are using - # Microsoft Visual C++. - # hardcode_libdir_flag_spec is actually meaningless, as there is - # no search path for DLLs. - case $cc_basename in - cl*) - # Native MSVC - hardcode_libdir_flag_spec=' ' - allow_undefined_flag=unsupported - always_export_symbols=yes - file_list_spec='@' - # Tell ltmain to make .lib files, not .a files. - libext=lib - # Tell ltmain to make .dll files, not .so files. - shrext_cmds=".dll" - # FIXME: Setting linknames here is a bad hack. - archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' - archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then - sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; - else - sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; - fi~ - $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ - linknames=' - # The linker will not automatically build a static lib if we build a DLL. - # _LT_TAGVAR(old_archive_from_new_cmds, )='true' - enable_shared_with_static_runtimes=yes - exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' - export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' - # Don't use ranlib - old_postinstall_cmds='chmod 644 $oldlib' - postlink_cmds='lt_outputfile="@OUTPUT@"~ - lt_tool_outputfile="@TOOL_OUTPUT@"~ - case $lt_outputfile in - *.exe|*.EXE) ;; - *) - lt_outputfile="$lt_outputfile.exe" - lt_tool_outputfile="$lt_tool_outputfile.exe" - ;; - esac~ - if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then - $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; - $RM "$lt_outputfile.manifest"; - fi' - ;; - *) - # Assume MSVC wrapper - hardcode_libdir_flag_spec=' ' - allow_undefined_flag=unsupported - # Tell ltmain to make .lib files, not .a files. - libext=lib - # Tell ltmain to make .dll files, not .so files. - shrext_cmds=".dll" - # FIXME: Setting linknames here is a bad hack. - archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' - # The linker will automatically build a .lib file if we build a DLL. - old_archive_from_new_cmds='true' - # FIXME: Should let the user specify the lib program. - old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' - enable_shared_with_static_runtimes=yes - ;; - esac - ;; - darwin* | rhapsody*) - archive_cmds_need_lc=no - hardcode_direct=no - hardcode_automatic=yes - hardcode_shlibpath_var=unsupported - if test "$lt_cv_ld_force_load" = "yes"; then - whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' - else - whole_archive_flag_spec='' - fi - link_all_deplibs=yes - allow_undefined_flag="$_lt_dar_allow_undefined" - case $cc_basename in - ifort*) _lt_dar_can_shared=yes ;; - *) _lt_dar_can_shared=$GCC ;; - esac - if test "$_lt_dar_can_shared" = "yes"; then - output_verbose_link_cmd=func_echo_all - archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" - module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" - archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" - module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" - else - ld_shlibs=no - fi - ;; - dgux*) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_libdir_flag_spec='-L$libdir' - hardcode_shlibpath_var=no - ;; - # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor - # support. Future versions do this automatically, but an explicit c++rt0.o - # does not break anything, and helps significantly (at the cost of a little - # extra space). - freebsd2.2*) - archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' - hardcode_libdir_flag_spec='-R$libdir' - hardcode_direct=yes - hardcode_shlibpath_var=no - ;; - # Unfortunately, older versions of FreeBSD 2 do not have this feature. - freebsd2.*) - archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct=yes - hardcode_minus_L=yes - hardcode_shlibpath_var=no - ;; - # FreeBSD 3 and greater uses gcc -shared to do shared libraries. - freebsd* | dragonfly*) - archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - hardcode_libdir_flag_spec='-R$libdir' - hardcode_direct=yes - hardcode_shlibpath_var=no - ;; - hpux9*) - if test "$GCC" = yes; then - archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - else - archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - fi - hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' - hardcode_libdir_separator=: - hardcode_direct=yes - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - hardcode_minus_L=yes - export_dynamic_flag_spec='${wl}-E' - ;; - hpux10*) - if test "$GCC" = yes && test "$with_gnu_ld" = no; then - archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' - else - archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' - fi - if test "$with_gnu_ld" = no; then - hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' - hardcode_libdir_separator=: - hardcode_direct=yes - hardcode_direct_absolute=yes - export_dynamic_flag_spec='${wl}-E' - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - hardcode_minus_L=yes - fi - ;; - hpux11*) - if test "$GCC" = yes && test "$with_gnu_ld" = no; then - case $host_cpu in - hppa*64*) - archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - ia64*) - archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' - ;; - *) - archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' - ;; - esac - else - case $host_cpu in - hppa*64*) - archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - ia64*) - archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' - ;; - *) - # Older versions of the 11.00 compiler do not understand -b yet - # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 -$as_echo_n "checking if $CC understands -b... " >&6; } -if ${lt_cv_prog_compiler__b+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler__b=no - save_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS -b" - echo "$lt_simple_link_test_code" > conftest.$ac_ext - if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then - # The linker can only warn and ignore the option if not recognized - # So say no if there are warnings - if test -s conftest.err; then - # Append any errors to the config.log. - cat conftest.err 1>&5 - $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if diff conftest.exp conftest.er2 >/dev/null; then - lt_cv_prog_compiler__b=yes - fi - else - lt_cv_prog_compiler__b=yes - fi - fi - $RM -r conftest* - LDFLAGS="$save_LDFLAGS" -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 -$as_echo "$lt_cv_prog_compiler__b" >&6; } -if test x"$lt_cv_prog_compiler__b" = xyes; then - archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' -else - archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' -fi - ;; - esac - fi - if test "$with_gnu_ld" = no; then - hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' - hardcode_libdir_separator=: - case $host_cpu in - hppa*64*|ia64*) - hardcode_direct=no - hardcode_shlibpath_var=no - ;; - *) - hardcode_direct=yes - hardcode_direct_absolute=yes - export_dynamic_flag_spec='${wl}-E' +test -z "$LN_S" && LN_S="ln -s" - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - hardcode_minus_L=yes - ;; - esac - fi - ;; - irix5* | irix6* | nonstopux*) - if test "$GCC" = yes; then - archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - # Try to use the -exported_symbol ld option, if it does not - # work, assume that -exports_file does not work either and - # implicitly export all symbols. - # This should be the same for all languages, so no per-tag cache variable. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 -$as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } -if ${lt_cv_irix_exported_symbol+:} false; then : - $as_echo_n "(cached) " >&6 -else - save_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -int foo (void) { return 0; } -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - lt_cv_irix_exported_symbol=yes -else - lt_cv_irix_exported_symbol=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - LDFLAGS="$save_LDFLAGS" -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 -$as_echo "$lt_cv_irix_exported_symbol" >&6; } - if test "$lt_cv_irix_exported_symbol" = yes; then - archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' - fi - else - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' - archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' - fi - archive_cmds_need_lc='no' - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator=: - inherit_rpath=yes - link_all_deplibs=yes - ;; - netbsd* | netbsdelf*-gnu) - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out - else - archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF - fi - hardcode_libdir_flag_spec='-R$libdir' - hardcode_direct=yes - hardcode_shlibpath_var=no - ;; - newsos6) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct=yes - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator=: - hardcode_shlibpath_var=no - ;; - *nto* | *qnx*) - ;; - openbsd*) - if test -f /usr/libexec/ld.so; then - hardcode_direct=yes - hardcode_shlibpath_var=no - hardcode_direct_absolute=yes - if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' - hardcode_libdir_flag_spec='${wl}-rpath,$libdir' - export_dynamic_flag_spec='${wl}-E' - else - case $host_os in - openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) - archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' - hardcode_libdir_flag_spec='-R$libdir' - ;; - *) - archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - hardcode_libdir_flag_spec='${wl}-rpath,$libdir' - ;; - esac - fi - else - ld_shlibs=no - fi - ;; - os2*) - hardcode_libdir_flag_spec='-L$libdir' - hardcode_minus_L=yes - allow_undefined_flag=unsupported - archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' - old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' - ;; - osf3*) - if test "$GCC" = yes; then - allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' - archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - else - allow_undefined_flag=' -expect_unresolved \*' - archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' - fi - archive_cmds_need_lc='no' - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator=: - ;; - osf4* | osf5*) # as osf3* with the addition of -msym flag - if test "$GCC" = yes; then - allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' - archive_cmds='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - else - allow_undefined_flag=' -expect_unresolved \*' - archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' - archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ - $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' - # Both c and cxx compiler support -rpath directly - hardcode_libdir_flag_spec='-rpath $libdir' - fi - archive_cmds_need_lc='no' - hardcode_libdir_separator=: - ;; - solaris*) - no_undefined_flag=' -z defs' - if test "$GCC" = yes; then - wlarc='${wl}' - archive_cmds='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' - else - case `$CC -V 2>&1` in - *"Compilers 5.0"*) - wlarc='' - archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' - archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' - ;; - *) - wlarc='${wl}' - archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' - ;; - esac - fi - hardcode_libdir_flag_spec='-R$libdir' - hardcode_shlibpath_var=no - case $host_os in - solaris2.[0-5] | solaris2.[0-5].*) ;; - *) - # The compiler driver will combine and reorder linker options, - # but understands `-z linker_flag'. GCC discards it without `$wl', - # but is careful enough not to reorder. - # Supported since Solaris 2.6 (maybe 2.5.1?) - if test "$GCC" = yes; then - whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' - else - whole_archive_flag_spec='-z allextract$convenience -z defaultextract' - fi - ;; - esac - link_all_deplibs=yes - ;; - sunos4*) - if test "x$host_vendor" = xsequent; then - # Use $CC to link under sequent, because it throws in some extra .o - # files that make .init and .fini sections work. - archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' - else - archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' - fi - hardcode_libdir_flag_spec='-L$libdir' - hardcode_direct=yes - hardcode_minus_L=yes - hardcode_shlibpath_var=no - ;; - sysv4) - case $host_vendor in - sni) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct=yes # is this really true??? - ;; - siemens) - ## LD is ld it makes a PLAMLIB - ## CC just makes a GrossModule. - archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' - reload_cmds='$CC -r -o $output$reload_objs' - hardcode_direct=no - ;; - motorola) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct=no #Motorola manual says yes, but my tests say they lie - ;; - esac - runpath_var='LD_RUN_PATH' - hardcode_shlibpath_var=no - ;; - sysv4.3*) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_shlibpath_var=no - export_dynamic_flag_spec='-Bexport' - ;; +if test -n "${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST +fi - sysv4*MP*) - if test -d /usr/nec; then - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_shlibpath_var=no - runpath_var=LD_RUN_PATH - hardcode_runpath_var=yes - ld_shlibs=yes - fi - ;; +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 +printf %s "checking for objdir... " >&6; } +if test ${lt_cv_objdir+y} +then : + printf %s "(cached) " >&6 +else $as_nop + rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs +fi +rmdir .libs 2>/dev/null +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 +printf "%s\n" "$lt_cv_objdir" >&6; } +objdir=$lt_cv_objdir - sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) - no_undefined_flag='${wl}-z,text' - archive_cmds_need_lc=no - hardcode_shlibpath_var=no - runpath_var='LD_RUN_PATH' - if test "$GCC" = yes; then - archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - else - archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - fi - ;; - sysv5* | sco3.2v5* | sco5v6*) - # Note: We can NOT use -z defs as we might desire, because we do not - # link with -lc, and that would cause any symbols used from libc to - # always be unresolved, which means just about no library would - # ever link correctly. If we're not using GNU ld we use -z text - # though, which does catch some bad symbols but isn't as heavy-handed - # as -z defs. - no_undefined_flag='${wl}-z,text' - allow_undefined_flag='${wl}-z,nodefs' - archive_cmds_need_lc=no - hardcode_shlibpath_var=no - hardcode_libdir_flag_spec='${wl}-R,$libdir' - hardcode_libdir_separator=':' - link_all_deplibs=yes - export_dynamic_flag_spec='${wl}-Bexport' - runpath_var='LD_RUN_PATH' - if test "$GCC" = yes; then - archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - else - archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - fi - ;; - uts4*) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_libdir_flag_spec='-L$libdir' - hardcode_shlibpath_var=no - ;; +printf "%s\n" "#define LT_OBJDIR \"$lt_cv_objdir/\"" >>confdefs.h - *) - ld_shlibs=no - ;; - esac - if test x$host_vendor = xsni; then - case $host in - sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) - export_dynamic_flag_spec='${wl}-Blargedynsym' - ;; - esac - fi - fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 -$as_echo "$ld_shlibs" >&6; } -test "$ld_shlibs" = no && can_build_shared=no -with_gnu_ld=$with_gnu_ld +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test set != "${COLLECT_NAMES+set}"; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac +# Global variables: +ofile=libtool +can_build_shared=yes +# All known linkers require a '.a' archive for static linking (except MSVC, +# which needs '.lib'). +libext=a +with_gnu_ld=$lt_cv_prog_gnu_ld +old_CC=$CC +old_CFLAGS=$CFLAGS +# Set sane defaults for various variables +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS +test -z "$LD" && LD=ld +test -z "$ac_objext" && ac_objext=o +func_cc_basename $compiler +cc_basename=$func_cc_basename_result +# Only perform the check for file, if the check method requires it +test -z "$MAGIC_CMD" && MAGIC_CMD=file +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 +printf %s "checking for ${ac_tool_prefix}file... " >&6; } +if test ${lt_cv_path_MAGIC_CMD+y} +then : + printf %s "(cached) " >&6 +else $as_nop + case $MAGIC_CMD in +[\\/*] | ?:[\\/]*) + lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD=$MAGIC_CMD + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" + for ac_dir in $ac_dummy; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/${ac_tool_prefix}file"; then + lt_cv_path_MAGIC_CMD=$ac_dir/"${ac_tool_prefix}file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD=$lt_cv_path_MAGIC_CMD + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS=$lt_save_ifs + MAGIC_CMD=$lt_save_MAGIC_CMD + ;; +esac +fi +MAGIC_CMD=$lt_cv_path_MAGIC_CMD +if test -n "$MAGIC_CMD"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 +printf "%s\n" "$MAGIC_CMD" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi -# -# Do we need to explicitly link libc? -# -case "x$archive_cmds_need_lc" in -x|xyes) - # Assume -lc should be added - archive_cmds_need_lc=yes - if test "$enable_shared" = yes && test "$GCC" = yes; then - case $archive_cmds in - *'~'*) - # FIXME: we may have to deal with multi-command sequences. - ;; - '$CC '*) - # Test whether the compiler implicitly links with -lc since on some - # systems, -lgcc has to come before -lc. If gcc already passes -lc - # to ld, don't add -lc before -lgcc. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 -$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } -if ${lt_cv_archive_cmds_need_lc+:} false; then : - $as_echo_n "(cached) " >&6 -else - $RM conftest* - echo "$lt_simple_compile_test_code" > conftest.$ac_ext +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for file" >&5 +printf %s "checking for file... " >&6; } +if test ${lt_cv_path_MAGIC_CMD+y} +then : + printf %s "(cached) " >&6 +else $as_nop + case $MAGIC_CMD in +[\\/*] | ?:[\\/]*) + lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD=$MAGIC_CMD + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" + for ac_dir in $ac_dummy; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/file"; then + lt_cv_path_MAGIC_CMD=$ac_dir/"file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD=$lt_cv_path_MAGIC_CMD + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } 2>conftest.err; then - soname=conftest - lib=conftest - libobjs=conftest.$ac_objext - deplibs= - wl=$lt_prog_compiler_wl - pic_flag=$lt_prog_compiler_pic - compiler_flags=-v - linker_flags=-v - verstring= - output_objdir=. - libname=conftest - lt_save_allow_undefined_flag=$allow_undefined_flag - allow_undefined_flag= - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 - (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - then - lt_cv_archive_cmds_need_lc=no - else - lt_cv_archive_cmds_need_lc=yes - fi - allow_undefined_flag=$lt_save_allow_undefined_flag - else - cat conftest.err 1>&5 - fi - $RM conftest* +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 -$as_echo "$lt_cv_archive_cmds_need_lc" >&6; } - archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc - ;; - esac - fi +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS=$lt_save_ifs + MAGIC_CMD=$lt_save_MAGIC_CMD ;; esac +fi +MAGIC_CMD=$lt_cv_path_MAGIC_CMD +if test -n "$MAGIC_CMD"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 +printf "%s\n" "$MAGIC_CMD" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + else + MAGIC_CMD=: + fi +fi + fi + ;; +esac +# Use C for the default configuration in the libtool script +lt_save_CC=$CC +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +# Source file extension for C test sources. +ac_ext=c +# Object file extension for compiled C test sources. +objext=o +objext=$objext +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;" +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}' @@ -11141,63 +11438,515 @@ esac +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} +# Allow CC to be a program name with arguments. +compiler=$CC +# Save the default compiler, since it gets overwritten when the other +# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. +compiler_DEFAULT=$CC +# save warnings/boilerplate of simple test code +ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* +ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +if test -n "$compiler"; then +lt_prog_compiler_no_builtin_flag= +if test yes = "$GCC"; then + case $cc_basename in + nvcc*) + lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; + *) + lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; + esac + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 +printf %s "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } +if test ${lt_cv_prog_compiler_rtti_exceptions+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_prog_compiler_rtti_exceptions=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="-fno-rtti -fno-exceptions" ## exclude from sc_useless_quotes_in_assignment + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_rtti_exceptions=yes + fi + fi + $RM conftest* +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 +printf "%s\n" "$lt_cv_prog_compiler_rtti_exceptions" >&6; } +if test yes = "$lt_cv_prog_compiler_rtti_exceptions"; then + lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" +else + : +fi +fi + lt_prog_compiler_wl= +lt_prog_compiler_pic= +lt_prog_compiler_static= + if test yes = "$GCC"; then + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_static='-static' + case $host_os in + aix*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + fi + lt_prog_compiler_pic='-fPIC' + ;; + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + lt_prog_compiler_pic='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the '-m68020' flag to GCC prevents building anything better, + # like '-m68040'. + lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + lt_prog_compiler_pic='-DDLL_EXPORT' + case $host_os in + os2*) + lt_prog_compiler_static='$wl-static' + ;; + esac + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic='-fno-common' + ;; + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + lt_prog_compiler_static= + ;; + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac + ;; + interix[3-9]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + lt_prog_compiler_can_build_shared=no + enable_shared=no + ;; + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic='-fPIC -shared' + ;; + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic=-Kconform_pic + fi + ;; + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac + case $cc_basename in + nvcc*) # Cuda Compiler Driver 2.2 + lt_prog_compiler_wl='-Xlinker ' + if test -n "$lt_prog_compiler_pic"; then + lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic" + fi + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + lt_prog_compiler_wl='-Wl,' + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + else + lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' + fi + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic='-fno-common' + case $cc_basename in + nagfor*) + # NAG Fortran compiler + lt_prog_compiler_wl='-Wl,-Wl,,' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + esac + ;; + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic='-DDLL_EXPORT' + case $host_os in + os2*) + lt_prog_compiler_static='$wl-static' + ;; + esac + ;; + hpux9* | hpux10* | hpux11*) + lt_prog_compiler_wl='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + lt_prog_compiler_static='$wl-a ${wl}archive' + ;; + irix5* | irix6* | nonstopux*) + lt_prog_compiler_wl='-Wl,' + # PIC (with -KPIC) is the default. + lt_prog_compiler_static='-non_shared' + ;; + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + # old Intel for x86_64, which still supported -KPIC. + ecc*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-static' + ;; + # flang / f18. f95 an alias for gfortran or flang on Debian + flang* | f18* | f95*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + # icc used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + icc* | ifort*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + # Lahey Fortran 8.1. + lf95*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='--shared' + lt_prog_compiler_static='--static' + ;; + nagfor*) + # NAG Fortran compiler + lt_prog_compiler_wl='-Wl,-Wl,,' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + tcc*) + # Fabrice Bellard et al's Tiny C Compiler + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fpic' + lt_prog_compiler_static='-Bstatic' + ;; + ccc*) + lt_prog_compiler_wl='-Wl,' + # All Alpha code is PIC. + lt_prog_compiler_static='-non_shared' + ;; + xl* | bgxl* | bgf* | mpixl*) + # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-qpic' + lt_prog_compiler_static='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='' + ;; + *Sun\ F* | *Sun*Fortran*) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='-Qoption ld ' + ;; + *Sun\ C*) + # Sun C 5.9 + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='-Wl,' + ;; + *Intel*\ [CF]*Compiler*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + *Portland\ Group*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fpic' + lt_prog_compiler_static='-Bstatic' + ;; + esac + ;; + esac + ;; + newsos6) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic='-fPIC -shared' + ;; + osf3* | osf4* | osf5*) + lt_prog_compiler_wl='-Wl,' + # All OSF/1 code is PIC. + lt_prog_compiler_static='-non_shared' + ;; + rdos*) + lt_prog_compiler_static='-non_shared' + ;; + solaris*) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + case $cc_basename in + f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) + lt_prog_compiler_wl='-Qoption ld ';; + *) + lt_prog_compiler_wl='-Wl,';; + esac + ;; + sunos4*) + lt_prog_compiler_wl='-Qoption ld ' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + sysv4 | sysv4.2uw2* | sysv4.3*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic='-Kconform_pic' + lt_prog_compiler_static='-Bstatic' + fi + ;; + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + unicos*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_can_build_shared=no + ;; + uts4*) + lt_prog_compiler_pic='-pic' + lt_prog_compiler_static='-Bstatic' + ;; + *) + lt_prog_compiler_can_build_shared=no + ;; + esac + fi +case $host_os in + # For platforms that do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic= + ;; + *) + lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" + ;; +esac +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 +printf %s "checking for $compiler option to produce PIC... " >&6; } +if test ${lt_cv_prog_compiler_pic+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_prog_compiler_pic=$lt_prog_compiler_pic +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 +printf "%s\n" "$lt_cv_prog_compiler_pic" >&6; } +lt_prog_compiler_pic=$lt_cv_prog_compiler_pic +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 +printf %s "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } +if test ${lt_cv_prog_compiler_pic_works+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_prog_compiler_pic_works=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic -DPIC" ## exclude from sc_useless_quotes_in_assignment + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_pic_works=yes + fi + fi + $RM conftest* +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 +printf "%s\n" "$lt_cv_prog_compiler_pic_works" >&6; } +if test yes = "$lt_cv_prog_compiler_pic_works"; then + case $lt_prog_compiler_pic in + "" | " "*) ;; + *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; + esac +else + lt_prog_compiler_pic= + lt_prog_compiler_can_build_shared=no +fi +fi @@ -11209,8 +11958,47 @@ esac +# +# Check to make sure the static flag actually works. +# +wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +printf %s "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } +if test ${lt_cv_prog_compiler_static_works+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_prog_compiler_static_works=no + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS $lt_tmp_static_flag" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_static_works=yes + fi + else + lt_cv_prog_compiler_static_works=yes + fi + fi + $RM -r conftest* + LDFLAGS=$save_LDFLAGS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 +printf "%s\n" "$lt_cv_prog_compiler_static_works" >&6; } +if test yes = "$lt_cv_prog_compiler_static_works"; then + : +else + lt_prog_compiler_static= +fi @@ -11218,874 +12006,1418 @@ esac + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if test ${lt_cv_prog_compiler_c_o+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_prog_compiler_c_o=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 +printf "%s\n" "$lt_cv_prog_compiler_c_o" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if test ${lt_cv_prog_compiler_c_o+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_prog_compiler_c_o=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 +printf "%s\n" "$lt_cv_prog_compiler_c_o" >&6; } +hard_links=nottested +if test no = "$lt_cv_prog_compiler_c_o" && test no != "$need_locks"; then + # do not overwrite the value of need_locks provided by the user + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 +printf %s "checking if we can lock with hard links... " >&6; } + hard_links=yes + $RM conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 +printf "%s\n" "$hard_links" >&6; } + if test no = "$hard_links"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5 +printf "%s\n" "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +printf %s "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + runpath_var= + allow_undefined_flag= + always_export_symbols=no + archive_cmds= + archive_expsym_cmds= + compiler_needs_object=no + enable_shared_with_static_runtimes=no + export_dynamic_flag_spec= + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + hardcode_automatic=no + hardcode_direct=no + hardcode_direct_absolute=no + hardcode_libdir_flag_spec= + hardcode_libdir_separator= + hardcode_minus_L=no + hardcode_shlibpath_var=unsupported + inherit_rpath=no + link_all_deplibs=unknown + module_cmds= + module_expsym_cmds= + old_archive_from_new_cmds= + old_archive_from_expsyms_cmds= + thread_safe_flag_spec= + whole_archive_flag_spec= + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + include_expsyms= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ' (' and ')$', so one must not match beginning or + # end of line. Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc', + # as well as any symbol that contains 'd'. + exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + # Exclude shared library initialization/finalization symbols. + extract_expsyms_cmds= + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test yes != "$GCC"; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd* | bitrig*) + with_gnu_ld=no + ;; + linux* | k*bsd*-gnu | gnu*) + link_all_deplibs=no + ;; + esac + ld_shlibs=yes + # On some targets, GNU ld is compatible enough with the native linker + # that we're better off using the native interface for both. + lt_use_gnu_ld_interface=no + if test yes = "$with_gnu_ld"; then + case $host_os in + aix*) + # The AIX port of GNU ld has always aspired to compatibility + # with the native linker. However, as the warning in the GNU ld + # block says, versions before 2.19.5* couldn't really create working + # shared libraries, regardless of the interface used. + case `$LD -v 2>&1` in + *\ \(GNU\ Binutils\)\ 2.19.5*) ;; + *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; + *\ \(GNU\ Binutils\)\ [3-9]*) ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + fi + if test yes = "$lt_use_gnu_ld_interface"; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='$wl' + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + export_dynamic_flag_spec='$wl--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' + else + whole_archive_flag_spec= + fi + supports_anon_versioning=no + case `$LD -v | $SED -e 's/(^)\+)\s\+//' 2>&1` in + *GNU\ gold*) supports_anon_versioning=yes ;; + *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + # See if GNU ld supports shared libraries. + case $host_os in + aix[3-9]*) + # On AIX/PPC, the GNU linker is very broken + if test ia64 != "$host_cpu"; then + ld_shlibs=no + cat <<_LT_EOF 1>&2 +*** Warning: the GNU linker, at least up to release 2.19, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to install binutils +*** 2.20 or above, or modify your PATH so that a non-GNU linker is found. +*** You will then need to restart the configuration process. +_LT_EOF + fi + ;; + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='' + ;; + m68k) + archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + ;; + esac + ;; + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + else + ld_shlibs=no + fi + ;; + cygwin* | mingw* | pw32* | cegcc*) + # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec='-L$libdir' + export_dynamic_flag_spec='$wl--export-all-symbols' + allow_undefined_flag=unsupported + always_export_symbols=no + enable_shared_with_static_runtimes=yes + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' + exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file, use it as + # is; otherwise, prepend EXPORTS... + archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + ld_shlibs=no + fi + ;; + haiku*) + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + link_all_deplibs=yes + ;; + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + allow_undefined_flag=unsupported + shrext_cmds=.dll + archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + enable_shared_with_static_runtimes=yes + ;; + interix[3-9]*) + hardcode_direct=no + hardcode_shlibpath_var=no + hardcode_libdir_flag_spec='$wl-rpath,$libdir' + export_dynamic_flag_spec='$wl-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + archive_expsym_cmds='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) + tmp_diet=no + if test linux-dietlibc = "$host_os"; then + case $cc_basename in + diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) + esac + fi + if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ + && test no = "$tmp_diet" + then + tmp_addflag=' $pic_flag' + tmp_sharedflag='-shared' + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group f77 and f90 compilers + whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + lf95*) # Lahey Fortran 8.1 + whole_archive_flag_spec= + tmp_sharedflag='--shared' ;; + nagfor*) # NAGFOR 5.3 + tmp_sharedflag='-Wl,-shared' ;; + xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) + tmp_sharedflag='-qmkshrobj' + tmp_addflag= ;; + nvcc*) # Cuda Compiler Driver 2.2 + whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + compiler_needs_object=yes + ;; + esac + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C 5.9 + whole_archive_flag_spec='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + compiler_needs_object=yes + tmp_sharedflag='-G' ;; + *Sun\ F*) # Sun Fortran 8.3 + tmp_sharedflag='-G' ;; + esac + archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + if test yes = "$supports_anon_versioning"; then + archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' + fi + case $cc_basename in + tcc*) + export_dynamic_flag_spec='-rdynamic' + ;; + xlf* | bgf* | bgxlf* | mpixlf*) + # IBM XL Fortran 10.1 on PPC cannot create shared libs itself + whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' + if test yes = "$supports_anon_versioning"; then + archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' + fi + ;; + esac + else + ld_shlibs=no + fi + ;; + netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + solaris*) + if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then + ld_shlibs=no + cat <<_LT_EOF 1>&2 +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. +_LT_EOF + elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) + ld_shlibs=no + cat <<_LT_EOF 1>&2 +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. +_LT_EOF + ;; + *) + # For security reasons, it is highly recommended that you always + # use absolute paths for naming shared libraries, and exclude the + # DT_RUNPATH tag from executables and libraries. But doing so + # requires that you compile everything twice, which is a pain. + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + ;; + sunos4*) + archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; - - - - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 -$as_echo_n "checking dynamic linker characteristics... " >&6; } - -if test "$GCC" = yes; then - case $host_os in - darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; - *) lt_awk_arg="/^libraries:/" ;; - esac - case $host_os in - mingw* | cegcc*) lt_sed_strip_eq="s,=\([A-Za-z]:\),\1,g" ;; - *) lt_sed_strip_eq="s,=/,/,g" ;; - esac - lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` - case $lt_search_path_spec in - *\;*) - # if the path contains ";" then we assume it to be the separator - # otherwise default to the standard path separator (i.e. ":") - it is - # assumed that no part of a normal pathname contains ";" but that should - # okay in the real world where ";" in dirpaths is itself problematic. - lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` - ;; - *) - lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` - ;; - esac - # Ok, now we have the path, separated by spaces, we can step through it - # and add multilib dir if necessary. - lt_tmp_lt_search_path_spec= - lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` - for lt_sys_path in $lt_search_path_spec; do - if test -d "$lt_sys_path/$lt_multi_os_dir"; then - lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" - else - test -d "$lt_sys_path" && \ - lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" - fi - done - lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' -BEGIN {RS=" "; FS="/|\n";} { - lt_foo=""; - lt_count=0; - for (lt_i = NF; lt_i > 0; lt_i--) { - if ($lt_i != "" && $lt_i != ".") { - if ($lt_i == "..") { - lt_count++; - } else { - if (lt_count == 0) { - lt_foo="/" $lt_i lt_foo; - } else { - lt_count--; - } - } - } - } - if (lt_foo != "") { lt_freq[lt_foo]++; } - if (lt_freq[lt_foo] == 1) { print lt_foo; } -}'` - # AWK program above erroneously prepends '/' to C:/dos/paths - # for these hosts. - case $host_os in - mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ - $SED 's,/\([A-Za-z]:\),\1,g'` ;; - esac - sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` -else - sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" -fi -library_names_spec= -libname_spec='lib$name' -soname_spec= -shrext_cmds=".so" -postinstall_cmds= -postuninstall_cmds= -finish_cmds= -finish_eval= -shlibpath_var= -shlibpath_overrides_runpath=unknown -version_type=none -dynamic_linker="$host_os ld.so" -sys_lib_dlsearch_path_spec="/lib /usr/lib" -need_lib_prefix=unknown -hardcode_into_libs=no - -# when you set need_version to no, make sure it does not cause -set_version -# flags to be left without arguments -need_version=unknown - -case $host_os in -aix3*) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' - shlibpath_var=LIBPATH - - # AIX 3 has no versioning support, so we append a major version to the name. - soname_spec='${libname}${release}${shared_ext}$major' - ;; - -aix[4-9]*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - hardcode_into_libs=yes - if test "$host_cpu" = ia64; then - # AIX 5 supports IA64 - library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - else - # With GCC up to 2.95.x, collect2 would create an import file - # for dependence libraries. The import file would start with - # the line `#! .'. This would cause the generated library to - # depend on `.', always an invalid library. This was fixed in - # development snapshots of GCC prior to 3.0. - case $host_os in - aix4 | aix4.[01] | aix4.[01].*) - if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' - echo ' yes ' - echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then - : + *) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else - can_build_shared=no + ld_shlibs=no fi ;; esac - # AIX (on Power*) has no versioning support, so currently we can not hardcode correct - # soname into executable. Probably we can add versioning support to - # collect2, so additional links can be useful in future. - if test "$aix_use_runtimelinking" = yes; then - # If using run time linking (on AIX 4.2 or later) use lib.so - # instead of lib.a to let people know that these are not - # typical AIX shared libraries. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - else - # We preserve .a as extension for shared libraries through AIX4.2 - # and later when we are not doing run time linking. - library_names_spec='${libname}${release}.a $libname.a' - soname_spec='${libname}${release}${shared_ext}$major' - fi - shlibpath_var=LIBPATH - fi - ;; -amigaos*) - case $host_cpu in - powerpc) - # Since July 2007 AmigaOS4 officially supports .so libraries. - # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - ;; - m68k) - library_names_spec='$libname.ixlibrary $libname.a' - # Create ${libname}_ixlibrary.a entries in /sys/libs. - finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' - ;; - esac - ;; + if test no = "$ld_shlibs"; then + runpath_var= + hardcode_libdir_flag_spec= + export_dynamic_flag_spec= + whole_archive_flag_spec= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + allow_undefined_flag=unsupported + always_export_symbols=yes + archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L=yes + if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct=unsupported + fi + ;; -beos*) - library_names_spec='${libname}${shared_ext}' - dynamic_linker="$host_os ld.so" - shlibpath_var=LIBRARY_PATH - ;; - -bsdi[45]*) - version_type=linux # correct to gnu/linux during the next big refactor - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' - shlibpath_var=LD_LIBRARY_PATH - sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" - sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" - # the default ld.so.conf also contains /usr/contrib/lib and - # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow - # libtool to hard-code these into programs - ;; - -cygwin* | mingw* | pw32* | cegcc*) - version_type=windows - shrext_cmds=".dll" - need_version=no - need_lib_prefix=no + aix[4-9]*) + if test ia64 = "$host_cpu"; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag= + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to GNU nm, but means don't demangle to AIX nm. + # Without the "-l" option, or with the "-B" option, AIX nm treats + # weak defined symbols like other global defined symbols, whereas + # GNU nm marks them as "W". + # While the 'weak' keyword is ignored in the Export File, we need + # it in the Import File for the 'aix-soname' feature, so we have + # to replace the "-B" option with "-P" for AIX nm. + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no - case $GCC,$cc_basename in - yes,*) - # gcc - library_names_spec='$libname.dll.a' - # DLL is installed to $(libdir)/../bin by postinstall_cmds - postinstall_cmds='base_file=`basename \${file}`~ - dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ - dldir=$destdir/`dirname \$dlpath`~ - test -d \$dldir || mkdir -p \$dldir~ - $install_prog $dir/$dlname \$dldir/$dlname~ - chmod a+x \$dldir/$dlname~ - if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then - eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; - fi' - postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ - dlpath=$dir/\$dldll~ - $RM \$dlpath' - shlibpath_overrides_runpath=yes + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # have runtime linking enabled, and use it for executables. + # For shared libraries, we enable/disable runtime linking + # depending on the kind of the shared library created - + # when "with_aix_soname,aix_use_runtimelinking" is: + # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables + # "aix,yes" lib.so shared, rtl:yes, for executables + # lib.a static archive + # "both,no" lib.so.V(shr.o) shared, rtl:yes + # lib.a(lib.so.V) shared, rtl:no, for executables + # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a(lib.so.V) shared, rtl:no + # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a static archive + case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) + for ld_flag in $LDFLAGS; do + if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then + aix_use_runtimelinking=yes + break + fi + done + if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then + # With aix-soname=svr4, we create the lib.so.V shared archives only, + # so we don't have lib.a shared libs to link our executables. + # We have to force runtime linking in this case. + aix_use_runtimelinking=yes + LDFLAGS="$LDFLAGS -Wl,-brtl" + fi + ;; + esac - case $host_os in - cygwin*) - # Cygwin DLLs use 'cyg' prefix rather than 'lib' - soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi - sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api" - ;; - mingw* | cegcc*) - # MinGW DLLs use traditional 'lib' prefix - soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - ;; - pw32*) - # pw32 DLLs use 'pw' prefix rather than 'lib' - library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - ;; - esac - dynamic_linker='Win32 ld.exe' - ;; + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. - *,cl*) - # Native MSVC - libname_spec='$name' - soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - library_names_spec='${libname}.dll.lib' + archive_cmds='' + hardcode_direct=yes + hardcode_direct_absolute=yes + hardcode_libdir_separator=':' + link_all_deplibs=yes + file_list_spec='$wl-f,' + case $with_aix_soname,$aix_use_runtimelinking in + aix,*) ;; # traditional, no import file + svr4,* | *,yes) # use import file + # The Import File defines what to hardcode. + hardcode_direct=no + hardcode_direct_absolute=no + ;; + esac - case $build_os in - mingw*) - sys_lib_search_path_spec= - lt_save_ifs=$IFS - IFS=';' - for lt_path in $LIB - do - IFS=$lt_save_ifs - # Let DOS variable expansion print the short 8.3 style file name. - lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` - sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" - done - IFS=$lt_save_ifs - # Convert to MSYS style. - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` - ;; - cygwin*) - # Convert to unix form, then to dos form, then back to unix form - # but this time dos style (no spaces!) so that the unix form looks - # like /cygdrive/c/PROGRA~1:/cygdr... - sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` - sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` - sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - ;; - *) - sys_lib_search_path_spec="$LIB" - if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then - # It is most probably a Windows format PATH. - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + if test yes = "$GCC"; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`$CC -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + hardcode_direct=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L=yes + hardcode_libdir_flag_spec='-L$libdir' + hardcode_libdir_separator= + fi + ;; + esac + shared_flag='-shared' + if test yes = "$aix_use_runtimelinking"; then + shared_flag="$shared_flag "'$wl-G' + fi + # Need to ensure runtime linking is disabled for the traditional + # shared library, or the linker may eventually find shared libraries + # /with/ Import File - we do not want to mix them. + shared_flag_aix='-shared' + shared_flag_svr4='-shared $wl-G' else - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + # not using gcc + if test ia64 = "$host_cpu"; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test yes = "$aix_use_runtimelinking"; then + shared_flag='$wl-G' + else + shared_flag='$wl-bM:SRE' + fi + shared_flag_aix='$wl-bM:SRE' + shared_flag_svr4='$wl-G' + fi fi - # FIXME: find the short name or the path components, as spaces are - # common. (e.g. "Program Files" -> "PROGRA~1") - ;; - esac - # DLL is installed to $(libdir)/../bin by postinstall_cmds - postinstall_cmds='base_file=`basename \${file}`~ - dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ - dldir=$destdir/`dirname \$dlpath`~ - test -d \$dldir || mkdir -p \$dldir~ - $install_prog $dir/$dlname \$dldir/$dlname' - postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ - dlpath=$dir/\$dldll~ - $RM \$dlpath' - shlibpath_overrides_runpath=yes - dynamic_linker='Win32 link.exe' - ;; + export_dynamic_flag_spec='$wl-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + always_export_symbols=yes + if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag='-berok' + # Determine the default libpath from the value encoded in an + # empty executable. + if test set = "${lt_cv_aix_libpath+set}"; then + aix_libpath=$lt_cv_aix_libpath +else + if test ${lt_cv_aix_libpath_+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ - *) - # Assume MSVC wrapper - library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' - dynamic_linker='Win32 ld.exe' - ;; - esac - # FIXME: first we should search . and the directory the executable is in - shlibpath_var=PATH - ;; +int +main (void) +{ -darwin* | rhapsody*) - dynamic_linker="$host_os dyld" - version_type=darwin - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' - soname_spec='${libname}${release}${major}$shared_ext' - shlibpath_overrides_runpath=yes - shlibpath_var=DYLD_LIBRARY_PATH - shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : - sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" - sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' - ;; + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=/usr/lib:/lib + fi -dgux*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - ;; +fi -freebsd* | dragonfly*) - # DragonFly does not have aout. When/if they implement a new - # versioning mechanism, adjust this. - if test -x /usr/bin/objformat; then - objformat=`/usr/bin/objformat` - else - case $host_os in - freebsd[23].*) objformat=aout ;; - *) objformat=elf ;; - esac - fi - version_type=freebsd-$objformat - case $version_type in - freebsd-elf*) - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' - need_version=no - need_lib_prefix=no - ;; - freebsd-*) - library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' - need_version=yes - ;; - esac - shlibpath_var=LD_LIBRARY_PATH - case $host_os in - freebsd2.*) - shlibpath_overrides_runpath=yes - ;; - freebsd3.[01]* | freebsdelf3.[01]*) - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ - freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - *) # from 4.6 on, and DragonFly - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - esac - ;; - -haiku*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - dynamic_linker="$host_os runtime_loader" - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LIBRARY_PATH - shlibpath_overrides_runpath=yes - sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' - hardcode_into_libs=yes - ;; - -hpux9* | hpux10* | hpux11*) - # Give a soname corresponding to the major version so that dld.sl refuses to - # link against other versions. - version_type=sunos - need_lib_prefix=no - need_version=no - case $host_cpu in - ia64*) - shrext_cmds='.so' - hardcode_into_libs=yes - dynamic_linker="$host_os dld.so" - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - if test "X$HPUX_IA64_MODE" = X32; then - sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" - else - sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" - fi - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - hppa*64*) - shrext_cmds='.sl' - hardcode_into_libs=yes - dynamic_linker="$host_os dld.sl" - shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - *) - shrext_cmds='.sl' - dynamic_linker="$host_os dld.sl" - shlibpath_var=SHLIB_PATH - shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - ;; - esac - # HP-UX runs *really* slowly unless shared libraries are mode 555, ... - postinstall_cmds='chmod 555 $lib' - # or fails outright, so override atomically: - install_override_mode=555 - ;; - -interix[3-9]*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; + aix_libpath=$lt_cv_aix_libpath_ +fi -irix5* | irix6* | nonstopux*) - case $host_os in - nonstopux*) version_type=nonstopux ;; - *) - if test "$lt_cv_prog_gnu_ld" = yes; then - version_type=linux # correct to gnu/linux during the next big refactor + hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath" + archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag + else + if test ia64 = "$host_cpu"; then + hardcode_libdir_flag_spec='$wl-R $libdir:/usr/lib:/lib' + allow_undefined_flag="-z nodefs" + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" else - version_type=irix - fi ;; - esac - need_lib_prefix=no - need_version=no - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' - case $host_os in - irix5* | nonstopux*) - libsuff= shlibsuff= - ;; - *) - case $LD in # libtool.m4 will add one of these switches to LD - *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") - libsuff= shlibsuff= libmagic=32-bit;; - *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") - libsuff=32 shlibsuff=N32 libmagic=N32;; - *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") - libsuff=64 shlibsuff=64 libmagic=64-bit;; - *) libsuff= shlibsuff= libmagic=never-match;; - esac - ;; - esac - shlibpath_var=LD_LIBRARY${shlibsuff}_PATH - shlibpath_overrides_runpath=no - sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" - sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" - hardcode_into_libs=yes - ;; - -# No shared lib support for Linux oldld, aout, or coff. -linux*oldld* | linux*aout* | linux*coff*) - dynamic_linker=no - ;; - -# This must be glibc/ELF. -linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - - # Some binutils ld are patched to set DT_RUNPATH - if ${lt_cv_shlibpath_overrides_runpath+:} false; then : - $as_echo_n "(cached) " >&6 + # Determine the default libpath from the value encoded in an + # empty executable. + if test set = "${lt_cv_aix_libpath+set}"; then + aix_libpath=$lt_cv_aix_libpath else - lt_cv_shlibpath_overrides_runpath=no - save_LDFLAGS=$LDFLAGS - save_libdir=$libdir - eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ - LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + if test ${lt_cv_aix_libpath_+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int -main () +main (void) { ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : - lt_cv_shlibpath_overrides_runpath=yes -fi -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - LDFLAGS=$save_LDFLAGS - libdir=$save_libdir +if ac_fn_c_try_link "$LINENO" +then : + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi fi - - shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath - - # This implies no fast_install, which is unacceptable. - # Some rework will be needed to allow for fast_install - # before this can be enabled. - hardcode_into_libs=yes - - # Append ld.so.conf contents to the search path - if test -f /etc/ld.so.conf; then - lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` - sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=/usr/lib:/lib fi - # We used to test for /lib/ld.so.1 and disable shared libraries on - # powerpc, because MkLinux only supported shared libraries with the - # GNU dynamic linker. Since this was broken with cross compilers, - # most powerpc-linux boxes support dynamic linking these days and - # people can always --disable-shared, the test was removed, and we - # assume the GNU/Linux dynamic linker is in use. - dynamic_linker='GNU/Linux ld.so' - ;; +fi -netbsdelf*-gnu) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - dynamic_linker='NetBSD ld.elf_so' - ;; + aix_libpath=$lt_cv_aix_libpath_ +fi -netbsd*) - version_type=sunos - need_lib_prefix=no - need_version=no - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - dynamic_linker='NetBSD (a.out) ld.so' - else - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - dynamic_linker='NetBSD ld.elf_so' - fi - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; + hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag=' $wl-bernotok' + allow_undefined_flag=' $wl-berok' + if test yes = "$with_gnu_ld"; then + # We only use this code for GNU lds that support --whole-archive. + whole_archive_flag_spec='$wl--whole-archive$convenience $wl--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec='$convenience' + fi + archive_cmds_need_lc=yes + archive_expsym_cmds='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' + # -brtl affects multiple linker settings, -berok does not and is overridden later + compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`' + if test svr4 != "$with_aix_soname"; then + # This is similar to how AIX traditionally builds its shared libraries. + archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' + fi + if test aix != "$with_aix_soname"; then + archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' + else + # used by -dlpreopen to get the symbols + archive_expsym_cmds="$archive_expsym_cmds"'~$MV $output_objdir/$realname.d/$soname $output_objdir' + fi + archive_expsym_cmds="$archive_expsym_cmds"'~$RM -r $output_objdir/$realname.d' + fi + fi + ;; -newsos6) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - ;; + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='' + ;; + m68k) + archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + ;; + esac + ;; -*nto* | *qnx*) - version_type=qnx - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - dynamic_linker='ldqnx.so' - ;; + bsdi[45]*) + export_dynamic_flag_spec=-rdynamic + ;; -openbsd*) - version_type=sunos - sys_lib_dlsearch_path_spec="/usr/lib" - need_lib_prefix=no - # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. - case $host_os in - openbsd3.3 | openbsd3.3.*) need_version=yes ;; - *) need_version=no ;; - esac - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - shlibpath_var=LD_LIBRARY_PATH - if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - case $host_os in - openbsd2.[89] | openbsd2.[89].*) - shlibpath_overrides_runpath=no - ;; - *) - shlibpath_overrides_runpath=yes + cygwin* | mingw* | pw32* | cegcc*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + case $cc_basename in + cl*) + # Native MSVC + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + always_export_symbols=yes + file_list_spec='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=.dll + # FIXME: Setting linknames here is a bad hack. + archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' + archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then + cp "$export_symbols" "$output_objdir/$soname.def"; + echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; + else + $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, )='true' + enable_shared_with_static_runtimes=yes + exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' + # Don't use ranlib + old_postinstall_cmds='chmod 644 $oldlib' + postlink_cmds='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile=$lt_outputfile.exe + lt_tool_outputfile=$lt_tool_outputfile.exe + ;; + esac~ + if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # Assume MSVC wrapper + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=.dll + # FIXME: Setting linknames here is a bad hack. + archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + old_archive_from_new_cmds='true' + # FIXME: Should let the user specify the lib program. + old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' + enable_shared_with_static_runtimes=yes ;; esac - else - shlibpath_overrides_runpath=yes - fi - ;; - -os2*) - libname_spec='$name' - shrext_cmds=".dll" - need_lib_prefix=no - library_names_spec='$libname${shared_ext} $libname.a' - dynamic_linker='OS/2 ld.exe' - shlibpath_var=LIBPATH - ;; + ;; -osf3* | osf4* | osf5*) - version_type=osf - need_lib_prefix=no - need_version=no - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" - sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" - ;; + darwin* | rhapsody*) -rdos*) - dynamic_linker=no - ;; -solaris*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - # ldd complains unless libraries are executable - postinstall_cmds='chmod +x $lib' - ;; + archive_cmds_need_lc=no + hardcode_direct=no + hardcode_automatic=yes + hardcode_shlibpath_var=unsupported + if test yes = "$lt_cv_ld_force_load"; then + whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' -sunos4*) - version_type=sunos - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - if test "$with_gnu_ld" = yes; then - need_lib_prefix=no + else + whole_archive_flag_spec='' fi - need_version=yes - ;; - -sysv4 | sysv4.3*) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - case $host_vendor in - sni) - shlibpath_overrides_runpath=no - need_lib_prefix=no - runpath_var=LD_RUN_PATH - ;; - siemens) - need_lib_prefix=no - ;; - motorola) - need_lib_prefix=no - need_version=no - shlibpath_overrides_runpath=no - sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' - ;; + link_all_deplibs=yes + allow_undefined_flag=$_lt_dar_allow_undefined + case $cc_basename in + ifort*|nagfor*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; esac - ;; - -sysv4*MP*) - if test -d /usr/nec ;then - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' - soname_spec='$libname${shared_ext}.$major' - shlibpath_var=LD_LIBRARY_PATH - fi - ;; + if test yes = "$_lt_dar_can_shared"; then + output_verbose_link_cmd=func_echo_all + archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" + module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" + archive_expsym_cmds="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" + module_expsym_cmds="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" -sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) - version_type=freebsd-elf - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - if test "$with_gnu_ld" = yes; then - sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else - sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' - case $host_os in - sco3.2v5*) - sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" - ;; - esac + ld_shlibs=no fi - sys_lib_dlsearch_path_spec='/usr/lib' - ;; - -tpf*) - # TPF is a cross-target only. Preferred cross-host = GNU/Linux. - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - -uts4*) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - -*) - dynamic_linker=no - ;; -esac -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 -$as_echo "$dynamic_linker" >&6; } -test "$dynamic_linker" = no && can_build_shared=no - -variables_saved_for_relink="PATH $shlibpath_var $runpath_var" -if test "$GCC" = yes; then - variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" -fi - -if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then - sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" -fi -if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then - sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" -fi - - - - - - - - - - - - - - - - - - - - - - - + ;; + dgux*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2.*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | dragonfly*) + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + hpux9*) + if test yes = "$GCC"; then + archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + else + archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + fi + hardcode_libdir_flag_spec='$wl+b $wl$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + export_dynamic_flag_spec='$wl-E' + ;; + hpux10*) + if test yes,no = "$GCC,$with_gnu_ld"; then + archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test no = "$with_gnu_ld"; then + hardcode_libdir_flag_spec='$wl+b $wl$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + hardcode_direct_absolute=yes + export_dynamic_flag_spec='$wl-E' + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + fi + ;; + hpux11*) + if test yes,no = "$GCC,$with_gnu_ld"; then + case $host_cpu in + hppa*64*) + archive_cmds='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + archive_cmds='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + # Older versions of the 11.00 compiler do not understand -b yet + # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 +printf %s "checking if $CC understands -b... " >&6; } +if test ${lt_cv_prog_compiler__b+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_prog_compiler__b=no + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS -b" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler__b=yes + fi + else + lt_cv_prog_compiler__b=yes + fi + fi + $RM -r conftest* + LDFLAGS=$save_LDFLAGS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 +printf "%s\n" "$lt_cv_prog_compiler__b" >&6; } +if test yes = "$lt_cv_prog_compiler__b"; then + archive_cmds='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' +else + archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' +fi + ;; + esac + fi + if test no = "$with_gnu_ld"; then + hardcode_libdir_flag_spec='$wl+b $wl$libdir' + hardcode_libdir_separator=: + case $host_cpu in + hppa*64*|ia64*) + hardcode_direct=no + hardcode_shlibpath_var=no + ;; + *) + hardcode_direct=yes + hardcode_direct_absolute=yes + export_dynamic_flag_spec='$wl-E' + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + ;; + esac + fi + ;; + irix5* | irix6* | nonstopux*) + if test yes = "$GCC"; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + # Try to use the -exported_symbol ld option, if it does not + # work, assume that -exports_file does not work either and + # implicitly export all symbols. + # This should be the same for all languages, so no per-tag cache variable. + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 +printf %s "checking whether the $host_os linker accepts -exported_symbol... " >&6; } +if test ${lt_cv_irix_exported_symbol+y} +then : + printf %s "(cached) " >&6 +else $as_nop + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int foo (void) { return 0; } +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + lt_cv_irix_exported_symbol=yes +else $as_nop + lt_cv_irix_exported_symbol=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 +printf "%s\n" "$lt_cv_irix_exported_symbol" >&6; } + if test yes = "$lt_cv_irix_exported_symbol"; then + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib' + fi + link_all_deplibs=no + else + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib' + fi + archive_cmds_need_lc='no' + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + hardcode_libdir_separator=: + inherit_rpath=yes + link_all_deplibs=yes + ;; + linux*) + case $cc_basename in + tcc*) + # Fabrice Bellard et al's Tiny C Compiler + ld_shlibs=yes + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + newsos6) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + hardcode_libdir_separator=: + hardcode_shlibpath_var=no + ;; + *nto* | *qnx*) + ;; + openbsd* | bitrig*) + if test -f /usr/libexec/ld.so; then + hardcode_direct=yes + hardcode_shlibpath_var=no + hardcode_direct_absolute=yes + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols' + hardcode_libdir_flag_spec='$wl-rpath,$libdir' + export_dynamic_flag_spec='$wl-E' + else + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='$wl-rpath,$libdir' + fi + else + ld_shlibs=no + fi + ;; + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + allow_undefined_flag=unsupported + shrext_cmds=.dll + archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + enable_shared_with_static_runtimes=yes + ;; + osf3*) + if test yes = "$GCC"; then + allow_undefined_flag=' $wl-expect_unresolved $wl\*' + archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + fi + archive_cmds_need_lc='no' + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + hardcode_libdir_separator=: + ;; + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test yes = "$GCC"; then + allow_undefined_flag=' $wl-expect_unresolved $wl\*' + archive_cmds='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp' + # Both c and cxx compiler support -rpath directly + hardcode_libdir_flag_spec='-rpath $libdir' + fi + archive_cmds_need_lc='no' + hardcode_libdir_separator=: + ;; + solaris*) + no_undefined_flag=' -z defs' + if test yes = "$GCC"; then + wlarc='$wl' + archive_cmds='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + else + case `$CC -V 2>&1` in + *"Compilers 5.0"*) + wlarc='' + archive_cmds='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' + ;; + *) + wlarc='$wl' + archive_cmds='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + ;; + esac + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_shlibpath_var=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands '-z linker_flag'. GCC discards it without '$wl', + # but is careful enough not to reorder. + # Supported since Solaris 2.6 (maybe 2.5.1?) + if test yes = "$GCC"; then + whole_archive_flag_spec='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' + else + whole_archive_flag_spec='-z allextract$convenience -z defaultextract' + fi + ;; + esac + link_all_deplibs=yes + ;; + sunos4*) + if test sequent = "$host_vendor"; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + archive_cmds='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + hardcode_libdir_flag_spec='-L$libdir' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + sysv4) + case $host_vendor in + sni) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' + reload_cmds='$CC -r -o $output$reload_objs' + hardcode_direct=no + ;; + motorola) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var=no + ;; + sysv4.3*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + export_dynamic_flag_spec='-Bexport' + ;; + sysv4*MP*) + if test -d /usr/nec; then + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ld_shlibs=yes + fi + ;; + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) + no_undefined_flag='$wl-z,text' + archive_cmds_need_lc=no + hardcode_shlibpath_var=no + runpath_var='LD_RUN_PATH' + if test yes = "$GCC"; then + archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + sysv5* | sco3.2v5* | sco5v6*) + # Note: We CANNOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + no_undefined_flag='$wl-z,text' + allow_undefined_flag='$wl-z,nodefs' + archive_cmds_need_lc=no + hardcode_shlibpath_var=no + hardcode_libdir_flag_spec='$wl-R,$libdir' + hardcode_libdir_separator=':' + link_all_deplibs=yes + export_dynamic_flag_spec='$wl-Bexport' + runpath_var='LD_RUN_PATH' + if test yes = "$GCC"; then + archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + uts4*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + *) + ld_shlibs=no + ;; + esac + if test sni = "$host_vendor"; then + case $host in + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + export_dynamic_flag_spec='$wl-Blargedynsym' + ;; + esac + fi + fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 +printf "%s\n" "$ld_shlibs" >&6; } +test no = "$ld_shlibs" && can_build_shared=no +with_gnu_ld=$with_gnu_ld @@ -12101,9 +13433,75 @@ fi +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc=yes + if test yes,yes = "$GCC,$enable_shared"; then + case $archive_cmds in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 +printf %s "checking whether -lc should be explicitly linked in... " >&6; } +if test ${lt_cv_archive_cmds_need_lc+y} +then : + printf %s "(cached) " >&6 +else $as_nop + $RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl + pic_flag=$lt_prog_compiler_pic + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag + allow_undefined_flag= + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 + (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + then + lt_cv_archive_cmds_need_lc=no + else + lt_cv_archive_cmds_need_lc=yes + fi + allow_undefined_flag=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 +printf "%s\n" "$lt_cv_archive_cmds_need_lc" >&6; } + archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc + ;; + esac + fi + ;; +esac @@ -12116,552 +13514,67 @@ fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 -$as_echo_n "checking how to hardcode library paths into programs... " >&6; } -hardcode_action= -if test -n "$hardcode_libdir_flag_spec" || - test -n "$runpath_var" || - test "X$hardcode_automatic" = "Xyes" ; then - # We can hardcode non-existent directories. - if test "$hardcode_direct" != no && - # If the only mechanism to avoid hardcoding is shlibpath_var, we - # have to relink, otherwise we might link with an installed library - # when we should be linking with a yet-to-be-installed one - ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no && - test "$hardcode_minus_L" != no; then - # Linking always hardcodes the temporary library directory. - hardcode_action=relink - else - # We can link without hardcoding, and we can hardcode nonexisting dirs. - hardcode_action=immediate - fi -else - # We cannot hardcode anything, or else we can only hardcode existing - # directories. - hardcode_action=unsupported -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 -$as_echo "$hardcode_action" >&6; } -if test "$hardcode_action" = relink || - test "$inherit_rpath" = yes; then - # Fast installation is not supported - enable_fast_install=no -elif test "$shlibpath_overrides_runpath" = yes || - test "$enable_shared" = no; then - # Fast installation is not necessary - enable_fast_install=needless -fi - if test "x$enable_dlopen" != xyes; then - enable_dlopen=unknown - enable_dlopen_self=unknown - enable_dlopen_self_static=unknown -else - lt_cv_dlopen=no - lt_cv_dlopen_libs= - case $host_os in - beos*) - lt_cv_dlopen="load_add_on" - lt_cv_dlopen_libs= - lt_cv_dlopen_self=yes - ;; - mingw* | pw32* | cegcc*) - lt_cv_dlopen="LoadLibrary" - lt_cv_dlopen_libs= - ;; - cygwin*) - lt_cv_dlopen="dlopen" - lt_cv_dlopen_libs= - ;; - darwin*) - # if libdl is installed we need to link against it - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 -$as_echo_n "checking for dlopen in -ldl... " >&6; } -if ${ac_cv_lib_dl_dlopen+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldl $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char dlopen (); -int -main () -{ -return dlopen (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_dl_dlopen=yes -else - ac_cv_lib_dl_dlopen=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 -$as_echo "$ac_cv_lib_dl_dlopen" >&6; } -if test "x$ac_cv_lib_dl_dlopen" = xyes; then : - lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" -else - lt_cv_dlopen="dyld" - lt_cv_dlopen_libs= - lt_cv_dlopen_self=yes -fi - ;; - *) - ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" -if test "x$ac_cv_func_shl_load" = xyes; then : - lt_cv_dlopen="shl_load" -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 -$as_echo_n "checking for shl_load in -ldld... " >&6; } -if ${ac_cv_lib_dld_shl_load+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldld $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char shl_load (); -int -main () -{ -return shl_load (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_dld_shl_load=yes -else - ac_cv_lib_dld_shl_load=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 -$as_echo "$ac_cv_lib_dld_shl_load" >&6; } -if test "x$ac_cv_lib_dld_shl_load" = xyes; then : - lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld" -else - ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" -if test "x$ac_cv_func_dlopen" = xyes; then : - lt_cv_dlopen="dlopen" -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 -$as_echo_n "checking for dlopen in -ldl... " >&6; } -if ${ac_cv_lib_dl_dlopen+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldl $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char dlopen (); -int -main () -{ -return dlopen (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_dl_dlopen=yes -else - ac_cv_lib_dl_dlopen=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 -$as_echo "$ac_cv_lib_dl_dlopen" >&6; } -if test "x$ac_cv_lib_dl_dlopen" = xyes; then : - lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 -$as_echo_n "checking for dlopen in -lsvld... " >&6; } -if ${ac_cv_lib_svld_dlopen+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lsvld $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char dlopen (); -int -main () -{ -return dlopen (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_svld_dlopen=yes -else - ac_cv_lib_svld_dlopen=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 -$as_echo "$ac_cv_lib_svld_dlopen" >&6; } -if test "x$ac_cv_lib_svld_dlopen" = xyes; then : - lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 -$as_echo_n "checking for dld_link in -ldld... " >&6; } -if ${ac_cv_lib_dld_dld_link+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldld $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char dld_link (); -int -main () -{ -return dld_link (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_dld_dld_link=yes -else - ac_cv_lib_dld_dld_link=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 -$as_echo "$ac_cv_lib_dld_dld_link" >&6; } -if test "x$ac_cv_lib_dld_dld_link" = xyes; then : - lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld" -fi -fi -fi -fi -fi -fi - ;; - esac - if test "x$lt_cv_dlopen" != xno; then - enable_dlopen=yes - else - enable_dlopen=no - fi - case $lt_cv_dlopen in - dlopen) - save_CPPFLAGS="$CPPFLAGS" - test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" - save_LDFLAGS="$LDFLAGS" - wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" - save_LIBS="$LIBS" - LIBS="$lt_cv_dlopen_libs $LIBS" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 -$as_echo_n "checking whether a program can dlopen itself... " >&6; } -if ${lt_cv_dlopen_self+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test "$cross_compiling" = yes; then : - lt_cv_dlopen_self=cross -else - lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 - lt_status=$lt_dlunknown - cat > conftest.$ac_ext <<_LT_EOF -#line $LINENO "configure" -#include "confdefs.h" -#if HAVE_DLFCN_H -#include -#endif -#include -#ifdef RTLD_GLOBAL -# define LT_DLGLOBAL RTLD_GLOBAL -#else -# ifdef DL_GLOBAL -# define LT_DLGLOBAL DL_GLOBAL -# else -# define LT_DLGLOBAL 0 -# endif -#endif -/* We may have to define LT_DLLAZY_OR_NOW in the command line if we - find out it does not work in some platform. */ -#ifndef LT_DLLAZY_OR_NOW -# ifdef RTLD_LAZY -# define LT_DLLAZY_OR_NOW RTLD_LAZY -# else -# ifdef DL_LAZY -# define LT_DLLAZY_OR_NOW DL_LAZY -# else -# ifdef RTLD_NOW -# define LT_DLLAZY_OR_NOW RTLD_NOW -# else -# ifdef DL_NOW -# define LT_DLLAZY_OR_NOW DL_NOW -# else -# define LT_DLLAZY_OR_NOW 0 -# endif -# endif -# endif -# endif -#endif -/* When -fvisbility=hidden is used, assume the code has been annotated - correspondingly for the symbols needed. */ -#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) -int fnord () __attribute__((visibility("default"))); -#endif -int fnord () { return 42; } -int main () -{ - void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); - int status = $lt_dlunknown; - if (self) - { - if (dlsym (self,"fnord")) status = $lt_dlno_uscore; - else - { - if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; - else puts (dlerror ()); - } - /* dlclose (self); */ - } - else - puts (dlerror ()); - return status; -} -_LT_EOF - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 - (eval $ac_link) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then - (./conftest; exit; ) >&5 2>/dev/null - lt_status=$? - case x$lt_status in - x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; - x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; - x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; - esac - else : - # compilation failed - lt_cv_dlopen_self=no - fi -fi -rm -fr conftest* -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 -$as_echo "$lt_cv_dlopen_self" >&6; } - if test "x$lt_cv_dlopen_self" = xyes; then - wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 -$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } -if ${lt_cv_dlopen_self_static+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test "$cross_compiling" = yes; then : - lt_cv_dlopen_self_static=cross -else - lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 - lt_status=$lt_dlunknown - cat > conftest.$ac_ext <<_LT_EOF -#line $LINENO "configure" -#include "confdefs.h" -#if HAVE_DLFCN_H -#include -#endif -#include -#ifdef RTLD_GLOBAL -# define LT_DLGLOBAL RTLD_GLOBAL -#else -# ifdef DL_GLOBAL -# define LT_DLGLOBAL DL_GLOBAL -# else -# define LT_DLGLOBAL 0 -# endif -#endif -/* We may have to define LT_DLLAZY_OR_NOW in the command line if we - find out it does not work in some platform. */ -#ifndef LT_DLLAZY_OR_NOW -# ifdef RTLD_LAZY -# define LT_DLLAZY_OR_NOW RTLD_LAZY -# else -# ifdef DL_LAZY -# define LT_DLLAZY_OR_NOW DL_LAZY -# else -# ifdef RTLD_NOW -# define LT_DLLAZY_OR_NOW RTLD_NOW -# else -# ifdef DL_NOW -# define LT_DLLAZY_OR_NOW DL_NOW -# else -# define LT_DLLAZY_OR_NOW 0 -# endif -# endif -# endif -# endif -#endif -/* When -fvisbility=hidden is used, assume the code has been annotated - correspondingly for the symbols needed. */ -#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) -int fnord () __attribute__((visibility("default"))); -#endif -int fnord () { return 42; } -int main () -{ - void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); - int status = $lt_dlunknown; - if (self) - { - if (dlsym (self,"fnord")) status = $lt_dlno_uscore; - else - { - if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; - else puts (dlerror ()); - } - /* dlclose (self); */ - } - else - puts (dlerror ()); - return status; -} -_LT_EOF - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 - (eval $ac_link) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then - (./conftest; exit; ) >&5 2>/dev/null - lt_status=$? - case x$lt_status in - x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; - x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; - x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; - esac - else : - # compilation failed - lt_cv_dlopen_self_static=no - fi -fi -rm -fr conftest* -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 -$as_echo "$lt_cv_dlopen_self_static" >&6; } - fi - CPPFLAGS="$save_CPPFLAGS" - LDFLAGS="$save_LDFLAGS" - LIBS="$save_LIBS" - ;; - esac - case $lt_cv_dlopen_self in - yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; - *) enable_dlopen_self=unknown ;; - esac - case $lt_cv_dlopen_self_static in - yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; - *) enable_dlopen_self_static=unknown ;; - esac -fi @@ -12679,35 +13592,6 @@ fi -striplib= -old_striplib= -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 -$as_echo_n "checking whether stripping libraries is possible... " >&6; } -if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then - test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" - test -z "$striplib" && striplib="$STRIP --strip-unneeded" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -else -# FIXME - insert some real tests, host_os isn't really good enough - case $host_os in - darwin*) - if test -n "$STRIP" ; then - striplib="$STRIP -x" - old_striplib="$STRIP -S" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - fi - ;; - *) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - ;; - esac -fi @@ -12720,54 +13604,15 @@ fi - # Report which library types will actually be built - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 -$as_echo_n "checking if libtool supports shared libraries... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 -$as_echo "$can_build_shared" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 -$as_echo_n "checking whether to build shared libraries... " >&6; } - test "$can_build_shared" = "no" && enable_shared=no - # On AIX, shared libraries and static libraries use the same namespace, and - # are all built from PIC. - case $host_os in - aix3*) - test "$enable_shared" = yes && enable_static=no - if test -n "$RANLIB"; then - archive_cmds="$archive_cmds~\$RANLIB \$lib" - postinstall_cmds='$RANLIB $lib' - fi - ;; - aix[4-9]*) - if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then - test "$enable_shared" = yes && enable_static=no - fi - ;; - esac - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 -$as_echo "$enable_shared" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 -$as_echo_n "checking whether to build static libraries... " >&6; } - # Make sure either enable_shared or enable_static is yes. - test "$enable_shared" = yes || enable_static=yes - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 -$as_echo "$enable_static" >&6; } -fi -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu -CC="$lt_save_CC" @@ -12783,648 +13628,7460 @@ CC="$lt_save_CC" - ac_config_commands="$ac_config_commands libtool" -# Only expand once: - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5 -$as_echo_n "checking whether byte ordering is bigendian... " >&6; } -if ${ac_cv_c_bigendian+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_cv_c_bigendian=unknown - # See if we're dealing with a universal compiler. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#ifndef __APPLE_CC__ - not a universal capable compiler - #endif - typedef int dummy; -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - # Check for potential -arch flags. It is not universal unless - # there are at least two -arch flags with different values. - ac_arch= - ac_prev= - for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do - if test -n "$ac_prev"; then - case $ac_word in - i?86 | x86_64 | ppc | ppc64) - if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then - ac_arch=$ac_word - else - ac_cv_c_bigendian=universal - break - fi - ;; - esac - ac_prev= - elif test "x$ac_word" = "x-arch"; then - ac_prev=arch - fi - done -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - if test $ac_cv_c_bigendian = unknown; then - # See if sys/param.h defines the BYTE_ORDER macro. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include - #include -int -main () -{ -#if ! (defined BYTE_ORDER && defined BIG_ENDIAN \ - && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \ - && LITTLE_ENDIAN) - bogus endian macros - #endif - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - # It does; now see whether it defined to BIG_ENDIAN or not. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include - #include -int -main () -{ -#if BYTE_ORDER != BIG_ENDIAN - not big endian - #endif - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_c_bigendian=yes -else - ac_cv_c_bigendian=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - fi - if test $ac_cv_c_bigendian = unknown; then - # See if defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris). - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -int -main () -{ -#if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN) - bogus endian macros - #endif - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - # It does; now see whether it defined to _BIG_ENDIAN or not. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -int -main () -{ -#ifndef _BIG_ENDIAN - not big endian - #endif - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_c_bigendian=yes -else - ac_cv_c_bigendian=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - fi - if test $ac_cv_c_bigendian = unknown; then - # Compile a test program. - if test "$cross_compiling" = yes; then : - # Try to guess by grepping values from an object file. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -short int ascii_mm[] = - { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; - short int ascii_ii[] = - { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; - int use_ascii (int i) { - return ascii_mm[i] + ascii_ii[i]; - } - short int ebcdic_ii[] = - { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; - short int ebcdic_mm[] = - { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; - int use_ebcdic (int i) { - return ebcdic_mm[i] + ebcdic_ii[i]; - } - extern int foo; -int -main () -{ -return use_ascii (foo) == use_ebcdic (foo); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then - ac_cv_c_bigendian=yes - fi - if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then - if test "$ac_cv_c_bigendian" = unknown; then - ac_cv_c_bigendian=no - else - # finding both strings is unlikely to happen, but who knows? - ac_cv_c_bigendian=unknown - fi - fi -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ - /* Are we little or big endian? From Harbison&Steele. */ - union - { - long int l; - char c[sizeof (long int)]; - } u; - u.l = 1; - return u.c[sizeof (long int) - 1] == 1; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - ac_cv_c_bigendian=no -else - ac_cv_c_bigendian=yes -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5 -$as_echo "$ac_cv_c_bigendian" >&6; } - case $ac_cv_c_bigendian in #( - yes) - $as_echo "#define WORDS_BIGENDIAN 1" >>confdefs.h -;; #( - no) - ;; #( - universal) -$as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h - ;; #( - *) - as_fn_error $? "unknown endianness - presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;; - esac -# Check whether --enable-largefile was given. -if test "${enable_largefile+set}" = set; then : - enableval=$enable_largefile; -fi -if test "$enable_largefile" != no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for special C compiler options needed for large files" >&5 -$as_echo_n "checking for special C compiler options needed for large files... " >&6; } -if ${ac_cv_sys_largefile_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_cv_sys_largefile_CC=no - if test "$GCC" != yes; then - ac_save_CC=$CC - while :; do - # IRIX 6.2 and later do not support large files by default, - # so use the C compiler's -n32 option if that helps. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include - /* Check that off_t can represent 2**63 - 1 correctly. - We can't simply define LARGE_OFF_T to be 9223372036854775807, - since some C++ compilers masquerading as C compilers - incorrectly reject 9223372036854775807. */ -#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) - int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 - && LARGE_OFF_T % 2147483647 == 1) - ? 1 : -1]; -int -main () -{ + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 +printf %s "checking dynamic linker characteristics... " >&6; } - ; - return 0; -} -_ACEOF - if ac_fn_c_try_compile "$LINENO"; then : - break -fi -rm -f core conftest.err conftest.$ac_objext - CC="$CC -n32" - if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_sys_largefile_CC=' -n32'; break -fi -rm -f core conftest.err conftest.$ac_objext - break - done - CC=$ac_save_CC - rm -f conftest.$ac_ext +if test yes = "$GCC"; then + case $host_os in + darwin*) lt_awk_arg='/^libraries:/,/LR/' ;; + *) lt_awk_arg='/^libraries:/' ;; + esac + case $host_os in + mingw* | cegcc*) lt_sed_strip_eq='s|=\([A-Za-z]:\)|\1|g' ;; + *) lt_sed_strip_eq='s|=/|/|g' ;; + esac + lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` + case $lt_search_path_spec in + *\;*) + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` + ;; + *) + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` + ;; + esac + # Ok, now we have the path, separated by spaces, we can step through it + # and add multilib dir if necessary... + lt_tmp_lt_search_path_spec= + lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` + # ...but if some path component already ends with the multilib dir we assume + # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer). + case "$lt_multi_os_dir; $lt_search_path_spec " in + "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*) + lt_multi_os_dir= + ;; + esac + for lt_sys_path in $lt_search_path_spec; do + if test -d "$lt_sys_path$lt_multi_os_dir"; then + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir" + elif test -n "$lt_multi_os_dir"; then + test -d "$lt_sys_path" && \ + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi + done + lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' +BEGIN {RS = " "; FS = "/|\n";} { + lt_foo = ""; + lt_count = 0; + for (lt_i = NF; lt_i > 0; lt_i--) { + if ($lt_i != "" && $lt_i != ".") { + if ($lt_i == "..") { + lt_count++; + } else { + if (lt_count == 0) { + lt_foo = "/" $lt_i lt_foo; + } else { + lt_count--; + } + } + } + } + if (lt_foo != "") { lt_freq[lt_foo]++; } + if (lt_freq[lt_foo] == 1) { print lt_foo; } +}'` + # AWK program above erroneously prepends '/' to C:/dos/paths + # for these hosts. + case $host_os in + mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ + $SED 's|/\([A-Za-z]:\)|\1|g'` ;; + esac + sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_CC" >&5 -$as_echo "$ac_cv_sys_largefile_CC" >&6; } - if test "$ac_cv_sys_largefile_CC" != no; then - CC=$CC$ac_cv_sys_largefile_CC - fi +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=.so +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +need_lib_prefix=unknown +hardcode_into_libs=no - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _FILE_OFFSET_BITS value needed for large files" >&5 -$as_echo_n "checking for _FILE_OFFSET_BITS value needed for large files... " >&6; } -if ${ac_cv_sys_file_offset_bits+:} false; then : - $as_echo_n "(cached) " >&6 -else - while :; do - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include - /* Check that off_t can represent 2**63 - 1 correctly. - We can't simply define LARGE_OFF_T to be 9223372036854775807, - since some C++ compilers masquerading as C compilers - incorrectly reject 9223372036854775807. */ -#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) - int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 - && LARGE_OFF_T % 2147483647 == 1) - ? 1 : -1]; -int -main () -{ +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_sys_file_offset_bits=no; break -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#define _FILE_OFFSET_BITS 64 -#include - /* Check that off_t can represent 2**63 - 1 correctly. - We can't simply define LARGE_OFF_T to be 9223372036854775807, - since some C++ compilers masquerading as C compilers - incorrectly reject 9223372036854775807. */ -#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) - int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 - && LARGE_OFF_T % 2147483647 == 1) - ? 1 : -1]; -int -main () -{ - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_sys_file_offset_bits=64; break -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - ac_cv_sys_file_offset_bits=unknown - break -done -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_file_offset_bits" >&5 -$as_echo "$ac_cv_sys_file_offset_bits" >&6; } -case $ac_cv_sys_file_offset_bits in #( - no | unknown) ;; - *) -cat >>confdefs.h <<_ACEOF -#define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits -_ACEOF -;; -esac -rm -rf conftest* - if test $ac_cv_sys_file_offset_bits = unknown; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGE_FILES value needed for large files" >&5 -$as_echo_n "checking for _LARGE_FILES value needed for large files... " >&6; } -if ${ac_cv_sys_large_files+:} false; then : - $as_echo_n "(cached) " >&6 -else - while :; do - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include - /* Check that off_t can represent 2**63 - 1 correctly. - We can't simply define LARGE_OFF_T to be 9223372036854775807, - since some C++ compilers masquerading as C compilers - incorrectly reject 9223372036854775807. */ -#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) - int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 - && LARGE_OFF_T % 2147483647 == 1) - ? 1 : -1]; -int -main () -{ - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_sys_large_files=no; break -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#define _LARGE_FILES 1 -#include - /* Check that off_t can represent 2**63 - 1 correctly. - We can't simply define LARGE_OFF_T to be 9223372036854775807, - since some C++ compilers masquerading as C compilers - incorrectly reject 9223372036854775807. */ -#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) - int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 - && LARGE_OFF_T % 2147483647 == 1) - ? 1 : -1]; -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_sys_large_files=1; break -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - ac_cv_sys_large_files=unknown - break -done -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_large_files" >&5 -$as_echo "$ac_cv_sys_large_files" >&6; } -case $ac_cv_sys_large_files in #( - no | unknown) ;; - *) -cat >>confdefs.h <<_ACEOF -#define _LARGE_FILES $ac_cv_sys_large_files -_ACEOF -;; -esac -rm -rf conftest* - fi +case $host_os in +aix3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname.a' + shlibpath_var=LIBPATH + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='$libname$release$shared_ext$major' + ;; -fi +aix[4-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test ia64 = "$host_cpu"; then + # AIX 5 supports IA64 + library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line '#! .'. This would cause the generated library to + # depend on '.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # Using Import Files as archive members, it is possible to support + # filename-based versioning of shared library archives on AIX. While + # this would work for both with and without runtime linking, it will + # prevent static linking of such archives. So we do filename-based + # shared library versioning with .so extension only, which is used + # when both runtime linking and shared linking is enabled. + # Unfortunately, runtime linking may impact performance, so we do + # not want this to be the default eventually. Also, we use the + # versioned .so libs for executables only if there is the -brtl + # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. + # To allow for filename-based versioning support, we need to create + # libNAME.so.V as an archive file, containing: + # *) an Import File, referring to the versioned filename of the + # archive as well as the shared archive member, telling the + # bitwidth (32 or 64) of that shared object, and providing the + # list of exported symbols of that shared object, eventually + # decorated with the 'weak' keyword + # *) the shared object with the F_LOADONLY flag set, to really avoid + # it being seen by the linker. + # At run time we better use the real file rather than another symlink, + # but for link time we create the symlink libNAME.so -> libNAME.so.V + + case $with_aix_soname,$aix_use_runtimelinking in + # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + aix,yes) # traditional libtool + dynamic_linker='AIX unversionable lib.so' + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + aix,no) # traditional AIX only + dynamic_linker='AIX lib.a(lib.so.V)' + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + ;; + svr4,*) # full svr4 only + dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,yes) # both, prefer svr4 + dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # unpreferred sharedlib libNAME.a needs extra handling + postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' + postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,no) # both, prefer aix + dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)" + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling + postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' + postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' + ;; + esac + shlibpath_var=LIBPATH + fi + ;; +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + m68k) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; -# Configure parameters +beos*) + library_names_spec='$libname$shared_ext' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; -# Check whether --with-libgcrypt was given. -if test "${with_libgcrypt+set}" = set; then : - withval=$with_libgcrypt; use_libgcrypt=$withval -else - use_libgcrypt=auto -fi +bsdi[45]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no -# Check whether --with-openssl was given. -if test "${with_openssl+set}" = set; then : - withval=$with_openssl; use_openssl=$withval -else - use_openssl=auto -fi + case $GCC,$cc_basename in + yes,*) + # gcc + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' -# Check whether --with-libz was given. -if test "${with_libz+set}" = set; then : - withval=$with_libz; use_libz=$withval -else - use_libz=auto -fi + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api" + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + ;; + esac + dynamic_linker='Win32 ld.exe' + ;; + *,cl*) + # Native MSVC + libname_spec='$name' + soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + library_names_spec='$libname.dll.lib' -# Look for OpenSSL (default) -if test "$use_openssl" != "no" && test "$use_libgcrypt" != "yes"; then + case $build_os in + mingw*) + sys_lib_search_path_spec= + lt_save_ifs=$IFS + IFS=';' + for lt_path in $LIB + do + IFS=$lt_save_ifs + # Let DOS variable expansion print the short 8.3 style file name. + lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` + sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" + done + IFS=$lt_save_ifs + # Convert to MSYS style. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` + ;; + cygwin*) + # Convert to unix form, then to dos form, then back to unix form + # but this time dos style (no spaces!) so that the unix form looks + # like /cygdrive/c/PROGRA~1:/cygdr... + sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` + sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` + sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + ;; + *) + sys_lib_search_path_spec=$LIB + if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # FIXME: find the short name or the path components, as spaces are + # common. (e.g. "Program Files" -> "PROGRA~1") + ;; + esac - if test "X$prefix" = "XNONE"; then - acl_final_prefix="$ac_default_prefix" - else - acl_final_prefix="$prefix" - fi - if test "X$exec_prefix" = "XNONE"; then - acl_final_exec_prefix='${prefix}' - else - acl_final_exec_prefix="$exec_prefix" - fi - acl_save_prefix="$prefix" - prefix="$acl_final_prefix" - eval acl_final_exec_prefix=\"$acl_final_exec_prefix\" - prefix="$acl_save_prefix" + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + dynamic_linker='Win32 link.exe' + ;; + *) + # Assume MSVC wrapper + library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib' + dynamic_linker='Win32 ld.exe' + ;; + esac + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; -# Check whether --with-gnu-ld was given. -if test "${with_gnu_ld+set}" = set; then : - withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes -else - with_gnu_ld=no -fi +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$major$shared_ext $libname$shared_ext' + soname_spec='$libname$release$major$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' -# Prepare PATH_SEPARATOR. -# The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then - echo "#! /bin/sh" >conf$$.sh - echo "exit 0" >>conf$$.sh - chmod +x conf$$.sh - if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then - PATH_SEPARATOR=';' + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` else - PATH_SEPARATOR=: + case $host_os in + freebsd[23].*) objformat=aout ;; + *) objformat=elf ;; + esac fi - rm -f conf$$.sh -fi -ac_prog=ld -if test "$GCC" = yes; then - # Check if gcc -print-prog-name=ld gives a path. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by GCC" >&5 -$as_echo_n "checking for ld used by GCC... " >&6; } - case $host in - *-*-mingw*) - # gcc leaves a trailing carriage return which upsets mingw - ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2.*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +haiku*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + dynamic_linker="$host_os runtime_loader" + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LIBRARY_PATH + shlibpath_overrides_runpath=no + sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + if test 32 = "$HPUX_IA64_MODE"; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + sys_lib_dlsearch_path_spec=/usr/lib/hpux32 + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + sys_lib_dlsearch_path_spec=/usr/lib/hpux64 + fi + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; *) - ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + ;; esac - case $ac_prog in - # Accept absolute paths. - [\\/]* | [A-Za-z]:[\\/]*) - re_direlt='/[^/][^/]*/\.\./' - # Canonicalize the path of ld - ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` - while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do - ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` - done - test -z "$LD" && LD="$ac_prog" - ;; - "") - # If it fails, then pretend we aren't using GCC. - ac_prog=ld + # HP-UX runs *really* slowly unless shared libraries are mode 555, ... + postinstall_cmds='chmod 555 $lib' + # or fails outright, so override atomically: + install_override_mode=555 + ;; + +interix[3-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test yes = "$lt_cv_prog_gnu_ld"; then + version_type=linux # correct to gnu/linux during the next big refactor + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= ;; *) - # If it is relative, then search for the first ld in PATH. - with_gnu_ld=unknown + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac ;; esac -elif test "$with_gnu_ld" = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 -$as_echo_n "checking for GNU ld... " >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 -$as_echo_n "checking for non-GNU ld... " >&6; } + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff" + sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +linux*android*) + version_type=none # Android doesn't support versioned libraries. + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext' + soname_spec='$libname$release$shared_ext' + finish_cmds= + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + dynamic_linker='Android linker' + # Don't embed -rpath directories since the linker doesn't support them. + hardcode_libdir_flag_spec='-L$libdir' + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + + # Some binutils ld are patched to set DT_RUNPATH + if test ${lt_cv_shlibpath_overrides_runpath+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_shlibpath_overrides_runpath=no + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ + LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null +then : + lt_cv_shlibpath_overrides_runpath=yes fi -if ${acl_cv_path_LD+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -z "$LD"; then - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" - for ac_dir in $PATH; do - test -z "$ac_dir" && ac_dir=. - if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then - acl_cv_path_LD="$ac_dir/$ac_prog" - # Check to see if the program is GNU ld. I'd rather use --version, - # but apparently some GNU ld's only accept -v. - # Break only if it was the GNU/non-GNU ld that we prefer. - case `"$acl_cv_path_LD" -v 2>&1 < /dev/null` in - *GNU* | *'with BFD'*) - test "$with_gnu_ld" != no && break ;; - *) - test "$with_gnu_ld" != yes && break ;; - esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + +fi + + shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Ideally, we could use ldconfig to report *all* directores which are + # searched for libraries, however this is still not possible. Aside from not + # being certain /sbin/ldconfig is available, command + # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, + # even though it is searched at run-time. Try to do the best guess by + # appending ld.so.conf contents (and includes) to the search path. + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsdelf*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='NetBSD ld.elf_so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; + +openbsd* | bitrig*) + version_type=sunos + sys_lib_dlsearch_path_spec=/usr/lib + need_lib_prefix=no + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + need_version=no + else + need_version=yes + fi + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +os2*) + libname_spec='$name' + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + # OS/2 can only load a DLL with a base name of 8 characters or less. + soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; + v=$($ECHO $release$versuffix | tr -d .-); + n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); + $ECHO $n$v`$shared_ext' + library_names_spec='${libname}_dll.$libext' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=BEGINLIBPATH + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test yes = "$with_gnu_ld"; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec; then + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext' + soname_spec='$libname$shared_ext.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=sco + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test yes = "$with_gnu_ld"; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 +printf "%s\n" "$dynamic_linker" >&6; } +test no = "$dynamic_linker" && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test yes = "$GCC"; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then + sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec +fi + +if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then + sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec +fi + +# remember unaugmented sys_lib_dlsearch_path content for libtool script decls... +configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec + +# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code +func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" + +# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool +configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 +printf %s "checking how to hardcode library paths into programs... " >&6; } +hardcode_action= +if test -n "$hardcode_libdir_flag_spec" || + test -n "$runpath_var" || + test yes = "$hardcode_automatic"; then + + # We can hardcode non-existent directories. + if test no != "$hardcode_direct" && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, )" && + test no != "$hardcode_minus_L"; then + # Linking always hardcodes the temporary library directory. + hardcode_action=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action=unsupported +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 +printf "%s\n" "$hardcode_action" >&6; } + +if test relink = "$hardcode_action" || + test yes = "$inherit_rpath"; then + # Fast installation is not supported + enable_fast_install=no +elif test yes = "$shlibpath_overrides_runpath" || + test no = "$enable_shared"; then + # Fast installation is not necessary + enable_fast_install=needless +fi + + + + + + + if test yes != "$enable_dlopen"; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen=load_add_on + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32* | cegcc*) + lt_cv_dlopen=LoadLibrary + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen=dlopen + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +printf %s "checking for dlopen in -ldl... " >&6; } +if test ${ac_cv_lib_dl_dlopen+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char dlopen (); +int +main (void) +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_dl_dlopen=yes +else $as_nop + ac_cv_lib_dl_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +printf "%s\n" "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes +then : + lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl +else $as_nop + + lt_cv_dlopen=dyld + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + +fi + + ;; + + tpf*) + # Don't try to run any link tests for TPF. We know it's impossible + # because TPF is a cross-compiler, and we know how we open DSOs. + lt_cv_dlopen=dlopen + lt_cv_dlopen_libs= + lt_cv_dlopen_self=no + ;; + + *) + ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" +if test "x$ac_cv_func_shl_load" = xyes +then : + lt_cv_dlopen=shl_load +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 +printf %s "checking for shl_load in -ldld... " >&6; } +if test ${ac_cv_lib_dld_shl_load+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char shl_load (); +int +main (void) +{ +return shl_load (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_dld_shl_load=yes +else $as_nop + ac_cv_lib_dld_shl_load=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 +printf "%s\n" "$ac_cv_lib_dld_shl_load" >&6; } +if test "x$ac_cv_lib_dld_shl_load" = xyes +then : + lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld +else $as_nop + ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" +if test "x$ac_cv_func_dlopen" = xyes +then : + lt_cv_dlopen=dlopen +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +printf %s "checking for dlopen in -ldl... " >&6; } +if test ${ac_cv_lib_dl_dlopen+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char dlopen (); +int +main (void) +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_dl_dlopen=yes +else $as_nop + ac_cv_lib_dl_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +printf "%s\n" "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes +then : + lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 +printf %s "checking for dlopen in -lsvld... " >&6; } +if test ${ac_cv_lib_svld_dlopen+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsvld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char dlopen (); +int +main (void) +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_svld_dlopen=yes +else $as_nop + ac_cv_lib_svld_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 +printf "%s\n" "$ac_cv_lib_svld_dlopen" >&6; } +if test "x$ac_cv_lib_svld_dlopen" = xyes +then : + lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 +printf %s "checking for dld_link in -ldld... " >&6; } +if test ${ac_cv_lib_dld_dld_link+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char dld_link (); +int +main (void) +{ +return dld_link (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_dld_dld_link=yes +else $as_nop + ac_cv_lib_dld_dld_link=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 +printf "%s\n" "$ac_cv_lib_dld_dld_link" >&6; } +if test "x$ac_cv_lib_dld_dld_link" = xyes +then : + lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld +fi + + +fi + + +fi + + +fi + + +fi + + +fi + + ;; + esac + + if test no = "$lt_cv_dlopen"; then + enable_dlopen=no + else + enable_dlopen=yes + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS=$CPPFLAGS + test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS=$LDFLAGS + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS=$LIBS + LIBS="$lt_cv_dlopen_libs $LIBS" + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 +printf %s "checking whether a program can dlopen itself... " >&6; } +if test ${lt_cv_dlopen_self+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test yes = "$cross_compiling"; then : + lt_cv_dlopen_self=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +#line $LINENO "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +/* When -fvisibility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 42; } +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else + { + if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else puts (dlerror ()); + } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +} +_LT_EOF + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then + (./conftest; exit; ) >&5 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self=no + fi +fi +rm -fr conftest* + + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 +printf "%s\n" "$lt_cv_dlopen_self" >&6; } + + if test yes = "$lt_cv_dlopen_self"; then + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 +printf %s "checking whether a statically linked program can dlopen itself... " >&6; } +if test ${lt_cv_dlopen_self_static+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test yes = "$cross_compiling"; then : + lt_cv_dlopen_self_static=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +#line $LINENO "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +/* When -fvisibility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 42; } +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else + { + if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else puts (dlerror ()); + } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +} +_LT_EOF + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then + (./conftest; exit; ) >&5 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self_static=no + fi +fi +rm -fr conftest* + + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 +printf "%s\n" "$lt_cv_dlopen_self_static" >&6; } + fi + + CPPFLAGS=$save_CPPFLAGS + LDFLAGS=$save_LDFLAGS + LIBS=$save_LIBS + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi + + + + + + + + + + + + + + + + + +striplib= +old_striplib= +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 +printf %s "checking whether stripping libraries is possible... " >&6; } +if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP"; then + striplib="$STRIP -x" + old_striplib="$STRIP -S" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + fi + ;; + *) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + ;; + esac +fi + + + + + + + + + + + + + # Report what library types will actually be built + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 +printf %s "checking if libtool supports shared libraries... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 +printf "%s\n" "$can_build_shared" >&6; } + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 +printf %s "checking whether to build shared libraries... " >&6; } + test no = "$can_build_shared" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test yes = "$enable_shared" && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + + aix[4-9]*) + if test ia64 != "$host_cpu"; then + case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in + yes,aix,yes) ;; # shared object as lib.so file only + yes,svr4,*) ;; # shared object as lib.so archive member only + yes,*) enable_static=no ;; # shared object in lib.a archive as well + esac + fi + ;; + esac + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 +printf "%s\n" "$enable_shared" >&6; } + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 +printf %s "checking whether to build static libraries... " >&6; } + # Make sure either enable_shared or enable_static is yes. + test yes = "$enable_shared" || enable_static=yes + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 +printf "%s\n" "$enable_static" >&6; } + + + + +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +CC=$lt_save_CC + + if test -n "$CXX" && ( test no != "$CXX" && + ( (test g++ = "$CXX" && `g++ -v >/dev/null 2>&1` ) || + (test g++ != "$CXX"))); then + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 +printf %s "checking how to run the C++ preprocessor... " >&6; } +if test -z "$CXXCPP"; then + if test ${ac_cv_prog_CXXCPP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + # Double quotes because $CXX needs to be expanded + for CXXCPP in "$CXX -E" cpp /lib/cpp + do + ac_preproc_ok=false +for ac_cxx_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + Syntax error +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO" +then : + +else $as_nop + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO" +then : + # Broken: success on invalid input. +continue +else $as_nop + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok +then : + break +fi + + done + ac_cv_prog_CXXCPP=$CXXCPP + +fi + CXXCPP=$ac_cv_prog_CXXCPP +else + ac_cv_prog_CXXCPP=$CXXCPP +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 +printf "%s\n" "$CXXCPP" >&6; } +ac_preproc_ok=false +for ac_cxx_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + Syntax error +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO" +then : + +else $as_nop + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO" +then : + # Broken: success on invalid input. +continue +else $as_nop + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok +then : + +else $as_nop + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +else + _lt_caught_CXX_error=yes +fi + +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + +archive_cmds_need_lc_CXX=no +allow_undefined_flag_CXX= +always_export_symbols_CXX=no +archive_expsym_cmds_CXX= +compiler_needs_object_CXX=no +export_dynamic_flag_spec_CXX= +hardcode_direct_CXX=no +hardcode_direct_absolute_CXX=no +hardcode_libdir_flag_spec_CXX= +hardcode_libdir_separator_CXX= +hardcode_minus_L_CXX=no +hardcode_shlibpath_var_CXX=unsupported +hardcode_automatic_CXX=no +inherit_rpath_CXX=no +module_cmds_CXX= +module_expsym_cmds_CXX= +link_all_deplibs_CXX=unknown +old_archive_cmds_CXX=$old_archive_cmds +reload_flag_CXX=$reload_flag +reload_cmds_CXX=$reload_cmds +no_undefined_flag_CXX= +whole_archive_flag_spec_CXX= +enable_shared_with_static_runtimes_CXX=no + +# Source file extension for C++ test sources. +ac_ext=cpp + +# Object file extension for compiled C++ test sources. +objext=o +objext_CXX=$objext + +# No sense in running all these tests if we already determined that +# the CXX compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test yes != "$_lt_caught_CXX_error"; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="int some_variable = 0;" + + # Code to be used in simple link tests + lt_simple_link_test_code='int main(int, char *[]) { return(0); }' + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + + # save warnings/boilerplate of simple test code + ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* + + ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* + + + # Allow CC to be a program name with arguments. + lt_save_CC=$CC + lt_save_CFLAGS=$CFLAGS + lt_save_LD=$LD + lt_save_GCC=$GCC + GCC=$GXX + lt_save_with_gnu_ld=$with_gnu_ld + lt_save_path_LD=$lt_cv_path_LD + if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx + else + $as_unset lt_cv_prog_gnu_ld + fi + if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX + else + $as_unset lt_cv_path_LD + fi + test -z "${LDCXX+set}" || LD=$LDCXX + CC=${CXX-"c++"} + CFLAGS=$CXXFLAGS + compiler=$CC + compiler_CXX=$CC + func_cc_basename $compiler +cc_basename=$func_cc_basename_result + + + if test -n "$compiler"; then + # We don't want -fno-exception when compiling C++ code, so set the + # no_builtin_flag separately + if test yes = "$GXX"; then + lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' + else + lt_prog_compiler_no_builtin_flag_CXX= + fi + + if test yes = "$GXX"; then + # Set up default GNU C++ configuration + + + +# Check whether --with-gnu-ld was given. +if test ${with_gnu_ld+y} +then : + withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes +else $as_nop + with_gnu_ld=no +fi + +ac_prog=ld +if test yes = "$GCC"; then + # Check if gcc -print-prog-name=ld gives a path. + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 +printf %s "checking for ld used by $CC... " >&6; } + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return, which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | ?:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` + while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do + ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD=$ac_prog + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test yes = "$with_gnu_ld"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 +printf %s "checking for GNU ld... " >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 +printf %s "checking for non-GNU ld... " >&6; } +fi +if test ${lt_cv_path_LD+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -z "$LD"; then + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD=$ac_dir/$ac_prog + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &5 +printf "%s\n" "$LD" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi +test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 +printf %s "checking if the linker ($LD) is GNU ld... " >&6; } +if test ${lt_cv_prog_gnu_ld+y} +then : + printf %s "(cached) " >&6 +else $as_nop + # I'd rather use --version here, but apparently some GNU lds only accept -v. +case `$LD -v 2>&1 &5 +printf "%s\n" "$lt_cv_prog_gnu_ld" >&6; } +with_gnu_ld=$lt_cv_prog_gnu_ld + + + + + + + + # Check if GNU C++ uses GNU ld as the underlying linker, since the + # archiving commands below assume that GNU ld is being used. + if test yes = "$with_gnu_ld"; then + archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + + hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' + export_dynamic_flag_spec_CXX='$wl--export-dynamic' + + # If archive_cmds runs LD, not CC, wlarc should be empty + # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to + # investigate it a little bit more. (MM) + wlarc='$wl' + + # ancient GNU ld didn't support --whole-archive et. al. + if eval "`$CC -print-prog-name=ld` --help 2>&1" | + $GREP 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec_CXX=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' + else + whole_archive_flag_spec_CXX= + fi + else + with_gnu_ld=no + wlarc= + + # A generic and very simple default shared library creation + # command for GNU C++ for the case where it uses the native + # linker, instead of GNU ld. If possible, this setting should + # overridden to take advantage of the native linker features on + # the platform it is being used on. + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + fi + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " \-L"' + + else + GXX=no + with_gnu_ld=no + wlarc= + fi + + # PORTME: fill in a description of your system's C++ link characteristics + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +printf %s "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + ld_shlibs_CXX=yes + case $host_os in + aix3*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aix[4-9]*) + if test ia64 = "$host_cpu"; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag= + else + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # have runtime linking enabled, and use it for executables. + # For shared libraries, we enable/disable runtime linking + # depending on the kind of the shared library created - + # when "with_aix_soname,aix_use_runtimelinking" is: + # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables + # "aix,yes" lib.so shared, rtl:yes, for executables + # lib.a static archive + # "both,no" lib.so.V(shr.o) shared, rtl:yes + # lib.a(lib.so.V) shared, rtl:no, for executables + # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a(lib.so.V) shared, rtl:no + # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a static archive + case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) + for ld_flag in $LDFLAGS; do + case $ld_flag in + *-brtl*) + aix_use_runtimelinking=yes + break + ;; + esac + done + if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then + # With aix-soname=svr4, we create the lib.so.V shared archives only, + # so we don't have lib.a shared libs to link our executables. + # We have to force runtime linking in this case. + aix_use_runtimelinking=yes + LDFLAGS="$LDFLAGS -Wl,-brtl" + fi + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds_CXX='' + hardcode_direct_CXX=yes + hardcode_direct_absolute_CXX=yes + hardcode_libdir_separator_CXX=':' + link_all_deplibs_CXX=yes + file_list_spec_CXX='$wl-f,' + case $with_aix_soname,$aix_use_runtimelinking in + aix,*) ;; # no import file + svr4,* | *,yes) # use import file + # The Import File defines what to hardcode. + hardcode_direct_CXX=no + hardcode_direct_absolute_CXX=no + ;; + esac + + if test yes = "$GXX"; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`$CC -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + hardcode_direct_CXX=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L_CXX=yes + hardcode_libdir_flag_spec_CXX='-L$libdir' + hardcode_libdir_separator_CXX= + fi + esac + shared_flag='-shared' + if test yes = "$aix_use_runtimelinking"; then + shared_flag=$shared_flag' $wl-G' + fi + # Need to ensure runtime linking is disabled for the traditional + # shared library, or the linker may eventually find shared libraries + # /with/ Import File - we do not want to mix them. + shared_flag_aix='-shared' + shared_flag_svr4='-shared $wl-G' + else + # not using gcc + if test ia64 = "$host_cpu"; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test yes = "$aix_use_runtimelinking"; then + shared_flag='$wl-G' + else + shared_flag='$wl-bM:SRE' + fi + shared_flag_aix='$wl-bM:SRE' + shared_flag_svr4='$wl-G' + fi + fi + + export_dynamic_flag_spec_CXX='$wl-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to + # export. + always_export_symbols_CXX=yes + if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + # The "-G" linker flag allows undefined symbols. + no_undefined_flag_CXX='-bernotok' + # Determine the default libpath from the value encoded in an empty + # executable. + if test set = "${lt_cv_aix_libpath+set}"; then + aix_libpath=$lt_cv_aix_libpath +else + if test ${lt_cv_aix_libpath__CXX+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO" +then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath__CXX"; then + lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath__CXX"; then + lt_cv_aix_libpath__CXX=/usr/lib:/lib + fi + +fi + + aix_libpath=$lt_cv_aix_libpath__CXX +fi + + hardcode_libdir_flag_spec_CXX='$wl-blibpath:$libdir:'"$aix_libpath" + + archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag + else + if test ia64 = "$host_cpu"; then + hardcode_libdir_flag_spec_CXX='$wl-R $libdir:/usr/lib:/lib' + allow_undefined_flag_CXX="-z nodefs" + archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + if test set = "${lt_cv_aix_libpath+set}"; then + aix_libpath=$lt_cv_aix_libpath +else + if test ${lt_cv_aix_libpath__CXX+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO" +then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath__CXX"; then + lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath__CXX"; then + lt_cv_aix_libpath__CXX=/usr/lib:/lib + fi + +fi + + aix_libpath=$lt_cv_aix_libpath__CXX +fi + + hardcode_libdir_flag_spec_CXX='$wl-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag_CXX=' $wl-bernotok' + allow_undefined_flag_CXX=' $wl-berok' + if test yes = "$with_gnu_ld"; then + # We only use this code for GNU lds that support --whole-archive. + whole_archive_flag_spec_CXX='$wl--whole-archive$convenience $wl--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec_CXX='$convenience' + fi + archive_cmds_need_lc_CXX=yes + archive_expsym_cmds_CXX='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' + # -brtl affects multiple linker settings, -berok does not and is overridden later + compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`' + if test svr4 != "$with_aix_soname"; then + # This is similar to how AIX traditionally builds its shared + # libraries. Need -bnortl late, we may have -brtl in LDFLAGS. + archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' + fi + if test aix != "$with_aix_soname"; then + archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' + else + # used by -dlpreopen to get the symbols + archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$MV $output_objdir/$realname.d/$soname $output_objdir' + fi + archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$RM -r $output_objdir/$realname.d' + fi + fi + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag_CXX=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + else + ld_shlibs_CXX=no + fi + ;; + + chorus*) + case $cc_basename in + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + cygwin* | mingw* | pw32* | cegcc*) + case $GXX,$cc_basename in + ,cl* | no,cl*) + # Native MSVC + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec_CXX=' ' + allow_undefined_flag_CXX=unsupported + always_export_symbols_CXX=yes + file_list_spec_CXX='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=.dll + # FIXME: Setting linknames here is a bad hack. + archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' + archive_expsym_cmds_CXX='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then + cp "$export_symbols" "$output_objdir/$soname.def"; + echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; + else + $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true' + enable_shared_with_static_runtimes_CXX=yes + # Don't use ranlib + old_postinstall_cmds_CXX='chmod 644 $oldlib' + postlink_cmds_CXX='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile=$lt_outputfile.exe + lt_tool_outputfile=$lt_tool_outputfile.exe + ;; + esac~ + func_to_tool_file "$lt_outputfile"~ + if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # g++ + # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec_CXX='-L$libdir' + export_dynamic_flag_spec_CXX='$wl--export-all-symbols' + allow_undefined_flag_CXX=unsupported + always_export_symbols_CXX=no + enable_shared_with_static_runtimes_CXX=yes + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file, use it as + # is; otherwise, prepend EXPORTS... + archive_expsym_cmds_CXX='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + ld_shlibs_CXX=no + fi + ;; + esac + ;; + darwin* | rhapsody*) + + + archive_cmds_need_lc_CXX=no + hardcode_direct_CXX=no + hardcode_automatic_CXX=yes + hardcode_shlibpath_var_CXX=unsupported + if test yes = "$lt_cv_ld_force_load"; then + whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + + else + whole_archive_flag_spec_CXX='' + fi + link_all_deplibs_CXX=yes + allow_undefined_flag_CXX=$_lt_dar_allow_undefined + case $cc_basename in + ifort*|nagfor*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test yes = "$_lt_dar_can_shared"; then + output_verbose_link_cmd=func_echo_all + archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" + module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" + archive_expsym_cmds_CXX="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" + module_expsym_cmds_CXX="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" + if test yes != "$lt_cv_apple_cc_single_mod"; then + archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dsymutil" + archive_expsym_cmds_CXX="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dar_export_syms$_lt_dsymutil" + fi + + else + ld_shlibs_CXX=no + fi + + ;; + + os2*) + hardcode_libdir_flag_spec_CXX='-L$libdir' + hardcode_minus_L_CXX=yes + allow_undefined_flag_CXX=unsupported + shrext_cmds=.dll + archive_cmds_CXX='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + archive_expsym_cmds_CXX='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + old_archive_From_new_cmds_CXX='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + enable_shared_with_static_runtimes_CXX=yes + ;; + + dgux*) + case $cc_basename in + ec++*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + ghcx*) + # Green Hills C++ Compiler + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + freebsd2.*) + # C++ shared libraries reported to be fairly broken before + # switch to ELF + ld_shlibs_CXX=no + ;; + + freebsd-elf*) + archive_cmds_need_lc_CXX=no + ;; + + freebsd* | dragonfly*) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + ld_shlibs_CXX=yes + ;; + + haiku*) + archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + link_all_deplibs_CXX=yes + ;; + + hpux9*) + hardcode_libdir_flag_spec_CXX='$wl+b $wl$libdir' + hardcode_libdir_separator_CXX=: + export_dynamic_flag_spec_CXX='$wl-E' + hardcode_direct_CXX=yes + hardcode_minus_L_CXX=yes # Not in the search PATH, + # but as the default + # location of the library. + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aCC*) + archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP " \-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test yes = "$GXX"; then + archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + + hpux10*|hpux11*) + if test no = "$with_gnu_ld"; then + hardcode_libdir_flag_spec_CXX='$wl+b $wl$libdir' + hardcode_libdir_separator_CXX=: + + case $host_cpu in + hppa*64*|ia64*) + ;; + *) + export_dynamic_flag_spec_CXX='$wl-E' + ;; + esac + fi + case $host_cpu in + hppa*64*|ia64*) + hardcode_direct_CXX=no + hardcode_shlibpath_var_CXX=no + ;; + *) + hardcode_direct_CXX=yes + hardcode_direct_absolute_CXX=yes + hardcode_minus_L_CXX=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + esac + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aCC*) + case $host_cpu in + hppa*64*) + archive_cmds_CXX='$CC -b $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + archive_cmds_CXX='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP " \-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test yes = "$GXX"; then + if test no = "$with_gnu_ld"; then + case $host_cpu in + hppa*64*) + archive_cmds_CXX='$CC -shared -nostdlib -fPIC $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + archive_cmds_CXX='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + fi + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + + interix[3-9]*) + hardcode_direct_CXX=no + hardcode_shlibpath_var_CXX=no + hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' + export_dynamic_flag_spec_CXX='$wl-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + archive_expsym_cmds_CXX='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + irix5* | irix6*) + case $cc_basename in + CC*) + # SGI C++ + archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + + # Archives containing C++ object files must be created using + # "CC -ar", where "CC" is the IRIX C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' + ;; + *) + if test yes = "$GXX"; then + if test no = "$with_gnu_ld"; then + archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + else + archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` -o $lib' + fi + fi + link_all_deplibs_CXX=yes + ;; + esac + hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' + hardcode_libdir_separator_CXX=: + inherit_rpath_CXX=yes + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib $wl-retain-symbols-file,$export_symbols; mv \$templib $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + + hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' + export_dynamic_flag_spec_CXX='$wl--export-dynamic' + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' + ;; + icpc* | ecpc* ) + # Intel C++ + with_gnu_ld=yes + # version 8.0 and above of icpc choke on multiply defined symbols + # if we add $predep_objects and $postdep_objects, however 7.1 and + # earlier do not add the objects themselves. + case `$CC -V 2>&1` in + *"Version 7."*) + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 8.0 or newer + tmp_idyn= + case $host_cpu in + ia64*) tmp_idyn=' -i_dynamic';; + esac + archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + archive_cmds_need_lc_CXX=no + hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' + export_dynamic_flag_spec_CXX='$wl--export-dynamic' + whole_archive_flag_spec_CXX='$wl--whole-archive$convenience $wl--no-whole-archive' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + case `$CC -V` in + *pgCC\ [1-5].* | *pgcpp\ [1-5].*) + prelink_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ + compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' + old_archive_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ + $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ + $RANLIB $oldlib' + archive_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 6 and above use weak symbols + archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + + hardcode_libdir_flag_spec_CXX='$wl--rpath $wl$libdir' + export_dynamic_flag_spec_CXX='$wl--export-dynamic' + whole_archive_flag_spec_CXX='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + ;; + cxx*) + # Compaq C++ + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib $wl-retain-symbols-file $wl$export_symbols' + + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec_CXX='-rpath $libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' + ;; + xl* | mpixl* | bgxl*) + # IBM XL 8.0 on PPC, with GNU ld + hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' + export_dynamic_flag_spec_CXX='$wl--export-dynamic' + archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + if test yes = "$supports_anon_versioning"; then + archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' + fi + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + no_undefined_flag_CXX=' -zdefs' + archive_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + archive_expsym_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file $wl$export_symbols' + hardcode_libdir_flag_spec_CXX='-R$libdir' + whole_archive_flag_spec_CXX='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + compiler_needs_object_CXX=yes + + # Not sure whether something based on + # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 + # would be better. + output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' + ;; + esac + ;; + esac + ;; + + lynxos*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + m88k*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + mvs*) + case $cc_basename in + cxx*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' + wlarc= + hardcode_libdir_flag_spec_CXX='-R$libdir' + hardcode_direct_CXX=yes + hardcode_shlibpath_var_CXX=no + fi + # Workaround some broken pre-1.5 toolchains + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' + ;; + + *nto* | *qnx*) + ld_shlibs_CXX=yes + ;; + + openbsd* | bitrig*) + if test -f /usr/libexec/ld.so; then + hardcode_direct_CXX=yes + hardcode_shlibpath_var_CXX=no + hardcode_direct_absolute_CXX=yes + archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`"; then + archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file,$export_symbols -o $lib' + export_dynamic_flag_spec_CXX='$wl-E' + whole_archive_flag_spec_CXX=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' + fi + output_verbose_link_cmd=func_echo_all + else + ld_shlibs_CXX=no + fi + ;; + + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' + hardcode_libdir_separator_CXX=: + + # Archives containing C++ object files must be created using + # the KAI C++ compiler. + case $host in + osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; + *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;; + esac + ;; + RCC*) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + cxx*) + case $host in + osf3*) + allow_undefined_flag_CXX=' $wl-expect_unresolved $wl\*' + archive_cmds_CXX='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $soname `test -n "$verstring" && func_echo_all "$wl-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' + ;; + *) + allow_undefined_flag_CXX=' -expect_unresolved \*' + archive_cmds_CXX='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ + echo "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname $wl-input $wl$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~ + $RM $lib.exp' + hardcode_libdir_flag_spec_CXX='-rpath $libdir' + ;; + esac + + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test yes,no = "$GXX,$with_gnu_ld"; then + allow_undefined_flag_CXX=' $wl-expect_unresolved $wl\*' + case $host in + osf3*) + archive_cmds_CXX='$CC -shared -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + ;; + *) + archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + ;; + esac + + hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " \-L"' + + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + + psos*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + lcc*) + # Lucid + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + archive_cmds_need_lc_CXX=yes + no_undefined_flag_CXX=' -zdefs' + archive_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G$allow_undefined_flag $wl-M $wl$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + hardcode_libdir_flag_spec_CXX='-R$libdir' + hardcode_shlibpath_var_CXX=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands '-z linker_flag'. + # Supported since Solaris 2.6 (maybe 2.5.1?) + whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract' + ;; + esac + link_all_deplibs_CXX=yes + + output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' + ;; + gcx*) + # Green Hills C++ Compiler + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' + + # The C++ compiler must be used to create the archive. + old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' + ;; + *) + # GNU C++ compiler with Solaris linker + if test yes,no = "$GXX,$with_gnu_ld"; then + no_undefined_flag_CXX=' $wl-z ${wl}defs' + if $CC --version | $GREP -v '^2\.7' > /dev/null; then + archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' + archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " \-L"' + else + # g++ 2.7 appears to require '-G' NOT '-shared' on this + # platform. + archive_cmds_CXX='$CC -G -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' + archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " \-L"' + fi + + hardcode_libdir_flag_spec_CXX='$wl-R $wl$libdir' + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + whole_archive_flag_spec_CXX='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' + ;; + esac + fi + ;; + esac + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) + no_undefined_flag_CXX='$wl-z,text' + archive_cmds_need_lc_CXX=no + hardcode_shlibpath_var_CXX=no + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + archive_cmds_CXX='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We CANNOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + no_undefined_flag_CXX='$wl-z,text' + allow_undefined_flag_CXX='$wl-z,nodefs' + archive_cmds_need_lc_CXX=no + hardcode_shlibpath_var_CXX=no + hardcode_libdir_flag_spec_CXX='$wl-R,$libdir' + hardcode_libdir_separator_CXX=':' + link_all_deplibs_CXX=yes + export_dynamic_flag_spec_CXX='$wl-Bexport' + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + archive_cmds_CXX='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~ + '"$old_archive_cmds_CXX" + reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~ + '"$reload_cmds_CXX" + ;; + *) + archive_cmds_CXX='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + vxworks*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 +printf "%s\n" "$ld_shlibs_CXX" >&6; } + test no = "$ld_shlibs_CXX" && can_build_shared=no + + GCC_CXX=$GXX + LD_CXX=$LD + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + # Dependencies to place before and after the object being linked: +predep_objects_CXX= +postdep_objects_CXX= +predeps_CXX= +postdeps_CXX= +compiler_lib_search_path_CXX= + +cat > conftest.$ac_ext <<_LT_EOF +class Foo +{ +public: + Foo (void) { a = 0; } +private: + int a; +}; +_LT_EOF + + +_lt_libdeps_save_CFLAGS=$CFLAGS +case "$CC $CFLAGS " in #( +*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; +*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; +*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; +esac + +if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + # Parse the compiler output and extract the necessary + # objects, libraries and library flags. + + # Sentinel used to keep track of whether or not we are before + # the conftest object file. + pre_test_object_deps_done=no + + for p in `eval "$output_verbose_link_cmd"`; do + case $prev$p in + + -L* | -R* | -l*) + # Some compilers place space between "-{L,R}" and the path. + # Remove the space. + if test x-L = "$p" || + test x-R = "$p"; then + prev=$p + continue + fi + + # Expand the sysroot to ease extracting the directories later. + if test -z "$prev"; then + case $p in + -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; + -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; + -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; + esac + fi + case $p in + =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; + esac + if test no = "$pre_test_object_deps_done"; then + case $prev in + -L | -R) + # Internal compiler library paths should come after those + # provided the user. The postdeps already come after the + # user supplied libs so there is no need to process them. + if test -z "$compiler_lib_search_path_CXX"; then + compiler_lib_search_path_CXX=$prev$p + else + compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} $prev$p" + fi + ;; + # The "-l" case would never come before the object being + # linked, so don't bother handling this case. + esac + else + if test -z "$postdeps_CXX"; then + postdeps_CXX=$prev$p + else + postdeps_CXX="${postdeps_CXX} $prev$p" + fi + fi + prev= + ;; + + *.lto.$objext) ;; # Ignore GCC LTO objects + *.$objext) + # This assumes that the test object file only shows up + # once in the compiler output. + if test "$p" = "conftest.$objext"; then + pre_test_object_deps_done=yes + continue + fi + + if test no = "$pre_test_object_deps_done"; then + if test -z "$predep_objects_CXX"; then + predep_objects_CXX=$p + else + predep_objects_CXX="$predep_objects_CXX $p" + fi + else + if test -z "$postdep_objects_CXX"; then + postdep_objects_CXX=$p + else + postdep_objects_CXX="$postdep_objects_CXX $p" + fi + fi + ;; + + *) ;; # Ignore the rest. + + esac + done + + # Clean up. + rm -f a.out a.exe +else + echo "libtool.m4: error: problem compiling CXX test program" +fi + +$RM -f confest.$objext +CFLAGS=$_lt_libdeps_save_CFLAGS + +# PORTME: override above test on systems where it is broken +case $host_os in +interix[3-9]*) + # Interix 3.5 installs completely hosed .la files for C++, so rather than + # hack all around it, let's just trust "g++" to DTRT. + predep_objects_CXX= + postdep_objects_CXX= + postdeps_CXX= + ;; +esac + + +case " $postdeps_CXX " in +*" -lc "*) archive_cmds_need_lc_CXX=no ;; +esac + compiler_lib_search_dirs_CXX= +if test -n "${compiler_lib_search_path_CXX}"; then + compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | $SED -e 's! -L! !g' -e 's!^ !!'` +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + lt_prog_compiler_wl_CXX= +lt_prog_compiler_pic_CXX= +lt_prog_compiler_static_CXX= + + + # C++ specific cases for pic, static, wl, etc. + if test yes = "$GXX"; then + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_CXX='-Bstatic' + fi + lt_prog_compiler_pic_CXX='-fPIC' + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + lt_prog_compiler_pic_CXX='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the '-m68020' flag to GCC prevents building anything better, + # like '-m68040'. + lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + lt_prog_compiler_pic_CXX='-DDLL_EXPORT' + case $host_os in + os2*) + lt_prog_compiler_static_CXX='$wl-static' + ;; + esac + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic_CXX='-fno-common' + ;; + *djgpp*) + # DJGPP does not support shared libraries at all + lt_prog_compiler_pic_CXX= + ;; + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + lt_prog_compiler_static_CXX= + ;; + interix[3-9]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic_CXX=-Kconform_pic + fi + ;; + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + ;; + *) + lt_prog_compiler_pic_CXX='-fPIC' + ;; + esac + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic_CXX='-fPIC -shared' + ;; + *) + lt_prog_compiler_pic_CXX='-fPIC' + ;; + esac + else + case $host_os in + aix[4-9]*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_CXX='-Bstatic' + else + lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' + fi + ;; + chorus*) + case $cc_basename in + cxch68*) + # Green Hills C++ Compiler + # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" + ;; + esac + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic_CXX='-DDLL_EXPORT' + ;; + dgux*) + case $cc_basename in + ec++*) + lt_prog_compiler_pic_CXX='-KPIC' + ;; + ghcx*) + # Green Hills C++ Compiler + lt_prog_compiler_pic_CXX='-pic' + ;; + *) + ;; + esac + ;; + freebsd* | dragonfly*) + # FreeBSD uses GNU C++ + ;; + hpux9* | hpux10* | hpux11*) + case $cc_basename in + CC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='$wl-a ${wl}archive' + if test ia64 != "$host_cpu"; then + lt_prog_compiler_pic_CXX='+Z' + fi + ;; + aCC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='$wl-a ${wl}archive' + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic_CXX='+Z' + ;; + esac + ;; + *) + ;; + esac + ;; + interix*) + # This is c89, which is MS Visual C++ (no shared libs) + # Anyone wants to do a port? + ;; + irix5* | irix6* | nonstopux*) + case $cc_basename in + CC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='-non_shared' + # CC pic flag -KPIC is the default. + ;; + *) + ;; + esac + ;; + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + KCC*) + # KAI C++ Compiler + lt_prog_compiler_wl_CXX='--backend -Wl,' + lt_prog_compiler_pic_CXX='-fPIC' + ;; + ecpc* ) + # old Intel C++ for x86_64, which still supported -KPIC. + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-static' + ;; + icpc* ) + # Intel C++, used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-fPIC' + lt_prog_compiler_static_CXX='-static' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-fpic' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + cxx*) + # Compaq C++ + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + lt_prog_compiler_pic_CXX= + lt_prog_compiler_static_CXX='-non_shared' + ;; + xlc* | xlC* | bgxl[cC]* | mpixl[cC]*) + # IBM XL 8.0, 9.0 on PPC and BlueGene + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-qpic' + lt_prog_compiler_static_CXX='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + lt_prog_compiler_wl_CXX='-Qoption ld ' + ;; + esac + ;; + esac + ;; + lynxos*) + ;; + m88k*) + ;; + mvs*) + case $cc_basename in + cxx*) + lt_prog_compiler_pic_CXX='-W c,exportall' + ;; + *) + ;; + esac + ;; + netbsd* | netbsdelf*-gnu) + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic_CXX='-fPIC -shared' + ;; + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + lt_prog_compiler_wl_CXX='--backend -Wl,' + ;; + RCC*) + # Rational C++ 2.4.1 + lt_prog_compiler_pic_CXX='-pic' + ;; + cxx*) + # Digital/Compaq C++ + lt_prog_compiler_wl_CXX='-Wl,' + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + lt_prog_compiler_pic_CXX= + lt_prog_compiler_static_CXX='-non_shared' + ;; + *) + ;; + esac + ;; + psos*) + ;; + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + lt_prog_compiler_wl_CXX='-Qoption ld ' + ;; + gcx*) + # Green Hills C++ Compiler + lt_prog_compiler_pic_CXX='-PIC' + ;; + *) + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + lt_prog_compiler_pic_CXX='-pic' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + lcc*) + # Lucid + lt_prog_compiler_pic_CXX='-pic' + ;; + *) + ;; + esac + ;; + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + case $cc_basename in + CC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + lt_prog_compiler_pic_CXX='-KPIC' + ;; + *) + ;; + esac + ;; + vxworks*) + ;; + *) + lt_prog_compiler_can_build_shared_CXX=no + ;; + esac + fi + +case $host_os in + # For platforms that do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic_CXX= + ;; + *) + lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC" + ;; +esac + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 +printf %s "checking for $compiler option to produce PIC... " >&6; } +if test ${lt_cv_prog_compiler_pic_CXX+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_prog_compiler_pic_CXX=$lt_prog_compiler_pic_CXX +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX" >&5 +printf "%s\n" "$lt_cv_prog_compiler_pic_CXX" >&6; } +lt_prog_compiler_pic_CXX=$lt_cv_prog_compiler_pic_CXX + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic_CXX"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 +printf %s "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; } +if test ${lt_cv_prog_compiler_pic_works_CXX+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_prog_compiler_pic_works_CXX=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC" ## exclude from sc_useless_quotes_in_assignment + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_pic_works_CXX=yes + fi + fi + $RM conftest* + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5 +printf "%s\n" "$lt_cv_prog_compiler_pic_works_CXX" >&6; } + +if test yes = "$lt_cv_prog_compiler_pic_works_CXX"; then + case $lt_prog_compiler_pic_CXX in + "" | " "*) ;; + *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; + esac +else + lt_prog_compiler_pic_CXX= + lt_prog_compiler_can_build_shared_CXX=no +fi + +fi + + + + + +# +# Check to make sure the static flag actually works. +# +wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\" +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +printf %s "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } +if test ${lt_cv_prog_compiler_static_works_CXX+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_prog_compiler_static_works_CXX=no + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS $lt_tmp_static_flag" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_static_works_CXX=yes + fi + else + lt_cv_prog_compiler_static_works_CXX=yes + fi + fi + $RM -r conftest* + LDFLAGS=$save_LDFLAGS + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5 +printf "%s\n" "$lt_cv_prog_compiler_static_works_CXX" >&6; } + +if test yes = "$lt_cv_prog_compiler_static_works_CXX"; then + : +else + lt_prog_compiler_static_CXX= +fi + + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if test ${lt_cv_prog_compiler_c_o_CXX+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_prog_compiler_c_o_CXX=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o_CXX=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 +printf "%s\n" "$lt_cv_prog_compiler_c_o_CXX" >&6; } + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if test ${lt_cv_prog_compiler_c_o_CXX+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_prog_compiler_c_o_CXX=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o_CXX=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 +printf "%s\n" "$lt_cv_prog_compiler_c_o_CXX" >&6; } + + + + +hard_links=nottested +if test no = "$lt_cv_prog_compiler_c_o_CXX" && test no != "$need_locks"; then + # do not overwrite the value of need_locks provided by the user + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 +printf %s "checking if we can lock with hard links... " >&6; } + hard_links=yes + $RM conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 +printf "%s\n" "$hard_links" >&6; } + if test no = "$hard_links"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5 +printf "%s\n" "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +printf %s "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' + case $host_os in + aix[4-9]*) + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to GNU nm, but means don't demangle to AIX nm. + # Without the "-l" option, or with the "-B" option, AIX nm treats + # weak defined symbols like other global defined symbols, whereas + # GNU nm marks them as "W". + # While the 'weak' keyword is ignored in the Export File, we need + # it in the Import File for the 'aix-soname' feature, so we have + # to replace the "-B" option with "-P" for AIX nm. + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds_CXX='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' + fi + ;; + pw32*) + export_symbols_cmds_CXX=$ltdll_cmds + ;; + cygwin* | mingw* | cegcc*) + case $cc_basename in + cl*) + exclude_expsyms_CXX='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + ;; + *) + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' + exclude_expsyms_CXX='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' + ;; + esac + ;; + linux* | k*bsd*-gnu | gnu*) + link_all_deplibs_CXX=no + ;; + *) + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 +printf "%s\n" "$ld_shlibs_CXX" >&6; } +test no = "$ld_shlibs_CXX" && can_build_shared=no + +with_gnu_ld_CXX=$with_gnu_ld + + + + + + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc_CXX" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc_CXX=yes + + if test yes,yes = "$GCC,$enable_shared"; then + case $archive_cmds_CXX in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 +printf %s "checking whether -lc should be explicitly linked in... " >&6; } +if test ${lt_cv_archive_cmds_need_lc_CXX+y} +then : + printf %s "(cached) " >&6 +else $as_nop + $RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl_CXX + pic_flag=$lt_prog_compiler_pic_CXX + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag_CXX + allow_undefined_flag_CXX= + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 + (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + then + lt_cv_archive_cmds_need_lc_CXX=no + else + lt_cv_archive_cmds_need_lc_CXX=yes + fi + allow_undefined_flag_CXX=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX" >&5 +printf "%s\n" "$lt_cv_archive_cmds_need_lc_CXX" >&6; } + archive_cmds_need_lc_CXX=$lt_cv_archive_cmds_need_lc_CXX + ;; + esac + fi + ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 +printf %s "checking dynamic linker characteristics... " >&6; } + +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=.so +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + + + +case $host_os in +aix3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='$libname$release$shared_ext$major' + ;; + +aix[4-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test ia64 = "$host_cpu"; then + # AIX 5 supports IA64 + library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line '#! .'. This would cause the generated library to + # depend on '.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # Using Import Files as archive members, it is possible to support + # filename-based versioning of shared library archives on AIX. While + # this would work for both with and without runtime linking, it will + # prevent static linking of such archives. So we do filename-based + # shared library versioning with .so extension only, which is used + # when both runtime linking and shared linking is enabled. + # Unfortunately, runtime linking may impact performance, so we do + # not want this to be the default eventually. Also, we use the + # versioned .so libs for executables only if there is the -brtl + # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. + # To allow for filename-based versioning support, we need to create + # libNAME.so.V as an archive file, containing: + # *) an Import File, referring to the versioned filename of the + # archive as well as the shared archive member, telling the + # bitwidth (32 or 64) of that shared object, and providing the + # list of exported symbols of that shared object, eventually + # decorated with the 'weak' keyword + # *) the shared object with the F_LOADONLY flag set, to really avoid + # it being seen by the linker. + # At run time we better use the real file rather than another symlink, + # but for link time we create the symlink libNAME.so -> libNAME.so.V + + case $with_aix_soname,$aix_use_runtimelinking in + # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + aix,yes) # traditional libtool + dynamic_linker='AIX unversionable lib.so' + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + aix,no) # traditional AIX only + dynamic_linker='AIX lib.a(lib.so.V)' + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + ;; + svr4,*) # full svr4 only + dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,yes) # both, prefer svr4 + dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # unpreferred sharedlib libNAME.a needs extra handling + postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' + postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,no) # both, prefer aix + dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)" + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling + postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' + postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' + ;; + esac + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + m68k) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='$libname$shared_ext' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + + case $GCC,$cc_basename in + yes,*) + # gcc + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + ;; + esac + dynamic_linker='Win32 ld.exe' + ;; + + *,cl*) + # Native MSVC + libname_spec='$name' + soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + library_names_spec='$libname.dll.lib' + + case $build_os in + mingw*) + sys_lib_search_path_spec= + lt_save_ifs=$IFS + IFS=';' + for lt_path in $LIB + do + IFS=$lt_save_ifs + # Let DOS variable expansion print the short 8.3 style file name. + lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` + sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" + done + IFS=$lt_save_ifs + # Convert to MSYS style. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` + ;; + cygwin*) + # Convert to unix form, then to dos form, then back to unix form + # but this time dos style (no spaces!) so that the unix form looks + # like /cygdrive/c/PROGRA~1:/cygdr... + sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` + sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` + sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + ;; + *) + sys_lib_search_path_spec=$LIB + if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # FIXME: find the short name or the path components, as spaces are + # common. (e.g. "Program Files" -> "PROGRA~1") + ;; + esac + + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + dynamic_linker='Win32 link.exe' + ;; + + *) + # Assume MSVC wrapper + library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib' + dynamic_linker='Win32 ld.exe' + ;; + esac + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$major$shared_ext $libname$shared_ext' + soname_spec='$libname$release$major$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[23].*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2.*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +haiku*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + dynamic_linker="$host_os runtime_loader" + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LIBRARY_PATH + shlibpath_overrides_runpath=no + sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + if test 32 = "$HPUX_IA64_MODE"; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + sys_lib_dlsearch_path_spec=/usr/lib/hpux32 + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + sys_lib_dlsearch_path_spec=/usr/lib/hpux64 + fi + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555, ... + postinstall_cmds='chmod 555 $lib' + # or fails outright, so override atomically: + install_override_mode=555 + ;; + +interix[3-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test yes = "$lt_cv_prog_gnu_ld"; then + version_type=linux # correct to gnu/linux during the next big refactor + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff" + sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +linux*android*) + version_type=none # Android doesn't support versioned libraries. + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext' + soname_spec='$libname$release$shared_ext' + finish_cmds= + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + dynamic_linker='Android linker' + # Don't embed -rpath directories since the linker doesn't support them. + hardcode_libdir_flag_spec_CXX='-L$libdir' + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + + # Some binutils ld are patched to set DT_RUNPATH + if test ${lt_cv_shlibpath_overrides_runpath+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_shlibpath_overrides_runpath=no + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \ + LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\"" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO" +then : + if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null +then : + lt_cv_shlibpath_overrides_runpath=yes +fi +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + +fi + + shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Ideally, we could use ldconfig to report *all* directores which are + # searched for libraries, however this is still not possible. Aside from not + # being certain /sbin/ldconfig is available, command + # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, + # even though it is searched at run-time. Try to do the best guess by + # appending ld.so.conf contents (and includes) to the search path. + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsdelf*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='NetBSD ld.elf_so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; + +openbsd* | bitrig*) + version_type=sunos + sys_lib_dlsearch_path_spec=/usr/lib + need_lib_prefix=no + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + need_version=no + else + need_version=yes + fi + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +os2*) + libname_spec='$name' + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + # OS/2 can only load a DLL with a base name of 8 characters or less. + soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; + v=$($ECHO $release$versuffix | tr -d .-); + n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); + $ECHO $n$v`$shared_ext' + library_names_spec='${libname}_dll.$libext' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=BEGINLIBPATH + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test yes = "$with_gnu_ld"; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec; then + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext' + soname_spec='$libname$shared_ext.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=sco + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test yes = "$with_gnu_ld"; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 +printf "%s\n" "$dynamic_linker" >&6; } +test no = "$dynamic_linker" && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test yes = "$GCC"; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then + sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec +fi + +if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then + sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec +fi + +# remember unaugmented sys_lib_dlsearch_path content for libtool script decls... +configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec + +# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code +func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" + +# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool +configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 +printf %s "checking how to hardcode library paths into programs... " >&6; } +hardcode_action_CXX= +if test -n "$hardcode_libdir_flag_spec_CXX" || + test -n "$runpath_var_CXX" || + test yes = "$hardcode_automatic_CXX"; then + + # We can hardcode non-existent directories. + if test no != "$hardcode_direct_CXX" && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" && + test no != "$hardcode_minus_L_CXX"; then + # Linking always hardcodes the temporary library directory. + hardcode_action_CXX=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action_CXX=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action_CXX=unsupported +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5 +printf "%s\n" "$hardcode_action_CXX" >&6; } + +if test relink = "$hardcode_action_CXX" || + test yes = "$inherit_rpath_CXX"; then + # Fast installation is not supported + enable_fast_install=no +elif test yes = "$shlibpath_overrides_runpath" || + test no = "$enable_shared"; then + # Fast installation is not necessary + enable_fast_install=needless +fi + + + + + + + + fi # test -n "$compiler" + + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS + LDCXX=$LD + LD=$lt_save_LD + GCC=$lt_save_GCC + with_gnu_ld=$lt_save_with_gnu_ld + lt_cv_path_LDCXX=$lt_cv_path_LD + lt_cv_path_LD=$lt_save_path_LD + lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld + lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld +fi # test yes != "$_lt_caught_CXX_error" + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + + + + + + + + + + + + + + ac_config_commands="$ac_config_commands libtool" + + + + +# Only expand once: + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5 +printf %s "checking whether byte ordering is bigendian... " >&6; } +if test ${ac_cv_c_bigendian+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_c_bigendian=unknown + # See if we're dealing with a universal compiler. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifndef __APPLE_CC__ + not a universal capable compiler + #endif + typedef int dummy; + +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + + # Check for potential -arch flags. It is not universal unless + # there are at least two -arch flags with different values. + ac_arch= + ac_prev= + for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do + if test -n "$ac_prev"; then + case $ac_word in + i?86 | x86_64 | ppc | ppc64) + if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then + ac_arch=$ac_word + else + ac_cv_c_bigendian=universal + break + fi + ;; + esac + ac_prev= + elif test "x$ac_word" = "x-arch"; then + ac_prev=arch + fi + done +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + if test $ac_cv_c_bigendian = unknown; then + # See if sys/param.h defines the BYTE_ORDER macro. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + #include + +int +main (void) +{ +#if ! (defined BYTE_ORDER && defined BIG_ENDIAN \ + && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \ + && LITTLE_ENDIAN) + bogus endian macros + #endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + # It does; now see whether it defined to BIG_ENDIAN or not. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + #include + +int +main (void) +{ +#if BYTE_ORDER != BIG_ENDIAN + not big endian + #endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_c_bigendian=yes +else $as_nop + ac_cv_c_bigendian=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + fi + if test $ac_cv_c_bigendian = unknown; then + # See if defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris). + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +int +main (void) +{ +#if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN) + bogus endian macros + #endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + # It does; now see whether it defined to _BIG_ENDIAN or not. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +int +main (void) +{ +#ifndef _BIG_ENDIAN + not big endian + #endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_c_bigendian=yes +else $as_nop + ac_cv_c_bigendian=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + fi + if test $ac_cv_c_bigendian = unknown; then + # Compile a test program. + if test "$cross_compiling" = yes +then : + # Try to guess by grepping values from an object file. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +unsigned short int ascii_mm[] = + { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; + unsigned short int ascii_ii[] = + { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; + int use_ascii (int i) { + return ascii_mm[i] + ascii_ii[i]; + } + unsigned short int ebcdic_ii[] = + { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; + unsigned short int ebcdic_mm[] = + { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; + int use_ebcdic (int i) { + return ebcdic_mm[i] + ebcdic_ii[i]; + } + extern int foo; + +int +main (void) +{ +return use_ascii (foo) == use_ebcdic (foo); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then + ac_cv_c_bigendian=yes + fi + if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then + if test "$ac_cv_c_bigendian" = unknown; then + ac_cv_c_bigendian=no + else + # finding both strings is unlikely to happen, but who knows? + ac_cv_c_bigendian=unknown + fi + fi +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_includes_default +int +main (void) +{ + + /* Are we little or big endian? From Harbison&Steele. */ + union + { + long int l; + char c[sizeof (long int)]; + } u; + u.l = 1; + return u.c[sizeof (long int) - 1] == 1; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + ac_cv_c_bigendian=no +else $as_nop + ac_cv_c_bigendian=yes +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + fi +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5 +printf "%s\n" "$ac_cv_c_bigendian" >&6; } + case $ac_cv_c_bigendian in #( + yes) + printf "%s\n" "#define WORDS_BIGENDIAN 1" >>confdefs.h +;; #( + no) + ;; #( + universal) + +printf "%s\n" "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h + + ;; #( + *) + as_fn_error $? "unknown endianness + presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;; + esac + + +# Check whether --enable-largefile was given. +if test ${enable_largefile+y} +then : + enableval=$enable_largefile; +fi + +if test "$enable_largefile" != no; then + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for special C compiler options needed for large files" >&5 +printf %s "checking for special C compiler options needed for large files... " >&6; } +if test ${ac_cv_sys_largefile_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_sys_largefile_CC=no + if test "$GCC" != yes; then + ac_save_CC=$CC + while :; do + # IRIX 6.2 and later do not support large files by default, + # so use the C compiler's -n32 option if that helps. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 31 << 31) - 1 + ((off_t) 1 << 31 << 31)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main (void) +{ + + ; + return 0; +} +_ACEOF + if ac_fn_c_try_compile "$LINENO" +then : + break +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam + CC="$CC -n32" + if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_sys_largefile_CC=' -n32'; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam + break + done + CC=$ac_save_CC + rm -f conftest.$ac_ext + fi +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_CC" >&5 +printf "%s\n" "$ac_cv_sys_largefile_CC" >&6; } + if test "$ac_cv_sys_largefile_CC" != no; then + CC=$CC$ac_cv_sys_largefile_CC + fi + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for _FILE_OFFSET_BITS value needed for large files" >&5 +printf %s "checking for _FILE_OFFSET_BITS value needed for large files... " >&6; } +if test ${ac_cv_sys_file_offset_bits+y} +then : + printf %s "(cached) " >&6 +else $as_nop + while :; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 31 << 31) - 1 + ((off_t) 1 << 31 << 31)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_sys_file_offset_bits=no; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#define _FILE_OFFSET_BITS 64 +#include + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 31 << 31) - 1 + ((off_t) 1 << 31 << 31)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_sys_file_offset_bits=64; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + ac_cv_sys_file_offset_bits=unknown + break +done +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_file_offset_bits" >&5 +printf "%s\n" "$ac_cv_sys_file_offset_bits" >&6; } +case $ac_cv_sys_file_offset_bits in #( + no | unknown) ;; + *) +printf "%s\n" "#define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits" >>confdefs.h +;; +esac +rm -rf conftest* + if test $ac_cv_sys_file_offset_bits = unknown; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for _LARGE_FILES value needed for large files" >&5 +printf %s "checking for _LARGE_FILES value needed for large files... " >&6; } +if test ${ac_cv_sys_large_files+y} +then : + printf %s "(cached) " >&6 +else $as_nop + while :; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 31 << 31) - 1 + ((off_t) 1 << 31 << 31)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_sys_large_files=no; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#define _LARGE_FILES 1 +#include + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 31 << 31) - 1 + ((off_t) 1 << 31 << 31)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_sys_large_files=1; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + ac_cv_sys_large_files=unknown + break +done +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_large_files" >&5 +printf "%s\n" "$ac_cv_sys_large_files" >&6; } +case $ac_cv_sys_large_files in #( + no | unknown) ;; + *) +printf "%s\n" "#define _LARGE_FILES $ac_cv_sys_large_files" >>confdefs.h +;; +esac +rm -rf conftest* + fi +fi + + +# Crypto backends + +found_crypto=none +found_crypto_str="" +support_clear_memory=no +crypto_errors="" + + + + + + + +# Check whether --with-crypto was given. +if test ${with_crypto+y} +then : + withval=$with_crypto; use_crypto=$withval +else $as_nop + use_crypto=auto + +fi + + +case "${use_crypto}" in + auto|openssl|libgcrypt|mbedtls|wincng) + + if test "X$prefix" = "XNONE"; then + acl_final_prefix="$ac_default_prefix" + else + acl_final_prefix="$prefix" + fi + if test "X$exec_prefix" = "XNONE"; then + acl_final_exec_prefix='${prefix}' + else + acl_final_exec_prefix="$exec_prefix" + fi + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + eval acl_final_exec_prefix=\"$acl_final_exec_prefix\" + prefix="$acl_save_prefix" + + +# Check whether --with-gnu-ld was given. +if test ${with_gnu_ld+y} +then : + withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes +else $as_nop + with_gnu_ld=no +fi + +# Prepare PATH_SEPARATOR. +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ld used by GCC" >&5 +printf %s "checking for ld used by GCC... " >&6; } + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | [A-Za-z]:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the path of ld + ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` + while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do + ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 +printf %s "checking for GNU ld... " >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 +printf %s "checking for non-GNU ld... " >&6; } +fi +if test ${acl_cv_path_LD+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -z "$LD"; then + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" + for ac_dir in $PATH; do + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + acl_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some GNU ld's only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$acl_cv_path_LD" -v 2>&1 < /dev/null` in + *GNU* | *'with BFD'*) + test "$with_gnu_ld" != no && break ;; + *) + test "$with_gnu_ld" != yes && break ;; + esac + fi + done + IFS="$ac_save_ifs" +else + acl_cv_path_LD="$LD" # Let the user override the test with a path. +fi +fi + +LD="$acl_cv_path_LD" +if test -n "$LD"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LD" >&5 +printf "%s\n" "$LD" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi +test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 +printf %s "checking if the linker ($LD) is GNU ld... " >&6; } +if test ${acl_cv_prog_gnu_ld+y} +then : + printf %s "(cached) " >&6 +else $as_nop + # I'd rather use --version here, but apparently some GNU ld's only accept -v. +case `$LD -v 2>&1 &5 +printf "%s\n" "$acl_cv_prog_gnu_ld" >&6; } +with_gnu_ld=$acl_cv_prog_gnu_ld + + + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for shared library run path origin" >&5 +printf %s "checking for shared library run path origin... " >&6; } +if test ${acl_cv_rpath+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \ + ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh + . ./conftest.sh + rm -f ./conftest.sh + acl_cv_rpath=done + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $acl_cv_rpath" >&5 +printf "%s\n" "$acl_cv_rpath" >&6; } + wl="$acl_cv_wl" + acl_libext="$acl_cv_libext" + acl_shlibext="$acl_cv_shlibext" + acl_libname_spec="$acl_cv_libname_spec" + acl_library_names_spec="$acl_cv_library_names_spec" + acl_hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec" + acl_hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator" + acl_hardcode_direct="$acl_cv_hardcode_direct" + acl_hardcode_minus_L="$acl_cv_hardcode_minus_L" + # Check whether --enable-rpath was given. +if test ${enable_rpath+y} +then : + enableval=$enable_rpath; : +else $as_nop + enable_rpath=yes +fi + + + + acl_libdirstem=lib + searchpath=`(LC_ALL=C $CC -print-search-dirs) 2>/dev/null | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'` + if test -n "$searchpath"; then + acl_save_IFS="${IFS= }"; IFS=":" + for searchdir in $searchpath; do + if test -d "$searchdir"; then + case "$searchdir" in + */lib64/ | */lib64 ) acl_libdirstem=lib64 ;; + *) searchdir=`cd "$searchdir" && pwd` + case "$searchdir" in + */lib64 ) acl_libdirstem=lib64 ;; + esac ;; + esac + fi + done + IFS="$acl_save_IFS" + fi + + +if test "$use_crypto" = "auto" && test "$found_crypto" = "none" || test "$use_crypto" = "openssl"; then + + + libssh2_save_CPPFLAGS="$CPPFLAGS" + libssh2_save_LDFLAGS="$LDFLAGS" + + if test "${with_libssl_prefix+set}" = set; then + CPPFLAGS="$CPPFLAGS${CPPFLAGS:+ }-I${with_libssl_prefix}/include" + LDFLAGS="$LDFLAGS${LDFLAGS:+ }-L${with_libssl_prefix}/lib" + fi + + + + + + + + + + + + use_additional=yes + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + +# Check whether --with-libssl-prefix was given. +if test ${with_libssl_prefix+y} +then : + withval=$with_libssl_prefix; + if test "X$withval" = "Xno"; then + use_additional=no + else + if test "X$withval" = "X"; then + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + else + additional_includedir="$withval/include" + additional_libdir="$withval/$acl_libdirstem" + fi + fi + +fi + + LIBSSL= + LTLIBSSL= + INCSSL= + LIBSSL_PREFIX= + rpathdirs= + ltrpathdirs= + names_already_handled= + names_next_round='ssl crypto' + while test -n "$names_next_round"; do + names_this_round="$names_next_round" + names_next_round= + for name in $names_this_round; do + already_handled= + for n in $names_already_handled; do + if test "$n" = "$name"; then + already_handled=yes + break + fi + done + if test -z "$already_handled"; then + names_already_handled="$names_already_handled $name" + uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'` + eval value=\"\$HAVE_LIB$uppername\" + if test -n "$value"; then + if test "$value" = yes; then + eval value=\"\$LIB$uppername\" + test -z "$value" || LIBSSL="${LIBSSL}${LIBSSL:+ }$value" + eval value=\"\$LTLIB$uppername\" + test -z "$value" || LTLIBSSL="${LTLIBSSL}${LTLIBSSL:+ }$value" + else + : + fi + else + found_dir= + found_la= + found_so= + found_a= + eval libname=\"$acl_libname_spec\" # typically: libname=lib$name + if test -n "$acl_shlibext"; then + shrext=".$acl_shlibext" # typically: shrext=.so + else + shrext= + fi + if test $use_additional = yes; then + dir="$additional_libdir" + if test -n "$acl_shlibext"; then + if test -f "$dir/$libname$shrext"; then + found_dir="$dir" + found_so="$dir/$libname$shrext" + else + if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then + ver=`(cd "$dir" && \ + for f in "$libname$shrext".*; do echo "$f"; done \ + | sed -e "s,^$libname$shrext\\\\.,," \ + | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ + | sed 1q ) 2>/dev/null` + if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then + found_dir="$dir" + found_so="$dir/$libname$shrext.$ver" + fi + else + eval library_names=\"$acl_library_names_spec\" + for f in $library_names; do + if test -f "$dir/$f"; then + found_dir="$dir" + found_so="$dir/$f" + break + fi + done + fi + fi + fi + if test "X$found_dir" = "X"; then + if test -f "$dir/$libname.$acl_libext"; then + found_dir="$dir" + found_a="$dir/$libname.$acl_libext" + fi + fi + if test "X$found_dir" != "X"; then + if test -f "$dir/$libname.la"; then + found_la="$dir/$libname.la" + fi + fi + fi + if test "X$found_dir" = "X"; then + for x in $LDFLAGS $LTLIBSSL; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + case "$x" in + -L*) + dir=`echo "X$x" | sed -e 's/^X-L//'` + if test -n "$acl_shlibext"; then + if test -f "$dir/$libname$shrext"; then + found_dir="$dir" + found_so="$dir/$libname$shrext" + else + if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then + ver=`(cd "$dir" && \ + for f in "$libname$shrext".*; do echo "$f"; done \ + | sed -e "s,^$libname$shrext\\\\.,," \ + | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ + | sed 1q ) 2>/dev/null` + if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then + found_dir="$dir" + found_so="$dir/$libname$shrext.$ver" + fi + else + eval library_names=\"$acl_library_names_spec\" + for f in $library_names; do + if test -f "$dir/$f"; then + found_dir="$dir" + found_so="$dir/$f" + break + fi + done + fi + fi + fi + if test "X$found_dir" = "X"; then + if test -f "$dir/$libname.$acl_libext"; then + found_dir="$dir" + found_a="$dir/$libname.$acl_libext" + fi + fi + if test "X$found_dir" != "X"; then + if test -f "$dir/$libname.la"; then + found_la="$dir/$libname.la" + fi + fi + ;; + esac + if test "X$found_dir" != "X"; then + break + fi + done + fi + if test "X$found_dir" != "X"; then + LTLIBSSL="${LTLIBSSL}${LTLIBSSL:+ }-L$found_dir -l$name" + if test "X$found_so" != "X"; then + if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/$acl_libdirstem"; then + LIBSSL="${LIBSSL}${LIBSSL:+ }$found_so" + else + haveit= + for x in $ltrpathdirs; do + if test "X$x" = "X$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + ltrpathdirs="$ltrpathdirs $found_dir" + fi + if test "$acl_hardcode_direct" = yes; then + LIBSSL="${LIBSSL}${LIBSSL:+ }$found_so" + else + if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then + LIBSSL="${LIBSSL}${LIBSSL:+ }$found_so" + haveit= + for x in $rpathdirs; do + if test "X$x" = "X$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + rpathdirs="$rpathdirs $found_dir" + fi + else + haveit= + for x in $LDFLAGS $LIBSSL; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-L$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + LIBSSL="${LIBSSL}${LIBSSL:+ }-L$found_dir" + fi + if test "$acl_hardcode_minus_L" != no; then + LIBSSL="${LIBSSL}${LIBSSL:+ }$found_so" + else + LIBSSL="${LIBSSL}${LIBSSL:+ }-l$name" + fi + fi + fi + fi + else + if test "X$found_a" != "X"; then + LIBSSL="${LIBSSL}${LIBSSL:+ }$found_a" + else + LIBSSL="${LIBSSL}${LIBSSL:+ }-L$found_dir -l$name" + fi + fi + additional_includedir= + case "$found_dir" in + */$acl_libdirstem | */$acl_libdirstem/) + basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'` + LIBSSL_PREFIX="$basedir" + additional_includedir="$basedir/include" + ;; + esac + if test "X$additional_includedir" != "X"; then + if test "X$additional_includedir" != "X/usr/include"; then + haveit= + if test "X$additional_includedir" = "X/usr/local/include"; then + if test -n "$GCC"; then + case $host_os in + linux* | gnu* | k*bsd*-gnu) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + for x in $CPPFLAGS $INCSSL; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-I$additional_includedir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_includedir"; then + INCSSL="${INCSSL}${INCSSL:+ }-I$additional_includedir" + fi + fi + fi + fi + fi + if test -n "$found_la"; then + save_libdir="$libdir" + case "$found_la" in + */* | *\\*) . "$found_la" ;; + *) . "./$found_la" ;; + esac + libdir="$save_libdir" + for dep in $dependency_libs; do + case "$dep" in + -L*) + additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` + if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then + haveit= + if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then + if test -n "$GCC"; then + case $host_os in + linux* | gnu* | k*bsd*-gnu) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + haveit= + for x in $LDFLAGS $LIBSSL; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + LIBSSL="${LIBSSL}${LIBSSL:+ }-L$additional_libdir" + fi + fi + haveit= + for x in $LDFLAGS $LTLIBSSL; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + LTLIBSSL="${LTLIBSSL}${LTLIBSSL:+ }-L$additional_libdir" + fi + fi + fi + fi + ;; + -R*) + dir=`echo "X$dep" | sed -e 's/^X-R//'` + if test "$enable_rpath" != no; then + haveit= + for x in $rpathdirs; do + if test "X$x" = "X$dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + rpathdirs="$rpathdirs $dir" + fi + haveit= + for x in $ltrpathdirs; do + if test "X$x" = "X$dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + ltrpathdirs="$ltrpathdirs $dir" + fi + fi + ;; + -l*) + names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` + ;; + *.la) + names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` + ;; + *) + LIBSSL="${LIBSSL}${LIBSSL:+ }$dep" + LTLIBSSL="${LTLIBSSL}${LTLIBSSL:+ }$dep" + ;; + esac + done + fi + else + LIBSSL="${LIBSSL}${LIBSSL:+ }-l$name" + LTLIBSSL="${LTLIBSSL}${LTLIBSSL:+ }-l$name" + fi + fi + fi + done + done + if test "X$rpathdirs" != "X"; then + if test -n "$acl_hardcode_libdir_separator"; then + alldirs= + for found_dir in $rpathdirs; do + alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir" + done + acl_save_libdir="$libdir" + libdir="$alldirs" + eval flag=\"$acl_hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + LIBSSL="${LIBSSL}${LIBSSL:+ }$flag" + else + for found_dir in $rpathdirs; do + acl_save_libdir="$libdir" + libdir="$found_dir" + eval flag=\"$acl_hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + LIBSSL="${LIBSSL}${LIBSSL:+ }$flag" + done + fi + fi + if test "X$ltrpathdirs" != "X"; then + for found_dir in $ltrpathdirs; do + LTLIBSSL="${LTLIBSSL}${LTLIBSSL:+ }-R$found_dir" + done + fi + + + ac_save_CPPFLAGS="$CPPFLAGS" + + for element in $INCSSL; do + haveit= + for x in $CPPFLAGS; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X$element"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element" + fi + done + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for libssl" >&5 +printf %s "checking for libssl... " >&6; } +if test ${ac_cv_libssl+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + ac_save_LIBS="$LIBS" + LIBS="$LIBS $LIBSSL" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_libssl=yes +else $as_nop + ac_cv_libssl=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + LIBS="$ac_save_LIBS" + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_libssl" >&5 +printf "%s\n" "$ac_cv_libssl" >&6; } + if test "$ac_cv_libssl" = yes; then + HAVE_LIBSSL=yes + +printf "%s\n" "#define HAVE_LIBSSL 1" >>confdefs.h + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to link with libssl" >&5 +printf %s "checking how to link with libssl... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LIBSSL" >&5 +printf "%s\n" "$LIBSSL" >&6; } + else + HAVE_LIBSSL=no + CPPFLAGS="$ac_save_CPPFLAGS" + LIBSSL= + LTLIBSSL= + LIBSSL_PREFIX= + fi + + + + + + + + + LDFLAGS="$libssh2_save_LDFLAGS" + + if test "$ac_cv_libssl" = "yes"; then : + + +printf "%s\n" "#define LIBSSH2_OPENSSL 1" >>confdefs.h + + LIBSREQUIRED="$LIBSREQUIRED${LIBSREQUIRED:+ }libssl libcrypto" + + # Not all OpenSSL have AES-CTR functions. + libssh2_save_LIBS="$LIBS" + LIBS="$LIBS $LIBSSL" + ac_fn_c_check_func "$LINENO" "EVP_aes_128_ctr" "ac_cv_func_EVP_aes_128_ctr" +if test "x$ac_cv_func_EVP_aes_128_ctr" = xyes +then : + printf "%s\n" "#define HAVE_EVP_AES_128_CTR 1" >>confdefs.h + +fi + + LIBS="$libssh2_save_LIBS" + + found_crypto="openssl" + found_crypto_str="OpenSSL (AES-CTR: ${ac_cv_func_EVP_aes_128_ctr:-N/A})" + + else + CPPFLAGS="$libssh2_save_CPPFLAGS" + fi + + + test "$found_crypto" = "none" && + crypto_errors="${crypto_errors}No openssl crypto library found! +" +fi + +if test "$use_crypto" = "auto" && test "$found_crypto" = "none" || test "$use_crypto" = "libgcrypt"; then + + + libssh2_save_CPPFLAGS="$CPPFLAGS" + libssh2_save_LDFLAGS="$LDFLAGS" + + if test "${with_libgcrypt_prefix+set}" = set; then + CPPFLAGS="$CPPFLAGS${CPPFLAGS:+ }-I${with_libgcrypt_prefix}/include" + LDFLAGS="$LDFLAGS${LDFLAGS:+ }-L${with_libgcrypt_prefix}/lib" + fi + + + + + + + + + + + + use_additional=yes + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + +# Check whether --with-libgcrypt-prefix was given. +if test ${with_libgcrypt_prefix+y} +then : + withval=$with_libgcrypt_prefix; + if test "X$withval" = "Xno"; then + use_additional=no + else + if test "X$withval" = "X"; then + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + else + additional_includedir="$withval/include" + additional_libdir="$withval/$acl_libdirstem" + fi + fi + +fi + + LIBGCRYPT= + LTLIBGCRYPT= + INCGCRYPT= + LIBGCRYPT_PREFIX= + rpathdirs= + ltrpathdirs= + names_already_handled= + names_next_round='gcrypt ' + while test -n "$names_next_round"; do + names_this_round="$names_next_round" + names_next_round= + for name in $names_this_round; do + already_handled= + for n in $names_already_handled; do + if test "$n" = "$name"; then + already_handled=yes + break + fi + done + if test -z "$already_handled"; then + names_already_handled="$names_already_handled $name" + uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'` + eval value=\"\$HAVE_LIB$uppername\" + if test -n "$value"; then + if test "$value" = yes; then + eval value=\"\$LIB$uppername\" + test -z "$value" || LIBGCRYPT="${LIBGCRYPT}${LIBGCRYPT:+ }$value" + eval value=\"\$LTLIB$uppername\" + test -z "$value" || LTLIBGCRYPT="${LTLIBGCRYPT}${LTLIBGCRYPT:+ }$value" + else + : + fi + else + found_dir= + found_la= + found_so= + found_a= + eval libname=\"$acl_libname_spec\" # typically: libname=lib$name + if test -n "$acl_shlibext"; then + shrext=".$acl_shlibext" # typically: shrext=.so + else + shrext= + fi + if test $use_additional = yes; then + dir="$additional_libdir" + if test -n "$acl_shlibext"; then + if test -f "$dir/$libname$shrext"; then + found_dir="$dir" + found_so="$dir/$libname$shrext" + else + if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then + ver=`(cd "$dir" && \ + for f in "$libname$shrext".*; do echo "$f"; done \ + | sed -e "s,^$libname$shrext\\\\.,," \ + | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ + | sed 1q ) 2>/dev/null` + if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then + found_dir="$dir" + found_so="$dir/$libname$shrext.$ver" + fi + else + eval library_names=\"$acl_library_names_spec\" + for f in $library_names; do + if test -f "$dir/$f"; then + found_dir="$dir" + found_so="$dir/$f" + break + fi + done + fi + fi + fi + if test "X$found_dir" = "X"; then + if test -f "$dir/$libname.$acl_libext"; then + found_dir="$dir" + found_a="$dir/$libname.$acl_libext" + fi + fi + if test "X$found_dir" != "X"; then + if test -f "$dir/$libname.la"; then + found_la="$dir/$libname.la" + fi + fi + fi + if test "X$found_dir" = "X"; then + for x in $LDFLAGS $LTLIBGCRYPT; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + case "$x" in + -L*) + dir=`echo "X$x" | sed -e 's/^X-L//'` + if test -n "$acl_shlibext"; then + if test -f "$dir/$libname$shrext"; then + found_dir="$dir" + found_so="$dir/$libname$shrext" + else + if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then + ver=`(cd "$dir" && \ + for f in "$libname$shrext".*; do echo "$f"; done \ + | sed -e "s,^$libname$shrext\\\\.,," \ + | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ + | sed 1q ) 2>/dev/null` + if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then + found_dir="$dir" + found_so="$dir/$libname$shrext.$ver" + fi + else + eval library_names=\"$acl_library_names_spec\" + for f in $library_names; do + if test -f "$dir/$f"; then + found_dir="$dir" + found_so="$dir/$f" + break + fi + done + fi + fi + fi + if test "X$found_dir" = "X"; then + if test -f "$dir/$libname.$acl_libext"; then + found_dir="$dir" + found_a="$dir/$libname.$acl_libext" + fi + fi + if test "X$found_dir" != "X"; then + if test -f "$dir/$libname.la"; then + found_la="$dir/$libname.la" + fi + fi + ;; + esac + if test "X$found_dir" != "X"; then + break + fi + done + fi + if test "X$found_dir" != "X"; then + LTLIBGCRYPT="${LTLIBGCRYPT}${LTLIBGCRYPT:+ }-L$found_dir -l$name" + if test "X$found_so" != "X"; then + if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/$acl_libdirstem"; then + LIBGCRYPT="${LIBGCRYPT}${LIBGCRYPT:+ }$found_so" + else + haveit= + for x in $ltrpathdirs; do + if test "X$x" = "X$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + ltrpathdirs="$ltrpathdirs $found_dir" + fi + if test "$acl_hardcode_direct" = yes; then + LIBGCRYPT="${LIBGCRYPT}${LIBGCRYPT:+ }$found_so" + else + if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then + LIBGCRYPT="${LIBGCRYPT}${LIBGCRYPT:+ }$found_so" + haveit= + for x in $rpathdirs; do + if test "X$x" = "X$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + rpathdirs="$rpathdirs $found_dir" + fi + else + haveit= + for x in $LDFLAGS $LIBGCRYPT; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-L$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + LIBGCRYPT="${LIBGCRYPT}${LIBGCRYPT:+ }-L$found_dir" + fi + if test "$acl_hardcode_minus_L" != no; then + LIBGCRYPT="${LIBGCRYPT}${LIBGCRYPT:+ }$found_so" + else + LIBGCRYPT="${LIBGCRYPT}${LIBGCRYPT:+ }-l$name" + fi + fi + fi + fi + else + if test "X$found_a" != "X"; then + LIBGCRYPT="${LIBGCRYPT}${LIBGCRYPT:+ }$found_a" + else + LIBGCRYPT="${LIBGCRYPT}${LIBGCRYPT:+ }-L$found_dir -l$name" + fi + fi + additional_includedir= + case "$found_dir" in + */$acl_libdirstem | */$acl_libdirstem/) + basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'` + LIBGCRYPT_PREFIX="$basedir" + additional_includedir="$basedir/include" + ;; + esac + if test "X$additional_includedir" != "X"; then + if test "X$additional_includedir" != "X/usr/include"; then + haveit= + if test "X$additional_includedir" = "X/usr/local/include"; then + if test -n "$GCC"; then + case $host_os in + linux* | gnu* | k*bsd*-gnu) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + for x in $CPPFLAGS $INCGCRYPT; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-I$additional_includedir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_includedir"; then + INCGCRYPT="${INCGCRYPT}${INCGCRYPT:+ }-I$additional_includedir" + fi + fi + fi + fi + fi + if test -n "$found_la"; then + save_libdir="$libdir" + case "$found_la" in + */* | *\\*) . "$found_la" ;; + *) . "./$found_la" ;; + esac + libdir="$save_libdir" + for dep in $dependency_libs; do + case "$dep" in + -L*) + additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` + if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then + haveit= + if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then + if test -n "$GCC"; then + case $host_os in + linux* | gnu* | k*bsd*-gnu) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + haveit= + for x in $LDFLAGS $LIBGCRYPT; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + LIBGCRYPT="${LIBGCRYPT}${LIBGCRYPT:+ }-L$additional_libdir" + fi + fi + haveit= + for x in $LDFLAGS $LTLIBGCRYPT; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + LTLIBGCRYPT="${LTLIBGCRYPT}${LTLIBGCRYPT:+ }-L$additional_libdir" + fi + fi + fi + fi + ;; + -R*) + dir=`echo "X$dep" | sed -e 's/^X-R//'` + if test "$enable_rpath" != no; then + haveit= + for x in $rpathdirs; do + if test "X$x" = "X$dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + rpathdirs="$rpathdirs $dir" + fi + haveit= + for x in $ltrpathdirs; do + if test "X$x" = "X$dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + ltrpathdirs="$ltrpathdirs $dir" + fi + fi + ;; + -l*) + names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` + ;; + *.la) + names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` + ;; + *) + LIBGCRYPT="${LIBGCRYPT}${LIBGCRYPT:+ }$dep" + LTLIBGCRYPT="${LTLIBGCRYPT}${LTLIBGCRYPT:+ }$dep" + ;; + esac + done + fi + else + LIBGCRYPT="${LIBGCRYPT}${LIBGCRYPT:+ }-l$name" + LTLIBGCRYPT="${LTLIBGCRYPT}${LTLIBGCRYPT:+ }-l$name" + fi + fi + fi + done + done + if test "X$rpathdirs" != "X"; then + if test -n "$acl_hardcode_libdir_separator"; then + alldirs= + for found_dir in $rpathdirs; do + alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir" + done + acl_save_libdir="$libdir" + libdir="$alldirs" + eval flag=\"$acl_hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + LIBGCRYPT="${LIBGCRYPT}${LIBGCRYPT:+ }$flag" + else + for found_dir in $rpathdirs; do + acl_save_libdir="$libdir" + libdir="$found_dir" + eval flag=\"$acl_hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + LIBGCRYPT="${LIBGCRYPT}${LIBGCRYPT:+ }$flag" + done + fi + fi + if test "X$ltrpathdirs" != "X"; then + for found_dir in $ltrpathdirs; do + LTLIBGCRYPT="${LTLIBGCRYPT}${LTLIBGCRYPT:+ }-R$found_dir" + done + fi + + + ac_save_CPPFLAGS="$CPPFLAGS" + + for element in $INCGCRYPT; do + haveit= + for x in $CPPFLAGS; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X$element"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element" + fi + done + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for libgcrypt" >&5 +printf %s "checking for libgcrypt... " >&6; } +if test ${ac_cv_libgcrypt+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + ac_save_LIBS="$LIBS" + LIBS="$LIBS $LIBGCRYPT" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_libgcrypt=yes +else $as_nop + ac_cv_libgcrypt=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + LIBS="$ac_save_LIBS" + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_libgcrypt" >&5 +printf "%s\n" "$ac_cv_libgcrypt" >&6; } + if test "$ac_cv_libgcrypt" = yes; then + HAVE_LIBGCRYPT=yes + +printf "%s\n" "#define HAVE_LIBGCRYPT 1" >>confdefs.h + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to link with libgcrypt" >&5 +printf %s "checking how to link with libgcrypt... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LIBGCRYPT" >&5 +printf "%s\n" "$LIBGCRYPT" >&6; } + else + HAVE_LIBGCRYPT=no + CPPFLAGS="$ac_save_CPPFLAGS" + LIBGCRYPT= + LTLIBGCRYPT= + LIBGCRYPT_PREFIX= + fi + + + + + + + + + LDFLAGS="$libssh2_save_LDFLAGS" + + if test "$ac_cv_libgcrypt" = "yes"; then : + + +printf "%s\n" "#define LIBSSH2_LIBGCRYPT 1" >>confdefs.h + + found_crypto="libgcrypt" + + else + CPPFLAGS="$libssh2_save_CPPFLAGS" + fi + + + test "$found_crypto" = "none" && + crypto_errors="${crypto_errors}No libgcrypt crypto library found! +" +fi + +if test "$use_crypto" = "auto" && test "$found_crypto" = "none" || test "$use_crypto" = "mbedtls"; then + + + libssh2_save_CPPFLAGS="$CPPFLAGS" + libssh2_save_LDFLAGS="$LDFLAGS" + + if test "${with_libmbedcrypto_prefix+set}" = set; then + CPPFLAGS="$CPPFLAGS${CPPFLAGS:+ }-I${with_libmbedcrypto_prefix}/include" + LDFLAGS="$LDFLAGS${LDFLAGS:+ }-L${with_libmbedcrypto_prefix}/lib" + fi + + + + + + + + + + + + use_additional=yes + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + +# Check whether --with-libmbedcrypto-prefix was given. +if test ${with_libmbedcrypto_prefix+y} +then : + withval=$with_libmbedcrypto_prefix; + if test "X$withval" = "Xno"; then + use_additional=no + else + if test "X$withval" = "X"; then + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + else + additional_includedir="$withval/include" + additional_libdir="$withval/$acl_libdirstem" + fi + fi + +fi + + LIBMBEDCRYPTO= + LTLIBMBEDCRYPTO= + INCMBEDCRYPTO= + LIBMBEDCRYPTO_PREFIX= + rpathdirs= + ltrpathdirs= + names_already_handled= + names_next_round='mbedcrypto ' + while test -n "$names_next_round"; do + names_this_round="$names_next_round" + names_next_round= + for name in $names_this_round; do + already_handled= + for n in $names_already_handled; do + if test "$n" = "$name"; then + already_handled=yes + break + fi + done + if test -z "$already_handled"; then + names_already_handled="$names_already_handled $name" + uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'` + eval value=\"\$HAVE_LIB$uppername\" + if test -n "$value"; then + if test "$value" = yes; then + eval value=\"\$LIB$uppername\" + test -z "$value" || LIBMBEDCRYPTO="${LIBMBEDCRYPTO}${LIBMBEDCRYPTO:+ }$value" + eval value=\"\$LTLIB$uppername\" + test -z "$value" || LTLIBMBEDCRYPTO="${LTLIBMBEDCRYPTO}${LTLIBMBEDCRYPTO:+ }$value" + else + : + fi + else + found_dir= + found_la= + found_so= + found_a= + eval libname=\"$acl_libname_spec\" # typically: libname=lib$name + if test -n "$acl_shlibext"; then + shrext=".$acl_shlibext" # typically: shrext=.so + else + shrext= + fi + if test $use_additional = yes; then + dir="$additional_libdir" + if test -n "$acl_shlibext"; then + if test -f "$dir/$libname$shrext"; then + found_dir="$dir" + found_so="$dir/$libname$shrext" + else + if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then + ver=`(cd "$dir" && \ + for f in "$libname$shrext".*; do echo "$f"; done \ + | sed -e "s,^$libname$shrext\\\\.,," \ + | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ + | sed 1q ) 2>/dev/null` + if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then + found_dir="$dir" + found_so="$dir/$libname$shrext.$ver" + fi + else + eval library_names=\"$acl_library_names_spec\" + for f in $library_names; do + if test -f "$dir/$f"; then + found_dir="$dir" + found_so="$dir/$f" + break + fi + done + fi + fi + fi + if test "X$found_dir" = "X"; then + if test -f "$dir/$libname.$acl_libext"; then + found_dir="$dir" + found_a="$dir/$libname.$acl_libext" + fi + fi + if test "X$found_dir" != "X"; then + if test -f "$dir/$libname.la"; then + found_la="$dir/$libname.la" + fi + fi + fi + if test "X$found_dir" = "X"; then + for x in $LDFLAGS $LTLIBMBEDCRYPTO; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + case "$x" in + -L*) + dir=`echo "X$x" | sed -e 's/^X-L//'` + if test -n "$acl_shlibext"; then + if test -f "$dir/$libname$shrext"; then + found_dir="$dir" + found_so="$dir/$libname$shrext" + else + if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then + ver=`(cd "$dir" && \ + for f in "$libname$shrext".*; do echo "$f"; done \ + | sed -e "s,^$libname$shrext\\\\.,," \ + | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ + | sed 1q ) 2>/dev/null` + if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then + found_dir="$dir" + found_so="$dir/$libname$shrext.$ver" + fi + else + eval library_names=\"$acl_library_names_spec\" + for f in $library_names; do + if test -f "$dir/$f"; then + found_dir="$dir" + found_so="$dir/$f" + break + fi + done + fi + fi + fi + if test "X$found_dir" = "X"; then + if test -f "$dir/$libname.$acl_libext"; then + found_dir="$dir" + found_a="$dir/$libname.$acl_libext" + fi + fi + if test "X$found_dir" != "X"; then + if test -f "$dir/$libname.la"; then + found_la="$dir/$libname.la" + fi + fi + ;; + esac + if test "X$found_dir" != "X"; then + break + fi + done + fi + if test "X$found_dir" != "X"; then + LTLIBMBEDCRYPTO="${LTLIBMBEDCRYPTO}${LTLIBMBEDCRYPTO:+ }-L$found_dir -l$name" + if test "X$found_so" != "X"; then + if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/$acl_libdirstem"; then + LIBMBEDCRYPTO="${LIBMBEDCRYPTO}${LIBMBEDCRYPTO:+ }$found_so" + else + haveit= + for x in $ltrpathdirs; do + if test "X$x" = "X$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + ltrpathdirs="$ltrpathdirs $found_dir" + fi + if test "$acl_hardcode_direct" = yes; then + LIBMBEDCRYPTO="${LIBMBEDCRYPTO}${LIBMBEDCRYPTO:+ }$found_so" + else + if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then + LIBMBEDCRYPTO="${LIBMBEDCRYPTO}${LIBMBEDCRYPTO:+ }$found_so" + haveit= + for x in $rpathdirs; do + if test "X$x" = "X$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + rpathdirs="$rpathdirs $found_dir" + fi + else + haveit= + for x in $LDFLAGS $LIBMBEDCRYPTO; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-L$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + LIBMBEDCRYPTO="${LIBMBEDCRYPTO}${LIBMBEDCRYPTO:+ }-L$found_dir" + fi + if test "$acl_hardcode_minus_L" != no; then + LIBMBEDCRYPTO="${LIBMBEDCRYPTO}${LIBMBEDCRYPTO:+ }$found_so" + else + LIBMBEDCRYPTO="${LIBMBEDCRYPTO}${LIBMBEDCRYPTO:+ }-l$name" + fi + fi + fi + fi + else + if test "X$found_a" != "X"; then + LIBMBEDCRYPTO="${LIBMBEDCRYPTO}${LIBMBEDCRYPTO:+ }$found_a" + else + LIBMBEDCRYPTO="${LIBMBEDCRYPTO}${LIBMBEDCRYPTO:+ }-L$found_dir -l$name" + fi + fi + additional_includedir= + case "$found_dir" in + */$acl_libdirstem | */$acl_libdirstem/) + basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'` + LIBMBEDCRYPTO_PREFIX="$basedir" + additional_includedir="$basedir/include" + ;; + esac + if test "X$additional_includedir" != "X"; then + if test "X$additional_includedir" != "X/usr/include"; then + haveit= + if test "X$additional_includedir" = "X/usr/local/include"; then + if test -n "$GCC"; then + case $host_os in + linux* | gnu* | k*bsd*-gnu) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + for x in $CPPFLAGS $INCMBEDCRYPTO; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-I$additional_includedir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_includedir"; then + INCMBEDCRYPTO="${INCMBEDCRYPTO}${INCMBEDCRYPTO:+ }-I$additional_includedir" + fi + fi + fi + fi + fi + if test -n "$found_la"; then + save_libdir="$libdir" + case "$found_la" in + */* | *\\*) . "$found_la" ;; + *) . "./$found_la" ;; + esac + libdir="$save_libdir" + for dep in $dependency_libs; do + case "$dep" in + -L*) + additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` + if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then + haveit= + if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then + if test -n "$GCC"; then + case $host_os in + linux* | gnu* | k*bsd*-gnu) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + haveit= + for x in $LDFLAGS $LIBMBEDCRYPTO; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + LIBMBEDCRYPTO="${LIBMBEDCRYPTO}${LIBMBEDCRYPTO:+ }-L$additional_libdir" + fi + fi + haveit= + for x in $LDFLAGS $LTLIBMBEDCRYPTO; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + LTLIBMBEDCRYPTO="${LTLIBMBEDCRYPTO}${LTLIBMBEDCRYPTO:+ }-L$additional_libdir" + fi + fi + fi + fi + ;; + -R*) + dir=`echo "X$dep" | sed -e 's/^X-R//'` + if test "$enable_rpath" != no; then + haveit= + for x in $rpathdirs; do + if test "X$x" = "X$dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + rpathdirs="$rpathdirs $dir" + fi + haveit= + for x in $ltrpathdirs; do + if test "X$x" = "X$dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + ltrpathdirs="$ltrpathdirs $dir" + fi + fi + ;; + -l*) + names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` + ;; + *.la) + names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` + ;; + *) + LIBMBEDCRYPTO="${LIBMBEDCRYPTO}${LIBMBEDCRYPTO:+ }$dep" + LTLIBMBEDCRYPTO="${LTLIBMBEDCRYPTO}${LTLIBMBEDCRYPTO:+ }$dep" + ;; + esac + done + fi + else + LIBMBEDCRYPTO="${LIBMBEDCRYPTO}${LIBMBEDCRYPTO:+ }-l$name" + LTLIBMBEDCRYPTO="${LTLIBMBEDCRYPTO}${LTLIBMBEDCRYPTO:+ }-l$name" + fi + fi + fi + done + done + if test "X$rpathdirs" != "X"; then + if test -n "$acl_hardcode_libdir_separator"; then + alldirs= + for found_dir in $rpathdirs; do + alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir" + done + acl_save_libdir="$libdir" + libdir="$alldirs" + eval flag=\"$acl_hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + LIBMBEDCRYPTO="${LIBMBEDCRYPTO}${LIBMBEDCRYPTO:+ }$flag" + else + for found_dir in $rpathdirs; do + acl_save_libdir="$libdir" + libdir="$found_dir" + eval flag=\"$acl_hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + LIBMBEDCRYPTO="${LIBMBEDCRYPTO}${LIBMBEDCRYPTO:+ }$flag" + done + fi + fi + if test "X$ltrpathdirs" != "X"; then + for found_dir in $ltrpathdirs; do + LTLIBMBEDCRYPTO="${LTLIBMBEDCRYPTO}${LTLIBMBEDCRYPTO:+ }-R$found_dir" + done + fi + + + ac_save_CPPFLAGS="$CPPFLAGS" + + for element in $INCMBEDCRYPTO; do + haveit= + for x in $CPPFLAGS; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X$element"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element" fi done - IFS="$ac_save_ifs" -else - acl_cv_path_LD="$LD" # Let the user override the test with a path. + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for libmbedcrypto" >&5 +printf %s "checking for libmbedcrypto... " >&6; } +if test ${ac_cv_libmbedcrypto+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + ac_save_LIBS="$LIBS" + LIBS="$LIBS $LIBMBEDCRYPTO" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_libmbedcrypto=yes +else $as_nop + ac_cv_libmbedcrypto=no fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + LIBS="$ac_save_LIBS" + fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_libmbedcrypto" >&5 +printf "%s\n" "$ac_cv_libmbedcrypto" >&6; } + if test "$ac_cv_libmbedcrypto" = yes; then + HAVE_LIBMBEDCRYPTO=yes -LD="$acl_cv_path_LD" -if test -n "$LD"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5 -$as_echo "$LD" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } +printf "%s\n" "#define HAVE_LIBMBEDCRYPTO 1" >>confdefs.h + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to link with libmbedcrypto" >&5 +printf %s "checking how to link with libmbedcrypto... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LIBMBEDCRYPTO" >&5 +printf "%s\n" "$LIBMBEDCRYPTO" >&6; } + else + HAVE_LIBMBEDCRYPTO=no + CPPFLAGS="$ac_save_CPPFLAGS" + LIBMBEDCRYPTO= + LTLIBMBEDCRYPTO= + LIBMBEDCRYPTO_PREFIX= + fi + + + + + + + + + LDFLAGS="$libssh2_save_LDFLAGS" + + if test "$ac_cv_libmbedcrypto" = "yes"; then : + + +printf "%s\n" "#define LIBSSH2_MBEDTLS 1" >>confdefs.h + + LIBS="$LIBS -lmbedcrypto" + found_crypto="mbedtls" + support_clear_memory=yes + + else + CPPFLAGS="$libssh2_save_CPPFLAGS" + fi + + + test "$found_crypto" = "none" && + crypto_errors="${crypto_errors}No mbedtls crypto library found! +" fi -test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 -$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } -if ${acl_cv_prog_gnu_ld+:} false; then : - $as_echo_n "(cached) " >&6 -else - # I'd rather use --version here, but apparently some GNU ld's only accept -v. -case `$LD -v 2>&1 &5 +printf %s "checking for $CC options needed to detect all undeclared functions... " >&6; } +if test ${ac_cv_c_undeclared_builtin_options+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_save_CFLAGS=$CFLAGS + ac_cv_c_undeclared_builtin_options='cannot detect' + for ac_arg in '' -fno-builtin; do + CFLAGS="$ac_save_CFLAGS $ac_arg" + # This test program should *not* compile successfully. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ +(void) strchr; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + +else $as_nop + # This test program should compile successfully. + # No library function is consistently available on + # freestanding implementations, so test against a dummy + # declaration. Include always-available headers on the + # off chance that they somehow elicit warnings. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include +extern void ac_decl (int, char *); + +int +main (void) +{ +(void) ac_decl (0, (char *) 0); + (void) ac_decl; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + if test x"$ac_arg" = x +then : + ac_cv_c_undeclared_builtin_options='none needed' +else $as_nop + ac_cv_c_undeclared_builtin_options=$ac_arg fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $acl_cv_prog_gnu_ld" >&5 -$as_echo "$acl_cv_prog_gnu_ld" >&6; } -with_gnu_ld=$acl_cv_prog_gnu_ld + break +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + done + CFLAGS=$ac_save_CFLAGS + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_undeclared_builtin_options" >&5 +printf "%s\n" "$ac_cv_c_undeclared_builtin_options" >&6; } + case $ac_cv_c_undeclared_builtin_options in #( + 'cannot detect') : + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot make $CC report undeclared builtins +See \`config.log' for more details" "$LINENO" 5; } ;; #( + 'none needed') : + ac_c_undeclared_builtin_options='' ;; #( + *) : + ac_c_undeclared_builtin_options=$ac_cv_c_undeclared_builtin_options ;; +esac +if test "$use_crypto" = "auto" && test "$found_crypto" = "none" || test "$use_crypto" = "wincng"; then + # Look for Windows Cryptography API: Next Generation - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shared library run path origin" >&5 -$as_echo_n "checking for shared library run path origin... " >&6; } -if ${acl_cv_rpath+:} false; then : - $as_echo_n "(cached) " >&6 -else + ac_fn_c_check_header_compile "$LINENO" "ntdef.h" "ac_cv_header_ntdef_h" "#include +" +if test "x$ac_cv_header_ntdef_h" = xyes +then : + printf "%s\n" "#define HAVE_NTDEF_H 1" >>confdefs.h - CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \ - ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh - . ./conftest.sh - rm -f ./conftest.sh - acl_cv_rpath=done +fi +ac_fn_c_check_header_compile "$LINENO" "ntstatus.h" "ac_cv_header_ntstatus_h" "#include +" +if test "x$ac_cv_header_ntstatus_h" = xyes +then : + printf "%s\n" "#define HAVE_NTSTATUS_H 1" >>confdefs.h fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $acl_cv_rpath" >&5 -$as_echo "$acl_cv_rpath" >&6; } - wl="$acl_cv_wl" - acl_libext="$acl_cv_libext" - acl_shlibext="$acl_cv_shlibext" - acl_libname_spec="$acl_cv_libname_spec" - acl_library_names_spec="$acl_cv_library_names_spec" - acl_hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec" - acl_hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator" - acl_hardcode_direct="$acl_cv_hardcode_direct" - acl_hardcode_minus_L="$acl_cv_hardcode_minus_L" - # Check whether --enable-rpath was given. -if test "${enable_rpath+set}" = set; then : - enableval=$enable_rpath; : -else - enable_rpath=yes + + ac_fn_check_decl "$LINENO" "SecureZeroMemory" "ac_cv_have_decl_SecureZeroMemory" "#include +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_SecureZeroMemory" = xyes +then : + ac_have_decl=1 +else $as_nop + ac_have_decl=0 fi +printf "%s\n" "#define HAVE_DECL_SECUREZEROMEMORY $ac_have_decl" >>confdefs.h - acl_libdirstem=lib - searchpath=`(LC_ALL=C $CC -print-search-dirs) 2>/dev/null | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'` - if test -n "$searchpath"; then - acl_save_IFS="${IFS= }"; IFS=":" - for searchdir in $searchpath; do - if test -d "$searchdir"; then - case "$searchdir" in - */lib64/ | */lib64 ) acl_libdirstem=lib64 ;; - *) searchdir=`cd "$searchdir" && pwd` - case "$searchdir" in - */lib64 ) acl_libdirstem=lib64 ;; - esac ;; - esac - fi - done - IFS="$acl_save_IFS" + libssh2_save_CPPFLAGS="$CPPFLAGS" + libssh2_save_LDFLAGS="$LDFLAGS" + + if test "${with_libcrypt32_prefix+set}" = set; then + CPPFLAGS="$CPPFLAGS${CPPFLAGS:+ }-I${with_libcrypt32_prefix}/include" + LDFLAGS="$LDFLAGS${LDFLAGS:+ }-L${with_libcrypt32_prefix}/lib" fi @@ -13451,9 +21108,10 @@ fi prefix="$acl_save_prefix" -# Check whether --with-libssl-prefix was given. -if test "${with_libssl_prefix+set}" = set; then : - withval=$with_libssl_prefix; +# Check whether --with-libcrypt32-prefix was given. +if test ${with_libcrypt32_prefix+y} +then : + withval=$with_libcrypt32_prefix; if test "X$withval" = "Xno"; then use_additional=no else @@ -13478,14 +21136,14 @@ if test "${with_libssl_prefix+set}" = set; then : fi - LIBSSL= - LTLIBSSL= - INCSSL= - LIBSSL_PREFIX= + LIBCRYPT32= + LTLIBCRYPT32= + INCCRYPT32= + LIBCRYPT32_PREFIX= rpathdirs= ltrpathdirs= names_already_handled= - names_next_round='ssl crypto' + names_next_round='crypt32 ' while test -n "$names_next_round"; do names_this_round="$names_next_round" names_next_round= @@ -13504,9 +21162,9 @@ fi if test -n "$value"; then if test "$value" = yes; then eval value=\"\$LIB$uppername\" - test -z "$value" || LIBSSL="${LIBSSL}${LIBSSL:+ }$value" + test -z "$value" || LIBCRYPT32="${LIBCRYPT32}${LIBCRYPT32:+ }$value" eval value=\"\$LTLIB$uppername\" - test -z "$value" || LTLIBSSL="${LTLIBSSL}${LTLIBSSL:+ }$value" + test -z "$value" || LTLIBCRYPT32="${LTLIBCRYPT32}${LTLIBCRYPT32:+ }$value" else : fi @@ -13563,7 +21221,7 @@ fi fi fi if test "X$found_dir" = "X"; then - for x in $LDFLAGS $LTLIBSSL; do + for x in $LDFLAGS $LTLIBCRYPT32; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" @@ -13622,10 +21280,10 @@ fi done fi if test "X$found_dir" != "X"; then - LTLIBSSL="${LTLIBSSL}${LTLIBSSL:+ }-L$found_dir -l$name" + LTLIBCRYPT32="${LTLIBCRYPT32}${LTLIBCRYPT32:+ }-L$found_dir -l$name" if test "X$found_so" != "X"; then if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/$acl_libdirstem"; then - LIBSSL="${LIBSSL}${LIBSSL:+ }$found_so" + LIBCRYPT32="${LIBCRYPT32}${LIBCRYPT32:+ }$found_so" else haveit= for x in $ltrpathdirs; do @@ -13638,10 +21296,10 @@ fi ltrpathdirs="$ltrpathdirs $found_dir" fi if test "$acl_hardcode_direct" = yes; then - LIBSSL="${LIBSSL}${LIBSSL:+ }$found_so" + LIBCRYPT32="${LIBCRYPT32}${LIBCRYPT32:+ }$found_so" else if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then - LIBSSL="${LIBSSL}${LIBSSL:+ }$found_so" + LIBCRYPT32="${LIBCRYPT32}${LIBCRYPT32:+ }$found_so" haveit= for x in $rpathdirs; do if test "X$x" = "X$found_dir"; then @@ -13654,7 +21312,7 @@ fi fi else haveit= - for x in $LDFLAGS $LIBSSL; do + for x in $LDFLAGS $LIBCRYPT32; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" @@ -13670,28 +21328,28 @@ fi fi done if test -z "$haveit"; then - LIBSSL="${LIBSSL}${LIBSSL:+ }-L$found_dir" + LIBCRYPT32="${LIBCRYPT32}${LIBCRYPT32:+ }-L$found_dir" fi if test "$acl_hardcode_minus_L" != no; then - LIBSSL="${LIBSSL}${LIBSSL:+ }$found_so" + LIBCRYPT32="${LIBCRYPT32}${LIBCRYPT32:+ }$found_so" else - LIBSSL="${LIBSSL}${LIBSSL:+ }-l$name" + LIBCRYPT32="${LIBCRYPT32}${LIBCRYPT32:+ }-l$name" fi fi fi fi else if test "X$found_a" != "X"; then - LIBSSL="${LIBSSL}${LIBSSL:+ }$found_a" + LIBCRYPT32="${LIBCRYPT32}${LIBCRYPT32:+ }$found_a" else - LIBSSL="${LIBSSL}${LIBSSL:+ }-L$found_dir -l$name" + LIBCRYPT32="${LIBCRYPT32}${LIBCRYPT32:+ }-L$found_dir -l$name" fi fi additional_includedir= case "$found_dir" in */$acl_libdirstem | */$acl_libdirstem/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'` - LIBSSL_PREFIX="$basedir" + LIBCRYPT32_PREFIX="$basedir" additional_includedir="$basedir/include" ;; esac @@ -13706,7 +21364,7 @@ fi fi fi if test -z "$haveit"; then - for x in $CPPFLAGS $INCSSL; do + for x in $CPPFLAGS $INCCRYPT32; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" @@ -13723,7 +21381,7 @@ fi done if test -z "$haveit"; then if test -d "$additional_includedir"; then - INCSSL="${INCSSL}${INCSSL:+ }-I$additional_includedir" + INCCRYPT32="${INCCRYPT32}${INCCRYPT32:+ }-I$additional_includedir" fi fi fi @@ -13751,7 +21409,7 @@ fi fi if test -z "$haveit"; then haveit= - for x in $LDFLAGS $LIBSSL; do + for x in $LDFLAGS $LIBCRYPT32; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" @@ -13768,11 +21426,11 @@ fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then - LIBSSL="${LIBSSL}${LIBSSL:+ }-L$additional_libdir" + LIBCRYPT32="${LIBCRYPT32}${LIBCRYPT32:+ }-L$additional_libdir" fi fi haveit= - for x in $LDFLAGS $LTLIBSSL; do + for x in $LDFLAGS $LTLIBCRYPT32; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" @@ -13789,7 +21447,7 @@ fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then - LTLIBSSL="${LTLIBSSL}${LTLIBSSL:+ }-L$additional_libdir" + LTLIBCRYPT32="${LTLIBCRYPT32}${LTLIBCRYPT32:+ }-L$additional_libdir" fi fi fi @@ -13827,15 +21485,15 @@ fi names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` ;; *) - LIBSSL="${LIBSSL}${LIBSSL:+ }$dep" - LTLIBSSL="${LTLIBSSL}${LTLIBSSL:+ }$dep" + LIBCRYPT32="${LIBCRYPT32}${LIBCRYPT32:+ }$dep" + LTLIBCRYPT32="${LTLIBCRYPT32}${LTLIBCRYPT32:+ }$dep" ;; esac done fi else - LIBSSL="${LIBSSL}${LIBSSL:+ }-l$name" - LTLIBSSL="${LTLIBSSL}${LTLIBSSL:+ }-l$name" + LIBCRYPT32="${LIBCRYPT32}${LIBCRYPT32:+ }-l$name" + LTLIBCRYPT32="${LTLIBCRYPT32}${LTLIBCRYPT32:+ }-l$name" fi fi fi @@ -13851,27 +21509,27 @@ fi libdir="$alldirs" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" - LIBSSL="${LIBSSL}${LIBSSL:+ }$flag" + LIBCRYPT32="${LIBCRYPT32}${LIBCRYPT32:+ }$flag" else for found_dir in $rpathdirs; do acl_save_libdir="$libdir" libdir="$found_dir" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" - LIBSSL="${LIBSSL}${LIBSSL:+ }$flag" + LIBCRYPT32="${LIBCRYPT32}${LIBCRYPT32:+ }$flag" done fi fi if test "X$ltrpathdirs" != "X"; then for found_dir in $ltrpathdirs; do - LTLIBSSL="${LTLIBSSL}${LTLIBSSL:+ }-R$found_dir" + LTLIBCRYPT32="${LTLIBCRYPT32}${LTLIBCRYPT32:+ }-R$found_dir" done fi ac_save_CPPFLAGS="$CPPFLAGS" - for element in $INCSSL; do + for element in $INCCRYPT32; do haveit= for x in $CPPFLAGS; do @@ -13894,52 +21552,57 @@ fi done - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libssl" >&5 -$as_echo_n "checking for libssl... " >&6; } -if ${ac_cv_libssl+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for libcrypt32" >&5 +printf %s "checking for libcrypt32... " >&6; } +if test ${ac_cv_libcrypt32+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_save_LIBS="$LIBS" - LIBS="$LIBS $LIBSSL" + LIBS="$LIBS $LIBCRYPT32" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#include + + #include + #include + int -main () +main (void) { ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_libssl=yes -else - ac_cv_libssl=no +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_libcrypt32=yes +else $as_nop + ac_cv_libcrypt32=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS="$ac_save_LIBS" fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_libssl" >&5 -$as_echo "$ac_cv_libssl" >&6; } - if test "$ac_cv_libssl" = yes; then - HAVE_LIBSSL=yes +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_libcrypt32" >&5 +printf "%s\n" "$ac_cv_libcrypt32" >&6; } + if test "$ac_cv_libcrypt32" = yes; then + HAVE_LIBCRYPT32=yes -$as_echo "#define HAVE_LIBSSL 1" >>confdefs.h +printf "%s\n" "#define HAVE_LIBCRYPT32 1" >>confdefs.h - { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libssl" >&5 -$as_echo_n "checking how to link with libssl... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBSSL" >&5 -$as_echo "$LIBSSL" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to link with libcrypt32" >&5 +printf %s "checking how to link with libcrypt32... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LIBCRYPT32" >&5 +printf "%s\n" "$LIBCRYPT32" >&6; } else - HAVE_LIBSSL=no + HAVE_LIBCRYPT32=no CPPFLAGS="$ac_save_CPPFLAGS" - LIBSSL= - LTLIBSSL= - LIBSSL_PREFIX= + LIBCRYPT32= + LTLIBCRYPT32= + LIBCRYPT32_PREFIX= fi @@ -13948,11 +21611,24 @@ $as_echo "$LIBSSL" >&6; } - LIBSREQUIRED=libssl,libcrypto -fi -# Look for libgcrypt -if test "$ac_cv_libssl" != "yes" && test "$use_libgcrypt" != "no"; then + LDFLAGS="$libssh2_save_LDFLAGS" + + if test "$ac_cv_libcrypt32" = "yes"; then : + + else + CPPFLAGS="$libssh2_save_CPPFLAGS" + fi + + + libssh2_save_CPPFLAGS="$CPPFLAGS" + libssh2_save_LDFLAGS="$LDFLAGS" + + if test "${with_libbcrypt_prefix+set}" = set; then + CPPFLAGS="$CPPFLAGS${CPPFLAGS:+ }-I${with_libbcrypt_prefix}/include" + LDFLAGS="$LDFLAGS${LDFLAGS:+ }-L${with_libbcrypt_prefix}/lib" + fi + @@ -13977,9 +21653,10 @@ if test "$ac_cv_libssl" != "yes" && test "$use_libgcrypt" != "no"; then prefix="$acl_save_prefix" -# Check whether --with-libgcrypt-prefix was given. -if test "${with_libgcrypt_prefix+set}" = set; then : - withval=$with_libgcrypt_prefix; +# Check whether --with-libbcrypt-prefix was given. +if test ${with_libbcrypt_prefix+y} +then : + withval=$with_libbcrypt_prefix; if test "X$withval" = "Xno"; then use_additional=no else @@ -14004,14 +21681,14 @@ if test "${with_libgcrypt_prefix+set}" = set; then : fi - LIBGCRYPT= - LTLIBGCRYPT= - INCGCRYPT= - LIBGCRYPT_PREFIX= + LIBBCRYPT= + LTLIBBCRYPT= + INCBCRYPT= + LIBBCRYPT_PREFIX= rpathdirs= ltrpathdirs= names_already_handled= - names_next_round='gcrypt ' + names_next_round='bcrypt ' while test -n "$names_next_round"; do names_this_round="$names_next_round" names_next_round= @@ -14030,9 +21707,9 @@ fi if test -n "$value"; then if test "$value" = yes; then eval value=\"\$LIB$uppername\" - test -z "$value" || LIBGCRYPT="${LIBGCRYPT}${LIBGCRYPT:+ }$value" + test -z "$value" || LIBBCRYPT="${LIBBCRYPT}${LIBBCRYPT:+ }$value" eval value=\"\$LTLIB$uppername\" - test -z "$value" || LTLIBGCRYPT="${LTLIBGCRYPT}${LTLIBGCRYPT:+ }$value" + test -z "$value" || LTLIBBCRYPT="${LTLIBBCRYPT}${LTLIBBCRYPT:+ }$value" else : fi @@ -14089,7 +21766,7 @@ fi fi fi if test "X$found_dir" = "X"; then - for x in $LDFLAGS $LTLIBGCRYPT; do + for x in $LDFLAGS $LTLIBBCRYPT; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" @@ -14148,10 +21825,10 @@ fi done fi if test "X$found_dir" != "X"; then - LTLIBGCRYPT="${LTLIBGCRYPT}${LTLIBGCRYPT:+ }-L$found_dir -l$name" + LTLIBBCRYPT="${LTLIBBCRYPT}${LTLIBBCRYPT:+ }-L$found_dir -l$name" if test "X$found_so" != "X"; then if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/$acl_libdirstem"; then - LIBGCRYPT="${LIBGCRYPT}${LIBGCRYPT:+ }$found_so" + LIBBCRYPT="${LIBBCRYPT}${LIBBCRYPT:+ }$found_so" else haveit= for x in $ltrpathdirs; do @@ -14164,10 +21841,10 @@ fi ltrpathdirs="$ltrpathdirs $found_dir" fi if test "$acl_hardcode_direct" = yes; then - LIBGCRYPT="${LIBGCRYPT}${LIBGCRYPT:+ }$found_so" + LIBBCRYPT="${LIBBCRYPT}${LIBBCRYPT:+ }$found_so" else if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then - LIBGCRYPT="${LIBGCRYPT}${LIBGCRYPT:+ }$found_so" + LIBBCRYPT="${LIBBCRYPT}${LIBBCRYPT:+ }$found_so" haveit= for x in $rpathdirs; do if test "X$x" = "X$found_dir"; then @@ -14180,7 +21857,7 @@ fi fi else haveit= - for x in $LDFLAGS $LIBGCRYPT; do + for x in $LDFLAGS $LIBBCRYPT; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" @@ -14196,28 +21873,28 @@ fi fi done if test -z "$haveit"; then - LIBGCRYPT="${LIBGCRYPT}${LIBGCRYPT:+ }-L$found_dir" + LIBBCRYPT="${LIBBCRYPT}${LIBBCRYPT:+ }-L$found_dir" fi if test "$acl_hardcode_minus_L" != no; then - LIBGCRYPT="${LIBGCRYPT}${LIBGCRYPT:+ }$found_so" + LIBBCRYPT="${LIBBCRYPT}${LIBBCRYPT:+ }$found_so" else - LIBGCRYPT="${LIBGCRYPT}${LIBGCRYPT:+ }-l$name" + LIBBCRYPT="${LIBBCRYPT}${LIBBCRYPT:+ }-l$name" fi fi fi fi else if test "X$found_a" != "X"; then - LIBGCRYPT="${LIBGCRYPT}${LIBGCRYPT:+ }$found_a" + LIBBCRYPT="${LIBBCRYPT}${LIBBCRYPT:+ }$found_a" else - LIBGCRYPT="${LIBGCRYPT}${LIBGCRYPT:+ }-L$found_dir -l$name" + LIBBCRYPT="${LIBBCRYPT}${LIBBCRYPT:+ }-L$found_dir -l$name" fi fi additional_includedir= case "$found_dir" in */$acl_libdirstem | */$acl_libdirstem/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'` - LIBGCRYPT_PREFIX="$basedir" + LIBBCRYPT_PREFIX="$basedir" additional_includedir="$basedir/include" ;; esac @@ -14232,7 +21909,7 @@ fi fi fi if test -z "$haveit"; then - for x in $CPPFLAGS $INCGCRYPT; do + for x in $CPPFLAGS $INCBCRYPT; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" @@ -14249,7 +21926,7 @@ fi done if test -z "$haveit"; then if test -d "$additional_includedir"; then - INCGCRYPT="${INCGCRYPT}${INCGCRYPT:+ }-I$additional_includedir" + INCBCRYPT="${INCBCRYPT}${INCBCRYPT:+ }-I$additional_includedir" fi fi fi @@ -14277,7 +21954,7 @@ fi fi if test -z "$haveit"; then haveit= - for x in $LDFLAGS $LIBGCRYPT; do + for x in $LDFLAGS $LIBBCRYPT; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" @@ -14294,11 +21971,11 @@ fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then - LIBGCRYPT="${LIBGCRYPT}${LIBGCRYPT:+ }-L$additional_libdir" + LIBBCRYPT="${LIBBCRYPT}${LIBBCRYPT:+ }-L$additional_libdir" fi fi haveit= - for x in $LDFLAGS $LTLIBGCRYPT; do + for x in $LDFLAGS $LTLIBBCRYPT; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" @@ -14315,7 +21992,7 @@ fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then - LTLIBGCRYPT="${LTLIBGCRYPT}${LTLIBGCRYPT:+ }-L$additional_libdir" + LTLIBBCRYPT="${LTLIBBCRYPT}${LTLIBBCRYPT:+ }-L$additional_libdir" fi fi fi @@ -14353,15 +22030,15 @@ fi names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` ;; *) - LIBGCRYPT="${LIBGCRYPT}${LIBGCRYPT:+ }$dep" - LTLIBGCRYPT="${LTLIBGCRYPT}${LTLIBGCRYPT:+ }$dep" + LIBBCRYPT="${LIBBCRYPT}${LIBBCRYPT:+ }$dep" + LTLIBBCRYPT="${LTLIBBCRYPT}${LTLIBBCRYPT:+ }$dep" ;; esac done fi else - LIBGCRYPT="${LIBGCRYPT}${LIBGCRYPT:+ }-l$name" - LTLIBGCRYPT="${LTLIBGCRYPT}${LTLIBGCRYPT:+ }-l$name" + LIBBCRYPT="${LIBBCRYPT}${LIBBCRYPT:+ }-l$name" + LTLIBBCRYPT="${LTLIBBCRYPT}${LTLIBBCRYPT:+ }-l$name" fi fi fi @@ -14377,27 +22054,27 @@ fi libdir="$alldirs" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" - LIBGCRYPT="${LIBGCRYPT}${LIBGCRYPT:+ }$flag" + LIBBCRYPT="${LIBBCRYPT}${LIBBCRYPT:+ }$flag" else for found_dir in $rpathdirs; do acl_save_libdir="$libdir" libdir="$found_dir" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" - LIBGCRYPT="${LIBGCRYPT}${LIBGCRYPT:+ }$flag" + LIBBCRYPT="${LIBBCRYPT}${LIBBCRYPT:+ }$flag" done fi fi if test "X$ltrpathdirs" != "X"; then for found_dir in $ltrpathdirs; do - LTLIBGCRYPT="${LTLIBGCRYPT}${LTLIBGCRYPT:+ }-R$found_dir" + LTLIBBCRYPT="${LTLIBBCRYPT}${LTLIBBCRYPT:+ }-R$found_dir" done fi ac_save_CPPFLAGS="$CPPFLAGS" - for element in $INCGCRYPT; do + for element in $INCBCRYPT; do haveit= for x in $CPPFLAGS; do @@ -14420,52 +22097,57 @@ fi done - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libgcrypt" >&5 -$as_echo_n "checking for libgcrypt... " >&6; } -if ${ac_cv_libgcrypt+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for libbcrypt" >&5 +printf %s "checking for libbcrypt... " >&6; } +if test ${ac_cv_libbcrypt+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_save_LIBS="$LIBS" - LIBS="$LIBS $LIBGCRYPT" + LIBS="$LIBS $LIBBCRYPT" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#include + + #include + #include + int -main () +main (void) { ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_libgcrypt=yes -else - ac_cv_libgcrypt=no +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_libbcrypt=yes +else $as_nop + ac_cv_libbcrypt=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS="$ac_save_LIBS" fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_libgcrypt" >&5 -$as_echo "$ac_cv_libgcrypt" >&6; } - if test "$ac_cv_libgcrypt" = yes; then - HAVE_LIBGCRYPT=yes +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_libbcrypt" >&5 +printf "%s\n" "$ac_cv_libbcrypt" >&6; } + if test "$ac_cv_libbcrypt" = yes; then + HAVE_LIBBCRYPT=yes -$as_echo "#define HAVE_LIBGCRYPT 1" >>confdefs.h +printf "%s\n" "#define HAVE_LIBBCRYPT 1" >>confdefs.h - { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libgcrypt" >&5 -$as_echo_n "checking how to link with libgcrypt... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBGCRYPT" >&5 -$as_echo "$LIBGCRYPT" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to link with libbcrypt" >&5 +printf %s "checking how to link with libbcrypt... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LIBBCRYPT" >&5 +printf "%s\n" "$LIBBCRYPT" >&6; } else - HAVE_LIBGCRYPT=no + HAVE_LIBBCRYPT=no CPPFLAGS="$ac_save_CPPFLAGS" - LIBGCRYPT= - LTLIBGCRYPT= - LIBGCRYPT_PREFIX= + LIBBCRYPT= + LTLIBBCRYPT= + LIBBCRYPT_PREFIX= fi @@ -14474,22 +22156,57 @@ $as_echo "$LIBGCRYPT" >&6; } - LIBS="$LIBS -lgcrypt" -fi + LDFLAGS="$libssh2_save_LDFLAGS" + + if test "$ac_cv_libbcrypt" = "yes"; then : + + +printf "%s\n" "#define LIBSSH2_WINCNG 1" >>confdefs.h + + found_crypto="wincng" + found_crypto_str="Windows Cryptography API: Next Generation" + support_clear_memory="$ac_cv_have_decl_SecureZeroMemory" + + else + CPPFLAGS="$libssh2_save_CPPFLAGS" + fi -if test "$ac_cv_libssl" != "yes" && test "$ac_cv_libgcrypt" != "yes"; then - as_fn_error $? "cannot find OpenSSL or Libgcrypt, -try --with-libssl-prefix=PATH or --with-libgcrypt-prefix=PATH" "$LINENO" 5 + test "$found_crypto" = "none" && + crypto_errors="${crypto_errors}No wincng crypto library found! +" fi -if test "$ac_cv_libgcrypt" = "yes"; then + ;; + yes|"") + crypto_errors="No crypto backend specified!" + ;; + *) + crypto_errors="Unknown crypto backend '${use_crypto}' specified!" + ;; +esac + +if test "$found_crypto" = "none"; then + crypto_errors="${crypto_errors} +Specify --with-crypto=\$backend and/or the neccessary library search prefix. -$as_echo "#define LIBSSH2_LIBGCRYPT 1" >>confdefs.h +Known crypto backends: auto, openssl, libgcrypt, mbedtls, wincng" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: ERROR: ${crypto_errors}" >&5 +printf "%s\n" "$as_me: ERROR: ${crypto_errors}" >&6;} +else + test "$found_crypto_str" = "" && found_crypto_str="$found_crypto" +fi + if test "$found_crypto" = "openssl"; then + OPENSSL_TRUE= + OPENSSL_FALSE='#' +else + OPENSSL_TRUE='#' + OPENSSL_FALSE= fi - if test "$ac_cv_libgcrypt" = "yes"; then + + if test "$found_crypto" = "libgcrypt"; then LIBGCRYPT_TRUE= LIBGCRYPT_FALSE='#' else @@ -14497,27 +22214,40 @@ else LIBGCRYPT_FALSE= fi + if test "$found_crypto" = "mbedtls"; then + MBEDTLS_TRUE= + MBEDTLS_FALSE='#' +else + MBEDTLS_TRUE='#' + MBEDTLS_FALSE= +fi -# Not all OpenSSL have AES-CTR functions. -if test "$ac_cv_libssl" = "yes"; then - save_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS $LIBSSL" - for ac_func in EVP_aes_128_ctr -do : - ac_fn_c_check_func "$LINENO" "EVP_aes_128_ctr" "ac_cv_func_EVP_aes_128_ctr" -if test "x$ac_cv_func_EVP_aes_128_ctr" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_EVP_AES_128_CTR 1 -_ACEOF - + if test "$found_crypto" = "wincng"; then + WINCNG_TRUE= + WINCNG_FALSE='#' +else + WINCNG_TRUE='#' + WINCNG_FALSE= fi -done - LDFLAGS="$save_LDFLAGS" + + +# libz + + +# Check whether --with-libz was given. +if test ${with_libz+y} +then : + withval=$with_libz; use_libz=$withval +else $as_nop + use_libz=auto fi -# Look for Libz -if test "$use_libz" != "no"; then + +found_libz=no +libz_errors="" + +if test "$use_libz" != no; then @@ -14543,7 +22273,8 @@ if test "$use_libz" != "no"; then # Check whether --with-libz-prefix was given. -if test "${with_libz_prefix+set}" = set; then : +if test ${with_libz_prefix+y} +then : withval=$with_libz_prefix; if test "X$withval" = "Xno"; then use_additional=no @@ -14985,11 +22716,12 @@ fi done - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libz" >&5 -$as_echo_n "checking for libz... " >&6; } -if ${ac_cv_libz+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for libz" >&5 +printf %s "checking for libz... " >&6; } +if test ${ac_cv_libz+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_save_LIBS="$LIBS" LIBS="$LIBS $LIBZ" @@ -14997,34 +22729,35 @@ else /* end confdefs.h. */ #include int -main () +main (void) { ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : ac_cv_libz=yes -else +else $as_nop ac_cv_libz=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS="$ac_save_LIBS" fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_libz" >&5 -$as_echo "$ac_cv_libz" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_libz" >&5 +printf "%s\n" "$ac_cv_libz" >&6; } if test "$ac_cv_libz" = yes; then HAVE_LIBZ=yes -$as_echo "#define HAVE_LIBZ 1" >>confdefs.h +printf "%s\n" "#define HAVE_LIBZ 1" >>confdefs.h - { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libz" >&5 -$as_echo_n "checking how to link with libz... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBZ" >&5 -$as_echo "$LIBZ" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to link with libz" >&5 +printf %s "checking how to link with libz... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LIBZ" >&5 +printf "%s\n" "$LIBZ" >&6; } else HAVE_LIBZ=no CPPFLAGS="$ac_save_CPPFLAGS" @@ -15040,58 +22773,237 @@ $as_echo "$LIBZ" >&6; } if test "$ac_cv_libz" != yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Cannot find libz, disabling compression" >&5 -$as_echo "$as_me: Cannot find libz, disabling compression" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: Try --with-libz-prefix=PATH if you know you have it" >&5 -$as_echo "$as_me: Try --with-libz-prefix=PATH if you know you have it" >&6;} + if test "$use_libz" = auto; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Cannot find libz, disabling compression" >&5 +printf "%s\n" "$as_me: Cannot find libz, disabling compression" >&6;} + found_libz="disabled; no libz found" + else + libz_errors="No libz found! +Try --with-libz-prefix=PATH if you know that you have it." + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: ERROR: $libz_errors" >&5 +printf "%s\n" "$as_me: ERROR: $libz_errors" >&6;} + fi else -$as_echo "#define LIBSSH2_HAVE_ZLIB 1" >>confdefs.h +printf "%s\n" "#define LIBSSH2_HAVE_ZLIB 1" >>confdefs.h + LIBSREQUIRED="$LIBSREQUIRED${LIBSREQUIRED:+ }zlib" + found_libz="yes" fi fi + + # # Optional Settings # # Check whether --enable-crypt-none was given. -if test "${enable_crypt_none+set}" = set; then : +if test ${enable_crypt_none+y} +then : enableval=$enable_crypt_none; -$as_echo "#define LIBSSH2_CRYPT_NONE 1" >>confdefs.h +printf "%s\n" "#define LIBSSH2_CRYPT_NONE 1" >>confdefs.h fi # Check whether --enable-mac-none was given. -if test "${enable_mac_none+set}" = set; then : +if test ${enable_mac_none+y} +then : enableval=$enable_mac_none; -$as_echo "#define LIBSSH2_MAC_NONE 1" >>confdefs.h +printf "%s\n" "#define LIBSSH2_MAC_NONE 1" >>confdefs.h fi # Check whether --enable-gex-new was given. -if test "${enable_gex_new+set}" = set; then : +if test ${enable_gex_new+y} +then : enableval=$enable_gex_new; GEX_NEW=$enableval fi if test "$GEX_NEW" != "no"; then -$as_echo "#define LIBSSH2_DH_GEX_NEW 1" >>confdefs.h +printf "%s\n" "#define LIBSSH2_DH_GEX_NEW 1" >>confdefs.h + +fi + +# Check whether --enable-clear-memory was given. +if test ${enable_clear_memory+y} +then : + enableval=$enable_clear_memory; CLEAR_MEMORY=$enableval +fi + +if test "$CLEAR_MEMORY" != "no"; then + if test "$support_clear_memory" = "yes"; then + +printf "%s\n" "#define LIBSSH2_CLEAR_MEMORY 1" >>confdefs.h + + enable_clear_memory=yes + else + if test "$CLEAR_MEMORY" = "yes"; then + as_fn_error $? "secure clearing/zeroing of memory is not supported by the selected crypto backend" "$LINENO" 5 + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: secure clearing/zeroing of memory is not supported by the selected crypto backend" >&5 +printf "%s\n" "$as_me: WARNING: secure clearing/zeroing of memory is not supported by the selected crypto backend" >&2;} + fi + enable_clear_memory=unsupported + fi +else + if test "$support_clear_memory" = "yes"; then + enable_clear_memory=no + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: secure clearing/zeroing of memory is not supported by the selected crypto backend" >&5 +printf "%s\n" "$as_me: WARNING: secure clearing/zeroing of memory is not supported by the selected crypto backend" >&2;} + enable_clear_memory=unsupported + fi +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable pedantic and debug compiler options" >&5 +printf %s "checking whether to enable pedantic and debug compiler options... " >&6; } +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 +printf %s "checking how to run the C preprocessor... " >&6; } +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if test ${ac_cv_prog_CPP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + # Double quotes because $CC needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" cpp /lib/cpp + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO" +then : + +else $as_nop + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO" +then : + # Broken: success on invalid input. +continue +else $as_nop + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok +then : + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 +printf "%s\n" "$CPP" >&6; } +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO" +then : + +else $as_nop + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO" +then : + # Broken: success on invalid input. +continue +else $as_nop + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok +then : +else $as_nop + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5; } fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable pedantic and debug compiler options" >&5 -$as_echo_n "checking whether to enable pedantic and debug compiler options... " >&6; } +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + # Check whether --enable-debug was given. -if test "${enable_debug+set}" = set; then : +if test ${enable_debug+y} +then : enableval=$enable_debug; case "$enable_debug" in no) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + CPPFLAGS="$CPPFLAGS -DNDEBUG" ;; - *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } + *) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } enable_debug=yes CPPFLAGS="$CPPFLAGS -DLIBSSH2DEBUG" CFLAGS="$CFLAGS -g" @@ -15100,44 +23012,45 @@ $as_echo "yes" >&6; } if test "z$ICC" = "z"; then ICC="no" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for icc in use" >&5 -$as_echo_n "checking for icc in use... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for icc in use" >&5 +printf %s "checking for icc in use... " >&6; } if test "$GCC" = "yes"; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ __INTEL_COMPILER _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "^__INTEL_COMPILER" >/dev/null 2>&1; then : + $EGREP "^__INTEL_COMPILER" >/dev/null 2>&1 +then : ICC="no" -else +else $as_nop ICC="yes" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } fi -rm -f conftest* +rm -rf conftest* fi if test "$ICC" = "no"; then # this is not ICC - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi fi if test "$GCC" = "yes"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking gcc version" >&5 -$as_echo_n "checking gcc version... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking gcc version" >&5 +printf %s "checking gcc version... " >&6; } gccver=`$CC -dumpversion` num1=`echo $gccver | cut -d . -f1` num2=`echo $gccver | cut -d . -f2` gccnum=`(expr $num1 "*" 100 + $num2) 2>/dev/null` - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gccver" >&5 -$as_echo "$gccver" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gccver" >&5 +printf "%s\n" "$gccver" >&6; } if test "$ICC" = "yes"; then @@ -15188,12 +23101,12 @@ $as_echo "$gccver" >&6; } fi CFLAGS="$CFLAGS $WARN" - { $as_echo "$as_me:${as_lineno-$LINENO}: Added this set of compiler options: $WARN" >&5 -$as_echo "$as_me: Added this set of compiler options: $WARN" >&6;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Added this set of compiler options: $WARN" >&5 +printf "%s\n" "$as_me: Added this set of compiler options: $WARN" >&6;} else - { $as_echo "$as_me:${as_lineno-$LINENO}: Added no extra compiler options" >&5 -$as_echo "$as_me: Added no extra compiler options" >&6;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Added no extra compiler options" >&5 +printf "%s\n" "$as_me: Added no extra compiler options" >&6;} fi NEWFLAGS="" @@ -15212,66 +23125,68 @@ $as_echo "$as_me: Added no extra compiler options" >&6;} ;; esac -else +else $as_nop enable_debug=no - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable hidden symbols in the library" >&5 -$as_echo_n "checking whether to enable hidden symbols in the library... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable hidden symbols in the library" >&5 +printf %s "checking whether to enable hidden symbols in the library... " >&6; } # Check whether --enable-hidden-symbols was given. -if test "${enable_hidden_symbols+set}" = set; then : +if test ${enable_hidden_symbols+y} +then : enableval=$enable_hidden_symbols; case "$enableval" in no) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } ;; *) - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC supports it" >&5 -$as_echo_n "checking whether $CC supports it... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC supports it" >&5 +printf %s "checking whether $CC supports it... " >&6; } if test "$GCC" = yes ; then if $CC --help --verbose 2>&1 | grep fvisibility= > /dev/null ; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } -$as_echo "#define LIBSSH2_API __attribute__ ((visibility (\"default\")))" >>confdefs.h +printf "%s\n" "#define LIBSSH2_API __attribute__ ((visibility (\"default\")))" >>confdefs.h CFLAGS="$CFLAGS -fvisibility=hidden" else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi else if $CC 2>&1 | grep flags >/dev/null && $CC -flags | grep xldscope= >/dev/null ; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } -$as_echo "#define LIBSSH2_API __global" >>confdefs.h +printf "%s\n" "#define LIBSSH2_API __global" >>confdefs.h CFLAGS="$CFLAGS -xldscope=hidden" else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi fi ;; esac -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi # Build example applications? -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build example applications" >&5 -$as_echo_n "checking whether to build example applications... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to build example applications" >&5 +printf %s "checking whether to build example applications... " >&6; } # Check whether --enable-examples-build was given. -if test "${enable_examples_build+set}" = set; then : +if test ${enable_examples_build+y} +then : enableval=$enable_examples_build; case "$enableval" in no | false) build_examples='no' @@ -15280,12 +23195,12 @@ if test "${enable_examples_build+set}" = set; then : build_examples='yes' ;; esac -else +else $as_nop build_examples='yes' fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $build_examples" >&5 -$as_echo "$build_examples" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $build_examples" >&5 +printf "%s\n" "$build_examples" >&6; } if test "x$build_examples" != "xno"; then BUILD_EXAMPLES_TRUE= BUILD_EXAMPLES_FALSE='#' @@ -15295,61 +23210,135 @@ else fi + +# Build OSS fuzzing targets? +# Check whether --enable-ossfuzzers was given. +if test ${enable_ossfuzzers+y} +then : + enableval=$enable_ossfuzzers; have_ossfuzzers=yes +else $as_nop + have_ossfuzzers=no +fi + + if test "x$have_ossfuzzers" = "xyes"; then + USE_OSSFUZZERS_TRUE= + USE_OSSFUZZERS_FALSE='#' +else + USE_OSSFUZZERS_TRUE='#' + USE_OSSFUZZERS_FALSE= +fi + + + +# Set the correct flags for the given fuzzing engine. + + if test "x$LIB_FUZZING_ENGINE" = "x-fsanitize=fuzzer"; then + USE_OSSFUZZ_FLAG_TRUE= + USE_OSSFUZZ_FLAG_FALSE='#' +else + USE_OSSFUZZ_FLAG_TRUE='#' + USE_OSSFUZZ_FLAG_FALSE= +fi + + if test -f "$LIB_FUZZING_ENGINE"; then + USE_OSSFUZZ_STATIC_TRUE= + USE_OSSFUZZ_STATIC_FALSE='#' +else + USE_OSSFUZZ_STATIC_TRUE='#' + USE_OSSFUZZ_STATIC_FALSE= +fi + + + # Checks for header files. # AC_HEADER_STDC -for ac_header in errno.h fcntl.h stdio.h stdlib.h unistd.h sys/uio.h -do : - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" -if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF +ac_fn_c_check_header_compile "$LINENO" "errno.h" "ac_cv_header_errno_h" "$ac_includes_default" +if test "x$ac_cv_header_errno_h" = xyes +then : + printf "%s\n" "#define HAVE_ERRNO_H 1" >>confdefs.h fi +ac_fn_c_check_header_compile "$LINENO" "fcntl.h" "ac_cv_header_fcntl_h" "$ac_includes_default" +if test "x$ac_cv_header_fcntl_h" = xyes +then : + printf "%s\n" "#define HAVE_FCNTL_H 1" >>confdefs.h -done +fi +ac_fn_c_check_header_compile "$LINENO" "stdio.h" "ac_cv_header_stdio_h" "$ac_includes_default" +if test "x$ac_cv_header_stdio_h" = xyes +then : + printf "%s\n" "#define HAVE_STDIO_H 1" >>confdefs.h -for ac_header in sys/select.h sys/socket.h sys/ioctl.h sys/time.h -do : - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" -if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF +fi +ac_fn_c_check_header_compile "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default" +if test "x$ac_cv_header_stdlib_h" = xyes +then : + printf "%s\n" "#define HAVE_STDLIB_H 1" >>confdefs.h fi +ac_fn_c_check_header_compile "$LINENO" "unistd.h" "ac_cv_header_unistd_h" "$ac_includes_default" +if test "x$ac_cv_header_unistd_h" = xyes +then : + printf "%s\n" "#define HAVE_UNISTD_H 1" >>confdefs.h -done +fi +ac_fn_c_check_header_compile "$LINENO" "sys/uio.h" "ac_cv_header_sys_uio_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_uio_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_UIO_H 1" >>confdefs.h -for ac_header in arpa/inet.h netinet/in.h -do : - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" -if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF +fi + +ac_fn_c_check_header_compile "$LINENO" "sys/select.h" "ac_cv_header_sys_select_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_select_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_SELECT_H 1" >>confdefs.h fi +ac_fn_c_check_header_compile "$LINENO" "sys/socket.h" "ac_cv_header_sys_socket_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_socket_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_SOCKET_H 1" >>confdefs.h -done +fi +ac_fn_c_check_header_compile "$LINENO" "sys/ioctl.h" "ac_cv_header_sys_ioctl_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_ioctl_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_IOCTL_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "sys/time.h" "ac_cv_header_sys_time_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_time_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_TIME_H 1" >>confdefs.h -for ac_header in sys/un.h +fi + +ac_fn_c_check_header_compile "$LINENO" "arpa/inet.h" "ac_cv_header_arpa_inet_h" "$ac_includes_default" +if test "x$ac_cv_header_arpa_inet_h" = xyes +then : + printf "%s\n" "#define HAVE_ARPA_INET_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "netinet/in.h" "ac_cv_header_netinet_in_h" "$ac_includes_default" +if test "x$ac_cv_header_netinet_in_h" = xyes +then : + printf "%s\n" "#define HAVE_NETINET_IN_H 1" >>confdefs.h + +fi + + for ac_header in sys/un.h do : - ac_fn_c_check_header_mongrel "$LINENO" "sys/un.h" "ac_cv_header_sys_un_h" "$ac_includes_default" -if test "x$ac_cv_header_sys_un_h" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_SYS_UN_H 1 -_ACEOF + ac_fn_c_check_header_compile "$LINENO" "sys/un.h" "ac_cv_header_sys_un_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_un_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_UN_H 1" >>confdefs.h have_sys_un_h=yes -else +else $as_nop have_sys_un_h=no fi done - if test "x$have_sys_un_h" = xyes; then HAVE_SYS_UN_H_TRUE= HAVE_SYS_UN_H_FALSE='#' @@ -15364,58 +23353,73 @@ case $host in # These are POSIX-like systems using BSD-like sockets API. ;; *) - for ac_header in windows.h winsock2.h ws2tcpip.h -do : - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" -if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF + ac_fn_c_check_header_compile "$LINENO" "windows.h" "ac_cv_header_windows_h" "$ac_includes_default" +if test "x$ac_cv_header_windows_h" = xyes +then : + printf "%s\n" "#define HAVE_WINDOWS_H 1" >>confdefs.h fi +ac_fn_c_check_header_compile "$LINENO" "winsock2.h" "ac_cv_header_winsock2_h" "$ac_includes_default" +if test "x$ac_cv_header_winsock2_h" = xyes +then : + printf "%s\n" "#define HAVE_WINSOCK2_H 1" >>confdefs.h -done +fi +ac_fn_c_check_header_compile "$LINENO" "ws2tcpip.h" "ac_cv_header_ws2tcpip_h" "$ac_includes_default" +if test "x$ac_cv_header_ws2tcpip_h" = xyes +then : + printf "%s\n" "#define HAVE_WS2TCPIP_H 1" >>confdefs.h + +fi ;; esac case $host in *darwin*|*interix*) - { $as_echo "$as_me:${as_lineno-$LINENO}: poll use is disabled on this platform" >&5 -$as_echo "$as_me: poll use is disabled on this platform" >&6;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: poll use is disabled on this platform" >&5 +printf "%s\n" "$as_me: poll use is disabled on this platform" >&6;} ;; *) - for ac_func in poll -do : - ac_fn_c_check_func "$LINENO" "poll" "ac_cv_func_poll" -if test "x$ac_cv_func_poll" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_POLL 1 -_ACEOF + ac_fn_c_check_func "$LINENO" "poll" "ac_cv_func_poll" +if test "x$ac_cv_func_poll" = xyes +then : + printf "%s\n" "#define HAVE_POLL 1" >>confdefs.h fi -done ;; esac -for ac_func in gettimeofday select strtoll -do : - as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` -ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" -if eval test \"x\$"$as_ac_var"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 -_ACEOF +ac_fn_c_check_func "$LINENO" "gettimeofday" "ac_cv_func_gettimeofday" +if test "x$ac_cv_func_gettimeofday" = xyes +then : + printf "%s\n" "#define HAVE_GETTIMEOFDAY 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "select" "ac_cv_func_select" +if test "x$ac_cv_func_select" = xyes +then : + printf "%s\n" "#define HAVE_SELECT 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "strtoll" "ac_cv_func_strtoll" +if test "x$ac_cv_func_strtoll" = xyes +then : + printf "%s\n" "#define HAVE_STRTOLL 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "memset_s" "ac_cv_func_memset_s" +if test "x$ac_cv_func_memset_s" = xyes +then : + printf "%s\n" "#define HAVE_MEMSET_S 1" >>confdefs.h fi -done if test "$ac_cv_func_select" != "yes"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for select in ws2_32" >&5 -$as_echo_n "checking for select in ws2_32... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for select in ws2_32" >&5 +printf %s "checking for select in ws2_32... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -15427,7 +23431,7 @@ $as_echo_n "checking for select in ws2_32... " >&6; } #endif int -main () +main (void) { select(0,(fd_set *)NULL,(fd_set *)NULL,(fd_set *)NULL,(struct timeval *)NULL); @@ -15436,50 +23440,49 @@ main () return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } HAVE_SELECT="1" -cat >>confdefs.h <<_ACEOF -#define HAVE_SELECT 1 -_ACEOF +printf "%s\n" "#define HAVE_SELECT 1" >>confdefs.h -else +else $as_nop - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext fi ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" -if test "x$ac_cv_type_size_t" = xyes; then : +if test "x$ac_cv_type_size_t" = xyes +then : -else +else $as_nop -cat >>confdefs.h <<_ACEOF -#define size_t unsigned int -_ACEOF +printf "%s\n" "#define size_t unsigned int" >>confdefs.h fi # The Ultrix 4.2 mips builtin alloca declared by alloca.h only works # for constant arguments. Useless! -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for working alloca.h" >&5 -$as_echo_n "checking for working alloca.h... " >&6; } -if ${ac_cv_working_alloca_h+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working alloca.h" >&5 +printf %s "checking for working alloca.h... " >&6; } +if test ${ac_cv_working_alloca_h+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int -main () +main (void) { char *p = (char *) alloca (2 * sizeof (int)); if (p) return 0; @@ -15487,52 +23490,52 @@ char *p = (char *) alloca (2 * sizeof (int)); return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : ac_cv_working_alloca_h=yes -else +else $as_nop ac_cv_working_alloca_h=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_working_alloca_h" >&5 -$as_echo "$ac_cv_working_alloca_h" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_working_alloca_h" >&5 +printf "%s\n" "$ac_cv_working_alloca_h" >&6; } if test $ac_cv_working_alloca_h = yes; then -$as_echo "#define HAVE_ALLOCA_H 1" >>confdefs.h +printf "%s\n" "#define HAVE_ALLOCA_H 1" >>confdefs.h fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for alloca" >&5 -$as_echo_n "checking for alloca... " >&6; } -if ${ac_cv_func_alloca_works+:} false; then : - $as_echo_n "(cached) " >&6 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for alloca" >&5 +printf %s "checking for alloca... " >&6; } +if test ${ac_cv_func_alloca_works+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test $ac_cv_working_alloca_h = yes; then + ac_cv_func_alloca_works=yes else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#ifdef __GNUC__ -# define alloca __builtin_alloca -#else -# ifdef _MSC_VER +#include +#include +#ifndef alloca +# ifdef __GNUC__ +# define alloca __builtin_alloca +# elif defined _MSC_VER # include # define alloca _alloca # else -# ifdef HAVE_ALLOCA_H -# include -# else -# ifdef _AIX - #pragma alloca -# else -# ifndef alloca /* predefined by HP cc +Olibcalls */ -void *alloca (size_t); -# endif -# endif +# ifdef __cplusplus +extern "C" # endif +void *alloca (size_t); # endif #endif int -main () +main (void) { char *p = (char *) alloca (1); if (p) return 0; @@ -15540,20 +23543,22 @@ char *p = (char *) alloca (1); return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : ac_cv_func_alloca_works=yes -else +else $as_nop ac_cv_func_alloca_works=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_alloca_works" >&5 -$as_echo "$ac_cv_func_alloca_works" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_alloca_works" >&5 +printf "%s\n" "$ac_cv_func_alloca_works" >&6; } +fi if test $ac_cv_func_alloca_works = yes; then -$as_echo "#define HAVE_ALLOCA 1" >>confdefs.h +printf "%s\n" "#define HAVE_ALLOCA 1" >>confdefs.h else # The SVR3 libPW and SVR4 libucb both contain incompatible functions @@ -15563,58 +23568,19 @@ else ALLOCA=\${LIBOBJDIR}alloca.$ac_objext -$as_echo "#define C_ALLOCA 1" >>confdefs.h - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether \`alloca.c' needs Cray hooks" >&5 -$as_echo_n "checking whether \`alloca.c' needs Cray hooks... " >&6; } -if ${ac_cv_os_cray+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#if defined CRAY && ! defined CRAY2 -webecray -#else -wenotbecray -#endif - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "webecray" >/dev/null 2>&1; then : - ac_cv_os_cray=yes -else - ac_cv_os_cray=no -fi -rm -f conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_os_cray" >&5 -$as_echo "$ac_cv_os_cray" >&6; } -if test $ac_cv_os_cray = yes; then - for ac_func in _getb67 GETB67 getb67; do - as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` -ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" -if eval test \"x\$"$as_ac_var"\" = x"yes"; then : - -cat >>confdefs.h <<_ACEOF -#define CRAY_STACKSEG_END $ac_func -_ACEOF - - break -fi - - done -fi +printf "%s\n" "#define C_ALLOCA 1" >>confdefs.h -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking stack direction for C alloca" >&5 -$as_echo_n "checking stack direction for C alloca... " >&6; } -if ${ac_cv_c_stack_direction+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test "$cross_compiling" = yes; then : + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking stack direction for C alloca" >&5 +printf %s "checking stack direction for C alloca... " >&6; } +if test ${ac_cv_c_stack_direction+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test "$cross_compiling" = yes +then : ac_cv_c_stack_direction=0 -else +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default @@ -15635,9 +23601,10 @@ main (int argc, char **argv) return find_stack_direction (0, argc + !argv + 20) < 0; } _ACEOF -if ac_fn_c_try_run "$LINENO"; then : +if ac_fn_c_try_run "$LINENO" +then : ac_cv_c_stack_direction=1 -else +else $as_nop ac_cv_c_stack_direction=-1 fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ @@ -15645,27 +23612,26 @@ rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_stack_direction" >&5 -$as_echo "$ac_cv_c_stack_direction" >&6; } -cat >>confdefs.h <<_ACEOF -#define STACK_DIRECTION $ac_cv_c_stack_direction -_ACEOF +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_stack_direction" >&5 +printf "%s\n" "$ac_cv_c_stack_direction" >&6; } +printf "%s\n" "#define STACK_DIRECTION $ac_cv_c_stack_direction" >>confdefs.h fi # Checks for typedefs, structures, and compiler characteristics. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 -$as_echo_n "checking for an ANSI C-conforming const... " >&6; } -if ${ac_cv_c_const+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 +printf %s "checking for an ANSI C-conforming const... " >&6; } +if test ${ac_cv_c_const+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int -main () +main (void) { #ifndef __cplusplus @@ -15678,7 +23644,7 @@ main () /* NEC SVR4.0.2 mips cc rejects this. */ struct point {int x, y;}; static struct point const zero = {0,0}; - /* AIX XL C 1.02.0.0 rejects this. + /* IBM XL C 1.02.0.0 rejects this. It does not let you subtract one const X* pointer from another in an arm of an if-expression whose if-part is not a constant expression */ @@ -15706,7 +23672,7 @@ main () iptr p = 0; ++p; } - { /* AIX XL C 1.02.0.0 rejects this sort of thing, saying + { /* IBM XL C 1.02.0.0 rejects this sort of thing, saying "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ struct s { int j; const int *ap[3]; } bx; struct s *b = &bx; b->j = 5; @@ -15722,47 +23688,50 @@ main () return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : ac_cv_c_const=yes -else +else $as_nop ac_cv_c_const=no fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 -$as_echo "$ac_cv_c_const" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 +printf "%s\n" "$ac_cv_c_const" >&6; } if test $ac_cv_c_const = no; then -$as_echo "#define const /**/" >>confdefs.h +printf "%s\n" "#define const /**/" >>confdefs.h fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 -$as_echo_n "checking for inline... " >&6; } -if ${ac_cv_c_inline+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 +printf %s "checking for inline... " >&6; } +if test ${ac_cv_c_inline+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_cv_c_inline=no for ac_kw in inline __inline__ __inline; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __cplusplus typedef int foo_t; -static $ac_kw foo_t static_foo () {return 0; } -$ac_kw foo_t foo () {return 0; } +static $ac_kw foo_t static_foo (void) {return 0; } +$ac_kw foo_t foo (void) {return 0; } #endif _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : ac_cv_c_inline=$ac_kw fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext test "$ac_cv_c_inline" != no && break done fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5 -$as_echo "$ac_cv_c_inline" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5 +printf "%s\n" "$ac_cv_c_inline" >&6; } case $ac_cv_c_inline in inline | yes) ;; @@ -15781,8 +23750,8 @@ esac - { $as_echo "$as_me:${as_lineno-$LINENO}: checking non-blocking sockets style" >&5 -$as_echo_n "checking non-blocking sockets style... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking non-blocking sockets style" >&5 +printf %s "checking non-blocking sockets style... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -15793,7 +23762,7 @@ $as_echo_n "checking non-blocking sockets style... " >&6; } #include int -main () +main (void) { /* try to compile O_NONBLOCK */ @@ -15819,14 +23788,15 @@ main () return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : nonblock="O_NONBLOCK" -$as_echo "#define HAVE_O_NONBLOCK 1" >>confdefs.h +printf "%s\n" "#define HAVE_O_NONBLOCK 1" >>confdefs.h -else +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -15837,7 +23807,7 @@ else #include int -main () +main (void) { /* FIONBIO source test (old-style unix) */ @@ -15848,14 +23818,15 @@ main () return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : nonblock="FIONBIO" -$as_echo "#define HAVE_FIONBIO 1" >>confdefs.h +printf "%s\n" "#define HAVE_FIONBIO 1" >>confdefs.h -else +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -15878,7 +23849,7 @@ else #endif int -main () +main (void) { /* ioctlsocket source code */ @@ -15891,14 +23862,15 @@ main () return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : nonblock="ioctlsocket" -$as_echo "#define HAVE_IOCTLSOCKET 1" >>confdefs.h +printf "%s\n" "#define HAVE_IOCTLSOCKET 1" >>confdefs.h -else +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -15908,7 +23880,7 @@ else #include int -main () +main (void) { /* IoctlSocket source code */ @@ -15919,14 +23891,15 @@ main () return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : nonblock="IoctlSocket" -$as_echo "#define HAVE_IOCTLSOCKET_CASE 1" >>confdefs.h +printf "%s\n" "#define HAVE_IOCTLSOCKET_CASE 1" >>confdefs.h -else +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -15935,7 +23908,7 @@ else #include int -main () +main (void) { /* SO_NONBLOCK source code */ @@ -15947,49 +23920,98 @@ main () return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : nonblock="SO_NONBLOCK" -$as_echo "#define HAVE_SO_NONBLOCK 1" >>confdefs.h +printf "%s\n" "#define HAVE_SO_NONBLOCK 1" >>confdefs.h -else +else $as_nop nonblock="nada" -$as_echo "#define HAVE_DISABLED_NONBLOCKING 1" >>confdefs.h +printf "%s\n" "#define HAVE_DISABLED_NONBLOCKING 1" >>confdefs.h fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $nonblock" >&5 -$as_echo "$nonblock" >&6; } +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $nonblock" >&5 +printf "%s\n" "$nonblock" >&6; } if test "$nonblock" = "nada"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: non-block sockets disabled" >&5 -$as_echo "$as_me: WARNING: non-block sockets disabled" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: non-block sockets disabled" >&5 +printf "%s\n" "$as_me: WARNING: non-block sockets disabled" >&2;} + fi + + +missing_required_deps=0 + +if test "${libz_errors}" != ""; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: ERROR: ${libz_errors}" >&5 +printf "%s\n" "$as_me: ERROR: ${libz_errors}" >&6;} + missing_required_deps=1 +fi + +if test "$found_crypto" = "none"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: ERROR: ${crypto_errors}" >&5 +printf "%s\n" "$as_me: ERROR: ${crypto_errors}" >&6;} + missing_required_deps=1 +fi + +if test $missing_required_deps = 1; then + as_fn_error $? "Required dependencies are missing!" "$LINENO" 5 +fi + +# Configure parameters + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable compiler warnings as errors" >&5 +printf %s "checking whether to enable compiler warnings as errors... " >&6; } + OPT_COMPILER_WERROR="default" + # Check whether --enable-werror was given. +if test ${enable_werror+y} +then : + enableval=$enable_werror; OPT_COMPILER_WERROR=$enableval +fi + + case "$OPT_COMPILER_WERROR" in + no) + want_werror="no" + ;; + default) + want_werror="no" + ;; + *) + want_werror="yes" + ;; + esac + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $want_werror" >&5 +printf "%s\n" "$want_werror" >&6; } + + if test X"$want_werror" = Xyes; then + CFLAGS="$CFLAGS -Werror" fi -ac_config_files="$ac_config_files Makefile src/Makefile tests/Makefile example/Makefile docs/Makefile libssh2.pc" +ac_config_files="$ac_config_files Makefile src/Makefile tests/Makefile tests/ossfuzz/Makefile example/Makefile docs/Makefile libssh2.pc" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure @@ -16018,8 +24040,8 @@ _ACEOF case $ac_val in #( *${as_nl}*) case $ac_var in #( - *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 -$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( @@ -16049,15 +24071,15 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; /^ac_cv_env_/b end t clear :clear - s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + s/^\([^=]*\)=\(.*[{}].*\)$/test ${\1+y} || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 -$as_echo "$as_me: updating cache $cache_file" >&6;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 +printf "%s\n" "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else @@ -16071,8 +24093,8 @@ $as_echo "$as_me: updating cache $cache_file" >&6;} fi fi else - { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 -$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 +printf "%s\n" "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache @@ -16089,7 +24111,7 @@ U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' - ac_i=`$as_echo "$ac_i" | sed "$ac_script"` + ac_i=`printf "%s\n" "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" @@ -16104,6 +24126,14 @@ if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 +printf %s "checking that generated files are newer than configure... " >&6; } + if test -n "$am_sleep_pid"; then + # Hide warnings about reused PIDs. + wait $am_sleep_pid 2>/dev/null + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: done" >&5 +printf "%s\n" "done" >&6; } if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' @@ -16124,19 +24154,47 @@ if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi +if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi if test -z "${SSHD_TRUE}" && test -z "${SSHD_FALSE}"; then as_fn_error $? "conditional \"SSHD\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi +if test -z "${OPENSSL_TRUE}" && test -z "${OPENSSL_FALSE}"; then + as_fn_error $? "conditional \"OPENSSL\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi if test -z "${LIBGCRYPT_TRUE}" && test -z "${LIBGCRYPT_FALSE}"; then as_fn_error $? "conditional \"LIBGCRYPT\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi +if test -z "${MBEDTLS_TRUE}" && test -z "${MBEDTLS_FALSE}"; then + as_fn_error $? "conditional \"MBEDTLS\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${WINCNG_TRUE}" && test -z "${WINCNG_FALSE}"; then + as_fn_error $? "conditional \"WINCNG\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi if test -z "${BUILD_EXAMPLES_TRUE}" && test -z "${BUILD_EXAMPLES_FALSE}"; then as_fn_error $? "conditional \"BUILD_EXAMPLES\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi +if test -z "${USE_OSSFUZZERS_TRUE}" && test -z "${USE_OSSFUZZERS_FALSE}"; then + as_fn_error $? "conditional \"USE_OSSFUZZERS\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_OSSFUZZ_FLAG_TRUE}" && test -z "${USE_OSSFUZZ_FLAG_FALSE}"; then + as_fn_error $? "conditional \"USE_OSSFUZZ_FLAG\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_OSSFUZZ_STATIC_TRUE}" && test -z "${USE_OSSFUZZ_STATIC_FALSE}"; then + as_fn_error $? "conditional \"USE_OSSFUZZ_STATIC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi if test -z "${HAVE_SYS_UN_H_TRUE}" && test -z "${HAVE_SYS_UN_H_FALSE}"; then as_fn_error $? "conditional \"HAVE_SYS_UN_H\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 @@ -16146,8 +24204,8 @@ fi ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" -{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 -$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 +printf "%s\n" "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL @@ -16170,14 +24228,16 @@ cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : +as_nop=: +if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 +then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST -else +else $as_nop case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( @@ -16187,46 +24247,46 @@ esac fi + +# Reset variables that may have inherited troublesome values from +# the environment. + +# IFS needs to be set, to space, tab, and newline, in precisely that order. +# (If _AS_PATH_WALK were called with IFS unset, it would have the +# side effect of setting IFS to empty, thus disabling word splitting.) +# Quoting is to prevent editors from complaining about space-tab. as_nl=' ' export as_nl -# Printing a long string crashes Solaris 7 /usr/bin/printf. -as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo -# Prefer a ksh shell builtin over an external printf program on Solaris, -# but without wasting forks for bash or zsh. -if test -z "$BASH_VERSION$ZSH_VERSION" \ - && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='print -r --' - as_echo_n='print -rn --' -elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='printf %s\n' - as_echo_n='printf %s' -else - if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then - as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' - as_echo_n='/usr/ucb/echo -n' - else - as_echo_body='eval expr "X$1" : "X\\(.*\\)"' - as_echo_n_body='eval - arg=$1; - case $arg in #( - *"$as_nl"*) - expr "X$arg" : "X\\(.*\\)$as_nl"; - arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; - esac; - expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" - ' - export as_echo_n_body - as_echo_n='sh -c $as_echo_n_body as_echo' - fi - export as_echo_body - as_echo='sh -c $as_echo_body as_echo' -fi +IFS=" "" $as_nl" + +PS1='$ ' +PS2='> ' +PS4='+ ' + +# Ensure predictable behavior from utilities with locale-dependent output. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# We cannot yet rely on "unset" to work, but we need these variables +# to be unset--not just set to an empty or harmless value--now, to +# avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct +# also avoids known problems related to "unset" and subshell syntax +# in other old shells (e.g. bash 2.01 and pdksh 5.2.14). +for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH +do eval test \${$as_var+y} \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done + +# Ensure that fds 0, 1, and 2 are open. +if (exec 3>&0) 2>/dev/null; then :; else exec 0&1) 2>/dev/null; then :; else exec 1>/dev/null; fi +if (exec 3>&2) ; then :; else exec 2>/dev/null; fi # The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then +if ${PATH_SEPARATOR+false} :; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || @@ -16235,13 +24295,6 @@ if test "${PATH_SEPARATOR+set}" != set; then fi -# IFS -# We need space, tab and new line, in precisely that order. Quoting is -# there to prevent editors from complaining about space-tab. -# (If _AS_PATH_WALK were called with IFS unset, it would disable word -# splitting by setting IFS to empty value.) -IFS=" "" $as_nl" - # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( @@ -16250,8 +24303,12 @@ case $0 in #(( for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + test -r "$as_dir$0" && as_myself=$as_dir$0 && break done IFS=$as_save_IFS @@ -16263,30 +24320,10 @@ if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then - $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi -# Unset variables that we do not need and which cause bugs (e.g. in -# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" -# suppresses any "Segmentation fault" message there. '((' could -# trigger a bug in pdksh 5.2.14. -for as_var in BASH_ENV ENV MAIL MAILPATH -do eval test x\${$as_var+set} = xset \ - && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : -done -PS1='$ ' -PS2='> ' -PS4='+ ' - -# NLS nuisances. -LC_ALL=C -export LC_ALL -LANGUAGE=C -export LANGUAGE - -# CDPATH. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] @@ -16299,13 +24336,14 @@ as_fn_error () as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi - $as_echo "$as_me: error: $2" >&2 + printf "%s\n" "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error + # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. @@ -16332,18 +24370,20 @@ as_fn_unset () { eval $1=; unset $1;} } as_unset=as_fn_unset + # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. -if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null +then : eval 'as_fn_append () { eval $1+=\$2 }' -else +else $as_nop as_fn_append () { eval $1=\$$1\$2 @@ -16355,12 +24395,13 @@ fi # as_fn_append # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. -if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null +then : eval 'as_fn_arith () { as_val=$(( $* )) }' -else +else $as_nop as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` @@ -16391,7 +24432,7 @@ as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X/"$0" | +printf "%s\n" X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q @@ -16413,6 +24454,10 @@ as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits + +# Determine whether it's possible to make 'echo' print without a newline. +# These variables are no longer used directly by Autoconf, but are AC_SUBSTed +# for compatibility with existing Makefiles. ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) @@ -16426,6 +24471,12 @@ case `echo -n x` in #((((( ECHO_N='-n';; esac +# For backward compatibility with old third-party macros, we provide +# the shell variables $as_echo and $as_echo_n. New code should use +# AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively. +as_echo='printf %s\n' +as_echo_n='printf %s' + rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file @@ -16467,7 +24518,7 @@ as_fn_mkdir_p () as_dirs= while :; do case $as_dir in #( - *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" @@ -16476,7 +24527,7 @@ $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_dir" | +printf "%s\n" X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q @@ -16539,7 +24590,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # values after options handling. ac_log=" This file was extended by libssh2 $as_me -, which was -generated by GNU Autoconf 2.69. Invocation command line was +generated by GNU Autoconf 2.71. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS @@ -16601,14 +24652,16 @@ $config_commands Report bugs to ." _ACEOF +ac_cs_config=`printf "%s\n" "$ac_configure_args" | sed "$ac_safe_unquote"` +ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\''/g"` cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" +ac_cs_config='$ac_cs_config_escaped' ac_cs_version="\\ libssh2 config.status - -configured by $0, generated by GNU Autoconf 2.69, +configured by $0, generated by GNU Autoconf 2.71, with options \\"\$ac_cs_config\\" -Copyright (C) 2012 Free Software Foundation, Inc. +Copyright (C) 2021 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." @@ -16648,15 +24701,15 @@ do -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) - $as_echo "$ac_cs_version"; exit ;; + printf "%s\n" "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) - $as_echo "$ac_cs_config"; exit ;; + printf "%s\n" "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in - *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" @@ -16664,7 +24717,7 @@ do --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in - *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; @@ -16673,7 +24726,7 @@ do as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) - $as_echo "$ac_cs_usage"; exit ;; + printf "%s\n" "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; @@ -16701,7 +24754,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift - \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 + \printf "%s\n" "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" @@ -16715,7 +24768,7 @@ exec 5>>config.log sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX - $as_echo "$ac_log" + printf "%s\n" "$ac_log" } >&5 _ACEOF @@ -16723,7 +24776,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # -AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" +AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}" # The HP-UX ksh and POSIX shell print the target directory to stdout @@ -16742,6 +24795,7 @@ enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' +shared_archive_member_spec='`$ECHO "$shared_archive_member_spec" | $SED "$delay_single_quote_subst"`' SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`' @@ -16789,10 +24843,13 @@ compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_import='`$ECHO "$lt_cv_sys_global_symbol_to_import" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' +lt_cv_nm_interface='`$ECHO "$lt_cv_nm_interface" | $SED "$delay_single_quote_subst"`' nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' +lt_cv_truncate_bin='`$ECHO "$lt_cv_truncate_bin" | $SED "$delay_single_quote_subst"`' objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' @@ -16857,13 +24914,68 @@ finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' -sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`' +configure_time_dlsearch_path='`$ECHO "$configure_time_dlsearch_path" | $SED "$delay_single_quote_subst"`' +configure_time_lt_sys_library_path='`$ECHO "$configure_time_lt_sys_library_path" | $SED "$delay_single_quote_subst"`' hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_dirs='`$ECHO "$compiler_lib_search_dirs" | $SED "$delay_single_quote_subst"`' +predep_objects='`$ECHO "$predep_objects" | $SED "$delay_single_quote_subst"`' +postdep_objects='`$ECHO "$postdep_objects" | $SED "$delay_single_quote_subst"`' +predeps='`$ECHO "$predeps" | $SED "$delay_single_quote_subst"`' +postdeps='`$ECHO "$postdeps" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_path='`$ECHO "$compiler_lib_search_path" | $SED "$delay_single_quote_subst"`' +LD_CXX='`$ECHO "$LD_CXX" | $SED "$delay_single_quote_subst"`' +reload_flag_CXX='`$ECHO "$reload_flag_CXX" | $SED "$delay_single_quote_subst"`' +reload_cmds_CXX='`$ECHO "$reload_cmds_CXX" | $SED "$delay_single_quote_subst"`' +old_archive_cmds_CXX='`$ECHO "$old_archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' +compiler_CXX='`$ECHO "$compiler_CXX" | $SED "$delay_single_quote_subst"`' +GCC_CXX='`$ECHO "$GCC_CXX" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "$lt_prog_compiler_no_builtin_flag_CXX" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_pic_CXX='`$ECHO "$lt_prog_compiler_pic_CXX" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_wl_CXX='`$ECHO "$lt_prog_compiler_wl_CXX" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_static_CXX='`$ECHO "$lt_prog_compiler_static_CXX" | $SED "$delay_single_quote_subst"`' +lt_cv_prog_compiler_c_o_CXX='`$ECHO "$lt_cv_prog_compiler_c_o_CXX" | $SED "$delay_single_quote_subst"`' +archive_cmds_need_lc_CXX='`$ECHO "$archive_cmds_need_lc_CXX" | $SED "$delay_single_quote_subst"`' +enable_shared_with_static_runtimes_CXX='`$ECHO "$enable_shared_with_static_runtimes_CXX" | $SED "$delay_single_quote_subst"`' +export_dynamic_flag_spec_CXX='`$ECHO "$export_dynamic_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' +whole_archive_flag_spec_CXX='`$ECHO "$whole_archive_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' +compiler_needs_object_CXX='`$ECHO "$compiler_needs_object_CXX" | $SED "$delay_single_quote_subst"`' +old_archive_from_new_cmds_CXX='`$ECHO "$old_archive_from_new_cmds_CXX" | $SED "$delay_single_quote_subst"`' +old_archive_from_expsyms_cmds_CXX='`$ECHO "$old_archive_from_expsyms_cmds_CXX" | $SED "$delay_single_quote_subst"`' +archive_cmds_CXX='`$ECHO "$archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' +archive_expsym_cmds_CXX='`$ECHO "$archive_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' +module_cmds_CXX='`$ECHO "$module_cmds_CXX" | $SED "$delay_single_quote_subst"`' +module_expsym_cmds_CXX='`$ECHO "$module_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' +with_gnu_ld_CXX='`$ECHO "$with_gnu_ld_CXX" | $SED "$delay_single_quote_subst"`' +allow_undefined_flag_CXX='`$ECHO "$allow_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' +no_undefined_flag_CXX='`$ECHO "$no_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec_CXX='`$ECHO "$hardcode_libdir_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_separator_CXX='`$ECHO "$hardcode_libdir_separator_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_direct_CXX='`$ECHO "$hardcode_direct_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_direct_absolute_CXX='`$ECHO "$hardcode_direct_absolute_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_minus_L_CXX='`$ECHO "$hardcode_minus_L_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_shlibpath_var_CXX='`$ECHO "$hardcode_shlibpath_var_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_automatic_CXX='`$ECHO "$hardcode_automatic_CXX" | $SED "$delay_single_quote_subst"`' +inherit_rpath_CXX='`$ECHO "$inherit_rpath_CXX" | $SED "$delay_single_quote_subst"`' +link_all_deplibs_CXX='`$ECHO "$link_all_deplibs_CXX" | $SED "$delay_single_quote_subst"`' +always_export_symbols_CXX='`$ECHO "$always_export_symbols_CXX" | $SED "$delay_single_quote_subst"`' +export_symbols_cmds_CXX='`$ECHO "$export_symbols_cmds_CXX" | $SED "$delay_single_quote_subst"`' +exclude_expsyms_CXX='`$ECHO "$exclude_expsyms_CXX" | $SED "$delay_single_quote_subst"`' +include_expsyms_CXX='`$ECHO "$include_expsyms_CXX" | $SED "$delay_single_quote_subst"`' +prelink_cmds_CXX='`$ECHO "$prelink_cmds_CXX" | $SED "$delay_single_quote_subst"`' +postlink_cmds_CXX='`$ECHO "$postlink_cmds_CXX" | $SED "$delay_single_quote_subst"`' +file_list_spec_CXX='`$ECHO "$file_list_spec_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_action_CXX='`$ECHO "$hardcode_action_CXX" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_dirs_CXX='`$ECHO "$compiler_lib_search_dirs_CXX" | $SED "$delay_single_quote_subst"`' +predep_objects_CXX='`$ECHO "$predep_objects_CXX" | $SED "$delay_single_quote_subst"`' +postdep_objects_CXX='`$ECHO "$postdep_objects_CXX" | $SED "$delay_single_quote_subst"`' +predeps_CXX='`$ECHO "$predeps_CXX" | $SED "$delay_single_quote_subst"`' +postdeps_CXX='`$ECHO "$postdeps_CXX" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_path_CXX='`$ECHO "$compiler_lib_search_path_CXX" | $SED "$delay_single_quote_subst"`' LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' @@ -16909,9 +25021,12 @@ CFLAGS \ compiler \ lt_cv_sys_global_symbol_pipe \ lt_cv_sys_global_symbol_to_cdecl \ +lt_cv_sys_global_symbol_to_import \ lt_cv_sys_global_symbol_to_c_name_address \ lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ +lt_cv_nm_interface \ nm_file_list_spec \ +lt_cv_truncate_bin \ lt_prog_compiler_no_builtin_flag \ lt_prog_compiler_pic \ lt_prog_compiler_wl \ @@ -16943,10 +25058,41 @@ soname_spec \ install_override_mode \ finish_eval \ old_striplib \ -striplib; do +striplib \ +compiler_lib_search_dirs \ +predep_objects \ +postdep_objects \ +predeps \ +postdeps \ +compiler_lib_search_path \ +LD_CXX \ +reload_flag_CXX \ +compiler_CXX \ +lt_prog_compiler_no_builtin_flag_CXX \ +lt_prog_compiler_pic_CXX \ +lt_prog_compiler_wl_CXX \ +lt_prog_compiler_static_CXX \ +lt_cv_prog_compiler_c_o_CXX \ +export_dynamic_flag_spec_CXX \ +whole_archive_flag_spec_CXX \ +compiler_needs_object_CXX \ +with_gnu_ld_CXX \ +allow_undefined_flag_CXX \ +no_undefined_flag_CXX \ +hardcode_libdir_flag_spec_CXX \ +hardcode_libdir_separator_CXX \ +exclude_expsyms_CXX \ +include_expsyms_CXX \ +file_list_spec_CXX \ +compiler_lib_search_dirs_CXX \ +predep_objects_CXX \ +postdep_objects_CXX \ +predeps_CXX \ +postdeps_CXX \ +compiler_lib_search_path_CXX; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) - eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" @@ -16973,10 +25119,22 @@ postinstall_cmds \ postuninstall_cmds \ finish_cmds \ sys_lib_search_path_spec \ -sys_lib_dlsearch_path_spec; do +configure_time_dlsearch_path \ +configure_time_lt_sys_library_path \ +reload_cmds_CXX \ +old_archive_cmds_CXX \ +old_archive_from_new_cmds_CXX \ +old_archive_from_expsyms_cmds_CXX \ +archive_cmds_CXX \ +archive_expsym_cmds_CXX \ +module_cmds_CXX \ +module_expsym_cmds_CXX \ +export_symbols_cmds_CXX \ +prelink_cmds_CXX \ +postlink_cmds_CXX; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) - eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" @@ -16985,25 +25143,24 @@ sys_lib_dlsearch_path_spec; do done ac_aux_dir='$ac_aux_dir' -xsi_shell='$xsi_shell' -lt_shell_append='$lt_shell_append' -# See if we are running on zsh, and set the options which allow our +# See if we are running on zsh, and set the options that allow our # commands through without removal of \ escapes INIT. -if test -n "\${ZSH_VERSION+set}" ; then +if test -n "\${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi PACKAGE='$PACKAGE' VERSION='$VERSION' - TIMESTAMP='$TIMESTAMP' RM='$RM' ofile='$ofile' + + _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 @@ -17013,12 +25170,12 @@ for ac_config_target in $ac_config_targets do case $ac_config_target in "src/libssh2_config.h") CONFIG_HEADERS="$CONFIG_HEADERS src/libssh2_config.h" ;; - "example/libssh2_config.h") CONFIG_HEADERS="$CONFIG_HEADERS example/libssh2_config.h" ;; "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; "tests/Makefile") CONFIG_FILES="$CONFIG_FILES tests/Makefile" ;; + "tests/ossfuzz/Makefile") CONFIG_FILES="$CONFIG_FILES tests/ossfuzz/Makefile" ;; "example/Makefile") CONFIG_FILES="$CONFIG_FILES example/Makefile" ;; "docs/Makefile") CONFIG_FILES="$CONFIG_FILES docs/Makefile" ;; "libssh2.pc") CONFIG_FILES="$CONFIG_FILES libssh2.pc" ;; @@ -17033,9 +25190,9 @@ done # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then - test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files - test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers - test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands + test ${CONFIG_FILES+y} || CONFIG_FILES=$config_files + test ${CONFIG_HEADERS+y} || CONFIG_HEADERS=$config_headers + test ${CONFIG_COMMANDS+y} || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree @@ -17371,7 +25528,7 @@ do esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac - case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + case $ac_f in *\'*) ac_f=`printf "%s\n" "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done @@ -17379,17 +25536,17 @@ do # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` - $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + printf "%s\n" "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" - { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 -$as_echo "$as_me: creating $ac_file" >&6;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 +printf "%s\n" "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) - ac_sed_conf_input=`$as_echo "$configure_input" | + ac_sed_conf_input=`printf "%s\n" "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac @@ -17406,7 +25563,7 @@ $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$ac_file" | +printf "%s\n" X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q @@ -17430,9 +25587,9 @@ $as_echo X"$ac_file" | case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) - ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. - ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; @@ -17494,8 +25651,8 @@ ac_sed_dataroot=' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 -$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +printf "%s\n" "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' @@ -17539,9 +25696,9 @@ test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 -$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +printf "%s\n" "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" @@ -17557,20 +25714,20 @@ which seems to be undefined. Please make sure it is defined" >&2;} # if test x"$ac_file" != x-; then { - $as_echo "/* $configure_input */" \ + printf "%s\n" "/* $configure_input */" >&1 \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then - { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 -$as_echo "$as_me: $ac_file is unchanged" >&6;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 +printf "%s\n" "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else - $as_echo "/* $configure_input */" \ + printf "%s\n" "/* $configure_input */" >&1 \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi @@ -17590,7 +25747,7 @@ $as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$_am_arg" : 'X\(//\)[^/]' \| \ X"$_am_arg" : 'X\(//\)$' \| \ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$_am_arg" | +printf "%s\n" X"$_am_arg" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q @@ -17610,40 +25767,46 @@ $as_echo X"$_am_arg" | s/.*/./; q'`/stamp-h$_am_stamp_count ;; - :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 -$as_echo "$as_me: executing $ac_file commands" >&6;} + :C) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 +printf "%s\n" "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { - # Autoconf 2.62 quotes --file arguments for eval, but not when files + # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. - case $CONFIG_FILES in - *\'*) eval set x "$CONFIG_FILES" ;; - *) set x $CONFIG_FILES ;; - esac + # TODO: see whether this extra hack can be removed once we start + # requiring Autoconf 2.70 or later. + case $CONFIG_FILES in #( + *\'*) : + eval set x "$CONFIG_FILES" ;; #( + *) : + set x $CONFIG_FILES ;; #( + *) : + ;; +esac shift - for mf + # Used to flag and report bootstrapping failures. + am_rc=0 + for am_mf do # Strip MF so we end up with the name of the file. - mf=`echo "$mf" | sed -e 's/:.*$//'` - # Check whether this is an Automake generated Makefile or not. - # We used to match only the files named `Makefile.in', but - # some people rename them; so instead we look at the file content. - # Grep'ing the first line is not enough: some people post-process - # each Makefile.in and add a new line on top of each file to say so. - # Grep'ing the whole file is not good either: AIX grep has a line + am_mf=`printf "%s\n" "$am_mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile which includes + # dependency-tracking related rules and includes. + # Grep'ing the whole file directly is not great: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. - if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then - dirpart=`$as_dirname -- "$mf" || -$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$mf" : 'X\(//\)[^/]' \| \ - X"$mf" : 'X\(//\)$' \| \ - X"$mf" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$mf" | + sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \ + || continue + am_dirpart=`$as_dirname -- "$am_mf" || +$as_expr X"$am_mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$am_mf" : 'X\(//\)[^/]' \| \ + X"$am_mf" : 'X\(//\)$' \| \ + X"$am_mf" : 'X\(/\)' \| . 2>/dev/null || +printf "%s\n" X"$am_mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q @@ -17661,108 +25824,100 @@ $as_echo X"$mf" | q } s/.*/./; q'` - else - continue - fi - # Extract the definition of DEPDIR, am__include, and am__quote - # from the Makefile without running `make'. - DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` - test -z "$DEPDIR" && continue - am__include=`sed -n 's/^am__include = //p' < "$mf"` - test -z "am__include" && continue - am__quote=`sed -n 's/^am__quote = //p' < "$mf"` - # When using ansi2knr, U may be empty or an underscore; expand it - U=`sed -n 's/^U = //p' < "$mf"` - # Find all dependency output files, they are included files with - # $(DEPDIR) in their names. We invoke sed twice because it is the - # simplest approach to changing $(DEPDIR) to its actual value in the - # expansion. - for file in `sed -n " - s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ - sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do - # Make sure the directory exists. - test -f "$dirpart/$file" && continue - fdir=`$as_dirname -- "$file" || -$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$file" : 'X\(//\)[^/]' \| \ - X"$file" : 'X\(//\)$' \| \ - X"$file" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$file" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ + am_filepart=`$as_basename -- "$am_mf" || +$as_expr X/"$am_mf" : '.*/\([^/][^/]*\)/*$' \| \ + X"$am_mf" : 'X\(//\)$' \| \ + X"$am_mf" : 'X\(/\)' \| . 2>/dev/null || +printf "%s\n" X/"$am_mf" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } - /^X\(\/\/\)$/{ + /^X\/\(\/\/\)$/{ s//\1/ q } - /^X\(\/\).*/{ + /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` - as_dir=$dirpart/$fdir; as_fn_mkdir_p - # echo "creating $dirpart/$file" - echo '# dummy' > "$dirpart/$file" - done + { echo "$as_me:$LINENO: cd "$am_dirpart" \ + && sed -e '/# am--include-marker/d' "$am_filepart" \ + | $MAKE -f - am--depfiles" >&5 + (cd "$am_dirpart" \ + && sed -e '/# am--include-marker/d' "$am_filepart" \ + | $MAKE -f - am--depfiles) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } || am_rc=$? done + if test $am_rc -ne 0; then + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "Something went wrong bootstrapping makefile fragments + for automatic dependency tracking. If GNU make was not used, consider + re-running the configure script with MAKE=\"gmake\" (or whatever is + necessary). You can also try re-running configure with the + '--disable-dependency-tracking' option to at least be able to build + the package (albeit without support for automatic dependency tracking). +See \`config.log' for more details" "$LINENO" 5; } + fi + { am_dirpart=; unset am_dirpart;} + { am_filepart=; unset am_filepart;} + { am_mf=; unset am_mf;} + { am_rc=; unset am_rc;} + rm -f conftest-deps.mk } ;; "libtool":C) - # See if we are running on zsh, and set the options which allow our + # See if we are running on zsh, and set the options that allow our # commands through without removal of \ escapes. - if test -n "${ZSH_VERSION+set}" ; then + if test -n "${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi - cfgfile="${ofile}T" + cfgfile=${ofile}T trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL - -# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. -# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION -# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: +# Generated automatically by $as_me ($PACKAGE) $VERSION # NOTE: Changes made to this file will be lost: look at ltmain.sh. + +# Provide generalized library-building support services. +# Written by Gordon Matzigkeit, 1996 + +# Copyright (C) 2014 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# GNU Libtool is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of of the License, or +# (at your option) any later version. # -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, -# 2006, 2007, 2008, 2009, 2010, 2011 Free Software -# Foundation, Inc. -# Written by Gordon Matzigkeit, 1996 -# -# This file is part of GNU Libtool. -# -# GNU Libtool is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of -# the License, or (at your option) any later version. -# -# As a special exception to the GNU General Public License, -# if you distribute this file as part of a program or library that -# is built using GNU Libtool, you may include this file under the -# same distribution terms that you use for the rest of that program. +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program or library that is built +# using GNU Libtool, you may include this file under the same +# distribution terms that you use for the rest of that program. # -# GNU Libtool is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of +# GNU Libtool is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License -# along with GNU Libtool; see the file COPYING. If not, a copy -# can be downloaded from http://www.gnu.org/licenses/gpl.html, or -# obtained by writing to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# along with this program. If not, see . # The names of the tagged configurations supported by this script. -available_tags="" +available_tags='CXX ' + +# Configured defaults for sys_lib_dlsearch_path munging. +: \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"} # ### BEGIN LIBTOOL CONFIG @@ -17791,6 +25946,9 @@ pic_mode=$pic_mode # Whether or not to optimize for fast installation. fast_install=$enable_fast_install +# Shared archive member basename,for filename based shared library versioning on AIX. +shared_archive_member_spec=$shared_archive_member_spec + # Shell to use when invoking shell scripts. SHELL=$lt_SHELL @@ -17902,18 +26060,27 @@ global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration. global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl +# Transform the output of nm into a list of symbols to manually relocate. +global_symbol_to_import=$lt_lt_cv_sys_global_symbol_to_import + # Transform the output of nm in a C name address pair. global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # Transform the output of nm in a C name address pair when lib prefix is needed. global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix +# The name lister interface. +nm_interface=$lt_lt_cv_nm_interface + # Specify filename containing input files for \$NM. nm_file_list_spec=$lt_nm_file_list_spec -# The root where to search for dependent libraries,and in which our libraries should be installed. +# The root where to search for dependent libraries,and where our libraries should be installed. lt_sysroot=$lt_sysroot +# Command to truncate a binary pipe. +lt_truncate_bin=$lt_lt_cv_truncate_bin + # The name of the directory that contains temporary libtool files. objdir=$objdir @@ -18004,8 +26171,11 @@ hardcode_into_libs=$hardcode_into_libs # Compile-time system search path for libraries. sys_lib_search_path_spec=$lt_sys_lib_search_path_spec -# Run-time system search path for libraries. -sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec +# Detected run-time system search path for libraries. +sys_lib_dlsearch_path_spec=$lt_configure_time_dlsearch_path + +# Explicit LT_SYS_LIBRARY_PATH set during ./configure time. +configure_time_lt_sys_library_path=$lt_configure_time_lt_sys_library_path # Whether dlopen is supported. dlopen_support=$enable_dlopen @@ -18098,13 +26268,13 @@ hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator -# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes +# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes # DIR into the resulting binary. hardcode_direct=$hardcode_direct -# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes +# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes # DIR into the resulting binary and the resulting library dependency is -# "absolute",i.e impossible to change by setting \${shlibpath_var} if the +# "absolute",i.e impossible to change by setting \$shlibpath_var if the # library is relocated. hardcode_direct_absolute=$hardcode_direct_absolute @@ -18152,8 +26322,81 @@ file_list_spec=$lt_file_list_spec # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action +# The directories searched by this compiler when creating a shared library. +compiler_lib_search_dirs=$lt_compiler_lib_search_dirs + +# Dependencies to place before and after the objects being linked to +# create a shared library. +predep_objects=$lt_predep_objects +postdep_objects=$lt_postdep_objects +predeps=$lt_predeps +postdeps=$lt_postdeps + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path + # ### END LIBTOOL CONFIG +_LT_EOF + + cat <<'_LT_EOF' >> "$cfgfile" + +# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE + +# func_munge_path_list VARIABLE PATH +# ----------------------------------- +# VARIABLE is name of variable containing _space_ separated list of +# directories to be munged by the contents of PATH, which is string +# having a format: +# "DIR[:DIR]:" +# string "DIR[ DIR]" will be prepended to VARIABLE +# ":DIR[:DIR]" +# string "DIR[ DIR]" will be appended to VARIABLE +# "DIRP[:DIRP]::[DIRA:]DIRA" +# string "DIRP[ DIRP]" will be prepended to VARIABLE and string +# "DIRA[ DIRA]" will be appended to VARIABLE +# "DIR[:DIR]" +# VARIABLE will be replaced by "DIR[ DIR]" +func_munge_path_list () +{ + case x$2 in + x) + ;; + *:) + eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\" + ;; + x:*) + eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\" + ;; + *::*) + eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" + eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\" + ;; + *) + eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\" + ;; + esac +} + + +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +func_cc_basename () +{ + for cc_temp in $*""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac + done + func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +} + + +# ### END FUNCTIONS SHARED WITH CONFIGURE + _LT_EOF case $host_os in @@ -18162,7 +26405,7 @@ _LT_EOF # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. -if test "X${COLLECT_NAMES+set}" != Xset; then +if test set != "${COLLECT_NAMES+set}"; then COLLECT_NAMES= export COLLECT_NAMES fi @@ -18171,7 +26414,8 @@ _LT_EOF esac -ltmain="$ac_aux_dir/ltmain.sh" + +ltmain=$ac_aux_dir/ltmain.sh # We use sed instead of cat because bash on DJGPP gets confused if @@ -18181,169 +26425,163 @@ ltmain="$ac_aux_dir/ltmain.sh" sed '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) - if test x"$xsi_shell" = xyes; then - sed -e '/^func_dirname ()$/,/^} # func_dirname /c\ -func_dirname ()\ -{\ -\ case ${1} in\ -\ */*) func_dirname_result="${1%/*}${2}" ;;\ -\ * ) func_dirname_result="${3}" ;;\ -\ esac\ -} # Extended-shell func_dirname implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_basename ()$/,/^} # func_basename /c\ -func_basename ()\ -{\ -\ func_basename_result="${1##*/}"\ -} # Extended-shell func_basename implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_dirname_and_basename ()$/,/^} # func_dirname_and_basename /c\ -func_dirname_and_basename ()\ -{\ -\ case ${1} in\ -\ */*) func_dirname_result="${1%/*}${2}" ;;\ -\ * ) func_dirname_result="${3}" ;;\ -\ esac\ -\ func_basename_result="${1##*/}"\ -} # Extended-shell func_dirname_and_basename implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_stripname ()$/,/^} # func_stripname /c\ -func_stripname ()\ -{\ -\ # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\ -\ # positional parameters, so assign one to ordinary parameter first.\ -\ func_stripname_result=${3}\ -\ func_stripname_result=${func_stripname_result#"${1}"}\ -\ func_stripname_result=${func_stripname_result%"${2}"}\ -} # Extended-shell func_stripname implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_split_long_opt ()$/,/^} # func_split_long_opt /c\ -func_split_long_opt ()\ -{\ -\ func_split_long_opt_name=${1%%=*}\ -\ func_split_long_opt_arg=${1#*=}\ -} # Extended-shell func_split_long_opt implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_split_short_opt ()$/,/^} # func_split_short_opt /c\ -func_split_short_opt ()\ -{\ -\ func_split_short_opt_arg=${1#??}\ -\ func_split_short_opt_name=${1%"$func_split_short_opt_arg"}\ -} # Extended-shell func_split_short_opt implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_lo2o ()$/,/^} # func_lo2o /c\ -func_lo2o ()\ -{\ -\ case ${1} in\ -\ *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\ -\ *) func_lo2o_result=${1} ;;\ -\ esac\ -} # Extended-shell func_lo2o implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_xform ()$/,/^} # func_xform /c\ -func_xform ()\ -{\ - func_xform_result=${1%.*}.lo\ -} # Extended-shell func_xform implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_arith ()$/,/^} # func_arith /c\ -func_arith ()\ -{\ - func_arith_result=$(( $* ))\ -} # Extended-shell func_arith implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_len ()$/,/^} # func_len /c\ -func_len ()\ -{\ - func_len_result=${#1}\ -} # Extended-shell func_len implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - -fi - -if test x"$lt_shell_append" = xyes; then - sed -e '/^func_append ()$/,/^} # func_append /c\ -func_append ()\ -{\ - eval "${1}+=\\${2}"\ -} # Extended-shell func_append implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_append_quoted ()$/,/^} # func_append_quoted /c\ -func_append_quoted ()\ -{\ -\ func_quote_for_eval "${2}"\ -\ eval "${1}+=\\\\ \\$func_quote_for_eval_result"\ -} # Extended-shell func_append_quoted implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - # Save a `func_append' function call where possible by direct use of '+=' - sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") - test 0 -eq $? || _lt_function_replace_fail=: -else - # Save a `func_append' function call even when '+=' is not available - sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") - test 0 -eq $? || _lt_function_replace_fail=: -fi - -if test x"$_lt_function_replace_fail" = x":"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to substitute extended shell functions in $ofile" >&5 -$as_echo "$as_me: WARNING: Unable to substitute extended shell functions in $ofile" >&2;} -fi - - mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" + + cat <<_LT_EOF >> "$ofile" + +# ### BEGIN LIBTOOL TAG CONFIG: CXX + +# The linker used to build libraries. +LD=$lt_LD_CXX + +# How to create reloadable object files. +reload_flag=$lt_reload_flag_CXX +reload_cmds=$lt_reload_cmds_CXX + +# Commands used to build an old-style archive. +old_archive_cmds=$lt_old_archive_cmds_CXX + +# A language specific compiler. +CC=$lt_compiler_CXX + +# Is the compiler the GNU compiler? +with_gcc=$GCC_CXX + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic_CXX + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl_CXX + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static_CXX + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc_CXX + +# Whether or not to disallow shared libs when runtime libs are static. +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX + +# Whether the compiler copes with passing no objects directly. +compiler_needs_object=$lt_compiler_needs_object_CXX + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX + +# Commands used to build a shared archive. +archive_cmds=$lt_archive_cmds_CXX +archive_expsym_cmds=$lt_archive_expsym_cmds_CXX + +# Commands used to build a loadable module if different from building +# a shared archive. +module_cmds=$lt_module_cmds_CXX +module_expsym_cmds=$lt_module_expsym_cmds_CXX + +# Whether we are building with GNU ld or not. +with_gnu_ld=$lt_with_gnu_ld_CXX + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag_CXX + +# Flag that enforces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag_CXX + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX + +# Whether we need a single "-rpath" flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX + +# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes +# DIR into the resulting binary. +hardcode_direct=$hardcode_direct_CXX + +# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes +# DIR into the resulting binary and the resulting library dependency is +# "absolute",i.e impossible to change by setting \$shlibpath_var if the +# library is relocated. +hardcode_direct_absolute=$hardcode_direct_absolute_CXX + +# Set to "yes" if using the -LDIR flag during linking hardcodes DIR +# into the resulting binary. +hardcode_minus_L=$hardcode_minus_L_CXX + +# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR +# into the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX + +# Set to "yes" if building a shared library automatically hardcodes DIR +# into the library and all subsequent libraries and executables linked +# against it. +hardcode_automatic=$hardcode_automatic_CXX + +# Set to yes if linker adds runtime paths of dependent libraries +# to runtime path list. +inherit_rpath=$inherit_rpath_CXX + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs_CXX + +# Set to "yes" if exported symbols are required. +always_export_symbols=$always_export_symbols_CXX + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds_CXX + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms_CXX + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms_CXX + +# Commands necessary for linking programs (against libraries) with templates. +prelink_cmds=$lt_prelink_cmds_CXX + +# Commands necessary for finishing linking programs. +postlink_cmds=$lt_postlink_cmds_CXX + +# Specify filename containing input files. +file_list_spec=$lt_file_list_spec_CXX + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action_CXX + +# The directories searched by this compiler when creating a shared library. +compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX + +# Dependencies to place before and after the objects being linked to +# create a shared library. +predep_objects=$lt_predep_objects_CXX +postdep_objects=$lt_postdep_objects_CXX +predeps=$lt_predeps_CXX +postdeps=$lt_postdeps_CXX + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path_CXX + +# ### END LIBTOOL TAG CONFIG: CXX +_LT_EOF + ;; esac @@ -18379,12 +26617,12 @@ if test "$no_create" != yes; then $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 -$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 +printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: summary of build options: +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: summary of build options: version: ${LIBSSH2VER} Host type: ${host} @@ -18392,13 +26630,14 @@ fi Compiler: ${CC} Compiler flags: ${CFLAGS} Library types: Shared=${enable_shared}, Static=${enable_static} - Crypto library: openssl: ${ac_cv_libssl:-no} (AES-CTR: ${ac_cv_func_EVP_aes_128_ctr:-N/A}) libgcrypt: ${ac_cv_libgcrypt:-no} + Crypto library: ${found_crypto_str} + Clear memory: $enable_clear_memory Debug build: $enable_debug Build examples: $build_examples Path to sshd: $ac_cv_path_SSHD (only for self-tests) - libz compression: $ac_cv_libz + zlib compression: ${found_libz} " >&5 -$as_echo "$as_me: summary of build options: +printf "%s\n" "$as_me: summary of build options: version: ${LIBSSH2VER} Host type: ${host} @@ -18406,9 +26645,11 @@ $as_echo "$as_me: summary of build options: Compiler: ${CC} Compiler flags: ${CFLAGS} Library types: Shared=${enable_shared}, Static=${enable_static} - Crypto library: openssl: ${ac_cv_libssl:-no} (AES-CTR: ${ac_cv_func_EVP_aes_128_ctr:-N/A}) libgcrypt: ${ac_cv_libgcrypt:-no} + Crypto library: ${found_crypto_str} + Clear memory: $enable_clear_memory Debug build: $enable_debug Build examples: $build_examples Path to sshd: $ac_cv_path_SSHD (only for self-tests) - libz compression: $ac_cv_libz + zlib compression: ${found_libz} " >&6;} + diff --git a/vendor/libssh2/configure.ac b/vendor/libssh2/configure.ac index dfc6988908..c4fc3e4e30 100644 --- a/vendor/libssh2/configure.ac +++ b/vendor/libssh2/configure.ac @@ -2,8 +2,9 @@ AC_INIT(libssh2, [-], libssh2-devel@cool.haxx.se) AC_CONFIG_MACRO_DIR([m4]) AC_CONFIG_SRCDIR([src]) -AM_CONFIG_HEADER([src/libssh2_config.h example/libssh2_config.h]) +AC_CONFIG_HEADERS([src/libssh2_config.h]) AM_MAINTAINER_MODE +m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) dnl SED is needed by some of the tools AC_PATH_PROG( SED, sed, sed-was-not-found-by-configure, @@ -35,12 +36,9 @@ case "$host" in CFLAGS="$CFLAGS -DLIBSSH2_WIN32" LIBS="$LIBS -lws2_32" ;; - *-cygwin) - CFLAGS="$CFLAGS -DLIBSSH2_WIN32" + *darwin*) + CFLAGS="$CFLAGS -DLIBSSH2_DARWIN" ;; - *darwin*) - CFLAGS="$CFLAGS -DLIBSSH2_DARWIN" - ;; *hpux*) ;; *osf*) @@ -68,6 +66,7 @@ AC_SEARCH_LIBS(inet_addr, nsl) AC_SUBST(LIBS) AC_PROG_CC +AC_PROG_CXX AC_PROG_INSTALL AC_PROG_LN_S AC_PROG_MAKE_SET @@ -82,60 +81,81 @@ AC_C_BIGENDIAN dnl check for how to do large files AC_SYS_LARGEFILE -# Configure parameters -AC_ARG_WITH(libgcrypt, - AC_HELP_STRING([--with-libgcrypt],[Use Libgcrypt for crypto]), - use_libgcrypt=$withval,use_libgcrypt=auto) -AC_ARG_WITH(openssl, - AC_HELP_STRING([--with-openssl],[Use OpenSSL for crypto]), - use_openssl=$withval,use_openssl=auto) -AC_ARG_WITH(libz, - AC_HELP_STRING([--with-libz],[Use Libz for compression]), - use_libz=$withval,use_libz=auto) - -# Look for OpenSSL (default) -if test "$use_openssl" != "no" && test "$use_libgcrypt" != "yes"; then - AC_LIB_HAVE_LINKFLAGS([ssl], [crypto], [#include ]) - LIBSREQUIRED=libssl,libcrypto -fi +# Crypto backends -# Look for libgcrypt -if test "$ac_cv_libssl" != "yes" && test "$use_libgcrypt" != "no"; then - AC_LIB_HAVE_LINKFLAGS([gcrypt], [], [#include ]) - LIBS="$LIBS -lgcrypt" -fi +found_crypto=none +found_crypto_str="" +support_clear_memory=no +crypto_errors="" -AC_SUBST(LIBSREQUIRED) +m4_set_add([crypto_backends], [openssl]) +m4_set_add([crypto_backends], [libgcrypt]) +m4_set_add([crypto_backends], [mbedtls]) +m4_set_add([crypto_backends], [wincng]) -if test "$ac_cv_libssl" != "yes" && test "$ac_cv_libgcrypt" != "yes"; then - AC_MSG_ERROR([cannot find OpenSSL or Libgcrypt, -try --with-libssl-prefix=PATH or --with-libgcrypt-prefix=PATH]) -fi +AC_ARG_WITH([crypto], + AC_HELP_STRING([--with-crypto=auto|]m4_set_contents([crypto_backends], [|]), + [Select crypto backend (default: auto)]), + use_crypto=$withval, + use_crypto=auto +) -if test "$ac_cv_libgcrypt" = "yes"; then - AC_DEFINE(LIBSSH2_LIBGCRYPT, 1, [Use libgcrypt]) -fi -AM_CONDITIONAL(LIBGCRYPT, test "$ac_cv_libgcrypt" = "yes") - -# Not all OpenSSL have AES-CTR functions. -if test "$ac_cv_libssl" = "yes"; then - save_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS $LIBSSL" - AC_CHECK_FUNCS(EVP_aes_128_ctr) - LDFLAGS="$save_LDFLAGS" +case "${use_crypto}" in + auto|m4_set_contents([crypto_backends], [|])) + m4_set_map([crypto_backends], [LIBSSH2_CHECK_CRYPTO]) + ;; + yes|"") + crypto_errors="No crypto backend specified!" + ;; + *) + crypto_errors="Unknown crypto backend '${use_crypto}' specified!" + ;; +esac + +if test "$found_crypto" = "none"; then + crypto_errors="${crypto_errors} +Specify --with-crypto=\$backend and/or the neccessary library search prefix. + +Known crypto backends: auto, m4_set_contents([crypto_backends], [, ])" + AS_MESSAGE([ERROR: ${crypto_errors}]) +else + test "$found_crypto_str" = "" && found_crypto_str="$found_crypto" fi -# Look for Libz -if test "$use_libz" != "no"; then +m4_set_foreach([crypto_backends], [backend], + [AM_CONDITIONAL(m4_toupper(backend), test "$found_crypto" = "backend")] +) + +# libz + +AC_ARG_WITH([libz], + AC_HELP_STRING([--with-libz],[Use libz for compression]), + use_libz=$withval, + use_libz=auto) + +found_libz=no +libz_errors="" + +if test "$use_libz" != no; then AC_LIB_HAVE_LINKFLAGS([z], [], [#include ]) if test "$ac_cv_libz" != yes; then - AC_MSG_NOTICE([Cannot find libz, disabling compression]) - AC_MSG_NOTICE([Try --with-libz-prefix=PATH if you know you have it]) + if test "$use_libz" = auto; then + AC_MSG_NOTICE([Cannot find libz, disabling compression]) + found_libz="disabled; no libz found" + else + libz_errors="No libz found! +Try --with-libz-prefix=PATH if you know that you have it." + AS_MESSAGE([ERROR: $libz_errors]) + fi else AC_DEFINE(LIBSSH2_HAVE_ZLIB, 1, [Compile in zlib support]) + LIBSREQUIRED="$LIBSREQUIRED${LIBSREQUIRED:+ }zlib" + found_libz="yes" fi fi +AC_SUBST(LIBSREQUIRED) + # # Optional Settings # @@ -154,6 +174,30 @@ if test "$GEX_NEW" != "no"; then AC_DEFINE(LIBSSH2_DH_GEX_NEW, 1, [Enable newer diffie-hellman-group-exchange-sha1 syntax]) fi +AC_ARG_ENABLE(clear-memory, + AC_HELP_STRING([--disable-clear-memory],[Disable clearing of memory before being freed]), + [CLEAR_MEMORY=$enableval]) +if test "$CLEAR_MEMORY" != "no"; then + if test "$support_clear_memory" = "yes"; then + AC_DEFINE(LIBSSH2_CLEAR_MEMORY, 1, [Enable clearing of memory before being freed]) + enable_clear_memory=yes + else + if test "$CLEAR_MEMORY" = "yes"; then + AC_MSG_ERROR([secure clearing/zeroing of memory is not supported by the selected crypto backend]) + else + AC_MSG_WARN([secure clearing/zeroing of memory is not supported by the selected crypto backend]) + fi + enable_clear_memory=unsupported + fi +else + if test "$support_clear_memory" = "yes"; then + enable_clear_memory=no + else + AC_MSG_WARN([secure clearing/zeroing of memory is not supported by the selected crypto backend]) + enable_clear_memory=unsupported + fi +fi + dnl ************************************************************ dnl option to switch on compiler debug options dnl @@ -164,6 +208,7 @@ AC_HELP_STRING([--disable-debug],[Disable debug options]), [ case "$enable_debug" in no) AC_MSG_RESULT(no) + CPPFLAGS="$CPPFLAGS -DNDEBUG" ;; *) AC_MSG_RESULT(yes) enable_debug=yes @@ -235,6 +280,21 @@ esac], [build_examples='yes']) AC_MSG_RESULT($build_examples) AM_CONDITIONAL([BUILD_EXAMPLES], [test "x$build_examples" != "xno"]) + +# Build OSS fuzzing targets? +AC_ARG_ENABLE([ossfuzzers], + [AS_HELP_STRING([--enable-ossfuzzers], + [Whether to generate the fuzzers for OSS-Fuzz])], + [have_ossfuzzers=yes], [have_ossfuzzers=no]) +AM_CONDITIONAL([USE_OSSFUZZERS], [test "x$have_ossfuzzers" = "xyes"]) + + +# Set the correct flags for the given fuzzing engine. +AC_SUBST([LIB_FUZZING_ENGINE]) +AM_CONDITIONAL([USE_OSSFUZZ_FLAG], [test "x$LIB_FUZZING_ENGINE" = "x-fsanitize=fuzzer"]) +AM_CONDITIONAL([USE_OSSFUZZ_STATIC], [test -f "$LIB_FUZZING_ENGINE"]) + + # Checks for header files. # AC_HEADER_STDC AC_CHECK_HEADERS([errno.h fcntl.h stdio.h stdlib.h unistd.h sys/uio.h]) @@ -270,7 +330,7 @@ case $host in ;; esac -AC_CHECK_FUNCS(gettimeofday select strtoll) +AC_CHECK_FUNCS(gettimeofday select strtoll memset_s) dnl Check for select() into ws2_32 for Msys/Mingw if test "$ac_cv_func_select" != "yes"; then @@ -302,9 +362,29 @@ AC_C_INLINE CURL_CHECK_NONBLOCKING_SOCKET +missing_required_deps=0 + +if test "${libz_errors}" != ""; then + AS_MESSAGE([ERROR: ${libz_errors}]) + missing_required_deps=1 +fi + +if test "$found_crypto" = "none"; then + AS_MESSAGE([ERROR: ${crypto_errors}]) + missing_required_deps=1 +fi + +if test $missing_required_deps = 1; then + AC_MSG_ERROR([Required dependencies are missing!]) +fi + +# Configure parameters +LIBSSH2_CHECK_OPTION_WERROR + AC_CONFIG_FILES([Makefile src/Makefile tests/Makefile + tests/ossfuzz/Makefile example/Makefile docs/Makefile libssh2.pc]) @@ -318,9 +398,10 @@ AC_MSG_NOTICE([summary of build options: Compiler: ${CC} Compiler flags: ${CFLAGS} Library types: Shared=${enable_shared}, Static=${enable_static} - Crypto library: openssl: ${ac_cv_libssl:-no} (AES-CTR: ${ac_cv_func_EVP_aes_128_ctr:-N/A}) libgcrypt: ${ac_cv_libgcrypt:-no} + Crypto library: ${found_crypto_str} + Clear memory: $enable_clear_memory Debug build: $enable_debug Build examples: $build_examples Path to sshd: $ac_cv_path_SSHD (only for self-tests) - libz compression: $ac_cv_libz + zlib compression: ${found_libz} ]) diff --git a/vendor/libssh2/depcomp b/vendor/libssh2/depcomp index 04701da536..6b391623c4 100755 --- a/vendor/libssh2/depcomp +++ b/vendor/libssh2/depcomp @@ -1,9 +1,9 @@ #! /bin/sh # depcomp - compile a program generating dependencies as side-effects -scriptversion=2005-07-09.11 +scriptversion=2018-03-07.03; # UTC -# Copyright (C) 1999, 2000, 2003, 2004, 2005 Free Software Foundation, Inc. +# Copyright (C) 1999-2020 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -16,9 +16,7 @@ scriptversion=2005-07-09.11 # GNU General Public License for more details. # You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301, USA. +# along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a @@ -29,9 +27,9 @@ scriptversion=2005-07-09.11 case $1 in '') - echo "$0: No command. Try \`$0 --help' for more information." 1>&2 - exit 1; - ;; + echo "$0: No command. Try '$0 --help' for more information." 1>&2 + exit 1; + ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] @@ -41,11 +39,11 @@ as side-effects. Environment variables: depmode Dependency tracking mode. - source Source file read by `PROGRAMS ARGS'. - object Object file output by `PROGRAMS ARGS'. + source Source file read by 'PROGRAMS ARGS'. + object Object file output by 'PROGRAMS ARGS'. DEPDIR directory where to store dependencies. depfile Dependency file to output. - tmpdepfile Temporary file to use when outputing dependencies. + tmpdepfile Temporary file to use when outputting dependencies. libtool Whether libtool is used (yes/no). Report bugs to . @@ -58,6 +56,66 @@ EOF ;; esac +# Get the directory component of the given path, and save it in the +# global variables '$dir'. Note that this directory component will +# be either empty or ending with a '/' character. This is deliberate. +set_dir_from () +{ + case $1 in + */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; + *) dir=;; + esac +} + +# Get the suffix-stripped basename of the given path, and save it the +# global variable '$base'. +set_base_from () +{ + base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` +} + +# If no dependency file was actually created by the compiler invocation, +# we still have to create a dummy depfile, to avoid errors with the +# Makefile "include basename.Plo" scheme. +make_dummy_depfile () +{ + echo "#dummy" > "$depfile" +} + +# Factor out some common post-processing of the generated depfile. +# Requires the auxiliary global variable '$tmpdepfile' to be set. +aix_post_process_depfile () +{ + # If the compiler actually managed to produce a dependency file, + # post-process it. + if test -f "$tmpdepfile"; then + # Each line is of the form 'foo.o: dependency.h'. + # Do two passes, one to just change these to + # $object: dependency.h + # and one to simply output + # dependency.h: + # which is needed to avoid the deleted-header problem. + { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" + sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" + } > "$depfile" + rm -f "$tmpdepfile" + else + make_dummy_depfile + fi +} + +# A tabulation character. +tab=' ' +# A newline character. +nl=' +' +# Character ranges might be problematic outside the C locale. +# These definitions help. +upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ +lower=abcdefghijklmnopqrstuvwxyz +digits=0123456789 +alpha=${upper}${lower} + if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 @@ -70,6 +128,9 @@ tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" +# Avoid interferences from the environment. +gccflag= dashmflag= + # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case @@ -81,9 +142,32 @@ if test "$depmode" = hp; then fi if test "$depmode" = dashXmstdout; then - # This is just like dashmstdout with a different argument. - dashmflag=-xM - depmode=dashmstdout + # This is just like dashmstdout with a different argument. + dashmflag=-xM + depmode=dashmstdout +fi + +cygpath_u="cygpath -u -f -" +if test "$depmode" = msvcmsys; then + # This is just like msvisualcpp but w/o cygpath translation. + # Just convert the backslash-escaped backslashes to single forward + # slashes to satisfy depend.m4 + cygpath_u='sed s,\\\\,/,g' + depmode=msvisualcpp +fi + +if test "$depmode" = msvc7msys; then + # This is just like msvc7 but w/o cygpath translation. + # Just convert the backslash-escaped backslashes to single forward + # slashes to satisfy depend.m4 + cygpath_u='sed s,\\\\,/,g' + depmode=msvc7 +fi + +if test "$depmode" = xlc; then + # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. + gccflag=-qmakedep=gcc,-MF + depmode=gcc fi case "$depmode" in @@ -91,10 +175,22 @@ gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. - "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" +## Unfortunately, FreeBSD c89 acceptance of flags depends upon +## the command line argument order; so add the flags where they +## appear in depend2.am. Note that the slowdown incurred here +## affects only configure: in makefiles, %FASTDEP% shortcuts this. + for arg + do + case $arg in + -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; + *) set fnord "$@" "$arg" ;; + esac + shift # fnord + shift # $arg + done + "$@" stat=$? - if test $stat -eq 0; then : - else + if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi @@ -102,13 +198,17 @@ gcc3) ;; gcc) +## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. +## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. +## (see the conditional assignment to $gccflag above). ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like -## -MM, not -M (despite what the docs say). +## -MM, not -M (despite what the docs say). Also, it might not be +## supported by the other compilers which use the 'gcc' depmode. ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then @@ -116,31 +216,31 @@ gcc) fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? - if test $stat -eq 0; then : - else + if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" - alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz -## The second -e expression handles DOS-style file names with drive letters. + # The second -e expression handles DOS-style file names with drive + # letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" -## This next piece of magic avoids the `deleted header file' problem. +## This next piece of magic avoids the "deleted header file" problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. - tr ' ' ' -' < "$tmpdepfile" | -## Some versions of gcc put a space before the `:'. On the theory +## Some versions of gcc put a space before the ':'. On the theory ## that the space means something, we add a space to the output as -## well. +## well. hp depmode also adds that space, but also prefixes the VPATH +## to the object. Take care to not repeat it in the output. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. - sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ + | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; @@ -158,8 +258,7 @@ sgi) "$@" -MDupdate "$tmpdepfile" fi stat=$? - if test $stat -eq 0; then : - else + if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi @@ -167,99 +266,156 @@ sgi) if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" - # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; - # the IRIX cc adds comments like `#:fec' to the end of the + # the IRIX cc adds comments like '#:fec' to the end of the # dependency line. - tr ' ' ' -' < "$tmpdepfile" \ - | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ - tr ' -' ' ' >> $depfile - echo >> $depfile - + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ + | tr "$nl" ' ' >> "$depfile" + echo >> "$depfile" # The second pass generates a dummy entry for each header file. - tr ' ' ' -' < "$tmpdepfile" \ - | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ - >> $depfile + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ + >> "$depfile" else - # The sourcefile does not contain any dependencies, so just - # store a dummy comment line, to avoid errors with the Makefile - # "include basename.Plo" scheme. - echo "#dummy" > "$depfile" + make_dummy_depfile fi rm -f "$tmpdepfile" ;; +xlc) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. In older versions, this file always lives in the - # current directory. Also, the AIX compiler puts `$object:' at the + # current directory. Also, the AIX compiler puts '$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. - stripped=`echo "$object" | sed 's/\(.*\)\..*$/\1/'` - tmpdepfile="$stripped.u" + set_dir_from "$object" + set_base_from "$object" if test "$libtool" = yes; then + tmpdepfile1=$dir$base.u + tmpdepfile2=$base.u + tmpdepfile3=$dir.libs/$base.u "$@" -Wc,-M else + tmpdepfile1=$dir$base.u + tmpdepfile2=$dir$base.u + tmpdepfile3=$dir$base.u "$@" -M fi stat=$? - - if test -f "$tmpdepfile"; then : - else - stripped=`echo "$stripped" | sed 's,^.*/,,'` - tmpdepfile="$stripped.u" + if test $stat -ne 0; then + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + exit $stat fi - if test $stat -eq 0; then : - else + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + do + test -f "$tmpdepfile" && break + done + aix_post_process_depfile + ;; + +tcc) + # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 + # FIXME: That version still under development at the moment of writing. + # Make that this statement remains true also for stable, released + # versions. + # It will wrap lines (doesn't matter whether long or short) with a + # trailing '\', as in: + # + # foo.o : \ + # foo.c \ + # foo.h \ + # + # It will put a trailing '\' even on the last line, and will use leading + # spaces rather than leading tabs (at least since its commit 0394caf7 + # "Emit spaces for -MD"). + "$@" -MD -MF "$tmpdepfile" + stat=$? + if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi - - if test -f "$tmpdepfile"; then - outname="$stripped.o" - # Each line is of the form `foo.o: dependent.h'. - # Do two passes, one to just change these to - # `$object: dependent.h' and one to simply `dependent.h:'. - sed -e "s,^$outname:,$object :," < "$tmpdepfile" > "$depfile" - sed -e "s,^$outname: \(.*\)$,\1:," < "$tmpdepfile" >> "$depfile" - else - # The sourcefile does not contain any dependencies, so just - # store a dummy comment line, to avoid errors with the Makefile - # "include basename.Plo" scheme. - echo "#dummy" > "$depfile" - fi + rm -f "$depfile" + # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. + # We have to change lines of the first kind to '$object: \'. + sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" + # And for each line of the second kind, we have to emit a 'dep.h:' + # dummy dependency, to avoid the deleted-header problem. + sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" rm -f "$tmpdepfile" ;; -icc) - # Intel's C compiler understands `-MD -MF file'. However on - # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c - # ICC 7.0 will fill foo.d with something like - # foo.o: sub/foo.c - # foo.o: sub/foo.h - # which is wrong. We want: - # sub/foo.o: sub/foo.c - # sub/foo.o: sub/foo.h - # sub/foo.c: - # sub/foo.h: - # ICC 7.1 will output +## The order of this option in the case statement is important, since the +## shell code in configure will try each of these formats in the order +## listed in this file. A plain '-MD' option would be understood by many +## compilers, so we must ensure this comes after the gcc and icc options. +pgcc) + # Portland's C compiler understands '-MD'. + # Will always output deps to 'file.d' where file is the root name of the + # source file under compilation, even if file resides in a subdirectory. + # The object file name does not affect the name of the '.d' file. + # pgcc 10.2 will output # foo.o: sub/foo.c sub/foo.h - # and will wrap long lines using \ : + # and will wrap long lines using '\' : # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... + set_dir_from "$object" + # Use the source, not the object, to determine the base name, since + # that's sadly what pgcc will do too. + set_base_from "$source" + tmpdepfile=$base.d + + # For projects that build the same source file twice into different object + # files, the pgcc approach of using the *source* file root name can cause + # problems in parallel builds. Use a locking strategy to avoid stomping on + # the same $tmpdepfile. + lockdir=$base.d-lock + trap " + echo '$0: caught signal, cleaning up...' >&2 + rmdir '$lockdir' + exit 1 + " 1 2 13 15 + numtries=100 + i=$numtries + while test $i -gt 0; do + # mkdir is a portable test-and-set. + if mkdir "$lockdir" 2>/dev/null; then + # This process acquired the lock. + "$@" -MD + stat=$? + # Release the lock. + rmdir "$lockdir" + break + else + # If the lock is being held by a different process, wait + # until the winning process is done or we timeout. + while test -d "$lockdir" && test $i -gt 0; do + sleep 1 + i=`expr $i - 1` + done + fi + i=`expr $i - 1` + done + trap - 1 2 13 15 + if test $i -le 0; then + echo "$0: failed to acquire lock after $numtries attempts" >&2 + echo "$0: check lockdir '$lockdir'" >&2 + exit 1 + fi - "$@" -MD -MF "$tmpdepfile" - stat=$? - if test $stat -eq 0; then : - else + if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi @@ -271,68 +427,141 @@ icc) sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this invocation # correctly. Breaking it into two sed invocations is a workaround. - sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" | - sed -e 's/$/ :/' >> "$depfile" + sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ + | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; +hp2) + # The "hp" stanza above does not work with aCC (C++) and HP's ia64 + # compilers, which have integrated preprocessors. The correct option + # to use with these is +Maked; it writes dependencies to a file named + # 'foo.d', which lands next to the object file, wherever that + # happens to be. + # Much of this is similar to the tru64 case; see comments there. + set_dir_from "$object" + set_base_from "$object" + if test "$libtool" = yes; then + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir.libs/$base.d + "$@" -Wc,+Maked + else + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir$base.d + "$@" +Maked + fi + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile1" "$tmpdepfile2" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" + do + test -f "$tmpdepfile" && break + done + if test -f "$tmpdepfile"; then + sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" + # Add 'dependent.h:' lines. + sed -ne '2,${ + s/^ *// + s/ \\*$// + s/$/:/ + p + }' "$tmpdepfile" >> "$depfile" + else + make_dummy_depfile + fi + rm -f "$tmpdepfile" "$tmpdepfile2" + ;; + tru64) - # The Tru64 compiler uses -MD to generate dependencies as a side - # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'. - # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put - # dependencies in `foo.d' instead, so we check for that too. - # Subdirectories are respected. - dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` - test "x$dir" = "x$object" && dir= - base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` - - if test "$libtool" = yes; then - # With Tru64 cc, shared objects can also be used to make a - # static library. This mecanism is used in libtool 1.4 series to - # handle both shared and static libraries in a single compilation. - # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d. - # - # With libtool 1.5 this exception was removed, and libtool now - # generates 2 separate objects for the 2 libraries. These two - # compilations output dependencies in in $dir.libs/$base.o.d and - # in $dir$base.o.d. We have to check for both files, because - # one of the two compilations can be disabled. We should prefer - # $dir$base.o.d over $dir.libs/$base.o.d because the latter is - # automatically cleaned when .libs/ is deleted, while ignoring - # the former would cause a distcleancheck panic. - tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4 - tmpdepfile2=$dir$base.o.d # libtool 1.5 - tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5 - tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504 - "$@" -Wc,-MD - else - tmpdepfile1=$dir$base.o.d - tmpdepfile2=$dir$base.d - tmpdepfile3=$dir$base.d - tmpdepfile4=$dir$base.d - "$@" -MD - fi - - stat=$? - if test $stat -eq 0; then : - else - rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" - exit $stat - fi - - for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" - do - test -f "$tmpdepfile" && break - done - if test -f "$tmpdepfile"; then - sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" - # That's a tab and a space in the []. - sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" - else - echo "#dummy" > "$depfile" - fi - rm -f "$tmpdepfile" - ;; + # The Tru64 compiler uses -MD to generate dependencies as a side + # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. + # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put + # dependencies in 'foo.d' instead, so we check for that too. + # Subdirectories are respected. + set_dir_from "$object" + set_base_from "$object" + + if test "$libtool" = yes; then + # Libtool generates 2 separate objects for the 2 libraries. These + # two compilations output dependencies in $dir.libs/$base.o.d and + # in $dir$base.o.d. We have to check for both files, because + # one of the two compilations can be disabled. We should prefer + # $dir$base.o.d over $dir.libs/$base.o.d because the latter is + # automatically cleaned when .libs/ is deleted, while ignoring + # the former would cause a distcleancheck panic. + tmpdepfile1=$dir$base.o.d # libtool 1.5 + tmpdepfile2=$dir.libs/$base.o.d # Likewise. + tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 + "$@" -Wc,-MD + else + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir$base.d + tmpdepfile3=$dir$base.d + "$@" -MD + fi + + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + do + test -f "$tmpdepfile" && break + done + # Same post-processing that is required for AIX mode. + aix_post_process_depfile + ;; + +msvc7) + if test "$libtool" = yes; then + showIncludes=-Wc,-showIncludes + else + showIncludes=-showIncludes + fi + "$@" $showIncludes > "$tmpdepfile" + stat=$? + grep -v '^Note: including file: ' "$tmpdepfile" + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + # The first sed program below extracts the file names and escapes + # backslashes for cygpath. The second sed program outputs the file + # name when reading, but also accumulates all include files in the + # hold buffer in order to output them again at the end. This only + # works with sed implementations that can handle large buffers. + sed < "$tmpdepfile" -n ' +/^Note: including file: *\(.*\)/ { + s//\1/ + s/\\/\\\\/g + p +}' | $cygpath_u | sort -u | sed -n ' +s/ /\\ /g +s/\(.*\)/'"$tab"'\1 \\/p +s/.\(.*\) \\/\1:/ +H +$ { + s/.*/'"$tab"'/ + G + p +}' >> "$depfile" + echo >> "$depfile" # make sure the fragment doesn't end with a backslash + rm -f "$tmpdepfile" + ;; + +msvc7msys) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; #nosideeffect) # This comment above is used by automake to tell side-effect @@ -345,13 +574,13 @@ dashmstdout) # Remove the call to Libtool. if test "$libtool" = yes; then - while test $1 != '--mode=compile'; do + while test "X$1" != 'X--mode=compile'; do shift done shift fi - # Remove `-o $object'. + # Remove '-o $object'. IFS=" " for arg do @@ -371,18 +600,18 @@ dashmstdout) done test -z "$dashmflag" && dashmflag=-M - # Require at least two characters before searching for `:' + # Require at least two characters before searching for ':' # in the target name. This is to cope with DOS-style filenames: - # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise. + # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. "$@" $dashmflag | - sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" + sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" - tr ' ' ' -' < "$tmpdepfile" | \ -## Some versions of the HPUX 10.20 sed can't process this invocation -## correctly. Breaking it into two sed invocations is a workaround. - sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" + # Some versions of the HPUX 10.20 sed can't process this sed invocation + # correctly. Breaking it into two sed invocations is a workaround. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ + | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; @@ -396,41 +625,51 @@ makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then - while test $1 != '--mode=compile'; do + while test "X$1" != 'X--mode=compile'; do shift done shift fi # X makedepend shift - cleared=no - for arg in "$@"; do + cleared=no eat=no + for arg + do case $cleared in no) set ""; shift cleared=yes ;; esac + if test $eat = yes; then + eat=no + continue + fi case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. + -arch) + eat=yes ;; -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done - obj_suffix="`echo $object | sed 's/^.*\././'`" + obj_suffix=`echo "$object" | sed 's/^.*\././'` touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" - cat < "$tmpdepfile" > "$depfile" - sed '1,2d' "$tmpdepfile" | tr ' ' ' -' | \ -## Some versions of the HPUX 10.20 sed can't process this invocation -## correctly. Breaking it into two sed invocations is a workaround. - sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" + # makedepend may prepend the VPATH from the source file name to the object. + # No need to regex-escape $object, excess matching of '.' is harmless. + sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process the last invocation + # correctly. Breaking it into two sed invocations is a workaround. + sed '1,2d' "$tmpdepfile" \ + | tr ' ' "$nl" \ + | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ + | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; @@ -441,13 +680,13 @@ cpp) # Remove the call to Libtool. if test "$libtool" = yes; then - while test $1 != '--mode=compile'; do + while test "X$1" != 'X--mode=compile'; do shift done shift fi - # Remove `-o $object'. + # Remove '-o $object'. IFS=" " for arg do @@ -466,10 +705,10 @@ cpp) esac done - "$@" -E | - sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ - -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | - sed '$ s: \\$::' > "$tmpdepfile" + "$@" -E \ + | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ + -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ + | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" @@ -479,35 +718,56 @@ cpp) msvisualcpp) # Important note: in order to support this mode, a compiler *must* - # always write the preprocessed file to stdout, regardless of -o, - # because we must use -o when running libtool. + # always write the preprocessed file to stdout. "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + IFS=" " for arg do case "$arg" in + -o) + shift + ;; + $object) + shift + ;; "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") - set fnord "$@" - shift - shift - ;; + set fnord "$@" + shift + shift + ;; *) - set fnord "$@" "$arg" - shift - shift - ;; + set fnord "$@" "$arg" + shift + shift + ;; esac done - "$@" -E | - sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile" + "$@" -E 2>/dev/null | + sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" - . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile" - echo " " >> "$depfile" - . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile" + sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" + echo "$tab" >> "$depfile" + sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; +msvcmsys) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + none) exec "$@" ;; @@ -523,8 +783,9 @@ exit 0 # Local Variables: # mode: shell-script # sh-indentation: 2 -# eval: (add-hook 'write-file-hooks 'time-stamp) +# eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" -# time-stamp-end: "$" +# time-stamp-time-zone: "UTC0" +# time-stamp-end: "; # UTC" # End: diff --git a/vendor/libssh2/AUTHORS b/vendor/libssh2/docs/AUTHORS similarity index 100% rename from vendor/libssh2/AUTHORS rename to vendor/libssh2/docs/AUTHORS diff --git a/vendor/libssh2/docs/BINDINGS b/vendor/libssh2/docs/BINDINGS index b97758fd9c..471f9be8c9 100644 --- a/vendor/libssh2/docs/BINDINGS +++ b/vendor/libssh2/docs/BINDINGS @@ -10,16 +10,16 @@ Cocoa/Objective-C https://github.com/karelia/libssh2_sftp-Cocoa-wrapper Haskell - FFI bindings - http://hackage.haskell.org/package/libssh2 + FFI bindings - https://hackage.haskell.org/package/libssh2 Perl - Net::SSH2 - http://search.cpan.org/~rkitover/Net-SSH2-0.45/lib/Net/SSH2.pm + Net::SSH2 - https://metacpan.org/pod/Net::SSH2 PHP - ssh2 - http://pecl.php.net/package/ssh2 + ssh2 - https://pecl.php.net/package/ssh2 Python - pylibssh2 - http://www.wallix.org/pylibssh2-project/ + pylibssh2 - https://pypi.python.org/pypi/pylibssh2 Python-ctypes diff --git a/vendor/libssh2/docs/CMakeLists.txt b/vendor/libssh2/docs/CMakeLists.txt new file mode 100644 index 0000000000..b69ccced5c --- /dev/null +++ b/vendor/libssh2/docs/CMakeLists.txt @@ -0,0 +1,211 @@ +# Copyright (c) 2014 Alexander Lamaison +# +# 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 the copyright holder nor the names +# of any other 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. + +set(MAN_PAGES + libssh2_agent_connect.3 + libssh2_agent_disconnect.3 + libssh2_agent_free.3 + libssh2_agent_get_identity.3 + libssh2_agent_get_identity_path.3 + libssh2_agent_init.3 + libssh2_agent_list_identities.3 + libssh2_agent_set_identity_path.3 + libssh2_agent_userauth.3 + libssh2_banner_set.3 + libssh2_base64_decode.3 + libssh2_channel_close.3 + libssh2_channel_direct_tcpip.3 + libssh2_channel_direct_tcpip_ex.3 + libssh2_channel_eof.3 + libssh2_channel_exec.3 + libssh2_channel_flush.3 + libssh2_channel_flush_ex.3 + libssh2_channel_flush_stderr.3 + libssh2_channel_forward_accept.3 + libssh2_channel_forward_cancel.3 + libssh2_channel_forward_listen.3 + libssh2_channel_forward_listen_ex.3 + libssh2_channel_free.3 + libssh2_channel_get_exit_signal.3 + libssh2_channel_get_exit_status.3 + libssh2_channel_handle_extended_data.3 + libssh2_channel_handle_extended_data2.3 + libssh2_channel_ignore_extended_data.3 + libssh2_channel_open_ex.3 + libssh2_channel_open_session.3 + libssh2_channel_process_startup.3 + libssh2_channel_read.3 + libssh2_channel_read_ex.3 + libssh2_channel_read_stderr.3 + libssh2_channel_receive_window_adjust.3 + libssh2_channel_receive_window_adjust2.3 + libssh2_channel_request_pty.3 + libssh2_channel_request_pty_ex.3 + libssh2_channel_request_pty_size.3 + libssh2_channel_request_pty_size_ex.3 + libssh2_channel_send_eof.3 + libssh2_channel_set_blocking.3 + libssh2_channel_setenv.3 + libssh2_channel_setenv_ex.3 + libssh2_channel_shell.3 + libssh2_channel_subsystem.3 + libssh2_channel_wait_closed.3 + libssh2_channel_wait_eof.3 + libssh2_channel_window_read.3 + libssh2_channel_window_read_ex.3 + libssh2_channel_window_write.3 + libssh2_channel_window_write_ex.3 + libssh2_channel_write.3 + libssh2_channel_write_ex.3 + libssh2_channel_write_stderr.3 + libssh2_channel_x11_req.3 + libssh2_channel_x11_req_ex.3 + libssh2_exit.3 + libssh2_free.3 + libssh2_hostkey_hash.3 + libssh2_init.3 + libssh2_keepalive_config.3 + libssh2_keepalive_send.3 + libssh2_knownhost_add.3 + libssh2_knownhost_addc.3 + libssh2_knownhost_check.3 + libssh2_knownhost_checkp.3 + libssh2_knownhost_del.3 + libssh2_knownhost_free.3 + libssh2_knownhost_get.3 + libssh2_knownhost_init.3 + libssh2_knownhost_readfile.3 + libssh2_knownhost_readline.3 + libssh2_knownhost_writefile.3 + libssh2_knownhost_writeline.3 + libssh2_poll.3 + libssh2_poll_channel_read.3 + libssh2_publickey_add.3 + libssh2_publickey_add_ex.3 + libssh2_publickey_init.3 + libssh2_publickey_list_fetch.3 + libssh2_publickey_list_free.3 + libssh2_publickey_remove.3 + libssh2_publickey_remove_ex.3 + libssh2_publickey_shutdown.3 + libssh2_scp_recv.3 + libssh2_scp_recv2.3 + libssh2_scp_send.3 + libssh2_scp_send64.3 + libssh2_scp_send_ex.3 + libssh2_session_abstract.3 + libssh2_session_banner_get.3 + libssh2_session_banner_set.3 + libssh2_session_block_directions.3 + libssh2_session_callback_set.3 + libssh2_session_disconnect.3 + libssh2_session_disconnect_ex.3 + libssh2_session_flag.3 + libssh2_session_free.3 + libssh2_session_get_blocking.3 + libssh2_session_get_timeout.3 + libssh2_session_handshake.3 + libssh2_session_hostkey.3 + libssh2_session_init.3 + libssh2_session_init_ex.3 + libssh2_session_last_errno.3 + libssh2_session_last_error.3 + libssh2_session_set_last_error.3 + libssh2_session_method_pref.3 + libssh2_session_methods.3 + libssh2_session_set_blocking.3 + libssh2_session_set_timeout.3 + libssh2_session_startup.3 + libssh2_session_supported_algs.3 + libssh2_sftp_close.3 + libssh2_sftp_close_handle.3 + libssh2_sftp_closedir.3 + libssh2_sftp_fsetstat.3 + libssh2_sftp_fstat.3 + libssh2_sftp_fstat_ex.3 + libssh2_sftp_fstatvfs.3 + libssh2_sftp_fsync.3 + libssh2_sftp_get_channel.3 + libssh2_sftp_init.3 + libssh2_sftp_last_error.3 + libssh2_sftp_lstat.3 + libssh2_sftp_mkdir.3 + libssh2_sftp_mkdir_ex.3 + libssh2_sftp_open.3 + libssh2_sftp_open_ex.3 + libssh2_sftp_opendir.3 + libssh2_sftp_read.3 + libssh2_sftp_readdir.3 + libssh2_sftp_readdir_ex.3 + libssh2_sftp_readlink.3 + libssh2_sftp_realpath.3 + libssh2_sftp_rename.3 + libssh2_sftp_rename_ex.3 + libssh2_sftp_rewind.3 + libssh2_sftp_rmdir.3 + libssh2_sftp_rmdir_ex.3 + libssh2_sftp_seek.3 + libssh2_sftp_seek64.3 + libssh2_sftp_setstat.3 + libssh2_sftp_shutdown.3 + libssh2_sftp_stat.3 + libssh2_sftp_stat_ex.3 + libssh2_sftp_statvfs.3 + libssh2_sftp_symlink.3 + libssh2_sftp_symlink_ex.3 + libssh2_sftp_tell.3 + libssh2_sftp_tell64.3 + libssh2_sftp_unlink.3 + libssh2_sftp_unlink_ex.3 + libssh2_sftp_write.3 + libssh2_trace.3 + libssh2_trace_sethandler.3 + libssh2_userauth_authenticated.3 + libssh2_userauth_banner.3 + libssh2_userauth_hostbased_fromfile.3 + libssh2_userauth_hostbased_fromfile_ex.3 + libssh2_userauth_keyboard_interactive.3 + libssh2_userauth_keyboard_interactive_ex.3 + libssh2_userauth_list.3 + libssh2_userauth_password.3 + libssh2_userauth_password_ex.3 + libssh2_userauth_publickey.3 + libssh2_userauth_publickey_fromfile.3 + libssh2_userauth_publickey_fromfile_ex.3 + libssh2_userauth_publickey_frommemory.3 + libssh2_version.3) + +include(GNUInstallDirs) +install(FILES ${MAN_PAGES} DESTINATION ${CMAKE_INSTALL_MANDIR}/man3) diff --git a/vendor/libssh2/HACKING b/vendor/libssh2/docs/HACKING similarity index 100% rename from vendor/libssh2/HACKING rename to vendor/libssh2/docs/HACKING diff --git a/vendor/libssh2/docs/HACKING-CRYPTO b/vendor/libssh2/docs/HACKING-CRYPTO new file mode 100644 index 0000000000..85d813aa62 --- /dev/null +++ b/vendor/libssh2/docs/HACKING-CRYPTO @@ -0,0 +1,939 @@ + Definitions needed to implement a specific crypto library + +This document offers some hints about implementing a new crypto library +interface. + +A crypto library interface consists of at least a header file, defining +entities referenced from the libssh2 core modules. +Real code implementation (if needed), is left at the implementor's choice. + +This document lists the entities that must/may be defined in the header file. + +Procedures listed as "void" may indeed have a result type: the void indication +indicates the libssh2 core modules never use the function result. + + +0) Build system. + +Adding a crypto backend to the autotools build system (./configure) is easy: + +0.1) Add one new line in configure.ac + +m4_set_add([crypto_backends], [newname]) + +This automatically creates a --with-crypto=newname option. + +0.2) Add an m4_case stanza to LIBSSH2_CRYPTO_CHECK in acinclude.m4 + +This must check for all required libraries, and if found set and AC_SUBST a +variable with the library linking flags. The recommended method is to use +LIBSSH2_LIB_HAVE_LINKFLAGS from LIBSSH2_CRYPTO_CHECK, which automatically +creates and handles a --with-$newname-prefix option and sets an +LTLIBNEWNAME variable on success. + +0.3) Create Makefile.newname.inc in the top-level directory + +This must set CRYPTO_CSOURCES, CRYPTO_HHEADERS and CRYPTO_LTLIBS. +Set CRYPTO_CSOURCES and CRYPTO_HHEADERS to the new backend source files +and set CRYPTO_LTLIBS to the required library linking parameters, e.g. +$(LTLIBNEWNAME) as generated by by LIBSSH2_LIB_HAVE_LINKFLAGS. + +0.4) Add a new block in src/Makefile.am + +if NEWNAME +include ../Makefile.newname.inc +endif + + +1) Crypto library initialization/termination. + +void libssh2_crypto_init(void); +Initializes the crypto library. May be an empty macro if not needed. + +void libssh2_crypto_exit(void); +Terminates the crypto library use. May be an empty macro if not needed. + + +2) HMAC + +libssh2_hmac_ctx +Type of an HMAC computation context. Generally a struct. +Used for all hash algorithms. + +void libssh2_hmac_ctx_init(libssh2_hmac_ctx ctx); +Initializes the HMAC computation context ctx. +Called before setting-up the hash algorithm. +Note: if the ctx parameter is modified by the underlying code, +this procedure must be implemented as a macro to map ctx --> &ctx. + +void libssh2_hmac_update(libssh2_hmac_ctx ctx, + const unsigned char *data, + int datalen); +Continue computation of an HMAC on datalen bytes at data using context ctx. +Note: if the ctx parameter is modified by the underlying code, +this procedure must be implemented as a macro to map ctx --> &ctx. + +void libssh2_hmac_final(libssh2_hmac_ctx ctx, + unsigned char output[]); +Get the computed HMAC from context ctx into the output buffer. The +minimum data buffer size depends on the HMAC hash algorithm. +Note: if the ctx parameter is modified by the underlying code, +this procedure must be implemented as a macro to map ctx --> &ctx. + +void libssh2_hmac_cleanup(libssh2_hmac_ctx *ctx); +Releases the HMAC computation context at ctx. + + +3) Hash algorithms. + +3.1) SHA-1 +Must always be implemented. + +SHA_DIGEST_LENGTH +#define to 20, the SHA-1 digest length. + +libssh2_sha1_ctx +Type of an SHA-1 computation context. Generally a struct. + +int libssh2_sha1_init(libssh2_sha1_ctx *x); +Initializes the SHA-1 computation context at x. +Returns 1 for success and 0 for failure + +void libssh2_sha1_update(libssh2_sha1_ctx ctx, + const unsigned char *data, + size_t len); +Continue computation of SHA-1 on len bytes at data using context ctx. +Note: if the ctx parameter is modified by the underlying code, +this procedure must be implemented as a macro to map ctx --> &ctx. + +void libssh2_sha1_final(libssh2_sha1_ctx ctx, + unsigned char output[SHA_DIGEST_LEN]); +Get the computed SHA-1 signature from context ctx and store it into the +output buffer. +Release the context. +Note: if the ctx parameter is modified by the underlying code, +this procedure must be implemented as a macro to map ctx --> &ctx. + +void libssh2_hmac_sha1_init(libssh2_hmac_ctx *ctx, + const void *key, + int keylen); +Setup the HMAC computation context ctx for an HMAC-SHA-1 computation using the +keylen-byte key. Is invoked just after libssh2_hmac_ctx_init(). + +3.2) SHA-256 +Must always be implemented. + +SHA256_DIGEST_LENGTH +#define to 32, the SHA-256 digest length. + +libssh2_sha256_ctx +Type of an SHA-256 computation context. Generally a struct. + +int libssh2_sha256_init(libssh2_sha256_ctx *x); +Initializes the SHA-256 computation context at x. +Returns 1 for success and 0 for failure + +void libssh2_sha256_update(libssh2_sha256_ctx ctx, + const unsigned char *data, + size_t len); +Continue computation of SHA-256 on len bytes at data using context ctx. +Note: if the ctx parameter is modified by the underlying code, +this procedure must be implemented as a macro to map ctx --> &ctx. + +void libssh2_sha256_final(libssh2_sha256_ctx ctx, + unsigned char output[SHA256_DIGEST_LENGTH]); +Gets the computed SHA-256 signature from context ctx into the output buffer. +Release the context. +Note: if the ctx parameter is modified by the underlying code, +this procedure must be implemented as a macro to map ctx --> &ctx. + +int libssh2_sha256(const unsigned char *message, + unsigned long len, + unsigned char output[SHA256_DIGEST_LENGTH]); +Computes the SHA-256 signature over the given message of length len and +store the result into the output buffer. +Return 1 if error, else 0. +Note: Seems unused in current code, but defined in each crypto library backend. + +LIBSSH2_HMAC_SHA256 +#define as 1 if the crypto library supports HMAC-SHA-256, else 0. +If defined as 0, the rest of this section can be omitted. + +void libssh2_hmac_sha256_init(libssh2_hmac_ctx *ctx, + const void *key, + int keylen); +Setup the HMAC computation context ctx for an HMAC-256 computation using the +keylen-byte key. Is invoked just after libssh2_hmac_ctx_init(). + +3.3) SHA-384 +Mandatory if ECDSA is implemented. Can be omitted otherwise. + +SHA384_DIGEST_LENGTH +#define to 48, the SHA-384 digest length. + +libssh2_sha384_ctx +Type of an SHA-384 computation context. Generally a struct. + +int libssh2_sha384_init(libssh2_sha384_ctx *x); +Initializes the SHA-384 computation context at x. +Returns 1 for success and 0 for failure + +void libssh2_sha384_update(libssh2_sha384_ctx ctx, + const unsigned char *data, + size_t len); +Continue computation of SHA-384 on len bytes at data using context ctx. +Note: if the ctx parameter is modified by the underlying code, +this procedure must be implemented as a macro to map ctx --> &ctx. + +void libssh2_sha384_final(libssh2_sha384_ctx ctx, + unsigned char output[SHA384_DIGEST_LENGTH]); +Gets the computed SHA-384 signature from context ctx into the output buffer. +Release the context. +Note: if the ctx parameter is modified by the underlying code, +this procedure must be implemented as a macro to map ctx --> &ctx. + +int libssh2_sha384(const unsigned char *message, + unsigned long len, + unsigned char output[SHA384_DIGEST_LENGTH]); +Computes the SHA-384 signature over the given message of length len and +store the result into the output buffer. +Return 1 if error, else 0. + +3.4) SHA-512 +Must always be implemented. + +SHA512_DIGEST_LENGTH +#define to 64, the SHA-512 digest length. + +libssh2_sha512_ctx +Type of an SHA-512 computation context. Generally a struct. + +int libssh2_sha512_init(libssh2_sha512_ctx *x); +Initializes the SHA-512 computation context at x. +Returns 1 for success and 0 for failure + +void libssh2_sha512_update(libssh2_sha512_ctx ctx, + const unsigned char *data, + size_t len); +Continue computation of SHA-512 on len bytes at data using context ctx. +Note: if the ctx parameter is modified by the underlying code, +this procedure must be implemented as a macro to map ctx --> &ctx. + +void libssh2_sha512_final(libssh2_sha512_ctx ctx, + unsigned char output[SHA512_DIGEST_LENGTH]); +Gets the computed SHA-512 signature from context ctx into the output buffer. +Release the context. +Note: if the ctx parameter is modified by the underlying code, +this procedure must be implemented as a macro to map ctx --> &ctx. + +int libssh2_sha512(const unsigned char *message, + unsigned long len, + unsigned char output[SHA512_DIGEST_LENGTH]); +Computes the SHA-512 signature over the given message of length len and +store the result into the output buffer. +Return 1 if error, else 0. +Note: Seems unused in current code, but defined in each crypto library backend. + +LIBSSH2_HMAC_SHA512 +#define as 1 if the crypto library supports HMAC-SHA-512, else 0. +If defined as 0, the rest of this section can be omitted. + +void libssh2_hmac_sha512_init(libssh2_hmac_ctx *ctx, + const void *key, + int keylen); +Setup the HMAC computation context ctx for an HMAC-512 computation using the +keylen-byte key. Is invoked just after libssh2_hmac_ctx_init(). + +3.5) MD5 +LIBSSH2_MD5 +#define to 1 if the crypto library supports MD5, else 0. +If defined as 0, the rest of this section can be omitted. + +MD5_DIGEST_LENGTH +#define to 16, the MD5 digest length. + +libssh2_md5_ctx +Type of an MD5 computation context. Generally a struct. + +int libssh2_md5_init(libssh2_md5_ctx *x); +Initializes the MD5 computation context at x. +Returns 1 for success and 0 for failure + +void libssh2_md5_update(libssh2_md5_ctx ctx, + const unsigned char *data, + size_t len); +Continues computation of MD5 on len bytes at data using context ctx. +Returns 1 for success and 0 for failure. +Note: if the ctx parameter is modified by the underlying code, +this procedure must be implemented as a macro to map ctx --> &ctx. + +void libssh2_md5_final(libssh2_md5_ctx ctx, + unsigned char output[MD5_DIGEST_LENGTH]); +Gets the computed MD5 signature from context ctx into the output buffer. +Release the context. +Note: if the ctx parameter is modified by the underlying code, +this procedure must be implemented as a macro to map ctx --> &ctx. + +void libssh2_hmac_md5_init(libssh2_hmac_ctx *ctx, + const void *key, + int keylen); +Setup the HMAC computation context ctx for an HMAC-MD5 computation using the +keylen-byte key. Is invoked just after libssh2_hmac_ctx_init(). + +3.6) RIPEMD-160 +LIBSSH2_HMAC_RIPEMD +#define as 1 if the crypto library supports HMAC-RIPEMD-160, else 0. +If defined as 0, the rest of this section can be omitted. + +void libssh2_hmac_ripemd160_init(libssh2_hmac_ctx *ctx, + const void *key, + int keylen); +Setup the HMAC computation context ctx for an HMAC-RIPEMD-160 computation using +the keylen-byte key. Is invoked just after libssh2_hmac_ctx_init(). +Returns 1 for success and 0 for failure. + + +4) Bidirectional key ciphers. + +_libssh2_cipher_ctx +Type of a cipher computation context. + +_libssh2_cipher_type(name); +Macro defining name as storage identifying a cipher algorithm for +the crypto library interface. No trailing semicolon. + +int _libssh2_cipher_init(_libssh2_cipher_ctx *h, + _libssh2_cipher_type(algo), + unsigned char *iv, + unsigned char *secret, + int encrypt); +Creates a cipher context for the given algorithm with the initialization vector +iv and the secret key secret. Prepare for encryption or decryption depending on +encrypt. +Return 0 if OK, else -1. +This procedure is already prototyped in crypto.h. + +int _libssh2_cipher_crypt(_libssh2_cipher_ctx *ctx, + _libssh2_cipher_type(algo), + int encrypt, + unsigned char *block, + size_t blocksize); +Encrypt or decrypt in-place data at (block, blocksize) using the given +context and/or algorithm. +Return 0 if OK, else -1. +This procedure is already prototyped in crypto.h. + +void _libssh2_cipher_dtor(_libssh2_cipher_ctx *ctx); +Release cipher context at ctx. + +4.1) AES +4.1.1) AES in CBC block mode. +LIBSSH2_AES +#define as 1 if the crypto library supports AES in CBC mode, else 0. +If defined as 0, the rest of this section can be omitted. + +_libssh2_cipher_aes128 +AES-128-CBC algorithm identifier initializer. +#define with constant value of type _libssh2_cipher_type(). + +_libssh2_cipher_aes192 +AES-192-CBC algorithm identifier initializer. +#define with constant value of type _libssh2_cipher_type(). + +_libssh2_cipher_aes256 +AES-256-CBC algorithm identifier initializer. +#define with constant value of type _libssh2_cipher_type(). + +4.1.2) AES in CTR block mode. +LIBSSH2_AES_CTR +#define as 1 if the crypto library supports AES in CTR mode, else 0. +If defined as 0, the rest of this section can be omitted. + +_libssh2_cipher_aes128ctr +AES-128-CTR algorithm identifier initializer. +#define with constant value of type _libssh2_cipher_type(). + +_libssh2_cipher_aes192ctr +AES-192-CTR algorithm identifier initializer. +#define with constant value of type _libssh2_cipher_type(). + +_libssh2_cipher_aes256ctr +AES-256-CTR algorithm identifier initializer. +#define with constant value of type _libssh2_cipher_type(). + +4.2) Blowfish in CBC block mode. +LIBSSH2_BLOWFISH +#define as 1 if the crypto library supports blowfish in CBC mode, else 0. +If defined as 0, the rest of this section can be omitted. + +_libssh2_cipher_blowfish +Blowfish-CBC algorithm identifier initializer. +#define with constant value of type _libssh2_cipher_type(). + +4.3) RC4. +LIBSSH2_RC4 +#define as 1 if the crypto library supports RC4 (arcfour), else 0. +If defined as 0, the rest of this section can be omitted. + +_libssh2_cipher_arcfour +RC4 algorithm identifier initializer. +#define with constant value of type _libssh2_cipher_type(). + +4.4) CAST5 in CBC block mode. +LIBSSH2_CAST +#define 1 if the crypto library supports cast, else 0. +If defined as 0, the rest of this section can be omitted. + +_libssh2_cipher_cast5 +CAST5-CBC algorithm identifier initializer. +#define with constant value of type _libssh2_cipher_type(). + +4.5) Tripple DES in CBC block mode. +LIBSSH2_3DES +#define as 1 if the crypto library supports TripleDES in CBC mode, else 0. +If defined as 0, the rest of this section can be omitted. + +_libssh2_cipher_3des +TripleDES-CBC algorithm identifier initializer. +#define with constant value of type _libssh2_cipher_type(). + + +5) Diffie-Hellman support. + +5.1) Diffie-Hellman context. +_libssh2_dh_ctx +Type of a Diffie-Hellman computation context. +Must always be defined. + +5.2) Diffie-Hellman computation procedures. +void libssh2_dh_init(_libssh2_dh_ctx *dhctx); +Initializes the Diffie-Hellman context at `dhctx'. No effective context +creation needed here. + +int libssh2_dh_key_pair(_libssh2_dh_ctx *dhctx, _libssh2_bn *public, + _libssh2_bn *g, _libssh2_bn *p, int group_order, + _libssh2_bn_ctx *bnctx); +Generates a Diffie-Hellman key pair using base `g', prime `p' and the given +`group_order'. Can use the given big number context `bnctx' if needed. +The private key is stored as opaque in the Diffie-Hellman context `*dhctx' and +the public key is returned in `public'. +0 is returned upon success, else -1. + +int libssh2_dh_secret(_libssh2_dh_ctx *dhctx, _libssh2_bn *secret, + _libssh2_bn *f, _libssh2_bn *p, _libssh2_bn_ctx * bnctx) +Computes the Diffie-Hellman secret from the previously created context `*dhctx', +the public key `f' from the other party and the same prime `p' used at +context creation. The result is stored in `secret'. +0 is returned upon success, else -1. + +void libssh2_dh_dtor(_libssh2_dh_ctx *dhctx) +Destroys Diffie-Hellman context at `dhctx' and resets its storage. + + +6) Big numbers. +Positive multi-byte integers support is sufficient. + +6.1) Computation contexts. +This has a real meaning if the big numbers computations need some context +storage. If not, use a dummy type and functions (macros). + +_libssh2_bn_ctx +Type of multiple precision computation context. May not be empty. if not used, +#define as char, for example. + +_libssh2_bn_ctx _libssh2_bn_ctx_new(void); +Returns a new multiple precision computation context. + +void _libssh2_bn_ctx_free(_libssh2_bn_ctx ctx); +Releases a multiple precision computation context. + +6.2) Computation support. +_libssh2_bn +Type of multiple precision numbers (aka bignumbers or huge integers) for the +crypto library. + +_libssh2_bn * _libssh2_bn_init(void); +Creates a multiple precision number (preset to zero). + +_libssh2_bn * _libssh2_bn_init_from_bin(void); +Create a multiple precision number intended to be set by the +_libssh2_bn_from_bin() function (see below). Unlike _libssh2_bn_init(), this +code may be a dummy initializer if the _libssh2_bn_from_bin() actually +allocates the number. Returns a value of type _libssh2_bn *. + +void _libssh2_bn_free(_libssh2_bn *bn); +Destroys the multiple precision number at bn. + +unsigned long _libssh2_bn_bytes(_libssh2_bn *bn); +Get the number of bytes needed to store the bits of the multiple precision +number at bn. + +unsigned long _libssh2_bn_bits(_libssh2_bn *bn); +Returns the number of bits of multiple precision number at bn. + +int _libssh2_bn_set_word(_libssh2_bn *bn, unsigned long val); +Sets the value of bn to val. +Returns 1 on success, 0 otherwise. + +_libssh2_bn * _libssh2_bn_from_bin(_libssh2_bn *bn, int len, + const unsigned char *val); +Converts the positive integer in big-endian form of length len at val +into a _libssh2_bn and place it in bn. If bn is NULL, a new _libssh2_bn is +created. +Returns a pointer to target _libssh2_bn or NULL if error. + +int _libssh2_bn_to_bin(_libssh2_bn *bn, unsigned char *val); +Converts the absolute value of bn into big-endian form and store it at +val. val must point to _libssh2_bn_bytes(bn) bytes of memory. +Returns the length of the big-endian number. + + +7) Private key algorithms. +Format of an RSA public key: +a) "ssh-rsa". +b) RSA exponent, MSB first, with high order bit = 0. +c) RSA modulus, MSB first, with high order bit = 0. +Each item is preceded by its 32-bit byte length, MSB first. + +Format of a DSA public key: +a) "ssh-dss". +b) p, MSB first, with high order bit = 0. +c) q, MSB first, with high order bit = 0. +d) g, MSB first, with high order bit = 0. +e) pub_key, MSB first, with high order bit = 0. +Each item is preceded by its 32-bit byte length, MSB first. + +Format of an ECDSA public key: +a) "ecdsa-sha2-nistp256" or "ecdsa-sha2-nistp384" or "ecdsa-sha2-nistp521". +b) domain: "nistp256", "nistp384" or "nistp521" matching a). +c) raw public key ("octal"). +Each item is preceded by its 32-bit byte length, MSB first. + +Format of an ED25519 public key: +a) "ssh-ed25519". +b) raw key (32 bytes). +Each item is preceded by its 32-bit byte length, MSB first. + +int _libssh2_pub_priv_keyfile(LIBSSH2_SESSION *session, + unsigned char **method, + size_t *method_len, + unsigned char **pubkeydata, + size_t *pubkeydata_len, + const char *privatekey, + const char *passphrase); +Reads a private key from file privatekey and extract the public key --> +(pubkeydata, pubkeydata_len). Store the associated method (ssh-rsa or ssh-dss) +into (method, method_len). +Both buffers have to be allocated using LIBSSH2_ALLOC(). +Returns 0 if OK, else -1. +This procedure is already prototyped in crypto.h. + +int _libssh2_pub_priv_keyfilememory(LIBSSH2_SESSION *session, + unsigned char **method, + size_t *method_len, + unsigned char **pubkeydata, + size_t *pubkeydata_len, + const char *privatekeydata, + size_t privatekeydata_len, + const char *passphrase); +Gets a private key from bytes at (privatekeydata, privatekeydata_len) and +extract the public key --> (pubkeydata, pubkeydata_len). Store the associated +method (ssh-rsa or ssh-dss) into (method, method_len). +Both buffers have to be allocated using LIBSSH2_ALLOC(). +Returns 0 if OK, else -1. +This procedure is already prototyped in crypto.h. + + +7.1) RSA +LIBSSH2_RSA +#define as 1 if the crypto library supports RSA, else 0. +If defined as 0, the rest of this section can be omitted. + +libssh2_rsa_ctx +Type of an RSA computation context. Generally a struct. + +int _libssh2_rsa_new(libssh2_rsa_ctx **rsa, + const unsigned char *edata, + unsigned long elen, + const unsigned char *ndata, + unsigned long nlen, + const unsigned char *ddata, + unsigned long dlen, + const unsigned char *pdata, + unsigned long plen, + const unsigned char *qdata, + unsigned long qlen, + const unsigned char *e1data, + unsigned long e1len, + const unsigned char *e2data, + unsigned long e2len, + const unsigned char *coeffdata, unsigned long coefflen); +Creates a new context for RSA computations from key source values: + pdata, plen Prime number p. Only used if private key known (ddata). + qdata, qlen Prime number q. Only used if private key known (ddata). + ndata, nlen Modulus n. + edata, elen Exponent e. + ddata, dlen e^-1 % phi(n) = private key. May be NULL if unknown. + e1data, e1len dp = d % (p-1). Only used if private key known (dtata). + e2data, e2len dq = d % (q-1). Only used if private key known (dtata). + coeffdata, coefflen q^-1 % p. Only used if private key known. +Returns 0 if OK. +This procedure is already prototyped in crypto.h. +Note: the current generic code only calls this function with e and n (public +key parameters): unless used internally by the backend, it is not needed to +support the private key and the other parameters here. + +int _libssh2_rsa_new_private(libssh2_rsa_ctx **rsa, + LIBSSH2_SESSION *session, + const char *filename, + unsigned const char *passphrase); +Reads an RSA private key from file filename into a new RSA context. +Must call _libssh2_init_if_needed(). +Return 0 if OK, else -1. +This procedure is already prototyped in crypto.h. + +int _libssh2_rsa_new_private_frommemory(libssh2_rsa_ctx **rsa, + LIBSSH2_SESSION *session, + const char *data, + size_t data_len, + unsigned const char *passphrase); +Gets an RSA private key from data into a new RSA context. +Must call _libssh2_init_if_needed(). +Return 0 if OK, else -1. +This procedure is already prototyped in crypto.h. + +int _libssh2_rsa_sha1_verify(libssh2_rsa_ctx *rsa, + const unsigned char *sig, + unsigned long sig_len, + const unsigned char *m, unsigned long m_len); +Verify (sig, sig_len) signature of (m, m_len) using an SHA-1 hash and the +RSA context. +Return 0 if OK, else -1. +This procedure is already prototyped in crypto.h. + +int _libssh2_rsa_sha1_signv(LIBSSH2_SESSION *session, + unsigned char **sig, size_t *siglen, + int count, const struct iovec vector[], + libssh2_rsa_ctx *ctx); +RSA signs the SHA-1 hash computed over the count data chunks in vector. +Signature is stored at (sig, siglen). +Signature buffer must be allocated from the given session. +Returns 0 if OK, else -1. +Note: this procedure is optional: if provided, it MUST be defined as a macro. + +int _libssh2_rsa_sha1_sign(LIBSSH2_SESSION *session, + libssh2_rsa_ctx *rsactx, + const unsigned char *hash, + size_t hash_len, + unsigned char **signature, + size_t *signature_len); +RSA signs the (hash, hashlen) SHA-1 hash bytes and stores the allocated +signature at (signature, signature_len). +Signature buffer must be allocated from the given session. +Returns 0 if OK, else -1. +This procedure is already prototyped in crypto.h. +Note: this procedure is not used if macro _libssh2_rsa_sha1_signv() is defined. + +void _libssh2_rsa_free(libssh2_rsa_ctx *rsactx); +Releases the RSA computation context at rsactx. + +LIBSSH2_RSA_SHA2 +#define as 1 if the crypto library supports RSA SHA2 256/512, else 0. +If defined as 0, the rest of this section can be omitted. + +int _libssh2_rsa_sha2_sign(LIBSSH2_SESSION * session, + libssh2_rsa_ctx * rsactx, + const unsigned char *hash, + size_t hash_len, + unsigned char **signature, + size_t *signature_len); +RSA signs the (hash, hashlen) SHA-2 hash bytes based on hash length and stores +the allocated signature at (signature, signature_len). +Signature buffer must be allocated from the given session. +Returns 0 if OK, else -1. +This procedure is already prototyped in crypto.h. +Note: this procedure is not used if macro _libssh2_rsa_sha1_signv() is defined. + +int _libssh2_rsa_sha2_verify(libssh2_rsa_ctx * rsa, + size_t hash_len, + const unsigned char *sig, + unsigned long sig_len, + const unsigned char *m, unsigned long m_len); +Verify (sig, sig_len) signature of (m, m_len) using an SHA-2 hash based on +hash length and the RSA context. +Return 0 if OK, else -1. +This procedure is already prototyped in crypto.h. + +7.2) DSA +LIBSSH2_DSA +#define as 1 if the crypto library supports DSA, else 0. +If defined as 0, the rest of this section can be omitted. + + +libssh2_dsa_ctx +Type of a DSA computation context. Generally a struct. + +int _libssh2_dsa_new(libssh2_dsa_ctx **dsa, + const unsigned char *pdata, + unsigned long plen, + const unsigned char *qdata, + unsigned long qlen, + const unsigned char *gdata, + unsigned long glen, + const unsigned char *ydata, + unsigned long ylen, + const unsigned char *x, unsigned long x_len); +Creates a new context for DSA computations from source key values: + pdata, plen Prime number p. Only used if private key known (ddata). + qdata, qlen Prime number q. Only used if private key known (ddata). + gdata, glen G number. + ydata, ylen Public key. + xdata, xlen Private key. Only taken if xlen non-zero. +Returns 0 if OK. +This procedure is already prototyped in crypto.h. + +int _libssh2_dsa_new_private(libssh2_dsa_ctx **dsa, + LIBSSH2_SESSION *session, + const char *filename, + unsigned const char *passphrase); +Gets a DSA private key from file filename into a new DSA context. +Must call _libssh2_init_if_needed(). +Return 0 if OK, else -1. +This procedure is already prototyped in crypto.h. + +int _libssh2_dsa_new_private_frommemory(libssh2_dsa_ctx **dsa, + LIBSSH2_SESSION *session, + const char *data, + size_t data_len, + unsigned const char *passphrase); +Gets a DSA private key from the data_len-bytes data into a new DSA context. +Must call _libssh2_init_if_needed(). +Returns 0 if OK, else -1. +This procedure is already prototyped in crypto.h. + +int _libssh2_dsa_sha1_verify(libssh2_dsa_ctx *dsactx, + const unsigned char *sig, + const unsigned char *m, unsigned long m_len); +Verify (sig, siglen) signature of (m, m_len) using an SHA-1 hash and the +DSA context. +Returns 0 if OK, else -1. +This procedure is already prototyped in crypto.h. + +int _libssh2_dsa_sha1_sign(libssh2_dsa_ctx *dsactx, + const unsigned char *hash, + unsigned long hash_len, unsigned char *sig); +DSA signs the (hash, hash_len) data using SHA-1 and store the signature at sig. +Returns 0 if OK, else -1. +This procedure is already prototyped in crypto.h. + +void _libssh2_dsa_free(libssh2_dsa_ctx *dsactx); +Releases the DSA computation context at dsactx. + + +7.3) ECDSA +LIBSSH2_ECDSA +#define as 1 if the crypto library supports ECDSA, else 0. +If defined as 0, _libssh2_ec_key should be defined as void and the rest of +this section can be omitted. + +EC_MAX_POINT_LEN +Maximum point length. Usually defined as ((528 * 2 / 8) + 1) (= 133). + +libssh2_ecdsa_ctx +Type of an ECDSA computation context. Generally a struct. + +_libssh2_ec_key +Type of an elliptic curve key. + +libssh2_curve_type +An enum type defining curve types. Current supported identifiers are: + LIBSSH2_EC_CURVE_NISTP256 + LIBSSH2_EC_CURVE_NISTP384 + LIBSSH2_EC_CURVE_NISTP521 + +int _libssh2_ecdsa_create_key(_libssh2_ec_key **out_private_key, + unsigned char **out_public_key_octal, + size_t *out_public_key_octal_len, + libssh2_curve_type curve_type); +Create a new ECDSA private key of type curve_type and return it at +out_private_key. If out_public_key_octal is not NULL, store an allocated +pointer to the associated public key in "octal" form in it and its length +at out_public_key_octal_len. +Return 0 if OK, else -1. +This procedure is already prototyped in crypto.h. + +int _libssh2_ecdsa_new_private(libssh2_ecdsa_ctx **ec_ctx, + LIBSSH2_SESSION * session, + const char *filename, + unsigned const char *passphrase); +Reads an ECDSA private key from PEM file filename into a new ECDSA context. +Must call _libssh2_init_if_needed(). +Return 0 if OK, else -1. +This procedure is already prototyped in crypto.h. + +int _libssh2_ecdsa_new_private_frommemory(libssh2_ecdsa_ctx ** ec_ctx, + LIBSSH2_SESSION * session, + const char *filedata, + size_t filedata_len, + unsigned const char *passphrase); +Builds an ECDSA private key from PEM data at filedata of length filedata_len +into a new ECDSA context stored at ec_ctx. +Must call _libssh2_init_if_needed(). +Return 0 if OK, else -1. +This procedure is already prototyped in crypto.h. + +int _libssh2_ecdsa_curve_name_with_octal_new(libssh2_ecdsa_ctx **ecdsactx, + const unsigned char *k, + size_t k_len, + libssh2_curve_type type); +Stores at ecdsactx a new ECDSA context associated with the given curve type +and with "octal" form public key (k, k_len). +Return 0 if OK, else -1. +This procedure is already prototyped in crypto.h. + +int _libssh2_ecdsa_new_openssh_private(libssh2_ecdsa_ctx **ec_ctx, + LIBSSH2_SESSION * session, + const char *filename, + unsigned const char *passphrase); +Reads a PEM-encoded ECDSA private key from file filename encrypted with +passphrase and stores at ec_ctx a new ECDSA context for it. +Return 0 if OK, else -1. +Currently used only from openssl backend (ought to be private). +This procedure is already prototyped in crypto.h. + +int _libssh2_ecdsa_sign(LIBSSH2_SESSION *session, libssh2_ecdsa_ctx *ec_ctx, + const unsigned char *hash, unsigned long hash_len, + unsigned char **signature, size_t *signature_len); +ECDSA signs the (hash, hashlen) hash bytes and stores the allocated +signature at (signature, signature_len). Hash algorithm used should be +SHA-256, SHA-384 or SHA-512 depending on type stored in ECDSA context at ec_ctx. +Signature buffer must be allocated from the given session. +Returns 0 if OK, else -1. +This procedure is already prototyped in crypto.h. + +int _libssh2_ecdsa_verify(libssh2_ecdsa_ctx *ctx, + const unsigned char *r, size_t r_len, + const unsigned char *s, size_t s_len, + const unsigned char *m, size_t m_len); +Verify the ECDSA signature made of (r, r_len) and (s, s_len) of (m, m_len) +using the hash algorithm configured in the ECDSA context ctx. +Return 0 if OK, else -1. +This procedure is already prototyped in crypto.h. + +libssh2_curve_type _libssh2_ecdsa_get_curve_type(libssh2_ecdsa_ctx *ecdsactx); +Returns the curve type associated with given context. +This procedure is already prototyped in crypto.h. + +int _libssh2_ecdsa_curve_type_from_name(const char *name, + libssh2_curve_type *out_type); +Stores in out_type the curve type matching string name of the form +"ecdsa-sha2-nistpxxx". +Return 0 if OK, else -1. +Currently used only from openssl backend (ought to be private). +This procedure is already prototyped in crypto.h. + +void _libssh2_ecdsa_free(libssh2_ecdsa_ctx *ecdsactx); +Releases the ECDSA computation context at ecdsactx. + + +7.4) ED25519 +LIBSSH2_ED25519 +#define as 1 if the crypto library supports ED25519, else 0. +If defined as 0, the rest of this section can be omitted. + + +libssh2_ed25519_ctx +Type of an ED25519 computation context. Generally a struct. + +int _libssh2_curve25519_new(LIBSSH2_SESSION *session, libssh2_ed25519_ctx **ctx, + uint8_t **out_public_key, + uint8_t **out_private_key); +Generates an ED25519 key pair, stores a pointer to them at out_private_key +and out_public_key respectively and stores at ctx a new ED25519 context for +this key. +Argument ctx, out_private_key and out_public key may be NULL to disable storing +the corresponding value. +Length of each key is LIBSSH2_ED25519_KEY_LEN (32 bytes). +Key buffers are allocated and should be released by caller after use. +Returns 0 if OK, else -1. +This procedure is already prototyped in crypto.h. + +int _libssh2_ed25519_new_private(libssh2_ed25519_ctx **ed_ctx, + LIBSSH2_SESSION *session, + const char *filename, + const uint8_t *passphrase); +Reads an ED25519 private key from PEM file filename into a new ED25519 context. +Must call _libssh2_init_if_needed(). +Return 0 if OK, else -1. +This procedure is already prototyped in crypto.h. + +int _libssh2_ed25519_new_public(libssh2_ed25519_ctx **ed_ctx, + LIBSSH2_SESSION *session, + const unsigned char *raw_pub_key, + const uint8_t key_len); +Stores at ed_ctx a new ED25519 key context for raw public key (raw_pub_key, +key_len). +Return 0 if OK, else -1. +This procedure is already prototyped in crypto.h. + +int _libssh2_ed25519_new_private_frommemory(libssh2_ed25519_ctx **ed_ctx, + LIBSSH2_SESSION *session, + const char *filedata, + size_t filedata_len, + unsigned const char *passphrase); +Builds an ED25519 private key from PEM data at filedata of length filedata_len +into a new ED25519 context stored at ed_ctx. +Must call _libssh2_init_if_needed(). +Return 0 if OK, else -1. +This procedure is already prototyped in crypto.h. + +int _libssh2_ed25519_sign(libssh2_ed25519_ctx *ctx, LIBSSH2_SESSION *session, + uint8_t **out_sig, size_t *out_sig_len, + const uint8_t *message, size_t message_len); +ED25519 signs the (message, message_len) bytes and stores the allocated +signature at (sig, sig_len). +Signature buffer is allocated from the given session. +Returns 0 if OK, else -1. +This procedure is already prototyped in crypto.h. + +int _libssh2_ed25519_verify(libssh2_ed25519_ctx *ctx, const uint8_t *s, + size_t s_len, const uint8_t *m, size_t m_len); +Verify (s, s_len) signature of (m, m_len) using the given ED25519 context. +Return 0 if OK, else -1. +This procedure is already prototyped in crypto.h. + +int _libssh2_curve25519_gen_k(_libssh2_bn **k, + uint8_t private_key[LIBSSH2_ED25519_KEY_LEN], + uint8_t srvr_public_key[LIBSSH2_ED25519_KEY_LEN]); +Computes a shared ED25519 secret key from the given raw server public key and +raw client public key and stores it as a big number in *k. Big number should +have been initialized before calling this function. +Returns 0 if OK, else -1. +This procedure is already prototyped in crypto.h. + +void _libssh2_ed25519_free(libssh2_ed25519_ctx *ed25519ctx); +Releases the ED25519 computation context at ed25519ctx. + + +8) Miscellaneous + +void libssh2_prepare_iovec(struct iovec *vector, unsigned int len); +Prepare len consecutive iovec slots before using them. +In example, this is needed to preset unused structure slacks on platforms +requiring it. +If this is not needed, it should be defined as an empty macro. + +int _libssh2_random(unsigned char *buf, int len); +Store len random bytes at buf. +Returns 0 if OK, else -1. + +const char * _libssh2_supported_key_sign_algorithms(LIBSSH2_SESSION *session, + unsigned char *key_method, + size_t key_method_len); + +This function is for implementing key hash upgrading as defined in RFC 8332. + +Based on the incoming key_method value, this function will return a +list of supported algorithms that can upgrade the original key method algorithm +as a comma seperated list, if there is no upgrade option this function should +return NULL. diff --git a/vendor/libssh2/docs/INSTALL_AUTOTOOLS b/vendor/libssh2/docs/INSTALL_AUTOTOOLS new file mode 100644 index 0000000000..a75b51814d --- /dev/null +++ b/vendor/libssh2/docs/INSTALL_AUTOTOOLS @@ -0,0 +1,355 @@ +Installation Instructions +************************* + +Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005 Free +Software Foundation, Inc. + +This file is free documentation; the Free Software Foundation gives +unlimited permission to copy, distribute and modify it. + +When Building directly from Master +================================== + +If you want to build directly from the git repository, you must first +generate the configure script and Makefile using autotools. There is +a convenience script that calls all tools in the correct order. Make +sure that autoconf, automake and libtool are installed on your system, +then execute: + + autoreconf -fi + +After executing this script, you can build the project as usual: + + ./configure + make + +Basic Installation +================== + +These are generic installation instructions. + + The `configure' shell script attempts to guess correct values for +various system-dependent variables used during compilation. It uses +those values to create a `Makefile' in each directory of the package. +It may also create one or more `.h' files containing system-dependent +definitions. Finally, it creates a shell script `config.status' that +you can run in the future to recreate the current configuration, and a +file `config.log' containing compiler output (useful mainly for +debugging `configure'). + + It can also use an optional file (typically called `config.cache' +and enabled with `--cache-file=config.cache' or simply `-C') that saves +the results of its tests to speed up reconfiguring. (Caching is +disabled by default to prevent problems with accidental use of stale +cache files.) + + If you need to do unusual things to compile the package, please try +to figure out how `configure' could check whether to do them, and mail +diffs or instructions to the address given in the `README' so they can +be considered for the next release. If you are using the cache, and at +some point `config.cache' contains results you don't want to keep, you +may remove or edit it. + + The file `configure.ac' (or `configure.in') is used to create +`configure' by a program called `autoconf'. You only need +`configure.ac' if you want to change it or regenerate `configure' using +a newer version of `autoconf'. + +The simplest way to compile this package is: + + 1. `cd' to the directory containing the package's source code and type + `./configure' to configure the package for your system. If you're + using `csh' on an old version of System V, you might need to type + `sh ./configure' instead to prevent `csh' from trying to execute + `configure' itself. + + Running `configure' takes awhile. While running, it prints some + messages telling which features it is checking for. + + 2. Type `make' to compile the package. + + 3. Optionally, type `make check' to run any self-tests that come with + the package. + + 4. Type `make install' to install the programs and any data files and + documentation. + + 5. You can remove the program binaries and object files from the + source code directory by typing `make clean'. To also remove the + files that `configure' created (so you can compile the package for + a different kind of computer), type `make distclean'. There is + also a `make maintainer-clean' target, but that is intended mainly + for the package's developers. If you use it, you may have to get + all sorts of other programs in order to regenerate files that came + with the distribution. + +Compilers and Options +===================== + +Some systems require unusual options for compilation or linking that the +`configure' script does not know about. Run `./configure --help' for +details on some of the pertinent environment variables. + + You can give `configure' initial values for configuration parameters +by setting variables in the command line or in the environment. Here +is an example: + + ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix + + *Note Defining Variables::, for more details. + +Compiling For Multiple Architectures +==================================== + +You can compile the package for more than one kind of computer at the +same time, by placing the object files for each architecture in their +own directory. To do this, you must use a version of `make' that +supports the `VPATH' variable, such as GNU `make'. `cd' to the +directory where you want the object files and executables to go and run +the `configure' script. `configure' automatically checks for the +source code in the directory that `configure' is in and in `..'. + + If you have to use a `make' that does not support the `VPATH' +variable, you have to compile the package for one architecture at a +time in the source code directory. After you have installed the +package for one architecture, use `make distclean' before reconfiguring +for another architecture. + +Installation Names +================== + +By default, `make install' installs the package's commands under +`/usr/local/bin', include files under `/usr/local/include', etc. You +can specify an installation prefix other than `/usr/local' by giving +`configure' the option `--prefix=PREFIX'. + + You can specify separate installation prefixes for +architecture-specific files and architecture-independent files. If you +pass the option `--exec-prefix=PREFIX' to `configure', the package uses +PREFIX as the prefix for installing programs and libraries. +Documentation and other data files still use the regular prefix. + + In addition, if you use an unusual directory layout you can give +options like `--bindir=DIR' to specify different values for particular +kinds of files. Run `configure --help' for a list of the directories +you can set and what kinds of files go in them. + + If the package supports it, you can cause programs to be installed +with an extra prefix or suffix on their names by giving `configure' the +option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. + +Optional Features +================= + +Some packages pay attention to `--enable-FEATURE' options to +`configure', where FEATURE indicates an optional part of the package. +They may also pay attention to `--with-PACKAGE' options, where PACKAGE +is something like `gnu-as' or `x' (for the X Window System). The +`README' should mention any `--enable-' and `--with-' options that the +package recognizes. + + For packages that use the X Window System, `configure' can usually +find the X include and library files automatically, but if it doesn't, +you can use the `configure' options `--x-includes=DIR' and +`--x-libraries=DIR' to specify their locations. + +Specifying the System Type +========================== + +There may be some features `configure' cannot figure out automatically, +but needs to determine by the type of machine the package will run on. +Usually, assuming the package is built to be run on the _same_ +architectures, `configure' can figure that out, but if it prints a +message saying it cannot guess the machine type, give it the +`--build=TYPE' option. TYPE can either be a short name for the system +type, such as `sun4', or a canonical name which has the form: + + CPU-COMPANY-SYSTEM + +where SYSTEM can have one of these forms: + + OS KERNEL-OS + + See the file `config.sub' for the possible values of each field. If +`config.sub' isn't included in this package, then this package doesn't +need to know the machine type. + + If you are _building_ compiler tools for cross-compiling, you should +use the option `--target=TYPE' to select the type of system they will +produce code for. + + If you want to _use_ a cross compiler, that generates code for a +platform different from the build platform, you should specify the +"host" platform (i.e., that on which the generated programs will +eventually be run) with `--host=TYPE'. + +Sharing Defaults +================ + +If you want to set default values for `configure' scripts to share, you +can create a site shell script called `config.site' that gives default +values for variables like `CC', `cache_file', and `prefix'. +`configure' looks for `PREFIX/share/config.site' if it exists, then +`PREFIX/etc/config.site' if it exists. Or, you can set the +`CONFIG_SITE' environment variable to the location of the site script. +A warning: not all `configure' scripts look for a site script. + +Defining Variables +================== + +Variables not defined in a site shell script can be set in the +environment passed to `configure'. However, some packages may run +configure again during the build, and the customized values of these +variables may be lost. In order to avoid this problem, you should set +them in the `configure' command line, using `VAR=value'. For example: + + ./configure CC=/usr/local2/bin/gcc + +causes the specified `gcc' to be used as the C compiler (unless it is +overridden in the site shell script). Here is a another example: + + /bin/bash ./configure CONFIG_SHELL=/bin/bash + +Here the `CONFIG_SHELL=/bin/bash' operand causes subsequent +configuration-related scripts to be executed by `/bin/bash'. + +`configure' Invocation +====================== + +`configure' recognizes the following options to control how it operates. + +`--help' +`-h' + Print a summary of the options to `configure', and exit. + +`--version' +`-V' + Print the version of Autoconf used to generate the `configure' + script, and exit. + +`--cache-file=FILE' + Enable the cache: use and save the results of the tests in FILE, + traditionally `config.cache'. FILE defaults to `/dev/null' to + disable caching. + +`--config-cache' +`-C' + Alias for `--cache-file=config.cache'. + +`--quiet' +`--silent' +`-q' + Do not print messages saying which checks are being made. To + suppress all normal output, redirect it to `/dev/null' (any error + messages will still be shown). + +`--srcdir=DIR' + Look for the package's source code in directory DIR. Usually + `configure' can determine that directory automatically. + +`configure' also accepts some other, not widely useful, options. Run +`configure --help' for more details. + +More configure options +====================== + +Some ./configure options deserve additional comments: + + * --enable-crypt-none + + The SSH2 Transport allows for unencrypted data + transmission using the "none" cipher. Because this is + such a huge security hole, it is typically disabled on + SSH2 implementations and is disabled in libssh2 by + default as well. + + Enabling this option will allow for "none" as a + negotiable method, however it still requires that the + method be advertized by the remote end and that no + more-preferable methods are available. + + * --enable-mac-none + + The SSH2 Transport also allows implementations to + forego a message authentication code. While this is + less of a security risk than using a "none" cipher, it + is still not recommended as disabling MAC hashes + removes a layer of security. + + Enabling this option will allow for "none" as a + negotiable method, however it still requires that the + method be advertized by the remote end and that no + more-preferable methods are available. + + * --disable-gex-new + + The diffie-hellman-group-exchange-sha1 (dh-gex) key + exchange method originally defined an exchange + negotiation using packet type 30 to request a + generation pair based on a single target value. Later + refinement of dh-gex provided for range and target + values. By default libssh2 will use the newer range + method. + + If you experience trouble connecting to an old SSH + server using dh-gex, try this option to fallback on + the older more reliable method. + + * --with-libgcrypt + * --without-libgcrypt + * --with-libgcrypt-prefix=DIR + + libssh2 can use the Libgcrypt library + (https://www.gnupg.org/) for cryptographic operations. + One of the cryptographic libraries is required. + + Configure will attempt to locate Libgcrypt + automatically. + + If your installation of Libgcrypt is in another + location, specify it using --with-libgcrypt-prefix. + + * --with-openssl + * --without-openssl + * --with-libssl-prefix=[DIR] + + libssh2 can use the OpenSSL library + (https://www.openssl.org) for cryptographic operations. + One of the cryptographic libraries is required. + + Configure will attempt to locate OpenSSL in the + default location. + + If your installation of OpenSSL is in another + location, specify it using --with-libssl-prefix. + + * --with-mbedtls + * --without-mbedtls + * --with-libmbedtls-prefix=[DIR] + + libssh2 can use the mbedTLS library + (https://tls.mbed.org) for cryptographic operations. + One of the cryptographic libraries is required. + + Configure will attempt to locate mbedTLS in the + default location. + + If your installation of mbedTLS is in another + location, specify it using --with-libmbedtls-prefix. + + * --with-libz + * --without-libz + * --with-libz-prefix=[DIR] + + If present, libssh2 will attempt to use the zlib + (http://www.zlib.org) for payload compression, however + zlib is not required. + + If your installation of Libz is in another location, + specify it using --with-libz-prefix. + + * --enable-debug + + Will make the build use more pedantic and strict compiler + options as well as enable the libssh2_trace() function (for + showing debug traces). diff --git a/vendor/libssh2/docs/INSTALL_CMAKE.md b/vendor/libssh2/docs/INSTALL_CMAKE.md new file mode 100644 index 0000000000..c136fdcee8 --- /dev/null +++ b/vendor/libssh2/docs/INSTALL_CMAKE.md @@ -0,0 +1,193 @@ +License: see COPYING + +Source code: https://github.com/libssh2/libssh2 + +Web site source code: https://github.com/libssh2/www + +Installation instructions are in docs/INSTALL +======= +To build libssh2 you will need CMake v2.8 or later [1] and one of the +following cryptography libraries: + +* OpenSSL +* Libgcrypt +* WinCNG +* mbedTLS + +Getting started +--------------- + +If you are happy with the default options, make a new build directory, +change to it, configure the build environment and build the project: + +``` + mkdir bin + cd bin + cmake .. + cmake --build . +``` + +libssh2 will be built as a static library and will use any +cryptography library available. The library binary will be put in +`bin/src`, with the examples in `bin/example` and the tests in +`bin/tests`. + +Customising the build +--------------------- + +Of course, you might want to customise the build options. You can +pass the options to CMake on the command line: + + cmake -D